四十三庵

蔀の雑記帳

プログラミングを勉強する前に知って欲しいアプリが動く仕組み

大学時代の友達から「プログラミング教えて!」みたいなことを言われたので、
内心やれやれと思いながら、会話をした。
「何をつくりたいの?」
「やっぱスマホアプリとかかなあ」
「ほーん」
「最初は無料でもいいけど、人気出てきたら有料化とかして、こづかい稼ぎしたいかな」
「ほーん」
「コストはなるべくかけたくないけど、ヒットは狙いたいな。SNS機能つけたりしたい」
「ほーん。コストかかるとしたらサーバー借りたりかな」
「え? なんで?」
「え?」 
「アプリつくるのにサーバー要るの?」
「なるほど」
確かにサーバーはなくてもなんとかなる。
なくてもなんとかなるが、彼のイメージしてるような、
ソーシャルにユーザー同士が交流するみたいなアプリを作りたいのであれば、サーバーは必
要となる。

そんなやりとりをきっかけに、
「なんかよくわからんけど、プログラミング覚えて、なんかサービスつくりたいという気持ちがあるよ、けど知識はあんまないよ」という人向けに、
アプリが動くざっくりした仕組みについて書いてみようと思った次第です。

記事の対象とレベル感

・プログラミング初心者を想定。
・わかりやすさ重視
・なるべく具体的に
・けどたとえ話でごまかしたりはあんまりしない
・インフラチックな話になるかも
・スマホアプリを例にして書いているが、基本的にはWEBシステムの設計の説明
・ミドルウェアの話は割愛

なんでサーバーが要るの?

たとえば電卓アプリみたいな単純なアプリだったら、サーバーは要らない。
Facebookとかメルカリとかみたいなアプリを作りたいのであれば、サーバーは必要となる。
何が違うのかというと、スマホ上で処理を完結できるか否かの違いだ。

電卓アプリはスマホ上で入力したデータを、アプリが計算して、結果を表示すれば良い。
それで完結する。
Facebookで友達を探すには、探したい友達の名前を検索窓に入力して、
Facebookのデータセンターにあるデータベースに友達を探しにいって、その結果を表示することになる。
別にFacebookのアプリが、ひたすら自分一人で文章を書いたり、写真を投稿したりして、自分一人が見る仕組みなら、
サーバーがなくてもいけるが、よほどの異常者しかそんなアプリは使わないだろう。

どこぞのIT企業がちゃんと作ったアプリであれば、だいたいは裏でサーバーが動いている。
ユーザーはあまり意識しないので、確かに僕の大学の友人のように、
スマホアプリであればサーバーが要らないと思うのも無理はないのかもしれない。

アプリが動く仕組み(ざっくり)

「プログラミング勉強したい!」と言ったときに、
イメージするのは普段自分が使っているスマホのアプリとか、インターネットのブラウザで動いてるWEBサービスとかだろう。
普通にユーザーとして使う分には、裏側がどうなってるかなんて意識する必要はない。
僕も働き始めるまでは、魔法みたいなもんだと思っていた。
ただ実際は魔法ではないので、裏側には泥臭い世界がある。

その泥臭い世界を、ざっくりとあらわすとこんな感じ。
f:id:st43:20170611170713j:plain
ユーザーは、インターネットブラウザかアプリから、何らかの操作をする。
たとえばGoogle検索をかける場合を考える。
検索した文字列データが、インプットとしてサーバーに送られる。
なんか上手いこと処理される。
ユーザーに対して、検索結果を返す。
それを受け取った、PCなりスマホなりは、結果を表示する。

基本はインプット/アウトプット*1の関係で、アプリの処理は進む。
ユーザーから見ると、自分の端末とサーバーの役割分担はよくわからない。
とりあえずなんか入力したらなんか返ってきた、という風にしか見えない。
ただ開発者になるのであれば、裏の役割分担は把握しておきたい。

アプリが動く仕組み(もう少し詳しく)

