うさ☆うさ日記 このページをアンテナに追加 RSSフィード

2006 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 05 | 06 |
2013 | 05 | 08 | 09 | 10 | 11 | 12 |
2014 | 08 |
2015 | 04 | 06 | 08 | 09 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 |

2016-05-10

[]SensorTagをNode.jsで扱う(私家版)

SensorTagをNode.jsで扱うサンプルについて、見かけるサンプルの多くが複数のSensorTagを想定していなかったり、SensorTagのON/OFFをしたさいの再接続に対応していなかったので、対応した版を書いてみました。

IoTごっことかをする場合、アプリは常駐したままでSensorTagのON/OFFをするだろうし、複数のSensorTagを扱えないと実用的ではないと思うので(´・ω・`)


とりあえずソース。

var SensorTag = require('sensortag');

var discovering = false;

// センサー設定
function setupSensor(sensorTag) {
  sensorTag.discoverServicesAndCharacteristics(function() {
    // 温度
    sensorTag.enableIrTemperature(function() {});
    sensorTag.on('irTemperatureChange', function(objectTemperature, ambientTemperature) {
      var data = {};
      data.timestamp = new Date().getTime();
      data.uuid = sensorTag.uuid;
      data.messsage = 'temperature';
      data.objectTemperature = objectTemperature.toFixed(1);
      data.ambientTemperature = ambientTemperature.toFixed(1);

      console.log(JSON.stringify(data));
    });
    sensorTag.notifyIrTemperature(function() {})

    // 湿度
    sensorTag.enableHumidity(function() {});
    sensorTag.on('humidityChange', function(temperature, humidity) {
      var data = {};
      data.timestamp = new Date().getTime();
      data.uuid = sensorTag.uuid;
      data.messsage = 'humidity';
      data.temperature = temperature.toFixed(1);
      data.humidity = humidity.toFixed(1);

      console.log(JSON.stringify(data));
    });
    sensorTag.notifyHumidity(function() {})
  });
};

// センサー探索
function discoverSensor() {
  // discoverの重複実行はしない
  if (discovering) {
    return;
  }
  discovering = true;

  console.log('start discover:');

  // 探索開始
  SensorTag.discover(function(sensorTag) {
    discovering = false;

    console.log('discovered: ' + sensorTag.uuid + ', type = ' + sensorTag.type);

    // 接続開始
    sensorTag.connect(function() {
      console.log('connected: ' + sensorTag.uuid);

      sensorTag.once('disconnect', function() {
        console.log('disconnected: ' + sensorTag.uuid);

        // 探索再開
        discoverSensor();
      });

      setupSensor(sensorTag);

      // 探索再開
      discoverSensor();
    });
  });
};

// 開始
setInterval(function() {
  discoverSensor();
}, 10000);

discoverSensor();

ポイントはSensorTag.discover()の実行タイミングくらい(・ω・)?

通知周りについては、SensorTagを検知したらセンサーを有効にして後はSensorTagに任せるモデルなので、バッファリングや外部への通信については後はconsole.log(JSON.stringify(data))のタイミングで弄るようにしてくださいな。

2016-04-19

[]Xamarin.FormsでUIXAMLで構築する勢には現状XAML Conditional Compilationが必須(・ω・)

Visual StudioXAMLを書く際に、Bindingの補完の為にデザインタイム用のDataContextを設定しますよね、こんな風に(・ω・)

f:id:machi_pon:20160419175630p:image

しかし、Xamarin.FormsではこのXAMLコンパイルして実行すると、XamlParseException 「No Property of name Ignorable found」という例外が発生してしまいます(´・ω・`)

かといって、補完を捨てるわけにはいかないのでどうするか?

XAML Conditional Compilationを使って解決しましょう。


手順としては、まずはNuGetでXAMLを使っているXamarin.Formsのプロジェクトに下記を追加。

https://www.nuget.org/packages/xcc


次に、.csprojを生で開いて、以下のようにXccRemoveIgnorableContentの設定を追加。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
...
    <XccRemoveIgnorableContent>True</XccRemoveIgnorableContent>
  </PropertyGroup>
...

