2011-06-29

そうめんと豆腐

この数日、そうめんと豆腐とネギで生きている。あまりにも暑くて食欲がわかないのだ。腹は減っているのに物が食べられない。

2011-06-28

multiple_lock_guardとか欲しいよね

複数のmutexに対するlock_guardが欲しいと思ったので書いてみた。動くかどうかテストしていない。

template < int I >
struct unlock
{
    template < typename T >
    void apply( T & t )
    {
        unlock< I - 1 >::apply( t ) ;
        std::get<I>(t)->unlock() ;
    }
} ;

template <>
struct unlock<0>
{
    template < typename T >
    void apply( T & t )
    {
        std::get<0>(t)->unlock() ;
    }    
} ;

template < typename ... Types >
class multiple_lock_guard
{
public :
    typedef std::tuple< Types *... > type ;
    
    multiple_lock_guard( Types & ... args )
        : m( &args... )
    {
        std::lock( args... ) ;
    }

    ~multiple_lock_guard()
    {
        unlock< sizeof...(Types) - 1 >::apply( m ) ;
    }

    multiple_lock_guard( multiple_lock_guard const & ) = delete ;
    multiple_lock_guard & operator = ( multiple_lock_guard const & ) = delete ;

private :
    type m ;
} ;

こういうふうに使う。

std::mutex m1, m2, m3 ;

int main()
{
    multiple_lock_guard< std::mutex, std::mutex, std::mutex >
        guard( m1, m2, m3 ) ;
} 

追記、コピーコンストラクタ―と代入演算子のdeleteを忘れていた。

2011-06-27

C++0xのマルチスレッドとデータ競合が非常に難しい

「バリアー!」
「デュクシ!」
「ちょっ、お前、オレ、バリアー張ってんだから攻撃するなよなー」
「うるせー、オレのはバリアー貫通できる攻撃だっつーの」
「貫通できないバリアー!」
「貫通できないバリアーを貫通できる攻撃!」
「絶対貫通できないバリアー!」
「絶対貫通できる攻撃!」
「そんな攻撃ねーよ」
「そんなバリアーこそねーよ」
「お前、矛盾って言葉、知ってるか?」
「ああ、昔の中国人はオレの矛を持ってなかったんだな」
「ちげーし。オレのバリアーを持ってなかったんだぜ」
「真似すんなよ」
「マネスンナヨー」
「あ、きったね」
「ア、キッタネ」
「飽きたね・・・」
「そうだね・・・」

フェンスといい、メモリバリアーともいう。名前はかっこいいが、やっていることは、あるスレッドにおけるあるメモリ場所に対する変更操作を、他のスレッドから見えるようにしたり、あるいは逆に、他のスレッドでの変更操作を、このスレッドから見えるようにすることである。

これは、多くのコンパイラーで、独自にサポートされている。基本的にWindowsでプログラミングを学んできた私としては、メモリバリアーという名称の方がしっくりくるのだが、C++の規格としては、フェンスという名称になっている。

C++0xの規格を眺めていたところ、どうもC++0x規格には、非アトミック操作に対するフェンスというものが、存在しないようである。

しかし、mutexはどうなるのだろう。例えば、以下のコードが、意図通りに動くことが、規格でどのように保証されているのだろうか。

std::mutex m ;
int x ; 

void thread()
{
    std::lock_guard<std::mutex> guard(m) ;
    ++x ; // 非アトミック操作
}

int main()
{
    x = 0 ; // 初期値0

    std::thread A( thread ) ;
    std::thread B( thread ) ;

    A.join() ; B.join() ;

    std::cout << x << std::endl ; // 2であるべき
}

色々と考えたあげく、以下のように考えた。

AとBのインクリメントは、1.10 [intro.multithread] p4に書かれているように、conflictする。
AとBで行われる非アトミック操作であるインクリメントは、mutexで囲まれており、同時には起こらないし、どちらかが先に起こることは確実である。とすれば、1.10 [intro.multithread] p13に書かれている通り、先に起こった方の操作は、後続の操作に対して、visible side effectである。
AとBのインクリメントはconflictするものの、どちらかが先に起こることが保証できるため、1.10 [intro.multithread] p21のdata raceの条件には引っかからない。

