Home

ezzyの屈辱

iPhoneでギターアンプ


iPhoneを利用したアンプシュミレーターです。今後フォン端子の出力などがつけば、ステージ上でiPhoneもしくはAndroidで音を作るプレイヤーが出てくるんだろうな。ライブ中に操作の必要ないものならコンパクトエフェクターよりこっちの方が全然良いですね。かさばらないですし、なにより安い!久々に「はっ!?」とさせられた商品でした。

まだ気づいてないだけでiPhoneなどのデジタル端末に置き換えられるものがまだまだありそうな気がしてきたぞ…何か思いつかんかな…

AC/DC来日決定!!!!!

AC/DCの来日が正式に決定しました!!!

AC/DC : AC/DC、3月の来日公演の先行予約受付を10/17開始 / BARKS ニュース

<BLACK ICE TOUR>公演日程
2010年3月12日(金)さいたまスーパーアリーナ
開場:18:00 開演:19:00
S:12,000 A:¥10,000 B:¥8,000 C:¥6,000(tax in)
[問]H.I.P. 03-3475-9999
2010年3月16日(火)京セラドーム大阪
開場:18:00 開演:19:00
S:12,000 A:¥10,000 B:¥8,000 C:¥6,000(tax in)
[問]H.I.P.大阪 06-6362-7301


自分の中での『これを観ずには死ねん!』ランキングのNo.1バンドがAC/DCなんです!前回来日の際に観なかったことをどれだけ後悔したことか…

これで私も心置きなくライブ生活を引退できます!!まあ、引退しないんですけど。

今回、埼玉・大阪の2公演なんでどっちも参戦したいのはやまやまなんですが、さすがに3/12・16と日にちが離れすぎているため両方はムリ!泣く泣く埼玉のみに。
関西方面には大事な友達が2人いるので是非大阪にも行きたいのですが…
すまん、友よ。
大阪には行けん!!

まあ、そんことより、当日はみんな『For Those About To Rock』でFireeeeeeeeeだ!!!!

ギターアンプに対するマイキングでの音の違い

How To Record Professional Metal Guitar Tone

メタルギターをレコーディングする際の技術的な解説を行なっている動画です。全て英語で解説されていますが、42:12からはマイキングによる音の違いを実際に聞かせてくれるので是非聴いてみて下さい。私はいつでもポジション3。

27:10から実際にキャビネットにマイキングしてある画像が出てくるんですが、かなり吸音してますね。確かにこれぐらいやったほうが良いのかも。次ギター録りする時はこれぐらい自分もやってみようかな。

ちなみにわたくし英語は聴き取れませんのでほとんど何を言っているのか分かりませんでした。

Zend_ApplicationでZend_Session_SaveHandler_DbTableを使うとエラーになってしまう

Zend_Applicationが便利そうなので使ってみたら一つハマりましたので報告(Zend Frameword 1.9.0にて)。

Zend_Application_Resource_Sessionを使って設定ファイルからZend_Session_SaveHandler_DbTableの設定を行なおうとすると

Zend_Db_Table_Exception: No adapter found for Zend_Session_SaveHandler_DbTable in /library/Zend/Db/Table/Abstract.php on line 754

というエラーメッセージを吐いて止まってしまいます。

対処法としては”全体のブートストラップを行なう前にDBリソースだけ先にブートストラップを行う”という方法をとってみましたが、あまり美しい方法では無いので次のヴァージョンアップで直っていることを願います。

$application->getBootstrap()->bootstrap('db');
$application->bootstrap()
            ->run();

行き着く先は

Nyle “Let The Beat Build” from Nyle on Vimeo.

ワンテイクで撮影とレコーディングが行われたNyleというアーティストの動画です。

音は緩いし、まとまりもない。
しかし何故か惹かれる。

最終的に人に残された余地はここにしかないのでは…

Great Music!!

tailで出力されるログの文字コードを変換

grep や tail -f で、特定の文字を色付けしてみる - おはよう。目覚めは眩しくて、悲しい…
を見た。
あっ、この方法を使えばtailで出力されるログの文字コードを変換することができるぞ!

tailで確認するログの文字コードをeuc-jpからutf-8に変換する場合はこんな感じ

tail -F php_error.log | perl -MEncode -pe '$_ = encode("utf-8", decode("euc-jp", $_))'

うん、便利!!

del.icio.us cached++を使って最近deliciousに追加したブックマークをWordpress上で公開

あまり興味ある人もいないでしょうがdeliciousに登録している私のブックマークをblog上で公開してみることにしました。

