トップ «前の日記(2006-02-21) 最新 次の日記(2006-02-23)» 編集

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2006-02-22 [長年日記]

% [雑談] マツダとトヨタのエンブレムがどっちがどっちかわからなくなる病気

具体的に言うと……

「これはマツ……トヨタ。」
「これはマツダですよ〜」
「わかってるねん。わかってるねんで?」

こういう感じ。(具体的?)

トヨタをマツダに間違えることはないんだけど、なぜかマツダを見てもマツダだったかトヨタだったか確信を持てないんだよな。 結局「あれ、どっちだっけ?」と思いながらトヨタの車を探す。 (確かめるためにね)

他の会社のは間違えないんだけどね。 なぜかマツダだけは自信が無い。 いっつも確かめた後は「なんだ、全然似てないじゃん」って思うんだけど、しばらくするとやっぱり迷う。

ちなみに今わしが乗ってる車はスバルのプレオっていうのだが、こいつにはなぜか六連星じゃなく『P』の文字をあしらったエンブレムが付いている。 でも変にデフォルメしたせいで縦棒が短いからぶっちゃけ『D』にしか見えない。 うちの母親を含め、近所のおばちゃんはみんなダイハツの車だと思ってたらしい。

街でプレオを見かけて「お、良いな」と思った人がどれだけいたかはわからないが、それなりに商機を逃してたんじゃないのかなあ、スバルは……などと思ったりもする。

% [雑談][Ruby] do .. end 記法にも慣れてきた

……のは良いんだが、ついでに半分洒落で練習してたカッコ無し記法まで定着してきててヤバス。 なんかこう、深く考えずにスラスラっと書くと、まったくカッコを使わずにメソッド呼び出ししているワナ。

どう見ても OCaml の呪いです。 本当にありがとうございました。

って言うか、C で書くときにすら関数名の次に無意識のうちにカッコじゃなくスペースを置いてしまうのは、かなり病気でしょう。 でもまあ、C だとそれじゃうまく行かないから自然と矯正されるんだけど、Ruby の場合は (特に irb なんかで一発処理して終わりとかだと) 普通に動いてしまってそのまま……ってことが多いんで、矯正される機会もなくますますカッコ無しに慣れていくという循環が。

だいたい、以前はすごく気持ち悪いと思ってたこの記法も、今ではまったく違和感を感じないっつーか、むしろカッコがある方が気持ち悪く感じるほどに調教されてしまっているのはどうなんだろうな。 でもあれだな、C なんかがカッコ使ってても何も変に思わないってことは、実は Ruby にはカッコが似合わないってことなのかも。 もともと制御構造やなんかにブレース使わなかったりするし、そこら辺のバランスで見栄えに関する感じ方が違うのかも知れないなあ。

% [Ruby] 慣れないことはしない方が良い

基本的にわしは破壊的メソッドは使わない性質で、特に非破壊的なのと両方あるようなものについては、よほどのことが無い限り非破壊的な方を使うのを好む。 なんだけど、なぜか今日に限って気まぐれで破壊的メソッドを使ってみたんである。

・・・見事にハマッた...orz

今回使ったのは Array#compact! なんだけど、こんな風に書いてたわけ。

ary.compact!.join

普段は

ary.compact.join

と書くので何ら問題は無いんだが、上の例だと時にはハマる。 要するに compact! で ary の中身が変わらなかったときには self じゃなく nil が返ってくるんで join が NoMethodError になるわけだ。

たしか何かで読んだ話では、値の変更があったかどうか確かめられるように、無変化の場合は nil を返す…とかそんなポリシーだったかしらん。 普段破壊的メソッドなんて使わないから、そんな話は思いっきり忘れ去ってたよ。 10 分くらいエラーになる原因がわからなくて悩んでしまったじゃないか、もう。

こんな微妙な問題にわずらわされない富豪的プログラミング万歳。 やっぱりよほど必要に迫られない限りは、破壊的メソッドなんて使うもんじゃないな。 いや、普段から馴れとかないといざってときに困るだろ、って話も無くはないんだけど……

% [OCaml] godi 初心者日記

