KAEDE Hack blog

JavaScript 中心に ライブラリなどの使い方を解説する技術ブログ。

JS ゲーム製作 -- box-intersect で四角形同士の衝突を検知したいが想像通りの挙動にならない

why

qiita.com

この記事を Twitter で見た。

衝突判定ライブラリなんてあるんだ、触ってみようかなって思った

box-intersect

github.com

box-intersect とは?

D 次元や N と M ボックスでそれぞれの交差を見つけるライブラリ。

O((n+m) log^d(n+m)) という式を使ってメモリの余分な割り当てを防ぐ

ベンチマークが高いらしい。重くなりにくいってことですね!

0fps.net

詳しい数式の話は全くわからない..

丸ごとのゲーム画面ライブラリではなくて、index.js とあるように、js のみ。

なので 実際に可視化されて見えたり、ものが動くロジックは別で書く必要がある。

四角形同士の重なりの検知を試してみる。

var boxIntersect = require('box-intersect')

//Boxes are listed as flattened 2*d length arrays
var boxes = [
  [1, 1, 2, 2],   //Interpretation: [minX, minY, maxX, maxY]
  [0, -1, 3, 2],
  [2, 1, 4, 5],
  [0.5, 3, 1, 10]
]

//Default behavior reports list of intersections
console.log('overlaps:', boxIntersect(boxes))

//Note:  Boxes are closed

//Can also use a visitor to report all crossings
var result = boxIntersect(boxes, function(i,j) {
  console.log('overlap:', boxes[i], boxes[j])

  //Can early out by returning any value
  if(i === 2 || j === 2) {
    return 2
  }
})

console.log('early out result:', result)

box をいくつか決めて、それの overlaps (重なり) を検知して

  1. 衝突が起こっている座標たち
  2. 衝突判定になっている四角形1
  3. 衝突判定になっている四角形2
  4. 衝突判定になっている四角形の総数

を出力するコードだと推測する。

実際に書いてみる

clone して使うわけではなく、npm i で使うようだ

適当なディレクトリを切って、npm install する

npm i box-intersect
added 4 packages, and audited 5 packages in 4s

found 0 vulnerabilities

さっきのコードをコピペして npm で実行

vi main.js
node main.js
overlaps: [ [ 1, 0 ], [ 1, 2 ], [ 0, 2 ] ]
overlap: [ 0, -1, 3, 2 ] [ 1, 1, 2, 2 ]
overlap: [ 0, -1, 3, 2 ] [ 2, 1, 4, 5 ]
early out result: 2

ちゃんと動いている!!!

自分の数値を入れて試す

0,0 to 1,1

0,0 to 2,2

0,0 to 3,3

この3つの box を作る。

これで 0,0 to 1,1 の地点でのみの交差で

3つの boxes とも overlap と出たら成功である

var boxes = [
  [0, 0, 1, 1],   //Interpretation: [minX, minY, maxX, maxY]
  [0, 0, 2, 2],   //Interpretation: [minX, minY, maxX, maxY]
  [0, 0, 3, 3],   //Interpretation: [minX, minY, maxX, maxY]
]

数値を入れて実行!

node main.js
overlaps: [ [ 2, 1 ], [ 2, 0 ], [ 1, 0 ] ]
overlap: [ 0, 0, 3, 3 ] [ 0, 0, 2, 2 ]
early out result: 2

結果は衝突箇所が 2,1 と 2,0 と 1,0

衝突した四角形が 0,0,3,3 と 0,0, 2,2

衝突した四角形の数が 2つ

になった。図示してみる

f:id:kei_s_lifehack:20210413044729p:plain

これで実際に交差判定になっているのは

1,0 と 2,0 と 2,1 のみ。

その後下に下がって 2,2 -> 1,2 -> 0.2 と行かないのが不明

赤 (0,0 to 2,2) と緑 (0,0 to 3,3) のみの衝突だとしても、なぜ右上三箇所だけなのか

青 (0,0 to 1,1) は どうして接触にならないのか

が全くわからない

シンプルに前例を二つにする

  [1, 1, 2, 2],   //Interpretation: [minX, minY, maxX, maxY]
  [0, -1, 3, 2],

これだけで衝突判定を出す、すると

overlaps: [ [ 1, 0 ] ]
overlap: [ 0, -1, 3, 2 ] [ 1, 1, 2, 2 ]
early out result: undefined

f:id:kei_s_lifehack:20210413050629p:plain

全然当たってない 1,0 のみが衝突になるし、当たっている図形は 0 なる、何もわからない

懸念

[minX, minY, maxX, maxY]

が 最初の xy から 次の xy に線を伸ばして 四角形を作っていると解釈しているが、 これがそもそも全然違うかもしれない

角しか当たらない疑惑

npm のこのライブラリのサイトをみていたら

