20160730 fluentd meetup in matsue slide
TRANSCRIPT
Fluentdの開発支援の話FluentdのWindows版の機能に関わる開発支援の裏話
Hiroshi Hatake
株式会社クリアコード
Fluentd meetup in Matsue
Hiroshi Hatake Fluentd の開発支援の話
自己紹介
Hiroshi Hatake
Twitter: @cosmoGitHub: @cosmo0920
株式会社クリアコード
OSSサポート (開発・導入支援・時間制サポート etc.)をしています。1
1https://www.clear-code.com/services/floss/development.htmlHiroshi Hatake Fluentd の開発支援の話
1 はじめに
2 Fluentdの開発支援の話
3 Fluentd v0.14の新機能のおさらい
4 FluentdのWindowsサポート
5 Windowsでの Rubyのエコシステム
6 win32-api gemのサポート
7 windows-pr gemの Fluentdに関わる Issueの解決
8 まとめ
Hiroshi Hatake Fluentd の開発支援の話
Fluentdの開発支援の話
開発支援でやってきた内容
Fluentd 0.12.16の secret parameterが入った前後から開発支援をしています
メモリダンプの機能
Parser/Formatterのテストドライバ
built-inのプラグインの v0.14の APIへの移行
AppVeyorの導入のお手伝い
メンテナンスが活発でない gemを引き取ってメンテナンス
プラグインへ各種 PR etc.
Hiroshi Hatake Fluentd の開発支援の話
Fluentdの開発支援の話
開発支援でやってきた内容
Fluentd 0.12.16の secret parameterが入った前後から開発支援をしています
メモリダンプの機能
Parser/Formatterのテストドライバ
built-inのプラグインの v0.14の APIへの移行
AppVeyorの導入のお手伝い
メンテナンスが活発でない gemを引き取ってメンテナンス
プラグインへ各種 PR etc.
Hiroshi Hatake Fluentd の開発支援の話
Fluentdの開発支援の話
Fluentd v0.14の開発支援をしていく中で、
FluentdのWindows向けの機能で依存して
いるgemのメンテナンスを引き取った話
をします。
Hiroshi Hatake Fluentd の開発支援の話
Fluentd v0.14の新機能 3のおさらい
Windowsサポート
高精度な時刻サポート
新しいプラグインAPI
routerの使用の強制 2
2Engine.emitがバグ扱いになりました3http://www.fluentd.org/blog/fluentd-v0.14.0-has-been-released
Hiroshi Hatake Fluentd の開発支援の話
Fluentd v0.14の新機能 3のおさらい
Windowsサポート
高精度な時刻サポート
新しいプラグインAPI
routerの使用の強制 2
2Engine.emitがバグ扱いになりました3http://www.fluentd.org/blog/fluentd-v0.14.0-has-been-released
Hiroshi Hatake Fluentd の開発支援の話
FluentdのWindowsサポート
つまり、Fluentd v0.14の開発ではWindows
も考慮した開発が必要。
Hiroshi Hatake Fluentd の開発支援の話
FluentdのWindowsサポート
つまり、Fluentd v0.14の開発ではWindows
も考慮した開発が必要。
Hiroshi Hatake Fluentd の開発支援の話
FluentdのWindows版で増えている依存関係
(抜粋)
if /mswin|mingw/ =~ RUBY_PLATFORMgem.add_runtime_dependency("win32 -service", ["~> 0.8.3"])gem.add_runtime_dependency("win32 -ipc", ["~> 0.6.1"])gem.add_runtime_dependency("win32 -event", ["~> 0.6.1"])gem.add_runtime_dependency("windows -pr", ["~> 1.2.5"])
end
Hiroshi Hatake Fluentd の開発支援の話
Windows版で増えている依存関係
win32-service
win32-ipc
win32-eventwindows-pr
windows-apiwin32-api
Hiroshi Hatake Fluentd の開発支援の話
今回話す話す内容のgemとFluentdの関係図
Windowsサービスに関わる箇所 (winsvc)が依存しています。
Hiroshi Hatake Fluentd の開発支援の話
今回話す話す内容に関わるgemたち
windows-pr
windows-api
win32-api
Hiroshi Hatake Fluentd の開発支援の話
今回話す話す内容に関わるgemたち
windows-pr
windows-api
win32-api C拡張を含むgem
Hiroshi Hatake Fluentd の開発支援の話
C拡張とは?
C拡張で何かできるの?
Rubyには C extensionという Cにより Rubyを拡張できる機能があります。
これにより、Cのライブラリの機能を Rubyに取り込むことができます。
代表例:
Windowsの COMの機能をバインドしたWin32OLE
Groongaの Cライブラリをバインドした Rroonga
GTK+のライブラリをバインドした Ruby-GNOME2
Hiroshi Hatake Fluentd の開発支援の話
C拡張とは?
C拡張で何かできるの?
Rubyには C extensionという Cにより Rubyを拡張できる機能があります。
これにより、Cのライブラリの機能を Rubyに取り込むことができます。
代表例:
Windowsの COMの機能をバインドしたWin32OLE
Groongaの Cライブラリをバインドした Rroonga
GTK+のライブラリをバインドした Ruby-GNOME2
Hiroshi Hatake Fluentd の開発支援の話
C拡張とは?
C拡張で何かできるの?
Rubyには C extensionという Cにより Rubyを拡張できる機能があります。
これにより、Cのライブラリの機能を Rubyに取り込むことができます。
代表例:
Windowsの COMの機能をバインドしたWin32OLE
Groongaの Cライブラリをバインドした Rroonga
GTK+のライブラリをバインドした Ruby-GNOME2
Hiroshi Hatake Fluentd の開発支援の話
C拡張とは?
C拡張で何かできるの?
Rubyには C extensionという Cにより Rubyを拡張できる機能があります。
これにより、Cのライブラリの機能を Rubyに取り込むことができます。
代表例:
Windowsの COMの機能をバインドしたWin32OLE
Groongaの Cライブラリをバインドした Rroonga
GTK+のライブラリをバインドした Ruby-GNOME2
Hiroshi Hatake Fluentd の開発支援の話
C拡張とは?
C拡張で何かできるの?
Rubyには C extensionという Cにより Rubyを拡張できる機能があります。
これにより、Cのライブラリの機能を Rubyに取り込むことができます。
代表例:
Windowsの COMの機能をバインドしたWin32OLE
Groongaの Cライブラリをバインドした Rroonga
GTK+のライブラリをバインドした Ruby-GNOME2
Hiroshi Hatake Fluentd の開発支援の話
C拡張とは?
C拡張を含む gemの注意点
gemのユーザーは依存しているライブラリをシステムにインストールする必要があります
実は dllや dylib、soだけでも Rubyの C拡張から機能が呼べることができれば使う分には大丈夫です。
gemのユーザーは Cのソースをビルドするための開発環境をシステムにインストールする必要があります
Hiroshi Hatake Fluentd の開発支援の話
C拡張とは?
C拡張を含む gemの注意点
gemのユーザーは依存しているライブラリをシステムにインストールする必要があります
実は dllや dylib、soだけでも Rubyの C拡張から機能が呼べることができれば使う分には大丈夫です。
gemのユーザーは Cのソースをビルドするための開発環境をシステムにインストールする必要があります
Hiroshi Hatake Fluentd の開発支援の話
WindowsでのRubyのエコシステム– fat gemとは
fat gemとは
fat gem という gemの中に Rubyの C拡張のバイナリをパッケージングできるしくみがあります。
Fluentdでも使っている cool.io4でもこの仕組みを使用しています。
4https://github.com/tarcieri/cool.ioHiroshi Hatake Fluentd の開発支援の話
RubyのC拡張のバイナリをgemにパッケージ
ング
利点・欠点
利点
C拡張を予め入れておくことで、Windowsで Rubyを使うユーザーが C拡張をビルドしなくてもよくなります
欠点
新しい Rubyが出たらそれ用の gemをリリースしなければなりません
開発者がパッケージングする手間が増えます
クロスコンパイルするのに一手間
Hiroshi Hatake Fluentd の開発支援の話
RubyのC拡張のバイナリをgemにパッケージ
ング
それでも fat gemを提供する理由
ユーザーからすると fat gemが提供されていた方が嬉しい
Windowsユーザーはあまり開発環境を構築していない
Hiroshi Hatake Fluentd の開発支援の話
win32-api gem
win32-apiとは
元は djberg96氏 5作。
Win32APIを Rubyから呼び出せるようにする gemです。Ruby本体の APIにはないコールバックサポートがあります。
#include < windows.h > # WIN32APIのおまじない
5https://github.com/djberg96Hiroshi Hatake Fluentd の開発支援の話
win32-api gemのコード例
require ’win32/api’include Win32
EnumWindows = API.new(’EnumWindows ’, ’KP’, ’L’, ’user32 ’)GetWindowText = API.new(’GetWindowText ’, ’LPI’, ’I’, ’user32 ’)
EnumWindowsProc = API:: Callback.new(’LP’, ’I’){|handle , param|buf = "\0" * 200GetWindowText.call(handle , buf , 200);puts buf.strip unless buf.strip.empty?buf.index(param).nil? ? true : false
}
EnumWindows.call(EnumWindowsProc , ’UEDIT32 ’)
win32-apiのコメントから抜粋 6。
6https://github.com/djberg96/win32-api/blob/master/ext/win32/api.c#L157-L171
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
Ruby 2.3がサポートされていなかったので Issueを上げました
Support precompiled binaries for Ruby 2.3:https://github.com/djberg96/win32-api/issues/16
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
@djberg98 “@cosmo0920 I don’t suppose you
would be interested in taking over this
project, would you?”7
7https://github.com/djberg96/win32-api/issues/16#issuecomment-212021651
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
つまりどういうこと?
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
真意がよくわからないので聞いてみま
しょう
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
@cosmo0920(me) “What do you want to
do for me? Just building universal gem?
Or, entirely taking over this project?”
@djberg96 “@cosmo0920 Completely
taking over project.”
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
@cosmo0920(me) “What do you want to
do for me? Just building universal gem?
Or, entirely taking over this project?”
@djberg96 “@cosmo0920 Completely
taking over project.”
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
訳:完全に引き継いでください。
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
訳:完全に引き継いでください。
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
実はメンテナを探していた
= Maintainer Wanted! Since I no longer use this project, Iwould like to turn it over to someone who has the skill, timeand desire to keep it going.8
訳: メンテナ求む! このプロジェクトはもう使っていない
ので、技術があり、時間と続けていく心意気のある誰かに
譲りたい。
8https://github.com/cosmo0920/win32-api/blob/eef0b35dd095f43cac0d48824a782ecbb31a25d6/README#L118
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
実はメンテナを探していた
= Maintainer Wanted! Since I no longer use this project, Iwould like to turn it over to someone who has the skill, timeand desire to keep it going.8
訳: メンテナ求む! このプロジェクトはもう使っていない
ので、技術があり、時間と続けていく心意気のある誰かに
譲りたい。
8https://github.com/cosmo0920/win32-api/blob/eef0b35dd095f43cac0d48824a782ecbb31a25d6/README#L118
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
win32-apiプロジェクトのmasterを引き継
ぎました。
windows-api, windows-prプロジェクトのmasterも合わせて引き
継ぎました。
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
win32-apiプロジェクトのmasterを引き継
ぎました。
windows-api, windows-prプロジェクトのmasterも合わせて引き
継ぎました。
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
Ruby 2.3に対応
させる 9作業と、AppVeyor10 の導入 11の作業を行いました。
9https://github.com/cosmo0920/win32-api/pull/1810https://www.appveyor.com/11https://github.com/cosmo0920/win32-api/pull/20
Hiroshi Hatake Fluentd の開発支援の話
win32-apiのRuby 2.3サポート
1.6.0としてRuby 2.3のサポートと、Ruby
1.8.7と1.9.0のサポートを切ったバージョ
ン1.6.0をリリース済みです。12
12https://rubygems.org/gems/win32-api/versions/1.6.0-universal-mingw32
Hiroshi Hatake Fluentd の開発支援の話
windows-api gemのサポート
windows-api gem
AppVeyorの導入をしました。13
13https://github.com/cosmo0920/windows-api/pull/6Hiroshi Hatake Fluentd の開発支援の話
windows-pr gem
windows-pr gemのサポート
メンテナンスを引き継いでからすぐに Issueを解決することとなりました。14
対応する Fluentd側の Issueはhttps://github.com/fluent/fluentd/issues/920
14https://github.com/cosmo0920/windows-pr/issues/13Hiroshi Hatake Fluentd の開発支援の話
windows-pr gemのサポート
in tailがWindows上で問題を起こしていた
in tailで監視しているファイルが削除されると、undefinedmethod ‘pe =′ for# < Fluent :: TailInput ::TailWatcher :: NullIOHandler ::: 0x0000000XXXXXXXX > ”‘というエラーが起きていました。
Hiroshi Hatake Fluentd の開発支援の話
windows-pr gemのサポート
何が起きていたのか
INVALID HANDLE VALUEが 32bitと 64bitでは異なる定数として扱わなければなりません。しかし、
0xFFFFFFFFがハードコートされてしまっていました。
64bit環境では INVALID HANDLE VALUEが0xFFFFFFFFFFFFFFFFとなるように修正しました。15
16
15https://github.com/cosmo0920/windows-pr/pull/1516ただし、この修正は CRubyに対しては有効で、JRubyに対してはバ
グを含んでいます。Hiroshi Hatake Fluentd の開発支援の話
windows-pr gemのサポート
64bit Windows環境での不正な定数の修正を行いました。17
17https://github.com/cosmo0920/windows-pr/pull/15Hiroshi Hatake Fluentd の開発支援の話
windows-pr gemのサポート
また、合わせて AppVeyorの導入も行いました。18
18https://github.com/cosmo0920/windows-pr/pull/14Hiroshi Hatake Fluentd の開発支援の話
windows-pr gemのサポート
無事、依存先の Fluentdの in tailの問題は治ったとのことです。
Hiroshi Hatake Fluentd の開発支援の話
windows-pr gemのサポート
INVALID FILE HANLDEの64bit Windows
環境での定数の不具合を修正したバー
ジョン1.2.5をリリース済みです。19
19https://rubygems.org/gems/windows-pr/versions/1.2.5Hiroshi Hatake Fluentd の開発支援の話
まとめ
FluentdのWindows版の機能で依存している gemのメンテナンスを引き取った話をしました。
その際に、単に引き取るだけでなく、よりメンテナンスが
しやすい方向にしていく変更を入れました。
Windowsで Rubyを使う際には、C拡張やWindowsに関わるRubyや gemの問題に対応しているメンテナの存在を思い出してあげてください。
Hiroshi Hatake Fluentd の開発支援の話