I am LAZY bones? AN ancient AND boring SITE

分类: '流水帐' 的归档

田园生活

安静的午后,适中的阳光,搬个小凳子,边拿ipod上网,边照看家里养的鸡:

这里的 twitter api 倒了

感谢国家,感谢CCAV,感谢及.艾服.达不留的厚爱,本无名小站也受到了伟大的墙的关注,真是让我倍感荣幸,语无伦次了。
最早得知此事,是我今早收到Tualatrix的短信,说我的api不能用了,导致他不能在手机发推,我当时就想,不会是被墙了吧?没想到,后来的验证,真的证实了这一点。
这个twitter api是当时看到@yegle刚发布twip,我看这程序不错,就顺手搞了个,直到今天,li2z.cn/t 终于光荣地成为敏感词了~
在这期间,这个api已经累计提供服务12236009人次了,粗略地统计了一下,有10728个twitter账号(其实我也没想到会有这么多,虽然有一半是只出现了1~2次的),现在我不得不对这1w多个朋友说:咱们得换个地方了。
在此,也呼吁广大有国外空间的网友,是时候贡献一份力量了,架个twip,方便又简单,然后可以大范围或者小范围传播下,不要再让某某墙得意了。愿意公开地址的话,欢迎在本文后留言,好让大伙找到新的落脚点。
不过,似乎twitter官方本来就要在6月份停止HTTP Basic Auth支持了,到时候,即使有twip,也不能方便地在墙内上推了,那时到底会如何呢?我觉得解决问题的方法一定比问题多吧~

没事就和朋友下下棋,pidgin象棋插件偷跑版

gmchess是一款由阳光灿烂的lerosua写的linux下开源的中国象棋程序,使用gtkmm和C++完成。支持人机对战和人人对战。但是之前只能在同一台机子上进行人人对战,这显然很不方便。
于是牛逼的lerosua又给我们带来了gmchess的pidgin对战插件,功能不必多说,大家也能猜到,肯定是通过pidgin,和好友在线下象棋了~
下面来看两个截图:
这是装了插件以后的pidgin窗口,可以看到已经多了一个很“帅”的按钮了~

如果你和你的好友,都装了这个插件的话,你一点这个“帅”,对方一接受,就会出来gmchess的对战窗口了,gmchess的对战模式大致和人机对战一致,只是对方换成了有血有肉的人了,哈哈,如图:

如果感兴趣的话,在这里下载最新的代码,注意gmchess-0.29.0.tar.bz2和pidgin-gmchess-0.01.tar.gz都要下载安装哦。
由于这个目前是偷跑版,也可以理解成是alpha版,所以难免会有点小问题,遇到bug或疑似bug的话,大家尽情地报告bug去,哈哈。
再八卦一下,gmchess里的提示音很多都是人声哦,而且这些声音正是出自lerosua的老婆,还蛮好听的呢,哈哈。

本blog支持w3m

其实只是调整了一下blog的主题而已,和w3m关系不大,呵呵。
也许你会问,好像现在的主题和之前没啥区别啊,其实这就对了,这次的改动从视觉效果上看,确实是没有区别的。不同的是:原先是先载入右侧栏,再载入文章的内容的;现在改成先载入文章内容,再载入侧栏了而已。这样的好处,就是每次浏览的时候,可以为读者节省几个毫秒。
同时,做为一个附带的好处,就是用w3m/elinks这类CLI浏览器打开的时候,原先要翻好几屏才能看到正文的,现在正文直接在最上面了。所以,就有了这个标题。。。关于w3m,有兴趣的可以看看它的快捷键列表
这次的修改,虽然不是很难,但对于我这个CSS菜鸟来说,已经不能独立完成了。所以修改的时候,多亏了牛B的前端工程师keke的鼎立相助,才得以完成,在此表示感谢。CSS的修改要点在这里
由于没有多少艺术细胞,估计我会一直使用这个黑漆漆的主题了吧,呵呵。代码在这里

通过Dbus控制pidgin

介绍两个通过Dbus控制pidgin的例子,为了方便,采用python实现。
第一个例子来自官方文档,代码如下:

#!/usr/bin/env python
 
def my_func(account, sender, message, conversation, flags):
    print sender, "said:", message
 
