SLI(Simple and Light Interface) ライブラリ for C users

このページで紹介するライブラリ 「SLLIB」 「SFITSIO」は, JAXA・宇宙科学研究所の「あかり」プロジェクトで生まれた 科学用途における日常的Cプログラミングを真に効率化する C++ライブラリです.

右図のように, C++ の一般的なライブラリのように 「汎用化」「抽象化」を追及したものではなく, PythonやIDLのようなプログラマに優しい【実用的な言語環境】 を目指しています.

C++ は勉強したくないが, C言語+αの知識で正規表現,文字列の配列・連想配列,多次元配列を パパッと扱いたい方, APIの呼出し手順大杉な CFITSIO にうんざりしている方にお勧めします.

現在,JAXAデータセンターの基幹部分で利用されています.

English edition  back to Chisato's page

連絡は下記まで
EMAIL: cyamauch (at) ir.isas.jaxa.jp


目次


SLLIB --- ISAS/JAXAデータ利用G 公式ソフトウェア

◆SLLIBとは?

「C で正規表現が手軽に使えたら…」
「C で trim とか split とか無いの?」
「C で IDL みたいに [0:99, *] とかできないの?」
「圧縮ファイル読むのに gzopen() とか一々叩くの面倒なんだけど」
このように思った経験は誰しもあるはず…

 SLLIB (えすえるりぶ) は, 「1.ストリーム」「2.文字列」「3.多次元配列」の『3点セット』について, スクリプト言語のような API を C/C++ 環境で使えるようにし, 科学研究に適した 【実用的な言語環境】を提供する 基本クラスライブラリです. スクリプト言語にはあるのに, 標準的C/C++環境ではなぜか抜け落ちているAPIを追加し, より効率的な日常的プログラミングを可能にします.
 このライブラリにより,C/C++環境で, Webサーバ上のファイルや圧縮ファイルが 透過的かつ統一的に扱えるようになったり, 文字列の編集,正規表現(POSIX拡張正規表現),連想配列,多次元配列が スクリプト言語のように簡単に扱えるようになります. 例えば,次のようなコードが書けるようになります.

/* Webサーバ上のファイルを読み込みモードで開く */
f_in.open("r", "http://www.ir.isas.jaxa.jp/index.html");
/* 空白区切りの文字列を分割して配列に入れ,各要素の左右の空白を除去   */
/* ただし,クォーテーションに囲まれた空白は,区切り文字とはみなさない */
array.split("winnt 'program files'", " ", false, "'", "\\", false).trim();
/* 3次元配列の一部を取り出す */
array1 = array0.sectionf("0:99, *, 0");

printf(),atof() に代表される LIBC の作法や関数名を できるだけ踏襲する事を基本とし, PHP や IDL も参考にしながら API を策定していますので, プログラミング経験の少ない方でも抵抗なくお楽しみいただけます. また,コンパイルを行なうためのスクリプト(s++)もインストールされますので, Makefileの知識も不要です.

 SLLIBは,元々はSFITSIOの実装のために開発したライブラリです. SFITSIOのストリーム入出力機能は, 通常のファイルだけでなく,圧縮ファイルやネットワークにも対応していますが, これはSLLIBで実現しているわけです.

 SLIとは,Simple and Light Interface の略です. 仕組みは単純だけど,簡単に使えて安全・確実, それでいてカユい所に手が届く…, そんなライブラリを目指しています. なお,このページのSLIは,nvidiaとは関係ありません.

◆SLLIBの品質とサポート

 SLLIB は, 第三者によるC1試験,または動作テストとレビューを実施した 品質の高いライブラリです. JAXAの資産として登録され,主に宇宙科学研究所で利用されています.
 開発は,山内と宇宙科学研究所のデータセンター(C-SODA)が共同で行なっており, C-SODAの公式サポートソフトウェアとして認定されています.

◆よくある質問

Q:「C++標準 + boostぢゃダメなの?」

A: 「C++標準ライブラリやboostはアルゴリズム集+αとしては 確かに強力です.しかし,それは『実用的なAPIがすぐ使える』 というわけではなく,良くできた汎用コンテナを組み合わせて, 『自分で実用的なものを作る』プログラミング環境と言えます. 一方で,スクリプト言語の環境(PythonとかPHPとか)というのは, 最初から実用的な API が揃っています. SLLIBは後者のようなものを目指しています. つまり方向性が違うんですね」

SLLIBの開発のキッカケは, C++に触れた当初の「C++のクラスを使えば スクリプト言語のような開発環境が作れるのに, どうしてそうなっていないのだろう?」という素朴な疑問です.

Q:「スレッドセーフですか?」

A:「単純な設計により,スレッドセーフです.」

ソースパッケージとドキュメント

 2015年11月20日に新しい安定版 Version 1.4.5 をリリースします.
 ライセンスは,GPL・MITライセンスから選択できます.  

●1.4系列(安定版)
 1.2系列に引き続き,機能強化と高速化を行なったものです. 1.4.2では,mdarrayクラスのshallow copyに関する問題を修正しました.
