C#なんぞ

C#に関するあれこれ。現在は「Raspberry PiをC#でプログラミング!」しようとしています!

Ubuntu 14.04 i386でVisual Studio Codeをcpptools機能拡張とともに使う

Dockerのコンテナとして、Ubuntu 14.04の32ビット版にVisual Studio Codeを入れ、さらに機能拡張のC/C++ (ms-vscode.cpptools) を使おうとしています!

32ビット版のためか、機能拡張の実行に失敗するので、エラーメッセージを参照して、以下のパッケージを追加でインストールしました。

64ビット版を使おう、ってことですかね。 💦

OneDrive

OneDirveって、「ローカル・ディスクがクラウドにコピーされる」んじゃなくて、「クラウドのディスクがローカルにマウントされる」んですか?

いやいや。リモート・ディスクをマウントしているのなら、リモート・ディスクにアクセスできないときにはOneDrive中のファイルが利用できないことになるから、そんなことはないね!

でも、PowerShelldirコマンドで見ると、

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
dar--l       2018/04/19     14:28                OneDrive

と表示され、Modeの最後の「l」はリパース・ポイント(やシンボリック・リンク)を表しているそうな。

tech.nikkeibp.co.jp

Visual Studio CodeのExtensionをコマンドラインからインストールする

Visual Studio Codeを入れたDockerのコンテナを作ろうとしているのですが、Extensionも一緒にインストールしたいので調べた結果です。

code --install-extension extension名

コマンド一発で簡単にインストールできます。

code.visualstudio.com

MacBook ProのSSDを換装しました

古いMacBook Proの内蔵SSDを容量の大きなものに換装したので、手順を残しておきます。(なかなかC#の話題ができないわ…)

用意するもの

  • 新しいSSD
  • インストーラーを入れるUSBドライブ
  • 古いSSDをUSB接続できるようなもの(新しいSSDへのコピー元にできるように)

手順

macOSインストーラーをApp Storeからダウンロードする
ダウンロードが終了するとインストーラーが起動するが、何もせずに終了する
USBドライブにインストーラーをコピーする

以下のAppleのページを参考にし、createinstallmediaコマンドを実行します。

support.apple.com

内蔵SSDを換装する

分解、分解💕

USBドライブから起動する

「Option」キーを押しながら電源を入れます。

support.apple.com

新しく内蔵したSSDを初期化する

メニューからディスク・ユーティリティを起動します。

High Sierraなので、GUIDパーティション・テーブル+APFSフォーマットで。

インストーラーを起動する

インストールの途中で、環境をコピーする場合のコピー元を要求されるので、古いSSDを接続してコピー元として指定します。

後は待つだけ

空き容量が10GB程度になっていましたが、余裕ができて良かった良かった!

でも、今どきのノートパソコンは小型化されているから、分解できても換装できるようなパーツはないんだろうなぁ。

Visual Studio Codeでシンボル一覧を表示する!

C#でもRaspberry Piの話でもないのですが…。

Visual Studio Code!

最近、Visual Studio CodeをC/C++の開発環境として試してみています。良さそうだと感じていますが、難点がひとつありました。

EclipseVisual Studio(2015や2017)にはある、表示しているソースで定義している関数や変数などのシンボルを一覧で表示し、シンボルをクリックすればその定義位置へジャンプしてくれる機能が、見当たらないんです。

不便だなと思っていましたが、誰でも使いたい機能のはずで、無いはずはないと考え、検索してみました。

…あった!

stackoverflow.com

コンテキスト・メニュー内の「Go to Symbol in File...」、または CTRL + Shift + O で表示できます!

常時表示されているわけではないのですが、常時表示されている必要もないので、これでOK!

よかった、よかった。

記事のインデックス

記事が増えてきたので、まとめておきます。随時アップデートの予定です!

開発環境の準備

csharpwhat.hatenablog.com

csharpwhat.hatenablog.com

csharpwhat.hatenablog.com

csharpwhat.hatenablog.com

Windows 10 IoTのGUIアプリの作成

csharpwhat.hatenablog.com

csharpwhat.hatenablog.com

csharpwhat.hatenablog.com

csharpwhat.hatenablog.com

Windows 10 IoTのバックグラウンド・アプリの作成

csharpwhat.hatenablog.com

バックグラウンド!

じゃあ、GUIなしで!

Raspberry PiではIoT Remote Clientがどうやら使えないようなので、GUIのないバックグラウンドのプロジェクトを作ってみましょう! (Raspberry Piにディスプレイを直結すれば、もちろん映ります)

csharpwhat.hatenablog.com

Microsoftのサイトに手順が載っていますので、それにしたがって進めます!

docs.microsoft.com

テンプレートのインストール!

まず、Windows IoTでのバックグラウンド・アプリのテンプレートがあるので、Visual Studioにインストールします。

marketplace.visualstudio.com

Visual Studio 2017の「ツール」メニュー→「拡張機能と更新プログラム」で開く「拡張機能と更新プログラム」ダイアログで、左のリストから「オンライン」を選び、検索ボックスに「Windows IoT Core Project Templates」と入力し、検索します。

ダイアログの中央のリストに表示された「Windows IoT Core Project Templates for VS 2017」を選び、「ダウンロード」ボタンを押してダウンロードとインストールをします。

バックグラウンド・アプリの作成!

Visual Studioで新しいプロジェクトを作ります。「ファイル」メニュー→「新規作成」→「プロジェクト」で開く「新しいプロジェクト」ダイアログの左のリストの、「インストール済み」→「Visual C#」の下に「Windows IoT Core」という新しいカテゴリーが追加されていますので、これを選択します。 ダイアログの中央のリストの「Background Application (IoT)」を選択し、プロジェクトの名前や場所、ソリューションの名前を設定して、新しいプロジェクトを作ります。

すると、こんなコードが記述されたプロジェクトが出来上がります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Windows.ApplicationModel.Background;

// The Background Application template is documented at http://go.microsoft.com/fwlink/?LinkID=533884&clcid=0x409

namespace BackgroundApplication
{
    public sealed class StartupTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // 
            // TODO: Insert code to perform background work
            //
            // If you start any asynchronous methods here, prevent the task
            // from closing prematurely by using BackgroundTaskDeferral as
            // described in http://aka.ms/backgroundtaskdeferral
            //
        }
    }
}

