文章目录

  • 在腾讯云服务器上使用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框架使用记录相关推荐

  1. 记录安装使用联邦机器学习FATE框架

    联邦机器学习框架 参考: 文章:联邦学习项目FATE Stand-alone单机版在ubuntu16.04上体验部署来源 链接:https://blog.csdn.net/weixin_4237935 ...

  2. FATE框架练习:实现横向逻辑回归任务的训练及预测

    毕设需要使用fate框架,所以熟悉一下,主要参考了范星星的博客 目前只找到上边这一个V2版本的教程,特别感谢大佬 记录一下练习过程. 顺便贴一下可能会用到的文档 FATE单机部署指南 FedAI 社区 ...

  3. Mac/Linux 安装联邦学习 Fate 框架单机部署所需的依赖(填坑大全)

    安装过程各种坑,官方单机部署教程,然而官方教程问题超多,我在Mac本机与新建的ubuntu18.04.5上分别单机部署,使用standalone-fate-master-1.4.5.tar.gz,py ...

  4. FATE框架安装后测试报错:ModuleNotFoundError: No module named ‘arch‘

    这里不能:pip install arch,因为fate框架使用的不是pypi里的arch,而是根目录 standalone-fate-master-1.4.5/ 下的 arch文件夹 所以: 在命令 ...

  5. 【联邦学习FATE框架实战】(二)用FATE从零开始实现横向逻辑回归

    目录 1. 获取数据集 1.1 下载数据集 1.2 横向数据集切分 2. 通过DSL Conf运行训练和预测任务 2.1 数据输入 2.2 模型训练 2.2.1 配置DSL文件 2.2.2 运行配置S ...

  6. FATE框架学习笔记

    FATE框架学习笔记 联邦学习基本概念 FATE平台环境搭建过程 因缘巧合之下,和同学一起组队参加了,FinTechathon 微众银行首届金融科技高校技术大赛 https://fintech.web ...

  7. pytest+yaml设计接口自动化框架过程记录(一步一步记录如何设计,完结撒花),源码提供,视频教程

    pytest+yaml设计接口自动化框架过程记录 第三代框架使用教程,该框架比现在这个完善了很多 框架简介 框架运行演示和功能介绍视频 pytest+yaml框架环境配置和使用教程 0.去年也写了一个 ...

  8. (一)联邦学习FATE框架1.6.0版本单机部署和实战训练评估篇

    FATE 1.6.0学习笔记 系统安装,环境搭建和fate框架搭建指南手册下载 链接:https://pan.baidu.com/s/1K-88uye6RN3tLHw6f_r9Ug 提取码:5y2u ...

  9. Scrapy框架学习记录

    随着Python爬虫学习的深入,开始接触Scrapy框架 记录下两个参考教程: 官网教程:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutor ...

最新文章

  1. 阿里巴巴开源限流降级神器Sentinel大规模生产级应用实践
  2. 【问链-EOS公开课】第十二课 EOS整体代码结构
  3. pca 和lda区别
  4. node.js mysql防注入_避免Node.js中的命令行注入安全漏洞
  5. 数据结构知识点大汇总(二)
  6. linux内核机制是什么,linux内核slab机制分析
  7. 微信公众号发送小程序卡片_微信公众号里怎么添加小程序-如何在微信[[公众号]]添加小程序卡片-微信关联小程序...
  8. Asp.net直接保存文件到客户端
  9. 18项医疗质量安全核心制度
  10. 微带线特性阻抗计算公式_传输线特性阻抗计算方式
  11. kettle 数据库密码解密
  12. 求助fax4j,发送和接收传真
  13. Gradle教程——(二)Gradle介绍
  14. Linux下使用为知笔记的坑和解决办法
  15. [2019 icpc徐州] H.Yuuki and a problem 带修改的主席树(主席树+树状数组)
  16. 回望过去,感觉现在的自己十分功利
  17. android 酷狗demo_在Android上使用酷狗歌词API
  18. 抽屉原理解释及简单举例
  19. 互联网金融公司在信贷风险管理方面,主要面临哪些挑战
  20. python实现监听键盘

热门文章

  1. 关于Ubuntu18.04安装后没有gcc、make、网卡驱动的问题总结以及解决办法
  2. java游戏大唐双龙传后传,大唐龙凤传(大唐双龙传后续)
  3. iphone一键转移_苹果手机如何一键转移数据 转移教程介绍
  4. Deepin V20 安装 佳能 Canon LBP 2900打印机
  5. 【Oracle 数据库】奶妈式教程day15 DDL、DML、索引、视图、序列、死锁这一篇就够了
  6. matlab——对图形局部区域上色
  7. 华为自研操作系统Project Z曝光
  8. lombok中的builder注解居然是一种设计模式:让我们了解一下超级实用的“建造者模式”吧
  9. 小米手环模拟门禁卡读卡失败_工作生活好帮手 篇一:小米note3模拟门禁卡 你该不该知道的可能都在这里_安卓手机...
  10. 【UE4】搭建局域网内VR直播 UE4.27