很久之前给 Sublime Text 写的一个 Ruby Formater 插件

一年前业曾经使用过一段 Sublime Text 这个编辑器来开发。 这个编辑器整体的使用体验还是相当不错的。 虽然我现在是用 Textmate 2 开发, 但是我转到 TM 不是因为 Sublime Text 不好, 而是我个人更喜欢 TM 2.

当时用 Sublime 的时候感觉格式化 ruby 代码没有太好的解决方案, 主要有 BeautifyRuby 这个插件是用 Ruby 写的, 要想运行他首先要配置要ruby环境, 在 Mac 下默认有 ruby,linux 平台下可以用apt-get,yum等直接安装ruby 比较容。 但是再Windows平台下 确需要下载安装使用不是很方便。 所以我用 Python 写了这个格式化的插件。 让windows平台使用更容易,而且 Sublime 原生支持 Python。 这个插件最大的好处就是开包即用, 运行效率也很高。

本来是写给自己玩的, 突然有一天在网上逛 发现了下面这个连接:

https://sublime.wbond.net/packages/RubyFormat

没想到这么个插件也有8k的下载量了, 有时间我也得更新优化一下了。

如果你是再 Windows 平台使用 Sublime Text 2 写 Ruby、Rails 代码, 你可以尝试使用 RubyFormat 这个插件。 希望能对大家有点帮助。

项目地址: RubyFormat

2013总结,2014计划

每年到年底和年初的时候, 网上的各种大拿都开始做过去一年的总结和新一年的计划。

我也跟风一把, 做做总结和计划, 一来可以总结总结经验教训, 二来为新的一年做几个目标,督促自己在新一年里面完成目标。

首先大概总结一下2013年。 2013年事业上是我是我人生的低谷。一句话总结就是,摸索前进的一年。

这一年,努力的联系了一些客户,但是始终进展不是很好。损失了不少收入。 换来了一点很少的经验。

好,总结就写到这。

这篇我主要是为了写新年的目标:

  • 增加阅读量, 要读几本好书。 从大学毕业之后,读书真的太少了, 屈指可数的几本。 2014我要读5本书。 为此我还专门买了个 Kindle Paperwhite,最近用起来感觉不错。 这个任务不完成,对不起我的 Kindle。
  • 完成公司的一个系统,一个软件,一个合作三大任务。
  • 让公司尽快走上正轨

我的计划遵循着文字越少事越大越重要的原则!!!

我对新的一年公司充满希望。加油!迎接 2014 的挑战。

Simple_form Datetime 字段 显示的时间不正确

simple_form 能够简化我们 rails 中创建表单的工作。 他还提供了高级功能让我们自定义表单的所有内容。

问题产生

当我们使用 simple_form 建立时间字段的时候,例如:

1
2
3
4
5
6
<%= simple_form_for(@user, html: { class: 'form-horizontal' }) do |f| %>
  <%= f.input :created_at %>
  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

默认的情况下 created_at 再表单中的时间是没有问题的。

但是当我们不满足于默认时间字段的多个 select html控件来选择时间, 而使用 DateTime Picker 更友好的方式设置时间的时候,我们需要这样做:

1
2
3
<%= simple_form_for(@user, html: { class: 'form-horizontal' }) do |f| %>
  <%= f.input :created_at, as: :string, input_html: {class: 'datetime'}%>
<% end %>

然后用 js 去生成时间日期选择。

这个时候会发现 created_at表单中的时间不是正确的。原因是Rails从数据库中读取时间字段后没有经过时区转换就被 simple_form 使用了

有关 Rails中如何正确使用时间 请点击查看。

解决方法

最简单的解决办法是:

1
2
3
<%= simple_form_for(@user, html: { class: 'form-horizontal' }) do |f| %>
  <%= f.input :created_at, as: :string, input_html: { class: 'datetime', value: f.object.created_at }%>
<% end %>

更好的解决办法:

如果程序中有很多这样的地方需要处理的话,每个去修改不是最明智的选择。 最好是利用 simple_form 重新定义 datetime 表单内容。

创建文件 app/inputs/date_time_input.rb

