雑記:技術ネタ: 2010年2月アーカイブ

opensocial.newDataRequest のリクエストを受けるサーバーサイドのコーディング例。
まあMyspaceに限らず、HMAC-SHA1 でリクエスト受けたときは全部使えると思うよ。
regist.php などのプログラムの頭にコピペしておきましょう!


PHP5以降だと動くでしょう。
POSTの場合は、GET を POST に置換しましょう。
あと httpd.conf でやるか php.ini か忘れたけど、文字コードの設定が UTF-8 じゃないと詰まるかも。


$namikare1 = "GET";
$namikare2 = "http://".$_SERVER["SERVER_NAME"].
substr($_SERVER["REQUEST_URI"],0,strpos($_SERVER["REQUEST_URI"],"?"));
$namikare3 = ""; foreach($_GET as $key => $value) { if($key === "oauth_signature") continue; if($namikare3) $namikare3 .= "&"; $namikare3 .= rawurlencode($key)."=".rawurlencode($value); } $namikare = rawurlencode($namikare1)."&".
rawurlencode($namikare2)."&".
rawurlencode($namikare3); $gesuido = base64_encode(hash_hmac("sha1", 
$namikare, "OAuthコンシューマーシークレットの文字列"."&", 
TRUE));
if($gesuido !== $_GET["oauth_signature"]) { header('HTTP/1.0 403 Forbidden');
exit; }


ちょっと詰まった点。
1.組み立てる文字列の最後は基本的にパラメーターをABC順に並べるんだけど、oauth_signature を抜かなきゃいけないの。
2.urlencode() じゃなく rawurlencode() を使わないとスペースとかのエンコード方法が違っててダメだった。
3.キーが一致しなくて悩んだとき、どこが悪いのか検証方法がなかったのでトライ&エラー。


※動作は保証しません
※わからなければググりましょう

ソーシャルアプリを作る時のコーディング量はこんな感じ。
とは言っても自分は趣味で数個しか作ってないし、mixi以外でちゃんとサービスインしてないし、フル機能使ってるわけじゃあないので、参考までに。


mixiアプリ ニアミス.net
OpanSocial的な仕様追加は
・ユーザーID,プロフィール取得
・招待
・アクティビティ

mixiアプリ にぎやか地図
・ユーザーID,プロフィール取得
・招待
・アクティビティ
・ガジェット
・マイミク関連

mixiアプリとか まだひみつ
・ユーザーID,プロフィール取得
・招待
・アクティビティ
・ガジェット
・マイミク関連
・コミュニティ関係
・学校情報
・OAuthごにょごにゅ

それぞれ、総コーディング量を100としたら・・・
サーバーサイド(PHP)が10
JavaScriptが90
OpenSocial的なことが両方にまたがって5~10

たいしたことないんです。

こんなテキトーでまともなアプリ作れてるわけないって?
mixiでトップ走ってる三国志とか牧場が、どれくらいOpenSocial的か。
OpenID + 通知の仕組みだけで十分じゃね?ってアプリが大杉。


とにかく敷居は凄い低い。
javascript知ってる人なら、作り方はmixiデベロッパーのヘルプを半日読むだけで十分。
OAuth関連だけはめんどっちいけど、1時間もググればサンプルコード見つかる。
理念とか出来ることを把握したければ田中洋一郎さんの本を買う。


まー手間暇かかんないんで、皆さんどんどん作っていきましょう。
悩んだり勉強会行ったりコンサル呼んだりする暇があったらさっさとコーディングした方がいいと思います。
「よくもこんなキチガイアプリを!」的なので溢れてるから、深く考えずに、超テキトーでいいっすよ、きっと、最初は。


↓田中洋一郎さんの本

Twitter API 位置取得

user-pic
0
にぎやか地図でTwitter検索をやろうと思って


APIを位置情報指定で呼び出したんだけど

座標がnullで返ってきちゃう。
"geo":null