Note The boxes are treated as cartesian products of closed intervals.

For example, the boxes [1,1,2,2] and [0,0,1,1] will be reported as intersecting by this module.

1,1 to 2,2 と 0,0 to 1,1 はこのライブラリでは交差してると扱われるよー

って注釈があった。

もしかして、角と角で当たってないと衝突にならないのでは?

f:id:kei_s_lifehack:20210413052309j:plain

こうやって既に入っているのは衝突では無いのでは?

角で当てて試してみる

overlaps: [ [ 0, 1 ] ]
overlap: [ 0, 0, 2, 2 ] [ 2, 2, 3, 3 ]
early out result: undefined

2,2 で交わって欲しいのに、擦りもしないところで交差してる....

overlaps: [ [ 0, 1 ] ]
overlap: [ 0, 0, 2, 2 ] [ 1, 1, 3, 3 ]
early out result: undefined

0,0 to 2,2 と 1,1 to 3,3 で当てても、接触位置と接触四角数はおかしいが、

接触している四角形のリストだけは想定通りに出ているのがわかった、これなら使えるかもしれない。

f:id:kei_s_lifehack:20210413044729p:plain

しかし最初に作ったこの四角形では青の一番小さい四角形が接触になっていない...

Canvas でシュミレーターでも作って試してみるか...

Linuc 101 Linux コマンド -- job ( -l, -s , -r ) , bg, fg -- ジョブの発動と停止と表示と裏表管理

job とは

ターミナルで実行中の fore-ground または back-ground での動作のこと

通常のブラウザなどが中心の生活では使うことはなく、普段は動いていないと思う

sleep を表で動かして一時停止して jobs で見てみる

eng-entrance.com

この記事を参考に sleep で job と表と裏を見てみる。

foreground ( 表 ) で ターミナルを指定秒数何もしない状態にする sleep コマンドを実行し、それを jobs で見てみる

sleep 1000
^Z
[1]+  Stopped                 sleep 1000

sleep 1000 を打つと 1000 sec ターミナルの入力をストップする。そのままだと表で動き続けるが、この状態だと当然次のコマンドが打てないので、ctrl z でこの ジョブを一時停止する

すると一時停止になって、今の ジョブには 停止中の sleep 1000 があるよ、と出る。

jobs
[1]+  Stopped                 sleep 1000

jobs コマンドで job を表示すると再び sleep 1000 が一時停止中だと出る。

これは「表」で動いているので、次は bg コマンドで「裏」に回してみる

bg で sleep を裏に回して動かす

bg %1 または bg 1 で 1 番の ジョブを裏で動かすことができる

 bg %1
[1]+ sleep 1000 &
jobs
[1]+  Running                 sleep 1000 &

1番で sleep 1000 が動いているが、ターミナルが使える状態になった。

sleep 1000 & で直接裏で動かす

この 末尾についている & が 裏という意味で、コマンドの後に直接 & をつけても裏で動かすことができる

and で終わるから、まだ次も打てるようにって意味だと推測する

sleep 1000 &
[1] 18360
jobs
[1]+  Running                 sleep 1000 &

殺しやすいように?実行時にプロセス番号が出て、 裏でさっきと同じように動いている。

fg YourBackgroundCommand で表に持ってきて動かす

fg YourBackgroundCommand で裏で動いてるジョブを表に持ってこれる。

jobs
[1]+  Running                 sleep 1000 &
fg sleep 1000
sleep 1000

裏で実行されていた sleep が表に持ってこられ、ターミナルに文字が打てなくなった。

jobs -l , -s, -r, で プロセス ID や 停止、実行中のジョブを表示する

https://www.cyberciti.biz/faq/unix-linux-jobs-command-examples-usage-syntax/

ping www.cyberciti.biz
PING www.cyberciti.biz (104.22.10.214): 56 data bytes
64 bytes from 104.22.10.214: icmp_seq=0 ttl=57 time=41.205 ms
64 bytes from 104.22.10.214: icmp_seq=1 ttl=57 time=36.180 ms
64 bytes from 104.22.10.214: icmp_seq=2 ttl=57 time=41.214 ms
^Z

ping を動かして止める

sleep 1000 &
[2] 18541

sleep を裏で動かす

kaede$ jobs
[1]+  Stopped                 ping www.cyberciti.biz
[2]-  Running                 sleep 1000 &

さっきやったように、jobs コマンドでジョブたちが見れる。

ping は止まっていて、sleep は裏で動いている。

jobs -l
[1]+ 18538 Suspended: 18           ping www.cyberciti.biz
[2]- 18541 Running                 sleep 1000 &

引数に -l を追加して long 表示すると、プロセス id まで出てくるので、 殺すときに便利。

jobs -s
[1]+  Stopped                 ping www.cyberciti.biz

-s だと停止中のジョブのみを表示して

