昨日リリースしたサイトが予想以上に反響があったのか、システムリソースの見積もりを失敗したのか、リリース開始からload average高め。で、今日も状態を確認するためにvmstat 1を端末で流していたら…サーバが応答しなくなった…ヤバイ…
ていうか、system inが133878って!
symfonyではアプリケーション単位でのユーザ定義値の設定はsymfony_root/apps/アプリケーション/config/app.ymlで行う。で、モジュール単位での設定はsymfony_root/apps/アプリケーション/modules/モジュール/config/module.ymlで行う。なんだが、ここで設定した値の取得方法がドキュメントに書かれていない。app.ymlの方は説明されているのだけど、module.ymlの方は、「同様に...」と省略されている。実際には
$value = sfConfig::get('mod_モジュール_ネームスペース');
なんだけど、それはドキュメントには書かれていない。書かれているけど、モジュールが抜けていたりする。
とりあえずどんなYAMLで設定した値がsfConfigの中でどのようなキーで保存されているかは、キャッシュディレクトリを覗くのがてっとり早い。例えばfrontedアプリケーションのprod(商用)環境のprモジュールのmodule.ymlのキャッシュならばこのように確認できる
$ cd symfony_root; cat cache/frontend/prod/config/modules_pr_config_module.yml.php
ギザベンリス!と思いインストールしてみましたが、yでYouTube動画が開くものの、どうやって再生すればよいのか分かりませんでした…てか、俺の問題?う〜ん。また余裕があるときに深追いしてみるか
今回リリースしたサイトは超デカメな素材ファイルをばらまくという素敵なサイトなんだが、これらの素材ファイルをダウンロードするためにはあらかじめ会員情報などから適切な権限確認を行わないといけない。なので、データの吐き出し部分もphpで実装することになる。そこで単にphpの最後の方に
readfile($file);
したのでは吐き出し対象のファイルがメモリに取り込まれて大変な事になる。てか今日大変な事になっていた…そこで、以下のような魔法を唱えてあげると、メモリには入らない
flush();
while(@ob_end_flush()) {}
readfile($file);
検証したのはphp-5.1.4とapache-2.2.2。検証方法としては、readfileの後に
error_log(sprintf("memory used: %dKb", intval(memory_get_usage()/1024)));みたいな事をして確認(実際にはちょっと違うんだけど)。使用前はまるまる対象$fileのファイルサイズ+phpプログラム分のメモリを消費していたのだけど、使用後は読み込み対象のファイルサイズに関係なく、phpプログラム分のメモリ消費だけになりました。単純にphpの設定でoutput_bufferingを0にしたりしてもいいのかな。しかしそれが必ずしもできる環境ではないし、header()とかのからみがよくわからないので、こちらの対策をチョイス。他のバージョンのphpでは扱いが若干違うようです。以下のスレッドが参考になるかも?
メモリーフローってなんだってツッコミはおいといて、結局このスレッドもまとまった解がないまま終わってるし。メーリングリストでただでノウハウ教えてもらっているんだからさ、最後に内容まとめてコミュニティにコミットするのは義務なんじゃないかと思うのだけど。ま、俺はメーリングリストに参加していないけど、こうやってウェブ経由で情報を得たのでフィードバックしているわけなんだが。always pass on knowledge!
gmailのメールアドレスはアカウント部分の最後に"+"を付けて任意の文字列を付け足すことができる。例えばabcというGmailアカウントを持っていたとすると通常のアドレスは
abc@gmail.com
になる。これを下記のように変えても、abc@gmail.comに送信した場合と同様に受信することができる
abc+someml@gmail.com
abc+foo@gmail.com
フィルターを作るのが困難な状況などに、これらのアドレスを利用して宛先フィルターで区別したりする事などができる。でもこの機能、Gmailのサイト上のどこに説明してあるのか分からない。誰か知っている人いたら教えて♪
こりゃ便利だわ。ってことで早速しょこたんブログをスクレープしてみた。しょこたんブログをなめまわして写メールだと思われるイメージを全て抽出するスクリプト
これを実行した結果をリストに保存しる
g5$ perl shokotan-get.pl > list.txt
4302ものURLを取得。これをwgetにてダウンロードしる
g5$ wget --no-directories -i list.txt
そして、ダウンロードした画像をiPhotoに追加してみるテスト。
名付けて”10分でなれる中川翔子マニア”ハック666バージョン
ギガビットイーサでyum updateしたい!って事でサーバにyumレポジトリを配置する。といってもDMZはまだ完全にギガビットイーサ化されていなかったりする。まずはレポジトリにするサーバに以下のようなスクリプトを設定して、cronで毎朝実行するように設定する。
次にサーバにこれらのファイルにアクセスできるようにする。今回はapacheを使ったが別にftpでもいい。httpd.confに以下のような調整をして社内からしかアクセスできないようにする(一応DMZ内のマシンも更新できるようにDMZ内に配置したレポジトリのため)
<Directory /var/www/html/fedora>
Options +Indexes
Order deny,allow
Deny from all
Allow from 211.5.85.240/255.255.255.240
</Directory>
あとはクライアント側のyumの設定を変更する(reposerverの部分を適当に置換)
/etc/yum.repos.d/fedora-core.repo
/etc/yum.repos.d/fedora-updates.repo
/etc/yum.repos.d/fedora-extras.repo
ちょっと使ってみた。Mac OS XとFirefox 1.5.0.1な環境だととてもバギーで全然使い物にならなかった。まずローカルのエクセルファイルを開いてみたのだけど、このファイル参照のUIは素敵。「ファイル」>「開く」で、ThickBox/Lightbox風なダイアログが表示される。過去に開いたファイルなど、「ファイル参照」を擬似的に演出している。そのボックスの中に実際にOS(ブラウザ)依存なファイル参照ボタンがある。ここでファイルを選択すると(OS依存のファイル選択により)、自動でファイルのアップロードが開始され、Google Spreadsheetの擬似的参照ボックスにて操作できるようになる。で、いざファイルをオープンしてみると、エクセルで編集した通りに表示されている。といっても、サンプル用にでっちあげたもので高度な事はしていないエクセルファイルだった。試しに背景を変えたり、フォント色を変えたりしてみようとしたが、入力されていた情報が消えたり、カラムごと消えたりと不可解な現象が起こりまくり。とりあえずこれをみる限りウィンドウズ環境では正常に動作しているみたいだが…
mixiにも書いたのだけど、正直悩み中なのでこっちのもアップ。
mixiでは日記は友人のみ公開にできたり、アルバム機能は非公開(閲覧キー)にできたり、コミュニティは管理人の承諾が必要(非公開)にする事ができる。
ごく一般的なユーザの解釈では、これらの”非公開”な場所にアップロードする写真は、誰も見る事ができない、もしくは許可したものにしか見る事ができないととらえているのではないかと思う。
実際のところは、アップロードした(されている)写真の場所(URL)が分からないだけで、それさえ分かれば誰でも見る事ができる
例えば、この写真は俺が非公開なアルバムにアップした写真
http://ic11.mixi.jp/photo/album/62/90/6290_2553199009.jpg
多分みんなもリンクを辿れば見る事ができるはず。mixiにログインすらしていなくても見えるはず。本当は非公開なのに(閉じたネットワークのはずなのに)。実際には誰かがこの情報(URL)を流さないと、勝手に見られる事はないというのは事実。
対策としては、URL直打ちでは見ることができないように、画像を表示する前に閲覧しようとしている人に権限があるかどうかの確認を取るようにすることができる。
でもこれをした時点で、じゃ閲覧権限がある人が画像を保存してどっか別の場所で公開しちゃった場合は?なんて事も考えられる。
どこに境界線を引けばいいのか難しいね。でもリンク直打ちで閲覧できるのはセキュリティが甘過ぎるような気がする
う〜ん、自分がSNSを作るとしたらどういった実装にするべきなのか。悩むね。
実際に画像垂れ流し(ウェブサーバまかせ)なのと、プログラム側で画像の閲覧権限を確認して表示するのでは大きなパフォーマンスの差がでる。それと得られるセキュリティのとのバランスなんだけど。
Yahoo!360についても調べてみた。こちらについてもmixi同様。画像のURLさえコピー&ペーストすれば誰もどこからでも閲覧できる。ちなみに、以下がYahoo!360内の日記にアップした写真のURL。特にYahoo!360内では制限を書けていないけど、この日記を見ている人には本来アクセス権の無いものではある
http://proxy.f4.ymdb.yahoofs.jp/blog/446c7200zd2a04ba4/1/__sr_/5b8d.jpg?mgQPPiEBBHvTCaYU
最初は、URLの最後に.jpg?***とQUERY STRINGが付加してあったので、もしかして?と思ったけど、QUERY_STRINGごとコピーしちゃえば問題ないみたい…試しにQUERY_STRINGを削除して、.jpgで終わらせると、”閲覧権限がありませんよ”みたいなエラーがでる。でもこれって閲覧権限をチェックした結果、そういう情報がでているのか、単にURLが間違っているからでているのかまでは分からない。
というわけで、みんなはどう考えているのだろう。基本、インターネット上にアップロードしたら世界に公開したと同義と捉える方が無難か?みんながそういう考えでいてくれるなら、アプリケーションを開発する側もそんなに神経質にならなくてすむのでハッピーなんだけど
Set any TTL values to the maximum allowed.とりあえず自分のドメインにmailホゲホゲなホストを作り、GMailのMXにCNAMEする。で、ちゃんと設定できたかなぁ〜と思ってhostしてみると、7つあるように見せかけて、いくつかCNAMEされているだけじゃん!!
MX Server address Priority
ASPMX.L.GOOGLE.COM. 1
ALT1.ASPMX.L.GOOGLE.COM. 5
ALT2.ASPMX.L.GOOGLE.COM. 5
ASPMX2.GOOGLEMAIL.COM. 10
ASPMX3.GOOGLEMAIL.COM. 10
ASPMX4.GOOGLEMAIL.COM. 10
ASPMX5.GOOGLEMAIL.COM. 10
g5$ host -t mx ***.**といっても3つのMXホストで支えられていることになる。各ホストは2つIPが割り振られているので実際には6つのホスト
***.** mail is handled by 10 mail6.***.**.
***.** mail is handled by 10 mail7.***.**.
***.** mail is handled by 0 mail1.***.**.
***.** mail is handled by 5 mail2.***.**.
***.** mail is handled by 5 mail3.***.**.
***.** mail is handled by 10 mail4.***.**.
***.** mail is handled by 10 mail5.***.**.
g5$ host mail1.***.**
mail1.***.** is an alias for ASPMX.L.GOOGLE.COM.
ASPMX.L.GOOGLE.COM has address 64.233.167.114
ASPMX.L.GOOGLE.COM has address 64.233.167.27
g5$ host mail2.***.**
mail2.***.** is an alias for ALT1.ASPMX.L.GOOGLE.COM.
ALT1.ASPMX.L.GOOGLE.COM has address 66.249.83.27
ALT1.ASPMX.L.GOOGLE.COM has address 66.249.83.114
g5$ host mail3.***.**
mail3.***.** is an alias for ALT2.ASPMX.L.GOOGLE.COM.
ALT2.ASPMX.L.GOOGLE.COM has address 66.249.93.27
ALT2.ASPMX.L.GOOGLE.COM has address 66.249.93.114
g5$ host mail3.***.**
mail3.***.** is an alias for ALT2.ASPMX.L.GOOGLE.COM.
ALT2.ASPMX.L.GOOGLE.COM has address 66.249.93.114
ALT2.ASPMX.L.GOOGLE.COM has address 66.249.93.27
g5$ host mail4.***.**
mail4.***.** is an alias for ASPMX2.GOOGLEMAIL.COM.
ASPMX2.GOOGLEMAIL.COM is an alias for alt1.gmail-smtp-in.l.google.COM.
alt1.gmail-smtp-in.l.google.COM has address 66.249.83.27
alt1.gmail-smtp-in.l.google.COM has address 66.249.83.114
g5$ host mail5.***.**
mail5.***.** is an alias for ASPMX3.GOOGLEMAIL.COM.
ASPMX3.GOOGLEMAIL.COM is an alias for alt2.gmail-smtp-in.l.google.COM.
alt2.gmail-smtp-in.l.google.COM has address 66.249.93.114
alt2.gmail-smtp-in.l.google.COM has address 66.249.93.27
g5$ host mail6.***.**
mail6.***.** is an alias for ASPMX4.GOOGLEMAIL.COM.
ASPMX4.GOOGLEMAIL.COM is an alias for alt1.gmail-smtp-in.l.google.COM.
alt1.gmail-smtp-in.l.google.COM has address 66.249.83.27
alt1.gmail-smtp-in.l.google.COM has address 66.249.83.114
g5$ host mail7.***.**
mail7.***.** is an alias for ASPMX5.GOOGLEMAIL.COM.
ASPMX5.GOOGLEMAIL.COM is an alias for alt2.gmail-smtp-in.l.google.COM.
alt2.gmail-smtp-in.l.google.COM has address 66.249.93.27
alt2.gmail-smtp-in.l.google.COM has address 66.249.93.114
64.233.167.114
64.233.167.27
66.249.83.27
66.249.83.114
66.249.93.27
66.249.93.114
とりあえず、依存関係がすごいという事は聞いていたのだけど、実際はこんな感じ。
g5$ perl -MCPAN -e shell
cpan> install Plagger
Running install for module Plagger
Running make for M/MI/MIYAGAWA/Plagger-0.7.2.tar.gz
Fetching with LWP:
....省略
Plagger-0.7.2/AUTHORS
CPAN.pm: Going to build M/MI/MIYAGAWA/Plagger-0.7.2.tar.gz
*** Module::AutoInstall version 1.02
*** Checking for Perl dependencies...
....省略
Writing Makefile for Plagger
---- Unsatisfied dependencies detected during [M/MI/MIYAGAWA/Plagger-0.7.2.tar.gz] -----
IPC::Run
HTML::Tidy
XML::RSS::LibXML
PDF::FromHTML
POE::Component::Client::DNS
Flickr::API
MIME::Lite
Mail::Address
XML::Feed
WWW::Mixi
URI::Fetch
Search::Estraier
Net::DNS
Text::Kakasi
Net::Delicious
Regexp::Common::profanity_us
Mac::Speech
XML::LibXML
POE
Image::Info
XML::OPML
HTML::Scrubber
Template::Provider::Encoding
Module::Pluggable::Fast
Net::MovableType
Mac::Glue
HTTP::Cookies::Safari
Text::Hatena
HTML::ResolveLink
POE::Component::Client::HTTP
File::Find::Rule
Test::Pod::Coverage
XML::Atom
Text::Tags
XMLRPC::Lite
XML::FOAF
Xango
DateTime
Template::Plugin::JavaScript
DateTime::Format::Strptime
Class::Accessor::Fast
DateTime::Locale
XML::RSS::Liberal
Config::INI::Simple
HTML::TreeBuilder::XPath
Cache::FastMmap
DBIx::Class::Schema
DateTime::Format::Epoch
DateTime::Format::Mail
WebService::Bloglines
JSON::Syck
Text::Emoticon
Date::Parse
DateTime::Format::W3CDTF
File::Copy::Recursive
SVN::Client
Mail::IMAPClient
SVN::Core
Cache::Cache
Test::Pod
Text::CSV_PP
Palm::PalmDoc
Encode::Detect
POE::Component::IKC::Client
HTTP::Cookies::Mozilla
MIME::Types
URI::Find
POE::Component::IRC
XML::Liberal
UNIVERSAL::require
Shall I follow them and prepend them to the queue
of modules we are processing right now? [yes]
....
実際依存関係は自動で入れてくれるので、作業自体はそんなに大変じゃないけど。これ、自力でパッケージしていくのはちょっと面倒かも。依存系を全てcpan2rpmみたいな。Fedora Coreあたりなら誰かやりそうだけど…
もとから入っていたのはこれぐらいか…
- Test::More
- Template
- YAML
- Digest::MD5
- LWP
- HTML::Parser
- WWW::Mechanize
週末は大学の同期との飲み会。毎回朝まで遊び続けるというタフガイイベント(諸事情により俺は3時頃に切り上げてしまったが)。来週末からGが転勤のためアメリカのフロリダ州に行ってしまうため、送別会もかねての集まり。そういう訳もあって今回はかなり集まりがよかったね。ほぼ全員じゃなかったのだろうか。シンガポール在住のKを除けば。このイベント、ただの飲み会なんだが、開催を重ねる度に規模がスケールアップしている感がある。今回は新宿にある焼肉屋六歌仙にて開催。ここの焼肉屋やかなりオススメです。接客もすごいいいし、お肉もめちゃうま。特に自分の好物であるハラミとかが美味しいところが高得点。カルビとかも普通にうまい。次回は海外での開催とか…韓国にて本場焼肉?!それとも、G氏の所に遠征?夏のオーランドーとかめちゃくちゃ楽しそう。フロリダ行った事が無い…
とりあえず的なバックアップスクリプト
_ gay males fuck [akr5 Stay warm and left through the room covering themsel..]
_ gay male teen [akr5 Soon we were naked the scanty leather harnesses we w..]
_ coed porn by c [akr5 Fuck i heard noises from the shower she had only pre..]
_ coed tied up [akr5 I rolled her over onto her back i felt her gently on..]
_ coed wrestling [akr5 I rolled her over onto her back i felt her gently on..]
なんだか、昨日は会社のみんなが10時前にはさっさと帰っていってなんだか取り残された気分だったので全く興味のないサッカーをちょっとだけ見てみた。オフサイクっていうの?あれもよく分からないし。プレーヤーも知らないし、いまいち見所が分からなかったのだけど。最初のゴールなんて素人目から見たら喜べるもんじゃないし。あれファールじゃないんだ…そして何、この見終わった後の敗北感と苛立ち…見なきゃ良かったよ。てかもう見ないな。精神衛生上よくない。
負荷分散する上ではリプリケーションが必要不可欠だと思うのだが、現状ネットにはsymfonyを使ってMySQLのreplicationとうまく連動させる情報が無い。探してみた結果見つかったのが以下の2つ。
*http://www.symfony-project.com/forum/index.php/m/6912/?srch=replication#msg_6912
*http://www.symfony-project.com/content/book/page/model.html
どちらもまともな解になっていないが…
symfonyでは複数のデータベースの操作がサポートがされているので、それを利用する方法がある。しかし、configファイルを異なるslaveに接続させたいウェブサーバ間で統一させるのが難しい。database.ymlは統一して、コードの方で振り分ける事を考えてみた。例えば、database.ymlをサーバを追加する度に以下のように編集する。
all:
master:
class: sfPropelDatabase
param:
dsn: mysql://foobar:foobar@master.localdomain/foobar
192.168.0.1:
class: sfPropelDatabase
param:
dsn: mysql://foobar:foobar@192.168.0.1/foobar
192.168.0.2:
class: sfPropelDatabase
param:
dsn: mysql://foobar:foobar@192.168.0.2/foobar
192.168.0.3:
class: sfPropelDatabase
param:
dsn: mysql://foobar:foobar@192.168.0.3/foobar
そして、モデルクラスを操作するときには以下のようにして設置されたサーバ毎に自動的に読み込む設定が変わるようにする
$users = UserPeer::doSelect(new Criteria, sfContext::getInstance()->getDatabaseConnection($_SERVER['SERVER_ADDR']));
ちょっとこれはコーディングミスを誘発しそうなので却下。2つめの引数は必須じゃないしね。やっぱりベストなのは設置するサーバ毎にdatabase.ymlを書き換える方法なのかなぁ…タコイけど
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://foobar:foobar@localhost.localdomain/foobar
master:
class: sfPropelDatabase
param:
dsn: mysql://foobar:foobar@master.localdomain/foobar
のようにすれば通常は
$users = UserPeer::doSelect(new Criteria);
みたいな操作ができてあとはsave() とdelete() は以下のようにオーバーライドする習慣をつければよい
public function save($con = null)
{
$con = sfContext::getInstance()->getDatabaseConnection('master');
try
{
$con->begin();
$ret = parent::save($con);
return $ret;
}
catch (Exception $e)
{
$con->rollback();
throw $e;
}
}
もう一つの方法は、ウェブサーバ上のローカルホストに、そのウェブサーバと対になるMySQLサーバのポートをsshでバインドしちまうっていう方法
web1$ ssh -L 3306:localhost:3306 db1.localdomain
web2$ ssh -L 3306:localhost:3306 db2.localdomain
web3$ ssh -L 3306:localhost:3306 db3.localdomain
みたいな。強引すぎるし、こっちのほうが管理コスト高くなる罠
一つ前のエントリーでサンプルの貼付けがインデントされずやたら読みづらかったのでcssを見ていたら pre { white-space: normal; } になっていた。何故に。preはpreっぽく表示でしょ。ってそれも意味わからないけど。とりえあずスペースはスペースとして評価されるようにwhite-space: pre;に変更
FC2からFC5にアップグレードしたらpppoeが不安定というか、パケット落ちまくり。とりあえず最新のpppdとpppoeにアップグレードしようとしたらゲートウェイマシンだから開発環境が一切入ってない。もちろんrpmのrebuildできず…rp-pppoeもバージョン3.8のtar.gzの中に3.6のSPECファイルが入っている素晴らしさ。う〜ん。とりあえず
gw$ yum grouplist
gw$ yum -y groupinstall "Development Tools"
gw$ rpmbuild -ba rp-pppoe.spec
あのふと3Dを書きたくなったときのために
えーと、うちの会社の回線はDION(KDDI)なんですが大丈夫だろうか。それより、今日会社の回線の接続がかなり調子悪くて、pingも30%lossとかでる始末。1日中原因調査して、NICとかも付け替えたり、しまいにはゲートウェイサーバのOS入れ替えたりした。これ、もし明日問い合わせてこの一連の事件が原因(まずそれはないだろうとは思うけど)だとしたら殴り込みに行くぜ…
一昨日、昨日のネットワークの不調は結局KDDIの情報流出事件に絡んでいたのだろうか。ゲートウェイのマシンをFedora Core 5からCentOS4.3に入れかえてみた。RHEL互換っぽいのだけど、まだそこまで使い倒してないし、結局ゲートウェイなのでパケットを中継する事ぐらいしかしていなくてハックどころも少ない…
CentOSマシンが手元に一台増えたと思えば昨日の作業も完全に無駄ではないだろう。と自分に言い聞かせてみたり。しかし上流でのネットワークの不調がゲートウェイのOSを入れ替えた翌日に起きるとはな。
今日はパケットロス0%…
さすがベータ版。MacOSX上ではほとんどまともに動作しなかった。途中まではsaveしまくりながら細かにやっていたのだけど、テーブルが30個以上ぐらいになったところから何やってもすぐ落ちるように…Windows版を入れてみて、そっちで作業したらそれなりにまともに動いた。とりあえずOSX上で起きていたような突然落ちたりするような致命的なバグはなかった。しかしForeign Keyを張り始めたところで問題が…設定したはずのkeyがでてこなかったり、うまく選択できなかったり。そうこうやっているうちに画面上が線だらけに!!しかも、消せない…
てなわけで、Windows上でDBDesignerを使うことに。こっちはすこぶる調子いい。OSX上ではSQLEditorという選択肢もあったのだが、こっちはシェアウェアだし、お試し版を使ってみたところ、DBDesignerの方が使いやすかった。加えてMySQL WorkbenchはDBDesigner互換っぽいので、UIもかなり似ていて作業しやすかったのもあった。
とりあえずメモ。
pg_hba.confにてアクセス権限を追加。この場合はlocalアクセスにたいして、ユーザが実行者と同じ場合にのみ接続可能
local chonmagedb ozaki ident sameuser
権限のあるpostgresユーザでデータベース内のテーブルに権限を追加。この場合は読み込み(SELECT)権限を付与
chonmagedb=> grant SELECT on table1 to ozaki;
chonmagedb=> grant SELECT on table2 to ozaki;
...
権限が付与されてか確認
chonmagedb=> \z
mysqlに特化してしまうけど、結構いい。うちのような小さな会社で一人が大部分のプロジェクト(開発部分)を担当しているような場合はER図なんて必要ないのだけどね。物事が開発者の頭の中に入っているだけではマズいという意見もあるが。
直感的な操作ですいすい作れる。SQLの吐き出しとか、データベースとの同期とかもできるみたい。その辺りは既に他のツールでやっているので今回はER図を作成するという目的だけで使った。MySQLで指定できるテーブルオプションや制約は全て(俺の知る限りでは)使える。データはxmlで吐き出されるが、PNG、BMP画像の出力ができる(下の画像がそれ。実際には実寸大3000x2000とかで吐き出される)。なによりもFOSSであるところが素晴らしい。納品物と一緒にDBDesigner4も同梱してしまうことも可。
今年は何かあるのかな?みんなで丸の内プッシュツアーとかやりたい。mixiのコミュいま6000人弱だからなぁ。100人集まっても超楽しいと思うんだけど。
進行中の案件のテスト環境を作る必要があったのでFedora Core 5にxenをインストールした。拍子抜けするぐらい簡単…5台構成ぐらいのシステムだから仮想OSをあと4つぐらい入れないといけない。FC5はデフォルトでインストールされるパッケージが多すぎるんだよなぁ。それでも1時間もかからなかったかな。あとは、ホストOSのメモリ増やさないと
会社のホストは全てDHCPでIP管理がされているわけなのだけど、XENの扱いはどうなるのかなぁと思ってifconfigしてみると
[k-ozaki@xen001 ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:16:3E:00:3D:65
inet addr:192.168.0.101 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::216:3eff:fe00:3d65/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:195 errors:0 dropped:0 overruns:0 frame:0
TX packets:153 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:20975 (20.4 KiB) TX bytes:22261 (21.7 KiB)
ちゃんとHWaddrがついている。で、このMACアドレスについて調べてみると、ちゃんとベンダー登録されている
Search results for "00:16:3E"
MAC Address
Prefix Vendor
00163E Xensource, Inc.
当然なんだけど、ちょっと驚き。QEMU、VMWARE、VirtualPCなんかも全部そうなのかなと思って探してみたらとりあえずVMWAREは登録されているみたい。
xen対応カーネルのインストール
# yum install kernel-xen0
上のステップではxen対応カーネルがデフォルトで起動するカーネルになっていないので、xen対応カーネルが起動するようにgrub.confの修正
# vi /etc/grub.conf
再起動
# reboot
ホストOSの使用するメモリを256Mbに縮小
# /usr/sbin/xm mem-set 0 256
ゲストOSのインストールを開始
# /usr/sbin/xenguest-install.py
What is the name of your virtual machine? vm1
How much RAM should be allocated (in megabytes)? 256
What would you like to use as the disk (path)? /home/xen-vm1
How large would you like the disk to be (in gigabytes)? 4
What is the install location? http://localhost.localdomain/fedora/core/5/i386/os/
インストールは通常のFC5と同様に行う。インストール後、ゲストOSの起動
# /usr/sbin/xm create -c vm1
実は上のxenを使う前にはWindowsマシン上にQEMUとcolinuxを使ってFC5をインストールしたのだけど、ゲストOSをインストールするのに1日かかってウンザリした。このペースで複数もゲストOSインストールできねーよ!って。しかも、がんばってゲストOS一個入れた後に、次のゲストOSをインストールしていたら、最後の最後でコケやがった…それでもーいいやってなってxen使うことにした。xenの方が早いし、楽だし、動作も軽快。最初からxenにしとけばよかった。
xenのインストールが終わると、とりあえず不要なパッケージが入りまくり。サーバにはいらないでしょってのがありすぎ。さすがにxenをデスクトップ環境で使いたくないよね?!そんなめでたいやついるのかな…4GbのディスクサイズでゲストOSを入れたのに、インストール直後にこれだよ。
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
3364488 2856828 333992 90% /
/dev/xvda1 101086 9296 86571 10% /boot
tmpfs 131784 0 131784 0% /dev/shm
これじゃディスクの空き容量がなさすぎてyum updateすらできない。んなわけでイラネーrpmを削除
yum groupremove "Office/Productivity" ?
"GNOME Software Development" ?
"X Software Development" ?
"DNS Name Server" ?
"GNOME Desktop Environment" ?
"Authoring and Publishing" ?
"Network Servers" ?
"X Window System" ?
"Graphics" ?
"Printing Support" ?
"Graphical Internet"
少しはまともになったかな。
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
3364488 1508788 1682032 48% /
/dev/xvda1 101086 9296 86571 10% /boot
tmpfs 131784 0 131784 0% /dev/shm
とりあえずload balancerの設定をする
<VirtualHost *:80>
ServerName frontend
ServerAlias frontend.lan.bancho.jp
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster
<Proxy balancer://mycluster>
BalancerMember http://192.168.0.101
BalancerMember http://192.168.0.102
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>
</VirtualHost>
frontendにアクセスすることによって、リクエストが192.168.0.101と192.168.0.102に振り分けられていることを確認。次に処理速度の測定。
g5$ ab -n 100 "http://frontend.lan.bancho.jp/"
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking frontend.lan.bancho.jp (be patient).....done
Server Software: Apache/2.2.0
Server Hostname: frontend.lan.bancho.jp
Server Port: 80
Document Path: /
Document Length: 3931 bytes
Concurrency Level: 1
Time taken for tests: 10.579 seconds
Complete requests: 100
Failed requests: 0
Broken pipe errors: 0
Non-2xx responses: 100
Total transferred: 412800 bytes
HTML transferred: 393100 bytes
Requests per second: 9.45 [#/sec] (mean)
Time per request: 105.79 [ms] (mean)
Time per request: 105.79 [ms] (mean, across all concurrent requests)
Transfer rate: 39.02 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 104 105 2.4 104 117
Waiting: 104 105 2.4 104 117
Total: 104 105 2.4 104 117
Percentage of the requests served within a certain time (ms)
50% 104
66% 105
75% 105
80% 105
90% 107
95% 111
98% 116
99% 117
100% 117 (last request)
なに9.45req/secって…そんなはずはないだろうと思い、バックエンドのサーバに個別にabしてみる。
g5$ ab -n 100 "http://192.168.0.101/"
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.0.101 (be patient).....done
Server Software: Apache/2.2.0
Server Hostname: 192.168.0.101
Server Port: 80
Document Path: /
Document Length: 3931 bytes
Concurrency Level: 1
Time taken for tests: 0.404 seconds
Complete requests: 100
Failed requests: 0
Broken pipe errors: 0
Non-2xx responses: 100
Total transferred: 412800 bytes
HTML transferred: 393100 bytes
Requests per second: 247.52 [#/sec] (mean)
Time per request: 4.04 [ms] (mean)
Time per request: 4.04 [ms] (mean, across all concurrent requests)
Transfer rate: 1021.78 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 1
Processing: 3 3 0.1 3 5
Waiting: 3 3 0.0 3 4
Total: 3 3 0.1 3 5
ERROR: The median and mean for the initial connection time are more than twice the standard
deviation apart. These results are NOT reliable.
ERROR: The median and mean for the processing time are more than twice the standard
deviation apart. These results are NOT reliable.
ERROR: The median and mean for the waiting time are more than twice the standard deviation apart. These results are NOT reliable.
ERROR: The median and mean for the total time are more than twice the standard
deviation apart. These results are NOT reliable.
Percentage of the requests served within a certain time (ms)
50% 3
66% 4
75% 4
80% 4
90% 4
95% 4
98% 4
99% 5
100% 5 (last request)
g5$ ab -n 100 "http://192.168.0.102/"
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.0.102 (be patient).....done
Server Software: Apache/2.2.0
Server Hostname: 192.168.0.102
Server Port: 80
Document Path: /
Document Length: 3931 bytes
Concurrency Level: 1
Time taken for tests: 0.402 seconds
Complete requests: 100
Failed requests: 0
Broken pipe errors: 0
Non-2xx responses: 100
Total transferred: 412800 bytes
HTML transferred: 393100 bytes
Requests per second: 248.76 [#/sec] (mean)
Time per request: 4.02 [ms] (mean)
Time per request: 4.02 [ms] (mean, across all concurrent requests)
Transfer rate: 1026.87 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 3 3 0.0 3 4
Waiting: 2 3 0.2 3 4
Total: 3 3 0.0 3 4
ERROR: The median and mean for the processing time are more than twice the standard
deviation apart. These results are NOT reliable.
ERROR: The median and mean for the total time are more than twice the standard
deviation apart. These results are NOT reliable.
Percentage of the requests served within a certain time (ms)
50% 3
66% 3
75% 4
80% 4
90% 4
95% 4
98% 4
99% 4
100% 4 (last request)
どちらも正常な値が返ってくる。明らかにどこかでおかしなことになっているのだけど、設定する項目がfrontendぐらいしかないので悩む。ちなみにabはfrontendのマシン上で実行しているので、ネットワーク的な要因はあまりない。疑うポイントとしては192.168.0.101と192.168.0.102がxenのゲストOSな事?!frontendはホストOSではなく物理的に離れたマシン。とはいえ全て192.168.0.0/24上にGigabitで繋がっている。う〜ん
mixiでソシ君(かなりのα)が紹介していたのでパクリネタ。彼と同様俺も会社と自宅間は自転車通勤なのでこういった情報は大変重宝する。Mapionキョリ測で移動区間の最適化ができる。
とりあえず息抜きがてらにこんなの↑でっちあげました。詳細についてはコード見てくれって話だけど(汚くてすみません)、しょこたんブログの写メールを取得、最初に見つけた写メールを記録(最新の取得分として記録)、サイトをなめまわして過去の最新取得分とマッチする画像が見つかるまで実行。終了後にファイルをZIPファイルにまとめる。ZIPファイルをウェブ公開ディレクトリに置き、置き場所へのリンクをtDiaryに自動書き込み。こんなところでしょうか。とりあえずWWW::Mechanizeやばすぎ
最後にcrontab -eして
01 6 * * * /usr/bin/perl /home/k-ozaki/perl/shokotan-get-2.pl
とか追加。ブログの女王2.0が更新を続けてくれる限り俺のブログ日記も自動更新だ!2.0
詳細についてはリンクを見てもらえばと思う。で、-lmygccをコンパイルオプションに加えればいいという話なので、configureどうこうとかMakefileどうこうとかリンク先で書いてあるような事をしなくても、
$ LDFLAGS="$LDFLAGS -L/usr/local/mysql/lib" LIBS="$LIBS -lmygcc" ./configure ....
とかするとちゃんとコンパイルできるし、apacheも正常に起動するし、phpもちゃんと動く。
バグってた。最後に取得した画像の情報を保存しているファイルが相対パス指定だったので多分cronから実行されたときに見つけられなかったと思われ。ダサすぎ。
なおったっぽいw
filterを改良して、ツッコミにURLが入っているとSPAM判定するように修正した。なのでツッコミにURLを入れないように宜しくお願いします。URLを入れたい場合は頭のhttp://を入れない形で入れてもらえばと思います。
ま、ほとんどツッコミ入れる人いないけどね。tDiary(ツッコミ日記)なのに。プッ
tDiaryの追加書き込みにshokotanカテゴリを付け加えるように。これによって後からこういったリンクでまとめて参照できる。あとは本プログラムの配布リンクを付け加えるように。
1:アレゲな会社の設立パーティー@秋葉原
2:アレゲな記念品
3:アンリ・シャルパンティエのデザート
4:970円でゲット
5:最近はまっている米ドラ。7まで見たけど、8〜完がでるのが12月って…間あけすぎでしょ
6:ちょっと前まではキーシャッツっていうの付けたのだけど、かさばるので却下。そしてキーリングの変わりにワイヤーを。キーリングって鍵入れるの面倒だし、最初こじあけるのに苦戦しない?俺はいつも指が痛くなる。でもこのワイヤーはそんなことないし、軽量だし柔らかい。いい感じ★
shokotan_images_2006-6-19.zip (11枚)
この書き込みはshokotan-get-2.0.plより自動生成されています
あのー、これのやり方が全然本家ドキュメントから見つけられないのですが〜。このページに最後にコメントしている人、かなりイヤーな感じ。
2.) No, Symfony does not require a database to use the
sfUser functionality. However, you CAN integrate it
with a database if you choose. There is documentation on this.
there is documentation on thisってどのdocumentationだよ!教えろこのやろー!んなわけで、調べた内容をまとめます。handling sfUser with a database (saving session information in a database. mysql, creole, postgres,,)
まず、sessionの保存に使えるハンドラーは
symfony/storage/
にあります。0.6.2現在でもこんなのがあります
sfCreoleSessionStorage.class.php sfSessionStorage.class.php
sfMySQLSessionStorage.class.php sfSessionTestStorage.class.php
sfPDOSessionStorage.class.php sfStorage.class.php
sfPostgreSQLSessionStorage.class.php
今回は、MySQLでsession情報を格納したかったので、それについてのHOW TOになります。他についてもおそらく同様。詳しくはStorageクラスの中身を見れば解決するかと。まずセッション情報保存用のテーブルを作成
DROP TABLE IF EXISTS `my_session`;
CREATE TABLE `my_session` (
`id` VARCHAR(255) not null COMMENT 'セッションID',
`data` TEXT COMMENT 'セッション情報',
`time` TIMESTAMP COMMENT 'セッション時間',
PRIMARY KEY (`id`))Type=MyISAM COMMENT='セッションテーブル';
次に、apps/アプリケーション名/config/factories.ymlを修正
storage:
class: sfMySQLSessionStorage
param:
database: propel
db_table: my_session
session_name: symfony
db_id_col: id
db_data_col: data
db_time_col: time
終わり。簡単簡単。databaseには、database.ymlで定義した接続名称を指定。db_tableには実際に作成したセッション用のテーブル名。session_nameはsymfony上で保存対象するセッションのnamespace。db_id_col、db_data_col、db_time_colはそれぞれ対応するセッション情報保存用テーブルのカラム名。
つーかこれやんないとクラスター間でのセッション情報の共有ができぬ!session.save_handler = "mm"という手も
え〜、ピノは絶対プレーン(バニラ)でしょ〜。でも気になる…
斜め前のnより。変なところにアンテナはってんな〜。YouTubeに大量に動画がアップされています。
おれ的にはあんまり萌えませんでした…あと、なんかほとんどの動画が一人撮影で、これだけ量があるとちょっと痛い子っぽい。ま、You(おまえの)Tube(テレビ) っていうぐらいのサイトだからこれぐらい使いこなさないとダメなのかもしれません。オレオレテレビ的に。
shokotan_images_2006-6-20.zip (11枚)
この書き込みはshokotan-get-2.0.plより自動生成されています
Chapter 5のファイルが見つからなかったので、1-5セットでご覧ください。10あたりからかなりキテマス
trapped in the closet chapter 1-5
http://www.youtube.com/watch?v=oHFMBpiDkP4
trapped in the closet chapter 1
http://www.youtube.com/watch?v=ms3WabNFWnc
trapped in the closet chapter 2
http://www.youtube.com/watch?v=_CLUDYPpS98
trapped in the closet chapter 3
http://www.youtube.com/watch?v=Vw224Q4k17w
trapped in the closet chapter 4
http://www.youtube.com/watch?v=tllh0Gpk2yk
trapped in the closet chapter 6
http://www.youtube.com/watch?v=K8ySHBcCvVU
trapped in the closet chapter 7
http://www.youtube.com/watch?v=5h5uoGCwX1w
trapped in the closet chapter 8
http://www.youtube.com/watch?v=4z5BPXNWZNk
trapped in the closet chapter 9
http://www.youtube.com/watch?v=vR1vMPF-DFg
trapped in the closet chapter 10
http://www.youtube.com/watch?v=yoerF1sDTVM
trapped in the closet chapter 11
http://www.youtube.com/watch?v=C6Mzp0L_YRo
trapped in the closet chapter 12
http://www.youtube.com/watch?v=h11J1bJtabg
symfonyでデータベースモデル経由(Propel)でtimestamp型の値を取得する場合、通常のgetterでは"Y-m-d H:i:s"を返すが、引数にstrftimeに使えるフォーマットまたはdateに使えるフォーマットを渡す事で任意の形で値を得る事ができる。また、nullを指定すると、unix timestamp (epoch)で取得することができる。
$member = MemberPeer::doSelectOne(new Criteria);
echo $member->getCreatedAt() . "\n";
echo $member->getCreatedAt("Y-m-d") . "\n";
echo $member->getCreatedAt(null) . "\n";
$ php test_timestamp.php
2006-06-20 22:45:00
2006-06-20
1150811100
shokotan_images_2006-6-21.zip (15枚)
この書き込みはshokotan-get-2.0.plより自動生成されています
Carbon Emacsが更新されていたのでインストール。今回の更新でMewが4系(4.2.53)から5系(5.0.53)に変わったのが嬉しい!
mewは標準でいくつかの検索エンジンを使うことができるのだけど、OSXの検索機能であるSpotlightもサポートしている。以前にnamazuを使ったときは、いくつかのフォルダでindexできないメールがあった…謎。gigi-mewはRast.pmがうまく動かなくて断念。結局mg使ってたのだけど、Spotlightが使えるなら使うしかないでしょ!ってことで早速試してみることに。mewは標準でSpotlightをサポートしていると書いたが、Indexを作成するためには、MewImporterというツールを導入しないと行けない。タイトルのリンクを辿れば詳細が書かれているので、ここではコマンドのみ記録
g5$ cd tmp
g5$ wget 'http://homepage.mac.com/izawak/spotlight/MewImporter.mdimporter.tar.gz'
g5$ tar xzf MewImporter.mdimporter.tar.gz
g5$ mkdir -p ~/Library/Spotlight
g5$ mv MewImporter.mdimporter ~/Library/Spotlight/
g5$ mdimport -L 2>&1 | grep MewImporter
"/Users/k_ozaki/Library/Spotlight/MewImporter.mdimporter",
g5$ /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep '\.mew,'
tags: .mew, 'MewX'
Mewのメッ
Before...
_ おざき [110ボンバー ]
_ men raped [Hi not for real roleplayinggames.com ]
_ Alfred [Nice site! ]
_ Elisa [ Nice site keep up the good work. [url=http://www.topix.n..]
_ Den Leola [So Ill see you man tomorro. Den Leola.]