6、SySeVR复现——Data preprocess(下)

news2024/11/19 5:27:50

紧接着上篇SySeVR复现——Data preprocess(上)5、SySeVR复现——Data preprocess(上)_sliver呀的博客-CSDN博客

目录

5、训练Word2vec模型

6、token向量化且划分数据集

7、固定每一个切片的长度


5、训练Word2vec模型

对应create_w2vmodel.py :

## coding: utf-8
'''
This python file is used to tranfer the words in corpus to vector, and save the word2vec model under the path 'w2v_model'.
'''


import gc
import os
import pickle

from gensim.models import word2vec


'''
DirofCorpus class
-----------------------------
This class is used to make a generator to produce sentence for word2vec training

# Arguments
    dirname: The src of corpus files 
    
'''

class DirofCorpus(object):   # 将分布在不同文件夹下的S
    def __init__(self, dirname):
        self.dirname = dirname
    
    def __iter__(self):
        for d in self.dirname:
            for fn in os.listdir(d):  # 遍历目录下文件,对语料库中的文件夹逐一处理,例如:CVE_2004_1151_PATCHED_sys32_ni_syscall.c
                print(fn)
                for filename in os.listdir(os.path.join(d, fn)):  # 对每个文件夹下的四种SeVC逐一处理
                    samples = pickle.load(open(os.path.join(d, fn, filename), 'rb'))[0]  # 获取SeVC文件的内容,并保存到变量sample中
                    for sample in samples:
                        yield sample  # 生成器,暂时理解为return
                    del samples
                    gc.collect()  # 垃圾回收机制

'''
generate_w2vmodel function
-----------------------------
This function is used to learning vectors from corpus, and save the model

# Arguments
    decTokenFlawPath: String type, the src of corpus file 
    w2vModelPath: String type, the src of model file 
    size =30,iter=5
'''

def generate_w2vModel(decTokenFlawPath, w2vModelPath):
    print("training...")
    model = word2vec.Word2Vec(sentences=DirofCorpus(decTokenFlawPath), vector_size=30, alpha=0.01, window=5, min_count=0, max_vocab_size=None, sample=0.001, seed=1, workers=1, min_alpha=0.0001, sg=1, hs=0, negative=10)
    model.save(w2vModelPath)   # 模型保存
    print(model.wv.index_to_key)
    print(model.wv['int'])  # model.wv['x']查询某个词的向量表示
    print(model.wv.key_to_index)

def evaluate_w2vModel(w2vModelPath):    # 模型评估
    print("\nevaluating...")
    model = word2vec.Word2Vec.load(w2vModelPath)  # 加载模型
    for sign in ['(', '+', '-', '*', 'main']:   #
        print(sign, ":")
        print(model.wv.most_similar_cosmul(positive=[sign], topn=10))  # 求各个词与sign的相似度大小,取相似度最大的前十名
    
def main():
    dec_tokenFlaw_path = ['.//file//corpus//']   # 语料库路径
    w2v_model_path = ".//file//model//model.txt"   # 模型保存路径

    generate_w2vModel(dec_tokenFlaw_path, w2v_model_path)  # 获取已训练好的word2vec模型
    # evaluate_w2vModel(w2v_model_path)
    print("success!")

if __name__ == "__main__":
    main()

         运行结果:

        在对应文件夹下将训练好的Word2vec模型保存好,以便后面进行token的向量化。

6、token向量化且划分数据集

        对应get_dl_input.py :

## coding: utf-8
'''
This python file is used to split database into 80% train set and 20% test set, tranfer the original code into vector, creating input file of deap learning model.
'''

from gensim.models import word2vec
import pickle
import os
import numpy as np
import random
import gc
import shutil

'''
generate_corpus function
-----------------------------
This function is used to create input of deep learning model

# Arguments
    w2vModelPath: the path saves word2vec model
    samples: the list of sample
    
'''
def generate_corpus(w2vModelPath, samples): 
    model = word2vec.Word2Vec.load(w2vModelPath)   # 载入模型
    print("begin generate input...")
    dl_corpus = [[model.wv[word] for word in sample] for sample in samples]  # 获取每一个token的向量
    print("generate input success...")

    return dl_corpus

