Login shell 和 Non-Login shell 的区别

Linux Shell Login shell 和 Non-Login shell 的区别 Difference between Login shell and Non login shell shell 程序,例如 Bash,使用了一系列启动脚本去创建环境。每一个脚本有独特的作用,对登陆环境有不同的影响。后续执行的脚本的可以覆盖先前执行的脚本产生的值。 对于登录Shell和非登录Shell,启动配置有所不同。 Login shells Non login shells Login shells 使用 /bin/login 通过读取 /etc/passwd 文件成功登录后,将启动 Login shell。登录 shell 程序是在登录会话时在用户 ID 下执行的第一个过程。Login 进程告诉 shell 程序遵循以下约定:传递参数0(通常是 shell 程序可执行文件的名称,例如 bash),并带有“-”字符。例如,对于Bash shell,它将是-bash。 当 bash 被调用为 Login shell: -> 登陆进程 调用 /etc/profile -> /etc/profile 调用 /etc/profile.d/ 下的脚本 -> 登陆进程 调用 ~/.bash_profile -> ~/.bash_profile 调用 ~/.bashrc -> ~/.bashrc 调用 /etc/bashrc Login shell 出现包括以下情况: ...

Lotus CLI 以及 Pond GUI 的使用

[[IPFS]] [[Filecoin]] [[Lotus]] Lotus CLI 以及 Pond GUI 的使用 说明 Lotus 是基于 IPFS 技术上的激励层 FileCoin 的一种实现,它区别于 go-filecoin 是一种不同的实现,但是底层的架构极为相似。 Lotus CLI 是实现 Lotus 的命令行界面工具。 Pond GUI 是基于 Lotus 的图形用户界面。 Lotus 的安装 需要依赖 go (1.13 or higher) gcc (7.4.0 or higher) git (version 2 or higher) bzr (some go dependency needs this) jq pkg-config opencl-icd-loader opencl driver (like nvidia-opencl on arch) (for GPU acceleration) opencl-headers (build) rustup (proofs build) llvm (proofs build) clang (proofs build) 下载 $ git clone https://github.com/filecoin-project/lotus.git $ cd lotus/ 安装 $ make clean all $ sudo make install 安装过程会出现不少问题,其中一个就是没有 rustup 工具。可以参考 Rust 版本管理工具: rustup。安装完 rustup 可以配置 Rust Crates 镜像,以加快安装编译的速度。 ...

Lotus daemon 全过程

[[Lotus]] Lotus daemon 全过程 lotus daemon 会生成一个守护进程,那么它在这个过程中做了哪些事? 大致过程 通过命令行读取参数 拿到指定的 repo 或者使用默认的 repo(就是一个路径值),计作 $PATH,根据它进行服务初始化的操作 根据是否存在 $PATH/datastore,判断是否已经运行过服务,如果运行过就报警告,否则创建 $PATH 目录 创建默认的 $PATH/config.toml 文件 创建 $PATH/keystore 文件夹 根据 build/proof-parameters.json/parameters.json 里的数据对 /var/tmp/filecoin-proof-parameters/ 的证明参数文件进行校验 如果制定了 genesis 参数,则使用,否则从 build/genesis/devnet.car 生成,生成块逻辑比较复杂,如果指定了 lotus-make-random-genesis 和 genesis-presealed-sectors 参数,则可以通过逻辑生成一个,逻辑比较复杂 然后就是创建一个逻辑节点,先声明了一个接口,定为 api 通过 node.New 生成一个完整节点,第一步先把 子系统的api 和主节点的 api 绑定在一起,具体实现依赖的是子系统 根据节点类型,会更新一些配置项,配置项分为:调用,模块,会有非常多的模块,比较重要的有 SetApiEndpointKey 通过 serveRPC 返回一个 rpc 服务

Lotus send 全过程

