用lftp为ftp服务器做镜像

用lftp为ftp服务器做镜像

命令是这样的:

$ lftp -d -u user_name,password ftp_server_host -e "mirror -c -e --parallel=5 / /path/to/mirror"

解释一下这里的选项:
* -d 调试模试,看到详细的输出
* -u 用户名和密码,用,隔开
* -e 让lftp执行lftp自有的一些命令
* mirror 执行做镜像命令
* -c continue a mirror job if possible 继续做镜像,如果可能的话。难道不用这个选项,做镜像的过程有可能被中断?
* -e 如果一个文件在ftp站点上没有,但在本机上有,则删除这个文件
* –parallel 并发数
http://ykyi.net
mirror 命令还有一个 -R 参数,这样的话,会put文件到ftp服务器,效果和上例相反。

访问ES最简单示例

这些天架了一个ES集群,用来分析积累了海量日志数据。我用sphinx写了一个简单文档,发布在内网。下面是复制过来的部分内容,不幸的是很多格式信息都丢失了。做了点简单修改,去掉了敏感信息。

///////////////////////////////////////////////////////////

本示例仅示范最为基础的应用,协助读者调通最简单的查询。 详细灵活的使用方法非本文档能够覆盖,需参见官方详细文档或咨询你常用的搜索引擎。

  1. 使用curl命令行工具
  2. 使用es官方python库
    1. RESTful接口
    2. 官方python库

使用curl命令行工具

NOTICE:
[*略去较为敏感的鉴权部分*]
  • 在访问日志中检索一个keyword,无论keyword出现在哪个字段中。 如下示例:所有文档,superuser出现在其中任意字段中都会被召回。注意酌情更换URI中的参数。 实际上,把_all替换成user_name,则只在user_name字段中检索。这里使用的是lucene语法, 参见:https://lucene.apache.org/core/2_9_4/queryparsersyntax.html
1
curl https://endpoint/_search?q=_all:superuser
  • 使用ES的DSL语法,在访问日志中检索出现在指定字段中的keyword。 如下示例:superuser出现在user_name字段中。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
curl https://endpoint/_search?pretty -H "Content-Type: application/json" -X POST -d '
{
   "query":{
       "bool":{
             "filter":[
                 { "term":{ "user_name": "superuser" } }
             ]
       }
   }
}'

上述检索方法使用了ES中的filter语法,filter是较快的一种查询方式。如果需要检索的字段需要分词,则只能使用 match语法,如下:

1
2
3
4
5
6
7
8
curl ./kamus.key https://endpoint/_search?pretty -H "Content-Type: application/json" -X POST -d '
{
   "query":{
       "match":{
             {"user_name": "superuser"}
       }
   }
}'
  • 为检索增加时间限制 如需要指定时间区间:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
curl "https://endpoint/_search?pretty" -d '
{
  "query":{
       "bool":{
               "must":{
                    "match":{
                                "user_name":"superuser"
                            }
               },
               "filter":{
                     "range":{
                          "req_time":{
                                        "gte":"2017-01-01 00:00:00",
                                        "lt":"2017-08-08 00:00:00"
                                     }
                       }
                }
        }
  }
} '
  • 分页 ES的分页使用”from”和”size”参数。例如,每页10条,返回第1页。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
curl "https://endpoint/_search?pretty"  -d '
{
     "from": 0,
     "size": 10,
     "query": {
         "term": {
              "user_name": "superuser"
         }
     }
}
'

由于ES的实现机制,ES并不鼓励使用分页,在size较大且from的页码也较大时,ES可能无法及时响应。

  • 其他高级应用 如bool操作,以及复杂灵活的查询条件组合请参加官网文档。

使用es官方python库

懒得打字了,看官方文档吧: https://elasticsearch-py.readthedocs.io/

It’s not lupus 是个什么梗,什么意思呢

著名黑客于旸, AKA tkyu, tk教主在论坛里的头像是一个狰狞面孔的人,头像下面有一行英文:

It’s not Lupus

