使用 dnsmasq 配合 openvpn

使用 openvpn 并配合 chnroutes 脚本上网已经很完美了,在访问国外的 ip 时自动使用 vpn 线路,在访问国内的 ip 时则自动选用非 vpn 线路,为什么还要使用 dnsmasq 呢?原因如下:

由于有域名污染,所以 dns 只能使用 8.8.8.8 或者 opendns 之类的进行解析;而使用国外的 dns 之后,在解析某些使用了智能 dns 的服务时,智能 dns 服务器往往会选择错 ip 地址,就会导致:

  1. 明明是国内的服务,却解析到一个国外的 ip,并使用 vpn 进行访问,导致速度慢
  2. 自己的电信的线路,却解析到网通的 ip,访问同样也会受到影响

为了解决上述问题,就需要将这些域名转发到自己所在的 isp 提供的 dns 进行解析。一般的 dns 服务器软件都提供这样的功能,不过这里用不到那么复杂的功能。而之前介绍 dns 缓存的时候使用到的 dnsmasq 也能提供转发功能,因此这里就继续使用 dnsmasq。配置极其简单,只需要在配置文件 /etc/dnsmasq.conf 中对 server 字段进行配置即可,比如我的配置:

no-resolv
no-poll
server=8.8.8.8
server=8.8.4.4
server=/qq.com/192.168.1.1

表示默认使用 8.8.8.8 和 8.8.4.4 解析,当解析 *.qq.com 的时候使用 192.168.1.1 解析。你需要把 192.168.1.1 换成你 isp 提供的 dns 服务器。
最后,启动 dnsmasq 服务,把自己的 dns 服务器指向 127.0.0.1 即可,由于我使用了 resolvconf,所以直接在 /etc/resolvconf.conf 中加入一下配置即可:

name_servers=127.0.0.1

下面可以使用 dig 命令进行一个简单的测试:

$ dig @8.8.8.8 web2.qq.com
 
; <<>> DiG 9.8.0 <<>> @8.8.8.8 web2.qq.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6525
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;web2.qq.com.			IN	A
 
;; ANSWER SECTION:
web2.qq.com.		221	IN	A	112.90.138.163
web2.qq.com.		221	IN	A	112.90.138.164
web2.qq.com.		221	IN	A	112.90.141.88
 
;; Query time: 217 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Jul 20 00:17:59 2011
;; MSG SIZE  rcvd: 77
 
$ dig @192.168.1.1 web2.qq.com
 
; <<>> DiG 9.8.0 <<>> @192.168.1.1 web2.qq.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13332
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;web2.qq.com.			IN	A
 
;; ANSWER SECTION:
web2.qq.com.		101	IN	A	183.62.126.217
web2.qq.com.		101	IN	A	183.60.3.126
web2.qq.com.		101	IN	A	121.14.74.112
web2.qq.com.		101	IN	A	183.60.3.84
 
;; Query time: 10 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Wed Jul 20 00:18:06 2011
;; MSG SIZE  rcvd: 93
 
$ dig @127.0.0.1 web2.qq.com
 
; <<>> DiG 9.8.0 <<>> @127.0.0.1 web2.qq.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23246
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;web2.qq.com.			IN	A
 
;; ANSWER SECTION:
web2.qq.com.		94	IN	A	183.60.3.84
web2.qq.com.		94	IN	A	121.14.74.112
web2.qq.com.		94	IN	A	183.60.3.126
web2.qq.com.		94	IN	A	183.62.126.217
 
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 20 00:18:13 2011
;; MSG SIZE  rcvd: 93
 
$ dig @127.0.0.1 twitter.com
 
; <<>> DiG 9.8.0 <<>> @127.0.0.1 twitter.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57641
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;twitter.com.			IN	A
 
;; ANSWER SECTION:
twitter.com.		19	IN	A	199.59.149.198
twitter.com.		19	IN	A	199.59.149.230
twitter.com.		19	IN	A	199.59.148.10
 
;; Query time: 205 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 20 00:26:57 2011
;; MSG SIZE  rcvd: 77

