２０１８年Diverseアドベントカレンダー総括

当初の思惑では、自分でアドベントカレンダーを埋めることで「俺がDiverseだ」と言うつもりだったのが、気がつけば全ての日が埋まり「俺たちが、Diverseだ！！」という結果になりましたのでハッピーエンドだったのではないでしょうか？[^1]

さて、最後はアドベントカレンダー定番の振り返りをしてみましょう。

## 12/1 [始まるよ、Diverse Advent Calendar！！](https://qiita.com/k-motoyan/items/00543a686dc6bddb9d5f)

学校のチャイムを鳴らすという非常に下らない内容からスタートしました。

## 12/2 [Goで環境変数を読み込んでバイナリに埋め込む](https://qiita.com/k-motoyan/items/dcf70208b99d6e0e9334)

Golangで特定の環境に定義されている情報を埋め込んでコンパイルする方法についての方法です。

## 12/3 [Diverse Podcastを支える技術](https://qiita.com/kikuchy/items/099c9e7c69dbaad941b4)

DiverseのPodcastは面白いとかなんとか...
そういう噂が後を絶ちませんが、その裏側の話をうかがい知ることが出来る貴重な内容でしたね。

## 12/4 [DockerのOpenCVでHaar-like特徴分類器を使うとき](https://qiita.com/k-motoyan/items/3230c45c803be85a6d25)

これを書いたあたりまで一人でアドベントカレンダーの空きを埋めるつもりだったので、顔認識技術を利用したシリーズモノを構想していたのですが他の参加者の皆様のおかげで無事お蔵入りすることが出来ました。
ので、この投稿だけだと内容が無いようです…

## 12/5 [18年続く老舗マッチングサービスにFlutterを導入しかけの話](https://qiita.com/kikuchy/items/09bcc8e4c7fd691e1a9c)

@kikuchy 二度目の登場です、カッコいいですね！
記事の内容もエッジの効いたFlutterを導入していく話だったり、GRPCの話だったりで最先端の技術に触れたい人には見逃せない内容でしたね！！

## 12/6 [アプリのロジックからisIPhoneXフラグを消すためにやったこと](https://qiita.com/imaizume/items/b302b1ccb6fab6e21e83)

iPhoneXと一緒に登場したSafeAreaのが概念で多くのiOSエンジニアはその対処に混乱を極めたかと思います。
そんな中で残った負債に正面から向き合った勇ましい内容でした。

## 12/7 [TensorFlow で学習したモデルのグラフを `tf.train.import_meta_graph` でロードする](https://qiita.com/cfiken/items/bcdd7eb945c5c3b2bb5f)

今最も熱い技術TensorFlowのお話！
本格的に学習モデルを作っているとこういう話が重要になるんですね、きっと。

## 12/8 [AWS System Manager セッションマネージャーを利用してEC2インスタンスにシェルアクセスする時に楽したい](https://qiita.com/python_spameggs/items/ca511b423c60479a64cd)

AWSのたくさんあるインスタンスを選択してアクセス出来るようにする便利スクリプトでした。
このスクリプト、本当に便利なんですよ！

## 12/9 [BIツールが定着していない会社でLookerを導入したわけ](https://qiita.com/SAMUKEI/items/4de3ffbf952dcba453ad)

Diverse社内でも、期待度が高まっているLookerのお話でした。
テーブルのカラムに対するエイリアスだったり、コンピュート式のような概念があるのは便利そうですよね！

## 12/10 [W3C形式のログをApache形式のログに変換する](https://qiita.com/shiranuik/items/c5809ab460d052449d4a)

AWSのログが出す日付のスタイルが独特（知らないだけでメジャーなのかもしれませんが…）なので、私は見るたびに思考が停止してしまいます。
こんなときに、よく見知ったApacheスタイルのログに変換出来るスクリプトがあると嬉しいですね！

## 12/11 [みんなでやる「他社アプリを見る会」](https://note.mu/yuaono/n/ndf02998ec9f7)

デザインに関する意識の共有、世の中の開発チームで出来ているところは意外と少ないのではないでしょうか？
他者のアプリと比較しながらデザイン・サービスに関する価値観を共有出来るこの会は非常に有意義で価値のある会だと思います。

## 12/12 [RoomにCoroutineサポートが入ったので触ってみた](https://qiita.com/tyoshihisa/items/7ebfe58bee5dd994c09a)

Androidの開発にもKotlinらしさが取り込まれていく一例でしたね、
関数自体に`suspend`とつけるだけで済むのはなかなか便利なように思います。

