Ubuntu 14.04 i386でVisual Studio Codeをcpptools機能拡張とともに使う
Dockerのコンテナとして、Ubuntu 14.04の32ビット版にVisual Studio Codeを入れ、さらに機能拡張のC/C++ (ms-vscode.cpptools) を使おうとしています!
32ビット版のためか、機能拡張の実行に失敗するので、エラーメッセージを参照して、以下のパッケージを追加でインストールしました。
- libc6-amd64
- lib64gcc1
64ビット版を使おう、ってことですかね。 💦
OneDrive
OneDirveって、「ローカル・ディスクがクラウドにコピーされる」んじゃなくて、「クラウドのディスクがローカルにマウントされる」んですか?
いやいや。リモート・ディスクをマウントしているのなら、リモート・ディスクにアクセスできないときにはOneDrive中のファイルが利用できないことになるから、そんなことはないね!
でも、PowerShellのdir
コマンドで見ると、
Mode LastWriteTime Length Name ---- ------------- ------ ---- dar--l 2018/04/19 14:28 OneDrive
と表示され、Modeの最後の「l」はリパース・ポイント(やシンボリック・リンク)を表しているそうな。
Visual Studio CodeのExtensionをコマンドラインからインストールする
Visual Studio Codeを入れたDockerのコンテナを作ろうとしているのですが、Extensionも一緒にインストールしたいので調べた結果です。
code --install-extension extension名
コマンド一発で簡単にインストールできます。
MacBook ProのSSDを換装しました
古いMacBook Proの内蔵SSDを容量の大きなものに換装したので、手順を残しておきます。(なかなかC#の話題ができないわ…)
用意するもの
手順
macOSのインストーラーをApp Storeからダウンロードする
ダウンロードが終了するとインストーラーが起動するが、何もせずに終了する
USBドライブにインストーラーをコピーする
以下のAppleのページを参考にし、createinstallmedia
コマンドを実行します。
内蔵SSDを換装する
分解、分解💕
USBドライブから起動する
「Option」キーを押しながら電源を入れます。
新しく内蔵したSSDを初期化する
メニューからディスク・ユーティリティを起動します。
High Sierraなので、GUIDパーティション・テーブル+APFSフォーマットで。
インストーラーを起動する
インストールの途中で、環境をコピーする場合のコピー元を要求されるので、古いSSDを接続してコピー元として指定します。
後は待つだけ
空き容量が10GB程度になっていましたが、余裕ができて良かった良かった!
でも、今どきのノートパソコンは小型化されているから、分解できても換装できるようなパーツはないんだろうなぁ。
Visual Studio Codeでシンボル一覧を表示する!
C#でもRaspberry Piの話でもないのですが…。
Visual Studio Code!
最近、Visual Studio CodeをC/C++の開発環境として試してみています。良さそうだと感じていますが、難点がひとつありました。
EclipseやVisual Studio(2015や2017)にはある、表示しているソースで定義している関数や変数などのシンボルを一覧で表示し、シンボルをクリックすればその定義位置へジャンプしてくれる機能が、見当たらないんです。
不便だなと思っていましたが、誰でも使いたい機能のはずで、無いはずはないと考え、検索してみました。
…あった!
コンテキスト・メニュー内の「Go to Symbol in File...」、または CTRL
+ Shift
+ O
で表示できます!
常時表示されているわけではないのですが、常時表示されている必要もないので、これでOK!
よかった、よかった。
バックグラウンド!
じゃあ、GUIなしで!
Raspberry PiではIoT Remote Clientがどうやら使えないようなので、GUIのないバックグラウンドのプロジェクトを作ってみましょう! (Raspberry Piにディスプレイを直結すれば、もちろん映ります)
Microsoftのサイトに手順が載っていますので、それにしたがって進めます!
テンプレートのインストール!
まず、Windows IoTでのバックグラウンド・アプリのテンプレートがあるので、Visual Studioにインストールします。
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を扱うためのパッケージを追加する必要があります。以下の過去記事を参考にしてください!
バックグラウンド・アプリの実行!
プロジェクトを配置すると、Device PortalのApps Managerで表示される一覧に、App Typeが「Background」のアプリとして表示されます。例によって「Actions」ドロップダウンリストから「Start」を選んでアプリを実行できます!
Device Portalで見ていると、Statusがしばらく「Running」になっていますが、そのうち「Stopped」に戻る様子がわかります。