(No.5) おじさんが、LINE風アプリを開発する - メッセージの送受信を考えてみるよ

# 前回までのあらすじ
- GitHubを利用して、おじさんの成果物を公開する準備が整いつつあるよ
    - [(No.1) おじさんが、Git・GitHubを利用できるようにしてみる - GitHubにユーザを登録する](https://qiita.com/resojisan/items/4cd09b7a5f33ca8a925d)
    - [(No.2) おじさんが、Git・GitHubを利用できるようにしてみる - GitHubを利用してみる](https://qiita.com/resojisan/items/75dcc83ea55af0db329f)
    - [(No.3) おじさんが、Git・GitHubを利用できるようにしてみる - GitHubからリポジトリを複製（クローン）する](https://qiita.com/resojisan/items/f119d8b71e3bba9eadec)
- 目標を立てたよ、LINE風アプリが作れるようになることを目指すよ
    - [(No.4) おじさんが、何を開発するのか目標を立てるよ](https://qiita.com/resojisan/items/6a8690d21fe9ab00189d)

# メッセージを送受信するイメージ（もうそう）
おじさん、LINE風の仕組みをつくるために、まずは、メッセージの送受信を妄想してみるよ。

## メッセージを宛先(スマホやPC)に直接送信する案と、問題点について
- おじさん、下図のようにスマホ同士で、直接メッセージを送信すれば良いと考えたよ。
- おじさんからのメッセージ「こんにちは」を、Aさんのスマホに送信するイメージだよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419842/44ea7698-77f0-4ab3-6168-c69bae58e3dc.png)
- でもLINEを調べてみると、スマホやPCやタブレットなど、複数の環境で、過去に受信済みのメッセージを見ることが出来るらしいんだ・・・。
    - 後でAさんがPCやタブレットにLINEをインストールするケースを考えると、Aさんのスマホに直接メッセージを投げる方法では実現出来ないことかも・・・。
    -  「こんにちは」は、PCやタブレットを導入する前に、スマホに送信したメッセージなのだから・・・。
- 単純におじさんが送信するメッセージを、宛先のスマホやPCに送信する方法だと、LINEとは異なる動きのアプリになりそうなんだ。（おじさんの考えた案は、トランシーバのようなものに近いかもだよ・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419842/0b91cb2a-5acb-ddb6-1b2e-b84f8a28a530.png)

## 問題を解決するアイディア
- 前述の案だと、随分と後になってアプリをインストールした端末上では、過去のメッセージを見ることが出来ない問題が出てきたよ。
    - この問題は、宛先の端末に直接メッセージを送信することによって、発生する問題と思うんだよ。
        - 解決方法は、おじさんの送信したメッセージを、誰でも見れるような場所に置いておく必要があると思うんだ。（町内掲示板みたいなイメージだよ）
- 下図のアイディアでは、おじさんのメッセージを入れておく、ナゾ箱を設置することにしたんだよ。
    - 直接相手にメッセージを送信するのではなくて、ナゾの箱におじさんはメッセージを送信することにしたよ。
    - 宛先のAさんは、気が向いたときにナゾ箱の中身を確認して、メッセージが届いていることを確認すれば良いんだよ。
    - この方法だと、スマホからメッセージを読むことも可能だし、後で購入したPC・タブレットから読むことも可能だよね。
- メッセージを読み書きすることが出来るような、共有の箱、ナゾ箱を設置する必要性を感じたんだよね（照）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419842/9eaa9a0e-708d-9d0b-2370-1e0c011b567c.png)

## ナゾ箱
- ここまでで、メッセージを読み書きする箱の必要性がわかった（ような）気がするよ。
- ナゾ箱に、手紙を入れておくわけにもいかないから、ナゾ箱＝コンピュータであることは、おじさんでも想像が出来るよ。
- おじさんのコンピュータをナゾ箱として設置するのは、ちょっと気が引けるよ。　ずっと電源入れておかなくちゃいけないし、侵入されたら、おじさんの恥ずかしいファイルが流出しそうで怖いよ・・・。
- ナゾ箱について調べてみたけど、今回のようにメッセージを書き残したり、公開したり、何かしらの機能やサービスを提供するコンピュータのことを、世間では[「サーバ」](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%90)と呼ぶらしいよ。
    - 以降、機能やサービスを提供するコンピュータのことを[「サーバ」](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%90)と呼ぶことにするね。おじさん、横文字にもなれてきた気がするよ（照）。
- 続いて、サーバをどうやって準備すれば良いのか考えることにするよ。


## サーバを準備するにあたって懸念すること
- ここまでの振返り
    - サーバと呼ばれるコンピュータの必要性がわかった気がするよ。たぶん。
    - おじさんのメッセージを書き込みしたり、誰かにメッセージを読み込ませたりする目的で、サーバを利用するよ。
- おじさんがサーバを準備するにあたって懸念すること
    - サーバ＝コンピュータってことは、サーバも様々な種類があるってことだよ。
        - おじさんのコンピュータはApple製だよ（自慢だよ）。
    - おじさんのような素人が、コンピュータを楽に・便利に活用するには、[OS（オペレーティングシステム）](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)が必要だよ。
    - コンピュータも製造するメーカが様々だけど、OSも種類が様々あるみたいだよ・・・。
        - おじさんが現在利用しているmacOS
        - Windows
        - Linuxなんて呼ばれるものもあるみたいだよ・・・
    - 所有するコンピュータや、これから調達するサーバによって、開発する方法や考慮しておくべきことが変化しそうだよ。
        - 素人のおじさんでも想像出来るけど、例えば、WindowsとmacOSでは、異なる点が色々ありそうな気がするよ。
            - 実際、Windows用のアプリを、そのままmacOSに持ってきても動作しないよね？
            - ***おじさんのQiitaでの目的は、おじさんが自習して、職を得ることだけど、おじさん以外の人もおじさんと同じことが出来るように記録を残したいんだよ。（よくばりすぎかな？）***
                - 調達するサーバによって、プログラムの作り方や、考慮が変化するとなると、おじさん個人では対応しきれないよ・・・。
                - サーバやOSを1種類に限定するとしても、そもそもおじさんの持っているコンピュータはApple製で、OSはmacOSだよ。
                - おじさん以外の人が、おじさんと同じ作業を追体験するには、おじさんと同じコンピュータとmacOSが必要になるってことだよ。
                - コンピュータやOSの違いが問題になりそうだよ。

## 懸念点のまとめ
- サーバの種類やOSによって、その上で動作するプログラムの作り方や考慮が変化するかもだよ。
    - おじさん以外の人でもおじさんの作業を追体験出来るようにしたいよ。
        - でも、おじさんのコンピュータはApple製で、OSはmacOSだよ。
            - おじさんのコンピュータと条件が異なるコンピュータを利用する場合は、おじさんが意図しない問題が出てくるかもしれないし、それを事前に検証することも出来ないよ。
            - Windowsは対象外になってしまうよ。
- アプリ開発時に利用するおじさんのコンピュータと、不特定多数に公開するサーバと、おじさんの作業を追体験するおじさん以外の人のコンピュータのそれぞれを、可能な限り同じ条件に合わせたいんだよ。

## 開発環境（おじさん）、サーバ、おじさん以外の人のコンピュータの条件を可能な限り合わせるには
- ネットサーフィン（汗）だけが、得意なおじさん。色々調べたところ、次のような方法があることがわかったよ。
    - [仮想機械、仮想マシン、バーチャルマシン](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E6%A9%9F%E6%A2%B0)を利用する方法
    - [コンテナ](https://www.docker.com/resources/what-container)を利用する方法


# あとがき
- コンピュータやOSの種類による影響を最小限にしたいので、仮想環境やコンテナについて、少しずつ調べていくよ。
- サーバを準備して、複数の環境からメッセージを送受信出来るようにしたいと考えているよ。
- 先は長そうだけど、いつか出来ると信じて取り組むとするよ。おじさん、無駄に時間だけはあるからね（涙）。
- どこかの誰かが出来ていることは、おじさんにも出来ることだと、昔励まされたことがあったよ。それを今思い出したよ（涙）。


# 参照・メモ
[サーバ](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%90)
[ハイパーバイザ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6)
[仮想機械](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E6%A9%9F%E6%A2%B0)
[What is a Container?](https://www.docker.com/resources/what-container)
[Get Started, Part 1: Orientation and setup](https://docs.docker.com/get-started/)
[Docker overview](https://docs.docker.com/engine/docker-overview/)
[Docker道場「Dockerの基本概念」0825インフラ勉強会資料](https://www.slideshare.net/zembutsu/docker-basis)
[Docker ドキュメント日本語化プロジェクト](http://docs.docker.jp/)
[AWSでDockerを扱うためのベストプラクティス](https://www.slideshare.net/AmazonWebServicesJapan/awsdocker)