shell下操作json
by hewig on March 8, 2012
最近需要在shell下操作json,当然正常情况下直接python -c “import json ooxxx”就ok了。考虑到脚本会被部署到不同的客户环境下,python版本会有些差异,如Mac 10.5默认的python版本是2.5,10.6默认的是2.6,10.7默认的是2.7,而貌似json库是在2.6才引入的,2.5的话只能用simplejson之类的第三方库。 索性搜索了一下,看有没有直接在shell下直接操作json文件的方法。
其中JSON.sh是完全用shell实现的json parser,似乎不能做到添加/修改/删除原有json的结构。而jshon是用c实现的,依赖于jansson,使用MIT协议,目的就是为了替代由grep/sed/awk写的fragile adhoc parsers,相比之下python/perl/ruby显得过于笨重了。
至于使用,参照jshon的文档,拿个json文件试验一下就知道了,对shell很友好:从stdin读入,操作,输出到stdout,和其他的*nix文本处理命令结合使用也很容易。
下面说说我的使用场景,向json文件插入对象,然后必要的时候容易的插入的对象删除。比如:
$ cat test2.json
{
"nbndkplefmmhmcmfjanjaakhhkiegogd": {
"external_crx": "extension.crx",
"external_version": "1.0"
}
}
插入对象的话,执行:
$ ./jshon -n {} -i "key" -e "key" -s "value1" -i "key1" -s "value2" -i "key2" -p < test2.json
{
"nbndkplefmmhmcmfjanjaakhhkiegogd": {
"external_crx": "extension.crx",
"external_version": "1.0"
},
"key": {
"key1": "value1",
"key2": "value2"
}
}
-i是insert的意思,-n表示新建非string的对象,如object,-s表示是新建string,-e,extract,我理解为进入某一级,-p,则退回上一级;删除的话,会简单一点,指定key就好了,如
$ ./jshon -d "nbndkplefmmhmcmfjanjaakhhkiegogd" < test2.json
{}
由于jshon依赖于Jansson,如果能将jansson静态链接进jshon,只需要带一个文件就好了,方便一些;这在Linux下很容易做到 只静态链接Jansson,其他的还是动态链接。如:
gcc -o jshon jshon.o -Wl,-Bstatic -ljansson -Wl,-Bdynamic
但在Mac底下就不太好做,apple提供的ld根本就不认识-Bstatic或者-Bdynamic这样的编译选项,没办法只好动态链接了,但是Mac底下的动态链接只会搜索特定的位置,如/usr/local/lib,只好使用otool和install_name_tool来修改之,让jshon从当前路径中搜索libjansson.4.dylib,具体可以参考霍叔的这篇如何使用第三方的dylib。
顺带提下,在64位机器下如果需要编译32位版本jshon的,需要在编译jansson的时候指定为i386. 即./configure -arch i386,编译jshon的时候也要给CFLAGS和LDFLAGS加上-m32 -arch i386的参数。
修复win7图标异常
by hewig on March 4, 2012
某天突然发现桌面图标异常了:
清理了桌面图标缓存也没有效果,想到桌面图标基本上是注册表HKEY_CLASSES_ROOT\lnkfile控制,报着试试的想法,备份了下HKEY_CLASSES_ROOT\lnkfile的所有键值,然后删除之,重启explorer。很好,桌面图标都打不开了,再重新导入刚刚备份的reg文件,再重启explorer,奇迹般的好了~
Linux下安装Dropbox
by hewig on March 4, 2012
上周想在Ubuntu底下接着写一个未完成的shell脚本,直接扔进Dropbox里了。回来的时候发现笔记本上的Ubuntu并没有安装Dropbox,话说以前我一直用Ubuntu One的,从Dropbox官网下载了对应的deb包,安装完运行的时候总是提示无法连接到服务器,设置http代理、ssh代理,改host均无效(也有可能是我姿势不对)。后来在Fanxi的提醒下找到了原因。
Dropbox for linux其实只是nautilus-dropbox,并不完整,nautilus-dropbox运行之后需要从Dropbox的网站下载缺少的binary文件,而始终无法连接不到服务器的提示其实是指无法下载这个依赖文件(dropbox-lnx.x86.xxx.tar.gz). wireshark抓包截图说明了这一点,链接直接被RST了,原因嘛。。
知道这一点就好办了,根据wireshark抓包的那个Get请求手动从Dropbox网站下载这个dropbox-lnx.x86.xxx.tar.gz,然后解压之,注意它是个隐藏文件夹.dropbox-dist
然后mv到~目录下,dropbox start -i 应该就可以运行了.
已经在同步了~
The Review of Y2011
by hewig on January 2, 2012
过去的2011年,关键词是Change:
0.School→Society
1.QA Intern→RD
2.TMMS→Safesync→iTis
尽管公司的文化一直提倡Change,但是过于频繁的变动问题更加明显:时间都消耗在了进程的切换上。而且大部分是被动变化,接受和适应还要一段时间。
缺少主动的变化,缺少主动的记录,缺少回顾与反省,所以回想起来,过去的一年显得很不充实;几乎没写过什么技术贴,有的只是无病呻吟式的抱怨吐槽贴,blog里还躺着好几篇草稿,RIL里都超过50页;经常找不到看过的东西,写过的代码想不起来。
聊胜于无,权当记录吧:
2月份,找了一个星期总算租到了还算令人满意的单室套
4月份,绿岛十年;GoAgent发布了,那时我还在用Wallproxy,哈哈
5月份,基本是在写毕业论文和demo,速度之慢让人发指,我找到了我拖延症的最大的病因:并非是完美主义,而是看的过多带来的虚假感+没有系统、持续学习技术使得解决问题的无力感+不愿意思考复杂问题的逃避感。
6月份,我很水的混毕业了,毕业设计是用python和js写的一个小demo。然后是大家各奔东西,唐同学先我一步准备远赴美帝求学。连云港之行
7月份,正式入职,两个星期的入职培训。
8月份,正式参与对日本OEM的一个项目;GoAgent支持了iOS
9月份,项目做到beta时公司进行了调整,项目TOI给日本了
10月份,经过半个月的等待,被Transfer到了Safesync Team,有了真正意义的Mentor,开始了Mac编程,练手写了个第一个简单的GUI程序,GoAgent Mac
11月份,参加了公司的EngineerCamp,练手写了相应的iOS版Handbook,哈,完全是巧合编程;GoAgent支持了webOS
12月份,项目再次调整,被Transfer到了iTis Team;第一次海购,在亚马逊购买了Kindle DX
乏善可陈吧,我也这么觉得。。
2012年,如果世界没有毁灭,我希望做到:
0.减少GReader的订阅和阅读量,减少SNS的使用,多进行深度阅读(Kindle),阅读有价值的内容而不是浮光掠影的表面文章。
1.继续XJump计划;多整理Wiki,固化知识;系统学习技术,多练手,多写Blog;
2.发起或参与新的开源项目
3.进行一次远足旅行
4.提高英语听力+写作
暂时只想到这么多吧,话说Markdown写blog真心爽啊
HP Pre3使用手记
by hewig on October 23, 2011
HP Pre3入手了好几天了,于是有了这篇blog。
为什么是HP Pre3?
用了4年的nokia 6120c,也该换了,那为什么选Pre3呢,惠普已经撒手不管呀?原因很简单:1K5左右的非Android,非iOS,非Symbian,非山寨的高性价比的智能机去哪找?主要参数如下,详细参数在此。
1.Qualcomm MSM8255 Snapdragon 1.4 GHz
2.8GB storage, 512 MB RAM
3.5MP Camera
4.480 x 800 3.58 inches touch screen
5.QWERTY keyboard
6.WebOS 2.2
如果以后RIM的QNX、Nokia N9价格合适说不定也会换过来玩玩。下面开始上图:
传说中的WebOS
Pre3总体来说体验不错,正常情况下操作十分流畅,WebOS优雅的通知方式,便捷的手势区操作,卡片式多任务,Just type Search,手感很好的QWERTY全键盘,并且整合了Gtalk,GMail,Google Contacts和Goolge Calendar,并且能够备份到HP的server上。这些都是它的优点。缺点就很多了,最大的缺点是在细节的处理,iPhone 4S号称的两百多项改进中,不少都是细节上的,而WebOS很多”基础“的应用,如输入法,地图,浏览器等都差强人意,实在谈不上好用:
1.WebOS基于webkit内核的默认的浏览器,在acid3的兼容性测试得分只有94,而mobile safari满分通过,而html5测试得分195,远低于mobile safari的296。很多Google Mobile应用都跑不起来,加上尴尬的User-Agent,许多网站都不自动跳转到相应的mobile页面。
2.默认无法设置代理,而且默认的VPN只支持IPSEC和Cicso两种,不支持最普通常见的PPTP和L2TP;要不把GoAgent移植上去一下?
3.没有统一的设置中心,很多选项甚至需要patch才能启用。
4.默认只能改来电的铃声,短信的铃声无法更改,需要patch。
5.更换主题需要重启,而Pre3启动非常慢。
6.本地化做的很不好,没有靠谱的输入法,SIM Toolkit显示乱码。
7.应用太少,而且很多应用操作方式迥异,一致性差
8.性能有点糟糕:默认的浏览器在加载很多图片的web网页会导致整个系统hang住;GTalk一次性接收数十条消息也会hang住(tweet.im),下载大文件(如300mb的navit的地图)时也会导致系统hang住,这个时候就只能拔电池,WTF..
9.提供的sdk有点寒碜,可能是由于js或者enyo、mojo框架的限制,感觉webos的应用能做的事情很少,这一点和iOS和Android没法相比;
10.不能Lock Screen Rotation。
11.音频解码支持的不全,有些mp3无法识别播放
。。。
。。。
其他的我已经无力吐槽了
。。。
。。。
使用小Tips


