fate框架使用记录
文章目录
- 在腾讯云服务器上使用fate
- 1. secureboost
- 进入环境
- 上载数据
- 2. logistic regression
- 熟悉fate文档
- Supported Components
- DSL & Task Submit Runtime Conf Setting
- Developing guides for develop a runnable algorithm module of FATE
- Upload Data Guide
在腾讯云服务器上使用fate
1. secureboost
进入环境
输入ssh + 服务器地址 --> 输入密码进入服务器
使用cd FATE/命令进入框架所在文件夹
使用docker exec -it fate_python bash命令进入docker
上载数据
由于原文件夹中的upload_data_guest.json和upload_data_host.json文件中table_name和namespace参数存在不一致问题,故新创建两个json文件:up_dt_guest.json和up_dt_host.json,并写入内容如下:
up_dt_host.json
{"file": "examples/data/breast_a.csv","head": 1,"partition": 10,"work_mode": 0,"table_name": "breast_a","namespace": "hetero"
}
up_dt_guest.json
{"file": "examples/data/breast_b.csv","head": 1,"partition": 10,"work_mode": 0,"table_name": "breast_b","namespace": "hetero"
}
接下来上载数据:
python fate_flow/fate_flow_client.py -f upload -c examples/federatedml-1.0-examples/up_dt_guest.json -c examples/federatedml-1.0-examples/up_dt_host.json
注意是先上载guest后上载host
最后提交任务:
python fate_flow/fate_flow_client.py -f submit_job -d examples/federatedml-1.0-examples/hetero_secureboost/test_secureboost_train_dsl.json -c examples/federatedml-1.0-examples/hetero_secureboost/test_secureboost_train_binary_conf.json
可以通过提示网址查看结果:
http://localhost:8080/index.html#/dashboard?job_id=20190929055530316952233&role=guest&party_id=10000
结果如下:
点击view this job查看所有结果,同时可以通过切换job查看guest端和host端上载的数据,训练的指标存放在evaluation中:
2. logistic regression
步骤同上:
python fate_flow/fate_flow_client.py -f submit_job -d examples/federatedml-1.0-examples/hetero_logistic_regression/test_hetero_lr_train_job_dsl.json -c examples/federatedml-1.0-examples/hetero_logistic_regression/test_hetero_lr_train_job_conf.json
部分结果:
目前只熟悉这一种操作。。。
熟悉fate文档
Supported Components
DataIO
对应模块名称DataIO,通常是建模任务的第一个组件,将用户上传数据转换为实例对象。
数据输入:DTable,值是原始数据。
数据输出:转换后的DTable,值是federatedml/feature/instance.py中定义的数据实例。
Intersect
对应模块名称Intersection计算两方的相交数据集,而不会泄漏差异集信息。主要用于异构方案任务。
数据输入:DTable数据。
数据输出:同时出现在两方DTable的键组成的DTable。
Federated Sampling
对应模块名称FederatedSample,联合采样数据,使分布在各方之间变得平衡。此模块支持federated版本和standalone版本。
数据输入:DTable数据。
数据输出:采样数据,支持随机采样和分层采样。
Feature Scale
对应模块名称FeatureScale,用于特征缩放和标准化的模块。
数据输入:DTable,其值为实例。
数据输出:转换后的DTable。
模型输出:变换系数,例如最小/最大,平均值/标准差。
Hetero Feature Binning
对应模块名称HeteroFeatureBinning,使用合并输入数据,计算每个列的iv和woe,并根据合并后的信息转换数据。
数据输入:DTable在guest中有标签y,在host中没有标签y。
数据输出:转换后的DTable。
模型输出:每列的iv /woe,分裂点,事件计数,非事件计数等。
OneHot Encoder
对应模块名称OneHotEncoder,将一列转换为OneHot格式。
数据输入:输入DTable。
数据输出:转换了带有新header的DTable。
模型输出:原始header和特征值到新header映射。
Hetero Feature Selection
对应模块名称HeteroFeatureSelection,提供5种类型的过滤器。每个过滤器都可以根据用户配置选择列。
数据输入:输入DTable。
模型输入:如果使用iv过滤器,则需要hetero_binning模型。
数据输出:转换的DTable具有新的header和已过滤的数据实例。
模型输出:每列是否留下。
Hetero-LR
对应模块名称HeteroLR,通过多方构建异质逻辑回归模块。
数据输入:输入DTable。
模型输出:Logistic回归模型。
Homo-LR
对应模块名称HomoLR,通过多方构建同质逻辑回归模块。
数据输入:输入DTable。
模型输出:Logistic回归模型。
Hetero Secure Boosting
对应模块名称HeteroSecureBoost,通过多方建立异构安全提升模型。
数据输入:DTable,值是实例。
模型输出:SecureBoost模型,由模型元和模型参数组成。
Evaluation
对应模块名称Evaluation,为用户输出模型评估指标。
DSL & Task Submit Runtime Conf Setting
为了使建模任务更加灵活,目前,FATE使用其自己的领域特定语言(DSL,domain-specific language)来描述建模任务。通过使用这种DSL,可以将诸如数据输入,功能设计和分类/回归模块等建模组件组合为有向非循环图(DAG)。 因此,用户可以根据需要灵活地组合算法组件。
此外,每个组件都有自己的参数要配置。 此外,各方之间的配置可能会有所不同。 为了方便起见,FATE使用在一个文件中配置所有各方和所有组件的所有参数。 本指南将向您展示如何创建这样的配置文件。
DSL Configure File
我们使用json文件作为dsl配置文件,它实际上是一个字典。 dict的第一级始终是“component”,显示您将在建模任务中添加组件。
{"components" : {...
}
然后,应在第二层中定义每个组件。 以下设置组件的示例:
"dataio_0": {"module": "DataIO","input": {"data": {"data": ["args.train_data"]}},"output": {"data": ["train"],"model": ["dataio"]},"need_deploy": true
}
如示例所示,用户将组件名称定义为该模块的键。 但是此模块应以“ _num”结尾,其中num应以0开头。(???)
Field Specification
1.模块:指定使用哪个组件。 除.json后缀外,此字段应与federatedml / conf / setting_conf中的文件名严格相同。
2.输入:输入有两种类型,数据和模型。
i.data
有三种可能的data_input类型:
a.data:通常用于data_io,feature_engineering模块和评估中。
b.train_data:用于homo_lr,hetero_lr和secure_boost。 如果提供此字段,则任务将被解析为拟合任务。
c.eval_data:如果提供了train_data,则此字段为可选。 在这种情况下,此数据将用作验证集。 如果未提供train_data,则此任务将被解析为预测或迁移任务。
ii.model
有两种可能的模型输入类型:
a.model:这是由相同类型的组件输入的模型。 例如,hetero_binning_0作为拟合组件运行,hetero_binning_1将hetero_binning_0的模型输出作为输入,因此可以用于迁移或预测。示例如下:
"hetero_feature_binning_1": {"module": "HeteroFeatureBinning","input": {"data": {"data": ["dataio_1.eval_data"]},"model": ["hetero_feature_binning_0.fit_model"]},"output": {"data": ["eval_data"],"model": ["eval_model"]}
}
b.isometric_model:用于指定来自上游组件的模型输入。例如,特征选择将把特征分类作为上游模型,因为它将信息值用作特征的重要性。 这是特征选择组件的示例:
"hetero_feature_selection_0": {"module": "HeteroFeatureSelection","input": {"data": {"data": ["hetero_feature_binning_0.train"]},"isometric_model": ["hetero_feature_binning_0.output_model"]},"output": {"data": ["train"],"model": ["output_model"]}
}
3.输出:与输入相同,可能会出现两种类型的输出,即数据和模型。
i.data:指定输出数据名称。
ii.model:指定输出模型名称。
例子同上述。
Submit Runtime Conf
除了dsl conf外,用户还需要准备一个Submit runtime conf来设置每个组件的参数。
1.initiator(启动器):首先,应在此运行时配置文件中指定启动器。 这是设置启动器的示例:
"initiator": {"role": "guest","party_id": 10000
},
2.role(角色):应指定此建模任务中涉及的所有角色。 角色中的每个元素都应包含角色名称及其角色ID。 ID之所以采用列表形式,是因为一个角色可能存在多个参与方。
"role": {"guest": [10000],"host": [10000],"arbiter": [10000]
}
3.role_parameters:应当在各个参与方之间指定这些参数。 请注意,每个参数都应具有列表的形式。
i.在role_parameters内部,使用参与者名称作为键,并且这些参与者的参数是值。 以以下结构为例:
"guest": {"args": {"data": {"train_data": [{"name": "1ca0d9eea77e11e9a84f5254005e961b","namespace": "arbiter-10000#guest-10000#host-10000#train_input#guest#10000"}]}},"dataio_0": {"with_label": [true],...}
},
"host": {"args": {"data": {"train_data": [{"name": "3de22bdaa77e11e99c5d5254005e961b","namespace": "arbiter-10000#guest-10000#host-10000#train_input#host#10000"}]}},"dataio_0": {...}...
}
如本示例所示,对于每一方,输入参数(例如train_data,eval_data等)应在args中列出。 上面的名称和名称空间是上载数据的表指示符。
然后,用户可以为每个组件配置参数。 组件名称应与dsl配置文件中定义的名称匹配。 每个组件参数的内容都在federatedml / param中的Param类中定义。
4.algorithm_parameters:如果各方之间有一些相同的参数,则可以在algorithm_parameters中进行设置。 示例如下:
"hetero_feature_binning_0": {...
},
"hetero_feature_selection_0": {...
},
"hetero_lr_0": {"penalty": "L2","optimizer": "rmsprop","eps": 1e-5,"alpha": 0.01,"max_iter": 10,"converge_func": "diff","batch_size": 320,"learning_rate": 0.15,"init_param": {"init_method": "random_uniform"},"cv_param": {"n_splits": 5,"shuffle": false,"random_seed": 103,"need_cv": false,}
},
与角色参数中的形式相同,参数的每个键都是在dsl配置文件中定义的组件的名称。
完成这些设置并提交任务后,fate-flow将结合角色参数中的参数列表和算法参数。 如果仍有一些字段未定义,则将使用默认运行时conf中的值。 然后,fate-flow将这些配置文件发送给它们的相应方,并启动联合建模任务。
Developing guides for develop a runnable algorithm module of FATE
在本文档中,它描述了如何开发算法模块,该模块可以在FATE架构下调用。要开发模块,需要执行以下5个步骤。
1定义将在此模块中使用的python参数对象。2定义模块的设置conf json。3定义模块的默认运行时配置json。4如果模块需要联合,则定义transfer_variable json。5定义应该继承model_base类的模块。
在以下各节中,我们将通过toy_example详细描述这5个步骤。
Step1.Define the parameter object this module will use
参数对象是将用户定义的运行时参数传递给开发模块的唯一方法,因此每个模块都有其自己的参数对象。为了定义可用的参数对象,将需要三个步骤:
a.打开一个新的python文件,将其重命名为xxx_param.py,其中xxx代表您模块的名称,并将其放置在federatedm / param /文件夹中。 定义它的类对象xxx_param.py应该继承在federatedml / param / base_param.py中定义的BaseParam类。
b.参数类的__init__应该指定模块使用的所有参数。
c.override BaseParam的check interface,否则将导致not implemented error。 check method用于验证参数变量。
以hybrid lr的参数对象为例,python文件为federatedml / param / logistic_regression_param.py。
首先,它继承了BaseParam:
class LogisticParam(BaseParam):
其次,在init方法中定义所有参数变量:
def __init__(self, penalty='L2',eps=1e-5, alpha=1.0, optimizer='sgd', party_weight=1,batch_size=-1, learning_rate=0.01, init_param=InitParam(),max_iter=100, converge_func='diff',encrypt_param=EncryptParam(), re_encrypt_batches=2,encrypted_mode_calculator_param=EncryptedModeCalculatorParam(),need_run=True, predict_param=PredictParam(), cv_param=CrossValidationParam()):super(LogisticParam, self).__init__()self.penalty = penaltyself.eps = epsself.alpha = alphaself.optimizer = optimizerself.batch_size = batch_sizeself.learning_rate = learning_rateself.init_param = copy.deepcopy(init_param)self.max_iter = max_iterself.converge_func = converge_funcself.encrypt_param = copy.deepcopy(encrypt_param)self.re_encrypt_batches = re_encrypt_batchesself.party_weight = party_weightself.encrypted_mode_calculator_param = copy.deepcopy(encrypted_mode_calculator_param)self.need_run = need_runself.predict_param = copy.deepcopy(predict_param)self.cv_param = copy.deepcopy(cv_param)
如上面的示例所示,该参数也可以是继承BaseParam的Param类。 此类参数的默认设置是此类的实例。然后将该实例的Deepcopy版本分配给类属性。deepcopy功能用于避免任务运行期间出现相同的指针风险。一旦正确定义了类,提供的参数解析器就可以递归地解析每个属性的值。
第三,override the check interface:
def check(self):descr = "logistic_param's"if type(self.penalty).__name__ != "str":raise ValueError("logistic_param's penalty {} not supported, should be str type".format(self.penalty))else:self.penalty = self.penalty.upper()if self.penalty not in ['L1', 'L2', 'NONE']:raise ValueError("logistic_param's penalty not supported, penalty should be 'L1', 'L2' or 'none'")if type(self.eps).__name__ != "float":raise ValueError("logistic_param's eps {} not supported, should be float type".format(self.eps))
Step2.Define the setting conf of the new module
定义设置conf的目的是fate_flow模块提取该文件以获取有关如何启动模块程序的信息。
a.在federatedml / conf / setting_conf /中定义设置conf,将其命名为xxx.json,其中xxx是您要开发的模块。请注意,xxx.json的名称“ xxx”非常严格,因为当fate_flow dsl解析器在作业dsl中提取模块“ xxx”时,它只是将模块名称“ xxx”与“ .json”连接起来,并在federatedml中检索设置conf /conf/setting_conf/xxx.json。
b.设置conf json的字段规范。
module_path:开发模块程序的路径前缀。
default_runtime_conf:在其中定义一些默认参数变量的conf,将在步骤3中进行描述。
param_class:在步骤1中找到param_class定义的路径,它是参数python文件和参数对象名称的路径的串联。
role:
"role":{"guest":启动来宾程序的路径后缀"host":启动主机程序的路径后缀"arbiter":启动仲裁器程序的路径后缀}
更重要的是,如果该模块不需要联合,这意味着各方都可以启动同一个程序文件,则"guest | host | arbiter"是定义角色键的另一种方法。
用户也可以通过hybrid-lr进行解释,用户可以在federatedml / conf / setting_conf / HeteroLR.json中找到它。
{"module_path": "federatedml/logistic_regression/hetero_logistic_regression","default_runtime_conf": "logistic_regression_param.json","param_class" : "federatedml/param/logistic_regression_param.py/LogisticParam","role":{"guest":{"program": "hetero_lr_guest.py/HeteroLRGuest"},"host":{"program": "hetero_lr_host.py/HeteroLRHost"},"arbiter":{"program": "hetero_lr_arbiter.py/HeteroLRArbiter"}}
}
看一下HeteroLR.json中的上述内容,HeteroLR是一个联邦模块,它的guest程序在federatedml /logistic_regression / hetero_logistic_regression / hetero_lr_guest.py中定义,而HeteroLRGuest是guest类对象。同样的规则也适用于host和arbiter类。
Fate_flow结合模块的path和角色的程序来运行该模块。"param_class"指示在"federatedml / param / logistic_regression_param.py"中定义了HeteroLR的参数类对象,并且类名称为LogisticParam。
默认的运行时配置文件位于federatedml / param / logistic_regression_param.py中。
Step3.Define the default runtime conf of this module (Optional)
缺省运行时配置为参数类中定义的变量设置缺省值,如果没有用户配置,将使用缺省值。
应将其放在federatedml / conf / default_runtime_conf(与setting_conf的"default_runtime_conf"字段匹配,这是编写此类json文件的可选选择。)
例如,在"federatedml / conf / default_runtime_conf / logistic_regression_param.json"中,HeteroLR的默认变量正在其中写入。
{"penalty": "L2",
"optimizer": "sgd",
"eps": 1e-5,
"alpha": 0.01,
"max_iter": 100,
"converge_func": "diff",
"re_encrypt_batches": 2,
"party_weight": 1,
"batch_size": 320,
"learning_rate": 0.01,
"init_param": {"init_method": "random_normal"
},
...
}
Step4.Define the transfer variable json of this module and generate transfer variable object. (Optional)
仅在联合此模块时才需要执行此步骤,这意味着不同参与方之间存在信息交互。
请注意,此json文件应放在"federatedml / transfer_variable_conf" fold下。
在这个json文件中,您需要做的第一件事就是定义transfer_variable对象的名称,例如"HeteroLRTransferVariable"。
其次,定义transfer_variables。 transfer_variable包含三个字段:
a.variable name(变量名)
b. src:应该是"guest",“host”,“arbiter"之一,它表示从中发送交互信息的位置。
c.“dst”:列表,应该是"guest”,“host”,"arbiter"的某些组合,用于定义将交互式信息发送到的位置。
以下是“ hetero_lr.json”的内容:
{"HeteroLRTransferVariable": {"paillier_pubkey": {"src": "arbiter","dst": ["host","guest"]},"batch_data_index": {"src": "guest","dst": ["host"]},...}
}
完成编写此json文件后,运行federatedml / util / transfer_variable_generator.py的python程序,您将在federatedml / util / transfer_variable / xxx_transfer_variable.py中获得一个transfer_variable python类对象,xxx为此json文件的文件名。
Step5.Define your module, it should inherit model_base
fate_flow_client模块的运行规则是:
1检索setting_conf并找到设置conf的"module"和"role"字段。
2初始化各方的运行对象。
3调用运行对象的运行方法。
4如果需要,调用save_data方法。
5如果需要,对export_model方法进行分类。
在本节中,我们描述如何执行3-5。 federatedml / model_base.py中提供了许多常用接口。
a. 如果需要,请override运行界面。 run function具有以下形式:
def run(self, component_parameters=None, args=None):
component_parameters和args都是dict对象。
"args"包含DTable形式的module的输入数据集和输入模型。
每个元素的命名都在用户的dsl配置文件中定义。
另一方面,"component_parameters"是此模块的参数变量,该变量在Step1中提到的模块参数类中定义。
这些配置的参数是用户定义的,或取自默认runtime conf中的默认值。
b.定义您的save_data接口,以便fate-flow可以在需要时通过它获取输出数据。
def save_data(self):return self.data_output
c.与b部分类似,定义export_model接口,以便fate-flow在需要时可以获得输出模型。
格式应为同时包含生成"Meta"和"Param"原型缓冲区的dict。
以下为如何导出模型的示例:
def export_model(self):meta_obj = self._get_meta()param_obj = self._get_param()result = {self.model_meta_name: meta_obj,self.model_param_name: param_obj}return result
Start a modeling task
完成开发后,这是一个启动建模任务的简单示例。
1. Upload data
在开始任务之前,您需要在所有数据提供者之间加载数据。 为此,需要准备load_file配置。 然后运行以下命令:
python ${your_install_path}/fate_flow/fate_flow_client.py -f upload -c dsl_test/upload_data.json
注意:每个数据提供节点(即guest, host)都需要执行此步骤。
2. Start your modeling task
在此步骤中,应准备两个与dsl配置文件和component配置文件相对应的配置文件。 请确保conf文件中的table_name和名称空间与upload_data conf匹配。 然后运行以下命令:
python ${your_install_path}/fate_flow/fate_flow_client.py -f submitJob -d dsl_test/test_homolr_job_dsl.json -c dsl_test/${your_component_conf_json}
3. 3. Check log files
现在,您可以在以下路径中检出日志:$ {your_install_path} / logs / {your jobid}。
有关dsl配置文件和参数配置文件的更多详细信息,请在此处查看示例文档
Upload Data Guide
在开始建模任务之前,应上载要使用的数据。通常,一方通常是包含多个节点的集群。因此,当我们上传这些数据时,数据将被分配给这些节点。
接受的数据类型
数据输入输出模块接受以下输入数据格式,并将其转换为所需的输出数据表。
1.密集输入格式,输入数据表的值项是单个元素的列表(例如“1.0,2.0,3.0,4.5”)
2.svm-light输入格式,输入数据表的值的第一项是标签,后面是一个复杂的“feature-id:value”项列表(例如,值是“1 1:0.5 2:0.6”)。
3.标签输入格式,输入DTable的值是一个标签列表,数据IO模块首先聚集在输入表中出现的所有标签,然后将所有输入行转换为one-hot表示,按字典顺序排序所发生的标签(例如假设值是“a c”,“a b d”),在处理之后,新值变成“1 0 1 1”,“1 1 0 0”。
4.tag:value输入格式,输入dtable的值是tag:value的列表,类似于一个混合的支持向量机light和tag输入格式。数据IO模块首先聚集输入表中出现的所有标签,然后根据字典顺序将所有输入行更改为one-hot表示,对所出现的标签进行排序,然后用值填充所发生的项。(例如,假设值为“A:0.2 C:1.5”,“A:0.3 B:0.6 D:0.7”,经过处理后,新值变为“0.2 0 0.5 0”,“0.3 0.6 0 0.7”。)
定义上传数据配置文件
下面是一个示例,说明如何创建上载配置文件:
{"file": "examples/data/breast_b.csv","head": 1,"partition": 10,"work_mode": 0,"table_name": "hetero_breast_b","namespace": "hetero_guest_breast"
}
现场规范:
文件:文件路径
head:指定数据文件是否包含头
分区:指定用于存储数据的分区数
本地:指定当前参与方信息
table_name&namespace:存储数据表的指示符。
上载命令
我们使用fate-flow上传数据。命令如下:
python${your_install_path}/fate_flow/fate_flow_client.py-f upload-c dsl_test/upload_data.json
注意:每个数据提供节点(即来宾和主机)都需要此步骤。
运行此命令后,如果成功,将显示以下信息。
{"data": {"namespace": "breast_hetero","pid": 74684,"table_name": "breast_b"},"jobId": "20190801152750392991_436","meta": null,"retcode": 0,"retmsg": "success","created_at": "2019-08-01 15:27:50"
}
如输出所示,table_name和namespace已经列出,可以在submit-runtime conf中作为输入配置。
fate框架使用记录相关推荐
- 记录安装使用联邦机器学习FATE框架
联邦机器学习框架 参考: 文章:联邦学习项目FATE Stand-alone单机版在ubuntu16.04上体验部署来源 链接:https://blog.csdn.net/weixin_4237935 ...
- FATE框架练习:实现横向逻辑回归任务的训练及预测
毕设需要使用fate框架,所以熟悉一下,主要参考了范星星的博客 目前只找到上边这一个V2版本的教程,特别感谢大佬 记录一下练习过程. 顺便贴一下可能会用到的文档 FATE单机部署指南 FedAI 社区 ...
- Mac/Linux 安装联邦学习 Fate 框架单机部署所需的依赖(填坑大全)
安装过程各种坑,官方单机部署教程,然而官方教程问题超多,我在Mac本机与新建的ubuntu18.04.5上分别单机部署,使用standalone-fate-master-1.4.5.tar.gz,py ...
- FATE框架安装后测试报错:ModuleNotFoundError: No module named ‘arch‘
这里不能:pip install arch,因为fate框架使用的不是pypi里的arch,而是根目录 standalone-fate-master-1.4.5/ 下的 arch文件夹 所以: 在命令 ...
- 【联邦学习FATE框架实战】(二)用FATE从零开始实现横向逻辑回归
目录 1. 获取数据集 1.1 下载数据集 1.2 横向数据集切分 2. 通过DSL Conf运行训练和预测任务 2.1 数据输入 2.2 模型训练 2.2.1 配置DSL文件 2.2.2 运行配置S ...
- FATE框架学习笔记
FATE框架学习笔记 联邦学习基本概念 FATE平台环境搭建过程 因缘巧合之下,和同学一起组队参加了,FinTechathon 微众银行首届金融科技高校技术大赛 https://fintech.web ...
- pytest+yaml设计接口自动化框架过程记录(一步一步记录如何设计,完结撒花),源码提供,视频教程
pytest+yaml设计接口自动化框架过程记录 第三代框架使用教程,该框架比现在这个完善了很多 框架简介 框架运行演示和功能介绍视频 pytest+yaml框架环境配置和使用教程 0.去年也写了一个 ...
- (一)联邦学习FATE框架1.6.0版本单机部署和实战训练评估篇
FATE 1.6.0学习笔记 系统安装,环境搭建和fate框架搭建指南手册下载 链接:https://pan.baidu.com/s/1K-88uye6RN3tLHw6f_r9Ug 提取码:5y2u ...
- Scrapy框架学习记录
随着Python爬虫学习的深入,开始接触Scrapy框架 记录下两个参考教程: 官网教程:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutor ...
最新文章
- 阿里巴巴开源限流降级神器Sentinel大规模生产级应用实践
- 【问链-EOS公开课】第十二课 EOS整体代码结构
- pca 和lda区别
- node.js mysql防注入_避免Node.js中的命令行注入安全漏洞
- 数据结构知识点大汇总(二)
- linux内核机制是什么,linux内核slab机制分析
- 微信公众号发送小程序卡片_微信公众号里怎么添加小程序-如何在微信[[公众号]]添加小程序卡片-微信关联小程序...
- Asp.net直接保存文件到客户端
- 18项医疗质量安全核心制度
- 微带线特性阻抗计算公式_传输线特性阻抗计算方式
- kettle 数据库密码解密
- 求助fax4j,发送和接收传真
- Gradle教程——(二)Gradle介绍
- Linux下使用为知笔记的坑和解决办法
- [2019 icpc徐州] H.Yuuki and a problem 带修改的主席树(主席树+树状数组)
- 回望过去,感觉现在的自己十分功利
- android 酷狗demo_在Android上使用酷狗歌词API
- 抽屉原理解释及简单举例
- 互联网金融公司在信贷风险管理方面,主要面临哪些挑战
- python实现监听键盘
热门文章
- 关于Ubuntu18.04安装后没有gcc、make、网卡驱动的问题总结以及解决办法
- java游戏大唐双龙传后传,大唐龙凤传(大唐双龙传后续)
- iphone一键转移_苹果手机如何一键转移数据 转移教程介绍
- Deepin V20 安装 佳能 Canon LBP 2900打印机
- 【Oracle 数据库】奶妈式教程day15 DDL、DML、索引、视图、序列、死锁这一篇就够了
- matlab——对图形局部区域上色
- 华为自研操作系统Project Z曝光
- lombok中的builder注解居然是一种设计模式:让我们了解一下超级实用的“建造者模式”吧
- 小米手环模拟门禁卡读卡失败_工作生活好帮手 篇一:小米note3模拟门禁卡 你该不该知道的可能都在这里_安卓手机...
- 【UE4】搭建局域网内VR直播 UE4.27