板についてきたカウチポテト日曜日

いつも通り日曜は在宅だ。ただし今週は少し迷った。散髪をしたい気持ちもあったのだが、来週に回す。洗濯してアニメを見てScalaを書いて銭湯に行って焼きそばを食べて終了。

ActivityPubはまずActorのCRUDを整備しようと思う。

すごい台風が来ているそうだが、どうせ寝ているうちに通過するのだろう。家も壊れることはなさそうだし(フラグではない)。

一念発起して椅子を買った

以前から「椅子がほしい」「値段はいくらでもいいから一番いい椅子がほしい」と宣言していたわけだが、今日オフィスチェアの専門店で座り比べて椅子を買った。買ったのはオカムラのバロンだ。アーロンも魅力的だったが自分をガッチリ正しい姿勢で縛りたかったのでヘッドレストのないアーロンは外した。

次は机と3枚目のディスプレイだ。金はかかるがどうせ必要だ。先延ばしする意味はない。

その他、ズボンに穴が空いたので買い足したり、映画を見たり美術館に行ったりしていた。ナイスな土曜日。

秋葉原で出会えない

9/5(木)

人に会いに秋葉原に行ったんだが、会えなかった。パソコンオタクなので意味もなくツクモに行って帰った。ディスプレイがほしい。そのためにまず机がほしい。増税前にほしいが実は増税後のキャッシュレス消費者還元事業に乗ったほうが安かったりするのか?要調査。

カフェイン中毒再び

9/4(水)

仕事中にめまいがした。最初は理由がよくわからなかったが、しばらくすると覚えのある感覚だと気づいた。カフェイン中毒だ。

修論の忙しい時期にも発生していた。僕は仕事中に大量の緑茶を飲むのだが、これからは麦茶にする。別にカフェインが必要で摂取していたわけではないので。

ああ、こうして健康タグの記事が増えていくのだろう…

タグといえば、このブログのカテゴリやタグの使い方がこれで良いのかというのは考えている。普通これらはどう使うものなのだろう。

未来の重圧/case classをやめた

未来のある時点に向かって準備しなくてはいけないものが出現したのでなんとなく落ち着かない気分だ。大学にいる頃からこの感覚がひどく苦手で、会社員になるとだいぶ緩和されていたのだが、やはり人生そう甘くはない。毎日死の準備をしながら生きていこうな。

Scalaのクラスはcase classにするとapplyメソッドが自動で生えるのだが、これと合わせてコンパニオンオブジェクトで自前のapplyも実装するとコンパイラがどっちを使うか判断できなくて怒る。

sealed abstract case classという手もあるらしいが、インスタンス化したいクラスなのでこの手は使えない。結局どうにも出来なかったのでcase classにすることをやめた。それほど恩恵を受けていたわけでもないし。

久々に酒を飲んだ/酒を飲んでプログラミングをするな

※この記事は『ほろよい もも』を飲んで書かれた。

月の始めに強い意志で(ほぼ)定時退社。制度上定時はないが自分で11時から20時を勤務時間と決めている。

いろいろな事情でSlackのワークスペースが増えてきたのでLinux用のアプリケーションをインストールしたのだが、ワークスペースにログインできずにいる。ブラウザでログインした後アプリケーションに処理が移らない。

仕事でTypeScriptをやってはいるが、趣味開発で初めて裸のtscコマンドによるコンパイルをやった。コンパイルのバージョンがどうなっているのかよくわからない。前者も後者もコンパイルは通るのに前者しか動かなかったりする。

import * as Hoge from "hoge";
import Hoge from "hoge";

完全に酒に酔って意味不明ムーブ繰り出してる。間違ってaccess tokenをpushしてしまったので定石どおりリポジトリ削除→再作成→pushをやったのだが、修正をaddしないままcommit --amendしていたので無意味だった。やり直し。

ScalaでUnion型

普段仕事ではTypeScriptを書いているので
const x: "kinoko" | "takenoko" = "kinoko";
みたいなの(Union型という)に見慣れていた。

趣味ではScalaを書いており、同じようなものを書きたくなった。具体的にはActiviryPubのActor Typesを表現するためにApplication, Group, Organization, Person, Serviceのどれかの値(いずれも文字列)をとるという型を作りたかった。

case class

しかし調べてみるとScalaにUnion型はない。自分でパッと思いついたのはcase classだ。ドワンゴのScalaテキストに近い用例が載っている。下にそれを引用する。

sealed abstract class DayOfWeek
case object Sunday extends DayOfWeek
case object Monday extends DayOfWeek
case object Tuesday extends DayOfWeek
case object Wednesday extends DayOfWeek
case object Thursday extends DayOfWeek
case object Friday extends DayOfWeek
case object Saturday extends DayOfWeek

sealed修飾子をスーパークラス/トレイトに付けることによって、その(直接の)サブクラス/トレイトは同じファイル内にしか定義できない

ので、パターンマッチするときにコンパイラがいい感じにチェックしてくれるというメリットがある。

上記を参考にこんな感じで実装してみた。欲しいのは文字列なので、toStringをoverrideしてクラス名をそのまま取得できるようにした。

objectにするとgetClass.getNameの末尾に$がついてしまうのでinitしている。最後の1文字を除去するというメソッドがある多機能さ、いかにもScalaっぽい。あるいはcase objectじゃなくてcase classにすればこんな小細工は不要だが、パラメータリストが必要になるという面倒臭さがある。どうあるべきなのか、自信ニキは教えてほしい。

Enum

もう一つ、これは同僚に教えてもらったものだが、Enum型を使う方法もある。

こちらは採用しなかったのであまり深入りしていない。もしかしたらこっちのほうが良かったかもしれない。いや、いま猛烈にそんな気がしている(表現したいのが単なる文字列なので)。

それにしても大事なのはググり力だ。僕が「Scala ユニオン型」で検索してもいい情報は得られなかったが、「代数的データ型」という言葉を知っていればこの記事に辿り着けただろう。思うに、体系的な勉強は裏切らないのだ。

型の道は深く険しい…

退職者と継承

記憶が正しければkwappaさんは僕が最初に会ったドワンゴのエンジニアだ。インターンの面接だったので2017年6月頃だったか。ベテランで年上で上司であることを忘れてしまうような話しやすい雰囲気の方で、それはそうである必要性を認識して努力されていたのだと思う。僕にとってのドワンゴのエンジニアの気質の体現者だ。

おそらく僕は認知されていないが、僕はkinoppydさんを認知している。なぜならSlackで存在感を放ちイベントを主催していたからだ。詳しくは言えないが社員同士がお互いの仕事を理解し仲良くなれる(?)ようなイベントを開いてくださった。それは入社して5ヶ月になる僕が持ち始めた問題意識と重なる。

kwappaさんやkinoppydさんが退職し技術コミュニケーション室がなくなっても、当たり前のように彼らの作った良い文化が継承され育っていくことが望ましいし、僕もその一助になりたい。