brand new note

ジャズ屋が技術の話をするところ

ubuntuにdockerをインストール

前回:dockerのバインドマウント時のエラー - brand new note

udemyを見ながらものすごい時間をかけてwindowsのPCにdockerをインストールして基礎をやっていたんだけど、GUIがあるといまいちどれが大事なのかわからないとか、一回やっただけじゃ覚えてないよねとか、ubuntuのマシン上でも同じようにいじれたら楽しいよねとか、結果あんまり情報見なくてもコンテナ扱えるようになるんじゃないのとか、そういう動機でやった。相手は誰でも良かった。

Ubuntu 20.04へのDockerのインストールおよび使用方法 | DigitalOcean

これを見ながら同じことしているだけ。頭痛くしながら動画を見て学んだ後だと、このページが如何にきれいに内容を圧縮しているかがよくわかる。すばらしいまとめだとおもいます。たぶんここに書いてないことは一旦大事じゃないことだと思って気にしないで心を軽くしておいたほうがいいのかもしれない。本当は公式ドキュメントとかね、読めるといいんだけどね…5回目くらいで参照しようかな…

http://docs.docker.jp/index.html

こうなると多分あとは回数こなして覚えるのがよいので、最初から全部読むんじゃなくて、何をやってるかの流れを理解できるところだけ理解して、そこそこのところまでやって、壊して、2回目をやって、1回目でわからなかったところを補強して覚えてく、みたいな感じでやればいいのかもしれない。

というわけでメモは適当ですが、勘所をおさえるような書き方をしたつもり。

dockerインストール

下準備としてパッケージのリストを更新しておく(任意)

sudo apt update

apt install docker で入ると思ったけどそんな安直じゃなかった。ちょっと準備がいる。

dockerはコンテナイメージのテンプレみたいなやつをネット上から落として自分の環境をローカルでカスタムして遊ぶ使い方がメインになっているので、aptがhttps経由で使えるようにしておかないと動作しない(と今は解釈している)。そういうパッケージを入れる。

sudo apt install apt-transport-https ca-certificates curl software-properties-common

公式dockerリポジトリ(aptしてソフトウェアをローカルに落としてくるための宛先)を登録するためにGPGキーをダウンロードしてローカルに登録する。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

GPGキーってなんだっていう話はここを見てください。

GPGについて学んだことを整理してみる - Qiita

今の所twitterの公式アカウントの認証マークみたいなものだと思っている。あると安心というか。仕組みはたぶん使ってれば覚えるのでまだ深堀りはしない。

sources.listにリポジトリのURLを追加する。別にファイルに手書きしなくてもコマンドから追加ができることをここで知る。

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

再度パッケージリストを更新しておく。これはなんでかわかりますよね?

sudo apt update

ubuntuのデフォのリポジトリからじゃなくて本当にdockerのリポジトリからDLしてるんですか??という確認がしたければこれを打つ。

apt-cache policy docker-ce

あーそうなんだーと思えればそれでOK。

ここでdockerをインストール。

sudo apt install docker-ce

ceっていうのはコミュニティエディションのこと。エンタープライズエディションもある(ee)。一般市民はceでだいじょうぶ。

sudo systemctl status docker

起動していることを確認。

 docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-05-29 14:12:30 JST; 1h 1min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 10012 (dockerd)
      Tasks: 14
     Memory: 148.1M
     CGroup: /system.slice/docker.service
             └─10012 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

 529 14:12:29 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T14:12:29.521127697+09:00" level=info msg="Loading containers: start."
 529 14:12:29 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T14:12:29.887873134+09:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option>
 5月 29 14:12:30 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T14:12:30.091194153+09:00" level=info msg="Loading containers: done."
 5月 29 14:12:30 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T14:12:30.158930938+09:00" level=info msg="Docker daemon" commit=8728dd2 graphdriver(s)=overlay2 version=20.10.6
 5月 29 14:12:30 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T14:12:30.159126637+09:00" level=info msg="Daemon has completed initialization"
 5月 29 14:12:30 ekp-ThinkPad-X1-Carbon-3rd systemd[1]: Started Docker Application Container Engine.
 5月 29 14:12:30 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T14:12:30.355188471+09:00" level=info msg="API listen on /run/docker.sock"
 5月 29 14:17:36 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T14:17:36.173564183+09:00" level=info msg="ignoring event" container=ab2f5e6adf0e8c096a3767585e774482ab2c262318f445e347471f2f6d>
 5月 29 14:21:00 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T14:21:00.229592870+09:00" level=info msg="ignoring event" container=937c1efdf209c7c764aaa09db01df5cd8511cbd5c8543cbe4551495602>
 5月 29 15:13:41 ekp-ThinkPad-X1-Carbon-3rd dockerd[10012]: time="2021-05-29T15:13:41.321834203+09:00" level=info msg="ignoring event" container=63ab6e89549918b16f6c56be87bedb121d5e1394398718b85d9243d3f5>

dockerイメージインストール〜ログイン

ここまでやったら一連のdockerコマンドを使えるようになってる。何が使えるかはこれで確認。

docker

あとはなにができんのかなとか言いながら公式ドキュメント調べるとかすればいいとおもう。適宜。

dockerのシステム全体の情報はこれで確認。

docker info
ekp@ekp-ThinkPad-X1-Carbon-3rd ~> docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  scan: Docker Scan (Docker Inc., v0.7.0)

Server:
 Containers: 3
  Running: 0
  Paused: 0
  Stopped: 3
 Images: 2
 Server Version: 20.10.6
 Storage Driver: overlay2
  Backing Filesystem: extfs

…以下略

