mysql,Linux,HighPerformance,ruby on Rails

2009年12月30日星期三

最适合rails部署的Linux Distro

此话题源自rubyonrails-talk maillist,有人提到开发rails应用,遇到这个问题,用什么最好呢?
CentOS, Debian 5, Fedora (10 to 12), Gentoo, Red Hat EL 5, and Ubuntu (8 and 9) ?

回话中有人提到,最好的方式是先择你最熟悉及常用的版本,这样一是心里有底,二是可以更
快速部署。人其实是开发及维护中最大的变数,所以如果能让"人"更舒服的管理,当然系统也
会更健壮的运营。

Linux最重要的是kernal,所以对于我们来说,关注kernal版本比版本更为重要。
以我在国内使用的系统经验来看,
Red Hat EL 4或5使用比较广泛。也是大家最最常用的版本,CentOS也是开源的Red Hat系列版本
所以现在因为Red Hat不提供企业版的非注册用户升级服务,所以大家首选CentOS作为可选择的版本。

CentOS中的升级管理工具是Yum(Yellow Dog Updater Modified),是一个在Fedora中的字符前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

Fedora就不用说了,用的升级包管理工具也是Yum.
因为名字不一样,很多人都认为RedHat EL或者是CentOS是企业版的套件,肯定比fedora强!强在哪里呢?不清楚?肯定是一个系统参数的优化?不见得吧,这需要依据你的配置后的环境。
这里的回答即简单又实在:基本一样的。但是fedora软件都太新了,不稳定。可以使用centos,那个是和redhat 一样的。摘录于这里

Ubuntu的区别在哪里呢?我想还是升级包管理工具,因为源自Debian,所以使用APT((高级软件包工具,Advanced Package Tool)来管理,不了解是吧,看这里的HowTo
所以说到这里,你肯定会说那不如使用Debian吧。也可以的。国外使用Debian很流行的。

Gentoo,Linux发烧友的玩具。在本地编译可定制。gentoo的包管理工具称为portage,说细看这里介绍

最后,我认为拿个顺手的就一直用着吧。我原来前几年都使用RedHat EL,现在想着就用Ubuntu系列的,个人喜好,仅供参考。

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

2009年12月29日星期二

Rails Tips-rails log查询

在调试时log还是比较重要,一般之前都习惯使用tail -f
这回看一文章使用less -R,直接可以在控制台里查询,使用?和/进行后向查询和前向查询,这样想定位字符就可以定位。之前在同事的blog中看过,一般没有感觉。
这回自个试用后,很是懊悔,怎么不去使用呢.
less -R让log以颜色命令行方式显示。
按下Shift-f模拟tail -f模式
按下Shift-g
/+想查询的字符,定位光标前向字符
?+想查询的字符, 定位光标后向字符
功能就这么多,已经满足需求。

以上叙述基于macos平台及Linux平台,学习及使用rails,建议尽快进入Linux平台。如果实在有困难,请到chinaunx.net去泡坛几天。
Over
--
tommy xiao
E-mail: xiaods(AT)gmail.com

Windows下使用rails遇到的问题收集-episode#1

1.连mysql遇到Mysql::Error: query: not connected: CREATE TABLE `schema_migrations` (`version`
varchar(255) NOT NULL) ENGINE=InnoDB
原因是ruby gem中 Mysql Client Library(libmySQL.dll)高版本不支持.下载一个放到\bin\下就直接能用.地址: http://instantrails.rubyforge.org/svn/trunk/InstantRails-win/InstantRails/mysql/bin/libmySQL.dll .

2.window下最好的rails editor是什么,是VIM.
Vim configuration需要配,有详细说明是最理想的,这里

rails.vim的常用指令:

:Rails {目录}
在指定的目录建立一个新的Rails应用程式。如 :Rails d:\depot

:Rake {指令}
直接呼叫Rake进行指定的动作。如 :Rake db:migrate

:Rgen {指令}
呼叫script/generate。如 :Rgen controller admin

:Rserver
呼叫script/server。

:Rproject
在画面的左端以树状结构显示Rails程式目录

:Rpreview {名称}
打开浏览器检视指定的位址。例如输入:Rpreview store 就会打开http://127.0.0.0:3000/store/

:Redit {名称}
直接打开指定的档名。 (注:有些档案不能用这种方式开启。)

:Rcontroller {名称}
:Rmodel {名称}
:Rview {名称}
:Rlayout {名称}
打开指定的controller / model / view / layout
接下来有几个指令一定要特别提出来讲。这是rails.vim最强大的部份:
1. gf

gf这个指令根据游标所在的位置不同会有不同的效果,直接看例子(*代表游标的位置)

游标的位置 打开的档案
Pos*t.find(:first) app/models/post.rb
has_many :c*omments app/models/comment.rb
:bl*og app/controllers/blog_controller.rb" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">link_to “Home”, :controller => :bl*og app/controllers/blog_controller.rb
'sh*ared/sidebar' app/views/shared/_sidebar.rhtml" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">= render :partial => 'sh*ared/sidebar' app/views/shared/_sidebar.rhtml
%= stylesheet_link_tag :scaf*fold public/stylesheets/scaffold.css

甚至,假设我们有个admin_controller 中有一段程式码:

def s*ay

end

输入gf就会马上切换到say对应的view (app/views/admin/say.rhtml)
2. :R跟:A

这两个指令也是在不同的档案间切换用的,运作方式如下:
目前的档案 输入:A会切换到 输入:R会切换到
model 对应的unit test 对应的migration
controller (in method) 对应的functional test 对应的template (view)
template (view) 对应的helper 对应的controller中method的位置
migration 前一版的migration 下一版的next migration
















参考:http://devpoga.wordpress.com/2008/02/05/vim-rails/

最后发现国人制作的vimmate,更加方便,快速部署.

2009年12月15日星期二

Mysql配置中的几个参考,阅读笔记

Fixing Poor MySQL Default Configuration Values
原文地址:http://jeremy.zawodny.com/blog/archives/011421.html

笔者在配置mysql中积累了一些参数设置经验,分享:
1. max_connect_errors: 最大链接错误数,最少设置一下,配置一个大点的:max_connect_errors=1844674407370954751,注意这个值是64位机器的,详细的还是要看Mysql手册,

2.connect_timeout: 和上面的参数还有关系,默认是5秒,但在互联网的高负载的环境中,还是需要配置的长点,20?需要自个根据情况调优一下.你可能会问怎么调.这里有一个关键问题就是你有没有图形化的监控呢?如果没有的话,可能调起来就不那么顺手了...点到为止.

3.skip-name-resolve: 默认Mysql走DNS解析你的帐号中的域名,还是走IP中.笔者推荐 skip-name-resolve加到/etc/my.cnf.好像国内很多用户都会这么做了.好事.

4.slave_net_timeout: 主从的参数,默认为1小时,注意一下,笔记建议配置到30秒,哪里出了问题,可以快速反应是吧.

Over.感谢作者,所有心得为原作者所有,我仅是翻译及记录一下.

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

2009年12月9日星期三

rails入门时几点窍门,绝对的集百家之长

  1. 在踏入rails学习第一步时,总会想当然,想找最好的入门手册。但在哪里呢?有没有标准啊。心中没底啊。还好,在rails世界里,确实存在这样的东西,在这里:http://guides.rubyonrails.org/
  2. 想找最好的代码作参考,好对照着写出最牛的代码,哪里有呢?还真有:www.github.com
  3. ruby要不要学好,说真的,一门语言有好的地方也有坏的地方,所以你不必完全掌握所有的技巧,把需要掌握的掌握即可。
  4. HTML/Javascript/CSS可能是web开发中最能玩出花的地方,好好用心学吧。作好程序员,不是会写几行code就成。
  5. Linux是入门环境中最理想的,别总靠着windows,到了生产环境,谁给你花钱买正版的?想想吧。
  6. 书哪里有啊。买?不买看ebook?其实最重要的你需要熟练掌握英文,好好把英文搞好是你撬开新知识之窗的把手!
  7. 社区?还不多,所以本地有的话就参考,没有的话,就上网上社区吧,去一个地方就可以了。www.chinaonrails.com,不过已经成了bd7lx的专用留言板了,呵呵,:-)
