20160730 fluentd meetup in matsue slide

51
Fluentd の開発支援の話 Fluentd Windows 版の機能に関わる開発支援の裏話 Hiroshi Hatake 株式会社クリアコード Fluentd meetup in Matsue Hiroshi Hatake Fluentd の開発支援の話

Transcript of 20160730 fluentd meetup in matsue slide

Page 1: 20160730 fluentd meetup in matsue slide

Fluentdの開発支援の話FluentdのWindows版の機能に関わる開発支援の裏話

Hiroshi Hatake

株式会社クリアコード

Fluentd meetup in Matsue

Hiroshi Hatake Fluentd の開発支援の話

Page 2: 20160730 fluentd meetup in matsue slide

自己紹介

Hiroshi Hatake

Twitter: @cosmoGitHub: @cosmo0920

株式会社クリアコード

OSSサポート (開発・導入支援・時間制サポート etc.)をしています。1

1https://www.clear-code.com/services/floss/development.htmlHiroshi Hatake Fluentd の開発支援の話

Page 3: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 4: 20160730 fluentd meetup in matsue slide

Fluentdの開発支援の話

開発支援でやってきた内容

Fluentd 0.12.16の secret parameterが入った前後から開発支援をしています

メモリダンプの機能

Parser/Formatterのテストドライバ

built-inのプラグインの v0.14の APIへの移行

AppVeyorの導入のお手伝い

メンテナンスが活発でない gemを引き取ってメンテナンス

プラグインへ各種 PR etc.

Hiroshi Hatake Fluentd の開発支援の話

Page 5: 20160730 fluentd meetup in matsue slide

Fluentdの開発支援の話

開発支援でやってきた内容

Fluentd 0.12.16の secret parameterが入った前後から開発支援をしています

メモリダンプの機能

Parser/Formatterのテストドライバ

built-inのプラグインの v0.14の APIへの移行

AppVeyorの導入のお手伝い

メンテナンスが活発でない gemを引き取ってメンテナンス

プラグインへ各種 PR etc.

Hiroshi Hatake Fluentd の開発支援の話

Page 6: 20160730 fluentd meetup in matsue slide

Fluentdの開発支援の話

Fluentd v0.14の開発支援をしていく中で、

FluentdのWindows向けの機能で依存して

いるgemのメンテナンスを引き取った話

をします。

Hiroshi Hatake Fluentd の開発支援の話

Page 7: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 8: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 9: 20160730 fluentd meetup in matsue slide

FluentdのWindowsサポート

つまり、Fluentd v0.14の開発ではWindows

も考慮した開発が必要。

Hiroshi Hatake Fluentd の開発支援の話

Page 10: 20160730 fluentd meetup in matsue slide

FluentdのWindowsサポート

つまり、Fluentd v0.14の開発ではWindows

も考慮した開発が必要。

Hiroshi Hatake Fluentd の開発支援の話

Page 11: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 12: 20160730 fluentd meetup in matsue slide

Windows版で増えている依存関係

win32-service

win32-ipc

win32-eventwindows-pr

windows-apiwin32-api

Hiroshi Hatake Fluentd の開発支援の話

Page 13: 20160730 fluentd meetup in matsue slide

今回話す話す内容のgemとFluentdの関係図

Windowsサービスに関わる箇所 (winsvc)が依存しています。

Hiroshi Hatake Fluentd の開発支援の話

Page 14: 20160730 fluentd meetup in matsue slide

今回話す話す内容に関わるgemたち

windows-pr

windows-api

win32-api

Hiroshi Hatake Fluentd の開発支援の話

Page 15: 20160730 fluentd meetup in matsue slide

今回話す話す内容に関わるgemたち

windows-pr

windows-api

win32-api C拡張を含むgem

Hiroshi Hatake Fluentd の開発支援の話

Page 16: 20160730 fluentd meetup in matsue slide

C拡張とは?

C拡張で何かできるの?

Rubyには C extensionという Cにより Rubyを拡張できる機能があります。

これにより、Cのライブラリの機能を Rubyに取り込むことができます。

代表例:

Windowsの COMの機能をバインドしたWin32OLE

Groongaの Cライブラリをバインドした Rroonga

GTK+のライブラリをバインドした Ruby-GNOME2

Hiroshi Hatake Fluentd の開発支援の話

