.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"

i18nのデフォルトロケールを確認

% 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=>"以下のメッセージを確認してください:"}}}

ちゃんと、文字化けせず、EUC-JP のターミナルに表示されました。どうやら、レンダリングで文字化けるようです。

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: 名前

これで、エラー画面を見てみましょう。

i18nを使って、EUC-JPを表示できました。

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 で削除するしかないのか・・・。外部項目削除したら、一緒にローカルも消えてくれるといいのに・・・。

追記

エディタを使って外部定義を編集できます。 参考

外部定義している箇所を全てリストアップ

svn propget svn:externals --recursive * 

エディタを使って、svn:extrnals を編集(例)

svn propedit svn:externals ./vendor/plugins/ 

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:8888VMWare 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
;