Comments_on_tcp_ip_network_commands

TCP/IP & ネットワークコマンド入門の大事なところをメモっていく ncコマンドについて 個人的に、最近ncコマンド使う機会が増えてきて、この本でも結構語られているので、使い方くらいはメモっておきたい ncコマンドはTCPもしくはUDPのコネクションを貼ってくれるコマンド。送信するビット列は完全に自分で選ぶことができる。 以下のコマンドでサーバをTCPで起動できる。 -l はlistenの略で、リッスンしている、つまりサーバです nc -l 55555 以下のコマンドで、ncサーバとコネクションを貼ることができる nc <ip addr> <port> よくあるncコマンドの使用例 使用例としては、あるサービスのクライアントがどんな感じでbit列を送ってくるのかをサーバ側から可視化するときに使うイメージが強いな。 例えばUDP通信の代表例であるDNS resolutionね。こんな感じです。 ローカルホストで以下のncサーバを立てる # nc -u -l 1053 > query_packet.txt こいつは、1053万ポートでUDP通信を待ち受けている。で、受け取ったパケットをquery_packet.txtにリダイレクトしている。 このサーバに対して、以下のdigコマンドを送ることで、DNSクライアントがどのようなパケットを送信しているかがわかる。 dig +retry=0 -p 1053 @127.0.0.1 +noedns google.com ここからは、追加での遊びですが、こんな感じで、ncサーバで受け取ったパケットを今度はncクライアントに流し込んで読み込ませることもできると。おもろいっすね。 nc -u 8.8.8.8 53 < query_packet.txt > response_packet.txt ちなみに、以下のコマンドでhexでパケットの中身が見られるようになります。 hexdump -C query_packet.txt sshクライアントの動きをncサーバをたててみてみる nc -l 10022 > clien_packet.txt ssh localhost -p 10022 ray@delta:~$ hexdump -C clien_packet.txt 00000000 53 53 48 2d 32 2e 30 2d 4f 70 65 6e 53 53 48 5f |SSH-2.0-OpenSSH_| 00000010 38 2e 39 70 31 20 55 62 75 6e 74 75 2d 33 75 62 |8.9p1 Ubuntu-3ub| 00000020 75 6e 74 75 30 2e 31 30 0d 0a |untu0.10..| 0000002a みたいな感じで見られてりして、マジで面白いわけですね。はい。ってことで、ncコマンドはガチで便利だし、知っておいた方がいいって話です。 ...

August 18, 2024 · 1 min · 200 words · Me

Comments_on_how_the_internet_works

いい本である あのね、アプリとか、ネットワークとか、サーバとか、そのへんがある程度詳しくなってから改めて読むと、めちゃめちゃ整理されていて、めっちゃためになる。 最初にかんたんに全体像を説明しておくか。ネットワークの。 アプリがある。アプリは、システムコールを使ってデータの送信をosに依頼する。例えば、HTTPもアプリだよね。アプリケーションプロトコル。 で、アプリから依頼されたosの中で一番最初にデータを受け取るのがTCP(UDP)。こいつは、一番最初の通信経路の確立、データの分割、再送信、などを担う。TCPヘッダーには色々入っています。で、分割されたデータをパケットっていうんですね。 HTTPのヘッダーとか、ボディーとかも、TCPから見るとバイトの羅列でしかないってことはめっちゃ大事なポイント。 で、TCPは更にIPに送信を依頼する、というわけですね。 IPで意外なのは、IPはIPヘッダーをつけるだけでなく、MACヘッダーもつける、ということです。ここは大事。マックもつくんです。送信相手の見つけ方なんだけど、まずは送信先のIPを見つけるんだよね。そのときにはルーティングテーブルを見るんですね。linuxだと、 route コマンドで見られます。で、どこに送信すればいいかがわかると。 でね、イーサネットの中では、IPは通用しないんだよね。(IPとイーサを一緒にしないのはなぜか?というのは考えラバわかります。考えてください。)それは、IPという概念がないから。だから、IPと一対一に紐付いたMACを調べないと行けないんだよね。そのときに使うのがARPプロトコルだね。address resolution protocolだね。これは、ブロードキャストアドレスに対して出されるプロトコル。だから、みんな受け取るんだよね。 アプリケーション層 TCP/IP層 TCPの仕事 ipの仕事 イーサネット層 おもろかったのが、イーサネットの間は全部同じデータが流れている、というところ。これかなりおもろかった。イーサネットケーブルでつながっているノード同士は、大きな部屋に入っている人のようなもので、誰かが大声で叫んだら、それをみんなが聞けるのとおんなじだ。って話。これはおもろいね。だからイーサネットケーブルっていつもあんなにピカピカ光ってるんだよね。りかい?? んで、そこで宛先を判別するためにMACアドレスが使われている、ってはなし。 ただね、スイッチングハブは、MACアドレスを見てその相手に向かっているイーサネットケーブルにしか流さないから、章電力なわけ。りかい? ハブ、スイッチ、ルータ アクセス回線、プロバイダ サーバ側

