ATOK Sync:サーバー内部エラーで同期できなかったとき

開発ネタではなく、久々の投稿ですが、自分が困ったこととWeb上で解決策の情報が乏しかったことから載せておきます。

症状

ATOK Syncの同期が働く時刻に以下のエラーが表示される。

[ATOK Sync]
サーバー内部エラーが発生しました。
サーバーの運用状況を確認しますか?
[OK] [キャンセル]

実際にOKをクリックして運用状況を確認しても障害情報はない。
そして、1日おきに同様の表示があり、同期されない状態が続く。
ATOKメニューから修復やサインイン情報のクリアなどを試みても、何も解決しない。

切り分け・対応手順

インターネットディスクの問い合わせフォームで伝えたところ、以下のような手順を試してみてほしいと紹介があった。

  1. インターネットディスクにアクセスでき、ログインできるか。
    https://www.idisk-just.com/
    JUSTアカウントでログインできないようなら、そこが問題なのでアカウントの確認・パスワードの確認・問い合わせなどのアクションにつながる。
  2. この後の手順が初期化を伴うので、事前にATOKのバックアップを行う
    https://support.justsystems.com/qadoc?QID=058971
  3. 上記のFAQを頼りに、ATOKの初期化を実行する。
    1. バックアップツール起動
    2. 「環境を初期化する」を選択して「実行」
    3. 確認メッセージで「はい」
    4. Windows再起動を促すメッセージで「はい」
    5. Windows再起動後に少し待つと、スタートアップツールが立ち上がってくるので待つ
    6. 「次へ」で進む
    7. 「手動」を選択して「次へ」で進む
    8. 「既存の日本語入力システムと同じ操作でATOKを使用できるようにする」を選択しつつ、プロパティ一覧で赤丸がついているものが選択されている状態で「次へ」で進む
    9. 「辞書を引き継ぐ」をオフにして「次へ」で進む
    10. 「実行」で進める
    11. 設定が完了したら「閉じる」
  4. 次にATOKクラウドツールが立ち上がってくるので、指示に従って進める。
    このときにログインできないとか、エラーが起きるならまた問い合わせになる模様。
  5. 完了した後、ATOK Syncでサーバーからの情報を取り出して上書きする。
    1. 言語バーやATOKパレットのメニューから、ATOKクラウドサービスのATOK Syncオプションを選ぶ
    2. 「修復」タブの「サーバーのデータで今お使いの環境を上書きする」を選択して「修復」を実行する
      このときにエラーが起きるならまた問い合わせになる模様。

手元の環境ではこれらの手順でエラーはなくなる?

(追記)自動同期のタイミングで一度だけ目撃したが、時間帯を変えたり、現在の環境の状態を上書きするような操作をすると見なくなった?経過観察中。

世の中的にはアンインストールとか、レジストリ・フォルダー削除とか、ややこしい手順しか知られていないのかもしれません。
もし、遭遇された方は上記の話を試してみて、解決しない場合や途中でエラーが表示される場合は、インターネットディスクの問い合わせフォームから問い合わせましょう。
その場合は、試したこと、エラー情報も相手に伝わるように気をつけて書きましょう。

dynamicキーワードでCOMを使うアプリの.NET Core 3.1への移植は再考すべき

.NET Core 3.1はLTSで、3年サポートがついているバージョンということもあり、.NET 5ではなく、.NET Core 3.1を考えておられる方もいらっしゃるかもしれません。
ただ、「dynamicキーワードでCOMを使うアプリの移植」を考えておられる場合は立ち止まるべきです。

実は、.NET Core 3.1において、dynamicキーワードを使ったCOM操作はできません。
実行しようとするとRuntimeBinderExceptionが発生します。

Dynamic keyword not working against COM objects #12587
https://github.com/dotnet/runtime/issues/12587

.NET 5でこの仕組みがサポートされており、Go Liveライセンスが付与されている「.NET 5 RC1」で動くことも確認できています。
ExcelなどのOfficeオートメーションをdynamicキーワードで触っている方は、.NET 5以上を考えましょう。
※ただし、.NET 5にLTSリリースはありません。次のLTSは来年の.NET 6の予定です。

