Swiss Ephemerisを使って「どこでも占星術!」


■概要

Swiss Ephemeriss にある占星術用計算プログラムを使って、WindowsCE上で天体位置計算を行います。
本来ならGUIでuserfrendlyにしたいところですが、eMVCで開発をするのは大変なので、CE機上にWebServerを立ち上げ、BrowserのGUIを使って行います。これなら、eMVCに依存するところは限られ、Windows/Linux上で動作検証を行うことができるので、とても開発が楽になります。
初期段階では計算結果を数値で出す程度ですが、いずれはPNGファイルなどでvisualに出せるようにしたいと思います。ただ、WebBrowserの性質上、interactiveにするかどうかは?です。

また、CGIですのでインターネット上のサーバー上に置くことにより、CE機でなくても(i-modeとかでも!)、どこからでもhoroscopeの作成が可能になります。

ソースコードはすべて公開しているので、興味のある方は挑戦してみてください。

■実行方法(WinCE版)

実行環境

Windows CE PocketPC2002 ARM
※これ以外の機種でも動作させたい場合は、下記の開発方法を参照してご自分で行ってください。
※それができないという方は・・・有料で請け負いましょうか??:-)

必要なリソース

HTTP Server(CEHTTP) - CE機用の軽いWebServer
Swiss Ephemeris - Download Areaから下記のファイルを取得

???以下 - エフェメリスデータ

swephe-ce.zip

インストール

CEHTTPを説明書に従ってインストール、セットアップを行う。(標準的な設定でOK)

swephe-ce.zip を解凍すると次のファイルがあります。
swedllce.dll - swiss ephemerisの本体DLL
ceastro.chx - ceastro CGI
*.html, *.shtml - HTMLファイル

これらを適当なCE機上のフォルダーへコピーする。
例えば、\wwwroot\script\ceastro

動作テスト

PC上(またはCE機上)のブラウザーから、
http://address/scripts/ceastro/ceastro.chx
でwelcome pageが出てきます。

■実行方法(Linux版)

思案中・・・Makefileを作ればできると思いますが・・・

■実行方法(Windows版)

下記の開発方法を参考にすればできます(手抜き)

■開発方法

必要なリソース

Swiss Ephemeris - Download Areaから下記のファイルを取得

sweph161以下 - DLLのソースコード一式

次のファイルをダウンロード
sweph-ce.zip - WinCE用DLL作成プロジェクトファイル
ceastro.zip - ceastro.dll およびデバッグツール類作成用プロジェクトファイル

これらを適当なディレクトに展開。

私は次のようなディレクトリ構成。

PC上のWebServerで動作テストを行う場合は、WebServerが必要です。

開発環境

eMVC 3.0(フリー) - CE用のDLL swedllce.dll 作成用
VisualC++(有料) - Windowsデバッグ用のDLL swedll32.dll 作成用
C++Builder5(有料、フリー版もある) - Windowsデバッグ用の実行ファイル test.exe 作成用

PC上でのデバッグを行わないのであれば、eMVCだけで作成できます。
VisualC++は作者が6.0しかもっていないので 6.0専用になっていますが、オリジナルのswiss ephemerisは古いVisualC++で作成したようですので、一からプロジェクトファイルを作成すれば古いものでも可能です。
C++Builderは作者の好みで使用しましたが、Win32 Consoleプログラムですので、VisualC++でもプロジェクトを作成しなおせばそのまま利用できると思います。

ビルド方法

eMVCで、sweph/src/swedllce/swedllce.vcw を開き、ビルドする。
→sweph/src/swedllce/ARMRel/swedllce.dll ができあがる
eMVCで、ceastro/ceastro/ceastro.vcw を開き、ビルドする。
→ceastro/ceastro/ARMRel/ceastro.chx ができあがる

デバッグ方法

