Hatena::ブログ(Diary)

130単位

2010-11-28

10月分の読書記録

並行して少しずつ読んでた本をまとめて登録した感じです。にしても少ない6冊。

WordPressならPHPによるWordPressカスタマイズブックCakePHPならCakePHP辞典 Pocket詳解。それぞれ持っていれば大いに開発に役立つと思います。

10月分読書データ

期間 : 2010年10月
読了数 : 6 冊
Zend Framework 徹底マスター
藤野 真吾 / ソーテック社 (2009-04-11)
★★★☆☆ 読了日:2010年10月29日
コンポーネントの解説がサンプルコードと実行結果画面付きであってわかりやすい。簡単なサンプルアプリの解説もあり
CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用
掌田 津耶乃 / 秀和システム (2010-06)
★★★★☆ 読了日:2010年10月26日
入門的な内容でざっと開発の流れを追える。bakeとSimpleTestの解説があるのも良い
OpenSocial入門 ~ソーシャルアプリケーションの実践開発
田中 洋一郎 / 技術評論社 (2009-01-24)
★★★☆☆ 読了日:2010年10月26日
前半はOpenSocial概要、後半はAPI(JavaScript/RESTful)の解説。アプリ開発した後だと、より全体像が把握しやすいかも
CakePHP辞典 Pocket詳解
滝下 真玄 / 秀和システム (2010-09)
★★★★☆ 読了日:2010年10月26日
項目ごとに各クラス/メソッド/関数の情報が手軽に引けて重宝する。処理の流れや定数一覧の資料も充実
PHPによるWordPressカスタマイズブック
藤本 壱 / ソシム (2010-09)
★★★★☆ 読了日:2010年10月13日
テーマ/プラグイン/DBについての理解が深められる。3.0新機能のカスタム投稿タイプやマルチブログの解説もあり
3秒で落とす 元祖!「1枚企画書」
★★★☆☆ 読了日:2010年10月3日
目的(企画でなすべきこと:Why-Do)→目標(企画で実現したいこと:How-Want)→価値(企画でなし得ること:What-Can)

メディアマーカー

9月分の読書記録 - 130単位 (一ヶ月前)

10月分の読書記録 - 130単位 (一年前)

2010-11-22

覚えたてRubyでTwitterBot作ってみた

Rails3とSinatra触ってみたもののWebアプリWebサイトもネタが浮かばなかったので、軽くbot作ってみることにしました。

ネタ

最近1週間の結果 (日本将棋連盟)
http://www.shogi.or.jp/kisen/week/kekka.html

将棋棋戦の結果。日々更新されるので、これをツイートします。RSSとかないのでそれなりに需要もあるかと思いました。

作成過程

素人の覚え書きなので、突っ込みなどあればお願いします><

スクレイピング
agent = Mechanize.new
agent.get('http://www.shogi.or.jp/kisen/week/kekka.html')
agent.page.root.search('table.kisen')[0].children.each do |tr|
	#creating post data
end
Twitter投稿
ログ
  • 1日ごとなので投稿日のみのプレーンテキストで管理
  • ファイル読み書きはFileクラスをつかう
    • PHPの file_get_gontetns() 的なものがあるといいと思ったりする
    • 【追記】コメントで IO#read 教えていただきました
File.open('latest'){|f|
	latest = f.read
}
  • 日時はTimeクラスをつかう
#Y-m-dからTimeオブジェクト生成
Time.gm *'2010-11-22'.split('-')
#Timeクラス拡張の場合
require 'time'
Time.parse('2010-11-22')
#Timeオブジェクトからフォーマット文字列
timeobj.strftime('%Y-%m-%d')
その他
  • 日本語扱う場合はファイル先頭に「# coding: utf-8」のマジックコメント
  • 要素ぶんループはArray#each
  • インデックスつきループはArray#each_with_index
  • 配列の要素数はArray#size
  • 配列追加はarray << addvalue
  • :string はシンボル
  • 文字列にしたい時はObject#to_s
  • 置換はString#gsub(/regex/, 'replace')
  • 0埋めはformat('%02d', num)
  • 正規表現比較は/regex/ =~ target
  • 出力はputs target
  • デバッグ出力はp target

実行環境へ

完成したもの

[twitter:@shogi_kisen]

1日のわずかな時間しかツイートしないのであまり面白味はないかもですが、無事動いてるみたいです。

関連リンク

将棋関連のTwitterアカウントまとめ - tomute's note


4877832432
Twitter APIリファレンスガイドブック―Twitterアプリを開発する

4798119881
Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)


【関連記事】
音源情報配信TwitterBotをアップデート - 130単位
音源情報配信TwitterBotをまたアップデート - 130単位
音源情報配信TwitterBotをさらにアップデート&2作目 - 130単位

2010-11-20

