2013年6月10日月曜日

勉強会ログ: 6月7日(金) (Twitter) API 勉強会/API1.0告別式 @恵比寿 @engineyard_jp #apihack

2013.6.7
第9回

次回以降の予定
・PaaS API
・ヘルスケアデバイス系API Nicke+とか
・地理系API GEO系
・決済系API


■twitter API1.1
・Twitterエコシステムの定義
 ・いわゆるtwitterクライアントは自社で出すので作って欲しくない
  ・”クライアント”の定量的な判断基準はない
  ・今後新規のいわゆるクライアントはもう無理(ユーザ10万に限るなど…)
  ・ポイントはtwitterにとって有益になるかどうか
・ディベロッパ利用規約変更
 ・表示形式の指定がrequiredに
 ・タイムラインのレンダリングは、twitterのタイムラインであることがわかるように
  ・twitterの鳥を配置
・API1.0 -> 1.1
 ・endpointの変更
  ・単純なURLプリフィクスの変更
  ・xml廃止、jsonのみに
  ・廃止されるエンドポイント(public_timeline, retweet関連など)
 ・レートリミット方式変更
  ・1.0:1アカウント350回/1時間、1.1:1エンドポイント15回/15分・多く使われるものは180回/15分 (いずれもOAuth必須)
 ・OAuth必須に
  ・1.0:一部は150回/1時間でOAuthなしで呼び出し可能、1.1:全て必須

期限
・1.0は、3/5>6/11に廃止(at SF time)

移行
・twitter4j(Java):バージョン3.0.xに切り替え>コンパイルエラーをつぶす
・他言語:エンドポイントのバージョン部分を1から1.1にかえてエラーをつぶす


■Twitter Cards
・tweetにメタ情報、付加情報を埋め込む為の仕様
・140文字以外の文章として出してくれる
・例:webページURLをはるとそのページのアイコンが自動で表示
・例:SlideShare、tweet内にスライド

方法
・webページにmetaタグで埋め込む
・twitter:card, summary photo, player

Twitter CardsとOpen Graph
・twitter cardsはopen graphがベースになっており、だいたい一緒
・基本のメタ情報(url, title, description, image...)はopen graphを設定しておけばtwitter cardsとして表示される(twitter:cardは必要)

事前申請が必要
・open graphは普通は不要(Facebookなど)
・twitterの申請ページからフォーム入力して申し込み
・期間は数日から2週間くらい(申請確認メールに返信すればチケット作られるのでやってくれるはず)
・何故必要なのか
 ・tweetが多いので全URLに反応してクロールするのは高コストなため事前申請(ほぼ登録みたいな感じ?)にしている

>webを展開するなら、Twitter Cardsは対応しておいた方が良さそう。tweetへの追加情報の表示は魅力的


■なんとなくわかってきたtwitter APIとのつきあい方(小宮さん)
・twitter4jを使ってツイートをDBに蓄積するにあたって、実際のなま情報
・仕様と違うとか
・注意するポイント6点

1)アプリケーションの登録に注意する
・WebSite:twitter.comドメインとかいれといてAPIをはげしくつかうと、アプリケーションのstatusがsuspendedになって、アプリケーションも削除できずどうにもできなくなる

2)絵文字に負けない
・絵文字(UTF-8外字)を含むテキストをVARCHAR(140)に保存すると文字数オーバ
・絵文字を保存する際は、MySQLならcharsetをutfmb4にする必要があり、絵文字1文字につき4文字分消費するので、560にする必要がある

3)NULL文字に負けない
・時々tweetにNULL文字が紛れ込むことがある
・NULLは除外する方がよい

4)NFD/NFKDに負けない
・UNICODE正規化:発音記号等を1バイト文字2文字で表現するような分解

5)ユーザが常に存在するとは限らない
・search/tweetsのstatus["user"]が存在しないことがある

6)screen_nameが15文字であるはずがない
・サイトには15文字と書いてあるが、過去に20文字許されてた時期があった。


■家族フォト
MVP(mininum valuable product)
・最小構成でサービスをリリースする
・その後仮説と検証を経てよりよいものにつくってく

ベネッセとデジタルガレージの協業
・2ヶ月でweb, iOS, Android向けアプリを出さなきゃなかった
・APIは自社json(HTTPS)、bgはappEngine
・appEngineではSSLを使う際、金払った実績がないと利用できない制約がある
・appEngine:dbモジュールからndbモジュールに変更:modelで定義してるものは自動でmemcacheでキャッシュを利用してくれる
・スマホアプリは基本APIをたたく。
・PhoneGapを使った(iphone4あたり少しもっさりだが、一般のユーザはそんな気にしない)
・sharp端末で不具合頻発、あとandroidでは画像の保存ディレクトリが端末によって違ったりした
・phonegapはhtml+css+jsで開発しやすかった

