T
O
P
1
0

An IPv6 Enabled NTP Client for Windows in Python

2010年3月7日 Solrex Yang 1 条评论

Python NTP library (ntplib) offers a simple interface to query NTP servers from Python. But it does not support IPv6 NTP servers. I wrote a patch for ntplib to support IPv6 connections. You can download the patch file here and the patched library here.

The code bellow is a simple IPv6 enabled NTP client (ntpdate.py) in Python for Windows, using the patched ntplib. It doesn't (and won't) support Linux because the official NTP release offers IPv6 support on that platform.

#!/usr/bin/env python
# ntpdate.py - set the date and time via NTP
# An IPv6 enabled ntp client, for Windows ONLY.

import ntplib, time
from os import system
from sys import argv

def usage():
  print '''Usage: ntpdate.py  [-qh] server
Example:
  ntpdate.py 210.72.145.44      # IPv4
  ntpdate.py ntp6.remco.org     # IPv6
Options:

  -q     Query only - don't set the clock.
  -h     Print this message.

IPv6 NTP Server List:
  ntp6.remco.org
  ntp6.space.net
  time.buptnet.edu.cn
  time.join.uni-muenster.de
  time6.ipv6.uni-muenster.de
  ntp.sixxs.net
  ntp.eu.sixxs.net
  ntp.us.sixxs.net
  ntp.ap.sixxs.net
  ntp.rhrk.uni-kl.de
  ntp.ipv6.uni-leipzig.de

Report bugs to http://solrex.org.'''
  sys.exit()

def main():
  ntp_svr = ''
  query = False

  for a in argv[1:]:
    if a == '-q':
      query = True
    elif a == '-h':
      usage()
    else:
      ntp_svr = a
  if ntp_svr == '':
    usage()

  c = ntplib.NTPClient()
  res = c.request(ntp_svr, version=3)
  t_epoch = res.offset + res.delay + time.time()
  t = time.localtime(t_epoch)
  centi_sec = t_epoch%1 * 100
  time_str = time.strftime('%H:%M:%S', t)
  if not query:
    system('time %s.%2.0f' % (time_str, centi_sec))
    date_str = time.strftime('%Y-%m-%d', t)
    system('date %s' % date_str)
  if query:
    print 'server %s, stratum %d, offset %f, delay %f' % (
           ntp_svr, res.stratum, res.offset, res.delay)
  print '%s %s ntpdate.py: time server %s offset %f sec' % (
         time.strftime('%d %b', t), time_str, ntp_svr, res.offset)

if __name__ == '__main__':
  main()

分类: Open Source 标签: , , , , ,

一个 Windows 对时小工具

2010年3月6日 Solrex Yang 3 条评论

由于在 CERNET 内,我经常需要用代理上网,没办法直连到 NTP 服务器,因此不能使用 Windows 时间服务对时。偶尔维修电脑或者不小心调整错时间,再加上电脑时钟本身就有一定的漂移,对时就变成了件麻烦的事情。

手动调时也没个参照,误差往往比较大。IPv6 网络上存在一些 NTP 服务器,Linux 下有 ntpdate 是支持 IPv6 NTP 服务器的,但是我搜索了半天,才在一篇文章上看到有人评论说 Windows 下只有一款 NTP 客户端支持 IPv6,还是收费软件——可他也没给出名字。

无奈之下想到 Python 的 httplib 是支持 IPv6 连接的,于是我就仿照 htpdate 写了一个利用 Google 的 IPv6 Web 服务器进行对时的 Python 小工具 htpdate.py。虽然误差比 NTP 大不少,但是还是在可接受范围内(不到 1 秒),而且比较方便,连日期也一块更新了。下面是代码,比较粗糙。

#!/usr/bin/env python
import httplib, time
from os import system

def main():
  conn = httplib.HTTPConnection('google.com')
  time.clock()
  conn.request('HEAD', '')
  t_rtt = time.clock()
  res_time = conn.getresponse().getheader('date')
  t = time.localtime(time.mktime(time.strptime(res_time,
                                 '%a, %d %b %Y %H:%M:%S %Z')) - time.timezone)
  time_str = time.strftime('%H:%M:%S', t)
  local_time = time.asctime()
  t_exe = time.clock()
  centi_sec = (t_exe - t_rtt/2)*100
  if centi_sec > 99:
    centi_sec = 99
  system('time %s.%2.0f' % (time_str, centi_sec))
  date_str = time.strftime('%Y-%m-%d', t)
  system('date %s' % date_str)
  print 'LOCAL  TIME: ' + local_time
  print 'SERVER TIME: ' + time.asctime(t)
  print 'LOCAL  TIME: ' + time.asctime()
  if (t_exe - t_rtt/2) >= 1:
    print 'Round trip time is too long. Time error might be larger than 1 sec.'

