空飛ぶ羊

勉強したり登壇したり勉強会参加したり

株式会社ぐるなびを退職します #退職エントリ

昨年の3月から1年以上在籍した株式会社ぐるなびを7月末日付で退職します。

ぐるなびでやったこと

Webアプリケーションエンジニアとして、「ぐるなび」サービスでのレストラン検索のサーバーサイド開発に従事していました。業務外では、社内勉強会や社外向け協賛イベントのメンター、Mashup Awardsへの参加などしました。

ぐるなびにおけるWebアプリケーションエンジニアの仕事

サーバーサイドエンジニアと同義です。フロントエンド開発は含まれません。
この1年は、インフラ設計からリリース、障害対応まで一通りの役職を経験しました。開発言語はPHP (Laravel、Zend)とScala (Play、akka-http)です。開発環境としてはGitLab、Jenkins、VagrantOracle DB、MySQL、Groonga、Cassandraを利用してきました。自分の業務ではAWSのようなクラウドサービスは特に利用せず、オンプレミス環境でサービスを運用していました。

一番時間かけてた仕事はレストラン検索結果のランディングページ化です。アクセスの多いエリア限定で大きな写真を使って食欲の湧く、なんとなく行きたい店が決まるページを実装しました。下側の画像のように文字情報が中心のページより私は好きです。

f:id:okoysm:20170626043553p:plain f:id:okoysm:20170626043543p:plain

この際,社内でまだ利用されていないLaravelを採用しました。

developers.gnavi.co.jp

その他の仕事

社外向けイベントの支援をしたり、デザイン思考のワークショップにメンターとして参加したり、業務外プロジェクトとしてMashup Awardsの法人部門にリーダー兼プレゼンター兼開発担当者として参加したりしました。Mashup Awardsでは最優秀賞を獲得しました。
f:id:okoysm:20170626045746j:plain

ぐるなびで働いてよかったこと

B2BとB2C両方の側面を考えながら開発ができた

ぐるなびのビジネスモデルはB2B2Cなので、そのビジネスモデルにおける機能の決め方は勉強になりました。

自分みたいな人材が求められていることが嬉しかった

私のように社外へ発信したり、社内の勉強会文化などに刺激を与えられるような人材としてのラブコールを受けれたのが嬉しかった。

今後どうするの?

実は次の会社がまだ決まっていません。9月以降で、できれば裁量労働制の仕事を探しています。今のところ7月は転職活動に専念し、8月は実家に帰りつつ国内旅行でもしようかと思っています。大人の夏休みですね。

いい話があれば、fly.child1017[at]gmail.comTwitterのokoysm経由で連絡下さい。いきなり知らない人から来るとびっくりするので、知り合い経由がありがたいです。職務経歴書こちらに公開しています。

github.com

定番のあれ

amzn.asia

メンタル崩した休職者の一日 #休職エントリ

現在、メンタル崩して休職中です。ちょうど3ヶ月半経ちました。 このエントリでは、メンタル崩して休職した時の一日の過ごし方とか、体調の波とかを書きます。
「メンタル崩して休職」にも色々あるのであくまで私の場合と捉えて下さい。

アイキャッチ用で、河口湖から望む富士山。GW後の平日に日帰りで行ってきました。

病気

精神科に掛かる病気には鬱病以外にも色々あります。私は現在、双極性障害Ⅱ型(躁うつ病)と診断されています。

自分がなんという病名なのかは、症状が似ている病気もあるため精神科にかかってすぐは分かりません。かつ、似ていても治療方針(薬の内容・カウンセリングの要否)が違うので、別の病気として治療してもなかなか治らない場合もしばしばです。
私も以前は「適応障害」「うつ状態」など別の病名と診断されていましたが、実際の病気は前述の通りだったため、治療方針が大きく変わりました。

(前提)双極性障害Ⅱ型の特徴

