Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

Kanazawa.rb meetup #78 に参加しました #kzrb

実は77にも参加していたけどブログ書くの飛ばしてしまった...。なので2019年初のkzrb参加日記になります。

kzrb.doorkeeper.jp

buffbuffのテストコードを書く

github.com

ひとまずgem化するところまではできて落ち着いたのですが、今後メンテナンスしていくときにはテストコードが必要だろうと思い、もくもく会で書いていました。しかし Buffbuff::Command のspecを書いている途中で時間切れ。 主に以下の点でハマっていました。

あまり記事も見当たらなかったので、ベースとしているライブラリのthorのテストコードから同じようなことやってないかなーと調べるのに時間を費やしていました。

懇親会

r.gnavi.co.jp

www.hotpepper.jp

冬キャン、組織の文化と採用、勉強会やカンファレンスの会場問題、インシデントとどう向き合うか、その他オフレコトークについて話していました。珍しく日本酒を多く飲んでた記憶。

おわりに

来月はHashiCorpプロダクトのTerraform, Vaultについての勉強会です!ぜひご参加を。

connpass.com

JAWS-UG金沢 #38 に参加しました #jawsug

jawsug-kanazawa.doorkeeper.jp

re:Invent 2018の振り返りがメインの会でした。私は以前から要望のあったDockerコンテナ運用の話をしてきました。

発表

以前からJAWS-UG金沢の中でDockerコンテナの運用について話してほしいと言われていて、満を持して今回発表ということになりました。お手伝いしている zozo.com の構成をほんのり紹介しながら Elastic Beanstalk を使ったDockerコンテナ運用についてまとめました。Webアプリケーションの実行基盤っていろいろ選択肢があって、さらにDockerを使うにしても今なら Kubernetes を使う選択肢もあるし Heroku も選択肢に含まれるのではと思います。今思うと、スライド内で紹介したEBを選んだ理由は後付けの部分が少しあったりしますが実際使ってみて感じたところです。

re:Invent 2018 振り返り

www.slideshare.net

なんと自費で re:Invent に参加した方がおられて発表していただきました。すごい。。

あとは re:Invent で発表された新サービスや新機能についてお互いに発表し合うというコーナーも設けられました。DynamoDB TransactionやLambdaのCustom runtime サポートについて注目している人が多かった印象です。

docs.aws.amazon.com

docs.aws.amazon.com

機械学習勉強会レポート

www.icloud.com

昨年福井で行われた機械学習勉強会について発表していただきました。Amazon SageMaker を使ったハンズオンが行われて簡単に画像分類(手書き数字)できるよという内容だったそうです。

感想

仕事でお世話になっている cozima さんが東京から参加してきてくれ、北陸で一緒に酒を飲めたのが感慨深かったです。 2月はJAWS DAYSに行くぞー。

2018年個人的振り返り

毎年やってるやつです。年が明けてから振り返るのも悪くはないでしょう。

www.blogaomu.com

仕事

2018年も引き続きZOZOのお仕事を手伝っておりました。

zozo.com

立ち上げ→リリース→運用というフェーズに変わって、(マイクロサービスの)チームのリーダーから1メンバー、そして技術課題を解決するチームの1メンバーと自分の役割も変わった1年でもありました。その傍らでインフラとPythonサーバーチームのお手伝いをしていて、相変わらずいろんなところに顔を出す人として動き回っていました。

チームのリーダーとしてやっていた頃はコミュニケーションの質・量ともに課題があり行き詰まってしまったので、自分からこれ以上リーダーの役割はできないと相談し、実際に1メンバーとしての役割に移してもらいました。自分の設計スキルやそれを言葉にして伝えるスキルが足りなかった、という要因も少なくはないのですが、オフィス勤務のメンバーがマジョリティでリモート側がマイノリティになってしまう環境的要因もあったのかなーと感じています。

