<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>tatsuyakun.jp</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/" />
    <link rel="self" type="application/atom+xml" href="http://tatsuyakun.jp/atom.xml" />
    <id>tag:tatsuyakun.jp,2011-06-13://2</id>
    <updated>2012-02-15T16:37:42Z</updated>
    <subtitle>はいはーい！すごくないこと書きまーす！</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 5.1</generator>

<entry>
    <title>[PHP]海外アクセス国内アクセスをPHPで判別する</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2012/02/phpphp.html" />
    <id>tag:tatsuyakun.jp,2012://2.14</id>

    <published>2012-02-15T16:26:13Z</published>
    <updated>2012-02-15T16:37:42Z</updated>

    <summary>超ひさしぶりの更新です。最近、海外ユーザーにも訴求したサービスを立ち上げました。...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[超ひさしぶりの更新です。<div><br /></div><div>最近、海外ユーザーにも訴求したサービスを立ち上げました。</div><div>初音ミクの動画を紹介しております。</div><div>http://miku-music.com/</div><div><br /></div><div><br /></div><div>日本語タイトルと英語タイトルを二つDBに保持しているので、曲リスト一覧で、</div><div>海外ユーザーには英語タイトルで表示しています。</div><div><br /></div><div>今回は海外ユーザーかどうかを判別するプログラムを紹介します。</div><div><br /></div><div>====キーワード ====</div><div>・HTTP_HEADER</div><div>・ACCEPT_LANGUAGE</div><div>・strpos</div><div><br /></div><div><br /></div><div>ブラウザから送られてくるHTTP_HEADERの値にACCEPT_LANGUAGEという値が入っています。</div><div>中身は、「ja.en」といった具合に、言語の優先度が記述されています。海外であれば、おそらく「en,ja」といった優先度になるかと思います。</div><div>この値を使って海外ユーザーかどうかを判定します。</div><div><br /></div><div>strposという文字列検索関数を使うと、検索ヒットしたindex番号（0からはじまります)が返却され、ヒットしなければfalseが返却されます。</div><div>まとめると下記のようなプログラムになりました。</div><div><br /></div><div><br /></div><div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>&nbsp; &nbsp; &nbsp; &nbsp; private function _isEnglish(){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) return true;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $lang &nbsp; = $_SERVER['HTTP_ACCEPT_LANGUAGE'];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $ja &nbsp; &nbsp; = strpos($lang,'ja');</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $en &nbsp; &nbsp; = strpos($lang,'en');</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if($ja === false || $en === false) return true;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if($en &lt; $ja){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div></div><div><br /></div></blockquote><br /></div><div>注意したいところとして、strposは0が返却されるかもしれないし、falseかもしれないので、if($var)といったおなじみの使い方はNGとなります。===でfalseかどうかを判定してあげましょう。</div><div><br /></div><div>上記プログラムでは、ACCEPT_LANGUAGEが設定されていなかったり、jaでもenでもないというイレギュラーの場合はすべて海外ユーザーとして判定(true)しています。</div><div><br /></div><div>以上。</div>]]>
        
    </content>
</entry>

<entry>
    <title>[admob]admobAPIで日付ソートで収益を取得する</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/12/admobadmobapi.html" />
    <id>tag:tatsuyakun.jp,2011://2.13</id>

    <published>2011-12-23T19:16:23Z</published>
    <updated>2011-12-23T19:20:27Z</updated>

    <summary>admobのAPIを使ってみました。ご丁寧にクライアントライブラリが公式で用意さ...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[admobのAPIを使ってみました。<div><br /></div><div>ご丁寧にクライアントライブラリが公式で用意されており、さらにサンプルPHPも置いてあるので設置はものすごく簡単でした。妻づいた点として、</div><div><br /></div><div>・Googleアカウントでログインしていた場合はどうするの？</div><div>・サンプルで１週間分の収益を取得できたけど日付がバラバラ・・・</div><div><br /></div><div><br /></div><div>Googleアカウントでadmobにログインしている場合は、admobが別のアカウントパスワードを用意してくれます。アカウント設定のページからパスワードを取得できます。</div><div><br /></div><div><br /></div><div>日付がバラバラな件は、paramsに「order_by[date] =&gt; 'desc'」を追加すればOKです。デフォルトだとインプレッションでソートされていたくさいです。</div><div><br /></div><div>以上</div>]]>
        
    </content>
</entry>

