Road To Nowhere

主にWebまわりのエンジニア的なお仕事に関するようなことのあれこれ。

Fluentd Casual Talks #3 に参加してきた

Fluentd Casual Talks #3
http://atnd.org/events/45386

こちらに参加してきたメモ。
インフラ寄りの勉強会的なのものって多分今まで参加したことないので若干アウェー感を感じつつも初ヒカリエでテンションもあがるという不思議な気分で。

@tagomoris norikraの話

Fluentd Casual Talksを主催されている @tagomoris さんの発表。norikraというのはSQL風にデータを加工できるというもの。
fluentd初心者の僕には使い方がよく分からない部分もあったが、group byできるところに可能性を感じた。

発表資料
http://www.slideshare.net/tagomoris/fluentpluginnorikra-fluentdcasual

@sonots Fluentdでshadowサーバ用意したら捗った話

DeNA @sonotsさんの発表。DeNAでは152プロセス、1秒で10万行ということでかなり活用してるな。fluentd.confが2万行というところもびっくり。

発表スライド
http://www.slideshare.net/sonots/shadow-fluentdcasualtalks-20131213

@stanaka fluentd go implementation

はてな @stanaka さんの発表。goでfluentdを実装している。楽しそうな試み。期待大。

@okahashi117 Windows版fluentdで幸せになれますか

Windows版fluentdのコミッターのお二方の発表。実際にWindowsでfluentdを動かしたデモでは「おー」と歓声があがった。検討を祈ってます。

@kzk_mover モニタリングについて

TreasureData 太田さんの発表。発表中にTreasure Agent Monitoring Serviceというのをリリース。

@kenjiskywalker 増えすぎた設定ファイルの行数をどうするか。みたいな話をChefのcookbookとくっつけて

けっこう早足の発表でついていけない部分があったけど発表された方のエントリーがあったのでじっくり復習しよう。

発表に関するエントリー
http://blog.kenjiskywalker.org/blog/2013/12/14/fluentd-casual-3/

@yoshi_ken Fluentd as a Middleware Engine

リブセンスの方なんですね。MySQLからElasticsearchに対してデータをレプリケートするのにfluentdを使っているという話。MySQLからデータを引っこ抜くところはかなり需要があるんじゃないかな。

@bash0C7 ご家庭でfluentd

5分という短い時間だったけど、単にログを収集するだけではないfluentdの様々な使い方を感じさせてくれる楽しいお話しだった。

発表に関するエントリー
http://d.hatena.ne.jp/bash0C7/20131213/fluentd_casual_talks_3_and_advent_calendar

@kazegusuri OutputとBufferedOutputの間をうめる

OutputとBufferedOutputを擬人化して展開する楽しい発表。

発表資料
https://speakerdeck.com/kazegusuri/outputtobufferedoutputfalsejian-falsehe-ka

@choplin postgres関連の何か

mongodbが運用しにくいのでpg_msgpackというのでpostgresに保存してみたというお話。

@frsyuki Fluentd v11について

ここでもライブリリース。v11はかなり使えそうな機能が多いなという印象。
http://www.slideshare.net/frsyuki/whats-new-fluentd-casual-talks-3

初めて #rubykaigi に参加してきた。苦い思い出の2日目。

さてrubykaigi 2013 2日目のレポート、3日遅れてのエントリー。
初日は英語のセッションで軽く睡眠学習したので、この日はだいぶ英語分かるようになったんじゃないかなって思ったけど、現実はそんなに甘くなかった!

High Performance Rails

http://rubykaigi.org/2013/talk/S76
朝一発目はcookpadの @mirakui さんのセッション。
railsで作られたサービスの代表格cookpadでパフォーマンスに責任を持っている方ということで説得力が違う。

  • production.logのCompleted timeよりX-runtimeを指標にすべき。
  • route.rbの参照が遅いのでlink_toの使い方によって100倍速度が違う。(URLを直接渡した方が早い)
  • active record のオブジェクト作成が遅いのでたくさん作るような処理は避けるべき。
  • unicorngc.disable

などなど超実践向き。
今passengerで運用してるんだけどcookpadに合わせてunicorn検討しようかな。
独自の道を歩むよりもcookpadのノウハウを最大限利用させていただきたい所存です。
いやいかしcookpadのパフォーマンスに対する意識の高さには驚いた。