'''
get_dldata function
-----------------------------
This function is used to create input of deep learning model

# Arguments
    filepath: the path saves data
    dlTrainCorpusPath: the path saves train dataset
    dlTestCorpusPath: the path saves test dataset
    split: split ratio
    seed: random number seed 
    
'''
def get_dldata(filepath, dlTrainCorpusPath, dlTestCorpusPath, split=0.8, seed=113):
    folders = os.listdir(filepath)    # 获取保存vector的路径,以CVE文件为单位
    np.random.seed(seed)  # 设置随机数,使用np.random()生成的数据会打乱顺序
    np.random.shuffle(folders)  # 打乱CVE文件的顺序

    folders_train = folders[:int(len(folders)*split)]   # 把80%的打乱顺序的CVE文件作为训练集
    folders_test = folders[int(len(folders)*split):]    # 把20%的打乱顺序的CVE文件作为测试集

    # 将分散于各个CVE文件中的四类SeVCs,重新汇集到一起
    for mode in ["api", "arraysuse", "pointersuse", "integeroverflow"]:   # 以SeVC的类型为单位进行处理
        num = []  # 每一次拿哪几份,与N的值息息相关
        N = 0   # 数据被划分为几份
        if mode == "api":
            N = 4
            num = [0, 1, 2, 3, 4]
        if mode == "arraysuse":
            N = 2
            num = [0, 1]
        if mode == "integeroverflow":
            N = 2
            num = [0, 1]
        if mode == "pointersuse":
            N = 6
            num = [0, 1, 2, 3, 4, 5]
        for i in num:   # 以切片类型为单位,逐一进行处理
            train_set = [[], [], [], [], [], []]   # 保存某一类SeVC的信息
            ids = []  # 保存CVE文件名
            for folder_train in folders_train[int(i*len(folders_train)/N) : int((i+1)*len(folders_train)/N)]:  # 把整个训练集切分为N份
                for filename in os.listdir(filepath + folder_train + '/'):    # 对CVE文件中的4类SeVCs逐一处理,分别为:api、array、point、intege.
                    if mode in filename:
                        if folder_train not in os.listdir(dlTrainCorpusPath):  # 将划分为测试集的数据保存到一起
                            folder_path = os.path.join(dlTrainCorpusPath, folder_train)  # 获取路径
                            os.mkdir(folder_path)  # 新建文件夹
                        shutil.copyfile(filepath + folder_train + '/'+filename , dlTrainCorpusPath + folder_train + '/'+filename)  # 将文件夹复制到指定位置,注意每次复制的内容与当前filename中保存的数据有关,也就是说不是一次性把所有文件都复制过来
                        f = open(filepath + folder_train + '/' + filename, 'rb')  # 以读取方式打开文件
                        data = pickle.load(f)   # 载入文件内容,并赋给data变量
                        id_length = len(data[1])  #
                        for j in range(id_length):  # 将CVE文件名保存到ids变量中
                            ids.append(folder_train)
                        for n in range(5):   # 提取某一类SeVC文件内保存的信息,train_set内的元素,相同的信息保存在一起
                            train_set[n] = train_set[n] + data[n]
                        train_set[-1] = ids
            if train_set[0] == []:
                continue
            f_train = open(dlTrainCorpusPath + mode + "_" + str(i)+ "_.pkl", 'wb')  # 将某一类汇总好的信息,保存在一起
            pickle.dump(train_set, f_train, protocol=pickle.HIGHEST_PROTOCOL)
            f_train.close()
            del train_set
            gc.collect()     
                    
    for mode in ["api", "arraysuse", "pointersuse", "integeroverflow"]:  # 相似的处理方式,只是这一步是对测试函数进行处理
        # N = 4  (未改前)
        # num = [0, 1, 2, 3]
        # if mode == "pointersuse":
        #     N = 8
        #     num = [4, 5]

        num = []  # 每一次拿哪几份,与N的值息息相关
        N = 0   # 数据被划分为几份
        if mode == "api":
            N = 4
            num = [0, 1, 2, 3, 4]
        if mode == "arraysuse":
            N = 2
            num = [0, 1]
        if mode == "integeroverflow":
            N = 2
            num = [0, 1]
        if mode == "pointersuse":
            N = 6
            num = [0, 1, 2, 3, 4, 5]
        for i in num:
            test_set = [[], [], [], [], [], []]
            ids = []
            for folder_test in folders_test[int(i*len(folders_test)/N) : int((i+1)*len(folders_test)/N)]:
                for filename in os.listdir(filepath + folder_test + '/'):
                    if mode in filename:
                        if folder_test not in os.listdir(dlTestCorpusPath):
                            folder_path = os.path.join(dlTestCorpusPath, folder_test)
                            os.mkdir(folder_path)
                        shutil.copyfile(filepath + folder_test + '/'+filename , dlTestCorpusPath + folder_test + '/'+filename) 
                        f = open(filepath + folder_test + '/' + filename, 'rb')
                        data = pickle.load(f)
                        id_length = len(data[1])
                        for j in range(id_length):
                            ids.append(folder_test)
                        for n in range(5):
                            test_set[n] = test_set[n] + data[n]
                        test_set[-1] = ids
            if test_set[0] == []:
                continue

            f_test = open(dlTestCorpusPath + mode + "_" + str(i)+ ".pkl", 'wb')
            pickle.dump(test_set, f_test, protocol=pickle.HIGHEST_PROTOCOL)
            f_test.close()
            del test_set
            gc.collect()

