わんくま同盟 Blog's

わんくま同盟

メニュー

わんくま同盟

  勉強会情報

  メンバリスト

掲示板

ブログ

リンク

統計

わんくま同盟メンバ

わんくま同盟わんくま同盟

わんくま同盟メンバの最新の記事

netduinoでLEDチカチカ

ちょうどマイコンをやりたいと思っていたところ、初音さんの、.NET対応組み込みデバイス「Netduino」入門という連載が始まったので、netduinoボードを購入してみました。大枠は、初音さんの記事を読んでいただくとして、補足など…

  • 注文から1日ちょっとで届いた。
  • ボードと同時に、「普通のブレッドボード(税込257円)」と「固いジャンパワイヤ(税込257円)」も購入しておいた。
  • 取扱説明書など何も付いていない!(付属品はUSBケーブルとゴム足のみ)
  • 実行開始時に「Cannot deploy the base assembly 'mscorlib', or any of his satellite assemblies, to device - USB:Netduino twice. Assembly 'mscorlib' on the device has version 4.2.0.0, while the program is trying to deploy version 4.3.1.0」というエラーが出て実行できない。deviceのFirmwareをアップグレードすれば、そのままいけるようだが、今回は大したことをしないので、プロジェクトのプロパティで対象フレームワークを「.NET Micro Framework 4.2」に変更することで対応。
  • var が使える~。
  • ReleaseでもDebugでも動いた。もちろん、ステップ実行も可能。(マイコン用のデバッガハードウェアも不要)
  • えっとLEDのチカチカを止める方法は?…(^^;; USBコードをぶちっと抜けばいいのかな?(^^;

netduino

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace NetduinoApplication1
{
    public class Program
    {
        public static void Main()
        {
            var onOff = false;
            using (var port = new OutputPort(Pins.ONBOARD_LED, onOff))
            {
                while (true)
                {
                    port.Write(onOff);
                    onOff = !onOff;
                    Thread.Sleep(300);
                }
            }
        }
    }
}

posted @ 2015/03/28 14:07 by なか-chan@最愛のiMac

[Hardware]OLYMPUS AIR A01を入手しました

OPC Hack&Make Projectのテスターに選ばれ、製品化直前のモデルでアプリや100mpusを作らせていただいた関係で製品版を入手することができました(プロトタイプと交換)。

 

AIRって?

本体はこんな感じ。

image

プレゼントして頂いたのはレンズ付きのレンズキットなので、ここにマイクロフォーサーズレンズのM.ZUIKO DIGITAL ED 14-42mm F3.5-5.6 EZがつきます。

image

 

マイクロフォーサーズって何?といえば、Olympus Penとかにも採用されている共通規格です。

つまり、AIRはPenとかと同じレンズが使えるってことですね。

例えば、M.ZUIKO DIGITAL 17mm F2.8の単焦点レンズなんかも付きます。

image

 

ということは…AIRの画質も!

 

AIRでの撮影はまだこれからですが、プロトタイプ版にM.ZUIKO DIGITAL 17mm F2.8の単焦点レンズをつけて撮影したものがあるので、それで確認してみましょう。

P2030014

P2060033

P2090058

P2190088

 

AIRの設定手順

AIRを開封して使う場合、まずやらなくてはいけないのは手持ちのスマホへのOA.Centralアプリのダウンロードとインストールです。

app.olympus-imaging.com

AIRの電源を入れてOA.Centralを起動するとBluetoothにより接続を行い各種設定をした後に、AIR本体後部に印刷された二次元バーコードを使ってAIRをWiFiアクセスポイントとして接続するための設定をスマホ側で行います。

この初回のみに必要な作業(そして、どうしても煩雑でITに詳しくない人にとっては分かりづらく躓きやすくIT詳しい人にとっても面倒な)をアプリ画面で流れに沿って図解で説明していきます。

プロトタイプ版ではないものだったので最初分からずに少しだけ悩みましたが、逆にプロトタイプ版の経験がなければパッケージを開けたときに最初に目に飛び込んでくる付属品に「OA.Central → スマホ」って図示もあるし、その中の説明書でも最初にダウンロードしてくださいとあるので迷わないですね。

 

お勧めAIRアプリ

必須ソフトのOA.Centralでも撮影ができますがAIRの実力を発揮するには撮影用の専用アプリを使いましょう。

OA.ModeDial

app.olympus-imaging.com

まずはなんといってもOA.ModeDialですね。撮影モードもプログラム/絞り優先/シャッター優先/マニュアルと一眼レフライクです。メインの撮影アプリといえるでしょう。

このアプリもBluetoothで自分のAIRを探して見つかったらAIRの電源をオンにしてWiFi接続に移行してくれます。

 

OA.Viewer

app.olympus-imaging.com

AIRで撮影した写真はAIR本体に差し込んだMicro SDカードに記録されます。その撮影したデータをみるためのアプリがOA.Viewerです。

これも必須アプリですね。

 

OA.Genius

app.olympus-imaging.com

OA.Geniusは最初の2本と違って必須アプリではないかもしれません。でも、このアプリ面白いです。

このアプリでシャッターを1回押すと6枚の写真がとれます。

AIR側の画像処理エンジンが被写体を認識してその内容や構図を解析した結果から、オリジナルの1枚に加えて、ズームや構図やカラーバランスの異なる5枚を生成します。

最初、構図ってどうしているのかと思ったら、オリジナルを拡大してトリミングすることで実現している感じです。いろいろ試してみたいですね。

posted @ 2015/03/28 8:13 by 初音 玲

[xamarin]Human Sensing Frontier Award #01グランプリの賞品がとどきました

オムロン製品が届くという事で楽しみにしていました。ほんと、分かってらっしゃるというセレクトです。

 

NeckMassager
オムロン ネックマッサージャ ブラウン HM-141-BW

オムロン ネックマッサージャ ブラウン HM-141-BW

 

活動量計
オムロン(OMRON) 活動量計 Active Shift EDGE 【iPhoneアプリ専用】 ブラック HJA-700T-BK

オムロン(OMRON) 活動量計 Active Shift EDGE 【iPhoneアプリ専用】 ブラック HJA-700T-BK

 

肩こりというか首が辛い時があるので本当に助かります。ありがとうございます。

 

WP_20150324_001

 

WP_20150324_002

posted @ 2015/03/24 23:54 by 初音 玲

[Netduino]BuildInsiderでNetduino入門の連載始まりました

www.buildinsider.net

Arduinoピン互換で.NET Micro Frameworkに対応しているNetduinoの入門記事の連載がはじまりました。

去年くらいから温めていた企画です。ぜひ、お読みいただき感想を聞かせて頂けたら幸いです。

posted @ 2015/03/24 18:14 by 初音 玲

「前例がある」ことを恐れちゃダメ

前回、

hatsune.hatenablog.jp

というエントリをあげました。

一般的には「前例がない」は否定的な流れで使われます。

その影響なのか分かりませんが、前例調査を意識なのか無意識なのかさけてしまってはいないでしょうか。

なぜかといえば、学生さんなどのアイデアを聞く機会が最近多いのですが、前例を調査しないで先に進んでしまう、前例調査をしていないと見受けられるアイデアにある程度の頻度で出会うからです。

類似のアイデアを知ることで、自分たちのアイデアのいい点、悪い点もみえてきますし、乗り越えないといけない事柄もみえてきます。既出のものがたどりつけなかった先に価値を見出して、その先に行くことも「前例がない」ところです。何もゼロからすべてが「前例がない」からかっこいい訳じゃないので、きちんと前例を調べ、自分たちの価値観と「前例がない」部分の掛け算で進むといいじゃないかと思うのです。

前例があることを恐れる必要とかないのですから。

posted @ 2015/03/24 9:57 by 初音 玲

「前例がない」は褒め言葉

『前例がない』という理由を持ち出す、時代遅れの恥ずかしさ

「前例がない」は褒め言葉であるとある時から解釈するようになったら気持ちが軽くなった。
「前例がない」から「色々試す必要があるのでスピード感が必要ですね。」
「前例がない」から「うちの独自性が出せますね。」
「前例がない」から「世界にも通用しちゃうかも。」

前例がないはそれほどパワフルな言葉なんです。

posted @ 2015/03/24 9:28 by 初音 玲

[Codezine]Forguncy Pro + Azureの記事がCodezineに掲載されました。

codezine.jp

 

Forguncy Proの外部データベース連携を使って、Microsoft Azure SQL Databaseのデータメンテアプリを素早く構築する方法を調べてみました。

posted @ 2015/03/23 22:58 by 初音 玲

[Win10TP]Windwos 10 Technical Preview 10041にアップデート

S7SとMiix2 8をWindwos 10 Technical Preview 10041にアップデート中

10041がこないーという方は、Windows 10の[保守と管理]で[詳細オプション]にある[プレビュービルドのインストール方法を選択してください]を「高速」にするとWindwos Updateで降ってきますよ。

posted @ 2015/03/22 5:03 by 初音 玲

[xamarin]HVC-C SDK for Xamarin.Androidを公開しました。

nugetにHVC-C SDK for Xamarin.Android v1.2.2を公開しました。

 

HVC-Cとは

HVC-Cはオムロンさから発売されている顔認識センサーデバイスです。多人数のセンシングにも対応しており、クラス全体や打ち合わせ、舞台から客席の表情認識などにも使えるようなデバイスです。

HVC-C

 

公式SDK

公式SDKは、iOS版とAndroid版があります。また、ソースも公開されています。


OmronSensingEggProject/HVC-C1B_SDK-Android ・ GitHub

 

HVC-C SDK for Xamarin.Android

しかし、残念ながら現時点でWindows版やXamarin版がありませんでした。

そこで、公開されているソースからXamarin.Android版を作成してnugetに登録しました。


NuGet Gallery | OMRON HVC-C SDK for Xamarin.Android 1.2.3

 

nugetですので、Visual Studioから簡単に導入できます。

image

 

また、Githubにソースも公開しています。


hatsunea/HVC-C1B_SDK-Android ・ GitHub

 

HVC-C SDK for Xamarin.Androidを使ったサンプル

今回公開したSDKを使ったサンプルプログラムもGitHubに公開しました。


hatsunea/HVC-C1B_SimpleDemo-Android ・ GitHub

こちらのサンプルではnugetからSDKを取得していますので下記の手順で動作可能になります。

  1. ダウンロード
  2. ダウンロードしたzipのプロパティで[ブロックの解除]
  3. zipを任意のフォルダに展開
  4. Visual Studioで開く
  5. プロジェクトエクスプローラーでプロジェクトを右クリックしてnugetを開いてSDKをダウンロード

 

なお、もちろん、Visual Studio 2013 Community Editionでも動作します。

 

今後の展開

HVC-C SDK for Xamarin.Androidのソースを見て頂くとわかるように、Core部分とXamarin.Andoid依存部分を分離しています。

今後は、Xamarin.iOS依存部分、WinRT依存部分、WindowsPhone依存部分を作成して

  • HVC-C SDK for Xamarin.iOS
  • HVC-C SDK for Windows Runtime 8.x
  • HVC-C SDK for Windows Phone 8.x

を提供予定です。

もし、反響が大きければ優先順位を上げて開発しなくちゃね!

posted @ 2015/03/15 12:24 by 初音 玲

[IoTKitHol]EGIotKit.UtilityにPull Request

日本マイクロソフトが展開している「IoT Kit Hands-on Training Site」と連動した便利ユーティリティにEGIotKit.Utilityがあります。

https://github.com/ms-iotkithol-jp/Library/tree/master/EGIoTKit.Utility

 

名前の意味は「Easy IoT Kit Utility」でしょうか。

このユーティリティを使うと.NET Micro FrameworkからHTTP通信がしやすく、また、JSON文字列も作りやすくなっています。

 

Codezineの記事では、Microsoft Azure Web Sitesを使っている「Internet of Things キット ハンズオン トレーニング」の内容とはちょっと異なったアプローチをしており、Microsoft Azure Mobile Servicesを使った手法をとりましたので、このユーティリティを使わせていただきました。ありがとうございます。


IoTの計測データをWindowsストアアプリで可視化してみよう (1/3):CodeZine

 

この記事の前半は、.NET Micro Frameworkを使って温湿度を測定してクラウドにアップするための手順やプログラムコードになっています。

そして、記事の中でユーティリティを使ったときに気付いた改善点をpull requestしました。

どこかのタイミングでマージされると思いますが、もし、お急ぎの場合は、pull requestの方も見て頂けると上手く動きます。

posted @ 2015/03/15 9:49 by 初音 玲

[IoTKitHol]「Internet of Thingsキットハンズオントレーニング」と連動した情報発信を開始

日本マイクロソフトが展開している「Internet of Thingsキットハンズオントレーニング」と連動した情報発信を開始しています。

http://hatsune.hatenablog.jp/archive/category/IoTKitHol

 

目的としては以下の通り。

よろしくお願いします。

posted @ 2015/03/15 9:31 by 初音 玲

[xamarin]Human Sensing Frontier Award #01ソリューション部門グランプリを受賞しました

Human Sensing Frontier Award #01のソリューション部門で「Selfie & Coffee」が選ばれました。

http://plus-sensing.omron.co.jp/egg-project/award_top/award01/

ありがとうございます。

副賞に「追加HVC-C提供」という選択肢があるので、追加提供をお願いしてそれを前提にアプリ作ってみようかと思っています。

posted @ 2015/03/13 17:02 by 初音 玲

[EV3]OPC + LEGO MINDSTORM EV3 と 100mpusを紹介いただきました。


次々発表されるアイデアに圧倒!第3回OPC Hack & Make Gatheringを開催しました。 | オリンパス OPC Hack & Make Project

オリンパスOPCのテスターやってます、初音です。

この前、参加した第三回OPC Hack & Make Gatheringの紹介ページで2つの作品を紹介して頂きました。

1つ目はOPC + EV3であるOPC brick EV3。


OPC brick EV3初稼動 - YouTube

もう一つは、TMCNチームひゃくらすとのコラボ作品である100mpus。

http://opc.olympus-imaging.com/wp-content/uploads/2015/03/014.jpg

期末でなかなか時間が取れませんが完成に向けてアプリをブラッシュアップ中です。

posted @ 2015/03/10 15:32 by 初音 玲

[WiX]VCRedist の ExePackage を作ってみた。

さっきも書いたけど、VS2015 から、VCRuntime の配布も原則として VCRedist を使うことになる(おそらく、MFCも含めてマージモジュールでの配布の選択は無くなるだろう)。

個人的には、VCRedist の開発元が、ClickOnce 向けの setup.exe 用必須コンポーネントの情報だけではなく、ExePackage 向けの情報も出してくれると、大変ありがたかったりするのだけど。。。

ま、それはともかくとして、既存の(そして残念ながらこちらは開発元からの提供はない) VCRedist から代表的な2つをピックアップして、ExePackage を作ったので張り付けておく。

VC100(VS2010のVisualC++) SP1用

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Fragment>  
  3.  <util:ProductSearch  
  4.        Id="VCRedist100_x86"  
  5.        Variable="VCRedist100_x86"  
  6.        ProductCode="{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}"  
  7.        Result="state"/>  
  8.  <PackageGroup Id="VCRedist100_x86">  
  9.   <ExePackage  
  10.     Id="VCRedist100_x86"  
  11.     Name="redistVC100\vcredist_x86.exe"  
  12.     SourceFile="VS2010\vcredist_x86.exe"  
  13.     DetectCondition="VCRedist100_x86 &gt;= 3"  
  14.     Permanent="yes"  
  15.     PerMachine="yes"  
  16.     Cache="no"  
  17.     Vital="yes"  
  18.     Compressed="no"  
  19.     LogPathVariable="VCRedist100_x86_log"  
  20.     DisplayName="Microsoft Visual C++ 2010 x86 Redistributable - 10.0.40219"  
  21.     Protocol="netfx4"  
  22.     InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[VCRedist100_x86_log].html&quot;"  
  23.     RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[VCRedist100_x86_log].html&quot;"  
  24.     UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[VCRedist100_x86_log].html&quot;" />  
  25.  </PackageGroup>  
  26. </Fragment>  

VC120(VS2013)用 Update4 用

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Fragment>  
  3.  <util:ProductSearch  
  4.     Id="VCRedist120_x86"  
  5.     Variable="VCRedist120_x86"  
  6.     ProductCode="{13A4EE12-23EA-3371-91EE-EFB36DDFFF3E}"  
  7.     Result="state" />  
  8.  <PackageGroup Id="VCRedist120_x86">  
  9.   <ExePackage  
  10.     Id="VCRedist120_x86"  
  11.     Name="redistVC120\vcredist_x86.exe"  
  12.     SourceFile="VS2013\vcredist_x86.exe"  
  13.     DownloadUrl="http://go.microsoft.com/fwlink/?LinkID=320712"  
  14.     DetectCondition="VCRedist120_x86 &gt;= 3"  
  15.     Permanent="yes"  
  16.     PerMachine="yes"  
  17.     Cache="no"  
  18.     Vital="yes"  
  19.     Compressed="no"  
  20.     LogPathVariable="VCRedist120_x86_log"  
  21.     DisplayName="Microsoft Visual C++ 2013 Redistributable (x86) - 12.0.30501"  
  22.     Protocol="burn" />  
  23.  </PackageGroup>  
  24. </Fragment>  

あえて、コメントを入れていないのはわざとです。すべての行を分けてるのもわざとです。

質問がある場合は、msi-ml(http://www.freeml.com/msi)までどうぞ。

posted @ 2015/03/09 15:25 by とっちゃん

[VC++] Universal CRT

ネタ元:Introducing the Universal CRT

ちょっと、インパクトが大きいのでBlogにも書いておこっと。

VS2015 では、長年基本構成が同じだった C/C++ ランタイムに大幅なてこ入れが入ります(これ自体は、2014/01 の時点ですでに情報が出ています)。

この時は、msvcrXX と msvcpXX を見直して、VCRuntime, AppCRT, DesktopCRT の3部構成にするよ!CTP1 からそうなっるよ!というものでした。

CRTの構成が変わったからと言って、アプリケーションのビルドや配布自体が大きく変わるわけじゃないし、インパクトがあるといっても、直接的な影響を受けるのは、そろそろ絶滅危惧種に認定されそうな C++ アプリ配布をやらなきゃいけない Setup Author だけですからね。

彼らは本物のプロフェッショナルなので、この手の話題はいち早くキャッチアップしてるだろうし、今までだって名前が違ってたからそのままというわけにはいかなかったので作業量的にも変わらないし、影響は軽微だったから私も放置だったわけですけど(もちろん、中身の問題は別よw)。

で、今回ここをもう一度改め、AppCRT と DesktopCRT のうち、Stable(もうずっと変わっていない部分=C言語のライブラリ部分)な箇所をまとめなおして、Universal CRT って名前で統合するよ!に変わります。

ここまでなら、FBに1つになるんだってーって書いて終わりなんでしょうけど、影響が大きいのがそのあと。

Universal CRT に Stable なものに集約させるので、変更が入らないからシステムコンポーネント(Win10からプリインストール)にして、WindowsUpdate 経由で配布しますよ!

です。

どうやって配布するんだよ!という話はネタ元に載っているのでそちらを参照していただくとして。。。

超絶意訳モードでざっくりと書くと、

  • Windows10 にプリインストールされてるから、何も考えたくないなら今すぐ Windows10 にすればいいと思うよ。
  • 俺は、Vistaのあの背景がいいんだよ!という人でも、Windows Update で配布するから、家康よろしくなくまで待ってれば届くよ!
  • Windows Update なにそれ?おいしいの?俺のマシンでMACアドレス作ると重複するかもよー!って怒られるんだけど?な人には、msu があるよ!
  • システムコンポーネントだからマージモジュールはないよ!でも、それ以外のモジュールも含めて、今までと同じように VCRedist でまとめて配れるよ!
  • スタティックリンクしてるなら今までと同じでUniversalCRT部分もスタティックリンクされるよ!
  • でもね。Universal CRT は、アプリのローカルフォルダ(exeと同じ場所)への配置はサポートしてないよ。

というところですね。

実際はこんな風には書かれてませんよ。勉強会後の懇親会でしゃべってる風味にしてあるだけです。

ということで、これからは、C++アプリでもブートストラッパー必須の時代が来ます。まぁ msi 単独では msu を実行させることができないから仕方ないんですが。幸いにも先週初めから、うちも WiX Bootstrapper を使う方向で話が進んでるので、今年の段階で対応の基礎は出来上がりそうですけどねw

posted @ 2015/03/09 12:48 by とっちゃん

静岡Developers勉強会の「UnityとBlenderハンズオン第2章」の資料公開

2015/03/07(土)に、静岡Developers勉強会 UnityとBlenderハンズオンが行われる島田市地域交流センター歩歩路(ぽぽろ) 第4会議室には7名が集まりました。同じ日に島田市、静岡市、浜松市、三島市と4つ勉強会が重なってしまい2人欠けましたが、今回は県外の名古屋から1人参加してくださいました。参照:静岡でUNITYとBLENDERをやった話
前回:静岡Developers勉強会 UnityとBlenderハンズオン第1章

当日は参加者全員が、Unityのアルカノイドもどき(ブロック崩し)とBlenderのサイコロ(モデリング)を完成させることが出来たのが良かったです。

今回のUnityはブロック崩しということで物理演算を使っているのですが、やはり物理演算って面白いですね。数値を間違って入力してしまったことで、ボールがブロックに跳ね返らないで止まってしまったり、ボールがラケットにぶつかるとラケットがボールの重みで徐々に沈んでしまったりと、ミスもまた別のゲーム性を産みます。参加者ともどもミスで起こる現象に笑いながら楽しんでハンズオン出来ました。

Blenderはたかがサイコロされどサイコロですね、Macを使用している方はマウスではなくトラックパッドを使っての操作方法に苦労してました。おまけとして木目調のテーブル作成もやってもらったのですが時間切れでした。参加者の方が仰っていたけど、Blenderは一人でやっていたら絶対挫折していたが皆で協力して何とか解決出来ている。そういうところが勉強会のいいところだと思います。

家に帰宅していてツイッターを眺めていたら「UnityやUnrealを覚えないといけない脅迫観念にかられている若者へ」が流れてきました。
一部引用:「unityを勉強しないとだめかも…どうしよう…どうしよう…。」「ゲームを自分で完成させたいけど、なんかいいツールないかな、unityならできそうだ!全部ひとりゲームを完成できた!」後者ならunityを勉強する価値があります。前者が多くてしかもみんな不安になってるから心配。

まー静岡Developers勉強会としては、後者でありスマホアプリを開発する上で汎用的なツールとしてUnityとBlenderを学び、6月にはUnityの2Dでミニゲームを作成してもらって発表会をする予定です。


UnityとBlenderハンズオン第2章 from yaju88

posted @ 2015/03/09 2:06 by やじゅ

[Codezine]CodezineにFEZ Spiderで計測したデータをクラウド経由でストアアプリで表示する記事が掲載されました。


IoTの計測データをWindowsストアアプリで可視化してみよう (1/3):CodeZine

.NET Micro Frameworkを使ってセンサー値をAzure Mobile Service経由でストアアプリに表示する内容です。

記事の都合上、データアップロードもAzure Mobile Serviceを使っていますが、Event Hubを使って動作しているバージョンもあります。近々、Code Recipeで紹介したいと思います。

posted @ 2015/03/07 0:00 by 初音 玲

[AED]共通語彙基盤(IMI)プロジェクト成果説明会の資料でAED検索の取り組みを紹介頂きました

説明会開催(2015年2月4日) プログラム詳細 | 共通語彙基盤

平本さんの「共通語彙を如何に活用するか」の講演資料1の中(P.11~12)で適用事例として取り上げて頂きました。

ありがとうございます。

動画も公開されていて8分30秒くらいから12分くらいで説明されてます。


02 共通語彙基盤(IMI)プロジェクト成果説明会 ~共通語彙を如何に活用するか~ - YouTube

AEDオープンデータプラットフォームにより、ハッカソンやアプリ開発者にどのような利点がもたらされるのか分かりやすく説明されています。ぜひ、ご覧下さい。

posted @ 2015/03/05 16:46 by 初音 玲

.NETラボ勉強会セッション

2月28日、.NETラボ勉強会でセッションを担当させていただきました。

 

セッションで使ったスライドです。

グループのメンバーをすべて取得する

http://www.slideshare.net/mitchin227/all-members

 

セッションで使ったサンプルアプリケーションです。

VB版:

https://directoryvb.codeplex.com/SourceControl/latest

C#版:

https://directorycs.codeplex.com/SourceControl/latest

Visual Studio 2013(.NET 4.5.1)

※ソースコード自体は .NET 4 相当です。

ダウンロードは Download のリンクからできます。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/03/01 21:49 by mitchin(mitchin@wankuma.com)

[WindowsPhone8.1]ついに日本にもWindows Phoneの波が来た!(これは本物)

MWC 2015が開催中なのかもですが、Windows Phoneの日本投入のニュースが続いています。


2015.02.23 ニュースリリース|マウスコンピューター、Windows Phone ベースのデバイス開発契約を締結し、開発着手のお知らせ|マウスコンピューター


SIMフリースマートフォンブランドfreetel 最新のWindows Phone OS搭載モデルを 2015年夏までに国内発売 - CNET Japan


京セラ、MWC 2015に出展--ソーラーチャージやWindows Phone搭載の高耐久モデルも - CNET Japan

Windows Phoneは、8.1の段階でもWindowsストアアプリ(要はPCのWindows 8.1でのアプリ形式)とコードの互換性が高く、universal Windowsアプリというソースプロジェクト構造で作成することでロジックや(やろうと思えば画面デザインも)共有化できます。これにXbox Oneも加えて、デスクトップ、タブレット、スマホ、リビングのゲーム機と作る側はコード共通化、使う側はデータ共有化が行えます。

日本でWindows 8タブレットがはやったのが2014年ですが、本当のWindows 8の姿は日本でこそスマホが入ってないと感じ取れなかったはずです。

そんな日本の消費者の不利益をやっと解消できるのが2015年だとついにいえそうです。

なぜ、今年なんだ?という感じもしますが、日本マイクロソフトのエヴァンジェリストである高橋忍さんの努力がやっと実を結んだということでしょうし、Windows 10ではWindows 10 for Phoneのように更に統合がすすんでいくということも影響しているでしょうし、SIMロックフリーという選択肢が低価格SIMが2014年に一般化してスーパーなども参入したという実績もあるでしょうし、とにかく、日本語化は行われていたOSですがから、技適費用を払ってもキャリア以外の販売路線で元がとれる!と判断できる状況になったんでしょうね。

私の取り組んでいるAED検索もすでにWindows Phone 8.1向けに公開しています。

日本の開発者で多くの人が日本で発売していないWindows Phoneの開発技術を磨いてきていました。なので、本当に発売が開始され誰でもが買えるようになったときに、今間と違った展開がすでに用意されていると思っていいでしょう。

Windows Phone Archでも日本での発売に合わせて色々イベントを開催していきたいと思っています。

http://wp-arch.jp/

posted @ 2015/02/27 11:21 by 初音 玲

サンプルアプリの更新分をCodePlexの方に反映

グループのネストしているすべてのメンバーを表示する画面の追加に伴い、サンプルアプリの更新分を CodePlex の方に反映しました。

 

サンプルアプリ:VB版C#版(ダウンロードは Download のリンクからできます)

 

主な更新箇所は次の通りです。

クラスライブラリ:

ForeignSecurityPrincipal クラスVBC#(追加)

DirectoryAccess クラスVBC#(GetMembers メソッドを追加)

 

Windows アプリ:

AllMemberList クラスVBC#(フォームを追加)

GroupList クラスVBC#(ボタンとフォームの呼出しを追加)

 

Web アプリ:

AllMemberList クラスVBC#(フォームを追加)

GroupList クラスVBC#(ボタンとフォームの呼出しを追加)

directory.js:showAllMemberList 関数を追加

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/25 21:21 by mitchin(mitchin@wankuma.com)

グループのネストしているすべてのメンバーを表示する画面のWebアプリのコード(C#)

グループのネストしているすべてのメンバーを表示する画面の Web アプリの C# のコードです。

//イベントハンドラ

protected void Page_Load(object sender, EventArgs e)

{

  if (String.IsNullOrEmpty(Request.QueryString["name"]))

  {

    return;

  }

  if (this.IsPostBack)

  {

    return;

  }

  this.AddChildNode();  //子ノードを追加

}

 

//プライベートメソッド

//子ノードを追加

private void AddChildNode()

{

  using (var group = DomainGroup.FindByName(Request.QueryString["name"]))   //グループを検索

  {

    var node = new TreeNode(group.Name);

    this.MemberTreeView.Nodes.Add(node);

    var members = DirectoryAccess.GetMembers(group);   //グループのメンバーを取得

    foreach (var member in members)

    {

      this.AddChildNode(node, member);   //子ノードを追加

      member.Dispose();

    }

  }

}

 

//子ノードを追加

private void AddChildNode(TreeNode node, DomainObject member)

{

  var childNode = CreateNode(member);  //ノードを作成

  node.ChildNodes.Add(childNode);

  if (member.Category == CategoryType.Group)

  {

    var subMembers = DirectoryAccess.GetMembers((DomainGroup)member);   //グループのメンバーを取得

    foreach (var subMember in subMembers)

    {

      this.AddChildNode(childNode, subMember);   //子ノードを追加

      subMember.Dispose();

    }

  }

}

 

//指定したメンバーのノードを作成

private TreeNode CreateNode(DomainObject member)

{

  string displayName;    //表示するテキスト

  switch (member.Category)

  {

    case CategoryType.User:

      var user = (DomainUser)member;

      displayName = String.Format("{0}({1}{2}:{3}/{4})",

        user, user.LastName, user.FirstName, user.DisplayPath, user.Name);

      break;

    case CategoryType.Group:

      var group = (DomainGroup)member;

      displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath);

      break;

    case CategoryType.Computer:

      var pc = (Computer)member;

      string sp = null;

      if (pc.OperatingSystemServicePack != null)

      {

        sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP");

      }

      displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role);

      break;

    default:   //CategoryType.ForeignSecurityPrincipal

      displayName = String.Format("{0}({1})", member, member.Name);

      break;

  }

  return new TreeNode(displayName, member.Name);

}

 

内容的には Windows アプリと同じです。説明は VB の方に書いてますのでそちらをご覧ください。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/22 18:00 by mitchin(mitchin@wankuma.com)

グループのネストしているすべてのメンバーを表示する画面のWebアプリのコード(VB)

グループのネストしているすべてのメンバーを表示する画面の Web アプリの VB のコードです。

'イベントハンドラ

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

  If String.IsNullOrEmpty(Request.QueryString("name")) Then

    Return

  End If

  If Me.IsPostBack Then

    Return

  End If

 

  Me.AddChildNode()   '子ノードを追加

End Sub

 

'プライベートメソッド

'子ノードを追加

Private Sub AddChildNode()

  Using group = DomainGroup.FindByName(Request.QueryString("name"))   'グループを検索

    Dim node As New TreeNode(group.Name)

    Me.MemberTreeView.Nodes.Add(node)

    Dim members = DirectoryAccess.GetMembers(group)   'グループのメンバーを取得

    For Each member In members

      Me.AddChildNode(node, member)   '子ノードを追加

      member.Dispose()

    Next

  End Using

End Sub

 

'子ノードを追加

Private Sub AddChildNode(node As TreeNode, member As DomainObject)

  Dim childNode = CreateNode(member)   'ノードを作成

  node.ChildNodes.Add(childNode)

  If member.Category = CategoryType.Group Then

    Dim subMembers = DirectoryAccess.GetMembers(DirectCast(member, DomainGroup))   'グループのメンバーを取得

    For Each subMember In subMembers

      Me.AddChildNode(childNode, subMember)   '子ノードを追加

      subMember.Dispose()

    Next

  End If

End Sub

 

'指定したメンバーのノードを作成

Private Function CreateNode(member As DomainObject) As TreeNode

  Dim displayName As String   '表示するテキスト

  Select Case member.Category

    Case CategoryType.User

      Dim user = DirectCast(member, DomainUser)

      displayName = String.Format("{0}({1}{2}:{3}/{4})",

        user, user.LastName, user.FirstName, user.DisplayPath, user.Name)

    Case CategoryType.Group

      Dim group = DirectCast(member, DomainGroup)

      displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath)

    Case CategoryType.Computer

      Dim pc = DirectCast(member, Computer)

      Dim sp As String = Nothing

      If pc.OperatingSystemServicePack IsNot Nothing Then

        sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP")

      End If

      displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role)

    Case Else   'CategoryType.ForeignSecurityPrincipal

      displayName = String.Format("{0}({1})", member, member.Name)

  End Select

  Return New TreeNode(displayName, member.Name)

