smellman's Broken Diary

クソみたいなもんです

ありがとうE4X、さようならE4X

ありがとうE4X
さようならE4X

今日、E4X 追悼会 (仮) というイベントに行って来た。

このイベントに参加できてすごくたのしかった。
こんなに思い出にふけるイベントはなかった。

僕は1999年、大学1年の時にXMLXSLTにこじらせた。
僕は自分の日記をXMLで書いてXSLTで変換してそれをgeocitiesにアップしていた。

僕は2000年、大学2年の時にXULと出会った。
でもそれ以上にSOAPがやばかった。
当時、英語の部活に所属してたのだけど、たまたま先輩がAmazonを日本で立ち上げるために来日していて、周りの人が留学について聞いてるのに僕はAmazonでSOAPXSLTがどのように使われているのかって聞いた。ぶっちゃけそんな使ってないっていうのと同時にドン引きされた。

僕はずっとXMLをこじらせていた。
従兄弟がSGMLXMLに変換するっていうのを専門にベンチャーをやっていたってのもあるけど、僕は全てがXMLになると思っていた。
2001年、大学3年の頃にはWSDLを自分の手元で動かしていた。
すべてのビジネスロジックはここに集約できると思っていた。

2002年、留年がわかってアルバイトをした。
その先で上司からこれやれよとSVGをやりだした。
当時、GISをやってたけど、そのデータがすべてオープンできると信じてた。
その時はOSMどころかGoogle Mapもなかった。
これだけは今、正しくなってた。OSMバンザイ。
ついでに僕はVisual BasicXUL実装してた。

2003年、大学4年、まじめにXMLに取り組んだ。
そりゃStrutsってXML使えないとダメじゃないか。
でも、ぶっちゃけクソだと思っていた。XMLは苦痛だった。

2004年、卒業の時に僕はPythonXULを実装してそれが卒業研究になった。
大学在籍中にずっと嘘をついて、卒論も全部ウソ書いた。
卒論発表の一週間前に実装を初めて、説業研究及び卒論で付いたウソを全部実装して本物にした。
頭のなかで7割ぐらいコードを書いてウソついてたけど、そのウソをつけたのは全部XMLのおかげだった。

2005年、僕はだめな人だった。
案件はひどく、もじら組組長とか言ってる場合じゃないぐらいに精神的にもやられてた。
でも、今日ちょっと調べてみたら、2005年には僕はE4Xを調べてた。記事のサイトがもうサーバごと落ちてる(いや、実家のマシン起動すればうごくけど)のでもう見れないけど。
僕はその経験は覚えてる(年代覚えてないくせに)。
すごく面白いものを見つけたって!

僕は大学入るころからずっとXMLが世界を変えると思ってた。
自分なりにSOAPだったりWSDLを書いたりしながら、XML/RPCにとって変えられていた時代がもどかしかった。

ただ、E4Xの興奮は未だに覚えてる。
これはXMLの未来を変える義実だって思った。
Javascriptの表現力が一気に広がって、この仕様は世界を変えると思ってた。

その気持ちは思い出せる。
だって、XMLじゃん!

今思うとだいぶ中二病的な感じだと思います。
でも、みんな当時IBM Developerworks見てたよね!
Java World読んでたね!
XML楽しかったよね!

ぶっちゃけ老害だけど、今日のイベントはちょっと涙が出た。
やっと決別できる!

ありがとうE4X!
さようならE4X!
僕はもうこの夢を見ないよ!

FirefoxのJavascript プロファイラを使ってみよう

Firefoxは基本機能の中に開発向けの機能が結構充実しています。
3Dビューやレスポンシブルビューデザインなんかはわりとデザイン向けとしては使える機能だと思います。僕も仕事ではよくこれらを活用しています。

さて、その中で最近増えた機能として、Firefox 20.0から追加されたプロファイラについて解説をします。
Web開発のメニューからプロファイラを選択すると開くことができます。
メニューの名前が「プロファイラ」なのですが、ぶっちゃけJavascript Profilerです。

起動をしたらプロファイラの開始を押すと解析がスタートします。
このあとJavascriptの処理をWebページで実行をします。
そして、終了を押すと解析が終了して結果が表示されます。

f:id:smellman:20130516005233p:plain

実行結果はツリーとして表示されます。
Javascriptの実行された時間が%として表示されます。
これをたどっていくことで重たい処理を簡単に見つけることができます。

僕はまた別の使い方をしていて、このツリーをたどることでどの処理が行われているかという解析をしています。
例えば、OpenLayersでは設定によってVectorのLayerのレンダラをCanvasSVGなどを選んだりすることができるのですが、それがコードからはどれを選んでるのがわかりづらかった*1ため、てっとり早く調べるためにこのプロファイラを使いました。

