ひ日誌
2007-11-26 ( ja -> en )
_ [macosx][mosa][msm2007][ruby][rubycocoa] MSM2007に参加してきました
先週末、MOSA Software Meeting 2007というイベントに参加してきました。このミーティングにはMac関係の開発者がたくさん参加しています。懇親会のゲームではEGWordをいただきました。EGBridgeいいですねー。受講者としては、デジタルステージの平野友康さんの話がおもしろく刺激を受けました。とても楽しそうな会社です。気分転換が重要(だから合宿するらしい)など。
旅する会社 (株)デジタルステージ代表 平野友康のすごいソフトウェア開発(平野 友康)
一方で講師としてRubyCocoaの話をしてきました。先月出たMac OS X 10.5 LeopardでフィーチャーされているRubyの魅力を伝えたかったのですがなかなかうまく伝えられた気がしません。RubyやRubyCocoaについて語るなら、少し冷却期間というか自分でいろいろ好きなものを作ってみる時間というのが必要な気がしています。そういう部分をこなさないと語れないというか...
WWDC(World Wide Developers Conference)2007のときにもお会いした東北大学の中島さんからは、教育システムの研究開発にRubyCocoaが役立っているという話を聞かせていただきました。学生がプレゼンテーションをしている様子を動画にとりながら聴衆が時間軸上に点数をプロットしていきます。それを再生することにより、学生はフィードバックを得てプレゼンテーション力を向上させていくというシステムです。このシステムのアプリケーション(QTKit使用かな?)をRubyCocoaで開発したということでデモを見せていただきました。RubyCocoaが役立っているようでうれしいですね。
ところで最近、フランスの作曲家ドビュッシーのピアノ曲「月の光」がマイブームになっていてときどき聴いています(ニコニコ動画で見つけた)。 とても美しい曲で、特に最初のテーマが再現されるあたりの徐々に高音にシフトしていく流れはほんと神々しいほどの美しさ。などと言葉で説明しても、どうにも陳腐な感じになってしまいます。世の中には言語化して説明するのが不可能だったり無粋なだけということも多いと思うのですがどうでしょうね。僕の感じているRubyの魅力というのも、どうにも言語化しにくいものの部類に入ってるような気がしてなりません。
2007-11-02 ( ja -> en )
_ 本物のドキュメントを記すと何がおきるか
10年くらい前、MacRubyという名前で旧Mac OS(とBe OS)上へRubyを移植していました。そのころどんどん進化を続けていたRubyのソースコードはtarballとパッチでのみ公開されていました。Mac OSのために自分が変更した部分と最新のRubyをマージしたりするのがけっこう面倒。CVSってのを使えば良さそうだけど、これを覚えて使いこなすのもまた大変そうだなぁ。とそんなとき、ネットで公開されていたKernel hackerのためのcvs入門という文書を読みました。良い具合にくだけていて要所をとらえてわかりやすい。これだ!これだよ必要なのは。ということでCVSの意味や使い方を知り、その後はCVSのありがたみを享受できるようになり、あるときは人におすすめ(押し付け)したりもしました。そんなことを思い出したわけです。
_ [macosx][leopard][ruby][cocoa][rubycocoa] CocoaRepl の便利なおまけ機能
HMDTの木下さんがCocoaReplのことを書いていたので、CocoaReplに仕込んどいたおまけ機能をいくつか紹介しときます。
NSWindowなどのオブジェクトを作るショートカット的なメソッド
手っ取り早く NSWindow を作って表示したいときは、以下のメソッドを使うことができます。
NSWindow.create NSWindow.create(800, 600) # width,height NSWindow.create(0, 0, 800, 600) # left,top,width,height
NSWindow以外にもいくつかあります。以下は使用例:
NSURL.create "http://www.apple.com/" NSURL.create "/etc/httpd/httpd.conf" NSImage.create "/Library/Desktop Pictures/Aqua Blue.jpg" NSImage.create "http://path_to_image_url/image.jpg" NSView.create NSView.create(360, 240) NSView.create(0, 0, 360, 240) NSTextField.create(300, 20) NSButton.create(300, 20) NSSlider.create(300, 20)
これらのメソッドはアプリケーションパッケージ内のファイル:
CocoaRepl.app/Contents/Resources/cocoa_sweets.rb
に定義されています(ソースがパッケージに含まれていて読んだり変更したりできるのもRubyCocoaの醍醐味のひとつ)。
起動時にRubyプログラムを実行させる
ホームディレクトリに .cocoareplrc という名前でRubyプログラムを書いておくと、毎起動時にそのプログラムが実行されます。よく書くクラス・メソッド・設定やよく使うライブラリのロード(require)などをあらかじめ書いておくと良いでしょう。例えば
include OSX
と書いておけば、OSX::NSWindowなどと書くところの OSX:: の部分を省略できます。
起動時に表示されるRubyプログラム
CocoaReplは、Eval系コマンドを実行するごとにホームディレクトリの .cocoarepl_scratch.rb というファイルにScratchビューの内容を保存しています。次回起動時にこのファイルの内容が読み込まれます。読み込まれるだけで実行(eval)はされません。
シンタックスカラーリング
syntaxというライブラリをインストールすると、構文の色づけができるようになります。syntaxはターミナルでgemコマンドを使ってインストールすることができます。
$ sudo gem install syntax
2007-10-28 ( ja -> en )
_ [macosx][ruby][cocoa][rubycocoa] LeopardでのRubyCocoaアプリ作成手順を動画にしてみた
Leopardで、ボタンをクリックするとテキストフィールドに入力したテキストを読み上げるだけの単純なRubyCocoaアプリケーションを作る様子を動画にしてみました。あまりにぼけぼけでわかりにくいので公開はなしにしようかと思ったけど、せっかく作ったので字幕だけつけて公開します*1。
おおよその流れは以下の通り。
- プロジェクトを作る
- コントローラの実装 (ボタンが押されたら標準出力にテキストをプリント)
- InterfaceBuilderでビューを編集
- 実行して確認
- ボタンが押されたらテキストを読み上げる機能を機能を実装
- 実行して確認
最初のコントローラ(テキストを標準出力にプリント)のソース:
# SpeechController.rb
class SpeechController < OSX::NSObject
include OSX
ib_outlet :textField
ib_action :speech do
puts @textField.stringValue
end
end
読み上げ機能を実装したSpeechController.rbのソース:
class SpeechController < OSX::NSObject
include OSX
ib_outlet :textField
ib_action :speech do
speech_string @textField.stringValue
end
def speech_string(str)
voice = NSSpeechSynthesizer.defaultVoice
synth = NSSpeechSynthesizer.alloc.initWithVoice(voice)
synth.startSpeakingString(str)
end
end
_ [macosx][ruby][cocoa][rubycocoa] Xcode 3.0 と InterfaceBuilder 3.0 の連係が素晴らしい
何が素晴らしいか。Xcode上でRubyで書いたコントローラのプログラムを更新(保存)すると、InterfaceBuilderでコントローラのクラスが選択できるように自動的に反映されます。コントローラプログラムに書いたアウトレットやアクションも自動的に反映されます。上の動画ではこのあたりを見せているつもりです(ぼけぼけでわかりにくいけど)。
逆に、InterfaceBuilderで追加したアウトレット・アクションを、Xcode上のRubyファイル編集ウィンドウにドラッグドロップすることもできます。また、IBで作ったコントローラからRubyプログラムを生成することもできるようになっています(これはまだ改善の余地がある感じ、RubyCocoa.frameworkの中にあるrb_nibtool.rbに改善の余地あり)。
基本的には、Xcodeでソースを編集してから、InterfaceBuilderで接続したりするという流れの方が使い勝手が良さそうです。
_ [macosx][ruby][cocoa][rubycooca][rails] 近況
Loepardとtypoしまくってます。ForeFrontという会社でRailsアプリを開発したりしてます。それから、MOSA Software Meeting 2007 で、RubyCocoaを中心にLeopardのRuby環境について話したりデモしたりすることになっています。
_ [ruby][cocoa][rubycocoa][macosx] RubyCocoa 1.0 とは
RubyCocoa 0.12 (Leopardに入っている)のことです。ひとりひとり名前をあげることはできませんがいろんな形でサポートしていただいた皆様どうもありがとう。
*1 最初、初音ミクに解説をお願いしてみたのだけどちょっと難しくて断念。歌は上手に歌ってくれますがナレーションは苦手なよう
2007-08-23 ( ja -> en )
_ [ruby] Hashリテラルは書いた順序で繰り返して欲しいよ派に転じた
ruby-listで話題になってたHashへの生成順は保障されないのか?について、どちらかというと「Hashなのに順序があるのには違和感あるよ派」だったんだけど、きのうのSICP読書会の会場を提供していただいたささださんと話してたら
- そもそもArrayだってArrayじゃないよ
- Arrayなのに両端キュー(deque)とおなじことができるよ
- だったらHashだけど順序があったていいじゃん
- Rubyは何でもありなんだよ。それがRubyなんだよ
と説得?された。それもそうだなぁ。その気になれば他にいくらでも突っ込みどころがありそうな雰囲気がなくもないのだから、Hashの意味にだけこだわってもしょうがないような気はする。さらに、MLで上がっていたHashのリテラル表記
{ KEY1 => VAL1, KEY2 => VAL2, ... }
は明らかに順序が見えるのだからそのとおりに繰り返すのは自然、実装はHashじゃなくてもいいじゃん、という考えにはとても説得力がある。このリテラル表記どおりに繰り返してくれると Objective-C のメッセージ送信にそのまま使えるので、RubyCocoa プロジェクトの立場から見てとてもポイントが高い。
railsプログラミングでも多用されてるキーワード引数がわりのHashリテラル。キーワード引数的な用途だと、要素数は少なめでしかもすべての要素を見ることになりそう。だったらHashよりも小さそうなデータ構造(配列とか木とか単純なリストとか)でもいいんじゃないかなという気すらしてきた。
ところで、ささださんがIPA未踏ソフトウェア創造事業2006年度下期千葉PM採択プロジェクト最終成果報告会で「Ruby 1.9 〜これからの Ruby〜」というタイトルで講演されるそうです。「エンタープライズの現場としての Ruby」とか「これからの Ruby」に興味のある方はお見逃しなく。
(おまけ) 自分はというと、エンタープライズと聞いてウェアラブルコンピューティングの人の付けてる眼鏡(視点センサー?)がボーグっぽい…という連想をしてしまうダメ人間。
2007-07-17 ( ja -> en )
_ [rubycocoa][ruby][cocoa][macosx] RubyCocoaの対話環境のこと
RubyCocoaのための対話インタープリタのユーザインターフェースとして、なぜirbコンソールタイプではなく、CocoaReplのようなスタイルにこだわるのか?ということをLaurentから聞かれたので、それについて覚え書き。
まず、プロンプトって何だろう?ということについて。
- irbやshellなどの対話環境が表示するプロンプトは、行端末のためのユーザインターフェース
- 現在のいわゆるGUIでは、プロンプトに相当するものは別の形で表現するのが自然
- 行端末のためのインターフェース(console)に引きずられる必要はない
- 表現のひとつとして行端末的なインターフェースというのはありだけど
CocoaReplみたいなもののインターフェース面を考えるときにどこかしら意識しているものを列挙すると:
- 昔のパソコンのBasicインタプリタ
- HyperCard
- Squeak
- Emacs
- SLIME (Emacs上で動くCommonLisp環境)
- Dr Scheme
- Quicksilver (追記 ジャンル違うけど)
調べれば他にもいろいろあるのだろうなぁと思いつつ、よく知らないままにパッと浮かんだのはこのあたり。
この件に関して、なにかとEmacsと言い過ぎて誤解されがちな気がする…と思いつつまた言ってしまった。とりあえず、現在RubyCocoaのsampleに入ってるCocoaReplはかなりしょぼいので、ほんの少しだけましになった新しい方で置き換えるつもり(commitした)。
2007-06-29 ( ja -> en )
_ gmailの謎
gmailで新着メールがtrashに入ってて気付かなかった。即trash行きにするフィルタをいくつか設定はしてるけど、どうみても条件にマッチしてないのになぁ。
_ にくの日
肉食っぽい人たちと肉食ってきた。 肉食っぽい人たちのところでバイトする。 肉食っぽい人たちに食われたらどうしよう。 肉食っぽい人たちはアメリカにもいたよ。 肉食っぽい人たちは素っ裸。 肉食っぽい人たちは犬に噛まれる。 肉食っぽい人たちはキ○○○ラが好き。 肉食っぽい人たちは肉が好き。 肉食っぽい人たちは肉を食う。
2007-06-28 ( ja -> en )
_ [sicp][scheme] 素人くさいSICP読書会 Gaucheが落ちた
問題 3.23のdequeue。問題を解きだしたら、それだけで時間が終ってしまった。さらに、自分がBenと大差ないらしいことに気付く。danさんが言っていた双方向リストを使わない実装がどんなものか聞き忘れた。今考えると、思い当たるふしがなくもないので、あとで書いてみる。双方向リストで実装したものを動かしてたら、segmentation falut発生。これはひょっとしてGaucheの落とし方発見か?あとで0.8.10に上げて調べてみる。0.8.8を落とすコードをとりあえず以下に貼っときます(問題の解としてバグあり)。おなじコードをRubyで書くといかに読みやすいかというのもあとで上げるかも。
;;; 問題 3.23
;; dequeue -- 各アイテムの双方向にリンクされたリストで表現
;; dequeueの先端ポインタと末端ポインタの選択肢・変更子 -- queueの場合と
;; 同じ
(define (front-ptr q) (car q))
(define (rear-ptr q) (cdr q))
(define (set-front-ptr! q i) (set-car! q i))
(define (set-rear-ptr! q i) (set-cdr! q i))
;; dequeueアイテムの構築子・選択子・変更子 -- SICP本文のqueueは、直接
;; car,cdr,set-car!,set-cdr!を使っていたが、可読性を高めるために定義し
;; た。cons2つで、値・次ポインタ・前ポインタを構成。
(define (make-item v)
(cons v (cons '() '())))
(define (item-value i) (car i))
(define (item-next-ptr i) (cadr i))
(define (item-prev-ptr i) (cddr i))
(define (set-item-next-ptr! i p)
(set-car! (cdr i) p))
(define (set-item-prev-ptr! i p)
(set-cdr! (cdr i) p))
(define (empty-queue? q)
(null? (front-ptr q)))
(define (make-queue)
(cons '() '()))
(define (front-queue q)
(if (empty-queue? q)
(error "FRONT called with an empty queue" q)
(item-value (front-ptr q))))
(define (rear-queue q)
(if (empty-queue? q)
(error "REAR called with an empty queue" q)
(item-value (rear-ptr q))))
(define (rear-insert-queue! q i)
(let ((new-item (make-item i)))
(cond ((empty-queue? q)
(set-front-ptr! q new-item)
(set-rear-ptr! q new-item)
q)
(else
(set-item-prev-ptr! new-item (rear-ptr q))
(set-item-next-ptr! (rear-ptr q) new-item)
(set-rear-ptr! q new-item)
q))))
(define (front-insert-queue! q i)
(let ((new-item (make-item i)))
(cond ((empty-queue? q)
(set-front-ptr! q new-item)
(set-rear-ptr! q new-item)
q)
(else
(set-item-next-ptr! new-item (front-ptr q))
(set-item-prev-ptr! (front-ptr q) new-item)
(set-front-ptr! q new-item)
q))))
(define (front-delete-queue! q)
(cond ((empty-queue? q)
(error "DELETE! called with an empty queue" q))
(else
(set-front-ptr! q (item-next-ptr (front-ptr q)))
q)))
(define (rear-delete-queue! q)
(cond ((empty-queue? q)
(error "DELETE! called with an empty queue" q))
(else
(set-rear-ptr! q (item-prev-ptr (rear-ptr q)))
q)))
(define (seg-fault)
(let ((q (make-queue)))
(front-insert-queue! q 'a)
(rear-insert-queue! q 'z)
(front-insert-queue! q 'b)
(front-insert-queue! q 'z)
(front-delete-queue! q)
(front-delete-queue! q)
(front-delete-queue! q)
(front-delete-queue! q)
(front-delete-queue! q)))
(seg-fault)
_ [macosx][cocoa] 「たのしいCocoa」プレゼント企画に応募
HMDTの木下さんが新刊「たのしいCocoa」を抽選でプレゼントしてくれるとのこと。僕はCocoa初心者。ぜひとも読んでCocoaの楽しさを知りたい。ということで応募してみます。もしプレゼントを頂けたら、どんなふうに読もうかな。そんなことを考えながら、リンク先をたどると、出版までのいきさつが書いてありました。「ふむふむ、こうして本ができあがるのか」。読み進めていくと「Cocoaプログラミングをするには、絶対にC言語の説明が必要だ」というフレーズが目に飛び込んできました。え?絶対に?それほんとかなぁ?という疑問がわいてきました。この疑問の答えを見つけるべく「もっと楽しいCocoaプログラミング」をテーマに日記に綴りながら読んでいくつもりです。
2007-06-26 ( ja -> en )
_ [ruby][tdiary] ヤフー翻訳リンクを付けてみた
日記のタイトルのところに、ヤフー翻訳へのリンク(日本語から英語へ)を付けてみた。脱線しすぎた。そろそろ戻ろう。
add_title_proc do |date, title|
if link = link_to_yahoo_honyaku(date) then
title +
" <span style=?"font-size:small?">" <<
"<a href=?"#{link}?">(ja->en)</a></span>"
else
title
end
end
def link_to_yahoo_honyaku(date)
yhonyaku =
'http://honyaku.yahoofs.jp/url_result?' <<
'lang=en&eid=CR-JE&both=F&url='
url = 'http://www.fobj.com/hisa/d/'
dstr = date.strftime( '%Y%m%d' )
url = url << anchor(param)
yhonyaku << CGI::escape(url)
end

MacOS X v10.5 Leopard
たのしいCocoaプログラミング(木下誠)
_ HK [ツッコミいれさせていただいたこともあるCocoa Break!のHKです。リンク掲載させていたたぎました。問題があり..]
_ hisa [どうもです。リンク集とても充実していて素晴らしいですね]