2010-08-29

自治体に広がるOpenOffice.org

2010/08/26 付けの ITPro の記事で、オープンソースのオフィスソフト OpenOffice.org を採用する自治体が増えているという記事がありました。この場合、オープンソースであることは、たぶんどうでも良いことなのでしょう。Microsoft Office と比較すると無料で入手できること、つまり経費を節約出来ることを第一に着目して採用することは、仕方がないことなのかもしれません。こういった動きの中で OpenOffice.org のユーザーが増えて、開発者やユーザーグループの活動が活発になり、結果としてオープンソースであることの恩恵を享受でき、なにがしかの貢献ができるようになれば良いのです。

[1] 自治体に広がるOpenOffice.org

自分が勤めている会社では、OS やアプリケーションは Microsoft の製品がほとんどです。残念ながら、自社の情報システム部門がオープンソース系のシステム導入に前向きになる日が来るとしても、それはまだまだ先です、きっと。
 

2010-08-14

CLR のバージョンの取得

Mono で開発したアプリケーションを Windows でも実行することを想定しているので、ビルド時と実行時の CLR のバージョンを把握できる方法があればなにかと便利です。情報がないか探したところ、下記の参考サイト [1] にぴったりな情報があったので、早速試してみました。

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace bitWalk
{
class VerTest
{
public static void Main (string[] args)
{
string clrVersionBuildtime = Assembly.GetExecutingAssembly ().ImageRuntimeVersion;
Console.WriteLine ("built CLR version: " + clrVersionBuildtime);
string clrVersionRuntime = RuntimeEnvironment.GetSystemVersion();
Console.WriteLine ("runtime CLR version: " + clrVersionRuntime);
}
}
}

プログラム名は VerTest.exe です。Linux の端末エミュレータ上で実行してみると、CLR のバージョンはどちらも v2.0.50727 でした。

Wine 上だと、実行バージョンが変わるかもしれないと期待して試してみましたが、両方とも v2.0.50727 でした。

それでは Windows 上であれば、と期待して実行してみましたが、結果はやはり同じ v2.0.50727 です。

なんとなく納得できないので、今度は、Windows XP 上の Visual Studio 2010 Express で同じソースを VerTest_VS.exe としてコンパイルして実行してみました。Windows 上では v4.0.30319 と表示されています。

Linux / Mono 上で実行すると、今度は確かに実行 CLR のバージョンが変わりました (v1.1.4322)。

Mono でコンパイルしたプログラムで直接確認できませんでしたが、機能的には確認できたので、とりあえず納得です。

参考サイト


[1] @IT:.NET TIPS ビルド時および実行時のCLRバージョンを取得するには? - C# VB.NET
[2] @IT:.NET TIPS サイド・バイ・サイドによりCLRバージョンを指定するには?
 

2010-08-13

Math.NET Numerics

C# で手軽に使える、オープンソースの数値計算ライブラリがないか探してみました。演算速度のパフォーマンスを求める場合は、C# 以外の環境を検討する必要がありますが、それにしても「ある程度」の数値計算ぐらいは C# で開発していれば C# で処理したいですし、その「ある程度」がどの程度なのかも評価しなければなりません。

Mono プロジェクトの、ライブラリを紹介しているページの Math の項目に、dnAnalytics というライブラリが紹介されていますが、調べてみると、当の dnAnalytics と、Math.NET Iridium という他の数値計算ライブラリを開発するプロジェクトが一緒になり、現在 Math.NET Numerics というプロジェクトになっていることが判りました。ライセンスは MIT/X11 になっています。(ちなみに、以前の Math.NET Iridium は LGPL でした。)

早速、ダウンロードのサイトから MathNet.Numerics.2010.1.28.762.zip をダウンロードして、MonoDevelop で簡単なサンプルを動かしてみました。最初、Math.NET Numerics Code Samples - Math.NET Numerics Documentation にあるサンプルをそのままビルドしようとしましたが、以前の Math.NET Iridium 用のサンプルのままで、現時点で存在しないメソッドを使っていたので、少し直しました。動作確認だけだったので面白いサンプルではありません。

