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
問題1 ライブラリが無い
- 日時に検索のフォーマットとしてiCalenderを使いたかった
- -> その時点ではElixirライブラリは無かった
対応
- 必要な部分のみゴリゴリ書いてパースした
ライブラリを探す場合の注意点
- awesome_elixirだけじゃなくてawesome_erlang&hex.pmあたりも確認すると、ほしいライブラリがある可能性がある
- 動的にAtomを生成するライブラリは注意
- 場合によってはPortとかNIFも利用できるが、プロセス間通信を使うのはちゃんと考慮が必要
ちゃんと使うと他にも決めることが
- コーディングルール
- elixir_style_guide,credoとかを使用
- 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
発表者: @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
回帰分析
- 分析するデータはただ食わせればいいわけじゃなくて、分析したい対象を明確にすることが大事
- 過去の結果を分析するのではなく、未来の予測をさせるもの
- 過学習しているかどうかは曲線を見ればわかる
- 食わせるデータの量が多ければ多いほどよい
- データが多いとノイズをどれくらい乗せているかとかもわかる
最尤推定
- 後半の確率の数式が出た時点で詰みました。。。
- 勉強します。。。
その他
WebエンジニアがTensorFlowで機械学習に入門しながら顔識別アプリを作ってみた
- 機械学習を初めて大体半年
- はじめたきっかけは流行っているから
- 一番大変だったのは、アイドルのラベリングするところ
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)
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: 暗号化の話+α
ガチID業界の方の暗号化の話。正直ついていけなかった。。。
勉強します。。。
※自前実装するなライブラリ使え
LT枠 3: ElixirよるBEAM言語の作り方とUiro(仮)のご紹介
Uiro という BEAM 上で動く言語を開発した話。
過去には Python で Mochi という言語も開発したらしい。
LT枠 6: 自作ライブラリ 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
注意点
リストと同じ線形の性能特性をもっている
パターンマッチできるけど順番とアイテム数もマッチしなくちゃダメだから使いみちはそんなにない
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 なくなるらしいので割愛
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"
これ書いたら行けたぽ?