Arduino M0 Pro + さくら IoTモジュールでのテスト

普通にさくらが公開している「SakuraIOArduino」ライブラリで、サクッと動くと想定していたが、Arduino M0 Pro (ATSAMD21G18A : SAMD)とAVRとの差なのか、プログラムが起動できなくてハマった。。。

#include <SakuraIO.h>

// Adruino M0 Pro では、後から生成しないとプログラムが起動できない。
//SakuraIO_I2C sakuraio;
SakuraIO_I2C* sakuraio;

と、変更したら後は普通にポインタ参照でいけば問題はなくなった。

あと、さくら IoTモジュールは3.9V動作なので、Arduinoとの間にはレベル変換を入れること。

以下、修正したサンプルコード。

#include <SakuraIO.h>

// Adruino M0 Pro では、後から生成しないとプログラムが起動できない。
SakuraIO_I2C* sakuraio;

// ループした回数
uint8_t LoopCounter = 0;

//
// 設定
//
void setup()
{
  Serial.begin(9600);

  sakuraio = new SakuraIO_I2C();
}

//
// ループ
//
void loop()
{
  // 接続ステータスを確認する
  unsigned char status = sakuraio->getConnectionStatus();
  if ((status & 0x80) != 0x80)
  {
    // 未接続のステータス値を表示して終了
    Serial.print("Not connected. status value=");
    Serial.print(status, HEX);
    Serial.print("\n");
    delay(1000);
    return;
  }

  LoopCounter++;

  Serial.println("");
  Serial.println(LoopCounter);

  uint8_t request[33] = {};
  uint8_t response[33] = {};

  // エコーバック テスト
  request[0] = LoopCounter;
  sakuraio->echoback(1, request, response);
  Serial.print(request[0]);
  Serial.print(" -> ");
  Serial.println(response[0]);

  // 現在時刻の取得 (Unix Time)
  uint32_t unixtime = (uint32_t)(sakuraio->getUnixtime() / 1000UL);
  Serial.print("Unixtime ");
  Serial.println(unixtime);

  // 製品IDの取得
  uint16_t pid = sakuraio->getProductID();
  Serial.print("PID ");
  Serial.println(pid);

  // 製品個体IDの取得
  sakuraio->getUniqueID((char *)response);
  Serial.print("UID ");
  Serial.println((char *)response);

  // ファームウェア バージョンの取得
  sakuraio->getFirmwareVersion((char *)response);
  Serial.print("Ver ");
  Serial.println((char *)response);

  // 接続状態の取得
  uint8_t connectionStatus = sakuraio->getConnectionStatus();
  Serial.print("Status ");
  Serial.println(connectionStatus);

  // 電界強度の取得
  uint8_t signalQuality = sakuraio->getSignalQuality();
  Serial.print("Quality ");
  Serial.println(signalQuality);

  // 送信キューへの追加
  uint8_t ret;
  ret = sakuraio->enqueueTx((uint8_t)0, (int32_t)LoopCounter);
  Serial.print("Enqueue ");
  Serial.println(ret);

  // 送信キュー状態取得
  uint8_t avail;            // 追加可能なデータの個数
  uint8_t queued;           // キューイングされているデータの個数
  sakuraio->getTxQueueLength(&avail, &queued);
  Serial.print("Tx Available=");
  Serial.print(avail);
  Serial.print(" Queued=");
  Serial.println(queued);

  if (queued >= 30)
  {
    // 送信キュークリア
    ret = sakuraio->clearTx();
    Serial.print("Clear ");
    Serial.println(ret);
  }
  else if (queued >= 5)
  {
    // 送信キュー送信
    ret = sakuraio->send();
    Serial.print("Send ");
    Serial.println(ret);
  }

  // 受信キュー済み件数取得
  sakuraio->getRxQueueLength(&avail, &queued);
  Serial.print("Rx Available=");
  Serial.print(avail);
  Serial.print(" Queued=");
  Serial.println(queued);

  // 受信キューにたまっている情報を取り出して表示
  for (uint8_t i = 0; i < queued; i++)
  {
    uint8_t channel;
    uint8_t type;
    uint8_t values[8];
    int64_t offset;

    // 受信キュー取得
    ret = sakuraio->dequeueRx(&channel, &type, values, &offset);
    Serial.print("Dequeue ");
    Serial.print(ret);
    if (ret == 0x01)
    {
      Serial.print(" ch="); Serial.print(channel);
      Serial.print(" type="); Serial.print((char)type);
      Serial.print(" values=[");
      for (uint8_t b = 0; b < 7; b++)
      {
        Serial.print(values[b]);
        Serial.print(" ");
      }
      Serial.print(values[7]);
      Serial.print("] offset="); Serial.println((int32_t)offset);
    }
    else
    {
      Serial.println(" ERROR");
    }
  }

  delay(5000);
}