Continuous gem dependency updating with Jenkins and Pull Request

http://rubykaigi.org/2013/talk/S72
次も興味深い内容で、利用しているgemをどうやって更新し続けていくかというお話。
gemは日々更新されていき依存関係もあるので更新をついつい放置しがち。ただ放っておいてまとめて更新しようとすると工数やリスクが増すので不利益は明らか。継続的に更新していくことが大事だがどうやるかという内容。
スピーカーの刺身さんは自動化と可視化が重要だということで、jenkinsでbundle outdatedを自動で行い、更新があれば通知するという仕組みを作った。
スルーしがちなメールじゃなく、プログラマーなら放っておけないpull requestで通知するようにしたとのこと。
こういう日常のささいな作業(本当はささいじゃないことが多い)を工夫する姿勢が素晴らしい。見習いたい。

Security is hard, but we can’t go shopping

http://rubykaigi.org/2013/talk/S43
英語のセッション。いやー完膚なきまでの完敗。
http://togetter.com/li/511510?page=2
togetterでまとめてくれているのでこちらを見ながら思い出そうとしてみるもなかなか。
セキュリティの問題が見つかったら一般公開する前に本人(運営者)にまず伝えよう、って言ってたくらいしか記憶にない。
完敗。以上。

Ruby on Your Rails

http://rubykaigi.org/2013/talk/S84
こちらruby新参者の僕でも名前を聞いたことあるレベルの松田さんのセッション。
しかしここでも英語!まじかい!
where.not、where.like、where.not_likeを提案してwhere.notは採用されたとか。
action_argsを提案したりとか、自分でどんどん提案して、自分の使い勝手がいいように働きかけていこう、という内容。だったのかな。
https://github.com/asakusarb/action_args
しかし、英語で発表できるのすごい。

heroku弁当


ごちそうさまでした!

Concurrency in Ruby: In search of inspiration

http://rubykaigi.org/2013/talk/S80
基調講演だけど英語!完敗続きで精神的にもダメージが。。
http://gihyo.jp/news/report/01/rubykaigi2013/0002
gihyoにレポートがあがってる!ありがたい!
こんな話していたみたいだけど、、
英語はもちろんのこと技術的にもハードル高いのう!

続く。。。

初めて #rubykaigi に参加してきた。どきどき初日編。

ほんの数ヶ月前からrubyを書き始めた超初心者だけど、初めての rubykaigi 2013 に参加してきた。
平日でしかも忙しいこの時期に業務としての参加を許可してくれて、おまけにチケット代までもってくれた会社に感謝感謝。
しっかり色々吸収してこようと気合い満点!


The History of Ruby;20th Anniversary Ed.

http://rubykaigi.org/2013/talk/S57
まずは高橋征義さんのこちらのセッション。rubyの歴史ということで初心者にはもってこいの内容だった。
rubyは今年で生誕20年。そしてrubyが一躍脚光浴びることになったruby on railsの誕生からおよそ10年とのことだけど、個人的には意外と長い歴史があるんだなぁという印象。
今自分がrubyを使って快適に仕事できているのはそういう歴史があるからで、開発者のMatz氏にはもちろん、rubyを洗練し普及してこられたコミッターの方たちには本当に感謝したい。
今回のイベントにはMatz氏を初めrubyの歴史を作ってきた方たちがスピーカーとして多く参加していると紹介があり、rubykaigiはやはり一大イベントなんだなぁと改めて実感。
オープニングにふさわしいセッションだった。
そうそうスピーカーの高橋さん、まさか高橋メソッドの高橋さんだとは!びっくり。

Keynote - Yukihiro "Matz" Matsumoto

次はMatz氏の基調講演。
内容は氏のプログラム遍歴とどうやってrubyを開発したかという話だったんだけど、ほんと少年のように楽しそうにプログラミングや言語について話しされていて、聞いているこちらも楽しい気分になってくる素晴らしいスピーチだった。
ちょっと言い過ぎかもしれないけど、今自分がプログラミングに携わる仕事ができていることが幸せだなぁと思ってしまった。やはり希有な人物だなぁ。
「プログラミングは思考の表現」「プログラミング言語は思考のガイド」だとか、グサグサささってくる深イイ話も聞けたし、このスピーチだけでもこのイベントに足を運ぶ価値は十分あったと思う。
もしrubykaigiに参加してなくて、後日ネットでこのスピーチを動画で見たとしてもこんなに心には響かなかっただろうし。
逆ポーランド記法の逆、つまり逆逆ポーランド記法というのを思いついて大発見と思ったら実はそれがポーランド記法だったとか、会場が笑いの渦で僕も笑ったけど、あの場にいたからこそだよね。

