学习笔记-flowable
flowable
插件
- Flowable BPMN visualizer
依赖
<dependency><groupId>org.flowable</groupId><artifactId>flowable-engine</artifactId><version>6.5.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version></dependency>
xml标签
- - 表示一个完整的工作流程
- - 工作流中起点位置
- - 工作流中结束位置
- - 代表一个任务审核节点 - flowable:assignee 属性,这表示这个节点该由谁来处理
- - 服务任务,在具体的实现中,这个任务可以做任何事情
- - 逻辑判断节点
- - 链接各个节点的线条 - sourceRef 属性表示线的起始节点 - targetRef 属性表示线指向的节点
流程图
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef"><process id="process1" name="process1" isExecutable="true"><startEvent id="start" name="start"/><userTask id="apply" name="apply" flowable:assignee="10001"/><sequenceFlow id="edge_1" sourceRef="start" targetRef="apply" name="edge_1"/><exclusiveGateway id="gateway" name="gateway"/><sequenceFlow id="edge_2" sourceRef="apply" targetRef="gateway" name="edge_2"/><sequenceFlow id="agree" sourceRef="gateway" targetRef="holiday_system" name="agree"><conditionExpression xsi:type="tFormalExpression">${approved}</conditionExpression></sequenceFlow><sequenceFlow id="rejected" sourceRef="gateway" targetRef="e_mail" name="rejected"><conditionExpression xsi:type="tFormalExpression">!${approved}</conditionExpression></sequenceFlow><endEvent id="refuse_end" name="refuse_end"/><sequenceFlow id="edge_5" sourceRef="e_mail" targetRef="refuse_end" name="edge_5"/><userTask id="holiday_apply" name="holiday_apply"/><sequenceFlow id="edge_3" sourceRef="holiday_system" targetRef="holiday_apply" name="edge_3"/><endEvent id="agree_end" name="agree_end"/><sequenceFlow id="edge_4" sourceRef="holiday_apply" targetRef="agree_end" name="edge_4"/><serviceTask id="e_mail" flowable:exclusive="true" name="e_mail" flowable:class="com.sws.flowable.SendEmail"/><serviceTask id="holiday_system" flowable:exclusive="true" name="holiday_system" flowable:class="com.sws.flowable.CallExternalSystem"/></process><bpmndi:BPMNDiagram id="BPMNDiagram_process1"><bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1"><bpmndi:BPMNShape id="shape-cf32fcf2-b052-4374-82b8-a8c1c4bf85d5" bpmnElement="start"><omgdc:Bounds x="-225.0" y="-85.0" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-0e717dd9-30ac-4c4c-b055-a3bf5d6bfecf" bpmnElement="apply"><omgdc:Bounds x="-75.0" y="-110.0" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-eed13fc9-0ffb-4bff-a0aa-e285d8b7d7f9" bpmnElement="edge_1"><omgdi:waypoint x="-195.0" y="-70.0"/><omgdi:waypoint x="-74.99999" y="-70.0"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-a4f56a19-2439-44d3-b8a3-b775ad52e2a4" bpmnElement="gateway"><omgdc:Bounds x="130.0" y="-89.99999" width="40.0" height="40.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-d5f2fe06-7a50-4973-8511-72fa8925cbec" bpmnElement="edge_2"><omgdi:waypoint x="25.0" y="-70.0"/><omgdi:waypoint x="130.0" y="-69.99999"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-8753897d-4678-4e99-b9ce-642f43e7f525" bpmnElement="agree"><omgdi:waypoint x="170.0" y="-69.99999"/><omgdi:waypoint x="260.0" y="-70.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-2b5a2ac0-1286-4d5f-af1e-48e998ce9f1b" bpmnElement="rejected"><omgdi:waypoint x="150.0" y="-50"/><omgdi:waypoint x="150.0" y="80.0"/><omgdi:waypoint x="250" y="80"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-7a97d6b5-57ba-41bc-8dc1-717aab6aa854" bpmnElement="refuse_end"><omgdc:Bounds x="460.0" y="65.0" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-27898ca3-1476-4654-9004-a8bc78995894" bpmnElement="edge_5"><omgdi:waypoint x="349.99997" y="80.00001"/><omgdi:waypoint x="460.0" y="80.0"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-ef7ac29e-8c1f-4c49-8f8d-6a78163eeebd" bpmnElement="holiday_apply"><omgdc:Bounds x="470.0" y="-109.99999" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-c2087a6f-f798-43ba-916c-cca48749601c" bpmnElement="edge_3"><omgdi:waypoint x="360.0" y="-69.99999"/><omgdi:waypoint x="470.0" y="-69.99999"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-36c2a15b-54c0-4418-ba70-a04be63c2db4" bpmnElement="agree_end"><omgdc:Bounds x="675.0" y="-85.0" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-04236214-6d53-4358-a229-43b194cc81ae" bpmnElement="edge_4"><omgdi:waypoint x="570.0" y="-69.99999"/><omgdi:waypoint x="675.0" y="-70.0"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-df0c0f71-78a2-42df-90c5-51fa6b518cc0" bpmnElement="e_mail"><omgdc:Bounds x="250.0" y="40.0" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-a2af75ca-9706-423d-97b6-94121cea7903" bpmnElement="holiday_system"><omgdc:Bounds x="260.0" y="-109.99999" width="100.0" height="80.0"/></bpmndi:BPMNShape></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>
表
- 一般数据
- act_ge_bytearry
- 通用流程定义和流程资源,流程资源表,流程部署的bpmn文件和png图片
- id_
- 主键
- rev_
- 版本号
- name_
- 名称
- deployment_id_
- 部署id
- bytes_
- 字节
- generated_
- 0:用户上传
- 1:自动生成
- act_ge_property
- 系统相关属性
- act_ge_bytearry
- 流程历史记录
- act_hi_actinst
- 流程实例,执行历史
- act_hi_attachment
- 流程附件
- act_hi_comment
- 说明性信息
- act_hi_detail
- 流程过程中的详细信息
- act_hi_identitylink
- 流程的参与用户的历史信息
- act_hi_procinst
- 流程实例历史信息
- act_hi_taskinst
- 流程任务历史信息
- act_hi_varinst
- 变量信息
- act_hi_actinst
- 流程定义表
- act_re_deployment
- 流程定义部署表,每部署一次就增加一条记录
- act_re_procdef
- 流程定义表,部署每个新流程就会增加一条记录
- act_re_model
- 模型信息
- act_re_deployment
- 运行实例表
- act_ru_event_subscr
- 运行时事件
- act_ru_execution
- 流程执行信息
- act_ru_identitylink
- 流程的参与用户信息
- act_ru_task
- 运行时任务信息
- act_ru_job
- 运行时作业
- act_ru_variable
- 运行时变量
- act_ru_event_subscr
概念&类型
- ProcessEngineConfiguration
- 工作流引擎配置
- ProcessEngine
- 流程引擎对象
- RepositoryService
- 资源
- ProcessDefinition
- 流程的定义
- RuntimeService
- 运行时服务,可以启动流程实例
- ProcessInstance
- 流程的一个实例
- TaskService
- HistoryService
- ManagementService
- 引擎管理类
- RepositoryService
- 流程引擎对象
- Activity
- 流程中的每一个步骤都是一个Activity
- Execution
- 流程的执行线路
- 通过Execution可以获得当前ProcessInstance当前执行到哪个Activity
- Task
- 当前要做的工作
test
- 获取ProcessEngine
public void testProcessEngine(){// 获取ProcessEngineConfiguration对象ProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();// 配置连接信息configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");configuration.setJdbcUsername("root");configuration.setJdbcPassword("123456");configuration.setJdbcUrl("jdbc:mysql://localhost:3306/flowable?characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true");// 如果数据库表结构不存在,就新建configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);// 构建ProcessEngineProcessEngine processEngine =configuration.buildProcessEngine();}
- 流程部署
- act_re_deployment
- 一次部署操作就产生一次数据
- act_re_procdef
- 一次部署的多个流程定义文件就会产生多个数据
- act_ge_bytearry
- 多少资源就产生多少记录
- act_re_deployment
// 部署流程public void testDeploy(){// 构建ProcessEngineProcessEngine processEngine =configuration.buildProcessEngine();// 获取RepositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment().addClasspathResource("process1.bpmn20.xml")// 关联需要部署的文件.name("请求流程").deploy();System.out.println(deploy.getId());System.out.println(deploy.getName());}
- 查看流程定义
/*** 查看流程定义*/@Testpublic void testDeployQuery(){// 获取流程引擎对象ProcessEngine processEngine = configuration.buildProcessEngine();// 部署流程 获取RepositoryService对象RepositoryService repositoryService = processEngine.getRepositoryService();// 获取流程定义对象ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId("2501").singleResult();System.out.println("processDefinition.getId() = " + processDefinition.getId());System.out.println("processDefinition.getName() = " + processDefinition.getName());System.out.println("processDefinition.getDeploymentId() = " + processDefinition.getDeploymentId());System.out.println("processDefinition.getDescription() = " + processDefinition.getDescription());}
- 挂起和激活
ProcessEngine processEngine = configuration.buildProcessEngine();
// 部署流程 获取RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
// 获取流程定义对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId("xxx").singleResult();
// 获取当前流程定义状态信息
boolean suspended = processDefintion.isSuspended();
if(suspended){// 当前流程已挂起// 激活repositoryService.activateProcessDefinitionById("xxx");
}else{// 当前流程已激活// 挂起repositoryService.suspendProcessDefinitionByKey("xxx");
}
- 删除流程
public void testDelete(){// 构建ProcessEngineProcessEngine processEngine =configuration.buildProcessEngine();// 获取RepositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();// 删除部署的流程 参数:流程idrepositoryService.deleteDeployment("xxx");}
- 启动流程实例
- act_ru_deadletter_job
- 正在运行的任务表
- act_ru_event_subscr
- 运行时事件
- act_ru_history_job
- 历史作业表
- act_ru_job
- 运行时作业
- act_ru_suspended_job
- 暂停作业表
- act_ru_timer_job
- 定时作业表
- act_ru_execution
- 流程执行信息
- act_ru_variable
- 运行时变量
- act_ru_task
- 运行时任务信息
- act_ru_identitylink
- 流程的参与用户信息
- act_ru_deadletter_job
public void testRunProcess(){// 获取流程引擎对象ProcessEngine processEngine = configuration.buildProcessEngine();// 启动流程实例通过 RuntimeService 对象RuntimeService runtimeService = processEngine.getRuntimeService();// 构建流程变量Map<String,Object> variables = new HashMap<>();variables.put("employee","张三") ;// 谁申请请假variables.put("nrOfHolidays",3); // 请几天假variables.put("description","工作累了,想出去玩玩"); // 请假的原因// 启动流程实例,第一个参数是流程定义的idProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process1", variables);// 启动流程实例// 输出相关的流程实例信息System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());System.out.println("流程实例的ID:" + processInstance.getId());System.out.println("当前活动的ID:" + processInstance.getActivityId());}
- 查看任务
public void testQueryTask(){// 获取流程引擎对象ProcessEngine processEngine = configuration.buildProcessEngine();TaskService taskService = processEngine.getTaskService();List<Task> list = taskService.createTaskQuery().processDefinitionKey("process1").taskAssignee("10001").list();for (Task task : list) {System.out.println("task.getProcessDefinitionId() = " + task.getProcessDefinitionId());System.out.println("task.getId() = " + task.getId());System.out.println("task.getAssignee() = " + task.getAssignee());System.out.println("task.getName() = " + task.getName());}}
- 触发任务
// 定义邮件发送任务
// com.sws.flowable.SendEmail
public class SendEmail implements JavaDelegate {/*** 触发发送邮件的操作* @param delegateExecution*/@Overridepublic void execute(DelegateExecution delegateExecution) {System.out.println("拒绝");}
}
/*** 拒绝*/public void testCompleteTask(){// 获取流程引擎对象ProcessEngine processEngine = configuration.buildProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processDefinitionKey("process1").taskAssignee("10001").singleResult();// 添加流程变量Map<String,Object> variables = new HashMap<>();variables.put("approved",false); // 拒绝请假// 完成任务taskService.complete(task.getId(),variables);}
- 查看历史
public void testQueryHistory(){// 获取流程引擎对象ProcessEngine processEngine = configuration.buildProcessEngine();HistoryService historyService = processEngine.getHistoryService();List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().processDefinitionId("process1:2:10004").finished().orderByHistoricActivityInstanceEndTime().asc().list();for (HistoricActivityInstance historicActivityInstance : list) {System.out.println(historicActivityInstance.getActivityId() + " took " + historicActivityInstance.getDurationInMillis() + " milliseconds");}}
变量
- 流程创建时
- ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables)
- 流程执行中
- void setVariable(String executionId, String variableName, Object value)
- void setVariableLocal(String executionId, String variableName, Object value)
- void setVariables(String executionId, Map<String, ? extends Object> variables)
- void setVariablesLocal(String executionId, Map<String, ? extends Object> variables)
用户维护
表
- 表
- ACT_ID_USER
- 用户信息
- ACT_ID_GROUP
- 用户组
- ACT_ID_MEMBERSHIP
- 用户与组对应表
- act_id_bytearry
- 二进制数据表
- act_id_info
- 用户信息详情表
- act_id_priv
- 权限表
- act_id_priv_mapping
- 用户与权限关系表
- act_id_property
- 属性表
- act_id_token
- 用户token
- ACT_ID_USER
test
// 用户public void createUser(){// 获取流程引擎对象ProcessEngine processEngine = configuration.buildProcessEngine();// 通过 IdentityService 完成相关的用户和组的管理IdentityService identityService = processEngine.getIdentityService();User user = identityService.newUser("111112222222");user.setFirstName("111");user.setLastName("222");user.setEmail("1221122121@qq.com");identityService.saveUser(user);}
// 用户组public void createGroup(){// 获取流程引擎对象ProcessEngine processEngine = configuration.buildProcessEngine();IdentityService identityService = processEngine.getIdentityService();// 创建Group对象并指定相关的信息Group group = identityService.newGroup("111");group.setName("aaaa");group.setType("bbb");// 创建Group对应的表结构数据identityService.saveGroup(group);}
// 用户分配用户组public void userGroup(){// 获取流程引擎对象ProcessEngine processEngine = configuration.buildProcessEngine();IdentityService identityService = processEngine.getIdentityService();// 根据组的编号找到对应的Group对象Group group = identityService.createGroupQuery().groupId("111").singleResult();List<User> list = identityService.createUserQuery().list();for (User user : list) {// 将用户分配给对应的组identityService.createMembership(user.getId(),group.getId());}}
流程设置组
- flowable:candidateGroups=“${group1}”
IdentityService identityService = processEngine.getIdentityService();
Group group = identityService.createGroupQuery().groupId("group1").singleResult();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 给流程定义中的UEL表达式赋值
Map<String,Object> variables = new HashMap<>();
variables.put("group1",group.getId()); // 给流程定义中的UEL表达式赋值
runtimeService.startProcessInstanceById("xxx",variables);
登录人查询
IdentityService identityService = processEngine.getIdentityService();
// 当前用户所在的组
Group group = identityService.createGroupQuery().groupMember("xxxx").singleResult();
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().processDefinitionId("xxxxx").taskCandidateGroup(group.getId()).list();
拾取任务
String userId = "xxxx";
// 根据当前登录的用户找到对应的组
IdentityService identityService = processEngine.getIdentityService();
// 当前用户所在的组
Group group = identityService.createGroupQuery().groupMember(userId).singleResult();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processDefinitionId("xxxxxxx").taskCandidateGroup(group.getId()).singleResult();
if(task != null) {// 任务拾取taskService.claim(task.getId(),userId);System.out.println("任务拾取成功");
}
归还任务
String userId = "xxxx";
// 根据当前登录的用户找到对应的组
IdentityService identityService = processEngine.getIdentityService();
// 当前用户所在的组
Group group = identityService.createGroupQuery().groupMember(userId).singleResult();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processDefinitionId("xxxxxxx").taskAssignee("xxx").singleResult();
if(task != null) {// 任务归还taskService.unclaim(task.getId());System.out.println("任务归还");
}
交接任务
String userId = "xxxx";
// 根据当前登录的用户找到对应的组
IdentityService identityService = processEngine.getIdentityService();
// 当前用户所在的组
Group group = identityService.createGroupQuery().groupMember(userId).singleResult();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processDefinitionId("xxxxxxx").taskAssignee("xxx").singleResult();
if(task != null) {// 交接任务taskService.setAssignee(task.getId(),"xxx");System.out.println("交接任务");
}
完成任务
String userId = "xxxx";
// 根据当前登录的用户找到对应的组
IdentityService identityService = processEngine.getIdentityService();
// 当前用户所在的组
Group group = identityService.createGroupQuery().groupMember(userId).singleResult();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processDefinitionId("xxxxxxx").taskCandidateGroup(group.getId()).singleResult();
if(task != null) {taskService.complete(task.getId());System.out.println("完成Task");
}
监听器
public class MyTaskListener implements TaskListener{public void notify(DelegateTask delegateTask){// delegateTask.getName()// delegateTask.getEventName()}
}
网关
- 排他网关
- 按照所有出口顺序流定义的顺序对它们进行计算
- 选择第一个条件计算为true的顺序流
- 当没有设置条件时,认为顺序流为true
- 并行网关
- fork分支
- 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
- join汇聚
- 所有到达并行网关,在此等待的进入分支
- 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
- fork分支
- 包含网关
- 排他网关和并行网关的结合体
- 事件网关
- 事件网关允许根据事件判断流向
事件
- 启动事件
- 空启动事件
- 中间事件
- 边界事件
- 结束事件
- 错误结束事件
- 中断结束事件
- 取消结束事件
springboot整合
依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version>
</parent>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--flowable工作流依赖--><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.3.0</version></dependency><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.45</version></dependency></dependencies>
application.yml
flowable:async-executor-activate:falsedatabase-schema-update:true
自动部署
- resources/process/xxx.xml
- process下自动部署
手动部署
//@Autowwired
//private RepositoryService repositoryService;Deployment deploy = repositoryService.createDeployment().addClasspathResource("process1.bpmn20.xml")// 关联需要部署的文件.name("请求流程").deploy();
mysql
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -v F:\\docker\\mysql\\conf:/etc/mysql/conf.d -v F:\\docker\\mysql\\data:/var/lib/mysql -v F:\\docker\\mysql\\mysql-file:/var/lib/mysql-files mysql
学习笔记-flowable相关推荐
- Flowable学习笔记(二、BPMN 2.0-基础 )
转载自 Flowable学习笔记(二.BPMN 2.0-基础 ) 1.BPMN简介 业务流程模型和标记法(BPMN, Business Process Model and Notation)是一套图 ...
- Flowable学习笔记(一、入门)
转载自 Flowable学习笔记(一.入门) 一.Flowable简介 1.Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎.Flowable流程引擎可用于部署BP ...
- Java中expecial,RxJava 学习笔记 (一)
作者: 一字马胡 转载标志 [2017-12-13] 更新日志 日期 更新内容 备注 2017-12-13 RxJava学习笔记系列 系列笔记 (一) 2017-12-15 增加系列笔记(二) 201 ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
最新文章
- 顶点(vertexs) 图元(primitives) 片元(fragments片断) 像素(pixels)
- postgresql数据库修改表
- php无极分类非递归_无限极分类算法,对你一定有帮助
- python eve mysql_python连接 MySQ 数据库
- linux下的%zu
- 3 v4 中心节点固定_死磕以太坊源码分析之p2p节点发现
- OpenCV使用Orbbec Astra 3D相机
- python自动上传图片_使用Python实现一个简单的图片上传存储服务
- 都2020年了,这5个java IDE神器你还不知道?
- 信息学奥赛一本通 2066:【例2.3】买图书
- 在线编辑ewebeditor
- EI: 室内微生物组、大气污染物与幼儿园儿童的哮喘、鼻炎和湿疹—一项重复横断面研究...
- 04、docker端口映射的原理及配置方法
- 网易有道词典识别不了adobe打开的pdf
- 纳德拉:没有Excel的世界是无法想象的
- Python编程学习笔记 - 下载数据进行可视化(I)
- win10锁屏壁纸文件夹位置
- Unity让物体跟随鼠标移动
- 【C语言】c语言中的数组和字符串
- iOS彻底下架删除应用
热门文章
- 蒙牛牛根生语录:人不能把金钱带入坟墓,钱能把人带入坟墓。
- win10远程桌面设置计算机,win10设置远程桌面连接的方法_win10如何设置远程桌面连接...
- 模拟地下城与勇士(DNF)的装备强化实现过程
- matplotlib 笔记:修改xlabel,ylabel 字体
- 钢板表面不同种类的缺陷图
- php 表单页面跳转,form表单页面跳转方式提交练习
- 全面分析RHCE7(红帽认证工程师)考试题目之 ----WEB 服务器 篇
- Android后台处理
- LiDAR点云转换到大地坐标系——简单粗标定
- 图解机器学习-Huber损失最小化学习-matlab源码及结果