乌龙

May 14th, 2009

上周末发了篇博文,希望有朋友能看到并帮我测试一下。结果至今无一个留言 :( 今天越发不对劲了,从别的超链接到我这个网站统统显示403,被禁止访问!而通过手工在浏览器的地址栏输入一摸一样的地址却能正常访问。。。我把这个疑问发到了twitter上,很快 @rainux 提醒我是不是限制了HTTP_REFERER。我立马登录空间,查看.htaccess的内容,确实有两条HTTP_REFERER的规则在里面。不过我对这个HTTP_REFERER很陌生,为了确定是否是它引起的,我先后把我自己添加的规则和HTTP_REFERER注释掉。结果正如 @rainux 所说。

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?vvoody.org/?.*$ [NC]
RewriteRule \.*$ - [F,NC]

G了一下,明白了HTTP_REFERER干嘛的。上面的两条规则意思是HTTP_REFERER不为空或者不是从vvoody.org链接来的统统禁止访问。因为从浏览器输入地址时HTTP_REFERER为空,因此不会被禁止访问。

唉,这个乌龙好啊!

参考:
http://ted.is-programmer.com/posts/4460.html
http://zh.wikipedia.org/wiki/HTTP_referrer
http://www.fwolf.com/blog/post/320

简单实现tinyurl.com类短网址服务

May 10th, 2009

常用Twitter或者饭否之类服务的朋友都应该知道tinyurl的大名吧~ 简言之就是将长长的网址缩短,变成这个样子:http://tinyurl.com/qn8v7y

如果在自个儿的域名上实现一下类似的服务,应该很好玩~ 现在我已经做好了,只需4个文件配合即可工作,有兴趣的朋友可以继续往下看。测试方法,在浏览器中输入 http://vvoody.org/cmprzurl.py?longurl=http://vvoody.org/blog/?p=265 ,在longurl=后添上你想缩短的地址即可得到一个短网址。这篇文章缩短后的地址就是:http://vvoody.org/baJjPy 哈哈真巧,Py 结尾!

cmprzurl-example

原理看下图:
structure_of_cmprzurl
点击看大图

关键在于.htaccess规则,它负责重写地址。比如我的域名 http://vvoody.org/ 下面有 blog 等目录和文件,得保证这些能正常访问,也得把 3pHj9A 这样的字符串交给后台脚本处理。这个.htaccess规则之前我写了一堆正则,却都无法满足上述要求,后来在这篇文章中找到了方法,就两条,Apache 很好很强大!

curl -I http://vvoody.org/baJjPy 可以看到 Location 头部已经是转向网址了。不过返回的http头信息不是转向网站的,虽然不影响转向,但总觉得不太好。这方面我实在不懂,希望有朋友能帮我解决这个问题 ;-)

服务器端要求:
* Apache 2.0 以上并支持.htaccess和python cgi; [2.0.63]
* SQLite3; [3.2.1]
* Python; [2.3.5]
* pysqlite2 或 sqlite3 Python模块; [??]

方括号里是我的服务器端情况。

总结:
由于后端程序采用CGI的方式(非mod_python),使用 SQLite 这种非C/S数据库,以及我对web编程和数据库操作方面知识很浅,因此在性能、并发处理上不会达到很高的要求。

这个东西仅仅是给自个儿玩啦 ;-) 路过大牛轻拍,也欢迎指点任何程序设计、安全、配置等上的问题。

如果你也有自己的域名和空间,那么只要把上图中的 cmprzurl.py, redirect.py, cmprzurl.db, .htaccess 复制到你域名的根目录下,赋上可执行权限,就可以了。文件请从下面的地址检出。

PS:
Google docs 里的 drawing 真好用啊~~

源代码在这里:
http://github.com/vvoody/cmprzurl/tree/master

February 14th, 2009

有这样一位女子:

      余与芸联句以遣闷怀,而两韵之后,逾联逾纵,想入非夷,随口乱道。芸已漱涎涕泪,笑倒余怀,不能成声矣。觉其鬓边茉莉浓香扑鼻,因拍其背以他词解之曰:“想古人以茉莉形色如珠,故供助妆压鬓,不知此花必沾油头粉面之气,其香更可爱,所供佛手当退三舍矣。”芸乃止笑曰:“佛手乃香中君子,只在有意无意间; 茉莉是香中小人,故须借人之势,其香也如胁肩谄笑。”余曰:“卿何远君子而近小人?”芸曰:“我笑君子爱小人耳。”

心而向之。

1234567890

February 11th, 2009

这个数字最先是从王聪大哥的饭否那儿得知。后来陆续的就有相关报道,不知道这个代表啥的请看这篇文章。图新鲜,想亲手把这数转成具体时间看看。当时不知道 date 命令能很方便的转换,就用了 Python,于是问题随之而来。

