Macで、Apple版じゃないgccを使用してBoostをビルドするときのエラー

いつも忘れるのでメモ

Boost users' mailing page: Re: [Boost-users] Boost Install on Mac OS X using GCC

(1) Create a file user-config.jam in the boost root with the
following contents:
using darwin
: std0x
: "/opt/local/bin/g++"
: -std=gnu++0x
;
(2) Because non-Apple versions of g++ do not support
-no-cpp-precomp, we need to remove this option in file
tools/build/v2/tools/darwin.jam. In line 485, change
flags darwin.compile OPTIONS : -no-cpp-precomp -gdwarf-2 ;
to
flags darwin.compile OPTIONS : -gdwarf-2 ;
(3) Now build Boost with

./bootstrap.sh
./bjam --with-toolset=darwin-std0x

DLL_PROCESS_DETACHでデッドロック

φ(..)メモメモ

grayhole: DLL_PROCESS_DETACH は難しい
c++ - FreeLibrary blocks my application - Stack Overflow

Make sure you are not waiting for some thread inside DLL_PROCESS_DETACH.

When DllMain is called, system aquires internal critical section, which can cause deadlock if your code inside DllMain waits for some thread T to finish, this thread when finishing will also want to do DLL_PROCESS_DETACH, but since system critical section is aquired it will wait infinitelly causing deadlock.

DLL_PROCESS_DETACHの中でthreadの終了待ちしちゃらめぇ・・・とのこと。

Does creating a thread from DllMain deadlock or doesn't it? | The Old New Thing

札幌C++勉強会 #4を開催しました!

ブログに書くのが遅れましたが、Sapporo.cppとして2012年初めての勉強会、札幌C++勉強会 #4 : ATNDを開催しました。
発表された皆様、参加された皆様、お疲れさまでした、ありがとうございました!

今回は初めて、しっかりとテーマを定めた勉強会の開催となり、ゲームプログラミングとC++に関する内容で、各発表者にセッションをしていただきました。
(ちなみにテーマがゲームプログラミングになったきっかけは、1月の終わりに行われたGGJがきっかけだったりします。)

発表

僕はいままでゲームプログラミングというのをやったことはなかったので、正攻法では太刀打ち出来ないと考えて、C++でWebアプリケーションと絡めたゲームプログラミングという、左斜め前向きのネタで発表をしました。

発表資料

  • 当日、事前にセットアップしたサーバーに会場内のネットーワークから繋げられないということがあって深い悲しみに包まれたりしたので次回は気をつけます。
  • スライドをフルスクリーンにすると文字がずれるという事態で深い悲しみに包まれたので次回は気をつけます。
  • ディスプレイのコネクタを間違えてDVIのものを持ってきてしまって深い悲しみに包まれたので次回は気をつけます。

発表はWtとNative Clientを紹介しました。

Wt

WtはC++のWebアプリケーションフレームワークです。
JavaWicketというのに似ているかもしれないとのこと。
Wtは公式のドキュメントが豊富で英語も読みやすいです。日本語情報はほとんど見つからないですね。

僕が面白いと思った点がありまして、
公式サイトのIntroductionの中に、

Page-based web frameworks(Django, Ruby on Rails, PHP, etc…)はその基になる技術(HTML/XHTML, Javascritp, CSS, Ajax, WebSockets, Comet, Forms, DHTML, SVG/VML/Canvas)を抽象化しようとしない。そのため、一人の開発者がそれら進歩していく技術に長けていなければならず、さらにブラウザのサポートがない場合のgraceful degradationに対して責任を負わなければならない。 (中略) それに大して、Wtで開発されるwebアプリケーションはC++ API向けに開発され、必要なHTML, CSS, Javascript, CGI, SVG/VML/CanvasそしてAjaxのコードはライブラリが提供する。セキュアでブラウザポータブルなwebアプリケーションを書く責任はWtが引き受ける。

http://www.webtoolkit.eu/wt

なんていうことが書いてあります(訳の精度は保証されません)

