このシリーズ記事では私の体験を記録として残すべくあれこれ書いていますが、読んでいても結局何をしたら真似できるのかわからんぞ、というご感想もあろうかと思いますので、私の環境を共有する記事もちょっと書いておこうと思います。
以前から「WebブラウザをGUIとしたアプリケーションを作った」という話をずっとしているわけですが、それってそもそもどうやるのと思われた方もいらっしゃるかもしれません。何をどう調べたら情報が出てくるかもあまりよくわからない感じがします。
挑戦しようとした時に一番困ることは、まさにこの「何を調べたらいいのかがわからない」ということだと思います。何を調べたらいいのかがわかるなら調べればいいのです。なので、私のスタンスとしては、知識そのものを提供するのではなく、何を調べたらいいのかの手掛かりになることを目指して書くことにします。知識の理解の手助けは私自身初学者ゆえ何も責任を持てませんので、学習そのものは書籍や学習サービス、インターネット検索などでどうにか頑張ってください。
なお親切な書籍やサービスはたくさんあるかと思いますが、私自身はインターネットの力で強引に進んできましたので、これがいいよというのを具体的に薦めることはできません。その上どういうワードで何を調べたのかも曖昧です。なので、全く良い導き手ではないことを先に侘びておきます。ですが「自分のペースでのんびりやりたい人」の良き友人でありたいと思っています。
本題に戻りましょう。WebブラウザをGUIとしたアプリケーションを自作するというのは、超簡単に言うと「自前のHTMLをブラウザで開く」ということです。GUIとは、コマンドプロンプト的ではない、マウスなどによって操作可能で人間にわかりやすいインターフェースのことです(「アプリケーション」と言って思い浮かぶものがつまりGUIです)。
その「自前のHTML」にてCSSやJavaScriptを呼び出して機能を使えるようにしているわけです。最もシンプルな方法は、拡張子htmlのファイルに然るべき書き方であれこれ書いて、ファイルをダブルクリックするなどして開くというものです。
htmlファイルの開き方はいくつかあります。列挙すると例えば以下のような選択肢です。言っている意味がわからないところもあるかもしれませんが、最初から全部理解する必要はありません。
htmlファイルをそのままWebブラウザで開く
ローカルサーバーを立て、htmlファイルを呼び出してWebブラウザで開く
Electronのアプリケーションとしてhtmlファイルを開く(※Webブラウザではない)
どうしてこのような複雑な選択肢が生まれてしまうのかというと、Webブラウザにはローカルファイルの扱いに於いてセキュリティのための制約があるからです。1は制約がそのままで、2、3はその制約を回避しています。
ノートテイキングアプリケーションを作る場合、データというのはローカルファイルとして存在して、アプリケーション上で編集するためにそのファイルの中身を呼び出し、書き込んで保存する、という形になってほしいものと思います(私はそうです)。持って回った言い方になりましたが、ファイルを編集するタイプのデスクトップアプリケーションは普通そうなっています。
しかし、Webブラウザ上で実行するスクリプトによってローカルファイルを編集できるようになっていては危険極まりないので、Webブラウザでは通常そういうことができないようになっているわけです。ローカルファイルの内容を読み取るだけなら簡単な方法があるのですが、書き込むことはどう頑張ってもできません(ローカルサーバーを使わない限り)。
GUI自体を作ることができる言語を使えばこの問題は起こりませんが、GUIを作るというのはおそらくプログラミング初心者にはかなりハードルが高いので、セキュリティの問題の複雑さとの戦いがあってもなお「HTMLを書いてWebブラウザで開く」という方式を採用しています。
日頃、WebブラウザをGUIとして利用したアプリケーションについて語る中で、ローカルサーバーがどうこうとかElectronがどうこうとかいう話をしばしば登場させていますが、それはこういう事情によるものです。
最初の最初は普通にWebブラウザで開いて動かすものを作るのが簡単です。ローカルファイルへの保存は直にはできませんが、ブラウザ内には保存領域があるので(localStorage)、データが失われないように保存すること自体は可能です。なのでローカルサーバーだのElectronだのということがわからなくてもアプリケーションとして成り立つものは作ることができます。
やがて「ローカルファイルに保存できたらいいのに!」という気持ちが高まったらローカルサーバーやElectronの勉強をするということになるでしょう。ちなみに、Webサイトの運営をしたことがある人はサーバーというものに馴染みがあるかもしれませんが、私は全く無縁だったためサーバーという概念の理解が難しく、先にElectronを習得することになりました。今はElectronをやめてローカルサーバーでやっています。どちらが簡単ということはなく、それぞれ違う種類の難しさがあると思います。
ここまでの話と補足情報をまとめてざっくり整理しておきます。
WebブラウザをGUIとした自作アプリケーションとは、ここではhtmlファイルを書いてWebブラウザで開いて動かすものを指している。
Webブラウザは基本的にローカルファイルを編集できないようになっている。
代わりにWebブラウザにはlocalStorageという保存領域がある。
Webブラウザからローカルファイルを編集するならローカルサーバーを立てる必要がある。
WebブラウザではなくElectronというフレームワークを使えばローカルファイルを自由に編集できる。
- ElectronはWebブラウザではなくデスクトップアプリケーションだが、Chromium(Google ChromeやEdgeなどモダンなブラウザの核みたいもの)を使ってレンダリングしているので、感触としてはWebブラウザとほぼ同じ。
すぐ必要になるので検索すると良いかもしれないキーワードは以下の通り。
HTML
CSS
JavaScript
localStorage
ブラウザのデベロッパーツール
いつかは調べることになるけど焦らなくていいキーワードが以下の通り。
ローカルサーバー
Electron
Chromium
Node.js
それでは最後に、htmlファイルを適当な名前で適当なフォルダに作ってみましょう(どこでもいいです)。
そのhtmlファイルを「メモ帳」か他のテキストエディタで開いて、以下をコピペしてください。簡単なスクリプトを書いてあります。
https://gist.github.com/nora-tetsu/b650bb9b9ae2f89d1f278ebacd1769ca
Webブラウザでこのhtmlファイルを開いてみましょう。こういう画面になると思います。(フォントは全然違ったものになると思います。)
テキストエリアに何かしら入力して追加ボタンをクリックすると、書いたものが下に表示されるはずです。入力と追加を繰り返すとどんどん下に追加されます。
追加されたものをダブルクリックしてみましょう。すると削除していいか聞かれます。OKで記述は削除されます。
これは簡単な例ですが、こういう処理の組み合わせによってアプリケーションを作っていくことになります。localStorageへの保存処理を作ってドラッグアンドドロップ処理や編集機能などを加えればToDoリストなどとして使えるものになるでしょう。
こんな感じでツールづくりのヒントを書いていこうかと思います。自分自身が初学者だから書けることというのも何かしらあるのではと思っています。先生ではなく隣の席の「ちょっと予習進んでるやつ」くらいの立ち位置のつもりです。一連のシリーズ記事の主目的は体験の文章化なのでこちらは余力があればになりますが、よろしければ参考になさってください。
なお、これは本シリーズに於いて「プログラミングの話が書いてあるのに参考にできない」という穴を埋めるためのものであり、正確な知識や網羅的な情報を提供することを目指したものではありません。独力で調べられる方は自力でお調べくださいますようお願い致します。