分类存档: Notes

使用 KindleEar 定时推送《知乎日报》到 Kindle Paperwhite

入手 Kindle Paperwhite 已经有段时间了,但是一直没有充分利用起来。

HiPDA! 的 E-ink 版乱逛的时候,看到 cdhigh 开源了一个 Kindle 推送服务的代码 KindleEar,而最近又经常会去看知乎日报,于是就想能不能每天定时把知乎日报推送到 Kindle 上阅读。

在看了 KindleEar 的代码之后,发现添加一种订阅源还是比较简单的,于是直接拷贝了原来 books 中的代码,写了一个知乎日报的模块 ZhihuDaily.py

具体的代码可以前往我的 fork:,我也已经提交了 Pull Request 给原作者。

不过在测试过程中发现知乎屏蔽了来自 Google App Engine 的网页获取请求,经过 @clowwindy 说明得知有人滥用 Google App Engine 于是简单的屏蔽了 GAE 的访问。

当然这个不难解决,通过另外一个服务器中转一下知乎日报的 Feed 就行了,知乎并没有屏蔽所有外部访问⋯⋯

于是写了个 ZhihuDailyForwarder,将这个项目部署到 appfog 上,再将 ZhihuDaily.py 中原来的 API 地址替换成 appfog 上的项目首页地址,就可以正常的采集了。

完整部署的步骤:

  1. 下载 ZhihuDailyForwarder 项目代码,部署到 appfog 或其他支持 nodejs 的服务器上
  2. 下载

