# イントロダクション

> Source: https://www.ymotongpoo.com/works/lyse-ja/01_introduction/


## このチュートリアルについて

この章は"Learn You Some Erlang for Great Good!"（訳：役に立つErlangを教えてやるよ！）のはじまりです。 このチュートリアルを読むことは、Erlangを学ぶ最初のステップかもしれないので、ちょっとErlangについてお話ししましょう。

<img src="erlang1.png" class="align-left" alt="image" />

まず始めに、私はMiran Lipovačaさんが書いた [Learn You a Haskell for great Good!](http://learnyouahaskell.com/) (LYAH)のチュートリアルを読んでから、このドキュメントを書くというアイデアをふくらませてきました。 MiranさんはHaskellの魅力を伝え、丁寧に学び方を教えたという点で素晴らしい仕事をしたと思います。 彼は知人だったので、私が彼の本のErlang版を書くのはどうか？と聞いてみました。 彼はそのことをとても気に入ってくれて、Erlangにも興味を持ってくれました。

というわけで、いまこの文章をタイプしているわけです。もちろん上に書いただけではなくて、他のモチベーションあります： 一番の理由は、このErlangという言語がとても取っ付きにくい言語で（ウェブにはあまりドキュメントがなく、本を買う必要があるということ）、開発者コミュニティにとってLYAHのようなガイドを書くことは有益だと思ったからです。 重要度は下がりますが、他の理由としては、人々がErlangの利点を語るときの説明が、極端な一般化に基づいているため、過剰だったり不足していたりするのを見かけたからです。これによって、Erlangは誇大広告にすぎないと確信してしまっている人がいます。 彼らにErlangの実際はそうではないことを納得させたいとした場合、彼らはそもそもこの文章を読まないと分かっています。

したがって、この本は、基本的な手続き型プログラミング（C/C++, Java, Python, Rubyなど）の基本的な知識を持っていて、関数型プログラミング（Haskell, Scala, Erlang, Clojure, OCaml...）をあんまり知らない人がErlangを学びたいと思ったときの参考になればいいなと思って書かれました。 私はこの本を正直に書きたいと思ったので、Erlangのありのままを、短所も長所も含めて書こうと思います。

## で、Erlangって何？

なによりもまず、Erlangは関数型プログラミング言語です。もし手続き型言語で仕事をしたことがあるなら、 `i++` のような命令は普通に感じられると思います。関数型プログラミングではそういったことは許されません。 実際、どんな変数でも値を変更することは厳しく禁止されています！最初のうちは奇妙に思えるかもしれませんが、数学の授業を思い出せば、同じようなことを習ったとおもうはずです：

``` none
y = 2
x = y + 3
x = 2 + 3
x = 5
```

次を追加してみます：

``` none
x = 5 + 1
x = x
∴ 5 = 6
```

とても混乱したことと思います。関数型プログラミングではこのように解釈します：もしxが5なら、論理的に　それを6でもあるとは言えません！そんなのはいい加減です。 このような性質は同じパラメータを与えられた関数は常に同じ結果を返すべきという、関数型プログラミングの性質も説明しています：

``` none
x = add_two_to(3) = 5
∴ x = 5
```

常に同じパラメータに対して常に同じ結果を返すような関数は参照透過であると言われます。この性質のおかげで、 `add_two_to(3)` を5と置き換えることができるわけです。なぜなら `3+2` の結果は常に5になるからです。 これはつまり、より複雑な問題を解決するために、何も壊すことなく何十もの関数をくっつけることができるということを意味しています。 論理的で綺麗だと思いませんか？しかし問題もあります：

``` none
x = today() = 2009/10/22
-- wait a day --
x = today() = 2009/10/23
x = x
∴ 2009/10/22 = 2009/10/23
```

なんてこったい！美しい等式が！(ノд｀) 瞬く間に間違った式になってしまった！どうして私の関数は毎日異なった結果を返すようになってしまったんでしょう？

明らかに、いくつかのケースでは参照透過性を破ることが有効なこともあります。Erlangではとても実用主義的なアプローチで関数型プログラミングを行っています：純粋主義（参照透過性、破壊的データを避けるなど）に従いつつ、実世界で問題が発生した場合はそれを取り払います。

<img src="envelope1.png" class="align-right" alt="image" />

いま、Erlangを関数型プログラミング言語だと定義しましたが、同時並行性と高い信頼性も強く強調したい点です。同時に何十ものタスクを処理できるようにするために、Erlangではアクターモデルを使っています。さらに個々のアクターは仮想マシン内で別のプロセスとなっています。 簡単にいえば、もしあなたがErlangの世界のアクターだった場合、あなたは孤独な人間で、窓もない暗い部屋に座っていて、メールボックスにメッセージが届くのを待っている状態です。そしてメッセージを受け取ると、それに対して特定の方法で反応します：請求書を受け取ったときには支払いをし、誕生日カードには「ありがとう("Thank you")」という手紙で返事をし、理解出来ない手紙は無視するという具合です。

Erlangのアクターモデルはすべての人が自分の部屋に座っていて、いくつかの異なったタスクをこなしている世界と思うことが出来ます。人々は手紙を書くことで厳格にコミュニケーションをとっていて、それが全てです。 退屈な人生（そして郵便業務の夜明け）のように聞こえるかもしれませんが、多くの人に非常に限られた用途のタスクを頼むことができて、誰もおかしなことや他の人の仕事に影響をあたえるような間違いをしません。さらにいうと彼らはあなた以外の存在を知らないのです。（それはいいことですね）

このアナロジーから抜けるために、Erlangはアクター（プロセス）を書くことに集中させてくれます。アクターはお互いにメッセージを飛ばさない限り1ビットも共有しません。すべてのコミュニケーションは明示的で、追跡可能で安全です。

先ほどErlangを定義したときは言語レベルで定義しました。しかし広い意味で見ると、Erlangは言語だけに収まりません。Erlangは全体として開発環境でもあるのです。コードはバイトコードにコンパイルされて、仮想マシン内で動作します。 したがってErlangはJava（や多動症候群の子供のように）どこでも動作することができます。標準ディストリビューションでは開発ツール（コンパイラ、デバッガ、プロファイラ、テストフレームワーク）とOpen Telecom Platform (OTP)フレームワーク、Webサーバ、パーサジェネレータ、Mnesiaデータベース（多数のサーバにレプリケートできるKey-Valueストレージで、ネストされたトランザクションをサポートし、どんな種類のErlangデータでも保存できます）などを含んでいます。

VMとライブラリは、稼動しているシステムのコードを他の稼働中のプログラムを止めることなく更新したり、たくさんのコンピュータに簡単にコードを配布したり、エラーやフォルトをシンプルにかつ強力に管理することも可能にしてくれます。

<img src="letitcrash1.png" class="align-right" alt="image" />

これらのツールをどのように使って、どのように安全に運用するかは後ほど触れるとして、今はそれに関係するErlangの一般的なポリシーをお教えします：「クラッシュするならさせておけ」です。 これはたくさんの死にかけた乗客を乗せた飛行機というよりは、下にネットが敷いてある綱渡りのようなものです。間違いを避けるべきとは言いましたが、たいていの場合は型やエラーになる条件をすべて確認する必要はありません。

Erlangがエラーから回復したり、アクターでコードを管理したり、配布することでスケールしたり、信じられないほど並行処理ができたりする機能は、次の章でご紹介いたしましょう...

## Don't drink too much Kool-Aid

この本の中には"Don't drink too much Kool-Aid"[^1]と名前がついた小さい囲みがたくさん出てくると思います。（出てくればわかるでしょう）Erlangはいま実際の機能以上のことを語られた過大な宣伝のせいで人気を得ているところもあります。 この小さな囲みでは、こういった話を聞いてうわっつきやすい方のために、しっかりと地面に足をつけられるようなことを書くつもりです。

最初の例はErlangの軽量プロセスによって強力にスケールできる能力に関連したお話です。 たしかにErlangのプロセスがとても軽量だというのは真実です：何百、何千もの軽量プロセスを同時に起動させることができます。しかしそれが出来るからと言って、同時にそんな数の軽量プロセスをたてる必要はありません。 たとえば、すべての弾丸がそれぞれアクターになっているようなシューティングゲームを作るなんていうのは狂気の沙汰です。そんなゲームを作ったところで、結局自分の足を撃つだけです。アクター間でメッセージのやりとりをするときには小さなコストがかかります。タスクを細かく分けすぎると、動作が遅くなってしまいます！

これに関してはこういったことを心配するくらいにErlangについて理解が深まったときにもっと詳しく解説するとして、とりあえず今のところは、むやみに並行処理にさせると速度を速くするときに問題があるということだけ覚えておいてください。 悲しくならなくて大丈夫です：何百ものプロセスを使える機会もありますし、またそれが役に立つ時が来ます！ ただそれは常にそうではないというだけです。

<img src="scaling1.png" class="align-left" alt="image" />

Erlangはコンピュータのコア数に直接比例してスケールすることができるとも言われています。しかしこれは通常は真ではありません：そうなりえますが、一番の問題は全てを同時に稼動させることが出来ないということです。

他にも心にとどめておいてほしいことがあります：Erlangはいくつかの点で非常に利点がありますが、それは技術的に他の言語でも同じことができるものです。また逆も言えます。個々の問題をどうなって欲しいかというところで評価して、問題となっている箇所に応じて正しいツールを選択してください。 Erlangは銀の弾丸ではないのです。例えば画像処理や信号処理、OSのデバイスドライバなどには向いていません。逆に巨大なサーバソフトウェア（キューやMapReduce）や他の言語との接続、さらには高レベルプロトコルの実装などでは光るものがあります。ミドルウェアに何を使うかはあなたの自由です。 Erlangをサーバソフトウェアを書くことだけ使おうと可能性を閉じ込めるべきではありません。予期しないそして驚くべき用途にErlangを使っている事例もあるのです。 ひとつの例としてIANOというUNICTチームが作成したロボットが挙げられます。このプロジェクトではErlangを人工知能に使っていて、2009 Eurobot Competition[^2]で銀メダルを獲得しました。他の例としてはWings 3Dがあります。これはオープンソースの3Dモデラー（レンダラーではない）で、Erlangで書かれているクロスプラットフォーム対応になっています。

## 何に飛び込んだらいいのか？

Erlangを始めるにはテキストエディタとErlang環境だけ整えればよいだけです。ソースコードとWinodwsバイナリはErlangの [公式ウェブサイト](http://erlang.org/download.html) から取得できます。ここではインストールの詳細については触れませんが、Windowsではバイナリをダウンロードして実行するだけです。 コマンドラインからErlang環境にアクセスできるように、Erlangディレクトリをシステム環境変数PATHに追加することを忘れないようにしてください。

DebianベースのLinuxディストリビューションでは、パッケージを `$ apt-get install erlang` としてインストールすることができます。Fedoraでは（もし 'yum' がインストールされていれば）同様に `# yum install erlang` としてインストールすることが出来ます。 しかしながら、これらのレポジトリでのErlangパッケージはしばしば古いバージョンだったりします。古いバージョンを使っているとこのチュートリアルで書かれていることと違う結果になる可能性があります。また特定のアプリケーションでパフォーマンスが頭打ちになる可能性があります。 だから、私はソースからコンパイルすることをおすすめします。パッケージ内のREADMEファイルを参照したり、インストールに必要な情報をGoogleで調べたりしてみてください。私よりもいい方法でインストールしているかもしれません。

OS Xの場合は、私は手助けできません。僕はMacを持ってないので。でも、 [MacPorts](http://macports.org/) の助けを借りてErlangをインストールすることができます。

> [!NOTE]
> このドキュメントを書くに当たっては、ErlangはR13Bを使いました。 したがって良い結果を得るにはR13Bかそれより新しいバージョンを使いましょう。

## どこで助けを得たらいいのか？

助けを得られる場所はいくつかあります。Linuxを使っているなら、manページにアクセスして品質のよい技術文書を見ることが出来ます。Erlangにはlistsモジュール（すぐに見ると思います）があります：listsモジュールに関するドキュメントを見たい場合は、 `$ erl -man lists` とタイプすればよいだけです。

Windowsでは、インストールの時にHTMLドキュメントが含まれています。これはいつでも [Erlangの公式サイト](http://erlang.org/doc/) や [他のミラーサイト](http://erldocs.com/) からダウンロード可能です。

すべてを綺麗にしたいと思っているなら、きれいなコードの実例が [ここ](http://www.erlang.se/doc/programming_rules.shtml) にたくさん出てきます。この本のコードもそのガイドラインに沿っています。

技術的な詳細を知りたいなと思ったときにはこれではまだ不十分です。そういうときは私は2つのソースを漁ることにしています。1つは [公式メーリングリスト](http://erlang.org/faq.html) （多くのことを学ぶために購読すべきです）でもう1つはIRCサーバ [irc.freenode.net](http://freenode.net/) 上のチャンネル [\#erlang](irc://irc.freenode.net/erlang) と [\#erlang-otp](irc://irc.freenode.net/erlang-otp) です。

ああ、あとあなたがクックブックとか既存のレシピが好きな人だったら、 [trapexit](http://trapexit.org/) がおすすめです。メーリングリストのコピーをフォーラムや一般的なWikiの形で公開しているので、役に立つと思います。

[^1]: 訳注：Kool-Aidはアメリカで昔から親しまれている粉末ジュースの銘柄。英語には"drink the Kool-Aid"（Kool-Aidを飲む）という慣用句があり、根拠を検証せずに何かを鵜呑みにしてしまうことを指す。1978年に起きたジョーンズタウンの集団自殺事件で信者に青酸カリ入りの飲料を飲ませたことに由来するとされる（実際に使われた飲料はKool-Aidではなく類似品のFlavor Aidだったとも言われる）。
[^2]: 訳注：Eurobotは主にヨーロッパの学生を対象とした国際的なロボット競技会で、1998年から毎年開催されている。ここで言及されているIANOは、イタリアのカターニア大学（UNICT）のチームが開発したロボット。

