易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
老王:Subversion钩子

老王:Subversion钩子

事实上,我一般用的最多的就是Post-Commit,因为用来将SVN里的代码提交到测试机的项目里。其实也听过用svn来检测代码的可执行性。不过我是没有用过啦。
老王在博客里写的这篇文章就是讲pre-commit。有借鉴意义,以后可以悄悄的程序里用。不过,我觉得检查语法这种事情其实可以忽略了,毕竟现在都是用IDE的,一般语法问题IDE都能认出来。。

注:我开始看文章的时候没有仔细看CodeSniffer,我起初认为是语法检测,事实并非这样,是指代码是否按规范来写代码。如果是这样,那值得搞一搞啊

OK,上原文:Subversion钩子

Subversion本身有很好的扩展性,用户可以通过钩子实现一些自定义的功能。

所谓钩子实际上是一种事件机制,当系统执行到某个特殊事件时,会触发我们预定义的动作,这样的特殊事件在Subversion里有很多,默认有如下模板可供选择:

shell> ls /path/to/repository/hooks
post-commit.tmpl
post-lock.tmpl
post-revprop-change.tmpl
post-unlock.tmpl
pre-commit.tmpl
pre-lock.tmpl
pre-revprop-change.tmpl
pre-unlock.tmpl
start-commit.tmpl

其中最常用的是pre-commit和post-commit,也就是提交前后的钩子,下面以pre-commit为例来说明一下如何自定义Subversion钩子。

假设有一个PHP项目使用Subversion做版本控制,使用中发现了一些问题,比如程序员不写日志,或者提交的文件有BOM,或者提交的文件有语法错误,或者提交的文件不符合编码规范等等,这些问题都可以利用pre-commit钩子来解决,实际上已经有人写了解决类似问题的工具php-svn-hook,不过我们这里选择自己实现:

shell> cat /path/to/repository/hooks/pre-commit
#!/bin/bash

REPOS="$1"
TXN="$2"

SVNLOOK="/usr/bin/svnlook"
PHP="/usr/bin/php"

LOG=$($SVNLOOK log -t "$TXN" "$REPOS")

if [ "$LOG" = "" ]; then
echo "Please input log" 1>&2
exit 1
fi

FILES=$($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}')

for FILE in $FILES; do
CONTENT=$($SVNLOOK cat -t "$TXN" "$REPOS" "$FILE")

if echo "$CONTENT" | grep -q $'\xEF\xBB\xBF'; then
echo "Please remove BOM from $FILE" 1>&2
exit 1
fi

if [[ "$FILE" =~ \.(php|html)$ ]]; then
MESSAGE=$(echo "$CONTENT" | $PHP -l 2>&1)

if [ $? -ne 0 ]; then
echo "$MESSAGE" | sed "s/ -/ $FILE/g" 1>&2
exit 1
fi
fi
done

/path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit "$REPOS" -t "$TXN" 1>&2 || exit 1

exit 0

注:代码里使用PHP_CodeSniffer检查编码规范。

配置好脚本后,一定要记着给脚本加上可执行属性,不然脚本执行后会显示不知所云的错误信息:svn: Commit blocked by pre-commit hook (exit code 255) with no output。

本文以pre-commit为例说明了一下钩子的用法,实际上其他脚本也很有用,比如说如果你想在提交代码后发一条微博,就可以利用post-commit来解决,大家自己领悟吧。

--------
主要还是对bash不熟,否则post-commit里的代码我也不至于是直接改成svn-update的代码了。
学习学习

碎谈

碎谈

1、NOWDOC

NOWdoc是5.3多出来的功能,还没有仔细看过,先记下来:http://cn2.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

2、导航条固定,这个功能在淘宝上应该算是比较容易看到的。在商品列表中,table的表头就是自动固定在屏幕上方,这让用户非常方便,这里有一些 小技巧,可以看一下:http://www.cnblogs.com/hooray/archive/2011/09/21/2184563.html

3、王一google reader中推荐的:读《黑客与画家》

其中有一些话有点意思:

PHP 能足够流行,主要原因之一是这语言下贱,我想如果所有语言都能测一下开发者的 平均智商的话,应该 PHP 的开发者的平均智商是最低的。但这话绝不是冒犯任何人,想承认他流行就必须承认这是因为连智商 90 的人都敢尝试 给 PHP 写 Framework 才能导致这么流行,这是一个事实,跟任何一个具体的使用者是谁、怎么用无关。我在开始了解其他语言后,才知道这么个 事实:其他几乎所有语言的基础库,都是用同样的语言写就的,唯独 PHP 的基础库都是靠 C 的。去年看到一片文章说 PHP 不是语言,深表同意,我 认为 PHP 的位置实际处于伪代码和程序语言之间,以快和下贱为特色,你可以快速搭建原型,需要人手时可以找一群民工来写,这语言当然就很厉害了。《黑 客与画家》给我最大的一个启示就是,尽管我明白优化乃万恶之源,但实际写代码的时候还是容易拘泥于细节,现在看来最痛恨的事情就是在给一个应用做第一版的 时候,代码还不够伪代码化。你是程序员,你是画家,你要最快的速度让一个程序能跑起来。画一幅受欢迎的画是程序员要做的,把画印刷成无数分卖往全世界是工 程师要做的。真等 facebook 的网站运转起来了,还愁这世界找不到人改进下 memcache 的 pecl 就节省出上万台机器么。

