2010-5-27 20:52 | by 2ndboy
Hudson 的 changelog computation 功能其实是个很有用的功能,但是如果你的项目是用 CVS 做 SCM 的,而且项目又特别大,那么这个 changelog computation 做起来那可是耗时巨大!就拿工作上的项目来说,CVS update + changelog computation + clean build 耗时 3 个多小时,其中居然有 2 个多小时是在做 changelog computation!!!所以即便是 local daily build 出了错,留给开发的反应时间太短。关于如何禁用这个 feature,在 Hudson 的 Wiki 上找到一篇文档。按照文档所述如法炮制,修改 Hudson home 目录下的 hudson.xml(这是 Hudson service 的配置文件),在 节点下加一句:
- <env name="hudson.scm.CVSSCM.skipChangeLog" value="true"/>
但是试过以后发现根本没效果,所以看来文档上说的“In general, these switches are often experimental in nature, and subject to change without notice.”不是在忽悠:) 这么看来,不存在 disable changelog computation 一说,顶多也只能 skip。
今天尝试的一个方法可以达到绕过 changelog computation 的目的——建个新 job,workspace 设定成跟真正需要 build 的 job 一样。这个新 job 只做 SCM 部分的工作,然后早于需要 build 的 job 运行,这样等真正需要 build 的 job 运行起来的时候,changelog computation 的时间会大大缩短,现在用了这招后,我们的项目全程 build 时间减少到了正常的 1 小时左右。
[Update: 2010/7/8]
实践中发现上面这一招还是有玩儿不转的时候,比如在第一次和第二次 update 之间有过大量 code commit 的情况下,这个更新过程还是会长的让人崩溃。所以今天又换了个思路,干脆绕过 Hudson 的 SCM update 机制,用命令行自己来 update code。
方法是在所有的 build step 之前再加一个 Execute Windows batch command,示例内容如下:
@echo off
echo Updating src …
cd %WORKSPACE%\src
cvs -d :pserver:username:password@cvs_server_address:module update -P -d
由于 Hudson 在每次执行批处理的时候都会把 current path 设置在 workspace 下,所以命令序列里不用加切换盘符的内容,只需要按照实际需要切换路径就可以了。
Posted in Continuous Integration | No Comments »
2010-5-26 22:34 | by 2ndboy
以下内容说的是 Windows 平台,在 *nix 下用 shell 没什么好说的:)
在 Hudson 的系统设置里可以设置“Shell executable”,在 Windows 下,最好的选择是 Cygwin。不改 Cygwin 的默认安装路径的话,这里可以设置成“C:\cygwin\bin\sh.exe”,然后就可以在 job 设置里 add 一个“Execute shell”的 build step 了。这种情况下取 Hudson 预设环境变量的话可以在变量名前加“$”,比如 job 的 workspace 路径——$WORKSPACE。
如果不想装 Cygwin,或者觉得 shell 脚本太弱的话,Hudson 还支持用 Python 做 shell。这种情况下不用在系统设置里对“Shell executable”做什么设置,而是用 *nix 下 shell 脚本惯用的首行注释来指明 Python 解释器的位置。在 job 设置里用“Add build step”加一个“Execute shell”,然后在“Command”里直接写 Python 代码,比如第一行写:
就可以用 Windows 风格的路径来指示 Python 解释器所在的位置。这这种情况下,取 Hudson 预定义的环境变量要用库函数:
- import os
- print( os.getenv('WORKSPACE') )
还有一种情况是你的 Windows 系统里没装 Python,而是把 Python 装在了 Cygwin 里,这种情况下要配置系统设置里的“Shell executable”,然后 Python 脚本可以放在磁盘文件里。Command 里可以写成形如:
- /bin/python /cygdrive/E/foo/2ndboy.py
或者:
- /bin/python E:/foo/2ndboy.py
但不能写成:
- /bin/python E:\foo\2ndboy.py
第一种“/cygdrive/E/foo/2ndboy.py”的形式是 Cygwin 里用于访问其它分区的语法形式,因为“/”只能访问到 Cygwin 的安装路径而已。
Posted in Continuous Integration | No Comments »
2010-5-23 15:26 | by 2ndboy
教练曰:开弓没有回头箭,所以倒桩一学起来就连续教一串。5/13 倒正库,5/18 倒反库,5/21 移库,5/23(今天)侧方停车。今天是头一回在周末去学车,人没有我想象中的那么多。在场地里发现高尔夫球若干,居然有人在场地边上运动场的草坪上打高尔夫O_O
倒反库:
1. 左前窗门销跟(3)(6)号杆快成一条直线时左一圈半(到底)
2. (2)号杆在左后窗小三角中间时右回半圈
3. (2)号杆与左后窗立柱重合时再左打半圈(到底)
4. 注意右反光镜,(1)(6)号杆都能看到时回正(右转一圈半)
移库:
1. 一进:原地右打一圈,一档先前,左径对准(2)号杆时左打两圈,在(2)号杆前停下
2. 一倒:原地右打两圈,后退,左径对准(3)号杆时左打两圈,停在停车线
3. 二进:原地右打一圈半,一档向前,车左角过(2)号杆右侧一圈时左打一圈半(回正),在(2)号杆前停下
4. 二倒:原地右打两圈,后退,左后门把过中线时左打两圈,左前轮完全过中线后马上停车(否则容易出线)
倒正库、倒反库和移库全学完后就是一套完整的倒桩移库,全套动作的顺序是:
1. 从库的右前方倒正库倒入乙库(这时方向盘是回正状态)
2. 从乙库移库到甲库(结束时方向盘是向左一圈的状态,出库时不动方向,前进到车头在(2)(3)号杆中间时回正,从两根杆中间穿过,车左角到达黄底线时左打一圈半来到倒反库的位置)
3. 倒反库进入甲库,车完全进库后就可以开出的初始位置了
侧方停车:
1. 开左转向灯,倒档,车动起来后关左转向灯
2. (1)号杆与右后窗粗立柱重合时右打一圈半(到底)
3. 注意左后视镜,刚刚能看到(4)号杆时左打一圈半(回正)
4. (1)号杆刚刚出现在前挡风玻璃右边时左打一圈半(到底)
5. 继续倒车至车前左角对到(1)号杆时马上刹车(这时方向盘还是左打一圈半的位置),拉手刹
出停车位:
1. 开左转向灯,一档,放手刹,鸣笛,车动起来后关左转向灯
2. 车前左角挡住左边黄线时右打一圈半(回正)
3. 右后视镜完全过(1)号杆时右打一圈(打早了车右侧容易擦(1)号杆)
4. 车身摆正时左回一圈(回正)