heroku弁当


ごちそうさまでした!

TWO CARTOON FOXES: the _why documentary (Japanese Subtitled)

http://rubykaigi.org/2013/talk/S51
午後のセッションで一番印象的だったのはこの_whyのドキュメンタリー上映。恥ずかしながらrubyの歴史に_whyというスターがいることを知らなかった。
簡単に説明すると、rubyの普及に大きく貢献したアーティスティックなプログラマーで、人気が出てプライベートが脅かされ、2009年全てのサイトやコードを消し去ってネットから存在を消した人物。
ドキュメンタリーは_why自信が作成した音楽をバックに、彼を知る人々の証言と彼が作成したrubyガイドブック(というかその本に出てくる自身作の漫画)の紹介などをしながら彼のひととなりを追うような作り。
30分もない短い作品だったけど、こんなカッコいい人物がrubyの歴史に存在したのかと興奮したしとても見入ってしまった。多くのrubyistとともに見たという状況もあったのかな。とにかく素晴らしかった。
未完成なので公開しないと言っていたような気がするけど、もし見る機会があれば必見。

Ruby On Robots Using Artoo: A New Platform For Robotics, Physical Computing, and the Real World Web

http://rubykaigi.org/2013/talk/S64
そして次は、Artoo。多分会社のお金できている人はこのときAホールでやっていたruby2.1の話を聞くべきだったのかも。
でも個人的にはこっちで大正解だった。英語のセッションで通訳もないんだけど、通訳なんてまったく必要ない素晴らしいデモ。
rubyarduinoと連携してLED電灯をチカチカさせるのは序の口で、ボールをコロコロ転がしたり、ラジコンヘリのようなものを飛ばしたり。

写真はwiiのコントローラーでラジコンヘリのようなものを操縦して会場で飛ばしているところ。これrubyで制御してるからね。会場沸いたなぁ。コードは多分これ。
https://github.com/hybridgroup/artoo/blob/master/examples/ardrone_wiiclassic.rb
あー面白かった。もっとデモ見たかったなー。

まとめ

上記以外ではrubymotionとか、chef、awsvagrantを使った開発環境の構築の話とか、テクニカルなセッションも聞いたりもしたんだけど、なんせ英語で。
まぁリアルなスピードラーニングというか、初日なので耳を英語でならすので精一杯で。明日は英語もがんばる。
あと最後にrubyのコミュニティ紹介があったけど、やはりrubyは地方のコミュニティが活発だなと。
それぞれのコミュニティで活躍した人を表彰する ruby kaja っていう仕組みもより一層コミュニティ活性化に貢献するんだろうな。素晴らしい。
さて明日は2日目。今日もらったTシャツ着ていくぞ!(嘘)

PHPでクラスタ構成のmemcachedサーバを利用するときに気をつけること

ちょっとはまったけど解決してスッキリしたので共有。
今回発覚したトラブルは、
セットしたはずの値を取得できない
というもの。

環境はこちら。

memcachedクラスタ構成っていうのは

addServer('hostA', 11211);
addServer('hostB', 11211);
addServer('hostC', 11211);

こういう風に複数回addServerしているようなケース。

あまり珍しい環境ではないよね。中規模以上のWebサイトではよくある構成じゃないかな。これに加えてうちの特殊なところは、複数フレームワークが混在していてMemcachedオブジェクトの作成やaddServerしている箇所が複数あるところ。これもトラブルの元だった。
以下2点解決して正しく動作するようになったので、気をつけることとしてメモしておく。

その1、クラスタ構成は必ず統一すること!

これは複数フレームワークの混在が招いたことだけど、それぞれのアプリケーションでaddServerしているサーバに差分があった。当然と言えば当然。だけど、間違って理解していた部分があったので説明しておく。

アプリX

addServer('hostA', 11211);
addServer('hostB', 11211);

アプリY

addServer('hostA', 11211);
addServer('hostB', 11211);
addServer('hostC', 11211);