可以看到使用 8.8.8.8 时解析到了网通的地址,而使用 127.0.0.1 后,则可以正确的解析为电信的地址。同时解析 twitter.com 也能正确的返回结果。

Posted in linux软件使用 | Tagged , , , | Leave a comment

我的 xmonad 配置

本文讲述我的 xmonad 桌面的配置,它使用 xmobar 显示各种状态,使用 taryer 来提供 systray。

xmonad 是一种平铺式窗口管理器,窗口之间不会遮挡,且自动调整大小以填充整个屏幕,这样就节省了使用鼠标调整各个窗口位置的时间,一切的操作都可以通过自定义的快捷键来完成。

先来张我的桌面:
xmonad-with-emerge
可以看到,除了最上面的状态栏之外,整个屏幕都被 gnome-terminal(设置为完全透明了)填满;当有多个窗口时,屏幕截图如下:
xmonad-windows
同样,除了最上面的状态栏之外,整个屏幕都被这三个窗口填满。嗯,这就是平铺式窗口管理器了。
xmonad 是由 Haskell 开发的,其配置文件也是使用 Haskell 来配置的,不过了解一些简单的语法之后,配置起来也是很方便的。当然默认的配置就已经非常好用了,我也只是在默认的配置上进行了一点小的修改而已。
下面是我的 xmonad 配置与默认配置之间的差异(只是为了表现差异,最后会有整个配置文件的下载):

--- /usr/share/xmonad-0.9.2/ghc-7.0.4/man/xmonad.hs	2011-07-05 00:22:51.800397623 +0800
+++ .xmonad/xmonad.hs	2011-07-14 22:39:43.118625125 +0800
@@ -14,10 +14,15 @@
 import qualified XMonad.StackSet as W
 import qualified Data.Map        as M
 
+import XMonad.Util.Run
+import XMonad.Hooks.DynamicLog
+import XMonad.Hooks.ManageHelpers
+import XMonad.Util.Cursor
+
 -- The preferred terminal program, which is used in a binding below and by
 -- certain contrib modules.
 --
-myTerminal      = "xterm"
+myTerminal      = "gnome-terminal"
 
 -- Whether focus follows the mouse pointer.
 myFocusFollowsMouse :: Bool
@@ -32,7 +37,7 @@
 -- ("right alt"), which does not conflict with emacs keybindings. The
 -- "windows key" is usually mod4Mask.
 --
-myModMask       = mod1Mask
+myModMask       = mod4Mask
 
 -- The mask for the numlock key. Numlock status is "masked" from the
 -- current modifier status, so the keybindings will work with numlock on or
@@ -127,6 +132,12 @@
     -- Deincrement the number of windows in the master area
     , ((modm              , xK_period), sendMessage (IncMasterN (-1)))
 
+    -- screenshot screen
+    , ((modm              , xK_Print), spawn "/usr/bin/screenshot scr")
+
+    -- screenshot window or area
+    , ((modm .|. shiftMask, xK_Print), spawn "/usr/bin/screenshot win")
+
     -- Toggle the status bar gap
     -- Use this binding with avoidStruts from Hooks.ManageDocks.
     -- See also the statusBar function from Hooks.DynamicLog.
@@ -221,6 +232,7 @@
 myManageHook = composeAll
     [ className =? "MPlayer"        --> doFloat
     , className =? "Gimp"           --> doFloat
+    , isFullscreen                  --> doFloat
     , resource  =? "desktop_window" --> doIgnore
     , resource  =? "kdesktop"       --> doIgnore ]
 
@@ -239,9 +251,13 @@
 -- Status bars and logging
 
 -- Perform an arbitrary action on each internal state change or X event.
--- See the 'XMonad.Hooks.DynamicLog' extension for examples.
+-- See the 'DynamicLog' extension for examples.
+--
+-- To emulate dwm's status bar
+--
+-- > logHook = dynamicLogDzen
 --
-myLogHook = return ()
+myLogHook = dynamicLog
 
 ------------------------------------------------------------------------
 -- Startup hook
