Posted on 28-03-2013
Filed Under (技术) by waterlin

自从 Google Reader 说要关了以后,我就担心将来哪一天如果所有的 RSS 阅读器厂商都嫌不了钱,把 RSS 阅读器产品关了的话,那可怎么办?所以,自己动手,丰衣足食,搭建一个在线的 RSS 阅读器,还可以顺便了解一下 RSS 阅读器的原理(即知道豆瓣九点、抓虾这些站点的搭建原理),也是一举两得的事情。

仔细的 Google 寻找了一番,发现 Tiny Tiny RSS 应该是搭建类似站点的最好选择,除了有和 Google Reader 类似的在线阅读器以外,还提供一个官方的 Android 手机客户端,这不就是给我量身定做的服务么:可以在线阅读,也可以离线阅读,手机客户端同样有分享功能。Tiny Tiny RSS 的搭建很简单,有兴趣的可以在本机装一个 XAMPP 虚拟服务器这类的 php+MySQL 服务器来模拟使用一把。

Tiny Tiny RSS 是使用 SimplePie 作为 RSS 抓取引擎的,抓取回来的文章数据需要保存在 MySQL 数据库里,抓取数据的时候,需要消耗一定的流量,所以,如果你的订阅源多的话,搭建类似的站点的确是一个消耗存储空间、带宽的活。就以我的订阅为例,我大约导入了 181 个订阅源到 Tiny Tiny RSS 里,有大概 1331 篇未读文章,消耗了大概 23.4MB 的流量,同时,MySQL 空间的存储内容上涨了约 13 MiB。

当然,实际的宽带流量消耗与 MySQL 存储空间的消耗,还与你的订阅源内容篇幅有关。但是我觉得如果是 Google Reader 这种大厂商,因为太多人订阅了重复的内容,所以很多内容只需要抓取一次而不需要重复抓取多次,所以对于使用广泛的 RSS 在线阅读器,资源的利用效率会更加高,更加符合我国节能减排的大政策,哈。

另外,我仔细看了一下数据库的内容,RSS 源里的图片内容并没有被 Tiny Tiny RSS 下载并缓存起来,所有的图片都是以原网站图片的超链接形式保存在数据库里。既然没有缓存图片数据,所以我个人觉得大部分的 Tiny Tiny RSS 的个人使用者,都应该可以接受这种服务器资源开销。

如果你想在你自己的服务器上安装 Tiny Tiny RSS 这个应用来给自己提供定制化的服务,那么服务器可能会面临的大量资源与流量消耗,这是你需要提前判断好的。我的建议是,先在本地搭建一个虚拟 PHP 空间服务器,使用这个服务一段时间后,看一看流量与存储空间的消耗是否能接受,再考虑把服务部署到自己的服务器上。

最后,给大家再推荐一下 Nils Braden 开发的 TTRSS-Reader 这个 Android 手机客户端,这个客户端提供针对 Tiny Tiny RSS 的手机离线阅读功能,还可以离线缓存图片,这样你在坐公交车的时候,就不用介意网络流畅与否的问题了。这个客户端和官方的客户端比起来有一定的特色,如果你喜欢这个客户端的话,不要忘了给作者一些捐赠。

(0) Comments    Read More   
Posted on 27-03-2013
Filed Under (文化) by waterlin

转载按:我不知道有没有和我一样痛恨计划生育政策的,作为独生小孩,远游需要牵挂父母,还有就是,父母在我身上关注太多,我觉得完全没必要,想想有兄弟姐妹会多好啊。更重要的是,计划生育把兄弟姐妹这种人类天生的乐趣剥夺了,并且,在政策执行过程中,造成了多少惨绝人寰的事件!我的观点基本上和冯一刀的观点类似,就直接转载他的文章,也算是偷懒了。

转载自:http://www.maidili.com/?p=2189

计划生育,对过去几十年抑制人口的增长,客观作用是在的,但我们若结合计划生育的诞生背景原因,以及诸多具体现象来说,计划生育总体而言确是一件奇葩的事情。

1949年新政权成立时,人口4亿多。新政权最初干的事是鼓励人民生育,最高领袖说“人多力量大”嘛。若干年后,当计划生育开始时,这个国家的人口数量已然成倍膨胀。而且,计划生育被定为基本国策,但直到2001年12月,才有了正式的计划生育法律,即《中华人民共和国人口与计划生育法》,也就是说,从确立基本国策开始,在长达20年的时间里,计划生育都是靠一些指示或者地方性法规在操作。

这是宏观层面的问题,四个字概括:不可思议。微观层面自然也有很多不可思议——我们都记得因计划生育而诞生了一些骇人听闻的现象,比如有句口号叫作“打下来,流下来,就是不能生下来”,而有些计生人员,倒也确实照着这口号的精神去执行了:去年在陕西安康,孕妇冯建梅七个月的婴儿就被计生人员强行引产。这事英国人看了举国震惊,在我们这却是捍卫国策。

