読者です 読者をやめる 読者になる 読者になる

俺、サービス売って家買うんだ

Swift, Vue.js, 統計, GCP / このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃなかろうか

カーネル密度推定とは何か?

こんにちは、Hayatoです。年末ですね。
カーネル密度推定をおさらいしようと何度かググったのですが良い感じの記事が見当たらなかったので、書き落としておきます。

Index

  • カーネル密度推定って?
  • どういうときに使うといいの?
  • カーネル密度の算出方法 (実際にPythonで)
  • 2次元でカーネル密度推定

カーネル密度推定って?

カーネル密度推定は、一言で表すと「なめらかなヒストグラム」です。
なめらかなヒストグラムを利用して、実際のいくつかのデータ(標本)から、全体の分布を推定する事ができます。 左がヒストグラムで、右がそれを元にして作成したカーネル密度分布のグラフです。 f:id:hayato1986:20161226164449p:plain

参照:Kernel density estimation - Wikipedia

どういうときに使うといいの?

ヒストグラムとは違い曲線になっているので、X値に対応するYを取ることが出来ます。あくまで推定ではありますが、おおよそX=0.2635ならY=2.45など、あらゆる値に対応できるようになります。

カーネル密度分布を書くことで、複数の突出(peak)がある場合に異なる複数の母集団から標本が抽出されている可能性がわかったり、複数のカーネル密度分布を足し合わせたときに視覚的な比較優位を取ることが出来ます。

カーネル密度の算出方法 (実際にPythonで)

さて、では実際にカーネル密度推定を順序立ててやっていきましょう。Githubに iPython Notebook を上げておいたのでそちらも参考にしてください。

1. サンプルデータを作成してヒストグラムを描画

正規分布に従うサンプルデータを作成して、ラグを表示しつつヒストグラムを書いてみます。ラグがたくさんあるところがグラフも高くなっていますね。

data = randn(50)
plt.hist(data, alpha=0.5)
sns.rugplot(data)

f:id:hayato1986:20161227112932p:plain

2. カーネル密度関数を重ねてみる

このグラフにカーネル密度関数を重ねてみます。やはりヒストグラムをなぞったような形になっています。

sns.rugplot(data)
sns.distplot(data)

f:id:hayato1986:20161227123707p:plain

こういうときSeabornはめちゃめちゃ便利ですねぇ。diplot(hoge)で一発描画。。

3. バンド幅とカーネル関数を選択する。

カーネル密度関数を調整するに当たり、バンド幅とカーネル関数を選択します。

バンド幅の違いでグラフを表示

バンド幅とは、データ(標本)一つ一つをどれくらい左右に広げるかの設定をします。0.1, 1.0などなど数値で表します。試しにいくつかのバンド幅を書いてみましょう。

sns.rugplot(data)
list =  [0.1, 0.3, 0.5]

for num in list:
    sns.kdeplot(data, bw=num, label=num)

f:id:hayato1986:20161227122014p:plain

選択するカーネル関数の違いでグラフを見比べる

カーネル関数は、データ(標本)一つ一つをどのような形で広げるかの設定です。ガウス分布(正規分布)が基本かと思いますが、三角、一様などなどいろいろ種類があります。詳しくはWikipediaを参考にしてください。 カーネル (統計学) - Wikipedia

[f:id:hayato1986:20161227121905p:plain]sns.rugplot(data)
options = ['biw', 'tri', 'gau']

for option in options:
    sns.kdeplot(data, kernel=option, label=option, bw=0.5)

f:id:hayato1986:20161227121917p:plain

やはりガウス分布安定ですかね。。 こんな感じでPythonを使ってさくっとカーネル密度推定ができちゃいます。便利!

2次元でカーネル密度推定

ちょっと応用して、2次元でのカーネル密度推定もやってみます。相関分析時に、どのようにデータが分布されているかを把握するのに便利。「複数の突出(peak)がある場合に異なる複数の母集団から標本が抽出されている可能性」を見分ける強い味方ですね。

いつものirisデータを引いてきて、plotします。

iris = sns.load_dataset("iris")
sns.kdeplot(iris.sepal_length, iris.petal_width, shade=True)

できた!のですが、Seabornでやったほうが楽だしきれいだし見やすいです。

sns.jointplot(x="sepal_length", y="petal_width", kind="kde", data=iris);