Wifi media sync,webos“也能“无线同步了
拿到Pre3后,第一件事情应该是安装preware,这个类似Cydia,不过webos没有越狱的概念?然后安装Impostah,在Activation下创建个Profile,这样就能进入HP App Catalog了。不过很多中文的应用,包括输入法只能在煮机网、92webos,胖鱼等论坛或博客下载,这时候WebOS Quick Install就派上用场了。
WebOS的包文件是ipk,毕竟是基于linux的系统,所以类似deb。
一些快捷键比较方便:
手势区 + A:全选当前文字
手势区 + X:剪切选中的文字
手势区 + C :复制当前的文字
手势区 + V:粘贴当前的文字Option + Sym + P:全屏截图
Option + Sym + R:重启WebOS(软重启)
Option + Sym + U:在连接电脑时启动U盘模式
Option + 点击某个程序图标:删除该程序Option指左边的白色方块键盘。
最后的最后,如果你不是不折腾会死星人,最好不要入手,要不然你会后悔的。
GoAgent小结–技术篇
by hewig on October 8, 2011
2011/12/8 Update
具体实现细节,请访问goagent-dev之goagent做了哪些改进?
GoAgent 一直号称简单快速,不是没有道理的。proxy.py不到800行的代码实现了:跨平台运行、多appid负载均衡、RangeFetch、支持NTLM、支持内网代理、支持ipv6、支持php fetch等诸多feature,其考虑到的一个重要原则是依赖尽可能小,这体现在了:
0.代码即程序,Windows下绿色运行,连GAE的sdk都不用装,这得益于先进的打包技术。
1.实现基本上都是标准库,openssl库也很常见,移植容易。
2.fetch.php对服务器端的要求较低。需要preg/zlib/curl模块支持,前两个属于标准模块,curl也是常见模块。
3.合理的默认值,只需要配置appid就可以用了。
4.不支持gfwlist
GoAgent 另一个原则就是追求速度,不断在优化,看看ChangeLog就知道了:
0.压缩传输,不支持强加密,因为连GMail都被天朝黑客入侵过,保证local到AppEngine的绝对完全并没有太多的意义。。
1.再如之前整合了gevent或者线程池,为了速度后来又拿掉了;
2.为了加快启动速度,将读取proxy.ini 放入了全局变量中,代码因此丑陋了;
3.修正了socket关闭速度慢的问题;
4.多次重新打包python解释器(proxy.exe);
5.简单到极致的GUI,在启动时完成大部分初始化设置并减少if的使用;
6.为了优化php fetch的规则匹配,干脆将其和GAE的监听端口分开;
GoAgent的优势在于在客户端做了大量工作,由本身维护session的状态, 因为GoAgent 既是Client又是Server,本地相当于一个http server(采用了BaseHTTPServer),同时又是Client端,与部署在AppEngine的fetch.py进行通信。所以当我得知有些代理软件使用mysql来维护代理服务器的session状态时,觉得有点惊讶,明显不合理了嘛。另外基于GAE的代理最快的就是直连北京google了,因为Google的很多服务都是云服务,所以一个IP能够提供多种服务,其中就包括AppEngine,因此访问google自家的服务速度很快,而GoAgent 从一开始就是这么做的。
关于Porting的问题,比如支持iOS,我认为移植平台本身更为容易,所以才有很多人打Android应用的主意,比如最开始的Alien Dalvik,号称让MeeGo支持Andorid 25W应用的ACL for MeeGo,裁剪VirtualBox的BlueStack,一直不温不火的Mobile Virtualization,尽管这些目前看来还不太实用,比如BlueStack,我就挺好奇它如何解决ABI不同的问题,但是都是移植平台的例子~
咳,有点扯远了,所以支持iOS最关键的无非就是:1.交叉编译python2.6 for iOS 2.编译pyOpenSSL for iOS。其他的都是如何让设置变得简单,操作简便而已。顺带提一句,pyOpenSSL和SBSetting GoAgent toggle都是在我的ipod上编译的,越狱开发其实门槛也不高,只要搞定了toolchain就ok。
最后再八卦几句,GoAgent 最开始是托管在github上(其实现在也是),后来为了不”牵连“github,迁移到了Google Code上,在首页上用了一个空的bit.ly 链接指向了真实的地址,原因也是如此;GoAgent 的名字是因为不想再用已经泛滥的proxy。。
GoAgent小结–统计篇
by hewig on October 6, 2011
GoAgent 发布快半年了,打算写两篇小结一下,另一篇会讲技术相关的内容~
如果没有最开始的随意发布,GoAgent 或许还只是个内部使用的小玩意,这是当时的新闻:

