モニカジ#2でモヒカンに会ってきた話とプログラミング初心者がMzcsつくったという話

本エントリーはアルコール度数高めでまとめております。
不備など多々あるかと思いますが、アルコール感を感じて頂ければと思います。

Monitoring Casual Talk#2 に行ってきました。

膝に矢を受けてではないですが、先週末に会社のフットサルに参加して
よくわからないダメージを右足に受けて、家の近くの接骨院(初)に行って
観てもらったら、うーんと何回か首を傾げていて、
とても丁寧で人は良いんだけど腕はない人っぽい可能性があって、
まぁ動かさないより動かした方がいいとか言われたので、じゃあいいか
ってなもんで気にせず渋谷まで行ってきたわけなんですけど

渋谷駅でfujiwaraさんとsongmuさんが足痛いの知ってるのに颯爽と歩いて行って、
「ちょっと待ってたけど来なかったから」とか言われて
待ってたとか言ってるけど振り返った程度だろうな、と思ったりして

で、帰りには歩けなくなるぐらい痛くなって、酒呑んだからかな〜
なんだかなあ〜(阿藤快)と思い、ヤブ医者だろうがなんだろうがオレの精神はこの困難を乗り越えるッッ!!
みたいな感じで帰りつつ、いやはや、やっぱり楽しかったなと。

サーバのお守りしてる人って、基本社内にあまり人数はいなくて
社内で話し相手があんまりいない人たちが集まって
日頃の悩みとかをあーだこーだ言うのはいいなって。

Yappoさんが買ってきてくれたビールがバキバキだったり(ありがとうございました!)
Yappoさんが発表しようとしたらモニターに何も映らなくて
開口一番「何か質問ありますか?」とか言ってたり
Yappoさんとmyfinderさん、#monitoring-casual@freebitにbot仕込んで遊んでたり
myfinderさんは懇親会前にビール4本開けてるし
tagomorisさんは懇親会から参加してモヒカンっぷりを発揮していたし

やれやれと思うこともあったけど、全体的に楽しかった!
最初の方時間あまってるんでーとかユルユルやってて、ユルユルやりすぎて
最後の方時間なくなってたので、時間はタイムキーパー必須ですね。うける。

懇親会ではわたしのoranieを返してよ!!!っておじさんたちが嘆いていて
とりあえずkuwa_twさんを囲もうとか言ってて、やれやれって思って

nakashii_先生とfujiwaraさんと3人でZabbixの素晴らしさを
studio3104さんに話してたんだけど、全く使う気になれない!!って言われて
本当にそうだよなって思いながら話していた。

riywoさんがアメリカに行く前にお会いできたのはよかった。
今自分がこうやって色々活動的に動いてるの、riywoさんに刺激受けたところが大くて
オレも何かやりたいなーと思ったりして今があったりとかするので。
アメリカに行っても元気に活躍してほしいです。


モニタリングツールといえば、

この古橋さんのPOSTがなんとも胸アツですよね。
わたしも微力ながら貢献できるところで貢献できればなーと思いふけております。


あ、それと今回

とか考えてたんですけど、
結局Mzcsつくったのみんなに見て欲しい!って思ってなしにしたんですが
ume3_さんの発表がまさにそれで「自分はこうしているんだけどみなさんはどうしていますか?」
という質問形式で進めてくことによって、みんながどういう基準で障害に対してエスカレーションしているか、
どういうところに重きを置いているのか活発的な議論が起こってすごい良かったです!!!
次あったら完全にパクりたい!!!

ume3_さんで思い出したけどペパボの
「元々うちはホスティング屋だから全員IRCは見てる」っていうスタイル
めちゃくちゃかっこよくて、サーバサイドの人間だけがアラート受けとるのではなく
ディレクターとかデザイナーとかマークアッパーとか関係なしに
みんながアラート受け取って、みんなでIRCで確認しあうというスタイル
多分2012年の日本のウェブ関係の会社で、理想に限りなく近い状態だと思う。
全員がサービスの状態を意識するというか、担当者がやればとかではなく
全員が全員でサービスを守っているというか、そういうの本当に意識高いし
素晴らしいと思う。