这句话是什么意思呢?原来来自2007年福克斯Fox的一部电视连续剧 House
剧中主人公是普林斯敦大学教学医院的医学天才(Dr. House),他反传统并且不愿意与人交往。他的工作伙伴是一些年轻的医生。
年轻的医生在搞不清楚病人发病原因的时候,就认为这可能是Lupus(狼疮)。因为Lupus这个病需要好几年才能够被确诊。这时,Dr House就说: “It’s not lupus”或“It’s never lupus”。直到有一天,确实出现了一个Lupus案例。
我猜,tk教主引用It’s not Lupus这句话可能暗指他也是Dr House一样的天才吧~

发现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.

至此,真相大白!~~原来呢
用K或M这些单位时,尺寸会被向上取整(is rounded up to the next unit)。这样一个100字节的文件被向上取整到1K的文件,就没有命中-1K了
这里非常奇怪的是“向上取整”。

读吴军的”硅谷来信:第230封 为什么中国不会掉入中等收入陷阱”之疑惑

吴军是我很佩服的一位科学家兼科技作家。他的学误之渊博,让人惊叹。

最近,我看了吴军大神的”硅谷来信:第230封 为什么中国不会掉入中等收入陷阱”。这篇文章分上,下两篇。下篇的末段部分提到一个针对“缩小国有企业规模”的观点,原文如下:

缩小国有企业规模。这件事不需要做,虽然中国的国有企业相比一些明星私营企业显得效率低一些,但是人均产值依然
高过私营企业的平均水平。更重要的是,国有企业是目前中国经济走向世界的排头兵,因为它们可以不计成本地向海外扩张。
相比之下,中国私营企业除了华为、联想等少数企业,大部分私营老板是舍不得自己掏腰包,对走
向世界进行长期大规模投资的。所谓的BAT(百度、阿里巴巴、腾 讯)虽然自己挣钱不少,但依然
是窝里横的公司,而且直到今天也没有认认真真做国际化的事情。这些公司尚且指望不上,何况其它私营企业了。

这段话有相当多的问题:

国企人均产值依然高过私营企业平均水平。

注意,这里是人均产值,不是企业效率。国有企业垄断占据了几乎所有赚钱的行业:烟草,金融,能源,电信,人均产值能不高吗?但如果比生产效率呢?

国企可以不计成本地向海外扩张。

“不计成本”地扩张??成本100美元,卖10美元???不计成本是好事吗?民营企业卖扣子卖眼镜卖衬衣卖打火机辛苦积累的外汇,国企不计成本的挥霍,难道是好事,不应该是国企的缺点吗?

吴军大神认为私营企业不做海外扩张,但吴大神先排除掉华为联想

2000年以后,满世界的made in china的小商品,难道不是私营企业做的?
华为,联想是民企的代表企业,特别是华为,为何华为联想不算数?十五年前,同在深圳的民企华为和国企中兴尚且在同一量级,如今,民企华为的体量可是中兴的十倍之巨还多。
那不说华为,联想。小米,oppo,vivo们在南亚,东南亚把三星打得满地找牙,算不算民企的海外扩张。制造业的“三一重工”算不算私营企业,可搜索新闻“三一重工强攻新兴市场,海外收入占比升至50%”,这还是三年前,2014年的数据。
大疆几乎吃下了全世界民用无人机市场,算不算海外扩张么。
再说一家小而美的互联网公司,猎豹移动,这家公司的海外营收可超过了70%。
还有当下火热的共享单车。ofo,mobike们刚起步就已经把业务扩张到了北美和欧洲。
中小型公司里积极开拓海外市场的并不在少数吧。吴大神装做不知道?

况且该文的中段有提到

你只能看到中国的商人去拉美 国家上门买酒,看不见他们的商人到中国推销酒。

又有:

中国的商人往返于世界各地,积极开拓海外市场。

这里提到的中国商人不多是民营企业家吗,难道都是国企高官?如果这里的商人多指私营企业家,那作者的观点岂不是前后矛盾。

所谓的BAT(百度、阿里巴巴、腾 讯)虽然自己挣钱不少,但依然是窝里横的公司,而且直到今天也没有认认真真做国际化的事情。