.NET Core時代のWindows Formsデザイナー

※2020/9/27時点の内容です。

.NET Framework時代のWindows FormsデザイナーはVisual Studioのプロセス(devenv.exe)内でアセンブリを読み込み、実行するタイプでした。
このため、シームレスに動くように見える反面、32bit限定となる、自分の書いたユーザーコントロールが原因でVisual Studioごと落ちるなどの問題もありました。

.NET CoreではWindows FormsデザイナーをVisual Studioの外部プロセスで実行するアウトプロセスのタイプとなっています。
実質的に1から再実装に近い仕事量であり、互換性の問題も多数発生したであろうことが予想され、開発チームの皆さんには感謝すべきところです。

https://devblogs.microsoft.com/dotnet/windows-forms-designer-for-net-core-released/

なお、2020/9/27時点、上記記事時点ではPreviewだった、16.7はすでにリリースされているので、一通りの機能が実装されたはずです。
ただ、こういった再実装が行われたということを踏まえて、不具合が出てもFeedbackして応援する気持ちで取り組みたいところです。

(ビジネスで取り組まれる方は、.NET Frameworkとのマルチターゲットプロジェクトにして切り戻しも視野に入れても良いかもしれません)

Office 32bit/64bit問題

以前から Office 64bit とそれまでの Office 32bit で VBA のマクロに互換がないことが知られています。

Office の 32 ビット バージョンと 64 ビット バージョン間の互換性

https://docs.microsoft.com/ja-jp/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office

Declare で定義している API の部分や ActiveX コントロール(ocx)が主に影響します。

このため、Office 2016 までは「明示的に選択しない限り、32bit Office がインストールされる」という仕様になっていました。
しかしながら、Office 2019 からは「64bit OSなら、明示的に選択しない限り、64bit Office がインストールされる」という動作に変更となりました。

インストール プロセスを始める前に、明示的に 32 ビット版を選択しなければ、64 ビット版の Office が自動的にインストールされます。

https://support.office.com/ja-jp/article/64-ビット版または-32-ビット版の-office-を選択する-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261#32or64Bit=新しいバージョン

この結果、マクロが動かないといった問い合わせがエンドユーザーから来る、あるいは IT 系部署・担当者に来ることになります。

規模が小さい、自分たちで Office のバージョンを制御できるケース

32bit をインストールし直してもらうようにお願いする・フォローするか、Office 2019 とサポート期間が同じ Office 2016 を当面使うように仕向ければ延命できます。

ただし、次の Office で再燃するので、計画的に 64bit/32bit 両対応を考えた方が良いでしょう。

客先対応が必要なので Office バージョンを制御できないケース

Office 2019 がどのくらいのスピードで普及するかわかりませんが、「動かない!」という問い合わせが来ることになりますので、急いで 64bit 互換対応を考えなければなりません。
(客先次第ですが、32bit のインストール手段の説明に苦労する、納得してくれないなど、難しい可能性があるため)

やっかいなのは ActiveX コントロールを使っているケースです。
64bit 版が存在しない場合がほとんどなので、その代替策を考えて設計・実装することになり、開発期間が延びがちです。

個人的には…

Excel などの VBA はあくまでメイン機能をアシストする立場だと思いますので、Win32API を駆使したり、ActiveX コントロールで画面をリッチにしたりという方面は避けた方が良いと思います。

どうしても高機能なものを開発するのであれば、マクロではなく、アドインの開発を考えるなど、よりモダンな開発環境を使った方が良さそうです。

UWP版Office(Excel)

最近の Office のプリインストール環境は UWP 版 Office(ストアアプリ)がインストールされているケースがあるようです。

UWP 版 Office は COM の公開方法が Desktop Bridge 向けの新しい仕組みが採用されています。

COM Server and OLE Document support for the Desktop Bridge
https://blogs.windows.com/buildingapps/2017/04/13/com-server-ole-document-support-desktop-bridge/

このため、レジストリから Excel.Application を探しても見つからないが、COM オブジェクトは生成できるという不思議な状態になっています。

興味のある方は上記の記事を参照しつつ、UWP 版 Office のインストール先の AppxManifest.xml を覗いてみましょう。

 

