-->
A Coder In China
打造安全gem生态圈,从我做起!今天你signed了吗?

快速直通车:

http://developer.zendesk.com/blog/2013/02/03/signing-gems/

实战指南:

http://blog.meldium.com/home/2013/3/3/signed-rubygems-part

讲讲我的理解:

当我看完这个slide: Hacking with gems (https://speakerdeck.com/benjaminleesmith/hacking-with-gems-ruby-conf-australia) ,我意识到现在的gem太不安全了。理论上任何人都是可以发布gem包到rubygems平台。这里没有签名的后果是,如果第三方把你的gem下载来,解压后打入漏洞文件就可以让任何人的电脑安上后门。那怎么办?

我们知道rubygems是社区驱动的,如果强制让大家安装签名,不是不可以,只是这样行不通,因为并不是每个人都理解和支持你。这里是开源社区,需要的是一种可以选择的安全模型,让任何人可以表达安全问题的关注,但大家谁也强制不了谁。

首先,gem 提供了一个”-P”参数来支持HighSecurity. bundler也提供了一个”—trust-policy“支持HighSecurity。这样在工具链上提供了安全机制的功能选项。

然后,大家可以通过gem生成自签名的证书。这个证书是关键,私钥由个人保管,公钥提供给rubygem发布使用。大家看出问题的关键了吗?安全信任关系完全还是归于个人。rubygem并没有增加增加更多的安全防范,还是提供和原来一样的gem repo功能。目前这种安全模型还需要时间来验证,不管你信不信,我是做了。发布lazy_high_charts 1.4.1,支持签名gem.

https://rubygems.org/gems/lazy_high_charts

Google reader have gone, Setting Up Your Free Private Feed Reader

自rubyconf china 2012之行后,我全心扑在一个nodejs/realtime web的项目,没怎么关心技术八卦,同事聊到google reader不能用了。这让我一惊,因为我现在有个习惯是,每周看一下rss reader的技术八卦。所以眼下我需要搞一个自己的Rss reader。网上搜索一番,发现一篇教程很管用,Setting Up Your Free Private Feed Reader . 内容很实用,但时过境迁,OpenShift API早就变的更好用了,所以,我汤了一遍坑,给大家杀出一条康庄大道::-)

准备工作:

首先,我们的思路是,使用OpenShift的免费空间,配合Tiny-Tiny-Rss直接部署一个在线版的Rss Reader,经试用,支持中文挺好的。

配置步骤如下:

rails-dev-box, rails developer最好的开发环境

rails社区开发目前使用的这个pupet环境,应该是理想的开发环境。这里推荐给大家:rails-dev-box

我的环境是Fedora,kernel经常会更新,导致virtualbox需要重新在guest上build驱动,不然会提示警告:

$ vagrant up [default] Importing base box ‘ubuntu-12.04-64bit’… [default] The guest additions on this VM do not match the install version of VirtualBox! This may cause things such as forwarded ports, shared folders, and more to not work properly. If any of those things fail on this machine, please update the guest additions and repackage the box.

今天看了一个这个技巧:Vagrant Tip: Sync VirtualBox Guest Additions

使用了vagrant的plugin: vagrant-vbguest 我试用了,平滑升级,it works like charm!

jasmine不支持beforeAll and afterAll,What happen

Case: 用例测试mongoose的Model。想要全局连接mongo。发现没有全局的function: beforeAll 和 afterAll。问题看这里:https://github.com/pivotal/jasmine/pull/56 。 通过这个Case,你应该就会体会到社区驱动的好处,能比较出不同的观点。这个jasmine是为rails项目中的javascript测试写的测试框架,无法满足NodeJS开发的发展步骤。用TJ开发的Mocha应该是更好,更纯净的选择。我不想误导大家,我的观点是:使用开源项目,有很多时候你可以自己选择。 测试NodeJS代码,使用jasmine-node-task,然后用grunt插件grunt-jasmine-node做的集成。 grunt.js

grunt.loadNpmTasks('grunt-jasmine-node');

    jasmine_node: {
      projectRoot: "./spec/node",  //这里是指测试文件放的地方。变量名起的太stupid!
      requirejs: false,
      forceExit: true,
      jUnit: {
        report: false,
        savePath : "./build/reports/jasmine/",
        useDotNotation: true,
        consolidate: true
      }
    }