if __name__ == '__main__':
  main()

分类: Open Source 标签: , , , , ,

又是一年元宵时

2010年3月1日 Solrex Yang 14 条评论

今天早上,我做了个梦,梦见我爸爸躺在床上,瘦得皮包骨头。在我印象里,他这是从远方治病回来了。我走上前去,摸摸他萎缩的两腿,问他:“爸,你到底去哪儿了?怎么走那么久也不给我打个电话?我想你了。”他说:“是想给你打的,几次都没打成。”我给爸说:“爸,你儿子现在出息了,研究生都要毕业了,还找了份不错的工作。”我爸笑着说:“好啊,比我强。”我又问他:“你这次回来还走吗?”还没等他回答,梦就醒了。

起来后我给我妈打了个电话,给她说了这个梦。我妈立刻泣不成声,说昨天下雪,没去我爸坟上送灯,他这是想我们了,所以会托梦给我。安慰完我妈,挂了电话,我也没忍住,大哭了一场。

8 年了,其实我梦见爸爸的次数并不多。年年春节回老家,我都会到我爸坟前拜祭一下。今年初四,只有我一个人和姑姑家一起回老家走了走亲戚,没有去看我爸。我妈说怪她,其实我觉得该怪我。常年在外,清明也不回去、七月十五也不回去,本来只有过年的机会能看到我,结果今年也没有往坟上走一走,我爸这是怨我了。

我爸曾经是我小学四年级的语文老师,奶奶走的那天,该他上课,他什么都没讲出来,坐在讲台上哭了一节课。我爸刚走时,我没有很难过,总觉得他还在身边似的。但年龄越大,越能体会到那种子欲养而亲不在的悲伤。小时候我爸总为我的学习成绩而骄傲,说我特为他挣面子,每当考试又得高分,我都会赶快告诉我爸。可惜现在我取得一点儿小成绩,总想着要是我爸能活着看见就好了。

今年清明,我得回家一趟,去拜拜我爸。

分类: Memory 标签: , , ,

使用 Sikuli 实现同时登录两个 Dropbox 帐户

2010年2月1日 Solrex Yang 6 条评论

来自 MIT 的用图片编程的 Sikuli 语言最近着实火了一把,看着对岸的程序员 Vgod 开发出如此酷的软件着实令人羡慕。但除了 Demo 之外,能不能拿 Sikuli 来 engineer a better life 呢?显然是可以的,就如 Vgod 这篇文章所说,Sikuli 有无穷的潜力,那我们就来玩儿一把,展示一下 Sikuli 的一个现实应用。

1. Dropbox

Dropbox 是一个在线文件存储系统,可以用来存储和在不同电脑间共享文件,但是一个 Dropbox 用户只有 2G 的存储空间,当我们文件多的时候,就受到限制了。而一般情况下 Dropbox 只能运行一个例程,使用多个用户貌似不可行。但是到底可能吗?

当然可能,只是我们需要多个 Windows 帐户。也就是说,每个 Windows 帐户可以运行一个 Dropbox,如果你系统里有多个帐户,就可以运行多个 Dropbox。注意,受到安全策略的限制,这些帐户必须设置密码。比如我们新建一个"dropbox"帐户,密码也是"dropbox"。

2. 笨的方法

一般情况下使用其它帐户运行程序的方式为:在程序或者快捷方式上点右键,选择“运行方式”,然后选择“下列用户”,输入你期望的用户和密码(dropbox:dropbox)来执行该程序。

3. 聪明的方法

但是这样做太麻烦了,我们可以用批处理脚本做这件事情:

start D:\Program\Dropbox\Dropbox.exe
runas /user:dropbox D:\Program\Dropbox\Dropbox.exe

但这样还要手工输入密码,有很多种方法可以避免手工输入 runas 密码,但很遗憾它们大多在 Windows XP Home Edition 上不可用。

用 Home Edition 的同志还是得交互式的输入密码。能不能不手工输呢?可以,比如 expect 就是专门处理交互的语言。不过,学起来太麻烦了吧,要不来看看 Sikuli 怎么做?