僕は、HTTPやWebアプリケーションやWebアプリケーションデザインの知識がなくて、C/SやらHTMLやらJavascriptやらCSSやらというのが苦手だったりするのですが、Wtがそれらの細かいところを抽象化して、デスクトップアプリケーションのようにしてWebアプリケーションを開発することができるようにするという話は非常に面白く感じました。

Native Client

発表前日に、Wtだけじゃネタが薄いと気づいたので、急遽Native Clientも盛り込みました。
Wtだとあんまりリアルタイム性のあるアプリケーションは開発できないので、もっと動きのあるものが必要だということで、Native Clientで簡単にゲーム的なものを作成しました。
http://hotwatermorning.dip.jp:8085/nacl_test.html

急遽作ったものなのでソースとか酷いですし、他にもソースは本当に見れたもんじゃないですし、さらにソースとかソースとか汚すぎます。でも特に難しい話は無くて、ppapiというものを使用して、Module作って、Moduleからembed毎にInstanceが作られて云々とかをドキュメントとexampleと合わせて読んでいくと、初めて触っても半日で動くものができるくらいになりました。そして、一旦ビルドすれば、そのままwindows(上のchrome)でもmac(上のchrome)でもlinux(上のchrome)でも動くのですごいですね。

画像や図の扱いがAPIでサポートされなさすぎる気がしてるのですがどうなんでしょう。僕が知らないだけかな。

というわけで初めてのゲームプログラミングでした。

他の発表内容の紹介は各講師のブログの方にまとめてあるかもしれないのでそれぞれそちらを参照していただくことにしましょう。

懇親会

懇親会の募集をかけるのが遅くなってしまったので、なかなか周知しきれなかったので反省です。当日会場で募集をかけたらもとの登録の倍以上になり、大所帯で懇親会に行きました。お店には急な人数変更にも対応していただいて助かりました。
[twitter:@ryuutar]さんや[twitter:@d_rascal774]さんといった非常に若い人にも参加していただいて嬉しかったです。
[twitter:@d_rascal774]さんのショタ幼女っぷりぱねぇ。
大勢で食べて飲んで話して、とても楽しかった。
今回はみんな1次会で解散したのですが、徹夜で眠すぎたので帰り道、何度もまぶたが落ちて前が見えませんでした。危ない。

総括

ゲームプログラミングということで、いままでとは違ったメンバーに興味を持っていただいて、多く方に参加していただく勉強会を開催することが出来ました。
久しぶりの勉強会でしたが、自分で得たものも多く、非常に有意義でした。
これをまた、次の勉強会に活かしていけたらいいなと思います。

Boost.勉強会 #8 大阪に参加してきた。

2/11日開催のBoost.勉強会 #8 大阪に参加して、Boost.Testについて発表してきました。

12月に募集が開始されたBoost.勉強会の参加登録が一瞬で埋まったので補欠参加枠で登録したにも関わらずフライングで飛行機を予約してしまったので、ちゃんと勉強会に参加できるかどうか分からなかったですが、無事に参加、そして発表もできてよかったです。


大阪行きということでそれだけ忙しそうなので、発表は当初するつもりはなかったですが、
某A社の方から発表を誘われたり、
知り合いのプログラマーからも「せっかく大阪まで行くんならついでに発表してきたらいいよー」なんていうアドバイスいただきましたので、なにかやることに。
2/1まで大学の定期試験があってあんまり時間なかったですが、普段からBoost.Testは使用していたのでなんとかなるだろうという予測のもと、まだBoost.勉強会でネタに上がってないであろうBoost.Testについて紹介する内容の発表をすることにしました。
(資料の準備は結果的に結構大変だったわけですが。。。)
(秋猫さんと内容がかぶる懸念もありましたが秋猫さんのほうはBoost.Test以外でやるという風に調整していただいたので助かりました。ありがとうございます!)


というわけでBoost.Testです。

http://www.ustream.tv/recorded/20366041

発表の内容はだいたいドキュメントの和訳と抜粋と使ってみた時の注意点的なものになってます。
出番ぎりぎりまで資料をいじっていたので、当日は資料に不備があったりしました。まだあるのであとで直したいと思います。


これまでは、Boost.Testを使っていてもあんまりちゃんとドキュメントを読んだことがなかったので、
今回の発表資料作りのためにあの長いドキュメントを読むのは苦労しました。
とはいえそれでも全部読んだわけではないですが。