jobs -r
[2]-  Running                 sleep 1000 &

-r だと動いているジョブのみを表示できる。

まとめ

ジョブ という単位でコマンド + 引数が動いており、ctrl z で停止できる

jobs コマンドでジョブリストを表示できる。

bg JobID で foreground の ジョブを background に送って動かすことができる

fg JobID で background の ジョブを foregroud に送って動かせる

jobs -l で プロセス id も一緒に表示できる

jobs -s で停止中、jobs -r で稼働中のジョブのみ表示できる

課題点

ジョブとして動かせるコマンドとして、sleep と ping しかわからない

Linuc 101 Linux コマンド -- kill -15, kill -9, killall, -- 掃除して、強く、同じコマンド由来のプロセスを殺す

kill とは

指定した引数のプロセスを殺す。止めるのではなく消し去る。

kill PID で tmux を殺す

とりあえず何かを殺してみよう。

tmux は常時起動している。

これなら止めても PC が止まることはないだろうし試しに殺してみる

ps
  PID TTY           TIME CMD
57464 ttys000    0:00.05 /bin/bash -l
59816 ttys001    0:00.25 -bash
 7349 ttys002    0:00.02 -bash
  777 ttys004    0:00.04 -bash
 7348 ttys004    0:00.01 tmux

tmux の PID を確認

kill 7348

[terminated]

終了。と出て tmux の起動前のターミナルに戻った。わかりやすい。

シグナル

シグナルとは

kill -l で セットできる シグナルのリストが出る

kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL
 5) SIGTRAP  6) SIGABRT  7) SIGEMT   8) SIGFPE
 9) SIGKILL 10) SIGBUS  11) SIGSEGV 12) SIGSYS
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG
17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD
21) SIGTTIN 22) SIGTTOU 23) SIGIO   24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM   27) SIGPROF 28) SIGWINCH
29) SIGINFO 30) SIGUSR1 31) SIGUSR2

暗殺に使う道具的なイメージ。デフォルトは 15番の「ナイフとモップ」を使う

シグナル15 - TERM(INATE)、綺麗に終わらせる。

https://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/

デフォルトは 15 の SIGTERM ( Signal Terminate ) 、シグナル終了になっている

つまりさっきの

kill 7348 は kill -15 7348 や kill -SIGTERM 7348 と同じらしい。

試してみると両方 terminated になった。

しかしこれではパワーが弱く、殺しきれないプロセスがあるらしい。

確かに tmux 開いて殺してを続けていると

ps
  PID TTY           TIME CMD
57464 ttys000    0:00.05 /bin/bash -l
59816 ttys001    0:00.25 -bash
 7349 ttys002    0:00.02 -bash
 7719 ttys003    0:00.02 -bash
  777 ttys004    0:00.07 -bash
 7848 ttys005    0:00.03 -bash

よくわからない bash が増えているし、これは 15 番では殺せなかった。

より強いシグナルとして 9 番があるらしい。

しかし 9 は 15 の完全上位互換なわけではない。15 番はナイフとモップ、 殺した後の掃除までするので、使っていたリソースやロックファイルを掃除してから現場を離れる。

killコマンドが使用するデフォルトのシグナルであるSIGTERM(15)は、プログラムを終了する前に、アプリケーションごとに必要なクリーンアップ(終了処理)の処理を行ってから、自分自身でプロセスを終了します。クリーンアップでは、使っていたリソースの解放やロックファイルの削除などを行います。

山本 道子,大竹 龍史. Linux教科書 LinuCレベル1 スピードマスター問題集 Version10.0対応 (Japanese Edition) (Kindle Locations 958-961). Kindle Edition.

シグナル9 - KILL - 絶対殺すシグナル

Signal Kill、15 番がナイフとモップならこっちはショットガン。

これなら殺せそう。試しに下から2番目を殺してみる。

kill -9 777

[Process completed]

......... 今打ち込むところを殺してしまったのか.... 何も打ち込めない....

しかし 15番で殺せないプロセスを殺せた!!!

Terminal アプリを再起動。気を取り直して一番上にある 57464 を殺してみる

kill -9 57464

ps
  PID TTY           TIME CMD
59816 ttys001    0:00.25 -bash
 7349 ttys002    0:00.02 -bash
 7719 ttys003    0:00.02 -bash
 8042 ttys004    0:00.03 -bash
 7848 ttys005    0:00.03 -bash

消えてる!!!多重起動している bash が消せた!

おそらく下が新しいので、一番下以外は消せるのだろう。

ps
  PID TTY           TIME CMD
 8042 ttys004    0:00.04 -bash
 7848 ttys005    0:00.03 -bash
RYOs-MBP:~ kaede$ kill -9 8042

[Process completed]

また終わってしまった... ラスト2つは必要らしい。