なお、今のところ、管理者権限で実行したプロセスからは Excel.Application といった ProgID から COM オブジェクトを生成できないようです。
これが仕様による制限なのか、不具合なのかは不詳です。
CLSID を直接指定すると生成できるという情報(MSDN フォーラム)もありますので、必要な方はそちらも検討してください。

 

管理者権限で Excel をオートメーションで利用されている方は以下のいずれかになります。

  • 管理者権限で実行しないで済むように運用や設計を見直す
  • UWP 版 Office をアンインストールして、従来のデスクトップ版 Office をインストールし直す

Microsoft ストア アプリ版 Office 2016 から、デスクトップ アプリ版 Office 2016 に入れ替えることはできますか。

はい。Microsoft ストア アプリ版 Office 2016 をアンインストール後、マイアカウント ページからデスクトップ アプリ版 Office 2016をインストールすることができます。

https://www.microsoft.com/ja-jp/office/setup/2016pipc/faq.aspx より)

色選択ダイアログ(ColorDialog)の作成した色の保存

わんくまさんネタです。

ColorDialog クラスでは AllowFullOpen プロパティがデフォルトの True であれば、色の作成ボタンから基本色以外を選択すること、作成することができます。

image

ただし、何も実装しなければ、この ColorDialog クラスのインスタンスがなくなった時点で作成した色は失われます。

 

保存するためにはこの ColorDialog クラスの CustomColors プロパティから色を取り出して保存しておき、次回表示時に設定してあげる必要があります。

例:XmlSerializerやBinaryFormatterを使う

何も考えずに1ファイルにこの色情報だけを保存するのであれば、XmlSerializerやBinaryFormatterを使えばそれで終わります。

XmlSerializerの例

private void LoadCustomColors(string filePath, ColorDialog targetColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Open))
    {
        var xmlSerializer = new XmlSerializer(typeof(int[]));
        targetColorDialog.CustomColors = (int[])xmlSerializer.Deserialize(stream);
    }
} private void SaveCustomColors(string filePath, ColorDialog sourceColorDialog) {
    using (var stream = new FileStream(filePath, FileMode.Create))
    {
        var xmlSerializer = new XmlSerializer(typeof(int[]));
        xmlSerializer.Serialize(stream, sourceColorDialog.CustomColors);
    }
}

BinaryFormatterの例

private void LoadCustomColors(string filePath, ColorDialog targetColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Open))
    {
        var formatter = new BinaryFormatter();
        targetColorDialog.CustomColors = (int[])formatter.Deserialize(stream);
    }
} private void SaveCustomColors(string filePath, ColorDialog sourceColorDialog)
{
    using (var stream = new FileStream(filePath, FileMode.Create))
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, sourceColorDialog.CustomColors);
    }
}

 

これらのサンプルメソッドの内、LoadCustomColors メソッドは Form の Load イベント(やコンストラクタ)、ダイアログの表示直前といったタイミングで呼び出してください。

LoadCustomColors(@"(ファイル名)", colorDialog1);

SaveCustomColors メソッドは Form の FormClosed イベントなどで呼び出してください。

SaveCustomColors(@"(ファイル名)", colorDialog1);

プロジェクトの設定(Properties.Settings)に保存したい

先の例はお手軽なものの、1ファイルに1つの情報だけを保存するのは微妙なので、もう一例紹介しておきます。

設定の構造にはデフォルトで int[] を扱える型がないので文字列で扱う例です。

あらかじめ、プロジェクトのプロパティの設定タブから ColorSettings という文字列型の設定値を「ユーザー」スコープで追加しておいてください。

image

以下は int 型配列を文字列に変えて、「,(カンマ)」区切りで連結しています。

private void LoadCustomColors(ColorDialog targetColorDialog)
{
    targetColorDialog.CustomColors =
        Properties.Settings.Default.ColorSettings.Split(new[] {','}, 16).Select(int.Parse).ToArray();
} private void SaveCustomColors(ColorDialog sourceColorDialog) {
    Properties.Settings.Default.ColorSettings = string.Join(",", sourceColorDialog.CustomColors);
    Properties.Settings.Default.Save();
}