特に、Test RunnerやTest Module Initializationあたりは、
ドキュメントも何書いてるかよく分からないしビルド設定もどうしたら良いか
よく分からないしちゃんと動くテストも書けなかったしで、発表内容からサクサクスキップすることにしました。
ただひとつ、ドキュメントのhttp://www.boost.org/libs/test/doc/html/utf/user-guide.htmlには、
"An advanced test runner may provide additional features, including interactive GUI interfaces, test coverage and profiling support."
という事が書いてありましたので、だれかGUIでProgress_Displayより綺麗な出力してくれるテストランナー作ったりしてないかなー。いたら面白いなーなんて思っています。
ところで、大変だったにも関わらず、ドキュメントの英語を読むのは結構楽しかったです。


発表自体についてですが、発表資料作りに追われて、トークの準備ができなかったので、ちょっとぐだぐだになってしまったことと、実行時のテスト設定で--run_testの使用例をスライドにするなり実際にデモを動かして見せるなどができなかったことが残念です。
でも、とりあえず無事に発表を終えることができてよかったです。


以下は発表以外の大阪旅行の記録。

続きを読む

コンテナをストリーム出力

(vectorとかlistとか)コンテナの中身を確認したくてストリームに出力しようと思っても、
コンテナ自体にはoperator<<が定義されていないのでそのままostreamに出力することはできません。

だからといってコンテナの要素をイテレータでたどるために毎回

for(my_container_t::iterator it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it;
}

とか書くのは面倒です。
かといって上のコードをそのまま関数にするのもstd::coutしか使用できないってことで汎用性がないうえ、
せっかくのoperator<<の仕組みを使えないのは残念です。
(他にはstd::ostream_iteratorを使う方法

std::copy(vec.begin(), vec.end(), std::ostream_iterator<my_container_t::value_type>(std::cout));

もありますね。)
コンテナの要素をよしなに出力してくれて、出力先は好きなostreamを使えて
operator<<の形で書ける何かがあると嬉しいですね。

to_ostream_outputtableというクラスを作りました。
こいつを使えば、コンテナをストリームに出力可能にすることができます。

#include <boost/test/minimal.hpp>

#include <iostream>
#include <list>
#include <string>
#include <sstream>
#include <vector>

#include <hwm/to_ostream_outputtable.hpp>

struct TestClass
{
    int         age_;
    std::wstring name_;
    TestClass(int age, std::wstring const &name)
        :   age_(age)
        ,   name_(name)
    {}

    template<class CharType>
    friend
        std::basic_ostream<
            CharType,
            std::char_traits<CharType>
        > & 
        operator<<(
            std::basic_ostream<
                CharType,
                std::char_traits<CharType>
            > &os,
            TestClass const &t )
    {
        return
            os << L"{age : " << t.age_ << L", name : " << t.name_ << L"}";
    }
};

int test_main(int argc, char **argv)
{
    std::vector<std::string> strings;
    strings.push_back("hello");
    strings.push_back("world");
    strings.push_back("!");

    std::list<TestClass> daughters;
    daughters.push_back(TestClass(14, L"空"));
    daughters.push_back(TestClass(10, L"美羽"));
    daughters.push_back(TestClass(3, L"ひな"));

    std::stringstream ss;
    std::wstringstream ws;

    ss << hwm::to_os << strings;
	
    //(0番目の要素, 1番目の要素, 2番目の要素, ...)という風に出力される。
    BOOST_CHECK(ss.str() == "(hello, world, !)");

    //windowsならワイド文字列のwcoutに必要になるかも。それと他の環境のことは知らない。
    setlocale(LC_ALL, "japanese");

   //wide文字列用のostreamにもそのまま使える。
    std::wcout << L"ハッピハッピガー" << hwm::to_os << daughters << L"ハッピハッピガー" << std::endl;
    //ハッピハッピガー({age : 14, name : 空}, {age : 10, name : 美羽}, {age : 3, name : ひな})ハッピハッピガー
	
    return 0;
}

hwm/to_ostream_outputtable.hpp

