2011年9月アーカイブ

[Chrome]WebStoreにアプリを公開する方法

Chromeのウェブストアに2chまとめアプリを公開しました。

よかったらインストール、レビュー評価をお願いしますm(_ _)m

今回はChromeのウェブストアへの公開方法を書きたいと思います。


1:公開できる「アプリ」とは。
ウェブストアに公開できるアプリとは、別に規定はありません。
あなたが持っているサイト、ブログ、あるいはtwitterやTumblrでもいいかもしれません。とにかくあなたがパブリッシュにしているWEBコンテンツがなにかしらあれば、それはウェブストアで公開可能です。


2:アイコンを作る
アイコンは必要です。ここがアプリっぽいですね。アイコンは128px 128pxで作成すればOKです。枠がないと〜とかそういう規約もありません。
枠がある場合は98px 98pxで作成し、外枠を透明に〜とかドキュメントには書いてあるのですがあんまり関係ないです。


3:マニフェストファイルを作成する。
とにかく下記のような書式でmanifest.jsonという名前のファイルを作成すればOKです。
{

  "name": "XXXX(アプリ名)",

  "description": "XXXX(アプリ説明文)",

  "version": "1.0",

  "icons": {

    "128": "XXXX.png(アイコンのファイル名)"

  },

  "app": {

    "urls": [

      "http://XXXXXX(アプリにしたいあなたのWEBサイトなど)"

    ],

    "launch": {

      "web_url": "http://XXXXXX(アプリにしたいあなたのWEBサイトなど)"

    }

  }

}


4:ZIPで圧縮
アイコンとmanifest.jsonを適当なフォルダに入れ(フォルダ名はなんでもOKです)、ZIPに圧縮します。
あとはウェブストアのデベロッパーダッシュボードにログインし、ZIPファイルをアップし、必要な事項は適当に埋めれば完了です!


5分くらいすると公開されてます。早いですね。


あなたのサイトのアクセスアップにも使えると思います。ぜひChromeアプリとしてウェブストアに公開してみましょう!

以上。

[facebook]tackphpで作るfacebookアプリ

こんちは。独自フレームワークtackphpでfacebookアプリをリリースしました。今回はfacebookアプリの作り方をご紹介いたします。
tackphpを使ってでのfacebookアプリの作り方ですが、普通に作る場合でも対応できる内容です。

なお作ったアプリは2chまとめブログのまとめアプリです。

tackphpはこちらからダウンロード&インストールをお願いします。


1:PHP SDK
まずはPHP SDKをダウンロードしてください。

必要なファイルは、src/の中身、facebook.php,base_facebook.php,fb_ca_chain_bundle.crtの3ファイルです。
この3ファイルを、tackphp/sdk/に設置します。

2:Facebookのapp_id, secretの取得
facebookのアプリを作成しましょう。下記ページの「アプリ」タブからアプリを作成してください。

APP_IDとSECRETが払い出されますので、

tackphp/config.php内に、

define('FACEBOOK_APPID', 'xxxxxxxxxx');
define('FACEBOOK_SECRET', 'xxxxxxxxxx');

定数を定義しておきましょう。


3:FacebookControllerの作成
tackphp/controller/FacebookController.phpを作成します。

<?php
class FacebookController extends Controller{
        public function __construct(){
                parent::__construct();

                require_once '../sdk/facebook.php';
                $this->facebook = new Facebook(array(
                        'appId' => FACEBOOK_APPID,
                        'secret' => FACEBOOK_SECRET,
                        ));

                //インストールされた場合のコールバック
                if(isset($_GET['code'])){
                        $this->callback();
                }

                /*まだインストールしていない場合*/
                if(!$this->facebook->getUser()){
                        $par = array(
                                'canvas' => 1,
                                'fbconnect' => 0,
                                'scope' => 'user_relationships,publish_stream,user_birthday',
                                );
                        $loginUrl = $this->facebook->getLoginUrl($par);
                        echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
                        exit();
                }
        }

