#include <iostream>
#include <string>
#include <vector>
#include <expat.h>
#include <boost/shared_ptr.hpp>
#include <boost/foreach.hpp>
class xml_node;
class xml_node {
public:
xml_node( const XML_Char* name ) : node_name_(name) {}
public:
std::basic_string<XML_Char> node_name_;
std::basic_string<XML_Char> node_value_;
std::vector< boost::shared_ptr<xml_node> > childs_;
};
class xml_holder {
public:
std::vector< boost::shared_ptr<xml_node> > stack_;
boost::shared_ptr<xml_node> current_;
};
void starter(void* userData, const XML_Char* name, const XML_Char* attrs[]) {
xml_holder* holder = reinterpret_cast<xml_holder*>(userData);
holder->stack_.push_back( holder->current_ );
boost::shared_ptr<xml_node> element( new xml_node( name ) );
holder->current_->childs_.push_back( element );
holder->current_ = element;
}
void ender( void* userData, const XML_Char* name) {
xml_holder* holder = reinterpret_cast<xml_holder*>(userData);
holder->current_ = holder->stack_.back();
holder->stack_.pop_back();
}
void data( void* userData, const XML_Char* s, int len ) {
xml_holder* holder = reinterpret_cast<xml_holder*>(userData);
holder->current_->node_value_.assign( s, s + len );
}
void trace( int depth, boost::shared_ptr<xml_node> elem ) {
for( int i = 0; i < depth; ++i ) { std::cout << " "; }
std::cout << elem->node_name_ << ":" << elem->node_value_ << std::endl;
BOOST_FOREACH( boost::shared_ptr<xml_node> e, elem->childs_ ) {
trace( depth+1, e );
}
}
bool parse_xml( const std::string& xml ) {
xml_holder holder;
holder.current_ = boost::shared_ptr<xml_node>( new xml_node( "root" ) );
XML_Parser parser = XML_ParserCreate("UTF-8");
if( !parser ) return false;
XML_SetUserData( parser, &holder );
XML_SetElementHandler( parser, starter, ender );
XML_SetCharacterDataHandler( parser, data );
int iseof = 0;
XML_Parse( parser, xml.c_str(), xml.size(), iseof );
XML_ParserFree( parser );
trace( 0, holder.current_ );
return !iseof;
}
2008年11月8日土曜日
expat で遊ぼ
2008年11月7日金曜日
windows vista は眠らない
Windows Vista は、なかなかシャットダウンやログオフをしてくれません。今日なんかは、10分以上待ってもシャットダウンしないので、強制的に電源を切ったら、再起動時にチェックディスクで15分以上待たされました。まあ、シャットダウンやログオフができないので3回に1回は、強制的に電源を切ってます。Unexpected shutdown detected... の文字を見るたびに、Windows Vista の filesystem は強固だなぁと、違った意味で感動します。
あまりに酷く、きっとシャットダウンやログオフしようとしているのに、糞重たい UAC が悪さをしているに違いない!と、UAC Tool をインストールしました。日本語化のパッチも出回っているのですが、あいくに x64環境のものはありません。Visual Studio でSymconsent.exe を編集して保存すると日本語もOKみたいです。

まだ1日目ですが、なかなか快適です。さっさとインストールすればよかった…。
ウィンドウズは、IObjectSafety とか、やることの観点がズレてるように感じます。
あまりに酷く、きっとシャットダウンやログオフしようとしているのに、糞重たい UAC が悪さをしているに違いない!と、UAC Tool をインストールしました。日本語化のパッチも出回っているのですが、あいくに x64環境のものはありません。Visual Studio でSymconsent.exe を編集して保存すると日本語もOKみたいです。