これで、XamlParseExceptionは発生しなくなります(`・ω・´)


なお、XamarinのBugzilla見る限りでは本家でもそのうち対応するっぽいですが、それまでの間はこの方法で。

2016-04-03

[]Windows 10 IoTNFCコントローラー(PN7120)を使う

Raspberry Piに入れたWindows 10 IoTNFCコントローラーを使ってみました(・ω・)

使ったのはこれ。


PN7120 NFC Controller SBC Kit

http://akizukidenshi.com/catalog/g/gM-10012/


Hardware Compatibility Listにものっています。

https://ms-iot.github.io/content/en-US/win10/SupportedInterfaces.htm#NFC


っで、インストール手順の詳細はpdfを参照ですが、まずは以下のドライバダウンロード


PN7120 on Windows IoT SW package

http://www.nxp.com/documents/software/SW349710.zip


解凍してacpitabl.dat、NXPPN7120.infをC:\Windows\System32にコピー。

PowerShellからEnter-PsSessionでラズパイに接続、以下のコマンドを実行して再起動すればドライバが使えるようになります。

> devcon dp_add C:\Windows\System32\NXPPN7120.inf

…ハズなんですが、どうもこのドライバが10.0.10240にしか対応しておらず、10.0.10586(現時点のもの)だと正しく動作してくれません(´・ω・`)

ちょっと調べたところ、infファイルを別途用意している例があったので、それを使ってみることにしました。

https://social.msdn.microsoft.com/Forums/ja-JP/d9b2e4df-cb64-4f50-a9e3-9fa2d83be14c/nxp-om5577-nfc-board-driver-broken-on-10586?forum=WindowsIoT


っで、infファイルの書き換え版を使用したところ、ドライバーも正しく認識。

f:id:machi_pon:20160403154457p:image


Proximity APIにより、交通系カードを使ってArrived/Departedの確認はできました(・∀・)

けど、SmartCard APIは使えないのかな(´・ω・`)

2016-02-02

[]未だにCompact Frameworkの開発とかしてるやつ

とりあえずコードの断捨離として、GitHubに旧コードをこっそり置いてあったりします(・ω・)

https://github.com/usausa/Smart-Net-CE

概要

  • ぎょーむアプリを作る際に使用するCompact Frameworkの機能を補うためのものです
  • SDF(Smart Device Framework)とかを使っているのであればいらないかもしれません
  • もともと、SDFの一部前身がMSDNの記事にあったりしたころから、それを参考に作った機能もあるので
  • CE用Smart.Navigationの最新版も含まれています(この版、あまり気に入っていないけど)
  • 実は完全版ではありません、以下の機能は気が向いたらFixして追加するかもしれません
  • HT開発にありがちな固定長ファイル操作、一覧表示用Control、通信系機能は、実装が複数あったり不完全な箇所があったりするので除外しています
  • Reactive、Functionalな機能も、同様の理由で除外しています、好き嫌いもあるし

まあ、気が向いたら手を入れるかも(´・ω・`)

2016-01-29

[]WPFでWindowStyle="None" ResizeMode="NoResize"なWindowを作るとドロップシャドウがつかなくなる件について

WPF小ネタ。


っで、この件に関するお手軽な対策としては、Border.EffectにDropShadowEffectを使用してWindowの縁部分のドロップシャドウを描画すること。

このためには、Window自体は透明にして、内部のGridに背景色を設定します。


処理を抜粋するとこんな感じ。

<Window x:Class="Example.WpfApplication.Views.HogeWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OperationWindow"
        AllowsTransparency="True" WindowStyle="None" ResizeMode="NoResize" BorderThickness="3">
    <Border>
        <Border.Effect>
            <DropShadowEffect BlurRadius="5" Color="Black" Opacity="0.8" ShadowDepth="0.5" />
        </Border.Effect>
        <Grid Background="White">
...
        </Grid>
    </Border>
</Window>

っで、サンプルソースを以下においておきます。

https://github.com/usausa/Example-Net-WPF-BorderlessWindow


このサンプルでは、MainWindowのタイトルバーにある[Operation]、[Result]ボタンを押すと、それぞれDropShadowEffectのついたWindowStyle="None" ResizeMode="NoResize"な子Windowが表示されます。

f:id:machi_pon:20160129113534p:image

2016-01-11

[]InspectCode(ReSharper Command Line Tools)をJenkinsで使う

あまりInspectCodeの話を見ないので書いておきます(・ω・)

入手先は以下。

https://www.jetbrains.com/resharper/features/command-line.html

これはなんぞ?

ReSharperコマンドラインで実行できるツールです。

実行結果をファイルに保存し、その内容をJenkinsで表示したり出来ます。

単体での使い方

以下のように実行すると、results.xmlに実行結果が保存されます。

InspectCode.exe Example.sln /o=results.xml /no-swea

オプションの詳細は下記あたりを参照してください。

https://confluence.jetbrains.com/display/NETCOM/Introducing+InspectCode

