PANTOMAIMUの技術ブログ

お絵描きから技術ネタ、音楽ネタなどなど、趣味メインのブログです。

時々観るMAD ムービー

これは時々、色々思うことがあるときに観ることのあるMAD

佐天人応援歌 - YouTube

このMAD、音楽との組み合わせが....
この曲(PLANETES)は、一時期のデスマの時に聴きまくって、支えになっていたなぁ....

はやぶさ+PLANETES - YouTube

MADじゃないけど、「Ligaya」は、プログラムを書いたり、メンタル的に参っているときに、ヘビロテする定番の曲だったりします :-) inside of me....

Ligaya - YouTube

Fluentdプラグインを作ってみたよ(Fluentdを使ってみよう編)

前に書いたブログCentOSでFluentdしてみよう(インストール編)の続きです :-)

実はGW中に、JavaVMの稼働状態(CPU使用率とかメモリ使用量、GC情報など)を取得する、fluent-plugin-jvmwatcherというinput pluginを作っていました(/ω・\)チラッ
すでにRubyGemに登録していて、gemコマンドでインストールできるようになっています。

プラグインのつくり方は、2012年のSD 6月号や、fluentdのためのプラグインをイチから書く手順(bundler版)を参考にさせてもらいました :-)

プラグインのソースコードは、GitHubで公開しているので、気が向いたら読んでみてください。まだコメントが少ないので、読みにくいとは思いますが....orz

GitHub MasayukiMiyake97 / fluent-plugin-jvmwatcher

ちなみに、rubyで実装するFluentdのプラグインからJavaVMの状態を取得することはできないので、プラグインの内部ではJavaVMの状態を取得するJavaアプリケーションを起動して、そのアプリから標準出力を通して値を取得する仕組みになっています。
※fluentプラグインからJavaアプリケーションを起動させるのに、いくつか工夫が必要だったのですが、その工夫については、次のブログで書いてみようと思っています ヽ( ・∀・)ノ  まぁ、ソースコードシェルスクリプトを読めば、だいたいわかる程度の内容ですけどねw

元々は、Fluentdプラグインから、jpsコマンドとjstatコマンドを呼び出して実現しようと考えていたのですが、1秒間隔で複数のJVMの状態を収集する場合、コマンド実行のオーバーヘッドが大きくなって、性能が出なくて負荷の高いプラグインになりそうだったので、Jconsoleのコードを参考にして、一つのプロセスから、複数のJVMの状態をJSONフォーマットで標準出力に出力し続けるJavaアプリケーションを開発しましたwww

そのJavaプログラムも、GitHubに公開しています。

GitHub MasayukiMiyake97 / JVMWatcher

このプラグイン、ほとんどJavaで出来ている感じです....orz

まず、fluent-plugin-jvmwatcherのインストールと、fluentd側の設定から入ります。(前のブログで、すでにFluentdがインストールされているのが前提で進めます)