ドキュメントもある程度揃っているので、簡単なサンプルを作るなどして、使い勝手を評価していこうと考えています。

参考サイト


[1] Math.NET Numerics
[2] Math.NET on Mono (and Linux) - Math.NET Numerics Documentation
注)以前の Math.NET Iridium の時のままですが同じことですので読み替えてください。
 

2010-08-12

Mono で GUI プログラミング (4)

週は、お盆休みで時間に余裕があるので、インターネット上で入手できる .NET の GUI アプリケーションの C# ソースがあれば、ダウンロードして mono でビルドできるかどうか試してばかりいます。

今回は、Yukun's Blog で紹介されていたサンプルをビルドしてみました。サンプルは、以下の URL で紹介されている「キッチンタイマー」です。

C#でキッチンタイマーを作ろう - Yukun's Blog

このサイトで紹介されているコードは、FormTimer.csFormTimer.Designer.cs の二種類です。これに、次のメインメソッドを記述した FormTimer.Main.cs を加えてビルドしました。

using System;
using System.Windows.Forms;

namespace Sample
{
class Program
{
static void Main ()
{
Application.Run (new FormTimer ());
}
}
}

複数のソースファイルから、単一の実行ファイルをビルドするには、-out オプションで出力ファイル名を指定して、ビルドするソースファイルを列挙します。

$ gmcs -pkg:dotnet -target:winexe -out:FormTimer.exe FormTimer.Designer.cs FormT
imer.Main.cs FormTimer.cs

$ mono FormTimer.exe &

Linux での実行例

MonoDevelop の利用


まともなアプリケーションを作ろうとすると、ソースコードは長大なファイルになるか、あるいは、いくつもの分割されたファイルになります。上記の例のように 3 つぐらいのソースコードであれば我慢ができますが、それ以上になると管理しきれなくなります。そんなとき IDE を使うと便利です。Mono 用の IDE に MonoDevelop があります。Fedora だと yum コマンドでインストールできます。以下は、MonoDevelop (2.2.2) で、上記のサンプルを編集している例です。

 

2010-08-08

Mono で GUI プログラミング (3)

Excel のようなスプレッドシートを使いたければ、それこそ Excel とか OpenOffice.org Calc を使えば良いのですが、GUI アプリケーションでちょっとしたスプレッドシートを使いたい時があります。

DataGridView コントロールを利用した例を [1] で見つけたので、それを少し加工したサンプル DataGridViewTest.cs を紹介します。

///////////////////////////////////////////////////////////////////////////////
// DataGridViewTest.cs - DataGridView コントロールを使ったサンプル
//
// 参考/引用:
// Koders Code Search: Test.cs - C#
// modified by Fuhito Suguri, 7-Aug-2010
///////////////////////////////////////////////////////////////////////////////

