プログラマー VTuber 衣亥栖ティオのちょっとした話

Youtubeに投稿したプログラミング学習動画の補足説明をするためのブログです。

プログラマーへの道 #153 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。 この記事はYouTubeに投稿した動画の補足ブログです。

投稿した動画

今回は以下の動画の補足説明をします。


GitHub のURL

私のGitHubは以下です。
https://github.com/tio-iis

Gist のURL

私のGitst(メモ書きみたいなもの)のURLは以下です。
https://gist.github.com/tio-iis

今回の動画で実装したソースコード

今回の動画にソースコードはありません。

補足内容

動画内(スライド)の間違いについて

動画内のスライドで「ルートユーザーのログインにはAWSアカウントのIDが必要」との記載がありましたが、不要です。

MFAの設定について

MFAはAWSの利用において必須ではありませんが、一般的なWeb企業では必須となっているケースが多いので、この際に設定していくことをオススメします。 AWSに限らず、大体の有名なWebサービスでは提供されている機能なので、ご存知の方も多いかと思います。

MFAの説明は以下が詳しいと思います。
https://aws.amazon.com/jp/what-is/mfa/

AWSのMFA設定については以下が詳しいと思います。
https://dev.classmethod.jp/articles/set-up-aws-mfa-on-my-smartphone/

プログラマーへの道 #152 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。 この記事はYouTubeに投稿した動画の補足ブログです。

投稿した動画

今回は以下の動画の補足説明をします。


GitHub のURL

私のGitHubは以下です。
https://github.com/tio-iis

Gist のURL

私のGitst(メモ書きみたいなもの)のURLは以下です。
https://gist.github.com/tio-iis

今回の動画で実装したソースコード

今回の動画にソースコードはありません。

補足内容

レンタルサーバVPSの具体例について

レンタルサーバは以下です。
https://rs.sakura.ad.jp/

VPSは以下です。
https://vps.sakura.ad.jp/

Amazon Web Serviceのシェアについて

以下によると世界1位となっています。
https://www.itmedia.co.jp/news/articles/2206/10/news084.html

Web系だと大体AWSGCP(Google Cloud Platform)を利用していますね。 どちらも似たようなものなので、(キャッチアップは必要なものの)どちらか一方が使えれば業務でも困ることはないと思います。

Web系IT企業のクラウドサービス利用事情について

Web系IT企業のクラウドサービス利用は現在とても一般的なものになっています。 クラウドサービスを利用していない企業を探す方が難しいくらいです。

しかし、動画内でも言及した通り、一部の大手企業はクラウドサービスを利用していません。 クラウドサービスを利用しないメリットとしては、以下があると思います。

  1. クラウドサービスを利用するよりも費用が安い。
  2. クラウドサービスでは用意できない特殊なサーバを用意することができる。

なので、一概にクラウドサービスが良いとは言えず、その会社の戦略次第なところがあります。

以下はDeNAさんの記事になりますが、オンプレ(自分たちでサーバを購入する方法)からクラウドサービス利用に移行したというものです。 当時3000台のサーバを自社で保持していながら、クラウドサービスに移行したというなかなか聞けない話だと思うので、 ぜひ読んでみてください。
https://fullswing.dena.com/archives/7425

AWSの利用費用について

AWSの利用費用は従量課金制であり、何をどのくらい利用したかで費用が決まります。

例えばCPU2コア、メモリ8GBのサーバを利用する場合、1時間あたりの費用は0.099 USDです。 1ドル130円だとすると、12円ですね。 1時間サーバを動かすのに必要な費用が12円というのは、とても安いように思えますね。 個人で土日にサーバを利用して勉強するだけであれば、かなり安く済みそうです。

ただ、実際にWebサービスを運用する場合、サーバは24時間365日動くので、 CPU2コア、メモリ8GBのサーバ1台を1年間動かすのにかかる費用は 12円 * 24 hours * 365 days = 105,120円になります。

人気のWebサービスになるとサーバが1台では足りませんし、CPU, メモリのスペックもある程度高くないといけません。 仮に100台のサーバが必要であり、サーバ1台あたりのCPU, メモリのスペックもそれなりに高くなると・・・・実は年間で数千万、数億という費用がかかります。 クラウドサービスって意外と高いんですよね。

個人の勉強でも利用方法を間違うと多額の費用を請求されてしまいます。 利用には注意ですね。
https://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694

AWSの無料枠の規約について

