Magnolia Tech

いつもコードのことばかり考えている人のために。

Scala 2.13より未使用変数への警告を抑止するunused annotationが追加された

時々メソッドのインタフェースを揃えるために、わざと使わない引数を定義することが有る。

Scalatraでもインタフェースを揃えるためにServletのRequestとResponseをペアで定義しているが、必ずしも使っていない、みたいなコードがあり、ビルドの度に未使用パラメータの警告が出てしまう。

[warn] /repos/scalatra/auth/src/main/scala/org/scalatra/auth/ScentryStrategy.scala:44:35: parameter value request in method beforeAuthenticate is never used
[warn]   def beforeAuthenticate(implicit request: HttpServletRequest, response: HttpServletResponse): Unit = {}
[warn]                                   ^
[warn] /repos/scalatra/auth/src/main/scala/org/scalatra/auth/ScentryStrategy.scala:44:64: parameter value response in method beforeAuthenticate is never used
[warn]   def beforeAuthenticate(implicit request: HttpServletRequest, response: HttpServletResponse): Unit = {}
[warn]                                                                ^

将来の拡張性のために意図した未使用は警告しないで欲しいなぁ…と思っていたら、Scala 2.13よりunused annotationが追加された。

Scala Standard Library 2.13.0 - scala.annotation.unused

ドキュメントに全然コード例が無いので分かりづらいけど、テストコードにコメント付きで使い方が書かれているので、こちらを見た方が理解しやすいと思います。

scala/t10790.scala at 2.13.x · scala/scala · GitHub

Scala 2.13以降なので、後方互換性の観点からすぐに使うわけにはいかないけど、ライブラリ作ったりする人は知っておくといいと思いました。

ログミーTechで昨年に設計Night2018で話した内容が文字起こしされました!

connpass.com

昨年開催され、大好評だった「設計Night2018 powered by Classi」での自分の登壇内容がログミーTechさんにて文字起こしされました!

logmi.jp

logmi.jp

logmi.jp

ブクマも改めて80近く行きました。凄い!

この辺の話、もう一回整理して1時間くらいの完全版を喋りたい気持ちが有りますので、オープンなイベントでもクローズドな勉強会でも行きますので、興味がある方はご連絡下さい!

Anker PowerCore 13400 Nintendo Switch Editionを買った

そのまんまなんだけど、大容量のUSB PD対応のモバイルバッテリー、なぜかAnkerは充電器付きばかりがラインナップされているし、さすがに容量が20000mAhを超えてくるとなかなかの大きさだし、重量だし…ということでこっちを選択。

しかし、今見ると値段が6000円を超えている…先日まで4000円台だったはずなのに…

もう少し小さいモデルだとこっちがある。

Javaや、Scalaで、camel-caseをsnake-caseへ変換する方法

GoogleのGuavaというライブラリを使うとできる。

github.com

各種case表記を相互に変換してくれる便利なライブラリ。

Json4sのこのissueの解決の参考なるかと思って調べたけど、まぁObjectのキーが負の数って時点で、特殊な話なので、そこはtransformFieldで独自に変換すべきでは?という回答を書いてみた。

github.com


誰も手をつけていないissueを取り上げて調べてみると、必ず一つは全然違う分野の知識が増えてお勧めです。必ずしも完全な回答でなくてもいいので、ここまで調べた、みたいな事を書くだけでも有益だと思うし、ほかの人が興味を持ってくれるきっかけになると思うんですよね。

というわけで、色々なissueに、PRが書けなくてもいいので、まずは関わってみることをお勧めします。

Timbuk2のメッセンジャーバッグを買った

f:id:magnoliak:20190630205924j:plain

Timbuk2メッセンジャーバッグを買った。Sサイズだと、13インチノートPCがかっちり入るサイズ。長距離の移動時に、メインのバッグとは別にあると、最低限の持ち物(PC含む)がまとめられて便利。

ScalaMatsuri 2019に行ってきた

f:id:magnoliak:20190629070026j:plain

2019.scalamatsuri.org

今まで行きたいと思っていながらなかなか行けなかったScalaMatsuriにようやく参加してきました。

ScalaMatsuriは、割とメインの日程が土日になるように設定されていて、それだと参加しづらかったのですが、今年は金曜日にメインの日程が組まれていたのと、自分のスケジュールの都合が上手く合って参加することができました。

割と言語機能に関するセッションを中心に聞いていた、ということも有るんだけど、まだまだ知らないことがたくさん有って、「無限にやることは…ある」という気持ちになりました。

例えば水島さんのDOT計算の発表は、まったく手も足も出ない感じで、自分の不勉強さを痛感しました。

設計やアーキテクチャの話をあまり聞けなかったので、その辺は後日公開されたスライドを見てみようかと思っています。

あと、至るところで、Scala3(dotty)の話が出ていましたが、けっこうがっつり文法も変わるようで、「これ、Perl6みたいにならないよね…」という心配は少し思いましたが、その辺の移行プロセスはどうなるんでしょうね。


会場では今までの知り合いも何人かいらっしゃったり、なかなかお会いできなかった人に「初めまして!」が言えたりしましたが、総じて知っている顔が少なく、言語変われば参加者も変わるんだなーっと改めて思いました。

イベント全体は、とにかく運営が素晴らしく、入場から退場まで実にスムーズでした。会場ごとの誘導や案内も良かったですね。運営や、スタッフの方々にはとにかく感謝です。

またぜひ来年も参加したいですね。

Scalaでネストしたcase classのインスタンスを作るときに気をつけること

きっかけはJson4sの、このissue.

github.com

テストクラスの中で定義したcase classが正しく判定されない、というもの。

いくらJson4sのコードを追いかけてもよく分からなかったところ、いつも色々なことを教えて頂くKenji Yoshidaさん(@xuwei_k)に教えて頂きました。

更に!普通にJson4sのREADMEにも書かれていました…最初から読めよっていう…

github.com

For classes defined in a trait it's a bit difficult to get to their companion object, which is needed to provide default values. We could punt on those but that brings us to the next problem, that the compiler generates an extra field in the constructor of such case classes. The first field in the constructor of those case classes is called $outer and is of type of the defining trait. So somehow we need to get an instance of that object, naively we could scan all classes and collect the ones that are implementing the trait, but when there are more than one: which one to take?

ネストしたcase classのコンストラクタの場合、Scalaコンパイラが$outerというフィールド名にouter classを入れておいてくれる! Json4sは全てのフィールドのインスタンスを作ってから、case classのインスタンスを作るので、この際にouter classが何も引数を取らないクラスであれば生成できる、というわけです(引数が必要なクラスだと生成に失敗します)。

Json4sでは、そのようなパターンにも対応できるようにouter classのインスタンスを渡す方法が用意されています。詳しくは先ほどのREADMEを参照して下さい。


この、Scalaではinner classのインスタンスがouter classのインスタンスに依存するのは、Scalaの経路依存型、という機能の話になり、以下のサイトが参考になりました。

53ningen.com

ネストしたクラスのインスタンス化について、JavaScalaで大きく違うところですね。