ソース一式 (sllib-1.4.5.tar.gz)
 1.4系列では,SIMD命令等によるパフォーマンス改善, IDLのように文字列でn次元配列を扱うためAPI, 画像解析用のAPI,画像のxとyとの高速transpose, 高速回転(90度単位)等のためのAPIが追加されています.
 マニュアルは現在,更新中です.
ダイジェスト版 HTMLマニュアル【更新中】
日本語基本編マニュアル【更新中】(sllib-1.4.2.pdf)
 1.4系列をより便利に使うには上記マニュアルでは不十分です. 最新の情報は,下記の HTML 文書かヘッダファイルをご覧ください.
 doxygen で生成した HTML 文書が以下にあります.
HTML文書(publicのみのメンバ関数) HTML文書(すべてのメンバ関数) by 小池様
 上級編については,1.1系列のマニュアルをご覧ください.
日本語基本編マニュアル(sllib-1.2.1.pdf)
日本語上級編リファレンスマニュアル(sllib_advanced-1.1.pdf)

●1.2系列(旧版)
ソース一式 (sllib-1.2.1f.tar.gz)

「コピペ」で試して使えるSLLIB 実用コード集

 サンプルプログラム集です. やはりコピペで使えると便利ですよね. 少しずつサンプルを増やしていきます.

●Version 1.4.2のヘッダファイル

 対応しているOSは,Linux,FreeBSD,MacOSX,Solaris,Cygwinです. 各OSとも,make一発でビルドできます. ビルドには,zlib,bz2lib,readlineが必要です.

●作り方

※IDEにソースを登録してビルドしないでください

$ gzip -dc sllib-xxx.tar.gz | tar xvf -
$ cd sllib-xxx
$ make
$ su
# make install32

 64-bit OS の場合,最後の install32 を install64 としてください.
 なお,MacOSX等で,64-bit用ライブラリを作りたい場合,
$ make CCFLAGS=-m64
等とすると便利です.
 パッケージャの方は,PREFIXDESTDIR のオーバーライドが使えますので, いつものように簡単にパッケージングできます.


SFITSIO --- ISAS/JAXAデータ利用G 公式ソフトウェア

 SFITSIO (えすふぃっつあいおー) は, プログラマの負担を極限まで小さくするために新規に開発した, C言語ユーザのための次世代のFITS I/Oライブラリです. FITSの構造さえ理解していれば,直感的に記述できるAPIになっています. したがって,一度使えばAPIを忘れる事がないので, いちいちマニュアルを見ながらFITSのI/Oを書く, という煩わしさから開放されます. Image,Ascii Table,Binary Tableの読み書きが可能です. いくつかのCFITSIO拡張にも対応しています.

対象ユーザ Level Image Group ATE BTE BTE文字列配列 BTE多次元配列 BTE可変長配列 CONTINUEヘッダ
C言語 or C++ユーザ Medium rw - rw rw rw rw rw(低レベルAPIのみ) rw

ライブラリの設計上C++コンパイラを必要としますが, SFITSIOのAPIはC++標準ライブラリのクラスにはほとんど依存していません (むしろprintf()などのC言語の作法を多用しています). したがって,C++を知らない方でも簡単に利用可能です.

 SFITSIO も SLLIB と同様, JAXAの資産として登録され,主に宇宙科学研究所で利用されています. 開発・サポートは, 山内と宇宙科学研究所のデータセンターが共同で行なっています.

ソースパッケージとドキュメント

 2015年11月20日に新しい安定版 Version 1.4.5 をリリースします.
 ライセンスは,MITライセンスです.科学論文,技術論文で このソフトウェアを利用した場合, 謝辞を表記してください(この条項は,将来削除される可能性があります). ソフトウェア開発(OSディストリビューション等)での利用については, 謝辞の表記は不要です.

●1.4系列(安定版)

 1.2系列に引き続き,機能強化と高速化を行なったものです. SLLIB-1.4系列と同時に使う必要があります.
ソース一式 (sfitsio-1.4.5.tar.gz)
 1.4系列では,SIMD命令等によるパフォーマンス改善, IDLのように文字列でn次元配列を扱うためAPI, 画像解析用のAPI,画像のxとyとの高速transpose, 高速回転(90度単位)等のためのAPIが追加されています.
 マニュアルは現在,更新中です.
ダイジェスト版 HTMLマニュアル【更新中】
日本語基本編マニュアル【更新中】(sfitsio-1.4.2.pdf)
 1.4系列を使うには上記マニュアルでは不十分です. 最新の情報は,HTML文書かヘッダファイルをご覧ください.
 doxygen で生成した HTML 文書が以下にあります.
HTML文書(publicのみのメンバ関数) HTML文書(すべてのメンバ関数) by 小池様