しかしショットガンに例えたように万能なわけではなく、飛び散るのでクリーンアップがされない問題点がある。

killall - 系列プロセス皆殺し

killall tmux

[terminated]
ps
  PID TTY           TIME CMD
 8216 ttys000    0:00.02 -bash

killall だとtmux のなかで発動しても、プロセス ID ではなく、 プロセスの名前で殺すことができた。わかりやすい。

そしてその後は kill で殺した場合と違い、起動している bash が一つになった。なるべく killall で殺した方が良さそう。

tmux

ps
  PID TTY           TIME CMD
 8216 ttys000    0:00.06 -bash
 9191 ttys000    0:00.01 tmux
 9194 ttys001    0:00.02 -bash
kill 9191
[terminated]
kaede$ ps
  PID TTY           TIME CMD
 8216 ttys000    0:00.06 -bash
 9194 ttys001    0:00.02 -bash

こうして tmux を kill -15 で殺した場合だとまだ bash が生き残っている。

tmux は子プロセスとして bash を召喚しており、kill -15 だと 子供までは殺しきれない... と推測したが それは違った

親プロセス子プロセスについては次回以降で調べる必要がありそうだ...

yang.amp.i.kyoto-u.ac.jp

(起動コマンドが) 同じ名前だから tmux が動かした bash が殺されているようだ。

killall tmux

ps
  PID TTY           TIME CMD
 8216 ttys000    0:00.04 -bash

なのでちゃんと killall で kill すると、tmux が動かしていた bash も完全消滅する。

ps aux | grep tmux
USER               PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND 
kaede             9193   0.1  0.0  4327316   2420   ??  Ss    7:44AM   0:00.06 tmux
kaede             9619   0.0  0.0  4258892    212 s002  R+    7:56AM   0:00.00 grep tmux
kaede             9500   0.0  0.0  4289360   1352 s000  S+    7:56AM   0:00.01 tmux

aux と grep でしっかり見てみると、プロセスの開始が tmux によって始まっていると明記されているので、killall でまとめて殺されているようだ。

killall tmux
No matching processes belonging to you were found

ちなみに終わってるプロセスを指定するとちゃんとエラーが出る。

まとめ

https://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/

シグナルはたくさんあるけど、この記事が kill と killall の紹介だけでしめているからよしとする

kill YourProcessID が kill -15 YourProcessID と同じで、指定した一つのプロセスを殺す。掃除もする。

kill -9 YourProcessID が 絶対殺すコマンドで、15 番で殺せないプロセスも殺せる

killall StartedCommandOfYourProcess が プロセスを起動したコマンド名で動いた プロセスを全部殺すコマンド。

シグナルを打つほかの動作

https://www.atmarkit.co.jp/ait/spv/1708/04/news015.html

この記事が分かりやすかった。

nohup が付けられてないジョブでなければ

SIG-HUPで止まる。ctrl c でうてる

SIG-TSTP は ctrl z の 一時停止。 Temporally Stop (多分)

で kill 以外でもシグナルをうてる。

Docker 停止中 or 稼働中の Ubuntu コンテナの Bash に入る - docker start attach

why

Docker で Ubuntu をプロセス関連の学習のために動かしたかった

kei-s-lifehack.hatenablog.com

コンテナのリスト表示

docker ps または docker container ls

で起動中のコンテナのリストを表示できる。

docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5a8638528c62        ubuntu              "/bin/bash"              21 hours ago        Up 21 hours                                  goofy_mclaren
84a68690ab25        adminer             "entrypoint.sh docke…"   5 months ago        Up 2 weeks          0.0.0.0:8080->8080/tcp   docker-mysql_adminer_1
632563fd4842        mysql               "docker-entrypoint.s…"   5 months ago        Up 2 weeks          3306/tcp, 33060/tcp      docker-mysql_db_1

Ubuntu と adminer, mysql のコンテナが動いていることを確認

動いているコンテナの bash に入る

docker attach YourContainerID

で起動させた状態のコンテナの bash に入れる

実際に売ってみる

docker container attach 5a8638528c62
root@5a8638528c62:/#

コンテナ ID 5a8638528c62bash に入れた

コンテナを止める

exit で bash から離れるとコンテナは停止する

docker ps -a でみると止まっている。

停止しているコンテナを動かす - docker start

docker start YourContainerID で停止しているコンテナが動かせる

docker ps -a | grep ub
5a8638528c62        ubuntu                           "/bin/bash"              21 hours ago        Exited (0) 35 seconds ago                            goofy_mclaren
6063ce36303c        ubuntu                           "/bin/bash"              22 hours ago        Exited (0) 22 hours ago                              gallant_easley
10075622af77        ubuntu                           "bash"                   6 months ago        Exited (0) 6 months ago                              elegant_euler

docker ps -a で止まっているコンテナをリスト表示して