SinatraをRuby1.9+Passengerで試してみた

Sinatra 
http://www.sinatrarb.com/

Rubyの軽量WebアプリケーションフレームワークSinatraをさわってみました。

前提

Sinatraインストール

sudo gem install sinatra

Passengerの場合

  • app.rbを作成
require 'sinatra'
get '/' do
	"Hello"
end
  • ruby app.rb でサーバー起動して
  • http://127.0.0.1:4567/ で確認できる

Passengerの場合

Sinatra Book Apache and Passenger (mod rails)
http://sinatra-book.gittr.com/#deployment_passenger

こちら参考に。

ディレクトリ構成
sinatra/
├── app.rb
├── config.ru
├── public/
└── tmp/
ローカル動作設定

/etc/hosts

127.0.0.1 sinatra.local

Apache VirtualHost設定

<VirtualHost *:80>
	ServerName sinatra.local
	DocumentRoot "/path/to/sinatra/public"
	<Directory "/path/to/sinatra/public">
		Order allow,deny
		Allow from 127.0.0.1
	</Directory>
</VirtualHost>
  • 動かない場合<Directory>ディレクティブで以下確認するといいかも
    • Options FollowSymLinks
    • PassengerEnabled On
rackup設定

config.ru

require 'app'
run Sinatra::Application
require './app'
run Sinatra::Application
  • こうすると動く
require File.expand_path(File.dirname(__FILE__)) + '/app'
run Sinatra::Application

Apacheリロードして http://sinatra.local/ で確認

f:id:deeeki:20101120151524j:image

開発時のリローディング
  • tmp以下にalways_restart.txtを置いてApacheリロード
  • 以降変更が即反映されるようになる
  • ドキュメント等でみかけるrestart.txtではうまくいかないっぽい

わかったこと


4873113679
初めてのRuby

4863540221
Ruby逆引きハンドブック

2010-11-11

条件付きでWordPressの環境同期できるプラグインを作ってみた

deeeki's wp-sync at master - GitHub 
https://github.com/deeeki/wp-sync

同一サーバー内において、環境を同期できるWordPressプラグインです。

例えば、開発→本番/本番→開発どちらでもできます。同期する元のダッシュボードで実行します。ただし条件がたくさんあります><

動作条件

使い方

備考

課題


検証も不十分だったりしますが、何かフィードバックが得られればと思い公開してみます(問題になりそうとかであれば即刻削除します)。利用される場合は、必ずファイルおよびDBバックアップサーバーの外に行ってから試してください。もし損害が発生したとしても責任は負いません。負えません><

不具合報告やフィードバックはコメントかTwitterでお願いいたします。

2010-11-06

SWF Editor for PHPのインストールとswfファイル圧縮

SWF Editor for PHP プロジェクト日本語トップページ - SourceForge.JP 
http://sourceforge.jp/projects/swfed/

swfファイルのコンテンツ入れ替えができるPHP拡張です。

機能の一部である圧縮が気になって、サンプルファイルが用意されていたのでさわってみました。

※環境はCentOS5.4/PHP5.1.6(yum)

インストール

tar -xzf swfed-0.24.tar.gz
cd swfed-0.24/src/
phpize
./configure
make
sudo cp modules/swfed.so /usr/lib/php/modules/
sudo cp vim /etc/php.ini
  • php.iniに下記追加
extension=swfed.so
  • Webで使うならApacheリロード(/etc/init.d/httpd reload)

圧縮

wget http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfcompress.php
php swfcompress.php original.swf > compress.swf
  • サンプルファイルを取得
  • ファイルに出力

100KB程度のファイルが65KB程度になりました。

ただし圧縮するとFlash Lite 1.1では表示できないのでその点注意です。

2010-11-05

CakePHP AppControllerのコンストラクタでのcakeError()の挙動

結論

AppControllerのコンストラクタでcakeError()*1を使うと、AppControllerのコールバックメソッドが動作しないため、意図しない挙動になることがある。

処理の流れと原因

※わかりづらいですが数字の項目は条件分岐ととらえてください

Object#cakeError()の流れ
ErrorHandler#__construct()の流れ
原因の解説

太字部分のコードです。

<?php
static $__previousError = null;

if ($__previousError != array($method, $messages)) {
    $__previousError = array($method, $messages);
    $this->controller =& new CakeErrorController();
} else {
    $this->controller =& new Controller();
    $this->controller->viewPath = 'errors';
}
  • CakeErrorControllerはAppControllerを継承している
  • staticな$__previousErrorがないと仮定すると、AppControllerのコンストラクタでcakeError()が呼ばれると無限ループになる
  • ただし$__previousErrorに前回のエラー組み合わせが入っているため、無限ループは回避される
  • 回避されるとControllerがインスタンス化されるため、AppControllerのコールバックメソッドは動作しない

