2016年度振り返り
新卒2年目が終わった。
昨年度の。
エンジニアとして
今年度は途中でチーム異動してプロジェクト立ち上げとかもしたけど、ずっとScala書いてた。
とはいえコード書き続けるというよりAWSやGCP含めて運用も含めて色んな経験出来たかな。
DevOpsとか言われるような領域でも数百台規模とかでもないので大した事はしてないけど、
泥臭いと思われる仕事もぼちぼちしたのでエンジニアとしての体力が付いた感じはしている。
だがしかし、今のままじゃ駄目だ的な焦燥感は常につきまとって拭えないので、歯を食いしばってやっていくしかない。
ScalaエンジニアとしてはScalaMatsuriに登壇したのが大きい。
ちょっと日和って15分枠で応募したけど、もっと内容練って40分枠で応募したら良かったと後のMatsuri。 とはいえ1-2月とか公私ともに多忙だったのでそんな余裕は無かった。
DDDとかFPとかActorとかReactiveSystemとかメタプロとか、一通り学習出来たので、 武器は武器としてこれからは深めていきつつもっと大きな視野で動いていきたい。
あと、昨年思ったこれ↓
あと「何を作るか」より「どうやって作るか」に意識が寄ってきている感覚があり、これはまずい。
感覚としてちょっとましになった。
社会人として
20代のうちくらいは無病欠で頑張りたかったけど熱出したり奇病を患って休んでしまったのが悔しい。 体力面での衰えが懸念なので、これ以上の悪化は防ぐ程度に鍛えたい。
classをcase classに変換するscala.metaなライブラリ
練習を兼ねて、scala.metaを使って普通のclass
をcase class
に進化させるライブラリを作った。
case class
にすると自動で生成される以下のメソッド群をscalametaで模倣している。
toString
copy
equals
apply
unapply
hashCode
はめんどくさいのでスキップ…。
@Case class Hoge(val n: Int)
とか書くとだいたい
case class Hoge(n: Int)
と同じ感じになる、ということ。
使い方
mavenにあげているので、依存の追加は簡単。
libraryDependencies += "net.petitviolet" %% "acase" % "<latest-version>"
でもマクロを有効にするための設定がいろいろ必要となる。
手順はここに書いた。setup
これがどれくらい必要なのかわからないが、とりあえずこれを書いていれば動く。
もうちょっと詳しく
publicなコンストラクタフィールド(?)しか持たないclassに@Case
をつける。
@Case class CaseApp(val n: Int, val s: String)
これが、おおよそ以下のように展開される。
class CaseApp(val n: Int, val s: String) { override def toString: String = { "CaseApp" + "(" + ("n" + ": " + n.toString + ", " + "s" + ": " + s.toString) + ")" } override def equals(obj: Any): Boolean = { if (!obj.isInstanceOf[CaseApp]) false else { val other = obj.asInstanceOf[CaseApp] this.n == other.n && this.s == other.s } } def copy(n = this.n, s = this.s) = new CaseApp(n, s) } object CaseApp { def unapply(arg: CaseApp): Option[(Int, String)] = { Some((arg.n, arg.s)) } def apply(n: Int, s: String): CaseApp = new CaseApp(n, s) }
とはいえ
case class
にしない理由があるのにとりあえず全部生やすのも意味ないので、別々にアノテーションとして実装してある。
@ToString
@Copy
@Equals
@Apply
@Unapply
コンストラクタを隠したい、みたいな場合には欲しいアノテーションだけをごてごてとつければ良い。
@Equals @ToString @Copy @Unapply class Hoge(val n: Int, val s: String)
private
なコンストラクタがあるとUnapply
とかを実装出来ないので全てpublicである必要がある。
もちろんリフレクション使えば出来るんだけど…。
感想
インスタンスメソッドを差し込むパターンとコンパニオンオブジェクトに差し込むパターンもあり、 何となくscalametaに慣れてきたところ。
とはいえアノテーション書きまくるの、Javaっぽいしちょっと嫌だなぁというのがまだ拭えないのでdef macro来てくれるの待ってる。
@petitviolet https://t.co/aWzeRLsh3f の中でdef macro今作ってますみたいなことが書かれてます
— Toshiyuki Takahashi (@tototoshi) 2017年3月17日