case classのフィールド名とフィールドに対応する値を渡すと型安全にフィールド名と対応する値の組を渡してくれるアノテーションをscalametaで書いた

ややこしいタイトルシリーズ(?)

モチベーションが伝わりづらいけどDBへのアップデートでフィールドを4つか5つ指定したい(かつcase classのインスタンスは情報が足りなくて作れないという制約がある)という状況を考えます。

このとき sql.update(テーブル, Map[更新するカラムの名前 -> 更新する値]) のようなインターフェースがあるとするとMap[フィールド名 => Any] のようなものが必要になります。 例えば User(id: Long, tpe: Int, name: String) では Map("id" -> 0L, tpe: 1, name: "モフたろう") のようなものになる。

フィールド名を手書きするのは嫌だし、idに間違えてStringを渡してしまうことも避けたいので (フィールド名, そのフィールドに応じた型) というタプルを型安全に作ってからMap[String, Any]を生成する方針にしたい。

ということで Mofu.MacroPorter.wan(value = 1) のようにすると型チェックされた上で “wan” -> 1 がかえってくるマクロを作りました。 コンパニオンオブジェクトにフィールド名と全く同じ名前のメソッドが生えます。(同じ名前で使いやすいのか微妙だ)

gist.github.com

感想

  • shapelessのLensを使えばフィールド名の取得は行けそうだったけど、渡されたフィールドの型に応じた型をチェックするのが難しかった。LabelledGenericもLensもインスタンスがないとフィールドの型チェックが難しそうにみえた。情報としては揃っていてcan not proveになやまされたのでテクニックを知っていれば多分取れそう。

  • 書いたけど例のごとくIntelliJでは真っ赤なので作ってみたけど微妙だなーとなったのでそっ閉じ。

opensslでBASE64エンコードされた文字列をdecryptしようとしたら769bytes以上になるとエラーになる件

scalaでファイルを暗号化&base64エンコードしてopensslでファイルを平文にしようとしたところ平文サイズが768byte以下のファイルは平文にできるのに、769byte以上の文字列を入れると下記のエラーが出る現象について。

$ openssl aes-256-cbc -iv $IV -K $KEY -d -base64 -in mofu
bad decrypt
140735797384200:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:518:

Enc - OpenSSLWiki を読むと、以下のような記述がありました。

These flags tell OpenSSL to apply Base64-encoding before or after the cryptographic operation. The -a and -base64 are equivalent. If you want to decode a base64 file it is necessary to use the -d option. By default the encoded file has a line break every 64 characters. To suppress this you can use in addition to -base64 the -A flag. This will produce a file with no line breaks at all. You can use these flags just for encoding Base64 without any ciphers involved.

-base64(または-a)つけるとbase64デコードするよ。このとき64文字ごとに改行されていることを想定するよ。改行がない場合は-base64と一緒に -A つけてね。とありました。 ということで以下のようにして成功しました。

$ openssl aes-256-cbc -iv $IV -K $KEY -d -base64 -A -in mofu

勉強不足・・

IntelliJのライブテンプレートにimport scala.concurrent.ExecutionContext.Implicits.global入れたら便利になった。

タイトルそのままです。 IntelliJ IDEA 2016.3.4です。

知ってる人は知ってるというか自分もなんか登録できるなということは知ってたんですが今まで何登録すればいいんだろうと思って放置していましたが登録したら便利になりました。

Preferences > Editor > Live Templates にある + ボタンを押して登録できます。

注意が必要な点として下記のように No applicable contexts yet. と書いている場合はコード補完の候補に出ないので、隣りにある Define をクリックしてScalaなどをチェックする必要があります。

f:id:matsu_chara:20170302134040p:plain

完成後はこんな感じになるはずです。

f:id:matsu_chara:20170302134017p:plain

登録したテンプレートは command + J で呼び出せます。(exe..とか適当に文字を入れると絞込。Enterで確定)

とりあえずパッと思いついた以下を設定しました。 

名前 template
auto_formatter_off //@formatter:off
auto_formatter_on //@formatter:on
duration import scala.concurrent.duration._
implicit_execution_context import scala.concurrent.ExecutionContext.Implicits.global
java_converter import scala.collection.JavaConverters._
mockito_all import org.mockito.Mockito._
mockito_matchers import org.mockito.Matchers._

こちらのスライドだともっとアグレッシブにやってるっぽいです。

www.slideshare.net