#ifndef HWM_TOOSTREAMOUTPUTTABLE_HPP
#define HWM_TOOSTREAMOUTPUTTABLE_HPP

#include <boost/range/iterator.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>

namespace hwm {

namespace ostream_outputtable_detail {

    template<class CharType>
    struct ostream_output_impl
    {
        typedef
            std::basic_ostream<
                CharType,
                std::char_traits<CharType>
            >
        ostream_type;

        ostream_output_impl(ostream_type &os)
            :   os_(os)
        {}

        template<class Container>
        ostream_type & operator<< (Container &ct)
        {
            typedef typename boost::range_iterator<Container>::type iterator;

            iterator it         = boost::begin(ct);
            iterator const end  = boost::end(ct);

            if(it == end) {
                os_ << "()";
            } else {
                os_ << "(";
                for( ; ; ) {
                    os_ << *it;
                    ++it;
                    if(it != end) {
                        os_ << ", ";
                    } else {
                        os_ << ")";
                        break;
                    }
                }
            }
            return os_;
        }

        ostream_type &os_;
    };

    struct to_ostream_outputtable
    {
        template<class CharType>
        friend
        ostream_output_impl<CharType>
            operator<< (
                std::basic_ostream<
                    CharType,
                    std::char_traits<CharType>
                > &os,
                to_ostream_outputtable const &t )
        {
            return ostream_output_impl<CharType>(os);
        }
    };
}   //namespace ostream_outputtable_detail

static ostream_outputtable_detail::to_ostream_outputtable const to_os = {};

}   //namespace hwm

#endif  //HWM_TOOSTREAMOUTPUTTABLE_HPP

ostreamによしなに出力したいだけなので、Pythonとかのタプルの形式で決め打ちしています
他の形式で出力するためにポリシークラスを用意したりするともっと便利になるかもですね、でも面倒なのでやってません。
直後に来るコンテナを出力したあとはただの元のostreamに戻るので、
複数のコンテナを出力するときは毎回コンテナの直前にhwm::to_osを置くようにします。

それから、本当はストリーム側じゃなくてコンテナ側をいじってostreamに出力可能なようにする方が行儀がいいのかも・・・?

Sapporo.cpp 新年会 2012を開催しました。

Sapporo.cpp 新年会 2012 : ATND
皆であつまってC++の話とか、去年の活動振り返ったりとか、今年もOSCで何か出来たらいいねーとか、そんな色んな話をしてきました。
新年早々お酒も呑めてすごく楽しかったです。

今年のまとめ

DTMサークルを作って2年が、札幌C++勉強会/Sapporo.cppを作って1年が経ちました。

今年はいろいろと激動の1年でした。
忘れられない1年でしたが、その中で忘れてしまうこともあると思って、でも忘れたくないことがいっぱいあるので、覚えていてかつ書ける範囲で、いくつかここに書いておきたいなと思いました。

サークル編

今年は、サークル発足から2年ということで、去年は出来なかったことがいっぱい出来ました。
同人イベントにCDアルバム製作して出店したり、学祭でDJっぽいことやったり、みんなで課題に沿った曲作って集めるコンペやってみたり、サークル内でDTM講習会やったり。
特にイベント出店の時には、サークルや各メンバーに面白い出会いも有ったりして、非常に有意義だったと思います。

勉強会編

去年の12月におこなったBoost.忘年会2010@sapporo : ATNDから生まれた、札幌C++勉強会/Sapporo.cppは、去年12月の発足からようやく1年が経ちました。はじめ、勉強会運営は色々と分からないことだらけでしたが、一緒に考えて準備してくれる、運営メンバーと勉強会メンバー、それから、お世話になっている他の札幌の勉強会の先輩方の協力で、この1年目を迎えることが出来ました。


さらっと今年有ったことを書いておくと、

2/26に札幌C++勉強会#1 : ATNDを開催しました。

初めての勉強会開催でした。
このときは、東京で開催されたBoost.勉強会 #4のストリーム配信を札幌で見ながら、Boost.勉強会に参加しているみたいな気持ちを味わって、さらにその後懇親会なんかもやっちゃおうぜっていう企画でした。
札幌C++勉強会#1を開催しました! - How to disappear completely

