All Stories

Google Reader客户端

  最近有很认真地在写一个Google Reader客户端,仍然是使用的Qt,一切为了跨平台嘛。之前Ninayan用QML写的UI,虽然能做出一些比较炫的效果,但没有一个优秀的美工,再炫的效果最后得到的都是不好的用户体验。于是这次使用了传统Widget来做UI,感觉还不错,中规中矩的,源代码也放在github上了。   到现在为止,Google Reader的客户端功能基本上实现了,可能还有些小细节需要修改。前两天因为工作上的关系,找了点资料在看怎么提高socket的效率,公司那个产品全部是用的select模型,貌似Qt的QNetworkAccessManager类也是用的select,这个东西的好处在于大多数的系统都直接支持,思路也简单,但是对于追求高吞吐率的情况下,就得用各个系统内核各有的一套东西了,比如Windows下得用完成端口,Linux下,2.6以后版本的内核得用epoll/AIO,BSD/Mac下又有kqueue等等,可谓是八仙过海各有神通啊。然后我就又找到了asio,这个库以前用过Boost里的那个版本,没用好,当时的感觉是资料太少了,性能太差了,后来也都是尽量避开自己写socket相关的代码,直到后来用Qt中的QNetworkAccessManager。这两天抑制不住地想把QNetworkAccessManager改成用asio实现,以达到各平台优化的尽量大吞吐率。忍住!   基本功能完成后,我就开始想着把程序改成插件架构,以插件的形式支持从不同的源获取信息,比如Twitter,Facebook,国内的微博等等,也以插件的形式支持把当前内容分享到不同的宿。其实从功能上来说,跟Ninayan是有很大重叠的,毕竟当时写Ninayan也是为了做一个信息获取工具,只不过从UI的设计上限制了操作方式,最终在用户体验上会有很大的差别。

想买iPad Mini和Surface

  iPad Mini和Surface都快要发布了,各种消息满天飞,我最关心的当然是价格了,因为作为当今世界上做软件系统最好的两家公司,他们的产品足够吸引我的注意力!   不过iPad Mini最低配的价格貌似还可以接受,Surface的就远远超出我的预期了。叹气啊!但是很可能过段时间仍然咬咬牙上了,再托阿菲帮忙从美国带吧,估计Surface至少比国内买行货少花费500人民币吧。

又败了个Kindle DXG

  之前买了个二手的Kindle4,体验太好了,无论是E-ink屏,还是推送功能,都很舒服,唯一的不足是看扫描版PDF即使切了白边仍然字体过小,如果横屏来看又觉得操作不是很顺手,于是纠结了一阵后,看到有比较便宜的卖全新的DXG的,就趁刚发工资咬牙买了。   昨天早上在taobao拍的,今天下午收到货,然后迫不及待地开箱。没有WIFI就不能免费推送,这是一大遗憾。官方皮套看起来很厚实,装了几本扫描版PDF进去,仍然感觉小了点。官方系统默认不支持中文,书名中带中文的在目录中也不能正确显示,这是点小瑕疵。   忧郁啊,赚的钱远远不够花。这两天遇到瓶颈了,写程序写啥啥不会。想给Ninayan加上链接保存到Readability和发送到Kindle的功能,想想多简单的特性啊,居然遇到很大阻碍。

