Google Colaboratoryを知る

HAWAII

 今日も見に来てくださって、ありがとうございます。

 Google先生、これまでもいろいろなサービスを提供してくれていますが、この機能、昨日(ダジャレ)初めて知りました。Google Colaboratoryです。何かというと、Googleのアカウントを持っていれば、Jupyter notebookの機能がWebブラウザだけで使える、というサービスです。GPUも使えるそうです。そして、無料です!いや~、Google先生、ありがとうございます。

 知らない人に簡単に説明すると、Jupyter notebookは、対話的にPythonスクリプトを実行することができ、その結果を記録するドキュメントの機能を融合したWeb技術を基盤としたツールです。実行する前の状態をドキュメントにしておいて、説明するときに順番に実行して見せる、という使い方もできるし、説明ドキュメントをメインにして、実行結果を付けて見せる、という使い方もできます。再利用可能という点においても優れており、研究成果や教科書的な媒体としての位置づけを獲得しているそうです。

 ここで使い方の詳細を紹介しようかとも思ったのですけど、サービス上にすでに紹介がありますので、そのリンクを張り付けておきます。

https://colab.research.google.com/notebooks/welcome.ipynb

これで、誰でもJupyter notebookが使えますね。すばらしい。

Pythonでプログラミング キー入力を受け付ける

 今日も読みに来てくださって、ありがとうございます。今回は、Pythonのお話です。

 Pythonでファイルの更新とキー入力待ちを同時にチェックしたいという要望がありました。ファイルの更新チェックは、新しいデータが記録されたのを抜き出したい、ということで、更新確認は、前回タイムスタンプと今回タイムスタンプが異なっていれば、何らかの更新があった、という判断で対応できました。その更新チェックをしながら、キー入力待ちを同時にやりたい、という要望です。

 通常Pythonでキー入力を受け付けるというと、「input()」が思いつきます。こんな感じですね。

>>> a = input('Hit any key:')
Hit any key:aaa
>>> print(a)
aaa

 ただこれだと、「input()」が実行されると先に進まなくなって、待ち状態になってしまいます。そうすると、ファイルのタイムスタンプが更新されたらデータを読み込むという処理をしながらキー入力待ちができないのです。そう、やりたいのは、かつてBASICでINKEY$というコマンドで実装していたように、その関数が実行された時に入力されたキーを知りたい、ということです。調べてみるといろんなやり方があるようでしたが、中でも簡単に実装できたやつをメモしておきます。blessedというモジュールに入っている、Terminalを利用します。「input()」は標準モジュールに含まれていますが、blessedは標準モジュールではないのでpipでインストールする必要があります。

pip install blessed

 このblessedは、cursesモジュールという文字セル表示を扱うためのライブラリをより簡単に使えるようラップしたものだそうです。cursesは、Unix端末で主に利用されているcursesライブラリのインターフェースということでした。もっと簡単に言うと、CUIのインターフェースをうまく扱えるようにするために使えるライブラリですね。
 インストールできたので、さっそく使ってみます。

from blessed import Terminal

t = Terminal()

with t.cbreak():
    while True:
        k = t.inkey(timeout=0.001)
        if not k :
            pass
        elif k.is_sequence:
            if k.name == 'KEY_ESCAPE':
                break
            print(f'"{k.name}"が押されました。終了するには「ESC」キーを押してください。')
        else:
            print(f'"{k}"が押されました。終了するには「ESC」キーを押してください。')

 これでESCキーが押されるまでループを繰り返すようになりました。合間にファイルのタイムスタンプ更新チェックを入れれば要望通りのことができます。
 ただ、このスクリプトの実行に、ぼくの環境ではCPUの使用率が35%ほどかかっていました。もしこれが問題で、使用率を下げたいなら、timeモジュールのsleepを上記のpassのところに記載するとよいでしょう。試しにぼくの環境で入れてみましたが、sleep(0.1)と入れるだけで、CPU使用率が2.5~3%ほどに下がりました。単純にループしてるだけなのに、sleepしないとCPU使用率って意外とかかるのですね。