<entry>
    <title>[Titanium]iPhoneアプリをリリースしました</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/11/titaniumiphone.html" />
    <id>tag:tatsuyakun.jp,2011://2.12</id>

    <published>2011-11-22T15:50:49Z</published>
    <updated>2011-11-22T15:53:51Z</updated>

    <summary>2011/11/18にiphoneアプリをリリースいたしました。2chまとめっ!...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[2011/11/18にiphoneアプリをリリースいたしました。<div>2chまとめっ!という2chまとめサイトのRSSをマージしてソートしたようなアプリです。</div><div>UI側はTitaniumで開発。プログラムはphpで書いてしまって、json形式でWEB API化しています。</div><div><br /></div><div>よろしければ下記よりダウンロードしていただければと思います。</div><div><br /></div><div><a href="http://itunes.apple.com/us/app//id479588127?ls=1&amp;mt=8">http://itunes.apple.com/us/app//id479588127?ls=1&amp;mt=8<br /></a><div><br /></div></div>]]>
        
    </content>
</entry>

<entry>
    <title>[雑談]技術力と企画力</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/10/post-1.html" />
    <id>tag:tatsuyakun.jp,2011://2.11</id>

    <published>2011-10-04T17:24:01Z</published>
    <updated>2011-10-04T17:54:06Z</updated>

    <summary>最近会社で「テクノロジー」っていう言葉を聞きます。web業界でテクノロジーって言...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[最近会社で「テクノロジー」っていう言葉を聞きます。web業界でテクノロジーって言葉、似合わないなあなんて思っていまして、違和感が残ります。<div><br /></div><div>あと「技術力」って言葉にも違和感を覚えます。web業界で技術力ってなに？まぁ人によっては解釈はわかれるのでしょうが、webの世界ってどうせデータベースと値のやり取りするという基本は変わらないので技術力って言われるとやっぱりよくわからないんですよね。OSとかミドルウェアとか、もっと基盤寄りだと技術的だなと思いますが、アプリ側で技術力っていうとよくわからない。</div><div><br /></div><div><br /></div><div>たぶん、webの世界で言う技術力って「不可能を可能にする」とかでっかい話じゃなくて、「高速で開発できるか」が技術力のポイントな気がしています。１ヶ月で作る人と、３日で作る人だったら後者が技術力が高いんじゃないでしょうか。それとも、不可能を可能にする、ゼロからイチを生み出す人が技術力が高いのでしょうか？linuxとapacheとmysqlとphpとjavascriptとhtmlを使ってゼロからイチを生み出すっていうのは僕にはよくわかりません。もうイチ以上な気がします。web業界はどうせこのへんしか使ってないんだから、今あるソフトウェアで、今ある知識で高速に開発できれば技術力が高いんじゃないでしょうかね。</div><div><br /></div><div><br /></div><div>加えて、企画力っていうのもよくわからない。もっとわからない。いったいどんな能力なのか見当もつかない。普通の人が考えつかないことを思いつくのが企画力？だったら自分の精子を顕微鏡で観察を試みた俺は企画力があるのかしら（高校時代）。</div><div><br /></div><div>企画力もなんかでっかい話じゃなくて、経験とかそんなものに左右されるだけな気がします。経験を多くしたものが企画力がある、でだいたい合ってるんじゃないかなぁ。</div><div><br /></div><div>この場合の「経験」ってITメディアとかそこらへんのニュースサイトから学べるものじゃなくて、自分で動いて肌で感じた経験。</div><div>自分は学生時代から携帯サービスを作っていたのですが、就職してびっくりしたのが携帯のことを知らない人が多かったこと。モバスペとか知っている人いるのかな。あの界隈じゃみんな知ってたけどなぁ。</div><div><br /></div><div>最近も人から教えてもらった雑誌話っていう携帯掲示板サイトに注目している。注目しているっていうか、ひとつ学んだ。俺たちが日々追いかけている情報とは、レイヤーが一層も二層も違う情報が、現場には溢れているんだな、と。</div><div><br /></div><div>携帯をよく使うやつ、経験を持っているやつしかわからない情報とか考えがある。企画力って現場のことをわかってる力、なんじゃないかと。</div><div><br /></div><div><br /></div><div>自分は机の上であれこれと考えるのが嫌いで、とりあえず作る、というスタイルが好きです。それも作り込まないで世に出します。まずは現場を知るためです。</div><div>早く現場を知るためには早く開発する技術力が必要だと思っています。</div><div><br /></div><div>つまりそういうことです。</div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>[Chrome]WebStoreにアプリを公開する方法</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/09/chromewebstore.html" />
    <id>tag:tatsuyakun.jp,2011://2.10</id>

    <published>2011-09-26T16:21:48Z</published>
    <updated>2011-09-26T16:50:13Z</updated>

    <summary>Chromeのウェブストアに2chまとめアプリを公開しました。2ちゃんねるまとめ...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[Chromeのウェブストアに2chまとめアプリを公開しました。<div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><a href="https://chrome.google.com/webstore/detail/cgcgfjfhcebdlokcjaddalibbnblmnbo?hl=ja">2ちゃんねるまとめ</a></div><div>よかったらインストール、レビュー評価をお願いしますm(_ _)m</div><div><br /></div></blockquote>今回はChromeのウェブストアへの公開方法を書きたいと思います。<div><br /></div><div><br /></div><div>１：公開できる「アプリ」とは。</div><div>ウェブストアに公開できるアプリとは、別に規定はありません。</div><div>あなたが持っているサイト、ブログ、あるいはtwitterやTumblrでもいいかもしれません。とにかくあなたがパブリッシュにしているWEBコンテンツがなにかしらあれば、それはウェブストアで公開可能です。</div><div><br /></div><div><br /></div><div>２：アイコンを作る</div><div>アイコンは必要です。ここがアプリっぽいですね。アイコンは128px 128pxで作成すればOKです。枠がないと〜とかそういう規約もありません。</div><div>枠がある場合は98px 98pxで作成し、外枠を透明に〜とかドキュメントには書いてあるのですがあんまり関係ないです。</div><div><br /></div><div><br /></div><div>３：マニフェストファイルを作成する。</div><div>とにかく下記のような書式でmanifest.jsonという名前のファイルを作成すればOKです。</div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">{</blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>








<p class="p2"><span class="s1">&nbsp; </span>"name"<span class="s1">: </span>"XXXX(アプリ名)"<span class="s1">,</span></p>
<p class="p3"><span class="s3">&nbsp; </span><span class="s4">"description"</span><span class="s3">: </span><span class="s4">"XXXX(アプリ説明文)</span><span class="s4">"</span><span class="s3">,</span></p>
<p class="p2"><span class="s1">&nbsp; </span>"version"<span class="s1">: </span>"1.0"<span class="s1">,</span></p>
<p class="p2"><span class="s1">&nbsp; </span>"icons"<span class="s1">: {</span></p>
<p class="p2"><span class="s1">&nbsp; &nbsp; </span>"128"<span class="s1">: </span>"XXXX.png(アイコンのファイル名)"</p>
<p class="p1">&nbsp; },</p>
<p class="p1">&nbsp; <span class="s5">"app"</span>: {</p>
<p class="p1">&nbsp; &nbsp; <span class="s5">"urls"</span>: [</p>
<p class="p2"><span class="s1">&nbsp; &nbsp; &nbsp; </span>"http://XXXXXX(アプリにしたいあなたのWEBサイトなど)"</p>
<p class="p1">&nbsp; &nbsp; ],</p>
<p class="p2"><span class="s1">&nbsp; &nbsp; </span>"launch"<span class="s1">: {</span></p>
<p class="p2"><span class="Apple-style-span"><span class="s1">&nbsp; &nbsp; &nbsp; </span>"web_url"<span class="s1">: </span>"</span>http://XXXXXX(アプリにしたいあなたのWEBサイトなど)<span class="Apple-style-span">"</span></p>
<p class="p1">&nbsp; &nbsp; }</p>
<p class="p1">&nbsp; }</p>
<p class="p1">}</p><p class="p1"><br /></p></div></blockquote>４：ZIPで圧縮<div>アイコンとmanifest.jsonを適当なフォルダに入れ(フォルダ名はなんでもOKです)、ZIPに圧縮します。</div><div>あとはウェブストアの<a href="https://chrome.google.com/webstore/developer/dashboard?hl=ja">デベロッパーダッシュボード</a>にログインし、ZIPファイルをアップし、必要な事項は適当に埋めれば完了です！</div><div><br /></div><div><br /></div><div>5分くらいすると公開されてます。早いですね。</div><div><br /></div><div><br /></div><div>あなたのサイトのアクセスアップにも使えると思います。ぜひChromeアプリとしてウェブストアに公開してみましょう！</div><div><br /></div><div>以上。</div>]]>
        
    </content>
</entry>

