用coffeescript重写了首页

下午有时间看了一下coffeescript,发现非常优雅。过去对JavaScript的工作,从dojo到jquery主要是在库的层面,这次coffeescript的出现是在语言层面对javascript做了一次加强。现在对语言的加强不再需要mozilla/microsoft/google/apple几家坐下来慢慢聊了,民间的力量就可以实现。

coffeescript的几个特点也属于博采众长:

  • 类似python的,以缩进取代代码块
  • 类似ruby/perl,方法调用括号可选
  • 类似ruby,无须return
  • 正常的类声明语法

在nodejs的环境里可以通过npm安装coffer-script,利用它的命令行程序,可以把coffeescript编译成javascript。不过最给力的是可以在网页里通过引入coffee-script.js来直接执行(其实也是编译一下)coffeescript。

于是我顺手重写了一下首页的js,改写成coffeescript。因为少打很多() {},手可以控制在键盘中心的,敲字的效率大大提高。用空你也可以尝试一下。

Tiny LifeStream widget available on sunng.info

首先推荐samson的stdout,这是一个LifeStream Web应用(针对Loser的LifeStream称为LoserStream)。你可以从github上获得代码,参考samson的deploymentcustomization文档,在一二三四五六七八九十十一十二……分钟内搭建一个自己stdout,至于是不是LoserStream你自己看着办。

本来打算在自己的主机上搭一个实例的,怎奈怎奈我那CentOS5的主机。所以我说我们这些CentOS用户最伤不起了!!!源里有Ruby有个毛用!!1.8.4,泥玛gem都装不上!!还要去找1.8.6的代码来编译,有没有!!!好不容易装上gem了,gem 1.6.1说找不到Win32API!!!干掉重装1.4.5!再装ruby-sqlite3,源里的sqlite3版本又不行,装不上,有没有!!!有没有!!!

最后我无奈了,还是用老朋友Yahoo Pipes吧。拖一拖拉一拉神马都有了,页面上整点咱最擅长的document.getElementById就成了。你可以在http://sunng.info找到这个东西,现在这个源里收录了:

  • blog
  • 豆瓣
  • github
  • osm editing
  • twitter
  • reddit like

这些也是我主要混迹的地方了,遗憾就是bitbucket居然没有个人的RSS输出。倒是可以通过他们的API获得,不过在Pipes里要多拖点东西,所以我先琢磨一下再说吧。网易八方我说过了,不愧是互联网产品经理驱动的东西,连个RSS输出都木有。饭否嘛现在作为扯淡专用场所就不收录了。

说实在的把这些东西都聚合在一起还是挺吓人的,所以我把他稍微藏了一下。

还有,今天日本地震,祝daf同学平平安安平平安安。

When nodejs meets mapnik

tilelive.js是一个基于nodejs的web地图工具,帮助用户快速查看他们创建的地图样式。tilelive.js是Mapbox众多产品中的一个,你可以通过tilemill了解更多。

要运行tilelive.js,你需要安装一系列软件。

安装mapnik

首先需要安装mapnik2,注意并非是目前的稳定版本0.7.1,而是开发版本。
签出SVN代码:

svn co http://svn.mapnik.org/trunk mapnik-trunk

按照Mapnik的文档描述进行安装。

安装node依赖

推荐你安装最新的node 0.4.2和npm 0.3.1。

安装npm后执行

npm config set unsafe-perm true

去除超级用户运行npm时的警告。

接下来就可以安装一系列node modules了:

sudo npm install mapnik
sudo npm install carto
sudo npm install generic-pool
sudo npm install underscore
sudo npm install node-get
sudo npm install step
sudo npm install express
sudo npm install sqlite3
sudo npm install compress

签出 tilelive.js

tilelive.js并不兼容最新的node 0.4.x和express 2.0.0,所以你可以签出我fork的版本:

git clone git://github.com/sunng87/tilelive.js.git
git checkout new-fork

运行:

./bin/tilelive_server.js examples/stysheet.xml

打开浏览器,访问 http://localhost:8888/ 即可
screenshot_001

Python3 script to query free TOEFL seats

应同学要求,写了一个爬托福考试空闲考位的脚本。这是第一次真正用Python3写。

通过调用get_seat_status,传入省名(如’Jiangsu’),时间(如’201104′),您可以得到这样的数据结构:

[ [datetime.datetime(2011, 4, 23, 10, 0),  'STN80085B',  '南通市教育装备与勤工俭学管理中心',  '1415',  True],
 [datetime.datetime(2011, 4, 23, 10, 0), 'STN80086A', '扬州大学', '1415', True]]

下面是一个多线程调用的例子:

#! /usr/bin/python3

import threading
import pprint
from toeflgraber import get_seat_status

# 查询江浙沪 2011年3月和4月的考位
locations = ['Jiangsu', 'Shanghai', 'Zhejiang']
months = ['201103', '201104']

def descartes(x, y):
    for i in x:
        for j in y:
            yield (i, j)

lock = threading.RLock()
tasks = len(locations) * len(months)
e = threading.Event()
results = []

def task(location, month):
    global results, tasks
    all_seats = get_seat_status(location, month)
    available_seats = filter(lambda x: x[4], all_seats)
    with lock:
        results.extend(available_seats)
        tasks -= 1
        if tasks == 0:
            e.set()

for t in descartes(locations, months):
    t = threading.Thread(target=task, args=t)
    t.daemon = True
    t.start()

e.wait()
pprint.pprint(results)

Enjoy it.

Using dojo on Chrome/Chromium from local file system

dojo.require uses XMLHttpRequest to load additional components. On default Chrome settings, XMLHttpRequest on local file system is not allowed. This will break whole dojo system.

To change the default policy, you can start Chrome with a command line option –allow-file-access-from-files.

This issue is a well known one for Chromium project and still under active discussion:
http://code.google.com/p/chromium/issues/detail?id=40787