当初鼓励生育是他们做的,现在计划生育也是他们定的。总之是,老百姓一直在为错误的结果埋单。

本来,生孩子只是自己的事情,你不想麻烦任何一个不相关的人。但是生育“被计划”了,而且这套计划所对应的具体流程,又是那样的迂腐可笑,生孩子成了一件求爷爷告奶奶的事——这个时候,任何一对拿到了“准生证”的温驯夫妻,心里都难免产生怨气。一个未来的中国公民,在TA还没出生就已经受了屈辱,等长大了,TA出国的理由可以有一大堆,爱国的理由却越来越少。其实现在这个苗头已经十分明显:大凡资产足够多的父母,子女有几个留在国内呢?

计划生育部门还真对得起“计划”这两个字的意思——最典型的一点,连婚育情况都要单位开具证明。如果你以后碰到某个计生科科长,要求你去找以前的单位开婚育证明,一律不予理睬。这些计生干部,不知道是脑子真的还停留在过去,还是故意刁难,真的是连一点常识都不具备。

去年我看见一则新闻,说是针对群众反映办准生证难的问题,12月3日国家人口计生委发出了一则通知,要求各地简化办证程序。北京一个记者前去计生部门采访,问关于“通知”的事,一个工作人员回答,“那是新闻,要到我们这儿,那就得等”。搞笑吧?后来我在国家计生委的网站上,将这份通知文件打印了出来,并在去计生部门办事的时候随身带着,以备需要“辩论”的时候拿出来使用。果然,另一位计生科科长又对我提出了新的问题,于是我就把通知拿出来,说国家计生委不是要求减少办证流程吗?不是可以根据本人承诺办事而不需要单位证明吗?这位科长反驳我说:《通知》是文件不是法律,你懂法律吗?

瞧,这真是一贯的作风:当你跟TA们讲法律的时候,TA们跟你讲通知和文件精神;当你跟他们讲通知和文件精神的时候,TA们要跟你讲法律。事实上,《中华人民共和国人口与计划生育法》2001年12月才制定,不知道计生干部们在此之前依据的又是什么法律。

计划生育在具体执行中的另一套不合理逻辑是“有罪推定”。比如你婚前未曾生育,计生部门要求你自己去证明,这就是一个典型的“有罪推定”——而按照“无罪推定”的原则,如果没有证据能够表明一个人婚前曾经生育过,那这个人就是婚前未育。

在中国办生育证,对很多人来说,可称得上是一部小小的辛酸史、屈辱史,只不过程度有差异而已。证明之所以难办,另外还牵扯到户籍制度,也不光是计划生育一个系统的事。比如不少城市都有集体户口政策,但制定集体户口政策的并非计生部门,而另一个部门在制定这项政策的时候,并没有考虑到这些户口在生育方面会碰到的麻烦。这就是集体户口在办证时难上加难的原因之一。

集体户口说到底也是一项奇怪的政策。中国人向来不缺少政策,缺少的是安全保障。我想起以前形容中国人生育的一句话,叫作“越生越穷,越穷越生”——其实中国人不是天生喜欢生小孩,中国的大部分人口主要在农村,农民之所以想多生是因为“养儿防老”,之所以“养儿防老”是因为TA们没有社会保障,老了没有退休金……提高社会保障,以及教育水平,这才是解决人口增长问题的根本之道。我们问一问:“建国”这么多年,农村的社会保障有没有实质性的进步?早该免费的九年义务教育,晚了多少年才实现?不能不承认中国政府在农村社会保障建设方面,花的力气是很少的,早先搞“城乡二元制”,鼓励生育,发现苗头不对了,然后又花大量人力物力推行计划生育,可谓典型的“头痛医脚,脚痛医头”。再过些年人口全面老龄化了,不知道又会采用什么办法去“弥救”。

希望不要总做些亡羊补牢的事。有人说中国政府是全世界最忙的政府,这话可真不假,因为中国政府什么事都要管。就管生育这件事来说,全国的计生系统有多少工作人员呢?以平均一个街道计生办三名工作人员计算(还不包括社区),全国这么多城市,每个城市若干街道(还有数量更多的县、乡镇等),算下来起码好几百万吧。一支庞大的生殖器巡逻队,真是举世可观。

-by 冯一刀

(2) Comments    Read More   
Posted on 13-03-2013
Filed Under (技术) by waterlin

最近在使用虚拟机装测试系统的时候,碰到几个名词容易搞混淆,特意笔记一下,以加强印象。

