<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xml:lang="ja">
<channel>
<title>BOOLEANLABEL</title>
<link>http://d.hatena.ne.jp/fd0/</link>
<description>BOOLEANLABEL</description>
<dc:creator>fd0</dc:creator>


<item>
<title>[cygwin] 続・unable to remap が rebase で解決しなかった時の話</title>
<link>http://d.hatena.ne.jp/fd0/20120507/p1</link>

<description><![CDATA[
<div class="section">
<p>前回の対応からしばらく起きていなかったが、ちょっと前から再発するようになってきたので、いろいろ追加調査してみた結果をまとめる。</p>

<ul>
<li> <a href="http://d.hatena.ne.jp/fd0/20120326/p1" target="_blank"> unable to remap が rebase で解決しなかった時の話 - BOOLEANLABEL</a></li>
</ul>
<a name="seemore"></a>

<br>

<p>rebaseall は setup.exe からインストールしたすべての DLL に一意な base を割り当てるため、大量の DLL を置いている場合は一部の DLL の base が負になってしまうことがある。</p>
<p>こうなると再度 rebaseall をしようとしても、rebase.exe が使用する cygiconv-2.dll や cyggcc_s-1.dll が unable to remap を吐いて、rebase 自体が起動できなくなってしまう。こうなってしまった場合はこれらの DLL を setup.exe から再ダウンロード→インストールすれば良い。</p>
<p>また、DLL は一旦ロードされると Windows の再起動までその base を使い続けるらしいため、rebase した結果は再起動しないと反映されない。</p>
<p>以上より、unable to remap の問題を解決するには以下のとおりにやれば良い。</p>
<br>

<pre>
while (何かしらの unable to map で cygwin shell が起動できない) {
  if (rebase が実行できない) {
    unable to remap になる cygiconv-2.dll or cyggcc_s-1.dll を再インストールする。
  }
  unable to remap が起きなくなるように -b を調整して、rebase を実行する。
  Windows を再起動する。
}
</pre>

<br>

<p>本家 ML でも先月あたりにここらへんの話で盛り上がってました。</p>

<ul>
<li> <a href="http://www.mail-archive.com/cygwin@cygwin.com/msg122500.html" target="_blank">Two probable basing issues causing fork failures: (1) cygreadline7.dll h</a></li>
</ul>
</div>
]]></description>

<dc:creator>fd0</dc:creator>

<pubDate>Sun, 06 May 2012 15:00:00 GMT</pubDate>



<category>cygwin</category>


</item>

<item>
<title>[cygwin] 非アーカイブからパッケージにする時の HACK</title>
<link>http://d.hatena.ne.jp/fd0/20120329/p1</link>

