issetってそんなに使うタイミングないようなという話
会社の横のお方がよくお釣りの小銭を貯金箱に貯めていて、どれくらいあるのかなと思い人のお金を数えていたら、 後ろのほうで「issetが辛い」みたいな話が聞こえてきたので、「issetって使うタイミングあんまりないような」って話をしました。
もちろん、まったく使わないみたいな過激派な話ではなくって、こういうときには使わないですね、という程度の話です。
続きを読むffiを使ってCの関数をRubyから呼び出す
ruby-ffi は 動的にライブラリを呼び出せるRubyの拡張でバインディングライブラリをnative extension で書かなくても良い感じに呼び出せるようになる便利なライブラリ。 Rubyでは libffi を簡単に使えるのでちょっと頑張ればCのコードを呼び出せる。
FFI = foreign function interface、他言語の関数を呼び出すためのインターフェイス
Cで書かれたライブラリの関数を native extension をビルドしなくても呼び出せて便利だったりする。
去年書いた記事でlibffiを使って、MP4v2Tagの関数を呼び出してみたけど、あんまり細かいところまで書かなかったので掘り下げて書いてみます。
とりあえずHello World
ruby-ffi はgemで用意されているので、bundlerとかで入れるといいと思う。
source "https://rubygems.org" gem 'ffi'
bundle install --path=vendor/bundle
これでlibffiをRubyから呼び出す準備ができたので、Rubyのコードを書いていくことにする。
まずはruby-ffiのサンプルにも載っているlibc
のputs
関数を呼び出してみる。
require 'ffi' module LibC # <- 1 extend FFI::Library # <- 1 ffi_lib FFI::Library::LIBC # <- 2 attach_function :puts, [ :string ], :int # <- 3 end LibC::puts 'Hello World!!' # <- 4
いつもどおりbundle exec ruby libc/hello_world.rb
のように呼び出せばHello World!!
が表示されるのが確認できる。
ffiの書き方は、
- 好きな名前で
module
を定義して、FFI::Library
をextend
する ffi_lib
に呼び出す関数を含むライブラリの名前を渡す。(libc
はFFI::Library::LIBC
として定義されている)attach_function
で関数、引数の型、戻り値を渡すLibC::puts
のように呼び出す
といった形になります。
もう少し複雑な例
require 'ffi' module LibC extend FFI::Library ffi_lib FFI::Library::LIBC typedef :pointer, :FILE attach_function :fopen, [:string, :string], :FILE attach_function :fclose, [:FILE], :int attach_function :fputs, [:string, :FILE], :int end handle = LibC::fopen '/tmp/hogehoge', 'w' LibC::fputs 'hogehoge', handle LibC::fclose handle
上はファイルを書き出す例。fopen
, fclose
, fputs
を呼び出す。FILEはtypedef
で用意するとよい。
LibC::fopen
から返ってきたポインタを LibC::fputs
に渡しファイルに書き出し、LibC::close
でハンドルを閉じるっていうCのサンプルみたいなことをやっている。
こんな風に、ポインタを使い回すだけなら :pointer
を使って簡単にかける。
構造体のポインタ
MP4v2のバインディングで書いた構造体はこんな感じになっていて、FFI::Struct
を継承してlayout
を使って構造体っぽいクラスを作っていく。
# Mp4v2 binding module module Mp4v2 module Native # Mp4v2 Tag struct class MP4Tags < FFI::Struct layout :__handle, :pointer, :name, :string, :artist, :string, :album_artist, :string, :album, :string, :grouping, :string, :composer, :string, :comments, :string, :genre, :string def self.keys [ :name, :artist, :album_artist, :album, :grouping, :composer, :comments, :genre ] end end end end
構造体ではなくクラスなので、好きなように関数を追加してもよかったりして便利っぽい。typedef :pointer, :MP4Tags
のようにすることで、ポインタが構造体的なクラスと対応するようになる。
他にもいろいろできる
ffiのWikiを見ると、Win32APIの関数を呼び出す方法とか、callback関数を渡す方法とか、enumとかあったりして他にもいろいろできるっぽい。 けど、そろそろ眠くなってきたのでこの辺で一旦終わりにしたい。 コードはgistに書いたのであとはwikiを見ながらよろしくって感じです。
新年だしお雑煮食べながらkibana4をインストールする
— シリル@C89お疲れ様でした (@d_cyrill1129) 2016, 1月 16
Kibana4.3になってelasticsearch2.1互換になったので試しにインストールしてみようと思ったのですが、新年なのでお雑煮でも作りながら触ってみました。
いつものようにDebianでのセットアップですが、応用すれば他の環境でも動かせると思います。
続きを読むFreeDOSのイメージをPXEでブートする
2015年でもDOSを起動しなければならないことがあって、BIOSのアップデートとかBIOSのアップデートとかBIOSのアップデートなんだけど、2015年なのでフロッピードライブとか用意するのは簡単ではないし、何よりアップデート対象のマシンがデータセンターに置かれていたりすると、フロッピーをさすためだけにデータセンターに入館するのは正直しんどい。これはフロッピーがUSBフラッシュメモリーになっていたとしても同じだと思う。辛い。
そこでネットワークブートできないかなと色々試してみたらこれは行けそうみたいな方法を自分なりに確立したのでメモを残しておこうと思います。
技術的な話題が久しぶりな感じですが少々お付き合いください。
続きを読むC89 抽選漏れしました / 凛ちゃんハピば
C89、今年もサークル参加できれば引き続きひだまりPHPの新作とサーバ運用系のペラ本を作ろうと思っていたのですが、今回は残念ながら抽選漏れとなってしまいました。残念。
同人ソフトで申し込みを行ったのですが、同人ソフト枠は激戦区なんですねー・・・。
夏まで9ヶ月ほどあるので、本来冬に書こうと思っていたネタはこのブログで適当に消化したり、商業のWeb+DB PRESSのほうに書いていこうとおもいます。
続きを読む