        public function callback(){
                try{
                        $userData = $this->facebook->api('/me');
                        if(!$this->user->getUser($userData['id'])){
                                $this->user->setUser($userData['id'],$userData['name'],$userData['gender'],$userData['birthday']);
                                $params = array(
                                        'message' => $userData['name'] . 'さんが' . SITE_TITLE . 'の利用を開始しました。',
                                        'name' => SITE_TITLE,
                                        'link' => 'http://apps.facebook.com/' . FACEBOOK_APPID,
                                        'picture' => 'xxxxxxxxx.png',
                                        'description' => 'texttexttexttesxttexttext',
                                        );
                                $this->facebook->api('/me/feed', 'POST', $params);
                                header('Location: http://apps.facebook.com/'. FACEBOOK_APPID);
                                exit();
                        }
                }catch(FacebookApiException $e){
                        error_log($e->getResult());
                }
        }
}


簡単に説明します。

facebook SDKのインスタンス化を行う際に、APPIDとSECRETを渡しています。

既にインストール済みの場合、facebook::getUser()メソッドをコールすることでuser_idが取得できます。インストールされていない場合は取得できないため、それをトリガーにしてインストール画面へリダイレクトさせます。リダイレクト先のURLは、facebook::getLoginUrl()をコールすることで取得できます。

重要なのがgetLoginUrlに渡す配列引数です。scopeというパラメータには、カンマ区切りで、ユーザーのパーミッションを設定します。ユーザーの友達の情報を取得したい場合は、user_relationships。ウォールへの書き込みはpublish_streamを指定します。ここが漏れていると、facebookSDKのAPIをコールしても思うように情報が引き出せません。気をつけてください。

パーミッションのパラメータ一覧はこちらにあります。http://developers.facebook.com/docs/reference/api/permissions/


ユーザーがインストールを実行したら、FacebookController::callback()をコールし、Facebook::apiでユーザープロフィールの取得、ウォールへの書き込みを実行しています。

以上。

[余談]なぜ開発するのか

チラ裏です。

ときおり、エンジニアとしてキャリアを積んでいきたい人間に思われることがありまして、そういや自分って何がしたいんだろうと自制の意味をこめて書きます。


1:エンジニアとしてキャリアを積みたいわけじゃない
積んでもいいかなとは思いますが、強くは興味ありません。
技術はお金儲けの道具でしかないと思っているので、技術を追い求めること自体に価値を見いだしていないです。

いまのところ仕事ではPHPで事足りている気がしています。ゲームもPHPで作っています。ソーシャルゲームね。
他にお金が儲かる技術があればそっちにのっかります。いわゆる新技術とかには興味ないです。

2:なぜ開発するようになったのか
ここからものすごい勢いのチラ裏です。

自分は割とPC新参だと思ってます。
5年ほど前、大学生のときに母親がパソコンを買うまでほとんど触ったことがなかったですわ。田舎だったのでネット回線もISDNでした。
タイピングが出来なかったので母親が友人から借りてきた、ドリームキャストとタイピングゲームでタイピングを覚えました。そのせいか今もタイピングゲームが好きです。
タイピングが出来るようになるまで、レポートは手書きでした。ワードの使い方がわからない。まぁ今でもわからないですが。

大学2回生のころ、バンド活動に明け暮れるようになり、バンドのHPとやらを作ってみようではないかとISDN回線で「HP 作り方」と検索しました。Yahooで。
「HTML?なにそれこわい」と早速あきらめそうになったのですが、「アフィリエイト」という言葉を目にして俺歓喜。「アフィリエイト?なにそれすごい」とバンドHPそっちのけでアフィリエイトサイトを作り始めた訳です。

携帯サイトの方がラクだというので携帯サイトに絞り、モバスペでAタグの広告だらけのサイトを作りました。HTMLはチャットの人に教えてもらいました。
「アクセスねぇwwもっと人気が出そうなの作ろう」とレンタル掲示板と組み合わせた音楽コミュニティサイトをやっぱりモバスペで作りました。

トップ画像をジミヘンにしたりフッターには俺のおすすめアルバム、ヴェルベットアンダーグラウンドとかそこらへんのジャケ写をamazonから取ってきて貼付けて自己満度満載の、最強に重いサイトになりましたが俺の中では大ヒット。まぁ人気なかったです。それからmy spaceとか出てきて俺の勘は外れてなかったぜと誇っていたのは内緒です。