1メンバーとしての役割に戻った後は、実装、レビューのサイクルをひたすら回すという感じでリリースまで走り抜け、運用段階に入ってくると技術課題を解決するチームに移りました。(チームといっても2人ですがw) ここでは日々の開発で困っていることを解決したり技術的方向性を決めたりするのが役割で、具体的なタスクを一つ上げるとCI/CDを速くするというのに取り組んでいるところです。ここの部分って地味ではあるんですが、関わってるメンバーに最も見られる部分でもあるので今まで以上にやっていかないとなという気持ちになっています。

いろんなところに顔を出す人としては、どうしてもあれもやらなきゃこれもやらなきゃと考えてしまって時間が足りなくなってしまうのですが、2018年はScalaとDockerに重点を置いたのかなと思います。2019年はマイクロサービスやKubernetesの思想とパターンを身に付けたいです。

コミュニティ活動

定期的な活動としては、Kanazawa.rb 11回、JAWS-UG金沢 5回に参加しました。2018年の裏目標としては、発表(1回の質・量にこだわらず)をたくさんする、というのがありまして Kanazawa.rb ではそこそこできたかなと思います。発表の準備をする中でも特にこの2つに気付けたのはよかったのかなと思いました。

  • 資料をディスプレイに映して声を出して練習する
  • だいたい時間オーバーするので削る作業を行う(何を大事にして話すか決める)

発表はまだまだ慣れてはいないので、2019年も継続してやっていきたいです。

大きなカンファレンスとしては、Japan Container Days v18.04、Scala関西Summit 2018の2つに参加しました。カンファレンス参加はかなり久しぶりでしたが、やはり刺激になるし普段は一人でやっているので情報を仕入れるという点でも良いですね。

www.blogaomu.com

www.blogaomu.com

また上記とは毛色が異なるところでは、ホクリク魅力ソンというアイデアソンに参加しました。ブログ記事はまだ書けてないのですが💦 アイデアソンには初めて参加し難しさも覚えながらも自分の感心のあるスポーツというトピックで技術の観点からアイデアへの貢献はできたのかなと思います。

riac.nict.go.jp

Uターンして2年過ぎましたが、こうして技術的なコミュニティ、さらにフットサルやサッカー観戦などでも知り合いが増えてきて、拠り所が複数できているのはありがたいなあと思います。普段はSlackやzoomでは繋がってるけど一人で作業していることがほとんどなので、雑談したり相談したりそういうことができる場は大切だなと感じています。

個人開発

Kanazawa.rb の運営から派生して以下のツールを作りました。なんかこんなのあったら良さげ?という会話ベースのところから始まったのですが、何とか形にできたのはとても良かったです。自分の作ってるプロジェクトはだいたい途中で挫折しがちなので💦

github.com

2019年は MH-Z19 というCO2センサーを手に入れたので、これを使ってお部屋のCO2濃度検知くんを作りたいなーと考えています。これも無事に形にするところまで持っていきたい。

上手い酒を飲めるように生きていきます。

buffbuff をgem化するにあたってのメモ

概要

buffbuff をgem化しました。

github.com

当初は clone してそのまま利用するという作りにしていたのですが、gem としてインストール(from GitHub)できるように修正を行いました。この作業でハマった点や気付いた点などを書き残しておきます。

メモ

Kanazawa.rb meetup #76 に参加しました #kzrb

DMM.com 金沢南町営業所のイベントスペースをお借りして開催でした。広くて画面がでかくてよいですね。

f:id:TAKAyuki_atkwsk:20181215133410j:plain

kzrb.doorkeeper.jp

今回は年末恒例のLT大会回でした!参加者全員発表だよ、わいわい!

話したこと

少し前から作っていた Buffer への投稿ツールの話をしました。

github.com

