読者です 読者をやめる 読者になる 読者になる

「ステュディオス」な生活

「ステュディオス」=何かを面白がり、熱中することにより生き生きしている状態。 日々の「ステュディオス」を求めて…

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