以前、格安のChromebookでPythonの開発環境を構築する方法を紹介した(第67回)。ChromebookではLinuxアプリのほか、Androidアプリも動かすことができる。今回は、Termuxというアプリを使って、Python開発環境を構築し、LAN内で使える掲示板を作って活用する方法を紹介しよう。

  • ChromebookとPythonで掲示板を作っているところ

    ChromebookとPythonで掲示板を作っているところ

開発やいろいろな用途に格安Chromebookを使ってみた

2020年、日本のChromebookのシェアは急増したという。TVのCMでも宣伝をよく見かけ、筆者自身も値段の安さに釣られて買ってしまった。この原稿もChromebookで書いている。しばらく、いろいろな作業にChromebookを使ってみて思うのだが、確かにChromebookは安くてもそれなりに動く。ネットを見たり、動画を見たり、原稿を書いたり、PythonやJavaScriptなどプログラムの開発には十分使える。

もちろん、CPUパワーをバンバン使う機械学習などAI分野で大量のデータを扱うプログラムを作ったり、規模の大きなアプリをコンパイルさせるのには向いていない。筆者の2019年モデルのMacbook Airでは一瞬で終わるGo言語のプログラムのコンパイルも4万円程度のChromebookではもたもたする。やはりCPUが直に関係する処理では値段相応のマシンという感じはある。それでも、LinuxやAndroidのアプリが動くので、「いつも使っているあのアプリがないので困る」ということがなくて良い。

Termuxを使ってPythonでWebアプリを開発しよう

さて、今回はChromebookにAndroidアプリのTermuxを入れてPythonを動かしてみよう。連載の59回目でも、AndroidのTemuxについて紹介したがChromebookでもTermuxは快適に動かすことができる。

しかも、TermuxはChromebookのLinuxよりも起動が早いので筆者は、ChromebookのLinux(crostini)よりもTermuxの方で作業することの方が多い。もちろん、Termuxでは動かないアプリも多いが、Pythonで簡単なWebアプリを作るくらいTermuxでも十分だ。

また、Chromebookで掲示板アプリを動かすなど、簡易サーバーの用途で使おうと思ったとき、Termuxを使うと比較的手軽にLAN内に公開できるのもメリットだ。ChromebookのLinuxは現状β版ということもあり、セキュリティ設定を変更しなくてはならない。

それでは、TermuxでPython開発環境を構築しよう。すでに、連載59回目で詳しく説明しており、Chromebookでもほぼ同じ手順だ。そこで、ここでは簡単にポイントだけ紹介しよう。


(1) ChromebookのPlayストアでTermuxをインストール
(2)Pythonをインストールするため以下のコマンドを実行する

$ pkg update
$ pkg install -y python

上記のコマンドを実行した場合、去年の1月の時点ではPython3.8.1がインストールされたが、今年(2021年)1月の時点でも、最新版の3.9.1がインストールされた。

  • ChromebookのTermuxにPythonをインストールしたところ

    ChromebookのTermuxにPythonをインストールしたところ

Termuxで日本語入力できない問題

しかし、ChromebookでTermuxを使うと残念なことが一点ある。現状Termux上で日本語が入力できないのだ。ほかのAndroidアプリでは問題なく入力できるので、Termux側の問題と思われる。

それでも回避策がある。TermuxからChromebookのダウンロードフォルダなどにアクセスことができる。そこで、プログラムを開発する時は、ChromeアプリのTextなど、テキストエディタを利用してプログラムを開発する。そして、プログラムを実行するときのみ、Termuxからダウンロードフォルダにアクセスしてプログラムを実行する。

Textはシンプルなテキストエディタが、プログラミング言語ごとのキーワードの色分け機能や、タブ文字をスペースに変換する機能など、エディタとして基本的な機能を満たしている。

  • TextでPythonのプログラムを開発しているところ

    TextでPythonのプログラムを開発しているところ

なお、TermuxからChromebookのフォルダにアクセスするには、以下のコマンドを実行する必要がある。

$ termux-setup-storage

これにより、ホームディレクトリにstorageというディレクトリができる。そして、その中にあるdownloadsがChromebookのダウンロードフォルダに相当する。

なお、Termuxの画面で日本語入力が有効にならないというだけで、表示したり貼り付けることはできる。そのため、テキストエディタなどで日本語をクリップボードにコピーしておいて、Termux上で[ctrl]+[alt]+[v]キーを押すと日本語でも貼り付けられる。

ほかの方法としては、TermuxにOpenSSHをインストールし、日本語の入力できるターミナルアプリからTermuxに接続するという方法もある。しかし、筆者が試してみたところ有名なAndroidのターミナルアプリは、軒並み日本語入力ができなかった。また、Chromebook標準のターミナルやSecure Shellを使えば日本語入力が一応可能だが、日本語入力中にカーソル位置がずれるなど問題がある。今後の改善を期待しよう。

掲示板を作ろう

それでは掲示板を作ってみよう。ここでは、Pythonで最も使われているWebフレームワークであるFlaskを使う。以下のコマンドを実行して、Flaskパッケージをインストールしよう。

pip install flask

ちなみに、TermuxでPythonをインストールするとpipコマンドも自動的にインストールされる。そのため別途pipをインストールする必要はない。

ところで、PHPを使うと掲示板など100行以内のプログラムで作ることができるので、Pythonでも100行以内の掲示板を作ることを目標にしてみた。そして、完成したプログラムが以下の通り。基本機能しかないが、コメントや空行込みで60行だ。