こういう状況のとき、アプリXでセットした値はhostA、hostBのいずれかに保存される。
このときアプリYではhostA、hostBも構成に入っているのでアプリXでセットした値は参照できるような気がしないかな?
答えはNO。クラスタ構成の場合、キーによって参照先(あるいは保存先)のサーバが分散されるので、hostAに存在する値なのにクラスタ構成が異なると、アプリYではhostBを参照しにいってしまって、結果取得できないということが起こる。
たまたま値が存在するサーバを参照する場合もあるけど、ヒットしたりしなかったりはこちらの期待している動作ではない。

さて、これで解決かと思ったが。

その2、memcached.hash_strategyを統一すること!

上記の問題を解決したところヒット率は多少あがったけれども、まだ取得できるはずの値が取得できないことがあった。
しばし調査の結果、アプリケーションサーバPHP動作環境に差分があったことが発覚。
あるサーバはmemcached.hash_strategyconsistentなのにあるサーバはstandardだった。
これはキーを元にどのサーバに保存するかのマッピングの方法を指定するもので、これが違うと同じキーでも当然参照先(あるいは保存先)のサーバが変わってくると。

詳しくはこちら。あまり詳しくないけど。
http://php.net/manual/ja/memcache.ini.php#ini.memcache.hash-strategy
クラスタ構成変更時に再マッピングの必要のないconsistentが正解でしょう。

php -i | grep memcache

これで確認できるのやってみるとよいかも。

まとめ

memcachedは導入も運用も簡単なので今まで苦労したことがなかったけど、今回思わぬ落とし穴にはまってしまったなという感じ。まぁでも勉強不足のたまものだな。反省。

エンジニアサポートCROSS 2013 #cross2013 に行ってきた

エンジニアサポートCROSS2016

今年は会社から終日OKの許可が出たので午前中からフル参戦。いくつかある会場で平行でセッションが行われていて、参加者は好きなセッションを聞きにいくというフェスのようなシステム。午前中の一発目に聞いたのはこちら。

HTML5 x セキュリティ

http://www.cross-party.com/programs/?p=143
パネラーの撮影やustream中継が禁止で行われたこのセッション。malaさんいるしね。HTML5で色々な機能が使えるようになったけど、悪用される恐れもあるんだよというのを実感させられるセッションだった。以下メモ。

  • HTML5 fullscreen APIを使ってのフィッシング詐欺怖い。(@takesako)
  • ブラウザにドラッグ&ドロップして画像を見るのは辞めた方がいい。意図せずアップロードされちゃうかも。(@Hamachiya2)
  • iPhoneのaudio要素での注意点。マナーモードでも音を出すことが可能。やり方によってはツイートなどの短縮URLをクリックしただけで意図しない音が!満員電車に乗ってるときなど狙われたら危険。(@Hamachiya2)
  • 今現在某ブログサービスでXSS発生中。直っていないのでオフレコ。document.domain注意。(@bulkneets)

あとはフリートークで脆弱性あるあるなど。

Q&Aで「スマホアプリを作ってるんだけどwebviewってどうですか?」という質問に対しては一同怖いよと。アプリから連絡帳やインストール済みアプリ一覧を取れたりする場合があるとのこと。csrfも多そうという見解だった。
次はお昼をはさんでスクラムのセッションを聞いた。

企業CROSS DeNA x グリー x Aiming: 大企業・ベンチャーが語る「スクラム」開発

http://www.cross-party.com/programs/?p=369
まず認定スクラムマスターのお三方から各社でのスクラムでの取り組み状況などを発表。

  • DeNA飯岡さん
    • スクラム導入前
      • 社員爆発的増加
      • 部署間の溝
      • よく分からないところからよく分からないタスク
      • 超人的な調整力で対応
    • 実際やってみても右往左往。バーンダウンチャートあがり続ける。チーム肥大化。ミーティングの長時間化。
    • よかったこと
      • クロスファンクショナルなチームができた
      • 優先順位の共通意識
      • 問題が浮き彫り
    • コーチを招いたり、勉強してスクラムの理解を深めることで成果が出て、今はほとんどのチームがスクラムで運用。
  • GREE林さん
    • スクラム導入以前
      • wikiで仕様やスケジュール作成
      • redmineでタスク管理
      • svnでコード管理
      • wikiでレビュー
    • スクラム導入へ
      • reviewboard、JIRA導入、fisheye(後git)導入
      • スプリント計画はチームでサブストーリー選択してサブタスク
      • 朝会、コードレビュー
  • Aiming小林さん
    • スクラムは「推奨」という扱い
    • ゲーム開発では仕様書どおり作ったらクソゲー。試行錯誤が必要なのでスクラムがマッチ。
    • 壁足りないくらい付箋張ってる。
    • 朝会、夕会、スプリント1週間、進捗の見える化(アナログ+デジタル)
    • マイルストーン毎に振り返り。
    • jenkins、ペアプロgithub
    • 難しさ
      • チームが分散してること(東京、札幌、大阪)
      • doneの定義が曖昧(ゲームは作ったら終わりではない。運用もある)