私の病気「双極性障害Ⅱ型(躁うつ病)」の場合、鬱状態(調子悪そう)と躁状態(ぱっと見元気)をだいたい一週間おきくらいで繰り返すため、なかなか右肩上がりに調子がよくはなりません。

  • 鬱状態:常にネガティブシンキング、身体が動かない、身の回りのこともなにもできない
  • 躁状態:テンションが異常に高い、行動力が異常にある、なかなか寝付けず何かをやり続ける

http://img.yaplog.jp/img/18/pc/a/y/u/ayukko/2/2181.gif
出典:http://img.yaplog.jp

休職中の過ごし方

生活リズム

会社に行っていたときくらいには起きて寝ています。ただ、実際の過ごし方はその時の症状に合わせて変えています。

鬱状態のときの過ごし方

鬱状態は以下の傾向があるため、基本的に無理せず家に引きこもっています。

  • 常にネガティブシンキング
  • 身体が動かない
  • 身の回りのこともなにもできない

家に引きこもっているときは、ソファに座ったり寝転がったり、録画などで好きなアイドル*1の番組見たり、アニメ見たり、Twitter漁ったり、ツムツムで遊んでたりしてます。 ひどい時は、上記のような過ごし方もせず、ご飯も食べず、一日中布団で寝ています。文字を全く受け付けられず、携帯やPCもさわれない時があります。

ちなみに自分は休職して2ヶ月くらいはPCを開くことすら辛かったです。今でも鬱状態のときは動画をみる以外開けません。

躁状態のときの過ごし方

躁状態は以下の傾向があるため、この傾向に留意して無茶しない程度に平日休みを謳歌しています。

  • テンションが異常に高い
  • 行動力が異常にある*2
  • なかなか寝付けず何かをやり続ける

だいたいは、鬱状態のときにやれなかったやりたいことや家事をやっています。ただ、自分の身体が動くままにやりたいことをやってしまうと、次に来る鬱が長引いてしまうので、無理しない程度にしています(夜は何もしない)。

例えば、買って読んでいない技術書(積読)があるので「これを機会に全部読むぞー!」ってなることも多いのですが、次に鬱状態の波が来たときに頭の疲れがしばらく取れないで寝込むことがわかっているので今はあえて読んでいないです。
ただ、昔買った小説やマンガ、雑誌、普段読まない系統の本(日本語の語彙など)を読んだりはしています。

ある程度元気だと代々木公園を端から端まで歩いて、途中のカフェでゆっくりして、渋谷まで歩いてきて家に帰る(歩数で15,000歩程度)こともしばしばあります。

休職中によく使っているもの

Twitter

最強の時間つぶしアイテム

iOSのヘルスケアアプリ

歩数計と体重・体脂肪メモに使っています。歩数のグラフを見るといつ元気で、いつ調子が悪かったかひと目で分かるので面白いです。また、体重・体脂肪は薬の副作用で太ってしまうのでそれを記録しています。

Uber EATS(出前)

ご飯作るのも食べるのも片付けるのもすべて面倒なときはUber EATSでご飯を頼んでいます。片付けもゴミ箱に捨てるだけなので楽。

動画サイト

YouTube, ニコ動, Hulu(一時的に)見てます。日中のテレビ番組あまりおもしろいのないので・・・
結構見てますが検索するのはちょっと疲れるので、だいたいはいつもみている動画を再生しています。

自己紹介

某老舗Webサービスのサーバーサイドエンジニア。社会人6年目。
前職のときと合わせて3回目の休職中。

おわりに

特にまとまりがある記事ではないけれど、こんな生活してます。

*1:欅坂46

*2:今ブログを書いているのは躁状態だからです

寿司だけじゃない!魅惑のITS健保保養所(トスラブ箱根ビオーレ)

ITS健保とは、関東ITソフトウェア健康保険組合のことで、 運営している施設の鮨が絶品であることから、界隈では「鮨保険」とも呼ばれてる。 先日、このIT健保の保養所に2泊3日で行ってきました。

行ってきたところ

トスラブ箱根ビオーレ

www.its-kenpo.or.jp

旅行日程

1日目:自宅→新宿→宿 2日目:箱根を周遊(海賊船→ロープウェー→ケーブルカー→登山鉄道→ガラスの森美術館→登山鉄道→バス) 3日目:富士屋ホテルビュッフェ&日帰り温泉(天山)→新宿→自宅