互联网先在美国繁荣发展,国内互联网公司的前步较晚。在最初期,BAT们刚刚出生,尚且为了生存,忙于和在华的巨头微软,谷哥,亚马逊,雅虎,ebay激烈竞争。不能苛求国内市场还没占领就海外扩张吧?
那看现在,百度在硅谷成立了AI实验室,腾讯在西雅图微软的大门口也成立AI实验室与微软直接竞争,阿里云在世界范围内力战亚马逊算不算海外扩张?
更不用说BAT的海外资本运作了,腾讯在2000年前就投资了Roit Games开发出世界第一网游LOL,去年收购super cell,今年入股tesla,算不算海外扩张?BAT的海外投资比比皆是。

BAT尚且指望不上,何况其它私企

退一万步,假设BAT确实没有任何出海商业活动,“何况其它私企”这句话的逻辑在哪?BAT只能代表互联网行业,而私营企业长满了国内每个允许民资进入的行业。BAT能代表他们吗?

我想,一定是因为吴军高贵的谷歌血统,狗眼看人低。和谷歌比,国内的民营企业家们,都是泥腿子,吴军就是看不起你!

我理解的区块链技术

同事叫我写点对区块链的看法。我大概在四年前比特币火热的时候看了一些相关的资料,就随便写一点吧。

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

在我看来,区块链技术只在金融领域有很大的发展前景,而在其它领域则没有什么优势。理由是,区块链技术的一个重要假设是:不能信任一个权威的中心服务方。但在大多数场景中,引入一个权威的中心服务方是可以接受的有时还是必须的,且开发难度要低。

如何战胜抑郁症

一篇关于抑郁症的建议:

我的抑郁症持续了比较长的时间,大概从2007年到2014年之间断断续续发作。
最终在2014年年初慢慢走出来。现在几乎不失眠了。
我在发病期间看了非常多的资料,找很多人聊天。思考怎么治好这该死的病。
据我了解,现代医学对抑郁症的发病原因还没有研究得很透,认为非常非常多的因素都会造成抑郁症包括遗传。对病理的研究更是很肤浅,毕竟现代科学对大脑的工作方式还是知之甚少的。但各药厂生产了很多抗抑郁的药物,这些药物的效果因人而异。但基本上都不大可能单靠药物就能治好的。如果没能确定病因,没解决掉源头问题,怎么可能治好呢。但要找到病因却不容易,前面有提到,现代医学在这方面的研究还不够。所以,医生的帮助也是有限的。

我的建议是:
1,首先意识到治好这病需要自己付出很多努力,不能依赖其他人比如找到一个神医
2,评估自己以前的处事方式,我以前对自己要求太严格,总是争分夺秒地不停学习。我给自己设了很多假想敌,总想超过他们。我觉得我中学时读书比你们厉害,我怎么能输给你。为了改变自己这个思维方式,我看了一些哲学思辨的书,还包括一点点宗教神学,主要是佛教。我试图让自己站在一个更大更高的视角看自己以前的工作生活思维方式有多少意义。最终我觉得我不应该有太多锋芒,对于整个宇宙来说,面对自然规律时,个人实在太渺小了。
3,认识新朋友,主动社交。不要只认识精英。三教九流的人都去认识,和他们聊天,了解他们的生活和思考方式。精英阶层的思想大多是竞争进取的,如果自己的圈子都是精英,会让自己的思维局限于此,对治疗抑郁症是不利的。我那时租车搬家时就不失时间和面包车司机聊天,了解他们的生活状态,忧虑和幸福。不同阶层人的生活和思维是大不相同的。他们也要生活,他们也有自己的喜怒哀乐,为何自己自认为各方面都强过他们却生活得如此狼狈。我在2013年在网络上认识了一个粤北的农场主,我专门在假期去他的农场住了四五天,感受农场的宁静和那边的村民生活。

