2011年4月25日月曜日

google日本語入力の候補移動キーの変更

IMEの変換候補の移動を矢印キーでってのがどうにも面倒だったので、
vimの補完候補の移動で使っているCtrl+nとCtrl+pで移動できるように変更してみた。
これで生産性がだいぶ上がる気がすると、自己満足してみる。

変更方法は、google日本語入力のなんでマイクロソフトのIMEでは出来るかはよくわからない。

google日本語入力の設定画面を表示

下記画像の工具のアイコン?を左クリックして、プロパティを選択する。






キー設定の編集画面を開く

キー設定の編集画面へ移動する。(赤枠のボタン)





















キー設定を編集する

変更するのは下記の3点。(変更ポイントは画像参照)
  • 変換前入力中の予測変換
  • 変換中の次候補へ移動
  • 変換中の前候補へ移動


2011年4月7日木曜日

rubyからoracle接続

rubyからOracleへアクセスする方法

まずは、下記コマンドでOracleへのアクセスインタフェースを提供してくれるruby-oci8をインストールする。
gem install ruby-oci8

実際にOracleに接続して、select文を実行するコード(接続先ノDBは、OracleXE)
# encoding: utf-8
require "oci8"

# データベースへ接続
con = OCI8.new("hoge", "hoge", "xe")

begin
  # SELECT文の実行
  cur = con.exec("select id, name from hoge")

  # fetch_hashを呼び出すと、レコードをHashで取得できる。
  # fetchだと、各レコードがArrayで返却される。
  # 個人的には、Hashのが好きなんだよな・・・
  while rec = cur.fetch_hash    
    puts "rec['ID'] = [#{rec['ID']}]"
    puts "rec['NAME'] = [#{rec['NAME']}]"
  end
  cur.close
ensure
  # データベース接続を閉じる
  con.logoff
end

プリペアドステートメントやPL/SQLの実行なんかも出来るらしい。その辺は、今度ちゃんと調べてみよう。

2011年4月4日月曜日

rubyのローカル変数とブロックローカル変数の注意点

ローカル変数とブロックローカル変数に、同一の名前をつけた場合の動きのまとめ。

  1. ローカル変数をブロック内で参照できる。
  2. ローカル変数と同名の変数を宣言するには、ブロックパラメータのリストに宣言する。
  3. ローカル変数と同名の変数をブロック変数に使用した場合、ブロックローカルな新しい変数となる。

ローカル変数をブロック内で参照した場合

#coding:utf-8

array = ["h", "o", "g", "e"]
hoge = ""

array.each do |s|
  hoge += s
end
puts hoge

実行結果

ローカル変数がブロック内で参照でき、値が代入されていることがわかる。
hoge

パラメータリストで変数の宣言

#coding:utf-8

array = ["h", "o", "g", "e"]
hoge = "hoge"

array.each do |s;hoge|
  hoge = s
  puts hoge
end
puts "original hoge = [#{hoge}]"

実行結果

ローカル変数が上書きされていないことがわかる。
h
o
g
e
original hoge = [hoge]

ローカル変数と同名の変数を、ブロックパラメータで指定した場合

#coding:utf-8

array = ["h", "o", "g", "e"]
hoge = "hoge"

array.each do |hoge|
end
puts hoge

実行結果

ローカル変数が上書きされていないことがわかる。
hoge
実行時に『-w』を指定して実行すると、ブロックパラメータで同名の変数を使用した場合にワーニングを出すことができる。
実行結果はこんな感じになる。
test.rb:6: warning: shadowing outer local variable - hoge
hoge

javaしかやってないと、なんとなく分かりづらい動きをするもんだなと思ってしまう。
個人的には、この辺の仕様を覚えておくのは大事だと思うけど、同じ名前の変数使わなければいいんじゃねと思ってしまう。
変数使い回すのすきじゃないし・・・。

2011年4月2日土曜日

IntellijがJDK7に対応してきた

Intellijの10.5のEAPがリリースされてJDK7に早くも対応してきたから、どんな感じか少しためしてみた。
いくつかは、早速quick-fixにも対応していて完成度の高さを感じたな。
JDK7の正式リリースは夏ぐらいだから、その頃にはかなりクオリティが高くなってそう。

2つほどquick-fixの動作を載せてみます。

Stringのswitch文

JDK6までの文法で書くと、こんな感じにif文にしないといけない。












このコードをJDK7対応のswitch文に置き換えるには、quick-fix機能を使うと簡単にできる。
if文にカーソルを移動すると、quick-fixのヒントアイコンが表示されるので、
左クリックするかAlt+Enter(デフォルトのキーバインドの場合)で、対応方法がリストされる。
ここで、Replace 'if' with 'switch'を選ぶとif文をswitch文に変換してくれる。














変換されたコードは、こんな感じになる。
















ジェネリクスの型推論