Over,有需要请留言补充

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

2009年12月2日星期三

在has_many多对多关系中,如何count记录集?

这是在rails maillist看到的问题,当时确实没有想到办法,后经查,找到一个参考链接,看了后,感觉日后可以用上,记录下来:
class User
has_many :messages do
def by_type(type, options={})
conditions = [ 'type = ?', type ]
if options[:count_only]
count(:conditions => conditions)
else
find(:all, :conditions => conditions)
end
end
end
end

refs:
http://refactormycode.com/codes/209-rails-has_many-count

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

2009年11月28日星期六

attention! Ruby Core Bug #405 can be resolved. get your way.

hi,rubist,
      Today i encouner this error:
   ssl.rb:31: [BUG] Bus Error
this is annoying thing. i have try install any version ruby.but no avail.
let me think.this is macos special bug.no ruby anything.
so latest way, you can use port install any thing. this way can resolve this bug.

sudo port -v selfupdate

sudo port install ruby

sudo port install rb-rubygems

sudo gem update --system
..
go along with this way.when finished install,this rails is come back.wow!

ref:
http://redmine.ruby-lang.org/issues/show/405
http://www.jotlab.com/2009/11/08/installing-ruby-on-rails-mysql-imagemagick-nginx-passenger-with-macports/

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

2009年11月19日星期四

ruby编译中的二三事--你不了解的部分

如果你像我一样,对编译ruby经历过的话,肯定会遇到一些挫折,但通过google又能找到一些通用的tutorial,这些tutorial中总会给你一条"万能的指令"如:


 ./configure --enable-shared --enable-pthread CFLAGS=-D_XOPEN_SOURCE=1
但你理解这后面的flag的意思吗?我相信不一定有人能理解,我记下来,总让有心人能有所收获.

RubyCocoa compatibility and --enable-shared