<description><![CDATA[
<div class="section">
<p>実は 0.10.9 現在の cygport では想定するソースはアーカイブである必要があるという制限がある。具体的に言うと、hoge.c みたいな単体のソーステキストからパッケージにするには少し HACK が必要となる。</p>
<a name="seemore"></a>

<br>

<p>cygport のサブコマンド prep は内部の unpack() という関数で指定されたファイルの拡張子を基に解凍するコマンドを決定している。</p>
<br>

<blockquote title="cygwin-ports.git.sourceforge.net/git/gitweb.cgi?p=cygwin-ports/cygport;a=blob_plain;f=lib/src_prep.cygpart;hb=HEAD" cite="http://cygwin-ports.git.sourceforge.net/git/gitweb.cgi?p=cygwin-ports/cygport;a=blob_plain;f=lib/src_prep.cygpart;hb=HEAD">
<pre class="syntax-highlight">
<span class="synComment"># unpacks archives</span>
unpack<span class="synStatement">()</span> <span class="synSpecial">{</span>
<span class="synStatement">local</span> unpack_cmd<span class="synStatement">;</span>
<span class="synStatement">local</span> unpack_file_path<span class="synStatement">;</span>
<span class="synStatement">local</span> unpack_file_name<span class="synStatement">;</span>
<span class="synStatement">local</span> unpack_out<span class="synStatement">;</span>

<span class="synStatement">for</span> unpack_file_path
<span class="synStatement">do</span>
<span class="synIdentifier">unpack_file_name</span>=<span class="synPreProc">${unpack_file_path</span><span class="synStatement">##</span>*/<span class="synPreProc">}</span><span class="synStatement">;</span>

<span class="synStatement">if</span> <span class="synStatement">[</span> <span class="synStatement">!</span> <span class="synStatement">-f</span> <span class="synPreProc">${unpack_file_path}</span> <span class="synStatement">]</span>
<span class="synStatement">then</span>
error <span class="synStatement">&#34;</span><span class="synConstant">Cannot find source package </span><span class="synPreProc">${unpack_file_name}</span><span class="synStatement">&#34;;</span>
<span class="synStatement">fi</span>

<span class="synComment"># determine correct source decompression command</span>
<span class="synStatement">case</span> <span class="synPreProc">${unpack_file_path}</span> <span class="synStatement">in</span>
*.asc|*.md5|*.sig|*.sign<span class="synStatement">)</span>  <span class="synStatement">continue</span> <span class="synStatement">;;</span>
*.tar.bz2|*.tbz2|*.tar.bz|*.tbz<span class="synStatement">)</span> <span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">tar jxf</span><span class="synStatement">&#34;</span> <span class="synStatement">;;</span>
*.tar.gz|*.tgz|*.tar.Z<span class="synStatement">)</span> <span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">tar zxf</span><span class="synStatement">&#34;</span> <span class="synStatement">;;</span>
*.tar.lzma|*.tar.xz<span class="synStatement">)</span>
check_prog_req xz
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">tar --xz -xf</span><span class="synStatement">&#34;</span>
<span class="synStatement">;;</span>
*.tar.lz<span class="synStatement">)</span>
check_prog_req lzip
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">tar -I lzip -xf</span><span class="synStatement">&#34;</span>
<span class="synStatement">;;</span>
*.tar.lzo<span class="synStatement">)</span>
check_prog_req lzop
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">tar --lzop -xf</span><span class="synStatement">&#34;</span>
<span class="synStatement">;;</span>
*.tar<span class="synStatement">)</span>  <span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">tar xf</span><span class="synStatement">&#34;</span>  <span class="synStatement">;;</span>
*.bz2<span class="synStatement">)</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">bunzip2 -c</span><span class="synStatement">&#34;;</span>
<span class="synIdentifier">unpack_out</span>=<span class="synStatement">&#34;</span><span class="synPreProc">${unpack_file_name</span><span class="synStatement">%</span>.bz2<span class="synPreProc">}</span><span class="synStatement">&#34;;</span>
<span class="synStatement">;;</span>
*.cpio.gz<span class="synStatement">)</span>
<span class="synStatement">if</span> check_prog bsdtar
<span class="synStatement">then</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">bsdtar zxf</span><span class="synStatement">&#34;;</span>
<span class="synStatement">else</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">__cpio_gz_extract</span><span class="synStatement">&#34;;</span>
<span class="synStatement">fi</span>
<span class="synStatement">;;</span>
*.gz<span class="synStatement">)</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">gunzip -c</span><span class="synStatement">&#34;;</span>
<span class="synIdentifier">unpack_out</span>=<span class="synStatement">&#34;</span><span class="synPreProc">${unpack_file_name</span><span class="synStatement">%</span>.gz<span class="synPreProc">}</span><span class="synStatement">&#34;;</span>
<span class="synStatement">;;</span>
*.gem<span class="synStatement">)</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">__gem_extract</span><span class="synStatement">&#34;;</span>
<span class="synStatement">;;</span>
*.rar<span class="synStatement">)</span>
check_prog_req unrar<span class="synStatement">;</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">unrar x -inul</span><span class="synStatement">&#34;;</span>
<span class="synStatement">;;</span>
*.src.rpm<span class="synStatement">)</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">__srpm_extract</span><span class="synStatement">&#34;;</span>
<span class="synStatement">;;</span>
*.shar<span class="synStatement">)</span>
check_prog_req unshar<span class="synStatement">;</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">unshar</span><span class="synStatement">&#34;;</span>
<span class="synStatement">;;</span>
*.xar<span class="synStatement">)</span>
check_prog_req xar<span class="synStatement">;</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">xar -xf</span><span class="synStatement">&#34;;</span>
<span class="synStatement">;;</span>
*.zip|*.ZIP<span class="synStatement">)</span>
check_prog_req unzip<span class="synStatement">;</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">unzip -oq</span><span class="synStatement">&#34;;</span>
<span class="synStatement">;;</span>
*.7z<span class="synStatement">)</span>
<span class="synStatement">if</span> check_prog 7zr
<span class="synStatement">then</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">7zr x</span><span class="synStatement">&#34;;</span>
<span class="synStatement">elif</span> check_prog 7za
<span class="synStatement">then</span>
<span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">7za x</span><span class="synStatement">&#34;;</span>
<span class="synStatement">else</span>
error <span class="synStatement">&#34;</span><span class="synConstant">p7zip is required to unpack this source package</span><span class="synStatement">&#34;;</span>
<span class="synStatement">fi</span>
<span class="synStatement">;;</span>
*<span class="synStatement">)</span> <span class="synIdentifier">unpack_cmd</span>=<span class="synStatement">&#34;</span><span class="synConstant">cp -t </span><span class="synPreProc">${SRC_DIR}</span><span class="synStatement">&#34;</span> <span class="synStatement">;;</span>
<span class="synStatement">esac</span>

