2006年11月04日

MacBookを買いました

3年半使っていた東芝C8が壊れてしまったので、これを機会に以前から欲しいなと思っていたMacBookを買ってしまいました。まだ買って一週間経っていませんが、いい買い物したなと思います。格好良いGUIとUNIXのターミナルが使えるというところが最高です。

ウノウラボ Unoh LabsさんのWeb系エンジニアの目から見たMac OS Xというエントリーを参考にしながら、以下のアプリケーションをとりあえずインストールしてみました。

  1. FireFox
  2. TextMate
  3. GHC(Haskell Compiler)
  4. Rubyを1.8.5にアップデート
  5. Ruby on Rails
  6. Carbon Emacs
  7. iTerm
  8. Eclipse
  9. MySQL
  10. Xcode
  11. Darwin Ports

あとまだインストールしておりませんが、仕事ではC#を使って開発しているので、自宅でもC#でプログラミングしたいときが稀にあります。本当稀なんですけどね。なのでMonoをインストールしてみようかなと思っています。

2006年10月15日

Ruby学習メモ - Creation Method

パターン指向リファクタリング入門の第6章「生成」を参考にして、コンストラクタ経由でインスタンスを生成するのではなく、staticなインスタンス生成用メソッドでインスタンスを生成するサンプルプログラムを書いた時のメモです。

class Song
  def initialize(name, artist, duration, lyrics)
    @name = name
    @artist = artist
    @duration = duration
    @lyrics = lyrics
  end

  # newはprivateなクラスメソッドとして宣言したので、newを直接呼び出してインスタンスを生成することが出来ない。
  private_class_method :new
  
  #歌詞なしのSongインスタンスを生成するCreation Method
  def self.create_song_without_lyrics(name, artist, duration)
    song = new(name, artist, duration, nil)
    return song
  end
  
  #歌詞ありのSongインスタンスを生成するCreation Method
  def self.create_song_with_lyrics(name, artist, duration, lyrics)
    song = new(name, artist, duration, lyrics)
    return song
  end
  
  def details
    return "Title: #@name  Artist: #@artist  Duration: #@duration  Lyrics: #@lyrics"
  end
end

irbを起動して遊んでみる。

