Hatena::ブログ(Diary)

IT戦記 このページをアンテナに追加 RSSフィード Twitter

2011-09-05

Facebookページの顔、「Welcomeページ」のとことん簡単な作り方

はじめに

みなさんこんにちはヽ(´ー`)ノ

本日、Facebook ページにウェルカムページを簡単に追加できるサービス「ウェルカムページメーカー」をリリースいたしました!

20110905103756

どんなサービスなの?

Facebook ページを持っている人なら、誰でも「とことん簡単に」ウェルカムページを作れるサービスです!

今までも、このようなサービスはあったのですが「とことん簡単に」というところを追求したのがこのサービスです。

ウェルカムページって何?

ウェルカムページとは、 Facebook ページのトップページとなるページで簡単なメッセージや、「いいね!」を促す文言を載せたりすることができます。

有名なウェルカムページとしては レッドブルの Facebook ページ などがあります。

20110905103757

ついつい、「いいね!」をクリックしてしまいそうです!

なんで、「いいね!」されるが重要なの?

「いいね!」されることで、ユーザのニュースフィードにそのページの更新情報が流れるようになるのです。

f:id:amachang:20110905103758j:image

なので、「企業」や「ブロガーさん」がユーザともっと仲良くなるために「いいね!」してもらうことは結構重要なことみたいです><

でも、ウェルカムページ作るのめんどくさい><

でも、今までウェルカムページを作るにはどうしても Facebook アプリの知識が必要だったり、 FBML という独自のマークアップ言語を使う必要があったりと何気にめんどくさい作業だったんです><

と、言うわけで

「とことん簡単」にウェルカムページ作りたい!

という要望に応えたサービスがウェルカムページメーカーです!

使い方(ウェルカムページの作り方)

と、言うわけで簡単にウェルカムページメーカーを使って、ウェルカムページを作ってみましょう。

1. 画像を 2 枚用意する

今回は、サンプルにこんな画像を用意してみました

いいね!を押して   ... - はてなちゃんセリフ - はてなセリフ べ、べつに   嬉しい... - はてなちゃんセリフ - はてなセリフ

2. ウェルカムページメーカーに行って「さっそく作る」をクリック!

お金がない!どうしようとお悩みの方が見るサイト へ行って

20110906194424

「さっそく作る」というボタンをクリックします

3. Facebook ページを選ぶ

f:id:amachang:20110905103800j:image

ウェルカムページメーカーを追加しますか?と表示されますので、ウェルカムページを追加したい Facebook ページを選びます。

f:id:amachang:20110905103801j:image

確認画面が出るので、「ウェルカムページメーカーを追加する」を押します。

4. 画像を設定する

追加すると、以下のような画像設定画面が表示されますので、

f:id:amachang:20110905103803j:image

画像を設定して、「変更を適用する」を押します

5. 完成したウェルカムページをデフォルトページにする

以下のような更新完了ページが表示されますので、

f:id:amachang:20110905103804j:image

Facebook ページの設定に行き、「デフォルトで表示するタブ」を「ウェルカム!」に設定します。

6. これで完成!

このページに設定してみたので見てみてください! → Amachang | Facebook

f:id:amachang:20110905103805j:image

おおおお!出来てますね!簡単!

このサービスを作ろうと思ったきっかけ

で、なんでこんなサービスを作ろうかと思ったかというと先日以下のようなやりとりがあったんです。

とある会社にて

A さん:「Facebok ページにウェルカムページみたいなの作りたいんだよねー」

僕:「じゃあ、 HTML くれればやっときますよー」

A さん:「画像のほうが楽だわ」

僕:「え、 HTML より画像のほうが楽なんすか?」

A さん:「そりゃそうよ」

僕:「じゃあ、アップロードフォームがあればいいの?」

A さん:「うん」

僕:「今、作るわ」

A さん:「じゃあ、僕画像作るわ」

僕:「フォーム作った」

A さん:「画像できた」

僕:「これ、意外と便利ね」

A さん:「だね」

僕:「明日リリースするわ」

A さん:「えっ」

って感じで

打ち合わせ中に書いたサンプルコードが便利だったのでサービスとしてリリースすることにしたって感じです。

その打ち合わせ中に書いたコード

もちろん、エスケープもしてないし、 CSRF チェックとかもしてないし、 画像のバリデーションもしてないし、 HTML も超適当なのでこのままリリースしてるわけではないですが、その場でパパっと書いたコードは以下のものです。

<?php
   require_once '/home/ubuntu/php-sdk/src/facebook.php';

  $facebook = new Facebook(array('appId' => 'XXX', 'secret' => 'XXX'));
  $req = $facebook->getSignedRequest();
  $page_id = $req['page']['id'];
  if($req['page']['admin']) {
    echo('<form action="upload.php" method="post" enctype="multipart/form-data">');
    echo('<input input type="hidden" name="id" value="' . $page_id . '" />');
    echo('<input input type="file" name="before" />');
    echo('<input input type="file" name="after" />');
    echo('<input type="submit" value="upload" />');
    echo('</form>');
  }
  else if($req['page']['liked']) {
    echo('<img src="/files/' . $page_id . '/after.jpg">');
    echo('<script>setTimeout(function() { top.location.href = "http://www.facebook.com/page/' . $page_id . '?sk=wall" }, 10000)</script>');
  }
  else {
    echo('<img src="/files/' . $page_id . '/before.jpg">');
  }
<?php
if (is_uploaded_file($_FILES["before"]["tmp_name"]) and is_uploaded_file($_FILES["after"]["tmp_name"]) and isset($_POST['id'])) {
  if(!is_dir("/home/ubuntu/simplefb/files/" . $_POST['id'])) {
    mkdir("/home/ubuntu/simplefb/files/" . $_POST['id']);
  }
  $before_file = "/home/ubuntu/simplefb/files/" . $_POST['id'] . '/before.jpg';
  $after_file = "/home/ubuntu/simplefb/files/" . $_POST['id'] . '/after.jpg';
  if (move_uploaded_file($_FILES["before"]["tmp_name"], $before_file) and
    move_uploaded_file($_FILES["after"]["tmp_name"], $after_file)) {
    chmod($before_file, 0644);
    chmod($after_file, 0644);
    echo"アップロードしました。";
  } else {
    echo "ファイルをアップロードできません。";
  }
} else {
    echo "ファイルが選択されていません。";
}
まあ、たまにはこんな開発もいいよね

(´∀`*)ウフフ

