<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>はらぺこ日誌 &#187; otoco</title>
	<atom:link href="https://blog.harapeko.jp/tag/otoco/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.harapeko.jp</link>
	<description>株式会社はらぺこ 公式ブログ</description>
	<lastBuildDate>Mon, 30 Oct 2017 14:32:56 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.2</generator>
	<item>
		<title>UTF-8 もイマイチだが…</title>
		<link>https://blog.harapeko.jp/2010/09/22/utf-8-is-nice/</link>
		<comments>https://blog.harapeko.jp/2010/09/22/utf-8-is-nice/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 14:55:16 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[otoco]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[文字列処理]]></category>
		<category><![CDATA[正規表現]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=138</guid>
		<description><![CDATA[UTF-32 が内部文字列に使えないことがわかったので、 UTF-8 を内部文字列に使用するというルールで l [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/" title="はらぺこ日誌» ブログアーカイブ » char32_t だと regex が使えない">UTF-32 が内部文字列に使えないことがわかった</a>ので、 UTF-8 を内部文字列に使用するというルールで libiconv によるエンコーディング操作と Boost.Regex による正規表現の両方を同時に試すサンプルを作成してみました。</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.hpp">sample/EncodeString.hpp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.cpp">sample/EncodeString.cpp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/regex-test.cpp">sample/regex-test.cpp</a></li>
</ul>
<p>Makefile は作ってません＼(^O^)／。試してみたい人は頑張ってコンパイルしてねｗ</p>
<pre>
$ g++ -std=c++0x -o regex-test regex-test.cpp EncodeString.cpp -lboost_regex
</pre>
<p>まともな環境 (Linux + GCC4.5 とか) なら上記コマンドで通るはず。libiconv を (glibc に上書きする形で) インストールしている場合は <code>-liconv</code> を末尾に入れる必要があるかも。そして MinGW を使う場合は更にもう一工夫必要かも <tt>(((;/^^)/</tt><br />
<span id="more-138"></span><br />
さてこのプログラム、注目して頂きたいのは、<code>regex-test.cpp</code> の以下の行です。</p>
<pre>
        regex reg(u8"くま|川|(お)?魚");
</pre>
<p>正規表現を定義しているのですが、一文字でしかないはずの <code>"お"</code> がわざわざ丸括弧でくくってありますね。これが Perl で <code>use utf8;</code> していたり、 UTF-8 で JavaScript を書いていたりしているのであれば、不要な括弧です。</p>
<p>しかし、 Boost.Regex を UTF-8 で使用する場合には必要です。この括弧がなければ、 <code>"?"</code> は <code>"お"</code> の最終オクテットにしか適用されません。なぜなら、 Boost.Regex は UTF-8 なんて知らないので、 <code>"お"</code> が論理的には 1文字でしかない、なんてことは認識できないからです。</p>
<p>すなわち、</p>
<pre>
        regex reg(u8"くま|川|お?魚");
</pre>
<p>と書いてしまうと、<code>"お魚"</code> には hit しますが、 <code>"魚"</code> には hit しなくなってしまうのです。</p>
<p>otoco では、 MML コンパイラ機能において、プログラマブルマクロを定義できる機能を提供する予定です。具体的には Lua でマクロを定義し、そのマクロを用いて生成した MML をインライン展開できるようにする、といったものです (実際の所、言語に Lua を採用すべきか JavaScript を採用すべきか、はたまた Python を採用すべきかで迷っているところではあるのですが…)。</p>
<p>で、 (Lua を採用する場合には) 正規表現を用いた文字列加工を行う関数を提供するつもりでいるのですが (JavaScript とかだったら不要なんですけどね、言語機能にあるし)、仮に非 ASCII な文字 (列) を hit させようとする正規表現に <code>"?"</code> やら <code>"[</code>…<code>]"</code> やらが使われた場合、どう扱うべきなんだろう、といった辺りが悩みどころではあったりします…。</p>
<p>まぁなんにせよ、他に選択の余地もないので、とりあえず内部文字列は UTF-8 で実装するという方針でやっていくことにしようかと思います。前途多難じゃ… orz</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2010/09/22/utf-8-is-nice/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>char32_t だと regex が使えない</title>
		<link>https://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/</link>
		<comments>https://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 02:21:44 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[iconv]]></category>
		<category><![CDATA[otoco]]></category>
		<category><![CDATA[Unicode]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=133</guid>
		<description><![CDATA[C++0x では UCS に対応し、専用の型やリテラルの記法が導入されました。その関係で、以下の点について調査 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C++0x では UCS に対応し、<a href="http://ja.wikipedia.org/wiki/C%2B%2B0x#.E6.96.B0.E3.81.9F.E3.81.AA.E6.96.87.E5.AD.97.E5.88.97.E3.83.AA.E3.83.86.E3.83.A9.E3.83.AB" title="新たな文字列リテラル - C++0x - Wikipedia">専用の型やリテラルの記法が導入されました</a>。その関係で、以下の点について調査を行っていました。</p>
<ol>
<li>C++0x で UCS を UTF-32 として扱う型 <code>char32_t</code>, <code>u32string</code> およびリテラル <code>U"..."</code> と、 libiconv の UCS-4-INTERNAL との間に互換性はあるか。</li>
<li>C++0x で新たに追加された正規表現ライブラリ <code>&lt;regex&gt;</code> は利用可能か。</li>
<li><code>&lt;regex&gt;</code> が利用できない場合、 Boost.Regex を用いて UTF-32 文字列を処理することは可能か。</li>
</ol>
<p>これらの調査は、すべて otoco のコアデータを扱うプログラム内で内部文字列に UTF-32 を採用することを前提としたものでした。<br />
<span id="more-133"></span><br />
結論から言うと、<strong>内部文字列に UTF-32 を採用することは、現時点では諦めざるを得ない、ということになりました。＼(^O^)／</strong> 以下、その解説です。</p>
<p>1 については、互換性に問題がないことを確認しました。</p>
<p>2 についてですが、 GCC 4.5 の標準 C++ ライブラリでは、 <code>&lt;regex&gt;</code> のヘッダファイルは存在するものの、ライブラリの実体がまだ用意されていない、という状態のようでした。</p>
<p>で、 3 についてなのですが… 簡単のため、以下のサンプルを見てみることにします。</p>
<pre>
#include &lt;string&gt;
#include &lt;boost/regex.hpp&gt;

using namespace std;

typedef boost::basic_regex&lt;char32_t, boost::regex_traits&lt;char32_t&gt; &gt; u32regex;
typedef boost::match_results&lt;u32string::const_iterator&gt; u32smatch;

int main()
{
	u32string text(U&quot;C++0x のせかいへようこそ!!&quot;);
	u32string modified;
	u32regex reg(U&quot;せかい&quot;);
	u32smatch match;
	while (boost::regex_search(text, match, reg)) {
		modified += match.prefix().str() + U&quot;世界&quot;;
		text = match.suffix().str();
	}
	modified += text;
	return 0;
}
</pre>
<p>このサンプルは、期待通りに動作しても、何もしません。UTF-32 の文字列 <code>U"C++0x のせかいへようこそ!!"</code> の <code>U"せかい"</code> を <code>U"世界"</code> に置換する、という処理を内部で行うだけです。 <code>u32string</code> に対応した <code>iostream</code> があったとして、 UTF-32 をそのままコンソールやファイルに出しても不親切なだけなので、出力までやるなら libiconv と組み合わせるべきですが、プログラムが複雑になるので、ここではそこまで示していません (実際にはそこまで試そうとしていたのですが…)。</p>
<p>で、このプログラム、実際はどうなるのかというと、 GCC 4.5 でコンパイルは通るものの、実行すると、 <strong><code>u32regex</code> オブジェクト</strong> (これは <code>boost::basic_regex&lt;char32_t, boost::regex_traits&lt;char32_t&gt; &gt;</code> のシノニムですね) <strong>のコンストラクタが <code>std::bad_cast</code> 例外を送出します</strong>。どうやら、 Boost.Regex は <code>char32_t</code>、すなわち 32bits 以上の整数型を文字コードに使用するということ、を想定した作りにはなっていなかったようなのです。よーするに <code>char</code> と <code>wchar_t</code> しか想定していなかったんですね (ん? でも <a href="http://blog.harapeko.jp/2009/07/25/wchar_t-suck/" title="はらぺこ日誌» ブログアーカイブ » 頼りなさげな wchar_t">GCC の <code>wchar_t</code> は <code>uint32_t</code></a> だったような…)。</p>
<p>GCC の標準 C++ ライブラリが <code>&lt;regex&gt;</code> のライブラリを実装するのを悠長に待っても居られないので、方針を転換し、内部文字列は UTF-8 で実装せざるを得なさそうです。一応、UTF-8 は文字の先頭オクテットか否かを判断するのが容易なので (0&#215;80≦n≦0xBF 以外なら先頭オクテット)、文字境界の特定も文字数カウントも一度関数を書いてしまえば ok なのですが…。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MinGW のインストール方法がガラッと変わっていた (と思ったら元に戻っていた?) 件</title>
		<link>https://blog.harapeko.jp/2010/09/02/mingw-install/</link>
		<comments>https://blog.harapeko.jp/2010/09/02/mingw-install/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 16:19:54 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></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  [&#8230;]]]></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 &#8211; <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" style="width: 513px" class="wp-caption alignnone"><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" style="width: 513px" class="wp-caption alignnone"><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>https://blog.harapeko.jp/2010/09/02/mingw-install/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MinGW に GCC 4.4.0 を導入する</title>
		<link>https://blog.harapeko.jp/2010/08/31/mingw-gcc44/</link>
		<comments>https://blog.harapeko.jp/2010/08/31/mingw-gcc44/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 23:17:13 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></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 のコアデータの仕様がだいぶ形になってきたので、いよいよ実装を開始しました。本当はメインマシンに L [&#8230;]]]></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>https://blog.harapeko.jp/2010/08/31/mingw-gcc44/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>libiconv で文字セット自動認識</title>
		<link>https://blog.harapeko.jp/2010/03/03/libiconv-gues/</link>
		<comments>https://blog.harapeko.jp/2010/03/03/libiconv-gues/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 09:02:48 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></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 はどうにも使い物にならないからどうしよう、といった記事を書いたので [&#8230;]]]></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>https://blog.harapeko.jp/2010/03/03/libiconv-gues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>久しぶりに…</title>
		<link>https://blog.harapeko.jp/2009/09/09/recovery/</link>
		<comments>https://blog.harapeko.jp/2009/09/09/recovery/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 22:25:56 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></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 に物理的損傷らしきものを見つけてしまいまして、必要なデ [&#8230;]]]></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>https://blog.harapeko.jp/2009/09/09/recovery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>世の中には本当にいろいろな MML がある。</title>
		<link>https://blog.harapeko.jp/2009/08/13/pmml/</link>
		<comments>https://blog.harapeko.jp/2009/08/13/pmml/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 14:54:08 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></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 という論文検索サイトを教えて頂きました。むし [&#8230;]]]></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>https://blog.harapeko.jp/2009/08/13/pmml/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>頼りなさげな wchar_t</title>
		<link>https://blog.harapeko.jp/2009/07/25/wchar_t-suck/</link>
		<comments>https://blog.harapeko.jp/2009/07/25/wchar_t-suck/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 09:42:17 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></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 上で動作するプログラムの多くは、テキストを処理することを目的の一部またはすべてと [&#8230;]]]></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>https://blog.harapeko.jp/2009/07/25/wchar_t-suck/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ubuntu への Boost セットアップとバージョン間差異の問題</title>
		<link>https://blog.harapeko.jp/2009/07/23/boost-setup-for-ubuntu-and-differ-by-version/</link>
		<comments>https://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><![CDATA[村山 俊之]]></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 パッケー [&#8230;]]]></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 ライブラリ &#8211; バージョン間の差意について</a></li>
</ul>
<p>とりあえず今思いつくのは正規表現まわりだけだったのでまだそこしか調べていないのですが (空文字列マッチは何気に影響範囲大きそうですが…古いバージョンで統一しておけばとりあえず問題にはならないかな…)、実際に開発が進めば利用範囲が広がり、都度気づく部分も増えていくかもしれません。上記ページはその都度更新して行く予定です。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2009/07/23/boost-setup-for-ubuntu-and-differ-by-version/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>なおも boost セットアップ調査中…。</title>
		<link>https://blog.harapeko.jp/2009/07/16/boost-setup-investigation/</link>
		<comments>https://blog.harapeko.jp/2009/07/16/boost-setup-investigation/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 23:56:40 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></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 してました。 技術 [&#8230;]]]></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>https://blog.harapeko.jp/2009/07/16/boost-setup-investigation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
