2023/01/22

Unity 2021.3.16f1 インストール

Ocurus 2 を購入したときに Unity をインストールしていたのだが、ストレージを圧迫していたので削除してしまった。
いま・・・ Ocurus 2 はほとんど使っていない・・・(モノが悪いとかではなく、忙しかったのだよ)。

それからデスクトップPC も買い替えたし、ThinkPad T460s は人に譲ってそろそろ新しいのを買おうか、などと思っていたのだが、デスクトップPC だとコタツに入ったまま使えないのだよね。
そう、私はコタツで Unity の勉強したいがためだけにインストールをすることにしたのだ。


サイトからツールをダウンロードして、はいはいと進めていくと 2021.3.16f1 バージョンだった。

ツール自体は毎月リリースがある。

image

じゃあどれがいいんだよ、となるので LTS がある。
いや、そんな理由ではないと思うけど、LTS がないと安定したリリースが難しいし、サポートも受けにくいだろう。

Unity QA - LTS Releases - Unity
https://unity.com/releases/editor/qa/lts-releases

リストを見ると 2021年3月(だと思う)が最新のようだ。

image

しかし上から順に見ると、最後にリリースされたのが 2023年1月18日で 2020.3.44f1 だ。
2020年の 44版なのか? 日付じゃなかったのか??

image

いろいろわからんが Hub が進めてきたし、バージョンにこだわれる情報もないのでいわれたとおりにやっておく。

image

最初から Android 向けもインストールさせてほしいところだが、別々だった。

image

Android Studio はインストールされているので、そこの SDK なんかを使えばよいのだろう。
面倒だったのだ、いろいろ考えるのが。
それに SDK と一言で書かれてもバージョンが分からんしね。
にしても 2GB 近く持って行かれるんだねぇ。。。

image

 

そして私の ThinkPad T460s はもう7年も前のモデルだ。
Unity の開発環境をインストールするにはなかなか、かなり、けっこうつらいものがある。

 

Unity のインストール後なのかどうか忘れたが、JDK がいろいろインストールされていたので手動で削除した。
普段は JDK を使わないので Android Studio にインストールされているやつだけで十分なのだ。
が・・・ Unity で Android のビルドをしたときに怒られてしまった。
Unity のインストール時に既にインストールされていた OpenJDK のパスが設定されたのかな?
これは Edit > Preferences... > External Tools で Unity インストール時に使われている JDK を使うようにチェックすればよさそうだ。Android SDK のパスも Unity インストール時ではなく Android Studio でインストールされているパスになっていた。

Unityで見る位置を変えるのは右クリックしてドラッグ

めったに使わない Unity なので、いつも使い方が分からない。

オブジェクトの裏を見たいだけなのに!

https://learn.unity.com/tutorial/bolt-sceen-view-manipulator?uv=2019.4&projectId=5f0e8e30edbc2a1549c23a2c#5f0e9174edbc2a1a53868584

右クリックしてドラッグだった。
この手の操作って、トラックボールだとやりづらい機種がある。私の使っているケンジントンの手の平でボールを転がすタイプだとちょいと面倒だった。

 

あと、シーンビューの右上に出ているあれ。
「右クリックしてドラッグ」がわからないときに、あれをぐりぐりドラッグしたら視点が変わってくれないかと期待したのだがダメだったのだ。
正面向いたりなんかはできるようなのだが、あれは一体何なのだ?

シーンギズモ
https://docs.unity3d.com/ja/2020.3/Manual/SceneViewNavigation.html#gizmo

シーンギズモ、と呼ぶそうだ。

  • X, Y, Z をクリックして視点を軸の方向にする
  • 戻すときは右クリックして Free

他にもあるが、覚えられる気がしない。。。

Linuxでcompose upできたからといってMacでできるとは限らない

お仕事で Dockerfile や docker-compose.yml を書いていた。

自分の環境(Ubuntu 20.04)・・・OK。
Github Actions・・・OK。

ということでレビューしてもらったのだが、Mac の人がコンテナが立ち上がらなかった、ということがあった。

 

まずは落ち着くことだ。
しばしばあることなので、慌てないで良い。

 

