シリコンバレーのマーケター日記

東京、シンガポールを経てシリコンバレーで働く、マーケター。英語、プログラミング、データ分析は次世代マーケターの必須スキルだと信じて進む。

CocoaPods②:使う

完全に中間管理職なもので、上司の上司のアメリカ人、上司のオーストラリア人、部下のインド人の中での力学が最近あまりうまく機能していません。結局、直属の上司よりも最終的に組織のトップにどう思われるかが重要なんだなと、思っています。めんどくせー。プログラミングが気晴らしになってる笑

 

昨日はターミナルでCocoaPodsをインストールするところまでいきました。今日は実際にCocoaPodsを使ってみようと思います。

CocoaPodsを理解するために、まずCocoa (Touch)を理解する。

Cocoa (Touch)とは

iOSを構成する4つのレイアーの最上位に位置する。iOS用アプリを作成するうえでキーになるフレームワークから構成されている。このレイヤーの中心となるのが、UIKitフレームワーク。

CocoaPodsとは

"CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over ten thousand libraries and can help you scale your projects elegantly. CocoaPods is built with Ruby and is installable with the default Ruby available on OS X. "

"Swift/ Objective-CのCocoa(Touch)プロジェクトのためのライブラリ管理ツール。一万を超えるライブラリーがエレガントにあなたのプロジェクトを手助けします。CocoaPodsはRubyで構築されており、OS XにはRubyがデフォルトでインストールしてあるぜ" 

 ということらしいのだが、いまいち腑に落ちないので使ってみる。

1. xCodeのプロジェクトのディレクトリまで行って、以下のコマンドを叩く

$ pod init 

2. Podfileというファイルが生成されるので、そのファイルをtext editorで開く

f:id:yuyutata:20160119010644p:plain

3. プロジェクトにインストールしたいライブラリー名を以下のように付け足す(ここでは”SwiftyJSON”を入れてみる)

4. user_frameworks!を以下のように追加

use_frameworks!

target 'Cocoa_Test' do

pod 'SwiftyJSON'

end

target 'Cocoa_TestTests' do

end

target 'Cocoa_TestUITests' do

end 

 4. ターミナルで実行

$ pod install 

 5.  フォルダに新しく.workspaceファイルができているので、これを開く

f:id:yuyutata:20160119012732p:plain

無事、SwiftyJSONライブラリーがxcodeのプロジェクトファイルに入っていました。

 

総括

ようは、以前Google News APIをつかったアプリの記事のときに、GitHubでダウンロードして、プロジェクトファイルへコピペしていたところを、ターミナルから一発でできるぞ。ってのが、CocoaPodsのメリットと理解しました。めっちゃ便利やん!とまでは身に染みていませんが、謎が一つ解明されて良かったです。

CocoaPod①:未知との遭遇。インストールする。Inuxのコマンドも。

今日見つけたアプリ計測ツールのSDKを導入しようと思ったら、以下の表記。

Installing the SDK via the iOS CocoaPod automates the majority of the installation process for you. Before beginning this process please ensure that you are using Ruby version 2.0.0 or greater.

CocoaPodって、Rubyってなんだ。ということで2016年も未知との遭遇。

  • CocoaPodは、iOSアプリ向けのライブラリーを管理するもので、Rubyで書かれている
  • Macには最初からRubyが入っている
  • CocoaPodのインストールはターミナルを使って行う
  • ターミナルとは、UNIXベースのMac OSをコマンドラインを叩くことでコントロールするためのアプリケーション

ということがわかったので、まずはターミナルの勉強。ようは、マックブックさんとの意思の疎通をマウスを使わずにコマンドを打つことで行うということでしょう。

f:id:yuyutata:20160118013619p:plain

 

sudo: 指定したユーザーでコマンドを実行する

cd: ディレクトリ間を行き来する

cd ../ : 一つ上のディレクトリへ移動

ls: 現在いるディレクトリの中身を表示

pwd: 自分がどのディレクトリにいるかの確認

vim ファイル名: ファイルを作成

sudo vim ファイル名: ファイルをターミナル内で編集

 

1. まずはMacに入っているRubyのバージョンを確認

以下のようにコマンドを叩くと

$ ruby --version  

結果がでました。2.0.0だったのでひとまずok。

koko 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14] 

2. Rubyを最新のものにアップデート

