发现linux命令/工具find的一个”bug”

今天用find命令找一个目录下面所有大小小于1K的普通文件. 我的命令是这么写的: $ find ~ -type f -a -size -1K | wc -l 发现得到的数字明显比预想的小很多。但命令没错呀百思不得其解之下,又试了一下另一种写法。这时,就正常了,真奇怪啊 $ find ~ -type f -a -size -1024c | wc -l 这次就正常了!!! 我反复查文档: c for bytes K for Kilobytes (units of 1024 bytes) 对啊没错啊。 1K就是1024byte。哪里出问题了,哪出出错了呢?难道是linux的bug吗?我换了一个发行版的linux,发现还是同样的情况。这就郁闷了 再次查看文档,这次详细读文档了!终于发现问题所在了: The + and – prefixes signify greater than and less than, as usual. Bear in mind that the size is rounded up to the next unit. Therefore -size -1M is not equivalent to -size -1048576c. The former only matches empty files, the latter matches files from 1 to 1,048,575 bytes. ...

August 2, 2017 · 1 min · kamus

我理解的区块链技术

同事叫我写点对区块链的看法。我大概在四年前比特币火热的时候看了一些相关的资料,就随便写一点吧。 Blockchain Technology 什么是区块链 区块链技术最早可追述到1991年 by Stuart Haber & W. Scott Stornetta. 以2008年Satoshi Nakamoto对区块链技术的阐述及第二年2009年创建了比特币 标志了区域链技术的成熟。 维基百科给出的定义是: A distributed database that maintains a continuously growing list of records, called blocks, secured from tampering and revision. 区块链是一个分布式的数据库。它的数据被组织成不断增长的记录链表。 其中记录被称为“区块”。区块被加密,保证不被篡改。 以BitCoin举例: 比特币是一个巨大的分布式的记账系统,该分布式系统的每一个结点都记录了在 比特币网络上发生的每一笔交易。如果要篡改数据,除非能控制这个网络上的绝 大部分结点并且同时修改这些结点的相关加密数据。 关键技术 区块链技术最大的创新即在一个去中心化的系统中解决了数字货币的Double Spending 的问题。 更一般地讲: 区域链技术使用去中心化网络解决了之前需要中心服务器的计账问题 What is Double Spending 如果我们用实物货币交易,交易的任何一方不能同时拥有商品和实物货币。但数字货币 却是可以通过非常廉价地复制获得。在区块链技术出现之前,解决这个问题都是用一个 中心机构解决。交易参与方无条件信任这个中心机构,由它判断并决定某个数字货币的归属。 显然这里有一个单点故障的潜在危险。 使用常景 最大的使用常景还是金融领域,比如数字货币和银行间的清算系统。 对于任何涉及信任,计账,审计,防篡改的系统,都可以用区块链技术提供一个去中心的 实现,而不是传统地信任一个中心机构的解决方案。 比如一个基于区块链技术的全民投票系统。 未来发展 据埃森哲的数据,2016年区域链技术在金融的项目中领域获得了13.5%的采用率,进入初期采用 阶段,于2018-2024年进入快速增长阶段,2025年进入成熟期。 The future of blockchain in 8 charts 在我看来,区块链技术只在金融领域有很大的发展前景,而在其它领域则没有什么优势。理由是,区块链技术的一个重要假设是:不能信任一个权威的中心服务方。但在大多数场景中,引入一个权威的中心服务方是可以接受的有时还是必须的,且开发难度要低。

May 16, 2017 · 1 min · kamus

1. 前言: ZeroMq aka zmq是最知名的网络消息中间件之一。使有zmq的开源软件中最知名的莫过于Apache基金会下的Storm。我厂内部使用zmq的有即通的yaaf框架。 ZMQ社区在2013年9月发布了zmq4。zmq4最大的新功能即提供了一套安全机制,其中有IP黑白名单,用户名/密码鉴权,ECC(Elliptic Curve Cryptography)证书鉴权,以及通讯的加密(类似TSL)。 本文主要介绍zmq4.0的安全机制。 2. ECC的故事: 这里的ECC不是我厂历史上的电商事业群,而是椭圆曲线加密算法。ECC据说被NSA(美国安全局)操作,在算法中设置了后门。不过好在不是只有一种椭圆曲线,而是有无数种,不同的曲线有不同的优点和缺点,只是其中由NIST(美国标准和技术研究署)推荐的曲线被怀疑设置了后门。 ZMQ使用的椭圆曲线算法是Curve25519 ,它有开源实现而且没有专利保护。zmq用了长度为256bits的密钥,强度相当于RSA 3072比特的密钥长度。 ECDH(Elliptic Curve Diffie-Hellman)则是一个密钥协商协议。非常简单地讲,当A与B在一个不受信任的网络中通讯前,A和B先生成一对公私钥,并且A和B通过某个完全的渠道事先知道对方的公钥,然后A和B在握手阶段协商出一个双方公知的私钥供加密接下来的通讯。 可以理解成zmq设计了一个专门为自己定制的精简的TLS,更多的理论细节在http://curvezmq.org/page:read-the-docs, 作为一个码农,下面用代码介绍使用zmq4的Curve安全机制 3. 证书鉴权,通讯加密,IP 白名单 编译zmq4.x以后,会生成一个名叫curve_keygen的程序,用它可以生成zmq 的证书。证书是一个一般的文本文件,如下是一个curve_keygen生成的zmq证书的例子。 # **** Generated on 2017-01-02 14:24:20 by CZMQ **** # ZeroMQ CURVE **Secret** Certificate # DO NOT PROVIDE THIS FILE TO OTHER USERS nor change its permissions. metadata email = “kamuszhou@tencent.com” curve public-key = “!Upjrn]2Dk)jQkYREsceBnpgoIL7koE{CVnV1j4D” secret-key = “ZPT#=l/#Rtg:TeLbofh:uPi7#/w(GDZq[0^qPZA1”   ...