docker の管理内で収まる範囲なら、そういうことはあまりない。
今まで見てきた中でそういうことが起きるのは、

  • イメージを作ってコンテナを実行させる過程のどこか
  • 永続化するためにファイルシステムをホスト側とつなげているどこか

が多かった。

今回は、Dockerfile で RUN してディレクトリやファイルの操作をしつつ、compose.yml の方でも volumes や entrypont を書いていて、Dockerfile でやった内容が volumes でマウントしたことで見えなくなった、みたいな感じだった。
そういう順番的なもので Linux と Mac の違いが出てくるとは思わなかったが、ドキュメントを探してもどれがどの順番で処理されるかの記述は見つけられなかった。


あとはありがちなのが、Permission denied だ。
未だに悩まされる。
ユーザ権限で動作する docker も experimental で出ているようだが、うまく動かない Dockerfile/compose.yml があったので使うのはやめておいた。というより、他の人が普通の docker を使っていたら混乱するので、全員合わせない限りはまだ使わないだろう。

Permission denied でどうするのがよいかよくわからんが、ユーザ指定はするようにした。
何も指定しないと root で動作するので、コンテナからしか書き込まないのであれば問題ないと思うが、ホスト側で作ったファイルを読もうとすると面倒なことになる。あと、ホスト側からそのファイルを見たいときに sudo しないといけないのが地味に嫌だったりもする。

わかりにくいのが、イメージ側が持っているユーザID とホスト側のユーザIDが一致しないときだ。
Linux で最初にアカウントを作るとだいたい 1000 から始まって、それから 1001, 1002 とユーザが追加されるごとにインクリメントされる。
ホスト側が 1001 のユーザでイメージが 1000 だった場合も権限が違うので Permission denied になるだろう。

なので面倒だが id -u や id -g で与えるようにしている。
これをうまいことやってくれるのがユーザ権限で動作する docker かもしれんが、よく知らん。

2023/01/09

[docker] いろいろ止めて削除したいとき

docker で遊んでいると、コンテナがたくさんできていたりイメージができていたりして、全部忘れたいことがある。

docker stop `docker ps -qa` && docker rm `docker ps -qa`
docker rmi `docker images -qa`
docker volume rm `docker volume ls -q`
docker network rm `docker network ls -q`

1行目でコンテナを止めて削除。
2行目でイメージを削除。
3行目でストレージを削除。
4行目でネットワークを削除。

イメージは --force で強制しないといけないことがあるのかもしれんが、よくわからん。

それぞれ .bashrc などで alias にしておくと楽かもしれんね。

Dockerfile に USER がないときに docker run -u を指定した場合

docker run -u の説明では Dockerfile の USER を上書きすると言うことだったが、では Dockerfile に USER がなかったらどうなるかが気になった。
まあ、予想は付くが・・・。

$ docker run -v "$PWD/hello_dir:/data" -u 1002:1002  hello-test
[abc]: Hello, Docker!?
[abc]: ReadMe!

$ ls -l hello_dir/abc/
total 8
-rw-rw-r-- 1 hirokuma hirokuma  8 Jan  8 21:48 read.txt
-rw-r--r-- 1 hirokuma hirokuma 15 Jan  9 17:54 test.txt
$

まあ、そうよね。

  • Dockefile に USER の記述がない場合は「USER root:root」である。
  • docker run -u は USER を上書きする。

とするか、

  • docker run -u はユーザ切替を行う(Dockefile の USER よりも優先される)

のような書き方が良いのかね。

そう考えると、カレントユーザになるかならないかはっきりしない USER 指定よりも、何も書かずに root になる方が気付きやすいかもしれない。下手にカレントユーザの UID と Dockefile の USER で指定したユーザの UID が一致すると、うまくいく環境といかない環境が出てきて、何が原因かが分かりづらい気がするのだ。 root になっていると「ああ root だったらダメよね」と気付きやすい。

実に悩ましい話だ。

docker の permission denied (2)

docker で Permission denied が発生することがあるのはわかったけどよくわからんという記事を書いた。

hiro99ma blog: docker composeのvolumesでpermission deniedになったりならなかったりする
https://blog.hirokuma.work/2023/01/docker-composevolumespermission-denied.html

そしてファイルの削除については ファイルの権限よりも属しているディレクトリの権限の方が強そうだという記事も書いた。