import dbus, gobject
from dbus.mainloop.glib import DBusGMainLoop
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
 
bus.add_signal_receiver(my_func,
                        dbus_interface="im.pidgin.purple.PurpleInterface",
                        signal_name="ReceivedImMsg")
 
loop = gobject.MainLoop()
loop.run()

这个比较简单,就是监视收到消息的信号,一收到消息就调用 my_func 把发送者和消息体打印出来。

另一个是我自己写的,目的是放到crontab里,每天定时通过鸡脱壳给某人发送一句话,哈哈,代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import dbus, gobject
bus = dbus.SessionBus()
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")
 
for account in purple.PurpleAccountsGetAllActive():
    if '我自己的GTalk' == purple.PurpleAccountGetUsername(account):
        conv = purple.PurpleConversationNew(1, account, '对方的GTalk')
        purple.PurpleConvImSend(purple.PurpleConvIm(conv), u"要发送的内容")

大致就是:首先在pidgin的活动账户里面,找到自己的鸡脱壳的账户ID,然后调用 PurpleConversationNew 建立一个新的对话tab页,再在这个tab页里发送指定消息给某人。也是超简单。

其实pidgin提供的dbus接口非常丰富,丰富到什么程度呢?就是用dfeet打开那方法树的时候,都会觉得很卡,呵呵。看了下,几乎所有在界面能完成的操作都可以通过dbus接口来实现。所以,要折腾的话,还可以折腾出很多复杂的应用来的,比如做个bot什么的,唉,早知道当时就不去搞什么gloox了,直接挂个purple,用dbus就什么都搞定了嘛,还支持xmpp、msn、yahoo等N多协议,多好啊,呵呵~

========20100428 update========
呃,昨天说要把程序放到crontab里定时执行的来着,结果,今天时间到了,一看,却并没有执行成功,手工一执行,又立马成功了。于是就我就纳闷了,google一搜索,马上发现原因了,原来cron里启动的进程和shell里启动的进程,是不在一个dbus session里面的,也就是说 bus = dbus.SessionBus() 就会给报错。再深究其原因,是因为cron启动的进程里面没有 DBUS_SESSION_BUS_ADDRESS 这个环境变量,于是,参照这里的解决办法,X启动的时候,导出这变量到一个文件里,然后cron里启动进程前,source一下这个文件,终于大功告成了,哈哈。

blog加了评论回复邮件提醒

看见不少人的blog都有这个评论回复邮件通知,有的为了让评论者可以自己选择要不要收邮件,还会有个小框框可以勾,觉得这个还蛮有用的,比如有人在我blog里问了问题,就不用老来这里打开页面看有没有回复了。
于是,折腾了几个WP插件,发现要有那个可以自己选收不收的勾勾的话,就要装Comment Reply Notification这个插件,但是我装上以后,一开始却怎么都收不到邮件,后来有折腾了几个SMTP的插件,还是不行,于是把其他的删光了,还是留下Comment Reply Notification再试,这回居然收到一封邮件了。。。又试了几次之后,发现这个邮件貌似完全是随机的,有时候有,有时候无。也不知道是因为插件问题还是主机问题又或者是你我的RP问题,哈。
而且,如果我在blog后台,对评论进行回复的话,是没有邮件的。
不过也不想再折腾了,先这样用着吧,就当试运行一段时间。

SRT源用户须知

各位SRT源用户,大家好!
之前我用公司服务器架设的ubuntu源,可能会因为我将于近期离开SRT,并且失去对服务器的控制权而停止工作。
现在看来,可能的情形有以下几种:
1. 我离开公司,仍然有服务器的权限。这样最好了,我将继续维护服务器做源给大家使用。
2. 我离开公司,把服务器交接给其他同事。这样我也尽力说服接手人,不变最好。
3. 我离开公司以后,公司收回服务器另作它用。如果是这样,也就只能和各位说声抱歉了。
现在情况仍不明了,我也会继续尽力争取,呵呵。有消息再告诉大家。

wikimarkup 和 webkit

wikimarkup 是一个可以将 MediaWiki 格式的源码转换成 HTML 的python模块,它的特点是使用非常简单,功能比较全面。
基本上就是:

from wikimarkup import parse
html = parse(wiki, showToc=False)

