JS ゲーム製作 -- box-intersect で四角形同士の衝突を検知したいが想像通りの挙動にならない
why
この記事を Twitter で見た。
衝突判定ライブラリなんてあるんだ、触ってみようかなって思った
box-intersect
box-intersect とは?
D 次元や N と M ボックスでそれぞれの交差を見つけるライブラリ。
O((n+m) log^d(n+m))
という式を使ってメモリの余分な割り当てを防ぐ
ベンチマークが高いらしい。重くなりにくいってことですね!
詳しい数式の話は全くわからない..
丸ごとのゲーム画面ライブラリではなくて、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
- 衝突判定になっている四角形の総数
を出力するコードだと推測する。
実際に書いてみる
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つ
になった。図示してみる
これで実際に交差判定になっているのは
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
全然当たってない 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 はこのライブラリでは交差してると扱われるよー
って注釈があった。
もしかして、角と角で当たってないと衝突にならないのでは?
こうやって既に入っているのは衝突では無いのでは?
角で当てて試してみる
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 で当てても、接触位置と接触四角数はおかしいが、
接触している四角形のリストだけは想定通りに出ているのがわかった、これなら使えるかもしれない。
しかし最初に作ったこの四角形では青の一番小さい四角形が接触になっていない...
Canvas でシュミレーターでも作って試してみるか...
Linuc 101 Linux コマンド -- job ( -l, -s , -r ) , bg, fg -- ジョブの発動と停止と表示と裏表管理
job とは
ターミナルで実行中の fore-ground または back-ground での動作のこと
通常のブラウザなどが中心の生活では使うことはなく、普段は動いていないと思う
sleep を表で動かして一時停止して jobs で見てみる
この記事を参考に 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 だと 子供までは殺しきれない... と推測したが それは違った
親プロセス子プロセスについては次回以降で調べる必要がありそうだ...
(起動コマンドが) 同じ名前だから 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 をプロセス関連の学習のために動かしたかった
コンテナのリスト表示
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 5a8638528c62
の bash に入れた
コンテナを止める
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 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 で新しいコンテナを動かす
参考
過去の自分の記事
ファイルとイメージとコンテナってなんだっけ?
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 コンテナ名 だけではダメで、引数が必要
-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...]
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 っていうのもやってみたかった
アニメーションってどうやるんだっけ?
調べると 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 っぽく、頑張って読み込んでる感を出したい。慣性?
animation-delay を入れると頑張って動いてる感が出るのは良さそう
animation-iteration-count を使うと任意の回数繰り返せる。infinite だと無限に動く
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文字ずつ動かしたり、飛ぶように画面外に出ていくのは今度追加する
とにかく作れた!!!
起きてから 1h10m で作れたw
今後思いついたものは即座に作れるようになりたいw
Linuc 101 Linux コマンド -- ps aux と ps -e -u -l -f -eu -- プロセスの詳細表示
前提
WSL で試した。
ps
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) 、つまりプロセスの「状態」も表示されるようになった。
S - Sleeping が割り込み可能な待ち状態
R - Runing Enabled が実行可能なプロセス
s - session leader セッションのリーダー。root user でしか実行できないらしい?
ps u - ユーザー...だけじゃなくたくさんの情報を追加表示!
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
ここによると -e, -ef, -ely, があるらしい
人気がないので全然情報がなかった。
オライリーの Linux ポケットガイドの試供品?で公開されていた
こちらは 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 その他の多くの情報を表示する
引数で 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
- 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 での場合
一番プレーンな状態になるはず
未確認