故郷を離れて三十数年、関東で暮らす永遠の少年のどーってことない日記
xxSEARCHxx
プロフィール

ST☆FF

Author:ST☆FF
HTTといえばインテルの Hyper-Threading Technology!・・・ではなく、放課後ティータイムのことだと思います。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム
ブログ内検索
RSSフィード
リンク

最近の記事


アプリケーション構成ファイルとの格闘2 

2013/04/20 17:18/Sat
以前「アプリケーション構成ファイルとの格闘」において、タグ(のセット)を可変個数設定する方法について書きました。
今回、XMLファイルを別ファイルにすることでシンプルかつ編集可能にもする方法を見つけたので書きたいと思います。
XMLをバリバリ使いこなしておられる諸兄にはイロハのイでしょうが、私の職場環境は良くも悪くもアプリケーション構成ファイルに
ズブズブの状態であるため、掘り下げる機会もあまりなく、ほとんど初心者レベルなのであります。

今回の素材には「ID」と「氏名」を記述するXMLファイルを用い、変化をつけるため「ID」は数値として扱ってみます。
百聞は一見に如かず、下のような感じです。

【Persons.xml】
<?xml version="1.0" encoding="utf-8" ?>
<Settings>
<Person>
<ID>1</ID>
<Name>サンプル一郎</Name>
</Person>
<Person>
<ID>2</ID>
<Name>サンプルニ郎</Name>
</Person>
<Person>
<ID>3</ID>
<Name>サンプル三郎</Name>
</Person>
</Settings>

以降がこのファイルにアクセスするためのクラスです。
上位から順に見ていきます。
まず、ルートにある「Settings」タグを展開するためのクラスを定義します。
直下の「Person」タグの展開用に「CPerson」クラスオブジェクトを要素に持たせます。
「Person」タグの繰り返しは配列として表現します。

【Settings.vb】
Imports System.Xml.Serialization

''' <summary>
''' ルート要素となる「Settings」の内容を定義するクラス
''' </summary>
''' <remarks>"Person"タグが可変個数定義対応</remarks>
<XmlRoot("Settings")> _
Public Class CSettings

' Personタグ
' 可変個数定義を配列として表現
<XmlElement("Person")> _
Public person As CPerson()

End Class

次に「Settings」タグ直下の「Person」タグを展開するための「CPerson」クラスを定義します。
数値型の「ID」と文字列型の「氏名」を要素に持たせます。

【Person.vb】
Imports System.Xml.Serialization

''' <summary>
''' ルート要素直下の子要素「Person」の内容を定義するクラス
''' </summary>
''' <remarks></remarks>
Public Class CPerson

' IDタグ
<XmlElement("ID")> _
Public ID As Integer

' Nameタグ
<XmlElement("Name")> _
Public Name As String

End Class

最後にテスト用のコードです。
ボタン一つを配置したフォームを用意し、Clickイベントに下記コードを配置します。

【Form1.vb】
Imports System.IO
Imports System.Xml.Serialization

