互联网之漫谈(一)

June 17th, 2009

事情的起因是这样的:因为27号上海有一次Facebook开发者大会,我原来的公司,现在的五分钟,将会出席演讲。和Ellison在Gtalk上聊了会天,然后和女朋友打电话,话匣子就打开了……

今天先说说钱。

早在2000年互联网泡沫破灭之前,钱是个什么概念?当时的社会在我看来,赚钱的传统行业。哪些算传统行业呢,我觉得吧,最恰当的例子就是,商品是一种交换物,可以换取等价的货币。这么说有点拗口,但是反过来,就是你花钱买了一样货品,这就简单了!那么依靠这种商品的流通而赚取利益的行业,我称之为传统行业。

在这种行业当中,钱的概念在人的脑海中会被具象化,这种影响是潜移默化的,比方说,你对一个人描述1000万,很难抽象的描述清楚,但是当你和他说,市中心的5套房子,那么他对这个价值就会有一个清楚的认识了,两个人在这问题上才能取得共识,才会有继续深入的交流。

方才和女朋友聊天,她和我不同,我从互联网盛行之处就站在风口浪尖上接受摧残,亲身经历过99年-2000年之间泡沫破灭的过程。不瞒您说,当初我就是推手的一份子。当全中国沸沸扬扬抗起互联网大旗,号称要闯出一番事业,此所谓冤大头。冤大头有“梦想”,有“钱”,总有人要贯彻下去吧,于是底下的工作人员,一般都是程序员,就称为推手了,拿钱干活,将冤大头推落深渊的推手。扯远了。

当时砸钱的那个规模,就如我刚才所说,光用数字无法给人感官体会,直接说哪些个投资占当时经济总产值多少多少来的直接点,只可惜已经无可考证了。那时候人的心态,已经跨越了理性的边缘,近乎疯狂。你想啊,传统行业,一年的营业额也就那么点钱,开个店人家敬称您为老板,乐啊,倍儿有面子。现在冒出来个英特耐特,动动手指头就比您老辛苦一年买卖赚的还多个XX倍,这还能理性么?

一浪又一浪,后浪推前浪,钱就这么去了,这么起泡沫了,这么消逝在闪烁的硬盘灯之中,在比特世界无影无踪。

这时候钱是个什么概念?已经不再有一个具象化的描述了,多少多少风投,多少多少推广,只不过一个一个的数字而已,虚!我已经司空见惯,可是当我和她交流的时候,我才猛然醒悟:对大多数人来说,互联网还是个很陌生而不可思议的东西,这玩意儿怎么个赚钱法。即使我仔细给她粗算各种收入的比例,成本,等等,对她来说还是过于陌生了。

是啊,谈何容易,在这个时代,钱的概念已经被抽象到游离于物质价值之外,或者说,被一种非物质的存在打破了,那就是信息。说到这个词,我想起中学时候的计算机客,讲信息的定义。当时原文意思是这样讲的:举例说,书上的文字并不是信息,应当称之为载体;文字中所传达的能为人所理解的意义,称之为信息。多么抽象的文字啊,反正当时没多少人能理解也没多少人去相信,就这么填空去了。再回国头来看现在,这种抽象到不能再抽象的东西,却能换来实实在在的钱,和传统行业一比较,能让人接受么?

当我说,一家互联网公司,每年能盈利几百甚至上千万,她就更加怀疑了,而且我很失败,没能解释清楚,反而搞到她心情很糟糕,没做好男朋友的工作啊……又扯远了。总之,我很难解释清楚,为什么现在在我,以及在这个行业中,几百万并不是很大不了的事情,仅仅是数字的大小比较而已。

而“钱”这个概念的转变,以及度量的标准的不同,成了一个分界线。我一直认为,做什么事情能赚钱?就是做那些不把钱当钱的,比如金融,钱就是计算的工具,和数学公式没什么区别,代表是华尔街投行;又比如互联网,钱就是用bit换来的,在物质上什么都没付出,代表就是互联网及其上的整个世界。

说的很乱,不过这几篇博客本来就是乱弹,无所谓,我只是有感而发,想畅通一下,仅此而已。各位看过了,就当是比特好了。

Thinking

清明

April 7th, 2009

清明时节。
雨。
纷纷路上行人,
欲断魂。
借问酒家何处?
有牧童,
遥指杏花村。

无类别

iDeneb 蓝屏

March 9th, 2009