f:id:smellman:20130516010747p:plain

この例ではCanvasを使ってるっていうのがわかりますね。

他、便利な機能としては棒グラフになっているところをマウスカーソルでドラッグするとその範囲だけのサンプリングデータが取れます。
この機能を使えば重たいところだけを重点的に調べるなんてことができます。

あと、僕は試せていないのですが、Firefox 21.0からはリモートプロファイリングという機能があり、Firefox OS上のデバイスのプロファイリングができるようになっているそうです。
Firefox OS Developer Preview phoneを持っている方は文鎮になる前に*2ぜひ試して下さい。

ちなみに、プロファイリング機能はGoogle Chromeにもあるみたいです。
確認してみたんですが、Firefoxの方がJavascriptの処理だけをまとめて100%としているのに対して、Google Chromeの方は完全に時間軸で扱ってるようで、idleが多くを占めるようになっています。
これは見方の好みかなーと思います。

*1:ここからどれをたどるかって話 https://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/Layer/Vector.js#L805

*2:友達、届いた初日に文鎮になってたんだぜ...

Extract Decorators の威力をわかりやすくしたサンプル

昨日の千駄ヶ谷.rb7 Patterns to Refactor Fat ActiveRecord Modelsという記事をみんなで読んでいたのですが、その中の最後にあった Extract Decorators が使いドコロがわからないねってなっていたので、その記事にあるコードを手元で改良してわかりやすくしてみました。

元々のサンプルでちょっと変なのは、Facebookに投稿するものしか無いという点です。
このため、afterでやればいいのではっていう意見が出ていたんだけど、その場合だと例えばFacebookTwitterに同時に投稿するとか、片方に投稿するとかってどうするのっていう話が出てくる。

というわけで、その点をわかりやすくするために改良をしてみました。ちなみに、ActiveRecordを利用せず、単なるRubyのコードです。

実行のところを見て貰えるとわかるんですが、単純に実行した場合はmodelをsaveしかしないことになります。
引数でFacebookだったりTwitterだったりGoogle Plusだったりに投げるみたいなのを追加で選べるようにしていて、FacebookTwitterに同時に投稿するといったはてなブログでやってるような処理も簡単に書けるようになります。

実行例はこんな感じ。

[/Users/btm/tmp/gist/5567966] % ruby1.9 extradeco.rb --title 10 --user U
"save to comment model, title: 10, author: U"
"Your comment was posted."
[/Users/btm/tmp/gist/5567966] % ruby1.9 extradeco.rb --title 10 --user U --fb
"save to comment model, title: 10, author: U"
"post to facebook, title: 10, user: U"
"Your comment was posted."
[/Users/btm/tmp/gist/5567966] % ruby1.9 extradeco.rb --title 10 --user U --fb --tw
"save to comment model, title: 10, author: U"
"post to facebook, title: 10, user: U"
"post to twitter, title: 10, user: U"
"Your comment was posted."
[/Users/btm/tmp/gist/5567966] % ruby1.9 extradeco.rb --title 10 --user U --fb --tw --pl
"save to comment model, title: 10, author: U"
"post to facebook, title: 10, user: U"
"post to twitter, title: 10, user: U"
"post to plus, title: 10"
"Your comment was posted."

このように後付の処理みたいなのを追加していくのにはすごく便利です。
もちろん、modelのsaveのあとにPostに失敗したときにどうするの?などは別途対応が必要になりますが、そこはこの話の本質ではないですね。

あと、この実装をする上ですごく使えるって感じたのがSimpleDelegatorです。
initializeの引数に来たものを自動的に叩いてくれるため、 @comment.title をどんどんたどっていってくれます。
Rubyの便利さにはまじで驚かされますねー。

竹島の座標がおかしいって話を調べてみた

1905年当時の「島根県告示」をGPSで確認したら竹島位置は独島と違ったぞ!ドヤッ

この記事を読んで、どうせ測地系の問題だろうと思って変換をしてみたのだけど、全然竹島とあわなくってなんだろうと思ったら、wikipediaに以下のような記述があった。

かつて日本政府外務省は北緯37度9分、東経131度55分と記していた。2005年(平成17年)7月に毎日新聞によって誤りが指摘されると、正しい記述に訂正された。

竹島 (島根県) - Wikipedia

平たく言うと人間のミスで、もう修正されているものなのにわざわざ証拠だ〜証拠だ〜と言っているというなんていうか激しくどうでも良いオチでした。

ちなみに確認に使ったプログラムは以下のとおり。Ruby on Rails+PostGISアダプタでセッティングされているところで rails console で叩く必要あります。

def parse_lonlat(data)
  value = data[0].to_i + (data[1].to_f / 60) + ([data[2], data[3]].join(".").to_f / 3600)
  return value
