2014年9月19日金曜日

Reactive Extensions for .NET (Rx) 入門その1

いろんなサイトを見ても良く分からなかく避けていたのですが、
最近になってRxのカケラのようなものが分かってきたのでまとめておきます。
前提知識としてLinQの使い方が分かっていないと理解が難しいと思います。

・Rxについて
 まず、Rxとは何?ですが、
どのサイトでも紹介されているようにIEnumerable「Pull型」の反対がObservable「Push型」にあたります。
何をPush?Pull?かというと、これはデーターフローの事で
与えられた入力データを引っ張る、もしくは押していくかの違いになります。
 ここで出てきたPull型とPush型については以下のとおりです。

・Pull型とは
 ある空間からデータを引っ張ってくる(戻り値で受け取る)イメージです。まさにforeachがそれ。

例: 配列から1つ値を引っ張ってきて処理する。
var query = new List() { 1, 2, 3, 4, 5 }.Select(i => { return i; });
foreach(var i in query)
{
  Console.WriteLine(i); //ひっぱってきた値を処理する。
}

・Push型とは
 得られたデータを左から右へと押していく、一言で言えばメソッドチェーン。
 しかもインターフェイスがObservableが同一であれば自在に操作ができる。

例: 値を左から右へ伝播させて処理する。
var query = Observable.Range(1, 5);
query.Subscribe(i => { Console.WriteLine(i); }); //伝播されてきた値を処理する。

2つは似ていても入力データの処理方法が異なる事が分かったでしょうか。
もう1つ大きな違いは、
Pull型は値を引っ張ってきて同メソッド内で処理を行いますが、
Push型は、Observerがこんな入力データが来ましたよと、(丸投げ)通知するので、実質処理は外側にいるクラスで行います。


入力データにフィルタを書けたり加工したりするのはLinQ機能で実現できるので、
応用処理はどちらも同じくらい広がりますね。

最後に
 データと処理を一箇所にまとめてコンパクトにしたい場合はIEnumerableが得意とされ
 データと処理を分離して、1つのデータで異なる処理をまとめて実行したい場合はObserverbleが得意とされるようです。


次回はもう少し実例を使って違いを見比べてみたいと思います。

2014年8月3日日曜日

LINEの裏技

人気になっているLINEアプリでどんな裏技があるか調べてみた。
 NAVERまとめ
http://matome.naver.jp/odai/2134693530669110101

・LINEでブロックされているか正確に知る方法
 ブロックされていなければ、スタンプがプレゼントできる。

・既読をつけないでトークを読む
 メッセージ受信した後に、機内モードに切り替えるとネットワークに繋がらない状態になるので、機内モードにしてからメッセージを開く。
 ネットワークが繋がると既読が付いてしまうので、LINEアプリを終了してから機内モードをOFFにする。
 LINEアプリを起動するまで未読状態が続く。

・LINEを起動せずにメッセージを読む
 通知設定をONにしておくとプッシュ通知される。

・文章の最初にある記号をつけると太字になる
 先頭に半角の*を付けると太字になる。

・トークの背景画像を変更する
 トークの背景画像を変更するには、「設定 > トークルーム設定 > 背景デザイン」から変更する。デフォルトの背景かアルバムから選べる。その場でカメラで撮った写真も設定可能。

・知らない人からのID検索をブロックする
 設定 > プロフィール > 「IDの検索の許可」をオフにする(もしくはチェックボックスを外す)

・自分のLINEアカウントをURLにして相手に知らせる
 「QRコード > QRコード表示」

・LINE 通訳機能を使う
 トーク中に、日本語⇔英語、日本語⇔中国語、日本語⇔韓国語の同時通訳が可能

・LINE お天気を使う
 ”友だち追加”から「LINEお天気」を友だちに追加

Microfost Office (2010 / 2013)の試用期限をリセットする方法


①猶予期間のリセットには管理者権限が必要なので、
[すべてのプログラム]→[アクセサリ]→[コマンドプロンプト]を右クリックして、
[管理者として実行]を選択