@@ -251,14 +267,19 @@
 -- per-workspace layout choices.
 --
 -- By default, do nothing.
-myStartupHook = return ()
+myStartupHook = do
+                  spawn "fcitx"
+                  setDefaultCursor xC_left_ptr
+                  spawn "feh --bg-scale /home/zhanglei/Pictures/mlxmonadwall1trans.png"
+                  spawn "trayer --edge top --align right --widthtype percent --width 10 --SetDockType true --SetPartialStrut true --transparent true --alpha 0 --tint 0x000000 --expand true --heighttype pixel --height 25"
+                  --return ()
 
 ------------------------------------------------------------------------
 -- Now run xmonad with all the defaults we set up.
 
 -- Run xmonad with the settings you specify. No need to modify this.
 --
-main = xmonad defaults
+main = xmonad =<< xmobar defaults
 
 -- A structure containing your configuration settings, overriding
 -- fields in the default config. Any you don't override, will

以上修改的一些简单说明:

  • 使用 gnome-terminal 作为我的终端
  • 使用 Win 健作为 xmonad 的 Mod 健,默认为 Alt,但是会和 bash 的一些快捷键冲突
  • 增加了两个快捷键 Win + Print 与 Win + Shift + Print 用来进行截图
  • 加入 isFullscreen –> doFloat 以解决 flash 不能全屏的问题
  • myLogHook = dynamicLog 可以让 xmobar 显示出当前的状态
  • 在 myStartupHook 函数中加入我的启动项:
    1. fcitx 输入法
    2. 设置鼠标样式
    3. 使用 feh 设置桌面背景
    4. 启动 trayer 以显示 systary
  • 最后,main 函数中使用 xmobar 函数启动 xmobar

下面是一些经常使用到的快捷键:

  • Win + Shift + Enter: 启动 Terminal
  • Win + P: 启动 dmenu,用于启动各种命令
  • Win + 1 – 9: 在 1 – 9 虚拟桌面中进行切换
  • Win + Shift + 1 – 9: 将当前的窗口移动到指定的虚拟桌面
  • Win + Tab: 在同一虚拟桌面中的窗口之间切换
  • Win + Shift + C: 杀死当前窗口
  • Win + Q: 重启 xmonad,用于改为配置之后使其生效

下面是我的 xmobar 的配置,其配置文件为 .xmobarrc

Config { font = "xft:WenQuanYi Zen Hei Mono-12"
       , bgColor = "black"
       , fgColor = "grey"
       , position = TopW L 90
       , lowerOnStart = True
       , commands = [ Run Weather "ZGSZ" ["-t","<station>: <tempC>C","-L","18","-H","25","--normal","green","--high","red","--low","lightblue"] 36000
                    , Run Network "eth0" ["-L","0","-H","32","--normal","green","--high","red"] 10
                    , Run Network "eth1" ["-L","0","-H","32","--normal","green","--high","red"] 10
                    , Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10
                    , Run Memory ["-t","Mem: <usedratio>%"] 10
                    , Run Swap [] 10
		    , Run StdinReader
                    , Run Com "uname" ["-s","-r"] "" 36000
    		    , Run Date "%a %b %_d %Y %H:%M:%S" "date" 10
                    ]
       , sepChar = "%"
       , alignSep = "}{"
       , template = "%cpu% | %memory% * %swap% | %eth0% | %StdinReader% }{ <fc=#ee9a00>%date%</fc>| %ZGSZ% | %uname%"
       }

其中有三点值得注意:

  1. position 指定了 xmobar 的位置:左上,长度 90%,而 trayer 的则为右上,长度 10%。刚好能够接上。
  2. 深圳天气的代码为 ZGSZ,其他地方的可以到这个页面进行查询。
  3. 需要有 StdinReader,否则在 xmonad 中的 dynamicLog 函数就不会起作用。

最后,提供这两个配置文件的下载:
xmonad.hs
.xmobarrc

Posted in linux软件使用 | Tagged , , | Leave a comment

使用vps搭建openvpn