他の項目にはこういうのとか入ってるけど、
"location":"iPhone: 35.681702,139.765457"
"location":"iPhone: kanagawa,35.681702,139.765457"
"location":"東京都"

値が安定しないからきっとフリー項目。
100件取得して、緯度経度っぽいの入ってるやつだけ表示ってやってもいいんだけど、取得データ捨てるのはエコじゃないし・・・

検索条件に「緯度経度あり」ってのを指定できるといいなと思いました。
でもまー座標は悪用されるとアレなんで隠してるんでしょうかね。

これからWebサービスを始めたい人の参考になれば。


サーバー

さくらインターネット専用サーバー ベーシック
初期費用8万円、月額9千円くらい。
1年近く使っててダウン無し。大手サービスも使ってる。超安定。


ドメイン管理

VALUE-DOMAIN
他と比較したこと無いけど、使いやすい感じ。


開発環境
いわゆるLAPP

CentOS5.2 
RedHatからのクセで

Apache 2
PHPはマルチスレッド向きじゃないけど、1系はmodが弱い気がするので

Postgresql 8.4
MySQLより融通が効いて好き

PHP 5 & APC
やっぱ開発速度がダントツ


開発管理

PukiWiki
TODOでも技術蓄積でもなんでもこい


サービス監視

nagios
高負荷時のアラート用

MRTG
時間帯別の負荷計測

visitors
apacheアクセス解析

pgFouine
DBの無駄を洗い出すクエリアナライザ

pgAdmin
ちょこっとしたDB作業に

さくら以外は一年以上前に使った感想ですが、なんかの参考に。


自宅サーバー

電気代がかかる。
うるさい。
マメに掃除しなきゃいけない。
プロバイダの都合や電源コード引っこ抜いたりでよく落ちる。
一番楽しかったのはこれ



coreserver CORE-A

月額500円でスクリプト、DB、メールが動かせる!
ただしサポート皆無の玄人志向。
cronは1時間に一回まで。
value-domainでドメイン管理してると設定が凄く楽。メールも面倒な設定不要。
サイトの規模が大きくなると転送量制限(15GB)で引っかかる。
重たいサービスが同居してると不安定。でも無料でサーバー移動できる。
SSHは一応あるけどちょっと不便。
イチからWebサービス始めるなら、とりあえずこれ



WebARENA suitePROv2

初期費用5,250円。月額8,820円。
仮想専用サーバー。
プロセス数の制限が厳しい。PHPで大規模サイトだとすぐこれに引っかかる。
何もしなくてもテレホタイムは重い。同居してる人らのせい?
自分には値段に見合うと思えなかった。
たぶんサポートは充実。
きっと専用サーバー初心者向け



さくらインターネット 専用サーバ ベーシック

初期費用79,800円、月額8,800円。
普通に専用サーバー。
OS入れて、SSHの接続確保までやってくれる。
なんでもできる。リソースは100%使える。重いのは自分のせい。
一年近く使ってるけどサーバーダウンは無し。
企業がサービスに使ったり、又貸しされてたり、信頼感は抜群。
2ch曰くサポートは若干弱いらしい。
ちゃんとサービスするならこれ
mixiアプリってiframeで動くからさ、リファラを見ればGETパラメーターは取れるのよ。
ただプログラム自体はキャッシュされるから、javascriptでごりごりやらなきゃいけないの。

とりあえず動作確認。

alert(document.referrer);

あとは split('&'); なり indexOf('=') をして・・・めんどくさければ、ここを参考に。

アプリはiframe内で動くので、リンクは当然 target="_top" で。
AJAXが苦手な方はどうぞ。


でも規約違反かもね。
「みだりに画面遷移をしてはいけない」ってあった気がする。
自己責任で。
category:コンビニ
category:イタリア料理
category:堤防釣り

とか。

これを使うと、国産地図サイトで良く使われてるリスト検索ができます。
自前でこういう階層を作れば絞り込んでっての検索も可能。

食事
 →和食
 →フランス料理
 →・・・