del.icio.us cached++のインストールは他のプラグインと同様に、非常に簡単。

  1. del.icio.us cached++からzipファイルをダウンロード
  2. ダウンロードしてきたファイルを解凍すると中にdelicious_cached_pp.phpというファイルがありますのでこれをwp-content/pluginsに格納
  3. プラグイン管理画面でdel.icio.us cached++の使用を許可
  4. 後はテンプレートに
    <ul>
    	<?php delicious_pp('accountname'); ?>
    </ul>

    を記述

以上で最近deliciousに追加したブックマークをWordpress上で公開できます。

テンプレートに記述するdelicious_pp()を使ってもう少し詳細に表示をカスタマイズすることもできます。

function delicious_pp(
    $username, //ブックマークを表示するdeliciousのアカウント名
    $count=15, // 表示をさせたいブックマーク数
    $extended=1, //NOTES表示の有無
    $tags=0, //表示させるタグの数
    $before='<li>', //各々のブックマークの前に追加する文字列
    $after='</li>', //各々のブックマークの後に追加する文字列
    $beforeExtended='<p>', //各々のNOTESの前に追加する文字列
    $afterExtended='</p>', //各々のNOTESの後に追加する文字列
    $beforeTags='<p>', //ブックマークごとのタグの前に追加する文字列
    $betweenTags=' ', //ブックマークに対するタグが複数の場合にタグ同士の間に追加する文字列
    $afterTags='</p>' //ブックマークごとのタグの後に追加する文字列
)

しかし$tagsを設定してもどうにもタグが表示されません。
原因を調べてみるとどうもdeliciousのRSSの仕様が変わったらしい。現在、deliciousのRSSでは<category>にタグが記述されているのですが、下記サイトによると以前は<dc:subject>に記述されていたようです。ソースを覗いてみると

$linkTagsRaw = $feedItems[$iter]['dc']['subject'];

という処理があるので新しい仕様には対応していないみたいです。まぁ、どちらにしろ私はタグを表示させる気はないので良い事なんですが、タグを表示したい人はソース書き換えて下さい。ちなみにdel.icio.us cached++のヴァージョンは1.3a4。

Big Sky :: はてなブックマークをPlaggerで同期する際の注意点

そういえばdel.icio.usってdeliciousに変わってたんですね。今回初めて気付きました。

Zend_Sessionでセッションデータの検証

Zend_Session_Validateなる存在をみなさんご存知ですか?Zend Frameworkのマニュアルには載っていないのですがZend_Session_Validateを使用する事でZend_Session::start()時にセッションデータの検証を行う事が出来るのです。Zend_Sessionのソースを覗いている時に偶然発見してしまいました。たまにはソースも覗いてみるべきですね!

Zend_Session_Validatorの処理としてはZend_Session::registerValidator()で検証すべきデータをセッションに格納し、Zend_Session::start()の時にセッションデータの検証を行います。で、その検証に失敗するとZend_Session_Exceptionが返されますのでtry~catchで受け取り適切な処理を記述する形になります。

最新版Zned Framework(1.7.1)で組み込まれているZend_Session_ValidateはZend_Session_Validator_HttpUserAgentだけですので、とりあえずこれを実装してみます。


try {
	Zend_Session::start();
} catch (Zend_Session_Exception $e) {
	throw $e;
}
Zend_Session::registerValidator(new Zend_Session_Validator_HttpUserAgent());

これで前回セッションを使用した時とUserAgentの変更があればセッションデータを破棄することができます。携帯サイト等でこのコードを実装すると多少問題が出ることもありそうですが、PCサイトであれば多少なりとも安全になりますのでオススメです。

あと注意点として”Zend_Session::start()の後にZend_Session::registerValidator()を行う事”を挙げておきます。処理を理解すると当然なんですが、何となく逆にしてしまいがちなので。

2008/12/15 追記:ZJ吉田さんがコメントされた内容

早速バグとして報告をあげておきました。

がどうしても気になったのでメールで確認してみたところ、『マニュアルにZend_Session_Validatorの記述が無い』というバグでした。バグはプログラムの方だと思い込んでいたのでマニュアルのバグとは気付きませんでした。ZJ吉田さんのおかげでZend Frameworkに貢献でき大変感謝です!!

2009/02/23 追記

サンプルソースに間違いがありましたので訂正いたしました。
Zend_Session::start()に失敗した場合、Zend_Session::destroy()を行なってsessionを破棄しようとしていましたが、startに失敗しているのに破棄できる訳がなくWarningメッセージ(Trying to destroy uninitialized session)をはいておりました。

Zend Framework(Zend_Validate)におけるZend_Translateを用いたエラーメッセージの日本語化

