Webアプリケーションを作ろう

概要

ここでは「計算機アプリ」の作成を通して、 Webアプリケーションを作成するための基本的な手順を step-by-step で学べます。
プログラミングの基本的なことは身に付いている前提ですので、 そうでない人は C言語の教科書をおさらいしておきましょう。

Webアプリケーションについて

WebアプリケーションはWeb上で使えるアプリケーションです。
ブラウザがあれば使えるので、通常のアプリケーションと比べてユーザにとっては以下のメリットがあります。
  • OSや環境に依らず使用できる。
  • インストールや設定等が不要ですぐ使える。
  • (多くの場合で)スマホから使えて便利。
また、開発者にとっては以下のメリットがあります。
  • 利用者のOSや環境を考慮しなくて良いので、開発が楽。
  • ブラウザで使うので、表示周りのプログラムが楽。
  • バグの修正やバージョンアップをユーザに確実に反映させることができる。
  • 色々な人に使ってもらいやすい。
一方、通常のアプリケーションと比べてユーザにとってのデメリットは
  • インターネットに繋がなければ使えない。
  • 使用するために通信が必要なので、スマホの通信制限の影響を受ける。
  • 手元にインストールできないので、ページがなくなると使えなくなる。
があり、開発者にとってのデメリットは
  • サーバが必要。
  • 古いブラウザ(主にIE)に対応するのが非常に面倒。
があります。

用意するもの

Webアプリの開発にあたっては、以下のものを用意する必要があります。
  • PCとブラウザ (FirefoxまたはGoogle Chrome)
  • サーバ (とりあえず練習で作る分には不要です)
  • やる気

参考書について

勉強のためにHTMLやCSSやJavaScriptの本を購入することは良いことですが、 適当に分かり易そうな本を購入することはお勧めできません。
HTMLやCSSやJavaScriptは時代とともに大きく変化してきた言語です。
これらの古い情報を学ぶことは重要ですが、入門としては混乱するだけでしょう。
また、現在進行形で新しくなっていますが、あまり新しいとブラウザが対応しておらず、 せっかく作ったものを殆どの人が使えない、ということになります。
敢えて購入するなら、 入門HTML5(オライリー) あたりをお勧めしておきます。
ただ、それこそWebを見ればいくらでもコードはありますし、 Webページ自体がサンプルコードなので本は不要だと思います。
基本的にWeb界隈は発展が早いので、Webから情報を仕入れることになります。

エディタについて

むしろ、きちんと学びたいのであれば、まずはエディタから用意しましょう。
エディタはテキストファイルを作成するためのアプリケーションの総称です。
Windowsだと標準で「メモ帳」というエディタが付いていますが、機能が貧弱なので お勧めはできません(あまり機能が多すぎても使いにくいかもしれませんが)。

自分にあったエディタを探すことはとても大切なことです。
料理人は包丁やフライパンなどの道具にこだわりますし、 アスリートも靴や道具にはこだわるはずです。
Windowsであれば、 TeraPad か、もう少し設定が難解でも良ければ atomSublime Text をまずは使ってみるのが良いでしょう。
atom や Sublime Text は Macや Linux でも使えます。
Linux なら、Vi(Vim) か Emacs の少なくとも一方は使えるようになっておいた方が 良いと思います。

基本的な事

Webアプリは、「通常のWebページ」と何ら変わりません。
以下の3つのものを使って作ります。
  • HTML : 構造や文字を記述します。デザイン面は記述しません。
  • CSS : デザインを記述します。
  • JavaScript : 動きを記述します。
3つともただのテキストファイルですので、プログラムを書くのに特別なソフトウェアは必要ありません。
お好きなテキストエディタを使うか、Windowsに標準で付いているメモ帳でも良いです。

サーバにデータを保存するか?