仮説と検証
・DL当日しか使ってないユーザは30〜40%
・週1以上起動ユーザは約半数


■Acitivity body (fitbit API)(朝倉さん)
・アクティビティトラッカー

fitbit feature
・歩数
・移動距離
・消費カロリー
・上位機種は、階段上り下りや睡眠時間なども記録可能

Fitbit API(json or xml)
・userinfo
・body measurements(体組織:体重、慎重)
・Activities(歩数とか)
・利用
 ・要ディベロッパー登録

Third party libs
・ruby, php, .net, java


■飯テロのススメ(美馬さん)
・twitter日本語で、一番つぶやかれる時間は0時
・おやすみが一番いわれるのは23:50分くらい


■Application-only authentication
・ユーザの認可を必要とせずに、twitter APIにアクセスできるようになる認可方式
・tweet投稿や、フォロー等の操作に依存するAPIは使用できない
・一部APIのレートリミットは大きく緩和されている。search/tweetsは+270回、friends/list・folloowers/listは+15回

twitter4jでの実験的な利用方法
・OAuthコンシューマーキーを作る
・twitter4j.propertiesを編集する:consumerkey, consumersecretの設定、useSSL=true(3.3.4以前)、enableApplicationOnlyAuthentication=trueにする
・twitter.getOAuth2Token();を呼び出すとA-oAが適用になる


■だれとくアプリからSNS活用への道(佐藤さん)
・秋葉の雁川という中華料理屋のアプリ
・そのおすすめアプリサービス(androidアプリ)
・twitter, Facebook, mixi, forsquareへ同時投稿や行ったときのチェックインを一括で行うアプリ
・twitter ->twitter4j, forsquare->forsuqare-api-java
・mixi, facebook ->SDKが多機能だったので独自に利用部分だけ実装
・公開後1年たったら公式アカウントからキャンペーンに使いたいという連絡が来た>杏仁豆腐おごってもらった。



その他メモ
・twitterのAPIが1.1になって、tweetを集めるのはやりやすくなったが、フォロワー関係を取得しづらくなっている
・3時間で128ツイート、1日に1024ツイートで規制。メンションしまくりでsuspended


2013年2月22日金曜日

修正BSD, MIT, Apacheライセンスのライブラリを使ってスマホアプリを作る場合の対応

以下のライセンスのライブラリ等を利用しスマホアプリを作成、配布(公開)する場合。正しいかどうかはわかりません。。。

エンドユーザ向け表示


修正BSDライセンス、MITライセンス

・ライブラリのソースファイル内ヘッダコメントやREADME等にあるライセンス表記を、ライブラリ名とともにそのまま表示する。
※無い場合はライブラリ名、著作権表記(無ければライブラリ所在URLとか?)、免責事項を含む一般的なライセンス表記を表示
※アプリ上の設定等にライセンスについてや著作権表示みたいな専用の画面を作ってそこに記述するのがオーソドックス

Apacheライセンス

・ライブラリ内にNOTICEファイル等帰属告知やライセンス表記があるものがあればそれをそのまま表示する
※無ければApacheライセンスのテキストとライブラリ名を表示
※上記同様専用の画面を作る


開発ソース

修正BSDライセンス、MITライセンス

・ライブラリ上に記載される著作権表記等はそのままにする

Apacheライセンス

・ライブラリ上に記載される著作権表記等はそのままにする
・ライブラリを改変する場合はその旨を上記著作権表記あたりに追加記述する


参考

Wikipedia - MITライセンス
Wikipedia - BSDライセンス
Wikipedia - Apacheライセンス
BSDライセンスの特徴:BSDライセンスが適用されたソフトウェアを商用利用する場合の注意点を教えてください。またMITライセンスとの違いも教えてください

2013年1月11日金曜日

webView:shouldStartLoadWithRequest:navigationType:でloadRequestするとPOSTがGETになる

UIWebViewで全リクエストのリクエストヘッダを追加変更したい場合は以下の方法が利用できる。
Custom HTTP headers for every request made in UIWebViews - Nomad Planet

ヘッダを追加変更して独自にloadRequestをし、NOを返す(呼び出し元のloadRequestキャンセル)ことでヘッダの追加を実現している。

ただし独自loadRequest時も再度webView:shouldStartLoadWithRequest:navigationType:が呼ばれる為、無限ループを避けるような処理が加えられている(ヘッダあるなしでの分岐)

問題は上記方法ではPOSTリクエストにならない


