2013年1月23日水曜日

.NET 軽量ORマッパー


.NETでORマッパー関連が充実していなくて困った。
.NET標準のADO.net Entity frameworkを使えばモデリングからある程度自動生成してくれるが、
pythonのdjangoのORマッパーを味わってしまうとめんどくさい。。
Ironpythonを使って、メイン言語をPythonにして画面だけWPFにしようとも考えたけど、これもめんどくさい。。

MySQLなど大規模なファイルでない、ちょっとしたパラメータをファイルに保存しておきたいだけなのに、どうしたものか。
探しても無いから自分でJson形式なORマッパーを作ってみた。

仕様は、
 ・データ保存形式は、 jsonを使用。
 ・ORマッパーでModelクラス経由でアクセス。
 ・検索機能は、Linqを使う。

これだけで十分と思う人向け。


Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json
Imports System.ComponentModel
Imports System.IO

Public Class BookModel
    <displayname("書籍名")>
    Public Property Name As String = ""
    <displayname("バーコード")>
    Public Property BCode As String = ""
    <displayname("ページ数")>
    Public Property Pages As Integer = 0
    <displayname("価格")>
    Public Property Price As Integer = 0

    Public Sub New(ByVal name As String, ByVal bcode As String, ByVal pages As Integer, ByVal price As Integer)
        With Me
            .Name = name
            .BCode = bcode
            .Pages = pages
            .Price = price
        End With
    End Sub
End Class

Class BookCollection : Implements IListSource
    Public Property models As New List(Of BookModel)
#Region "IListSource"
    Private bindsrc As New BindingSource
    Public ReadOnly Property ContainsListCollection As Boolean Implements IListSource.ContainsListCollection
        Get
            Return False
        End Get
    End Property
    Public Function GetList() As IList Implements IListSource.GetList
        bindsrc.DataSource = models
        Return bindsrc
    End Function
#End Region
#Region "ファイル操作"
    Public Sub Save(ByVal fname As String)
        Dim json As String = JsonConvert.SerializeObject(models)
        File.WriteAllText(fname, json)
    End Sub
    Public Sub Load(ByVal fname As String, typ As Type)
        Dim json As String = File.ReadAllText(fname)
        json = json.Replace(vbTab, "").Replace("\", "\\")
        models = JsonConvert.DeserializeObject(Of List(Of BookModel))(json)
        bindsrc.ResetBindings(False)
    End Sub
#End Region
End Class
使い方例:
        'データ定義
        Dim bc As New BookCollection()
        bc.models.Add(New BookModel("書籍1", "4987185712345", 100, 100))
        bc.models.Add(New BookModel("書籍2", "4987185712346", 110, 200))
        bc.models.Add(New BookModel("書籍3", "4987185712347", 120, 300))

        '保尊
        co.Save("d:\test.json")

        '読込
        co.Load("d:\test.json", rack.GetType())

        '条件検索
        Dim filter = From x In bc.models Where x.Price >= 200 Select x
        For Each model As BookModel In filter
            Console.WriteLine(model.Name)
        Next

        'DataGridViewで表示する
        DataGridView1.DataSource = co.models
        DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
機能拡張など、こうしたら良いなどアイデアがあれば教えてください。

2013年1月21日月曜日

つるとんたん新宿店

つるとんたん
http://www.tsurutontan.co.jp/



坂本龍の番組だったか
カトープレジャー グループの社長が出演していた回の放送をみて知ったお店である。

番組内で「わざわざ来てくれるお店」を作るのがやり方のようで、
どんなお店か行ってみた。


行ってきた場所は、つるとんたん新宿店。

歌舞伎町方面、元コマ劇場があった所から1本奥の通りを右方向に進むと、地下1階にお店があった。






内装はまるで、キャバクラをうどん店へ改装した感じの作りになっていて、
カウンター席は、ディズニーのホンデットマンションの椅子みたいなでっかい椅子で二人が座れる席。
テーブル席もいくつかあるが、席に座ってる人達を見てみると器が通常の2倍サイズくらいあって迫力満点。
15時頃に入ったときは空いていたのか、20分くらい待って、さっそく案内されて注文したのはコレ。


釜揚げうどん。これにアナゴとネギトロ丼を頼んでみた。

注文した時に聞いたのだが、替え玉が3回まで無料でOKみたい。


さっそく食べてみた感想。
麺はつるつるで太麺の讃岐うどん。
味はシンプルかなー。一緒に行った人のも食べてみたけど同じ感想。
でもお店の内装や器、いろんな所は他のうどん屋に無いね。かなり個性的。
夜はライブもやるみたいなので、行列間違いなしだと思う。


個人的にうどんなら三国一!

C#とipythonでDjango

VS2012 Professional版使っていれば、PTVSをインストール、
VS2012 express版でも別途shellをインストールすれば済む話じゃないかっという話だけど、
今回は自力でやってみる方法を選んでみた。

 1.インストール
  ironpython、easy_installなど必要なものを順次インストールしていく。
 IronPython
  http://ironpython.codeplex.com/easy_setup
  http://peak.telecommunity.com/dist/ez_setup.py  

2.環境変数に下記のパスを追加。
 Path
   C:\Program Files (x86)\IronPython 2.7\
   C:\Program Files (x86)\IronPython 2.7\Scripts\
   C:\Program Files (x86)\IronPython 2.7\Lib\
   C:\Program Files (x86)\IronPython 2.7\Lib\site-packages\

  PythonHome
   C:\Program Files (x86)\IronPython 2.7\


3.モジュールを入れる。
 ipy64 Scripts\easy_install sqlite ipy64 Scripts\easy_install django


4.このままだとunicodeエラーが発生するので、djangoにパッチをあてる。 https://bitbucket.org/jdhardy/django-ironpython/commits/b70eeacda60c


.\lib\site-packages\django-1.4.3-py2.7.egg\django\utils\funcional

---95行目付近
 - assert not (cls._delegate_str and cls._delegate_unicode), "Cannot call lazy() with both str and unicode return types."
 + assert (str is unicode) or not (cls._delegate_str and cls._delegate_unicode), "Cannot call lazy() with both str and unicode return types."
---

5.プロジェクト作成
 ipy64 -X:FullFrames Scripts\django-admin.py startproject project_name

 ipy64の引数「-X:FullFrames」これが入ってなくて一度つまづいた所である。

詳しくはipy64 -hで参照すること。

Androider