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

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

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

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


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

今回の動画では実装をしなかったので、ソースコードはありません。

ライブラリのデメリットについて

動画では以下を挙げていました。

  1. ライブラリがサポートしていない処理がある。
  2. ライブラリ自体がなくなることがある。
  3. ライブラリの学習コストが必要になる。
  4. 似たようなものがたくさんある場合にどれを利用するかを決めるのが大変。

2,3,4番はデメリットが明確だと思うのですが、1番は補足が必要だと思うので、ここで補足します。

1番は "ライブラリでサポートしていない処理があった場合、どうするのか?" という問題を取り上げたものです。 最悪の場合、別のライブラリに切り替える必要があるのですが、その場合プログラムの修正コストがかかってしまいます。 ライブラリの利用箇所が多ければ多いほど修正が大変になってしまいますね。

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

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


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

ソースコードGitHubで管理しています。

前回からの差分は以下です。

#49 by tio-iis · Pull Request #1 · tio-iis/memo-app · GitHub

ソースコード全体は以下です。

memo-app/index.html at tag-#49 · tio-iis/memo-app · GitHub

Day.js について

Day.js は日時を簡単に扱うことができるJavaScript用のライブラリです。

Day.js · 2kB JavaScript date utility library

ライブラリは汎用的に利用できるプログラムを切り出して、共用できるようにしたものなので、異なるプログラミング言語では利用できません。 例えば、Day.js を JavaScript 以外の言語で利用することはできません(実は一部のプログラミング言語は他のプログラミング言語と互換性を持つので、その場合は利用することができるのですが、ややこしくなるので説明はしません)。

JavaScript における日時操作のライブラリとして、以前は Moment.js というライブラリが主流だったようですが・・・

Moment.js | Home

現在は開発が停止しており、メンテナンスのみ対応するようです。

Moment.js | Docs

以下で Moment.js の代わりとなるライブラリがいくつか紹介されていたので、その中から Day.js を選択しました。

Moment.js | Docs

複数の候補から Day.js を選定した理由ですが・・・実は特にありません。 パッと目に入ったのが Day.js だったからです。

今回のライブラリの利用用途は日付のフォーマット整形だけでした。 この程度の機能であれば、どんなライブラリであってもサポートしていますし、 メモ帳アプリは学習用に作っているだけなので、仮にライブラリがなくなってもさほど困りません。 そういった前提であれば、どれを選んでもよいと判断しました。 強いて言えば、Day.js のサイトを見たときに "2kB(サイズが小さい)" という特徴があった点くらいでしょうか。

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

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


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

ソースコードGitHubで管理しています。 今回のソースコードは以下のリンクから確認することができます。

https://github.com/tio-iis/memo-app/blob/53cb9a2d73e0873afd0da80eefad1c850461eed6/index.html

動画内の不具合について

動画では "タイトルと本文を入力せずにメモが登録できる" という不具合がありました。 原因はタイトルと本文に対するバリデーションである validateMemo() の戻り値でした。 以下の return false, return true が存在しない場合、"モーダルにエラーを表示するが、処理が止まらずにメモを登録する" という挙動になってしまいます。

  function validateMemo(title, body, errorHTMLElement, memoId) {
    //省略

    if (errorHTMLElement.innerHTML.length > 0) {
      errorHTMLElement.style.display = ""
      return false
    }

    return true
  }

そこで、エラーの有無を true/false で戻り値として返してあげて、 validateMemo() を利用する部分で戻り値をチェックしています。 エラーが存在する場合(return false の場合)はそこで処理を止めています(return しています)。

    if (validateMemo(title, body, validationErrorInAddModal, "0") == false) {
      return
    }

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

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


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

以下が今回実装したソースコードです。

UnixTime について

UnixTime についての説明は以下です。

UNIX時間 - Wikipedia

