昔の最近の出来事(2007.12)

2007/12/31

やっと復帰。いやー、年を取るたびに直りにくさを実感してしまいます。

色々やろうかと思ってたけど、結局まる二日ストールして、結局31日になって しまったり。洗濯したり掃除したりして終了。

そんな訳で今年を振り返り。あいも変わらずツマミ食いしては散らかした という感じ。7月くらいから本物お仕事が忙しくなってきた事もあって、 その辺を境にコーディングはサボり気味になってたかも(^^; Intuos3を買ったのも今年なんだけど、使い切れてないなぁという感じ。 ゲームはPS2用ソフトのオーディンスフィアを買ったのですが結局クリアできずに 放置。後はひたすらにPS3で鉄拳5DRばかり。そしてそれは今も継続中(^^;

振り返ればいつも通りです(^^; 来年もこんな感じでまったり行くんだろうなと 思います。

そんな訳で今年の更新はここまで。それでは良いお年を。

2007/12/30

風邪悪化で起き上がる事ができず。30分Web巡回したら力尽きる 感じ。

2007/12/29

風邪悪化で起き上がる事ができず。

2007/12/28

仕事納めで早めに帰着。

体調不良継続で即死。

2007/12/27

風邪で体調悪くて早めに帰着。

即死。

2007/12/26

早くも無く遅くも無く。

SPEコードをPS3の実機でテストしてみたり。
SPEコードは関数ではなく、SPEにロードする実行ファイルの形で コンパイルします。つまるところmain()から実行が開始される ようなイメージになってます。なので、実はコマンドプロンプト からも実行できます。そして、SPE専用の spu-gdbが用意されて いますので、デバッガも使用する事ができます。 そんな訳で次のようなコードを書いてみました。

#include <stdio.h>
#include <spu_intrinsics.h>
#include <spu_mfcio.h>

#define MAX_BUFSIZE (4096)

unsigned char LS[MAX_BUFSIZE] __attribute__((aligned(128)));

int main(unsigned long long spe, unsigned long long argp, unsigned long long envp)
{
  int i,j ;
  vector unsigned int v = (vector unsigned int){ 0x00000001,
						 0x00000002,
						 0x11111111,
						 0x02020202 } ;
  vector unsigned int *pt ;
  
  pt = (vector unsigned int*)&LS[0] ;

  pt[0]=v ;
  for( i=0 ; i<16 ; i++ ) printf("%02x ",LS[i]) ; printf("\n") ;
  
  for( i=0 ; i<8 ; i++ ){
    pt[0]+=v ;
  }
  for( i=0 ; i<16 ; i++ ) printf("%02x ",LS[i]) ; printf("\n") ;

  return(0) ;
}

これを、以下のような感じでコンパイル&実行。

[tane@localhost cell_test]$ spu-gcc -O2 spe_unit_test.c
[tane@localhost cell_test]$ ./a.out
00 00 00 01 00 00 00 02 11 11 11 11 02 02 02 02
00 00 00 09 00 00 00 12 99 99 99 99 12 12 12 12  

「int型×4個」を一つのvector型でパックしてますので、後は ベクトルイメージで演算してみています。例えばこれを-gオプションで コンパイルして、gdb-spuコマンドを使って様子を見てみました。 return(0)にブレークポイントを設定してrun実行後、色々ダンプ。

(gdb) info registers
r0             {uint128 = 0x0000030c000000000000000000000000, v2_int64 = {0x30c00000000, 0x0}, v4_int32 = {0x30c,
    0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x30c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x3, 0xc,
    0x0 <repeats 12 times>}, v2_double = {0x0, 0x0}, v4_float = {0x0, 0x0, 0x0, 0x0}}
 :出過ぎるので省略
r127           {uint128 = 0x00000000000000000000000000000000, v2_int64 = {0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0,
    0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v2_double = {
    0x0, 0x0}, v4_float = {0x0, 0x0, 0x0, 0x0}}
id             0x6      6
pc             0x30c    0x30c 
sp             0x3ff30  0x3ff30
fpscr          0x00000000000000000000000000000000       0
srr0           0x0      0
lslr           0x3ffff  262143
decr           0x7d19f380       2098852736
decr_status    0x0      0
(gdb) print/x &LS
$1 = 0xf00
$3 = {0x1, 0x2, 0x11111111, 0x2020202}
(gdb) print/x pt[0]
$4 = {0x9, 0x12, 0x99999999, 0x12121212}

てな感じ。SPEはLocalStrageしかアクセスできないのは先日勉強した通り。 その為、配列や変数そして実行コードの全てが ローカルメモリのアドレス空間の 中に納まっているという感じになっています。グローバルなメモリ領域を DMAでLSに持ってくる方法はまた後日。
2007/12/25

早くも無く遅くも無く。

SPEプログラミングの流儀を勉強。
SPEの実行バイナリはPPEの実行バイナリとは別に用意する必要があります。 コマンドプロンプト上で最初に起動をかけるのはPPEの実行バイナリで、 PPEの実行バイナリ内で SPEの実行バイナリのロードとSPEプログラムの 実行を制御するという感じになります。これらSPE用プログラムの ローディングや実行制御は ライブラリlibspe に一通り用意されており、 おおよそ雛形に沿ってコーディングすれば良いようです。

SPEは直接メモリをアクセスする事ができません。SPEがアクセスできるメモリ領域は Local Strage(LS)と呼ばれる256KBのローカルメモリのみです。その為、

  1. DMAを使ってLSにメインメモリの内容を転送(コピー)する。
  2. SPEで LS上のデータを操作する。
  3. DMAで LSの内容をメインメモリに書き戻す。

という手順を踏む必要があるようです。もし、256KBを越える領域を 扱うには、用事の済んだ領域を追い出して、別の処理対象領域を ロードし直す必要があります。
SPEはベクトルタイプのデータ(例えば頂点の座標変換とか)を処理するのには 向いていると思われますが、巨大なインデックステーブルを引いて値を 得るような処理には向いていない(例えばサーフェスの各頂点が巨大な 頂点配列のインデックスになっているなど)という事が伺えると思います。 しかしながら、256KBという領域は決して狭い領域では無いと思いますので、 うまくデータを256KBに分割して配置すれば、パフォーマンスの向上に 繋がると思われます。

まぁ、まだ実際にコーディングして確かめた訳では無いので、思ったよりも パフォーマンスを得られないなんて事は有り得ますが(^^;
あぁ、でもちょっと待てよ?SPEを使ったサンプルをコンパイルした時に、 SPE側関数にprintf()を使ってメッセージ出力させていて、PPEと何の 違いも無いかの様に動いていたのですが、LS経由でしかメモリアクセス できないとすると、printf()もよーく考えて使わないと、 自前のLS領域がprintf()実行で潰れたりする気がしなくもありません。

SPUのレジスタセット。128bit長のGPR(General-Purpose Register)を128本 持っている。レジスタ内に複数のデータフィールドに分割できる。 バイト(1Byte)/ハーフワード(2Byte)/ワード(4Byte)は、128bitレジスタを 4つのフィールドに分割、ダブルワード(8byte)の場合 は2つのフィールドに分割され、各データフィールド同士をSIMD的に演算対象に使用 されるという感じ。128本レジスタがあるので、項の多い式でも安心かも?

2007/12/24

昼過ぎ起床。

ちょろりお出かけ。ゲーセンに寄ったり。 空いていたので「DEATH SMILES」をやってみたり。見た目の印象よりは遊びやすい 気も。気のせいかも知れませんが。あと「虫ひめさまふたり デスレーベル」。 人がやっているのを鑑賞。これぁ厳しすぎてダメかも。そして 鉄拳6を 一度だけやってみたり。対戦相手が強いのもあるのですが、ジョイスティック ではさっぱり技が出せず。そんな訳でストレート負け。遠めで見ると ほとんど判らないのですが、テクスチャとかHD用になってるって感じで、 PS3の鉄拳5DRで慣れた目で見ても、やっぱ奇麗です。

リモートマシンのファイルをWindowsのMeadowから編集する方法が無い か調べてみたり。sshが使用できればOKそうなのですが、うまくいかなかったので、 PuTTY というソフトの中の、plink.exeという実行ファイルと、Emacsパッケージの TRAMPを使ってリモートファイル編集する方法を使ってみたり。 既にTRAMPが入っていれば、後の方法は簡単で、plink.exeをパスの通った場所に 置いた後でMeadowを起動し、 C-x,C-fのファイルオープンで、「/plink:tane@192.168.1.x:~/foo.txt」 と入れれば、192.168.1.xにユーザtaneでログインして ホームディレクトリ 下のfoo.txtを開くという形になります。 .emacsの中に「(setq tramp-default-method "plink")を加えれば、 最初の「plink:」は不要で、user@hostから始めれば良いようです。 少し開くのに時間がかかりますが、複数のターミナルウインドを行ったり来たり する必要が無いので楽チンです。

で、PS3-Linuxでgdcをビルドしてみたり。折角なので、Subversionで持ってきてあった 少し古いDMD2.0ベースのgdcをビルドしてみたり。説明書通りにパッチをあてた 後にmake。でも cc1d のリンクでエラー。

d/d-lang.glue.o: In function `d_init':
/home/tane/develop/dlang/gcc/gdc/gcc-4.0.3/build/gcc/../../gcc/d/d-lang.cc:376: undefined reference to `rs6000_cpu_cpp_builtins'
collect2: ld はステータス 1 で終了しました  

関数 rs6000_cpu_cpp_builtins() 自体はrs6000-c.oの中に入っているのですが、 単純にrs6000-c.oをリンクしただけでは、同じファイル内の別の関数 rs6000_pragma_longcall() 内で呼ばれている関数がリンクできずにエラーになります。 そこで、rs6000-c.c をコピーして rs6000-c2.cという別ファイルを作成し、 そのファイルの 関数rs6000_pragma_longcall()を削ってコンパイル&cc1d の リンクに使用しました。そこを乗り越えればビルド自体は成功しました。 ついでに、checkoutしなおした最新版もビルドしてみたのですが、 こちらはphobosのconfigure実行でエラー。i386のFedora8の方でも 同じ様にエラーでずっこけたので、今日時点のソースに問題があるのかも。
ビルドできたgdcでは hallo worldレベルのソースはコンパイルできたり。

簡単なOpenGL(GLUT)を使った手持ちソースをコンパイルしてみたり。 glutが入っていなかったので、「yum install freeglut-devel」でインストール。 後は、コンパイルエラーが出たでちょっと直したのですが、最後のリンクで失敗。

/usr/lib64/libstdc++.so.6: undefined reference to `_Unwind_GetIPInfo@GCC_4.2.0'

というエラーなのですが、以前、i386の マシンでもGCC_4.2.0のなんとかが見つからないみたいな話があったのでそれと 同様と推測。gdcをビルドした時に 「powerpc64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.7」 というlibstdc++が生成されていたので、それを/usr/lib64に置いて、 libstdc++.so.6のシンボリックリンクを張り替えてみたり。 これでとりあえずリンクはできたり。そして実行。とりあえず期待通りに 動いたのですが、リモートで画面を飛ばすとホスト側のCygwin-Xの方が全力動作で サチっている感じに。PS3側では24% くらいのCPU使用率でした。

さて、threadは DのThreadクラスを使って制御して、libspuをラップする 感じに考えてみますか。

2007/12/23

起きたら夕方。寝すぎ。

CellSDKのインストールはエラー無く終了していたり。てか、クロスのSDKの インストールにあれだけ失敗してたのは何だったのだろう?
でも、どこにインストールされているかがよく判らず、クロスSDKと同じ /opt/cellの下を探していたのですが見つからず。で、どうやら普通に /usr/binとかにインストールされているらしい。

うっかり yum updateを実行したらさっぱり終わらず。それにしても、 yumってなんであんなにメモリ食うの?たかがパッケージインストール で時間もかかり過ぎるし、256MB以上のメモリが必要ってのも全く納得がいきません。

そういやバックアップを戻す話。kbootコマンドプロンプトからps3-boot-game-osで XMBの起動に戻ります(もし立ち上がらなくなった場合は、PowerOFF状態から、 長押しでPowerONすると強制的にXMB起動になります)。で、リストアで戻して 完了。全て元通り。場合によって大容量メディアが必要というのが問題と 言えば問題かも知れませんが、難しいところです。

ちょろりサンプルを見ながらSPEを使用したプログラムを書いてみたり。 でも、ちょろっと書いただけでは全く使えてない感じに。 一つはPPEとSPEはメモリのコヒーレンシをハードで保障していないようなので、 そこを意識したプログラミングを行う必要がありそう。次にSPEを使用する にはlibspeというライブラリを使用するのですが、それとは別にthreadを 使用してlibspeの関数群を並列実行させるコードにする必要があるようです。 コンパイルオプションを積むだけで自動的にSPEを使った実行バイナリが 生成できる訳では無いのが難しさを感じるものの、逆にチューニングの し甲斐があるという感じでしょうか。チューニング後はライブラリ化できれば、 以降、楽に開発できるようになっていくという感じなのかも。

あまりにもメモリを食いすぎるので、Xが立ち上がらないように/etc/inittabを 書き換えてみたり。これで、起動直後の使用メモリは160M、SWAP使用は0 となり、普通に使うには十分という感じになってみたり。あぁでも、 SWAPが使えるという事はMMUが実装されている訳で、実際のゲームで 使っているかどうかは別にして、使う事が可能ってのは地味に凄い 事かも。

そういや、Folding@homeのアップデートが入っていたり。オートパワーオフ とBGM機能が追加された模様。

2007/12/22

昼ごろ起床。

唐突ですが、PS3にLinuxを入れてみる事にしたり。その為の材料を 購入しに秋葉ヨドに出かけたり。


材料購入自体には特に問題無し。で、帰ってから早速作業開始。

  1. PS3内データのバックアップを取る。ゲームやムービーなど完全にバック アップを取る為、大容量の外部メディアが必要になります。で、 体験版などのゲームだけを足しても3GB以上ある為、ここで8GBのUSBメモリ を使用しました。
  2. ハードディスクを入れ替え。取説にHDD交換の手順が記載されてますので、 その通りやればOK。まぁ、バックアップを取っているので、60GBのハード ディスクをそのまま使っても良いのですが、安全の為&強化の為に 交換してみました(^^;
  3. キーボードやらマウスやらを繋いで準備完了。
  4. PLAYSTATION®3 Linux Information Site から辿れる、インストールの手順を踏んで、ディスクのフォーマットを行います。
  5. 前述のサイトよりADDON(ブートローダー)のISOイメージをPCでダウンロード&CD-Rに焼き。 PS3にセットした後、「他のシステムのインストール」でインストールして PS3を再起動。

で、立ち上がらずorz。原因が直ぐに判らなくて普通のTVに接続してみたり(PS2のケーブルを使用)、 フォーマットし直したりしてみたのですが、Webをよく見てみたところ、 なんでも、システムソフトウェア2.1と20071023版ADDON の組み合わせで ブートローダーが起動できないという問題がある という罠にハマってしまった模様。20070831版というのを入れなおして 再起動。なんとかブートローダーを起動できました。

  1. Fedora8のインストールDVDイメージをダウンロード&DVD-R焼き。 kbootのプロンプトで、「linux64 xdriver=fbdev video=720p」とかやれば、 インストーラーが立ち上がるという感じ。
  2. あとは見たことあるXのFedoraのインストール画面を押し進めて、パッケージ インストール。
  3. 2時間弱ほどかかって終了。何故か最後にハングってしまい、強制電源OFF で再起動したのですが、一応Fedoraの起動に成功。ふぅ。

そんな感じです。リモートで乗り込んで色々見たり。

[tane@localhost ~]$ cat /proc/cpuinfo
processor       : 0
cpu             : Cell Broadband Engine, altivec supported
clock           : 3192.000000MHz
revision        : 5.1 (pvr 0070 0501)

processor       : 1
cpu             : Cell Broadband Engine, altivec supported
clock           : 3192.000000MHz
revision        : 5.1 (pvr 0070 0501)

timebase        : 79800000
platform        : PS3
[tane@localhost ~]$ uname -a
Linux localhost.localdomain 2.6.23.1-42.fc8 #1 SMP Tue Oct 30 13:05:49 EDT 2007 ppc64 ppc64 ppc64 GNU/Linux

二個のコアがあるように見えているようですが、PPEとSPEの関係とどう 対応しているのかはイマイチよく判らず。

で、POV-Rayをビルドして実行させてみたり。レンダリングしたシーンは、 short pov コンテストにエントリされていたe_pdotou.povという シーンファイルを少しいじったもの。

camera { right < 16/9, 0, 0>}
#local p=function{pattern{granite}}isosurface{function{y-.3+p(x/10,9,z/10)}contained_by{box{-9,9}}}light_source{<3,.5,8>,1}media{scattering{2,<3,2,1>/9}emission<.3,.4,1>density{function{.1/(y+1)}}}sphere{0,1pigment{granite poly_wave 4}scale-7*y+9hollow}

コマンドラインは「povray -I HD_e_pdotou.pov +W1920 +H1080 +A +FN」。 で、実行結果(最後のサマリ)は以下の通り。
Image Resolution 1920 x 1080
----------------------------------------------------------------------------
Pixels:          2075520   Samples:         2130744   Smpls/Pxl: 1.03
Rays:            2130744   Saved:                 0   Max Level: 1/5
----------------------------------------------------------------------------
Ray->Shape Intersection          Tests       Succeeded  Percentage
----------------------------------------------------------------------------
Isosurface                    45443375         3290961      7.24
Isosurface Container          45443375        45443375    100.00
Isosurface Cache                941523               0      0.00
Sphere                        45443375        45443375    100.00
----------------------------------------------------------------------------
Isosurface roots:          45443375
Function VM calls:       1063690256
----------------------------------------------------------------------------
Calls to Noise:          6134615952   Calls to DNoise:              10
----------------------------------------------------------------------------
Media Intervals:            2130744   Media Samples:          42195787 (19.80)
Shadow Ray Tests:          86625262   Succeeded:               1963770
----------------------------------------------------------------------------
Smallest Alloc:                   9 bytes
Largest  Alloc:               38428 bytes
Peak memory used:            407414 bytes
Total Scene Processing Times
  Parse Time:    0 hours  0 minutes  0 seconds (0 seconds)
  Photon Time:   0 hours  0 minutes  0 seconds (0 seconds)
  Render Time:   1 hours 10 minutes 52 seconds (4252 seconds)
  Total Time:    1 hours 10 minutes 52 seconds (4252 seconds)  

因みに、Pentium4(3.02GHz)+Cygwinの実行時間は以下のような感じ。
Image Resolution 1920 x 1080
 :中略  
Total Scene Processing Times
  Parse Time:    0 hours  0 minutes  0 seconds (0 seconds)
  Photon Time:   0 hours  0 minutes  0 seconds (0 seconds)
  Render Time:   0 hours 34 minutes 53 seconds (2093 seconds)
  Total Time:    0 hours 34 minutes 53 seconds (2093 seconds)

大体 Pen4(3.02GHz):Cell(3.2GHz)=1:2 という実行時間比の様です。単一CPU性能は少々残念な 結果なのは巷でも言われている事ですが、SPUを使ってのCBEと いう事の様です。 因みに、CFLAGS/CXXFLAGSには「-O3 -mpowerpc -mcpu=750 -mtune=7450 -mmultiple -mstring -mfused-madd」 てなチューニングオプションが積まれてました。流石にaltivecコードには なっていないので、そこを対応するだけでも事情は違うかも知れませんが、 実際の所はよく判らず。

そんな訳で実機の方にもCell-SDKを入れてみたり。 でも、回線の細いのは相変わらずなのでそのまま放置。

2007/12/21

早くも無く遅くも無く。

CellSDKのインストール。何度もリトライをしてやっとインストールする 事ができました。

簡単なprintf("hello world\n");のCプログラムをコンパイル。

[tane@localhost cell]$ ppu-gcc -O2 test.c
[tane@localhost cell]$ ppu-objdump -d a.out | head

a.out:     file format elf64-powerpc

Disassembly of section .init:

00000000100004e0 <._init>:
    100004e0:   7c 08 02 a6     mflr    r0
    100004e4:   f8 01 00 10     std     r0,16(r1)
    100004e8:   f8 21 ff 91     stdu    r1,-112(r1)
    100004ec:   48 00 01 09     bl      100005f4 <.call_gmon_start>

readelfはPPC64に見える感じ。

ELF Header:
  Magic:   7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, big endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           PowerPC64
  Version:                           0x1
  Entry point address:               0x1009dc30
  Start of program headers:          64 (bytes into file)
  Start of section headers:          674752 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         5
  Size of section headers:           64 (bytes)
  Number of section headers:         36
  Section header string table index: 33  

ふむ。ちょっと変わっているのは、PPEとSPEでツールが別になって いる所。どうやって使い分けるのかは、まだよくわからず。

SAIが遂にβで公開されたり。でも、なにやら色々デグっている ようで(^^;。KOJIさん、がんばってー!

2007/12/20

早くも無く遅くも無く。

先日のSDKインストールは朝になっても終わってなかったり。しかも 帰ってから見たら、エラーで停止してたり。

仕方ないのでもう一度。やっぱり回線が細いらしく、ちっともダウンロード が終わらないという感じ。またこのまま待つしかないという感じか? それにしても、SDKを入れるのに一体何日かかってるんだ?(^^;

久々に鉄拳。少し勝てたり。

2007/12/19

早くも無く遅くも無く。

先日立ち上がらなかったWings3Dの更新版が来てたり。とりあえず 起動はOK。今回のバージョンから、POVへのExporterが標準装備 されたようなのですが、ずっこけて動かず。 再コンパイルしたバージョンでもダメっぽい予感。 今まではKaios氏の作成したプラグインをずっと使っていたのですが、 Kaios氏のホームページが消えた為、知る人ぞ知るプラグインに なってしまっているのが現状です。Erlangの本を買ってみた事 だし、標準装備版のPOVプラグをいじってみようかしら?

Fedora8インストールの続き。結局、GUIインストーラーを使うと 途中でハング状態に陥る為、テキストインストーラーで入れて やっと立ち上がりました。えーと、何故Fedoraをインストール していたのか忘れるくらいの状況なのですが、CellSDKを 使うという本来の目的にやっと進めるかも。

そんな訳で、yumのアップデートを入れたり、ホームディレクトリを バックアップから戻したりして、やっとこCell-SDKのインストール。 ツールをIBMのサイトからダウンロードするには、まずサインアップを する必要があるのですが、そこが一番面倒臭い感じ。サインアップを 済ませてダウンロードページに辿り着けば、ISOイメージのファイル 2個と rpmファイル1個をダウンロードして、同じページの「Installation Instructions」 の通りにやれば yumを使ってネットワークからダウンロードされると いう感じのようです。何故か回線が細くてなかなかダウンロードされない ので、とりあえずほっぽらかして寝る。

2007/12/18

遅めに帰着。

Fedora8のインストール。ほっぽらかしていたら、ファイルが見つからん などとエラーをこいて止まってました。リトライしたら再開したので またそのままほっぽらかしで仕事に出てたのですが、なにやら固まった 状態で動かなくなっていたり。
しかたなくリブート。それにしても、Fedora6の時もそうでしたが、 Fedoraのインストールって絶対一回以上失敗するのはなんで?

PS3のファームアップデート。今回のVer2.10の目玉の一つはwmvを再生 できるようになった事でしょう。 以前は PS3がwmvを知らない為に 用事にならなかったWindows Media Playerを使ったDLNAサーバーも、 問題無し。ただしビデオはwmvしか見せられませんが。 また、以前見つけた ハイデフのwmvファイルの再生を試したり。 我が家のPC(P4-3.02GHz)だとつっかかる所があったのですが、 全くストレス無く再生できてみたり。発売されてから随分時間の 経つPS3ですがここにきてやっと使い勝手が良くなってきたように 思います。

2007/12/17

早くも無く遅くも無く。

Fedoraのアップグレード。結局、LVMを使っているFC6をFedora7にアップグレード するのはバグっててダメという事らしいので、Fedora8にアップグレードする という暴挙に出ていました。とりあえず、アップグレードは成功して、めでたく 立ち上がるようになったのですが、一度rebootすると ディスクが死んでしまい ましたorz。とりあえず立ち上がりはするものの、swap割り当てが0の為、 yumすらまともに動作できず。

多分壊れたのは、以前買った怪しい ジャンク品のHDDだと思われ。どうしようもないので、あきらめてFedora8を 再インストールする事に決定。うーむ、ちょろっとCellSDKを使ってみたかった だけなのに大掛かりな事になってる所がトホホくせぇ。

2007/12/16

AM中に起床。

Fedoraのアップグレード続き。yum upgradeは終了していたので、リブート。 でもカーネルパニックで立ち上がらず。

  Kernel panic: No init found. Try passing init= option to kernel.
どうやらFedora7では、/dev/hd* というデバイスが無くなって、/dev/sd* に 置き換えられているという事らしい。一旦、FC6のカーネルに切り替えて設定など を確認してみました(ここで立ち上がらなかったらアウトなのですが、 一応大丈夫でした)。

で、/boot/grub/grub.conf辺りにroot=/dev/hdaなんて 書かれているとビンゴらしいのですが、ちょいと様子が違ったり。 FC6ではLVM(論理ボリューム)を使って、2つの物理ディスクを一つの ディスクの様に見せてました。てか、最初にインストールしたらそう なっただけなのですが(^^;。で、grub.confには、

title Fedora (2.6.23.8-34.fc7)
        root (hd0,0)
        kernel /vmlinuz-2.6.23.8-34.fc7 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
        initrd /initrd-2.6.23.8-34.fc7.img

てな感じで書かれている為、物理デバイスは直接見ていない形に なっています。しかし、論理ボリュームと物理デバイスとの結びつけが 行われているハズで、その結び付けを /dev/hd* で行っている為に、 ディスクが見えないという感じに推測してみました。
で、問題は「どうやってhd*とsd*を入れ替えれば良いか判らない」というところ。 物理デバイスはいじらずに、論理ボリューム /dev/VolGroup00/LogVol00 とは別の論理ボリュームを割り当てて、そこからbootするのは どうか?と思い、まず、

/usr/sbin/vgcreate VolGroup99 /dev/sda /dev/sdb

てな感じで、/dev/hd*を/dev/sd*に付け替える感じで論理ボリューム割り当て を実行してみました。 でも、これはエラー。というのもFC6では /dev/sd* が実在しないから。 てか、これってデッドロックしてるなぁ。
しかし、こんな当たり前の構成に対してサポートできてない訳が無い とも思うのですが、TANEが何か勘違いしてるのかしら?

Wings3Dの0.99.0が出てたり。でも、インストールして実行するも何故か実行 自体ができず。久しぶりのアップデートかと思ったらガッカリ。

カーズのコメンタリーを観たり。ジョン・ラセター監督のコメントの方を 観たり。随分前から構想していた事や、監督自身が車好きであること、 車の事を徹底して調べてからアニメーションにしている事など、 へぇと思う点が多くありました。それにしても、1本の映画を作るのに 4年かかると言っていたのですが、毎年製作されているように見えるのは 何本かをパイプラインで流しているからかしら?と思ったり。

2007/12/15

起きたら午後もいい時間。

そういや、12月のアップデートで庭に出る事のできるようになった 「まいいつ」ですが、空が何故か曇っていたり。確かに今日は実際の天気も少し 曇り気味なのですが、何かしら連動してたりするのかしら?

ちょいと遠出して池袋のジュンク堂まで。仕事関係の本を探すついでに 少し見回ったり。で、「Erlang入門」なる本を見つけて思わず買って しまったり。本の帯には「マルチコア時代の並列処理言語Erlangを学ぼう!」 と書かれていたのですが、TANE的にはWings3Dの開発言語という認識 しか無かったりする訳ですが(^^;。 あと、Interface誌1月号を何気に手に取ったところ、 PS3のCPUであるCBE(Cell Broadband Engine)を使って、ソフトを書く記事が載って いたり。シミュレーターを使うとかクロス環境でコンパイルするとか、 興味深い内容だったのでこれもお買い上げ。

帰ってからCBEのSDKの記事を読んだり。IBMのalphaWroksのサイトを 見てみると、SDK-3.0というのがリリースされていて、それを使うには Fedora7が必要だという事らしい。そんな訳でFedora6→7にアップグレード するところから始める事に。うむー。

Fedoraのアップグレードをやってる最中に先週買ったままだった「カーズ」を観たり。 お約束の要素がちりばめられているのですが、全てのネタ振りを最後にきっちり 押さえてるところは流石です。普通に面白かったです。

Fedoraのアップグレードは終わりそうにないのでほっぽらかし。

2007/12/14

飲み会から帰って眠くて死亡。

2007/12/13

早くも無く遅くも無く。

ツールチップの話。上手くツールチップの表示できるCのサンプルと比べ ながら調べてみたところ、原因が判ってみたり。
ツールチップを表示するのには、CreateWindowEX()にTOOLTIPS_CLASSを使って 生成した後、TOOLINFOでツールチップに対する情報を設定した変数への ポインタをSendMessage()でツールチップのHWNDに送るという手順に なります。このとき、各種設定を行うTOOLINFO構造体のサイズは、 Cの場合、

typedef struct tagTOOLINFOW {
 UINT cbSize;
 UINT uFlags;
 HWND hwnd;
 UINT uId;
 RECT rect;
 HINSTANCE hinst;
 LPWSTR lpszText;
}

てなメンバー変数で構成されていました。この時のsizeof(TOOLINFO)値は 40byteでした。
で、Dの方はここ のラッパーを使っているのですが、ここでの定義は、

struct TOOLINFOW {
        UINT      cbSize;
        UINT      uFlags;
        HWND      hwnd;
        UINT      uId;
        RECT      rect;
        HINSTANCE hinst;
        LPWSTR    lpszText;
        LPARAM    lParam;
        void*     lpReserved;
}

てな感じになっていて、TOOLINFO.sizeof 値は 48byteになってました。
うまく表示できなかった直接の原因は以下の通り。 メンバー変数cbSizeに、構造体自体のサイズをセットする必要があるのですが、 最初は「ti.cbSize = TOOLINFO.sizeof ;」てな感じで値48をセットしてました。 これを、値40をセットするように変えてみたところ、うまく表示できるようになりました。 ここで、TOOLINFO定義を行っているcommctrl.dのソースを眺めてみたところ、

const size_t
        TTTOOLINFOA_V1_SIZE = TOOLINFOA.lParam.offsetof,
        TTTOOLINFOW_V1_SIZE = TOOLINFOW.lParam.offsetof,
        TTTOOLINFOA_V2_SIZE = TOOLINFOA.lpReserved.offsetof,
        TTTOOLINFOW_V2_SIZE = TOOLINFOW.lpReserved.offsetof,
        TTTOOLINFOA_V3_SIZE = TOOLINFOA.sizeof,
        TTTOOLINFOW_V3_SIZE = TOOLINFOW.sizeof;

てな定義がされてて、構造体サイズにいくつかバリエーションがあり、 場面によって使い分ける感じになってるらしいという事が判りました。 ここは自動的に切り替えが効かないようなので、 TTTOOLINFOW_V1_SIZEをハードコーディングするよりほかに無い模様。 てか、WinAPIでは構造体のサイズを構造体の先頭のメンバー変数に 指定するってのは普通の話なのですが、厳密にチェックされているとは 思いませんでした。

2007/12/12

早くも無く遅くも無く。

最も簡単そうなツールチップを表示する部品クラスを作って いるのですが、何故かうまく表示されなくて悩んでみたり。

2007/12/11

早くも無く遅くも無く。

先日のコンパイルエラーの話。 クラス Foo1 を継承してクラス Foo2 を作ったのですが、そのクラス Foo2 を クラス Foo1の中で使おうとして、クラス定義が衝突してみたり。 冷静に考えてみますに、自分の子孫の機能を自分自身に取り込むって のは変な話な訳で。そこんところを直したらコンパイルは大丈夫 になったり。でも、肝心の動きの方が思い通りにならず。

鉄拳。勝って負けてイーブン。

2007/12/10

早くも無く遅くも無く。

先日仕入れた「ONEPIECE(48)」を読んだり。ウソップがすげぇ。

鉄拳。少し勝ち点を取り戻してなんとか六段に返り咲き。ぴひゅー。

ちょろりコーディング。んー?何故かコンパイルエラー。

2007/12/09

AM中に起床。

ちょろりお出かけ。ちょいと本を探しに出たのですが、目的の物は 見つからず。全然関係無いですが、「レミーのおいしいレストラン」と ついでに「カーズ」のBlu-rayディスクを買ってみたり。 とは言っても、PS3とディスプレイを買った時のヨドバシポイントの残りで ゲットしたので支払いは無し。他、本屋でマンガの新刊など購入して終了。

そんな訳でレミーの方を観たり。PIXERの映画はMr.インクレディブルのDVDを 観たのが最後なので、約2年半ぶりって 感じ。解像度の点を引いてもネズミ群のフサフサ感や水の表現、グラスにワインを 注ぐシーンなど、少し前だと使ってるだけでスゲーという技術も、随分と普通に 使われているように思いました。ネズミが料理をするって設定は少々無茶な感じ がしなくもありませんでしたが、直接料理をする訳では無いってのが見所だったかも。 普通に面白かったと思います。 因みに、邦題は「レミーの...」ですが、原題は「RATATOUILLE」のようです。 実は原題のタイトルは本編の中で出てくるキーとなる料理で、そこに かけているようなのですが、邦題ではそれが全く通じない感じになってる かも。でも、日本では「RATATOUILLE」という 料理名自体が馴染みの無いものだと思いますので、「レミーの...」の方が 判りやすいかも。
で、コメンタリーも観たり。BDのためかどうかは判りませんが、コメンタリーが 全て日本語吹き替えされていたり。それはさておき、今回のコメンタリーでは、CG技術の 話が殆ど出てこなかったように思います。逆にモーションや演技の話が非常に 多く出てきてました。実際、「動き細けぇー」って感じに思ったので、 今まで以上に力を入れたんだろうなと思われます。それにしても、製作 開始は随分前のようで、完成までに時間がかかったみたいですが、特典映像に 入ってた製作風景の中に2007年のタイムスタンプの入った仮映像が映っていたりと、 ギリギリまで作っていたっぽい感じがしました。いつもそういうもんなのかしら?

2007/12/08

起きたら夕方。寝すぎ。

コーディング。やっと原因が判ってみたり。 もともとの現象は、レバーコントロールの中に自作のGDIウインドを はめ込んだところ、何故かレバーコントロールの表示がうまくできたり できなかったりするというものでした。
で、コード自体をどうしていたかと言うと、親ウインドでWM_SIZEを受け取ると、 子となるレバーコントロールのHWNDにMoveWindow()でサイズ変更を通知してました。 このとき、親ウインド配下にはレバーコントロール以外にも子ウインドが いくつか存在しており、これらにも同様にサイズ変更を通知してました。
怪しい動きをしていたときにどうしていたかと言うと、 子ウインドのHWNDをキーとしたDの連想配列を使用して、サイズ変更を通知 したいHWNDのリストを作ってました。取り出すのには、.keysプロパティを 使ってHWNDの一覧を作るという感じです。で、ここに問題がありました。 .keysで取り出したHWNDの一覧は、配列のキーとして登録された順番とは 何も関係無い順番で取り出されます。サイズ変更メッセージを送る順番が 思った順と狂ってしまった場合に、見た目が変になるという感じだった ようです。で、描画順番を保障するようにしたところ、必ず思惑通りの 描画になってみたり。ふーむ。

今回、結果的にPAINTSTRUCTをstatic宣言しなくても大丈夫な感じになって しまったのですが、結局、static宣言が関係あったのかなかったのかが はっきりしていない為、今後も注意して見る必要がありそう。

ちょっとコードを整理したり。

2007/12/07

早くも無く遅くも無く。

コーディング。タイミングの方を疑って、ウインド生成の方法を 変えてみたり、メッセージを送る手順を変えてみたり。 PAINTSTRUCTはstatic宣言してもしなくても関係無い感じになってみたり。 色々試してみたところ、どうやらレバーコントロールのウインドリサイズ を行わなければ(最初に決めたサイズのままなら)大丈夫な予感がし始めてみたり。

2007/12/06

早くも無く遅くも無く。

BeginPaint, EndPaintを、外付けのC関数でラップして、PAINTSTRUCTで宣言 される変数もCの関数内の領域を使ってみるようにしてみたり。でも、あんま動きに違い は無い感じ。そもそもPAINTSTRUCT宣言によって確保した変数のポインタ は一切変化していないので、PAINTSTRUCTの問題ではないような気がしてきたり。 起動の度に期待通りに動いたり動かなかったりするので、 何かしらWindowsの動作タイミングと関係がありそうな予感。うーむ。

2007/12/05

早くも無く遅くも無く。

今日の鉄拳。イーブンくらい。

ちょろりコーディング。普通に static PAINTSTRUCTを使って描画する ウインドをレバーコントロールに入れると、何故か動きが変になったり。 static宣言の有無で動きが変わるようなので、いよいよ PAINTSTRUCTを使うときに何故かstatic宣言しておかないとうまく 描画されない時があるという原因を調べないとダメかも。

2007/12/04

早くも無く遅くも無く。

今日の鉄拳。何故か通信状態が悪くて対戦できず。

2007/12/03

早くも無く遅くも無く。

今日の鉄拳。調子良くて勝ち点を取り戻してみたり。

ちょろりコーディング。

2007/12/02

AM中に起床。

ちょろりコーディングしたり、鉄拳で新しいコンボを練習したり。

ちょろりおでかけ。鉄拳6を見たり。全面ハイデフ筐体に入れ替わって いたり。PS3の鉄拳5DRを見慣れてしまっているせいか、画面のクリアさ はそんなに驚く要素ではなくなっていたのですが、ハイデフ表示スペック をフルに使って、モデリングなんかは随分細かい所まで作り込んである なぁという感じ。今日見てる中では新キャラを使う人は居なかったり。 PS3で遊べるようになるのが今から楽しみなのですが、鉄拳5の実績から言うと、来年の 夏前に出れば良いかなって感じかも。

プロレスのハッスル。今までどういうものかよく判らなかったのですが、 ここ最近 TV東京で試合の模様や深夜番組などが放送されるようになり、 なんとなくどういうものか判ってみたり。ショーに徹しているという事を 踏まえて観ると、意外と面白くて思わず見てしまうというのが正直な感想です。 プロレス技などしっかり出す所は出しているので、見せ場はきっちりしている感じに 思います。

2007/12/01

起きたら夕方。寝すぎ。

TV観たり、Web巡回して一日終了。

今日の鉄拳。勝ち点を取り戻して五段に返り咲き。


TOP PREV