项目代码,参照 readme.txt 中说明,修改 app.yaml 及 config.py 中相关设置

  • 进入 KindleEar 项目文件夹,修改 books/ZhihuDaily.py,修改 http://news.at.zhihu.com/api/1.1/news/latest 为第一步中部署完毕的 ZhihuDailyForwarder 首页地址,例如 http://example-zhihu.aws.af.cm
  • 部署 KindleEar 到 Google App Engine
  • 进入部署完毕的 KindleEar 网站,设置自己的 Kindle 邮箱,并订阅知乎日报,当然别忘了在 Amazon 那边设置允许发送邮件的邮箱地址为 Google App Engine 的账号邮箱地址。
  • PS. 知乎并没有正式开放知乎日报的 API,目前使用的 API 为网友嗅探而来,随时有可能被停用,所以不能保证这个功能长期有效。

    感谢 cdhigh 带来的 KindleEar 项目。

    希望此文对 Kindle 用户和知乎日报爱好者有所帮助。

    参考资料

    1. http://www.hi-pda.com/forum/viewthread.php?tid=1213082
    2. https://gist.github.com/zellux/5844688
    3. https://github.com/ohdarling/KindleEar
    4. https://github.com/cdhigh/KindleEar
    5. 知乎日报 Feed 转发服务 nodejs 版本

    —EOF—

    一个路由器,两种网络,VPN和下载两不误

    最近在用 Titanium 写一个 Twitter 客户端,因为要用到 OAuth 认证,所以就在手机连接 VPN,但是速度比较慢。刚好想在家里的路由器上加上 OpenVPN,昨天就折腾了一下。

    在家里路由器上加上 OpenVPN 的一个主要问题是,家里的网络中还有下载机,而下载的流量是不想通过 VPN 去传输的。虽然 chnroutes 项目的路由表可以让国内的 IP 走直连,国外的 IP 走 VPN,但是 eMule 或者 BT 下载时,难免会连接到国外的用户或者服务器,这个时候也不想去浪费 VPN 的流量。

    因为这些,我的想法是在路由器上做判断,如果是从下载机过来流量,就通过直接连接,如果其他机器,例如笔记本,就根据目标 IP 来判断是通过直接连接还是 VPN 来传输。

    下载机是通过 LAN 连接到路由器的,本来想按进入流量的设备来判断是否为下载机,后来发现实现比较麻烦,就决定按流量来源 IP 来判断是否为下载机的数据。

    准备工作

    • 运行 dd-wrt 的路由器一个,要带有 OpenVPN
    • OpenVPN 服务器一个,认证方式选择证书认证
    • Linux 知识若干

    当然 dd-wrt 并不是必须的,也可以是 openwrt 或者 tomato 之类,只要带有 OpenVPN 就行,如果不带 OpenVPN,就需要在启动过程中去外部下载相关的软件,那就是另外的内容了,暂且不提。

    网络分段

    因为要按 IP 来区分流量是否要走 VPN,因此要先划分一下局域网里要用到的 IP 段。

    路由器的 IP 是 192.168.2.1,DHCP 分配范围为 192.168.2.100~149,按照需求将一个 /24 的网段分为三个部分:

    • 192.168.2.16~31,此 IP 段的设备流量均走直连
    • 192.168.2.32~63,此 IP 段的设备流量根据目标 IP 判断走直连还是走 VPN
    • 192.168.2.100~149,此 IP 段为 DHCP 分配的 IP 段,流量也根据目标 IP 来判断是否走 VPN

    因为 DHCP 分配的 IP 并不可控,所以将流量走直接的设备,例如下载机,通过静态 IP 的方式,直接分配一个在 192.168.2.16~32 中固定 IP,可以保证不会连接到有 VPN 的网络。

    路由策略表

    先创建一个用来直连的路由策略表,用来将所有指定 IP 段的流量走直连。

    # 添加一个路由策略表,此表针对 192.168.2.16/28 IP 段有效
    ip rule show | grep "lookup 10" || ip rule add from 192.168.2.16/28 ta 10
    
    # 设置策略表的默认路由
    WAN_IP=`ifconfig ppp0 | grep "inet addr" | cut -d ":" -f 2 | cut -d " " -f1`
    ip route replace 192.168.2.0/24 dev br0 proto kernel scope link src 192.168.2.1 ta 10
    ip route replace 127.0.0.0/8 dev lo  scope link
    ip route replace 169.254.0.0/16 dev br0  proto kernel  scope link  src 169.254.255.1
    ip route replace default via $WAN_IP dev ppp0 ta 10
    

    将以上代码保存在 dd-wrt 的 Filewall Script 中,这样在每次 WAN IP 改变的时候,都可以更新这个路由策略表了。

    OpenVPN 配置

    OpenVPN 按默认配置即可,需要注意的是,路由器上的 tun mtu、tun mtu extra 以及 mssfix 需要与服务器一致,或者服务器与路由器上的配置一致。

    因为要用到 chnroutes,但是 dd-wrt 中的 OpenVPN 配置并不支持自定义配置,没办法添加 route 选项,因此要把这些选项放到 OpenVPN 服务端的配置文件中,使用 push 指令在连接时推送到客户端来。

    例如:

    push "route 1.0.0.0 255.255.0.0 net_gateway 5"
    

    另外一有点需要注意,如果在 dd-wrt 中同时启用了 OpenVPN Daemon,建议将 OpenVPN Daemon 的启动方式设置为“System Startup”而不是“WAN Up”,在我的路由器上,使用“WAN Up”时 OpenVPN Daemon 和 OpenVPN Client 会冲突,导致 OpenVPN Client 启动失败。

    解决 max-routes

    OpenVPN 客户端,默认最多只能添加 100 条路由记录,但是 chnroutes 正常生成的路由表,可能会在 1000 条以上,因此 100 条是远远不够的。

    这个可以通过 max-routes 配置项来解决,本来打算这个配置同样从服务端推送过来,但是 OpenVPN 现在并不支持 push “max-routes 1500” 这样的指令。

    在 dd-wrt 的 OpenVPN 配置中,也没有相应的选项,为了解决这个问题,只能采取一个比较取巧的办法来解决。dd-wrt 中的 OpenVPN 配置都是存在 nvram 中的,在 dd-wrt 启动后,会自动从 nvram 中取 OpenVPN 的相关配置,组合成一个 openvpn.conf,而这个配置除了可以在 dd-wrt 的 Web 界面中修改,还可以直接 SSH 到 dd-wrt 上,直接使用 nvram 命令修改。

    在这里要 hack 的配置是 mssfix,当然其他的属性也可以,选择 mssfix 是因这个属性比较简单,改起来方便。

    我这里设置了 mssfix 为 1400,另外服务器要推送的路由表为 1300 条左右,直接将 max-routes 设置为 1500,在路由器上运行下面这个指令:

    nvram set openvpncl_mssfix="1400
    max-routes"
    

    需要注意的是,一定要分两行来输入,否则生成的 openvpn.conf 中,mssfix 1400 和 max-routes 1500 会在同一行而导致配置失效。

    这样在生成的 OpenVPN 配置文件中,就有了 max-routes 选项,服务端也可以正常推送路由表了。

    不过这样也有一点坏处,那就是如果再修改了 OpenVPN 配置并保存,会把 mssfix 中的那个回车给去掉,再次导致连接失败。不过 OpenVPN 一旦配置完成,也不会经常改动,倒也不是很大的问题。

    配置 DNSMasq

    一般手机上连接上 WiFi 的时候,设置 DNS 等内容会比较麻烦,而如果不设置 DNS,会导致在手机上解析域名时,使用了国内的 DNS 服务器,而这也会导致一些问题,可以按照 autoddvpn 中的说明,将 DNS 设置为 Google Public DNS 和 OpenDNS:

    8.8.8.8
    8.8.4.4
    208.67.222.222
    

    打完收工

    配置完成之后,就可以方便的分配家庭局域网里设备的流量走向了,想要设备的流量走直连,只要分配到 192.168.2.16~31 这个 IP 段就可以了,至于其他的设备,可以使用静态 IP,也可以直接使用 DHCP 分配。

    嗯,这样再在真机上调试 Twitter 客户端之类的程序就方便了。

    PS. 非常感谢 @tjmao 在折腾过程中帮助。

    参考资料

    1. autoddvpn: DNSMasq
    2. OpenVPN 2.1 Manual
    3. linux 高级路由及流量控制总结
    4. ip(8)
    5. route(8)
    6. ddwrt: Hardware

    — EOF —

    Snow Leopard Server 上配置 Gitosis 笔记

    为了迁移项目 Git 仓库到 Mini Server 上,需要在 Snow Leopard Server 上配置一下 Gitosis,但是 Mac OS X 和 Linux 不太一样,有些地方需要特殊处理一下。

    安装 Gitosis

    Gitosis 的安装就不多说,在参考文档2中有。

    添加 Git 用户组及用户

    添加用户可以用参考文档1中的方法来创建,没有尝试直接用 OSX 的用户管理来创建是否可用。

    # 这里的用户组和用户ID 用 401,但是实际用时需要根据服务器上的情况来创建
    # 我在使用时 401 这个 gid 就已经被占用了,可以使用以下两个命令看看要用的
    # ID 是否已经被用了。
    sudo dscl . list /Users uid
    sudo dscl . list groups gid
     
    # 创建用户组 git
    sudo dscl . create groups/git
    sudo dscl . create groups/git gid 401
     
    # 创建用户 git
    sudo dscl . create users/git
    sudo dscl . create users/git uid 401
    sudo dscl . create users/git NFSHomeDirectory /Users/git
    sudo dscl . create users/git gid 401
    sudo dscl . create users/git UserShell /bin/bash
    sudo dscl . create users/git Password '*'
     
    # 创建用户主目录,Git 仓库就要放在里面
    sudo mkdir /Users/git
    sudo chown git /Users/git
    sudo chgrp git /Users/git
     
    # 下面这一句是把 git 用户添加到可以使用 ssh 访问的用户组里面
    # 如果不执行这句的话,git push 或者 git pull 等等的时候会出错
    sudo dscl . -append /Groups/com.apple.access_ssh GroupMembership git

    配置 Gitosis

    这个在参考文档2中都有详细说明。

    参考文档

    1. git hosting with Leopard, Ian White
    2. 权限管理器 Gitosis, Pro Git
    3. Adduser for Mac OS X = dscl + niutil + nicl, otaku ramblings

    解决 Finder 中挂载 Samba 出现“输入的文本似乎不是可识别的 URL 格式”错误

    在公司里为了让笔记本和台式机共享文档,决定用内部的 Samba 做中转,但是在 Finder 中直接使用“连接到服务器”时,会出现“输入的文本似乎不是可识别的 URL 格式”错误,但是我输入的地址明明是 smb:// 开头的。

    用这个错误信息在网上找了找,没有找到任何解决文案,遂放弃。

    今天决定再尝试一下,换了个关键字,直接用“iDeneb samba”作为关键字来搜索,慢慢发掘之后还真找到了有用的信息:http://www.hackint0sh.org/f179/81233.htm

    按照文中说明,到 /System/Library/Filesystems 目录下,把 afpfs.fs 删除,并重新创建到 /System/Library/Filesystems/AppleShare/afpfs.kext 的软链接,但是操作完之后还是会提示“输入的文本似乎不是可识别的 URL 格式”。

    再找了找,找到了这篇:http://www.insanelymac.com/forum/i … opic=92989&st=580,似乎说是系统安装完成时 afpfs.fs 到 /System/Library/Filesystems/AppleShare/afpfs.kext 的软链接少了开头的斜杠,也就是说它的软链接地址是 System/Library/Filesystems/AppleShare/afpfs.kext

    好吧,我在之前操作的时候为了省事,直接进入 Filesystems 目录用相对路径来创建软链接的,看了文章之后,老老实实的用全路径再次创建软链接,Command+K,双击,成功连上 Samba 服务器:)

    完整的操作步骤也只有两步:

    sudo rm /System/Library/Filesystems/afpfs.fs

    sudo ln -s /System/Library/Filesystems/AppleShare/afpfs.kext /System/Library/Filesystems/afpfs.fs

    注意:一定不能省略了路径最开始的斜杠(/)或者使用相对路径。

    所以,如果你也是用黑苹果的,也碰到了这个问题,不妨试试这个解决方法吧。

    1000E 升级到 2G 内存时安装 OSX 需要用到的 dsdt.aml

    上周去把 EPC 的内存升级到了 2G,直接发现开机进不了 OSX 了。

    在两天没有电脑用之后,下定决心重装系统。重装之后,能进系统,但是重新启动之后键盘和触摸板就不能用了,电池状态指示挂了,郁闷。

    在网上找了找,发现可能是 dsdt 的问题。由于内存大小变了,dsdt 中的信息不正确,继而导致 ACPI 失效,然后就整个玩完了。

    一个老外找到了解决方法,通过修改 dsdt.aml 文件中的内存大小信息,就可以正确进入系统了。直接下载他提供的压缩包中的 dsdt.aml,开机直接四国了……

    好吧,这个老外蛮厚道的,给出了手动处理的方法:

    For the 1GB:

    Name (SMBS, 0×0400)
    OperationRegion (BIOS, SystemMemory, 0x3F7AE064, 0xFF)
    Field (BIOS, ByteAcc, NoLock, Preserve)
    {

    For the 2GB:

    Name (SMBS, 0×0400)
    OperationRegion (BIOS, SystemMemory, 0x7F7AE064, 0xFF)
    Field (BIOS, ByteAcc, NoLock, Preserve)
    {

    手动修改步骤

    1. 首先要下载一个 dsdt.aml 反编译的工具:ACPICA – Windows Binary Tools

    2. 解压后有一个 iasl.exe,把它拷贝到 dsdt.aml 所在的目录或者把 dsdt.aml 拷贝到 iasl 的目录都行,然后在命令行中运行:iasl -d dsdt.aml

    3. 按照上面的说明,使用文本编辑器打开 dsdt.aml.dsl,根据你的内存大小修改 SystemMemory 后面的数值,1G 就用 0x3F7AE064,2G 就用 0x7F7AE064。

    4. 再到命令行中,运行 iasl dsdt.aml.dsl,它会生成一个 dsdt.aml.aml,把它拷贝到 OSX 所在分区的根目录,覆盖原来的 dsdt.aml 即可。或者也可以把原来的文件备份一下,方便出错的还原。

    参考资料

    1. eee 1000H(E) – DSDT files and the memory problem

    Bespin 0.2.1 “Cheeky Cirrus” Released

    Mozilla Labs 昨天发布了 Bespin 0.2.1 “Cheeky Cirrus”。就在前天的时候,Mozilla Labs 发布了 Bespin 0.2.0 “Sassy Cirrus”,不得不说开源项目的更新速度是相当快,现在 Bespin 项目的开发成员好像越来越多,估计要进入快速发展期了,非常期待 Bespin 的优异表现。

    昨天发布的 Bespin 0.2.1 “Cheeky Cirrus” 中更新了以下内容:

    1. Jetpack 支持:按文档来看,应该是用于扩展程序功能的,可以在以后 Bespin 支持插件时,给插件提供调试、永久存储以及用户界面上面的支持。

    2. 增加了 “hg init” 命令来给将一个项目初始化为一个 Mercurial 版本库。

    3. 增加了 “vcs status” 查看当前工作副本的状态。

    4. 增加了对子命令自动完成的支持。

    Bespin 从 0.2.0 Sassy Cirrus” 开始就开始支持 Mercurial 了,这也就意味着,可以使用 Bespin 来进行协作开发,通过 Mercurial 来同步工作。另外,Google Code 也在前些天宣布 Google Code 将要支持 Mercurial,已经在征集测试者。等到 Google Code 正式支持 Mercurial,那个时候就可以直接使用 Bespin 进行编辑,使用 Google Code 来进行代码的版本管理了。这对于托管在 Google Code 上的开源项目的开发者来说,以后就可以过上一个浏览器走天下的日子了,在换到新的环境时,不需要再重新配置开发环境等。

    现在 Bespin 的 vcs 命令并不完整,目前只能 push 到 clone 时指定的版本库,也不支持 pull 命令。不过如果就单人开发来说,现在的 vcs 命令已经足够。

    如果需要尝试 Bespin 的 vcs 功能,可以在 http://bitbucket.org/ 注册一个帐号,并在 Bespin 使用 SSH 方式连接版本库。详细使用方法可以参考 Kevin Dangoor 录制的一段视频

    在 Bespin 0.2.0 “Sassy Cirrus” 中,主要是增加了对版本控制命令的支持,以及其他界面和功能上的细微更新。

    Bespin 并不仅仅支持 HTML、JavaScript 和 CSS 语法高亮,目前还支持的有 Python,以后也会有更多语言的语法高亮支持,这也就是说 Bespin 可以用来做为任何语言的编辑器。而且目前 Bespin 已经支持了 JavaScript 的 outline,相信以后会有更强大的功能出现。

    Bespin 所有的 Release Notes 可以在 这里 看到。

    解决Windows Vista中截图工具运行速度慢的问题

    Vista自带的截图工具还是比较好用的,但是一直以来运行总是很慢,从按下快捷键到出来截图界面需要很长时间,通常需要几秒到十几秒不等,这让人很奇怪,按说,截图工具算是个小工具软件,运行速度不至于这么慢的。但是,它就是这么慢……

    今天又想到这个问题了,就去网上找了找,找到了篇帖子说是TablePC的服务器造成的,于是打开服务管理器,启动 Tablet PC Input Service 服务,再运行截图工具,果然,速度快了很多。

    这个服务是之前优化服务时关闭的,觉得台式机用不着那东西。看来服务优化还是需要谨慎的。

    提高Vista开始菜单文件夹展开速度的小技巧

    用了Vista一段时间,总是觉得Vista的开始菜单里的文件夹展开速度很慢,以前配置不是很好,可以理解为配置的原因,但是现在配置应该也不差了吧,怎么会还是这样呢。

    某天玩电脑的时候突然想到,会不会是那个“高亮显示新安装的程序”的原因,试了一下,开始菜单里的文件夹展开速度果然快了很多。

    如果你的Vista在进入开始菜单,展开文件夹的时候速度也是很慢的话,不妨试试禁止“高亮显示新安装的程序”,步骤是:在开始的微软徽标上右击,选择属性,然后进入“开始”菜单选项卡,点击“自定义”,打开“自定义’开始’菜单”对话框,在列表中找到“突出显示新安装的程序”,取消选中这个项目,然后确定两遍即可。

    跟VMware有得比的虚拟机,VirtualBox

    新硬盘到手,装好vista,又准备装个Ubuntu 8.04,但是只有镜像没有光盘,又没有空的CD刻录盘,于是就先在虚拟机去体验一把了。

    虚拟机到现在我也用过不少了,Virtual PC、VMware、Bochs、QEMU这几个常见的虚拟机都用过,但是就速度和功能上来说,还是首选的VMware。自从Virtual PC被微软收购之后,貌似就没怎么用过了,一方面微软把Guest OSes限制在了Windows系列,虽然安装其他系统也是行,但是总是感觉不太舒服的,另一方面就是Virtual PC的速度有待提高了。

    VMware安装Ubuntu非常方便,直接镜像放进去,按正常步骤安装。

    在虚拟机里安装好Ubuntu之后,想用用VMware for Linux版的Unity功能,于是就去下了个VMware for Linux 6.5 Beta,弄到虚拟机里。

    但是,安装完VMware,在Ubuntu里安装系统的时候才发现,VMware不支持在虚拟机里的虚拟机安装系统……

    好吧,既然VMware检测了Host OS是否运行在虚拟机环境里,那么我换个虚拟机总行了吧。

    Linux里的虚拟机,以前也玩过,还是知道有个VirtualBox的,然后又想到之前有看到新闻说VirtualBox也支持类似VMware Fusion那样的无缝运行了。赶紧去VirtualBox官方网站下了个v1.5.6的。

    安装完VirtualBox启动它,界面很是简洁,左边是虚拟机列表,右边是选中的虚拟机的配置信息,这个布局很像Virtual PC,只不过VPC只有虚拟机列表而已。

    图片附件

    先装个TinyXP试试。TinyXP安装很快,10分钟左右就搞定了。然后安装附加软件包,重启客户机之后,无缝模式已经可以用了,感觉比较好,效率比VMware高,停顿的感觉没有VMware那么明显。

    昨天在VirtualBox官方看到了v1.6.0的changelog,但是却没有找到v1.6.0的下载,还很奇怪,今天能下载了才想起来VirtualBox被Sun收购了,v1.6.0是被Sun收购之后推出的第一个版本,看changelog里改变蛮大的,我比较关注其中有一个就是支持Linux客户机的无缝运行。

    下了v1.6.0,重新安装后,把安装好的Ubuntu附加软件升级了一下,无缝模式也可以运行了。

    没有运行在无缝模式下的Ubuntu,桌面分辨率可以随窗口大小而改变。

    图片附件

    运行在无缝模式下的Ubuntu,下面这张图里是Ubuntu的终端和Windows的cmd一起运行的情况。

    图片附件

    感觉VirtualBox在Linux下的无缝模式还不是很稳定,不过也有可能是因为没有安装好的关系,不过不管怎么说,VirtualBox的速度和功能还是让人比较满意的,等有Ubuntu 8.04的CD之后,也去装一个。

    BOM引起的网页布局混乱

    页面的上部比正常状态下多出一块空白,而且整个页面的布局完全是混乱的。

    一开始以为是服务器上文件版比本地的文件版本旧的原因,比对了一番没找到不同的,然后想到会不会是文件编码的问题。

    切换到Zend Studio,找到首页的模板文件,属性里一看,编码UTF-8,对的,但是下面一行字引起了我的注意,“Byte Order Mark is UTF-8 (BOM)”,于是就想是不是这个玩意引起的布局混乱。

    打开EditPlus,设置文件保存选项为一直删除BOM,打开首页模板,保存,上传,测试,没有问题!

    看来果然是BOM的问题了,接下来的事就比较机械了,在模板文件里看哪些是带了BOM的,直接到EditPlus里走一遭就行了。

    解决了这个问题才想起来,有些模板为了转换成UTF-8编码的,就用记事本打开文件,然后另存为UTF-8编码了,但是记事本是会给UTF-8编码的文件加上BOM的,因此就引起了首页布局的混乱。

    嗯,问题解决,就这样。