Magnolia Tech

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

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で大きく違うところですね。

Akko 3068というメカニカルキーボードを買った

f:id:magnoliak:20190616202733j:plain
Akko 3068

小型のメカニカルキーボードが欲しく、でも自作に手を出すのも時間が足りない…みたいなことで、検索していたら丁度よさそうのを見つけた。Akko 3068というメカニカルキーボードで、Cherry製のキースイッチが採用されていて、茶軸、青軸、赤軸から選べ、Bluetooth接続もできる、というスペック。そして、接続端子がType-C!

値段も日本円で9000円を切るということで試しに赤軸モデルを買ってみた。

www.banggood.com

結論から言うと、「思ってたのと違う」。

キータッチは、さすが赤軸なので、全然問題無し。

問題は接続…付属のケーブルがキーボード側はType-C、反対側がType-Aという、一見すると普通のケーブルなのだけど、このケーブルでしか接続できない!MacBook ProのType-Cポートと直接つないでも充電もされないし、キー入力もできない(Bluetooth接続と有線接続が切り替えられる)。

Bluetooth接続で使う前提だったけど、それでも充電が専用ケーブルオンリーはけっこうキツい感じなので(昔はそうゆうガジェット多かったけど)、積極的にお勧めできるものではないかな。

あと、このキーボードを作っている会社のウェブサイトに行くと、なかなか凄い製品ラインナップでした。

小西康陽 / わたくしのビートルズ

普段、本を読むと言えば技術書ばかりで、あまりコラム集のような、明確な目的の無い本を読むことが無い。

ピチカート・ファイヴの…といってもピチカート・ファイヴ解散からもう18年経っているので、さすがにその枕詞はいらないかもしれないけど…小西康陽のコラム集「わたくしのビートルズ」を入手した。

今回もフィクションともノンフィクションともつかない、つかみ所の無いショートストーリーめいたコラムが充実していて、ちょっとした合間の時間に読むのにぴったりの構成。内容よりもリズム感…いつまでも読んでいられる流れるような文章。

1990年代中盤の渋谷系ブームをリアルタイムに経験して、渋谷でレコードばかり買っていた世代としては、小西康陽の名前は特別だ。そして、雑誌や小冊子の、ちょっとしたコラムに小西康陽の名前を見つけると、未だに真っ先に読んでしまう。

約10年おきに刊行される小西康陽のコラム集…「これは恋ではない」「ぼくは散歩と雑学が好きだった」に続く3冊目。以前の2冊の単行本は常に家の本棚の一番いい場所に(ヤン富田の単行本と共に)置かれている。10年後に、新刊のコラム集は刊行されるのだろうか。

ぼくは散歩と雑学が好きだった。 小西康陽のコラム1993-2008

ぼくは散歩と雑学が好きだった。 小西康陽のコラム1993-2008

これは恋ではない―小西康陽のコラム 1984‐1996

これは恋ではない―小西康陽のコラム 1984‐1996

Scala 2.13.0がリリースされた

github.com

長い開発期間を経て、ついにScala 2.13.0がリリースされました!

今回、ドキュメントへの1行だけの追記ですが、初めてScala本体へのPRがマージされたので、Contributorsに自分の名前が有るのが最高に嬉しいですね。

github.com

というわけで、Scala 2.13、使っていきましょう!

Scala 2.13におけるStringに対するtoIndexedSeqの挙動

Scala 2.12と、2.13で返す型が変わっていますが、ドキュメント上で探すことができませんでしたのでここに書いておきます。

Welcome to Scala 2.12.8 (OpenJDK 64-Bit Server VM, Java 12.0.1).
Type in expressions for evaluation. Or try :help.

scala> val chars = "こんにちは世界".toIndexedSeq
chars: scala.collection.immutable.IndexedSeq[Char] = Vector(こ, ん, に, ち, は, 世, 界)
Welcome to Scala 2.13.0-RC3 (OpenJDK 64-Bit Server VM, Java 12.0.1).
Type in expressions for evaluation. Or try :help.

scala> val chars = "こんにちは世界".toIndexedSeq
chars: IndexedSeq[Char] = こんにちは世界

scala> chars.getClass
res0: Class[_ <: IndexedSeq[Char]] = class scala.collection.immutable.WrappedString

WrappedStringを返す方が余計なコピーも無くてよさそうですね。