VB to C# 2

VB.NETからC#.NETへの変換では、
SharpDevelopは大いに助かるのですが、
結局ややこしいところは自動処理してくれなくて手作業で書き直さなければいけません。

全面書き換えには次のようなものがあります。

画面
LINQ
インデクサ

そのほかVBでよく使うメソッドでC#ではどうかけばいいのか分からないケースがあります。
たとえば、二つの日付の差の日数を計算する[DateDiff]や変数に数字が入っているかを調べる[isNumeric] 等をC#ではどう書けばいいか結構調べまわることになります。

LINQでは明示的に型指定のない変数(VBではDim、C#ではvarで宣言)をよく使います。
VBではつぎのように条件文の外で変数を宣言し、条件によるLINQ文の結果をその後で使っていくことができます。

Dim query
If true then
    query= From rec In 商品tbl Where rec.CD = “1234”
Else
    query= From rec In 商品tbl Where rec.CD = “5678”
End If

それどころが明示的に型指定のない変数をクラス変数(フィールド)にさえ使えます。

一方C#では、型指定のない変数は厳密にローカルにしか使えませんし。
上のコードのように初期化なしの宣言だけも許されません(nullでの初期化も不可)。

C#では型指定するか、プログラムの構造を変えるしかありません。

また、[LINQ toSQL]と[LINQ to Entiry Framework](以下LINQ to EFと書きます)との使い分けがまだよく分かりません。
おそらく、[LINQ to EF]に統一すべきだと思いますが、我がプログラムはまた統一していません。
[LINQ to SQL]は身軽な感じがしているので、
簡単なSQLはこちらが便利かなと思っています。

VBではLINQやデリゲートやジェネリックを使ってきましたが、
VBの緩い約束事にしたがって、「いい加減に使ってきたかな」という感想を持っています。

この際、「デリゲート、ジェネリック、LINQ、ラムダ式をキッチリ理解しなければいけない」
と考えています。
正味1、2ヶ月は必要かもしれません。

VB to C#

途中まですすめたVB.NETプロジェクトをC#.NETに書き換えています。おそらく10万行程度のコードだと思います。

まずSharpDevelpoでVB2008のプロジェクトをC#プロジェクトに一括変換し(確か、SharpDevelopはVB2010の変換ができない)、VS2010を使ってC#2008のプロジェクトをC#2010にアップグレード、SharpDevelopで変換できなかったVBのコードを少しずつ切り出し、インターネットサイトを利用しC#に変換しました。

機械的な変換処理でやれるところまでやって、VS2010C#でプロジェクトを開くとたくさんのエラーが表示されます。内容は一言でいえば、型指定等VBは緩くC#は厳しいことからくるエラーです。

VBではVariant型という大変便利な型がありましたし、その流れを汲んで暗黙の処理がたくさんあります。基本的にVBにはプログラミングする上で色々横着ができます。

また、モジュールというグローバル変数やメソッドを定義できる仕組みがありますし、メソッドにはオプショナルという引数にデフォルト値を設定できる仕組みがあります。また配列クラス変数に対して、プロパティを定義すればプロパティを使って配列要素にアクセスできますが、C#ではそれができません。

このようにC#は厳密といえば厳密、面倒といえば面倒な言語です。

C#プロジェクトを開くと、プロジェクト全体のエラーではなく、開いたコードに対してのエラーが表示されます。ざっと1ファイル(1000行程度か。Partial Classでは1クラスは数ファイルのことも)100程度のエラーが出てきます。エラーをつぶしていけば、後でみるファイルほどエラーの数は少なくなるでしょうが、どちらにしても相当数のエラーをつぶしさなければいけません。

私は長年VBを書いてきましたので、少し気取っていえば裏技的あるいは高度なVBの技法を取り入れていますので、その分C#への移植は難しくなります。

今は半分機械的にエラーをつぶしていますし、その場で分からないこと面倒なことはコメントアウトしていますので、とりあえずの作業の後に高度にC#を研究しなければいけないかもしれません。

フォームには大抵深刻なエラーがあってデザイン画面を表示することができません。すべての画面はつくりかえた方が早いでしょう。

VB2C#の変換は予想以上に大変な作業ですが、この際勉強だと思えば楽しみ半分です。

このプロジェクトのエラーをすべてつぶしたときには、一端のC#プログラマになっているでしょう。

SQL Server のページング、 Power Shell

Accessプロジェクトのトラブルシューティングはまだ続いています。
この2ヶ月で細かいバグを10個ほど修正し、全面書き換え2本のコードを書いています。
1本はほぼ完成。もう一本も今週中には終わらせたいと思っています。

細かい手直しの部類です。次のようなものがありました。

SQL Serverの結果データをAccessシートで表示するには、レコード数10,000が限界のうようです。

数万レコードをページングして自由に表示するには工夫が必要です。
幸いSQL Server 2008では新たに、共通テーブル式(CTE)ROW_NUMBERが使えます。

CTEの構文は次のようなものです。

WITH <CTEの名前>(<列の名前>)
AS
(
<クエリ>
)
(SELECT * FROM <CTEの名前>)

ROW_NUMBERは<クエリ>の結果に自動で行番号を振ります。
その列名を今RowNumberとして次のような文を作成します(@開始行等は変数名です)。

WITH tmpTable
AS
(
SELECT T.*, ROW_NUMBER() OVER (ORDER BY 商品CD) AS RowNumber FROM [WRK_商品] T
)
SELECT * FROM tmpTable
WHERE RowNumber BETWEEN @開始行 AND (@開始行+@行数-1)

Accessフォームにデータを連結するには、フォームのレコードソース・プロパティにSQLやテーブル名を設定します。
ところが設定する文の長さが128文字(正確ではありません。忘れました)に制限されていて、
どうしても上の文を128文字以下にできません。

次の手はこれを下のように引数付きのストアドプロシージャにすることです。

CREATE PROCEDURE [Sp_商品表示] (
@開始行 integer,
@行数 integer
)
AS
BEGIN
WITH tmpTable
AS
(
SELECT T.*, ROW_NUMBER() OVER (ORDER BY 商品CD) AS RowNumber FROM [WRK_商品] T
)
SELECT * FROM tmpTable
WHERE RowNumber BETWEEN @開始行 AND (@開始行+@行数-1)
END

ところが今度は引数付きのストアドプロシージャをどうやって先のプロパティに設定すればいいのかわかりません。
あちこち情報を探し回りましたが、使っているAccessそのものが古い(2003)し、なかなか思った解決策が見つかりません。
やっと探し当てました。
次のようにストアドプロシージャをExecでコールすればいいのです。
結構早く反応します。

Form_商品表示.RecordSource = “Exec [Sp_商品表示] ” & 開始行 & “,” & 行数

話は変わりますが、私はPerlをよく使います。
DBの結果出力が正しいかどうか。
SQL Serverでは結果セットをCSVに書き出すことができます。
正しい結果のCSVがあるとして、これとテスト結果との突合せにPerlで小さいプログラムを書けば簡単に照合できます。
テキストデータ(ファイル)の検査とか、変更とかこれほど便利なツールはないと、
Perlをとても重宝しています。

また話は変わりますが、今回色々調べていて、Windows Power Shellなるものがあることを知りました。
これまでは、バッチブログラムの実行はコマンドプロンプトWindowを開いて、いくつかのDOSコマンドを敲き、プログラムを起動していました。

このことに不便は感じていなかったのですが、Windows Power Shell(以下PS)があることを知りましたので、どんなものか勉強してみました。
Perlのようなものかと思いましたが、確かにPerlの記法も取り入れていますが、
WindowsでGUIを使って色々操作していたこと(システム管理)が、
大抵このPSで実行可能らしいことがわかりました。
Perlとは違う場所でこれはこれで「使えそうだ」という感想を持っています。

私のコンピュータ

1TBの新しいコンピュータは無事に動作しています。
期待よりうるさい(特に電源を入れた直後)のが唯一不満ですが、
まあとりあえず我慢しましょう。

このコンピュータには最新の環境(Win 7、 VS2010、 SQL Server 2008、 Office 2010、 Expression WEB)を作り、
C#のプロジェクトを書いています。
C#は勉強だけはしたのですが本格的に書いたことがなかったので、
VBで取り掛かったプロジェクトをC#に書き換えています。
まず、SharpDevelopでVBプロジェクトをC#に一括変換し、
SharpDevelopで変換できなかった部分を、
少しずつ切り出してインターネットの変換サイトで変換。
あとはVS2010C#プロジェクトを開いてエラー部分を手作業で書き換えています。
ちょうどいい勉強です。
ちょっとしたことがVBとC#で異なりますので、色々調べまわっています。

参考書は、
以前購入した[プログラミング Visual C# 2005](その他翻訳本3冊)とLINQ本3冊、
今回購入した[Pro C# 2010 and the .NET 4 Platform]、
[Entity Framework 4.0 Recipes]それにJeffrey Richterの[CLR via C#]です。
戦闘準備完了。

さてこれまで私は使っているコンピュータのディスクが一杯になったり、
新たな開発環境を導入しなければいけなくなったとき、
コンピュータを新しくしていました。

今回リムーバブルディスクを付けたコンピュータを組み立てましたので、
コンピュータの使い方を整理したいと思います。

現在私は4台のコンピュータを使っています。
そのうち一台はラップトップですので、これは外で必要な時に使います。
一台は昨年購入したDellでそれなりに満足しています。
本当はこれにリムーバブルディスクをつけようとしてのですが、
ケースのデザイン上それができなくて、今回新しいコンピュータを作った次第です。
いまのところDellは日常のメールや事務的作業と、
このコンピュータで始めたプロジェクトだけに使うことにします。
ですから今後はこのコンピュータにいろいろインストールしないで、
トラブルが起きないようにします。

あと2台はリムーバブルディスクを入れています。
原則1ディスク1開発環境にします。
すなわちOS、VS、データベース、Office等バージョンが異なれば別ディスクにします。
更に大きなプロジェクトは単独ディスクにします。
古いプロジェクトは10年位前に作ったIDEのディスクに入っていますので、
これはこれで整理し、これからのプロジェクトはSATAのディスクに整理していきたいと思います。
その他500Gと200GのUSBディスクがありますので、あらゆる情報はここにコピーし万一の事態に備えます。
Dellと新しいSATAコンピュータはCPU切り替え器を介してキーボード等を共有しています。
IDEコンピュータはスタンドアロンです。

今のところレイドは使っていません。
機会があれば使いたいと思いますが、現在のやり方で特に不自由はないと思っています。

コンピュータの組み立て 3

案の定メモリスロットの使い方に間違いがありました。

メモリをCPUから近い順に2番と4番に挿入しかえ、めでたくBiosが立ち上がりました。
経験ではIDEボードでインストールしたHDは、他のマザーボードでも起動できました。
SATAの世界では「どうだろう」と少し不安でしたが、古いコンピュータにつけていたディスクもそのまま起動します。
ただ古いディスクからするとCPU等ハード環境が変わりましたので、
ハードウェアの自動認識、再インストールに取り掛かりますので早々にやめ、
それを確認してから、新品の1TのシーゲイトにWin7をインストールすることにしました。

インストール用DVDをドライブに設置して、電源をいれ数秒して画面になにかが表示されました。
XP(DVD)ではここでなにかキーを押さなければいけません。
そのタイミングを逃すとディスクの起動に移りますので、
そのままOSがインストールされていないディスクにアクセスするとブートエラーが出ます。

それを気にして画面を十分確認もせずキーをたたきました。
XPと様子が違い突然インストールが開始されました。
後はパーティションを切る以外は殆どなにもすることなくインストールが完了しました。

ディスクが壊れたとき一番困るのは、作業中のファイルの損壊です。
他の開発ソフト等が壊れた時は、最悪CDから再インストールすればいいのですが、
作業中のプログラムが壊れると大変です。
今回1Tのドライブを4つのパーティションに分けました。
CはOSやOSに近いプログラムを、DにはVSやSQL Server等の開発用のソフトを、
Eに自分の作業プログラムを、Fにドキュメントをいれました。
容量はそれぞれ200G、200G、400G、100G程度です。
ドライブが大きくなるとフォルダの数が増え、
エクスプローラでドライブを表示したときフォルダが見にくくなるのも、
パーティションを分けた理由の一つです。
特に事務的なドキュメントはFドライブに一括しました。

OS に続いて、Office2010、SQL server 2008、VS2010を何の問題もなくインストールしました。
確かOUTLOOKで自分のメールアドレスを入力するとインターネットにドメインを探しに行って、
アカウントを自動的に設定します。色々進歩しています。

今回コンピュータを入れ替えた一番の理由は、
前のコンピュータが「うるさい」ことでした。
残念ながら期待通りではありません。
色々調べましたが、原因はリムーバブルケースクのようです。
リムーバブルケースはラトックシステム社のREX-SATAシリーズ・アルミ製を使っていますが、
これにご丁寧に二つ小さいファンがついていてこれがうるさいみたいです。
それでも以前よりは改善されたので、とりあえずは我慢しておちついてから検討したいと思います。

今回のハードの費用は以下の通りです
CPU、メインボード、メインメモリ 約37,000円
(QUAD CORE i5-760、 MSI P55A-GD55、 CFD DDR3 2G×2)
HD シーゲイト 1T 約6,000円
ケース Cooler Master 約14,000円
リムーバブルケース 約11,000円 
DVD 約2,500円
グラフィックボード 約3,000円

その他勉強代約1万円、予備ディスクとリムーバブルトレイ約1万円。
ザット10万円程度の費用が掛かりました。