if __name__ == "__main__":
    
    CORPUSPATH = ".//file//corpus//"   # 语料库路径
    VECTORPATH = ".//file//vector//"   # token对应的向量的保存路径
    W2VPATH = ".//file//model//model.txt"    # word2vec模型保存路径
    print("turn the corpus into vectors...")
    for corpusfiles in os.listdir(CORPUSPATH):   # 对语料库中的CVE文件单独进行处理,例如:CVE_2004_1151_PATCHED_sys32_ni_syscall.c
        print(corpusfiles)
        if corpusfiles not in os.listdir(VECTORPATH):   # 每一个CVE语料库文件生成对应的向量文件,token转化为向量,并保存
            folder_path = os.path.join(VECTORPATH, corpusfiles)  # 获取向量保存路径
            os.mkdir(folder_path)   # 新建对应文件夹
        for corpusfile in os.listdir(CORPUSPATH + corpusfiles):   # 对CVE文件中保存的四种SeVC的token序列单独处理
            corpus_path = os.path.join(CORPUSPATH, corpusfiles, corpusfile)  # 获取要处理的token序列的路径
            f_corpus = open(corpus_path, 'rb')  # 以读取模式打开保存SeVC token的文件
            data = pickle.load(f_corpus)  # 将文件内容提取出来,并保存到变量data中
            f_corpus.close()   # 关闭f_corpus对象
            data[0] = generate_corpus(W2VPATH, data[0])  # 将切片中的token转化为向量
            vector_path = os.path.join(VECTORPATH, corpusfiles, corpusfile)  # token对应的向量的保存路径
            f_vector = open(vector_path, 'wb')  # 以写入模式打开文件
            pickle.dump(data, f_vector, protocol=pickle.HIGHEST_PROTOCOL)  # 对token序列对应的向量进行保存
            f_vector.close()  # 关闭f_vecctor对象
    print("w2v over...")

    print("spliting the train set and test set...")
    dlTrainCorpusPath = ".//dataset//raw_train//"
    dlTestCorpusPath = ".//dataset//raw_test//"
    get_dldata(VECTORPATH, dlTrainCorpusPath, dlTestCorpusPath)
    
    print("success!")

       运行结果:

        (1)将数据划分为训练集和测试集:

        (2)将各个CVE文件切片进行汇总,只分为四类切片

         打开api_0.pkl,可以看到保存的是向量形式的token:

7、固定每一个切片的长度

对应dealrawdata.py :

## coding: utf-8
'''
This python file is used to train data in CNN model
'''

from __future__ import absolute_import
from __future__ import print_function
import pickle
import _pickle as cPickle
import numpy as np
import random
import time
import math
import os
from collections import Counter
from imblearn.ensemble import _easy_ensemble
from imblearn.over_sampling import ADASYN
from imblearn.over_sampling import SMOTE


np.random.seed(1337)  # for reproducibility

