推荐 Robin Lu 的 XCode Theme

May 15th, 2010

这两天开始用 XCode,第一要务是换一个养眼的主题,内置的深背景主题只有一个 midnight,太纤细,泪眼。

换上 Robin Lu 自制的黑暗城市(Dark City),畅快多了,推荐!

Livid 的推荐下将字体换成 Panic Sans,效果见下图

图片 1.png

Rails3 中 ActiveRecord API 的变化

May 14th, 2010

Rails3 中 ActiveRecord API 的变化从书写上看已经是翻天覆地了,过去查询条件都是用 hash 的方式写到 finder 里面,现在全部转化成了 method 调用的串联。

比如过去的:

Post.find(:all, :condition => “user_id = 1″, :order => “id desc”, :limit => 10, :include => :replies)

在 rails3 中要写成:

Post.where(”user_id=1″).order(”id desc”).limit(10).includes(:replies)

看上去好似 named_scope

完全正确,rails3 针对 AR API 改写的目标就是:Everything is named_scope.

rails3 中对 ActiveRecord 的 API 改写成了完全符合 ActiveModel API 的样子。而 ActiveModel 相当于 ORM 这一层的接口,ActiveRecord 是一种具体实现,当其他的 ORM(如 DataMapper)都复合 ActiveModel 这样的接口时,针对 model 部分的插件(如 will_paginate)就可以通用了。

Install rails 3 on my Mac

May 13th, 2010

安装 rails3 必须有 ruby 1.8.7 以上,原因是 1.8.7 修复了 1.8.6 中的一个关于 hash 的 bug

又怕现有的项目和 ruby 1.8.7 不兼容,于是乎决定安装 RVM(ruby version management),方法很简单:

gem install rvm
rvm-install
rvm install 1.8.7
rvm 1.8.7 –default

但是 rvm 识别不到我之前用 macports 安装的 ruby 1.8.6,想用的话就要:

rvm install 1.8.6

用 which ruby 检查一下到底装在哪了:

/Users/suave/.rvm/rubies/ruby-1.8.6-p399/bin/ruby

接下来安装 rails3:

$ sudo gem install tzinfo builder memcache-client rack rack-test erubis mail text-format bundler thor i18n
$ sudo gem install rack-mount –version=0.4.0
$ sudo gem install rails –pre
$ rails -v
Rails 3.0.0.beta3

自动服务器文件备份到S3

May 13th, 2010

服务器上有很多用户上传的文件,需要定时备份。从安全角度讲一定要做到物理分离,如果有两台服务器在同一个内网,自然 rsync 就搞定了。

可怜资源有限,只有一个VPS,硬盘也紧张。于是乎想备份到 S3,云存储,可靠性好。而且用于备份,主要是存储产生的费用,流量费用很低,总体下来不会太贵。

用镜像的方式备份到 S3 上,可以用 CNAME 的方式直接将 static.yourdomain.com 指到 S3 上,替换本地存储系统,这也是一大好处。

找到一个 s3sync,ruby 写的,本地测试OK,即日放到服务器上检验一下。

用法很简单,下载后将 s3config.yml.example 改为 s3config.yml,并在里面填上你的 aws_access_key_id 和 aws_secret_access_key。如果上传的内容不是非常敏感,可以将 ssl_cert 那行去掉。

默认的 s3config.yml 比较让人纠结,竟然不在当前路径下查找,我改了一下 s3config.rb