1
2
3
4
5
class DateTimeInput < SimpleForm::Inputs::Base
  def input()
    @builder.text_field(attribute_name, input_html_options.merge( { class: 'datetime', value: object.send( attribute_name ) } ))
  end
end

重新启动程序, 所有Datetime类型的字段都会自动生成这种时间选择表单, 并且时间是正确的了。

Rails 的时区正确使用方法

如果你使用 Rails 开发应用,你一定遇到过时间显示不正确的问题,也就是时区问题。 下面我简单说明一下如何在 Rails 中正确使用时间、时区问题。

原理简介

Rails 已经为我们考虑到了时间问题。Rails 框架中存在两套时区的配置:

第一套是应用程序的时区

在 application.rb 文件中有一个时区的配置

1
2
    config.time_zone = 'Beijing'

这个配置文件是告诉 应用程序里面使用的时区是北京东八区(针对中国的应用就这样配置好了)。

第二套是数据库的存储的时区

同样在 application.rb 文件中

1
2
    config.active_record.default_timezone = :local

代表数据库中时区也用第一套, 一般情况下我们可以不做这个设置(即不添加这行到 application.rb 中)。 如果我们的应用是考虑到国际化的话也不应该指定这个配置。

这两套时区之间Rails为我们做了自动转换。

读取

rails 在将时间类型的数据存入数据库的时候会自动把时间转换成 UTC 时间, 表现的现象是: 你在表单里面填写的时间要比在数据库中直接看到的时间多8个小时。

存入

当我们的程序从数据库读取出时间字段的时候 Rails也会自动的将时区转换为应用程序的时区。

这个逻辑理解了之后,我们可以很容易控制时间的比对等问题了。

程序中时间使用的注意

再程序中正确的使用时间方法是:

1
2
3
4
5
  # 当前时间:
  Time.current
  # 而
  Time.now
  # 是使用的UTC时区
1
2
3
4
5
  # 创建带有当前时区的时间对象:
  Time.local(2014,1,11,08,30,20)
  # 而
  Time.new(2014,1,11,08,30,20)
  # 是没有时区的

如何强制的把程序中 Time.current 的时区从第一套转换为第二套呢? 方法也很简单:

1
  Time.current.to_s(:db)

当你想直接把时间带入sql语句比对时间的时候一定不要忘了做这个转换,否则您的时间比对就不正确了。

时区时间问题也就差不多了。了解了就不难。

Deploy Rails 4.x Use Capistrano 3.x

部署使用的账号 要把ruby的PATH 添加到 ~/.bashrc 目录

~/.bashrc

1
set :bundle_flags, '--quiet'
1
2
3
4
5
6
7
8
9
10
11
DEBUG [ec59288d]        The --deployment flag requires a Gemfile.lock. Please make sure you have checked
DEBUG [ec59288d]        your Gemfile.lock into version control before deploying.

need Gemfile.lock
capistrano   your Gemfile.lock into version control before deploying.


 INFO [76a73a08] Running /usr/bin/env rake assets:precompile on izstudy.com
DEBUG [76a73a08] Command: cd /var/www/izmeeting/releases/20131102010425 && ( RAILS_ENV= /usr/bin/env rake assets:precompile )
DEBUG [76a73a08]        rake aborted!
DEBUG [76a73a08]        database configuration does not specify adapter

bundle config --delete bin # Turn off Bundler's stub generator

在 Rails 4 中使用 Compass 和 Bootstrap

这篇文章内容已经过期 compass_rails 的新版本已经可以支持 Rails 4.
目前用最新的 compass_rails 正常方法使用已经没有问题。

Compass

Bootstrap

错误

1
2
File to import not found or unreadable: susy (again!)
No application integration exists for rails

首先

Gemfile
1
2
3
4
5
6
7
8
9
10
11
gem 'bootstrap-sass'

group :assets do
  gem 'compass-rails'
  gem "susy"
end

cd /to/project/path/
bundle
bundle exec compass init rails ./
bundle exec compass install susy

之后修改

Gemfile
1
2
3
4
5
6
7
8
gem 'compass'
gem 'compass-rails'
gem 'compass-rails', github: "Compass/compass-rails", branch: "rails4-hack"
gem "susy"
gem 'bootstrap-sass'

group :assets do
end