“x86-64”,有时会简称为“x64”,是64位微处理器架构及其相应指令集的一种,也是 Intel x86 架构的延伸产品。“x86-64”1999由 AMD 设计,AMD 首次公开 64 位集以扩充给 IA-32,称为 x86-64(后来改名为AMD64)。其后也为英特尔所采用,现时英特尔称之为“Intel 64”,在之前曾使用过 Clackamas Technology (CT)、IA-32e 及 EM64T。外界多使用 “x86-64” 或 “x64” 去称呼此 64 位架构,从而保持中立,不偏袒任何厂商。

由于 AMD64 和 Intel64 基本上一致,很多软硬件产品都使用一种不倾向任何一方的词汇来表明它们对两种架构的同时兼容。出于这个目的,AMD 对这种 CPU 架构的原始称呼——“x86-64”被不时地使用,还有变体“x86_64”。其他公司如微软和太阳微系统在营销资料中使用“x64”作为对“x86-64”的缩写。

许多操作系统及产品,尤其那些是在 Intel 进入这块市场之前就引入“x86-64”支持的,使用“AMD64”或“amd64”同时指代 AMD64 和 Intel64。

当我在选用 Ubuntu-Server 系统时,Ubuntu 网站上有如下几句说明:

按我的理解,上述 x86 应该是指普通的 32 位系统,需要一个 x86 的 CPU;而 AMD64 则应该就是指 64 位系统(根据上述说明,应该兼容 AMD 和 Intel 的 CPU),需要一个 x86-64 (或是简称为 x64)的 CPU,千万不要被 AMD64 这个名词给蒙蔽了从而以为需要一个 AMD 的 CPU。

如果想在 VirtualBox 里模拟 AMD64 的机器,需要你的 CPU 满足一定的要求,否则会提示如下错误:

./images/virtual-box-amd64-error.png

英文信息类似于:

出现这个错误的时候,最重要的是,在 BIOS 里检查一下,看你是否有打开允许 CPU 虚拟化的选项。如果有类似的选项,则打开该选项,就可以在 VirtualBox 里模拟安装 64 位的机器和操作系统了。

(0) Comments    Read More   
Posted on 13-03-2013
Filed Under (技术) by waterlin

在 Org Mode 里,如果你使用嵌套的 example, html block, quote block,会面临 #+ 符号循环解析出错的问题,例如,对于下面的代码

本来是想在一个 example 里嵌套一个 example(什么情况下会有类似的用法?呵,在你写 Org Mode 教程的时候,就会碰到),结果输出却变成了

这个问题需要怎么解决呢?答案是使用万能的 : 来解决这个问题,你可以尝试着把标记方法变成使用 : 来标记,类似如下代码:

这样,example 或是 quote block 里循环嵌套 #+ 时的解析错误,就解决了。

如果 block 里面的内容过多,则可以使用 C-c ‘ 来编辑该 block 里的内容。

(0) Comments    Read More   
Posted on 13-03-2013
Filed Under (技术) by waterlin

在 org 里,如果需要引用别人的东西,按照正常的文档写作方法,应该是要使用引用标记。如果生成 html 时引用别人的一段话,可以用下面的代码

当然,这种在 Org 里内嵌 html 的方式,是最不赞成的,因为上述代码在你生成非html文档的时候会有影响。

这时,最好采用 Org 自己的 blockquote 标记:

上面代码的输出结果就像如下所示:

This generates blockquote tag on HTML export.

所有这些东西,可以配上 YASnippet 来使用,相当方便。

(0) Comments    Read More   
Posted on 13-03-2013
Filed Under (技术) by waterlin

经常用 Org Mode 写东西,但是某些时候就是不希望 org mode 自动帮你转义以 1. 2. 3. 这类符号开头的段落或是行,1. 2. 3. 这些用 Org Mode 的术语来说,就是 plain list。这个时候,可以怎么办呢?

1. 一种办法,就是直接使用 example block 来解析该段字符

即用

来直接引用这些以 1. 2. 3. 开头的行。这个引用,输出后会包括在 CSS 的类 example 类里。例如,像

这样的 example 标记,就会生成类似下面的 html 代码:

example 标记的一种简单表达方式是 : 外加一个空格来开始一行。

2. 把这些字符当成 HTML 字符直接输出,即采用 literal 的策略来解析该段文字

即在 Org Mode 里插入 literal 的字符串,即如下所示:

或是直接用下面的形式

或是直接使用 @ 来 Quoting HTML tags。

采用这种方法生成的 HTML 文件,就不会给你额外加上任何东西。所以需要你自己预先添加如 <p> 或是 <b> 这类标记语言。否则 Org Mode 就只是原文输出你输入的内容及格式,不保证在你的页面里看起来会有好的效果。

3. 在标题栏里使用黑体、斜体等标记

