tokyo.ex #2 に参加した

Tokyo.ex #2 に行ってきました

タイムテーブル

時間 発表者 内容
19:00- - 開場
19:30-20:00 @ndruger セッション 1: Phoenixを使った案件でリリースまでに起きた問題と対応
20:00-20:30 @ohrdev セッション 2: running web app on elixir
20:30-20:40 - 休憩
20:40-20:50 @ColdFreak LT枠 1: :ets.give_away関数
20:50-21:00 @ma2ge LT枠 2: Create LINE Bot with Elixir
21:00-21:10 @Daniel LT枠 3: Elixir concurrency basics
21:10-21:20 @yohei_tanimoto LT枠 4: Phoenix Tips and Tricks
21:20-21:30 @mururururu LT枠 5: AES-NI
21:30-21:40 @SasadaKoichi LT枠 6: 書籍Programming Elixir関連
21:40-22:30 - 懇親会 (希望者のみ、無料)

リリースまでに起きたこと

発表者: @ndruger 株式会社ACCESS

  • ACCESSさんではElixirのプロジェクトをすでに8プロジェクトくらい作ってる
  • 今回はElixirで引っかかったところ
  • 2015/7~2015/12でファーストリリース

アプリの構成

バックエンド: Phoenix フロント: React

  • クライアントはブラウザ, スマホApp
  • AWSを使用
  • 独自でラッピングしたDBを使っているのでectoは使えない

問題1 ライブラリが無い

  • 日時に検索のフォーマットとしてiCalenderを使いたかった
    • -> その時点ではElixirライブラリは無かった

対応

  • 必要な部分のみゴリゴリ書いてパースした

ライブラリを探す場合の注意点

  • awesome_elixirだけじゃなくてawesome_erlang&hex.pmあたりも確認すると、ほしいライブラリがある可能性がある
    • ElixirからErlangのライブラリを使用するのは簡単なのでErlangも探してみると良い
  • 動的にAtomを生成するライブラリは注意
    • AtomGCの対象外なので注意が必要
    • -> ヘタしたらBeam自体が死んでしまう
  • 場合によってはPortとかNIFも利用できるが、プロセス間通信を使うのはちゃんと考慮が必要

ちゃんと使うと他にも決めることが

  • コーディングルール
  • Brunchを使うか使わないか
  • 多言語対応はバックエンドじゃなくてフロントとかどちらかに寄せた方がよさげ
  • coverex でカバレッジをちゃんととっている(マクロは対象にならない)

サーバログ

  • サーバのログは多めにとった。
    • -> qiita.com/snowball
    • -> リクエストBodyもちゃんと出力

問題3 コンパイル時の型チェックがない

  • @spec ErlangのDialyzerを利用したDialyxir
    • -> Phoenix依存のWarningが出てしまうのであたたかみのある除外が必要
  • 今はDialyzeとCromaのdefunを利用している

問題4 5xxエラー

  • CloudWatch から 5xx エラーの通知
  • ユニットテストもちゃんと書いていたのでエラーはほとんど怒らないはず
    • -> ローカルだと再現せず

原因

  • mix.exs deps/0 に追加したが applications への追加が漏れていた
    • -> test ではエラーにならなかった
    • -> リリースパッケージのみ発生

対策

  • deps に追加したら applications へ追加されるように

問題5 5xx その2

  • 不定のリクエストで 5xxエラー

原因調査

  • 本番でもアタッチできる Recon というライブラリが有る
    • -> recon_trace
  • HTTPoisonのErlangライブラリのHackneyでコネクションプールが溜まっていた
  • Hackneyのコードを読むとレスポンスに対してhackney.body/1を呼び出さないとコネクションが開放される
  • 304,204 のレスポンスに対してはBodyが存在しないということでHackney.body/1を読んでいなかった

まとめ

  • 自動監視の対象を増やしておく
    • 4xx の閾値通知とか
    • レスポンスタイム
  • サービス初期にはログ出力を増やしておく
    • phoenix -> filelogger -> fluentd -> s3
    • 直接 fluentd に投げてしまうと怖いので一度書き出している
  • 障害が起きても致命的なデータが消えない設計にしておく
  • デバッグ方法を調べておく
    • リモートコンソール、Observer,Reconとか入れておく
    • -> 使ったことがないといきなりproductionにアタッチしなくちゃいけなくなってしまう
  • Erlang を勉強しておく。。。。

Running web app on elixir

発表者: @ohrdev 株式会社ドリコム

  • 安定のおーはらさん
  • 今回は運用周りの話

  • 最近Elixirの採用例増えているが開発/実装の情報ばかりで運用の情報がない

    • どう実装するかではなくどう運用しているか。
      • -> 今回の例はまだまだ最良ではない