Windows上でデバッグするには三通りあります。
(2) PC上にWebServerを立ち上げ、CGIのデバッグ(これが一般的)
(1) PC上のWin32 Consoleでステップ実行によるデバッグ(主にDLLの内部動作の確認のため、primitiveなレベル)
(3) 実機上でのデバッグ(CEHTTPの説明を参照)

実機上でのデバッグは効率が悪いので、(1)のPC上でのデバッグが一番いいです。それでも不自由な場合は(2)を使えばよいでしょう。

CEHTTPは説明書にもある通り、通常のCGIとは異なる手順で、フォーム入力データの取得や、HTML出力を行います。本プログラムではCHXを使用しているので、CGIのエントリー関数は、
int fnChx(MyHash* pEnv, MyVarMem* pBody, MyVarMem* pRes)
となり、HTML等の出力は、printfではなく、pRes->Add()を使います。
詳細は、CEHTTPの説明書に譲ります。

PC上でのデバッグ方法

(0) PC上でのWebServerを用意する。

Apacheの場合:
.chxという拡張子を使用しているので、Apacheに.chxがCGIであることを教えます。
httpd.confファイルに
AddHandler cgi-script .cgi .pl .chx
に似た行があると思いますが、ここに示すとおり、最後に .chx を追加します。
ほか、パスの設定など必要な設定を行ってください。
(Apacheを使いこなす必要があります)

Windows用のCEHTTPもあります。

(1) Win32用のswiss ephemeris DLL (swedll32.dll) のビルド
sweph/src/swedll32/swedll32.dsw を開く。
出力先ディレクトリを適切なディレクトリに変更(defaultでは s:\devlop\sweph\bin になっている)。
ビルドを行う。
出来上がったswedll32.dll (Win32DLL用)を ceastro/ceastro/testbcb/bin へコピーする。(忘れがち)

(2) Win32 Consoleアプリ (test.exe または test.cgi など) のビルド
C++Builderでプロジェクトファイル ceastro/ceastro/testbcb/test.bpr を開く。
C++Builderの [プロジェクト] - [オプション]  [ディレクトリ/条件] で swedll.h のあるディレクトリを正しく指定してください。本HPの例と同じ構成の場合は変更の必要はありません。
(defaultでは、..\..\..\swiss\sweph\src になっている)
[プロジェクト] - [メイク] または Ctrl+F9でビルドを行う。

(3)WebServerの設定
PC上のWebServerでCGIとして動作させたい場合は、ceastro/ceastro/testbcb/test.exe を適当な名前(例えば test.cgi)に変更してください(忘れがち)。ブラウザーからはそのオブジェクトを指定します。
※WebServerの設定方法については省略します。(インターネット上にわかりやすく説明しているサイトが多数あるので)

制約

1行の長さは必ず1024バイト未満にしてください。超えた分は捨てられます。

使い方メモ

SSIの書法

%英数字% または <!--%英数字%--> と完全に一致するものは、環境変数に変換されます。
コメントの場合は、余計な空白があったり、途中改行された場合は置換されません。
英数字は大文字・小文字を区別します。

開発メモ

変更したファイル
・sweodef.h - WinCEに無いHeaderをcomment out
・swemmoon.c - static double LP; の LP がすでにどこかで定義されているらしいため、_LP に変更
・swephlib.c - WinCEに無いHeader(process.h)をcomment out
・swejpl.c, sweph.c - rewindがないため、fseekで代用
・sweph.c - getenvがないため、環境変数 SE_EPHE_PATH の参照は行わない
・MyHash.c, MyMem.c - C++Builder用に若干変更
・MyMem.c - printfメソッドを追加(eMVCではvsnprintfが無いため、最悪落ちてしまう可能性がある・・・)

CEHTTP用のswedll32とのIF用CGIを作成
eMVC++3.0で、新規作成(WCE Dynamic-Link Library)、出力ファイル名の拡張子を dll から chxに変更。
雛型:
extern "C" __declspec( dllexport ) int fnChx(MyHash* pEnv, MyVarMem* pBody, MyVarMem* pRes)
{
return 0;
}

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}


spam link