In order to use RubyCocoa, the Ruby interpreter must be compiled with --enable-shared. By default, Ruby Enterprise Edition's interpreter is not compiled with --enable-shared. You can compile the Ruby Enterprise Edition interpreter with this flag by passing -c --enable-shared to its installer, like this:

./ruby-enterprise-X.X.X/installer -c --enable-shared

Please note that enabling --enable-shared will make the Ruby interpreter about 20% slower. It is for this reason that we don't recommend enabling --enable-shared on server environments, although it's fine for desktop environments.


Tcl/Tk compatibility and --enable-pthread

In order to use Tcl/Tk with threading support, the Ruby interpreter must be compiled with --enable-pthread. By default, Ruby Enterprise Edition's interpreter is not compiled with --enable-pthread. You can compile the Ruby Enterprise Edition interpreter with this flag by passing -c --enable-pthread to its installer, like this:

./ruby-enterprise-X.X.X/installer -c --enable-pthread

Please note that enabling --enable-pthread will make the Ruby interpreter about 50% slower. It is for this reason that we don't recommend enabling --enable-shared on server environments, although it's fine for desktop environments.

-D_XOPEN_SOURCE=1
这个最难理解,其实它是Clib库的一个宏,说白了就是为了支持更多的函数配置的开关
Glibc 所实现全部或部分规范下的功能有:
1.ISO C: C语言国际标准.
2.POSIX: 操作系统的 ISO/IEC 9945 (aka IEEE 1003) 标准.
3.Berkeley Unix: BSD 和 SunOS.
4.SVID: V 系统接口描述.
5.XPG: The X/Open Portability Guide.
为了实现扩展函数,可以设置D_XOPEN_SOURCE
Macro: _XOPEN_SOURCE
If you define this macro, functionality described in the X/Open Portability Guide is included. This is a superset of the POSIX.1 and POSIX.2 functionality and in fact _POSIX_SOURCE and _POSIX_C_SOURCE are automatically defined.
As the unification of all Unices, functionality only available in BSD and SVID is also included.
If the macro _XOPEN_SOURCE_EXTENDED is also defined, even more functionality is available. The exa functions will make all functions available which are necessary for the X/Open Unix brand.


That's all!

参考:
http://www.rubyenterpriseedition.com/documentation.html#_how_ree_installs_itself_into_the_system
http://hivelogic.com/articles/ruby-rails-leopard

2009年11月16日星期一

javascript语言精粹--笔记1


1.每个函数创建时都附带有一个prototype属性,它的值是一个拥有consctructor属性且值即为该函数的对象,这和隐藏连接到Funtiocn.prototype完全不同
2.通过函数字面量创建的函数对象包含一个连接上下文的连接。这被称为闭包
3.在javascript中调用函数有四种模式:
方法调用模式,函数调用模式,构造器调用模式和apply调用模式

构造器函数不为推荐,有更好的解决方法

2009年11月14日星期六

BeijingonRails,我们社区还很小,但我们很真诚!


P1010140
Originally uploaded by Robin Lu
今天去参加了beijing rails的周末聚会,来的人不多,也就三四十号人。keynote讲的也很简单,但这就是beijingonrails的开始。希望能继续这样的社区,当然壮大起来就更好了。这次聚会,看到有人在试探rails,想学又有很多疑问。提的问题我感觉还是很“外行”,不能切入重点。但这些都不是重点,其实大家最重要的是分享,rails让我感觉到的是开源的亲和力,不管你是什么时候进入,都会在很短的时候里建立自已的成就,这就是程序员的文化所在。

2009年11月13日星期五

parse querystring use oneline.ruby tips

base envirenment:
parse a HTTP query string in the shortest possible way.
q = "query1=apa&query2=apa2"
Hash[q.split("&").collect{|a| a.split("=")}.flatten]
=> {"query1"=>"apa", "query2"=>"apa2"}
absolutely shottest way:
Hash[*q.split(/=|&/)]

reference url:
http://refactormycode.com/codes/1058-parse-a-querystring

2009年11月11日星期三

在搞清楚&block的用法时看到的bechmack方法

来源:http://blog.sidu.in/2007/11/ruby-blocks-gotchas.html
以后在测试性能时可能会用到.记在此.
Benchmark.bmbm(10) do |rpt|
rpt.report("foo") do
n.times {foo('Sidu', 'Ponnappa'){|name| "Hello #{name}"}}
end

rpt.report("bar") do
n.times {bar('Sidu', 'Ponnappa'){|name| "Hello #{name}"}}
end

rpt.report("ooga") do
n.times {
the_block = lambda {|name| "Hello #{name}"}
ooga('Sidu', 'Ponnappa', the_block)
}
end
end

显示结果:
Starting benchmark

Rehearsal ---------------------------------------------
foo 0.781000 0.000000 0.781000 ( 0.782000)
bar 1.406000 0.000000 1.406000 ( 1.406000)
ooga 1.438000 0.016000 1.454000 ( 1.453000)
------------------------------------ total: 3.641000sec