docker start 5a8638528c62
5a8638528c62

docker start で任意のコンテナを 裏で動かす

これで確認すると

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5a8638528c62        ubuntu              "/bin/bash"              21 hours ago        Up 7 seconds                                 goofy_mclaren
84a68690ab25        adminer             "entrypoint.sh docke…"   5 months ago        Up 2 weeks          0.0.0.0:8080->8080/tcp   docker-mysql_adminer_1
632563fd4842        mysql               "docker-entrypoint.s…"   5 months ago        Up 2 weeks          3306/tcp, 33060/tcp      docker-mysql_db_1

ID 5a8638528c62 の ubuntu が動いている

これで、先ほどのように attach で入れる

まとめ

Docker で Ubuntu Bash を使うときは

docker ps -a

で現在動いているコンテナを表示し、使いたいコンテナが動いていたら

docker attach YourContainerID

でそのコンテナの bash に入り、作業する

使いたいコンテナが動いていない場合は

docker ps 

で止まっているコンテナを表示し、使いたいコンテナがあったら

docker start YourContainerID

でそのコンテナを動いている状態にして

docker attach YourContainerID

で動いているコンテナに入り、bash で作業する

実践

docker start 5a8638528c62
5a8638528c62
RYOs-MBP:~ kaede$ docker attach 5a8638528c62
root@5a8638528c62:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@5a8638528c62:/# touch 0408.txt 
root@5a8638528c62:/# ls
0408.txt  bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@5a8638528c62:/# exit
exit
RYOs-MBP:~ kaede$ docker start 5a8638528c62
5a8638528c62
RYOs-MBP:~ kaede$ docker attach 5a8638528c62
root@5a8638528c62:/# ls
0408.txt  bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@5a8638528c62:/# exit

5a86 の停止しているコンテナを動かし、

インして

0408.txt を作り

出て

再び 5a86 の停止しているコンテナを動かし

インして

0408.txt が残っているのを確認した

Docker Ubuntu 復習 - docker run と exec で新しいコンテナを動かす

参考

過去の自分の記事

kei-s-lifehack.hatenablog.com

ファイルとイメージとコンテナってなんだっけ?

hacknote.jp

Dockerfile から Docker Image を作成してそれを走らせると Docker Container になる

プログラムを走らせるとプロセスになる感じか...?

イメージが残っているか確認

docker images

ubuntu latest adafef2e596e 9 months ago 73.9MB

9 ヶ月前に起動した ubuntu のが残っていた

他にもたくさんある

コンテナが残っているか確認

docker ps
CONTAINER ID  IMAGE   COMMAND                CREATED      STATUS     PORTS                  NAMES
84a68690ab25  adminer "entrypoint.sh docke…" 5 months ago Up 13 days 0.0.0.0:8080->8080/tcp docker-mysql_adminer_1
632563fd4842  mysql   "docker-entrypoint.s…" 5 months ago Up 13 days 3306/tcp, 33060/tcp    docker-mysql_db_1

docker ps で確認すると mysql と adminer があった。

確かこれは動いてるコンテナだったはず...

docker ps -a
CONTAINER ID IMAGE   COMMAND                CREATED      STATUS                  PORTS                  NAMES 5e8f213f6a6f        postgres:latest                  "docker-entrypoint.s…"   4 months ago        Exited (255) 2 weeks ago    0.0.0.0:5432->5432/tcp   introductiontoblitz_db_1
84a68690ab25 adminer "entrypoint.sh docke…" 5 months ago Up 13 days              0.0.0.0:8080->8080/tcp docker-mysql_adminer_1
632563fd4842 mysql   "docker-entrypoint.s…" 5 months ago Up 13 days              3306/tcp, 33060/tcp    docker-mysql_db_1
10075622af77 ubuntu  "bash"                 6 months ago Exited (0) 6 months ago                        elegant_euler

-a をつけて確認すると止まってるコンテナも見えた。

全部は載せないが、 mysql, adminer, それから ubuntu がいた。

コンテナが既にあればイメージは必要ない。

この ubuntu コンテナに再度 in したい

docker run -it でコンテナを動かす

docker run コンテナ名 だけではダメで、引数が必要

qiita.com

-i が inter-active, 相互的。つまりこちらからも入力ができるようになる

-t が tty, 端末。これがないと bash が開けない。

--rm をつけると終わった後にコンテナが消滅する。一時的な利用のインスタンスの場合は

docker ps -a | grep ubuntu
10075622af77        ubuntu                           "bash"                   6 months ago        Exited (0) 6 months ago                              elegant_euler

起動していない ubuntu の コンテナがあるのを確認

新しく run --rm でコンテナインスタンスを作る

docker run -it --rm ubuntu
root@d10ba802160b:/# 

新しいコンテナがイメージから作成されてインした。

touch testFile0407.text