装了Mint

  买硬盘有一段时间了,当时的想法是可能要做Linux平台的开发,所有自己家里的机器上也得正儿八经地装个Linux某个发行版,于是纠结了很久,终于在京东上花了总共780块大洋买了个WD的绿盘2T。结果把硬盘装入机器后,只是分了十几个分区,就再也没动静了。   后来过了大概2、3周吧,实在对自己鄙视得受不了了,翻出两个8G的U盘来,一个是花了20块大洋从淘宝买的,谁料想过了没多久公司(已经是前公司了)又因为十周年纪念每人发了一个8G的U盘。于是从网上找资料看了一下,在Windows系统下用一个叫Win32Image Writer的程序把Linux发行版的ISO镜像写到U盘里,就可以从U盘启动安装了。   先是装了个Debian 6,用的GNOME,装好后发现屏幕闪得厉害,估摸着是显卡驱动的问题,据说ATI的显卡Linux就是支持不怎么好,我的是Radeon HD 4540,从网上找了一圈各种解决方案,试了各种配置和开源闭源驱动,都没效果,很失落。本来对Debian的印象很好的,就是一种运行速度快,而且稳定的发行版,因为曾经在公司用VirtualBox装了LinuxMint和Debian同时编译clang,发现在Debian下要快不少。可是现在的闪屏问题使得这个系统处于基本不可用的状态。后来我还试了换GNOME为KDE,果然没用。于是知彻底绝望了。   因为Debian的闪屏问题搞不定,于是只好试着装装Ubuntu12.04这种小白发行版,它果然一装上就所有驱动都搞定了,不光是我那块显卡,连在10.04时需要自己找相同芯片其他牌子无线网卡的驱动源代码来自己编译安装才能使用的Fast无线网卡都直接驱动了。真是让人感叹果然是个适合我等小白使用的发行版。本以为问题就这样搞定了,于是下载了qt呀,qt creator呀,clang呀之类的源代码,都编译了使用。可是好景不长,不到两个星期,就出现各种问题。比如启动特别慢,在红黑屏要停留很久,一开始都以为是启动不了了,后来才发现是因为需要时间很长。再后来,各种已有的分区不能自动挂载了。虽然可以自己敲命令挂载,但终归让人心里极其不爽。到现在,居然不能关机了,一直停在关机logo界面里了。失望透顶,Ubuntu是从7.x以来,各个版本都装过的,窃以为最不稳定的Linux发行版,没有之一。   今天实在对Debian和Ubuntu失望之极,打算再换个发行版试试。之前在VirtualBox中用过不短时间的Arch,Fedora,openSUSE和Mandriva,对于Arch和Gentoo,我就担心显卡问题搞不定。对于后三者,不是很喜欢它们的包管理机制。于是最后打算看看Mint吧。以前在VirtualBox中也装过Mint,现在公司里还装着用呢,它默认不使用GNOME或KDE,而是使用Mate或Cinnamon,感觉挺精致的。在装Mint还是LMDE之间犹豫了一会儿,后来看LMDE用的是Debian的testing源,在我看来相当于放弃了Debian的稳定性这一大优势,所以还是用Mint吧。安装过程仍然一样,写入U盘可以当Live盘启动,然后安装,很快很傻瓜。而且我之前装Debian和Ubuntu把它们的/home都放到同一个分区,而且两个系统中都用相同的用户名,在Mint中也这样做,就可以直接使用以前做好的一些把配置写到/home目录的软件的配置了。   Mint用了近一天了,感觉不错,就看它能用多久吧。