这样就搞定了。
wikimarkup 可以在这里下载。

另外得到了html,如果要展示出来,还得需要一个“浏览器”,这时候可以用webkit的python绑定,也很简单,使用方法:

import webkit
wv = webkit.WebView()
wv.load_html_string(html, 'file:///')

再把这个 wv 对象嵌到正常的gtk或者qt容器里就可以了。
另外,花花是webkit达人,有什么问题,可以去搔扰之,哈哈。

点击触摸板模拟左键单击

这几天估计是比较背,刚说我的神舟本2年都没啥问题,结果,前几天发现光驱读盘能力不行了,最近又发现触摸板的左键也不灵了,要按得很重才能产生一次有效的单击事件,双击就更难了。这样下去,手指都要按残了,唉~
然后试了下,轻触触摸板模拟鼠标单击的功能在我的gentoo下默认是无效的,于是第一个想到的就是 xorg.conf 这个即将成为历史的东西。但是我已经不用这个配置文件很久了,现在为了触摸板,没办法,看来只能再请它出山了。于是翻出我的配置文件,在 Section “InputDevice” 一节里加上 Option “TapButton1” “1” 这行,一边心里在纳闷为什么X不默认启用这项呢?
加完重启了X以后,在登录界面试了一下,嘿嘿,果然可以了点击了,于是兴高采烈地登录我的gnome,结果再一看,怎么又不行了呢?明明刚才还可以的啊。难道是gnome的问题?上网一查,发现果然是,在gnome的“系统”->“首选项”->“鼠标”->“触摸板”里,有一项“Enable mouse clicks with touchpad”,勾上这个就好了。
然后再一转念,那在 xorg.conf 里的设置不是多此一举了吗?毕竟我不怎么关心登录界面能不能点击啊。
于是重新删除了 xorg.conf 重启X,登录gnome以后,果然也是可以的。
至此终于知道X为什么不默认启用触摸板点击了,哈哈,既然有DE做这个事情,自然就可以偷偷懒了,不过不知道用*box之类的WM的用户是怎么设置呢?

清理ubuntu老内核的小脚本

ubuntu用久了,升级了几次内核以后,就免不了需要清理一下老的内核,毕竟一套内核就有170多M的空间呢。但是每次都打一堆字来清理也烦了。虽然Ubuntu 命令技巧(这里再罗嗦几句:如果还有ubuntuer没看过这个,强烈建议看一遍。)里有删除旧内核的命令,而且就一行:

sudo aptitude purge ~ilinux-image-.*\(\!`uname -r`\)

但是我却不是很喜欢,因为这这个没有把linux-headers-xxx删除掉。
于是自己写了个繁的,需要的可以自己保存,以便不时之需。

#!/bin/bash
# 清理ubuntu的老内核
# by bones7456
# http://li2z.cn
CURRENT="`uname -r | awk -F"-" '{print $1"-"$2}'`"
HEADERS=""
IMAGES=""
for HEADER in `dpkg --get-selections | grep ^linux-headers | \
grep -vE "(generic|386|virtual)" | awk '{gsub(/linux-headers-/,"",$1);print $1}'`
do
    if [[ "$CURRENT" < "$HEADER" ]]
    then
        echo "正在运行的内核不是最新的。 $CURRENT < $HEADER"
        echo "Running kernel is not the newest. $CURRENT < $HEADER"
        exit 1
    else
        [[ "$CURRENT" != "$HEADER" ]] && {
            HEADERS="${HEADERS} linux-headers-${HEADER}"
            IMAGE="`dpkg --get-selections | grep ^linux-image | \
                grep "${HEADER}" | awk '{print $1}'`"
            IMAGES="${IMAGES} $IMAGE"
        }
    fi
done
 
if [[ x"$HEADERS" == x"" ]]
then
    echo "没有要清理的老内核."
    echo "No old kernel need to clean."
    exit 0
fi
CMD="sudo apt-get purge $HEADERS $IMAGES"
echo "$CMD"
if [ "$1" == "-e" ]
then
    sh -c "$CMD"
else
    echo "请确定以上命令是否正确,然后输入 $0 -e 来执行以上命令。"
    echo "Be sure this command is right, then type $0 -e to execute."
fi