vi はないので touch で今日の日付のファイルを作成

exit
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
84a68690ab25        adminer             "entrypoint.sh docke…"   5 months ago        Up 13 days          0.0.0.0:8080->8080/tcp   docker-mysql_adminer_1
632563fd4842        mysql               "docker-entrypoint.s…"   5 months ago        Up 13 days          3306/tcp, 33060/tcp      docker-mysql_db_1

docker ps をするとちゃんと --rm が効いているのか消えている。

今度は --rm なしでうごかす

新しくコンテナを作る

docker run -it ubuntu
root@6063ce36303c:/# ls
exit
docker ps -a | grep ubuntu
6063ce36303c        ubuntu                           "/bin/bash"              56 seconds ago      Exited (0) 17 seconds ago                            gallant_easley
10075622af77        ubuntu                           "bash"                   6 months ago        Exited (0) 6 months ago                              elegant_euler

今回はさっき作った ubuntu が残っている

しかし docker ps では出なかった。--rm をつけなくても、Ubuntu コンテナから exit すると停止するということらしい。 サービスじゃなくてシェルなんだからそれはそうか。

run -d で裏で新しくコンテナを立ち上げる

docker run -dit ubuntu
5a8638528c62a9e935517a9060bbd27fa143dea90bc1c296cf9e435b484a6832

-d を追加して実行すると裏で動くので、コンテナ ID だけが表示される。

稼働中のコンテナリストを見てみると

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5a8638528c62        ubuntu              "/bin/bash"              26 seconds ago      Up 26 seconds                                goofy_mclaren
84a68690ab25        adminer             "entrypoint.sh docke…"   5 months ago        Up 13 days          0.0.0.0:8080->8080/tcp   docker-mysql_adminer_1
632563fd4842        mysql               "docker-entrypoint.s…"   5 months ago        Up 13 days          3306/tcp, 33060/tcp      docker-mysql_db_1

ubuntu が稼働中になっているのが確認できる

この状態なら exec で入れる。

これも新しくコンテナを作る操作なので、既にある停止中のコンテナを再稼働させルことはできない。そちらは後で調べる


docker exec -it YourContainerID YourCmd で動いているコンテナを使う

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

www.memotansu.jp

docker exec は動いているコンテナでコマンドを実行したり、そのコンテナに入るコマンド。

-d で裏で起動させたコンテナにインしてみる

docker exec -it 5a8638528c62 ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr

コンテナの指定は ubuntu ではダメだった。あれはイメージの名前だからだろう。 コンテナ ID を指定しなければならない。

これで指定した稼働中のコンテナでコマンドが実行できた。

この ls を bash にすれば

docker exec -it 5a8638528c62 bash
root@5a8638528c62:/# 
````

稼働中 (running) のコンテナの bash に入ることができた。

## これから

辿り着いたのはイメージから新しく立ち上げるコマンドばかりで、既存の停止したコンテナを再稼働させるやり方がわかってないのでそれをまとめる。

CSS Animation で Loading Animation を作る

why

モンハンの Loading... が流れているのを作っている夢を見た

2ndG で遊んでいただけのあの頃とは違い、今なら作れるはず

pure な HTML CSS っていうのもやってみたかった

アニメーションってどうやるんだっけ?

www.w3schools.com

www.w3schools.com

調べると w3schools がヒットした

わかりやすそうなサンプルを書き出す

html は単に div だけ className もつけずにおき、対応する CSS で div に

div {
  width: 100px;
  height: 100px;
  background-color: red;
  position: relative;
  animation-name: example;
  animation-duration: 4s;
}

width, height をつけて色をつけてわかりやすい四角にしたした後

置き方を 相対的にして、

animation-name をつけて動く時間を指定して

@keyframes example {
  0%   {background-color:red; left:0px; top:0px;}
  25%  {background-color:yellow; left:200px; top:0px;}
  50%  {background-color:blue; left:200px; top:200px;}
  75%  {background-color:green; left:0px; top:200px;}
  100% {background-color:red; left:0px; top:0px;}
}

つけたアニメーション用の名前に対して @keyframe で

設定された時間に対して

0% の時の 色と x 座標 y 座標

25% の時の色と x 座標 y 座標...

と、いう風に書いていく。そうすると動く

https://kaede0902.github.io/css/animation/squareMove/

とりあえず簡単に動かすことはできた

理想のモンハン Loading のために足りないものたち

Loading 中だからずっと動かしたい

1文字1文字が画面の左から出てきて画面外に飛んでいくようにしたい

四角を動かしたいわけではなく、文字を装飾して動かしたい

Loading っぽく、頑張って読み込んでる感を出したい。慣性?

www.w3schools.com

animation-delay を入れると頑張って動いてる感が出るのは良さそう

www.w3schools.com

animation-iteration-count を使うと任意の回数繰り返せる。infinite だと無限に動く

