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つのメジャーな実装があったような。