【バケたん】の機能をソフトでシミュレートし結果をtweetするbot-> <[@6thSensor](https://twitter.com/6thSensor/status/1473609420387282947?s=20)>
をフォローすると、下記コードのテスト運用を確認できる。
(ここで示すコードはバケたんの動作原理をguessするもので完全にシミュレートするものではない。)
###【バケたん】とは?
【バケたん】とは「お化け探知機」という玩具の略称で、その原理は↓こちらのサイトが詳しい。
https://www.j-dowsing.com/goods/baketan/
お化けだけでなく地震の予知にも使っている人が大勢いるようだ。お化けの場合は調べたい場所でボタンを押し、青なら良いスピリッツが、赤ならお化けがいるということになるらしい。
ボタンを押さなくても10分ごとに自動でチェックしているらしく、ときどき、赤や青に点滅したり、BEEPしたりする。
上のサイトによると「サイコロを、8回振り、特定の数字に偏りが出ると赤、ランダムに全ての目が出れば、青が光る様に作られています。」ということなので、賽(さい)の目を0-5にし、サイコロを8個にしたものをPythonで書いてみた。
本家「ばけたん」の場合は近くにないとき点滅してもわからないが、ソフトばけたんの場合はタイムスタンプが残るので、あとでいつ反応したかがわかる。
###ランダムネスとは?
ランダムネスの究極の定義はグレゴリー・チャイティンによってなされたそうだが<[チャイティン](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%81%E3%83%A3%E3%82%A4%E3%83%86%E3%82%A3%E3%83%B3)>、圧縮できるほどランダムネスの率が低く、圧縮率が低いほどランダムであると、ここでは強引に解釈させていただく。
そこで、ここではランダムに生成した数値をgzip関数で圧縮して、そのデータサイズが小さいほどランダムでない、つまり、"珍しい"ということになり、お化けや地震の発生可能性が高いと警告することにした。
gzipの結果で圧縮率=非ランダムネスを測るのはいささか乱暴だが、とりあえず、それらしく動くことをここでは優先した。
下のコードで、
'consumer_key'
'consumer_secret'
'access_token_key'
'access_token_secret'
のところは、それぞれ、twitterのデベロッパーポータルから、https://developer.twitter.com/en/portal/dashboard
keyとsecretを取得して書き換える。
(以下のコードでは乱数生成は10分ごとではなく、60秒ごとになっている)
###ソフトばけたんのコード
import gzip
import sys
import os
import random
import datetime
#import winsound
import time
import threading
import tweepy
consumer_key = 'consumer_key'
consumer_secret = 'consumer_secre'
access_token_key = 'access_token_key'
access_token_secret = 'access_token_secret'
def worker():
nw = str(datetime.datetime.now())
s_in = ""
for n in range(8):
s_in += str(random.randint(0, 5))
ss = bytes(s_in, encoding='utf-8', errors='replace')
s_out = gzip.compress(ss)
b = sys.getsizeof(s_out)
# 56 < b < 61
#print(nw[2:19]," ", b, s_in)
if b < 59:
col = "黄色"
if b < 58:
col = "赤"
#twt = nw[2:19] + " " + str(b) + " " + s_in
twt = nw[2:19] + " " + col
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token_key, access_token_secret)
api = tweepy.API(auth)
api.update_status(twt)
#winsound.Beep(800,1000)
time.sleep(1)
#thanks to
#https://qiita.com/montblanc18/items/05715730d99d450fd0d3
def scheduler(interval, f, wait = True):
base_time = time.time()
next_time = 0
while True:
t = threading.Thread(target = f)
t.start()
if wait:
t.join()
next_time = ((base_time - time.time()) % interval) or interval
time.sleep(next_time)
tnow = str(datetime.datetime.now())
print(tnow[2:19])
scheduler(60, worker, False)