线程与进程

1、一个程序至少要有进程,一个进程至少要有一个线程。

2、进程:资源分配的最小独立单元,进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
3、线程:进程下的一个分支,是进程的实体,是CPU调度和分派的基本单元,它是比进程更小的能独立运行的基本单位,线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源(程序计数器、一组寄存器、栈),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。

4、进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

5、进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

6、对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

Git常用命令

git常用命令

git clone git@139.224.190.138:/var/git/pro.git #从远程版本库克隆到本地
git pull         #从远程版本库获取更新到本地
git config --global user.email "server@taorong123.com" #推送远程必备
git config --global user.name "server" # 推送到版本库必备
git commit -m '---' #提交到本地版本缓存
git push         #推送到版本库
git fetch        #拉取分支信息
git branch       #查看当前分支和所有分支
git branch -a    #查看远程的分支情况
git branch -D br #删除分支
git push origin :br (origin 后面有空格) #删除远程分支
git checkout release1.6 #切换分支到release1.6
git checkout -b release2.0 origin/release2.0  #拉取远程分支到本地
git log          #查看log
git reset HEAD~2 #版本混滚
git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除
git reset --hard HEAD~3:将最近3次的提交回滚

centos服务器下搭建git仓库

yum install git #安装git
git --version #检查是否安装完成
cd /var #切换到欲创建git服务器仓库的目录
mkdir git #创建git仓库文件夹
cd git
pwd
git init --bare pro.git    #实例化一个项目pro的空仓库
useradd git #添加git用户和其密码
passwd git
chown -R git:git pro.git
客户端测试: git clone git@139.224.190.138:/var/git/pro.git

