Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

Dockerのコマンド体系がわかりにく過ぎる

f:id:fa11enprince:20200408042801p:plain Docker自体は素晴らしいアプリケーションで、作っていただいている方、メンテナンスをされている方に畏敬の念を禁じえません。
CLIのフロントエンド、コマンド体系が理解するのが難しいと言わざるを得ません。理由としては、一見よく使うコマンドの対称性がないために、Dockerのライフサイクルとのイメージが慣れるまでズレてしまい、マッピングがよくわからずとっつきにくい印象を与えてしまうと思われるのです。
これはおそらく私だけではないはず。説明するときに毎度苦労します。
dokcer execdocker runって似ているけど何が違うの?とかdocker startもあるし、まぎらわしくない?とか、docker rmとかよくわからない…となると思います。
同様のことはGitにもあると思っています。
dockerの新体系のコマンドもありますが、こちらでは紹介しません。(一貫性がやや出てきたものの…)そもそもタイプ量が増えていやです。 ここでは旧体系のコマンドで記載します。

Dockerのライフサイクル

まず、Dockerのライフサイクルですが、この図が最小限の重要なところを表しています
f:id:fa11enprince:20200408034301p:plain

Dockerのコマンド体系

異論はあると思いますが、上図にマッピングするとこんな感じです

dockerの実際のコマンド 用途 備考
docker create image . docker build . Dockerイメージを作成 | cdして Dockerfileのあるディレクトリで使用
docker create [イメージ名] --name [プロセス名] Dockerイメージからコンテナを作成 複合コマンドrunがあるので使わないが、概念上知る必要がある
docker start [コンテナ名] Dockerコンテナからプロセスを開始状態にする 複合コマンドrunがあるので使わないが、概念上知る必要がある
docker run [コンテナ名] --name [プロセス名] Dockerイメージからコンテナを作成しプロセスを開始状態にする このコマンドが最難関(後述)
docker stop [プロセス名] プロセスを終了状態にする
docker rm [コンテナ名] Dockerコンテナを破棄する
docker rmi [イメージ名] Dockerイメージを破棄する

docker runについてですが、サーバ起動の場合(例: Express, Flaskの場合) docker run -itd --rm [コンテナ名] --name [プロセス名]のように使います。 単発起動の場合は docker run -it --rm [container name] --name [プロセス名] のように使います(通常は、DockerfileのCMDで指定されているものを実行したい場合が多いと思うが、lessとか使いたい場合はコマンドも指定できる)。さらに実質これを使うときは-p(ポートを外部にさらす)や-v(マウント)のオプションも必要になるケースが多いと思います。 あと、とっつきにくい点があるとすればdocker run時のオプション順を間違えるとエラーになってしまう点でしょうか。

番外編

Docker execいつ使うの?

docker exec -it [container name] /bin/bash[/bin/sh] の形でほぼ使い、バックグラウンドで動きっぱなしのコンテナの中に入る場合に使う
というか、バックグラウンド起動している場合以外中に入る必要性がほぼない。
これもdocker in [container name] [shell]とか作ればいいのにとか思う。

docker attachはまず使わないので無視してOK

あとはprocess確認系のコマンドも必須で覚える事項ですが、 これだけ覚えてしまえばdocker-composeとかもほぼ一緒なので実は大して覚えることがないはず。

JavaScriptで使えるグラフ描画ライブラリとその有効活用例について

f:id:fa11enprince:20200327025625j:plain ふとニュースなどをみていて、新型コロナウィルスの感染状況のグラフのサイトを見つけて、お、綺麗だしシンプルでいいなと思ったのがここ。
よくある質問の部分も、一見、グラフを眺めていて、ん???と思う疑問点が書かれてあって良い。

「具体的な基準はMITライセンスに準拠します」とさらりと書いてあるだけなのがクール。もちろんGitHubへのリンクもあります。 これ厳密に従うとちょっと面倒なんですよね。とはいえ、数あるライセンスの中でも緩い縛りのMITライセンス。
単なるリンクまたはiframeであれば著作権表示はいらないのですが、せっかくなのでスクリーンショットを拝借しました。
ということで厳密に対応してみました。ただ、ライセンスファイルはブログの関係上置けないので、貼り付けました。 f:id:fa11enprince:20200327031353p:plain https://github.com/kaz-ogiwara/covid19/

MIT License

Copyright (c) 2020 Kazuki OGIWARA / 荻原 和樹

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

一応これは何だっていうのを解説しておくと要はMITの場合

  • このソフトウェアを誰でも無償で無制限に扱って良い。ただし、著作権表示および本許諾表示をソフトウェアのすべての複製または重要な部分に記載しなければならない。
  • 作者または著作権者は、ソフトウェアに関してなんら責任を負わない。

という2点が大事です。

本題とはそれますが、こういうのって、いかにデータを集めるかというのが大変ですよね・・・。

Chart.jsいいなと思って、ふとグラフ描画ライブラリって何がいいんだろうなーとふと思いました。 自分が使ったことあるのはPlotly.js。d3.jsを拡張していてインタラクティブで綺麗で、きめ細かい設定が簡単にできて仕事で使ってました。 PythonでもJavaScriptでも使えるし。 が、このChart.jsもいいなと。あと有償ですが有名どころだとHighcharts.jsもありますよね。

代表的なグラフライブラリのリンク

https://www.chartjs.org/
https://plotly.com/javascript/
https://www.highcharts.com/

比較

https://tech.willgate.co.jp/entry/2018/03/20/141000
https://www.npmtrends.com/chart.js-vs-highcharts-vs-plotly.js-vs-taucharts
Chart.js強いなーという感じです。