というわけで

今回リリースしたサービス、「ウェルカムページメーカー」。

ぜひ使ってみてください><

ではではーヽ(´ー`)ノ

2011-08-31

WebKit サーバーというものを作ってみた

みなさん

お久しぶりですヽ(´ー`)ノ夏休みの宿題終わりました?

毎日が夏休みの最終日みたいな生活してるあまちゃんです!

さてさて

今日は WebKit サーバーというものを作ってみたので、紹介してみます。

f:id:amachang:20110831092022p:image

WebKit って何?

WebKit っていうのは ChromeSafari の中に入ってるブラウザのエンジンのことです!

実はブラウザっていうのは、エンジン部分と見た目の部分(タブとかボタンとかね)に別れていて、意外と違うブラウザでもエンジン部分は同じものを使ってるってことも多いんですよ(*´ー`)

ブラウザサーバーってどういうこと?

要は、サーバーサイドでブラウザを起動して JavaScript を実行したり、 JavaScript が実行されないと読めないページから値を持ってくるのに使ったりしようという魂胆です。

今まではそういうのなかったの?

実は、今までは JavaScript を使わないと読めないようなページから値を持ってくるのに Phantom.js という便利なソフトウェアがあったんです。

no title

f:id:amachang:20110831094757j:image

でも、 Phantom.js にはちょっとした問題点があって、今仕事でやってることに Phantom.js が合わなくなってしまったのです><

Phantom.js の問題点
  • 他のプログラムと連携しようと思ったときに、プロセス間で通信する手段やライブラリとして呼び出す手段がない
  • 度々起動したり終了したりするには重すぎる
  • メモリを食う
  • Xvfb を入れないといけない(これもメモリ食う)
  • 重い JavaScript を実行すると WebKit割り込みが発生するが、それを何も通知してくれないので何が起こってるのか分からなくなる。(この状態になると、プロセスを殺すしかなくなる)
  • 実行をタイムアウトする手段がない
  • confirm や prompt で止まってしまう(この状態になると、プロセスを殺すしかなくなる)

というわけで

これらの問題点をぜーんぶ解決しちゃうぜ!っていうのが今回作ったサーバーです。

コード

とりあえず、以下のところに置いておきました

webkitd/webkitd.py at master ? amachang/webkitd ? GitHub

今回作った WebKit サーバーの特徴

起動のしかた

とりあえず、デフォルトの設定でインストールしたての Ubuntu 11.04 サーバーがあったとして解説しますね。

これを順にやっていけば、たぶん使えると思います。

1. 必要なものをインストールする

apt-get で必要なものをインストールします

$ sudo apt-get install git-core python-qt4 python-daemon xvfb daemon rlwrap
(略)
Do you want to continue [Y/n]? Y

Y と答えます。ちょっと時間がかかります><

2. コードを持ってくる

gitWebKit サーバーのコードを持ってきます

$ git clone git://github.com/amachang/webkitd.git
(略)
3. Xvfb を起動する
$ sudo daemon -X "/usr/bin/Xvfb :1 -screen 0 1024x768x24" --name Xvfb
$ export DISPLAY=:1.0
4. WebKit サーバーを起動する!
$ python webkitd/webkitd.py start

エラーになりませんね?おおおお!これで起動しましたね!

ちなみに、詳細なオプションは、以下のようにすると見ることが出来ます

$ python webkitd/webkitd.py -h

使ってみる!

では、さっそく使ってみましょう

本当は、ソケットを使ってプログラムを書かなければいけないのですが、 telnet というコマンドを使うとコマンドラインからソケット通信を試すことが出来るのでそれを使います

1. 接続する

以下のように打って接続します

$ rlwrap telnet 127.0.0.1 1982

以下のような状態になったら、接続できています!

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

2. Yahoo にアクセスしてみる

接続できたら。

以下のように一行で書いてみてください

{ "type": "load-url", "data": { "url": "http://www.yahoo.co.jp/", "timeout": 10 } }

これは、「http://www.yahoo.co.jp/ にアクセスして 10 秒以内に完了しなかったらタイムアウトしてくれ」という意味です

成功すると以下のような結果が返されます

{"data": {"status": 200, "ok": true, "title": "Yahoo! JAPAN", "url": "http://www.yahoo.co.jp/", "finalUrl": "http://www.yahoo.co.jp/", "timeouted": false}}

おおおお!アクセスできてる

3. ページから値を取得してみる

次に値を取得してみましょう。

以下のように一行で書いてみてください

{ "type": "get-element-value", "data": { "xpath": "/descendant::a[1]", "attr": "href", "timeout": 10 } }

これは、「最初に出現したリンクの href を持ってきて」という意味です

成功すると以下のような結果が返されます

{"data": {"count": 1.0, "propValue": "http://www.yahoo.co.jp/_ylh=X3oDMTB0NWxnaGxsBF9TAzIwNzcyOTYyNjUEdGlkAzEyBHRtcGwDZ2Ex/r/mphp", "hasProp": true, "attrValue": "r/mphp", "found": true, "error": false, "hasAttr": true, "timeouted": false}}

ちゃんと、リンクを持ってこれましたね!

4. クリックしてみる

以下のようにすると最初のリンクに対してクリックをしたことにできます。

{ "type": "click-element", "data": { "xpath": "/descendant::a[1]", "timeout": 10 } }
5. 現在の状態を確認してみる

以下のようにするとブラウザの状態を確認できます。

{ "type": "server", "data": { "command": "status" } }

ちゃんとページが遷移していますね。

{"data": {"objectCount": 17, "selectedText": "", "objectCountMap": {"QUndoStack": 1, "QWindowsStyle": 1, "QSessionManager": 1, "QNetworkAccessManager": 1, "QGuiEventDispatcherGlib": 1, "WebKitPage": 1, "QWebFrame": 1, "QNetworkCookieJar": 1, "QApplication": 1, "QNativeSocketEngine": 2, "WebKitWorker": 1, "WebKitServer": 1, "QSocketNotifier": 3, "QTcpSocket": 1}, "title": "Yahoo! JAPANトップページをホームページに設定しよう", "url": "http://www.yahoo.co.jp/promotion/startpage/", "totalBytes": 23748, "height": 2083, "width": 950, "requestedUrl": "http://www.yahoo.co.jp/_ylh=X3oDMTB0NWxnaGxsBF9TAzIwNzcyOTYyNjUEdGlkAzEyBHRtcGwDZ2Ex/r/mphp"}}
他にも

以下のようなことが出来ます

  • スクロールの操作
  • 要素が出現するまで待つ
  • 任意の JavaScript を実行
  • 値の入力

ライブラリとしても使えます

この webkitd.py を今回直接実行しましたが、外部の python スクリプトから import して使うことも出来ます。

独自のコマンドや、 Java を有効にしたり、 Plugin を有効にしたり、セキュリティの設定を変えたりといろいろ拡張しやすいように作ったつもりです。

だいたいこんな感じです!

まだまだ、未完成な WebKit サーバーですが仕事で使いつつ、コードやテストをアップデートしていこうと思っていますので、生ぬるくウォッチしていただけたらなーと思います。

ではではーヽ(´ー`)ノ

