Life of Larry

A One and a Two

也无风雨也无晴

| Comments

如果一年前你告诉我,生活将会变成这样,我一定不会相信。

由于上学早的缘故,我通常比同届的同学小一、两岁。很多人对我说过「你还是太年轻」之类的字眼,我听到后往往都是抵触与不屑。也有人说我心理年龄实在太大,超过了我这样年龄的年轻人应有的想法、快乐甚至自由,我也觉得没什么。所以想想,好像大家的想法都是错觉,我也不愿解释什么。

真正让我开始反省自己心理不成熟的一面,是在面临困境的时候,内心与表现的手足无措以及并非发自本心的行动与话语,多少伤害了家人的心。我知道他们不会介意,甚至从未想起,但我深知,我做得是多么得不好。

那段时间,心理上的压力差一点就把我吞噬了。生活中的我也变得越来越敏感,偶尔午夜梦醒,就睁着眼睛发呆。跟女朋友也经常因为这样那样的事情吵架,现在看来都是那么的无关紧要。做什么事情都无精打采,球局饭局酒局能推就推,脸上似乎也常常带着忧愁,想法每天都在变,一切的一切都说明着我心智上的不成熟。

手足无措。

好在这些都过去了,生活中的一切都回到了正轨,我也调整好了自己的心态,想明白了很多问题。没有无奈与抱怨,欣慰于风雨后的平淡。

其实这一切都和我预想的不太一样,我去年写博客还说2013年想要做个自由职业者换个城市生活,上半年原本已经跟老大提了辞职准备全职 freelance 四处游荡,却发现生活中的一切都变得复杂了起来,不由得我再这么做。前几天看 Linsanity,说到林书豪心中:God first, family second, basketball third。对于现在的我来说:Family first, everthing else second.

我希望家人过得快乐,为了这份快乐,我会更加努力。

Some Useful Vim Tips

| Comments

很久以前挖坑说介绍我常用的一些 vim 插件,回头看看那篇文章的日期发现已经是快一年前了,我的 dotfiles 也已经更新过无数次了。

今天不写插件,写写一些简单又能提高效率的 vim tips 吧。

Persistent undo

也就是将 undo 操作持久化,在你重新打开已被关闭/切换的文件时,依然可以通过 u 进行 undo 操作。

1
2
3
4
set undodir=~/.vim/.undo
set undofile
set undolevels=1000
set undoreload=10000

如何重构 Rails 项目

| Comments

Am I doing it wrong?

前天在 GitHub Gist 上看到一个有趣的讨论

事情的起源是 @justinko 因为自己写的一段代码而失去了一份工作合约。那么究竟是什么样的代码「惹火」了雇主呢?

在那样项目中,当用户发表评论后,后台需要做的不仅仅是在数据库中插入一条评论记录,还需要识别出评论的语言、检查是否是垃圾评论、发送邮件以及同步到 Twitter 和 Facebook。@justinko 觉得这些代码既不应该属于 controller 也不应该属于 User model, 也不应该用 ActiveRecordcallbacks 来实现。

于是他新建了一个 PORO (Plain Old Ruby Object) 来处理这些逻辑。代码如下:

post_comment.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# app/use_cases/post_comment.rb
# Called from the "create" action in a controller

class PostComment
  def initialize(user, entry, attributes)
    @user = user
    @entry = entry
    @attributes = attributes
  end

  def post
    @comment = @user.comments.new
    @comment.assign_attributes(@attributes)
    @comment.entry = @entry
    @comment.save!

    LanguageDetector.new(@comment).set_language
    SpamChecker.new(@comment).check_spam
    CommentMailer.new(@comment).send_mail

    post_to_twitter  if @comment.share_on_twitter?
    post_to_facebook if @comment.share_on_facebook?

    @comment
  end

  private

  def post_to_twitter
    PostToTwitter.new(@user, @comment).post
  end

  def post_to_facebook
    PostToFacebook.new(@user, @comment).action(:comment)
  end
end

Use Pry Instead of IRB

| Comments

IRB 作为原生的 Ruby 交互式解释器,给每个 Rubyist 调试程序时都提供了极大的便利,包括 Rails console 都是构建在 IRB 之上。

但是有一款工具功能更加强大使用更加方便,那就是目前 Ruby 社区中很火的 Pry。现在是时候放弃使用 IRB 了。

Installation

Pry 的安装非常简单,因为它本身就是一个 gem. gem install pry (如果使用 rbenv 管理 Ruby 环境的话,别忘记 rbenv rehash)

然后运行 pry, 就可以像 irb 一样执行 Ruby 代码了。

Usage

0. Code Highlight & Indent

使用 irb 时很头疼的一点就是定义一个类/方法时,代码没有缩进,很容易写了好几行代码然后发现写错了不得不重头再写起。

使用 Pry 则完全不用担心这种问题,换行时会自动缩进,而且支持代码高亮。如下图:

换个城市生活

| Comments

8月份看到 @dhh 的几条关于纸质书籍的 tweet 让我很为赞同,而后又发了两条给我的印象更加深刻。今天特意翻了出来分享一下。

Nothing liberates you from “stuff” like learning to travel light. I never check luggage, everything fits in a carry-on. 2 days or 3 weeks.

Best thing is that you learn never to miss your crap. Which makes it that much easier to throw out/donate later. Moving is similar.

@dhh

