ハッカーズチャンプルー2018に参加した

hackers-champloo.org

沖縄の宜野湾コンベンションセンターで開催されたハッカーズチャンプルーというイベントに参加してきました。 イベントの存在自体は知っていたのですがあんまりキャッチアップできておらず、いつの間にか参加人数が満員になって焦った(無事キャンセル待ちで入れました)。 初めて参加したのですが、トークの話題にデザイン, Go, Clojure, CTOの今ここにいるまでの話, VTuber など全体的に話題が散らばっており、これぞチャンプルー!って感じでした。 技術系イベントでは自分では取りに行かないような話題をざっくばらんに聞いて、最近の動向とかを知るのが好きなのでとても楽しかったです。

トークの感想

特に面白かった話としては fujiwara さんのベンチマーカーの話。

Goとコンテナで作るWebアプリケーションベンチマーカー / Benchmarker built with Go and Container - Speaker Deck

スマホゲームはリリース時にキャンペーンをしたり広告をうつので、初期のリクエストが最大のピークだったりすることもある。 そんなときにスケールしなくて障害→メンテになったら機会損失が大きい。ちゃんとスケールするか、モニタリングはできているかということを確認するためにベンチマークは重要。 シナリオを定義してテストできるものは JMeter などいくつかあるが、今回は Go で自作している。 シナリオを書くのに集中するという点に対して一貫している実装だと思った。

  • ベンチ側で同じ構造体を使いまわせる
    • サーバーサイドが Go で書かれている場合、ベンチ側で同じ構造体を使いまわしたりできる
  • リッチなレポーティングは他に任せる
    • ベンチ中に何が起きているかというレポーティングはモニタリングに任せればいい、なのでリッチなレポートは作らない

あとは CloudWatch のカスタムメトリクスにシナリオ情報のタグを仕込んどいて、コンテナ単位のトレースはできるようにしていたり、書くことがあるかはわからないけど Go でのベンチ作りのノウハウが参考になった。

あやぴーさんの Clojure の話も面白かった。ブランディングとしての Clojure での求人はそこそこだけど、Ring を使ったライブラリの組み合わせによる実装の保守・機能開発はうまくいっているとのこと。

ハッカーズチャンプルーについて

冒頭にも書いたとおり、技術系イベントは自分では取りに行かないような話題をざっくばらんに聞いて最近の動向とかを知ったり、話をしたりするのが好きなのでそういうイベントが沖縄にも無いかなーと思っていた。ハッカーズチャンプルーは完全に欲しかった場所!って感じのイベントだったのですごく満足でした。

もともとそういう場がほしかったので

沖縄・宜野湾エンジニア勉強会(大LT大会) - connpass

という場を作っていたのだけど、クロージングで LT 参加しよう!という話になって、便乗して名前だけイベントの紹介ができてよかった。 ハッカーズチャンプルーみたいなのをもうちょっと短いスパンでカジュアルにできたらいいなーと思う。

とても楽しいイベントありがとうございました!懇親会も 2 次会まで参加させていただいて最高だった

Google Home に喋らせる

自発的に Google Home に喋らせたい。

喋らせている人たちはローカルの Google Home に対してローカルネットワーク内のラズパイなどで API 叩いて喋らせるみたいな感じになっている。

ググるgoogle-home-notifier が主流に見えるが、ラズパイで動かすにはセットアップに一手間いる。Go 製の homecast があるのでバイナリを置くだけにしたい。

どういう仕組みか

  • Google Home を探して音声再生 API を叩く
  • 再生する音源は Google Translate で利用されている text-to-speech を利用している

Google Home を探す

HashiCorp の mdns という mDNS のクライアントを利用して探している。Google Home のホスト名には _googlecast._tcp というサービス名が含まれ、付加情報部には md=Google Home が含まれるのでこれでフィルタリングする。

Google Home が複数台ある場合などはホスト名を控えておいて個別に操作することになりそう。

喋らせる

Google Text to Speech に再生させたい文字列を渡して音声ファイルの URL を取得する。 go-cast を使い、Google Home で音声ファイルを再生する。

Google Cast SDK を見るに Chromecast と API の互換性があるようだ

