mysql,Linux,HighPerformance,ruby on Rails

2010年3月22日星期一

相当完美的使用AppEngine的Email服务,中小企业的福音!

之前实践过AppEngine的邮件服务,支持中文,每天2千的邮件量。对于中小企业想提供邮件服务,这是完全可行的。在用过jruby和python开发appEngine
程序的过程中,体会到这"锤子"还是要因地制宜的使用,python在AppEngine上真的很好使用,这不能怪Ruby,只是Google对Python支持的完整。即然
用别人的场地练活,还是do it simple为妙!
下载使用过这个,并且还顺手给它打了一个utf-i的patch.
http://github.com/benjaminpearson/gae-web-services
提供了图片服务和邮件服务。
今天又看到有一个新库,对google appengine email提供了另一个单独的库,值得推荐:
http://github.com/maccman/remail-engine
再配合rmail,你就可以在你的rails项目里使用此mail服务了。

一步一步的指导看这里:
http://leadthinking.com/233-sending-or-receiving-emails-with-rails

请多实践,以此纪念Google退出大陆的壮举!


--
tommy xiao
E-mail: xiaods(AT)gmail.com

2010年3月15日星期一

A rigorous approach to high performance

这是读Thinking-Clearly paper的心得笔记,有点零碎,乱,见谅。可twitter@xds2000与我交流
规避试错的“苯”方法,学习使用可让人信服的科学方法是本Paper的主旨。
respone time,throughput它们是相关联的,还需要分场景分而制之
解决之道:
第一步,what is the goal state that you want to archieve?
第二步,profile

