たゆたふ。

定まる所なく揺れ動き、いろいろやってみたメモ。など

Tingbotを少し試してみた。

前回は、組み立ててサンプルアプリを動かしてみただけだったが、もう少しいじってみた。

hero.hatenablog.jp

イメージファイルの表示

アニメーション GIF はサンプルアプリで試せるので、 それ以外でどんな画像フォーマットが表示できるのか試してみた。

試した結果は次の通り。

フォーマット 表示結果 備考
GIF アニメーションもOK
PNG アルファチャンネル付きもOK
JPG
MBP
WebP エミュレータでは利用できず

それを表示した画面写真は次の通り。 右下方は 33.3 %の赤、青、緑の半透明 PNG を重ねている。

よく使われる画像フォーマットは問題なく表示できる。
WebP は実機では問題ないが、エミュレータではエラーとなり起動もできなかった。

日本語の表示

日本語を表示できるのか?

これは日本人にとっては重要なのだが、英語圏の人々からは軽視されている機能なので試してみた。

結果としては、表示可能。

ただし、次の 3 項目に注意する必要あり。

  1. # coding: utf-8ソースコードエンコーディングを指定すること。
    さもないとコード内に日本語を含むと accii 文字として解釈されてエラーとなる。
  2. Unicode文字列を使うこと。
    リテラルでは u'ほげ' を使い、ネットワーク越しに日本語を取得したときには unicode() 関数や .decode() メソッドで Unicode 文字列に変換する
  3. フォントをアプリに同梱して、コード内で指定すること
    フォントファイルのファイル名にハイフン - を含んでいるとエラーとなるので注意。

アプリを公開する場合、同梱するフォントは再配布可能なライセンスである必要があるので注意。
フォントファイルのフォーマットは TTF でも OTF でも OK。

サンプルコードはこんな感じ。

# -*- coding: utf-8 -*-

import tingbot
from tingbot import *

# setup code here

@every(seconds=1.0/30)
def loop():
    # drawing code here
    screen.fill(color='black')
    message = u'日本語もOK'
    screen.text(message, xy=(0,0), color="white", align='topleft',
                font='fonts/NotoSansCJKjpRegular.otf')
    screen.text(message, xy=(0,45), color="blue", align='topleft',
                font='fonts/ipagp.ttf')
    screen.text(message, xy=(0,80), color="aqua", align='topleft' , 
                font='fonts/ipamp.ttf')
    screen.text(message, xy=(0,120), color="lime", align='topleft' ,
                font='fonts/cinecaption226.ttf')
    screen.text(message, xy=(0,160), color="yellow", align='topleft', 
                font='fonts/TanukiMagic.ttf')
    screen.text(message, xy=(0,200), color="fuchsia", align='topleft', 
                font='fonts/kiloji_p.ttf')

tingbot.run()

これを表示した結果は次の通り。

Webhook

この機能は使い方によっては面白いことができそう。 URL を指定して、ネットワーク上の画像を表示したり、API にアクセスしてデータを取ってくることもできるのだが、 Webhook はネットワーク越しに Tingbot にデータを渡すための機能。

例えば、次のようなコードを Tingbot で実行する。

# -*- coding: utf-8 -*-
import tingbot
from tingbot import *

font = 'NotoSansCJKjpRegular.otf'
font_color = 'white'
wh_name = 'my_webhook'

screen.fill(color='black')
screen.text('Waiting...')

@webhook(wh_name)
def on_webhook(data):
    data = data.decode('utf-8')
    screen.fill(color='black')
    screen.text(data, color=font_color, font=font)
tingbot.run()

その状態で次のコマンドを実行する。

$curl -X POST -d '日本語!!!' "http://webhook.tingbot.com/my_webhook"

するとデータとして送った文字列を表示させることができる。

マニュアルにも書かれているが、IFTTT の Maker チャネルを使えば、様々な Web サービスをトリガーにして Tingbot にデータを渡して表示させることができるだろう。

ただし、使い方には注意が必要で、Tingbot にデータを渡すには次のような URL に文字列を POST してやればよいのだが、 webhook 名は予めどこかに登録しておく必要もなく自由に設定できる。

http://webhook.tingbot.com/<webhook名>

ということはたまたま、Tingbot ユーザの誰かと使っている webhook 名が一致してしまうと、見知らぬ誰かにデータを見られてしまう可能性や見たくもないデータを見てしまう可能性がある。
ある程度、ランダムで長い webhook 名を使えば、当てられることも少ないと思うが、一度送ったデータは次のデータを送るまでずっと Tingbot で取れてしまうのであんまりプライベートなデータを送らないほうが良いだろう。
逆に大勢にデータを配信するのに使えるかと思ったが、他人も同じ webhook 名にデータを送信できるので容易になり済ませてしまう。 そういう使い方もしないほうが良いと思う。
おおらかなパブリック性をもった Pub/Sub(誰でも投稿できて、誰でも見たい人に配信される)と捉えれば、面白い使い道があるかも。

このエントリーで書いた 3 つのアプリは次のリポジトリで公開している。 tingbot_samples