既然只能用beforeEach和afterEach,我就这么使用,it’s works for me.

 
beforeEach(function(){
  process.nextTick( function () {
    mongoose.connect('mongodb://localhost/cantas_test');
  });
});

afterEach(function(){
  process.nextTick( function () {
    mongoose.connection.db.executeDbCommand({
      dropDatabase: 1
    },function(result) {
      console.log(err);
      process.exit(0);
    });
    mongoose.disconnect();
  });
});
新纪元,做一个持续进步的WebApp开发者

ruby icon

Update

  • Dec 24,2012 改进文字

没有银弹

No Silver Bullet,这个道理大家都懂。但社区里每天还是可以看到有初学者发帖子,讨论类如纠结RailsDjangoVimEmacs那个更好等等的问题。开始我也觉得国内技术落后,你看国外的初学者就不会提这个问题。但当我真的去开源社区里参与开发后发现,天下初学者都是一样的,一堆一堆的纠结帖子,问题也非常的不专业,我是懒得回这样的帖子。这说明目前咱们初学者的环境和国外初学者的环境并不会差到哪里去。但有一个细节让我很意外,那就是他们学的很快,他们纠结的时间阶段很短,为什么呢?那是因为初学者如果真的明白学的内容后,他们就不会提这样那样很“白痴”的问题了。那我们再反观国内的开发社区,大量的初学者跪求,抱歉,原谅的话一大堆,挺诚恳的。但解决的问题都是一个点,一个极端的点子问题。但他们得到“大虾”的反馈后得到快速解决后就不再更近一步学习了,总是拿着经验当挡箭牌, 止步不前。这样能自我提高吗?所以,做一个好学的开发者,不是没有代价的,你需要平静心灵,不贪图虚名,多看书,多实践。

保持简约(Keep it Simple)

学习Ruby最喜欢的是它的DSL语法,这种接近英语的语法让我写代码时一点压力没有。其实我们程序员才是设计软件的核心,语言只是工具,我喜欢自己来控制语言,而不是语言来控制我。现在Ruby已经不是那么简单的语言了,我希望自己能更进一步,在13年能参与进Ruby开发社区,关注自己感兴趣的VM模块。不知道大家在学习Ruby的过程中有没有注意到,通过Ruby,我们知道了Rails,GitHub,MacOS,ObjectC,JavaScript等等。这就好像一根连线,把我之前并不敢兴趣的知识都串起来了,多么棒啊!我清晰记得在学习JAVA AOP概念时,百思不得其解的痛苦。当时确实觉得无法理解它。但回过头来,遇到Ruby里几行代码就可以告诉我什么样的代码叫AOP,在此基础之上反过来理解JAVA的AOP就变得容易理解多了。这里我不是说JAVA多么不好,我是发现一个道理,多学一门自己容易理解的语言,在此基础上再回顾没有学好的语言,是有可能更好的克服学不好C,C++,JAVA之类的编程语言的。事实上每一门语言都有它独到之处,我们是不可能拿着一门语言去解决所有开发领域问题的。只有通过理解并善用每种语言的优秀特性,并让我们程序员来控制这些编程语言才是好方法。这里我们不必纠结一时学的没别人好,学的不够深入,用自己真正理解的语言去开发程序就可以了,比如Ruby。只有理解的语言,才能让我们学的很快

拥抱开源

前几天在网上虚心听完@tinyfool盗版启示录。感慨地说,我用过盗版软件,实际上我觉得挺好用的(注:因为感觉不用花钱了。实际上钱还是花在更新换代硬件上。),但一路走下来,我并没有得到快乐(注:软件更新总是跟着别人屁股后面走,比如win98->win2000->win7->win8,到底是不是自己需要的也不清楚)。我希望能从自己做起改变这一切,开发环境切换到Fedora两年多,我想既然不愿意支付一个软件的费用,那就使用免费软件吧,没人强迫我付费。开源软件已经足够强大,在没有特别的需求下已经足够使用。如果是我需要的工具,我会知道它的价值,我自然会去买。就是这个道理。让自己变的简单一点,让大家都能受惠互利。开源软件的代码都是开放的这个大家都是知道的,有多少开发者在参与呢?重造轮子在国内大厂已经泛滥,这是国内开发者技术资源的浪费,我们真没有必要去做这些没有必要的浪费,Fork它,改进它,pull request它就OK了。你注意到这个流程一直在Ruby社区里发生。太有意思了,如果你还对开源社区没有感觉,那就参与到Ruby社区感受一下吧。

