Author: Volcano

  • git flow使用经验小记

    我在半年前开始在公司内推广使用git flow,控制版本发布流程,到目前为止效果令人满意。 但是实际使用过程中有一些小小的意外流程,完全照搬git flow的模型不太容易处理好。好在git本身就很灵活,碰到问题基本上都有办法绕过去。下面是我总结的一些特例情况下的处理办法。 测试/共享单独一个feature 有时候我们需要将一个feature独立测试,或者share给多人一块开发,那么可以将这个feature推到远程git库上,这可以利用git flow的publish功能搞定: git flow feature publish my_cool_feature 这会将 feature/my_cool_feature 分支push到远程git库,多人开发或者单独测试毫无压力。 feature在development分支测试完成,准备release的时候有另外一个未经测试的feature合并进来 已经完成测试的development被未经测试的提交污染了,这时候可以先本地回滚development分支,然后再进行git flow的release流程,例如: git checkout development git reset –hard 5cbadfe885d1eb514b3f07b3f269ca1a7f261e21 #假设测试通过的git rev是这个 git flow release start v1.0.1 git flow release finish v1.0.1 development上有个feature需要测试比较长时间,影响了一些耗时较短的feature发布 development分支上有个feature测试时间比较长一直释放不了,怎么办?—— 果断采用hotfix功能 git br -m feature/another_cool_feature hotfix/another_cool_feature 把耗时短的feature直接转换为hotfix,然后采用git flow的hotfix流程可以直接合并到master分支发布。

  • 用git部署php站点

    在小站点上,直接用git来部署php代码相当方便,你的远程站点以及本地版本库都有一个版本控制,追踪问题或者回滚是很轻松的事情。下面介绍用git部署时的设置步骤 在远程服务器的设置 假定你需要部署的代码在/var/www/yoursite cd /var/www/yoursite git init . git config receive.denyCurrentBranch ignore git config –bool receive.denyNonFastForwards false cd .git/hooks wget https://gist.githubusercontent.com/volca/9482044/raw/344a590af350b997db3819fa21426dfe8bc140f4/post-update chmod +x post-update 在本地git库中新增配置 [remote “prod”] url = your-ssh-username@your-host:/var/www/yoursite/ 这样就算设置完成了。 如果你想把本地的代码推送到远程服务器,下面简单的步骤就可以做到 git pull git push prod 注意事项 如果远程服务器上git的配置目录.git暴露在外部可访问的位置,请在web服务器上设置这个目录不可见。

  • 如何安装Node.js

    下面分别介绍在Mac, Ubuntu,Centos以及Windows下安装Node.js. Mac 在Mac下,如果你喜欢用homebrew,那么只用一行就可以装好: brew install node 否则,只能考虑手工安装了,步骤如下: 安装Xcode 安装git 运行下面的命令行编译node.js git clone git://github.com/joyent/node.git cd node ./configure make sudo make install Ubuntu 安装依赖包 sudo apt-get install g++ curl libssl-dev apache2-utils sudo apt-get install git-core 运行下面的命令行: git clone git://github.com/joyent/node.git cd node ./configure make sudo make install Windows 用cygwin来安装node,步骤如下: 安装cygwin 在cygwin的目录下,运行setup.exe安装下面列表中的包 devel → openssl devel → g++-gcc […]

  • 设置自动重连的ssh代理通道

    我目前常用的翻墙办法就是拿ssh搭个代理通道,然后chrome + switch!插件一起配合,这就算翻墙了。这法子只要拿个机器跑一小脚本,比如: ssh -D 7070 -qnN [username]@[server] 但是ssh通道如果闲置了一段时间,就会自动断连,等我需要用到代理的时候往往又得蛋疼的重新跑一遍,非常麻烦。所以我刻苦学习前辈的经验,找到一个解决办法,在mac或linux下都可使用,分享如下: 把ssh配置为免密码登录,这个一搜一大把,略过不提 在/etc/inittab的最后一行加上: tunl:345:respawn:/usr/bin/ssh -D 7070 -qnN [username]@[server] > /dev/null 2>&1 让修改的inittab马上生效 sudo init q 在/root/.ssh/config里加上几行 Host * ServerAliveInterval 60 然后这个ssh通道就会自动重连了。 Update 增加了一个ssh配置,要不然这个进程虽然在,但是通道已经连不上了 .ssh/config的配置是关键,/etc/inittab的配置只是让服务器开机即启动ssh通道

  • git svn实战

    我之前写了几个wordpress插件,比如inline-javascript, code-prettify。这些插件都托管在wordpress.org提供的svn服务器上,但是我实在太喜欢在git下活动了,因此动了点心思,想把插件代码传到github上,开发完之后利用git-svn传到wordpress的svn服务上。 照着这个思路,捋起袖子就开干了。 用git-svn抓取插件代码 wordpress的插件svn库大且缓慢,如果直接用git-svn去clone代码,一定会慢死,所以我按照以前的笔记,用git从大型svn快速clone代码。 以code-prettify插件为例,首先需要读取这个插件创建时的版本号 svn log http://svn.wp-plugins.org/code-prettify|tail -4|head -1 得到了如下信息,获得一个版本号 318479 r318479 | plugin-master | 2010-12-03 20:12:29 +0800 (五, 03 12 2010) | 1 line 开始clone代码 git svn clone -s –prefix=svn/ -r318479:HEAD http://svn.wp-plugins.org/code-prettify 设置git仓库 首先把代码传了一份到github: https://github.com/volca/code-prettify 然后操作本地git仓库 git branch -m svn git remote add origin git@github.com:volca/code-prettify.git git checkout master 本地svn分支对应svn的远程仓库,本地master分支对应github的远程仓库 Happy time 现在可以按照平常的习惯在git下更改代码,然后用git […]

  • 防止伪造跨站请求的小招式

    伪造跨站请求介绍 伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等。这种攻击常见的表现形式有: 伪造链接,引诱用户点击,或是让用户在不知情的情况下访问 伪造表单,引诱用户提交。表单可以是隐藏的,用图片或链接的形式伪装。 比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。 yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_id和fb_dtsg。 随机串代码实现 咱们按照这个思路,山寨一个crumb的实现,代码如下:

  • code-prettify — wordpress语法高亮插件

    最近基于google-code-prettify实现了一个代码高亮的wordpress插件 — code-pretttify,测试了下效果还不错,所以我马上把全站的代码高亮插件换成了这个。 这里是code-prettify的项目主页,我会把这个plugin的最新情况更新在这里。 code-prettify的特点 完全由javascript完成代码高亮,不占用服务器资源 使用简单,只要用<pre><code>和</code></pre>包住代码,发布即可,这是wordpress编辑器自带的quicktag。 没有添加额外的hook,所以不会和别的wordpress插件产生冲突,绿色无污染 载入速度很快,因为js是在页面尾部加载的,不会堵塞页面的载入! 代码高亮效果演示 eg: <pre><code> class BigBang { function blah() { echo “Hello ooso.net”; } } </code></pre> Effect: class BigBang { function blah() { echo “Hello ooso.net”; } } 测试objective-c的code prettify效果 TTImageView *thumb = [[[TTImageView alloc] initWithFrame:CGRectMake(30, 30, 0, 0)] autorelease]; [thumb setAutoresizesToImage:YES]; [thumb setURL:@”http://farm4.static.flickr.com/3163/3110335722_7a906f9d8b_m.jpg”]; [self.view addSubview:thumb]; code-prettify下载 […]

  • mysql主从同步快速设置

    记录一个比较简便的mysql的主从同步设置步骤,方便日后使用。 安装环境 centos 5.4 mysql 5.1.xx 采用rpm直接安装 xtrabackup 1.2.22 采用rpm直接安装 1. Master:/etc/my.cnf [mysqld] server-id = 1 log-bin innodb_flush_log_at_trx_commit=1 sync_binlog=1 datadir=/var/lib/mysql character-set-server=utf8 init_connect=’SET NAMES utf8′ 设定了默认字符集为utf8,可以按实际情况取舍这段配置。 2. Slave:/etc/my.cnf [mysqld] server-id=2 datadir=/var/lib/mysql character-set-server=utf8 init_connect=’SET NAMES utf8′ 3. Master:在master数据库设置用来同步的slave用户权限 GRANT REPLICATION SLAVE ON *.* TO ‘<slave_username>’@'<slave_ip>’ IDENTIFIED BY ‘<slave_password>’; 4. Master:导出数据到slave 采用xtrabackup来备份mysql,好处是在master的锁表时间很短,在实际的生产环境也可以使用,并且xtrabackup会自动记录同步日志文件的位置。 sudo innobackupex-1.5.1 –stream=tar /tmp/ | ssh […]

  • php的filter扩展小技巧

    做为一个合格的web开发人员,一定会牢记一个原则——永远不能相信用户输入的数据,行走江湖,安全第一是很重要的。用户通过表单或url传过来的数据,一定要仔细检查过了,才往后台数据库里存进去。在一个成熟的开发团队里,贯彻这个原则不成问题;但是如果在一个新人老手混搭的小team里,很容易就忽视了这个问题,那么各种安全漏洞比如跨站攻击,sql注入等等真是防不胜防。 实际上,用php 5自带的filter扩展能够较好的解决这个问题。我在从前的blog里记录了filter扩展的常规用法——直接利用filter来校验数据,这样有不少额外的代码量,所以我得介绍一个比较偷懒的办法——自动对所有输入变量进行过滤,这只需要对php.ini增加一行配置,然后重启apache或fastcgi让php配置生效。 filter.default=”special_chars” 开启了这项配置后,会自动使用filter_input方法对$_GET, $_POST, $_COOKIE, $_REQUEST以及$_SERVER变量进行过滤转义。配置中special_chars是常量FILTER_SANITIZE_SPECIAL_CHARS的缩写,它能自动转义大部分危险字符例如: '"<>。而php手册对它的解释是: HTML-escape ‘”& and characters with ASCII value less than 32, optionally strip or encode other special characters. 在这个情况下,新人们写出这样的代码我也不会太担心: $foo = $_GET[‘foo’]; echo $foo; 在部分场合,我们可能还是需要未转义的变量,比如某个ajax接受的参数是一段json串,用这段代码即可获得原始数据: $foo = filter_input (INPUT_GET, ‘foo’, FILTER_UNSAFE_RAW); fitler扩展与yahoo使用的yiv如出一辙,印象里似乎就是yahoo对yiv做了些修改贡献给php社区,但是暂时没找到出处。

  • 关于“facebook的memcached实战”小记

    上周挤到QCon的会场里,听了两场 —— Facebook的Memcached实战,以及Twitter 的可伸缩性数据架构。当时对facebook超大规模使用memcached印象很深刻,只可惜到现在也没见到这个的ppt。平时用php比较多,因此听闻同样使着php的facebook讲memcached,有些小小的感触,记录下来。 更高效的序列化函数 php有两个memcache扩展,默认都是使用php自带的序列化函数serialize来存储数组或对象。但是serialize最为人诟病的就是速度慢,序列化之后占用空间大。由于facebook已经在memcached里保存了200T字节的数据,因此序列化函数即便作出的百分之一的优化对它来说都是个不小的收益。他们发粪涂墙在thrift的binary协议基础上搞出了一个fb_serialize,据称这个序列化方法能快上3倍,快倒算了,还能节省30%空间, 200T字节的数据能节省出30%,简直就是传说中的银弹啊,这让php官方的开发人员们情何以堪? facebook目前已经开源了thrift,其中自带了一个thrift协议的php扩展,但是这些代码里没有找到传说中的fb_serialize,我倒是从最近他们放出来hiphop-php里找到了这部分代码,哪位大侠去扒拉扒拉弄出来做成php扩展造福广大群众? 作为备选方案,我推荐igbinary,这也是一个binary的序列化方法。在上次的测试结果中,它甚至能节约50%的存储空间,速度也是稳超php原生的序列化方法,搞不好facebook换了这个序列化方法能省下更多的内存来? 节约每个item的存储空间有什么好处?我个人认为一个是省钱,另外一个就是能够带来速度上的提升。我们平常碰到稍大一点的item都得用gzip压的妥妥贴贴的才送到memcached里,网络传输的开销小了,这是实实在在的性能提升。何乐而不为? mcproxy mcproxy = memcached + proxy。facebook的机房遍布各洲,利用mcproxy来进行跨机房的同步或分发,全球制霸,指着太阳就能等到那天了。一般的互联网企业还真用不上这玩意,规模还没上去的时候,这些乱七八糟的只会拖后腿。facebook还没开源mcproxy,但是我找到两个替代品: memagent is a simple but useful proxy program for memcached servers. moxi = memcached + integrated proxy 从项目描述来看,moxi最接近facebook介绍的mcproxy,成熟度也比较高。 数据的一致性 Marc Kwiatkowski在会场上用大篇幅的ppt和大量的动画来阐述这个问题,他们用了很多额外的手段来解决在跨机房情况下因为延时问题造成的脏数据。这一段看着挺晕,但是我们联想到facebook用到的多级cache技术: 本地全局变量 + apc + memcache,不难理解这样做颇有些道理,这相当于用memcache实现了一个版本控制系统。 我还是很晕这段ppt。