以下のプログラムをテキストエディタに貼り付けて、Chromebookのダウンロードフォルダに「bbs.py」という名前で保存しよう。

from flask import *
import json, os, datetime
DATA_FILE = "bbs.json"

# Flaskオブジェクトの生成 --- (*1)
app = Flask(__name__)

# ルート( / )へアクセスがあった時の処理 --- (*2)
@app.route("/")
def root():
    # 掲示板データを読み出してHTMLを生成 --- (*3)
    body = ""
    for i in load_data():
        body += f'<li>{i[0]}: {i[1]} ({i[2]})</li>'
    return html_frame("<ul>"+body+"</ul>")

# 投稿があった時の処理 --- (*4)
@app.route("/write", methods=["post"])
def write():
    # パラメータの取得 --- (*5)
    name = request.form.get("name")
    comment = request.form.get("comment")
    if (name is None) or (comment is None) or (comment == ""):
        return redirect("/")
    if name == "": name = "名無し"
    # データファイルに書き込みを追記 --- (*6)
    data = load_data()
    now_s = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
    data.insert(0, [tohtml(name), tohtml(comment), now_s])
    save_data(data)
    return redirect('/')

# 保存と読み込み
def load_data():
    data = []
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "rt", encoding="utf-8") as fp:
            data = json.load(fp)
    return data
def save_data(data):
    with open(DATA_FILE, "wt", encoding="utf-8") as fp:
        json.dump(data, fp)

# HTMLの大枠を表示する --- (*7)
def html_frame(body):
    return f"""
    <!DOCTYPE html><html><meta charset="utf-8"><body>
    <h1>掲示板</h1>
    <div><form action="/write" method="post">
    名前:<input name="name" size="8">
    発言:<input name="comment" size="30">
    <input type="submit" value="投稿"></form></div>
    <div>{body}</div></body></html>"""
def tohtml(s):
    return s.replace('&', '&amp;').replace('<', '&lt;') \
            .replace('>', '&gt;')

# サーバーを起動 --- (*8)
if __name__ == "__main__":
    app.run(debug=True, port=8888, host='0.0.0.0')

プログラムを見てみよう。(*1)ではFlaskのオブジェクトを生成し、これを利用してFlaskの設定を行う。(*2)ではルートへアクセスがあった時の処理を記述する。(*3)では掲示板のデータを読み出して、HTMLとして出力する。

(*4)では「/write」というURLにアクセスがあった時、つまりHTMLのフォームから投稿があった時の処理を記述する。(*5)ではパラメータの取得と検証を行う。(*6)でJSONデータとしてファイルへ書き込みする。(*7)のhtml_frame関数はHTMLの枠組みを表示するものだ。(*8)では、ポート8888でサーバーを起動する。

プログラムを実行しよう

上記のプログラムを保存したら、Termuxを起動しよう。そして、TermuxのIPアドレスを調べたら、以下のコマンドを実行しよう。

# ダウンロードフォルダに移動
cd ~/storage/downloads

# IPアドレスを調べる
ifconfig | grep inet

# Pythonのプログラムを実行
python bbs.py

すると、bbs.pyがPythonで実行される。画面は以下のようになるだろう。

  • Pythonのプログラムを実行したところ

    Pythonのプログラムを実行したところ

そして、Webブラウザで表示されたIPアドレスにアクセスしよう。今回、掲示板のプログラムはポート8888で起動した。もし、IPアドレスが「100.115.92.2」であったなら、ブラウザのアドレスバーに次のように入力する。

http://100.115.92.2:8888/

すると、掲示板のアプリが表示される。名前と発言するメッセージを入力して「投稿」ボタンを押すと投稿が書き込まれる。

  • 掲示板が表示されたところ

    掲示板が表示されたところ

なお、Flaskでは一度プログラムを実行してしまえば、その後、プログラムに修正を加えたときに自動的にプログラムをリロードしてくれる。ブラウザは自分でリロードする必要があるが、いちいちTermuxに画面を切り替えてpythonコマンドを打つ手間が省けるようになっている。そのため、上記の画面のように、画面の左半分をブラウザ(開発中のアプリ)、右半分をテキストエディタにするなら、画面を切り替えることなく開発とテストを行うことができる。

それから、LAN内にある他のPCからも作成したアプリにアクセスすることが可能だ。ただし、先ほどTermuxで調べたIPアドレスはローカルなもので外部からアクセスはできない。ChromebookのWi-Fi設定の画面で端末IPアドレスを調べよう。もし、IPアドレスが「192.168.11.17」であるなら、LAN内の他のPCのWebブラウザで「http://192.168.11.17:8888」というURLへアクセスしよう。

電源設定でChromebookをスリープしないように設定すれば、常時アクセスしてもらうこともできる。もしVPNを構築しているなら出先から家のChromebookにアクセスすることも可能だろう。

まとめ

以上、今回はChromebookにAndroidアプリのTermuxを入れて、Pythonで掲示板を開発してみた。ここで見たようにChromebookを開発マシンとして使う場合には多少の癖がある。しかし、やり方にさえ慣れてしまえば、Webアプリの開発程度ならWindowで開発するのとそれほど変わりなく使うことができるだろう。日本語入力の問題などまだまだ課題はあるが、日本で普及が進むChromebookが開発マシンとして定着する日が来るかもしれない。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。