2008-12-08
■ [esobook] Brainf*ckとWhitespaceの本を書きましたwwww
正確には、「Brainf*ckとかWhitespaceのような言語の処理系を作りつつ、新しいプログラミング言語を作るところまでを解説した本」ですね。
4839927847
12/20発売です。
これはジョークではない。繰り返す、これはジョークではない!
- 第一部ではHQ9+から始まり、Brainf*ck、Whitespaceを題材にインタプリタ・VM方式の処理系を作る
- 第二部では本書オリジナル言語であるStarry、Bolicを題材に新しいプログラミング言語の作り方を解説
- 付録では本編で取り上げられなかった13個のEsoteric Languageをちょっとずつ紹介 (Grassもあるよ!)
という構成になっています(目次はこちらからどうぞ)。
個人的には裏テーマ(?)である「チューリング・マシン」「λ計算」「構造化定理」について触れられたので良かった。
Esoteric Languageの本を出すとか「無茶しやがってwww」な感じですが、編集の 臼杵さんは「CPUの創りかた」とか、「Short Coding」とか、「OS自作入門」とかの編集で知られる、 いわは無茶のスペシャリスト。「こんな本を出したいんだけど…」というアイデアがある人はメールしてみるといいよ!
4839909865 4839925232 4839919844
2008-12-11
■ [biwascheme] リポジトリをgithubに移行しました
BiwaSchemeはずっとプライベートなsvnリポジトリを使ってたんですが(修論のtexソースとか全部突っ込んでた)、githubに移行しました。
これで最新版の公開・取得がずっと楽になると思います。
あとid:mokeheheさんから「(map char->integer (string->list "abc"))の挙動がおかしい」という報告を いただきまして、string->listのバグをひとつ修正しました。ありがとうございました。
■ [ruby][rails] autospec + Growl環境を作るのに苦労した
「ZenTest」と「RSpec on Rails」をインストールすると ./script/autospec というコマンドが使えるようになって、ファイルを保存するそばから rspecが再実行される幸せなテスト環境ができあがる。 が、今度はテスト結果を見るためにscreenのウィンドウを切り替えるのも面倒になってくる。Growlを使ってなんとかならないだろうか。
たぶん普通の人は以下のサイトの手順を上から順に実行すればとりあえずGrowlは動くはず(後述する.autotestのハンドラだけはRSpec用に直さないといけないが)。
が、僕の環境ではそもそもgrowlnotify自体が動かなかったので、Meowを使ってgrowlnotifyコマンドを再実装するなどした。
その上で、.autotestに以下のように書く。
module Autotest::Growl def self.growl title, msg, img="~/.autotest_icons/rails_ok.png", pri=0, sticky="" msg += " at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}" x = "rb_growlnotify -n autotest -H localhost --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}" puts x system x end Autotest.add_hook :ran_command do |at| output = at.results.last.slice(/(\d+)\s+examples?,\s*(\d+)\s+failures?/) if output if $~[2].to_i > 0 growl "Tests Failed", "#{output}", "~/.autotest_icons/rails_fail.png", 2 #, "-s" else growl "Tests Passed", "#{output}", "~/.autotest_icons/rails_ok.png", -2 end else growl "Tests Failed", "errors", "~/.autotest_icons/rails_fail.png", 2, "-s" end end end
上記サイトからの変更点は以下。
- growlnotifyをrb_growlnotifyに変更 (たぶんこれは僕の環境以外では不要)
- output = 〜 の行をRSpec向けに変更 (RSpecを使うなら必要)
- if $~[2] 〜 の行をRSpec向けに変更 (RSpecを使うなら必要)
- スティッキーオプション(-s)を外した (これは単純な好み。赤いnotifyがずっと画面に居座っているのは精神衛生に悪い)
結論。Rails + RSpec + autotestな環境を作るのはとても簡単だが、そこにさらにGrowlを組み合わせるのは多少めんどい。ZenTestのautotest/growl.rbはなんかおかしいし、growlnotifyもLeopardではなんかおかしい。でもまあ不可能ではないし、一回やってしまえばあとは非常に快適になる。
2008-12-12
■ [rails] Rails 2.2のI18nクラスを試してみた
(注:Railsは詳しくないので間違ったこと書いてるかもしれません)
Rails 2.2系がリリースされたので、いまRailsをインストールするとデフォルトでI18nクラスが使えるようになっている。
使い方は、config/locales/*.ymlとかに
ja-JP: hello: world: こんにちは世界 en: hello: world: Hello, World!
と書いておくと、「t("hello.world")」が現在のロケール(I18n.locale)に応じた文字列を返してくれる、みたいな感じ。
詳細は以下の参考リンクをどうぞ。
- Rails I18n
- とりあえずこれを上から順にやればいいと思う。
- iain.nl - Translating ActiveRecord
- サンプルコードを「LOLCATS語」にローカライズする例。
- func09 - Rails2.2の新機能i18nを使ってみる
- 真ん中へんにエラーメッセージの翻訳例が載っている。
- Rails2.2のI18Nを試してみた - yuum3のお仕事日記
- Railsをローカライズする - デモ アプリケーション
感想
現在主流であるRuby-GetText-Packageと比べると、 「英語」と「日本語」と「キーとなる文字列」の3つを書かないといけないのはめんどい。翻訳がなかったら英語にフォールバックしてほしい。 「全ての言語を平等に扱わないと!」みたいな意識からこういう仕様になってるのかなぁ。
確かに5カ国語とか多言語に翻訳するなら手間はそんなに変わらないんだけど(4→5)、非英語圏の開発者にとっては 母国語と英語の2カ国語に翻訳するという用途がメインなんだから(2→3)、手間が1.5倍になってめんどい感が大きい。
まあ規模の小さいアプリならそこまででもないし、プラグイン入れなくてもとりあえずローカライズできるっていうのは良いですね。
■ [esobook] 本の値段設定とか
書籍の値段って、必ずしもページ数に比例しない。いったいどういう基準で値段を付けてるんだろう、と思ってたんだけど、 実は意外と単純なルールだった。
要するに、「利益が最大になるよう」な値段を、出版社が勘と経験から推測して決めるらしい。 入門書のように読者層が広い(と期待できる)ものは多少安くして多く売る方針で。 専門書のように売り上げ冊数が少なそうなものは高めになるようだ。
2008-12-15
■ [event][esobook] 今週末、梅田でトークイベントします
(12/18追記: 会場がそれほど広くないようで、定員は40名と決まっているそうです。 予約の申し込みは「ジュンク堂書店 大阪本店 3階東カウンター」か、TEL. 06-4799-1090で行えるそうです。)
関西Ruby会議の出張Ruby本販売が好評だったようで、
「またRuby本イベントなどしたいですね」「そういえば昨年度まで関西にいたyharaさんが本を出すようですよ」
「じゃあトークセッションですね」「そうですね」→「というわけでジュンク堂梅田本店(←「大阪本店」が正式名称でした。すみません)で何かしゃべりませんか」「ええっ!?ちょwww」
…というやりとりがあったとかなかったとか。
まだ何を話すか決めてないのですが、本の紹介と、「Matz江から見たRuby」というネタでなんか喋る予定です。
本の紹介とか
そういえば、本書の想定読者を書いてなかったと思うのでここで。以下に当てはまる数が多いほど楽しめるかと思います。
- Rubyの初中級者だ。
- Brainf*ckやWhitespaceなどのEsoteric Languageに興味がある。
- そうでなくても、プログラミング言語全般に興味がある。
- プログラミング言語を作ってみたい。
- え、プログラミング言語って作れるものなの?意味分かんないんだけど。
本書は2.5部構成になっていて、第一部ではHQ9+、Brainf*ck、Whitespaceという3つのEsoteric Languageの処理系をいろいろな方法で作ります。 実装言語はRubyですが、Rubyの文法そのものの説明はしてないので、必要な方は別途リファレンスやRuby入門書籍を併用してください (Rubyの高度な機能は特に使っていません)。 第二部ではStarry, Bolicという本書オリジナルのEsoteric Languageを実装しつつ、新しい言語の作り方を考えます。 特にBolicはなかなかひどい感じに仕上がっていると思います(笑)。 付録では、「Esoteric Language傑作選」と題して本編で取り上げられなかったいろいろなEsoteric Languageを紹介しています。 選定基準は筆者の独断ですが、なるべく個性的で、他と被らないものを選んだつもりです。
基本的にプログラミング言語と言語処理系を作る本ですけど、チューリング・マシンとかの「計算を行うには何が必要か」という話にも少しだけ触れています。 個人的には、学校のクラブ活動でプログラミングやってる中高生とかに読んでみて欲しいです。
4839927847
プログラミングを覚えたての頃はアプリケーションを書くのに必死だけど、慣れてくるとライブラリも書いたりできるようになる。 ライブラリをデザインするっていうのは、部屋や建物をデザインするのに似ている。他人に満足してもらうものを作るのは難しいけど、 良いライブラリを使ってプログラミングするのは、良い感じの部屋でくつろぐように心地いいものだ。 この例えでいくと、プログラミング言語をデザインするっていうのは惑星を丸ごとひとつデザインするようなものだろう。 すべてのアプリケーション、すべてのライブラリがその中で記述されるからだ。 幾多のプログラミング言語のうち、広く使われているものはほんの僅かしかないことを考えれば、良い言語を作ることがどれだけ難しいかがわかる。
大変そうだって?
「星の王子様」という有名な童話に、小さな惑星がいくつも出てくる。数十歩もあるけば一周できてしまうような、 頑張っても数人しか入れないような、そんな小さな星だ。
それくらいのサイズで良いのなら、プログラミング言語をつくることは難しくない。決して。
この本を通じて、そのことを体験してもらえれば幸いだ。
2008-12-18
■ [ruby] --
- この記事はobsoleteです
- Github上でのgem生成機能は終了しました。rubygems.orgを使いましょう。
GitHubに自作gemを置く方法
Rubyでライブラリをインストールする手段といえばgemコマンドなわけだけど、
$ gem sources -a http://gems.github.com
としておくとgithubで公開されているライブラリをgem installでインストールできるようになるのはご存じだろうか?
例えば上の状態で
$ gem install yhara-ruby-sl
とすると、http://github.com/yhara/ruby-sl/tree/master のgemがインストールされる {[fn "されない場合はrubygemsのバージョンが古いかもしれない。とりあえず1.3以降なら大丈夫だと思う。"}。「(ユーザ名)-(プロジェクト名)」がgem名になるわけだ。
だがgithubにプロジェクトを作るだけでgemが作られるわけではない。現在公開されているgemは以下のページで一覧できる。
githubでgemを公開する方法
githubにgemを自動生成させるには、以下のことをすればいい。
- 自分のプロジェクトのページで「edit」を押して、設定の「RubyGem:」という欄にチェックを入れる。
- gemspecファイルをコミットする。
- しばらく待つと、gemが公開される。
もう少し詳しく解説しよう。
gemspecファイルの作成
2.のgemspecファイルは、例えば以下のようなものだ。
これは必ずしも手書きする必要はなく、例えばfork版cutagemを「gem install genki-cutagem」で インストールしておくと、
$ cutagem プロジェクト名
としたときに、自動的にRakefileが生成され、「rake gemspec」でgemspecファイルを作れるようになる(Rakeが入っていない人はgem install rake)。
ビルドできるか確認
gemspecファイルをコミットしてpushする前に、
gem build プロジェクト名.gemspec
でちゃんとgemができるかどうか確認しておこう。いったんgemspecファイルをpushしてしまうと、バージョン番号などどこかを 修正しないと新しくgemがビルドされない。
またgemspecファイルをpushしてから新しいバージョンがインストールできるようになるまで、10分かそこらの時間がかかる (http://gems.github.com/list.html に反映されるのはさらに後のようだ)。
参考
あ、最初の説明で実際に「gem install yhara-ruby-sl」としてしまった人には、くだらないライブラリをインストールさせてしまって申し訳ない。 ruby-slの使い方は以下のようになる。
$ irb -r rubygems irb(main):001:0> require 'sl' => true irb(main):002:0> SL.run!
■ [web] うごメモはてな
任天堂ときたかー。
- http://ugomemo.hatena.ne.jp/
- http://ugomemo.hatena.ne.jp/opening_campaign
- http://d.hatena.ne.jp/ugomemohatena/20081218/1229578200
どうも作品へのリンクを張ると自動再生されてしまう仕様らしいので、音付きの物は避けた。
2008-12-22
■ [rspec][rails] mock_modelでハマる
RSpec on Railsで
./script/generate rspec_scaffold (モデル名)
とかするとコードとテストが自動生成される。
んでですね、例えば rspec_scaffold Book とかやると
describe BooksController do def mock_book(stubs={}) @mock_book ||= mock_model(Book, stubs) end ...
みたいなテストコードが生成されるんだけど、こいつは(見て分かるとおり)2回目以降はmock_modelを呼び出さないので、 引数に渡したstubsはまるっきり無視される。
このことに気づくのに数時間かかりました(´・ω・`) RSpec on Railsはもっとハマりにくいテストを自動生成すべき。
def mock_book(stubs={}) if @mock_book stubs.each{|k,v| @mock_book.stub!(k).and_return(v)} else @mock_book = mock_model(Book, stubs) end @mock_book end
こんなんでいいかな?長いかなぁ。
というか引数ありのmock_bookをひとつのテストケースで二回以上使うのが間違ってるのかも…。
2008-12-25
■ [ruby] RubyのWebフレームワークについて最近調べたこと
- Rails
- 知ってるよね?
- ramaze
- 中規模アプリ向け。
- ModelやViewだけでなく、Loggerやサーバなどなんでも自由に取り替えられる。ControllerとRoutingが本体。
- ソースコードがわりと綺麗。example/以下に例がまとまってる。
- 最近Webが更新されてない?と思ったら、やたら格好いい新サイトが開発中だったw
- Sinatra
- 「RubyのためのWeb用DSL」。
- 極小アプリ向け。「1時間でWikiエンジン作るぜ」みたいな用途に。
- Model用のライブラリとかは特にサポートしないので、PStoreなりDataMapperなりご自由に。
- でもあんまり複雑なデータベースを扱うようなアプリにはそもそも向いてない(フォームを手書きしないといけないとか)。
- ルーティングがとても直感的に書ける。get '/books/:book_name/reader/:user_name' とか。
- ビューはerbかHamlがデフォルトで使える。
- SinatraでHTMLエスケープする方法
- Haml
- 「YAML風HTML」なテンプレートエンジン。
- キモい。
- 閉じタグが死ぬほど嫌いな人におすすめ。
- 使ってみるとそこまで悪くない。
その他、Rubyの新参Webフレームワークは http://ramaze.net/ の一覧がまとまってますよ。
■ [esobook] サポートサイトを公開しました
今のところ正誤表しかないですががが。
4839927847
年内には解答例とダウンロード用ソースコードが追加されます。あと、年明けにちょっと企画を考えているのでそちらもお楽しみに…。
2008-12-29
■ [games][mac] Macで変愚
(2013/12/7追記:現在は http://hengband.sourceforge.jp/wiki/index.php?%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%2FMac を見たほうが良いです)
メモ。
必要なもの
- X11 on Mac
- autoconfとかgccとか(macportsで入れよう)
ソースの取得とコンパイル
svnで、公式のリポジトリから
$ svn checkout http://svn.sourceforge.jp/svnroot/hengband/Hengband/trunk heng-svn
とすればいいのだけど、なんか上手くコンパイルできんかったんでhengband-luaを使った。
$ git clone git://github.com/motemen/hengband-lua.git $ cd hengband-lua $ autoconf $ ./configure --help $ ./configure --enable-script --enable-chukei && make $ ./bin/hengband
とかでいけたはず。
(2010-05-14追記:公式版は、「./bootstrap」「./configure --enable-chuukei」「make」でいけた。hengband-luaはスコア送信がオフなので注意)
フォントの設定
デフォルトだとフォントサイズが24とかで、でかい。
ので、以下の手順でIPAフォントを入れる。(※途中の.RprofileはRの設定なんで作らなくていいですよ。)
ただしxinitrcの場所は以下が正しいみたい。
sudo cp -p /usr/X11/lib/X11/xinit/xinitrc /usr/X11/lib/X11/xinit/xinitrc.orig sudo cp xinitrc.txt /usr/X11/lib/X11/xinit/xinitrc
起動
あとは、
$ export ANGBAND_X11_FONT="-ipagothic-*-medium-r-normal--18"; ./bin/hengband
とかで。
2008-12-31
■ [misc] 2008年を振り返る
修士だった3月までと、社会人になった4月からをまとめて振り返るのが違和感あるけど、この先年度でなにか変化することはもう無いことに気づいたので、振り返ってみた。
今年はブログをあまり更新してなかった気がしたけど、405エントリも書いていたらしい。昨年が347エントリなので、増加してるのか。
- 1月
- バイト
- 修論
- BiwaScheme
- Kanasan.JSはじまる
- 発表:「Javascriptで無限ループを実現する5つの方法」 @ Kanasan.JS
- Biwako-dev#2 (アーム面)
- TGM3とか頑張ってたらしい
- 2月
- 修論発表
- 春休み
- 発表:Ruby1.9のFiberはゲームにも使えるのか? @ SDLオフ
- 発表:Rails以外のWebアプリケーションフレームワーク @ Ruby関西
- 3月
- 発表:SchemeでAjax & Comet @ gauche.night#2
- 裏SVツアー
- 3年間使ったThinkpadとお別れ
- 引っ越し
- 4月
- 社会人にジョブチェンジ
- reac(Reactive Ruby) (動画)
- MacBook購入
- 5月
- 自炊
- 発表:「良いSchemeプログラムの見分け方」 @ プログラミングGauche&SICP読書会#1
- 6月
- ustで自宅LiveCodingしてみた
- ramaze-users
- Nutterさん来松
- 発表:「Reposh - ハッカーのためのリポジトリシェル」 @ RejectKaigi @ RubyKaigi2008
- 7月
- ICFPC参加(チームyarunee)
- 発表:Bookmakの紹介 @ Kanasan.JS
- 8月
- Unbabelの準備
- Ruby開発合宿
- 発表:「Unbabel - LLにLLを埋め込んでみた」 @ LL Future
- お盆。同級生とバーベキューしたのが唯一夏らしいイベントか。
- 9月
- Dropboxを使い始めた
- 旅行
- 10月
- Japanespec
- 執筆について、本気の出し方を覚えた
- BLOCKSUM omake ver
- 11月
- RubyConf参加
- 執筆
- ジャグリングを始めた
- 12月
- 出版
- BiwaSchemeをgithubに移行
- 発表:「Rubyでつくる奇妙なプログラミング言語の世界」 @ ジュンク堂梅田本店
- サポートサイト公開
- 変愚(アンバライトアーチャー)
8回も対外発表してたらしい。多すぎるだろw。いや多いのはいいんだけど、そのせいで開発する時間がなくなるのは本末転倒なので。
よかったこと。
- 執筆を終わらせた。
- 入れられなかったものはいろいろあるけれど、少なくとも終わらせないことには誰にも読んでもらえないわけだから。
- あと「ダラダラしないことができること」がわかったことは大きい。
- 大きな怪我も病気もなく。
- 風邪気味は多かったけど。
よくなかったこと。
- リリースが少なすぎ。
- Unbabelとか、ネタにリソースを突っ込みすぎた感w。
- でもまあ、社会人になって一人暮らしして生活が一変したところなんで、ペースが掴めなかったのは仕方ないことかも。
来年の目標。
- 朝飯をちゃんと食べる生活をする
- このまえokkez邸でいただいた朝食がおいしかった。ああいう朝生活をしたい。
- 計画的になる
- 締め切り前に焦るのを止める。
- 「要は早めにやればいいんでしょ?」と思ってたが、違うな。大事なのは「見積もること」の方だ。
- 「いつか作るリスト」を3つ以上消化する
社会人になってもブログを続けられたのは良かったけど、何も考えず過ごしてるとあっという間に1週間が過ぎてしまうことが分かった。 学生のとき以上に、「自分はいま何をしているか?」に自覚的でないといかんなーと思う。何やってたか思い出せん日が多すぎる。
おまけ
といいつつゲーム関連のことについてw。
- STG
- 全くやってない1年だった。ちれーでんやりたい。
- Ti
- S5は突破したけどほぼ引退。でもいつかTGM4が出たら喜んでやっちゃうんだろうなぁ。
- IIDX
- DJT。SP八段、DP十段(だったはず)。SPはもうどうでもいいけど、ここまできてDP皆伝取らずに死ぬのも勿体ないかなぁ、と最近思い始めている。練習するかどうかは不明。
- Pop'n, DM
- 引退。
- 変愚
- 今年はぜんぜんやらなかったけど、最近始めたアーチャーでなんとか勝利したい。
- ジャグリング
- 来年の目標は5ボールフラッシュ(適当)。4ファウンテン安定(100キャッチとか?できるかなぁ)。
- 小説
- 森博嗣と西尾維新しか読んでない(あと田中ロミオか)。もうちょっと開拓してもいい気がする。
□ ムムリク [面白そうです〜。]
□ yhara [ありがとうございますm(__)m]