というわけでした。当然かもしれませんが無限ループ回避してるあたりCakePHPよくできてるなーと思わされました。

まとめ

もう一度書いてみます。

AppControllerのコンストラクタでcakeError()を使うと、AppControllerのコールバックメソッドが動作しないため、意図しない挙動になることがある。

よって、

  • エラー時にAppControllerのコールバックメソッドを期待する場合、AppControllerのコンストラクタではcakeError()は使わない
  • コントローラー共通の初期化処理は極力beforeFilter()で行う*2

の2点に気をつけることが必要ってことを学びました。

(※CakePHP 1.3.5)


Pocket詳解 CakePHP辞典
Pocket詳解 CakePHP辞典

【関連記事】
CakePHP HTML_Emojiで絵文字変換 - 130単位

*1:Object#cakeError()

*2コンポーネントの動的切り替えはおそらくコンストラクタでないとできないはず

2010-11-02

GmailからGmailへ複数人POP受信で見落とし回避の設定

現象

こんな条件下で、ある重要なメールが受信されなくて見落としてしまったので、原因を探ってみました。

原因

これらのメールに POP でアクセスするには、これらのメールを受信トレイか [すべてのメール] に移動する必要があります。また、メール クライアントから送信されたメールや既にクライアントダウンロードされているメールのコピーはダウンロードされないようになっています。

一部のメールがダウンロードされない - Gmail ヘルプ
  • アーカイブしていたのはすべてのメールに含まれるので問題ない
  • 複数人でPOP受信していたのがおそらく問題
    • 「受信したメッセージのコピーをサーバーに残す」へのチェックはGmail同士ではできないと思っていた
    • とはいえ複数人で同じメールの大部分は受信できていることも確認した

対策

POP受信されるGmailで「POPを有効にする」設定にする
  • 設定 -> メール転送とPOP/IMAP

f:id:deeeki:20101102171527j:image

POP受信するGmailで最新モードを有効にする

f:id:deeeki:20101102171526j:image

※複数人でPOP受信している場合は上記を全員に設定する


そんなわけで、「recent:」を付けて最近30日間が対象になる最新モードというのがあることを初めて知ったのでした。

ただしPOP受信にこだわる必要はなく、元のGmail側でメール転送するというアプローチもあります。こちらのほうがシンプルで直感的ですし、確実性も高いんじゃないかと思います(複数アドレスに転送も可能です)。

関連リンク

メールの超プロが教えるGmail仕事術
メールの超プロが教えるGmail仕事術

2010-11-01

HeadSpace2プラグイン Google Analytics複数ドメイン解析

WordPress :  HeadSpace2 SEOWordPress Plugins 
http://wordpress.org/extend/plugins/headspace2/

SEO対策を中心に何でもできるプラグインではありますが、Google Analytics 複数ドメインの解析で一部不具合が起きることに気づきました。リファラーがおかしくなるようです。(※Ver.3.6.33)

複数ドメイン解析対応

設定

設定 -> HeadSpace -> サイトモジュール -> Google Analytics -> 生コード に入力します。

pageTracker._setDomainName("none");
pageTracker._setAllowLinker(true);
コード修正

headspace2/modules/site/analytics.php 161-168行目

<?php
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("<?php echo $this->tracking ?>");
<?php if ($this->domain) echo "pageTracker._setDomainName('".$this->domain."');\r\n"; ?>
<?php if ($this->raw) echo $this->raw."\r\n"; ?>    //この行を_trackPageviewの上に移動する
pageTracker._trackPageview(<?php echo $virtual ?>);
} catch(err) {}
</script>

こんな感じで対応できるわけですが、プラグイン本体をいじる上に、出力されるJavaScriptのコードが若干古いです。さらにWordPress公式プラグインディレクトリでは、0/12の「Broken」の評価になっています。


そんなわけで、更新日時も新しく評価も良好な以下のGoogle Analytics専用プラグインを利用したほうがいいでしょう。

WordPress :  Google Analytics for WordPressWordPress Plugins 
http://wordpress.org/extend/plugins/google-analytics-for-wordpress/

Google Analytics for WordPress設定

  • アカウント認証もしくは埋め込みコードを手動入力する
  • Show advanced settingsにチェックを付ける

f:id:deeeki:20101102082538j:image

  • Domain trackingにnoneと入力する

f:id:deeeki:20101102082537j:image

  • Add _setAllowLinkerにチェックを付ける

f:id:deeeki:20101102082536j:image

これで複数ドメイン解析ができます。(※Ver.4.0.9)


プロが教える Google Analytics 実践テクニック
プロが教える Google Analytics 実践テクニック

488337730X
PHPによるWordPressカスタマイズブック―3.x対応


【関連記事】
WordPress Google Analytics解析結果表示プラグイン2種類の比較 - 130単位