ツッコミ大歓迎!間違等ありましたらご指摘ください! / はてダはこちらで書いてます。
Google Maps Street View が先日、日本のマップ分が追加されて、時の経つのも忘れて遊んで(徘徊して)ます。こういう360度ぐりぐり見渡せるようなVeiwって簡単にできるのかと調べていたら、どうもOpenGLを使えばかなり簡単に出来そうな気がしたので、Ruby-opengl (OpenGLのRubyバインド) を使って書いてみました。
なお、はじめての Ruby-opengl だったので、fujiの雑記 などを参考にさせていただいております。基本はGLUTとかからおんなじなので、CでGLUTを使って書いていたような人だとなじみやすいかも(というかそのまま)です。
まず動作には、JPEGのローディングに使っている ImageMagick と、gem では、ruby-opengl および rmagick が必要ですので、たとえば
$ sudo port install ImageMagick $ sudo gem install ruby-opengl $ sudo gem install rmagick
のようにしてインストールしておいてください。後は以下のソースを適当なファイル名(以下ではpanorama.rb)で保存して、
$ ruby panorama.rb test.jpg
のようにすると、test.jpg をテクスチャに読んで表示されます。テクスチャ画像(権利的に大丈夫と思われるもの)は このへん から入手できます。
起動すると、以下のような画面が出て、Street viewと同様な操作感マウスでDragができます。あとwキーでワイヤーフレーム表示、qキーで終了です。ズームは出来ませんので、適当に改造してみてね。
どうもこれは、Spherical Panoramasというジャンルっぽいです。仕組みは凄く単純で、球面の内側にべたっと普通にテクスチャを貼るとその急の内側から見ると全天が見渡せる、というような感じです。
コードは以下になります。 なんか変なのでgistで貼ってみました。
Mac OSX のリソース形式や、ちょっとした値などの保存によく使われる plist という形式のファイルがあります. たとえば OSX のリソース等の保存にもよく使われます. この plist には、形式として2種類あって、binary と xml があり、どちらも OS 的には同様に処理されます(OSから見ると等価になります).
たとえばリソースエディタの Interface Builder で編集した際には、ほぼ、binaryのplist形式になってしまいます. これだと、たとえば Subversion などでソース管理をしている際に、diff が見れず、変更点が些細な物であっても差分が見れない、という問題があります.
解決するには簡単で、OSXのコマンドの plist を使って binary から xml に変換すれば良いのですが、このコマンドは再起的に処理してくれないというのがあり、あと一括して、あるディレクトリ以下の バイナリ plist を見つけて処理してくれる物が欲しかったので、ruby でくるんでみました。
#!/usr/bin/env ruby -wKU dir = ARGV.shift || '.' Dir::glob(File.expand_path(dir) + "/**/*") do |fn| if File.ftype(fn) == 'file' open(fn, 'rb') do |f| magic = f.read(8) if magic == 'bplist00' r = system "plutil -convert xml1 '#{fn}'" if r puts "Success: #{fn}" else puts "Failed: #{fn}" end end end end end
使い方は、適当な名前たとえば conv.rb とかで保存して
$ ruby conv.rb ./
とかすると、カレントディレクトリ以下の全バイナリ plist を検出して、すべてxml形式に変換してくれます. 変換した物は Success: とか表示されます. Subversion などに commit する際に毎回実行すると幸せになれると思います.
(おまけのoneliner)
Subversion で binary mode になっているときに、そのプロパティを一括削除
$ svn st | awk '{print $2}' | xargs svn pd svn:mime-type
ruby, eventmachine | |
![]()
昨日の続きで、さらに TCPServer での Thread-loop 内と全く同じメソッドが EventMachine でも使えるように改良してみました。
使い方は、
ruby hoge.rb -e
とか -e オプションをつけると、EventMachine を使用したサーバになり、-eをつけないと TCPServer を使用したサーバになります。
ポイントは、on_accept メソッドを両者で使い回しているところです。EventMachine のほうを socket に合わせる形にしている FilberIO クラスにほとんど秘密があります(この名前が微妙だな。なにかいい名前無いかな??)
ソースは以下です。
ruby, eventmachine | |
![]()
Ruby/EventMachine という、非同期サーバがお手軽に書けるライブラリを教えてもらいました。ほかにも、Rev というのもあるようですが、今回試したのは、EventMachine のほう。Ruby/EventMachine は、現在の実装だと select(2) に落ちているようです。Rev はすでに epoll(2) 実装になっているようです。
takuma1042008/05/08 03:31EventMachineとはなにか、というところから解説を追記しました。
これまたニッチwなのを書きました。SIGMA DP1 というすばらしい絵が撮れるデジカメがあるのですが、この RAW 画像が、なかなか普通の RAW 現像ソフトとかで対応してもらえなくて結構ファイルの取り扱いに困ります。DP1 付属の RAW 現像ソフトはよく出来ているのですが、やっぱり OS のプレビュー使いたいなとかで、JPEG にしたいとかがあると思います。そんな時 RAW の中に JPEG がそのまま格納(オリジナルサイズのも!)されているのを知ったので、それを抜き出せないかと。ちょっと書いてみたらまあまあシンプルだったので貼ってみます。
DP1 の RAW フォーマットである X3F の解説は、こちらから。作者さんthanks!
きたしすばらしい!
実は同じことをやろうとして昨日半日X3FファイルをHexエディタで読んでいました。。。
既にやっておられる方がいらっしゃったとは。
jpeg以外の部分のデータ形式が早く解読(or 公開)されるといいですね。
takuma104ありがとうございます。Foveonデータの方ですが、dcraw.cではまだ対応されてないみたいですね...
http://cybercom.net/~dcoffin/dcraw/
SIGMA社のSD9/SD10/SD14には対応しているので、そのうち対応するのかな?作者の人に聞いてみようかと思います.
takuma104さきほど作者のdcoffinさんに、サンプルのRAWファイルとともに対応を聞いておきました。何かレスがあったらまたここに書き込みます。