トグルスイッチ

これもユーザインタフェースの話である。

トグルスイッチまたはトグルボタンというものがある。二つの状態をとるスイッチでスイッチを押すと現在の状態から別の状態に切り替わる。

我が家でも電灯を付けたり消したりするトグルスイッチが使われている。電灯が消えているときにそのスイッチを押すと電灯が付き、電灯が付いているときにそのスイッチを押すと電灯が消える。つまりこのスイッチは二つの状態を取ることができるスイッチである。しかしスイッチの外見からはそのスイッチが今どちらの状態にあるかを知る手がかりは全くない。このスイッチは小スペースに配置できる利点があるが、これがこのスイッチの欠点である。

誰のためのデザイン?認知科学者のデザイン原論」のなかで著者のD.A. ノーマンはこのトグルスイッチをよくないデザインの例として取り上げていた。

例えば、このスイッチをエレベータのドアの開閉に使ったとしよう。

ドアが開いていたらそのボタンを押すとドアが閉まり、ドアが閉まっていたらこのボタンを押すとドアが開く。しかしドアの状態が見えないとこのボタンは有効に使えない。

エレベータのユニヴァーサル・デザインではドアを閉めるボタンとドアを開けるボタンは別々になっている。

ラジオボタンとチェックボックス

グラフィックスユーザインタフェース(GUI)の部品(ウィジェット)にラジオボタンとチェックボックスというものがある。どちらも提示された一群の選択項目からユーザが項目を選択する機能を持っている。違いはチェックボックスでは複数の項目が選択できることに対してラジオボタンは一つの項目のみが排他的に選択できる点にある。

このラジオボタンの名称の由来は旧いラジオの前面に配置されていた複数のラジオ局の選択ボタンである。一つのラジオ局を選択する(押す)と他の局のボタンが浮き上がった状態になり常に一つが排他的に選択されるようになっていた。このラジオボタンがGUIのラジオボタンになった。

旧い時代の機器が持っていたユーザインタフェースがそのままの機能でGUIに取り込まれたことが面白い。

ウイニーの大音響を実感する

今日のお昼休み(馬休の時間でもあった)に洗い場で一頭だけ残されしまった馬が盛んに嘶いていた。この馬の音声はウイニーと呼ばれている。以前にも馬の四種の音声を話題にしたことがあるが、ウイニーが最も大きな音で自分の存在を他の馬たちに知らせるときなどに使う。今日は「早く馬房に帰りたい」と指導員に向かって鳴いていたのである。

ふと他の馬たちは誰が鳴いているのか分るのであろうかという疑問がわいた。それにしても大音響であったのが面白かった。

庚申(こうしん)道:狸と猿の街道

庚申(こうしん)道というちょっと変わった名前の街道がある。

狸の焼き物で有名は信楽(しがらき)焼の信楽を含むように南北に走っている街道である。猿は庚申の使いで、何も悪いことは報告しないというポーズの三猿(見ざる、聞かざる、言わざる)であるが、この街道沿いにある寺(庚申山広徳寺)には大きな石柱のてっぺんにこの三猿が彫られている。この猿が街道の名前の起源。

藤沢周平の世界:データベースの話

藤沢周平は好きな作家の一人である。以前のこのブログで話題にしたことがある。

文庫本のかたちで全作品を持っている。どの作品がどのタイトルの文庫本に収録されているかを検索できるデータベースを作ってみた。

一例を示す:

検索結果の表示

wxPythonにはデータベースの結果表示に便利なgridクラスがあり表になったデータを適切に表示できる。

ソニーRX10M4の高速動画

このカメラは動画も撮れる。しかも高速に動画を撮れる。通常の動画はフレーム・レートが60fps(つまり一秒間の60コマ)であるが、このカメラはその16倍、つまり960fpsの高速で動画が撮影できる。このようなフレーム・レートであると1000分の1秒のシャッター速度であるのでレンズはf2.4と比較的明るいがそれでも撮影には明るい環境が必要になる。

試みた撮影は以下に示すが撮影は晴天の日の屋内である:

表示動画はオリジナルを20%に圧縮したものである。もちろん再生は通常のヴィデオのように60fpsである。

 