user system total real
foo 0.782000 0.000000 0.782000 ( 0.781000)
bar 1.375000 0.015000 1.390000 ( 1.406000)
ooga 1.453000 0.032000 1.485000 ( 1.485000)





2009年11月3日星期二

accepts_nested_attributes_for引起的实践

如果你读了ihower的rails best practices那个ppt,一定对39页的实践看过,我跟着实现了一下,但没有成功,对于这种失败细节,很难一下子讲清楚,如果有一个demo就好了.终于来了一份:http://github.com/anathematic/has_one_problem,clone下来后,跑起来一切ok.好了,如果你这样收手,就没有注意了,在PPT中显示的form如:<% form_for :product do |f| %>....
<% end %>
这里的是:product,但我实际中,这样是跑不了的.需要指定action.<% form_for :user, :url => {:action => 'create'} do |f| %>另外,还需要注意里面的变化: <% f.fields_for :contact_attributes do |c| %>
<%= c.label :phone,'电话' %>
<%= c.text_field :phone %>
<% end -%>
注意需要加上_attributes

参考demo:http://www.box.net/shared/vm76if7zdd


另外,增加这点tips
从Doctor Nic那里扒来的To find, clone, and fork any rubygem that is hosted on github:

$ sudo gem install drnic-github
$ gh clone --search rails
$ gh fork
To personalise the gem and share it on gemcutter:

> edit the project.gemspec to have a unique name, e.g. yourname-project
$ gem build project.gemspec
$ sudo gem install gemcutter
$ gem push yourname-project-1.0.0.gem

2009年11月2日星期一

will_paginate的ajax实现

之前一直没有实现成功过ajax版的分页,心中总有心节.网上也搜索了很多教程,但总是实作不了.心有不甘.
今天静下心来,按will_paginate的wiki中介绍的方法实现出来,打包放在这里,给大家直接参考.

blogspot不能上传附件,所以放在这里:
http://www.box.net/shared/rufuee2ldm

environment:
rails 2.3.4
ruby 1.8
--
tommy xiao
E-mail: xiaods(AT)gmail.com

需要升级rubygems的注意一下这两条指令

sudo gem install rubygems-update
sudo update_rubygems

就这些。当然你的环境需要是*nix环境,win我就不保证了。

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

2009年10月30日星期五

今天发现竟然可以通过邮件来发布blog,这样又可以不翻墙发文了。


yeah!万圣节快乐。
今天找了一个学respec的好例子,直接在github上下载即可练习spec.
http://github.com/ultrasaurus/test-first-teaching/
我是直接clone下来,然后练习的。这主竟然还提供了solution,如果在本地使用呢?需要使用git的命令。
pull,branch啊,熟吗?不熟,这主又提供了一份git参考mv:
http://www.gitcasts.com/posts/railsconf-git-talk
这视频应该是刚刚的,当然要想学好,需要点耐性。最好记下笔记。可没有快进的。

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

2009年10月29日星期四

在rails中attr_accessible是Mass Assignment exploit的救星

查railscast一则教程,写到使用curl可以方便模拟一个包来hack

curl -X PUT可以设置HTTP 命令

curl -d可以POST数据

attr_protected有如鸡肋,在has many下竟然可以级联update其它属性.直接使用attr_accessible就可以指定赋值对象了.

所以在model中要使用attr_accessible,限制更新字段.

2009年10月28日星期三

君子欲行先于言,故迟言而速行也--作有生产力的人



早上翻了翻twitter,看到这篇文章,深受启发,看来要改改自已的毛病了.
Produce before you Consume

文中作者说到,一早起来就应该着手作自已应该作的事情,然后再浏览咨询,这样才能有效的提高生产力.精彩的tips

2009年10月26日星期一

TaobaoTOP调用实战之Json操作总结,ruby

首先需要调用这个plugin,http://github.com/xiaods/open-taobao
第一步当然想显示taobao的商品分类,就是说需要调用taobao.shopcats.list.get:获取前台展示的店铺类目
我使用json返回结果集,并且想在页面里显示出来,但json在parse之后如何能iterate显示每一条数据呢?
在网上查了查,写出如下测试,成功。
# taobao.shopcats.list.get:获取前台展示的店铺类目
def test_taobao_shopcats_list_get
result = OpenTaobao.get_with(:method => 'taobao.shopcats.list.get') #结果集是json包

shop_cats = result['rsp']['shop_cats']
# puts shop_cats.inspect
shop_cats.each do |cat|
puts cat["parent_cid"]+" "+cat["name"]+" "+cat["is_parent"].to_s+" "+cat["cid"]
end
end

就像Array一样操作数据。真是挺方便。其实因为json是需要与前台互动的,应该是使用javascript来操作json更为理想。当然这里就不表了。以上就是使用ruby操作json数据集。

参考这里:
http://snippets.dzone.com/posts/show/6133

2009年10月22日星期四

学习Behavior Driven Development 的来龙去脉