サービスに付いて

DreeVee:動画広告ネットワーク

  • サービスは止められない
  • 低レイテンシが求められる
  • スパイクが予想できない

規模

  • DAU 50-60万
  • ユーザの視聴/購入情報 4500万

キャッシュ

vernishでページキャッシュしている - ESIで画面要素ごとにキャッシュ - ESIタグのリストをAPI(elixir) で返却 - 全部のページ構成要素をキャッシュしている -> ESIタグのリストをElixirで返却している キャッシュ/パージはvclで実装している

バージョンアップ

対象 - サーバ - ミドルウェア - ライブラリ - ソースコード

条件 - 無停止 - ロールバックできる - 検証しながらできる

構成

インフラ - サーバ AWS - データ Dynamo ElasticCache(Redis)

プロビジョニング - Ansible Terraform

ログ - Fluentd S3 TD sentry

ソースのデプロイ

Github -> S3 -> AutoSG で読み込む

プロビジョニング

Ansible -> micro -> AMI

デプロイ

方針

ツール

  • exrm
    • MIX_ENV=prod mix release でリリースファイルを作成
  • init.dスクリプトでexrmで作成したリリースファイルを叩く
  • mina
    • elixirのcapistorano
    • S3に投げたりしているらしい

所感

  • バージョンアップの時に混ぜ込んだりするときに便利
  • 半年に1回くらいハズレを引く
  • デプロイ完了までに時間が掛かる
  • 異なる環境のサーバを混ぜ込んだりできるので検証に便利

スポットインスタンスを多く使用しているのでコスト的に良い そこらへん(スポットインスタンス)はドリコムさんの外道父さんの記事見ましょう

Elixir ハンズオンイベントやるよー アンケート有るよー

:ets.give_away/3

http://coldfreak.github.io/ets-give-away/

発表者: @ColdFreak 株式会社IDCフロンティア

etsの持ち回りかた。とプロセスが死んだ時のためにマネージャを用意してみるという話

Create Linebot

発表者: @ma2ge エムスリー株式会社

LineBotのはなし。

Elixir concurrency basics

Concurrency basics

発表者: @Daniel クロードテック株式会社

