用 WordPress Shortcode API 实时输出你当前的年龄

包括我在内的很多朋友有这么一个困扰:计算自己年龄不方便,每天要用计算器计算自己今天几岁了,然后到博客的“关于”页面进行更新。今特写一插件,解决我们共同的烦恼。插件启用后,WordPress 会教导 PHP 帮您进行各种复杂生日计算。

<?php
/*
Plugin Name: Wait... How old am I right now?
Plugin URI: http://jiehan.org/tech/output-age-with-wordpress-shortcode-api/
Description: Shortcode that outputs your current age in case you forget.
Version: 250.000 (significant three)
Author: Anonymous
Author URI: http://jiehan.org/
License: GPL2
*/
 
define( 'MY_BIRTHDAY', '1994-12-12' );  // put in your birthday here
                                        // (best in YYYY-MM-DD)
 
function tell_the_world_how_old_i_am( $atts ) {
  date_default_timezone_set( get_option( 'timezone_string' ) );
  $time_i_have_been_existing = date_diff( date_create( MY_BIRTHDAY ), date_create() );
  date_default_timezone_set( 'UTC' );
 
  return $time_i_have_been_existing->format( '%y' );
}
add_shortcode( 'age', 'tell_the_world_how_old_i_am' );
 
?>

然后怎么用?先去 wp-content/plugins/ 下面创建一个文件,把上述内容拷贝进去,然后启用这个插件…

然后呢?然后去改你的页面啦,把 hardcoded(中文不太吉利)的年龄替换成 [age],比如我的:

我是郑界涵。现 Peddie School 十年级学生,今年 [age] 岁了...

将自动被替换为,

我是郑界涵。现 Peddie School 十年级学生,今年 17 岁了...

当然,这个 Shortcode API 在文章页面也适用,你可以随时告诉别人你几岁了。另外,如果不是在文章或页面中,比如在主题的某个地方调用你的年龄,可以写 echo tell_the_world_how_old_i_am( null ); 哦。

注:由于时间原因,当前生日缓存、生日分布式计算、AJAX 或 Comet 真正实时年龄输出将在未来实现。

已知问题

  • 如果你出生地和博客服务器所在地之时区不同,则输出的年龄会有偏差。
  • 如果你博客服务器时间设置不正确,则输出的年龄也会有偏差。
  • 如果你生日写的不对,则输出的年龄也会有偏差。

装逼税

日志

如今装逼不上税,希望国家以后征收装逼税,建议分为如下分类:

  • 带 iPad 上学上课故意拿出来上人人网显摆而且没人回复你还在那儿盯着看屏幕税
  • 显摆自己知道的多税
  • 装深沉税
  • (未完待续,改天继续加…)

中国谣言格外多

咱们中国人总是喜欢夸大事实。最典型的:就拿小时候我妈早上叫我起床来说吧:

“赶快起来!!!七点了!!!再不起来上学迟到了!!!”

(接着是各种掀被子、拽胳膊)然后起来一看,七点还早呢…

正因如此,各种谣言很容易在我们中国人之间传播。起床这种小事儿倒是没什么,最可怕的就是在地震、传染病、放射性物质辐射这种事情上的谣言。

某些中国人还总喜欢在造谣时加上各种“可靠来源” —— “BBC”、“DHL 亚洲区总部”,搞得整个事情很隆重、很官方。DHL 是什么呀,是一个物流公司吧 —— 一个物流公司会给你友情提示辐射会影响到你?

我认为 StarKnight 在 Twitter 上面说得很对:

很多传播未经证实的消息的人的态度令人恼火:“不知道是不是真的,但是看起来很可怕啊,我只是转载给大家看看,好心提醒大家注意,难道好心也有错嘛?”——是的,好心也有错。

因此,我在此呼吁大家,不要看到一条短信就相信它。更重要的是,在你转发之前,一定要验证它,特别是在有着非常明显的“可靠来源”的时候 —— 上 BBC 看一下头条会用掉几秒钟?

给别人制造恐慌可不好玩儿。

推荐阅读:腾讯《天灾过后尽谣言》

当好人遇到极品

这年头,好人可不好当,尤其是当遇到了那些极品中的极品的时候。

就说这借书吧,我想大家都借过别人的书,也被别人借过书吧。某天中午,刚好有人来我班借书,不巧我被看到了。是个认识,但是不太熟的男生,问我有没有《数学必修 4》,我当天也没有,于是就变成借书中介了。这个中介非常不好当,你看吧,一会儿就告诉你有多难当。

我在班里喊了一句,谁要借这个男生书啊?原来我在《温馨提示:吹牛前不查资料是不对的》一文中提到的那个 A 同学自然要显示她很淑女、很慷慨、很大方。于是她就喊道,我有,我有,拿我的吧!我接过了书,给那位同学。后来我说,要不你俩认识一下吧。后来她很不屑地拒绝了。我松了口气,呼,这个中介大概是做完了吧。