②ライセンス認証フォルダに移動
>cd  ¥Program Files¥Common Files¥Microsoft Shared¥OfficeSoftwareProtectionPlatform

 Office2013の場合は、
  C:\Program Files (x86)\Microsoft Office\Office15
③ライセンス猶予期限のリセット
>ospprearm.exe
と入力すると、
「Microsoft Office rearm successful.」等と表示される
この方法は5回まで可能。

イメージを取得するまで、Office アプリケーションを開いたり、ospp.vbs を実行したり
しないでください。KMS ホストを使用して Office 2010 のライセンス認証を行わない限り、
5 回まで猶予期限をリセットできます。猶予期限のリセット回数が足りなくなった場合は、
KMS ホストを使用してライセンス認証を行うことによって、猶予期限を 1 回リセットできます。

http://technet.microsoft.com/ja-jp/library/cc178964.aspx


こういったアプリは、アンインストールしたいのにレジストリか何か変更を加えたままにしてしまい、気持ち悪いので、完全アンインストールするアプリというのもある。
どんなソフトでも完全にアンインストールできるアプリ

どんなソフトでも完全にアンインストールできるアプリ

このアプリをインストールしてから

評価版のソフトウェアをインストールしたりなんかするとパソコンに何か書き換えた情報を残してを完全に消えてくれないのでいつもモヤモヤする人におススメアプリである。

Comodo Programs Manager

このソフトは日本語には対応してないけども、使い方さえ覚えておけばいいので、メモを残しておく。

1.インストール
 Comodo Programs Manager
 をダウンロードして、言語はEnglishを選択してインストールする。
 途中EMailの入力が求められるが、これは任意なので入力せずNextを押してインストールを終わらせて再起動する。

2.任意のソフトを完全アンインストール方法
 デスクトップ上にあるCOMODO Programs Managerを起動する。
 左側のメニューからProgramsを選択すると、インストーラでインストールしたソフトウェア一覧が表示される。
 この中からアンインストールしたいソフトウェアを選ぶと、
  COMODO Programs Managerを
    インストール前に入れたソフトはStandard Uninstaller
    インストール後に入れたソフトはComplate Uninstaller

 というように表示が異なるが、
 Standard Uninstallerの場合は、通常アンインストーラーが起動して、
 Complate Uninstallerの場合は、変化したレジストリなどをスキャンが始まるが、スキャン完了後にComtinueを押せばOK。

2014年7月30日水曜日

テキストで作れるUML「PlantUML」

テキストで書けるUMLを見つけた。 http://plantuml.sourceforge.net/ 最終的にはdoxygenなどに埋め込んでドキュメント化ができるみたいだけど、 書き方になれるまでは専用エディタを使ってからのがよさそうだ。 https://code.google.com/p/plantumleditor/ こういうツールってソースコードを最初に書いて、 最後にできたものが設計書になるという便利なものだが 忘れがちになるのが設計フェーズを飛ばしてコーディングからスタートして 作り直しが発生して最終成果物がアウトプットされるまでにかかる時間コストが 増えてしまいがちになるので、設計はコーディングとは別作業にすべきと思う。

2014年7月1日火曜日

XML電文の解析、作成方法

XML電文のやり取りを行う方法。 Modelクラスを作ってシリアライズ、デシリアライズを行って、 パースエラーの例外を受信エラーとすればよい。
            model obj = new model();
            obj.id = 1;
            obj.name = "test";
            obj.param = new List();
            obj.param.Add(new data() { pos = 0, vol = 0 });
            obj.param.Add(new data() { pos = 1, vol = 1 });
            XmlSerializer serializer = new XmlSerializer(typeof(model));
            using(var fs = new FileStream(@"c:\temp\test.xml", FileMode.Create, FileAccess.Write))
            using(var sw = new StreamWriter(fs, Encoding.GetEncoding(932)))
            {
                serializer.Serialize(sw, obj);
            }
            using (StreamReader sr = new StreamReader(@"c:\temp\test.xml"))
            {
                model _model = (model)(serializer.Deserialize(sr));
            }
