Programming」カテゴリーアーカイブ

C# で UTF-8 の INI

さて、STL で作った IniFile8 クラスを C# で作り替えているんだが。

C#のジェネリック -OKWave

ココとかを参考に std::pair 互換クラスを作ろうかとも。
でも今はよくワカンネ、別の方法で実装できるならそれでいいし。

意地でも同じ方法を行いたいのではなく「こういう処理がしたい」なので。
この言語にて最適な方法を探ったほうが強引に同じにするより自然だろうと。

StreamWriter クラス (System.IO)

んー、BOM は強制的に書き込まれてしまうということなんですね。
別に変換して ASCII で書き込むという方法もあるけどまあいいか。

文字列がnull(Nothing)か空文字列かを簡単に判定するには?[2.0のみ、C#、VB] ? @IT

うっ!そういえばそうだ、考えていなかった。
IniFile8 STL 版は空文字チェックなんてしていない。

C# でキーが見つからない場合は関数で null を返すようにしてテスト。
どうやらそういう使い方だけなら null チェックだけで済みそうだ。

C++ は試しに Cinema の設定で「リストアップ拡張子」を空にしてみる。
再起動すると…あぁやっぱり初期値の復活だ。

if ( (s.empty()) && (0 != s.length()) )

でチェックすればいいかな?
しかし C# のコードを探して C++ 版の不具合を見つけるとはなんとも。
やはり色々なアプリを平行して作るとイイことあるよ。

ということで。

UTF-8 の ini 読み書き

というコードがなんとかできた。

using IniFile

/* 略 */

private void Window_Closed(object sender, EventArgs e)
{
    IniFile8 ini = new IniFile8(@"D:\\00_Temp\\test.ini");
    ini.WriteInteger("Window", "Left", (int)this.Left);
    ini.WriteInteger("Window", "Top", (int)this.Top);
    ini.WriteString("Window", "Title", this.Title);
    ini.Save();
}

みたいなコードで使える。

Ubuntu で C# と C++

まてよ、mono の実行エンジンはインストールされているのかな?
とりあえず Vista でコンソールアプリを作り Ubuntu に持って行って実行してみる。
java じゃないんだからコンソールでないと動くはずがない。

まあ結果は動く、軽く調べるとどうやら実行エンジンは標準搭載らしい。
標準状態では C 言語さえコンパイルできないんだから C# は当然ムリか。

Mono 1.9.1のインストール – Programming/Mono – 総武ソフトウェア推進所

なんかイッパイ入れなきゃいけないみたいですけど…
そういえば Visual Studio 2008 のインストールは二時間掛かったっけか。
たった二分でインストールできた mono Develop で同等なわけがない。

特に Linux の場合 GUI アプリは gtk+ か Qt とか様々なわけで。
Windows 版のようにまとめて一気にインストールはそりゃ無謀かと納得。

2008-02-03 – ままならない日記

とりあえず mono-gmcs だけをインストール。
結果はコンパイルできた、よしよし、後は気が向いたら(ぉい!)

ちなみに、コード補完は C# でしかやってくれない。
思わず Ctrl+Space を押して SCIM を…略。

それより知らなかったのだがソースコードは UTF-8 で保存されるんだね。
ローケルのとうりになるのか、こりゃ日本語の扱いが更に面倒そう。
だけどコードページ 932 (つまり Shift-JIS)の呪縛が無いのは嬉しいね。

ということは…

やはり search.ini なんかも普通に char 配列で読み書きできるわな。
Firefox も Opera も設定が全部 UTF-8 なわけだよ、よく解った。
Windows も…バイナリ配布が普通の Windows では無理だと解っているけど。

C# テストが目的だったけど C++ コンパイラとして使うのも悪くないなコレ。
続く…かもしれない。

Ubuntu で C#

ふと気がついた。
C# を勉強しているんだから Ubuntu に Main Page – MonoDevelop を入れてみよう。
Linux ではどう動くか見てみたい。

Vista じゃないから遅いと思うけど…JAVA も死ぬほど遅いし。

一応書くと .NET Framuwork 技術基盤 CLI の Linux 実装の一つである。
追加と削除(Synaptic)に普通にあるのが怖い。

普通に日本語化されとりました、恐るべし。

あれ?C++ もコンパイルできるのだろうか。
試してみよう、VS と同じようにソリューションを作って雛形をとりあえず。

んでもってコンパイル…エラー。
何一つ詳細が出ない、VC++ のワケワカなのもイヤだが全く出ないのもどうかと。

Ubuntu日本語フォーラム / gccやbinutils, make のインストール

つまり Ubuntu デスクトップにははコンパイラもヘッダも入っていないってわけ…
make install の儀式をやらなくなったので気がつかなかった…
まあ気を取り直して…追加と削除に無いんですけど…

$ sudo apt-get install build-essential

と勘(ぅぉい!)でやってみたら普通にインストール完了。
見事 C/C++ はコンパイルできるようになりました。

普通に C/C++ 用の IDE としても使えるみたい、これは嬉しい。
何故もっと有名にならないの?

Linux のコンパイルは端末というイメージがあったので今まで無視していた。
だけどこんな使える IDE があるのなら少しやってみようかなと感じた。
Eclipse でできるのは知っているけど…遅いもん。

いよいよ肝心な C#。

今度は gmcs とやらが無いんかい…次回へ続く。

UNICODE にならん

pinvoke.net: StrCmpLogicalW (shlwapi)

むむっそうか、やっと自然順ソートで無限ループしてしまう問題が解決。

//[DllImport("shlwapi.dll")]  だけでは無限ループ
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]