おそらくUIWebView内部の問題だが、webView:shouldStartLoadWithRequest:navigationTypeでリクエストオブジェクトを変更して再度loadRequestすると何故かPOSTがGETになってしまう。(再loadRequest直前はPOSTのままなのに。。)
元のPOSTリクエストオブジェクトを設定してloadRequestを呼び出しても同様だった。


解決策

以下の方法を使う。
UIWebViewでUser-Agentを変更する - 武之新

隠しDelegateであるUIWebViewWebViewDelegateのメソッドuiWebView:resource:willSendRequest:redirectResponse:fromDataSource:を実装することでリクエストヘッダというかリクエストオブジェクト自体の変更が可能。
実装対象のクラスがUIWebViewDelegateプロトコルを継承していればあとは上記uiWebView~メソッドを実装するだけのお手軽さ。


というか、リクエスト前にその内容をいじれないなんてどうなってんの?甚だ疑問
そして上述のブログでも述べられているがこれでappleの審査通るかは不明。ググってみたけどそれらしき記述は発見できず。

追記)審査通った2013前半頃

2012年12月27日木曜日

Macbook AirのWifiが途切れる問題と対策

色々設定してみたけど効果なかった。結局WifiをOff/Onするしかない。なのでできるだけそれを簡単にできるようにキーボードショートカットに登録する。

方法

  1. Spark(キーボードショートカット設定ツール)のインストール
  2. Apple Scriptを書いて登録

sparkのインストール

howtohttp://d.hatena.ne.jp/foldrr/20111102/p1

dmgだぶるクリック>なかにあるspark.appをアプリケーションディレクトリにD&Dでインストール完了

ダブルクリック>表示のAll Application をクリック>右隣リストのApple Scriptをダブルクリック>ショートカット入力+適当な名前+Sourceタブに以下をコピペ>ボタンcreate

Apple Scriptの内容

try
  do shell script "networksetup -setairportpower en0 off"
  do shell script "networksetup -setairportpower en0 on"
on error
  display dialog "cannot work." buttons {"ok"}
end try

※spark daemonが起動してない場合はspark画面下部のdaemonなんちゃらをクリックして起動

※上記en0は、場合によってはen1かも?terminalでifconfigしてみてipの表示されるネットワークを確認


2012年8月19日日曜日

phpでのURLエンコード、デコード

結論

エンコードはrawurlencode()
デコードはurldecode()
関数を使う。

エンコード

rawurlencode
 RFC1738に準拠したエンコードを行う。
 半角スペースを「%20」に変換

urlencode
 ブラウザからのformポストなどはこのエンコード方式。
 (application/x-www-form-urlencoded形式)
 半角スペースは「+」に変換される。

APIなどへのアクセスで利用するエンコード方式はRFC1738系が多く、amazonのAPI等ではRFC1738に準拠してないデータはエラーになる。下記デコード時の理由等もあり、エンコード時はrawurlencodeを使う方が無難。


デコード

逆にデコードの場合はrawurldecodeはRFC1738での動作しかしない為、「+」が半角スペースにデコードされない。
urldecodeでは%20も+も半角スペースに変換される為、デコード時はurldecodeが無難。

2012年8月8日水曜日

mysqlで複数行のあるカラムをインクリメントしつつ更新


> set @incr = 1;
> update some_table set some_column = @incr := @incr+1;


8.4. ユーザによって定義された変数
http://dev.mysql.com/doc/refman/5.1/ja/user-variables.html

というかそのまんまの内容があった。。

Set iterative values in rows of a table
http://stackoverflow.com/questions/6352705/set-iterative-values-in-rows-of-a-table

2012年8月7日火曜日

phpで$hoge->fuga['ok'] = 1;を可能にする方法

結論:__get()の& 参照渡し が重要
class A {
    private $_data;
    public function __get($name)
    {
        return $this->_data[$name];
    }

    public function __set($name, $value)
    {
        $this->_data[$name] = $value;
    }
}

$a = new A;
$a->hoge = 1;
echo $a->hoge;  // 1

// 以下はエラーにはならないが、期待通りに動かない
$a->hoge['a'] = 1;
echo $a->hoge['a']; // null

// 上記は一度ゲッター(__get)から$_data['hoge']を引き出す際に
// コピーしてから['a']=1を設定してるので、インスタンス内の変数に影響を及ぼせない。
// リファレンスを使う。
class B {
    private $_data;
    public function & __get($name)
    {
        // メソッド定義時の"&"により返り値が参照返しになる
        return $this->_data[$name];
    }

    public function __set($name, $value)
    {
        $this->_data[$name] = $value;
    }
}
$b = new B;
$b->hoge['a'] = 1;
echo $b->hoge['a']; // 1
ただし副作用として思わぬところでデータを変更しちゃうかも。 使い分けが重要か。