トップ «前の日記(2009-04-08) 最新 次の日記(2009-04-10)» 編集

Route 477



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コマンドでプロジェクト作ったあとに 自動でなんかするための機構が導入されたみたい。

参考:

まあなんか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すればいいんじゃないかな。

本日のツッコミ(全3件) [ツッコミを入れる]
Yuya (2009-04-12 12:01)

Google Mapsは、MarkerManagerを使うと改善したりしないですかね。

yhara (2009-04-13 16:47)

いえ、MarkerManager使ってこんな感じでした。

Yuya (2009-04-14 00:43)

おっと失礼。GMarkerManagerだったかな。<br>MarkerManagerには2つのメジャーな実装があったような。