ということでMzcsについて話してきたのですが、中身についてちゃんと話しきれてなかったのと
githubにあげてはいたんですが、ドキュメント書いてなかったので書いたりしました。

Morning Zabbix (Graph) Check Script

https://github.com/kenjiskywalker/Mzcs


ということで、
毎朝プルダウン引っ張ってスクリーン移動するのが面倒くさかったので、
全てのグラフを

  1. 今日(09:00)までの24時間
  2. 昨日(09:00)までの24時間
  3. 今日までの2週間

の3つのグラフを並べることによって、メトリクスの変化に気付けるようになる。
という代物でございます。

使い方に関しては大体ドキュメントに書いていて、
もしお使いになる場合には

https://github.com/kenjiskywalker/Mzcs#how-to-use

この辺をいじくって頂ければと。
わたくしはこの子を毎日 09:01 に走らせて確認しております。

仕組みとしては

1. ZabbixにMechanizeでログイン
my $mech = WWW::Mechanize->new(ssl_opts => { verify_hostname => 0 }, timeout => 180);

$mech->get($url);
$mech->field(name     => "$username");
$mech->field(password => "$password");
$mech->click('enter');
2. DBIで指定したグラフカテゴリのグラフIDを取得
sub input_graphid {
    my @recs = ();
    my $graph_category = shift;

    eval {
       my $dbh = DBI->connect($data_source, $db_username, $db_password,
               {RaiseError => 1, PrintError => 0});

       my $sql = "SELECT graphid FROM graphs WHERE name = ?";
           my $sth = $dbh->prepare($sql);
           $sth->execute($graph_category);

       while (my $rec = $sth->fetchrow_arrayref) {
                push(@recs, $rec->[0]);
       }
       $sth->finish;
       $dbh->disconnect;
   };
   die "Error : $@\n" if ($@);
   return @recs;
}

my @graph_category = (
    "CPU Utilization",
    "DiskUsage",
    "Load Average",
    "Memory Utilization",
    "Swap Utilization",
    "Network Traffic (eth0)",
    "Network Traffic (eth1)",
    "MySQL queries",
    "MySQL slave delay"
);

my %filepath = (
    cpu    => "CPU Utilization",
    disk   => "DiskUsage",
    memory => "Memory Utilization",
    swap   => "Swap Utilization",
    loa    => "Load Average",
    netone => "Network Traffic (eth0)",
    nettwo => "Network Traffic (eth1)",
    query  => "MySQL queries",
    slave  => "MySQL slave delay",
);
3. LWP(getstore)で指定した画像をローカルに保存
for my $key (keys(%filepath)) {
    my $graph_name = $filepath{$key};

    my @graphid = input_graphid($graph_name);

    # graph uniq number in $graph
    for my $graph (@graphid) {            # => graphid(100, 101, 102)

        for my $day (keys(%days)) {       # => day(today, yesterday)
            $pm->start and next;
            my $graphurl = "$url/chart2.php?graphid=$graph&width=$width&period=$since{$day}&stime=$days{$day}";

            # main system get png image 
            # $mech->get("$graphurl",":content_file" => "png/${graph}_${day}.png");
            print "$graphurl\n";
            $pm->finish;
        }
        $pm->wait_all_children;
    }
}
4. hisaichi5518先生に教えてもらったspliceで1ページに表示するグラフの数を30で分ける
 my @graphid = input_graphid($graph_name);
 my @one   = splice(@graphid, 0, 30);
 my @two   = splice(@graphid, 0, 30);
 my @three = splice(@graphid, 0, 30);
 my @four  = splice(@graphid, 0, 30);
 my @five  = splice(@graphid, 0, 30);
 my @six   = splice(@graphid, 0, 30);
 my @seven = splice(@graphid, 0, 30);
 my @eight = splice(@graphid, 0, 30);
 my @nine  = splice(@graphid, 0, 30);
 my @ten   = splice(@graphid, 0, 30);

 my @num = (\@one, \@two, \@three, \@four, \@five, \@six, \@seven, \@eight, \@nine, \@ten);

 my %number = (
     one   => \@one,
     two   => \@two,
     three => \@three,
     four  => \@four,
     five  => \@five,
     six   => \@six,
     seven => \@seven,
     eight => \@eight,
     nine  => \@nine,
     ten   => \@ten,
 );