これでJavaConvertersってどこにあるんだっけとかググらないで済む生活が送れそうです。(ExecutionContextとか覚えてても長い・・) ということで知ってる人には当たり前だけどやったことない人がいたら試してみてね!という内容でした。

slackのユーザーを全員取得してアイコンをemojiとして登録する書捨てスクリプト

前々からほしかったので時短で雑に作った。 https://github.com/matsu-chara/slack_user_avatar_emojis

matsu_chara ユーザーだったら :m_atsu_chara: のような絵文字になる。(名前そのままだとメンションになってしまうため回避するためにアンダーバーを入れている。)

既に登録済みでも上書きとかされないので新規ユーザーが入ってくる度に流してもOK。ただしアイコンの更新は未対応。

追記: 誰かがアイコンを更新する度に手動で削除するのが大変だったので一旦emojiを削除してから登録するようにした。

株式会社ドワンゴを退職しました。

2017年2月28日付けで株式会社ドワンゴを退職しました。

新卒入社から二年弱、Scalaを書いたり、ScalaTextの作成に参加したり、Kafkaを運用したりしていました。

短い期間でしたがscalazコントリビューター1位&2位の人*1を含め、色々な側面ですごい人達と同じチームで仕事が出来たのはとてもいい経験になりました。

チラシの裏になりますが、せっかくの節目なのでドワンゴの思い出を書いていきます。個人ブログだしね₍₍ (ง´・_・`)ว ⁾⁾

Slackと分報チャンネル

ドワンゴはSlackが異様に発展していてチャンネルが2700以上あり、自分自身もjoin数が社内2位(700チャンネル)になるほどハマっていました。

最近では分報も急速に発展しています。#times_matsu_charaはジョイン者数55人で、こちらも社内2位でした。 割りと長いこと1位だったのですが人事部長に抜かれてしまいました。権力人望の違いですね(?)

最近はDBの講義を見ていたこともあり、VLDBとかSIGMODとかの論文と読んだ感想をひたすら分報チャンネルに貼っていました。各分野の有識者から意見をもらえるのはそれなりに人数がいる会社ならではという感じがします。

勉強会など

社内勉強会をわりと自由に開催できる雰囲気だったので、以下の本の輪読会を開催したりしました。

他にはDijkstra Prizeを受賞した分散コンピューティングの論文読み会に参加していました。自分はビザンチン障害トランザクショナルメモリの回を担当しました。

勉強熱心な人がたくさんいるのでどんな分野でも募集すれば輪読会が出来るくらいにはメンバーが集まると思います。

社内LTにはあまり参加できなかったのですが、最終出社日間近でMemC3 *2について発表しました。本当はMICA *3の話も入れたかった・・!

社内LTでは毎回すごい発表が行われていて、見ているだけでもかなり面白かった記憶があります。趣味で脳に電気を流す人の話を聞ける場所はかなり限られると思うのでいい経験だったと思います。(?)

終わりに

色々な心残りはあるのですが、別の環境で別のことをやってみるのも面白そうだしチャレンジしてみるぞ₍₍ (ง´・_・`)ว ⁾⁾という気持ちでの転職となりました。

次の会社は株式会社FOLIOです。 うまくいくと日本株を取り扱う独立系の証券会社が約10年ぶりに誕生することになるらしいです。

Wantedlyで一人だけ声をかけたら一発で返信が返ってきてびっくりしたと言われました。そのまま入社することになり自分もびっくりしています。

話を聞きながらデモを見せてもらってこれはもうやるしかない!と思ったのでかなり早い段階で決心が固まりました。 ちなみにFOLIOでもScalaを書きます!(GRPC/Play勢力ドワンゴ*4と違いFinagle/Finatra勢力なので若干雰囲気が変わりそうです。)

資金調達直後で絶賛エンジニア募集中とのことなのでwantedly貼っておきますね!(自分が担当するバックエンド以外ももちろん募集中です)

www.wantedly.com

www.wantedly.com

ということで、今までお世話になった方、本当にありがとうございました!

最後に、ほしいものリスト貼って〜と言われたので貼って終わります。
要らないものは抜けと言われたので抜きました。餃子の皮包むやつが欲しいです。
よろしくお願いします。
http://amzn.asia/h9qN55o

*1:今は順位が変わってるけど一瞬そういう状態になった。

*2:という爆速なmemcachedのようなKVS

*3:というmemc3より更に10倍くらい速いKVS

*4:finagle使ってるところもあるのでやや主語がでかい