最近在某服务器上面搭建 git 开发和部署环境,git 开发环境很简单,按照 ProGit 一书的相关知识就可以轻松搞定,实现了类似 Github 的使用 SSH + 私有 Clone 的方式。
关于部署,奇迹上是自动部署,起初的想法是使用 bash shell 制定一个定时任务去不断 git pull 产品代码,后来记得 Git 带有 Hooks,索性在 ProGit 一书翻了翻:
Git 本身可以调用自定义的挂钩脚本,其中有两组:客户端和服务器端。客户端挂钩用于客户端的操作,如提交和合并。服务器端挂钩用于 Git 服务器端的操作,如接收被推送的提交。详情请查看 ProGit 相关章节
如果这样就简单了,利用服务器端调用想要的挂钩(Hook),即可实现自动部署的方案,为了保证不被肆意部署,特加了一个对需要部署 commit 的判断,利用读取 commit subject 并匹配想要的字符串才去部署,这样我认为是一个比较安装的部署方案。
Git的挂钩(Hook)主要包含:
- applypatch-msg
- post-update
- pre-rebase
- commit-msg
- pre-applypatch
- update
- post-commit
- pre-commit
- post-receive
- prepare-commit-msg
这里我们只需要使用 post-receive 这个 Hook:在接收 post(push) 请求之后执行。其他大部分我也没有大多研究,不过看名字不算难理解,我觉得其中大部分包含 commit 的属于客户端。
好了,部署开始:
1. 在服务器 git 仓库(注意是 bare 仓库,不是代码仓库)的 Hooks,编辑 post-receive(如果没有自行创建),贴入下面代码(Feed 用户请看这里):
这里会先判断脚本所在目录是否是 bare git 仓库,然后获取最新 commit 的 subject,并匹配是否包含 [deploy] 字样,如果包含,则继续检查产品代码仓库路径是否存在,如果存在则执行 git pull 操作。
2. 对刚才编辑的 post-receive 执行下面命令以保证脚本可执行:
3. 完成!
-------------------------------------
对于自定义脚本,其实不仅限于 bash shell,你可以使用你熟悉的语言,然后把你的脚本路径在 hooks 脚本中加载即可。
脚本还会继续更新,下面需要增加关于测试部分的相关判断和部署。 bash shell 还需要进一步学习,上面脚本是我第一次写,如有不妥之处,请指教,感谢!
Posted in How-To
|
Tagged git, hooks, 自动部署
|
假设我在 github 有一个开源的版本库 x 供大家使用,该库里面又包含了好些个 submodules,其中有一个 submodule 名为 a 是自己在 github 又创建的:
$ git submodule add http://github.com/icyleaf/a.git modules/a |
现在问题是,由于代码需要更新,同时涉及到了 a 这个 submodule,但是它的添加 url 是 read-only,由于 x 这个库是供大家使用,因此 a 又不能设为 private:
$ git clone git@github.com:icyleaf/a.git modules/a |
目前想到的方法是在 x 库以外 clone 下来 a,进行私有的写入和 push 到 github 上面,然后在 x 库的 a 里 git pull 下来获得最新的代码。
如何解决这样的问题,能够当大家全部 clone 下来,而自己开发也能避免麻烦?
在一篇文章上面找到了灵感,折腾了一番搞定了 
该文章有一节讲到,开发者如果经常需要更新 submodule ,即可更换 submodule 的 remote url:
$ cd commonlib
$ git remote rm origin
$ git remote add origin ssh://mark@git.mysociety.org/data/git/public/commonlib.git
$ git remote -v
origin ssh://mark@git.mysociety.org/data/git/public/commonlib.git
However, you’ll find that two helpful config options will have been deleted when removing and adding back origin, so you’ll want to add these back.
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master |
首先我也先对 a 进行 git remote -v,结果显示:
origin http://github.com/icyleaf/a.git (fetch)
origin http://github.com/icyleaf/a.git (push) |
发现和文章里面的显示的结果不一样,于是我就在想能不能在 remote 上面做些手脚,首先看下 git remote 的 help,发现有一条是可以单独设置 remote push 的 url ,也就是更换上面 git remote -v 中 push 的 url,尝试:
$ git remote set-url --push origin git@github.com:icyleaf/a.git |
再次执行 remote -v:
origin http://github.com/icyleaf/a.git (fetch)
origin git@github.com:icyleaf/a.git (push) |
执行成功!然后随意 commit 并 push orgin master,成功!
搞定!
Posted in 网络开发
|
Tagged git
|
Kohana 默认仅对 Apache 环境提供的部署支持,其实对于 Nginx+FastCGI 也是很容易支持的。本文搭建环境是 Ubuntu 10.4 并采用 apt-get 方式安装,喜爱编译的朋友可以自行解决
1. 安装 MySQL
sudo apt-get install mysql-server mysql-client |
安装过程在会提示设置 root 账户的密码,如果是本机测试开发可以留空后稍候设置。
2. 安装 Nginx
# 安装 Nginx
sudo apt-get install nginx
# 启动 Nginx
sudo /etc/init.d/nginx start |
完成上面两步之后,打开浏览器,输入 localhost 或 127.0.0.1 如果看到 Welcome to Nginx! 字样就说明安装成功了,是不是很简单
注意,如果你的机器上面如果安装了其他 web 容器(比如 Apache,Lighttd等),启动 ngnix 的时候肯定会报错,因为这些 web 容器启动均占用的 80 端口,更改的方法如下:
编辑 /etc/nginx/sites-available/default 文件,修改 server 段中的 listen 为 localhost:8080,其中 8080 是更改的监听端口:
server {
listen localhost:8080;
server_name localhost;
# [...] |
保存后重启Nginx:
sudo /etc/init.d/nginx restart |
Continue reading →
Posted in Kohana
|
Tagged FastCGI, Kohana, Nginx
|
这两天研究 HTML 的 DOM 需要寻找某个 Element 元素的完整 XPath 路径,由于使用的是 PHP Simple HTML DOM Parser 开源库,这个库类的使用方法几乎兼容 Javascript 的 DOM 语法并附带 DOM 选择器。虽然功能强大但是并不能直接获取 Element 的 XPath。这个怎么办呢,依稀记得 Firebug 有一个功能,选择某个元素在它的控制台可以显示 XPath。嗯,着手实践一下发现不仅可以显示而且还可以复制 XPath,如下图所示:

于是想,如果可以找到 Javascript 版的相关代码就一定可以改成 PHP 版本的,结果在 Google 的新家搜索找到了...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| var elt = document.getElementById('table');
var xpath = getElementXPath(elt);
alert(xpath);
// Get full XPath of an element
function getElementXPath(elt)
{
var path = "";
for (; elt && elt.nodeType == 1; elt = elt.parentNode)
{
idx = getElementIdx(elt);
xname = elt.tagName;
if (idx > 1) xname += "[" + idx + "]";
path = "/" + xname + path;
}
return path;
}
// Get Idx of an element
function getElementIdx(elt)
{
var count = 1;
for (var sib = elt.previousSibling; sib ; sib = sib.previousSibling)
{
if(sib.nodeType == 1 && sib.tagName == elt.tagName) count++
}
return count;
} |
PHP 改进版:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| // Use it before import PHP Simple HTML DOM Parser
$html = file_get_html('http://www.google.com/');
// find a sample element by id
$elt1 = $html->find('#footer', 0);
// find a sample element by tag name
$elt2= $html->find('div', 10);
// it will return if found it: //*[@id="footer"]
$xpath = getElementXPath($elt1);
// it will return if found it: html/body/div[10]
$xpath = getElementXPath($elt2);
function getElementXPath($elt)
{
$path = '';
$first = TRUE;
for(; ($elt AND $elt->nodetype == 1); $elt = $elt->parent())
{
$xname = $elt->tag;
$idx = getElementIdx($elt);
if ($first AND isset($elt->attr['id']))
{
$path = '//*[@id="' . $elt->attr['id'] . '"]';
break;
}
if ($idx > 1)
{
$xname .= '[' . $idx . ']';
}
$path = '/'.$xname.$path;
$first = FALSE;
}
return $path;
}
function getElementIdx($elt)
{
$count = 1;
for($sib = $elt->prev_sibling(); $sib ; $sib = $sib->prev_sibling())
{
if($sib->nodetype == 1 && $sib->tag == $elt->tag)
{
$count++;
}
}
return $count;
} |
大家同样可以把上面的代码直接 crack 到 PHP Simple HTML DOM Parser 库中。
Posted in How-To, 网络开发
|
Tagged JavaScript, PHP, XPath
|

昨天在 GReader 看到了 CNBorn 同学分享的一篇文章:Shellex的星际2试玩报告 。文章有提到安装和破解 StarCraftII Beta 版本,同时我也知道了“玻璃渣”就是 Blizzard 暴雪公司的英文名。说来惭愧,我真正开始玩星际是在 2009 年初,大多都是和朋友几个在闲暇之余玩上一玩,星际其实并不是很熟悉,人族可能是我比较熟悉的种族,Lost Template 是我最熟悉的地图(高中时代经常玩魔兽争霸)。
StarCraftII 破解安装
上面提到的文章中之说明了 StarCraftII Beta 版本是从玻璃渣下载,当初没明白这个是什么东西,就随便找了一个国内的资源站下载的,客户端一个 1.6G+ 大小,花了一下午的时间下载完毕,晚上回家在自己的笔记本上面安装后准备要破解才发现,破解程序只在 0.3.0.14093 版本测试成功(如果不是那个版本运行破解程序会报错),而其他版本没有测试。我又花了一点时间用手机查找了下如何看 StarCraftII 的版本号:
在 StarCraftII 安装目录有一个 Versions 文件夹,里面会有很多Base13891,Base14093,Base14133这样的文件夹。这就是版本号,数字最大的是Base14133,也就是你的当前版本了!
当时我一看就傻眼了,从国内下载的版本是 Base13891 也就是 0.3.0.13891。这可怎么办啊,突然灵机一现,我把 Versions 文件夹下的 Base13891 文件夹名改成了 Base14093,然后运行破解程序,成功破解,选择地图开始玩咯!(建议从官网下载原版客户端或正确的版本,我的方法可以解决燃眉之急,并不知道会不会有什么功能缺失)
由于破解文件包含了人族的补丁,借上面的文章说是人族的能力从猴变成了猿...说回游戏,选择地图后(可以和AI对战,AI 的数量跟文件有关系,大家可以看破解的说明文件),玩家的种族是随机分配的(今天早上看昨天的推说已经有了种族选择的补丁,大家可以关注下)。几回对战并选择不同的难度(需要手动覆盖某个文件)的战斗发现,人族在打了补丁之后确实蛮厉害的,机枪兵+升级后的坦克(火力+扎架)配合护士MM运输机,直取深入比较无敌 XDD。幸亏之前看过辰音奈奈讲解了三期战报。对于兽族和神族也是可以快速上手(图标变化太大,有些适应不过来)。
嗯,以上是昨天小玩的一天心得,感谢大家的欣赏
------------------得意的分割线--------------------------
没想到我的笔记本还是可以玩得起来 StarCraftII,虽然我在看 Options 的时候发现 图像 的各个参数不是 None 就是 Low,但是画面还是可以的(或许我对画面不挑剔= =)
最后献上我的机器配置:HP 6520s(054)
CPU: Intel(R) Core(TM)2 Duo CPU T5870 @ 2.00GHz
显卡: ATI X1350 mobile
内存: 2x1G
硬盘: 160G
系统: Windows 7 Pro
更新补充:添加了试玩操作系统平台,为什么我一定要写明是 Win7 系统呢,由于此系统的内存管理机制进行了重写,直接影响了系统的性能和效率,我曾经偶然间测试过,同一个游戏 COD4,在 Win7 和 WinXP 下的性能是差别很大的,在读取每关任务和介绍的时候,WinXP 总是没加载完毕就已经介绍完毕了而 Win7则是在介绍没结束之前很早就已经加载完毕。
Posted in 影音娱乐
|
Tagged blizzard, StarCraft
|