f:id:hayato1986:20161227122501p:plain

まとめ

今年はあんまり分析できず残念。。オラッオラッオラッ(ΦωΦ)

matplotlib, seaborn のラベルを日本語対応する。

iPythonでデータ分析するときに、当然matplotlibやseabornでグラフを描画するのですが、日本語対応されてなく文字化けを起こします。
グラフの描画はデータの概要を掴んだりビジュアライズしたりするためなので、文字化けを起こしていると割と致命的です。

今回はその修正方法でちょっとだけハマったので、まとめておきます。

環境:

Mac OS Sierra
Python 3.5.1 :: Anaconda 4.0.0 (x86_64)
iPython (jupyter)

手順

0. フォントがあるかどうか確認。

以下のようにすると使えるフォントが一覧で確認できます。

import matplotlib as mpl
font_paths = mpl.font_manager.findSystemFonts()
font_objects = mpl.font_manager.createFontList(font_paths)
font_names = [f.name for f in font_objects]
print(font_names)

日本語フォントがある場合は、

sns.set(font='AppleMyungjo')#日本語フォント設定

で設定すると対応できますが、ない場合は下記手順でダウンロードしてくる必要があります。

1. TTF形式でIPAフォントをダウンロード

IPAフォントを公式サイトからダウンロードします。
使うのはXXX.ttfの4つのファイルです。 f:id:hayato1986:20161222205107p:plain

2. TTFファイルをmatplotlibフォルダ内にコピー

僕はpyenvを使っているので下記のようなパスでした。

/Users/[user名]/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/

こちらにダウンロードした*.ttfファイルをコピーします。