__step <span class="synStatement">&#34;</span><span class="synConstant">Unpacking source </span><span class="synPreProc">${unpack_file_name}</span><span class="synStatement">&#34;;</span>

<span class="synStatement">if</span> defined unpack_out
<span class="synStatement">then</span>
<span class="synStatement">if</span> <span class="synStatement">!</span> <span class="synPreProc">${unpack_cmd}</span> <span class="synPreProc">${unpack_file_path}</span> <span class="synStatement">&#62;</span> <span class="synPreProc">${unpack_out}</span>
<span class="synStatement">then</span>
error <span class="synStatement">&#34;</span><span class="synPreProc">${unpack_cmd}</span><span class="synConstant"> </span><span class="synPreProc">${unpack_file_name}</span><span class="synConstant"> failed</span><span class="synStatement">&#34;;</span>
<span class="synStatement">fi</span>
<span class="synStatement">else</span>
<span class="synStatement">if</span> <span class="synStatement">!</span> <span class="synPreProc">${unpack_cmd}</span> <span class="synPreProc">${unpack_file_path}</span>
<span class="synStatement">then</span>
error <span class="synStatement">&#34;</span><span class="synPreProc">${unpack_cmd}</span><span class="synConstant"> </span><span class="synPreProc">${unpack_file_name}</span><span class="synConstant"> failed</span><span class="synStatement">&#34;;</span>
<span class="synStatement">fi</span>
<span class="synStatement">fi</span>
<span class="synStatement">done</span>
<span class="synSpecial">}</span>
</pre>

<cite><a href="http://cygwin-ports.git.sourceforge.net/git/gitweb.cgi?p=cygwin-ports/cygport;a=blob_plain;f=lib/src_prep.cygpart;hb=HEAD" target="_blank">cygwin-ports.git.sourceforge.net/git/gitweb.cgi?p=cygwin-ports/cygport;a=blob_plain;f=lib/src_prep.cygpart;hb=HEAD</a></cite></blockquote>
<br>

<p>非アーカイブの場合は case 文の最後の条件にマッチすることになるため、cp でコピーをする処理に入るのだが、SRC_DIR はこのファイルを処理する前に別のアーカイブがアーカイブと同じ名前のルートディレクトリを含んでいて、それが既に展開されていることを仮定しているため、そのままではコピー先のディレクトリがないと言われてエラーになってしまう。</p>
<p>ちなみにアーカイブであっても、そのアーカイブがアーカイブ名と同じルートディレクトリを含まない場合は unpack() の後の cd で移動先のディレクトリがないと言われて、同様にエラーとなってしまう。</p>
<p>ここでコピー先となる SRC_DIR の初期値はアーカイブの名前から拡張子を覗いたものであるが、アーカイブの名前とアーカイブ内のルートディレクトリの名前が異なる場合はこの変数を .cygport ファイル内で再定義する必要がある。</p>
<p>アーカイブ内にルートディレクトリがある場合は SRC_DIR の再定義で対処できるが、ルートディレクトリがない場合やそもそもソーステキストのみしか配布されていない場合はルートディレクトリを用意する必要がある。</p>
<p>unpack() を見る限り外部から hook するのは難しいと思ったが、unpack_cmd を function にすることで対処できることに気づいた。</p>
<br>

<pre class="syntax-highlight">
unzip<span class="synStatement">()</span>
<span class="synSpecial">{</span>
        /usr/bin/unzip <span class="synPreProc">$*</span> -d <span class="synPreProc">${SRC_DIR}</span>
<span class="synSpecial">}</span>
</pre>