Page 17: 20160730 fluentd meetup in matsue slide

C拡張とは?

C拡張で何かできるの?

Rubyには C extensionという Cにより Rubyを拡張できる機能があります。

これにより、Cのライブラリの機能を Rubyに取り込むことができます。

代表例:

Windowsの COMの機能をバインドしたWin32OLE

Groongaの Cライブラリをバインドした Rroonga

GTK+のライブラリをバインドした Ruby-GNOME2

Hiroshi Hatake Fluentd の開発支援の話

Page 18: 20160730 fluentd meetup in matsue slide

C拡張とは?

C拡張で何かできるの?

Rubyには C extensionという Cにより Rubyを拡張できる機能があります。

これにより、Cのライブラリの機能を Rubyに取り込むことができます。

代表例:

Windowsの COMの機能をバインドしたWin32OLE

Groongaの Cライブラリをバインドした Rroonga

GTK+のライブラリをバインドした Ruby-GNOME2

Hiroshi Hatake Fluentd の開発支援の話

Page 19: 20160730 fluentd meetup in matsue slide

C拡張とは?

C拡張で何かできるの?

Rubyには C extensionという Cにより Rubyを拡張できる機能があります。

これにより、Cのライブラリの機能を Rubyに取り込むことができます。

代表例:

Windowsの COMの機能をバインドしたWin32OLE

Groongaの Cライブラリをバインドした Rroonga

GTK+のライブラリをバインドした Ruby-GNOME2

Hiroshi Hatake Fluentd の開発支援の話

Page 20: 20160730 fluentd meetup in matsue slide

C拡張とは?

C拡張で何かできるの?

Rubyには C extensionという Cにより Rubyを拡張できる機能があります。

これにより、Cのライブラリの機能を Rubyに取り込むことができます。

代表例:

Windowsの COMの機能をバインドしたWin32OLE

Groongaの Cライブラリをバインドした Rroonga

GTK+のライブラリをバインドした Ruby-GNOME2

Hiroshi Hatake Fluentd の開発支援の話

Page 21: 20160730 fluentd meetup in matsue slide

C拡張とは?

C拡張を含む gemの注意点

gemのユーザーは依存しているライブラリをシステムにインストールする必要があります

実は dllや dylib、soだけでも Rubyの C拡張から機能が呼べることができれば使う分には大丈夫です。

gemのユーザーは Cのソースをビルドするための開発環境をシステムにインストールする必要があります

Hiroshi Hatake Fluentd の開発支援の話

Page 22: 20160730 fluentd meetup in matsue slide

C拡張とは?

C拡張を含む gemの注意点

gemのユーザーは依存しているライブラリをシステムにインストールする必要があります

実は dllや dylib、soだけでも Rubyの C拡張から機能が呼べることができれば使う分には大丈夫です。

gemのユーザーは Cのソースをビルドするための開発環境をシステムにインストールする必要があります

Hiroshi Hatake Fluentd の開発支援の話

Page 23: 20160730 fluentd meetup in matsue slide

WindowsでのRubyのエコシステム– fat gemとは

fat gemとは

fat gem という gemの中に Rubyの C拡張のバイナリをパッケージングできるしくみがあります。

Fluentdでも使っている cool.io4でもこの仕組みを使用しています。

4https://github.com/tarcieri/cool.ioHiroshi Hatake Fluentd の開発支援の話

Page 24: 20160730 fluentd meetup in matsue slide

RubyのC拡張のバイナリをgemにパッケージ

ング

利点・欠点

利点

C拡張を予め入れておくことで、Windowsで Rubyを使うユーザーが C拡張をビルドしなくてもよくなります

欠点

新しい Rubyが出たらそれ用の gemをリリースしなければなりません

開発者がパッケージングする手間が増えます

クロスコンパイルするのに一手間

Hiroshi Hatake Fluentd の開発支援の話

Page 25: 20160730 fluentd meetup in matsue slide

RubyのC拡張のバイナリをgemにパッケージ

ング

それでも fat gemを提供する理由

ユーザーからすると fat gemが提供されていた方が嬉しい

Windowsユーザーはあまり開発環境を構築していない

Hiroshi Hatake Fluentd の開発支援の話

Page 26: 20160730 fluentd meetup in matsue slide

win32-api gem

win32-apiとは

元は djberg96氏 5作。