dockerコンテナは様々なdockerイメージを使用することができる。コンテナがモンスターボールだったらイメージはポケモンなんですよ。そうすっと僕なんかはずっと山行って虫取りしちゃうんです(養老孟司

docker run hello-world

runコマンドはイメージを新規作成および起動させるコマンドで、ローカルになければdockerhub(インターネット上)から取ってくる。hello-worldイメージは最初に動作確認するためには最適なイメージなのでだいたいこれ入れる。

docker search ubuntu

ubuntuのコンテナ使いたいんだけどなんかある?ってdockerhubに聞きに行ってみる。ubuntu上でubuntuのコンテナを動かす意味があるのか。

ekp@ekp-ThinkPad-X1-Carbon-3rd ~> docker search ubuntu
NAME                                                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   12302     [OK]       
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   535                  [OK]
websphere-liberty                                         WebSphere Liberty multi-architecture images …   273       [OK]       
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   251                  [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   240                  [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   110       [OK]       
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          50                   [OK]
open-liberty                                              Open Liberty multi-architecture images based…   45        [OK]       
ubuntu-debootstrap                                        debootstrap --variant=minbase --components=m…   44        [OK]       
i386/ubuntu                                               Ubuntu is a Debian-based Linux operating sys…   25                   
1and1internet/ubuntu-16-apache-php-5.6                    ubuntu-16-apache-php-5.6                        14                   [OK]
1and1internet/ubuntu-16-apache-php-7.0                    ubuntu-16-apache-php-7.0                        13                   [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10   ubuntu-16-nginx-php-phpmyadmin-mariadb-10       11                   [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4         ubuntu-16-nginx-php-5.6-wordpress-4             9                    [OK]
1and1internet/ubuntu-16-nginx-php-5.6                     ubuntu-16-nginx-php-5.6                         8                    [OK]
1and1internet/ubuntu-16-apache-php-7.1                    ubuntu-16-apache-php-7.1                        7                    [OK]
1and1internet/ubuntu-16-nginx-php-7.0                     ubuntu-16-nginx-php-7.0                         4                    [OK]
pivotaldata/ubuntu                                        A quick freshening-up of the base Ubuntu doc…   4                    
1and1internet/ubuntu-16-nginx-php-7.1-wordpress-4         ubuntu-16-nginx-php-7.1-wordpress-4             3                    [OK]
pivotaldata/ubuntu16.04-build                             Ubuntu 16.04 image for GPDB compilation         2                    
1and1internet/ubuntu-16-php-7.1                           ubuntu-16-php-7.1                               1                    [OK]
1and1internet/ubuntu-16-sshd                              ubuntu-16-sshd                                  1                    [OK]
pivotaldata/ubuntu-gpdb-dev                               Ubuntu images for GPDB development              1                    
smartentry/ubuntu                                         ubuntu with smartentry                          1                    [OK]
pivotaldata/ubuntu16.04-test                              Ubuntu 16.04 image for GPDB testing             0                    

いっぱいある。好きなイメージをえらぶんじゃ

プレーンなやつにしよう。ダウンロードはpullコマンド。

docker pull ubuntu

ここまでやるとふたつイメージがダウンロードできたことが確認できる。imagesコマンド。

docker images
ekp@ekp-ThinkPad-X1-Carbon-3rd ~> docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    7e0aa2d69a15   5 weeks ago    72.7MB
hello-world   latest    d1165f221234   2 months ago   13.3kB

ubuntuに入ってみる。起動のrunコマンドに-itオプションをつけると対話シェルを取ってこれるので、これをログイン操作としている。

docker run -it ubuntu
ekp@ekp-ThinkPad-X1-Carbon-3rd ~> docker run -it ubuntu
root@ca738446dafa:/# 

※あとで気づきましたが毎回runすると同じubuntuイメージが毎回新規作成されます。idが違うのを見落としてました。runではなくexecを使いましょう。

rootでログインされるのがデフォなのでユーザ作成からは各自好きなようにやってください。イメージはidで識別できるので最初のホスト名はidになってる。

以上

今回はここまで。リンク後半の内容は以下からどうぞ。

次回:ubuntuにdockerをインストール - 2 - brand new note

ubuntuにnginxをインストール

nginxでWebサーバを構築してみよう | YAZ技術ブログ

基本だけどやったメモをのこしておく。

sudo apt install nginx net-tools

net-toolsはnetstatが使えなかったので入れただけ。他人のやってみたを真似してると「その後半のやつ入れる必要ある?」みたいな気持ちによくなるので書いとく。

設定ファイルは/etc/nginx/nginx.confconf.ddefault.confを作成。

なんで設定ファイルが分かれるんだろうと思ってたけど、デーモンで動かすときとフォアグラウンドで動かすときとでは設定ファイルを変えるのがスタンダードらしい。となるとconf.ddはデーモンなのかな。

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ /\.ht {
        deny  all;
    }
}

/usr/share/nginx/htmlも確認。

ekp@ekp-ThinkPad-X1-Carbon-3rd /u/share> cd nginx/
ekp@ekp-ThinkPad-X1-Carbon-3rd /u/s/nginx> ls
html/  modules@  modules-available/
ekp@ekp-ThinkPad-X1-Carbon-3rd /u/s/nginx> cd html/
ekp@ekp-ThinkPad-X1-Carbon-3rd /u/s/n/html> ls
index.html
ekp@ekp-ThinkPad-X1-Carbon-3rd /u/s/n/html> cat index.html 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

特にファイアウォールもないのでブラウザからこのページが見えるか確認。

f:id:frazz:20210527233715p:plain

コンテナ上でnginxを立ち上げたことはあったけど、あれはコンテナの勉強だったので改めて分離してやってみた。確かにwelcomeページは見たことがあるので外側の箱は関係ないんだね(当たり前)。0歩目なのでいずれ必ず深堀りしないといけない。気が向くまでは一旦他のことをする。

ubuntuにfishをインストール

fish shellが結構良かった話 - Qiita

大昔にtwitterで流行ってたのを見ていたので今更使いたくなった。

sudo apt install fish
curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
chsh -s $(which fish)

f:id:frazz:20210527225656p:plain

POSIX準拠じゃないらしいけど、PCは私物だし込み入ったことをしているわけでもないので今の所困る予定はない。コマンド補完が効くのかっこいい。

コンパイルをもう一度理解する

ちゃんとわからないといけなくなったので調べ直した。

Inside Linux Software オープンソースソフトウェアのからくりとしくみ

コンパイルを含め、開発を覚えようと思ったらこの本が詳しい。

Inside Linux Softwareを読んだ - brand new note

過去にエントリも書いたけど、これもかなり前のレビューなので参考になるかはちょっとわからない。途中までしか感想を書けていない。

記事の前半部は試行錯誤になってるので伝えたいことの本意ではない。読む意味があるかどうかは人それぞれだと思う。この記事の後半から、この本を使ってコンパイルの仕組みを簡単にまとめている。

目次

まず簡単に

コンパイルって何? |【エン転職】

コンパイルとは、プログラミング言語で書かれた文字列(ソースコード)を、コンピュータ上で実行可能な形式(オブジェクトコード)に変換することです。 コンパイルを行うソフトウェアをコンパイラといい、変換されるプログラミング言語コンパイラ型言語と呼びます。

「変換されるプログラミング言語コンパイラ型言語と呼びます。 」これは論理的には合ってるけど、じゃあ言語の数だけコンパイラがあるんだなと納得するとそれは間違い。コンパイラを必要としないインタプリタ言語もあるよという話になるんだけど、用語説明としてはここでは省かれるべきなのでそれは書かれていないらしい。

f:id:frazz:20210513130008p:plain

世のあらゆる技術者は当たり前のようにコンパイルのことやコンパイラのことについて言及してる。これらを全て読んだら本質的なコンパイルコンパイラの意味を文脈から理解することはできるけど、関連する1000も10000もある文章を全て読み漁るのはフルスタックエンジニアになることと同義だ。そんな時間はかけられない。

コンパイルの流れをざっくり掴んでいく - Qiita

WebAssemblyは言語ではない。でも今揚げ足を取っても仕方がない。自分も嘘は書く。善意なのも痛いほどわかる。寄り道してごめん。

コンパイルの流れ

f:id:frazz:20210513132700j:plain

本に戻ってこれを理解していく。

ソースファイルとヘッダファイル

raw_tcp_socket/raw_tcp_socket.c at master · rbaron/raw_tcp_socket · GitHub

とりあえず昔読もうとして挫折したソースコードを引っ張ってきた。内容はともかくとしてこの.cで書かれたもの(raw_tcp_socket.c)をソースファイルといい、内部の以下のような記述を「ヘッダファイル(.hで書かれたファイル)をインクルードする」という。ヘッダファイルが何なのかについてはコンパイルの流れとは別の話なので最後に書く。ソースファイルは紹介するものの言語がCだから今回.cなだけであって、他の言語でもいい。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h> //memset()
#include <unistd.h> //sleep()

f:id:frazz:20210513134120p:plain

ライブラリはどんなアプリケーションを開発するときにも使われるとても普遍的な概念であるから、機能のまとまりというふうに覚えておけばいいと思う。なんでまとまりなのかと言われればまとめておいた方が便利だからである。ライブラリは自身の環境にあらかじめインストールされていれば画像の部分にわざわざ同梱する必要はない。とりあえず開発環境は各々用意するものであって、コンパイラコンパイラ型言語を扱うのであれば、そのなかの道具の一つとして使うべきであることを改めて確認した。

なんでわざわざこんなことを書いているのかというと、理解のプロセスを経るのが下手くそすぎて4年前から脳機能が停止しているからである。自分は優秀だとでも思っていたのだろうか。

コンパイルとビルドの違い - brand new note

ビルドに関してはもう少し実際のアプリケーションの構成を目で見ないとイメージしにくいかもしれません。少し前まで、他人のgithubとかを見て「なんでひとつのアプリケーションは複数のファイルで構成されているんだろう、readmeとかよくあるし、どうやって連動して動作しているんだろう」と思っていました。自分はそこまで書けないので。

今見ると目も当てられない。うーんまあでも今もあんまり変わってないのか。

プリプロセス

絵の解読に戻る。

プリプロセス→(狭義の)コンパイル→最適化→アセンブル→リンク

この流れがgcc(GNU Compiler Collection)内部で起きている広義のコンパイル処理である。

プリプロセスは直訳すると事前処理となるけれど、文字通りソースファイルはコンパイラに直接突っ込んでもいけないことがここでわかると思う。正しくコンパイラに入力するためには"プリプロセス済みソースファイル"を生成する必要がある。

この過程でプリプロセッサはこんなことをしている。

  • コメントの除去
  • マクロの展開
  • #includeで指定されたファイルの取り込み
  • プリプロセッサに対する条件指定の処理

これはCの勉強も絡むけど、#ifとか#ifdefとかいうのはプリプロセッサが処理する条件コンパイルというやつで、広義のコンパイルの流れからすると比較的序盤に処理されることがわかる。詳細についてはここでは触れない。それと、#includeはCコンパイラが処理できるんだったら何をincludeしてきてもいいらしい。へえ。

(狭義の)コンパイル

プリプロセス済みのCソースコードコンパイラによってコンパイルされる。コンパイルをした後、出力先にはCPUがいるので、そのCPUに向けたアセンブリ言語のプログラムをコンパイラは吐き出す。最適化に関しては、明示的に指定すればやってくれる。これはアセンブリ言語の内容を操作して、よりプログラムを軽量あるいは高速にする作業である。

ここで生成される、アセンブリ言語が保存されたファイルには.sという拡張子がつく。

アセンブル

コンパイラが吐き出したアセンブリ言語のプログラムは、アセンブラによってアセンブルされる。つまりここで機械語のプログラムに変換される。.sだったファイルは機械語のコードのファイルとなり.oに変わる。これはオブジェクトのoで、オブジェクトファイルとも呼ばれる。

リンク

ソースコードから機械語のオブジェクトファイルを生成したが、まだこのままでは実行できない。ライブラリを使用する場合にはライブラリとの紐付けをしなければならない。また、大きなソースコードを一度にコンパイルするケースもあり、どこでミスが起きて失敗するのかソースコードから見分けるのが大変だという場合には、分割コンパイルという手法も存在しており、分割した場合には最後に結合をしなければならない。このような作業のことをファイルのリンクと呼ぶ。リンクを行うツールをリンカと呼ぶ。ldコマンドはその一例である。

ld - コマンド (プログラム) の説明 - Linux コマンド集 一覧表

リンカによってライブラリや分割ファイルのリンクが完了すると、晴れて実行可能形式のファイルが完成する。

ライブラリ

冒頭とここで出てきたライブラリについては、静的ライブラリと共有ライブラリがあり、それぞれ.a、.soという拡張子がつく。何が違うかというと読み込まれるタイミングが違う。静的ライブラリはリンク時にリンクされる。共有ライブラリはその後で、実行時に実行ファイルから読み込まれる。

歴史的に言うと先にできたのは静的ライブラリだけど、デメリットとして同じ機能を何度も繰り返してリンク時に読み出す形態は、完成する実行可能形式のファイルサイズをどんどん膨張させてしまうため、後から共有ライブラリという概念が生まれた。

共有ライブラリは静的ライブラリと違い、オブジェクトファイルではなく元から実行可能形式である。そのためメモリ上に展開することができる。実行可能形式のプログラムが実行されるとき、そのタイミングでメモリ上にすでに展開されている共有ライブラリを参照しに行くことで、静的ライブラリより無駄なくプログラムを動作させられる。静的ライブラリ使用時と比べると、アップデートがあった場合にも共有ライブラリと実行ファイルは独立してアップデートできるため、修正の手間も減る。

ライブラリとは何なのか? - Qiita

ここに詳しく書いてあるけれど、ライブラリは「これはライブラリです」と言い張ればどんなに小さなものでもライブラリである。生成する時に拡張子や静的/動的の指定、サーチパスの指定などをして適切な場所に置きつつ、メインとなる実行ファイルにそれを使用する旨が書かれていれば良い。

ヘッダファイル

Cの場合ヘッダファイルの中身は以下。関数の定義は含まないのがポイント。

  • マクロ定義
  • 関数のプロトタイプ宣言
  • 大域変数の宣言
#DEFINE NULL_VALUE "NULL"
#DEFINE PROGRAM_NAME "SAMPLE"

int get_value();
double calc(int n);

char *env_val;

値は適当だけど例えるとこんなのらしい。マクロは指示した文字列を別の文字列に置き換える仕組み。値の定義を1箇所に集中できるから後からコードを管理しやすい。

事前にこんな関数をmain()内で使いますよということも言っておかなければならない。これがプロトタイプ宣言。関数名、関数が受け取る値、関数が返す値、値の型を言っておく。書いとかないとコンパイラが親切心から型が間違ってるよっていうエラーを返してくれなくなる。

変数はわざわざ説明しないけど全ての関数から参照、変更できる変数を大域変数という。グローバル変数とも。後で「どこでこの値コレになったんだっけ」ってなるからあんまり使わない方がいい。

おわり

座学にならないようにしようと思ったけど座学になっちゃった。

過去の自分はクソ真面目だったので、「こういう方がいいじゃん」という思想の混じった"合理性のある知識”が一切体に入ってこなかった。コードなんてものは別世界の天才が書いているのだと思ってた。今まとめると納得できるけど、相変わらず基礎だ。

自走について

どうやったら「自走できる人」になれるのか|nacam403|note

読んでなるほどと思ったのでメモ。

色々悩んでたら職業としての自走、人としての自走、ものの作り手としての自走みたいな話に膨らんでしまった。とりあえず目次を置いておく。

自分に足りない力の把握

自分に足りないのは〇〇力である,というより,自分に足りないのは〇〇における△△力である,と言えるようになったほうがよいというのを読んだ.確かにコミュ力が欲しいって言って雑談ができるようにはなったけど雑談は仕事上のコミュニケーションとはやり方が違うし,回復力が欲しいと思ってもそれが体を効率よく休める方法なのか失敗から立ち直る為の考え方なのかで分かれたりする.特定の状況下で練習したスキルが生きてほしいのに,状況設定ができていなくて練習したものが役に立たなかったりすることはままある.これは自走しようとしても間違った方向に進んでしまうよくないパターンだと思うんですね.これはGWで読んだ本です.

ゴールに向かって進むとは何か

最初にノープランで挑んで,こっちの選択肢がよりよいかもしれないと思ってその場で何かする,みたいな生活ばかりしているのでゴール設定が苦手だったりする.その分ノープランで動き出す前に無意識にいろんなものを刷り込ませてから勇気がなくても動ける状態にしてどんと動く,みたいなプロセスはあるんだけど,これは悠長に仕事できないので実際にはあまり使えない.使えるのかもしれないけど,今は気になることがあまりにも多い.

粒度の大きいゴールと言われると,ざっくりしたなにも実体のつかめない雲のようなものというイメージが浮かんでくる.いつもの自分がそうイメージしてしまう.そうではなくて,必要なのは,必要なことを洗い出す力,優先順位を決める力.ここが毎回つかめないのはもしかすると特定の技術に対して概観をさらうところがそもそも上手くないのかもしれない.時間内でやるって難しい.

こういったことができる人は、そうやって筋道を立てて動こうとしている様子を他者に見せるのも上手だったりするものです。

speakerdeckのスライドとか流し読みしたらいいのだろうか...

自分の意見は早い段階,むしろ未完成の状態から周囲に伝えることで,今自分が何をどこまでやったのか,何で詰まっているのか.誰からの何を求めているのかが証拠に残る.コミュ力を鍛えるというのはこういうことだと思う.自走が暴走にならないようにしたい.

上の記事にも言及があるけれど,発信した結果他人に何か言われる可能性があることを常に意識していないと,なかなか心は折れやすい.なんか言われるとなぜ心が折れやすくなるのかについてはこちらでよく分析されている.

フィードバックにつきまとう「5つの脅威」を和らげる方法 | HBR.org翻訳マネジメント記事|DIAMOND ハーバード・ビジネス・レビュー

報告もやったことをただ言うだけだと指示待ち止まりになってしまう.指示を仰ぎたいのはそうなんだけど,「これをやりました」とだけ言うと「はいそうですか」「で,どうしてほしいの」となってしまう.「次はどうしたらいいですか」とか,「方向性はこれで合っているでしょうか」とか言えるといいのかもしれない.もっといいフレーズがあと2つくらいある気もする.

新卒でエンジニアになった頃に学んだ、報告の書き方|nacam403|note

ゴールってそもそもどこだっけというのはいろんなことを考えていると見失いがちになる.そもそもこれを解決する為にこの技術が必要で,それを学んでいたら知らない用語が出てきてそれを調べるとか,動作してほしい通りに動作しないというのがいつもある.課題が入れ子になるときは必ずそれを意識するか,意識の中で全て収まらないほど情報過多になるならまず初めに目的を書き出さなければならないと思う.何を忘れるかはやってからでないとわからない.

学習の積み上げ効果について

心的資源 | 対戦攻略指南 | スマブラDX 対戦攻略指南

これはゲームしていて勝手に引っかかったんだけど,何をするにも頭の容量は最大値がほとんど決まっていて,無意識でできるようになるまで特定の物事を練習しなければ次の新しい物事を習得するリソースが空かないという話で,当たり前ではあるが積み重ねの学習がそうでないつまみ食いの学習に比べてどれほど効率的かがわかる.最近ずっと頭にこれが引っかかっている.

この技術が分かっていると関連技術のこれも習得が楽になる,というような横のつながりもあるが,この技術が習得できないとその先で使うこの技術をまず自分が使う状況に自分の身体を持っていくことができない,という縦のつながりも当然あるわけで,これをよく心得ておかないと難しくてかっこいい横文字に序盤から踊らされてしまう.最初から大きな獲物を狙うとかえって無駄足になってしまうというのはあると思っているし,知らない技術の山があるとすればいつでも一度下山して,最初からその別の山を登り直す気概を忘れないことが大事だと思う.

フィードバックの話とか頭の整理とかの話とも絡むけど,情報の積み上げができてないとこういうことになりますよというのが頭の中でつながったのでここに追記しておく.

「詳しく言わなきゃわからないんですか?」と言われるとへこむ.とてもへこむ.相手に自分の気を害す気がなくても,そっくりそのままそう言われなくても暗にそういうシチュエーションになるだけでへこむ.けど,ミスをもとにして教わった情報を追加で暗記してもさっぱり指摘が減らない.でもそれは暗記=一次情報という原理のせいだ.情報は抽象化すると2次にも3次にも次元を上げられるという発想を意識して用意してなかったからだと思う.メタという言葉は知ってたけど,仕事で使えたことはなかった.あったにしても要約がへたくそで毎回指摘される.「こういうことですね」「んーちょっとちがう」みたいなことがあったらそれは思考の抽象化が間違っている.横に連想するのは得意なんだけどなあ.

「詳しく言わなきゃわからないんですか?」=「情報を抽象化して時短して生産性上げてんのにわざわざあなたはあなたが無知であるためにこちらに情報を解凍させるんですか?」ということだと思う.暗記してもうまくいかないのは情報量は情報の質を必ずしも上げないからである.うまく時短しようと思ったらもっとインプットした上できれいに情報を抽象化することが必要なのだ...

上に紹介した本ではこれを「哲学化」と言っている.研究を1年くらいやったところで日記が名言botになってきて気持ち悪かったんだけど,あれは大量にインプットする生活が続いた影響で内省の抽象化がものすごいスピードで行われたからだと思う.おそらくこのテクニックがあるのとないのとでは全然違う.同期が雑談を秒で終わらせられるのは素っ気ないからではなく思考の抽象化がうまいからだし,中2で成績が落ちてきて受験戦争に参加できる資格が剥奪されたのも数学物理ができなかったのもおそらく抽象化能力の不足のせいだと思う.

今日の作戦

自走のテクニックとは関係無い今の自分のどうにかならないかなという独り言ではあるんだけど、いろんなあれが足りないとかこれが足りないとかっていうことを考えていると、こんなことを調べてみたらどうかとか、技術以外のことに大事な知りたいことがたくさん出てくることが多くて、個人的にはむしろ毎日出てくるその技術以外の知識…器用に生きるために必要な知識…がモチベーションになっているところが大きいように思う。これを意識したらもうちょっとだけ受け身が消えるんじゃないかとか、落ち込まずに済むかもしれないとか、うまくコミュニケーションが取れるかもしれないとか。そうやって色々ごちゃごちゃしたものがその日の朝に一度集大成となって現れる。今日はここまで器用になったって喜びながら作業をする。けれど、それは大体1時間から2時間で確認ができてしまう。加えて、人間が集中できるのは大概その最初の2時間だったりする。なので、自分の技術以外のモチベーション…これだけ今日の自分は過去の自分より成長して器用に生きていられた…という自己肯定感から自信に繋がる部分、というのが、その2時間をすぎたらほとんどないことに気がついた。思えばこれは何年も前からそうだと思う。残りの時間を悶々としながら過ごす以外に何かいい方法はないのだろうか。足りないものを炙り出すとか、もっといろんな部分にここは実りがあるな、なんてことを見出すとか。休日じゃなくてもそういうことがずっと刺激され続けてくれたらいいなと思うし、もっともっと今やっていることから面白みを見出せるように工夫したい。

基本的に、今よりもっと器用になるには「他人の声を聞く」か「今まで聞こえてこなかった自分の内なる声を聞く」以外に方法がないと思っている。思い込んでいるだけで他にはもっといいものがあるかもしれないんだけど、自分は少なくともそうやって生活してきた。だから内省が得意なのかもしれない。今まで聞こえてこなかった「ああ今自分はこう思っているんだ」という部分は、なんというか、ハッとするので適宜メモを取るようにしている。そうすると、なんとなく時間を過ごしたりぼーっとしたりすることが少しだけなくなって、一体これはなんだろうというように考えるネタがまた増えたりして、暇が潰せる。これをよくやるような気がする。暇かどうかは別として、気力は保てる。そうやってまたひとつ器用になる。

身も蓋もないけど、もしかすると自分は成長が好きなのであって触媒はなんでもいいのかもしれない。だから面白いものを優先してしまうのかもしれない。

オープンな方がいい

秘密主義とは何か 秘密主義者の心理と特徴 上手な付き合い方を解説 | マナラボ

秘密主義という言葉を最近知った。主義なんていう大きな言葉でまとめる発想はほとんどなかったんだけど、思い返すとそれにまつわる話はたくさん思い出の中にあるので、もう恥ずかしい思いをしてでももっといろんなことはいろんな人に話していかないとダメなんじゃないかと思うようになってきた。

自走につながる点としても状況や成果、苦悩をオープンにするというのは果てしなく大事であったりする。ここができなくて困ったことが何度もあるし、自分の考えてることを人に言うの嫌なんですよね、と上司に言ったこともあった。明らかに人を信用していない人間の言う言葉ではあるんだけど、ここは同時期に読んだ本が役に立った。信頼は能力と誠意でできていると言うような内容だったと思う。

信頼はなぜ裏切られるのか―無意識の科学が明かす真実

自分が人を信頼するときに使っている指標がかなり非合理的で、感情の揺らぎをベースにしていたものだとその時気がついた。優しくすればいいとか、厳しくしたらダメとか、本当に優しい人はいうべきことは言うとか、ここまでやったら相手にとってはハラスメントと扱われてしまうのではないかとか、世に言われている心の扱い方に関する面倒な悩みの部分が大体明らかになったので、これは大きかった。

これは自分が後輩として先輩を信頼するときに使えるだけでなく、自分が何かしらで誰かの先輩になったときにも使える話なので、そこから少しマネジメントにも興味が湧いて成果主義的な少し最近流行りの本を読んだりもした。けど、これは見出しとは脱線するので割愛する。

腹を割って話せない性格、という言葉でそこから数ヶ月、もとい数日前までは自分のことを表現していて、できるだけ今まで話せなかった些細な悩みを身内や匿名サービスで打ち明けたりもした。もちろん言ってはいけないラインは遵守している。そこから得られた同じ社会人や、あるいは学生の場合もあったけれど、そう言う人たちから得られた生の話と暖かい心遣いは、こちらから自分を見せなければ絶対に見られなかったものばかりだと思う。最近は抽象的な質問を投げ掛けたら向こうが自分の生き様を話しかけてくれるようにもなってきた。会話って難しいけど、互いに互いの必要なものがわかっている人同士であればこれほど便利なものもないなと思う。そういう心の読み合いは多少なければならないんじゃないかと最近思う。TEDにもフルマラソンに出るって公言したから本当に完走してしまったサラリーマンの話があった気がするし、うまく周囲を使うのって大事だと思う。

Two life hacks which changed my life | Hirofumi Ono | TEDxUTokyo - YouTube

仕事の話に戻ると、何をオープンにして何をクローズドにするかというのは必要な能力なので勝手に考えるようになっている。この辺りは自分で差を意識してやるしかないんだろうと思う。これは何か役に立つと思ってこの部分を読んでいる人にとっては申し訳ないけど、自分もまだまだ何を言って何を言っちゃいけないのかはすぐに分離できないので、もっとわかる人から教えてもらってほしい。少なくとも志は打ち明けて損はない。ブログを始めた理由の一つも自分を曝け出すためであったりする。技術的なものにしろ人間的なものにしろ、案外世の中の人は自分よりも数段上の悩みをさっさと考えては解決して手放してを繰り返している。あまりにも当たり前なのでそんな悩みは考えたことがないと言われれば仕方がないが、悩みを持ったら人に聞くのもいいし、そこに関しては遠慮はいらないと思う。それこそオープンに、だ。世の中に自分と同じようにたった今何かの問題を抱えて悶々としている人は山程いる。

手を動かすのは楽しいか

手を動かすのがそもそも楽しいかどうかというのはエンジニアとして自走するにあたってものすごく重要で、こういう心持ちがあれば確実に一生食いっぱぐれないという気がしているので、何年もこのテーマについては考えていた。手を動かすというキーワードを知る前から、何となく自分は好きなことを職業にして人生過ごしたいなと思っていたので、楽しいってなんだろうとか、好きってなんだろうとかっていう抽象的なところはずっと考えていた。研究を始める頃には「周りの環境が大事」「長い時間をかけて意識に好きっていうエネルギーを刷り込むのが大事」「好奇心が大事」というところまでは経験則からわかっていた。でも大学生活6年を使って確実になったのは「座学はできる」「勉強は好き」「勉強すれば悩みは解決する」「他人の悩みも知りたい」「自分より頭のいい人が世の中をどう見ているのか知りたい」ということだけだった。人生を楽しむ分には十分これで事足りるんだけど、エンジニアとしてお金を頂きながら楽しく過ごすとなるとこれだけでは決定的な部分が足りない。手を動かすのが楽しいかと言われると全然楽しくないのだ。それよりもっと解決したい謎のもやもやがある。それは別にエンジニアとして手を動かすことで解決するものとは限らないのだ。そこを経由したら手を動かすのが好きになるヒントが見つかるかもしれない。いつまでもこんな足掻き方をしてるのが自分の悪いところだ。でももしかしたらそれが恩師である教授と自分の差を埋める切り札になるかもしれない。手を動かしてから手を動かす楽しみはわかるんだよと言われればそれまでなんだけど、それでもやっぱり理解の追いつかないものは楽しくない。楽しくないと続かない。うにゃうにゃ。

それで、先日ネット上で「機械いじりが好きな人とそうでない人はどこに差があるのか」という質問をした。こんな答えが返ってきた。

光沢のある金属部品が整然と動く様を見て、美しいと思うなら素質十分です
動いている機械の仕組みがどうなっているのか疑問に思うなら、入り口まで来ています
実際にバラして確認したくなったらもう何も言うことありません、一歩踏み出して下さい
機械いじって気がつけば朝を迎えたとき、もう後戻りできない自分に気付くでしょう

なるほど自分は機械を美しいと思ったことがない。そんなものより音楽とか絵とか人間の心の移ろいとかの方がよほど美しいと思う。無機物に感情移入するのは不可能だと思った。今の自分では素質もないということになる。でも確実にこれは手がかりになる。翌日カラオケに行ってDAMをじっと覗き込んでみたけど、やっぱり美しいとは思えなかった。まだ自分より数段頭のいい人が考え出した楽しみを自分は理解できないのかと思った。そこさえわかれば心が通じるのに。

養老孟司 講演会 (後) - YouTube

で、最近これを見た。いわく敗戦した70年前の日本人は何が正義なのか判らない時代を生きていた。戦時中のことを書いた教科書は、都合の悪い内容を子供に教えられないから半分以上真っ黒に塗りつぶされた。まあその話の教訓は「間違ったこと言ったら直せばいい」というところなんだけどそれはそれとして、そういう時代の中で作られた機械は「必ず思い通りに動く。人間と違って人間を裏切らない」として無意識に本当にたくさんの人間の心の拠り所となった。それが戦後の日本を支えたという話だった。

とうとう自分もこんなものを見るようになったかと思ったけど、確かにその理屈だったら「人間よりものの方が信頼できる」というのは納得がいく。壊れたらどこかが悪いわけで、機械は嘘をつかない。平成生まれで右も左も分からない状態で研究に没頭し始めた自分に言わせれば「機械が思い通りに動くのは当たり前で、思い通りに動かないからいつまで経っても好きになれないんじゃないか」という感じだったんだけど(これは一消費者としての感覚しか持っていないため)、日本がものづくり大国と言われた理由と、機械は美しいという感性を持っている人が一定数いることは何となくわかった。ものに魂を吹き込まなければいけない理由があったのだ。とすると、それは音楽だろうと工芸品だろうと機械だろうと向き合うべき姿勢は全て同じなんだから、気概さえあれば自分でもできるということになる。その部分は証明できたので少しだけ心が軽くなった。

https://codelearn.jp/articles/programming-tips

で、ここに戻った。

実際入口なんて全員違うので最後の一文しか読んでない。

作るものがない、と感じたら、簡単なものからでも構わないので、
とにかく動くプログラムを書いてみましょう。

動いて当たり前だとか人の役に立たないなら最初からやる意味がないとか思ってたけど、それは置いておいて、まず思い通りに動くありがたみを原動力に変えてみろ、最初に感動してみろということだと思った。それなら楽器でやったことがあるからわかる。創意工夫の先にある生活は必ず楽しいというのは知ってる。心の穴が埋まるかもしれない。揺るぎない原動力が欲しい。難しいこととか今までやってきたことへのプライドとか一切抜きにしてhelloworldをもう一回書いてみた。動いた。ああ嬉しいんだと思った。やっと心が通じたと思った。と同時に、自分の真の技術力なんてのはまだほぼ0なんだと思った。

※追記

ちょっと感動したままに書いてしまったけど、機械を信用できないのではなくて時代が高度化複雑化したせいで機械の中にある人間のミスに気がつくようになってしまったからしんどいのかもしれない。でも、だとしたらそれが仕事なので割り切ろうと思う。まだ他人のミスがわかるところまで到達してないけど、ゆえにミスだらけの自分を見ていると世の中どこでもそういう人は一定の割合でいるだろうなという気はした。多分これはいくら辟易としても仕事をやめる理由としては十分ではないだろう。強いエンジニアになりたいと願うほど如何に頭に知識量を詰め込めるかみたいなところを突き詰めたくなるけど、社会のなかの一つの仕事として見ていくとそれは自立の一歩目でしかない。世の中を見たりお客さんを見たり、とにかく他人も自分と同じようにお金をもらって生きている。じゃあその人の人生も同じ重みがあるよなと思ったら、自然と自分のことだけ考えてられる時間はだんだん減っていく。大人になろうと思ったらあんまり傷ついていられる暇ないんだよなんていうと文章を受け取る側はどんな形であれいい気はしないだろうけど、誰に言われるでもなくそういうのは自分で考えるのが一番自分が傷つかなくて済むからそうしているし、我慢する力がないから書いちゃう。ごめんなさい。居酒屋が開かないのが悪い。…二転三転してすみません。

ごはん、気にしてますか

自分は神経質なのでお昼を食べたあととか朝ごはん食べる食べないとかでかなり体調とか集中力が変わる。ヨーグルトと素焼きナッツは切らさないようにしている。できるだけ炭水化物だけの食事にならないようにもしている。とはいえこれはあんまりできていない。タンパク質はやる気とか落ち込み具合とかに関わるのでサラダチキンは重宝している。

ヨーグルトは院2年の夏くらいに、これかなにかを読んで切らさないようにし始めたんだと思う。プラシーボは2日で、精神安定は1,2ヶ月で出てきたように思う。素焼きナッツは確かまこなり社長が言っていたので社会人になりたてのときに食べ始めた。お菓子が要らなくなるのでかなり良いと思われる。まあ、お菓子も食べる。

不健康エンジニアが3ヶ月だけ食事に気をつけたら心も体も健康になれた話 - paiza開発日誌

少年野球BLOG: 武井壮さんの回復法

リンクは忘れたけど、どこかの誰かのブログに「野菜と肉ともろもろ数種類、同じやつを定期的に注文して適当に混ぜてメニュー少しずつ変える生活してれば、引きこもりでも健康になれる」という内容が書いてあって、確かにいくら料理が苦手でもそのくらいの食事の水準に上げてもいいかもしれないな、なんて思い始めた。で、上のリンクを読んで回復って意外ともっとできるもんなんじゃないかと思った。鶏肉と冷凍根菜を一生レンチンしながら煮干しと割けるチーズとレモン水を貪る生活してるだけでいいのかもしれない。

わりと脳内って余裕があるかないかの中間地点があって、タスクをこなしているとその地点からネガティブに1ミリでも倒れたらリラックスしながらできる学びがストレスになるもんなんだな、と思うようになった。食事が健康だと無茶振りされたときにネガティブになるまでの耐久値が若干上がるんじゃないかと期待している。

情報に振り回されない

追記に追記を重ねてるので逆説的になってきた。

一人になると自分のことを考えてネガティブになって結論の出ない悩みが発生することは多い。それが文章の元だったりするけど、無駄足になることもよくある。他人に言ってもしょうがないものであることも多々あるので、時間がなければ話すほどのものでもない。コントロールできるならそのほうが社会的には良い。

悩みが生まれる理由にもいろいろある。ネットで勉強はいくらでもできるけど、相反する情報が二つ出てくるとこれは矛盾を解消するために行動したりどちらが自分にとって強い、信じるべきものかを頭の中で競わせたりする。悩みをネットで解決する癖を持つとものすごくこれをよくやる。それはいいんだけど、気力の限界が見えると個人的な内面の問題じゃないかとか考え出す。そこから寄り道して、知的好奇心の赴くままにああでもないこうでもないとか言い始めるとじきに精神が壊れる。好きで精神を壊すなんておかしい。文明病だ。当然労災で訴えることもできない。

解決策はいくつかあって、一つはさっき言ったように人に話す。これはオープンな方がいいというところで書いた。もう一つは情報を選ぶ。人に勧められたものだけ従っておくと精度が上がることがある。まあ、人を選べばだけど。3つ目。時間で区切る。これはよく考えると最終的な結論なんだけど、どうしても時間を気にせず考え事をしたい癖のせいで蔑ろにしてしまうので今回も割愛する。4つ目、暗に受け取っている情報を言語化して捨てる。本来これを追記しようと思った。ここから先は暇な人だけ読んでもらいたい。

これが書いてあったのは上に紹介した本の最後の方だったと思う。職業柄なんでもネットで調べる癖がつく。それが悩みであれ仕事の不足情報であれ趣味のyoutubeであれ。この行為自体は職業柄やるので特に問題視することではないけど、無駄に悩む理由の一つにこの調べすぎがある。そして、コントロールできないところまで調べて何が大事なのかわからなくなって知らない間に疲れて最後には自分に自信がなくなっている。これを解決できる(かもしれない)のが「暗に受け取っている情報を言語化して捨てる」だと思った。

例えば今持っている悩みを検索すると解決できそうなものが10個出てくる。大事なのはそこに書いてある内容を精査して解決してスッキリして次の行動に移れること。なんだけど、停滞する時はそれができない。あれこれ言い訳をつけて自信が削れてさらに寄り道していく。「これは調べても自分の力ではわからないかもしれない。自分は能力が低い」とか、「みんな好き勝手言ってて誰も自分に最適な答えなんか提示してくれない。いくらネットでも完璧な答えなんかない。強く生きよう」とか、「こんなに記事があるってことはみんな踏み越えてるんだろうか。誰もオフラインでそんなことしてる人に会ってないんだけど。もしかして孤独なのかな。まずはコミュ力が欲しいな」とか考え出したらもうアウトである。「10個の解決するかもしれないし、しないかもしれない情報が書いてある画面」を見た状態で受け取っている「書いていないネガティブな情報」がこれである。受け取り方は人それぞれなのかもしれないけど。頭の中にある個人的な問題は継続的な努力を伴うものだったら今解決する問題じゃないので、考えない。そもそも脳内で起きてる論理のつなぎ方の精度は自分の能力の限界でやっている。ここに問題があるからこの手の悩みに一人で立ち向かっても一生スッキリしない。結果的に自分の脳内で長期的にダメージを与え続ける。じゃあやるもんじゃない。しかもこの手の問題は「適切な量であればポジティブに処理できる」可能性も秘めているのだ。自分が明るい時も実は同じことをしている。だから境目がわからなくなって知らない間におかしなことになる。

こういう「書いていないメタ情報を受け取ってその個人的な感想を持った瞬間に勝手に打ちひしがれる」というのはかなり人によってはダメージを受けるので、負のスパイラルに入らないように逐一気がついていく必要があるし、全くやらなくていいし、階段を上っていると思ったら階段が地盤沈下していた、みたいなことを起こさないようにする必要がある。最後に、忠告したにもかかわらずこれを読んだ人は漏れなく情報に振り回されているので時計を確認してください。

その他

伸びるってなんなんだろうっていうのがだんだん自分の中で解明されてきてる。けど、自走できてるのかできてないのかまだ自信がなくて、ちょうどその境目みたいなところをもう何年も綱渡りしている。なのでこの情報が正しいかどうかも各自の判断に任せたい。多分ヒントくらいはあると思う。

本を読んで、体験して、人の話をできればオフラインで聞くのがいいと思う。オフラインは情報を圧縮して伝える場なので、効率がいい。本を読むとそのありがたみがまたわかってモチベーションにもなると思う。

あと、内省を整理するのって話のテーマが重なっていてものすごく難しいなと思った。考えをまとめてオープンにできないのはこういう技術的な部分にも理由がある。でも宝の持ち腐れだし、鑑定しないと宝かどうかもわからないので、定期的に出していかないといけない。これは自分にしっくりくると思ったら追記する。

リバースプロキシを知る

コンテナの勉強してたら丁度補足的な用語説明として割り込まれたのですが,これ知ってなきゃかなりまずいよなと思ったのでメモ.これはメモです.読み物じゃないです.リバースプロキシの説明としては以下の内容が記載されていました.

クライアントとサーバの通信の間に入って、
サーバの応答を代理(proxy)しつつ通信を中継する機能、
あるいはその役割を担うサーバのことをリバースプロキシといいます。

いる???

なんで間に入るの?姑か??

https://naoya-2.hatenadiary.org/entry/20140826/1409024573

メリットを検索したところいくつか有用そうなものが出てきました.クライアントとサーバはわかるけど,フロントエンドとバックエンドとかっていうのが未だにわかってなくて,これはかなりまずいなと思いながらこちらの記事を読みました.webシステム全体で考えたときにパフォーマンスが上がるように,クライアント側で済ませたほうがいいであろう軽量な処理とサーバ側でまとめたほうがいいような重めの処理を分担させるために,中間に専用のマシンを置いておいた方がいいでしょうという考え方なのかなと思いました.というか,これは一読してその場でまとめているだけなのでかなり粗いですが.記事の最後に紹介されている書籍がちょうど右手から70cmのところに置いてあったので読みます.

読めなくても読めるようになったときの為に書籍を買うっていうのが個人的には好きです.ほら,なんか自分の将来が約束されてるような感じがしていいじゃないですか.無責任でしょうか.そうですか.

Apacheを使ってリバースプロキシの構築ができるらしい.つまり手元でもできるということですね.いいぞいいぞ.わかんないことはいっぱいあるけど手を動かせる理由があるなら分からないことは後からわかるので今は気にしない.これができなくて私は高校数学ができなかったんですよ.いやそれはどうでもいいんです.まず読みます.

workerのプロセス,スレッド数をデフォルトの数より多めに設定してあげることで,バックエンドのAPサーバの負荷をリバースプロキシでいなしてあげることができます.ああ.概念は知ったのでなんかこれは...いいことをしているんだろうな.

また無計画に沼に嵌ってしまったのでここでどこまでこの話題を深堀するかを整理します.

  • リバースプロキシの概要とメリットを知る(一旦済)
  • できることなら手を動かして実際にリバースプロキシを立ててみる
    • クライアント - リバースプロキシ - APサーバ(単体)
    • クライアント - リバースプロキシ - APサーバ(複数)
    • VMが3台か4台必要なので立てる
  • 確認したいこと
    • 全台疎通
    • Apacheのコンフィグが理屈に基づく調整
    • 負荷テストツールを使ってアクセス負荷を視認

この辺りまでなら書籍を用いてなんとかできそうです.いやほんとかな.ほんとにやるのかな.なんか脱線してる気がするんだけどな.

  • フロントエンドとバックエンドの云々というのがどの切り口から調べたら最短で頭に入るのか知りたい.今までの勉強が役に立つならそうしたい.
  • もう少し上の記事以外の観点から見たリバースプロキシに関する言及はあるので何個か読む

本来今日やりたかった勉強はこれではないのでそろそろ戻ります.

1時間後

やりたかった勉強に戻ったらリバースプロキシをnginxコンテナで実装してwebアクセスすることに成功しました.しかもなんかhtmlを直接書かずに静的なサイトコンテンツを持ったサンプルのコンテナをコマンドから呼び出す...みたいなことをしてwebアクセスしてました.全然調べたことと想定していたゴールが違うけどゴールしているというか,言うこと聞いてまっすぐ勉強するのが一番経験値効率高いというのはきっとこういうことなんでしょうね....

手を動かしてみると一度勉強しようとして書いた前半部が結構難しいことをやろうとしてたんだなということにも気が付きます.そりゃ実務向けの書籍だからそうだろうという感じではあります.

人の役に立つところまで知見をためて力にするという目的で勉強するとなると,どちらにせよ「1回じゃやったことを確実に覚えてない」とか「真に肝心なところを捉えられていなくて無駄足を踏んでいる」とか「基本からやるができていない」とか,色々足りないところを意識しなければならないのでしょうが,今日はもう寝る時間なので寝てこれは明日以降の課題にしようと思います.この感じだといい文章を書くためにブログを書くという目的はしばらく優先できそうにないですね.

追記

【Nginx】リバースプロキシサーバ構築 - Qiita

こんなの見つけました。もしかしてそろそろ自分でもできるのでは。

dockerのバインドマウント時のエラー

dockerの勉強中に以下のエラーが出ました.

コンテナ上でnginxを起動してhtmlファイルをホストOSから覗けるようにするだけの基本的なものです.エラーログ読む根性がほしいけど難しいものやるより簡単なものから数こなしたほうがつくのでは?抱え込んで簡単に心が折れてても一生独学成功しなくないか?というわけでメモです.ぐぐったらここにたどり着いた的な何かに今後なってくれると嬉しいんですが,応急処置に応急処置を重ねてる姿勢だけはくれぐれも真似しないでください.

PS C:\Users\ikeda\docker_tutorial\html> docker run --name first-nginx -v C:\Users\ikeda\docker_tutorial\html\:usr\share\nginx\html:ro -d -p 8080:80 nginx
docker: Error response from daemon: invalid volume specification: '/run/desktop/mnt/host/c/Users/ikeda/docker_tutorial/html:usr\share\nginx\html:ro': invalid mount config for type "bind": invalid mount path: 'usr/share/nginx/html' mount path must be absolute.
See 'docker run --help'.

"mount path must be absolute."が鍵.バインドマウントを行う際には絶対パスを指定する必要があるとのこと.これを見ると確かに/usrがusrになっていて相対パス扱いされています.ダブルコロンとスラッシュが逆ですね.

修正しましたが次のエラーが出てきました.

docker: Error response from daemon: driver failed programming external connectivity on endpoint first-nginx (4311e420ab2e3b1a826c6dc1642e1ce581f0b6bc9586656c1838f2bdf603ebde): Bind for 0.0.0.0:8080 failed: port is already allocated.

8080番はもう既に使用済みで使えないとのこと.これは個人的に別のコンテナを立てている為です.一旦8081番にします.

修正しましたが次のエラーが出てきました.

docker: Error response from daemon: Conflict. The container name "/first-nginx" is already in use by container "a436be8a7f358bc6b0f47446787d9071d33b0327db983f44b42ebaee970fb888". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

first-nginxというコンテナ名ですでに一つコンテナを作成しているので,コンテナを削除するか別名で生成しないとコンフリクトしますよと書いてあります.別名でコンテナを生成します.second-nginxにします.

PS C:\Users\ikeda\docker_tutorial\html> docker run --name second-nginx -v C:\Users\ikeda\docker_tutorial\html:\usr\share\nginx\html:ro -d -p 8081:80 nginx
6502055431b93e3a6110b9236349dc9a55643e34f24a58ac184473ebde54957b
PS C:\Users\ikeda\docker_tutorial\html>

新しいUUIDでコンテナが生成されました.

f:id:frazz:20210407225647p:plain

でもデフォルトのindex.htmlが表示されていますね.自分で書いたindex.htmlはどこに行ったのでしょうか.本来はこれが出力されるはずです.

PS C:\Users\ikeda\docker_tutorial\html> ls

    ディレクトリ: C:\Users\ikeda\docker_tutorial\html

----                -------------         ------ ----
-a----       2021/04/07     22:04            100 index.html

PS C:\Users\ikeda\docker_tutorial\html> cat .\index.html
<!DOCTYPE html>
<html>
<body>

<h1>MyFirst Heading</h1>
<p>My first paragraph.</p>

</body>
</html>

powershellからコマンドを書いていて,パスの記述をバックスラッシュで統一しているからバインドマウントに失敗してるんじゃないかと思い,後半のコンテナ内のパスの部分を通常のスラッシュに変更します.

PS C:\Users\ikeda\docker_tutorial\html> docker run --name second-nginx -v C:\Users\ikeda\docker_tutorial\html:/usr/share/nginx/html:ro -d -p 8081:80 nginx
docker: Error response from daemon: Conflict. The container name "/second-nginx" is already in use by container "6502055431b93e3a6110b9236349dc9a55643e34f24a58ac184473ebde54957b". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

あー.今作ったコンテナの名前だから被ってるってまた言われてしまいました.消します.

PS C:\Users\ikeda\docker_tutorial\html> docker rm 6502055431b93e3a6110b9236349dc9a55643e34f24a58ac184473ebde54957b
Error response from daemon: You cannot remove a running container 6502055431b93e3a6110b9236349dc9a55643e34f24a58ac184473ebde54957b. Stop the container before attempting removal or force remove

起動中のコンテナは停止してから削除するか強制削除してくださいとのこと.停止して削除します.

PS C:\Users\ikeda\docker_tutorial\html> docker stop 6502055431b93e3a6110b9236349dc9a55643e34f24a58ac184473ebde54957b
6502055431b93e3a6110b9236349dc9a55643e34f24a58ac184473ebde54957b
PS C:\Users\ikeda\docker_tutorial\html> docker rm 6502055431b93e3a6110b9236349dc9a55643e34f24a58ac184473ebde54957b
6502055431b93e3a6110b9236349dc9a55643e34f24a58ac184473ebde54957b

改めてパスを修正してコンテナを作成します.

PS C:\Users\ikeda\docker_tutorial\html> docker run --name second-nginx -v C:\Users\ikeda\docker_tutorial\html:/usr/share/nginx/html:ro -d -p 8081:80 nginx
640061cfc85ca52b5bfc47bc783380a9c022f68759f23ad2cc993d1b12b39fc1

できた.想定通りです.

f:id:frazz:20210407231307p:plain

しょーもないことで悩んで時間が浪費されて心が折れるみたいな現象の打開策として書き物するってのはやはり一定の効果があるようです.わからないことを言語化して基本から押さえるっていうのが最近の目標です.いろんな診断やっても「あなたに難しいことを計画的に成し遂げる根性はないです」みたいなことばっかり書いてあって辟易してるので,しばらくこれでいってみようと思います.