オススメポイント

とにかく安い。

今回夫婦(両方共IT健保被保険者)で行ったため、一泊朝・夕食付き5500円でした。しかも食事は両方共フルコースだったので、夕食代だけでも元とれてそうな破格でした!

部屋が広い・きれい

旅行のときにとまるようなツインのホテルとは違ってちゃんとリビングエリアもあり、水回りもそれぞれ独立していました。
ご飯まで部屋でごろごろしながらホテルで借りれるWiiマリオカートで遊んでました。

あんしんの温泉クオリティ

もちろん箱根なので温泉もしっかり楽しめた

また行きたい。

英語できなすぎて全然話せなくて悔しかった

※ポエム

しょこです。今日はシンガポールにあるGoogle Asia Pacificでサミットがありました。
参加者は各国で国際女性デーイベント「Women Techmakers」の主催をしている人やGDGのオーガナイザをしている人が集まりました。
サミットではリーダーシップのセミナーを受けたり、オフィスを見学したり、ご飯食べたり、女性技術者のもつ課題についてソリューション考えたり、そのソリューションを受けて今後なにを行うかなど話しました。

いつもの私を知っている人だったら、さぞたくさん話したのだろうなと思ったでしょうが、今日は全然話せませんでした。
休憩中やオフィス見学中のフリートークはそれなりのテンポで話せるのですが、議論になった途端、英語で考えるのが遅くて最初の一言を握れないとほとんど参加できなくて相槌をうつのがやっとになってしまいました。何かを一言話して、相手から反応があって、それへの返しを考えている間に他の人が議論に入ってきてどんどんついてけなくなる的な。

めちゃくちゃ悔しくてとりあえず今日聞き取れたけど意味わかんない単語書き留めた(基本スマホ触らないでって感じだったからその場で調べられなかった)。
あと「こいつすげーやつだ!」と思わせる自己紹介、1分と5分英語で出来るように準備しておこう。週末の宿題。

あー。帰国したら毎日レアジョブ予約しよう。

ScalaMatsuri slide list (English Entry) #ScalaMatsuri

I’m collecting ScalaMatsuri 2017 ’s slides in this entry.

2017.scalamatsuri.org

Day 1

time Room A Room B Room C
10:00-10:40 Readable Scala The road towards Scala.js 1.0.0 StreamDataProcessing 101
11:00-11:15 Kotlin for Scala Programmers Scala Warrior and type-safe web development with Scala.js How to launch a service using Scala
11:25-11:40 Reducing Boilerplate and Combining Effects: A Monad Transformer Example
11:50-12:05 Deadly Code! (seriously) Blocking & Hyper Context Switching Pattern Coding up your first game in Scala Native Preparing for distributed system failures using Akka
12:15-12:30 Performance tips accumulated from developing an ad distribution system
13:30-14:10 The state of Dotty, the next-generation Scala compiler Survival guide for the Streaming world Scala and Play for game servers
14:30-15:10 Make your programs Free. Eye-opener to the very essence of Functional Programming Implementing DMM API Gateway in Akka Streams and HTTP The state of sbt 0.13.x, sbt server, and sbt 1.0
15:30-16:10 Meta-program and/or shapeless all the things! Reactive Kafka with Akka Streams Introduction to ScalikeJDBC
16:30-17:10 Monolith to Reactive - it’s all about architecture 7 key recipes for Data Engineering in Scala and Spark Let’s Build a Serverless Architecture in Scala!
17:30-18:10 Falcon: ChatWork’s Scala product - its history of failures and successes Pragmatic Eff monad for micro-services Using Deep Learning for Recommendation

参加メモ:第1回「ゼロから作るDeep Learning」読書会 in 銀座

イベント概要

  • 第1回「ゼロから作るDeep Learning」読書会 in 銀座
  • 主催 : 株式会社メイプルシステムズ (勉強会初開催らしい)
  • 日時:2017/01/25(水) 19:30 〜 21:30
  • 会場:メイプルシステムズオフィス