End Function

 

内容的には Windows アプリと同じです。

対象のグループの情報は AddChildNode メソッドでクエリ文字列から name(名前)を取得して DomainGroup.FindByName メソッドを呼び出して取得してます。

DomainGroup.FindByName メソッドはグループリスト画面の詳細表示用 FormView のデータソースになってる ObjectDataSource の SelectMethod に指定されてるメソッドです。

※実装コードはこちら

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/21 16:13 by mitchin(mitchin@wankuma.com)

グループのネストしているすべてのメンバーを表示する画面のWindowsアプリのコード(C#)

グループのネストしているすべてのメンバーを表示する画面の Windows アプリの C# のコードです。

//パブリックコンストラクター

public AllMemberList(DomainGroup group)

{

  InitializeComponent();

  this.AddChildNode(group);  //子ノードを追加

  this.MemberTreeView.ExpandAll();

}

 

//プライベートメソッド

//子ノードを追加

private void AddChildNode(DomainGroup group)

{

  var imageIndex = (int)group.Category;

  var node = new TreeNode(group.Name, imageIndex, imageIndex);

  this.MemberTreeView.Nodes.Add(node);

  var members = DirectoryAccess.GetMembers(group);   //グループのメンバーを取得

  foreach (var member in members)

  {

    this.AddChildNode(node, member);   //子ノードを追加

    member.Dispose();

  }

}

 

//子ノードを追加

private void AddChildNode(TreeNode node, DomainObject member)

{

  var childNode = CreateNode(member);  //ノードを作成

  node.Nodes.Add(childNode);

  if (member.Category == CategoryType.Group)

  {

    var subMembers = DirectoryAccess.GetMembers((DomainGroup)member);   //グループのメンバーを取得

    foreach (var subMember in subMembers)

    {

      this.AddChildNode(childNode, subMember);   //子ノードを追加

      subMember.Dispose();

    }

  }

}

 

//指定したメンバーのノードを作成

private TreeNode CreateNode(DomainObject member)

{

  string displayName;    //表示するテキスト

  var fontColor = Color.Black;

  switch (member.Category)

  {

    case CategoryType.User:

      var user = (DomainUser)member;

      displayName = String.Format("{0}({1}{2}:{3}/{4})",

        user, user.LastName, user.FirstName, user.DisplayPath, user.Name);

      fontColor = Color.Brown;

      break;

    case CategoryType.Group:

      var group = (DomainGroup)member;

      displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath);

      fontColor = Color.Blue;

      break;

    case CategoryType.Computer:

      var pc = (Computer)member;

      string sp = null;

      if (pc.OperatingSystemServicePack != null)

      {

        sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP");

      }

      displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role);

      fontColor = Color.Green;

      break;

    default:   //CategoryType.ForeignSecurityPrincipal

      displayName = String.Format("{0}({1})", member, member.Name);

      break;

  }

  var imageIndex = (int)group.Category;

  return new TreeNode(displayName, imageIndex, imageIndex) { Name = member.Name, ForeColor = fontColor };

}

 