Zend Frameworkではデータ検証用クラスとしてZend_Validateが用意されています。日ごろ使いそうな検証はほぼ揃っているのでありがたく使わせてもらっているのですが、残念ながらこのZend_Validateには日本語のエラーメッセージが実装されていません。なのでエラーメッセージの日本語化を自分で行う必要があります。 Zend Frameworkではメッセージの多言語化を行うためにZend_Translateというクラスが用意されているので、今回はこのZend_Translateを用いてZend_Validateの日本語化を行ってみます。

まずZend_Translateを用いてメッセージの他言語化を行う場合、メッセージの翻訳データを用意する必要があります。そしてZend_Translateではその翻訳データの種類に合わせて多くのアダプターが用意されています。私は今までプログラムの翻訳作業等やったことがないので、とりあえず一番使われていそうなGettextアダプタを使用してみることにします。gettextについての解説は下記サイトが大変参考になりました。

GNU gettextユーティリティ

gettextで翻訳作業を行うために、まずPOファイルと言うものが必要になります。gettext関数を用いて書かれたプログラムであればxgettextなどを用いて自動で翻訳のもとになるメッセージを抽出できるようなのですが、今回はクラスで定義されたプロパティからメッセージを抽出する必要があるので、自作でZend_Validateからメッセージを抽出するプログラムを作ってみました。POファイルはテキストファイルなので手作業で作る事も出来るのですが、今後Zend_Translateのクラスが増えたり、メッセージが増えたりする事があるかもしれませんのでこのようにプログラムを組んでおくと楽なんじゃなかろうかと思います。

xgettext.pl

#!/usr/bin/perl
use File::Basename;

my $start;
my $basename;
my %texts;