シリアルに

出力される結果は以下のような感じ(UIDは消しています)。

6
6 -> 6
Unixtime 1526108513
PID 2
UID xxxxxxxxxx
Ver v1.2.1-170425-cd8cace
Status 128
Quality 3
Enqueue 1
Tx Available=28 Queued=4
Rx Available=32 Queued=0

7
7 -> 7
Unixtime 1526108518
PID 2
UID xxxxxxxxxx
Ver v1.2.1-170425-cd8cace
Status 128
Quality 3
Enqueue 1
Tx Available=27 Queued=5
Send 1
Rx Available=32 Queued=0

8
8 -> 8
Unixtime 1526108523
PID 2
UID xxxxxxxxxx
Ver v1.2.1-170425-cd8cace
Status 128
Quality 3
Enqueue 1
Tx Available=31 Queued=1
Rx Available=32 Queued=0

Raspberry Pi – .Net (Mono) + BCM2835Managed + I2C + LPS331AP(気圧センサ)

Raspberry Pi (Raspbian)に LPS331AP を繋いで、I2Cで気圧を読んでみます。

BCM2835Managed は、C#からダイレクトに使用できる非常にありがたいライブラリです。

以下のような方法で、LPS331APとやりとりをしています。
ソースコードは、Githubのここに置いています。

// LPS331AP - Address=0x5c
using(BCM2835Basic bcm2835 = new BCM2835Basic())
using(PiI2C piI2c = new PiI2C(10000, 0x5c))
{
    // 1Hzの出力レートで動作を開始する
    piI2c.SetRegister8(0x20, 0x90);

    while (true)
    {
        // データが有効になるのを待つ
        while ((piI2c.GetRegister8(0x27) & 0x03) != 0x03)
            System.Threading.Thread.Sleep(100);

        // 気圧データを読み取る (24Bit)
        UInt32 byte0 = piI2c.GetRegister8(0x28);
        UInt32 byte1 = piI2c.GetRegister8(0x29);
        UInt32 byte2 = piI2c.GetRegister8(0x2A);

        // 読み取った値をhPa値に変換する
        Int32 result24 = (Int32)((byte2 << 16) | (byte1 << 8) | byte0);
        Double hPa = (Double)result24 / 4096.0;

        // 温度データを読み取る (16Bit)
        byte0 = piI2c.GetRegister8(0x2B);
        byte1 = piI2c.GetRegister8(0x2C);

        // 読み取った値を℃に変換する
        Int16 result16 = (Int16)((byte1 << 8) | byte0);
        Double temp = 42.5 + (Double)result16 / 480;

        // 測定値を表示する
        Console.WriteLine(String.Format("Pressure = {0:##.0} hPa, Temperature = {1:#.0} °C", hPa, temp));

        // 500msec待つ
        System.Threading.Thread.Sleep(500);
    }
}

実行結果は、次のようになります。

Pressure = 1007.3 hPa, Temperature = 23.9 °C
Pressure = 1007.4 hPa, Temperature = 24.0 °C
Pressure = 1007.2 hPa, Temperature = 23.9 °C
Pressure = 1007.2 hPa, Temperature = 23.9 °C
Pressure = 1007.2 hPa, Temperature = 23.9 °C
Pressure = 1007.2 hPa, Temperature = 23.9 °C

 

 

 

 

Raspberry Pi – UPS Pico RTCを使う

Raspberry Pi にはRTCが載っていないので、電源が落ちると時刻も狂います。

常時ネットワークに接続されていれば良いのですが、自分の利用想定の環境では、常時ネットワークに繋ぐことは出来ないので、外付けのRTCを使用します。