UnixTimeが 0 になることはないので、以下の validateMemo() の引数である memoId に 0 を指定するということは、

 function validateMemo(title, body, errorHTMLElement, memoId) {
    errorHTMLElement.innerHTML = ""
    if (title.length < 1 || title.length > 30) {
      errorHTMLElement.innerHTML = "タイトルの文字数は1文字以上30文字以下にしてください。<br>"
    }

以下の "if (tr.id == memoId)" の分岐を絶対に通らないことになります。 メモを登録する際のバリデーションではこの比較は不要なので、常に実行されないように(return に入らないように)0 を指定しています。

if (memoList.children.length > 0) {
      Array.from(memoList.children).forEach((tr) => {
        if (tr.id == memoId) {
          return
        }

重複を関数に切り出す

動画ではメモのバリデーションを関数に切り出すことでプログラミング上の重複を排除しました。 バリデーションを切り出した関数は以下です。 切り出したプログラムに必要な値を引数として用意しました。 こうすることでプログラムを柔軟に切り出すことができます。

  function validateMemo(title, body, errorHTMLElement, memoId) {
    errorHTMLElement.innerHTML = ""
    if (title.length < 1 || title.length > 30) {
      errorHTMLElement.innerHTML = "タイトルの文字数は1文字以上30文字以下にしてください。<br>"
    }

    if (body.length < 1 || body.length > 100) {
      errorHTMLElement.innerHTML = errorHTMLElement.innerHTML + "本文の文字数は1文字以上100文字以下にしてください。<br>"
    }

    if (memoList.children.length > 0) {
      Array.from(memoList.children).forEach((tr) => {
        if (tr.id == memoId) {
          return
        }

        const t = getIdTitleInMemoList(tr.id).innerText
        if (title == t) {
          errorHTMLElement.innerHTML = errorHTMLElement.innerHTML + "すでに登録済みのタイトルです。<br>"
        }
      })
    }

    if (errorHTMLElement.innerHTML.length > 0) {
      errorHTMLElement.style.display = ""
    }

    return
  }

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

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


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

すみません、残すのを忘れてしまいました・・・。

Visual Studio Code の文字列置換機能について

こちらにありました。 左のメニューにある虫眼鏡アイコンから検索 & 置換ができるようです。

Basic Editing in Visual Studio Code

私が動画中で利用したのはこの機能ではなく、Vim Plugin の文字列置換機能です。 これについては次で説明しています。

VimVisual Studio Code の Plugin

Vim はプログラミング開発で利用されるテキストエディタの1つです。 高機能なメモ帳だと思ってください。

Vim - Wikipedia

Vim の特徴の1つとして "モード" という概念があります。 これは "カーソル移動と文字入力を異なるモードで実行する" という、よく分からない表現になってしまいますが、少しクセがあるエディタだと思ってください。 そして、私は業務で Vim を利用しているので、Vim じゃないとプログラミングが書きづらいと感じるようになってしまいました。 Vim に限らず、特定のエディタの使い勝手に慣れたエンジニアは大抵同じような状況に陥ります。 そこで私は Visual Studio Codeプラグイン機能で Vimプラグインをインストールしています。

Vim - Visual Studio Marketplace

Visual Studio Code にはプラグインという機能があり、標準で搭載されてない機能を追加でインストールすることができます。

Managing Extensions in Visual Studio Code

このプラグインは自由に開発して公開することができるので、現在多くのプラグインが存在します。

Extensions for Visual Studio family of products | Visual Studio Marketplace

私が動画で利用した文字列置換の機能は、この Vim Plugin の置換機能です。

作ったもの解説 #1 プログラミング未経験者でも13時間で作れる? JavaScriptで動くメモ帳アプリ

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は "プログラミング未経験者でも13時間で作れるJavaScriptで動くメモ帳アプリ" の解説をします。
メモ帳アプリの動作については以下のツイートに載せています。



動画でも取り上げています。


衣亥栖ティオについて

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

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

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

プログラミングには多くの知識が必要となります。 今回作成したメモ帳アプリもこだわろうと思えばいくらでもこだわることができますが、こだわればこだわるほど必要となる知識は多くなってしまいます。 プログラミングを学習するために書籍を購入した結果、プログラミングを始める前の環境構築に挫折した人も多いのではないでしょうか? 私が最初のアプリケーション作成としてブラウザベースのもの(JavaScript)を選択したのはブラウザとメモ帳があれば開発可能だからです。 そして、実はメモ帳アプリを開発することも最初から決めていたので、 メモ帳アプリの開発まではそこで必要となる知識のみを動画にしていました。

プログラミングはアプリケーションを作ってみないと楽しさが分からないと思うので、私の動画を見て少しでもプログラミングに興味を持ってもらえるといいなと思っています。 今後も "必要最低限の学習でアプリケーションを作る" というコンセプトで動画を作成する予定です。

プログラミング未経験者でも13時間の動画を見るだけでメモ帳アプリを作ることができる

今回のメモ帳アプリはプログラミング未経験者の方を対象にしているので、HTML, JavaScript, CSS の基礎から動画で説明しています。 それにも関わらず合計13時間程度の動画でメモ帳アプリを作れるのは "必要最低限の学習でアプリケーションを作る" というコンセプトに振り切っているからです。 ただ、私の説明だと分かりづらい部分もあると思うので、視聴者自身が自分で不明点を調べる必要はあると思っています。

メモ帳アプリを作るまでのざっくりとした工程

メモ帳アプリを作るまでの工程ですが、以下のような流れになっています。

  1. JavaScriptでプログラミングの基礎を学習する
  2. メモ帳アプリ(プロトタイプ)を作る
  3. JavaScriptを本格的に学習する
  4. CSSの学習をする
  5. メモ帳アプリを作る

プロトタイプになってしまいますが、最初のメモ帳アプリは動画の第8回目で作っています。 これも "必要最低限の学習でアプリケーションを作る" というコンセプトを意識したものです。 一番挫折しやすいのは3番目の "JavaScriptを本格的に学習する" だと思います。 これでも必要最低限の知識に限定したつもりなのですが、他の工程に比べると理解するのが難しいかもしれません。 各動画の時間も長めです。 5番目の "メモ帳アプリを作る" は私のJavaScriptスキルが低いこともあって、実装に時間がかかってしまいました。 動画の数も多めです。

学べること

13時間分の動画でWebFrontend開発の基礎は学ぶことができるのではないかなと思っています。 少なくともメモ帳アプリ程度のものであれば、自分で調べながら作ることができるようになっているはずです。

学べないこと

現在のWebFrontendでは React などのフレームワークを利用するのが主流であり、プログラミング言語も TypeScript を利用します。 チーム開発だと Git & GitHub は必須ですし、ローカル環境も WebPack などで構築することになります。 動画ではこれらを扱っていません(ライブラリすら扱っていません)。 そのため、あくまで "作れるだけのスキルを身につけられる" だけであって、とても業務レベルでやっていけるスキルを身につけられるわけではないです。

今後について

今後は今回開発したメモ帳アプリを利用しつつプログラミングに必要な知識を紹介する動画を作っていこうと思います。

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

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


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

以下が今回実装したソースコードです。

リファクタリングはいつやるべきか

動画でも分かるようにリファクタリングは意外と大変な作業です。 先延ばしにすればするほど、コードは散らかっていき、リファクタリングはより大変になってしまいます。 そう考えると実装しつつ都度リファクタリングするのが良いように思えます。 しかし、最終的にどのようなプログラムになるのか分からない時点でリファクタリングをしても、そのリファクタリングが有効かどうかが分からないケースもあるので、 すぐにリファクタリングするのが最善とは言えません。 ここらへんは実際に経験を積んで勘所を身につけるしかないかなと思っています。