こちらのサンプルメソッドは、LoadCustomColors メソッドを Form の Load イベントで呼び出す、SaveCustomColors メソッドを Form の FormClosed イベントで呼び出すといった想定です。

LoadCustomColors(colorDialog1);
SaveCustomColors(colorDialog1);

メソッドを分けずに、それらのイベントハンドラに直接中身を書く形でも良いでしょう。

カテゴリー: C#

Visual Studio 2017/2019で作成したいプロジェクトがない=プロジェクトを作成できない場合

以前の記事 にも挙げましたが、Visual Studio 2017/2019 はデフォルトでインストールすると「何もできない Visual Studio」となります。

新規に作ろうとしても「空のソリューション」だけとなってしまいます。

対応方法としては、この画面の左下の Visual Studio インストーラーを開くをクリックするか、スタートメニューの Visual Studio Installer を起動してください。
インストーラーで「変更」ボタンをクリックすると、ワークロードの選択画面になりますので、自分のやりたいことに応じて選択しましょう。

VB.NET や C# でデスクトップアプリケーションを作りたい方

「.NET デスクトップ開発」を選んでください。

msdn20170701_2

C++ でデスクトップアプリケーションを作りたい方

「C++によるデスクトップ開発」を選んでください。

ストアアプリ(UWP)を作りたい方

言語を問わず、UWP アプリ開発を希望する方は「ユニバーサルWIndowsプラットフォーム開発」を選んでください。

Visual Studio 2017/2019のインストール時の選択

