D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2013年08月

主に自分用メモ。例えば以下のようなコードからDBIハンドルを取得してるとする

use strict;
use DBI;

sub get_dbh {
DBI->connect_cached(....);
}

sub foo {
my $dbh = get_dbh();
$dbh->do(...);
}

sub bar {
my $dbh = get_dbh();
$dbh->do(...);
}

foo();
bar();
.... 
で、まぁSET NAMES utf8を自動的に発行したいなーと思ったので、get_dbhに手を入れる

sub get_dbh {
my $dbh = DBI->connect_cached(...);
$dbh->do("SET NAMES 'utf8'");
return $dbh;
}
そうするとget_dbh()内で DBIハンドル自体はconnect_cached()でキャッシュされた同じハンドルが返ってくるのだが、毎回SET NAMES 'utf8'が発行される。これは無駄だし、例えば一つ手前のステートメントの状態を期待するコードを書くと破綻する:

{
my $dbh = get_dbh();
$dbh->do("INSERT INTO ...");
}

{
my $dbh = get_dbh();
# get_dbh()にSET NAMES utf8がなければ、直前のステートメントはINSERT INTO
# get_dbh()にSET NAMES utf8があると、直前のステートメントは SET NAMES utf8
my $id = $dbh->{mysql_insertid}; # SET NAMES utf8の後なので、insertidは存在しない
}

