タイの宝くじ番号データをJSONフォーマットにまとめる 2021年08月30日

WS000528

この土日も基本家から出ずに自室でPythonで遊んでました。主な目的はオンライン大学のUoPeopleの前タームで学んだPythonを忘れないようにいろんな細かい処理をPythonで書いてみるということをやってます。今回は以前も少し手をつけていたタイの宝くじの当選番号データを抜けや桁不揃いなどないように整備したあと、まっとうなデータ・フォーマットに落とし込んでみるという処理。

1等なら1つ、2等なら5つ、3等なら10個、4等なら50個、5等なら100個と決められている個数だけちゃんとデータとして持っているか、そして各データが6桁、3桁、2桁と数字で正しい桁で格納されているかのチェックを行って、JSONにdumpして公開してみました。一応、自動的に1日と16日の当選日に自動的にタイの政府の宝くじのサイトに当選番号を取りに行ってTesseractを使ってOCR → 番号抽出、新しい当選番号と過去データをマージして自動でJSONをアップロードするところまでは作りました。もしかしたら使う人も居るかな?と思ってとりあえずURL公開してます。ただ、ちゃんとデータ構造とか勉強しないまま作ってるので、まともな人が見たら「なんじゃこりゃあ!」とお怒りになるかもしれないですが割としっかりした当選番号データで(と思っている)、JSONなのでライブラリ使って読み込めばいろんな言語ですぐに取り込めるし、当選番号解析とかするのであれば使えるのではないかと。

Thai Lottery Numbers

さて次は何をしようかな。

Microsoft TeamsへのPythonからの投稿ってのはめちゃ簡単なのね 2021年08月26日

Python

UoPeopleというオンライン大学で今Computer Scienceを学んでますが、ちょうど学期の谷間で2週間ほどクラスがなく、やることなく暇。なのでせっかく覚えたPythonを忘れないように適当なデータ取ってきては適当にサマリ作ったりして遊んでます。その流れで、うちの会社のオフィスにあるサーバーの死活監視を簡単にPythonでかければいいかな?と思っていろいろ調べてみると、これがまた非常に簡単に書ける。さすがだなーPython。ここまで簡単だとそりゃみんな使うわ。

で、とりあえず簡易的に毎分Pingで対象のサーバーに疎通確認を取って、連続3分間失敗したら警告通知を飛ばすように書こうと思ったところで、通知は何がいいかな?メール?LINE?Teams?仕事用なので会社のTeamsのグループに飛ばそうとして調べてみると、PythonからTeamsに通知飛ばすのもこれまたライブラリがちゃんと揃ってて、めちゃくちゃ簡単。いつものようにOAuthがあって、Token取って、毎回更新して、というのがあるかと思いきや。そんなめんどくさい処理は必要なく、コード数行で完了。なんだこりゃ!?

import pymsteams

myTeamsMessage = pymsteams.connectorcard("")
myTeamsMessage.title("Message Title")
myTeamsMessage.text("Message Body")
myTeamsMessage.send()

Python から Microsoft Teams へ投稿する – らくがきちょう

ホントにこれだけで完了。メッセンジャ的に飛ばすならたぶんタイトルも定義する必要なくてトータル4行で済んでしまう。というわけで簡単にMS Teamsの通知部分も作成してとりあえず終了。2,3日様子を見てみることに。

TesseractとPyocrの組み合わせがうまく動かない? 2021年08月25日

Code

Googleの作った画像認識が得意なTesseractというアプリケーションがあって、それをPythonから使うために間を取り持つためのラッパーという役割でPyocrというライブラリがある。このライブラリを使えばPythonから簡単に画像認識、画像から文字列を抜き出すなどいろいろと便利になる。

のだが、ちょっと今このTesseractとPyocrをCentOS7.0上にインストールして使っていて、なんでだかエラーが出る。

[root@c7 lott]# python extract_number.py
tesseract 3.04.00
leptonica-1.72
libgif 4.1.6(?) : libjpeg 6b (libjpeg-turbo 1.2.90) : libpng 1.5.13 : libtiff 4.0.3 : zlib 1.2.7 : libwebp 0.3.0

psm_parameter(): failed to get Tesseract version. AssumingTesseract >= 4 --> using option '--psm'
Traceback (most recent call last):
File "/root/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pyocr/tesseract.py", line 454, in get_version
ver_string = ver_string.split(" ")[1]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pyocr/tesseract.py", line 168, in psm_parameter
version = get_version()
File "/root/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pyocr/tesseract.py", line 471, in get_version
raise TesseractError(
pyocr.error.TesseractError: (0, 'Unable to parse Tesseract version (spliting failed): []')
No. of data: NG> prize1 0

どうやらtesseract.pyのget_version()という関数でエラーが出て失敗してるっぽいが、さらに読んでいくと

def get_version(set_env=True):

global g_version

~ 省略 ~

command = [TESSERACT_CMD, "-v"]

proc = subprocess.Popen(command,
startupinfo=g_subprocess_startup_info,
creationflags=g_creation_flags,
stdout=subprocess.PIPE)
ver_string = proc.stdout.read()
ver_string = ver_string.decode('utf-8')

commandというリストに[“tesseract”, “-v”]というコマンドとオプションを格納して次のsubprocess.Popenに渡す、Popenオブジェクトからread()で標準出力を読み取ってバージョンを検証する流れだが、このPopenオブジェクトの標準出力に何も出力されていない。適当なところで print(ver_string) で何が入っているのか見てみたけどb”とか”とかなんにも出力されないのよね。。。

proc = subprocess.Popen(command,
startupinfo=g_subprocess_startup_info,
creationflags=g_creation_flags,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)

結局、標準エラー出力を標準出力にリダイレクトするとtesseractのバージョン情報がやっと読み取れるようになるんだが、-v オプションを付けてるのになんで標準エラー出力にバージョン情報が出てくるの?他のコマンドでテストしてみるとちゃんとバージョン情報は標準出力に出てくるのに。。。

これってtesseractが問題なの?それともsubprocess.Popenが問題なの?うーんPopenのソースも読まないといけないのか。。。あと他のCentOS7の環境にTesseractとPyocr入れて動き一緒なのか変わるのかも見ないとな。。。すんません、ここまで書いてて何が原因かまだわかりません。ここまで見てきたところで「あ、ブログ書かなきゃ」と思ったので頭の中にあったものを書いたまで。お粗末様。

KN95マスク50枚、PythonでHDD内の重複ファイル検出プログラム、楽器処分市 2021年08月17日

2021-08-17_11-01-08

とりとめもなく書いていきます。

最近配送が遅れ気味なLazadaで購入したKN95のマスク50枚が到着。このマスクは安い割に作りがしっかりしているのがいいと思う。価格は160バーツ+送料22バーツ。だいたい日本円で言うと500円ぐらいかな。AmazonでKN95のマスクの日本の価格見てるとこの値段はぜんぜん安い。でも結構満足感が高い。このマスクはフリップタイプのフルフェイスでもつけたまま被れるし、口元がマスクの布に直接着かない、結構隙間開かない、思ったよりも息苦しさがない、でお気に入り。安いので毎日使い捨て。

アメリカのオンライン大学 UoPeopleで初回のプログラミングコースが終了したのでほぼほぼ2週間勉強のお休み期間。たっぷり時間ができるのでDockerとKubernetesの勉強をして、自分の管理しているプロキシ+VPNサーバーをコンテナで管理できるよう移行しようかと考えていたが、さすがに基礎部分を時間かけてやったせいか簡単なコーディングではあるもののコーディングのスピードがあがった気がする。なので少し楽しくて指定したフォルダの内容をスキャンして内容が重複するファイルを検出するプログラムなどを書いて遊んでいる。デスクトップを指定してごちゃごちゃとゴミ屋敷のようになったデスクトップ上のファイル、デスクトップ上のフォルダをさらに階層をたぐってすべてのファイルをハッシュして比較するプログラム。しかしながらエロ動画など数GBの容量のあるDドライブをスキャンかけると途端に動作が重くなる。バイナリ読み込みモードで読み込みを先頭100MBだけ読み込み、その部分だけで比較するようにしたがやっぱりまだ重い。でも楽しい。DockerそっちのけでPythonのほうがばっかやってる。

そして前回PRS SE 22 Standardが売れて、今回めでたくMarshallのDSL1CRも売却決定。今年前半のチューブアンプ狂い発症の際にバカみたいに買ったアンプ、結局Marshallが好き!とか言っていながら最終的に行き着いたのはFenderのBluesDelux。BluesJuniorでよかったがタイに在庫がなくて40WもあるBluesDeluxを購入。尋常じゃなく音がでかいが、アッテネータかましてなんとか使ってます。Marshall好きだけど、一応Fenderのチューブの音もわかっておきたい、と思って買ったら結局BluesDeluxが一番好きになっちゃった。というわけでこのBluesDeluxとMarshallのDSL5CかORIGIN20Cのどちらかを残して売却する予定。あと、GibsonのLes LesPaul TributeとEpiphoneのSG Specialも売っちゃおうかなーと思案中。

UoPeopleのProgramming Fundamental終了 2021年08月12日

UoPeople(University of the People、アメリカのオンライン大学。現在Computer Scienceを勉強中。)も早くも3タームめの最終週である第9週に突入。この週はFinal Examを木曜日から日曜日の間に受けるだけの週。ちょうど今週は木曜日が祝日だったので金曜日が締め切りのLearning Journalを終わらせ、その勢いでReview-Quiz(Final Exam用模試)を何回かトライしてその後Final Examも終わらせる。たぶん満点であろうとは思う。満点ならA+が取れるはず。無理せずゆっくりやってるので今のところは好成績。今タームもお疲れ様でしたと自分に言い聞かせて終了。10週めはお休みなのです。で、第4タームめはProgramming 1というタイトルでJavaの勉強をします。

というわけで祝日の今日は勉強やっていつもどおり家から一歩も出ない一日でした。。。