<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Screw-Axis</title>
	
	<link>http://screw-axis.com</link>
	<description>flexible, elastic and principled.</description>
	<lastBuildDate>Thu, 08 Apr 2010 01:00:18 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/screw-axis" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="screw-axis" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>[Prezi] 日本語マニュアル公開</title>
		<link>http://screw-axis.com/2010/04/08/prezi-manual/</link>
		<comments>http://screw-axis.com/2010/04/08/prezi-manual/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 01:00:18 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Prezi]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=813</guid>
		<description><![CDATA[最近使う機会の増えているプレゼン作成ツール Prezi のチュートリアル(Preziアカデミー)とマニュアルを、公式に許可を得て日本語化してみました。
Prezi日本語マニュアル
Preziは、無料で使える新しいタイプの [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://screw-axis.com/wp-content/uploads/2010/04/prezi.jpg" alt="" title="Prezi" width="240" height="160" class="alignright size-full wp-image-814" />最近使う機会の増えているプレゼン作成ツール Prezi のチュートリアル(Preziアカデミー)とマニュアルを、公式に許可を得て日本語化してみました。</p>
<p><a href="http://dev.screw-axis.com/doc/prezi/">Prezi日本語マニュアル</a></p>
<p>Preziは、無料で使える新しいタイプのプレゼン作成ツールです。PowerPointとは発想が異なり、プレゼン全体を一枚の大きな模造紙のように見立てて、その中を移動して行くようなイメージです。<br />
<span id="more-813"></span><br />
最初に<a href="http://delicious.com/semooh/presentation">このツールを見た</a>のが2009年の1月でした。自分と仕事をしたことのある人は分かると思うのですが、ホワイトボードの前に陣取って全体像を描きながら説明するのがスタイルの自分には、非常にシックリくるツールです。当時は日本語が使えずに利用機会は無かったのですが、その後、限定的ではありますが日本語も使えるようになったので、徐々に利用が増えていきました。</p>
<p>単に「ちょっとカッコイイ感じのプレゼンが作れるツール」ではなく、ツールが思考の方を引っ張る好例ではないかと思っています。今自分はフリーで仕事をしていますが、以前のようにメンバーが居る立場であれば、ロジカルに物事を考える練習としてでも使わせてみたいななどと考えながらドキュメントを作りました。</p>
<p>興味を持ったら是非、ちょっと触ってあきらめずに、一本プレゼンを作ってみて下さい。<br />
きっと、プレゼンの組み立てそのものが変わると思います。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2010/04/08/prezi-manual/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Tuitter] Twitterのプロフィール設定変更機能を追加</title>
		<link>http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/</link>
		<comments>http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 14:29:51 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Tuitter]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=803</guid>
		<description><![CDATA[Tuitterに要望をいただき、プロフィール設定の変更機能を追加しました。
Tuitter_Account
名前や所在地などの設定、アイコン、プロフィール画面のデザイン変更などをプログラムから行うことが出来ます。

Tw [...]


Related posts:<ol><li><a href='http://screw-axis.com/2010/03/17/tuitter-oauth/' rel='bookmark' title='Permanent Link: [Tuitter] OAuth認証機能を追加'>[Tuitter] OAuth認証機能を追加</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://screw-axis.com/wp-content/uploads/2010/03/twitter_prof.jpg" alt="" title="twitter profile" width="240" height="160" class="alignright size-full wp-image-806" style="margin-left: 10px;" />Tuitterに要望をいただき、プロフィール設定の変更機能を追加しました。</p>
<p><a href="http://dev.screw-axis.com/doc/tuitter/ja/ref/Tuitter_Account/">Tuitter_Account</a></p>
<p>名前や所在地などの設定、アイコン、プロフィール画面のデザイン変更などをプログラムから行うことが出来ます。<br />
<span id="more-803"></span><br />
Twitter APIでは、特にアイコンや背景画像などのイメージを変更するのにマルチパート・フォーマットのPOSTを必要とするので、PHPから行うのは少し手間です。TuitterではHTTP通信に自前のモジュールを使っているのですが、そこに multipart の機能を追加して実装しました。OAuthの方にも対応させています。</p>
<p>プロフィール情報を変えられるのは、Tuitterオブジェクト作成時に認証しているユーザのものだけです。<br />
まず、以下の例ではベーシック認証を用いて、ユーザの所在地を変更させています。</p>
<pre name="code" class="php">
$t = new Tuitter($user, $pass);
$a = $t->getAccount();
$a->updateProf(array('location'=>'沖縄'));
</pre>
<p>次の例は、アイコンを更新しています。アイコンは、PNGフォーマットであると仮定。認証はOAuth。画像を更新する場合、URLやパスなどの所在を渡すのではなく、あくまで画像データそのものを渡すことに注意して下さい。</p>
<pre name="code" class="php">
$t = new TuitterOAuth(
     $consKey, $consSec, $acKey, $acSec);
$a = $t->getAccount();
$img = file_get_contents('/path/to/img');
$a->updateProfImage(
    $img, 'icon.png', 'image/png');
</pre>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2010/03/17/tuitter-oauth/' rel='bookmark' title='Permanent Link: [Tuitter] OAuth認証機能を追加'>[Tuitter] OAuth認証機能を追加</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Tuitter] OAuth認証機能を追加</title>
		<link>http://screw-axis.com/2010/03/17/tuitter-oauth/</link>
		<comments>http://screw-axis.com/2010/03/17/tuitter-oauth/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 08:20:38 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[TuiBotter]]></category>
		<category><![CDATA[Tuitter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=791</guid>
		<description><![CDATA[少し手が空いたので、以前より要望のあった Tuitter/TuiBotter の OAuth 対応をやってみました。
TuitterをOAuthで使う
TuiBotter環境設定
あまり難しく考えないで、サクッと。おかげ [...]


Related posts:<ol><li><a href='http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/' rel='bookmark' title='Permanent Link: [Tuitter] Twitterのプロフィール設定変更機能を追加'>[Tuitter] Twitterのプロフィール設定変更機能を追加</a></li>
<li><a href='http://screw-axis.com/2009/12/28/tuibotter/' rel='bookmark' title='Permanent Link: [TuiBotter] Twitterボット専用PHPフレームワーク'>[TuiBotter] Twitterボット専用PHPフレームワーク</a></li>
<li><a href='http://screw-axis.com/2009/12/18/tuitter/' rel='bookmark' title='Permanent Link: [Tuitter] オブジェクト指向型Twitterクライアント'>[Tuitter] オブジェクト指向型Twitterクライアント</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://screw-axis.com/wp-content/uploads/2010/03/oauth.jpg"><img src="http://screw-axis.com/wp-content/uploads/2010/03/oauth.jpg" alt="" title="OAuth" width="240" height="160" class="alignright size-full wp-image-792" /></a>少し手が空いたので、以前より要望のあった Tuitter/TuiBotter の OAuth 対応をやってみました。</p>
<p><a href="http://dev.screw-axis.com/doc/tuitter/ja/tutorial/oauth/">TuitterをOAuthで使う</a><br />
<a href="http://dev.screw-axis.com/doc/tuibotter/ja/tutorial/setting-environment/">TuiBotter環境設定</a></p>
<p>あまり難しく考えないで、サクッと。おかげで外部ライブラリが結構な環境依存になってしまいましたが。<br />
<span id="more-791"></span><br />
まずOAuthクライアントですが、自作するのも手間だったのでPECLのOAuthを使うようにしています。<br />
最初は<a href="http://github.com/abraham/twitteroauth">twitteroauth</a>など配置するだけのライブラリを使おうかとも思ったのですが、いずれにしろ libcurl が必要ですし、ライブラリの場所を指定する手間も発生します。おまけに PECL/oauth を入れると OAuthException の定義が干渉しあって twitteroauth は動かなくなってしまうことが判明したので、思い切ってPECLのみの対応で割り切りました。</p>
<p>実装は単純で、従来の Tuitter クラスを継承して、新たに TuitterOAuth というクラスを作ります。コンストラクタの引数だけが異なりますが、インスタンス化してしまえば以前と全く同様に使えるという寸法です。<br />
つまり、以下のようなコードがあったとすると</p>
<pre name="code" class="php">
$tuitter = new Tuitter($user, $pass);
$tuitter->sendMessage("Hellow");
$user = $tuitter->getUser('nao58');
    :
</pre>
<p>最初のインスタンス作成部分を修正するだけでOAuth対応になります。</p>
<pre name="code" class="php">
$tuitter = new TuitterOAuth(
     $consKey, $consSec, $acKey, $acSec);
$tuitter->sendMessage("Hellow");
$user = $tuitter->getUser('nao58');
    :
</pre>
<p>TuiBotter側に至っては、INIファイルの記述を書き換えるだけで対応完了です。</p>
<p>ただ、ベーシック認証に比べると複雑なことをやっているため、動作がちょっと重くなったような&#8230;ま、ここはトレードオフとしてください。</p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/' rel='bookmark' title='Permanent Link: [Tuitter] Twitterのプロフィール設定変更機能を追加'>[Tuitter] Twitterのプロフィール設定変更機能を追加</a></li>
<li><a href='http://screw-axis.com/2009/12/28/tuibotter/' rel='bookmark' title='Permanent Link: [TuiBotter] Twitterボット専用PHPフレームワーク'>[TuiBotter] Twitterボット専用PHPフレームワーク</a></li>
<li><a href='http://screw-axis.com/2009/12/18/tuitter/' rel='bookmark' title='Permanent Link: [Tuitter] オブジェクト指向型Twitterクライアント'>[Tuitter] オブジェクト指向型Twitterクライアント</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2010/03/17/tuitter-oauth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Chrome Extension] QuickSilver風の拡張機能</title>
		<link>http://screw-axis.com/2010/01/29/chrome-extension-mandlin/</link>
		<comments>http://screw-axis.com/2010/01/29/chrome-extension-mandlin/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 15:10:42 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Chrome Extension]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[mandlin]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=781</guid>
		<description><![CDATA[ギャラリーにうまくアップロード出来なかった拡張機能ですが、グループの方で教えていただいたおかげで解決しました。messages.jsonをBOM付きUTF-8で保存していたためということで、大変助かりました。というわけで [...]


Related posts:<ol><li><a href='http://screw-axis.com/2010/01/28/chrome-extension-api-reference-japanese/' rel='bookmark' title='Permanent Link: [Chrome Extension] APIリファレンスの日本語訳'>[Chrome Extension] APIリファレンスの日本語訳</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://screw-axis.com/wp-content/uploads/2010/01/mandlin.jpg"><img src="http://screw-axis.com/wp-content/uploads/2010/01/mandlin.jpg" alt="" title="mandlin" width="240" height="160" class="alignright size-full wp-image-786" style="margin-left: 10px;" /></a>ギャラリーにうまく<a href="http://screw-axis.com/2010/01/28/chrome-extension-api-reference-japanese/">アップロード出来なかった</a>拡張機能ですが、<a href="http://groups.google.com/group/chromium-extensions-japan/browse_thread/thread/2bee59238ae0d034?hl=ja">グループの方で教えていただいた</a>おかげで解決しました。messages.jsonをBOM付きUTF-8で保存していたためということで、大変助かりました。というわけで、ようやくの(ほぼ)処女作です。</p>
<p><a href="http://dev.screw-axis.com/doc/mandlin/">Mandlin &#8211; QuickSilver風 ウェブナビゲーションツール</a></p>
<p><span id="more-781"></span><br />
詳しい使い方はリンク先を見ていただくとして、YubNub+QuickSilverといった風の、様々な検索エンジンをキーボードベースで操ることのできるツールです。</p>
<p>自分が欲しくて作ったものなので使い勝手にはそれなりに満足していますが、なにしろ呼び出しにマウスを持ってクリックしなければいけないのが、なんとも残念な点で。せめてポップアップを開くAPIがあればショートカットキーもどきも出来なくは無いのですが&#8230; ポップアップではなく、コンテント・スクリプトでウインドウから描画してタブのコンテンツ内で表示させることも考えましたが、他人の家にあがりこむような感じにちょっと抵抗があったので、とりあえず由としておきます。</p>
<p>作成にあたって気づいた点など、徐々に <a href="http://dev.screw-axis.com/doc/chrome_extensions/">リファレンス</a> の方で更新していければと思っています。</p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2010/01/28/chrome-extension-api-reference-japanese/' rel='bookmark' title='Permanent Link: [Chrome Extension] APIリファレンスの日本語訳'>[Chrome Extension] APIリファレンスの日本語訳</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2010/01/29/chrome-extension-mandlin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Chrome Extension] APIリファレンスの日本語訳</title>
		<link>http://screw-axis.com/2010/01/28/chrome-extension-api-reference-japanese/</link>
		<comments>http://screw-axis.com/2010/01/28/chrome-extension-api-reference-japanese/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 04:28:38 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Chrome Extension]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=771</guid>
		<description><![CDATA[年明けからGoogle Chromeのエクステンション作りを始めてみたのですが、非常に手軽で、よく言われるようにFirefoxで言うところの &#8220;エクステンション&#8221; に対応するものではなく &#82 [...]


Related posts:<ol><li><a href='http://screw-axis.com/2010/01/29/chrome-extension-mandlin/' rel='bookmark' title='Permanent Link: [Chrome Extension] QuickSilver風の拡張機能'>[Chrome Extension] QuickSilver風の拡張機能</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://screw-axis.com/wp-content/uploads/2010/01/chrome.jpg"><img class="alignright size-full wp-image-772" title="Google Chrome" src="http://screw-axis.com/wp-content/uploads/2010/01/chrome.jpg" alt="" width="240" height="160" style="margin-left: 10px;" /></a>年明けからGoogle Chromeのエクステンション作りを始めてみたのですが、非常に手軽で、よく言われるようにFirefoxで言うところの &#8220;エクステンション&#8221; に対応するものではなく &#8220;Jetpack&#8221; だなという印象です。</p>
<p>今回、勉強がてら公式のAPIドキュメントを日本語訳してみたので、公開しておきます。</p>
<p><a href="http://dev.screw-axis.com/doc/chrome_extensions/">Google Chrome Extension API 日本語リファレンス</a><br />
<span id="more-771"></span><br />
馴染みのあるWeb技術ばかりで出来ているので、チュートリアルに沿ってひとつ作ってみれば、簡単に理解できました。あとはガイドを斜め読みしながら出来ることをおさえておき、作りながら必要にあわせてAPIリファレンスをひいてみる感じで。</p>
<p>まだ出来ることも限られていますが、プロセスが分かれていることもあり軽量で快適です。なかなかFFから移行できずにいたのが、おかげで最近はすっかりChromeメインで使っています。</p>
<p>というわけで幾つか作ってみたのですが、どうやら <a href="http://groups.google.co.jp/group/chromium-extensions/browse_thread/thread/ee763c880e4c48c8">ギャラリーページのバグ</a> でアップロードできず&#8230; いずれ問題が解決したら公開しようと思います。</p>
<p>作成途中で気づいたTipsなどもあるので、オリジナルのコンテンツも追加していく予定です。</p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2010/01/29/chrome-extension-mandlin/' rel='bookmark' title='Permanent Link: [Chrome Extension] QuickSilver風の拡張機能'>[Chrome Extension] QuickSilver風の拡張機能</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2010/01/28/chrome-extension-api-reference-japanese/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[TuiBotter] Twitterボット専用PHPフレームワーク</title>
		<link>http://screw-axis.com/2009/12/28/tuibotter/</link>
		<comments>http://screw-axis.com/2009/12/28/tuibotter/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 02:30:34 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[TuiBotter]]></category>
		<category><![CDATA[Tuitter]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=758</guid>
		<description><![CDATA[というわけで、Twitterボット専用フレームワークです。
TuiBotter &#8211; Object-oriented PHP framework for Twitter-Bot
最大の特徴は、イベントドリブンで [...]


Related posts:<ol><li><a href='http://screw-axis.com/2010/03/17/tuitter-oauth/' rel='bookmark' title='Permanent Link: [Tuitter] OAuth認証機能を追加'>[Tuitter] OAuth認証機能を追加</a></li>
<li><a href='http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/' rel='bookmark' title='Permanent Link: [Tuitter] Twitterのプロフィール設定変更機能を追加'>[Tuitter] Twitterのプロフィール設定変更機能を追加</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://screw-axis.com/wp-content/uploads/2009/12/tuibotter.jpg"><img src="http://screw-axis.com/wp-content/uploads/2009/12/tuibotter.jpg" alt="" title="TuiBotter" width="240" height="160" class="alignright size-full wp-image-759" style="margin-left: 10px;" /></a><a href="http://screw-axis.com/2009/12/18/tuitter/">というわけ</a>で、Twitterボット専用フレームワークです。</p>
<p><a href="http://dev.screw-axis.com/doc/tuibotter/">TuiBotter &#8211; Object-oriented PHP framework for Twitter-Bot</a></p>
<p>最大の特徴は、イベントドリブンでボットが書けること。例えば「フォローされたら、フォローバックする」というコードを書くには、「フォローされた」というイベントに渡ってくる「フォロワー」オブジェクトに対して、「フォローする」というメソッドを投げるだけで実装できます。<br />
実際にコード例を見ながら、簡単に説明します。<br />
<span id="more-758"></span></p>
<pre name="code" class="php">
class GreetingBot implements TuiBotter_Event_BeFollowed
{
  public function eventBeFollowed(Tuitter_User $user, Tuitter $tuitter)
  {
    if(!$user->isFollowing()){
      $user->follow();
      $user->sendDM('フォローありがとう!');
    }
  }
}
</pre>
<p>基本的には、このBehaviourという「振る舞い」をあらわすクラスを作ることが、そのままボットの人格を作ることになります。</p>
<p>1行目: ボットの名前(GreetingBot)と、必要なイベント(TuiBotter_Event_BeFollowed)<br />
3行目: 「フォローされた」イベント<br />
5行目: フォローしてきたユーザを、こちらから既にフォローしていなかったら&#8230;<br />
6行目: フォローする<br />
7行目: DMを送る</p>
<p>これだけで完了です。</p>
<p><a href="http://dev.screw-axis.com/doc/tuibotter/ja/ref/TuiBotter_Events/">イベント</a>は他にも「TLが更新された」「自分が言及された」「自分の発言がRTされた」など種々あり、これらを自由に組み合わせることでボットの人格を比較的容易に形成できます。</p>
<p>動作するのは、PHP5以上。パースにはXMLを用いましたので、json_decodeが含まれていなくても動作します。<br />
ただし、将来的に検索モジュールを追加した場合、必要になるかもしれません。</p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2010/03/17/tuitter-oauth/' rel='bookmark' title='Permanent Link: [Tuitter] OAuth認証機能を追加'>[Tuitter] OAuth認証機能を追加</a></li>
<li><a href='http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/' rel='bookmark' title='Permanent Link: [Tuitter] Twitterのプロフィール設定変更機能を追加'>[Tuitter] Twitterのプロフィール設定変更機能を追加</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/12/28/tuibotter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Tuitter] オブジェクト指向型Twitterクライアント</title>
		<link>http://screw-axis.com/2009/12/18/tuitter/</link>
		<comments>http://screw-axis.com/2009/12/18/tuitter/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 10:02:27 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Tuitter]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=750</guid>
		<description><![CDATA[最近「Twitterのボットを作りたいんだけど」という相談を何度か受けました。
そういえばTwitterクライアントはあっても、ボット用のフレームワークって無いなと思ったので、今回作ってみました。
で、ボット用フレームワ [...]


Related posts:<ol><li><a href='http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/' rel='bookmark' title='Permanent Link: [Tuitter] Twitterのプロフィール設定変更機能を追加'>[Tuitter] Twitterのプロフィール設定変更機能を追加</a></li>
<li><a href='http://screw-axis.com/2010/03/17/tuitter-oauth/' rel='bookmark' title='Permanent Link: [Tuitter] OAuth認証機能を追加'>[Tuitter] OAuth認証機能を追加</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://screw-axis.com/wp-content/uploads/2009/12/tui_bird.jpg" alt="Tui bird" title="Tui bird" width="240" height="160" class="alignright size-full wp-image-751" style="margin-left: 10px;" />最近「Twitterのボットを作りたいんだけど」という相談を何度か受けました。<br />
そういえばTwitterクライアントはあっても、ボット用のフレームワークって無いなと思ったので、今回作ってみました。</p>
<p>で、ボット用フレームワークを作るにあたって結局はクライントライブラリが必要なのですが、どうもAPIコールを媒してくれるだけの手続き型ライブラリが多くてシックリ来ない。というわけで、クライアントライブラリの作成まで遡ってしまったのが、この「Tuitter」です。<br />
<span id="more-750"></span><br />
既にボット用フレームワークも完成しているのですが、テストとドキュメンテーションがまだで、とりあえずライブラリ単体でのリリース。<br />
詳細は、次のドキュメントページを見てください。</p>
<p><a href="http://dev.screw-axis.com/doc/tuitter/">Tuitter &#8211; Object oriented Twitter client for PHP5</a></p>
<p>ちなみに、いかにもタイポのようでダサいライブラリ名ですが、ニュージーランドに住んでいた頃によく近所で見かけた「Tui」という鳥の名前からつけました。<br />
黒くてギャーギャーとやかましく啼く鳥で、胸のあたりだけ白いのが特徴。ちょうどオールブラックスのユニフォームのようでもあって、ちょうどいいかなと。(何が?)<br />
オークランドには同名のビールもあり、国鳥ともいえるほどポピュラーな鳥です。</p>
<p>フレームワークの方も、近日中に公開予定。<br />
気づいた点などあれば、指摘いただけると幸いです。</p>


<p>Related posts:<ol><li><a href='http://screw-axis.com/2010/03/29/tuitter-twitter-profile-update/' rel='bookmark' title='Permanent Link: [Tuitter] Twitterのプロフィール設定変更機能を追加'>[Tuitter] Twitterのプロフィール設定変更機能を追加</a></li>
<li><a href='http://screw-axis.com/2010/03/17/tuitter-oauth/' rel='bookmark' title='Permanent Link: [Tuitter] OAuth認証機能を追加'>[Tuitter] OAuth認証機能を追加</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/12/18/tuitter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Twitter] 呟きが検索結果に表示されなくなったら</title>
		<link>http://screw-axis.com/2009/12/08/twitter-spam-suspicious/</link>
		<comments>http://screw-axis.com/2009/12/08/twitter-spam-suspicious/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 03:33:27 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=729</guid>
		<description><![CDATA[昨日、フォローいただいている人から「あなたの発言が検索結果に表示されないけど、どうして?」と指摘いただきまして。
Web学会の最中だったんですが、ちょっと試してみると確かにひっかからない。自分の発言はヒットしない作りなの [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://screw-axis.com/wp-content/uploads/2009/12/alone.jpg" alt="alone" title="alone" width="240" height="178" class="alignright size-full wp-image-730" style="margin-left: 5px;" />昨日、フォローいただいている人から「<a href="http://twitter.com/nao58">あなたの発言</a>が検索結果に表示されないけど、どうして?」と指摘いただきまして。<br />
Web学会の最中だったんですが、ちょっと試してみると確かにひっかからない。自分の発言はヒットしない作りなのかと、ログインしていないブラウザから試しても同様。それ以上調べている時間も無かったので、サポートにメールしてみました。<br />
その日の夕方、返ってきた答えは「ハッシュタグを使いすぎているから」とのこと。ちょっと驚きでした。<br />
<span id="more-729"></span><br />
要するにスパム判定の一種に抵触したようなのですが、<a href="http://jptwitterhelp.blogspot.com/search/label/%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%B3%AA%E5%95%8F">ヘルプ</a>を見てみると、このように記述されています。</p>
<blockquote><p>商業的利用やプロモーションのためにツイッターを利用する行為は許可されています。興味のあるユーザーとの間に、互いに価値のある関係を作るためにツイッターを利用する場合などです。ところが、自分のアカウントやサイトなどに注意を引くためだけに、ユーザーをフォローする行為はスパムとして扱われる可能性があります。まったく同じものを宣伝、または販売促進するためにたくさんのアカウントを登録することもスパムとして扱われる可能性があります。また本物ではない＠付きのつぶやきを投稿することや、検索結果に表示するためだけに投稿することもスパムとして扱われる可能性があります。さらに、つぶやきに関係のないリンクを貼ったり大勢のユーザーがあなたをブロックした場合などもスパムとして扱われる可能性があります。</p></blockquote>
<p>ここにはハッシュタグに関する記述はありません。</p>
<p>もう一息、英語の方のヘルプフォーラムを調べてみたところ、<a href="http://help.twitter.com/forums/10713/entries/42646">それらしいもの</a>を見つけました。これによると、次のような行為がイエローカードに当たるようです。</p>
<ul>
<li>同じ、或いは似たような呟きを繰り返す。</li>
<li>同じ、或いは似たようなリンクを繰り返し貼る。</li>
<li>同じ話題の単語、或いはハッシュタグを乱用する。</li>
<li>自動化された呟きや返信を送る。</li>
<li>キーワードを基にした似たようなメッセージを送るボットやアプリケーションを使う。</li>
<li>複数のアカウントから似たようなメッセージを投稿する。</li>
<li>頻繁にフォロー/フォロー解除を繰り返す。</li>
</ul>
<p>自分はハッキリは言われませんでしたが、ラグビー関連の話題を持ち出す際に慣例として使っていた #rugby が「同じハッシュタグの乱用」に当たったのではないかと思います。興味の無い人が読まなくて良いように呟きの先頭につけていたのですが、今後は止めにします。(アカウント分けた方が良いのかな&#8230;)<br />
なお、「状況を改善して欲しい」とお願いしたところ、今朝から検索にヒットするようになりました。</p>
<p>どうやらTwitter検索八分は、完全にスパムアカウントとして凍結する前の「執行猶予」のようなもののようです。<br />
「別に検索されなくてもいいや」としていると、場合によってはアカウント自体を停止されてしまうかもしれません。<br />
気になる人は、エゴサーチで自分の発言がヒットするか試してみることをお勧めします。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/12/08/twitter-spam-suspicious/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[js] Ajax通信がF5で更新されない場合</title>
		<link>http://screw-axis.com/2009/08/12/ajax_xhr_f5/</link>
		<comments>http://screw-axis.com/2009/08/12/ajax_xhr_f5/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 12:40:02 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=689</guid>
		<description><![CDATA[画像やスクリプトなどの外部ファイル取り込みを高速化するために、キャッシュ制御は不可欠です。
しかし、設定をうっかりすると(あるいは、しないと)、キャッシュが強すぎて全くデータが更新されないような場合があります。
今回のキ [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm1.static.flickr.com/164/435720036_61f24af0d8_m.jpg" alt="fortuneteller" title="fortuneteller" width="240" height="178" class="alignright size-full" style="margin-left: 5px;" />画像やスクリプトなどの外部ファイル取り込みを高速化するために、<a href="/2009/06/06/web-google-page-speed%e3%81%a7%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e9%ab%98%e9%80%9f%e5%8c%961/">キャッシュ制御</a>は不可欠です。<br />
しかし、設定をうっかりすると(あるいは、しないと)、キャッシュが強すぎて全くデータが更新されないような場合があります。<br />
今回のキーワードは、「IE」と「F5キー」、そして「XMLHttpRequest」。<br />
「<a href="http://www.amazon.co.jp/gp/product/487311361X?ie=UTF8&#038;tag=paiitbla-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=487311361X">ハイパフォーマンスWebサイト</a>」の著者であるStevesSuders氏のblogで紹介された「<a href="http://www.stevesouders.com/blog/2009/08/11/f5-and-xhr-deep-dive/">F5 and XHR deep dive</a>」を検証してみます。<br />
<span id="more-689"></span></p>
<h5>「F5」でXHR通信結果が更新されない</h5>
<p>通常、キャッシュが設定された外部ファイル取り込みは、その期限が来るまでは再通信されません。しかしブラウザをF5やCtrl+rなどで明示的にリロードした場合はその限りではなく、ファイルの再取得が行われるのが一般的です。<br />
しかし、キャッシュ指定の条件によっては、XMLHttpRequestを用いた、いわゆるAjax通信時が発生しなくなってしまうと<a href="http://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/comment-page-1/">HttpWatchの記事</a>で伝えられました。<br />
これを検証するために、簡単なプログラムを作ってみます。</p>
<h5>検証プログラムの説明</h5>
<p>まずは、取り込まれるjsファイルを用意します。<br />
サーバサイドで毎回ジェネレートされる、現在時刻を指定された要素に出力するだけのスクリプトです。</p>
<p><a href="http://dev.screw-axis.com/sandbox/f5_cache/js.php?id=hoge" target="_blank">検証用スクリプト</a></p>
<p>呼び出す度に日時が更新されることが分かると思います。</p>
<p>そして必要なのはキャッシュコントロール。<br />
パケット監視などが出来る人は見ていただけばわかるのですが、パラメータに応じて次のようなヘッダを付与します。</p>
<dl>
<dt>cache=1</dt>
<dd>キャッシュ有効。Expiresを30日後にし、Cache-Controlのmax-ageも30日間に設定します。</dd>
<dt>cache=-1</dt>
<dd>キャッシュ無効。Expiresを30日前にし、Cache-Controlのmax-ageは0とします。</dd>
<dt>cache=0</dt>
<dd>キャッシュ指定無し。ExpireもCache-Controlも指定しません。</dd>
</dl>
<p>ついでに、画像も用意してみました。同様にサーバサイドで現在時刻の画像を作成して返します。キャッシュ制御も同じです。</p>
<p><a href="http://dev.screw-axis.com/sandbox/f5_cache/img.php">検証用画像</a></p>
<p>これを、テスト用のHTMLで取り込みます。<br />
スクリプトは、scriptタグによる単純な取り込みと、XMLHttpRequestによるAjax通信の2種類。画像はimgタグで指定しています。<br />
前述の3種類のキャッシュ制御を行うページは、次の通りです。</p>
<ul>
<li><a href="http://dev.screw-axis.com/sandbox/f5_cache/test.php?cache=-1">キャッシュ無効</a></li>
<li><a href="http://dev.screw-axis.com/sandbox/f5_cache/test.php?cache=1">キャッシュ有効</a></li>
<li><a href="http://dev.screw-axis.com/sandbox/f5_cache/test.php?cache=0">キャッシュ指定無し</a></li>
</ul>
<p>これで、ページを開いた時の時刻(正確には、サーバがリクエストを受け付けた時刻)が表示されるはずです。リロードや再訪問時に、キャッシュが効いていれば日時はキャッシュされた時のままになります。</p>
<p>順に見ていきましょう。</p>
<h5>キャッシュ無効の場合</h5>
<table class="grid" cellspacing="0" style="width: 400px;">
<tr>
<th></th>
<th colspan="3">通常遷移</th>
<th colspan="3">F5リロード</th>
</tr>
<tr>
<th></th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
</tr>
<tr>
<th>Chrome2</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.0</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.5</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera9</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera10</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>IE6</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>IE7</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>IE8</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Safari3</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
</table>
<p>いずれの場合も期待通り、キャッシュは全くききませんでした。<br />
ページ遷移を行った場合も、F5でリロードした場合も、全て最新に更新されます。</p>
<h5>キャッシュ有効の場合</h5>
<table class="grid" cellspacing="0" style="width: 400px;">
<tr>
<th></th>
<th colspan="3">通常遷移</th>
<th colspan="3">F5リロード</th>
</tr>
<tr>
<th></th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
</tr>
<tr>
<th>Chrome2</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.0</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.5</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera9</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>Opera10</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>IE6</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE7</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE8</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>Safari3</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
</table>
<p>動作が分かれました。<br />
通常にページ遷移を行った場合は、Opera10を除き一律にキャッシュが使われる期待通りの動作です。(Opera10はまだbetaのため、最終的にどういった仕様になるかは不明です)<br />
F5などでリロードを行うと、画像やscript要素で取り込んだものは、いずれも再読み込みされます。<br />
しかしXMLHttpRequestでの通信は、ChromeやFFでは再通信が行われるのに対し、IEとOpera9ではそのままキャッシュが有効になってしまいました。これはCtrl+F5のようなスーパーリロードを用いても、変わりません。</p>
<h5>キャッシュ指定無しの場合</h5>
<table class="grid" cellspacing="0" style="width: 400px;">
<tr>
<th></th>
<th colspan="3">通常遷移</th>
<th colspan="3">F5リロード</th>
</tr>
<tr>
<th></th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
</tr>
<tr>
<th>Chrome2</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.0</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.5</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera9</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera10</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE6</th>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE7</th>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE8</th>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>Safari3</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
</table>
<p>かなり無軌道になっています。Operaに至っては、通常のページ遷移でも動作に違いが出てしまいました。</p>
<h5>ETagについて</h5>
<p>StevesSuders氏の検証ではETagについても含まれています。<br />
今回は検証結果を見やすくするために、レスポンス304については確認していません。<br />
氏のページによれば、Safari4はIf-Modified-Sinceを送らずに常に再送信されてしまうようです。</p>
<h5>まとめ</h5>
<ol>
<li>Expiresを指定しないことは、動作を全く制御しないのと同じこと。可能な限りきちんと、用途にあわせてキャッシュの制御を行うべきです。</li>
<li>Ajax通信でキャッシュをされたくない場合(多くの場合、この用途でしょう)、Expiresを過去に指定してキャッシュを無効にしましょう。</li>
<li>或いは、通信にエポックタイムのようなユニークなIDをパラメータに付与し、キャッシュできないようにするのも良い方法です。</li>
<li>Ajax通信をキャッシュしたい場合、Expiresをキャッシュしたい期間、きちんと指定しましょう。ただし、その際にはF5でリロードしても更新されないブラウザがいることを知っておきましょう。</li>
<li>Operaを対応ブラウザにするならば、バージョン10がどのような仕様になるか注意しておきましょう。</li>
</ol>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/08/12/ajax_xhr_f5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP] パフォーマンス向上の心得</title>
		<link>http://screw-axis.com/2009/07/17/php-performance-hints/</link>
		<comments>http://screw-axis.com/2009/07/17/php-performance-hints/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 08:54:32 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=673</guid>
		<description><![CDATA[先だってのPHP高速化に関するポストの導入で、GoogleによるPHPのパフォーマンスTipsが物議をかもしている件を紹介しました。
先日、最初に疑問を投げかけたZendの技術者であるStanislav Malyshev [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full" style="margin-left: 5px;" title="hint" src="http://farm1.static.flickr.com/30/97787113_99d18c082f_m.jpg" alt="hint" width="240" height="160" />先だっての<a href="/2009/07/04/php-performance-superstitions1-reference/">PHP高速化に関するポスト</a>の導入で、<a href="http://code.google.com/speed/articles/optimizing-php.html">GoogleによるPHPのパフォーマンスTips</a>が物議をかもしている件を紹介しました。<br />
先日、最初に疑問を投げかけたZendの技術者であるStanislav Malyshev氏が、自身のblog&#8221;<a href="http://php100.wordpress.com/">PHP 10.0 Blog</a>&#8220;上で、前述のGoogleのそれに対するアンチテーゼとして&#8221;<a href="http://php100.wordpress.com/2009/07/13/php-performance/">More on PHP performance</a>&#8220;という記事を書いています。つい小手先のシンタックスなどを期待してしまいがちな高速化Tipsですが、「初心者向けにまず」としながら、極めて本質的なパフォーマンスチューニング方法をまとめています。<br />
とても良い記事だと思ったので、タイトルに沿ってまとめてみます。(翻訳ではないので注意して下さい)<br />
<span id="more-673"></span></p>
<h5>Bytecode cache</h5>
<p><em>バイトコードキャッシュを用いずしてパフォーマンスを語る無かれ(超意訳)</em></p>
<blockquote><p>If you care about performance and don’t use bytecode cache then you don’t really care about performance.</p></blockquote>
<p>というほど、まず重要としているのがこの部分。<br />
まずは(Zend社員としては当然) <a href="http://www.zend.com/en/community/zend-server-ce">Zend Server</a>の導入検討を奨めていますが、自分でPHPをコンパイルできる環境であるならば<a href="http://php.net/apc">APC</a>などを使えば良いでしょう。ちなみに、このblogを動かしているPHPもAPCを使っています。GUIの管理画面もあってステータス管理も簡単。キャッシュヒット率99.9%。プログラム中からmemcache的に変数を格納したりも出来るし、非常にありがたいモジュールです。</p>
<h5>Profiling</h5>
<p><em>最適化する前にプロファイルを!(意訳)</em></p>
<blockquote><p>Profile you code before you start optimizing it!</p></blockquote>
<p>どの関数がボトルネックになっているのか、ちゃんと把握してからチューニングしましょうということで。そのためのツールとして<a href="http://www.zend.com/en/products/studio/">Zend Studio/Debugger</a>や<a href="http://xdebug.org/">Xdebug</a>が挙げられています。</p>
<h5>Caching</h5>
<p><em>殆どのPHPは&#8221;shared nothing&#8221;でインストールされているわけで、リクエスト処理の終了と同時に作業内容は全部飛んでしまいます。これは処理の複雑さを回避するなどのメリットは大きいのですが、パフォーマンス的にはデメリットですよね。繰り返し処理はキャッシュに入れて、いいとこどりにしちゃいましょう。(意訳)</em></p>
<blockquote><p>Most PHP installations run in “shared nothing” mode where as soon as the request processing ends, all the data associated with the request is gone. It has some advantages, but also one big disadvantage – you can not preserve results of repeated operations. That is, unless you use caching.</p></blockquote>
<p>実際、DBへのアクセスや複雑な計算のような大きな処理はもちろん、XMLによる設定ファイルをパースしておくような簡易な処理でも、アクセス毎に発生するようであればDisk I/Oとあわせてトータルでかなりの軽量化になります。<br />
キャッシュ先としては <a href="http://jp2.php.net/manual/ja/book.memcached.php">memcached</a> や前述の APC などが挙げられます。用途によってはHDDでも良いでしょうが、基本的には高速なメモリでのキャッシュを考えるべきです。ポスト元では他にも、Zend Serverに含まれた<a href="http://framework.zend.com/manual/ja/zend.cache.html">Zend Frameworkによるキャッシュ機能</a>を奨めています。</p>
<h5>Optimize your data</h5>
<p><em>通常、PHPアプリケーションで最もコストのかかる処理は、データベースやファイルシステムのような外部データや、ネットワークにアクセスすることです。クエリーを減らすこと、データベース構造の改良、ファイルシステムへのアクセス減、データ取得のためのサービス呼び出しを複数回行わずに1度でまとめるなど、これらの最適化に注力しましょう。更に言えば、システムコールトレーサ(Unixであれば strace、Windowsであれば Process Explorer など)などを使い、スクリプトが呼び出しているシステムコールを減らせないかどうか検討しましょう。それらの全てを除くことは不可能だと思いますが、いくつかは検討の余地があるでしょう。(意訳)</em></p>
<blockquote><p>Usually the most expensive places of the PHP application are where it accesses external data – namely, database or filesystem or network. Look hard into optimizing that – reduce number of queries, improve database structure, reduce filesystem accesses, try to bundle data to make one service call instead of several, etc. For more advanced in-depth look, use tools like strace (Unix) and Process Explorer (Windows) to look into system calls your script produces and think about ways to eliminate some of  them. You would not be able to eliminate all of them but each of them is a worthy target.</p></blockquote>
<p>ほぼ、そのまま。<br />
下手にPHPでの処理をいじるより、RDBのチューニングを行った方が遥かに効果的なことは、非常によくあります。また、先述のキャッシュを使うような工夫は、ここにも繋がります。</p>
<h5>Don&#8217;t try to outsmart the engine</h5>
<p><em>世の中には&#8221;Tips&#8221;と呼ばれる「ああしたほうが速い」「こうすると遅い」というような話題があります。しかし特にビギナーのうちは、そういったものに惑わされない方がいいでしょう。十中八九は何も変わらず、残った1つも手持ちのコードに容易にあてることは出来ないか、費やした時間ほどの価値は無いというのがオチでしょう。確かにopcodesを軽くしたり、lookupsを減らしたりするような手法はありますが、他の全ての条件が整っていなければ無意味です。加えて、こういったアドバイスのいくつかは、寧ろコードを遅くしたり、堅牢性やセキュリティを失わせてしまったりします。特に初心者は、こういったトリッキーな手法に手を出さない方が良いでしょう。(意訳)</em></p>
<blockquote><p>There are a lot of “tips” floating around about which constructs in PHP are faster or slower than others. I think you can safely ignore all of these tips, especially if you’re a beginner. Odd are, 9 cases out of 10 they won’t give you any improvement at all, and in the remaining one case it will be either not applicable in your code or not worth the time spent on it. Yes, there are ways to save couple of opcodes and remove couple of lookups here and there – but unless you’ve already done with all of the previous steps it is not worth it. And some of the advice out there will actually make you code slower, less robust and less secure without you even noticing. So I think for the beginners is better to stay away from trying to outsmart the engine altogether.</p></blockquote>
<p>この辺が恐らく、Googleの(そして、その他「高速化Tips」と銘打つほぼ全ての)アドバイスに対する反発心に繋がっているのでは。<br />
王道をきちんとおさえるのが近道というのは、何にでも言えることですよね。</p>
<h5>Benchmark in real life</h5>
<p><em>ここまでに話題に挙げたアドバイスの多くは、証拠としてベンチマークを使っています。問題は、これらのベンチマークはいつも、ほんの数行の部分的なコードで書かれていることです。しかしながら、実際に実行されなければいけないコードは大きなアプリケーションで、そのような一行コードではありません。(意訳)</em></p>
<blockquote><p>Many of the advices I mentioned above have benchmarks as a proof. The problem is these benchmarks always test only a short piece of code. However, you would not be running that one-liner – you would be running the whole big application.</p></blockquote>
<p>これに続けて筆者は、「勝ち馬を予想するために真空状態でのモデルを使う科学者のジョーク」を引き合いにだしています。<br />
確かに条件が複合的に絡む場合は多く、数行のベンチマーク結果を妄信することを危惧する必要はあります。しかし、現実に「A/Bどちらの方法が速いのか?」と確かめるには、むしろ他の要因を取り払って調べる必要がある場合もあるように思います。ここに関しては、「最終的なパフォーマンスチューニングは、実際のアプリケーションを用いるべき」というアドバイスと捉えれば良いのではないでしょうか。</p>
<h5>Leverage the extensions</h5>
<p><em>あまりにも自明のことを言うようですが、それでもPHP extensionで可能となる機能を重複して作っているようなコードを数多く見かけます。PHPには多くの関数があるので、誰か他の人がやっていそうなものを作る前に、マニュアルをチェックしてみて下さい。DOM/SimpleXML拡張も、JSONパーサも、SOAP送受信のための拡張なども、利用することができます。serialize/deserialize関数が使えないのでなければ、独自のものを作ったりするのは止めましょう。<br />
もしパフォーマンスが非常に重要で、あなたがCプログラムを書けるなら(PHP初心者が、全てにおいて初心者だということを意味しませんよね)、独自のPHPエクステンションを作ることを検討してみてください。それは、それほど難しくはありません。(意訳)</em></p>
<blockquote><p>That seems too obvious, but I have seen a lot of code that duplicates functions available in some PHP extension. There are a lot of functions in PHP and if you do something that others may have done before, check in the manual. You have DOM/SimpleXML extensions for XML, JSON extension for JSON, SOAP extension for doing SOAP, etc., etc. Do not create custom serialization/deserialization if serialize()/deserialize() would work for you.<br />
If you have some very performance-sensitive bit of script and you can do C programming (beginner in PHP doesn’t mean beginner in everything  , consider even making your own extension, it’s not that hard.</p></blockquote>
<h5>Avoid extra notices/errors/etc.</h5>
<p><em>PHPでエラーを抑止することが大変だったとしても、noticeやstrict notice、warningなどが出ないコードを書くよう挑戦してみて下さい。その際、全てのエラーが出力されるように設定したいと思いますが、実運用環境ではエラー表示を決してしないようにしましょう。恥を大っぴらにするだけですから。(意訳)</em></p>
<blockquote><p>Even suppressed errors have cost in PHP, so try and write your code so it would not produce notices, strict notices, warnings, etc. You may want to enable logging of all errors to examine that. Never enable displaying errors in production though – it will only lead to a major public embarrassment.</p></blockquote>
<p>変数の未定義や配列に添え字が無い場合など、noticeエラーを出しておくことは、タイポなどの単純で気付きにくいバグを回避するのに有効です。ちゃんと無くしましょう&#8230;と心から思うのですが、一方で「それってスクリプト言語の手軽さ」を失うことでもあるのかなと考えてしまいます。<br />
いっそ変数型宣言必須の&#8221;strict mode&#8221;みたいなのが欲しいような。</p>
<h5>Use php.ini-production as a start</h5>
<p>もしphp.iniの設定をするのに、PHPのソースコードに含まれる php.ini-production を参考にしましょう。include pathなど幾つかの項目は変更が必要でしょうが、土台にするには最適です。(意訳)<br />
<em>If you need a set of php.ini settings which would not hurt your performance and not break anything, look into php.ini-production in PHP source. You may need to change a couple of details (e.g. include path) but it’s a good starting point.</em><br />
<a href="http://www.php.net/manual/ja/migration53.ini.php">マニュアル</a>によると、PHP5.3.0からはphp.ini-development(開発環境用)、php.ini-production(運用環境用)の2つが同梱されているようです。自分はまだPHP5.3を落としていませんが、以前のrecommendedなどとどの辺が違うのか、確認してみようと思います。</p>
<h5>Use big realpath cache</h5>
<p><em>リアルパス・キャッシュは、ファイル名や相対パスからユニークなフルパスを取得する際に非常に有用です。初期設定ではこのキャッシュサイズは16kですが、多くの長いパス名のファイルを扱うのであれば、この値を増やすのが良いでしょう。これはディスクアクセスという重い処理を軽減します。(意訳)</em></p>
<blockquote><p>Realpath cache is very useful for the engine when it tries to find the unique full name of the file from just filename or relative path. By default, it’s 16K but if you have a lot of files with long pathes, it’s better to increase the size – it would save the expensive disk accesses.</p></blockquote>
<p>この機能はPHP5.1から実装されたものですが、ちょっと大きい規模のアプリケーションになると、16kという値はすぐに超えてしまうかもという話は、よく聞きます。よほどメモリに困窮していなければ(そんな場合は既にパフォーマンスを云々言っていられないと思いますが)、64kくらい確保してしまうのが良いようです。</p>
<p>最後に、次のように締められています。</p>
<p><em>ここに挙げた以外にも、もっと多くのことが挙げられると思いますが、既にちょっと長くなりすぎました。一旦ここで終わりますが、あなたの考えをコメント欄で追加してくれると嬉しいです。</em></p>
<blockquote><p>There are probably more things that could be said, but this post is pretty long already, so I will end it here and you are welcome to add your opinion in comments. </p></blockquote>
<p>同じ言葉で、終わりたいと思います。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/07/17/php-performance-hints/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
