Hatena::ブログ(Diary)

どせいけいさんき。 RSSフィード

 

February 20, 2013

SLLIB-1.4.0, SFITSIO-1.4.0 の導入でハマった件

症状

コンパイルでは問題なかった.ダウンロードしてきた tar.gz ファイルを展開.MakefileCFLAGS-m64 を設定して make && make install64 すれば SLLIB も SFITSIO もインストールはできた.

問題が起こったのは実際に自分のプログラムで使おうとしたとき.コンパイルしようとすると.

'isfinite' was not declared in this scope

という感じのエラーが出た.

なお,使用しているコンパイラは g++ でバージョンは以下のとおり.

$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

問題

エラーが出たあたりのソースを見ると isfinitestd:: などなしにそのまま記述してある.インクルード元だと思われるヘッダファイル math.h を見てみる.isfinite#define マクロとして定義されている.

/* Return nonzero value if X is not +-Inf or NaN.  */
# ifdef __NO_LONG_DOUBLE_MATH
#  define isfinite(x) \
     (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
# else
#  define isfinite(x) \
     (sizeof (x) == sizeof (float)                                            \
      ? __finitef (x)                                                         \
      : sizeof (x) == sizeof (double)                                         \
      ? __finite (x) : __finitel (x))
# endif

自分のプログラムを見ると cmath をインクルードしていた.このヘッダファイルをみてみると

// These are possible macros imported from C99-land.
#undef fpclassify
#undef isfinite
#undef isinf
#undef isnan
#undef isnormal
#undef signbit
#undef isgreater
#undef isgreaterequal
#undef isless
#undef islessequal
#undef islessgreater
#undef isunordered

ということで #undef していた.そのせいでエラーが発生していたようである.


暫定的な解決方法

cmath を使わずに math.h だけ使用する……というのがひとつの解決策.ただし,cmath を使用する機会はあるのではないかという気がしたので SLLIB, SFITSIO をちょっと書き換える.

具体的には grep コマンドで isfinite を使用しているソース,ヘッダファイルを同定して s/isfinite/std::isfinite/で置換した.また, math.h をインクルードしているヘッダファイルでは並行して cmath もインクルードするようにした.


この方法で自分の作成していたプログラムはとりあえず動作するようになった.しかし,cmath では他にもいろいろなマクロを #undef している.同種の問題は他の場所でも起こりうるかもしれないので,今回の対応を忘れないようにしたい.


参考資料

February 14, 2013

Zotero でエクスポートした bib ファイルと apj.bst の相性が悪いらしい

問題

論文管理ソフトウェアとして http://www.zotero.org/:Zotero を使用している.NASA/ADSデータベースから取得したした文献データを BibTeX 用のファイルにエクスポート.この bib ファイルと NASA/ADS からダウンロードしてきた apj.bst ファイルを使用してコンパイルしたら BibTeX が以下のようなエラーを吐いた.

You can't pop an empty literal stack for entry SOME_BIBLIOGRAPHY_20XX
while executing---line 1676 of file apj.bst

解決方法

apj.bst ファイルの 1676 行目はイテレーションを回しているだけのようなので関係ないらしい.

  • エラーを吐いたアイテムはすべて @article である.
  • エラーから察するに空っぽになったスタックからまた呼び出しているっぽい.

以上の推測から apj.bst のなかで @article を処理している部分に注目.一行ずつコメントアウトしてどこが問題なのかを切り分けた.最終的にあるブロックを以下のようにコメントアウトすることでエラーを消すことができた.

--- apj.bst.orig	2013-02-14 20:02:51.266775055 +0900
+++ apj.bst		2013-02-14 19:26:28.069025488 +0900
@@ -1090,10 +1090,10 @@
       format.pages output
     }
   if$
-  pages empty$
-    { format.eprint output }
-    { format.journal.pages output }
-  if$
+%  pages empty$
+%    { format.eprint output }
+%    { format.journal.pages output }
+%  if$
   format.journal.pages
   format.note output
   fin.entry

推測

どうやら format.journal.pages の周辺でエラーが発生しているらしい.コメントアウトした format.journal.pages 直後の output を消してもエラーは出なかった.この関数の仕様をちゃんと読めばもう少し問題の切り分けができるかもしれない.

あくまで推測に過ぎないが, Zotero に保存した文献データの pages に開始ページしか含まれていないことが問題なのではないかという気もしている. apj.bst はもともと NASA/ADS が出力する bib ファイルに特化しているはずである. NASA/ADS からダウンロードした bib ファイルの書式と Zotero が出力した bib ファイルの書式を見比べることで更に問題が切り分けられるかもしれない.面倒なので検証はしていない.