是的,我不会BDD,因为要解决自已的测试需求,所以我找到了rspec,所以我遇到了BDD.
什么是BDD,有现成的不用介绍.我只说一下为什么要BDD.这起源于我的一个场景下的需求
如果我使用rails,好像只用得着unit test,并没有什么必要需求使用BDD.但最近继续写这个Plugin

http://github.com/xiaods/open-taobao
就是调用open.taobao.com 插件,更方便的调用taobao open api.现在这个插件还只有一个架子,也没有测试,所以我想通过TDD来驱动开发taobao TOP的API,API支付GET/POST,所以使用unit test行不通.所以需要一种更自然的方式来作.哪种呢,经过Digg之后,我认为就是BDD.BDD需要和TDD结合才算完美.其实本质上来说,就是换个方法来TDD,所以本无区分.只需要会用就用.那现在就要问了:如何踏出第一步呢:
* Simple Ruby and RSpec Tutorial – This tutorial will bring you through the basics of the process while developing a simple state machine. It’s a fun tutorial.
* RSpec on Rails – Luke Redpath’s awesome introduction to using RSpec with your Rails application development.
* RSpec Mocks and Models – Peepcode screencast explaining Mocks and Models. You can view a small sample of the screencast, but I suggest forking out the $9. It’s definitely worth it. This especially helped me out as I’ve been writing a Ruby-based library for accessing the FamilySearch Public API.

其中,Simple Ruby and RSpec Tutorial我是亲自看了一遍,讲的非常清楚,基本看完就可以建立基本的概念观.也欢迎有高人与我分享.可以通过Twitter来告诉我.我的帐号是xds2000

参考:
http://jimmyzimmerman.com/blog/2007/11/simple-tutorials-for-learning-bdd-and-rspec.html

github上学来的git merge技巧.

场景,我fork了一个项目,然后自已写了一些test,然后就放在github里了没动过.最近不忙了,想重新拿起来,继续把Taobao TOP的api rails plugin继续写,所以希望先从fork源那原来的那哥们的代码更新一下,找来找去,找到这最有用的:
git clone git@github.com:bricoleurs/bricolage.git
cd bricolage
git remote add merger git://github.com/username/bricolage.git
git pull merger master
git push origin master
git remote rm merger

就是这个有用的,不用介绍,你也会merge别人的代码了.呵呵.加油,努力.
参考:
http://wiki.github.com/bricoleurs/bricolage/merging-with-git

一直使用twitter,blog更新就很懒了.

2009年10月21日星期三

看JavaScript: The Good Parts的一些碎念,写下来

JavaScript: The Good Parts,是我这几天读的书。主要是梳理一下对javascript的理解。当然之前完全没有系统的学习javascript的语法,在web开发中会感觉不能准确把握需要的效果。现在好了,专心看了几章,对它建立了基本的认识。所以我想应该在blog中提一下,有心人如果想学javascript,应该从这本读起,比较来的直接,有中文版的。
另外,其书中建立的基础好像和Jquery一脉相承,有人知道来龙去脉吗?希望有人相告。

2009年10月14日星期三

关于CustomValidates的使用demo,及一个ruby中的The splat operator.

CustomValidates,源自看advanced rails recipes里的recipe 10:
Write Your Own Custom Validations .
书中使用的rails版本已经很老,所以在rails 2.3下使用书中讲的过不了。
参考这里:
http://chrisblunt.com/blog/2009/04/18/rails-writing-dry-custom-validators/
把validates放在config/initializers里,不需要在environment.rb里加require就OK了。
直接按书中写test unit,直接通过。:-)
然后涉及到给class里加mothod的方法,看这里
http://blog.codevader.com/2008/09/27/including-and-extending-modules-in-ruby/
讲了一遍,我看了遍,记了一下。
然后又涉及到一个 *号,splat operator,
看这里
http://theplana.wordpress.com/2007/03/03/ruby-idioms-the-splat-operator/
注意一下comments里的一个例子:
It may also help to note that ’splat’ returns a copy of the instance that it’s used with, whereas not using ’splat’ returns a reference to the instance.
说的就是加*的是返回一个实例的copy,不加*的是返回一个实例的reference,下面代码一目了然。

Ex.\
[
>group = ["blue", "green", "pink"]
>painting = ["paintbrush", "canvas", group]
>group[2] = “purple”
>puts painting

gives us: paintbrush, canvas, blue, green, purple
]

[
>group = ["blue", "green", "pink"]
>painting = ["paintbrush", "canvas", *group]
>group[2] = “purple”
>puts painting

gives us: paintbrush, canvas, blue, green, pink
]

2009年10月9日星期五

route里的:member和:collection是怎么用的

以下内容基于rails,route里经常会用到collection和member,但已经忘了它是何物了,可见不练的后果。查之,

这里的对话可以直接让我明白,相信你也会明白.
总结下来,想在RESTful的7种action之外再增加其它action,就需要使用:collection,如果想针对单个object作操作,请使用:member.

