learn by doing something!

life notes

try(), 让你的Rails代码更简洁

| Comments

看看这样的代码?

1
2
3
<% if current_user && current_user.is_admin? %>
 <%= do something %>
<% end%>

而事实上可以写成这样

1
2
3
 <% if current_user.try(:is_admin?) %>
     <%= do something %>
 <% end%>

current_user为nil的时候,try不会抛出异常,而是返回nil

多个try还可以链接调用

current_user.try(:is_admin?).try(:home_address)

传参数和block

1
2
  current_user.try(:is_old_than?, 21)
  current_user.orders.try(:collect) { |p| p.order_id }

能用mbp和rMbp的充电器给air充电吗?

| Comments

能用Macbook Pro或者Retina Macbook Pro的充电器给Macbook Air充电吗?一个功率是45w,一个是85w(13’的是60w),可以还是不可以?

能用给iPad充电的插座给iPhone充电吗?两者输出的电流不一样。可以吗?

今天给一个官方正式的答复,可以!

来自苹果官方的回复

Power adapters for Intel-based Apple notebooks are available in 45W, 60W, and 85W varieties. Although you should always use the proper wattage adapter for your Apple notebook, you can use an adapter of a higher wattage without issue.

For instance If you have a MacBook (13-inch Late 2009) that normally uses a 60W adapter, you can also use an 85W adapter with that computer. You would not use a 45W adapter with that computer; it would not provide enough power for that MacBook. 

Using an adapter of higher wattage than the adapter that came with the computer will not cause the computer to charge more quickly or otherwise operate any differently than using the adapter that came with the computer. The tables further down in this article show the style of connector that initially shipped with each model of MacBook, MacBook Pro, and MacBook Air. 

简而言之,就是可以用功率高的,给功率低的充电,反之则不能!

用dropbox同步sublime text的packages的正确方法

| Comments

Sublime Text之所以那么强大,是因为她支持各种各样的插件包,几乎你能想到的她都有。因此把Sublime Text配置到让你觉得舒服的情景是一件比较繁琐的事情,你绝对不会想要配置第二遍。 当然作为一个程序员,想尽一切办法也不干Repeat的事情。

怎么办?同步嘛,用各种同步软件在各个机器上保持同步,比如Dropbox。

在主机上

1
2
3
4
cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages/
mkdir ~/Dropbox/Sublime
mv User ~/Dropbox/Sublime/
ln -s ~/Dropbox/Sublime/User

在其它机器上

1
2
3
cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages/
rm -r User
ln -s ~/Dropbox/Sublime/User

这里同步是只有Packages/User/文件夹,而不是整个Packages文件夹。这个文件夹包含了Package Control.sublime-settings文件,这个文件包含了安装的包和配置信息,当在另一个Sublime Text开启时,他会根据这个文件自动检测,安装包含的包,还解决兼容性问题。

uses of modules in ruby part 1

| Comments

Module在Ruby中扮演着至关重要的角色,如果你从是Java或者C#背景转到Ruby来的,一开始你通常会忽视掉Module的重要性。直到你深入学习Ruby,你才会发现Module有多么重要

作为命名空间

作为命名空间这个功能十分好理解,模块嘛! 比如你创建一个Document的类,由于Document这个字非常常见,因此别人也使用它作为类名的概率不低。

如果碰到这种情况,那就苦逼了。由于Ruby对于Class的定义方式,Ruby检测到两处定义同一个Class并不认为有问题,而是把两个类的定义合并(Monkey Patch就是这么实现的)。如果遇到同样的方法或字段,后定义的会覆盖前面的。

用作MixIn

Module可以被用来代替Monkey Patch, 以mixin的方式给类定义增加方法

include module
1
2
3
class Computation
  include Comparable
end

通过Include Comparable这个module,Computation类定义就有了Comparable的各个比较方法,<, <=, >, >=, ==等。 Computation类的实例也就有了这些比较方法。

当把include一个module到一个类定义中时,ruby会把这个module加入到这个类的class chain上,比如

include module: added to class chain
1
2
3
4
5
6
7
8
module A
end

class AClass
  include A
end

AClass.ancestors => [AClass, A, Object, Kernel, BasicObject]

所以,所有AClass的实例都会有Module A中的方法。

除了include, 还有extend

extend module
1
2
3
class Computation
  extend Comparable
end

通过extend来扩展Computation本身(类对象本身),由于Computation类本身也是一个对象,通过extend扩展的方法会增加到这个对象上,而不是Computation作为类定义上,因此Computation本身有<, <=, >, >=, ==这些方法,而Computation的实例对象没有。

不同于include,extend的module不会被加到类的class chain上。

Module还有一些更复杂的使用方法,比如模拟Singleton模式,下回介绍

在多台电脑上保持Octopress博客的同步

| Comments

使用Octopress在Github Pages上建博客,根据Octopress官网的介绍建立好博客后,想在另一台电脑上写文章时,如何设置?

按照官网的介绍再来一遍会把已经发不到Pages上的全部删掉。当然可以把已经有的文章copy下来,再发遍就是了。但是这么个搞法,起初的那台机器就又不行了!肯定会有更好的解决方法

Octopress项目结构

其实整个Octopress项目无非是一个git文件夹,只是他借用了git的branch功能。

整个project的源文件在source的分支上,编译后的_deploy在master分支上,而Pages会读取master分支上的,因此打开username.github.io看到的是和本地预览时看到的一样的,而不是一堆源文件。

完全复制项目

