2015/01/26

Windows 10 TPのバージョン判定(続)

Windows 10 TPのバージョン判定を新しいBuild 9926で試してみると、

マニフェストファイルにWindows 10のcompatibilityの記述あり。

同なし。

VerifyVersionInfoがGetVersion/GetVersionExと同じ呪縛にかかった模様。意図された動作かどうか、現状分からないが。

最後まで残るとすれば、個人的な予想ではWMIではないかと。WMIはシステム管理にも使われるので、アプリ対策の都合だけで変えにくいと思うので。

2015/01/11

Venue 8 Proと+port

OTGのUSBコネクタで充電とデータ通信が同時にできる+portの話。

1. 顛末


Venue 8 Proは充電とUSBを同時使用できないと書いた後、純正のDell Micro USB Dongle for Data and Chargingを国際発送してくれる店を探してみたが、これが見つからなかったので、結局Mobile Design Labsの+portをオーダーした。本体29ドルに送料10ドルを合わせて39ドル。

これはKickStarterで資金調達して製品化されたもので、動画でもVenue 8 Proでデモしているように、純正を除けば唯一の確実な選択肢、と思われた。


が、実はその数日前に発表されたBuffaloの「Android用充電機能付きUSBハブ」BSH4AMB03BK/Nの対応機種にVenue 8 Proが含まれているのを後になってから知り、さらにACASISのHO27の店頭販売が始まった

12月前半まではモバイルショップを回っても影も形もなかったのに、一気に状況が変わってきた。ということで、このタイミングで+portを買うこともなかったが、来たものは来たものとして使っていく所存。

2. 充電時間


+portはVenue 8 Proを念頭に置いて作られたものらしいから大丈夫だろうとは思ったものの、一応充電時間を比較してみた。
Venue 8 Pro and Plusport

接続方法は以下のとおり。
  1. +portのMicro USBコネクタにVenue 8 Proの付属ACアダプターからのMicro USBケーブルを接続
  2. +portのMicro USBケーブルをVenue 8 ProのMicro USBコネクタに接続
  3. +portのUSBコネクタにLogitecのUSB有線アダプターのLAN-GTJU3を接続
文字にするとややこしいが、実際はそうでもない。ちなみに、+portからACアダプターのケーブルを抜くと+portのUSBコネクタに差したデバイスとの接続が失われるので、+portの動作自体にACアダプターからの電源供給が必要な模様。

比較するのは以下の3ケース。
  • Case 1: 通常どおり付属ACアダプターからのケーブルをVenue 8 Proに直結。負荷として無線LANで接続した状態でYouTubeの動画を流し続ける。

  • Case 2: +portにACアダプターからのケーブルだけ接続した状態で、+portのケーブルをVenue 8 Proに接続し、充電が開始された後、+portのUSBコネクタに有線LANアダプターを接続。負荷として有線LANで接続した状態で(無線LANはオフ)同じくYouTubeの動画を流し続ける。

  • Case 3: +portにACアダプターからのケーブルと有線LANアダプターを両方接続した状態で、+portのケーブルをVenue 8 Proに接続。負荷はCase 2と同じ。
Case 1だけ無線LANだが、そこは仕方ない。Case 2は、これが+portの説明書で示された手順で、かつOTGケーブルには電源を先に接続して充電を開始させた後でデータ通信に切り替えてしまうというテクニックがあるので、それが関係あるか確かめるため。実用上はCase 3で済めば、それに越したことはない。

充電状態の記録には簡単なアプリを作った。
ただ、参照元のデータがリアルタイムに更新されない(時々思い出したようにジャンプする。これは通知領域の電源表示も同様)ことが分かったので、細かい動きは気にしないということで。

結果は以下のとおり。
10%から100%までの充電時間には一応差はある。
  • Case 1: 216分
  • Case 2: 239分
  • Case 3: 236分
が、グラフを見て明らかなとおり、有意な差はないと考えていいと思う。なお、Case 2の終盤が直線なのは値が大きくジャンプしただけで、細かく値が取れていれば他と同様のカーブになったと思う。

結論として、+portにACアダプターからのケーブルとUSBデバイスを両方接続した状態を固定して、+portのケーブルをVenue 8 Proに抜き差しするだけで問題ないと言えよう。

3. ガジェットとして


外装の成形や組み立ての精度は高くないが、機能が果たせればそこは問わない。
Plusport
Plusport
Plusport

ただし、このケーブルの固定方法はよろしくない。
Plusport

外装のチューブが固定されておらず、シールド線が剥き出し。これはそのうち断線するおそれが高いので、何らかの補強策が必要。

まあ壊れたらBuffaloの製品があると考えれば、既に気は楽。

2014/12/31

デスクトップアプリでインターネット接続を確認する

確かデスクトップアプリの.NET Frameworkにはインターネット接続状況を直接確認できるAPIが何故か存在しません。一方、WinRTにはこれがあります。

NetworkInformationクラスのConnectionProfile.GetNetworkConnectivityLevelメソッドを使うとNetworkConnectivityLevelが取得できます。この値は以下のとおりですが、
  1. None
  2. LocalAccess
  3. ConstrainedInternetAccess
  4. InternetAccess
普通のインターネット接続はInternetAccessなので、インターネット接続の有無は以下のようなメソッドで確認できます。
// using Windows.Networking.Connectivity;
 
private bool CheckInternetConnection()
{
  var profile = NetworkInformation.GetInternetConnectionProfile();
  if (profile == null)
    return false;
 
  return (profile.GetNetworkConnectivityLevel() >= NetworkConnectivityLevel.InternetAccess);
}
インターネット接続状況の変化はNetworkInformation.NetworkStatusChangedイベントで分かるので、簡単なWPFのサンプルアプリとしては以下のようになります。
using System;
using System.ComponentModel;
using System.Windows;
using Windows.Networking.Connectivity;

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();
  }

  public bool IsInternetConnected
  {
    get { return (bool)GetValue(IsInternetConnectedProperty); }
    set { SetValue(IsInternetConnectedProperty, value); }
  }
  public static readonly DependencyProperty IsInternetConnectedProperty =
    DependencyProperty.Register(
      "IsInternetConnected",
      typeof(bool),
      typeof(MainWindow),
      new PropertyMetadata(false));

  protected override void OnSourceInitialized(EventArgs e)
  {
    base.OnSourceInitialized(e);

    IsInternetConnected = CheckInternetConnection();
    NetworkInformation.NetworkStatusChanged += OnNetworkStatusChanged;
  }

  protected override void OnClosing(CancelEventArgs e)
  {
    base.OnClosing(e);

    NetworkInformation.NetworkStatusChanged -= OnNetworkStatusChanged;
  }

  private void OnNetworkStatusChanged(object sender)
  {
    this.Dispatcher.Invoke(() => IsInternetConnected = CheckInternetConnection());
  }
  
  private bool CheckInternetConnection()
  {
    var profile = NetworkInformation.GetInternetConnectionProfile();
    if (profile == null)
      return false;

    return (profile.GetNetworkConnectivityLevel() >= NetworkConnectivityLevel.InternetAccess);
  }
}
この他にもWinRTにはデスクトップアプリでも使える機能がちょこちょこあるので、Windowsストアアプリに興味がなくても知っておくと便利なことがあります。