昔の最近の出来事(2014.12)

2014/12/31

昼過ぎ起床。

洗濯したり買出ししたりして終了。

Emacsのterm+を256色設定してみたり。 説明書通りに設定すると 何故かxterm-256color.elでエラーしたのですが、新しいのをgithubから持ってくれば 大丈夫でした。ついでにscreenもxterm-256color化。.screenrcに以下のような 呪文を追加したり。

defbce "on"
term xterm-256color
termcapinfo xterm 'Co#256:pa#32767:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
termcapinfo xterm-256color 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'

意味はよく分かりません(^^; 「termcapinfo xterm-256color ...」は screenコマンドが立ち上がった時に、勝手にターミナルサイズが変わってしまう のを抑止する設定です。

xterm-256color

ただ、256色になったからといって画像が表示できる訳ではないので、 ちょっとカラフルになって見やすくなった気がするくらいかも知れません。

そんな訳で今年を少し振り返り。
年初から引越ししたりでゴタゴタしてましたが、まぁいつも通りごちゃごちゃと やっていたように思います(^^;


去年に比べるとコーディング量は少なかったかも。CGもサイトを引越した時に 表紙を変えたくらいに留まってました。来年はもう少し増やすように したいなぁ。と毎年言っているような気がする(^^;

そんな感じで今年はここまで。それではみなさん良いお年を。

2014/12/30

昼過ぎ起床。

ppcクロス環境。FedoraでビルドしたglibcをCygwinに持ってきて、 gccの二回目ビルドからCygwinで行ったところ、一応ビルドできました。 で、IJGのツールをppcクロスコンパイルしてppcsimで実行してみたところ、 すっとんだアドレスをアクセスしてたり。あれぇ?動かなくなってる(^^;

qemu-ppcで命令単位実行したものと比べながら値を見たところ、 argの受け渡し方がなんか違ってる感じだったり。そういや、ppcsimの argの受け渡し方って、どうして今の実装でOKって事になっているのか 思い出せなかったり(^^;
ppcsimでは関数呼び出しと同様に、単純にargc,argvをr3,r4レジスタにセットして スタートしているだけだったのですが、 少なくとも、今のglibcではargやmain()のスタート位置とかは、 スタックに予め仕込まれている事になっていて、スタックを取り出す コードがsysdeps/unix/sysv/linux/powerpc/libc-start.cというソースに 書かれています。このスタックの内容を完コピすれば動くハズ......

もそもそ調べてみるも、色々仕込みをいれておかなくてはならないようで なかなか動かず。

「タケヲちゃん物怪録(7)」。3巻(2013年3月 初版)まで出てるくらいから 読んでましたが、今巻が最終巻です。 稲生物怪録 をベースに、とよ田節でアレンジされた物語になっていて、面白かった です。因みに1巻は2012年5月 初版なので、妖怪ウォッチ と関係は 無いものと思われます。

LINKSというWebブラウザの 存在を知ったり。日本語文字は激しく化けるようですが、 w3mの替わりに画像としてページをレンダリングしてEmacsに表示 できればewwと張り合える外付けブラウザになりそうな予感。 そういや、linksは確かに激しく日本語文字が化けてはいるものの、 平仮名やカタカナはローマ字のように読めるのが不思議に思ったり。

eww vs links

なんでだ?

2014/12/29

ゴミを捨てる為に早起きしたけど、すぐに二度寝して起きたら昼頃。

先日のCygwinでのPPCクロス環境ビルドは何故かコンパイルエラーで 失敗。glibcのクロスコンパイル部分じゃなくてCygwinネイティブコンパイルでビルド できなくてはならなない実行ファイルのコンパイルに失敗していたり。 書き換えたりしてみたものの、通せる気がしなかったり。 Webで調べてみると 似た話 の書き込みがあったのですが、コメントなどは特に無し。 という訳でCygwinでのppcクロスビルドは保留。 Cygwinではファイルの大文字/小文字を区別しないのですが、それに 由来する問題(参考)も対応が 必要なままなので、敷居はまだ高いと思いますが。

FedoraでPPCクロスgdcをビルドしてみたり。結果から言うと多少の対応は 必要(ARMのそれと違い、壊れていると言っていいレベル)でしたが、 libdruntime,libphobosのビルドはできて、少し怪しい ながらもqemu-ppcで動くという感じでした。過去には動いていたと 思いますので、詳しい人が対応してくれれば大丈夫なんじゃない?と いうレベルかも。

$ cat hello.d
import std.stdio;
import std.string;

void main(string[] args)
{
  writef("Hello D world\n") ;

  version( GNU     ) writef("I am GNU\n"    ) ;
  version( Unix    ) writef("I am Unix\n"   ) ;
  version( linux   ) writef("I am linux\n"  ) ;
  version( Windows ) writef("I am Windows\n") ;
  version( MinGW   ) writef("I am MinGW\n"  ) ;
  version( MinGW32 ) writef("I am MinGW32\n") ;
  version( MinGW64 ) writef("I am MinGW64\n") ;
  version( cygwin  ) writef("I am cygwin\n" ) ;
  version( Win32   ) writef("I am Win32\n"  ) ;
  version( Win64   ) writef("I am Win64\n"  ) ;
  version( Posix   ) writef("I am Posix\n"  ) ;
  version( X86     ) writef("I am X86\n"    ) ;
  version( X86_64  ) writef("I am X86_64\n" ) ;
  version( ARM_SoftFloat ) writef("I am ARM_SoftFloat\n"    ) ;
  version( ARM     ) writef("I am ARM\n"    ) ;
  version( PPC     ) writef("I am PPC\n"    ) ;
  version( PPC64   ) writef("I am PPC64\n"  ) ;
  version( PPC_SoftFloat ) writef("I am PPC_SoftFloat\n" ) ;
  version( PPC_HardFloat ) writef("I am PPC_HardFloat\n" ) ;

  foreach( int i, arg; args ){
    writef("%d : %s\n",i,arg) ;
  }
  return ;
}

$ powerpc-linux-gdc hello.d -o hello

$ qemu-ppc -L /usr/local/ppctools/powerpc-linux ./hello aaa bbb ccc
qemu: Unsupported syscall: 249
Hello D world
I am GNU
I am Unix
I am linux
I am Posix
I am PPC
I am PPC_HardFloat
0 : ./hello
1 : aaa
2 : bbb
3 : ccc

因みにsyscall:249は、

$ grep 249 /usr/local/ppctools/powerpc-linux/include/asm/unistd.h
#define __NR_swapcontext        249

らしい。どういうシステムコールなのかはよく分からず。

「ONE PIECE(76)」。まだ話の途中。どういう展開になるかはまだ分からず。

2014/12/28

昼頃起床。

洗濯したり掃除したり。

ANIMAXでやってた「雪の女王」のCGアニメ。 3D CG作品なのですが、髪の毛やパーティクルが今風だったので、 どこのアニメーションスタジオの作品なんだろう?と思い、調べてみるも アナ雪の方がひっかかり過ぎてあまり情報を得られず。 結局、 amazoneのDVD情報 が一番情報がありました。ただ、2012年制作というのとロシア製という事 だけしか分からなかったり。原作に忠実なためか、話が詰め込み過ぎに 思いましたが、ロシアもこのレベルの絵が出せるんだとは思いました。

「雪の女王」の事を調べていて 見つけた記事。 確かにスゲぇ。

ARMのクロス環境を作ったついでに、PowerPCの方も更新しとくかと ビルドを試したり。基本、ARMと同じでいけるハズだけどなんかダメ な箇所があって調べたり。ppcsimがある都合でCygwinの方でも確認 してみるものの、遅くて終わらず。ただ、パッチや出来合いのヘッダが が無くてもビルドできるようになった点は良いです。

2014/12/27

昼過ぎ起床。

QEMUでARM。none-linuxだったのは、参考にしたwebがそうなってた だけだったので、arm-linux-gnueabi とかにすれば特に問題無いようです。

プロ遊の下に「QEMU ARMで遊ぼう」 という文書を置いてみました。ご参考まで。

調子に乗って、ARM-linux ターゲットのクロスgdcのビルドを行ってみたり。 まだmasterではない ibuclawさんのブランチである ba5291954e3f17fe31b4671659965090ccf1e3b1 てのを使用してみました。ほんの少し直す必要がありましたが、 結果から言うとクロスgdcのビルドと、コンパイラを使って生成した 実行バイナリのQEMUによる実行に成功しました。マジでか!? gdcすげぇ!!

$ arm-linux-gnueabi-gdc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gdc
COLLECT_LTO_WRAPPER=/usr/local/arm_linux/libexec/gcc/arm-linux-gnueabi/5.0.0/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../gcc-5-20141207/configure --target=arm-linux-gnueabi --enable-languages=d --prefix=/usr/local/arm_linux --disable-bootstrap --disable-nls --disable-libgomp --disable-libmudflap --disable-multilib --disable-libsanitizer
Thread model: posix
gcc version 5.0.0 20141207 (experimental) (GCC)

$ cat hello.d
import std.stdio;
import std.string;

void main(string[] args)
{
  writef("Hello D world\n") ;

  version( GNU     ) writef("I am GNU\n"    ) ;
  version( Unix    ) writef("I am Unix\n"   ) ;
  version( linux   ) writef("I am linux\n"  ) ;
  version( Windows ) writef("I am Windows\n") ;
  version( MinGW   ) writef("I am MinGW\n"  ) ;
  version( MinGW32 ) writef("I am MinGW32\n") ;
  version( MinGW64 ) writef("I am MinGW64\n") ;
  version( cygwin  ) writef("I am cygwin\n" ) ;
  version( Win32   ) writef("I am Win32\n"  ) ;
  version( Win64   ) writef("I am Win64\n"  ) ;
  version( Posix   ) writef("I am Posix\n"  ) ;
  version( X86     ) writef("I am X86\n"    ) ;
  version( X86_64  ) writef("I am X86_64\n" ) ;
  version( ARM_SoftFloat ) writef("I am ARM_SoftFloat\n"    ) ;
  version( ARM     ) writef("I am ARM\n" ) ;

  foreach( int i, arg; args ){
    writef("%d : %s\n",i,arg) ;
  }
  return ;
}

$ arm-linux-gnueabi-gdc hello.d

$ qemu-arm -L /usr/local/arm_linux/arm-linux-gnueabi ./a.out aaa bbb ccc
Hello D world
I am GNU
I am Unix
I am linux
I am Posix
I am ARM_SoftFloat
I am ARM
0 : ./a.out
1 : aaa
2 : bbb
3 : ccc

どこまで本気のアプリが動くかは不明。まぁでもここまで動けば ある程度の規模のものは動くでしょう。

GDCのWikiに 「 Bare Metal ARM Cortex-M GDC Cross Compiler」 というコンテンツがあります。いわゆるOS無しの環境で動かすための もので、libdruntimeやlibphobos無しで動く実行バイナリを生成 するクロスコンパイラのビルド手順です。クロスコンパイラを生成するだけなら 恐らくそんなに難しくなくて、libphobos無しでHelloWorldできているってのは、 あんま動いてる事にならないんじゃないの?と思っていました。 しかし、割とあっさり arm-linuxで動くであろう実行バイナリを生成 できるクロスコンパイラをビルドできたというのには恐れ入りました。

2014/12/26

仕事納め。早めに帰着。

QEMUでARM向けバイナリ実行。Linuxのプロセスイメージを実行する ようで、ARM-Linuxで動くバイナリを食わせないとダメそうな予感。 そんな訳で、ビルドの方法を調べるのですが、古いgccでのビルド方法 だったり、出来合いのバイナリをインストールする方法だったり、 ビルドで突っかかった質問に対して的を外した回答のMailingList情報 だったりと、なかなかズバリな答えが得られず。結局、色々試して これでいけそうという所に辿り着いたり。

$ arm-none-linux-gnueabi-readelf -h ./djpeg
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x10ac8
  Start of program headers:          52 (bytes into file)
  Start of section headers:          3546584 (bytes into file)
  Flags:                             0x5000202, has entry point, Version5 EABI, soft-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         6
  Size of section headers:           40 (bytes)
  Number of section headers:         37
  Section header string table index: 34

$ qemu-arm -L /usr/local/arm_linux/arm-none-linux-gnueabi ./djpeg --help
usage: ./djpeg [switches] [inputfile]
Switches (names may be abbreviated):
  -colors N      Reduce image to no more than N colors
  -fast          Fast, low-quality processing
  -grayscale     Force grayscale output
  -scale M/N     Scale output image by fraction M/N, eg, 1/8
  -bmp           Select BMP output format (Windows style)
  -gif           Select GIF output format
  -os2           Select BMP output format (OS/2 style)
  -pnm           Select PBMPLUS (PPM/PGM) output format (default)
  -targa         Select Targa output format
Switches for advanced users:
  -dct int       Use integer DCT method (default)
  -dct fast      Use fast integer DCT (less accurate)
  -dct float     Use floating-point DCT method
  -dither fs     Use F-S dithering (default)
  -dither none   Don't use dithering in quantization
  -dither ordered  Use ordered dither (medium speed, quality)
  -map FILE      Map to colors used in named image file
  -nosmooth      Don't use high-quality upsampling
  -onepass       Use 1-pass quantization (fast, low quality)
  -maxmemory N   Maximum memory to use (in kbytes)
  -outfile name  Specify name for output file
  -verbose  or  -debug   Emit debug output

$ qemu-arm ./djpeg -dct int -ppm -outfile testout.ppm testorig.jpg

$ diff -s ./testimg.ppm testout.ppm
Files ./testimg.ppm and testout.ppm are identical


IJGのdjpegをビルドしてQEMUで動かしてみた結果。argが伝わるので、 --helpがちゃんと解釈されてます。そしてファイルアクセスもできて、 ちゃんとデコードできているようです。

そういや何故 none-linuxなんだろう?

2014/12/25

遅めに帰着。

BPG (Better Portable Graphics) という画像フォーマットの存在を知ったり。

2014/12/24

遅めに帰着。

QEMUで実行バイナリをコマンドラインから動かす方法があるのを 知ったり。VMware上のFedoraで試しにARM向けのコンパイラをビルドしてみて試した ところ、それっぽく動くには動いたのですが、argがうまく伝わって いないとか、なんか違っているような気がしたり。

2014/12/23

昼頃起床。

ぐうたら過ごしたり。

ちょろり調べ事。

2014/12/22

気持ち早めに帰着。

freeglutをダイナミックリンクライブラリでもスタティックリンクライブラリでも リンクできるようにしたいと思ったり。D言語ではDLL内に含まれる関数の 場合は「extern(Windows) ....」、スタティックの場合は「extern(C) ....」 のようにリンケージ属性を指定する必要があります。で、version()で キーワードを指定したときにスタティックライブラリにしようと、

version(STATIC_GLUT){
extern(C) :
}else{
extern(Windows) :
}
void    glutInit(int *argcp, char **argv) ;
  :

としてみたのですが、何故かうまく切り替えられず (何も指定していないとextern(Windows)になるハズだけどそうならない)。

version(STATIC_GLUT){
extern(C){
}else{
extern(Windows){
}
void    glutInit(int *argcp, char **argv) ;
  :
}

これは文法エラー。そして、

version(STATIC_GLUT){
extern(C)
}else{
extern(Windows)
}
{
void    glutInit(int *argcp, char **argv) ;
  :
}

これも文法エラー。表現できないのか?

2014/12/21

昼頃起床。

洗濯したり掃除したり。

OpenGLを使うにあたってglutを使用しているのですが、 自分でビルドができなかった為、出来合いのDLLを使用しています。 で、freeglut に乗り換えられないか?と思ったり。
そんな訳で、ビルドを試してみたり。説明書にはconfigureを実行するとか 書かれていますが、configureスクリプトはどこにも無い為、実際には cmakeを使ってビルドする必要がありました。 MinGWのクロスビルドをCygwinのmingwツールチェーンを使って行って みたところ、demoのビルドもできたので一応使えそうな感じに。 因みに、MinGWネイティブでは何故かcmakeがうまく動きませんでした。

ところがmigw gdcで使ってみるとダメだったり。 glutと違い、glutInit()を実行しなくてはglut*関数群が 使えない仕様になっているようなのですが、glutInit()を実行しても 描画がうまく行われなかったり。うーむ、うまくいきません。

glutを使ってウインドウを開くようなD言語コードは一応動いてみたり。 ますます うーむ。

スタティックライブラリのビルドができるのでデバッガで見てみた ところ、libfreeglut内の関数でSegfaultしていたり。 glutでティーポットやトーラスなどのプリミティブを描画できますが、 描画関数内のカレントウインドウ?を取得するコードでNULLポインタ アクセスしてました。glutCreateWindow()とかでウインドウを開かない限り 値がセットされていないと思われるので、描画コンテキストの用意や 設定は自前で行ってあるからプリミティブの描画だけ行って欲しいんだけど? という要求に応えられないコードになっているような気がしたり。 そんな訳でちょこっといじってみたところ描画できてみたり。

*** ../src/fg_geometry.c.orig   2014-10-30 02:09:57.000000000 +0900
--- ../src/fg_geometry.c        2014-12-22 00:31:48.032092000 +0900
***************
*** 178,188 ****
  void fghDrawGeometrySolid(GLfloat *vertices, GLfloat *normals, GLfloat *textcs, GLsizei numVertices,
                            GLushort *vertIdxs, GLsizei numParts, GLsizei numVertIdxsPerPart)
  {
!     GLint attribute_v_coord   = fgStructure.CurrentWindow->Window.attribute_v_coord;
!     GLint attribute_v_normal  = fgStructure.CurrentWindow->Window.attribute_v_normal;
!     GLint attribute_v_texture = fgStructure.CurrentWindow->Window.attribute_v_texture;

!     if (fgStructure.CurrentWindow->State.VisualizeNormals)
          /* generate normals for each vertex to be drawn as well */
          fghGenerateNormalVisualization(vertices, normals, numVertices);

--- 178,188 ----
  void fghDrawGeometrySolid(GLfloat *vertices, GLfloat *normals, GLfloat *textcs, GLsizei numVertices,
                            GLushort *vertIdxs, GLsizei numParts, GLsizei numVertIdxsPerPart)
  {
!     GLint attribute_v_coord   = fgStructure.CurrentWindow==NULL ? -1 : fgStructure.CurrentWindow->Window.attribute_v_coord;
!     GLint attribute_v_normal  = fgStructure.CurrentWindow==NULL ? -1 : fgStructure.CurrentWindow->Window.attribute_v_normal;
!     GLint attribute_v_texture = fgStructure.CurrentWindow==NULL ? -1 : fgStructure.CurrentWindow->Window.attribute_v_texture;

!     if (fgStructure.CurrentWindow!=NULL && fgStructure.CurrentWindow->State.VisualizeNormals)
          /* generate normals for each vertex to be drawn as well */
          fghGenerateNormalVisualization(vertices, normals, numVertices);

***************
*** 202,208 ****
          fghDrawGeometrySolid11(vertices, normals, textcs, numVertices,
                                 vertIdxs, numParts, numVertIdxsPerPart);

!         if (fgStructure.CurrentWindow->State.VisualizeNormals)
              /* draw normals for each vertex as well */
              fghDrawNormalVisualization11();
      }
--- 202,208 ----
          fghDrawGeometrySolid11(vertices, normals, textcs, numVertices,
                                 vertIdxs, numParts, numVertIdxsPerPart);

!         if (fgStructure.CurrentWindow!=NULL && fgStructure.CurrentWindow->State.VisualizeNormals)
              /* draw normals for each vertex as well */
              fghDrawNormalVisualization11();
      }

コードの質はともかくとして、fgStructure.CurrentWindowがNULLでも 適当に進んでみるという感じにしてみました。

glutからの乗り換えがやりたい事だった訳ですが、手を入れないとダメなのは 流石に辛いので、3.0.0の正式リリースまでに気づいて、もっと良い感じに 直してくれないかなぁ?と思ったりも。

2014/12/20

AM中に起床。休出。

なにやら「萌え絵」 なるWikipediaの存在を知ったり。 特徴についての記述があるのですが、結局、アニメ絵との違いが よく分からない説明だなぁ?と思ったりも。

飯を食ったらあまりの眠さに急速停止。

2014/12/19

遅めに帰着。

WBSでやってたプログラミング学習の話。 25年くらい前に比べれば、PCは入手し易くなってるし、 情報を得るのもずっと簡単になっているし、 フリーソフトウェアなどを使えば、誰でも始められるのが プログラミングだと思っているのですが、実際はそういう訳でも 無いというのが不思議といえば不思議。結局、興味を持っている 人は勝手にやるし、興味が無ければやらないだけなのかも。 そういや、 プログラミン じゃなくて Scratchなのかとは ちょっとだけ思った。

2014/12/18

遅めに帰着。

調べ事をして終了。

2014/12/17

遅めに帰着。

エアコンが突然停止して、その後動かなくなったり。 今のアパートの設備なのですが、何故かエアコンだけ説明書が無い上、 状態を表示するパネル類の無い機種なもんですから、何が起こっている のかさっぱり分からなかったり。で、Webで機種検索してどうにか 状態を把握する事ができたり。室内機もしくは室外機の通気が塞がれて いるという事だったようですが特に何も無く。結局コンセントの 抜き差しで復帰。

2014/12/16

遅めに帰着。

ちょろり調べ事をして終了。

2014/12/15

遅めに帰着。

先週の金曜日に寝違えたせいか首に痛みがありました。土、日と 痛みはあるものの、特に酷くなる事は無かったのですが、 今日は徐々に痛みが増してきたり。机に向かって文書を読む為に 少し下向きになるとダメな感じ。シップを貼って安静にするしか ないか?うーむ。

2014/12/14

AM中に起床。

掃除したり、投票ついでに出かけたり。

Emacsでのround関数がrange errorになる件について、ソースコードに 網をかけてみたり。エラー検出は何種類かあるようですが、 以下の網に引っかかる模様。

    328 static Lisp_Object
    329 rounding_driver (Lisp_Object arg, Lisp_Object divisor,
    330                  double (*double_round) (double),
    331                  EMACS_INT (*int_round2) (EMACS_INT, EMACS_INT),
    332                  const char *name)
    333 {
    334   CHECK_NUMBER_OR_FLOAT (arg);
     :
    377   if (FLOATP (arg))
    378     {
    379       double d = (*double_round) (XFLOAT_DATA (arg));
    380       if (FIXNUM_OVERFLOW_P (d))
    381         {
    382           printf("range_error4 %f, %f\n",d, XFLOAT_DATA (arg)) ;
    383         xsignal2 (Qrange_error, build_string (name), arg);
    384         }
    385       arg = make_number (d);
    386     }

380行目の条件が成立して、デバッグprintf出力は「range_error4 nan, nan」 となってました。やっぱりどこで化けているのか分からないので、 gdb上で実行してみる事に。で、以下のようになってたり。

Breakpoint 1, rounding_driver (arg=-2130027057, divisor=<optimized out>,
    double_round=<optimized out>, int_round2=0x50b760 <round2>,
    name=0x767f70 <callint_argfuns+1668> "round") at floatfns.c:382
382               printf("range_error4 %f, %f\n",d, XFLOAT_DATA (arg)) ;
(gdb) where
#0  rounding_driver (arg=-2130027057, divisor=<optimized out>, double_round=<optimized out>,
    int_round2=0x50b760 <round2>, name=0x767f70 <callint_argfuns+1668> "round") at floatfns.c:382
#1  0x005086e4 in Ffuncall (nargs=2, args=0x67f9d34) at eval.c:2815
#2  0x0053990b in exec_byte_code (bytestr=7, vector=8575002, maxdepth=20, args_template=8575002,
    nargs=nargs@entry=0, args=0x2) at bytecode.c:916
#3  0x005081a5 in funcall_lambda (fun=-2146112275, nargs=nargs@entry=1,
    arg_vector=arg_vector@entry=0x67f9ea8) at eval.c:3045
#4  0x005084cb in Ffuncall (nargs=2, args=0x67f9ea4) at eval.c:2873
#5  0x0053990b in exec_byte_code (bytestr=7, vector=8575002, maxdepth=24, args_template=8575002,
    nargs=nargs@entry=0, args=0x2) at bytecode.c:916
#6  0x005081a5 in funcall_lambda (fun=6627165, nargs=nargs@entry=4,
    arg_vector=arg_vector@entry=0x67fa020) at eval.c:3045
#7  0x005084cb in Ffuncall (nargs=5, args=0x67fa01c) at eval.c:2873
#8  0x0053990b in exec_byte_code (bytestr=7, vector=8575002, maxdepth=28, args_template=8575002,
    nargs=nargs@entry=0, args=0x5) at bytecode.c:916
#9  0x005081a5 in funcall_lambda (fun=6627445, nargs=nargs@entry=3,
    arg_vector=arg_vector@entry=0x67fa188) at eval.c:3045