而现在,GoAgent 在Google Code上star数超过了850,issue数超过了1000,
这实在是有点意外,不信可以看看上千的都是什么project,CyanogenMod也不过860而已:
在Google Trends搜索流行度已经超过了老前辈gappproxy。
和最流行的目田门相比,差距也有变小的趋势。
根据Google Analytics 最近三个月的统计,GoAgent 首页PV有23W,独立访问才3.8W,可以推测除了作者之外,有人也每天刷GoAgent的首页。。中间的peak貌似是宣布支持iOS的时候,九月底的另一个peak貌似是支持php的延后效应。
GoAgent 的下载数和用户数很难估计,因为github并没有下载的统计,很多人更新GoAgent也是git remote update这种方式,而且下载了并不代表就会使用。几万用户估计应该有,分布在“全球”。。
很显然,Windows和Chrome用户是主流。
GoAgent iOS好一点,提供了Google Code和cydia源的下载,结合Google code和这个简单的脚本进行统计,GoAgent iOS大概下载了1500次,而python2.6下载2200次左右,用户数应该不到1千。。
GoAgent 的搜索流行度得到了Google Analytics数据的支持,一半以上流量都是通过搜索而来,说明在首页放置下载链接和Google +1是相当正确的。
顺带提下,还有个ezproxy的事情,具体可以看v2ex的帖子和这个链接,我根据淘宝显示的最近成交记录估算了一下,那个哥们利用GoAgent赚了大概1000块,不过这也从侧面证明了GoAgent的速度和可用性,都可以拿来卖钱了~
jsToolbox Update
by hewig on October 3, 2011
把jsToolbox改成了快捷键触发的方式(Ctrl+Alt+Shift+o),默认是隐藏的;添加了几个bookmarklet, Faveous,Mark之,Spool 最近的几个不错的收藏、整理、阅读网站
安装路径:http://userscripts.org/scripts/show/105562
由于Vimperator的关系,快捷键都被它hook掉了,所以使用得先ignore它,Chrome上面的类似Vimperator的extension的做法应该也是user.js这种,突然觉得好没有意思,应该是不会再更新了:(,还不如写写过滤新浪微博垃圾信息的脚本。
XJump计划
by hewig on October 3, 2011
很久没有更新blog了,之前的一条tweet已经抱怨过了,一来是很多web应用确实很方便实用,二来是没有什么值得可以写的东西。但是最近的一些变动让我产生了这个为期一年的XJump计划,嗯,名字明显山寨了《周刊少年Jump》,具体来说:
1.多写blog:锻炼写作,整理记录,严肃思考
2.多参与开源项目:server side为主,增加自己的选择面
3.多读书:主要是晨读
当然了,这些都是建立在较高的执行力的基础之上,用术语来说叫持续交付。自实习、工作以来,一直觉得自己的提高不够速度,还经常发生panic的现象,这种感觉相当不好,加上最近:
1.MeeGo彻底挂了,和一个没听说过的LiMo Foundation的另一个项目合并成了Tizen(天真?)。。(好吧,这只是一个感慨而已)
2.换Team了,工作转向了Mac,Android实际做了不到3个月的时间,对Android有点无爱,具体表现在不会主动去折腾,Java高级特性一个没学。Mac的话还可以顺带折腾下iPhone越狱开发,或者为goagent写个设置用的App。
3.多次被“你到底想做什么”这个问题所问住,不够专注,没有强悍到主动选择的地步,有空得把个人wiki好好整理一下。
嗯,大概情况就是这样子,由于之前的域名神经质的被关键词了,于是我新注册了kernelpanic.im个域名,倒过来读很好记,而且和博客标题很匹配,还配置了一下Cloudflare,使渣DH主机访问速度也还可以接受,当然挂在Linux Tech Club的VPS上肯定会更快,因为我帮忙迁移到东京机房去了~
JSToolbox
by hewig on June 26, 2011
最近写了个Greasemonkey脚本jstoolbox,将一些bookmarklet(爱库,QQ输入法,有道翻译,Instapaper)做成了一个下拉列表,在页面顶上就能点击使用。为什么要多此一举呢?点书签不是很方便吗?原因其实是在我使用Firefox的时候,只会保留地址栏、Tab栏、和右下角的扩展栏,没有书签栏;而且我多年的收藏经验表示,我最讨厌点击书签了,收藏夹里的书签基本上没点过,一是数量比较大,组织的麻烦,二是收藏夹每次打开都是密密麻麻的,根本不想细看。直到我发现了Fastdial,不点收藏夹的情况才有所改观。快速拨号这个功能最早是opera发明的,Firefox上也有很多扩展,但是都用的不太顺手,Fastdial有点不一样,很简单,如同它的名字一样,打开速度很快,支持文件夹的功能,生成的缩略图基本上不看标题也知道是什么网站,而且对应到收藏夹里就一个Fastdial的文件夹,所以我就把Fastdial当成收藏夹来用了。
这个问题一直存在就对了,不过真正让我写脚本的原因是爱库的Firefox扩展,爱库网是一个用于整理(collect),组织(organize),分享(share)任何互联网上面的网站、图片、视频等资源的在线服务,并且致力于让用户发现(discover)更多有意思的互联网资源。而且爱库网收藏的内容都以缩略图的方式来展示这一点我很满意,为此我还弃用了delicious。安装爱库的Firefox扩展后,它会hook住新Tab的打开页面,效果是不错但是这样一来Fastdial就不能用了;而且必须要到菜单->工具才能点到爱库的选项。因为菜单栏一般都是隐藏的,所以就相当不爽了。好在爱库提供了一个bookmarklet,顺带我就把其他的一些我觉得有用的bookmarklet给加进来了,代码也很简单,把li元素createElement出来,然后绑定上对应的function,最后添加到当前页面。因为bookmarklet其实就是浏览器执行一段js,所以那些function其实就是bookmarklet。目前已知的问题是在一些web mail里,如网易邮箱会被insert多次,所以把网易邮箱添加到了exclude里。
效果图如下:
鼠标移到JS-Toolbox会出现一个下拉列表,点击即可。
后续可能的工作:1.添加别的功能,现成的bookmarklet或者其他的js小工具。2.修改代码使得易于修改配置,可以选择哪些打开,哪些关闭。
