UPS Picoには、RTCも載っているので都合が良いです。
※ UPS Picoのフォーラムを見ると評判がよろしくないようで。。。手元にあったから使うけど、次回は使うか悩むところです。

手持ちのUPS Picoは HW1.1 と古いものです。なので、マニュアル通りに設定しても動きませんでした。

散々トライしながら調べてみて、UPS PIco on LibreELEC [RTC and i2c issue] にたどり着きました。

そこに書かれていた通り(ちょっと違うか。。。)に設定してみてOKでした。

/boot/config.txt に次の内容を追記。

# i2c
dtparam=i2c_arm=on
dtparam=i2c1_baudrate=10000

# RTC
dtoverlay=i2c-rtc,ds1307

/etc/modules に次の内容を追加。

i2c-bcm2708
i2c-dev
rtc-ds1307

あとはリブートすれば使用できるようになります (0x68がUUに変わって嬉しかった〜)。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- UU 69 6a 6b -- -- -- -- 
70: -- -- -- -- -- -- -- --
$ sudo hwclock -r
2018-05-04 23:38:22.130391+0900
# python pico_status.py 
 
        pico status V1.0
***********************************
  UPS PIco Firmware: 5c
  Powering Mode: ERR
  BAT Volatge: 2.49 V
  RPi Voltage: 5.21 V
  SOT23 Temperature: 28 C
  TO-92 Temperature: 00 C
  A/D1 Voltage: 0.0 V
  A/D2 Voltage: 0.0 V
***********************************

 

 

 

Raspberry Pi – UPS Pico ファームウェアの更新ができない

Raspberry Pi は、通常だとSDメモリから起動します。この場合、RaspbianでもWindows 10 IoT Coreでも「書き込み禁止」の状態を作成できないと、不意のシャットダウン時にSDの中身が壊れてブートできなくなります。

そのため「書き込み禁止」状態を作るわけですが、SDの中身が壊れないにしても処理途中のデータは消えてしまいます。

なので、Raspberry Pi にも搭載可能なUPSが販売されています。

私の手元にあったのは、放置していた「UPS Pico」と言う商品で、購入してから長い間放置していたものです。

そこで Raspberry Pi に乗せて使用しようと思ったのですが、「UPS Pico」のファームウェアのアップデートでハマりました。。。 orz

原因は、UPS PicoのマニュアルがRaspberry Pi 2 当時のままで、Raspberry Pi 3 が考慮されていなかった事です。キチンと考えればわかった事なのですが、ここ(Configuring The GPIO Serial Port On Raspbian Jessie and Stretch Including Pi 3)を見て理解できました。

要は、UPS Pico用に提供されているファームウェア アップデート用 Pythonを動かすには、「Bluetoothを外す」必要がありました。これは、Raspberry Pi 3でBluetoothが生きていると「serial0 -> /dev/ttyAMA0」ではな「serial1 -> /dev/ttyAMA0」になってしまうためです。
これさえ解決できれば、マニュアル通りにファームウェアのアップデートを行うことができました。

無駄な時間を使ってしまった。。。

