サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
TGS2024
craftworks.hatenadiary.org
大分ハマりました。 ubuntu/12.04 nginx/1.2.7 php5-fpm/5.4.6結論から書くと、Nginx 公式のリポジトリから取得したパッケージには、fastcgi_param 用の設定がデフォルトで一通り入っていますが、いくつか記述が無いものもあります。 下記の PATH_TRANSLATED を追加したら無事動きました。 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;「nginx php5-fpm blank page」などググったら色々出てきますが、PATH_TRANSLATED に直接触れているのは少なかったです。
4.10.8. MySQL サーバのタイム ゾーン サポートにある例のクエリを投げたところ、CONVERT_TZ() の結果が NULL になってしまっていました。 > SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); +-----------------------------------------------+ | CONVERT_TZ('2004-01-01 12:00:00','GMT','MET') | +-----------------------------------------------+ | NULL | +-----------------------------------------------+ 1 row in set (0.00 sec) 調べてみたら 4.5.5. mysql_tzinfo_t
プロジェクト用のモジュールを extlib とか専用のディレクトリを掘っていると、それを @INC に突っ込まなくてはいけないので、ブートストラップスクリプトで調整したり、開発用に .bashrc や .profile に書くと思いますが、モジュールがインストールされるディレクトリ名は、 ./extlib/lib/perl5/i486-linux-gnu-thread-multi (32bit Ubuntu) ./extlib/lib/perl5/darwin-thread-multi-2level (OSX)のように、アーキテクチャ名が入ったりするので、環境によってディレクトリ名がまちまちで書き換えないといけません。 なので、下記のように .profile を書くと環境に左右されないので便利です。 ARCHNAME=$(perl -MConfig -e 'print $Config{ar
本日、TVTalk という Web サービスをリリースしました。 Twitter 上で、テレビ局のハッシュタグが付いているツイートを拾って、放送中の番組情報と紐付けるという、アグリゲーターサービスです。リアルタイムにタイムラインを追うにも、放送済み番組の内容をチェックするのにも使えますので、みなさんぜひ使ってみてください。ブックマークやいいね!も良かったらお願いします! 今日は、この Web サービスの裏側のシステム構成を紹介したいと思います。 構成 EC2 Route53 (DNS) ELB (Load Balancer) MySQL 5.5.11 nginx 0.7.65 Starman Twiggy Tatsumaki AnyEvent::Twitter::Stream Airy (自作フレームワーク) Web サーバー Web はフロントに nginx をおいて、静的ファイルは n
最近の Linux ディストリビューションの perl は 5.10 以上になってきた感じなので、最近は state など新しい機能を使うようになってきました。 そこでちょっと気になったので state のパフォーマンスを計測してみました。ベンチマークコードは以下。動作が全く同じ訳ではないですが。 use 5.010; use strict; use warnings; use Benchmark ':all'; cmpthese(timethese(-1, { 'my' => \&_my, 'state' => \&_state, })); { my $v = 1; sub _my { $v } } sub _state { state $v = 1; } 結果は以下のように、ベンチマークを実行する毎に違う結果が出ました。実行環境は Ubuntu 10.04 の perl 5.10.1
MySQL Casual Talks #1 の発表資料を UP しました。 MySQL 初めてのチューニングView more presentations from Craft works. 資料の中でも言及しました、hirose さんが作成された mymemcheck という素晴らしいツールを !includedir に対応して Readonly.pm 依存を無くしたバージョンを github の こちらにあげてあります。
EC2 だと ELB の内側では、nginx のアクセスログに ELB の IP アドレスが記載されてしまうので、HttpRealIpModule を使って Apache の mod_rpaf、lighttpd の mod_extforward と同じような挙動を設定します。 configure オプションに --with-http_realip_moduleが必要ですので、nginx -V で configure オプションを確認して、入っていなかったらコンパイルし直しましょう。 実際の設定は以下です。set_real_ip_from に ELB など Proxy やロードバランサーの IP を指定します。real_ip_header には、X-Real-IP や X-FORWARDED-FOR など Proxy が追加するヘッダーを指定してください。 http { set_real_i
普段、wanrning を見つけるたびにせっせと defined 挟んだりして対応しているのですが、View の中で呼ばれてる箇所など、うっかり気付かないで数日過ぎてしまうと、あとで該当箇所を追うのが若干手間になってしまったりします。 そこで、 use warnings FATAL => 'all'; の出番なのですが、全部のパッケージに記述するのも面倒なので、下記のようにして使っています。 package MyApp; use strict; use warnings; sub import { strict->import; warnings->import('FATAL' => 'all'); } 1; package MyApp::Foo; use MyApp;
あまり日本語情報も無いようなので、メモ書き程度に紹介しておきます。新型 Macbook Air 11'' に Ubuntu 10.10 サーバー版 64bit をインストールしました。Boot Camp は使っていません。 大まかな流れは、 OSX で rEFIt の導入とパーティション割り当ての調整 Ubuntu のインストール Ubuntu 上でドライバ等のセットアップ となります。 Windows とのトリプルブートにしたい場合は、Linux インストールの前段階で行うようですが、詳細調べていないので割愛します。 以下詳細です。 事前準備 Ubuntu の OS イメージを USB メモリに準備しておく ISO から起動可能な USB メモリとして作成するには、ISO 配布ページの「Burn your CD or create a USB drive」の項に詳しく書いてあります。 イ
[追記] reverse() を使う方法の方が速くて簡潔でお勧めです! id:tomi-ru++ あまり必要になるケースは無いと思いますが Tips です。 use strict; use warnings; use Test::More; my %a = ( foo => 1, bar => 2, baz => 3, ); my %b; @b{ values %a } = keys %a; # スライスで入れ替え is_deeply(\%b, { 1 => 'foo', 2 => 'bar', 3 => 'baz', }); done_testing;
id:xaicron 氏が紹介なされていました make test で Test::mysqld を永続化させる方法 を早速導入していたのですが、make test は速くなって便利なのですが、prove で 1 つずつテストをするときは、相変わらず mysqld を毎回、起動・終了するので時間がかかって開発時のストレスになります。 そこで、開発時には別ウィンドウで mysqld を立ち上げておいて、そこに接続しに行くようにすれば大分快適になると思い、実装してみました。 #!/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; use File::Spec; use JSON; use Test::MyApp::mysqld; my $tempfile = File:
今年も Perl の国際的カンファレンス YAPC::Asia に行ってきました。 YAPC に行くと 毎年感じることですが、YAPC に行って色々なトークセッションを回ると、他(社|者)の実際の運用や開発の現場レベルでのノウハウを聴くことができるので、この二日間で自分ひとりの経験で貯まるノウハウの数ヶ月分のノウハウが得ることができると思います。 今年は去年の Plack/PSGI や、一昨年の Moose のような目玉となる技術の発表は無かったですが、代わりに開発・運用のノウハウが多かった気がします。ノウハウ系の情報は普段あまり表に出ないことが多いので、とても参考になりました。 YAPC の良いところ トークセッションもそうですが、様々な人と出会えることです。セッションの合間に喫煙所や芝生で、はたまた懇親会などで、セッションでは聴けない運用の小話や裏話が聞けたりすることです。技術ネタの話
Amazon EC2 のロードバランサーのオプションの Elastic Load Balancing は便利なのですが、これを経由すると内側の lighttpd のアクセスログにはアクセス元 IP アドレスは 10.204.xx.xx などと、全てロードバランサーの IP アドレスになってしまいます。これを本来のアクセスしてきたユーザーのリモート IP アドレスを記録する方法を紹介します。 ロードバランサーはアクセス元の IP アドレスを HTTP_X_FORWARDED_FOR ヘッダに付加して内側の Web サーバーにリクエストを送ります。 lighttpd ではこれを、mod_extforward により、リモート IP アドレスとして取り扱います。Apache でいうところの mod_rpaf にあたるものですね。 lighttpd.conf に下記のようにロードバランサーの IP
今年の YAPC::Asia もタイムテーブルはパンフレットをあてにしていたのですが、載っていなかったので慌てて用意しました。 公式サイトに iCal が用意されているので、これを Google Calendar にインポートします。 左下の「他のカレンダー」の「追加▼」のプルダウンから「URL で追加」を選びます。 ここに、それぞれ、「講堂」「フェライト会議室」「蔵前会議室の」iCal 形式の URL を入力すると下記のような感じで見られるようになります。Mobile Safari 版の Google Calendar の方が大分見易いです。 以下それぞれ、PC, iPhone(Mobile Safari), ガラケーです。
Ubuntu 10.04 LTS の MySQL は 5.1.41 なので、InnoDB Plugin をソースからインストールしなくてもそのまま使えますが、セットアップしていて少しつまづいたのでメモです。 /etc/mysql/my.cnf に ignore-builtin-innodb plugin-load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpm
Google が先日 JavaScript のコーディングスタイルガイド Google JavaScript Style Guide (邦訳) を発表しましたが、今度はその文法に沿ってチェックをしてくれる Lint ツール Closure Linter を公開したようです。 (via. 「Google JavaScript Style Guide」に沿ってチェックしてくれる、グーグル製JavaScript文法チェッカー) 早速インストールして開発効率を上げるべく、開発環境に導入してみたいと思います。 Closure Linter は python 製なので、easy_install でインストールできます。easy_install が入ってなければ、下記コマンドでインストールしましょう。 curl http://peak.telecommunity.com/dist/ez_setup.py
EC2 は便利なのですが、プライベート IP アドレスが変更されない保証が無いので、/etc/hosts に他のインスタンスのアドレスを書いておいても、ある日変わっている可能性があります。 そこで、ec2-api-tools の ec2-describe-instances でサーバーインスタンス一覧が取得できることを利用して、各サーバーの hostname 情報から、/etc/hosts を自動生成するスクリプトを書きました。 http://gist.github.com/479339 大まかな流れは以下です。 ec2-describe-instances でインスタンス一覧取得 各インスタンスの名前解決して IP アドレス取得 ssh で繋ぎに行って hostname コマンドの結果を取得 /etc/hosts の内容を生成 ひとつのサーバー上で cron でこのスクリプトを走らせて、
先日、WWW::Curl をラッピングした HTTP クライアントなモジュールを書いたのですが、テスト用に HTTP サーバーを用意しないといけないと思いつつ、他の HTTP クライアントがどのようにテストをしているか調べてみたところ、WWW::Curl は、 my $url = $ENV{CURL_TEST_URL} || "http://www.google.com"; などとしていて、LWP は Net::HTTPServer を使っているようでした。 ネットワークが繋がっていないとテストが出来ないのもなんですし、Net::HTTPServer 使ってサーバー書くのも面倒臭そうなので、本来の用途とは違いますが、シンプルに書けそうな Plack::Test で書いてみることにしました。 use strict; use warnings; use Test::More; use Plac
インスタンス:m1.small 対象 OS:Ubuntu 9.04 apt で入る MySQL は 5.1.31 とちょっと古いので、MySQL 公式で配布しているバイナリを利用しました。備忘録です。 前準備 ユーザー作成 UID/GID などは Ubuntu 9.04 の MySQL パッケージのトリガースクリプトが作成するものに合わせました。 sudo addgroup --gid 109 mysql sudo adduser --home /var/lib/mysql --shell /bin/false --no-create-home --uid 105 --gecos 'MySQL Server' --gid 109 --disabled-password --disabled-login mysql ログ・その他ディレクトリ mkdir /var/log/mysql chow
現在、Server::Starter + Starman で運用している環境があるのですが、週に1回ほど古いワーカーが終了しないで残り続けるという現象が起こっています。 FCGI 起動の名残りで、毎時間 HUP を投げていたのですが、普段は問題なく starman プロセスが再起動していたのですが、たまに再起動が上手く行かずに、古いプロセスが残り、リクエストに応答できなくなるという状態です。 start_server の起動オプションは以下です。 start_server --port 8001 -- starman --listen :8001 --workers 4 app.psgi 現象が起こっている時の ps 結果 $ pgrep -f starman | xargs ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMA
DateTime が重くて遅いのは周知ですが、一応どれくらい差が出るかベンチマーク。 「2010-07-01 15:10:53」みたいなフォーマットのタイムスタンプ文字列を生成したい場合です。 DateTime はオブジェクトをキャッシュして使い回しても相当遅いです。 POSIX はコアモジュールで、Windows でも使えますので、使える環境では積極的に使いましょう。 他にももっと速い方法があれば、教えてください。 Benchmark: running dateime, dateime_c, posix for at least 3 CPU seconds... dateime: 3 wallclock secs ( 3.15 usr + 0.00 sys = 3.15 CPU) @ 2083.17/s (n=6562) dateime_c: 3 wallclock secs ( 3.4
アニメ GIF だと、背景色に合わせて透過画像を作らないといけないので、canvas でアニメーションしてみました。 ソースはこちら http://gist.github.com/380581 loading = new LoadingIcon('rgb') したのちに、 loading.start() すると setInterval() でアニメーションを開始しますので、 loading.element で HTMLCanvasElement オブジェクトが取れますので、appendChild() に渡すなり、jQuery の appendTo() なりに渡せば描画されます。 raw を html として保存すれば動作サンプルが見られます。 Chrome 5, FireFox 3.6, Safari 4.0 で動作を確認しました。 描画領域が小さく、strokeRect() だと綺麗にバ
意外と知られていないのですが、vim には、まったくの初心者が、基礎的な一通りのコマンドを数日で完全に覚えることができるチュートリアルプログラムが付属しています。 そのプログラムは、vimtutor といい、Ubuntu の場合、vim-runtime パッケージに含まれています。 マニュアルによると チュートリアルを完了するのに必要な時間は、覚えたコマンドを試すのにどれだ け時間を使うのかにもよりますが、およそ25から30分です。 と、紹介されており、実際 30 分もあれば終わる内容です。1 日 1 回やれば 3 日目にはほぼ完璧に基礎のコマンドは覚えることができるでしょう。vim を覚えたい方は、まずはここから始めてみては如何でしょうか。 LANG=ja_JP.UTF-8 vimtutor と、ロケール指定で起動することにより、日本語でチュートリアルを実施できます。 [コメントより追記
HTML::Entities を使う方法と、正規表現を段階的に使う方法と、変換テーブルを用意して正規表現で置換する方法と、どれが一番速いか気になったので計測してみました。& から順番に変換していく方法が一番速かったです。ベンチマークスクリプトは以下です。 Rate cpan once step cpan 372/s -- -32% -56% once 550/s 48% -- -35% step 847/s 127% 54% -- use strict; use warnings; use Benchmark ':all'; use HTML::Entities; my $html = join '', <DATA>; my %table = ( '&' => '&', '<' => '<', '>' => '>', '"' => '"', "'" => '&
下記の環境で s3fs を動かそうとしたのですが、すんなり行かず、ググっても参考情報が少なかったので作業ログを残します。 ami-ccf615a5 alestic/ubuntu-9.04-jaunty-base-20091011.manifest.xml Linux 2.6.21.7-2.fc8xen-ec2-v1.0 #2 SMP Tue Sep 1 10:04:29 EDT 2009 i686 GNU/Linuxs3fs のインストール apt-get install libfuse-dev libcurl4-openssl-dev cd /tmp wget -O - http://s3fs.googlecode.com/files/s3fs-r177-source.tar.gz | tar xvfz - cd s3fs make install いざ、マウントしようとすると下記のエラ
Key Value Store の Tokyo Cabinet のデータベースサーバーである、Tokyo Tyrant のインスタンス起動管理サーバーの ttserver をテスト用に一時的に起動できる Test::ttserver をリリースしました。 http://search.cpan.org/~craftwork/Test-ttserver-0.001/lib/Test/ttserver.pm 現在、Engage という WAF を開発しているのですが、その中のデータアクセス抽象化クラスで Tokyo Tyrant を使うことにしたところ、テストを書く段階で、「ttserver を立ち上げないとテストが出来ないなぁ」と思い作りました。 実装は奥氏の Test::mysqld をベースに、ttserver 用に書き換えました。id:kazuhooku++ これが CPAN Autho
依存モジュールの指定漏れを防ぐ方法 - 名称未設定 - subtech Makefile.PL に書き忘れている依存モジュールを自動検出してくれるテストモジュール Test::Dependencies ですが、Module::Install と併用していると、テストがコケます。 これは、Module::Install が生成する META.yml の中に、 build_requires: ExtUtils::MakeMaker: 6.42が書いてあるのに関わらず、どのテストスクリプトにも、use ExtUtils::MakeMaker が無いのが原因です。 META.yml の中の ExtUtils::MakeMaker の記述を消せば、テストは通るのですが、自動生成されるファイルをいちいち編集するのも面倒ですし、そもそも Module::Install が、わざわざバージョン指定している
Yuval Kogman 氏が Try::Tiny という新しい例外捕捉モジュールをリリースしたようなので、ベンチマークを取ってみました。 ベンチマークコードは、Error.pm のオーバーヘッドで書いたものを流用しました。 ベンチマークコード #!/usr/bin/perl use strict; use warnings; use Benchmark qw(:all); use Try::Tiny; use Error; cmpthese(timethese(100000, { 'eval' => sub { _eval(\&die_with_object); _eval(\&die_with_string); _eval(\&dont_die); }, 'try' => sub { _tiny(\&die_with_object); _tiny(\&die_with_string);
Moose は has でアクセサ定義できるので便利なのですが、アクセサは要はサブルーチンコールなので、パフォーマンス気にして作っているサービスではオーバーヘッドが気になるなぁと思い、ちょっとベンチ取ってみました。 ベンチマーク対象は、Moose で作成したクラスと、Class::Accsessor::Fast で作成したクラスの、アクセサ経由とオブジェクト直でのデータ取得です。ベンチマークコードは以下です。 #!/usr/bin/perl package ClassMoose; use Moose; has 'ro1' => ( is => 'ro', isa => 'Bool', default => 1 ); has 'ro2' => ( is => 'ro', isa => 'Int', default => 1 ); has 'ro3' => ( is => 'ro', isa
次のページ
このページを最初にブックマークしてみませんか?
『Craftworks Tech Blog - Branch』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く