XML電文
<?xml version="1.0" encoding="shift_jis"?>
<model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <id>1</id>
  <name>test</name>
  <param>
    <data>
      <pos>0</pos>
      <vol>0</vol>
    </data>
    <data>
      <pos>1</pos>
      <vol>1</vol>
    </data>
  </param>
</model>

2014年5月10日土曜日

rasbbery pi で音を鳴らす

組込み用途で使用する時って画面が無いから、起動シーケンスが終わった後にピーってビープ音か何か欲しくなるので調べてみた。

1.まず必要なユーティリティーをインストール。
$ sudo apt-get install -y alsa-utils mpg321 lame mplayer


2.snd-bcm2835が入っているかチェックする。
$ lsmod

入ってなければ
>sudo modprobe snd-bcm2835


3.鳴らすポートの選択。今回はアナログを選んだ。
$ numid= { 0=auto, 1=analog, 2=hdmi }

$ amixer cset numid=3 1


4.音が鳴るか確認。

サイン波
$ speaker-test -t sine -f 440 -c 2 -s 1

Wav音源
$ wget http://www.jahozafat.com/0093058674/WAVS/Movies/Full_Metal_Jacket/numnuts.wav

MP3音源
$ wget http://www.hmix.net/music/c/c3.mp3
$ mpg321 c3.mp3


M4A音源
$ mplayer test.m4a



 5.ボリューム調整
$ amixer cset numid=1 -- 80%


6. WAV→MP3変換をしてみる
$ lame numnuts.wav numnuts.mp3


おもちゃみたいな基板から音楽が流れるとちょっとだけ感動する。。

 
参考サイト
http://jeffskinnerbox.wordpress.com/2012/11/15/getting-audio-out-working-on-the-raspberry-pi/



2014年5月2日金曜日

SPI通信の導入式

SPI通信で遅れて1ビットずれてしまい、1日悩んだ。SPI通信の仕様をちゃんと読まなかったからだ。

今回はちゃんと読んで理解した内容を忘れないようにメモを残しておく。

覚えておくこと。
・マスター・スレーブ間の通信である。(当たり前)
・配線は5本、CLK、MISO、MOSI、CE、GND
・MISO(Master In Slave Out)、
・MOSI(Master Out Slave In)

スレーブ側はIC仕様によって異なるので、例としてL6470の場合、

  →立上りで入力(MISO)
  →立下りで出力(MOSI)

という仕様である。
これを端子名 MISO、MOSIと書いた部分に注目!
MasterとSlaveは入出力が反対になるのがSPIの特徴である。

ディジーチェーン2つ繋いだ構成でSPI通信を行うとき
4バイト送ったら最初の2バイトがマスターに届けられてないといけない。

これを考えると、クロックのタイミングは
 MISO、MOSI MISO、MOSI MISO、MOSI MISO、MOSI、、、、

こういう順番と

 MOSI、MISO、 MOSI、MISO、 MOSI、MISO、 MOSI、MISO、、、、

どっちが正しいか。

考えれば最後に出力になっていないと、前者だと1ビット欠落してしまう状態になる。(←ここではまった)

要するにCLKの論理は、スレーブの仕様によって決まって、
 マスターのデータ取り込みタイミングは、MISOになるように設定する。

L6470の例だと、
 ・データを取り込み(MISO)は立ち上がり
  ・MISOが最後にした場合、CLKエッジはHIGHで終わるので負論理(^CLK)

波形が乗っているサイトの見てみると、
https://www.diolan.com/dln_doc/spi-transfer-modes.html

CPOL=CLKエッジ最後の状態 ・・・ HIGHなので CPOL=1
CPHA=CLK取り込み開始状態 ・・・ HIGH(HIGH→LOW)なのでCPHA=1
 
Mode=|CPOL|CPHA|のビットアサインなので、


Mode=11 =(3) Mode=3

2014年4月30日水曜日

[Win7][Win8]インターネット接続の共有のIPアドレスの設定方法

インターネット接続の共有で設定されるIPアドレスを変えようと思って調べたら
WinXP時代とはレジストリの配置が異なっているので気をつけないといけないようだ。


[XPまで]
 Hkey_Local_Machine\System\CurrentControlSet\Services\ICSharing\Settings\General