アフィリエイトを始めて2サイト作ったわけですがどちらも失敗。友人からは「いいからバイトでもして金稼げよww」と言われながらも諦めず次の手に出ました。茨城の実家から都内の大学に通っていたので時間がありませんでした。バイトせずに自動で稼ぐ仕組みが必要だったのです。

「HTMLもうわかった!タグの部屋があればこわくない!」とタグ生成サイトを駆使し、「やっぱり独自ドメインだよね〜」という謎の発想からムームードメインロリポップで独自ドメインのサイトを作り始めました。「index.html?なにそれきもい」とサーバー契約したその日のうちにロリポップ助け合い掲示板に「index.htmlってなにもの?」と今思えば非常に哲学的な質問したことを覚えています。

独自ドメインにしたからには俺の本気モードは炸裂です。「Yahooみたいなポータルサイトを作ろう」となかなか稚拙な発想の元に静的HTMLサイトが構築され始めました。FireWorksの無料体験版でがんばってロゴを作りました。Yahooっぽいの。

ポータルなのでいろんなサイトがツリー上に並ぶわけですが、そこで3つのカテゴリサイトを作りました。「着うたナビ」「待ち受けナビ」「ブログナビ」。
ポータルなのでそれぞれサブドメインです、かっこいいですね。

それぞれのカテゴリサイトの中身はというと、CAモバイルさんのシーフティの検索結果へのリンク集でした。
当時シーフティは「検索させてシーフティ内の広告クリックで@15円」というアフィリエイトサービスを持っていましたので、それが狙いです。

結果はというと、日で100円くらい儲かったんです。「着うたナビ」「待ち受けナビ」のアクセスは1PVとかそこらでしたが、「ブログナビ」のアクセスが多い。公開10日目で200PVほどありました。中身はというと、芸能人の名前リストがあって、クリックするとシーフティの検索結果に飛ぶというものです。アクセス元はAWALKERというランキングサイトからの流入がほとんどでした。

「芸能人のブログって人気あるのかしら」とリンクを追加したりとだらだら運用していたらAWALKERのサイトランキングで上位に食い込みました。ただのリンク集なのに。
運営開始後、1ヶ月ほど経ってAWALKERには「芸能人ブログ」系のサイトが連なりました。新規参入の嵐です。レッドオーシャン化が進んでいましたが、他のサイトもやっぱりリンク集なので先攻したブログナビの方がまだ人気がありました。「独自ドメインだから人気なんだな」と当時は思っていました。

しかし、脅威となるライバルサイトが現れたのです。確か芸能人ブログ情報局とかいうサイトです。いまあるかは知りません。
そのサイトは、芸能人のブログを検索できる機能を備えていました。検索窓にキーワードを入れて検索すると結果が出るのです。「すげぇ!Yahooみてぇ!」と感銘を受けた俺は自分のサイトのランキングが抜かれる前に対策を打つことにしました。もちろんこちらも検索機能を付ける、それしかありません。

「検索機能・・・いったいどんなHTMLタグを使ってやがるんだ・・・」とひたすら検索して情報を得ました。教えてgooでそれっぽい質問を発見し、検索機能はHTMLではどうにもならないことを知るのでした。

どうやらプログラミングというやつをしないといけないらしい。「プログラミングだと・・・それって天才がやるやつだろ・・・」と半ば諦めていましたが、金が欲しいので諦めず調べまくりました。Yahooで。検索機能のことをどうやら「検索エンジン」と呼ぶらしいことがわかったので、「検索エンジン 作り方」と検索しまくりました。Yahooで。

yomi searchに出会いました。でもインストール方法がよくわかりませんでした。「インストールってクリックして実行するんじゃないの?意味わかんね」とyomi searchは諦めました。

次にXOOPSに出会いました。XOOPSはなんだかよくわからん機能は付いているが検索エンジンも付いているという情報を得て、XOOPSのインストールに挑戦しました。
インストールは簡単!ファイルをサーバーにアップすればいいということなので、ロリポップにあるアップロードフォームから1つずつアップロードしました。