using System;
using System.Windows.Forms;
using System.Drawing;
//
namespace bitWalk
{
public class Program
{
public static void Main (string[] args) {
DataGridViewTest p = new DataGridViewTest();
p.SampleDataShow();
Application.Run(p);
}
}
//
public class DataGridViewTest : Form {
DataGridView myDataGridView;
/////////////////////////////////////////////////////////////////////////////
// DataGridViewTest constructor

public DataGridViewTest () {
this.Width = 400;
this.Height = 200;
this.Text = "DataGridViewTest";
//
this.Closed += OnClosed;
//
myDataGridView = new DataGridView();
myDataGridView.ColumnCount = 5;
//
DataGridViewCellStyle style1 = myDataGridView.ColumnHeadersDefaultCellStyle;
style1.BackColor = Color.Navy;
style1.ForeColor = Color.White;
style1.Font = new Font(myDataGridView.Font, FontStyle.Bold);
//
DataGridViewCellStyle style2 = new DataGridViewCellStyle();
style2.BackColor = Color.Beige;
style2.ForeColor = Color.Brown;
style2.Font = new Font("Arial", 8);
myDataGridView.AlternatingRowsDefaultCellStyle = style2;
//
myDataGridView.EditMode = DataGridViewEditMode.EditOnEnter;
myDataGridView.Name = "myDataGridView";
myDataGridView.AutoSizeRowsMode =
DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
myDataGridView.ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyle.Raised;
myDataGridView.CellBorderStyle = DataGridViewCellBorderStyle.Single;
myDataGridView.GridColor = SystemColors.ActiveBorder;
myDataGridView.Columns[0].Name = "リリース日";
myDataGridView.Columns[1].Name = "トラック";
myDataGridView.Columns[1].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;
myDataGridView.Columns[2].Name = "タイトル";
myDataGridView.Columns[3].Name = "アーティスト";
myDataGridView.Columns[4].Name = "アルバム";
myDataGridView.Columns[4].DefaultCellStyle.Font =
new Font(DataGridView.DefaultFont, FontStyle.Italic);
myDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
myDataGridView.MultiSelect = false;
myDataGridView.BackgroundColor = Color.Honeydew;
myDataGridView.Dock = DockStyle.Fill;
myDataGridView.CellFormatting +=
new DataGridViewCellFormattingEventHandler(MyDataGridViewCellFormatting);
myDataGridView.CellParsing +=
new DataGridViewCellParsingEventHandler(MyDataGridViewCellParsing);
myDataGridView.CellValidating +=
new DataGridViewCellValidatingEventHandler(MyDataGridViewCellValidating);
this.Controls.Add(myDataGridView);
//
DataGridViewColumnCollection columns = this.myDataGridView.Columns;
columns[0].DisplayIndex = 3;
columns[1].DisplayIndex = 4;
columns[2].DisplayIndex = 0;
columns[3].DisplayIndex = 1;
columns[4].DisplayIndex = 2;
}
// Populating the DataGrid
public void SampleDataShow () {
DataGridViewRowCollection rows = this.myDataGridView.Rows;
rows.Add(new string[] {"11/22/1968", "29", "Revolution 9", "Beatles", "The Beatles [White Album]"});
rows.Add(new string[] {"4/4/1960", "6", "Fools Rush In", "Frank Sinatra", "Nice 'N' Easy"});
rows.Add(new string[] {"11/11/1971", "1", "One of These Days", "Pink Floyd", "Meddle"});
rows.Add(new string[] {"4/4/1988", "7", "Where Is MY Mind?", "Pixies", "Surfer Rosa"});
rows.Add(new string[] {"5/1981", "9", "Can't Find My Mind", "Cramps", "Psychedelic Jungle"});
rows.Add(new string[] {"6/10/2003", "13", "Scatterbrain. (As Dead As Leaves.)", "Radiohead", "Hail to the Thief"});
rows.Add(new string[] {"6/30/1992", "3", "Dress", "P J Harvey", "Dry"});
}
//
void MyDataGridViewCellValidating (object sender, EventArgs args) {
}
//
void MyDataGridViewCellParsing (object sender, EventArgs args) {
}
//
void MyDataGridViewCellFormatting (object sender, EventArgs args) {
}
//
void OnClosed (object o, EventArgs e) {
Console.WriteLine("Closed!");
Application.Exit();
}
}
}
// END PROGRAM

Fedora 上でのビルド、および実行は次のようにします。

$ gmcs -pkg:dotnet -target:winexe DataGridViewTest.cs
$ mono DataGridViewTest.exe &


Windows XP へ DataGridViewTest.exe をコピーして、(ダブルクリックして)実行した結果を以下に示しました。

アプリケーションで使用するスプレッドシートでも、Excel の機能すべてが必要ではありませんが、それでも、ほとんどの場合で必要になる共通な基本機能があります。これらを用意してある程度汎用性があるクラスを用意しておけば、利用価値が高くなります。

参考サイト


[1] Koders Code Search: Test.cs - C#