以下にあります。
https://d1.awsstatic.com/legal/AWSFreeTierTerms/AWS%20Free%20Tier%20terms%20-%20JAPANESE%20%20(2018-08-14)%20UPDATED.pdf

AWSではできないこと

動画内で「AWSでできないことはほとんどない」と言及しましたが、 あくまで「ほとんど」なだけで、できないこと(他のクラウドサービスには存在するけど、AWSには存在しない機能)はあります。

一番分かりやすいのは"強整合性を持ち、Writeがスケールするフルマネージドな分散型DB"です。 GCPには Spanner という機能(サービス)がありますが、AWSにはありません。

AWS, GCPはそれぞれ似たようなサービスを持っているので、どちらを使っても良いのですが、細かいところで違いがあるので、 エンジニアとしてはどちらのクラウドを利用するかを適切に選択できるようになると良いと思います。

作ったもの解説 #4 メモ帳アプリのサーバサイドバリデーション

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は "Go言語のバックエンドサーバで実装したメモ帳アプリ" の解説をします。
解説動画は以下です。


衣亥栖ティオについて

都内でサーバサイドエンジニアとして働いています。 普段利用しているプログラミング言語はGoなので、JavaScriptはほとんど書いたことがありません。

プログラミング学習動画 "プログラマーへの道" のコンセプト

"プログラマーへの道" のコンセプトは "必要最低限の学習でアプリケーションを作る" というものですが、 これは "学習する" -> "アプリを作る" -> "学習する" -> "アプリを作る" というサイクルを回していくためです。

プログラミングには多くの知識が必要となるので、細部にこだわればこだわるほど必要となる知識は多くなってしまいます。 プログラミングを学習するために書籍を購入した結果、結局何も作れずに挫折した人も多いのではないでしょうか?

プログラミングはアプリケーションを作ってみないと楽しさが分からないと思うので、 "必要最低限の学習でアプリケーションを作る" というコンセプトで動画を作成しています。

ソースコード

この動画の時点でのソースコードは以下です。
https://github.com/tio-iis/memo-server/tree/f1623fd399bfa87241b99fc8178d53a99deecd84

サーバサイドのエラーハンドリング、ログ出力、エラーレスポンスを学ぶことができる

動画内でも言及している通り、Webアプリケーション開発ではサーバサイドバリデーションを採用するのが一般的です。 サーバサイドバリデーションはサーバサイド側でバリデーションをするというシンプルな方針ではありますが、 エラーハンドリング、ログ出力、エラーレスポンスの実装が必要になるので、意外と難易度が高かったりします。

サーバサイドバリデーションの実装動画では、それらの基礎を学ぶことができるので、興味のある方はぜひ視聴してみてください。

プログラマーへの道 #151 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。 この記事はYouTubeに投稿した動画の補足ブログです。

投稿した動画

今回は以下の動画の補足説明をします。


GitHub のURL

私のGitHubは以下です。
https://github.com/tio-iis

Gist のURL

私のGitst(メモ書きみたいなもの)のURLは以下です。
https://gist.github.com/tio-iis

今回の動画で実装したソースコード

今回の実装は以下です。
https://github.com/tio-iis/memo-server/pull/64/files

現時点でのソースコードは以下です。
https://github.com/tio-iis/memo-server/tree/3f65ecc2a5ead62ae420a5ba0e404a2c3487f23e

補足内容

なし

プログラマーへの道 #150 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。 この記事はYouTubeに投稿した動画の補足ブログです。

投稿した動画

今回は以下の動画の補足説明をします。


GitHub のURL

私のGitHubは以下です。
https://github.com/tio-iis

Gist のURL

私のGitst(メモ書きみたいなもの)のURLは以下です。
https://gist.github.com/tio-iis

今回の動画で実装したソースコード

今回の実装は以下です。
https://github.com/tio-iis/memo-server/pull/63/files

現時点でのソースコードは以下です。
https://github.com/tio-iis/memo-server/tree/140e40a6832655f3bf5ff3e7a0d2c02e2ce79178

補足内容

関数名の抽象度について

動画内で createErrorMessage() という関数を作成しました。
https://github.com/tio-iis/memo-server/pull/63/files#diff-0eb547304658805aad788d320f10bf1f292797b5e6d745a3bf617584da017051R439