https://translate.google.com/translate_tts を叩く Text to Speech の使い方は非公式なのでいつか使えなくなるかもしれない。その場合は音声ファイルを生成してどっかに置いておく必要がある。

YAPC::Okinawa 2018 ONNASON に行った

昨日飲みすぎて午前中は倒れてたけど午後から行った。

自分がベストトーク賞に投票した発表はこれ。

  • 小さく一つの仕事に集中させる意思を持ち、妥当そうな設計で Production Ready なミドルウェアを書き上げるのがすごい
  • WS をアプリからクライアントへの通知だけに使って、クライアントからの書き込みは REST API というパターンは参考になる

沖縄に友達を作りに行ったつもりだったけど県外からの人が案外多くて、路線バスで帰る人たちは沖縄に家がある人なのでその人たちと少し喋ったくらいだった。地域コミュニティへ遊びに行かなくては。

1日で終わる YAPC って初めてだった。サクッと楽しめていい。2日あったりすると1日目の夜がピークになって2日目疲れてる。ともかく運営やトークした皆さんはお疲れ様でした。

Docker for Mac で動いているコンテナでホスト側のサウンドカードを使う

自分でスマートスピーカーを作りたくなり、音声認識のところで Julius をいじってるなう。Julius を含む音声認識部分をコンテナで切り出しているところでホスト側 (macOS) のサウンドカードを使わせるようにしたかったのでやり方をメモっておく。

macOS ではなく ALSA の使える Linux 環境であれば Docker の --device オプションで --device=/dev/snd:/dev/snd としたりすれば動くらしい。VirtualBox だとオーディオ設定からホスト側のサウンドカードを利用できるので、コンテナを VirtualBox 上で動かすことで Docker の device オプションによりホスト側サウンドカードを利用できる。VirtualBox を経由するのではなく別のやり方が無いか調べていたら PulseAudio 経由で音声を再生するやり方も見つかったので、これをベースに音声入力もできないか試してみた。

audio - Record Sound on Ubuntu Docker Image - Stack Overflow

大まかな説明

  • コンテナ側
    • PulseAudio の設定で音声データの入力元を /dev/audio とかにしておく
    • socat の tcp-listen で port に流れてきた音声データを /dev/audio に流し込む準備をしておく
  • ホスト側 (macOS)
    • SoX (Sound exhange) でマイクからの音声データを socat で待ち受けているポートに流し込む
  • コンテナ側で録音できる

検証作業

  • Dockerfile
FROM ubuntu

RUN apt-get update && apt-get install -y pulseaudio socat alsa-utils
  • コンテナ側
bash-3.2$ docker build -t mictest . && docker run -p 127.0.0.1:3000:3000 -v `pwd`:/mictest -it mictest
...
root@bf3b26a44c0e:/# pulseaudio -D --exit-idle-time=-1
W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).
root@bf3b26a44c0e:/# pacmd load-module module-pipe-source file=/dev/audio format=s16 rate=44100 channels=2
root@bf3b26a44c0e:/# socat tcp-listen:3000 file:/dev/audio &
  • ホスト側
bash-3.2$rec --encoding signed-integer -traw --bits 16 --channels 2 --rate 44100 - | nc 127.0.0.1 3000 > /dev/null

rec は SoX の録音用ラッパー。

  • コンテナに戻って
root@8c421891ff69:/# arecord /mictest/test.wav
Recording WAVE 'test.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
// この後めちゃくちゃ音を鳴らして Ctrl-C
  • test.wav を聞くと録音できているよかった

おわり

  • ネットワーク経由で PulseAudio 使ったことなかったけど具体的な使い方が見えてきたのでよかった
  • SoX は音量の閾値を超えたら録音開始したり、色々できるようで便利
    • 音声処理ツールのスイスアーミーナイフとトップページに書かれているだけある
  • 実際は Raspbian にのっけたいので実機で確認したいところだが開発中は手元の MacBook Pro で音声入力でやっていきたい 

社内どうぶつタワーバトル大会をしました

これは VOYAGE GROUP Advent Calendar 2017 - Qiita 14 日目の記事です。