在 PC 上安装 iDeneb 1.4 - Leopard 10.5.6,显卡 9600GT 512MB,调整分辨率、刷新率都会导致蓝屏,其原因在于 leopard 默认输出至主输出端口(出现这个问题的显卡都有两个输出端口),而蓝屏实际上就是第二个显示屏的内容。

解决办法:把显示器插在主输出端口上,一般靠近金手指的为主输出。

无类别 ,

Messenger:Mac with Safari 4

March 4th, 2009

更新了 safari 4 以后 microsoft messenger:mac 出现一个奇怪的问题,每次发送一条消息以后,输入框都会失去焦点,就是说没办法连续输入第二条消息,只能tab一下或者是点击一下。很 suck 的 bug!

在 apple 和 microsft mac 论坛都查了一下,都是更新 safari 4 以后引起的,还不确定是因为 webkit 的关系,还是 security update 的关系。回到 safari 3.2 可以解决问题,但是,谁舍得?作为一个优秀的浏览器,即使是 beta 版本也给所有 mac 用户带来震撼的体验,我想没什么人会舍得降级。

那么,就等待 ms 或者 apple 发布 bug fix 补丁吧,相当的无奈 :-(

无类别 , ,

扩展 Paperclip

January 23rd, 2009

Paperclip 是 Rails 的一个处理 attachment 的插件,相对于以往的 FileColumn 在灵活性和效率上更胜一筹,而且代码也比较好看。这个视频 简单的介绍了 Paperclip 的使用方法。

默认的设置,URL 的占位符中与模型本身相关的只有 id,但是一些情况下,你可能会更希望以其他形式来组织你的附件目录 - 比如以 SKU 来代替数据库记录的 id。这里我们暂不讨论这种做法的好坏,双方面的,好处是目录结构更具有维护性,坏处是万一以后升级数据库,SKU 加个前缀什么的……

Here we go!

使用 paperclip 需要在 model 中调用 has_attached_file 方法,检查文档,有一些简单的使用样例,但是没有我们需要的。通过方法描述我们知道这个方法建立了一个 Paperclip::Attachment 对象,我们继续看文档。对象的方法很少,首先思考:应为我们需要配置的是 attachment 的 url 规则,那么应当是对应整个类而不是单个实力,因此我们只关注 Peperclip::Attachment 的类方法,只有两个。default_options 没有描述,而且展开代码发现并不是我们需要的。

# Paperclip::Attchment.interpolation

A hash of procs that are run during the interpolation of a path or url. A variable of the format :name will be replaced with the return value of the proc named “:name”. Each lambda takes the attachment and the current style as arguments. This hash can be added to with your own proc if necessary.

这正是我们需要的,接下来的扩展就非常方便了:


# app/models/product.rb
class Product < ActiveRecord::Base
  has_attached_file :photo,
    :style => { :thumb => '64x64>' },
    :url => '/images/products/:to_param.:extension'

  def to_param
    return self.sku
  end
end

# config/initializers/paperclip.rb
Paperclip::Attachment.interpolations.merge!(
  :to_param => lambda { |attachment, style| attachment.instance.to_param }
)

在这里不直接使用 :sku 作为占位符而使用 :to_param 是为了在其他模型中更加的灵活。

Ruby on Rails ,

Rails 之一月动态

December 25th, 2008

一个多月之前,Rails 2.2.2 发布了,同时,官方紧接着发表声明,称 Rails 2.3 正在开发中。看到这个消息,一边感叹于 Rails Core Team 进度之紧凑,同时开始做一件很有意思的事情:在接下来的事件里,每天都检查一次 http://github.com/rails/rails/tree/master 上的所有 commit。除了常规的性能优化调整、更独立的代码结构之外,的一系列提交揭示了 Rails 的下一步:

  • Joshua Peek 初次提到 middleware (commit),接下来似乎是他一直负责这部分的开发
  • 官方博客的每周更新,Rack integration 开始与 Rack 整合的步伐,middleware 开始频繁出现在以后的代码中
  • 紧接着的 This Week in Edge Rails,开始移除与 CGI 相关的代码
  • 官方博客介绍 Rails Metal
  • Session Storage 也迁移至 Rack (commit, commit)
  • 随后的几个大 commits 将 Rails 从 CGI 解放
  • Merb 将与 Rails 3 合并

可以看出,高扩展性会是 Rails 2.3 的卖点之一,同时,开发团队似乎有想法把 Rails 设计的更加“热插拔”,通过引入 middleware,在将来会有更多的选择;而与 Merb 的整合,则可以借鉴其中优秀的设计思想,在更高的版本中加以实现和整合。

于此同时,Ruby 1.9.1 也在紧密开发之中,不过道路并不平坦,RC1 的发布延迟到 09 年的 1 月份。正如 Robbin 所说,09 年的 Rails 很灿烂

Ruby on Rails

Merb 将合并至 Rails 3!

December 24th, 2008

原文地址:Merb gets merged into Rails 3!

一直一来,关于 Merb 与 Rails 之间的优劣与取舍之间的争论,伴随着两个框架的不断发展而没有停息。终于,在圣诞前夕,Merb 终于要于 Rails 3 合并了!

原文同时指出,这次的合并不是大规模的 Rails 代码重写(This is not a big bang rewrite),相对的,作为第一个合并的版本,两个团队更倾向于让两者并存,用户可以根据实际需求选择适合的组件(比如 ActiveRecord / Sequel / DM 作为 ORM)。无论如何,我个人都觉得这是一个非常好的开端,Rails 有了 Rails 以外的思想,将来必定会更加精彩!

最后,在 timeline 安排上,目前开发团队的主要精力还是在 Rails 2.3(我自己连续 3 个星期在关注于 Rails 2.3 Edge 的 commits,准备了另一篇博文),2.3 将会在 09 年的 1 月份放出,then all eyes will be on Rails 3!

Ruby on Rails ,

Rails 2.2 正式发布

November 24th, 2008

Rails 2.2 从 RC1 到 RC2,终于发布了正式版(版本号 2.2.2),需要 gem 1.3.1。带来的新特性包括 I18N / Thread Safety / Connection Pool / Ruby 1.9 Compatibility 等等。

自己从 edge 一路紧跟 rails 步伐研究过来,随后会发表一些个人的实践和看法。

前段时间的热点:DHH 回应 Mongrel 作者的质疑,撰写系列文章:The Rails Myths 。原本打算一同翻译这6篇博文以及 rails 2.2 的新特性,因为种种原因不了了之……

Rails 2.2 官方博客:http://weblog.rubyonrails.org/2008/11/21/rails-2-2-i18n-http-validators-thread-safety-jruby-1-9-compatibility-docs

Ruby on Rails

终于搞定了这个 blog!

September 30th, 2008

周末的时候买下自己的域名 hozaka.com,再赖上 Weston 的空间,终于可以给自己的 blog 安个家。

WordPress 的安装出乎意料的简单,界面也很友好,先赞一个。默认的模板比较水,可以在 http://wordpress.org/extend/themes 找到很多精美的设计。只不过对我来说,这些模板的代码是在是很糟糕……

在小破 PowerBook G4 上配置好 apache+php,开始动手 redesign,无奈我是 PHP 菜鸟级人物,只能凭经验和语感去写代码,不过似乎运气不错,没怎么见到 php 的 500 页面,哈哈 :)