'''
dealrawdata function
-----------------------------
This function is used to cut the dataset, do shuffle and save into pkl file.

# Arguments
    raw_traindataSet_path: String type, the raw data path of train set
    raw_testdataSet_path: String type, the raw data path of test set
    traindataSet_path: String type, the data path to save train set
    testdataSet_path: String type, the data path to save test set
    batch_size: Int type, the mini-batch size
    maxlen: Int type, the max length of data
    vector_dim: Int type, the number of data vector's dim

'''
def dealrawdata(raw_traindataSet_path, raw_testdataSet_path, traindataSet_path, testdataSet_path, batch_size, maxlen, vector_dim):
    print("Loading data...")
    
    for filename in os.listdir(raw_traindataSet_path):  # 获取各类型SeVC的pkl文件(训练集)
        if not (filename.endswith(".pkl")):  #
            continue
        print(filename)
        X_train, train_labels, funcs, filenames, testcases = load_data_binary(raw_traindataSet_path + filename, batch_size, maxlen=maxlen, vector_dim=vector_dim)  # 使切片的长度一致,也就是每个切片的token数都一样

        f_train = open(traindataSet_path + filename, 'wb')   # 以写入模式打开文件
        pickle.dump([X_train, train_labels, funcs, filenames, testcases], f_train)  # 将整理后的切片信息保存到文件中
        f_train.close()  # 关闭文件对象

    for filename in os.listdir(raw_testdataSet_path):  # # 获取各类型SeVC的pkl文件(测试集)
        # if not ("api" in filename):  源文件这里有if语句,这样做只会将api相关的SeVC进行转换,why?
        #    continue
        # print(filename)
        if not (filename.endswith(".pkl")):
            continue
        print(filename)
        X_test, test_labels, funcs, filenames, testcases = load_data_binary(raw_testdataSet_path + filename, batch_size, maxlen=maxlen, vector_dim=vector_dim)

        f_test = open(testdataSet_path + filename, 'wb')
        pickle.dump([X_test, test_labels, funcs, filenames, testcases], f_test)
        f_test.close()

def load_data_binary(dataSetpath, batch_size, maxlen=None, vector_dim=30, seed=113):
    #load data
    f1 = open(dataSetpath, 'rb')  # 以读取模式打开保存向量化SeVC的文件(一类SeVC,是被划分为多个文件了的)
    X, ids, focus, funcs, filenames, test_cases = pickle.load(f1)
    # X:保存的是切片的向量信息,一个CVE文件中所有SeVCs的切片向量
    # ids:切片的标签,有漏洞 or 无漏洞(0 or 1)
    # focus:保存的是SyVC的在token序列中的位置
    # funcs:不确定是不是SyVC
    # filename:切片的头部信息
    # test_case:保存的是切片来自哪个文件
    f1.close()

    cut_count = 0   # 保存token数超过500,需要进行截取的SeVC个数
    fill_0_count = 0  # 记录token数小于500个,需进行填充操作的SeVC个数
    no_change_count = 0  # # 记录token数等于500,不需进行任何处理的SeVC个数
    fill_0 = [0]*vector_dim  # 生成一阶张量(向量),与token的维数是相对应的
    totallen = 0  # 记录整个pkl文件中,所有SeVC的长度,也就是一共有多少个token
    if maxlen:
        new_X = []   # 用于保存处理后的切片向量,一个pkl文件中切片向量都是保存在new_X中
        for x, i, focu, func, file_name, test_case in zip(X, ids, focus, funcs, filenames, test_cases):   # 对每一个向量化后的SeVC单独进行处理,也就是说一个CVE文件中可能存在多个SeVC
            if len(x) < maxlen:  # 某一个SeVC含有的向量少于规定的最大向量个数,多于部分补零
                x = x + [fill_0] * (maxlen - len(x))   # [fill_0]是二阶张量(矩阵),它是用来代表需要填充token的个数
                new_X.append(x)  # 将当前处理的SeVC保存到变量nex_X中
                fill_0_count += 1  # 记录token数小于500个,需进行填充操作的SeVC个数

            elif len(x) == maxlen:   # 某一个SeVC中含有的向量等于规定的最大向量个数
                new_X.append(x)  # 将当前处理的SeVC保存到变量nex_X中
                no_change_count += 1   # 记录token数等于500,不需进行任何处理的SeVC个数
                    
            else:    # 某一个SeVC中含有的向量多于规定的最大向量个数,设置一个开始点和结束点,然后进行切片处理
                startpoint = int(focu - round(maxlen / 2.0))  # round():四舍五入,切片起始点
                endpoint = int(startpoint + maxlen)  # 切片结束点
                if startpoint < 0:  # 起始点小于0,取SeVC的前500个token
                    startpoint = 0
                    endpoint = maxlen
                if endpoint >= len(x):  # 结束点大于500,取SeVC最后的500个token
                    startpoint = -maxlen
                    endpoint = None
                new_X.append(x[startpoint:endpoint])  # 对SeVC进行切片处理,并保存到new_X变量中
                cut_count += 1  # 保存token数超过500,需要进行截取的SeVC个数
            totallen = totallen + 500  # 保存整个pkl文件的token个数
        X = new_X
    print(totallen)

    return X, ids, funcs, filenames, test_cases