参考資料

February 13, 2013

SLLIB-1.4.0, SFITSIO-1.4.0 がリリースされたらしい件

JAXA 宇宙科学研究所の山内さんが開発している SLLIB, SFITSIO の新しいバージョンがリリースされたらしい.


今回のは SIMD を使った高速化と,IDL 風の要素指定ができる API が目玉です.

  /* 切り出してコピー */
  array1 = array0.sectionf("0:99, *");
  /* 左右反転 */
  array.flipf("-*,*");
  /* 高速トランスポーズ(xとyとの入れ替え) */
  array.transpose_xy();

のような事ができるようになりました.

特に「領域を切り出してコピー」は使いやすそう.画像を読み込む際に IRAF 的な記述も可能になっているらしい.従来のものに比べて高速化も実現しているという話なので実際に使ってみるのが楽しみ.

参考資料

December 03, 2012

Ubuntu 12.10 に ds9, xpa, iraf をインストールする

研究で使うソフトウェアのインストール.


ds9, xpa

最新版の ds9, xpa はここからダウンロードできる.バイナリで配布されているのでコンパイルする必要なくインストールできる. ds9 のバージョンは 7.1, xpa のバージョンは 2.1.14 を使用する.

sudo apt-get install libxss1
cd /usr/local/src/
mkdir ds9-7.1; cd ds9-7.1
tar zxvf ~/Downloads/ds9.linux64.7.1.tar.gz
ln -s /usr/local/src/ds9-7.1/ds9 /usr/local/bin/.

