路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

メモ: boost 1.36, VC++ 2008 SP1

2008-08-27 19:18:56 | プログラミング
自分用メモ。
boost 1.36を、VC++ 2008 SP1向けにインストール。

(1) ダウンロードして、
c:¥boost_1_36_0
に展開。

(2) rmknさんのページを参考に、bjamを作成。
http://d.hatena.ne.jp/mrkn/20080212/1202801069

pushd c:¥boost_1_36_0¥tools¥jam¥src
build.bat
copy bin.ntx86¥bjam.exe ..¥..¥..
cd ..¥..¥..

(3) アールケー開発さんのページを参考に、コンパイル。
http://www.rk-k.com/memo/017.html

bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=static runtime-link=shared release stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=static runtime-link=shared debug stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=static runtime-link=static release stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=static runtime-link=static debug stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=shared runtime-link=shared release stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=shared runtime-link=shared debug stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=shared runtime-link=static release stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=shared runtime-link=static debug stage

あとは、

(4) boostを使ったプログラムをコンパイルするときに、

ライブラリのパスとして、
C:¥boost_1_36_0¥lib
を指定。

(ちなみに、このディレクトリの中身は1.8GBくらい)

あってるかなあ。

以下蛇足。

boost::conditionに関しての変更

boost::conditionがboost::condition_variable_anyとboost::condition_variableに分化。boost::conditionはcondition_variable_anyの別名になっていた。

後者はメンバ関数のwait()に boost::unique_lockのインスタンスを渡さないといけないかわりに、最適化してあるそうな。

今までは、
#include <boost/thread.hpp>
だけでboost::conditionを使えたけれど、

1.36からは、明示的に、
#include <boost/thread/condition.hpp>
としないといけない。

(2008/09/04 一部修正)

パケット監視社会

2008-08-26 19:33:30 | Birds-Of-Feather
記事「Googleがパケットをのぞき見ている?」
http://www.itmedia.co.jp/anchordesk/articles/0808/22/news059.html
より。

「わたしは、Googleが公式に行動ターゲティング広告を実行するのは時間の問題だと考えている。同社はいつも製品について前もって発表しない。」

やっぱり、そっち方向で心配してる人は多いみたいですね。

(先日のエントリで、IE8のプライベートモードについて書いたときは、MSはユーザーの履歴を収集する動きに対抗しているのかと思ったのですが)

どうやら、MSも、少なくとも研究レベルでは同じ武器を手にしようとしているようです。

記事「グーグルの牙城を崩せるか--MSが着目する検索技術」
http://japan.cnet.com/special/story/0,2000056049,20379061,00.htm
より。

「(検索クエリを)分析して検索パターンを見つけ出し、検索体験を形成できるようにする」
「このように利用者の検索行動をより深く分析すれば、おそらく、より慎重にターゲットを絞った、より高額な広告が付随することになる」

どっちにしてもアメリカの企業だしなあ・・・

実はできレースで、数年後には合併してたりして。

(追記)
http://jp.techcrunch.com/archives/20080825what-we-need-is-a-digital-bill-of-rights/
記事「われわれに必要なのは、デジタル権利章典だ」

ネット上では、国の枠組みを超えた法整備が必要なのかもしれませんね。

IE8のプライベートモード

2008-08-22 22:35:30 | Birds-Of-Feather
記事「マイクロソフト、「Internet Explorer 8」にプライベート閲覧モードを追加へ」
http://builder.japan.zdnet.com/news/story/0,3800079086,20379053,00.htm
より。

IE8の「プライベート閲覧モードと聞いてまず頭に浮かぶ使い方は、履歴を残すことなくアダルトコンテンツのネットサーフィンを楽しむというもの」

などといって笑っていられればいいのですが・・・

プライベートモードの搭載は、開発チームが思いつきで付けてみた、などというものではなく、かなり戦略的な行動だと思うのですが、どうでしょうか。

・個人のプライバシーもそうだけれど、情報漏えいにうるさい企業ユーザーにアピールする。