このあと司会のGoogle及川さんから導入、運用時にはまったことというお題に対して各社回答。

  • DeNA
    • まずは小さなチームでやって成果を出すのが重要。
    • 経営層と抵抗する理由を徹底的に話し合った。
    • 専任スクラムマスター必要。
  • GREE
    • スプリント計画を工夫する。
  • Aiming
    • 合意形成と方法論とは分けて考えた方がいい。合意形成の部分で炎上した場合スクラムが悪いというわけではない。

次にプロセス運用はアナログ?デジタル?というお題。

  • DeNA
    • アナログ
    • ツールを使いこなせない人がいる。コミュニケーション大事。
    • JIRAの一覧性がイマイチ。
    • チケットログは終わったら捨てる。サブタスクは残してもしょうがない。
    • 付箋紙が落ちる笑
  • GREE
    • デジタル
    • スプリント計画は時間がかかる。
    • JIRAが進化している。
    • 朝会、夕会は会議室のモニタに大写しにしてやる。設備重要。
  • Aiming
    • 両方

Q&Aにて「スクラムマスターの仕事って?ボトムアップじゃだめ?」という質問に対して各社回答。

  • DeNA
  • GREE
    • 技術リーダーなどとはロールを分けるのが理想。兼任は難しい。
    • チーム横断的な視点。
  • Aiming
    • 火消し=スクラムマスター
    • 雑務?付箋紙の発注。笑

次にどこまでチームに介入するか?という質問。

  • Aiming
    • フォロワーに徹する。質問をぶつけまくる。気付かせる。解決してもらう。
  • GREE
    • コードレビューを徹底。

最後にこれから導入しようとしている人へのアドバイスという及川さんからのお題。

  • GREE
    • 準備重要。研修でみんなに知識を深めてもらう。
    • JIRA,git,githubが三種の神器。
  • Aiming
    • 自立的なチームになっているかどうか。
    • 上が、プランナーがと言い出すと炎上のおそれ。そういう炎上したときにスクラムを提案するといいかも。
  • DeNA
    • スクラムの導入が目的ではない。
    • 振り返りでたくさんでてくる問題は一個ずつ解決する。
    • コミュニケーション量重要。席替え重要。絶賛。

これまでスクラムに対する知識は皆無だったんだけど、一気に身近になったような気がしたセッションだった。やっぱり生で話を聞くのはいいな。とにかくもう少しスクラムに対する知識を深めたいと思った。スクラムマスター目指してみようかな!
さてこのあとは個人的には楽しみにしていたセッションへ。

クラウドな働き方 x 介護 〜来るべき育児と介護をどうITの力で乗り越えるか!?〜

http://www.cross-party.com/programs/?p=129
まずは介護をとりまく状況について司会の小室さんから。

  • 人口が減少する、なかでも労働人口が減少していく
  • 2045 一人が一人を介護する時代
  • 東京周辺にITの仕事が密集
  • 親の介護のために地方へ帰るとITの仕事がない
  • 介護認定をもらうのに数年かかる。その間、自分で介護する必要があるかも。

このあとパネラー3名の発表。

田名辺さん(@dateofrock)

発表のスライド。
http://www.slideshare.net/dateofrock/ss-16055525
東京で20年以上働いた後、現在同じ会社に所属して札幌でテレワークしているとのこと。
移住した理由や事情をたくさん挙げられてましたが、

  • こどもにふるさとを残してあげたい
  • 311。当たり前だと思ってたことが当たり前じゃなかった。

