niyue

止正

In life on February 10, 2013 at 9:10 PM

给儿子起了个名字叫“止正”。写这篇文章的主要目的就是在以后有人,儿子或者其他人,问起为什么叫这个名字的时候可以很容易的直接发一个文章的链接给那个人解释。

我一直觉得起名字是个很重要的事情,毕竟这个代号要用一辈子,而且改起来很麻烦,所以在儿子实际出生之前大概一个月就开始想名字了。老爸是个程序员,而且很不可避免的把所有看到的钉子都用锤子来敲,于是打算写一个程序来找到一个合适的名字。这个事情我之前也做过,上次给侄女起名字的时候我写了一个Python的程序(顺便也学习了下Python),主要是按照名字的比划数和平仄来生成的,侄女是6月14日出生的,最后经过程序生成和人工筛选我给起了个名字叫做“周睿竹”。一直还挺满意这个名字的,虽然最后没有被采纳。这次准备故技重施再起一个,因为儿子还没有出生,所以只准备考虑个平仄能起个念起来顺一些的名字就好了。

感谢王医生帮忙,已经知道是男孩,所以不用准备两套名字,但是考虑到以后二胎的可能(或者没可能),还是希望能够有一定的扩展性,能够把二胎的名字也给考虑进去。同时二胎还不知道是男是女,所以二胎的名字还得想个男女都能用上或者都有合适的名字的,嗯,如果考虑到二胎的可能性其实也不这么大,大概就可以把我干的这个事情归类为传说中的over engineering

上次给侄女起名字顺便学习了下Python,虽然这次是蛇年,但是希望能学点新的东西,于是开始正经的学习Clojure,希望能用Clojure写这么个程序。噼里啪啦下了一堆书扫了一阵,最后发现Clojure Koans的学习方法最有意思,刷刷刷把20个练习给过了一遍,就这么弄弄一个星期已经过掉了,真想用Clojure写这么个程序的时候发现读个文件也很纠结,估计等我写出来的时候儿子都已经满月掉了,只能放弃Clojure用熟悉些的Ruby来写这个程序。接下来大概用了一个晚上的时间就写了一个很简单的版本能够生成一堆的名字组合。

大的方向上,就是我准备起一个三个字的名字,中间的一个字不管几个小孩都是一样的,三个字的音调构成是平仄平、平平仄或者平仄仄,希望能够读起来有转折。也没指望程序能够直接生成一个我想要的名字,但希望能通过生成的组合有所启发。

首先,我找了一张3500个汉字的常用汉字表,包含了2500个常用字和1000个次常用字和它们的拼音。如果你去看国家制定的《通用规范汉字表》,就是那个里面的一级字表。其实如果你看到二级字表你就会发现已经不太适合做正常的中国人姓名了,很多字我念都念不来,三级字表就更加不用说了。

之后用程序把所有的汉字按照拼音进行归类,比如阴平的yi(yī)“一”、“医”、“壹”、“伊”和“衣”是归成一类的,去声的yi(yì)“易”、“意”、“义”和“益”是归成另外一类的。这样所有的读音相同的组合就会被归并,然后按照它们的平仄去生成对应的组合,读的顺的话可以从中任意挑一个喜欢的字来做名字。

可能是上次Python的程序的原因,那次我仅仅取了特定笔画数的字来进行组合,其中还有一个14画的字,所有组合看一边看起来也挺快的。同时也因为这个涉及到同音字有多少的问题,原来并没有太多考虑这个会有多少组合,程序结果一出来发现这个方法的结果实在太多了点,所有的3500个字大约被归类成为400多个平声的音调以及500多个仄声的声调,也就是平均大约每个声调有3个多同音字。单看平仄平的组合(我的首选音调组合)的话就有20w+个组合需要过滤,实在不是人力能够看过去的。于是把那个常用字表里面的3500个字先人工过了一边,删掉了大约一半左右不太适合的字(比如“搬”、“绑”、“磅”之类的),然后又加了一些限制组合,比如我的姓以n打头,名字的第一个字我就想避免也是n打头的,这样过后生成的组合还有10w+。大致人工看了几千个组合,觉得还是多太多,又想到了取名有“女诗经,男楚辞”的说法,于是又把所有的组合去楚辞里面找了一下是否有出处。为了效率上足够快能够处理这么多组合的查询,还对楚辞做了一个预处理,把楚辞中所有的连续两个字的词给计算出来。之后又改成只是使用楚辞过滤现有的汉字,之后又移除了楚辞的限制,这么整理了一阵,最后的效果还是不尽如人意。