<pre class="syntax-highlight">
cp<span class="synStatement">()</span>
<span class="synSpecial">{</span>
        <span class="synStatement">mkdir</span> -p <span class="synPreProc">${SRC_DIR}</span>
        /usr/bin/cp <span class="synPreProc">$*</span>
<span class="synSpecial">}</span>
</pre>

<br>
<p>上記のようなコマンド名と同じ function を定義することで行儀の良くないアーカイブからでもパッケージにすることができる。<span class="footnote"><a href="/fd0/#f1" name="fn1" title="以前はルートディレクトリを &#39;.&#39; にすることでお茶を濁していたが、再度 *-src.tar.bz2 からパッケージにする際にパッチをきちんと適用できないという問題があったため、別の方法を考える必要があった。">*1</a></span></p>
<h4> まとめ</h4>
<pre>
if (ソースがアーカイブ) {
        if (アーカイブがルートディレクトリを含む) {
                そのままで良い
        } else {
                ダミーのルートディレクトリをつくってそこにアーカイブを展開させる
        }
} else { // ソーステキストのみ
        ダミーのルートディレクトリをつくってそこにコピーする
}
</pre>

<br>

<p><span style="font-weight:bold;color:#FF0000;" class="deco">【追記】tar を再定義する場合は prep の場合のみ動作するようにする必要がある。</span></p>
<pre class="syntax-highlight">
tar<span class="synStatement">()</span>
<span class="synSpecial">{</span>
        <span class="synStatement">case</span> <span class="synPreProc">${argv[${arg_n}]}</span> <span class="synStatement">in</span>
                prep|unpack<span class="synStatement">)</span>
                        <span class="synStatement">mkdir</span> -p <span class="synPreProc">${P}</span>
                        <span class="synStatement">cd</span> <span class="synPreProc">${P}</span>
                <span class="synStatement">;;</span>
        <span class="synStatement">esac</span>
        /usr/bin/tar <span class="synPreProc">$*</span>
<span class="synSpecial">}</span>
</pre>

</div>
<div class="footnote">
<p class="footnote"><a href="/fd0/#fn1" name="f1">*1</a>：以前はルートディレクトリを &#39;.&#39; にすることでお茶を濁していたが、再度 *-src.tar.bz2 からパッケージにする際にパッチをきちんと適用できないという問題があったため、別の方法を考える必要があった。</p>
</div>
]]></description>

<dc:creator>fd0</dc:creator>

<pubDate>Wed, 28 Mar 2012 15:00:00 GMT</pubDate>



<category>cygwin</category>


</item>

<item>
<title>[cygwin] unable to remap が rebase で解決しなかった時の話</title>
<link>http://d.hatena.ne.jp/fd0/20120326/p1</link>

