.vimrcと.zshrcで環境依存の設定を分ける方法
.vimrcや.zshrcで環境依存の設定があったりしますよね。例えば、文字コード。アップデートするたびに、各環境で書き換えるのも面倒ですので、環境依存の設定ファイルは別にしましょう。
.vimrc
ファイルを2つ準備します。例えば、.vimrc と .vimrc.encoding とします。
.vimrc
set nu ・ ・ ・ 固定設定 ・ ・ ・ # 環境依存設定ファイル読み込み :source ~/.vimrc.encoding
vimrc.encoding
set encoding=utf-8 set termencoding=utf-8 set fileencoding=utf-8
私は、.vimrc.encodingファイルは .vimrc.encoding.example という名前でバージョン管理していて、各環境に設定するときに、.vimrc.encoding とします。ちなみに、環境依存設定ファイル名はなんでもOKです。
.zshrc
ファイルを2つ準備します。例えば、.zshrc と .zshrc.encoding とします。
.zshrc
autoload -U colors ・ ・ ・ 固定設定 ・ ・ ・ # 環境依存設定ファイル読み込み [ -f ~/.zshrc.encoding ] && source ~/.zshrc.encoding
zshrc.encoding
export LANG=ja_JP.UTF-8
こちらも同じく、.zshrc.encodingファイルは .zshrc.encoding.example という名前でバージョン管理していて、各環境に設定するときに、.zshrc.encoding とします。こちらも、環境依存設定ファイル名はなんでもOKです。
RubyGemsパッケージを作ってrubygems.orgに登録してみた
作ったことなかったのでやってみました。
環境
OS | Mac OS X 10.6.6 |
Ruby | ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9] |
RubyGems | 1.5.2 |
gemcutter | 0.6.1 |
サンプルGemを作る
こちらを参考に作成します。gemの名前は japanrock_sample とします。
ディレクトリ・ファイルを作る
mkdir japanrock_sample mkdir japanrock_sample/lib mkdir japanrock_sample/test touch japanrock_sample/lib/japanrock_sample.rb touch japanrock_sample/README.rdoc touch japanrock_sample/CHANGELOG touch japanrock_sample/MIT-LICENSE touch japanrock_sample/japanrock_sample.gemspec
gemspecの記述
japanrock_sample.gemspec に下記を記述します。
Gem::Specification.new do |s| s.name = "japanrock_sample" s.version = "1.0.0" s.summary = "japanrock sample" s.description = "japanrock sample" s.author = "japanrock" s.email = "japanrock@gmail.com" s.homepage = "http://github.com/japanrock/japanrock_sample" s.has_rdoc = true s.files = [ "lib/japanrock_sample.rb", "MIT-LICENSE", "README.rdoc" ] end
lib/japanrock_sample.rb の記述
installして何も出来ないのも寂しいので、lib/japanrock_sample.rb にも少し書きましょう。
class JapanrockSample def hoge "japanrock sample!" end end
README.rdoc の記述
下記のように記述しました。
= INSTALL gem install japanrock_sample = Usage japanrock_sample = JapanrockSample.new japanrock_sample.hoge = DESCRIPTION japanrock sample = Further Reading http://d.hatena.ne.jp/japanrock_pg
MIT-LICENSE の記述
下記のように記述しました。
Copyright (c) 2011 japanrock
gemをbuildする
gem build japanrock_sample.gemspec を実行します。
% gem build japanrock_sample.gemspec WARNING: description and summary are identical Successfully built RubyGem Name: japanrock_sample Version: 1.0.0 File: japanrock_sample-1.0.0.gem
そうすると、japanrock_sample-1.0.0.gem というファイルが出来ます。
rubygems.orgに公開する
まず、 gemcutter をインストールします。
% sudo gem install gemcutter
pushします。push する前に、RubyGems.org のアカウントが必要ですので、持っていない人は、http://rubygems.org/sign_up から作成してください。
% gem push japanrock_sample-1.0.0.gem Enter your RubyGems.org credentials. Don't have an account yet? Create one at http://rubygems.org/sign_up Email: (自分のEmail) Password: Signed in. Pushing gem to RubyGems.org... Successfully registered gem: japanrock_sample (1.0.0)
これで、登録できました。rubygems.orgの管理画面で見てみると確認できます。
インストールして使ってみる
インストール
% sudo gem install japanrock_sample Successfully installed japanrock_sample-1.0.0 1 gem installed Installing ri documentation for japanrock_sample-1.0.0... Installing RDoc documentation for japanrock_sample-1.0.0...
確認
% gem list japanrock_sample *** LOCAL GEMS *** japanrock_sample (1.0.0)
使ってみます
% irb -rubygems irb(main):001:0> require 'japanrock_sample' => true irb(main):002:0> japanrock_sample = JapanrockSample.new => #<JapanrockSample:0x6ec738> irb(main):003:0> japanrock_sample.hoge => "japanrock sample!"
ちゃんと使えました。
Rails2.3.10 に i18n を 文字コード EUC-JP で導入するメモ
i18n を 文字コード EUC-JP で Rails2.3.10 に導入するメモです。
実験環境
OS | CentOS release 5.3 (Final) |
Ruby | ruby 1.8.6 (2010-02-05 patchlevel 399) [i686-linux |
Rails | Rails 2.3.10 |
i18n | 0.5.0 |
文字コード | EUC |
Rails2.3.10のデフォルトエラーメッセージ
まずは、適当にRailsアプリケーションを作成します。すべてのファイルの文字コードはEUC-JPで作成します。
例として、従来の scaffold で吐き出した雛形のエラーメッセージを確認しておきましょう。
サンプルとして model は
class User < ActiveRecord::Base validates_presence_of :name end
となっています。
i18nをインストール
さっそく、i18nをインストールして、エラーメッセージを日本語化しましょう。
% sudo gem install i18n Successfully installed i18n-0.5.0 1 gem installed Installing ri documentation for i18n-0.5.0... Installing RDoc documentation for i18n-0.5.0...
インストールが完了しました。
$KCODEの確認
ロケールファイルを設定する前に、$KCODEを調べましょう。
% script/console Loading development environment (Rails 2.3.10) >> $KCODE => "UTF8"
UTF8でした、今回は EUC で行ないたいので、文字コードの設定を修正します。config/initializers/encoding.rb ファイルを作成して下記の記述をします。
$KCODE = 'e'
EUCになったことを確認します。
% script/console Loading development environment (Rails 2.3.10) >> $KCODE => "EUC"
i18nのデフォルトロケールを ja-JP にする
現在のデフォルトロケールを確認
% script/console Loading development environment (Rails 2.3.10) >> I18n.default_locale => :en
こちらを参考に、config/initializers/locale.rb を作成します。内容は下記です。
I18n.default_locale = "ja-JP"
% script/console Loading development environment (Rails 2.3.10) >> I18n.default_locale => :"ja-JP"
この時点で、エラーメッセージの変化を見てみましょう。
翻訳失敗的なメッセージが出ました。
ロケール用のファイルを準備する(validation用メッセージ、日時等のリソース)
こちらの config/locales/ja-JP.rb をほぼそのまま使わせていただきました。以下の diff が修正点です。また、文字コードを EUC-JP に変換しています。
@@ -54,7 +54,7 @@ }, :currency => { :format => { - :unit => '\', + :unit => '\\', :precision => 2, :format => '%u%n' } @@ -92,4 +92,4 @@ }, }, } -} \ ファイル末尾に改行がありません +}
この時点での、エラー画面を見てみましょう。
文字化けていますし、{{model}} というのが、出ていて変換されていません。
{{ ... }} の記述が %{} に変わった
こちらを見ると、{{ ... }} ではなく %{ ... } と記述されています。config/locales/ja-JP.rb を vim で以下のように変更します。
:%s/{{/\%{/g
:%s/}}/}/g
これで、エラー画面を見てみましょう。
{{model}} は解消されました。
文字化けを直す(HTMLの文字コード宣言を直す)
app/views/layouts/users.html.erb をよく見てみると、
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="eb"> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" />
となっていました。これを euc にしましょう。以下、変更後です。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="content-type" content="text/html;charset=euc-jp" />
しかし、これでは文字化けは解消されませんでした。
script/console で確認してみる
どこで、文字化けが発生しているのか、発見する必要があります。まず、script/console で I18n の戻り値を見てみましょう。
% script/console >> I18n.translate "activerecord" => {:errors=>{:messages=>{:empty=>"は、何も入力されていません", :too_long=>"は、長すぎます (%{count}文字 以下)", :equal_to=>"は、%{count}と同値です", :less_than=>"は、%{count}文字未満です", :inclusion=>"は、リ ストに含まれていません", :accepted=>"は、入力できません", :blank=>"は、空白です", :less_than_or_equal_to=>"は、%{count}文字以下で入力されています", :invalid=>"は、妥当な値ではありません", :odd=>"は、端数が入力 されています", :exclusion=>"は、有効な値ではありません", :confirmation=>"は、確認できません", :wrong_length=>"は、桁数が合っていません(%{count}桁必要です)", :greater_than=>"は、%{count}文字を超えて入力されてい ます", :taken=>"は、有効ではありません", :even=>"は、偶数が入力されています", :too_short=>"は、短すぎます (%{count}文字以上)", :greater_than_or_equal_to=>"は、%{count}文字以上入力されています", :not_a_number=>"は、数字ではありません"}, :template=>{:header=>"%{model}でエラーが発生しました", :body=>"以下のメッセージを確認してください:"}}}
HTTPのヘッダを見てみる
Firefoxのアドオン Live HTTP headers でヘッダを見てみると、Content-Type の charset が utf-8 になっていることが分かりました。
文字化けを直す(Content-Typeをeuc-jpにする)
これを直せば、よさそうです。application_controller.rb に下記を記述します。
before_filter :set_charset def set_charset headers["Content-Type"] = "text/html; charset=euc-jp" end
これで、エラー画面を見てみましょう。
やっと、EUC-JP での表示が出来ました。
ロケール用のファイルを準備する(テーブル名やカラム名のリソース用)
こちらの ja-JP.yml を 下記のように作成します。もちろん、文字コードはEUC-JPです。
ja: activerecord: models: user: ユーザ attributes: user: name: 名前
これで、エラー画面を見てみましょう。
参考
- Rails Internationalization (I18n) API — Ruby on Rails Guides
- GitHub - ruby-i18n/i18n: Internationalization (i18n) library for Ruby
- GitHub - amatsuda/i18n_demo_app: Demo application to show Rails' new i18n features
- Ruby on Rails 2.3 で I18N を使ってみた - yuumi3のお仕事日記
- http://www.func09.com/wordpress/archives/262
- GitHub - amatsuda/i18n_generators: A pack of Rails generators gem plugin that generates Rails 3 and Rails 2 I18n locale files for almost every known locale.
- http://ruby-i18n.org/wiki
- Ruby on Rails 2.3 リリースノート - なんとなく日記
- Rails 2.3.5 で i18n を使ってメッセージを日本語化する : Serendip – Webデザイン・プログラミング
- Rails 3 の I18n について - おもしろwebサービス開発日記
svn の外部定義 externals を使ってみた
svn externals を使ったことがなかったので、使ってみました。
環境
OS | MacOS X 10.6.6 |
Subversion | 1.6.5 |
実験環境構築
ローカルにHogeとFugaという2つリポジトリを作って、HogeからFugaを外部定義してチェックアウト出来るようにします。
## リポジトリを作り、ファイルをコミットします ## Hogeリポジトリの作成 % svnadmin create ~/Hoge % mkdir ~/work % cd ~/work % echo "test externals" > README % svn import -m "test commit" file:///Users/japanrock/Hoge/ 追加しています README リビジョン 1 をコミットしました。 ## Fugaリポジトリの作成 % svnadmin create ~/Fuga % mkdir ~/work2 % cd ~/work2 % echo "test externals fugafuga" > README % svn import -m "test commit fuga" file:///Users/japanrock/Fuga/ 追加しています README リビジョン 1 をコミットしました。
Hogeをチェックアウトして、Fugaをexternalsする
## Hogeをチェックアウト % mkdir ~/work3 % cd ~/work3 % svn checkout file:///Users/japanrock/Hoge/ hoge A hoge/README リビジョン 1 をチェックアウトしました % cd hoge ## 外部定義 % svn propset svn:externals 'test_fuga file:///Users/japanrock/Fuga' . 属性 'svn:externals' を '.' に設定しました ## 設定の確認 % svn proplist -v '.' の属性: svn:externals test_fuga file:///Users/japanrock/Fuga ## Fugaを外部項目として取得する % svn up 外部項目を 'test_fuga' に取得しています A test_fuga/README 外部項目をリビジョン 1 に更新しました。 リビジョン 1 に更新しました。 ## Fugaリポジトリが test_fugaディレクトリにチェックアウトされたことを確認 % ls -la total 8 drwxr-xr-x 5 japanrock staff 170 2 8 22:22 . drwxr-xr-x 3 japanrock staff 102 2 8 22:21 .. drwxr-xr-x 8 japanrock staff 272 2 8 22:22 .svn -rw-r--r-- 1 japanrock staff 15 2 8 22:21 README drwxr-xr-x 4 japanrock staff 136 2 8 22:22 test_fuga % cat README test externals % cat test_fuga/README test externals fugafuga
Hoge から外部項目Fugaを削除する
% svn propdel svn:externals . 属性 'svn:externals' を '.' から削除しました ## 削除されたことを確認 % svn proplist -v % ## svn upで Fugaがチェックアウトされないことを確認 % svn up リビジョン 1 です % ## 外部項目は削除したけど、test_fugaディレクトリは削除されずに残る・・・ % ls README test_fuga ## しかたないので、rm -fr で削除 % rm -fr test_fuga % ls README
チェックアウトされないのは良いのだけど、一度チェックアウトされた Fuga はローカルに残っている。これは、rm で削除するしかないのか・・・。外部項目削除したら、一緒にローカルも消えてくれるといいのに・・・。
参考
Rails2.3.10でrender_componentを使う
Rails2.3.10でrender_componentを使いたい。こちらには下記のように書いてある。
render_component goes from “deprecated” to “nonexistent” in Rails 2.3. If you still need it, you can install the render_component plugin.
install
% script/plugin install git://github.com/rails/render_component.git
サーバを起動するとメソッドがないと言われる
% sudo script/server -p 80 => Booting WEBrick => Rails 2.3.10 application starting on http://0.0.0.0:80 /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.10/lib/active_support/core_ext/module/aliasing.rb:33:in `alias_method': undefined method `set_session_options' for class `ActionController::Base' (NameError) from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.10/lib/active_support/core_ext/module/aliasing.rb:33:in `alias_method_chain' from /home/admin/apps/hoge/vendor/plugins/render_component/lib/components.rb:13:in `included' from /home/admin/apps/hoge/vendor/plugins/render_component/lib/components.rb:3:in `class_eval' from /home/admin/apps/hoge/vendor/plugins/render_component/lib/components.rb:3:in `included' from /home/admin/apps/hoge/vendor/plugins/render_component/init.rb:2:in `include' from /home/admin/apps/hoge/vendor/plugins/render_component/init.rb:2:in `send' from /home/admin/apps/hoge/vendor/plugins/render_component/init.rb:2:in `evaluate_init_rb' from /usr/local/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/rails/plugin.rb:158:in `evaluate_init_rb' ... 16 levels... from /usr/local/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/commands/server.rb:84 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from script/server:3
lackac/render_component が良いという噂
こちらによると、下記のところから持って来るといいよと書いてある。
% git://github.com/lackac/render_component.git
やってみる。さっきinstallした、render_componentは削除する。
% rm -fr vendor/plugins/render_component/ % script/plugin install git://github.com/lackac/render_component.git fatal: remote error: Could not find Repository lackac/render_component
http://github.com/lackac/render_component/tree/master が 404 だし・・・。
lib/components.rb を少しいじれば良いという噂
こちらによると、lib/components.rb の 13行目の :set_session_options を :session= にすれば良いとと書いてある。
# install % script/plugin install git://github.com/rails/render_component.git # 確認 % sed -e "s/:set_session_options/:session=/g" vendor/plugins/render_component/lib/components.rb | diff -u vendor/plugins/render_component/lib/components.rb - # 変更 % sed -i "s/:set_session_options/:session=/g" vendor/plugins/render_component/lib/components.rb # 確認 % head -n 20 vendor/plugins/render_component/lib/components.rb
別のエラーがでた・・・。
% sudo script/server -p 80 パスワード: => Booting WEBrick => Rails 2.3.10 application starting on http://0.0.0.0:80 /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.10/lib/active_support/core_ext/module/aliasing.rb:34:in `alias_method': undefined method `session_with_render_component=' for class `ActionController::Base' (NameError) from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.10/lib/active_support/core_ext/module/aliasing.rb:34:in `alias_method_chain' from /home/admin/apps/hoge/vendor/plugins/render_component/lib/components.rb:13:in `included' from /home/admin/apps/hoge/vendor/plugins/render_component/lib/components.rb:3:in `class_eval' from /home/admin/apps/hoge/vendor/plugins/render_component/lib/components.rb:3:in `included' from /home/admin/apps/hoge/vendor/plugins/render_component/init.rb:2:in `include' from /home/admin/apps/hoge/vendor/plugins/render_component/init.rb:2:in `send' from /home/admin/apps/hoge/vendor/plugins/render_component/init.rb:2:in `evaluate_init_rb' from /usr/local/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/rails/plugin.rb:158:in `evaluate_init_rb' ... 16 levels... from /usr/local/lib/ruby/gems/1.8/gems/rails-2.3.10/lib/commands/server.rb:84 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from script/server:3
lib/components.rb を少しいじれば良いという噂2
こちらがソース。やってみる。さっきinstallした、render_componentは削除する。
% rm -fr vendor/plugins/render_component/ % script/plugin install git://github.com/rails/render_component.git
以下は、vendor/plugins/render_component/lib/components.rb の変更の差分
@@ -10,7 +10,7 @@ attr_accessor :parent_controller alias_method_chain :process_cleanup, :render_component - alias_method_chain :set_session_options, :render_component +# alias_method_chain :set_session_options, :render_component alias_method_chain :flash, :render_component alias_method_chain :assign_shortcuts, :render_component alias_method_chain :send_response, :render_component @@ -134,9 +134,9 @@ end def assign_shortcuts_with_render_component(request, response) - assign_shortcuts_without_flash(request, response) + assign_shortcuts_without_render_component(request, response) flash(:refresh) flash.sweep if @_session && !component_request? end end -end \ ファイル末尾に改行がありません +end
この噂で動いた。
環境
ruby | ruby 1.8.6 (2010-02-05 patchlevel 399) [i686-linux] |
rails | Rails 2.3.10 |
OS | CentOS release 5.3 (Final) |
2011/06/09 追記:「render_component と flash」について
Rails2.3にrender_componentを導入すると、Flashが使えなくなる問題があります。-http://railsforum.com/viewtopic.php?id=34367
下記のように修正すれば、Flashが使えるようになります。
@@ -37,7 +37,7 @@ module InstanceMethods # Extracts the action_name from the request parameters and performs that action. def process_with_components(request, response, method = :perform_action, *arguments) #:nodoc: - flash.discard if component_request? +# flash.discard if component_request? process_without_components(request, response, method, *arguments) end @@ -136,7 +136,7 @@ def assign_shortcuts_with_render_component(request, response) assign_shortcuts_without_render_component(request, response) flash(:refresh) - flash.sweep if @_session && !component_request? +# flash.sweep if @_session && !component_request? end end end
しかし、コンポーネント機能は Rails2.0 で非推奨となり、Rails2.3 でサポートから外れました。render_component は Rails2.3 で plugin 化しました。このように、コンポーネント機能はrailsから離れつつありますので、2.3以降は、render_component自体も使わない方が良いかも知れませんね。
NatネットワークのVMWareFusionの起動イメージに外部からアクセスする(ポートフォワーディング)
環境
Mac | Mac OS X 10.6.6 | ||
VMWare Fusion | 3.1.2 |
構成例
Mac の IP | 10.20.138.177 | ||
VMWare Fusion イメージのIP | 172.16.243.130 |
設定
1. nat.confの編集
VMWareのnat.conf 編集して [incomingtcp] のフィールドに設定を加える。
sudo vim /Library/Application\ Support/VMware\ Fusion/vmnet8/nat.conf
以下のようになる。
[incomingtcp] # 書式:[外からアクセスするポート] = [VMWare Fusionで起動しているイメージのIP]:[VMWare Fusionで起動しているイメージにアクセスしたいポート] 8888 = 172.16.243.130:80
2. VMWareをリスタート
cd /Library/Application\ Support/VMware\ Fusion/ sudo ./boot.sh --restart
これで他のマシンから http://10.20.138.177:8888 でVMWare Fusionのポート80番へアクセス出来るはずです。アクセス出来ない場合は、Mac側のFirewallなどを疑ってください。
カラムA、B、Cが同じ値のレコード数を出力するSQL
もっとちゃんとした書き方があるとおもうのだけど、パッと思いついたのがこれだった。
もし、他のSQLの書き方があれば教えてくださいm(_ _)m
データ構造例
テーブル名:demos
id | A | B | C | D | E | ||||||
1 | hoge | fuga | NULL | mysql | postgres | ||||||
2 | baz | hoge | foo | bar | mysql | ||||||
3 | hoge | fuga | NULL | foo | bar | ||||||
4 | fuga | baz | foo | NULL | mysql | ||||||
5 | fuga | baz | foo | NULL | mysql |
SQL
SELECT CONCAT(A, B, IFNULL(C, 'null')) unique_id, COUNT(CONCAT(A, B, IFNULL(C, 'null'))) unique_id_count FROM demos GROUP BY unique_id HAVING unique_id_count > 1 ; +--------------+------------------+ | unique_id | unique_id_count | +--------------+------------------+ | hogefuganull | 2 | +--------------+------------------+ | fugabazfoo | 2 | +--------------+------------------+
追記
group by を使えばいけましたね・・・。
修正SQL
SELECT COUNT(*) unique_id_count FROM demos GROUP BY A, B, C HAVING unique_id_count > 1 ;