昔の最近の出来事(2008.06)

2008/06/30

早くも無く遅くも無く。

風邪悪化で絶不調。帰って即死。

2008/06/29

昼ごろ起床。

鼻の奥が痛かったり。風邪をひいたかも。

PCでCPU負荷の高いプログラムを実行するとファンの回転が速くなるのですが、 それ以外になにやらカタカタ音がするので、蓋を開けて点検してみたり。 以前、開けた時はCPUのフィンを止めるネジが一本緩んでいたのですが、 今回はそういう緩みは特に無し。ファンにホコリが引っかかっていた のでそれを掃除機で吸っただけで元に戻したのですが、とりあえずカタカタ音は 収まってみたり。ホコリのせいでファンの回転になにやらムラができていたの かしら?

2008/06/28

昼過ぎ起床。

掃除したりTV観たり。

なんとなく「四季庭」を 買ってみたり。まいいつの「お庭」だけを切り出したようなソフトです。 ちょろっと触った感じでは、けっこうアラが見えるという気がします。


グラフィック的にはもう少し良い感じのものを期待していたのですが まぁこんなものなのかも。 SF世界が舞台だと今のグラフィック性能でも十分という気がしなくもありませんが自然物の表現 にはまだまだ足りないかな?という気も。目が肥えてきたのもあるかも知れません。 個人的にPS3はセルフシャドーのリアルタイムレンダリング品質がなんだかイマイチなので、 リアルタイムではない写真撮影モードの時だけ、レンダリング品質を上げる事ってできないのかなぁ? などと思いました。 まぁ、オンライン販売のソフトなので、アップデートによる機能追加なんかには、 これから期待するところかも。

四季庭

ところで、撮った写真はXMBのPhotoメニューの中に入るのですが、分類が自由にできない のが不便だなぁと思ったり。一階層でも良いので、ディレクトリを作る事ができる (ゲーム毎に分けるとか)だけで大分勝手が違うのになぁと思ったり。

6/29付けのトロステでやってた記号の話。 イゲタ「#」とシャープ「♯」は違うものだというのを初めて知ったり。 昔々、お仕事で いわゆるアスキー文字の「#」をイゲタ(井桁、井戸の口の事というのを知りました)と 読んでいる人が居たので、「ふーん、そういう読み方もあるんだぁ」とそれ以来 何も疑問に思わずに受け入れていました。で、今 Meadowで書いている本日記HTMLも、 MSゴシックで見るとフォントがそもそも違っているというのを初めて知りました。 全角英数で「#」を入れると、シャープよりもイゲタの方が先に出てきます。 「#」の方は、ナンバーを示す場合もあり、実際に「#9」は「番号9」と 解釈されるようなので、PCで入れる文字は「イゲタ」の方が読みとしては正しいのか?! などと思ったり。 あと、いわゆるアスタリスク「*」と、携帯電話の左下の記号(×に−を重ねたもの)は別物 だというのも知ったり。コメ印は「※」なのでアスタリスクが正しいのでは?という クロの発言に対し、それも違って「スター」と読むのが正しいらしい。
電話のキーについては、ITU(国際電気通信連合)で定められている記号という事らしいのですが、 読み方については特に定められなかったようです。で、Webを少し検索してみたら、 ITUのWebページに読み方に対する答えが書いてあるページがありました (参考)。
いやぁ、年を取っても知らなかった 事ってのはありますなぁ。「コメイチゴ」が何のことやら判らなかったのは 何年前の事やら。

2008/06/27

早くも無く遅くも無く。

PS3ディスク内のムービーファイルを整理したり、Web巡回して終了。

2008/06/26

遅めに帰着。

Web巡回して終了。

アメトークの家電芸人の続き。今となっては当たり前の機能になって るけど当時は画期的だった機能の話が面白かったり。 今やTVなんかのリモコンは付いてて当たり前(てかリモコン無しでは操作ができない場合も) ですが、TVの前まで行かないとチャンネルを変えられないという時代が 確かにあった訳で。

2008/06/25

早めに帰着。

TV観てたらいつの間にか寝てたり。

2008/06/24

遅めに帰着。

ちょろりコーディング。イマイチ式が上手く導出できず。

2008/06/23