hiro99ma blog: root権限のファイルもuserが削除できるのか
https://blog.hirokuma.work/2023/01/rootuser.html

そのとき確認した dockertest1 は docker-compose.yml で ./hello_dir/ を volumes で指定している。
docker compose up の実行前に hello_dir ディレクトリを作成していなかった場合、実行すると root.root で作成された。中のファイルも root.root である。
user 権限で hello_dir ディレクトリを作成(0755)していた場合も、特に問題なく中に root.root のファイルが作成される。
ディレクトリを user 権限かつ chmod 0000 にしていた場合も、問題なく root.root のファイルが作成されていた。
ディレクトリを 123.123 という適当な権限かつ chmod 0000 までしたが、それでも docker compose するとファイルが作成された。

 

今までのルールが通用しないのですが、なんなんだ docker ??


冷静になろう。
前回も user で rm をしてはいるが、それまでの設定は sudo などして root 権限で行っている。
つまり root 権限があればだいたいのことはできてしまうと思っていて良いだろう。

それに、そもそも私が docker で体験した Permission denied は書込みだったんだろうか?
なんとなくだが、作成していたテストデータを読み込めなかったとかだったような気がしてきた。

read も追加した dockertest1 を作った。
Dockerfile でコメントアウトしていた node ユーザに切り替えるところを有効にして、index.js でファイルを読むようにした。
docker compose build で作り直して docker compose up する。

$ docker compose up
[+] Running 1/1
 ⠿ Container docker-hello-1  Recreated                                                                   0.3s
Attaching to docker-hello-1
docker-hello-1  | [abc]: Hello, Docker!?
docker-hello-1  | [abc]: ReadMe!
docker-hello-1  |
docker-hello-1  | node:internal/fs/utils:344
docker-hello-1  |     throw err;
docker-hello-1  |     ^
docker-hello-1  |
docker-hello-1  | Error: EACCES: permission denied, open '/data/abc/test.txt'
docker-hello-1  |     at Object.openSync (node:fs:585:3)
docker-hello-1  |     at Object.writeFileSync (node:fs:2155:35)
docker-hello-1  |     at Object.<anonymous> (/usr/src/app/index.js:8:4)
docker-hello-1  |     at Module._compile (node:internal/modules/cjs/loader:1103:14)
docker-hello-1  |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1155:10)
docker-hello-1  |     at Module.load (node:internal/modules/cjs/loader:981:32)
docker-hello-1  |     at Function.Module._load (node:internal/modules/cjs/loader:822:12)
docker-hello-1  |     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
docker-hello-1  |     at node:internal/main/run_main_module:17:47 {
docker-hello-1  |   errno: -13,
docker-hello-1  |   syscall: 'open',
docker-hello-1  |   code: 'EACCES',
docker-hello-1  |   path: '/data/abc/test.txt'
docker-hello-1  | }
docker-hello-1 exited with code 1

うーん、読み込むファイル read.txt を置くためにディレクトリをあらかじめ作成していて、その権限がローカルユーザ(`id -u` == 1002 だった)になっていたので node ユーザでは書込みできなかったというところだろうか。

 

そもそも node ユーザってどういうユーザなのだ?
node:16.14.0-alpine3.14」であらかじめ準備されているユーザだと思うのだが(ちなみに vscode の dockerエクステンションを使うと node:lts-alpine だった)。
まあ alpine を使わずにもっと普通のディストリビューションを使えばいいやんという気もするが、組み込み Linux をやっていたので busybox は嫌いではないのだ。昔は newlibc とか使っていたような気がするけど今はどうなんだろうね。

addgroup しているのは 1000。
Linux をインストールして最初にユーザを作るとだいたい 1000 から始まるので、ローカルユーザがそういうアカウントであれば EACCES エラーにならなかったかもしれない。

この、アカウントというか id というかで変わってくるというのがやっかいなところだと思う。
Dockerfile でユーザを切り替えたとしても、今回で言えば git clone したユーザの id を使うようにしないと書き込みはできないだろう。

ちなみにこれが vscode のエクステンションを使って作ったデフォルトの Dockerfile だ。

FROM node:lts-alpine
ENV NODE_ENV=production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm install --production --silent && mv node_modules ../
COPY . .
EXPOSE 3000
RUN chown -R node /usr/src/app
USER node
CMD ["npm", "start"]

node というユーザがある前提で chown したり USER で切り替えたりしている。
USER は docker run のオプション -u で上書きできるそうなので、それを使えばローカルユーザの id を使うことができると思う。あくまで USER はデフォルトのユーザを定義するだけらしい。

コンテナ起動時に -u オプションを使うと USER 命令を上書きできます。

ただ、USER を使っていない Dockerfile だとどうなるのだろう?
↑だと chown までが 1000 で行われて、USER のところだけ置き換えられる?? それだと意味が無いよなぁ。
でも chown コマンドがあるからそこで指定されたユーザも -u で置き換えて上げよう、と考えるのは難しいと思う。

Dockerfile を書くベスト・プラクティス — Docker-docs-ja 17.06.Beta ドキュメント
https://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html#user

イメージ内で得られるユーザとグループは UID/GID に依存しないため、イメージの構築に関係なく次の UID/GID が割り当てられます。そのため、これが問題になるのであれば、UID/GID を明確に割り当ててください。

ここでいう UID/GID はコマンドを実行しているローカルユーザの id -u や id -g のことを指しているのだろう。

docker のバージョンが上がると説明が追加されていた。

Dockerfile のベストプラクティス — Docker-docs-ja 1.9.0b ドキュメント
https://docs.docker.jp/engine/articles/dockerfile_best-practice.html#user

サービスは特権ユーザで実行せずに、 USER を使えば非 root ユーザで実行できます。利用するには Dockerfile でユーザとグループを RUN groupadd -r postgres && useradd -r -g postgres postgres のように作成します。

記述はなくなっていても -u 自体はなくなってないと思うのだ。
どうなってるのだろうね?
日本語版が古い可能性もあるので、英語版も確認したが同じようだ。

Docker run reference | Docker Documentation
https://docs.docker.com/engine/reference/run/#user

  • デフォルトユーザは root (id = 0)
  • Dockerfile の USER でデフォルトユーザを指定することができる
  • docker run の -u(--user) オプションで USER を上書きできる

 

dockertest1 - tag:test2 で試そう。

docker compose を使わず、docker run を -u 無しで実行すると、これは↑と同じく EACCES エラーになる(カレントユーザの id -u が 1002 なので)。

$ docker build -t hello-test .
$ docker run -v "$PWD/hello_dir:/data" -it hello-test

-u でカレントユーザの UID:GID を指定するとエラーにならなかった。

$ docker run -u "`id -u`:`id -g`" -v "$PWD/hello_dir:/data" -it hello-test

これは Dockerfile の USER node がカレントユーザの UID/GID を使うようになったのだろうか?

image

