「Pythonをもっと使えるようになりたい」という方は多いことだろう。とは言え、参考書をいくら読んだとしても、それほどPythonの腕は上がらない。プログラミングというのは、実際に自分で何かを作ってみて初めて理解が進むものなのだ。そういう意味では、今回のお題の「TODOアプリ」は、最適の題材だ。自作のTODOアプリを作ってレベルアップを目指そう。

  • 今回作成するTODOアプリ

    今回作成するTODOアプリ

TODOアプリとは何か?

今では、非常にTODOアプリが身近になっている。スマートフォンなどに、TODOアプリやメモアプリをインストールしておけば、いつでもどこでもリストを持ち運んで見ることができるからだ。例えば、買い物に出たときに、買うべきものをTODOアプリに入力しておく。そうすれば、実際にお店についた時に「あれ?何を買えば良かったのだろう」と悩むことはなくなる。

もちろん、TODOアプリは、需要が高いので、自分で作らなくても、アプリストアを見れば、たくさんのTODOアプリを見つけることができる。とは言え、TODOアプリを自作するなら、Pythonの腕を磨くことができるので、脱初心者を目指して、自作のTODOアプリ作成に挑戦してみよう。自作アプリであれば、独自機能を追加することもできるので、自分の業務にぴったりになるよう育てていくこともできる。

基本的な開発方針を立てよう

とは言え、ゼロからすべてを作るのは、なかなか大変だ。そこで、本稿では一番簡単な基本的な機能の作り方を紹介する。最初にTODOアプリをどのような形態で作成するのか考えてみよう。Pythonを使えば、デスクトップアプリからWebアプリ、前回紹介したiOS上で動くPythonistaなど、様々なアプリを作ることができる。そのため、どのような形態で動くのが良いのか考えよう。それぞれのメリット・デメリットは以下の通り。

・デスクトップアプリ
・・メリット:Win/Mac/Linuxで動く、操作性が良い
・・デメリット:スマートフォンでは動かない

・Webアプリ
・・メリット:Webブラウザがあれば使える(PC/スマートフォンで動く)
・・デメリット:Webサーバーが必要

・iOSアプリ - Pythonista
・・メリット:iPhone/iPadで動く、持ち運べる
・・デメリット:PCでは動かない機能もある

今回は、パソコン・スマートフォンでも動かせるように、Webアプリにしてみようと思う。以前、43回目で紹介したように、月100円のレンタルサーバーを借りて、そこで動かすことを目標にしてみよう。

TODOリストの機能を列挙しよう

まずは、必要な機能を列挙してみよう。いろいろなアイデが出ると思うので、とにかくやる気がでるように、気軽に面白いアイデアをどんどん出していこう。

  • TODOを登録、削除するという基本機能
  • TODOをメールで通知する機能
  • 定期的に進捗を確認してくれる機能
  • TODOを登録する褒めてくれる機能
  • 特定の日付や曜日に繰り返しTODOを自動登録する機能

アイデアを列挙したら、何から機能を実装したら良いのか、優先度を付けていこう。すべての機能を最初から全部実装しようとすると、確実に途中で破綻する。そのため、最初の段階は、必要最低限の機能だけ、それができたら、少し発展的な機能というように、段階的に開発していくと良い。

それで、今回は、上記のアイデアから基本的な以下の二つだけを選び出して実装することにした。

  • TODOを登録、削除するという基本機能
  • TODOを登録する褒めてくれる機能

二つ目の「褒める」と言うのは、メッセージを書き込んだ時に、「素晴らしい!」とメッセージを表示するというだけなので実装は簡単だ。

プログラムを作ろう

それでは、基本的なTODOの機能を作ろう。今回のプログラムは、少し長いのでプログラム全体を「こちらにある57回目のプログラム」からダウンロードしよう。解凍すると、以下のような階層になっている。

.
├── cgi-bin
│   └── todo.py
├── data.txt
└── style.css

プログラムを実行するには、コマンドラインから以下のコマンドを実行する。以下のコマンドは、カレントディレクトリで簡易Webサーバーを起動するものだ。

python -m http.server --cgi