LISTER: Hey, it hasn't happened, has it? It has "will have going to have happened" happened, but it hasn't actually "happened" happened yet, actually.
RIMMER: Poppycock! It will be happened; it shall be going to be happening; it will be was an event that could will have been taken place in the future. Simple as that. Your bucket's been kicked, baby.

YouTube - Red Dwarf I - Future Echoes - Part 3 of 3

2011-06-26

復活

体調が戻ってきた。まだ少々下痢気味だが、とりあえず起きていても体が極端に疲れたりはしない。

2011-06-23

風邪をひいたらしい

どうも体が疲れる。熱がある気がする。恐らく、明日あたり、本格的に体調を崩してしまうはずだ。

どうも昔から、季節の変わり目には、風邪をひきやすい。いつもきまって、何の予兆もなく、いきなり疲労感を感じ、数時間後に熱。仕方が無いのでそのまま寝るも、翌朝、さらに体調が悪くなっているのだ。

明日はさぞ、薄いおかゆが美味しく感じられることだろう。思うに、一番うまい食べ物は、風邪を引いた時に食べる薄い粥であると思う。

2011-06-21

LinuxのARMサポートがカオス

Linux ARM support: A hot mess, an ugly clean-up | ITworld

LinuxのARMコードは、各メーカーが、手っ取り早く安く上げるために、やっつけ仕事で場当たり的に対応させるため、悲惨なことになっているとのこと。Linusが最近、ようやく様子をみて、「こんな調子だったら、もうこれ以上pullしねーよ」と突っぱねた。

まるで日本の携帯業界のようだ。

偽音5つ

Humans Invent | Innovation, Craftsmanship & Design

車のドアを閉めた時に発生するバタンとかガチャンという音、電気自動車の走行音、スタジアムの歓声、Skypeのボイスチャットで、無音時のかすかなノイズ、ATMがお札を出すときの音。これらは皆、偽音である。

ユーザーが車のドアを閉めた時、期待するような音がならないと、本当に閉まったのかどうか疑念が生ずる。そのため、車メーカー各社は、ドアがありそうな音を発するように、精密な設計をしている。ドアが閉まった時の音を鳴らす機構の特許も多数あるそうだ。

電気自動車は静かすぎるので逆に危険であるという観点から、それらしい走行音を発するよう義務付ける法整備が進められている。

スタジアムの歓声というのは、もちろん実際の歓声も含まれているが、実はスピーカーから流しているらしい。スピーカーから流すことによって、実際の見物客にも、歓声を出しやすくしているのだとか。

スカイプなどのボイスチャットでは、ノイズリダクションの技術を活用しているが、この技術は優れすぎていて、何も喋らない時は、完全に無音になってしまう。すると、ユーザーは、実は切断してしまったのではないかと疑念を抱く。そこで、まだつながっていることを示すために、かすかなノイズを流している。

最後は色々と議論があるようだが、ATMがお札を出すときの音は、実は偽物であるらしい。技術的に、ATMは紙幣を一瞬で出すことができるが、あたかも中でお札を動かしているような偽音をだすことによって、ユーザーをして、ATMがちゃんと仕事をしているのだという錯覚を生ぜしめるのだとか。

ナナオが4Kディスプレイを発売するそうだ

DuraVision FDH3601 | EIZO 株式会社ナナオ

大きさは36.4型で、解像度は4096x2160。画素サイズから計算すると、PPIは127、dpcmなら50ぐらいだと思われる。ちなみに肝心のお値段は288万円。とてもではないが手が出せる値段ではない。

ナナオはあの悪名高いS2411Wの定点ドット欠けを仕様だと言いはった企業だから、もう全く信用していないが、4Kパネルの製品が出てきたのは興味深い。しかし、4kとなると、120PPI程度ではもうディスプレイが巨大すぎて、一般用途にはつらい。