4. 使用 Sikuli

下面这个图就是完成启动两个 Dropbox 的 Sikuli 程序:

使用 Sikuli 同时启动两个 Dropbox

首先switchApp("cmd")启动 Windows 的命令行,然后wait等待那个提示符出现,然后 type() 键入一行 runas 命令,wait 等待提示输入密码,type 输入密码 dropbox 加回车 \n,bingo,出来一个 dropbox 了,最后再 type 一行启动非 runas 的 dropbox,又出来一个 dropbox。

上述程序运行结果如下图所示:

两个 Dropbox 在运行

好玩吧!Sikuli 程序就是那么简单,我从下载 Sikuli 到完成这个程序大约花了四十分钟的时间,这可比去学 expect 快多了。这下 expact 之类的交互语言在简单的场景下可以无视了。

你可以将 Sikuli 程序导出成一个 .skl 文件,据说可以双击运行,不过我尝试未成功,这是一个遗憾,希望后续版本可以解决这个问题。

5. 注册 Dropbox

您如果对 Dropbox 感兴趣的话,可以点击下面我的两个邀请链接注册,这样咱们的空间都可以增加 250M。本人将非常感谢您的支持。(如果您打算再注册一个的话,最好不要用自己的邀请链接,因为同一台电脑上激活的用户不会奖励空间。)

https://www.dropbox.com/referrals/NTI0OTY1Mzk5
https://www.dropbox.com/referrals/NTE2NjMyMTU5

升级黑莓 8700 系统到 4.5.0.182

2010年1月30日 Solrex Yang 6 条评论

好多事情都是不做时觉得很难,做了才知道,哦,原来这么简单!给黑莓刷系统也是如此。

本来我的 8700 系统是 4.2.x 版本的,有很多主题和软件不能用,我当时怕升级麻烦,也就忍了。但是当我前两天才憧憬过的 UCWEB 黑莓版今天发布时,而我的 4.2 系统无法支持它,只好下狠心升级一把。

之前我曾经看过无数帖子,评论 4.5 的系统如何如何,也看过不少教程,该如何如何升级系统,总之一个感觉,就是非常麻烦。众说纷纭以至于连该用什么固件都不知道。但是经过几次尝试之后,我才发现了升级黑莓系统是怎么回事,根本没有我想象的那么复杂。下面给出我对整个过程的理解。

1. 到哪里下载固件?

要想刷系统,首先得有固件,到哪里下载就成了一个问题。网上乱七八糟的,众说纷纭,但是我认为本应该只有一个答案:黑莓官网。不过到官网下载固件需要国外代理,因为它禁掉了中国 IP,所以不懂翻墙的人就在其它网站找吧。

2. 下载什么样的固件?

在黑莓官网上,黑莓也不像一般的手机网站一样把一堆系统软件列出来。黑莓官网的固件是按照运营商管理的,很遗憾我们找不到中国移动和中国联通。要找支持中文固件,一般来说我们可以找香港的运营商。但是不同运营商提供的固件版本并不一样,香港的运营商固件可能并不新,这时候美国的 AT&T 反而是一个好的选择。如果需要中文支持的话,一般应该选择括号中注释为 EastAsia 和 Chinese 的固件(据我理解 MultiLanguage 并不包含中文支持)。选择版本的原则我觉得应该版本越高越好,但是不排除偏好某个稳定的版本。

3. 中文支持是不是必须的?

我之前以为必须下载的固件支持中文,装上之后才能使用中文。后来发现也不是那么回事,其实你完全可以下载一个高版本的不支持中文的固件装上,然后找一个相近版本的支持中文的固件,把里面中文支持部分的 .cod 文件找出来,然后用 JavaLoader 装到手机里,这个系统就可以支持中文了。简而言之,中文支持仅仅相当于应用软件而已,可以单独装的,只是需要用特别的方法装。

4. 如何安装固件?

这个就不用我说了,网上一堆一堆的教程。简单的流程就是先将固件安装到 Desktop Manager 里(其实是放到某个目录下),DM 识别了,然后装到手机里。我注意到的一点是:安装固件时最好不要联网,不然黑莓的 Desktop Manager 会老在那找软件更新,增加本来就很长的安装时间。

5. 安装固件时需要不需要备份?会不会对数据有影响?