遅めに帰着。

結局、先日のFoldingシミュレーションは、本当にハングして(操作不能状態に陥って)終了。

何気に気づいたこと。いわゆるハイビジョン解像度は 1280x720画素になる訳ですが、 いわゆるフルハイビジョン解像度 1920x1080画素 との画素比で見ると、 2.25倍 フルハイビジョンの方が画素数が多いのだなぁと思ったり。 1080でフレームレートが出ない場合でも、720にすれば大丈夫ってな感じになるのかしら?

2008/06/22

昼前起床。

TV観たり Web巡回したりと、ぐうたら過ごして一日終了。

Folding@Homeの実行で、何故かモデル表示が止まった状態になる場合が あったり。一度目はFoldingを実行しながらBlu-rayディスクの取り出しを 行った為、実はそれが悪さしているのかなぁ?などと勝手な想像をしていました (実際にディスクを取り出す瞬間に表示が変になる現場を見た訳ではありません)。 で、立ち上げたり落としたりしていると、別の問題を持って来て復帰していた(その後、5時間くらいの問題を2〜3問 実行してました)のですが、また表示が止まってました。 何気にファンの音が突然下がったので(^^; 画面を見てみたら、丁度 表示停止した直後 くらいで、しかも新しい問題を持ってきたばかりだったので、もしかすると 問題の方に原因があるのかもと思ったり。問題の名称は「p4012_supervillin_Still_novisc」。 右下に表示されるグラフが最大値に はり付いた状態になっている為、 何やら妙な事になっているのかも。 で、一度終了して再起動したら、背景には何も表示されてない状態に。その時の写真。

Folding 表示バグ?

背景が真っ暗なので、オートフォーカスがなかなか思い通りに合わなかったのは秘密。

「p4012_supervillin_Still_novisc」で検索してみると、一件だけ英語ページに 同様の現象を報告すると思われるものを見つけたり(自動翻訳結果の雰囲気だけでしか 見ていませんが)。何かしら再現性があるものなのかも。

2008/06/21

昼前起床。

何気にFolding@Homeのページを見ていたら、2PFLOPSを越えていたり。 よく見てみると、PS3は増えていなくて、GPUが妙に増えていたり。

    Client statistics by OS

    OS Type               Current TFLOPS*      Active CPUs     Total CPUs
    Windows               195                  205119          2059338
    Mac OS X/PowerPC      7                    8495            116611
    Mac OS X/Intel        26                   8284            51880
    Linux                 71                   42019           311036
    GPU                   569                  5177            12343
    PLAYSTATION(R)3       1440                 51075           542908
    Total                 2308                 320169          3094116

    Total number of non-Anonymous donators = 1011701
    Last updated at Fri, 20 Jun 2008 13:47:15
    DB date 2008-06-20 14:31:59

以前と比べると、GPUはTFLOPSで4.3倍、 ActiveCPUsで見ると、2.7倍になっているようです。ATIの新しいGPUを使う シミュレーションコアがリリースされたのも何かしら関係しているのかも 知れません。

ピクサーのアニメである「カーズ」のBlu-rayのオーディオコメンタリーには、 監督と製作スタッフの二種類あったりするのですが、製作スタッフのコメンタリー を観て(聴いて?)なかったのを思い出したので観たり。デコボコの道を走るのを 表現するのにシミュレーターを開発していたり、映りこみがうるさくなりすぎない 様に調節されていたりと、色々判ったり。また、背景のモデルについても、 実は細かいところで色々と車をモチーフとした要素が埋め込まれている事が 判ったりと、なかなか面白かったです。

ちょろりコーディング。

2008/06/20

早めに帰着。

鉄拳。ポイントで見てプラスマイナス0。勝敗で言うと負けの方が多いのですが。

ちょろりコーディング。

2008/06/19

早くも無く遅くも無く。

アメトークの家電芸人が面白かったり。

鉄拳。びっくりするほど勝てず、六段に降格orz げふっ

2008/06/18

早めに帰着。

鉄拳。なんとか七段に返り咲き。

眠くなっていつのまにか寝てたり。

2008/06/17

早くも無く遅くも無く。

鉄拳。ムキになってやったり(^^; やっと七段に届くところまで。

Wings3Dの新しいのを入れてみたり。

Perfumeのダンスの凄さがイマイチよく判らない今日この頃。

2008/06/16

早くも無く遅くも無く。

鉄拳。負けの方が多かったような。

2008/06/15

昼過ぎ起床。

今更過ぎて自分でも腰が抜ける思いなのですが、Win32APIのコモンコントロールで TRACKBARという、いわゆるスライダーが存在する事を知ったり。 てっきりスライダー的なものは無いのかと今まで思っていたのですが、 そんな訳無いですね(^^; で、実際に表示させてみると確かにスライダーなのですが、 例えばデスクトップメニューの、「プロパティ→設定」の画面解像度の 設定にあるようなツマミの端に色のついたスライダーではなく、 何やら古臭い感じのが出てきたり。ちょっと探せば変え方が判るだろうと 思ってWebを検索してみたのですが、何故かその方法が見つからず。 てか、「TRACKBAR_CLASS」でググると何故か30件しか出てこなくて、 なんで?と思ったり。

2008/06/14

昼過ぎ起床。

何気に実行しているFolding@Homeのシミュレーション完了数が1000になってました。 900を越えていたのが約二週間前なので、 3〜4時間で完了する簡単な問題を数をこなした感じかも。

先日のOutOfMemoryの件。小さいコードを書いて動きを確かめてみたり。

$ cat -n gc_test.d
     1  import std.stdio ;
     2  
     3  class ImageBuf{
     4    char[]     img ;
     5    static int id  ;
     6    int        thisId ;
     7  
     8    this(){
     9      thisId=id ;
    10      id++ ;
    11      printf("I am id=%d\n",thisId) ;
    12    }
    13  
    14    ~this(){
    15      printf("Destruct id=%d\n",thisId) ;
    16    }
    17    
    18    int allocBuffer(int size){
    19      img.length = size ;
    20      return(0) ;
    21    }
    22  }
    23  
    24  int main()
    25  {
    26    ImageBuf imgb1 ;
    27    
    28    printf("alloc 300MB start\n") ;
    29    imgb1 = new ImageBuf() ;
    30    imgb1.allocBuffer(300*1024*1024) ;
    31    printf("alloc 300MB end\n") ;
    32  
    33    printf("alloc 300MB start\n") ;
    34    imgb1 = new ImageBuf() ;
    35    imgb1.allocBuffer(300*1024*1024) ;
    36    printf("alloc 300MB end\n") ;
    37  
    38    printf("alloc 300MB start\n") ;
    39    imgb1 = new ImageBuf() ;
    40    imgb1.allocBuffer(300*1024*1024) ;
    41    printf("alloc 300MB end\n") ;
    42  
    43    for(int i=0 ; i<100000 ; i++ ){
    44      printf("alloc 10MB (%d) start\n",i) ;
    45      imgb1 = new ImageBuf() ;
    46      imgb1.allocBuffer(10*1024*1024) ;
    47      printf("alloc 10MB (%d) end\n",i) ;
    48    } ;
    49  
    50    return(0) ;
    51  }

取りあえず実行すると次のような感じに。右側に追跡コメントを追加してみました。

$ ./a.exe 
alloc 300MB start          #
I am id=0                  # ----+
alloc 300MB end            #     |
alloc 300MB start          #     |
I am id=1                  # ----|--+
Destruct id=0              # <---+  |  (1)ここで300MB空いて、300MB使った のでは?
alloc 300MB end            #        |
alloc 300MB start          #        |
I am id=2                  #        |
Destruct id=1              # <------+  (2)ここで300MB空いて、300MB使った のでは?
Error: Out of memory

繰り返すと結局合計で 300MBしか使っていないのでは?という気がしなくもありませんが、 実際にはそうなってないようです。なんとなく、連続領域を確保する点に問題があるの かも知れません。

   (1)         (2)         (3)         (4)
┌───┐  ┌───┐  ┌───┐  ┌───┐
│300MB │→│空き  │→│空き  │→│空き  │
│      │  │      │  ├───┤  ├───┤
└───┘  └───┘  └───┘  ├───┤
                                    │300MB │
                                    │      │
                                    └───┘

例えば、(1)300MB割り当たった状態から、(2)丸々空きを作ったが、(3)空き領域の末尾から何やら違う事で 少し使ってしまい、(4)連続領域を新たな場所に作る必要が出てきた。これを繰り返すと 巨大な穴だらけになってそのうちOOMになるという感じ。 alloc領域をGC内で自力プールするとこういう事になってしまうので、 ハードウェアMMUの力を借りて (3)のような空き領域をmunmap() などでどうにか プールから追い出すようにしなくてはダメなのかも。

で、コードの40行目辺りでOOMになってしまった訳ですが、我が家のPCでは、 40行目を200MBくらいにすると43行目以降も実行されます。 このループについては特に問題無くメモリの再利用はされているようです。

std.gc.fullCollect()でプロセスサイズが縮まないのは、GCが再割り当て用に 不要となった領域をヒープにプールしている為だと推測されます。 これについては、適当なところでプールから追い出してOSにメモリを返せば良い のですが、現在のGCはそのようにはなってなさげ。まぁ、そうなっていれば、 今回のようなコードでもOOMになる訳が無いのですが(^^; OSへのメモリ返却を明示的に実行する(と思われる)手段として、std.gc.minimize()てのが用意 されているようなのですが、現時点では未インプリのようです。

以上の動きは実際にPhobosの中を追いかけた話ではなく、あくまで想像です。

対策としては、巨大メモリ領域を割り当てるような方法は使わずに、 小さなメモリブロックに分割するような方法を使うと言った感じかも。

2008/06/13

早くも無く遅くも無く。

ちょろりコーディング。8192×8192×4byteの画像を何度も読み込んでいると Out Of Memory でずっこけたり。あるクラスの中で使用する一時バッファを 動的配列で割り当てていたのですが、そいつがいつまで経ってもガベージコレクトされずに居座って いるように見えたり。居座るだけならまだしも、再利用されてない為に OutOfMemoryになっている訳で、つまるところメモリリークしているという 状況です。一応デストラクタは機能しているようなので、 インスタンス自体を開放する意思は見られるのですが、実際に開放されているようには見えず、 タスクマネージャーで見てるともりもりとメモリを食っていました。 そこで、std.c.stdlib.malloc()とどのつまり Cの標準関数のmalloc()を使って割り当て/デストラクタでfree()する という感じにしてみた所、リークは治まり、巨大画像に続いて小さい画像を 読み込むと、プロセスサイズも縮んでいました。 何やらGCのメモリ割り当てがバグっているのかしら?

そういや、free()でプロセスサイズが縮んでいたのですが、大昔のOSだと malloc()などで 一度拡大したヒープ領域はfree()を実行しても縮まなかったと思います。 最近のmalloc()は システムコールにbrk()やsbrk()を使わずに、mmap()(Windowsの場合はVirtualAlloc()) を使っているようなので、うまく管理すれば munmap()(Windowsの場合はVirtualFree()) を使ってプロセスを縮められるという感じのようです。

2008/06/12

気持ち遅めに帰着。

ちょろりコーディング。スクロールバーの挙動にハマってみたり。 SCROLLINFO構造体のfMaskメンバーにSIF_DISABLENOSCROLLを入れないと、 スクロールバーが不要になると自動的に表示されなくなります。この時、丁度 水平スクロールバーが消えるか消えないかの境界の所でウインドサイズを 変えると、水平スクロールバーの存在する状態での ウインドサイズで 垂直スクロールバーの範囲が取られる事があったり。 原因は次のような感じ。例えは、WM_SIZEメッセージ受信でウインドサイズ に合わせて SCROLLINFO.nPage の値を更新する事でウインドサイズ変更に スクロールバーの範囲が追従します。この時、実際にスクロールバーが 不要になるかどうかは、SetScrollInfo()でスクロールバーの情報を セットした後でないと判りません。この為、WM_SIZE メッセージ受信時のLPARAMに入っているウインドサイズだけを使って スクロールバーの範囲を決定するのはまずくて、水平(もしくは垂直) スクロールバーの状態をSetScrollInfo()実行で変更した後に、 GetClientRect()でクライアント表示サイズを調べて、それに合わせて 垂直(もしくは水平)スクロールバーの情報を再度セットする必要があると いう感じでした。セットしてみない事にはクライアント表示サイズが 変わるかどうかわかりませんので、結局どうしたかと言うと、水平/垂直の 両方について一度 WM_SIZEのLPARAMのサイズでSetScrollInfo()を 実行し、スクロールバーの表示有無が決定した後のクライアント表示サイズをGetClientRect()で得た後に、 再度、水平/垂直の両方についてSetScrollInfo()を実行するという感じに してみました。うーん、でもこんな変な事やってる例はWebを検索してみても 見当たらないなぁ?何か間違っている気も。

2008/06/11

早めに帰着。

ちょろりコーディング。レバーコントロールに普通のウインドをはめ込める ようにしていたつもりが、コード整理したときに間違えてて はめ込めなくなっていたのに 気づいたり。

2008/06/10

気持ち遅めに帰着。

ちょろりコーディング。

2008/06/09

早くも無く遅くも無く。

WBSでやってたSHM-CD(Super High Material CD)。なんで音質が上がるのか イマイチ納得がいかない気がしたり。で、CDのWikiを調べてみたところ、 どうやら誤り訂正は行っているが、1bitくらいなら誤ってても良いような 方法を使用しているらしいという事を知ったり。それならば確かに違いは 出てくると思われますが、聴いて判るくらい音質が変わるのかなぁ?と いう気も。て事はですよ、CDをWaveファイル形式などのRAWイメージで 取り込んだら、毎回ちょっとずつ違った値になってたりするのかしら?
という訳で二度取り込みをしてdiffってみたのですが差は無し。 何か間違ってる?

2008/06/08

昼ごろ起床。

夕方頃から秋葉で発生した無差別殺人事件のニュースばかりに。

本日なぜか別局で二度見た「脳指紋」の話。指の話では無いけど指紋と言う点は さておき、脳内の記憶検索結果が一致検出した時、ある特定の脳波が出るのを利用して、 高精度な嘘発見器にも使えるという話。ところで、マンガなんかで 何かに気づいたりすると、電球が点くって表現がありますが、電球に例えるのは ともかく、何かしら出ているというのは本能的に気づいていたのかなぁ? などと思ったりして。

2008/06/07

昼ごろ起床。暑くて死亡。

鉄拳。負けすぎて五段に降格orz。

SAIのムックが出てるのを知って買ってみたり。導入部などの基本的なところが おさえられてて、結構詳しく書かれているなぁと思いました。 レイヤーの概念など、かなり基礎的なところから書かれているように思います ので、「聞く前にググれ」と一蹴されるような類の疑問に対する回答はほぼ 網羅されているのではないかなと感じました。GIMPなどの併用ソフトについても 紹介があったのですが、Inkscapeが出てくるのは著者の趣味による所が大きい ような気も(^^;

そういや、「デジ絵」って単語は結構浸透してるのかしら?TANEが一番最初に この言い方を見たのは「デジ絵の文法」なのですが、その後しばらくしてから 中川翔子がTVで使ってるのを見たなぁという感じ。今や「CG」って言うと 2Dや3Dといった分類以上に、色々な場合を指す単語になっていると思います。 「デジ絵」はなんとなく俗っぽい感じがするのを別にすれば、 「コンピューターを使って人の手で絵を描く/描かれた絵」という部分に限定されている ように思えます。なので、話の中で対象を限定するのには割と便利な単語かもと 思ったり。

「ONE PIECE(50)」。随分前に振ったネタが色々出てきてて、また最初から 読み直したくなってみたり。人魚の娘って、表紙でやってるサイドストーリーで 出ていたような気が?

2008/06/06

早くも無く遅くも無く。

Web巡回していたら眠くて死亡。

2008/06/05

早くも無く遅くも無く。

例外がキャッチできない原因判明。パッチは以下の通り。

*** libphobos/gcc/deh.d.org     Thu Oct 18 02:31:54 2007
--- libphobos/gcc/deh.d Thu Jun  5 22:53:38 2008
***************
*** 324,330 ****
  
                // Can never have null landing pad for sjlj -- that would have
                // been indicated by a -1 call site index.
!               landing_pad = cs_lp + 1;
                if (cs_action)
                    action_record = info.action_table + cs_action - 1;
                goto found_something;
--- 324,331 ----
  
                // Can never have null landing pad for sjlj -- that would have
                // been indicated by a -1 call site index.
!               phase1.landingPad = cs_lp + 1;
                if (cs_action)
                    action_record = info.action_table + cs_action - 1;
                goto found_something;

オリジナルのソースでビルドすると、「landing_padって変数は宣言されておらん」と いうコンパイルエラーになるのですが、ここを今までコメントアウトしてました(^^;;;;;;; で、gdcの0.24のソースなどを参考に元々どうなってたかを確認したところ、 今回のように修正するのが正しいようです。これで例外は問題無くキャッチ されるようになりました。元のソースがまずいのは事実なのですが、それを いい加減に対応して傷口を広げたのは自業自得。

2008/06/04

早めに帰着。

例外追跡の話。何故かどうやってもtry/catch で反応しないようだったので、 以前のコンパイラバージョンとか、例外処理のサンプルとかを試したところ、 どうやら現在のSVNのGDCは、例外処理がバグってるという結論に至ってみたり。

で、Webを探って関係しそうなページを眺めたり。一つ心当たりのある点が あったので、configureオプションを変えて再ビルド。......終わらず。

ビルド中に鉄拳。勝ったり負けたり。ちっともポイントは増えず。

2008/06/03

早くも無く遅くも無く。

GDCビルドの続き。エラーするところがあったのですが、ちょろっと直してビルド完了。 手持ちソースをいくつかコンパイルしてみたところ、一部書き換えが必要だったり。


-mno-cygwin でビルドすると、どのような例外が発生してもランタイムエラーを 知らせるダイアログが開くのですが、そのダイアログにはデバッグに有効な 情報が一切表示されていない為、どこで例外が発生しているのかを追跡する 事ができません。
cygwinビルドできればコンソールに何かメッセージが出るかと期待したのですが、 cygwinビルドできないソースになっていたりしてどうにも困った感じに。 で、コード中に 無限ループを入れながら 例外が発生する箇所としない箇所の境界を 見つけて原因箇所を探ると言う、腰が抜けるほどダサい方法で例外発生箇所を突き止めたという.....。 実は良い方法があるのかしら?

そんな訳で、一部手を入れる必要がありましたが、コンパイル自体は問題無さげ。 2.014ベースのGDCをしばらく使ってみることにします。

2008/06/02

気持ち早めに帰着。

気が付くとTV見ながら寝てたり。

ふとGDCのSVNビュア を見てみたところ、ついにDMDの 1.030/2.014 に追従したもよう。

そんな訳でビルドしてみたり.....終わらず。

2008/06/01

昼ごろ起床。

洗濯したり掃除したり。

ちょろりお出かけ。ついでにゲーセンに寄って「怒首領蜂大復活」を見たり。 二人くらいやっているのを見ただけなのですがかなり厳しい予感。 でも、ハイパーっぽい状態になると敵弾を消せるようなので、 使いどころを見極めれば実は思ったほど厳しくは無いのかも? 気のせいかも知れませんが。

鉄拳。少し勝ち点を取り戻した気も。

たぼさんの2008/5/27の雑記で、 Window基底クラスの一例を見せてもらいました。SetProp()やGetProp()ってなAPIの存在を 初めて知りました。勉強になります。TANEがDで書いたWindow基底クラスは、 特に何も参考にせずに作ったものなので、Dの連想配列に頼りっぱなしの方法に なっているのが果たして一般的な方法なのかしら?と思うところがありました。 で、今回改めてwxWidgetsfox-toolkitのコードを眺めてみたのですが、 ハッシュを使って ウインドハンドラから プロシージャを逆引きしているようで、結果的には同じ方法に行き着くのかなぁ などと思ったりしました。

DUIT(GTK+のDラッパー)やwxd(wxWdigetsのDラッパー)も試したのですが、 ビルドに手間がかかりすぎる上にちょっとバグってたりするという理由から、 結局自作クラスの方が具合が良かったというので今に至る感じなのですが、 使い勝手が理由で自前のGUIツールキットを作ったり使ったりしている人って 意外と居るものなのかしら?


TOP PREV