6/11にオープンソースカンファレンス2011 Hokkaido - オープンソースの文化祭!を開催しました。

OSC 2011 Hokkaidoでセミナーとブース展示しました。
前年には一般参加者として見てくるだけで終わってしまったOSCだったのですが、せっかく勉強会を発足したのだし、せっかくC++0xもホットな話題になっている時期だったので、今年は勉強会としてセミナーとブースで参加することにしました。
OSC2011 Hokkaidoに参加しました(喋ってきました)! - How to disappear completely


OSCに向けたSapporo.cppの打ち合わせの時、ブースでなにか小冊子作って配ってみようという事になりました。話し合いを進めるうちに、[twitter:@cpp_akira]さんに特別寄稿をお願いすることになり、[twitter:@matu_ani]さんにも記事を書いていただく事になり、[twitter:@zakkas783]さんにレビューに入ってもらうことが出来たりして、当初の予想より、かなりしっかりした小冊子を創り上げることが出来ました。

制作班は調整で深夜まで打ち合わせしたりだとか、みんな本当にお疲れさまでした!
zakさんもお忙しかった時期にも関わらずレビューをしていただきありがとうございました!
プログラミングの魔導少女 - sapporo.cpp


小冊子の作成に続いて、セミナー講演の準備もしました。内容は、当時もうすぐ規格が採択されるというC++0xの紹介でした。C++C++0xになることで、より便利になりますよ、と。
このときは[twitter:@nakayoshix]さんのおかげでUST配信することが出来ました。ありがとうございます!会場も、立ち見が出るほどの賑わいとなり、とても嬉しかったです。徹夜で[twitter:@ignis_fatuus]さんの研究室にこもってみんなで資料作成した甲斐がありました。あと、あれだけの人数の前で、自分でちゃんと話をするっていうことを経験出来てよかったです。特に質問の時間とかすごく楽しかったw
(筑波から!)[twitter:@Flast_RO]さんも札幌に遊びに来ていただいて、2011年のC++erエンカウント祭りの幕開けでした。

7/3に札幌C++勉強会#2 : ATNDを開催しました。

Sapporo.cppとして、初めてのちゃんとした勉強会を開催しました。
OSCでも開催を宣伝した効果からか、22名という予想を超える数の参加者に参加していただくことが出来ました。初めてのちゃんとした形での勉強会開催で、今から思うと、もう少し工夫しておけばよかったとか、当日もっとこうすればよかったなー、なんていう点も有ったりします。。。
でも、勉強会の準備とはこういう感じ、発表とはこういう感じ、みたいなことを経験できてとてもよかったです。
札幌C++勉強会#2を開催しました! - How to disappear completely


Boost.勉強会を札幌で開催する件を本格的に進め始めたのは札幌C++勉強会#2が終わったこの時期くらいからだったかなー?

8/12にBoost.Beer 札幌 : ATNDを開催しました。

#2のあとは、ビアガーデンでBoost.Beer 札幌を開催しました。小冊子に記事を執筆していただいたり、OSCの時にお会いした[twitter:@matu_ani]さんとちゃんとお話しすることができて面白かったです。酒の肴はストロウストルップのプログラミング入門でした。
Boost.Beer 札幌を開催した。 - How to disappear completely

10/1に札幌C++勉強会 #3 : ATNDを開催しました。

Boost.勉強会の準備を進めつつ、その開催に向けて、その前に、Boostに入門できることを目的とした勉強会を開催しようということで、時期的にもちょうといい所で札幌C++勉強会 #3 : ATNDを開催しました。実際に触ってもらいながらBoostの便利さを知ってもらおうという考えで準備を進めてみましたが、これがなかなか難航して、参加者体験型の勉強会の難しさを思い知ることとなりました。

11/4にBoost.勉強会 #6 札幌 前夜祭 : ATNDを開催しました。

Boost.勉強会に先立って、前日から札幌入りしている怖い方々とジンギスカン食べてきました。
OSCの時にFlastさんにはお会いしていましたが、ここで[twitter:@cpp_akira]さんと[twitter:@kikairoya]さんに初めてお会いしました。闇の話とかC++erの話とか、Flastさんのネットワークの話とか、「全ての道はCry's Diaryに続いている」とか、「そこは[twitter:@Cryolite]が5年前に通った道だ」とか楽しいお話ができました。