if __name__ == "__main__":
    batchSize = 32   #
    # vectorDim = 40  # 填充零的位置的维数,好奇:token向量化后的维数明显是30维,为什么用40维的数据去填充??
    vectorDim = 30
    maxLen = 500   # 每一个切片SeVC能够拥有的最大向量个数,也就是一个SeVC中最多有500个token,每一个token进行向量化后的维度为30维
    raw_traindataSetPath = ".//dataset//raw_train//"  # get_dl_input.py生成的训练集保存地址
    raw_testdataSetPath = ".//dataset//raw_test//"   # get_dl_input.py生成的测试集保存地址
    traindataSetPath = ".//dataset//train/"    # 固定原始向量的长度,训练集保存地址
    testdataSetPath = ".//dataset//test/"   # 固定原始向量的长度,测试集保存地址
    dealrawdata(raw_traindataSetPath, raw_testdataSetPath, traindataSetPath, testdataSetPath, batchSize, maxLen, vectorDim)

        运行结果:

 

        

        该部分各个文件的大致流程是这样,可能细节还有待完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jetpack Compose中使用Notification

发送通知相关的主要有两个关键的类 NotificationCompat.Builder 和 NotificationManagerCompat 为方便使用&#xff0c;首先定义一个扩展工具类来管理通知 const val MAIN_CHANNEL_ID "MainChannel ID" const val MAIN_CHANNEL "MainChannel"fun Contex…

人工智能导论实验——前馈神经网络

实验目的通过实验了解全连接神经网络的结构&#xff0c;应用全连接网络处理分类和回归任务。实验任务1&#xff09;初级实验&#xff1a;①手写体图像识别实验&#xff1b;②FashionMnist图像分类实验&#xff1b;③汽车里程数预测实验。2&#xff09;中级实验&#xff1a;①鸢…

数据集划分和交叉验证

机器学习实践中&#xff0c;为防止模型出现过拟合问题&#xff0c;需要预先将数据划分为训练集和测试集&#xff0c;训练集用来建模&#xff0c;训练模型&#xff0c;测试集用来提前测试模型的实际预测能力&#xff0c;这期间就会出现不同的数据集划分和模型评价方法&#xff0…

Linux常用命令——alias命令

Linux命令查询工具 alias 用来设置指令的别名 补充说明 alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时&#xff0c;用户必须使用单引号将原来的命令引起来&#xff0c;防止特殊字符导致错误。 alias命令的作用只局限于该次登入…

EventLoop与宏任务和微任务

1、JavaScript 是单线程的语言 JavaScript 是一门单线程执行的编程语言。也就是说&#xff0c;同一时间只能做一件事情。 单线程执行任务队列的问题&#xff1a;如果前一个任务非常耗时&#xff0c;则后续的任务就不得不一直等待&#xff0c;从而导致程序假死的问题。 2、同步…

性能优化系列之『混合式开发:Flutter内核及优势介绍』

文章の目录一、愿景二、技术优势三、底层实现四、选型建议写在最后一、愿景 A portable toolkit for building beautiful experiences wherever you might want to paint pixels on the screen.一个拥有美好构建体验的便携式的工具包&#xff0c;可以让你在屏幕的任何地方绘制…

LeetCode题解 二叉树(十四):669 修改二叉搜索树;108 将有序数组转换为二叉搜索树;538 把二叉搜索树转换为累加树

二叉树 669 修改二叉搜索树 medium 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xf…

数据可视化系列-06数据分析工具QuickBI

文章目录数据可视化系列-06数据分析工具QuickBI一文介绍QuickBIQuick BI 的基本对象快速入门Quick BI产品架构界面说明菜单栏我的看板工作台首页通过仪表板分析数据数据可视化系列-06数据分析工具QuickBI 参考&#xff1a; Quick BI 数据可视化分析平台 QuickBI官方文档 一文…

Jina AI 荣获「2022 稀土掘金引力榜」年度新锐企业 Top 10 称号!

2023 年 1 月 6 日&#xff0c;由稀土掘金技术社区打造的「掘金引力榜」正式公布。凭借在开源技术、产品等领域的积极布局&#xff0c;在社区生态影响力的突出贡献&#xff0c;Jina AI 荣获「掘金引力榜 2022 年度新锐企业 Top10」&#xff01;「掘金引力榜」是由稀土掘金技术社…

什么是商家转账到零钱