「ふざけんなよ・・・ファイル大杉だろ・・・」確か600ファイルほどあった気がします。全部アップロードしましたが、動きませんでした。たぶんアップロード漏れがあったのでしょう。途方に暮れました。FTPでアップロードというのもどこかで知りましたが、難しそうなのでやめました。XOOPS自体諦めました。

一方、ブログナビはまだ人気がありました。リンク集ですが先行者メリットはやはり大きいようです。AWALKERでは芸能人ブログ系ではまだトップランクでした。でも検索エンジンを兼ね備えた芸能人ブログ情報局はすぐ目の前まで来ています。「だめだ・・・喰われる・・・」と諦めかけましたが、やっぱりお金が欲しいので諦めませんでした。アホだったので、絶対大金が手に入ると妄信してたんです。


「PHPだったら簡単にプログラミングできる」そんな情報をYahooで得ました。サンプルをみるとHTMLと大差ない気がします。とりあえず始めてみることにしました。

windowsのデスクトップに「test.php」というファイルを作成して、echo "test"と書き保存してブラウザで開いてみましたが、コードがそのまま出ます。意味わかんね。
もしかしたらロリポップにアップロードすれば動くんじゃねと天才的な直感が降りてきて無事初のプログラミングとなったのでした(Apacheを知るのはこれよりずっと後です。ロリポップだと動く、それぐらいの認識でした)。

さっそくプログラミングコードをブログナビに貼付けてみます。「すごい・・・今日の日付が表示された・・・」。誰得ですが、サイトトップに今日の日付を秒数まで表示していました。秒数が自動で更新されないことに若干PHPに不満を覚えましたが、本を買って勉強に励みました(JavaScriptを知るのはこれよりずっと後でした)。

「なるほど。データベースというものを使うと検索エンジンが作れるのか」このときまでやっぱり「検索エンジン」と呼んでいました。
理屈はなんとなくわかったけど、ど素人からすると、データベースの概念自体全く理解できないのです。大学の講義中もずっとPHPの本を読んで理解に励みました。講義をさぼって勉強してました。

データベースにSQLクエリを投げて取得するプログラムを書くまでにおそらく2ヶ月はかかった気がします。それだけセンスがなかったのです。

さぁいよいよブログナビに検索エンジンを搭載することが出来ました。PHPも上達していたので、こざかしい偽リンクやクリックカウントなどを駆使し、人気はうなぎ上り。全ページにMySQLアカウントを記述して最悪のソースでプログラミング武装した上級サイトにのし上がり、トップページだけで一日2000PVほどになりました。

その頃、シーフティの売上もよくないので、Yichaの検索報酬に切り替えています。Yichaの検索窓を設置し、検索されるたびに0.5円の報酬があるというものでした。芸能人ブログと相性が良いので、眞鍋かをりの詳細ページに「画像はこちら」「動画はこちら」と検索クエリをパラメータにつけたリンクを設置したところ、一日2000円くらい儲かるようになりました。

アクセスアップに専念しましたが、2000PVを超えたあたりでストップ。次の一手を考えていると、サイトM&Aというサイトを売却できるサービスに出会いました。いくらで売れるかしらと自動査定システムに入力したところ50万という金額が表示される。

「50万wwわろたww」とさっそく本査定を申し込み。次の日には担当者から電話があり、「いいじゃないっすかー!100万でも売れますっす!」と言われたので俺昇天。とりま考えますと一旦保留に。

冷静になってみればこんな糞な俺が作ったサイトがそんな高値で売れるわけない。俺はだまされているんだと違うサイトに査定を依頼しました。「まぁ40万くらいにはなるんじゃないですかねー」とこちらはやや低め。低めといっても学生の俺からしたら大金だし、やや信憑性のある金額だったのでそこに売買の仲介をお願いしました。

売却案件に掲載されてから24時間足らずで10通のメールと2件の電話がかかってきた。めんどくさいので、電話かかってきた2件にしぼりました。

1人は元大手電機メーカーの社員さんということで起業したばかりでネタがないので人気サイトが欲しいとのことでした。
もう1人は関西でインターネット広告代理店を経営する社長さんでした。広告掲載媒体に使いたいとのこと。