入了个Kindle4

  又好久没写blog了。上上周从推友处入了个二手的Kindle4,这是个很划算的事。350元顺丰到付,成色很新,还有个山寨的皮套。拿到手后,我就爱不释手了。   首先,Kindle4很小很轻,只有6寸,而且没有键盘,一只手就可以竖握整个机器,拿起来很方便,随身携带比带书轻便多了。   其次,E-ink屏真的很赞,真的只有自己实际把玩过,才会体会到它的好。之前很多次都冲动想买个Kindle,都被自己以“我不是个爱看书的人”为理由扼杀了这冲动。这次之前是橙子拿她刚到手的Kindle4来让我玩了一下下,于是就冲动了,刚好推上求二手也便宜,就入了。E-ink的屏幕观感上很接近纸版印刷,让人看起来相比电脑,手机,平板等等觉得更类似书本,另外个好处是,我早上上班路上会拿出来看点东西,如果露天有大太阳的情况下,用Nexus S手机看小说时得把屏幕调到最亮才能看清,E-ink则不在乎这个问题,但同样的,晚上回来如果天黑光线不足,E-ink就不行了,据说可以通过配备小照明灯解决。   再次,Kindle4有很方便的推送功能,只要把指定格式的电子书作为附件发送到Amazon给分配的邮箱里,Kindle在连上WIFI后就会后台自动把书下载来。这样一来,可以实现很不错的功能。比如定时推送RSS等内容,虽然网上已经有一些免费或付费的推送Google Reader或RSS的服务,但我还是打算自己写一个。有几个原因,一是这些服务免费的一般都有比较大限制,比如Google Reader推送时间只能一天一次,顶多一天两次,推送RSS则往往对订阅数有限制。二是我想增加多一些推送的类型,比如小说更新,漫画更新,还有从SNS消息中提取的链接内容。三是推送过来的字体、排版以及插入广告之类,终归不是很舒服。因此要写这样一个程序,打算设计成一个C/S架构的应用,客户端和服务器都具有内容下载生成的功能,但服务器端可以实现定时推送的功能,客户端可以把定时推送的请求发送给服务器端。   最后想说下遗憾的事,6寸屏对于看扫描版16开或22开大小的PDF还是不够理想,我在考虑是不是再入个DXG。

第一周

  在新公司上班一周了,过上了坐地铁上下班的日子。以前每天自己开车上下班时,还有点向往那种坐公交地铁上下班的人,觉得可以在路上看到各种各样的人,还可以拿个手机或平板在路上看书。现在这样过了没几天就厌烦了,地铁太挤了,每天上下班一路会挤得浑身大汗,根本没心情看什么书,除了网络小说。   第一周干不了什么活,连产品的源代码都还没看到,说要我先写个小程序,写完了才给我看,原因是之前有个人去干了两天就跑了,他们担心源代码泄露。好吧,这次要在Linux下用socket写个C/S的小程序,但我今天突然发现他们现在的想法是不是有点问题,还是我没有彻底理解他们的需求。好吧,小公司确实是小公司的样子,感觉做事就是没条理,有点乱糟糟的,也许是以前呆的公司不是跟IBM学了IPD流程,就是跟着Microsoft的Workflow走,淡定点。   要在自己机器上至少装个Linux发行版,好好学习下Linux下的socket程序编写。是不是该去买个VPS,然后可以反向连接到公司里的Linux虚拟机上去。囧,这么大强度做Linux上的开发,居然还是只用虚拟机。

clang for Windows

  这两天在Windows下折腾clang。这东东前端是支持C/C++/Objective-C/Objective-C++,后端一般是用LLVM的。在Mac OS X上貌似用得很好,可以生成OSX和iOS的app,貌似在Linux或FreeBSD上也支持得不错的样子,不过在Windows上就纠结了。   首先,clang还是依赖gcc的crt和headers的。于是在Windows上基本上是用MinGW套件的。但是同样是MinGW,不同的人都能编译出不同的东西来,版本众多,质量也不同,貌似还是MinGW官方编译的版本最为稳定,MinGW-w64的x64版本貌似就压根编译不了clang。   众多32位版本的MinGW都可以编译clang,但是,编译出来的clang貌似就是能自举了,真是遗憾,也不知道是不是我哪里弄错了,4.4.0版本是报BFD模块中有个内部错误,4.6.3版本是在链接时报错,4.7.x版本则是编译第一个文件就报命令行参数错误。   我是在msys中编译的,值得提一下的是,它每次都要做rebuild all才行,incremental build貌似是不行的。还有就是perl中的pod2html.bat在msys中是用不了的,所以在make install时都会报错的。   最后要注意,编译clang前,需要修改下llvm\tools\clang\lib\Frontend\InitHeaderSearch.cpp中MinGW的头文件搜索路径。最简单的办法是硬编码增加搜索路径,但是这样你的MinGW和clang就只能存放在固定的位置了。我看了一下clang dev去年4月的maillist中一个thread,其他他们就是没找到一个高效低成本的方案来解决这个问题。于是我就自己用了一种quick & dirty的方案。先查找clang所在目录是否有gcc.exe,没有就找PATH环境变量中有没有,再没有就试试各个分区根目录下有没有mingw目录,如果能找到gcc.exe,就运行gcc.exe -v命令,得到target和version,这样就可能得到搜索路径了。自己写了大约200行代码,粘贴到这里了。