LTではツールを作るモチベーションのところと実際のコマンドについて話しました。当初話の内容を考えているときは、どういうライブラリを使っていてとか作っていてこう思ったとかということも含めようとしていたのですが、練習で喋ってみると優に5分をオーバーしたので泣く泣く削ることにしました。なので、技術的な話というよりも問題をどう解決するのがいいかなっていうところを話の中心に据えたイメージです。

ということで、削ってしまった部分の作って思ったところをいくつか紹介します。

ツールを作った感想

  • bundle gem コマンドで gem のひな形を作ってくれるので、最初からこれを利用すれば良かった
    • 久しぶりにRubyでプロジェクト作ったのですっかり忘れていた...
    • require でlib以下のソースコードを参照するのに上手くいかない箇所があった
    • 自力では解決できなさそうなので、他のgemを参考にしようとした
    • いろいろ調べていたら以下の記事が参考になった
    • https://tech.crevo.jp/entry/2018/10/02/150430
  • VSCodeで開発してみた
    • 今まではVimだったけど
    • オススメプラグインあれば教えてください><
  • Thor ライブラリ便利だった
    • ANSIカラー表示とかYes/Noインタラクションを簡単に実装できる
    • シェルスクリプトで実装しようとするとまあまあだるいのでありがたい
  • Arrayタイプのオプション指定方法が好みじゃない
    • オプション値の切れ目が分かりづらい
    • command <Arrayタイプのオプション> <引数> という方法でコマンド実行すると引数もオプションの値としてパースされる
    • docker run--env みたいなのが好み
      • ex.) docker run --env VAR1=value1 --env VAR2=value2 ubuntu bash

今後はgemとしてインストールできるようにする(おそらくテンプレートディレクトリが上手く読めなくなるはず)というところが直近の修正ポイントになります。 @kiyohara さんも早速使いたいと言ってくれたので良かったです!

懇親会

ピザを食べつつ技術や組織、就職、転職、スプラトゥーン(自分はついていけなかったけど)などの話をしてました。ピザの量、調整するの難しいですね!注文時はテンションが上がってどうしても多めに頼んでしまうw

f:id:TAKAyuki_atkwsk:20181215171227j:plain

今年も Kanazawa.rb お疲れさまでした。また来年もゆるゆるやっていきましょう。

Kanazawa.rb meetup #75 に参加しました #kzrb

今回はDMM.com 金沢事業所をお借りして開催!

kzrb.doorkeeper.jp

当初は自分含めて2人しか参加表明してなくて不安でしたが最終的には11人の参加になりました。わいわい。

Scala関西Summit 2018に行ってきた話

www.blogaomu.com

↑の話をベースに写真も追加したスライドを作って発表しました。コンセプトとしてはScala関西Summitに行った気になれる、だったんですが、いろいろ詰め込みすぎてだいぶ時間を取ってしまいました(すいません)。Scalaは可愛いを広めることができてよかったです。

Bufferを操作する

Kanazawa.rb告知用のSNS投稿をBufferで行っているとのことで、これをCLIでやれたらいろいろ捗るのでは?という考えから今回のもくもくタイムではBuffer APIを触ってみました。

APIを触る前にBuffer自体を使ったことが無かったのでアカウントを作っていろいろ試して概念を理解するところから始めました。

  • 1アカウントに対して複数のSNSアカウントをひもづけられる。ひもづいたSNSアカウントのことをProfileと呼んでいる
  • 投稿はQueueというものに格納され、特定の時刻になったらSNSアカウントを通して接続先のSNSに投稿される
    • 投稿時にQueueに入れる(Add to Queue)、即時にSNS投稿する(Share now)、任意の日時に投稿する(Schedule post)、の3つから選択できる
    • Queueに入った投稿は1件ずつ時刻(Posting times)が割り振られ、その時刻になると接続先のSNSに投稿される

投稿に関する概念はざっとこんな感じだと思います。詳しくはこの辺を見ると良さそう。 Managing your Queue - Buffer FAQ

概念を理解したところで、プログラムからBuffer APIを呼ぶ場合には公式のgemがあるのでこれを利用すると良さげです。