VOYAGE GROUP には社内サークルがいくつかあり、各サークル元気に楽しく交流しています。 自分が所属しているのはゲームサークルで、日夜格ゲーの練習をしています。ここ1年はストリートファイター5をやっているので、プラチナ辺りまでいったらブログでも書こうと思っていたのですがなかなか難しいですね(現在ゴールド)。

社内で流行っているゲームは時の流れにもよりますが格ゲーやイカのゲームだったり、スマホゲームだと Vainglory が強かったりします。そのなかで少しずつ盛り上がりを見せているのが どうぶつタワーバトル (DTB)です!DTBiTunes App Store でも上位に食い込んでくるほど人気になってきているゲームです。今回はその DTB の魅力を伝えていきたいと思います!

といってもシンプルな話で、伝えたいことを一言で説明すると 忘年会はどうぶつタワーバトルで盛り上がろう! です。

概要

動画を見ていただければわかるはずです。動物を積み上げて崩さないやつが優勝、それ以外は敗北と共に屈辱を味わう。それだけのシンプルなゲームです。 社内の人が言ってましたが、動物版ジェンガという感じですね。

シンプルに見えますが、いくつかのセオリーやパターンがあったり、序盤・中盤・終盤とフェーズごとにどう置くべきなのかすごく考えさせられるゲームになります。 勝つためにどうすれば良いのかということは日夜研究されており(たぶん)、 2キリン 5.5象 握力 など専門用語が飛び交うほどの奥の深さを持つゲームです。 今夜勝ちたい ゲーム攻略記事で有名なゴジラインさんでも記事にされています。

【どうぶつタワーバトル】今夜勝ちたい『どうぶつタワーバトル』 | ゴジライン

個人的な攻略法は、 無茶をしない この一言につきますね。

何が魅力なのか

シンプルの中に奥深さががあるのはもう述べたとおりですが、一番の魅力はみんなで遊んだときの 盛り上がり にあると思っています。主要なゲームモードはオンライン対戦なのですが、対戦部屋を作成してから知り合い同士で遊ぶこともできます。

一緒に遊ぶ人に強すぎる人がいたら負けっぱなしで面白くないかもしれないのでは?と思う方もいるかもしれませんが、DTB の難しく楽しいところは一瞬も気が抜けないところです。下手な積み方をするとすぐに負けますし、適当に置いても謎の力により勝ったりします。

謎の力の例です。

どう転んでも面白いし盛り上がる、DTB の面白さですね。飲み屋で数時間 DTB をやって笑いこけている自分に気づいたときは忘れてしまっていた童心を取り戻したかのようでした。

社内大会をしました

社内の色々な人が DTB にハマっているのを見かけて、お昼ごはん休憩がてら社内大会を実施しました!DTB をやっていない人も観戦に来てくれたりと盛り上がりました。

f:id:jewel12:20171215000215j:plain

レート 2000 超えの猛者もいる中、本番のバトルなら強いと意気込んで企画したのですが優勝には至りませんでした……また出直したい。

おわり

企業対抗戦のお誘いや個人的な挑戦などはいつでも受け付けております!きっと盛り上がると思うので、興味ある方は @jewel_x12 までご連絡ください!VG勢はよく#だいだい という部屋で戦っています。

もう年の瀬、忘年会は積もる話もあるかもしれませんが、すべて無視してどうぶつタワーバトルで動物を積んで盛り上がりましょう!笑いで締められればそれでよし!

明日の VOYAGE GROUP Advent Calendar 2017 の記事もご期待下さい!!

QMK Firmware の話 (VOYAGE GROUP Advent Calendar 2017)

これは VOYAGE GROUP Advent Calendar 2017 - Qiita の 7 日目の記事です。

インターンをやった話をしようと思ったのですが後回しにして、今伝えたい気持ちが強い QMK Firmware の話をしますね。

弊社ではキーボードやディスプレイ等を購入する支援制度があり、キーボードにこだわりがある人は多いです。自分の席を見回しても Kinesis のキーボードや ErgoDocs EZ を使用している人、自作キーボード勢がいたりしますね。自分は Let's Split というカワイイキーボードを使っています。

mint.hateblo.jp