Raspberry Pi + Raspbian + PiCamera + ffmpeg + .Net (Mono C#) 環境の作成手順 (備忘録)

Raspberry Piで作成した環境のまとめ。

目的は「Pi-Camera」「USB カメラ(UVC)」「Mono C#」「Visual Studio」を使用した環境を準備すること。

【基本設定】

1. RASPBIAN STRETCH WITH DESKTOPのダウンロード

・公式のこのページからZipをダウンロード

2. SDにイメージを書き込む

参考にさせていただいた記事
RaspberryPi OS書き込み後のSDカードをMacでフォーマットする方法
Raspberry PiのRaspbianイメージをMacでSDカードにコピーする手順

3. Raspberry Piにマウスとキーボドを接続

4. Raspberry PiにSDを入れて起動

5. Raspberry Pi Configuration -> Systemで以下の項目を設定

・Password, Hostname

6. Raspberry Pi Configuration -> Interfaceで以下の項目をEnableに設定

・Camera, SSH, SPI, I2C, 1-Wire

7. Raspberry Pi Configuration -> Localisationで全項目を設定

8. SSHで接続できることを確認

【パッケージのアップデート】

UPDATING AND UPGRADING RASPBIAN

パッケージ リストの更新と最新バージョンへのアップグレード

sudo apt-get update
sudo apt-get dist-upgrade

再起動

sudo shutdown -r now

バージョン確認

sudo uname -a

【AnyDeskのインストール】

アカウント不要で何処からでも接続できるのでAnyDeskを選択。
インストールはRaspberry Pi上で行う。

・ダウンロードとインストール https://anydesk.com/platforms/raspberry-pi
・セキュリティ設定で、Allow alwaysを選択し、パスワードを設定

AnyDeskが接続できることを確認

【FTP(vsftpd)をインストール】

簡単にファイルのやり取りをしたいのでFTPをインストール。

インストール

sudo apt-get install vsftpd

有効化

sudo systemctl enable vsftpd

無効化

sudo systemctl disable vsftpd

再起動

sudo systemctl restart vsftpd

ファイル作成を有効にする

sudo vi /etc/vsftpd.conf

「write_enable=YES」を有効にし、vsftpdを再起動する。

参考にさせていただいた記事
vsftpdでRaspberryPiへのファイル転送を楽にする

【x264, ALSA, FFmpegのインストール】

開発パッケージ類をインストールする。

sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-mixer-dev
sudo apt-get install -y libfontconfig1-dev libfribidi-dev

x264のコンパイルとインストールを行う。

cd ~/Downloads
git clone git://git.videolan.org/x264.git
cd x264
./configure --enable-static --enable-shared
make
sudo make install
sudo ldconfig

ALSAライブラリの準備

ALSA(Advanced Linux Sound Architecture)

cd ~/Downloads
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.6.tar.bz2
tar xjvf alsa-lib-1.1.6.tar.bz2
cd alsa-lib-1.1.6
./configure --prefix=/home/pi/Downloads/ffmpeg
make
make install

FFmpegのコンパイルとインストール

cd ~/Downloads
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
cd ~/Downloads/ffmpeg
git tag -l
git checkout refs/tags/n3.4.2

./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-mmal --enable-omx-rpi --enable-omx --enable-libfreetype --enable-libfontconfig --enable-libfribidi --extra-cflags="-I/home/pi/Downloads/ffmpeg/include" --extra-ldflags="-L/home/pi/Downloads/ffmpeg/lib" --extra-libs=-ldl
make -j4
sudo make install

参考にさせていただいた記事
ラズベリーパイ3(ffmpegで自在にカメラ録画編)

【カメラのテスト】

PiCameraをビデオデバイスとして認識させる (/dev/video0)

sudo modprobe bcm2835-v4l2
ls /dev/video*

PiCameraをテストする。

ffmpeg -f video4linux2 -input_format h264 -video_size 1920x1080 -framerate 30 -i /dev/video0 -vcodec copy -t 10 test.ts

UVCカメラをテストする。

ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video1 -t 10 testUVC.mpg

カメラの情報を取得する

v4l2-ctl -d /dev/video1 --list-formats-ext

【Monoのインストール】

MonoプロジェクトのRaspberry Pi用をインストールする。

Monoリポジトリをシステムに追加する。

sudo apt install apt-transport-https dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/debian stable-raspbianstretch main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update

Monoをインストールする。

sudo apt install mono-devel

【Monoの確認】

Mono BasicsのConsole Hello Worldで試す。

BCM2835Managed を利用したコードを試す。

プロセスの呼び出しは、以下のコードで確認。

String filePath = "/home/pi/camera/snap.jpg";
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = "raspistill";
processStartInfo.Arguments = String.Format("-o {0}", filePath);

processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = false;

processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;

Process process = Process.Start(processStartInfo);
process.WaitForExit();

【Visual Studioでの確認】

Visual Studio 2017 for Mac + Xamarin.IoT (Alpha) を使用すると、簡単にプログラムを実行/デバッグできることは確認できたが、Visual Studio 2017 Windows版では、Xamarin.IoT (Alpha)をうまく利用できず、VSMonoDebuggerMonoRemoteDebugger の利用を検討中。

一気にやったら疲れた。。。orz

 

2018/05/09

Windows版では、VSMonoDebuggerを使用することにしたが、BCM2835へのフルアクセスの状態でデバッグを行いたかったので、Githubのここからソースコードをダウンロードして、以下の1箇所を修正してVisual Studio 2017にインストールしなおした。

/SSH/SSHDebugger.cs

var monoDebugCommand = $"mono --debugger-agent=address= 
 ↓
var monoDebugCommand = $"sudo mono --debugger-agent=address=

monoデバッグ起動時にsudoを付けただけ。。。

Raspberry Pi – Raspbianで色々とC# (暫定)

※ ここにサンプルコードは書いていないので、コードを探している方は別なサイトを見てください。

Raspberry PiWindows IoT Coreを入れれば、簡単にC#でプログラムの開発ができる。

ただ、Windowsの方向性として、Broadcom BCM2835 SoCの全てがサポートされるわけじゃない。 一番キツイのが、BCM2835のH.264エンコーダがサポートされないこと。
そのため、カクカクした動画の保存(UVCを利用)と再生はできるが、30fpsのようなスムーズな動画保存と再生はできない。 加えて、Raspberry Pi用の多くのライブラリやアプリなどが Raspbian向けてして提供されていること。そのため、一から自分で作りこむにはWindows IoT Coreは悪くはないが、サクッと何かをやらせる(一般的なこと)には向かない。

でもWindows IoT Coreは、SPI/I2Cと言ったインターフェースを利用するには楽だし、GUIの作成やデバッグは当然ながら楽だ。全てがFrameworkとして提供されているので簡単に使用することができるし、加えて標準で統合書き込みフィルタ(Unified Write Filter-UWF)が使えるので「電源ブチ切り」でもほぼ大丈夫と、かなり大きなメリットがある。
RaspbianにもRead-Onlyという状態を作成できるが、色々と制限が多くて自分向きじゃない。

ここまでグダグダと書いてきたが、目的はC#を使ってデバッグ環境も整った状態で Raspberry Pi を使えないかと言うこと。
自分として利用したいのは「H.264エンコーダ, SPI/I2C/UART/TCP Socket, GUI、USB Suspend, FFMPEG, FTDI-FTD2XX, XML, AESEncrypt, GZip…」などなど。
周辺チップとのI/Oから、Web Serviceへのアクセスと暗号化まで、全部をやりたい。 なので、次の方法をやってみる。

(1) OSにはRaspbianを使用

・世界中の人々が様々なアプリをリリースしてくれているし、サクッと導入できるのが良い。
・使っている人が多いと言うことは、バグフィックスも早め (これは、仕事仲間からのお言葉)。

(2) 言語はC#を使用

・自分が慣れてるから。CもC++もめんどい。

(3) Visual Studioとの連携

Xamarin.IoTを使用
・当然、Mono.Net Core 2も使用

(4) SPI/I2Cのインターフェース

BCM 2835 as used in Raspberry Piを使用
http://www.airspayce.com/mikem/bcm2835/index.html
BCM2835 Managedを使用
https://github.com/gusmanb/BCM2835Managed

※ キチンとライセンスを考慮すること。

で、現時点で試して見た結果。

PiCameraを使用し、FFMPEGをH.264ハードウェア エンコーダで使用して動画を保存(録画中も画像は見える)。Full HD FPS30でも大丈夫。
・ついでに動画をYoutube Liveにストリーミング。Full HDだと、10〜20秒ぐらいのタイムラグが出る。
Motionを使用してイベントにて静止画を保存。WEB経由で設定できるので楽。
・無線LANをアクセスポイント化して、有線LANからインターネットに出る(iPhoneとWindows 10で確認)。
・AnyDeskを入れる。Raspberry Piにローカルしか割り当てられていなくても、外部から接続できる(アカウント不要)。
・Visual Studio + Xamarin.IoT + BCM 2835 + BCM2835 Managedを使用して、C#で簡単なGPIOの動作を確認。
・Visual Studioで簡単にデバッグできることを確認。普通にデバッグできる。
・C#からのプロセスを起動・Killなどができることを確認。

あと何日かの空いている時間に、SPI/I2C/XML/AESEncrypt/GZip(Stream利用)ができることを確認する予定。 自分の作ったC#のライブラリが動くと、SQLアクセスを含めて楽なんだけどな〜 試して見ないと!

家紋 丸に隅立て四つ目/丸に角立て四つ目

訳あって、家紋をIllustratorで作成しました。

丸に隅立て四つ目/丸に角立て四つ目 が必要な方はご自由にお使いください。
Zipファイルには、Illustrator/PDF/PNG/SVGのファイルが含まれています。

丸に隅立て四つ目/丸に角立て四つ目

Zipはここからダウンロードしてください。

メモ:DISM実行時のエラー

Windows 10 のスタート メニューの回復をしていた時、以下のエラーが発生していました。
いままで放置しても作業への影響はなかったので、そのままにしていました。

C:\WINDOWS\system32>dism /online /cleanup-image /restorehealth

展開イメージのサービスと管理ツール
バージョン: 10.0.10586.0

イメージのバージョン: 10.0.10586.0

[==========================100.0%==========================]

エラー: 0x800f081f

ソース ファイルが見つかりませんでした。
機能の復元に必要なファイルの場所を指定するには、”Source” オプションを使用してく ださい。ソースの場所の指定の詳細については、http://go.microsoft.com/fwlink/?LinkId=243077 を参照してください。

DISM ログ ファイルは C:\WINDOWS\Logs\DISM\dism.log にあります。

で、スタート メニューの回復がなかなかできなかったので、コレが原因かもと思って対策しました。

参考にしたのは、Microsoftコミュニティの以下のスレッドです。

【Windows 10】DISMツールのエラー:0x800F081F について
http://answers.microsoft.com/ja-jp/windows/forum/windows_10-performance/windows/c4f96e0b-05c8-4381-83de-bf38b1352da5

Chyonboさんの回答がバッチリとあてはまりました。ありがとうございます!

私の環境だと、Windows 10のISOイメージをダウンロード&マウントした後、以下のコマンドを実行してOKでした。

DISM /Online /Cleanup-Image /RestoreHealth /source:WIM:G:\Sources\Install.wim:1 /LimitAccess
※ 朱書き部分は、ISOをマウントしたドライブレターです。

回復した後のdismの結果は以下の通りです。

C:\WINDOWS\system32>dism /online /cleanup-image /restorehealth

展開イメージのサービスと管理ツール
バージョン: 10.0.10586.0

イメージのバージョン: 10.0.10586.0

[==========================100.0%==========================]
復元操作は正常に完了しました。
操作は正常に完了しました。

C:\WINDOWS\system32>sfc /scannow

システム スキャンを開始しています。これにはしばらく時間がかかります。

システム スキャンの検証フェーズを開始しています。
検証 100% が完了しました。

Windows リソース保護は、整合性違反を検出しませんでした。

C:\WINDOWS\system32>

これで、もう変なエラーに悩まされることは無くなるといいな。。。

Windows 10 スタートメニューが動作していません + Windows Updateがコケてる

ここ数日、持病?の「[スタート]メニューが動作していません。次回のサインイン時に修正を試みます。」が頻発。
いい加減、このエラーに付き合うのも面倒になってきたので、根本的に治そうと考えた(結果は失敗)。

memo

Microsoftのコミュニティにも記載のあったコマンドを試してみたけど、根本的に「Windows Update」が正しく完了していなかったので、

保留中のシステムの修復があり、完了するには再起動が必要です。Windows を再起動して sfc を再度実行してください。

の表示に悩まされていた。
※ Windows Updateを繰り返す状態だった。

で、「C:\Windows\winsxs\pending.xml」を削除すれば良いと言う事は分かったのだが、手順の中に「Windows起動DVDから起動」と書いてあったが、DVDが手元にないので面倒だから、「pending.xml」へのアクセス権を追加して削除しようと考えた。

でも、権限を追加する事は出来たものの、バックグランドで「pending.xml」を握っている奴がいて「アクセスが拒否されました」になる。
なので、逆にWindows Update系の握っている奴の権限を剥奪する事にした。

「TrustedInstaller」の権限を剥奪!

すると、当たり前だが「pending.xml」をサクッと削除できた。

PCを再起動して「sfc /scannow」を実行しても「保留中・・・」のメッセージが出なくなって先に進むようになった。。

これでやっと、本来の目的だった「[スタート]メニューが動作していません。」への対策を開始。以下、実行したコマンドのメモ。

dism /online /cleanup-image /restorehealth
sfc /scannow
powershell
(Powershellの中でのコマンド)
Get-AppXPackage -AllUsers |Where-Object {$_.InstallLocation -like “*SystemApps*”} | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}

