raspberry pi, gpio, golang

raspberry pi, gpio, golang https://github.com/stianeikeland/go-rpio package main import ( "fmt" "github.com/stianeikeland/go-rpio/v4" "time" ) func main() { err := rpio.Open() if err != nil { fmt.Println(err) return } pin := rpio.Pin(17) pin.Low() time.Sleep(5 * time.Second) pin.High() }

2019-07-13 · 1 min · 36 words · -

USB数据线

USB数据线 编号 定义 颜色识别 1 VBUS Red (红色) 2 D- White (白色) 3 D+ Green (绿色) 4 GND Black (黑色)

2019-07-13 · 1 min · 20 words · -

raspberry pi gpio

raspberry pi gpio 继电器: 树莓派的GPIO口是3.3V的,你需要把它转化成5V才能进行控制 Raspberry Pi 的GPIO接口电路 http://blog.oa25.org/?p=472&embed=true#?secret=57KOUtczxY https://www.kidscoding8.com/47249.html #使GPIO17从内核空间暴露到用户空间中 sudo echo 17 > /sys/class/gpio/export #设置GPIO17为输出模式 sudo echo out > /sys/class/gpio/gpio17/direction #向value文件中输入1,GPIO输出高电平,LED点亮 sudo echo 1 > /sys/class/gpio/gpio17/value #向value文件中输入0,GPIO输出低电平,LED熄灭 sudo echo 0 > /sys/class/gpio/gpio17/value #注销GPIO17接口 sudo echo 17 > /sys/class/gpio/unexport sudo vim ledonoff.sh echo $1 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio$1/direction echo 1 > /sys/class/gpio/gpio$1/value sleep 5 #延时5秒 echo 0 > /sys/class/gpio/gpio$1/value echo $1 > /sys/class/gpio/unexport sudo ./ledonoff.sh 17 https://zhuanlan.zhihu.com/p/40594358 https://www.huanxiangke.com/index.php/blog/post/voice-control-to-transform-ordinary-desk-lamp

2019-07-09 · 1 min · 71 words · -

fzf command

fzf command # 可以直接运行 fzf # 查找当前目录和子目录的文件 # exact match fzf -e find . -type f | fzf https://github.com/junegunn/fzf

2019-07-08 · 1 min · 19 words · -

linux 查看用户的UID和GID

linux 查看用户的 UID 和 GID 方法一: 使用 id 命令 使用 id 命令可以很轻松的通过用户名查看UID、GID,下面来讲解一下这个命令的用法。 命令格式 id [选项]… [用户名] 命令选项 -a 忽略,兼容其它版本 -Z, –context 只输出当前用户的安全上下文 -g, –group 只输出有效的GID -G, –groups 输出所有的GID -n, –name 对于 -ugG 输出名字而不是数值 -r, –real 对于 -ugG 输出真实ID而不是有效ID -u, –user 只输出有效UID –help 输出帮助后退出 –version 输出版本信息后退出 使用案例 heihaier@heihaier-desktop:~$ id root uid=0(root) gid=0(root) groups=0(root) 方法二: 查看 /etc/password 文件 /etc/password 文件格式 root:x:0:0:root:/root:/bin/bash 上面是这个文件的一行实例,每个域用 : 区分,从左向右分别是 root 用户名: 1~32 字节长。 x 密码: 字符x表示密码被加密保存在 /etc/shadow 文件中。 ...

2019-07-07 · 1 min · 107 words · -

wording for code

wording for code Where there is a shell, there is a way. Perl语言的发明者Larry Wall有一句名言: The three chief virtues of a programmer are: Laziness, Impatience and Hubris. – Larry Wall

2019-07-06 · 1 min · 29 words · -

agile, desk check

agile, desk check 做好Desk Check 在敏捷开发中,当一个Story开发结束之后,我们会把开发,测试,BA,UX聚在一起来做Shoulder Check / Desk Check。这个实践可能很多团队都会坚持。但是做的流畅程度则千差万别,效果也自然大相径庭。 你要专业 https://insights.thoughtworks.cn/professional/embed/#?secret=CuWoU1KPNH