本文讲述使用 vps 搭建 openvpn,以及在 Gentoo 中使用 chnroutes 修改路由表,将国内 ip 的访问重新指定为非 vpn 线路。
条件:

  • 服务器为支持 Tun/Tap 的 vps: 我自己的 Directspace 的 vps,默认是没有开启的,需发 Tk 开启。免费的 AWS EC2 是默认开启了的。我这里的 vps 安装的操作系统为 Debian。
  • 客户端为 Linux:我用的为 Gentoo,其他发行版的脚本和启动 openvpn 的方式可能会不一样

一、在 vps 中安装与配置 openvpn 服务器

安装 openvpn 软件,很简单:

# aptitude install openvpn

生产服务器证书:

# cd /etc/openvpn/
# cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* .
# source ./vars
# ./clean-all
# ./build-ca
# ./build-key-server server
# ./build-dh
# ./build-key client1

在 ./build-key-server server 和 ./build-key client1 两步时会询问是否签名,回答是,如下,其他使用默认即可:

...
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

好了,此时,在 /etc/openvpn/keys 目录下面就有了服务器和客户端所需的证书
下面修改服务器配置文件:/etc/openvpn/server.conf,我只提取有用部分:

port 53
proto udp     # 我这里采用 udp 的 53 端口通信,和 dns 解析用的端口一样 ...
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem    # 以上4个指定服务器证书的路径
server 10.8.0.0 255.255.255.0      # 配置ip地址段
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"    # 默认路由走 vpn,后面在客户端设置时会将国内的 ip 再修改回非 vpn 的路由
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"    # 使用 Google 的 DNS
client-to-client    # vpn 客户端之间可以通信
duplicate-cn        # 多个客户端可以使用同一个证书
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3

一些注释都在上面了。然后启动 openvpn 服务器了

# /etc/init.d/openvpn start

服务器上面还有最后两件事情:打开路由转发选项和配置 SNAT 规则
打开路由转发:修改 /etc/sysctl.conf 文件,将 net.ipv4.ip_forward=1 前面的注释去掉

...
net.ipv4.ip_forward=1
...

然后执行命令:

# sysctl -p

最后设置 SNAT 规则,将 10.8.0.0 网段过来的数据包转发出去后都将源地址修改为本机的 IP 地址,以使回复包能够正确的回到 vps 上。命令:

# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to 10.170.103.65

其中 eth0 要改为 vps 上面的网络接口名称,比如在 Directspace 上面就为 venet0;同时把 10.170.103.65 换成网口上面的地址
当然这样只是当前生效,vps 重启之后还得重新配置 SNAT 规则,可以使用如下语句将当前的 iptables 规则保存起来,然后在开机的时候加载

# iptables-save > /etc/openvpn/iptables

在 /etc/rc.loacl 中加入如下语句:

iptables-restore < /etc/openvpn/iptables

好了,服务器配置就完成了

二、在 Gentoo 下配置 openvpn 客户端

首先同样为安装 openvpn 软件,我这里是 Gentoo,你需要使用你用的发行版的包管理安装

# emerge openvpn openresolv iproute2

安装 openresolv 是为了需要 resolvconf 程序,用于修改 dns 配置的,其他发行版可能不太一样
安装 iproute2 是为了获得 ip 程序,在修改路由时会使用到。
客户端需要使用在配置服务器端时生成的 key,需要如下三个文件:

ca.crt  client1.crt  client1.key

同样,我这里也放到了 /etc/openvpn/keys 目录
然后配置 /etc/openvpn/client.conf

client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 53      # 这里需要换成你自己的服务器,域名或 IP
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key    # 你自己的证书路径
comp-lzo
verb 3
redirect-gateway
script-security 2

创建启动脚本

# ln -vs openvpn /etc/init.d/openvpn.client

然后使用如下命令启动即可

# /etc/init.d/openvpn.client start

但是,这样启动之后,所有的流量都回走 vpn,因此访问国内资源时很慢,且有可能会有限制,所以接下来就需要使用 chnroutes 的方法将访问国内 ip 的路由修改为非 vpn 的线路
下载 chnroutes_ovpn_linux 文件,然后执行