发现没上手之前背动作没什么效果,还不如实地操作两把记得快。教练说现在九选四改成了九选三,如果必考项跟以前一样还是侧方停车和定点停车的话,随机抽取项就只有一项了。
Posted in 随便说说 | 2 Comments »
2010-5-16 21:23 | by 2ndboy
周四学了倒正库,貌似网上也有人叫倒桩。说实话看其他人练的时候感觉动作挺复杂的,但是自己上去练了两把也就会了。虽然第一次转弯时离合器放得太快熄火,不过后来的几把就特别顺。教练说我们练的车跟几个月前的人不一样,他们那时候是两圈打死,我们现在用的车是一圈半就打死。今天网上查了一下,貌似是今年一月份以后教练车的方向盘改了助力方向盘,所以就不一样了。
回来之后根据教练教的方法做了个能放在 iPT 看的图,方便万一忘了的时候看看:)

Posted in 随便说说 | No Comments »
2010-4-25 23:20 | by 2ndboy
自从败了 iPod Touch 以后,我就专找 AAC 的专辑下(穷人,没办法),不过 VeryCD 上的很多专辑都没有 AAC 格式,比如这张 Bryan Adams 的《So far so good》。iPT 不支持 APE,所以晚上研究了一把 APE 转 AAC。
网上找到了从 foobar2000 里用自带的 convert 功能做转换的方法,原理是调用第三方的 encoder,对 foobar2000 解出来的 PCM raw data 做编码,所以只要是 foobar 支持的音频格式都可以转成你想要的格式[1]。
至于编码器,我还是青睐开源的方案,所以就选了 faac(Freeware Advanced Audio Coder)。SourceForge 上下载的都是源代码,不想自己编译的话,可以在这里直接下载编译好的 binary。
打开 foobar 的设置,在 Tools 下找到 Converter,点 Add New,然后在 Encoder 里选 Custom。下面是三个最主要设置的填法:
Encoder:填 faac.exe 的绝对路径
Extension:按照 Apple 的惯例,填 m4a
Parameters:-w -q 500 -c 22050 – -o %d
注意上面参数中,22050的后面是“- -o”,不是“–o”,两个减号中间有个空格。这个参数是网友推荐的 VBR 最优设置,我用 faac –long-help 查了一下,解读如下:
-w:把编码后的 AAC 数据放到 MP4 容器格式中,这样 iPT 才能识别。
-q 5000:VBR 方式的最高质量,VBR 就不用解释啦。
-c 22050:设置频带宽为 22050 Hz。无损的原始 CD 音频是 44100Hz 的,按照采样定律,采样率要是频带宽的 2 倍,所以这里把频带宽设置为 22050。
-:这个单独的减号是让 faac 从 stdio/管道中读取原始音频数据,否则的话 foobar 要先把 PCM 数据写到一个临时文件里,再让 faac 去编码那个 WAVE 临时文件,多了个步骤。
-o %d:告诉 faac 输出文件的文件名,这个 %d 是 foobar 设定的变量,转换时会被替换成用户指定的文件名。
设定好以后在 foobar 里右击要进行转换的 APE,Convert->…。在 Converter Setup 对话框的 Output format 里选中刚才创建的新 converter,转换进度条走完以后就可以去听一下转出来的 AAC 文件啦,绝对跟原始 APE 一模一样(反正不用专业仪器估计是听不出差别来地:))。
注 1:尽量不要用有损格式转到 AAC,比如 MP3->AAC,这样转出来的效果绝对比用无损的 APE 转到 AAC 要差很多!!!
注 2:关于 AAC 的更多介绍,可以移步到这里围观。
Posted in iPod, 天籁之音 | No Comments »