2019-07-06 · 1 min · 12 words · -

需求拆分

需求拆分 传统的工具比如 INVEST (+SMART) 对需求进行合理的拆分

2019-07-06 · 1 min · 5 words · -

心流

心流 1975 年,心理学家米哈里·齐克森米哈里 (Mihaly Csikszentmihalyi) 正式将心流概念化并通过科学的方式来研究。 心流 (英语: Flow) ,也有别名以化境 (Zone) 表示,亦有人翻译为神驰状态,定义是一种将个人精神力完全投注在某种活动上的感觉;心流产生时同时会有高度的兴奋及充实感。 是一种奇妙而值得追求的境界,或者心理状态,也是知识工作者所一直追求的状态。在这样顺畅的状态下工作,不但个人会获得空前的满足感,而且团队从客观上来看,会更加的高效,成员会更加的团结,不论你将什么样的需求交给他们,他们总是会顺利的将其完成。 要进入理想的,忘我的心流状态,齐克森米哈里提到至少需要满足这三点: 有清晰的目标 有明确且事实的反馈 能力和挑战的平衡 (都处于比较高的状态) https://www.infoq.cn/article/k4TB7hZU4uM_8lhXEY9h?utm_source=rss&utm_medium=article http://icodeit.org/2018/01/feedback-saves-the-world/

2019-07-06 · 1 min · 20 words · -

raspberry GPIO 水泵

raspberry GPIO 水泵 https://github.com/stianeikeland/go-rpio https://zhuanlan.zhihu.com/p/40594358 GPIO (General Purpose Input/Output) https://www.cnblogs.com/vamei/p/6751992.html

2019-07-03 · 1 min · 10 words · -

nf_conntrack模块

nf_conntrack模块 nf_conntrack(在老版本的 Linux 内核中叫 ip_conntrack)是一个内核模块,用于跟踪一个连接的状态的。连接状态跟踪可以供其他模块使用,最常见的两个使用场景是 iptables 的 nat 的 state 模块。 iptables 的 nat 通过规则来修改目的/源地址,但光修改地址不行,我们还需要能让回来的包能路由到最初的来源主机。这就需要借助 nf_conntrack 来找到原来那个连接的记录才行。而 state 模块则是直接使用 nf_conntrack 里记录的连接的状态来匹配用户定义的相关规则。例如下面这条 INPUT 规则用于放行 80 端口上的状态为 NEW 的连接上的包。 iptables -A INPUT -p tcp -m state -state NEW -m tcp -dport 80 -j ACCEPT。 iptables中的状态检测功能是由state选项来实现iptable的。对这个选项,在iptables的手册页中有以下描述: state 这个模块能够跟踪分组的连接状态(即状态检测)。 格式: -state XXXXX 这里,state是一个用逗号分割的列表,表示要匹配的连接状态。 在iptables中有四种状态: NEW,ESTABLISHED,RELATED,INVALID。 NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输。NEW说明 这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN包,是我们所留意 的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。比如一个特意发出的探测包,可能只有RST位,但仍然是 NEW。 ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立,而且会继续匹配 这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是 ESTABLISHED,只要它们是我们所发出的信息的应答。 RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如: FTP的数据传输连接 和控制连接之间就是RELATED关系。RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为 是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一 个主连接之外的连接,这个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP- data连接就是和FTP-control有RELATED的。还有其他的例子, INVAILD,表示分组对应的连接是未知的,说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西。 https://clodfisher.github.io/2018/09/nf_conntrack/ 连接跟踪(conntrack) https://arthurchiao.art/blog/conntrack-design-and-implementation-zh/

2019-07-02 · 1 min · 69 words · -

MySQL collect