maplesystems.connpass.com

まえがき

  • ディープラーニングを作るためには、多くの試練がある
  • この本は、車の運転で例えるなら、車の教習本ではなく、車の原理について理解してもらうことを主眼としている

1. Pythonの概要

1.1 Pythonとは

1.2 Pythonのインストール

  • とりあえずAnacondaディストリビューション入れよう
    • ゼロから作るとは言ってるけどNumPy(数値計算のためのライブラリ)とMatplotlib(グラフ描画のためのライブラリ)は使う
    • Anacondaディストリビューションを使うとNumPy, Matplotlibが含まれているのでおすすめ。
    • 数値を見やすくするのがこの分野では大事

1.3 Python インタプリタ

  • いわゆるREPL環境 (Read-Eval-Print Loop)
  • $ python
  • $ ipython
  • $ jupyter notebook ←おすすめ:WEBブラウザから使える対話環境

1.4 Python スクリプトファイル

  • もちろんREPLだけじゃなくて、普通のプログラムと同じでファイルに書いて実行もできる

1.5 NumPy

import numpy as np # ライブラリを使うためにnpという名前でインポートする

足し算

x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])
x+y

array([3., 6., 9.])

掛け算

要素ごとの計算と解釈される

x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])
x*y

array([2., 8., 18.])

N次元配列

  • 多次元の配列もいい感じに計算してくれる
  • arrayを入れ子にすることで行列も表現できる

行列の足し算/引き算

  • 成分ごとの足し算/引き算

行列の掛け算/割り算

  • 成分ごとの掛け算/割り算。行列の積とは違うが、成分ごとの掛け算のほうがよく使う。
  • 行列の積と使う場合はdot()関数を利用する

1.6 Matplotlib

sin関数

%matplotlib inline # ブラウザ内で表示するために書いておく

import matplotlib.pyplot as plt 
x=np.arrange(0, 6, 0.1) # 0から6を0.1刻みで増やす
y = np.sin(x)
plt.plot(x, y)
plt.show()

画像の表示

import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread('lena.png') # 画像の読み込み(適切なパスを設定する!) plt.imshow(img)
plt.show()

1章まとめ

2. パーセプトロン

2.1. パーセプトロンとは

2.2 単純な論理回路

ANDノード, NANDノード, ORノードをパーセプトロンで表現してみよう

AND回路

y= 0(w1x1+w2x2<=θ) 1(w1x1+w2x2>θ)

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1 * w1 + x2 * w2
    if tmp<= theta:
        return 0
    elif tmp>theta:
        return 1
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
0
0
0
1

しきい値ではなくバイアス(-b)に置き換える

y= 0(b+w1x1+w2x2<=0) 1(b+w1x1+w2x2>0)

  • θを左辺に移行できるので、右辺がいつも0になるので整理された感じになる
  • 重みとバイアスを変えるだけで他のところは変えずにいろんな回路ができる
    • 基本のパーセプトロンは使いまわせる。その重みを変えるだけで調整ができる
def AND(x1, x2):
    w1, w2, b = 0.5, 0.5, -0.7
    tmp = x1 * w1 + x2 * w2 + b
    if tmp<= 0:
        return 0
    elif tmp>0:
        return 1
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

NAND回路

def NAND(x1, x2):
    w1, w2, b = 0.5, 0.5, -0.7 # ここしか変えてない
    x = np.array([x1, x2])
    w = np.array([w1, w2])
    tmp = np.sum(w * x) + b
    if tmp<= 0:
        return 0
    elif tmp>0:
        return 1
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

OR回路

def OR(x1, x2):
    w1, w2, b = 0.5, 0.5, -0.2 # ここしか変えてない
    x = np.array([x1, x2])
    w = np.array([w1, w2])
    tmp = np.sum(w * x) + b
    if tmp<= 0:
        return 0
    elif tmp>0:
        return 1
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

パーセプトロンの限界

多層パーセプトロン

def XOR(x1, x2):
    # 重み、バイアスは一旦忘れる
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