Win32APIを Rubyから呼び出せるようにする gemです。Ruby本体の APIにはないコールバックサポートがあります。

#include < windows.h > # WIN32APIのおまじない

5https://github.com/djberg96Hiroshi Hatake Fluentd の開発支援の話

Page 27: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 28: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 29: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 30: 20160730 fluentd meetup in matsue slide

win32-apiのRuby 2.3サポート

つまりどういうこと?

Hiroshi Hatake Fluentd の開発支援の話

Page 31: 20160730 fluentd meetup in matsue slide

win32-apiのRuby 2.3サポート

真意がよくわからないので聞いてみま

しょう

Hiroshi Hatake Fluentd の開発支援の話

Page 32: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 33: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 34: 20160730 fluentd meetup in matsue slide

win32-apiのRuby 2.3サポート

Hiroshi Hatake Fluentd の開発支援の話

Page 35: 20160730 fluentd meetup in matsue slide

win32-apiのRuby 2.3サポート

訳:完全に引き継いでください。

Hiroshi Hatake Fluentd の開発支援の話

Page 36: 20160730 fluentd meetup in matsue slide

win32-apiのRuby 2.3サポート

訳:完全に引き継いでください。

Hiroshi Hatake Fluentd の開発支援の話

Page 37: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 38: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 39: 20160730 fluentd meetup in matsue slide

win32-apiのRuby 2.3サポート

win32-apiプロジェクトのmasterを引き継

ぎました。

windows-api, windows-prプロジェクトのmasterも合わせて引き

継ぎました。

Hiroshi Hatake Fluentd の開発支援の話

Page 40: 20160730 fluentd meetup in matsue slide

win32-apiのRuby 2.3サポート

win32-apiプロジェクトのmasterを引き継

ぎました。

windows-api, windows-prプロジェクトのmasterも合わせて引き

継ぎました。

Hiroshi Hatake Fluentd の開発支援の話

Page 41: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 42: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 43: 20160730 fluentd meetup in matsue slide

windows-api gemのサポート

windows-api gem

AppVeyorの導入をしました。13

13https://github.com/cosmo0920/windows-api/pull/6Hiroshi Hatake Fluentd の開発支援の話

Page 44: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 45: 20160730 fluentd meetup in matsue slide

windows-pr gemのサポート

in tailがWindows上で問題を起こしていた

in tailで監視しているファイルが削除されると、undefinedmethod ‘pe =′ for# < Fluent :: TailInput ::TailWatcher :: NullIOHandler ::: 0x0000000XXXXXXXX > ”‘というエラーが起きていました。

Hiroshi Hatake Fluentd の開発支援の話

Page 46: 20160730 fluentd meetup in matsue slide

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 の開発支援の話

Page 47: 20160730 fluentd meetup in matsue slide

windows-pr gemのサポート

64bit Windows環境での不正な定数の修正を行いました。17

17https://github.com/cosmo0920/windows-pr/pull/15Hiroshi Hatake Fluentd の開発支援の話

Page 48: 20160730 fluentd meetup in matsue slide

windows-pr gemのサポート

また、合わせて AppVeyorの導入も行いました。18

18https://github.com/cosmo0920/windows-pr/pull/14Hiroshi Hatake Fluentd の開発支援の話

Page 49: 20160730 fluentd meetup in matsue slide

windows-pr gemのサポート

無事、依存先の Fluentdの in tailの問題は治ったとのことです。

Hiroshi Hatake Fluentd の開発支援の話

Page 50: 20160730 fluentd meetup in matsue slide

windows-pr gemのサポート

INVALID FILE HANLDEの64bit Windows

環境での定数の不具合を修正したバー

ジョン1.2.5をリリース済みです。19

19https://rubygems.org/gems/windows-pr/versions/1.2.5Hiroshi Hatake Fluentd の開発支援の話

Page 51: 20160730 fluentd meetup in matsue slide

まとめ

FluentdのWindows版の機能で依存している gemのメンテナンスを引き取った話をしました。

その際に、単に引き取るだけでなく、よりメンテナンスが

しやすい方向にしていく変更を入れました。

Windowsで Rubyを使う際には、C拡張やWindowsに関わるRubyや gemの問題に対応しているメンテナの存在を思い出してあげてください。

Hiroshi Hatake Fluentd の開発支援の話