## 12/13 [BitriseのiOS Auto Provisionを導入してAdHoc配信のためのUDIDの更新作業をブラウザ上でぽちぽちするだけで完結させる話](https://qiita.com/abui/items/009ccf4dd981c223e913)

ProvisioningProfileの運用はなかなか難しいものがあります。
このあたりの作業をブラウザだけで完結出来るのはとても便利で良さそうですね！

## 12/14 [男性メイン画面のカードスワイプ部分をゴリゴリリファクタリングした話](https://qiita.com/starmaine777/items/e7d43a64169863fd2ddb)

密結合化したアーキテクチャを分離してテストを導入するという、リファクタリングのお手本のような話でした。
（そして、その現場の雰囲気がひしひしと伝わってくる！！）
密結合化したアーキテクチャを見ると誰もが尻込み、見てみぬふりをしたがる中、しっかりとやり遂げているのが素敵ですね。

## 12/15 [Diverseが健全な開発を行える組織を目指すために](https://developer.diverse-inc.com/entry/2018/12/15/221857)

サービス運営を行っている会社のエンジニアの仕事を以下のように分類されています。

> 1.サービスのための開発(ユーザーに刺さるコンセプトや時代に求められている要素を伸ばすための開発)
2.サービスを事業として成長させていくための開発
3.サービスを持続的に運営していくための開発

息の長いサービスになると３番目の重要性が高くなるのですが、この難易度がまた高い。
この記事を読んで見るだけでもその難易度の高さが伺いしれますが、そんな高い壁だからこそやりがいもあるのですよね！

## 12/16 [iPhone Xで簡単に顔認識ができた話](https://qiita.com/kiy0p0n/items/edc3518cc4e8d332f7d3)

今話題のVTuberがどのような技術で成り立っているのかをうかがい知ることが出来るお話でした。
FaceTrackingがこんなに簡単に実装出来るなんて、その驚愕を隠しきれずにはいられません！！！

## 12/17 [グロース初心者がGoogle オプティマイズを使ってABテストを開始するまでの話](https://note.mu/nakaz/n/nfb7f89e0c2a6)

スピード感を重視した開発サイクルに適応できつつ、まだまだやれることも多そうなGoogle オプティマイズ、とても興味深いですね。
今後の利用例の話も気になるところです。

## 12/18 [Reproを使いやらかしてしまった話](https://qiita.com/clownfish/items/b043e84498e47efd026e)

たくさんの悲しみから組織が成長していくというモデルケースのようなお話でした。
私達は数々の悲しみの上に立って進んでいることを再認識出来ましたね。

## 12/19 [FlareをFlutterだけじゃなくてJSでもFlareった話](https://qiita.com/yuki-o/items/388362990b9d25194611)

この記事中にあるアニメーションを見た時、これが実用レベルに到達したらとても凄いじゃないか！とワクワク出来る内容です、私もFlareってみたい！！

## 12/20 [Poiboyで使用しているFirebaseの機能紹介と事例ついでにおまけ](https://qiita.com/giiiita/items/ee3423c39456093dc5ea)

Firebase、いろいろ出来て凄いですね！
サーバーサイドで実装されがちな機能もこのようなサービスを利用したほうが良さそうなケースも多くありそうです。
Firebaseの理解を深めて、最適な形で機能を作っていけるようにしたいですね。

## 12/21 [デザイナーが考える！心理学を取り入れて少しでもマッチングの確率を上げる方法](https://qiita.com/mina_m/items/e0d61e771cb6cecb22a0)

マッチングアプリといえば写真ですが、その写真を利用した効果的なマッチング率向上の方法を心理学の側面から解説されています。
こういった機能をシステム側からも提供していけるようになりたいですね！

## 12/22 [OKR を何故やるか](https://medium.com/diverse-inc/okr-%E3%82%92%E4%BD%95%E6%95%85%E3%82%84%E3%82%8B%E3%81%8B-995adc74af60)

DiverseではFailFastという価値観を持って働きましょうというのがあり、これは失敗を早くして多くのトライをしましょうという価値観です。
OKRはこの価値観を助けるものにも繋がっているのかなと感じました。

普段業務をこなしているとOKRのようなフレームがあっても、そこを意識する気持ちが薄れていくことはあると思います。
何故やるのか？というのをきちんと文章にすることで、意識をリセット出来るようにしてあるのはとても大切ですね！

## 12/23 [PringとMuniを使ってリアルタイムチャットを爆速で実装する(中級者向け)](https://qiita.com/Masataka-n/items/6210c8eb10a2158f9eca)