生きているうちに、24インチで600PPI程度のディスプレイが安く手に入るようになるといいのだが。

C++0x仕様のfriend

C++0xでは、friendに細かい変更があった。gcc 4.7では、このC++0x仕様のfriendに対応したらしい。早速確かめてみたところ、仕様通りだった。

typename-specifierが使えるようになったり、名前探索のチェックの省略のルールが変わったりしている。

詳しくは、n1791を参照。

2011-06-19

最近の漫画

久々に、いくつかの漫画を読んでみたので、その感想を書く。

「角刈りすずめ」の連載が終わってしまったようだ。角刈りすずめとは、近代麻雀で連載されていた漫画である。毎回毎回、麻雀に死地を求める孤独な角刈り男が、期せずしてエクストリームな麻雀に出くわしてしまうギャグマンガである。

しかし、麻雀漫画がこれほど多いのは解せない。「ムダヅモ無き改革」だとか、「咲-Saki-」だとか、はては、「ひぐらしのなく頃に」から派生した、「ひぐらしの哭く頃に 雀」まである。麻雀を題材にしたギャグマンガはいくつかあれど、麻雀漫画のほとんどは、かなり真面目に麻雀を打っている作品である。登場人物が全員、テレパシーを疑うほどの通しと待ち読み能力を持っているということを除けば、至って普通のシリアスな話である。

麻雀専門の漫画雑誌があり、単行本も出版されている以上、麻雀漫画には一定の需要があるのだろう。

麻雀を考えるに、技能と運とイカサマとハッタリがモノを言うゲームである。登場人物が試行錯誤する心理描写を延々と続けていても構わないし、ド素人が名人に天和で勝ちましたという話も、ありうる話である。とすれば、お話の題材としては、悪くないのかもしれない。

しかし、最近の若者は、麻雀のルールなど知らない。実際、私も麻雀のルールは覚えられなかった。

さて、麻雀以外の漫画では、魔法陣グルグルを読んだ。この漫画は、理不尽なRPGをネタにした漫画である。連載当時はバラバラに読んでいて、通して読んだことはなかった。それも、終わりの方は全く読んでいなかった。果たして、今読んでも楽しめるものだろうかと疑問だったが、これがどうして、実に面白い。

グルグルは、キタキタおやじとかギップルを登場させたのが優れていると思う。これによって、話がシリアスにならないし、またクサくもならない。

ついでに、ドラクエ4コママンガ劇場が懐かしくなり、ブックオフで探してみたが、一冊もなかった。残念。あの伝説の、「ふんどし お前が一番混乱しとるわ」を読みたかったのに。

2011-06-17

古本屋の未来

C++の参考書を延々と執筆していて、ここのところ、古本屋巡回もしていなかった。ふと、一年ぶりに古本屋でもめぐろうと思い立ったので、今日は久しぶりに古本屋に行ってみた。

が、またひとつ、古本屋が潰れていた。早いもので、京都に来てからもう7年になるが、知っている古本屋が、すでに二軒も潰れている。もう、ブックオフ以外の古本屋に未来はないのだろうか。

それはともかく、8月11日から、下鴨納涼古本まつりがある。古事談や古今著聞集などが安く売っていたら購入を考えよう。

CPUの未来

ここ数カ月のBulldozer関連のニュースを読んでいて、やはり将来的に、CPUとGPUは、物理的にひとつのチップ上に実装されるのが当然になるのだろうと考えた。PC用のビデオカードというものは、今のサウンドカード程度の位置にまで落ちるだろう。つまり、確かに、組み込みのものと比べて高品質な部分もあるが、大多数のユーザーは、違いを気にしないのだ。

また、私はかつてから、GPUの使うメモリーは、CPUの使うメモリーと統一されるべきであると考えていた。そこまでいかなくても、GPU側から通常のメモリーにアクセスでき、また、仮想メモリという形で双方から同様にアクセスできるのであれば、それで十分なのかもしれない。

いずれにしても、C++の未来は明るい。

