2014/06/03(火) [n年前の日記]
#1 [ruby] メモリマップドファイルについて勘違いしてた
mmap って、メモリ上にファイルを作るという話じゃなくて、ファイルをメモリのように扱う、という仕組みだったのですね…。自分がやりたかったことと真逆じゃないか…。トホホ。
それはともかく、とりあえず _win32-mmap の _サンプル をコピペして実験。
コレ、どんな場面で使うんだろう…。
それはともかく、とりあえず _win32-mmap の _サンプル をコピペして実験。
# win32-mmap のテスト # ファイルをメモリのように扱う require 'win32/mmap' tmpfile = File.join(File.expand_path(File.dirname(__FILE__)), "test.map") map1 = Win32::MMap.new(:file => tmpfile, :size => 1024) map1.foo = 'hello' map1.bar = 77 map1.close map2 = Win32::MMap.new(:file => tmpfile) p map2.foo # 'hello' p map2.bar # 77 map2.closeたしかに、test.map が作られた。
コレ、どんな場面で使うんだろう…。
[ ツッコむ ]
#2 [dxruby] cairoの出力結果をファイルを作らずにDXRubyに渡せた
_Cairo::Surfaceクラス
を眺めていたら、
以下で試してみたら、DXRuby で表示できました。ヤッター。
_test_cairo1_stringio.rb
もしかすると、ファイル書き込みした直後はキャッシュ?が効いてて、読み込み処理もさほど遅くなかったとか? 実際はどうだか分からんですけど。
write_to_png(stream)という記述に気がついて。さらにググったら、 _class StringIO が使えそうだなと。
write_to_png(filename)
サーフェスの内容をPNG画像として書き出します。 引数がwriteメソッドを持っている場合はそのオブジェクトの writeメソッドを使ってPNG画像を出力します。
以下で試してみたら、DXRuby で表示できました。ヤッター。
_test_cairo1_stringio.rb
# cairo のテスト。 # StringIO で DXRuby の Image にデータを渡してみる版 require 'cairo' require 'dxruby' require 'stringio' w, h = 640 - 32, 480 - 32 surface = Cairo::ImageSurface.new(w, h) context = Cairo::Context.new(surface) # 円を書く context.set_line_width(12) context.set_source_color(Cairo::Color::GREEN) r = h / 3 x, y, rw, rh = 100, 30, 50, 50 context.arc(w/2, h/2, r, 0, 2 * Math::PI) context.fill_preserve context.set_source_color(Cairo::Color::RED) context.stroke # StringIOを使って png出力、かつ、Image生成 temp = StringIO.new("", 'w+') surface.write_to_png(temp) temp.rewind img = Image.loadFromFileInMemory(temp.read) # DXRubyで表示 Window.bgcolor = [64, 64, 64] Window.loop do break if Input.keyPush?(K_ESCAPE) Window.draw(16, 16, img) endしかし、昨日の虎描画版で、同じ処理を試してみても、処理が速くなった感じはしなくて。
もしかすると、ファイル書き込みした直後はキャッシュ?が効いてて、読み込み処理もさほど遅くなかったとか? 実際はどうだか分からんですけど。
[ ツッコむ ]
#3 [ruby][dxruby] DXRuby と cairo と rsvg2 で svgを描画して表示してみたり
_Rubyist Magazine - cairo: 2 次元画像描画ライブラリ
によると、rsvg2 ライブラリを使えば svgファイルを cairo で描画できるらしくて。
であれば、DXRuby上でも、cairo と rsvg2 を使って svgファイルを描画できるのかなと。早速実験。
しかし、Windows + Ruby 1.9.x で、rsvg2 を使おうとしたら、ハマってしまったり。以下のライブラリが必要なのだけど…。
_rsvg2 | RubyGems.org | your community gem host
_gdk_pixbuf2 | RubyGems.org | your community gem host
_glib2 | RubyGems.org | your community gem host
であれば、DXRuby上でも、cairo と rsvg2 を使って svgファイルを描画できるのかなと。早速実験。
しかし、Windows + Ruby 1.9.x で、rsvg2 を使おうとしたら、ハマってしまったり。以下のライブラリが必要なのだけど…。
_rsvg2 | RubyGems.org | your community gem host
_gdk_pixbuf2 | RubyGems.org | your community gem host
_glib2 | RubyGems.org | your community gem host
◎ Ruby 2.x の場合。 :
Ruby 2.x は、以下の通りで、すんなりインストールできた。
gem install cairo --platform=x86-mingw32 gem install glib2 gem install gdk_pixbuf2 gem install rsvg2
> gem list | grep "cairo\|glib2\|gdk_pixbuf2\|rsvg2" cairo (1.12.9 x86-mingw32) gdk_pixbuf2 (2.2.0 x86-mingw32) glib2 (2.2.0 x86-mingw32) rsvg2 (2.2.0 x86-mingw32)
◎ Ruby 1.9.x の場合。 :
Ruby 1.9.x では問題があって。
試しにバージョンを落としてインストールしてみたり。
ダメ元で、最新版だけをアンインストールしてみる。
以下のような状態になった。
この状態にすれば、Ruby 1.9.x でも、rsvg2 が一応使えた、ように見えた。
ただ、最新版じゃないから、何かバグがあったりするのかもしれないけど…。そもそも、こんなインストール作業、許されるのかな…。初心者なので分かりません。
- rsvg2 2.2.0 は、cairo 1.12.8 以降を要求する。
- しかし、Ruby 1.9.x で利用できるのは、cairo 1.12.4 まで。
試しにバージョンを落としてインストールしてみたり。
gem install cairo --version '=1.12.4' gem install glib2 --version '=1.2.6' gem install gdk_pixbuf2 --version '=1.2.6' gem install rsvg2 --version '=1.2.6'すると、途中で、glib2 と cairo の最新版を勝手にインストールされてしまった。
ダメ元で、最新版だけをアンインストールしてみる。
> gem uninstall glib2 Select gem to uninstall: 1. glib2-1.2.6-x86-mingw32 2. glib2-2.2.0-x86-mingw32 3. All versions > 2 Successfully uninstalled glib2-2.2.0-x86-mingw32 > gem uninstall cairo Select gem to uninstall: 1. cairo-1.12.4-x86-mingw32 2. cairo-1.12.9-x86-mingw32 3. All versions > 2 Successfully uninstalled cairo-1.12.9-x86-mingw32
以下のような状態になった。
> gem list | grep "cairo\|glib2\|gdk_pixbuf2\|rsvg2" cairo (1.12.4 x86-mingw32) gdk_pixbuf2 (1.2.6 x86-mingw32) glib2 (1.2.6 x86-mingw32) rsvg2 (1.2.6 x86-mingw32)
この状態にすれば、Ruby 1.9.x でも、rsvg2 が一応使えた、ように見えた。
ただ、最新版じゃないから、何かバグがあったりするのかもしれないけど…。そもそも、こんなインストール作業、許されるのかな…。初心者なので分かりません。
◎ 実験に使ったソース。 :
以下のようなソースを書いた。
_svgdisp_width_dxruby.rb
結果は以下の通り。 描画できたっぽい感じ。
Ruby 1.9.x を使ってる場合は、ライブラリのインストールが面倒臭いという問題はあるものの。一応、DXRuby でも、この程度の記述で、svgファイルを描画できました。cairo と rsvg2、ありがたいなあ。
でもまあ、DXRuby でベクターデータを描画するメリットって、思いつかないのですけど。あらかじめビットマップ画像にしておいて、ソレを使うほうがいいよな…。
cairo の描画結果を、DXRuby を使うことで即座に表示・確認できる、といった使い方なら、これもアリなのかな…。
_svgdisp_width_dxruby.rb
require 'rsvg2' require 'stringio' require 'dxruby' # SVGをrsvg2とcairoで描画してDXRubyのImageにする # class Svg2Image attr_accessor :handle attr_accessor :width attr_accessor :height attr_accessor :ratio attr_accessor :image def initialize(infile, ratio = 1.0) self.handle = RSVG::Handle.new_from_file(infile) make_image(ratio) end def make_image(ratio = 1.0) self.ratio = ratio.to_f self.width, self.height, = self.handle.dimensions.to_a self.width *= ratio self.height *= ratio Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, self.width, self.height) do |surface| context = Cairo::Context.new(surface) context.scale(self.ratio, self.ratio) context.render_rsvg_handle(self.handle) temp = StringIO.new("", "w+") surface.write_to_png(temp) temp.rewind self.image.dispose if self.image self.image = Image.loadFromFileInMemory(temp.read) temp.close end end end if $0 == __FILE__ # ---------------------------------------- # 動作テスト infile = "Ghostscript_Tiger.svg" scale = 0.5 scale_add = 0.1 svg = Svg2Image.new(infile, 0.5) font = Font.new(14) Window.bgcolor = [64, 64, 64] Window.loop do break if Input.keyPush?(K_ESCAPE) # Rキーで拡大縮小再描画 if Input.keyDown?(K_R) svg.make_image(scale) scale_add *= -1 if scale <= 0.25 or scale >= 1.5 scale += scale_add end Window.draw(0, 0, svg.image) s = "#{Window.real_fps.to_i} FPS #{Window.getLoad.to_i} %" s += " #{svg.image.width} x #{svg.image.height}" Window.drawFont(4, 4, s, font) end endGhostscript_Tiger.svg は、 _File:Ghostscript Tiger.svg - Wikimedia Commons から入手。
結果は以下の通り。 描画できたっぽい感じ。
Ruby 1.9.x を使ってる場合は、ライブラリのインストールが面倒臭いという問題はあるものの。一応、DXRuby でも、この程度の記述で、svgファイルを描画できました。cairo と rsvg2、ありがたいなあ。
でもまあ、DXRuby でベクターデータを描画するメリットって、思いつかないのですけど。あらかじめビットマップ画像にしておいて、ソレを使うほうがいいよな…。
cairo の描画結果を、DXRuby を使うことで即座に表示・確認できる、といった使い方なら、これもアリなのかな…。
[ ツッコむ ]
#4 [ruby] bundlerについて勉強
Ruby のライブラリをインストールする際、RubyGems なる仕組みが ―― gem というコマンドが使えるわけですけど。Ruby 1.9.3 上で、cairo、glib2、gdk_pixbuf2、rsvg2 のバージョンを決め打ちしてインストールする作業が面倒臭かったので、bundler なる仕組みを使えないものかなと思って調べ始めたり。
とりあえず、bundler をインストール。
雛形ファイルを作る。
以下のような感じに修正してみたけど…。
あらかじめ、cairo、glib2、gdk_pixbuf2、rsvg2 を、gem uninstall xxxx でアンインストールしておいた上で、以下を実行。
ただ、この指定だと、Rubyのシステム部分?に、ライブラリをインストールしてしまう。今回はシステムにインストールしたかったので、コレでいいのだろうけど。フツーはプロジェクト単位で、どのライブラリを使うのか、分けて管理するらしくて。一般的には、プロジェクトフォルダ/vendor/bundle 以下にインストールする。らしい。たぶん。
それはともかく。一つの Gemfile の中で、
こんな感じではどうかしら。
とりあえず、bundler をインストール。
gem install bundler
雛形ファイルを作る。
bundle initGemfile というファイルが、カレントフォルダに作られた。エディタで開く。
以下のような感じに修正してみたけど…。
source "https://rubygems.org" platforms :mingw_19 do gem "cairo", "1.12.4" gem "glib2", "1.2.6" gem "gdk_pixbuf2", "1.2.6" gem "rsvg2", "1.2.6" end # platforms :mingw_20 do # gem "cairo" # gem "glib2" # gem "gdk_pixbuf2" # gem "rsvg2" # endplatforms :mingw_19 do 〜 end で、「Ruby 1.9 mingw32版なら、このライブラリをインストールせよ」と指定をしている、らしい。よく分かってないですが。ちなみに、 _Gemfile(5) - A format for describing gem dependencies for Ruby programs の、PLATFORMS (:platforms) のところに、記述できる種類の一覧があるようで。
あらかじめ、cairo、glib2、gdk_pixbuf2、rsvg2 を、gem uninstall xxxx でアンインストールしておいた上で、以下を実行。
bundle installこれで、バージョン決め打ちでインストール出来たように見えた。
ただ、この指定だと、Rubyのシステム部分?に、ライブラリをインストールしてしまう。今回はシステムにインストールしたかったので、コレでいいのだろうけど。フツーはプロジェクト単位で、どのライブラリを使うのか、分けて管理するらしくて。一般的には、プロジェクトフォルダ/vendor/bundle 以下にインストールする。らしい。たぶん。
bundle install --path vendor/bundleしかし、このままだと、スクリプト内で require 'hoge' とかしても「ライブラリがねえよ」と言われてしまう。…どうすれば使えるようになるのかは、まだ調べてないです。
それはともかく。一つの Gemfile の中で、
- 「Ruby 1.9 mingw32版なら、このバージョンのライブラリをインストールせよ」
- 「Ruby 2.0 mingw32版なら、最新版のライブラリをインストールせよ」
You cannot specify the same gem twice with different version requirements. You specified: cairo (= 1.12.4) and cairo (>= 0)さて、どう書けばいいんだろう…。
こんな感じではどうかしら。
source "https://rubygems.org" platforms :mingw do if RUBY_VERSION =~ /^1.9/ gem "cairo", "1.12.4" gem "glib2", "1.2.6" gem "gdk_pixbuf2", "1.2.6" gem "rsvg2", "1.2.6" else gem "cairo" gem "glib2" gem "gdk_pixbuf2" gem "rsvg2" end endコレで合ってるのかな…? よくわからん…。
[ ツッコむ ]
#5 [cg_tools] Ipx、TpX、LaTeXDrawを試用
_描画・グラフツール - TeX Wiki
で、Windows上で使えるフリーのドローソフトがいくつか紹介されてたので、少し試用。
どれもTex?とやらで利用することを前提にしたソフトなのかなと思えたり。何にせよ、フリーで使えるドローソフトも結構選択肢があるのだなと…。ありがたや。
どれもTex?とやらで利用することを前提にしたソフトなのかなと思えたり。何にせよ、フリーで使えるドローソフトも結構選択肢があるのだなと…。ありがたや。
◎ Ipeを試用。 :
_Ipe extensible drawing editor | Free Graphics software downloads at SourceForge.net
から、ipe-7.1.5-win.zip をDLして解凍。bin/ipe.exe を実行。
- UIの見た目は若干カラフル。
- 中ボタンドラッグでキャンバス?の移動。
- 左側の菱形っぽいマークをクリックしていくことで、線のみ → 線と塗り → 塗りのみ → 線のみ、と切り替えられる。
- 線や多角形は、左クリックで点を打つ。右クリックで決定?
- Ctrl+Eでパス編集。パス編集決定はSpaceキー。
- xml(おそらくIpeの保存形式)の他、pdf、eps で保存できる。
◎ TpXを試用。 :
_TpX: drawing tool for TeX | Free Graphics software downloads at SourceForge.net
から、TpX_ExecDistribution1_5.zip をDLして解凍。TpX.exe を実行。
- ちょっとストイックなUIの見た目。
- 図形の塗りは、上のツールバーのバケツみたいなところで指定。
- 図形を一つ置くたびにモードがリセットされる。(選択ツールに戻ってしまう)
- グリッドを前面に表示するオプション有。View → Grid on Top
- eps, pdf, emf, svg, png, bmp等、保存できる種類が多い。latex-dvips なんてものもある。
◎ LaTeXDrawを試用。 :
_LaTeXDraw | Free Development software downloads at SourceForge.net
から、LaTeXDraw-3.1.0-bin.zip をDLして解凍。Windows7 の場合は、install_vista_seven.vbs を実行することでインストールができる。LaTeXDraw.jar を実行。
- Java製アプリ。
- 見た目は若干カラフル。
- 下のツールバー上の各ボタンを選ぶことで、塗り色の変更等ができる模様。
- svg が保存形式。その他、eps, pdf, jpeg, bmp, png等で書き出しもできるらしい。
[ ツッコむ ]
以上、1 日分です。