小ネタ:AI Builderの二項分類で Trick or Treat を判断する

かなり日がたってしまいましたが、PowerApps で Halloween challenge というのが勃発的に起こっていたので、10/1にGAとなった AI Builder でちょっと遊んでみました。

個人情報をもとに「Trick」か「Treat」を判断する二項分類モデルを作る

前準備:1,000名分のダミーデータを作成する

  • ダミーデータはこちらで作成した疑似個人情報をベースにします。氏名、年齢、性別、住所などを含むデータを出力できます。
    • このサイトではrand()によって各レコードにランダムな値を振れるので、1-100の間でランダムな数字を振るようにし、1,000件分のダミーデータを出力しました。
  • 出力されたデータに対してToT列を追加し、ランダム値が素数であればToT列をYes、そうでなければNoというデータを付加します。
  • ダミーデータを元にエンティティを作成します。

AI Builder:モデルをビルドする

  • Build は3ステップ
  • まず初めに、どのフィールドの予測を得たいかを設定します。
  • 次に、予測を得るために参考とするフィールドを選択します。
  • モデルをビルドします。
  • そこそこのパフォーマンスになっていることを確認して、モデルを公開します。

Canvas App:データの入力と結果の出力用アプリを作成する

適当な感じにキャンバスアプリを作成します。

「Challenge!」ボタンを押すと、CDSのエンティティにレコードを追加し、前述の二項分類モデルを利用して「ToT」フィールドに「Yes/No」値を格納し、その結果に応じて Trick or Treat する仕組みです。
実際に値を見てみると、ちゃんと予測結果が入っています(crb91_tot – predicted (Trick or Treat Model) の列)。

CDSに格納した予測結果を元に、「いたずら」か「お菓子」かを表示します。

AI Builder:予測結果

今回は前述の通り「randで降った乱数が素数の場合はTrick(いたずら)」という関係性を定義した上で「AI Builder(Binary Classification) の判定値からは外す」ということを行ったので、AIちゃんからしてみると賢明に対象項目から関連を探して予測を返していることになります。
モデルの情報を見ると、本来の関連性がない状況で、数値が入る項目を頼りに予測していることがわかります(Add4, Birthday)。

かんたんなまとめ

AI Builder は、エンドユーザーが気軽にAIの機能を使えるようになる点においては素晴らしい機能だと思います。ただし利用に際しては個別のライセンスが必要になるので、ご購入されているプランに応じてご確認ください。個人的には早くFormが日本語対応しないかなーと思っています!

小ネタ:PowerApps キャンバスアプリのアクセシビリティに対応しよう (TabIndex編)

アプリを作成する際にはアクセシビリティについても検討する必要があります。PowerAppsにはアクセシビリティを担保するための機能が備わっているので、これを利用して様々な環境での利用に配慮したアプリを作ることができます。
今回はアプリをキーボードだけで使えるようにTabIndexの対応をしてみます。
※一部の内容はPowerAppsの特別な文脈ではなく、HTMLの仕様に基づく一般的なものであることを追記しておきます。

TabIndexの対応をしてみよう

TabIndexとは、Tabキーを押して要素にフォーカスする際の順序を決定するプロパティです。Indexとありますが推奨値は -1 または 0 のいずれかです。こちらのアプリを例にとってみます:

上の画像の赤枠で囲っている箇所(=対話的な要素)にはTabで移動したいので、その場合はTabIndexプロパティを0に設定します。
その他のラベルやアイコンなどはTabで移動する必要がないため、-1とします。
このように設定することで、上から下、および左から右(Zの形)で自動的にフォーカスの順序が決定されます。

TabIndexプロパティ以外にも設定が必要

Tabで適切に移動ができるようになりましたが、それだけではまだ足りません。マウスでクリックしたり、指でタップするのとは異なり、キーボードで遷移する場合には、現在フォーカスしているコントロールがどこなのかを明確にする必要があります。そのためには、以下の2つのプロパティを適切に設定します:

  • FocusedBorderColor:コントロールにフォーカスがあるときの境界線の色
  • FocusedBorderThickness:コントロールにフォーカスがあるときの境界線の太さ

実際の動作のようす

TabIndex、FocusedBorderColor、FocusedBorderThickness を適切に設定した場合、このような動きになります。

まとめ

  • TabIndexを正しく設定しよう(フォーカスさせたいコントロールは0、それ以外は-1)
  • コントロールにフォーカスがあるときの境界線の色(FocusedBorderColor)と太さ(FocusedBorderThickness)も正しく設定しよう

ちなみにアクセシビリティチェッカーではどんな結果になるの?

IconコントロールやTextInputコントロールに対して、TabIndexが -1 の値となっている場合は「タブ ストップがありません」というエラーが出ました。
一括でチェックするのに捗りますね。
※値を設定していない場合はエラーとなりませんでした。ご注意ください。

参考サイト

小ネタ:毎日FlowでBingの壁紙をDLする

小ネタです。Bingで提供されている壁紙を、Flowを使って毎朝自動でダウンロードする方法。

URL(json)
http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=ja-JP

この小ネタをわざわざ書いたのは、BingがちゃんとJSON(/xml/rss)で返してくれることに驚いたからです。「bing image url」で検索するとstackoverflowにこんな投稿がありました。世界には自分と同じようなことをしたい人がわりとたくさんいるんだなあと思ったので、今後もめげずにアウトプットしていきます。 ;-)

小ネタ:Qiitaで特定のタグが付いた記事が投稿されたらTeamsにも投稿する

小ネタです。
TeamsのIncoming Webhookを使って、Qiitaの特定タグのフィードを取得して投稿します。

Flow全体像

投稿されたようす

投稿者がうまくとれなかったり(フィード内にはAuthorはある)、サマリが取得できてなかったり(フィード内にSummaryがない)するのですが、単純に新着を流すにはよさそうですね。;-)