另外,阿姆达尔定律(Amdahl's law )需要考虑:
阿姆达定律表明:通过改进某模式得到的整体性能提高,受限于该改进模式所占的运行时间比例。
引入M/M/m公式,其中m就是你的CPU核数
想说明一个问题就是就的系统即使是可完美的,也会有阀值,超过它就会
降低性能,遵从阿姆达尔定律。
(15.relevance  of the knee)
总结:
假如你有一个伴随随机请求访问的系统:
1,你的系统的每个资源都有阀值点
2. 你的系统的阀值必定小于“默认”的阀值(作者统计了一个系统默认阀值)
3.假如你无限制持续的访问系统任一资源势必导致触发性能阀值,随之
你就会遇到性能问题。

16.capacity planning (关键精华!)(注意:这里提的是随机访问的系统,例如数据库)
知道前述的性能阀值原理可以消除很多运量容量规划过程中的复杂度。
1.你的目标容量是在系统高峰时你能满意运行任务的性能数值而不是无限制的使用资源
2.假如你持续保证系统资源的使用小于性能阀值,那你系统的性能表现就会是线性的。不会
出现指数异常。
3.无论你怎样让系统超过性能阀值访问系统资源,必定会遇到性能问题(不管你想还是不想)
4.假如你遇到性能问题,你并不需要花时间放在数学模型上;你需要花时间在重新定义负载或
消除负载或增加容量来解决问题
这就是在性能管理过程中的容量规划。




参考:
1.[Paper]Thinking-Clearly paper
http://method-r.com/downloads/doc_details/44-thinking-clearly-about-performance

如何理解javascript Closures

首先,我非Javascript专家也非Web开发的高手,仅仅是想掌握Javascript,所以遇到了这个
Closures,对我来说,如何用最质朴的语言描述快速理解掌握它是这篇博文写下去的动力。

以下就是我的理解,欢迎交流twitter: @xds2000
Javascript场景:
这里指的是ECMA 262第三版,对于Javascript来说,万物都是对象,function也是。

起步:
一个对象肯定有属性,对于javascript来说,对象除了属性,还有prototype,是什么,也是
对象,这个prototype也会有prototype,这样就形成一个属性链。两类,一类是属性,一类是
prototype。英文中叫prototype chain,这个chain的搜索路径会按父子关系向上查找,一直
到发现null prototype才会结束。那么在javascript中谁有null prototype呢,对,Object.prototype的
prototype,再细下来就是
Object -> prototype -> null prototype
也就是说Object的prototype非null,而是Object的prototype的prototype是一个null prototype.
语言描述起来会很傻,但就是这样。我是感觉这样理解更清晰多了。
对于对象属性,我们只关心赋值和读取两个操作。
对于赋值,没什么需要注意的。主要还是看读取。读取一个值,它(javascript interpreter)的行为
是先从对象实例找属性,没有再找其prototype chain,注意返回值是第一个找到的,即最近的
属性。因为对象是可以继承的,你别忘了。
下一步说scope
说起来我感觉挺麻烦,来段代码分析让你更清楚:
var y = {x:5}; // 创建了一个对象y,全局
function exampleFuncWith(){
    var z;

    with(y){

        z = function(){
            ... // inner function expression body;
        }
    }
    ...
}

//外面执行
exampleFuncWith();


上面这段怎么理解,这样,y是全局对象,exampleFuncWith是函数对象,被创建的时间,会
创建一个[[scope]]属性,是一个list或者link。干嘛用的,当然是把其对应的上下文中的对象都
创建引用,这样就形成一个chain了。
这里z = function() {...}是一个内部的function,它的scope是在with这段里,但关键是有一个y,
所以函数体被执行后会在y这个对象的[[scope]](是属性,你在程序界面是访问不了的,可理解为list和link)中创建一个内部函数引用。

铺垫那么多,这回说重点,什么是Closures呢,看这里:
function exampleClosureForm(arg1, arg2){
    var localVar = 8;
    function exampleReturned(innerArg){
        return ((arg1 + arg2)/(innerArg + localVar));
    }
    /* return a reference to the inner function defined as -
       exampleReturned -:-
    */
    return exampleReturned;
}

var globalVar = exampleClosureForm(2, 4);
javascript closures就是说返回一个函数和它的函数体上下文,也就是让另外的变量当内部函数的引用,也可以把这个引用赋值给另一个函数。这样形成一个环。你如果还是没有理解,可这样看外面变量或函数->外函数体->内函数体->外面变量或函数,这样不就是一个循环体嘛。但这些表面的不是关键,关键是我们如何理解内部函数是如何被调用的。我现在不说你肯定还是不能理解Closure的用处何在。还要看上面的代码,这段代码我们如何调用呢,这样走 globalVar(2),在解释到这个,首先看它的[[scope]] chain,这个chain中头一个就是exampleRetruned,为什么,因为是return的。别理解从 exampleClosureForm(2,4)了。这才是javascript的执行关键。因为我这里有一个2,所以内部函数的引用globalVar就是exampleReturned,你赋值一个2,相当于赋值给了exampleReturned的innerArg参数了。这就是Clores的关键精华。那最后你肯定会问Closures能干什么?可能我说你想怎么干就怎么干,你会鄙视我的无知态度。但事实上你只能在实践中就好比拿着锤子你不打几个钉子还是不会知道这锤子好不好用一样。就这样,以上理解是对参考1链接的读后心得,如有差错还请各位斧正不正确之处。

参考:
1. http://www.jibbering.com/faq/faq_notes/closures.html
2. JavaScript语言精粹

2010年3月9日星期二

Code reading:Auth:Clearance

Authentication is a common pattern in Rails apps基本上每个网站都会应用这个模块,所以练熟它是非常必要的。

rails里认证是一个经典的案例,每个开发者应该都会有自己的心得,作为web开发者,
通过实践熟悉这块必不可少。

我先选了Clearance,一个thoughtbot公司产出的代码整理些资料以备后用。
其代码最有特色的地方是使用shoulda和cucumber建立起来的测试流程,很是受用。
测试不是口头的,需要练,但没有代码练好像也不是那么容易,这份代码就是完整的
学习资料。
另外,注意,测试工具没有好坏,rspec,test/unit(shoulda)没有最优的,如果不学用,
它们都是废铁。

实现功能:

   * Register

   * Email confirmation

   * Encrypted password

   * Password recovery



thoughtbot通过项目经验总结出可重用的功能为:

  1. Sign up
  2. Confirm email
  3. Sign in
  4. Sign out
  5. Reset password


操作步骤:
在envirenment.rb加入:
  config.gem "clearance"
在命令行下输入:
script/generate clearance

通过override方法来实现自定义

参考:
1. http://wiki.rubyonrails.org/howtos/authentication-authorization/clearance
2. http://www.slideshare.net/jmorrison/clearance-simple-complete-ruby-web-app-authentication-presentation
3.http://robots.thoughtbot.com/post/159805955/clearance-rails-authentication-for-developers-who
4. http://wiki.rubyonrails.org/howtos/authentication-authorization
5.http://robots.thoughtbot.com/post/159805881/mixing-cucumber-with-test-unit-shoulda
6.http://wiki.github.com/thoughtbot/clearance/organization
7.http://robots.thoughtbot.com/post/159805560/tips-for-writing-your-own-rails-engine