Jenkinsでの使い方

警告の表示にはWarnings Pluginを使用します。

設定としては、まず[ビルド]から[Windowsバッチコマンドの実行]でIncpectCode.exeの実行を行います。

次に、[ビルド後の処理]で[コンパイラの警告の集計]を追加し、[ワークスペースのファイルをスキャンする]で[集計するファイル]にInspectCodeの出力ファイルを設定、[パーサー]には「Resharper InspectCode」を選択します。

f:id:machi_pon:20160111164455p:image

っで、ビルド実行がされると、IncpectCodeの結果も集計されるようになります。

f:id:machi_pon:20160111164456p:image

.NETアプリの静的チェックについては、StyleCop.Analyzersによるコードスタイルのチェック、コード分析によるチェックに加え、InspectCodeによるチェックが基本三点セットというところでしょうか(・ω・)?

2015-12-18

[]ウエッブ屋さんなんかにはまったく関係ないけどエッスアイヤーではまだお金も貰えたりもする情報処理技術者試験、ST取ってコンプ(・ω・)?

正直、もうモチベーションも糞もなかったんですが(´・ω・`)ITストラテジスト合格して、コンプしたので一応、完結編パピコ。

まあ、正確に言うと自分が持っているのはSCではなく昔のSVなんですが、会社からお金が貰えないという意味では同じもの扱いしておきます。


っで、過去編インデックスは以下。

中身がある日記はSAのくらいですが。

ST自体について?

とりあえず、普段コードよりもパワポを書いている人の方が受かりやすいんじゃないでしょうか(・ω・)?、つって。


あと、どうせなのでついでにこれも。

わい、ベンダーの試験ってこれしか受験したことない(・ω・;)

2015-11-13

[]Windows.Devices.SmartCards名前空間のクラスとPaSoRiFeliCaカードを使う(`・ω・´)

Windows 10上で動くUWPアプリからWindows.Devices.SmartCards名前空間のクラスを用いて、PaSoRiFeliCaカードを使う方法について。

使うPaSoRiはこれ。

SONY 非接触ICカードリーダー/ライター PaSoRi(パソリ) USB対応 RC-S380

SONY 非接触ICカードリーダー/ライター PaSoRi(パソリ) USB対応 RC-S380

っで、リーダーに送信するコマンドの構築を容易にするために、下記を利用するのでソースをダウンロードしておきます。

NFC Smart Card Reader PC/SC Library


上記の準備ができたら、Visual Studio 2015でUWPのプロジェクトを作成。

PC/SC Libraryのソースについては、とりあえずPcScSdkフォルダのソースを自分のプロジェクトに追加しちゃいましょうか。

また、プロジェクトから「Package.appxmanifest」を開き、[機能]の[共有ユーザー証明書]をチェックしておきます。


っで、ここまでできればPaSoRiFeliCaカードを使う準備は完了、後は以下のようなコードでOKだよもん。

using Windows.Devices.Enumeration;
using Windows.Devices.SmartCards;
using Windows.Networking.Proximity;

using Felica;

private async void Polling()
{
    // Reader検索
    var selector = SmartCardReader.GetDeviceSelector(SmartCardReaderKind.Any);
    var devices = await DeviceInformation.FindAllAsync(selector);
    var device = devices.FirstOrDefault();
    if (device == null)
    {
        return;
    }

    var reader = await SmartCardReader.FromIdAsync(device.Id);
    if (reader == null)
    {
        return;
    }

    // カード検索
    var cards = await reader.FindAllCardsAsync();
    var card = cards.FirstOrDefault();
    if (card == null)
    {
        return;
    }

    // 接続してポーリングコマンド送信
    using (var con = await card.ConnectAsync())
    {
        var handler = new AccessHandler(con);

        var result = await handler.TransparentExchangeAsync(new byte[] { 6, 0, 0xff, 0xff, 0, 3 });
    }
}

送ってるコマンドは特に説明しないので知らない人はFeliCaの資料でも見てくんろ。

っで、ポーリングが成功すれば、resultには18byte(サイズ 1byte + コマンド 1byte + IDm 8byte + PMm 8byte)の応答が返ってきます。


楽ちんぽ(・∀・)


なお、UWPアプリじゃなくてデスクトップアプリでも、TargetPlatformVersionを設定してWindows.winmdとSystem.Runtime.WindowsRuntime.dllを参照すればWindows.Devices.SmartCardsの使用は可能で、その場合は「Package.appxmanifest」の部分の作業は不要です。

2015-11-12