#10 0x005084cb in Ffuncall (nargs=4, args=0x67fa184) at eval.c:2873
#11 0x0053990b in exec_byte_code (bytestr=7, vector=8575002, maxdepth=20, args_template=8575002,
    nargs=nargs@entry=0, args=0x4) at bytecode.c:916
#12 0x005081a5 in funcall_lambda (fun=6628957, nargs=nargs@entry=1,
    arg_vector=arg_vector@entry=0x67fa2fc) at eval.c:3045
#13 0x005084cb in Ffuncall (nargs=nargs@entry=2, args=args@entry=0x67fa2f8) at eval.c:2873
#14 0x00508847 in call1 (fn=8608866, arg1=arg1@entry=-2134029331) at eval.c:2611
#15 0x004a3a61 in timer_check_2 (idle_timers=<optimized out>, timers=<optimized out>)
    at keyboard.c:4514
#16 timer_check () at keyboard.c:4581
 :
(gdb) p/x arg
$1 = 0x810a5dcf

argの値がイマイチよく分かりません。どうやらargは
/* Lisp floating point type.  */
struct Lisp_Float
  {
    union
    {
      double data;
      struct Lisp_Float *chain;
    } u;
  };

INLINE double
XFLOAT_DATA (Lisp_Object f)
{
  return XFLOAT (f)->u.data;
}
でdoubleの値を得ているようで、argはLisp_Floatのポインタで、 XFLOAT()っていう関数で加工している結果から察すると、