この辺もっとエレガントにできる...

5. XslateでHTMLページを生成(Data::Section::Simple便利や!)
    for my $num (keys(%number)) {

        my $graphid_ref = $number{$num};
        $graph_data = $tx->render("template.tx",
            {
                graph_name => $graph_name,
                list       => $graphid_ref, #list -> \@one => graphid
                graph_cate => $key,         #key
                number     => $num,
            }
        );
        open(my $fh, '>', $key."_".$num.".html"); # open ex) $key(cpu)_$num(one).html
        print $fh $graph_data;
        close($fh);
    }

という感じでやってます。
プログラミングは本当にベーシックなことぐらいしかわからなかったので
オブジェクト指向とかメソッドとかクラスとか最近なんとなくわかってきたような気がするので
捗るようなものをつくっていきたいと思う。

コード、情弱っぷり発揮しているかと思いますので、ご指南お待ちしておりまする!

筋の悪い方法


yum.confでアップデートしたくはないけどインストールはしたい場合のexcludeするためのrecipeとtemplate

というエントリーを書いたのですが、yum.conf(5)のマニュアルページを読んでいると

installonlypkgs List of package provides that should only ever be installed, never updated.  Kernels in particular fall into this category. Defaults to kernel,
kernel-bigmem, kernel-enterprise, kernel-smp, kernel-debug, kernel-unsupported, kernel-source, kernel-devel, kernel-PAE, kernel-PAE-debug.

という感じで書いてあって、マジかー!となったので
早速recipeを変更しました。まずはyum.confをつくるレシピ

yum/recipes/default.rb

template "/etc/yum.conf" do
  node[:excludes] = []
  source "yum.conf.erb"
  owner  "root"
  mode   0644
end

yum/templates/default/yum.conf.erb

[main] cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release

#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

まぁこんな感じですよね。
んで、アップデート対象にしてほしくないcookbookのrecipeに

redis/recipes/default.rb

#
# Cookbook Name:: Redis
# Recipe:: default
#
# Copyright 2011, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "tcl"

bin = "/usr/local/bin/redis-server"
version  = node[:redis][:version]
file = "redis-#{version}"
url = "https://redis.googlecode.com/files/redis-#{version}.tar.gz"
installed_version = `#{bin} -v 2>&1`.chomp.split(/\s/)[3]
log "installed version: #{installed_version}"
do_install = ( version != installed_version )


remote_file "/tmp/redis-#{version}.tar.gz" do
  source "#{url}"
  mode "0644"
  only_if { do_install }
end

bash "install_redis" do
  cwd "/tmp"
  code <<-EOH
  tar zxvf #{file}.tar.gz && cd #{file} && make && make install && cp utils/redis_init_script /etc/init.d/redis && mkdir /etc/redis/ && cp redis.conf /etc/redis/6379.conf
  EOH
  only_if { do_install }
end

file "/tmp/#{file}.tar.gz" do
  action :delete
end

node[:yum][:installonlypkgs].push("redis")

ということで

node[:yum][:installonlypkgs].push("redis")

こんな感じで、アップデートしたくないパッケージ名をpushして突っ込んで
yum_excludeというcookbookをつくります。

yum_installonlypkgs/recipes/default.rb

template "/etc/yum.conf" do
  source "yum.conf.erb"
  owner  "root"
  mode   0644
end

node[:yum][:installonlypkgs].push("kernel, kernel-bigmem, kernel-enterprise, kernel-smp, kernel-debug, kernel-unsupported, kernel-source, kernel-devel, kernel-PAE, kernel-PAE-debug")

yum_installonlypkgs/templates/default/yum.conf.erb

[main] 
cachedir=/var/cache/yum/$basearch/$releasever 
keepcache=0 
debuglevel=2 
logfile=/var/log/yum.log 
exactarch=1 
obsoletes=1 
gpgcheck=1 
plugins=1 
installonly_limit=5 
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum 
distroverpkg=centos-release 
 