Webアプリを作成する上で、「サーバにデータを保存するか」は重要な問題です。
もし保存するなら、サーバ上で動くプログラム(CGIと言います)を作る必要があります。
また、開発中の動作チェックもサーバで行う必要があります。
開発環境がLinuxなら開発環境自体をサーバにしてしまえば良いので簡単ですが、Windowsだと少し面倒でしょう。
保存しないなら、動作チェックにサーバは不要ですので簡単です。
ここでは、サーバにデータを保存しないWebアプリケーションを作成します。

jQueryについて

jQueryは、JavaScriptのライブラリです。
簡単に言えば、JavaScriptをとても使いやすくするものです。
同様のライブラリはjQuery以外にもありますが、ここでは知名度も高いjQueryを使います。
jQueryには大きく分けて3つのバージョンがあります。
  • jQuery 1.x : 最も古いバージョンです。古いブラウザにも対応しています。
  • jQuery 2.x : 1.x と 3.x の間のバージョンです。
  • jQuery 3.x : 最も新しいバーションです。新しい機能も使えます。
よほど新しい機能を使いたい場合でなければ、jQuery 1.x を使えば良いです。
新しい機能を使いたいのであれば、jQuery 3.x を使いましょう。
何れのバージョンでも、uncompressed(非圧縮)版とminified(圧縮版)があります。
その違いはインデント(空白)や改行を残しているか、消しているかの違いだけで、コードは同じです。
minifiedの方が容量が少ないので、通常は minified 版を使います。
ここでは、jQuery 1.x の minified 版を使っていきます。

Step 0
準備

拡張子の表示

まず、Windowsを使うなら拡張子を表示するようにPCの設定を変えましょう。
拡張子とは、ファイル名の最後に付く「.exe」とか「.txt」のようなもので、 ファイルの種類を示すものです。
Windowsは標準設定では拡張子を隠しますが、プログラムを作る上ではそれでは困るので、 拡張子を表示させましょう。
方法はWindowsのバージョンによりますのでGoogleで検索しましょう。

作業フォルダの作成

次に、適当な場所にフォルダを作りましょう。
以降、ここのフォルダの中だけで作業をします。
特にこだわりがなければ、デスクトップに作ると良いです。
フォルダ名にはなるべく「半角英数字および半角アンダースコア」のみを使いましょう。
これはフォルダ名に限った話ではなく、プログラム関係のファイルやフォルダの名前に、 空白、日本語、記号、全角文字を入れてはいけません。

ファイルの用意

フォルダができたらその中に、以下の名前で2つファイルを作りましょう。
中身は空でかまいません。
  • style.css (CSS ファイル)
  • program.js (JavaScriptファイル)
全て、ただのテキストファイルです。
拡張子が「.txt」でないため警告が出るかもしれませんが、 問題ありませんので無視しましょう。

そして、以下のリンクを右クリックし、「名前を付けてリンク先を保存」(かそれと同様のメニュー)から、jQueryもフォルダの中に保存しておきます。

ブラウザで開く

上でダウンロードして置いた index.html を、ブラウザで開きましょう。
ダブルクリックすれば、デフォルトに設定されているブラウザで開きます。
デフォルト以外のブラウザで開くには、右クリックしましょう。

開くと、真っ白なページが見えます。

index.htmlの内容について

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="style.css">
  <script src="jquery-1.12.4.min.js"></script>
  <script src="program.js"></script>
</head>
<body>


</body>
</html>
HTMLは、タグというものを書く決まりになっています。
タグとは、「<なんとか>」のようになっているもので、 それぞれ意味を持ちます。
ほとんどのタグは閉じタグ「</なんとか>」を付ける 必要があり、対応する閉じタグまでが、その中身として扱われます。
metaやlink のようなタグには、閉じタグがありません。
タグ名説明
htmlHTML全てをこの中に書きます。
headHTML(ページ)の設定を書きます。
bodyHTMLの構造を書きます。
metaページに関する詳細な設定を指定します。
titleページのタイトルを指定します。
link読み込む他のファイル(主にCSS)を指定します。
script読み込むスクリプト(主にJavaScript)を指定します。
例えば、<title> はタイトルを指定するタグです。
このタグから、閉じタグである </title>の間に 書かれた内容を、そのHTMLのタイトルとして扱います。
<title>たいとる!</title>」とすれば、 タイトルは「たいとる!」です。
試しに、適当なタイトルを入れてみましょう。日本語でも構いません。
タイトルは、ブラウザのタブやメニューバーに表示されます。
index.html を編集し終えたら、上書き保存をして、ブラウザをリロード (F5キーを押す) すると、最新の内容になります。

HTMLは、大きく分けると3つのパートから成っています。
1つ目は、1行目にある「<!DOCTYPE html>」です。
これは、この文書がHTMLであることを、ユーザのブラウザに伝えます。
2つ目は、2行目以降の「headタグ」です。
headタグの中には、このHTML(ウェブページ)の設定を書きます。
3つ目は、「bodyタグ」です。
bodyタグの中に書いた内容が、ページの内容となります。

Step 1
構造を指定する

bodyタグの中で、ページの構造を指定しましょう。
ここでは、計算機アプリの構造として、次のような構造を考えます。
「div」は、汎用のブロックです。 入れ子にできるので、色々な構造を div で表せます。
「input」は、入力用のタグです。ユーザは文字を入力できます。

主要なタグには、「id」を付けておくと、後で動きやデザインを指定しやすくなります。
id は1つのタグに1つまで設定できますが、他のタグの id と被ってはいけません。
ここには書いていませんが、「class」というものもタグに付けることができます。
class は1つのタグに幾つでも設定でき、他のタグの class と被っても構いません。

上の構造を HTML に書くと、以下のようになります。
<!DOCTYPE html>
<html>
<head>
  <title>計算機アプリ</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="style.css">
  <script src="jquery-1.12.4.min.js"></script>
  <script src="program.js"></script>
</head>
<body>

<div id="content">

  <div id="hyouji"></div>

  <div id="num_box">
    <input id="num1">
    <input id="num2">
  </div>

  <div id="button_box">
    <button type="button" class="calbutton" id="plus">+</button>
    <button type="button" class="calbutton" id="minus">--</button>
    <button type="button" class="calbutton" id="multi">×</button>
    <button type="button" class="calbutton" id="divs">÷</button>
  </div>

</div>

</body>
</html>
input に閉じタグがないことに注意しましょう。
4つのボタンには、共通してクラス「calbutton」を付け、適切な id を付けました。
マイナスの記号はフォントの面からはちょっと使い難いので、半角のマイナスを2つ繋げています。
ボタンについている「type="button"」は、「普通のボタンにする」という意味です。
通常の button タグは送信の機能を持っていますが、ここでは不要なので「普通のボタン」にしています。

上のコードを書けたら、ページを再読込みしてみましょう。
入力フォーム2つと、ボタンが4つ見えるはずです。
div はそれ単体では枠を付けたりしないので、input と button のみ見えています。

Step 2
デザインを指定する

では次に、上で作った構造(HTML)のデザインを指定しましょう。
デザインはCSSで指定します。
style.css を適当なエディタ(意味がわからなければメモ帳)で開きましょう。
そして、以下の内容を入力します。
#hyouji {
  border: 1px solid #000;
  width: 300px;
  height: 100px;
  line-height: 100px;
  text-align: center;
}

.calbutton {
  width: 60px;
  height: 60px;
  text-align: center;
  font-size: 20pt;
}

#num_box {
  margin: 10px;
  background: #faa;
}

#button_box {
  padding: 10px;
  background: #aaf;
}

#num1, #num2 {
  width: 60px;
}
CSSの書きかたは、基本的に
ターゲット {
  デザインのタイプ: 設定値;
  デザインのタイプ: 設定値;
  デザインのタイプ: 設定値;
}
の形になっています。
ターゲットの指定で、「#」から始めると「id」、「.」から始めると「class」の指定になります。
上から順に見ていくと、「#hyouji」は、id="hyouji" のタグへの設定です。
設定内容は、以下の通りです。
  • 「border: 1px solid #000;」: 枠線の設定を、太さ1px、solid(立体感なし)、黒にする。
  • 「width: 300px;」: 幅を300pxにする。
  • 「height: 100px;」: 高さを100pxにする。
  • 「line-height: 100px;」: 行の高さを100pxにする。
  • 「text-align: center;」: 文字の横方向は中央寄せにする。