MySQL collect COLLATE是用来做什么的? 使用phpmyadmin的开发可能会非常眼熟,因为其中的中文表头已经给出了答案: phpmyadmin截图 所谓utf8_unicode_ci,其实是用来排序的规则。对于MySQL中那些字符类型的列,如VARCHAR,CHAR,TEXT类型的列,都需要有一个COLLATE类型来告知MySQL如何对该列进行排序和比较。简而言之,COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响DISTINCT、GROUP BY、HAVING语句的查询结果。另外,MySQL建索引的时候,如果索引列是字符类型,也会影响索引创建,只不过这种影响我们感知不到。总之,凡是涉及到字符类型比较或排序的地方,都会和COLLATE有关。 各种COLLATE的区别 COLLATE通常是和数据编码 (CHARSET) 相关的,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如Latin1编码的默认COLLATE为latin1_swedish_ci,GBK编码的默认COLLATE为gbk_chinese_ci,utf8mb4编码的默认值为utf8mb4_general_ci。 这里顺便讲个题外话,MySQL中有utf8和utf8mb4两种编码,在MySQL中请大家忘记utf8,永远使用utf8mb4。这是MySQL的一个遗留问题,MySQL中的utf8最多只能支持3bytes长度的字符编码,对于一些需要占据4bytes的文字,MySQL的utf8就不支持了,要使用utf8mb4才行。 很多COLLATE都带有_ci字样,这是 Case Insensitive 的缩写,即大小写无关,也就是说"A"和"a"在排序和比较的时候是一视同仁的。selection * from table1 where field1=“a"同样可以把field1为"A"的值选出来。与此同时,对于那些_cs后缀的COLLATE,则是Case Sensitive,即大小写敏感的。 在MySQL中使用show collation指令可以查看到MySQL所支持的所有COLLATE 作者: 腾讯云加社区 链接: https://juejin.im/post/5bfe5cc36fb9a04a082161c2 来源: 掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 https://juejin.im/post/5bfe5cc36fb9a04a082161c2

2019-07-02 · 1 min · 33 words · -

MySQL大小写敏感配置, COLLATE

MySQL大小写敏感配置, COLLATE https://blog.csdn.net/fdipzone/article/details/73692929 show global variables like '%lower_case%'; lower_case_file_system 表示当前系统文件是否大小写敏感,只读参数,无法修改。 ON 大小写不敏感 OFF 大小写敏感 lower_case_table_names 表示表名是否大小写敏感,可以修改。 lower_case_table_names = 0时,MySQL会根据表名直接操作,大小写敏感。 lower_case_table_names = 1时,MySQL会先把表名转为小写,再执行操作。 设置lower_case_table_names的值 打开my.cnf文件,加入以下语句后重启。 lower_case_table_names = 0 或 lower_case_table_names = 1 解决MySQL查询不区分大小写 MySQL默认的字符检索策略: utf8_general_ci,表示不区分大小写;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。 (注意: 在MySQL5.6.10版本中,不支持utf8_genral_cs!!!!) 创建表时,直接设置表的collate属性为utf8_general_cs或者utf8_bin;如果已经创建表,则直接修改字段的Collation属性为utf8_general_cs或者utf8_bin。 -- 创建表: CREATE TABLE testt( id INT PRIMARY KEY, name VARCHAR(32) NOT NULL ) ENGINE = INNODB COLLATE =utf8_bin; -- 修改表结构的Collation属性 ALTER TABLE TABLENAME MODIFY COLUMN COLUMNNAME VARCHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL; COLLATE: 排序规则 ...

2019-07-02 · 1 min · 160 words · -

debug1,expecting SSH2_MSG_KEX_ECDH_REPLY