#  This is the default, if you make this bigger yum won't see if the metadata 
# is newer on the remote and so you'll "gain" the bandwidth of not having to 
# download the new metadata and "pay" for it by yum not having correct 
# information. 
#  It is esp. important, to have correct metadata, for distributions like 
# Fedora which don't keep old packages around. If you don't like this checking 
# interupting your command line usage, it's much better to have something 
# manually check the metadata once an hour (yum-updatesd will do this). 
# metadata_expire=90m 
 
# PUT YOUR REPOS HERE OR IN separate files named file.repo 
# in /etc/yum.repos.d 
 
installonlypkgs=<%= node[:yum][:installonlypkgs].join(", ") %> 

という感じでyum_installonlypkgsを追加する用のrecipeを用意することで
対応できそうって感じです。

kernel, kernel-bigmem, kernel-enterprise, kernel-smp, kernel-debug, kernel-unsupported, kernel-source, kernel-devel, kernel-PAE, kernel-PAE-debug

この一覧は、自分で指定しない場合はデフォルトで入ってるけど、自分でyum_installonlypkgsを指定する場合は
自分で追加してね。という一覧ですね。

正規表現が使えないのがアレですけど、直接的に指定できるから問題なさそう。
マニュアル読むと新発見があって面白いです。

正しい方法を追記:2014/02/26


ひろせさんの方法が正しい方法なので、バージョン固定したい場合は
versionlock.listを利用しましょう。

thanks @lamanotrama, @hirose31, @hiboma !

yumでインストールだけしてアップデート対象には入れたくないパッケージはinstallonlypkgsで指定すると良い話

[chef][yum] yumでインストールだけしてアップデート対象には入れたくないパッケージはinstallonlypkgsで指定すると良い話

正しい方法を追記:2014/02/26


ひろせさんの方法が正しい方法なので、バージョン固定したい場合は
versionlock.listを利用しましょう。

thanks @lamanotrama, @hirose31, @hiboma !

筋の悪い方法


yum.confでアップデートしたくはないけどインストールはしたい場合のexcludeするためのrecipeとtemplate

というエントリーを書いたのですが、yum.conf(5)のマニュアルページを読んでいると

installonlypkgs List of package provides that should only ever be installed, never updated.  Kernels in particular fall into this category. Defaults to kernel,
kernel-bigmem, kernel-enterprise, kernel-smp, kernel-debug, kernel-unsupported, kernel-source, kernel-devel, kernel-PAE, kernel-PAE-debug.

という感じで書いてあって、マジかー!となったので
早速recipeを変更しました。まずはyum.confをつくるレシピ

yum/recipes/default.rb

template "/etc/yum.conf" do
  node[:excludes] = []
  source "yum.conf.erb"
  owner  "root"
  mode   0644
end

yum/templates/default/yum.conf.erb

[main] cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release

#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

まぁこんな感じですよね。
んで、アップデート対象にしてほしくないcookbookのrecipeに

redis/recipes/default.rb

#
# Cookbook Name:: Redis
# Recipe:: default
#
# Copyright 2011, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "tcl"

bin = "/usr/local/bin/redis-server"
version  = node[:redis][:version]
file = "redis-#{version}"
url = "https://redis.googlecode.com/files/redis-#{version}.tar.gz"
installed_version = `#{bin} -v 2>&1`.chomp.split(/\s/)[3]
log "installed version: #{installed_version}"
do_install = ( version != installed_version )


remote_file "/tmp/redis-#{version}.tar.gz" do
  source "#{url}"
  mode "0644"
  only_if { do_install }
end

bash "install_redis" do
  cwd "/tmp"
  code <<-EOH
  tar zxvf #{file}.tar.gz && cd #{file} && make && make install && cp utils/redis_init_script /etc/init.d/redis && mkdir /etc/redis/ && cp redis.conf /etc/redis/6379.conf
  EOH
  only_if { do_install }
end

file "/tmp/#{file}.tar.gz" do
  action :delete
end

node[:yum][:installonlypkgs].push("redis")

ということで

node[:yum][:installonlypkgs].push("redis")

こんな感じで、アップデートしたくないパッケージ名をpushして突っ込んで
yum_excludeというcookbookをつくります。