我之前相信语言争论的和事佬说法:语言各有各的精髓,但总的来说是相等的。Paul Graham 用一个简单的例子来驳斥:如果承认 Perl 5 比 Perl 4 强,那就应该承认不同语言之间也存优劣之分(这种手法我以前也用过,当时用自己一年间的差距来证明合作的困难)。其实以前看《软件随想录》里的一篇《你的编程语言能这样做吗?》时就在琢磨这个问题了,看到《黑客与画家》的时候又把这个问题强化重视了。你可以继续用 PHP 去谋生,但不可以不知道在一些语言特性上,PHP 相比 Python 或 Ruby 差的有多么远。

4、值得关注,比如我想买 苹果的时候就可以这样考虑了:5000人推荐!留一手教你在美国亚马逊网购,让国内代购都去吃shi!。这个还是来自11爷google reader中推荐的

----

黑客与画家,有人想买被遗忘,看来有空还是值得看看的。不过我是发现自己的智商会比较低,当然好象还是超过90,不过对于算法, 我还是很纠结,没读过高中和大学,看来还是影响挺大。

Javascript判断横竖屏

Javascript判断横竖屏

最近在做ipad上的网页处理的时候,经常需要切换横竖屏。于是找了一下资料,写了一个简单的判断:

function check(){
var s,screen = (window.innerWidth > window.innerHeight) ? "portrait" :"landscape";
if(s!=screen){
s=screen;
alert(s);
}
}
然后在document.addEventListener("DOMContentLoaded",function(){
//在这里加入
window.addEventListener("orientaionchange",check,false);
//然后就是很重要的一句:
setInterval(check,300);
})

为什么要用setInterval,就是因为每一次切换都要迅速判断,因此不得不用setInterval,否则第一次判断后就不会再处理了。。

备份:Lion 小技巧,掐掉 Dashboard

以下内容来自于小众软件,原文是:http://www.appinn.com/disabled-dashboard-mac/
功能用起来还是比较方便的,之所以禁用了widget,是因为我发现那些小工具我都用不到,留着也没有意义,还浪费我的资源和内存。。。Lion果然是4G内存起步啊。真郁闷。OK上原文 .。。

Mac OS X Lion 的 Dashboard 里面可以放很多的 Widgets,有系统自带的,也可以放置第三方的(效果如图)。子桑二狗发现 Dashboard 的 widget 功能没 Win7 直观(win7 的 widget 是放置在桌面上的,Lion 的必须切换到 Dashboard 界面,子桑二狗是 Mac 菜鸟,不知道还有放到桌面的技巧。据小众读者 songjave 留言:把 Dashboard 解锁开发模式就把 Widgets 可以扔到桌面上了。),而且 Dashboard 的天气预报非常坑爹,部分地区没有天气预报的信息,比如潮州市。

基本上,对子桑二狗来说,Dashboard 只是占内存的丑陋花瓶而已,既然不用,何不掐掉它。打开终端,输入下面的命令:

defaults write com.apple.dashboard mcx-disabled -boolean YES

然后再重启一下 Dock,在终端输入

killall Dock

如果以后后悔了,想重新启用 Dashboard,就用下面的命令:

defaults write com.apple.dashboard mcx-disabled -boolean NO
killall Dock

-----EOF---
在secureCRT下面处理了一下,立刻仿佛速度好象快了好多,难道是我的心里作用??

我也谈谈小米手机

我也谈谈小米手机