www.w3schools.com

ease では slow start や slow end を実現できるが、 ゆっくり始まって素早く流れていくのは実装できない。

速度は諦めるか

実際に作る

* {
  background: black;
  color: white;
}
div {
  width: 100px;
  height: 100px;
  background-color: black;
  color: white;
  position: relative;

  animation-name: loading;
  animation-duration: 5s;
  animation-delay : 2s;
  animation-iteration-count : infinite;
}
@keyframes loading {
  0%    {left:0px; top:500px;}
  25%   {left:100px; top:500px;}
  50%   {left:200px; top:500px;}
  75%  {left:300px; top:500px;}
  100%  {left:400px; top:500px;}
}

スマフォでも高さは 800px 位あると仮定して y 座標は 500でやる

6 段階で位置調整して作った

1文字ずつ動かしたり、飛ぶように画面外に出ていくのは今度追加する

kaede0902.github.io

とにかく作れた!!!

起きてから 1h10m で作れたw

今後思いついたものは即座に作れるようになりたいw

Linuc 101 Linux コマンド -- ps aux と ps -e -u -l -f -eu -- プロセスの詳細表示

前提

WSL で試した。

ps

qiita.com

uxmilk.jp

ProcesS 、プロセスを表示するコマンド

引数におなじみの UNIX 方式のつけかたと、見慣れない? BSD 方式がある。

ps
  PID TTY          TIME CMD
  125 tty1     00:00:00 init
  126 tty1     00:00:00 bash
  220 tty1     00:00:00 ps

単発で打つと簡素に プロセス ID 、実行消費時間(後述) 、実行コマンド、 を表示する。

BSD の引数 aux

ハイフンをつけないで連続で付け足していく方式。

ps a, ps u, ps x, があり、合成して使うときは ps au, ps ux, と連続でならべる

aux が最強。

しかし後述の UNIX 方式の方が情報が多い。ので実は aux は最強ではない

ps a - ALL 、全て!ではなく状態を追加表示

プロセスリーダーを除く全てのプロセスを表示する。

ps a
  PID TTY      STAT   TIME COMMAND
  125 tty1     Ss     0:00 /init
  126 tty1     S      0:00 -bash
  221 tty1     R      0:00 ps a

ここでは表示されているものは増えていないが、 STAT ( Status) 、つまりプロセスの「状態」も表示されるようになった。

qiita.com

S - Sleeping が割り込み可能な待ち状態

R - Runing Enabled が実行可能なプロセス

s - session leader セッションのリーダー。root user でしか実行できないらしい?

ps u - ユーザー...だけじゃなくたくさんの情報を追加表示!

linuxhint.com

ps u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       125  0.0  0.0   8940   228 tty1     Ss   20:21   0:00 /init
root       126  0.0  0.0  18080  3580 tty1     S    20:21   0:00 -bash
root       222  0.0  0.0  18648  1892 tty1     R    22:30   0:00 ps u
  • USER: 各プロセスの実行ユーザー
  • PID: プロセスの ID
  • %CPU: CPU の稼働率
  • %MEM: プロセスが使っているメモリの%
  • VSZ: Virtual SiZe: 仮想領域のサイズ
  • RSS: Real procesS Size: 物理領域のサイズ、略す前が違うかも
  • TTY: TelTYpe: プロセスが動いているターミナル
  • STAT: STATe: プロセスの状態。後述
  • START: プロセスが始まった時間
  • TIME: プログラムがプロセスを占有した時間?
  • CMMAND: そのプロセスを発動したコマンド

を追加表示する。ユーザーだけじゃないんかい!

ps x - デーモン、隠されたプロセスも表示

デーモン、つまり動いてるプロセスを表示する

ps x
  PID TTY      STAT   TIME COMMAND
    1 ?        Ssl    0:00 /init
  125 tty1     Ss     0:00 /init
  126 tty1     S      0:00 -bash
  223 tty1     R      0:00 ps x

PID 1 の 本当の最初に実行されるプロセスも追加で表示された。

PID 125 がスマブラのラスボスだとすると、隠された本当のラスボス的な?

仮想端末ファイルは不明、ステータスは Stopped session leader にさらに No.1 がついている。端末ナンバーワンプロセス。

ps aux - 状態もユーザーその他もデーモンも全部出す!

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   8940   316 ?        Ssl  Apr03   0:00 /init
root       125  0.0  0.0   8940   228 tty1     Ss   20:21   0:00 /init
root       126  0.0  0.0  18080  3580 tty1     S    20:21   0:00 -bash
root       224  0.0  0.0  18648  1888 tty1     R    22:39   0:00 ps aux

ステータス、ユーザーその他、本当に最初のプロセス、 をすべて出せる最強のコマンド!!!

ps aux | grep bash

grep YourString とのパイプ。

