からめもぶろぐ。

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

Application Registration Poral 終了のお知らせ

Azure AD 2.0 に対応したアプリケーションを登録するためのポータル サイトであった https://apps.dev.microsoft.com ですが、残念ながら終了となってしまうようです。

現在ログインすると以下のようなメッセージが表示されます。

We will no longer support registering and managing converged and Azure AD applications here starting May 2019. We recommend that you manage your existing applications and register new applications by using the App registrations (Preview) experience in the Azure portal.

5 月以降はサポートしなくなるので Azure ポータルのほうを使ってくださいね、とのことです。いろいろ思うことはありますが Azure ポータルに統合されるのは歓迎と思っていいでしょう。

Capreze 1.1.0 をリリースしました

Capreze 1.1.0 をリリースしました。

github.com

オフセットのサイズを指定できるようにしました。現状ほとんど意味はありません。あと内部的に不要なロジックを削除したりとか。

中身よりも AppVeyor を使って GitHub Releases に Artifacts をコピーするまでの設定が面倒くさかったです。

Capreze 1.0.0 をリリースしました

スクリーンショットを取るときに事前にウィンドウサイズを変更して取ったりするのですが、Windows 10 の場合、既存のリサイズ ツールではちょうど指定したサイズでスクリーン ショットを取ることができず、仕方がないのでツールを作りました。

github.com

Capreze (カプレーゼ) は Capture Resize の略です。名前の通り、指定したサイズでスクリーン ショットが取れるように自動的にサイズを調整してくれます。そのほかの特長としては、

  • 高 DPI に対応 (DPI に関わらずちゃんとリサイズしてくれます)
  • プリセット ボタンによる簡単リサイズ

というものがあります。

あと大事なこととして .NET Core 3 (preview3) で動作します。.NET Framework ではありません。例の .NET Core 3 の WPF です。大事なことなので 2 回書きました。
ダウンロードは GitHub からできます。本体のみのほか、自己完結型 (SCD) のパッケージもアップロードしてありますので、.NET Core 3 をインストールしていない場合はこちらをお使いください。

New-SPOSite した直後に更新操作をしようとすると失敗することがある

SharePoint Online Management Shell を使って New-SPOSite したあとに、CSOM などで何らかの更新操作 (例えばサイト グループを作ったりするなど) をしようとするとエラーになることがあります。

そもそも、SharePoint Online でのサイト コレクションの操作は時間がかかります。完全にタイミングによりなのですが、運が悪いと 30 分以上かかることもあります。SharePoint Online Management Shell では、操作が完了するまで定期的に状況をポーリングします。*1
CSOM を使う場合でも、同様のサンプル コードが掲示されています。

docs.microsoft.com

しかし実際にはこれだけでは不足していて、操作が完了したという結果が返ってきても、サイト コレクションの内部ステータスが Active になっていないことがあります。なので、New-SPOSite のあとに続けて操作を行いたい場合は、ステータスが Active になるまでさらに待つ必要があります。

$url = 'https://example.sharepoint.com/sites/site1'
$title = 'Site1'
$owner = 'admin@example.onmicrosoft.com' 
New-SPOSite -Url $url -Title $title -Owner $owner -StorageQuota 26214400 -LocaleId 1041
while ($true) {
    Start-Sleep -Seconds 5
    if ((Get-SPOSite -Identity $url).Status -eq 'Active') {
        break;
    }
}

*1:操作の完了を待たなくていい場合は -NoWait を指定することもできます

Powershell と CSOM で Geolocation 列に値を入れるときにちょっとハマったのでメモ

相変わらず PowerShell なんですけれども。

Geolocation 列に値を入れる方法については以下にまとまっています。FieldGeolocationValue を使ってねということのようです。

docs.microsoft.com

それでは実際にやってみます。

$item = New-Object Microsoft.SharePoint.Client.ListItemCreationInformation
$item = $list.AddItem($item)

$value = New-Object Microsoft.SharePoint.Client.FieldGeolocationValue
$value.Latitude = 10
$value.Longitude = 10
$item["Location"] = $value

$item.Update()
$ctx.Load($item)
$ctx.ExecuteQuery()

実行すると…?

"0" 個の引数を指定して "ExecuteQuery" を呼び出し中に例外が発生しました: "The geolocation value does not represent a geo graphical point. Either the value is not in the correct format or it is not in the valid range."
発生場所 行:1 文字:1
+ $ctx.ExecuteQuery()
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ServerException

正解はこっち。値を明示的に指定してあげる必要があります。

$item = New-Object Microsoft.SharePoint.Client.ListItemCreationInformation
$item = $list.AddItem($item)

$value = New-Object Microsoft.SharePoint.Client.FieldGeolocationValue
$value.Latitude = 10
$value.Longitude = 10
$item["Location"] = [Microsoft.SharePoint.Client.FieldGeolocationValue]$value

$item.Update()
$ctx.Load($item)
$ctx.ExecuteQuery()

ちなみに FieldLookupValue や FieldUserValue でも同じ現象が発生します。もっともこちらは ID を指定して更新できるので使わないという手もありますけど。