Rubyをアップデートするには、以下のrbenvというコマンドをつかうようだが、そのためには、Homebrewをインストールしていないといけないらしく。わけもわからず、以下のページからコマンドをターミナルにコピペする。

Homebrew — OS X 用パッケージマネージャー

そして、以下のコマンドを打つと、無事にバージョン 2.1.2のRubyをインストールできました。

$ rbenv install 2.1.2

 

2.CocoaPodsをインストールする

Rubyを使うと簡単にパッケージをインストールすることができるそうです。公式サイトの手順に従ってやってみます。

sudo gem install cocoapods

sudo: パソコンに設定しているpass wordが求められます。

gem install: Ruby用のパッケージ管理システムであるRubygem(ジェム)のコマンドで、簡単にインストールできる。コマンド一覧

 

総括

できました。が、インストールできたのは良いものの、いまだCocoaPodsがなんなのか全くわかっていません。未知と遭遇しても怯まない精神力は2015年の収穫です。しゅくしゅくと。

乱数でCookieIDを付与してデータベースに保存する

やりたいこと:クッキーIDを乱数で付与して、データベースに送る

Step.1: 0-1,000,000の乱数を発生させて、Cookieのvalueに入れる

function cookie() {
var val = Math.round( Math.random()*1000000 );
$.cookie('NAME',val, {expires:1,path:'/'});

Step.2: 作ったIDをひとまずtext boxに入れる

HTML

    <input type="text" name="cookie"> 

JavaScript

function view() {
$.cookie('NAME');
var value = $.cookie('NAME');

$("input[type=text][name=cookie]").val(""+value+"");
}

 

Step.3: IDをAjaxを使ってphp経由でデータベースに格納する

HTML

    <button>Submit cookie!</button> 

JavaScript

<script>
$(document).ready(function(){
$('button').click(function(){
$.ajax({
url: "cookie_reciever.php",
type: 'GET',
data: {

value: $("input[type=text][name=cookie]").val(),

},
})
.done(function(data){

alert(data);

})

.fail(function(data){
alert('ajax fail');
});
return false;
});
});
</script>

Step.4: Phpで、クッキーIDを受け取って一応、データベースにないか確認をして無ければ、新たに格納する

<?php

mysql_connect('localhost','root','root') or die(mysql_error());
//echo 'database connected';
mysql_select_db('Cookie_test') or die(mysql_error());
//echo '</br>Database HPM selected';
mysql_query('SET NAMES UTF8');

$value = $_GET['value'];

echo "'$value'";

$result = mysql_query('SELECT * FROM Cookie1 WHERE value="'.$value.'"');

$count = mysql_num_rows($result);
if(!$count) {

$sql = "INSERT INTO Cookie1 (value) VALUE ('$value')";
mysql_query($sql);

} else {

$emparray = array();

while ($data = mysql_fetch_array($result)){

$emparray = $data;

}
echo ("すでに存在しています");
}
?>

 以上です。

以下のように、テキストボックスに乱数で発生させたクッキーIDを入れて、"Submit Cookie!"ボタンを押すと、Ajaxを使ってphp経由でデータベースに格納されます。

f:id:yuyutata:20160116201638p:plain

もしも、すでにそのクッキーIDが存在している場合は、以下のようにアラートがでます。

f:id:yuyutata:20160116201902p:plain

 

総括

久しぶりでしたが、意外と手が動きました。今はまだcookie IDひとつしかやり取りしてませんが、ここから送る・受け取る値が増えるとJSON形式でやり取りしなくてはならないので、ハマりそうでちょっとこわいー。では、夕飯に行ってきまーす。

 

次回やりたいこと

クッキーがすでにあるか、クッキータグをブラウザから抜き出して条件分けする

  • If yes: 既存クッキーIDと閲覧URL, 閲覧時間などの情報をDBに入れる
  • If no: 新規クッキーIDを付与する(乱数でクッキーIDをつくって、DBにかぶってないか確認し、かぶっていれば再度、乱数でクッキーIDを吐く)

 

jqueryでcookieを扱う

明けましておめでとうございます。

2週間の帰省からシンガポールに戻ってきました。外資系は、クリスマス前からがっつり休暇を取る分、年始はすぐに仕事モードとなり1月はとても慌ただしいです。忙しくなる要因は、1)予算配分と2)成績評価です。

1)予算配分