# python chnroutes_ovpn_linux

之后,目录下面就会多出两个文件:

vpndown vpnup

然后将这两个文件拷贝到 /etc/openvpn/ 目录并改名,同时加上可执行权限:

# cp vpnup /etc/openvpn/openvpn.client-up.sh
# cp vpndown /etc/openvpn/openvpn.client-down.sh
# chmod 755 /etc/openvpn/openvpn.client-up.sh
# chmod 755 /etc/openvpn/openvpn.client-down.sh

Gentoo 下面会在 vpn 启动和停止的时候自动调用上面两个脚本。这时再运行

# /etc/init.d/openvpn.client start

过不一会儿,使用 ip 命令查看路由表信息就可以看到国内的 ip 都走了非 vpn 的线路

$ ip r
0.0.0.0/1 via 10.8.0.9 dev tun0
default via 192.168.1.1 dev eth0  metric 2
1.0.1.0/24 via 192.168.1.1 dev eth0
1.0.2.0/23 via 192.168.1.1 dev eth0
1.0.8.0/21 via 192.168.1.1 dev eth0
1.0.32.0/19 via 192.168.1.1 dev eth0
1.1.0.0/24 via 192.168.1.1 dev eth0
1.1.2.0/23 via 192.168.1.1 dev eth0
1.1.4.0/22 via 192.168.1.1 dev eth0
1.1.8.0/21 via 192.168.1.1 dev eth0
...

好了,现在可以打开 Youtube 看下视频了,如图,可以看到使用 AWS EC2 的免费 vpn 速度可以到 400K(见状态栏中 eth0 项),已经很不错了,不过流量每月只有 30G :)
youtube_with_vpn

Posted in linux软件使用 | Tagged , , , | 3 Comments

海南三亚游

总的来说这次旅游就是一次坑爹游,各种遭遇也不想说了,以后旅游还是自驾游比较合适,可惜就是没车。。。
拍了一些照片,挑选了几张,更多的图片在对应的相册里,由于台风刚过,第一天的天气很不好。
IMG_0443
IMG_0394
IMG_0438
IMG_0448
IMG_0467
IMG_0521

Posted in 生活 | Tagged , , | 2 Comments

原来迁移 wordpress 还是挺简单的

我上次迁移我的 blog 的时候折腾了挺久,今天想着能不能直接拷贝过去用呢,结果确实直接拷贝就行了,下面是步骤(ds 是以前的主机,ds4 是现在的主机):

  • 在以前的主机上操作:
    1. 拷贝 WordPress 文件,可以看到我将以前主机上的 /var/www 目录下的所有文件都拷贝到了新主机的 /var/www/blog 目录
      root@ds:/var/www# scp -r * ds4.zlbruce.org:/var/www/blog/
    2. 备份 mysql,将 wordpress 数据库备份出来,保存到 wordpress.sql 文件,然后拷贝到新主机的 /tmp 目录
      root@ds:/var/www# mysqldump --databases wordpress -p password > wordpress.sql
      root@ds:/var/www# scp wordpress.sql ds4.zlbruce.org:/tmp
    3. 拷贝证书,之前的证书文件放到了 /etc/apache2/my_ssl 中,这次我拷贝到了新主机的 /etc/my_ssl 去了
      root@ds:/etc/apache2# scp -r my_ssl ds4.zlbruce.org:/etc/
  • 接下来就是在新主机中的操作了
    1. 首先是 nginx 的配置,主要部分如下:
      server {
              listen   80; ## listen for ipv4
              server_name  www.zlbruce.org;
              access_log  /var/log/nginx/www.zlbruce.org.access.log;
              root   /var/www/blog;
              index  index.php index.html index.htm;
              location / {
                      # This is cool because no php is touched for static content
                      try_files $uri $uri/ /index.php?$args;
              }
      ...
      }
    2. 然后恢复 mysql 数据库,如果你的 mysql 用户名和密码不一样,那么需要修改 wordpress 的配置文件:wp-config.php
      root@ds4:/tmp# mysql -p password < /tmp/wordpress.sql
    3. 最后是 ssl 了,由于 nginx 证书链的加载方式与 apache 不一样,直接放到证书的后面即可,所以
      root@ds4:/etc/my_ssl# cat ca-certs.crt >> ssl_www_zlbruce_org.crt

      然后再设置 nginx 的 ssl 就可以了。