[]Windows 10 IoTRaspberry Pi 2でUSB温度センサーを使…えなかった件(´・ω・`)

失敗談メモ。

やろうとしたことはタイトルどおり。


使おうと思った温度センサーは、非Windows 10 IoTRaspberry Piではよく使われているこれ。

USB温度計! USB thermometer-528018

USB温度計! USB thermometer-528018

っで、UWPなプログラムを作り、以下のような処理でHIDとして値を取得しようとしてみたですよ(・ω・)

var selector = HidDevice.GetDeviceSelector(0x01, 0x06, 0x0C45, 0x7401);
var deviceInformations = await DeviceInformation.FindAllAsync(selector);
var di = deviceInformations.FirstOrDefault();
if (deviceInformation != null)
{
    var hidDevice = await HidDevice.FromIdAsync(deviceInformation.Id, FileAccessMode.ReadWrite);
    if (hidDevice != null)
    {
        ...

deviceInformationは取得できる(Name=TEMPerV1.4)ものの、hidDeviceが取得できずにnullになる。

あっ、manifestファイルにDeviceCapability書くの忘れてた( ゚д゚)、っということで以下のようなエントリを追加してみて。

<DeviceCapability Name="humaninterfacedevice">
  <Device Id="vidpid:0C45 7401">
    <Function Type="usage:0001 0006"/>
  </Device>
</DeviceCapability>

っで、Visual Studio上でデバッグ実行をしようとしたところ、「エラー: DEP0700 : アプリケーション登録に失敗しました。The Appx package's manifest is invalid.: Cannot register package .... because of a problem with Function element usage:0001 0006: Value is blocked, and not allowed on this bus (0x80073cf6)」なるエラーが発生(´・ω・`)

ん?、と思って調べてみたところ、これに引っかかっているのかしら。

https://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#limitations_of_the_hid_api


Usage Id : HID_USAGE_GENERIC_KEYBOARD(0x06)はブロックされているということで、KeaboardなHIDデバイスとして認識される温度センサーを扱えなかったのでした(´・ω・`)

2015-09-06

[]WPFでもDIしたいよね(・∀・)

わい氏、コンテナ無しではアプリケーションの構築もできないひ弱な現代っ子なわけですが(´・ω・`)

っというわけで、Webアプリなんかだけでなく、WPFアプリケーションでもコンテナを使ってアプリケーションをくみ上げる方法についておきます。

方式

WPFで依存性解決というと、SericeLocatorを作ってXAML上に定義してみたいな方法もありますが。

自分のやりかたはViewの生成もコンテナにやらせて、ViewへのViewModelのインジェクション以下、ApplicationModelやそれらが使用するサービスインターフェース(実装)なんかもコンテナに依存関係を自動的に解決させるやりかたです。

ソース

とりあえずソースは以下のExample01にあります。

https://github.com/usausa/Example-Net-WPF

色々と余計な点も含んでいるソースですが(´д`;)、毎度おなじみのNinjectを使用して依存性解決をしている例になります。

どんなサンプル?

依存性解決に関する部分はちょこっとだけなので、先にサンプルの内容を説明しておきます。

  • Example.WpfApplicationはMainWindowとOptionWindowの2つの画面を持ちます
  • (WPF以外でも共通的に使用されるという想定の)別プロジェクトExample.CoreにあるLongProcessWorkerを使用します
  • LongProcessWorkerは、なんか長時間かかる処理をバックグラウンドでやってくれるものであり、進捗と完了をイベントベースで使用者に通知します
  • MainWindowには、LongProcessWorkerの開始/キャンセル機能と、動作状況のログ表示機能があります
  • OptionWindowはLongProcessWorkerのパラメータを設定するツールウインドウです
  • OptionWindowはMainWindowのタイトルバーにあるボタンで表示の切り替えができます

つまらんサンプルですな(´・ω・`)

依存性解決の使用箇所

このサンプルでは、以下の箇所で依存性解決を使用しています

  • Windowへの各ViewModelの注入
  • ViewModelへのLongProcessWorker及び設定を表すOptionSettingsの注入
  • OptionWindowの表示を制御するためのIWindowManager実装のViewModelへの注入

WPFアプリケーションでNinjectを使う

っで、ここからが本題。

新規に作ったWPFアプリケーションでコンテナを使用するようにするステップはほんのわずかです。

ここではサンプルのソースを例に、コンテナを使用するための手順を書いていきます。

MainWindowの生成/表示をコンテナベースにする

まず、App.xamlでのStartupUriによる画面の表示をやめます。