RubyHunt: What’s the use of the :collection and :member methods within a route? What’s the difference between the two?
melvinram: Collection adds routes to the entire collection
RubyHunt: So the collection is used to add another action inside the controller
melvinram: If you had a resource of Contacts, a collection route you might add would be delete_all_older_than_6_months
melvinram: and the route to get to it would be be /contacts/delete_all_older_than_6_months/
RubyHunt: Which otherwise would be restricted to only 7 actions ?
melvinram: yes
melvinram: A member method applies only to one record. For example, you might add a member method called upgrade_to_vip that would update one record to have a status of VIP or something…
melvinram: And the route would be /contacts/1/upgrade_to_vip
RubyHunt: So the :collection is used to add action inside a RESTful controller and the :member would be used to apply action for individual object.

2009年9月26日星期六

使用autoproxy+GAppProxy暂时实现网页爬墙

这里也是墙外,所以写Tutor应该不会影响什么墙内的朋友。

autoproxy是firefox的addon,暂时是beta版,可以直接安装。
GAppProxy,使用google appspot作为代理,我使用mac上使用python直接使用,验证可以使用,不然我这里blog就写不成了。呵呵。

目前只能支持http,可以了,GFW的技术重点ipv6的使用。但这种魔高一丈,道高一尺的事情,我觉的讨论下去没有什么意义。重点是能让一部分人使用墙外的讯息就可以。我们可以口口相传嘛。

坚持党的领导,中国人民万岁!

2009年9月23日星期三

rails开发中糊涂测试中的一些细节,记录一下

今天读一个email测试的代码,这里,你可以直接fork一个.
我读一下,学习一下它的测试.我习惯性先
复制一个git链接,然后git clone ....
然后cd目录后再mate .
这样就可以使用textmate看代码了.
然后打开test下的 test_helper

def t(key, options = {})
result = I18n.t(key.to_s, options)
result.should_not =~ /translation.*missing/
result
end

这里的should_note是什么东东啊.
然后查了一下,原来用了一个模仿respec的testunit库.这个库使用这个语法,一看就明白.BDD风格啊.

然后我就rake db:create,随后script/server
后来我打开feedback_test.rb,
然后Crtl+r,跑起来说我的test db没有创建,我又迷糊了.
原来我需要这样
rake db:create RAILS_ENV='test'

然后我想能不能把rake下的所有命令都打出来,忘了,原来记得的命令啊.最后知道了,
这里rake -T

这样就OK了.
时间长就忘了,有点迷糊,这里赶快想起来
记一下.

2009年9月5日星期六

Ruby on rails的学习过程中,快速搭建开发环境很重要,如果办呢

作为新手,有个可以立马上手的环境太重要了。今天浏览一台湾网友的blog,他提出了一个很方便的解决方案,正和我意,特留一份在此日志。

第一步:下载virtualBox,安装ubuntu
第二步:安装脚本:
http://gist.github.com/raw/180820/2ffa186d4a7a54db43359206f8c2991508892610/rails_install_script_on_ubuntu

原文参考这里:http://ihower.idv.tw/blog/archives/3002

2009年8月28日星期五

textmate遇到目录权限问题,解决方法提供

今天在项目里打开mate .,然后点一个test.rb,然后按commnd+R,想直接运行。出现如下错误:
> "/Library/Application Support/TextMate/Support/lib/tm/process.rb:123:
> warning: Insecure world writable dir /Users in PATH, mode 040777"
>

脑子里无解,只好求助gg,发现textmate组有很多参考,有人给出解决方法:

#chmod og-w 'THE_DIR'

比如我上面提供是/Users出了问题,就直接运行chmod og-w '/Users'.
Done,问题解决,至于为什么会出现问题,没有提示,我也无心去研究,如有人愿意研究并有成果可告知我。谢谢。

2009年8月7日星期五

[Rails] alipay商户支付的接口lib纯净版,share.

近日给公司项目写了一个alipay商户支付的接口demo,share.
是从github上某私人项目集成的activemerchant扩展中发现有alipay,就改过来了。
目标是改成一个lib,直接就在rails中使用。
直接下载吧。
git://github.com/xiaods/alipay-lib.git

2009年7月31日星期五

使用Macbook已经半年了。确实不错




原来没有想过使用mac,因想学习Rails才对macbook多了关注。这一来一回看多了就买了一个。使用起来真的不错。并且没有想到在国内也有很大的人群在使用这类笔记本。可能也是现在硬件便宜了,才让我等老百姓买到。在这半年使用中,体会到了linux体系的“优雅”。全面的使用开源软件来开拓自已的职场之路,也有很大的收获。所以不管各位看客有没有赚大钱的想法,只要想赚钱,就来玩玩mac,多使用使用开源软件来找工作。应该可以有好的预期效果。

2009年7月25日星期六

acts_as_list使用经验总结

环境:
macos 10.5.7
rails 2.3.2


act_as_list是一个排序的module,

*Install the plugin:
ruby script/plugin install git://github.com/rails/acts_as_list.git


网上找了一些blog,但还是没有找到合适的完整的demo可以看。
自个模仿制作了一个。肯定可以作为参考。
http://code.google.com/p/rails-demosite-collection/downloads/list
下载吧。

