トップ 最新 追記

Route 477



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の実装にも使われているとか…。

インストール

RubyGemsから簡単にインストールできる。

gem install sproutcore

merb-coreとか入るんだ。へぇ。

Helloチュートリアル

本家のHello Worldチュートリアルをやってみるよ。

まずはプロジェクト作成。

$ sproutcore hello_world

カレントディレクトリにhello_worldというディレクトリができる。 サーバを起動してみよう。

$ cd hello_world
$ sc-server

こんな画面が表示されます。

686a36ce5a11de168d3b0990fc7a3908.png

次は実際にファイルを書き換えてみる。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
本日のツッコミ(全6件) [ツッコミを入れる]

Before...

dara [しまださんによるKaigiFreaksの資料はここにあります: http://www.slideshare.net/..]

yhara [かくたにさん、daraさん: 情報ありがとうございます。 中の人だったのか、全然分かってなかったorz]

かくたに [わかっててramaze-usersを用意したのかと思ってました :-D]


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-05

[junk] どじっこ++

  • 実家からPC掃除用の空気スプレーを持ってきたつもりだったのに、ギター用の接点復活剤だった
  • 先輩からの指摘で、部屋にルータがないことに気づく(=同時に1台しかまともにネットに繋げない)
  • 会社で「明日からICFPCなんですよー」と言ったのに、来週だった(><)

そんなこんなですが、私は元気です。

本日のツッコミ(全3件) [ツッコミを入れる]

tnobuhito [yharaさんはギターやってるんですか?]

suztomo [yharaさんギターやってるなんてかっこよすぎです。]

kouji0625 [> 会社で「明日からICFPCなんですよー」と言ったのに、来週だった(><) これは衝撃的だったね。きっと疲れていた..]


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してみた。

[git] git ci でコミットできるようにする設定

$ cat ~/.gitconfig
[alias]
  ci = commit -a
  co = checkout
  st = status -a
  di = diff

これは便利


2008-07-08

[prog][event] 今年のIPFPCは5人まで、ただし議論は可

今年のICFP Programming Contestは1チーム5人までらしいのですが、

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.

[ICFP Programming Contest 2008: Rulesより引用]

とあるので、例えばサークル内で3チームとかできた場合もみんなでわいわいやれそうですね。ただし、コードそのものは共有してはダメ、と。

[lisp] Re: funcallの存在意義

変数と関数の空間を切れることとわりあいに不可分だけど

(funcall #'f)

(funcall 'f)

(funcall f)

の使いわけができることじゃないかなーと思った。

[funcallの存在意義より引用]

どう違うんだろ、、、。

CLだと「変数名f」と「関数名f」を同時に使えるのは知ってる。ので、3つのうちのどれかが「関数fを呼ぶ」と「変数fに入ってる関数を呼ぶ」だと思う。じゃあもう一つは?

本日のツッコミ(全2件) [ツッコミを入れる]

zick [(funcall #'f) => 現在の環境でfの関数スロットから値を取り出して利用 (funcall 'f) =>..]

yhara [なるほど、「シンボルから関数へのキャスト」みたいな感じになるのか…。ありがとうございます。]


2008-07-10

[hg] Mercurialの簡単なチュートリアルを書きました

Mercurialの簡単なチュートリアルを書きました。

姉妹編の「SVKを使ってみよう」ともども、どうぞご利用ください。

[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するなりご自由に。

[linux] UbuntuでCaps Lockを抹殺する

.Xmodmapに以下のように書く。

remove Lock = Caps_Lock

参考:

[Ruby/SDL][mac] わーい Mac OS X版Ruby/SDLスターターキットできたよー (RubyスクリプトをMacのアプリケーション化する方法)

Ruby/SDLを使ったプログラムをMacユーザ向けに配布してみるテスト。

  • ダウンロード: RubySDLGame-1.zip (Intel Mac専用, Leopardでないと動かないかも...)

中に入っているアプリケーション(.app)をダブルクリックすると、 こんな感じに起動するはずです。

089b46207e564ae2e26ddb58c2d5605c.png

さらに、ターミナル等で RubySDLGame.app/Contents/Resources/testsprite.rb を編集すれば、 エディタ一つでゲーム開発が可能に! :-)

経緯

  1. Rubyでゲームを作りたい
  2. 作ったらやっぱり配布したい
  3. でもゲームするためだけにRubyインストールしてもらうとか辛いよね
  4. そこでWindowsならExerbがあるよ
  5. じゃあMacはどうしたらいい?
  6. 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。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

yhara [「何も考えてません」というのが答えです^^; シェルスクリプトからRubyスクリプトを起動してるので、ファイルに保..]

shiro [Gaucheの隠し機能プリコンパイルを使ってバイナリにして提出する…のはだめなのかな? あ、でもGaucheのランタ..]

yhara [まだ試してないのですが、http://www.icfpcontest.org/live-cd.htmlにも "If ..]



2008-07-12

[icfpc] 画期的な解法を実装した

これで ゆうしょうは いただきです (^o^)

難易度 (参考)

実装
動画撮影★★★
携帯動画のフォーマット変換とアップロード★★★★★★

どうでもいいが、ジョイスティックを挿すマシンと画面が表示されるマシンが別でいいっていうのは美しいなぁ、と思った。


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認証をかけてくれたりします。 つまり、ラック(棚)にサーバを追加するみたいに機能を追加することができる。

もっと詳しく知りたくなったら

でどうぞ!

[junk] シュレーディンガーの猫たち

funny-pictures-cat-kittens-fractal-schrodinger-back.jpg

誰かが実験中にポケットを叩いたのかも。

てかLOLCATSは良いなぁ。

本日のツッコミ(全3件) [ツッコミを入れる]

no6v [Rackってこういうことだったんですね。 分かりやすい解説をありがとうございます。 あと、ResponceじゃなくR..]

yhara [ひー。ありがとうございます。(いつも間違えるんですよね…。)]

authorNari [Rackいいっすよねー。 中身のコードもかなりいい感じですし。]


2008-07-17

[scheme][idea] RSpecのScheme版とかどうだろう

RubyにはDSLを利用して読みやすいテストを書けるRSpecというライブラリがありますが、DSL最強であるLispで実装したらどうなるだろう?

http://rspec.info/

;; 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")

とか、どうよ?

本日のツッコミ(全1件) [ツッコミを入れる]

かくたに [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が使われると。

あーそうか、つまり、「順序が決まってないものをうまく順序づけて実行する」ってところが同じなわけだ。なるほど!

それはともかく

発表資料公開されないかなぁ。

[haskell] Arrowがよくわからん、とujihisaが言ってて

僕もよくわかっとらんのだけど、

  • モナド: 処理の流れは一本
  • アロー: 複数の処理を並列にしたりできる

と思えばいいんじゃないかな。と上の記事を書いてみて思った。

モナドが「関数合成のすごいやつ」なら、アローはどうなるんだろ。「関数合成の超すごいやつ」とか(一緒やん)。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

lurker [Command + Control + D でした]

yhara [おおおこんな機能が。情報ありがとうございます。]

BigFatCat [英単語調べるのに、自分は ctrl-space で spotlight を使うことが割と多いです。]


2008-07-29

[misc] 寝不足でだるい日でも

夕方になるとだんだん元気になってくるな。

どういうメカニズムなんだろう。

[scheme][ruby] call/ccの7つの典型的な使い方

わだばさん(でいいのかな?)のところで紹介されていたCall with Current Continuation Patternsをちょっと見てみた。

それによると、callccの典型的な使い方には以下のようなものがあるらしい。

  1. (無限)ループからの脱出
  2. 再帰からの脱出
  3. Cでいうcontinue
  4. 脱出+再入
  5. コルーチン
  6. non-blindな(??)バックトラッキング
  7. マルチタスク

で、だ。

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のデコレータは関数から関数を作る感じですよね)。

本日のツッコミ(全3件) [ツッコミを入れる]

shiro [call/ccは普通の人が使うものじゃないのです。 新しい例外メカニズムとか、新しいスレッドシステムとか、新しいへん..]

ohai [なんか以前似たような物を作ったことがあります。 http://www.kmc.gr.jp/~ohai/diary/?..]

yhara [shiroさん: なるほど…、call/ccは「処理系の内臓が外にはみ出してるようなもの」と思っていいんですかね。 ..]


2008-07-30

[ruby] 食品を絶対に腐らせないライフハックを考えてみた

全部Googleカレンダーにメモる。

636cb81579be0e1a6b2cf6b28bad93a9.png

いちいち手でイベントを作成するとかやってられないので、CSV形式の表をiCal形式のカレンダーをに変換するスクリプトを書いた。 元データはGoogle Docsで作成。

082dcd0f5bfe987aba06631276a9fa6b.png

スクリプトは以下。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サービスもあるらしい。


2008-07-31

[linux] Imagemagickで*.pngを*.jpgに一括変換する

convertで試行錯誤したのだが

mogrify -format jpg *.png

が正解らしい。

[linux] ImageMagickで画像の一部分を抜き出す

mogrify -crop 32x32+10+20 *.png

とからしい。mogrifyだと上書きされるので注意。