2011-06-30

Google+ が解決した、たった一つのフェイスブックの問題点

今までの SNS はプライベート空間を分けることが出来なかった

f:id:amachang:20110630204405j:image

これじゃ、お父さんがかわいそうヽ(´Д`;)ノ

と、言うわけで

Google+ はそれを解決した

f:id:amachang:20110630204407p:image

( ・`ω・´)キリッ


f:id:amachang:20110630204406p:image

(・∀・)ウホッ

まとめ

インターネットでは、友達が増えるたびどうしても話題が最大公約数的になりすぎてしまう

自分も今まではそう思っていなかったのですが。

今回、 Google+ を使ってみて、いつも知らず知らず我慢していた自分に気が付きました。

Google+ はこの問題を本気で解決しようとしているように見えます。

まだまだ、機能が少なくて荒削りな部分も多いですが、この一点を解決したというのは非常に価値があるのではないでしょうか。

だ、だめ。言いたいことも言えちゃうこんな SNS じゃ


2011-04-04

アイデアひとつで何かを実現するサイト! READYFOR? をリリースしました!

READYFOR? というサイトをリリースしました!

みなさん、お久しぶりです!元気ですか?僕は元気です><

最近、 READYFOR? という日本初のクラウドファンディングサービスをリリースしました!

ですので、今日はそのサービスの紹介と、新しい資金集めの形である「クラウドファンディング」というものを紹介したいと思います!