既然是一个git项目,那就可以整个克隆下来,只不过是要克隆两次。首先克隆source分支。

git clone -b source git@github.com:jun1st/jun1st.github.io.git

再克隆master分支,master分支默认的文件夹路径是_deploy

git clone git@github.com:jun1st/jun1st.github.io.git _deploy

就这么简单 PS: 这里的路劲是我的项目的地址,别一起复制了:)

之前解决这个问题的时候,就想写这篇的,又觉得太简单就算了。今天不知道怎么搞的,pro上的项目又乱了,又弄了一次,也就写了,做个记录。

Capistrano 3中配置unicorn和whenever 的Task

| Comments

升级到Capistrano 3之后,之前配置的重启Unicorn等的脚本都不行了,StackOverflow上一堆解决方案就是不要升级,继续用2.x版本。顺便吐槽下SO的问题和答案的质量越来越低了

配置Unicorn的Task

配置Whenever的Task

在deploy.rb中配置用到的参数,调用Task

deploy.rb
1
2
3
4
5
6
7
8
9
set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}"}
namespace :deploy do
  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart'
    invoke 'update_crontab'
  end
  after :finishing, 'deploy:cleanup'
end

升级到Capistrano 3

| Comments

最近开始把Rails项目中用到的Capistrano升级到3,发现这个变化有点大,第一次尝试的时候发现一堆的错误,因为急于发布,只要退回到版本2了。之后开始慢慢搜集网上关于新版本的变化和设置,做升级准备。

更新Gemfile

读一下官方的升级文档,也许没有兴趣全部读完(比如我),但是扫一遍还是很有必要的。

1
2
3
4
5
group :development do
  gem 'capistrano'
  gem 'capistrano-rbenv', github: "capistrano/rbenv"
  gem 'capistrano-rails', '~> 1.1.0'
end

然后bundle install

修改Capfile

这个文件的变化是比较大的,如果升级了Gem没有改这个文件,那执行时第一句可能出错了。

1
2
3
4
5
6
7
8
9
10
# Load DSL and Setup Up Stages
require 'capistrano/setup'
# Includes default deployment tasks
require 'capistrano/deploy'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

配置config/deploy/production.rb

在Capistrano 2中,指定Server时不需要设置User,但是在3中就必须指定使用的User了。

1
2
3
set :user, 'deployer'
set :stage, :production
server ‘server_address’, user: 'deployer', roles: %w{web app db}

官方的文档虽然很不完整,还是不读是肯定升级不了的。

从Sublime Text 2 升级到Sublime Text 3

| Comments

Sublime Text 3 Beta推出已经有半年多了,基本上所有的插件都支持3了,是时候升级了。

为什么摇升级?一个理由就够了,3的打开速度比2快。

那么多插件怎么升级呢?

~/Library/Application Support/Sublime Text 2/Packages下面所有的包都复制到Sublime Text 3对应的Packages目录下,除了DefaultPackage Control这两个文件夹

当然,先要给Sublime Text 3装上Package Control,安装

kind_of? is_a? and instance_of?

| Comments

kind_of? and is_a?

Ruby中判断一个Class是否是某一Class或者某一Class的子类,可以用kind_of?, is_a?。两个方法都可以用,那这两个方法有什么不同吗?

两个方法其实是同一个方法,只是名字不同而已。

Returns true if class is the class of obj, or if class is one of the superclasses of obj or modules included in obj.

instance_of?

instance_of?用来判断某个对象是不是某一个类的实例,必须是直接类,父类或者继承链上的module都会返回false

class A;     end
class B < A; end
class C < B; end

b = B.new
b.instance_of? A   #=> false
b.instance_of? B   #=> true
b.instance_of? C   #=> false

2014年第一篇,Happy New Year!

2013 OSX Apps推荐

| Comments

2013年最火的依然是Apple,iPhone还是最炙手可热的手机,顺带也带动了Mac的火热。我用Mac笔记本2年多了,积累了不少好的应用,分享一下

系统辅助

  • Alfred: 必备神器,基于Spotlight的检索应用。如果购买Powerpack, 添加各种插件,提高你不知多少倍的生产力。
  • 百度输入法:最好用的中文输入法
  • The Unarchiver: 最好用的解压缩工具,可以直接从Mac App Store下载
  • Diff Merge: Mac上没有Beyond Compare(开发中),这个也不错,凑活用
  • JumpCut: 粘贴板辅助工具,记录10个条目
  • PCKeyboardHack和KeyRemap4MacBook: 配合一起用,可以修改键盘的功能,比如把Caps键改成一个超级功能键
  • XtraFinder: Finder增强工具,比如剪切功能
  • GoAgent: 你懂的,不懂就Google吧

开发工具

  • Brew: 最方便的包管理力气
  • iTerms: 替换系统的Terminal
  • zsh配合oh-my-zsh: 比bash更好的交互和提示
  • SublimeText 2/3: 如果你不会用Vim,又想要vim的功能,那就用这个吧
  • Sequel Pro: MySQL管理工具,最好的
  • Mou: Markdown编辑工具
  • Dash: 查看文档的利器,节省时间
  • Github: Github官方客户端,简洁易用。备选:SourceTree
  • VirtualBox: 虚拟机软件
  • Pow和Anvil: Rails开发必备,告别:rails s
  • XCode: 不说了

图片编辑

  • Pixelmator: 买不起PS,就买这个吧,99%的情况下够用
  • Skitch: Evernote公司出品,

日常

  • iTunes: 音乐
  • MPlayer: 视频播放
  • dRadio: 听豆瓣FM,