2016年のアジア地域のプライオリティと各国のマーケティングプランを基に予算を配分していきます。各チームが予算を取り合うのでしっかりとしたロジックが必要になります。私もデジタルマーケティング予算の配分をしていますが、TVなどのトラディショナルメディアと異なり、キャンペーンのパフォーマンスを見ながらいつでも予算再配分ができてしまうので、あまりガチガチに分配すると全体最適ができなくなります。

基本的なロジックは、昨年の国別、用途別の割合を基に、ざっくり配分しています。

2)成績評価

2015年の成績評価を360度で行うのですが、360度評価のデメリットとして、部下だけでなく、上司、同僚と沢山の人の評価をしなくてはいけません。またマーケティングの場合、KPIが明確でない場合もあるので、ひたすら英作文でした。

 

11月は統計の復習をしていましたが、12月は日本出張、正月帰省と、日本にいる期間が長かったので、勉強から遠ざかってしまいました。習慣を戻さなければ。

先輩、同僚、大学の親友、日本にいる嫁、家族など沢山の人とcatch upできて、みんな頑張りながらも踠いているんだなぁ。と、しっかり自分を見失わないで一歩一歩前進しなければーと改めて思いました。

 

さて、今日は仕事でcookieの扱いについて少し議論があったので、cookieについて。

 

やりたいこと:cookieをブラウザに付与して、付与したcookieを引っ張って表示する

Step.0:cookieを理解する

以下は、私の使っているChromeブラウザの詳細設定から、自分のブラウザに記録されているクッキーを確認しています。例えば、500startups.comというサイトに1月8日に訪問しており、そのときに、"_ga"というNameのcookieが記録されました。ちなみに"_ga"はgoogle analyticsのタグです。"GA1.2.1324036804.1451751625"が僕のブラウザに付与されたユニークなID(Content)になるわけです。そしてそのクッキーは2年後の2018年1月まで残るように設定されています。

f:id:yuyutata:20160115015927p:plain

つまり、cookieを付与するときは、Name(タグの名前), Content(ID), Expires(有効期限)の情報が最低必要となります。Pathの"/"は、そのドメインのページならどこからでもこのcookieにアクセスできます。

というわけで、早速cookieを付与していきましょう。

 

Step.1:jqueryから操作できるcookie用のプラグインを入手する

JavaScriptで自分で書くこともできると思いますが、JSのライブラリであるjqueryが便利過ぎたので、そのGithubからダウンロードする。ページ右上のzipをポチる。

Step.2: ダウンロードしたJSファイル、”jquery.cookie.js”をページと同じフォルダーに入れる

f:id:yuyutata:20160115020741p:plain

Step.3: htmlファイルに記述する

オブジェクト指向チックに書いてみます。

<script src="jquery.cookie.js"></script>   

<script>

function cookie() {
 $.cookie('NAME','VALUE', {expires:1,path:'/'});
}

function view() {
 $.cookie('NAME');
 var value = $.cookie('NAME');

 $("div").text(""+value+"");
}

$(function(){
 cookie();
 view();
});

</script>

説明していきます。

$.cookie('NAME','VALUE', {expires:1,path:'/'});

NAMEというタグ、VALUEというIDを、有効期限1日で、ドメインならどのページからでもアクセスできる設定でクッキーを付与する。

 $.cookie('NAME');

 var value = $.cookie('NAME');

NAMEという名のタグのついたcookie情報を取り出して、そのcookie情報をvalueという名の変数に格納する。

 $("div").text(""+value+"");

valueに格納されたcookie情報を、htmlに表示する。

 

Step.4:確認する

Chromeの詳細設定から、localhostという私のローカルのドメインから付与されたcookieを確認します。以下のように、確認できました。ページにもちゃんと表示されました。

f:id:yuyutata:20160115015619p:plain

 

今後やりたいこと

  • cookieがすでに付与されているか、されていなければ新しいcookieを付与する
  • 新しいcookieはランダムで生成されたユニークなID

週末にやってみようと思います。

おやすみなさい。

機械学習の学習を開始する:尤度比検定

11月、12月は機械学習(machine learning)の学習に費やそうと思い、早速、統計の復習から開始しています。

学部時代はオペレーションズリサーチの研究室に所属し、確率と統計に時間を費やしていたのですが、大学院、サラリーマン生活でだいぶ遠くなってしまっていました。

というわけで、以下の本を読み進めています。

統計ソフトRで実際に手を使いながら、読み進められるこの本は本当にオススメです。

学生時代にこの本に出会えてたら良かったなぁ。。