另外,也附带一个疑问:就是好像在rails 2.3.2里使用has many,belong to 就可以完成这些效果?不确定,继续学习中

2009年6月25日星期四

到底一个CRM需要哪些特性

一个具难回答的问题,问技术不是把人问傻了。无意中查看了一下Oracle的CRM功能列表,
把Oralce的三个CRM软件功能列出来,对比一下,终于发现一些功能。如果你想作CRM,照这个作下去肯定有商机。

对比表单,点这里

以Oracle的Crm为原型,分析列出crm功能Siebel客户关系管理软件PeopleSoft Enterprise客户关系管理软件Oracle电子商务套件11i.10 CRM














.


销售客户关系管理分析Oracle渠道管理

.


市场营销客户关系管理行业解决方案Oracle市场营销

.


联系中心和服务市场营销解决方案Oracle订单管理

.


联系中心基础架构合作伙伴关系管理解决方案Oracle销售管理

.


CRM技术销售解决方案Oracle服务

.


托管型CRM服务解决方案

.


客户数据集成


.


报价与订单受理


.


自助服务和电子账单管理


.


合作伙伴关系管理


.


商务智能管理软件


.


价格管理


.


社会化CRM


.






.

功能参考:http://www.oracle.com/webapps/dialogue/dlgpage.jsp?p_ext=Y&p_dlg_id=7733343&src=6820289&Act=24&sckw=APACMK09052060MPP001.GCM.8085.160

2009年6月23日星期二

Passenger On Leopard,使用内建的apache2步骤



passenger(mod_rails),想在macos leopard,10.5.7下配置,相信同配置的朋友可以参考一下

第一步:
gem install passenger
sudo passenger-install-apache2-module

http://www.modrails.org/install.html
第二步:
在/etc/apache2/other/下创建如下文件passenger.conf
内容如下:


标红的地方需要在/etc/hosts里配置一下
127.0.0.1 dev.local

然后apachectl restart

Done!

ref:
http://railscasts.com/episodes/122-passenger-in-development

2009年6月8日星期一

使用Ruby,学习Ruby,从脚下开始




写这篇文章,我感到很兴奋。因为终于又发现一个新的信息点来享受技术的演化。脚本语言的发展真是日进千里。一直犹豫是否需要脱掉java大衣,No,这是一个痛。现在好了,阵痛后我终于可以换上新的“新衣服”在技术的海洋邀游。
所以我建议你不妨试试Ruby,它华丽的语法决对让你一眼忘不掉。

拿到ruby时,我的需求很简单,就是作一个华丽的Webapp,不要spring,hibernate那些东西,我感觉并不优雅。并且花的精力实在是太多了,我需要休息。所以用最简单的语言来写最简单的东西,应该是最好不过了。
顶你个肺!哈哈

另,由于rails更新太快,很多新手和我一样,读着书看着更新的代码不知道如何迁移,太难了,这是心声。我也很犯愁,这不虚心向别人请教,得一招感觉挺管用,share之:

http://guides.rubyonrails.org/
这里,熟读这里的文档,练习之,因为这里的文档是和下载档一起更新的,也是最stable的,所以新手必从这里练功。

2009年5月10日星期日

写在面试前的思考-你到底需要什么样的人才

今天要去面试,对于我这个老家伙来说,已经算是轻车熟路了。这些年来面试,体会下来,最重要的是职场规划,也就是你到底想干什么。是的,你到底想干什么,你是否了解自己真是一个问题。虽然有很多职位都是金饭碗,但你是否需要它?难道就是为了钱,我认为不完全是。财富只代表一部分。在IT这个多风险的行业里“混”,并且在这中国这样的环境下,要想找家能成就自已事业的公司并不是件容易的事情。大部分公司都是干不了一两年就换个场景练。底下的人不得不去适应这种变化。公司没有办法,人员更没有办法。你需要去应对市场下的选择,去变换自已的职场路。所以早一点去规划,把路给走下去,就一定会有机会。
下面就是经验总结,
1、学习可以解决一大部分问题,使用笔,google去记录整理经验。再不断的实践。
2、时间要规划好,不要天天去盯着,要有计划,有方法。计划的本意就是把时间留给专注的知识领域。
3、从小学几何我们就知道,知识是从点到线,从线到面,从面到体。所以脑子不好使的话,多作笔记。如何不喜欢笔来记,使用Notebook(AT)google也可以。但习惯了Ctrl+c,v,不动手似乎并不能完成记住完整的细节。所以在没有网络的情况下有可能就又成了瞎子。

4、自信不是天生就有。所以要去锻炼。要主动地的与人相处。

2009年4月19日星期日

Scrubyt抓取非utf-8的代码Sample

如下参考:这里


#!/usr/bin/ruby -Ku

# source must be written in UTF-8
$KCODE = 'u'

require 'rubygems'
require 'iconv'

# Patching Mechanize...
require 'mechanize'

# Perform iconv() before Mechanize parses the page
class IConvParser < WWW::Mechanize::Page
def initialize(uri = nil, response = nil, body = nil, code = nil)
new_body = Iconv.conv("UTF-8//IGNORE", "GB2312//IGNORE", body)
super(uri, response, new_body, code)
end
end