line-heightの値をheightと同じにすると、内容が1行なら縦方向に中央寄せになります。

次の「.calbutton」は、class="calbutton" への設定です。
  • 「font-size: 20pt;」: フォントサイズを20ptにする。
「#num_box」は id="num_box" への設定です。
  • 「margin: 10px;」: マージンを10pxにする。
  • 「background: #faa;」: 背景色を #faa にする。
マージンとは、その要素の周りに作る余白のことです。
各タグには予め適当なマージンが設定されていますが、CSSで指定をすることで上書きできます。
実際、各ボタンの間には、指定していなくても若干隙間が空いているはずです。
背景色は、構造を分かりやすくするために一時的に付けています。
ページを再読み込みして確認してみましょう。

次の「#button_box」は、id="button_box" への設定です。
  • 「padding: 10px;」: パディングを10pxにする。
パディングとは、要素の内側に作る余白のことです。
マージンは要素の「周り」(つまり外側)に余白を作りますが、パディングは内側に作ります。
実際、#button_box は内側に余白(青色の領域)があることが確認できるはずです。
最後の「#num1, #num2」は、id="num1" と id="num2" の両方への設定です。
このように、複数の要素をカンマで区切ることで、複数の要素に同じスタイルを設定できます。

Step 3
動きを指定する

次は、ページの動きを指定します。
ページの動きは JavaScript で指定します。
program.js を適当なエディタ(意味がわからなければメモ帳)で開きましょう。
program.js の中に、まず以下のように書きます。
HTMLは上から順に解釈されていきます。
program.js は body よりも上にあるので、 プログラムをそのまま書いたのでは body の中にある要素にアクセスできません。
$(function() { ... }); の中に書いたプログラムは、 HTMLを全て読み込んだ後に実行されるので、基本的にこの中にプログラムを書きます。
$(function () {

  // ここにプログラムを書いていく

});
また、以下のように書いても構いません。
この場合、main という関数は先に定義されますが、実行はページ読込後なので、正しく動きます。
個人的にはこちらの方がインデントが少なくて済むので良いように思いますが、どちらでも構いません。
ここでは、上の書きかたで書いていきます。
function main() {

  // ここにプログラムを書いていく

}

$(function () {
  main();
});
動きは、
  1. 4つのボタンのどれかをクリックすると、2つの入力欄からそれぞれ文字列を取ってくる。
  2. その後、上で取ってきた2つの文字列をそれぞれ数値に変換する。
  3. その後、押したボタンに応じた四則演算をする。
  4. その後、その結果を表示欄に表示する。
のステップとなります。

JavaScriptの基礎とボタンアクション

jQueryでの要素の指定はCSSと同じようにできます。

$("#foo") なら、 id="foo" のもの、
$(".bar") なら、 class="bar" のもの

を取ってくることができます。

jQueryではなく素のJavaScriptでは、
document.getElementById("foo")
としなければ要素を取ってこれませんので、 jQueryを使うととても楽にプログラムが書けることがわかると思います。
ところで、上の素のJavaScriptで取得した要素と、jQuery流に取得した要素は微妙に違います。
これは、jQueryは扱いやすいように「jQueryのオブジェクト」として値を保持しているからで、
$(document.getElementById("foo"))
とすれば、$("#foo") と同じ jQueryのオブジェクトになります(が面倒なので普通は $("#foo") を使います)。