不需要备份,安装时会自动备份和恢复。对黑莓自身应用,比如短信、通讯录等不会有影响,但是对第三方应用的数据会有影响,比如 Gmail、Mobipocket Reader 等。这也是没办法的事,第三方的应用数据本身也备份不出来。但很奇怪的是手动添加的 Service Book 和 TCP 的 APN 也会消失,只能重新修改。

6. 高版本的系统会不会很慢?

我曾经在网上看过一个耸人听闻的说法是 8700 4.5 的系统需要半个多小时才能启动,让我非常吃惊和迟疑,不敢升级系统。实践证明他大概说的是固件安装过程中的第一次启动需要那么长时间,之后的启动时间和 4.2 系统也没什么明显区别。至于内存占用啦、程序运行速度啦、网速啦,在使用中没有明显感觉。

我觉得将系统从 4.2 升级到 4.5 的优势是:可用的应用和主题更多了、系统和字体更漂亮了;劣势可能是占用的存储空间多了点儿、少了个拼音输入法。除此之外没有其它明显区别,我自己认为值得升级。

分类: Life 标签: , , , ,

我喜欢的黑莓应用

2010年1月26日 Solrex Yang 10 条评论

上次手机丢了之后,为图便宜,我换了一个黑莓 8700,黑莓大概是我能负担起的最便宜的智能手机系列。虽然和原来的手机相比,8700 不带照相和扩展卡功能,但各种应用让我觉得比传统手机好玩多了。自从开始玩黑莓的这些有趣应用后,我渐渐觉得以后什么手机应用多,才能占到市场先机。以 Google Android 的开放平台以后肯定有不错的表现。

折腾了一段时间后,下面是一些我喜欢的黑莓应用:

1. Opera Mini 浏览器

如果没有网络,智能手机至少会少了一半的乐趣,现在很多网站都支持手机浏览了,包括我的这个博客,所以一个好用的网络浏览器非常重要。其实 Opera Mini 算不上很好用,但至少比黑莓自带浏览器好用多了,主要是在网页格式化方面。我比较看好的浏览器是 UCWEB,因为它支持标签功能,在 GPRS/EDGE 的低速网络下可以后台打开标签以节省时间。UCWEB 黑莓版已经在内测,希望能尽快推出。

2. Google Maps

通过黑莓上的 Google Maps 我才第一次知道原来没有 GPS 也可以定位。Google Maps 使用基站定位的标称误差大约在 600 米左右,实际误差我觉得大约在三四百米内。虽然误差比较大,但是在北京城里晃悠时,这个范围的误差足够能判断行进方向是否正确了,可以少问很多路。另外还有路线查询功能,有点儿烂,但好歹能用。

3. Google Sync

同步联系人和日历的工具,可以将手机联系人与 Gmail 联系人同步,将手机日程表与 Google 日历同步。这个应用实在是太酷了,在同步完联系人到 Gmail 中之后,我再也不用担心手机丢了会失掉很多人的联系方式。编辑自己的日程表也可以在电脑上进行,不用在手机上慢慢地敲字了。而且只要登出 Google 帐号,就可以删除所有联系人,换手机时候很方便。

4. Key Master

我平时不喜欢用鼠标在一堆图标中找应用程序,所以在电脑上我都是用 Launchy 来启动应用程序。Key Master 是在黑莓上自定义快捷键启动应用程序的工具,非常好用,一般情况下我都不需要再进黑莓的 Applications 目录用滚轮来找程序。

5. Mobipocket Reader

这是一个电子书管理和阅读工具,有手机版和电脑版。电脑版和 iTunes 类似,先把电子书导入到电脑版里,然后通过数据线发送到手机上的 Reader。这不是它最酷的地方,它最酷的是可以直接导入 .pdf, .html, .chm, .epub 格式的电子书。如果有某本书的 pdf 版,就不用再费尽心机寻找 txt 版了,直接导入就可以在手机上阅读。Mobipocket Reader 对 pdf 的重新格式化在我看来已经到了值得称赞的地步,太牛了!

6. 凌波微步 SmartDail

这是一款智能拨号软件,由于黑莓的电话簿不支持首字母查询功能,在电话簿中寻找联系人比较麻烦。这款软件可以支持名字首字母查询,定位联系人非常方便。

7. MidpSSH

黑莓上的 ssh 客户端,不支持中文,但是紧急情况下用来进行简单的服务器维护足够了。