【後藤弘茂のWeekly海外ニュース】 AMDが革新的な次世代GPUアーキテクチャの概要を発表
【後藤弘茂のWeekly海外ニュース】 GPUをCPUのように扱えるFusion System ArchitectureをAMDが発表
Introducing C++ Accelerated Massive Parallelism (C++ AMP) - Visual C++ Team Blog - Site Home - MSDN Blogs

2011-06-10

John Carmack、E3で語る

E3 2011: John Carmack talks Wii U, PlayStation Vita, and next-gen Rage - News

  • Rageは正直いって開発期間が長すぎた。
  • 一年前に発売日を発表したのは、納期を明確にして追い込むため。
  • コンソールは十分にパワフルなので、特に制限を感じなかった。
  • むしろPCは、コンソールよりはるかにスペックが高いにもかかわらず、60FPSを保証するのが難しかった。色々とオーバーヘッドが高い。IntelやnVidiaに相談したけど、フラストレーションたまるわ
  • Wii Uは、ハード性能が他のプラットフォームに追いついてきたので、まあ、よさそうだね。
  • Vitaはダメだろ。現時点ではスペック高いかもしれんが、発売される頃には、ひょっとしたらスマートフォンとかタブレットとかにスペックが抜かれてるかもしれんし、発売後一年や二年もたてば、やはり見劣りしてしまう。よほど移植を簡単にできるようにしないと、成功しないだろうね。

The Old New Thing: PEリソースは4バイトアラインにせよ。まあ、守らない奴もいるけど

PE resources must be 4-byte aligned, but that doesn't stop people from trying other alignments - The Old New Thing - Site Home - MSDN Blogs

PEヘッダー内のリソースは4の倍数のオフセットに格納されていなければならない。これは、アライメントに厳しい環境のためである。

まあ、どうせ守らない奴は守らないのだがね。第一、気を付けていれば、一応は動くしね。つまり、まあそりゃ、誰かx86じゃないWindows使ってる奴がリソース読み込んだら、クラッシュするだろうよ。でも、x86じゃないWindowsなんて誰が使ってんのさ? だろ?

Windows Vista SP1では、セキュリティ上の理由のため、リソースをパースするコードに、いくつかのチェックが加えられた。ここで重要なのは、リソースにアクセスする前に、正しくアラインされているかどうかを確かめるようになったのだ。これにより、アラインの正しくないリソースを読み込んだ場合のクラッシュを防げるようになった。プログラムが任意のバージョン情報のリソースを読み込むというのは、よくあることだ。例えば、エクスプローラーはファイルプロパティを見るときや、バージョン情報のコラムを有効にした時に、バージョン情報を読み込む。したがって、正しいリソースのアライメントを保証することは、リモートDoSアタックを防ぐことになるのだ。

そしたら、バグリポートがやってきた。「プログラムXYZがインストールできなくなった」。何故ならば、そのプログラムは自分自身のバージョン情報のリソースを読み込もうとして、失敗しているからだ。その理由は、プログラムをビルドするのに使ったツールが、4の倍数ではないオフセットにリソースを配置しているからである。「おいおい、マジかよ。よしてくれよ。そんな事すりゃ、3バイト無駄になっちまうだろうがよ。以前は、リソースアライメントしなくても動いたじゃん。だからそのまま出荷したんだよ」

別の例としては、あるゲームの追加パックがインストールできなくなった。何故ならば、ゲームのバージョン情報リソースを読み込むコードが動かなくなったからだ。

いくつかのプログラムが、「アプリ名は有効なWin32アプリケーションではありません」というエラーメッセージを表示して、実行をやめるようになった。これは、初期化の途中で、自分自身のバージョン情報リソースを読み込もうとして、ERROR_BAD_EXE_FORMATで失敗しているからだ。このエラーに対応するエラーメッセージをユーザーに表示しているのである。

修正としては、アライメントのチェックを以前と同じように緩くした。厳しいチェックは、アライメント要求が厳しいアーキテクチャのみで行うようにしたのだ。これは、あるマシンではリソースが読み込めるが、他のマシンでは読み込めないというプログラムの存在を許してしまう。しかし、アライメントが正しくないデータでも問題なく読み込めるという前提で書かれたプログラムをぶち壊すよりマシだ。