vvoody@slackware:~$ python
Python 2.5.2 (r252:60911, Sep 11 2008, 13:43:31)
[GCC 4.2.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from time import strftime, gmtime, localtime
>>> strftime("%a, %d %b %Y %H:%M:%S", gmtime(1234567890))
'Fri, 13 Feb 2009 23:31:06'
>>> strftime("%a, %d %b %Y %H:%M:%S", localtime(1234567890))
'Sat, 14 Feb 2009 07:31:30' 
>>> strftime("%a, %d %b %Y %H:%M:%S", gmtime(915148821))
'Thu, 31 Dec 1998 23:59:60'

1234567890 对应的时间应该是 23:31:30 ,而我的 Python 里的 gmtime 运行出来是 23:31:06,少了 24 秒。问了很多人,平台相同的都是正确的,就我的不对。后来经讨论得知那 24 秒和闰秒有关,Python 没有加上这 24 秒。但 gmtime(915148821) 这个数确是有闰秒的操作,因此结果就有了第 60 秒。

后来,索性直接看看调用 C 库函数和 date 命令的结果。如下代码:

vvoody@slackware:~/lab$ cat gmtime.c
#include
#include 
 
int main(void)
{
  struct tm *foo;
  time_t bar = 1234567890;
  foo = gmtime(&bar);
  printf("tm_sec: %dn", foo->tm_sec);
 
  char egg[100];
  strftime(egg, 100, "%a, %b %d %Y %H:%M:%S", foo);
  printf("1234567890 is at:n%sn", egg);
  return 0;
}
vvoody@slackware:~/lab$ gcc -Wall gmtime.c
vvoody@slackware:~/lab$ ./a.out
tm_sec: 6
1234567890 is at:
Fri, Feb 13 2009 23:31:06
vvoody@slackware:~/lab$ date -ud @1234567890
Fri Feb 13 23:31:06 UTC 2009

最后经 cppgx@newsmth 大牛的指点,重新运行了下 timeconfig,就好了。据他说可能是时区文件被胡乱编辑了,就引起了上面遇到的问题。timeconfig 会把你指定的系统自带的某个时区文件复制到/etc去。

呼,终于好了。不过还是不清楚到底是哪个程序动了我的配置文件。

相关讨论:
http://www.newsmth.net/bbscon.php?bid=284&id=51926
http://groups.google.com/group/python-cn/browse_thread/thread/2d0e9ce534d2d93c?hl=en

Slackware 下禁用电源键直接关机

February 9th, 2009

Slackware 12.0 还没这个功能,12.1 开始就默认有了。虽然对自个儿用是挺方便的,但对于一小撮别有用心的人,那可麻烦啦。我就有几次在看文档、编辑东西的时候被某北同学那么按了一下。。。在此呼吁大家需要对他以及对你的电源键提高警惕 :D

方才在这篇文章中找到了缘由。

解决方法很简单,对于 Slackware,acpi 的 daemon 检测到你按下电源键后会去执行 /etc/acpi/acpi-handler.sh 这个脚本。查其内容发现,它会执行 /sbin/init 0,也就是关机。因此,只需去掉这个文件的执行权限即可(chmod -x)。

亲测,按下去没事儿 ;-)

在当前标签的右边打开标签很有道理

February 4th, 2009

订了 rss 就会有很多的未读文章,通常都是按照时间降序排列的,如:
post_11pm
xffef
post_9pm
post_7pm
jf9fa
post_8am
… …

如果我从上至下一个个打开 post_ 开头的文章,那么一般浏览器都是在当前所有标签的最右侧打开。也就是这样的标签排列:
| rss reader |.| post_11pm |.| post_9pm |.| post_7pm |.| post_8am |

你的阅读顺序就不是按照这些文章的发布顺序来了。这样不好,你怎么可以逆着时间呢?所以,比较合理的标签打开顺序应该如下:
| rss reader |.| post_8am |.| post_7pm |.| post_9pm |.| post_11pm |

也就是永远在当前标签(rss reader) 的右侧打开新标签。这样你就不会莫名其妙一个作者先于这篇文章提到的概念了。

当然,你也可以直接跳到最后一个标签(也就是 post_8am) 去开,然后关闭,继续最后一个标签。但是那样你就要做许多多余的操作了。我希望关闭那个 rss reader 后直接按着时间顺序看文章。Opera 就很好嘛,提供了这么个功能,也不用像 Firefox 那样还得找个插件 ;-)

最近一直用 Firefox 用得不太爽,又懒得开 Opera(里面几十个标签,累啊…),因此胡扯一番,用某北的话说就是要事情。顺便让之前两篇文章沉下去。

美国、日本、意大利、挪威、火星、欧罗巴……

January 25th, 2009

日本只是其中之一,以后有空再写别的。

日本

January 25th, 2009