1. 前言:

  ZeroMq aka zmq是最知名的网络消息中间件之一。使有zmq的开源软件中最知名的莫过于Apache基金会下的Storm。我厂内部使用zmq的有即通的yaaf框架。

   ZMQ社区在20139月发布了zmq4zmq4最大的新功能即提供了一套安全机制,其中有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)则是一个密钥协商协议。非常简单地讲,当AB在一个不受信任的网络中通讯前,AB先生成一对公私钥,并且AB通过某个完全的渠道事先知道对方的公钥,然后AB在握手阶段协商出一个双方公知的私钥供加密接下来的通讯。

    可以理解成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"

 

字段很好理解,最重要的是public-keysecret-key字段。

下面是一段客户端的相关代码片断(使用官方的czmq库,czmq是官方维护的High-level C库封装了底层的C API接口)

 // 创建一个DEALER类型的zmq socket
  zsock_t* dealer = zsock_new(ZMQ_DEALER);
  assert (dealer_ != NULL)

  // 假设路径~/my.cert存了客户端的证书,证书里需要既有公钥又有私钥,载入证书再应用这个证书到socket句柄上。然后就可以销毁证书句柄了
  zcert_t* my_cert = zcert_load("~/my.cert");
  assert (my_cert != NULL);
  zcert_apply(my_cert, dealer_);
  zcert_destroy(&my_cert);

  // 设置服务器的公钥
  zsock_set_curve_serverkey(dealer, "I7[{YV4[}q[9a)]b&d>bisoT]UXa/7b$Tp:6yoyq");

  // 连接在本机监听8888端口的服务器
  zsock_connect(dealer, "%s", "tcp://localhost:8888");

下面是服务端的相关代码片断:

   // 创建一个ROUTER zmq socket
   zsock_t* router_sk = zsock_new(ZMQ_ROUTER);
   assert(router_sk != NULL);

  /* CZMQ4库封装了一个actor服务器模型,详细的官方接口说明在http://api.zeromq.org/CZMQ3-0:zactor 其中zactor_new用来创建一个actor,回调函数填zauth。zauth是CZMQ定义好的一个回调函数,里面做了很多鉴权的准备工作。照抄就行。通过向actor通讯设置如何鉴权。*/
   zactor_t* auth = zactor_new(zauth, NULL);

   // 打印详细的鉴权相关日志
   zstr_send(auth, "VERBOSE");
   // 必须调用这个函数与actor同步。下同
   zsock_wait(auth);

   // 这里开启白名单,允许”127.0.0.1”和"127.0.0.2"访问本服务。如果用黑名单也类似,但第二个参数设为”DENY”
   zstr_sendx(auth, "ALLOW", "127.0.0.1", "127.0.0.2", NULL);
   zsock_wait(auth);

   /* 假设 ~/cert目录夹下面存放了客户端的证书(只有公钥) 下面的代码让只有拥有证书的客户端才能连接服务*/
   zstr_sendx(auth, "CURVE", "~/cert", NULL);
   zsock_wait(auth);

   // router_sk 这个zmq套接字是作为服务端使用的
   zsock_set_curve_server(router_sk, 1);

  // 加载服务端自己的证书,这个证书文件里需要既有公钥也有私钥
   zcert_t* my_cert = zcert_load("~/server.cert");
   assert(my_cert != NULL);
   zcert_apply(my_cert, router_sk);
   zcert_destroy(&my_cert);

   // router套接字监听8888端口
   int ret = zsock_bind(router_sk, "%s", "tcp://localhost:8888");
   assert(ret != -1);

 至此,服务端只接受来自127.0.0.1并且拥有正确证书的客户端的连接,而且通讯通道被加密。

4. Notice & Bug

a. 在实战过程中,发现一个czmq4库的bug,如果一个zmq socket作为server端并使用curve鉴权,就必须调用bind(),而不能调connect(),否则进程会崩溃。但是在zmq的世界中,server端的socket也是可以调connect的。在czmq4的官方github页面上找到有人已经报告了这个bug,可能下个版本会修复吧。

https://github.com/zeromq/czmq/issues/1470

b. czmq4实现的reactor模型不支持监控zactor对象.

c. czmq4有很多函数的参数个数是不确定的,这些函数的最后一个参数并须填NULL,否则编译期检查不到错误在运行期会崩溃。

原来比特位也有大小端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序的翻转是由硬件完成的。原来以前这方面很多概念都没理解对。