<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
   <channel>
      <title>技術情報</title>
      <link>http://colo-ri.jp/develop/</link>
      <description></description>
      <language>ja</language>
      <copyright>Copyright 2009</copyright>
      <lastBuildDate>Thu, 06 Aug 2009 22:09:30 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>Twitterが重い場合の対処法（Webサイト掲載編）</title>
         <description><![CDATA[<p><img style="border:1px solid #CCCCCC" alt="heavy twitter" src="http://colo-ri.jp/develop/archives/heavy_twitter.png" width="440" height="143" /></p>

<h2>お、重い…</h2>

<p>Twitterは情報発信者にとって便利なことこの上ない媒体ですが、時間によっては、とくにアメリカ人が起床して行動しだすPM10:00（日本時間）あたりは、非常に重くなります。</p>

<p>ただ、普通に投稿して楽しむだけであれば、投稿できないという障害だけで済むのですが、情報発信基地をWEBサイトにしている人にとっては「WEBページが表示されない」という致命的な問題になってしまいます。</p>

<h2>Twitterに載っているWEBサイトへの掲載方法を改造する</h2>

<p>とは言っても、単にHTMLとJavaScriptの掲載位置を分離させるだけですけど。笑</p>

<p>Twitterの書き込みをWEBサイトに反映させるために、Twitterでは以下のようなコードを埋め込むように推奨してあります。</p>

<p class="ness">※「colori_twit」の箇所はご自分のIDに置き換えてくださいね。</p>

<pre>
&lt;div id="twitter_div"&gt;
	&lt;h2 class="sidebar-title"&gt;最近の動き&lt;/h2&gt;
	&lt;ul id="twitter_update_list"&gt;&lt;/ul&gt;
	&lt;script type="text/javascript" src="http://twitter.com/statuses/user_timeline/colori_twit.json?callback=twitterCallback2&amp;count=5"&gt;&lt;/script&gt;
&lt;/div&gt;
</pre>

<p>これの&lt;script&gt;タグの部分を分離して&lt;/body&gt;の直前に貼り付けましょう。　これでJavaScriptの実行はHTMLがほとんど表示された後に実行されることになるので、アクセスしてきた人には問題なくページが見られるようになると思います。</p>

<p>Yahoo!のパフォーマンス・チームも「JavaScriptは最後に置くように」と言ってますしね。</p>]]></description>
         <link>http://colo-ri.jp/develop/2009/08/twitterweb.html</link>
         <guid>http://colo-ri.jp/develop/2009/08/twitterweb.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">JavaScript</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">JavaScript</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Twitter</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">重い</category>
        
         <pubDate>Thu, 06 Aug 2009 22:09:30 +0900</pubDate>
      </item>
            <item>
         <title>サーバーの負荷を特定しやすくするチャートを作った。　『サーバ/インフラを支える技術』より</title>
         <description><![CDATA[<p><img style="border:1px solid #CCCCCC" alt="推測するな、計測せよ　「サーバ/インフラを支える技術」より" src="http://colo-ri.jp/develop/archives/loadaverage_activity_title.gif" width="536" height="219" /></p>

<p>これはほとんど自分用に作ったものですが、みなさんの参考にもなればいいかなと思って記事にしました。</p>

<p>「はてな」の伊藤直也さんはじめ、サーバー関連のスペシャリストな人たちが惜しげもなくその知識を書いてくれている「<a href="http://www.amazon.co.jp/gp/product/4774135666?ie=UTF8&tag=coloriamazon-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4774135666">[24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)</a><img src="http://www.assoc-amazon.jp/e/ir?t=coloriamazon-22&l=as2&o=9&a=4774135666" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
」が大変参考になります。　この本は「idea * idea」でも取り上げられていて「第４章はとにかく読んどけ」と書いてあったので、読みました。　まだ途中なんですけど。笑</p>

<p><a href="http://colo-ri.jp/develop/archives/loadaverage_activity.jpg"><img style="float:right" alt="内容の一部" src="http://colo-ri.jp/develop/archives/loadaverage_activity-thumb.jpg" width="250" height="187" /></a>その中で、サーバーをいじる人であればすぐに役に立つであろう「トラブルが発生した際の問題の特定方法」として「Linux単一ホストの負荷を見極める」というのがあります。</p>

<p>サーバー周りの問題というと、この負荷がどれほどのものかというのは、個人的にかなり曖昧な知識で「このサーバー一台でどれだけのアクセスがあると負荷がどれくらいか」というのがもう、正直直感みたいな感じで想定していたので、目から鱗の連続でした。</p>

<h2>負荷はロードアベレージからスタート</h2>

<p>負荷がかかっているような場合に、ネットワーク周りか？サーバー本体なのか？といった切り分けを行う場合にも「ロードアベレージから見る」というように具体的に書いてあって、そこから「このコマンドを使って、さらにこう切り分ける」というように、具体的に書かれてあるので、それに沿っていけば自然と原因が特定されていくような書き方がされてます。</p>

<p>で、この本を読みながら簡単な相関図というか、流れが分かる図があると、それを見ながら読んでいったり、実際の負荷特定の参考にしたりできるかなと思ってアクティビティ図を作ってPDFにしてみました。　元の編集可能なExcelファイルも良ろしければどうぞ。</p>

<ul>
<li><a href="http://colo-ri.jp/develop/archives/loadaverage_activity.pdf">PDFファイルをダウンロード</a> <a rel="license" href="http://creativecommons.org/licenses/by/2.1/jp/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.1/jp/80x15.png"/></a></li>
<li><a href="http://colo-ri.jp/develop/archives/loadaverage_activity.zip">Excelファイルをダウンロード</a> <a rel="license" href="http://creativecommons.org/licenses/by/2.1/jp/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.1/jp/80x15.png"/></a></li>
</ul>

<p>そのままでも使ってもらっていいですが、本を読みながらや、読んでから見るともっとよく分かるようになるんではないかなと思います。</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=coloriamazon-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4774135666" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
]]></description>
         <link>http://colo-ri.jp/develop/2009/08/linux_loadaverage_chart.html</link>
         <guid>http://colo-ri.jp/develop/2009/08/linux_loadaverage_chart.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">サーバー関連</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Linux</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">apache</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">サーバ</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">サーバー</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">特定</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">負荷</category>
        
         <pubDate>Wed, 05 Aug 2009 12:08:46 +0900</pubDate>
      </item>
            <item>
         <title>なまけものこそMovableTypeを活用せよ</title>
         <description><![CDATA[<p><img alt="なまけものに捧げるMovableType" src="http://colo-ri.jp/develop/archives/nama_mt.png" width="540" height="293" /></p>

<h2>頻繁に更新ってタイヘン…</h2>

<p>MovableTypeっていうと、ブログよりもいろんなことが出来て、ビジネスでも活用できて…といろいろ妄想は膨らむのですが、「更新をつづける」ことの難しさたるや、ホームページを運用したことのある人であれば、苦労話にも「うんうん」と頷いてしまうのではないでしょうか。</p>

<p>確かに（書くネタにはこまらなくても）毎日必ずパソコンの前に座って、エントリーを書いて「再構築」作業を地道にやって、それで思ったような反応があるかというと、最初の更新ぐらいではだれも反応を示してくれない。　というか、あなたのサイトの存在が知られていないので来てさえくれないという状況の中では、減るのかどうかも分からないダイエットを続けているようなものです。</p>

<p>WEBサイトにしろブログサイトにしろ、ホームページというのは更新を続けていれば必ず何らかの反応があるものなのですが、なまけものな人たちは「苦労に見合った成果がすぐ現れないと、継続できない」という気持ちになってしまうのです。</p>

<p>ここでWEBの考え方の王道としては「我慢して反応があるまで更新しようよ！頑張ろうよ！」となるところでしょうが、なまけものにとってはむしろ「苦労せずに更新できるなら、続けてもいいよ」と考えることしかできません。　ブログがつづく人が多いのは「苦労しなくて済むから」というのが最重要ポイントだと私は思っています。</p>

<h2>MovableTypeをブログのように、いやそれ以上に楽に運用する</h2>

<p>ブログがどうして苦労しなくて済むかというと、やはり「携帯から投稿できる」というのが大きいと思います。　携帯は「すきま時間」で使うことができるデバイスですから、なまけものにはピッタリです。</p>

<p><a href="http://colo-ri.jp/develop/archives/nama_mt_mob.jpg"><img style="float:right" alt="nama_mt_mob.jpg" src="http://colo-ri.jp/develop/archives/nama_mt_mob-thumb.jpg" width="250" height="333" /></a>ということは、MovableTypeも同じように携帯から投稿できるようにすればいいということになります。　「<a href="http://www.amazon.co.jp/gp/product/4844326090?ie=UTF8&tag=coloriamazon-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4844326090">Movable Type 4.x 本格的CMSサイトを構築するためのMTスーパーテクニック クリエイターが身につけておくべき新・100の法則。</a><img src="http://www.assoc-amazon.jp/e/ir?t=coloriamazon-22&l=as2&o=9&a=4844326090" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」ではモブログサービスを使って携帯からMovableTypeへエントリーを投稿する方法が載っています。</p>

<p>さらに、この本の特徴的な所としてとにかく「楽に運用しつつ『効果的なアピール』を行う」という、なまけものにとっては実にありがたいテクニックが満載です。　全体的に、今流行りの「レバレッジ」を効かせるような内容となっています。　いくつか挙げてみると</p>

<ul>
<li>検索エンジン向けのサイトマップXMLを自動生成する</li>
<li>新着情報をTwitterで告知する</li>
<li>SSIでトップページに常に最新情報を表示する</li>
<li>iPhoneからブログ記事を管理する（iMTプラグイン紹介のみ）</li>
<li>RSSを利用して外部ブログの記事をまとめて表示する</li>
<li>スパム対策を施してサーバ負荷や管理の手間を軽減する</li>
<li>更新pingを送信して集客する</li>
</ul>

<p>なまけものとしては、自分の書くコンテンツが「いかに楽に作れるか」「いかに楽にみんなに知ってもらえるか」「荒らされないようにいかに楽に運用できるか」が重要ではないかと思います。　これらのネタは大体入っているので、最初に若干しくみ構築の手間はありますが、その後はとても楽に更新・運用していけると思います。</p>

<p>MovableTypeはいったん「なまけもの向けシステム」として構築できると、ブログ以上に簡単に更新でき、書いた情報にもレバレッジを効かせられる魅力的なCMSです。　ホームページ更新が続かない「なまけものな」サイト運営者の方は導入を検討してみてはいかがでしょうか？</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=coloriamazon-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4844326090" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>]]></description>
         <link>http://colo-ri.jp/develop/2009/08/movabletype.html</link>
         <guid>http://colo-ri.jp/develop/2009/08/movabletype.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">MovableType</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">MovableType</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">なまけもの</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">更新</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">簡単</category>
        
         <pubDate>Sun, 02 Aug 2009 23:11:18 +0900</pubDate>
      </item>
            <item>
         <title>日本語URLをExcelで手軽にURLエンコードする方法</title>
         <description><![CDATA[<h2>Overtureで日本語URLが使えない？</h2>

<p>Overtureでは「広告掲載ガイドライン」の「スタイルガイドライン」で以下のように書かれてあります。</p>

<p><img alt="Overtureスタイルガイドライン画像" src="http://colo-ri.jp/develop/archives/overture_ad_1248743810569.png" width="473" height="215" /></p>

<blockquote>リンク先URLは1024文字、表示URLは250文字以内の半角英数字（ASCII）で登録してください。 URL内の日本語表記は使用できません。</blockquote>

<p>ですので、日本語パラメーターをURLを使って広告を出稿したい場合に困ってしまいます。　１つだけならどこかのサイトの変換サービスを利用しても良いですが、大量の広告となるとExcelで管理したりしてると思います。</p>

<h2>ExcelでFunctionを作って利用</h2>

<p>Excelは多機能です。　なんでもできちゃいます。　URL変換も例外ではありません。　ただ、標準の関数ではできないようなのでカスタム関数を追加します。</p>

<p>まず「ツール」メニューの「マクロ...」から「Visual Basic Editor」を起動します。</p>

<p>次に「挿入」メニューから「標準モジュール」を選択します。</p>

<p>「標準モジュール」が追加されたらダブルクリックしてコードウィンドウを開き、以下のコードを埋め込みます。</p>

<pre>
Function urlEncode(str As String) As String
    Set sc = CreateObject("ScriptControl")
    sc.Language = "Jscript"
    Set js = sc.CodeObject
    urlEncode = js.encodeURIComponent(str)
End Function
</pre>

<p><img alt="マクロでFunctionの追加" src="http://colo-ri.jp/develop/archives/excelUrlEncodeMacro.gif" width="546" height="283" /></p>

<p>追加が完了したら「ファイル」メニューから「終了してMicrosoft Excelへ戻る」を選択してExcelへ戻ります。</p>

<h2>日本語URLをURLエンコードしてみる</h2>

<p>さて、これで標準関数と同じようにurlEncode関数が使えるようになりました。　以下のように基本URLと日本語キーワードを組み合わせて変換表示させてみてください。</p>

<p><img alt="urlEncode関数を利用" src="http://colo-ri.jp/develop/archives/excelUrlEncode.gif" width="500" height="189" /></p>

<p>あとは変換で出来たURL文字列を広告URL欄に貼り付けるだけ！</p>]]></description>
         <link>http://colo-ri.jp/develop/2009/07/urlexcelurl.html</link>
         <guid>http://colo-ri.jp/develop/2009/07/urlexcelurl.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">検索エンジン</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Excel</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Overture</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">URLエンコード</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">日本語</category>
        
         <pubDate>Tue, 28 Jul 2009 10:47:46 +0900</pubDate>
      </item>
            <item>
         <title>クローラー(clawler)やボット(bot)をアクセスログに残さない方法</title>
         <description><![CDATA[<p>WEBサイトのアクセスログを監視する場合に参考にならない情報として検索エンジンのクローラーやボットの来訪があります。　これを表示させないようにするためにはtailコマンドなどを使う際に正規表現で弾くようにします。</p>

<h2>いろんな種類のクローラーやボット</h2>

<p>１台のPCをアクセスログ監視専用マシンにし、２４インチモニターで７つほどのログウィンドウを立ち上げて2ヶ月ほど常時監視していましたが、ほんとにいろんなクローラーやボットがいるなぁ、といった印象です。　Googlebotの来訪頻度の多さや個人ユーザーなどがWgetでデータ取得していたりと、リアルタイムでログ監視していると、アクセス解析ソフトだけでは分からないことも感じられて面白いです。　一方でアクセス解析ソフトでのクローラー・データベースのアップデート頻度も大変なんだろうなぁ、と思います。</p>

<h2>クローラーやボットたちをgrepで弾いてみる</h2>

<p>出力制御は定番のgrepで、パイプを利用します。　grepコマンドに「-v」オプションをつけると、正規表現の文字列に一致するログを非表示にできます。</p>

<pre>
# tail -f /path/to/log/access_log|grep -v "clawler\|Googlebot\|googlebot\|DotBot\|Slurp\|msnbot\|robots\|spider\|Wget"
</pre>

<h2>さらにWEBページファイルのみのログ表示にする</h2>

<p>クローラーやボットよりもある意味邪魔なのがWEBページファイルにリンクした画像やCSSファイルなどのアクセスログです。　これらを弾く正規表現も一緒に組み込んでみます。</p>

<pre>
tail -f /path/to/log/access_log|grep -v ".jpg\|.JPG\|.css\|.js\|.ico\|.png\|.txt\|.swf\|.gif\|.GIF\|clawler\|Googlebot\|googlebot\|DotBot\|Slurp\|msnbot\|robots\|spider\|Wget"
</pre>

<p>上にも書いたように、これからも様々なクローラーやボットたちがあなたのサイトに来訪することが予想されますので、それっぽい文字列を察知したら加えていくようにしてくださいね。</p>

<p>これを機に正規表現を学びたい方は参考にどうぞ</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=coloriamazon-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4873113598" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>]]></description>
         <link>http://colo-ri.jp/develop/2009/07/clawlerbot.html</link>
         <guid>http://colo-ri.jp/develop/2009/07/clawlerbot.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">apache</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">apache</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">アクセスログ</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">アクセス解析</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">正規表現</category>
        
         <pubDate>Sat, 25 Jul 2009 22:15:25 +0900</pubDate>
      </item>
            <item>
         <title>Google Analytics API::JavaScript開発者向けデータ出力API</title>
         <description><![CDATA[<p class="dim">※かなり荒い翻訳なので、参考程度にご覧ください。</p>

<p>このドキュメントは、JavaScriptのクライアントライブラリを使った基本的なデータAPIインタラクションの例を掲載します。　より詳細なフィード・クエリーの構造やレスポンスを知りたいのであれば、<a href="http://code.google.com/apis/analytics/docs/gdata/gdataReference.html">フィード・リファレンス</a>やGoogle Analyticsの<a href="http://code.google.com/apis/analytics/docs/gdata/gdataReferenceAccountFeed.html">アカウント・フィード</a>や<a href="http://code.google.com/apis/analytics/docs/gdata/gdataReferenceDataFeed.html">データ・フィード</a>に相当するものをご覧ください。</p>
<h2>本ドキュメントの対象となる方</h2>
<p>このドキュメントは、Google Analyticsと連動したJavaScriptのクライアントアプリケーションを作成したいプログラマー向けに書かれています。　このドキュメントは、あなたが以下の概念にこなれたひとであると仮定しています：</p>
<ul>
				<li>Google Data APIs protocolの一般的なアイデア。</li>
				<li>Google Analyticsからくるアカウント情報やデータ・フィードのリクエストと連携するしくみ。詳しくは<a href="http://code.google.com/apis/analytics/docs/gdata/gdataReferenceAccountFeed.html">アカウント・フィード</a>や<a href="http://code.google.com/apis/analytics/docs/gdata/gdataReferenceDataFeed.html">データ・フィード</a>を参考にしてみてください。</li>
				<li><a href="http://code.google.com/apis/analytics/docs/gdata/gdataDeveloperGuide.html#GettingStarted">Getting
				Started</a>に書かれてあるData Export APIの利用の流れ。</li>
				<li>JavaScriptプログラミングの知識。</li>
				<li><a href="http://code.google.com/apis/gdata/client-js.html">JavaScriptクライアント・ライブラリー</a>の基本的な使い方。</li>
</ul>
<p>クライアント・ライブラリーが提供するクラスやメソッドについてのリファレンスは<a href="http://code.google.com/apis/gdata/jsdoc/">JavaScriptクライアント・ライブラリーAPIリファレンス</a>を参照してください。</p>
<h2>JavaScriptライブラリーの利用</h2>
<p>JavaScriptクライアント・ライブラリーによって、Google Analyticsサーバーとの全ての通信を制御します。　JavaScriptクライアント・ライブラリーによってクライアント側はブラウザーのセキュリティーモデルの規則に従っている間、あらゆるドメインからGoogleのData
				Export APIのリクエストを送信できます。</p>
<h3 id="acquiring">ライブラリーを取得する</h3>
<p>あなたのアプリケーションにJavaScriptクライアント・ライブラリーを付加するには基本的に２つのステップが必要となります：</p>

<p>あなたのアプリケーションのHTMLドキュメント中にサーバーからクライアント・ライブラリーを埋め込むコードを記述します。これをHTMLドキュメントの&lt;head&gt;タグ内に&lt;script&gt;タグを使って埋め込みます</p>
<pre>&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi&quot;&gt;&lt;/script&gt;</pre>

<p>google.load()メソッドを使って、あなたのJavaScriptコードのセットアップ部分でGoogle Analyticsクライアント・ライブラリーをロードします。このメソッドは&lt;head&gt;セクション内か、&lt;head&gt;セクション内の&lt;script&gt;タグによるJavaScriptファイル参照の中で呼び出さなければいけません。</p>	<pre><span class="pun">google.load('gdata', '1.x', {</span><span class="pln">packages</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'analytics'</span><span class="pun">]});</span></pre>

<p>google.load()に渡す2番目のパラメーターは、要望するJavaScriptクライアント・ライブラリーのバージョンです。　手に入るバージョン番号とその意味について：これはGdata JavaScriptバージョンに関係したものなのか、あるいはクライアントのGA Data APIのバージョンなのか、はっきりしていません</p>

								<ul>
												<li>1 — メジャーなバージョン１の２つめから最新のリビジョンを含む（全部入り）</li>
												<li>1.x — メジャーなバージョン１の最新版のみ利用</li>
												<li>1.s — メジャーなバージョン１の最新「安定」版を利用。Google Analyticsでは時々あるクライアント・ライブラリーのバージョンを、デベロッパーからのフィードバックを受け取った「安定版」として宣言します。しかし、機能的に最新版というわけではありません。</li>
												<li>1.0, 1.1 ... — 特定のメジャーバージョンやマイナーバージョンを選んで組み合わせて利用します。</li>
								</ul>
<p>JavaScriptライブラリーを利用するためにgoogle.load()メソッドを呼んだあとは、あなたのアプリケーションコードが実行される前にHTMLドキュメントがロードを終了するまで待つべきです。　多くの場面では、これを&lt;body&gt;要素のonload()ハンドラで呼び出すよりもloadハンドラ関数で行うのがベストでしょう。</p>

<h2>認証</h2>
<p>ユーザーがGoogle AnalyticsのWEBサイトでアクセスレポートを見る前に、まずGoogleアカウントを使ってログインしないといけません。　同じように、あなたのアプリケーションもAnalyticsのフィード・データを取得するために認証しなければいけません。　あなたはユーザー認証用のディレクトリーをアプリケーション内に組み込むか、あなたのJavaScriptアプリケーションからユーザーがAnalyticsアクセスを取得するためのユーザーログインを提供できます。　JavaScriptを使って、以下のアプローチのいずれかの方法で認証が可能です：</p>
<ul>
				<li><a href="http://code.google.com/intl/ja/apis/analytics/docs/gdata/1.0/gdataJavascript.html#AuthSub">AuthSub</a> プロキシー認証</li>
				<li>WEBアプリケーション用<a href="http://code.google.com/intl/ja/apis/analytics/docs/gdata/1.0/gdataJavascript.html#OAuth"> OAuth認証</a></li>
</ul>
<p>一般的なGoogle Data APIの認証についての詳しい情報は、<a href="http://code.google.com/apis/gdata/auth.html">authentication
				documentation</a>を参照ください。</p>
<p>一度あなたのアプリケーションが認証を完了すると、Googleアカウントに必要な証明が提供されたと実証され、それらの証明情報はAnalyticsのユーザーアカウントにリンクされます。　もし認証が失敗したら、サーバーがエラーを返します。　アカウントアクセスや、証明と認証の違いについての詳しい情報については<a href="http://code.google.com/apis/analytics/docs/gdata/gdataReference.html">リファレンス・ガイド</a>を参照してください。</p>
<h3 id="AuthSub">AuthSubプロキシー認証</h3>
<p>AuthSubプロキシー認証はGoogleアカウントをユーザーに認証する必要があるWEBアプリケーションで使われます。　AuthSubでは、WEBサイトのオペレーターやクライアントのコード上でユーザーのユーザー名やパスワードが見えることはありません。　その代わりに、クライアントは特別なAuthSubトークンを取得します。　このトークン情報をユーザー情報に代わるものとして利用します。　詳しくは<a href="http://code.google.com/apis/accounts/AuthForWebApps.html">Authentication
for Web Applications</a>を参照してください。</p>
<p>以下に、WEBベースのJavaScriptクライアント用の認証の簡単な概要を示します：</p>
<ul>
				<li>クライアントアプリケーションはクライアント・ライブラリーが提供する「google.accounts.user.login()」メソッドを呼び出すことで、どのGoogleサービスを使うか、スコープ値を得ます。</li>
				<li>クライアント・ライブラリーはブラウザーに対してGoogleアカウントのログインページを送り、そこでユーザーはサービスにログインするための認証情報を入力します。</li>
				<li>ユーザーがログインに成功すると、AuthSubシステムはブラウザーに対してWEBクライアント用のURLを返し、認証用トークンを得ます。</li>
				<li>JavaScriptクライアント・ライブラリーはCookieの中にトークン情報を保存し、「google.accounts.user.login()」という、クライアントアプリケーション用のコントロールを返します。</li>
				<li>クライアントアプリケーションがその後、Analyticsと連携するためのクライアント・ライブラリー・メソッドを呼び出す際、クライアント・ライブラリーは自動的に全てのサーバーリクエストに対してトークン情報を付加します。</li>
</ul>
<p class="note">注意：WEBブラウザー上で認証されたAnalyticsリクエストを作成するJavaScriptクライアント・ライブラリー用にそのページに（ページと同じ）ドメイン上にある画像を含めなければいけません。　1ピクセルの透明GIF画像でもどんな画像でも良いですが、ページ上の画像でなければいけません。　もし、その画像をページ上に表示させたくなければ、&lt;img&gt;タグのstyle属性にレンダリングエリア外に位置させるようにします。　例えば、「style=&quot;position:absolute;
				top:-1000px;&quot;」といった感じです。</p>
<p>以下のサンプルコードはどういうふうに認証が制御されるかを示しています：</p>
<pre>function logMeIn() <span class="pun">{</span><span class="pln"><br />  scope </span><span class="pun">=</span><span class="pln"> </span><span class="str">"https://www.google.com/analytics/feeds"</span><span class="pun">;</span><span class="pln"><br />  google</span><span class="pun">.</span><span class="pln">accounts</span><span class="pun">.</span><span class="pln">user</span><span class="pun">.</span><span class="pln">login</span><span class="pun">(</span><span class="pln">scope</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">}<br /><br />function setupMyService() {</span><span class="pln"><br />  </span><span class="kwd">var</span><span class="pln"> myService </span><span class="pun">=</span><span class="pln"><br />    </span><span class="kwd">new</span><span class="pln"> google</span><span class="pun">.</span><span class="pln">gdata</span><span class="pun">.</span><span class="pln">analytics</span><span class="pun">.</span><span class="typ">AnalyticsService</span><span class="pun">(</span><span class="str">'exampleCo-exampleApp-1'</span><span class="pun">);</span><span class="pln"><br />  logMeIn</span><span class="pun">();</span><span class="pln"><br />  </span><span class="kwd">return</span><span class="pln"> myService</span><span class="pun">;</span><span class="pln"><br /></span><span class="pun">}</span>
</pre>
<p>「user.login()」メソッドは、クライアント・ライブラリーが制御する認証トークン情報を生成し、「google.accounts.user.logout()」メソッドが呼ばれて取り消されるまでそのトークン情報は有効になります：</p>
<pre><span class="pun">function logMeOut() {</span><span class="pln"><br />  google</span><span class="pun">.</span><span class="pln">accounts</span><span class="pun">.</span><span class="pln">user</span><span class="pun">.</span><span class="pln">logout</span><span class="pun">();</span><span class="pln"><br /></span><span class="pun">}</span>
</pre>
<p>もしlogout()メソッドが呼ばれなければ、トークン情報が保存されたCookieはユーザーによって削除されないかぎり2年間残ります。Cookieはブラウザー・セッションをまたいで保持されますので、ユーザーはブラウザーを閉じたり、再度開いたりしてクライアントとして戻ってきてもまだログインした状態が保たれます。</p>
<p>しかし、トークン情報がセッション中に無効になることがあります。　もしAnalyticsがトークン情報を拒否した場合は、クライアント側で現在のトークン情報がCookieに残らないようにlogout()メソッドを呼んで削除するようにエラーの状況を制御すべきです。</p>
<p>さまざまなコンテキスト中で役に立つ情報を見つけるAuthSubメソッドがあと２つあります：</p>
<ul>
				<li>「google.accounts.user.checkLogin(scope)」メソッドはブラウザーが現在（パラメーターで与えられた）スコープの認証トークン情報を持っているかどうかを示します。</li>
				<li>「google.accounts.user.getInfo()」メソッドはデバッグ用で、現在のトークン情報について詳細な情報を提供します。</li>
</ul>
<p>トークン情報の管理やcheckLogin()、getInfo()メソッドの情報を含め、AuthSubと連携するJavaScriptの使用法の詳細については<a href="http://code.google.com/apis/gdata/authsub-js.html">JavaScriptクライアント・ライブラリーで「AuthSub」認証の使い方</a>ドキュメントを参照ください。</p>
<p class="note">Tip：ユーザーのログイン・プロセスはマニュアル操作で行えるようにログインボタンやその他のユーザー入力のしくみを提供するようにしてください。　もし、ユーザーへのログイン・プロンプトなしにアプリケーションで「google.accounts.user.login()」を呼び出してしまうと、ユーザーは最初からあなたのの作成したページではなくGoogleアカウントのログインページが見える状態になってしまうでしょう。　そこでユーザーがログインしないことに決めても、Googleはあなたのページにリダイレクトで戻すことができません。　このようなシナリオだとユーザーはあなたのページを閲覧しようとしますが、その代わりにGoogleアカウントのログインページにリダイレクトされてしまい、ユーザーは混乱して不満に思ってしまいます。</p>
<h3 id="OAuth">OAuth認証</h3>
<p>OAuthは署名を必要とし、その署名はJavaScriptの環境ではセキュアな状態が保てませんので、JavaScriptではOAuthをネイティブサポートしていません。　しかし、ShindigにおいてはOAuthプロキシー用のJavaScriptサポートは入手可能です。　Shindigサーバーではガジェットに代わってOAuthリクエストを作成することができます。　OAuthプロキシーは現在iGoogleでサポートされています。　Googleデータ・クライアントとOAuthプロキシーを利用してガジェットを作成する方法について、詳しくは<a href="http://code.google.com/apis/gdata/articles/gdata_gadgets.html">Googleデータ・がジェットの作成</a>を参照ください。</p>
<h2 id="RetrievingAccounts">アカウントデータの取得</h2>
<p>Data Export APIのJavaScriptライブラリーを使ってアカウントデータを取得するには、４つの基本的なしくみを利用すべきです：</p>
<ul>
				<li>AnalyticsServiceオブジェクト</li>
				<li>アカウントフィードを取得するためのgetAccountFeed()メソッド</li>
				<li>フィードデータ内の要素をパースして表示するためのフィード・ハンドラ</li>
				<li>フィード・リクエストが失敗したときのためのエラー・ハンドラ</li>
</ul>
<p>Data Export API用に、基本アカウント取得用のスクリプトのための完全動作するサンプル・ソースコードは<a href="http://code.google.com/p/ga-api-javascript-samples/source/browse/trunk/src/v1/accountfeed/accountFeed.js">JavaScript
examplesセクション</a>にあります。　サンプルが見られるのに加え、WEBページにあなただけのAnalyticsアカウントデータを取得するための<a href="http://code.google.com/apis/analytics/docs/gdata/1.0/gdataInteractiveSamples.html">インタラクティブなサンプル</a>が利用できます。</p>
<h3 id="analyticsServiceObject">AnalyticsServiceオブジェクト</h3>
<p>AnalyticsServiceオブジェクトはAnalyticsからフィードデータを取得するために使う全てのメソッドへのアクセスを提供します。　詳しくは<a href="http://code.google.com/apis/gdata/jsdoc/1.10/index.html">AnalyticsService
reference doc</a>を参照ください。　いろんなGoogleデータフィードへアクセスするために、あなたのアプリケーションでAnalyticsServiceクラスのオブジェクトを文字列で指定して新規生成する必要があります。　その文字列は必須で半角英数字で指定することができます。　お勧めとしてはあなたのアプリケーション名や企業名をつけるとよいでしょう。</p>
<pre>var myService = new google.gdata.analytics.AnalyticsService('acmeSuperStatsApp1a');</pre>
<h3 id="getAccountFeed">getAccountFeedメソッド</h3>
<p>The getAccountFeed method requests the account feed from the AnalyticsService
				object. The account feed provides the list of profiles and accounts to which
				a user has access.</p>
<p>getAccountFeedメソッドはAnalyticsServiceオブジェクトからアカウントフィードを要求します。　アカウントフィードでは、プロファイルのリストやユーザーがアクセス可能はアカウント情報が提供されます。</p>
<pre>myService.getAccountFeed(myFeedUri, continuation, handleError);</pre>
<p>あなたのアプリケーションで３つのパラメーターを指定します：</p>

				<p>myFeedUri—Google Analyticsアカウントフィード・クエリーです。　アカウントフィード・クエリーについてはアカウントフィード・ドキュメントの<a href="http://code.google.com/apis/analytics/docs/gdata/gdataReferenceAccountFeed.html#accountRequest">Account
								Feed Request</a>を参照ください。</p>
								<pre> var myFeedUri = 'https://www.google.com/analytics/feeds/accounts/default';</pre>

				<p>continuation—リクエストが成功した場合に実効するJavaScript命令。</p>
								<pre>function continuation(myResultsFeedRoot) { . . .</pre>      
				<p><code>handleError</code>—エラーが発生した場合に実行するJavaScript命令。このパラメーターは任意です。</p>            
				<pre>function handleError(e) {</pre>

<h3 id="requestHandling">リクエスト制御  </h3>  <p>もし、アカウントフィードのリクエストが成功したら、渡したパラメーターで指定された命令が実行され、JavaScriptクライアント・ライブラリーはアカウントフィードオブジェクトを帰します。（詳しくはAccount
												Feedクラスリファレンスを参照ください）　ここで、あなたが書いた命令はアカウントフィードオブジェクトからのフィードデータを取得し、フィードデータから結果を取得・表示するためのgetEntriesメソッドを使用します。　getEntriesメソッドはGoogle
												Data atomフィード・オブジェクトから継承されています。　以下の例は、認証したユーザーのためにアカウント名、プロファイル名、プロファイルIDを表示しています。</p>
								<p>&nbsp;</p>
								<pre class="prettyprint"><span class="kwd">function</span><span class="pln"> continuation</span><span class="pun">(</span><span class="pln">feedRoot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />   </span><span class="kwd">var</span><span class="pln"> entries </span><span class="pun">=</span><span class="pln"> feedRoot</span><span class="pun">.</span><span class="pln">feed</span><span class="pun">.</span><span class="pln">getEntries</span><span class="pun">();</span><span class="pln"> <br /> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">entries</span><span class="pun">.</span><span class="pln">length </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">return</span><span class="pun">;</span><span class="pln"><br />  <br /> </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">&lt;</span><span class="pln">entries</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="kwd">var</span><span class="pln"> entry </span><span class="pun">=</span><span class="pln"> entries</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln"><br /> document</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln"><br />  entry</span><span class="pun">.</span><span class="pln">getPropertyValue</span><span class="pun">(</span><span class="str">'ga:AccountName'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="str">' '</span><span class="pun">+</span><span class="pln"><br />  entry</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">getText</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="str">' '</span><span class="pun">+</span><span class="pln"> <br />  entry</span><span class="pun">.</span><span class="pln">getPropertyValue</span><span class="pun">(</span><span class="str">'ga:ProfileId'</span><span class="pun">));</span><span class="pln"> <br /> </span><span class="pun">}</span><br />}</pre>
								<h3 id="errorHandling">エラー・ハンドリング </h3>
								<p>もし、getAccountFeed()メソッドが失敗すると、errorHandlerで指定したパラメーターの命令が実行され、JavaScriptクライアント・ライブラリーはこの命令にたいしてエラーオブジェクトを渡します。　以下のシンプルなエラー・ハンドラー命令はウィンドウにエラーメッセージを表示します。</p>

								<pre><span class="kwd">function</span> <span class="pln">errorHandler</span><span class="pun">(</span>error<span class="pun">)</span> <span class="pun">{</span><span class="pln"><br />  alert</span><span class="pun">(</span><span class="str">"There was an error!\n"</span> <span class="pun">+</span> <span class="pun">((</span><span class="pln">e</span><span class="pun">.</span><span class="pln">cause</span><span class="pun">)</span> <span class="pun">?</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">cause</span><span class="pun">.</span><span class="pln">statusText </span><span class="pun">:</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">message</span><span class="pun">));</span><span class="pln"><br /></span><span class="pun">}</span>
</pre>]]></description>
         <link>http://colo-ri.jp/develop/2009/07/google_analytics_apijavascript.html</link>
         <guid>http://colo-ri.jp/develop/2009/07/google_analytics_apijavascript.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">JavaScript</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Google Analytics API</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">JavaScript</category>
        
         <pubDate>Mon, 13 Jul 2009 14:37:37 +0900</pubDate>
      </item>
            <item>
         <title>Webサイト用のベストなプロトタイピングツールはありますか？</title>
         <description><![CDATA[<h2>What is the best web prototyping tool?</h2>

<p>プロトタイピングツール関係の情報を漁っていたら<a href="http://stackoverflow.com/questions/112803/what-is-the-best-web-prototyping-tool">What is the best web prototyping tool?</a>なんていうやりとりがあったので、翻訳してみました。</p>

<p>ツール派、アナログ派などいろいろいますねー。</p>

<h2>回答は１３人</h2>

<h3>Balsamiq MockupsとPencil Project（Swaroop C H さん）</h3>

<p><a href="http://www.balsamiq.com/products/mockups">Balsamiq Mockups</a>（商用ソフト：$79）か、<a href="http://www.evolus.vn/Pencil/">Pencil Project</a>（オープンソースのFirefoxアドオン）を試してみなよ。</p>

<p>返答：おお、Pencil Projectすげー！ありがとう！</p>

<h3>ペンと紙（jpeacockさん）</h3>

<p>ペンと紙。マジで。ツールを覚える時間も要らないからデザインに時間かけられる。</p>

<p>最初にページのテンプレートをいくつか作っておいて、それをコピーする。　あとはダイアログとか表示部分とか細かいところを手で描くだけ。マジで速いしアイデアも浮かんでくるよ。</p>

<h3>鉛筆と紙（gregmacさん）</h3>

<p>普通の鉛筆と紙で始める。速いし、機能的だし、ツールの使い方を覚えなくて済む。アプリを起動できるようになるより早くデザインが書き終わるよ。マジで。</p>

<p>それで、最初のコンセプトが良かったら、デザイナーにPhotoshopで（というか描画ツールはなんでもいいんだけど）モックアップを描かせる。まだHTML化する必要はなし。君がプログラマーだったら、デザイナーではない※1だろうから、専門のデザイナーにまかせよう。</p>

<p class="sup">※1 大体において、ほとんどのプログラマーはデザインのことが分かってない。Photoshopの全てのツールがどういうものか分かってないから、デザインを任せられないだろう。</p>

<h3>Balsamiq Mockups（Lou Francoさん）</h3>

<p><a href="http://www.balsamiq.com/products/mockups">Balsamiq Mockups</a>は、すげーいいね。</p>

<h3>Mockup Screens（Mackaaijさん）</h3>

<p>うちのコンサルタントたちは<a href="http://www.mockupscreens.com/">Mockup Screens</a>('Quick and Easy Screen Prototypes')を使ってるよ。画面編集が簡単だし、スケッチ機能もデザインに集中できるようになってるしね。</p>

<h3>iRise（Krishnaさん）</h3>

<p>半年くらい前から<a href="http://www.irise.com/">iRise</a>を使ってる。プロトタイピングだけじゃなくて要件定義書も作れるからね。</p>

<h3>Axure（Craigさん）</h3>

<p>最近会う人みんな<a href="http://www.axure.com/">Axure</a>がいいって言ってるな。</p>

<h3>HTML手書き（Turnkeyさん）</h3>

<p>簡単なHTMLとリンクでプロトタイピング。ツールは好きなHTMLエディタでいいよ。クライアントに見せるのが楽。ときどき最初の基本ページを前に作った別アプリから持ってきて「別名で保存」して使ってるけどね。</p>

<h3>３種類を使いこなす（nzpcmad）</h3>

<ul>
<li>Visual Studioを使って基本ページを作る。中のデータはダミーで。そして、できるだけシンプルにそれぞれのページをつなぐ。これで客に見せるプロトタイプが完成。利点は、プロトタイプが実際のコードになっていること。苦労せずに開発とドキュメントを合わせられるよ。</li>

<li>Visioを使う。ペンと紙よりもキチンとしたものが見せられる。更新が楽なので、クライアントの前ですぐ見せられる。ドキュメントの中に簡単に読み込ませられるし、プロっぽく見える。</li>

<li>ペンと紙。これはクライアントが「自分たちはどんなものを作って欲しいのか」が分かってなくて、「たぶん多くの変更があるだろう」と君が考えている場合に有用な方法だ。基本をマスターしたら、上のどれかを選ぶといいよ。</li>
</ul>

<h3>なんか大胆（david dickeyさん）</h3>

<p>厳密にしないこと。</p>

<p>いろんな色のインデックスカードが入った箱と、それらを（一時的に）ペタペタ貼るためのスプレーのり。黒マーカーをいっぱい。そしてホワイトボードを立てるためのフロアーさ。</p>

<h3>Axure（Raymondさん）</h3>

<p>ずっと<a href="http://www.axure.com/">Axure</a>を使ってるよ。安定してるし、役に立つ機能が沢山あるし。中小規模のWeb案件で使ってるけど、かなり助かってるよ。もしJavaScript/Ajax機能をページ内で沢山使うなら、dynamic panelsがウザく感じるかも。そんなときは単純なHTML/JavaScriptを組んだほうがいいかもね。</p>

<p>ここで誰かが挙げたiRiseを見たことあるけど、かなり似てるね。iRiseはもっと規模の大きい案件で使うのがいいかも。　でもAxureはiRiseよりもかなり安いよ:-)</p>

<h3>Protonotes（Maxさん）</h3>

<p><a href="http://www.protonotes.com/">Protonotes</a>だな。</p>

<h3>Protoshare（Andeeさん）</h3>

<p>プロトタイピングでこういうのを探してる人ってだいたい社外のチームとかクライアントと協調する必要があるから、<a href="http://www.protoshare.com/">Protoshare</a>がいいんじゃないかな。　<a href="http://www.axure.com/">Axure</a>っぽいけど、複数メンバーでアクセスしたり、コメントしたりできるよ。</p>]]></description>
         <link>http://colo-ri.jp/develop/2009/04/web.html</link>
         <guid>http://colo-ri.jp/develop/2009/04/web.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">開発手法</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">アイデア</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">ツール</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">プロトタイピング</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">プロトタイプ</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">手法</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">開発</category>
        
         <pubDate>Mon, 27 Apr 2009 18:26:26 +0900</pubDate>
      </item>
            <item>
         <title>DATETIME型の値をPHP上でUNIX TIMESTAMP値に変換する方法</title>
         <description><![CDATA[<p>あんまり需要がないかもしれませんが、ここに辿りついて来た方のために掲載しておきます。</p>

<p>引数が正当な日付かどうかのチェックは事前にお願いしますm(_ _ )m</p>

<pre>
/**
  * DATETIME形式の値をUNIX TIMESTAMP値に変換
  *
  * @param string $datetime DATETIME値
  * @return integer DATETIME型じゃなければ0
  */
function datetime2unixtime($datetime) {
    $regex = "/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/";
    if (preg_match($regex, $datetime, $m)) {
        array_walk($m, 'intval');
        return mktime($m[4],$m[5],$m[6],$m[2],$m[3],$m[1]);
    } else {
        return 0;
    }
}
</pre>

<h2>UNIX TIMESTAMP値をDATETIME値に変換</h2>

<p>ついでなので、UNIX TIMESTAMP値をDATETIME値に変換する方法も載せておきますね。</p>

<pre>
/**
  * UNIX TIMESTAMP形式の値をDATETIME値に変換
  *
  * @param integer $timestamp UNIX TIMESTAMP値
  * @return string
  */
function unixtime2datetime($timestamp) {
    if (is_int($timestamp)) {
        return date('Y-m-d H:i:s', $timestamp);
    } else {
        return '';
    }
}
</pre>]]></description>
         <link>http://colo-ri.jp/develop/2009/04/datetimephpunix_timestamp.html</link>
         <guid>http://colo-ri.jp/develop/2009/04/datetimephpunix_timestamp.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">PHP</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">DATETIME</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">TIMESTAMP</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">UNIX</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">変換</category>
        
         <pubDate>Fri, 24 Apr 2009 16:33:18 +0900</pubDate>
      </item>
            <item>
         <title>Seleniumでテスト実行前にダイアログで警告する</title>
         <description><![CDATA[<p>「あるURLにアクセスするにはログインセッションを事前に削除しておかないといけない」などの前提条件がある場合、自分で覚えているつもりでもついつい忘れてしまいがちです。</p>

<p>そんな時に便利なのが、実行前に必要な文を警告として出してくれるコマンドです。　以下のコマンドは警告文を表示し、OKであればそのまま進み、キャンセルすると停止するテストケースです。</p>

<table class="cTable codefont" width="100%" cellspacing="0" cellpadding="0" summary="コマンド例">
	<tr>
		<th>コマンド</th>
		<th>対象</th>
		<th>値</th>
	</tr>
	<tr>
		<td>assertEval</td>
		<td>confirm('ログインセッション情報を削除しておいてください。　削除できましたか？')</td>
		<td>true</td>
	</tr>
</table>

<p>使い方はいろいろあると思いますので、良かったら使ってみてくださいね。</p>]]></description>
         <link>http://colo-ri.jp/develop/2009/04/selenium_1.html</link>
         <guid>http://colo-ri.jp/develop/2009/04/selenium_1.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Selenium</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Selenium</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">assertEval</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">confirm</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">セッション</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">ログイン</category>
        
         <pubDate>Mon, 13 Apr 2009 23:08:35 +0900</pubDate>
      </item>
            <item>
         <title>Seleniumのテスト中に任意のパラメーターを使う方法</title>
         <description><![CDATA[<p>Seleniumでテストする内容に以下のような、ブラウザの範疇から外れたパラメーターを利用したいときがあったりしませんか？</p>

<ul>
<li>受信したメールに記載されているアドレスにアクセスする</li>
<li>しかもそのURLは毎回異なる文字列である</li>
</ul>

<p>URLにタイムスタンプが入っていたり、任意の文字列から生成したハッシュ文字列が含まれていたりした場合などが該当すると思います。</p>

<p>GmailやYahoo!mail、hotmailなどのWEBベースでアクセス可能なアカウントであれば、テストケースを分けてサイトにアクセスしてURLを抽出できるかもしれませんが、ちょっとしたテストにそれほど大げさなことをしたくない場合があります。</p>

<h2>テストケース実行中にテキスト入力ダイアログを出す</h2>

<p>手っ取り早いのが、テストケース実行中にJavaScriptでテキスト入力ダイアログを出して、そこで入力されたテキストを変数に入れて利用する方法です。</p>

<p>以下は、テキスト入力ダイアログを出して入力されたURLにアクセスするテストケースです。</p>

<table class="cTable codefont" width="100%" cellspacing="0" cellpadding="0" summary="コマンド例">
	<tr>
		<th>コマンド</th>
		<th>対象</th>
		<th>値</th>
	</tr>
	<tr>
		<td>getEval</td>
		<td>url=prompt('URLを入力してください。')</td>
		<td></td>
	</tr>
	<tr>
		<td>open</td>
		<td>javascript{url}</td>
		<td></td>
	</tr>
</table>

<p>最初のコマンドでurl変数にテキストを格納し、２つめのコマンドで変数を利用してopenしています。　使い方はいろいろ考えられると思うのでぜひテストに利用してみてくださいね。</p>]]></description>
         <link>http://colo-ri.jp/develop/2009/04/selenium.html</link>
         <guid>http://colo-ri.jp/develop/2009/04/selenium.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Selenium</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Selenium</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">open</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">prompt</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">パラメーター</category>
        
         <pubDate>Mon, 13 Apr 2009 22:43:45 +0900</pubDate>
      </item>
            <item>
         <title>Yahoo!検索コンテンツ品質ガイドライン(翻訳)</title>
         <description><![CDATA[<p style="text-align:center;border:1px solid #c70000"><img style="padding-top:5px" alt="yahoo search contents quality guideline image." src="http://colo-ri.jp/develop/archives/yahoo_quality_guideline.gif" width="361" height="150" /></p>

<p><a href="http://help.yahoo.com/l/us/yahoo/search/basics/basics-18.html">Yahoo! Search Content Quality Guidelines.</a>として公開されている記事の翻訳です。<br />多少当たり前なところもあるかもしれませんが、王道として踏まえておくべき定番SEO対策という感じで読んでみるといいのではないでしょうか。意訳なので、間違えてたらご指摘お願いしますね。</p>

<h2>Yahoo! Search Content Quality Guidelines.</h2>

<p>Yahoo!では検索キーワードクエリーに対して、満足度が高く、キーワードに関連性のあるWebコンテンツをユーザーに提供できるように頑張っています。</p>

<h2>Yahoo!はこんなページが好き！</h2>

<ul>
	<li>本物の価値を持ったオリジナルで１つ(unique)しかないコンテンツ</li>
	<li>検索エンジンを考慮してあるけども、なによりも閲覧ユーザーのためにデザインされたページ。</li>
	<li>興味のある関連コンテンツを適切なタイミングで、閲覧ユーザーが見つけられるようにリンクしてあるページ。</li>
	<li>Webページの内容を的確に説明してあるメタデータがある。（titleやdescriptionを含む）</li>
	<li>一般的にみて、よくデザインされている。</li>

</ul>

<p>残念ながら、すべてのWebページがユーザーに価値ある情報を提供してくれるわけではありません。　適切ではない、だらだら長くて、満足度が低い検索結果が表示されるように検索エンジンをだます意図で作られたWebページもあります。　よく「スパム」と呼ばれているものです。　Yahoo!はこのようなページを登録したくありません。</p>

<h2>Yahoo!はこんなページが嫌い！</h2>

<p>これらが全てというわけではありませんが、Yahoo!が「良くない」と思っているよくあるタイプの例です。</p>

<ul>
	<li>検索結果の精度、多様性、あるいは関連性に悪影響を及ぼすようなページ。</li>
	<li>閲覧ユーザーを別ページに誘導させるためだけのページ。（ドアウェイ・ページ）</li>
	<li>実質同じようなコンテンツを提供している複数のサイトやページ。</li>
	<li>他のWebサイトのために作られたコンテンツやリンクに重く依存しているページ。（アフィリエイト・コンテンツなど）</li>
	<li>たくさんの不必要なバーチャル・ホスト名を割り当ててあるサイト。</li>
	<li>自動生成されてあまり価値のない、大量のページ（クッキー・カッター・ページ）</li>
	<li>検索エンジンランキングを人為的に膨らませる方法が使われているページ。</li>
	<li>テキストやリンクをユーザーから見えなくしてあるページ。</li>
	<li>検索エンジンに、ユーザーが見ているものと異なるコンテンツを提供しているページ。（クローキング）</li>
	<li>過剰に相互リンクさせて見かけ上の人気を水増ししたサイト。（リンク・スキーム）</li>
	<li>ユーザーよりも検索エンジン向けに作成されたページや、過剰なキーワード埋め込み、無関係なキーワードを埋め込んだページ。</li>
	<li>競合サイトやブランド名を誤用・誤解したページ</li>
	<li>過剰にポップアップ・ウィンドウを出したり、マルウェア（スパイウェア、ウィルス、トロイの木馬など）をインストールするサイト、あるいはユーザーの画面操作を妨害するようなサイト。</li>
	<li>見かけ倒し、詐欺っぽい、貧相なページ。</li>
	
</ul>

<p>Yahoo!検索コンテンツ品質ガイドラインは、質が低いページでもユーザーが満足することもある、という考えのもとにデザインされています。他のYahoo!ガイドラインと同様に、Yahoo!では検索インデックスの品質を確保するためならば何をやっても良い、という独自裁量権があります。</p>

<p>もし、あなたがYahoo!検索コンテンツ品質ガイドラインに準拠したサイトを作ったら、サイトレビューをリクエストすることができます。　<a href="http://help.yahoo.com/l/us/yahoo/search/urlstatus.html" title="Yahoo! Search URL Status Review Form">Yahoo! Search URL Status Review Form</a>を使ってみてください。　あなたがサイトを良くするためにやった作業の詳細を記入してくださいね。</p>

<h2>ユーザー主体の検索エンジン</h2>

<p>以上です。いかがだったでしょうか？</p>

<p>言ってしまえば当たり前なのですが、検索エンジンは人間であるユーザーが主に利用するものなので、ユーザーが満足することを第一に考えているということがよく分かります。</p>

<p>つまり、検索エンジンを騙そうとすればするほどユーザー主体ではなくなってYahoo!に嫌われていくということなんですね。</p>

<p>このことを肝に命じて、ユーザーを喜ばせるWebサイト、ページを常に生み出していきたいものです。</p>]]></description>
         <link>http://colo-ri.jp/develop/2009/03/yahoo.html</link>
         <guid>http://colo-ri.jp/develop/2009/03/yahoo.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Yahoo!</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">SEO</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Yahoo!</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">品質ガイドライン</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">翻訳</category>
        
         <pubDate>Wed, 18 Mar 2009 23:42:36 +0900</pubDate>
      </item>
            <item>
         <title>Trac Lightningで「指定されたパスが見つかりません。」のエラーを解決</title>
         <description><![CDATA[<p class="center"><img alt="hudson_bat実行後" src="http://colo-ri.jp/develop/archives/hudson_bat.gif" width="517" height="235" />
</p>

<h2>「コマンドプロンプトから実行」でエラー</h2>

<p>導入(インストール)後、いきなりなんですがエラーに遭遇。</p>

<pre class="code">
E:\TracLight>"\bin\java.exe" -Duser.home="E:\TracLight\projects\hudson" 
-jar hudson\hudson.war --prefix=/hudson --ajp13Port=8009 
--ajp13ListenAddress=127.0.0.1 --httpListenAddress=127.0.0.1 
--httpPort=8010
指定されたパスが見つかりません。
</pre>

<p>OSはWindows XPなんですが、どうやら「hudson.war」を実行するための「E:\TracLight\bin\java.exe」がない模様、ではなくてJavaの実行環境が整っていない模様。</p>

<p>hudsonはTrac Lightningをインストールする際に「一緒に入れるか？」と聞かれるものですが、そもそも何なのか？　<a href="http://ja.wikipedia.org/wiki/Hudson" rel="nofollow" title="Hudson">wikipedia</a>によると</p>

<blockquote>HudsonはJavaで実装され、 Apache TomcatやGlassFishなどのServletコンテナ上で動作する継続的インテグレーションツールである。HudsonはCVSやSubversionなどのバージョン管理システムツールをサポートし、Apache AntやApache Mavenで管理されているプロジェクトのタスクを実行したり、シェルスクリプトやWindowsのバッチファイルを実行することができる。
<br />ビルドはcronのようなスケジュール機構、他のビルドが完了した場合、あるいは特定のビルドURLがリクエストされた場合などによって実行される。</blockquote>

<p>とあります。　要するに開発中の面倒な作業を自動化してくれるツールということですね。<br />
「制作→デバッグテスト」を頻繁にやる方には便利かと。</p>

<p>…それはともかく、今は「Javaの実行環境を整える」ことだけに集中しましょう。</p>

<h2>Java環境の設定</h2>

<p><a href="http://java.com/ja/" rel="nofollow" title="Java">Java</a>をとりあえずインストールしてください(手順はリンク先に記載されています)。</p>

<p>インストールが完了したら、「\bin\Java.exe」があるパスを調べておきます。うちだと「E:\Program Files\Java\jre1.6.0_01」でした。</p>

<p><img alt="java実行環境があるフォルダ" src="http://colo-ri.jp/develop/archives/java_jre_path.gif" width="544" height="394" />
</p>

<p>「マイ コンピュータ」を右クリックして「プロパティ」を選び、上のタブで「詳細設定」タブを選択します。</p>

<p><img alt="詳細設定タブ" src="http://colo-ri.jp/develop/archives/system_prop_env.gif" width="487" height="435" /></p>

<p>「環境変数」を押して、環境変数に「JAVA_HOME」という名前で追加し、値を上で調べたパスに設定します。すでに追加されている場合は追加しなくて良いです。</p>

<p><img alt="JAVA_HOMEの追加" src="http://colo-ri.jp/develop/archives/system_prop_javahome.gif" width="447" height="400" />
</p>

<p>再起動しなくても、すぐに反映されます。</p>

<p>再度プログラムメニューの「Trac」から「コマンドプロンプトから実行」を選びます。</h2>

<pre class="code">
E:\TracLight>"E:\Program Files\Java\jre1.6.0_01\bin\java.exe" 
-Duser.home="E:\TracLight\projects\hudson" -jar hudson\hudson.war 
--prefix=/hudson --ajp13Port=8009 --ajp13ListenAddress=127.0.0.1 
--httpListenAddress=127.0.0.1 --httpPort=8010
[Winstone 2009/02/28 12:13:35] - Beginning extraction from war file
[Winstone 2009/02/28 12:13:50] - No webapp classes folder found - 
E:\TracLight\projects\hudson\.hudson\war\WEB-INF\classes
hudson home directory: E:\TracLight\projects\hudson\.hudson
[Winstone 2009/02/28 12:13:55] - Winstone Servlet Engine v0.9.10 running: 
controlPort=disabled
[Winstone 2009/02/28 12:13:55] - HTTP Listener started: port=8010
[Winstone 2009/02/28 12:13:55] - AJP13 Listener started: port=8009
2009/02/28 12:13:56 hudson.ClassicPluginStrategy createPluginWrapper
情報: Loading plugin: E:\TracLight\projects\hudson\.hudson\plugins\trac.hpi
2009/02/28 12:13:56 hudson.ClassicPluginStrategy explode
情報: Extracting E:\TracLight\projects\hudson\.hudson\plugins\trac.hpi
2009/02/28 12:13:57 hudson.model.Hudson load
情報: Took 484 ms to load
2009/02/28 12:13:57 hudson.TcpSlaveAgentListener <init>
情報: JNLP slave agent listener started on TCP port 1067
</pre>

<p>途中でファイアーウォールの許可を求めてきますので、許可しておきましょう。</p>

<p>ほっ…、無事エラーなく起動しました。</p>]]></description>
         <link>http://colo-ri.jp/develop/2009/02/trac_lightning.html</link>
         <guid>http://colo-ri.jp/develop/2009/02/trac_lightning.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">開発手法</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Java</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Trac Lightning</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">hudson</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">指定されたパスが見つかりません</category>
        
         <pubDate>Sat, 28 Feb 2009 13:07:41 +0900</pubDate>
      </item>
            <item>
         <title>Smartyのtruncate修飾子が効かない場合の回避法</title>
         <description><![CDATA[<h2>マルチバイトでうまく動かないtruncate修飾子</h2>

<p>あちこちで書かれていますが、文字列のカウントにstrlenを使ったりしているので、日本語文字列でうまく動いてくれません。</p>

<p>で、よく書かれている対処法が<strong>mb_truncate</strong>という修飾子を作っちゃえ！ということですが、「ファイル増やしたくないし、Smartyライブラリをいじるのは禁止されてるし…」という方には！</p>

<h2>そのままテンプレート上でmb_substrを使っちゃう</h2>

<p>あまりエレガントではないですけど、以下の方法でもできます。</p>

<p>以下の例は、utf-8の文字コードの文字列を８０文字で切り捨てて「・・・」を付加する方法です。</p>

<pre class="code">
{$myStr|<strong>mb_substr:0:80:"utf-8"</strong>}{if mb_strlen($myStr, "utf-8") &gt; 80}・・・{/if}
</pre>

<p>このように、修飾子にそのままPHP関数を使うことができます。　パイプライン「|」の左側に、使いたい関数の第一引数を書いて、それ以降の第２引数以降はコロン「:」で区切って指定します。　変数のアサイン（assign）などでも利用できるので、使ってみてくださいね。</p>

<pre class="code">
{assign var=shortStr value=$myStr|<strong>mb_substr:0:80:"utf-8"</strong>}
</pre>]]></description>
         <link>http://colo-ri.jp/develop/2009/02/smartytruncate.html</link>
         <guid>http://colo-ri.jp/develop/2009/02/smartytruncate.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">PHP</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Smarty</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">truncate</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">マルチバイト</category>
        
         <pubDate>Fri, 20 Feb 2009 11:54:03 +0900</pubDate>
      </item>
            <item>
         <title>数字を３桁ごとに区切る方法（カンマによる桁区切り）</title>
         <description><![CDATA[<p>価格表示などで数値を見やすくする桁区切り表示ですが、JavaScriptやActionScriptで無いかと思って探したのですが、良いのが見つからなかったので作ってみました。</p>

<p>負数や小数にも対応させてみました。　他の言語でもかんたんに改変できると思うので使ってみてくださいね。</p>

<h2>桁区切り用関数：addFigure</h2>

<h3>サンプル</h3>

<p>
<label for="txt">数値入力：</label>
<input type="text" id="txt" style="width:200px" />&nbsp;
<input type="button" id="conv" value="変換する" />
</p>

<p id="result" class="codefont" style="font-weight:bold">&nbsp;</p>

<pre class="code">
function addFigure(n) {

	var l, m='';
	var mark = (n < 0) ? '-' : '';
	var flt = '';

	n = Math.abs(n);
	if (n % 1) {
		flt  = n + '';
		flt = flt.substr(flt.indexOf('.'));
	}
	n = Math.floor(n) + '';
	while ( (l = n.length) > 3 ) {
		m = "," + n.substr( l - 3, 3 ) + m;
		n = n.substr( 0, l - 3 );
	}
	return mark + n + m + flt;
}
</pre>

<h2>使い方</h2>

<p>単に引数に変換したい数字を与えるだけです。</p>

<pre class="code">
var myNumber = -12345678.9;
var convNumber = addFigure(myNumber);
結果：-12,345,678.9
</pre>

<script type="text/javascript">
function addFigure(n) {

	var l, m='';
	var mark = (n < 0) ? '-' : '';
	var flt = '';

	n = Math.abs(n);
	if (n % 1) {
		flt  = n + '';
		flt = flt.substr(flt.indexOf('.'));
	}
	n = Math.floor(n) + '';
	while ( (l = n.length) > 3 ) {
		m = "," + n.substr( l - 3, 3 ) + m;
		n = n.substr( 0, l - 3 );
	}
	return mark + n + m + flt;
}
document.getElementById('conv').onclick = function() {
    var val = document.getElementById('txt').value * 1;
    document.getElementById('result').innerHTML = (isNaN(val)) ? '数値を入力しましょう。' : addFigure(val);
}
</script>]]></description>
         <link>http://colo-ri.jp/develop/2008/09/post.html</link>
         <guid>http://colo-ri.jp/develop/2008/09/post.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">JavaScript</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">ActionScript</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">JavaScript</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">カンマ区切り</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">価格表示</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">桁区切り</category>
        
         <pubDate>Sat, 20 Sep 2008 00:07:10 +0900</pubDate>
      </item>
            <item>
         <title>iPhone 3GのSafari仕様をマインドマップにしてみました。</title>
         <description><![CDATA[<p><img alt="マインドマップのスクリーンショット" src="http://colo-ri.jp/develop/archives/iphone_spec_ss1.gif" width="550" height="250" /></p>

<p>iPhone 3G向けのWebサイトを制作する方向けのSafari仕様のマインドマップをVisioのブレインストーミング図で作ってみました。　A4サイズのチートシートにしてPDFにしてみましたので、ダウンロードして自由にお使いくださいませ。　バージョンアップは随時ご指摘やSafariのバージョンアップなどに合わせて行いたいとおもいます。</p>

<h2>掲載情報概要</h2>

<p>以下のような情報を掲載しています。　全てを網羅するのはさすがに無謀でした…</p>

<ul>
<li>ユーザー操作の種類</li>
<li>ウィンドウ</li>
<li>JavaScript</li>
<li>Flash</li>
<li>画像</li>
<li>テキスト</li>
<li>禁止項目</li>
<li>専用エリア</li>
<li>寸法</li>
<li>ビューポート(viewport)</li>
<li>CSS</li>
<li>ユーザーエージェント(User-Agent)</li>
<li>WEB標準準拠</li>
</ul>

<h2>ダウンロード</h2>

<p>以下のリンクからPDFファイルをダウンロードしてください。</p>

<p><a href="/develop/archives/iphone_safari_spec_mindmap.pdf">iPhone 3G Safari仕様マインドマップ</a> <a rel="license" href="http://creativecommons.org/licenses/by/2.1/jp/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.1/jp/80x15.png"/></a></p>]]></description>
         <link>http://colo-ri.jp/develop/2008/09/iphone_3gsafari.html</link>
         <guid>http://colo-ri.jp/develop/2008/09/iphone_3gsafari.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">iPhone</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">PDF</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Safari</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">iPhone 3G</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">iPod touch</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">ダウンロード</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">仕様</category>
        
         <pubDate>Thu, 18 Sep 2008 02:13:12 +0900</pubDate>
      </item>
      
   </channel>
</rss>