[XP以降]
 Hkey_Local_Machine\System\CurrentControlSet\services\SharedAccess\Parameters

 名前がわかりやすくなったのだけど、なかなか気づけないよこれは。

 以下引用
-----

ホストとの接続の共有ホストの DHCP サービスで使用される IP アドレスの範囲に割り当てられている IP アドレスを変更するにはレジストリ エディターを使用して、次の値を変更します。これらの値は、次のフォルダーに配置されます。
HKLM\System\CurrentControlSet\services\SharedAccess\Parameters

    (REG_SZ)ScopeAddress
    (REG_SZ)StandaloneDhcpAddress

ScopeAddress 値は接続の共有で使用するアドレスの範囲を設定します。StandaloneDhcpAddress 値は、SoftAP と仮想の Wi-Fi が有効になっているときに使用されるアドレスの範囲です。両方の値をネットワーク マスク 255.255.255.0 を使用しは構成できません。

----

参考元URL: http://support.microsoft.com/kb/230148/ja

2014年4月23日水曜日

skypeの広告を消す方法

Skypeを起動して、

 表示→コンパクトビューをクリック。

 ツール→設定→通知→アラート&メッセージ→メッセージを表示の2個のチェックボックスを外す→Skype再起動

インターネットオプションを開いて、
 セキュリティ→制限付きサイト→サイト→[https://apps.skype.com]を追加。

以下のテキストを書いたバッチファイルを作成して管理者として起動する。
 echo 127.0.0.1 cdn.adnxs.com>> C:\Windows\System32\drivers\etc\hosts
 echo 127.0.0.1 m.adnxs.com>> C:\Windows\System32\drivers\etc\hosts
 echo advertising.jp.msn.com>>  C:\Windows\System32\drivers\etc\hosts


これで画面がすっきりする。

更新
2015.04.01

エイプリルフールだけど気にしないで!

広告枠も削除する方法が乗っていたので追記。

C:\users\(ユーザー名)\AppData\Roaming\Skype\(アカウント名)\config.xml

を開いて

<AdvertPlaceholder>1</AdvertPlaceholder>

行を削除する。

これでおk。

---

Control Panel -> Internet Options -> Security -> Restricted Sites -> Sites -> add g.msn.com and apps.skype.com

Also, to remove the ad placeholder, go to your 
C:\users\youruser\AppData\Roaming\Skype\yourskypeuser\config.xml

and find the line 1

<AdvertPlaceholder>1</AdvertPlaceholder>

and remove the line completely

---


2014年4月14日月曜日

VB.NET LinqでGroupByの使い方

いつも使い方を忘れるのでメモ。 サンプルは、List型の配列、Dictionary型でGroupByする時の例。
    Public Class pmodel
        Public key As Integer = 0
        Public dat As String = ""

        Public Sub New(k As Integer, d As String)
            key = k
            dat = d
        End Sub
    End Class
    Private models As New List(Of pmodel)
    Private dic As New Dictionary(Of Integer, pmodel)


    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        models.Clear()
        models.Add(New pmodel(0, "A"))
        models.Add(New pmodel(0, "B"))
        models.Add(New pmodel(1, "C"))
        models.Add(New pmodel(2, "D"))
        models.Add(New pmodel(5, "E"))
        Dim dat1() As IGrouping(Of Integer, pmodel) = models.GroupBy(Function(zz As pmodel) zz.key).ToArray()
        For Each dat As IGrouping(Of Integer, pmodel) In dat1
            For Each d In dat
                Console.WriteLine(String.Format("key={0}, k={1}, v={2}", dat.Key, d.key, d.dat))
            Next
        Next
''' >>>key=0, k=0, v=A
''' >>>key=0, k=0, v=B
''' >>>key=1, k=1, v=C
''' >>>key=2, k=2, v=D
''' >>>key=5, k=5, v=E
''' 

        dic.Clear()
        dic(0) = New pmodel(0, "AA")
        dic(1) = New pmodel(1, "AA")
        dic(2) = New pmodel(2, "BB")
        dic(3) = New pmodel(3, "CC")
        dic(5) = New pmodel(5, "DD")

        Dim dat2() As IGrouping(Of String, pmodel) = dic.Values.GroupBy(Function(d As pmodel) d.dat).ToArray()
        For Each dat As IGrouping(Of String, pmodel) In dat2
            For Each d In dat
                Console.WriteLine(String.Format("key={0}, k={1}, v={2}", dat.Key, d.key, d.dat))
            Next
        Next

    End Sub
''' >>>key=AA, k=0, v=AA
''' >>>key=AA, k=1, v=AA
''' >>>key=BB, k=2, v=BB
''' >>>key=CC, k=3, v=CC
''' >>>key=DD, k=5, v=DD

2014年3月29日土曜日

INotifyPropertyChangeとINotifyDataErrorInfoの実装方法

 .Net技術者であればViewModelを実装するときに必ず書かなくてはいけないINotifyPropertyChangeプロパティ。出来れば書きたくない、.netが勝手にやってくれてもいいんだよと思う部分を少しでも楽にならないかと考えてみた。

まずは、データーフローから考えてみると
値の変更→データチェック→通知
 OK => INotifyPropertyChange
 NG => INotifyDataErrorInfo
という流れで実装する場合、

set {
    if (validation(value)) {
        //INotifyPropertyChange
    }else{
        //INotifyDataErrInfo
    }
}
この辺りは共通処理になるからここをModelBaseクラスという形で実装しておき、
あとはSetProperty関数を用いて上記処理を処理させようというアプローチである。
過去にもModelがらみの記事に書いた
MongoDBと接続、もしくはJSonファイルに出力する方法にも使えるようにしておいた。


実装方法はModelBaseクラス内でNotify関連を実装してそれを任意のModelクラスに継承するやり方。

Imports System.ComponentModel
Imports MongoDB.Driver
Imports MongoDB.Driver.Builders
Imports MongoDB.Driver.Linq
Imports MongoDB.Bson
Imports MongoDB.Bson.Serialization.Attributes

'http://blog.micic.ch/net/easy-mvvm-example-with-inotifypropertychanged-and-inotifydataerrorinfo
Public Class ModelBase : Implements INotifyPropertyChanged, INotifyDataErrorInfo
#Region "data error"
    Private _errors As New Dictionary(Of String, List(Of String))
    Public Event ErrorsChanged(sender As Object, e As DataErrorsChangedEventArgs) Implements INotifyDataErrorInfo.ErrorsChanged
    Public Function GetErrors(propertyName As String) As IEnumerable Implements INotifyDataErrorInfo.GetErrors
        If _errors.ContainsKey(propertyName) Then
            Return _errors(propertyName)
        End If
        Return Nothing
    End Function
    Public ReadOnly Property HasErrors As Boolean Implements INotifyDataErrorInfo.HasErrors
        Get
            Return 0 < _errors.Count
        End Get
    End Property
    Public ReadOnly Property IsValid As Boolean
        Get
            Return Not HasErrors
        End Get
    End Property
    Private Sub AddError(propertyName As String, errmsg As String)
        If Not _errors.ContainsKey(propertyName) Then
            _errors(propertyName) = New List(Of String)
        End If
        If Not _errors(propertyName).Contains(errmsg) Then
            _errors(propertyName).Add(errmsg)
            RaiseEvent ErrorsChanged(Me, New DataErrorsChangedEventArgs(propertyName))
        End If
    End Sub
    Private Sub RemoveError(propertyName As String)
        If _errors.ContainsKey(propertyName) Then
            _errors.Remove(propertyName)
            RaiseEvent ErrorsChanged(Me, New DataErrorsChangedEventArgs(propertyName))
        End If
    End Sub
#End Region
#Region "Property changed"
    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
#End Region
#Region "Set Property"
    Private _lock As New Object()
    Protected Delegate Function DlgCheckValidation() As String
    Protected Sub SetProperty(Of T)(propertyName As String, ByRef field As T, value As T, func As DlgCheckValidation)
        If Not EqualityComparer(Of T).Default.Equals(field, value) Then
            SyncLock _lock
                Dim errmsg = ""
                If Not IsNothing(func) Then
                    errmsg = func()
                End If
                If "" = errmsg Then
                    field = value
                    RemoveError(propertyName)
                    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
                Else
                    AddError(propertyName, errmsg)
                End If
            End SyncLock
        End If

    End Sub
#End Region
End Class



<BsonIgnoreExtraElements>
Public Class AddressModel : Inherits ModelBase
    <BsonId>
    <DisplayName("ID")>
    Public Property _id As BsonObjectId

    Private _name As String
    Private _birthday As Date
    Private _emailAddress As List(Of EMailModel)

    <DisplayName("名前")>
    Public Property name As String
        Get
            Return _name
        End Get
        Set(value As String)
            SetProperty("name", _name, value,
                Function() As String
                        If "abc" = value Then
                            Return "abc not allowed"
                        End If
                        Return ""
                    End Function)
        End Set
    End Property

    Public Property Birthday As Date
        Get
            Return _birthday
        End Get
        Set(value As Date)
            SetProperty("Birthday", _birthday, value, Nothing)
        End Set
    End Property
    Public Property EMailAddress As List(Of EMailModel)
        Get
            Return _emailAddress
        End Get
        Set(value As List(Of EMailModel))
            SetProperty("EMailAddress", _emailAddress, value, Nothing)
        End Set
    End Property

End Class

<BsonIgnoreExtraElements>
Public Class EMailModel : Inherits ModelBase
    Private _DisplayName As String
    Private _MailAddress As String

    Public Property DisplayName As String
        Get
            Return _DisplayName
        End Get
        Set(value As String)
            SetProperty("DisplayName", _DisplayName, value, Nothing)
        End Set
    End Property
    Public Property MailAddress As String
        Get
            Return _MailAddress
        End Get
        Set(value As String)
            SetProperty("MailAddress", _MailAddress, value, Nothing)
        End Set
    End Property
End Class




参照サイト:
http://ivis-mynikki.blogspot.jp/2013/01/net-or.htmlhttp://ivis-mynikki.blogspot.jp/2014/03/blog-post.html
http://blog.micic.ch/net/easy-mvvm-example-with-inotifypropertychanged-and-inotifydataerrorinfo
 
 
 

はじめてのVB.NetでMongoDBの使い方

前から使いたかったMongoDB。
サービス登録ってどうやるの?.netだと使い勝手悪いんじゃ?など
色々と調べる事があるから使わないでMSSQLやテキストファイルの
CSV,JSONで十分じゃんって自分に言いきかせて触らずにいたのだが
こういったデータは複数のプログラムでリアルタイムに更新したかったりするので
今回本気に使ってみることにした。

まず覚えなくてはいけない事。
 1.MongoDBをダウンロードすること。
 2.DB、LOGフォルダを用意すること。
 3.サービス登録しておくこと。
 4.VisualStudioのNugetで「Official MongoDB C# Driver」をインストールすること。(Apache2.0ライセンス)
 5.ライブラリの使い方、DBの接続方法、データの追加、削除、更新を覚えること。

1,2,3まではやる気さえあればできそうで
4,5になると開発環境を起動したりコードを書いたりしなきゃならないので遠ざかりたくなるけど、使いたいという思いでどうにか乗り切るしかなさそう。
なるべく手順をまとめると、

Step1. MongoDBのダウンロード、DB、LOGフォルダの用意、サービス登録を行う。

  http://www.mongodb.org/

上記公式サイトからMongoDB本体をダウンロードしてきて任意の場所に展開する。
そしてダウンロードしながらどこかにDB、LOGフォルダを用意してから
管理者権限でコマンドプロンプトを開く。

今回は
 d:\tool\mongodb       MongoDB展開フォルダ
 d:\tool\mongodb\bin\log  Logフォルダ
 d:\tool\mongodb\bin\db  DBフォルダ

というようにした場合、下記コマンドを入力する。

>cd \tool\mongodb\bin
>mongod --install --dbpath .\db --logpath .\log\log.txt

サービス解除する時は --install を --remove にすればOK。

Step2.使い方を覚える

 まずは、VisualStudioを起動してソリューションを1つ作ってから
Nugetで「Official MongoDB C# Driver」をインストール。

あとはコーディング。


Imports MongoDB.Driver
Imports MongoDB.Driver.Builders
Imports MongoDB.Driver.Linq
Imports MongoDB.Bson
Imports MongoDB.Bson.Serialization.Attributes


Class MainWindow
    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        'MongoDBサーバーに接続して、操作するコレクションを選択。
        Dim mongo_drv = New MongoClient()
        Dim db = mongo_drv.GetServer().GetDatabase("TestDB")
        Dim col = db.GetCollection(Of AddressModel)("AddressCollection")

        'サンプルデータの追加
        col.Insert(New AddressModel() With {
            .Name = "test1",
            .Birthday = Date.Parse("1980/12/5"),
            .EMailAddress = New List(Of EMailModel)() From {
                New EMailModel With {.DisplayName = "test1", .MailAddress = "mail1@test.com"},
                New EMailModel With {.DisplayName = "test2", .MailAddress = "mail2@test.com"}
            }
        })
        col.Insert(New AddressModel() With {
            .Name = "test1",
            .Birthday = Date.Parse("1981/12/5"),
            .EMailAddress = New List(Of EMailModel)() From {
                New EMailModel With {.DisplayName = "test3", .MailAddress = "mail3@test.com"},
                New EMailModel With {.DisplayName = "test4", .MailAddress = "mail4@test.com"}
            }
        })

        'MondoDBサーバー切断
        mongo_drv.GetServer().Disconnect()
    End Sub

    Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
        'MongoDBサーバーに接続して、操作するコレクションを選択。
        Dim mongo_drv = New MongoClient()
        Dim db = mongo_drv.GetServer().GetDatabase("TestDB")
        Dim col = db.GetCollection(Of AddressModel)("AddressCollection")

        'LINQで検索
        For Each model In (From t In col.AsQueryable() Where t.Name.StartsWith("test") Select t)
            Console.WriteLine("--------")
            Console.WriteLine(model.Name)
            Console.WriteLine(model.Birthday)
            For Each emodel In model.EMailAddress
                Console.WriteLine(emodel.DisplayName)
                Console.WriteLine(emodel.MailAddress)
            Next
            Console.WriteLine("--------")
        Next

        'MondoDBサーバー切断
        mongo_drv.GetServer().Disconnect()
    End Sub

    Private Sub Button_Click_2(sender As Object, e As RoutedEventArgs)
        'MongoDBサーバーに接続して、操作するコレクションを選択。
        Dim mongo_drv = New MongoClient()
        Dim db = mongo_drv.GetServer().GetDatabase("TestDB")
        Dim col = db.GetCollection(Of AddressModel)("AddressCollection")

        'LINQで検索、該当項目の日付を更新する(GMTがまちがってそう。。)
        For Each model In (From t In col.AsQueryable() Where t.Name.StartsWith("test") Select t)
            model.Birthday = Date.Now
            col.Save(model)
        Next

        mongo_drv.GetServer().Disconnect()
    End Sub

    Private Sub Button_Click_3(sender As Object, e As RoutedEventArgs)
        'MongoDBサーバーに接続して、操作するコレクションを選択。
        Dim mongo_drv = New MongoClient()
        Dim db = mongo_drv.GetServer().GetDatabase("TestDB")
        Dim col = db.GetCollection(Of AddressModel)("AddressCollection")

        'LINQで検索、該当項目の削除
        For Each model In (From t In col.AsQueryable() Where t.Name.StartsWith("test") Select t)
            col.Remove(Query.EQ("_id", model._id))
        Next

        mongo_drv.GetServer().Disconnect()
    End Sub
End Class


Public Class AddressModel
    
    Public Property _id As BsonObjectId
    Public Property Name As String
    Public Property Birthday As Date
    Public Property EMailAddress As List(Of EMailModel)

End Class


Public Class EMailModel
    Public Property DisplayName As String
    Public Property MailAddress As String
End Class



日付の扱いがちょっとGMTがらみの調整が必要かもしれないけど、ひとまず使えるようになったのでここまで。


Androider