Lotus Lotus send 全过程 lotus send 可以在钱包间转账。 大致过程 获得操作句柄(拿到api) 计算对方钱包地址 计算转账量 使用api的默认钱包地址或者指定的钱包地址 将转账信息记录到 mpool 里 获得操作句柄 通过 repo 参数(默认为~/.lotus),找到一个存储数据的路径,记为 PATH 从 $PATH/api 拿到 api 端点信息,通过 multiaddr.NewMultiaddr 转换为 byte 数组, 记为 apiInfo apiInfo 通过 manet.DialArgs 解析出协议和 Linux 网络地址 从 $PATH/token 拿到 token 信息,并加在默认 http.header 里,至此已经拿到了 网络地址 和 带 token 的 header 再根据拿到的两个数据通过一次 NewFullNodeRPC 处理,拿到操作句柄(暂时是一个struct),网络关闭函数 计算对方钱包位置 从命令行拿到原始的数据,记为 wls 对 wls 进行解码,根据 wls 的第二位判断协议类型,从第三位到结尾则是原始数据,记为 raw,进入下一步解码 使用一个自定义的 encoding 对 raw 进行解密,然后拆分成 payload 和 cksm 使用 ValidateChecksum 检测 payload 是否有效 通过 protocol 和 payload 创建新的地址,此时就拿到了钱包地址 计算转账量 这个纯粹就是通过字符串进行数学运算,牵扯到的过程还挺复杂的,主要依赖了 math/big/Rat 结构体,它表示任意精度的商 a / b 比较重要的一步转换是通过创建一个 big.NewRat(build.FilecoinPrecision, 1),然后对转账量进行一个处理,简单来说就是放大 10^18 次方(针对十进制),并且使b为1 使用api的默认钱包地址或者指定的钱包地址 如果指定了 source 信息,则类似 计算对方钱包位置 一样计算一个钱包地址 如果没有指定,则使用 api 的 WalletDefaultAddress 方法实现 通过 ~/.lotus/keystore 里的文件进行查询 将转账信息记录到 mpool 里 构建一个 message 结构,目前 GasLimit 和 GasPrice 都是固定的 使用 api 的 MpoolPushMessage 方法实现 通过 message 进行处理,判断余额是否足够传递 通过 mp.getNonceLocked 拿到 nonce 将 nonce 加入到 message里,对 message 的每一项数据根据类型进行不同处理,将结果写入到buffer,记为data,然后根据data生成一个cid,这两个参数通过 block.NewBlockWithCid 获取新块 通过 message 的 from address 和 cid 信息,创建签名文件 通过 PubSubPublish 进行数据传递 数据传递过程

m.2 接口 SSD

Hardware m.2 接口 SSD M.2接口(原NGFF,Next Generation Form Factor)是Intel主推的一种替代mSATA的新接口规范。最初,Intel主要是为了超极本的存储需求才急切推出这种新的接口标准。 m.2 SSD 的规格 与 mSATA SSD 类似,M.2 SSD 也不带金属外壳。主要有 2242、2260、2280 三种规格,为了划分不同长度的产品而定的。长度不同,意味着容量就不同。因为长度越长,可布置的闪存颗粒就越多,容量也就越大。以 M.2 2242 为例,22 是宽度 22mm,42 是长度 42mm,2260 与 2280 同为此理。至于M.2 SSD的厚度,单面布置芯片厚度2.75mm,双面厚度3.85mm,比mSATA还要薄。 m.2 SSD 接口的分类 总体可以分为 M key 和 B key,以及混合的 B & M key。 下表是按照 SSD 上的接口进行区分。主板上只有 B key 和 M key 两种,B & M key SSD 插在主板的 M key 上。 类别 别名 分辨 协议 速率 M key m.2 socket3 SSD 上有一个缺口,且缺口右侧为 6 pin PCI-E 3.0 * 4 2300 MB/s B key m.2 socket2 SSD 上有一个缺口,且缺口左侧为 5 pin SATA 3.0 500 MB/s B & M key - SSD 上有两个缺口,第一个缺口左侧为 5 pin,第二个缺口右侧为 6 pin SATA 3.0/PCI-E 3.0 * 2 700 MB/s m.2 SSD 的兼容问题 有的主板仅支持 PCI-E 通道,不支持 SATA 通道,像华硕 Z97-A 主板。如果将走 SATA 通道的 M.2 SSD 接在华硕 Z97-A 上将无法被识别。有的则兼容 SATA 与 PCI-E 通道,如技嘉的 Z97X-UD3H。 ...