之后更换了另外一种方法来找灵感。把所有的仄声的音调拿出来,大约500种,一个个过一边,看到一个合适的声调,再把所有可能搭配的平声和这个单独的仄声声调组合,大约也是500种。或者也可以反过来先平声再仄声,就这么找到了第一个组合“谦允”,本来打算使用“谦允”、“谦许”(男女均可)、“谦诺”这三个名字的。之后又觉得谦允读起来没有a、e、o这种开口音,所以不够正气,又在程序里面加入了开口音的检查,汉字组合至少要包含一个开口音才会被考虑。就这么又找到了“羽扬”、“印波”、“可元”等等组合。

再之后希望名的两个字里面有一定的含义,又通过在线新华字典去查汉字的词组(全人工的),然后人工的看是不是有合适的词可以作为名字,就这么又找到了“允正”这么个名字,这时的打算是使用“允正”、“允平”、“允圆”(女孩名)作为名字的。

这个之后又找了一些,但是始终没有定下来到底用哪个,结果儿子提前两个礼拜出生了。本来计划在癸巳年出生的,结果壬癸年就出啦了,原来老婆盘算的生辰八字五行啥的也不对了。在出生后更加努力的想名字,还得满足老婆希望名字里面有“火”属性的字来配上生辰八字。之后又查了一堆乌七八糟的汉字五行的网站,只有一个网站觉得很不错的,不像其他网站那么扯,这个网站有很多台湾人的名字的流行度和关联的数据,可以很容易的查找到台湾那边起名字的一些规律和可能的名字搭配。

“止正”这个名字是老婆说要“火”属性的字之后特地查的,我把号称属“火”的常用字给人工看了一遍,找了一些自己喜欢的,然后再根据这些字来搭配其他的声调,这个方法找出来了一堆的名字(当然不一定很好),比如“品正”/“品圆”/“品则”(这个也是我严肃考虑过的名字)、“显扬”、“方远”、“中泽”、“登延”等等,再最后经过了几轮的筛选我还是觉得“止正”这个名字比较好,不过老婆和我妈其实觉得“方远”读起来比较顺。