説明は VB の方に書いてますのでそちらをご覧ください。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/19 21:15 by mitchin(mitchin@wankuma.com)

グループのネストしているすべてのメンバーを表示する画面のWindowsアプリのコード(VB)

グループのネストしているすべてのメンバーを表示する画面の Windows アプリの VB のコードです。

'パブリックコンストラクター

Public Sub New(group As DomainGroup)

  InitializeComponent()

  Me.AddChildNode(group)   '子ノードを追加

  Me.MemberTreeView.ExpandAll()

End Sub

 

'プライベートメソッド

'子ノードを追加

Private Sub AddChildNode(group As DomainGroup)

  Dim node As New TreeNode(group.Name, group.Category, group.Category)

  Me.MemberTreeView.Nodes.Add(node)

  Dim members = DirectoryAccess.GetMembers(group)   'グループのメンバーを取得

  For Each member In members

    Me.AddChildNode(node, member)   '子ノードを追加

    member.Dispose()

  Next

End Sub

 

'子ノードを追加

Private Sub AddChildNode(node As TreeNode, member As DomainObject)

  Dim childNode = CreateNode(member)   'ノードを作成

  node.Nodes.Add(childNode)

  If member.Category = CategoryType.Group Then

    Dim subMembers = DirectoryAccess.GetMembers(DirectCast(member, DomainGroup))   'グループのメンバーを取得

    For Each subMember In subMembers

      Me.AddChildNode(childNode, subMember)   '子ノードを追加

      subMember.Dispose()

    Next

  End If