January 17, 2017 · 1 min · kamus

原来比特位也有大小端endinness.字节序和比特序的故事

我一直以为大小端endianness只针对字节,不针对比特位。 我一直以为全世界所有的cpu解释bit序都是一样的。 昨天才知道endianness也针对bit。 于是就想不明白了。 因为观察到用 htonl 函数转换endianness后,bit位没有变化,只有字节顺序改了呀。 于是google呀,找到这篇好文: http://www.linuxjournal.com/article/6788?page=0,0 “Byte and Bit Order Dissection”(字节序和比特序深入剖析) 看了这篇文章,才知道 bit序的翻转是由硬件完成的。原来以前这方面很多概念都没理解对。

September 13, 2016 · 1 min · kamus

apt-get通过http代理连接网络

编辑/etc/apt/apt.conf加入下面这行: Acquire::http::Proxy “http://web-proxy.oa.com:8080”; 按照你的http服务器的地址做相应修改

September 22, 2015 · 1 min · kamus

HTTP2简单教程

译自:http://qnimate.com/post-series/http2-complete-tutorial/ HTTP1.1是在1999年的时候被引入业界的。从当时到现在,WEB已经发生了相当大的变化。很多人开始用移动设备上网,有些移动环境下网络质量非常不稳定。另外,WEB页面的内容也相当的丰富了。这些都负面影响了WEB页面的加载时间。因此,需要一个新的协议来加速WEB的加载。 HTTP/2和SPDY****的区别: SPDY是谷歌于2009年创造的协议,旨在WEB延迟以及增强安全性。 HTTP/2是SPDY的一个克隆。谷歌已经停止了继续开发SPDY,并且把工作转移到了HTTP/2上来。 HTTP/2****的目标: 减少加载延时。 减少TCP连接数。 增强的网络安全。 保持和HTTP/1.1的兼容。 HTTP/2****的功能: 多路复用Multiplexing:很多个异步的HTTP请求只使用一个TCP的连接。 服务端PUSH:对于一个请求可能有多个回复。 头部压缩:压缩头部(headers)。 请求分级:对同一个域名的请求可作优先级分级。 二进制协议:HTTP/2是一个二进制协议,而HTTP/1.1是一个文本协议。 HTTP/2解决了HTTP/1.1****的哪些问题: HTTP管道(HTTP pipelining):一些HTTP1.1客户端使用了HTTP管道技术来减少TCP连接数。HTTP管道指的是多个HTTP请求被发往同一个TCP连接,而不等待前一个请求的回复。但是服务端发送回复时的顺序和收到的请求的顺序一样。因此,造成了HOL阻塞问题(head-of-line blocking)。HOL Blocking简单地说是一个回复的延迟会使得排在它后面的回复都会延迟。HTTP/2透过引用多路复用(Multiplexing)解决了这个问题。多个HTTP请求和多个HTTP回复都使用同一个TCP连续,而且HTTP回复的顺序不需要保持HTTP请求到达的顺序。 同一个域名的多个TCP连接:在使用HTTP/1.1时,需要对同一个域名起多个TCP连接来增加吞吐量。而使用HTTP/2时,对于每个域名,只充许有一个TCP连接(only one TCP connection per domain is allowed)。所有的请求和回复都通过唯一的一个TCP连接进行。 TCP连接的关闭时间:使用HTTP1.1时,一个TCP连接在请求完成时立刻被关闭。但对于HTTP/2,TCP连接能存活相当成地一段时间。 头部压缩:HTTP/1.1是没有头部压缩的,但HTTP/2引入头部压缩进一步的减少了延时。 HTTP/2如何兼容HTT/1? HTTP/2客户端在不确定对方服务器是否支持HTTP/2时,会用HTTP/1协议向服务器发送请求时带上Upgrade: HTTP/2.0这个头部。如果对方服务器支持HTTP/2,就会回复HTTP1.1 101,表示切换协议(Switching Protocols status)。而对于老旧的服务器则简单地返回HTTP/1.1的状态。 HTTP/2客户端可以记下哪些服务器支持HTTP/2,这样,下次就可以直接发起HTTP/2请求,而不必再经过一个询问和回复(Upgrade Round Trip). HTTP/2****中的多路复用是怎么回事? HTTP/2使用多路复用,多个请求和回复全异步的通过同一个TCP连接收发。 HTTP/2是一个二进制的协议。每一个请求和回复都被分配了一个流标志(Stream ID),而且请求和回复被切成了很多帧(Frame),属于同一个请求或回复帧的Stream ID相同。因为有了这个Stream ID和Frame的机制,请求和回复可以在服务器和客户程序两端同时全异步的发送。因此,HTTP2没有了Head-of-line Blocking的问题。 每一个Stream还可以被赋于一个优先级,服务器可以分配更多的系统资源处理高优级的Stream。 HTTP/2还有一个传输层级别的流控。它协商了客户程序和服务器两端最多使用多少个Stream,服务器能处理的最大尺寸的Stream以及整个连接最多处理多少字节,以及数据被发送的速率。 HTTP/2中的服务器推送(Server Push)和承诺(Promise) 当服务器“感觉”到客户程序需要更多的资源时,就会给客户程序发送一个Promise Stream ,提醒客户程序需要什么资源。这些stream比一般的stream的优先级要高。 这项技术在加载网页时非常用户,因为网页的大量css和javascrpit可能通过这种方式发送。而HTTP/1的作法是把css和js都combine到一起。 服务器发送Promise Stream时提醒的资源遵守同源策略(same origin policy) HTTP/2****中的头部压缩: HTTP/2的头部压缩和HTTP/1.1中早有的用gzip压缩Body不一样。使用HTTP/2时,在客户程序和服务器两端,都会保存一张表,记录了收到过的头部。它们在发送HTTP时不会重复发送一样的头部,当再次发送相同的头部时,只会发送该头部对应的表的索引号。 copyright ykyi.net

