やっぱりvimが使いたい

これまでschemeを書くときはEdwin(MIT Scheme のエディタ)を使っていたけど、Emacsと同じキー操作なのでvim使いの自分としてはちと辛かった。

そこでvimで快適なscheme環境を作ってみた。

使ったもの


したこと

  1. Windows環境だったからCygwin上でGaucheをビルド
  2. scheme用のシンタックスscheme.vimをインストール  ($HOME/vimfiles/plugin)
  3. 別ウィンドウに実行結果を出力してくれるquickrunをインストール  ($HOME/vimfiles/plugin)
  4. Cygwin上でvimを起動。
  5. ソースを書いたら "\r" で式を評価。

すると実行結果が左のウィンドウに表示されます!


これなら「ソース修正 -> "\r" で式評価」のサイクルでコードが書けるのでとても便利!!


"\ + r"でgoshが起動されるのはschemeコードの場合、goshを起動するのがデフォルトの動作として設定されているからです。
他の処理系を使いたい場合には.vimrcでこんな感じのことを書けばいける筈。詳しくはquickrun.vimのdefault_configの箇所を確認してください。

let g:quickrun_config = { 'scheme': { 'command': '好きな処理系'}}


画面分割を横にしたかったら.vimrcに以下を追加しておけばOK

let g:quickrun_config = { '*': { 'split': ''}}

ez_whereのrails 2.3.5対応

railsセキュリティホールが2.3.4で塞がれたというので、とりあえずrailsを最新の2.3.5アップグレードしてみた。

しかし、ActiveRecord::Associations::AssociationProxy#sanitize_sqlの仕様が2.3.3で変更された為、それをサポートしていないez_whereが問題を起こしエラーになる。