github.com

Buffer APIを利用する場合、先にアプリケーションの登録をサイト上で行う必要があります。画面に従って入力していけばOKです。ここで発行されたAccess tokenを使用します。

buffer.com

先ほど発行されたAccess tokenを環境変数 BUFFER_ACCESS_TOKEN に入れておいて、replでいろいろ操作してみます。

> require 'buffer'
> client = Buffer::Client.new(ENV['BUFFER_ACCESS_TOKEN'])
# Profileの取得
> profiles = client.profiles
=> [{"_id"=>"5bef956a4b1be7784607d225",
  "avatar"=>
   "http://pbs.twimg.com/profile_images/835761987728502784/QMKQ3UYI_normal.jpg",
  "avatar_https"=>
   "https://pbs.twimg.com/profile_images/835761987728502784/QMKQ3UYI_normal.jpg",
  "can_see_content_library"=>false,
  "counts"=>
   {"sent"=>4, "drafts"=>0, "daily_suggestions"=>25, "reminders"=>0, "pending"=>0},
  "cover_photo"=>
   "https://d3ijcis4e2ziok.cloudfront.net/default-cover-photos/blurry-blue-background-iii_facebook_timeline_cover.jpg",
  "created_at"=>1542428010,
  "default"=>true,
  "disabled"=>false,
  "disabled_features"=>[],
  "disconnected"=>false,
  "formatted_service"=>"Twitter",
  "formatted_username"=>"@TAKAyuki_atkwsk",
  "id"=>"5bef956a4b1be7784607d225",
  "is_analyze_enabled"=>false,
  "is_on_business_v2"=>false,
  "locked"=>false,
  "paused"=>false,
  "paused_schedules"=>[],
  "preferences"=>{},
  "reports_logo"=>nil,
  "schedules"=>
   [{"days"=>["sun"], "times"=>["09:55", "14:25", "16:44", "19:32"]},
    {"days"=>["mon"], "times"=>["09:55", "14:25", "16:44", "19:32"]},
    {"days"=>["tue"], "times"=>["09:55", "14:25", "16:44", "19:32"]},
    {"days"=>["wed"], "times"=>["09:55", "14:25", "16:44", "19:32"]},
    {"days"=>["thu"], "times"=>["09:55", "14:25", "16:44", "19:32"]},
    {"days"=>["fri"], "times"=>["09:55", "14:25", "16:44", "19:32"]},
    {"days"=>["sat"], "times"=>["09:55", "14:25", "16:44", "19:32"]}],
  "service"=>"twitter",
  "service_id"=>"77184067",
  "service_type"=>"profile",
  "service_username"=>"TAKAyuki_atkwsk",
  "shortener"=>{"domain"=>"buff.ly"},
  "statistics"=>{"followers"=>785},
  "timezone"=>"Asia/Tokyo",
  "timezone_city"=>"Tokyo - Asia",
  "user_id"=>"5bef953a4b1be777074c2b05",
  "utm_tracking"=>"disabled",
  "verb"=>"tweet"},
  ...]

# 投稿をQueueに入れる
> client.create_update(
*   body: {
*     text: 'お腹吹田',
*     profile_ids: [profiles.find {|profile| profile.service == "twitter" }.id],
*   }
* )
=> {"updates"=>
  [{"_id"=>"5befaff6dd5072291b2a9b93",
    "client_id"=>"5befa27c4b1be72ec04037b3",
    "created_at"=>1542434806,
    "day"=>"Today",
    "due_at"=>1542450720,
    "due_time"=>"7:32 pm",
    "id"=>"5befaff6dd5072291b2a9b93",
    "is_video_processing"=>false,
    "library_update_id"=>"",
    "needs_approval"=>false,
    "organization_id"=>"5bef953a4b1be777074c2b07",
    "perm_approvable"=>false,
    "perm_editable"=>true,
    "pinned"=>false,
    "profile_id"=>"5bef956a4b1be7784607d225",
    "profile_service"=>"twitter",
    "shared_now"=>false,
    "status"=>"buffer",
    "text"=>"お腹吹田",
    "text_formatted"=>"お腹吹田",
    "text_md5"=>"e01909236cf97670e3f23a95e52c7072",
    "type"=>"text",
    "updated_at"=>1542434806,
    "user_id"=>"5bef953a4b1be777074c2b05",
    "via"=>"api"}],
 "buffer_percentage"=>20,
 "buffer_count"=>2,
 "success"=>true,
 "message"=>"One more tweet in your Buffer. Keep it topped up!",
 "code"=>false}