April 3, 2015 · 1 min · kamus

git小技巧,gitignore只忽略当前目录下的某文件等等

#. 编写git的gitignore文件时如何只忽略当前目录下的某文件呢 在文件名前加斜线 / 即可 # git pull如何从remote中拉下来所有分支 git pull –all git branch -a 查看目前所有分支,包括tracking branch 再用 git branch –track branch_name start_point 开一个本地分支,并且设好该本地分支的upstream # git 10小时免输git密码 git config --global credential.helper "cache --timeout=36000" 如果需要清空存下来的密码: ...

July 28, 2014 · 1 min · kamus

Linux 如何知道有哪些硬件,该装哪个驱动

Linux 如何知道有哪些硬件,该装哪个驱动 公司明文不准安装虚拟机了,被查到就是死罪。于是我在自己的笔记本上安装了Debian Linux。 结果无线网卡识别不了~~ 次奥~ 怎么破呢? 这么破: # lspci 该命令列出了所有PCI总线上的硬件设备,稍微看看就能看到自己的无线网卡了。 ...

July 23, 2014 · 1 min · kamus

用boost的方式在预编译期检查编译器和平台以及其它

用boost的方式在预编译期检查编译器和平台以及其它 一般C/C++程序员都知道用一些编译器预编译宏来判断编译器的种类的操作系统。 一般有: _WIN32 ,不管windows x86 还是 x86_64 都会有_WIN32,注意前面的下划线,如果没有下划线,MSDN的官方定义有这个酷酷的下划线. __unix__ 是否 unix OS __linux__ 是否是 linux __apple__ 是否是平台 原来咧,BOOST库提供了一个相当丰富的库来做这件事: 这个BOOST库是 Predef http://www.boost.org/doc/libs/1_55_0/libs/predef/doc/html/index.html #include <boost/predef.h> 看看官方文档的目录: Table of Contents Introduction Using the predefs Adding new predefs Reference BOOST_ARCH architecture macros BOOST_COMP compiler macros BOOST_LANG language standards macros BOOST_LIB library macros BOOST_OS operating system macros Other macros Version definition macros Acknoledgements 包括处理器架构,编译器相关宏,语言相关宏,库相关宏,操作系统相关宏~~~ I like boost ~~~ copyright ykyi.net

June 11, 2014 · 1 min · kamus

boost::io_service的poll_one和run_one有什么区别

boost::io_service的poll_one会立即返回(non-blocking),不管有没有已经被触发的处理函数(ready handler)。 而run_one有可能阻塞。如果还没有被触发的处理函数,run_one会阻塞到有一个handler被调用为止。 更多资料: http://think-async.com/ 呃。这篇日志也太短了!!! BOOST库真是个好东西啊~~好多写法很有现代脚本语言的taste。~~而且,那么丰富的库让生产效率大大提高了。 copyright ykyi.net

March 18, 2014 · 1 min · kamus