UiPathでFizzBuzz問題やってみた

Facebook にシェア
Pocket

昨今、あちらこちらで名前をよく聞く「RPA」。「ようは自動化でしょ。大きいマクロみたなもので。プログラマからすればプログラミングで解決できるんだから、あまり関係ないか」。なんて思っていたのですが、来月からRPAツールの『UiPath』の業務に携わることになりました(自分ひとりだけなんですが……)。

ただ、使ってみるとこれが結構面白い。プログラミングと関係ないと思ってたけど、結構プログラミングの概念も必要となってくるし、プログラミングで組むよりも圧倒的に自動化しやすいこともある(例えば、ウェブスクレイピングについてもだいぶ簡単にできる。面白かったのが、画像判定で次の処理にいく機能で、これでページロードに適当な時間を指定して待つ必要がなくなるという)。

というわけで、今回はそんなUiPathについて軽く紹介。UiPathを紹介している記事なんてあちこちにあるので今更なんですが、今公開されている記事は、公式サイトも含めて英語の画面で紹介していることがあるので、この記事では最近でた日本語版で説明します。

まずは、UiPath Community Edition – Request your free downloadにアクセスして無料版をダウンロードしてください。最初に開いたときは下記のようなクッキーポリシーに同意するメッセージが表示されると思いますが、『同意する』を選択して、姓と名とEメールを入力して『COMMUNITYエディションのダウンロード』ボタンをクリックしてください。

ちなみに、『Cookieポリシー』のリンクをクリックすると、そこでもクッキーポリシーのメッセージが表示されて、フィルターがかかってしまうという。

話は戻って、ダウンロードボタンをクリックしたら、下記の画面になります。メールでも案内の連絡が届きますが、『こちらから』のリンククリックでもダウンロードできます。

そうすろと、『UiPathStudioSetup.exe』という実行ファイルがダウンロードされると思うので、それを実行すると、下記のような画面となります。

『Community Editionのアクティベーション』を選択し、次の画面でメールアドレスを入力し、『アクティベーション』をクリックします。

そうすると、UiPathのスタート画面が表示されたと思います。なお、次に実行する時はスタートメニューに『UiPath Studio』があると思うので、そこから起動するようにしてください。『UiPathStudioSetup.exe』を実行しても起動できるのですが、毎回アクティベーションの確認がでてしまいます。

では、『プロセス』ボタンを押してプロジェクトを作成します。今回はFizzBuzz問題を作成しようと思うので、『fizzbuzz』というプロジェクト名にしました。そうすると下記のような画面になります(左側のパネルがアクティビティになっていない場合は、左下のアクティビティタブを選択してください)。

見てわかる通り、現在ダウンロードすると日本語になっています。左にあるのがアクティビティとよばれる、UiPathのプロジェクトを構成する、何をするかをあらわした部品のようなものですが、『プロジェクトを検索』のテキストボックスでアクティビティを検索することができます。現在でている記事や公式サイトのマニュアルではこれが英語となっていて、その英語にあたるアクティビティは日本語でどれなんだと最初分からなかったのですが、英語で入力してもだいたいでてきます。下記は『assign』と入力して、『代入』アクティビティがでてきた画像です(よく分からないですが、でてこないのもある)。

まずは、フローチャートというアクティビティをメインパネルに置きます。名前のとおり、UiPathはフローチャートを書く要領で実装していきます。

FizzBuzzを実装する前に、変数の作成をします。画面下にある『変数』という箇所を選択して、変数パネルを表示します。名前に変数名、変数の型に変数の型(VB.NETと同じです)、スコープにどの範囲に適用するか、規定値にデフォルトの値を入力します。

つづいて、フロー条件分岐というアクティビティを置き、その条件を、「num Mod 3 = 0」とします。これは、numの値が3で割ると0余る(割り切れる)かという条件となります。構文は、VB.NETと同じです。

続いて、代入アクティビティを置き、上記の条件が成立した場合にfizzbuzzを”Fizz”とするようにします。気を付けてほしいのは、文字列を書くときは、ダブルクォーテーションで囲む必要があります。ここらへんはプログラミングと同じですね。