End Sub

 

'指定したメンバーのノードを作成

Private Function CreateNode(member As DomainObject) As TreeNode

  Dim displayName As String   '表示するテキスト

  Dim fontColor As Color

  Select Case member.Category

    Case CategoryType.User

      Dim user = DirectCast(member, DomainUser)

      displayName = String.Format("{0}({1}{2}:{3}/{4})",

        user, user.LastName, user.FirstName, user.DisplayPath, user.Name)

      fontColor = Color.Brown

    Case CategoryType.Group

      Dim group = DirectCast(member, DomainGroup)

      displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath)

      fontColor = Color.Blue

    Case CategoryType.Computer

      Dim pc = DirectCast(member, Computer)

      Dim sp As String = Nothing

      If pc.OperatingSystemServicePack IsNot Nothing Then

        sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP")

      End If

      displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role)

      fontColor = Color.Green

    Case Else   'CategoryType.ForeignSecurityPrincipal

      displayName = String.Format("{0}({1})", member, member.Name)

  End Select

  Return New TreeNode(displayName, member.Category, member.Category) With {.Name = member.Name, .ForeColor = fontColor}

End Function

 

コンストラクターで受け取っているグループは、呼出し元のグループリスト画面で選択されたグループです。

まず、AddChildNode(DomainGroup) メソッドで TreeView に対象グループのノードを追加してます。