<entry>
    <title>[facebook]tackphpで作るfacebookアプリ</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/09/facebooktackphpfacebook.html" />
    <id>tag:tatsuyakun.jp,2011://2.9</id>

    <published>2011-09-24T10:56:30Z</published>
    <updated>2011-09-24T11:32:13Z</updated>

    <summary>こんちは。独自フレームワークtackphpでfacebookアプリをリリースしま...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    <category term="facebook" label="facebook" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[こんちは。独自フレームワークtackphpでfacebookアプリをリリースしました。今回はfacebookアプリの作り方をご紹介いたします。<div>tackphpを使ってでのfacebookアプリの作り方ですが、普通に作る場合でも対応できる内容です。</div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>なお作ったアプリは2chまとめブログのまとめアプリです。</div><div><a href="http://apps.facebook.com/236947159690950/">2chまとめ(on facebook)</a></div><div><br /></div><div>tackphpはこちらからダウンロード＆インストールをお願いします。</div><div><a href="https://github.com/tatsuyau/tackphp">https://github.com/tatsuyau/tackphp</a></div><div><br /></div></blockquote><div><br /></div><div>１：PHP SDK</div><div>まずはPHP SDKをダウンロードしてください。</div><div><a href="https://github.com/facebook/php-sdk">https://github.com/facebook/php-sdk</a></div><div><br /></div><div>必要なファイルは、src/の中身、facebook.php,base_facebook.php,fb_ca_chain_bundle.crtの3ファイルです。</div><div>この3ファイルを、tackphp/sdk/に設置します。</div><div><br /></div><div>２：Facebookのapp_id, secretの取得</div><div>facebookのアプリを作成しましょう。下記ページの「アプリ」タブからアプリを作成してください。</div><div><a href="http://developers.facebook.com/">http://developers.facebook.com/</a></div><div><br /></div><div>APP_IDとSECRETが払い出されますので、</div><div><br /></div><div>tackphp/config.php内に、</div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><br /></div><div>define('FACEBOOK_APPID', 'xxxxxxxxxx');</div><div>define('FACEBOOK_SECRET', 'xxxxxxxxxx');</div></blockquote><br /><div>定数を定義しておきましょう。</div><div><br /></div><div><br /></div><div>３：FacebookControllerの作成</div><div>tackphp/controller/FacebookController.phpを作成します。</div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>&lt;?php</div><div>class FacebookController extends Controller{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; public function __construct(){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent::__construct();</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; require_once '../sdk/facebook.php';</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;facebook = new Facebook(array(</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'appId' =&gt; FACEBOOK_APPID,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'secret' =&gt; FACEBOOK_SECRET,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ));</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //インストールされた場合のコールバック</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(isset($_GET['code'])){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;callback();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*まだインストールしていない場合*/</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(!$this-&gt;facebook-&gt;getUser()){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $par = array(</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'canvas' =&gt; 1,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'fbconnect' =&gt; 0,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'scope' =&gt; 'user_relationships,publish_stream,user_birthday',</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $loginUrl = $this-&gt;facebook-&gt;getLoginUrl($par);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "&lt;script type='text/javascript'&gt;top.location.href = '$loginUrl';&lt;/script&gt;";</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; public function callback(){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $userData = $this-&gt;facebook-&gt;api('/me');</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(!$this-&gt;user-&gt;getUser($userData['id'])){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;user-&gt;setUser($userData['id'],$userData['name'],$userData['gender'],$userData['birthday']);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $params = array(</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'message' =&gt; $userData['name'] . 'さんが' . SITE_TITLE . 'の利用を開始しました。',</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'name' =&gt; SITE_TITLE,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'link' =&gt; 'http://apps.facebook.com/' . FACEBOOK_APPID,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'picture' =&gt; 'xxxxxxxxx.png',</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'description' =&gt; 'texttexttexttesxttexttext',</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;facebook-&gt;api('/me/feed', 'POST', $params);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; header('Location: http://apps.facebook.com/'. FACEBOOK_APPID);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }catch(FacebookApiException $e){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error_log($e-&gt;getResult());</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>}</div></div><div><br /></div></blockquote><br /><div>簡単に説明します。</div><div><br /></div><div>facebook SDKのインスタンス化を行う際に、APPIDとSECRETを渡しています。</div><div><br /></div><div>既にインストール済みの場合、facebook::getUser()メソッドをコールすることでuser_idが取得できます。インストールされていない場合は取得できないため、それをトリガーにしてインストール画面へリダイレクトさせます。リダイレクト先のURLは、facebook::getLoginUrl()をコールすることで取得できます。</div><div><br /></div><div>重要なのがgetLoginUrlに渡す配列引数です。scopeというパラメータには、カンマ区切りで、ユーザーのパーミッションを設定します。ユーザーの友達の情報を取得したい場合は、user_relationships。ウォールへの書き込みはpublish_streamを指定します。ここが漏れていると、facebookSDKのAPIをコールしても思うように情報が引き出せません。気をつけてください。</div><div><br /></div><div>パーミッションのパラメータ一覧はこちらにあります。<a href="http://developers.facebook.com/docs/reference/api/permissions/">http://developers.facebook.com/docs/reference/api/permissions/</a></div><div><br /></div><div><br /></div><div>ユーザーがインストールを実行したら、FacebookController::callback()をコールし、Facebook::apiでユーザープロフィールの取得、ウォールへの書き込みを実行しています。</div><div><br /></div><div>以上。</div>]]>
        
    </content>
</entry>

<entry>
    <title>[余談]なぜ開発するのか</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/09/post.html" />
    <id>tag:tatsuyakun.jp,2011://2.8</id>

    <published>2011-09-13T14:48:07Z</published>
    <updated>2011-09-13T17:48:32Z</updated>

    <summary>チラ裏です。ときおり、エンジニアとしてキャリアを積んでいきたい人間に思われること...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[チラ裏です。<div><br /></div><div>ときおり、エンジニアとしてキャリアを積んでいきたい人間に思われることがありまして、そういや自分って何がしたいんだろうと自制の意味をこめて書きます。</div><div><br /></div><div><b><font class="Apple-style-span" style="font-size: 1.25em; "><br /></font></b></div><div><b><font class="Apple-style-span" style="font-size: 1.25em; ">１：エンジニアとしてキャリアを積みたいわけじゃない</font></b></div><div>積んでもいいかなとは思いますが、強くは興味ありません。</div><div>技術はお金儲けの道具でしかないと思っているので、技術を追い求めること自体に価値を見いだしていないです。</div><div><br /></div><div>いまのところ仕事ではPHPで事足りている気がしています。ゲームもPHPで作っています。ソーシャルゲームね。</div><div>他にお金が儲かる技術があればそっちにのっかります。いわゆる新技術とかには興味ないです。</div><div><br /></div><div><b><font class="Apple-style-span" style="font-size: 1.25em; ">２：なぜ開発するようになったのか</font></b></div><div>ここからものすごい勢いのチラ裏です。</div><div><br /></div><div>自分は割とPC新参だと思ってます。</div><div>5年ほど前、大学生のときに母親がパソコンを買うまでほとんど触ったことがなかったですわ。田舎だったのでネット回線もISDNでした。</div><div>タイピングが出来なかったので母親が友人から借りてきた、ドリームキャストとタイピングゲームでタイピングを覚えました。そのせいか今もタイピングゲームが好きです。</div><div>タイピングが出来るようになるまで、レポートは手書きでした。ワードの使い方がわからない。まぁ今でもわからないですが。</div><div><br /></div><div>大学２回生のころ、バンド活動に明け暮れるようになり、バンドのHPとやらを作ってみようではないかとISDN回線で「HP 作り方」と検索しました。Yahooで。</div><div>「HTML？なにそれこわい」と早速あきらめそうになったのですが、「アフィリエイト」という言葉を目にして俺歓喜。「アフィリエイト？なにそれすごい」とバンドHPそっちのけでアフィリエイトサイトを作り始めた訳です。</div><div><br /></div><div>携帯サイトの方がラクだというので携帯サイトに絞り、<a href="http://m-space.jp/">モバスペ</a>でAタグの広告だらけのサイトを作りました。HTMLはチャットの人に教えてもらいました。</div><div>「アクセスねぇwwもっと人気が出そうなの作ろう」とレンタル掲示板と組み合わせた音楽コミュニティサイトをやっぱり<a href="http://m-space.jp/">モバスペ</a>で作りました。</div><div><br /></div><div>トップ画像をジミヘンにしたりフッターには俺のおすすめアルバム、ヴェルベットアンダーグラウンドとかそこらへんのジャケ写をamazonから取ってきて貼付けて自己満度満載の、最強に重いサイトになりましたが俺の中では大ヒット。まぁ人気なかったです。それからmy spaceとか出てきて俺の勘は外れてなかったぜと誇っていたのは内緒です。</div><div><br /></div><div>アフィリエイトを始めて２サイト作ったわけですがどちらも失敗。友人からは「いいからバイトでもして金稼げよww」と言われながらも諦めず次の手に出ました。茨城の実家から都内の大学に通っていたので時間がありませんでした。バイトせずに自動で稼ぐ仕組みが必要だったのです。</div><div><br /></div><div>「HTMLもうわかった！<a href="http://tagnoheya.com/">タグの部屋</a>があればこわくない！」とタグ生成サイトを駆使し、「やっぱり独自ドメインだよね〜」という謎の発想から<a href="http://lolipop.jp/">ムームードメイン</a>と<a href="http://lolipop.jp/">ロリポップ</a>で独自ドメインのサイトを作り始めました。「index.html？なにそれきもい」とサーバー契約したその日のうちにロリポップ助け合い掲示板に「index.htmlってなにもの？」と今思えば非常に哲学的な質問したことを覚えています。</div><div><br /></div><div>独自ドメインにしたからには俺の本気モードは炸裂です。「Yahooみたいなポータルサイトを作ろう」となかなか稚拙な発想の元に静的HTMLサイトが構築され始めました。FireWorksの無料体験版でがんばってロゴを作りました。Yahooっぽいの。</div><div><br /></div><div>ポータルなのでいろんなサイトがツリー上に並ぶわけですが、そこで３つのカテゴリサイトを作りました。「着うたナビ」「待ち受けナビ」「ブログナビ」。</div><div>ポータルなのでそれぞれサブドメインです、かっこいいですね。</div><div><br /></div><div>それぞれのカテゴリサイトの中身はというと、CAモバイルさんの<a href="http://seaftyy.jp/">シーフティ</a>の検索結果へのリンク集でした。</div><div>当時シーフティは「検索させてシーフティ内の広告クリックで@15円」というアフィリエイトサービスを持っていましたので、それが狙いです。</div><div><br /></div><div>結果はというと、日で100円くらい儲かったんです。「着うたナビ」「待ち受けナビ」のアクセスは1PVとかそこらでしたが、「ブログナビ」のアクセスが多い。公開10日目で200PVほどありました。中身はというと、芸能人の名前リストがあって、クリックするとシーフティの検索結果に飛ぶというものです。アクセス元は<a href="http://rank.awalker.jp/">AWALKER</a>というランキングサイトからの流入がほとんどでした。</div><div><br /></div><div>「芸能人のブログって人気あるのかしら」とリンクを追加したりとだらだら運用していたらAWALKERのサイトランキングで上位に食い込みました。ただのリンク集なのに。</div><div>運営開始後、１ヶ月ほど経ってAWALKERには「芸能人ブログ」系のサイトが連なりました。新規参入の嵐です。レッドオーシャン化が進んでいましたが、他のサイトもやっぱりリンク集なので先攻したブログナビの方がまだ人気がありました。「独自ドメインだから人気なんだな」と当時は思っていました。</div><div><br /></div><div>しかし、脅威となるライバルサイトが現れたのです。確か芸能人ブログ情報局とかいうサイトです。いまあるかは知りません。</div><div>そのサイトは、芸能人のブログを検索できる機能を備えていました。検索窓にキーワードを入れて検索すると結果が出るのです。「すげぇ！Yahooみてぇ！」と感銘を受けた俺は自分のサイトのランキングが抜かれる前に対策を打つことにしました。もちろんこちらも検索機能を付ける、それしかありません。</div><div><br /></div><div>「検索機能・・・いったいどんなHTMLタグを使ってやがるんだ・・・」とひたすら検索して情報を得ました。教えてgooでそれっぽい質問を発見し、検索機能はHTMLではどうにもならないことを知るのでした。</div><div><br /></div><div>どうやらプログラミングというやつをしないといけないらしい。「プログラミングだと・・・それって天才がやるやつだろ・・・」と半ば諦めていましたが、金が欲しいので諦めず調べまくりました。Yahooで。検索機能のことをどうやら「検索エンジン」と呼ぶらしいことがわかったので、「検索エンジン　作り方」と検索しまくりました。Yahooで。</div><div><br /></div><div>yomi searchに出会いました。でもインストール方法がよくわかりませんでした。「インストールってクリックして実行するんじゃないの？意味わかんね」とyomi searchは諦めました。</div><div><br /></div><div>次にXOOPSに出会いました。XOOPSはなんだかよくわからん機能は付いているが検索エンジンも付いているという情報を得て、XOOPSのインストールに挑戦しました。</div><div>インストールは簡単！ファイルをサーバーにアップすればいいということなので、ロリポップにあるアップロードフォームから１つずつアップロードしました。</div><div><br /></div><div>「ふざけんなよ・・・ファイル大杉だろ・・・」確か600ファイルほどあった気がします。全部アップロードしましたが、動きませんでした。たぶんアップロード漏れがあったのでしょう。途方に暮れました。FTPでアップロードというのもどこかで知りましたが、難しそうなのでやめました。XOOPS自体諦めました。</div><div><br /></div><div>一方、ブログナビはまだ人気がありました。リンク集ですが先行者メリットはやはり大きいようです。AWALKERでは芸能人ブログ系ではまだトップランクでした。でも検索エンジンを兼ね備えた芸能人ブログ情報局はすぐ目の前まで来ています。「だめだ・・・喰われる・・・」と諦めかけましたが、やっぱりお金が欲しいので諦めませんでした。アホだったので、絶対大金が手に入ると妄信してたんです。</div><div><br /></div><div><br /></div><div>「PHPだったら簡単にプログラミングできる」そんな情報をYahooで得ました。サンプルをみるとHTMLと大差ない気がします。とりあえず始めてみることにしました。</div><div><br /></div><div>windowsのデスクトップに「test.php」というファイルを作成して、echo "test"と書き保存してブラウザで開いてみましたが、コードがそのまま出ます。意味わかんね。</div><div>もしかしたらロリポップにアップロードすれば動くんじゃねと天才的な直感が降りてきて無事初のプログラミングとなったのでした(Apacheを知るのはこれよりずっと後です。ロリポップだと動く、それぐらいの認識でした)。</div><div><br /></div><div>さっそくプログラミングコードをブログナビに貼付けてみます。「すごい・・・今日の日付が表示された・・・」。誰得ですが、サイトトップに今日の日付を秒数まで表示していました。秒数が自動で更新されないことに若干PHPに不満を覚えましたが、本を買って勉強に励みました（JavaScriptを知るのはこれよりずっと後でした）。</div><div><br /></div><div>「なるほど。データベースというものを使うと検索エンジンが作れるのか」このときまでやっぱり「検索エンジン」と呼んでいました。</div><div>理屈はなんとなくわかったけど、ど素人からすると、データベースの概念自体全く理解できないのです。大学の講義中もずっとPHPの本を読んで理解に励みました。講義をさぼって勉強してました。</div><div><br /></div><div>データベースにSQLクエリを投げて取得するプログラムを書くまでにおそらく２ヶ月はかかった気がします。それだけセンスがなかったのです。</div><div><br /></div><div>さぁいよいよブログナビに検索エンジンを搭載することが出来ました。PHPも上達していたので、こざかしい偽リンクやクリックカウントなどを駆使し、人気はうなぎ上り。全ページにMySQLアカウントを記述して最悪のソースでプログラミング武装した上級サイトにのし上がり、トップページだけで一日2000PVほどになりました。</div><div><br /></div><div>その頃、シーフティの売上もよくないので、<a href="http://yicha.jp/index.do">Yicha</a>の検索報酬に切り替えています。Yichaの検索窓を設置し、検索されるたびに0.5円の報酬があるというものでした。芸能人ブログと相性が良いので、眞鍋かをりの詳細ページに「画像はこちら」「動画はこちら」と検索クエリをパラメータにつけたリンクを設置したところ、一日2000円くらい儲かるようになりました。</div><div><br /></div><div>アクセスアップに専念しましたが、2000PVを超えたあたりでストップ。次の一手を考えていると、<a href="http://www.sitema.jp/">サイトM&amp;A</a>というサイトを売却できるサービスに出会いました。いくらで売れるかしらと自動査定システムに入力したところ50万という金額が表示される。</div><div><br /></div><div>「50万wwわろたww」とさっそく本査定を申し込み。次の日には担当者から電話があり、「いいじゃないっすかー！100万でも売れますっす！」と言われたので俺昇天。とりま考えますと一旦保留に。</div><div><br /></div><div>冷静になってみればこんな糞な俺が作ったサイトがそんな高値で売れるわけない。俺はだまされているんだと違うサイトに査定を依頼しました。「まぁ40万くらいにはなるんじゃないですかねー」とこちらはやや低め。低めといっても学生の俺からしたら大金だし、やや信憑性のある金額だったのでそこに売買の仲介をお願いしました。</div><div><br /></div><div>売却案件に掲載されてから24時間足らずで10通のメールと2件の電話がかかってきた。めんどくさいので、電話かかってきた２件にしぼりました。</div><div><br /></div><div>１人は元大手電機メーカーの社員さんということで起業したばかりでネタがないので人気サイトが欲しいとのことでした。</div><div>もう１人は関西でインターネット広告代理店を経営する社長さんでした。広告掲載媒体に使いたいとのこと。</div><div><br /></div><div>元大手電機メーカーの人はプログラムもわからない人だししつこく電話してきたので嫌いだったのでもう一人のものごしの柔らかい人に売ることにしました。</div><div>でも元大手電機メーカーの人が「６０万まで出す！」といったので、競り合わせてみたところ結局大手電機メーカーの人は100万の値まで言ってきた。</div><div>でもめんどくさい人だったので社長さんの方に60万で売りました。その後、大手電機メーカーの人が僕にキレてきましたがスルーしました。</div><div><br /></div><div>その後、ブログナビは広告代理店の手によってYahooっぽいロゴが取り除かれ、アダルト広告だらけになりました。</div><div>※そして去年、2010年にその社長が別件の着うたサイトで逮捕されて、ブログナビはなくなりましたとさ。</div><div><br /></div><div><br /></div><div>「ちょっと勉強しただけのサイトが60万って、さらに勉強したらどうなるんだよ1000万いくんじゃねぇの？」とIT業界に入って修行を積むことにしました。</div><div><br /></div><div>でも実際、技術とお金はほとんどリンクしないですね。今思えば技術力なんてどうでもよくて、必要だったのは、自信と行動力だったと思います。技術力とかいっても結局PHPだしね。</div><div><br /></div><div><br /></div><div><b><font class="Apple-style-span" style="font-size: 1.25em; ">３：なので金儲けがしたいです</font></b></div><div><font class="Apple-style-span" style="font-size: 1em; ">愛する書籍は金持ち父さん。金持ち父さんの言う金儲けの自動化、ロバートキヨサキは不動産だろうけど、俺からしたらプログラムが、ネットが、自動化だった。</font></div><div><font class="Apple-style-span" style="font-size: 1em; ">プログラミングするきっかけって人それぞれだと思うけど、俺のきっかけって本当に金儲けでした。金儲けをするために俺にはPHPが必要なんです。</font></div><div><br /></div><div>最近は寝ているとき以外、プログラムを書いています。サイトを量産させる体制を整えているといったところです。俺が開発したフレームワークtackphpもサイトを量産するために自分が必要な要素をフレームワーク化したに過ぎません。</div><div><br /></div><div>会社に入ってから一年近い非システム研修をさせられ、それから企画に配属され、全くPHPを書かなくなりました。自分がなぜIT業界に来たのか、少し忘れかけていました。</div><div>開発を通して、お金儲けがしたかったのです。自分で作って自分で稼ぎたかったのです。</div><div><br /></div><div><br /></div><div><font class="Apple-style-span" style="font-size: 1.25em; "><b>４：なぜ開発するのか</b></font></div><div>俺がサイト売却でお金を手にしたとき、嬉しくてたまらず、ヤフーチャットにログインして知らない奴らに報告しました。見ず知らずの人に。</div><div><br /></div><div>チャットには二人いました。</div><div><br /></div><div>一人はプログラマ。専門学校を出て、SIerのプログラマになったとのこと。彼はプログラミングでお金が稼げることを知らなかったようです。俺の話を聞いて驚いていました。</div><div>彼は雇われることでしかお金を稼げないと思っていました。作る能力を持っているというのに。</div><div><br /></div><div>チャットにはもう一人、銀行マンがいました。銀行マンは言いました。「60万wwww少なすぎwww俺は１日３億の金を動かしてんだよwww」と言いました。彼は自分が何かすごいことをしているように言っていますが、俺にはわかりませんでした。彼は何も作っていない。</div><div><br /></div><div>それは学生の頃でしたが、サラリーマンとはなんて嫌なやつだと、なんて勘違いやろうが多いのだろうと、サラリーマンに嫌悪感を抱くようになりました。今でもそれはかわっていません。自分で作って自分で稼ぐやつが偉いんだと信じています。</div><div><br /></div><div><br /></div><div>雇われるだけのプログラマじゃなくて、金を動かすだけのサラリーマンじゃなくて、「作って売る」という基本的な営みがしたい。</div><div><br /></div><div><br /></div><div>だから今も開発し続けています。</div>]]>
        
    </content>
