からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

OneDrive for Bussiness にカスタム リストを作成する

Power Apps や Power Automate を個人で利用するときに、データ ソースとして最も簡単なのは Excel ファイルですが、Excel ファイルは委任の問題があったり、別でファイルを開いているときに Power Apps で Excel ファイルを開けなくてエラーになったりと、少し扱いが難しいことがあります。できれば SharePoint のカスタム リストを使ったほうがいいでしょう。
その場合、カスタム リストをどこのサイトに作るかというのが問題になります。新しくサイトを作ってもいいのですが、そのアプリのためだけに新しいサイトを作るのももったいない気がしますし、個人で利用することが前提であるならば、個人の範囲で完結させたいものです。そこで、OneDrive for Bussiness にカスタム リストを作ることができるのではないかと考えてみました。OneDrive for Bussiness は SharePoint の個人用サイトがベースになっていますので、それ自体が SharePoint サイトです。カスタム リストはクラシック UI の OneDrive for Bussiness か PowerShell などを使って CUI で作成することができます。

ということで、さっそく、昔作ったパスワード マネージャーのデータ ソースをカスタム リストに変更してみました。Excel のときは更新日時を Patch で Power Apps から設定していたのですが、SharePoint は自動で更新日時を更新してくれるので便利でした。

blog.karamem0.jp

SharePoint Framework でプレゼンス情報を一覧表示する Web パーツを作ってみた

前回の記事で Microsoft Graph でプレゼンス情報が取得できるという紹介をしましたが、さっそく SharePoint Framework で Web パーツを作ってみました。

blog.karamem0.jp

サンプル コードはこちら。

github.com

実行してみるとこんな感じになります。定期的に API を呼び出しているので、画面を更新しなくとも、ほぼリアルタイムな状態が表示されます。

グループの ID を指定してそのグループのメンバーのプレゼンス情報を一覧表示するようになっています。Teams タブとして埋め込めば、チームのメンバーのプレゼンス情報が表示されるので、なかなか便利になるかもしれません。

Microsoft Graph のプレゼンス情報 API が Public Preview になりました

元ネタはこちら。

developer.microsoft.com

これまでプレゼンス情報を取得するには、Skype for Bussiness の Unified Communications Web API (UCWA) というものを使わなければならなかったのですが、今回のアップデートにより、より簡単にプレゼンス情報を取得できるようになりました。もちろん Teams のプレゼンス情報にも対応しています。

試しに Graph Explorer を使って API を実行してみます。アクセス許可に「Presence.Read」および「Presence.Read.All」が増えているので許可するのを忘れずに。

POST https://graph.microsoft.com/beta/communications/getPresencesByUserId
Content-Type: application/json

{
    "ids": ["4b34f1e2-0c77-4fbd-a8cf-94a4606021ee"]
}

と実行すると以下のような結果が返ってきます。

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#Collection(presence)",
    "value": [
        {
            "@odata.type": "#microsoft.graph.presence",
            "availability": "Offline",
            "activity": "Offline",
            "id": "4b34f1e2-0c77-4fbd-a8cf-94a4606021ee"
        }
    ]
}

オンラインになっているときはステータスが変わります。

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#Collection(presence)",
    "value": [
        {
            "@odata.type": "#microsoft.graph.presence",
            "availability": "Available",
            "activity": "Available",
            "id": "4b34f1e2-0c77-4fbd-a8cf-94a4606021ee"
        }
    ]
}

getPresencesByUserId は ID を複数指定できるので、プレゼンス情報を一覧表示するみたいなこともとても簡単にできるようになります。これは便利そうですね!

PowerShell モジュールで変数をエクスポートするときの挙動について

この記事は PowerShell Advent Calendar 2019 に参加しています。

qiita.com

PowerShell モジュールで変数をエクスポートするときの挙動について、ちょっとハマりどころがあったので、整理してみたいと思います。

スクリプトで Export-ModuleMember を呼び出さない場合

まずは Export-ModuleMember を呼び出さない場合を見てみます。「HelloWorld.psm1」という名前でファイルを作成し、各スコープごとに変数を宣言します。

$private:HelloWorldPrivate = 'HelloWorld'
$local:HelloWorldLocal = 'HelloWorld'
$script:HelloWorldScript = 'HelloWorld'
$global:HelloWorldGlobal = 'HelloWorld'

このモジュールを読み込んだときに使用できる変数は以下のようになります。

PS C:\> Import-Module .\HelloWorld.psm1
PS C:\> Get-ChildItem variable: | where Name -like 'HelloWorld*'

Name                           Value
----                           -----
HelloWorldGlobal               HelloWorld

global スコープで宣言した変数以外は使用できないことがわかります。

スクリプトで Export-ModuleMember を呼び出す場合

先ほどの「HelloWorld.psm1」を少しいじって Export-ModuleMember を追加します。

$private:HelloWorldPrivate = 'HelloWorld'
$local:HelloWorldLocal = 'HelloWorld'
$script:HelloWorldScript = 'HelloWorld'
$global:HelloWorldGlobal = 'HelloWorld'

Export-ModuleMember -Variable '*'

同じようにモジュールを読み込みます。

PS C:\> Import-Module .\HelloWorld.psm1
PS C:\> Get-ChildItem variable: | where Name -like 'HelloWorld*'

Name                           Value
----                           -----
HelloWorldGlobal               HelloWorld
HelloWorldLocal                HelloWorld
HelloWorldPrivate              HelloWorld
HelloWorldScript               HelloWorld

すべてのスコープについて変数がエクスポートされていることがわかります。

マニフェストで VariablesToExport を指定しない場合

スクリプト ファイル (.psm1) を直接モジュールとして読み込むのではなく、マニフェスト ファイル (.psd1) を使うことがほとんどだと思いますので、こちらの動作もみてみます。まずは VariablesToExport を指定しない、つまり空の配列を指定した状態で試してみます。

@{
RootModule = 'HelloWorld.psm1'
ModuleVersion = '1.0'
VariablesToExport = @()
}

この状態でモジュールを読み込みます。

PS C:\> Import-Module .\HelloWorld.psd1
PS C:\> Get-ChildItem variable: | where Name -like 'HelloWorld*'

Name                           Value
----                           -----
HelloWorldGlobal               HelloWorld

Export-ModuleMember と同様に global スコープで宣言した変数のみが使用できます。

マニフェストで VariablesToExport を指定した場合

それでは VariablesToExport を指定してみます。

@{
RootModule = 'HelloWorld.psm1'
ModuleVersion = '1.0'
VariablesToExport = '*'
}

同様にモジュールを読み込みます。

PS C:\> Import-Module .\HelloWorld.psd1
PS C:\> Get-ChildItem variable: | where Name -like 'HelloWorld*'

Name                           Value
----                           -----
HelloWorldGlobal               HelloWorld

Export-ModuleMember のときとは違って、global 以外の変数がエクスポートされていません。

まとめ

一通り試してみて以下のことがわかりました。

  • Export-ModuleMember を呼び出さなくても global スコープの変数は使用できる
  • Export-ModuleMember を呼び出すとどのスコープでも変数はエクスポートされる
  • マニフェストの VariablesToExport は無視される

じゃあ VariablesToExport は何をするんだって話。バイナリ モジュールでも変数をエクスポートすることはできないので謎は深まります。いずれにしても変数をエクスポートする場合は明示的に Export-ModuleMember を呼び出しましょう。

(2019/12/18 追記)
Twitter で指摘をいただきました。

ということだそうですよ。