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

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

*/

コメントなし

コメントを残す

2月終わってしまうやんけw

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

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

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

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

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

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

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

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

コメントなし

コメントを残す

LOST ODYSSEY サントラ

本当に名曲ぞろいです。

コメントなし

コメントを残す

ダメなパターン その3

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

フィーナ姫と…

エステル様w

並べてみるw

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

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

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

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

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

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

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

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

コメントなし

コメントを残す

ダメなパターン その2

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

カオスってるwwww

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

案外持ってたんだなぁ…

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

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

例のワイド液晶。

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

コメントなし

コメントを残す

ダメなパターン その1

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

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

でかーw

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

でかーw

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

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

横からー

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

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

コメントなし

コメントを残す

ちょ、ワタシ、技術者っぽくね!?

いやぁ、なやんだわぁ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

コメントなし

コメントを残す

真面目にトリビア?

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

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

コメントなし

コメントを残す

久々にラノベ

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

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

コメントなし

コメントを残す

2008年手帳を買いました

ほぼ日手帳 2年目です。
http://www.1101.com/store/techo/index.html

こうして、今2007年の手帳を振り返ると、空白ばかり…
私は本当に毎日つけるのが下手なようですね。

もうすこしがんばらないと…。

コメントなし

コメントを残す