2008-07-01
■ [mac] MacBookのバッテリーを最高の状態にする方法
要するに、たまにバッテリーを空にしてやるといいらしい。
んで、
と書いてあったので、特にアプリケーションを終了したりせずバッテリが切れるまで待ってたら、ごく普通に再起動した。このとき、PowerBook G4 (15-inch Double-Layer SD)(および MacBook、MacBook Pro)コンピュータに組み込まれた“セーフスリープ機能”により、コンピュータのメモリ内容はハードディスクドライブに保存されます。
なんという罠…間違いなくジョブズは現代の孔明
■ [vim] F2を押すと現在時刻を入力するvimscriptを書いた
こんなのを.vimrcに書いておく。
" 時間挿入 function! GetCurrentTime() return strftime(" @%H:%M", localtime()) endfunction noremap <F2> a<C-R>=GetCurrentTime()<CR><Esc>
と、コマンドモードでF2を押すことで「@14:40」のような文字列が入力される。
作業ログを書くときに便利。
■ [javascript] Rails風のJavaScriptフレームワーク、SproutCoreを試してみた
SproutCoreの特徴:
- JavaScriptで、デスクトップアプリみたいなGUIを持ったWebアプリを作るためのフレームワーク
- ユーザが書くのはJavaScriptのみ
- だけど、開発環境はRails風
- GUI部分はMac OS XのCocoaの影響を受けている
アップルのMobileMeの実装にも使われているとか…。
- TechCrunch Japanese アーカイブ » アップルのMobileMeを試してみたい人は、SproutCoreをチェックしよう
- InfoQ: JavaScriptをMVCに適応- Sprout Core
- 新星誕生!? JavaScript版Cocoa on Rails"SproutCore"に注目 | エンタープライズ | マイコミジャーナル
- アップル、ウェブアプリに向けオープンな「SproutCore」技術を採用か?:ニュース - CNET Japan
インストール
RubyGemsから簡単にインストールできる。
gem install sproutcore
merb-coreとか入るんだ。へぇ。
Helloチュートリアル
本家のHello Worldチュートリアルをやってみるよ。
まずはプロジェクト作成。
$ sproutcore hello_world
カレントディレクトリにhello_worldというディレクトリができる。 サーバを起動してみよう。
$ cd hello_world $ sc-server
こんな画面が表示されます。
次は実際にファイルを書き換えてみる。hello_world/clients/hello_world/english.lproj/body.rhtml に一行追加する。
<div class="message"> <%= label_view :my_label, :tag => 'h1', :inner_html => 'Hello World!' %> ...
ページをリロードすると、「Hello World!」と大きく表示されてるはず。
コントローラとビュー
次に、hello_world/ 以下に戻って、コントローラを作ってみる。
$ sc-gen controller hello_world/app
clients/hello_world/controllers/app.jsを書き換えて、コントローラオブジェクトに情報を追加してみる。
// TODO: Add your own code here. greeting: "Hello Sprout!" //この行を追加
でもって、ビューの方でこれを参照するように変更する。hello_world/clients/hello_world/english.lproj/body.rhtml を以下のように書き換える。
<div class="message"> <%= label_view :my_label, :tag => 'h1', :bind => { :value => 'HelloWorld.appController.greeting' } %> ...
ページをリロードすると、「Hello World!」が「Hello Sprout!」に変わったはず。
ちなみに:bindを使うと、コントローラの保持する値はビューに自動的に反映される。 もしFirefox上でFirebugを使ってるなら、コンソールで以下のJavaScriptを実行してみてほしい。
HelloWorld.appController.set('greeting', 'I am changing!')
表示が変わったはずだ!
つづく?
とまあ、今日のところはここまで。本家ではこのあと「ボタンを付けてみよう」に続くよ。
■ [ruby][event] RejectKaigi & RejectRejectKaigi2008 発表者まとめ
まとめてみた。
RejectKaigi
タイトル | 発表者 | 発表資料 |
---|---|---|
1.8.5 追悼 | 卜部 | |
Redmine と Ruby 1.9.1 への道 | yugui | blog |
Ramaze | マイクル(Michael Fellinger) | Ramazeの中の人らしい。 |
変なネットサービスが出来るまで | 星暁雄 | |
reposh - ハッカーのためのリポジトリシェル | yhara | blog |
String#succ | 田中哲 | blog |
音プログラミング | takkaw | |
illustrator プレゼンテーション | 志村 | blog |
infix to postfix | shinh | blog |
NDD (Niconico Driven Devevlopment) | 井上泰之 | blog |
TechTalk.jp と、あとニコニコ動画もよろしくね | coji | |
KaigiFreaks | しまだ | slideshare |
やる夫で学ぶJRuby最適化 | 高井 | blog |
Regional RubyKaigi の御提案 | かくたに | blog |
RejectRejectKaigi
タイトル | 発表者 | 発表資料 |
---|---|---|
3の実装の時にアホになるRuby | Yoshiori | |
Decimal | 斎藤ただし | Decimal |
ひとばんでつくるRuby+Greasemonkey+Safari | 加藤和良 | |
Arawd on RailsのCMをさせてください | id:technohippy | スライド |
Gauche on Rails | id:yuum3 | blog |
Hash::mapが僕にとってアフォーダンスに優れていない件について | ミムラ(id:takkan_m) | |
私はいかにしてRubyKaigiを私物化したか | ただただし | blog |
RubyでIdenticon | swdyh | blog, quilt, identicon.relucks.org |
tDiaryとHikiで使うBayesFilter | 黒田拓 | malagma |
Rubyで作ろう 二次元プログラミング言語「ず」コンパイラ | naoya_t | blog |
YARVを偲んで(YARVはゴールではなく始まり) | ささだ | nadoka, Rabbit |
Rubyバイトコードで遊ぼう | 赤井駿平 | スライド(rd), Rimple |
require 'future' | cho45 | Resh |
2008-07-02
■ [scheme] DrSchemeってベクタないの?
配列が利用できること
講義で使うため、組み込みの配列が必要。最初はDrSchemeを考えていたそうだが、この点で脱落したそうだ。
[【RubyKaigi'08】詳細レポート : 多様化するRuby(続):CodeZineより引用]
T/O
■ [scheme] equals?
ICFP (会議の方) の Accepted Papers が出てるのに気づきました。
(略)
"Efficient nondestructive equality checking for trees and graphs" が気になる。 R6RS の equals? を循環アリでもちゃんと止めるための巧い手法
[d.y.d.より引用]
これは気になる。
やっぱ自分で実装したものは気になり度合いが違うね。
■ [ruby] threadifyがいい感じにキモい
最近、仕事のメールを読むためThunderbirdを使い出した関係で、ruby-talkとかのMLを眺めるようになった。 まぁruby-talkは流量が多すぎるんで、[ANN]とか面白そうなやつを見るくらいだけど。
で、[ANN] thredify-0.0.1 ですよ。
とりあえず、配列urisにURIが入ってると思いねぇ。ここで
uris.threadify do |uri| body = open(uri){|pipe| pipe.read} end
と書くと、それぞれのブロックが別スレッドで動くらしい。この、「配列の各要素をスレッドにするんだ!」というのが わかるような、わからんような感じがキモい。でもかわいい。キモかわ。
DL先はこちら (gemでも入るみたいだけど)。
2008-07-03
■ [lisp] 「家庭では真似しちゃダメ!Edmund Weitzが選ぶ黒帯マクロ3選」
CL勉強会@Lingrで参考書になってたらしい The Power of LISP Macrosを見てみたのですが…。
;;; 10. Don't try this at home ;;; -------------------------- ;;; ;;; Macros for black belts ;;; - "On Lisp" <http://www.paulgraham.com/onlisp.html> ;;; - Screamer <http://www.cl-user.net/asp/libs/screamer> ;;; - Series <http://series.sourceforge.net/> ;;; - Iterate <http://common-lisp.net/project/iterate/>
ちょwwwなにこの章wwww
4274066371
"On Lisp"はまあ、装丁がかっこいい本として(俺の中で)有名なアレですが、その他のプロジェクトは知らなかったのでちょっと調べてみましたよ。
1. Screamer
Common Lispで非決定性計算を行う(シミュレートする)ためのライブラリ。バックトラックと、Undo可能な副作用をサポートする。
2. Series
Seriesはシーケンスに似たデータ構造で、シーケンスと同じような操作を提供する。Seriesの操作は関数的に書けるが反復的に実行されるので、関数的だが効率の良いコードが書ける。
KBEmacsの実装に使われたらしい。
3. Iterate
IterateはLOOPマクロに似ているが、
- 拡張しやすくて、
- (LOOPマクロよりLispの構文に近いので) エディタに優しく、
- ANSIのCL仕様に含まれていない(良くも悪くも)。
だそうな。
(iter (for i from 1 to 10) (collect i into nums) (collect (sqrt i) into nums) (finally (return nums)))
こんな感じらしい。
というわけで
黒帯マクロ使いを目指す皆様はソースに目を通してみるといいんじゃないでしょうか。 とりあえずscreamer.lsp のdefun-compile-timeの大群が恐ろしいです。
2008-07-07
■ [ruby] RTaskが動くようになったよ
コメント欄でwalf443さんに教えてもらった rubyforge config もやったんですけど、結果は同じ。ふむ。
色々試してみて、
$ rubyforge add_release reac reac 0.1.0 reac-0.1.0.gem
のようにrubyforgeコマンド経由でならリリースできることに気づいた。
bin/rubyforgeとbin/rtask を比べてみても、両方とも RubyForge.new して rubyforge.add_release を同じように呼んでいるだけ。 でも、p @rubyforge として調べてみると、rtaskの方は何故か userconfigが読み込めてないようだ。
…あれ、rtaskって @rubyforge.configure 呼んでなくね?
というわけで、configureを呼ぶようにしたらちゃんとリリースできるようになりました。めでたしめでたし。 (なんで id:keita_yamaguchi さんの環境では正しく動いてたのかがむしろ気になりますが…。)
どうやって報告しようか
せっかくなので、githubでforkして pull requestしてみた。
2008-07-08
■ [prog][event] 今年のIPFPCは5人まで、ただし議論は可
今年のICFP Programming Contestは1チーム5人までらしいのですが、
とあるので、例えばサークル内で3チームとかできた場合もみんなでわいわいやれそうですね。ただし、コードそのものは共有してはダメ、と。You may discuss the problem with members of teams other than your own, but the solution your team submits must be solely the work of its own members.
■ [lisp] Re: funcallの存在意義
変数と関数の空間を切れることとわりあいに不可分だけど
(funcall #'f)
(funcall 'f)
(funcall f)
の使いわけができることじゃないかなーと思った。
[funcallの存在意義より引用]
どう違うんだろ、、、。
CLだと「変数名f」と「関数名f」を同時に使えるのは知ってる。ので、3つのうちのどれかが「関数fを呼ぶ」と「変数fに入ってる関数を呼ぶ」だと思う。じゃあもう一つは?
2008-07-10
■ [ruby][haskell][rubiskell] Rubiskellがgemでインストールできるようになりました
某ujihisaの発表でも紹介されたRubiskellが、
gem install rubiskell
でインストールできるようになりました。
こんな風に、Rubyスクリプトの中にHaskellのコードを埋め込めるようになります。
require 'rubiskell' FIB = <<EOD fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib n = fib (n-2) + fib (n-1) EOD fib = Haskell.new(FIB) puts "fib 5 is #{fib[5]}."
実装は単にrunghcを起動しているだけです。
リポジトリはgithubなので、ソース読むなりforkするなりご自由にどうぞ。
■ [reac] reac (Reactive Ruby) がgemでインストールできるようになりました
RubyでReactive Programmingを実現するreacというライブラリが、
gem install reac
でインストールできるようになりました。
こんな風に、「書いた式の値が自動的に変化する」みたいな変な世界を体験することができます(笑)。
リポジトリはgithubにあるので、ダウンロードするなりforkするなりご自由に。
■ [Ruby/SDL][mac] わーい Mac OS X版Ruby/SDLスターターキットできたよー (RubyスクリプトをMacのアプリケーション化する方法)
Ruby/SDLを使ったプログラムをMacユーザ向けに配布してみるテスト。
- ダウンロード: RubySDLGame-1.zip (Intel Mac専用, Leopardでないと動かないかも...)
中に入っているアプリケーション(.app)をダブルクリックすると、 こんな感じに起動するはずです。
さらに、ターミナル等で RubySDLGame.app/Contents/Resources/testsprite.rb を編集すれば、 エディタ一つでゲーム開発が可能に! :-)
経緯
- Rubyでゲームを作りたい
- 作ったらやっぱり配布したい
- でもゲームするためだけにRubyインストールしてもらうとか辛いよね
- そこでWindowsならExerbがあるよ
- じゃあMacはどうしたらいい?
- Ruby本体とRubyスクリプトとDLLを.appに入れちゃえばいいんじゃね
以下、参考資料。
.appの作り方
このサイトが詳しいです、あなたが神か。
要するに、決まったフォルダ構造を作って必要なファイルを置けばアプリケーションと見なされるらしい。
* RubySDLGame.app/ * Contents/ * Info.plist # 後述 * MacOS/ # 実行ファイルとか。 * core.sh # 起動用シェルスクリプト。 * lib/ # SDL関係のDLL (*.dylib)。 * rsdl # rsdl(SDL用のRubyバイナリ)。 * Resources/ # 静的ファイルとか。 * hello.icns # .appのアイコン。 * testsprite.rb # Rubyスクリプト本体。これはWindowsや # Linuxに持っていってもそのまま動く:-) * icon.bmp # スクリプトで使ってる画像。 * lib/ # Rubyの添付ライブラリ全部。
Info.plistはこんな感じ。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleExecutable</key> <string>core.sh</string> # 実行ファイル名 <key>CFBundleIconFile</key> <string>hello.icns</string> # アイコンのファイル名 <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleSignature</key> <string>????</string> </dict> </plist>
自分で作るときは、「同じように書いたつもりなのに動かねー」とかよくあるので(笑)、 既に動いてる.appを元に少しずつ変更していくのがおすすめだよ。
ちなみに
RubyCocoaならこんな面倒なことしなくても、ビルドすると勝手に.appが出来てくれるらしいよ。
今後の展望とか
1行も変更せずにWindows/Linux/Macで動くのがRuby/SDLの魅力だと思ってるので、 やっぱり一つのソースからWin/Mac両方の実行ファイルを作るとかやりたいなぁ。 (Linux使いの人は自分でSDLとか入れられるよねーと思ってるんだけど、 自動でdebパッケージ化してくれるとかはあると嬉しいのかも)
あと、やってることは単に「Ruby本体とRubyスクリプトとDLLを.appにまとめました」 というだけなんで、Ruby/SDLに限らずいろんなものがパッケージ化できると思います。 例えばStar RubyとかStar Rubyとか。
■ [icfpc][lisp][scheme] ICFPCからCommon Lispが外された? と思ったら
- 「Common Lispをな ぜ 外 し た」
- 「いやディスク容量が足らなくてさぁ」
- 「俺に金曜までに別の言語を覚えろと?」
- 「CLってコンパイルできるんだろ?バイナリ提出は可能だからさ、ディスクの方はインタプリタ言語に譲ってやってくれないかな。ジャッジの環境に処理系が入ってないとマジで困るのは奴らなんだから」
- 「そういうことならいいよ」
- 「ちょwww SBCLだとHello Worldコンパイルしただけで50MBなんだがwww」←ここまで読んだ(MLより。なんかアーカイブされるのが遅いな)
Scheme処理系はMzSchemeだそうで、GaucheのAPIしか覚えてない日本人(俺とか)涙目。
Scheme使おうと思っている人はPLT Schemeのマニュアルを見ておいた方がいいかも知れませんね。 R6RSとSRFIだけで頑張るというのもアリですが…let1ないとか困るだろjk。
2008-07-11
■ [misc] ネット上では日本-ブラジル間も一瞬wwwとか言ってるけど
実際には物理的なケーブルでつながってるんだよなー。忘れそうになる。
2008-07-15
■ [icfpc] よく頑張りました
ICFP Contest 2008ですが、主にid:authorNari君と(那由多屋の加藤さんではないほうの)yuyaさんと僕の3人で、チーム「yarunee」でサブミットしました。 やるねぇというのは最近松江本社で流行中のバズワードで、褒め言葉の一種です。
で、実装言語はRuby 1.9です。1.9ですよ。
初日の夜までは普通に1.8.7で開発してたのですが、夕食あたりで「これFiber使ったら綺麗に書けるんじゃね?」と思い始め、 「ネタ的に面白いから」という理由で1.9に決定しました。 サーバ側には1.8.7の処理系しかインストールされていないので1.9はソースからコンパイルしないといけないんですが、 幸運なことにうちのチームには日々RubyのGCパッチを書いているnari君がいるわけで。
分担としては僕がライブラリ的な部分を書いて、yuyaさんがアルゴリズムを考え&実装して、nari君がGCのプロファイラを実装するという布陣になりました。完璧ですね。
感想とか
- チーム戦だと、自分の苦手なorできないところもやってもらえるので有難い。
- できる人なら、僕らが3日かけて到達したところを初日に終えてしまうんだろうなぁ。
- 一見、分担とか難しそうに思えたけど、人数が多いとマップ生成とか可視化とかいろいろできることが増える。
2008-07-16
■ [ruby][rack] 5分でわかるRack
RackはRubyのためのWebサーバインターフェイスだ。
RubyでWebっていうとRailsが有名だけど、実はRails以外にもいろんなRuby用のWebアプリ用フレームワークが存在する。
- Ramaze
- Merb
- Camping
- Waves
- などなど…。
一方Webを実際に動かすにはWebサーバが必要だ。RubyのためのWebサーバも、これまたいろんなものがある。
- Apache(CGI, FastCGI..)
- WEBrick
- Mongrel
- Ebb
- Thin
- などなど…。
ここで問題が一つ。それは「フレームワークが増えるたびに、いろんなサーバをサポートするためのコードが必要になる」ってとこだ。 各フレームワークの作者がみんなそれぞれにCGIやMongrelに対応するためのコードを書いてるなんて、無駄だと思わないか?
RackはWebアプリ用のフレームワークと、Webサーバの間を取り持ってくれるライブラリだ。
[ブラウザ] [Webサーバ] [フレームワーク] * IE * Apache * Ramaze * Firefox <=> * WEBrick <=> [Rack] <=> * Merb <=> [Webアプリ] * Safari * Mongrel * Camping * ... * ... * ...
フレームワーク作者はRackにだけ対応しておけば、Apache/WEBrick/Mongrelなど いろんなサーバがすぐに使えるようになる。逆にWebサーバの作者も、 Rackにだけ対応しておけばRack/Merb/CampingなどいろんなWebアプリ用フレームワークから すぐに使ってもらえるようになる。
というわけで、これからRuby用のWebアプリ用フレームワークやWebサーバを書こうとするなら Rackは間違いなくチェックすべきライブラリだ。 そうでなくて、単にWebアプリを作りたいだけの場合でも、「超シンプルなWebアプリ用 フレームワーク」としてRackを使うという選択肢もあるだろう。
3分で使ってみるRack
まずはインストール。
$ gem install rack
hello.rbを用意。
require 'rubygems' require 'rack' class HelloApp def call(env) [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]] end end
hello.ruを用意。
require 'hello' run HelloApp.new
サーバを起動。
$ rackup hello.ru
ブラウザで http://localhost:9292/ にアクセスしてみよう。「Hello, Rack」と 表示されたはず。
どう、簡単でしょう?
rackupのオプションでポートとかサーバとかいろいろ設定できる。詳しくは rackup --help で。
Rackの思想
「Webアプリって要するにリクエストをレスポンスに変換するだけの関数だよねー」 ってのがRackの基本っぽい。
なので、
- env(環境変数のハッシュ)を受け取って
- ステータスコードとHTTPヘッダとHTTPボディを返す
ような関数を書けばWebアプリになります。
だけどこのままだとさすがに使いにくいんで、 Rack::RequestとRack::Responseという補助クラスも用意されています。 これを使うと、「Webアプリ=RequestをResponseに変換する処理」となる。
ミドルウェア
Rackではさらに、「Responseを別のResponseに変換する処理」も扱えるようになっています。例えば ruファイルで
require 'hello' use Rack::ShowExceptions use Rack::CommonLogger use Rack::Auth::Basic {|user, pass| user == 'alibaba' and pass == 'open sesame'} run HelloApp.new
のように書くと、Webアプリで起きた例外を綺麗に表示してくれたり、Apache形式のログを出力したり、Basic認証をかけてくれたりします。 つまり、ラック(棚)にサーバを追加するみたいに機能を追加することができる。
もっと詳しく知りたくなったら
でどうぞ!
2008-07-17
■ [scheme][idea] RSpecのScheme版とかどうだろう
RubyにはDSLを利用して読みやすいテストを書けるRSpecというライブラリがありますが、DSL最強であるLispで実装したらどうなるだろう?
;; bowling_spec.scm (use bowling) (describe Bowling (before :each (define *bowling* (make <Bowling>))) (it "should score 0 for gutter game" (dotimes (_ 10) (bowling-hit *bowling* 0)) (should (bowling-score *bowling*) = 0)))
うーん、どうだろう。
(should x be_#t) (should y be_#f) (shoudl z be_nil)
Lispだと語順が変わってしまって、Rspecの売りである「そのまま読み下せる」という特徴があんまり生かされないなぁ。てか、疑問形っぽい(笑)。
じゃあ、逆に考えて。
(assert x is #t) ; eq?による比較 (assert y == 2)
もしくは、動詞を変えて
(expect z has 3 items) (expect ls includes "foo")
とか、どうよ?
□ かくたに [PerlのTest::Moreっぽいかんじでしょうか?(あんまりよくしらない)]
2008-07-19
■ [rails] ruby1.8.7だとString#truncateが失敗する
ruby1.8.7でString#charsが追加されたため、ActiveSupportが定義してた charsとバッティングしたらしい。後者が配列を返すのに対し 前者はEnumeratorを返すので、#lengthが呼べなくてエラーになるようだ。
せめてActiveSupportがStringに直接charsを定義していたら大丈夫だったのだけど、 「charsが定義されたUnicodeというモジュールをStringにmixinする」という形だったので、 Unicode#charsより(ruby1.8.7の)String#charsが優先して呼ばれてしまう。
アドホックな対処法は以下:
2008-07-22
■ [haskell] hrefをUTF-8環境にインストールする
Haskellの日本語リファレンスツール、hrefをUTF-8環境にインストールしてみた。rootは使わない方針で。
まずはtar.gzをダウンロード。
解凍して、makeする。
ref以下がドキュメントの原文だが、eucなのでutf-8に変換する。ここではnkfを使った。
$ mkdir ref-u8 $ cd ref $ for a in *; nkf --utf8 $a > ../ref-u8/$a
ドキュメントを置く場所を決める。
$ mkdir ~/bin/href-data $ export HREF_DATADIR=~/bin/href-data
ドキュメントを作る。
$ mkhref ref-u8/*
hrefをパスが通ったところに置く。
$ cp href ~/bin
これでリファレンスが引けるようになったはず。
/Users/yhara % href foldr Prelude.foldr foldr :: (a -> b -> b) -> b -> [a] -> b foldr f init xs foldl の逆向きにリストをたたみこむ関数。 xs の最後の要素と init に f を適用、 その値と xs の後ろから 2 番目の要素に f を適用、 その値と xs の後ろから 3 番目の要素に f を適用…… したときの最後の返り値を返す。 see also: foldr1, foldl, scanr foldr (+) 0 [1,2,3,4] = 10 foldl (+) 0 [1,2,3,4] = 10 foldr (++) "Q" ["a","b","c","d"] = "abcdQ" foldl (++) "Q" ["a","b","c","d"] = "Qabcd"
できた。
■ [misc] 「エクストリーム・プレゼンテーション」というスタイルを考えてみた
海中や断崖絶壁で プレゼンを行う手法…ではなくてですね。
きっかけはikegamiさんの日記でした。以下、ちょっと長いですけど引用します。
今回の TSAC の聴衆は、本質的な箇所と基本的だが重要なポイントを、発表中に割り込んで質問してくれるので、発表者も参加者も全員得るところが大きかったのではないかと思います。一方、僕が参加している関西の勉強会はどれも観衆が(本質的なことに気がついていない or 基本的だが重要なことを質問できないほどおとなしい)ので、正直、つまらないことが多いです。どの勉強会がそうだ、とは具体的には言いませんけど。(関西にはいろんな勉強会がありますが、僕が参加しているのは本当に少ない種類ですので)
勉強会の利点の一つに、知らなかった知識が手に入るということがありますが、それは、別に勉強会でなくても手に入ります。しかし、人が集まることの最大の利点は、議論することにあります。「今、説明したことは、○○ですか?」「いや、全然違いますよ、たとえば、○○」というようなキャッチボールが次々に行われないと、僕は面白くありません。
こんな不満を持つのは僕が数学出身だからかもしれません。数学の自主ゼミは基本的に、参加者全員がゼミの内容を予習してくることが義務、発表者の発表を途中で止めて数十分でも議論してかまわないことが許される、などの風習があるからです。僕はそういう勉強会のほうが好きです。ちょっと東京がうらやましくなりました。やっぱ、次の職場は東京か。
[Inemuri nezumi diaryより引用]
どうか、「次は東京か」なんて寂しいことをおっしゃらずに。勉強会で発表途中に質問がないのは、みんながそういうルールだと思っているからだと思います。
というわけで、エクストリーム・リーディングになぞらえて、エクストリーム・プレゼンテーションというのを考えてみました。
- eXtreme Reading
- 予習なし。質問を思いついたらその場で質問する。
- eXtreme Presentation
- 質疑応答なし。質問を思いついたらその場で質問する。
この前のKanasan.JSのLTで試させてもらったのですが、 困ってた点(jQueryの読み込み)についての解決策をいろいろ教えてもらったり、「こんな機能もあると便利なんじゃない?」みたいなアイデアが次々出てきたりして、かなり良い感じでした。 (参加者の皆様に感謝!)
ただ弱点としてどうしても時間が伸びる(笑)というのはあるので、時間を多めに取ったり、スライドを増減できるようにしておいたり、長引きそうなら「あとは懇親会で」と話を切るなど調整は必要そうです。
ともあれ、
- 発表だけじゃなく議論がしたい時とか
- 発表だけじゃなくアドバイスが欲しい時とか
- 発表だけじゃなくアイデアが欲しい時とか
そんな時には、ぜひ「エクストリーム・プレゼンテーション」を試してみてください。
2008-07-24
■ [lisp] Common Lispすげーわ
(執筆中)
1600070 2008-07-24 06:44:43 Cross-country accepted 2.21 138M LISP sbcl 1600069 2008-07-24 06:44:13 Cross-country accepted 2.29 24M LISP clisp
- 速い
- 同じソースがそのまま別の処理系でも動く
- setfはこれはこれでいいな
- mapが使えないとおもったらmapcarかwww
■ [scheme] Re: R6RS test suite - ひげぽん OSとか作っちゃうかMona-
ktkr!
まだライブラリ実装してないからBiwaSchemeでは使えないなぁ…と言いたいところですが、Schemeのプログラムは 全てS式なので (test ...) にマッチするところだけ抜き出せばいいんですよね、分かります。
moshはもうライブラリもsyntax-rulesもあるからそのまま使えそうだなぁ。いいなぁ。
2008-07-25
■ [mac] 英語を勉強したいならMac買うといいよ
いままで英単語の意味を調べるときは
- ブラウザで新しいタブを開く
- alc.co.jpを開く
- (表示されるまでしばし待つ)
- 単語を打ち込む
- (表示されるまでしばし待つ)
という手順を踏んでいたのですが、MacBookにしてからは
- マウスカーソルを画面左上に持っていく。Dashboardが表示される
- 開きっぱなしの英和/和英辞書に単語を打ち込む
だけで単語の意味を調べられるように。前と比べて、明らかに知らない単語を調べる回数が増えました。 MacBookを買った直後から使えるとか、GreasemonkeyやBookmarkletと違ってブラウザ外(PDF読んでる時とか)でも引きやすいのが良いですね。
が、欲をいえば、
- 単語を選択する
- Dashboardを開く
だけで単語が引けると手間が最小でいいなぁと思うのです。そうでなくても、
- 単語をクリップボードにコピーする
- Dashboardを開く
くらいなら実現できそうなんだけど、「選択するだけ」っていうのはできるのかな。
■ [haskell][javascript] Arrow.jsが凄すぎる件
OSC Kansaiで発表があったArrow.jsが凄い。
何が凄いって、HaskellのArrowをJavaScriptに移植するというその発想が凄い。いやあ参った。 あと角カッコを使ってなるべくHaskellの記法に近づけてるところも可愛い(笑)。
用途としてはJSDeferredと同じく非同期処理の同期化、つまり「Ajaxでデータ取ってきたあとにこれをする」みたいに 処理の手順を組み立てておいて一気に実行する、そういうことができます。 ただし処理の流れが一本しかないJSDeferredと違って、Arrow.jsでは「これとこれを同時に実行して、両方終わったらこれをする」とか、 「これとこれのどっちかが終わったらこれを実行する」みたいに複数の処理を同時に扱うことができる。ArrowかわいいよArrow。
これでArrowというシステムがHaskellとJavaScriptに実装されたわけですが、やってることは同じなのに両者で嬉しいところが違うってのが面白い。 Haskellは遅延評価だからどっから実行されるかわかんないのを決まった順序で実行するためにArrowが使われて、 JavaScriptでは非同期を含んだ処理をうまく実行するためにArrowが使われると。
あーそうか、つまり、「順序が決まってないものをうまく順序づけて実行する」ってところが同じなわけだ。なるほど!
それはともかく
発表資料公開されないかなぁ。
2008-07-29
■ [scheme][ruby] call/ccの7つの典型的な使い方
わだばさん(でいいのかな?)のところで紹介されていたCall with Current Continuation Patternsをちょっと見てみた。
それによると、callccの典型的な使い方には以下のようなものがあるらしい。
- (無限)ループからの脱出
- 再帰からの脱出
- Cでいうcontinue
- 脱出+再入
- コルーチン
- non-blindな(??)バックトラッキング
- マルチタスク
で、だ。
1, 2, 3は、breakとかcontinueがある言語なら普通にできる。 5や4の一部は、PythonのジェネレータとかRuby1.9のFiberでできる。 7はコルーチンやスレッドを使えばできる。
となるとcallccでしか出来ないことって(この中では)再入とバックトラックしか残らんのだよなぁ。 しかもバックトラックはHaskellだとリストモナドで綺麗に書けたりするし、見た目はカッコいいけど普通にループ回すのより効率が良いわけでもないし。
なんとなく「マクロの機能の8割は他の言語でも可能になりつつある」という話(あ、しまった、まだ書いてないや)とオーバーラップした。
それでも「できるだけシンプル、かつ強力」を志すSchemeとしてはcall/ccの代わりにbreakを導入するとかはまずあり得ないし(それこそcall/ccとマクロでできるよ)、 最後に残った「call/ccでしかできない仕事」はSchemeの力として残りつづける。
ただそれ以外の言語(というか、Ruby)にこれからもcallccが必要かと言われると、説得力のある答えを提示できないのが正直なところだ。 まぁContinuationクラスを無くしてほしくない人は、「再入をうまく使うパターンを考えろ」というのがヒントになるかもね。
■ [ruby] Re: Pythonのデコレータが面白いのでRubyで実装してみた
んー、まぁ一応動いてるんだけど、アノテートみたいにメソッド定義の前に付けられないのがなぁ・・・。
[いい天気 - ずっと君のターンより引用]
「private」みたいにメソッドの直前に付けるのはどうだろ?ということで実装してみた。
Point = Struct.new(:x, :y) class Point extend DeclareArgsDecorator declare_args(Point) def distance_to(other) Math.sqrt( (x - other.x)**2 + (y - other.y)**2 ) end end center = Point.new(0.0, 0.0) puts center.distance_to(Point.new(3.14, 1.592)) puts center.distance_to([2.0, 4])
実行結果。
/Users/yhara/proj/misc/ruby_decorator % ruby foo.ugoku.rb 3.52052041607487 foo.ugoku.rb:10:in `check_args': 引数の型がちがうお (PointじゃなくてArrayになってる) (ArgumentError) from foo.ugoku.rb:8:in `each' from foo.ugoku.rb:8:in `check_args' from foo.ugoku.rb:29:in `distance_to' from foo.ugoku.rb:50
実装はまあ、ふつうですね。yharaはalias_methodを覚えた。
module DeclareArgsDecorator def self.check_args(args, types) if args.size != types.size raise ArgumentError, "引数の数がちがうお" elsif args.zip(types).each do |arg, type| unless arg.is_a?(type) raise ArgumentError, "引数の型がちがうお (#{type}じゃなくて#{arg.class}になってる)" end end end end @@declared_type = nil def declare_args(*klasses) @@declared_type = klasses end def method_added(name) if @@declared_type declared_type = @@declared_type @@declared_type = nil #avoid infinite loop class_eval { alias_method("__original_#{name}__", name) define_method(name) do |*args| DeclareArgsDecorator.check_args(args, declared_type) self.__send__("__original_#{name}__", *args) end } end end end
あとは一般化してmodule Decoratorとか作ればいいんだけど、飽きた。あとあんまりデコレータっぽくない(Pythonのデコレータは関数から関数を作る感じですよね)。
2008-07-30
■ [ruby] 食品を絶対に腐らせないライフハックを考えてみた
全部Googleカレンダーにメモる。
いちいち手でイベントを作成するとかやってられないので、CSV形式の表をiCal形式のカレンダーをに変換するスクリプトを書いた。 元データはGoogle Docsで作成。
スクリプトは以下。icalendar gemが神すぎる。
#!/usr/bin/env ruby # usage: ruby csv2ical.rb hoge.csv > hoge.ics # example of csv: # "Christmas Party",2008/12/25 # "New Year Party",2009/01/01 require 'parsedate' require 'csv' require 'rubygems' require 'icalendar' if ARGV.size == 0 puts "usage: #{$0} hoge.csv > hoge.ics" exit else cal = Icalendar::Calendar.new CSV.foreach(ARGV[0]) do |food, date| cal.event do dtstart Date.parse(date) dtend Date.parse(date) + 1 summary food description food end end puts cal.to_ical end
8/4 追記: ブコメで教えてもらったのだが、そういうWebサービスもあるらしい。
Before...
□ dara [しまださんによるKaigiFreaksの資料はここにあります: http://www.slideshare.net/..]
□ yhara [かくたにさん、daraさん: 情報ありがとうございます。 中の人だったのか、全然分かってなかったorz]
□ かくたに [わかっててramaze-usersを用意したのかと思ってました :-D]