confpath = ["#{ENV['S3CONF']}”, “#{ENV['HOME']}/.s3conf”, “/etc/s3conf”]

改为

confpath = [".", "#{ENV['S3CONF']}”, “#{ENV['HOME']}/.s3conf”, “/etc/s3conf”]

小问题:s3sync 工作的时候看不到进度,不好 debug。不过在生产服务器上用 cron 跑的话进度也确实没用。

另外还有一个方案,有兴趣的同学可以试试

QClub - 豆瓣存储经验分享

April 15th, 2010

上周六QClub上听了豆瓣的存储经验分享,豆瓣对问题分而治之的策略应用的很到位,有收获。

目前豆瓣的数据量是:

  • 200G 结构化数据(关系、广播等,特点:记录小、结构固定、经常关系查询)
  • 800G 文本数据(9点的博文)
  • 10T 图片
  • 6T 音乐

对数据库的关注主要是:可靠性(持久化、一致性),可用性,伸缩性,性能,成本 …
而通常一个数据库只能解决两方面的问题。关系型数据库的优势是一致性和可用性,Key-Value数据库的特点是可用性和伸缩性,所以针对不同类型的数据,要采用不同的存储方式

豆瓣使用关系数据库的经验:

  • 使用 InnoDB,并发性能好
  • 使用基本查询,避免 join,在应用层做连接处理
  • 分离大的文本字段
  • 使用 master(rw) - master - slave 结构,读写都使用一个 master,另外一个做 fail-over 的备份,slave 做备份用,双master手动切换,多实例混合部署,没有用 replication,因为存在复制延时。硬盘使用双 SCSI 做 raid0

豆瓣对 MySQL 使用垂直分表,设计时控制好表的宽度,无关数据分开存储(如书、影、音的收藏),单表1亿条数据性能没问题。
使用双master结构便于运维,比如修改表结构时,可以修改备用的 master,然后同步

小文件(图片、博文、音乐)的特点:

  • 主要是 get, set, delete请求,一般不会 update
  • 高可用性,要有 fail-over 机制
  • 占用空间大,10K-5M,增长非常快
  • 因为修改少,对一致性要求低
  • 访问带有高随机性

对小文件的单机文件系统存储系统可以用 reiserfs 3.x (4.x 不能用),远程文件系统可以用 WebDAV,比NFS靠谱,要设计要目录结构,备份可以用 rsync。
多机文件系统存储可以用 MogileFS,瓶颈在 Tracker 上,因为文件的索引信息都记录在一个中心节点的 MySQL 上,适合几十万到一百万的量级,机器故障时数据迁移很慢,因为要拷贝大量小文件。

BeansDB 是豆瓣为解决自己的业务场景开发的一款 key-value 数据库,现已贡献到开源社,此物具备以下特点:

  • hash 路由,无需中心节点,一个简单的路由表即可
  • 数据存储使用 tokyo cabinet
  • 读策略:依次读,直到读到数据为止
  • 利用 HashTree 同步
  • 保证最终一致性,短时间内不保证一致性
  • API接口遵循 memcached 协议

目前豆瓣一年多的时间,部署5台服务器,存储了4T,1.5亿个文件,冗余3份

日志文件存储:

  • 文件大,10M - 10G
  • 重要,不修改,可打包存储
  • 数量少,一天几个
  • 不能阻塞业务逻辑
  • 偶尔使用,可用性要求低

可以使用类GFS分布式存储,豆瓣用的是MooseFS,有FUSE client, Web 界面, 支持 hadoop cluster。日志分析导入数据仓库处理,使用 InfoBright(开源),商业的可以选择KDB+,更多规模可以自行使用 hadoop 的 map-reduce 构建。

另外豆瓣的全文检索用的是 Xapian

银行家的梦想 - Ramji 来华交流会分享

April 15th, 2010

4月7日应友成基金会的邀请,参加了 Agastya 基金会创始人 Ramji 先生首次来华的分享交流会。

Ramji 先生是 爱创家(Ashoka)基金会的 Fellow,他曾在纽约和伦敦做过十几年的 Banker。他年轻时的梦想是在印度创办一个精英学校,培养未来的印度领导人。后来在朋友的建议下,他改变了想法,创立 Agastya 基金会,通过 Mobile Lab 激发每一个孩子的好奇心和创造力。

Mobile Lab,就是一量卡车,装着一系列的实验设备,在很多村子之间巡游,每到一个村子都有专门的指导员和村里的孩子们一起做实验。通过分享会现场的视频演示,实验的互动性非常强,孩子们都能参与其中,很开心,在这个过程里不知不觉的对科学产生了好奇和兴趣。

目前 Agastya 基金会有60%的资金来自于私人投资,40%来自于政府支持。目前已有50个 Mobile Lab,5000名儿童导师,可以覆盖200万儿童;建立1个小区、1个科学博物馆,占地200英亩。下一步的目标是将其推广到整个印度。

Ramji 先生的分享非常简短,把大部分时间都留给了听众提问,我也记录了一些不错的问题:

Mobile Lab 走了以后会给孩子们留下实验设备让他们自己探索么?

Ramji 先生表示目前比较遗憾的时,不能给孩子们留下什么实验教具,供他们继续学习。
为此他们也开发了出了工具包,希望政府能够采购,发放给孩子们。

博物馆的建造和运营成本很高,Ramji 先生是如何做到的?

博物馆所在的校区投资没有政府的参与,
全部来自于私人投资,主要做一些前瞻性的研究项目。
博物馆的成本分摊到所有收益的孩子身上,每人只有30美分,
而且这笔钱也不要孩子自己负担(他们负担不起),
但对投资人来说这样的投入产出比他们非常满意。

最大的挑战是什么?

实践过程中,最大的挑战来自于 Mobile Lab 的指导员,
他们只有一次可以让孩子们永生难忘的机会,去激发他们对科学的兴趣。
他们开发了大量的科学玩具(science toys),
同时每年邀请印度优秀的教育家、科学工作者参加研讨会,对教学内容不断修正、创新,
现在已有超过300个实验内容。

Mobile Lab 给孩子最大的改变是什么?

Mobile Lab 里面的实验最大的特点是参与性、互动性强。
通过参与实验,孩子们学会了沟通,提升了自信。
我认为这是 Mobile Lab 带给孩子最大的改变。

您认为社会企业创业最重要的是什么?

想的远一点(银行家通常只看眼前利益);
一个好的团队;
大胆创新;
享受自己做的事

在 Agastya 基金会的工资如何?

开始是拿70%的当地平均工资,2-3年后会超出当地平均工资

下一步的目标是什么?10年后的目标是什么?

下一步希望括扩展到全印度,但这需要合适的合作伙伴。
如果有合适的机会,也愿意推广到中国来。
10年后的目标是让5000万儿童收益,并培养500万名儿童指导员。