タグ

ブックマーク / blog.nomadscafe.jp (79)

  • LIMILICをEC2に移してCatalyst+DBIx::Class+TT2アプリを自作WAF+DBIx::Sunny+Xslateで書き換えた話 - blog.nomadscafe.jp

    たまーにメモを残すために使ってるLIMILICを自宅サーバからAmazon EC2のマイクロインスタンスに移しました。 ボタンのCSSとpaging以外の見た目に変化はありません 移動する際に、Catalyst(Moose以前)とDBIx::Class、Template-Toolkitという今となるとやや分厚い組み合わせでできていたアプリケーションを、自作フレームワーク、DBIx::Sunny::Schema、Xslateという構成に書き直しました。 以前のソースコードはCodeRepos http://svn.coderepos.org/share/websites/limilic 新しいソースコードはgithub https://github.com/kazeburo/limilic2 書き換えあたり、DBIx::Sunny::Schemaのfilter機能をフル活用してORMとの機能

  • memcached を使ったアプリケーションの設計について - blog.nomadscafe.jp

    クライアントからmemcachedを利用する際の、ベストプラクティスは以前書いているので、その前段階でmemcachedを含めたWebアプリケーションのアーキテクチャ(と一部クライアントの話)について今の個人的な考えをまとめてみます。Kyoto Tycoonを使ったキャッシュサーバでも基は同じだと思います 1) 使わない memcachedをアプリケーションに組み込むことで、プログラムがどうしても複雑になりがちです。データの削除や更新の際にキャッシュの更新を忘れると多くの問題が発生します。例えばユーザがニックネームやプロフィール写真を更新したのに画面上変わらないなどの現象が起こると、ユーザに対して不快な思いをさせてしまうでしょう。またデータベースが非同期のレプリケーションを行っている場合、masterに対してデータの変更をかけ、更新が反映される前にslaveから読み込んでしまい、キャッシ

    charsbar
    charsbar 2011/06/14
  • Log::Minimal v0.08 でログの色付けサポートなど - blog.nomadscafe.jp

    Log::Minimal v0.08 で2つの機能を追加しました。1つは例外を投げるメソッド、もう1つはメッセージの色付けです。 http://search.cpan.org/dist/Log-Minimal/ http://search.cpan.org/dist/Plack-Middleware-Log-Minimal/ Plack::Middlewareも同時にアップデートしています 例外を投げるメソッド追加 Log::Minimalの今までの機能は基的にwarnを吐くものでしたが、新規に追加したメソッドはdieします。 use Log::Minimal; croakf("Flying Saucer"); これは 2011-06-10T17:41:59 [ERROR] Flying Saucer at sample.pl line 23 というメッセージを吐いてdieします。もちろ

  • HTTPコンテンツ圧縮とPlack - blog.nomadscafe.jp

    「HTTPコンテンツ圧縮はどのレイヤーで行うのがいいか」で書いたりしましたが、高トラフィック環境では、サーバ間の通信量も問題となるため、ApplicationサーバでもHTTP圧縮をかけたほう良さげです。Plackには既にPlack::Middleware::DeflaterというApacheのmod_deflate相当のMiddlewareがあるのですが、ちょいちょい弄っていたりするのでその紹介。 その前に、HTTPコンテンツ圧縮のおさらいです。HTTP圧縮はリクエストのAccept-Encodingにgzipやdeflateがあった場合に、コンテンツをgzip、deflateなどで圧縮し、レスポンスのContent-Encodingヘッダに圧縮に用いた方式を表記することで実現されます。さらに、クライアントサーバ間にキャッシュサーバが存在した場合に、Accept-Encodingを送って

  • Cache::Memcached::鉄板(てっぱん) - blog.nomadscafe.jp

    Cache::Memcached(::Fast)を使う上でベストプラクティスをまとめたモジュールを書いてみた。名前は、Cache::Memcached::IronPlate。おのみち焼き。 githubにあります。ドキュメントが日語だけです: https://github.com/kazeburo/Cache-Memcached-IronPlate つかいかた use Cache::Memcached::IronPlate; use Cache::Memcached::Fast; my $memd = Cache::Memcached::IronPlate->new( cache => Cache::Memcached::Fast->new(...). ); $memd->get $memd->get_multi $memd->set $memd->add $memd->replace

  • Cwd::Guardっていうモジュールを出していた話 - blog.nomadscafe.jp

    OrePANを弄っているときに、任意のスコープで一時的にchdirして作業後、スコープ外れれば自動で元のディレクトリに戻るモジュールあれば欲しいなと思ったので書いてみた。 use Cwd::Guard; use File::Temp; use Path::Class; my $tmpdir = Path::Class::dir(File::Temp::tempdir()); my $pkgdir; { my $guard = cwd_guard($tmpdir); # chdir to $tmpdir my($root, @others) = `tar ztf $tarfile` or die "Bad archive $tarfile"; chomp $root; $root =~ s{^(.+?)/.*$}{$1}; system "tar", "zxf", "$tarfile"; d

  • Plack::Builder::Conditionals をリリースしました - blog.nomadscafe.jp

    「Plack::Builderのenable_ifよりも簡単に、指定した条件下でmiddlewareを有効にするモジュール」で書いていた Plack::Builder::Conditionals をリリースしました。 ReverseProxyを使う場合は、接続元のIPアドレスを指定するのが必須になりますが、Conditionalsなら簡単に書けます use Plack::Builder; use Plack::Builder::Conditionals; builder { enable match_if addr(['192.168.0.0/24','127.0.0.1']), "ReverseProxy"; $app }; 今日出したバージョン0.02では、User-Agentをチェックするメソッドを追加してます。PlackでHTTPコンテンツ圧縮する場合は、これを利用して build

  • OrePANとcpanmでCPANの部分ミラーを作ってCPANモジュールを管理する - blog.nomadscafe.jp

    これまでサービスで使うCPANモジュールの管理と言えばrpm/debパッケージが主流だと思いますが、最近ではperlbrewで使いたいバージョンのperlをインストールすることもあり、rpm/debでは対応できなくなってきています。 perlbrewのperlに対してプロジェクトが依存しているCPANモジュールを入れる際、 $ perlbrew switch perl-5.12.3 $ cd /path/to/MyProj $ perl Makefile.PL $ cpanm --installdeps . などと cpanm —installdeps が使えます。 しかし、これではサーバを新規セットアップするたびに、最新のモジュールが入ることになりサーバ間でモジュールのバージョンの差異が生まれる可能性があります。 そこで対応策として考えられるのが開発サーバで—installdepsを実行

  • 本当は難しいCPANモジュールのバージョン特定 - blog.nomadscafe.jp

    OrePANを作っていて一番難しいのはディストリビューションからモジュールのパッケージ名とバージョンを抜き出す部分。ExtUtils::MakeMakerやModule::Metadata、PAUSEのソースを参考にして書いているところ。 例えば、Log::Minimalであれば、パッケージを展開して $ tar zxf Log-Minimal-0.04.tar.gz $ cd Log-Minimal-0.04 $ find -name "*.pm" | grep "VERSION" のような処理をします。(実際はperl) これが一筋縄ではいかない作業でかなり苦労している 最初に引っかかったのがcommon::sense。これは*.pmファイルがない。実際にはsense.pm.PLというファイルがあり、実行することでperlのバージョンにあったモジュールを作りだす。 まずこれに対応するた

  • PSGIアプリケーションをリバースプロキシ下で使う際の静的コンテンツの配信方法について - blog.nomadscafe.jp

    PSGIアプリケーションをリバースプロキシ下で使う際の静的コンテンツの配信は、リバースプロキシー側で行う事が多いと思うのですが、こうやるのが良いんじゃないかという案。 プロジェクトのトップディレクトリにhtdocsを作成し、その中にfavicon.ico、staticディレクトリをいれます $ ls -l /path/to/myproj/htdocs Total xxx -rw-r--r-- 1 user user 1406 Jun 30 2010 favicon.ico drwxr-xr-x 6 user user 204 Jan 21 16:39 static $ ls -l /path/to/myproj/htdocs/static Total xxx drwxr-xr-x 4 user user 136 Jun 30 2010 css drwxr-xr-x 11 user user

  • SQLを書くプロジェクトのためのDBIx::Sunnyってのを書いている - blog.nomadscafe.jp

    大規模なサイトでは、ORMではSQLレベルのチューニングがしにくいので(Class::DBIで苦労してる)、SQLを直接書くことが多いと思います。その際SQLをいろいろなモジュールに書いてしまうと、あとからALTERやパーティショニングしようとした時に悲劇となります。できるだけ1つのテーブル・データベースのSQLは1つのモジュールにおさめておく事がおすすめです。 DBIx::Sunnyはそのようなモジュールを書く時に使えそうなライブラリで、SQLを管理すると共にクエリ実行時に渡された値のバリデーションもできる様になっています。まだまだ実験中ですが、githubにソースコードあります。 使い方はこんな感じ。まずSQLを書くクラスをDBIx::Sunnyを継承して作ります。query、select_one、select_row、select_allってのがSQLを管理する用の暮らすメソッドとし

  • キャッシュシステムの Thundering Herd 問題への対策案。その2 排他制御 - blog.nomadscafe.jp

    前のエントリーで書いた Thundering Herd 問題への対策案 で、重いクエリを排他制御すればいいのではないかというご意見も頂いたので、それをmemcachedで実現するようなモジュールを書いてみた。 下のモジュールではmemcachedのaddを使って制御します。addが成功したときだけ渡されたコールバックを実行し、ロックを得ることができない場合はaddに失敗するので、その場合はsleepして処理をやりなおす。他の排他制御するモジュールと違い、キャッシュ専用なので、排他制御の前にキャッシュにgetを行い、sleep中に既にキャッシュができていないかを確認するようになっている。 コードはなんの確認もしてないのであしからず package Cache::ExclusiveControl; use Try::Tiny; use Time::HiRes; use Class::Acces

  • LIKE節におけるエスケープ文字とDBIx::PrintfもしくはDBIx::Printf::Named - blog.nomadscafe.jp

    SQLのLIKE節では「%」と「_」の2文字をワイルドカードとして利用します。「%」「_ 」を通常の文字として使いたい場合、以下のようにエスケープを行います % => like 'foobar\%%' _ => like 'foobar\__' ただし、デフォルトでbackslashにてエスケープが行われるのは、少し調べたところMySQLとPostgreSQLあたりで、SQLiteOracleではエスケープされません。別途エスケープ文字を指定する必要があります。それがLIKE .. ESCAPEです LIKE 'foobar\%%' ESCAPE '\' LIKE 'foobar$%%' ESCAPE '$' 上のように、エスケープに利用する文字を指定できます。もし、エスケープをしないなら空文字にすれば良いそうです LIKE '_foobar%' ESCAPE '' あまりないとは思いま

  • memcachedにおけるキャッシュシステムの Thundering Herd 問題への対策案 - blog.nomadscafe.jp

    キャッシュシステムの Thundering Herd 問題とは、 通常、キャッシュに格納されるデータは、それぞれ単一の生存時間をもっています。問題は、頻繁にアクセスされるキャッシュデータがエクスパイアした際に発生します。データがエクスパイヤした瞬間から、並行に走る複数のアプリケーションロジックがミスヒットを検知し、いずれかのプロセスがキャッシュデータを格納するまでの間、同一のリクエストが多数、バックエンドに飛んでしまうのです。 という問題。クエリが重かったりするとそれだけでシステムに致命的な負荷を与えてしまい、キャッシュがあるにも関わらずキャッシュが切れたタイミング全体が停止することも考えられます。memcachedでこの問題に対応するため、次のような手段を考えてみました。 まず、保存時に通常のキャッシュと、それよりも指定した秒数Expiresが短いキャッシュを2つmemcachedに対し

  • JavaScript::Value::Escapeの変更点について - blog.nomadscafe.jp

    HTML内のJavaScriptに値を安全に埋め込む際のフィルタモジュー JavaScript::Value::Escape がVersion 0.04になってます。ちょっと時間が経っているけど紹介 まず、0.04でgfx氏によりドキュメントが増えたり修正されました。感謝感謝です。あと、javascriptvalueescape っていう関数名が長いので、jsという名前でもExportすることができるようになっています use JavaScript::Value::Escape qw/js/; です。テンプレートエンジンに組み込む際にはこっちの名前にしたほうがわかりやすいとは思いますが、直接jsをテンプレートエンジンに設定するより、escape_html と組み合わせて関数を自前で用意するのが個人的にお勧め。 もう一つが動作の変更で、Version 0.01 でよりもEscape対象となる

  • XSSを回避しつつ、テンプレートからJavaScriptにJSONで値を渡す方法 - blog.nomadscafe.jp

    HTMLのscriptタグ内にデータを埋め込む際のエスケープ処理モジュール書いた」に引き続いて、XSSを避けつつ複数の値をJSONで渡す方法。 答えはmalaさんが書いてます テンプレートエンジンでJSONを生成する(多くの場合間違えるので、推奨しない) scriptタグの中でJSONを使わない 可能であればJSONライブラリのオプションで<>/いずれかをエスケープする。 生成されたJSON文字列の<>/いずれかを正規表現などを使って置換する。 JSONのvalueに当たる部分には「HTMLエスケープ済みの文字列を入れる」という規約を設けて事前にエスケープする。 の3番目以降。 ということで実装してみる。目標としてはXslateのfilterとして実装 [% hashref | json %] の様な形をとり、JSONのvalueにあたる部分はすべてHTML Escapeし、HTML中に

  • リクエスト単位のコンテナを実現するScope::ContainerのPlack::Middlewareをリリースしました - blog.nomadscafe.jp

    Apache、mod_perlにおけるpnotesのようにリクエスト単位でデータを保持できるPlack::Middlewareをリリースしました。実装にはScope::Containerを利用しています。 使い方は簡単Plack::BuilderでScope::Containerのmiddlewareを有効にします use Plack::Builder; builder { enable "Scope::Container"; $app; }; とくにオプションなどはありません。 これでリクエストがあった際にScope::Containerのstartscopecontaierを呼んでくれるので、アプリケーションのなかでscope_containerを使って簡単にデータの出し入れが行えます。 以下はHTTP接続をリクエストの間だけKeepAliveするサンプル package MyApp:

  • HTMLのscriptタグ内にデータを埋め込む際のエスケープ処理モジュール書いた - blog.nomadscafe.jp

    追記 CPANリリースしました http://search.cpan.org/dist/JavaScript-Value-Escape/ /追記 malaさんの「HTMLのscriptタグ内に出力されるJavaScriptのエスケープ処理に起因するXSSがとても多い件について」にちょろっとでているgistのコードをモジュールにしました。 JavaScript::Value::Escape - https://github.com/kazeburo/JavaScript-Value-Escape JavaScript::Value::EscapはHTMLのscriptタグ内にデータを埋め込む際に、少々過剰にエスケープを行うものです。このモジュールではq!”!, q!’!, q!&!, q!>!, q!<!, q!/!, q!\!, qq!\r! と qq!\n! を\u00xxなどに変換しま

  • There's more than one way to enjoy YAPC! / YAPC::Asia 2010感想 - blog.nomadscafe.jp

    自分の発表のことは前のエントリーに書いたので、全般的な感想を書いてみる。 今回のYAPC::Asiaで面白いなぁと思ったのは、運用系の発表が多くあったことだと思う。自分のCloudForecastの話の他にも、刺身さんの30days、myfinderさんのソーシャルアプリ向けの運用監視、盛り上がったnekokakさんの省サーバ運用などなどがありました。 インフラエンジニアはもっと前にでてもいいと言われるけど、既にhbstudyやqpstudyを通してインフラエンジニアが集まって喋る機会が生まれているし、そこから今回のYAPC::Asiaのような大きなイベントでも話すようになってきている。運用しているシステム・サービス、規模の大小に関わらずもっともっと多くの人が出て来て、刺激し合えると楽しいし、ノウハウを共有して仕事の質を高めて、楽ができるようになれば良いよね! ところで、今回のYAPC::

  • gumiStudy#2 で memcached の運用について喋ってきた - blog.nomadscafe.jp

    例の件以来、memcachedについて書いたり話したりする機会が多く頂いています。次はShibuya.pm で再び監視について発表する予定です。また、今回の発表でも紹介したリソースモニタリングツール cloudforecast はYAPC::Asiaで詳しく説明します。Shibuya.pmは参加のキャンセル待ちがかなり多い状態ですが、YAPC::Asiaはまだまだチケット絶賛発売中です。ぜひいらしてくださいませー。 \n\n例の件以来、memcachedについて書いたり話したりする機会が多く頂いています。次は[Shibuya.pm](http://shibuya.pm.org/) で再び監視について発表する予定です。また、今回の発表でも紹介したリソースモニタリングツール cloudforecast はYAPC::Asiaで詳しく説明します。Shibuya.pmは参加のキャンセル待ちがかなり