skinny触った

skinnyを使った開発をしたので記録しておく。

skinnyはRuby on Railsを意識したScala製のWebフレームワークだ。Ruby on RailsをやったことがなくてもPlayをやっていれば雰囲気は掴める。今となっては素朴なフレームワークだ。

躓いたところをつらつら書いていく

application.confの書き方が分からなかった

最初に dev とか prod とかのプレフィックスがついていて、default というプレフィックスがあったので、それらのプレフィックスの中に設定を追加するものだと思っていた。実際は、そういう設定にするかは使う側(主にscalikejdbc)の都合というだけだった。

今となっては、dev とか prod みたいに分けるんじゃなくて、ステージングや本番で違う値は全部環境変数に出して設定ファイル上にdevやprodみたいな分岐は存在しないのが望ましい。

DIがわからない

skinnyではscaldiと呼ばれるDIが標準で提供されているが、今回開発対象のものは特にそのようなDIライブラリが入っていないので、コンストラクタインジェクションをした。カタカナで書くとかっこよく見えるが、要は必要な依存はコンストラクタ引数にしただけだ。

改めてそういうところからちゃんとDIを考えてやると、DIは単体テストのためだなぁという感覚を思い出させてくれて良い。逆に言えば、DIが使えなければ単体テストを書くのが非常に難しくなる。今回一番時間がかかったのはDIが使えず単体テストを用意できなかったレイヤーだった。まぁ書こうと思えば書けたけど、ライブラリのファサードのDI書くのがなんかダルいなって思って端折ってしまった。他にもjava.security周りのインスタンスを作る必要があったりしてmockライブラリ使わずにそれらを用意するのがダルかった。

Javaライブラリは例外飛ばしすぎ

これは言語の文化の違いの気もする。内部で使うJavaライブラリ(標準ライブラリも含む)が、例外をバンバン飛ばしてくる。例外はキャッチしないと500エラーになっちゃうので、できるだけキャッチするようにしてみた。

Try {
  例外投げまくる処理
} match {
  case Success(a) => a
  case Failure(e) => なんかいい感じのリカバリ処理
}

上でまとめる前まではfor式でTryをチェーンした形にしてたけど、あまりにもバンバン例外飛んでくるし、そもそも例外キャッチしたあとの処理が共通なら、いわゆるtry-catchの形で書けるのか、と1周回って関心した。

mountし忘れた

ルートオブジェクトを作ったら、それをmountする必要があるらしい。Playにはない工程だったので、忘れてしまっていた。

パウパトのゲーム

Android/iOS向けにパウパトのゲームがある

play.google.com

パウ・パトロールレスキューワールド

パウ・パトロールレスキューワールド

  • Budge Studios
  • エンターテインメント
  • 無料

apps.apple.com

そもそもパウパトロールとはなんぞや?というところだが、最近の保育園でアンパンマンの次に流行っているキャラものだ。乳幼児にとってアンパンマンは不動の1位で、女の子はキャラもの、男の子は電車が好きなようだ。キャラものの中ではちいかわ、すみっコぐらし、そしてパウパトロールだ。パウパトロールとはケントと呼ばれる飼い主がと複数の犬が、街のトラブルを解決していくストーリーを展開するアニメだ。雑に紹介するならきかんしゃトーマスの犬版だ。もう少し親の事情を話すと、パウパトはカナダのアニメで原作は英語で展開される。YouTubeで日本語と英語の両方のアニメが閲覧できるため、英語学習の導入としてパウパトが使われている、という話を聞いた。子供の間で流行っているアニメも親の都合が影響していると思うと世知辛い感じがした。

ちなみにうちの子はマーシャルというダルメシアン犬が好きだ。お調子者の感じがすきなのかな。

課金の嵐

さて、冒頭のゲームの話だが、いわゆるアプリ内課金で稼ぐフリーゲームだ。3Dフィールドを駆け巡りいろんなミッションをクリアしていくのだが、ミッションをするために課金が必要だ。加えてマーシャルなどの他の犬キャラを選択するにも課金が必要だ。課金要素に付き1,500円(2024年1月現在)で、すべての要素を解除するには2万5千円を超える。サブスクに登録すれば月1,500円ですべての要素を解除できる。実に良く出来てる。パウパトに関する子供の興味が1年半を超えるなら全額買ったほうが良くて、それ以下ならサブスクの方が良い。同じ保育園の上のクラスでもパウパトが流行ってそうなら全額買っても良さそうだ。果たして...