关于这个名字的含义,其实可以解释成很多含义:

  • 举止端正,很显然的一个含义
  • 停止正确,也即不正,也很显然的一个含义,对于这个解释,我也挺能接受的,有点小不正经也还好,原来考虑“品正”这个名字的时候,最怕的就是叫了名字叫做“品正”但其实品不正:(
  • 止于正,有点佛法里面的依止正道的意思,我在网上查了下“止正”,基本查不出什么含义,倒是发现福建武夷山有个庵叫做“止正庵”
  • 我自己的一个解释是这样的,止和正很相像,差一点名字就变成了正正,正正表示十,很完满的样子,止正是九,离十差那么一点,但是也挺不错的,不用追求极端。自己想想也觉得真是相当理科生的一个解释

另外,由“止正”衍生出来的名字我也想好了,如果是个男孩就叫“止匀”,如果是个女孩就叫做“止圆”,当然,这一切得建立在还有一个孩子的基础上。

打了医学出生证明那天才把这名字给最后敲定,也算是了结了一桩大事,希望以后儿子会喜欢这个名字,嘿嘿嘿

一些链接:

Advertisements

l2tpvpn puppet module for Ubuntu

In programming, ubuntu on November 10, 2012 at 11:31 PM

之前用Microsoft的MSDN订阅里面附带的Windows Azure的额度建了个Ubuntu的服务器,主要就在上面搭了一个L2TP的VPN服务用来翻墙。SSH tunnel倒是很容易翻墙,但是iPad和iPhone之类的设备没办法直接用SOCKS的代理,所以只好整了这么个VPN来翻墙,Mac上用起来也很方便。

在11月1日凌晨的时候微软忽然发邮件说MSDN带的Windows Azure额度上限到了,微软自动关闭了Windows Azure的服务。我确实是设置了超出额度就自动停止的条件的,所以预期下个月能够自动恢复。到了11月1日中午的时候,收到了额度恢复的通知邮件,开始没太在意,觉得是预期中的事情。不过后来使用VPN的时候发现没法连接上了,再去Windows Azure Portal里面看发现原来创建的两台虚拟机都不存在了,这个完全出乎我的意料,服务停止居然把数据都一下删掉了。刚好又临近十八大,一堆网站都被封了,于是只好考虑重新搭一次VPN。

之前主要是参考「Ubuntu下为Android/iOS搭建L2TP/IPSec VPN代理服务器」搭的VPN,再做一次当然也没啥难的,只是觉得很没意思,最后考虑这次用Puppet来自动化这个过程。以前写过些小的web app,都需要涉及搭一些环境来部署,碰到过好几次由于环境造成的问题,后来看到过Puppet这类的工具感觉很适合用来解决这类问题,这次借这个VPN的搭建顺便学习下。

用下来发现Puppet还是一个不错的产品,文档写的也比较好,我主要就看了Learning Puppet这个文档,之后具体用的时候参考了下Puppet的Type Reference就完成了这个l2tpvpn的Puppet module。前后大致一共花了20个小时,最后其实还没做到开始计划的一条命令行完成整个部署的程度,不过对Puppet有了个大概的了解,同时整个搭建VPN的过程大致简化到了一个十分钟的过程,其中大概还有五分钟是用在等待Windows Azure Portal的操作上面的。

最后剩余的一些自动化工作有些繁琐,也没有什么太大干劲去完成,就简单写了个文档描述了一下,所有的东西都丢到Github上面去了,https://github.com/niyue/l2tpvpn,以后如果要在Amazon EC2或者Windows Azure里面搭这么个环境应该都是非常容易的。这个Puppet module还是很简单的一个module,主要用来学习了。有些服务和文件配置的依赖的顺序什么的没有太仔细推敲,除了client/server的配置,基本也算把使用Puppet的整个流程走了一遍,几个部署的时候需要的参数都自动获取了,基本只要填个VPN的用户名密码就可以了。

重新建虚拟机的同时还顺带用iperf测试了一下家里连接到Windows Azure的东亚和东南亚数据中心的带宽。大概查了一下,东亚的数据中心应该是在香港,东南亚的数据中心是在新加坡,很不科学的手工测试了几次,iperf出来的结果差不太多,连接到两个数据中心里面的虚拟机都是大约600~800kbps的带宽,感觉连到新加坡还略快一些。

总的来说:

  1. 以后可以尽量多的使用Puppet来管理配置,越复杂的配置以及越长期的配置管理收益越大
  2. TODO: 使用Puppet来自动化管理更加复杂的配置文件,Puppet + Augeas, http://projects.puppetlabs.com/projects/1/wiki/Puppet_Augeas。目前的l2tpvpn为了能够达到idempotence,对/etc/ipsec.conf这个文件的修改可能会覆盖旧有的其他的修改,像我这种个人使用就搭一个VPN的情况不会有问题,但是如果更复杂的系统里面可能就会有问题
  3. Vagrant, http://vagrantup.com/, 看起来有点意思,以后有机会可以试试
  4. 比起Amazon EC2的console,Windows Azure Portal的性能真是弱爆了,创建新的虚拟机和添加新的endpoint感觉比Amazon EC2里面的操作都慢了一个数量级
  5. 终于能在十八大期间继续VPN了 🙂

中兴F420

In life, other on August 8, 2012 at 4:00 PM

今天上海刮台风,躲在家里算在家工作,结果一不小心又岔开思路去折腾了一上午的路由器。

之前好久家里终于改了电信的光纤,当时给了一个中兴的A10 F420光猫路由和一个TP-LINK的TL-WR700N无线迷你路由器。TP-LINK的无线路由器设计的还挺好看的,像Apple的Mega Safe电源适配器。不过用了一段时间发现电信在设备上做了限制,每次最多只能4个设备连,随便算算家里能连Wi-Fi的设备就有8个(两台台式机、一台Macbook、两个iPhone、两个iPad、还有一个Wii),偶尔公司的电脑还会带回来。虽然几台电脑一般不会一起用,但是iPad和iPhone基本都是一直开着的(没法连接的情况在买了iPad之后尤其明显),所以这年头4台设备的限制感觉就像电信在给自己找麻烦(我打了老半天客服还叫了它的工作人员上门)。后来折腾了一阵后发现限制其实在TP-LINK的那个路由器上,光猫路由并没有这个限制,所以在光猫路由后面又接了一个自己的路由器算解决了问题,不过自从我知道那个光猫也有一个特殊的管理员密码可以做一些特殊的设置之后,心里就觉得很不爽,老觉得电信在想方设法阻挠我自由使用宽带服务。漫长的一个折腾光猫的过程就这么开始了。

1) 看到网上有人说F420是有开telnet的,自己试着连了一下,发现网上说的用户名密码不对,自己随便乱试了一个root/root居然还真连上了。

2) 连上之后看到了熟悉的命令行界面,我觉得大概没多久就能搞定了。结果发现F420上面的系统是BusyBox,1.01版的,经过定制之后,只有很少的命令能够使用,连vi和mv之类的命令都没有。其实我看了下,电信发的光猫里面的这个BusyBox的版本,连个正经能用的编辑器都没有,我只能在命令行里面cat来cat去的,简单的文件要改还能echo一下,稍复杂点的看也不好看也基本没法改。find和xargs也没有,导致grep也没太大用,最后只能cd+ls+cat到处瞎逛。

3) 后来有次发现系统里面居然还带了一个vsftpd,可以启动ftp的服务。不过里面带的vsftpd配置和其他Linux系统里面的不太一样,启动之后一直无法登陆进去。看了一坨的各个Linux上vsftpd的配置文档和其他一些人的配置,都没搞懂到底怎么让这个vsftpd能够正常访问。