次に DirectoryAccess.GetMembers メソッドを呼び出してグループのメンバーを取得し、そのメンバーに対して AddChildNode(TreeNode, DomainObject) メソッドを呼び出して ノードに子ノードを追加してます。

AddChildNode(TreeNode, DomainObject) メソッドでは、CreateNode メソッドを呼び出してメンバーのノードを作成してノードに追加してます。

メンバーがグループの場合は再帰的に呼び出してメンバーのノードを追加してます。

CreateNode メソッドでは、メンバーの種類ごとに表示するテキストとフォントの色を設定してノードを作成してます。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/18 20:32 by mitchin(mitchin@wankuma.com)

[AED]AEDオープンデータプラットフォームがLODチャレンジJapan 2014で優秀賞受賞


LODチャレンジJapan2014 受賞作品発表 at LODチャレンジブログ

AEDオープンデータプラットフォームがLODチャレンジJapan 2014でアプリケーション部門優秀賞と日本マイクロソフト賞を頂きました!

様々な自治体の担当者様、データを整形して送っていただいたみなさんのご協力あってことその受賞ですし、とりくみが評価されたと同時に期待されての受賞です。

2015年はますますデータ拡充、共通語彙基盤ver2.2準拠エンドポイントの作成などを行っていきます。また、Micorosoft Azure SQL Databaseの列カラムストア化なども実施しますますの高パフォーマンスを実現していきます。