Visual Studio 2017/2019はインストーラーがこれまでと大きく変わっています。
基本的にはやりたいことベースに選べば必要なコンポーネントがインストールされますので、きちんと目的で選びましょう。
もちろん、複数同時に選んでも良いので、可能性があるのならあらかじめチェックを入れておくのも手です。その分、ダウンロードやインストールに時間がかかったり、ディスクの領域を多く消費しますのでご注意ください。

    • .NETデスクトップ開発
      C#やVB.NETでWindowsフォームアプリケーション、コンソールアプリケーション、WPFアプリケーションなど、昔からある方法で、.NETアプリケーションを開発するケース
      多くのC#、VB.NETのWindowsアプリ開発者の方はこれにチェックを入れておいた方が良いでしょう。
      (これを選択してもC++/CLIではWindowsフォームアプリケーションの新規開発はできなくなっています。2012から非推奨になっているためです
    • C++によるデスクトップ開発
      C++を使ったWin32プロジェクト、ATLプロジェクトなどを使いたい場合はこちら。
      C++で開発される方は、個別コンポーネントで「デスクトップC++ x86 およびx64用Windows 10 SDK (10.0.15063.0)」や「Windows SDK (10.0.14393.0)」にもチェックを入れておきましょう。既知の問題を回避するためです。
      また、MFCが必要な方は個別のコンポーネントで「MFCとATLのサポート(x86とx64)」も忘れずに選択しましょう。
    • ユニバーサルWIndowsプラットフォーム開発
      C#、VB.NET、C++などでWindows 10 PC、Mobile、HoloLensなど、UWPアプリを作りたい方はこちら。

ほかにもWeb系などいろいろとありますが、私自身が詳しくないので割愛します。
もし、インストールしたけど特定のプロジェクトが見つからない、ソリューションしか作成できないといった時は、Visual Studio Installerを起動して、変更ボタンをクリックして、オプションを確認しましょう。

何も選んでいなかった場合

ソリューションしか作成できません。

image

.NETデスクトップ開発を選んだ場合

見慣れたWindowsフォームアプリケーション、コンソールアプリケーション、WPFアプリケーションが作成できます。

image

C++によるデスクトップ開発を選んだ場合

Win32コンソールアプリケーション、Win32プロジェクト。
見ての通り、MFCはワークロードを選ぶだけでは入らないので、必要な方はワークロードタブでC++によるデスクトップ開発を選んだ後に、個別コンポーネントでMFCのチェックを入れましょう。

image

ユニバーサルWIndowsプラットフォーム開発

空のアプリほか、ユニバーサルWindowsで必要なプロジェクトのみインストールされます。

image

※本稿はVisual Studio 2017 (15.2)の時点の情報です。Visual Studio 2017はインストーラーを含め、1ヶ月に1度程度のアップデートが提供されていくため、執筆時点と現在とで状況が異なる可能性があります。

VS2017/2019は異なるSKUを共存させることができる

これまでの Visual Studio は Express 以外の Community, Professional, Enterprise を共存させることはできませんでした。

Visual Studio 2017/2019 ではインストールの仕組みが変わったため、Community, Professional, Enterprise といったエディション(SKU)のインスタンスを共存させると言うこともできます。
開発環境のエディションごとの検証が必要な人は便利かもしれません。

なお、それに伴い、Visual Studio のインストール先が必要なケースでは vswhere というツールが便利です。すべてのインスタンスを列挙してくれます。

出力例

Visual Studio Locator, version 1.0.50
Copyright (C) Microsoft Corporation. All rights reserved.

instanceId: 1d4779be
installDate: 2017/03/11
installationName: VisualStudio/15.0.0-RTW+26228.4
installationPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community
installationVersion: 15.0.26228.4
displayName: Visual Studio Community 2017
description: 学生、オープン ソース、および個々の開発者のための無料で完全な機能を備えた IDE
enginePath: C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service
channelId: VisualStudio.15.Release
channelPath: C:\Users\Owner\AppData\Local\Microsoft\VisualStudio\Packages\_Channels\4CB340F5\catalog.json
channelUri: https://aka.ms/vs/15/release/channel

instanceId: 29de2085
installDate: 2017/03/12
installationName: VisualStudio/15.0.0-RTW+26228.4
installationPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
installationVersion: 15.0.26228.4
displayName: Visual Studio Enterprise 2017
description: 生産性向上と、さまざまな規模のチーム間の調整のための Microsoft DevOps ソリューション
enginePath: C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service
channelId: VisualStudio.15.Release
channelPath: C:\Users\Owner\AppData\Local\Microsoft\VisualStudio\Packages\_Channels\4CB340F5\catalog.json
channelUri: https://aka.ms/vs/15/release/channel

instanceId: 2df6de13
installDate: 2017/03/11
installationName: VisualStudio/15.0.0-RTW+26228.4
installationPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional
installationVersion: 15.0.26228.4
displayName: Visual Studio Professional 2017
description: 小規模なチーム向けのプロフェッショナルな開発者向けツールおよびサービス
enginePath: C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service
channelId: VisualStudio.15.Release
channelPath: C:\Users\Owner\AppData\Local\Microsoft\VisualStudio\Packages\_Channels\4CB340F5\catalog.json
channelUri: https://aka.ms/vs/15/release/channel

Visual Studioで「Windowsフォームアプリケーション」テンプレートが見つからない?

Visual Studio 2017 の方はインストール時の選択が問題の可能性があります。こちらをご覧ください。


MSDN フォーラムにおいて短期間に 2 件の質問があったので書いてみます。

たとえば、Visual Studio 2015 Community を Windows 10 にインストールすると、スタートメニューの上の方にある、最近追加されたものに以下のように表示されます。

image

ついつい、Visual Studio 2015 という文字に惹かれて起動してしまいそうになりますが、これは Blend といって、WPF などの画面デザインに使うアプリケーションであって、Visual Studio ではありません。
Blend は Windows フォームアプリケーションに対応していないので、プロジェクトの新規作成で表示されず、画面も似ているので混乱してしまいます。

スタートメニューをスクロールして、V のカテゴリにある Visual Studio 2015 のアイコンで起動してください。

image

(備考)Visual C++ では「Windows フォーム アプリケーション」テンプレートは廃止されています

Visual C++ の「Windows フォーム アプリケーション」のプロジェクトテンプレートは 2012 から廃止されています。現在、新規開発は非推奨になっているのでご留意ください。

https://support.microsoft.com/ja-jp/kb/3001686

これを無視して過去のバージョンのテンプレートで作ってくる、あるいは公開・配布されている第三者のテンプレートを使えば新規に作ることはできますが、将来性の懸念があること、C++ と .NET の両方の知識を十分求めるハードルの高さ、サンプルの少なさ、できあがったものは C++/CLI という独自の言語であって C++ ではないことから、この道を選ばないことを推奨します。