# はじめに

## なぜなにSTUN

本書は、"なぜなに Torrent"の姉妹本です。 "なぜなに Torrent"と同様に、実際にSTUN Server と STUN Client を実装して得た知見やノウハウを元に、アレコレP2Pについて解説してきます。

(※) 私が実装したもの <https://github.com/kyorohiro/tetorica>

## はじめに

### Webアプリはお金がかかる

私たちは現在、さまざまなWebサービスを利用しています。そのほとんどが無料です。スマートフォンから地図を開いたり。ソーシャルネットワークで友人と連絡したり。Google検索して、調べ物をしたり。Youtubeで動画を見たり。

しかし、無料で利用していますが、その運営費は巨額です。

例えば、AWS上で動画配信サービスを展開しようとした場合を考えみましょう。 (ref <https://aws.amazon.com/jp/cdp/cdn/>)

320x180、10minで80MBくらいのデータサイズになります。ユーザー数が1000人いたとして、各ユーザーが、毎月60コンテンツ消費すると、5-6万円くらい、サーバー代がかかります。

いけそうな感じですが、ユーザー数が、10000人くらいまで増えると、50-60万円と、結構な値段になります。良いコンテンツで利用率が上がると、さらに...となります。

Webサービスを運営するには、資金を調達する必要があります。 出資していくれる方がいれば、それでも良いし。広告でもよいし。フリー・プレミアムモデルでも良いです。 うーん、どうでしょうか。厳しいなぁとい思う方もいるでしょう。

### P2Pで実現してみては?

解決方法の一つとして、P2Pが有ります。サーバーの負荷を利用者に分担することで、サーバーへの負荷を減らす事がでます。 中には、ほとんど、運営側のコストが掛からない、サービスも存在します。

たとえば、BitTorrent というファイル共有サービスはその一つです。 利用者が増えるほど、ファイルが配信される性能は上がります。

BitTorrentでは、ファイルをダウンロードしてもらう人が、データを配信する側に加わることで、 サーバーの配信コストを減らしています。

P2Pにより、このレベルまで最適化が進むと、配信者は企業という体裁を持たなくとも、 個人でもスケール可能なサービスを展開できます。

\[TODO スケールするとかは、言い方を変える]

### STUN は、重要な役割を担っている

本書では、その中でも STUN について紹介します。STUNはP2Pアプリでも、P2Pを利用してユーザーになんらかのサービスを提供するようなものではありません。P2Pサービスの中の要素技術のひとつです。

有名なところでは、WebRTCという、リアルタイムコミュニケーションアプリを作るためのフレームワークなどで利用されています。たとえば、WebRTCはファイルを交換したり、ビデオチャットをしたり、といった事がサーバーを経由しないで実現する事ができます。

この、サーバーを経由しないで、ネットワーク上でユーザー同士が繋がるには、さまざまな障壁があります。 その障壁を越えるためには、ユーザーの端末の状態や情報を知る必要があります。 この、ユーザーの端末の状態を知るための要素技術がSTUNです。

## サンプルコードはDartを利用しています。

本書では、実際にコードを書いています。このコードには、 Dart を利用する事にしました。Dartは、現時点において、もっとも優れたプログラム言語です。C系、Java系の流れを汲みつつ、関数型的な書き方も柔軟にできます。

C、Java系の流れを組んでいるため、多くの人が読むことができるでしょう。関数型の流れを組んだ、完結なプログラムを書くことができます。

また、多くの環境で動作します。ブラウザー、ChromeOS、 Android、 iOS 、 Mac、Windows、Linux、Raspberry Pi 上で動作します。 きっと、あなたの環境でも動作する事でしょう。

## 試したい方へ

STUNを利用するには、IPアドレスが2つ必要です。 うーん、難しいですね。 VPSを借りるのが良いでしょう。

Serversman (<http://dream.jp/vps/)、DigitalOcean(https://www.digitalocean.com/)を利用すると良いでしょう。>

### ServersMan\@VPSを利用する場合

2016/3/12 現在に試してもので、将来的に保証されるものではありません。

#### 1. ServersManからStandard Plan を契約する。

**1.1. <http://dream.jp/vps/>**

**1.2. standard plan を選択 (934円 per 月)**

**1.3. ubuntu 64bit のOSを選んでください。**

#### 2. ログインする

**2.1. $ssh root@(your ip) -p (your port)**

#### 3. 色々インストールする

**3.1 $apt-get update**

**3.2 $apt-get upgrade**

**3.2 $apt-get install git**

**3.3 $apt-get install emacs**

#### 4. Dartをインストール

<https://www.dartlang.org/downloads/linux.html>

**3.4 $apt-get update**

**3.5 $apt-get install apt-transport-https**

**3.6 $sh -c 'curl <https://dl-ssl.google.com/linux/linux\\_signing\\_key.pub> | apt-key add -'**

**3.7 $sh -c 'curl <https://storage.googleapis.com/download.dartlang.org/linux/debian/dart\\_stable.list> > /etc/apt/sources.list.d/dart\_stable.list'**

**3.8 $apt-get update**

**3.9 $apt-get install dart**

**3.10 $echo 'export PATH="$PATH:/usr/lib/dart/bin"' >> \~/.profile**

**3.11 $source \~/.profile**


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nazenani-stun.firefirestyle.net/intro.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