别高兴太早,你和她打交道以后,你会发现你的事情是永远不会完的。这不,两天过去了,她开始找书,来管我要。哇噻我又没拿着你的书,让我上哪儿给你找去… 不过出于好心,我还是打算找找那个人的。后来的整节课,她就怨妇似的摆出那副高贵的脸,说“郑界涵!今天必须给我找到书!不找到你就给我买两本去!”。我实在受不了,后来找到那位同学了,他说他已经把书还给我们班另一位女生,让她转交她了 —— 这里插一句,借书那位同学你也微不靠谱,也不知道还给哪位女生了… 我对他说,那你还是来我们班一趟,和那个同学自己说一下吧。

那位男生和 A 同学解释,然后 A 同学又开始潇洒上了,“行了,没事儿,我自己去买一本就行了,你走吧”。哎哟,这怎么又变了,这么慷慨地赶人走了。好吧,我管你怎么样,反正没我事了吧,呼,太好了。

放学以后 A 就不认帐了:“郑界涵!我的数学书呢?赶快给我买去!”

所以说,面对当今社会各种极品无赖不要脸,我建议各位好心人起草《义务借书中介服务合同》、《无偿技术支持服务免责声明》、《考试义务借抄答案错了不要怪我合同》等等,办事前供当事人签字,避免遭极品缠身。等这阵作业补完了,我会先写几份的。以后没准会发布《通用义务借书中介服务合同》、《通用无偿技术支持服务免责声明》、《通用考试义务借抄答案错了不要怪我合同》等等。

本来这篇文章很长的,出于我们还是同学,我就删了些,建议 A 还是好自为之。至于文章评论中说“勾引”啊、“早恋”啊什么的朋友们,我希望你们知道我是真的生气,只是没全写出来而已,我对这种极品没有兴趣。

用 Ubuntu 做 AirPrint 服务器实现 iOS 无线打印

本文教你在 Ubuntu 配置 Avahi 和 CUPS,使你的 iPhone、iPad、iPod touch 可以使用 AirPrint 功能打印到连接在 Ubuntu 上的打印机。步骤在下面,完成只需 5 分钟,不骗你哦。

我正在很努力的补作业,前段时间又是忙申请,又是忙 TOEFL,还回老家什么的。眼看着几个小时前已经开学了,现在只能补作业。补作业呢,最重要的就是效率,怎么保证效率呢,那么就是借鉴和参考答案的时候别老前后翻,太慢,得想办法不用翻来翻去的才好。

怎么办呢?聪明的你大概想到了,那复印吧!复印,太 out 了吧,复印多麻烦,你得先把作业本上的笔拿下去,起身,开门,打开书房的门,把一体机的扫描盖子打开,作业本打开到答案那页折个死褶,盖上盖子按复印。多麻烦。

看来最优方案应该是这样子的:坐在椅子上,翻到答案那页,拿出你的 iPhone,给答案照张相,AirPrint 无线打印出来,再抄起无绳电话请你妈妈把答案给你从打印机上拿下来,送到你屋里。你的移动距离为 0。

于是呢,就搜索呗。家里买的是便宜打印机,肯定没法实现直接 AirPrint。用英文搜索,确实有一些解决方案,但是找到的都很麻烦,自己要改的配置文件比较多,而且不详细。那我就拿中文,把几种方法结合在一起,给大家推荐一种比较方便的 Ubuntu 作 AirPrint 服务器的方案吧。不要害怕哦,听我的,你是绝对不会碰到可怕的、黑黑的终端的。

Ubuntu maverick 本人亲自测试通过,一会儿有插图。

Ubuntu 有个零配置的网络工具,叫做 Avahi,用它可以方便地创建各种 IP 服务。牛人 Ryan Finnie 告诉我们,AirPrint 大概和 IPP 广播差不多,除了多一个 _universal subtype 和一个 TXT 记录。

你可以只通过向 Avahi 配置文件夹添加 .service 文件的方式,来添加网络服务。另一个牛人 tjfontaine 制作了 Python 脚本,自动搜索你所有设为共享的打印机并创建 .service 文件。

  1. 先在 System > Administration > Printing 通过右键菜单把你的打印机共享,然后在 Server > Settings… 里面勾上 Publish shared printers connected to this system,其它几项根据你的情况选择,但是这项是必须选的,和我们一会儿编辑配置文件有关系。
  2. 然后要调教一下 CUPS 打印服务,其实我也不知道为什么要这样做,但是不做这一步就只能找到打印机,但打印不出来。大概是因为 AirPrint 指定的主机名有问题。按 Alt-F2,输入:

    gksu gedit /etc/cups/cupsd.conf

    回车,输入密码或刷指纹,在很靠前的位置,注释“Allow remote access”的下面,添加如下一行(其实你也不一定加在它下面,只是美观整齐一些…):

    ServerAlias *

  3. 然后来折腾 Avahi,先从这个地址下载 airprint-generate.py 文件,然后扔到你方便的地方,右键,Properties > Permissions > Allow executing file as program 打勾,然后保存。
  4. 双击它,选择 Run in terminal。之后桌面会多出来一个或多个文件,这是它生成的你所有共享打印机的 .service 文件。如果没有,或出错,请安装源里面的 python 包。
  5. 按 Alt-F2,输入

    gksu nautilus /etc/avahi/services/

    回车,来启动一个 root 权限的 Nautilus 文件管理器来拷贝配置文件。把刚刚 py 程序生成的 .service 文件们拖进去。

  6. 好啦,剩下就是重启 CUPS 让刚刚第 2 步的配置文件立即生效啦,Alt-F2:

    gksu service cups restart