これでメニューは復活!となりたかったがダメだった。。。orz
とりあずWindows Updateの問題は修復できたので、良かったとするしかない。。。もうしばらく、「[スタート]メニューが動作していません。」に付き合うしかない。。。

追伸
上記のコマンドをコマンドファイルにまとめておくと便利。PC再起動->ログイン->コマンドのショートカットをクリックでコマンド実行後には、スタートメニューが使えるようになります。ただし、元々のメニューが正しく回復できるかは、運しだいです。

2016/06/04 追記

スタート メニューが回復しました!
明確な理由は不明なようですが「DropBoxを削除すると治るかも。。。」と言う噂話?を信じて実行してみたところ、あっさりとスタートメニューが回復しました。PCの再起動を行っても、普通にスタートメニューを表示できるようになりました。
ただ、ガッツリとDropBoxを使用しているので、再同期に時間がかかっています。。。明日の朝まで待てば、終わってるかな~ もしかして、DropBoxを入れてる限り病気が再発するようだと困るな。。。

参考にしたサイト

[Microsoftコミュニティ]
スタート メニューが動作しない。 「重大なエラー [スタート] メニューが動作していません。」と表示される。
http://answers.microsoft.com/ja-jp/windows/forum/windows_10-start/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88/cbc9bb2d-a302-441d-917b-44dac4311dd3