‘debug1,expecting SSH2_MSG_KEX_ECDH_REPLY’ debug1: expecting SSH2_MSG_KEX_ECDH_REPLY 设置网卡接口的MTU值,改成: 1200 sudo ip link set dev eth0 mtu 1200 /etc/systemd/network/en0s25.network [Match] Name=enp0s25 [Link] MTUBytes=9000 [Network] Address=192.168.1.101/24 Gateway=192.168.1.1/24 DNS=192.168.1.1 以太网的MTU是1500,而隧道的MTU值1400左右,比以太网的小,因此,以太网发出去的包就被拒绝了,最终导致无法建立SSH连接。 原理 MTU (Maximum Transmission Unit) : 最大传输单元,是指一种通信协议的某一层上面所能通过的最大数据包大小 (以字节为单位) 。最大传输单元这个参数通常与通信接口有关 (网络接口卡、串口等) .(摘自维基百科) 从维基百科种看到: 这里的MTU所指的是无需分段的情况下,可以传输的最大IP报文 (包含IP头部,但不包含协议栈更下层的头部) 。 下面是普通媒体的MTU表: 网络 MTU(Byte) 超通道 65535 16Mb/s令牌环 17914 4Mb/s令牌环 4464 FDDI 4352 以太网 1500 IEEE 802.3/802.2 1492 X.25 576 点对点 (低时延) 296 对于使用AUTOSSH建立隧道: 传输模式,MTU值最大是: 1440 隧道模式,MTU值最大是: 1420 所以,出现这个现象的原因也就清楚了: 本身以太网的MTU是1500,而隧道的MTU值1400左右,比以太网的小,因此,以太网发出去的包就被拒绝了,最终导致无法建立SSH连接。 ssh 密钥交换阶段一次发送的数据一般大于 1500 字节,因此至少填满了一个 MTU; ...

2019-06-22 · 1 min · 78 words · -

OpenStack 高可用 (HA)

OpenStack 高可用 (HA) 高可用性是指提供在本地系统单个组件故障情况下,能继续访问应用的能力,无论这个故障是业务流程、物理设施、IT软/硬件的故障。最好的可用性, 就是你的一台机器宕机了,但是使用你的服务的用户完全感觉不到。你的机器宕机了,在该机器上运行的服务肯定得做故障切换 (failover) ,切换有两个维度的成本: RTO (Recovery Time Objective) 和 RPO (Recovery Point Objective) 。RTO 是服务恢复的时间,最佳的情况是 0,这意味着服务立即恢复;最坏是无穷大意味着服务永远恢复不了;RPO 是切换时向前恢复的数据的时间长度,0 意味着使用同步的数据,大于 0 意味着有数据丢失,比如 " RPO = 1 天" 意味着恢复时使用一天前的数据,那么一天之内的数据就丢失了。因此,恢复的最佳结果是 RTO = RPO = 0 对 HA 来说,往往使用共享存储,这样的话,RPO =0 ;同时往往使用 Active/Active (双活集群) HA 模式来使得 RTO 几乎0,如果使用 Active/Passive 模式的 HA 的话,则需要将 RTO 减少到最小限度。HA 的计算公式是[ 1 - (宕机时间)/ (宕机时间 + 运行时间) ],我们常常用几个 9 表示可用性: 2 个9: 99% = 1% * 365 = 3.65 * 24 小时/年 = 87.6 小时/年的宕机时间 ...

2019-06-22 · 1 min · 117 words · -

chained invocation (链式调用) 或者Method chaining

chained invocation (链式调用) 或者Method chaining https://www.zhihu.com/question/22006988 这就是chained invocation (链式调用) 或者Method chaining,这种风格的API设计叫做fluent API或者Fluent interface。它常用在Builder pattern的实现上。

2019-06-21 · 1 min · 14 words · -

linux shell 查找文件位置,which, command -v, hash, type

linux shell 查找文件位置,which, command -v, hash, type command -v foo 避免使用which, 相对于hash、type、command等内置命令,which是一个没有明显的功能优势的外部命令。 使用which时会启动一个新的进程 很多linux发行版上的which执行完后甚至没有返回码,这就意味着在上面执行完"if which foo"就不会奏效,即使"foo"命令 不存在,系统也会报告存在,这样明显是适得其反。(部分POSIX风格的shell对hash命令也会有类似情况) 很多linux发行版上的which会做一些邪恶的事情,比如改变输出结果甚至会接入到包管理器中。 https://stackoverflow.com/questions/592620/how-to-check-if-a-program-exists-from-a-bash-script?page=1&tab=votes#tab-top https://blog.51cto.com/xoyabc/1902804

