Archive for the ‘ Geek Tweak ’ Category

修正Debian下的“Could not open default cursor font ‘cursor’”错误

昨晚折腾Debian,最后弄出个致命错误,导致X无法启动

错误信息:
fatal error: Could not open default cursor font ‘cursor’

最终从Debian邮件列表里搜到了答案,只需装上“artwiz-cursor”字体包就OK了
console下:
# aptitude install artwiz-cursor
done!

用TestDisk恢复分区表

一不小心把移动硬盘的分区表给弄坏了,那可是命根子啊!

分区表虽然坏了,但是并没有格式化,数据还是在的,我想有没有工具可以自动检测并还原正确的分区信息呢?

呵呵,那就是TestDisk了!基本上,听说过的分区格式都支持~

在Debian下直接 “sudo apt-get install testdisk”,
然后确认几下就OK了。

好东东,很好,很强大~~~

adblock隐藏规则中的CSS选择器

adblock(官网安装)是我觉得最不可或缺的几个Firefox 插件之一,除了过滤用于广告的帧、脚本、图片、flash等,加快浏览速度之外,元素隐藏则可以隐藏那些恶心的文本广告,清新整洁的互联网使人心情愉悦:),想到一句广告词:痘痘都不见了!

然而,这次却遇到一个极想隐藏又没办法隐藏的广告。因为人家只有一个table,总不至于把所有table都隐藏了吧=_=!

我只好再次打开adblock官网,找到过滤规则写法说明,看看会不会有什么新发现。虽然早就看过,但只是草草概览了一遍,这回认真一看,果然以前漏掉了一个极重要的特性:adblock支持 CSS selector

也就是说,就好像自己就是这个网站的作者,像平常写style sheet一样选择元素,最后由adblock自动在后面加上{ display: none; }。比如:

Click the expand button to read full text…
*
//匹配所有元素

A
//匹配所有名为A的元素

A B
//匹配名为B且包含在A中的元素(B是A的“后代”,包括儿子、孙子……)

A>B
/* 匹配名为B且是A的孩子的元素:
<div>Hello<h1>adblock, <em>I love you!</em></h1></div>
其中,h1是div的孩子,em是div的孙子……
div>h1:匹配
div>em:不匹配
div em:匹配 */

A:first-child
/* 匹配名为A且是其父母长子的元素
<h1><strong>Hello</strong><em>adblock!</em></h1>
其中,strong是长子,em不是
strong:first-child:匹配
em:first-child:不匹配 */

A + B
/* 匹配名为B且是A紧挨着的弟弟的元素
<nl>
<lable>for many reasons:</lable>
<li>1</li>
<li>2</li>
<li>…</li>
</nl>
<h1>I love adblock</h1>
<p>and, I can’t help introducing it to you</p>
nl + h1:匹配
h1 + p:匹配
nl + p:不匹配 */

A[B]
// 名为A且具有属性B的元素

A[B=”C”]
// 名为A且属性B精确地等于C的元素

A[B~=”C”]
/* 名为A且其属性B以空格分隔的多个值中的一个等于C的元素
<div class=”adv blink right_box”>example</div>
div[class]:匹配
div[class=”adv blink right_box”]:匹配
div[class~=”blink”]:匹配
div[class=”blink”]:不匹配
div.adv:匹配 */

A.B
//等价于 A[class~=”B”]

A#B
//等价于 A[id=”B”]

虽然看起来也不是很多,但将上面几种模式组合起来用,效果是很强大的。在实际的例子中,应该不会有隐藏不了的吧:)

Sun建立Unix体验中心

如题,目前已有Solaris、Fedora、Debian,以及将有FreeBsd、Ubuntu系统供体验。一个简单的注册之后,通过SSH登录,普通用户权限。常见的包都打上了(自然也少不了他们自己的Sun Studio~),甚至有sftp(可以把本地开发的代码上传编译运行,或者将运行结果下载到本地)。开发语言方面,支持:C/C++、Fortran、Java、Ruby、Python、Perl、Lisp…

上去试了下,先打开vim编辑了个cpp,然后g++,一切正常~。不同的是,不像在自己的机器上,自己就是root,整台机器归自己所有。在那上面,无数终端连接共享一台服务器,很有点当年前辈们的感觉~~~。总之,对于暂时没有计算机,以及因为总总原因没有安装Unix系统的人来说,是一个不错的体验平台。