# 複数のProfileで投稿する
> client.create_update(body: {text: "こんにちは", profile_ids: profiles.map(&:id)})
=> (略)

# 特定の日時に投稿されるようにする
> client.create_update(body: {text: 'hogehoge', profile_ids: [profiles.find {|profile| profile.service == "twitter" }.send(:id)], scheduled_at: "20181117T19:00:00+09:00"})
=> (略)

ひとまず複数の投稿形式を試して思った通りに動作しました。 profile_ids を取ってくるところで少しハマりましたが、後はAPIパラメーターを調べつついけました。このあとはCLIとして操作できれば良いなと考えているのでthorと組み合わせて実装してみようと思っています。

懇親会

www.hotpepper.jp

www.hotpepper.jp

一次会は手羽先食べ放題コース!過去にいくつかの食べ放題に勝ってきたkzrb勢も手羽先には勝てなかった...。

二次会は安定の丸二。唐揚げがでかいぜ!

懇親会で、作業部屋のCO2濃度を計測して可視化およびアラートを出す仕組みを作りたいと相談したところ、まともな濃度センサーはお高いらしく中国から輸入するのが良さそう?とのことでした。また、Withingsの体重計でCO2濃度も測れるやつがあるらしく、可視化ならこれでもいいのではという話も。

次回のKanazawa.rbは年末恒例のLT大会です!

Scala関西Summit 2018に参加しました #scala_ks

大阪にて行われたScala関西Summit 2018の1日目に参加してきました。私自身にとっては初の参加で、Scalaの集まりとしても久しぶりに顔を出しました。

2018.scala-kansai.org

プラチナスポンサーがZOZOテクノロジーズだったので一番大きなホールの名称がZOZOホールになっていました。

私が聞いたトークセッションについて軽くメモ

http4sとcats-effectで可愛らしい、関数型らしいアプリケーションを書こう!٩(๑^o^๑)۶

https://speakerdeck.com/dysangelist/tagless-final

  • 発表者のダーシャは仕事でお世話になってるのと「可愛らしい」ってどういうこと?というのが気になって聞くことにした
  • Scalaの特徴を可愛さに例えているのが良いポイントでした
    • 簡潔さ、高レベルでの抽象化、論理的、型システムで安心などなど
  • Tagless Finalという手法?の紹介
    • うまく理解できなかったけど、実装を良い感じに分離できるとかそういう良さがあるのだろうか?

アニメーションで理解するAkka StreamsとAkka HTTP

https://youtu.be/NBKpr7bL22M

  • これまでAkka Streamsを触る機会があってドキュメントを読んだりもしたけどふわっとした理解だったので聞くことにした
  • アニメーションで概念が理解しやすかった
    • 爆発シーンが最高
  • Akka HTTPがAkka Streamsで構成されてるのは興味深かった

Format things with scalafmt

https://speakerdeck.com/tanishiking/format-things-with-scalafmt

  • 共感を覚えた意見
    • 人によって暗黙的にしたがっているスタイルが存在しているので、人が増えるとカオスになる
    • 瑣末な議論を減らして、本質的なものの議論に重きを置きたい
  • ScalafmtはScalametaというものでScalaを解析しているそう(コンパイラとは別の実装)、すごい
  • 既存のコードベースからdiffの少ない設定を生成するやつ