型推論もquick-fixに対応している。






変換後は・・・
こんながん時に、コンストラクタ呼び出しのジェネリクス型が削除される。

2011年3月8日火曜日

Intellijにrubyプラグインを導入

Intellij IDEAにruby開発用のプラグインを導入。

このプラグインは、同じくJetBrains社から販売されているRubyMineというruby(ruby on rails)用のIDEとほぼ同じことができるらしい。

なので、Intellij IDEA Ultimate Editionのライセンスを持っているならば、RubyMineを買わなくてもい素晴らしい開発環境を手に入れることをできる。

RubyMineは、下記のリンク先からダウンロードが可能。
Can’t code withoutIntelligent IDE for professional Ruby and Rails development

プラグインのインストール方法

  1. File→Settingsを開く
  2. IDE Settings(下の方)→Pluginsを開く
  3. Availableタブを開く
  4. Rubyプラグインを選択して、右クリックでインストール

コードを書いてみよう


コード補完もできる。動的言語なだけにどこまで保管できるかはわからないけど・・・。












debug実行もいい感じ。

2011年2月22日火曜日

EnumerableモジュールとEnumeratorモジュール

rubyを使うとかなり頻繁に利用するのがEnumerableオブジェクト(イテレータ)である。
意識して使ってないけど、配列のeachメソッドやループのtimesなどがこれに該当する。

Enumerableオブジェクト

組み込みオブジェクトのArrayやHashがincludeしているモジュール。
Enumerableをincludeして、eachメソッドを定義してあげれば独自モジュールでもEnumerableが提供する様々なメソッドを利用出来る。

Arrayを使った場合のコード

array = [1, 2, 3]

# eachでループ
array.each {|x|
  puts x
}

# 添字付きでループ
array.each_with_index {|x, i|
  puts "#{i} = #{x}"
}
出力結果はこんな感じ
1
2
3
0 = 1
1 = 2
2 = 3

独自クラスの場合

class Hoge
  include Enumerable

  def initialize(num)
    @num = num
  end

  def each
    @num.each {|num|
      # prefixにhoge_を付加する。
      yield "hoge_#{num}"
    }
  end
end
出力結果はこんな感じ
Enumerableで定義されてるgrepもちゃんと使えてるのが分かる。
each start...
hoge_1
hoge_2
hoge_3
hoge_4
grep start...
hoge_2
hoge_3

ruby始めた頃は、each_with_indexなんて知らなくて、こんなループをかいてた・・・。
まぁ、動くから間違ってはないけど直感的ではないよね。一瞬なにがしたいんだ?って思ってしまう。
array.count.times {|i|
  puts "array[#{i}] = [#{array[i]}]"
}

Enumeratorオブエクト

each以外のメソッドでもEnumerableを使うためのラッパークラス
Enumeratorはイミュータブルなので、生成したあとの状態変更はできない。
なので、配列でパラメータ渡しをするのではなくEnumeratorを指定したほうが良い。

# eachメソッドを定義しているクラスのto_enumを呼び出すと、Enumeratorを生成できる。
enum = array.to_enum
enum.each {|x|
  puts x
}

# enumメソッドを定義していないクラスの場合
class Hoge
  def initialize(num)
    @num = num
  end

  def hoge
    @num.each {|num|
      yield "hoge_#{num}"
    }
  end
end

hoge = Hoge.new([1, 2, 3, 4])

# enum_forメソッドに、eachと同義のhogeメソッドを指定して Enumeratorを生成する。
enum = hoge.enum_for(:hoge)
puts "each start..."
enum.each {|x|
  puts x
}
puts "grep start..."
enum.grep(/^.*[23]$/) {|x|
  puts x
}
実行結果はこんな感じ

hogeメソッドしか持っていなくても、Enumerableのメソッドを利用できている。
each start...
hoge_1
hoge_2
hoge_3
hoge_4
grep start...
hoge_2
hoge_3

2011年2月20日日曜日

JDK7のAutoCloseable

JDK7からAutoCloseableインタフェースなるものが追加されてます。
このインタフェースを実装しているクラスの場合、JDK6以前のようにリソース解放処理をfainally句で行う必要がなくなります。

また、ThrowableにaddSuppressedメソッドが追加されていてtry句で発生した例外に対して、
リソース解消処理(JDK6までの、finally句でのリソース解放処理)で発生した例外を追加してくれています。

コードサンプル

public class Test {

    public static void main(String[] args) throws FileNotFoundException {
        // try句で、リソースを解放する必要のあるオブジェクトを生成する。
        // (対象のオブジェクトは、java.lang.AutoCloseableの実装クラスのみ)
        try (FileInputStream fis = new FileInputStream("C:\\work\\java\\idea_project\\src\\Test.java")) {
            fis.available();
        } catch (IOException e) {
            throw new RuntimeException("main failed.", e);
        }
    }
}