其实就是将 wordpress 和 mysql 都拷过去,然后设置一下就行了。

Posted in Blog相关 | Tagged , , | 2 Comments

折腾 YOURLS

重新买了个便宜点的 VPS,上面尝试用 nginx 来做web服务器,准备慢慢把 Blog 迁移上去。开始之前先在新买的 VPS 折腾了一下 YOURLS 的短网址服务。
YOURLS 的安装方法在其主页上有详细的描述。只是在 nginx 上安装需要注意,由于使用了 Apache 的 .htaccess 文件,所以需要转换成 nginx 的规则,From:使用 Yourls 强化你的短网址系统

if (!-f $request_filename){
set $rule_0 1$rule_0;
}
if (!-d $request_filename){
set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
rewrite ^/([0-9A-Za-z]+)/?$ /yourls-go.php?id=$1 last;
}
rewrite ^/([0-9A-Za-z]+)\+/?$ /yourls-infos.php?id=$1 last;
rewrite ^/([0-9A-Za-z]+)\+all/?$ /yourls-infos.php?id=$1&amp;all=1 last;

本文的短网址:http://zlb.me/3

Posted in Blog相关 | Tagged , , , , | 6 Comments

Blog转到VPS上了

最近买了Directspace的VPS来折腾,同时申请了StartSSL的免费证书,现在我的Blog已经完全转移到这个VPS上面了,并且默认使用https来浏览了。之前Blog所在的主机也是国外的,所以访问速度应该是半斤八两。当然买VPS最主要的原因还是为了搭建我自己的dabr,这样手机上才不用老是开着一个翻墙的ssh连接。
VPS其他的作用正在慢慢折腾中 …

Posted in 生活 | Tagged , , , | 4 Comments

使用Python同步Twitter到Sina微博

更新:2011年6月1号后,sina微博不支持Authorization认证,所以这个脚本不能用了

其实我一直是在用twitter-feed同步的,不过最近不知道怎么回事,老是同步不了,不知道是GAE的问题还是twitter-feed的问题。于是我就决定自己写个。

在我这个C/C++程序员看来,只要涉及到文本解析的东西就觉得头大。加上以前看到Gnome下面一大堆的都是Python的程序,早就想学了,所以这次就决定用Python来写。
先是简单看了下《简明Python教程》,以前看过,不过又忘了…然后到The Python Standard Library里一看,我靠,库真多阿,想有的都有了,怪不得用Python的人多。挑了些用到了的库看了下,然后就开始折腾,经过三天晚上的,终于出来个能用的了。最后在我空间的cron定时执行任务中每隔5分钟调用一次就行了。

下面是代码,很简单,没什么好说的,基本上就是根据库里面的事例代码改过来的:)

PS: Python解析JSON真方便

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
#to ensure the utf8 encoding environment
 
import httplib
import urllib
import json
import base64
import cPickle as p
 
#====需要修改下面g_开头的变量为你自己的
g_since_id_file = "/path/to/store/twitter_id"
 
g_twitter_name="twitter_name"
 
g_sina_username="username"
g_sina_password="******"
g_sina_appkey="appkey"
 
def get_since_id():
    try:
        f = file(g_since_id_file)
        id = p.load(f)
        f.close()
        return id
    except IOError:
        return None
 
def set_since_id(id):
    if id:
        try:
            f = file(g_since_id_file, 'w')
            p.dump(id, f)
            f.close()
        except IOError:
            pass
 
def send_sina_msg(username, password, text):
    auth = base64.b64encode(username+":"+password)
    auth = "Basic "+auth
 
    text = text.encode('utf-8')
 
    params_fields = {"status": text,}
    params = urllib.urlencode(params_fields)
 
    headers = {"Authorization": auth,
              "Content-type": "application/x-www-form-urlencoded"}
 
    conn = httplib.HTTPConnection("api.t.sina.com.cn")
    conn.request("POST", "/statuses/update.json?source="+g_sina_appkey, params, headers)
    ret = conn.getresponse()
 
    print ret.status, ret.reason
 