NANDからコンピュータへ

  • 多層のパーセプトロンを組み合わせればコンピュータも表現できる
    • ここでいうコンピュータはなんだろう :thinking_face:

まとめ

3. ニューラルネットワークを動かす

パーセプトロンからニューラルネットワーク

  • データが有れば自動で重みを決めれる(=学習させる)→これを機械学習という

ニューラルネットワーク

  • ニューラルネットワーク=入力信号の総和
    • y=h(b+w1x1+w2x2)
    • h(x)は活性化関数(activation function)という
  • 入力層は層として数えないので、入力層・中間層(隠れ層)・出力層で構成されている場合は「2層のニューラルネットワーク」といえる。
  • パーセプトロンは「入力値に重みをかけて、バイアスを足して0より大きいか否かで出力が0か1になるもの」だった

活性化関数

def step_function(x):
    # xに対して一気(broadcast)に0より大きいか小さいかを評価
    y = x > 0
    # yをintにキャストしている
    return y.astype(np.int)
step_function(np.array[-15, -10, 0.1, 10, 50])

array([ 0, 0, 1, 1, 1])

シグモイド関数

def sigmoid(x):
    return 1 / (1 + np.exp(-x))
x = np.array([-1, 1, 2])

array([ 0.26894142, 0.73105858, 0.88079708])

多次元配列

  • 行列と配列をなるべく一気にNumPyに突っ込むことが、Pythonを扱う上での肝
    • 機械学習を勉強するために、線形代数を勉強するぞ→挫折」という人いるがそこまで要らない
    • 行列の足し算・掛け算だけわかってれば3章までは全然だいじょうぶ。内積とかはまた後でいい。
  • 行列の内積
    • 行列と行列から新しい行列を作る演算
    • A×B ≠ B×A (非可換性)
    • 計算方法は省略
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[1, 2], [3, 4], [5, 6]])
np.dot(A,B)

array([[22, 28], [49, 64]])

3層ニューラルネットワークの実装

読み方

f:id:okoysm:20170125211139p:plain

実装

f:id:okoysm:20170125211840j:plain

  • 最終的なゴールは入力層(x1, x2,…)から出力層(y1, y2,…)が導かれるものにしたい
  • (a1(1), a2(1), a3(1)) =

    • a1(1) = w11(1)x1+w12(1)x2+b1(1)
    • a2(1) = w21(1)x1+w22(1)x2+b2(1)
    • a3(1) = w31(1)x1+w32(1)x2+b3(1)
  • 最後の活性化関数(最後の中間層から出力層への信号の伝達)だけがidentity_function関数(恒等関数)を利用する

実装まとめ

こんな感じになる(networkで定められている値は決め打ち)

def init_network():
        network = {}
        network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
        network['b1'] = np.array([0.1, 0.2, 0.3])
        network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
        network['b2'] = np.array([0.1, 0.2])
        network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
        network['b3'] = np.array([0.1, 0.2])
        return network
    def forward(network, x):
        W1, W2, W3 = network['W1'], network['W2'], network['W3']
        b1, b2, b3 = network['b1'], network['b2'], network['b3']
        a1 = np.dot(x, W1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, W2) + b2
        z2 = sigmoid(a2)
        a3 = np.dot(z2, W3) + b3
        y = identity_function(a3)
return y
    network = init_network()
    x = np.array([1.0, 0.5])
    y = forward(network, x)
    print(y) # [ 0.31682708  0.69627909]

出力層の設計

  • 恒等関数→回帰問題に使う(連続した値を予想するとか、人物の写真から体重を予測するとか)
  • ソフトマックス関数→分類問題に使う(あるデータの集まりをクラス(まとまり)に分ける。数字画像の認識0から9の画像を認識させると、その画像に写っている数字が何なのかを認識して計算してくれるとか)

ソフトマックス関数の実装上の注意

  • 指数関数exp()が分母と分子に存在するので、floatの範囲を超えて結果が不安定になりがち
  • 定数として入力信号の最大値max(a1, …, an)を引いておく
    • 「指数関数の引数に定数を足しても引いても値は変わらない」という指数関数の特性を利用している
  • 必ず分母のほうが多いので値が絶対に0から1.0の間の実数になり、出力の総和は1になる。
  • なので、ソフトマックス関数の出力は「確率」として解釈ができる
    • ※ソフトマックス関数を適用しても各要素の大小関係は変わらないので、分類問題を解く際には適用を省略できる