2011-06-09

珍走団と遭遇

先日、絶滅危惧種の珍走団と遭遇したので、そのことでも書こうと思う。

あの日、私は予備自衛官の射撃訓練を終えて、射場から駐屯地へ帰る途中であった。我々は、迷彩服を着用し、あの数ある自衛隊車両のうちでも有名な、三トン半のトラックの荷台の簡易なベンチに座って、ガタガタと揺られながら、道路を走っていた。

その時突然、特徴的な騒音が聞こえてきた。荷台の後ろから外を見やると、5,6台ぐらいのバイクの集団がいた。そのバイクは非常に特徴的で、エアロダイナミクスのよく効きそうな外装、無駄にでかい背もたれのようなもの、非常に変わった形のくねくねと曲がったマフラーなどを装着していた。

人も変わっていて、サングラスやマスクなどを着用していた。しかし、どう見ても年齢が若くない。中には、少なくとも四十代ではないかと思われるような人物もいた。皆、小刻みに右手を動かし、一定のリズムで騒音を発生させるという、非常に燃費によろしくない運転をしていた。

もうこんな人間は絶滅したかと思っていた。彼らは40年前からタイムスリップしてきたのだろうか。

我々は言葉を失いつつ珍走団を眺めた。珍走団の方も、我々を凝視しながら、トラックの両脇をすり抜けていった。確かに、我々は迷彩服を着用して、自衛隊車両の荷台に乗っているのだ。まあ、人目をひく姿ではある。

珍走団が過ぎ去った後で、ある曰く、「アイツら、ワシらのこと珍しそうにガン見しとったけどな。ハッキリいって、お前らの方がよっぽど珍しいやろ」

真理である。

なお、一部ノーヘルがいたものの、信号はちゃんと守っているようであった。

2011-06-07

帰還

予備自の訓練から帰還した。

今回は、初めてⅠ型のレーションを食べた。缶に入っているものだ。感想としては、あまり食べたくない代物である。聞けば、東北に派遣されている自衛官も、当初は自衛官まで普通の食事が回らず、この缶飯ばかり食べていたらしい。ただ、数カ月そのままの体制を続けていたら、口内炎になったので、急遽、自衛官の分まで食事が回る体制を整えたらしい。我が国の、兵站をおろそかにするところは、いつまでたっても変わらないのだな。

聞説、自衛隊の災害派遣が報道されたことにより、この缶飯の知名度が上がっているそうだ。ただ、缶の見た目はともかく、中身はあまりよろしくない。

ちなみに、Ⅱ型の方は、まだ多少はおいしい。食べたければ、業務用スーパーで、もち米を使った味付け飯のレトルト品でも探すといいだろう。中身は同じだ。ただパッケージがOD色になっているだけである。

もちろん、普通に炊いた飯のほうが美味いのは、言うまでもない。

2011-06-03

留守

5日間留守にします。

2011-06-02

Bulldozerの情報

【後藤弘茂のWeekly海外ニュース】 AMDがBulldozerベースの次期メインストリームCPU「Trinity」を公開

Trinityでは、Bulldozerのモジュールを2個、4CPUコアに相当するコアを搭載していると見られる。それにRadeon HD 6970(Cayman)世代のGPUコアを統合したものがTrinityだと推定される。

本当に2012年にリリースされるTrinityの内蔵GPUは、Radeon HD 6970相当のパフォーマンスを持つのだろうか。そうなったら、もうGPUはvideophile(画質ヲタ)とでもなづくべき一部のヲタしか使わないマニア向けの商品に成り下がるだろう。そのような世界では、画質を上げると称して、様々な怪しげな商品が蔓延することだろう。例えば、画質を上げるDisplayPortケーブルだとか。

まあ、それは冗談にしても、GPU統合APUとビデオカードとの違いが、アンチエイリアスやテクスチャーフィルタリングの質程度のものであれば、PC用のビデオカードというものは斜陽になっていくだろう。