end

# 元座標
lat = parse_lonlat([37, 9, 30, 0])
lon = parse_lonlat([131, 55, 0, 0])
p "http://www.openstreetmap.org/?mlat=%s&mlon=%s&zoom=12&layers=M" % [lat, lon]
# 出力結果: http://www.openstreetmap.org/?mlat=37.15833333333333&mlon=131.91666666666666&zoom=12&layers=M
                   
# 以下変換
srs_database = RGeo::CoordSys::SRSDatabase::ActiveRecordTable.new
entry = srs_database.get(4326)
my_factory = RGeo::Geos.factory(:srs_database => srs_database, :srid => 4301)
lon, lat = RGeo::CoordSys::Proj4.transform_coords(my_factory.proj4, entry.proj4, lon, lat)
p "http://www.openstreetmap.org/?mlat=%s&mlon=%s&zoom=12&layers=M" % [lat, lon]
# 出力結果: http://www.openstreetmap.org/?mlat=37.161237269380514&mlon=131.9140933716534&zoom=12&layers=M

まぁ、これを見るとたしかに11キロほど離れているように見えますね。目で測ってるだけなのであれだけど

以下追記

やはりここはちゃんと突っ込んでおこう。

金教授は、島根県告示が制定された1905年には緯度と経度の誤差が認められないほど測定技術が発展していたと指摘。座標が誤っているという点で、同告示は領有権を主張する証拠として不適格との見解を示した。「島根県が先占したという島の実体がないことが証明されれば、日本の独島領有権の主張もまた受け入れられない」と強調した。

政経ch - 1905年当時の「島根県告示」をGPSで確認したら竹島位置は独島と違ったぞ!ドヤッ

この理屈だと2005年まで放置されていた段階でただの人為的ミスだと気づけよバカじゃねーのw

Magical Digital / Rude Ass Tinker

Planet-MuのMix、Amμnition - Planet Mu Records Samplerという作品で、HellfishのU Don't QuitとRadical Digitalのつなぎとして使われていた楽曲です。
どう考えてもこのつなぎとして作られたのではないかと思われるぐらいしっくり来る(ぶっちゃけRadical Digitalのミックスだよね?)楽曲で、単体でのリリースとか無いんじゃないかと思ってたんです。

なので、まさか入手できるとは思いませんでした...

Deathchant LP003 - Drug Skill

購入時になんかバグがあってMP3なのに郵送料を取られたんですが、まぁどうでもいいやw

フルで聞いた感想だけど、やっぱりクソ楽しいです。クソです。
前半から音の使い方が汚くてたまらないです。
途中からいっきに頭が持っていかれるようなシャカシャカしたターンからどんどん音が汚くなってきてなんかものすごいクソの連鎖がヤバい。

クソっぷりに興味がある人はぜひYoutubeでみてください。まじ楽しい。


Rude Ass Tinker - Magical Digital - YouTube

あ、ちなみにRude Ass Tinkerはμ-ziqことMike Paradinasの変名です。

なれる! SE 9巻 ラクして儲かる?サービス開発 読了

エンジニアが血の涙を流すライトノベルなれる!SEの9巻を読みました。

今回は意外なことに血反吐吐くような展開はあまりなかったです。
最後のインターフェイスのやつもヤバい話ではあるけど今までとは毛色が違う感じだったし。

ただ、今回はポイントが別にあって、単純に技術的な話が面白いという感じでした。
なんていうか、SEを題材にした小説というところではリアル感が一番出ていた回じゃないかと思います。
福大さんハッカーすぎるけどw

あと、サービスでの競合がっていうのは、前職でサービス開発を担当していたので結構身に覚えが合ったり(今はサービス開発もあるっちゃあるけど)。
ぶっちゃけパクリあいみたいなのはよくあるし、今作みたいな露骨なケースはないとしても、あれってもしかしてみたいなものは結構あってニヤニヤしながら読めました。
そういう意味でも、今までで一番インパクトが無いパターンではあるけど、一番楽しめた回ではあります。

あと、梢の暴走っぷりもかなりやばいけど、工兵もそうとう頭のネジがおかしいです。
まぁ、冷静に考えて一番カモメがおかしいけどなー

ノッティンガムで話してきます

FacebookとかTwitterで前に報告しましたが、今年の FOSS4G(Free and Open Source Software for Geospatial) でプレゼンテーションをやることになりました。
ノッティンガムです。
イングランドです。
もちろん、発表は英語です。
yabai.

タイトルは "SVG Map - Tile Map without Javascript" です。ぶっちゃけ仕事関係です。
とりあえず、下手な英語でクライアントに迷惑が掛からないよう頑張ります><

あー、胃が痛い...