Let's Split の良さも紹介したいのですが、キーボードは手に馴染んだり思い入れのあるものを利用してくれればそれでいいです。今日は Let's Split を作成しているときに利用したファームウェアである QMK Firmware を紹介します。


QMK Firmware は Atmel AVR マイコン等向けのファームウェアです。ファームウェアをビルドして書き込むことで、任意のキーマップにすることができます。自作キーボード界隈では AVR マイコンを利用することが多いみたいですね。ErgoDox EZ も AVR マイコン搭載の基板上で動いているので QMK Firmware が利用できます。

QMK Firmwaer はキーマップを変えるだけではなくいろいろな機能があり、それらを利用することでキーボードをもっとパワフルにできます。

いくつか機能があるのですが、自分がみんなに QMK Firmware を知ってもらいたいという気持ちになった機能をいくつか挙げます。

Layer

  • キーボードマップのレイヤーを任意に変更できます
    • あるキーを押している間や押したりすることで切り替えることができます
    • キー数の少ない 40% Keyboard を利用したりするときに重宝します

Auto Shift

  • QMK Firmware で一番好きな機能です
  • 一定時間キーを押していることで Shift が効いたで状態でキーを押したの同じ効果になります
  • デフォルトは結構長く押していないと Auto Shift されないのですが、130ms と短めに調整すると気持ち長く押すだけで Shift が効いて快適に利用できました

Leader Key

  • Leader Key を設定し、タイムアウトしない間に他のキーを押した場合の挙動を定義できます
  • EmacsKey Chord を多用するような人にはオススメそう
  • 自分は使っていない

Mousekeys

  • こちらも自分で使っていないのですが、マウスやクリックをエミュレートできます
  • マウスにまで手を伸ばすのが億劫だったり赤ポチがキーボードにない人向け

Tap Dance

  • キーを複数回叩くたびに挙動を変化させます
  • たとえば ( キーを 1 回叩くと [, 3 回叩くと { というふうな動作を指定できます
  • 括弧周りならとりあえずこれを叩いておけばオーケーみたいになるので便利

おわり

あとは One Shot Key など色々ありますが上記の機能が特徴的です。 Auto Shift があるだけで QMK Firmware を書き込めない他のキーボードには移れないですね。

VOYAGE GROUP アドベントカレンダー、明日は nakano_tomofumi さんの iOS UU 推定です。 アドテクをやっている仕事柄、UU 推定をすることは結構あるので楽しみです。

VOYAGE GROUP アドベントカレンダーも気になりますが、自作キーボードアドベントカレンダーも面白そうなので、QMK Firmware に興味を持った方はぜひチェケラ。

adventar.org

Let's Split

俺の仕事が捗らないのはどう考えてもキーボードが悪いと勘違いし Kinesis Freestyle2 から何か別なキーボードにしようと探してたら Planck というのが見つかり、可愛いのでこれにしようと思ってたら Planck を左右分割したような Let’s Split の存在を知り、たまたま @matsPod さん主催で PCB 等を共同購入する機会があるよと @rail44 に教えてもらったので共同購入に参加したのでした。

組み立て方はググると出てくるので自分がハマった点だけ述べると、 このキーマップ(Qwerty)でいう c が効かなかったこと。最初はスイッチとの接触不良かなと思ったのだけれど、スイッチを付けなおしたりしても直らず、ダイオードの向きも問題なかった。最初、解決策が思いつかな書くて z の下に c を置いたりとかキーマップで調節してたけど辛かったので頑張って原因を探すことに。PCB のどこかが断線しているのかもしれないと思ったので Let's Split PCB とか雑なクエリで探して以下の画像を眺めていたら断線しているところが分かった。

c の下のキーは動作しているので、スイッチとダイオードがつながっている方が悪いんだろうということで直接繋げてみると c も入力できるようになった。やったね。

f:id:jewel12:20170718200211j:plain

アクリル板は黄緑とマゼンタを片方ずつ購入。キートップは適当に買った黒いやつで、Twitter の写真はオシャレに映っているけど明るいところで見ると大してかっこよくない。色に合わせたキートップを買いたい。

使用感としては格子状のおかげか手の小さい自分にあう良いキーボードなので、共同購入を企画してくださった matsPod さんには感謝。