[Microsoftコミュニティ]
Windows10でアップデートが終了しない場合のコマンドライン操作の可否について
http://answers.microsoft.com/ja-jp/windows/forum/windows_10-update/windows10%E3%81%A7%E3%82%A2%E3%83%83%E3%83%97/562364cb-b6a6-4648-b36e-dc8740e0d0a9

 

香港 → 札幌 DHLの記録

AliExpressで物を買った時のメモ。
年に1回くらいしか使わないので、何日かかって手元に届いたのかを忘れてしまうので。。。

 

検索結果

運送状: **********

 受領確認: ******

月曜日, 4月 25, 2016 at 00:50発送都市/国:HONG KONG – KWAI CHUNG – HONG KONG受取都市/国:TOKYO – SAPPORO – JAPAN 1 個

 

月曜日, 4月 25, 2016 取り扱いセンター 時間
14 配達完了: ****** SAPPORO 00:50
日曜日, 4月 24, 2016 取り扱いセンター 時間
13 配達業者への荷物引渡し準備完了 TOKYO – JAPAN 14:00
12 DHL施設から出発 TOKYO – JAPAN TOKYO – JAPAN 13:52 1 個
11 DHL施設にて搬送処理中 TOKYO – JAPAN TOKYO – JAPAN 13:52 1 個
土曜日, 4月 23, 2016 取り扱いセンター 時間
10 通関許可 TOKYO – JAPAN TOKYO – JAPAN 17:27 1 個
9 TOKYO – JAPAN 16:37
8 通関手続きの準備中 TOKYO – JAPAN TOKYO – JAPAN 10:25 1 個
7 通関手続き中 TOKYO – JAPAN 10:25 1 個
6 DHL施設へ到着 TOKYO – JAPAN TOKYO – JAPAN 10:10 1 個
5 転送中 NARITA – JAPAN NARITA – JAPAN 09:04 1 個
4 DHL施設から出発 HONG KONG – HONG KONG HONG KONG – HONG KONG 04:11 1 個
3 DHL施設にて搬送処理中 HONG KONG – HONG KONG HONG KONG – HONG KONG 03:53 1 個
金曜日, 4月 22, 2016 取り扱いセンター 時間
2 DHL施設へ到着 HONG KONG – HONG KONG HONG KONG – HONG KONG 20:21 1 個
1 荷物集荷 HONG KONG – HONG KONG 14:59 1 個