【補足1】このプラグインは、まだCentOS6.*でしか動作確認ができていません(;´Д`) Ubuntuでも多分動作するとは思いますが....orz
【補足2】あと、OpenJDK1.6以上で動作確認を行っています。また、tools.jarを利用しているので、JDKがインストールされている必要があります。
【補足3】Windowsでは動作しません....

プラグインインストールとfluentdの定義

まずはプラグインのインストール :-)
すでにgemパッケージとして公開しているので

>gem install fluent-plugin-jvmwatcher

で、インストールが完了します。

fluentdの定義

次はfluentdの定義です。
今回は、fluent-plugin-jvmwatcherが収集したJVMの稼働状態ログを、fluentd標準のfile出力プラグインを使って、1つのサーバに収集する構成の定義にします。
f:id:PANTOMAIMU:20130518125430j:plain
host1、host2、host3、のホームディレクトリに、fluentというディレクトリを作成して、その下にfluentdの定義ファイルを作成します。

>cd ~
>mkdir fluentd
>cd fluentd
>vi jvmwatcher.conf

※ディレクトリ名は、fluentdである必要はありません。例としてfluentdとしています。

host1のfluent-plugin-jvmwatcherの定義

ファイル名=jvmwatcher.conf

<source>
  type jvmwatcher
  log_interval 1000
  log_buff_num 1
  jvm_refind_interval 10000
  tag jvmwatcher.host1
</source>

<match jvmwatcher.**>
  type tcp
  host 192.168.56.22
</match>

typeのjvmwatcherが、fluent-plugin-jvmwatcherを指定しています。
log_intervalは、JavaVMに状態を収取してログを生成する間隔(msec)、log_buff_numは、ここで指定した数のログが溜まったら、matchに配信します。
jvm_refind_intervalは、監視対象のJavaVMを再検索する間隔(msec)になります。
tagには、出力するログを識別するためのキーワードを記述します。ログは、matchに定義されたキーワードとマッチした、match定義のところに配信されます。
"jvmwatcher.**"の**はワイルドカードなので、jvmwatcher.host1でもjvmwatcher.host2でもマッチすることになります。

次のhost2の定義も同様。

host2のfluent-plugin-jvmwatcherの定義

ファイル名=jvmwatcher.conf

<source>
  type jvmwatcher
  log_interval 1000
  log_buff_num 1
  jvm_refind_interval 10000
  tag jvmwatcher.host2
</source>

<match jvmwatcher.**>
  type tcp
  host 192.168.56.22
</match>
host3のfileの定義

ファイル名=log_server.conf

<source>
  type tcp
</source>

<match jvmwatcher.**>
  type file
  path /home/****/temp/jvm_log
</match>

収集されたログは、pathで指定したファイルに保存されます。
****は、各自の環境のホームディレクトリの名称にしてください。

fluentdの実行

fluentdを実行する前に、fluent-plugin-jvmwatcherで計測する対象となるJavaアプリケーションを、host1とhost2で複数起動しておきましょう。
もし適当な計測対象のJavaアプリがない場合は、今回プラグインを開発する際に使用した、計測対象サンプルプログラムを使ってみてください。
これも、GitHub上に置いてあるので、取得して使てください。

GitHub MasayukiMiyake97 / WatchTestJavaProcess

JavaTestProc.shファイルには、chmodコマンドで、実行権限をつけておいてください。

使い方は

> ./JavaTestProc.sh 2048 1024 5 20

になります。引数の意味は、
2048(byte)のデータを、最大1024要素まで、5(msec)間隔で増やしていくスレッドを20スレッド起動させる、となります。
最大要素数1024を超えた場合は、アロケーションしたデータをすべて解放(参照を切ってGC対象にする)します。

それでは、これからfluentdを実行させます。

JavaVM計測のfluentdの起動(host1,hosut2)

host1のでfluentdの起動

$ fluentd -c jvmwatcher.conf
2013-05-18 12:13:47 +0900 [info]: starting fluentd-0.10.33
2013-05-18 12:13:47 +0900 [info]: reading config file path="jvmwatcher.conf"
2013-05-18 12:13:47 +0900 [info]: using configuration file: <ROOT>
  <source>
    type jvmwatcher
    log_interval 1000
    log_buff_num 1
    jvm_refind_interval 10000
    tag jvmwatcher.host1
  </source>
  <match jvmwatcher.**>
    type tcp
    host 192.168.56.22
  </match>
</ROOT>
2013-05-18 12:13:47 +0900 [info]: adding source type="jvmwatcher"
2013-05-18 12:13:47 +0900 [info]: adding match pattern="jvmwatcher.**" type="tcp"
2013-05-18 12:13:47 +0900 [warn]: 'tcp' output is obsoleted and will be removed. Use 'forward' instead.
2013-05-18 12:13:47 +0900 [warn]: see 'forward' section in http://fluentd.org/doc/plugin.html for the high-availability configuration.


host2のでfluentdの起動

$ fluentd -c jvmwatcher.conf
2013-05-18 12:14:00 +0900: starting fluentd-0.10.31
2013-05-18 12:14:00 +0900: reading config file path="jvmwatcher.conf"
2013-05-18 12:14:00 +0900: using configuration file: <ROOT>
  <source>
    type jvmwatcher
    log_interval 1000
    log_buff_num 1
    jvm_refind_interval 10000
    tag jvmwatcher.host2
  </source>
  <match jvmwatcher.**>
    type tcp
    host 192.168.56.22
  </match>
</ROOT>
2013-05-18 12:14:00 +0900: adding source type="jvmwatcher"
2013-05-18 12:14:00 +0900: adding match pattern="jvmwatcher.**" type="tcp"
2013-05-18 12:14:00 +0900: 'tcp' output is obsoleted and will be removed. Use 'forward' instead.
2013-05-18 12:14:00 +0900: see 'forward' section in http://fluentd.org/doc/plugin.html for the high-availability configuration.
ログをファイルに保存する側のfluentdの起動(host3)

host3のでfluentdの起動

$ fluentd -c log_server.conf
2013-05-18 12:11:59 +0900: starting fluentd-0.10.31
2013-05-18 12:11:59 +0900: reading config file path="log_server.conf"
2013-05-18 12:11:59 +0900: using configuration file: <ROOT>
  <source>
    type tcp
  </source>
  <match jvmwatcher.**>
    type file
    path /home/****/temp/jvm_log
  </match>
</ROOT>
2013-05-18 12:11:59 +0900: adding source type="tcp"
2013-05-18 12:11:59 +0900: 'tcp' input is obsoleted and will be removed soon. Use 'forward' instead.
2013-05-18 12:11:59 +0900: adding match pattern="jvmwatcher.**" type="file"
2013-05-18 12:11:59 +0900: listening fluent socket on 0.0.0.0:24224


ログを保存する側のfluentdを起動してから30秒ぐらいすると、

/home/****/temp/の下に

$ ll
合計 900
-rw-rw-r--. 1 **** **** 918830  5月 18 12:18 2013 jvm_log.20130518.b4dcf58070cbf3a88

という名前で、ログが出力されます。
このファイルをtailしてみると、host、host2から送られてきた、JavaVMの稼働状態がJSON形式のログとして出力されます。

2013-05-18T12:17:51+09:00       jvmwatcher.host1        {"logtime":1368847071076,"host_name":"nanoha","proc_state":"LIVE_PROCESS","pid":3970,"name":"jvmwatcher.test.TestJavaProcess 4096 4096 10 20","display_name":"jvmwatcher.test.TestJavaProcess 4096 4096 10 20","start_time":1368846529293,"up_time":541794,"cpu_usage":11.581067,"compile_time":1799,"c_load_cnt":1206,"c_unload_cnt":0,"c_total_load_cnt":1206,"th_cnt":29,"daemon_th_cnt":8,"peak_th_cnt":29,"heap_init":62766272,"heap_used":162470152,"heap_commit":295960576,"heap_max":892928000,"notheap_init":24313856,"notheap_used":10453536,"notheap_commit":24313856,"notheap_max":224395264,"pending_fin_cnt":0,"total_phy_mem_size":4017041408,"total_swap_mem_size":4160741376,"free_phy_mem_size":2737188864,"free_swap_mem_size":4160741376,"commit_vmem_size":2437750784,"gc_collect":[{"gc_mgr_name":"PS MarkSweep","gc_coll_cnt":41,"gc_coll_time":1527},{"gc_mgr_name":"PS Scavenge","gc_coll_cnt":98,"gc_coll_time":3671}]}
2013-05-18T12:17:51+09:00       jvmwatcher.host1        {"logtime":1368847071378,"host_name":"nanoha","proc_state":"LIVE_PROCESS","pid":4075,"name":"org.apache.catalina.startup.Bootstrap start","display_name":"org.apache.catalina.startup.Bootstrap start","start_time":1368846566558,"up_time":504832,"cpu_usage":1.5,"compile_time":2941,"c_load_cnt":2187,"c_unload_cnt":0,"c_total_load_cnt":2187,"th_cnt":15,"daemon_th_cnt":14,"peak_th_cnt":15,"heap_init":62766272,"heap_used":10574480,"heap_commit":59113472,"heap_max":892928000,"notheap_init":24313856,"notheap_used":19421608,"notheap_commit":25362432,"notheap_max":224395264,"pending_fin_cnt":0,"total_phy_mem_size":4017041408,"total_swap_mem_size":4160741376,"free_phy_mem_size":2737188864,"free_swap_mem_size":4160741376,"commit_vmem_size":2432827392,"gc_collect":[{"gc_mgr_name":"PS MarkSweep","gc_coll_cnt":1,"gc_coll_time":22},{"gc_mgr_name":"PS Scavenge","gc_coll_cnt":12,"gc_coll_time":33}]}
2013-05-18T12:17:03+09:00       jvmwatcher.host2        {"logtime":1368847023899,"host_name":"fate","proc_state":"LIVE_PROCESS","pid":2073,"name":"jvmwatcher.test.TestJavaProcess 4096 2048 20 20","display_name":"jvmwatcher.test.TestJavaProcess 4096 2048 20 20","start_time":1368846656120,"up_time":367782,"cpu_usage":4.016064,"compile_time":2316,"c_load_cnt":1203,"c_unload_cnt":0,"c_total_load_cnt":1203,"th_cnt":29,"daemon_th_cnt":8,"peak_th_cnt":29,"heap_init":30762880,"heap_used":133306592,"heap_commit":253063168,"heap_max":675086336,"notheap_init":24313856,"notheap_used":10295944,"notheap_commit":24313856,"notheap_max":224395264,"pending_fin_cnt":0,"total_phy_mem_size":1968824320,"total_swap_mem_size":4227850240,"free_phy_mem_size":1059782656,"free_swap_mem_size":4227850240,"commit_vmem_size":1659875328,"gc_collect":[{"gc_mgr_name":"Copy","gc_coll_cnt":28,"gc_coll_time":1068},{"gc_mgr_name":"MarkSweepCompact","gc_coll_cnt":11,"gc_coll_time":226}]}
2013-05-18T12:17:04+09:00       jvmwatcher.host2        {"logtime":1368847024330,"host_name":"fate","proc_state":"LIVE_PROCESS","pid":1983,"name":"jvmwatcher.test.TestJavaProcess 2048 4096 20 10","display_name":"jvmwatcher.test.TestJavaProcess 2048 4096 20 10","start_time":1368846614950,"up_time":409386,"cpu_usage":1.996008,"compile_time":2315,"c_load_cnt":1203,"c_unload_cnt":0,"c_total_load_cnt":1203,"th_cnt":19,"daemon_th_cnt":8,"peak_th_cnt":19,"heap_init":30762880,"heap_used":83295744,"heap_commit":111951872,"heap_max":675086336,"notheap_init":24313856,"notheap_used":10280152,"notheap_commit":24313856,"notheap_max":224395264,"pending_fin_cnt":0,"total_phy_mem_size":1968824320,"total_swap_mem_size":4227850240,"free_phy_mem_size":1059774464,"free_swap_mem_size":4227850240,"commit_vmem_size":1649348608,"gc_collect":[{"gc_mgr_name":"Copy","gc_coll_cnt":21,"gc_coll_time":573},{"gc_mgr_name":"MarkSweepCompact","gc_coll_cnt":7,"gc_coll_time":124}]}
2013-05-18T12:17:04+09:00       jvmwatcher.host2        {"logtime":1368847024899,"host_name":"fate","proc_state":"LIVE_PROCESS","pid":2073,"name":"jvmwatcher.test.TestJavaProcess 4096 2048 20 20","display_name":"jvmwatcher.test.TestJavaProcess 4096 2048 20 20","start_time":1368846656120,"up_time":368785,"cpu_usage":2.9910269,"compile_time":2316,"c_load_cnt":1203,"c_unload_cnt":0,"c_total_load_cnt":1203,"th_cnt":29,"daemon_th_cnt":8,"peak_th_cnt":29,"heap_init":30762880,"heap_used":137890360,"heap_commit":253063168,"heap_max":675086336,"notheap_init":24313856,"notheap_used":10295944,"notheap_commit":24313856,"notheap_max":224395264,"pending_fin_cnt":0,"total_phy_mem_size":1968824320,"total_swap_mem_size":4227850240,"free_phy_mem_size":1059758080,"free_swap_mem_size":4227850240,"commit_vmem_size":1659875328,"gc_collect":[{"gc_mgr_name":"Copy","gc_coll_cnt":28,"gc_coll_time":1068},{"gc_mgr_name":"MarkSweepCompact","gc_coll_cnt":11,"gc_coll_time":226}]}


実運用で使用する場合は、fluentd実行時に-dオプションを付けて、デーモン起動させることになります。
td-agentを使って、お手軽にfluentd実行環境を構築して、最初からデーモンとして起動するようにしておくのもいいです。

こんな感じで、fluentdを使って、簡単に複数のサーバから、ログを一か所に収集することが出来てしまいます :-)
まだ実運用では使ってはいないのですが、fluentdはかなり使えると思っています。

fluent-plugin-jvmwatcherの定義など細かい点は、ここでは省略していますが、定義で必要なJavaプロセスだけに絞り込むこともできるようになっています。
詳細は、GitHub MasayukiMiyake97 / fluent-plugin-jvmwatcherのREADME.mdを読んでみてください。
それから、出力しているログの各項目の意味は、Log Output formatを読んでみてください。翻訳ソフトで訳した英文なので、わかりにくいと思いますが.....orz

それではまた~ ヽ( ・∀・)ノ

qpstudy&LT初参加

4/13にqpstudy(今回で三周年だそうな)に初参加してきました :-)
ビアバッシュ&LT大会ということで、飛び入りLTアリということ言うことだったので、新人さん向けに学習パターンを紹介するスライドを、朝起きて2時間ぐらいで作って会場に....

楽しい話やら、時空が歪むような話やら、なかなか楽しいLTでした :-)

私も、新人さん向けに学習パターンを紹介するLTをやってみました。
私の人生初LTwwww

スライドは
学習パターンを使ってみよう
においているので、何かの役に立てば....

このスライドでは、時間の関係上、新人向けに3パターンしか紹介していないので、実際の学習パターンへのリンクを張っておきます。

ちなみに、学習パターンを作成したのは、慶応義塾大学SFC 井庭 崇先生の井庭研です。学習パターン以外に、プレゼンテーション・パターン、コラボレーション・パターンを作成しています。

プレゼンテーション・パターン

学習パターン

コラボレーション・パターン

コラボレーション・パターンは、組織やチームで協調して創造的な活動をするコツをまとめたパターン集(?)です。
アジャイル開発で結構役に立つパターンだと思っています :-)

それでは~~

追伸:リーダー見つかってよかった~~ :-)

open vSwitchをCentOSにインストール

ちょっとOpenFlowの調べものを再開するために、KVMのホストマシンにopen vSwitch(1.9)をインストールすることに....
で、自分用メモにインストール手順を残します|д゚)チラッ

去年、1.6のopen vSwitchのPRMを作ってCentOSにインストールしたので、手順はほぼ昔のままでしたが(Open vSwitch のRPMパッケージ生成とインストール)、CentOS6.4用に1.9のopen vSwitchをビルドするにはパッチとかが必要ということで、ここのブログを参考にさせてもらいました。

ビルド準備とautoconfのバージョンアップ

まずはopen vSwitchやautoconfのビルドに必要なパッケージのインストールを行います。

$su -
#yum -y install git gcc make automake rpm-build redhat-rpm-config openssl-devel kernel-devel

まずはautoconfを2.69にバージョンアップします。
CentOS 6.4のyumインストールでは、open vSwitchをビルドできない古いバージョンしかインストールできないので、以下の手順でautoconfのビルドとインストールを行います。

まずは、ホームディレクトリの適当な場所に作業ディレクトリを作って、以下のコマンドを実行してautoconfのビルドとインストールを行います。

$wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
$tar xvf autoconf-2.69.tar.gz
$cd autoconf-2.69
$./configure
$make
$su
#make install

これで、open vSwitchのビルド準備が完了です。

open vSwitchのビルドとインストール

これからはopen vSwitchのビルドとインストールです。

まずはopen vSwitchのtarボールを取得して展開します。

#exit
$cd ..
$wget http://openvswitch.org/releases/openvswitch-1.9.0.tar.gz
$tar xvf openvswitch-1.9.0.tar.gz
$cd openvswitch-1.9.0

このソースコードに、RedHatのあてたカーネルへの変更に対応するためのパッチを充てる必要があります。
パッチは以下のように当てたのち、open vSwitchをビルドします。

$wget -O - "http://openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=patch;h=7aaeb9d4e1a9219c48d981230f2738bbdb7abda7" | patch -p1
$./boot.sh
$./configure
$make dist

openvswitch-1.9.0.tar.gz というパッケージ用ビルド生成用ファイルを固めたファイルができているので、以下の手順でRPMパッケージを生成します。

$mkdir -p ~/rpmbuild/SOURCES
$mv openvswitch-1.9.0.tar.gz ~/rpmbuild/SOURCES/.
$rpmbuild -bb rhel/openvswitch.spec
$rpmbuild -bb rhel/openvswitch-kmod-rhel6.spec

これでRPMのビルドが完了です。
できたRPMは、~/rpmbuild/RPMS/x86_64/ の下に生成されます。

$ls -la ~/rpmbuild/RPMS/x86_64/
drwxr-xr-x. 2 miyake miyake    4096  3月 30 22:32 2013 .
drwxr-xr-x. 3 miyake miyake    4096  3月 30 22:31 2013 ..
-rw-rw-r--. 1 miyake miyake 1249920  3月 30 22:32 2013 kmod-openvswitch-1.9.0-1.el6.x86_64.rpm
-rw-rw-r--. 1 miyake miyake 2148644  3月 30 22:31 2013 openvswitch-1.9.0-1.x86_64.rpm
-rw-rw-r--. 1 miyake miyake 6143752  3月 30 22:31 2013 openvswitch-debuginfo-1.9.0-1.x86_64.rpm

ここからRPMのインストール。
suでrootになってからインストール。

$cd ~/rpmbuild/RPMS/x86_64/
$su
# yum install openvswitch-1.9.0-1.x86_64.rpm kmod-openvswitch-1.9.0-1.el6.x86_64.rpm openvswitch-debuginfo-1.9.0-1.x86_64.rpm

これで、インストールは完了です。

ちなみに、カーネルモジュールは

# ls -la  /lib/modules/2.6.32-358.2.1.el6.x86_64/extra/openvswitch/
合計 6580
drwxr-xr-x. 2 root root    4096  3月 30 22:38 2013 .
drwxr-xr-x. 3 root root    4096  3月 30 22:38 2013 ..
-rw-r--r--. 1 root root  513034  3月 30 22:32 2013 brcompat.ko
-rw-r--r--. 1 root root 6210031  3月 30 22:32 2013 openvswitch.ko

Open vSwitchコマンドは /usr/sbin/ の下にインストールされます。

# ls -la | grep ovs
-rwxr-xr-x.  1 root root       610552  3月 30 22:31 2013 ovs-brcompatd
-rwxr-xr-x.  1 root root        44335  3月 30 22:31 2013 ovs-bugtool
-rwxr-xr-x.  1 root root      1121808  3月 30 22:31 2013 ovs-vswitchd
-rwxr-xr-x.  1 root root       734152  3月 30 22:31 2013 ovsdb-server

Open vSwitchデーモンのバイナリは /usr/bin/ の下にインストールされます。

# ls -la | grep ovs
-rwxr-xr-x.   1 root root     188520  3月 30 22:31 2013 ovs-appctl
-rwxr-xr-x.   1 root root     192968  3月 30 22:31 2013 ovs-benchmark
-rwxr-xr-x.   1 root root     610192  3月 30 22:31 2013 ovs-dpctl
-rwxr-xr-x.   1 root root     660896  3月 30 22:31 2013 ovs-ofctl
-rwxr-xr-x.   1 root root       3016  3月 30 22:31 2013 ovs-parse-backtrace
-rwxr-xr-x.   1 root root       9011  3月 30 22:31 2013 ovs-parse-leaks
-rwxr-xr-x.   1 root root       3293  3月 30 22:31 2013 ovs-pcap
-rwxr-xr-x.   1 root root      14336  3月 30 22:31 2013 ovs-pki
-rwxr-xr-x.   1 root root       2150  3月 30 22:31 2013 ovs-tcpundump
-rwxr-xr-x.   1 root root      12069  3月 30 22:31 2013 ovs-vlan-test
-rwxr-xr-x.   1 root root     879320  3月 30 22:31 2013 ovs-vsctl
-rwxr-xr-x.   1 root root     271256  3月 30 22:31 2013 ovsdb-client
-rwxr-xr-x.   1 root root     303688  3月 30 22:31 2013 ovsdb-tool

コンフィグレーションファイルは、

/etc/sysconfig/openvswitch

です。

bridge互換で動作させる場合は、

# BRCOMPAT: If 'yes' compatibility mode will be enabled.
# BRCOMPAT=yes

のコメントを外して、

BRCOMPAT=yes

とすると、bridge互換になります....が

どうやら、このbridge互換機能、評判が悪くて2013年2月以降から使えなくなるということだそうです。
なので、コメントして無効化しました.....

それからopen vSwitchをインストールすると、bridgeは無条件に無効化されます。
厳密にいうと、OS起動時にopen vSwitchが起動され、その際にbridgeを停止させているようです。

※ちなみに、/usr/share/openvswitch/scripts/ovs-ctl の中(shスクリプト)を読むと、起動の流れが少しだけわかります。

open vSwitchを起動するには

# service openvswitch start
Starting ovsdb-server                                      [  OK  ]
Configuring Open vSwitch system IDs                        [  OK  ]
Starting ovs-vswitchd                                      [  OK  ]
iptables already has a rule for gre, not explicitly enabling.

とすれば、起動します。
最新のバージョンでは、起動時にDBの初期化を自動的に行ってくれるようになったようです。

なお、WARNが出た場合は、OSを再起動したのち、open vSwitchを再起動してください。

# service openvswitch restart
ovs-brcompatd is not running.
Killing ovs-vswitchd (15143)                               [  OK  ]
Killing ovsdb-server (15134)                               [  OK  ]
Starting ovsdb-server                                      [  OK  ]
Configuring Open vSwitch system IDs                        [  OK  ]
Starting ovs-vswitchd                                      [  OK  ]
iptables already has a rule for gre, not explicitly enabling.

ちなみに、以下のコマンドでヴァージョンを確認できます。

# service openvswitch version
ovsdb-server (Open vSwitch) 1.9.0
Compiled Mar 30 2013 22:31:31
ovs-vswitchd (Open vSwitch) 1.9.0
Compiled Mar 30 2013 22:31:33
OpenFlow versions 0x1:0x1

OpenFlowのバージョンは1.0のようです。

とりあえず、open vSwitchのインストールは完了しました。

あとは、open vSwitchでブリッジを作ったりして、KVMのゲストOSで使う設定や、OpenFlowで制御するための設定、OpenFlowのバージョンを上げて使う方法とかを調べてやっていく予定です。

それでは|д゚)チラッ

CentOSでFluentdしてみよう(インストール編)

ってことで、一部で盛り上がっているFluentdをやってみよう....ということで、このブログにインストールからプラグイン作成とか、色々試したことをまとめていこうと思います。

Fluentdって?

Fluentdって何?って、いまさら説明するのもあれなので、本家のreadmeを....
GitHub fluent/fluentd

Fluentdは、複数のサーバ上のログ(syslogやApatchのログなど)をJSON形式に変換して、ログサーバやAmazonS3、HDFS、MongoDBなどに集約する、ログ収集システムです。
※とりあえずrsyslogのスゲー版だと思ってもらえば....

Fluentdでは、ログデータをJSON形式に統一して収集することができるため、データの解析や統計がやりやすくなるというメリットがあります。(内部ではMessagePackが使われているのでJSON形式に統一されています)
またログデータは、イベントメッセージとしてほぼリアルタイムに配信することができるため、リアルタイムに情報を集めることができるメリットもあります。

上記のメリットのおかげか、ここ最近Webサービスを提供している会社でよく使われるようになっています。多分、Webサービス会社以外も使うようになっていると思います。

世の中ではログ収集サービスとして紹介されているけど、Fluentdを使ったログ収集サービスは、利用方法の1例に過ぎないだけで、これって立派なイベント(メッセージ)配信/収集基盤サービスなんですよね。だから、使い方次第で、ログ以外の情報を複数のノードから配信/集約するサービスに応用可能なサービスだと思っています。

jstatの情報を配信して、複数ノード上で動作しているJVMの稼働状態を一元管理/監視したりとか、ネットワーク機器を監視しているZabbixの情報をHDFSに収集して(すでにZabbixプラグインが存在しています)、ネットワーク状態の統計や解析を行ったりと、用途は色々考えられます +(0゚・∀・) + ワクテカ +

ってことで、まずはその最初の一歩、Fluentdのインストールをやってみます。

なお、Fluentdのインストールには、Rubyのインストールなど色々面倒な手順があったり、依存するパッケージがいくつかあって、複数のノードにインストールするとかなりの手間がかかります。
この手間を簡単にするために、Treasure Data.Inc.からリリースされている、td-agentパッケージを使うとかなりインストールが簡単になります。td-agentパッケージには、Fluentdと、そのFluentdを動作させるために必要なRuby(ビルド済み)が含まれているため、このパッケージをインストールするだけでFluentdの実行環境が整います :-)

運用環境にFluentdをインストールするのはtd-agentパッケージを使って、プラグイン開発環境を構築するには、RubyをインストールしてgemでFluentdをインストールするのがベストかな...と思っています。
※td-agentパッケージのインストールにはroot権限が必要なので、td-agentパッケージでインストールしたFluentd環境でプラグインを開発するのは不便で危険なので....

それじゃまず、RVMでRubyをインストールして、Fluentdをインストールしてみます。
※この手順は、そこらじゅうのブログや、2012年 SoftwareDesign 6月号の記事にも載っています(汗

ちなみに、インストール先のOSは、CentOS6.3になります。
CentOS6.4でも問題なく動作します。
それから、CentOSをインストールする時は、開発者用でインストールしてください。
次で説明するRVMでRubyをインストールする際にRubyをビルドするため、gccやmake、automakeが必要になります。

Ubuntuへのインストールは....また今度時間を作って試してみます|д゚)チラッ

Rubyインストール

まずはFluentdを動作させるため、RVM(Ruby Version Manager)でRubyをインストールします。
RVMを使うと、ユーザのホームにRubyをインストールして、バージョンの切り替えもコマンド一発でできるようになるので、開発用にRubyをインストールするのに最適です。(他の開発者に迷惑かけずに済みますwww)

まずはRVMをインストールするため、ホームディレクトリで以下のコマンドを実行します。

$ curl -L get.rvm.io | bash -s stable$ 

上記コマンドを実行すると、/home/******/.rvm/にRVMをインストールするログが出力され、成功すると

# *****,
#
#   Thank you for using RVM!
#   I sincerely hope that RVM helps to make your life easier and
#   more enjoyable!!!
#
# ~Wayne

というメッセージが出ます。
上記メッセージが出たら、

$ source ~/.rvm/scripts/'rvm'

と実行してください。
これでRVMが利用できるようになったので、これからRubyをインストールします。

まずはRVMでインストール可能な1.9のバージョンをリストアップしてみます。
※FluentdはRuby1.9ベースです

$ rvm list known|grep 1.9
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p320]
[ruby-]1.9.3-p125
[ruby-]1.9.3-p194
[ruby-]1.9.3-p286
[ruby-]1.9.3-p327
[ruby-]1.9.3-p362
[ruby-]1.9.3-p374
[ruby-]1.9.3-p385
[ruby-]1.9.3-[p392]
[ruby-]1.9.3-head

1.9.3-[p392]が最新なので、

$ rvm install 1.9.3

と実行すると、1.9.3の最新版である1.9.3-p392がビルドとインストールされます。
インストール先は、.rvm/配下になります。

インストールした1.9.3をデフォルトにするため、以下のコマンドを実行します。

$ rvm use 1.9.3 --default
Using /home/miyake/.rvm/gems/ruby-1.9.3-p392

これで、Ruby1.9.3がデフォルトとなります。
実際にバージョンを確認してみると...

$ ruby --version
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]

となり、Ruby1.9.3がデフォルトで使えるようになっています。

Fluentdインストール

Rubyのインストールができたので、次はFluentdをインストールします。
Fluentdのインストールは、以下のgemコマンド一発で終わります :-)

$ gem install fluentd

このコマンドで、依存するパッケージも含めて、一気にインストールされます。

インストールしたFluentdに--setup オプションをつけて実行すると、実行に必要な定義ファイルのひな形や、開発するプラグインを配置するディレクトリを生成してくれます。

$ fluentd --setup fluent_dev
$ ls -la fluent_dev
合計 16
drwxrwxr-x. 3 ****** ****** 4096  3月 20 22:15 2013 .
drwxrwxr-x. 3 ****** ****** 4096  3月 20 22:15 2013 ..
-rw-rw-r--. 1 ****** ****** 1427  3月 20 22:15 2013 fluent.conf
drwxrwxr-x. 2 ****** ****** 4096  3月 20 22:15 2013 plugin

fluent.confが定義ファイルのひな形になります。
fluent.confの設定やfluentdの実行は、次のブログで詳細を書きます....orz

普通は、fluent.confを設定したら

$ fluentd -c fluent_dev/fluent.conf

って感じで実行します。
デーモンとして起動する場合は、-dオプションをつけて起動します。

Fluentdプラグインですが、これもgemで行うことができて、

$ gem search -r fluent-plugin

と実行すると、インストール可能なプラグイン一覧を表示させることができます。

$ gem search -r fluent-plugin
*** REMOTE GEMS ***

fluent-plugin-access (0.0.2)
fluent-plugin-amplifier-filter (0.1.1)
fluent-plugin-amqp (0.0.0)
fluent-plugin-anomalydetect (0.1.0)
fluent-plugin-arango (0.0.1)
fluent-plugin-axlsx (0.0.1)
fluent-plugin-boundio (0.1.1)
fluent-plugin-cassandra (0.0.2)
fluent-plugin-cassandra-cql (0.0.5)
fluent-plugin-cloudwatch (1.0.0)
fluent-plugin-cloudwatch_ya (0.0.2)
fluent-plugin-config-expander (0.1.1)
fluent-plugin-config_pit (0.0.2)
fluent-plugin-couch (0.6.0)
fluent-plugin-couchbase (0.0.2)
fluent-plugin-datacalculator (0.0.4)
fluent-plugin-datacounter (0.4.0)
fluent-plugin-dbi (0.0.3)
fluent-plugin-delay-inspector (0.0.1)
fluent-plugin-delayed (0.0.1)
fluent-plugin-dstat (0.2.3)
fluent-plugin-dynamodb (0.1.8)
fluent-plugin-elasticsearch (0.1.0)
fluent-plugin-event-tail (0.0.1)
fluent-plugin-extract_query_params (0.0.2)
fluent-plugin-file-alternative (0.1.3)
fluent-plugin-filter (0.0.0)
fluent-plugin-flatten (0.0.6)
fluent-plugin-flowcounter (0.1.5)
fluent-plugin-flume (0.1.1)
fluent-plugin-fnordmetric (0.0.1)
fluent-plugin-forest (0.1.2)
fluent-plugin-forward-aws (0.1.6)
fluent-plugin-gamobile (0.2.2)
fluent-plugin-gree_community (0.0.1)
fluent-plugin-groonga (1.0.1)
fluent-plugin-groupcounter (0.1.0)
fluent-plugin-growl (0.0.5)
fluent-plugin-growthforecast (0.1.4)
fluent-plugin-gstore (0.3.2)
fluent-plugin-hbase (0.1.2)
fluent-plugin-hipchat (0.1.1)
fluent-plugin-hoop (0.1.4)
fluent-plugin-hostname (0.0.1)
fluent-plugin-http-enhanced (0.0.4)
fluent-plugin-http-list (0.1.0)
fluent-plugin-http-status (0.0.3)
fluent-plugin-ikachan (0.2.0)
fluent-plugin-imkayac (0.0.1)
fluent-plugin-irc (0.0.1)
fluent-plugin-jabber (0.3.0)
fluent-plugin-kafka (0.0.1)
fluent-plugin-kanicounter (0.0.1)
fluent-plugin-kestrel (0.2.2)
fluent-plugin-librato-metrics (0.2.3)
fluent-plugin-loggly (0.0.1)
fluent-plugin-mail (0.0.2)
fluent-plugin-map (0.0.4)
fluent-plugin-metricsense (0.1.0)
fluent-plugin-mixi_community (0.0.1)
fluent-plugin-mongo (0.6.13)
fluent-plugin-mongo-typed (0.1.0)
fluent-plugin-msgpack-rpc (0.3.0)
fluent-plugin-munin (0.3.1)
fluent-plugin-mysql (0.0.3)
fluent-plugin-mysql-query (0.2.2)
fluent-plugin-mysqlslowquery (0.0.2)
fluent-plugin-mysqlslowquerylog (0.0.2)
fluent-plugin-nats (0.0.5)
fluent-plugin-notifier (0.2.0)
fluent-plugin-numeric-counter (0.2.0)
fluent-plugin-numeric-monitor (0.1.3)
fluent-plugin-opentsdb (0.1.1)
fluent-plugin-out-http (0.1.0)
fluent-plugin-parser (0.2.2)
fluent-plugin-pghstore (0.2.1)
fluent-plugin-pgjson (0.0.1)
fluent-plugin-ping-message (0.0.5)
fluent-plugin-postgres (0.0.1)
fluent-plugin-redeliver (0.0.2)
fluent-plugin-redis (0.2.0)
fluent-plugin-redis-counter (0.2.0)
fluent-plugin-resque (0.2.1)
fluent-plugin-resque_stat (0.0.5)
fluent-plugin-retag (0.0.1)
fluent-plugin-rewrite (0.0.9)
fluent-plugin-rewrite-tag-filter (1.1.1)
fluent-plugin-riak (0.0.2)
fluent-plugin-s3 (0.3.0)
fluent-plugin-sampling-filter (0.1.2)
fluent-plugin-say (0.1.1)
fluent-plugin-scribe (0.10.10)
fluent-plugin-secure-forward (0.0.1)
fluent-plugin-select (0.0.3.1)
fluent-plugin-serialport (0.0.2)
fluent-plugin-sndacs (0.0.3)
fluent-plugin-snmp (0.0.5)
fluent-plugin-sns (0.2.1)
fluent-plugin-solr (0.1.1)
fluent-plugin-splunk (0.0.1.1)
fluent-plugin-splunkapi (0.1.2)
fluent-plugin-sqlite3 (0.1.0)
fluent-plugin-sqs (0.2.1)
fluent-plugin-suppress (0.0.2)
fluent-plugin-tagfile (0.0.1)
fluent-plugin-tail-asis (0.0.3)
fluent-plugin-tail-ex (0.1.0)
fluent-plugin-tail-multiline (0.1.1)
fluent-plugin-td (0.10.13)
fluent-plugin-twitter (0.1.1)
fluent-plugin-udp (0.0.1)
fluent-plugin-weather (0.0.1)
fluent-plugin-webhdfs (0.1.1)
fluent-plugin-woothee (0.0.1)
fluent-plugin-zabbix (0.0.1)
fluent-plugin-zabbix-simple (1.0.0)
fluent-plugin-zmq (0.0.3)

MongoDBとかzabbix、cassandra、Amazon S3など、かなりのプラグインが出ています。
プラグインのインストールは、

gem install fluent-plugin-mongo

という感じで、gemコマンドでインストールします。

とりあえず、開発用Fluentdのインストールはこれで終了です。


ちょろっと話は変わりますが、定義ファイルを設定しないでfluentdを実行すると

$ fluentd
2013-03-06 20:52:31 +0900 [info]: starting fluentd-0.10.32
2013-03-06 20:52:31 +0900 [info]: reading config file path="/etc/fluent/fluent.conf"
2013-03-06 20:52:31 +0900 [error]: unexpected error error="No such file or directory - /etc/fluent/fluent.conf"
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:238:in `read'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:238:in `read_config'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:84:in `block in start'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:180:in `call'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:180:in `main_process'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:155:in `block in supervise'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:154:in `fork'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:154:in `supervise'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb:83:in `start'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/command/fluentd.rb:129:in `<top (required)>'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/bin/fluentd:6:in `<top (required)>'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/bin/fluentd:19:in `load'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/bin/fluentd:19:in `<main>'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/bin/ruby_noexec_wrapper:14:in `eval'
  2013-03-06 20:52:31 +0900 [error]: /home/******/.rvm/gems/ruby-1.9.3-p392/bin/ruby_noexec_wrapper:14:in `<main>'
2013-03-06 20:52:31 +0900 [info]: process finished code=256
2013-03-06 20:52:31 +0900 [warn]: process died within 1 second. exit.
[miyake@hayate ~]$ ls /home/******/.rvm/gems/ruby-1.9.3-p392/bin
fluent-cat  fluent-debug  fluent-gem  fluentd  ruby_noexec_wrapper

という感じのエラーメッセージが出てきますw
で、定義ファイルのデフォルトは、

reading config file path="/etc/fluent/fluent.conf"

ってところから、/etc/fluent/fluent.conf がデフォルトだということがわかりますw

ちなみに、/home/******/.rvm/gems/ruby-1.9.3-p392/gems/fluentd-0.10.32/lib/fluent/supervisor.rb で、プロセスのデーモン化など、起動時の基本的な処理を行っているようです。
このログからFluentdのソースを追い始めるのが、近道かもしれません....多分

td-agentのインストール

最後に、実行環境用にtd-agentパッケージのインストール手順です。

CentOSなのでyumでインストールしますが、td-agentのリポジトリがデフォルトで登録されていないので、yumのリポジトリに追加してから、yumでインストールを行います。
【補足】td-agentのrpmパッケージはCentOSでの動作は保証しているそうですが、Fedoraでの動作は保証していないそうです。

まずはリポジトリファイルの追加です。

$ su -
# vi /etc/yum.repos.d/td.repo

と実行してリポジトリファイルを作成します。
td.repoには

[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0

と入力して書き込みます。
上記の後、

# yum install td-agent

と実行すると、FluentdとRuby、必要なプラグイン一式がインストールされます。


ちなみに、社内のネットワーク事情によっては、yumで直接インストールすることができない環境があります。
その場合は、以下のURLに行くと、rpmパッケージを直接ダウンロードすることができます。

http://packages.treasure-data.com/redhat/x86_64/ <= 64bit用パッケージ
http://packages.treasure-data.com/redhat/i386/  <= 32bit用パッケージ

【補足】2013/03/21 rpmパッケージのダウンロードによるインストール方法に不備があったので色々追記

ブラウザで開くと、こんな感じです。
f:id:PANTOMAIMU:20130321213132j:plain

PCのブラウザから、td-agent-1.1.11-0.x86_64.rpmとtd-libyaml-0.1.4-1.x86_64.rpmをダウンロードして、WinSCPを使って転送するか、以下のwgetでダウンロードします。

# wget http://packages.treasure-data.com/redhat/x86_64/td-agent-1.1.11-0.x86_64.rpm
# wget http://packages.treasure-data.com/redhat/x86_64/td-libyaml-0.1.4-1.x86_64.rpm

ダウンロードしたrpmを、以下のコマンドでインストールを行います。

# yum localinstall td-agent-1.1.11-0.x86_64.rpm td-libyaml-0.1.4-1.x86_64.rpm

ただし、CentOSを最少セットでインストールしていると、他に依存する他のパッケージが足りなくて、以下のパッケージが見つからずに、インストールに失敗します(;_;)

compat-libtermcap-2.0.8-49.el6.x86_64.rpm
compat-readline5-5.2-17.1.el6.x86_64.rpm
libxslt-1.1.26-2.el6_3.1.x86_64.rpm
openssl098e-0.9.8e-17.el6.centos.2.x86_64.rpm
perl-5.10.1-129.el6.x86_64.rpm
perl-Module-Pluggable-3.90-129.el6.x86_64.rpm
perl-Pod-Escapes-1.04-129.el6.x86_64.rpm
perl-Pod-Simple-3.13-129.el6.x86_64.rpm
perl-libs-5.10.1-129.el6.x86_64.rpm
perl-version-0.77-129.el6.x86_64.rpm

この場合は、このパッケージを一つずつダウンロードして、yum localinstallをする必要があります....
めんどくさい....orz

あとは、Internetに繋がっているCentOSマシンで、

# yum install --downloadonly --downloaddir=. td-agent

と実行して、依存するパッケージを含めてダウンロードしてしまう方が楽かもしれません。
最近はISMSなどなど、セキュリティが厳しい職場が増えているので、色々対処策を考えておく必要がありますよね.....orz

それでは、インストール編は以上です。
次は、定義ファイルを設定して、Apatchログを他のノードに転送したりすることをやってみようと思います。
※もうすでにできているので、あとはまとめるだけなんですけどね.....orz

それではまた~ ヽ(・∀・ )ノ

パターン・ランゲージを要件定義に使えないかと模索していた10年前w

今を去ること10年前、早稲田大学で行われていたパターン・ランゲージの勉強会(?)で、中埜さんや羽生田さんなどなど、パターン・ランゲージについてのトークを聞いていて、

「要件定義のためのパターン・ランゲージができないものか....」
ってことで、その時の勢いだけで書いたパワーポイントが出てきたので、恥ずかしいけど公開してみますwww
あのころは、若かったなぁ....
内容はかなり荒くて、リアリティの無い部分が多々あるけど、今でも、お客さんとの間で、要件定義がぶれずに、どのような問題をどう解決したいのかを、一緒に考える手段として、パターン・ランゲージが使えるんじゃないかと、今でも思っていたりします....

f:id:PANTOMAIMU:20130318203648p:plain

f:id:PANTOMAIMU:20130318203649p:plain
要件定義をお客様と考えるにあたり、お客様から要件を聞き出してまとめる方法や、お客様の業務そのものが、暗黙知や実践知だったりすることが多く、お客様の話している言葉だけを書き連ねるだけでは、問題を解決できない....という思いがそのころからあったんですよねぇ....
あと、COTS製品を使ったシステム開発手法や設計の仕方についても、かなりの暗黙知や実践知に依存していた部分があったと考えていました....

f:id:PANTOMAIMU:20130318203650p:plain
で、実際にどの辺で、ギャップが生まれるのかということと、

f:id:PANTOMAIMU:20130318203651p:plain
そのギャップを埋めるために、パターン・ランゲージをどの辺に使えばいいのかを、ざっくりとですが考えていたことを書いています....

f:id:PANTOMAIMU:20130318203652p:plain


まぁ、基本的にウォーターフォールで開発することが前提になっているので、今はアジャイルといったアプローチで、よりスマートなパターン・ランゲージができそうな気がしています :-)

私が10年前に作ろうとしていたパターン・ランゲージは、井庭先生のブログにあるパターン・ランゲージ2.0に相当すると思います。
パターン・ランゲージ4.0(社会・コミュニティデザインの言語)の構想

最近また、パターン・ランゲージ熱が上がってきているので、パターン・ランゲージを使って、自分の今までの実践知を形にできればなぁ....と考えています :-)

体験や経験の共有

今日は、昨日出勤した代わりの振替休日でした :-)
で、そんななか、Twitterしていて、山田ズーニーさんの以下の呟きが私の心にヒットして



その呟きから、山本五十六の「やって見せて、言って聞かせて、やらせて見て、 ほめてやらねば、人は動かず」の話を切り出して、「言う」は相手の知識を増やすにとどまるけど、「やる」は五感にうったえて、体験、経験になる....なんて話ができて、色々と知的好奇心が刺激された日でした :-)
 
で、私の中で10年以上前からひそかなブームになっているパターン・ランゲージは、体験や経験といった暗黙知や実践知を伝える手段として有効だろうと考えていたりします。

で、最近は、慶応大学SFCの井庭崇先生のパターン・ランゲージの活動に注目していたりします :-)
プレゼンテーション・パターンの本も、つい最近出版されています。

プレゼンテーション・パターン: 創造を誘発する表現のヒント (パターン・ランゲージ・ブックス)

プレゼンテーション・パターン: 創造を誘発する表現のヒント (パターン・ランゲージ・ブックス)

他にも、ラーニング・パターンコラボレーション・パターンを出されていて、仕事やプロジェクト、勉強をする上での知恵をきれいにまとめられています。
コラボレーション・パターンは、アジャイルといった開発手法に役立つことが詰まっていると考えています。

井庭先生のブログはこちら :-) 井庭崇のConcept Walk

私も、仕事の中で得てきた実践知をパターン・ランゲージ化したいなぁ....と思いつつ、形にできていなかったりします....orz

色々ありそうなんだけどねぇ...

テストパターンとか、リーダーシップパターン、マネジメントパターンとか色々....