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