アプリ内課金ゲームは課金させようと事あるごとに広告を挟んでくる。子供は学習が早く、ゲーム本編と課金広告の違いをすぐに理解して、課金広告の画面をすぐにキャンセルできるようになった。ただ、ゲームを純粋に楽しむのではなく、課金広告をいちいちキャンセルしている様を見ていると、親としてはどうしても課金してスムーズにゲームさせてあげたい気分になってしまう。いやはやまったく良くできている。

課金したらまた続きを書こうと思う。

車が欲しい

家族3人、うち一人が小さい子どもとなると、移動には車があったほうがいいなぁと思うことが多々ある。一方で、関東では公共交通機関が発達しているので、そんなに車を使うか?というとそうでもないかもしれない。

俺「車買おうかと思ってる」

親「いつ使うん?」

俺「雨降ったときとかでも移動できるの便利」

親「100万の傘買うんか?」

100万円の傘かぁ...ちょっと高すぎる気がしないでもない。

車選び

そもそも車に求めることは移動なので、車にどんな種類があるのか、どれだけコストがかかるのかとかも意識してこなかったので調べてみた。

車は排気量に応じて普通自動車と軽自動車があって、軽自動車のほうが排気量が少ない。排気量が少ないとパワーが出ないとか車体が軽すぎて事故ったときにパワー負けしがちとかがあるらしい。一方で普通自動車よりも燃費が良いのでガソリン代が抑えられる、税金や保険も安いなど、各種ランニングコストを抑えられる。都会で移動にしか魅力を感じないなら軽自動車で良いかな。

当初は妻が「ラパンがいい」と言ってたけど、荷物が入らなさそうなので辞めた。車高低いので都会の立体駐車場に駐めやすいかもしれないけど。

実家でN-BOXを乗ったことがあり、軽なのに広い車内を体感して、もうN-BOXで良いかなと思った。ただ、新車って高いのね。200万いかないくらい。高い。

カカクコムで中古の値段を調べると100万円切る車もあるらしい。それなら手が出そう。

ランニングコスト、高くね?

いくら軽のランニングコストが安いと言っても、月2~3万くらいは想定しておいたほうが良い。そこに駐車場代がかかる。都会の駐車場は普通に2万超えするので、それだけで月5万以上かかる。めったに使わない移動に月5万かけるか...? 今から固定費+5万増えると思うとなかなかパンチがある...

本当に必要なのは車というモノなのか

もう少し調べてみたらカーリースとかカーシェアというサービスもあった。楽天経済圏にもカーシェアがあったので入会してみた。1時間1,160円くらいなので、ちょっと使う分には良さそう。まずはカーシェアを使ってみて、それでも所有したほうが良いなら買う、という判断でも遅くなさそうに感じた。

確定申告の重要性とマイナポータルの自動入力機能

不妊治療をしていると医療費が高くなるので確定申告するのがセオリー。ということで確定申告を準備していたら、マイナポータルがメガシンカしていたので、ちょっと記録したくなった。

マイナポータル連携で自動入力!

確定申告するとなると、医療費だけではなく、ふるさと納税やら証券取引の何やらもちゃんと計算しなくてはならない。医療費だけでいいのに、しんどい。そんな中、マイナポータルに新しい機能がリリースされた。

マイナポータル連携で自動入力!|令和5年分 確定申告特集

これはマイナポータル上で証券会社等のサービスを連携させることで、それらのサービスの控除の数値を自動で確定申告の情報に自動入力できるというサービスだ。確定申告の申告内容について不備があれば脱税になってしまう可能性があるので、連携したサービスで自動で入力してくれるのはとても助かる話である。

ただし、マイナポータル自体がその機能を有している訳ではなく、e-私書箱というサービスを介して、証券会社や保険会社と連携することになる。なお、下記リンクからe-私書箱の新規登録はしなくて良い。マイナポータル上でe-私書箱の新規登録もしてくれる。この辺はスムーズに登録できて便利だと思う。

www.nta.go.jp