一方、要素に対するクリック時の処理は、
jQueryで取ってきた要素.click(function() { 処理 })
のように書くことができます。
ここでは、class="calbutton" のボタンについての処理を書きたいので、以下のようにしましょう。
$(function () {

  $('.calbutton').click(function() {
    // class="calbutton" が押されたときにする処理
  });

});
また、入力系の要素からユーザの入力した値を取ってくるのは
jQueryで取ってきた要素.val()
でできます。
これで取ってきた値は文字列になっているので、以下のように数値に直しましょう。
+文字列
これは、JavaScriptが型の変換を自動的に行うことを利用した文字列の数値変換です。
たとえば、
"12" + 3
とすれば、左から処理されるので、「"12"という 文字列に何かを加える」という処理だと解釈されます。
文字列同士は足し算の記号で「連結」となるので、 連結するために数値3は文字列に変換され、結果は "123"という文字列になります。
一方で、文字列は引き算ができません。よって
"12" - 3
は「文字列では引き算ができないので、12 - 3をしよう」となり、 "12" が数値に変換され、結果は9になります。
+文字列
だと、左に値がありませんが、この場合は数値に変換する決まりになっているため 数値に変換され、特に足すものもないのでその数値が返ります。

JavaScriptでは変数の定義は
var a;
のように定義します。型がなんであっても、var と書けば良いです。
分岐処理や繰り返し処理はC言語と同様に書くことができます。
よって、以下のようなプログラムになります。
$(function () {

  $('.calbutton').click(function() {

    var a = +($("#num1").val());
    var b = +($("#num2").val());
    var c;

    switch($(this).attr("id")) {
    case "plus":
      c = a + b;
      break;
    case "minus":
      c = a - b;
      break;
    case "multi":
      c = a * b;
      break;
    case "divs":
      c = a / b;
      break;
    }

    alert(c);
  });

});
ここで、「$(this)」は「今対象となっている要素のjQueryオブジェクト」です。
this が JavaScript の「今対象となっている要素」なので、 $()で囲う必要があります。
今は $(".calbutton") へのクリック処理を書いているので、普通に書くと 全てのボタンで同じ動きになってしまいますが、thisを使うことで個別に違う動きをさせることができます。
jQueryの要素.attr("foo")
で、その要素の HTML での 「foo="なんとか"」 の値(「なんとか」)を取ってくることができます。
つまり、
<div id="hoge" class="foobar"></div>
というHTMLがあるとき、
$("#hoge").attr("class")
とすれば、"foobar" が得られます。
よって、上のコードでは、押された要素が持っているidの値に応じて、 switch文で処理を分けています。

最後の
alert(c);
は、「cの値をポップアップする」という命令です。
変数の値をチェックしたいときにこのようにすると便利です。

これで、四則演算の各ボタンを押したとき、その計算結果がポップアップされます。

ポップアップされた結果が特に問題なければ、 計算結果を表示しましょう。
表示部分の id は "hyouji" なので、
$("#hyouji").html(c);
とすることで、 $("#hyouji")の要素の中身を 変数cの値で置き換えます。
つまり、cに3が入っているとすれば、
<div id="hyouji"></div>
だった要素が、
<div id="hyouji">3</div>
となります。

上記の事をまとめると、
$(function () {

  $('.calbutton').click(function() {

    var a = +($("#num1").val());
    var b = +($("#num2").val());
    var c;

    switch($(this).attr("id")) {
    case "plus":
      c = a + b;
      break;
    case "minus":
      c = a - b;
      break;
    case "multi":
      c = a * b;
      break;
    case "divs":
      c = a / b;
      break;
    }

    $("#hyouji").html(c);
  });

});
となります。

Step 4
値を保存する

Step 3までで計算機のWebアプリケーションとしては完成ですが、 せっかくなので値を保存するようにしてみましょう。

Step 3までのプログラムだと、再読込した際に計算結果が消え、 前回の計算結果を見ることはできません。
input要素の値は残っていますが、これはブラウザのキャッシュによるものであり、 いつまでも残っているという保証はありません。
実際、多くのブラウザでは Ctrl キーを押しながら F5 キーで再読込すれば、 キャッシュを無視して読込みするため、これら値の表示は消えます。

そこでここでは、LocalStorage にデータを保存するようにしてみます。

LocalStorage

LocalStorage は「ローカルストレージ」と読みます。
これは値をブラウザの中に保存することができるもので、 簡単なアプリケーションだととても便利に使えます。

LocalStorage への保存は以下のようにできます。
localStorage.setItem("キー", 保存したいもの);
ここでキーは任意の文字列です。変数名のようなものだと思っておけば良いでしょう。
ちなみに、保存できるデータは「文字列」のみとなっていますが、 配列などもJSON形式にすることで保存できるようになります。
JSON形式は文字列でデータを表す形式で、
JSON.stringify(配列や変数);
のようにすれば、配列や変数の値をJSON形式にでき、
JSON.parse(JSON形式のもの);
とすれば、JSON形式のデータを元のデータに戻せます。

また、LocalStorage からのデータの読みだしは以下のようにできます。
localStorage.getItem("キー");

関数の定義

まずは、保存と読みだしの関数を用意しましょう。
関数の定義は
function 関数名(引数1, 引数2, ...) {
  処理
}
のようにします。
C言語と違って、引数の型を指定する必要はありません。
よって、保存と読みだしの関数はそれぞれ以下のようになります。
  function save() {
    localStorage.setItem("Sample", JSON.stringify([a,b,c]));
  }

  function load() {
    var x = JSON.parse(localStorage.getItem("Sample"));
    a = x[0];
    b = x[1];
    c = x[2];
    $("#num1").val(a);
    $("#num2").val(b);
    $("#hyouji").html(c);
  }
ついでに、今はユーザが入力した数値を入れている a と b、計算結果の c は クリック処理の部分でしか参照できないので、 プログラムの上の方で定義するように変更しておきましょう。
$(function () {
  var a, b, c;

  function save() {
    localStorage.setItem("Sample", JSON.stringify([a,b,c]));
  }

  function load() {
    var x = JSON.parse(localStorage.getItem("Sample"));
    a = x[0];
    b = x[1];
    c = x[2];
  }

  $('.calbutton').click(function() {
    a = +($("#num1").val());
    b = +($("#num2").val());
    switch($(this).attr("id")) {
    case "plus":
      c = a + b;
      break;
    case "minus":
      c = a - b;
      break;
    case "multi":
      c = a * b;
      break;
    case "divs":
      c = a / b;
      break;
    }
    $("#hyouji").html(c);
  });

});
変数 a, b, c はsaveやloadの関数の中で参照できるので、引数は不要です。
これだけだと保存と読みだしの動作を定義しただけなので、 実際に保存や読みだしをする箇所でこれらの関数を呼びましょう。

まず、保存は計算結果を表示するタイミングで良いはずです。
読みだしはページを表示したときなので、プログラムの下の方でloadを呼べば良い (関数定義もクリック処理の定義も、定義であってそれ単体では何もしません)ですが、 初めてアクセスした人は保存したデータがないので、それを考慮する必要があります。
特に JSON.parse() はパースするデータがないとエラーになってしまいます。
localStorage.getItem("foo")
の結果は、"foo" のキーで保存したデータが無ければ null が返ります。
JavaScriptでは、false、0、null などは「偽」として扱われ、偽以外のものは「真」 になります。よって、
if (localStorage.getItem("Sample")) {
  処理
}
のようにすれば、データが LocalStorage にあるときだけ処理ができます。
$(function () {
  var a, b, c;

  function save() {
    localStorage.setItem("Sample", JSON.stringify([a,b,c]));
  }

  function load() {
    var x = JSON.parse(localStorage.getItem("Sample"));
    a = x[0];
    b = x[1];
    c = x[2];
    $("#num1").val(a);
    $("#num2").val(b);
    $("#hyouji").html(c);
  }

  $('.calbutton').click(function() {
    a = +($("#num1").val());
    b = +($("#num2").val());
    switch($(this).attr("id")) {
    case "plus":
      c = a + b;
      break;
    case "minus":
      c = a - b;
      break;
    case "multi":
      c = a * b;
      break;
    case "divs":
      c = a / b;
      break;
    }
    $("#hyouji").html(c);
    save();
  });

  if(localStorage.getItem("Sample")) {
    load();
  }
});
Webアプリケーションを作ろう ver.1.0