折腾了半天,终于把几个页面都做好了,马上上传,本来还想导入以前的博客来着,不过 blogbus 的 rss 系统不是怎么友好,还没办法得到所有的 feeds。

庆祝庆祝!谢谢 CCTV,谢谢 Channel[V],谢谢 Weston

无类别

ActionView 的魔术:ERB & Binding

August 13th, 2008

Rails 作为一个 MVC 框架,其核心包括三个模块:ActiveRecord,ActionController 和 ActionView。今天这篇博文的主角是 ActionView,解开模板系统的魔术。通常情況下,通过 scaffold 已经能够建立简单的、包含CRUD基本功能的页面,完全不需要手动修改 view 的代码。即使不使用 scaffold ,Rails 也提供了众多的辅助方法,创造一个功能丰富的动态页面简直是易如反掌。但是,会用不代表深入理解,最近有朋友问我这些问题:

  1. 为什么编辑一个对象需要在 Controller 创造一个实例变量
  2. View 通过什么方式访问这些实例变量的
  3. 那么多表单辅助方法,都是需要提供 object_name, method 两个参数,怎么就变成实例变量的值了

相信大部分的 Rails 程序员手边的书都是《Agile Web Development with Rails》,书中提到这一点的时候一笔带过,只是说 Rails 在这里用了一个小魔术。这里,我们就来揭开这个魔术吧!

Part 1. Template Files - 模板文件

