ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

2009年4月6日月曜日

C# をはじめるための準備 - Visual Studio と SQL Server のインストール

お手軽に GUI を構築できるツール

久しぶりに Access を触っていると、シンプルなものならチャチャッと DB を作り、データ入力画面のデザインにこだわらず無骨なままで、必要なレポートを適当に出力させるという使い方をする分には便利だなぁと思う。プログラミングを全く知らないとき、FileMaker を使って給料計算をするためのデータベースを作ったけれど、あれも使いやすかった。今のようにリレーションシップの構造を表示できない古いバージョンだったけれど、直観的な操作でそこそこ何とかなった。

http://www.filemaker.co.jp/help/html/relational.11.11.html#843565

リレーションシップグラフの操作 via kwout

先に FileMaker に馴染んだため、はじめ Access はわかりにくいなぁ~ (@_@;) と思った。 (cf. FileMaker と Access の入力フォームにおける操作モデルの違い) Access の方が VB との絡みで色々なことができるので複雑に感じたのかもしれない。しかし、今では一度 VB6 をいじった経験があるので、いざとなればクラス定義してオブジェクト生成して…と、昔よりも多少親しみを感じるようになった。

ところで、VB6 をはじめて触ったとき、Visual Studio で GUI の部品をポンポンと配置し、すぐに見かけだけでもそれなりのものができることに驚いた記憶がある。なぜなら、それまでは Java をいじっていて、はじめて買った本には Swing の説明すらなく、AWT でこつこつと完成予定の GUI の姿を想像しながらソースを書いていたからだ。そして、思ったようになかなかできないことにイライラと…。(+_+) Mac 使っていたときは、Mac OSX に付属していた開発環境の中の Interface Builder のスマートさを見て、あぁ~こんな感じに Java の環境がなったらいいのにと感じた。その頃に比べれば、今の Netbeans の GUI ビルダーはすごいなぁ。

 

目的

さて、というわけでお手軽に GUI を配置できるツールをまたいじってみたくなったので、 Visual Studio をインストールすることに。せっかくなので全く知らない C# をかじることにしよう。

DB は SQL Server をインストールし、Visual Studio + SQL Server で Access の代わりにならないかと目論む。

とりあえずの目的は、

  • C# に触れる
  • 組み込みの SQL Server をデスクトップアプリケーションで利用
  • 他の PC に SQL Server をインストールして C/S
  • ついでに余力があれば ASP.NET

.NET はやったことがないけれど、手元には何年か前に買って放置してた、

がある。中身、ASP と VB だけれど何かの参考になるかも。^^;

 

インストール

Visual Studio 2008

Visual Studio 2008 Express Editions をダウンロードしてインストール。

 

SQL Server 2008

SQL Server について調べていたら、