11/5にBoost.勉強会 #6 札幌 : ATNDを開催しました。

Boost.勉強会初参加にして、札幌での開催を担当させていただきました。
本州からもたくさんの方に参加していただきました。
中には、Boost.勉強会だと意識しないで、「札幌でなにかC++の祭りがあるらしい」的な感じで参加してくださった方もいらっしゃったようです。
この開催に当たっては[twitter:@ayako119]たんにネットワークとUSTを担当していただきました。Sapporo.cppのメンバーにも準備に尽力していただきました。
僕にとって夢であったBoost.勉強会の参加や道外のC++erとの対面などが一気に実現した、思い出に残る勉強会の開催となりました。嬉しいです。
運営に携わってくださった皆様、参加してくださった皆様ありがとうございます。
Boost.勉強会 #6 札幌を開催しました! - How to disappear completely
Boost.勉強会 #6 札幌を開催しました!2 - How to disappear completely

11/10にεπιστημηさんを囲む会 : ATNDを開催しました。

Boost.勉強会が終わった直後だったかな?に、[twitter:@matu_ani]さんから、[twitter:@epitwit]さんが札幌にいらっしゃるので、Sapporo.cppのみなさんも交えて飲み会でもやりませんかというお話をいただきました。エピさんといえば「C++の設計と進化」(通称D&E)の監修や、アキラ先生と共著の「C++テンプレートテクニック」や、Cppllなどで著名な方で、以前から機会があればお会いしたいなーなんて思ってたのですが、こんなに早く実現するとは・・・!
C++98規格採択以前のC++の話など面白い話を聞かせていただきました。類まれな機会をいただきまして、[twitter:@matu_ani]さんと[twitter:@epitwit]さんありがとうございました。
επιστημηさんを囲む会を開催しました。 - How to disappear completely

12/10に関数型都市忘年会 : ATNDを開催しました。

Boost.勉強会が終わってから個人的にちょっと忙しくて割とバタバタして落ち着きないまま当日まで迎えた関数型都市忘年会でした。
関数型プログラミングを共通項にしたいろんな方の発表を見せていただくことが出来てよかったです。忘年会ですしゆるふわでしたね!☆(ゝω・)vキャピ
僕もC++テンプレート入門という内容で発表しました。内容はもっとちゃんと作り込むべきでした。でも、開催も発表も懇親会も、とても楽しかったです!
関数型都市忘年会を開催しました! - How to disappear completely
関数型都市忘年会 & Hokkaido.pm 合同懇親会を開催しました。 - How to disappear completely

12/29に札幌で中3女子と忘年C++焼肉 : ATNDを開催しました。

岡山から中3女子陶芸C++erの[twitter:@bolero_MURAKAMI]さんが札幌に来るというので、急遽忘年会開催することとなりました!
ボレロさんと札幌のご友人と、Sapporo.cppのメンバーで焼肉に行ってきました。
constexprと中3女子とほもせっくすトークこれはひどいとっても楽しかったです。
焼き肉おいしかったし、中3女子にも会えたし、今年の締めに非常に面白い企画となりました。
次回のBoost.勉強会でもお会いできるといいですね
カラオケも行きたいです。

まとめ

という感じで、今年は、勉強会運営を通じて、人前で発表したり、普段お会いできない人に会えたり、C++er達プログラマー達といっぱい一緒に活動が出来たり、なかなか出来ないような経験を沢山することが出来ました。Sapporo.cppという組織で活動できてうれしいと思います。
来年はもっと、運営に興味がある人がいたら一緒にやりたいと思うのと、勉強会の内容の質を向上して、そして対象者レベルを広くカバーできるようにして、C++とSapporo.cppに興味を持ってくれる人が増えたらいいなと思います。

今年一年お世話になった皆様(特に日頃お世話になっている[twitter:@ignis_fatuus]さん、[twitter:@lapis_tw]さん、[twitter:@h_hiro_]さん)、大変ありがとうございました。
来年もまたよろしくおねがいします。