2007年9月の過去ログ

 

エンタの神様に出るようになり、テレビにも出るようになってきた小島よしお。始めはばかばかしいと思っていたけど、どうしてか分かんないけど見れば見るほどはまっていくのだ。「そんなの関係ねえ~はいオッパッピー」にはいつもつい笑ってしまう。でもこの人多分一発屋なんだろうなあなんても思ってしまうのだ。

しかし彼についてネットで読むとなんと早稲田大学教育学部の卒業だ。その頭脳を利用して芸能界を渡り歩けるか。


1869年から1870年までのマサチューセッツ工科大学の実際の入学試験がここに公開されている。かのMITだからめちゃめちゃ難しいかと思ってたが、そんなでもなかった。もちろんちゃんとした数学の知識がないと解けない問題ばかりだけど、高校時代に試しにやってみた難関大学の試験問題よりもかなりやさしい感じを受けた。難関大学は受験する力なんてなかったけどね。いつも高校時代にもっとちゃんと勉強してればよかったなあと思う・・・


半年ぐらい前に日本語のPS3を購入してから結構いろんな日本語のPS2ゲームを買った。多分10本以上は購入したと思う。その中で過去一ヶ月コツコツとやっているのがFF10。FF10は出たときに英語版のPS2を持っていたので英語版で遊んだことがある。今回は日本語でやっているのだが、英語版と日本語版ではやっぱり違う。英語版で遊んだときも面白かったことは面白かったが、何か「軽い」というか「薄っぺらい」という感じを受けたものだ。もちろん日本語は自分の母国語だし日本語の理解度が英語の理解度を上回るということもあるだろう。やっぱり日本語で遊ぶゲームのほうが面白い。


最近PowerShellでよく遊んだり実際の仕事に使ったりすることがある。このプログラミング言語で手の込んだプログラムを組んでみたいとは思わないが、結構面白いのだ。PowerShellのコマンドでdirと打ってEnterキーを押すと・・・

image

これを見ると普通のコマンドラインと変わらないじゃねえかと思うが、(dir).GetType()と打ってみると・・・

image

つまりdirのコマンドはSystem.Arrayのオブジェクトを返しているのだ。ということは、(dir)[0]と打つとリストの一番最初のが表示されるということだ。やってみると案の定下の画像のとおりになった。

image

さらにさらに(dir)[0].GetType()とやってみると・・・

image

なんと.NETのSystem.IO.DirectoryInfoではないか。うむ、ということはいろんなことができそうだ。DirectoryInfoのメンバーは覚えてないで、(dir)[0] | get-memberと打ってみると・・・

image 

インテリセンスまでとはいかないが、どんなメソッドやプロパティがあるのかを思い出す助けにはなるはずだ。

さらに便利なことに、(dir)[0].Createと括弧なしで打つと・・・

image

Createメソッドのみについてのメタデータを表示してくれる。メソッドを実行するにはちゃんと括弧をつけてやると実行される。

このようにPowerShellの世界ではすべてがオブジェクトなのだ。これは多分に.NETをベースにこのスクリプト言語が作られたことに理由があるだろう。またPowerShellをデザインしたエンジニアたちはUnitやLinuxやWindowsを含めたシェル=文字列という概念を打ち破りたかったのだろう。それを見事にPowerShellでは実現されている。

ちなみにPowerShellでインテリセンスみたいなものを実現した人がいる。こちらからダウンロードできる。

image


Yahoo Japanの辞書を使おうと思ったら平成男子という新語に出くわした。下に抜粋する。

これまで団塊ジュニアとよばれていた1970年代生まれの男子。現在20代半ば~30代半ばの男子である。35歳以下ということで「U35男子」ともいわれる。平成になって成人男子になったことから編集者・コラムニストでタクト・プランニング社長の深澤真紀が名づけた。70年代という豊かな時代に生まれ育ち、生き方が個人志向。社会や経済を動かすパワーが少ないとされている。特徴としては自分と家族が大好きで、仲間を褒めあい、男同士で買い物に行き、何かが話題になると必ずチェックを入れる。物事に深入りをすることを避け、人間関係はすぐにリセットし、据え膳は食わない。

35歳以下の男子ということだから自分に当てはまる。箇条書きにしてみると・・・

  1. 生き方が個人志向
  2. 社会や経済を動かすパワーが少ない
  3. 自分と家族が好き
  4. 仲間を褒めあう
  5. 男同士で買い物に行く
  6. 何かが話題になると必ずチェックを入れる
  7. 深入りを避ける
  8. 人間関係をすぐにリセット
  9. 据え膳は食わない