And more?

Follow @xds2000 on Twitter for the latest news.

RubyConf China 2012参会印象

Update Nov 23,2012

1.FAQ change to QA 

2. slides show off

RubyConfChina 2012 问卷调查数据汇总

http://ruby-china.org/topics/7015

Another topics:

https://speakerdeck.com/flyerhzm/jruby-at-openfeint

RubyConf China 版:https://speakerdeck.com/fredwu/2012-become-a-better-developer-you-can (101页)
完整版:https://speakerdeck.com/fredwu/2012-uncut-become-a-better-developer-you-can (178页)

http://quake.github.com/slides/rubyconfchina-2012/

https://speakerdeck.com/mechiland/beyond-rails-server

以下为正文:

我是@xds2000,ruby developer,我参加了今年的rubyconf china 2012在上海举办的社区大会,两天,并且在周末。我从北京过去,反而觉得机会不错,如果搞到周五那一定去不成。不管是不是有意这样设计,我还是感谢吕国宁,李华顺,还有甘愿默默奉献的志愿者。这样的大会,有社区来驱动并举办,绝对困难重重。如果打分5分制,我就打5分。我确实融入到里面了,我很开心。

下面完全是个人技术偏好的见解,希望给你一点料

第一天,我是冲着@yukihiro_matz去的。ruby 2.0特性没啥特别的,早就有网络介绍。但收获点在于介绍了作为语言的设计者,一些心得体会。coding for fun,如果喜欢,那就来当ruby guy吧。另外,提到了mruby, embeded ruby.最近应该是Matz主推的项目。不管你敢不敢兴趣,你应该知道,除了ruby on rails做网站之外,我们还可以在嵌入式这一块走出天地。最后QA,没啥出彩的问题,新手有多,我就不表了。因为重点话题都在第二天。对了,到场人数应该在500+

Koz 的暖场 Slide: https://speakerdeck.com/lgn21st/koz-ting-wo-men-de
Matz 的 Slide: https://speakerdeck.com/lgn21st/matz-be-a-language-designer

第二天,我提早过来,巧遇@poshboytl介绍,由于家中有事,@yedingding的topic可能要提前到第一个出场。@yedingding讲的是realtime web,如果你在现场,你要知道他讲的很有节奏,每个slide的留白都恰到好处。但如果你是新手,估计就只能听着概念过瘾了。但在我看来,核心亮点有两处,一处大胆提出Web 3.0就是realtime web。另一处就是四个realtime技术的拆解,分析思路。其他方面的细节由于时间有限,没有太多出彩之处。由于@yedingding家中有事,没法做QA,幸运的是讲师@yedingding承诺一定做个cast视频在讲一遍。可以期待。

“Real Time Web” slide:
http://www.slideshare.net/sishen/real-time-web-15229483

第二场是vmware开发经理David Tian以本公司的文件共享系统(类似dropbox)的设计开发实践。讲师很幽默,经验很丰富。系统市值几千万美元,可以说明ruby在企业级应用中也可以发挥很大的作用。很多新手在开始总是质疑企业会用这个ruby来开发吗?好吧,vmware的Mozy Web应用程序总可以说明一种可能,Have a try,why not?!讲师只有3年的ruby开发经验,就已经可以开发大型ruby项目了,新手可以放心学ruby啦,收益超值啊!

第三场是东南亚知名的,全栈式ruby开发者@xdite(发音“叉代”)讲的最佳实践如何变成最“慢”实践。其实我是看这她的“博客”成长的,:-),内容靠谱,你就只管记录吧。另外我需要提醒大家的是,就目前中文入门资料,只有@xdite的Rails 101一家是原创的。想入门快一点,那就买一本读一读。

https://speakerdeck.com/xdite/rubychina-2012-ten-slow-things-you-dont-know

