2023/09/17

Android API33に対応してなかったアプリ

 以前作っていた QRコードを読み込んだり、クリップボードのテキストを QRコード画像にしたりするアプリ。

QRcode Read/Gen - Google Play のアプリ
https://play.google.com/store/apps/details?id=com.hiro99ma.qrgenread

放置していたのだが、Google Play Console から警告がずいぶん前に来ていたことに気付く。

compileSdk と targetSdk を 30 にしていたのだが、ちゃんと更新していきなさいということだろう。

面倒ではあるが、まあ仕方ない。

というよりも、数週間過ぎてしまったのだがどうなったんだろう?

WSL2を仕事で使ってみよう

7年ほど使っていたノートPCを新調した。
私はWindows生活が長いので、今回もWindowsだ。 

Windows11 Home では初回は Microsoftアカウントしかアカウントを作ることができず、ユーザフォルダ名はそのメールアドレスの先頭5文字までを使うという哀しい仕様であることを知った。「それくらい決めさせてくれても良くない??」と思うのは私だけではないようで、検索すると出てきた。変更はできないので別のローカルアカウントを作るしかないことだった。おかげでまだ2アカウントある状態だ。

そういう脱線話はよいとして。

私のソフトウェア開発作業はLinux向けがほとんどだ。
デスクトップPCはストレージに余裕があったし増やしやすいのもあって VirtualBox でやっている。Samba で共有しておけばファイル移動も楽だし、Windows の手慣れたツールを使うこともできて便利である。

が、ノートPCはストレージを増やしにくい。
VDI みたいなサイズが減らしにくいファイルがあると窮屈である。
そこで WSL2 だ。
かなり使えるとは聞いているものの業務として使えるかまでは調べていなかった。
真面目に検討しよう。


まずストレージのことから。

WSL ディスク領域を管理する方法 | Microsoft Learn https://learn.microsoft.com/ja-jp/windows/wsl/disk-space
  • 仮想ハードディスク方式
  • 自動でリサイズされる
  • 初期の割り当てサイズは 1TB

 1TB 確保されるというわけではなく、それだけ割り当てることができますよという値だろう。

 とりあえずインストールしてみよう。

WSL のインストール | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/wsl/install

ノートPCはまだ一度もWSL2を使ったことが無いのでちょうど良いだろう。


まず wsl --install の実行直後。
昔は Linuxサブシステムを使うための設定を行う必要があったが、最近はコマンドの実行で全部やってくれるようだ。ありがたい。

空き容量が 2GB 減った。
内訳としては「システムと予約済み」が 1GB、「インストールされているアプリ」が 1GB 、「その他」が 0.04GB、「他のユーザー」が 0.03GB だった。
この PC はアカウントが 2ユーザー分あり、自分以外のアカウントが増えたのか WSL の分が増えたのかはよくわからない。
ディストリビューションは選択していないので Ubuntu がインストールされていた。

では、初めて Ubuntu を起動してみよう。
インストールされていたのは「Ubuntu 22.04.2 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 x86_64)」だった。

空き容量が 2GB 減った。
使用領域は 1.5GB 

「システムと予約済み」が 0.2GB、「インストールされているアプリ」が 1.1GB、「その他」が 0.03GB、「他のユーザー」が 0.07GB 増えていた。

df -h しておく。
ルート / に 1007 GB 割り当てられているのが、初期の割り当て 1TB という部分だろう。

Filesystem      Size  Used Avail Use% Mounted on
none            7.8G  4.0K  7.8G   1% /mnt/wsl
none            237G   79G  159G  34% /usr/lib/wsl/drivers
none            7.8G     0  7.8G   0% /usr/lib/wsl/lib
/dev/sdc       1007G  1.3G  955G   1% /
none            7.8G   84K  7.8G   1% /mnt/wslg
rootfs          7.8G  1.9M  7.8G   1% /init
none            7.8G  928K  7.8G   1% /run
none            7.8G     0  7.8G   0% /run/lock
none            7.8G     0  7.8G   0% /run/shm
none            7.8G     0  7.8G   0% /run/user
tmpfs           4.0M     0  4.0M   0% /sys/fs/cgroup
none            7.8G   84K  7.8G   1% /mnt/wslg/versions.txt
none            7.8G   84K  7.8G   1% /mnt/wslg/doc
drvfs           237G   79G  159G  34% /mnt/c
drvfs           224G   53G  171G  24% /mnt/d
drvfs            17G  2.1G   15G  12% /mnt/g
snapfuse        128K  128K     0 100% /snap/bare/5
snapfuse         73M   73M     0 100% /snap/core22/607
snapfuse         92M   92M     0 100% /snap/gtk-common-themes/1535
snapfuse         54M   54M     0 100% /snap/snapd/18933
snapfuse        151M  151M     0 100% /snap/ubuntu-desktop-installer/967