ココが問題だったとは…なんつー解りにくい仕様。
C# 内部コードは UNICODE だから勝手に UNICODE で渡ると思い込んではダメだね。

やっとリストビュー部分の見た目だけが完成、ここまで長かったぞ!
ツリービューとアドレスバーで更に苦しみそうな気配。

Google のコードサーチで StringLogicalComparer なんてのも見つけたけどね。
C# コードのみで実装できるから魅力的なのであるが、こっちだと何故か順番が違う。

それにライセンスもイマイチ不明瞭だし、他人のコードを使うのは怖いというのもある。
今後ソースコードはすべてライセンス放棄で公開すると決めているのだから。

後 STL で作った IniFile8 クラスの C# 化もやっているんだが…
typedef の代わりは using で可能とかは検索では見つかったんだけーが…
コレでは型名として使えないようでインテリセンスに怒られまくり、まいった。

あぁ、ほとんど進まないまま連休が終わってしまった。
きっと Ubuntu が悪いんだ、又しても禁 Linux しなきゃいけないか?
でもブログアクセスのほとんどが Ubuntu ネタという現実はなんとも。

いっそ Ubuntu + Python + Qt とかに早めに移行したほうがよさげかも。
Palepoli が一段落したらやるつもりだったんだが…いつになるやら。

同一カラム表示

むむ、そうか。
StackPanel を使えば同じカラムに同時表示できるんだ。

<DataTemplate x:Key="tpl_name">
    <StackPanel Orientation="Horizontal">
        <Image Source="{Binding Path=image}"/>
        <TextBlock Text="{Binding Path=name}" HorizontalAlignment="Left" TextTrimming="CharacterEllipsis" />
    </StackPanel>
</DataTemplate>

のテンプレートを使って

<GridViewColumn Header="名前" CellTemplate="{StaticResource tpl_name}" />

で Explorer と同様の名前カラムに仕上がる。

後はアイコン取得と種類取得を行えばリストビュー部分は完成だ。
といってもインターフェイスだけだが、肝心の操作面はまだ何も…
そろそろツリー部分をやろう。
という間に日が変わった、明日も忙しいので寝なきゃ…先は長い。