第五章の尤度比検定をまとめます。統計モデルを比較してモデル選択をする。

帰無仮説(null hypothesis)とは「棄却されるための仮説」であり、「無に帰される」ときにのみ、その役目をはたす特殊な統計モデル

 P値( P Value)は、第一種の過誤をおかす確率であり、その扱いは、

  • P値が大きい:これくらいの逸脱度の差(尤度比の対数)はよくあること ー> 帰無仮説棄却できない
  • P値が小さい:この差は珍しい! ー> 帰無仮説を棄却して残ったモデルを正しい!と主張しよう

 ここで、

逸脱度:あてはまりの悪さ

逸脱度の差:ΔD1,2 = -2 * (log L1 - Log L2) 

L1:帰無仮説

L2:対立仮説

逸脱度の差の解釈:対立仮説による改善度。その差が意味のある差か。

第一種の過誤(type 1 error):帰無仮説が真であるにもかかわらず、逸脱度の差が大きいから帰無仮説は正しくないとして、棄却してしまう過誤

 

逸脱度の差が”めったにない差” (=第一種の過誤は起きない可能性大)ー> 意味がある差 ー> 対立モデルが正しい

 

P>=α:帰無仮説は棄却できる

P<α:帰無仮説は棄却できる

ここで、αは、自分で勝手に決める。たとえば、α=0.05ならば20回のうち1回より少ない発生件数だから、”めったにない差”なので”意味のある差”だから、対立モデルによって改善されていると言える。

 

9月10月総括 シンガポール支社からみたシリコンバレー本社

だいぶ時間が空いてしまいました。9月、10月で思い出に残っていること

  1. シリコンバレーにあるアメリカ本社への出張
  2. 部下が入社3ヶ月で辞表書いてきた
  3. 新婚生活がはじまった
  4. JavaScript, Jquery, Ajaxはひとまず理解できたかな感

1. シリコンバレーにあるアメリカ本社への出張

本社へは年に1度は必ず行くようにしていて、これまでだいたい一人出張なのでアウェーで心細かった。嬉しいことに今回は、はじめて本社に自分の居場所があった感じがする出張だった。外部的要因として弊社の収益構造が、北米中心からグローバル、特にアジアに徐々にシフトしていること。内部的要因としては、徐々にグローバルGo to Market戦略に入れるようになってきて、本社に人脈ができてきたこと(特に友達と呼べる存在ができはじめている)、英語を使った対人コミュニケーションスキルが格段に伸びたこと。があるかなと。かつて東京オフィスにいたときは、アメリカ本社は天上界だと思っていたが、シンガポールオフィスからだとまた違ってみえる。

前提:あくまでビジネス部門での話

日本オフィスからみたアメリカ本社への先入観

  • アメリカ本社は、常にクリアなビジョンと戦略を持っている
  • アメリカ本社は、豊富なリソースがある
  • アメリカ本社は、みんなくっそ優秀
  • アメリカ本社は、グローバルという文脈をアメリカ/英語という文脈で読む

シンガポールから見た本社

  • アメリカ本社は、というか、全社的にかなり試行錯誤
  • アメリカ本社は、豊富なリソースはある反面、完全なる縦割り構造と社員数の増加により、硬直しがち
  • アメリカ本社は、うん、優秀である。自分のスペシャリティを持っており、意識して磨いている。とくに、自分の考えていることを恐れずにチームに共有するところは、本当にすごい。マネージャのマネジメントの質もとても高い。意思決定に透明性があり非常に公平
  • アメリカ本社は、とくにビジネス部門はコミュニケーションが重要だからか、アメリカ人が中心。そのためアメリカ=グローバルになりがち

最近自分の感じるシンガポールオフィス(Regional HQ)で働くことの醍醐味は、

  • アメリカ本社では目の届かないローカルマーケットへのGoToMarket戦略を考えて実際にエグゼキューションまで見れること
  • 言語と国の組み合わせが最も複雑なリージョンで、オペレーションモデル、プロセスをゼロからつくって試せる楽しさ
  • 各国へ出張へ行って各マーケットの社員と一緒に働ける経験

逆に、自分が成長して行く中で感じる不満は

  • プロセス、オペレーションモデルはゼロからつくれるが、プロダクトには関われない
  • グローバルの意思決定には逆らえない
  • 長期的には組織構造の壁は、超えられない

自分の強み、興味もわかってきた。