yum_installonlypkgs/recipes/default.rb

template "/etc/yum.conf" do
  source "yum.conf.erb"
  owner  "root"
  mode   0644
end

node[:yum][:installonlypkgs].push("kernel, kernel-bigmem, kernel-enterprise, kernel-smp, kernel-debug, kernel-unsupported, kernel-source, kernel-devel, kernel-PAE, kernel-PAE-debug")

yum_installonlypkgs/templates/default/yum.conf.erb

[main] 
cachedir=/var/cache/yum/$basearch/$releasever 
keepcache=0 
debuglevel=2 
logfile=/var/log/yum.log 
exactarch=1 
obsoletes=1 
gpgcheck=1 
plugins=1 
installonly_limit=5 
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum 
distroverpkg=centos-release 
 
#  This is the default, if you make this bigger yum won't see if the metadata 
# is newer on the remote and so you'll "gain" the bandwidth of not having to 
# download the new metadata and "pay" for it by yum not having correct 
# information. 
#  It is esp. important, to have correct metadata, for distributions like 
# Fedora which don't keep old packages around. If you don't like this checking 
# interupting your command line usage, it's much better to have something 
# manually check the metadata once an hour (yum-updatesd will do this). 
# metadata_expire=90m 
 
# PUT YOUR REPOS HERE OR IN separate files named file.repo 
# in /etc/yum.repos.d 
 
installonlypkgs=<%= node[:yum][:installonlypkgs].join(", ") %> 

という感じでyum_installonlypkgsを追加する用のrecipeを用意することで
対応できそうって感じです。

kernel, kernel-bigmem, kernel-enterprise, kernel-smp, kernel-debug, kernel-unsupported, kernel-source, kernel-devel, kernel-PAE, kernel-PAE-debug

この一覧は、自分で指定しない場合はデフォルトで入ってるけど、自分でyum_installonlypkgsを指定する場合は
自分で追加してね。という一覧ですね。

正規表現が使えないのがアレですけど、直接的に指定できるから問題なさそう。
マニュアル読むと新発見があって面白いです。

yum.confでアップデートしたくはないけどインストールはしたい場合のexcludeするためのrecipeとtemplate

chefでyum.confにアップデートしたくないパッケージをexcludeで記述したいけど
インストール前にexcludeしてしまうとインストールすらできなくなった。

どうにかならないかなーと考えた結果

 o rpmで対象パッケージが見つかればexcludeに追加
 o 見つからなければexcludeには入れない

という条件にすることで、問題は回避できることに気が付いたので
recipeとtemplateを書きました。

一応gistのURLも載せておきます。

https://gist.github.com/3906112

cookbooks/yum/recipes/default.rb

template "/etc/yum.conf" do
  node[:excludes] = []
  source "yum.conf.erb"
  owner  "root"
  mode   0644
  node[:yum][:exclude].each do |exclude|
    if `rpm -qa | grep #{exclude}` =~ /#{exclude}/  then
       node[:excludes].push(exclude)
    end
  end
end

cookbooks/yum/templates/default/yum.conf.erb

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release

#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

<% if node[:excludes] then %>
exclude=<%= node[:excludes].join(", ") %>
<% end %>

Rubyの書き方全く知らない状態でも
1日あればどうにか動く感じにまで行くもんなんだなーって思った。

( '-')-3

社内IRCがカビ臭くてピリピリしてたので癒し系botを投入した後、リマインダー機能を搭載した話

社内のだれからも+1みたいなリアクションされなくて切ないのですが
我が社の社内IRCにはunazu_kunというbotが生息しております。

みたいな感じで、モヒカンたちがうごめく殺伐としたIRCチャンネルに
どうでもいいことでも頷いてくれる癒し系のbotなのですが、
たまに心の潤いを求めて話しかける人はいるものの
あんまり役に立つ感じではなかったので、指定した時間になったら
メッセージをそのまま教えてくれるリマインダー機能付けてみた話です。

botPerlで動いてて、AnyEvent::IRC::ClientとかAnyEvent::DateTime::Cronとか使っていて
今回実装したのは、時間をkeyにして(例えば 10:00 => "1000"、9:9 => "0909")
valueを対象メッセージにする感じにしました。

