なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

Vagrant 1.7からinsecure_private_keyが置き換えられる仕様になっていることに今更ながら気づいた

ごく日常的にvagrantを使っている分には気にならないと思いますが、vagrant 1.7から vagrant ssh する際に仕様される秘密鍵vagrant up の際に置き換えられる仕様になっています。 (1.6以前はInsecure Private Keyと呼ばれる共有の秘密鍵を使っていた)

Insecure Private Keyを使ってvagrantで立てたVMSSHをする方法を取っているとvagrantのバージョンをあげたときに突然エラーになって「おや?」ってなります。 vagrant upしてvagrant sshすると問題なくsshできるので原因に気づきづらい。

ssh -i ~/.vagrant.d/insecure_private_key vagrant_vm_ip # sshできない
vagrant ssh # sshできる

置き換える秘密鍵.vagrant/machines/default/virtualbox/private_key に置かれるので、 こちらを指定するように変更するか、Vagrantfileconfig.ssh.insert_key = falseの記述を追加すれば以前の動作と同じになります。

普段使いでは問題ないですが、自動テストなどで使っているとはまりますね。というかはまりました。

C90入稿完了したので、夏コミ本出ます。お品書きはまた後日出します。よろしくお願いします。

コミックマーケット90情報です

夏コミの時期が来ましたよ!!!

今回は3日目(日曜日)西f26aのスペースをいただきました。

シンフォニーちゃんが活躍する「ひだまりPHP」シリーズの新刊と既刊の「ひだまりPHP vol.2」を用意する予定です!

あと余裕があればWebサーバの運用周りで何か書ければいいなーと考えてますので、3日目西f26aの「ゆきいろパラソル」をよろしくお願いします!

Fluentdを使ってKibanaにデータを入れてるけど一部のログを落としていたのでリプレイしたい

Fluentdを使ってKibanaにデータを入れてるけど一部のログを落としていたのでリプレイしたいってときに、 取りこぼした時間分のログを置いて、Fluentdに読み込ませて送ればいいじゃんっていう気持ちになるけど、 ログの量が多いとクライアントが高速にログを読みすぎてFluentdのバッファーが溢れてしまう。

Fluentdの用途的におかしいので仕方ないのだけどなんとかしたいので、 通常時と同じようにログに追記していくようにする。 そのときに trottle(1) を使い、ストリームの速度を制限する。

cat foobar_log | throttle -l /tmp/throttle.ctl -M 1 > /tmp/foobar_log_replay.log

これで書き込み速度を1MByte/sに制限できる。 -l は制御用の名前付きパイプを作るオプション。 速度が早すぎたり遅すぎたりした際に調整するのに便利。

throttle -t /tmp/throttle.ctl -B 1

このようにすると、転送は1Byte/sになる。速すぎたときに使う。

流すログの量が多い場合は、バッファーのディレクトリを監視しながら 自動でlimitを調整できると便利かもしれない。

<source>
  type tail
  path /tmp/foobar_log_replay.log
  tag kibana4.foobar
  format json
  time_key time
  read_from_head true
</source>

<source>
  type tail
  path /var/fluentd/foobar/*.log
  pos_file /var/fluentd/foobar_log.pos
  tag kibana4.foobar
  format json
  time_key time
</source>

かしこ

任意のバージョンのImageMagickをビルドできるコマンドを作ってるよって話

少し前からImageMagickの最新バージョンをビルドして使いたいなーというモチベで好きな時に好きなバージョンのImageMagickをソースからビルドできるスクリプトを作っていたので紹介します。

続きを読む

issetってそんなに使うタイミングないようなという話

会社の横のお方がよくお釣りの小銭を貯金箱に貯めていて、どれくらいあるのかなと思い人のお金を数えていたら、 後ろのほうで「issetが辛い」みたいな話が聞こえてきたので、「issetって使うタイミングあんまりないような」って話をしました。

もちろん、まったく使わないみたいな過激派な話ではなくって、こういうときには使わないですね、という程度の話です。

続きを読む

ffiを使ってCの関数をRubyから呼び出す

ruby-ffi は 動的にライブラリを呼び出せるRubyの拡張でバインディングライブラリをnative extension で書かなくても良い感じに呼び出せるようになる便利なライブラリ。 Rubyでは libffi を簡単に使えるのでちょっと頑張ればCのコードを呼び出せる。

FFI = foreign function interface、他言語の関数を呼び出すためのインターフェイス

Cで書かれたライブラリの関数を native extension をビルドしなくても呼び出せて便利だったりする。

去年書いた記事でlibffiを使って、MP4v2Tagの関数を呼び出してみたけど、あんまり細かいところまで書かなかったので掘り下げて書いてみます。

t-cyrill.hatenablog.jp

とりあえずHello World

ruby-ffi はgemで用意されているので、bundlerとかで入れるといいと思う。

source "https://rubygems.org"

gem 'ffi'
bundle install --path=vendor/bundle

これでlibffiをRubyから呼び出す準備ができたので、Rubyのコードを書いていくことにする。 まずはruby-ffiのサンプルにも載っているlibcputs関数を呼び出してみる。

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の書き方は、

  1. 好きな名前でmoduleを定義して、FFI::Libraryextendする
  2. ffi_libに呼び出す関数を含むライブラリの名前を渡す。(libcFFI::Library::LIBCとして定義されている)
  3. attach_functionで関数、引数の型、戻り値を渡す
  4. 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のようにすることで、ポインタが構造体的なクラスと対応するようになる。

他にもいろいろできる

ffiWikiを見ると、Win32APIの関数を呼び出す方法とか、callback関数を渡す方法とか、enumとかあったりして他にもいろいろできるっぽい。 けど、そろそろ眠くなってきたのでこの辺で一旦終わりにしたい。 コードはgistに書いたのであとはwikiを見ながらよろしくって感じです。

gist8a8b1bc1f8b5be40d5a7