当一个 action 需要返回一段 html 片段的时候,我们需要建立一个模板文件。根据不同的版本、请求类型,模板文件的文件名也各不相同,从早期版本的 action_name.rhtml ,到现在的 action_name.text.html.erb ,以及扩展的 rjs,在扩展名中都包含了一个关键字:r / erb。它就是 Rails 模板系统的关键:ERb。

Part 2. ERb - Ruby Templating

ERb - 嵌入式 Ruby (http://ruby-doc.org/stdlib/libdoc/erb/rdoc/index.html ),是 Ruby 语言提供的一个基本扩展。它支持在字符串中嵌入 ruby 代码片段。看上去似乎很神秘,其实我们每天都用到,下面这种形式一定不陌生吧?

<h1><%= @user.name %></h1>

没错,正是因为 ERb 的存在,使得模板中可以动态地引用对象的属性。

Part 3. Instance Variables of Ruby - Ruby 的实例变量

让我们回顾一下 Ruby 语言的基本要素之一:实例变量。通常我们通过

@time = Time.now

的形式创造一个实例变量。这里我们不重新解释对于“实例变量”的定义,但是必须牢记一点,正如字面所见,实例变量的作用域是当前实例内,也就是说, 只有在实例的内部,才可以直接对实例变量进行读写操作(扩展的访问子方法等等不在讨论范围之内)。那么,为什么 Rails Controller 里创建的实例变量能够在 View 里面访问呢,不是自相矛盾吗?

Ruby 作为一种动态语言,因为其“开放”的特点,使很多原本不可能的编程模式变为可能。比如,通过 Open Class 的特性,你可以动态的为对象注入新的方法定义,或者改写方法的逻辑,或者,通过不同的方法可以在对象的外部访问对象的内部的实例变量。经常使用 console 的朋友可能会了解其中的一种方式:Object#instance_variable_get / Object#instance_variable_set 方法。举个简单的例子:

class User
  def initialize( name )
    @name = name
  end
end

user = User.new( "Jack" )
user.name #=> raise NoMethodError
user.instance_variable_get('@name') #=> "Jack"
user.instance_variable_set('@name', 'Tom')
user.instance_variable_get('@name') #=> "Tom"

可以看到,在没有任何访问子的情况下,我们用这种方式对一个实例变量进行读写操作。

除了这种简单的方式,还有另外一种进阶的方式,也是 ERb 常用的一种方式:Binding

Part 4. Binding

Binding (http://ruby-doc.org/core/classes/Binding.html ) 是 Ruby 语言的自身的一个特性,在任何对象内,self.binding 方法都会返回一个当前对象关联的 binding 实例。不精确的说,binding 对象可以理解成为当前对象的完整的上下文环境。文档中已经包含了一些示例代码,帮助大家理解 Binding 对象的作用。最重要的一点是:既然是当前对象的完整上下文环境,自然就包括了对象的实例变量。

那么 Binding 在 ERb 中扮演一个什么样的角色?是一个运行环境的提供者。

回到我们最初的问题,Rails 在 ActionView 中使用了什么样的魔法?答案就是 ERb 和 Binding。首先,获得当前实例的 binding,自然,binding 内也包括了实例变量;紧接着,ERb 允许将模板的内容动态地,绑定到另一个环境中运行。我们依然用刚才的 User 的例子来说明这一点:

# A simple template string
template = "Hello, "
@user = User.new( "Jack" )
# Get binding
binder = self.send( :binding ) # calling a private method# Rendering template
puts ERB.new( template ).result( binder )
#=> "Helo, Jack"

虽然例子不是非常恰当,但是足以展示 Binding 和 ERB 的用法。我们可以看到,ERB#result 方法将模板字符串绑定在另外一个环境中运行,而这个环境包含了我们创建的 @user 实例变量,因此,模板中的 @user.name 得到了正确的值。

这就是 ERB 的真面目,也是为什么在 ActionView 中能够访问到 Controller 里实例变量的原因。感叹一下动态语言的强大吧!以上只是非常粗糙的讲述ERB的使用,Rails 所做的魔法远不止如此,如果有兴趣,可以查看 Rails 源代码,对于深入学习 Rails 框架也有很大的好处。

最后,补充一下 ERB 的应用场景。虽然在普通的需求中,ActionView 所做的已经足够,但是某些情况还是需要创造独立的模板系统。比如某个场景,客户要求提供一个完全自定义的模板系统,这个时候 ERB 就大显身手了。只需要将数据源载入实例变量中,并且在使用手册里列出可以访问的方法,即使完全不懂 Ruby 语言也可以写出使用这套简单的模板系统了。

Ruby on Rails