【远程代码库回滚】:

  这个是重点要说的内容,过程比本地回滚要复杂
  应用场景:自动部署系统发布后发现问题,需要回滚到某一个commit,再重新发布
  原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支
  操作步骤:
      1、git checkout the_branch
      2、git pull
      3、git branch the_branch_backup //备份一下这个分支当前的情况
      4、git reset --hard the_commit_id //把the_branch本地回滚到the_commit_id
      5、git push origin :the_branch //删除远程 the_branch
      6、git push origin the_branch //用回滚后的本地分支重新建立远程分支
      7、git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支
 如果使用了gerrit做远程代码中心库和code review平台,需要确保操作git的用户具备分支的push权限,并且选择Force Push选项(在push权限设置里有这个选项,另外,gerrit中心库是个bare库,将HEAD默认指向了master,因此master分支是不能进行删除操作的,最好不要选择删除master分支的策略,换用其他分支

【拉取远程分支覆盖本地】

 git fetch --all git reset --hard origin/master
 git pull

php字符串章节总结

1:php 字符串基础知识

A;字符串的几种表达方式
  单引号、双引号、heredoc语法结构、nowdoc语法结构(php5.3)
B;双引号到底解析哪些字符?
   •当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。
   •\n , \r , \t , \v , \e , \f , \\ , \$ , \“
   •\[0-7]{1,3}  符合该正则表达式序列的是一个以八进制方式来表达的字符
   •\x[0-9A-Fa-f]{1,2}  符合该正则表达式序列的是一个以十六进制方式来表达的字符
C;底层C语言中怎么表示PHP字符串?
   •字节组成的数组可以用[]或者{}访问某个字符
   •字符串长度可以达到2G(内存)
   •常见函数都是单字节处理方式
   •可以用[]或者{}访问某个字符
   •PHP字符串是二进制安全的
D;写一个函数返回一个字符串的中间一个字符(奇数返回一个,偶数返回两个)
   •string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。
   •也可用花括号访问,比如 $str{42}。数组可以这么访问么?
   •用超出字符串长度的下标写入将会拉长该字符串并以空格填充。
   •非整数类型下标会被转换成整数。非法下标类型会产生一个 E_NOTICE 级别错误

2:串行化的字符串

•大部分的 PHP 值可以转变成 string 来永久保存
•方法一:函数 serialize() 可以实现
•方法二:函数 json_encode ()可以实现
•方法三:函数 var_export($items, true);

3:常用字符串处理函数

 ltrim()          去除左侧多余字符(默认删空格)
 rtrim()          去除右侧多余字符(默认删空格)
*trim()           去除两侧多余字符(默认删空格)
 str_pad()       使用另一个字符串填充字符串为指定长度
*strtolower()    语法: string strtolower(string str),本函数将字符串 str 全部变小写字符串。
*strtoupper()    语法: string strtoupper(string str), 本函数将字符串 str 全部变大写字符串。     
 ucfirst()       将字符串第一个字符改大写,语法: string ucfirst(string str), 本函数返回字符串 str 第一个字的字首字母改成大写。
 ucwords()       将字符串每个字第一个字母改大写, 语法: string ucwords(string str); 本函数返回字符串 str 每个字的字首字母全都改成大写。
 ord(string $string )  返回字符的 ASCII 码值
 chr(int $ascii )      返回指定的字符 
 nl2br           在字符串所有新行之前插入 HTML 换行标记,实现换行输出。
*htmlspecialchars      格式换字串中的html标签
 htmlentities--
*strip_tags      删除html标签函数
 strrev          将字串颠倒返回
*strlen          求字串长度:字母:一个算一个长度,汉字:utf-8编码是每个汉字3个长度,其他是2长度
*mb_strlen(str,"utf-8");获取中文字的长度
 number_format    格式化数字的
*md5             单向加密的(不可逆的(不能解密的))。
 strcmp          整个比较是否相同
 strncmp         指定长度的比较
 strcasecmp      不区分大小写比较
 strnatcmp       按自然顺序比较
 similar_text    模糊比较
*explode         字符串拆分函数
*implode         字符串组合函数
*substr          截取字串 返回值 substr(string string被截字串,int start起始位置[,int length长度])
*mb_substr()     截取指定编码的字串
*strstr          字串查找并截取
 strchr          是上面的strstr的别名找并截取
 strrchr         从后面做字串查找。找并截取
*strpos          寻早一个字符出现位置(从前开始。第三个参数为查找起始位置)
 strrpos         寻早一个字符出现位置(从后面开始找。)
*str_replace(被换字串,换成的字串,原字串,[数量]);字符串替换
 file_get_contents("文件名")     // 获取指定文件的内容        
 file_put_contents("文件名","内容")    //将内容写入(覆盖写)到指定文件中
 file_put_contents("文件名","内容",FILE_APPEND) //将内容写入(追加写)到指定文件中

区块链专业术语

专业术语很重要,所以所有”Fabric”项目用户和开发人员同意我们所说的每个特定术语的含义,举个例子:如什么是链码,因此我们将引导你到术语说明,让你随时可以消除对术语理解的疑虑,当然,如果你愿意的话可以自由的阅读整个文档,非常有启发!

Anchor Peer - 锚节点

  锚节点是通道中能被所有对等节点探测、并能与之进行通信的一种对等节点。通道中的每个成员都有一个(或多个,以防单点故障)锚节点,允许属于不同成员身份的节点来发现通道中存在的其它节点。

Block - 区块

  在一个通道上,(区块是)一组有序交易的集合。区块往往通过密码学手段(Hash值)连接到前导区块。区块是一组有序的交易集合,在通道中经过加密(哈希加密)后与前序区块连接。

Chain - 链

  chain就是block之间以hash连接为结构的交易日志。peer从order service接收交易block,并根据背书策略和并发冲突标记block上的交易是否有效,然后将该block追加到peer文件系统中的hash chain上。

Zhu Jiang:账本的链是一个交易区块经过“哈希连接”结构化的交易日志。对等节点从排序服务收到交易区块,基于背书策略和并发冲突来标注区块的交易为有效或者无效状态,并且将区块追加到对等节点文件系统的哈希链中。

Chaincode - 链码

  链码是一个运行在账本上的软件,它可以对资产进行编码,其中的交易指令(或者叫业务逻辑)也可以用来修改资产。

Channel - 通道

  通道是构建在“Fabric”网络上的私有区块链,实现了数据的隔离和保密。通道特定的账本在通道中是与所有对等节点共享的,并且交易方必须通过该通道的正确验证才能与账本进行交互。通道是由一个“配置块”来定义的。

Commitment - 提交

  一个通道中的每个对等节点都会验证交易的有序区块,然后将区块提交(写或追加)至该通道上账本的各个副本。对等节点也会标记每个区块中的每笔交易的状态是有效或者无效。

Concurrency Control Version Check-并发控制版本检查(CCVC)

  CCVC是保持通道中各对等节点间状态同步的一种方法。对等节点并行的执行交易,在交易提交至账本之前,对等节点会检查交易在执行期间读到的数据是否被修改。如果读取的数据在执行和提交之间被改变,就会引发CCVC冲突,该交易就会在账本中被标记为无效,而且值不会更新到状态数据库中。

Configuration Block - 配置区块

  包含为系统链(排序服务)或通道定义成员和策略的配置数据。对某个通道或整个网络的配置修改(比如,成员离开或加入)都将导致生成一个新的配置区块并追加到适当的链上。这个配置区块会包含创始区块的内容加上增量。

Consensus - 共识

  共识是贯穿整个交易流程的广义术语,其用于产生一个对于排序的同意书和确认构成区块的交易集的正确性。

Current State - 当前状态

  ledger的current state表示其chain交易log中所有key的最新值。peer会将处理过的block中的每个交易对应的修改value提交到ledger的current state,由于current state表示channel所知的所有最新的k-v,所以current state也被称为World State。Chaincode执行交易proposal就是针对的current state。

Dynamic Membership - 动态成员

   Fabric支持动态添加-移除members、peers和ordering服务节点,而不会影响整个网络的操作性。当业务关系调整或因各种原因需添加-移除实体时,Dynamic Membership至关重要。

Endorsement - 背书

   Endorsement 是指一个peer执行一个交易并返回YES-NO给生成交易proposal的client app 的过程。chaincode具有相应的endorsement policies,其中指定了endorsing peer。

Endorsement policy - 背书策略

   Endorsement policy定义了依赖于特定chaincode执行交易的channel上的peer和响应结果(endorsements)的必要组合条件(即返回Yes或No的条件)。Endorsement policy可指定对于某一chaincode,可以对交易背书的最小背书节点数或者最小背书节点百分比。背书策略由背书节点基于应用程序和对抵御不良行为的期望水平来组织管理。在install和instantiate Chaincode(deploy tx)时需要指定背书策略。

Fabric-ca

   Fabric-ca是默认的证书管理组件,它向网络成员及其用户颁发基于PKI的证书。CA为每个成员颁发一个根证书(rootCert),为每个授权用户颁发一个注册证书(eCert),为每个注册证书颁发大量交易证书(tCerts)。

Genesis Block - 初始区块

   Genesis Block是初始化区块链网络或channel的配置区块,也是链上的第一个区块。

Gossip Protocol - Gossip协议

   Gossip数据传输协议有三项功能:1)管理peer发现和channel成员;2)channel上的所有peer间广播账本数据;3)channel上的所有peer间同步账本数据。