今後ともよろしくお願いします。

posted @ 2015/02/17 10:02 by 初音 玲

DirectoryAccess.GetMembers メソッド

DirectoryAccess クラスに追加した GetMembers メソッドのコードです。(これまでのコードはこちら VB C#

VB

'指定したドメイングループのメンバーを取得します。

Public Shared Function GetMembers(group As DomainGroup) As IList(Of DomainObject)

  If group Is Nothing Then

    Throw New ArgumentNullException("group", "group が Nothing です。")

  End If

  If CanConnectDomain = False Then  'ドメインに接続できない時

    Return New List(Of DomainObject)()

  End If

 

  Dim objects As New List(Of DomainObject)()

  Using root = GetRootEntry()   'ルートのDirectoryEntryを取得

    'このグループのメンバーを検索

    Dim filter = String.Format("(memberOf={0})", group.Entry.Properties.Item("distinguishedName").Value)

    Using searcher As New DirectorySearcher(root, filter)

      Using results = searcher.FindAll()

        For Each res As SearchResult In results

          objects.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), DomainObject))

        Next

      End Using

      'このグループをプライマリ グループとしているメンバーを検索

      searcher.Filter = String.Format("(&(|(objectCategory={0})(objectCategory={1}))(primaryGroupID={2}))",

        CategoryType.User, CategoryType.Computer, group.Token)

      Using results = searcher.FindAll()

        For Each res As SearchResult In results

          objects.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), DomainObject))

        Next

      End Using

    End Using

  End Using

  Return objects.OrderBy(Function(o) o.ToString()).ToList()

End Function

 

C#

//指定したドメイングループのメンバーを取得します。

public static IList<DomainObject> GetMembers(DomainGroup group)