Make 命令使用

Linux Make 命令使用 make 顾名思义就是用于制作的工具,可以制作普通文件,也可以制作二进制文件,也就是说,它可以组织程序的编译过程,得到输出的文件。 基础概念就是:make 命令会查找当前目录下的 Makefile 文件,并根据该文件的指示一步步的去操作,最后创建目标文件。 具体的用法可以参照: Make 的概念 Makefile 文件的格式 Makefile 文件的语法 Makefile 的实例 总体来说,make 本身是不难的,但是基于 makefile 内部的操作是复杂的。makefile 的一大难点是自动变量。

marshmallow 库的简单学习

[Python [[Python Module]] marshmallow 库的简单学习 marshmallow 是一个简单序列化/反序列化模块。 它可以很轻松的做到 object-->dict objects-->list 等序列化操作,同时经过添加简单的函数做到 dict-->object list-->objects 等反序列化操作。 同时,它对于数据的校检非常友好,有多种校检方式,同时相对于 Schema 库,它可以更有针对性的校检数据,序列化数据等(例如只取某些数据,只校检某些数据等)。 一、简单说明 marshmallow 库非常易于使用,下面将以实际的代码演示如何使用这个库。 先明确下使用流程。 创建类–>创建 Schema 类–>(创建 ValidSchema 类) 序列化<—>反序列化 二、创建Schema类 创建基础的类 # -*- coding:utf-8 -*- from datetime import date from marshmallow import Schema, fields, pprint, post_load from marshmallow import ValidationError, validate, validates class Artist(object): """基础艺术家类""" def __init__(self, name): self.name = name class Album(object): """基础专辑类""" def __init__(self, title, release_date, artist): self.title = title self.release_date = release_date self.artist = artist 根据自己的类创建对应的 Schema 类,继承自 marshmallow 的 Schema 类。 ...

MySQL 内置函数

database [[MySQL]] MySQL 内置函数 字符串函数 查看字符的 ascii 码值 ascii(str),str 是空串时返回 0 select ascii('a'); 查看 ascii 码值对应的字符 char(数字) select char(97); 拼接字符串 concat(str1,str2…) select concat(12,34,'ab'); 包含字符个数 length(str) select length('abc'); 截取字符串 -- left(str,len) 返回字符串 str 的左端 len 个字符 -- right(str,len) 返回字符串 str 的右端 len 个字符 -- substring(str,pos,len) 返回字符串 str 的位置 pos 起 len 个字符 select substring('abc123',2,3); 去除空格 -- ltrim(str) 返回删除了左空格的字符串 str -- rtrim(str) 返回删除了右空格的字符串 str -- trim([方向 remstr from str) 返回从某侧删除 remstr 后的字符串 str,方向词包括 both、leading、trailing,表示两侧、左、右 select trim(' bar '); select trim(leading 'x' FROM 'xxxbarxxx'); select trim(both 'x' FROM 'xxxbarxxx'); select trim(trailing 'x' FROM 'xxxbarxxx'); 返回由 n 个空格字符组成的一个字符串 space(n) select space(10); 替换字符串 replace(str,from_str,to_str) select replace('abc123','123','def'); 大小写转换,函数如下 -- lower(str) -- upper(str) select lower('aBcD'); 数字函数 求绝对值 abs(n) select abs(-32); 求 m 除以 n 的余数 mod(m, n),同运算符 % select mod(10,3); select 10%3; 地板除 floor(n),表示不大于 n 的最大整数 select floor(2.3); 天花板 ceiling(n),表示不小于 n 的最大整数 select ceiling(2.3); 求四舍五入值 round(n,d),n 表示原数,d 表示小数位置,默认为 0 select round(1.6); 求 x 的 y 次幂 pow(x,y) select pow(2,3); 获取圆周率 PI() select PI(); 随机数 rand(),值为 0-1.0 的浮点数 select rand(); 时间日期函数 获取子值,语法如下 -- year(date)返回date的年份(范围在1000到9999) -- month(date)返回date中的月份数值 -- day(date)返回date中的日期数值 -- hour(time)返回time的小时数(范围是0到23) -- minute(time)返回time的分钟数(范围是0到59) -- second(time)返回time的秒数(范围是0到59) select year('2016-12-21'); 日期计算,使用 +- 运算符,数字后面的关键字为 year、month、day、hour、minute、second select '2016-12-21'+interval 1 day; 日期格式化 date_format(date,format),format 参数可用的值如下 -- 获取年%Y,返回4位的整数 -- 获取年%y,返回2位的整数 -- 获取月%m,值为1-12的整数 -- 获取日%d,返回整数 -- 获取时%H,值为0-23的整数 -- 获取时%h,值为1-12的整数 -- 获取分%i,值为0-59的整数 -- 获取秒%s,值为0-59的整数 select date_format('2016-12-21','%Y %m %d'); 当前日期 current_date() select current_date(); 当前时间 current_time() select current_time(); 当前日期时间 now() select now();

MySQL 数据库简介

database MySQL MySQL 数据库简介 mysql 数据库,是当前应用非常广泛的一款关系型数据库。 知识点包括: 数据库与表的创建、删除 字段的类型、约束 关系的存储 数据行的增删改查 数据行的查找(重点) 视图、事务、索引 与 Python 交互 E-R 模型 当前物理的数据库都是按照 E-R 模型进行设计的 E表示entry,实体 R表示relationship,关系 一个实体转换成数据库中的一个表 关系描述两个实体之间的对应规则,包括: 1.一对一 2.一对多 3.多对多 关系转换为数据库表中的一个列*在关系型数据库中一行就是一个对象 三范式 经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式 第一范式(1NF):列不可拆分 第二范式(2NF):唯一标识 第三范式(3NF):引用主键 后一个范式建立在前一个范式的基础上 数据完整性 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束 字段类型 数字:int,decimal 字符串:char,varchar,text 日期:datetime 布尔:bit 约束 主键:primary key 非空:not null 唯一:unique 默认:default 外键:foreign key 自动增长:auto_increment

MySQL 的 JSON 类型

database MySQL MySQL 的 JSON 类型 之前的开发经验,让我了解到,在对表的设计时,可以预留一个 JSON 类型的字段,这样可以实现一定程度的扩展,我一开始有些反感,因为这可能滥用。例如说,建表的时候考虑不再那么周全,全部放在 attr 字段里,虽然后期实现没问题,但如果这样为什么不直接用 NoSQL,想怎么存就怎么存。 使用 JSON 类型存储,然后在代码里使用 ORM 的技术,也很容易读取。最近我遇到了一个需求,需要将监控数据以表格的形式展示,通用的 TSDB (使用 Grafana)很难渲染成表格,就决定使用 MySQL 实现。但是监控项那么多,可以考虑使用 JSON 类型存储。 设置 JSON 字段 mysql> CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(20) , lastlogininfo JSON); Query OK, 0 rows affected (0.27 sec) 设置类型为 JSON 即可。 插入 JSON 数据 字符串法 mysql> INSERT INTO user VALUES(1 ,"lucy",'{"time":"2015-01-01 13:00:00","ip":"192.168.1.1","result":"fail"}'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO user VALUES(1 ,"lucy",'{"time":"2015-01-01 13:00:00","ip":"192.168.1.1","result":"fail}'); ERROR 3140 (22032): Invalid JSON text: "Missing a closing quotation mark in string." at position 63 in value for column 'user.lastlogininfo'. 只要字符串符合 JSON 语法就可以直接插入,否则会报 Invalid JSON text 错误。 ...