出力層のニューロンの数

  • 分類問題では分類したいクラスの数に設定するのが普通
    • ある入力画像が数字の0から9のどれかを予測したい時には出力層のニューロンは10個に設定する

手書き数字認識

  • MNIST(えむにすと)データセット
    • 機械学習分野で定番のデータセット
    • 訓練画像が6万枚、テスト画像が1万枚(28×28のグレースケール画像)

github.com

バッチ処理

  • ニューラルネットワークの計算効率を上げるには一挙に100個とか判定した方がいいので、入力値を100個にまとめて計算するとかやる
  • もちろん100個ごとじゃなくて全部まるごとでも大丈夫。

まとめ

  • ニューラルネットワークでは、活性化関数としてシグモイド関数や ReLU 関数のような滑らかに変化する関数を利用する。
  • NumPy の多次元配列をうまく使うことで、ニューラルネットワークを効率良く実装することができる。
  • 機械学習の問題は、回帰問題と分類問題に大別できる。
  • 出力層で使用する活性化関数は、回帰問題では恒等関数、分類問題ではソフトマックス関数を一般的に利用する。
  • 分類問題では、出力層のニューロンの数を分類するクラス数に設定する。
  • 入力データのまとまりをバッチと言い、バッチ単位で推論処理を行うことで、計算を高速に行うことができる。

感想

  • ニューラルネットワーク学生のときにやったなー懐かしい。思い出そう。
  • おもったより難しくなさそう。Jupyterでとりあえずゴリゴリやれば面白そう。
  • コンピュータじゃないかのチェックで英数字の判定させてるところ、そろそろつらいな。
  • 自分の好きなアイドルとかでDeep Learningさせたくなるの分かる。

*1:ほんまか工藤案件。

夫婦エンジニアMeetup主催しました #eventdots

1/23に夫婦エンジニアMeetupを渋谷のdots.で行いました。 eventdots.jp

Togetter

togetter.com

感想

コミュニティで運営する方がイベント自体は続けやすい。一人でやってるひとすごい。
今まで、dots.女子部のイベントだったりGeek Women Japanのイベントだったりを運営してきて、だいぶ運営慣れたかなと思っていましたが、まだまだでした。
初心に戻ってやることリストを作ったり、必要な人は頼ったりして今後も運営するときはやっていきたいと思った。

KPT

Keep

  • 夫婦でエンジニアというコンテキストで新しい方に知り合えた
  • 参加者全員と話すことができた
  • よねちゃん(dots.のコミュニティマネージャの一人)めっちゃ助かった(ケータリング、受付、接続周り)
  • 開催前にイベントについてコメントされた時、すぐに回答できた

Problem

  • コンセプトの詰めが甘く、自分も心から楽しめていなかった
  • 「結婚してなくても参加できると思わなかった」というコメントをよくもらった
  • 拡散不足(個人的にはあまり大掛かりにならなくてもいいかなと思っていたが、大場さん夫妻に負い目を味あわせてしまったのは申し訳なかった。)
  • 日時の設定ミス(子持ち共働きのエンジニアは平日渋谷に19時はキツイ。土日なら参加したいという方は居た)
  • 箱の選定ミス(気軽に使えるからとdots.を選んでしまった)
  • 運営の人員不足(当日要員として少なくともあと1人は必要だった)
  • 運営としてのサポート不足(SNSでの写真NG確認、LTの順番決め)

Try

  • 今後も自分は夫婦でエンジニアの人と関わりたいのか立ち止まって考える
  • まずは自分の周りの夫婦エンジニアとご飯会などして顔合わせ
  • そのメンバーが集まれる日をベースに開催日を決定。
  • イベントというよりはあくまでMeetupであることに重きを置く(全員とはいえなくても8割と話せたといえるくらい)