<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>はらぺこ日誌</title>
	<atom:link href="http://blog.harapeko.jp/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.harapeko.jp</link>
	<description>株式会社はらぺこ 公式ブログ</description>
	<pubDate>Sun, 05 Sep 2010 09:41:33 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MinGW のインストール方法がガラッと変わっていた (と思ったら元に戻っていた?) 件</title>
		<link>http://blog.harapeko.jp/2010/09/02/mingw-install/</link>
		<comments>http://blog.harapeko.jp/2010/09/02/mingw-install/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 16:19:54 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[技術メモ]]></category>

		<category><![CDATA[GCC]]></category>

		<category><![CDATA[MinGW]]></category>

		<category><![CDATA[otoco]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=123</guid>
		<description><![CDATA[メインマシンではなくノートパソコンの方にも MinGW を入れていたはずなのですが、何故か msys.bat が消えていたりとなんだかいろいろと崩壊していたので、この際だからと最新の物をインストールすることにしました。
ところが、MinGW のダウンロードサイトにて「Download Now!」と書かれたリンクボタンをクリックすると、インストーラの exe ファイルではなく、何故か zip ファイルがダウンロードされ、展開すると謎のディレクトリ構成が…。

試しに生成された bin ディレクトリ下の mingw-get.exe ファイルをダブルクリックしてみますが、一瞬コマンドプロンプトが表示されるだけで、何も行われません。こいつはいったい何なのか?
ぐぐってみたところ、MinGW ポータルの Getting Started ページに行き当たりました。どうやら、上記で落としてきたファイルを C:\MinGW ディレクトリ下に展開し、 C:\MinGW\bin ディレクトリを環境変数 PATH に追加した上で、コマンドプロンプトから

mingw-get install パッケージ名 [パッケージ名 ...]

とタイプすれば、お好みのパッケージのみをダウンロードし、よしなにインストールしてくれる、という物なのでした。 install コマンドの他、update コマンドや upgrade コマンドも用意されているので、言わば apt-get の MinGW 版、といったところでしょうか。
ただ、こいつを使ってインストールされる GCC が、 Getting Started のページでは 3.x 系であるとされていたのですが、実際には 4.5.0 がインストールされるようです (9/5 追記: すでにこの記述も 4.5 に修正されているようですね)。前回メインマシンに入れた GCC は 4.4.0 [...]]]></description>
			<content:encoded><![CDATA[<p>メインマシンではなくノートパソコンの方にも MinGW を入れていたはずなのですが、何故か <code>msys.bat</code> が消えていたりとなんだかいろいろと崩壊していたので、この際だからと最新の物をインストールすることにしました。</p>
<p>ところが、MinGW の<a href="http://sourceforge.net/projects/mingw/files/" title="Browse MinGW - Minimalist GNU for Windows Files on SourceForge.net">ダウンロードサイト</a>にて「Download Now!」と書かれたリンクボタンをクリックすると、インストーラの exe ファイルではなく、何故か zip ファイルがダウンロードされ、展開すると謎のディレクトリ構成が…。<br />
<span id="more-123"></span><br />
試しに生成された <code>bin</code> ディレクトリ下の <code>mingw-get.exe</code> ファイルをダブルクリックしてみますが、一瞬コマンドプロンプトが表示されるだけで、何も行われません。こいつはいったい何なのか?</p>
<p>ぐぐってみたところ、MinGW ポータルの <a href="http://www.mingw.org/wiki/Getting_Started">Getting Started</a> ページに行き当たりました。どうやら、上記で落としてきたファイルを <code>C:\MinGW</code> ディレクトリ下に展開し、 <code>C:\MinGW\bin</code> ディレクトリを環境変数 <code>PATH</code> に追加した上で、コマンドプロンプトから</p>
<pre>
mingw-get install パッケージ名 [パッケージ名 ...]
</pre>
<p>とタイプすれば、お好みのパッケージのみをダウンロードし、よしなにインストールしてくれる、という物なのでした。 <code>install</code> コマンドの他、<code>update</code> コマンドや <code>upgrade</code> コマンドも用意されているので、言わば <code>apt-get</code> の MinGW 版、といったところでしょうか。</p>
<p>ただ、こいつを使ってインストールされる GCC が、 Getting Started のページでは 3.x 系であるとされていたのですが、実際には 4.5.0 がインストールされるようです (9/5 追記: すでにこの記述も 4.5 に修正されているようですね)。前回メインマシンに入れた GCC は 4.4.0 でしたが、 4.4.0 では <code>&lt;unorderd_map&gt;</code> を利用するコードをコンパイルするのに <code>-std=gnu++0x</code> オプションが必要であったのに対し、 4.5.0 では <code>-std=c++0x</code> オプションでもコンパイルできてしまったりと、早くも微妙な相違点を見つけてしまい、どっちで統一すべきか迷ってみたり…</p>
<p>なお、 <code>mingw-get</code> コマンドが知らないオプションを渡そうとした場合 (例えば、<code>mingw-get install gcc</code> とタイプしようとして、誤って <code>mingw-get gcc</code> などとタイプしてしまった場合)、深刻なエラーとやらが発生し、何故か <code>mingw-get</code> コマンドを実行できない状態になってしまうようです。その場合は、<code>C:\MinGW\bin\mingw-get.exe~</code> ファイルを <code>mingw-get.exe</code> に、 <code>C:\MinGW\libexec\mingw-get\mingw-get-0.dll~</code> ファイルを <code>mingw-get-0.dll</code> に、それぞれリネームしてあげて下さい。それで再び使えるようになるはずです。</p>
<p>それから、必要な追加ライブラリの類は、相変わらず手動でインストールした方が良さそうです。 libiconv をインストールしようとしたのですが、 mingw-get でインストールできるのは <code>msys-libiconv</code> というやつだけで、これだとどういう訳か MSYS 上ですらそのままではコンパイルできなかったりするので (コンパイル時にヘッダファイルのディレクトリとライブラリのディレクトリを指定し、実行時に DLL があるディレクトリのパスを通してやればよいのですが…面倒だし)。</p>
<hr />
2010年  9月  5日 日曜日 17:29:19 JST - <strong>追記</strong></p>
<p>今し方<a href="http://sourceforge.net/projects/mingw/files/" title="Browse MinGW - Minimalist GNU for Windows Files on SourceForge.net">ダウンロードサイト</a>を覗いてみたところ、 Inno Setup によるインストーラが復活しているようです。但し、以前までのインストーラとは若干毛色が違うようで、内部で mingw-get を利用する Web インストーラ的なものになっています。</p>
<p>インストーラは mingw-get-inst という名前で、現在「Download Now!」ボタンはこのインストーラにリンクしています。インストール方法は、基本的にはインストーラの exe ファイルを実行し、ひたすら Next ボタンを押し続けるだけです。但し、インストールする構成を指定する画面で、インストールしたいコンポーネントをいくつか選ぶ必要があります。</p>
<p>私の場合ですが、とりあえず C++ 言語は利用したいので、「C++ Compiler」にチェックを入れました。</p>
<div id="attachment_126" class="wp-caption alignnone" style="width: 513px"><img src="http://blog.harapeko.jp/wp-content/uploads/2010/09/mingw-get-inst-fig01.png" alt="mingw-get-inst による MinGW セットアップ(1) - C++ 言語を利用する場合" title="mingw-get-inst による MinGW セットアップ(1) - C++ 言語を利用する場合" width="503" height="385" class="size-full wp-image-126" /><p class="wp-caption-text">mingw-get-inst による MinGW セットアップ(1) - C++ 言語を利用する場合</p></div>
<p>さらに、 MSYS も使いたいので、ツリーコントロールをスクロールし、一番下にある「MSYS Basic System」にもチェックを入れました。</p>
<div id="attachment_127" class="wp-caption alignnone" style="width: 513px"><img src="http://blog.harapeko.jp/wp-content/uploads/2010/09/mingw-get-inst-fig02.png" alt="mingw-get-inst による MinGW セットアップ(2) - MSYS を利用する場合" title="mingw-get-inst による MinGW セットアップ(2) - MSYS を利用する場合" width="503" height="385" class="size-full wp-image-127" /><p class="wp-caption-text">mingw-get-inst による MinGW セットアップ(2) - MSYS を利用する場合</p></div>
<p>インストーラは mingw-get をインストールし、この mingw-get を利用して GCC や MSYS などのコンポーネントをダウンロードし、インストールしてくれるようです。ちなみに、コントロールパネルからアンインストールを行うと、 mingw-get のみが削除されるようで、 mingw-get によってインストールされたそれ以外のプログラムはそのまま残るようです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2010/09/02/mingw-install/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MinGW に GCC 4.4.0 を導入する</title>
		<link>http://blog.harapeko.jp/2010/08/31/mingw-gcc44/</link>
		<comments>http://blog.harapeko.jp/2010/08/31/mingw-gcc44/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 23:17:13 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[技術メモ]]></category>

		<category><![CDATA[C++]]></category>

		<category><![CDATA[C++0x]]></category>

		<category><![CDATA[GCC]]></category>

		<category><![CDATA[MinGW]]></category>

		<category><![CDATA[otoco]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=115</guid>
		<description><![CDATA[otoco のコアデータの仕様がだいぶ形になってきたので、いよいよ実装を開始しました。本当はメインマシンに Linux 環境を整え直してそっちで開発を進めたいのですが、現状お金をもらってメインでやらせて頂いている仕事が Windows 環境での開発なので、並行して作業を行いやすいよう、 Windows 向けのバイナリを生成する環境として検討している MinGW を導入し、とりあえずはこちらで開発を進めてみることにしました。

まだビルドが通る状態ですらないので、とりあえずミニマムケースでテストコードを書きながら、手探り状態で実装を進めているのですが、はて、 int32_t などの型の typedef が定義されている stdint.h の C++ 版である &#60;cstdint&#62; を使う場合、これらの型名は std::int32_t になるのやら、それとも ::int32_t になるのやら、どっちだったかなぁと思い、テストプログラムに

#include &#60;cstdint&#62;

と書いてみたものの、これがさっぱり通らない。おおそうか、そもそも &#60;cstdint&#62; なんて存在しないのか、などと Twitter でつぶやいてみましたところ、ご親切な方から VC10 (Visual Studio 2010 の C/C++ コンパイラのことですね) にはありますよ、とのお返事が。
さらにもう一つ気がかりなことに、 hashmap 的なものってもう標準化されていなかったかなぁと思いつつ調べてみたところ、 C++0x であれば std::unordered_map が使えると言うことが分かったので、早速これも試してみようとテストプログラムに

#include &#60;unordered_map&#62;

と書いてみたところ、やっぱりこれもさっぱり通らない。で、どちらも MinGW のインストールディレクトリ以下にヘッダファイルが存在するのか検索してみると、なるほど確かにファイル自体が存在しない。
そもそも GCC は C++0x に対応しているのか? と調べてみると、軽くぐぐってみた限りでもバージョン 4.4 および 4.5 で [...]]]></description>
			<content:encoded><![CDATA[<p>otoco の<a href="http://developer.harapeko.jp/trac/original/otoco/wiki/%E5%A4%96%E9%83%A8%E4%BB%95%E6%A7%98/%E3%82%B3%E3%82%A2%E3%83%87%E3%83%BC%E3%82%BF">コアデータの仕様</a>がだいぶ形になってきたので、いよいよ<a href="http://developer.harapeko.jp/trac/original/otoco/ticket/6" title="#6 (コアデータクラスを実装する) – otoco">実装を開始しました</a>。本当はメインマシンに Linux 環境を整え直してそっちで開発を進めたいのですが、現状お金をもらってメインでやらせて頂いている仕事が Windows 環境での開発なので、並行して作業を行いやすいよう、 Windows 向けのバイナリを生成する環境として検討している <a href="http://www.mingw.org/">MinGW</a> を導入し、とりあえずはこちらで開発を進めてみることにしました。<br />
<span id="more-115"></span><br />
まだビルドが通る状態ですらないので、とりあえずミニマムケースでテストコードを書きながら、手探り状態で実装を進めているのですが、はて、 <code>int32_t</code> などの型の <code>typedef</code> が定義されている <code>stdint.h</code> の C++ 版である <code>&lt;cstdint&gt;</code> を使う場合、これらの型名は <code>std::int32_t</code> になるのやら、それとも <code>::int32_t</code> になるのやら、どっちだったかなぁと思い、テストプログラムに</p>
<pre>
#include &lt;cstdint&gt;
</pre>
<p>と書いてみたものの、これがさっぱり通らない。おおそうか、そもそも <code>&lt;cstdint&gt;</code> なんて存在しないのか、などと Twitter で<a href="http://twitter.com/T_MURACHI/status/22237400924" title="Twitter / T.MURACHI: うは、 cstdint って存在しないのか。(←超初 ...">つぶやいてみました</a>ところ、ご親切な方から VC10 (<a href="http://www.microsoft.com/japan/visualstudio/" title="Microsoft Visual Studio 2010 - Visual Studio 2010 オフィシャル サイト">Visual Studio 2010</a> の C/C++ コンパイラのことですね) にはありますよ、との<a href="http://twitter.com/cpp_akira/statuses/22237455915" title="Twitter / Faith and Brave: VC10にはありますね。 RT @T_MURACHI ...">お返事</a>が。</p>
<p>さらにもう一つ気がかりなことに、 hashmap 的なものってもう標準化されていなかったかなぁと思いつつ調べてみたところ、 C++0x であれば <code>std::unordered_map</code> が使えると言うことが分かったので、早速これも試してみようとテストプログラムに</p>
<pre>
#include &lt;unordered_map&gt;
</pre>
<p>と書いてみたところ、やっぱりこれもさっぱり通らない。で、どちらも MinGW のインストールディレクトリ以下にヘッダファイルが存在するのか検索してみると、なるほど確かにファイル自体が存在しない。</p>
<p>そもそも GCC は C++0x に対応しているのか? と調べてみると、軽くぐぐってみた限りでもバージョン 4.4 および 4.5 で C++0x への対応を改善したとのニュース記事が見つかるので、おそらくは 4.x 系であれば対応を進めてはいるんだろうなぁと言うことは伺えるわけです。</p>
<p>MinGW は割と最近導入したので、まさか古い GCC が採用されているなどとは疑いもしていなかったのですが、ここで念のためにとバージョンを確かめてみると、なんと<strong>デフォルトでインストールされている GCC のバージョンは 3.4.5</strong> だというじゃないですか。</p>
<p>まさか MinGW 版の GCC が 3.4.5 で開発が止まっているなどとはさすがに思えなかったので、早速 4.x 系にバージョンアップする方法はないかと調べてみたところ、なんのことはない、 MinGW の<a href="http://sourceforge.net/projects/mingw/files/" title="Browse MinGW - Minimalist GNU for Windows Files on SourceForge.net">ダウンロードサイト</a>に普通に用意されていて、それを展開して上書きインストールすれば済む話だったのでした (やり方の詳細は<a href="http://developer.harapeko.jp/trac/original/otoco/wiki/%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2/MinGW%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97" title="技術メモ/MinGWセットアップ – otoco">技術メモ</a>をご参照のこと)。</p>
<p>これでいよいよ <code>&lt;cstdint&gt;</code> も <code>&lt;unordered_map&gt;</code> も使える! ということで、早速以下のようなテストプログラムを書いてみました。</p>
<pre>
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;unordered_map&gt;
#include &lt;cstdint&gt;

int main()
{
	std::unordered_map&lt;std::string, std::string&gt; murachi;
	murachi[&quot;name&quot;] = &quot;Toshiyuki Murayama&quot;;
	murachi[&quot;handle&quot;] = &quot;T.MURACHI&quot;;
	murachi[&quot;age&quot;] = &quot;32&quot;;

	std::cout &lt;&lt; &quot;I'm &quot; &lt;&lt; murachi[&quot;handle&quot;] &lt;&lt; &quot;(&quot; &lt;&lt; murachi[&quot;name&quot;] &lt;&lt; &quot;), &quot; &lt;&lt;
		murachi[&quot;age&quot;] &lt;&lt; &quot; years old.&quot; &lt;&lt; std::endl;

	std::int32_t hoge = 12345;
	std::cout &lt;&lt; &quot;hoge = &quot; &lt;&lt; hoge &lt;&lt; std::endl;

	return 0;
}
</pre>
<p>これを <code>test.cpp</code> という名前で保存し、コンパイルを試みますが…</p>
<pre>
murachi@YUMA ~
$ g++ -o test test.cpp
c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/unordered_map:35 ､ｫ､・include
､ｵ､・ｿ･ﾕ･｡･､･・・ﾂｿｽﾅ include ､ｫ､鬢ﾎﾊﾝｸ釥ｬﾍｭｱﾗ､ﾈ､ﾊ､・ﾇ､ｷ､遉ｦ:
,
                 test.cpp:3 ､ｫ､・ISO C ､ﾇ､ﾏﾌｾﾁｰ､ﾄ､ｭｲﾄﾊﾑｰ惞ﾞ･ｯ･惕ｷ､ﾞ､ｻ､・IS
O C99 ､ﾏｻﾈﾍﾑ､ｵ､・・ﾙ､ｭｻﾄ､熙ﾎ､ﾎｰ惞ﾗｵ皃ｷ､ﾞ､ｹ:
c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/c++0x_warning.h:31:2: error: #
error This file requires compiler and library support for the upcoming ISO C++ s
tandard, C++0x. This support is currently experimental, and must be enabled with
 the -std=c++0x or -std=gnu++0x compiler options.
test.cpp: In function 'int main()':
test.cpp:8: error: 'unordered_map' is not a member of 'std'
test.cpp:8: error: expected primary-expression before ',' token
test.cpp:8: error: expected primary-expression before '&gt;' token
test.cpp:8: error: 'murachi' was not declared in this scope

murachi@YUMA ~
$
</pre>
<p>なんだか文字化けしたエラーが出てきてしまいました。新しいバージョンの GCC はエラーを日本語で出してくれるのか? 何はともあれ、そのすぐ後ろに GCC のオプションに関するヒントが綴られていたので、「そうか C++0x 固有の機能を利用するには <code>-std=c++0x</code> オプションか <code>-std=gnu++0x</code> オプションのどっちかを指定してあげる必要があるんだな」と気づくことができました。</p>
<p>で、なんとなく <code>-std=c++0x</code> オプションの方がまだ標準っぽい感じがしたので、それを試してみたのですが、</p>
<pre>
murachi@YUMA ~
$ g++ -std=c++0x -o test test.cpp
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/pos
types.h:42,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iosfwd:4
2,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ios:39,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ostream:
40,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iostream
:40,
                 from test.cpp:1:
c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:159: error: '::swprintf
' has not been declared
c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:166: error: '::vswprint
f' has not been declared

murachi@YUMA ~
$
</pre>
<p>今度は <code>&lt;iostream&gt;</code> から巡り巡って参照されている <code>&lt;cwchar&gt;</code> の中で、存在しないシンボルが参照されようとしている、と怒られてしまいました。 <code>cwchar</code> ファイルの中も一応覗いてみましたが、これを書き換えてしまうのもよくないので、とりあえず一か八かでもう一つのオプション <code>-std=gnu++0x</code> を試してみることに。すると…</p>
<pre>
murachi@YUMA ~
$ g++ -std=gnu++0x -o test test.cpp

murachi@YUMA ~
$ ./test
I'm T.MURACHI(Toshiyuki Murayama), 32 years old.
hoge = 12345

murachi@YUMA ~
$
</pre>
<p>こんどはちゃんとコンパイルが通り、プログラムも期待したとおりに動作しました。</p>
<p>と、いうわけで、おさらいです。</p>
<ul>
<li>GCC のバージョンはちゃんと確認しよう。
<ul>
<li>特に、C++0x 固有の機能を用いるのであれば、 GCC 4.x 以降が必要になる。</li>
<li>クロスプラットフォーム対応を前提とする場合、対応予定の全ての環境で確認し、開発に用いる GCC のバージョンをプロジェクト内で決めてしまい、それを用いるよう徹底してしまった方がよいかも…。</li>
</ul>
</li>
<li>GCC で <code>&lt;unordered_map&gt;</code> などの C++0x 固有の機能を用いる場合、 <code>g++</code> コマンドにオプション <code>-std=gnu++0x</code> を付加する必要がある。
<ul>
<li>おそらく GCC 固有のオプションなので、 GCC 固有の機能を許可してしまっている可能性もある。 GCC 以外のコンパイラにも対応させたいのであれば、可搬性には特に注意する必要がある、かも知れない。</li>
</ul>
</li>
</ul>
<p>ちなみに、先ほどのサンプルプログラムは <code>&lt;unordered_map&gt;</code> と <code>&lt;cstdint&gt;</code> の両方をテストしていて、特に後者については以下のような記述で利用しているのですが、</p>
<pre>
	std::int32_t hoge = 12345;  // int32_t は std 名前空間に存在する
</pre>
<p>実際のところ、この記述は下記のように書き換えてもコンパイルは通ります。</p>
<pre>
	::int32_t hoge = 12345; // int32_t はグローバル名前空間にも存在する…!?
</pre>
<p>C++0x の仕様についてはまだちゃんと目を通していないので、どちらがより推奨されているのかは分かりません。この辺は後でちゃんと確認しておかねば…。</p>
<p>それから、そもそも C++0x には初期化リストなどの構文糖や型推論、ラムダ、Unicode 用の文字型と Unicode リテラル (UTF-32 リテラルと libiconv の UCS-4-INTERNAL って互換性あるのかなぁ…これも後で調べなきゃ…)、そしてタプルや正規表現 (<code>std::basic_regex</code>!!) などの追加ライブラリ群などなど…さまざまな機能の追加がなされているので、それらについても一通りさらうなり有用な書籍を探す (日本語の文献は…無いかなぁ…) なりしておかないとなぁとか思ったりするわけです (こうやってブログ記事にする為にちょっと <a href="http://ja.wikipedia.org/wiki/C%2B%2B0x" title="C++0x - Wikipedia">Wikipedia に目を通してみた</a>だけでもまぁいろいろと…また実装方針を考え直さないといけない部分も結構出てきてるなぁ… <tt>^_^;</tt>)。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2010/08/31/mingw-gcc44/feed/</wfw:commentRss>
		</item>
		<item>
		<title>libiconv で文字セット自動認識</title>
		<link>http://blog.harapeko.jp/2010/03/03/libiconv-gues/</link>
		<comments>http://blog.harapeko.jp/2010/03/03/libiconv-gues/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 09:02:48 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[技術メモ]]></category>

		<category><![CDATA[活動記録]]></category>

		<category><![CDATA[C++]]></category>

		<category><![CDATA[iconv]]></category>

		<category><![CDATA[otoco]]></category>

		<category><![CDATA[Unicode]]></category>

		<category><![CDATA[文字セット]]></category>

		<category><![CDATA[文字列処理]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=111</guid>
		<description><![CDATA[ご無沙汰ぶりです…。
以前、wchar_t はどうにも使い物にならないからどうしよう、といった記事を書いたのですが、その続きのお話です。
表題の通りで、 libiconv を用いて文字セットを自動認識する処理のサンプルを書いてみました。詳しい経緯はTicket 内で逐次コメントしています。

これがそのサンプルプログラムです。このプログラムは、

標準入力からファイルを読み込み、
ファイルの文字セットを自動認識し、
句点「。」をピリオド「.」に、読点「、」をカンマ「,」に置換し、
UTF-8 に変換して標準出力に書き出す。

ということをやるものです。
で、以前のブログ記事では、

というわけで、内部コードは wchar_t のような型名で定義するのではなく、より具体的に文字セットで定義した方が良さそうだなぁという結論に至りました。候補は以下の 2通りです。

UCS4 を内部コードとし、物理型は符号無し 32bits 整数を適当な型名に typedef して用いる。
UTF-8 を内部コードとし、物理型は char を用いる。


と書いておりましたが、今回はこのうち、前者の UCS4 を内部コードとして用いる方法で実装しています。
とりあえず動いたから commit してみた、という段階なので、コメントが不十分だったり魔法の値が散らばっていたりと未熟なコードです。追々直していこうかと思っています。また、後者の UTF-8 を内部コードとして用いる方法についても併せて書いてみる予定です。
また、現状では boost::regex を用いたコードにはなっていないので (1文字ずつの置換なので UCS4 だと使う必要がないのよ、今のところ)、これを用いた形に修正した場合、どうなるか、といった辺りも試していきたいと思っています。実際にコードに起こしてみると、頭で分かっている以上の利点や問題点が分かってくるんじゃないかなと。
]]></description>
			<content:encoded><![CDATA[<p>ご無沙汰ぶりです…。</p>
<p>以前、<a href="http://blog.harapeko.jp/2009/07/25/wchar_t-suck/" title="はらぺこ日誌» ブログアーカイブ » 頼りなさげな wchar_t">wchar_t はどうにも使い物にならないからどうしよう</a>、といった記事を書いたのですが、その続きのお話です。</p>
<p>表題の通りで、 libiconv を用いて文字セットを自動認識する処理のサンプルを書いてみました。詳しい経緯は<a href="http://developer.harapeko.jp/trac/original/otoco/ticket/4" title="#4 (テキストファイルから読み込んだ文字列を wchar_t 配列と Unicode で扱う方法を調査する。) – otoco">Ticket 内で逐次コメントしています</a>。<br />
<span id="more-111"></span><br />
<a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/guessutf8.cpp" title="/trunk/sample/guessutf8.cpp – otoco">これ</a>がそのサンプルプログラムです。このプログラムは、</p>
<ol>
<li>標準入力からファイルを読み込み、</li>
<li>ファイルの文字セットを自動認識し、</li>
<li>句点「。」をピリオド「.」に、読点「、」をカンマ「,」に置換し、</li>
<li>UTF-8 に変換して標準出力に書き出す。</li>
</ol>
<p>ということをやるものです。</p>
<p>で、<a href="http://blog.harapeko.jp/2009/07/25/wchar_t-suck/" title="はらぺこ日誌» ブログアーカイブ » 頼りなさげな wchar_t">以前のブログ記事</a>では、</p>
<blockquote cite="http://blog.harapeko.jp/2009/07/25/wchar_t-suck/" title="はらぺこ日誌» ブログアーカイブ » 頼りなさげな wchar_t">
<p>というわけで、内部コードは wchar_t のような型名で定義するのではなく、より具体的に文字セットで定義した方が良さそうだなぁという結論に至りました。候補は以下の 2通りです。</p>
<ul>
<li>UCS4 を内部コードとし、物理型は符号無し 32bits 整数を適当な型名に typedef して用いる。</li>
<li>UTF-8 を内部コードとし、物理型は char を用いる。</li>
</ul>
</blockquote>
<p>と書いておりましたが、今回はこのうち、前者の UCS4 を内部コードとして用いる方法で実装しています。</p>
<p>とりあえず動いたから commit してみた、という段階なので、コメントが不十分だったり魔法の値が散らばっていたりと未熟なコードです。追々直していこうかと思っています。また、後者の UTF-8 を内部コードとして用いる方法についても併せて書いてみる予定です。</p>
<p>また、現状では boost::regex を用いたコードにはなっていないので (1文字ずつの置換なので UCS4 だと使う必要がないのよ、今のところ)、これを用いた形に修正した場合、どうなるか、といった辺りも試していきたいと思っています。実際にコードに起こしてみると、頭で分かっている以上の利点や問題点が分かってくるんじゃないかなと。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2010/03/03/libiconv-gues/feed/</wfw:commentRss>
		</item>
		<item>
		<title>第2期決算報告書を up しました。</title>
		<link>http://blog.harapeko.jp/2009/11/16/statement-of-accounts-2/</link>
		<comments>http://blog.harapeko.jp/2009/11/16/statement-of-accounts-2/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 03:49:58 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[活動記録]]></category>

		<category><![CDATA[決算]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=108</guid>
		<description><![CDATA[第2期決算報告
とりあえず黒字です。わーい。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.harapeko.jp/account/Statement_of_Accounts-2008_9-2009_8.pdf">第2期決算報告</a></p>
<p>とりあえず黒字です。わーい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2009/11/16/statement-of-accounts-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>久しぶりに…</title>
		<link>http://blog.harapeko.jp/2009/09/09/recovery/</link>
		<comments>http://blog.harapeko.jp/2009/09/09/recovery/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 22:25:56 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[活動記録]]></category>

		<category><![CDATA[Boost]]></category>

		<category><![CDATA[otoco]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=105</guid>
		<description><![CDATA[Boost セットアップ中… orz
実は先日 HDD に物理的損傷らしきものを見つけてしまいまして、必要なデータだけ抜き取ってフォーマットを試みたら見事にエラーで止まりやがったのでやむなく新しいのに交換したのですよ。
ここ最近は忙しかったり体調も安定しなかったりだったので otoco の方の作業はずっと停滞してました…。やっと朝まともに起きれるぐらいに体調は戻ってきたので、そろそろ otoco の作業も復活したいなぁと思いつつ…。
ああそうだ、Linux も使えるように grub 入れ直さないと…。
]]></description>
			<content:encoded><![CDATA[<p><strong>Boost セットアップ中… orz</strong></p>
<p>実は先日 HDD に物理的損傷らしきものを見つけてしまいまして、必要なデータだけ抜き取ってフォーマットを試みたら見事にエラーで止まりやがったのでやむなく新しいのに交換したのですよ。</p>
<p>ここ最近は忙しかったり体調も安定しなかったりだったので otoco の方の作業はずっと停滞してました…。やっと朝まともに起きれるぐらいに体調は戻ってきたので、そろそろ otoco の作業も復活したいなぁと思いつつ…。</p>
<p>ああそうだ、Linux も使えるように grub 入れ直さないと…。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2009/09/09/recovery/feed/</wfw:commentRss>
		</item>
		<item>
		<title>世の中には本当にいろいろな MML がある。</title>
		<link>http://blog.harapeko.jp/2009/08/13/pmml/</link>
		<comments>http://blog.harapeko.jp/2009/08/13/pmml/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 14:54:08 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[技術メモ]]></category>

		<category><![CDATA[MML]]></category>

		<category><![CDATA[otoco]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=101</guid>
		<description><![CDATA[今メインでやっているお仕事を紹介してくださった友人に、CiNii という論文検索サイトを教えて頂きました。むしろ今まで知らなかったのかよぐらいの勢いなのですが…(^_^;A それはさておき。
個人的に気になっているのは、今 otoco でやろうとしている、楽譜情報と演奏情報 (シーケンス情報) を融合するデータ表現に関する研究が、MML なりそれ以外なりのアプローチで行われているのか、ということです。別に、既に行われているなら otoco を作るのはやめようとかそういう話ではないのですが、先行研究があれば参考にはさせて頂きたいな、とは思うわけです。
今のところそれらしい研究成果はまだ見つけられていないのですが、music macro language で検索してみたところ、面白いものを見つけました。かなり画期的な概念に基づく MML、その名も「PMML」です。

何より面白いのがスレッドという概念です。音楽においては、通常「パート」と表現される概念ですが、PMML では並列される演奏は並列される処理として表現するわけです。
例えば「名前付きスレッド」はまさにパートを表現するもので、スレッド名を定義し、そのスレッド名ごとに処理ならぬ演奏内容を分けて記述します。以下のように:

// ちなみに曲は、昔おいらが作った "Happy Mouse" でやんす
defthread(melody, string, bass)

melody {
    o=5 s frfa^crar b-rargrfr ercrdrer frar i. f s r   // フラットって "-" でいいのかしら?
}
string {
    o=4 h a b- q ^cb- h a
}
bass {
  [...]]]></description>
			<content:encoded><![CDATA[<p>今メインでやっているお仕事を紹介してくださった友人に、<a href="http://ci.nii.ac.jp/">CiNii</a> という論文検索サイトを教えて頂きました。むしろ今まで知らなかったのかよぐらいの勢いなのですが…(^_^;A それはさておき。</p>
<p>個人的に気になっているのは、今 otoco でやろうとしている、楽譜情報と演奏情報 (シーケンス情報) を融合するデータ表現に関する研究が、MML なりそれ以外なりのアプローチで行われているのか、ということです。別に、既に行われているなら otoco を作るのはやめようとかそういう話ではないのですが、先行研究があれば参考にはさせて頂きたいな、とは思うわけです。</p>
<p>今のところそれらしい研究成果はまだ見つけられていないのですが、<a href="http://ci.nii.ac.jp/search?q=music+macro+language&#038;range=0&#038;count=20&#038;sortorder=1" title="CiNii 検索 -  music macro language">music macro language で検索</a>してみたところ、面白いものを見つけました。かなり画期的な概念に基づく MML、その名も「<a href="http://ci.nii.ac.jp/naid/110002935432" title="CiNii -  音楽記述言語PMMLの概要">PMML</a>」です。<br />
<span id="more-101"></span><br />
何より面白いのがスレッドという概念です。音楽においては、通常「パート」と表現される概念ですが、PMML では並列される演奏は並列される処理として表現するわけです。</p>
<p>例えば「名前付きスレッド」はまさにパートを表現するもので、スレッド名を定義し、そのスレッド名ごとに処理ならぬ演奏内容を分けて記述します。以下のように:</p>
<pre>
// ちなみに曲は、昔おいらが作った "Happy Mouse" でやんす
defthread(melody, string, bass)

melody {
    o=5 s frfa^crar b-rargrfr ercrdrer frar i. f s r   // フラットって "-" でいいのかしら?
}
string {
    o=4 h a b- q ^cb- h a
}
bass {
    o=3 q ff b-b- ^cc ff
}
</pre>
<p>そして名前をつけずに単にブレース <code>{</code> ～ <code>}</code> で括るとそれは無名スレッドになるのですが、無名スレッドはスコープとして利用できます。例えば上記の例で、メロディーパートは最後の音だけちょっと長い音を使っていますが、そのために音符の長さ指定が行ったり来たりしてますよね。</p>
<pre>
    // i. で付点 8分音符に変更、そして最後の休符は sで 16分音符に戻している
    o=5 s frfa^crar b-rargrfr ercrdrer frar i. f s r
</pre>
<p>ここの部分で無名スレッドによるスコープを用いると、以下のように書けるわけです。</p>
<pre>
    // 最後の音だけを付点 8分音符にする
    o=5 s frfa^crar b-rargrfr ercrdrer frar { i. f } r
</pre>
<p>スコープは、和音を表現するブラケット <code>[</code> ～ <code>]</code> の中で用いると、長い音と短い動く音が混じった和音を表現することも可能です。</p>
<pre>
// 動物の謝肉祭より「像」の最後の部分
defthread(tuba, p_right, p_left)

tuba {
    o=3 s { i _b- } d-rd-r { i d- } e-d-cd- cr_a-_b-cd e-fga-b-^c
    { q ^d i ^e- q _b- i c } fefrb-r e-r { q r }
}

p_right {
    o=4 s { i _b- } d-rd-r { i [ gb-^e- ] } [ b-^e-^g ] r [ b-^e-^g ] r
    [ a-^e-^a- ] r { i rr q. r }
    o=5 i r { q [ _b- { i fe- } { i a-g } ] } r [ dfa-^d ] [ e-g^e- ]
    s [ a-^c^a- ][ g^c^g ][ a-^c^a- ] r [ dfa-^d ] r [ e-g^e- ] r i rr
}

p_left {
    o=3 s { o=2 i [ _b-b- ] } [ _d-d- ] r [ _d-d- ] r { i [ gb-^e- ] } [ b-^e-g ] r [ b-^e-g ] r
    [ a-^e- ] r { i rr q. r }
    o=4 i r { q [ _b- { i fe- } { i a-g } ] } r [ dfa- ] [ e-g ]
    s [ _a-ca- ][ _gcg ][ _a-ca- ] r o=3 [ _b-b- ] r [ _e-e- ] r i rr
}
</pre>
<p>ちなみに otoco ではどう書くのかって? それは、あの、今後の宿題とさせてください (^_^;A 。</p>
<p>他にも、スプライン曲線的なコントロール値の変化を実現するコマンドがあったり、C言語ライクな演算子が使えたり、マクロの引数として渡す値の配列を定義できたりと、非常にプログラマブルな仕様になっています。</p>
<p>こういう仕様の MML はおいらもある程度は夢想したりもしたのですが、ただプログラマーにとって理想的な言語世界というのが、果たして一般的な DTM ユーザーにとっても理想的なものとなりうるのか、という点において足踏みせざるを得ません。「可読性」という言葉一つをとっても、プログラマーにとってのそれ (処理内容の理解) と、DTM ユーザーにとってのそれ (楽譜としての理解) とでは、全く意味合いが違ってくる可能性があるからです。</p>
<p>ただ、音楽制作に対する新たなアプローチを提供するアイデアとしては、非常に興味深いものがありますし、機能の一つ一つは非常に参考になるものがあります。いくつかのアイデアは otoco においても拝借させて頂くことがあるかも知れません。</p>
<p>しかし 1997年時点でこんなものが存在していたとは…。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2009/08/13/pmml/feed/</wfw:commentRss>
		</item>
		<item>
		<title>頼りなさげな wchar_t</title>
		<link>http://blog.harapeko.jp/2009/07/25/wchar_t-suck/</link>
		<comments>http://blog.harapeko.jp/2009/07/25/wchar_t-suck/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 09:42:17 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[技術メモ]]></category>

		<category><![CDATA[活動記録]]></category>

		<category><![CDATA[C++]]></category>

		<category><![CDATA[iconv]]></category>

		<category><![CDATA[otoco]]></category>

		<category><![CDATA[Unicode]]></category>

		<category><![CDATA[wchar_t]]></category>

		<category><![CDATA[文字セット]]></category>

		<category><![CDATA[文字列処理]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=96</guid>
		<description><![CDATA[otoco に限らず、 PC 上で動作するプログラムの多くは、テキストを処理することを目的の一部またはすべてとしています。 otoco の場合は特に、どこの誰とも分からない人が MML を書き、それを読み込んで XML やら SMF やらオーディオやら楽譜やらに変換することを目的としているので、どこの誰が MML を (あるいは XML を直接) 書いても問題なく処理できるよう、文字セットの扱いには丁重でなければなりません。
当初の方針として、 otoco では内部コードに Unicode を使用し、その物理型は wchar_t で扱うつもりでいました。この辺、C/C++ でのクロスプラットフォーム開発に慣れていないと陥りやすい罠であるように思うのですが… 現状の wchar_t ははっきり言ってクロスプラットフォーム開発には向いていないものといわざるを得ないようです。
とりあえず確認しているのは Windows の VC++ 2008 と Linux の gcc だけなのですが、それだけでも調べた限りで以下のような相違点がありました。



開発環境
文字セット
物理型


Windows + MS-VC++ 2008
UTF-16LE
符号無し 16bits 整数 (unsigned short)


Linux + gcc
UCS4
符号無し 32bits 整数 (uint32_t)


まず文字セットですが、 UTF-16LE とはリトルエンディアンの UTF-16 エンコードのことで、 Unicode を表現するためのファイル形式です。ファイル形式であるということは、すなわちファイルに保存する方法を定めた形式であるということです。それに対して、 [...]]]></description>
			<content:encoded><![CDATA[<p>otoco に限らず、 PC 上で動作するプログラムの多くは、テキストを処理することを目的の一部またはすべてとしています。 otoco の場合は特に、どこの誰とも分からない人が MML を書き、それを読み込んで XML やら SMF やらオーディオやら楽譜やらに変換することを目的としているので、どこの誰が MML を (あるいは XML を直接) 書いても問題なく処理できるよう、文字セットの扱いには丁重でなければなりません。</p>
<p>当初の方針として、 otoco では内部コードに Unicode を使用し、その物理型は wchar_t で扱うつもりでいました。この辺、C/C++ でのクロスプラットフォーム開発に慣れていないと陥りやすい罠であるように思うのですが… 現状の wchar_t ははっきり言ってクロスプラットフォーム開発には向いていないものといわざるを得ないようです。</p>
<p>とりあえず確認しているのは Windows の VC++ 2008 と Linux の gcc だけなのですが、それだけでも調べた限りで以下のような相違点がありました。</p>
<p><span id="more-96"></span></p>
<table rules="all">
<tr>
<th>開発環境</th>
<th>文字セット</th>
<th>物理型</th>
</tr>
<tr>
<td>Windows + MS-VC++ 2008</td>
<td>UTF-16LE</td>
<td>符号無し 16bits 整数 (unsigned short)</td>
</tr>
<tr>
<td>Linux + gcc</td>
<td>UCS4</td>
<td>符号無し 32bits 整数 (uint32_t)</td>
</tr>
</table>
<p>まず文字セットですが、 UTF-16LE とはリトルエンディアンの UTF-16 エンコードのことで、 Unicode を表現するための<strong>ファイル形式</strong>です。ファイル形式であるということは、すなわちファイルに保存する方法を定めた形式であるということです。それに対して、 UCS4 はあくまで Unicode そのものであり、内部データ形式として扱えるものです。</p>
<p>具体的に何が違うのかというと、 UTF-16 の場合は配列内の数値 1つが必ず 1文字を表現するものであることを保証しません。実際、UTF-16 ではサロゲートペアを気にする必要があり、この処理を誤ると文字境界に破綻を来して文字化けの原因を作ってしまうことになります。これに対し、 UCS4 の場合は単に 31bits 以下の文字セットであり、それより拡張されないことが保証されています (万一拡張された場合は新たに UCS8 が規定されて包括されるのでしょうが、現実的にはあり得ないでしょう)。</p>
<p>私は元より Windows 畑の人なので、 wchar_t を使う場合でもサロゲートペアをどうにかすることを前提に考えていましたから、 GNU/Linux でのあり方はむしろ理想的とも思うのですが、反面内部的な処理に過ぎない部分でプラットフォーム依存を気にしながら実装しなければならないというのはあまり好ましいことではなく、そう考えると wchar_t という型は意味論的には破綻しているといわざるを得ないように思います。さらに BSD 系の UNIX 環境では wchar_t が扱う文字セットは環境のロケールに依存するなどという情報もあり… とてもじゃないですがそんなの考慮しきれるわけがありません ((((/;^^)/ 。</p>
<p>というわけで、内部コードは wchar_t のような型名で定義するのではなく、より具体的に文字セットで定義した方が良さそうだなぁという結論に至りました。候補は以下の 2通りです。</p>
<ul>
<li>UCS4 を内部コードとし、物理型は符号無し 32bits 整数を適当な型名に typedef して用いる。</li>
<li>UTF-8 を内部コードとし、物理型は char を用いる。</li>
</ul>
<p>前者のメリットは何と言っても多言語処理の確実性が高く、文字境界も気にする必要がないことです。例えば、配列の中の n個目の値は、確実に文字列の中の n個目の文字であることが保証されます。反面、 STL や Boost を用いた文字列処理においては、あらかじめ typedef された便利な型名を用いることができず、プログラム側で内部コード用に typedef したものをたくさん用意しておく必要が生じるでしょう。また、何より文字列リテラルが使えなくなるので、正規表現のハードコーディングには工夫を強いられることになります。</p>
<p>後者のメリットは STL の string や Boost.Regex に定義されている typedef がそのまま利用できること、そして何よりハードコーディングした文字列リテラルがそのまま利用できることです。正規表現の記述もこちらの方がよっぽどすっきりするでしょう。また、 XML の入出力を UTF-8 に限定して良いのであれば、その辺の実装も楽になるかも知れません。文字境界については注意する必要がありますが、例えば n文字目の検出は他のエンコーディングに比べれば容易であるのも UTF-8 の特徴でもあります (もちろん、UCS4 を用いる場合に比べれば、実装は複雑になりますが…)。</p>
<p>ちなみに、文字セットの変換にはやっぱり iconv を使うことになりそうです。 Windows 側はまだ試していないのですが… とりあえず近日中に iconv を用いた簡単なプロトタイプを書いて、上記の件も含めて検討してみる予定です…。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2009/07/25/wchar_t-suck/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ubuntu への Boost セットアップとバージョン間差異の問題</title>
		<link>http://blog.harapeko.jp/2009/07/23/boost-setup-for-ubuntu-and-differ-by-version/</link>
		<comments>http://blog.harapeko.jp/2009/07/23/boost-setup-for-ubuntu-and-differ-by-version/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 23:18:38 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[技術メモ]]></category>

		<category><![CDATA[活動記録]]></category>

		<category><![CDATA[Boost]]></category>

		<category><![CDATA[C++]]></category>

		<category><![CDATA[otoco]]></category>

		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=93</guid>
		<description><![CDATA[Boost ライブラリの Ubuntu へのインストールは容易でした。単に libboost-dev パッケージを aptitude install してあげるだけです。
問題は、前回も書いた通り、 apt からインストールできる Boost のバージョンは通常で 1.34.1、最新のものを選んでも 1.37.0 になってしまう、ということです。
そこで、 otoco の開発に影響する範囲で、バージョン間にどの程度の差異があるのか、調べておくことにしました。

Boost ライブラリ - バージョン間の差意について

とりあえず今思いつくのは正規表現まわりだけだったのでまだそこしか調べていないのですが (空文字列マッチは何気に影響範囲大きそうですが…古いバージョンで統一しておけばとりあえず問題にはならないかな…)、実際に開発が進めば利用範囲が広がり、都度気づく部分も増えていくかもしれません。上記ページはその都度更新して行く予定です。
]]></description>
			<content:encoded><![CDATA[<p>Boost ライブラリの Ubuntu へのインストールは容易でした。単に libboost-dev パッケージを <code>aptitude install</code> してあげるだけです。</p>
<p>問題は、<a href="http://blog.harapeko.jp/2009/07/16/boost-setup-investigation/">前回も書いた通り</a>、 apt からインストールできる Boost のバージョンは通常で 1.34.1、最新のものを選んでも 1.37.0 になってしまう、ということです。</p>
<p>そこで、 otoco の開発に影響する範囲で、バージョン間にどの程度の差異があるのか、調べておくことにしました。</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/wiki/%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2/Boost%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3">Boost ライブラリ - バージョン間の差意について</a></li>
</ul>
<p>とりあえず今思いつくのは正規表現まわりだけだったのでまだそこしか調べていないのですが (空文字列マッチは何気に影響範囲大きそうですが…古いバージョンで統一しておけばとりあえず問題にはならないかな…)、実際に開発が進めば利用範囲が広がり、都度気づく部分も増えていくかもしれません。上記ページはその都度更新して行く予定です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2009/07/23/boost-setup-for-ubuntu-and-differ-by-version/feed/</wfw:commentRss>
		</item>
		<item>
		<title>なおも boost セットアップ調査中…。</title>
		<link>http://blog.harapeko.jp/2009/07/16/boost-setup-investigation/</link>
		<comments>http://blog.harapeko.jp/2009/07/16/boost-setup-investigation/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 23:56:40 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[技術メモ]]></category>

		<category><![CDATA[活動記録]]></category>

		<category><![CDATA[Boost]]></category>

		<category><![CDATA[C++]]></category>

		<category><![CDATA[otoco]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=91</guid>
		<description><![CDATA[昨日、一昨日はメインの仕事の都合で朝が早かったので、こっちの作業はちょっと pending してました。

技術メモ/Boostセットアップ – otoco

cl.exe コマンドを直接呼んでビルドする方法については調査完了しました。必須オプションが何気に多いですね…。実際にはあれに最適化オプションなりデバッグオプションなりがくっつくことになります。
で、今度は Ubuntu でのセットアップを調べているのですが、ここで問題発覚。どうやら Ubuntu での boost ライブラリのメインバージョンはまだ 1.34.1 で止まっているようです…。もしかしたら Debian を始め、多くの Linux ディストリビューションにおいても同様の状況なのかもしれません。当初は最新の 1.39.0 を利用する予定でしたが、事実上の汎用性が損なわれる可能性もあるので (さすがにライブラリを手動でインストールしてくれ、とやる訳にもいかないですからね…)、互換性を確認しつつ、バージョンについては考慮しなければならないかもしれません。
インストールして動かして、というあたりはまだこれから調査するところです…。
]]></description>
			<content:encoded><![CDATA[<p>昨日、一昨日はメインの仕事の都合で朝が早かったので、こっちの作業はちょっと pending してました。</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/wiki/%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2/Boost%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97">技術メモ/Boostセットアップ – otoco</a></li>
</ul>
<p><code>cl.exe</code> コマンドを直接呼んでビルドする方法については調査完了しました。必須オプションが何気に多いですね…。実際にはあれに最適化オプションなりデバッグオプションなりがくっつくことになります。</p>
<p>で、今度は Ubuntu でのセットアップを調べているのですが、ここで問題発覚。どうやら Ubuntu での boost ライブラリのメインバージョンはまだ 1.34.1 で止まっているようです…。もしかしたら Debian を始め、多くの Linux ディストリビューションにおいても同様の状況なのかもしれません。当初は最新の 1.39.0 を利用する予定でしたが、事実上の汎用性が損なわれる可能性もあるので (さすがにライブラリを手動でインストールしてくれ、とやる訳にもいかないですからね…)、互換性を確認しつつ、バージョンについては考慮しなければならないかもしれません。</p>
<p>インストールして動かして、というあたりはまだこれから調査するところです…。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2009/07/16/boost-setup-investigation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Windows で Boost セットアップ</title>
		<link>http://blog.harapeko.jp/2009/07/13/boost-setup-for-windows/</link>
		<comments>http://blog.harapeko.jp/2009/07/13/boost-setup-for-windows/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 01:24:02 +0000</pubDate>
		<dc:creator>村山 俊之</dc:creator>
		
		<category><![CDATA[技術メモ]]></category>

		<category><![CDATA[活動記録]]></category>

		<category><![CDATA[Boost]]></category>

		<category><![CDATA[C++]]></category>

		<category><![CDATA[otoco]]></category>

		<category><![CDATA[Perl]]></category>

		<category><![CDATA[正規表現]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=85</guid>
		<description><![CDATA[Windows 環境で Boost ライブラリをセットアップしてみました。明日は Linux 環境でもセットアップを行い、技術メモとしてまとめる予定です。
で、せっかくなので、試しに簡単なサンプルを作って動作確認をしてみました。

#include &#60;iostream&#62;
#include &#60;fstream&#62;
#include &#60;string&#62;

#include &#60;boost/regex.hpp&#62;

using namespace std;
using namespace boost;

void escapeHtml(const string &#38;src, string &#38;modified);

int main(int argc, char* argv[])
{
	for (int i = 1; i &#60; argc; i++)
	{
		ifstream fin(argv[i]);
		if (fin.bad() &#124;&#124; fin.fail())
		{
			cerr &#60;&#60; argv[0] &#60;&#60; &#34;: Can't open &#34; &#60;&#60; argv[i] &#60;&#60; &#34;.&#34; &#60;&#60; endl;
			continue;
		}
		while (!fin.eof())
		{
			string line;
			getline(fin, line);
			string modified;
			escapeHtml(line, modified);
			cout &#60;&#60; modified [...]]]></description>
			<content:encoded><![CDATA[<p>Windows 環境で Boost ライブラリをセットアップしてみました。明日は Linux 環境でもセットアップを行い、<a href="http://developer.harapeko.jp/trac/original/otoco/wiki/%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2/Boost%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97">技術メモ</a>としてまとめる<a href="http://developer.harapeko.jp/trac/original/otoco/ticket/3">予定</a>です。</p>
<p>で、せっかくなので、試しに簡単なサンプルを作って動作確認をしてみました。</p>
<pre>
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

#include &lt;boost/regex.hpp&gt;

using namespace std;
using namespace boost;

void escapeHtml(const string &amp;src, string &amp;modified);

int main(int argc, char* argv[])
{
	for (int i = 1; i &lt; argc; i++)
	{
		ifstream fin(argv[i]);
		if (fin.bad() || fin.fail())
		{
			cerr &lt;&lt; argv[0] &lt;&lt; &quot;: Can't open &quot; &lt;&lt; argv[i] &lt;&lt; &quot;.&quot; &lt;&lt; endl;
			continue;
		}
		while (!fin.eof())
		{
			string line;
			getline(fin, line);
			string modified;
			escapeHtml(line, modified);
			cout &lt;&lt; modified &lt;&lt; endl;
		}
	}

	return 0;
}

void escapeHtml(const string &amp;src, string &amp;modified)
{
	modified.clear();
	sregex_iterator last_it;
	for (sregex_iterator it(src.begin(), src.end(), regex(&quot;[&lt;&gt;&amp;\&quot;]&quot;)); it != sregex_iterator(); it++)
	{
		modified += it-&gt;prefix().str();
		string sub = (*it)[0].str();
		switch (sub[0])
		{
			case '&lt;':	modified += &quot;&amp;lt;&quot;;		break;
			case '&gt;':	modified += &quot;&amp;gt;&quot;;		break;
			case '&amp;':	modified += &quot;&amp;amp;&quot;;	break;
			case '&quot;':	modified += &quot;&amp;quot;&quot;;	break;
			default:	assert(0);	break;
		}
		last_it = it;
	}
	modified += last_it == sregex_iterator() ? src : last_it-&gt;suffix().str();
}
</pre>
<p><a href="http://boost.cppll.jp/HEAD/libs/regex/doc/regex_iterator.html">Boost.Regex の regex_iterator</a> を用いたテストです。よーするに、コマンドに指定したファイルの HTML エスケープ処理を施してコンソールに書き出すプログラムです。</p>
<p>上記のプログラムを test.cpp などのファイル名で保存し、そのまま Visual Studio 2008 コマンドプロンプト上で</p>
<pre>
cl test.cpp
</pre>
<p>とやってみましたが、これだけではコンパイルできませんでした。どうやら、 Visual Studio のオプションダイアログでヘッダーファイルやライブラリの参照先ディレクトリを設定しても、その設定が参照されるのは Visual Studio の IDE からビルドを実行した場合のみのようです。あるいは、環境変数 INCLUDE や LIB を設定してあげればこれでコンパイルできるのかも知れません。その辺はまた追々調べてみますが、最終的には <code>.configure</code> に <code>--boost-prefix</code> といったようなオプションを設ける、といった形の対応になるのではないかとも思います。</p>
<p>ちなみに、これと同等の (しかもより確実に動作する) プログラムを Perl で記述すると、以下の通りになります (この書き方はしかし Unix 風環境限定ですが)。</p>
<pre>
#!/usr/bin/perl -p
s/[&lt;&gt;&amp;&quot;]/'&amp;'.{qw(&lt; lt &gt; gt &amp; amp &quot; quot)}->{$&amp;}.';'/eg;
</pre>
<p>うあー、やっぱりスクリプト言語は便利だなー (汗。</p>
<hr />
<div>2009年  7月 28日 火曜日 16:56:07 JST - <strong>追記</strong></div>
<p>egtra 様、ご指摘感謝です。仰る通り、 <code>string::getline()</code> を使った方がスマートなので、その通りに修正させて頂きました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.harapeko.jp/2009/07/13/boost-setup-for-windows/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