while (<>) {
    chomp;
    if (/\$_messageTemplates = array\($/) {
        $start = 1;
        next;
    } elsif ($start) {
        if (/\);$/) {
            $start = 0;
            next;
        }
        s/^.*=> ('|")([^\1]*)\1,?$/$2/;
        $basename = basename(${ARGV});
        push @{$texts{$_}}, $basename . ':' . $.;
    }
    if (eof) {
        close(ARGV);
    }
}

print "msgid \"\"\n";
print "msgstr \"\"\n";
print "\"Content-Type: text/plain; charset=utf-8\\n\"\n";
print "\"Content-Transfer-Encoding: 8bit\\n\"\n\n";

foreach $key (sort keys %texts) {
    foreach my $file_name (@{$texts{$key}}) {
        print "#: ${file_name}\n";
    }
    print "msgid \"${key}\"\n";
    print "msgstr \"\"\n\n";
}

PHPのフレームワークの解説なのにperlで実装してしまいました。私の中でコマンドラインのプログラムを書く際はシェルスクリプトかperlで書くという掟があるのです。許して下さい…。

./xgettext.pl lib/Zend/Validate/* > validate.po

とコマンドラインでやってもらえるとPOファイルが作成できます。
ちなみに現在のZend Frameworkの最新版(1.7.1)でのPOファイルはこんな感じです。

msgid ""
msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: EmailAddress.php:58
msgid "'%hostname%' does not appear to have a valid MX record for the email address '%value%'"
msgstr ""

#: EmailAddress.php:57
msgid "'%hostname%' is not a valid hostname for email address '%value%'"
msgstr ""

#: EmailAddress.php:61
msgid "'%localPart%' is not a valid local part for email address '%value%'"
msgstr ""

#: EmailAddress.php:59
msgid "'%localPart%' not matched against dot-atom format"
msgstr ""

#: EmailAddress.php:60
msgid "'%localPart%' not matched against quoted-string format"
msgstr ""

#: Hostname.php:74
msgid "'%value%' appears to be a DNS hostname but cannot extract TLD part"
msgstr ""

#: Hostname.php:71
msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list"
msgstr ""

#: Hostname.php:73
msgid "'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'"
msgstr ""

#: Hostname.php:72
msgid "'%value%' appears to be a DNS hostname but contains a dash (-) in an invalid position"
msgstr ""

#: Hostname.php:77
msgid "'%value%' appears to be a local network name but local network names are not allowed"
msgstr ""

#: Hostname.php:70
msgid "'%value%' appears to be an IP address, but IP addresses are not allowed"
msgstr ""

#: Digits.php:61
msgid "'%value%' contains not only digit characters"
msgstr ""

#: Float.php:45
msgid "'%value%' does not appear to be a float"
msgstr ""

#: Ip.php:41
msgid "'%value%' does not appear to be a valid IP address"
msgstr ""

#: Date.php:60
msgid "'%value%' does not appear to be a valid date"
msgstr ""

#: Hostname.php:76
msgid "'%value%' does not appear to be a valid local network name"
msgstr ""

#: Int.php:41
msgid "'%value%' does not appear to be an integer"
msgstr ""

#: Date.php:61
msgid "'%value%' does not fit given date format"
msgstr ""

#: Regex.php:45
msgid "'%value%' does not match against pattern '%pattern%'"
msgstr ""

#: Hostname.php:75
msgid "'%value%' does not match the expected structure for a DNS hostname"
msgstr ""

#: Alnum.php:68
msgid "'%value%' has not only alphabetic and digit characters"
msgstr ""

#: Alpha.php:68
msgid "'%value%' has not only alphabetic characters"
msgstr ""

#: Hex.php:49
msgid "'%value%' has not only hexadecimal digit characters"
msgstr ""

#: Alnum.php:69
#: Alpha.php:69
#: Digits.php:62
msgid "'%value%' is an empty string"
msgstr ""

#: StringLength.php:47
msgid "'%value%' is greater than %max% characters long"
msgstr ""

#: StringLength.php:46
msgid "'%value%' is less than %min% characters long"
msgstr ""

#: EmailAddress.php:56
msgid "'%value%' is not a valid email address in the basic format local-part@hostname"
msgstr ""

#: Between.php:54
msgid "'%value%' is not between '%min%' and '%max%', inclusively"
msgstr ""

#: GreaterThan.php:45
msgid "'%value%' is not greater than '%min%'"
msgstr ""

#: LessThan.php:45
msgid "'%value%' is not less than '%max%'"
msgstr ""

#: Date.php:59
msgid "'%value%' is not of the format YYYY-MM-DD"
msgstr ""

#: Between.php:55
msgid "'%value%' is not strictly between '%min%' and '%max%'"
msgstr ""

#: Ccnum.php:61
msgid "'%value%' must contain between 13 and 19 digits"
msgstr ""

#: InArray.php:45
msgid "'%value%' was not found in the haystack"
msgstr ""

#: Ccnum.php:62
msgid "Luhn algorithm (mod-10 checksum) failed on '%value%'"
msgstr ""

#: Identical.php:47
msgid "No token was provided to match against"
msgstr ""

#: Identical.php:46
msgid "Tokens do not match"
msgstr ""

#: NotEmpty.php:45
msgid "Value is empty, but a non-empty value is required"
msgstr ""

この作成したPOファイルのmsgidに対する日本語訳を下記のようにmsgstrに記述していきます。

#: StringLength.php:47
msgid "'%value%' is greater than %max% characters long"
msgstr "%max%文字以下で入力して下さい"

全ての日本語訳が完成したらmsgfmt等を用いてMOファイルを作成します。

msgfmt -o validate.mo validate.po

msgfmtに関しても詳しい事は上記『GNU gettextユーティリティ』にて解説してありますので参考にしてみて下さい。

以上で翻訳データの準備は完了です。後はこの翻訳データを用いてZend Frameworkでのエラーメッセージの日本語化を行います。

まず翻訳データを格納するディレクトリの構造を決める必要があります。
Zend Frameworkでは次の5つの構造を推奨しています。

  • 単一構造のソース
  • 言語ごとに分けた構造
  • アプリケーションごとに分けた構造
  • Gettext 形式の構造
  • ファイル構造のソース

今回アダプターとしてGettextを選びましたので『Gettext 形式の構造』を選ぼうかと思ったのですが”LC_MESSAGES”の存在意義が見いだせなかったので『 言語ごとに分けた構造』にしてみました。

/languages
  /ja
    validate.mo

あとはindex.phpなどでZend_translateオブジェクトを作りZend_Validate_AbstractにDefautlTranslatorとして登録するだけです。

$translate = new Zend_Translate('gettext', '/var/www/html/languages', null, array('scan' => Zend_Translate::LOCALE_DIRECTORY));
Zend_Validate_Abstract::setDefaultTranslator($translate);

注意事項としてZend_Translateの第二引数として渡しているパスは翻訳データを格納しているディレクトリまでの絶対パスで指定して下さい。

以上でZend_Validateのエラーメッセージの日本語化は終了です。
記述した内容でおかしなところ等あればコメント残して頂けると喜びます!!

変わらぬ思い

日頃『プログラムとは何か?』と問われれば、『信号の入力と出力があってその間で何かゴニョゴニョするもの』と答えているのですが、今日ボケ〜としてた時にこれと似たようなことを昔言っていたなと思い出しました。それはミキサーの説明する時です。

あっ、結局一緒のことやってるだ。

あまり変わってない自分に気付いた瞬間でした。

Home

Search
ezzy's latest bookmarks (delicious)
Feeds

Page Top