・某G社が永久に残るクッキーやストリートビューで非難を浴びているのは周知の事実なので、それの逆を突く。

・ユーザーのデータを集めにくくすることで、Web 2.0な某G社に打撃を与えることもできるでしょう。

考えすぎかなあ。

メモ: sort -> uniq in Python

2008-08-22 20:43:44 | プログラミング
Pythonでsortしてuniqueしたい。

今までは、
seq = sorted(list(set(seq)))
としてました。

が、2.5で動いていたスクリプトが、2.6でエラー(unhashableな故に)を出すことがあるのに気づきました。

ちょっと考えて、
seq = sorted(seq)
seq = [p for p, q in zip(seq, seq[1:] + [None]) if p != q]
というのをひねり出しました。

これなら、unhashableなオブジェクトでもオヶ!です。

注意。

seq = [None]のときは、下のやり方だとseq = []になります。
その辺は臨機応変に対処してください。
(長さ1の場合をはねるとか、Noneをseqに現れることのない値にするとか)


(2008/08/24 追記)
ちょこっとバグ見つけたのと、イテレータに対応してなかったこともあり、修正版を作りました。

import itertools
def iuniq(enu):
 ps, qs = itertools.tee(enu, 2)
 yield ps.next()
 for p, q in itertools.izip(ps, qs):
  if p != q:
   yield p

必要に応じてsort/sortedと組み合わせてください。

例えば、
print [i for i in iuniq(sorted([1, 3, 5, 3, 6, 8, 1]))]

ピュアじゃないPython。ctypesで高速化

2008-08-21 21:28:44 | プログラミング
PythonでC言語のsscanfみたいなことをやりたい。

簡単な文字列なので、split()で切り分けてint()で整数にする、とかしてました。

それが一番速いと思って。

が、違ったんです。

少なくとも、Windowsでは、ctypesを使ってC言語のランタイムのsscanfを呼び出すほうが速かった。

下のテスト用コードだと、ctypesを使ったほうが3.0秒台、split()とint()だと4.0秒台でした(何回か試して最速のもので)。

psycoをつけても、遅くなるけれど傾向は変わらず。

高速化できたといえばできたんですけれど・・・なぜか、すっきりと納得できない感じ・・・

---------------------------------------

import time

#import psyco
#psyco.profile()

import ctypes
msvcrt = ctypes.cdll.msvcrt

T = 1000 * 1000

i = ctypes.c_int()
j = ctypes.c_int()
k = ctypes.c_int()

t0 = time.time()

byref = ctypes.byref
sscanf = msvcrt.sscanf
for t in xrange(T):
  sscanf("10,20,30", "%d,%d,%d", byref(i), byref(j), byref(k))
  p, q, r = i.value, j.value, k.value

t1 = time.time()

for t in xrange(T):
  p, q, r = (int(v) for v in "10,20,30".split(","))

t2 = time.time()

print "t1-t0=", t1 - t0
print "t2-t1=", t2 - t1

Photosynthでパーソナルストリートビューとか

2008-08-21 19:50:46 | ガジェット
記事「MS、写真から3D画像を作成する「Photosynth」を一般ユーザー向けに提供」
http://japan.zdnet.com/news/internet/story/0,2000056185,20379055,00.htm
より。

ちょっと触ってみましたが、面白かった。

Photosynthって、立体構造を推定して再現してくれる写真のビューアー、なんですね。

たくさん写真があればあるほど、写真から写真へと、スムーズに「歩き回る」ことができるようです。

がんばって写真を撮りまくれば、自分専用のストリート(に限定しなくてもいいけど)ビューとか作れるかも。

(2008/08/23 追記)
記事「MicrosoftがPhotosynthのサーバエラーを祝う(人気に有頂天で)」
http://jp.techcrunch.com/archives/20080821microsoft-celebrates-photosynth-server-failure-surprised-people-like-it/
より。

「数百万のユーザが一挙に押し寄せたため、サーバはたちまちダウンした」んだそうです。