Scala-erにも影響ありそうなJavaの現状まとめ

https://www.slideshare.net/linecorp/summary-of-the-state-of-java-that-will-affect-scalaers

  • JavaはOpenJDKとしてオープンソースコミュニティで開発
  • Javaのビルドはいろいろなプロバイダーが提供している(Oracle, AdoptOpenJDK, クラウドベンダー等)
  • リリースサイクルが変わったことは知っていたけども、サポートポリシーや各種ビルドについて知らないことばかりだった

Akkaを分散トレーシングで見てみよう

http://nbviewer.jupyter.org/format/slides/github/grimrose/scala-kansai-summit-2018/blob/master/slide.ipynb#/

  • Scalaに限らずマイクロサービスにも通ずる話題だったし、分散トレーシングという概念は今後ものにしておきたいトピックだった
  • Kamonを使っているけどもJVMメトリクスの取得に使っていたので、トレーシングの方も調査したい
  • OpenTracingという統一した仕様を策定している(CNCFプロジェクト)
    • 実装はそれぞれのライブラリで異なる
  • Jaegerのロゴが可愛い(gopherっぽい)
  • 途中で発表者のドリンクタイムを入れていたのが良かった(Pyconの発表であったのを取り入れたらしい)
    • 聞く側も一段落できて良い

DatabricksとSparkではじめる [データ分析/機械学習] 実践入門

https://speakerdeck.com/smdmts/databrick-and-spark-with-data-analyze-and-ml-for-newbie

  • Databricks便利っぽい
    • AWS上に実行基盤を構築可能で、Web UIもある
    • Web UI上のNotebookで開発できる
  • ここからはScalaの世界観で、ここからはPythonの世界観という風な言い回しが特徴的だった
  • Sparkが基盤になっているとScalaを使う場面も出てくるのか、なるほどと思った

Json codec を楽しもう、現場で役立つ circe

http://labs.septeni.co.jp/entry/2018/09/18/090727

  • 「キルケ」派が多い?(「サース」って呼んでた)
  • library versionの書き方面白かった .map(_ % version) 的な
  • 私も使っていますが今のところJsonライブラリとしては最も使い勝手が良い感じ
    • Encoder/Decoderの自動導出(サポートされている型の多さ、case classにも対応)
  • forProductN知らなかった

実践GraphQL on Scala

https://speakerdeck.com/petitviolet/real-world-graphql-on-scala

  • 思い切ってGraphQLを導入(フロントエンドはElmだそうです)
  • 型システムを持っているものとScalaは相性がよいと再認識
  • 参照系と更新系でアプリケーション内の層を分けているのは興味深かった

良かった点

  • 写真公開NGの人を明示的に区別できていた(名札の色で判断できる仕組み)
  • 写真撮影用スタッフがいた
  • フリーコーヒー
  • 快適なwifi
  • 椅子のみではなく机がある
  • 学生スタッフが結構いた
  • アンカンファレンスのScala酒場(参加できなかったけけど、ツイッターで流れてきた画像を見て良さそうと思った)

懇親会

懇親会は会場変わって、大阪駅から直ぐのさくらインターネット。オープンスペースにはバーカウンターがあってオシャレ空間だった。お料理も美味しかったです!

発表者に質問してみようかなとか思ってたんですが、話に割って入るのが個人的にはハードル高いので聞けずじまいに終わってしまいました。でも初めましての方とも話すことができて良かったです。金沢から来ましたーと言うとかなりの確率でびっくりされましたw (関西勢と東京勢が多かった)

その他の様子

スタッフの皆様、参加者の皆様、楽しい空間をありがとうございました!はるばる金沢から参加して良かったです!

あと、早朝のサンダーバード乗るのしんどかったので来年は前乗りしようかなと思いますw