Pythonのマルチスレッドの覚書

マルチスレッドの一般論はここにある。プログラムで重たい処理の部分を干渉なしにバッチ処理的にやる部分を一つのスレッドと他の部分と独立に実行させる。こんなイメージがスレッドである。

Python上でスレッドを使った一例を示す:


import threading

a_final = 0


def count():
    global a_final
    for i in range(10000000):
        a = i+1
    a_final = a   
    print('end_count')
    return
def main():
    t = threading.Thread(target=count)
    t.daemon = True
    t.start()
    t.join()
    print(a_final)
    print('end_main')

if __name__ == '__main__':
    main()

関数mainの中で関数countをスレッドとして走らせる。メソッドJoin()はスレッドとそのスレッドを走らせた関数(今の場合はmain)が同時に終了するように同期をとるメソッドである。

これのGUI版は以下のようになる:


import tkinter as tk
from tkinter import ttk
import threading


a_final = 0

root = tk.Tk()
label = tk.Label(text='vinoth')
label.pack()

def fix():
    t = threading.Thread(target=count)
    t.daemon = True
    t.start()
    t.join()
    label['text'] = a_final
    return
    

def count():
    global a_final

    for i in range(100000000):
        a = i+1
    a_final = a


button = tk.Button(text='sub', command=fix)
button.pack()
dropdown = ttk.Combobox()
dropdown.pack()

root.mainloop()

こんな感じになる。

マルハナバチ、葉をかみ開花促す

今朝の新聞に表題のような記事があった。

我が家の畑のブルーベリーにもハチが来ていた。

新聞記事はこの花に集まるハチの話である。スイス工科大学のフォテイニ・バスカリデゥ博士が偶然に見つけたマルハナバチの行動である。マルハナバチが植物の葉を噛んでることを見つけ、その植物の開花が他より早くなるということだ。これは実験室にいたハチであったが野生のマルハナバチにも見られる。

ヒトの手で植物の葉を傷つけても何も変化が見られないことから、博士はマルハナバチが葉を噛むときに何らかの化学物質を放出しているのかもしれないとコメントしている。

スレッド・コンカーレント・Pythonコンパイラ

Pythonで書いたプログラムを高速に実行する仕掛けを調べていたら面白い記事に出会った。そこで公開されているプログラムを紹介しつつ、僕のところで実行した結果を示す。

基本になるプログラム(killing_time.py)は以下のようなものである:


import time


# 単に時間がかかるだけの処理
def killing_time(number):
    return_list = []
    for i in range(1, number + 1):
        if number % i == 1:
            if i <= 9999:
                return_list.append(i)
    return return_list


start = time.time()
num_list = [25000000, 20000000, 20076000, 14500000]
for n in num_list:
    result_list = list(killing_time(n))
stop = time.time()
print('%.3f seconds' % (stop - start))

このプログラムを実行してみた。使った環境はwindows 7でPyhtonのヴァージョンは3.7.6である。
実行結果は
5.763 seconds
このプログラムをスレッド化したもの(killing_time_thread.py)がある。プログラムはここ
実行結果は
5.779 seconds
となり、Pythonスレッドは速度向上には繋がらない。
またこのプログラムを並列処理させるようにしてみる(killing_time_concurrent.py)。プログラムはここ(CPUの最大数は4)。
実行結果は
3.703 seconds
となり、実行速度は若干改良される。
ここまでがオリジナルの記事を追試したもので記事の結果をほぼ再現した。

次にこの三つのプログラムをPythonコンパイラ(pypy)で実行させてみた結果を述べる。pypyのヴァージョンは
Python 3.6.9 (2ad108f17bdb, Apr 07 2020, 03:05:35)
[PyPy 7.3.1 with MSC v.1912 32 bit]
実行結果は


killing_time.py -------------> 0.713 seconds
killing_time_thread.py) -----> 0.462 seconds
killing_time_concurrent.py --> 1.049 seconds

となった。なにも手を入れないプログラムでもコンパイラで実行するとかなりの実行速度向上ができることが分る。

pypyはnumpyモジュールなどの拡張モジュールとの相性が悪い。しかしネイティヴPythonのみを使ったプログラムは高速に実行できる。