好了,剩下的任务就是打印和抄作业了。谢谢大家。

选择打印机和份数

选择打印机和份数

开始打印

开始打印

哦耶,开抄

哦耶,开抄

中国视频嵌入测试

本人预计在 WordPress 3.1 版本中加入用户需求较多的“中国视频网站的嵌入支持”。在 WordPress 3.1 中文版本中,用户将只需在文章中另起一段,写入视频网站的播放网址,即可轻松嵌入视频。

更新:这个功能我已在昨天添加至 3.0.5 版本

如下作为测试和调试之用,不过您愿意欣赏的话也可以哦。呵呵。

下面一段将被替换为视频播放器:

http://v.youku.com/v_show/id_XMjQxMjc1MDIw.html

下面段同时含有 URL 和其它文字,将不会被替换:

文字 + http://www.56.com/u21/v_NTgxMzE4NDI.html

文字 + http://www.56.com/u21/v_NTgxMzE4NDI.html

但是,只插入 URL 是可以的:

http://www.56.com/u21/v_NTgxMzE4NDI.html

我们也将支持土豆网,最后的 trailing slash 是 optional:

http://www.tudou.com/programs/view/o9tsm_CL5As/

最后感谢 Jimmy Xu 同学的帮助。

不靠谱你还出来给人剪卡

日志

今天去了趟北京移动营业厅,问怎么剪卡。咨询台阿姨不错,说剪卡不用排队。于是没签协议,拿出某银色不知名剪卡器,清脆的咔嚓一声,一张“micro SIM”卡片就出现了。问我要不要激活,我说不要,因为印象中激活是需要 iTunes 帐号的。最讨厌用别人帐号什么的了。

阿姨帮把卡敲回去,又变身回一张标准的 SIM 卡,帮我塞回手机。很满意,离开了。等有空,插回原来手机,是“离线”模式,我说好吧,离线就离线,反正你要换手机了对吧。回家呢,插到 iPhone 4 里面,依然提示没有 SIM 卡,我天。

移动啊移动,不靠谱你还出来给人剪卡。

关于互联网审查的演讲

上回不是说了么,这周五要做关于“Internet Censorship”的演讲。刚刚做完,回来写两句。

N 个周五之前,Yifu 问我要不要去 SDP 讲一讲 GFW,这是个好机会呀,我欣然答应了,于是这周 5 天的晚上基本都在准备这个 —— 因为我们是要用英文讲…

我主要就是用两个实验,和大家一起研究 GFW 究竟是如何屏障网页内容的,同时证明了 GFW(路由黑洞部分)是在中国完成的。

屏障网页内容部分,先给大家讲了 TTL 是怎么回事,然后在 Google 搜索一个正常关键词,用 Wireshark 查看结果,重点注意来自 Google Search 服务器的回应的 TTL;然后再搜索一个被屏障的关键词,查看收到具有 RST flag 的包的 TTL,证明它不是发自 Google 的服务器。

这里有个小的致歉:就是在搜索正常关键字的时候,我发现包很多,就让 Wireshark 停止捕捉包了,然而在搜索被屏障的关键词的时候,忘了打开… 导致无法看到有 RST flag 的包(但实际肯定是有的)。那这可怎么办呢,因为我们都知道,在被发有 RST flag 的包之后,在接下来的几分钟里,是没法再打开 Google 再搜索的,所以呢,我只好使用前一天准备好的 backup 方案 —— 先打开前一天晚上抓到的包。不过希望大家知道的是,不论是现抓的包,还是之前抓的包,结果肯定是一样的。

然后我讲了如何证明 GFW 的位置。又补充 traceroute 的原理(TTL = 0 时,路由器就会返回一个错误消息)。通过 traceroute 两个位于美国的 host,查看包是在何处被 drop 的,然后再 whois 最后一个得到的 IP 地址,得出所属的 ISP 和地理位置。

最后是我们新的 Google Docs 幻灯片,中国或许无法访问https://docs.google.com/present/view?id=dhhzk6c_580d3nxzxw9