概要 †
- なぜ?への探究心、そして、再発防止のために何をすべきか?
- ガシャガシャやらずに、常にロジカルに戦略的に。何個かバックアッププランを持っておくように。
- RFC=仕様書読め
目次 †
勉強すべきこと †
- 優先度つけて(system designがかなり大きい割合を持っていそう)
- Design a database to support a valet parking system.
- i-nodeってなに
- シェルスクリプトをちゃんと学ぶ
- 名前解決するレゾルバがDNSよりも優先するローカルにあるhostsファイル
- BigQuery?
- GSuiteのサーベイ
- syslogdとは
- OAuth, basic auth
- ブロードキャストとかに関してもっときちんと
- 子が親殺したらどうなる?何のためにやる?
- httpsのローカルのチェックってなにやるの?
- buffered IOとunbuffered IOの違い
- プロセステーブル
- ゾンビ多いと何が問題?どう検知?どう直す?
- なぜUDPは1対多でOKと言えるのか
- パケットのルーティングの仕組み(トップレベルルータに流すのではなく、知らなかったら上流に流している。MACアドレスとの関係は?)
- バーチャルホスト
- VPSとは?
- NASとは?
- ARPとは?ブロードキャストとは
- TCPって具体的にデータをどうやって送ってるの?
- パケットのルーティングは、トップレベルルータに流すのではなく、知らなかったら上流に流す。(どうやって勉強するんだ)
- 孤児プロセスってどうやってinitに引き取られるの?引き取られたあとはどうなるの?
- curlでどうやってHTTPリクエストを送るの
- ポート
- systemctl start dockerのsystemctlとは
- デーモンとは
- ストリームとは
- topとかいろいろ復習
- TCPのリスニングってなに
- tomcatとは https://knowledge.sakura.ad.jp/14427/
- ポートフォワードとは
- SQLかるく復習
- システムデザイン
- ネットワーク系はこれが良さそう
- クッキーってなに
- SSHのデバッグ
- どうやってSMTPは繋いだパソコンを認識しているの?
- DNSのやり取り
- routeの解析方法
- RESTAPIの使い方
- POST通信とは?
- nginxとは
- どうやってHTTPの内容を盗み見るの?
- Webサーバの挙動というか順番は?
- HTTPの標準化についてW3C以外のものとは?そもそもW3Cとは?
- TCP/IPとは
- IP/UDP/ICなんとかって何がどうちがうんや
- TCP/IPでどうやって次のMACアドレスを得るの?誰が管理している?
- ゾンビプロセス、どうやって検知・排除するの?
- IPv6について
- DHCPの設定はどこ?-
- プロキシのキャッシュを逃れてサーバにアクセスする必要があるときはどうする?
- SSl http://wa3.i-3-i.info/word116.html
- SSL系のデバッグどうするん
- killした後の話
- Unix hanbookをよめ
- システムコール
- docker
- アパッチ
- systemd
- ポート
- どうやってHDDを変えるの?ディスクフルの対応方法は?
- トラブルシューティング系のシミュレーションしとく
- sigkillが失敗し、sigtermが成功するようなケースとはなにか?
- OOP
- IP v6
参考 †
リンク †
キャッシュ †
- App-Cache-DBのつながりの時、AppがDBに直接読み書きするのではなく、Cacheを用意することによって定数倍高速化するテク
- Cacheはメモリ、DBはディスクなので速度が1000倍くらい違うことが重要
- 方式
名前 | やること | メリット | デメリット |
ライトスルー | 毎書き込み時、同期的にCache, DBに書き込み | 同じデータの読み書きが高速に行われる場合良い。実装楽。 | 毎書き込みのレイテンシ遅い |
ライトアラウンド | 毎書き込み時、同期的にDBに書き込み。読込で失敗したらDBからキャッシュにのせる | ライトスルーよりはレイテンシ少ない。 | レイテンシ遅い。同じデータの読み書きが高速に行われる場合は悪い。 |
ライトバック | 毎書き込み時、同期的にCacheに書き込む。暇を見つけて非同期的にDBに書き込む | 毎書き込みのレイテンシ早い。正常系のパフォ最強 | Cacheが落ちるとデータがロスるのでレプリカ作っておいて多重化しないといけない。実装大変 |
Unix †
デバイスドライバ †
シェル †
- 全てのシェルは新たにプログラムを起動するときに0, 1, 2のファイルディスクリプタをオープン
- それぞれSTDIN_FILENO, STDOUT_FILENO, STDERR_FILENO
- stty -aで、Ctrl-Cみたいなものでどんなシグナルを送れるかを検知できる
- ttyコマンドで自分の端末名がわかる
- 端末名がわかると、psコマンドでどの端末から立てられたプロセスなのかがわかる
- linuxに直接接続している場合はtty, そうでない場合はptsとなる
- デーモンは?というやつで、標準入出力・エラー出力が全部/dev/nullに繋がれる
- ちなみに、GUIから起動した普通のターミナルはtty…ではなくpts。多分本当に黒画面のやつがttyなんやね
リダイレクト †
カーネル †
- プログラムの流れ
- カーネル→シェル→アプリケーション
- カーネル→アプリケーション
- カーネル→システムコール→アプリケーション
- /etc/passwd
- ユーザ名・パスワード・ユーザID・グループID・コメント・ホームディレクトリ・シェル
- ところでシェルのbashはbourne again shell, ちなみに元のbashはbourne shell
システムコール †
- カーネルの昨日を使うためのC言語の関数(manで見るときは2)
- 例えば、sbrk(2)はメモリ割り当てをする。malloc(3)を実装するのに必要
入出力 †
- unbuffered I/O
- open, read, write, lseek, closeの5つ(標準入出力ルーティンではない、ファイル書き込みたち)
- open, openat ファイルをオープンする。openatはfdからの相対パスでのオープン
- creat 新規ファイルの作成(open(path, O_WRONLY | O_CREAT | O_TRUNC, mode)と同値。WRONLYなのでつらいね)
- lseek openされたファイルは、ファイルオフセットという位置を管理する
- これをセットしたりいじったりする。シーク不能ならば-1を返す(パイプ、FIFO、ソケットに対してはシーク不能)。
- ファイルサイズを超えた位置にシークすることは許されていて、writeするとシークしていない部分はちゃんと0で読めて、しかもディスクブロック数は抑えられるらしい(hole, 間隙)。
- read 要求バイト数を指定して、ファイル/ネットワーク/パイプ/FIFO/レコード型装置から「読む」。30文字しか入っていない状態で100バイトを読もうとすると、readはまず30文字を返し、次に読むときに次に0文字を返すらしい。
- 同じファイルを複数のプロセスからいじる場合、lseek->read, writeがアトミックである必要があるが、それはpread, pwriteで保証できるらしい(ちなみに、appendは自動的にatmicなので気軽に使って良い)
- fcntl 初めにopenした時にO_WRONLYといったが、あとでappendに変えたい、みたいなことができる
プロセス †
構造 †
- プロセスはinitプロセスを根とした木構造
- initプロセスの番号は常に1
- pstreeを使うとプロセスの木構造を見ることができる!
- プロセスグループIDとは、initの直接の子cの部分木をグループcと名づけている
- ゾンビプロセス
- 親が先に死んだプロセスは孤児プロセス
- 子プロセスが終わったのに親プロセスがwait()してくれなかったプロセスはゾンビプロセス
システムコール †
- プロセス制御はfork, exec, waitpid
- spawn=fork+exec
- execは7種類ある
- fork(2) [#hc7c3c0c]
- 自分のプロセスコピーを作る
- プログラムポインタの位置まで同じプロセスがその時点で作成される。キモい。
- forkの返り値によって親か子かがわかるという仕様
コマンド †
- psコマンド
- -eo pid,pgid,command によって、プロセスID, プロセスグループID, コマンドのタプルが得られる。
- ps auxがよく使う(情報量マシマシ)
STAT:プロセスの状態
R:稼動中
S:一時停止中
D:停止不可能で一時停止
T:終了処理中
Z:ゾンビプロセス(すでに実体は無い)
W:実メモリ上に無くて,スワップアウトしている
N:nice値
パイプ †
- 入力したものを出力するだけの存在、まさに「パイプ」
- これクソわかりやすいパイプの説明
- 要するにdupは開いてるファイルディスクリプタを入力して、閉じてるファイルディスクリプタのうち最小のものに帰る
シグナル †
- killコマンドで送れる
- プロセス番号とシグナル番号を指定すると、プロセスがシグナルをコールバック的にtrapできる(trap=シグナルのコールバック設定)。
- C言語では、signal(3)関数
- シェルスクリプトでは、trap 'command' [signal id...](これでEXITシグナルをtrapすると、プログラム終了時にメッセージを出すとかtmpファイルを消すとかができる)
- SIGKILLだけはtrap不能!(強制終了なので)
- シグナルは何と言うか実装指針であって、別にsigintを受け取って終了しないような実装をしてもよい(sigkillだけは特別!!)
- 例えば、ddコマンドはSIGUSR1を受け取って進捗状況を表示する
- kill -lで全シグナルをチェックできる。よく使うのは以下。
番号 | 名前 | 説明 |
0 | EXIT | プロセス終了時に、プロセスが自分自身に対して送出する |
1 | HUP | XWindow のクローズや、デーモンのリセットに使用されるハングアップシグナル |
2 | INT | Ctrl+C や Del キーを押したときに発生する割り込みシグナル(Ctrl-Cとkill 2は実はちがくて、Ctrl-Cはその子にも全部SIGINTを送る) |
3 | QUIT | Ctrl+\ を押したときに発生するクイットシグナル |
9 | KILL | プロセスを強制終了するためのキルシグナル。強制終了なので当然、trap はできない。 |
15 | TERM | プロセスを終了させるための終了シグナル。kill コマンドはデフォルトでこのシグナルを使用 |
18 | CONT | プロセスに再開を通知(fg) |
19 | STOP | プロセスに中断を通知 |
20 | TSTP | プロセスにサスペンドを通知する。(Ctrl+Z) |
- 基本Ctrl-CはSIGINTだが、全ての子プロセスに対してSIGINTを送っている。つまり、親だけではなく子も全部死ぬ。
- 一方、kill -SIGINTをすると、親だけ死ぬ。子は孤児となってinitプロセスに引き取られる
ファイルシステム †
- 実は/とnull文字以外の文字は全て使えるが印字可能な文字だけを使いましょうね
- i-node
- i-node?
- ディレクトリは、ファイル名→iNodeを管理
- 1つのinodeに対して複数のファイル名を割り当てることができる(ハードリンク、lnの-sオプションなし版)
- シンボリックリンクはパスが書かれてるだけのただのファイル
- i-nodeの個数制限がある!
- ディスクは有り余っていても、i-nodeが枯渇してリソースフルになる可能性もある
時間 †
- timeコマンド
- real, usr, sysという3つがある。
- realは実時間で、他のプロセスが立ち上がっていたりしたら多くなる(クロック時間)
- usrはまさにそのプロセスが使った、ユーザ空間での時間(ユーザCPU時間)
- sysはまさにそのプロセスが使った、システム空間での時間(システムCPU時間)
man †
- manのあとの数字は、とりまコマンド(1), システムコール(2), C言語関数(3), 設定ファイル(5), 管理者用コマンド(8)だけ覚えとく
- 特に5を忘れがち。例えばman crontabとするとcrontabコマンドが表示されるが、SEE ALSOにcrontab(5)と書いてあるのでそれを見ると良い
man 1 ls # コマンド
man 2 chmod # システムコール
man 3 sqrt # C言語の関数
man 3 errno # C言語の変数
man 5 crontab # 設定ファイル
man 5 passwd # /etc/passwd
man 8 syslogd
errno †
- じつはEACCESとかENOENTとかをerrnoに突っ込むとperrorの表示が変わる
- char* strerror(errno_t)みたいな関数もある(perrorのあとに出てくる文字列を返す関数)
- ちなみにperrorにargv[0]を渡すのが慣習らしい(パイプしまくった場合にどこでミスったかわかるので)
- errnoには致命的な奴と非致命的な奴がある
- 致命的なものはログはいて終了するしかないOAuth, basic auth
- 非致命的なものは、待って再試行(待つ時間をだんだん長く=エクスポーネンシャルバックオフ)をするのが典型的な回復方法。もちろん回復するとは限らないが
ユーザ・グループ †
- /etc/groupにグループが定義
- /etc/passwdにユーザが定義
- ルートユーザはユーザID 0
- 補助group idでは最低8個の補助的なグループがある。/etc/groupをみると、各グループに補助的に入っているユーザ名が羅列されている
- C言語ではgetuid, getgidを使ってユーザIDとかを取得する
シェルスクリプト †
ネットワーク †
トラブルシューティング †
サイトに繋がらない †
- URL間違っていない?
- IPアドレスはります
- ping, tracerouteは、ICMPをブロックしてるのも多いから、あまりIP直だたきだけではだんていできない、なぜならIP直でつながらないのは普通、ホスト名とセットじゃないとtrapがあるので。この知識はでもサーバ側で得られるはずなので
- ネットワークの状態を把握
- とりまtraceroute、どこがミスってるか?
- まあそんなことはなさそうだがDNSなど、最近変えたとかでない限りは
- 他のサイトは?
- Windowsは?
- ネットワークは局所的?
- 内向き?外向き?
- ありがち問題
- Wifiつながらない(DHCP)
- ホームページが見れない
- ssh繋がらない
- ハードディスクフル
- i-nodeフル
- ウイルス
- ポートが空いていない
- 他のブラウザでは?(ブラウザがぶっ壊れている、どういう状況?)
- キャッシュ
- メモリフル
- ステータスコード
- 届く?ping
- 届かない→線抜けてないか?→traceroute。止まっている場所を見つけたら、(1) ルータ設定が間違っていて知らないと言われて (2 )
- 通信が上手く行っていないのは、ネットか、相手のサーバが動いていないかを切り分け
- リバースプロキシで多重化されている可能性
1.他のパソコンから、そのホームページを見ることができるか
→見られる:あなたのパソコンの中の何かがおかしい
→見られない:見ようとしたホームページがおかしい[END1]
2.自分のパソコンの他のブラウザから、そのホームページを見ることができるか
→見られる:エラーの出たブラウザがおかしい
→見られない:あなたのパソコンの中の何かがおかしい[END2]
3.ウィルスセキュリティソフトを無効にしたら見ることができるか
→見られる:原因はウィルスセキュリティソフト。解決、おめでとう[END3]
→見られない:ウィルスセキュリティソフトは悪くない
4.cookieや一時ファイルを消したら見ることができるか
→見られる:原因はcookieか一時ファイル。解決、おめでとう[END4]
→見られない:よく分からん[END5]
- この辺、dotファイル作りたい
- 400エラー->あなたのパソコンの中の何かがおかしい [label="他のパソコンから、そのホームページを見ることができる"]
- 400エラー->見ようとしたホームページがおかしい[END1] [label="他のパソコンから、そのホームページを見ることができない"]
ドメイン †
- 人がIPが読みにくいというただそれだけの理由で生み出された存在
- 右が大きい。地区.市.県.国、みたいな
- 一番右からトップレベル・ドメイン、第二レベルドメイン、…
- トップドメインの分類
- 汎用トップレベルドメイン (gTLD)=どこの国の人でも使っていい、使用用途依存のドメイン
- 誰でも取得できるもの(.com)
- 条件を満たす必要があるもの(.govはアメリカ政府用とか)
- 国別コードトップレベルドメイン(ccTLD)=国依存のドメイン
リバースプロキシ †
- 目的は、負荷分散と身元の隠蔽
- 実体はapacheとか
- 例えば、443ポートに来たHTTPSリクエストをビデオサーバにポートフォワーディングしたい場合、まずリバースプロキシが受け取る。そして、GETリクエストのURLをみて/videoserverだったら、ビデオサーバの8000番ポートにポートフォワーディングするなど。
https †
- ローカルと、認証局に問い合わせの二段チェックをする
- サーバは証明書を誰かに発行してもらう必要がある
- HTTPSサーバは、初め証明書を誰かに買うなりなんなりしてもらわないといけない。
- 証明書を発行する権利がある人がいるので、その人から買うなり何なりする。
- let's encryptを使うとただで使えるが、何故か3ヶ月で執行するので更新する必要がある。
ステータスコード †
- ソフト404エラー
- ブラウザ上ではそのページが存在しない旨のメッセージが表示されてるのに、ステータスコードとしては404や410を返していない(200 OKが返されている)パターン
- GoogleBot?がクロールのリソースを無駄に消費することになりますので、存在しないページにアクセスしたときはステータスコードとして404もしくは410(gone)が返されるように正しく設定するべき
ソケット †
IP †
TCP/UDP †
- TCPは検品
- パケットは小出しにするので、10個口のパケットが「1->8->3->4...->2」とへんな順番で届く可能性がある。これを整理し、ダブリ・破損・欠損を再配達依頼するのがTCP
- TCPとUDPはOSIのレイヤ4(トランスポートプロトコル)
- TCPは運送元・運送先を互いに認識するために、
- 3-Way Handshake (SYN,SYN-ACK,ACK) -> Establishedというスタイルを取る
- SYNchronize-ACKnowledgement
- TCPは荷物を小分けにして送る運送業者。順番が変わったりしても大丈夫。渋滞したら送るスピードを調整する
- 欠けて困るデータはTCPで送り、ちょっとくらい欠けても何とかなるデータはUDPで送る
- 印刷とか音楽のストリーミング配信とかはUDPですね。1ドット欠けたり、何万分の1秒途切れたりしてもそんなに気にはならない。むしろチンタラやって止まる方が困る
- TCPは1対1の通信で使えます。UDPは1対多の通信でも。
- TCPの理解が必要なのは、
- アプリケーションのパケットレベルのデバッグをする場合。 具体的には、tcpdump の出力を解析したりする場合。
- ネットワークの障害調査を行う場合
- ファイアーウォールの設定をする場合
- tcpdump
- どういう問題を解決したいか?
- 謎のパケットが飛びまくっていてクソ重い場合
- DHCPが二台会ってブロードキャストがなんかヤバイ時
- ナマのログだとヤバイので、Wiresharpとかを使ったほうが良い
- LISTENINGとは、要するに、「今私はサーバとして動いています」ということ
DNS †
- IPとドメイン名を変換する
- 2種類
- DNSキャッシュサーバ=フルサービスリゾルバは、「カンペを見て(キャッシュ)」「なければ他のDNSに聞きに行く」
- 初めに聞きに行くやつがDNSルートサーバ(トップレベル・ドメイン単位でしかみてない)
- 権威DNSは、「IPアドレスを返す」。こいつは他のDNSには聞きに行かない
DNSポイズニング
はじめの問い合わせの返答の数百ミリセカンドの間に質問番号を総当たりして嘘のIPを覚えさせる
権威DNSサーバさんは、普通、同じようなやつが2台同時に動いています。
メインのやつがプライマリ、そうじゃないのがセカンダリ
人間から見るときの差は、セカンダリはプライマリからゾーンファイルの設定をもらってくるという点。
権威DNSサーバは、ゾーンファイルにしたがって、以下の4つ行う
- トンチンカンならエラーを返す
- 自分が知っているならそれを返す
- 知っているサーバを知っているならそれを返す
- 知らないなら知らないと言う
よく思い浮かんでしまう疑問:グローバルIPアドレスと内部のIPアドレスがあるが、DNSは両方指定しないといけないんじゃないの?
答え:NASがポートフォワーディングして、内部の適切なサーバに繋いでくれているからOK
コマンド †
- nslookupはインタラクティブにできてうれしい
- nslookupでいうnon-authoritativeとは要するに
named †
- レコードMX
- ドメイン->メールサーバホストの変換を行う
- 優先度がある(数字が小さいと優先度高い)
- DNSレコード
- NSレコード: 管理範囲のDNSサーバの名前を書く。他のDNSサーバさんに管理を委託していれば委託先のDNSサーバさんの名前を書きますし、委託していなければ自分の名前を書く
- MXレコード: メールサーバの場所
- Aレコード: そのたもろもろ
- わからないものが会った場合は、即刻(!)ルートサーバ(世界に13個しかない)に問い合わせる。ルートサーバは「jpとかcomとかが末尾に来たらこれに問い合わせろ」という謎のDNS設定がなされている。
DHCP †
- LANにコンピュータをつなげると、コンピュータがまず泣きわめく(?)
- DHCPでどうDNSを知るか
- /etc/resolve.confのnameserverはDHCPから持ってくる
- nameserverはIPである必要があるように思えるが、/etc/host.confか何かに既知としてあるならば別にこれでも良いね
HTTP/HTTPSサーバ †
- ブラウザはウェブサーバに依頼をしてウェブページを渡してくる
- コード
- 400 なんかよくわからんがおかしい(デバッグめんどい)
- 405 許可されていないメソッド(GET, POSTなど)でアクセスしようとしたから無理
- 500番台 Webサーバ側のエラーだからクライアントはどうしようもねえ
- HTTPリクエストメソッド(いっぱいあるがGET, POSTだけ覚えておけば困らない)
- GET
- POST
- PUT, DELETE, HEAD, CONNECT, OPTIONS, TRACE, LINK, UNLINK
- HTTPリクエスト->HTTPレスポンス
- HTTPリクエストは以下のようにできている。
- リクエストライン
- ヘッダ
- [改行]
- メッセージボディ(大事)
POST /search.html HTTP/1.1\r\n
Host: wa3.i-3-i.info\r\n
Connection: keep-alive\r\n
Content-Length: 38\r\n
Cache-Control: max-age=0\r\n
Origin: http://wa3.i-3-i.info\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: うんちゃら\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Referer: http://wa3.i-3-i.info/index.html\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: ja,en-US;q=0.8,en;q=0.6\r\n
\r\n
q=test&submitSearch=%E6%A4%9C%E7%B4%A2
- GETはURLにデータを明示的にくっつけてサーバに送る方式
- POSTはURLを変えずにデータをサーバに送る方式
- 具体的にはHTTPリクエストのボディ部にくっつくので、ブラウザの履歴とかにならない(それでもHTTPは盗み見可能なのでパスワードとかはHTTPSじゃないと送っちゃダメ)
- HTTPレスポンスは以下のようにできている。
- HTTPステータスライン(ステータスライン)
- HTTPレスポンスヘッダ(ヘッダ)
- [空行]
- HTTPレスポンスボディ(レスポンスボディ)
- GETとPOSTの差
- 「GETメソッドはPOSTメソッドと比べて渡せる情報量が少ない」
- 「GETメソッドは渡した値が履歴に残る」
- プロキシという仕組みではURLを記憶しておくので、場合によっては全然関係無い別の人にも渡した値を知られてしまいます
- 最悪の場合は、検索エンジンさんに載ってしまって、全世界の人に知られてしまうかもしれません。
HTTP/1.1 200 OK\r\n
Server: nginx\r\n
Date: Tue, 11 Jul 2017 09:23:07 GMT\r\n
Content-Type: text/html\r\n
Transfer-Encoding: chunked\r\n
Connection: keep-alive\r\n
\r\n
<!DOCTYPE html>\r\n
<html lang="ja">\r\n
<head>\r\n
\t<meta http-equiv="content-type" content="text/html; charset=UTF-8" />\r\n
\t<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">\r\n
\r\n
\r\n
\t<meta name="keywords" content="\350\276\236\345\205\270,IT,\347\224\250\350\252\236,\345\210\235\345\277\203\350\200\205">\r\n
\t<meta name="author" content="Makoto Sasaki">\r\n
\t<meta name="copyright" content="Copyright PCS">\r\n
\r\n
\t<meta name="application-name" content="\343\202\217\343\202\217\343\202\217IT\347\224\250\350\252\236\350\276\236\345\205\270"/>\r\n
\t<link rel="stylesheet" href="css/style.css?ver=00109">\r\n
\t<link rel="stylesheet" href="css/search.css?ver=00109">\r\n
\t<script src="./js/jquery-1.7.2.min.js?ver=00109"></script>\r\n
\t<script src="./js/common.js?ver=00109"></script>\r\n
</head>\r\n
<body>\r\n
(中略)
</body>\r\n
</html>\r\n
\r\n
- プロキシサーバ
- HTTPリクエスト・レスポンスを代行してくれるサーバ
- メリット
- 身元を隠せる
- キャッシュによりホームページアクセスが早くなる可能性(同じネットワーク上の他の人がそのURLを一回見たかも知れない。デメリットはTTLと更新タイミングによっては、最新版を持ってきてくれない可能性があること)
- ネットワーク上の人のアクセス記録を一元管理できる
- appachには意味不明な攻撃みたいなものを受けるとtrapというファイルを作ることがある。例えば、GETみたいに書くべきところに"is-3"とか書いてあるいみたいな意味不明な奴とか、IPと共にヘッダにホスト名がきちんと書いてあるはずなのに書いていないとか。
スプリングフレームワーク
Java
現行これが最強
HTTPリクエスト・レスポンス †
304はif-modified-since-headerより古かったから更新しなくて良いよというやつ。
chromeのdevtoolのNetworkでリクエストが見える。ステータスコードが薄くなっているのは、ブラウザのキャッシュから取ってきたという意味 (Provisional headers are shownは実際に取ってきた最後のリクエスト) どうやら、更新ボタンを押したその部分はちゃんと聞き直しに行くが、それが304とかだったら更新ボタンを押したページに依存するような部分はキャッシュから持ってくるっぽい。
APIの叩き方 †
- 基本なんか叩くときは、
- GETとか書いて
- URL書いて
- ボディ書いて
- ヘッダに認証書いて
- 投げる
RESTAPI †
- URLは動詞を含まず、複数形1/番号1/複数形2/番号2/複数形3/番号3のようにリソースを指定し、そこへの操作はHTTPリクエストで指示するという方法
- ルール
- 長くするな
- 同じURLにDELETEをかけても1レコードしか消すな
- PUTしないかぎりGETの返答を変えるな
- xmlかJSONで返せ。など
- 動詞部分はHTTPリクエストで指定
- GET → 取得
- POST → 新規作成
- PUT → 更新
- DELETE → 削除
デバッグ †
- デバッグ方法
- curlでHTTPリクエストを投げたり受け取ったりすることができるコマンド
- ブラウザでHTTPリクエストを投げることができるのがpostman。これはchrome拡張
ログ解析ツール †
VPS †
- 仮想専用サーバ
- 1台のコンピュータを複数の人で使うけど、利用者ごとのスペースは独立している形態
NAS †
- あるネットワークへの門番となるコンピュータがネットワークアクセスサーバ(NAS)
バーチャルホスト †
Etherealを使うと、自分が送ったパケットと受け取ったパケットの中身を、直接見ることができます。そのため、これまで絵に描いていたパケットの中身を、直接、確認することができます。
・すべてのやりとりが見えますか?
これまでに紹介したもの、例えば、ARPを使ったMACアドレスの取得、DNSの名前解決、Webサーバアクセスなどは、いずれも上位レイヤから下位レイヤまで、すべて見ることができます。
ARP †
- ブロードキャストを使って、MACアドレスを突き止めたいIPアドレスを「叫んで」います。ちなみにイーサネットの場合は、送り出すデータのMACアドレスをFF-FF-FF-FF-FF-FFに指定すればブロードキャストになります
典型的な問題 †
問題 | 僕の解答 | 勉強したこと | 備考 |
ウェブサイトが落ちている。sshできる。どうなおす? | sshできているということは、ルートは大丈夫、繋ぐことはできる。ウェブサイトが落ちている可能性が濃厚。apacheを再起動してみたい。 | なぜ?への探究心、そして、再発防止のために何をすべきか?システムのオーバーロードの可能性。なぜオーバーロードしたのか?攻撃・あるいは慢性的な過負荷。慢性的過負荷に関してはリバースプロキシを用いて、多重化をして負荷を減らす必要がある。ルートフラッピング。リソースフルに関しては、まずHDDやi-nodeなどの対症療法的な設置を一時的な対応策とした上で、運用でHDD fullをツールで検知するような自動検知システムを組む。 | |
パスワードが通らないんだけど | 普通にsuでパスワードを変更するだけじゃダメなん | | あとで |
優秀なシステム管理者たる資格は? | 分析的・好奇心・コミュニケーション力 | | |
OSの知識をネットワーク最適化のためにつかった経験は? | ロボットへユーザがログインする必要がある場合のサポートかなあ | | |
複数のタスクがあった時、どうやって仕事を優先付けますか | 影響人数が範囲が大きいものが優先。あとはビジネスの大きさが大きい物が優先。 | | |
困難なプロジェクトでチームと自分一人とどっちで思いつくほうが好きですか | チームだよね、そりゃ。困難だし。実際ほとんどずっとネットで人を集めてやってきたし。 | | |
問題が解けなかった時どうしましたか | まず解く必要があるかを吟味する。これは研究テーマなどでは重要。次には代替手段があるかどうかを考える。本当に解く必要があるならば、遠回りな解をまず出して、その後改善する。次に、ビジネス的観点から困難であり、行うと工数が増大しすぎることを顧客に説明することもあった。フリーランスで一人でやっており、解決可能な友人がいなかったときはそうした。そうでない場合はチーム相談し、一丸となって頑張る。無理で人を集められなかったら無理。 | | |
どう自分のスキルを最新技術にキープしますか | ユーザ, devtools, 問題解決など、技術的な関連業務で最新の知識を得る。会社が閉塞的ならば、インターネット上での勉強会を行うこともじさない。 | | |
HTTPとは。ポートは? | Hyper test transfer protocol (80)。HTTPリクエスト、HTTPレスポンスによる通信方法。 | | |
a/23にはIPがありますか | 2^(32-23)=512だが、ホスト部のビットを全て「0」にしたものがネットワークアドレス、ホスト部のオクテットを全て「1」にしたものがブロードキャストアドレスなので、510が答え。 | | https://www.aelius.com/njh/subnet_sheet.html |
| | | |
生まれた疑問 †