Docker/Kubernetes 実践コンテナ開発入門を読んでいる(-p70)

とりあえずDockerってなあに?のところまで読んだ。(p70)

初めてのDocker

Dockerイメージ

Dockerコンテナのテンプレ 環境に色々準備の定義をまとめたやつ的な 「centosのイメージにapacheとwebアプリ入れてwebアプリ起動するぞ」ここまでをまとめたやつみたいな

Dockerfile

  • COPY
    • ローカルマシンからDockerイメージへのコピー
  • RUN
    • Dockerイメージ作成のために実行したいコマンド
  • CMD
    • Dockerコンテナ起動時に実行したいコマンド
  • ENTRYPOINT
    • Dockerコンテナ起動時に実行したいコマンドの起点
      • 起動時にCMDを上書きするとENTRYPOINTの引数を起動時に指定できる

docker image

  • docker image build
    • DockerfileからDockerイメージを作成
  • docker image tag

Docker Hub

Dockerイメージを置いとけるリポジトリ CLIでイメージをpullしたりpushしたりできる Dockerレジストリの一つ

Dockerコンテナ

Dockerイメージから作成された実際の仮想環境

docker container run

  • 実行時にCMDを上書きできる
  • --nameで名前つけられる
    • 名前で停止できる

オプション

  • --rm
    • コンテナ停止時にコンテナを破棄
  • -i
    • 起動後のコンテナを標準入力とつなぐ
-iのイメージ
$ echo '{"version":1.0}' | docker container run -i --rm gihyodocker/jq:1.5 '.version'   

containerで起動したjqが入力のechoを受け取る

ポートフォワーディング

ローカルの特定のポートをdockerコンテナで開いてるポートにつなぐ

docker container logs

コンテナの標準出力を表示する

オプション

  • -f
    • 出しっぱ

docker container exec

コンテナ内でコマンド実行

docker containr exec -it sh

で、コンテナに入って直接操作できる。

docker container copy

コンテナ間/コンテナ・ホスト間でファイルをコピーできる

docker container prune

不要なコンテナを破棄

docker image prune

不要なイメージを破棄

docker system prune

使ってないコンテナ/イメージ/ボリューム/ネットワークを削除

// TODO ボリュームとネットワークてなんだろ

docker container stats

コンテナ内のシステムリソース確認

8月にやったこと

なんか自分がなんの勉強してるのかがとっちらかってるのとふわっとやめてるやつが結構あるので整理がてらまとめてみる。

やったこと

A Tour of Go

Goのチュートリアル的なやつ。

A Tour of Go

同僚がGoやってて楽しそうだったのでやってみようと思ってやってみた。

感想

  • 俺がまともにわかるのがJavaだけで、いかに言語をJava中心に考えてるのかがわかった
  • A Tour of Goの立ち位置がよくわからん
    • いわゆるはじめてのGo的なボリュームではなく、これ読んだ上で開発ができるかというと厳しい
    • ビルドの仕方とかそういうのは一切出てこない
    • コード上の話だけ
  • 自分のコーディングスキルの低さを理解した
    • 最後の課題やってて、いわゆるコーディングに置ける論理的思考のパターンを持っていなさすぎる気がした
    • とくに再帰と非同期

Go: The Complete Developer's Guide (Golang)

A Tour of Goが終わった時点で、もうちょっと包括的に説明してるチュートリアルをやりたいと思ったので見たUdemyの動画。

Go: The Complete Developer's Guide (Golang) | Udemy

現時点でセクション40まで見た。実際の開発を通じて各機能を使ってみよう的な感じ。

感想

  • やっぱり動画だと自分が理解するスピードとマッチしなくてだるい時がある
    • しかし早送りすると英語聞き取れない問題
    • もう半分英語の勉強も兼ねるくらいの気持ちで見てる
  • テストの仕組みとかパッケージの仕組みとかA Tour of Goで出てこない話は見てて楽しい
    • これ知ってるからいいやみたいなやつはあるんだけど動画だとスキップした時に重要なこと言ってたらアレだな的なのがあってスキップしづらい
  • あと4時間とかなのでとりあえず見てみる

IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター

1/4くらいみた。会社の昼休みにだらだら読んでる。来月中に読み終わりたい。

https://www.amazon.co.jp/IntelliJ-IDEA%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3%E2%80%95%E2%80%95%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C%E3%81%8B%E3%82%89%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AE%A1%E7%90%86%E3%81%BE%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC-%E5%B1%B1%E6%9C%AC-%E8%A3%95%E4%BB%8B/dp/4774193836/

感想

多分先に読んどいた方が開発効率がはっきりと上がる気がしていいだろうなと思って読んでる。だいたい想定通りな感じ。

英語

ひたすらイングリッシュベルでDME Teensをやり続けている。今月は76レッスン=31時間受講した。 効果のほどがいまいちわからんけどTOEICの点数は上がっているのでよしとする。iKnowが停滞しているのでやりたいがいつやろうかなー。会社の昼休みにやってたんだけどIntellJのハンズオン読み始めてから全然やらなくなってしまった。

これからやること

今思ってること

俺が今まで得てきたプログラミングにおける知見はほとんどトランザクションスクリプトをいかに整理してまとめるか、のところなんだなというのを実感した。 コンピューターサイエンス的な知見を得ていく必要がある。道筋がわからない問題があるがとりあえずGoならわかるシステムプログラミングをやりきる。

Sliceのレシーバによって参照される値はコピーにはならない

9/10追記 コピーはされるが、sliceはarrayへのポインタを持っていて、コピーしてもそのポインタは変わらないので参照先にarrayは同じ、と言う話だった


レシーバは明示的にポインタを渡さない限り値のコピーが渡されると思っていたがそういうことでもないようだ。

package main

import (
    "fmt"
)

type TestSlice []string

func (t TestSlice) printPointer1(){
    fmt.Printf("pointer in main:%p\n", t) // 同じポインタ
}

func (t *TestSlice) printPointer2(){
    fmt.Printf("pointer in main:%p\n", *t) // 同じポインタ
    fmt.Printf("pointer in main:%p\n", t) // 違うポインタ
    ts := *t
    ts[0] = "YES"
    // *t[0] = "YES" // invalid operation: t[0] (type *TestSlice does not support indexing)
}

func main() {
    t := TestSlice([]string{"one", "two", "three"})
    fmt.Printf("pointer in main:%p\n", t) // 同じポインタ
    t.printPointer1()
    t.printPointer2()
}

レシーバにSliceそのものを指定した場合、メソッドの中で参照されるレシーバのポインタは呼び出し元と同様となった。(=値のコピーではない) また、Sliceのポインタで値を受ける場合、その値はポインタのポインタのような形になるようだった。 この際*ts[0]を参照できないのは型の情報がないからという理解でいいのだろうか。いまいちわからない。

Frequently Asked Questions (FAQ) - The Go Programming Language とりあえずSliceやMapのレシーバはポインタ渡しのような動きをするらしい。 レシーバだからどうこうではなく引数でも同じ動きになる。

package main

import (
    "fmt"
)

type TestSlice []string

func test(t TestSlice) {
    fmt.Printf("pointer in main:%p\n", t) // 同じポインタ
}

func main() {
    t := TestSlice([]string{"one", "two", "three"})
    fmt.Printf("pointer in main:%p\n", t) // 同じポインタ    
    test(t)
}

MapやSliceはポインタを持った構造体のようなもので、言語仕様としてその「内部で持っているポインタ」をSliceのポインタとして使う、みたいな感じになっているんだろうか。 いまいち理解できていない気がする。

参考

pospome.hatenablog.com

GitHubのインラインコメントを全部隠す機能が欲しい

インラインコメントがあるとコードを大枠で見れない

とりあえずブックマークレットにした

javascript:document.querySelectorAll(".inline-comments").forEach(function(item){item.setAttribute("style", "display:none")})

ブラウザでの遷移をctrl+fの検索とEnterだけでやりたい

  1. Chromeでctfl+fで検索バーを表示
  2. リンク先のテキストにマッチするように検索
  3. 遷移したいリンクにマッチしてる状態でなんか押すと遷移できる

こういうの