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すればいいんじゃないかな。
Google Mapsは、MarkerManagerを使うと改善したりしないですかね。
いえ、MarkerManager使ってこんな感じでした。
おっと失礼。GMarkerManagerだったかな。<br>MarkerManagerには2つのメジャーな実装があったような。