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

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

初めてのサーバー構築。AWS, サクラサーバーなど

Amazon Web Service (AWS) を使ってみました。アマゾンが副業で始めてたサーバー事業が今では2015年第三四半期だけで21億ドルの売り上げ。前年比78%の伸び。すごいっす。

Amazon Web Services generates $2.08B in revenue in Q3 2015, up 78% over last year | VentureBeat | Cloud | by Jordan Novet

 

というわけで、以下のLIGの記事に従って、AWSの仮想サーバーを構築していきます。記事はとてもわかりやすくて、従っていけば構築はできました。

わずか5分!? AWSのEC2でクラウドなウェブサーバーを構築してみた | 株式会社LIG

 

ただ、仮想サーバーは一から自分で色々インストールしていかなければならず、かなり難しく感じてます。。データベースの設定, MyPhpAdmin, SSLの設定(https通信)などなど泣きそう。

というわけで、Amazon Japanから本が届くまでは、AWSは放置して、仮想サーバーではなく、レンタルサーバーを使うことにしました。

VPSサーバとレンタルサーバの違いを比較してまとめてみた | NEZU.log

 

余談ですが、アマゾンの海外発送、シンガポールまでたったの1400円。普通にシンガポールで洋書を買うよりもアマゾンジャパンで買って海外発送したほうが安い場合もあります。アマゾンのロジスティクス、まじやばい。

 

ずっとローカルでMAMPを使ってやっていましたが、色々公開していければと思います。良い週末を!

 

注文した本

X code7にupdateした結果。

最近は、ウェブ系ばかりでアプリをいじってなかったので、CocoaPods導入とともにX code7にアップデートしました。その結果。

1. Swiftから、Swift 2.0に言語が変わっていた

2. その結果、SwiftのラッパーであるSwiftData(以前の記事)がエラーで動かない

GitHubを見た感じ、みんな同じ壁にぶつかっていたようです。

Issues · ryanfowler/SwiftData · GitHub

 

もしくは、RealmというSQLiteにかわるモバイルデータベースを新たに勉強するのも手のようです。

 

ってな感じです。

ついでに Apple Developer Program - Apple Developer に登録したのですが、うまくできず。。いまcontactにお問い合わせしております。 

なんだか前に進めない夜でした。

 

追記:contactに問い合わせたら次の日の朝(約10時間後)に対応して頂きました。アップルのカスタマーサポート体制、できる。シンガポールにあるという噂。

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回より少ない発生件数だから、”めったにない差”なので”意味のある差”だから、対立モデルによって改善されていると言える。