「なんか上手いこと処理される」と書いたところを、もう少し詳しく説明したい。
f:id:st43:20170611170720j:plain
これが一般的なWEBシステムの構成の全体図だ。
(スマホアプリもサーバー通信しているのであれば同じ)

ユーザーが直接操作したり、閲覧したりする端末で動く側を、「クライアントサイド」と呼ぶ。
「プログラミングするぞ!」というときにイメージするのは、このクライアントサイドのプログラムだろう。
実際のところ、多くのクライアントサイドのアプリは、ネットワークを通じて、サーバーで処理をさせている。
サーバー上の世界は、クライアントサイドに対して、サーバーサイドと呼ばれる。
サーバーサイドでもプログラムはガリガリ動いている。

クライアントから入ってきたリクエストは、まずWEBサーバーで受け付けられる。
WEBサーバーがやっているのは、HTMLリソースの管理やら、コネクションの管理やらだ。
スマホアプリだとWEBサーバーとは呼ばず、HTTPサーバーとかロードバランサと呼んだり、あんまり存在を意識しないっぽい。
画面を表示するだけでよければ、WEBサーバーが結果を返して終わりだが、
もっと高度な処理をするのであれば、APサーバーにデータを引き渡す。
APサーバーは、サーバーサイドのアプリが動く場所だ。
たとえばGoogle検索をかけたときに、実際に検索処理するプログラムなんかが稼働しているサーバーだ。
一般的な構成であれば、APサーバー上にはデータを置かず、DBサーバーに置く。
アプリは必要になったら、DBサーバーへアクセスに行く。

こんな風に、サーバーサイドでは三つの役割分担が行われて、
互いに必要なときにインプット/アウトプットをやりとりしている。

ハードウェア構成

f:id:st43:20170611170717j:plain
先程の図では、わかりやすさのために、物理的に三つのサーバーがあるような図にした。
しかし実際は、一台の中に三つの役割分担があってもいいし、大規模システムであるなら何十台とサーバーを構えてしまってもいい。
こちらの図は、一つのサーバー上に、WEBサーバー/APサーバー/DBサーバーを構えた図だ。
小さなシステムであれば、一台のサーバーに全部置いてしまっていいだろう。
物理的なサーバーを分割するのは、サーバーのハードウェア障害への備えという意味合いが大きい。
一台のサーバーに全部を置くと、その一台が壊れたときに、全サービス停止となるが、
WEBサーバー×2、APサーバー×2、DBサーバー×2みたいな構成だと、
一台サーバーが飛んでも、サービスは継続できる。

プログラミングするためにはそこまでやらないといけないの?

「プログラミングが!!!!!!!!したい!!!!!!!」みたいなキラキラした気持ちをもった人も、
勉強していくにつれて、高度なことをやるにはサーバーサイドで処理させる必要があると気づき。
しかもそれは非常にとっつきづらいし、サーバー用意するにしても金がかかるということで、
知識的にも金銭的にもハードルが高かった。

けど最近はクラウドがあり、AWSがある。
AWSは重量課金だし、あんまりサーバーサイドの深い知識がなくても、
「こんな構成にしたい!!!」という気持ちがあれば、Amazonのサービスを組み合わせることで、必要なインフラ部分が構築できる。

www.slideshare.net

まとめ

・ユーザーから見えている魔法の世界は無数のサーバーのレスポンスでできている
・アプリに高度な処理させたければサーバーが必要
・サーバーサイドはとっつきづらいが、AWSみたいなサービスを使うとよい

補足:サーバーレスアーキテクチャ

今のところ、「スマホアプリ」と言ったときに想像するようなアプリは、基本的には裏でサーバーを構えている。
しかし、クライアントサイドの性能も上がっているので、
サーバーなくてもいけるんじゃないか?という発想もある。
それがサーバーレスアーキテクチャと呼ばれる設計思想。
サーバーレスアーキテクチャという技術分野についての簡単な調査 - Qiita
↑たとえばここを参照。
昔のCGIの見直しみたいな話で、この設計であればAPサーバーが不要となるので、メンテすべきサーバーそのものがなくなる。
けれどレスポンス速度は、普通にサーバーサイドでやるよりも遅いので、そこが解消できるのか。
(了)