(gdb) p *(double*)(arg-7)
$8 = -nan(0x8000000000000)

って事らしい。Lisp_Objectは抽象化されている為、値の取り出しには 関数実行が必要なのですが、関数がインライン展開されていると デバッガで簡単に見られないのが辛い所です。

誰が非数を食わせているのかを知りたかったのですが、ポインタで 指されているとそれっぽい値をすぐに見られないので結局犯人を 特定できませんでした。

MinGW gdc調査。先日、コンパイル済み64bitMinGWバイナリを利用すると 再現しなかったのですが、最小コードが通らなかったりと 同じ状態で比べられないので、MinGW64でのビルドを試みる事に したり。ftw.hの件とか色々忘れてたり、 オリジナルのMinGW-gccでは赤○白×ダイアログの開くxgccが生成 されて先に進めなかったりとすったもんだしながらビルド。

どうにかビルドでき、再現コードをコンパイル&実行してみたところ 再現せず。先日の2.065でのコンパイルエラーもしなかったので、 なんとなくOKか?と思い、Winアプリのビルドを行って実行してみた 所、特定のコードでSegfault。文字列の連結でアレイ操作がずっこけて いるみたいなので、ダメだこりゃって感じ。

「月刊少女野崎くん」のアニメ。1クール遅れで録画消化(^^; なんか面白かったです。因みにこのアニメ、プレスコ (音を先に録って絵を後から付ける制作手法)だというのを知って へー と思ったり。毎週放送のTVアニメでプレスコってあんまり 聞いたこと無いかも。

2014/12/13

AM中に起床。休出。

MinGW gdc調査。そういや こちらのバイナリで、 32bit版がダメなのは確認しているのですが、 64bit版(2.065ですが)を試していなかったなぁ?と思い試してみたり。 で、またややこしい話でstd.regexを使用した最小コードはコンパイルが 通るのですが、それを元にしたTupleを使った最小コードはコンパイル エラーでコンパイルできなかったり。2.066や2.062のgdcだとコンパイルが 通るので油断していたのですがなんてこった。 で、コンパイルできるstd.regexを使ったコードをコンパイル&実行 してみると、特にエラーすることなし。

32bitと64bitの差に何か原因があるのか?

2014/12/12

気持ち早めに帰着。

あまりの眠さに急速停止。

2014/12/11

遅めに帰着。

ちょろり調べ事。

2014/12/10

気持ち早めに帰着。

少し前にnyan-modeがemacs -nwにも 対応したのを知ったのですが、たまたま-nwで立ち上げたままほったらかし にしてると、例のseconds-to-timeでArithmetic range errorが 起こっていたり。-nwではアニメーションはしないのであまり関係無い と思っていたのですが、そういう訳ではないらしい。 実は、誰が seconds-to-timeに非数を食わしているのか 分かっていなかった為、エラーした時にバックトレースが表示 できないか調べてみたり。ひとまず debug-on-error という変数を tに設定しておけば良いらしいという事でセットしてみたり。 あとは発生するのをひたすら待つ感じで。

ちょっとTV見てたらひっかかったり。

Debugger entered--Lisp error: (range-error "round" -0.0e+NaN)
  round(-0.0e+NaN)
  seconds-to-time(0.2)
  timer-relative-time((21640 22228 754752 0) 0.2 0 nil)
  timer-inc-time([t 21640 22228 754752 0.2 nyan-swich-anim-frame nil nil 0] 0.2 0)
  timer-event-handler([t 21640 22228 754752 0.2 nyan-swich-anim-frame nil nil 0])

因みに 関数seconds-to-timeの実体はlisp/calendar/time-date.elに入ってて、 以下の様なソースになってます。

(defun seconds-to-time (seconds)
  "Convert SECONDS (a floating point number) to a time value."
  (let* ((usec (* 1000000 (mod seconds 1)))
         (ps (round (* 1000000 (mod usec 1))))
         (us (floor usec))
         (lo (floor (mod seconds 65536)))
         (hi (floor seconds 65536)))
    (if (eq ps 1000000)
        (progn
          (setq ps 0)
          (setq us (1+ us))
          (if (eq us 1000000)
              (progn
                (setq us 0)
                (setq lo (1+ lo))
                (if (eq lo 65536)
                    (progn
                      (setq lo 0)
                      (setq hi (1+ hi))))))))
    (list hi lo us ps)))
seconds-to-timeには0.2しか食わしていないのに、何故かroundに非数 が入ってて、はぁ?って感じ。因みに、scratchバッファで0.2を食わした 結果は以下。

(seconds-to-time 0.2)
(0 0 200000 0)

いや、そうなるよね?データが化けるという一番厄介なパターンかも。

2014/12/09

回復せず一日休業。

ほぼ寝て過ごすも、頭が痛くて全然眠れない感じ。 午後もいい時間にやっと起きられるようになったり。

2014/12/08

具合が悪くて早めに帰着。

飯食ったら即死。

2014/12/07

AM中に起床。

掃除したり。

MinGW gdc調査。先日の再現コードを食わせてFedoraのgdcのGIMPLEダンプ (今回はGENERIC)とMinGW gdcのそれとを比べてみたり。ファイルパス文字列や 自動生成ラベルの番号とかの違いはあるものの、基本的には同じという感じ。 一点違うのが、いくつかの箇所で戻り値の表現?が異なっていました。

diff_generic

一例ですが、左がFedora、右がMinGWのgdcで出力した.originalファイルで、 画像の4780,4782,4800行目が違っている所です。戻り値に関する 表現が若干異なっているのですが、直接代入か間接代入かの違い でしかないのかな?と思ったりも。この.originalファイルが全く 同じであれば、その後のステップで変になっていると言えるの ですが、微妙に違っているのが面倒臭い感じです。

.originalファイルを入力にできれば、Fedoraの方のそれっぽくちょこっと 書き換えて食わせてみるという手があるのですが、それはできなさそう な予感。

ずっこけの直接の原因になっている箇所に相当するGENERICを見てみるも、 特に違いは無さげ。怪しいのはやっぱり 引数が無くなる瞬間なのですが、 GENERICの文法が良く分からないので、どのように表現しているのか よく分からなかったり。

「新世紀エヴァンゲリオン(14)」。貞本エヴァもこれで終わり。 本誌連載終了してからコミックが出るまでに随分時間がかかりましたが、 新劇場版の最終話に合わせるつもりが結局合わなかったから? さておき、基本的には旧劇場版のままという感じでした。 最後の書き下ろしが新劇場版とちょっと関係しているという所でしょうか。

2014/12/06

AM中に起床。休出。

MinGW gdc調査。もう少し詰める事ができたり。

void main()
{
  struct Foo{
    string s ;
  }
  string dic[Tuple!(Foo)] ;

  Foo x = {s:"foo"} ;
  dic[tuple(x)] = "foo:0" ;
}

は再現しますが、

void main()
{
  struct Foo{
    string s ;
  }
  string dic[Foo] ;

  Foo x = {s:"foo"} ;
  dic[x] = "foo:0" ;
}

だと再現しません。で、GIMPLEで何か分かるかと-fdump-tree-original で見てみると、Tupleを使った方は山ほどコードが出てきて なんじゃこりゃ?って感じに。

2014/12/05

遅めに帰着。

MinGW gdc調査。どうにか再現できてみたり。

$ cat -n mingwgdcfailed_test2.d
     1  import std.stdio;
     2  import std.typecons;
     3  import std.string;
     4
     5  void main()
     6  {
     7    struct Foo{
     8      string s ;
     9    }
    10    string dic[Tuple!(Foo,int)] ;
    11
    12    Foo x = {s:"foo"} ;
    13    dic[tuple(x,0)] = "foo:0" ;
    14  }

$ gdc -g mingwgdcfailed_test2.d

$ gdb -q ./a.exe
Reading symbols from C:\cygwin\home\TANE\develop\dlang\test\dmd2065gcc490\a.exe...done.
(gdb) run
Starting program: C:\cygwin\home\TANE\develop\dlang\test\dmd2065gcc490\a.exe
[New Thread 6412.0x55c]

Program received signal SIGSEGV, Segmentation fault.
0x0040b213 in rt.typeinfo.ti_Ag.TypeInfo_Aa.getHash() (this=..., p=0x526a20)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/rt/typeinfo/ti_Ag.d:128
128             foreach (char c; s)
(gdb) where
#0  0x0040b213 in rt.typeinfo.ti_Ag.TypeInfo_Aa.getHash() (this=...,
    p=0x526a20)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/rt/typeinfo/ti_Ag.d:128