仕事で使うのは、docker, node, golang、あとは必要に応じて。
docker は community版というのかコマンドライン版というのかを普通にインストール。node は nvs 経由。golang は snap で。
docker は usermod し忘れて Permission denied であせったが、まあそういうこともある。docker daemon は service を使って起動させていた記憶があるのだが、今はマシンを再起動して Ubuntu を立ち上げたときには起動していた。いったいいつ起動するんだろうね。

vscode で WSL にログインする extension を入れておけば、当面は困らないだろう。開くフォルダを変更するたびに vscode を開き直すような大げさな動きをするのだけど、まあこれは remote SSH の動作と同じようにしているためなのかね。

 

こういう感じで、以前 docker を使うようにしていたプロジェクトを GitHub から clone して動かしているが、今のところ問題ない。まあ、問題があったら多いにハマりそうなのは仕方あるまい。

2023/09/10

JavaScriptやTypeScriptで検索しづらい演算子

単語ではないものはネットで検索しづらい。「!」や「?.」などだ。
以前記事にしたようなしてないような・・・忘れたので調べ直す。

 

?.

これは TypeScript ではなく JavaScript にある演算子である。
オプショナルチェーンと呼ぶそうだが、英語では optional chaining だ。

オプショナルチェーン演算子
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining

ドットまで含めての演算子になっている。ちなみに「.」は chaining operator と呼ぶそうだ。

リンク先では「adventurer」のプロパティに「dog」がないので「adventurer.dog?.name」となっている。
if文にするならこんな感じにして dog の有無を確認するだろう。

if (adventurer.dog) {
  console.log(adventurer.dog.name)
}

チェックをして dog の時点で undefined とわかっているためか「adventurer.dog?.name.hello」でも「adventurer.dog?.name.hello.world」でも、それから先の chaining operator でつないだ部分は気にしないようだ。

次の行の「adventurer.someNonExistentMethod?.()」はメソッドの有無をチェックしている。
こんな感じで定義をしてやれば呼び出される。

const adventurer = {
  ...
  someNonExistentMethod: () => 'hello',
};

まあ、メソッドの有無は大きい問題になりそうだから、通常は if でチェックするんじゃないかな。

 

 

!

これはおそらく TypeScript の演算子だろう。
Non-null assertion operator と呼ばれる。

Non-null assertion operator
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-null-assertion-operator

これは「なくてもいいですよ」変数の「?」と逆のような意味といってよいかもしれん。

たぶん「なくてもいいですよ」の「?」も TypeScript だと思うが、これは演算子ではなく型定義でしか使えないはずだ。
option parameter と呼ぶそうであるが TypeScript のドキュメントからは見つけられなかった。

 

とはいえ、何に使えるのか。null じゃないですよ、といいつつも実装上 null になることがありうるのをチェックするようになる? でもチェックして何ができるというのか。例外を出して終わらせるのであれば「!」がなくても同じだろう。

こちらによると、コンパイラに明示するのが目的らしい。

TypeScriptでよく見る「?」「!」と仲良くしたい
https://zenn.dev/oreo2990/articles/3d780560c5e552

たしかに、「?」にした変数だったりするとわざわざ if 文で「== null だったら処理を続けない」みたいなのを書かないとエラーになっていた気がするので、そういうのを書かなくてよいのかもしれない。
が、それだったらむしろ if 文にしておかないと危ないのでは? ちょっとテストコードを書くときに、そこで落ちてもいいからコンパイラは無視してくれってことだったらありなのかな。

 

その次に載っていた「明確な割り当てアサーション」は「?」の逆だ。
私はこのオプションを知らなかったが、これも「!」演算子と似たような感じだろう。
確かに書いていてエラーになるのだが、私は初期値を適当に突っ込んでるな。初期値を突っ込むことでロジックが間違っていることには気付きにくくなるかもしれないので、そういうのの洗い出しにはよいかもしれん。