比较特别的是,它还能满足关于龙芯、多处理器、多核、多线程的兴趣和需求。

Twitter API 应用

题外话:
———————————————————————
我的需求很简单,就是将最近的几条twitter信息显示在blog上。

首先想到的办法就是,直接用blogger提供的feed功能。可是,输出的每条信息前都有个“Wang Congming:”长长的前缀,不喜欢。而且,blogger每抓取一次feed好像要缓存挺长时间,而twitter应该是实效性比较强的,恩~。

然后,就想到用twitter官方提供的Badges。However,他们给的不是我想要的。所以,只好去看看API说明,自己动手。

小小原理:
———————————————————————
twitter支持四种格式的数据输出:xml, RSS, ATOM, JSON,以及 GET 和 POST 两种方法。当然,只是查询一下不需要授权的数据,自然用不上POST。所以,只需要GET一个JSON就行,通过URL传递适当的参数,得到我们需要的数据。

传递过来的 json 是一个函数,而我们需要的数据作为函数的参数。唯一要做的,就是事先定义这样一个函数,告诉它该怎么执行,怎么显示其中的数据。至于函数名,GET 时由自己用 callback 参数指定。

Click the expand button to read full text…

数据结构
———————————————————————
返回的数据类似以下结构:

twitterCallback([   {      "created_at":"Sat Apr 28 15:45:24 +0000 2007",      "text":"信息的内容~",      "id":43160262/*该条信息的数字编号*/,      "user":{         "name":"Wang Congming",         "profile_image_url":"http:...",         "description":"自我介绍",         "location":"BeiJing",         "screen_name":"WCM/*用户名*/",         "url":"http:...",         "id":5002701/*用户的数字编号*/,         "protected":false      }   },   {      /* 第2/3/4...条信息,重复以上形式 */   }]);

完成
———————————————————————
根据以上数据,得代码如下:

<ul id="my_twitter"><li>Loading...</li></ul>

<script type="text/javascript">function relative_time(time_value) {   var time_correct = time_value.split('+0000');   var parsed_date = Date.parse(time_correct[0]+'GMT+0000'+time_correct[1]);   var relative_to = new Date();   var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);   if(delta < 60) return 'less than a minute ago';   else if(delta < 120) return 'about a minute ago';   else if(delta < (45*60)) return (parseInt(delta / 60)).toString() + ' minutes    ago';   else if(delta < (90*60)) return 'about an hour ago';   else if(delta < (24*60*60)) return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';   else if(delta < (48*60*60)) return '1 day ago';   else return (parseInt(delta / 86400)).toString() + ' days ago';}function twitterCallback(obj){   var twitterHTML = '';   for(var i=0; i<(obj.length); i++){      twitterHTML += '<li><span class="item-title"><a href="http://twitter.com/wcm/statuses/'+obj[i].id+'">' + obj[i].text + '</a></span><span class="item-date"> - ' + relative_time(obj[i].created_at) + '</span></li>';   }   document.getElementById('my_twitter').innerHTML = twitterHTML;}</script>

<script src="http://twitter.com/statuses/user_timeline/5002701.json?callback=twitterCallback&count=5" type="text/javascript"></script>

效果如右侧~

总结一下
———————————————————————
1、以上代码,如果去掉ul间的“<li>Loading…</li>”,然后存为一个单独的文件,将无法正常显示,加上后又变为正常。当然,并不限于Loading…,也并不限于ul之间。也就是说,只要在任何可以的地方,加上任何字符,就OK了,不加就不行,IE和ff均如此,不理解……。

2、twitter输出的”+0000″时区没有指名是哪个标准时间(虽然没多大差别),这将导致IE的Date.parse语法分析出错,所以先在”+0000″前加上GMT再分析。

3、”…/5002701.json?callback=twitterCallback&count=5″。这里的5002701要换成自己的编号;twitterCallback即是指定的返回函数名,可自由命名;除了count外,还有其他筛选条件,如指定起始日期的since等。

4、Twitter API官方文档

关于JSON (JavaScript Object Notation): http://www.json.org/json-zh.html

Tor代理

http://vidalia-project.net/
http://tor.eff.org/
http://www.privoxy.org/
http://tcno.net/doc/tor/