TextMate 2 下 Ctag 和 Git Bundle 同时工作

最近再使用 TextMate 2 的 Bundle:Ctag 和 Git 的时候经过了一番周折才勉强可以让这两个 Bundle 同时工作。写出来帮助遇到同样问题的朋友。避免浪费时间。

问题现象:

使用 TM2、 ruby 1.9.3 或 ruby 2.0.1

Git Bundle 可以正常工作。

安装 TM Ctag Bundle 之后 ^ + Command + P 报异常大概如下:

1
2
3
4
5
6
7
8
 ui.rb:308: in `to_plist': An object in the argument tree could not be converted (ArgumentError)
     from ~/Library/Application Support/TextMate/Managed/Bundles/Bundle Support.tmbundle/Support/shared/lib/ui.rb:308:in `block in initialize'
     from ~/Library/Application Support/TextMate/Managed/Bundles/Bundle Support.tmbundle/Support/shared/lib/ui.rb:307:in `popen'
      from /Library/Application Support/TextMate/Managed/Bundles/Bundle Support.tmbundle/Support/shared/lib/ui.rb:307:in `initialize'
     from ~/Library/Application Support/TextMate/Managed/Bundles/Bundle Support.tmbundle/Support/shared/lib/ui.rb:20:in `new'
     from ~/Library/Application Support/TextMate/Managed/Bundles/Bundle Support.tmbundle/Support/shared/lib/ui.rb:20:in `dialog'
      from /Library/Application Support/TextMate/Managed/Bundles/Bundle Support.tmbundle/Support/shared/lib/progress.rb:42:in `call_with_progress'
     from ~/_test_tm.rb:12:in `<main>'

其中关键是: ui.rb:308: in `to_plist’: An object in the argument tree could not be converted 如果你的异常是这个那么可以肯定的时候和我的情况一直。下面是我的一个临时解决方案。

Read on →

Google并不完美,Baidu也并非很烂(日语翻译服务对比)

不管你是一个谷歌粉也好,或者是一个只用百度而忽视谷歌存在的中国网民也好,在每个人的心里面对各自喜欢的互联网应用都有一定的偏好。 而人们往往会因为喜欢而忽视一些客观存在的问题。比如:对于谷歌粉来说,往往不容许别人说谷歌的半点不是,他会有一百个理由来解释她的问题。 我就是一个铁杆的谷歌粉,我偏爱谷歌的各种应用,我一直坚定不移的认为谷歌的旗下的各种产品均是近乎完美的。所以不管什么类型的应用只要谷歌有我就会用谷歌的,那么翻译工具这个我也是一直用谷歌的。 由于最近接触日语相关内容比较多,所以经常翻译一些日语内容。后来听说百度翻译也低调上线了,所以就尝试了一下。

那么究竟谁家的翻译服务更好呢?并不着急下结论,请先看下面的例子吧:

案例一:

翻译工具 文字内容 得分
日语原文 ちょっと日本語理解できます
谷歌翻译 你能理解一个小日本 2
百度翻译 点日语可以理解。 7
正确译文 可以理解一些日语。
Read on →

Autossh+launchd 实现全自动 Ssh -D 端口转发 Socks5 代理

用ssh端口转发做为代理 fan qiang 很久了,一直都是手动运行脚本的,我的MBA基本上是不关机的,重来都是用完直接扣下屏幕。 但每次打开之后都需要重新运行一下ssh -D 脚本, 作为一个会写代码的人来说显得还是不够专业。所以我决定要充分发挥我的主观能动性, 让我的电脑更智能。 目前已经可以良好的运行了。

废话少说我直接进入主题。

我的系统是:Mac OS X Lion

首先要介绍几个名词:
ssh端口转发: 是一种利用ssh隧道链接建立的sock5代理。
launchd: Mac OS X 系统下的用来管理整个系统的 services 和 processes 的工具。如果你需要一个程序开机自动运行,或者由于错误停止后自动重新运行,那么就可以用 launchd 来管理。
autossh:是用来保持 ssh 一直处于链接状态的工具。可以在链接断开后自动重新链接。

Read on →

Test the First Blog Post With Octopress

Hello World! 世界你好, 我又要重新开始写Blog了。