Author: qingbo

  • 重新开张,从里到外通通换了一遍

    blog 初步迁移到了自己写的 python 程序中,目前还非常简单,连评论也不能添加。在我自己的项目管理系统里,我就叫这个 milestone 0.1,到 0.2 就会有评论功能,肯定在一个月之内会实现。没有评论功能,意味着不能接受大家的贺电了,请抑制一下你们激动的心情…… (其实我是在响应号召,为建设和谐社会作贡献)

    大约从 05 年底我开始写 blog,最初似乎是在 donews 提供的 wordpress mu 平台上写(我不太清楚之前有没有在其它的一些 BSP 写过没有了)。很快为了自己能更加方便地自定义而选择了租用空间自己管理 WordPress. 其实 WordPress 对我影响非常大,我的 Web 开发就是从定制 WordPress 开始学起的,尽管 PHP 一直不是太熟悉,后来用 Java 比较多。

    所以转移阵地并不意味着 WordPress 不好。作为一个通用 blog 软件,它功能齐全,很容易定制,还是非常适合刚开始尝试自己架设 blog 的用户(或者刚刚弃暗投明从 sina, 163 等 BSP 过来的人)。我只是有了更加确切的需求,并且想放弃 WordPress 的大部分附加功能,同时借机学习一下 python. blogging 也是需要新鲜感的,所以每次 WP 的编辑页面升级的话,会大大提升写文章的欲望(虽然回头看时觉得文章大部分都是垃圾)。我现在确实有点厌烦 WordPress 了,并且在一个自己从头写出来的系统中,我可以更容易实现新的想法,甚至有些想法在 WordPress 中几乎不可能实现。

    从写程序到迁移,这个过程回头看有点长了,虽然我给自己留出了余地,还是比预定的时间晚了一周。没有足够的时间和精力,加上有那么一点点完美主意情结,导致在做很多选择时都比较犹豫,比较纠结。

    此次选择了 web.py 作为 framework, 它网站的 header 里说是 “the ideal way of writing a web app”. 我用过的 framework 不多,不过每个总有这样那样让人深恶痛绝的缺点,到现在为止,web.py 还没有让我不爽的地方。

    原来的域名 qingbo.org 几乎所有的 url 都会 301 跳转到现在的 qingbo.net,而 qingbo.org 是我唯一一个在国内买的域名,鉴于现在的形势,我这样做也正好。目前只是做好了 blog 系统,把它放在了 /blog/ 这个路径下,根路径下准备放更多的内容,现在还在计划中,至少得过完年才能出来了。

    以后业余时间接触 python 就比较多了,希望能有机会和这方面的高手多交流 🙂

  • 用 pscp 代替 WinSCP

    第一次从 Windows 向 Linux 传文件的时候,我找到了 WinSCP,于是就以为世界上只有它可以干这个事情,一直以来都是用它在 Windows 和 Linux 之间互传文件,当然 samba 不算了。

    最近经常在 Windows 里用 Excel 处理一些数据,保存成 csv 格式再放到 Linux 里继续处理。正好那台 Windows 上还没有安装 WinSCP,我就通过 Windows 共享中转到 Mac 上,然后再 scp 到 Linux 服务器上 —— 我也不知道我为啥自己懒得装 WinSCP 🙁

    前几天实在受不了这个繁琐的过程了,在下载 WinSCP 之前搜了一下,原来 Windows 上也有成熟的 scp 命令行工具,即与 PuTTY 项目中的 pscp —— 不知道去那个页面下载过多少次 PuTTY,却没有仔细看 PuTTY 之外的其它程序,惭愧惭愧。我不知好歹炫耀新发现的时候,发现某些同事早就在用 pscp 了……

    简单试用了一下 pscp,就我目前用到的功能,和 Linux 上的 scp 完全一致,非常方便。

    建议习惯命令行操作、嫌鼠标麻烦低效的用户放弃 WinSCP,使用 pscp.

  • 停业整顿

    关闭了所有文章的评论,打算重新整理一下自己的网站,包括 blog 在内。

    可能将来就不再使用 wordpress 了。

    过半个月或者一个月,你就会看见我的新网站巍然屹立在 linode 上,以全新的技术(对我来说)驱动。

    关闭评论,就可以把数据拿回来随便玩了。

  • 扭曲的技术环境

    扭曲的生存环境当然会造成扭曲的技术环境。在大部分技术人才没有房子可住的情况下,当然会有好多人选择所谓的“捷径”,去“精通”一些歪门邪道的东西。是啊,整天为房租或者还贷以及其它高昂的生活费用发愁,哪儿有那么多闲心去钻研真正可以称为技术的东西呢,这是可以理解的。

    大多数(不是全部)“精通” SEO 的人,不会知道所谓 web 标准,不会知道 HTML 4,但是他们知道 h1, strong, meta-keywords, meta-description,还会熟练地用蹩脚的代码隐藏一些肮脏的东西在页面上,引来一阵艳羡。

    作为某大公司的客户,拿到他们的 API 文档,废话连篇也就罢了,错误百出。打算写邮件给他们,写到一半就放弃了,烂得不可救药,让人连提建议的心都没有。这方面跟他们国外的竞争对手比起来差的是十万八千里,不过人家在国内活得滋润得不得了。说到最后,还是市场即环境决定的,他们不会把主要资源投到这么“没钱途”的事情上。

    再往上说到那些高校实验室、研究所,里面有几个人在真正做科研?拉帮结派搞关系,骗国家钱,压榨学生才是来钱的正路。当然不是所有的老师都在这么干。

    穷则独善其身……

  • SOHO 尚都,中看不中用

    公司在 SOHO 尚都,看起来很时尚很前卫的楼。租的是一间 LOFT,空间超大,非常开阔,墙壁多半都是玻璃,很亮堂。不过住在里面,很快就发现缺点不必优点少:

    1. 空调-我们租的 LOFT 据说是业主自己装的空调,所以不好用。由于屋顶特别高,所以夏天凉风吹下来就变热了(每人发一把扇子),冬天暖风吹下来就变冷了(那时我还没来,估计大家都穿着羽绒服)。后来又租了一件普通的办公室,中央空调,依旧不好用,三天两头打电话让物业来修。
    2. 漏雨-有一台小服务器放在窗台上(窗台很宽),某次下雨,第二天早上去,发现机器重启了,进而发现机器顶上还有下面都有不少水,于是检查前一天晚上是不是没关窗户。最终发现原因是“紧闭”的窗户漏水,需要定期让物业来涂密封胶。
    3. 网络-似乎大楼有专门的 IT 部门,住户不是跟网通、电信等 ISP 直接打交道,但是网络非常之不稳定,正好这几天尤其严重呢(这也是促发本文的重要因素),作为一家网络公司,遇到这样的情况真是窘迫。为了提供原始的“failover”,同事故意给两间办公室选择了不同的接入,但是……似乎效果不是很明显 🙂
    4. 电力-这个就不用细说了,我们的多台服务器都被摧残过许多次。搞得我每次在上面执行个较长事件的任务都得探一下风声,看看断电的可能性有多大。

    周围也有其它的 SOHO 建筑,应该都是出自万科,同事说都是中看不中用。是啊,破烂的办公楼见的多了,但是从来没有遇到过空调、电力、网络都这么差劲的……

  • 如何将 AS 文件编译成为 swf

    上篇文章留下这么一个疑问,本以为被琐事缠身,没时间再写了,不过发布完之后正好将某事推掉,于是有时间马上写这一篇。造一个句:如果志不同,那么道不合。跟很没劲甚至很烦的人在一起吃饭,不如饿着肚子弄点技术方面的东西。我鼓捣的也不是很有技术含量的东西,就是有兴趣。

    下载并正确配置 Flex SDK 以后,就可以使用 compc 命令了。这个名字实际上是 component compiler 的简写,就是用来生成 swc 文件的。还有一个命令叫 acompc,前面加的那个字母应该是指 AIR,它与 compc 的区别只是加载了不同的配置文件而已,所以本文以后就只使用 compc 了。

    执行命令 “compc -help list” 就可以看到许多的编译选项,最重要的:

    • -compiler.context-root path to replace {context.root} tokens for service channel endpoints. 我不是特别了解,不过我把它设置为所有 package 的上级目录,对于 twitterscript 来说就是 http://twitterscript.googlecode.com/svn/trunk/src/ (这里只是示意,我写了 svn 的链接)
    • -include-sources 必须指定的源代码目录,不必多解释了。对于 twitterscript,仍然是 http://twitterscript.googlecode.com/svn/trunk/src/
    • -directory 本来结果是输出成为一个 swc 文件的,你需要 unzip 之才能得到想要的 swf,现在有了这个选项就好多了,直接生成一个目录,而不是压缩文件。

    知道了这些就可以编译了 (我的当前目录下面是 twitter-api 目录,里面的 src 子目录里就是 svn export 的 http://twitterscript.googlecode.com/svn/trunk/src/):

    [code lang=’text’]
    compc -compiler.context-root=twitter-api/src/ -include-sources=twitter-api/src/ -directory=true -output=twitter-swc
    [/code]

    于是在当前目录下生成一个子目录叫 twitter-swc,里面的 library.swf 就是我们想要的文件。可以再加上一个参数 “-compiler.debug=false” 来编译,获得更小的输出文件。

  • AIR – 在 HTML/Ajax 的程序中使用 ActionScript 3 的 Library

    Adobe AIR 的首页上,就给出了三种 AIR 编程的途径:

    • Ajax – 主要编写 HTML 和 JavaScript 代码,对于经常编写 Web 应用的程序员们来说,很容易上手。
    • Flex – 我不太熟悉,应该是配置文件主导的一种方式吧,有可视化设计工具。
    • Flash – 利用可视化设计工具设计界面,配合编写 ActionScript 代码。

    Flex 编程中应该也会用到大量的 AS 编程,但是 Ajax 方式的 AIR 呢?一开始,我认为它利用与 Web 编程几乎没有差别的环境吸引了以前熟悉 Web 应用的开发者,但是却牺牲了 Flash 强大的表现能力,如果用 JavaScript 实现 Flash 同等的动画效果,难度和复杂度应该会大很多。

    但是很快我就发现这个顾虑是多余的。Adobe 的 livedocs 中就有一个页面教大家怎么在 HTML 页面中调用 AS 的 library:”Using ActionScript libraries within an HTML page

    Adobe 对 webkit 做了一个小小的扩展,使其支持新的脚本并与 JavaScript 互通:

    [code lang=’html’]

    [/code]

    该 swf 中的 AS 代码里的变量,怎么在 JavaScript 中引用呢?通过 window 变量一个特定的属性 runtime:

    [code lang=’javascript’]
    var libraryObject = new window.runtime.LibraryClass();
    [/code]

    大家还是看帮助页面吧,不过我几乎快把人家的东西全抄过来了。ActionScript 3 和 JavaScript 本来就应该遵循一个标准 – ECMAScript,这样也合情合理。

    有些人可能奇怪了,你既然选择了使用 Ajax 途径,干嘛还又要用 AS 呢?其实就是有时候图个省事。比如我要写一个 “推特” 客户端,上网一搜,发现了根正苗红(倒不一定非常好)的 twitterscript,不想再重新造轮子,不过它是用 AS3 写的,我也懒得再把它翻译成 JS.

    于是把项目提供下载的 swc 文件拿回来——那其实是一个 zip 格式,解压后,拿到我们想要的 library.swf,把它按照 Adobe 教的方法加到 AIR 程序的 HTML 页面中,马上就可以在 JavaScript 中使用这个库了!

    有耐心看到这里的读者一定有个很大的疑问,怎么从一堆 AS3 代码得到这个 swf 文件的呢?假如要对 twitterscript 的源代码做一下修改怎么办?这还得回到刚才的那个 livedocs 页面,最下面有个 Note:

    To compile an ActionScript SWF library for use as part of an HTML page in AIR, use the acompc compiler.

    这里就不再细说了,这个 acompc 在 Flex SDK 中有,和其中的 compc 其实是一个东西(我觉得)。有兴趣的朋友自己去研究一下怎么编译吧,也许我再有空了会写一篇文章说说这个。

    Update: 说时迟,那时快——如何将 AS 文件编译成为 swf

  • 四号线不到北京西站……

    国庆回家,我一个朋友帮买的9月30号晚上的火车票,我们分头往西站走。

    当时风声比较紧,天天超载去西站的一辆公交车也不敢跑了。不过天无绝人之路,四号线不是开通了么,正好也让我沐浴一下春风,分享改革开放三十年伟大成就,于是我计划先乘十号线,再换四号线到达西站。

    四号线的地图给我的感觉,下面向东突出的部分就是北京西站,我也从来没有仔细辨认过那个字。之前坐火车去广东,跟旁边的人聊天,还说四号线就是通北京西站,他们还附和说是呢,后来看都是托……

    我悠哉游哉上了四号线,感觉挺不错,就是那么凉快的天,空调温度还开那么低,我冷倒也罢了,社会主义也禁不住你这么糟蹋啊。有点奇怪国庆前夕去西站的人怎么那么少,不过别想太多了,有座位真好。朋友打电话过来说你还有心情绕北京转圈啊,我不急,地铁又不堵车。

    到了“北京×站”,我一下车,经过那个大柱子之后,又忍不住退回来,因为感觉柱子上的站名写错了。四处张望一番,发现到处写的都是“北京南站”,我一下懵了,一边往站外跑一边给朋友打电话——如果我为祖国牺牲了,你就一个人回家吧。此时距列车发车还有半小时,我也不清楚南站离西站到底有多远。骑三轮车的看我着急,说送到西站40块,真黑,我心里想,车票才二十几块,大不了明天再买一张,也不助长不正之风!这时开过来一出租车,司机师傅想进南站接个叫车的人,绕了好几圈都没找到进去的办法,正好拉着我一路顺风到了西站,我又一路狂奔拒绝出示身份证终于赶上了火车。

    一个半小时后到达保定,住了一夜,第二天一早吃了一个半驴肉火烧,赶到人山人海的汽车站,设法挤上汽车,被超载和破烂不堪的公路折磨到家。

    回到北京后上网看,果然又很多人认为四号线是通北京西站的……

  • Windows 7 截图工具快捷键

    Windows 7 新的一个小工具程序是截图工具,虽然还是比较鸡肋,但终归可以自选区域了。

    不过有些时候,用它来截图的话,切换到截图工具的窗口,要截图的东西却已经没了,比如说上篇文章里的百度输入框自动提示。

    这时候有个快捷键就解决问题了。我看到网上好多人在问截图工具的快捷键是什么,似乎大家都觉得 Windows 的帮助文档很没用。我在帮助里很快查到了 Ctrl+PrtScn,试了一下,果然可以。

  • Linux date 命令获取某日期的前一天

    最近需要写个 shell script,给定一个日期参数,它要得到该日期的前一天,然后做剩下的事。执行的时候就是这样:

    [code lang=’text’]
    # ./foo.sh 2009-03-01
    [/code]

    初看,这个问题有些棘手。最原始的办法是写个比较繁琐的函数,知道每个月分别是多少天,还要处理一下闰年的情况——这也有点太繁琐了,呵呵。

    稍微看一下 date 命令,就发现利用它可以很方便的写出一个非常 stable 的函数。date 可以通过 -d 指定一个日期,然后用指定的格式输出。-d 不仅可以接受 “2009-03-01″ 或者 yesterday 这样的格式,还可以接受一个从 1970 年开始至今的秒数,当然也可以指定日期输出这样的秒数。如:

    [code lang=’text’]
    # date +%s
    1252591191
    # date -d @1252591191 +%F
    2009-09-10
    [/code]

    这样,事情就变得很简单了。先用 date 命令将该日期转换成秒数,减去一天的秒数 86400,然后再转化成正常易读的日期格式,就可以了,不需要考虑复杂的大小月以及闰年问题。以下是简单的例子:

    [code lang=’bash’]
    #!/bin/sh

    function get_day_before {
    seconds=`date -d $1 +%s`
    seconds_yesterday=$((seconds – 86400))
    day_before=`date -d @$seconds_yesterday +%F`
    echo $day_before
    }

    get_day_before $1
    [/code]

    最后,必须支持一下这个 World Calendar。它非常有规律,非常容易记忆,季度、月份、星期完美地吻合在一起。