以前、格安のChromebookでPythonの開発環境を構築する方法を紹介した(第67回)。ChromebookではLinuxアプリのほか、Androidアプリも動かすことができる。今回は、Termuxというアプリを使って、Python開発環境を構築し、LAN内で使える掲示板を作って活用する方法を紹介しよう。
開発やいろいろな用途に格安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がインストールされた。
Termuxで日本語入力できない問題
しかし、ChromebookでTermuxを使うと残念なことが一点ある。現状Termux上で日本語が入力できないのだ。ほかのAndroidアプリでは問題なく入力できるので、Termux側の問題と思われる。
それでも回避策がある。TermuxからChromebookのダウンロードフォルダなどにアクセスことができる。そこで、プログラムを開発する時は、ChromeアプリのTextなど、テキストエディタを利用してプログラムを開発する。そして、プログラムを実行するときのみ、Termuxからダウンロードフォルダにアクセスしてプログラムを実行する。
Textはシンプルなテキストエディタが、プログラミング言語ごとのキーワードの色分け機能や、タブ文字をスペースに変換する機能など、エディタとして基本的な機能を満たしている。
なお、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('&', '&').replace('<', '<') \
.replace('>', '>')
# サーバーを起動 --- (*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で実行される。画面は以下のようになるだろう。
そして、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(マイナビ出版)」など。