my $r = Redis->new(server => 'localhost:6379');
$r->lpush($hour . $min => "$nick: $hour:$minだよー。");

みたいな感じでLPUSH。$hourと$minの中身は

$hour = sprintf("%02d", $hour);

などとして強制的に2桁で格納するようにしています(もっと優雅な方法ありそう)

Redisは(L|R)PUSHでLIST型で登録すれば
同じ時間にいくつもメッセージが貯めておけるので便利ですね。
メッセージがあるかないかも

$type = $r->type($key);

if ("list" eq $type) {
    ...
}

keyのtypeがlistであれば真みたいな回し方でできます。
値があれば

$message = $r->rpop($key);

という感じでvalueを持ってくるようにしました。

このようにvalueがなければ(LIST値として戻り値がなければ)
実行されないのでコストがかからなくて良い感じです。

一応 00:00 になったら flushall で全てを無に返すぐらいのカジュアルさを持って
データの肥大化を避けています。そもそもリマインダーは
時間と分しか指定できないので、当日以外の値を持っていても仕方ないのでそうしています。

本当はソース晒した方がいいのですが、なにぶんビールドリブンで酔いながら
リマインダー機能追加したので、今でも何が書いてあるのかよくわかってないところがあります。

Perl初心者ながら、短時間でこれぐらいの実装できるようになったのは、
天女が降りてきて岩を羽衣で撫でるぐらいの進歩はあるのかなーと思ったり思わなかったり。

こういう無駄機能追加できるの、社内IRCbotならではな感じしますので
社内IRC持て余していたら、実務的なbotももちろん良いですが
変なbot生息させるのも面白いのではないでしょうか。

...

( '-')-3

YAPC::Asia 2012に行ってきました

YAPC::Asia 2012に行ってきました

YAPC(カミさんは最後までヤーピックどうだった?って聞いて来ました)に初めて参加しました。
前から存在は知っていたのですが、Perl書いたことないし、色々おっかなそうな人もいるからと
敬遠していたのですが、会社からの発表者もいたり
Perlを書き始めて半年ぐらい経ったので参加させてもらいました。

運営のかた、スタッフのかた、お疲れ様でした。
とても楽しかったです。

特にLT-THONは生の空気感がすごい良くて、滑ろうが
Perlに関係なかろうが、発表したいことがあるんだッッ!!という熱量を
連続して発表し続けていく感覚がすごい興奮しましたし、とてもおもしろかったです。


1日目が成功したからこそ2日目のたくさんの飛び入りもあったりして
2日間通して、とてもおもしろかったです。@uzullaさん、hachioji.pmのみなさん、おつかれさまでした。

LT-THONでは@__gfx__さんの「正規表現」の発音が気になりました。


個人的には、マサカリ集いの会でお会いしたモヒカンマサカリ系の方々と面識はあるものの、
この人たちはコミュニティへ今までたくさんのアウトプットをしてきた人たちであって、
自分は何も貢献していないのに何故ここにいるんだろうと
自分の存在が意識ごと消し飛べばいいのにと思う瞬間は数え切れないほどありましたが、
それでも気軽にお話しして頂いたり、@myfinderさんからは超絶coolなFreakOutTシャツを頂いたりして
本当に有り難い限りでした。


ちなみに第二回はマサカリ系の方はあまり参加されないそうなので、
色々と相談したいことがある方は、相談がてらに仲間を探してみるといいかもです。

Monitoring Casual Talk #2

いつもGoodOps的なブログで刺激受けてる@toritori0318、@hogemさんにもお会いできて
とてもうれしかったです。

Perlコミュニティの人たちはとても仲が良くて、同窓会という言葉がまさにそれだなーと感じたのですが
その関係性は、決して与えてもらうだけの一方的な関係ではなく、与えること、貢献することで認められ
与えるからこそ与えられるというとても素晴らしい世界だなーとも思ったりしました。

来年もヤーピック開催されるようなら、せっかく生きてるんだし
何か発表できるように頑張って生きたいなと思いました。

( '-')