まだ1日目ですが、なかなか快適です。さっさとインストールすればよかった…。
ウィンドウズは、IObjectSafety とか、やることの観点がズレてるように感じます。
マルチコア
Windows7では 255CPUまでしか対応しないといった記事を読んだので、その辺に関して、でたらめ右脳的な発言をしてみよう。
クロックアップによる速度競争は、消費電力が高くなっていくため、コア数が増える方向に変わってきています。よって今後は、OSのアーキテクチャも巻き込んで、マルチコアなアルゴリズムや分散アルゴリズムが重要になるであろうと思います。まず、マルチスレッドな処理でネックになってくるのが、同期保護の問題。しかし冷静に考えてみよう???全てのプロセスやスレッド間で、そもそも同期を取る必要があるのだろうか???
こう考えた時、ドメインのようなモデルが導入されていくと感じます。なんでも直列に繋いでもしょうがない、64個とか32個とか16個を区切りとして、メモリアクセスのバスも区切られたハードウェア構成になり、それらをドメインと呼び、分散処理する。あるいは、コアが複数個ある1次キャッシュメモリに動的にバインドできるとか・・・。
うーん・・・まとまりがなくなってしまった・・・。
クロックアップによる速度競争は、消費電力が高くなっていくため、コア数が増える方向に変わってきています。よって今後は、OSのアーキテクチャも巻き込んで、マルチコアなアルゴリズムや分散アルゴリズムが重要になるであろうと思います。まず、マルチスレッドな処理でネックになってくるのが、同期保護の問題。しかし冷静に考えてみよう???全てのプロセスやスレッド間で、そもそも同期を取る必要があるのだろうか???
こう考えた時、ドメインのようなモデルが導入されていくと感じます。なんでも直列に繋いでもしょうがない、64個とか32個とか16個を区切りとして、メモリアクセスのバスも区切られたハードウェア構成になり、それらをドメインと呼び、分散処理する。あるいは、コアが複数個ある1次キャッシュメモリに動的にバインドできるとか・・・。
うーん・・・まとまりがなくなってしまった・・・。
2008年11月6日木曜日
2008年11月5日水曜日
ubuntu 8.10 いろいろ
8.10 にすると gcc のバージョンが 4.3.2 と新しくなって嬉しいが、Kernel 2.6.27-7 で起動すると、無線Lanがうまく動作しない・・・。長期安定版である 8.04 を使い続けた方が良さそう気がします。
それはそうと、boost_1_37_0 が出たので、コンパイルしようと思ったら、"duplicate initialization of gcc" とかエラーが出て make が通らない。検索してみたら、boost ml にもポストされていたが完全にスルーされていた。で、user-config.jam をうんたらとメッセージが出ているので、中を覗いたら、あんまし嬉しくなさそうな設定が書かれている。全部コメントアウトしたら、make も通るようになった。
user-config.jam を編集して、コメントアウトしまくる。
boost-python も使う予定が無いし、うぜーと思っていたのでちょうど良い。
2009/12/12 追記
configure 無くなってた…。
それはそうと、boost_1_37_0 が出たので、コンパイルしようと思ったら、"duplicate initialization of gcc" とかエラーが出て make が通らない。検索してみたら、boost ml にもポストされていたが完全にスルーされていた。で、user-config.jam をうんたらとメッセージが出ているので、中を覗いたら、あんまし嬉しくなさそうな設定が書かれている。全部コメントアウトしたら、make も通るようになった。
$ ./configure
user-config.jam を編集して、コメントアウトしまくる。
# Boost.Build Configuration
# Automatically generated by Boost configure
# Compiler configuration
# using gcc ;
# Python configuration
# using python : 2.5 : /usr ;
boost-python も使う予定が無いし、うぜーと思っていたのでちょうど良い。
$ make
$ make install
2009/12/12 追記
configure 無くなってた…。
$ chmod +x bootstrap.sh
$ chmod +x tools/jam/src/build.sh
$ ./bootstrap.sh
$ ./bjam
2008年11月4日火曜日
2008年11月2日日曜日
getuntil.hpp
c++ の getline は、なんとなく改行コードまでを取得するという仕様で、ネットのプロトコル等で利用するには、不満が残ります。そこで、汎用的な以下のようなものが有用ではないか?と思い、以前に作成したものを貼っときます。
>>> getuntil.hpp
使い方は、こんな感じです。
>>> getuntil.cpp
>>> getuntil.hpp
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Copyright (c) 2007 OKI Miyuki (oki.miyuki at gmail dot com)
//
#include <iostream>
#include <string>
template<typename CharT, typename CharTraits, typename Allocator>
std::basic_istream<CharT, CharTraits>& getuntil(
std::basic_istream<CharT, CharTraits>& istrm,
std::basic_string<CharT, CharTraits, Allocator>& str,
const std::basic_string<CharT, CharTraits, Allocator>& delm
) {
typedef std::basic_istream<CharT, CharTraits> istrm_type;
std::ios_base::iostate cur_state = std::ios_base::goodbit;
bool read_once = false;
const typename istrm_type::sentry sync( istrm, true );
if( sync ) {
try {
str.clear();
typename CharTraits::int_type row_xor = 0;
typename CharTraits::int_type ins_xor = 0;
size_t delm_len = delm.size();
typename CharTraits::int_type val = istrm.rdbuf()->sgetc();
for( size_t i = 0; i < delm_len - 1; ++i, val = istrm.rdbuf()->snextc() ) {
if( CharTraits::eq_int_type( CharTraits::eof(), val ) ) break;
read_once = true;
ins_xor ^= val;
row_xor ^= CharTraits::to_int_type( delm[ i ] );
str += CharTraits::to_char_type( val );
}
row_xor ^= CharTraits::to_int_type( *delm.rbegin() );
for( size_t ipos = 0; ; val = istrm.rdbuf()->snextc(), ++ipos ) {
if( CharTraits::eq_int_type( CharTraits::eof(), val ) ) {
cur_state |= std::ios_base::eofbit;
break;
}
read_once = true;
ins_xor ^= val;
str += CharTraits::to_char_type( val );
if(
ins_xor == row_xor
&& val == CharTraits::to_int_type( *delm.rbegin() )
&& str.substr( ipos ) == delm
) {
istrm.rdbuf()->sbumpc();
break;
}
if( str.max_size() <= str.size() ) {
cur_state |= std::ios_base::failbit;
break;
}
ins_xor ^= CharTraits::to_int_type( str[ipos] );
}
} catch(...) {
istrm.setstate( std::ios_base::badbit, true );
}
}
if( !read_once ) {
cur_state |= std::ios_base::failbit;
}
istrm.setstate( cur_state );
return istrm;
}
template<typename CharT, typename CharTraits, typename Allocator>
std::basic_istream<CharT, CharTraits>& getuntil(
std::basic_istream<CharT, CharTraits>& istrm,
std::basic_string<CharT, CharTraits, Allocator>& str,
const CharT* delm
) {
std::basic_string<CharT,CharTraits,Allocator> delimiter( delm );
return getuntil( istrm, str, delimiter );
}
使い方は、こんな感じです。
>>> getuntil.cpp
#include "getuntil.hpp"
#include <fstream>
#include <sstream>
#include <iomanip>
#include <boost/asio.hpp>
int main() {
std::ifstream ifs( "getuntil.cpp", std::ios::binary );
int i = 0;
std::string delm( "\r\n" );
std::string line;
while( ifs.good() ) {
getuntil( ifs, line, delm );
std::cout << std::setw(3) << ++i << ": " << line;
}
std::cout << std::endl;
std::cout << "Enter stringstream test" << std::endl;
std::stringstream ss;
ss << "high-ho, high-ho!";
ss << "It's home from work we go! high-ho, high-ho!...";
while( ss.good() ) {
getuntil( ss, line, "ho!" );
std::cout << line << std::endl;
}
std::cout << std::endl;
std::cout << "Enter boost::asio::streambuf test" << std::endl;
boost::asio::streambuf sb;
std::ostream ostrm( &sb );
ostrm << "This is data from client\r\n";
ostrm << "And flying send\r\n";
std::istream istrm( &sb );
while( istrm.good() ) {
getuntil( istrm, line, "\r\n" );
std::cout << line;
}
}
登録:
投稿 (Atom)