8. Gmail 手机客户端

这个不用解释了。

9. 点讯输入法

用这个输入速度比黑莓原生输入法快多了,主要体现在两个方面:选字快和匹配率高。缺点就是切换麻烦,或者在一些应用中只能拷贝粘贴。

10. BerryFetion

这个软件也相当酷,可以在短信上直接选择“使用飞信回复”,可以省不少短信费!

11. Btalk

黑莓上的 Gtalk 客户端。由于官方的 Gtalk 黑莓版不支持个人用户,开源的 Btalk 让这变成了现实。但是实话说,谁用外出时还用手机挂 Gtalk 呀(又没经验值),也就是偶尔用一下而已。

12. AutoLock 和 TinyLock

自动锁屏软件,用处不大。

剩下还有一些应用,BBWeather, CallAssistant, MobCal, Anyview, BBNotePad 之类的,装上几乎没有用过,也就不评论了。

还有一方面的应用我觉得非常遗憾,我一直没有找到很棒的记事本软件。我希望这个记事本软件能支持(以优先级排序):1. 自动保存,比如15秒保存一次;2. 导出到电脑;3. 支持点讯输入法。不知道这样的应用存在不存在?

分类: IT 标签: , ,

亲历卓越“硬盘门”事件

2010年1月25日 Solrex Yang 2 条评论

前天晚上看到有人在推上讨论卓越超便宜的 118 元 320G 硬盘,过去一看居然是真的。其实经过“25 元门” 之后,我知道这是几乎不可能的,其实我也知道即使我下了单卓越也是会赖掉的,但是我还是抱着“全民调戏,重在参与”的心理加入了抢购大潮,并且进一步散播了这一消息...

事实证明我的预料是对的,我下的两个硬盘的订单在保持 44 个小时后,被卓越取消,卓越再一次(无耻地?成功地?开心地?)赖掉订单:

尊敬的客户:

您好!感谢您的订购。

我们抱歉地通知您,您在卓越亚马逊网站上购买的劲永牌320GB移动硬盘的价格出现错误。卓越亚马逊上有数百万种商品,因此有些时候难免会出现这类问题。根据我们在卓越亚马逊网站上公布的使用条件中的价格政策:http://www.amazon.cn/static/claim.asp?uid=478-5181363-0560506,出现商品价格错误问题时,如果商品正确价格高于错误的标价时,我们不得不取消您的订单,并且通知您。因此,您的订单已被取消。如果您仍然想购买这个商品,请根据正确的价格再次购买。

对于就此给您带来的不便,请您接受我们真诚的道歉。今后我们将继续努力,尽力确保卓越亚马逊上不再出现此类问题。

我们衷心期待继续为您提供服务。

卓越亚马逊客户服务部

不过我依然很开心能亲身见证这一过程。:)

分类: IT, Memory 标签: , ,

关于 SOCKS 代理的远端 DNS 解析

2010年1月23日 Solrex Yang 16 条评论

经常使用 SOCKS 代理服务器的同志们会发现一种现象,即使 SOCKS 代理服务器设置正确,某些网站仍然无法访问,比如某著名微博网站。其一般原因都是 DNS 污染 (DNS cache poisoning)。

值得庆幸的是 SOCKS 5 协议增加了对 UDP 数据包的支持,DNS 查询是通过 UDP 传输的,所以我们可以使 DNS 查询数据包也走 SOCKS 5 代理来进行远端 DNS 解析(Remote DNS Lookup)。 SOCKS 5是通过将域名直接提交给 SOCKS 服务器来进行远端 DNS 解析的,即 Address Type 0x03,而非上述所说使用 UDP 通道解析。DNS 服务是 Internet 的基础服务,要求 DNS 解析应当尽量地快,所以浏览器默认不会使用远端 DNS 解析。在目前的常用浏览器中,貌似只有 Firefox 支持可选的远端 DNS 解析,方法见这里

我没有找到 IE 和 Chrome 支持远端 DNS 解析的方法,从讨论来看似乎是不支持的,Opera 则根本没有 SOCKS 代理支持。

即便是 Firefox,对远端 DNS 解析的支持也是有一些问题的。我的经验是:Firefox 只有在设置里面写死 SOCKS v5 的代理服务器设置时,才会支持远端 DNS 解析;当使用自动代理设置脚本(.pac )时,即使返回 SOCKS 代理,Firefox 也不会进行远端 DNS 解析。