うーん。PCでローカルに実行できるPhotosynthとか無理かなあ。CUDAかLarrabeeが必須でメモリもたくさんいります、とかでもいいんだけどなあ。


ブラウザ戦争 2.0 ですか~

2008-08-20 01:15:34 | Birds-Of-Feather
いったいどうしちゃったんでしょうか。

記事「JavaScript 2.0はECMAScript 3.1ベースに、ECMAScript 4は譲歩」
http://journal.mycom.co.jp/news/2008/08/18/027/index.html
より。

「ECMAScript 4とECMAScript 3.1の両陣営は現状のように成果物が分離したままではどちらも成功できないという結論にいたり」、「ECMAScript Harmony」という新プロジェクトとしてまとまることにしたんだそうです。

ハーモニーなんて名前を付てしまうあたり、対立の激しさが伺えますね。

記事「XHTML 2とHTML 5はまだ別々の道を歩む」
http://www.infoq.com/jp/news/2008/08/xhtml2html5
より。

「XHTML 2とHTML 5は異なった名前空間(略)HTML 5はtext/HTMLとXMLの(略)ただHTML 5でのXMLシリアライズ化機能が「XHTML 5」とよばれ(略)XHTML 2標準はXHTML 1.xやHTML 4と相互互換性をもつものではない(略)HTML 5はある程度HTML 4との互換性が」・・・

読んでいるうちに眠たくなってしまった。ごちゃごちゃしていることだけはわかりました。

はっきりいって、みんな「俺は標準にコミットしてる」って言いたいだけなんじゃないでしょうか。

まあ、国際標準に即していることを納入の条件にする(国際標準を口実にして輸入障壁やら関税やらを作る)国が現れた時から、こういう事態がいつか起きることは決まっていたのかもしれませんけれども。

VC2008 SP1 正式版到来 その2

2008-08-18 15:00:44 | プログラミング
前のエントリのコメントで教えてもらった_MSC_FULL_VERを調べているうちに、
Visual C++ Team Blogのエントリを見つけました。
http://blogs.msdn.com/vcblog/archive/2008/08/11/tr1-fixes-in-vc9-sp1.aspx

これによると、どうも、hash_map, hash_setがSP1(正式版)で改善されたらしい。

早速ベンチマーク。コードは2008/06/26と同じものを使いました。

結果。

VC++2008+FP, set -> 19秒台/2.0~2.1秒台
VC++2008+FP, unordered_set -> 12~14秒台/1.2~1.3秒台
VC++2008 SP1, set -> 19秒台/2.0~2.1秒台
VC++2008 SP1, unordered_set -> 8~9秒台/1.6~1.7秒台

と、だいぶ改善されてました。SP1になって、g++ 4.2と比較してもほとんどそん色ないくらいになりました。

上述のブログをさらに読むと、地味なバグフィックスも多々。

個人的には、
・regexのパフォーマンス改善(多くの場合Boost 1.35.0のRegexのより速い)
・TR1で導入されたコンテナでO(1)のswapが使えるように修正
というのが目を引きました。

VC2008 SP1 正式版到来

2008-08-12 17:03:28 | プログラミング
出ました。ダウンロードしました。インストールしました。

unordred_set, unordered_mapもちゃんとあります。一安心。
ヴァリヴァリ使いますよう。

早速、

#if _MSC_VER >= ...
#include <unordered_set>
#else
#include <hash_set>
#end

とか書こうとして、_MSC_VERを調べてみると、あろうことか、

_MSC_VER は 1500 のまま!

MS開発陣のお茶目さ加減に俺涙目。

(2008/08/18 修正・追記)

・・・ではなくて、_MSC_FULL_VERを使えば良いみたいです。
(「。」さまにご教示いただきました。感謝)

で、修正版を以下に。

#if _MSC_FULL_VER >= 150030729
#include <unordered_set>
#else
#include <hash_set>
#end

ちょこっと書き足すこともあるので、次のエントリに続きます・・・