元大手電機メーカーの人はプログラムもわからない人だししつこく電話してきたので嫌いだったのでもう一人のものごしの柔らかい人に売ることにしました。
でも元大手電機メーカーの人が「60万まで出す!」といったので、競り合わせてみたところ結局大手電機メーカーの人は100万の値まで言ってきた。
でもめんどくさい人だったので社長さんの方に60万で売りました。その後、大手電機メーカーの人が僕にキレてきましたがスルーしました。

その後、ブログナビは広告代理店の手によってYahooっぽいロゴが取り除かれ、アダルト広告だらけになりました。
※そして去年、2010年にその社長が別件の着うたサイトで逮捕されて、ブログナビはなくなりましたとさ。


「ちょっと勉強しただけのサイトが60万って、さらに勉強したらどうなるんだよ1000万いくんじゃねぇの?」とIT業界に入って修行を積むことにしました。

でも実際、技術とお金はほとんどリンクしないですね。今思えば技術力なんてどうでもよくて、必要だったのは、自信と行動力だったと思います。技術力とかいっても結局PHPだしね。


3:なので金儲けがしたいです
愛する書籍は金持ち父さん。金持ち父さんの言う金儲けの自動化、ロバートキヨサキは不動産だろうけど、俺からしたらプログラムが、ネットが、自動化だった。
プログラミングするきっかけって人それぞれだと思うけど、俺のきっかけって本当に金儲けでした。金儲けをするために俺にはPHPが必要なんです。

最近は寝ているとき以外、プログラムを書いています。サイトを量産させる体制を整えているといったところです。俺が開発したフレームワークtackphpもサイトを量産するために自分が必要な要素をフレームワーク化したに過ぎません。

会社に入ってから一年近い非システム研修をさせられ、それから企画に配属され、全くPHPを書かなくなりました。自分がなぜIT業界に来たのか、少し忘れかけていました。
開発を通して、お金儲けがしたかったのです。自分で作って自分で稼ぎたかったのです。


4:なぜ開発するのか
俺がサイト売却でお金を手にしたとき、嬉しくてたまらず、ヤフーチャットにログインして知らない奴らに報告しました。見ず知らずの人に。

チャットには二人いました。

一人はプログラマ。専門学校を出て、SIerのプログラマになったとのこと。彼はプログラミングでお金が稼げることを知らなかったようです。俺の話を聞いて驚いていました。
彼は雇われることでしかお金を稼げないと思っていました。作る能力を持っているというのに。

チャットにはもう一人、銀行マンがいました。銀行マンは言いました。「60万wwww少なすぎwww俺は1日3億の金を動かしてんだよwww」と言いました。彼は自分が何かすごいことをしているように言っていますが、俺にはわかりませんでした。彼は何も作っていない。

それは学生の頃でしたが、サラリーマンとはなんて嫌なやつだと、なんて勘違いやろうが多いのだろうと、サラリーマンに嫌悪感を抱くようになりました。今でもそれはかわっていません。自分で作って自分で稼ぐやつが偉いんだと信じています。


雇われるだけのプログラマじゃなくて、金を動かすだけのサラリーマンじゃなくて、「作って売る」という基本的な営みがしたい。


だから今も開発し続けています。

tackphpチュートリアル

自作PHPフレームワーク「tackphp」のチュートリアルです。

tackphpはgithubに公開されています。https://github.com/tatsuyau/tackphp


今回はチュートリアルとして、Bookmarkアプリケーションを作りたいと思います。


1:データベースの用意
今回作成するBookmarkアプリのテーブルをMySQLに作成しましょう。
カラムは、id, title, url, created, の4カラムでOKです。

CREATE TABLE IF NOT EXISTS `bookmark` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `url` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;


2:データベースに接続するアカウント
tackphp/database.phpを開いてください。接続アカウントを記述してください。