# Set IConvParser as default HTML parser, you don't have to
# run iconv() to each page manually.
class WWW::Mechanize::PluggableParser
def initialize
@parsers = { CONTENT_TYPES[:html] => IConvParser }
@default = File
end
end

# Scrubyt::FetchAction initializes its @@agent as PluggableParser.new
# at class context, so we manually require 'scrubyt'
# AFTER the above patch was installed.
require 'scrubyt'

# Now definition is quite simple
baidu_data = Scrubyt::Extractor.define do
fetch "http://www.baidu.com/"

fill_textfield 'wd',"ruby"
submit
result "Ruby_百度百科"
end

puts baidu_data.to_xml




2009年4月7日星期二

学习新语言的方法总结---ruby版




第一,看一遍语法,快速,需要2小时左右。
第二,找到应用点,比如rails,直接上手作一个小项目。按书上的来写的话,好像就是一个商城。
第三,解决实际问题,分析,写代码,重构
第四,记笔记,share!

Done!

2009年4月2日星期四

uninstall installed 64 bit MySQL dmg on mac



uninstall installed 64 bit MySQL dmg as follows ( There is no good way to uninstall MySQL from Mac other than below)
    * sudo rm /usr/local/mysql
* sudo rm -rf /usr/local/mysql*
* sudo rm -rf /Library/StartupItems/MySQLCOM
* sudo rm -rf /Library/PreferencePanes/My*
* edit /etc/hostconfig and remove the line MYSQLCOM=-YES-
* sudo rm -rf /Library/Receipts/mysql*
* sudo rm -rf /Library/Receipts/MySQL*

ref:
http://akrabat.com/2008/09/11/uninstalling-mysql-on-mac-os-x-leopard/

勿在浮沙筑高台-要诚实的面对生活,社会,职场

先看一下这里的广告贴,有几段我感觉很经典的场景,希望点点给一些同学打打气。
一段:“一年多以前,我还沉浸在大学生毕业即失业的迷惘境地里...”...."现在,我已经在世界500强之一的Motorola公司里上班"
分析:每个人的情况是不一样的,别人行,不一定代表你就行。所以如果你根本对编程没兴趣,看看有没有其它行业机会。

如何走出这个谜局:问题是你,不是工作。钱不是唯一的标准,你要看能不能给你带来事业,这个很重要。不要为了眼前的利益去放弃未来。

没有神化的技术和人。你要想成功,就一定要付出,这并不是以钱为标准。有的朋友不服气 ,为什么我付出那么多,就是没有同伴拿的多呢。问题是复杂的,也是简单的。仅仅是因为你还没有到时候而以。你要看明白自已的条件和优势,去争取而不是去投机。

你说你喜欢技术,因为他让你显的很牛,是的。很多人喜欢这种优越,但如果你想把它作为事业,或者你现在开始算起,作为事业,你就要放下所有的一切,对待每一件事。去做好它们。当你把所有应该作的事情作好的情况下,再去为你这个技术事业奉献十年,二十年的话,你就是专家级的人物了,你的优越会让你知道什么是成功。这不仅仅只有企业家才有。


2009年3月31日星期二

选好路,我们一路向前起!

如何工作,如何挣更多的钱成为我们这些打工者天天想着的事,是的,我们都很衰,只想着发财,没有其它希望。因为我们看不到希望。
错,我们错在哪里,我们天天上下求索,只想证明自已,是放在社会里来证明自已是不是爷们!谁给机会了,没有,大家都是在抢机会。这就是事实。所以如果你看到这里,你应该明白在中国的环境了,我们要找工作,是需要抢的,不是去展示自已。所以会有更多更多的变态行为出现,因为大家都是给逼的。所以我对任何人作出任何事,都以一种体谅的方向去考虑。是的,我们需要相互关心,才能一起同行。
路,路在哪里。新毕业的Coder们,是的,我不能立马给兄弟们指一条实际的路,但我想说说一些经验总结,希望能对一些朋友有用。
第一,你想作什么?是的,你首先要想好,这很关键。这和钱没有关系。因为只有你才是你的问题解铃人。
第二,男儿膝下有金,对我们来说,我们就是Coder,就是干这事的家伙,就值那么多钱,不要对别人或者老板抱幻想。我们只需要天天的Coding就是天天有事做,才是正道。这才是你的真正价值。
第三,中国适合Coding的公司或者职位不多,可以说99%没几天就完蛋了。所以不要对他们抱太大的幻想。要自立更生,创造未来。我们其实不需要hero,我们就是一群使用低级技术,外国人玩剩下来的,重复别人的轮子去创造轮子的Coder。但老外真的很需要我们,没有我们,他们就不会发展,就不会有延续。这就是我们的价值。我们才是王道。我们要对自已说,没有工作我们要创造工作,没有机会我们创造机会。两三个人,拉伙结派是成不了气候,我们需要等候,只要等机会来了,大家都能在一起,就成就一切了。