XMLの取り扱い
APIを色々いじっている最近ですが、ついにXMLに出会いました。
JSONと勝手が違い躓いてしまったんで、記しておく。
1. file_get_contentsではなくcurlを使う。
htmlheaderにアクセストークンを仕込んでJSONと同じようにfile_get_contentsで一発だぜと思っていたのですが、どうしてもうまくいかない。curlを使って解決。
$url = 'https://product-search.api.cj.com/v2/product-search?'.
'&keywords='. rawurlencode($_GET['keywords']);
$curl = curl_init($url); // 初期化
$options = array(
//HEADER
CURLOPT_HTTPHEADER => array(
"Authorization: トークン",
),
//Method
CURLOPT_HTTPGET => true,//GET
);
//set options
curl_setopt_array($curl, $options); /// オプション値を設定
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);$result = curl_exec($curl); // リクエスト実行
$result2 = simplexml_load_string($result);
2. XML Objectを配列にパースする
ここで、$resultには、XML Objectという形でデータが入っています。foreachで値を取り出せるかなと思いきや、ダメでした。JSONを経由させて配列にかえます。
$json = json_encode($result2);
$array = json_decode($json,TRUE);
これで配列になりました。もーみんなJSONでいいじゃん。。
JSONの扱いかた
APIでデータを引っ張ってくるとたいがいJSON形式で返ってきます。JSONデータをサーバーサイド(php)で扱う場合と、フロントサイド(javascript/ Jquery)で扱う場合をまとめます。
JSONをPHP内で扱う
$api = file_get_contents(APIのURL); //この時点ではstring型のjson
$arr = json_decode($api); //ここで、String型のjsonがArray,配列になる
foreach($arr as $value){
}; //配列をまわして値を取り出して行く
JSONをjsで扱う
$.ajax({
url: "insta_hashtag.php", //PHPファイルのURL
type:"GET",
dataType: "json", //apiで返ってくるデータの形式を指定}).done(function(data){ //通信成功時の処理
$.each(data,function(i,item){
//配列をまわして値を取り出して行く});
}).fail(function(){ //通信失敗時の処理
}).always(function(){ //通信完了時の処理
});
foreach, $.eachを活用して効率よく抜き出して行くことが重要です。
Facebookリード獲得広告とウェビナーを繋ぎこむ準備
3週間のアメリカ出張兼新婚旅行からシンガポールに帰国しました。インド旅行から帰国した週からアメリカだったので、ようやくお家でホッとしています。
最初の2週間は出張でベイエリアにいました。一緒に旅行にも行く本当に尊敬していた本社の同僚が起業するために退職を決めていたり、ベイエリアにやよい軒がオープンしていたり、良い刺激をもらいました。最後の1週間はお休みをとり、奥さんとフロリダのディズニーワールド、ユニバーサルスタジオを回り、ニューヨークでラーメンを食べて、NYUのMBAに行っている大学院同級生と金融業界で働く学部同級生と、楽しい時間を過ごしました。どんどん、自分の周りが世界に羽ばたいていて、これまた良い刺激をもらいました。
さて。
私は、B2Bマーケティング部署に所属しているのですが、ウェビナー(オンラインセミナー)はグローバルで重要なチャネルです。
弊社では、CITRIXのGoToWebinarを使っています。いつのまにか日本語にも対応していますね。
Web ミーティング | GoToMeeting™ Japan
ウェビナーでは参加者の数がKPIとなるわけですが、広告を走らせて参加申し込みページに遷移させる施策では、途中でドロップしてしまう人が多くなってしまいます。
デジタル広告->クリック->参加登録ページ->申し込み
たとえばCTRが1%、申し込み率が10%だとすると、1000人に1人しか申し込みしてもらえません。
そこで、Facebookのリード獲得広告とGoToWebinarを繋ぎ込めば、Facebookから外へ遷移せずに申し込みが完了します。
ここでハマったポイントとしては、
CITRIXのdeveloper pageを見ると、linuxのサンプルコードは書いてあるが、phpのコードが載っていない。
例えば、LinuxのPOST通信。
curl -X POST -H "Accept:application/json" -H "Content-Type: application/x-www-form-urlencoded" "https://api.citrixonline.com/oauth/access_token" -d 'grant_type=authorization_code&code={responseKey}&client_id={consumerKey}'
これを解読してPHPに書きなおしました。
//青色のところは、都度変える
$url = 'https://api.citrixonline.com/G2W/rest/organizers/{organizerKey}/webinars/
{webinarKey}/registrants?resendConfirmation=true';
$headers = array(
'Content-Type: application/json',
'Accept: application/vnd.citrix.g2wapi-v1.1+json',
'Authorization: OAuth oauth_token={access token}'
);$regist = array(
'firstName' => 'taro',
'lastName' => 'yamada',
'email' => 'taro@yamada.com',
'jobTitle' => 'Marketing Manager',
'organization' => 'taroyamada.inc',
);$options = array(
'http' => array(
'header' => implode( "\r\n", $headers ),
'method' => 'POST',
'content' => json_encode($regist)
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
Learnings
1. Facebookアプリでもそうですが、アプリがユーザーの情報にアクセスするためには、access tokenをその都度もらわないといけない。(それぞれの家の鍵みたいな)
2. phpでcurlをつかってhttp通信できるが、使わなくてもできる
3. phpでPOST送信するときに、JSONなのか、 クエリ文字列なのか、受け取る側のデータ型に合わせないといけない。GoToWebinarはJSON指定でした。
JSON:json_encode()で、ArrayをJSONに変換する
クエリ文字列:http_build_query()で、Arrayをクエリ文字列に変換する
クエリ文字列(URL-encoded query string)は、よく広告計測で使われる data1=neko&data2=inu みたいな文字列です。
雑感
自分のチームのためにつくるならば、難しくないのですが、これを一般化=製品化するとなると複雑になってきて難しい。そろそろプロダクトアウトしたいです。
参考コード:
Delhi Bellyならぬ、Goa Belly。SMS API良い感じ。
金曜の夜からインドに来ています。
ムンバイで一泊して、南下したところにあるゴアというリゾート地に来ています。
会社の同僚で僕の結婚式にも来てくれたイギリス人男性とインド人女性の結婚式です。社内婚。招待客もみんな友達でとっても居心地の良い結婚式のはずが、昨夜からずっと下痢。もはや水。なんかザリガニの匂いする水。もともと、Delhiに行った欧米人がみんな下痢するっていうことで、”インドでする下痢”は英語で、Dehli Bellyといいます。というわけで、僕はGoa Belly。
前回のインド出張でもやっぱりずっと下痢でした。インドとは本当に相性が悪いらしい。あーシンガポール帰りたい。明日の深夜便で帰ります。
さて、先週、面白いAPIを見つけました。
シンガポールのチリクラブで有名なジャンボや、夜景の綺麗なバーLevel 33で予約をすると、電話をかけた携帯に予約確認のSMSが飛んできます。また、予約日になるとリマインダーSMSも飛んできます。
これ、どうやっているんだろうということで調べてみたら、いろいろありました。そんななか、シンガポール企業が提供しているSMSのAPIを使ってみました。
CommzGate Cloud SMS - SMS Gateway with Push Messaging
無料で、自分のアプリに入れて使うことができました。
番号を持たないでSIMカードとメッセージアプリで通話をする尖った友人もいますが、大多数は番号をもっているわけで、E-mailにくらべて、appのpush notificationとSMSは、re-engagementにおいて結構使えるんじゃないかなと思ったりします。ただ、appのpush notificationは、アプリをユーザーの携帯にインストールしてあることが前提。
SMSの難点は、開封率がtrackingできないことと、communicationがTextだけということ。
しかし、そもそも開かれないE-mailよりはずーっと良い気もします。
トイレに宇宙を描く俺。嫁は優しく天体観測。
キャリアを考えた
昨日、シンガポールのMBAに合格が決まった友人のキャリア相談にのってきた。自分の中での気づきも多く、人と話をするのは大事だなと。そしてやっぱり頑張る人は好きだなと。
さて、キャリアとは掛け算だといろんな人が言っています。
自分の価値をかけ算して「レアな人材」になれ 2014年、絶対やるべきことリスト[2]:PRESIDENT Online - プレジデント
自分のケース:
グローバル×マネージメント×セールス&マーケティング×プログラミング
グローバル:外資系企業の海外オフィスで日本市場とは関係ないところで戦っている。日本人という下駄が一切使えない環境。
マネージメント:インド人とシンガポール人の部下。
セールス&マーケティング:前職でB2Cのマスマーケティング、現在の会社でセールスを経て、デジタルマーケティング部署の立ち上げ責任者。
プログラミング:webアプリ、 iOSアプリ計測ツール開発。
しかし、どこまで行っても中途半端感が否めない。
グローバル:結局今でも、ネイティブが幹部の殆どを占めており、英語とリーダーシップじゃ全然敵わないと思ってる。
マネージメント:結局いまの部下は、年下だし、欧米のがちネイティブではない。年上、ネイティブをしっかりマネージメントできるのか。
セールス&マーケティング:本気のセールスほど人脈はない。マスマーケティングは離れて久しい。デジタルマーケティングに関しては、絶対誰にも負けない自信はある。
プログラミング:弊社本気プログラマーには遠く及ばない。その辺の中途半端な文系のプログラマーには負けないとは思ってる。
転職市場での話:
日系企業からの転職オファーは、給料、ポジションともに下がるケースが殆どである。扱いづらいキャリアなんだと思う。本当に舐めたオファーが多い。
外資系からの転職オファーは、完全に日本市場と関係なく、韓国、中国、香港と様々なところからデジタルマーケティング領域のマネージメントポジションでのオファーは多い。
自分のキャリア観:
人生観は置いておいて、キャリア形成において、価値を築く時期と、価値を売っていく時期があると思っている。一度、自分の価値を売るフェーズに入ると、そこから価値を上げることは難しい。転職し続けてずっと、なんとかマネージャーのまま40歳過ぎちゃうパターン。サラリーマンでも20代、30代の年収500万円の差なんて生涯賃金の中では小さくて、40代超えてからの給料差は数千万円はひらく。でも、結局サラリーマンの上限なんてたかが知れていて、IPO、投資などでジャンプ過程を狙わないと富裕層にはなれない。
じゃーどうするのか:
準備を怠らず、チャンスを伺ってビジネスを仕留めにいきます。
良い人生を送るためには?
イシューからはじめよ。デバッグする。
明けましておめでとうございます。Happy Lunar New Year!!
シンガポールは旧正月のため、2/8,9はお休みとなり四連休です!Kindleでキングダムを読み始めたら、one clickで購入できてしまうので、この土日ですでに30巻まで読んでいる。プログラミング、漫画、飲み会、最高の休日です。
さて、コードを書くうえで、いかにデバッグを効率的にやるか。今更かって感じですが、とても重要だなと思っています。プログラムが動かないときは、まず、どこが原因かを探さなくてはいけません。この原因を取り除くことをデバッグ、バグを取り除くといいます。すべては問題発見から。 イシューからはじめよ !!
phpのときに使えるデバッグ方法
1) echo: ブラウザでURLを叩くと画面に表示される
echo ();
2) var_dump: 指定した式に関して、その型(String/ Arrayとか)、値を含む構造化された情報を返す。引数に入ってる構造がわからないときに使うと便利。
3) mail: メールで送れる。処理途中をブラウザで確認できないときに便利
mail('アドレス', 'title', '本文');
4) impode: arrayをstringに強制的に変換する。var_dumpでarrayで中身が見れないとき、impodeで中身をみる
5) nullチェック。例えばPOST/ GET通信でデータを受け取るときに、ちゃんと値が受け取れているかの確認
if(!isset($data)){
echo "null";
} else {
echo ($data);
}
Linuxコマンドなど。
普段は挨拶くらいの関係だった同僚のシンガポール人エンジニアと、今日がっつり仲良くなることができました。国籍の異なるガチなエンジニアとの共通の話題は、プログラミングくらいしかないので、プログラミングの勉強して本当に良かったなと。
彼の横でde-bugの作業を見ていると本当に勉強になります。あとちゃらいエディター使わずにターミナルで高速でコード書いていくのがカッコイイ。モエたぁぁ。
コマンド
sudo: 指定したユーザーでコマンドを実行する
cd: ディレクトリ間を行き来する
cd ../ : 一つ上のディレクトリへ移動
ls: 現在いるディレクトリの中身を表示
pwd: 自分がどのディレクトリにいるかの確認
vim ファイル名: ファイルを作成
sudo vim ファイル名: ファイルをターミナル内で編集。sudoは、スーパーユーザー特権発動時。
xxx$ cd ~/Desktop/LeadAds/ : 移動
:wp : 開いているファイルを保存して終了
JSON神ツール
The Fastest JSON visualizer - 最速のJSON可視化・解析ツール
Mac OS-XでローカルにApacheサーバーをつくる
Start an Apache Web Server in Mac OS X Mavericks & Mountain Lion | OSXDaily
Facebook PHP SDK
facebook/facebook-php-ads-sdk: An SDK built... - GitHub