def parser_twitter(username, last_id):
 
    # 如果last_id为空,那么我们只是取得当前的since_id而不进行同步
    if last_id:
        uri="/1/statuses/user_timeline.json?screen_name=%s&amp;trim_user=true&amp;since_id=%s"%(username, last_id)
    else:
        uri="/1/statuses/user_timeline.json?screen_name=%s&amp;trim_user=true&amp;count=1"%(username)
 
    print uri
 
    conn = httplib.HTTPConnection("api.twitter.com")
    conn.request("GET", uri)
    ret = conn.getresponse()
 
    if ret.status == 200:
        update_id = None
        j = json.load(ret)
 
        # 使其按时间顺序排列
        for info in reversed(j):
            print info['id'], info['in_reply_to_user_id'], info['text']
            update_id = info['id']
            # 过滤回复消息
            if info['in_reply_to_user_id'] == None:
                text = info['text']
 
                if last_id:
                    print "parser msg: ", text
                    send_sina_msg(g_sina_username, g_sina_password, text)
 
        set_since_id(update_id)
    else:
        print "twitter error: ", ret.status, ret.reason
 
    conn.close()
 
last_id = get_since_id()
print "last_id = ", last_id
parser_twitter(g_twitter_name, last_id)
Posted in linux软件使用 | Tagged , , , | Leave a comment

再拍星空

昨晚深圳天空不错,第一次把我的赤道仪拿出来拍了两张照片。怀念小时候漫天繁星的
南山上的天蝎座,很郁闷的是南山后面的灯光太强了。
南山上的天蝎座
屋顶上的牛郎织女,隔河相望,可惜银河在城市中基本上就是个传说…
屋顶上的牛郎织女

Posted in 天文爱好 | Tagged , , , | Leave a comment

推荐两个Android程序

不知道我有没有火星,不过自从买了HTC Desire这两周以来,这两款软件给我的惊喜最大,之前从来没有想过手机还能做这样的事情。这两款软件都可以直接从android market里面免费下载,直接搜索名字即可。

1. Shazam
Shazam是一款音乐搜索的软件,它对他从话筒里听到的音乐进行采样,然后到其服务器进行搜索,从而找出该音乐的名字,专辑等信息。
我用了好几天,基本上就没失手过,我说“基本上”是因为有一首日本的曲子识别成了一首中文的歌,不过那首中文的歌实际上是翻唱那首曲子的。
有人会认为这个软件没什么用,其实用处还是很大的,比如走在街上,突然听到一首很好听的歌,但又不知道歌名,这个时候,只需要吧手机掏出来,让他聆听一下,便知道歌名了;又比如,在网上看视频,结果发现背景音乐很好听,也只需要掏出手机来查一下即可。
不知道有没有软件可以识别人的哼唱,如果有就太好了,因为很多时候我们只能记住一小段的音乐,但又不知道名字。

2. Google Sky Map
Google Sky Map应该是一款星图软件吧,根据android的位置服务(gps或者移动网络)确定当前的位置,显示当时星空信息。当然如果只是这一点,那和其他的星图软件也就没区别了,更重要的是,他使用重力感应确定手机的姿态(平放,立着还是倒放),使用电子磁场确定手机的方向(东南西北),有了这三个信息,他就能够确定手机背面朝向的是那个方向了,然后在屏幕上显示出该区域的星空。
说了这么多,其实使用很简单,眼睛直视手机屏幕,手机屏幕上显示的星图就是你把手机拿掉之后你所看到的星空,就是这么简单。
所以当你看到一颗不认识的星星时,只需要把手机放到你和星星之间,你就能从屏幕上看到那个星星的名字。它的搜索功能也很棒,能够方便的指引你找到天上的星星。下面有个简单的演示视频,从youtube上下下来的。

Posted in 生活 | Tagged , , | 1 Comment