わんくま同盟 Blog's

わんくま同盟

メニュー

わんくま同盟

  勉強会情報

  メンバリスト

掲示板

ブログ

リンク

統計

わんくま同盟メンバ

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

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

近況報告

いつの間にか iPhone アプリ開発者になって早二年。
この記事を書いている Windows 機の脇には Mac Book Pro が居ます。

久しぶりに Windows の開発を行なうと手順が思い出せなくて焦るw

エクスプローラーでファイル名を変更するのに、F2 キーではなく、つい Enter キーを押していたり。
※Mac 標準のキーバインドでは、Finder(Windows のエクスプローラー)では、return でファイル名変更なのです。

一番つらいのは、Mac 版の Excel の動作が Windows 版と互換性がない点かな。
セルの編集が F2 キーではなく、control+U とか、
セル内改行が Alt+Enter ではなく command+control+return だったり。

Windows 機と Mac Book Pro との間でのファイル受け渡しは Bluetooth です。
通信速度は遅いけど、特に何を抜き差ししなくてよいのが最大の利点。
インターネットも要らないし。
Air Drop が使えたら最高なんだけど。

取りあえず生きてます。

posted @ 2015/01/27 0:08 by RAPT

[IoTKitHol]Spider Starter Kitで.NET Micro Framework 4.3を使うには

FEZ Spider Starter Kitを使ってテンプレートのままのプログラムを実行すると配置まではいくのですが実行が空振りでおわってしまいます。

このようなときはFirmwareのバージョンが古いことが考えられます。

USBにFEZ Spider Mainboardを接続してから、PCで

C:\Program Files (x86)\GHI Electronics\GHI FEZ Config\FEZ Config.exe

を起動してファームウェアが最新かを確認してみましょう。

Firmware Update

image

The device’s firmwareのバージョンと、Firmware (TinyCLR) on this computerのバージョンがあっているか確認してください。

あっていないときは[Next]ボタンをクリックするとFirmwareのアップデートが始まります。

1度のアップデートではあげきらない場合もあるのでアップデート後は、再度バージョンを確認してみましょう。

Network Configuration

次にネットワークにMACアドレスが設定されているかも確認しておきましょう。

[Load Built-in Ethernet Config]ボタンをクリックして設定を読み込みます。

図のように[MAC Address]欄に値が入っていればいいのですが、そうでないなら[Generate MAC]ボタンでMACアドレスを生成します。

DISP01-03

それから、[Apply Build-in Ethernet Config]ボタンをクリックして設定します。

 

これで準備完了です。

再度、アプリを実行すれば配置が行われブレイクポイントで一時停止することが確認できます。

posted @ 2015/01/26 12:49 by 初音 玲

2015年最初のLT

24日、.NETラボ勉強会の LT で発表させていただきました。

先週の .NETラボ in 秋田に続いて 2週連続の発表になりました。

今回は先月の LT で発表した「Active Directoryドメインを作ってみよう(その3)」の続きです。

 

既存のドメインにドメインコントローラーを追加した後に DNSサーバーとサイトを設定するという内容です。

 

LT で使ったスライドです。

Active Directoryドメインを作ってみよう ~追加したドメインコントローラーの設定~

Configure DNS(Forwarder) & Sites(Subnets) after adding DC to existing domain.

http://www.slideshare.net/mitchin227/add-dc2

 

 

Active Directory 関連 Blog

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

posted @ 2015/01/25 13:13 by mitchin(mitchin@wankuma.com)

Windows 10 TP のEnglish版に日本語パック入れたらまず初めにすること

まず、すぐにシステムロケール変えましょう。

結構気づかずはまります

1、コンパネ起動。

ここは Windows 10らしく、左下の検索画面で「コントロールパネル」と打ちましょうw

image

2、コントロールパネルから、「言語」を選んで左ペインの「日付、時刻、または数値の形式の変更」を選びましょう

管理タブから「システムロケールの変更」を押して、日本語を選んで再起動しましょう

image

posted @ 2015/01/24 12:52 by ちゅき

Windows 10 Preview で日本語化できるよなった幸せ(T_T)

これでもう、ファイル名化けまくりとか、テキストファイルご死亡という悲しい目に合わなくて済む^^

 

Option押して「Download」をクリックすると、いままでは残念!でしたがダウンロード始まりました^^

image

 

まだダウンロード中にも関わらず、日本語が見える。ページの構成もウザいとおもっていたところが変わっていてうれしい^^

・ライブタイルの領域が増えている

・スタートメニューがボタン一発で最大化する!!!

・プログラムの一覧が出しやすくなっている

image

 

 

image

posted @ 2015/01/24 11:29 by ちゅき

[Windows10]Windows 10 Technical Preview 9926がやってきた

Windows 10の2回目のTechnical Previewがやってきましたね。

今度の9926には日本語版も提供されています。

https://msdn.microsoft.com/ja-jp/subscriptions/

image

MSDNサブスクリプションを持っていない場合でも「Windiows Insider Program」に参加するとダウンロードできます。

https://insider.windows.com/

image

 

Windows Insider Programのページ見てみると、さらっと「New Windows 10 Technical Preview for phones」が2月にくるよ!ってかかれていますね。

こちらの方も楽しみです。昨年のde:codeで貰ったlumia 1520とかHTC 8xとかシアトルでかったBLE HDとかどれかでは動かせるのが提供されるとうれしい。

posted @ 2015/01/24 9:53 by 初音 玲

[WiX] WiX 3.9 R2 メンテナンスリリース公開

ネタ元:WiX Toolset v3.9 R2 maintenance release is available

以下の深刻なバグ修正が行われたのでメンテナンスリリースを出すことになったようです。

  • Bug 4600 | VSExtension Help custom action binaries are corrupt.
  • Bug 4608 | Multiple prerequisites return failure, when 1st prerequisite is already installed and 2nd prerequisite is installed successfully.
  • Bug 4609 | Bug in BVariantCopy() in src/burn/engine/variant.cpp

いずれのバグも引っかからない場合はアップデートは不要だそうです。

新規にインストーラを作るときにならない限りは問題なさそうですね。

posted @ 2015/01/23 17:04 by とっちゃん

[Mobile]OLYMPUS OPC Hack & Make Projectに選定されました

http://opc.olympus-imaging.com/

OLYMPUS OPC Hack & Make Projectは、OPC = Open Pratform Camera、SDK (Android / iPhone)、3Dデータをオリンパスさんが提供し、アプリやアクセサリを作成するプロジェクトです。

 

このプロジェクトにTMCNのたけせんさんと会話しながら浮かんだアイデアで応募したら、見事に選定されました。

2015/1/22に渋谷のFabCafeで受領できるようなので楽しみです。

 

もちろん、Android / iOSしかSDKがなくてBluetooth 4.0接続ということなので、なんとかデータ仕様を入手して、Xamarin.Android用SDKやWindowsストアアプリ用SDKを構築したいですね。

posted @ 2015/01/12 10:42 by 初音 玲

.NETラボ in 秋田の資料

17日(土)に .NETラボ in 秋田でセッションさせていただく資料の準備ができたので、公開しました。

 

スライド:所属しているグループをすべて取得する

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

 

セッションは主にデモとソースコードをお見せしながらの説明にしようかなと考えてます。

 

お時間ある方はぜひご参加ください。

 

Active Directory 関連 Blog

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

posted @ 2015/01/11 12:53 by mitchin(mitchin@wankuma.com)

