‘Boost’ タグのついている投稿

C++11 で Unicode プログラミングのススメ このエントリーをはてなブックマークに追加

2011 年 12 月 27 日 火曜日

このエントリは、C++11 Advent Calendar 2011 への参加記事です。

初心者表明を免罪符にするつもりは毛頭無いのですが、 C++0x/11 の学習、およびそれを用いた経験はまだまだ浅いため、内容的に拙い部分が多々あることを、あらかじめご容赦願いたいと思います m(_ _)m 。ていうか突っ込みだいかんげいでつ。

一応 ISO/IEC 14882:2011 の draft “n3242″ を参照しています。 GCC は 4.7 入れるの面倒だったので、動作確認できるものについては Ubuntu 11.10 に入っていた 4.6.1 を用いています。

Unicode に対応したリテラル

文字リテラルについてはドラフトの 2.14.3、文字列リテラルについては 2.14.5 に記述があります。
(続きを読む…)

Boost.Regex の ICU 拡張と char32_t は相性がいいかも? このエントリーをはてなブックマークに追加

2011 年 9 月 21 日 水曜日

なんとなく Virtual Box から利用している Ubuntu のアップグレードなどをして、そこからなんとなく「やっぱり Long Time Release 版の Ubuntu もテスト環境に持っておきたいよなぁ」などと思いつつ Virtual Box ディスクイメージを追加でこさえて、 Boost ライブラリのセットアップなどもしつつ動作チェックも兼ねて昔書いた記事なんぞを掘り起こしておりましたら、そこに書かれた内容に関連して、そういえば Boost.Regex も ICU ライブラリと組み合わせれば Unicode に対応できたはずだよなぁなどということが気になりだしてしまいまして、いろいろ試しているうちに、以下のようなサンプルコードが問題なく動作してしまうことを発見してしまったのでメモしておこうかと思った次第なのであります。ああ、なんだかこちらのブログも口調が個人ブログや普段の Twitter とかでのそれに似てきてしまいました (^_^;A
(続きを読む…)

Boost.勉強会 #4 に行ってきました。 このエントリーをはてなブックマークに追加

2011 年 2 月 26 日 土曜日

今回も必死こいてメモ執りましたよ。終盤力尽きたけど orz

しかしさすがにこの年で一日通しはキツいっすなぁ…。

UTF-8 もイマイチだが… このエントリーをはてなブックマークに追加

2010 年 9 月 22 日 水曜日

UTF-32 が内部文字列に使えないことがわかったので、 UTF-8 を内部文字列に使用するというルールで libiconv によるエンコーディング操作と Boost.Regex による正規表現の両方を同時に試すサンプルを作成してみました。

Makefile は作ってません\(^O^)/。試してみたい人は頑張ってコンパイルしてねw

$ g++ -std=c++0x -o regex-test regex-test.cpp EncodeString.cpp -lboost_regex

まともな環境 (Linux + GCC4.5 とか) なら上記コマンドで通るはず。libiconv を (glibc に上書きする形で) インストールしている場合は -liconv を末尾に入れる必要があるかも。そして MinGW を使う場合は更にもう一工夫必要かも (((;/^^)/
(続きを読む…)

char32_t だと regex が使えない このエントリーをはてなブックマークに追加

2010 年 9 月 22 日 水曜日

C++0x では UCS に対応し、専用の型やリテラルの記法が導入されました。その関係で、以下の点について調査を行っていました。

  1. C++0x で UCS を UTF-32 として扱う型 char32_t, u32string およびリテラル U"..." と、 libiconv の UCS-4-INTERNAL との間に互換性はあるか。
  2. C++0x で新たに追加された正規表現ライブラリ <regex> は利用可能か。
  3. <regex> が利用できない場合、 Boost.Regex を用いて UTF-32 文字列を処理することは可能か。

これらの調査は、すべて otoco のコアデータを扱うプログラム内で内部文字列に UTF-32 を採用することを前提としたものでした。
(続きを読む…)

Boost.勉強会 #2 に参加しました。 このエントリーをはてなブックマークに追加

2010 年 9 月 12 日 日曜日

実に楽しいイベントでした。 5時間ほぼぶっ通しだったのでさすがにくたびれましたが… (^_^;A

自分なりにメモしたノートを公開していますので、よかったら復習にご活用ください。かなり荒いメモですが…。
(続きを読む…)

久しぶりに… このエントリーをはてなブックマークに追加

2009 年 9 月 9 日 水曜日

Boost セットアップ中… orz

実は先日 HDD に物理的損傷らしきものを見つけてしまいまして、必要なデータだけ抜き取ってフォーマットを試みたら見事にエラーで止まりやがったのでやむなく新しいのに交換したのですよ。

ここ最近は忙しかったり体調も安定しなかったりだったので otoco の方の作業はずっと停滞してました…。やっと朝まともに起きれるぐらいに体調は戻ってきたので、そろそろ otoco の作業も復活したいなぁと思いつつ…。

ああそうだ、Linux も使えるように grub 入れ直さないと…。

Ubuntu への Boost セットアップとバージョン間差異の問題 このエントリーをはてなブックマークに追加

2009 年 7 月 23 日 木曜日

Boost ライブラリの Ubuntu へのインストールは容易でした。単に libboost-dev パッケージを aptitude install してあげるだけです。

問題は、前回も書いた通り、 apt からインストールできる Boost のバージョンは通常で 1.34.1、最新のものを選んでも 1.37.0 になってしまう、ということです。

そこで、 otoco の開発に影響する範囲で、バージョン間にどの程度の差異があるのか、調べておくことにしました。

とりあえず今思いつくのは正規表現まわりだけだったのでまだそこしか調べていないのですが (空文字列マッチは何気に影響範囲大きそうですが…古いバージョンで統一しておけばとりあえず問題にはならないかな…)、実際に開発が進めば利用範囲が広がり、都度気づく部分も増えていくかもしれません。上記ページはその都度更新して行く予定です。

なおも boost セットアップ調査中…。 このエントリーをはてなブックマークに追加

2009 年 7 月 16 日 木曜日

昨日、一昨日はメインの仕事の都合で朝が早かったので、こっちの作業はちょっと pending してました。

cl.exe コマンドを直接呼んでビルドする方法については調査完了しました。必須オプションが何気に多いですね…。実際にはあれに最適化オプションなりデバッグオプションなりがくっつくことになります。

で、今度は Ubuntu でのセットアップを調べているのですが、ここで問題発覚。どうやら Ubuntu での boost ライブラリのメインバージョンはまだ 1.34.1 で止まっているようです…。もしかしたら Debian を始め、多くの Linux ディストリビューションにおいても同様の状況なのかもしれません。当初は最新の 1.39.0 を利用する予定でしたが、事実上の汎用性が損なわれる可能性もあるので (さすがにライブラリを手動でインストールしてくれ、とやる訳にもいかないですからね…)、互換性を確認しつつ、バージョンについては考慮しなければならないかもしれません。

インストールして動かして、というあたりはまだこれから調査するところです…。

Windows で Boost セットアップ このエントリーをはてなブックマークに追加

2009 年 7 月 13 日 月曜日

Windows 環境で Boost ライブラリをセットアップしてみました。明日は Linux 環境でもセットアップを行い、技術メモとしてまとめる予定です。

で、せっかくなので、試しに簡単なサンプルを作って動作確認をしてみました。

#include <iostream>
#include <fstream>
#include <string>

#include <boost/regex.hpp>

using namespace std;
using namespace boost;

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

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

	return 0;
}

void escapeHtml(const string &src, string &modified)
{
	modified.clear();
	sregex_iterator last_it;
	for (sregex_iterator it(src.begin(), src.end(), regex("[<>&\"]")); it != sregex_iterator(); it++)
	{
		modified += it->prefix().str();
		string sub = (*it)[0].str();
		switch (sub[0])
		{
			case '<':	modified += "&lt;";		break;
			case '>':	modified += "&gt;";		break;
			case '&':	modified += "&amp;";	break;
			case '"':	modified += "&quot;";	break;
			default:	assert(0);	break;
		}
		last_it = it;
	}
	modified += last_it == sregex_iterator() ? src : last_it->suffix().str();
}

Boost.Regex の regex_iterator を用いたテストです。よーするに、コマンドに指定したファイルの HTML エスケープ処理を施してコンソールに書き出すプログラムです。

上記のプログラムを test.cpp などのファイル名で保存し、そのまま Visual Studio 2008 コマンドプロンプト上で

cl test.cpp

とやってみましたが、これだけではコンパイルできませんでした。どうやら、 Visual Studio のオプションダイアログでヘッダーファイルやライブラリの参照先ディレクトリを設定しても、その設定が参照されるのは Visual Studio の IDE からビルドを実行した場合のみのようです。あるいは、環境変数 INCLUDE や LIB を設定してあげればこれでコンパイルできるのかも知れません。その辺はまた追々調べてみますが、最終的には .configure--boost-prefix といったようなオプションを設ける、といった形の対応になるのではないかとも思います。

ちなみに、これと同等の (しかもより確実に動作する) プログラムを Perl で記述すると、以下の通りになります (この書き方はしかし Unix 風環境限定ですが)。

#!/usr/bin/perl -p
s/[<>&"]/'&'.{qw(< lt > gt & amp " quot)}->{$&}.';'/eg;

うあー、やっぱりスクリプト言語は便利だなー (汗。


2009年 7月 28日 火曜日 16:56:07 JST – 追記

egtra 様、ご指摘感謝です。仰る通り、 string::getline() を使った方がスマートなので、その通りに修正させて頂きました。