/bin/sh でログインして確認すると、COPY したファイルや hello_dir/abc/* も含めて node.root になっていた。
whoami で 1002 と出ているから、alpine の node ユーザで動いているわけでもないようだ。

$ docker run -u "`id -u`:`id -g`" -v "$PWD/hello_dir:/data" -it hello-test /bin/sh
/usr/src/app $ ls -l
total 16
drwxrwxr-x    1 node     root          4096 Jan  8 10:35 hello_dir
-rw-r--r--    1 node     root           259 Jan  8 12:48 index.js
-rw-r--r--    1 node     root          1414 Jan  5 12:28 package-lock.json
-rw-r--r--    1 node     root           278 Jan  5 13:51 package.json
$ id -u
1002
$ id -g
1002
$ whoami
whoami: unknown uid 1002

となると、chown した node はそのまま nodeユーザのアカウントで実行され、その次の USER が docker run -u で上書きされたと考えてよさそうだ。

が・・・ hello_dir/abc/test.txt は node.root で生成されているのだ。 USER が上書きされているのであれば 1002.1002 になっているのではないだろうか?

USER の説明を見てみると current stage という説明がある。

The USER instruction sets the user name (or UID) and optionally the user group (or GID) to use as the default user and group for the remainder of the current stage.

ステージはビルドステージのことのようで FROM から始まるようだ。ということは・・・USER を書く位置はあまり関係ない?
だいたい、イメージのビルドとコンテナの実行への指示が同じ Dockerfile に書かれているのがわかりづらいと思うのだ。

Understand how CMD and ENTRYPOINT interact
https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact

  • CMD か ENTRYPOINT はどちらかは少なくとも必要。
  • コンテナを「実行可能」として定義するなら ENTRYPOINT が必要。
  • CMD は ENTRYPOINT のデフォルト引数

両方書くと ENTRYPOINT を並べた最後に CMD で書いたものが追加される。
ENTRYPOINT がない場合も同様だが、そのときは CMD が ENTRYPOINT の引数と等しくなるので CMD の内容が実行されたかのように見えるだろう。

  • ENTRYPOINT も CMD も、
    • 配列形式: シェル無しでそのまま実行される(たぶん exec系のシステムコールにそのまま渡される)
    • 単独形式: /bin/sh -c の引数になる
  • ENTRYPOINT が配列、CMD が配列
    • ENTRYPOINT 配列 + CMD 配列が実行される
  • ENTRYPOINT が配列、CMD が単独
    • ENTRYPOINT 配列 + /bin/sh -c CMD が実行される
  • ENTRYPOINT が単独、CMD が配列
    • /bin/sh -c ENTRYPOINT + CMD配列 が実行される
  • ENTRYPOINT が単独、CMD が単独
    • /bin/sh -c ENTRYPOINT + CMD が実行される

わかりづらい・・・。特に ENTRYPOINT が配列で CMD が単独の場合は後者に /bin/sh が付くので混乱しそうだ。
CMD は実行用というよりも ENTRYPOINT の引数として使った方がわかりやすいようにも思うが、名前が CMD だけにコマンドを書きたくなるな。

FROM で使った image の中に CMD が既に入っていた場合、image の中で使われていた CMD は空になるそうだ。
なので、FROM で使われる前提の image であれば ENTRYPOINT は環境を作るのに専念して(node では docker-entrypoint.sh を実行するようになっていた)、CMD はどうでもよい

そして CMD は別の引数で上書きされる(overridden when running the container with alternative arguments)というのは?
これは docker run しかあるまい。

Docker run リファレンス — Docker-docs-ja 20.10 ドキュメント
https://docs.docker.jp/engine/reference/run.html#dockerfile

以下が上書き可能なようだ。

  • CMD
  • ENTRYPOINT
  • EXPOSE
  • ENV
  • HEALTHCHECK
  • VOLUME
  • USER
  • WORKDIR

CMD の置き換えは、docker run の一番最後に付けるコマンドがそれに当たるらしい。
いつも実行中のコンテナにログインするときに /bin/sh を付けている。

フォアグラウンド
https://docs.docker.jp/engine/reference/run.html#id36

あまり気にしていなかったが、このときも ENTRYPOINT も実行されているのだろうか? あるいは ENTRYPOINT という名前の通り、ENTRY し終わったコンテナの場合には実行されないのだろうか。

ENTRYPOINT
https://docs.docker.com/engine/reference/builder/#entrypoint

dockertest1 の CMD を ENTRYPOINT に置き換えると、docker run ... /bin/sh としてもログインできずに ENTRYPOINT の中身が実行された。CMD のままだと /bin/sh でログインできる。

 

いかん、脱線しすぎた。
ともかく 1つの FROM に対して USER は 1つだけで、順番はあまり関係ないというか、ENTRYPOINT か CMD にしか影響を及ぼさないのだろう。docker run -u による上書きがマルチステージの Dockerfile だとどうなのかわからないが、最後のステージにしか影響しないんじゃないだろうか。

それと、docker compose の user は Dockerfile の上書きになるそうだ。つまり立ち位置としては docker run -u と同じということだろう。まあ、docker compose を使うと docker run -u は使えないからその代わりだと認識しておけば良いか。

https://docs.docker.jp/compose/compose-file/index.html#user

処理を root 権限のまま実行するというのはあまりやらないことだと思うので、Dockerfile には USER を書いておくのがよいと思う。

2023/01/08

root権限のファイルもuserが削除できるのか

かなり初歩的なお話です。

$ sudo touch abc
[sudo] password for xxx:
$ ls -l abc -rw-r--r-- 1 root root 0 Jan  8 11:48 abc $ rm -f abc
$

root のファイルなのに削除できるんだ!
ちなみに xxx はユーザで、この記事では user と表現します。もちろん root のグループには属していない。

 

-f を付けない場合は警告プロンプトが出てきて確認されますが、それでも削除できる。
これはディレクトリも同様だった。

$ sudo mkdir abc
$ ls -l
drwxr-xr-x 2 root root 4096 Jan  8 11:49 abc $ rm -rf abc $

まだ sudo が残っていたのでパスワードの入力無しで mkdir できているが、ともかく sudo 無しで削除できる。所有者はファイルの場合もディレクトリの場合も root.root、アクセス権はファイルが 0644、ディレクトリが 0755。  私は書込権限がなければ削除できないと思い込んでいたのだが、そうではなかった。

書込権限がないので "-f" がないとプロンプトが出て確認が求められるが Permission denied にはならない。

 

ただ、中に root のファイルが入っている root のディレクトリだと Permission denied になる。

$ sudo mkdir abc
$ sudo touch abc/abc
$ rm -rf abc
rm: cannot remove 'abc/abc': Permission denied
$

ではディレクトリが user で中のファイルが root だとどうなるかというと、削除できる。

$ mkdir abc
$ sudo touch abc/abc
$ rm -rf abc
$

逆のパターン、ディレクトリが root で中のファイルが user の場合、これは Permission denied になる。

$ sudo mkdir abc
$ touch abc/abc
touch: cannot touch 'abc/abc': Permission denied
$ sudo touch abc/abc
$ sudo chown xxx.xxx abc/abc
$ rm -rf abc
rm: cannot remove 'abc/abc': Permission denied
$

では中身が空の root のディレクトリで other の権限もない場合だが、これも削除できる。

$ sudo mkdir abc
$ sudo chmod 0700 abc
$ rm -rf abc
$

では自分に対しても権限がない場合はどうなるかというと、削除できる。

$ mkdir abc
$ sudo chmod 0000 abc
$ rm -rf abc
$

Linux でプログラムでディレクトリ削除のプログラムを実装するとわかるが、ディレクトリが空にならないと削除できなかったと思う(思う、と弱気なのはそういうコードを書いたのがかなり昔で覚えていないからだ)。

remove() は、ファイルなら unlink() を、ディレクトリなら rmdir() を呼び出す。

Man page of REMOVE
http://linuxjm.osdn.jp/html/LDP_man-pages/man3/remove.3.html

rmdir() は空でないと ENOTEMPTY エラーになる。
スティッキービットが設定されていたりファイルシステムでディレクトリ削除が許容されていない場合も EPERM エラーになる。
ファイルシステムが読み込み専用だった場合は EROFS エラーになる。
EACCES エラーは、削除したいディレクトリを含んでいるディレクトリが実行する user に対して書込権限がない場合になるのかな? 指定したディレクトリがカレントディレクトリではなくたどっていく場合に途中でたどる権限が無くなった場合も EACCES エラーになりそうだ。
rm コマンドだと全部ひっくるめて「Permission denied」になるのかもしれない。

Man page of RMDIR
http://linuxjm.osdn.jp/html/LDP_man-pages/man2/rmdir.2.html

ではファイルの方はどうか。

Man page of UNLINK
http://linuxjm.osdn.jp/html/LDP_man-pages/man2/unlink.2.html

unlink() と unlinkat() があるそうだ。
unlinkat() なんて昔あったかな? 更新が 2017年だからその頃にはあったことになる。
エラーになる内容は rmdir() と似た感じだ。

 

rm のソースコードを見つけられなかったので推測になるが、カレントディレクトリに書込権限があるならばこうなる。

  • 中身が空であれば user にかかわらず削除できる
  • 中身があるなら、そのディレクトリに書込権限がある user であれば削除できる
    • 中身は unlink() を使って削除するのでディレクトリの書込権限がいる

ファイルに対する書込権限は必要ないのか・・・。
user や group が違うファイルなら削除されないだろうと思ってワイルドカードでがさっと削除させていたのだが認識が甘かったようだ。

 

そうだ、"-f" を付けなければ良いのだ。

$ mkdir abc
$ sudo touch abc/abc
$ rm -r abc
rm: remove write-protected regular empty file 'abc/abc'?

体が勝手に「-r」まで打ち込んだら「-rf」までやってしまうのよね。。。
ということは、rm コマンドって再帰で unlink() する前に stat() とかで権限をチェックしているということだな。

2023/01/07

Thunderbolt 4?

私が使っているノートPCは ThinkPad T460s というけっこう前の機種だ。
たぶん7年前だと思う。
さすがに今年は買い替えようと思う。

候補になっているのは同じTシリーズの T系。
14インチがよいので T14系になるのだが「T14」と「T14s」がある。
また世代があるようで、今(2023年1月)は Gen3 が最新のようだ。
そして Intel と AMD がある。
選択が多すぎだ・・・。

 

どれを選んでも文句が出ないくらいにはスペックが今より上がっているだろうが、できるだけ自分に合ったものを選びたいというものだ。それに発売されて10ヶ月くらいは経っているようなので、そろそろ次が出てもおかしくないと思う。

X1 Gen11 などは 2023年4月 という記事もあったし、現行の T14s も 2022年5月とか6月とかだったようだ。

ThinkPad Tシリーズに2022年モデル 16:10ディスプレイの新ボディーを採用 新色もあり:MWC Barcelona 2022(1/3 ページ) - ITmedia PC USER
https://www.itmedia.co.jp/pcuser/articles/2203/02/news135.html

ThinkPad Tシリーズに2022年モデル 16:10ディスプレイの新ボディーを採用 新色もあり:MWC Barcelona 2022(2/3 ページ) - ITmedia PC USER
https://www.itmedia.co.jp/pcuser/articles/2203/02/news135_2.html

sが付いてるやつも付いてないやつも同じくらいに発売されたのだな。

 

何気なく見ていて気付いたのが、Intel 版だと Thunderbolt 4で、AMD だと USB 規格だそうな。
紛らわしいことに、T14 Gen3i (intel版は i が付く) も T14s Gen3i も Thunderbolt 4 で、AMD 版の T14 Gen3 はUSB 3.1規格、T14s Gen3 は USB4 規格だそうな。

まあ、Thunderbolt 規格は Intel と Apple の共同開発らしいので、 Windows 系だと CPU が Intel じゃないと Thunderbolt にならないということかな。独占特許とかでもないだろうけど、そこまでしなくてもなー、という感じで USB規格のままにしているのかもしれんが、よくわからん。

Thunderbolt™ 4 とは?USB-C との違いは?ー インテル
https://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/thunderbolt/thunderbolt-4-vs-usb-c.html

で、この図。

image

USB-C、訳がわからんがな・・・。
なので Thunderbolt 4 にしておけば全部サポートするということなのだろうけど、こんなにいるかぁ?、という気にもなってしまう。

 

コネクタの形状がいくつもあると部品もそれだけ必要になってしまうが、統一されてもいろいろと解決しないもの(見た目で区別できないとか)はたくさんあるのだなぁ、と思ったのでした。

2023/01/06

docker composeのvolumesでpermission deniedになったりならなかったりする

Aしたりしなかったりする、という報告は多い。
つまり、毎回起きるわけではないというわけだ。
もちろん、バグで無いこともある。ただ、毎回同じ動作をしないので訳がわからんとか。

もう1つ気にしないといけないのは、頻度の表現方法についての個人差や状況の差だ。
例えばプロジェクトのお仕事をしていて「起きたり起きなかったり」という話をすると、だいたいは何か特定のことを行った場合だと思う。
そうではなく、何かの勉強中だったとすると、練習で同じようなことをやっているのだけれども結果が安定しない、ということがあるかもしれない。

 

何が言いたいかというと、docker compose の勉強をしていたけれども、volumes で永続化させようとしていただけなのに permission denied になって書き込めない環境があった、という話だ。

お仕事で permission denied になる環境があったので、それを最低限の構成にして状況を探っていこうと思い自作したのだけれども現象が起きなかった、というわけだ。


作ったのは、これ。

https://github.com/hirokuma/dockertest1

私は Dockerfile などの自作にまったく自信がないので、vscode の Dockerプラグインに作ってもらった。
再現はできなかったけど。
permission denied ということは chmod とか USER とかそういうところかと思ってコメントアウトしたのだが、ホスト環境から見ると root 権限で書き込まれてはいるものの動作に問題は無い。

なんだろうねぇ。