$ cp ~/Downloads/IPAfont00303/*.ttf /Users/[user名]/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/

3. matplotlibの設定ファイルを作成

終わったらフォントファミリーのデフォルトを指定します。seabornはmatplotlibのラッパーぽい雰囲気なので、設定はmatplotlibだけでOKです。

vi ~/.matplotlib/matplotlibrc

でファイルを作成して、以下を追加。

font.family         : IPAmincho

4. 再起動

Pythonを再起動すると日本語が表示されるようになってます。 f:id:hayato1986:20161222210608p:plain

以上で日本語が使えるようになったと思います。 オラッオラオラオラッ(•ө•)♡

webclip から url scheme でパラメータを渡してアプリを起動する

f:id:ie-kau:20161220143209p:plain:w300


ユースケース

  1. エンドユーザーに任意のページを webclip してもらう
  2. エンドユーザーはiOSホーム画面に webclip されているページを Safari の standalone モードで起動する
  3. そのままネイティブアプリにディープリンクでリダイレクト
    • その際に url scheme を利用してパラメータをネイティブアプリに渡す

どういうメリットがあるか?

これにより webclip のURLに仕込んであるパラメータをアプリに渡せ、直接該当アプリの対象画面をパラメータ付きで開くことができます。
既に該当するアプリはユーザーのiOS端末にインストールしてあることが前提ですが、検索結果経由のurl scheme起動ではなく、まるでネイティブのアプリを開くかのように webclip から該当のアプリケーションの対象となる画面を開くことができるようになります。

Web側

<meta name="apple-mobile-web-app-status-bar-style" content="black" />                
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon" href="[touchアイコンへのパス]">

以前は、下記記述でスプラッシュ画像を表示できたのですがiOS9からはできなくなったようです。

<link rel="apple-touch-startup-image" href="[スプラッシュ画像へのパス]">

standalon モードで起動した場合はwindow.navigator.standaloneがtrueになるので、 webclip からの起動と判断でき、それを条件に該当アプリにリダイレクト。

if (("standalone" in window.navigator) && window.navigator.standalone) {
  location.href = 'test_app://?id=1
}

スプラッシュ画像っぽくwebclipから起動した画面を見せたい場合は、こんな感じにすればいいかと。
※雑です。

  <head> 
-- 省略 --
  <style>
    body {
      width: 100%;
      height: 100%;
    }
    body > div {
      width: 100%;
      height: 100%;
      background-repeat: no-repeat;
      background-size: cover;
    }
  </style>
  </head> 
  <body>
    <div style="background-image:url([スプラッシュ画像代わりの画像のパス])"></div>
  </body>
// ※要 jQuery
  $('body > div').hide();
  $(window).on('load', function() {
    if (('standalone' in window.navigator) && window.navigator.standalone) {
      var img = new Image();
      img.onload = function() {
        $('body > div').fadeIn(300, function() {
          setTimeout(function() {
            location.href = 'test_app://?id=1
          }, 500);
        });
      }
      img.src = '[スプラッシュ画像代わりの画像のパス]';
    }
  });

アプリ側

通常通り url scheme が使えるようにしておきます。
info.plist > URL types

f:id:ie-kau:20161218173028p:plain

参考

独学でネットワークスペシャリストに合格するための対策、勉強方法、勉強時間、参考書を公開するよ

こんにちは。@hazumu です。

昨年度しれっと落ちたネットワークスペシャリストに今年はかろうじて受かったので、今後取得しようと考えている人に向けて勉強方法と、勉強内容をまとめておきます。

f:id:ie-kau:20161218195512p:plain
ギリギリ!!!

ネット上には緻密に計画を練って合格している記事が多いのですが、僕自身そこまで計画して勉強するタイプじゃなくモチベーションが乗ってきて面白いから勉強するってタイプなのでどちらかというとそういう人向けです。

合格ラインが60%だから逆算で何点取れば…みたいな勉強方法は得意じゃありません。 (要領悪いけど)

対象読者

  • 今後ネットワークスペシャリストの受験を考えてる人
  • 開発職だけどネットワークには詳しくない人でネットワークを勉強したい人
  • 計画して勉強するのが苦手な人

ネットワークスペシャリストとは?

ネットワークの固有技術からサービス動向まで幅広く精通し、目的に適合した大規模かつ堅牢なネットワークシステムを構築し運用できるネットワークエンジニアやインフラ系エンジニアを目指す方に最適です。

※引用元
IPA 独立行政法人 情報処理推進機構:制度の概要:ネットワークスペシャリスト試験

試験形式

午前Ⅰ 午前Ⅱ 午後Ⅰ 午後Ⅱ
多肢選択式
(四肢択一)
※今回はパス
多肢選択式
(四肢択一)
記述式 記述式

社内ネットワークやサーバーのネットワークの構築から保守、VoIPの問題まで多岐にわたる問題が出題されます。

受験理由

  1. 本職はフロントエンジニアなのでインフラ周辺の実務経験が少く理論と知識だけでも補完しておきたい
    • ただ、何故かリアルタイム通信を必要とする案件に当たる確率が高いので知識の拡充は避けて通れない
  2. なんとなく通信プロトコルとか面白そう

転職を繰り返したり採用をしたりとしてると分かるのですが、Web系で自社プロダクト開発をしている企業だとほとんど資格は重視されないので本当に飾りにしかならないのですが、得た知識は実務で役立つので勉強して損になることはないと思っています。

本を読むだけよりも一定の反復が生まれるので学習内容の定着もいいですしね。

2015年

で、2015年秋に一回受けたのですが、午後2で3点足りずに落ちましたorz
この年に行った学習内容と期間は以下のとおりです。

学習開始時は
ICPM? ( ᐛ) パァ
みたいなレベルでした。

8月

9月

10月

  • L2の知識不足が顕著だったので、LAN周りのことが丁寧にわかりやすく書いてある書籍を購入。後の祭り。
  • この時点で午後1まで到達しない可能性があったので、試験5日から午前2の問題を丸暗記し始める。  
  • 10月第三日曜日に試験を受ける。

結果、午前2は通過して、午後1通過ならず。

2015年の反省

  • L2の知識(LAN、ルーティングプロトコル)、セキュリティ周りの知識・経験不足が顕著
  • 午前1は過去問丸暗記で行けるから試験5日前ぐらいからの勉強開始でいい
  • 面白がって基礎理論を悠長に勉強していたけど、受かるためには過去問を解き続ける方が要領がいい
    • 時間も限られているので2016年は少しスタンスを変える

2016年

2015年の反省を元に、日程的な計画は立てずにやることだけを絞りました。
他に勉強しないといけないとこも多いし、これ以上同じ試験を受けたくないので受かる方向にフォーカスします。

少々仕事が忙しかったので9月からの勉強開始になりましたが、昨年の貯金も多少あったのでギリギリなんとかなったイメージです。

読み込む本

ルーティング&スイッチング標準ハンドブック

ルーティング&スイッチング標準ハンドブック

L2の知識補完が選定理由。

問題集

このシリーズの解答と解答の理由を3冊分丸暗記。
とても丁寧に解説が書かれているので、他の問題集に脇目も振らず「これだけやればいいんじゃね?」という仮説のもと専心することに。

ネスペ 27 礎 -ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスペ 27 礎 -ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスペ 26 道 ?ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスペ 26 道 ?ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスぺの剣25 ~ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスぺの剣25 ~ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

午前2対策

  • 5日前から過去問丸暗記

はい、パワープレーです。なんとかなりました。
余談ですが、午後2がWebRTCの問題で前前職の社内輪読会で話題に上がっていたのも大きかったかも・・

総評

2015年にヘマをしたので、えらく時間がかかってしまいましたが。 ネットワークに関する知識がそこまでない状態からでも、お そ ら く、以下のことをすればなんとか受かるのではないでしょうか。

  1. 「ネットワークはなぜつながるのか」、「マスタリングTCP/IP」の二冊で外観を得る
    • L2の知識補填のため「ルーティング&スイッチング標準ハンドブック」を読み込む
      • ※L2の知識が薄い場合の任意
    • 細かいプロトコルやアルゴリズムの用語はここで覚える
  2. 「ネットワークスペシャリストの最も詳しい過去問解説 」の出版されてているもの全ての解答と解説を丸暗記
  3. 試験の週に午前2の解答を丸暗記

(※午前1がパスの場合になっていますが。)

まとめ

ほぼ趣味みたいなところもある受験でしたが、業務でも早速「(AWSの) SESのメールが届かない」みたいな話題になった時に大体どこを見ればいいか即座に見当がつくようになったので勉強してよかったなと思います。

今回はギリギリ合格だったし仕事でも守備範囲を広げられるようにもう少し勉強しないとね。( ᐛ) オラッオラッ

Vimの置換で後方参照とvery magic modeを利用してReactのJSXのclassNam属性を通常のHTMLのclass属性に一括変換する

f:id:ie-kau:20161213195449p:plain:w400

やりたいこと

ReactのJSXにCSS modulesなどを使って以下のように動的にクラスを適応したとします。

<div className={CSS.modal}>
  <div className={CSS.title}>タイトル</div>
  <div className={CSS.contents}>コンテンツ</div>
</div>

で、Reactの利用を途中でやめたので、className属性をのclass属性に変更したいと思います。

<div class="modal">
  <div class="title">タイトル</div>
  <div class="contents">コンテンツ</div>
</div>

Vimのバージョン

vim 7.4

結論

結論から言ってしまうと下のようにかけます。

:%s/\vclassName\=\{CSS.(.*)\}/class="\1"/g

後方参照
Vimの置換における後方参照は置換後の文字列で\1, \2というメタ文字を利用します。

very magic mode

これ知らなかったんだけど、Vimの正規表現で利用できるメタ文字をすべて「\」記述のなしで書くことができる検索モードのようです。/(^o^)\ シラナカッタ
書式としては、検索文字の前に「\v」を記述するだけ。

very magic modeを利用しない場合はと言いますと、グループ用のメタ文字()をエスケープさせる必要があります。 ↓

:%s/className={CSS.\(.*\)}/class="\1"/g

ん?
今回の場合「{」がメタ文字じゃなくて通常の文字だから very magic modeじゃないほうが楽じゃない?

追伸

祝!100記事目!

Swiftのmap,filter,reduceに慣れる

f:id:ie-kau:20151120074851p:plain


勉強不足でSwiftのcollection型にmapやreduceなどの関数が存在していることを知らずfor文で回してたので慣れるためにも幾つか遊んで見る。

map

引き数のクロージャ内でコレクションの値を計算して新しいコレクションを返す。

計算する

let arr = [1, 2, 3, 4]
let arr2 = arr.map { $0 * 2 } 
// arr2 => [2, 4, 6, 8]

型変換

let arr = [1, 2, 3, 4]
let arr2 = arr.map {
    (i: Int) -> String in
    return String(i)
}
// arr2 => ["1", "2", "3", "4"]

Dictionary型でもOK

let arr = ["a":1, "b":2, "c":3, "d":4]
let arr2 = arr.map {
    (_: String, val: Int) -> Int in
    return val * 2
}
// arr2 => [4, 2, 8, 6]

filter

引き数のクロージャ内の条件式でtrueを返す条件に合致した値のみのコレクションを返す。

よくある使い方

let arr = [1, 2, 3, 4]
let arr2 = arr.filter { $0 % 2 == 0 } 
// arr2 => [2, 4]

Dictionary型に使う
タプルの配列で返ってくる。

let arr = ["a":1, "b":2, "c":3, "d":4]
let arr2 = arr.filter {
    (key: String, val: Int) -> Bool in
        return key == "a" || key == "c"
    }
// arr2 => [(.0 "a", .1 1), (.0 "c", .1 3)]
// arr2[0].0 => "a"

reduce

コレクションの値をすべて組み合わせて新しい値を返す。

短く書く

let arr = [1, 2, 3, 4]
let val = arr.reduce(0, +)
// val => 10

クロージャを使う

let arr = [1, 2, 3, 4]
let val = arr.reduce(0, { 
    (accum: Int, current: Int) -> Int in 
        accum + current 
})
// val => 10

チェーン

当然チェーンさせて組み合わせることもできる。

let arr = ["a":1, "b":2, "c":3, "d":4]
let arr2 = arr.filter {
    (key: String, val: Int) -> Bool in
        return key == "a" || key == "c"
    }.map({
    (key: String, val: Int) -> Int in
        return val * 2
    })
// arr2 => [2, 6]

まとめ

他によく使うところでは、forEachやsortも組み込みで存在する。 次回はflatMapを含めてもうちょい深入りしてみよう。

参考

なぜシリコンバレーなのか。

f:id:hayato1986:20160914120901j:plain:w500


なぜシリコンバレーなのか?

こんにちはHayatoです。 サンフランシスコ滞在も終盤になってきました。今回はなぜシリコンバレーに多くの優秀な人材が集まり、Google, Facebook, Pinterest, AirBnB,Uber などなど名だたるメガテックを生み出し、こぞってスタートアップが集まりイノベーションの震源地となっているのかを、肌感から考察していきたいと思います。

天気、天気、天気

天気が良いと気分がいい。気分が良ければポジティブになる。ポジティブになるから仕事が楽しいし、チャレンジしようと思える。いや、これが一番の理由なんじゃないかと本気で思っています。 シリコンバレーはほとんど雨が振りません。気候も穏やかで暖かく、日本の5月の梅雨入り前の気候がずっと続きます。 天気が良いのでポジティブな状態を保てます。なので、新しいことや困難なことに挑戦する勇気が湧いてきますし、失敗をポジティブに受け止めることが出来ます。

アメリカで一番フレンドリーな場所

気候が良いので、いる人達はフレンドリーです。みんなフレンドリーなので、自分もフレンドリーになり、情報がよく回るようになります。そのためか、シリコンバレーには不思議な一体感がありますし、何かがここで生まれてくるものに対しての賞賛、失敗への寛容が他の地域と比べて群を抜いて高いように思います。 それに忘れないでください。ここは移民の国アメリカです。国そのものの歴史的背景から、アメリカ人は元来新しいものにポジティブですし、良いものへの感度が凄く高いです。

チャレンジしている人がたくさんいる

結局は世界は物量です。パワーです。この数ヶ月僕が見ただけでも、5000以上の新しいプロダクトやアイディアがありました。 世界中から優秀な人達が集まり、プロダクトを作り、世にその価値を問う。もちろん95%は失敗するけど、それでもポジティブに受け止めて次のプロダクトを作る。そんなサイクルの数が世界でも群を抜いているからこそ、成功しているプロダクトの数が多いんです。

他に何もない

東京から来ると、驚くほど何もありません。カラオケはない、漫喫もない、ゲーセンもない、コンビニもないし、スタバだって車を5分は走らせないと行けないし、ということで何もありません。あるのはパソコンと猛烈に働いているライバルであり友人だけ。もう仕事する以外にすること無いんですよねw

ということで、要は天気がめっちゃいいし他にすることがないし、失敗とか成功とかそういうこと考えずにとにかく夢中でやろうぜ!って出来るところがシリコンバレーの強みなんじゃないかと思うわけでした。