其实本来也不想多谈小米手机,但是这是最近的热点话题。事实上,真要谈一个月前就应该谈了
一个多月前,阿里推出了他的云手机,然后没过多久,小米也出手机了。这年头,当电商不做电商的事,当XX不做XX该做的事,就什么都乱了。
雷军对小米很高看,事实上小米的新闻一年前就有了,可是却没有过多的声音,但是在推出小米手机不久后,鸡王就开始发标了。说是雷军怎么怎么了,也说了米聊会读取用户的通讯录。
于是乎,网上很多声音就多了,煤油们也发标,雷军的水军们也开始发标了。然后就一直闹啊闹的。说实话,雷军的这种饥饿营销并没有什么特别之处,只是手机的价格相对较低,也就吸引了更多的人。1999的价格确实很吸引人,要知道HTC同样配置的手机几乎都在2500~3000左右。
于是乎,这让我们知道了一件事情,为什么水货手机便宜,手机上的利润真高啊。1999如果没利润,打死我也不信。1688的价格都有利润了,何况这1999?
阿里的手机是把自有的产品集成到了手机中,而小米呢?想做国内的HTC?魅族走在前面很累,为什么还有人前赴后继?固然是大家都知道移动这一块的利润还是有搞头的。更多的是想做类似的平台。
说实话,我现在越来越看不惯那些所谓的平台了,现在只要是自己做美化的ROM的人,都有一个所谓的电子商店,TMD,受得了这些人不?
不要把用户当成傻瓜,或许,真正让用户体会到价值所在才是真的,否则,买完你的手机到最后装个所谓的原生系统,对谁的影响更大呢?


纯属娱乐

PS:昨天晚上刚发完就发现今天早上cnbeta也有一篇详细说的文章,居然其中有一句:

小米手机采用的MIUI系统在正常使用情况下会偶尔出现崩溃、死机等现象,但并不是很严重。尤其是考虑到小米所面向的“发烧友”用户,对于Android出现的类似现象已司空见惯,容易接受。
如果真是这样。那小米也太能对待用户了,纯粹把用户当成小白鼠了。

小朋友最近的照片

有一部分是上次逛南京路的照片,也有一部分是之前的。主要是我觉得好玩,其中有一张抓拍的,我觉得超有劲就传上来了。。。
04679b54059917c5a248ebff2052bdad
1a7ec33ef04ad6477f0ee26411529fdd
b76af5d49cdc3a5d00339779493af463
68c47d432a2f2efd0e0ba26e4886078c
【这张最有意思。。。HOHO】
d9545388592807ba6eb87e5d5fc728a3
9d11ba005bf15616b15ba8857b9ec90b

笔记:IOS发送图片的时候,还是用的$_FILES

笔记:IOS发送图片的时候,还是用的$_FILES

纯笔记:
在与IOS交互的时候,采用了POST发送数据,同事说需要发送一张图片,于是我直接用$_POST进行获取,发现该字段无值。打印整个$_POST的时候,连这个key都没有找到
于是我在想,php://input有没有值呢?试了一下也没有,其实想想也是,如果真是用Base64处理后的发给我。我也应该是可以通过 $_POST收到的。
不过,还没有尝试这种:

preg_match('/attachment;\s+name="(.+?)";\s+filename="(.+?)"/i', $_SERVER['HTTP_CONTENT_DISPOSITION'], $info)

这种是HTML5上传了,不过我没有试过。。。
我看了一下同事以前的代码,发现是用$_FILES的,于是很方便的套了几行代码就一切都OK了。。
看来,脑子还是不能乱。

CoffeeScript

在博客园看到有人在介绍CoffeeScript,以前仿佛看过类似的东西。所以去官方看了一下,结果发现现在的代码是不是都在追求所谓的语义化?
比如你看这一段 :

mood = greatlyImproved if singing  if happy and knowsIt   clapsHands()   chaChaCha() else   showIt()  date = if friday then sue else jill  options or= defaults 
然后所谓生成后的代码就成了这样:
var date, mood; if (singing) mood = greatlyImproved; if (happy && knowsIt) { clapsHands(); chaChaCha(); } else { showIt(); } date = friday ? sue : jill; options || (options = defaults);
看到上面的这段生成后的代码,再对比一下原来的写法,是不是觉得很有意思?
再来一段长的:
grade = (student) -> if student.excellentWork "A+" else if student.okayStuff if student.triedHard then "B" else "B-" else "C" eldest = if 24 > 21 then "Liz" else "Ike"
输出之后就是:
var eldest, grade; grade = function(student) { if (student.excellentWork) { return "A+"; } else if (student.okayStuff) { if (student.triedHard) { return "B"; } else { return "B-"; } } else { return "C"; } }; eldest = 24 > 21 ? "Liz" : "Ike";
越来越发现,原来写伪代码也可以转换成代码。而且看上去也不错,有点象zen coding了。现在很多IDE都支持zen coding
不知道这次这个coffeescript什么时候会被支持
官网:http://jashkenas.github.com/coffee-script/
但是对于用户来说,有一点压力,因为它还是会有一些学习成本。
 
QQ互联登录应用开发逻辑思路

QQ互联登录应用开发逻辑思路

摘抄这篇文章不是说它的思路有多好,事实上,我们在用微博登录后,如果用getUserInfo方法获取个人信息的时候,里面已经包含了openId的信息了。所以,如果支持微博登录的话,有些信息也可以利用了。。