こういったところに個人的にグッときた。めちゃくちゃ共感。
リモートで仕事する上で問題はコミュニケーションだが、SkypeGoogle Appsを利用して思ったよりスムーズだった。インフラは既に整っているし技術的敷居も低い。リモートで仕事ができるかどうかは技術の問題ではなく人の問題だと。
これは確かにそうだと思うし、きっと今後田名辺さんのような選択をする人が増え、珍しいことではなくなるんだろうなと思った。

相羽さん(@aibax)

発表のスライド。
http://prezi.com/3w-fqex4-cqj/cross-2013-x-it/
金沢でWeb制作等の会社を経営していたが、急に二人の両親を介護することになり介護認定の申請や入所先探しなどで苦労したお話をされた。相羽さんも田名辺さん同様、実家の近くに引っ越し、クラウドを利用して仕事をする環境を作った。
こういった両親の介護というのはみんながいつか通る道。そのとき仕事辞めますか?という問いはセッションを聞いていたみんなの心に突き刺さったんじゃないだろうか。

竹下さん(@DynaKou)

ほむさぽ(http://homesapo.com/)を運営。
介護事業を行っている会社でシステム担当をしていて施設を訪れたりしていたのがきっかけで介護業界に。
介護には暗いイメージがあるが実は明るい!漫画のヘルプマンはすごくリアルとのこと。Kindle版もありますね。早速ポチった。また介護甲子園、NPOもんじゅなどの活動を紹介していてこちらもすごく興味深い内容。エンジニアは介護の力になれる!とIT業界への期待も語っておられたのが印象的だった。


この後、司会の小室さん含めて介護とITとの関わりについてパネルディスカッション。介護の現状や介護に対するITの可能性などかなり深い内容に。個人的に印象的だったのは小室さんが言っていたこと。

  • いつか自分が介護される側になり子供に介護してもらうときがやってくる。そのときのために今より少しでもいい状況にしておきたい。

こんな内容だったと思うけど確かになぁと。介護を取り巻く状況をよくすることは親と自分のためだけでなく、子供達のためにもなるんだな。

まとめ

今回このイベントはクロス・交流というのがテーマになっているけど、普段の仕事ではまずクロスしない「介護」というテーマについて興味深い話を聞いて考えるきっかけになったことはすごくよかった。もちろん介護のセッションだけじゃなく、HTML5のセキュリティやスクラムというのも僕の普段の業務にはまだ直接関係のあるものでないけど、すごく興味深くて面白かった。
そうそう、あとプレミアムモルツの飲み放題!これはうれしいですね!これだけでもチケット代2000円の元とれるよ。
また来年も参加したいと思います。
関係者のみなさん、ありがとうございました。そしてお疲れ様でした。

Symfony2のログインに関するメモ

Symfony2で会員登録機能を開発していてハマったことがあったのでメモ。


Symfony2のセキュリティ機能はけっこう素晴らしくて簡単にログイン機能(ユーザーの認証と承認)を使うことができる。
セキュリティ | Symfony2日本語ドキュメント
このページをじっくり読みながらやればそれほど困ることはないと思う。


今回ハマったのは会員登録機能を開発しているときのこと。
ユーザーが会員登録のステップを終了した後、ログインフォームを経由せずにログインした状態にしてマイページへ遷移するという実装をしたかった。
このやり方がなかなか見つからなかったが、ようやく英語でいくつか発見。
Symfony2: How to log user manually? - Stack Overflow
php - Automatic post-registration user authentication - Stack Overflow
(最近、stackoverflowがよく検索にひっかかっるな)

$securityContext = $this->get('security.context');
$token = new UsernamePasswordToken($userEntity, null, 'secured_area', $roles);
$securityContext->setToken($token);

実際に実装したのはこんな感じ。
詳しくは英語で書いてあるけどいちおう注意点を言っておくと、UsernamePasswordToken()の2番目の引数はnullでOK。3番目の引数は'secured_area'はsecurity.ymlのfirewallsで設定している文字列。このドキュメントの例にならっているのであれば'secured_area'でOKだった。


2012/2/17、symfony2 ver2.0.10で再検証したところ、上記対応でセッションが永続されたので以下の対応不要です。
バージョンアップの影響から以前の検証方法が悪かったのかは調べていません。

さて、これで確かにログイン状態にすることはできたのだが、どこか他のページに遷移するとログイン状態を維持できない。
まさかセッションにuserのidをもっておいて毎ページで上記の処理をするわけにもいかないので調査続行。
最終的には上記のsetTokenのあと、下記のようにセッションに$tokenを保存してやれば、ログイン状態を維持できた。

$request = $this->getRequest();
$session = $request->getSession();
$session->set('_security_secured_area', serialize($token));

'_security_secured_area'の「secured_area」の文字列は、こちらも上と同様、security.ymlのfirewallsで設定している文字列。


調査にけっこう時間とられてしまったので、覚えておくと幸せになれるかも。

Q4Mインストールメモ

Q4Mをインストールしようとして調べたところたくさんの情報が見つかったけど、
みなさんけっこう苦労されていて、さらに解決方法も各々で定まっていない様子。

傾向として、MySQLQ4Mをソースからインストールすると手こずるようだったので、
MySQLrpmでインストール後、Q4Mのバイナリ版をMySQLに組み込むという方法でインストールした。

環境

  • CentOS 5.7
  • Q4M 0.9.5
  • MySQL 5.1.55 (2011/11/30現在、Q4M 0.9.5が対応している最新)

MySQLのインストール

MySQL5.1.55のrpmを以下のページからGET。
MySQL :: MySQL Product Archives

最低限必要なのは「MySQL-server-community-xxx」と「MySQL-client-community-xxx」
それとunameなどを見て環境に合ったものを選択。

wget http://downloads.mysql.com/archives/mysql-5.1/MySQL-server-community-5.1.55-1.rhel5.x86_64.rpm
wget http://downloads.mysql.com/archives/mysql-5.1/MySQL-client-community-5.1.55-1.rhel5.x86_64.rpm

rpmコマンドでインストール。

rpm -i MySQL-server-community-5.1.55-1.rhel5.x86_64.rpm
rpm -i MySQL-client-community-5.1.55-1.rhel5.x86_64.rpm

MySQL起動してみる。

/etc/init.d/mysql start

コマンドラインに入ってみる。

/usr/bin/mysql -uroot

MySQLの--with-fast-mutexesオプションがONかOFFかで、Q4Mのどのバイナリ版を使用するか決まるのでここでチェック。

 mysql> show variables like 'timed_mutexes';
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | timed_mutexes | OFF   |
 +---------------+-------+

これでMySQLのインストール終了。

Q4Mのインストール

以下のページからバイナリ版をGET。
Index of /dist

fast-mutexesがOFFだったので取得するのはwithout-fast-mutexesのもの。

wget http://q4m.kazuhooku.com/dist/mysql-5.1.55-linux-x86_64-glibc23-without-fast-mutexes-q4m-0.9.5.tar.gz

あとはおまじないのように以下のコマンドを実行。

tar zxvf mysql-5.1.55-linux-x86_64-glibc23-without-fast-mutexes-q4m-0.9.5.tar.gz
cd q4m-0.9.5-linux-unknown/
cp -f libqueue_engine.so /usr/lib64/mysql/plugin
install -m 755 support-files/q4m-forward /usr/bin/q4m-forward
cat support-files/install.sql | /usr/bin/mysql -uroot

エラーが出なければこれでインストール完了。

いちおう確認

 /usr/bin/mysql -uroot
 mysql> show plugins;
 +------------+----------+----------------+--------------------+---------+
 | Name       | Status   | Type           | Library            | License |
 +------------+----------+----------------+--------------------+---------+
 | binlog     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | partition  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | CSV        | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | FEDERATED  | DISABLED | STORAGE ENGINE | NULL               | GPL     |
 | MEMORY     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | InnoDB     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | MyISAM     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
 | QUEUE      | ACTIVE   | STORAGE ENGINE | libqueue_engine.so | GPL     |
 +------------+----------+----------------+--------------------+---------+
 11 rows in set (0.00 sec)

一番最後の「QUEUE」が追加されていればOK。

注意点

上記の通り、MySQLrpmQ4Mはバイナリ版でインストールするなら特に難しいことはなかったけど、いちおう注意点。

  • MySQLrpmは環境単位、機能単位でたくさんのパッケージに分かれているので適切なものを選ぶこと。
  • with-fast-mutexesのオプションを確認して、Q4Mの2つのバイナリから正しい方を選ぶこと。