昨日リリースしたサイトが予想以上に反響があったのか、システムリソースの見積もりを失敗したのか、リリース開始から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のメッセージファイルが正しくmdimporterに関連付けられたらMewを立ち上げて、kMを実行。インデックスの作成が始まります。で、ここで、mdimportが徐々にファイルをインデックス化していきます。試しに検索してヒット件数が少なくても焦らないように<ってオレの事だけど。しばらくするとどんどんインデックス化されていって、試しに検索していた語句にたいしてもいっぱい拾ってくるようになる。
快適です。どのエンジン使っても検索できる事には変わりないのだけど、なんかOSXと連動している感がうれしい。自己満的なアレだね。
shokotan_images_2006-6-22.zip (17枚)
この書き込みはshokotan-get-2.0.plより自動生成されています
Symfonyで開発日記というサイトで、「Formの入力値をValidatorを使って変換する」って記事が昨日付けで掲載されているのだけど、この記事で紹介されているmyMbConvertKanaFilterっていうのがあるのだけど、これが以前にオレが公開したmyMbConvertKanaValidatorにそっくりなのは気のせいでしょうか〜。うん、気のせいだよね…参照リンクもないし。気のせいだ。
まーオレのは変換対象がUTF-8とかハードコーディングされていないからもっといけているけど。てかオープンソースだとやっぱりコードは似てしまうよね。知恵がまわってまわって、自分のところに辿りついたところではどこから派生したか分からないし、同じ事やるならスクラッチから作っても同じものができる確率が高い。同じフレームワークを使っていて、使用しているコーディングスタイルが似ていたならばなおさら。あんまりチミチミ言うとLinuxのカーネルソースコードが盗作品だって訴えているのと同じ事になってしまう。
オレなんかはディノの公開ソース使いまくり、お世話になりますくりだからな。
ちょっと気になったのだけど、いくらFilter的な役割をするとはいえ、sfValidatorを継承しているクラスになんとかFilterって名付けるのってどうなのだろうか。思想的な問題だけど。あとtrimなんかは、まさにFilterであって、Validatorで実装する必要がないような気がする。俺はそういった処理はfilter.ymlを使っちゃっている。前後にスペースを許可したいケースって少ないしね。そういった場合はfilterの書き方をちょっと工夫して別途用意したconfigから対象外フィールドを記述するなんかすればいい。
そう考えるとFilter的な役目をもっているmyMbConvertKanaValidatorもいっその事Filterにしちゃって、変換ルールだけ別途configで書いておいた方が生産性が高いのかもしれない。とここまで書けば改良されたコードが公開されるのを期待
てゆーかmyMbConvertKanaValidatorのphpDocumentorがぶっ壊れすぎ。@publicってなんだよ…@access publicの間違いなんじゃねーの。他にも実はツッコミどころ満載なのだけど、今のところ誰もツッコンでないからいっか…
それとこの部分について
しかし、trimやmbConvertKanaはFilterとして機能しているので
結果を保持しなくていけません。
form_idでリクエストの名前を渡し、その名前を
使って結果をリクエストにセットしています。
ほんとはexecteに(&$value, とかして渡されているから、setParameterしなくてもいいと思っちゃうんだよね。これ、0.6.0とかでは、そうだったような。0.6.1あたりからsetParameterしないといけなくなったんだよなぁ、確か。でもソースコードの方をあんまり深追いしていないので適当。
Colorwareという会社がApple製品各種をカスタマイズして売っている。保証について気になったのだけど、一応Colorware社が提供する保証が1年(それとオプションで1年)あるみたい。Apple Storeでは直してもらえなくなりそうだけど。Fusion PinkのMacBook Proとか欲しい、と思ってみたらMacBook Proの場合はFusion Pinkは選択できなかった…それでも20色近く選択できる。値段は+$650。
LDRで読んでいたら、参照していた記事がどこだか分からなくなった…というわけで、”どこか”で話題になっていた話。phpのファイルの終わりには?>を入れるべきではない。これについては?>の後に余白などがあった場合にはエラーになってしまう場合があるから。Zend Frameworkのガイドラインにも、phpコードのみを含むファイルの終端に?>を書かないようにと記されている。symfonyのコードはこれに従っている。
今まで書いたコードがそうでないものが多いので、変換するスクリプトを書いてみた。引数に対象のファイルを与えると、ファイルの後ろから空文字列および?>のみからなる行を削除していく。3行でできた♪
shokotan_images_2006-6-23.zip (17枚)
この書き込みはshokotan-get-2.0.plより自動生成されています
portsからghostscriptを入れると、日本語が文字化けしてしまうので、上の手順に従ってヒラギノフォントが使えるようにする。
g5$ sudo port install ghostscript @8.54
これでghostscriptはインストールされるので、上のリンクより、「日本語フォントのインストール」以降を実施。まずhiralink-utf8.shの先頭部分をportsにあわせて修正して、実行。
g5$ mkdir /opt/local/share/ghostscript/8.54/Resource/CIDFont
g5$ vi ~/tmp/hiralink-utf8.sh
if [ -d /opt/local/share/ghostscript/8.54/Resource/CIDFont ]; then
DIR=/opt/local/share/ghostscript/8.54/Resource/CIDFont
fi
あとは上のリンクと同じ
g5$ sudo hiralink-utf8.sh
g5$ sudo vi /opt/local/share/ghostscript/8.54/lib/cidfmap
g5$ cd ~/tmp
g5$ wget 'http://www.interq.or.jp/mars/cherry/mac/Font.tar.bz2'
g5$ tar xjf Font.tar.bz2
g5$ sudo mv Font /opt/local/share/ghostscript/8.54/Resource/
以前にはCarbonEmacsにも同梱されていたのだけど、ちょっと前から対象外になっているため、自前インストール。
g5$ mkdir ~/lisp
g5$ cd ~/lisp/
g5$ wget 'http://homepage.mac.com/matsuan_tamachan/emacs/pdf-preview.el'
g5$ emacs -batch -f batch-byte-compile pdf-preview.el
あとはdot.emacsに以下のような設定を追加
(setq load-path (append load-path (list "~/lisp")))
;; Emacs から、PDFファイルを作ってプレビューする。(等幅印刷です)
;; http://homepage.mac.com/matsuan_tamachan/emacs/PdfPreview.html
(load "pdf-preview")
Mewのデフォルトの印刷動作はps-printを使うのだけど、できれば「印刷プレビュー」的な機能が欲しい。そこで、pdf-preview.elをインストールして、Mewの印刷時には一度OSXのプレビューで開くようにする。これにより、印刷物が確認できるし、細かい印刷設定などもdot.emacsをいじらずに行える。何よりもOSXっぽいところがイイ。設定はいたって簡単で、mew-print-functionにpdf-preview-bufferを設定するのみ。dot.emacsに以下のよう設定を追加
;; Mewの印刷コマンド(#)の設定
(setq mew-print-function (function pdf-preview-buffer))
これで「プレビュー」で確認したいメッセージをSummaryモードで選択して、#を押す。すると印刷時と同様に、"print this message?"と聞いてくるので、y。実際には印刷は行われないが、選択しているメッセージの本文がプレビューで開かれる。あとは確認するなり印刷するなりは自由
ゲットしました。最近いろいろとSkypeの話を聞くので、遅ればせながらデビューしてみようかと。日本でもSkipeInサービスも開始され(βですが…)たみたいで早速日本のアクセスポイントの電話番号をゲットしました。これで仕事の電話はこの番号に入れてもらい、自分への直通番号として利用。SkipeInは電話番号を10個まで登録できるので、他にもアメリカなどのアクセスポイントの電話番号を登録すれば、アメリカの友達と市内料金で通話することができるのも魅力的。
本題のPlantronics Discovery 640 Bluetoothヘッドセットですが、正直ほかのヘッドセットを使用したことが無いのであまり評価することはできません。ただいろいろとSkypeについて調べていたらPlantronics社の製品が人気があるみたいだったのと、一番最新な機種だった理由から選定。あとは見た目がすごいサイバーなのと、たったの9gっていう売り文句にそそられた。今日半日ぐらい付けていたけど、ほとんど違和感ありません。ただこれで音楽も聞きながら、通話するときには切り替えるみたいな記事を見ましたが、この音質でしかも片耳ではちょっとiTunesを聞くのには向いていませんね…
それと、何故かPower Mac G5でD-Link DBT-120 USB Bluetooth アダプタを使った場合はうまく動作させることができませんでした。デバイスは認識するのだけど、設定しようとすると利用できるサービスが出てこない状態。どうしたものかと。で、Bluetooth内蔵のPower Book G4では多少手こずったものの、うまく動作させることができました。
解決 Mac G5 + D-Link DBT-120でも動くようになりました
shokotan_images_2006-6-24.zip (19枚)
この書き込みはshokotan-get-2.0.plより自動生成されています
shokotan_images_2006-6-25.zip (19枚)
この書き込みはshokotan-get-2.0.plより自動生成されています
待ってました!これでPSPからだけではなく、Macでも…あとはロケーションフリーをアメリカに設置することを行うだけで、24もPrison BreakもLostも…
ぼちぼちそんな季節です
PSPユーザに朗報。ついに出たね、4GbのメモリスティックDUO。価格はアメリカで$200ぐらいで売られているみたいなのだけど、日本ではいくらぐらいになるんだろう。いま1GbのメモリスティックDUOって7000円弱なのね…安っ
もう2.1ですかい…Fjax is an open, lightweight, cross-browser methodology for Ajax-style web 2.0 developmentってことでなんと65行でAjax的なXMLのパースとハンドリングができると書いてある。仕掛けはなんとFlashを使っているということ…じゃ全部Flashでいいじゃんん?って思うんだけど!この技術は正直いただけないです
shokotan_images_2006-6-26.zip (6枚)
この書き込みはshokotan-get-2.0.plより自動生成されています
そういう事だったのか…ファーウェアアップデータを実行すると、ファームウェアをアップデートするアプリケーションがインストールされるという、なんとも分かりにく仕様…
結局これが原因でMac G5 + D-Link DBT-120ではうまくヘッドセットが認識しなかった理由みたい。
の自動投稿やめた。普通にウザイから。ネタとしては十分楽しめた感あり。でも引き続きアーカイブはこちらに蓄積されていくので欲しい方はどうぞ。
これは結構困ったちゃんなバグだな〜。暗号化したデータをbase64_encodeしてURL引数として渡す場合とか困る。とりあえず/は_とかに置換すればbase64に限った話で言えば回避できるが。
フォームのエレメント名にyと名付けて、validate/の中のYAMLファイルに、
methods:
get: [y]
names:
y:
required: Yes
required_msg: 入力してください
とか書くと、実行時に
Configuration file "/Users/k_ozaki/workspace/foobar/apps/frontend/modules/home/validate/test.yml" specifies file or parameter "1", but it is missing the "required" attribute
って出てしまうのはなぜだ。ちなみに0.6.2と0.6.3で確認。sfYaml::configでは全うな値が返ってきているみたいなのだけど、とりあえずy使わないで逃げたので深追いしてない。
なんでだ?検索も一覧も何もでてこない…一時的な問題ならいいんだけど。上の問題についてMLにとりあえず一発投げてみたんだけど、アーカイブ検索できないから参照リンク貼れないよ!
メーリングリストに問い合わせたところ、"でくくるとイインジャネ?って案をもらったので、早速トライしてみた
methods:
get: ["y"]
names:
"y":
required: Yes
required_msg: Input Required
すると今度はこんなエラーが出るようになった
configuration file "/Users/k_ozaki/workspace/foo/apps/frontend/modules/home/validate/test.yml" specifies file or parameter "YAMLString", but it is missing the "required" attribute
stack trace
at ()
in SF_SYMFONY_LIB_DIR/config/sfValidatorConfigHandler.class.php line 315 ...
{
// missing 'required' attribute
$error = sprintf('Configuration file "%s" specifies file or parameter "%s", but it is missing the "required" attribute', $configFiles[0], $name);
throw new sfParseException($error);
}
// determine parent status
at sfValidatorConfigHandler->loadNames(array('/Users/k_ozaki/workspace/foo/apps/frontend/modules/home/validate/test.yml'), 'GET', array(array()), array(), array(array(array('YAMLString')), array(array('required' => '1', 'required_msg' => 'Input Required'))), array('YAMLString'))
in SF_SYMFONY_LIB_DIR/config/sfValidatorConfigHandler.class.php line 77 ...
ってことなので、エラーに従い下記のようにフィックス
methods:
get: ["y"]
names:
"YAMLString":
required: Yes
required_msg: Input Required
なら動くけど…プッ。時間があればパッチ書きたいところだけど、今回のところ、yをbirth_yearとかに変えちゃいます(弱っ
解決しました
methods:
get:
- "y"
こう書くとうまくいきます。YAMLの違った配列の定義の仕方
ステーキハウスB.M
GODIVAのショコリキサー
http://www.godiva.co.jp/products/chocolixir.php
横浜美術館
イサムノグチ展
http://www.yaf.or.jp/yma/exhibition/2006/special/01_noguchi/index.html
横浜カレーミュージアム
symfonyっていうか、propelの問題。propelではdate型を基本unix timestamp (epoch seconds)として扱っているため、1970年以前の日付を扱おうとするとトラぶる。上のリンクで問題は解決できるのだが、こういった事ができなくなるので不便。誕生日って考えてもまだまだ1970以前に生まれた人は多いので、この問題は相当ファックだな。
とりあえず、この問題はクソすぎる。ここ数日間、手元のMac G5に接続したD-Link DBT-120のファームウェアをアップデートしようとしていたのだけどどうにもこうにも上手くいかない。ヘッドセットを購入したPlantronics日本代理店に問い合わせても、とにかくファームウェアアップデートはうまくいかない場合が多いのでしつこく何度もトライしてくださいとのこと。で、ネットで検索しても、同様に、"be patient, try many times"的な事が…
http://discussions.apple.com/thread.jspa?messageID=2532431
正直そういった解決方法はシステム屋には通用しないと思われ。ファームウェアのアップデートなんだから、何度もやったらいつか上手くいくなんて事ないでしょ…バカ正直に信じて何度もD-Link DBT-120を抜き差ししてはやり直したり、G5を何度も再起動したりして試みた俺がアホだった。もうこうなったら強行手段としてなんとか手動でファームウェアをアップデートできないのかと思い始めて検索すると、このような記事がヒット
http://www.holtmann.org/linux/bluetooth/dfu.html
どうやらLinux上でファームウェアを書き換えるツールがあるみたい。さっそく試してみる事に。
first of all, this was the message i was getting from the Apple Mac OSX Bluetooth Firmware Updater 1.2 (BluetoothFWUpdate1.2.dmg). trying the firmware update repeatedly will give you no success. i don't know what the people are saying in the discussion forum about "trying it many times and it'll work eventually" thing. total bull shit!
2006-06-27 17:01:49.068 Bluetooth Firmware Updater[249] Bluetooth Firmware Updater: I am running 10.4.6
2006-06-27 17:01:57.755 Bluetooth Firmware Updater[249] Updating: V:0x00000a12 D:0x00000001 with:/Applications/Utilities/Bluetooth Firmware Updater.app/Contents/Resources/GenericCSR.dfu
2006-06-27 17:02:27.830 Bluetooth Firmware Updater[249] Move in dfu mode failed at the 1 attempt.
2006-06-27 17:02:27.830 Bluetooth Firmware Updater[249] Trying again.
2006-06-27 17:02:37.244 Bluetooth Firmware Updater[249] Updating: V:0x00000000 D:0x00000000 with:/Applications/Utilities/Bluetooth Firmware Updater.app/Contents/Resources/GenericCSR.dfu
2006-06-27 17:03:16.301 Bluetooth Firmware Updater[249] Move in dfu mode failed at the 2 attempt.
2006-06-27 17:03:16.301 Bluetooth Firmware Updater[249] Trying again.
2006-06-27 17:03:25.702 Bluetooth Firmware Updater[249] Updating: V:0x00000000 D:0x00000000 with:/Applications/Utilities/Bluetooth Firmware Updater.app/Contents/Resources/GenericCSR.dfu
2006-06-27 17:04:04.758 Bluetooth Firmware Updater[249] Move in dfu mode failed at the 3 attempt.
2006-06-27 17:04:04.758 Bluetooth Firmware Updater[249] Trying again.
2006-06-27 17:04:14.175 Bluetooth Firmware Updater[249] Updating: V:0x00000000 D:0x00000000 with:/Applications/Utilities/Bluetooth Firmware Updater.app/Contents/Resources/GenericCSR.dfu
2006-06-27 17:04:53.232 Bluetooth Firmware Updater[249] Move in dfu mode failed at the 4 attempt.
2006-06-27 17:04:53.232 Bluetooth Firmware Updater[249] Trying again.
2006-06-27 17:05:02.642 Bluetooth Firmware Updater[249] Updating: V:0x00000000 D:0x00000000 with:/Applications/Utilities/Bluetooth Firmware Updater.app/Contents/Resources/GenericCSR.dfu
2006-06-27 17:05:41.701 Bluetooth Firmware Updater[249] Move in dfu mode failed at the 5 attempt.
2006-06-27 17:05:41.702 Bluetooth Firmware Updater[249] Aborting.
okay, you can be a dumb ass and try the firmware update all day long, or just boot up a linux machine and manually update your dongle firmware. there are many LIVE Linux CD(DVD)s that boot on PPC so this should not be a problem (will in that case you'll have to save the firmware description file that we'll be using later on).
first, copy the dfu file from you Mac to the Linux Machine that you'll be working on. and again, if your going to use a live linux cd, save the file elsewhere so you can access it later when you boot to linux.
g5$ scp /Applications/Utilities/Bluetooth Firmware Updater.app/Contents/Resources/GenericCSR.dfu linux:tmp/
now logon to linux, install bluez-utils, which includes the tool to manually update your dongle firmware. then, at last update firmware.
g5$ ssh linux
linux$ sudo yum install bluez-utils
linux$ sudo dfutool upgrade ~/tmp/GenericCSR.dfu
Filename GenericCSR.dfu
Filesize 994866
Checksum 65085dde (valid)
Available devices with DFU support:
1) Bus 002 Device 002: ID 0a12:0001 Interface 2
Select device (abort with 0): 1
Firmware download ... 131967 bytes
it'll ask you which USB device to update, with a list of USB devices. so choose whichever describes the D-Link DBT-120, and hit enter."Firmware download" line will appear, and it'll start downloading. this will take time. about 5-10minutes, until the bytes shown increases to 994866bytes. then, it'll display a message
Waiting for device ...
and it'll just end. yeah, i thought what the hell? too. so i went on and checked the process return value, and it seem to be okay
$ echo $?
0
so unplug your D-Link DBT-120 and plug it into your mac, check the system profiler and you should see that the firmware has been updated.
before the update
Apple Bluetooth ソフトウェアのバージョン: 1.7.3f4
ハードウェア設定:
尾崎 恭一のPower Mac G5:
アドレス: 00-**-**-**-**-**
製造元: Cambridge Silicon Radio
ファームウェアのバージョン: 1.525(1.525)
Bluetooth の電源: 入
after the update
this works 100%. and now my headsets work too!!
というわけでLinuxでは一発OK。英語圏の方もかなり苦戦したようなので一応英語でアップしといた。ま、日本で同じような現象でこまっている人がいたら、とりあえず上のようにコマンドベースで真似てもらえればファームウェアの更新は一撃で成功すると思います。
Symfonyで開発日記の記事[Formの入力値をValidatorを使って変換する]を参考に新たにfilters.ymlで適応できるtrim filterを作ろうと考えた。cachehandlerどうするとかいろいろ考える事はあるのだけど、とりあえずこの記事を読んでいて気になった点。まず、eregよりpregのほうが早いんでないのと思ってベンチマークを取ってみたら案の定pregの方が早かった。で、そもそも紹介されている方法では先頭に半角スペースがあり、その後の全角スペースがある場合はスペースだけの投稿ができてしまうというバグがある。正確には/^[ ]*/みたいな感じで全角と半角をあわせて確認する必要がる。そして、pregを使うのであれば、全角スペースをそのまま記述しなくても"¥s"で全部処理できるので、コードもすっきりするそんなのムリポ。ただ若干処理速度は落ちるけど、それでもeregより早い。参考までに↓
ちょっ!!preg_replaceの弟4引数はエンコードじゃないだろ。誰もツッこまないtDiary。プッ
てか、filterなんか作らなくてもconvertersなるものが!ギザ便利でメポー♪
しかしどこで自分の定義したconverters用のfunctionを定義すればいいんだ?sfFillInFormFilterを見る限りglobalなfunctionではないといけないみたいなんだけど、それってどこで定義するんだ〜。と思ったらconfig.phpに書くんだとさ〜!ありえん。関係ないところで呼ばれまくりじゃん…
ユーザ定義関数が多くなると、サイト全体に影響を与えてしまうので、configを書くのが面倒であっても、個別にvalidate/foo.ymlで処理したほうがよさげ。あとconvertersは、formに再度遷移したときのため向けなので、updateなんかで事前に前後の空白を取り除いて、フォーム値の検証を行いたい場合などには不向き。
ビックカメラにてゲットしました。PSP以外で見るロケーションフリーはこれで初になるけど、やっぱり表示サイズが大きくなると映像の荒さが気になるね。でも普通にTV見るにはそんなに苦じゃないかも。さすがにDVDとかはちゃんとしたプレイヤーで見たいけど。
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.]