課題を見つけて、定性的/定量的アプローチで解決すること。そして、それを人と分かち合う。組織デザイン、オペレーションモデル構築は、本当に大事で本当に難しいなと最近自分の興味をかき立てられます。

2016年、自分の新たな動きが楽しみです。そろそろ、溜まっている学び/成長とフラストレーションを爆発させたい。

 

2. 部下が入社3ヶ月で辞表書いてきた

全然できないんだけど、負けん気が強くて、伸びるなとおもったのですが、3週間前に急に辞表を渡されました。

理由は、

  1. 求人に書いてあった職務と異なる
  2. 僕とスタイルが合わない
  3. 他に良いオファーが来た

ということだった。なんだよ、ミレニアル世代の自己顕示欲がーと思ったが、上司に、マネージャートレーニングに放り込まれて外資系リーダーシップを学びました。これが本当に良いトレーニングだった。とにかく、真のリーダーシップはスケールする。言語と地理的距離を超える。それはまた次回。

 

3. 新婚生活がはじまった

奥さんが、日本からシンガポールに一ヶ月だけ来ています。毎日一緒にいると辛いかなと思ったけど、一緒に料理したり、お酒飲んだり、悩みを聞いてくれたり、とても楽しい。

ただ、自分の勉強する時間もちゃんと確保していかないとな。と思ったりです。

 

4. JavaScript, Jquery, Ajaxはひとまず理解できたかな感

コツコツこちらの勉強も続けてました。ひとまず、ウェブは理解できたかなといった感じです。社内用のツールも80%完成しました。

アプリ、ウェブの基本的なプログラミングはわかって、仕様書、行程管理なんかはできる感じ。

ただ、これ以上は、とくにつくりたいものもないので、次の分野にすすもうと思っています。こちらもまた次回。

タージマハールとAjaxとjQuery

今週日曜日にムンバイに入り、月曜日夜からデリーの隣町、グルガオンにいます。月曜からずっと下痢です。出張中の時間を見つけて200キロ離れたタージマハールまで行ってきたのですが、圧巻でした。

イスラム王朝の王様が、死んでしまった3番目の妻のために20年弱かけて作られたお墓なのだそうですが、人間の執着とコミットメントは凄いです。すべての模様は、世界中から集められた色の異なる石を削って組み合わせて描かれています。

ここで、ヒンズー教が多くを占めるインドにあるタージマハールですが、イスラム教の建物なんですね。最終的に、イスラム教はパキスタンに、ヒンズー教はインドに分かれましたが、年々インドでイスラム教が数を増しているようです。なぜなら、イスラム教は4人まで嫁をとることが許されており、子供をたくさん産むからだそうです。

それにしても、果たして、自分はここまで人生をかけてのめり込めるのか、そして世になにかを残せるのか。世界で一番綺麗な建築物は?と聞かれたらタージマハールと答えます。それくらい本当に病的に緻密でidentical(左右対称)な建築でした。

f:id:yuyutata:20150904024024p:plain

さて、今週からがっつりAjaxとjQueryの学習を開始しました。

  • Ajax: ページの一部だけを更新する記述。グーグル検索で、検索ワードを入れてくとどんどん、検索結果が出てくるやつ。
  • jQuery: JavaScriptを使いやすくするためのライブラリー。自分で一から書くと大変なので、先人が定石パターンをあらかじめ用意してくれているものです。ソースコードをみるとJavaScriptで書いてあります。

この技術を使うと、ホームページ上で、条件検索をかけると、サーバーから答えをとってきて表示させる。ということができるようになります。

  • フロントエンド:HTML, JavaScript(jQuery), Ajax
  • サーバーサイド:PHP, MySQL

以下、はまったこと。オギヤス先生、まじでありがとう。インドで泣きました。

1)ローカルサーバーでAjaxを動かすときは、Google Chromeではエラーが出るので、firefoxでやるべし。

2)ローカルサーバーにすべてのファイルを置くべし。静的なhtmlファイルであれば、どこに保存してもブラウザを使って動かせますが、PHPファイルは、ローカルサーバーに保存し、"//localhost/"とホスト名でブラウザからアクセスします。

3)jQueryは、ダウンロードしてローカルに保存したほうが良い。jQuery

 

というわけで、引き続き進めて、週末くらいに簡単なページをお見せできればです。明日の朝、バンガロールに飛び、土曜日の朝にシンガポールへ帰国します。

ナマステ!