読者です 読者をやめる 読者になる 読者になる

2016年度振り返り

新卒2年目が終わった。
昨年度の。

エンジニアとして

今年度は途中でチーム異動してプロジェクト立ち上げとかもしたけど、ずっとScala書いてた。
とはいえコード書き続けるというよりAWSGCP含めて運用も含めて色んな経験出来たかな。
DevOpsとか言われるような領域でも数百台規模とかでもないので大した事はしてないけど、 泥臭いと思われる仕事もぼちぼちしたのでエンジニアとしての体力が付いた感じはしている。

だがしかし、今のままじゃ駄目だ的な焦燥感は常につきまとって拭えないので、歯を食いしばってやっていくしかない。

ScalaエンジニアとしてはScalaMatsuriに登壇したのが大きい。

ちょっと日和って15分枠で応募したけど、もっと内容練って40分枠で応募したら良かったと後のMatsuri。 とはいえ1-2月とか公私ともに多忙だったのでそんな余裕は無かった。

DDDとかFPとかActorとかReactiveSystemとかメタプロとか、一通り学習出来たので、 武器は武器としてこれからは深めていきつつもっと大きな視野で動いていきたい。

あと、昨年思ったこれ↓

あと「何を作るか」より「どうやって作るか」に意識が寄ってきている感覚があり、これはまずい。

感覚としてちょっとましになった。

社会人として

20代のうちくらいは無病欠で頑張りたかったけど熱出したり奇病を患って休んでしまったのが悔しい。 体力面での衰えが懸念なので、これ以上の悪化は防ぐ程度に鍛えたい。

classをcase classに変換するscala.metaなライブラリ

練習を兼ねて、scala.metaを使って普通のclasscase 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来てくれるの待ってる。

ScalaMatsuri2017に参加してきた

2017/02/25-26で開催されたScalaMatsuri2017に参加してきました。

2017.scalamatsuri.org

petitviolet.hatenablog.com

CFPに出したら通って400人の会場で話すことになって、この一ヶ月くらいずっとどきどきしてた。

発表資料はこちら

speakerdeck.com

なんだかんだでそこそこ人も入っていただいて、Twitterとかでも感想が少しpostされていて嬉しかったです。

登壇者の特権で壇上から写真も撮れた。

2日目のお昼は寿司職人が来て寿司Bar。テンション上がったし美味しかった。

2日間通して色々刺激を受けて非常に楽しかったです。
運営の皆様ありがとうございました。

来年も出来ればスピーカーとして参加出来るといいな。