今天一好友来我家,临走时看到了我房间世界地图上贴满的黄色标签。那是许多国家的英文名称,高三时候弄的,现在忘得差不多了 ;-)

然后他说起了日本,才发现地图上日本那块儿是空的。嘿嘿,被我挖掉了~~ 不过那是初中干的事了。可能那时候某些日本右翼分子在焚烧我国国旗,又或是日政府篡改教科书,不承认侵华。我当时真是义愤填膺,咬牙切齿,抄起美工刀刷刷几下就让日本从这个“世界”上消失了。。。

现在看到这块空缺,可不会怒目,只是笑笑了之。在这个舆论几乎被垄断控制的国家里,我当时做出这种事情很正常。嘿嘿,幸亏我当时没出过更出格的事情。

我现在对日本印象良好。
要是你寒假在家无聊,推荐你看看《东京塔》《没有玫瑰的花店》;、《龙樱》三部日剧,豆瓣都有介绍;

要是你用 Emacs,并且想找个邮件客户端的话,我会推荐 山本和彦 写的 Mew;

要是你在寝室想和室友传东西,那么基于 SHIROUZU Hiroaki 写的 IP Messenger飞鸽传书一定让你满意;

要是你想和家人、朋友一起娱乐,那么 Wii 绝对不错~

各位,Happy Chinese Niu Year ;-)

Vista 下引导 Slackware 硬盘安装

January 14th, 2009

目的:
先安装了 Windows Vista 的情况下如何进入硬盘安装 Slackware 12.2。具体安装请参考互联网文章。

所需:
grub4dos-0.4.4 – 一开始用的是 0.4.3,结果无法找到 ext3 文件系统下的文件.

过程:

1. 由于 Vista 的引导机制有所变化,无法通过 boot.ini 直接加载 grub。需
要先用管理员账户在 cmd 里作如下操作:

1
2
3
4
bcdedit /create /d "GRUB for DOS" /application bootsector
bcdedit /set {id} device boot
bcdedit /set {id} path \grldr.mbr
bcdedit /displayorder {id} /addlast

第一个命令会产生一串 {id},相应替换后面三个命令即可。这些在 grub4dos 的
README_GRUB4DOS.txt 里有提到。

2. 复制 grub4dos-0.4.4 包中的 grldr、grldr.mbr 和 menu.lst 到 C 盘根目
录;

3. 复制 Slackware 12.2 kernels 目录中的 hugesmp.s/bzImage、
hugesmp.s/System.map.gz 和 isolinux 目录中的 initrd.img 到 C 盘根目录;

4. 重启后进入 grub 的菜单,按 c 进入 grub 命令行模式,并逐一输入:

1
2
3
kernel (hd0,0)/bzImage
initrd (hd0,0)/initrd.img
boot

5. 至此就可以进入 Slackware 的安装模式了。先用 fdisk 分区,然后 setup,
挂载你的 iso 文件或者 slackware 文件夹 …

6. Enjoy Slackware ;-)

那些球

November 28th, 2008

我高中主踢后卫,中后卫或者后边卫。防守乃我一大乐趣,能把球从对方前锋脚下截下来,挽救球队我很开心 :D 我偶尔也有灵光乍现的时候,进那么一两个球。

印象最深的两个球是高二跟 2 班踢成 2:2 那场,我独进两员。第一个球是 MgTun 在右边路下底传中,我抢在对方后卫身前用前额顶进去的;第二个是我正好在前场,不知道谁传了个球给我,我立马突进进区,将球往右一拨晃过最后一个后卫,面对钢大的侧身扑救我带挑的猛射,进了!

那场比赛很激励,唐和周的中前场让我们几个后卫丝毫不敢懈怠。依稀记得2 班班主任严老大也踢了会儿。清楚的记得 99 和 Candy 在操场上沿着跑道转悠。

当然也有犯傻的时候。

高二那会儿踢球赛,我们顺利进入第二轮和11班。天很冷,我穿着 Juventus 99 号球衣,戴着衣服毛线手套,竟然在自己进区用手挡出了对方一个传进进区的球,郭门神主罚命中 :(

还是高二,小雨,和 MgTun 离开体育馆在外面摆了个小球门自个儿玩一防一。我想了个过人的动作,只可惜我球技太差,当时很他靠得进了些,我的膝盖顶撞到了 MgTun 的膝盖,导致他微微的骨裂。。。

高三仍然不忘踢球,踢完了回到教室就把球鞋仍在教室后面的报夹那里。不料,某天突然发现没了,过了几天还是没找到。结果,一天早自修,班主任韩提及我们男生在后面放球鞋的事情,说道她前几天把一双球鞋扔进了垃圾桶了,她以为主人会去找回来的,其实那天的值日生已经处理掉了。。。唉,我的 PUMA ~~

很多好玩的事情,高中和那帮家伙踢球很开心 ;-)