2016年を振り返る
今年も今日を含めてあと2日で終了するので振り返っておく。
なお去年の振り返り。
川崎Ruby会議やった
スタッフとスピーカーという立場で参加した。自分の中では今年一番大きなイベントだったと思われる。気になるのは来年もやるのかというところだがまだ何も決まってはいない。Kawasaki.rbは土地柄かWeb屋が少なくRuby以外で仕事してる人のほうが割合として多い*1ので、今年の川崎Ruby会議もそのカラーを前面に出し、コンテンツも特にRubyにこだわらずに実施した。もし次回があるのであれば、このカラーは続けていって欲しいと思うし、そんな内容でも聞いてみたいと思う人は是非参加して欲しい。
なおkawasaki.rb公式ブログは今年からMediumに移行して絶賛継続中である。去年の4月から毎月休まず寄稿しているぞ。
データの民主化とSQLハンズオン
今年はやたら「データの民主化」という言葉が耳に入った年だと思う。弊社でもRe:dashが整備され、非エンジニアがデータベースにSQLを投げられる環境は整われた。
ただ、環境は整備されても初めてSQLを投げるのはハードルが高く、当初はその人の席で直接SQLを教えながら手伝っていたのだが、手も回らないし全体的に基礎的な事を先に教えた方が良かろうと思いハンズオンという形式で実施した。
なおこの記事の2週間後に第2回を実施している。内容は1回目で苦戦したJOINとGROUP BYを図解込みで解説し、残りの時間で難題かと思われたサブクエリの演習をした。講習でなくハンズオンという形にしたことで、課題を解けたという達成感と実際のデータ取得に応用してみようというモチベーションに繋がったと思う。現に、弊社SlackのSQL質問チャンネルでは既にエンジニアを介さずに質問と解答が繰り広げられていた*2。
技術スタック
川崎Ruby会議ではScalaについて話してみたものの、結局あまりScalaには触らず、仕事ではRubyを使うことのほうが断然多かった。今年はモニタリングとパフォーマンスチューニングをすることが多かったからか半インフラ業のような仕事が多く、DockerとGatringで負荷テスト、Passengerのチューニング、AWSのサービス(Lambda, CloudWatch, ElasticBeanstalk...)と仲良くなった。特にLambdaとSlackは監視に使うには本当に便利で、最近ServerlessFrameworkも覚えたしどんどん活用していきたい。
あとCUIツールとか今はRubyで書いちゃうんだけど、配布とか考えるとGo覚えてさくっと書けるようになりたい。
まとめ
気の利いたまとめを書こうと思ったが特に何も思い浮かばなかったのであえて書かない。
皆様良いお年を。
社内向けにSQLハンズオンやった
弊社内でRe:dashが整備され、エンジニア以外でもブラウザから気軽にSQLが叩ける用になった。 ただ気軽になったと言ってもいきなりSQLを使いこなせるわけはないので、社内向けに1時間程度のハンズオンを実施したのでここにまとめておく。
目的とゴール
目的はとりあえずSQL(主にSELECT文)の勘所を掴んでもらい、基本的な質問などは非エンジニア部署のメンバー間で解決できるようにしたかった。
なので今回のハンズオンのゴールは
- 基本的なSELECT文が叩ける
- Re:dashの基本的な操作ができる
という点に設定した。SELECTで使用する句の範囲は
- WHERE
- ORDER BY
- LIMIT
- GROUP BY
- HAVING
- サブクエリ
とre:dashの簡単な解説とした。
進行方法
自分が前に登壇してセミナー形式にしても良かったのだが、なんとなく退屈になりそうという点と、自分たちで調べて解決したという達成感があった方が身につきやすいのではという実験的な試みから以下のようにした。
- いきなり制限時間5分の課題を解いてもらう(ex. あるテーブルの◯◯ごとの件数上位n件を表示せよ)
- 課題には関連するテーブル名やカラム名、使用するSQLの句をヒントとして付随させる
- SQLの句の使い方はぐぐって調べてもらう
- 解けたものは解けてない者の手助けをしてよい
- 5分経ったら解答例提示、解答の解説、質疑応答
- これらの繰り返し
互いに教え合うという点は、幸いメンバーの技量が
とバランスが良かったのでうまくまわった。
得られた効果
セミナー形式と違って自分たちで問題を解くので、実際にSQLを叩く中でハマりやすいポイントと、細かい疑問(各句は大文字小文字どちらが良いのか、改行する意味はなんなのか、COUNT(*)に指定するカラム名はなんでも良いのかなど)も浮き彫りになり、それらを解消することができた。
また、教え合うことで主催者の手が回らず質問できないという事象を避けることができ、無事にほぼ全員が解答まで導けることができた。なにより楽しかった、またやって欲しいという声もいただけた。
反省点
INNER JOINやGROUP BYなど、少し複雑になるケースの解説はもう少し厚くした方が良かった。テーブルのイメージを把握してもらうために多くの図解を加えるべき。(INNER JOINで結合するカラムはRailsの規則によるところがあるので、さらに多くの解説を要した)
1時間でやってみたところ途中までしか終えられず、さらに解説を多く含めるのであれば何回かにパート分けした方が良さそうである。
川崎Ruby会議 01の実行委員 & 発表しました #kwsk01
2016/8/20に開催された、川崎Ruby会議 #01 の実行委員と発表をやらせていただきました。
事の発端
会の内容はるびまに、開催に至った経緯などは実行委員長のブログに任せるとして、個人的に実行委員になった背景を書きます。
僕は2015年1月からKawasaki.rbに通い続け、その後2015年4月からKawasaki.rb公式ブログの中の人を務めるようになり、その甲斐もあってか本家Ruby会議の帰りにchezouさんに川崎Ruby会議を企画しているので手伝ってもらえないかと声を掛けられ、その後正式に依頼されたので引き受けることにしました。
実行委員としてやったこと
こういった実行委員は初めての体験だったので、気づいたことと落ちているタスクは積極的に拾っていこうと思いながら手伝っていました。大きなものではWebページのロゴとスタッフTシャツ作成と当日のるびま用撮影担当、細かいことではミーティングのスケジュール調整やWikiのメンテ、懇親会会場の確保などをしていました。
発表したこと
実行委員でありながら「Rubyistを誘うScalaの世界 2.0」というタイトルで発表させていただきました。
Ver 1.0は一度Kawasaki.rbで発表したのですが、今度は20分枠ということで、未経験者にもより丁寧にScalaの説明と魅力を伝えられるよう心がけました。
参加者でScalaを触ったことあるか質問してみたところ、半数以上が手を上げた気がしたのでもう少し内容を厚くしても良かったのかもしれませんが、発表後に面白いと言ってくださった方もいたので良かったです。
妻は偉大
当初、Webサイトのロゴは用意しない流れだったのですが、折角なので妻に「kwskバザーで連想できるロゴ描いてみてくれない?」と聞いてみたら何パターンか描いてくれて、メンバーに見せたところ思いのほか好評だったので採用に至りました。その後TMIXさまからTシャツスポンサーの申し出があり、ロゴをそのままTシャツのデザインに使いまわそうとしたところ、妻に「そのまま使えるわけないだろ」とありがたいお言葉をいただき、Tシャツのデザインも新たに描き下ろしてもらいました。本当に頭が上がりません。前回の神奈川Ruby会議や東京Ruby会議11のロゴも実行委員長の妻によって描かれたものらしいので、Regional RubyKaigiは妻によって支えられていると言っても過言ではないでしょう*1。
なお発表のスライドの4ページ目の通りなのでこんなものをしれっと用意してあります。何卒...!何卒...!
さいごに
発表・参加いただいた皆様、どうもありがとうございました!また機会がありましたら参加いただけると嬉しいです!
写真はスタッフTシャツのままカレーを食べに行くスタッフ達
*1:多分
子供の夏休みの宿題を手伝うお父さんお母さんのためのGemを作った
全国のお父さん、お母さんエンジニアの皆様お待たせしました。
事の始まり
なんか弊社CTOが困っていた
小学3年生で習っている感じ以外を使っていたら自動的に開いてくれるツールがほしい。
— よーへい (@ikunai) 2016年8月12日
事情はよくわからないが、恐らく子供の宿題を手伝うやなんやかやで、子供が書いたっぽい文章にしたいがために感じ漢字をよろしくしたいのであろう。
我々はエンジニアだ。無いのであれば作ればいいのである(キリッ
というわけで作った
特定の学年の小学生が習っていない漢字をひらがなに変換するGem、名づけて「Furiganize」。オプションに学年を指定することができる。要YahooAppId。
なお僕に子供はいないのでドッグフーディングはしておらず使い勝手のほどは知らない。
使い方
$ gem install furiganize
を実行後、
$ furiganize -a [YOUR_YAHOO_APP_ID] -g 3 '小学三年生が書いたこの文章は魑魅魍魎' # => 小学三年生が書いたこのぶんしょうはちみもうりょう
とするだけで子供が習っていない漢字をひらがなに変換してくれる。学年は -g
に指定すべし。
無駄にSTDINからも読めるようにしておいた。
$ echo '小学三年生が書いたこの文章は魑魅魍魎' | furiganize -a [YOUR_YAHOO_APP_ID] -g 3 # => 小学三年生が書いたこのぶんしょうはちみもうりょう
技術解説
解説といってもなんのことはなく、Yahooのルビ振りAPIを叩いているだけである。
当初は学年ごとに習う漢字の辞書とMeCabなどの形態素解析を組み合わせて作ろうとしたが、調べている内にドンピシャなサービスがあったので楽した。
リンク先のサンプルレスポンスの通り、習っていない漢字には Furigana
、習っている漢字には Surface
のみが返ってくるのでそれらを連結しただけである。
レスポンスはXML形式なので nokoigiri
を使った。具体的な箇所のみを抜き出せば
doc = Nokogiri::XML(open("http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=#{@app_id}&grade=#{@grade}&sentence=#{URI.encode(@sentence)}")) doc.css("Word").map {|w| w.at_css("Furigana") || w.at_css("Surface") }.map(&:text).join
としているだけ。
「実践SERVERLESS」に参加してきた #cmdevio
2016年8月2日に実施された「実践SERVERLESS」に参加してきました。会場は目黒雅叙園にあるAmazonさんのオフィスでした。周りに珍しいポケモンはいませんでした。
雑ですが以下参加メモ。資料は公開されしだい更新します。
Introducing Serverless Computing アマゾンウェブサービスジャパン 西谷 圭介氏
AWS Lambdaのユースケース
Real-time file processing
- イメージのサムネイル生成
- ビデオの変換(投稿動画が問題ないか解析したり)
- ドキュメントのメタデータをインデックス化
- ログの処理
- メディアコンテンツのバリデーション
Real-time stream processing
ストリームデータをKinesisに貯めてLambdaに流すケースが多い
Extract, Transform and Load
- データバリデーション
- バックアップ
- 分析
Serverless web and mobile application
以下の組み合わせが多い
Lambda と API Gateway の管理 クラスメソッド 諏訪 悠紀
サーバレスの役割
- どこをサーバレスにするか
- サーバレスは様々なレイヤーで使用できる
フロントエンドレイヤー
バックエンドレイヤー
- ユーザの目に見えない部分
- Data Processingなど
- SNS + Lambda
- S3 + Lambda
- Streams系 + Lambda
他にも
- Cognito User Pools + Lambda
- CouldFormationのLambda-backend カスタムリソース
- Slack + API Gateway + LambdaでChatOps
管理方法の選定方法のコツ
- いっぱいある
- ツールごとに管理する上での観点が違う
API Gatewayとの併用
他のリソース管理
ロールバック
- 対応しているツールとしていないツールがある(Lambdaを前のデプロイに戻したい場合)
- ロールバック非対応の場合は手作業か自分で実装する必要があり手間がかかる
使い回し
管理ツール6種使い比べ
AWS CloudFormation
- AWSのリソース管理できる
- JSON記述
- 他のAWSリソースも管理出来る
- 依存関係定義
- 実行時パラメータを定義可能
- Lambda、API Gatewayサポート
- ソースコードをJSON内に記述可能
- EventSourceMappingをイベントソースに指定可能
Serverless
Apex
- Lambda特化
- LambdaファンクションのBuild/Deploy/Manageが可能
- Terraform連携
- Lamdaファンクションをテストするコマンドもあり
Gulp
- Node.js界隈でよく使われる
- 既にGulp使っているのであれば良さそう
SwaggerHub
Chalice(Beta)
Flourish(Comming Soon?)
AWS謹製ということでFlourishというものも近い将来にリリースされる予定です。詳細はまだ言えませんが、先ほどのChalice同様OSSとして公開される予定ですー。乞うご期待! #cmdevio
— Keisuke Nishitani (@Keisuke69) August 2, 2016
まとめ
- 何を重視するか
- 最適な管理方法を選定しよう
- いろいろなツールに触れよう
質問
- API Gatewayサポートと言いつつ、一部APIをサポートしていないケースがあったりするのだがどうしているか
- 実際にそのケースはある。Cloud Formationはほぼサポートしているのでおすすめ
実際に使う Cognito UserPools クラスメソッド 丹内 優紀
ServerlessとCognito
serverlessで解決したい問題
- EC2無しで簡単なプログラム運用(手間、お金)
- アプリケーションから本質的でないコードを少なくしたい
- Lambda以外のアプローチもある
Cognitoとは
アプリケーションの認証・認可をサポートするフルマネージドサービス
Cognito Identity
- 外部で認証されたユーザに対して機能を提供する
- Federated Identity
- 外部の認証サービスからの名寄せ
- 匿名ユーザとして認証可能(地味だけど結構大事)
- 複数のIdentity ProviderをひとつのIdentityとしてマージ可能
STS
- AWSへのアクセスキーを安全に発行する
- AssumeRoleやCondition節などIAMとの連携
- 短期間だけ有効なIAMを発行可能
Cognito Sync
- ユーザデータの同期機能を提供
- Sync Store
- KVSのように使えるデータストア
- SDK経由ならローカルストレージとの連携も簡単
Cognito Streams
Kinesis Streamsに送信できる
Cognito Events
Lambda Functionを実行できる
Cognito User Pool
- AWSが提供するIdentity Provider
- ユーザの登録・管理、認証
- パスワードやMFA、確認メール送信など一般的な認証機能を持っている
- GAになった!東京リージョンにも来た!
User Poolsの機能
- ユニークなユーザ名を設定
- パスワード認証、MFA
- パスワードポリシーが利用可
アトリビュート
メール・SMS確認・MFA
- 認証コード発行
- メッセージのテンプレート編集可能
- MFA可能
デバイストラッキング
- 同一ユーザのログイン上限を設定可能
- 初回ログイン時に認証とは別にトラッキングのトークンが発行される
- トラッキングが有効な端末はMFAをスキップ可能
- 管理者はSDK非公開のREST APIからデバイスリストを取得可能
- Global Sign-out(同一ユーザの全端末サインアウト)や管理者権限サインアウトも可能
トリガ
- Lambda Functionと連携可能
Cognito Identity連携
ポリシー変数
- Cognitoに割り当てられるIDに一致するリソースのみへの権限発行
- サーバを介さない処理を安全に行える
- IAMのCOndition節に変数を記載
OIDC Provider
大量リクエスト時の制限
Trust Relationship
- どのTOken発行者に対してAssume Roleを許可するかのポリシー
- 自分で編集するとハマる
まとめ
- User Poolsで認証機能をAWSに
- Cognito Identity連携でより多くの機能が使える
- 自分のビジネスに沿うやり方でサーバレスに
質疑応答
- Emailのメッセージに日本語入れて保存できない?
- (会場で実際に試して)できないですね。
Health Hack Meetupに参加してきた #health_hack
有楽町にあるFiNCさん主催のHealth Hack Meetupに参加してきました。
health-hack-japan.connpass.com
全体としてダイエット方面の話が多かった気がしてヤセ型の自分には関係ない部分もあったが、参考になる情報も多かった。特に懇親会でのデブエット(太るための活動)の話が興味深かった。
痩せるより、痩せ型な人が太る方がノウハウはあまりないらしいが、例えば
- 一回の食事量は少なくて良いので一日の食事の回数を増やす(間食に干しレーズンなどおすすめ。干し芋も良いが腹持ちがいいのであまり...)
- 痩せ型の人は胃腸が弱い人が目立つので、なるべく脂分や刺激物を取り過ぎないほうが良い
- 消化酵素を多くとる(エビオス錠などいいかもしれない)
などなど。
あとFitbitの実物を見せてもらった。心拍数や消費カロリーや歩数などあらゆる情報をスマートフォンのアプリと連携し取得できるらしい。データはサーバにも送られてそれが取得できるらしくAPIが公開されていた。
発表時のメモ
- ボルダリングおすすめ。背中の筋肉が鍛えられる。一人でもできる。頭使うので楽しい。結構安い(1500 ~ 2500円ほど)
- メンタル面
- 植物育てるのおすすめ(朝動こうとする外発的要因になる、日光浴びれる、生産物食べれる)
- 定期的に社内の人と飲みに行ったりしてコミュニケーションとろう。パンクする1/3くらい。深刻な話じゃなくても軽い気持ちで話せる。たまにマサカリ飛んでくると怖い。
- 週一の楽しみもとう(ラジオおすすめ)
- 痩せている人は内臓弱い人が多い。太らないからと脂分とりすぎると死ぬ
- 食事は野菜→タンパク質→炭水化物の順に食べると良い。
- タンパク質から食べるとインスリンが急に増大し血糖値が上がり、その後急降下するのでお腹が空きやすくなる
- 痩せ型は逆をすればいいのか...?
- 一口30回以上噛もう。セロトニンが多く分泌される。
- エレシのバターで作るコーヒーおすすめ
- 独自の方法の筋トレは怪我をしやすく危険。
- 「筋トレが最強のソリューションである 」おすすめ
- 寝る3時間前にご飯を食べない。睡眠中に内蔵が活動し睡眠の質が下がる
- 頭痛・肩こり・腰痛が生産性、モチベーション、集中力、結果に悪影響をおよぼす
- プレゼンティズム・ロス : 勤務中の効率低下で発生する損失
- 思考に関するデータもある
- 60000回/日: 思考回数
- その内80%: 2日前と同じ事を考えている
- その内95%: ネガティブ思考
- 爪に縦線が出ている、デコボコしている
- 睡眠不足や疲労、食生活の乱れ
- コンビニで買えるタンパク質
- コンビニで買える炭水化物
- 玄米・おにぎり。できれば半分残す
- ウィダインゼリーはすぐお腹が空く、血糖値が跳ね上がりやすい
- コンビニで買える野菜
- 両手のひら一杯の生野菜(正方形のパックのサラダくらい)
- 質の高い睡眠
- 遮光カーテンはおすすめしない。日光を浴びながら目覚めたほうが良い。
- 脂っぽいものは睡眠より早めに食べる(4hほど胃に停滞する)
資料(公開されしだい追記)
写真
最後に
会場提供、開催していただいたFiNCさんありがとうございました!
型、ついてますか? - 型の本質を振り返る - に参加してきた #AIAL
2016/7/8に開催された「型、ついてますか? - 型の本質を振り返る」に行ってきました。
会場は品川のマイクロソフトさんです。
大変内容が濃く興味深い話でしたが、時間が短かったこともあって大半は理解できなかった気がします。以下レポート。
型、ついてますか? 高野光弘さん(@takano32)
今日は(古代|近代|現代|原始) * (動的|静的)型付けで分類していく
静的型付け
動的型付け
- 事前に型の精査をしない
- いきなり実行できる
- 実行時にはじめて型がわかる
古代静的型付け
- C言語を代表とする
- システムと密接な型付け
- 型が不明だとデータの扱い方がわからない
古代動的型付け
処理の記述へとフォーカスしていく
BASIC
- 初心者向け
- 裏ワザ使ってシステムにアクセス出来る(DATE, PEEK,POKE)
シェル
- システムと対話するための機構を応用
近代動的型付け
古代動的型付けで解決が面倒だった分野の改善
パール(真珠)はシェル(貝)からできているという逸話
近代静的型付け
おみやげ話: C++のstructはclassと同じ動きをする
現代動的型付け
現代静的型付け
システム記述レイヤーからの解脱
- VM
- マルチプラットフォーム
- Java
- Haskel
- AltJS
原子動的型付け
レジスタ 即値 アドレス
機械語の型付け
- 実行時に即値かアドレスか判断
- この時点からは事前処理がない
- つまり動的型付けといえる
原始静的型付け
- 起源はラムダ計算
- 型なしラムダ計算
- 型ありラムダ計算
- 原始動的型付け ... ノイマン型
- 原始静的型付け ... 思考実験
なぜ歴史は繰り返すのか
- 静的型付けと見せかけて動的なのは邪悪
- TypeScriptは実行時にJavaScript)
- C言語やC++はデバッガを強化して延命された
これからのパラダイム
抽象化がさらに進む
個人的に欲しいパラダイム
副作用を考慮したシェル
- ここでいう「副作用」とは操作がマシンに影響するか
- ls → 副作用なし
- mkdir → 副作用あり
「俺が聞きたい話はこんなんじゃなかった」→ イベントやるから来てね
Linear Types niryuuさん
資料待ち
Linear Typesとは
- 1度しか取り出せない値を表す型
- Uniqueness types(Clean)
- Ownership(Rust)