ArgumentError: wrong number of arguments (2 for 1)
        from /root/rails-dev/xx/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:173:in `sanitize_sql'
        from /root/rails-dev/xx/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:173:in `send'
        from /root/rails-dev/xx/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:173:in `sanitize_sql'
        from /root/rails-dev/xx/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:41:in `find'
        from /root/rails-dev/xx/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:400:in `find_target'
        from /root/rails-dev/xx/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:354:in `load_target'
        from /root/rails-dev/xx/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:139:in `inspect'
        from /usr/local/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/wirble-0.1.3/lib/wirble.rb:432:in `output_value'
        from /usr/local/ruby-1.8.7-p72/lib/ruby/1.8/irb.rb:151:in `eval_input'
        from /usr/local/ruby-1.8.7-p72/lib/ruby/1.8/irb.rb:263:in `signal_status'
        from /usr/local/ruby-1.8.7-p72/lib/ruby/1.8/irb.rb:147:in `eval_input'
        from /usr/local/ruby-1.8.7-p72/lib/ruby/1.8/irb.rb:146:in `eval_input'
        from /usr/local/ruby-1.8.7-p72/lib/ruby/1.8/irb.rb:70:in `start'
        from /usr/local/ruby-1.8.7-p72/lib/ruby/1.8/irb.rb:69:in `catch'
        from /usr/local/ruby-1.8.7-p72/lib/ruby/1.8/irb.rb:69:in `start'
        from /usr/local/ruby/bin/irb:13


そこで同じ問題を抱えていたar-extentionsの対処法をそのままマネしてez_whereを2.3.5対応にしてみた。

--- lib/ez/where.rb.back
+++ lib/ez/where.rb
@@ -1,9 +1,9 @@
 class ActiveRecord::Base
   class << self
     alias :original_sanitize_sql :sanitize_sql
-    def sanitize_sql(condition)
+    def sanitize_sql(condition, table_name = quoted_table_name)
       condition = condition.to_sql if EZ::Where::Condition === condition
-      original_sanitize_sql condition
+      original_sanitize_sql condition, table_name
     end
   end
 end


とりあえず動いた!!

  • 参考URL

http://github.com/zdennis/ar-extensions/commit/870bd3588a86e1f8ae36ab0e497f407ac2afa4c5

てかパッチってどこに送れば良いんだろ??

GRUBの再インストール

Windows XP, Debian5.0のデュアルブート環境でGRUBが壊れたので復旧させました。
またいつか壊すかもしれないのでメモ。



症状としてはPCの起動後にOSの選択画面が現れず、
GRUBの文字が黒画面上に表示されたまま
処理が進みまなくなりました。



復旧作業

  1. DebianのインストールCDを使ってレスキューモードを起動。
  2. Debianがインストールされている論理ボリューム上でシェルを起動。
  3. GRUBのインストールされているデバイスを指定してgrub-installを実行
grub-install /dev/sda

以上で無事復旧。

ThinkpadのユーティリティであるRescue and Recoveryを試したりしてたから直すのに3夜かかった orz





そういえばググってみつけた/bootマウント後のGRUB再インストールも効果なしでした。

私の環境では以下で/bootが正しくマウントできたのに何か設定が足らなかったのだろうか…。

mount /dev/sda3 /boot   ※当然、環境によってボリュームは異なります。

ちなみにGRUBが壊れた原因は、Thinkpadに付属しているユーティリティ群(ThinkVantage)の一括アップデート実行にあります。
以前もThinkVantageのアップデートをしてアプリが動かなくなった経験があるので正直、このアップデート機能には懲りました。
もう2度とアップデートしません。

路線・駅データのyml生成

駅、路線データを無償提供しているサイト「駅データ.jp」さんがあったのでrubyでデータを変換してymlに出力してみた。
出力データに合致するDBスキーマがあれば「rake db:fixtures:load」でDBに一発でロードできます。

データ提供サイトはこちら
駅データ

「駅データ.jp」さん最高です!

  • やり方

データを上記サイトの「ダウンロード」からファイルをダウンロードして解凍します。

解凍されたデータm_stations.csv(EUC)をnkfでutf8に変換しstation.csvという名前で保存する。

nkf -w m_staions.csv > station.csv

fastercsvを使っているのでインストールしていなければ

gem install fastercsv


後は後述のコードをUTF8にしたCSVと同じディレクトリで実行するだけ。

  • 入力データ  station.csv
  • 出力データ  stations.yml(駅), railroad_lines.yml(路線)


以下は山手線、目黒線南北線三田線を抽出します。


#!/usr/bin/env ruby
require "rubygems"
require "fastercsv"
COLLECT_LIST = [
              "JR山手線",
              "東急目黒線",
              "東京メトロ南北線",
              "都営三田線"
              ]

station_list  = Array.new
station_id = 0
railroad_list = Array.new
railroad_id = 0

FasterCSV.foreach("station.csv") do |row|

  railroad = row[8]
  if COLLECT_LIST.include? railroad
    station  = row[9]

    railroad_item = { :label => railroad_id,
                      :id => railroad_id,
                      :name => railroad}

    unless railroad_list.include? railroad_item
      railroad_id = railroad_id + 1
      railroad_item[:label] = railroad_id
      railroad_item[:id] = railroad_id
      railroad_list.push railroad_item
    end

    station_id = station_id + 1
    station_list.push({ :label => station_id,
                        :id => station_id,
                        :name => station,
                        :railroad_id => railroad_id})

  end
end

File.open("stations.yml", "w") do |file|
  station_list.each do |item|
    file.puts item[:label].to_s + ":"
    file.puts "  id: " + item[:id].to_s
    file.puts "  name: " + item[:name]
    file.puts "  railroad_line_id: " + item[:railroad_id].to_s
  end
end

File.open("railroad_lines.yml", "w") do |file|
  railroad_list.each do |item|
    file.puts item[:label].to_s + ":"
    file.puts "  id: " + item[:id].to_s
    file.puts "  name: " + item[:name]
  end
end

出力結果

stations.yml

1:
  id: 1
  name: JR山手線
2:
  id: 2
  name: 東急目黒線
3:
  id: 3
  name: 東京メトロ南北線
4:
  id: 4
  name: 都営三田線

railroad_lines.yml

1:
  id: 1
  name: 大崎
  railroad_line_id: 1
2:
  id: 2
  name: 五反田
  railroad_line_id: 1
3:
  id: 3
  name: 目黒
  railroad_line_id: 1
4:
  id: 4
  name: 恵比寿
  railroad_line_id: 1
5:
  id: 5
  name: 渋谷
  railroad_line_id: 1
以下省略

出力する路線を増やしたい場合はCOLLECT_LISTの項目を足せばOK!!

そのうち関連する駅のグループも変換したいな…。