# はじめに
この資料「ネットワークプログラミング入門」は、2025年度夏休み [[Delight]]合宿 Distributed Algorithmゼミの講義資料の一部です。
Distributed Algorithmsゼミは、分散アルゴリズムの実装にチャレンジすることを目的としています。内容は大きく分けて以下の2つです。
1. ネットワークプログラミング入門
2. 分散アルゴリズムの学習と実装
- [[選挙アルゴリズム]]
- [[CRDT]]
本資料はそのうちの前半パートになります。つまり、**ネットワークプログラミングの方法を学びます**。分散システムは複数のプロセスとそれらを繋げるネットワークから構成されており、分散アルゴリズムはそれらを活用して様々なサービスを提供する方法です。そのため、我々はまず、プロセス同士がネットワークを通じてやり取りする方法を学ばなければいけません。
**ネットワークプログラミングは、難しくありません**。難しくないように、先人たちが適切なネットワークプロトコルを考え、詳細を隠蔽した分かりやすいプログラミングインターフェースを提供してくれています。こうした抽象化のおかげで、誰でも簡単に始められます!
また、本資料では**スレッドを使った並列・並行プログラミングの方法も学びます**。スレッドを使うと、1つのプログラムの中で同時に複数の処理を走らせることができます。このおかげで、例えば以下のようなことができます。
- [[並列]]処理(Parallel): パソコンにCPUが8個あれば、計算が8倍になる(?)(実際はならない: [[アムダールの法則]])
- [[並行]]処理(Concurrent): 誰かとメッセージをやり取りしている間に、他の人とも会話できる
特にネットワークプログラミングの文脈では、後者がより重要な意味を持ちます。例えば、電話は1人としかできませんが(直列)、パソコンでチャットアプリのウィンドウを立ち上げればAさんの返信を待っている間にBさんと会話できます(並行)。ネットワークプログラミングにおいても並行プログラミングの技法を用いて実装すれば、たくさんのメッセージを同時に捌けるようになります。市販されている高性能なWebサーバーから、チャットアプリまで、ネットワークを利用するほとんど全てのアプリケーションはこのように実装されています。
**本資料を読み終えた頃には、ネットワークプログラミングの力が身につき、分散アルゴリズムの実装に必要なプログラミング能力がほとんど身についていることでしょう**。そして後半では、実際に分散アルゴリズムについて学び、実装します。
みなさんがこの合宿を通じて分散システムの世界に飛び込み、最高の夏、ひいては最高の人生を手に入れられることを願っています。(これは決して誇張ではなく、分散システム的思考を身につけることは、人生をよりよく生きる糧になると思うからです。参考: [[Computational Thinking]])
# 対象者
- 以下の必要な前提知識を持っている人
- 分散システムに関する基礎的な知識(参考: [[distributed-systems-101-kekeho.pdf]])
- [[Python]](関数、クラス等の基礎的な知識)
- [[UNIX]]コマンド(`cd`, `ls`, [[lsof]], `man`等の基礎的な知識)
- 実装を楽しめる(楽しんでみたい)人
- 分からないことを調べる気合を持っている人
- AIにコードを書かせたい誘惑に負けない根性を持っている人(調べ物やトラシューを目的に質問するのは全然OK)
# 環境
- UNIX系の環境(Linux, macOS)
- Windowsの人はWSLを使ってください
- Python: 3.13t(`uv`を用いた環境構築の方法は当日教えます)
- `3.13t`は、`3.13t`のfree threading版([参考: What’s New In Python 3.13 - Free-threaded CPython](https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython))
# 目次
- [[02 並列・並行プログラミング]]
- [[03 ネットワークについての基礎知識]]
- [[04 ネットワークプログラミング]]
- [[05 演習 チャットアプリを作ってみよう]]
- [[06 終わりに]]
# 著者
- [[kekeho]]
- (分散アルゴリズムの学習と実装パート: jamiroq)
次ページ: [[02 並列・並行プログラミング]]