所属しているすべてのグループを表示する画面のWebアプリのコード(C#)

所属しているすべてのグループを表示する画面の Web アプリの C# のコードです。

//プライベートフィールド

private DomainObject member;  //メンバー

private Dictionary<string, DomainGroup> allGroups;  //全グループ(Key:distinguishedName)

private List<string> addedDistinguishedNames;   //リストに追加したグループの識別名

 

//イベントハンドラ

protected void Page_Load(object sender, EventArgs e)

{

  var name = Request.QueryString["name"];   //名前

  if (String.IsNullOrEmpty(name))

  {

    return;

  }

 

  CategoryType category;  //Directory オブジェクトの種類

  if (Enum.TryParse<CategoryType>(Request.QueryString["category"], out category) == false)

  {

    return;

  }

  if (this.IsPostBack)

  {

    return;

  }

 

  switch (category)   //Directory オブジェクトの種類

  {

    case CategoryType.User:

      member = DomainUser.FindByName(name);   //ユーザーを検索

      break;

    case CategoryType.Group:

      member = DomainGroup.FindByName(name);  //グループを検索

      break;

    case CategoryType.Computer:

      member = Computer.FindByName(name);     //コンピューターを検索

      break;

  }

  if (member == null)

  {

    return;

  }

 

  allGroups = DirectoryAccess.GetGroups<DomainGroup>().ToDictionary(

    group => group.Entry.Properties["distinguishedName"].Value.ToString(), group => group);

  addedDistinguishedNames = new List<string>();

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

  this.GroupListBox.DataSource = CreateGroupTable();  //データソース用のテーブルを作成

  this.GroupListBox.DataTextField = "Text";

  this.GroupListBox.DataValueField = "Value";

  if (addedDistinguishedNames.Count > 1)

  {

    this.GroupListBox.Style.Add(HtmlTextWriterStyle.BorderStyle, "None");

  }

  else

  {

    this.ViewRadioButtonList.Enabled = false;

  }

  this..GroupListBox.DataBind();

  member.Dispose();

  DirectoryAccess.DisposeItems(allGroups.Values);

}

 

protected void ViewRadioButtonList_SelectedIndexChanged(object sender, EventArgs e)

{

  this.GroupTreeView.Visible = this.ViewRadioButtonList.SelectedIndex == 0;

  this.GroupListBox.Visible = !this.GroupTreeView.Visible;

}

 

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

//子ノードを追加

private void AddChildNode()

{

  var node = new TreeNode(member.ToString(), member.Name);

  this.GroupTreeView.Nodes.Add(node);

  if ((member.Category == CategoryType.User) || (member.Category == CategoryType.Computer))

  {

    //プライマリー グループを追加

    var primaryGroupId = (member.Category == CategoryType.User) ?

      ((DomainUser)member).PrimaryGroupId : ((Computer)member).PrimaryGroupId;

    var group = allGroups.Values.Cast<DomainGroup>().Single(grp => grp.Token == primaryGroupId);

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

  }

  //所属するグループを追加

  foreach (string memberOf in member.Entry.Properties["memberOf"])

  {

    this.AddChildNode(node, allGroups[memberOf]);   //子ノードを追加

  }

}

 

//子ノードを追加

private void AddChildNode(TreeNode node, DomainGroup group)

{

  var displayName = String.Format("{0}({1})", group.Name, group.Scope);   //表示するテキスト

  var distinguishedName = group.Entry.Properties["distinguishedName"].Value.ToString();   //識別名

  var childNode = new TreeNode(displayName, group.Name);  //ノードを作成

  node.ChildNodes.Add(childNode);

  if (addedDistinguishedNames.Contains(distinguishedName) == false)

  {

    addedDistinguishedNames.Add(distinguishedName);   //識別名を追加

  }

  //ネストしているグループを追加

  foreach (string memberOf in group.Entry.Properties["memberOf"])

  {

    this.AddChildNode(childNode, allGroups[memberOf]);  //子ノードを追加

  }

}

 

//データソース用のテーブルを作成

private DataTable CreateGroupTable()

{

  var table = new DataTable();

  table.Columns.Add(new DataColumn("Value", typeof(string)));   //値(distinguishedName)

  table.Columns.Add(new DataColumn("Text", typeof(string)));    //表示するテキスト

  foreach (var distinguishedName in addedDistinguishedNames)

  {

    var row = table.NewRow();

    var group = allGroups[distinguishedName];

    var displayName = String.Format("{0}({1})", group.Name, group.Scope);

    row[0] = distinguishedName;

    row[1] = displayName;

    table.Rows.Add(row);

  }

  return table;

}

 

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

 

 

Active Directory 関連 Blog

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

posted @ 2015/01/10 3:24 by mitchin(mitchin@wankuma.com)

所属しているすべてのグループを表示する画面のWebアプリのコード(VB)

所属しているすべてのグループを表示する画面の Web アプリの VB のコードです。

'プライベートフィールド

Private member As DomainObject  'メンバー

Private allGroups As Dictionary(Of String, DomainGroup)   '全グループ(Key:distinguishedName)

Private addedDistinguishedNames As List(Of String'ノードに追加したグループの識別名

 

'イベントハンドラ

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

  Dim name = Request.QueryString("name"'名前

  If String.IsNullOrEmpty(name) Then

    Return

  End If

 

  Dim category As CategoryType  'Directory オブジェクトの種類

  If [Enum].TryParse(Of CategoryType)(Request.QueryString("category"), category) = False Then

    Return

  End If

  If Me.IsPostBack Then

    Return

  End If

 

  Select Case category  'Directory オブジェクトの種類

    Case CategoryType.User

      member = DomainUser.FindByName(name)  'ユーザーを検索

    Case CategoryType.Group

      member = DomainGroup.FindByName(name) 'グループを検索

    Case CategoryType.Computer

      member = Computer.FindByName(name)    'コンピューターを検索

  End Select

  If member Is Nothing Then

    Return

  End If

 

  allGroups = DirectoryAccess.GetGroups(Of DomainGroup)().ToDictionary(

    Function(group) group.Entry.Properties.Item("distinguishedName").Value.ToString(), Function(group) group)

  addedDistinguishedNames = New List(Of String)()

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

  Me.GroupListBox.DataSource = CreateGroupTable()   'データソース用のテーブルを作成

  Me.GroupListBox.DataTextField = "Text"

  Me.GroupListBox.DataValueField = "Value"

  If addedDistinguishedNames.Count > 1 Then

    Me.GroupListBox.Style.Add(HtmlTextWriterStyle.BorderStyle, "None")

  Else

    Me.ViewRadioButtonList.Enabled = False

  End If

  Me.GroupListBox.DataBind()

  member.Dispose()

  DirectoryAccess.DisposeItems(allGroups.Values)

End Sub

 

Protected Sub ViewRadioButtonList_SelectedIndexChanged(

  sender As Object, e As EventArgs) Handles ViewRadioButtonList.SelectedIndexChanged

  Me.GroupTreeView.Visible = (Me.ViewRadioButtonList.SelectedIndex = 0)

  Me.GroupListBox.Visible = Not Me.GroupTreeView.Visible

End Sub

 

'プライベートメソッド

'子ノードを追加

Private Sub AddChildNode()

  Dim node As New TreeNode(member.ToString(), member.Name)

  Me.GroupTreeView.Nodes.Add(node)

  If (member.Category = CategoryType.User) OrElse (member.Category = CategoryType.Computer) Then

    'プライマリー グループを追加

    Dim primaryGroupId = If(member.Category = CategoryType.User,

      DirectCast(member, DomainUser).PrimaryGroupId, DirectCast(member, Computer).PrimaryGroupId)

    Dim group = allGroups.Values.Cast(Of DomainGroup)().Single(Function(grp) grp.Token = primaryGroupId)

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

  End If

  '所属するグループを追加

  For Each memberOf As String In member.Entry.Properties.Item("memberOf")

    Me.AddChildNode(node, allGroups.Item(memberOf))   '子ノードを追加

  Next

End Sub

 

'子ノードを追加

Private Sub AddChildNode(node As TreeNode, group As DomainGroup)

  Dim displayName = String.Format("{0}({1})", group.Name, group.Scope)  '表示するテキスト

  Dim distinguishedName = group.Entry.Properties.Item("distinguishedName").Value.ToString()   '識別名

  Dim childNode As New TreeNode(displayName, group.Name)  'ノードを作成

  node.ChildNodes.Add(childNode)

  If addedDistinguishedNames.Contains(distinguishedName) = False Then

    addedDistinguishedNames.Add(distinguishedName)  '識別名を追加

  End If

  'ネストしているグループを追加

  For Each memberOf As String In group.Entry.Properties.Item("memberOf")

    Me.AddChildNode(childNode, allGroups.Item(memberOf))  '子ノードを追加

  Next

End Sub

 

'データソース用のテーブルを作成

Private Function CreateGroupTable() As DataTable

  Dim table As New DataTable()

  table.Columns.Add(New DataColumn("Value", GetType(String)))   '値(distinguishedName)

  table.Columns.Add(New DataColumn("Text", GetType(String)))    '表示するテキスト

  For Each distinguishedName In addedDistinguishedNames   'ノードに追加したグループ数分

    Dim row = table.NewRow()

    Dim group = allGroups.Item(distinguishedName)

    Dim displayName = String.Format("{0}({1})", group.Name, group.Scope)

    row.Item(0) = distinguishedName

    row.Item(1) = displayName

    table.Rows.Add(row)

  Next

  Return table

End Function

 

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

メンバー(対象のオブジェクト)の情報は Page.Load イベントで、クエリ文字列から name(名前)と category(Directory オブジェクトの種類)を取得してます。

で、Directory オブジェクトの種類ごとにそのクラスの FindByName メソッドを呼び出してオブジェクトを取得してます。

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

実装コードはこちら(ユーザーグループコンピューター

 

ListBox のデータソースには DataTable をセットしてます。

 

 

Active Directory 関連 Blog

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

posted @ 2015/01/10 3:08 by mitchin(mitchin@wankuma.com)

所属しているすべてのグループを表示する画面のWindowsアプリのコード(C#)

所属しているすべてのグループを表示する画面の Windows アプリの C# のコードです。

//プライベートフィールド

private readonly DomainObject member;   //メンバー

private readonly Dictionary<string, DomainGroup> allGroups;   //全グループ(Key:distinguishedName)

private readonly List<string> addedDisplayNames;  //リストに追加したグループの表示テキスト

 

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

public InRoleGroupList(DomainObject member)

{

  InitializeComponent();

  this.member = member;

  allGroups = DirectoryAccess.GetGroups<DomainGroup>().ToDictionary(

    group => group.Entry.Properties["distinguishedName"].Value.ToString(), group => group);

  addedDisplayNames = new List<string>();

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

  this.GroupListBox.DataSource = addedDisplayNames;

  this.ViewPanel.Enabled = addedDisplayNames.Count > 1;

  this.GroupTreeView.ExpandAll();

}

 

//イベントハンドラ

//TreeRadioButton, ListRadioButton

private void RadioButton_CheckedChanged(object sender, EventArgs e)

{

  this.GroupTreeView.Visible = sender == this.TreeRadioButton;

  this.GroupListBox.Visible = !this.GroupTreeView.Visible;

}

 

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

//子ノードを追加

private void AddChildNode()

{

  var imageIndex = (int)member.Category;

  var node = new TreeNode(member.ToString(), imageIndex, imageIndex);

  this.GroupTreeView.Nodes.Add(node);

  if ((member.Category == CategoryType.User) || (member.Category == CategoryType.Computer))

  {

    //プライマリー グループを追加

    var primaryGroupId = (member.Category == CategoryType.User) ?

      ((DomainUser)member).PrimaryGroupId : ((Computer)member).PrimaryGroupId;

    var group = allGroups.Values.Cast<DomainGroup>().Single(grp => grp.Token == primaryGroupId);

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

  }

  //所属するグループを追加

  foreach (string memberOf in member.Entry.Properties["memberOf"])

  {

    this.AddChildNode(node, allGroups[memberOf]);   //子ノードを追加

  }

}

 

//子ノードを追加

private void AddChildNode(TreeNode node, DomainGroup group)

{

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

  node.Nodes.Add(childNode);

  if (addedDisplayNames.Contains(childNode.Text) == false)

  {

    addedDisplayNames.Add(childNode.Text);  //表示するテキストを追加

  }

  //ネストしているグループを追加

  foreach (string memberOf in group.Entry.Properties["memberOf"])

  {

    this.AddChildNode(childNode, allGroups[memberOf]);  //子ノードを追加

  }

}

 

//指定したグループのノードを作成

private TreeNode CreateNode(DomainGroup group)

{

  var displayName = String.Format("{0}({1})", group.Name, group.Scope);   //表示するテキスト

  var fontColor = Color.Black;

  switch (group.ScopeType)

  {

    case DomainGroupScopeType.DomainLocal:

      fontColor = Color.Blue;

      break;

    case DomainGroupScopeType.Global:

      fontColor = Color.Green;

      break;

    case DomainGroupScopeType.Universal:

      fontColor = Color.Brown;

      break;

  }

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

}

 

Dispose メソッドに次のコードを追加しました。

DirectoryAccess.DisposeItems(allGroups.Values);

 

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

 

 

Active Directory 関連 Blog

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

posted @ 2015/01/08 22:06 by mitchin(mitchin@wankuma.com)

[Codezine]Salesforce + WPFアプリの解説がCodezineに掲載されました

http://codezine.jp/article/detail/8400

--

 ハイブリッドクラウドにおける接続を解決するアプローチはいろいろありますが、ADO.NETによるさまざまなデータソースとの接続性を活用するというアプローチに注目したのが、今回使用する「CData ADO.NET Provider for Salesforce 4J」です。

 CData ADO.NET Provider for Salesforce 4J(以下、CData)を使えば、ADO.NETでのノウハウを使ってSalesforceからデータを取得できます。さらに、ADO.NETでの接続を前提とした各種コントロールのデータソースとしてSalesforceを指定することもできるのです。

 なお、今回のサンプルはVisual Studio Ultimate 2013で作成しましたが、無料版であるVisual Studio Community 2013でも同じ手順で確認することができます。

--

 

Salesforceをデータソースとして使うコントロールの紹介になります。

ぜひ、ご覧下さい。

posted @ 2015/01/08 21:23 by 初音 玲

[Azure]Developers Summit 2015のセンサー&デバイス枠の中で登壇します。

2015/02/19(木)にDevelopers Summit 2015に登壇します。

----

【19-A-7】センサー&デバイス大集合
http://event.shoeisha.jp/devsumi/20150219/session/640

『センサー&クラウドを体験しよう』 初音 玲〔TMCN〕氏
各種センサーおよびデバイスからのデータをMicrosoft Azureで収集して可視化するための勘所を実演を中心にご紹介します。

----

私の他にも一緒に登壇する方が紹介する内容は面白い物ばかりなのでぜひ目黒雅叙園にきてください!

 

posted @ 2015/01/08 17:25 by 初音 玲

所属しているすべてのグループを表示する画面のWindowsアプリのコード(VB)

所属しているすべてのグループを表示する画面の Windows アプリの VB のコードです。

'プライベートフィールド

Private ReadOnly member As DomainObject   'メンバー

Private ReadOnly allGroups As Dictionary(Of String, DomainGroup'全グループ(Key:distinguishedName)

Private ReadOnly addedDisplayNames As List(Of String)   'リストに追加したグループの表示テキスト

 

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

Public Sub New(member As DomainObject)

  InitializeComponent()

  Me.member = member

  allGroups = DirectoryAccess.GetGroups(Of DomainGroup)().ToDictionary(

    Function(group) group.Entry.Properties.Item("distinguishedName").Value.ToString(), Function(group) group)

  addedDisplayNames = New List(Of String)()

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

  Me.GroupListBox.DataSource = addedDisplayNames

  Me.ViewPanel.Enabled = addedDisplayNames.Count > 1

  Me.GroupTreeView.ExpandAll()

End Sub

 

'イベントハンドラ

Private Sub RadioButton_CheckedChanged(

  sender As Object, e As EventArgs) Handles TreeRadioButton.CheckedChanged, ListRadioButton.CheckedChanged

  Me.GroupTreeView.Visible = sender Is Me.TreeRadioButton

  Me.GroupListBox.Visible = Not Me.GroupTreeView.Visible

End Sub

 

'プライベートメソッド

'子ノードを追加

Private Sub AddChildNode()

  Dim node As New TreeNode(member.ToString(), member.Category, member.Category)

  Me.GroupTreeView.Nodes.Add(node)

  If (member.Category = CategoryType.User) OrElse (member.Category = CategoryType.Computer) Then

    'プライマリー グループを追加

    Dim primaryGroupId = If(member.Category = CategoryType.User,

      DirectCast(member, DomainUser).PrimaryGroupId, DirectCast(member, Computer).PrimaryGroupId)

    Dim group = allGroups.Values.Cast(Of DomainGroup)().Single(Function(grp) grp.Token = primaryGroupId)

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

  End If

  '所属するグループを追加

  For Each memberOf As String In member.Entry.Properties.Item("memberOf")

    Me.AddChildNode(node, allGroups.Item(memberOf))   '子ノードを追加

  Next

End Sub

 

'子ノードを追加

Private Sub AddChildNode(node As TreeNode, group As DomainGroup)

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

  node.Nodes.Add(childNode)

  If addedDisplayNames.Contains(childNode.Text) = False Then

    addedDisplayNames.Add(childNode.Text)   '表示するテキストを追加

  End If

  'ネストしているグループを追加

  For Each memberOf As String In group.Entry.Properties.Item("memberOf")

    Me.AddChildNode(childNode, allGroups.Item(memberOf))  '子ノードを追加

  Next

End Sub

 

'指定したグループのノードを作成

Private Function CreateNode(group As DomainGroup) As TreeNode

  Dim displayName = String.Format("{0}({1})", group.Name, group.Scope)  '表示するテキスト

  Dim fontColor As Color

  Select Case group.ScopeType

    Case DomainGroupScopeType.DomainLocal

      fontColor = Color.Blue

    Case DomainGroupScopeType.Global

      fontColor = Color.Green

    Case DomainGroupScopeType.Universal

      fontColor = Color.Brown

  End Select

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

End Function

 

Dispose メソッドに次のコードを追加しました。

DirectoryAccess.DisposeItems(allGroups.Values)

 

コンストラクターで受け取っているメンバーは、呼出し元のリスト画面で選択されたオブジェクトで、ユーザー、グループまたはコンピューターです。

そのメンバーの所属するグループを再帰的に取得してます。

所属するグループはその都度検索して取得するのではなく、事前にすべてのグループを取得して、取り出しやすいよう distinguishedName 属性(識別名)の値をキーにした Dictionary から取得するようにしました。

ドメインの規模が大きい場合はその都度検索した方がいいかもしれないですね。

DirectoryAccess.GetGroups メソッドの実装は CodePlex の方をご覧ください。

 

所属するグループは memberOf 属性で取得できるので、For Each で回して取得してます。

例えば Administrator だと distinguishedName 属性と memberOf 属性の値は次のようになります。

distinguishedName 属性の値

CN=Administrator,CN=Users,DC=proceed,DC=pbyk,DC=com

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 属性の値をキーにして Dictionary から所属するグループのオブジェクトを取り出してます。

あと、ユーザーとコンピューターはプライマリー グループがあり、これは memberOf 属性に含まれないので別途取得してます。

取得は簡単で、ユーザーやコンピューターの primaryGroupID 属性の値(PrimaryGroupId プロパティに保持)= グループの primaryGroupToken 属性の値(Token プロパティに保持)であるグループを Dictionary から検索してます。

 

 

Active Directory 関連 Blog

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

posted @ 2015/01/06 20:16 by mitchin(mitchin@wankuma.com)

初夢

今年の初夢は、小劇場の舞台を見に行くという夢でした。 通常チケットの10倍以上の価格帯のチケット(ふつうは2800円なんだけど)でなんだか宝珠付のチケットを買っていたり。 で、受付に行くと主演女優さんがなぜか受付していて、宝珠付のチケットをだすととても困った様子。 どうやら、半分冗談で作ったチケットらしく、まさか購入してきてくる観客がいるとか想定外だったらしく、どうしようかと考えた挙句、自分がネックレスにして身に着けていた宝珠をその場でとって渡してくれるという。 劇の本編は全く登場しないという宝珠に肌のぬくもりが感じられるという起承転結のない夢でございました。

posted @ 2015/01/05 22:54 by 初音 玲

サンプルアプリのクラスライブラリ更新

所属しているすべてのグループを表示する画面の追加に伴いクラスライブラリ側を一部更新しました。

 

プライマリ グループ トークンを保持できるよう DomainGroup クラス(VB, C#)を変更

プライベートフィールドを追加

VB

Private ReadOnly _token As Integer

C#

private readonly int _token;

 

コンストラクター内に次のコードを追加

VB

entry.Invoke("GetInfoEx", New Object() {"primaryGroupToken"}, 0)

_token = Convert.ToInt32(entry.Properties.Item("primaryGroupToken").Value)

C#

entry.Invoke("GetInfoEx", new object[] { "primaryGroupToken" }, 0);

_token = Convert.ToInt32(entry.Properties["primaryGroupToken"].Value);

 

パブリックプロパティを追加

VB

Public ReadOnly Property Token As Integer

  Get

    Return _token

  End Get

End Property

C#

public int Token

{

  get

  {

    return _token;

  }

}

 

プライマリ グループ トークンを取得していた箇所は Token プロパティで取得するよう置き換えました。

 

コンストラクターに追加した 1 行目の詳細は「ユーザの所属するグループの取得」をご覧ください。

 

 

Active Directory 関連 Blog

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

posted @ 2015/01/05 22:23 by mitchin(mitchin@wankuma.com)

所属しているすべてのグループを表示する画面

ユーザーの所属するグループについて、ネストして間接的に所属しているグループも表示したいなぁと以前から考えていたので、サンプルアプリに追加しました。

所属するグループはドメイン内で直接所属しているグループしか表示されないので、間接的に所属しているグループも確認したい場合は 1つ 1つ辿っていかないといけないんです。

ユーザー以外にも、グループとコンピューターにも所属するグループがあるので、対象はこの 3種類のオブジェクトとしました。

画面はツリー表示とリスト表示をできるようにしてみました。

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

ツリー表示

InRoleGroupTreeWin InRoleGroupTreeWeb

リスト表示

InRoleGroupListWin InRoleGroupListWeb

 

ツリー表示は組織単位リスト画面(Win, Web)同じで、TreeView と ImageList を使って、ノードの作成はコードで行ってます。

リスト表示は、重複しないようにしたグループをコレクション(Windows アプリ)または DataTable(Web アプリ)にして ListBox にバインドしてます。

 

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

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

//名前と Directory オブジェクトの種類を指定して、所属している全グループ画面をダイアログ表示します。

function showInRoleGroupList(name, category) {

  var url = "InRoleGroupList.aspx?name=" + encodeURIComponent(name) + "&category=" + category;

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

}

 

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

 

 

Active Directory 関連 Blog

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

posted @ 2015/01/04 14:57 by mitchin(mitchin@wankuma.com)

XAMLab(ザムラボ) Topページが表示されない...

ここの、RSSは見られるのに... Topは見られない。 なんでだろう~?

posted @ 2015/01/03 1:44 by なか-chan@最愛のiMac

MVPを再受賞いたしました

おかげさまでDirectory Servicesで再受賞することができました。

クラウドが増えてきて認証・認可はさらに重要性を増していくと存じます。
今後とも皆様へ少しでも貢献できますよう努力してまいりますのでご指導よろしくお願いいたします。

ScreenShot_20150102090439

posted @ 2015/01/02 9:25 by ちゅき

謹賀新年

新年あけましておめでとうございます。

今回はMVP受賞がかないませんでした。
仕事が中心となってしまったからとか色々と理由はあると思いますが、
2005年1月から2014年12月まで10年間ありがとうございました。

そうは言っても私自身が変わるわけでもありません。
2004年6月にAILightさん の Blog「えムナウ の ありのまま」からコミュニティデビューは始まりました。
「えムナウ の なずがまま」「えムナウ の とどけもの」と進化していきました。
「ありのままのじぶんになるの」というわけで初心にもどります。

よりいっそう自己の研鑽とコミュニティ発展の協力に努めるよう頑張ります。
これからはMicrosoftにこだわらずいろんな分野にでしゃばっていきたいです。
これからも変わらずよろしくお願いいたします。

P.S.
森進一の「年上の人」が「ダメ~ヨ、ダメダメ」の元祖だって、よく気が付いた人がいたね。

posted @ 2015/01/01 0:00 by えムナウ

静岡Developers勉強会の資料公開7章~10章

今年の静岡Developers勉強会では、オライリーの「実践コンピュータビジョン」の本を読書会形式で勉強会をしました。
1章~10章の全ての資料が揃いましたので公開します。


1章 基本的な画像処理、2章 画像の局所記述子、3章 画像間の写像
静岡Developers勉強会の資料公開1章~3章

4章 カメラモデルと拡張現実感、5章 多視点幾何、6章 画像のクラスタリング
静岡Developers勉強会の資料公開4章~6章

 

7章 画像検索

コンピュータビジョン7章資料_20140830読書会 from Nao Oec

8章 画像認識

実践コンピュータビジョン8章 from Kazufumi Ohkawa

9章 画像の領域分割

実践コンピュータビジョン 9章 画像の領域分割 from yaju88

10章 OpenCV
http://connpass.com/event/9603/
【参考資料】
Pyconjp 2014 OpenCVのpythonインターフェース入門
http://www.slideshare.net/payashim/pyconjp-2014-opencv
CR09 OpenCVのpythonインターフェース入門 (ja)
https://www.youtube.com/watch?v=cOwuKSTVB7g
OpenCV入門
http://www.buildinsider.net/small/opencv/01

posted @ 2014/12/31 21:48 by やじゅ

静岡Developers勉強会の資料公開4章~6章

今年の静岡Developers勉強会では、オライリーの「実践コンピュータビジョン」の本を読書会形式で勉強会をしました。
1章~10章の全ての資料が揃いましたので公開します。


1章 基本的な画像処理、2章 画像の局所記述子、3章 画像間の写像
静岡Developers勉強会の資料公開1章~3章

4章 カメラモデルと拡張現実感

静岡Developers勉強会コンピュータビジョンvol4発表用資料 from keima_12


5章 多視点幾何
2014-05-06_5章資料.pdf

6章 画像のクラスタリング

2014/07/19_静岡Developers勉強会_実践コンピュータビジョンvol.6_「6章:画像のクラスタリング」 from shun_kabata

posted @ 2014/12/31 11:59 by やじゅ

Visual Basic 2015以降の新機能 その6

これは、Visual Basic Advent Calendar 2014の12/25日の記事。

VB2015(VB14.0)の新機能として下記9項目を挙げたのですが、幾つかの機能については次のVB15.0以降になるようです。
やはり、この時点でVisual Studio 2015 Preview版に実装されていないのは持ち越しのようです。
.NET Compiler Platform ("Roslyn") のサイトにて「Added」の項目は追加されています。

 

【VB2015(VB14.0)の新機能】参照:VBの新しいステートメントUpcoming Features in Visual Basic
1.Select Caseステートメントの拡張 → 次バージョンにて実装予定
2.読み取り専用の自動実装プロパティー
3.複数行にまたがった文字リテラル
4.yyyy-MM-dd型の日付リテラル
5.バイナリーリテラル → 次バージョンにて実装予定
6.数値区切りリテラル → 次バージョンにて実装予定
7.複数行にまたがるステートメントに対するコメント
8.バグ修正と小さな変更
  1.XMLドキュメントコメントの修正
  2.TypeOfステートメントでIsNot演算子の利用
  3.パーシャルモジュールとパーシャルインターフェイスのサポート
  4.#Reagion  #End Regionがメソッド内部で定義可能
  5.インターフェイスのReadOnly / WriteOnlyプロパティーを自動実装プロパティーで実装可能
  6.Overridesキーワードがある場合のOverloadsキーワードの省略を可能に
  7.属性の引数でボクシングの変換
9.C#で計画されたのをVBで検討中
  1.パラメーターなし構造体のコンストラクタ
  2.Dictonaryの初期化方法の追加(! operatorの追加) → 次バージョンにて実装予定
  3.暗黙的に定義される参照引数(Output キーワードの追加) → 次バージョンにて実装予定
  4.Catchブロック内でのAwaitキーワードのサポート → 次バージョンにて実装予定
10.その他
  1.Null条件演算子
  2.#pragmaの追加
  3.スマート名前解決


 
9.1.パラメーターなし構造体のコンストラクタについて説明します。
この機能はVisual Studio 2015 Preview版で確認できました。

引数が無いコンストラクタ(New)を作成することが出来ます。
また、ReadOnly Propertyを使ってC#のように英大小文字の組合せで値をセット出来ます。

Public Structure Point
    ReadOnly Property X As Integer
    ReadOnly Property Y As Integer
    Sub New()
        Me.X = 0
        Me.Y = 0
    End Sub
    Sub New(ByVal x As Integer, ByVal y As Integer)
        Me.X = x
        Me.Y = y
    End Sub
End Structure


9.2.Dictonaryの初期化方法の追加(! operatorの追加)について説明します。
この機能はVisual Studio 2015 Preview版で確認できませんでした。

“!”演算子を使って初期化出来るようにしたかったと思われます。
Dim customer = New JsonData With { !First = "Lucian", ' .Item("First") = "Lucian" !Last = "Wischik" ' .Item("Last") = "Wischik" }


! 演算子 (bang operator | 感嘆符演算子) は、Accessでは使ってた記憶がありますが、
VB.NETではすっかり忘れていました。
Default Public Property Itemとすると、ディクショナリ メンバ アクセス式 E!I は、式 E.D("I") に変換されます。

Dim x As New Dictionary(Of String, String)
x.Item("Foo") = "Bar"
x!Foo = "Bar"

Dim a = xx!Foo
Dim b = xx("Foo")
Dim c = xx.Item("Foo")

上記はVB.NETに以前からある機能です。この! 演算子の応用範囲を広げたいと思ったと思われます。
Dim x = New CC With { !name = “hello”}


9.3.暗黙的に定義される参照引数(Output キーワードの追加)について説明します。
この機能はVisual Studio 2015 Preview版で確認できませんでした。
C#のOut修復子をVBでも採用したかったと思われる。 C#のrefとoutの違い
(メソッド内でoutパラメータの値を使用することができず、必ずoutパラメータには新しい値を代入しなければなりません。)
' Callsite:
If Integer.TryParse(s, Output x) Then

' Declaration-site:
Function TryParse(s As String, Output x As Integer) As Boolean


9.4.Catchブロック内でのAwaitキーワードのサポートについて説明します。
この機能はVisual Studio 2015 Preview版で確認できませんでした。

C#のみサポートされて、VBはサポートされませんでした。 

Dim res As Resource = Nothing
Try
    res = Await Resource.OpenAsync(...)   ' You could do this.
    ...
Catch ex As ResourceException
    Await Resource.LogAsync(res, e)   ' Now you can do this ...
Finally
    If res IsNot Nothing Then Await res.CloseAsync() ' ... and this.
End Try



10.1.Null条件演算子
この機能はVisual Studio 2015 Preview版で確認できました。

' 従来の書き方
Private Function ToLower_OldStyle(s As String) As String
    If (s Is Nothing) Then
        Return Nothing
    End If
    Return s.ToLower()
End Function

' Null条件演算子「?」を使った書き方
Private Function ToLower_NewStyle(s As String) As String
    Return s?.ToLower()
End Function


10.2.#pragmaの追加
この機能はVisual Studio 2015 Preview版で確認できました。
コンパイル時のワーニング出力を抑制します。
記述としては#pragmaは使わないで、#Disableと#Enableとなります。

#Disable Warning BC40008
#Enable Warning BC40008


10.3.スマート名前解決
この機能はVisual Studio 2015 Preview版で確認できました。

WPFのThreadingには、「System.Threading」と「System.Windows.Threading」の2種類があります。
WPFにした上でThreadingと入力後「.」を入力するとVB2015ではインテリセンスが表示されるようになっていますが、VB2013では何も表示されませんでした。ただこの機能の説明の英文を訳すかぎりでは両方表示されると書かれていたのですが、表示されたのは「System.Threading」のみでした。


【あとがき】
追記が遅れました。調べながら書いていきましたが、私の力不足もあり説明に誤りがあるかも知れません。
1つ1つ詳細に説明していければもっと良かったのですが、簡易的な説明くらいに留まってしまいました。
今のところ、日本の他ブログでも1つ1つを説明しているところは無いと思われるので、先行説明としては多少とも役に立ったかなと思います。

posted @ 2014/12/25 23:53 by やじゅ

[Windows]HVC-Cを使ったWindowsストアアプリプロトタイプ

渋谷にあるFabCafeさんと組んでOmron HVC-Cを使ったアプリを作っています。

そのプロトタイプがWindowsストアアプリで動き始めました。

image

 

Omron HVC-Cは公式にはiOSとAndroidで動作するSDKがあります。本来であればこの2つのOSのどちらかでアプリをつくのが筋なのかもしれません。

なので最初はAndroid用のSDKをまずJavaからC#に書き換えて、サンプルごとXamarin.Androidで動作させました。で、アプリを作ろうかと思ったら、Xamarin XAMLで悩むよりも、まずはWindowsストアアプリとして動かして、しかるのちにAndroidに移植した方がいいじゃないかと思ったわけです(時間もなかったし)。

で、できあがったのがこれです!

posted @ 2014/12/25 22:04 by 初音 玲

[AED]千葉市オープンデータの推進に関する指針が素晴らしい件

千葉市さんが平成26年12月19日に施行した「千葉市オープンデータの推進に関する指針」の内容が素晴らしい内容になっています。


千葉市:千葉市オープンデータの推進に関する指針を策定しました

特に指針の先頭にある

---------------------------

この指針は、本市が保有する情報をオープンデータとして市民(法人その他の団体を含む。以下同じ。)に公開し、公共データの自由な二次利用※1を促進することにより、市政の透明性及び信頼性の向上、市民生活の利便性の向上、市民協働の推進、新産業の創出並びに経済活性化を図り、もって行政の高度化及び効率化に資することを目的とする。

---------------------------

がすごくいい。

AEDオープンデータプラットフォームにデータを自治体に依頼するときに、二次利用を想定していないために自治体からデータを頂けない(特に外部データ委託しているようなときは特に)ケースがあります。

この指針が普及すれば、そのネックがなくなりよりデータが活用されるようになるでしょう。

posted @ 2014/12/24 17:05 by 初音 玲

サンクコストとVB6の延命

これは、1円にもならない無駄な技術 Advent Calendar 2014Visual Basic Advent Calendar 2014の12/24日の記事。

今回は技術というよりは、考え方となります。

「サンクコスト」って言葉はなんとなくどこかで聞いたことがあるのでは無いでしょうか?

会計か経済用語で、日本語に訳すと「埋没費用」つまり「取り返せない費用」といった意味になります。

サンクコストの例としてよく引き合いに出されるのが、映画のチケットの話ですね。

2時間の映画を1,800円払って観に行き、それが10分経ってからつまらないと判断した場合、
10分で映画館を出るのか、残りの1時間50分を観続けるのか、という説明です。

この場合、映画代の1,800円とつまらないと感じるまでの10分が埋没費用となります。

10分で映画館を出ようが残りの1時間50分を観続けようが、埋没費用を回収することはできません。

しかし残り1時間50分を他のことに使うほうが経済的には合理的という話ですね。

このようなサンクコストの呪縛は、「せっかく払ったのだから、もったいない」というマインドや、自分の失敗を認めたくないという意識から生じるものだとか。実際、サンクコストを冷静に認識することも、実は結構難しいものです。

特に日本人には日本語に「もったいない」という言葉もあるように、「もったいない」が染み付いている方が多いことでしょう。

 

さて、今日はクリスマス・イブです。サンクコストの呪縛は恋愛にも当て嵌められます。

ケース1「5年近く付き合ってきたのに彼には結婚する意志が見られない、別の女性の影もあるけど見て見ぬふり。もう30歳で恋愛感情も無くなってきたけど、ここで別れるなんて無理。だって5年も付き合ってたんだから」

ここでいう「サンクコスト」は5年間の歳月で、その貴重な時間は取り戻せない。しかし、彼と結婚したとしても結局幸せにはなれないだろう。30歳なら、まだやり直しはできる。惰性で付き合っているくらいなら、一刻も早く別れて新たなパートナーを探すべきだ。

 

ケース2「自分には高嶺の花と思ったけど、なんとか振り向いてもらおうと食事を奢ったりプレゼントしたり夜景を見に行ったりで、それなりに金額を使ってきた。さすがに無理だと思ってるけど、これまで掛けた費用を考えるとモノにするまでやめれない」

ここでいう「サンクコスト」は食事代やプレゼント代や交通費代。もはや恋愛感情より掛けた費用の大きさから回収したい気持ちが大きくなっている。これ以上は損失が大きくなるので、きっぱり諦めて別のパートナーを探すべきた。

 

他にもサンクコストについては、スポーツの競技者にも当て嵌まることがあるようです。

為末、競技においてのサンクコスト、を語る - Togetterまとめ


さて、Visual Basic Advent Calendar 2014も兼ねてしまったのでVisual Basicについてである。
クライアント/サーバ型システムが全盛だった時代、Visual Basic6.0を使って たくさんの業務アプリケーションが開発された為、今でも問題なく利用されている。VB6.0が出てからもう16年も経っており、メンテナンスも維持しにくくなっている。
お客さんに、もはやサンクコストですリプレースしましょうと提案しても、この不況化において無い袖は振れません。
しかし、お客さんが困っているなら何とか解決してあげたい。
Windows7にはXPモードがあるが、Windows8以降にはXPモードはついていない。「XPモードに頼ってはいけない」の記事などの懸念もある。
その場合、「アプリケーションの仮想化」という技術があります。参照:VB6アプリの延命を試みる
有名なのに、ThinApp(VMware)やXenApp(Citrix)やApp-V(Microsoft)、フリーのCameyoというのがあります。
ThinAppは、アプリケーションとその動作環境(レジストリやDLLなど)をパッケージングしてVOS上で動かす技術です。
パッケージングされたアプリケーションは、直接動作するOSの環境を利用しません。
もちろん全てが動作するのかの検証は必要ですが、リプレース費用からすれば費用は抑えれれるでしょう。


【まとめ】
サンクコストは、過去を切り捨てて未来に向かう考え方である。過去がすべて誤りだったわけではない、かかった費用は取り戻せないが、それまでに培った経験や知識は活かせるわけです。
執着やこだわりや見得はいい面もあるが、時として犯罪を引き起こしてしまうことがある。
サンクコストという概念をもっと広めることで、ストーカー行為や怨恨による殺人事件などの犯罪を減らすことが出来るのではないだろうか。

posted @ 2014/12/24 2:41 by やじゅ

[Hardware]bionicbirdが届きました

WP_20141223_001

申し込んでいたのをすっかり忘れていたので、まるで自分へのクリスマスプレゼントともいえるものが届きました。

スムーズに最後まで届けてくれたDHLさん、すごい。

さて、これがなにかといえば「鳥」です。

WP_20141223_002

iPhoneを使ってBluetooth経由でコントロールできて、ちゃんと羽ばたいて飛んでくれるという代物。

これ、室内か無風に近い状態じゃないと無理っぽそう…。

Bluetoothだということなのでコマンド解析してWindows Phoneとかでコントロールできるように、さらにはプログラマブルにしてなんか遊べるようにしようかなと思っています。

posted @ 2014/12/23 0:29 by 初音 玲

Visual Basic 2015以降の新機能 その5

これは、Visual Basic Advent Calendar 2014の12/22日の記事。

VB2015(VB14.0)の新機能として下記9項目を挙げたのですが、幾つかの機能については次のVB15.0以降になるようです。
やはり、この時点でVisual Studio 2015 Preview版に実装されていないのは持ち越しのようです。
.NET Compiler Platform ("Roslyn") のサイトにて「Added」の項目は追加されています。

 

【VB2015(VB14.0)の新機能】参照:VBの新しいステートメントUpcoming Features in Visual Basic
1.Select Caseステートメントの拡張 → 次バージョンにて実装予定
2.読み取り専用の自動実装プロパティー
3.複数行にまたがった文字リテラル
4.yyyy-MM-dd型の日付リテラル
5.バイナリーリテラル → 次バージョンにて実装予定
6.数値区切りリテラル → 次バージョンにて実装予定
7.複数行にまたがるステートメントに対するコメント
8.バグ修正と小さな変更
  1.XMLドキュメントコメントの修正
  2.TypeOfステートメントでIsNot演算子の利用
  3.パーシャルモジュールとパーシャルインターフェイスのサポート
  4.#Reagion  #End Regionがメソッド内部で定義可能
  5.インターフェイスのReadOnly / WriteOnlyプロパティーを自動実装プロパティーで実装可能
  6.Overridesキーワードがある場合のOverloadsキーワードの省略を可能に
  7.属性の引数でボクシングの変換

9.C#で計画されたのをVBで検討中
10.その他


8.1.XMLドキュメントコメントの修正について説明します。
この機能はVisual Studio 2015 Preview版で確認できました。

VBではXML形式のコメントにジェネリック型でのリンク(see cref)が出来なかったのですが、出来るようになりました。
''' <summary> ''' A great fancy class. ''' </summary> ''' <typeparam name="T">Generic stuff ....</typeparam> ''' <see cref="FancyClass(Of T)" /> Public Class FancyClass(Of T) ''' <summary> ''' A fancy method that do fancy operation. ''' </summary> ''' <param name="value">The value.</param> ''' <returns></returns> Public Function FancyMethod(value As T) As String Return "something fancy" End Function End Class
 
8.2.TypeOfステートメントでIsNot演算子の利用について説明します。
この機能はVisual Studio 2015 Preview版で確認できました。
VB2005でIsNotが採用されたのですが、TypeOf時に使えなかったのが使えるようになりました。
If TypeOf sender IsNot Button Then

8.3.パーシャルモジュールとパーシャルインターフェイスのサポートについて説明します。
この機能はVisual Studio 2015 Preview版で確認できました。

PartialはVB2005で追加された「複数のファイルに分散して定義できる」機能です。
クラスのみ対応でしたが、モジュールとインターフェイスもサポートするようになりました。
Partial Module DatabaseExtensions
Partial Interface IBindable
8.4.#Reagion #End Regionがメソッド内部で定義可能について説明します。
この機能はVisual Studio 2015 Preview版で確認できました。

これまで最低でもメソッド単位でしか使えなかったのが、メソッド内部でも使えるようになりました。
また下記のように別メソッドを含めても使えます。
Function Range(min As Integer, max As Integer) As IEnumerable(Of Integer) If min > max Then Throw New ArgumentException #Region "validation" Return Helper(min, max) End Function Private Iterator Function Helper(min As Integer, max As Integer) As IEnumerable(Of Integer) #End Region For i = min To max Yield i Next End Function
8.5.インターフェイスのReadOnly / WriteOnlyプロパティーを自動実装プロパティーで実装可能について説明します。
この機能はVisual Studio 2015 Preview版で確認できました。
ReadOnly Propertyが追加されたため、インターフェイスの実装(Implements)にも適用しています。
ちなみClass C側のPプロパティはReadOnlyにはなりません。

Interface I ReadOnly Property P As Integer End Interface Class C Implements I Property P As Integer Implements I.P End Class


8.6.Overridesキーワードがある場合のOverloadsキーワードの省略を可能について説明します。
この機能の説明があっているのか微妙です。VB2013でもエラーにならなかったもので。

Derivedクラスで「Overrides Overloads」で書いていたのを、継承しているので推測して
Overloadsキーワードの省略できるようにしますってことだと思います。

Public Class Base Public Overridable Function Delete(code As Integer) As Boolean Return True End Function Public Overridable Function Delete(code As Integer, id As Integer) As Boolean Return True End Function End Class Public Class Derived Inherits Base Public Overrides Function Delete(code As Integer) As Boolean Return MyBase.Delete(code) End Function Public Overrides Function Delete(code As Integer, id As Integer) As Boolean Return MyBase.Delete(code) End Function End Class
8.7.属性の引数でボクシングの変換について説明します。
この機能はVisual Studio 2015 Preview版で確認できました。

プロパティの既定値を指定する際に、CObjによる変換が可能になります。
ちなみにCIntなどはVB2013でも使えました。


Imports
System.ComponentModel <DefaultValue(CObj(1))> Public Property MyValue() As Object = MyValue

posted @ 2014/12/22 2:50 by やじゅ

2014年最後のLT

20日、.NETラボの勉強会の LT で発表させていただきました。

今回は 10月のセッションで発表した「Active Directoryドメインを作ってみよう(その2)」の続編です。

 

5分という制限の中で喋れる部分を作りました。

今後異なるネットワークにドメインを追加する予定なので、その前提で既存のドメインにドメインコントローラーを追加するという内容です。

 

LT で使ったスライドです。

Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~

Add DC to existing domain.

http://www.slideshare.net/mitchin227/add-dc1

 

 

Active Directory 関連 Blog

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

posted @ 2014/12/21 13:04 by mitchin(mitchin@wankuma.com)

サンプルアプリをCodePlexに公開しました。

.NETラボの勉強会のセッションで使用したサンプルアプリを CodePlex に公開しました。

ひとまず VB 版を公開しました。

 

http://directoryvb.codeplex.com/

 

Get Domain/User/Group/Computer/OrganizationalUnit(OU)/Printer/Volume objects from Active Directory and display on windows/web forms.

 

 

Active Directory 関連 Blog

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

posted @ 2014/12/19 23:51 by mitchin(mitchin@wankuma.com)

PowerShellにてタスクスケジューラーのタスク一覧を取得する

これは、PowerShell Advent Calendar 2014の12/19日の記事。

Windows Server 2008R2上のタスクスケジューラに登録しているタスクの結果をチェックして、異常があればメール送信するという依頼を受けた。

最初、タスクスケジューラのログを見れば結果が分かるだろうということで調べてみると、ログはイベントログに出力されることが分かったが、初期設定では履歴は無効になっており有効にしないとイベントログには出力されない。履歴表示を有効にするには右側パネルの「操作」欄から「すべてのタスク履歴を有効にする」をクリックして、「すべてのタスク履歴を無効にする」に変更します。

イベントログを取得するにはPowerShellを使うのがいいということで、PowerShellを勉強し始めた。
PowerShellを使おうとした時に、まず躓くエラー「スクリプトの実行がシステムで無効になっているため…」
http://technet.microsoft.com/ja-jp/scriptcenter/powershell_owner05.aspx
「確かに、これは少し厳しいと思われるかもしれません。何しろ、スクリプトを実行できないスクリプト環境なんて、あっても意味がありませんから。」ってこの記事に書いてあるけど、セキュリティー的に仕方ないのかも知れないけど厳しいよね。
でも、PSコマンドプロンプトより下記のコマンドを実行し、実行ポリシーを変更確認で[Y] はい(Y)を選択すれば、それ以降はPowerShellを存分に使える。※32bitと64bitとは別々なのでそれぞれに有効にする必要がある。
「Set-ExecutionPolicy RemoteSigned」


さて、タスクスケジューラのイベントログは「Microsoft-Windows-TaskScheduler/Operational」に登録される。Get-Eventlogコマンドでこのイベントログを取得しようとするも、存在しないとエラーになる。
調べるとGet-EventlogコマンドではなくGet-WinEventコマンドでないと取得出来ないのだった。
参照:[PowerShell]不定期イベントログを捕まえる!nmcapとPowerShellで必要なイベントログのみ取得する(2/2)

$IpAddress = "127.0.0.1"
$EventLogName = "Microsoft-Windows-TaskScheduler/Operational"
$StartDate = Get-Date
$EndDate = $StartDate - (New-TimeSpan -day 1)
$file = Split-Path $myInvocation.MyCommand.Path -Parent
$file = $file + "\tasklist.txt"

#イベントログ取得
function getEventLog ($IpAddress,$EventLogName,$StartDate,$EndDate,$file) {
    #イベントログ取得
    #201は操作が完了しました。
    $logArray = Get-WinEvent -Computername $IpAddress -logname $EventLogName | Select-Object * | 
            Where-Object {$_.TimeCreated -lt $StartDate -AND
                  $_.TimeCreated -gt $EndDate -AND
                  $_.UserId.Translate([System.Type]::GetType("System.Security.Principal.NTAccount")) -match "Administrator" -AND
                  $_.ID -eq 201 }


    #期間内のイベントログが無い場合は、ファイルにログ無しと書き込む
    if ($null -eq $logArray) {
        $message = "イベントログがありません。 期間:" + $startdate + " ~ " + $enddate
        $message | Out-File -Filepath $file
    }
    else {
        #ヘッダ情報をファイルに書き込む
        $line = "日時,イベントID,カテゴリ,ユーザー,タスク名,実行結果"
        $line | Out-File -Filepath $file
        #取得したイベントログをファイルに書き込む
        foreach ($row in $logArray) {
            #日付の書式を整形
            $workTimeCreated = [string]$row.TimeCreated.ToString("yyyy/MM/dd HH:mm:ss")

            #一行としてまとめる
            $line = $workTimeCreated + "," + [string]$row.ID + "," + [string]$row.TaskDisplayName + ","
            $line += [string]$row.UserId.Translate([System.Type]::GetType("System.Security.Principal.NTAccount")) + ","
            $line += [string]$row.Message.split("`"")[1].SubString(1) + ","     #タスク名
            $line += [string]$row.Message.SubString($row.Message.LastIndexOf(":")+2) #実行結果
            #ファイルに書き込む
            $line | Out-File -Filepath $file -Append -encoding Default
        }
    }
    #ファイルの存在チェックをして終了
    if (Test-Path $file) {
        #ログを出力
        Write-Host $file "を作成しました。"
    }
}

#実行
getEventLog $IpAddress $EventLogName $StartDate $EndDate $file

見よう見まねで作成してみて実行すると、数行のイベントログをCSV形式出力するだけなのに結果がでてくるのに1分以上もかかるのである。
きっと別のいい方法があるはずだと家に帰宅してから調べ直すと、「schtasks.exe /query /V /FO CSV」でタスク名と実行結果などがCSV形式出力することが分かった。

Function gettasks($Path)
{
  $OutPut = $Path + "\tasklist.txt"

  "実行時刻,タスク名,結果" | Out-File $output -encoding default

  $Tasks = schtasks.exe /query /V /FO CSV | ConvertFrom-Csv | Where { $_."ユーザーとして実行" -Like "*administrator" }
  ForEach ($Task in $Tasks) {
    If ($Task."実行するタスク" -match "TaskSchtCheck"){
    #自分のタスクは除く
    continue
   }
    $BeforeRunTime = $Task."前回の実行時刻"
    $TaskName = $Task."タスク名".SubString(1)
    $BeforeResult = $Task."前回の結果"
    "$BeforeRunTime,$TaskName,$BeforeResult" | Out-File $OutPut -append -encoding default
  }
}

Function Get-ScriptDirectory
{
    Split-Path $script:MyInvocation.MyCommand.Path
}

#実行
gettasks(Get-ScriptDirectory)
Out-File -encoding defaultとすることで文字コードがSJISのCSVが出力される。
VBSでCSVファイルを参照して、結果が2以上ならメール送信する仕組みとした。
VBSからPowerShellのスクリプトを実行するのは下記の通りです。
Set objShell = CreateObject("Wscript.shell")
objShell.run("powershell -file GetTaskList.ps1")
【追記】タスクスケジューラからVBSを呼ぶ場合、フルパス、PowerShellの画面非表示(0)、同期処理(True)にする
objShell.run "powershell -file """ & scriptRootPath & "GetTaskList.ps1""",0,True

posted @ 2014/12/19 3:19 by やじゅ

Visual Basic 2015以降の新機能 その4

これは、Visual Basic Advent Calendar 2014の12/18日の記事。

VB2015(VB14.0)の新機能として下記9項目を挙げたのですが、幾つかの機能については次のVB15.0以降になるようです。
やはり、この時点でVisual Studio 2015 Preview版に実装されていないのは持ち越しのようです。
.NET Compiler Platform ("Roslyn") のサイトにて「Added」の項目は追加されています。

 

【VB2015(VB14.0)の新機能】参照:VBの新しいステートメントUpcoming Features in Visual Basic
1.Select Caseステートメントの拡張 → 次バージョンにて実装予定
2.読み取り専用の自動実装プロパティー
3.複数行にまたがった文字リテラル
4.yyyy-MM-dd型の日付リテラル
5.バイナリーリテラル → 次バージョンにて実装予定
6.数値区切りリテラル → 次バージョンにて実装予定

7.複数行にまたがるステートメントに対するコメント
8.バグ修正と小さな変更
9.C# Previewの変更で検討中の機能
10.その他

5.バイナリーリテラルについて説明します。
この機能はVisual Studio 2015 Preview版では確認できませんでした。

VBは10進、8進(&O)、16進(&H)はあるが2進(&B)は無い、F#やC++と同様に接頭頭&Bをサポートしたい
Dim x = &B11100101 

6.数値区切りリテラルについて説明します。
この機能はVisual Studio 2015 Preview版では確認できませんでした。
長いリテラルはある程度のグループ区切りにして視認性をよくしようという試みです。
例えば金額は3桁区切りとして、「1 000 000」とする。

区切りはISO規格のスペースとアンダーバーの両方をサポートする。
Enum E
    Car      = &B 00 01
    Bicycle  = &B 00 10
    Foot     = &B 00 11

    Fastest  = &B_01_00
    Shortest = &B_10_00
    Scenic   = &B_11_00
End Enum


7.複数行にまたがるステートメントに対するコメントについて説明します。
この機能はVisual Studio 2015 Preview版で確認できました。
これまで行継続の後にコメントを書き込むことはできなかったので、これは嬉しいです。
例えば配列/オブジェクト初期化子内またはLINQ式の個々の行などにコメントが書けるわけです。

Dim  invites = { "Jim" ,    ' got to invite him! 
                "Marcy" ,   ' Jim's wife 
                "Jones" } 

Dim  addrs =  From  i  In  invites   ' go through list 
             Let  addr = Lookup(i)   ' look it up 
             Select  i, addr
 

posted @ 2014/12/18 23:01 by やじゅ

[Azure]Microsoft Azure Mobile ServicesでFacebookに投稿する

Microsoft Azrue Mobile Servicesでは、Microsoftアカウント、Facebook、Google、Twitterなどを認証寄稿として利用できます。

Facebook認証を選択した場合、そこで取得したアクセストークンを使ってカスタムAPIからFacebookに自動投稿することができます。

AEDオープンデータプラットフォームにてbetaテスト中の更新機能もこの機能を使って位置情報を登録、更新したときにFacebookに自動投稿をして(あとは、SendGrid使ってメールも飛ばして)います。このように操作履歴をSNSに投稿することで、位置情報の収集に貢献している人の見える化、そして、いたずらの発見と戻しがスムーズに行えるように考慮されています。

つまり、Facebookの自動投稿をクライアント側ではなく、Mobile Services側に実装することで投稿を回避するような迂回ができなくなるわけです。

 

Facebookにアプリを登録

Facebookを認証機構として使う場合は次のようにします。

image

Facebookに開発者登録を行い、アプリ登録を行います。

Microsoft Azrue Mobile Services側でFacebook認証を行うのならば、ここでは「ウェブサイト」として登録してMobile Servicesに作成したサービスのURLを登録します。

FacebookアプリをMobile Servicesに登録

Facebookにアプリを登録するとアプリケーションIDとアプリのシークレットキーが生成されますので、これをMobile Servicesに登録します。

image

カスタムAPIにアクセス制限をかける

image

アクセス制限をかけたいカスタムAPIのメソッドに対して「認証されたユーザーのみ」を設定します。

 

この設定によりFacebook認証を行わずにGETしようとすると次のようなエラーが発生します。

image

 

認証を通してアクセス制限がかかったカスタムAPIメソッドを実行する

Windows Azrue Mobile Services側でFacebook認証を行うためには、Mobile Services SDKを使ってクライアント側で次のコードを実行します。

await mobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook);

 

このコードを実行すると自動的にFacebookのログイン画面がSDKにより表示されます。

image

 

FacebookのIDとパスワードを入れて[ログイン]をクリックして成功すれば、アクセス制限のかかったカスタムAPIにアクセスできます。

カスタムAPI

それでは最後にFacebookに投稿するためのカスタムAPIについてみていきましょう。

exports.post = function(request, response) {
    PostFacebook(request,'UPDATE',response);
};

function PostFacebook(request,mode,response,results)
{
    var user = request.user;
    var LocationName = request.body.LocationName;
    var FacilityPlace = request.body.FacilityPlace;
    var VenueId = request.body.VenueId
    user.getIdentities({
        success: function(identities) {
            if (identities.facebook) {
                var req = require('request').defaults({strictSSL: true});
                var fbAccessToken = identities.facebook.accessToken;
                var providerId = user.userId.substring(user.userId.indexOf(':') + 1);;
                var userName = "";
                var userLink = "";
                /* get user info */
                { 
                    var uri = 'https://graph.facebook.com/' + providerId + '?access_token=' + fbAccessToken;
                    req(uri, {json: true},function(err,resp,body) {
                        if (err) {
                            console.error('Error sending data to FB Graph API: ', err);
                            response.send(statusCodes.INTERNAL_SERVER_ERROR);
                        } else {
                            if (resp.statusCode !== 200)
                            {
                                console.error(JSON.stringify(body));
                                response.send(statusCodes.INTERNAL_SERVER_ERROR);
                            } else {
                                userName = body.name;
                                userLink = body.link;
                                /* post feed for Facebook page */
                                if (userName.length > 0)
                                {
                                    var message = "posted:" + userName + " " + userLink + "\n"; 
                                    message = message + mode + ":" + LocationName;
                                    if (FacilityPlace) {
                                        message = message + " " + FacilityPlace + "\n";
                                    }
                                    message = message + "\n";
                                    if (VenueId) {
                                        message = message + " https://ja.foursquare.com/v/" + VenueId;  
                                    }  
                                    var uri = 'https://graph.facebook.com/614536118659766/feed';
                                    req.post(uri, {
                                        form: {
                                            message: message,
                                            access_token: fbAccessToken
                                        },
                                        json: true
                                    }, function(err,resp,body) {
                                        if (err) {
                                            console.error('Error sending data to FB Graph API: ', err);
                                            response.send(statusCodes.INTERNAL_SERVER_ERROR);
                                        } else {
                                            /*if (resp.statusCode !== 200 && resp.statusCode !== 506)
                                            {
                                                if (mode == "INSERT")
                                                {
                                                    InsertData(request,response);    
                                                } else {
                                                    UpdateData(request,response);    
                                                }
                                                console.error(JSON.stringify(body));
                                                response.send(statusCodes.INTERNAL_SERVER_ERROR);
                                            } else {
                                            }
                                            */
                                            if (mode == "INSERT")
                                            {
                                                InsertData(request,response);    
                                            } else {
                                                UpdateData(request,response);    
                                            }
                                        }
                                    });
                                } else {
                                    response.send(statusCodes.BAD_REQUEST);
                                }
                            }
                        }
                    });
                }
            }
        },
        error : function()
        {
            response.send(statusCodes.INTERNAL_SERVER_ERROR);
        }
    });
}

 

このカスタムAPIを呼び出せば、更新時には次のような投稿が自動的にFacebookページに送られます。image

以上

posted @ 2014/12/17 0:59 by 初音 玲

2014年の活動ふりかえり

12月も半ばなので今年1年の振り返りをします。4月更新なので1月~12月が評価対象なのでわかりやすいですね。

今年も自分が好きな開発環境とプラットフォームで色々なところでお話させて頂いたり活動させて頂いたりしました。

色々な人と出会うのは本当に楽しいですね。それはきっと出会う人が真剣に技術に向き合ったり、向き合っている人をサポートしようとしている人たちだからですね。

そんな出会いがまた来年ありますように。

slideshare
  1. LEGO MINDSTORMS EV3 API
    http://www.slideshare.net/akirahatsune/lego-mindstorms-ev3-api
  2. MVP Community Camp 2014 - How to use enhanced features of Windows 8.1 Store Apps
    http://www.slideshare.net/akirahatsune/mvp-community-camp-2014-how-to-useenhanced-features-of-windows-81-store-apps
  3. Kinect for Windows v2 Developer Preview入門
    http://www.slideshare.net/akirahatsune/kinect-for-windows-v2developer-preview
  4. 初音玲の流儀 - なんでプログラミングしているの?
    http://www.slideshare.net/akirahatsune/msp-lt-hatsune
  5. TMCN tech-cafe Vol.01 Day3資料
    http://www.slideshare.net/akirahatsune/tmcn-techcafe-vol01-day3
  6. ストアアプリ →universal Windows Apps =WP8.1アプリ
    http://www.slideshare.net/akirahatsune/universal-windows-appswp81
  7. AEDオープンデータアプリ
    http://www.slideshare.net/akirahatsune/aed-36502419
  8. エフサミ2014 - Kinect2で未来をつかむ
    http://www.slideshare.net/akirahatsune/kinect2-36953401
  9. Microsoftテクノロジーが支えるAEDオープンデータプラットフォーム
    http://www.slideshare.net/akirahatsune/microsoftaed
  10. モバイルがモーションセンサーに 出会ったら
    http://www.slideshare.net/akirahatsune/ss-38750138
  11. KinebrickEV3におけるスタイリッシュモーションの取り組み
    http://www.slideshare.net/akirahatsune/20140924-ted-hatsune
  12. Xamarinでアプリを作ったときのエトセトラ
    http://www.slideshare.net/akirahatsune/20141018-hatsune
  13. MA10 Tokyo#2 AED検索
    http://www.slideshare.net/akirahatsune/ma10-tokyo2-aed
  14. MA10 Tokyo#2 東北さくらトリップ
    http://www.slideshare.net/akirahatsune/ma10-tokyo2
  15. Kinect v2 からUSBでつないだ機器をコントロールしてみよう Vol.1
    http://www.slideshare.net/akirahatsune/kinect-v2-usb-vol1
  16. Open Fab Night Sensor Special - Android編
    http://www.slideshare.net/akirahatsune/open-fab-night-sensor-special-android
アプリ(初版リリース)
  1. AEDオープンデータプラットフォーム(AEDオープンデータAPI)
    http://hatsunejournal.jp/w8/AEDOpendata/
  2. AED検索 for Windows 8
    http://apps.microsoft.com/windows/app/aed/80f3b639-4e00-4748-ba71-64afafb90a4a
  3. 東北さくらトリップ for Windows 8
    http://apps.microsoft.com/windows/app/e35a3203-6b5a-47fb-8ea7-765ccf4a5dc9
  4. AED検索 for Windows Phone 8
    http://www.windowsphone.com/s?appid=7784b242-cd45-4e73-88e2-86dd10c2e6d2
  5. KinebrickEV3
    http://apps.microsoft.com/windows/app/kinebrickev3/77770be7-3c73-4bab-ba90-c29a5344c06e
サンプルコード(初版リリース)
  1. 2014/01/11 https://code.msdn.microsoft.com/Kinect-for-Windows-v2-d1bb68ec
  2. 2014/01/14 https://code.msdn.microsoft.com/Kinect-for-Windows-v2-2b5842b9
  3. 2014/09/04 https://code.msdn.microsoft.com/AED-Opendata-Search-Sample-117dfafc
  4. 2014/11/16 https://code.msdn.microsoft.com/Kinect-v2-USB-step01-6691d144
登壇
  1. 2014/03/15 組み込みとNUI を1日たっぷり勉強する会(初心者、未経験者歓迎)
  2. 2014/03/18 MVP Community Camp 2014 オンライン登壇
  3. 2014/03/22 MVP Community Camp 2014 東京会場登壇
  4. 2014/03/30 MVP&MSP Dev Camp
  5. 2014/04/23 TMCN tech-cafe Vol.01
  6. 2014/05/10 Windows Phone ARch in Tokyo #03
  7. 2014/05/17 //publish/ハッカソン
  8. 2014/07/12 エフサミ2014
  9. 2014/08/08 NSStudy #3 Microsoftテクノロジーが支えるAEDオープンデータプラットフォーム
  10. 2014/09/05 Developer Sumit 2014 in Kansai - モバイルが モーションセンサーに 出会ったら
  11. 2014/09/24 東京エレクトロンデバイス株式会社主催 Kinect for Windows v2最新情報セミナー
  12. 2014/10/01 Tokyo MotionControl Network Vol.09 with Windows女子部
  13. 2014/10/18 わんくま東京勉強会#92
  14. 2014/11/14 みんなで作る!センサー&デバイス製作体験!?LEGO Mindstorm EV3ハンズオン vol.01
  15. 2014/11/26 みんなで作る!センサー&デバイス製作体験!?LEGO Mindstorm EV3ハンズオン vol.02
  16. 2014/12/05 Open Fab Night Sensor Special
  17. 2014/12/14 ハッカソンをハックする
Web記事
  1. 2014/01/24 新型Kinectの骨格データに関する新機能とは?
    http://www.buildinsider.net/small/kinect2dp/03
  2. 2014/03/28 世界最速・最新情報、March SDK Update(Kinect for Windows v2 Developer Preview)の内容に迫る!
    http://www.buildinsider.net/small/kinect2dp/04
  3. 2014/05/08 Windowsストアアプリ対応に、Unityサポートも ― 最新April SDK Update(Kinect for Windows v2 Developer Preview)の新機能
    http://www.buildinsider.net/small/kinect2dp/05
  4. 2014/07/10 Kinect.Xaml.ControlsでストアアプリからKinectを操作する
    http://www.buildinsider.net/small/kinect2dp/06
  5. 2014/07/10 日本最速レビュー。開発者目線で調査する「Kinect for Windows v2」パブリックプレビュー版
    http://www.buildinsider.net/small/kinect2dp/07
  6. 2014/01/09 「LEADTOOLS」を使ってKinectから取得した距離データを可視化しよう
    http://codezine.jp/article/detail/7573
  7. 2014/02/18 「LEADTOOLS」を使ってWindowsストアアプリに画像処理機能を実装しよう
    http://codezine.jp/article/detail/7610
  8. 2014/03/04 ComponentOne Studioで他のWindowsストアアプリと差別化しよう
    http://codezine.jp/article/detail/7660
  9. 2014/04/03 ComponentOne Studioのラジアルメニューを使いこなそう
    http://codezine.jp/article/detail/7715
  10. 2014/04/30 手の位置をチャートで可視化しよう
    http://codezine.jp/article/detail/7753
  11. 2014/05/30 噂のユニバーサルWindowsアプリにComponentOne Chartを使ってみよう
    http://codezine.jp/article/detail/7798
  12. 2014/07/10 Doc-To-Helpを活用した手を抜かないヘルプファイルの手抜き術
    http://codezine.jp/article/detail/7878
  13. 2014/08/11 軽量な表形式コンポーネントFlexGridでタッチ対応業務アプリを構築する
    http://codezine.jp/article/detail/7957
  14. 2014/09/25 ComponentOne Studioの地図コンポーネント+オープンデータでマッシュアップしよう
    http://codezine.jp/article/detail/8118
  15. 2014/10/20 Bing Mapsよりも使いやすい? ComponentOne Studioの地図コンポーネントでストアアプリを作ろう
    http://codezine.jp/article/detail/8188
  16. 2014/11/28 日本の帳票文化のWeb化に真正面から取り組んだらこうなった~Excel方眼紙イメージのWebアプリ作成ツール「Forguncy」
    http://codezine.jp/article/detail/8306

posted @ 2014/12/15 12:31 by 初音 玲