.net」タグアーカイブ

他人の動画プレイヤー

他人の動画プレイヤーを宣伝。
っっってォイ!マジでやる気ゼロかよ。

DMediaPlayer – Simple VLC frontend – Home

というのをネットをウロウロしていて見つけた。
驚いたことに C# 製だ、よくぞ C# でこのアレな業界に挑戦しようと思ったものだ。

技術的興味だと思うんだけどね、私はそんな勇気なんて無いから SeeMe から .NET 化したわけで。
WPF を絡めないとエンドな人は .NET な時点で興味どころか徹底的に嫌ってくれると解っているもの。
とはいえ WPF を絡めても Vista が普及してくれないと…

VLC media player – Overview のライブラリを使って再生するアプリらしい。

libvlc.dll が必要であるようだ、しかし libvlc.dll だけでは動かない。
なので VLC をインストールしているディレクトリに直接コピーして試してみる。
まぁ書くまでもなく VLC クローン、WMP コントロール貼り付けアプリと同じってことだね。

D&D 未対応…
なのに「開く」ダイアログは拡張子ごとの指定…
しかも前回の指定を記憶しないって…

Linux ならコレでもイイが Windows のユーザーって選択肢が多いから手厳しいよ…
でもこのインターフェイスは本物 VLC に違和感が消えない人の救世主になるかもしれない。
但し Vista ではボリュームバーがチカチカしてウザいぞ!

とりあえず「今後に期待」かな。

なんにせよオープンソースなので参考にはなる、メタボリックにならないことを祈るが。
C# なので Mono で…略。

こっち方面の作者はソースコードくらいは見ておいたほうがよさげ。
どいつもこいつも開店休業してんじゃネェよコノヤロウ!

そういう私も Cinema が止まっているが、そろそろ更新するか。

改行コード

あれ?改行コードが LF(0x0A) しか無いぞ。
知らなかった、C# では \n エスケープ文字は LF のみなんだ、、、、、

一応説明しておくと C++ で \n はコンパイルした環境に合わせます。
つまり Windows でコンパイルすると CRLF、Linux では LF になります。

\r\n としなきゃいけないのね、問題無く動くから気がつかなかった。
Linux 版を作る時にココを書き換えなきゃ、覚えておこう。

それとついうっかり保存で ID チェックを入れてしまった。
これじゃ整理する時に面倒だ、このチェックはヤメよう。

とりあえず Opera での読み込みなんかは問題無いので日曜にでも。
毎度のことながらやり始めるとキリがない。

短期集中連載:Silverlightの全貌—目次:ITpro

実はそろそろ Silverlight をやりたいんだけーが。
あぁすっかり .NET な人になってしまった、、、、、

XP on WPF

さて .NET Framework 3.5 を XP にインストールしたので覚書。
久々にノートでブログネタを書いているけどキーボードがちっちゃいなぁ…

ダウンロードセンターの開発リソース

から .NET Framework 3.5 を落としす、たった 2.8kb。
だがコイツはランチャだから開始すると巨大な .NET の本体が落ちてくる。
まあ私の環境で三十分程度で完了。

んで、SeeMe WPF 版起動。

判っていたのだが XP での起動速度には唖然。
セレロン M 1.4G だが三十秒近くも掛かってしまう。

あれま、メイリオ指定のまま普通に起動できちゃったよ。
フォントが無い場合の対応策は万全ってことでいいんですかいね、MS さん。

てゆーか…XP だと WPF も XP のテーマになっちゃうんだね。
Vista での洗練された表示を知っているのならガッカリなんですけど。
だけど両立を考えたらこうなってしまうんだろうと納得。

まあとにかく解った、XP でも動く。

但し、死ぬほどパフォーマンスが悪い!
リストをクリックしても選択状態になるまでワンテンポ遅れる。
ウインドのリサイズなんて悲しいくらい遅い、JAVA 同然。

XP では全部 CPU で処理しているのだろうか?
それともこの Dynabook の GPU がショボすぎるのだろうか?

しかし XP で C# 開発をしている人達はよく耐えているなぁ。
って、よく考えたら Visual Studio 2008 は XP でも動くんだっけ。
そりゃ WPF は XP で全部動かなきゃおかしいわな、はよ気がつけ俺。

結論。

次の SeeMe を XP で使う人、耐えてくれ。
もう時代がコッチなんだ。

out

using System;

namespace test_cs1
{
    class MainClass
    {
        private static void Seifuku(out string a, out string b)
        {
            a = "水色の";
            b = "セーラー服";
        }
        public static void Main(string[] args)
        {
            string s = "紺色の";
            string t = "ブレザー";
            Seifuku(out s, out t);
            Console.WriteLine(s + t);
            Console.Read(); //閉じないように
        }
    }
}

なんだ、ref で string を参照渡しがどーのとか以前書いたがこうすればイイんだ。
引数指定の両方に out を付けるだけね、ふんふん。

この方法ならば C/C++ っぽく書ける、無理に C/C++ っぽくする必要は無いと思うけど。
どうしても戻り値に string を使いたくない場合があるのよ。
とにかくコレで IniFile8 C# 版も同様の処理が可能になるな。

常識だったりして…
個人的には yield return 並に衝撃だったんだけど…
C# はまだ始めて三ヶ月なのでまあこんな感じです。

#include <stdio.h>

void Seifuku(char *a, char *b)
{
	sprintf_s(a, 256, "%s", "水色の");
	sprintf_s(b, 256, "%s", "セーラー服");
}
int main(int argc, char* argv[])
{
	char s[256];
	char t[256];
	sprintf_s(s, 256, "%s", "紺色の");
	sprintf_s(t, 256, "%s", "ブレザー");
	Seifuku(s, t);
	printf("%s%s\n", s, t);
	getchar(); //閉じないように
}

こんなコードに比べたら遙かに解りやすい構文だし。

試しに mono でもやってみたけど普通にコンパイル完了。
なるほど、C# 言語仕様は見事にトレースしているんだ。

つーか

Mono って StreamReader も foreach 文も Windows と全く同様に扱える。
それどころか Generic も同じように問題無く使える。
ココまで再現していると思わなかった、違うのは GUI 部分だけだ。
こりゃどっちでも使えるライブラリを作らなきゃ損って気分。

何をやろうとしているかは何となく解るでしょう。

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();
}

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