-
最新文章
最新评论
- 胡阳 发布于《python网络爬虫备忘记》
- ddatsh 发布于《开始实践git-flow》
- acents 发布于《像CSS选择器一样用BeautifulSoup》
- yobune.com 发布于《解一道SQL问题:找出成绩优秀的学生》
- tatude.com 发布于《用Redis实现分布式锁》
分类
标签
友情链接
我的链接
功能
存档页
- 2012年01月
- 2011年08月
- 2011年07月
- 2011年05月
- 2011年04月
- 2011年03月
- 2011年02月
- 2011年01月
- 2010年12月
- 2010年11月
- 2010年10月
- 2010年09月
- 2010年08月
- 2010年07月
- 2010年05月
- 2010年04月
- 2010年02月
- 2010年01月
- 2009年11月
- 2009年10月
- 2009年09月
- 2009年08月
- 2009年07月
- 2009年06月
- 2009年05月
- 2009年04月
- 2009年03月
- 2009年02月
- 2009年01月
- 2008年11月
- 2008年10月
- 2008年09月
- 2008年08月
- 2008年07月
- 2008年06月
- 2008年05月
- 2008年04月
- 2008年03月
- 2008年02月
- 2008年01月
- 2007年12月
- 2007年11月
- 2007年10月
- 2007年09月
- 2007年08月
- 2007年07月
- 2007年06月
- 2007年05月
- 2007年04月
- 2007年03月
- 2007年02月
- 2007年01月
- 2006年12月
- 2006年11月
- 2006年10月
- 2006年06月
- 2006年05月
- 2006年04月
- 2006年03月
- 2006年02月
- 2005年12月
- 2005年11月
- 2005年05月
- 2005年04月
- 2005年03月
- 2005年02月
- 2005年01月
按分类归档:技术
如何避免误删除代码带来的灾难
下午,一位同事急匆匆找我,说他在操作TotoriseGit时不小心点击了删除菜单,导致本地的项目整个被删,问我有没办法恢复。我看了看他的提交历史,最后一次提交居然是在几天前,基本上可以认为,这几天做的修改可能都要打水漂了。因为Git对代码版本控制的最小粒度是Commit,即一次提交。这几天下来积累的未提交代码没有被Git管理起来,一旦删除,将无法通过Git的手段来恢复。 发生这种灾难性的结果,不能只怪TotoriseGit没有做好删除确认这一步,更应该检讨自己没有养成良好的提交习惯。 关于良好的提交习惯,我在之前的文章中已有说明,其中一点就是控制好提交粒度,也就是提交的原子性,在此,我需要再补充一点,就是尽量使用小粒度的提交,用频繁的小粒度提交来代替较少的大粒度提交,即一天可以提交3次的话不可等三天再提交1次,因为累积的未提交代码越多越容易出问题: 误删除的灾难,正如这一次我同事遇到的意外一样,累积的未提交代码无法恢复,损失惨重。 提交粒度太大不方便回滚,一次提交里如果包含了登录、首页、甚至是用户管理等功能点,临时发现首页的修改有误,要恢复到上个版本时无法实现快速回滚,因为一回滚,登录和用户管理功能也随即回到了从前。 按理说啊,程序员同学们应该享受提交代码的乐趣才对,该提交时就提交,别太腼腆了啊! 所幸的是,该同事几天来做的修改大都是新增代码文件,没有加入版本管理,TotoriseGit删除文件的时候没有把这些文件一起删除,解决办法就是checkout一次HEAD的版本再把新文件加进去,补充少量丢失的修改,也算是不幸中的大幸吧。但建议不要因此而抱侥幸心理,以后继续累积几天下来再提交一次代码。这次的教训值得深省了!呵。 另,为防止同类事故继续发生,我另一位同事给出了不在TotoriseGit菜单里显示删除功能的设置方法: 使用windows git的GUI的同志请注意,由于delete命令没有确认窗口,为了防止手震点到导致误删除,请空白处右键菜单进入setting,选set Extend Menu Item,勾选上delete和delete(keep local)。就可以屏蔽菜单里的删除(需要用到这两项的时候按住shift然后点右键就可以看到他们出来了)。
iSign+iPicWall=技术沙龙的小玩具
上个月筹备技术沙龙2月份的iOS专场,突发其想,既然是iOS专场,那手上这些iOS设备应该最大化的利用起来,于家有了这样一个想法:在iPad上开发一个签名应用,让到场的每个人用手指在上面画上自己的名字,然后马上同步到连接着投影仪的电脑上,电脑就把刚收到的签名显示出来,让全场的人都看到。 我花了一点业余时间完成了签名应用的第一个版本,项目名叫iSign,然后让网易的双木小神童同学给快速做了个Web展现界面,项目名叫iPicWall。我们当天在沙龙即将开始的前几分钟完成了预演。接下来就开始使用iPad签到了: 签名后,按一下同步按钮,马上在投影上出现自己的签名了。 有意思吧?反正我和双木都觉得非常好玩。以后我们还会继续把这个小玩意完善。 其实沙龙就是这样才好玩。
给Scala新手的猫纸
猫纸,即广东话说的CheatSheet。 这份Scala猫纸其实是一份示例代码再加上一些说明组成的。该示例代码是从我在上一次珠三角技术沙龙使用的版本精简过来的,代码行数缩减到了100行以内,里面已经包含了Scala大部份常见的语法以及特性,仅供新手参考,高手请无视。其他更高级的特性由于时间和篇幅的原因没有包含在里面,如类型的隐形转换、并发编程的更高级使用方式、“:”的乾坤大挪移神功等等。这些容我在以后的关于Scala DSL或分布式并发编程的文章中再进一步说明吧。 这里也顺便讲一讲这段代码的歌词大意吧,注意了,第56行开始才是主程序的入口: 从前有个叫techparty的用户组(Group)在举办活动,有一些技术爱好者(Member)参与了活动,活动开始时大家先自我介绍,然后带来Topic的成员开始宣讲,活动完毕以后大家一起去了聚餐,最后各自返家。会后有很多人来询问关于techparty的一些事情,组织者忙不过来就分发给几个组委来同时回答这些问题(并发编程原型),没想到,问题的答案竟全是一样的:名字叫Jeff的人实在太多了。 好了,不妨碍大家用纸。点击有大图!
《learn scala in half an hour》讲稿及录音
本月23号我参加了珠三角技术沙龙2011年1月广州小沙龙,并在会上给大家做了一个关于Scala的分享,形式是通过一个设计好的剧本(以沙龙聚会为背景),现场编码至完成该剧本为止,在编码的过程中逐步引入Scala的各种特性。这里先送上讲稿及现场录音还有演示代码,稍晚我将整理一份文字版的《learn scala in half an hour》。 Scala jeff View more presentations from jeff kit. 现场录音在这里。 示例代码在这里。 如果有兴趣与我探讨Scala,欢迎与我联系或给我留言 :)
Git的推广心得
这两周已经开始在公司几个项目/产品里推广Git了,有一些心得,在此分享: 工具神马的都是浮云 实际上,工具神马的都是浮云! Git或HG之类的DVCS就是神器吗?不,充其量也只是另一个VCS或SCM,所谓的分布式、轻量级分支神马的在某些人看来或许是扯蛋的玩意,人家可能用SVN用得不知有多爽多出神入化呢。如果你仅仅是因为要推广一种新工具而去推广Git,那你一定会饱吃闭门羮。不信试试。 真正重要的,是驾驭在工具上面的灵魂(思想),有些人虽然用着Git,但只把Git当作备份工具用;有些人尽管还用着古老的抢占式的VSS,但提交的守则却是规规范范,标签打得清晰条理!前者不管用什么版本管理工具,都是YAST(Yet Another Scm Toolkit),而后者不管用什么管理工具,都能把代码版本管理得齐齐整整。 记住一点:不要把版本管理工具当作代码备份工具用!否则,你需要的只是dropbox。 既然工具是浮云,那我为什么还选择Git?嘿,当你的团队开始有了强有力的版本管理意识支持后,就会下意识地选择方便趁手的工具(好吧,我这里不说强大),Git实际就是这么一种工具,适合各种各样有洁癖的人、提交狂人等。 规范地使用SCM才是正经事 如果你的团队习惯把SCM当备份工具用,那么恭喜你,你有足够好的切入点推广Git了。如何判断一个团队是否把SCM当作备份工具了,有大概以下几个可供参考的现象: 一古脑儿的提交文件,有时1个文件,有时十几个文件,N个功能点一齐提交 备注的特征:“略”,“提交一些代码”,“fix一个Bug”,“今天的代码”等 从来不给代码打上版本号,程序从头到尾只有唯一一个版本,就是Now 遇见冲突就慌张,不懂处理 等等 我推广Git,目的不是为了Show up,说我懂得一个很潮的东西,你们也跟着用吧,而是要彻底改变团队把SCM当备份工具用的习惯,是为产品代码质量负责。 代码版本管理,最终目的是要实现代码版本的可控性,包括大至版本级的重取,包括功能级别的增减,甚至是小至commit级别的回滚。我用以达到这种可控性的是一些规范,而非Git本身(当然Git及它的扩展Git flow立功不小)。 我制定的规范大致有两个: 双分支代码结构 严格的代码提交规范 并有一个推荐的(非强制的)最佳实践: 使用git-flow轻松控制提交粒度 双分支代码结构 双分支指项目推进过程中总是保持使用两个主分支:开发分支(develop)、成品分支(master)。 1)开发分支(develop) 日常的开发工作都是围绕该分支进行。开发分支上的代码只有在封版的时候才会被合并到master分支。 本地的develop分支,开发人员在上面开发功能并提交,当完成一个完整的功能开发并通过测试时,才能把代码push到远程的develop分支。 远程的develop分支上的代码,要求在任何时候总是可以通过编译,所以每次队员把代码push到服务器上之前,需要确保自己的代码已通过编译并测试。远程的develop分支的代码会用于项目的自动构建。 2)成品分支(master) 该分支上面的代码总是稳定的,成品级的。只有在每次发布新版本的时候,才会从develop上面把上版本开始到现版本的修改移到master分支,master分支通过标签(tag)来区分不同的代码版本。产品的实施人员所面对的总是该分支。 代码提交规范 代码提交规范有三大点,必须严格遵守: 控制好提交粒度。每次的提交都必需具有独立性的原子性,建议是以一个功能点或Bug fix为单位;无直接关联的文件不能在同一次提交;除了初次提交,尽量不用commit -a。 认真对待提交备注,多花一分钟回想本次提交的代码所含的意义,清晰描述下来,很有可能以后看备注的人是你。 … 继续阅读
AutoForms介绍–我在12月小沙龙的讲稿
提前剧透了。明天的技术小沙龙我主讲的是自己的一个开源小工具,AutoForms,一个Django自定义表单引擎,受公司某项目启发,自己在业余时间重新实现一套更好的。 下面直接去片: Autoforms View more presentations from jeffkit. 我承认,PPT里面的安装方式还没支持,最早明天上午把它实现一下。 另外,PPT里出现的made in china要翻译成“山寨版”。 有兴趣的,不妨明天寻觅咖啡见。
你为神马不用git-flow呢?
这是一篇译文(原文在此),当时我从这篇文章开始初识git-flow,经过一段时间的实践后,觉得git-flow非常棒,我决定在团队里面推行,我需要写一篇使用的教程,重新读这篇文章的时候,我认为,我只需要把它翻译成中文版,就是给队员们很好的教程了。遂。。拙译如下,个别地方可能不太靠原文,请看官明了: ================================ 今年的一月, @nvie 同学发表了博客 “一种有效的Git分支模型”, 文章讲解了他是如何让自己的Git仓库保持整洁,除此之外,他发布了git-flow; 一个可以轻松实现该模型的Git扩展。 有同学说从来没有听说过?对此,哥表示相当震精,所以,在这篇文章里我要告诉你,为什么它可以让你从早上傻笑到晚上。 安装完git-flow后,你可以在当前目录下创建一个全新的仓库或把一个现有的仓库转换成新的分支结构: $ git flow init 它会问你一系列的问题,蛋定!尽量使用它的默认值就好了: No branches exist yet. Base branches must be created now. Branch name for production releases: [master] Branch name for “next release” development: [develop] How to name your … 继续阅读
珠三角技术沙龙12月小沙龙预告
原文见:http://techparty.org/2010/12/10/opensource/ 曾经因为所写的某段代码的画龙点睛之妙而欣喜若狂? 多年的历练让你积累了无数的压箱宝而对其呵护备至? 是否,在每次擦拭它们之时总觉得有一股隐隐的冲动? 那么,来开源吧!让它们在其他人的指掌间重放光彩。 开源,固然是个大话题,但实践开源,并不困难:你不必有Plone这种史诗般的作品,不一定要写出rails这样的传世经典;为某开源项目commit一个很小的patch,自个分享一小段心水的代码,向朋友传播开源软件的使用心得时我们已经在实践开源了。 12月小沙龙,独乐乐不如众乐乐,这是一个让你实践开源的舞台。现在向大家征集Topic(总时间30分钟以内为宜)了,topic可以是介绍自己的开源作品(原创),也可以介绍自己喜欢的开源软件(推介)。 小沙龙将在12月19日(周日)下午举行,地点待定(红专厂或寻觅咖啡),接受报名人数为30名左右,由于本次沙龙场地稍大,不要求与会者必携带Topic,但还是强烈建议大家积极准备Topic,现场如果Topic数量多,将通过投票的方式对Topic进行取舍。 现有Topic: 赖勇浩 《python-message:面向消息编程的程序库》 (原创) Jeff 《autoforms:django的自定义表单组件》(原创) 更多的topic见报名表。现在还接受报名,有兴趣移步到这里。 让你们的Topic像洪水般涌向12月小沙龙吧。
又是Mysql和Mac os x
Mac os x和Mysql总是有些。。。。。。哎,你们知道的。今天又学到两个小技巧了。 一、安装ruby的mysql驱动 使用介个命令: $sudo env ARCHFLAGS=”-arch x86_64″ gem install mysql –no-ri –no-rdoc — –with-mysql-config=/opt/local/lib/mysql5/bin/mysql_conf 指定ARCHFLAGS很重要,视乎你的系统的架构. 不要生成ri,rdoc,否则一大批错误信息输出。 指定mysql-config 二、同时使用标准与非标准.sock文件 有时尽管在安装的时候指定了mysql-conf,同时mysql-conf的文件里也把socket file指向了非标准的.sock文件路径(如/tmp/mysqld.sock),但有些程序就老是死牛一边颈地要找标准的.sock文件(如/opt/local/var/run/mysql5/mysqld.sock)。于是我满世界的网页找解决方案。最终,某位老兄一语惊醒梦中人:“为嘛不建个软链捏?”(这是中译文),哦! ln -s /tmp/mysqld.sock /opt/local/var/run/mysql5/mysqld.sock 这样世界就清净了。我还真傻。
开始实践git-flow
关于Git-flow,在前几次的珠三角技术小沙龙的现场就听过朋友们介绍了,最近才有时间看看相关的文章: 《a-successful-git-branching-model》及《why-arent-you-using-git-flow》,才真正了解到,这真算得上是使用Git的最佳实践啊。于是马上想在自己的项目里用上。 安装Git-flow: 安装完后,试一下git flow命令,得到帮助: 升级已有Git Repo 使用git flow init即可,但结果是杯具的出错了。 原来是我的源码还没commit(unstaged),我先git commit -a ,把原来的改动提交掉。再git flow init,这一次成功了,git flow 帮我创建了两个主要分支,Master与Develop,以及询问我四个辅助分支的命名: 开始使用git flow 现在我要开始工作,为某个功能编写单元测试代码,那么,我只需要告诉git flow我要开始一个新功能的开发,输入git flow feature start sampler_test: git flow 会为我创建一个feature/sampler_test的分支并切换到该分支下,这时用git branch命令查看一下分支的情况: 有三个分支,当前工作分支是feature/sampler_test,我接下来所写的代码都只会影响该分支,直到我确认完成该功能(通过git flow feature finish sampler_test命令),完成后,代码会被合并到Develope主分支上面。 阶段性小结 git flow屏蔽了git的底层命令,向用户提供更高一级的命令用于完成源码的版本管理,流程模型看上去很好很强大,理论上也比较适合团队协作,因为比较规范和简单。我先自己尝试一番,体验过后再说是啥味道吧!