上次旅行大概是10年10月份的时候,记得很清楚。国庆后回哈尔滨考了两门选修课,然后面了百度的二面和终面拿了Offer,火速回京签约然后当天辞掉了腾讯的实习,订了张去南京的机票,第二天就飞走和温偏两位大师重游南京了。那时候好像才跟当时的女朋友交往不到两周,但是为了旅行/兄弟…… 好吧,其实我就是想散散心,刚工作那会儿觉得太不自由了,有些不习惯。

我记得去年偏大师从遥远的重庆邮过来两本杂志,还附赠一张煽情的小纸条,「心灵和身体永远有一个要在旅行」之类的。这转眼一年多过去了,这两种旅行似乎都没有着落。

我挺能折腾的,但生活倒也不算太乱。离开团队这半年,总在回想我们究竟做错了什么,我做错了什么。也在思考到底什么样的生活状态适合自己。关于这样的问题,只有内心坚定的人才会有明确的答案吧,我应该暂时还不属于那种人。但是我属于那种想到了一种生活方式就想去尝试一下,过得没想象中的好?那也没关系,调整调整再换种方式,尝试下一种。

所以,我在想下一种是什么。没准该从换个城市开始。

Dotfiles::Vim 0.

| Comments

关于如何让生活变美好,每个人都有自己的努力方式。而我的努力方式之一就是不断完善自己开发过程中使用的工具,关注我 GitHub 的同学能发现我几乎每天都会更新我的 dotfiles. 最近觉得自己的配置已经接近我理想中的完美状态,所以决定写些文章记录一下,但愿会帮到一些初学者,或者能够收获更多的建议帮助我的 dotfiles 变得更加顺手与高效率,让我的生活更加美好一些。:-)

Brief

  • 安装有 Ruby 支持的 Vim

  • 配色方案及基本配置

  • Command-T.vim 插件:文件间快速切换的插件

0. 安装有 Ruby 支持的 Vim

首先,为什么要安装有 Ruby 支持的 Vim 呢?因为本文要介绍的 Command-T 插件依赖于 Ruby。如果你看到这里觉得还要再去重新安装一遍 Vim 觉得很麻烦的话,不妨先跳到后面介绍 Command-T 的部分。然后你就会发现花一点时间来做这件事是很值得的了。

Reading Rails: ActiveSupport::Concern

| Comments

ActiveSupport::Concern 模块除去注释外只有29行代码,但是却有着不可忽视的作用。它使得 modules 之间的依赖关系处理起来更加得优雅。

假设我们有两个模块 Foo 和 Bar,Bar 模块依赖于 Foo 模块。然后 Host 类希望包含 Bar 模块获取其中的实例方法。

module_dependency_sample.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module Foo
  def self.included(base)
    base.class_eval do
      def self.method_injected_by_foo  # 在 base 模块中定义一个类方法
        ...
      end
    end
  end
end

module Bar
  def self.included(base)
    base.method_injected_by_foo  # 调用 base 模块的类方法,该方法是在包含 Foo 模块时动态定义的
  end
end

class Host
  include Foo  # 我们需要包含 Foo 模块,因为 Bar 模块依赖于 Foo 模块
  include Bar  # 但是 Bar 模块才是 Host 类真正需要的模块
end

也许你会想:既然是 Bar 模块依赖于 Foo 模块,为什么不直接在 Bar 模块中包含一下 Foo 模块呢?就像下面这样:

重看一一

| Comments

前几天推荐朋友看一一,自己也翻了翻旧文,才记起是两年前看得这部电影,但却一直觉得它陪了我好久。大概只是印象太深刻的缘故吧。

我们究竟错过了什么?

NJ去东京出差,和初恋女友一起。镜头不断的变化着场景,但都只是他们两个人絮絮叨叨的说着旧事。他们说起第一次牵手的场景,镜头闪回到台北,就像30年前一样,火车经过,婷婷的男友也牵起了她的手。而NJ和阿瑞,时隔那么多年,再一次牵起了手,时间不同,地点不同,没变的是NJ的手还是紧张得出了好多汗;她怪他,怪他当年等他一直都等不到,怪他不理她,怪他让她的生活没有了希望;他也怪她,她让他考电机系,他考上了,父母家人还有她都很开心,但NJ自己却高兴不起来,她并不在意他原本想要什么的生活,然后他便选择了离开。

NJ说人是不能让另外一个人去老教你怎么活下去,怎么过日子,那样是很悲哀的,但偏偏这个人确是他最爱最爱的人。最后一晚,阿瑞关上门后,NJ又敲开门说:我从来没有爱过第二个人。

四季轮替

| Comments

前几天看了最近挺火的英剧Black Mirror,难以避免得再次装逼似的陷入了”深深的思考”。虽然有些所想与这部剧没无太大关系,但也都一并记下吧。

0). 你原本只是怀揣着单纯美好的梦想,或者只是平淡生活的小小目标。你住在狭小的屋子里,每天机械的重复着无聊的事情。直到遇见自己喜欢的姑娘,陪她聊天听她唱歌就很开心了,甚至耗尽自己的所有送她上了最大的舞台,在背后鼓励她支持她。可她最后抵挡不住诱惑屈从了内心深处的欲望,背叛了自己,也背叛了你。你愤怒至极,你甚至想过自暴自弃。后来你通过逆天的努力登上了同样了舞台,你把满腔的愤怒全部发泄了出来,你向权威宣战你与整个世界为敌。可是结果呢,多让人意想不到啊,摆在她面前的诱惑同样摆在了你面前。那是曾经让你多么不屑、恼怒与鄙视的诱惑啊,可你并没有像当初你本希望她那样的果断拒绝,同样的选择了接受。讽刺的是,结局只是你从狭小的房间搬到了大一点的房间,而已。