September 21, 2023 · 1 min · 24 words · Me

Commnets_on_learning_sql

chapter1 リレーショナルデータベースって便利だよねーって話。 E.F.coddが最初の論文を出したってことだけ覚えておくとかっこいいかもしれないね。 chapter2 データのインポート、エクスポート 外部データのインポート方法をここで説明している。 Mysql公式のチュートリアル用データ ここからほしいデータをダウンロードしてきて、mysql内部から次のコマンドでロードできる mysql -u ray -p mysql> source <path/to/schame/sakila-schedma.sql> mysql> source <path/to/data/sakila-data.sql> って感じやな。ちなみに、自分が作ったデータを外部にエクスポートする方法もあって、 # データベース $ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME > OUTPUT_FILE_NAME # テーブル $ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME TABLE_NAME > OUTPUT_FILE_NAME # テーブルの定義とデータのダンプ $ mysqldump -u USER_NAME -p -h HOST_NAME -A -n > OUTPUT_FILE_NAME まあ調べたらあるから調べてみてくれ。データベースの移行はそんなに難しいことではないことだけ頭に入れておいてほしい。 ちなみに、mysqlでのschemaの見方は、 describe customer; 忘れがちだから覚えておいてください!!まじで!!describeを短縮してdescでもオッケーです。 SELECT TABLE_NAME , COLUMN_NAME , COLUMN_TYPE , COLUMN_KEY FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'sakila' ; データ型について 日付に関するデータ型だけ。 ...

July 8, 2023 · 3 min · 500 words · Me

Comments_on_the_design_of_web_api

web apiの設計という本をまとめる なぜ読もうと思ったか? 自分がIT企業にエンジニアとして就職するから。また、研究でデータベースを作っているが、そのAPIの設計に役立てられると思ったから。大学の図書館で借りた本だけど、一周してみて良本だったら自分で買おう。ということでさっさと読みましょう。 1章 APIとは何か?APIの設計はなぜ重要か?APIの設計は何を意味するのか?うーん、わかりきっていることですね。 No, a function is not an API (Application Programming Interface) in itself. A function is a self-contained block of code that performs a specific task or operation. It encapsulates a set of instructions that can be called and executed when needed. Functions can take input parameters and return values or perform actions without returning a value. On the other hand, an API refers to a collection of functions, protocols, and tools that allow software components to interact with each other. APIs define the interfaces and rules for communication between different software systems, enabling them to exchange data and execute specific operations. In essence, an API encompasses a set of functions or methods, along with the associated rules and protocols, that define how different software components can communicate and interact with each other. Functions themselves are building blocks within an API that provide specific functionality or perform specific tasks. と思って、じゃあライブラリはAPIだよね?って聞いたら、 ...

May 18, 2023 · 3 min · 601 words · Me

Comments_on_how_linux_works

linuxを制すものはITを制す とはよく言ったものだ。 将来の夢はlinuxカーネルを理解することである自分ですが、まあ、そこへのかけ橋が必要ということで、「linuxの仕組み」を読むわけですね。裏表紙を見るだけで良本感が出ているこの本、さっそく読んでいきましょう ちなみに、筑波大学のこの人の授業もめっちゃためになります。 ref 1章:Linuxの概要 プログラムとは何か、プロセスとは何かを簡単に説明した後、カーネルの必要性について話しています。 これはかなり重要だけど、カーネルモードとユーザモードはcpuによって提供されている機能なんですね。カーネルモードで動いているプログラムは何の制限もないのに対して、ユーザモードで動いているプログラムには特定の命令を実行できなくする等、様々な制限がかかるんですね。 で、linuxの場合は、カーネルだけがカーネルモードで動作しています。つまり、プロセスはユーザモードで動いている、ということですね。だから、プロセスはカーネルを通じてデバイスにアクセスするのですが、この時にカーネルに操作をお願いする命令のことを「システムコール」というんですね。そうなんです、システムコールです。 カーネルの助けがないと実行できない処理をカーネルにお願いするんです。具体的には、nicを介した通信とかはそうですね。あとは、デバイスへのアクセス。プロセスの生成、削除。ファイルシステム操作。メモリ確保、解法。など。 システムコールが発行されると、cpuにおいて例外というイベントが発生するんですね。で、これをきっかけにcpuのモードがユーザモードからカーネルモードに遷移します。で、システムコールが終了すると再びユーザモードに戻ってプロセスが動くって感じですね。 で、straceコマンドってのがプログラムの中で発行されるシステムコール一覧を出してくれるんだよね。 strace python だけでもシステムコールがたくさん呼び出されることからも、pythonがインタープリタ言語であることがわかると思う。 前に研究室のサーバでwコマンドがハングしてしまう問題が起こったよね。そういう時は strace w とかってやると、wコマンド実行中のシステムコールがみられて、どこでハングしているのかとかがわかるわけですね。 こないだ調べた時は、特定のプロセスのプロセス情報 (/proc/<pid>/cmdlineとか) を閲覧しようとするとハングしてしまっていました。strace wとかするとreadシステムコールがハングするのがわかるはず。 ただ、なぜそうなってしまうのかはわかっていません…調べるとcgroupsによるメモリ制限と関係がありそうな情報が出てきましたが、まだ調査していません。 sudo yum install -y sysstat つぎのコマンドでsysstatを起動しましょう sudo systemctl start sysstat.service sarコマンドで遊びましょう。 sar -P 0 1 1 ちなみに、このコマンドの意味は、論理CPU0の(-P 0)のデータを1秒ごとに1回だけ収集しましょう。てこと。 sar -P 0 1 4 をやると次のような結果が出てくるよ。 Linux 5.15.32-v8+ (zeta) 09/02/23 _aarch64_ (4 CPU) 16:08:49 CPU %user %nice %system %iowait %steal %idle 16:08:50 0 0.00 0.00 0.00 0.00 0.00 100.00 16:08:51 0 0.00 0.00 0.00 0.00 0.00 100.00 16:08:52 0 0.00 0.00 0.00 0.00 0.00 100.00 16:08:53 0 0.00 0.00 0.00 0.00 0.00 100.00 Average: 0 0.00 0.00 0.00 0.00 0.00 100.00 この表の見方は、CPU 0がユーザモードで動作した時間の割合(%userと%nicdの和)、カーネルモードで動作した時間の割合(%system)、何もしていない時間の割合(%idle)って感じだね。 ...