原文来自:http://lab.wehefei.com/posts/394

当qq登陆成功后,QQ会给我们返回一个唯一的用户标识,也就是openId。

cef6c98bef0e5686e794b6a229199cbc

这个openId是绝对唯一确定用户的标识,你可以把它理解成QQ号。当取得openId的时候,你就需要修改原网站的user表 或 重新建立一个新表,这样做的目的是为了把openId和网站原用户进行绑定。

当qq用户登陆的时候,就需要通过openId去user表查询,如果有查询到,那么就直接修改session登陆成功;

如果没有查询到,就证明是第一次登陆,需要跳转到绑定页面,让用户绑定一个用户名(也就是说创建一个新用户),然后在修改session登陆成功。

例:
1.首先修改用户表(user)增加一个openId字段 或者重新建立一个新表

2.前面说不是用户登录后能得到openId吗?

openId是绝对唯一确定用户的标识 ,所以我们就根据这个(openId)判断

第一步:查询用户表里是否有 openId == 用户登录的openId
if(qq登陆用户openId如果用户表里查出来有的话){
根据openId取得用户信息 跳转到登陆后的用户。
}else if(qq登陆用户openId如果在户表里有没有的话) {
跳转到绑定页面,也就是创建一个新的用户(具体可以参照我的网站:http://ppptuan.com)
//创建的过程中你还可以加判断的
if(如果注册用已经有帐号了){
直接绑定 跳转到登陆后的页面。
}else if(没有帐号){
跳转到注册页面 然后绑定 跳转到登陆后的页面
}
}

思路大概就是这个样子。

当然第二种方法:

可以直接在我们member表添加一个openId的字段就OK了

----------
其实我想表达的是这里面的伪代码想法不错,在开发中,有时候就需要写这样的伪代码来先整理自己的思路。所以其实这篇文章想推荐给我的团队其他同事,在开发前一定要先把思路理清。不想写流程图就写伪代码吧。

iPhone App自动化测试

虽然不懂,但先备份着。
这段时间在学习object-c开发,但是我对很多资料都不熟,不过看到有测试类的文章还是先备份下来再说了。
原文来自:http://qa.taobao.com/?p=13737
无线客户端的发展很快,特别针对是android和ios两款无线操作系统的客户端应用,相应的测试工具也应运而生,这里主要给大家介绍一些针对iPhone App的自动化测试工具。

首先,我们把这些测试框架分为三大类:接口测试工具、注入式UI测试工具、录放式UI测试工具。

一、接口测试工具,主要在iphone SDK提供的单元测试框架的基础上,完成代码的接口功能测试。

这类工具用的比较多的是SDK本身提供的test unit,以及google的google-toolbox-for-mac工具。google的GTM工具是在test unit上做了一层封装,可以简单、快速的完成测试脚本编写,提供完善的测试日志和报告,并提供部分简单的UI测试功能。

详细的文档可以参考这里:http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting

二、注入式UI测试工具,可以完成对被测应用的UI功能测试,需要在源代码中加入一些必须的测试代码。优点是可以模拟用户的操作,测试被测应用的相关功 能,可以覆盖比较全的应用功能。缺点是因为在源代码中插入了必须的测试代码,而这些应用发布时需要去除,引入了被测应用和发布应用不一致的风险。

UISpec,提供了用例运行前的准备和运行的恢复功能,UIQuery功能,以及较为完善的校验功能,但该工具的使用比较复杂,脚本的编写也很繁琐,虽然对UI可以query,但无法方便、清晰、直观的查看应用控件的属性。

详细的文档可以参考这里:http://code.google.com/p/uispec/wiki/Documentation

Bromine,脚本编写简单,对控件的操作,完全模拟touch事件实现,但控件的定位通过对控件重画,并插入定位需要的信息,xpath的描述串也稍显复杂,校验功能相对较弱。

详细的文档可以参考这里:http://code.google.com/p/bromine/

三、录放式UI测试工具,主要通过录制用户的操作行为,通过回放来完成对被测应用的功能测试,这类工具对UI的功能测试相对是比较弱的。

比较常用的有Instrument、FoneMonke 。

Instrument,是iOS提供的主要用于分析应用的性能和用户行为的工具,利用它可以完成对被测应用的简单的UI测试。

FoneMonke,是国外提供的一个开源的,免费的录制/回放工具。网站:http://www.gorillalogic.com/fonemonkey

以上是了解的一些针对iPhone App的自动化测试工具,大家感兴趣的可以了解了解,欢迎交流、学习!

-----------
仅作备份。不过感觉好象针对代码测试的工具还是一般般。但还是可以推荐给我们的QA进行阅读了。