Initialize - 初始化

   一个初始化chaincode程序的方法。

Install - 安装

   将chaincode放到peer的文件系统的过程。(译注:即将ChaincodeDeploymentSpec信息存到chaincodeInstallPath-chaincodeName.chainVersion文件中)

Instantiate - 实例化

   启动chaincode容器的过程。(译注:在lccc中将ChaincodeData保存到state中,然后deploy Chaincode并执行Init方法)

Invoke - 调用

   用于调用chaincode内的函数。Chaincode invoke就是一个交易proposal,然后执行模块化的流程(背书、共识、 验证、 提交)。invoke的结构就是一个函数和一个参数数组。

Leading Peer - 主导节点

    每一个Member在其订阅的channel上可以拥有多个peer,其中一个peer会作为channel的leading peer代表该Member与ordering service通信。ordering service将block传递给leading peer,该peer再将此block分发给同一member下的其他peer。

Ledger - 账本

    Ledger是个channel的chain和由channel中每个peer维护的world state。(这个解释有点怪)

Member - 成员

    拥有网络唯一根证书的合法独立实体。像peer节点和app client这样的网络组件会链接到一个Member。

Membership Service Provider - MSP

    MSP是指为client和peer提供证书的系统抽象组件。Client用证书来认证他们的交易;peer用证书认证其交易背书。该接口与系统的交易处理组件密切相关,旨在使已定义的成员身份服务组件以这种方式顺利插入而不会修改系统的交易处理组件的核心。

Membership Services - 成员服务

   成员服务在许可的区块链网络上认证、授权和管理身份。在peer和order中运行的成员服务的代码都会认证和授权区块链操作。它是基于PKI的MSP实现。fabric-ca组件实现了成员服务,来管理身份。特别的,它处理ECert和TCert的颁发和撤销。ECert是长期的身份凭证;TCert是短期的身份凭证,是匿名和不可链接的。

Ordering Service - 排序服务或共识服务

   将交易排序放入block的节点的集合。ordering service独立于peer流程之外,并以先到先得的方式为网络上所有的channel作交易排序。ordering service支持可插拔实现,目前默认实现了SOLO和Kafka。ordering service是整个网络的公用binding,包含与每个Member相关的加密材料。

Peer - 节点

   一个网络实体,维护ledger并运行Chaincode容器来对ledger执行read-write操作。peer由Member拥有和维护。

Policy - 策略

   有背书策略,校验策略,区块提交策略,Chaincode管理策略和网络-通道管理策略。

Proposal - 提案

   一种针对channel中某peer的背书请求。每个proposal要么是Chaincode instantiate要么是Chaincode invoke。