そうかー、godi って OCaml のバージョンは自動で上げてくれないんだなあ。 一体いつになったらアップデートされるんだろーとか思いつつ、今日になってふと godi のページ見てみたら 3.09 に対応してるようなこと書いてあってびっくらこいたのであった。

仕方ないのでユーザマニュアルを読む (先に読め)。 ……えーと端的に言って、

<PREFIX>/etc/godi_conf の GODI_SECTION を変更してアップグレード

ってことだと思われる。 パッケージのバージョンがダウンしてたりしてうまくアップグレードしてくれないときは、<PREFIX>build 以下の apps, base, conf, godi っていうディレクトリを消してもっかいやれとも書いてあるようだ。

てなわけで、ようやくわしも遅まきながら 3.09 の世界へ。 つーか、何か大きく変わったことってあったんだっけ? gauche に浮気してたせいで(謎)チェックしてねえ〜

% [WideStudio][Ruby] libws.rb

たまには WideStudio のことでも書く。 もう忘れそうになってるが、一応わしも開発メンバーに入ってるのだ。 興味が全然無くなってしまったわけではないんだが、今はちょっと優先順位が低いんだなあ、これが。 ……ともあれ。

WideStudio の Ruby バインディングは (と言うかネイティブである C++ 以外の言語は…かも知れないが) Rubyist にはあまりウケがよろしくないようである。 基本的に C++ でのお作法と歩調を合わせた作りだからして、あれはあれで良いところもあると思うんだがまあ Ruby 的に気に食わないってのも気持ちはわかる。

気持ちはわかってるんで、もう少し Ruby 的に使いやすくするラッパーの仕様とか考えたりもする。 んで、試しにちょろっと書いてみて、途中でほっぽってたのを思い出してしまったんで、少しだけいじって最低限動くようにしてみた。 ちゃんとした形で配布するにはまだまだだけど、とりあえず遊べるようにはなって来てる感じなんで、なんとなくここで晒してみようかと。

ダウンロード(zip 形式)

WideStudio の情報を目当てにここを見てる人なんて多分いないと思うけど、ご意見ご感想はツッコミかメールでよろしく。

ざっと解説と使い方説明。 根っこのところでは irb で遊ぶのを目的にしてるんで、ややこしい初期化だとかを勝手にやってくれるように作ってある。 今のところ定義されてるクラス・モジュールは以下の四つ。 多分もう増えない。

  • module
    • WsApp
      • アプリケーションの初期化なんかに関するメソッド群。WsObject に include しちゃってるんで、単体で使う事はまず無いはず。
    • WsUtils
      • wsbuilder が吐く win ファイル (GUI の見た目設定) を読み書きするメソッドとかを用意するつもりだけど、めんどくさくてまだ書いてない。簡易パーサ書かなきゃだめっぽいからメンドイの。他にもメソッドのアイデアはあったと思ったけどもう忘れた。
  • class
    • WsObject
      • 基本クラス。って言うかこれだけで全部のクラスをまかなえるコンテナみたいなの。Java で Eclipse のプラグイン書いてた時に (それは結局日の目を見なかったけど) 使ってたパターンを再利用してる。こいつが持ってないメソッドを呼んだときは、method_missing でラップしてるオブジェクトに丸投げ (ほんとは何か細工した方が良いとは思うが)。[] 演算子でプロパティ操作。
    • WsMainWin
      • WsObject のサブクラス。WSCmainWindow だけはちょっと特殊な扱いした方が良いかと思って。EXIT トリガのフックを簡単に書けるようにしたいと思ってるけど未実装。

エラー処理はかなり適当 (って言うかやる気なし)。 WsObject の機能は WSCbase 辺りに特異クラスで突っ込んでやれば良いような気もするけど、なんでラッパークラスに包むようにしたんだっけなあ? なんか WSCbase からのダウンキャストができない制限をなんとかする仕組みを突っ込むためだった気がするけど、詳しいことは忘れちったよ (ダメだ〜)。