クラウドファンディングって何?

クラウドファンディングとは、簡単にいうと ウェブ版、「マネーの虎」 のような仕組みです!

つまり、何か「やりたいこと」がある人(実行者)がそのアイデアを披露して、それに賛同した人(支援者)必要なお金を支援して貰うという仕組み、それをウェブSNS と連携してやっちゃおうじゃないか!というのがクラウドファンディングサービスです。

クラウドファンディングを使うと、誰でも「こういうモノを作りたい!」というアイデアさえあれば、それを世の中に問うて、それを実現することができるのです!

わかりやすく

READYFOR? のクラウドファンディングの例を分かりやすく、漫画を描いてみました!

(下手でごめんなさい><)

f:id:amachang:20110404024532p:image

実現したいアイデアがある!

f:id:amachang:20110404024534p:image

でも、お金がたりない><

f:id:amachang:20110404024536p:image

そんなときに、 READYFOR? で自分のアイデアを披露して

f:id:amachang:20110404024537p:image

READYFOR? で、賛同してくれる人から少しずつお金を集める

f:id:amachang:20110404024538p:image

そして、アイデアを実現し

f:id:amachang:20110404024542p:image

支援してくれた人にお返しをする

ね、なかなかおもしろそうな仕組みだと思いませんか><??

READYFOR? の特徴

クラウドファンディングサービスとしての READYFOR? の特徴は、主に以下の 2 点が挙げられます。

  • 「寄付」ではなく「購入」
  • All or Nothing

この二つの特徴を実際の READYFOR? プロジェクトのスクリーンショットとともに紹介したいと思います。

「寄付」ではなく「購入」

まず、一つ目の特徴は「購入」です。

f:id:amachang:20110404024548p:image

READYFOR? では、支援者は「寄付する」ではなくて、実行者からモノを「購入する」という立場を取ることにしています。

これは、実行者はそのアイデアを「実際に欲しい」と思っている支援者と出会い、支援されることが、最終的にプロジェクトを成功させるために重要だと考えているからです。

All or Nothing

そして、もう一つの特徴は「All or Nothing」です

f:id:amachang:20110404103958p:image

READYFOR? では、実行者が設定した期間で必要な資金を集められなかった場合、そのプロジェクトは未成立となり、支援された資金は支援者に返金されます。

