【UiPath】ピクチャインピクチャについて（前編）

# はじめに

この投稿は、RPAツールのUiPathの機能である「ピクチャインピクチャ」についての投稿です。

※ 一部、2021年2月に開催された「UiPath Reboot Work Festival」内の「エンドユーザー開発の壁を突破する現場のためのRPAソリューション（StudioX, AutomationCloud）」の視聴感想も含まれます。


この記事は、`UiPath Friends もくもく会 2021年2月開催 2021-02-27（土）08:45 - 12:00` で書きました。

https://uipath-friends.doorkeeper.jp/events/117044


# ピクチャインピクチャとは

そもそも「ピクチャインピクチャ」とは何か？
[Weblio](https://www.weblio.jp/content/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3%E3%83%BC%E3%82%A4%E3%83%B3%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3%E3%83%BC) では、以下のように説明があります。

```
ピクチャーインピクチャーとは、ひとつの画面の隅などに小さく別の画面の表示領域を設け、
それによって両方の画面を同時に表示させておけるようにする表示法のことである。
ピクチャーインピクチャーによって複数の画面を常に表示させておくことができ、複数画面の
視聴や複数画面の確認作業や容易となる。また、画面に大小の差が生じるため、メイン画面と
サブ画面といった位置づけを設けやすい。
Appleが2015年6月に発表したモバイルOS「iOS 9」の案内では、マルチタスク機能の一つとして
ピクチャーインピクチャー機能が紹介されている。動作再生画面やFaceTimeのビデオチャット画面
などを常に前面に表示させたまま、他のアプリケーションを表示させて作業するといった利用方法が
可能となっている。

＃「ピクチャーインピクチャーとは何？ Weblio辞書」より引用
```

ピクチャインピクチャ対応のアプリは、他にも
　Youtube／Chrome／Firefox／AppleTV／Amazon プライム・ビデオ／Netflix
などがあります。「ながら見」したいようなアプリですね。

Youtubeだと動画を右クリックして表示される「ピクチャインピクチャ」をクリックすると、右下にウィンドウが出てきます。
![uipba4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/5cf96d01-84bb-52c2-738e-590b920e465b.gif)


ピクチャインピクチャは、略して「PiP」と書かれることもあり、その読み方は「**ピーアイピー**」が正式みたいです。（ピップだとPythonのパッケージマネージャと勘違いしてしまう？エレキバンを想像してしまう？）

# Reboot Work Festival での紹介

2021年2月の「Reboot Work Festival」内で公開された
　[エンドユーザ開発の壁を突破する現場のためのRPAソリューション（StudioX, AutomationCloud）](https://uipath-today.eventos.tokyo/web/portal/278/event/1883/module/booth/48775/30570) 
のセッションで、ピクチャインピクチャについて、以下のように紹介されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/3f584709-c671-db1e-4d15-0e2d66b00a46.png)

```
RPAエンドユーザーの壁として「開発の壁」「実行の壁」「ガババンスの壁」という３つの壁がある。
「実行の壁」として「ロボット実行中にPCの操作が出来ない」事があるが、これはPiPで解決できる。
PiPを実行すると、デスクトップ上に「Pipウィンドウ」が表示され Windowsセッションがもう一つ
でき、その中でロボットが動く。「Pipウィンドウ」を立ち上げる際にログインが必要になるが
「Pipウィンドウ」をそのまま開いておけば、再度ログインは不要になる。
制限事項もあり「WindowsHomeEditionはセッションを2つ張れないので実行不可」等がある。
Pipを使うことで、とボットがOCを専有してしまうことを、解消できる。

＃「Reboot Work Festival - エンドユーザ開発の壁を突破する現場のためのRPAソリューション」
より抜粋
```

実行の壁は確かにそうですね。ロボットの実行中にちょっとマウスを触ってしまって
「あっ！カーソル動いちゃった？ロボット大丈夫？」なんて経験はよくあります。

# UiPath公式ガイドでの紹介

UiPathの「ピクチャインピクチャ」は、実験版が2020.4、リリース版が2020.10のバージョンで提供されました。
Youtubeなどと同じように、デスクトップにロボット実行用のウィンドウが表示されます。
![3241361-pip_running.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/acb2021c-f22d-bd7e-4708-dff9600a3c4a.png)

UiPath公式の「[Robot ガイド）ピクチャ イン ピクチャ](
https://docs.uipath.com/robot/lang-ja/docs/picture-in-picture)」では、以下のように紹介されています。

```
ピクチャ イン ピクチャ機能は、有人の自動化プロセスをロボットと協働して実行できるようにする
機能です。ピクチャ イン ピクチャ モードで開始されたプロセスは独立した Windows セッションで
実行されるため、プロセスの実行中もユーザーはそのコンピューターを使用することができます。
```

他にも「使い方」や「制限事項」等が書かれています。その中から情報を幾つかピックアップしてみます。

## UiPath公式ガイド）1. PiPを使用するためには？

OSの制限があり、場合によってはインストールが必要みたいです。

```
　・PiP機能は、Windows 8 および 10 の Home Edition ではサポートされていない
　・PiP機能が、PCにインストールされていない場合はインストールが必要
　・PiP機能を、PC上で有効化するには管理者権限が必要
```
HomeEditionがダメなのは「2つ以上セッションを作れない」からです。（セッションの話はこのあとで。）


## UiPath公式ガイド）2. PiPを起動するには？

PiPでロボットに処理させるには、以下のいずれかで実行します。

```
　1）Studioから起動
　　　　⇒ [デバッグ] タブで「ピクチャ イン ピクチャ」を押してから実行する

　2）UiPath Assistantから起動
　　　　⇒ プロセスをクリックして右メニュー「PiPで開始」から実行する

　3）呼び出し系アクティビティから起動
　　　　⇒ プロパティの[ターゲットセッション]でピクチャ イン ピクチャ」を選択して実行

　4）プロセス実行を既定でPiPにする
　　　　⇒ プロジェクトの設定で [PiPで開始] を「はい」に設定
```

図にするとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/1dd60f73-8b3b-26eb-1d98-c7b069feff2c.png)

## UiPath公式ガイド）3. PiPの実行上の注意

PiPでの実行には、以下を注意する必要がある！とのことです。

※ PiPセッション：PiPで表示されたウインドウの実行領域
※ メインセッション：PiPセッションを起動したセッション＝自分

```
　・PiPセッションは「一度に１つ」実行できる（２つ以上の立ち上げ不可）
　・PiPセッションのログイン時間が「60秒」を超えるとエラー（※1）
　・PiPセッションは「PINでのWindowsログイン（※2）」の場合、毎回ログインが必要
　・PiPセッションがある間は「マシンを再起動」できない
　・PiPセッションは「PiPウィンドウ」を閉じればいつでも終了できる
　・PiPセッションでは [管理者として実行] は使用できない
　・PiPセッションでアプリを開くと、アプリの設定が「初期化」されることがある
　・PiPセッションでアクティブにできるブラウザーの種類は「1つ」だけ
　・PiPセッションとMainセッションで同じ「Microsoft Office アプリ」のファイルは開けない
　・Mainセッションで「Microsoft Outlook」は閉じておく必要がある
　　※1 環境変数 UIPATH_SESSION_TIMEOUT を使用して変更できる
　　※2 PIN＝暗証番号ログイン
```

Outlookを落としておかないダメなのは致命的？メール操作系の自動化では「同時作業」はちょっと厳しい。
PiPセッションからメインセッションに「Outlook落としてほしい、落としてくれるの待ってる」とかダイアログ表示とかできれば良いのだけど。


# どういう仕組みなのか？（PiPの正体）

ここまで見てきて、PiPは「リモデっぽいけど、少し違う」感じがしますが、そもそも「どういう仕組み」なのでしょうか？
そもそも「リモデ」なら、基本的には「同じアカウントでログインできない」はず ですが。。。

う－ん、技術的に「どうやって実現しているのか」が気になります。
と思っていたら、津田本（UiPathワークフロー開発実践入門）にヒントがありました。

```
！OnePoint！ピクチャ イン ピクチャ

これは、2020.4で実験的に実装された新機能です。これを有効にした状態でプロセスを実行すると、
小さなデスクトップウィンドウが開き、この中でプロセスが実行されます。ユーザーと
AttendedRobotの画面上の操作が干渉しなくなるため、AttendedRobotが実行中にもユーザーが
同じマシン上で作業できます。ただし、同じファイルを開いて編集するような作業はやはり干渉
してしまうので、注意が必要です。この機能はまだ正式にサポートされていませんが、
AttendedRobotが真のアシスタントとして、みなさんのお手伝いをすることも近いことでしょう。
これは、Windowsの子セッションという機能を活用して実装されました。

＃ UiPathワークフロー開発実践入門 P259 より抜粋
```

「子セッション」というキーワードが出てきました。

そう言えば、英語版UiPathForumの機能紹介トピックにも「ChildSession」というキーワードがありました。また、UiPathのインストールフォルダで「UiPath.ChildSession.Client.dll」を眺めていたら「EnableChildSessions」とか「MsRdpExtendedSettings」等が~~生えている~~書かれているのが見えました。
どうやら「リモデ拡張的なChildSession機能」の実装っぽいけど。。。

「ChildSession」でググると、[マイクロソフトの公式ドキュメント](https://docs.microsoft.com/ja-jp/windows/win32/termserv/child-sessions) がありました。そこには以下のように書かれています。

```
Beginning with Windows Server 2012 and Windows 8, Remote Desktop supports the 
concept of a child session, which is a special loopback Remote Desktop session 
that is tied to a user's existing session.

（日本語訳）Windows Server 2012 および Windows 8 以降で、リモートデスクトップは
「child session」をサポートしました。「child session」は「特別な、ループバックの 
リモートデスクトップセッション」で、ユーザーのログオンセッションに紐付けられます。
※ ループバック：送信元に帰ってくるリクエスト。例）ループバックアドレス（127.0.0.1））

＃ Child Sessions - Win32 apps | Microsoft Docs より抜粋
```

なるほど。やっぱり「リモデセッション」ではあるけど、ちょっと違うんですね。
ループバック、つまり「擬似的な・自分自身を指す」セッションということ。

ユーザーのログオンセッションは「メインセッション、親セッション」と呼ぶらしいです。
親セッションが「子セッションを生み出している」のだけど「リソースは共有している」ので「同じものを参照すると衝突する」のかな。分身みたいな感じ。

マイクロソフトの公式ドキュメントで書かれていることも、ほとんどが「UiPath公式ガイド」と同じ内容なので、ピクチャ・イン・ピクチャの正体は、この「ChildSession」で間違いないでしょう。

調べてみると「ChildSession」は、Windows8以降で「Windowsのシミュレータ」として提供された機能らしいです。もともとは「アプリやドライバの検証テスト」を目的とした機能っぽい。それを活用したのがUiPathのPiPなんですね。YoutubeとかのPiPは「アプリ／プロセス／UI単位」のクローンですが、UiPathはこの「ChildSession」を使って、ログオンセッションのクローンなんですね。仕組み的にはナイスアイデアだと感心します。まさにRPA向き。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/70444374-5d80-5157-e0b3-6f708cb8b9cc.png)


# 親子の衝突をさせてみたい

ここまで見てくると、ピクチャインピクチャは
　**「リモデ」であることよりも「子セッション」であるがための制約がポイント、使用上の注意点**
になりそうです。

同じアカウントで同じマシンなので、リモデでありがちな「解像度やユーザー設定の差異によってロボットが動かなくなる」は起きない感じもします。

**親セッションと子セッションの間でのリソース衝突** をどう避けるか？ というか、衝突しないように**「親セッションが我慢する」***必要がありそうですが、どうでしょうか？実際に衝突させてみないと分からないですね。

果たして親は、どれくらい我慢しないといけないのか？

そのへんは「UiPath】ピクチャインピクチャについて（実践編）」で書きたいと思います。たぶん、そうだと思います。

最後までご覧いただき、ありがとうございました。