February 9, 2023 · 7 min · 1335 words · Me

Comments on super linux programing

はじめに 図書館で借りた、「c言語によるスーパーlinuxプログラミング」という本の返却期限が近づいているのでさっさとまとめておきたいと思う 1章:c言語の位置づけ cを勉強することでプログラムの動きをマシンレベルでイメージすることができるからいいよねと。ただし、記述は非常に具体的になる。それでは面倒なことが多いと。そういう理由から「高級言語」が開発されたと。スクリプト言語ともいう。どの言語を使うかは何を開発したいか?に依存するわけですね。システムだったらc/c++,webだったら、jsとかね。適材適所が大事ってこと。 strace python だけでもシステムコールがたくさん呼び出されることからも、pythonがインタープリタ言語であることがわかる。 この辺の続きを詳しく知りたければ、「linuxの仕組み」という本を読むことをお勧めします。 2章:ubuntuの導入 ubuntuはまだ一般的になっていません。と。いえ、もう一般的になっています。既知の事実がつらつらと書かれているだけですね。 3章:大規模プログラミングとライブラリの利用 複数の開発者による並行開発を実現するには、アプリケーションの分割は必須の技術。ライブラリの利用は分割プログラミングのゴール。 改めてc/c++プログラムのビルド工程 プリプロセッサによるファイルのインクルードやマクロの展開(プログラム中で#でかかれている所) アセンブラへの展開とアセンブル作業によるオブジェクトコードへの変換 オブジェクトファイルの結合やライブラリとのリンクを実施 で、コンパイルってのは「実行ファイルを作る」って意味で使われるけど、どっちかっていうと、「オブジェクトファイルを作る」って意味だな。で、ビルドが「実行ファイルを作る」だな。うん、 だから、「分割コンパイル」ってのは、どっちかというと、分割ビルド ≒ 分割したファイルをコンパイルしてリンクするってかんじ。 ライブラリの種類についてもここで説明されているので、チョットやります。 ライブラリの種類とリンク ビルド ≒ コードをコンパイルしてオブジェクトファイルの生成 + ライブラリのリンク なわけだけれど、ライブラリにはスタティックリンクとシェアードリンクの2種類があると。で、共有ライブラリのリンクはさらに、 実行形式のメモリへのロード時にリンクされる、動的リンクライブラリ 必要に応じてメモリへロード、リンクされる、動的ローディング の二つがある。 ldd ./binary で調べられるんですね。便利ですね。 んで、ライブラリをリンクする時ってのは、ライブラリが提供する関数を使いたいときだと思うんですけど、この、関数の仕様(インターフェース)がどうなっているか?を知る方法が、ヘッダーファイルなんですよねー。そうなんですよ、まさに。 だからヘッダーファイルには定義はかかないんですよね。引数と返り値だけなんです。 自分で共有ライブラリを作る方法 まずは、mainがない、関数だけの.cppと.hppを作る。 -fPICオプションをつけてコンパイルする。この時、.oファイルができる。 e.g., mylib.o g++ -shared -o libmylib.so mylib.o でshared-libraryができる。 ヘッダーファイルと作ったshared-libraryを/libにおいて完了。あとは、コンパイル時に-lmylibってつけることを忘れずに。ライブラリのリンクでよく忘れるやつね。大事だから。 g++ -o myapp myapp.cpp -L/path/to/library -lmylib でコンパイルできるよーって話ね。あと大事なの。 ...

January 17, 2023 · 6 min · 1072 words · Me