*1:リクエスト/レスポンスと書くほうがそれっぽいけど

Bluetoothイヤホンを買った話

Bluetoothイヤホンを買った話、します。
iPhone7を買ったものの、ずっと変換コードさして、有線イヤホンを使っていた。

AirPodsが出たら買おうと思っていたが、
あまりにもデザインがダサいので、やめた。
(装着した姿がダサすぎる)

機種探し

下記のサイトが参考になった。
www.goodgoodlife.xyz
参考になった、というかこのサイト見て、一番薦められてたやつをそのまま買った形だ。

正直オーディオ界隈の比較記事は難しいというか、よくわからない。
低音の響きがどうとか言われても、結局感覚の問題になるので、文字で見てもよくわからない。
iPhone7の購入から、イヤホンの購入が遅れたのもそのせいだ。
ちゃんといいやつを探そうとおもったが、結局よくわからなかった。
店頭で試すにしても、日本の家電量販店だと扱ってるメーカーが偏っている。

買ったやつ

これを買いました。

音質はそれなりにいいものが欲しかったものの、
オーディオヲタみたいな「究極の音を……」みたいな感じではなく、
そこそこよければ別に問題ないというレベル。

買う前の不安

・Bluetoothだと音が遅れるのでは?
・音質が落ちるのでは?
・イヤホン自体の充電が持たなくて、外ですぐ電池切れになるのでは?
・途中で接続が切れて、大音量で音が外に流れたりしないか?

買った後にどう思ったか

・Bluetoothだと音が遅れるのでは?
→ほとんどない。
 曲の再生時にちょっとイントロが3秒くらい遅延して、上手く再生できないのはある。
 個人的にはそんなに気にならない
・音質が落ちるのでは?
 →音質は悪くないと思った。
・イヤホン自体の充電が持たなくて、外ですぐ電池切れになるのでは?
 →毎日充電してれば平気。
  一週間とか無充電で使うとかだと厳しいだろう。
・途中で接続が切れて、大音量で音が外に流れたりしないか?
 →驚いたけど、全然接続が切れない。
  接続が切ったときも、iPhoneなら有線イヤホンと同じように音楽が止まる

買って感動したこと

音の遅延と充電が必要なのが課題だが、
それを補ってあまりあるくらい、イヤホンのコードがなくなるのは快適だった。
特に通勤電車で、よくコードをひっかけておりるときにストレスになっていたが、
Bluetoothイヤホンにしてからそういうストレスから解放された。
ランニングのときに使うのもよかった。
個人的にポケットにスマホいれながら走ると荷物が多くてイヤなので、
iPod Shuffleで使えるとよかったのだが、ShuffleはBluetooth対応していなかったため、ダメだった。
ランニングに使うかはちょっと考える。
(了)

左足壊死ニキと遭遇した話と彼の死について

大学の駅前にいたホームレスが亡くなったそうだ。


ホームレスに対する気持ちについて

別に僕は善人ではないし、四ツ谷駅前にいたホームレスについて、何かを知っているわけではないので、何か語る権利はないと思っている。
ただ、ホームレスには、何か複雑な感情を抱いている。
同情でもないし、親しみでもないし、上手く説明はできない。

路上で生活するということは、言うまでもなく特殊事例だ。
僕は最初、単に金がなくなるとホームレスになるのだと思っていたが、
大学時代に社会制度についてちょっと知ると、金がなくなったとしても、突然路上生活者になるわけではないのだと知った。
生活保護だとか、実家に逃げ込むとか、色々手はある。
そういう手段を使わずに、敢えて路上で生活しているというのは、結局は社会を信用してないということに他ならない。
つまりホームレスであることは、貧困であるのとともに、社会に対する反抗でもある。

ホームレスに向けられる気持ちというのは、軽蔑であったり、嫌悪感であったり、
「ああはなりたくない」という気持ちであったり、「ホームレスであっても差別すべきではない」という気持ちであったり、
そういう種々の感情が入り乱れて、僕の中で混乱しているのだと思う。
ただ、社会制度に依らずに生きているという点で、
その点だけは尊敬してたんだなと今考えてみて思った。