実行者のアイデアがどのくらい必要とされるか、ネットを盛り上げることが出来るかがプロジェクト成立のカギになってくるのです!

「お金」だけではなく「つながり」も

また、 READYFOR? では「資金を集める」ということ以外にも、拘っていることがあります。

それは、「実行者と支援者のつながり」です。

実際に何かを実現するには、「アイデア」と「お金」だけではなく、「人とつながる」ことが重要です。

プロジェクトの中で、様々な困難にぶつかったとき、「支援者の声」がそれを解決してくれるかもしれません。

READYFOR? では、「実行者と支援者がメッセージや SNS でつながるということ」を意識して設計されており、実行者は READYFOR? を使うことで「お金」だけではなく、人との「つながり」も得ることができるのです。

READYFOR? 「を」作った「場」

ここまで紹介しといてなんなんですが、僕はこのサイトの制作に関しては少しアドバイスしたり、少し JavaScriptHTML を書いた程度でほとんど携わっていません。

実は、このサイトは弊社に「アルバイト」や「インターンシップ」に来てくれていた学生たちが集まり、立ち上げ、そして、リリースしたサービスなのです。

弊社は、ただ彼らが集まる「場」になったにすぎませんし、また、そういった「場」になれたことを嬉しく思っています。

READYFOR? 開発チーム

本来なら、あまり自分で自分の会社の人間を褒めるというのはしないかもしれませんが。

彼らの頑張りをずっと横眼で見続けてきた一人の先輩として、最後に READYFOR? の開発チームを紹介したいと思います。

(このうち、数人のメンバーは 4 月から社会人として、別の会社で働いていたりします。)

みんな、学生とは思えない実力と、学生らしい勢いを持っていて、とても羨ましいなあと思って見ていました。

本当に素晴らしいチームだったと思います。

弊社が彼らの「場」に慣れたことをうれいしく思います。

次は、彼らが READYFOR? という「場」を通じて、たくさんの夢を実現させていってほしいです。

READYFOR? 開発チームの皆様、本当にお疲れ様でした!

と、いうわけで

最後は、READYFOR? 開発チームの写真で締めたいと思います。

f:id:amachang:20110404024543j:image

皆様、これからも READYFOR? を、そして、READYFOR? 開発チームをよろしくお願いいたします!!

What are you ready for?

2011-02-07

フェイスブックアプリを HTTPS に対応する方法

はじめに

みなさんこんにちは (´・ω・`)

元気ですか?僕は元気です…。

さて。以下の記事で、フェイスブックHTTPS をサポートするっていうことが書かれています。

D

Facebookが、サイトをHTTPSサポートする機能を追加しました。Firesheepなどの攻撃から自分のFacebookアカウントを守るためにも、今すぐオンにしたほうが良さそうです。

http://www.lifehacker.jp/2011/02/110202facebookhttps.html
HTTPS って何?

HTTPS って何?って方向けに簡単に説明しておくと。

HTTPS を使う」っていうのは、「自分のパソコン」から「フェイスブック」までの「通信経路の途中に居る人」に通信内容を読まれなくなるってことです。

「通信経路の途中に居る人」って言うのは以下のような人ですね。

これらの人に、友達とイチャコラしてる内容とかが読まれちゃったりしなくなるんです><

まあ、読まれないにこしたことはないってことですね。

やり方は

右上の「アカウント」→「アカウント設定」→「アカウントセキュリティ」と進み以下のチェックボックスをクリックするだけ!

f:id:amachang:20110207121425j:image

簡単ですね!

フェイスブックアプリを HTTS に対応する

で、フェイスブック自体が HTTPS に対応したので、フェイスブック内に埋め込まれる類のフェイスブックアプリHTTPS に対応しなければならなくなりました><

対応しないと以下のように怒られます。

f:id:amachang:20110207121427j:image

やり方は、簡単で

  1. https://www.facebook.com/developers/apps.phpに行く
  2. 「設定を編集」を押して
  3. 以下のように「Facebook Integration」のタブの中の「Secure Canvas URL」に、 HTTPS 用の URL を記述する

f:id:amachang:20110207121426j:image

簡単ですね!

と、いうわけで

みなさん素敵な HTTPS ライフをお送りください!

ではではーヽ(´ー`)ノ

Connection: close