d:\Development\PracticeRuby>irb
irb(main):001:0> load 'song.rb'
=> true
irb(main):002:0> song = Song.create_song_with_lyrics("Lessons in Love", "Level 42", 400, "I'm not pr
oud, I was wrong And the truth is hard to take. I felt sure we had enough.....")
=> #
irb(main):003:0> another_song = Song.create_song_without_lyrics("Whatever", "Oasis", 300)
=> #
irb(main):004:0> song.details
=> "Title: Lessons in Love  Artist: Level 42  Duration: 400  Lyrics: I'm not proud, I was wrong And
the truth is hard to take. I felt sure we had enough....."
irb(main):005:0> another_song.details
=> "Title: Whatever  Artist: Oasis  Duration: 300  Lyrics: "

両方のCreation Method内で、song = new(name, artist, duration, lyrics)のところをsong = Song.new(name, artist, duration, lyrics)と書いたら以下のエラーが出ました。

irb(main):010:0> aSong = Song.create_song_with_lyrics("Uptown Girl", "Billy Joel", 300, "Uptown Girl
...")
NoMethodError: private method `new' called for Song:Class
        from ./song.rb:27:in `create_song_with_lyrics'
        from (irb):10
        from :0
irb(main):011:0> aSong = Song.create_song_without_lyrics("Uptown Girl", "Billy Joel", 300)
NoMethodError: private method `new' called for Song:Class
        from ./song.rb:21:in `create_song_without_lyrics'
        from (irb):11
        from :0

newをprivateなクラスメソッドにしても、同じクラス内だからSong.newでインスタンスを生成出来るのかなと思ったのですが、出来ないみたいですね。

プログラミングRuby 第2版 言語編の31頁に、privateメソッドは、明示的なレシーバーを指定して呼び出すことはできません。レシーバーは常に自分自身(self)ですと書いてありました。

Song.newの代わりにself.newと書けばエラーは出ないのだろうか?

試して見ます。

#修正前(Songクラスより一部抜粋)
#歌詞なしのSongインスタンスを生成するCreation Method
  def self.create_song_without_lyrics(name, artist, duration)
    song = Song.new(name, artist, duration, nil)
    return song
  end
  
  #歌詞ありのSongインスタンスを生成するCreation Method
  def self.create_song_with_lyrics(name, artist, duration, lyrics)
    song = Song.new(name, artist, duration, lyrics)
    return song
  end
#修正後(Songクラスより一部抜粋)
#歌詞なしのSongインスタンスを生成するCreation Method
  def self.create_song_without_lyrics(name, artist, duration)
    song = self.new(name, artist, duration, nil)
    return song
  end
  
  #歌詞ありのSongインスタンスを生成するCreation Method
  def self.create_song_with_lyrics(name, artist, duration, lyrics)
    song = self.new(name, artist, duration, lyrics)
    return song
  end

上記のようにSongクラスを修正して、再度irbを起動して試してみましたが、同じようなエラーが出ました。

d:\Development\PracticeRuby>irb
irb(main):001:0> load 'song.rb'
=> true
irb(main):002:0> aSong = Song.create_song_without_lyrics("Uptown Girl", "Billy Joel", 300)
NoMethodError: private method `new' called for Song:Class
        from ./song.rb:21:in `create_song_without_lyrics'
        from (irb):2
irb(main):003:0> aSong = Song.create_song_with_lyrics("Uptown Girl", "Billy Joel", 300, "Uptown Girl
...")
NoMethodError: private method `new' called for Song:Class
        from ./song.rb:27:in `create_song_with_lyrics'
        from (irb):3
        from :0

Song.newをself.newにしても状況変わらず。newをprivateなクラスメソッドにしたら、同一クラス内部内からでもSong.newの形でインスタンスを生成出来ないみたいですね。勉強になりました。

洋書多読 - 300万語通過

2004年の12月末に200万語を通過してから、約二年かけて100万語を読み今日300万語を通過しました。

この二年間は多読に重きを置いていない生活でしたので、多読に対する深い思いとか感想はあまり思いつかないんですね。なのでとりあえずExcelでこの二年間に読んだ冊数をグラフ化してみました(笑)

まず読んだ冊数の合計を数えたところ68冊でした。

グラフにしてみて分かったことは連続ではないが、全く読まない月が7ヶ月あったこと。ただ読んでいたのかもしれませんが、読書手帳に記録していなかっただけということもあり得ます。ただもう何分過去のことなので、0冊の月に本を読んだのかどうかさっぱり覚えていません。

2005年12月から2006年2月末にかけて、卒研用にAgile Web Development with Railsを読んでいました。これは冊数に数えていません。洋書を読んだ理由は翻訳書が当時まだ出ていなかったからです。この本を毎日通勤途中に読み、結構ぼろぼろになるまで読みました。今年の6月行われたRuby会議で著者の一人であるDHHにサインを頂きました(嬉)

再読した本が何冊かあるのですが、これも記録していません。記録しなかったのはただ面倒だったから。

今年の4月末、久しぶりにSSSブッククラブに再入会しました。しかし借りても読まないで、そのまま返却なんてこともありました。

今年の九月に読む量が増えたのは、あともう少しで300万語通過だという思いがそうさせたのです。300万語通過ドーピングです(笑)

400万語に向けて、更にゆっくり且つ適当にそして易しめの本を沢山読んでいきたいなと思っています。

2006年10月02日

Ruby-文字列中に文字を埋め込む

久しぶりの更新そしてRubyの学習メモです。

#{変数}のようにすると文字列中に変数を埋め込むことが出来ます。ダブルクォーテーションはこの#{変数}を、その変数が持つ値で置き換えてくれます。

#文字列中に変数を埋め込んでない場合
class Song
  attr_reader :name
  
  def initialize(name, artist, duration)
    @name = name
    @artist = artist
    @duration = duration
  end
  
  def to_s
    #文字列と変数をつなげて書くのが大変
    return "Song: " + @name + "--" + @artist + " (" + @duration.to_s + ")"
  end
end
class Song
  attr_reader :name
  
  def initialize(name, artist, duration)
    @name = name
    @artist = artist
    @duration = duration
  end
  
  def to_s
    #変数を文字列中に埋め込むとかなりすっきりする。
    return "Song: #{@name}--#{@artist} (#{@duration})"
  end
end

因みに上記サンプルは、プログラミングRuby 第2版 言語編のP14に掲載されているサンプルにほんの少し手を加えたものを引用させて頂きました。

2006年09月05日

Exploratory programming

Exploratory programming is the process of learning about what a library or API can do by writing quick programs that use it.

最近Exploratory programmingというものを知りました。Exploratory programmingとはどうやら簡単なスクリプトを書くということを通してライブラリやAPIの働きを学ぶことを言うらしいです。間違っていたらご指摘下さい。

Rubyの場合irbというものがあります。irb上でオブジェクトを生成しメソッドを呼び出しているだけで、そのメソッドがどんな値を返してくれるのか、どのような働きをするのかを簡単に学べます。こういうのをExploratory programmingと言うのかな?(多分)

APIリファレンスを読むのも大事でしょうが、本当簡単なスクリプトというか一行のコードを書いて、メソッドの働きを知ることが出来るというのは大変便利なことだなあと思うのであった。

XP祭り2006

久しぶりの更新です。mixi日記を初めてからBlogの更新が滞っております。ところで昨日はXP祭り2006へオージーコーナーのozさんと行って来ました。

一番最初に面白いなと思ったのは平鍋さんのXPの現在過去未来のマインドマップかな。こんなにXP関連の沢山本が出ているんだと圧倒されました、このマインドマップで紹介されていた本は全部読んでみたい。しかし全部の本を読破できる日はいつになることやら。

そういえば平鍋さんは、共感出来たことが出てきたら、「がっしゅ!」と叫んでくださいと仰っていましたが、恥ずかしがりやの私は叫べませんでした(汗)

他にも興味深いセッションありましたが、これだけは言っておきたい!もし来年のXP祭りでもまたプログラミングコンテストがあれば私とozさんはoz組として参加することに決めました!

今回のプログラミングコンテストでは、XP初心者ですというチームが多かったので、来年はXP開発を実践している方が一チームに一人ずつ指導者がコーチとして参加して、プログラミングコンテストを通してXP開発も学べるようになれば尚良いなと思いました。

それとXP祭りに関係なくこの手のプログラミングコンテストを定期的に開催してくれれば良いのになあと思いましたが、我侭かな(汗)その場合もXP経験者がチームに一人入って頂き、いろいろと指導又はコーチングしてくれると大変ありがたいです(^^)

以上勝手な事をいろいろと書きましたが、来年もXP祭りに参加したいと思います。

XP祭りスタッフの方お疲れ様でした。また来年も宜しくお願い致します。

追伸 僕の前に座っている方はt-wadaさんだったらしいということに後で気が付きました。t-wadaさんのオブラブイベントのテスト駆動開発に関するプレゼン資料を読んで、この方にはお会いしたいなと思ったら、私の目の前に座っている方がt-wadaさんでした。今回はまともにお話すること出来ませんでしたが、いつかどこかで会ったらお話できたらなあと思います。でも私人見知りなんであまり良く話せないかもですね(汗)

二伸 普段自分自身は仕事で一応テストファーストで開発しています。それと単体テストが通った後はリファクタリングしているけど、XP実践者と言えるのかな?これだけじゃあ言えないな(^_^;)

三伸 KPTじゃなくて、KPTPと何方かが仰っていたが、これ知ったときは、おお!!おお!!これこれと思った。RORwC勉強会を続けていて毎回KPTを行っていたのですが、KPTのKがたまりたまってきて、これどうしようかな毎回Kとして書いていくのも何だしなと思っていたのだった。

ふむふむ、KをPracticeにしてしまえば良いので砂。これは良いこと学べたと思った瞬間でした。

2006年08月06日

OLYMPUS デジタルカメラ μ810

OLYMPUS デジタルカメラ μ810 シルバー

私が使っているというか所有しているデジカメは、IXY Digital 320というモデルでして、3年前に購入したものです。普段デジカメを使うことは、それ程多くはありません。しかしたまに出かけた時など撮影することがあります。昼間の撮影は得に問題ないのですが、夕方や夜の撮影はほとんどが失敗します。

そこで「手ぶれ補正機能」のデジカメだったら失敗写真も減るだろうと思い、「手ぶれ補正機能」付きのデジカメを少し調べていたら、オリンパスの「μ810」というデジカメのサイトに辿り着きました。

このサイトに載っている「ぶれ軽減モードのないカメラで撮影」と「μ810のぶれ軽減モードで撮影」の比較写真を見たら、このデジカメが欲しくなりました(汗)でもデジカメを買い換える理由がないので、我慢ですなあ。

そしてもっと驚いたのが、このサイトで「電子手ぶれ補正機能」を試せるんです。手ぶれ補正機能を使ってないのと、使った写真を見ていたらまた欲しくなりました(笑)

う~ん、まいったなあ。シンプルライフ実践派なので物欲強くないんですが、久しぶりに欲しい欲しいという声が頭の中で鳴り響いていますよ!

2006年08月05日

GTDの次はNTG

オージーコーナーの管理者であるOZさんと、今日カフェでオージーコーナーの今後の展開について話しているうちに、それを知ったからといってプラスにもならないし、マイナスにもならないものってあるよねという話になった。

オージーコーナーの存在そのものが、プラスにもマイナスにもならないんですけどね(笑)

こういうプラスにもならなければマイナスにもならないものを、NTGと呼ぶことに決めました。

NTGはNothing To Getの略でして、何も得るものは無いという意味です。GTDを意識して略してみた(笑)

Nothing To Loseだと何も失うものはないという意味になり、少々悲壮感漂うので、Nothing To Getの方が緩い感じがして良いかと。

今年末までにNTGが流行りますように(祈)

MySQL5.0のHEAPテーブル

第5回 MySQL 5.0の新機能ストアド・プロシジャに書いてあるHEAPテーブルを試してみました。因みにHEAPテーブルとは、上記リンクによると、

「HEAPテーブルは,メモリー上に展開される,高速で動作するテーブルタイプだ。明示的に削除するか,MySQLのサーバー・プロセスを停止するまで,メモリー上に保持される。」とのこと。

(1)適当なDBに以下のDDLを実行

mysql> CREATE TABLE sample(
    -> id INT NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(100) NOT NULL,
    -> PRIMARY KEY(id)
    -> )TYPE=HEAP;
Query OK, 0 rows affected, 1 warning (0.12 sec)

(2) SHOW TABLESを実行して、sampleテーブルが作成されたことを確認します。

mysql> SHOW TABLES;
+--------------------------+
| Tables_in_rorwc_practice |
+--------------------------+
| actors                   |
| sample                   |
+--------------------------+
2 rows in set (0.00 sec)

(3)SHOW TABLE STATUS\Gを実行すると、sampleテーブルのEngineがMEMORYとなっていることを確認出来ます。

mysql> SHOW TABLE STATUS\G
*************************** 1. row ***************************
           Name: actors
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 6
 Avg_row_length: 2730
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: 7
    Create_time: 2006-07-30 11:12:47
    Update_time: NULL
     Check_time: NULL
      Collation: sjis_japanese_ci
       Checksum: NULL
 Create_options:
        Comment: InnoDB free: 11264 kB
*************************** 2. row ***************************
           Name: sample
         Engine: MEMORY
        Version: 10
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 306
    Data_length: 0
Max_data_length: 16246152
   Index_length: 0
      Data_free: 0
 Auto_increment: 1
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
2 rows in set (0.42 sec)

(4)SELECT * FROM sampleを実行して、現時点でのsampleテーブルの内容を表示します。まだ一件もデータを登録していないのでテーブルは空です。

mysql> SELECT * FROM sample;
Empty set (0.00 sec)

(5)データを一件登録してみます。

mysql> INSERT INTO sample (name) VALUES('Kate Hudson');
Query OK, 1 row affected (0.00 sec)

(6)再度sampleテーブルの内容を確認します。先程登録したデータが一件登録されていることが確認出来ました。

mysql> SELECT * FROM sample;
+----+-------------+
| id | name        |
+----+-------------+
| 1  | Kate Hudson |
+----+-------------+
1 row in set (0.00 sec)

(7)MySQLのサービスを再起動してから、sampleテーブルの内容を確認してみます。先程登録したデータが無くなっていますね。

mysql> SELECT * FROM sample;
Empty set (0.00 sec)

2006年07月22日

雑感

仕事ではC#を使い、趣味でHaskellとRubyを学んでいます。そしてJavaの復習もしたいなと思っていますが、なかなか時間調整が出来ず且つ勉強がはかどらずいらいらする日々を過ごすことが多い今日この頃です。

「ふつうのHaskellプログラミング」も9章辺りから良く分からず。とりあえず本に載っているサンプルコードを書きまくるしかないかな。

Haskellは私には難しいが今の感想です。これがやがてHaskellでコードを書くのは楽しいなという日が来るのかどうか楽しみです。

2006年07月08日

Ruby会議2006


今更ですが、6月10日と11日の両日共に、Ruby会議2006へ行ってきました。いろいろ書きたいことはありますが、書こう書こうと思っているうちに日が経ってしまいました。

あまりにも沢山の知識を仕入れ、そして刺激を受けすぎて、何を書けば良いのか分かりません。

なので一言だけ

Ruby会議へ行って良かった!いろいろなセッションで知識と刺激を受けることが出来たし。DHHのサインももらえたし(嬉)

そうそう生物学とか全然分からないけどBioRubyに惹かれた!!

また来年もRuby会議があれば参加したいです。

Rubyコミュニティに対して、何かしら貢献したいなと思う今日この頃です。友人や知人にRubyは楽しんだよということを伝える普及活動もRubyコミュニティに貢献しているという捕らえ方をして良いかな?

2006年07月07日

脱完璧主義宣言

完璧主義なところを脱したいということで、脱完璧主義宣言をしてみる。

何かしようとするとき、あれもこれもと沢山のことを考えて結局何も出来ないということが多いのは自分の欠点だと思いますので、これを直していきたいなと思います。

2006年06月17日

Ruby日記

Haskell日記に続いて、Ruby日記も開始しました。

のびのびなRuby日記

RubyやRuby on Railsなどの学習記録として末永く日記を続けていけたらなと思う次第です。

2006年06月16日

Haskell日記

Hatenaグループで、Haskell日記を始めてみました。

のびのびなHaskell日記

不定期更新で、いつまで続くか分かりません(笑)

2006年06月05日

print、putStrそしてputStrLn

文字列"P\t\tPHP\nJ\t\tJava\n"に対してprint、putStr、putStrLnを適用した結果の違いを確認してみました。

printの場合、\t(タブ)や\n(改行コード)のような制御コードは単なる文字列(文字?)として解釈されるみたいです。従って\tや\nはそのまま表示されます。

Prelude> print "P\t\tPHP\nJ\t\tJava\n"
"P\t\tPHP\nJ\t\tJava\n"

putStrとputStrLnは、printとは異なり\t(タブ)や\n(改行コード)を解釈して表示してくれるみたいです。printの時とは表示結果が異なります。

Prelude> putStr "P\t\tPHP\nJ\t\tJava\n"
P               PHP
J               Java
Prelude> putStrLn "P\t\tPHP\nJ\t\tJava\n"
P               PHP
J               Java

リストに対してputStrやputStrLnを適用すると、エラーが表示されて怒られますが、printだとそのまま返してくれます。

printはエラーが出ず、リストをそのまま返してくれる。

Prelude> print ["funny","sunny","cloudy","rainy","candy"]
["funny","sunny","cloudy","rainy","candy"]
Prelude>

リストに対して、putStrLnを適用すると怒られる。

Prelude> putStrLn ["funny","sunny","cloudy","rainy","candy"]

:1:10:
    Couldn't match `Char' against `[Char]'
      Expected type: Char
      Inferred type: [Char]
    In the list element: "funny"
    In the first argument of `putStrLn', namely
        `["funny", "sunny", "cloudy", "rainy", "candy"]'

putStrも同様に、リストに適用すると怒られる。

Prelude> putStr ["funny","sunny","cloudy","rainy","candy"]

:1:8:
    Couldn't match `Char' against `[Char]'
      Expected type: Char
      Inferred type: [Char]
    In the list element: "funny"
    In the first argument of `putStr', namely
        `["funny", "sunny", "cloudy", "rainy", "candy"]'