僕はPlotly.js推しです(というかそれしか使ったことない)。 リファレンスもまぁまぁ充実しているし、細かいことをやろうと思うと、ソースコードを読めば、 あ、これも設定できるんだとわかるし。よかったです。 あれなんですよね。等高線(コンター)図で綺麗なのを描きたかったり、場合によっては3Dにしたいなと思ったので…前回はそれを選んだのかな。 でも、周りでChart.jsのこともよく聞くので、今度使ってみようかなと思いました。

VSCodeでPython3開発環境構築

f:id:fa11enprince:20200211214101j:plain

WindowsでVSCodeとAnaconda3(Python3)で開発環境を整えることにしました。
目標は次の通りです。

  • VSCode上で関数の定義へのジャンプや参照、コード補完ができる
  • docstring(JavaでいうJavadoc)が楽にかける
  • テストのカバレッジ取得及び通ったコードパスが視覚的にわかる

あと、開発環境と違うけれど…

  • loggerの使い方例
  • ソースコードの構成例

を一緒にまとめて置いておきました。
この例では極小の意味のないアプリケーションですが、MongoDBを使うサンプルになっています。 ここに書いてある
requirements.txtによる方法は既に古いらしいので別の方法にしたほうがいいそうです。

補足事項

Pythonの環境切替

この記事のようにAnaconda2 ,3の両方を入れている場合、VSCodeのこの部分から変更ができる
f:id:fa11enprince:20200211215021p:plain
Python 3.7,4 64-bitってところが実はクリックできて、ここで切り替え可能です。

カバレッジのコードハイライト

Coverage Gutters - Visual Studio Marketplace ここのアニメーションの通りなのですが、先ほどと同様に下部のWatch/Remove watchから表示切替ができます。

単体テスト実行について

基本的に該当のフォルダに移動して(PYTHONPATH/モジュール検索パスが通っているところ)で unittest
python -m unitest discoverとやっていたところを
coverage run -m unitest discoverとやればOKです。
ただしunittest前提です。pytestを使っている場合は別の方法になります。

pushd app1\test
coverage run -m unittest discover && coverage xml
popd

discoverってなんだ?と思ったらTestLoader.discover()を呼び出しているそうです。

Windowsを英語化

f:id:fa11enprince:20200131025725j:plain Windowsを英語化してみました。
まだ2日しかたってないですが今のところトラブルなし。
Explorerで最初の一文字目をキーボードで打ってフォーカスがあてられるように
DocumentとかPicturesとか英語のままがよかったので、
英語版にしました。もちろんそこだけ設定いじって英語化する方法もなくはないけど、
Windows Updateのたびに戻されるのは嫌なので、このほうがいいと思い思い切ってWindowsを英語化。
ちなみにトラブルシューティングの際、英語メッセージだとより問題に近づきやすいのでググラビリティも高まるはず!
特に問題は起きてないです。
以前Macも途中から英語化したけどその時はESETでインストールしなおし問題があったよーな…。

参考にさせてもらったところ

に従って英語化
大体これですべて英語になる

設定方法

設定 > 言語
英語を追加し、言語パックをインストール
英語のオプションで  キーボードの追加で日本語を追加してUSのキーボードを消す IMEの関係上、日本語 > 英語の順のまま

Windows表示言語
English(United States)
に変更 Explorerとかはこれで英語になります

アプリ毎の変更

あとはアプリごとに切替が必要です。 Macだと一気に全部英語になりますがWindowsは個別です。 それがいいのか悪いのかは、設計思想だと思うんです。
Windows歴が長いせいもあり、この辺はWindowsのほうが良いのではないかなと…
(変更がめんどくさいけど)

アプリ ざっくり設定方法
Chrome 英語のまま→日本語翻訳を使いたい場合、日本語のままが良い
Firefox 設定 > 一般 > 代替言語 > 英語の追加
Thunderbird オプション > 詳細から英語化
WinMerge オプションから英語に切替
Kindle 言語を切り替えから英語
Evernote オプションから言語を切り替え
Eclipse そもそも英語のままで日本語化してない
Visual Studio Code そもそも英語のままで日本語化してない
ConEmu そもそも英語のままで日本語化してない
WinSCP 英語に切り替わってる
HeidiSQL 英語に切り替わってる
サクラエディタ 日本語のまま(dllを置くと英語になるらしい)
rlogin そもそも英語に対応してないっぽい?のでそのまま
LINE 日本語のまま
ESET 日本語のまま

Googleを英語化した状態で英語を含む他言語を右クリックで日本語にする設定は少し難易度が高かった。
なぜかデフォルトはポルトガル語になっていました。
設定を変えたあと、翻訳のポップアップが出てきたときにいろいろ選ぶとうまくいきます。
(正直ブラウザは日本語設定のままでもいいのかも)
いろいろいじくっていたら二重翻訳とかたまたまできてしまった(日本語→英語→日本語)。

余談

そういやコマンドプロンプトとかそのまま英語になる

> ls
'ls' is not recognized as an internal or external command,
operable program or batch file.

素敵。やったね

Chromeの翻訳について

英語をデフォルトにしたときに英語ページで日本語に翻訳というのは無理っぽい。
ユースケース的に基本的にあり得ないので仕方ない気もするのだが、
そもそもこの辺りをすべて制御できるようなUIにはなっておらず、
ちゃんと設定するには一度、
「母国語以外のページツールで翻訳ツールを表示する」を選択し
母国語(設定言語)以外になっているページを表示すると、
翻訳ツールにどの言語からどの言語に翻訳するかが現れるので
「英語」→「日本語」を選択する。
こうすると、任意の言語から任意の言語へ翻訳できる。
そのあと、「母国語以外のページツールで翻訳ツールを表示する」を解除するとよい。
しかし、改めてよくわからない設定…という感じだ。
この辺りはこのページが詳しい。