そういう要領でフローチャートを作成していくと、下記のようなものができました(さっきは、最初にfizzbuzzを””とする処理なんてなかったよね? なんて突っ込みはやめてください)。

サンプル:UiPathのFizzBuzz

中に入っているfizzbuzz.xamlをUiPathのスタート画面の『開く』から選択すると、上記のような画面になると思います(ファイルを選択するときは、『ワークフロープロジェクトファイル』から『ワークフローファイル』に切り替えてください)。

このプロジェクトを実行するには、左上の再生ボタンをクリックします(再生マークのボタンが二つあると思いますが、どちらも同じ動きです)。そうすると、出力パネルに1~100までのFizzBuzzの結果が表示されました。

出力パネルが表示されていない場合は、『出力』というタブボタンがどこかにあると思うでクリックして表示してください。パネルは自由に移動できますが、自分は画面の右下に配置しています。

だいぶ最後のほう省略しましたが、UiPathで簡単にFizzBuzz問題を実装できました。プログラミング的な概念もありますが、簡単に実装できるので、プログラミングを学び始めた初心者にとってもいいのではないかと思いました。ただ、FizzBuzz問題程度だとプログラミングでいいじゃんとなるので、もっとUiPathならではのことができないかそのうち紹介したいと思います。

【MySQL】DECIMAL型の小数点以下の末尾の0を取り除く方法

Facebook にシェア
Pocket

データベースにMySQLを使っているシステムにおいて、MySQLから数値を文字列として取得してそのまま表示したいということがあったのだけれども、DECIMAL型だとなんと小数点以下の末尾の0がそのまま表示されてしまうことが発覚。

(decimal_timeがDECIMAL(10,3)型で、double_timeがDOUBLE型)

DOUBLE型なら省略してくれるんですけどね。それならと思って、DOUBLE型にキャストしてみようと思ったのですが、MySQLではDOUBLE型へのキャストはできないようです(参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.10 キャスト関数と演算子)。「CAST(decimal_time AS DOUBLE)」というようにキャストしてみようとすると、下記のようなエラーメッセージが表示されました。

いろいろ考えた末、ちょっと長くなるけど、下記のように小数点以下が何桁まであるか調べて、その分の桁数で切り下げすることに。

結果:

DECIMALの小数点以下の桁数の数をどう設定しているかによって変わってくるんですけどね。これが、DECIMAL(10,4)とかだったら、「WHEN MOD(decimal_time, 0.001) = 0 THEN TRUNCATE(decimal_time, 3)」という条件を追加すればいいです。

なお、先ほどDOUBLE型にはキャストできないと書きましたが、調べてみると関数を作成することで、DOUBLE型に変換することができるそうです。
参考:casting – Is it possible to cast a DECIMAL to DOUBLE in MySQL? – Stack Overflow

下記のような関数を作成し、

実際に下記のSQLを実行すると、先ほどと同じ結果となりました。

関数を利用できるなら、こちらのほうが便利かもしれないです。

サブクエリのサブクエリにメインクエリの値は使えない?

Facebook にシェア
Pocket

先日、業務でSQLを実装してみて、「あれ? これできないの?」と思ったことがるので書きます。試した環境はMySQL8(他のDBMSでは動作が異なるかもしれない)。

うまく動かなかったのは、サブクエリのサブクエリにメインクエリの値を使おうとしたとき。例えば下記のようにmember(会員)テーブルとscore(点数)テーブルがあるとする。

ここから、memberテーブルのname(名前)と、その名前に対応するscoreテーブルの最新のscore(点数)を取り出したいとして、下記のように書きました。

ようは、memberテーブルのmember_idで絞り込んだscoreテーブルのうち、date(日付)でソートしたときの順序を取得して順序が1つ目の値をとってきています(JOINしろといわれそうですが、実際に作成したのはIFNULLの第二引数で取得するようにしていて、ほとんどの行でこの結果を取得することはないので、サブクエリとしました)。

しかし、これを実行すると下記のようなエラーが発生します。

