让服务器自动从Hg版本库中下载代码

每次写完代码,提交到版本库,测试可以执行不会冲突,推到远端代码仓库。之后要发布的话,还要通过FTP上传到服务器上,FTP速度又不很理想,严重影响工作效率。

有没有解决之道?有!

直接让服务器从代码仓库中下载代码不就行了么?代码仓库中已经包含最新代码了,让服务器从代码仓库的服务器远程下载代码,方便快捷全自动!

而且,现在用的是hg,而不是svn。svn有个问题,提交的代码可能是未完成的半成品导致程序无法执行。而hg的好处是半成品可以提交在本地,阶段性成果完成后再往远端代码仓库中提交。

下面就以使用BitBucket为例,其他服务大同小异。

编译 hg

首先需要在服务器端编译一份 hg ,编译起来还是很方便的,直接从官网下载一份源码,解压缩后make && make install 一下就行了。他源码包里的README里就这么写的。

Mercurial/Hg 下载地址

第一次clone

第一次使用需要先clone一份代码仓库到本地,以后就可以简单的使用pull命令获取更新了。
所以第一次使用需要 hg clone <你的仓库地址>
仓库地址可以在 BitBucket里的项目里找到。

编写 PHP

然后在服务器端写一个文件up.php,放在需要更新的目录下面, 如下代码:

  1. passthru("/< hg命令行工具的绝对地址>/hg pull -u https://<你的用户名>:<你的密码>@<你的代码仓库地址>");

以我的空间为例,就是:

  1. passthru("/home/shawphy/bin/hg pull -u https://shawphy:******@bitbucket.org/shawphy/test/");

其中最关键的一步是要把密码也写在URL里,否则的话就得用popen()函数来处理密码交互了,比较麻烦。

这样,只要访问这个php文件,就能更新这个网站了。

配置Hook

然后,只需要在 BitBucket 项目管理中,Admin标签里,右边Additional options/settings面板下找到Services,点进去。然后添加一个POST服务,URL地址就填写你那个PHP文件的地址就可以了。

这样就能实现往代码仓库中提交代码后,网站服务器自动下载并更新代码了。

其他

如果要自己搭建的服务器上配置的话,参考 Hg 官方Wiki

TortoiseHg 设置语言成中文

最近逐步打算把各种项目从 svn 迁移到 hg,之所以不用 git,
一方面是第一次用的时候感觉很痛苦,没掌握门道;
另一方面是google code 他们也选择了hg而不是git;
还有一点是,我更喜欢Python。

google 专门撰写了文章分析了为何选择使用hg而不是git,
翻译的可以看这篇 [翻譯]Git 與 Mercurial 的分析

而 hg 在 windows 平台上最好用的除了直接用命令行之外,
还有就是这个 TortoiseHg
但他有点小小的问题,就是中文化起来很不方便,
这个问题已经提交过issue,不知道以后版本会不会有所改善。

其实设置语言的方法在文档里有详细说明:
如果你安装后还是英文,想要切换语言的话,只需要设置环境变量,增加一个 LANGUAGE,设置为zh_CN 就可以了

哪里设置环境变量?
系统属性(就是“我的电脑”属性)里,高级,环境变量,
然后在下面的系统变量里边增加一个 LANGUAGE,设置为zh_CN 就可以了

仅仅这样你会发现他右键菜单还是英文的,设置右键菜单需要到
C:\Program Files\TortoiseHg\cmenu_i18n\
里边,找到对应的语言,比如简体中文是 thg-cmenu-zh_CN.reg
导入注册表就可以了。

原来IE还能这样禁止输入中文

今天遇到个诡异bug,设计丢过来的皮肤测试下来无法在文本框中输入中文,输入法调不出来。
本来以为是设置了ime-mode,结果搜了半天没找到。
调试了半天原来设计那边误加了这样一段代码

  1. input{
  2.     bblr:expression(this.onFocus=this.blur());
  3. }

本来这句应该是用在链接 a 标签上的,用于去除虚线框,他是让链接元素一获得焦点,立即触发失去焦点的事件。结果在IE中就导致了在input中无法激活输入法了,因为系统认为你根本没有在输入框中嘛~
调试的很辛苦,不过这个发现很有趣。算是一个IE-Only的小hack吧,而且超好用。仅在ietester中测试过ie6和系统自带的ie8,其他的大家试着玩吧。
另外,我不反对使用css表达式,为了实现功能,用用也无妨,毕竟用户电脑卡死的几率较小,而功能不实现的话100%就是失败了。不兼容其他浏览器,那是另一回事了。比如网银,比如公司内部系统什么的,还是很有现实意义的小技巧

这是个工具

先前看TED视频,关于 学校教育扼杀创造性的视频。
视频很好,也有中文字幕等。下面也提供高清版本下载,很是欣喜。
遗憾的是,字幕不提供下载。(或者说我没有找到)

俗话说,自己动手丰衣足食。直接拿Firebug找到字幕文件地址,下载下来看到是JSON格式的,随即想到直接用JS输出字符串就可以转换到srt字幕。
代码如下,非常简单的代码,实用就好,不求效率、安全和边界问题,只求最快解决我的问题~

不得不说,学一门编程语言很有意义,不论是什么,都能很方便解决一些实际的问题。这很开心。
JS仔细说来是一门很强大的语言,处理JSON和XML都很方便,大多数时候应付足够了。不过也会有力不从心的时候,尤其是对于系统的操作,总有很多缺陷。不过如果算上微软的JScript的话,也很可以了。曾经想学Python,现在也坦然了,随便用什么,喜欢就好。或许,这与我不再从事IT相关行业有关吧。够用就行咯~

  1. //读取chi_hans文件
  2. $.getJSON("chi_hans",function(json) {
  3.     var c=json.captions,o=[];
  4.     for (var i=0,l=c.length; i<l; i++) {
  5.         o.push(i+1);
  6.         //这里的18500是时间偏移
  7.         o.push(timeline(c[i].startTime+18500)+" --> "
  8.             +timeline(c[i].startTime+c[i].duration+18500));
  9.         o.push(c[i].content);
  10.         o.push("");
  11.         //if (i==5) break;
  12.     }
  13.     //这里我输出到一个textarea
  14.     $("#output").text(o.join("\r"));
  15. });
  16. //这是根据JSON里时间得到srt字幕里的时间
  17. function timeline(time) {
  18.     t=new Date(time);
  19.     return [
  20.         leadZero(t.getUTCHours()),
  21.         leadZero(t.getUTCMinutes()),
  22.         leadZero(t.getUTCSeconds())
  23.     ].join(":")+","+leadZero3(t.getUTCMilliseconds());
  24. }
  25. //加入前导零
  26. function leadZero(s) {
  27.     if (s<10) {
  28.         return "0"+s;
  29.     }else {
  30.         return s;
  31.     }
  32. }
  33. //这也是前导零,三位数的
  34. function leadZero3(s) {
  35.     var ret;
  36.     if (s<10) {
  37.         ret="00"+s;
  38.     }else if (s<100) {
  39.         ret= "0"+s;
  40.     }else {
  41.         ret=s;
  42.     }
  43.     return ret;
  44. }