僕も大概、色々な人から嫌われているが、ホームレスほどではないと思う。
恐ろしい質量のヘイトを、彼らは集めて、耐えている。
耐えているという表現は多分間違っていて、そうせざるをえない状況に、色々な事情で追い込まれた。
本当のところ、彼らに何があったのかはわからない。
もしかしたら、本人にすらわからないのかもしれない。

左足壊死ニキと遭遇した話

四ツ谷にいたホームレスの話とは違うが、ネット上で左足壊死ニキと呼ばれているホームレスと電車で会った話を書く。
左足壊死ニキとは?すでに死去?現在と目撃情報まとめ【正体、病気】 | Pinky[ピンキ-]
【変死】左足壊死ニキ死去…死因切なすぎだろ…(画像あり) : NEWSまとめもりー|2chまとめブログ
2015年冬に死亡したようだが、正確なところはわからない。

休日出社して、午前中で会社が終わったので、帰りに有楽町の高めのコートを買って、その帰りに電車に乗った。
その車両がやたら空いていた。
車両を見回してみると、座席の真ん中にサンタクロースみたいな格好した、
汚いおっさんが寝ていて、その周辺には全然人がいなかった。
しばらくたつと、アンモニア臭を強烈に煮詰めたみたいな臭いがしてきて、ああこれでみんな他の車両行ったのかと思った。
避難する人々を見ながら、自分は臭いにはそんな敏感じゃない方だったので耐えられるだろう、
たかだか十分やそこらだと思って、そのまま我慢しようとしたんだけど、結局一分も持たずに隣の車両に移った。
隣の車両は通勤電車に近いくらい混み合っていたけれど、皆ガラガラの隣の車両に行こうとはしなかった。

電車は途中で車両点検と称して止まった。
その間に何が起こったのか知らないけれど、だいたい想像はつく。

その後しばらくして、インターネット上で左足壊死ニキというのが話題になっていて、そのときのホームレスと一致した。
変形した左足に、ビニール袋をしている姿。
彼は左足に重めの病気があるだけでなく、ひどい統合失調症らしかった。
福祉施設の職員が何度か保護したそうだけども、脱走してしまうらしい。
やがて2015年の冬に、彼は死んでしまったらしい。確かにそれから彼のことを見ていないので、平仄はあっている。

左足壊死ニキの死について

ホームレスが一人死ぬ、というのは、きっと僕が知らないだけでよくある話なのだと思う。
しかし、電車で一つの車両に、彼以外誰もいなくなったのを見た。
統合失調症で周りのことがどのぐらい正確に把握できていたのかはわからないけれど、孤独でないはずはない。
電車の中で体臭がひどい人間がいれば、迷惑に感じる。
たださすがに車両を移ることはそうそうない。
そのぐらい彼の臭気は常軌を逸していた。
「ホームレスであっても電車に乗る権利はある」という風な主張をする気はない。
一車両の客を丸々追い出してしまうようなホームレスは、やはり電車にのるべきではない。

また、そういう人間を社会制度や人間の善意で救えるとも思えない。
社会制度は不完全であり、人間の善意はもとより信じるべきではない。
救えるとしたら、もっと前だったのだろう。
彼が左足壊死ニキになる、もっと前。
彼がホームレスになる前に何をしていたのか、どういう家庭で育ったのか、僕に知ることはできない。
想像すらもつかない。
極貧家庭に生まれて、ひどい両親を持って、家から逃げるように上京して、日雇いの仕事をずっとするうちに体を壊し、精神に支障をきたしたのかもしれない。
あるいは案外裕福な家庭に生まれていたが、親との関係がこじれて家出したのかもしれない。
いくつかの想像はできるけれど、それは想像でしかない。
その想像が正しかったにせよ、間違っていたにせよ、あまり意味のないことなのだと思う。

