2015年3月23日月曜日

Clojureでawtの画面を表示

ClojureからawtのWindowを表示するだけのサンプルプログラムです。
(ns myawt)

(import '(java.awt Frame)
        '(java.awt.event WindowListener))

(def window-width 600)
(def window-height 480)

(doto (Frame.)
    (.addWindowListener
        (proxy [WindowListener] []
            (windowActivated [e])
            (windowClosed [e] (System/exit 0))
            (windowClosing [e] (.dispose (.getWindow e)))
            (windowDeactivated [e])
            (windowDeiconified [e])
            (windowIconified [e])
            (windowOpened [e])))
     (.setSize window-width window-height)
     (.setVisible true))
windowClosedとwindowClosingのイベントハンドラを実装するのがポイントです。

参照
Frame
WindowListener

2014年9月29日月曜日

行指向ファイル処理フレームワーク

業務でファイルを一行ずつ読み込んで処理するプログラムをコーディングしているのですが、提供された設計書のフローチャートに従って実装を進めていたら、脳みそがぐちゃぐちゃにかき回されるようないらだちを覚えました。
"ファイルを一行ずつ読み込んで処理する"という要件は、あちこちで需要がありそうなので、モデルを考えてみました。 Process、FileFinder、FileHandler、LineHandlerの4つのクラスで構成します。

2014年9月22日月曜日

VB.NETを使い始めて戸惑ったこと3つ

最近VB.NETを使っているのですが、いくつか戸惑ったことがあったので紹介します。

Forループの終了条件
処理を10回繰り返そうとして次のようにFor文を記述します。
For i = 0 To 10
    Console.WriteLine(i)
Next
実行すると、11回実行されます。Toもループ変数の範囲に含むんですね。

charリテラル
VB.NETでは、charリテラルを次のように記述します。
Dim c As Char = "A"c
""c…。

抽象クラスの宣言
VB.NETでは、抽象クラスを次のように記述します。
Public MustInherit Class AbstractClass

End Class
MustInheritは「継承しないと使えないよ」という意味でしょうか。

2014年9月15日月曜日

JScriptからInternetExplorerを操作してYahoo!JAPANを検索する

JScriptからIEを操作し、Yahoo!JAPANで"ほどよくしっかり"を検索させてみました。











ちゃんと、このブログが先頭に表示されました。
JScriptからIEを操作できるということは、標準入力と標準出力を使ってIEを操作できるということで、諸々の自動化が捗るかもしれないということです。興味深い。

以下、コードです。

2014年9月8日月曜日

.NETで改行を含む文字列を組み立てるならStringWriterがおすすめ

プログラムの実行時に文字列を組み立てるなら、StringBuilderクラスを使うのが定石です。しかし、改行で区切った文字列を組み立てようとすると、どうにも見苦しくなってしまいます。
var sb = new StringBuilder()
.Append("select *").Append(Environment.NewLine)
.Append("  from Table1").Append(Environment.NewLine)
.Append(" where Column1 = @Value1").Append(Environment.NewLine);


そんなときはStringWriterクラスを使うのがお勧めです。
var sw = new StringWriter();
sw.WriteLine("select *");
sw.WriteLine("  from Table1");
sw.WriteLine(" where Column1 = @Value1");

コードがスッキリ見やすくなりました。

参照
StringWriterクラス
StringBuilderクラス

2014年9月1日月曜日

ADO.NETのData ProviderでRDBへの依存をカプセル化するにはDbProviderFactoryを使う

これまでに経験したシステム開発では、DBを決めずに開発が始まることはなかったので、必要になる場面はなかなかないと思いますが、DbProviderFactoryを使えばRDBに依存しないコードが書けます。
次に例を示します。
    class Class1
    {
        private readonly DbProviderFactory factory;
        private readonly string connectionString;

        public Class1(DbProviderFactory factory, string connectionString)
        {
            this.factory = factory;
            this.connectionString = connectionString;
        }

        public List<object> Method1()
        {
            using (var conn = factory.CreateConnection())
            using (var command = factory.CreateCommand())
            {
                conn.ConnectionString = connectionString;
                conn.Open();

                command.Connection = conn;
                command.CommandText = "select * from Table1 where ID = @ID";

                var param = factory.CreateParameter();
                param.ParameterName = "ID";
                param.Value = "ID1";
                command.Parameters.Add(param);

                var reader = command.ExecuteReader();

                var result = new List<object>();
                while (reader.Read())
                {
                    var arr = new object[reader.FieldCount];
                    reader.GetValues(arr);
                    result.Add(arr);
                }

                return result;
            }
        }

実際にはSQLもRDBに合わせてコーディングしないといけないので、DbProviderFactoryだけでは不十分と思います。

2014年8月25日月曜日

ASP.NET開発を始めるにあたって参考にした記事3つ

ASP.NETアプリケーション開発に取り組んで1ヶ月になりました。
開発も終盤にさしかかってきたので、忘れないうちに開発スタート時に参考にした記事を3つ紹介します。

@IT プログラミングASP.NET
ASP.NETについて、基本から解説してあります。(連載なので、正確には1記事ではないかも)
全体を把握するのにおすすめです。特に重要だと感じたキーワードを挙げておきます。
  • ポストバック
  • ビューステート
  • データバインド

ASP.NET Page Life Cycle Overview
ASP.NETプログラミングの特徴のひとつに、イベントドリブン方式で実装することがあります。この特徴を活用するには、イベントの順番を把握しなければなりません。この記事ではそれが紹介されています。
今回のプロジェクトで主に使用したイベントと、用途を紹介します。
  • Page_Init…ページやコントロールのフィールドを初期化する。オブジェクトをセッションから取得するなど。
  • Page_Load…コントロールの初期化をする。ドロップダウンリストの項目をセットするなど。
  • Button_Click…ユーザーの入力値を受け取る。入力値をもとに業務ロジックを呼び出して結果を受け取る。
  • Page_PreRender…業務ロジックの結果をコントロールへ反映する。

ASP.NET Application Life Cycle Overview for IIS 7.0
上で紹介したライフサイクルよりも、大きなサイクルについての記事です。アプリケーションやセッションの初期処理を組み込もうとするときに参考になります。

これまで食わず嫌いでASP.NETには手をつけてこなかったのですが、実際に開発をしてみるとすんなり進められました。今後は、ASP.NET案件にも積極的に取り組んでいこうと思います。