Query - 查询

   对于current state中某个key的value的查询请求。

Software Development Kit - SDK

   SDK为开发人员提供了一个结构化的库环境,用于编写和测试链码应用程序。SDK完全可以通过标准接口实现配置和扩展,像签名的加密算法、日志框架和state存储这样的组件都可以轻松地实现替换。SDK API使用gRPC进行交易处理,成员服务、节点遍历以及事件处理都是据此与fabric通信。目前SDK支持Node.js、Java和Python。

State Database - stateDB

    为了从Chaincode中高效的读写,Current state 数据存储在stateDB中,包括levelDB和couchDB。

System Chain - 系统链

    包含在系统级定义网络的配置区块。系统链存在于ordering service中,与channel类似,具有包含以下信息的初始配置:MSP信息、策略和信息配置。对整个网络的任何变化(例如新的Org加入或者添加新的Ordering节点)将导致新的配置区块被添加到系统链。系统链可看做是一个channel或一组channel的公用binding。例如,金融机构的集合可以形成一个财团(以system chain表示),然后根据其相同或不同的业务创建channel。

Transaction - 交易

    Chaincode的invoke或instantiate操作。Invoke是从ledger中请求read-write set;Instantiate是请求在peer上启动Chaincode容器。

Http头信息总结

总结下HTTP协议的头部字段。

1、 Accept:告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。

2、 Accept-Charset:浏览器申明自己接收的字符集 Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate) Accept-Language:浏览器申明自己接收的语言 语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。

3、 Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。

4、 Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。

5、 Authorization:当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。

6、 Cache-Control:请求:no-cache(不要缓存的实体,要求现在从WEB服务器去取) max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象) max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值) min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象) 响应:public(可以用 Cached 内容回应任何用户) private(只能用缓存内容回应先前请求该内容的那个用户) no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端) max-age:(本响应包含的对象的过期时间) ALL: no-store(不允许缓存)

7、 Connection:请求:close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。 keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。 响应:close(连接已经关闭)。keepalive(连接保持着,在等待本次连接的后续请求)。 Keep-Alive:如果浏览器请求保持连接,则该头部表明希望WEB服务器保持连接多长时间(秒)。例如:Keep-Alive:300

8、 Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip

9、Content-Language:WEB服务器告诉浏览器自己响应的对象的语言。

10、Content-Length:WEB服务器告诉浏览器自己响应的对象的长度。例如:Content-Length: 26012

11、Content-Range: WEB服务器表明该响应包含的部分对象为整个对象的哪个部分。例如:Content-Range:bytes21010-47021/47022

12、Content-Type: WEB服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml

13、ETag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个 html 文件,如果被修改了,其 Etag 也会别修改,所以ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB 服务器判断一个对象是否改变了。比如前一次请求某个 html 文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得的 ETag 值发送给WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag 进行对比,然后就知道这个文件有没有改变了。

14、 Expired:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是 HTTP/1.0 的头部。例如:Expires:Sat, 23 May 2009 10:02:12 GMT

15、 Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。例如:Host:rss.sina.com.cn

16、 If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。

17、 If-None-Match:如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。

18、 If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器 该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT

19、 If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。

20、 If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。

21、 Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT

22、 Location:WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。例如:Location:https://i0.sinaimg.cn/dy/deco/2008/0528/sinahome_0803_ws_005_text_0.gif

23、 Pramga:主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。例如:Pragma:no-cache

24、 Proxy-Authenticate: 代理服务器响应浏览器,要求其提供代理身份验证信息。Proxy-Authorization:浏览器响应代理服务器的身份验证请求,提供自己的身份信息。

25、 Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546-

26、 Referer:浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL。例如:Referer:https://www.sina.com/

27、 Server: WEB 服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61 (Unix)

28、 User-Agent: 浏览器表明自己的身份(是哪种浏览器)。例如:User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2、0、0、14

29、 Transfer-Encoding: WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。例如:Transfer-Encoding: chunked

30、 Vary:WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:Content- Encoding: gzip; Vary: Content-Encoding那么 Cache 服务器会分析后续请求消息的头部,检查其 Accept-Encoding,是否跟先前响应的 Vary 头部值一致,即是否使用相同的内容编码方法,这样就可以防止 Cache 服务器用自己 Cache 里面压缩后的实体响应给不具备解压能力的浏览器。例如:Vary:Accept-Encoding

31、 Via:列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添 加 Via 头部,并填上自己的相关信息,当下一个代理服务器收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via 头部,并把自己的相关信息加到后面,以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由。例如:Via:1.0 236.D0707195.sina.com.cn:80 (squid/2.6.STABLE13)