ブログを見直しました

ソースコードをブログに書くようになって、横幅が足りないと感じていたので、単一記事のページを2カラムに変更しました。これで、ソースコードが見やすくなったと思います。TOPページもjavascriptで、2カラムと3カラムを切り替えるようにしようかなと考えています。

同時に以下のプラグインを追加しました。

■ サイトの右側にtwitterのリンクを表示させるプラグイン
http://wpburn.com/wordpress-plugins/wp-followme-plugin

■ 単一記事ページに関連記事のリンクを表示させるプラグイン
http://rmarsh.com/plugins/similar-posts/
http://rmarsh.com/plugins/post-plugin-library/
(similar-postsを使うには、post-plugin-libraryが必要です)

■ 新しい記事を作成した際に、twitterに投稿してくれるプラグイン
http://wppluginsj.sourceforge.jp/simple-tweet/

Zend_Http_Clientでbitly APIを利用する

URL短縮サービス http://bitly.net/ は、APIが準備されているので、自分のプログラムの中に組み込むことができます。

実際に組み込む前に、http://bitly.net でsign up(アカウント登録)して、APIを利用するのに必要なapikeyをメモっておいてくださいね。
英語のページですが、英語がほとんどわからない僕でも登録できたので、そんなに手間取らずにできると思います。

setParameterGet('version', '2.0.1')
       ->setParameterGet('login', 'アカウント')
       ->setParameterGet('apiKey', 'apiKey')    // ログイン後の画面に書いてあるやつR_xxxとか
       ->setParameterGet('longUrl', $url);
$res = $client->request();   // 変換実行

if ($res->isSuccessful()) {
    // 結果を stdClass形式で受け取る
    $body = Zend_Json::decode($res->getBody(), Zend_Json::TYPE_OBJECT);
    $bitlyUrl = $body->results->{$url}->shortUrl;
}
?>

WAVとMP3について

Dub Master Xさんのブログ
http://dubmasterx.seesaa.net/article/130102817.html

Q’HEYさんのブログ
http://qhey.blog.so-net.ne.jp/2009-12-17

最近、Twitterでもとても盛り上がっていたwavとmp3に差があるのかの話題。
僕は、僕も趣味でDJをやらせてもらっているので、とても興味をもってお二方のブログや、他の方のブログを見せてもらっていました。

僕は同じ曲のmp3とwavをクラブで爆音で流してフロアで聴き比べるという機会はなかなか得られないため、このブログはとても参考になります。以前、まだこんなにデータダウンロードが盛んになる前、同じ曲をレコードで持ってる曲を、mp3で買い、その後wavでも買うってことをやったことがあり、ヘッドフォンでできるだけ爆音で聴き比べたことがあります。どっちがmp3かということがわかった上で聞いていたからだと思いますが、ちょっとだけmp3の方が音が小さく感じられました。しかし、思い込みの効果が大きかったと思っています。そのくらいしか差は感じなかった。データの大きさは、4,5倍違うのに。データ量の違い程の差はないと思います。
なので、今回のQ’HEYさんのブログの内容にはとても説得力を感じながら読ませていただきました。ちゃんとエンコードしたデータならっていう付け加えの部分も確かに!と。

ですが、僕は今wavで曲を買ってます。そして今のCDJを使っている状態のままならwavを買い続けると思います。出音がどうこうっていうよりは、原音(非圧縮という意味で)を持っておきたいという自己満足、Q’HEYさんのおっしゃるように320のmp3でもレーベル、サイトによって差があるだろうという考え、CDに音楽として焼く場合、読み込みのスピードに差がないこと、容量はくうけど外付けHDDがだいぶ安くなってること、+100円でwavを買うことで自分の中で曲を選ぶときのフィルターが強くなること(せこいw)とか、こんな理由から。

これから先、PCでDJするようになり、曲の読み込み速度に差があるなら320のmp3を使うようになるかもしれませんし、それ以上にジャケットとかの識別情報がなくなる上で、mp3につけれるタグ情報はとても魅力的です。そのときに、mp3で買うのか、wavで買って自分でエンコードするのかはわかりません。エンコードするのにも、またソフトが必要になりますし。Cubaseのような高価なソフトは持ってないもので。

今後も続いていく話だと思いますが、また別のデータ形式が出てきて、一気に違う方向に行くことだってあるわけですし、楽しみでもあります。zipとかみたいに、可逆な圧縮が出てきて、使うときだけ圧縮といて読み込めるとかになったらすごいでしょうね。

Zend_Db_Tableを利用して複数DBサーバを参照する

DBサーバの負荷分散のために、select文を発行する先のDBを複数用意して運用することがあると思います。マスター(更新&参照)1台に、スレーブ(参照)1台とか。

今回、マスター1台、スレーブ1台の構成で、selectクエリを振り分けるプログラムを作りました。Zend_Db_TableのfetchRow、fetchAll等が呼ばれる度に、クエリを実行するDBサーバを決定します。

まずは、DB接続先の設定をiniファイルに定義します。
接続先情報は、ダミーです。

database.adapter         = Pdo_Mysql
database.params.host     = master.test.com
database.params.username = dbuser
database.params.password = hogehoge
database.params.dbname   = master

# 参照DBhost
database.reference.host  = slave1

次に、Zend_Db_Table_Abstractと各テーブルクラスの間に入れるクラス。
Zend_Db_Table_Abstractクラスの拡張クラスです。

abstract class My_Db_Table_Abstract extends Zend_Db_Table_Abstract
{
    public function fetchAll($where=null, $order=null, $count=null, $offset=null)
    {
        // 2回に1回はmasterに接続
        if ((rand() % 2) == 0) {
            return parent::fetchAll($where, $order, $count, $offset);
        }
        
        // 2回に1回はslaveに接続
        $adapter = $this->getAdapter();
        $this->_setAdapter($this->getReferenceAdapter());
        $rows = parent::fetchAll($where, $order, $count, $offset);
        $this->_setAdapter($adapter);
        
        return $rows;
    }

    public function fetchRow($where=null, $order=null)
    {
        // 2回に1回はmasterに接続
        if ((rand() % 2) == 0) {
            return parent::fetchRow($where, $order);
        }
        
        // 2回に1回はslaveに接続
        $adapter = $this->getAdapter();
        $this->_setAdapter($this->getReferenceAdapter());
        $row = parent::fetchRow($where, $order);
        $this->_setAdapter($adapter);
        
        return $row;
    }
    
    public function getReferenceAdapter()
    {
        if (Zend_Registry::isRegistered('Ref_Db_Adapter')) {
            return Zend_Registry::get('Ref_Db_Adapter');
        }
        
        $config = new Zend_Config_Ini('↑で作ったconfigファイル名');
        $params = $config->database->params->toArray();
        $params['host'] = $config->database->reference->host;
        $db = Zend_Db::factory($config->database->adapter, $params);
        $db->setFetchMode(Zend_Db::FETCH_ASSOC);
        Zend_Registry::set('Ref_Db_Adapter', $db);
        
        return $db;
    }
}

テーブルクラスの定義は以下のように

class Users extends My_Db_Table_Abstract
{
    protected $_name    = 'users';
    protected $_primary = 'user_id';
}

これで、fetchRow、fetchAllを使う際は、masterとslaveにクエリが分散されます