结论是,如果想要远端 DNS 解析,只能手动切换 SOCKS 代理,不能使用自动代理配置脚本。

网友 forkei 的重要评论

chrome 的 Proxy Switchy 1.4.2 版本插件可以很好的解决这个问题。Firefox 的 FoxyProxy 插件也可以很好的解决 DNS 污染。支持插件扩展功能的浏览器功能就是强大。IE 内核浏览器和 opera 只有通过 polipo 或者 privoxy 将 socks 代理转为 http 代理才行,麻烦。

分类: IT 标签: , , , ,

RSS Feed 迁移方法

2010年1月9日 Solrex Yang 2 条评论

由于政策的调整,目前很多博主都将博客域名从 .cn 迁出,相信很多朋友都会遇到 RSS Feed 迁移的问题。如果一直使用 Feedburner/Feedsky 这种第三方烧录网站管理订阅,只需要更换第三方抓取的源即可;但是如果之前订户多用 Wordpress 原始的源 example.cn/feed/、example.cn/?feed=rss2,或者使用自定的域名 feed.example.cn 的话,当域名迁移时,原来的 example.cn 被弃用后,订户就无法得到文章更新了。

我之前一直使用 feed.solrex.cn 作为 Feedsky 的自定义域名,因为我觉得 solrex.cn 可能比 feedsky.com 更长久,后来发现这是非常愚蠢的想法。当我把域名迁移到 .org 时,就面临 feed 迁移的问题。

最简单的方法是将原来的 feed url 重定向到 Feedburner/Feedsky,但这要求网站主必须仍然控制原来域名,那就没有更换域名的必要了。

或者使用一篇博客来通知订户更换 feed url,但是实践证明这种方法收效甚微。很多人(包括我)不会去看自己使用的是什么源,认为自己使用的就是正确的 feed url。

起初我是使用的直接重定向,但后来一封域名注册商的邮件,威胁如果不办理某些手续,24日之后会停止我的 .cn 域名解析。我想,还是用一些略显卑劣的手段通知大家更换订阅源吧。这种卑劣的方法是:如果使用原来的源订阅本站,就会看到每天一篇的“网站迁移通知”,直到用户更改订阅源,或者无法忍受直接删除 feed。

其技术实现方法是:使用 php 模仿 WP 的 rss 源生成一个 xml 文件,该文件只包含一篇文章,将原来的源指向它(或者 url 重定向到它)。该 xml 中的更新日期、文章 url 每天更新一次,这样阅读器就会认为博客有更新,把这篇文章抓取回去。我本以为阅读器是根据更新日期判断文章是否重复,后来发现是根据文章 url 来判断。为减少工作量,我们可以将文章的 url 指向某篇目标文章,然后在 url 后面加上 “?date=***”,这样阅读器就不会认为是同一篇文章,而且读者仍然能够点入目标文章。