なので、一回SET NAMES 'utf8'を発行したら、それを覚えていたい。だがDBIハンドルはハッシュのように扱えるものの、適当なキーを入れようとすると怒られる:
if (! $dbh->{MySuperSpecialFlag}) { # ERRRRRRORRRRRR
$dbh->{MySuperSpecialFlag} = 1; # ERRRRRRORRRRRR
$dbh->do("SET NAMES 'utf8'");
ところがprivate_で始まるキーなら使える!これで勝つる!
sub get_dbh {
my $dbh = DBI->connect_cached(...);
if (! $dbh->{private_my_super_special_flag}) {
$dbh->{private_my_super_special_flag} = 1;
$dbh->do("SET NAMES 'utf8'");
}
return $dbh;

ということで万事解決。
本件はちらっとつぶやいたら生き字引の@tokuhiromが覚えてたので助かりました。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

現時点ではあんまり具体的に何をしたか書けないけどブログにでっけぇ変更を入れた。システム全体の根本的な部分なので一発でキレイにとはいかなかったが、まぁ変更の規模に対して考えると妥当な感じだろう。本番化には1週間かかった。なので大分開放感がある。

具体的な事はもっと後になったら言えるが、とりあえず今の段階では Apacheモジュールを殺し、1000行近いRewriteRuleを殺し、PSGI側でミドルウェアを9個作成してPSGI側でApacheが今までやってたことを全て吸収した。

(追記 8/23 12:20)あとログがltsvになったよ!その先の事はモリス先生がやってるよ!このログもプロキシ側でログを取るのにアプリ側からの情報を組み込むとかしなきゃいけんかったので地味に面倒くさかった。わかってしまえば簡単だったけど。

パフォーマンスは正直言って、Apache版と比べて色々追加でやってることもあるので10%程落ちた。だがこれを持ってものすごい自由度を手に入れたし、あの目がくらむRewriteRuleの山とおさらばすることができた。さようならRewriteRule! 君のことを初めてviで開けてみたときから大嫌いだったよ!あと、Apacheモジュールもまぁ、悪くはなかったけど、手を入れるのが億劫だったのでやる気が起きなかった。近いうちにgit rmしてやる。

ちなみにパフォーマンス改善は相変わらずkazeburoさん無双。こっちもバグ修正とかあったりしてる間にアクセスは来続けるので、同時に見ててくれるのが大変助かります。今回もHTTPヘッダ一個調節するだけでLAが1/4になるとか見てて「ほほぉ」と思いながら作業できました。

あと今回も大量の(環境変数の指定で適時畳み込まれたり有効にしたりできる)デバッグログを入れて、アプリケーションの流れを完全に追える形を作ったおかげで問題が起こっても追うのは自分的にはかなり簡単でした。最後の最後で色々取りこぼしがあった際に大変助かった。

というわけでしばらくぼーっとしたい。 
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

たまには煽り気味なタイトル。

息子に買ってもらったおもちゃに夢中なので紹介させてもらいます。
木製、四面にそれぞれボールを使って遊べるギミックがついてる。で、息子は↑の写真では出てないんだけど穴にボールを押し込む仕掛けにはまってしまい、もらってからずっと遊んでる。

DSC09454

この押し込む部分がよくできていて、ボールがそのままするっと落ちるのではなく少しだけ抵抗があるので力を入れないとボールが通らない。そしてボールが通ったあと、裏の段に角度がついているのでボールが勝手に転がり出てくる。転がってくる時に中に入ってる鈴があたって音がする。 

1歳ちょいのうちの子供はあまりひとつの玩具に執着しないタイプだと思っていたんだけど、これはなぜかずーーーーーっとやってる・・・。それぞれ好みが違うのは当然なのでみんな好きかどうかわからんけど、少なくともうちの子はがっつりはまっているので紹介してみた。

ちなみに実物はあちこちで見られると思うけど、うちは代官山TSUTAYAの敷地内にあったボーネルンドのショップで見つけて息子がはまったのを確認してから購入しました! 
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr



愚痴エントリです。

地デジ完全移行の際にこれまで愛用していたSpiderさんが地デジ対応してなくて泣く泣く諦めて代替を探して購入した。それがタイムシフト機能を搭載していたREGZA ZG2。もう販売してないと思うけど、まぁ悪くなかった。店で値切りまくって大分安く手に入れたし。

それから2年経って、引越をしました。そのとたん内蔵HDDがあぼーんしました。タイムシフト録画は問題なかったが、時々内蔵HDDを認識しないとか言ってちゃんと録画予約をしてるのに録画が一瞬止まったりしてたんだけど、そのうち録画予約が途中で完全に止まって楽しみにしていた番組30分のうち9分しか録画できてないとかいう現象が起こるようになってしまった・・・

テレビ好きにとって録画したと思ったものが録画できていない事程ストレスな事はない。 我が家の録画環境を整えなければならない!そう思い立ったその明くる日、俺は某家電量販店に行き、店員のおにいさんにとりあえず安くしろやー!ポイントもつけろやー!と言って即決でREGZA DBR-M190を買って来た。M490モデルのほうがCS/BSを録画できるということだったが、うちはCS/BSを全く見ないし、だいたいCS/BSも録画できるからってチューナーの数は6個のままやないか。俺は地上波を全部見てる上でなら追加のチャンネルも考えるけど、地上波を犠牲にしてまでBS/CSなんてみたくないのじゃ。

まぁ、というわけでそのDBR-M190を買った。

それを昨日設置し、ネットワークを設定して前のREGZA ZG2からネットワーク経由で通常の録画番組とタイムシフト録画が終了してるものに関しては全て視聴できるところまでやった。

そして今日帰宅すると・・・前のREGZA ZG2の内蔵HDDが全く認識されなくなってた・・・あぶなかった・・・

まぁというわけで間一髪間に合ったので、テレビを見ながら作業するとかそういうのは今まで通りできる。

だけどさー、わかっちゃーいるんだけどさー、引越屋に文句の一つもつけたいんだよねぇ。保証されないのは知ってるし、それに対する説明を聞きましたってところにサインもしたさ。でも明らかに引越のせいなんだよなぁー。ZG2のほう、修理に出すべきか迷ってるんだけどなー・・・クレーマーにはなりたくないけど、なんかこう、う〜〜〜〜んって感じ。

というわけで愚痴でした。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

ほぼ一年前に「STFワーカーの自律分散と適応スロットリング」という記事を書いた。

STFというAmazon S3っぽいツールの裏方のワーカーをどう「サービスの邪魔をせずに」「しかし可能な限り大量のデータを速やかに処理するか」という命題をどう解消した、と言う話。

あれからほぼ1年たって「そういえばもう大分STFなにもしてねぇな」と気づいたのでこのエントリを書き始めた。

あれ以来ワーカーの過負荷によるアラートが来たことない。あれ?と思ったらワーカーが止まっててキューがいっぱいいっぱいになっちゃった、というのもない。足りないワーカーは勝手に補充されるし、ストレージの負荷が高い時は勝手に自動的にスロットリングされる。要はもうこの1年近く俺は管理画面でフラグをちょいと変えたりグラフを見たりする意外ほぼなんにもしてない。勝手に動いている。

この協調メカニズムを作るのにMySQLだけを使って書いたのが自分的にポイントが高い。データを高度に共有するならともかく、リーダーエレクション程度ならZooKeeperなんていらねぇよ!

というわけで本当にただの自画自賛エントリでした。STFわりといいと思うんだけど、なかなか「使って!」っていう機会がないのが悲しい。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

このエントリはいつもの「YAPC主催者」という冠を脱ぎ捨てて、非公式イベントの首謀者として書きます。

YAPCも段々と大きくなってきて、良い感じに様々な人が来てくれるようになりました。が、同時にやはりその様々な人達に配慮したトークをしないといけないようになってきました。これに関しては当たり前の事なのでもちろんそれはそれでいいのですが、それとはまた別の次元で「もう内容がどんなキワモノだろうとかまわないから技術的におもしろい 話が聞きたい!」という欲求がここ数年じょじょに高まってきました。

・・・と、いうわけで某鎌倉あたりの人と企画してしまいました。題して「大人のYAPC」(さらなる詳細はこちら)です。あくまで非公式イベントです。場所をちょっと拝借してるだけで本イベントの内容に関してはJPA/YAPC運営は何も関係ありません。

ネタ的にその内容が公になってしまうYAPC本編で扱えない話を語ってもらいます。例えばアダルトサイトの裏側などはやはりそれを容認してくれる聴講者でないと駄目だったり、あとは仕事関係の話なので「可能な限りオフレコでお願いします」的な内容もあるでしょう。そういった話を、こちらに明記してある参加条件に同意いただける方のみに楽しんでいただく予定です。
 
なお、このイベントに関してはYAPC::Asia Tokyo 2013の入場券は必要ありません。募集を開始した際に上記サイトから登録していただくだけで結構です。ただ、どうせ日吉くんだりまでくるのだったらついでにYAPC::Asia Tokyo 2013にも参加してTシャツ等のノベルティももらって、いろんな人のトークを聞いてからこのイベントに参加するのがおすすめです!チケット販売は8/11まで!(あ、YAPC主催者の冠かぶっちゃった)

というわけで「大人のYAPC」はYAPC本編ではカバーできないニッチをうまくカバーしたい!という思いから生まれた企画です。大人な皆様と是非一緒に楽しみたい!(僕は裏で懇親会もやってるので出たり入ったりですけど)

よろしくお願いいたします+乞うご期待!
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr



あー、ぽちっちゃった。ぽちっちゃった。忘れてたのに仕事で某ブログシステムの記事を確認してたらみつけちゃってぽちっちゃった!

届く時には嫁になんかしろーい目で見られると思うけど、しょうがないね! 子育て中だろうとなんだろうと、俺はやるぞッ!ジョジョおおおお!
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

このページのトップヘ