Other

EBI数据库下载数据

EBI网址链接: https://www.ebi.ac.uk 方法:直接从ncbi上面找到想要下载数据的SRR号然后去EBI里面直接搜索即可得到。  底部就是想要下载的fastq文件了:   然后右键复制链接地址,直接到服务器上面wget -c 加链接地址就可以完成数据的下载。  

slf4j保存日志到数据库

springboot默认支持logback。 碰到的坑,版本问题,导致无法实例化dbconnect类,将版本改为1.2.3即可 默认级别是INFO以上的打印,若改为DEBUG打印的数据量太多太乱。可在root level设置。 另外如果设置url,&符号需要转义。   <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.26</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> 编写logback.xml <?xml version=1.0 encoding=UTF-8 ?> <configuration scan=true> <appender name=STDOUT class=ch.qos.logback.core.ConsoleAppender> <encoder> <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <!-- 将日志写入日志文件 --> <appender name=FILE class=ch.qos.logback.core.FileAppender> <!-- 写到自己项目的 logs.test.log--> <!-- <file>${catalina.base}/logs/test.log</file>--> <file>../logs/test.log</file> <append>true</append><!-- 日志追加 --> <encoder> <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <!-- 将日志写入数据库 --> <appender name=DB class=ch.

浅析JavaScript中的协程、进程如何切换线程的机制、线程如何切换协程的机制、协程的体现(生成器函数)、协程如何实现异步和非阻塞以及为什么要使用生成器+Promise组合

