2009-04-01
■ [biwascheme] BiwaSchemeのメーリングリストができました
Google Groupが簡単に作れるっぽいのでとりあえず取ってみた。
最近yamatoさんといろいろメールのやりとりをしているので、話題はあります。
■ [biwascheme][git] githubのリポジトリの内容をWeb的に公開したい
BiwaSchemeはリポジトリがgithubにあって、公式サイト(というほどのものでもないけど)がサークルのサーバにある。
ので、githubにpushしたものをいちいちpullするのが面倒なのですよ。 だけどpullしないとWebから試せるものはいつまでも古いまま。これは困った。
そこでGithub Pagesが使えないか調べてみた。これは、githubに「yhara.github.com」という名前のリポジトリを作ると http://yhara.github.com/ でその内容が見えるというものだけど、それに加えて既存のリポジトリをミラーする機能もあるようだ(Project Pages)。
Project Pagesは主にrdocなんかを用途として想定してるみたいだけど、これを使ってbiwashcmeリポジトリをミラーしてもらえば、 REPLであるindex.htmlが http://yhara.github.com/biwascheme/index.html とかでアクセスできるようになるはず。これで勝つる!
やり方
デフォルトのname.github.comにある短い説明じゃ分かんなかったんだけど、どうもyhara.github.comではなくbiwaschemeのリポジトリ側に なにか操作をする必要があるらしい。
やり方は、http://pages.github.com/ に従って、作業中のコミットを片付け、gh-pagesというブランチを作り、ファイルをコミットする…と。
あれ、じゃあリポジトリの全体がミラーされるわけじゃないのか…。 どうしよう。
- 案A: gh-pagesをメインのブランチとして作業する。
- 案B: 適当なタイミングで、masterからgh-pagesにマージを行う。
なんか
- 案C: Github Pagesを諦め、cronで一日一回git pullすることにする。
でもいい気がしてきたw
2009-04-02
■ [biwascheme][git] git submodule(SVNの外部参照みたいなやつ)を使ってみた
動機
biwaschemeを使ったアプリケーション(以下tickets) を書いているのだが、利用者にとってみると、ticketsとbiwaschemeという 2つのリポジトリをcloneしないといけないので面倒。
さらに、ticketsで必要になった機能をbiwaschemeに随時追加したりしているので(例:R6RS hashtable)、 2つのリポジトリを同時にcloneしないと依存関係が合わなくて動かない。これは面倒。
解決法
ticketsのリポジトリにおいて、biwaschemeをサブモジュールとして登録する。
submoduleはサブディレクトリで普通にgit cloneするのと近い感じだけど、ticketsの各コミットと、「その時使っていた biwaschemeのバージョン」が対応付けられるので、上のような依存問題が発生しない。
手順
まずticketsの側で
git submodule add git://github.com/yhara/biwascheme.git
とした。これで、biwascheme/ 以下にリポジトリbiwaschemeのファイルがcloneされる。git ci でこの変更をコミットする。
あとは、tickets/biwascheme/以下でgit pullすることで、サブモジュールを最新版に更新できる。 が、これはtickets内の変更とも見なされるので、tickets側で「biwaschemeを最新のものにした」ということをコミットしなければならないようだ。
制限
- tickets/biwascheme/ 以下で作業を行ったときは、tickets側でpushする前にtickets/biwascheme/以下をコミットしてpushしておかなければならない…らしい。
- 利用者がticketsをcloneする場合、サブモジュールは自動では取ってこないので、git submodule init; git submodule updateが必要。
2009-04-03
2009-04-07
■ [event][biwascheme] BiwaScheme Hackathon #1
というイベントが、先週土曜日に行なわれました。
流れとしては、東京行きますという日記を書いたらyamatoさんとmokeheheさんからお誘いを頂いて、せっかくならご一緒にお会いしましょうかということで今回のイベントになりました。
そんで行ってみたら初対面の方が5人いたり、全員がBiwaSchemeを知ってたり(まあそうか)異常な空間だった。
どうやらyamatoさんは本気でアプリケーションを書こうとされているようで、プロジェクトに対する責任感が芽生えたような気がしました。 もう自分のためだけのBiwaSchemeじゃないのね、みたいな。
BiwaSchemeの内部構造の話をしたり、デバッガの話をしたり、長らく忘れてたことをいろいろ思い出しました。 あといろいろアイデアをいただいた。
- 例外処理。throwとcatchで実装できるかと思ったけど、ネットワーク通信とか挟むとスレッドが変わるから駄目だなぁ。jsで書かれたライブラリ関数からもraiseしたいと思うとマクロですますわけにも。
- wonderscm(wonderflのScheme版)は面白いと思うので、さくっと実装できそうだったらぜひやってみたい。
- メモ代わりに、specに「これがバグるよ」という項があるといい。
- URLのパラメータ部分をJSから取得したい。
- dumpの色分け。
- cookie。
- CDATAでくくる。
twitterにも書いたけど、自分のプロジェクトのイベントができるというのはとても幸せなことであるのが分かった。 続けていると良いことがあるものです。 改めて、今回来て下さった方に感謝を。次回以降も機会を見つけてやりたいと思ってるので、今回参加できなかった方もよろしくお願いします。
■ [scala] Scala DSLによるBASIC実装
Scalaすげー。
Rubyでは行番号がどうやっても無理で、Schemeでも改行がread時に消えちゃうからダメ。 Common Lisp+リーダマクロならできると思うけど。
2009-04-08
■ [rails][rspec] restful-authenticationの作るspecがRails 2.3.2に対応していない
以下のようなエラーが出ると思う。
3)NoMethodError in 'UsersController named routing should route user_(:id => '1') to /users/1' undefined method `formatted_user_path' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_4::Subclass_3:0x22bcd8c>./spec/controllers/users_controller_spec.rb:152: 4)Test::Unit::AssertionFailedError in 'UsersController route generation should route users's 'update' action correctly'The recognized options <{"action"=>"show", "id"=>"1", "controller"=>"users"}> did not match <{"action"=>"update", "id"=>"1", "controller"=>"users"}>, difference: <{"action"=>"update"}> ./spec/controllers/users_controller_spec.rb:83:
こんな感じで直した。
参考:
2009-04-09
■ [biwascheme] GoogleMapsに1800個くらいマーカー置こうとしたらブラウザが限界に達した
所用で久しぶりに(卒論以来か?) BiwaSchemeでGoogle Mapsいじるコードを書いてたんだけど、 マーカーを1800個くらい置くSchemeのコードを書いたらFirefoxもOperaもSafarも 操作不能になった(いや、Operaは操作はできたな)。
ところどころにsleep入れてるんだけど、それでも駄目なんだよね。というか、evalじゃなくてread時に時間かかってるっぽい。 別にS式が巨大なわけじゃなくて、120文字くらいのが2000個あるだけなんだけど。もう少し要調査か。
ところがですね、製作途中らしいMac版Google Chrome(参考)だけは 実用的な速度(10秒くらい?)で動くんですよ。まあ機能がまだ全然ないので速いってのもあるかも知れんけど、それにしてもChromeやばい。
ちなみに書いてたコードはこんなの。「新しくマーカを作り、クリックされたらInfoWindowにこの文字列を表示する」とかも普通にできます。
(define *map* #f) (define *markers* #f) (define (point lat lng) (js-new "GLatLng" lat lng)) (define (marker-new pt) (js-new "GMarker" pt)) (define (add-marker! pt proc) (let ((marker (marker-new pt)) (depth (- 15 (random-integer 2)))) (js-invoke *markers* "addMarker" marker depth) (js-invoke (js-eval "GEvent") "addListener" marker "click" (js-closure (lambda (e) (proc marker)))))) (define (add-store! name lat lng addr url misc) (define (on-click marker) (let* ((br "<br>\n") (str (string-append name br addr br url br misc br))) (js-invoke marker "openInfoWindowHtml" str))) (when lat (add-marker! (point lat lng) on-click))) (define center (point 35.4813224 133.0679589)) (define (init) (set! *map* (js-new "GMap2" ($ "map"))) (js-invoke *map* "setCenter" center 14) (js-invoke *map* "addControl" (js-new "GLargeMapControl")) (set! *markers* (js-new "MarkerManager" *map*)) ) (init) (load "loader.scm")
■ [rails] Rails2.3だとプロジェクト作るときにテンプレート使えるらしい
bortとかextended-bortとかrocket-starterとか、「いろんなプラグインが入った状態から開発を始める」ための Rails関連ツールってのがいくつもあったわけですが、 Rails2.3からは「Rails Template」(Application Template?)という、railsコマンドでプロジェクト作ったあとに 自動でなんかするための機構が導入されたみたい。
参考:
- has_many :bugs, :through => :rails: Rails templates
- Rails2.3のApplication Templateを使ってRspecやI18nの設定を自動化 - func09
まあなんかtemplate.rbに
# template.rb run "rm public/index.html" generate(:scaffold, "person name:string") route "map.root :controller => 'people'" rake("db:migrate") git :init git :add => "." git :commit => "-a -m 'Initial commit'"
などと書いておき、
rails foobar -m template.rb
とすると、プロジェクト作成後に自動的にscaffoldしたり、db:migrateしたり、gitリポジトリ作ったりしてくれると。 なかなか良い感じです。
サンプルがこのへんにあります。
ただ一つ気になったのは、pluginコマンドでプラグインを追加するとき、リポジトリの最新版しか取って来れないという点。 せっかく、script/pluginならタグが指定できるってのに…。 しかもscript/pluginはこれはこれでgitのsubmoduleにできないんだね(pluginコマンドはこれができる)。
んで、むりやり特定バージョンをsubmoduleにする方法を考えてみた。
# Install plugins def submodule(url, tag=nil) name = url[%r{/([^/]*)\.git\z}, 1] or raise "wrong git url? #{url}" run "git submodule add #{url} vendor/plugins/#{name}" inside("vendor/plugins/#{name}"){ run "git checkout #{tag}" if tag } end submodule 'git://github.com/dchelimsky/rspec.git', '1.2.2' submodule 'git://github.com/dchelimsky/rspec-rails.git', '1.2.2'
うん、まあ、そのうち対応される気がするんで、おとなしく手でsubmodule addすればいいんじゃないかな。
2009-04-10
■ [ruby] Thorってなんなの?yet another rakeなの?
Thorについて分かっていること:
- rubyforgeにアカウントがあるがリリースはない
- と思ったらgithubから入れろということか
- コマンドラインアプリを書くためのツールらしい
- 作者の説明
- Merbの開発者だ
- sinatra-bookのビルドにも使われてる
どうも、*.thorというファイルでThorを継承したクラスを定義しておくと、そのメソッドが thor なんちゃら で呼べたりするらしい。
例。test.thor (ファイル名はどうも関係ないらしい)
class Sample < Thor desc "hello", "greets to you" def hello puts "Hello!" end end
thor sample:hello で実行。
Hello!
thor -Tでタスク一覧。
sample ------ sample:hello greets to you
ふーん。
Rakeタスクとできることは同じような感じだけど*1
- Rakeは依存関係を記述するのが主目的で、コマンドラインツールとして使うのは若干目的を外れている
- Thorの方が薄いDSL (素のRubyに近い) ので書きやすそう
と思った。
*1 bin/rake2thorとかあるから、意識はしてるみたいだw
2009-04-13
■ [git] 「gitを始める前に知っておいたほうがいいこと」的な発表をした
社内勉強会でgitの話をした。gitはsvnと違うところがありすぎて(コマンド名とかstagingとか)、いきなり触るととっつきにくいところが多いので、 そのへんを自分なりにまとめてみた感じです。
そのうちこっちにまとめる。
2009-04-14
■ [ruby][git] JRubyがgitに移行
JRubyのリポジトリがsvnからgitに移行したそうな。
- Headius: JRuby Moves to Git
- オフィシャルなリポジトリはkenai.comにあり、githubの方はミラーだそうです。
- jrubyさんのアカウント。
- 活発にコミットがあります。
なぜgitを選んだかについては、
- 長いこと分散SCMを検討していて、Mercurialかgitにしようと思っていた
- KenaiはsvnとMercurialしか使えなかったんだけど、最近gitがサポートされた
- githubにリポジトリ置いた方がRubyistの援助を集めやすいんじゃね?
- そうこうする間にgitが気に入ってきた
- まあ結局、Ruby界でgitが人気だからgitにした。もしJythonの開発をやってたらMercurialの方を選んだだろうね
とのこと。
■ [ruby][javascript] Rubyでブラウザを使わずにJavaScriptのテストを行う
WWW::MecanizeやNokogiriのアーロンさんより。
rake testでJSのテストまでやりたかったので、いろいろyak shavingしてるうちに1年以上ハックし続けてしまったそうなw。
んで、実現に必要なものが3つあって、即ち:
- Rubyから操作できるJavaScript処理系。→ jhonsonというspidemonkeyのRubyラッパが使える。
- 適当なHTMLも解析できるXMLパーザ。→nokogiriが使える。
- DOMをエミュレートするライブラリ。→takaできたよー
これらを使うことで、
assert_equal 0, @document.getElementsByTagName('option').length
という感じでJSのテストが書けると。…無茶しやがってwww
まだtakaで実装してないDOMのapiもあるそうなんで、応援したい人はがんがんパッチ書くと良いです。
□ wtnabe [ほしかったっす!]
2009-04-15
■ [javascript][scheme] js-scheme
a Scheme interpreter written in JavaScript…とな?
継続は脱出用途しかサポートしないようだけど、デモのコマンドライン風REPLはいいな。
■ [misc] 英語を練習するためのチャット作った
インターネットのおかげで外人とチャットするとかすげー簡単になったわけなんですけど(例:IRC@freenode)、 やっぱりちょっとなんというか敷居が高いわけです。 剣道で例えると、自分は授業でちょろっとやっただけなのに五段の人と練習試合するみたいな。 「大丈夫、手加減するから」って言われても怖いじゃないですかwww
なので最初は日本人どうしで練習すればいいと思った。
ujihisaに昔の記事をremindされて思いつきました。ノープランですがよろしくお願いします。 日本人どうしだから超適当でも大丈夫だよ!!
#んで「間違いを気にしなければ意外と書けるんだ」ってことに気づいたら、英語のMLとかIRCとかに参戦できるようになると思います。
■ [ruby] ライブラリ「ActiveRecord」「DataMapper」の元ネタについて調べてみた
PofEAAっつー本のデザインパターン名らしい。
0321127420 4798105538
以下メモ
OTN Japan - 今だからデータ・アクセスを真剣に考える! 第1回
- システムはだいだい以下の階層に分けられるよ(分け方は人によるけど)
- UI層 / アプリ層 / サービス層 / ドメイン層 / パーシステンス層 / データストア(RDBなど)
- Table Data Gateway、Row Data Gateway、Active Record、Data Mapper はパーシステンス層のパターン
- ドメイン層にも以下のようなパターンがあるよ
- Transaction Script
- 機能をクラスにし処理をメソッドにする。
- Domain Model
- データをクラスにする。OO寄り。テーブルとクラスが(必ずしも)対応しない。
- Table Module
- データをクラスにする。RDB寄り。1テーブル1クラス。
- 対象が複雑になったときの拡張性が違う。
- Transaction Script
OTN Japan - 今だからデータ・アクセスを真剣に考える! 第2回
- パーシステンス層のパターン
- Table Data Gateway
- あるテーブルにアクセスするクラスを定義し、そいつ経由でDBアクセスを行う。
- Row Data Gateway
- あるテーブルの1行(レコード)を表すクラスを定義する。
- Active Record
- テーブルの1行(レコード)が1インスタンスになる。Row Data Gatewayと似ている
- Row Data Gatewayと違い、ドメインロジックをメソッドとして含む。(Railsでいうモデルに定義するメソッドとか)
- Data Mapper
- ドメイン層にもデータストアにもなるべく依存せず、O/R間のデータ変換を行う
- Table Data Gateway
- それぞれ、ドメイン層のどのパターンと合わせやすいかが違う
- # RubyだとORMライブラリがドメイン層まで吸収してるので考える余地はなさそう
- O/Rインピーダンスミスマッチの話
- 大規模開発においては、OとRを分離して作りやすい「Domain Model」+「Data Mapper」がいいんじゃないか
■ [book][javascript] オライリー本「Prototype & script.aculo.us」
買っちゃった。
4873113725
- 単なるリファレンスじゃなくて、「この関数はこういう時に使え」みたいなことも書いてあるのが嬉しい。
- インプレース編集機能とかあったのか…。
2009-04-16
■ [softs] Apache Couchdb
Web 時代の非リレーショナルデータベース: 第 1 回 Apache CouchDB の概要とインストール
- RDBではなく、json形式のデータを保存。スキーマはない
- HTTP経由のREST APIで操作
- MapReduce風のクエリが使える
- 実装はErlang
なんぞこれー。
■ [misc] 人につくらせ、人に選ばせることで目的のものを手に入れる
(via http://b.hatena.ne.jp/kokokubeta/20090416 )
面白かった。
あるサイトに誘導するための広告バナーが欲しいときに、
- ユーザに200個くらいバナーを作ってもらい、
- それらを実際に表示し、クリック率の高いものを選ぶ
ことで「本当にクリックされるバナー広告」を作ることができる、という話。(いや、そういうシステムのバナー製作サイトができた、という話か。)
「作成」と「選別」に(大量の)人力を使うところがポイントか。
例えば芸能人のそっくりさんを探したいときに、
- 芸能人に似てる写真を投稿するサイトと (「顔ちぇき」とかあるよね)
- 芸能人に似てる度をユーザが評価するサイト
を用意すれば、自動的にそっくりさんが集まる、と。(効率がいいかはともかく)
2009-04-19
■ [haskell] link: HaskellによるAOBenchのコードの高速化をしてみた - 2009-04-11 - TTSYの日記
7.98秒っていうと、インタプリタではなかなか出せない感じのタイムですね。
高速化されたあとのコードがgithubに。高度なHaskellは読めん。
AOBenchのページはこちら。
2009-04-21
■ [ruby] gemを自作したのに実行ファイルがインストールされないと思ったら
gemspecの書き方が悪かった。$GEM_HOME/specification/*.gemspec から適当なものを参考に…と思ったけど、 それよりもまず:
ちゃんとマニュアル読まないとね。
executablesに実行ファイル名のリストを、 default_executableに一番重要な実行ファイル名を書く。
spec.executables = ['bin/foo', 'bin/bar'] spec.default_executable = 'bin/bar'
といっても、default_executableは今のところは何にも使われないみたいだけど。
ちなみにgemspec作るにはrtask使うのが簡単ですよ。 デフォルトで移動がカーソルキーなのにだけ注意。
2009-04-23
■ [ruby][link] Tab Sweep
Sinatra開発者へのインタビュー
- http://rubylearning.com/blog/2009/03/20/interview-aaron-quint-on-sinatra/
- http://rubylearning.com/blog/2009/03/03/interview-adam-keys-on-sinatra/
- http://rubylearning.com/blog/2009/03/20/interview-ryan-tomayko-on-sinatra/
Sequel開発者へのインタビュー
Rubyの英語のウェブマガジン
「Ruby Best Practice」とか出てたのか
2009-04-27
■ [biwascheme][memo] JSのテストをJSでできないか
JSのテストをJSでできないか。イベント処理も含めて。
作戦1
Prototype.jsではカスタムイベント+fireが使えるので、BiwaSchemeでいうとadd-handler! (Element.observe相当) をオーバーライドして カスタムイベントを経由させれば、スクリプトからイベントを発火させることが可能に。
という実験をBiwaSchemeでやってるんだけどさー。 「新規アイテム作成→削除」という単純なテストがあったときに
(js-invoke ($ "origin") "fire" "bs:click") ; --- (expect (vector-length (ticket-divs)) is 1) (js-invoke ($ "hand_delete") "fire" "bs:click") ; --- (expect (vector-length (ticket-divs)) is 0)
上の「---」の部分がイベントハンドラの実行終了までブロックしてくれないので、アイテムが作られる前にexpectが実行されちゃってfailした。
作戦2
もうイベントハンドラ自分で実行すればいいんじゃないかなぁ。
(つづく?)
2009-04-28
■ [ruby][scraping] Nokogiriに新機能が取り込まれたよ
NokogiriにもWeb::Scraperのshellみたいのが欲しいなーと思っていて、そしたらSequel添付のsequelコマンドが irbを使ってそれっぽいことを簡単に実現してたので、真似してみた。bin/nokogiri
んで、コミットしてpull request送ったら採用されました。これは嬉しい。
使い方は、
$ nokogiri http://www.ruby-lang.org/ (もしくはHTMlファイルのパス)
などとすると、変数@docに指定URLのHTMLを表すNokogiriオブジェクトが入った状態でirbが起動する、という感じです。 自分でいうのも何だけどこれは便利。
そのうちリリースされると思います (追記:されました) (今すぐ使いたい方はbin/nokogiriだけ取ってきてパスを通せばおk)
2009-04-29
■ [git] WEB+DB PRESS Vol50の「はじめてのGit」が神記事
読み終わった。
477413838X
なんといってもメンテナ自らが書いてるということで、言ってみれば世界一Gitに詳しい人(の一人)による入門記事なわけですよ。
紹介されているコマンドは以下の通り。
- git add : ファイル・変更の追加
- git commit : コミット
- git diff : 差分 (git diff, git diff --cached, git diff HEADの違いも!)
- git status : ワークツリーの状態を表示
- git show : あるコミットの情報を表示
- git log : コミット履歴
- git blame :
- gitk : GUIツール
- git revert : コミットの取り消し(あるコミットを打ち消すコミットを行う)
- git checkout : ファイルの取り出し
- git reset : コミットの取り消し(コミット履歴そのものを削除する)
- git rebase -i : 2つ以上前のコミットの書き換え
- git pull : 変更の受信
- git push : 変更の送信
- git clone : リポジトリの複製
- git init : リポジトリの初期化
「Gitではこういうことができます」という記事はWebにいろいろあるけど、 「Gitはこういう風に使います」というところまで書いてあるのが嬉しかった。 プロジェクトの規模に合わせて、柔軟にブランチを管理できるみたい。
2009-04-30
■ [git] git-svnが意外に簡単だった件
以下を参考に。
リポジトリの初期化
$ git svn clone <subversion-url> ?optional-directory-name?
svnのリポジトリから、ローカルなgitのリポジトリを作る。全ての履歴を取ってくるので多少、時間はかかる。(たぶんオプションで最新版だけとかできそう)
コミットの受信
$ git svn rebase
コミットの送信
$ git svn dcommit
ローカルの各コミットがsvn側に送信される。
注意点としては、「マージ」はsvnにうまく変換できないこと。だからローカルでブランチを作るときは、マージ時にfast-forwardになるようにしなければならない(多分)。
こういうのはいいけど、
*-*- / \ --*-----*--
こういうのはダメなんじゃないかな。
*-*- / \ --*--*--*--
というか、怖いので当面はブランチ作らない予定。
それ意味あるの?と言われそうだけど、git logが爆速なのでそれだけで幸せです(^o^)
□ mokehehe [add と submodule は逆でしょうか? msysgitで試したところ、最後に持ってくる名前?を入れる必要が..]
□ yhara [git submodule addが正しいです。直しておきました。]