1. 什么是商家转账到零钱商家转账到零钱为商户提供向一个或者同时向多个用户微信零钱转账的能力&#xff0c;商户可免费使用。1.1. 使用场景商户可以使用商家转账用于现金营销、分销返佣、行政补贴、行政奖励、保险理赔、佣金报酬、企业报销、企业补贴、服务款项、采购货款等向…

阿里微服务质量保障系列(二):研发流程知多少

持续坚持原创输出&#xff0c;点击蓝字关注我吧介绍研发流程主要是给大家一个体感&#xff0c;可以直观感受阿里测试工程师从项目的立项到最终发布经历了哪些过程、做了什么工作。需求的产生刚毕业工作那会&#xff0c;认为需求来源于产品&#xff0c;把PD宣讲的产品需求奉为圭…

12.30第一周 星期五SSH

SSH功能&#xff1a;1.远程连接 2.sftp 1. 使用之前首先确认系统中有无 ssh 的软件包 rpm -qa | grep ssh 主程序或执行文件位置&#xff1a;/usr/sbin/ss服务端配置文件: /etc/ssh/sshd_config服务器用客户端的公钥对数据---->加密---->到客户端时&#xf…

TemplateFlow:一个跨物种,多尺度脑部模板和图谱的共享平台

Problem大脑的参考模板在神经影像工作流程中起着核心作用&#xff0c;是报告标准化结果的基础。而模板或者图谱的选择是不同研究中方法学差异的一个相关来源&#xff0c;最近被认为是对神经科学可重复性的一个重要挑战而受到关注。大多数情况下&#xff0c;我们所使用的模板由神…

Linux中Shell与环境变量与配置文件

Shell是什么 Shell是个程序&#xff0c;他会在用户登录系统后系统开启的&#xff0c;他可以通过标准输入来接收命令&#xff0c;然后执行命令&#xff0c;Shell可以执行内部命令和外部命令&#xff0c;内部命令就是Shell程序里面自己的逻辑&#xff0c;外部命令是Shell调用其他…

Linux常用命令——firewall-cmd命令

在线Linux命令查询工具 firewall-cmd Linux上新用的防火墙软件&#xff0c;跟iptables差不多的工具。 补充说明 firewall-cmd 是 firewalld的字符界面管理工具&#xff0c;firewalld是centos7的一大特性&#xff0c;最大的好处有两个&#xff1a;支持动态更新&#xff0c;不…

【SCL】博图scl语言应用项目:装配流水线模拟控制

使用西门子博图SCL语言和factoryio软件来编写应用案例——装配流水线模拟控制项目 文章目录 目录 前言 一、应用&#xff1a;装配流水线模拟控制 1.控制要求 2.完善控制要求和场景 1.布置场景&#xff08;factoryio&#xff09; 2.控制要求 3.变量表&#xff08;I/O分配&…

Cocos Creator Protobuf的js版本使用

一、基础知识参考Protocol Buffers 在游戏中的应用Protobuf语言指南android与PC&#xff0c;C#与Java 利用protobuf 进行无障碍通讯【Socket】1.性能好/效率高现在&#xff0c;俺就来说说Google公司为啥放着好端端的XML不用&#xff0c;非要另起炉灶&#xff0c;重新造轮子。一…

10.0、Linux-磁盘管理简单初体验

10.0、Linux-磁盘管理简单初体验 列出文件系统整体的磁盘使用量 -> df -h ( 检查磁盘空间使用量 ) 查看目录中所有的文件磁盘空间使用情况 -> du -a -h 根目录下每个目录所占空间大小容量 -> du -sm /* Mac 或者想使用 Linux 挂载我们的一些本地磁盘或者文件 挂载&am…

时隔 20 年,这个编程语言再次“称王”!

↓推荐关注↓综合整理&#xff1a;程序员的那些事&#xff08;id: iProgrammer&#xff09;近日&#xff0c;全球知名的编程语言流行度排行榜网站 TIOBE 公布了 1 月编程指数信息。前三的编程语言是Python、C 和C&#xff0c;第四为Java&#xff0c;第五是C#。TIOBE 的 2022 年…

MyBatis#1(快速入门与Mapper代理)

一.MyBatis简介1.MyBatis是一款优秀的持久层框架,可用于简化JDBC的开发2.持久层: 负责将数据保存到数据库的那一层代码JavaEE的三层架构: 表现层, 业务层, 持久层3.框架:框架就是一个半成品软件, 是一套可重用的, 通用的, 软件基础代码模型优点: 高效, 规范, 通用, 可扩展二.My…