一、使用游戏来理解协程的概念 如果你还在想办法理解协程是什么,那么就让我们玩一玩分手厨房。分手厨房(overcooked),是一款多人烹饪游戏,玩家需要在特定的时间内做出尽可能多的订单。协程 (coroutine)有些人花了很多时间并不一定能理解它,而游戏,却很容易理解。 1、如何玩?先让我们来看看分手厨房的玩法。 玩家们分别控制着带厨师帽的小人,没有厨师帽的是一些NPC(no player character),如上图,我们一共有四个玩家,对应着四个厨师。 游戏开始后,左上角会不停地出现订单,而玩家们通过不停地完成这些订单得分。 时间截止后,分数达到一定,即可进入下一关。 (1)每个订单会标明需要什么材料,比如灰色的是蘑菇,红色的代表西红柿,棕色的是洋葱等 (2)每个订单也标注着自己的制作流程,比如先把切碎西红柿,接着放在灶台上煮,当煮好后,将菜盛到盘子里递给顾客 现在我们已经学会了怎么玩分手厨房,但是要怎么样才进入下一关呢?每一关有积分要求,制作完成的订单越多,得分越多,也就可以通关。 那么怎么样才能制作更多的订单呢?小伙伴要分工明确,并且密切地配合,快马加鞭地做菜。比如同学小张负责切菜,拿食材,同学小丁负责煮,上菜等等,很多时候能者还要多劳。 实际操作就会发现简单的规则,但是操作和配合却很难控制。长时间不能完成的订单就会销毁(可能顾客等不及退单了),然后被扣分。食物煮的太久就会着火,着火就要救火。两个人走位不对就会撞在一起,而且容易冲突起来,该拿的食材没有拿。 这些困难对应着协程的理解,可实际上理解协程很简单,因为你只需要明白订单本身就可以了。 2、协程是什么?  协程可以让计算机程序在IO密集型的场景下,支持更多的请求,而且比多线程的方式,节省更多地资源,性能更优。 那什么是协程呢?维基百科是这么定义的: 协程是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。 定义里面的关键词是协作式,挂起和恢复。是不是有点难理解?实际上它们就真真切切地存在分手厨房里面 (1)协作式,玩家们不停地协作制作订单 (2)挂起,当食材切好,放在锅里煮着的时候,这个订单就被“挂起”了 (3)当菜煮好的时候,你就去盛它,这个订单就被恢复了 但是协程比分手厨房奇妙的地方在于,站在前人的肩膀上,我们不用像游戏里的小人一样忙手忙手,不知所措,只需编写订单,计算机就会充当游戏里的小人们把订单完成得漂漂亮亮的。 这些订单就是我们的代码,但是它们又不同于常见的代码,它们是借助于async、await构造的协程coroutine,看起来就像是同步的代码,但是计算机会用异步的方式去执行。 3、异步是什么? 类比分手厨房,订单本身是同步编写的:先切,后煮,上菜。而订单的实际制作是异步的方式: (1)当出现一个订单的时候,我们有空的时候,就会去拿食材,然后切菜。 (2)但是如果其他菜已经做好了,我们就会放下当前的订单,去处理其他的订单。 所以订单们不是从一开始制作,不停地烹饪,直到一个订单完成,才去制作其他订单,而是中间穿插了多个不同订单的制作。这就是异步方式地烹饪菜肴。 所以异步地执行是指做事情仍按照顺序,但是并不要求顺序在时间上相连,只要按照逻辑的顺序即可。这些代码看起来跟同步方式执行的代码没有区别,所以叫用同步编写的代码。 二、进程、线程与协程  协程和线程对比起来更容易理解,因为他俩实在太像了。 1、线程(英语thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 2、那么什么是进程呢? 进程是程序运行的一个实例。一个程序是静态的二进制文件,是没有灵魂的,当我们启动程序时就会开启一个进程,这个时候操作系统开始读取程序的二进制文件,并且向系统申请一些资源。 简言之,进程就是一个程序运行的时候系统环境变量和用到的资源以及本身代码的集合,其特点是每个 CPU 核心任何时间内仅能运行一项进程,即同一时刻执行的进程数不会超过核心数,这对支持更高并发是个阻碍,并且为了解决进程阻塞的问题,操作系统遍引入了更轻量的线程。 线程是操作系统能够进行运算调度的最小单位。可以这么理解: 在进程这个大圈子中,存在着各种资源: 在没有线程时,这些资源全部由一个可执行代码调配,这有点像单线程进程。 当引入线程之后,一个进程下可以有很多线程,相当于一个可执行代码被分成了很多段,这些片段可以单独执行,并且使用所在进程内的资源。 3、时间片轮转 当然,要使一个应用程序完整运行起来就必须要把这些细分的线程全都执行起来,于是便需要时间片轮转。 操作系统为每一个线程分配 CPU 执行时间(通常为几百毫秒),当运行这个线程的时间超过分配的执行时间时,系统会强制 CPU 去执行下一个等待的线程(补充一下,线程和进程都是有状态的,这里这个正在”等待“的线程应该是”中断“状态),如此快速的不断切换线程便实现了并发。同时程序运行的时候也只会出现线程阻塞,而不是整个进程阻塞,如此便解决了上面的问题。 4、并发是指一段时间内执行多个程序(线程算是一个进程的子程序) 5、协程 线程是为了解决阻塞和并发的问题,在一段时间内执行更多的程序,类似的,协程也是为了在一段时间运行更多的“程序”(应该说是函数)并且避免线程阻塞。有了之前的铺垫,类比起来讲协程就很容易了。 线程和协程解决的并发问题不是一个问题:线程是为了让操作系统并发运行程序,以达到“同时”(实际是时间片轮转 - 交替执行)运行更多程序的目的,而协程是为了让一个线程内的程序并发服务更多内容。 这里不太好解释,一个直观的例子就是一个单线程的服务器程序同时服务多个用户,如何做到服务更多用户?想想线程是怎么来的,我们只需要把这个线程中的程序继续细分,然后像时间片轮转一样不断的去执行这些细分的“子程序”。即使一个这样的“子程序”执行发生阻塞,也不会导致整个线程阻塞,在这个“子程序”阻塞的时候切换到其他“子程序”继续服务,既解决了阻塞的问题,也实现了并发。大概理解了吧,协程就是线程中可以交替运行的代码片段。 线程切换是由操作系统的时间片轮转控制的,而协程是程序自己实现的,让协程不断轮流执行,所以实现协程还必须要有一个类似于时间片的结构。 不同于线程的时间片切换,协程的切换不是按照时间来算的,而是按照代码既定分配,就是说代码运行到这一行才启动协程,协程是可以由我们程序员自己操控的。 三、es6生成器函数就是协程的体现 1、协程如何展现? 在 JavaScript 中,协程是怎样的呢?其实 es6 里的生成器函数就是协程的展现。协程,就是一个生成器,生成器本身是一个函数,也就是说在 JavaScript 中协程是由一个生成器函数实现的。

mysql-索引-Index

一、索引:Index: 1、命名规范:首单词字母小写第二单词开始每个单词首字母大写; 2、mysql:查询方面主要两种方式:全盘扫描、按照索引查询 3、索引排序:mysql数据库中索引需要排序,数据结构是:B-Tree 数据结构; 遵循左小右大原则存放,采用中序遍历方式遍历 4、索引作用:为缩小扫描范围而存在的机制。(缩小扫描区间) 是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制;  一张表的一个字段可以添加一个索引,多个字段联合起来也可以添加索引 5、索引实现原理:主键,以及unique 字段上都会自动添加索引的! 二、索引:什么条件下,我们会考虑给字段添加索引 条件1:数据量庞大(这个需要测试,每一个硬件环境不同) 条件2:该字段经常出现在where后面,以条件形式存在, 也就是这个字段经常被扫描。 条件3:该字段很少DML(增删改查:insert、delete、update)操作,(因为DML之后索引需要重新排序) 建议不要随意添加索引,索引是需要随时维护,太多的话反而会降低系统性能,建议通过unique约束字段进行,查询效率也是比较高的; 三、索引:Index 创建: 创建索引:create index emp_ename_index on emp(ename); 删除索引:drop index emp_ename_index on emp; 在mysql中如何查看一个字段是否使用了索引? explain select * from emp where ename = 'KING';  四、索引失效:模糊查询、使用关键字or(两边条件字段都有索引不会失效)、复合索引、索引字段参加运算 1、模糊查询:ename上即使添加索引也不会走索引,原因是模糊匹配当中以“%”开始,尽量避免模糊查询时使用%开始;  失效语句:select *from emp where ename like '%T'; 2、失效第二种情况: 使用or 的时候会失效,如果使用or那么要求or两边的条件字段都要有; 索引,才会使用索引。  失效语句: explain select * from emp where ename ='KING'or job = 'MANAGER;' 3、失效的第三种情况: 使用复合索引,没有使用左侧的列查找,索引失效;查询时使用左侧列查询不会失效。使用右侧列查询失效 语句:create index emp_job_sal_index on emp (job(左侧列),sal(右侧列)); 左侧列查询不会失效:explain select * from emp where job = 'MANAGER'; 右侧列查询失效: explain select *from emp where sal = 800;  explain select *from emp where sal = 800; 4、where中索引列字段(sal+1)参加运算,索引失效, 在where当中索引列使用了函数

windows批处理命令记录

批处理是一种简化的脚本语言,也称作宏。它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的命令解释器(通常是COMMAND. COM或者CMD.EXE)解释运行。类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名。批处理语法中是不区分大小写。 REM 在批处理文件或 CONFIG.SYS 里加上注解或说明。REM [comment] ECHO 显示消息,或者启用或关闭命令回显。ECHO [ON | OFF] 设置为OFF后不显示注释信息和不显示命令ECHO [message]若要显示当前回显设置,请键入不带参数的 ECHO。 PS:echo off 还是会显示这一行命令,若是执行 @echo off 就不会显示 PAUSE 暂停批处理程序,并显示以下消息:请按任意键继续. . . SET 显示、设置或删除 cmd.exe 环境变量。SET [variable=[string]]variable 指定环境变量名。string 指定要指派给变量的一系列字符串。要显示当前环境变量,键入不带参数的 SET。 如果命令扩展被启用,SET 会如下改变:可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配SET 命令已使用的名称的所有变量的值。例如:SET P会显示所有以字母 P 打头的变量如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL设置成 1。SET 命令不允许变量名含有等号。 在 SET 命令中添加了两个新命令行开关:SET /A expressionSET /P variable=[promptString] set str=hello world 设置一个字符串变量,若是字符串中含特殊字符,用双引号包含:set str=Bat&Cmdset /a a=1 设置一个整数类型的变量,不能设置浮点数,也可以定义多个:set /a a=1,b=2set /p name=请输入名称: 设置一个用户输入的值PS:引用变量值用%包含:echo %a%

MongoDB数据库

MongoDB数据库 查询 排序 mongo.find({}).sort('字段', -1) 更新 插入 删除

shell脚本循环试题

1.计算从1到100所有整数的和 #!/bin/bash a=0 for i in {1..100} #1到100 #每次循环变量i的值也为循环次数 do a=$[ $a + $i ] #每次循环变量重新赋值给变量a done echo (1+..100)的和是$a 2.提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和 #!/bin/bash a=0 read -p 请输入一个小于100的整数 c for l in `seq $c` #seq 有打印数字的功能默认以1开始 do let a=$a+$l #每次循环变量重新赋值给变量a done echo 你需要的整数和是$a 3.求从1到100所有整数的偶数和、奇数和 方式1 #!/bin/bash a=0 b=0 for i in {1..50} do let b+=2 #每次循环自加2 a=$[ $a + $b ] done echo (1+..100)的偶数和是$a #!/bin/bash a=0 b=1 for i in {1.

nginx-优化1-httpd-tools测试两万并发

一,不同CPU内核绑定不同nginx进程 worker_processes 2; #修改 worker_cpu_affinity 0001 0010; #修改 worker_rlimit_nofile 65535; #修改 events { worker_connections 65535; #修改 } (1)为什么要绑定nginx进程到不同的CPU上 CPU调度的时候两个进程有可能被分配达到一个CPU上,从而会导致一个非常的空闲,一个非常的忙,无法充分发挥CPU的运算能力 (2)如何分配不同的nginx进程给不同的CPU处理 [root@centos7 ~]# cat /usr/local/nginx/conf/nginx.conf user nginx; worker_processes 2; #IO密集型:调整worker进程数 = CPU的核心数*2 worker_cpu_affinity 0001 0010; #修改 events { worker_connections 1024; #默认,线程能够处理的最大连接数 } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.

mysql-DQL-去重distinct-

1、去除重复记录:distinct 只出现在所有字段的最前方; select distinct job from emp; 2、distinct出现在两个字段前,表示联合起来去重。select distinct job,deptno from emp;  原来数据不会被修改,只是查询结果去掉重复 3、分组函数+distinct联合!案例:统计以下工作岗位数量? select count(distinct job) from emp;