stack server を作ってみる。LIVEコーディング ElixirTutorialのプロセス周りの復習みたいな感じだった 相変わらずキータイプが早かった vaioかっこいい(コナミ

Phoenix Tips and Tricks

発表者: @yohei_tanimoto 株式会社うるる

controller で action/2 をオーバライドすると良い話 Task.asyncを使わない場合はTask.awaitを使わないほうがよい話

AES-NI

発表者: @mururururu 株式会社時雨堂/株式会社アカツキ

時雨堂でWebRTCのサービスでの暗号化というボトルネック解消のためAES-NIに対応したPRをErlangに投げた話。 まだ学生らしいが株式会社アカツキでElixirの相談とかに乗っているらしい。 最近の学生はほんとすごい(コナミ)

書籍Programming Elixir関連

発表者: @SasadaKoichi salesforce/heroku

Ruby会議の話とか、ProgrammingElixirの翻訳本の話とか(7月ぐらいに発行されるらしい) オフレコ話面白かった

感想

Meetupの時は??ってなる時が多かったけど今回は話についていけてる感あった。 毎回月曜とか火曜とか週初めの開催が多いので懇親会には出にくい感はある。 個人的にはElixirを本番稼働させてる実例が聞けてよかった。

次回の開催は 6/29 or 30 辺りの予定

機械学習コトハジメに行ってきた

機械学習コトハジメに参加してきました。

78b88514d287ef16c8a41cdbf4.doorkeeper.jp

事前勉強をせずに参加したので、ついていけない部分があって辛かった感もありました...orz やっぱり最低限の数学的知識は必要だなと痛感しました。

時間 タイトル 発表者
19:05~20:05 ソフトウェアエンジニアのための「機械学習理論」入門 レッドハット株式会社 中井さん
20:10~20:40 WebエンジニアがTensorFlowで機械学習に入門しながら顔識別アプリを作ってみた すぎゃーん(@sugyan)さん
20:40~20:50 われわれのコトハジメ 株式会社エムティーアイ 平野さん

ソフトウェアエンジニアのための「機械学習理論」入門

www.slideshare.net

回帰分析

  • 分析するデータはただ食わせればいいわけじゃなくて、分析したい対象を明確にすることが大事
    • 過去の結果を分析するのではなく、未来の予測をさせるもの
  • 過学習しているかどうかは曲線を見ればわかる
  • 食わせるデータの量が多ければ多いほどよい
    • データが多いとノイズをどれくらい乗せているかとかもわかる

最尤推定

  • 後半の確率の数式が出た時点で詰みました。。。
    • 勉強します。。。

その他

qiita.com

  • 学習している最中は結構人間が学習しているぽい
  • どのアルゴリズムが合うかどうかは職人技的な部分があって、感覚的な部分が有るらしい

WebエンジニアがTensorFlowで機械学習に入門しながら顔識別アプリを作ってみた

d.hatena.ne.jp

  • 機械学習を初めて大体半年
  • はじめたきっかけは流行っているから
  • 一番大変だったのは、アイドルのラベリングするところ

CIFAR-10

TensorFlow

われわれのコトハジメ

  • 顔認識して系統訳するアプリを開発しているらしい

気がついたら tokyo.ex #1 に参加していた

Elixir のイベントに参加してきました(ほぼ一ヶ月前ですが)

開催場所は 株式会社アカツキ さんでした。
普通に通りすぎてしまって迷ってしまったのは内緒

時間 発表者 内容
18:45- 開場
19:00- 開始
19:00-19:30 @hdtkkj セッション 1: phoenix frameworkの足回り
19:30-20:00 @tuvistavie セッション 2: Elixirにこれから入ってくる機能(Elixir1.3, Ecto2.0, 時間あればgenrouter)
20:00-20:30 @poly_soft セッション 3: 一般的なWebサービスで必要そうな機能をPhoenixで作りこんでみました
20:30-20:35 @ohrdev LT枠 1: Elixir Bootstrap
20:35-20:40 @s01 LT枠 2: 暗号化の話+α
20:40-20:45 Yasushi Itoh LT枠 3: ElixirよるBEAM言語の作り方とUiro(仮)のご紹介
20:45-20:50 @hayabusa333 LT枠 4: (ご欠席)
20:50-20:55 Keitaroh Kobayashi LT枠 5: Phoenixでファイルアップロードする方法
20:55-21:00 Shunsuke Kirino LT枠 6: 自作ライブラリ croma の紹介
21:00-22:00 懇親会 (希望者のみ、無料)

セッション 1: phoenix frameworkの足回り

XFLAG の方、
Phoenixフレームワークのリクエストの流れ。
MyApp.EndpointからPlugの話。
Plug.conn を投げて Plug.conn を作ってる。
Plug.Builder のおかげで Endpoint の中でも上から実行される。
MyApp.Router は scope ごとに Plug を束ねた pipeline を適応している。

例としてトークン認証するケースと msgpack をつかうケースが挙げられている

おまけでシャーディングさせるときの便利な使い方とかある。勉強になる

セッション 2: Elixirにこれから入ってくる機能(Elixir1.3, Ecto2.0, 時間あればgenrouter)

Elixir 1.3

Claude Tech の方、
Elixir 1.3 に追加される新しい機能の紹介

  • 書き方がより厳密に注意されるようになるよ
  • with が使えるようになってより簡潔に書ける(with って 1.2 じゃなかったっけ??)
  • 新しい Date Type が追加されたよ
  • escript が簡単に使えるようになったよ(個人的にはコレが一番気になった)
  • ExUnit の diff が見やすくなったよ

タイピングがクッソ早かった。カッコよかった

セッション 3: 一般的なWebサービスで必要そうな機能をPhoenixで作りこんでみました

アカツキの方 Django と昔のPHPフレームワーク(ボクはPHPは触ったことないのでよくわからない)と Rails との比較をされていた。
多言語対応とか認証/認可周りのプラグインの紹介。
Ecto2.0 になって Ecto.Multi という新しいトランザクションの指定の仕方が出来て便利になった。
マスター/スレーブ用のプラグインの作成もされていた。
前回の発表時の区分置管理用のプラグインの紹介もされていた。

LT枠 1: Elixir Bootstrap

株式会社ドリコム の方
好きなビヘイビアは GenServer の方、今回は MakeFile で何やっているのかの話をされていた。

LT枠 2: 暗号化の話+α

github.com

ガチID業界の方の暗号化の話。正直ついていけなかった。。。
勉強します。。。 ※自前実装するなライブラリ使え

LT枠 3: ElixirよるBEAM言語の作り方とUiro(仮)のご紹介

Uiro という BEAM 上で動く言語を開発した話。
過去には Python で Mochi という言語も開発したらしい。

LT枠 6: 自作ライブラリ croma の紹介

Introduction to Croma

株式会社ACCESS の方
LT枠 2: 暗号化の話+α の方と同じ会社の方だったはず。

ElixirにType-Safeを付与するプラグインだったはず。

最後だったから気力尽きかけてたかもしれない。申し訳ない。

まとめ

結局 jose 様が言ったことが全てであるという尊い教えが根付いているのが印象深かった。

日にちが経ちすぎて覚えてない…すまそん。。

Elixir チュートリアル キーワードリストとMap

Elixir チュートリアルやらないで触ってたのでおさらいがてらめもめも

キーワードリスト

  • key_map 的な奴
iex> list = [{:a, 1}, {:b, 2}]
[a: 1, b: 2]
iex> list == [a: 1, b: 2]
true
iex> list[:a]
1
  • 追加するときは ++
iex> [a: 0] ++ list
[a: 0, a: 1, b: 2]

キーワードリストは2つの特別な特徴があるため重要です:

  • キーの順序を開発者が指定したとおりに保持する
  • キーを複数回与えることができる

Ecto なんかはこの2つの機能を使っている

query = from w in Weather,
      where: w.prcp > 0,
      where: w.temp < 20,
     select: w

where という key を二回与えていて、where の順番を守っている

iex> if false, do: :this, else: :that
:that

↓ コレと一緒

iex> if(false, [do: :this, else: :that])
:that

注意点

  • リストと同じ線形の性能特性をもっている

    • 素数が多いと捜査するのに時間がかかる
    • -> 要素数が多くなり過ぎないオプションなどに適してる
    • -> Map を使うようにする
  • パターンマッチできるけど順番とアイテム数もマッチしなくちゃダメだから使いみちはそんなにない

iex> [a: a] = [a: 1]
[a: 1]
iex> a
1
iex> [a: a] = [a: 1, b: 2]
** (MatchError) no match of right hand side value: [a: 1, b: 2]
iex> [b: b, a: a] = [a: 1, b: 2]
** (MatchError) no match of right hand side value: [a: 1, b: 2]

Map

キーワードリストより早い。使い方は %{} これ

  • キーワードリストと違う点
    • 順不同
    • キーの型はなんでも良い
iex> map = %{:a => 1, 2 => :b}
%{2 => :b, :a => 1}
iex> map[:a]
1
iex> map[2]
:b

同じキーを渡した場合は,最後の奴が出てくる

iex> %{1 => 1, 1 => 2}
%{1 => 2}

全部のキーが atom の場合はキーワード構文が使える

  • 順不同で良いならキーワードリスト使わずにこっちって感じ
iex> map = %{a: 1, b: 2}
%{a: 1, b: 2}

順不同でアイテム数も関係なくパターンマッチできるので Map のパターンマッチは使いやすい

iex> %{} = %{:a => 1, 2 => :b}
%{:a => 1, 2 => :b}
iex> %{:a => a} = %{:a => 1, 2 => :b}
%{:a => 1, 2 => :b}
iex> a
1
iex> %{:c => c} = %{:a => 1, 2 => :b}
** (MatchError) no match of right hand side value: %{2 => :b, :a => 1}

その他の特殊な構文

iex> map = %{:a => 1, 2 => :b}
%{:a => 1, 2 => :b}
iex> map.a
1
iex> %{map | :a => 2}
%{:a => 2, 2 => :b}
iex> %{map | :c => 3}
** (ArgumentError) argument error

はい便利ですね

Dict なくなるらしいので割愛

qiita.com

気になるならこっちをみてちょんまげ

Berkshelfでハマった

ERROR: Cookbook ruby_build not found. If you're loading ruby_build from another cookbook, make sure you configure the dependency in your metadata

あるのに怒られる。

rm -f .vagrant/machines/default/virtualbox/berkshelf

これしたら行けた

ruboty をherokuで動かしてみた

Bot用の適当なアカウントをSlackで作成する

あとはこのまま Ruby + Bot = Ruboty - ✘╹◡╹✘

適当なディレクトリ掘る

$ mkdir bot
$ cd bot

bundle init

$ bundle init

Gemfileを以下のように編集

source "https://rubygems.org"

gem "ruboty"
ruboty-slack"

Procfileを作成して中身を以下のように編集

bot: bundle exec ruboty

git プロジェクト作成してコミット

$ git init
$ git add .
$ git commit -m "Initial commit"

Herokuコマンドで remote にHerokuを追加

$ heroku create

HerokuにPush

$ git push heroku master

設定

$ heroku scale bot=1
$ heroku config:set ROBOT_NAME=tqbot SLACK_TEAM=tqhouse SLACK_USERNAME=tqbot SLACK_ROOM=general SLACK_PASSWORD=XXX

ping pong!

googleカレンダー取得するgem作った

googleカレンダー取得するgem作った

gcal | RubyGems.org | your community gem host

関係するGemがダウンロードされなくてこまった。

gcal.gemspecに

spec.add_development_dependency

じゃなくて

spec.add_runtime_dependency "google-api-client", "~> 0.8.2"

これ書いたら行けたぽ?