プログラミング: 2010年9月アーカイブ

VisualBasic で作っているコンソールアプリケーションの話。

取りあえず、テストの時にはコマンドラインから使用するコンフィグファイルを設定出来るようになってる方が楽なので、この間作ったプログラムをちょっと修正。

(1) コマンドラインでコンフィグファイル名を指定出来るように修正

メイン処理の先頭に、コマンドライン引数の読込処理を追加。
ファイル名が指定されていれば、ローカル変数にセット。

Dim fn As String = ""

For Each cmd As String In My.Application.CommandLineArgs
    If cmd <> "" Then
        fn = cmd
        Exit For
    End If
Next

(2) 取得したファイル名を引数にして Sub プロシージャ呼び出し

ConfigRead(fn)

(3) ファイル名を引数で受け取るように Sub プロシージャ修正

Sub ConfigRead(ByVal Fn As String)

    Dim line As String = ""
    Dim al As New ArrayList

    ' ファイル名が指定されてなければ処理を抜ける
    If Fn = "" Then
        Console.WriteLine("Config File name is Null.")
        Return
    End If

    Using sr As StreamReader = New StreamReader(Fn, Encoding.GetEncoding("Shift_JIS"))
<以下略>

という感じ。

これで、引数で渡されたコンフィグファイルを読むようになる。

20100914_1_test.jpgconfig.txt と config2.txt をそれぞれ読み込んでみた↑テスト。

20100910_vb_test.jpg

さて、来週には Visual Basic を開発言語にする案件を受注できそうなので、色々と細々した動きを実験してみる。

何せ、.NET 系の Visual Basic は初めての経験なので(^^;、絶対に必要になる「正規表現」と「連想配列」の書き方もまったくわからん。
つーことで、入門書やサイトを参考に、取りあえず、

(1) コンフィグファイルを読み込む
    ※コンフィグファイルには、設定項目名と設定値がTAB区切りで書かれている
      (例)HOST ftp.exsample.com
(2) 正規表現を使い、設定項目名と設定値を切り出す
(3) 切り出した設定項目名をキーとした連想配列(ハッシュ)に設定値をセット

・・・という動きをするコンソールアプリケーションを書いてみた。

下記のような感じ。(Main 処理の For Each はデバッグ用なので意味無し)

Imports System
Imports System.IO
Imports System.Text
Imports System.Collections

Module Module1

    Public gConfig As Hashtable = New Hashtable

    Sub Main()

        ConfigRead()

        ' DEBUG用出力
        For Each key As String In gConfig.Keys
            Console.WriteLine("gConfig({0})={1}", key, gConfig(key))
        Next

    End Sub

    Sub ConfigRead()

        Dim line As String = ""
        Dim al As New ArrayList
        Dim fn As String = "M:\x\tmp\job\config.txt"

        Using sr As StreamReader = New StreamReader(fn, Encoding.GetEncoding("Shift_JIS"))

            line = sr.ReadLine()
            Do Until line Is Nothing
                al.Add(line)
                line = sr.ReadLine()
            Loop

        End Using

        For i As Integer = 0 To al.Count - 1

            Dim r As New System.Text.RegularExpressions.Regex("^(.+?)\t(.+)$")
            Dim mc As System.Text.RegularExpressions.MatchCollection = r.Matches(al.Item(i))

            For Each m As System.Text.RegularExpressions.Match In mc
                gConfig(m.Groups(1).Value) = m.Groups(2).Value
            Next

        Next i

    End Sub

End Module

これで、ばっちりグローバル変数で定義した連想配列 gConfig に、config.txt から読み込んだ設定内容がセットされた。

しかし、Visual Basic の正規表現。Web 上でも何か情報が妙に古かったり、そもそも情報が少なかったり。(^^:
あんま、VB の世界じゃ使われんのかね?(そう言えば、VB しか知らないプログラマに正規表現の話をしたら、きょとんとしてたな(^^;)

正規表現が使えれば、substr を始め、いくつかの文字列編集関係の命令は不要になるほど正規表現は強力なんだけどな。

もっと正規表現を使おう!!>VB プログラマ

20100903_vb_test.jpg

Visual Basic で FTP クライアント機能を作らないといけない案件があるので、昨日 AIR で作ってみた HTML ソース表示アプリと同じものを Visual Basic 2010 で作ってみた。

参考にしたのは「DOBON.NET プログラミング道:Socketを使ってファイルをダウンロードし表示する」のサンプル。
まあ、ほとんどそのままですけど(笑)
System.Net.Dns.Resolve メソッドは旧式だから使っちゃ駄目!というエラーが出たので、System.Net.Dns.GetHostEntry メソッドに変更したくらい。

Visual Basic 6.0 の Winsock コントロールを使ったコーディングと比べると、随分変わったな。まあ、Perl の Socket 通信コーディングなんかに近いんで、この方がわかりやすいが。

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim server As String = TextBox1.Text
        Dim reqMsg As String = "GET /" + vbCrLf
        Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("utf-8")
        Dim reqBytes As Byte() = enc.GetBytes(reqMsg)

        'ホスト名からIPアドレスを取得
        Dim hostadd As System.Net.IPAddress = System.Net.Dns.GetHostEntry(server).AddressList(0)

        'IPアドレスとポート番号情報を格納(コネクションポイント)
        Dim ephost As New System.Net.IPEndPoint(hostadd, 80)

        'Socketの作成
        Dim sock As New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)

        '接続
        sock.Connect(ephost)

        'リクエストメッセージを送信
        sock.Send(reqBytes, reqBytes.Length, System.Net.Sockets.SocketFlags.None)

        '受信する
        Dim resBytes(1023) As Byte
        Dim mem As New System.IO.MemoryStream
        While True
            Dim resSize As Integer = sock.Receive(resBytes, resBytes.Length, System.Net.Sockets.SocketFlags.None)
            If resSize = 0 Then
                Exit While
            End If
            mem.Write(resBytes, 0, resSize)
        End While
        Dim resMsg As String = enc.GetString(mem.GetBuffer(), 0, CInt(mem.Length))
        mem.Close()

        '閉じる
        sock.Shutdown(System.Net.Sockets.SocketShutdown.Both)
        sock.Close()

        '受信したメッセージを表示する
        TextBox2.Text = resMsg

    End Sub

End Class

さて、次は FTP クライアントを作成してみよう。

このアーカイブについて

このページには、2010年9月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2010年8月です。

次のアーカイブはプログラミング: 2010年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら