love! LOVEHINA - love2hina.net
メニュー



アーカイブ
2008/03/16 ProFTPD 1.3.1 iconv 文字コード変換パッチ

作成者: カテゴリー: 未分類

ProFTPD iconv パッチをProFTPD 1.3.1に対応させてみています。

と、いうのも、ProFTPD 1.3.1にもオリジナルのパッチをあてても動作は一応するのですが、
OPTS UTF8 ONを送るクライアントの場合、問題が生じます。
というか、ProFTPDが異常終了してます…terminating (signal 11) で。

>OPTS UTF8 ON
>200 OPTS UTF8 on Command OK.

この時点から、クライアントが送るファイル名はUTF-8になりますが、
iconvパッチはこれを無視したまま、CharsetRemoteの設定に従い、強制変換します。
(CharsetRemoteがCP932ならば、UTF-8をCP932として変換してしまいます)

まぁ、ProFTPDのUTF-8オプションを切ってしまっても良いのですが、
できれば共存したいですしね…。

と、いうわけで。

ProFTPD 1.3.1 iconv 文字コード変換パッチ v2.00(ぷろとたいぷ)

特徴
・ローカルとリモート間の文字コード変換を行います。
・OPTS UTF8オプションを認識します。有効の場合、リモートをUTF-8としてコード変換します。

コンパイル方法
・オリジナルのProFTPD 1.3.1にパッチをあててください。
・configure 時に –with-modules=mod_codeconv を指定してください。
・–enable-nls は同時に指定できません。

設定
・従来通り、下記のディレクティブを設定します。
 CharsetLocal UTF-8
 CharsetRemote CP932

動作確認
・ローカル側は Fedora 8 i386, Fedora 8 armv5tel で確認。ともにUTF-8環境。
・リモート側は Windows Vista Explorer FTP(UTF-8), FFFTP(Shift-JIS) で確認。

NLSは使用できません。OPTS UTF8の処理が重複するからです。
この処理は当 mod_codeconv が行うようになります。

まだまだ開発途中ですので、(というかこの土日で作ったw)プロトタイプとして公開します。
デバッグも簡単に走らせたぐらいですので、ご利用の際は十分にご注意くださいませ。

なお、当方で認識している既知の問題点は、
・Windows Vista Explorer FTPクライアントからファイルの削除ができない
・Windows Vista Explorer FTPクライアントで大量のファイルを転送すると、文字化けを起こす

FFFTPからは特に問題はなさそうな感じです。

ダウンロードはこちらからどうぞ。

最後に、元の開発者であるT.Tsujikawaさんにお礼申し上げます。

2008/03/08 fedora8化した玄箱PROにuShareを導入する

作成者: カテゴリー: 未分類
uShare 1.1aに必要なものは最終的にこうなりました。
libdlnaは特に必ず必要ではないのものの、とりあえずいれてあります。

・pkg-config 0.23
・libupnp 1.6.4
・libdlna 0.2.3
・ffmpeg

まず、libupnpの導入は簡単。yumで配信されているので、これをインストールするだけでOK。

$ su -
# yum install libupnp libupnp-devel

libdlnaをコンパイルするのに、ffmpegのライブラリ群が必要なので、
ffmpegをmakeします。

コンフィグを共有ライブラリ設定で実行します。

$ cd ffmpeg
$ ./configure --enable-shared
$ make
$ su -
# make install

ようやく、libdlnaをmakeします。

$ cd libdlna-0.2.3
$ ./configure

Error, can't find libavformat !

エラーになりました...
調べてみると、ffmpegのバージョンが新しい為か、ヘッダーファイルの構成配置が変更されているようです。

libdlnaの想定
 - ffmpeg/avformat.h
ffmpegの配置
 - libavformat/avformat.h

そこで、コピーするか、シンボリックリンクで対処しましょう。
私は単純にコピーしました。

$ su -
# cd /usr/local/include
# mkdir ffmpeg
# cp livavcodec/* ffmpeg/
# cp livavdevice/* ffmpeg/
# cp livavformat/* ffmpeg/
# cp livavutil/* ffmpeg/

さて、通るでしょうか?

$ cd libdlna-0.2.3
$ ./configure

通りしましたので、makeします。

$ make

あら、makeの最後のシンボリックリンクで失敗します。

ln -sf libdlna.so. libdlna.so.
ln: `libdlna.so.' と `libdlna.so.' は同じファイルです

libdlna-0.2.3/src/Makefileの19行目を書き換えます。

- LIBNAME_MAJOR = $(LIBNAME_SHARED).$(shell echo $(VERSION) | cut -f1 -d.)
+ LIBNAME_MAJOR = $(LIBNAME_SHARED).0.2.3

$ make
$ su -
# make install

これで、ようやくuShare本体のコンパイル作業に入ります。

$ cd ushare-1.1a
$ ./configure --enable-dlna

Checking for libupnp >= 1.4.2
Error, libupnp < 1.4.2 !

と言われます。
どうやら、ヘッダーは見つかるのに、pkg-configで見つからないようです。
以下のような配置になっているためかと思われます。

/usr/lib/
	libupnp → yumでインストールした為

/usr/local/lib
	libdlna → 自分でmakeした為

そこで、環境変数で両方のライブラリパスを探すように設定します。

$ PKG_CONFIG_PATH="/usr/lib/pkgconfig/:/usr/local/lib/pkgconfig/"
$ export PKG_CONFIG_PATH
$ cd ushare-1.1a
$ ./configure --enable-dlna

Checking for libdlna >= 0.2.1 ...
Error, libdlna < 0.2.1 !

/usr/local/lib/pkgconfig/libdlna.pcをみてみると、Versionの項目が空でした。
これも8行目を直接設定してあげます。

- Version:
+ Version: 0.2.3

あとはすんなりとmakeできました。

$ cd ushare-1.1a
$ ./configure --enable-dlna
$ make
$ su -
# make install

試しに起動してみます。
(私はだいたい--helpを打ち込んでみます)

$ ushare --help

共有ライブラリが見つからないというエラーになります。
共有関係をみてみましょう。

$ ldd /usr/local/bin/ushare
        libixml.so.2 => /usr/lib/libixml.so.2 (0x40025000)
        libthreadutil.so.2 => /usr/lib/libthreadutil.so.2 (0x4002e000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x4003b000)
        libupnp.so.3 => /usr/lib/libupnp.so.3 (0x40059000)
        libdlna.so.0.2.3 => not found
        libavformat.so.52 => not found
        libavcodec.so.51 => not found
        libz.so.1 => /lib/libz.so.1 (0x40663000)
        libm.so.6 => /lib/libm.so.6 (0x4067c000)
        libavutil.so.49 => not found
        libc.so.6 => /lib/libc.so.6 (0x40741000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40876000)
        /lib/ld-linux.so.3 (0x40000000)
        libdl.so.2 => /lib/libdl.so.2 (0x40889000)

あらら、見事にffmpegとlibdlnaが見つかっていませんね。
そこで、/usr/local/lib/ にライブラリパスを通します。
シンボリックリンクでも良いのですが、今後も /usr/local/lib/ に
何かとライブラリを置きそうなので、こちらにしました。

$ su -
# vi /etc/ld.so.conf

で、

/usr/local/lib

という行を追加し、保存したら設定を適用します。

# ldconfig
# exit
$ ushare --help
uShare (version 1.1a), a lightweight UPnP A/V and DLNA Media Server.
Benjamin Zores (C) 2005-2007, for GeeXboX Team.
See http://ushare.geexbox.org/ for updates.

Usage: ushare [-n name] [-i interface] [-p port] [-c directory] [[-c directory]...]
Options:
 -n, --name=NAME        Set UPnP Friendly Name (default is 'uShare')
 -i, --interface=IFACE  Use IFACE Network Interface (default is 'eth0')
 -f, --cfg=FILE         Config file to be used
 -p, --port=PORT        Forces the HTTP server to run on PORT
 -q, --telnet-port=PORT Forces the TELNET server to run on PORT
 -c, --content=DIR      Share the content of DIR directory
 -w, --no-web           Disable the control web page (enabled by default)
 -t, --no-telnet        Disable the TELNET control (enabled by default)
 -o, --override-iconv-err       If iconv fails parsing name, still add to media contents (hoping the renderer can handle it)
 -v, --verbose          Set verbose display
 -x, --xbox             Use XboX 360 compliant profile
 -d, --dlna             Use DLNA compliant profile (PlayStation3 needs this)
 -D, --daemon           Run as a daemon
 -V, --version          Display the version of uShare and exit
 -h, --help             Display this help

どうやら、成功のようです。

*/

2008/02/24 2月終わってしまうやんけw

作成者: カテゴリー: 未分類

あまりの日記の過疎っぷりに絶望したッ!!!!!

…少しは書きましょうよ、私orz

じゃぁ、いろいろと箇条書き。

・足負傷w
 足怪我しました。まともに歩けないです。コマッタ。

・玄箱PROを買った
 fedora8化キットでfedora化したら、Sambaが動かない罠。
 意味ね-。
 自分でkernelをmakeして試行錯誤しているところ。
 無駄にLinuxの知識がレベルアップ中。

 パッパカパーン!(←ファンファーレ
 S.P は Linux Lv.が32にあがった!!!
 自前でkernelの差し替えができるようになった。

・HP Pavilion Notebook PC tx2005/CTを買おうと思ったら…
 売り切れてた。
 ビックカメラ店頭の表示によると、「予想を遙かに超えた受注数の為、販売を一時中止」…らしい。

・2月はなぜか週末毎週酒飲んでます
 今週末もありそう。確実に太りフラグ。
 スポーツクラブにでも入って泳ごうかな…って思ったところで怪我してるし…

2008/01/28 LOST ODYSSEY サントラ

作成者: カテゴリー: 未分類

本当に名曲ぞろいです。

2008/01/14 ダメなパターン その3

作成者: カテゴリー: 未分類

ああ、ようやく追いついて、今日の話。
今月はオーガスト祭ってことで、第一弾。

フィーナ姫と…

エステル様w

並べてみるw

一応、危なっかしくも自立するようです。

というか、姫様、ドレスのスカートが重過ぎっすw

…(゚Д゚;)はっ!だから1000円近くエステル様より高いのかっ!?

我等の(?)エステル様w

スカートが短い分、足の動きは自由度が高そう。

ああっ!!その冷めた眼差しがたまらないっスよwwwww

お二方とも、なんだか微妙にうつむき気味www
けれども、首の間接は上下には動かないみたい。

なるほど、空を見上げる、のようなことは出来ないようです。

2008/01/14 ダメなパターン その2

作成者: カテゴリー: 未分類

まぁ、年末に大掃除なるものをするわけですが。
ついでにということで模様替えをしてみたわけです。
どーん!!?

カオスってるwwww

部屋の中で点在していたのを集めたらこうなったw

案外持ってたんだなぁ…

せっかくもらったので貼ってみる その1

せっかくもらったので貼ってみる その2

例のワイド液晶。

と、益々ダメな感じになってます…

2008/01/10 ダメなパターン その1

作成者: カテゴリー: 未分類

いろいろとどたばたしていた関係上、ずいぶん前の話になってしまうのですが…
タイムリープの発売日にやってしまいましたw

やってしまった…。
ATI Radeon HD 3870とタイムリープ同時購入(爆笑

でかーw

ささらもついでにげっと。

でかーw

というか、いや、でかいって。

お顔もなかなかの出来でニヤニヤ(・∀・)してしまう…

横からー

下からー。
…って、ただの変態アングルやんかw

もう、ダメかもしれんw ワテ。

2007/12/19 ちょ、ワタシ、技術者っぽくね!?

作成者: カテゴリー: 未分類

いやぁ、なやんだわぁw
というわけで、私的技術メモ。

※内容の正誤も含め、これらを利用したことによる被害について、管理人は一切の責任を負いません。
まぁ、つまり間違っている可能性も多々ありますので、その点はご留意ください…。

★リフレクションのアセンブリロード関数の制限について。

アセンブリを読み込む関数に、生バイトを流し込むオーバーロード関数があります。

System.Reflection.Assembly.Load
http://msdn2.microsoft.com/ja-jp/library/system.reflection.assembly.load(VS.80).aspx

や、

System.AppDomain.Load
http://msdn2.microsoft.com/ja-jp/library/system.appdomain.load(VS.80).aspx

の、第一引数にバイト配列を受け取る関数が該当します。

これらは、アセンブリのファイルバイナリデータをそのまま渡して、ロードするというもの。
ぉ、ということは!

ファイルアーカイバデコーダーを作る

アーカイブからアセンブリDLLをバイナリデータをして取得

バイナリデータをそのままアセンブリとしてロード

…つまり、アーカイブファイル内のDLLをメモリ内で展開し、直接読み込めるので、
複数のDLLがひとまとめにでき、スッキリ( ゚Д゚)ウマウマー

と、思ったので、やってみるテスト。
まずは、ファイルストリームから直読み込みで。

System::IO::FileInfo^ infFileIO = gcnew System::IO::FileInfo(“infinity.FileIO.dll”);
System::IO::FileStream^ streamFileIO = gcnew System::IO::FileStream(infFileIO->FullName, System::IO::FileMode::Open, System::IO::FileAccess::Read, System::IO::FileShare::Read);

// バイトを読み込む
array^ bytesFileIO = gcnew array(streamFileIO->Length);
streamFileIO->Seek(0, System::IO::SeekOrigin::Begin);
streamFileIO->Read(bytesFileIO, 0, bytesFileIO->Length);

// ストリームを閉じる
streamFileIO->Close();

// 読み込むよ
assemblyFileIO = System::AppDomain::CurrentDomain->Load(bytesFileIO);

…実行時にこんなエラーが。

System.IO.FileLoadException が発生しました。
Message=”確認不可能なコードによるポリシー チェックが失敗しました。 (HRESULT からの例外: 0x80131402)”
Source=”mscorlib”
StackTrace:
場所 System.Reflection.Assembly.nLoadImage(Byte[] rawAssembly, Byte[] rawSymbolStore, Evidence evidence, StackCrawlMark& stackMark, Boolean fIntrospection)
場所 System.AppDomain.Load(Byte[] rawAssembly)
場所 infinity.Core.infinityCore.PluginManager..ctor(infinityCore objCore)

Σ(´Д`lll)ナンデストー
というわけで、テキトーに証拠を自前で指定してみりゅ。

System::IO::FileInfo^ infFileIO = gcnew System::IO::FileInfo(“infinity.FileIO.dll”);
System::IO::FileStream^ streamFileIO = gcnew System::IO::FileStream(infFileIO->FullName, System::IO::FileMode::Open, System::IO::FileAccess::Read, System::IO::FileShare::Read);

// バイトを読み込む
array^ bytesFileIO = gcnew array(streamFileIO->Length);
streamFileIO->Seek(0, System::IO::SeekOrigin::Begin);
streamFileIO->Read(bytesFileIO, 0, bytesFileIO->Length);

// SHA1を計算
System::Security::Cryptography::SHA1Managed^ shaFileIO = gcnew System::Security::Cryptography::SHA1Managed();
streamFileIO->Seek(0, System::IO::SeekOrigin::Begin);
shaFileIO->ComputeHash(streamFileIO);

// 証拠
System::Security::Policy::Evidence^ evidenceFileIO = gcnew System::Security::Policy::Evidence();

evidenceFileIO->AddHost(gcnew System::Security::Policy::Zone(System::Security::SecurityZone::MyComputer));
evidenceFileIO->AddHost(gcnew System::Security::Policy::Url(“file://” + infFileIO->FullName));
evidenceFileIO->AddAssembly(System::Security::Policy::Hash::CreateSHA1(shaFileIO->Hash));

// ストリームを閉じる
streamFileIO->Close();

// 読み込むよ
// ちなみに、第2引数はデバッグシンボルのバイナリを流し込むことができる(*.pdbのバイナリ)
assemblyFileIO = System::AppDomain::CurrentDomain->Load(bytesFileIO, nullptr, evidenceFileIO);

実行してみよう。

System.IO.FileLoadException が発生しました。
Message=”Attempt to load an unverifiable executable with fixup を含む確認できない実行可能ファイルを読み込もうとしています (3 セクション以上、または TLS セクションを含む IAT です)。 (HRESULT からの例外: 0x80131019)”
Source=”mscorlib”
StackTrace:
場所 System.Reflection.Assembly.nLoadImage(Byte[] rawAssembly, Byte[] rawSymbolStore, Evidence evidence, StackCrawlMark& stackMark, Boolean fIntrospection)
場所 System.AppDomain.Load(Byte[] rawAssembly, Byte[] rawSymbolStore, Evidence securityEvidence)
場所 infinity.Core.infinityCore.PluginManager..ctor(infinityCore objCore)

(´・ω・`)ショボーン
検証できないコードがあるとのご指摘のようです。

検証可能なタイプ セーフ コードの作成
http://msdn2.microsoft.com/ja-jp/library/01k04eaf(VS.80).aspx

確かに、コンパイラはC++/CLIであるし、コンパイラオプションは /clr、
つまり、アンマネージコードと混在しているため、PEVerifyでも警告が出る。

しかしながら、混在アセンブリがロードできないのでは、実用性として微妙なので、
どうにかならないものかと調べてみるが、衝撃の事実が…

以下のフォーラムを参照されたし。
http://www.dotnet247.com/247reference/msgs/26/134245.aspx

一番最後のレスポンスがトドメデアリマシタ。

意訳してみると、こんな感じでしょうか。

バイトストリームから、アンマネージコードを含むマネージアセンブリを読み込むことはできません。
CLRローダーのその部分の実装ではWindowsのLoadLibraryを使用していないため、
一切のアンマネージコードを扱うことができません。

ションボリダ…

■今日のまとめ

リフレクションでバイト配列からアセンブリをロードする場合、
対象のアセンブリは純粋なマネージコード(=検証可能なタイプセーフコード)で無ければなりません。

VB.NETやC#では、基本的には検証可能なタイプセーフコードになります。
C++/CLIの場合は、/clr:safe でコンパイルされたアセンブリが読み込めます。

■最後に

すごい長くなりましたが、これらのエラーで悩んでいた方の手助けになれば幸いです…orz

2007/12/01 真面目にトリビア?

作成者: カテゴリー: 未分類

たまには真面目な話題を書いてみようかと思います。

WindowsのAPIにGetCurrentProcessという関数があります。
日本語のMSDNはこちら。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_getcurrentprocess.asp

さて、英語版の方を覗いてみると、一歩踏み込んで面白いことが書いてあります。
http://msdn2.microsoft.com/en-us/library/ms683179.aspx

解説(Remarks)冒頭部分を意訳するとこんな感じでしょうか。

解説:
擬似ハンドルは現在のプロセスを示す特別な定数値です。
現在では-1が常に返されますが、将来のWindowsの為に(仕様変更する可能性もあるため)
-1をそのままコードに書き込むべきではなく、この GetCurrentProcess 関数を呼び出すのが最善の方法です。

あれ? -1の値のハンドルって…

#define INVALID_HANDLE_VALUE (HANDLE)-1

…不正なハンドルを示す値と同じなのですね…
なので、念には念をと思っても、こんなことはしちゃいけない訳ですねw

HANDLE hndCurProcess = ::GetCurrentProcess();
if (hndCurProcess == INVALID_HANDLE_VALUE) {
// エラー処理;
}

あと、ハンドルを閉じようとしても駄目ですw

HANDLE hndCurProcess = ::GetCurrentProcess();
BOOL result = ::CloseHandle(hndCurProcess);

普通にエラーが返ってきちゃいますw

大概日本語版のMSDNは古いことが多いので、本家の英語版も確認しましょうというお話なのでした。
トリビアでも何でもねぇな、コレw

2007/11/30 久々にラノベ

作成者: カテゴリー: 未分類

久々に買いました。
『吸血鬼のひめごと』

実はラノベに出会ったのが、『吸血鬼のおしごと』(1巻)だったので、非常に思い入れが深いシリーズだったりします。