それから、Webブラウザで「http://localhost:8000/cgi-bin/todo.py」にアクセスしよう。すると、TODOアプリが表示される。

  • TODOアプリが表示されたところ

    TODOアプリが表示されたところ

画面一番下にある、TODOのテキストボックスに、メモを入力して「追加」ボタンを押すと、TODO項目が追加される。そして、各項目の先頭にある「x」のボタンを押すと、項目が削除される。

プログラムのポイントを確認しよう

cgi-bin/todo.pyが今回のTODOアプリのメインプログラムだ。このファイルをテキストエディタなどで開いてプログラムを確認してみよう。以下は、プログラムの基本的な動作を行う処理を抜き出したものだ。

〜省略〜
# フィールドの値を取得する --- (*1)
form = cgi.FieldStorage()

# パラメータを確認して処理を分岐 --- (*2)
def check_param():
    m = get_form('m', 'show')
    if m == "show":
        mode_show() # --- 項目一覧を表示
    elif m == "add":
        mode_add() # --- 新規項目を追加
    elif m == "rm":
        mode_remove() # --- 項目を削除
    else:
        out_html("パラメータの間違い")
〜省略〜
# フォームの値を取得して返す --- (*3)
def get_form(name, defvalue):
    if name in form:
        return form[name].value
    return defvalue

# メイン --- (*4)
if __name__ == '__main__':
    check_param()

最初に、(*1)の部分でWebサーバーに送信されたデータを解析して、辞書形式で取得できるようにする。そして、(*4)のメイン処理の部分で、(*2)のcheck_param関数を呼び出す。ここでは、URLパラメータ「m」の値に基づいて、各種関数を呼び出すようにした。最初に、このファイルにアクセスした時には、何もパラメータが指定されていないので、その場合には、項目一覧を表示する、mode_showを呼び出す。(*3)の部分では、URLパラメータに値があるかどうかを確認して、パラメータから値を取り出す。もし、パラメータが見当たらなければ、デフォルト値を返すようにした。

次に、TODO項目一覧表示と、新規追加のプログラムを確認してみよう。

# TODOの一覧を表示する --- (*5)
def mode_show():
    items = load_items()
    t = "<h1>褒めるTODO</h1><div id='items'>"
    for no, it in enumerate(items):
        k = "todo.py?m=rm&no="+str(no)
        a = "<a href='" + k + "'>❎️</a> "
        t += "<p>" + a + it + "</p>"
    t += "<form><p class='frm'>TODO: "
    t += input_tag('text', 'todo', '')
    t += input_tag('hidden', 'm', 'add')
    t += input_tag('submit', '', '追加')
    t += "</p></form></div>"
    out_html(t)

# 新規TODOを追加する --- (*6)
def mode_add():
    todo = get_form('todo', '')
    if todo == '':
        out_html('追加するテキストがありません')
        return
    items = load_items()
    items.append(todo)
    save_items(items)
    s = "<div id='items'><p>書き込ました。<br/>"
    s += "素晴らしい!いつも頑張ってますね!</p>"
    s += "<a href='todo.py'>戻る</a></div>"
    out_html(s)

プログラムの(*5)の部分では、TODOの一覧を表示する関数mode_showを定義している。データファイルより、項目一覧を読み出した後、for構文で順次項目をHTMLとして出力している。その際、削除ボタンを押した時に、削除を実行するURLを作成して、a要素で囲うようにした。

そして、(*6)では新規TODOを追加するmode_addを定義している。ファイルから項目一覧を取り出して、新規項目を追加した後、項目を保存する。その際、褒め言葉を表示するようにした。

まとめ

以上、今回は、TODOアプリを題材にして、簡単なWebアプリの作り方を紹介した。レンタルサーバーなどで、CGIとしてプログラムを動かす際には、プログラムの一行目をPythonのインストールパスに書き換えれば良い。

今回、TODOを追加したときに、褒め言葉を表示するというのが、このアプリのウリとなるところだ。実際、あまり意味はないのだが、メッセージを一つ変えるだけでも、オリジナル感が出て楽しいものだ。アイデアを出して、どんどん改造していくことで、Pythonプログラミングの腕も上がっていく。レベルアップを目背している皆さん、挑戦してみよう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。