Batasan Blog

人類みな五十歩百歩

2台目パソコン

dynabook N40にUbuntuをインストールして使っているのだが、頻繁にフリーズするので2台目パソコンの購入を検討している。おうちパソコンでは、ひと昔前ならYoutubeNetflixなどの動画がスムーズに見れるかどうかが一つの判断ポイントだったと思うが、今どきはそのような動画はFireTVなどで見ればいいと思っているし、我が家のレグザのHDMIにささっていて、dynabookに飽きたときに使っている。仕事用も兼用している場合は別にして、おうちパソコンの目的は動画視聴は除いて一般的に分類すると、

  1. ゲーム関係
  2. 動画編集関係
  3. 株や暗号通貨などの投資関係
  4. ネットサーフィン(古語?笑)
  5. その他

という感じかとおもう。私の場合は「5.その他」+ Linuxをはじめいろんなことを試す人柱系(古語?笑)である。なので高スペックなCPUなどは不要で、今流行りのミニパソコンや場合によってはFireTVと同じくらいの大きさのスティックパソコンあたりがいいかな?と思って検討中である。

dynabook N40

dynabook N40にUnuntu日本語Remixインストールして、外部モニターも繋いでSikulixなど使って、それなりに楽しく遊べているのだが、実は限界を感じている。CloudReadyをインストールしていた時にも同じだったのだが、頻繁にフリーズするのだ(涙)。現象はCloudReadyの時と同じで、前触れなしに唐突に動作停止して、数秒から数十秒後にパソコンが再起動される。2~3時間起きない時もあれば、数分ごとに起こることもある。

 Windows10で使っていた時は起きなかったので、解決する可能性はあると思うのだが、故障?が起きているマシンで故障を調査するのは、非常にストレスがたまる(笑)。
 さすがに母艦にすべき2台目のパソコンを購入して、せめてそれをベースにdynabook N40の調査をしたほうがよいとも思うのだが、

  • 必要性はいつでも最高の師匠である

と言われる通り、他にマシンが無いからこそLinux入れたりするモチベーションが沸くのであって、新しいパソコンを買ってしまうともうdynabook N40には戻ってこない(笑)ような気がして、まだ迷い中である。。。
dynabook N40

Sikulix Exception

 

dynabook N40にUbuntuを入れてsikulixでいろいろ試しているのだが、早速いろいろバカな失敗をやってしまっている(笑)。まあ、そうやって経験値を積むのがプログラミンだけど。。昨日やってしまったのはexceptの取り扱いだ。

#
def log_print(m): # デバッグ上の表示を関数にしている
    print(m) # 画面にメッセージを出す
#
print(App.openLink("https://google.com")) # 標準ブラウザでgoogle.comを開く
try:
    wait("画像.png",15) # 画像.pngが見つかるまで最大15秒待つ
    log_prinh("Found.")
except: # 15秒みつからなかったらここへ飛んでくる
    log_print("Not found.")
#
click() # 引数なしだと最後にマッチした場所を左クリックする

このソースを見て「これはダメじゃん!」と思ったあなた、センス抜群ですね!(笑)。実は途中までうまく実行されていたのに、急に動かなくなってしまった(涙)。どうやっても画像が一致しなくなってしまったのだ。何度もスクリーンショットを撮りなおしたり、認識度をいろいろ変えてみたり、いろいろやってダメだったので、sikulixのバグか?とか思ったが。。(そんなはずない(笑))   そうこうして半日くらいたったところで、

  • あれ?except:ってもしかして画像が見つからないexception以外もキャッチしてる??!!

ことに気づいた。ソースをよーく見ると、なぜか自分の定義した関数に変な文字が紛れ込んでいた(涙)。なにかの拍子に書き換えてしまったらしい。。。pythonスクリプト言語なので、定義していない関数を書いてもコンパイルエラーを出してくれるわけでなく、実行時のexceptionとして処理されるので、exceptに吸収されてエラーメッセージが出なくなっていた。。
と、pythonのせいにしてしまいそうになるが、よく考えると大昔からjavaでも手抜きで全部一つのExceptionに飛ばして、後で痛い目に合うというのはさんざんやってきた記憶があるのだが、またしても同じことをやってしまった。。。全然進歩していない。。。。 もちろん普通は手抜きせずにこう書く。

try:
    wait("画像.png",15) # 画像.pngが見つかるまで最大15秒待つ
    log_prinh("Found.")
except FindFailed: # 15秒みつからなかったらここへ飛んでくる
    log_print("Not found.")

これなら変な(定義されてない)関数を書いてしまっても、exceptに隠れてしまうことは無く実行時にすぐに気が付く。もし他のexceptionも処理したければ、こんな感じか。

try:
    wait("画像.png",15) # 画像.pngが見つかるまで最大15秒待つ
    log_prinh("Found.")
except FindFailed: # 15秒みつからなかったらここへ飛んでくる
    log_print("Not found.")
except Exception as e: # その他の例外
    print("Error happen!!!!")
    print(e)
    exit(1)

実際に実行してみると関数が間違っているせいで、無事に最後のexceptへ飛びました(笑)。今日の教訓は、

  • 手抜きコードは将来の自分の時間を奪い取る

(笑)

Sikulixのお勉強

 

dynabook N40にUbuntuを入れてRPAを題材にコーディングの勉強中です(笑)。sikulixの代表的な関数find()やwait()は画像がスクリーン上にあるかどうか判定してくれるのだが、少し慣れてくるとexceptなど使って高度な(笑)ことをやってみたくなる。

#
def log_print(m): # デバッグ上の表示を関数にしている
    print(m) # 画面にメッセージを出す
#
print(App.openLink("https://google.com")) # 標準ブラウザでgoogle.comを開く
try:
    wait("画像.png",15) # 画像.pngが見つかるまで最大15秒待つ
    log_print("Found.")
except: # 15秒みつからなかったらここへ飛んでくる
    log_print("Not found.")
#
click() # 引数なしだと最後にマッチした場所を左クリックする

find()やexists()だと実行時にスクリーン上に存在していないとダメだが、wait()は表示されるまで待ってくれて、表示されれば先へ進む。ちなみに上記コードをデバッグ(-v)オプション付きで実行してみると、

java -jar sikulixide-2.0.5.jar -r . -v
:
[debug] Region: wait: 画像.png appeared .......[8180 msec])
:

ブラウザの起動時間も併せて8秒くらい待っているのがわかる。最大待ち時間設定は長くてもよいが、想定外のことはよく起きる(笑)ので、あまり長すぎるとデバッグ時に待ちぼうけしてしまう(笑)。
こんな感じで、画像がマッチした時と、しなかった時に分けて処理を記述していけばよい。

Sikulix 精度

 

dynabook N40にUbuntuを入れてRPAで遊ぶシリーズ第3弾です(笑)。 sikulixのエディターは、スクリーンショットをとってそのままコーディングできるすぐれものである。 Sikulix エディター その昔、長らくviでしかプログラミングしたことがないので、このエディターの便利さには感動すら覚える(笑)。
sikulixをしばらく使っていると、「画像精度」という概念があることに気づく。「認識度」と言ってもいいかもしれない。つまりあらかじめ保存した画像と、実際の画面で「一致」したらクリックする、などとロジックをコーディングするわけであるが、この「一致」は比較的適当である(笑)。人間的には似ても似つかない場所を勝手にクリックしたり、逆に全く同じはずなのに「Not found」と冷たく言われたりする。こういった微調整が必要なのが他のプログラミングとはすこし違うところだ。 sikulixの素晴らしいところは、この「精度」の微調整もエディターから操作できるところだ。切り取った画像をクリックすると、「パターン設定」というウインドウがでて、「マッチングプレビュー」というタブがある。下のほうをみるとスライドバーがあって「認識度」を変更できるようになっている。「認識度」を下げると少しでも似ているモノがあれば「一致」と判断するし、上げるとわずかな違いでも「不一致」と判断するようになる。このあたりの微調整が必要なのはRPAらしいところだし、工夫の余地が多いところだ。遊びならよいが仕事でやっているみなさんには本当に頭が下がる思いである。 こうやって微調整した結果はpythonのコードだとこんなふうになる。

click(Pattern("画像.png").similar(0.90))

これは「認識度」を90%に設定したという意味である。sikulixのエディターはすばらしいが、慣れてくると直にこのあたりをviで編集するほうに回帰するようになっていくのはプログラマーのサガである(笑)。   ちなみに画像に対してclick()関数でクリックされる位置を微調整するには隣のタブの「ターゲットオフセット」で行うことができる。こちらもsikulixのエディターならマウス操作で行えるが、コーディングだとこんな感じで調整することができる。

click(Pattern("画像.png").similar(0.90).targetOffset(-275,20))

こちらも直に...以下同文である(笑)。

Sikulix エラー

 

dynabook N40にUbuntuを入れてSikulixでRPAやって遊んでいるのだが、find()など画像を扱うコマンドを実行すると最初エラーになった。どうやらモジュールが足りないみたいだ。

$ java -jar sikulixide-2.0.5.jar -r .
[error] App: command wmctrl is not executable, the App features will not work
[error] App: command xdotool is not executable, the App features will not work
[error] findWindow:
[error] error in command [wmctrl, -lpGx]

こんな感じである。こういう時は素直にUbuntuにインストールしてあげればいい。

sudo apt install wmctrl xdotool

Sikulixは利用者に非常に親切(笑)であることをポリシーにしているようで、このようにエラーになった時に、急にブラウザが起動してSikulixのgithubのサイトへジャンプしてびっくりすることがある。そこでは、

  • このページにあなたが自動的に来たということは、
  • ~~というエラーが出たんですよね? 
  • 対処方法は~~です。

のように親切丁寧に教えてくれる。今時はもしからしたら普通なのかもしれないが、プログラム言語で実行時にここまでやってくれるのは驚きである。
Sikulixの性質上、普通にネットにつながった環境で実行している人が99%だとは思うが、場合によってはスタンドアロンだったり、会社のファイヤーウォールの中でコソコソ(笑)実行していて、おもわずhttpで外に接続してしまってセキュリティ違反で後で怒られる(笑)ということもありえるので、そういう環境で実行している人は十分注意していただきたい(笑)。 Sikulix Error Jump

Sikulix 実行

 

 

RPAと言えば、今時の会社の業務改善ツールみたいな印象があるが、インターネットの世界では昔からある「ロボット」の一つとも言える。黎明期には無料サイトや投票サイトに自動で何十万回も接続したりというのが横行して、今では「私はロボットではありません」チェックみたなものが標準的になってきたのは、みなさんよくご存じのとおりである。Sikulixは初心者でも使いやすい素晴らしいツールであるが、間違ってもインターネットに嫌われないように使い方には気を付けていただきたい。 Sikulixのjavaファイルをダウンロードし、簡単なスクリプトを実行してみたが、完成したスクリプトを毎回統合環境から立ち上げるのは面倒であるし、そもそも実行中はエディターは隠れているので、実行がうまくいっているのかどうか、ログすらみれない状態で待つはめになってしまう。なので実行はコマンドラインからやるのがよいだろう。

$ java -jar sikulixide-2.0.5.jar -r ソースの場所

コマンドラインから簡単に実行できる。ブラウザを操作したいときはtermとブラウザをこんな感じで配置してから実行している Run Sikulix Script 原始的だが、まあこんなもんでしょう(笑)