細かいところはソース読むか、使ってみて身体で覚えるべし(何

実行例は irb で。

% irb
irb(main):001:0> require 'libws'
./libws.rb:136: warning: don't put space before argument parentheses
./libws.rb:136: warning: parenthesize argument(s) for future version
=> true

なんか警告出てるけど気にすんな。カッコ無しで書き直したせいだから(爆

irb(main):002:0> mwin = WsMainWin.new
Mwt::WSCmainWindow
=> #<WsMainWin:0x47644 @ws_instance=#<Mwt::WSCmainWindow:0x474f0>,
   @child_list={}, @ws_class=Mwt::WSCmainWindow>

とりあえずこれでウィンドウは出る。 アプリケーションの初期化処理とかは内々でやってるんで気にしない。

irb(main):003:0> mwin.activate
=> nil
irb(main):004:0> mwin.update
=> true

出たでしょ。 ボタンとか配置してみる。

irb(main):005:0> mwin['x'] = 400
=> 400
irb(main):006:0> mwin['width'] = 400
=> 400
irb(main):007:0> mwin['height'] = 400
=> 400
irb(main):008:0> btn = mwin.add_child("WSCvbutton", "btn")
#<WsApp::WsException: invalid class name.>
=> #<WsObject:0x6f554>

うげ、クラス名間違えた。

irb(main):009:0> btn = mwin.add_child("WSCvbtn", "btn")
Mwt::WSCvbtn
=> #<WsObject:0x14bd114 @ws_instance=#<Mwt::WSCvbtn:0x14bd0b0>,
   @child_list={}, @ws_class=Mwt::WSCvbtn>
irb(main):010:0> btn['width'] = 100
=> 100
irb(main):011:0> btn['height'] = 30
=> 30
irb(main):012:0> btn['x'] = 20
=> 20
irb(main):013:0> btn['y'] = 20
=> 20
irb(main):014:0> mwin.update
=> true

あれ?表示されないな。 されるはずだけど……どっか間違ってんのか? とりあえず放置して……

irb(main):017:0> def test_proc obj
irb(main):018:1> Mwt.WSGIappMessageDialog.popup
irb(main):019:1> end
=> nil

関数定義して…

irb(main):020:0> mwin.add_proc 'test_proc', Mwt::WSEV_ACTIVATE
=> 5084480

ああ!!じゃなくてこう、

irb(main):021:0> btn.add_proc 'test_proc', Mwt::WSEV_ACTIVATE
=> 5197024

ボタンにプロシージャとして登録。 メソッド名は文字列だけじゃなくシンボルも使えるようにした方が良いな。 あとで直そう。

irb(main):023:0> mwin.start_event_loop

えい。 ぐあ、mwin に間違って登録したプロシージャが動いちゃってダイアログが出てしまった。 キャンセルでそれを消すと……お、ボタンも表示されたな。 うーん、でも update で表示がリフレッシュされないのは何でだ? なんか仕様変わったかな。 ともあれ、ボタンを押したときのイベントプロシージャもちゃんと動くね。よしよし。

こうやって説明してみて思いついた今後の展望とか (どっちにしろモチベーションの問題なんで、いつになるかはわからんが)

  • プロパティ設定をも少し楽にしたい
    • 座標系とかアンカー系なんかは一個一個の要素を設定するより配列かなんかで一発で書けた方が楽だよなあ…とか。
  • イベントプロシージャにブロック渡ししたい
    • 大元の拡張ライブラリの方をいじらんと無理かも。つーか mwt_proc.cpp は前々から何とかしたいと思ってはいるんだが……
  • グローバルインスタンス (WSGIapp* なヤツ) をラップするためのクラスもあった方が良いな
    • まあ WsObject のサブクラス作って initialize で細工すればすぐだな、これは。

% [雑談] コメントスパム業界(謎)も大変だ

たださんのところに変わったコメントスパムが付いていて、いろいろ考えてるなあ…と関心してたんだが実は手動だったらしい(笑

いやほんと、お疲れさんと言うしかない。

% [雑談][Ruby] 今回のるびま

コードレビューはテンションがおかしくておもしろかったなあ。 あのノリでわしも辛口添削されてみたい気もするが、立ち直れないダメージ受けそうな気もするから止めておこう。

お名前:
E-mail:
コメント:

トップ «前の日記(2006-02-21) 最新 次の日記(2006-02-23)» 編集

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com