mieki256's diary



2014/06/03(火) [n年前の日記]

#1 [ruby] メモリマップドファイルについて勘違いしてた

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クラス を眺めていたら、
write_to_png(stream)
write_to_png(filename)

サーフェスの内容をPNG画像として書き出します。 引数がwriteメソッドを持っている場合はそのオブジェクトの writeメソッドを使ってPNG画像を出力します。

Cairo::Surfaceクラス より

という記述に気がついて。さらにググったら、 _class StringIO が使えそうだなと。

以下で試してみたら、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

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 では問題があって。
  • rsvg2 2.2.0 は、cairo 1.12.8 以降を要求する。
  • しかし、Ruby 1.9.x で利用できるのは、cairo 1.12.4 まで。
つまり、このままだと Ruby 1.9.x で rsvg2 は使えない。

試しにバージョンを落としてインストールしてみたり。
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
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
end
Ghostscript_Tiger.svg は、 _File:Ghostscript Tiger.svg - Wikimedia Commons から入手。

結果は以下の通り。
svgdisp.png
描画できたっぽい感じ。

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 をインストール。
gem install bundler

雛形ファイルを作る。
bundle init
Gemfile というファイルが、カレントフォルダに作られた。エディタで開く。

以下のような感じに修正してみたけど…。
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"
# end
platforms :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 の中で、 てな感じの指定をしたいのだけど、方法が分からず。前述の Gemfile のコメント部分を有効にしたら、以下のようなエラーメッセージが。
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?とやらで利用することを前提にしたソフトなのかなと思えたり。何にせよ、フリーで使えるドローソフトも結構選択肢があるのだなと…。ありがたや。

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 なんてものもある。
しかしコレ、ちと問題が。終了時に必ずエラーが出る…。2008/12/07から更新されてないようだから、今後バグ修正される見込みはナサゲ。

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 日分です。

過去ログ表示

Prev - 2014/06 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project