サンプルでは以下のようにStartupUriを使用しなくなっています。

<Application x:Class="Example.WpfApplication.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             ShutdownMode="OnMainWindowClose">
...

なお、ShutdownModeをOnMainWindowCloseにしているのは、このサンプルではMainWindowの他にOptionWindowがあるためです。

コンテナの準備と画面の生成/表示

次に、StartupUriをなくしたかわりに、AppクラスのOnStartupをoverrideしてコンテナによるMainWindowの生成とその表示を行うわけですが、先にAppクラスの内容を載せてしまいましょうか(・ω・)

namespace Example.WpfApplication
{
    using System;
    using System.Windows;

    using Example.Models;
    using Example.WpfApplication.Infrastructure;
    using Example.WpfApplication.Models;
    using Example.WpfApplication.Views;

    using Ninject;

    public sealed partial class App : IDisposable
    {
        private readonly StandardKernel kernel = new StandardKernel();

        public void Dispose()
        {
            kernel.Dispose();
        }

        protected override void OnStartup(StartupEventArgs e)
        {
            RegisterComponents();

            MainWindow = kernel.Get<MainWindow>();
            MainWindow.Show();
        }

        private void RegisterComponents()
        {
            // Infrastructure
            kernel.Bind<IDependencyResolver>().To<NinjectDependencyResolver>().InSingletonScope();

            // Core domain model
            kernel.Bind<LongProcessWorker>().ToSelf().InSingletonScope(); // Singleton

            // Application model
            kernel.Bind<OptionSettings>().ToConstant(new OptionSettings(5, 10));    // Configured object

            // View & ViewModel
            kernel.Bind<OptionViewModel>().ToSelf();
            kernel.Bind<OptionWindow>().ToSelf();

            kernel.Bind<MainViewModel>().ToSelf();
            kernel.Bind<MainWindow>().ToSelf();

            // View service
            kernel.Bind<IWindowManager>().To<WindowManager>().InSingletonScope();
        }
    }
}

っで、説明ですが、まずはコンテナの定義からはじめましょうか。


メンバ変数のStandardKernel kernelがNinjectのコンテナで、RegisterComponents()メソッドではコンテナに各種コンポーネント登録しています。

RegisterComponents()ですが、まず、わかりやすいところから行くと、ViewとVideModelのコンテナへの登録があります。

次に、LongProcessWorkerとOptionSettingsについてですが、これらはSingletonとして設定したり、(事前に設定済みの)固定のインスタンス登録することで、参照される複数のViewModelに同一のインスタンスを注入するようにしています。


最後に、RegisterComponents()の最初と最後のIDependencyResolver/NinjectDependencyResolver及びIWindowManager/WindowManagerについてですが、これは別ウインドウを表示管理するWindowManagerについて、その実装への依存とNinject自体への依存を抽象化するための仕掛けです。

ViewModelはIWindowManager経由で別Windowの表示を制御しますが、インターフェースと実装を分離することでその実装を知る必要はなくなっています。

また、WindowManager内ではコンテナ経由でWindowを生成しますが、そこをNijectに依存しないようにしているのがIDependencyResolverです。


ある程度規模の大きなアプリケーションであれば、コンテナの管理やRegisterComponents()を専用のBootstrapクラスなどに分離したりもしますが、ここではAppクラスで全てを行っています。

依存性を注入されるクラスの実装

っで、コンテナの登録については以上ですが、次は依存性を注入される各クラスについてです。

依存性の注入はNinjectのコンストラクタインジェクションで行っているので、ViewおよびViewModelクラスのコンストラクタは次のような感じになります。

public partial class MainWindow
{
    public MainWindow(MainViewModel vm)
    {
        DataContext = vm;
        InitializeComponent();
    }
}
public class MainViewModel : DisposableViewModelBase
{
...
    public MainViewModel(LongProcessWorker worker, OptionSettings optionSettings, IWindowManager windowManager)
    {
...

これで、MainWindowがコンテナで生成される際にはMainViewModelのインスタンスが作成され、それがコンストラクタ引数でわかってくることになります。

また、生成されるMainViewModelのコンストラクタには同様にコンテナから各種インスタンスがわたってきますが、これらはInSingletonScope()やToConstant()で登録しているものなので、単一のインスタンスが他画面などと共有されることになります。


なお、このサンプルではやっていませんが、同様にコンポーネント登録することで、View-ViewModel-ApplicationModel-ExternalInterfaceといった階層構造について、そのライフサイクル管理と依存性の注入をコンテナに任せることが可能になります。


楽ちんぽ(・∀・)