第四场,我听的是@poshboytl的How we test our projects,首先我需要表达对http://railscasts-china.com/的谢意,我制作的RailsStarter入门课程就放在上面。这位讲师气场非常大,讲的内容很有料,关键很容易理解。很直接。straightforward.我不知道大家对rspec有多熟,反正我是从新手过来的,我从不会不愿意写rsepc测试,到可以随心所欲地写测试,花了很长时间来实践。关键还是练,不练一点机会都没人会给你。

https://speakerdeck.com/poshboytl/how-we-test-our-projects

第五场我离开主会场去了分会场捧一下ruby老将@flyerhzm(Richard Huang)的Semi automatic code review。在来上海之前,我就在youtube.com上找到了这个topic在railsconf 2012的视频,志敏是国际知名的ruby开发者,内容确实给力。这个话题估计都讲了差不多2年了估计,仍然让我敬佩地是精益求精,不断进取的开阔步伐。我不知道如何能赶上他,但至少我可以通过这篇印象Blog写出我对他的敬意。谢谢。

第六场是吕“大哥”的超越正则的正则表达式,这个话题有点意思的地方是,话题有点偏门但大家都会用到。讲师诙谐幽默,一会一个笑点。内容有料,都超时了还不忘介绍ruby2.0正则的新写法,敬业,我服了。

https://speakerdeck.com/luikore/more-than-regexp

第七场是微创业路上的红宝石,嘉宾是@robinfan @flyerhzm @xdite。主持人@lgn21st精心组织话题,把分会场的气氛带到一个高潮。

第八场是Lu linqing的OpenShift,云服务上的ruby开发。我同事的topic,我完整的听完了,从ruby developer的角度,我觉得还是很值得听一听的。OpenShift作为一个完全开源的云解决方案,让ruby developer能抢先知道云的架构,非常值得。代码也是公开的,更重要的是有ruby代码库可以让开发者直接参与OpenShift开发,太Geek了。谢谢Lu linqing,给ruby社区助力一把云体验。

后记,主持人 @lgn21st很有主持风范和气场,导致他到那里主持,我就跑到那里去听节目。其他Session只能等视频了。办这样一个公益的,ruby社区驱动地峰会不容易。现在圆满成功,谢谢你,@lgn21st。你可以在家乐一乐了。

that’s all.

使用vimux加速ruby开发测试的技术汇总

vimux是VIM的插件,目的是让你在VIM写代码的同时,还能开一个新tmux窗口运行测试。这里是tmux不是screen,我表示遗憾,毕竟我还是很喜欢screen的,:-o.

https://github.com/benmills/vimux

安装方法:

Install Vundle:

git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

编辑 .vimrc:

Bundle ‘gmarik/vundle’ 

Bundle ‘benmills/vimux’

Bundle ‘pgr0ss/vimux-ruby-test’

然后在VIM下运行 :BundleInstall

然后开始我们的测试之旅吧。

随意编辑一个spec文件,运行RunRubyFocusedTest就会开启一个tmux sub session跑当前鼠标所指的test case.

感觉还是有点不爽,可以换一个测试插件,vim-vroom。

安装:

Add the following to your .vimrc after vundle setup:

Bundle 'skalnik/vim-vroom' 

and remember to run :BundleInstall.

安装完成之后,在你的Rails工程目录,直接打开spec文件,马上就是使用leader + r or R跑了。慢着,想调运vimux插件,只需要加一行自定义参数在vimrc中就可以搞定。

let g:vroom_use_vimux = 1

我拿lazy_high_charts跑了几圈,特别满意。

vimux




为什么我要开发开源课程- Rails Starter 2012

起因:

自参加Rails社区以来,我一直对Rails培训感兴趣。对,就是你理解中的在线或线下的“培训”课程。我并不满意当前的新手培训现状,总觉得缺少点什么,但我确实一时说不上来,仅仅是感觉。优秀的中文课程并不多,但还是有的,比如xdite的“Rails 101 - 火速學會 Ruby on Rails”就是一例。读书很枯燥,如果有合适的中文入门视频就好了,类如http://railscasts-china.com/一样,但它的课程并不简单,初学者仍然会有很多困难。所以我的想法就是出于能不能让入门更简单作为基本条件:

1、视频作为载体,一个视频一个主题,15分钟限制。