如果你在使用 1. 3. 来开头写标题,这时不妨加上 * 用来加黑,或是直接使用斜体标记等标记符号,这时,也自动不会转义 plian list 了。

这个技巧的实战效果可以看例子文章:Windows 下 Emacs Tramp 基本配置方法,里面的1.2.等标题就是用黑体来避免 plian list 转义的。

也可以现场看看效果,类似下面的标记

会被直接输出为:

1. test headline 1

3. test headline 3

5. test headline 5

对吧,上面这几行的确没有被当成 plain list 来解析吧?

4. 马后炮

呵,我本人推荐使用第 3 种办法,简单又不会破坏原有的排版效果,还可以让标题看起来醒目一点。

不知道没有简单的办法,直接让 Org Mode 直接不转义一个简单的字符并且不添加额外的副作用?其实最理想的办法,是类似 C++ 字符串里的 \ 号。究竟有没有呢?

(0) Comments    Read More   
Posted on 13-03-2013
Filed Under (技术) by waterlin

如果需要用 Python 调用 C/C++ 编写的第三方库(这些第三方库很可能就是你之前写出来的),只是需要一个脚本语言来粘合它们。这个时候,用 Python ctypes 可以很方便地实现调用。

StackOverflow 上的 Calling C/C++ from python 这个主题介绍了 ctypes 最简单的入门方法,概括如下:

  1. 如果是 C 函数库,则直接 load 这个库,然后调用即可;
  2. 如果是 C++ 函数库,则需要用 extern 关键字封装一个供 C 使用的函数,即把类隐藏到一些 C 风格的函数里,然后用 extern 标明这些函数,以方便外部调用。

这两种方法里,弄懂了 ctypes 调用 C++ 库的方法,就会用 ctypes 调用 C 函数库,对 C++ 库的基本方法如下。

例如,有一个 C++ 类 Foo:

再封装出下面 C 风格的接口函数:

把上面的代码编译成动态链接库:

,然后再用 Python 写的代码来调用这个类,你可以把上面两个 C 接口函数写成 Python 类,或是直接调用:

,然后就可以在 Python 脚本里调用这个 Python 类了:

在 Windows 下用 Python ctypes 的方法和上面一样,只是有下面两点需要注意一下:

  1. 在编写 Python 代码时,刚开始链接所需的动态链接库时,最好使用绝对路径来 load,以减少出错概率,加快调试速度

    在我按上面的方法编写好了上述代码时,一运行脚本,则提示如下错误信息:

    这是因为我在代码里是使用了这样的代码来导入动态链接库:

    如果把 ./LinkExample 这句换成 Windows 下的绝对路径 E:/PythonCode/LinkCpp/LinkExample,则没有错误提示了。当然,你直接把 ./LinkExample 换成 LinkExample 也可以找到该链接库。

    所以,刚开始的时候,使用绝对路径,以确保你不会纠结于能不能找到链接库之类的问题。

    在运行上述脚本的时候,出现 WindowsError: [Error 126] 的错误,无非就是两个原因

    • 你的 DLL 没有正确地被加载;
    • 你的 DLL 依赖的其它 DLL 没有被找到或是加载失败。

    另外,注意一下,Windows 下因为库分为 lib 和 dll 两个文件,所以可以只输入库的名称即可,比如说你要链接 LinkExample.dll 库,则可以在 ctypes 里只需要声明链接名为 LinkExample 库即可。

  2. 如果是 C++ 写的库,需要用上 extern 关键字,这个和一般的供 C 调用的 C++ 库头文件是一样的

    在 extern 声明的函数里,可以使用 C++ 里 C 没有的关键字,比如我的函数就是这样声明的:

    上面代码可以从 Python 调用运行。

    extern 这个关键字在 C++ 里的用法比较复杂,在这里就是要声明一个供 C 使用的外部函数,而这个函数本身,却可以使用 C++ 的语法,包括 const 关键字等。

(0) Comments    Read More   
Posted on 06-03-2013
Filed Under (软件) by waterlin
  1. 注册 Google App Engie 的 App ID;
  2. 下载 goagent,并解压到相应的目录里;
  3. 双击 goagent 目录里的 server\uploader.bat(Mac/Linux上传方法请见FAQ),根据提示,输入你的 App ID 及 Gamil 用户名密码等;
  4. 如第三步上传成功,则修改 local\proxy.ini 中的 [gae] 下的 appid=你的appid(多appid请用|隔开),使用代理地址 127.0.0.1:8087 来访问墙外的网站;
  5. 运行 \local\goagent.exe 文件,即可开启代理服务器;
  6. 为方便代理切换,Firefox 请安装 FoxyProxy,Chrome 请安装 SwitchySharp 插件。
(0) Comments    Read More