cd /usr/local/src/
mkdir xpa-2.1.14; cd xpa-2.1.14
tar zxvf ~/Downloads/xpa.linux64.2.1.14.tar.gz
ln -s /usr/local/src/xpa-2.1.14/* /usr/local/bin/.

iraf, x11iraf

iraf, x11iraf ともに最新版をここからダウンロード. iraf は Linux 64bit 版 をダウンロード. x11iraf は 24 bit 版をダウンロード.バージョンはそれぞれ iraf-2.16, x11iraf-2.0beta となる.

iraf はすでにコンパイルしてあるので環境変数 iraf をセットしてインストールスクリプトを走らせるだけで完了する.あとは必要に応じてパッケージを make する.

sudo apt-get install tcsh
cd /usr/local/share
mkdir -p iraf/iraf; cd iraf/iraf
tar zxf ~/Downloads/iraf.lnux.x86_64.tar.gz
export iraf=/usr/local/share/iraf/iraf
${iraf}/unix/hlib/install
cd ${iraf}/extern
sudo ./configure
sudo make stsdas

残念ながら x11iraf はコンパイルしてあるものをダウンロードしてきたのだけどなぜか起動しなかった.似たような問題は以前にもあった.

./xgterm: error while loading shared libraries: libXmu.so.6: wrong ELF class: ELFCLASS64

最初は libXmu.so.6 がないと言ってきたので LD_LIBRARY_PATH で指定してあげたら今度はこういったエラーになった. google 先生に聞いたところによるとこれは 32bit を期待してライブラリを見に行ったら 64bit じゃないかどうしてくれるんだチクショウ!ということらしいので 32bit のライブラリをインストールすることにした.

Xubuntu 10.04 64bit で xgterm が起動しなかった問題 - どせいけいさんき。

ただし今回発生したエラーは

bash: /usr/local/bin/xgterm: No such file or directory

……これは 32bit 版ライブラリをインストールしても解決しないのではないかと思ったので,ソースからコンパイルすることに.基本的には configure (xmkmf) して make すれば良いのだけどそのままではコンパイルが通らない.

sudo apt-get install xutils-dev bison flex
sudo apt-get install libxmu-dev libxaw7-dev
cd /usr/local/src
mkdir x11iraf; cd x11iraf
tar zxvf ~/Downloads/x11iraf-v2.0BETA-src.tar.gz
xmkmf
## (ここでソースをちょっといじる)
make World
sudo ./install

まず訂正した部分は obm/ObmW/Imakefile の 24 行目で

 20  #if defined (PpcDarwinArchitecture) || defined (TenonServer)
 21          CCOPTIONS = -traditional-cpp
 22  #endif 
 23  
-24  #if ((GccMajorVersion == 3) && (GccMinorVersion >= 1))
+24  #if ((GccMajorVersion >= 3) && (GccMinorVersion >= 1))
 25          CCOPTIONS = -DUSE_STDARG
 26  #else
 27          CCOPTIONS =
 28  #endif

もうひとつ訂正した部分は xgterm/button.c の 43 行目で

 39  #include "data.h"
 40  #include "error.h"
 41  #include "menu.h"
 42  
-43  extern char *malloc();
+43  extern void *malloc();
 44  

以上を直せばちゃんとコンパイルが通るようになる.なお,実際に使ってみてエラーが出るかどうかはまだ確認していない.

September 07, 2012

Xubuntu 12.04 に SLI ライブラリ(SLLIB, SFITSIO)をインストール

f:id:xr0038:20120907185948p:image


SLI ライブラリとは

開発者である山内さんのページから引用.

JAXA宇宙科学研究所の「あかり」プロジェクトで生まれた,

C言語における日常的プログラミングを真に効率化するライブラリ

混沌とした「C言語 + C++環境」, APIの呼出し手順大杉な「CFITSIO」にうんざりしている方にお勧めします.

SLI ライブラリ for C users

なんだか面白そうなのでインストールしてみることにした.普段は Octave (MATLAB) や IDL で計算をしているのだけど,このライブラリを使えばほぼ同じようにして計算が実装できるような気がする.日本語のドキュメントが付いているのも初心者には嬉しい.


インストール方法

プロジェクトページに書いてある通りだった.

  1. アーカイブをダウンロードする
  2. 展開する
  3. make
  4. sudo make install64

末尾の 64 はインストールしたマシンが 64bit だったからであって 32bit マシンにインストールするときには 32 に変更する.ドキュメントには簡単なチュートリアルが付属しているのでとりあえず動かしてみたのが冒頭の画像.実際にはうねうねアニメーションしている. SFITSIO のテストはまだ.

September 06, 2012

すばる望遠鏡プロポーザル提出用の TeX テンプレートをダウンロードする

ダウンロードのしかた

ProMS 2.0 の ログインページ > FAQ に記載してあるリンクからダウンロードページに飛べる.


直接飛びたい方はこちら*1

https://proms.naoj.hawaii.edu/proms2/templates.html

*1:ただし最新版を使ったからといってテンプレートに記載した内容が全て反映されるわけではないことに注意…….

August 24, 2012

Xubuntu 10.04 64bit で xgterm が起動しなかった問題

f:id:xr0038:20120824143652p:image


xgterm を起動しようとするとエラーが出る

./xgterm: error while loading shared libraries: libXmu.so.6: wrong ELF class: ELFCLASS64

最初は libXmu.so.6 がないと言ってきたので LD_LIBRARY_PATH で指定してあげたら今度はこういったエラーになった. google 先生に聞いたところによるとこれは 32bit を期待してライブラリを見に行ったら 64bit じゃないかどうしてくれるんだチクショウ!ということらしいので 32bit のライブラリをインストールすることにした.


Xubuntu 10.06 64bit に 32bit のライブラリをインストール

どうやら ia32-libs をインストールすればよいらしいのだけど,

The following extra packages will be installed:
  bluez-alsa:i386 gtk2-engines:i386 gtk2-engines-murrine:i386
  ... 中略 ...
  libxmu6:i386 libxp6:i386 libxslt1.1:i386 libxss1:i386
  odbcinst odbcinst1debian2 odbcinst1debian2:i386 xaw3dg:i386

といった感じで 60 個超のあらたなパッケージをインストールすることになりそうだったので今回は必要なパッケージだけをインストールすることに.必要なライブラリの後ろに :i386 をつければ 32bit 版のライブラリがインストールできるような気がする.

[ohsawa@hamatta bin.linux ]$ sudo apt-get install libxmu6:i386
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  libxmu6:i386
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 52.4 kB of archives.
After this operation, 144 kB of additional disk space will be used.
Get:1 http://jp.archive.ubuntu.com/ubuntu/ precise/main libxmu6 i386 2:1.1.0-3 [52.4 kB]
Fetched 52.4 kB in 0s (137 kB/s) 
Selecting previously unselected package libxmu6:i386.
(Reading database ... 274330 files and directories currently installed.)
Unpacking libxmu6:i386 (from .../libxmu6_2%3a1.1.0-3_i386.deb) ...
Setting up libxmu6:i386 (2:1.1.0-3) ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place

というわけでできた. xgterm も問題なく起動した.