2、只针对Ruby/Rails入门设计,不会涉及高级课程。

3、通过网盘共享视频编辑文件,让更多的网友能编辑,改进课程内容,保证课程的时效性。

4、为初学者构建简单的入门电梯,转化更多的技术爱好者进入Ruby社区。最少也要Rails入门。

5、没有广告,没有利益驱动,只有自由,理想,社区。核心组织者会让社区来演化改进课程方向。

6、根据数据可视化的理解力,尽量会向这个方向尝试。

that’s Done.

rails-starter-for-china

Online Spreadsheet技术历险记

做为Ruby Developer拿到这个Case,开头让我有点为难,因为我之前并没有此类经验,总不能让我空想实现方法吧。当然凭着开发企业WEB APP的经验,我觉得可以先看看主流的Online Spreadsheet实现的程度,好对技术壁垒有个充分的认识。经过谷歌的窗口,我筛选出google spreadsheet, zoho spreadsheet, thinkfree office。认真的试用了各项指标,对各家有了一定的了解。然后摆在我面前的问题就是,有无开源的解决方案能解决这个问题。经过又一轮的搜索,ZK Spreadsheet类库到了我的眼前,虽然之前有Java背景,但已经不是我专注的技术了,所以我还是很谨慎的看着这个台湾社区推出的开源类库。ZK ajax+java的方式在企业技术里应该是到达一个技术瓶颈点,没有什么再可以突破的空间。但通过它实现的Spreadsheet appdemo却让我对实现一套Spreadsheet有了不少更真实的认识。

首先,如何render出在线表格,zk使用apache poi移植过来的版本实现Excel的读写。用处就是支持用户上传和导出。

第二,如果实现协作编辑,对于spreadsheet,cell已经是最小单元,最好的办法就是使用Session来控制。但仍然有很多挑战,比如同一个人打开两个session编辑同一个cell的内容,确实很变态,但如何有效显示内容呢。

第三,函数,强大的函数可以摧毁一切和MS Excel的竞争对手,但就是因为有在线的优势,如何裁剪函数就是艺术了。

第四,我一开始还想过torquebox + zk spreadsheet做一个开源的Online spreadsheet project, 但torquebox目前对纯rails, sinatra的支持,好过mashup java project的支持,虽然它文档有过介绍,但我没有走通。 

第五,在一个转换XML case上,java就有JAXP 1.4, JAXB 2.2a, and JAX-WS 2.2,并且还不是完全一样只干一件事的东西。所以java程序员想再一个技术点上只专心的用一个库,真的很难。可以说在这个点上,JSR到底是干什么吃饭的我就想不同了。 keep it simple在java上一点用处都没有,就剩下我对语言的膜拜了。

分享一个和ruby没关系的话题,希望不让大家失望。反正也在墙外,没啥流量。

在线活动抽奖算法的设计总结

朋友做一个在线活动,想通过转盘抽奖的方式,分发奖品,让我帮看看如何实现。我之前没有此类经验,出于好奇就分析了一下。网上也找了相关的抽奖算法,基本上能参考的资料都是只言片语,不成系统。借此,我把自己总结的思路放在这里,以此作为参考吧。

首先,在线抽奖和线下抽奖是一样的,都是概率问题。根据奖品的数量,我第一步需要生成接近指定的概率分布(probability distribution)的数组。以PHP为例,先初始化一个包含100个变量的数组,把包含概率的奖品标记为了类如1,2,3数字,其他初始化为数字0. 循环这个数组+mt_sand下标,达到随机分布数组的实现。

网上截取的实现函数:

function rand_array($arr)
  {
      $arr_size=sizeof($arr);

        $tmp_arr=array_fill(0,$arr_size, 0);;

        for($i=0;$i<$arr_size;$i++){

            mt_srand((double) microtime()*1000000);

           $rd=mt_rand(0,$arr_size-1);

        if($tmp_arr[$rd]==”“)         {

            $tmp_arr[$rd]=$arr[$i];

        }   else   { 

            $i=$i-1;

        }

        }
        return $tmp_arr;
    }

第二步,随着随机数组有了,可以使用php的array_rand直接取到随机的一个元素,查看这个值是否大于0,就可以判断是否中奖了。

// google analytics