一見問題なさそうな関数名ですが、この関数はあくまで"メモを登録する場合と更新する場合"でのみ利用される関数です。 createErrorMessage()という関数名だとそれが伝わらないので、 本来であればもう少し具体的な命名にすべきだと思います。

シンプルに考えると createErrorMessageWhenAddAndUpdateMemo(), createErrorMessageForAddingAndUpdatingMemo でしょうか。 少し長いですね。 いい名前が思いつかなかったので、一旦 createErrorMessage() で妥協しました。

関数名に限らず、ソースコード上の命名はあとから変更することが可能なので「適切なものが思いつかないから一旦今のままで進める」というのは、業務でもよくあります。

プログラマーへの道 #149 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。 この記事はYouTubeに投稿した動画の補足ブログです。

投稿した動画

今回は以下の動画の補足説明をします。


GitHub のURL

私のGitHubは以下です。
https://github.com/tio-iis

Gist のURL

私のGitst(メモ書きみたいなもの)のURLは以下です。
https://gist.github.com/tio-iis

今回の動画で実装したソースコード

今回の実装は以下です。
https://github.com/tio-iis/memo-server/pull/62/files

現時点でのソースコードは以下です。
https://github.com/tio-iis/memo-server/tree/dbfbcd94404c094706af82ab9fd0a2d34e12a2f9

補足内容

現実的に発生しないエラーに対する対応について

今回の実装では、メモを削除する際に発生するHTTP Status = 400,404 のエラーは現実的に発生しないという話をしました。 バックエンドサーバの実装上は発生しますが、利用者が意図してエラーが発生する操作をしない限り、発生しない可能性が高いです。 本来であれば、こういった発生確率が低いエラーであっても、利用者が困らないようにメッセージ表示を工夫するのが理想ですが、 今回は一旦簡易的なエラー表示(アラートでのエラー表示)を選択しました。

現実の開発でも開発スケジュールが厳しい場合は、こういった「発生する可能性が低い問題」に対する対応は優先度を低くすることがあります。

プログラマーへの道 #148 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。 この記事はYouTubeに投稿した動画の補足ブログです。

投稿した動画

今回は以下の動画の補足説明をします。


GitHub のURL

私のGitHubは以下です。
https://github.com/tio-iis

Gist のURL

私のGitst(メモ書きみたいなもの)のURLは以下です。
https://gist.github.com/tio-iis

今回の動画で実装したソースコード

今回の実装は以下です。
https://github.com/tio-iis/memo-server/pull/61/files

現時点でのソースコードは以下です。
https://github.com/tio-iis/memo-server/tree/4edd82275545f4d23a6c46d61eb5d63bad116f37

補足内容

バックエンドサーバからレスポンスを受け取る際の非同期処理について

動画内で「JavaScriptがバックエンドサーバと通信するとき、バックエンドサーバからのレスポンスは非同期で返ってくる」という言及をしました。 非同期処理というのはJavaScriptにおいてとても重要な概念です。

以前の実装では、以下のように memos.addMemo() からエラーメッセージが返却され、 それを確認することでエラーメッセージを表示していました。
https://github.com/tio-iis/memo-server/blob/4edd82275545f4d23a6c46d61eb5d63bad116f37/index.html#L405-L411

これは以下のようにバックエンドサーバにリクエストを送信する前にバリデーションを実行できたからです。
https://github.com/tio-iis/memo-server/blob/4edd82275545f4d23a6c46d61eb5d63bad116f37/index.html#L217-L221

しかし、現在の実装ではバックエンドサーバにバリデーションを実装しているので、 JavaScript側がバリデーション結果を知るのはバックエンドサーバのレスポンスが返ってきたあとになります。 ここでのポイントはJavaScriptがバックエンドサーバからのレスポンスを受け取るときには、 すでにmemos.addMemo()の処理は終わっているということです。 バックエンドサーバからのレスポンスを受け取る以下の実装は memos.addMemo() のメソッドが実行されたあとに実行されます。
https://github.com/tio-iis/memo-server/blob/4edd82275545f4d23a6c46d61eb5d63bad116f37/index.html#L227-L248

そのため、バックエンドサーバのレスポンスを扱う無名関数の中で値を return しても、 memos.addMemo()の戻り値としては扱われません。

これはJavaScriptがシングルスレッドで動作するのが理由です。 シングルスレッドの概念と非同期処理の説明は以下にあるので、興味のある方は読んでみてください。
https://qiita.com/ryosuketter/items/dd467f827c1b93a74d76