<description><![CDATA[
<div class="section">
<p>cygwin をそれなりに触っていると unable to remap というエラーに出会ったことがあると思います。</p>
<a name="seemore"></a>

<br>

<p>だいたい発生するのは自分でビルドした DLL を使うバイナリを起動した時でこういう場合には /bin/rebaseall はパッケージの DLL しか対象としないために自分でビルドした DLL をオプションで追加で指定してやる必要があります。</p>
<p>その方法については他の方の記事がぐぐれば出てくるので、そちらを参照してください。</p>

<ul>
<li> <a href="http://d.hatena.ne.jp/basyura/20110706/p1" target="_blank"> unable to remap - basyura’s blog</a></li>
<li> <a href="http://tambourine.cocolog-nifty.com/dengon/2012/01/cygwinfatal-err.html" target="_blank">Cygwinで”fatal error - unable to remap”と言われた: ここにはいないボクへの伝言</a></li>
<li> <a href="http://d.hatena.ne.jp/taotao1942/20120211/1328915156" target="_blank"> 自ビルドしたパッケージの rebase - 壁は通り抜けられませんよ</a></li>
</ul>
<br>

<p>自分の手元で起きた時も同じ問題だと思って rebase していたのですが、何故かある時から rebase しても解決できないようになりました。</p><p>いろいろ調べてみた結果、-b オプションでデフォルトのベースアドレスを 0x70000000 から小さい値に変えてみたら上手くいきました。<span class="footnote"><a href="/fd0/#f1" name="fn1" title="ただし、小さくし過ぎると逆に動かなくなることがありましたので注意してください。">*1</a></span></p>
<p>ところがしばらくすると -b オプションでも解決できなくなってしまいました。さらにぐぐってみたりしましたが、さすがにこれ以上は出てきませんでした...。</p>
<br>

<p>ふとエラーメッセージを見た感じで勝手に 32bit 空間が足りないんじゃないか？となんとなく思って Virtualbox に 64bit で OS から再インストールしたら、何故か発生しなくなりました。</p>
<br>

<blockquote title="feezch" cite="http://feezch.info/vt/show-95-15.html">
<p>704 名無しさん＠お腹いっぱい。 2011/10/04 (火) 18:04:54</p>
<p>Cygwin使っている人いますか？ その20 (UNIX板)</p>
<p>fork()地獄について</p>
<p>常識みたいだけど俺は知らなかったので書いとく</p>
<p>Vista以降ではrebaseallだけでなくpeflagsallってのも実行して、さらに</p>
<p>再起動する必要もあるみたいね</p>
<p>Vista以降にはセキュリティのためにASLRという機能があって、</p>
<p>これがcygwinのfork()エミュレーションと相性が悪いようだ</p>
<p>cygwinではrebaseallでDLLをロードするベースアドレスを衝突しないように</p>
<p>割り振っているけれども</p>
<p>ASLRでは、重要なデータや関数の位置が固定だと攻撃されやすいので</p>
<p>OSがランダムにリロケートするようになっている</p>
<p>PEにはASLRを許可するフラグ(DynamicBase)があって、</p>
<p>cygwinではpeflags.exeというツールでそれを弄れるようになっている</p>
<p>現在のPEのフラグは、objdump -p foo.exeとかやれば見れる</p>
<p>rebaseall同様、インストールされているexeやdllなどのフラグを全て書き換えるために</p>
<p>peflagsallというシェルスクリプトも提供されているので、それを使えってことの</p>
<p>ようだ</p>
<p>ただしこれらは/etc/setup以下から対象となるリストを取ってくるので、</p>
<p>野良ビルドしたもの(perlやpythonの拡張を後で入れたりした場合もありがち）は</p>
<p>含まれない</p>
<p>そういう環境ではスクリプトを弄るなどして自分で対処しないといけないと思う</p>
<p>ぶっちゃけWin7 64bitとかだと、死にかけのcygwinを無理やり使っているような</p>
<p>感じがしないでもない……</p>
<cite><a href="http://feezch.info/vt/show-95-15.html" target="_blank">feezch: Cygwin使っている人いますか？ その20 過去ログ - 15ページ目</a></cite></blockquote>
<br>

<p>自分の手元の環境だと cygwin ports から DLL を持ってきていたりもしているため、もしかしたら base の割り当てを使い切っていたのかもしれないですね。</p>
<br>

<pre>
% head -5 /tmp/rebase.log
/usr/lib/virtuoso/hosting/wikiv.dll: new base = 1fba0000, new size = 50000
/usr/lib/virtuoso/hosting/wbxml2.dll: new base = 1fbf0000, new size = 10000
/usr/lib/virtuoso/hosting/mediawiki.dll: new base = 1fc00000, new size = 60000
/usr/lib/virtuoso/hosting/im.dll: new base = 1fc60000, new size = 10000
/usr/lib/virtuoso/hosting/creolewiki.dll: new base = 1fc70000, new size = 50000
%
</pre>

</div>
<div class="footnote">
<p class="footnote"><a href="/fd0/#fn1" name="f1">*1</a>：ただし、小さくし過ぎると逆に動かなくなることがありましたので注意してください。</p>
</div>
]]></description>

<dc:creator>fd0</dc:creator>

<pubDate>Sun, 25 Mar 2012 15:00:00 GMT</pubDate>



<category>cygwin</category>


</item>

<item>
<title>[life] GX-W70HV(B) を買ってみた</title>
<link>http://d.hatena.ne.jp/fd0/20120211/p2</link>

<description><![CDATA[
<div class="section">
<p>去年の年末の話なんですけどね。（；＾ω＾）</p>
<div class="hatena-asin-detail">
  <a href="http://www.amazon.co.jp/dp/B00687EU5K/?tag=hatena_st1-22&ascsubtag=d-1j45v"><img src="http://ecx.images-amazon.com/images/I/41mQzH6LWpL._SL160_.jpg" class="hatena-asin-detail-image" alt="ONKYO DLNA対応ワイヤレススピーカーシステム 15W+15W GX-W70HV(B) /ブラック" title="ONKYO DLNA対応ワイヤレススピーカーシステム 15W+15W GX-W70HV(B) /ブラック"></a>
  <div class="hatena-asin-detail-info">
    <p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/dp/B00687EU5K/?tag=hatena_st1-22&ascsubtag=d-1j45v">ONKYO DLNA対応ワイヤレススピーカーシステム 15W+15W GX-W70HV(B) /ブラック</a></p>
    <ul>
      
      <li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%F3%A5%AD%A5%E8%A1%BC" class="keyword">オンキヨー</a></li>
      
      <li><span class="hatena-asin-detail-label">発売日:</span> 2011/12/03</li>
                                                      <li><span class="hatena-asin-detail-label">メディア:</span> Personal Computers</li>
      <li> <span class="hatena-asin-detail-label">クリック</span>: 5回</li>
      <li><a href="http://d.hatena.ne.jp/asin/B00687EU5K" target="_blank">この商品を含むブログ (2件) を見る</a></li>
    </ul>
  </div>
  <div class="hatena-asin-detail-foot"></div>
</div>

<a name="seemore"></a>

<br>

<p>なんとこのスピーカーはワイアレス再生ができるため、HDD の中の音楽をこのスピーカーから流せる。</p>
<br>

<p>ちなみに MacBook Air に <a href="http://en.wikipedia.org/wiki/List_of_UPnP_AV_media_servers_and_clients" target="_blank">List of UPnP AV media servers and clients - Wikipedia, the free encyclopedia</a> に書いてあるソフトウェアを片っ端から入れてみたのだが、そもそもレンダラのリストにスピーカーが見えなかったり、やっと見えたと思って再生をさせたら、音量調節も停止もできずに一曲まるまる大音量で流れちゃったとかで、どうにもまともに使うことはできない。</p>
<br>
<p>それで今は VirtualBox にインストールしている Windows7 の Windows Media Player から操作するようにしている。<span class="footnote"><a href="/fd0/#f1" name="fn1" title="Linux も入れてみたが、やはりソフトウェアからはスピーカーが見えたり見えなかったりと不安定だった。">*1</a></span></p>
<br>

<p><center><a href="http://www.flickr.com/photos/blowofmercy/6855221555/" title="GX-W70HV(B) with Windows Media Player by blowofmercy, on Flickr"><img width="640" alt="GX-W70HV(B) with Windows Media Player" src="http://farm8.staticflickr.com/7183/6855221555_1746704b38_z.jpg" height="498"></a></center></p>
<br>

<p>たぶん VirtualBox 側でネットワークをブリッジアダプタにしてあげないと見えないと思う。</p>
<p>あとは windows ヘルプに書いてあるとおりにすれば、上のスクショみたいに Windows Media Player の右上のあたりのメニューにスピーカーが見えるはずだから、それを選択するとリモート再生の小窓が起動するので、そいつで普通にコントロールできる。</p>
</div>
<div class="footnote">
<p class="footnote"><a href="/fd0/#fn1" name="f1">*1</a>：Linux も入れてみたが、やはりソフトウェアからはスピーカーが見えたり見えなかったりと不安定だった。</p>
</div>
]]></description>

<dc:creator>fd0</dc:creator>

<pubDate>Fri, 10 Feb 2012 15:00:00 GMT</pubDate>



<category>life</category>


</item>

<item>
<title>[PHP] phozzil (1)</title>
<link>http://d.hatena.ne.jp/fd0/20120211/p1</link>

<description><![CDATA[
<div class="section">
<p>探してみたら IO_Bit というのもありました。</p>

<ul>
<li> <a href="http://openpear.org/package/IO_Bit" target="_blank">IO_Bit ￥ Package ￥ Openpear</a></li>
</ul>
<p>string をがっつり渡して、integer などに変換するインタフェースっぽい。resource から string にするまでは関与しないということらしい。</p>
<br>

<p>以下、これらを踏まえてのインタフェースについての考察を述べてみる。</p>
<br>

<h4> string ≒ byte[] ?</h4>
<p>PHP は基本的に resource からの入出力データインタフェースが string である。そのため、バイナリデータを扱うためには string に対して <a href="http://www.php.net/manual/ja/function.pack.php" target="_blank">pack</a> / <a href="http://www.php.net/manual/ja/function.unpack.php" target="_blank">unpack</a> や <a href="http://www.php.net/manual/ja/function.ord.php" target="_blank">ord</a> を使うのが定石っぽい。</p><p>PHP の文字列は言語仕様を見ると Java における byte[] に近い <span class="footnote"><a href="/fd0/#f1" name="fn1" title="[http://www.php.net/manual/ja/language.types.string.php:title]">*1</a></span> とは言え、ストリームからのデータが string を経由することを利用者が意識しないといけないのはあんまりスマートじゃない気がするため、resource を渡したオブジェクトから直接 readXXX したら、その型のデータで得られるインタフェースが望ましいのではないかと思っている。(つまり java.io っぽいやつ)</p>
<br>

<h4> エンディアン</h4>
<p>バイナリデータを扱う場合に出てくるもう一つの問題がエンディアンで、これもライブラリによっていろいろ扱いが異なっている。</p>
<p>java.io ではビッグエンディアン決め打ちになっているし、上述の IO_Bit や <a href="http://code.google.com/p/php-reader/" target="_blank">php-reader</a> では read メソッドの末尾に LE/BE という suffix があり、呼び出し毎に利用者が指定するようになっている。</p>
<p>せっかく LE/BE があるのはありがたいとは思うけど、逆にストリームの中で頻繁にエンディアンが変わる場合があるのかも気になる。コンストラクタでデフォルトのエンディアンを指定しておけばいいのではないかと感じる。</p>
</div>
<div class="footnote">
<p class="footnote"><a href="/fd0/#fn1" name="f1">*1</a>：<a href="http://www.php.net/manual/ja/language.types.string.php" target="_blank">PHP: 文字列 - Manual</a></p>
</div>
]]></description>

<dc:creator>fd0</dc:creator>

<pubDate>Fri, 10 Feb 2012 15:00:00 GMT</pubDate>



<category>PHP</category>


</item>

<item>
<title>[PHP] phozzil (0)</title>
<link>http://d.hatena.ne.jp/fd0/20120203/p1</link>

<description><![CDATA[
<div class="section">
<p>そろそろなんかちゃんとしたコードを公開しないとプログラマとして淘汰されるなあと強迫観念みたいなものを感じてる今日この頃です。</p>
<br>

<p>ここ一年くらい業務でログ集計系のコードを書くことが多く、その際に毎回、ログをパーズするためのプリミティブなファイルシステム関数の一連のコードをおまじないのようにコピペすることに抵抗があったため、java.io みたいなクラス群にまとめられないかなと思った。</p>
<p>既にこの要求を満たすものがあれば、それを使えばいいわけであるため、調べてみると当然ながら既に同じようなことを考えている人はいた。</p>

<ul>
<li> <a href="http://www.phing.info/" target="_blank">      Phing    </a>

<ul>
<li> <a href="http://www.phing.info/trac/browser/classes/phing/system/io" target="_blank">      Internal Error ? Phing    </a></li>
</ul>
</li>
<li> <a href="http://code.google.com/p/php-reader/" target="_blank"> php-reader -   The best PHP library for Object-Oriented media file information reading and writing. - Google Project Hosting </a>

<ul>
<li> <a href="http://code.google.com/p/php-reader/source/browse/trunk/src#src%2FZend%2FIo" target="_blank">/trunk/src -  php-reader -   The best PHP library for Object-Oriented media file information reading and writing. - Google Project Hosting </a></li>
</ul>
</li>
</ul>
<br>

<p>前者はまさに java.io のインタフェースに沿っているなあという印象で、後者はバイナリデータ周りの実装がきちんと整っている。ただし、いずれも名前空間を使っていない。</p>
<p>とりあえずこの 2 つのいいとこどりをしたものを書いてみるというところから始めてみることにしてみようと思う。</p>
<br>

<p>ちなみに repo はつくってあるけど、中身はまだない。</p>

<ul>
<li> <a href="https://gitorious.org/phozzil/phozzil" target="_blank">phozzil in phozzil - Gitorious</a></li>
</ul>
</div>
]]></description>

<dc:creator>fd0</dc:creator>

<pubDate>Thu, 02 Feb 2012 15:00:00 GMT</pubDate>



<category>PHP</category>


</item>

</channel>
</rss>