Public Class Form1
Private order As String() = _
{"", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"}
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' 読み込み対象とするファイルパスを指定
' 以下は、実行ファイルと同じパスにXMLファイルがある前提
Dim path As String = _
System.IO.Path.Combine(Application.StartupPath, "Persons.xml")
Dim serializer As New XmlSerializer(GetType(CSettings))
Dim wkSettings As New CSettings
Try
' XMLファイルのEncodingを取得
Dim xmlDoc As New XmlDocument
xmlDoc.Load(path)
' 最初の子要素<?xml>(宣言部)を取得
' 取得した<?xml>要素(XmlNode型)をXmlDeclarationに
' キャストしてからEncoding属性を取りだす
Dim xmlEnc As System.Text.Encoding = _
System.Text.Encoding.GetEncoding(CType(xmlDoc.FirstChild, XmlDeclaration).Encoding)
' XMLファイルを読み込む
Using stream As FileStream = New FileStream(path, FileMode.Open)
' デシリアライズ処理
' Settingsクラスのオブジェクトに展開
wkSettings = CType(serializer.Deserialize(stream), CSettings)
End Using

' 最終メンバの情報を表示
Dim msg As String = "ID = " + wkSettings.person(wkSettings.person.Length - 1).ID.ToString() + vbNewLine + _
"Name = " + wkSettings.person(wkSettings.person.Length - 1).Name.ToString()
MessageBox.Show(msg, "最終メンバ")

' 最終メンバのIDを変更
wkSettings.person(wkSettings.person.Length - 1).ID = wkSettings.person.Length + 100

' 10人目まではメンバを追加
If wkSettings.person.Length < order.Length - 1 Then
Dim p As New CPerson
p.ID = wkSettings.person.Length + 1
p.Name = "サンプル" + order(p.ID) + "郎"
ReDim Preserve wkSettings.person(wkSettings.person.Length)
wkSettings.person(wkSettings.person.Length - 1) = p
End If

' 変更した内容を元のXMLファイルに上書き保存する
Using xmlWtr As New System.Xml.XmlTextWriter(path, xmlEnc)
' 字下げ(改行付き)で書き出す
xmlWtr.Formatting = Xml.Formatting.Indented ' 字下げ有効
xmlWtr.IndentChar = " "c ' 字下げキャラクタ
xmlWtr.Indentation = 2 ' 字下げ幅

' シリアライズ処理(保存)
serializer.Serialize(xmlWtr, wkSettings)
End Using

Catch ex As Exception
MessageBox.Show(ex.Message, "例外発生")

End Try

End Sub
End Class

ボタンをクリックすると、末尾「Person」の内容を表示してから、そのIDに100を加算し、新たな「Person」を追加して保存します。






スポンサーサイト
CATEGORY:仕事関係 | CM(0) | TB(0) |

「日本の韓国統治に関する細密な報告書」 

2013/04/14 01:50/Sun
近年、韓国人を嫌う日本人が明らかに増えてきているが、表面的な部分だけを見て嫌悪感を抱くのは
致し方のないことではある。
だが、何故彼らはそうするのか、何故彼らはそう考えるのか、といった内面や歴史的背景を知ることも
必要だと思う。
勿論、彼らが主張の根拠としている事案について、その真偽をあきらかにすることが最も重要であるが、
両国の未来を見据えたときに、果たして歩み寄れる希望があるのかないのか、その見定めも重要である。

私も職業柄、中国人や韓国人のSEと仕事をしたことはあるが、少なくとも私の目から見て、日本在住の
彼らは至って普通の人間に見えた。中国人は非常に真面目だったし、韓国人はユーモアもあり、私の
片言の朝鮮語をきいて「濃音」がきれいだと褒めてくれたりした。

最近、非常に興味のある韓国人のブログを知った。この人は、日本に対する知識も豊富で、冷静に母国を
見ていると評判らしい。

あるときこの人は、アメリカの行政学者、アレイン・アイランド(Alleyne Ireland. 1871-1951)
という人が1926年に書いた

「The New Korea」

という本の韓国語版を入手した。そのタイトルは

「日本の韓国統治に関する細密な報告書」

であったという。興味を抱いて調べたところ、日本では発売されていないことがわかった。
ここからがこの人の凄いところで、なんとその本を日本語に翻訳してしまったという。
その内容がブログにまとめられているので、ご紹介したい。

誇らしい大韓民国|シンシアリーのブログ
誇らしい祖国とは何でしょうか|シンシアリーのブログ

生の韓国人の考え方に触れる機会は稀だと思うので、暫くの間勉強をさせて頂こうと思っている。



CATEGORY:所感 | CM(0) | TB(0) |

FtpWebRequest の落とし穴 

2013/04/07 01:38/Sun
Windows Server に対して、クライアントアプリから FTP を使用したい場合がある。
特に周辺処理系がUNIX上にあり、制御系が Windows Server で動いている環境において
安価にファイル転送が行えるため、よく用いられるプロトコルである。
.netアプリの場合、一般的に System.Net.FtpWebRequest、System.Net.FtpWebResponseの
両クラスを使用することで、シンプルなコードでそのプロトコルの恩恵に与ることが出来る。

ところでこの FtpWebRequest クラスには思いがけない落とし穴がある。
よく知られたFTP 用のパラメータを設定して利用しても、意味不明のエラーが発生する場合が
あるのだ。
たとえば FtpWebRequest インスタンスの生成を例にとると

Dim ftpReq As System.Net.FtpWebRequest = _
CType(System.Net.WebRequest.Create(uri), System.Net.FtpWebRequest)

において、下記エラーで WebRequest.Create(uri)がインスタンス生成に失敗する。
「リモート サーバーがエラーを返しました: (403) 使用不可能」

あるいはファイルをアップロードするためのStreamを取得する場合、

Dim reqStrm As System.IO.Stream = ftpReq.GetRequestStream()

において GetRequestStream()で下記例外が発生する。
「要求された FTP コマンドは、HTTP プロキシを使用しているときにはサポートされません。」

どうやら FtpWebRequest が WebRequest を継承しているため、デフォルトでHTTP Proxy を
使用する設定になっている事が原因のようだ。
FTPであるにもかかわらず、IE に設定してある HTTP Proxy を勝手に使用している事がそもそもの
間違いなのである。

HTTP Proxy を無効にするにはインスタンスのプロパティに対し

ftpReq.proxy = Nothing

としても良いのだが、正解はstaticプロパティへの1行で息の根を止めることだ。

System.Net.WebRequest.DefaultWebProxy = Nothing



CATEGORY:仕事関係 | CM(0) | TB(0) |
xx HOME xx