SQL Server 2008 の Reporting Services は無茶苦茶ヤバイです (^^
ものすごく使いやすくなって、グラフの種類が増えて、…

(SQL Server 2008 の Reporting Services は無茶苦茶スゴイ! より)

と書かれていたので、「これでレポート作成ができるのだろうか?」と思い、

ローカル リレーショナル データでの SQL Server Reporting Services レポートの実行。(ダウンロードの詳細 : Microsoft SQL Server 2008 Express with Advanced Services より)

と説明があった Microsoft® SQL Server® 2008 Express with Advanced Services をダウンロードして別途インストール。

途中、Windows PowerShell も必要だったのでインストール。

 

インストールしたもの

とりあえずインストールしたものは、データベースエンジン以外では上記「Reporting Services」と「管理ツール」。

090323-001

 

Reporting Services のアカウント

`Reporting Services’ はサービスのアカウントを指定するように求められた。Windows Service にみる別の資格情報で process を起動する安全な方法 によると、

Windows Service ですが、default では 'NT AUTHORITY\SYSTEM' で起動するように構成されるのが多いわけですが、'NT AUTHORITY\SYSTEM' 以外の account で起動できるのもご存知の方は多いでしょう。
'NT AUTHORITY\SYSTEM' は password が無い特殊な account なので例外として、その他の account で Windows Service を起動する場合、他の process を起動する場合と同様に password が必須になるわけです。

まずは動けばいいので、`NT Authority System’ を選んでおいた。

090323-002

 

インスタンスの名称

インスタンスの名称はデフォルトのままにした。

090403-001

後で知ったが、「Workgroup、Standard、Enterprise Edition へのアップグレード」 によると、

注意事項として、Express Edition の既定の名前「SQLExpress」を使用している場合、そのインスタンスをアップグレードさせることはできません。

パタッ(o_ _)o~†

 

管理者の指定

ちなみに最初インストールしたとき、「管理者の指定」するのを忘れてた。 (+_+) そのため、 SQL Server Management Studio を起動してもサーバに接続できなかった。 ^^;

認証モードは、

「Windows 認証が基本」

(http://www.sqlpassj.org/bunkakai/security/series/kihon/01.aspx より)

とあったのでそのように。

「現在のユーザーの追加」ボタンを押して管理者を指定した。

090403-005 

 

SQL Server Management Studio で接続

インストールが終ったので、SQL Server Management Studio を起動。「サーバ名」を<参照>して「ローカルサーバー」のデータベースエンジンから選択して、接続できることを確認した。

 090403-006

 

Report Builder のインストールと接続

Report Builder 2.0は、Office 2007シリーズと同様のリボンインターフェースや、データベースへの選択クエリを自動生成するツールを搭載し、専門的な開発ツールやSQL言語に不慣れなユーザーでも、多次元の表形式、グラフ、チャートおよびゲージなどを含むグラフィカルなレポートのセルフサービス型による作成を可能にする。

(マイクロソフト、SQL Server 2008対応のレポート作成ツールを無償提供開始:CodeZine より)

ダウンロードの詳細 : SQL Server 2008 レポート ビルダ 2.0 よりダウンロードしてインストール。

 

後は、「SQL Server 2008 Reporting Services 入門」 を見ながら、SQL Server への接続を行なった。

まず、レポートビルダーを起動したら、レポートデータ ペインにおいて「新規 > データソース」。

「レポートに埋め込まれた接続を使用する」を選択し、`Microsoft SQL Server’ を選び、「ビルド」ボタンを押す。

090406-002

 

サーバ名に「サーバ名\インスタンス名」を指定し、作成したデータベースを選択する。

090406-001

2008年5月31日土曜日

Python のリスト内包表記 - Ruby や Haskell の書き方と比べながら

0. Python の気になる機能

 Python チュートリアル の目次をざっと眺め、目にとまったのは次の二つの機能。

両方とも耳馴れない言葉。 (@_@) まずは、リストの内包表記から調べることに。

 

1. リスト内包表記の基本

a. リストの各要素に関数を適用する

最初は、リスト内包表記の使い方を確認する。例として、「数値のリストの各要素を 2 倍する」

print [x*2 for x in [1,2,3,4,5]]

初めて見たとき、どこから読めばいいのか検討がつかなかった。

読む順番は、

  1. for によって、各要素を取り出し、
  2. 各々に対して、操作を加える。

というように、後ろから前へと読み進める。

 

b. リストの各要素から、条件にあったものを抽出する

次に、同じく数値のリストから、特定の条件に合う要素を抽出する。

print [x for x in [1,2,3,4,5] if x > 3]

これまた読みにくい。 (@_@;)

 

c. 要素に対する関数の適用と、抽出を組み合わせる

では、上記二つを組み合わせてみる。

print [x*2+100 for x in [1,2,3,4,5] if x > 2 and x < 5]

慣れないと、どこから読めばいいのやら、迷ってしまう。

追記(2008.6.1) : ちなみに、「Python の好きなところ - kwatchの日記」 によると、Python では、条件の記述において、

2 < x < 5

と書ける。よって、上記のリスト内包表記は、

[x*2+100 for x in [1,2,3,4,5] if 2 < x < 5]

と記述できる。

 

2. リストの要素を組み合わせる

リスト内包表記において、for を複数記述すれば、リストの要素を組み合わせたリストを生成できる。

print [[x,y,z]    for x in [1,2,3]
                  for y in [10,20,30]
                  for z in ['a','b','c']]

上記のように、改行とタブで整形すれば、少し読みやすくなるかな。一行で書かれあるものなんて読みたくないなぁ。

もし、リストの要素を組み合わせるのに、リスト内包表記を使わないならば、

ary = []
for x in [1,2,3]:
    for y in [10,20,30]:
        for z in ['a','b','c']:
            ary.append([x, y, z])
print ary

for ループが 3 重にネストするため、ちょっと読みにくい。

追記(2008.8.19) : 「情報の論理数学入門」 (p14) によると、

「二つの集合 A, B の直積集合 (Cartesian product set) A × B は第 1 成分が集合 A の元で、第 2 成分が集合 B の元となる順序対のすべての集合である。 A, B がともに有限集合のとき、直積集合の元の数は A と B おそれぞれの元の数の積である。080819-003」

上記のリスト内包表記は、「直積」と考えればよい。数学の表記に似せてあることがわかる。

 

3. Ruby でリスト内包表記と同等のものを書く

上記のリスト内包表記で得られる結果と、同じものを Ruby で書いてみる。

puts [1,2,3,4,5].map{|i| i*2}

puts [1,2,3,4,5].select{|i| i > 3}

puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2+100}

Ruby の方が、

「リストに対して条件を設定し、それに操作を加える」

という思考の流れと、コードの流れが一致しているので書きやすい。

ただし、Ruby にはリスト内包記法がないので、リスト要素の「組合せ」を、Python のように素直に表現できないようだ。

 

4. リスト内包表記の入れ子は、読みづらくなる

リスト内包表記は、ネストさせることができる。しかし、段々と暗号のように見えてくる。 (@_@;)

print [[y for y in [2,3,4,5,6] if y == x] for x in [3,4,5]]

print [[y for y in [2,3,4,5,6] if y in x] for x in [[1,2,3],[3,4,7]]]

print [[y for y in ['h','o'] if y in x] for x in ["hoge","piyo"]]

 

5. リスト内包表記の「内包」の意味

リスト内包表記における、「内包」の意味は、

元々は公理的集合論の用語で、

  • 内包(intension)記法: {f(x) | x ∈ A} みたいな書き方。
  • 外延(extension)記法: {a, b, c, d, e, …} みたいな書き方。

([雑記] クエリ式とリスト内包 (C# によるプログラミング入門) より)

つまり、集合の要素を、個々に指し示すのではなくて、性質によって表わすということ。

しかし、数学的な表現と比べると、Python の表記は読みにくい。 for と if が、そもそも構造化プログラミングのための記法なので、それを流用して表現しているのでダメなのかな?

 

a. Haskell のリスト内包表記の書き方との比較

これに対して、 Haskell のリスト内包表記は読みやすい。

main = do print [x*2| x <- [1,2,3,4,5]]

          print [x| x <- [1,2,3,4,5], x > 3]

          print [x*2+100| x <-[1,2,3,4,5], x > 2, x < 5]

「ふつうのHaskellプログラミング」 (p148) によると、

リスト内包表記を使ったコード例としてはクイックソートを実装したqsort関数がよく挙げられます。

「About Haskell」 の「クイックソート」は、リスト内包表記が使われているので、シンプルに書かれている。

qsort []     = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
                 where
                   elts_lt_x   = [y | y <- xs, y < x]
                   elts_greq_x = [y | y <- xs, y >= x]

 

b. C# での書き方

「クイックソート対決(Haskell vs C#) - 医者を志す妻を応援する夫の日記」 には、C# による記述の方法が書かれている。

static IEnumerable QuickSort(IEnumerable a)
{
    if (a.Count() == 0) return a;

    int p = a.First();
    var xs = a.Skip(1);
    var lo = xs.Where(y => y < p);
    var hi = xs.Where(y => y >= p);

    return QuickSort(lo).Concat(new[] { p }).Concat(QuickSort(hi));
}

お~、こんな風に書けるのかぁ~ (@_@)

 

6. map(), filter(), lambda と リスト内包表記

5.1.4 リストの内包表記 によると、

リストの内包表記 (list comprehension) は、リストの生成を map() や filter() や lambda の使用に頼らずに行うための簡潔な方法を提供しています。

ということで、map(), filter(), lambda について調べてみる。

 

a. lambda

最初に lambda 。

4.7.5 ラムダ形式 によると、

キーワード lambda を使うと、名前のない小さな関数を生成できます。例えば "lambda a, b: a+b" は、二つの引数の和を返す関数です。

ちなみに、Ruby では、次のように lambda を使う。

def make_incrementor(n)
 return lambda{|x| x + n}
end

f = make_incrementor(42)
puts f.call(0)
puts f.call(1)

個人的には、proc{ ... } や Proc.new { ... } よりも lambda { ... } の方が読みやすいかなぁ。

追記(2011.11.14) : Ruby 1.9 より、矢印ラムダで書くことができる。

def make_incrementor(n)
  return ->(x){ x + n } 
end

当初、Ruby はブロックの使い方が特徴的なので、同じように lambda { … } と書くほうが良いと感じた。しかし、無名関数くらいは、特別扱いした方が見やすいかな。

Python では、Ruby とは書き方が、微妙に異なる。

lambda a, b: a + b

Ruby のように、lambda がブロックとして、他同列の扱われ方をしているのではなく、無名関数として、特別な記法が前提とされている。

 

b. map, filter 関数

2.1 組み込み関数 には、map と filter 関数の説明が述べられている。

map(function, list, ...)

filter(function, list)

先ほどのコードを、map と filter を使って書き直すと、

print map(lambda x: x*2, [1,2,3,4,5])

print filter(lambda x: x>3, [1,2,3,4,5])

print map(lambda x: x*2+100, filter(lambda x: x>2 and x<5, [1,2,3,4,5]))

Python の組み込み関数は、Ruby と比べると、読みやすさの点では劣るかもしれない。

 

c. reduce 関数

ついでに、リスト操作として便利な、「5.1.3 実用的なプログラミングツール」 で挙げられていた reduce() を試す。

reduce(function, sequence[, initializer])

sequence の要素に対して、シーケンスを単一の値に短縮するような形で 2 つの引数をもつ function を左から右に累積的に適用します。例えば、reduce(labmda x, y: x+y, [1, 2, 3, 4, 5]) は ((((1+2)+3)+4)+5) を計算します。

なるほど、reduce は、「短縮する」という意味なのか。Ruby の inject より、名前的にいいかも。

 

関連記事