辞职了

  今天是在Wicresoft上班的最后一天,中午请share team的所有人去食堂吃了一顿饭,其实食堂也不便宜,原本我打算在华师大的秋实阁请的,但是暑假了华师大食堂都关门了。于是在紫竹一食堂吃了,16个人542块钱。   这次跳槽是出于两个原因,一是经济方面的考虑,对于目前的我来说,跳槽是涨工资最快的方式,另一方面是工作内容,在Wicresoft做Dynamics AX的SE工作,我的生产力极其低下,查了一下过去一年的成绩,我的产出大概连Michelle的一半都不到,这让我很忧伤,这样的状况让我连向领导提出加薪的勇气都没有。新的工作我的要求是要多做些编码,SE工作可能一个月都写不到一行代码,我觉得我写代码的能力这样下去会退化干净的。而且我一直以前都只能说会C++,熟悉Windows平台桌面应用开发,却没有一个真正熟悉、精通的领域,这次新的工作会涉及到多媒体视频、网络传输方面的内容,这样我也就有机会拥有一两个领域的专业技能和知识了。   办离职手续其实总共花了不到2个小时时间,但跑来跑去还是挺累人的。

Ainesmile,Rust,Clang

  最近Ainesmile的进展几乎停下来了,因为想到要让它支持像TextMate那样的bundles机制,但又为了避开版权问题而不能直接使用TextMate的bundles,所以就想把那些bundle的格式转换一下用就行了,于是就要写个小程序进行文件格式的转换。为了这个转换小程序更具有通用性和实用性,我就很是贪心地想让它支持在JSON、Apple PList、Windows INI、Java Properties和plain XML任意二者间进行相互转换。本来想想觉得只是个很小的任务,可实际做的时间还是有很多事情要做的,而且想来这样一个具有通用性和实用性的工具应该可以发布给别人使用,于是在包装上也做了更多点的工作,比如画图标,而且为了能在Windows和Mac OS X上都能使用,同时以为以前用过的一个Rapid XML封装更容易使用,结果陷入了无尽的跨平台的fixing中。   昨天发现一个新语言,Rust,据说是Mozilla开发来为了替代C++重写Firefox用的,现在才0.3版本,语言特性也还在快速变化中。看了半天的tutorial,发现语法上给我的感觉是很像Ruby,又有Erlang的一点点元素,而它自称是一种系统编程语言,所以从一开始就很注重与C的交互。它是一种编译型语言,有个叫rustc的编译器,现在还只能通过自己下载编译源代码来使用它。看tutorial的时候突然有个念头,这些年不断冒出来的声称解决了一大堆问题的编程语言,实际上也就是它声称的那些个领域上表现较好而已啊,C语言才是王道啊,哈哈。   在编译Rust的时候,发现它自动下载了最新的LLVM和Clang的源代码并编译好了,于是我就想再试下Mac OS X下用Clang编译下Qt,以前曾经尝试过但失败了。这次也遇到两个错误,就是返回值类型要去const修饰,gitorious上已经有patch的,但在4.8.2上没有合入,自己改一下整个Qt 4.8.2就能用Clang编译通过了。Clang在Mac OS X上基于上处于产品级的质量了,但不知道在Windows上什么时候才能达到近似的水平啊,叹气。貌似Clang对unix-like的系统都支持得挺不错的,甚至能用来编译FreeBSD内核。