SFITSIO-1.4では,read_stream()で指定するファイル名で "foo.fits[1:100,*]" のような記述が可能で, かなり柔軟な画像やテーブルの部分読み出しが可能になっています. 特徴的なのは,複数のHDUの特定の部分の読み出しができる事です. これにより,テーブルの一部データだけの取り出しも簡単にできますし, ファイルの最後に(zero-paddingのような)不正なデータがついたFITSも正しい部分だけ読み出せます. この機能については,下記に少しだけ詳しく説明します:

◆SFITSIO-1.4 でもサポートしている CFITSIO/IRAF 的書き方

  Primary と Image HDU については,CFITSIO/IRAF と同じ記法が可能
で,画像の反転もサポートしています.

例1: Primary HDUの画像の一部分を読む
      "foo.fits[1:200,1:100]"

例2: Primary HDUの画像の一部分を読んで,左右を反転させる
      "foo.fits[200:1,1:100]"      ← 一部分だけ読み出して左右反転
      "foo.fits[-*,*]"             ← すべて読み出して左右反転

例3: Image extension の画像の一部分を読む
      "foo.fits[1][1:200,1:100]"

◆SFITSIO-1.4 公式の書き方について

  複数のHDUを指定できるようにしたいので(たぶんTSDの時に便利),
より論理的な仕様としています.

*一般的なルール

 - ファイル名直後における,同じ階層の "[" "]" ペアは一組だけとし,
   [] の中にセミコロン区切りで複数の HDU に関する指定を書く.
     "ファイル名.fits[HDU指定A; HDU指定B; HDU指定C; ... ]"

 - 各HDU指定には,階層が一つ下の [] か () で画像の領域またはテーブル
   の領域を指定できる.[]の場合は1-indexed,()の場合は0-indexed.
     "ファイル名.fits[HDU指定A[1-indexedでの画像orテーブルの区間]; ... ]"
     "ファイル名.fits[HDU指定A(0-indexedでの画像orテーブルの区間); ... ]"

 - HDUのタイプ,HDUのversionを指定する場合は「::」で区切る
     "ファイル名.fits[HDUタイプ::HDU名::HDUバージョン[...]; ... ]"
   「::」で区切られた要素が 2 つの場合は「HDUタイプ」が省略されたものと
   みなす.

 - HDUの指定の直後に,「{n}」で読むべきHDUの数を限定でき,ディスク
   アクセスを最小化できる.*例*を参照(4番目).

 - "foo.fits [ 0 [ 1:100, * ] ]" のような空白入りの指定でもOK.

 - 画像とテーブルの領域の指定については,下記の例を参照.


*例*

 + 複数のHDUを指定して読む.
     "foo.fits[0;1;4]"            ← Primary と extension番号1,4を読む

 + 特定のHDUだけ読まない
     "foo.fits[-2]"               ← extension番号2 以外すべて読む

 + 文字列マッチするHDUのみ読む
     "foo.fits[EVENT*]"

 + 文字列マッチするHDUのうち最初の2つのみ読む
     "foo.fits[EVENT*{2}]"

 + バイナリテーブルのみ全部読む
     "foo.fits[b::*::*]"

 + Image HDUの画像の一部分を読む(意味は例3と同じ)
     "foo.fits[1[1:200,1:100]]"
     "foo.fits[1(0:199,0:99)]"    ← 0-indexed

 + 3次元 Image の最初の1枚だけ読む
     "foo.fits[0[*,*,1]]"

 + バイナリテーブルの指定(行の指定はimageの場合と同様)
     "foo.fits[EVENT[1:10,1:100]; ...]"               ← カラム番号の区間で指定
     "foo.fits[EVENT[col1;col2;...,1:100]; ...]"      ← カラム名で指定
     "foo.fits[EVENT::2[col1;col2;...,1:100]; ...]"
     "foo.fits[b::EVENT::2[col1;col2;...,1:100]; ...]"
     "foo.fits[b::EVENT::2(col1;col2;...,0:99); ...]" ← 0-indexed

●1.2系列(旧版)

ソース一式 (sfitsio-1.2.1c.tar.gz) requires sllib-1.2.1
日本語マニュアル (sfitsio-1.2.1.pdf)

●Version 1.4.4のヘッダファイル

 対応しているOSは,Linux,FreeBSD,MacOSX,Solaris,Cygwinです. 各OSとも,make一発でビルドできます. ビルドには,SLLIB のインストールが必要です.

●作り方

※IDEにソースを登録してビルドしないでください
SFITSIOの前に, 1.4系列の場合は SLLIB-1.4.2以降を インストールしてください. その後,次のようにビルドします.

$ gzip -dc sfitsio-xxx.tar.gz | tar xvf -
$ cd sfitsio-xxx
$ make
$ su
# make install32

 64-bit OS の場合,最後の install32 を install64 としてください.
 なお,MacOSX等で,64-bit用ライブラリを作りたい場合,
 $ make CCFLAGS=-m64
等とすると便利です.
 パッケージャの方は,PREFIXDESTDIR のオーバーライドが使えますので, いつものように簡単にパッケージングできます.


発表資料・講習会資料


リンク


Last Modified: Nov.20,2015