自分にも当てはまる項目はいくつかあるのだが、こんなもん40代や50代にも当てはまらないだろうか?平成男子という言葉は別に70年代生まれの男子のみの傾向ではないような気がするのだが。


こんなんで簡単にBase64の暗号化ができてしまう。素人目にはいいでしょうが、すぐに解読されてしまいますがね。

    class Base64
    {
        public string Encode(string text)
        {
            byte[] buff = System.Text.Encoding.UTF8.GetBytes(text);
            return Convert.ToBase64String(buff);
        }
 
        public string Decode(string text)
        {
            byte[] buff = Convert.FromBase64String(text);
            return System.Text.Encoding.UTF8.GetString(buff);
        }
    }

今回は.NETとの比較をしてみたいと思う。

クラスの定義(C#) クラスの定義(Ruby)
class HelloClass
{
 
}
class HelloClass
 
end
継承(C#) 継承(Ruby)
class HelloClass : MyBaseClass
{
 
}
def HelloClass < MyBaseClass
 
end
コンストラクタ(C#) コンストラクタ(Ruby)
class HelloClass
{
     public HelloClass()
     {
 
     }
}
class HelloClass
     def initialize()
     
     end
end
読み書きプロパティ(C#) 読み書きプロパティ(Ruby)
class HelloClass
{
    private string _myProp;
    public string myProp
    {
        get { return _myProp; }
m        set { _myProp = value; }
    }
}
class HelloClass
    attr_accessor :myProp
end

※クラス内でmyPropの値が必要なときは@myPropの変数を使う。
※読み専用のプロパティ(アトリビュート)はattr_reader、書き専用はattr_writerのキーワードを使用する。

クラスのインスタンスの作成(C#) クラスのインスタンスの作成(Ruby)
HelloClass h = new HelloClass();
h = HelloClass.new
パラメータ配列(C#) パラメータ配列(Ruby)
public void myMethod(params string[] moreParams)
{
 
}
def myMethod(*moreParams)
 
end
forループ(C#) forループ(Ruby)
for (int i = 0; i < 10; i++)
{
     Console.WriteLine(i);
}
10.times{|i|
    puts i
}

または

for i in 0..9
     puts i
end
文字配列(C#) 文字配列(Ruby)
string[] tohokuRokken = { "Aomori", "Akita",     "Iwate", "Miyagi", "Yamagata", "Fukushima" };
tohokuRokken = ['Aomori', 'Akita',      'Iwate', 'Miyagi', 'Yamagata', 'Fukushima']
配列の一つ一つの要素を取り出す(C#) 配列の一つ一つの要素を取り出す(Ruby)
string[] tohokuRokken = { "Aomori", "Akita", 
    "Iwate", "Miyagi", "Yamagata", "Fukushima" };
foreach (string ken in tohokuRokken)
{
    Console.WriteLine(ken);
}
tohokuRokken = ['Aomori', 'Akita', \
    'Iwate', 'Miyagi', 'Yamagata', 'Fukushima']
tohokuRokken.each{|ken|
    puts ken
}
HashTable(C#) HashTable(Ruby)
Hashtable tohokuRokken = new Hashtable();
tohokuRokken.Add(1, "Aomori");
tohokuRokken.Add(2, "Iwate");
tohokuRokken.Add(3, "Akita");
tohokuRokken.Add(4, "Miyagi");
tohokuRokken.Add(5, "Yamagata");
tohokuRokken.Add(6, "Fukushima");
 
foreach (object k in tohokuRokken.Keys)
{
    Console.WriteLine(k + "=" + tohokuRokken[k]);
}
tohokuRokken = Hash.new
tohokuRokken[1] = 'Aomori'
tohokuRokken[2] = 'Iwate'
tohokuRokken[3] = 'Akita'
tohokuRokken[4] = 'Miyagi'
tohokuRokken[5] = 'Yamagata'
tohokuRokken[6] = 'Fukushima'
 
tohokuRokken.each{|k, Value|
    puts k.to_s + '=' + Value
}
switch(C#) case(Ruby)
int caseSwitch = 1;
switch (caseSwitch)
{
    case 1: 
        Console.WriteLine("Case 1");
        break;
    case 2:
        Console.WriteLine("Case 2");
        break;
    default:
        Console.WriteLine("Default case");
        break;
}

例はMSDNから抜粋。

caseSwitch = 1
case caseSwitch
    when 1
        puts 'Case 1'
    when 2
        puts 'Case 2'
    else
        puts 'Default case'
end
if節(C#) if節(Ruby)
int hour = DateTime.Now.Hour;
if ((hour >= 0) && (hour <= 3))
{
    Console.WriteLine("Mayonaka");
}
else if ((hour >= 4) && (hour <= 7))
{
    Console.WriteLine("Souchou");
}
else if ((hour >= 8) && (hour <= 11))
{
    Console.WriteLine("Ohayou");
}
else if ((hour >= 12) && (hour <= 16))
{
    Console.WriteLine("Ohiru");
}
else if ((hour >= 17) && (hour <= 19))
{
    Console.WriteLine("Obandesu");
}
else
{
    Console.WriteLine("Yoru");
}
hour = DateTime.now.strftime('%H').to_i
 
if hour >= 0 and hour <= 3
    puts 'Mayonaka'
elsif hour >= 4 and hour <= 7
    puts 'Souchou'
elsif hour >= 8 and hour <= 11
    puts 'Ohayou'
elsif hour >= 12 and hour <= 16
    puts 'Ohiru'
elsif hour >= 17 and hour <= 19
    puts 'Obandesu'
else
    puts 'Yoru'
end

 

次回はもうちょっと.NET Frameworkに踏み込んだ比較をやる予定。


スコット・ハンセルマンさんの呼びかけでSeattleから約15分ぐらいのBellevueで行われたSeattle Nerd Dinnerに昨日行ってきた。モールの食堂街の片隅でスコット・ハンセルマンさんをはじめマイクロソフトに働いている人たちやソフトウェア技術者が集まって適当に技術に関して話すのだ。初めてスコットさんに会って話をしたのだ。4,5年前からブログやネットを通じて彼のことを知っていたので思っていたとおりの人だった。気さくでとても頭のいい人だ。写真も一緒に撮らせてもらったので下に載せておこう。

NerdDinner

スコットさんだけではなくて他のマイクロソフトに勤務している人たちとも少々話ができた。一人はWindows Server 2008のエバンジェリストをしている方でトランザクションNTFSについてを熱く語ってくれた。今のところはWindowsのAPIレベルでの組み込みのみで.NET Frameworkでのサポートは4.0かそれ以降になるとのことだ。

またIronRubyの開発者のジョン・ラムさんとも少々お話をした。あまり今どんな開発をしているのかを聞くことはできなかったが、スクリプト言語とコンパイル言語との境目が薄くなってきているというような話をしてくれた。

スコットさんは毎月レッドモンド本社に「参勤交代」に行く予定なのでまたNerd Dinnerをしましょうと言ってた。また参加していろいろな話を聞きたいと思っている。Nerd Dinnerはとても刺激的なものであった。


Rubyというプログラミング言語はカール・フランクリンさんがやっている.NET Rocksというポッドキャスト番組で3,4年ぐらい前に触れられているのを聞いたのみだった。またスコット・ハンセルマンさんが自身のブログでRubyなどについて書いた記事をさらっと読み流したこともある。なのでRubyというプログラミング言語が存在するというのは知っていたがあえて挑んでみようとは思わなかった。今でも.NETには毎日のように触れているが、何せ三、四年年前というと.NETを一生懸命やっていた時期でもあるので特にあまり気にせず今まで来たのだ。

今年に入って私が所属する会社の製品開発部である議題が持ち上がった。どうすれば開発部からのビルドの品質をより上げられるだろうかという問題が提起されたのだ。自動ビルドシステムはすでに開発してありその一部にユニットテストも組み込んでいる。百以上に及ぶテストが実行されるのであるが、それは中間層以下に対して行われるテストであり、ユーザインタフェースは全くテストされていなかった。開発からビルドが品質管理部によってテストされるとき、まれにウェブアプリにログオンした時に、開発者の単純なミスで始めのページでエラーが起こってしまうという事態が起こることがあった。そこでWatirというRubyを使って作成されたウェブアプリケーションをテストするフレームワークを使ってみることにした。そこで上司に一週間ほどもらってRuby+Watirのスクリプトを組んでみた。そこで学んだRubyというプログラミング言語について.NET Frameworkと比べながら自分の頭の中を整理する意味で徐々にこのブログで書いていきたいと思う。

エディタ

Hello World(プログラミング言語を学ぶときに必ずと言っていいほど紹介される例で単に画面上ににHello Worldという文字を表示させる簡単なプログラム)を紹介する前にエディタについて少々書きたいと思う。プログラミングをするには最低でもWindowsについてくるメモ帳が必要だ。もちろんRubyはメモ帳でも編集はできるがはっきり言って味気がないし編集しづらい。昨今では無料のテキストエディタが多く存在するが、私は秀丸派だ。秀丸はその軽快さと高機能さに感動し、10年ぐらい前まだ日本にいたときライセンスを購入した。あの時は確かバージョンが3ぐらいだっただろうか。今では7になったけど作者はそのまま無料で使わせてくれている。

秀丸のウェブサイトでRuby用の強調表示用のファイルが何人かの有志の方々によって書かれている。読み込み方は秀丸を開いて適当な文字列を秀丸に書き込んでTekitou.rbというファイルに保存する。そのファイルが開いた状態で秀丸のメニューからその他→ファイルタイプ別の設定を選択。するとウィンドウが出てくるのでそこから設定のリストのボタンをクリックする。設定のリストのウィンドウで新規のボタンを押しRubyと入力する。下の画像を参照。

image

設定のリストにRubyを作成したら後はダウンロードした強調表示ファイルをC:\Program Files\Hidemaruのフォルダに解凍して読み込ませるだけである。

image

これでRubyのソースコードが見やすく編集できる。これで秀丸でRubyを編集する準備は完了である。Rubyそのものをインストールするのを忘れずに。

Hello World

お約束どおりHello Worldプログラムを作成することにする。秀丸を開いて次のコードを入力する。puts ‘Hello World’それをHelloWorld.rbとして好きなディレクトリに保存する。自分の環境ではD:\RubyScriptsというディレクトリを作成してそこにHelloWorld.rbを保存する。後はコマンドプロンプトからD:\RubyScriptsにディレクトリを移動してruby HelloWorld.rbと入力すると次のような結果になる。

image

ちなみにこれが動かない場合はc:\ruby\bin\ruby HelloWorld.rbと入力するかc:\ruby\binのパスを環境変数のPathに追加することをおすすめする。

変数

Rubyでの変数の宣言は極めて単純である。例えばhという変数に’Hello World’という値を入れたい場合は単にh = ‘Hello World’とするだけである。そこで、前のHello Worldのプログラムを変数を用いて書き換えてみると。

h = ‘Hello World’
puts h

上のコードを実行してみると結果はputs ‘Hello World’と全く同じになる。h = ‘Hello Japan’と変えるとhの変数に入る値も変わるために表示される結果も変わる。

関数

関数を宣言するにはdefというキーワードを使う。例として二つの数字の積を返す極めて単純な例を下に書くことにする。

def Seki(a, b)
    return a * b
end
 
kekka = Seki(7, 8) 
puts kekka

 

上のコードを日本語で説明するとSekiという関数はaとbという引数をとり、その関数はaとbを掛けた値を返す。kekka = Seki(7, 8)の行でSekiの関数を呼び出し、7と8をその関数に渡す。Sekiは値を返すので返された値をkekkaという変数に格納する。そしてその次の行でその変数の値をputsで出力する。コードを実行すると下の画像のようになる。

image

まとめ

基本中の基本ということで実際の現場では全く役に立つことのない例ばかりだが、とりあえずこれがなくてはということを抑えておこうと思った。Rubyはスクリプト言語なので関数を宣言できればいいかと思えるが、実はRubyは完全なオブジェクト指向言語である。スクリプト言語でこんなことまでできるの?っていうこともたくさんある。マルチスレッドだってできてしまうのだ。生産性やモダンさから言うとVBScriptには勝っていると思う。MicrosoftもIronRubyとして.NET Frameworkにおいてサポートすると表明しているので将来性のある言語でもある。

次回からは.NET Frameworkとの比較をしてみたいと思う。


毎日テレビを見たりネットで日本のニュースを読んだりしていると政治とカネの問題が大々的に取り上げられている。マスコミは重箱の隅をつついているだけで日本人の生活や未来にとても影響があることを取り上げることが少ないような感じがする。政治家というのは多くの国民にいいことをできる権力を持っている。権力が国民にとっていいことに使われた場合にはちょっとしたミスで二重計上された領収書なんか取るに足らない問題なのである。それが故意に何度も行われて金額が多い場合には問題だと思うが、そうじゃない場合はあそこまで目くじらを立てて追求する必要があるのかどうか疑問だ。逆にいくらお金にきれいな政治家でも仕事ができなければ全く意味がないのだ。そういった意味で田中角栄はお金には汚いが日本に多大な功績を残した政治家の代表みたいなもんだ。

政治不信はどこから来るかというとはっきり言ってサヨクやマスコミがあおっているに過ぎない。考えても見よう。日本ほど民主主義がちゃんとしてて、自由が保障されている国がアジアにありますか?今の日本があるのはもちろん一般庶民が汗水流してがんばってきたのもあるが、政治家の先生たちも国民のためにがんばってきたんだ。それをマスコミは単に政治家はみんな悪代官のように報道するから彼らが日本のためにやろうとしている多くのいいことをができないでいるんだと思う。