2019-06-21 · 1 min · 20 words · -

go module proxy, goproxy, athens

go module proxy, goproxy, athens goproxy.io export GOPROXY=https://goproxy.io,direct goproxy.cn export GO111MODULE=on export GOPROXY=https://goproxy.cn GO 版本大于 1.13,可以直接使用 go env -w 命令设置 GOPROXY go env -w GOPROXY=https://goproxy.io,direct # 清除 go env go env -u GOPROXY # 阿里云 export GOPROXY=https://mirrors.aliyun.com/goproxy/ # goproxy.io export GOPROXY=https://goproxy.io,direct # goproxy.cn export GOPROXY=https://goproxy.cn athens docker run -p '3000:3000' gomods/athens:latest https://goproxy.io/zh/ https://blog.wiloon.com/?p=15941 https://shockerli.net/post/go-get-golang-org-x-solution/ https://github.com/goproxy/goproxy.cn GOPRIVATE 环境变量 完成设置后,go 命令会从公共镜像 goproxy.io 上下载依赖包,并且会对下载的软件包和代码库进行安全校验,当你的代码库是公开的时候,这些功能都没什么问题。但是如果你的仓库是私有的怎么办呢? 环境变量 GOPRIVATE 用来控制 go 命令把哪些仓库看做是私有的仓库,这样的话,就可以跳过 proxy server 和校验检查,这个变量的值支持用逗号分隔,可以填写多个值,例如: GOPRIVATE=*.corp.example.com,rsc.io/private 这样 go 命令会把所有包含这个后缀的软件包,包括 git.corp.example.com/xyzzy , rsc.io/private, 和 rsc.io/private/quux 都以私有仓库来对待。 ...

2019-06-20 · 1 min · 120 words · -

go语言的模板,text/template包

go语言的模板,text/template包 go语言的模板,text/template包 ##定义 模板就是将一组文本嵌入另一组文本里 传入string-最简单的替换 package main import ( “os” “text/template” ) func main() { name := “waynehu” tmpl, err := template.New(“test”).Parse(“hello, {{.}}”) //建立一个模板,内容是"hello, {{.}}" if err != nil { panic(err) } err = tmpl.Execute(os.Stdout, name) //将string与模板合成,变量name的内容会替换掉{{.}} //合成结果放到os.Stdout里 if err != nil { panic(err) } } //输出 : hello, waynehu 因为"hello, {{.}}“也是一个字符串,所以可以单独拎出来,如下: //这句 tmpl, err := template.New(“test”).Parse(“hello, {{.}}”) //等于下面的两句 muban := “hello, {{.}}” tmpl, err := template.New(“test”).Parse(muban) //之后的例子都用两句的方式表达 传入struct 模板合成那句,第2个参数是interface{},所以可以传入任何类型,现在传入struct看看 要取得struct的值,只要使用成员名字即可,看代码吧: package main import ( “os” “text/template” ) type Inventory struct { ...

2019-06-14 · 3 min · 449 words · -

Go gc

Go gc gctrace GODEBUG='gctrace=1' go run main.go gc 15 @941.135s 0%: 0.058+91+0.002 ms clock, 0.058+0.35/26/61+0.002 ms cpu, 75->75->38 MB, 77 MB goal, 1 P gc # @#s #%: #+#+# ms clock, #+#/#/#+# ms cpu, #->#-># MB, # MB goal, # P where the fields are as follows: gc # the GC number, incremented at each GC @#s time in seconds since program start #% percentage of time spent in GC since program start #+…+# wall-clock/CPU times for the phases of the GC #->#-># MB heap size at GC start, at GC end, and live heap # MB goal goal heap size # P number of processors used The phases are stop-the-world (STW) sweep termination, concurrent mark and scan, and STW mark termination. The CPU times for mark/scan are broken down in to assist time (GC performed in line with allocation), background GC time, and idle GC time. If the line ends with “(forced)”, this GC was forced by a runtime.GC() call and all phases are STW. ...

2019-06-11 · 2 min · 392 words · -