4) 以上3步断断续续就折腾了两个多月时间(当然只是有时候心血来潮的时候会去折腾一下)。今天上午折腾的时候发现加一个莫名的-s的参数启动vsftpd就可以了,其他所有配置都没法生效。

5) 登陆进去高兴多没多久发现Cyberduck没法从FTP下载,但是居然可以上传,也不知道到底是什么权限问题。BusyBox里面连chmod也没有,真是有点无法下手。又捣腾了一阵换了一个FileZilla来连FTP,FileZilla里面的文件”Download”还是失败,但是“View/Edit”居然可以用,我对FTP到底咋工作的真是完全不了解…立刻把FileZilla的默认编辑器换成Sublime Text,至此终于能用上个称手的编辑器来查看和编辑文件了。

6) 看了一大堆的配置文件,确实发现/etc下面有个db_default_Jiangsu_cfg.xml里面有telecomadmin和它的密码,不过db_default_Shanghai_cfg.xml里面却没有。网上确实有一堆的说法,不过估计电信发放的路由器型号不太一样,而且相同型号里面的软件版本又不一样,大多说法看起来都没用。目录树下面有一个/userconfig/cfg/db_user_cfg.xml看起来应该是存储这些设置的地方,不过这个文件其实不是xml文件,而是一个加密处理过的二进制文件。之前的一些方法包括直接查看这个文件、或者对文件内容用base64解码都没有用了。在我家的这个F420里面,这个文件是一个文本文件,但是里面的内容都是16进制数,相比同一个目录下没有经过处理的db_default_cfg.xml,大概只有1/3的体积。折腾了一阵也没折腾出来,后来放弃了这条路。

7) 之后发现网上的另外一个方法能够奏效。修改/home/httpd/login.gch这个文件就可以了,是光猫路由的管理界面的代码,应该是个cgi的脚本啥的。应该是电信内部有人搞出来的吧,调用了一些很神奇的API之后直接可以查找到telecomadmin这个用户的密码。中国电信据说是会动态修改这个密码的,不过我也没太深究它到底是直接从本地加密的那个文件中查找的还是远程从电信的数据库里面查找出来的。

8) 用这个用户名密码登陆进去发现F420只是一个有线的路由器,没有无线功能,所以要想用Wi-Fi的话后面总是要接一个无线路由器/AP的。和别人帖出来的F460不一样,管理界面里面也没有关于最大用户连接数的限制,根本没有WLAN的管理(其实要说有的话应该就是4,因为只有4个有线的接口)。还有些DDNS什么之类的应用,感觉还有些用,但管理配置界面实在太差,根本不知道要填的到底是什么东西。到这里折腾基本完毕,4-8步骤又花费掉了近一个上午的时间。

其实这次最后没折腾出来什么结果(本来希望能够开启F420的无线功能然后不用另外一个路由器的,结果发现根本没这功能),但还是简单小结一下方法,指不定以后换个新的光猫还能用上:

1) Log into your modem (router), a BusyBox

telnet 192.168.1.1 (your-router-ip), root/root

2) Start FTP in BusyBox

/bin/vsftpd -s &

3) Connect to FTP using FileZilla, root/root (or anonymously)

4) Back up /home/httpd/login.gch

cp /home/httpd/login.gch /home/httpd/login.gch.bak

5) Navigate to “/home/httpd/login.gch” with FileZilla, “View/Edit” that file like the patch below, and then upload the saved edition back to your router.

--- /home/httpd/login.gch 2012-07-03 14:05:16.000000000 +0800

+++ login.gch 2012-07-03 14:03:37.000000000 +0800
@@ -152,6 +152,17 @@
set_language("langcn.conf");
langclass = "login_title_centeren";
}
+var CK_HANDLE = create_paralist();
+var login_name = "telecomadmin";
+set_para(CK_HANDLE, "Username", login_name);
+qeury_list_bycond("OBJ_USERINFO_ID", "IGD", CK_HANDLE);
+destroy_paralist(CK_HANDLE);
+CK_HANDLE = create_paralist();
+var CK_IDENTITY = query_identity(0);
+get_inst(CK_HANDLE, "OBJ_USERINFO_ID", CK_IDENTITY);
+var now_pwd = get_para(CK_HANDLE, "Password");
+now_pwd = delMoreSlash(now_pwd);
+destroy_paralist(CK_HANDLE);
%>
<head>
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
@@ -239,4 +250,5 @@
</script>
</head>
<body onload="onFocus();">
+<div><%=now_pwd;%></div>
<div id="container">
6) Login to your router, http://192.168.1.1, the username is ‘telecomadmin’, and password should be displayed in the upper left corner of login page.
这里是我觉得最有用的两篇文章,讲的虽然都是F460,但是在我这里都适用: