この1週間、記者は「ソリティアおじさん」になっていた。
巷には今、「働き方改革」とともに「RPA」という言葉が台頭し始めている。RPAは「ロボティック・プロセス・オートメーション」のことで、普段の業務を自動化してくれるソフトだという。
こんな説明がなされているが、これまでプログラミングに触れてきた人にとってはやや疑問が浮かぶのではないだろうか。「Excelマクロやバッチと何が違うのか」と。
例えば、RPAの動作説明でよくあるのは「ファイルをゴミ箱に捨てる」という操作だ。RPAソフトがファイルをゴミ箱にドラッグ&ドロップするという操作だが、ファイルを削除するのが目的なら、Windowsであれば「del hogehoge.txt」と書いたバッチファイルを実行すれば済む話だ。「del *.txt」とすればフォルダ内のテキストファイルを一網打尽に消すこともできる。
Webブラウザの操作であれば、「Node.js」や「Selenium」などですでに自動化しているという人もいるだろう。記者の場合はそこまではしていないが、ブックマークレットで簡易的に操作の一部を自動化していたりもする。
このように、「ファイル操作ならバッチでいい」「ブラウザ操作ならSeleniumでいい」「Excelやスプレットシートならそれぞれのマクロでいい」となると、一体どこでRPAとやらを活用できるのかと疑問に思ってしまうかもしれない。
そこで記者は考えた。Windows PCに標準で付属しているおなじみのトランプゲーム「ソリティア」を自動化しようと。
ソリティアのようなスタンドアローンのゲームにはバッチ操作もブラウザ操作も適用できない。自社向けに独自開発した業務ソフトも、APIが用意されていたりしない限りは、ソリティアと同様の状況といえるだろう。
RPAソフトの中でもスタンドアローン型と呼ばれるものは典型的に、デスクトップにあるものを画像として認識し、認識したものに対してクリックやテキスト入力など各種操作を行う。
できれば業務ソフトの自動化をお見せしたいところではあるが、そもそもその業務ソフトが何であるかという説明がなければよく分からない上、それを一部でも公開することは会社の機密に触れる恐れもある。
そこで、多くの人がよく知っていて、かつ業務ソフトと同様の性質を兼ね備えたソリティアを使って、RPAでできることを説明していこうというのが本記事の趣旨である。
会社で他のメンバーが記事を執筆・編集する中、23型のディスプレイに大きくソリティアを表示する記者は、傍目には「業務中にソリティアをして時間をつぶしているおじさん」に見えていたかもしれないが、こういう理由だったので許してほしい。
今回、RPAには無料で利用できるオープンソース開発のRPAソフト「SikuliX」(バージョン1.1.3)を用いる。
SikuliXは米マサチューセッツ工科大学のユーザーインタフェースデザイングループが2009年から開発を主導し、オープンソースの画像処理ライブラリ「OpenCV」を利用してデスクトップ上のあらゆるものを自動化することを目的に作られている。
ソフト自体の開発言語はJavaで、Windows、Mac、Linux上で動作する。SikuliXは自動化する内容を記述するためのIDE(統合開発環境)でもあり、記述言語にはデフォルトでPython(Jython)の他、Ruby(JRuby)、JavaScriptをサポートするとしている。
※Jython、JRuby:PythonやRubyの文法で書かれたコードを、Java仮想マシン上で実行する実装のこと。
プログラミングを理解しなくても、例えばある物体をある場所へドラッグ&ドロップするという動作であれば、マウスを動かすだけで実装できる。
SikuliXが立ち上がった画面を見ると、左カラムにある「マウスの操作」という項の中に「dragDrop([カメラマーク], [カメラマーク])」という関数があるので、これをクリックする。
すると右のテキストエリアに「dragDrop([カメラマーク], [カメラマーク])」と入力され、このカメラマークをクリックするとスクリーンキャプチャモードに移行する。
ここで動かしたい物体として、例えばハートの4を矩形で指定する。次に、2つ目のカメラマークをクリックして、動かす先であるクラブの5を指定する。このようにすると、マウスで指定したエリアがテキストエリアに変数として画像のまま表示されるため、自分が関数にどんな画像を渡したかを直感的に理解できる。
これで実行ボタンを押せば、マウスカーソルが勝手に動き出し、ハートの4をクラブの5へ勝手に移動させてくれる。
さらに山札をめくる(クリックする)という命令をしてみよう。
左カラム「マウスの動作」から「click([カメラマーク])」をマウスでクリックし、テキストエリアに入力された関数のカメラマークをクリックし、キャプチャモードからカード裏面の絵柄を矩形選択する。これだけだ。
テキストエリアで先ほど指定した画像変数にマウスオーバーしてみると分かるのだが、この変数は実際には文字列であり、スクリーン上の位置情報は入っていない。
よって、これらの関数はマウスカーソルの軌跡をなぞって動いているわけではなく、文字列から参照した画像(png)ファイルに一致する位置をスクリーン上から探索しているのだ。
つまり、「ハートの4をクラブの5に移動しろ」という命令は、カードの位置が変わっても有効ということだ。
このように、簡単な操作であれば、特にPythonなどプログラミングを意識しなくても作れる。そしてPythonは特別な宣言(C言語でいう「#include <stdio.h>」や「int main(void)」など)がなくても動くので、Python流のif文やfor文を書けば簡単な条件分岐や繰り返し処理が簡潔に書ける。
記者はJava開発経験がほんの少しあって、Pythonは書いたことがないという程度のスキルだったが、Tabによるインデントにさえ気を付ければかなり平易に書けるという印象だった。
Pythonを書くに当たっては、『スラスラわかるPython』(翔泳社)、SikuliXには『オープンソースで作る! RPAシステム開発入門 設計・開発から構築・運用まで』(翔泳社)を参考にした。
今回、ソリティアの中でも代名詞的な「クロンダイク」の初級レベルに挑戦した。
ゲームの条件としては、場札のカードは赤と黒を数字順に乗せていき、山札は1枚ずつめくるというもの。人間が挑めば、カード配置的にそもそもクリア不可能でなければまずクリアできるくらいの難易度だ。
これくらいであれば、定型業務のように、そこまで複雑化した条件分岐でなくてもクリアできるのではないか。そう思って挑戦することにしたが、先に結果を言うと、丸2日で実装にチャレンジしてみてそれなりの複雑なプログラミングになった上、クリアには至らなかった。
どんな方法で解こうとしたか、どこでハマってしまったのかをここから説明していく。おそらく画像認識ベースのRPAであれば他のソフトでも当てはまる部分はあると思うので、業務効率化などの参考になったら幸いだ。
まず解き方としては、最短で解くようなことは考えず、とにかくゲームが展開することを優先した。
基本的な方針は、
(1)山札を開いてカードを特定する
(2)初回試行のみ、場札のそれぞれの山にある開かれたカードを特定する
(3)右上の組札置き場に送れるカードがあれば送る
(4)場札の山から他の山へカードを移動できれば移動する
(5)(1)に戻って繰り返す
という繰り返しで解くことにした。
Copyright © ITmedia, Inc. All Rights Reserved.
Special
PR