彼の死はきっと、どこか遠くない時期に約束されていたものなのだと思う。
それに対して僕や誰かが何かできたとは思えない。
結局のところ、人間が人間であり続ける限り、そういう風な死に方をする人というのは出てくる。
昔もいたし、今もいるし、きっとこれからもそうなのだろう。

最初は小さなひずみだったのかもしれない。
小学校で乱暴だったとか、おとなしかったとかで、友達ができなかった。
中学校で運動神経が悪くて、勉強もできなかったので、馬鹿にされはじめる。
高校で顔がよくなくて女にモテないことに気づく。
高校を卒業して、自分が金を稼げないことに気づく。
ひずみはだんだん大きくなっていって、やがて社会と断絶するようになる。
社会が彼を拒んだのではない。彼が社会を拒んだのだ。
そして、社会を拒否することが、彼にとって、社会との接点になる。
敵対関係にあるということが、彼と外界とのあり方になる。

警察が突然偉そうに話しかけてきたり、イキった中学生が襲ってきたり。
誰も同情してくれない。
いや、同情するポーズは善良な市民たる我々はするが、中学生がホームレスを襲っている現場を見て、助ける人間がどのぐらいいるだろうか?
そもそも所謂「普通の生活」を送っていれば、そういうシチュエーションに出くわすことはまずない。
せいぜいネットでホームレス襲撃のニュースを見て、憤るくらいだ。
「絶対に許せない! 犯人を見つけて絶対に罰を与えるべきだ!」とYahoo!ニュースにコメントして、
家族との会話とか、同僚との昼飯とかで話題にするくらいなものだろう。
殺されれば同情はするが、電車に乗ってきたら全力で隣の車両に逃げるはずだ。
もちろんそれとこれとは話は別だ。
ただ、嫌悪感という土壌が、善良な市民の中にも、ホームレスを襲撃した中学生と同じようにあったことは認めるべきだ。

誰からも嫌われてない人間なんていないと思う。
自分が嫌われたシチュエーションを思い浮かべて、それを凝縮して、その挙句死んだと考えると、左足壊死ニキの死に方と近くなるんだと思う。
愛される人間と、嫌われる人間とがいる。
たとえば、日本人全部を雑に愛される順で並べてみる。
一位は天皇陛下だろうか、などと言えば左翼的な人間から叩かれるだろうし、
石原さとみだろうかと言えば、彼女を好きじゃない人もいるだろう。
最下位は左足壊死ニキだろうか、というと、これも多分そうではないだろう。
少なくとも僕は、彼よりは嫌いな人間がたくさんいる。
社会的地位があろうとなかろうと、好きな奴は好きだし、嫌いな奴は嫌いだ。

日本人全員、というと途方もない。
だから人間は小さな集団をつくって、その中で自分がどの程度の地位にいるかで、「愛されているランキング」の順位を推し量る。
ホームレスになると、もはやそういう集団すらなくなる。
そうすれば、「愛されているランキング」から自由でいられるだろうか?
おそらくはそうではないだろう。
きっと自分がどん底まで落ちて、これ以上の下はないという最悪の感覚がずっとつきまとうのではないだろうか。

誰かがそうなる

社会全体で、椅子取りゲームをやっている。
全員分の席はないし、席はいい席と悪い席がある。
努力の要素もあり、運の要素もある。
でもとにかく、結果的には誰かがどの席にも座れず、あぶれることになる。
多分僕が左足壊死ニキに感じている憐憫や罪悪感は、根っこはそういうところから来ているんだと思う。

世の中がどこまで進歩しようとも、そもそも社会制度を使おうとしない人とか、
親と絶縁した人とか、社会から離れたい人とかを救済することはできない。
弱者救済について議論すると、「そもそも救うに値する人間なのか」みたいな話が出て来る。
「弱者が馬鹿で怠惰で無能であれば、社会にとって救うメリットはない」というのは、悲しい思想だと思う。

どういう社会になっても、誰かはひどい死に方をするハメになる。
理想は全員を救えたらいいが、理想でしかない。
救える範囲で救うしかない。
(了)