root       126  0.0  0.0  18080  3580 tty1     S    20:21   0:00 -bash
root       230  0.0  0.0  16208  1284 tty1     S    22:43   0:00 grep --color=auto bash

bash と入っているプロセスのみを実行できる。 検索しているときにその文字列がはいる以上、どうしても検索するために打ったコマンドも 結果にでてきてしまうのはしょうがなさそう。

なお aux では万全ではなく、より詳細な情報を表示するためには UNIX option が必要となる。


UNIX の引数 ps -e -u -l -f -eu

blue-red.ddo.jp

ここによると -e, -ef, -ely, があるらしい

人気がないので全然情報がなかった。

www.oreilly.com

オライリーLinux ポケットガイドの試供品?で公開されていた

www.techonthenet.com

こちらは Docker for Mac で試す

ps 引数なし

  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   42 pts/0    00:00:00 ps

そもそも引数をつけない ps の結果がこう。bash しかない

ps -e , プロセスリーダーのデーモンも表示

全てのプロセスを表示する。プロセスリーダーを除くとの注釈がないので、 プロセスリーダーも表示するのが、BSD の ps a との違い。

init プロセスがある WSL で試すと

 ps a
  PID TTY      STAT   TIME COMMAND
    7 tty1     Ss     0:00 /init
    8 tty1     S      0:00 -bash
  101 tty1     R      0:00 ps a

ps -e
  PID TTY          TIME CMD
    1 ?        00:00:00 init
    7 tty1     00:00:00 init
    8 tty1     00:00:00 bash
  102 tty1     00:00:00 ps

ps -e は ps -ax と同じで pid 1 のデーモンも表示されると推測。

ps -u -- USER, CPU, VSZ, その他のたくさんの情報を表示

ps -ux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   4108  3464 pts/0    Ss   Apr09   0:00 /bin/bash
root        43  0.0  0.1   5880  2920 pts/0    R+   19:58   0:00 ps -ux

BSD 引数の ps u と同じ。user その他の多くの情報を表示する

eng-entrance.com

引数で user 指定ができるらしい。複数ユーザーがある端末で要検証。

ps -l , LONG LISTING -- F, S, NI, PRI などをたくさん表示

ps -l  
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0     1     0  0  80   0 -  1027 -      pts/0    00:00:00 bash
0 R     0    30     1  0  80   0 -  1450 -      pts/0    00:00:00 ps

F と S 、PPID 、NI、... などと詳しく出るが大半がわからなかった

  • PPID: Parent Process ID、そのプロセスを作ったプロセスの ID

www.tecmint.com

  • NI: Nice 値。ユーザースペースでの優先度。
  • PRI: Priority. カーネルで見られる実際の優先度。

以下不明、いずれ調べる。

  • ADDR: アドレスかな?不明
  • UID: ユニーク ID かな?唯一の ID ならなぜ 0?
  • F
  • S
  • C
  • SZ
  • WCHAN: わかなちゃん??

ps -f, FULL LIST - UserID, PPID, C, STIME, も表示。短め

フルでリスト表示できるらしい。-u の方が多いのに何がフルなのか...

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Apr09 pts/0    00:00:00 /bin/bash
root        31     1  0 12:04 pts/0    00:00:00 ps -f

C, STIME, が出る

Stime は がプロセスの起動時間、Started Time だと推測。

C は不明

-ly, LONG LIST から F がなくなるやつ

 ps -ly
S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S     0     1     0  0  80   0  3464  1027 -      pts/0    00:00:00 bash
R     0    35     1  0  80   0  1088  1450 -      pts/0    00:00:00 ps

-ly か -ely でしか使えない。-y はできない

-el と比べて F のカラムが抜けている。

ps -eu, 実行コマンドをパス付きで表示

ps -eu
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   4108  3464 pts/0    Ss   Apr09   0:00 /bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOST
root        68  0.0  0.1   5880  2812 pts/0    R+   20:32   0:00 ps -eu HOSTNAME=5a8638528c62 PWD=/ HOME=/root LS_COLORS=rs=0:di=01;34:ln=01;36:m

-e と -u を合成した結果ではなさそう。実行コマンドが実行環境のパスつきで出る。

まとめ

UNIX option ではわからないことが多い。

しかし BSD ではわからなかった PPID, NI, STIME, UID, などの情報もでるので、 ps aux だけじゃなくて こちらの -e, -u, -l , -f, -eu, も使えたら強そう。


Docker で init プロセスが見つからない問題

ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   4108  3460 pts/0    Ss   Apr09   0:00 /bin/bash
root        25  0.0  0.1   5880  2900 pts/0    R+   12:00   0:00 ps aux

init プロセスがないので練習には不適なのだろうか?

そもそもどう普通のと違うのか要検証

X server での場合

一番プレーンな状態になるはず

未確認