マッチングアプリといえばチャット機能ですが、そのチャット機能を爆速で作り込めるフローが紹介されています。
テキストだけでなく、画像や動画も送れるなんて凄いですね！

## 12/24 [Material Theming Editorを使って彼氏を作る話](https://note.mu/celica_i/n/n39a8285c1313)

「KARISHI」というレンタル彼氏サービスのデザインが出来上がりました。
とてもクールなデザインでしたね、格好いいです。
彼氏もできた？？？ようで何よりです。

## おまけ

MacOSを利用しているあなたは、何も考えずに以下のコマンドを実行してほしい。

```
gem install osxdsp
brew install sox
```

次に以下のプログラムを作って欲しい。

```rb:sound.rb
require 'optparse'

SampleRate = 8000
Freq = 440.0

params = ARGV.getopts("", "sound:0", "speed:1", "volume:60", "opt:1,1,1")
Speed = params["speed"].to_f
SoundType = params["sound"].to_i
Volume = params["volume"].to_i
Opts = params["opt"]

class Sound
  attr_reader :beat, :note
  def initialize(beat, note)
    @beat = beat; @note = note
  end
  def +(octave)
    Sound.new(@beat, @note + (octave * 12))
  end
end

def C(beat); Sound.new(beat, 3); end
def D(beat); Sound.new(beat, 5); end
def E(beat); Sound.new(beat, 7); end
def F(beat); Sound.new(beat, 8); end
def G(beat); Sound.new(beat, 10); end
def A(beat); Sound.new(beat, 12); end
def B(beat); Sound.new(beat, 14); end

def play(sounds)
  data = []

  sounds.each do |sound|
    (0..(sound.beat*Speed)).step(1.0/SampleRate) do |t|
      base = Freq*2**(sound.note/12.0)

      value =
        case SoundType
        when 0 then
          Math.sin(2*Math::PI*base*t)
        when 1 then
          v = t*base%2; [v*2-1,3-v*2].min
        when 2 then
          c,m,b = Opts.split(",").map(&:to_f)
          Math.sin(2*Math::PI*base*c*t+b*Math.sin(2*Math::PI*base*m*t))
        end

      data << 128 + (value * Volume).round
    end
  end

  open("/dev/dsp","wb") { |io| io.puts(data.pack("C*")) }
end

play [C(1), F(1.5)]
play [F(0.5)]
play [F(1)]
play [A(1), G(1.5)]
play [F(0.5)]
play [G(1)]
play [A(1), F(1), F(1), A(1), C(1)+1, D(3)+1]
play [D(1)+1, C(1.5)+1]
play [A(0.5)]
play [A(1)]
play [F(1), G(1.5)]
play [F(0.5)]
play [G(1)]
play [A(1), F(1.5), D(0.5), D(1), C(1), F(3)]
play [D(1)+1, C(1.5)+1]
play [A(0.5)]
play [A(1)]
play [F(1), G(1.5)]
play [F(0.5)]
play [G(1)]
play [D(1)+1, C(1.5)+1, A(0.5), A(1), C(1)+1, D(3)+1]
play [D(1)+1, C(1.5)+1]
play [A(0.5)]
play [A(1)]
play [F(1), G(1.5)]
play [F(0.5)]
play [G(1)]
play [A(1), F(1.5), D(0.5), D(1), C(1), F(3)]
```

オーディオはONにして、以下のコマンドを実行してみよう。

```
ruby -rosxdsp sound.rb
```

さぁ、どうだろう？
終わりを感じることが出来たかな？？？

### おまけ２

おまけのプログラムは以下のパラメタを与えることで音やテンポを調整出来るので楽しんでみると良いかも！？

```sh
# sound: 0 ~ 2 を設定出来る (default = 0)
# speed: 0.5 = 2倍速, 2 = 1/2倍速 …のような感じでテンポを調整出来る (default = 1)
# volume: 音量を調節する、小さい値を設定すれば音は小さくなる (default = 60)
ruby -rosxdsp sound.rb --sound 1 --speed 0.5 --volume 1

# soundに`2`を指定した場合は、--optを調整して音を調整することが出来る
ruby -rosxdsp sound.rb --sound 2 --opt 1.2,3.0,0.5
```

---

それでは皆様、良いお年をお迎えください！

[^1]: 元ネタは[こちら](https://dic.nicovideo.jp/a/%E4%BF%BA%E3%81%8C%E3%82%AC%E3%83%B3%E3%83%80%E3%83%A0%E3%81%A0)