方法很简单,如果您比较懒的话,可以参考我使用的文件(也可以从这里直接下载 php 源代码):

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n"; ?>
<?php echo '<?xml-stylesheet type="text/xsl" media="screen" href="http://feeds.feedburner.com/~d/styles/rss2chinesetwfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?>'; ?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
    <title>Solrex Shuffling</title>
   
    <link>http://blog.solrex.org</link>
    <description>Engineering a better life, programming a great future.</description>
    <pubDate><?php echo date('D, d M Y ', strtotime("+7 hour")); echo '00:00:00 GMT'; ?></pubDate>
    <generator>http://wordpress.org/?v=2.7.1</generator>

    <language>en</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
        <item>
        <title>站点迁移通知-<?php echo date('d M Y', strtotime("+7 hour")); ?></title>
        <link>http://blog.solrex.org/?p=638679&amp;q=<?php echo date('Ymd', strtotime("+7 hour")); ?></link>
        <comments>http://blog.solrex.org/?p=638679&amp;q=<?php echo date('Ymd', strtotime("+7 hour")); ?>#comments</comments>
        <pubDate><?php echo date('D, d M Y ', strtotime("+7 hour")); echo '00:00:00 GMT'; ?></pubDate>
        <dc:creator>Solrex Yang</dc:creator>
       
        <guid isPermaLink="false">http://blog.solrex.org/?p=638679&amp;q=<?php echo date('Ymd', strtotime("+7 hour")); ?></guid>
        <description><![CDATA[您好,您之所以看到这篇文章是因为您仍在使用被遗弃的 feed 地址 http://feed.solrex.cn 订阅我的博客Solrex Shuffling。我已经将网站从 http://blog.solrex.cn 迁移到了 http://blog.solrex.org。由于 .cn 域名潜在被删除的危险,为了不丢失和您交流的渠道,我不得不出此下策以每天一篇博客的方式提醒您更新 feed 地址,希望您能谅解!...
]]></description>
            <content:encoded><![CDATA[<p>您好,您之所以看到这篇文章是因为您仍在使用被遗弃的 feed 地址 http://feed.solrex.cn 订阅我的博客<a href="http://blog.solrex.org">Solrex Shuffling</a>。我已经将网站从 <a href="http://blog.solrex.org">http://blog.solrex.cn</a> 迁移到了 <a href="http://blog.solrex.org">http://blog.solrex.org</a>。由于 .cn 域名潜在被删除的危险,为了不丢失和您交流的渠道,我不得不出此下策以每天一篇博客的方式提醒您更新 feed 地址,希望您能谅解!</p>
<p>如果您觉得<a href="http://blog.solrex.org">本站</a>对您还有点儿用处,可以使用以下方式继续订阅:</p>
<ul>
<li><p>如果您使用离线阅读器,请将本站的 feed 地址 <a href="http://feeds.feedburner.com/solrex">http://feeds.feedburner.com/solrex</a> 或者 <a href="http://feed.feedsky.com/solrex">http://feed.feedsky.com/solrex</a> 添加到您的订阅器中,并删除现有这个 feed。</p></li>
<li><p>如果您使用在线阅读器,比如 Google Reader、抓虾 之类,您可以点击<a href="http://blog.solrex.org">这里</a>到本站首页,在右侧选择您的在线阅读器,重新订阅,并将现在这个 feed 删除。</p></li>
</ul>
<p>如果您觉得<a href="http://blog.solrex.org">本站</a>对您不再有用,可以使用以下方式退订:</p>
<ul>
<li><p>如果您使用离线阅读器,请咨询阅读器帮助如何删除 feed,一般情况下在 feed 上直接点 del 键即可。</p></li>
<li><p>Google Reader 用户可以在左侧 Subscriptions 中找到本 feed(一般名为 Solrex Shuffling),将鼠标移动至其上,您会发现右侧有一个向下的小箭头,点击箭头,您就会发现有 Unsubscribe 的选项;或者您也可以到右上角的 Setting 中,点入 Subscriptions 标签页,对所有 feed 进行管理时删除 Solrex Shuffling 这个 feed。您可以在<a href="http://www.google.com/support/reader/bin/answer.py?hl=zh_CN&answer=73062">这个页面</a>找到更多帮助。</p></li>
<li><p>抓虾用户可以在<a href="http://zhuaxia.com/help.php#3_3">这个页面</a>找到退订的帮助。</p></li>
<li><p>其它在线阅读器用户请咨询该网站帮助。</p></li>
</ul>
<p>无论如何,感谢您一直以来对本站的支持,我希望能在<a href="http://blog.solrex.org">新的站点</a>继续收到您的批评或支持!祝您好运!</p>
<p>Solrex Yang</p>
<p><?php echo date('D, d M Y ', strtotime("+7 hour")); ?></p>
]]></content:encoded>
            <wfw:commentRss>http://blog.solrex.org/?p=638679&amp;q=<?php echo date('Ymd', strtotime("+7 hour")); ?>/feed/ ?></wfw:commentRss>
        </item>
</channel>
</rss>

您可以到 feed.solrex.cn 查看效果。

分类: Open Source, Programming 标签: , ,

我的 2009 报表

2010年1月2日 Solrex Yang 14 条评论

2009 年,我第一次开始认真记账,使用的是“雙胞胎拔拔”的“電子式家庭記帳簿”。由于 WPS Office 无法支持很多 Excel 的高级功能,所以只能使用低版本的 V1.x。为了避免误操作,平时还将 xls 文件备份到 Dropbox。

一年来,基本上能想得起的花销都记了下来,总算形成了一份我的 2009 年报表。结果很悲剧,年终盘点,支出超过收入 1635.44 元。我原以为这每月 759.5 块的补助能使我收支平衡呢...还好我还有点儿积蓄,看来我还是高估了自己的节俭能力。

我的 2009 报表

分类: Life 标签: , ,