つまり、’member.member_id’なんてフィールドはないということだと思います。

もちろん、下記のようにサブクエリで指定するようにすると取得できます(違いとしては、上記がサブクエリのサブクエリでIDを絞り込もうとしていたのにたし、下記ではサブクエリでIDを絞り込もうとしている)。

結果:

多分、サブクエリのサブクエリにはメインクエリの値は利用できないのだろうと思ったのだけど、調べてみても根拠となるソースが見つからなかった。何でこういうふうになっているんだろう? 内部ロジックが複雑になるからか?

SQLの結果のフィールド名が空白になってしまう現象に遭遇した

Facebook にシェア
Pocket

先日、会社の後輩に作ってもらったストアドで、なぜか一部、ストアドで返ってくる結果のフィールド名が空白になってしまうという現象が発生しました()。

具体的には下記のようなSQLとなっていた。

結果:

見てわかる通り、fruit_idのフィールド名は取得できているのだけど、fruit_nameのほうは空白になっている。試しに、コピペで順序を逆にしてみても、fruit_nameのほうが空白になった。

一見すると、何の変哲もないSQL。じっと見ていても何も分からなかったので、とりあえずコメントも消してみてもう少しシンプルな形にしてみようかと思ったときにちょっとだけ違和感。なんだかカーソルの動きが一部だけ大きいような……。

そう思って試しにテキストエディタに貼り付けてみたらわかりました。

fruit_nameのほうは、コメントの左側に全角スペースが入っています。

ただ、それでもなぜカラム名が空白になるのかすぐには分かりませんでした。何でこんな現象が起こるのかなと。

ですが、ちょっと考えてわかりました。これは、フィールド名は空文字ではなく、全角スペースになっているんだろいうことに。つまり、下記のようなSQLと同じようになっているということです。

つまり、別名をつけるASキーワードが省略されたと判断されて、フィールド名が全角スペースになっていたということです(今回試したのはMySQLですが、多分他のSQLでも同様の現象が発生するのではないかと思います)。

それにしても、なぜSQLはASを省略していいという仕様になったのだろうか。ASを省略しているSQLはよく見かけるけど、個人的に分かりにくいし、今回みたいによく分からないバグの原因にもなりかねない気がするのだけど。

MySQLの SELECT … INTO 構文で結果を変数に書き込むときの注意

Facebook にシェア
Pocket

先日少しはまった話。

MySQLにはSELECT … INTO 構文というものがあります。これを利用すると簡単にクエリー結果を変数に格納することができます。
参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9.1 SELECT … INTO 構文

仕事で、MySQLのストアドを利用して、指定のIDとOUTパラメータを引数にセットし、OUTパラメータに引数に対応する値を返すというストアドを同僚が作っていました。そのストアドはSELECT … INTO 構文を使って下記のようになっていました。

実際のテーブルは下記のようになっているとします。

この時、p_idに1を指定すると、p_nameには「りんご」という値が入ります。

もちろん、p_idに2を指定すると、p_nameには「みかん」という値が入ります。

では、ここでp_idに10を指定するとどうなるでしょう。fruid_idが10のfruit_nameはないから、結果はnullになる。同僚もそうなると思ったようですが、違いました。

結果は一つ前に実行したときに取得した「みかん」を取得。プログラム作って動かしていた自分は、最初、「やけに同じ結果が返ってくるなぁ。てっきりnullが返ってくると思ったのだけど」なんて呑気に思い、しばらくバグに気づきませんでした。

これはなぜかというと、MySQLの変数はセッション変数で、つなげている間は結果が保持されるためだそうです。
参考:mysqlでユーザ定義変数をつかう – 眠すぎて明日が見えない

なので、上記のように変数に格納したい場合は、いったんnullで初期化する記述を追加したほうがいいです。


ただ、この程度だったら直接outパラメータを指定したほうがシンプルかもしれないですけどね。

それより、WorkBenchがちょくちょく結果を表示してくれないことがあった困る。何で、「1 row(s) returned」って書いてあるのに、表示してくれないことがあるんだ……。