コンピュータやソフトウェアのあれこれ@道民(&元道民)
Posts tagged all
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年かかったのは長いようで、自分には必要な、適切な時間だったと思います。
ここ数年の気持ちや環境の変化によって、たどり着いたという感じがしています。
勉強会などは参加する方が多く、何かを劇的に変えていきたいという気持ちはそんなにないのですが、
自分が初めて勉強会に参加した頃の戸惑いや苦労が少しでも減るように、
楽しい場所や空間を作っていくお手伝いができたらな、と思っています。
よろしくおねがいします。
※本当はまだ会費を払っていないので真の正会員ではないです…
達人プログラマー読書会@札幌-2011.08.23 に参加しました
8月 26th
8月30日(火)に、達人プログラマー読書会@札幌に参加しました。
今回は第2章 達人のアプローチ 9.可逆性 ~ 2章の終わりまで。
実際にプログラミングをするときに心がけておくべき事がたくさんありました。
9. 可逆性
変更に強く、柔軟に対応できるプログラミングをすることの重要性について。
柔軟で適合性のあるソフトウェアを目指すことは「変化を恐れない」ことにもつながりますね。
実際の仕事の時には「どこを変えれば対応できるか把握できている」「変更の可能性を常に頭の片隅に入れておく」とかが大事になると思いました。
重大な決定を行うたびに、プロジェクト・チームは小さな目標ー選択肢の少ない狭くて現実的なビジョンーに向かって進んでいくことになるのです。
「重大なことはさっさときめてほしい」「こんな大事なことを今覆すなんて…!」と思ったことがあるあるすぎて、確かにダメージの少ないように(リソースの許す範囲で)考えておくことは重要だなと思いました。
10. 曳光弾
プロジェクトは完了することがない作業である。
小さな動くものを作って、それを育てていくことの大切さが書いてありました。
Agile的な精神。
今、いろいろ読んでいる本のすべての種はこの本に書かれているんだなぁ、と改めて感じました。
目標をとらえるまで何度でも書く、ちょっと書いたコードが違うものでも落胆してはいけない。
ソースコードを書くことが目的ではなくて、ユーザーが求めるソフトウェアを作ることが最終目的、ということを再確認しました。
11. プロトタイプとポストイット・ノート
- プロトタイプは捨てるものである
ということがとても強調されていました。
たしかに、動くかどうか確認することを目的にしているので、わりとぐちゃっとソースコードを書いてしまうことが多いので、捨てるのが懸命。プロトライプが曳光弾になることもあるけど。
12. 専用の言語
実際に言語を作ったことはないけれど、
- わかりやすい名前をつける
- ユースケースを書く
- フューチャーのテストを作る
という今やっていることにつながることなのかな、と理解。
言語も含めて、どんどん発展していって、先駆者のおかげで幸せなプログラミングができているなぁと感じました。
13. 見積もり
現実のお仕事で最近色々苦労した部分でもあったので「ハッ」としました。
気づきをたくさん得られました。(現状の問題点を把握できたという意味の気づきも含めて)
見積もりとは何なのか、見積もりの粒度についてどうやって意識を共有していくか、そして確度の高い見積もりを出せるようにするにはどうすればいいか。
まずは自分の精度を磨くところから、やっていきたいと思いました。
風邪をひいて、第2回に参加できていない分を次までにちゃんとキャッチアップしておきたいと思います。
[perl+web]Amon2のソースを読む(2)
8月 25th
今日はAmon2-2.49のコンテキスト周りで、具体的には Amon2、Amon2::Web、Amon2::WebRequest、Amon2::WebResponse、ついでにAmon2::Config::Simple 。Dispatcher はこれらと粗結合なので、次回以降。他残っているのは、scaffoldのコードと、トリガーとプラグイン周り。
Amon2::Web と Amon2 の関係
Amon2::Web はAmon2(コンテキスト) を継承しておらず、コンストラクタも持っていない。YourProject::Web ではAmon2 と Amon2::Web の双方を継承して使う。という構造を考えると、Amon2::Web はAmon2 のサブクラスに対する Mix-in として働いていると見た方がわかりやすい。
Amon2::Web
scaffoldの YourProject/app.psgi内では YourProject::Web 内のto_app を呼んでPSGIアプリケーションを作成しているが、このメソッドの定義元はAmon2::Webであり、Amon2::Web がPSGIリクエストを処理する際のエントリポイントになっている。
生成されるPSGIアプリケーションは単純な物で、Amon2::Web::Request を作ってYourProject::Web->new をして、dispatch() を呼び出すだけ。ここで、Amon2::Web は1リクエスト1インスタンスのモデルを取っていることがわかる。dispatchを呼ぶ前後には BEFORE_DISPATCH と AFTER_DISPATCH という二つのトリガーがあり、呼ばれる。BEFORE_DISPATCH や dispatch() から返すレスポンスはPlack::Response のサブクラスを想定しており、Amon2::Web::Response もその1つとなっている。
YourProject::Web 内からレスポンスを返す方法として、Amon2::Web はredirect、res_404、renderの3つの方法を提供している。res_404 が最も単純で、404 Not Foundの画面を返すもの。これはAmon2::Web::Dispatcher:: 以下のクラスでも使っている。htmlもres_404 メソッドの中で定義されているので、404画面を置き換えたければYourProject::Web 内でこのメソッドをオーバーライドするのがいいと思われる。redirect はQUERY_STRING の扱いのためにコードは長いが302のレスポンスを返す以外の特別なことはしてない。render はcreate_view->render するだけ。create_view はYourProject::Web で自分で定義する必要がある(scaffoldに入っている)。HTML_FILTER のトリガはここで処理されるので、render 以外の方法でレスポンスを返すとHTML_FILTER トリガは呼ばれない。
Amon2::Web のやってることはこれだけ。リクエストをルーティングしたいときはdispatchメソッド内でAmon2::Web::Dispatcher:: へ処理を委譲する。その他の処理はプラグインをロードすることで実現する。その辺はscaffold にもデフォルトで書いてあるので、必要に応じていじくるとよい。
あと、Amon2::Web 内のencoding はhtmlやURLに含めるパラメータのエンコーディングを決めているので、UTF-8以外の文字コードを使いたければ encoding と html_content_type のメソッドをオーバーロードする。
Amon2::Web::Request, Response
Amon2::Response はマンマ Plack::Response。Amon2::Request はがっつりコードがあるように見えるが、これはparameters 系のメソッドを(バイト列ではなく)文字列を返すようにしているだけ。Plack::Request と同じ値が欲しければ、parameters_raw などを用いる。
ところで、Amon2::Web->url_for と Amon2::Web::Request->url_with の二つが存在してこれらがテンプレから使えるように YourProject::Web で設定されるが、これらは全く別もの。前者はベースURLを元にURLを作る物で、このアプリがルートにデプロイされない場合はこのメソッドを通してURLを作る必要がある。後者は現在のリクエストを元にQUERY_STRINGの部分だけ置き換え(もしくは追加した)リクエストを作る物で、Catalystに由来する。
Amon2
最後に、Amon2 クラスだが、これはコンテキストを表すクラス。言い換えれば、CLIでも使える機能をAmon2::Webから分離した物とも言え、プラグインのロードやコンフィグへのアクセスなどの機能を提供する。Amon2->context で現在のコンテキストを取得可能であり、WEBアプリだとYourProject::Web のインスタンスであり、CLIアプリだとAmon2クラス自身のインスタンスが入っている。
コンフィグ周りはAmon2::Config::Simple が面倒を見ているが、こいつはAmon2->mode_name と同じ名前の*.pl をdo して返す。この振る舞いが気に食わなければAmon2->mode_name とか Amon2->load_config をオーバーライドして動きを変えればよい。
load_plugin は指定されたプラグインをrequire してパラメータ(hash-ref)付きでinit() を呼ぶ。デフォルトでは Amon2::Plugin 以下のモジュール、+付きだと任意のパッケージ名のモジュールをロードするが、この仕事をしてるのは2.49の実装だとPlack::Util。プラグインはinit()メソッド内でコンテキストにメソッドを追加したりトリガを仕掛けたりして動作を拡張する。
load_plugins は一度に複数をload_plugin できる。Data::OptList::mkopt を噛ませてるお陰で、モジュール名とパラメータを混ぜた形式で指定ができる。
# YourProject::Web より __PACKAGE__->load_plugins( 'Web::FillInFormLite', 'Web::NoCache', # do not cache the dynamic content by default 'Web::CSRFDefender', 'Web::HTTPSession' => { state => 'Cookie', store => HTTP::Session::Store::File->new( dir => File::Spec->tmpdir(), ) }, );
ちなみに、base_dir と config は、2度目以降の呼び出しを高速にするために、初回実行時にサブクラス側で同名のメソッドを生やし、オーバーライドして自身を隠している。
[perl+web]YAPC::Asia Tokyo 2011 「チケット絶賛発売中です!」とのこと
8月 25th
YAPC::Asia Tokyo 2011 が10/13〜10/15 に開催されます。チケットの販売も始まってますので、買ってない方は締め切りが近いようなので早く買った方がいいです。
今年は初スピーカーとして出られることになったので、Monads in Perlという題でこんな話とかこんな話をAE::cv を例にとって話すつもりです。AE::cvは Stateモナドより断然簡単なんで、JSDeferred がわかるレベルの人であれば理解できると思います*1。
*1:というか、先にネタバレさせておくとほぼマンマJSDeferredになるんですが