e-私書箱から、各証券会社、保険会社と連携設定を行うのだが、これが結構厄介だった。結論を言えば連携設定はNFC機能付きスマホで行うと良い。PCで連携設定を行うと、ログイン時にマイナンバーカードを読み取るためにカードリーダーを要求されてとても面倒くさい。カードリーダーも安いやつはマイナンバーカードAPの相性が悪かったりするので、ちゃんとしたものを買おうとすれば3,000~5,000円くらいかかる。今時のスマホはほとんどNFC機能がついているので、ログイン時に困ったらスマホにURLを送ってスマホで続きの手続きを進めると良い。ログイン情報がリセットされるところだけ注意だ。

あと、連携をする上で署名用電子証明書パスワードを要求されることがあった。これはマイナンバーカードを発行する際に設定する、英数字6文字以上のパスワードだ。私はこれを幾度となく忘れてその度に市役所に再設定しに行っていた。ところが、今ではこれはコンビニやマイナポータルアプリで再設定できるようになっていた。コンビニで再設定する場合はリセット用アプリを用意する必要があるので、マイナポータルアプリでやったほうが便利だ。

ちなみに、連携したサービスの情報はすぐに確認できるものもあれば、数日かかるものもあるらしい。私が愛用している楽天証券は2月以降じゃないと連携できないらしい。

...さて、本来したかった医療費控除は一切できずに、サービス連携しまくって満足しちゃったんだけど、私は確定申告できるのだろうか、それだけが心配だ。

ところで、記事のタイトルはAI機能があるということで使ってみたが、どうなんだろうか。話題がまとまっていない記事につけるタイトルは難しいように思える。

GraalVM向けの修正がPlay本体にマージされた

github.com

Discussionから1年、オープンしてから8ヶ月でマージされた。その間、レビュー以外にもmainへのコンフリクト等もあったので、もうそのお守りをする必要がなくなって良かったなぁという感想。Play2.9というバージョンがScala3対応やscala-xml2系対応など、なかなか大きな変更が入っているので、そこに入れ込むのはなかなかしんどかったのかもしれない。まぁいずれにせよマージされて良かった良かった。

そして、それがScalaMatsuriの1日前だったので、ウキウキしながら飛び入りLTしてみた。

github.com

ただ、結果としてはdiscordには関連する投稿は1文字もなかったので、需要なかったみたい。残念ね。

PlayアプリをGraalVMでビルドした

みたいな記事を書いた。

qiita.com

もともとパーサーコンビネーターがサクッとネイティブ化できたので、最近だとネイティブサポートアツいのかな?と思って、軽い気持ちでPlayに挑戦したら丸2日かかった。ただ、公式ドキュメントが日本語で参照できるので、日本人にとってはとてもやりやすい環境だなと思った。

周辺を調べていると、SpringBootSpringNativeというプラグインでネイティブ化をサポートしているみたい。面白いなと思ったのはそのアプローチで、SpringのAOTの解析結果を基に reflect-config.json を作っちゃうという(参照)。一番めんどくさい reflect-config.json をこんな方法で解決しちゃうとは、賢いですね。

一方で Scala 界隈では akka-graal-config という形で、事前に作った reflect-config.json をまとめたリポジトリを作って解決しようとしています。これは公式でも紹介している方法ですね。

いずれにせよ、reflect-config.json が解決すれば、Play ってネイティブ化できるんですよね。その熱が冷めないうちに本家に discussion 立てちゃいました。

github.com

本格的に対応するとなると、もっとちゃんと reflect-config.json を整理する必要があるとは思うけど...

今日の晩御飯

昨日はワンオペで晩御飯を食べた後のブログとか書く気力がなかった。こういうときに妻が普段育児頑張ってくれていたんだなと再認識する。ありがとう妻。

今日はレストランで食事をした。久しぶりに会う人もいて楽しかった。

今日のコーディング

今日は Leap のコレクションと Scala のコレクションの変換クラスをいじってた。Java のコレクションと Scala のコレクションを変換するクラスをまねた実装があったので、それをゴニョゴニョしていたが、Leap の場合、as でラップすると ontology を使った変換に載せられないので、 to で変換する必要があった。to は as と同じように暗黙変換を使ったのだが、本来なら Factory を暗黙変数として定義したほうが良かったのかもしれない。余力が出たらその辺も調べてみたい。