買い物
 →コンビニ
 →釣り
 →・・・
エンターテイメント
 →カラオケ
 →ボーリング場
 →・・・
・・・
・・・

foursquare の API 。
TOEIC400点の自分が http://groups.google.com/group/foursquare-api を読みながら頑張ってみた。

とりあえず、認証の要らない一番楽に使えそうなtip検索API。

パラメーターは
・緯度
・経度
・件数
・フリーワード

戻り値は
・tip(いわゆるコメント)の一覧
・venue(いわゆる場所)の情報

データ形式はXMLかJSON。コールバック関数は無し。
だからajax的に使うには一工夫。

サンプルコードをお披露目しようと思いましたが、説明書に「開発中だし負荷かけないでね!」って書いてあるような気がするので、止めときます。
実際開発中に何度もサーバーダウンしてたし。

なので実装例も万人が見られるものではなく、mixiアプリ限定で。

検索タブの右下の青いやつを押すと検索します。

田舎だと殆ど出ないので、都会で。
検索半径1km程度しかないので、繁華街とか主要駅を中心にして。


とりあえず、API(http://api.foursquare.com/v1/tips)に対する要望。

検索パラメーターはGoogle Local Srarch API 互換だと作りやすい
 geolat&geolng → sll にするとか
 中の人はgoogle出身ですし、サイト本体の地図はGoogleですし

範囲検索ができると表現がしやすい
 パラメーター名は当然sspnで

並は近い順だけじゃなくて、新しい順とかバリエーションがあるといい
 中心にギュッっと集まるのは見栄えがわるいの
 まあ携帯端末向けっぽいからこれでいいのかな

英語が達者でおせっかい焼きな人、foursquareの中の人に伝えて頂けると有難いです[^v^]/


他のAPI、特に更新系。そのうち試して書きますね。
APIが安定したらサンプルコードも載せまーす。

yum install perl-Crypt-SSLeay.i386

by CentOS 5.2


MovableType は2の頃から使ってますが、もうなんだか便利すぎて感動。
特にウィザード形式のインストールが最高。

昔はインストール適当でセキュリティホールなブログだらけでした。
ハックされてドリフ掲示板にされてたりして。

今更ながら・・・

リンクをクリックすると、自分のTwitterアカウントに投稿して、利用者のTwitterアカウントに引用するコーディング例。
Twitter スパムをしたい人は是非!

ちなみにTwitter は 1000件/日 60件/時間 という投稿制限があるっぽいので、カウントとるかcron使いましょう。

必要なもの

PHP5 あたり
Twitterアカウント
PEAR の Services/Twitter.php 
細かいところをググれる頭



HTMLの例

<a href="twitter.php">@Twitter</a>



PHPの例
twitter.php

// フォームの値を取得
$message = $_GET["message"];

// 自分のtwitterアカウントに投稿
require_once 'Services/Twitter.php';
$service = new Services_Twitter('user', 'password'); 
$service->statuses->update($message); 
$service->account->end_session(); 

// 利用者のtwitterアカウントに引用して遷移
header("location:http://twitter.com/home/?status=".urlencode($message));

Twitterに投稿するボタンを作ってて、MySpaceに投稿もさせたいなあと思ったので調べました。
こんな感じで大丈夫みたいです。


<form id="myspacepostto" method="post" action="http://www.myspace.com/index.cfm?fuseaction=postto" target="_blank">
  <input type="hidden" name="t" value="{$title}" />
  <input type="hidden" name="c" value="{$word}" />
  <input type="hidden" name="u" value="{url}" />
  <input type="hidden" name="l" value="LOCATION" />
  <a href="#" onclick="document.getElementById('myspacepostto').submit();return false;">
    <img src=" http://cms.myspacecdn.com/cms/post_myspace_icon.gif " border="0" alt=" MySpaceに投稿" width=18 height=16/>
    MySpaceに投稿
  </a>
</form>



実装例。

ようするに、
Javascriptでユーザーのプロフィールが取れる


個人的まとめ

普通のWeb技術者なら半日で理解可能
 まあ動かすだけなら、iframeで既存のサイト呼び出しゃいい
 あんまり意味ないけど

AJAXの知識があればなお良し
 Javascriptでユーザーのプロフィールが取れる

アプリから外部へ通信する仕組みを用意してくれてる
 クロスドメインを解決してくれてる XMLもJSONも簡単に取れる
 OAuthも使えるので登録処理も安心



多分Mixi限定の縛り?

プロフィールの内、気楽に使えるのはIDだけ
 「名前や写真なんかは24時間以内に破棄」って規約あり
 IDからAJAXでリアルに名前を取得、なんてしなきゃいけない めんどいね
 いやー、でも、なんか保存してるぽいアプリいるんじゃねー

その他マイミクや細かい情報取るにはちょいと複雑コーディング
 負荷もかかりそうで、あんまり使って欲しくない感じ?
 AJAXでガンガン通信しなきゃいけないのよね。めんどくせー

プロフィールは二次利用禁止
 要するにMyspaceユーザーがMixiユーザーを見られない
 閉鎖的だねえ
 ただしmixiから取得してない情報は二次利用可能←同意を取る必要あり

アフィリエイトはガチガチに縛られてて無理ぽい
 PV課金でコツコツか、アイテムやアバター売りで稼ぐしかなさげね
 でも人気出るとmixiが書いとるとか出資するとかあるみたい
 まー規約は柔軟に変えてるみたいだから今後どうなるか

Google APIを使う場合のドメインってどうなるの
 「mixi-platform.com」 で申請しよう

モバイルの位置情報を活用するにはMixiと書類のやりとり必要ぽい
 品質を追求されるから個人サービスみたく気楽にはやれない
  mixiとの親和性がないと公式アプリにはなれません
  「サービス終了は45日前に通知」と言うような決まりあり
  でもバグって放置されてるのあるんだけど


その他

同級生機能をプッシュしているような気がした
開発者向けの出資やサービス買取は面白いと思った
Mixi用に作ったアプリ、Myspaceでもほぼそのまま動いたよ!
FacebookはPHPにライブラリ組み込むとか、独自仕様
GREEも早くアプリを開放すべき 動き遅いよ!
 もちろんOpenSocialでね

PHP+APCで万全


前提条件

専用サーバーであること
 1台構成の時に威力を発揮します
 キャッシュサーバーを用意するまでもない or できない環境であること
 個人やサーバー追加権限の無い人に!
 キャッシュサーバーを作れるならmemcacheへどうぞ

CentOS5.2 を想定して書きます
 それ以外の環境のかたは応用例をググってください
 インストールはyumとpearで ソースが好みの方は頑張って



インストール

Linuxコマンド

yum install http-devel.i386
pecl install APC
/etc/php.ini に
  extension=apc.so

これで終わり。あとはapache再起動で勝手に動き始める。
面倒ならここまででも十分!



使い方(PHPの高速化) 

管理画面
 apc.phpがどっかに出来ているので、外から見える場所におきましょう。
 メモリの使用量とかキャッシュの内容とか見えて楽しい。

設定
 php.ini を apc で検索したら設定項目が出てくる。
 管理画面見てメモリをフルに使ってたら、メモリを増やすなど



使い方(データのキャッシュ) 

emcacheよりシンプル。データのキーは1つのみ。
データはいっぱいになったら古い順に消えていくみたい。
apache再起動でも全部消えるよ。

コーディング例

//保存
// 3600=保持する時間(秒)
apc_store("key","value","3600");
 
//取り出し
$value = apc_fetch("key");



運用

管理画面見てニヨニヨ
基本的に放置でおk

このアーカイブについて

このページには、2010年2月以降に書かれたブログ記事のうち雑記:技術ネタカテゴリに属しているものが含まれています。

次のアーカイブは雑記:技術ネタ: 2010年3月です。

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