#1  0x004083f1 in object.TypeInfo_Const.getHash() (this=..., p=0x526a20)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/object_.d:1211
#2  0x0040149a in mingwgdcfailed_test2.main() (p=...)
    at mingwgdcfailed_test2.d:7
#3  0x0040764e in object.TypeInfo_Struct.getHash() (this=..., p=0x526a20)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/object_.d:981
#4  0x004c1c45 in std.typecons.__T5TupleTS20mingwgdcfailed_test24mainFZ3FooTiZ.Tuple.toHash() (this=...)
    at c:/mingw/gdc031_2066_50x/include/d/5.0.0/std/typecons.d:581
#5  0x0040764e in object.TypeInfo_Struct.getHash() (this=..., p=0x28fb3c)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/object_.d:981
#6  0x0042469b in _aaGetX (aa=0x28fb28, keyti=..., valuesize=8, pkey=0x28fb3c)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/rt/aaA.d:170
#7  0x004013e7 in D main () at mingwgdcfailed_test2.d:13
#8  0x00402f0e in __lambda1 (this=0x28fe98)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/rt/dmain2.d:410
#9  0x00402df3 in rt.dmain2._d_run_main() (this=0x28fe98, dg=...)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/rt/dmain2.d:385
#10 0x00402ea8 in runAll (this=0x28fe98)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/rt/dmain2.d:410
#11 0x00402df3 in rt.dmain2._d_run_main() (this=0x28fe98, dg=...)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/rt/dmain2.d:385
#12 0x00402d10 in _d_run_main (argc=1, argv=0xa94ea0,
    mainFunc=0x40134a <D main>)
    at ../../../../gcc-5-20140831/libphobos/libdruntime/rt/dmain2.d:418
#13 0x00401348 in main (argc=1, argv=0xa94ea0)
    at c:/mingw/gdc031_2066_50x/include/d/5.0.0/__entrypoint.di:59
(gdb)

連想配列のキーに、string型を含む構造体と任意の型をセットにした Tupleを使用するというのがポイントみたい。

2014/12/04

遅めに帰着。

MinGW gdc調査。構造体と連想配列を組み合わせた時が怪しい気が するのですが再現できず。

2014/12/03

遅めに帰着。

emacs-git-gutter というモードの存在を知ったり。Git管理下に置かれているファイルの 更新箇所をリアルタイムに表示するというもので、本格的に使っては いませんがちょろっと試した感じとても良さげに思いました。

2014/12/02

遅めに帰着。

MinGW gdc調査。連想配列を使った場合に再現しそうな感じですが、 regexのコードを元にちょっと試した所では再現できず。

2014/12/01

遅めに帰着。

MinGW gdc調査。特に掴めるものは無し。


TOP PREV