コンピュータやソフトウェアのあれこれ@道民(&元道民)
Archive for 8月, 2011
第3回アジャイルサムライ読書会 @札幌道場 開催
8月 31st
第3回アジャイルサムライ読書会 札幌道場を開催しました。
参加者は6名。今回も濃密なディスカッションの時間となりました。
今回は第3章まで。
現実の壁を目にしてちょっと心が折れかけましたが、最後には前向きな答えを見つけられた気がします。
話し合った内容は、github – agile-samurai-ja / supportのwiki
にまとめてあります。
わりとがんばってまとめているので、今後の途中参加や飛び飛び参加も大歓迎です。
今回の範囲で「グっときた」ところ
自分のありのままの姿を受け入れられるだけの度量があり、人と分かちあうことをためらわず、お互いに学びあって成長することを心から楽しめる
生きた成果物
読書会として
君は、アジャイルチームのメンバーになれる技量があるか?
あー、まだまだだ、というか、無理だ。全然足りない。
読書会の前半でけっこう心折れそうになりました。
でも、皆さんとディスカッションしているなかで
- 今、自分は場外ホームラン級の圧倒的なアジャイルプロジェクトの姿をみているんだ
- 足りないところを探していこう
- 身近で実践できるところをできるところから
- 気持ちや心がけ、目的だけは見失わないようにする
と、前向きにシフトチェンジすることができました。
「自分のありのままの姿を受け入れ」てあきらめないようにする。
一人で読んでいて、一人でこのことに気がついたら、そのまま本を閉じていたかもしれません…感謝。
また、今回の読書範囲に書かれていた「プロジェクトをはじめる時にこんな質問をしてみたらどうだろう?」は、最近新しいプロジェクトに入ったので実際にやってみました。
意識の共有はもちろんですが「自分たちは同じチームとしてやっていく、やっていこうね」という気持ちになれた気がします。
インセプションデッキにもある「我われはなぜここにいるのか?」と同様、メンバーとして「突然アサインされる」ことが多々ある現実で、モチベーションを上げていくのにとても必要なことだなと感じています。
(この気持ちを持続させるためには”生きた成果物”を大事に持続させなければいけないと思っています)
運営の立場で
運営はだいぶ慣れて、気負いなくできるようになりました。
ただ、頭があまり働いていなかったのか、wikiのまとめとディスカッションへの参加が中途半端になってしまったところがありました。
両者のバランスが今後の課題です。
ただ、wikiにまとめるのはだいぶ早くなった(日付が変わる前にできたし)。
内容をもう一回理解するのにもすごく役に立っているので、無理せず続けていきたい。
事前の読み込みをもうすこししっかりした方が余裕を持ってのぞめるのかもしれない。
最後に。会場を提供していただいた弊社に感謝。
今回はまだお仕事をされていた方もいたので大変恐縮です。
ありがとうございます。
次回もよろしくお願いします。
Hokkaido.cap #5 に参加してきました
8月 30th
パケットの中身を解析して学ぶ Hokkaido.cap #5に参加してきました。
今回は、嬉しいことがありました。5回目にしてやっと、勉強会についていけるようになりました。
ネットワークの遅延と戦う(後編)
ネットワークが遅延するケースのパケットを読み解きました。
以下について、どのようなパケットになるか・どうやって解析をするかを学びました。
- BitTorrentによる通信の占領
- PSHフラグ→受信バッファをスキップしている=処理が優先されている
- [Statistics] → [Conversations] で通信全体の傾向やノードごとの対話状況を見る
- DNSの通信名でノードの名前が解決できることがけっこうある
- Endpoints 機能で通信料の多いノードを特定できる
- ワームに感染して大量のスパムメールを送っている
- POPはテキストベースなので中身が見える
- Analyze -> Follow TCP Stream
- 怪しいファイル名を見つけたら検索してみる(有名なワームであれば出てくる)
- Gnutellaによる通信の占領
- [Statistics] → [Conversations]で怪しい通信を見つけたら成功している通信で手がかりをつかむ
- TCPタブ → 成功している通信(パケット量が多い)でフィルタをかける
初めて、パケットをさわりながら「あ、なんかここが怪しいぞ」と感じることができたのが大きな前進です。
しかし実際にネットワーク遅延にであった時は、実際のキャプチャデータでは似たようなパケットが大量に記録されているのでもっと嗅覚が必要そうです。
CTFにチャレンジ
パケット解析のCTFオリジナル問題にチャレンジ。
前回に比べてレベルをかなりさげてくれたのもあり、いいところまで自力で進めることができました。
(まあ、解けなかったんですけど)
パケットキャプチャ勉強会で、CTF問題にチャレンジすると毎回某すもけさんのレア画像をゲットできます!
少しずつパケットに慣れてきた。
会社から本も借りたし、次回もがんばりたいと思います。
[perl+web]Amon2のソースを読む(5)
8月 29th
今日はAmon2-2.49のDSL周り。これで最後。
Amon2::Declare
$c じゃなくて c() 使えたらいいよねって話。内容物の中では、t/ 内のExtended::V::MT::Context にて、テンプレからcを呼び出せるようにするために使っている。
Amon2::Lite
Sinatra-ish な書き方ができるようにするもの。Amon2::Lite::_child_N という名前でコンテクストクラスを作る。Nは連番なので、package名さえ分ければ複数箇所から利用が可能*1。
use 元にはルーティングに必要な関数をエクスポートする。2.49 の実装では Router::Simple::Sinatraish は使わずに自前で実装している。さらにコンテキストにはdispatch と create_view が必須なのでこれらを実装。create_view では__DATA__ セクションを読むために初回呼び出し時までテンプレのロードを遅らせている。このときにuse 側のくらすにcreate_view メソッドを生やし、ロードが複数回走らないようにしている。デフォルトで作成されるビューは TT2Like。また、Liteではconfigディレクトリが無い可能性があるので、config/ ディレクトリが無くても落ちることがないようにload_config() メソッドを上書きしている。
その他
create_view で作成されるテンプレートにはrender メソッドが要求されるため、Xslate 以外のテンプレートを使うときにちょっと困るが、その場合はTiffany を経由させるとよい。その辺はLite の PODや t/apps/Extended のExtended::Web 辺りを見ればわかる。
*1:Plack::Util::load_psgi を使えばpackageは自動的にサンドボックスの中になる
MySQLが起動しない
8月 28th
phpを5.3.6から5.3.8にアップデートしようと思って、
phpとmysqlをアップデートしたら、
mysqlだけ、restart出来なくて涙目になったお話をします。
ログ(”/var/log/mysqld.log”)を見ると、Abortingの前に、
[ERROR] /usr/libexec/mysqld: unknown variable 'default-character-set=utf8'
と、書き込まれていて、”/etc/my.cnf”が怪しいご様子。
お願いgoogle先生!っていう訳で、
結果的に、default-character-setは廃止になったみたいなので、
以下のように修正。
#default-character-set=utf8
character-set-server=utf8
無事起動しました。
ちなみに、MySQLは5.5.15になりました。
追記(8/29)
[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
って出てたのを無視してたので、”mysql_upgrade”を実行して、
無事、アップデートを完了しました。
おしまい。
アジャイル札幌『レトロスペクティブ編』
8月 28th
アジャイル札幌『レトロスペクティブ編』
アジャイル札幌の2回目の集まりでした。テーマは「レトロスペクティブ」。欲張りすぎずにやることを絞ったおかげで、だいぶ良い時間を過ごせたんじゃないかと思います。参加いただいた皆様、ありがとうございました。
ぼく自身は、鈴木さんの事例紹介やワールドカフェでのみんなとの話を通じて、自分のチームのふりかえりについてきちんとふりかえれたことがよても良かったなあ。まだまだこれから。
[perl+web]Amon2のソースを読む(4)
8月 28th
今日はAmon2-2.49のTriggerとPluggin。
Amon2::Trigger
クラスに対してもインスタンスに対してもフックがかけられ、それぞれ@Class::_trigger と $obj->{_trigger} を使って保存される。get_trigger_code を呼ぶと関連するハンドラを全て取得できるが、インスタンスに対して呼んだ場合はインスタンスに紐づくハンドラとそのクラスの継承ツリー上のクラスにぶら下がる全てのハンドラを得られる。ハンドラは親→子の順に並んでいる。厳密な順序に関しては、mro::get_linear_isa を使っているので現在設定されているmroの影響を受ける。
Amon2::Plugin::Web::
プラグインは $c->add_trigger でトリガを仕掛けたり、$c にメソッドを生やしたりしてYourProject::Web クラスを拡張する。
Web::FillInFormLite は$cにfillin_form メソッドを生やしてくれる。このメソッドに値をセットしておくとHTML_FILTER トリガーでフォームに値を埋めてくれる。
Amon2::Plugin::Web::NoCache はPragma とCache-Control ヘッダを設定するもので、AFTER_DISPATCH トリガーで処理される。
CSRFDefender はCSRF防止用のプラグインで、Sessionプラグインとの併用が前提*1。HTML_FILTER トリガーで<form>を見つけたら csrf_token というhiddenのinput要素を埋め込み、ここにセッションに保存されているトークンを埋め込む。BEFORE_DISPATCH トリガー内でPOSTされてきた*2トークンとセッション内のトークンを比較し、異なる場合は403ステータスで落とす。または手動で管理したい場合は、load_plugin 時の設定で no_validate_hook => 1 を渡してPOST時の自動チェックを抑止し、$cにget_csrf_defender_token と validate_csrf が生えているのでこれを使う。
HTTPSession は$cにsession() メソッドを生やし、こいつを呼ぶ度にHTTP::Session->new してインスタンスを作る。作られたインスタンスは$c->{'HTTP::Session'} に保管される。AFTER_DISPATCH トリガーで最後にresponse_filter と finalize する。HTTP::Session::Store:: と HTTP::Session::State:: はload_plugin 時に指定しておく必要がある。
PlackSessionとJSON はscaffold のコードではロードされない。PlackSessionは$cにsessionメソッドを生やして処理はPlack::Session にお任せ。
JSON は$c にrender_json を生やしてくれる。長いように見えるが、やっていることはブラウザごとのバットノウハウとセキュリティ絡みの考慮。Chrome表示の振り分けに利用されている X-Requested-With はjQuery などのフレームワークがセットする物なので、素のXMLHttpRequest を使う場合はこのヘッダをセットしてリクエストするようにしたほうがよい。
斜視手術(後転法)を受けてきた
8月 28th
後転法と呼ばれる手術で、眼球を動かしている筋肉の位置をすこしずらす手術です。
詳しくは「斜視 後転法」とかで検索してみてください。
手術自体は全身麻酔で行いました。ただ麻酔科の先生が@nazoにそっくりだったので、ものすごい絶望感で死んでしまうのではないかと思いましたが、僕は今生きていますwww
また、全身麻酔なので入院が必要でしたが、三日間だけです。
手術の前日に入院して、診察や、食事制限を行います。
翌日の朝一(09:00)に手術して、気づいたときには部屋のベットに寝てました。
全身麻酔に超絶びびっていたのですが、一度経験してしまえばこんなもんかという感じです。
眼帯もしていたのですが、手術当日の夕方には外してもらいました。
後転法なので、眉間側の白目が出血で赤くなっていますが、そんなにひどくありません。
糸が残っているのでちょっと目がちくちくします。溶ける糸を使っているので抜糸はないです。
ネット上の情報を見てると1-2週間ぐらいは洗髪などもダメと言われているケースがあるみたいですが、僕は普通に退院後の翌日からであれば、水泳とかしなければ、普段の生活通りで構わないと言われました。
※ ちなみに担当医がイケメンでした。
そんで退院して、いま職場でブログを書いているわけです。←
結果はとても良好です。かなり複視が改善されています。というかほとんどないです。
はじめ斜視と診断されたときは、見た目的にそんなことないのにと思っていたのですが、斜視にもいろいろとあるみたいで、どうも複視で困っているという人がいたら、斜視専門の眼科がある病院に行ってみるといいと思いますよ。
詳しくない医者だと、「視力が悪いだけ」とか「メガネになれてないだけ」とは言われかねませんからね(経験談)
YAPCへの道(3)
8月 26th
無事、トークが採用されました。
「いいね!」や「+1」していただき、ありがとうございました。
今月、来月は準備に励む予定です。
そんなコトより、チケットが残りわずかかもしれないので、
行こうか悩んでる方は、早めに決断をした方が良いかもデス。
こちらから買えるみたいですよ。
という訳で、今回はYAPC::Asia TOKYO 2011の告知だけ。
おしまい。
[perl+web]Amon2のソースを読む(3)
8月 26th
今日はAmon2-2.49のscaffoldとDispatcher。--flavor=Basic が基本なんで、それを読む。
概要
scaffold 内のPerl関連のファイルはapp.psgiとYourProject.pmとYourProject::Webと YourProject::Web::Dispatcher だけ。実際のユーザ側の処理は YourProject::Web::Dispatcher がディスパッチした先に書くことになるので、Dispatcher.pm に直接書くか、YourProject::Web::C 以下のクラスに書くことになる。
YourProject::Web::Dispatcher を書くために Amon2::Web::Dispatcher::Lite と Amon2::Web::Dispatcher::RouterSimple が提供されているので、これも一緒に見る。
なお、 YourProject::Web::Dispatcher を使う気がないなら、Amon2::Web->dispatch に直接処理を書くこともできる。そうすると、--flavor=Minimumの構成となる。
app.psgi
YourProject/app.psgi では、robot.txtとfavicon.icoと/static/ をPlack::Middleware::Static へ渡して静的に処理させている。また、Plack::Middleware::ReverseProxy が入っていることからリバースプロクシの裏での動作を前提としていることがわかる。必要に応じてenable_if でReverseProxyを有効にするアクセス元のホストを指定するように変更するのもよいだろう。
YourProject.pm
YourProject クラスはAmon2 クラスを継承したコンテキスト。WEBに特化しない処理はここに書くとよい。例えば、DBIプラグインのロードとか。
YourProject::Web
YourProject::Web ではYourProject クラスを継承してコンテキストとして振る舞うとともに、Amon2::Web をMixinとして取り込んでWebの機能を提供する。このクラスの最も重要な仕事は Amon2::Web が要求するdispatch と create_view を実装すること。create_view は初期化したXslate を返すように実装されており、テンプレから c という変数でカレントコンテキストにアクセスできるようにしている。他、テンプレへはuri_with とuri_for のショートカットも提供。dispatch メソッドの実装はYourProject::Web::Dispatcher->dispatch に投げるだけになっている。
YourProject::Webにはその他に、YourProject::Web::C:: にあるコントローラを全部ロードしたり、プラグインを読み込むコード、フックの定義などが含まれる(が、デフォルトのscaffoldだとAmon2::Web::Dispatcher::Lite を使ってるので、C::以下のクラスを定義する必要はないように思える)。
YourProject::Web::Dispatcher
デフォルトではAmon2::Web::Dispatcher::Lite を使ってディスパッチするコードが書かれている。eg/ ディレクトリには Amon2::Web::Dispatcher::RouterSimple を使った例が入っている。::Liteも::RouterSimple も定義したルーティングに対して __CLASS__->dispatch($c) というコンテキスト$cを受け取るメソッドを作ってくれるので、scaffoldでYourProject::Web 内に生成されるコードと相性がいい(そういう風にscaffoldが作られてるのだから当たり前だけど)。
Amon2::Web::Dispatcher::Lite
use Router::Simple::Sinatraish するのと同じになるよう、import 関数内で Sinatraish->export_to_level(1) で関数類をエクスポートしている。追加でコンテキスト$cとルーティング情報を結びつける糊のコードとして、前述のdispatch メソッドを定義している。この糊は、 $envに対してmatchを実行して、選択された処理を$cとマッチング結果を引数として呼び出す。URL内にパターンを指定したなら、この第二引数のマッチング結果から参照できる。
Amon2::Web::Dispatcher::RouterSimple
このコミットの辺りからこのクラスは表立っては使われなくなったので、あまり推奨しない方向に進んでるのかもしれないけど一応読む。
Router::Simple をDSL的に使えるよう、connect、submapper、match、as_stringを関数としてエクスポートしている。これらの処理の主役となるインスタンスはrouter関数で取得できる。connectはRouter::Simpleのものより少し拡張されていて、"コントローラ名#アクション名"という指定もできる。この指定の場合の \%destination は、{controller => コントローラ名, action => アクション名}と解釈される。
dispatch がコンテキスト$cとマッピングを結ぶ糊で、"コンテキストクラス名::C::コントローラ名"というクラスのアクション名のメソッドを呼ぶ。コンテキストクラスの名前は、通常はYourProject::Web となるはず。PODにも書いてあるが、コントローラ名とアクション名はmatch()結果のcontrollerとactionを使うので、パターンに:matchや:controllerを書いておくとURLを元に自由に指定させられる(使いどころは少ない気がするけど)。
ディスパッチされたメソッドには、Liteの時と同じようにコンテキスト$cとmatch()の結果が渡されるので、これを使って処理を書く。
LOCALの正会員になりました
8月 26th
本日の定例会で承認を得て、一般社団法人LOCALの正会員になりました。
LOCALの存在を知ったのが2008年くらい。
LOCALの皆様と関わるようになったのが2010年くらい。(たぶん)
昨年末の札幌Ruby会議のスタッフ経験と、今年のOSC北海道のスタッフ経験を経て
「イベントなど人と人とが交流する場所を作っていきたい」
と強く思えるようになったので、正会員になろうと思いました。
4年かかったのは長いようで、自分には必要な、適切な時間だったと思います。
ここ数年の気持ちや環境の変化によって、たどり着いたという感じがしています。
勉強会などは参加する方が多く、何かを劇的に変えていきたいという気持ちはそんなにないのですが、
自分が初めて勉強会に参加した頃の戸惑いや苦労が少しでも減るように、
楽しい場所や空間を作っていくお手伝いができたらな、と思っています。
よろしくおねがいします。
※本当はまだ会費を払っていないので真の正会員ではないです…