{

  if (group == null)

  {

    throw new ArgumentNullException("group", "group が null です。");

  }

  if (CanConnectDomain == false//ドメインに接続できない時

  {

    return new List<DomainObject>();

  }

 

  var objects = new List<DomainObject>();

  using (var root = GetRootEntry())   //ルートのDirectoryEntryを取得

  {

    //このグループのメンバーを検索

    var filter = String.Format("(memberOf={0})", group.Entry.Properties["distinguishedName"].Value);

    using (var searcher = new DirectorySearcher(root, filter))

    {

      using (var results = searcher.FindAll())

      {

        foreach (SearchResult res in results)

        {

          objects.Add((DomainObject)CreateInstance(res.GetDirectoryEntry()));

        }

      }

      //このグループをプライマリ グループとしているメンバーを検索

      searcher.Filter = String.Format("(&(|(objectCategory={0})(objectCategory={1}))(primaryGroupID={2}))",

        CategoryType.User, CategoryType.Computer, group.Token);

      using (var results = searcher.FindAll())

      {

        foreach (SearchResult res in results)

        {

          objects.Add((DomainObject)CreateInstance(res.GetDirectoryEntry()));

        }

      }

    }

  }

  return objects.OrderBy(o => o.ToString()).ToList();

}

 

1 回目の検索はグループのメンバーの検索で、所属するグループがこのグループであるオブジェクトを検索してます。

プライマリ グループを除いて 所属するグループは memberOf 属性で取得できるので、この値がグループの distinguishedName 属性(識別名)の値に一致するものがあれば、メンバーはこのグループに所属していることになります。

例えば Enterprise Admins グループの distinguishedName 属性の値は次のようになってます。

 CN=Enterprise Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

また Administrator の memberOf 属性の値は次のようになってます。

 CN=Group Policy Creator Owners,CN=Users,DC=proceed,DC=pbyk,DC=com

 CN=Domain Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

 CN=Enterprise Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

 CN=Schema Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

 CN=Administrators,CN=Builtin,DC=proceed,DC=pbyk,DC=com

memberOf 属性も distinguishedName 属性も値の書式が同じなので、これを検索条件として使ってます。

 

2 回目の検索はこのグループをプライマリ グループとしているユーザーかコンピューターを検索してます。

既定では、プライマリ グループは次のようになります。

 ユーザー:Domain Users

 ドメイン コントローラー:Domain Controllers

 ドメイン コントローラー以外のコンピューター:Domain Computers

ユーザーかコンピューターの primaryGroupID 属性の値が グループの primaryGroupToken 属性の値(Token プロパティに保持)と一致すれば このグループに所属していることになります。

 

抽出されたメンバーは表示する名前でソートしてます。

 

内部で呼び出している CreateInstance メソッドを変更しました。太字部分の 1 行だけです。

VB

Private Shared Function CreateInstance(entry As DirectoryEntry) As DirectoryObject

  Dim category As CategoryType

  If [Enum].TryParse(Of CategoryType)(entry.SchemaClassName, True, category) = False Then

    Throw New ArgumentException("entry の種類が CategoryType に該当しません。", "entry")

  End If

 

  Select Case category

    Case CategoryType.User

      If CanConnectDomain Then    'ドメインに接続できる時

        Return New DomainUser(entry)

      Else    'ドメインに接続できない時

        Return New LocalUser(entry)

      End If

    Case CategoryType.Group

      If CanConnectDomain Then    'ドメインに接続できる時

        Return New DomainGroup(entry)

      Else    'ドメインに接続できない時

        Return New LocalGroup(entry)

      End If

    Case CategoryType.Computer

      Return New Computer(entry)

    Case CategoryType.PrintQueue

      Return New PrintQueue(entry)

    Case CategoryType.Volume

      Return New Volume(entry)

    Case Else

      Return New ForeignSecurityPrincipal(entry)

  End Select

End Function

 

C#

private static DirectoryObject CreateInstance(DirectoryEntry entry)

{

  CategoryType category;

  if (Enum.TryParse<CategoryType>(entry.SchemaClassName, true, out category) == false)

  {

    throw new ArgumentException("entry の種類が CategoryType に該当しません。", "entry");

  }

 

  switch (category)

  {

    case CategoryType.User:

      if (CanConnectDomain)    //ドメインに接続できる時

      {

        return new DomainUser(entry);

      }

      else    //ドメインに接続できない時

      {

        return new LocalUser(entry);

      }

    case CategoryType.Group:

      if (CanConnectDomain)    //ドメインに接続できる時

      {

        return new DomainGroup(entry);

      }

      else    //ドメインに接続できない時

      {

        return new LocalGroup(entry);

      }

    case CategoryType.Computer:

      return new Computer(entry);

    case CategoryType.PrintQueue:

      return new PrintQueue(entry);

    case CategoryType.Volume:

      return new Volume(entry);

    default:

      return new ForeignSecurityPrincipal(entry);

  }

}

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/15 14:05 by mitchin(mitchin@wankuma.com)

[NETMF]FEZ SpiderをPCから切り離して動作させるには

FEZ Spiderは.NET Micro Frameworkが動作します。

また、.NET Gadgeteerという仕組みでも対応しているため、Visual Studio上でボードやセンサーなどを表示して接続を行い、実機でも同じように接続しておけば、例えば「ボードのAポートに温度センサーがつながっているから、温度センサーの値を読むためにポートAの値を調べよう」ではなく「温度センサーの値を調べよう」というコードが記述できます。

DISP04

PC上で稼働するVisual Studioからプログラムを転送するのも、左上にあるUSB Clientを使ってPCとUSB接続を行っておけば、Visual Studioで「デバック実行」するだけで、FEZ Spiderにアプリが送られてリモートデバッグ状態で動作してくれます。

 

それでは、PCと切り離してFEZ Spider単体でプログラムを動かすにはどうしたらいいでしょうか。

答えは簡単。

PCと切り離して電源をOnにすればプログラムが起動される

です。

FEZ Spiderのプログラム格納領域は不揮発性メモリになっているので、PCと接続していたUSBを外してもプログラムが消えることがありません。USBの接続先をモバイルバッテリーやUSB給電源に接続してあげればプログラムが再起動します。

.NET Micro Frameworkをやってきた人にとっては当たり前といえば当たり前すぎるのか、情報としてきちんとのっているところがなかったので不思議に思って調べてみました。

考えてみたらなかなかすごい仕組みですよね。

posted @ 2015/02/14 15:58 by 初音 玲

ForeignSecurityPrincipal クラス

グループのネストしているすべてのメンバーを表示する画面の追加に伴いクラスライブラリ側にクラスを追加しました。

今まで扱ってきたのは ユーザー、グループ、コンピューター、OU、プリンター、共有フォルダーの 6 オブジェクトで、これらのオブジェクトを表す DirectoryEntry をラップした専用のクラスで表しています。

今回、外部のセキュリティ プリンシパルがグループのメンバーに含まれるようになるので、これを表すクラスを追加しました。

 

ForeignSecurityPrincipal クラス(System.Security.Principal 名前空間をインポートしてます)

VB

Public NotInheritable Class ForeignSecurityPrincipal

  Inherits DomainObject

 

#Region " プライベートフィールド "

  Private ReadOnly _readableName, _displayName As String

#End Region

 

#Region " フレンドコンストラクター "

  'DirectoryEntry を指定して ForeignSecurityPrincipal クラスの新しいインスタンスを初期化します。

  Friend Sub New(entry As DirectoryEntry)

    MyBase.New(entry)

 

    Dim objectSid = DirectCast(entry.Properties.Item("objectSid").Value, Byte())

    Dim sid = New SecurityIdentifier(objectSid, 0'SID

    Dim account = DirectCast(sid.Translate(GetType(NTAccount)), NTAccount'アカウントに変換

    _readableName = account.Value   'NT AUTHORITY\○○ => ToStringメソッドでも同じ

    _displayName = IO.Path.GetFileName(account.Value)   'NT AUTHORITY\○○ の ○○部分

  End Sub

#End Region

 

#Region " パブリックプロパティ "

  '表示用の名前を取得します。

  Public ReadOnly Property DisplayName As String

    Get

      Return _displayName

    End Get

  End Property

 

  '読み取り可能な名前を取得します。

  Public ReadOnly Property ReadableName As String

    Get

      Return _readableName

    End Get

  End Property

#End Region

 

#Region " パブリックメソッド "

  '表示用の名前を返します。

  Public Overrides Function ToString() As String

    Return Me.DisplayName

  End Function

#End Region

End Class

 

C#

public sealed class ForeignSecurityPrincipal : DomainObject

{

  #region プライベートフィールド

  private readonly string _readableName, _displayName;

  #endregion

 

  #region インターナルコンストラクタ

  //DirectoryEntry を指定して ForeignSecurityPrincipal クラスの新しいインスタンスを初期化します。

  internal ForeignSecurityPrincipal(DirectoryEntry entry)

    : base(entry)

  {

    var objectSid = (byte[])entry.Properties["objectSid"].Value;

    var sid = new SecurityIdentifier(objectSid, 0);   //SID

    var account = (NTAccount)sid.Translate(typeof(NTAccount));  //アカウントに変換

    _readableName = account.Value;   //NT AUTHORITY\○○ => ToStringメソッドでも同じ

    _displayName = System.IO.Path.GetFileName(account.Value);   //NT AUTHORITY\○○ の ○○部分

  }

  #endregion

 

  #region パブリックプロパティ

  //表示用の名前を取得します。

  public string DisplayName

  {

    get

    {

      return _displayName;

    }

  }

 

  //読み取り可能な名前を取得します。

  public string ReadableName

  {

    get

    {

      return _readableName;

    }

  }

  #endregion

 

  #region パブリックメソッド

  //表示用の名前を返します。

  public override string ToString()

  {

    return this.DisplayName;

  }

  #endregion

}

 

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/13 23:39 by mitchin(mitchin@wankuma.com)

[Azure]第12話

「すべてのローカル物理サーバーを発注する前に消し去りたい。すべての自社サーバールーム、データセンタの全ての自社サーバーを、この手で」
「神様でも何でもいい」
「今日まで物理サーバーと戦ってきたみんなを、希望を信じたインフラエンジニアを、私は泣かせたくない。最後まで笑顔でいてほしい」
「それを邪魔するルールなんて、壊してみせる、変えてみせる」
「これが私の祈り、私の願い」
「さあ!叶えてよ、デプロイ王子!!」

posted @ 2015/02/12 17:03 by 初音 玲

グループのネストしているすべてのメンバーを表示する画面

前に所属しているすべてのグループを表示する画面をサンプルアプリに追加しました。

これはユーザー、グループ、コンピューターの所属するグループは、プロパティを見ても直接所属しているグループしか表示されないので、間接的に所属しているグループも見れると便利だと考えてたからです。

今回はグループから見て、直接のメンバーだけじゃなく間接的なメンバーも表示する画面をサンプルアプリに追加しました。

画面はツリー表示のみです。

左が Windows アプリで右が Web アプリです。(どれもクリックすると新しいウィンドウで拡大図が表示されます。)

AllMembersWin AllMembersWeb

ツリー表示は所属しているすべてのグループを表示する画面と同じで TreeView を使って、ノードの作成はコードで行ってます。Windows アプリは ImageList も使ってます。

呼出し元のグループリスト画面にはボタンを追加し、クリックすると この画面をダイアログ表示するようにしました。

Web アプリの方は JavaScript で表示するようにしたので、directory.js に下記コードを追加しました。

//グループの名前を指定して、すべてのメンバー画面をダイアログ表示します。

function showAllMemberList(groupName) {

  var url = "AllMemberList.aspx?name=" + encodeURIComponent(groupName);

  showModalDialog(url, window, "dialogWidth: 400px; dialogHeight: 400px; resizable; center;");

}

 

表示するテキストについては次のようにしました。

ユーザー => 表示用の名前(姓名:表示用の所属パス/アカウント名)

グループ => 表示用の名前(グループのスコープ:表示用の所属パス)

コンピューター => 表示用の名前(OS SP:役割)

外部のセキュリティ プリンシパル => 表示用の名前(名前)

 

表示用の名前については、外部のセキュリティ プリンシパルは読み取り可能な名前「NT AUTHORITY\○○」 の ○○部分で、それ以外は name 属性の値です。

ForeignSecurityPrincipal

 

.NET のコードは別途書きます。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/11 19:07 by mitchin(mitchin@wankuma.com)

静岡Developers勉強会の「UnityとBlenderハンズオン第1章」の資料公開

静岡Developers勉強会では、過去に下記の勉強会を行いました。
2010年:「Programming in Haskell」
2011年:「JavaScript: The Good Parts」
2012年:「HTML5&CSS3実践入門」、「GitHubハンズオン」、「node.jsハンズオン」
2013年:「入門 機械学習」
2014年:「実践 コンピュータビジョン」

今年の2015年は上記の勉強会で学んだことを実践し、Shizudev名義のスマホアプリを開発します。
その為、スマホアプリを開発する上で汎用的なツールとしてUnityとBlenderを学ぶことにしました。

2015/02/07(土)に、静岡Developers勉強会 UnityとBlenderハンズオンが行われる島田市地域交流センター歩歩路(ぽぽろ) 第4会議室には8名(新規参加者が4名)が集まりました。
セッションの準備をしていると自分のノートPCのACアダプタを家に忘れたことが気が付きました。
その為、セッション中の1時間過ぎ後にはバッテリーが切れ、たまたま参加者にMBAとVAIOの2台持ちの方がいたため、MBAをスライド専用にお借りしてセッションを進めることが出来ました。
Unity1セッションとBlender2セッションを行う予定でしたが、みな操作が不慣れだったため2セッションで終了時間20分前となってしまい、次回に持ち越しとなりました。もっとも、最後のセッション資料の作成が間に合ってなかったんですけどね。
当日は参加者全員が、UnityのテトリスもどきとBlenderのサイコロを完成させることが出来たのが良かったです。

UnityとBlenderハンズオン第1章 from yaju88

posted @ 2015/02/09 21:48 by やじゅ

[Hardware]主力ノートPCが壊れたので新しくノートPCを選定

予定では、Windows 10の発売に合わせて今年末くらいに刷新する予定だった主力ノートPCが2年の保証期間が過ぎた直後にお亡くなりになりました。

急ぎ次のノートPCを手に入れないと何もできない状態です。

候補は次の8つ。

さて、どれにしようかな。

No Name CPU Memory Storage Price
1 マウスLB-J301X  Core i7 (4th gen) 4GB (+4GB可) HDD500GB(載替可能) \99,800
2 Mac Book Air 13インチ Core i7 (4th gen) 8GB (増設不可) SSD 256GB \142,400
3 Vaio Pro 13 Core i7 (4th gen) 8GB (増設不可) SSD 256GB \162,000
4 LIFEBOOK WS1/T Core i7 (5th gen) 8GB (+8GB可) HDD500GB(載替可能) \168,307
5 Mac Book Pro 13 Retina Core i7 (4th gen) 8GB (増設不可) SSD 256GB \177,600
6 dynabook KIRA V83/PS Core i7 (5th gen) 8GB (増設不可) SSD 256GB \177,660
7 Surface Pro 3 Core i7 (4th gen) 8GB (増設不可) SSD 256GB \177,984
8 ThinkPad X1 Carbon  Core i7 (5th gen) 8GB (増設不可) SSD 256GB \194,400

posted @ 2015/02/08 21:42 by 初音 玲

[Xamarin]OPCはOlympus AIRになります!

テスターに選ばれてHack中のOPCが3/6にOlympus AIRとして製品版発売になったとニュースリリースでました。
http://www.olympus.co.jp/jp/news/2015a/nr150205opcj.jsp

オリンパスさんのサイトでは発売記念キャンペーンの販売予約が始まっています。
https://shop.olympus-imaging.jp/product/select/catcd/2313

なんか、わくわく感が止まらない。

製品発売決まっていないものでもアンテナにピピッときたものを先行して開発できるのは開発者としてすごくうれしい。でも、それが製品発売となるとなんだか更にうれしくなりますね。

posted @ 2015/02/05 15:42 by 初音 玲

[Windows10]Raspberry Pi 2にはWindows 10が乗ります

Windows 10 Coming to Raspberry Pi 2

Windows 10は実装先のハードによって"Industry"、"Mobile"、"Athens"というセットを計画しています。そのほかにEmbedded Compactと.NET Micro Frameworkまで加えてMicrosoftのIoT向けの戦略になってきます。

このあたりはTechEdヨーロッパでも発表されていました。

http://zdnet4.cbsistatic.com/hub/i/r/2015/02/02/e424db0a-c4d3-4644-a368-14b7765e541f/resize/770x578/33329788499901235c6aca88de5b8b4d/athensiot.jpg

今回、Raspberry Pi 2に乗ってくるのは、.NET Micro Frameworkではなく"Athens"=アテネになります。

別のスライドによれば、MobileとAthensはARMかx86に乗るとのこと。そしてAthensの特徴としては

-----
An optimized version of Windows for resource and cost constrained devices with full power of modern application development to run Unversal Apps.

-----

「universal Windows appsを動作させる日宇町がある資源節約型デバイス=小規模デバイス向け」
とあります。つまりXAMLなどのUIが必要な場合はWindows 10 "Athens"、そして、そういったものが必要ない時は.NET Micro Frameworkという棲み分けになっていくと想像します。

また、マイクロソフトはWindowsとWinodws Phoneのように別々のバイナリにするのではなく、1本化しようとしていますので、コア部分は共通になり、そこにデバイスの資源や必要な機能をチョイスして、"Industry"、"Mobile"、"Athens"という3つのモードを提供してくることが推測できます。

なにはともあれ、いままでであれば企業や開発者が「ストアアプリ別にいいかな」と開発を避けていても「Windows 8専用でしょ?デスクトップアプリも動くよね?Windows RTは気にしない」と言ってしまえたかもです。でも、これからは、これだけ世界が広がってくるとUniversal Windows Appsを今すぐ始めた方が楽しいと思うので、作り方知っておいた方がいいよ!と改めてお勧めしたい思うのです。

posted @ 2015/02/05 13:44 by 初音 玲