このStartupTask.Runメソッドが、アプリの開始時に呼び出され、このメソッドが終了するとアプリも終了します。Mainメソッドみたいなものですね!

非同期!

StartupTask.Runメソッドの中で非同期に実行されるメソッドを呼び出した場合、非同期実行が終了しないうちにRunメソッドが終わってしまうとアプリ自身も終了してしまい、非同期実行は中断されてします。

そこで、テンプレートのコメントにも書いてある「Deferral」を使います。

たとえば、こんな感じ。

using Emmellsoft.IoT.Rpi.SenseHat;
using Windows.ApplicationModel.Background;
using Windows.UI;

namespace BackgroundApplication
{
    public sealed class StartupTask : IBackgroundTask
    {
        // awaitをメソッド内で使うので、Runメソッドにもasyncを付けて非同期に呼び出せるようにする
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            // Deferralを得る
            BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

            // awaitを使って非同期にGetSenseHatメソッドを実行する
            ISenseHat senseHat = await SenseHatFactory.GetSenseHat();
            // 非同期実行が終了する前に、ここで一旦Runメソッドから抜ける
            // Deferralを取り出しているので、Runメソッドから抜けてもアプリは終了しない

            // 非同期実行が終了すると、ここから実行が再開される(以後のコードは、非同期実行の後処理)
            if (senseHat != null)
            {
                senseHat.Display.Fill(Colors.Red); // Sense HATの全LEDを赤にする
                senseHat.Display.Update(); // Sense HATのLEDの状態を更新する
            }

            // ここまで来たら、アプリが終了してもよい
            // Completeメソッドを呼び出し、非同期実行が終了したことを知らせる
            deferral.Complete();
        }
    }
}

Sense HATのLEDを全て赤にするアプリです。Sense HATを扱うためのパッケージを追加する必要があります。以下の過去記事を参考にしてください!

csharpwhat.hatenablog.com

バックグラウンド・アプリの実行!

プロジェクトを配置すると、Device PortalのApps Managerで表示される一覧に、App Typeが「Background」のアプリとして表示されます。例によって「Actions」ドロップダウンリストから「Start」を選んでアプリを実行できます!

Device Portalで見ていると、Statusがしばらく「Running」になっていますが、そのうち「Stopped」に戻る様子がわかります。