</entry>

<entry>
    <title>tackphpチュートリアル</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/09/tackphp.html" />
    <id>tag:tatsuyakun.jp,2011://2.7</id>

    <published>2011-09-08T16:37:38Z</published>
    <updated>2011-09-08T17:22:17Z</updated>

    <summary>自作PHPフレームワーク「tackphp」のチュートリアルです。tackphpは...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[自作PHPフレームワーク「tackphp」のチュートリアルです。<div><br /></div><div>tackphpはgithubに公開されています。<a href="https://github.com/tatsuyau/tackphp">https://github.com/tatsuyau/tackphp</a></div><div><br /></div><div><br /></div><div>今回はチュートリアルとして、Bookmarkアプリケーションを作りたいと思います。</div><div><br /></div><div><br /></div><div>１：データベースの用意</div><div>今回作成するBookmarkアプリのテーブルをMySQLに作成しましょう。</div><div>カラムは、id, title, url, created, の4カラムでOKです。</div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div><div>CREATE TABLE IF NOT EXISTS `bookmark` (</div><div>&nbsp; `id` int(11) NOT NULL AUTO_INCREMENT,</div><div>&nbsp; `title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,</div><div>&nbsp; `url` varchar(200) COLLATE utf8_unicode_ci NOT NULL,</div><div>&nbsp; `created` datetime NOT NULL,</div><div>&nbsp; PRIMARY KEY (`id`),</div><div>&nbsp; KEY `id` (`id`)</div><div>) ENGINE=InnoDB &nbsp;DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;</div></div></div><div><br /></div></blockquote><div><br /></div><div>２：データベースに接続するアカウント</div><div>tackphp/database.phpを開いてください。接続アカウントを記述してください。</div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>class database{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; public $schema = array(</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'default' =&gt; array(</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'host' =&gt; 'localhost',</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'user' =&gt; 'user',</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'password' =&gt; 'user',</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'schema' =&gt; 'databaseName',</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'encoding' =&gt; 'utf8'</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ),</div></div><div><br /></div></blockquote><br /><div>３：controllerの作成</div><div>tackphp/controller内にBookmarkController.phpを作成します。</div><br /><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>&lt;?php</div><div>class BookmarkController extends Controller{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; public function __construct(){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;bookmark = new Bookmark();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; public function index(){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $title = 'my bookmark list';</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $datas = $this-&gt;bookmark-&gt;getBookmark();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; require_once($this-&gt;layout);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; public function add(){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;bookmark-&gt;setBookmark($this-&gt;_request);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; header('Location: ./bookmark');</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>}</div></div><div><br /></div><div><br /></div></blockquote>４：modelの作成<div>tackphp/model内にBookmark.phpを作成します。</div><br /><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div><div>&lt;?php</div><div>class Bookmark extends Model{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; public function __construct(){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;db = new database();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; public function getBookmark(){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $sql = 'SELECT * FROM bookmark ';</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;db-&gt;execQuery($sql);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $row = $this-&gt;db-&gt;fetchAll();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $row;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; public function setBookmark($req){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $sql = 'INSERT INTO bookmark (title, url, created) ';</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $sql .= 'VALUES (:title, :url, :created) ';</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hashParam = array(</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'title' =&gt; $req['title'],</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'url' =&gt; $req['url'],</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'created' =&gt; date('Y-m-d H:i:s')</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );</div><div><br /></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;db-&gt;execQuery($sql,$hashParam);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>}</div></div></div><div><br /></div><div><br /></div></blockquote>５：viewの作成<div>tackphp/view内にbookmark_index.tplを作成します。</div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>&lt;form action="bookmark_add" method="post"&gt;</div><div>title:&lt;input type="text" name="title"&gt;&lt;br /&gt;</div><div>url:&lt;input type="text" name="url"&gt;&lt;br /&gt;</div><div>&lt;input type="submit" value="add"&gt;</div><div>&lt;/form&gt;</div><div><br /></div><div>&lt;h2&gt;&lt;?php echo $title; ?&gt;&lt;/h2&gt;</div><div>&lt;?php if($datas): ?&gt;</div><div>&lt;ul&gt;</div><div><br /></div><div>&lt;?php foreach($datas as $data): ?&gt;</div><div>&lt;li&gt;&lt;a href="&lt;?php echo $data['url']; ?&gt;"&gt;&lt;?php echo $data['title']; ?&gt;&lt;/a&gt;&lt;/li&gt;</div><div>&lt;?php endforeach; ?&gt;</div><div><br /></div><div>&lt;/ul&gt;</div><div>&lt;?php endif; ?&gt;</div></div><div><br /></div></blockquote><div><br /></div>６：サイトにアクセスします<div>http://yourdomain/tackphp/bookmark　にアクセスしてください。Bookmarkアプリケーションが作成できているでしょうか？</div><div><br /></div><div><br /></div><div>７：設定を変更します</div><div>http://yourdomain/tackphp　で"bookmark"を省いたURLでアクセスできるようにします。</div><div>tackphp/config.phpを開いてください。</div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>/*デフォルトのcontrollerとaction*/</div><div>define('DEFAULT_CONTROLLER','bookmark');</div><div>define('DEFAULT_ACTION','index');</div></div><div><br /></div></blockquote>上記に書き換えます。<div>http://yourdomain/tackphpでbookmarkアプリケーションにアクセスできれば成功です。</div><div><br /></div><div><br /></div><div>今回のチュートリアルの解説は後ほど。疲れたので。。。</div>]]>
        
    </content>
</entry>

<entry>
    <title>自作PHPフレームワーク「tackphp」を公開しました</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/09/phptackphp.html" />
    <id>tag:tatsuyakun.jp,2011://2.6</id>

    <published>2011-09-08T16:16:03Z</published>
    <updated>2011-09-08T16:34:54Z</updated>

    <summary>自作のPHPフレームワークを公開しました。tackphpという名前を友人につけて...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[<div>自作のPHPフレームワークを公開しました。tackphpという名前を友人につけてもらいました。</div><div><br /></div><div><a href="https://github.com/tatsuyau/tackphp">https://github.com/tatsuyau/tackphp</a></div><div><br /></div><div><br /></div>コンセプトは、「ベタ書きフレームワーク」。<div>非常にわずかな規約に従うことで、WEBアプリケーションの開発がラクになります。<div><br /></div><div>なんでフレームワークを作ろうなんて思ったのかと質問されるのですが、</div><div>単純に有名どころのフレームワークが自分の肌に合わなかったからです。</div><div><br /></div><div>CakePHPは便利ですが、複雑な規約のせいで一気に使いにくいものになっている気がします。<div>フレームワークを使いたいのって、結局、MVCアーキテクチャにしたいだけの場合が多いと思っているのですが、</div></div></div><div>それだけだとCakePHPは重すぎる内容だとは思いませんか？</div><div><br /></div><div>tackphpは、CakePHPの良いところだけを残して、邪魔なところをごっそりと抜き取ったようなフレームワークです。</div><div><br /></div><div><br /></div><div>CakePHPで良いと思ったところ</div><div><ul><li>MVCであること。ファイル管理がしやすいですよね。</li><li>URLからコントローラーとアクションを実行できること。サイト構成がわかりやすいですよね。</li><li>レイアウト機能があること。VIEWテンプレートにいちいち、ヘッダーとフッターを読み込みさせる記述をするのはだるいですよね。</li></ul><div><br /></div></div><div>CakePHPで邪魔だと思ったところ</div><div><ul><li>通常のPHPが書けないような環境</li><li>やたら多い関数</li><li>融通が利かない複雑な規約</li><li>いちいち変数をassign</li><li>何よりもエンジンがブラックボックス過ぎてデバッグに困る</li></ul><div><br /></div></div><div>tackphpはほぼベタ書きが通用します。そしてエンジンは非常に計量であり、200行にも満たないシンプルでパワフルなフレームワークです。</div><div><br /></div><div>次回、tackphpのチュートリアルを掲載しようと思います。</div>]]>
        
    </content>
</entry>

<entry>
    <title>[PHP]美人時計の画像を24時間分取得し保存する</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/08/php24.html" />
    <id>tag:tatsuyakun.jp,2011://2.5</id>

    <published>2011-08-23T17:05:52Z</published>
    <updated>2011-08-23T17:36:39Z</updated>

    <summary>何を思ったのか美人時計24時間分取得するスクリプトを書きましたのでご紹介いたしま...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    <category term="http_client" label="HTTP_Client" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[何を思ったのか美人時計24時間分取得するスクリプトを書きましたのでご紹介いたします。<div><div>美人時計を知らない方はいないと思いますが、リンクを貼っておきます。<a href="http://www.bijint.com/jp/">http://www.bijint.com/jp/</a></div><div><br /></div><div>美人時計の画像ファイルのURLは単純でして、http://www.bijint.com/jp/tokei_images/0000.jpgといったURLになっています。</div><div>12:00であれば1200.jpg、05:30であれば0530.jpgといった風にわかりやすい形式です。</div><div><br /></div><div>for文ループで回してfile_get_contentsすれば楽勝じゃんと思ったのですが、簡単にはいかず、</div><div>どうやら美人時計のサーバーはリファラを見ていて、リファラがなかったり不正であると表示しない仕様のようです。</div><div><br /></div><div>ではリファラをセットして取得するにはどうしたらいいのでしょうか？それが今回の記事の主旨でもあります。</div><div><br /></div><div>=======</div><div>■キーワード</div><div>HTTPクライアント</div><div>=======</div><div><br /></div><div>リファラをセットしてファイルを取得するにはHTTPクライアントライブラリを使うのが手っ取り早いです。</div><div>今回私はSnoopyというPHPのHTTPクライアントライブラリを使いました。使い方も非常に簡単です。</div><div><br /></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>Snoopyのダウンロード</div></div><div><a href="http://sourceforge.net/projects/snoopy/">http://sourceforge.net/projects/snoopy/</a></div><div><br /></div></blockquote>zipを解凍したら適当なカ所に保存してください。<div>私の場合、解凍して出来たフォルダは「Snoopy」というフォルダ名に変えています。</div><div><div><br /></div></div><div>===============================</div>&lt;?php<br />//Snoopyライブラリを読んでいます。<br />require_once 'Snoopy/Snoopy.class.php';<br /><br />class Bijin{<br />&nbsp; &nbsp; &nbsp; &nbsp; //美人時計のトップURL、画像までのURLを格納しています。<br />&nbsp; &nbsp; &nbsp; &nbsp; public $bijinUrl = 'http://www.bijint.com/jp/';<br />&nbsp; &nbsp; &nbsp; &nbsp; public $baseUrl = 'http://www.bijint.com/jp/tokei_images/';<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; //snoopyインスタンス用のメンバ変数です。<br />&nbsp; &nbsp; &nbsp; &nbsp; public $snoopy;<br />&nbsp; &nbsp; &nbsp; &nbsp; //美人時計画像を保存するディレクトリまでのPATHです。<br />&nbsp; &nbsp; &nbsp; &nbsp; public $imgPath = './image/';<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; //コンストラクタでsnoopyクラスをインスタンスしています。<br />&nbsp; &nbsp; &nbsp; &nbsp; function __construct(){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;snoopy = new Snoopy();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //リファラをセットしています。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;snoopy-&gt;referer = $this-&gt;bijinUrl;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; //美人時計の画像を取得するロジックを書いたメソッドです。<br />&nbsp; &nbsp; &nbsp; &nbsp; function getImage($time){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $url = $this-&gt;baseUrl . $time . '.jpg';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;snoopy-&gt;fetch($url);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;snoopy-&gt;results;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; //画像を取得し、保存のロジックを書いたメソッドです。<br />&nbsp; &nbsp; &nbsp; &nbsp; function setImage($time){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $f = fopen($this-&gt;imgPath . $time . '.jpg','c');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $img = $this-&gt;getImage($time);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(fwrite($f,$img)){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; //画像取得、保存の実行メソッドです。str_padを使っているのは0詰めのためです。<br />&nbsp; &nbsp; &nbsp; &nbsp; function execute(){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for ($i = 0; &nbsp;$i &lt;=23; $i++ ){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hour = str_pad($i, 2, "0", STR_PAD_LEFT);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for ($j = 0; &nbsp;$j &lt;=59; $j++ ){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $min = str_pad($j, 2, "0", STR_PAD_LEFT);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $time = $hour . $min;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $flag = $this-&gt;setImage($time);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(!$flag){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "error";<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo $time . "\n";<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //美人時計のサーバーに負荷を与えないよう1秒間のsleepを入れています。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(1);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; //画像出力実行メソッドです。<br />&nbsp; &nbsp; &nbsp; &nbsp; function view(){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for ($i = 0; &nbsp;$i &lt;=23; $i++ ){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hour = str_pad($i, 2, "0", STR_PAD_LEFT);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for ($j = 0; &nbsp;$j &lt;=59; $j++ ){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $min = str_pad($j, 2, "0", STR_PAD_LEFT);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $time = $hour . $min;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo '&lt;img src ="' . $this-&gt;imgPath . $time . '.jpg" /&gt;&lt;br /&gt;';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />} &nbsp;&nbsp;<br /><br />$bijin = new Bijin();<br />&nbsp; &nbsp;&nbsp;<br />//日人時計の取得・保存<br />$bijin-&gt;execute();<br />&nbsp; &nbsp;&nbsp;<br />//美人時計画像の出力<br />$bijin-&gt;view();<br /><div>?&gt;</div><div>===============================</div><div><br /></div><div>このスクリプトを実行すると、execute()により、./image/ディレクトリに24時間分の画像、0000.jpgというファイル名形式で保存されます。</div></div><div>多くの数のリクエストを美人時計のサーバーに投げるので適度にsleepしてあげてください。</div><div><br /></div><div>以上、ホリデープログラマから職業としてプログラマとなった僕でした。</div>]]>
        
    </content>
</entry>

<entry>
    <title>[SQL]UPDATEかもしれないしINSERTかもしれない場合のREPLACE</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/08/sqlupdateinsertreplace.html" />
    <id>tag:tatsuyakun.jp,2011://2.4</id>

    <published>2011-08-17T15:51:28Z</published>
    <updated>2011-08-17T16:08:37Z</updated>

    <summary>個人的に作っているサイトで、RSSクローラーを巡回させて手に入れた記事情報をDB...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[個人的に作っているサイトで、RSSクローラーを巡回させて手に入れた記事情報をDBに保存しておき、各記事のはてなブックマーク数を１時間置きに取得してhatebu_tableに追加していくというバッチを書きました。<div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>===============================================================</div><div>本題からそれますがはてなブックマーク数を取得する方法は下記に。</div><div><br /></div><div>http://api.b.st-hatena.com/entry.count?url=http%3A%2F%2Fwww.hatena.ne.jp%2F</div><div><br /></div><div>といった風にurlというパラメータにURLを付加させてGETでリクエストを送ると、</div><div>平文ではてなブックマーク数が取得できます。</div><div>詳細ドキュメント　➡　http://developer.hatena.ne.jp/ja/documents/bookmark/apis/getcount</div><div>===============================================================</div></blockquote><div><br /></div><div><br /></div><div>過去に取得したはてなブックマーク数にUPDATEをかけてあげて、過去にはてなブックマーク数を取得したことにない記事に対しては新規にINSERTをかけてあげます。</div><div>UPDATEなのかINSERTなのか、どこかでチェックして分岐するのめんどくさいなーって思っていたのですが、REPLACE INTOというSQL構文を発見しました。</div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>REPLACE INTO hatebu_table (article_id,hatebu_count) VALUES(1,100);</div></blockquote><br /><div>上記のSQLを投げた場合、article_id=1のレコードがなかった場合は新規にはてぶ数100とINSERTし、既にあった場合ははてぶ数100とUPDATEします。</div><div><br /></div><div>SQLって知らないし、調べないだけで便利な構文が意外とあったりするんですね。以上、覚書でした。</div>]]>
        
    </content>
</entry>

<entry>
    <title>[SQL]GROUPでCOUNTした値を元にGROUPしてCOUNTする方法</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/06/sqlgroupcountcount.html" />
    <id>tag:tatsuyakun.jp,2011://2.3</id>

    <published>2011-06-28T15:43:07Z</published>
    <updated>2011-06-28T16:09:26Z</updated>

    <summary>タイトルだけみるとなんのこっちゃですね。SELECT COUNT(user_id...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    <category term="mysql" label="MySQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[タイトルだけみるとなんのこっちゃですね。<div><br /><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><br /></blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">SELECT COUNT(user_id) FROM play_log GROUP BY user_id</blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><br /></blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><br /></blockquote>といったGROUPで別けてCOUNTする方法はよく知られているかと思いますが、ここでとってきたCOUNTの値を元にGROUPで別けてCOUNTする仕事が出てきたのでちょっと悩みました。<div><br /></div><div>私の例では、一回ゲームをするたびINSERTされるログから、X回ゲームをプレイするユーザーがY人いる、といった分布を作るものでした。</div><div><br /></div><div>■■キーワード■■</div><div>・副問い合わせ</div><div><br /></div><div><br /></div><div>冒頭と重複しますが、</div><div><br /></div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>SELECT COUNT(user_id) FROM play_log GROUP BY user_id</div><div><br /></div></blockquote><div><br /></div>これでユーザーごとにグルーピングしてゲームのプレイ回数を、ユーザー数分だけ取得することができます。ここで得られた結果レコードをテーブルとして扱ってしまい、副問い合わせとしてSQL文を組み立てます。<div>イメージとしては下記のような感じです。<br /><div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>SELECT X,COUNT(X) AS Y FROM [結果レコード] GROUP BY X</div><div><br /></div></blockquote><div><br /></div>上記の[結果レコード]の中身を副問い合わせにすればOKです。<div><br /></div><div><br /><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">SELECT X,COUNT(X) AS Y FROM (</blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>SELECT COUNT(user_id) AS X FROM play_log GROUP BY user_id</div></blockquote>) AS X_TABLE</blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">GROUP BY X</blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><br /></blockquote><div><br /></div>ヴィジュアル的に説明できていないのでわかりづらいかもしれませんが、上記SQLで、X回ゲームしたユーザーがY人という分布表の結果レコードが得られます。</div><div>以上、今日の覚書でした。</div></div></div></div>]]>
        
    </content>
</entry>

<entry>
    <title>[SQL]条件を指定してCOUNTする方法</title>
    <link rel="alternate" type="text/html" href="http://tatsuyakun.jp/2011/06/sqlcount.html" />
    <id>tag:tatsuyakun.jp,2011://2.1</id>

    <published>2011-06-13T13:54:17Z</published>
    <updated>2011-06-13T14:05:13Z</updated>

    <summary>エクセルでいうCOUNTIF()みたいな関数ってSQLでないの？と探しておりまし...</summary>
    <author>
        <name>tatsuya</name>
        
    </author>
    
    <category term="mysql" label="MySQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://tatsuyakun.jp/">
        <![CDATA[エクセルでいうCOUNTIF()みたいな関数ってSQLでないの？と探しておりましたらありました。<div><br /></div><div>■■キーワード■■</div><div>・SUM</div><div>・CASE</div><div><br /></div><div><br /></div><div>COUNTしたい訳なんですがSUM()をつかます。SUMの中の条件指定としてCASEを使います。</div><div><br /></div><div><br /></div><div>例：アクセスログの中で男性ユーザーのログインだけをカウント</div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>SELECT SUM(CASE WHEN sex = 'male' THEN 1 ELSE 0 END) from access_log</div></blockquote><div><br /></div><div><br /></div><div>sexカラムの値が男性のときは1を、それ以外は0として判定し(CASE文）、</div><div>それぞれをSUM()で合計することで条件を指定して、エクセルのCOUNTIF()と同じ結果を得られます。</div><div><br /></div><div>以上、覚書程度にブログを更新していこうと思いますのでよろしくお願いします。</div>]]>
        
    </content>
</entry>

</feed>