class database{
        public $schema = array(
                'default' => array(
                        'host' => 'localhost',
                        'user' => 'user',
                        'password' => 'user',
                        'schema' => 'databaseName',
                        'encoding' => 'utf8'
                        ),


3:controllerの作成
tackphp/controller内にBookmarkController.phpを作成します。

<?php
class BookmarkController extends Controller{
        public function __construct(){
                $this->bookmark = new Bookmark();
        }

        public function index(){
                $title = 'my bookmark list';
                $datas = $this->bookmark->getBookmark();
                require_once($this->layout);
        }

        public function add(){
                $this->bookmark->setBookmark($this->_request);
                header('Location: ./bookmark');
        }
}


4:modelの作成
tackphp/model内にBookmark.phpを作成します。

<?php
class Bookmark extends Model{
        public function __construct(){
                $this->db = new database();
        }

        public function getBookmark(){
                $sql = 'SELECT * FROM bookmark ';
                $this->db->execQuery($sql);
                $row = $this->db->fetchAll();
                return $row;
        }

        public function setBookmark($req){
                $sql = 'INSERT INTO bookmark (title, url, created) ';
                $sql .= 'VALUES (:title, :url, :created) ';

                $hashParam = array(
                        'title' => $req['title'],
                        'url' => $req['url'],
                        'created' => date('Y-m-d H:i:s')
                        );

                return $this->db->execQuery($sql,$hashParam);
        }
}


5:viewの作成
tackphp/view内にbookmark_index.tplを作成します。

<form action="bookmark_add" method="post">
title:<input type="text" name="title"><br />
url:<input type="text" name="url"><br />
<input type="submit" value="add">
</form>

<h2><?php echo $title; ?></h2>
<?php if($datas): ?>
<ul>

<?php foreach($datas as $data): ?>
<li><a href="<?php echo $data['url']; ?>"><?php echo $data['title']; ?></a></li>
<?php endforeach; ?>

</ul>
<?php endif; ?>


6:サイトにアクセスします
http://yourdomain/tackphp/bookmark にアクセスしてください。Bookmarkアプリケーションが作成できているでしょうか?


7:設定を変更します
http://yourdomain/tackphp で"bookmark"を省いたURLでアクセスできるようにします。
tackphp/config.phpを開いてください。

/*デフォルトのcontrollerとaction*/
define('DEFAULT_CONTROLLER','bookmark');
define('DEFAULT_ACTION','index');

上記に書き換えます。
http://yourdomain/tackphpでbookmarkアプリケーションにアクセスできれば成功です。


今回のチュートリアルの解説は後ほど。疲れたので。。。
自作のPHPフレームワークを公開しました。tackphpという名前を友人につけてもらいました。



コンセプトは、「ベタ書きフレームワーク」。
非常にわずかな規約に従うことで、WEBアプリケーションの開発がラクになります。

なんでフレームワークを作ろうなんて思ったのかと質問されるのですが、
単純に有名どころのフレームワークが自分の肌に合わなかったからです。

CakePHPは便利ですが、複雑な規約のせいで一気に使いにくいものになっている気がします。
フレームワークを使いたいのって、結局、MVCアーキテクチャにしたいだけの場合が多いと思っているのですが、
それだけだとCakePHPは重すぎる内容だとは思いませんか?

tackphpは、CakePHPの良いところだけを残して、邪魔なところをごっそりと抜き取ったようなフレームワークです。


CakePHPで良いと思ったところ
  • MVCであること。ファイル管理がしやすいですよね。
  • URLからコントローラーとアクションを実行できること。サイト構成がわかりやすいですよね。
  • レイアウト機能があること。VIEWテンプレートにいちいち、ヘッダーとフッターを読み込みさせる記述をするのはだるいですよね。

CakePHPで邪魔だと思ったところ
  • 通常のPHPが書けないような環境
  • やたら多い関数
  • 融通が利かない複雑な規約
  • いちいち変数をassign
  • 何よりもエンジンがブラックボックス過ぎてデバッグに困る

tackphpはほぼベタ書きが通用します。そしてエンジンは非常に計量であり、200行にも満たないシンプルでパワフルなフレームワークです。

次回、tackphpのチュートリアルを掲載しようと思います。

このアーカイブについて

このページには、2011年9月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2011年8月です。

次のアーカイブは2011年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。