% $OpenXM: OpenXM/src/kan96xx/Doc/changelog-ja.tex,v 1.37 2020/03/14 00:50:55 takayama Exp $ \documentclass{jarticle} \title{ChangeLog \\ ---kan96xx, kxx, k097} \author{Nobuki Takayama} \date{} \usepackage{url} \begin{document} \maketitle %%OpenXM/doc/Papers/rims-2003-12* に oxshell, polymake \section{2004-02, port 化} \begin{enumerate} \item gmp はネットワークからダウンロードしてインストールするようにする. {\tt OpenXM\_contrib} はつかわない. \item {\tt OpenXM/src/gmp/Makefile-ports} 1.1--1.5, %%Mail/openxm-cvs.inbox 141 \end{enumerate} \section{2004-02, memory leak} \begin{enumerate} \item {\tt misc-2003/A2/bs-poly/bs2-leak.sm1} 実行時にクライアント構造体 が壊れる. gmp 4.x によるメモリリークを疑うも, {\tt GC\_malloc} を使うべきところで {\tt malloc} を用いていたのでメモリが破壊されていたと判明. {\tt malloc} の中にポインタを入れてはいけない. \item {\tt OpenXM/src/kan96xx} 以下の各ファイル. {\tt Kan/kanExport1.c} 1.11, {\tt Kan/poly3.c} 1.7, {\tt Kan/shell.c} 1.11, {\tt plugin/file2.c} 1.9 (原因), {\tt plugin/oxKan0.h} 1.16, {\tt plugin/sm1Socket.c} 1.16 (原因). {\tt OpenXM/src/kxx/oxmain.c} 1.15. %%Mail/openxm-cvs.inbox 164 2004-2-23 \end{enumerate} \section{2004-02, 03, ox\_texmacs} \begin{enumerate} \item sm1 を基礎として ox\_texmacs を作る. {\tt -q} option で余計な メッセージを標準出力へ出さないようにする. 次のファイルを変更. %%Mail/openxm-cvs.inbox 203, 204, 210, 213, 215, 220, 221, 222 \item {\tt OpenXM/src/util/ox\_pathfinder.c} 1.18--1.19, {\tt OpenXM/src/util/ox\_pathfinder.h} 1.11, {\tt OpenXM/src/kxx/ox100start.c} 1.6, {\tt OpenXM/src/kan96xx/Doc/ox.sm1} 1.34--1.35, {\tt OpenXM/src/kan96xx/Kan/ext.c} 1.23, {\tt OpenXM/src/kan96xx/Kan/kanExport0.c} 1.21, {\tt OpenXM/src/kan96xx/plugin/mytcpio.c} 1.14. \item {\tt ox\_texmacs}. {\tt OpenXM/src/kxx} 以下の次のファイルを変更. \item {\tt ox\_texmacs.c} 1.1--1.17, {\tt sample\_kanlib.c} 1.1, \item {\tt init-openxm.scm} の作成 (小原). \end{enumerate} \section{2004-03, ox 機能の強化} \begin{enumerate} \item option つきの関数よびだし. %%Mail/openxm-cvs.inbox 286, 288 まだ書いてない \end{enumerate} \section{2004-07, dhecart (2重同時化による gb)} \begin{enumerate} \item h[0,1](D) でのグレブナ fan の計算のための準備. \item Doc/dhecart.sm1, dh.gb %%Mail/openxm-cvs.inbox ?? \end{enumerate} \section{2004-08-22, lcm, polylcm, gcd, polygcd, その他} \begin{enumerate} \item polylcm, polygcd は ox を用いる. \item mpzext (lcm, gcd). int32 は universalNumber (mpz\_int) へ自動変換. \item ox.sm1 は起動の時から load すべきだがまだやってない. %%Mail/openxm-cvs.inbox ?? \item \verb@[(exponents) ...] gbext @ で exponents を取り出せる. 始めの版は 8 月頃. \item {\tt exponents} のformat を変えた. (9/5. cf.gfan.sm1, cone.sm1) \\ {\tt OpenXM/src/kan96xx/Kan/kanExport1.c} 1.16. \end{enumerate} \section{2004-08-31, weight ベクトルで univNum を受け取る} \begin{enumerate} \item {\tt to\_int32}, {\tt Kto\_int32} で univNum を int32 へ. \item {\tt to\_int} は {\tt to\_univNum} に同値. どちらかを廃止しよう. \item 内部関数の変更: {\tt KordWsAll()}, {\tt KsetUpRing()}, {\tt oInitW()} \item マクロ: {\tt ord\_w}, {\tt weight\_vector}, {\tt s\_weight\_vector}, {\tt w\_to\_vec}, {\tt ecart.weight\_vector}, {\tt ord\_ws\_all} \item テスト方法. cvs-eventail/aux-cone.sm1 の test7 を用いる. %%Mail/openxm-cvs.inbox ?? \end{enumerate} \section{2004-09-5, error および ctrl-C でマクロの呼び出し履歴を表示(trace)} \begin{enumerate} \item {\tt traceShowStack()} を呼び出すと呼び出し履歴が表示される. 履歴を文字列で戻す. \item \verb@ ctrlC_hook @ の実行中にエラーをおこすと, ox103\_reset が よばれ, これが無限ループを生む. これを防止. \item {\tt executeToken} する前に関数の名前を trace 用のスタック {\tt TraceNameStack} へ push. 実行がおわれば pop することにより, 履歴表示をコントロール. \item extension で履歴のクリア, 強制表示ができる. \item ctrl-C で履歴の表示, クリアをする. これは各 ox server で対処の必要あり. \item {\tt OpenXM/src/kan96xx/Kan/ext.c} 1.24 \\ {\tt OpenXM/src/kan96xx/Kan/kanExport0.c} 1.30 \\ {\tt OpenXM/src/kan96xx/Kan/stackmachine.c} 1.15--1.18 \\ {\tt OpenXM/src/kan96xx/Kan/usage.c} 1.30 \\ {\tt OpenXM/src/k097/ox\_k0.c} 1.6 \\ {\tt OpenXM/src/kxx/ox\_texmacs.c} 1.19 \\ {\tt OpenXM/src/kxx/oxserver00.c} 1.15 \\ {\tt OpenXM/src/kxx/sample\_kanlib.c} 1.2 \end{enumerate} \section{2004-09-05, EUC等 8-bit の名前を受け付ける} \begin{enumerate} \item hash 値の計算方法にバグがあった. hash の値は負ではいけない. \item {\tt OpenXM/src/kan96xx/Kan/stackmachine.c} 1.17 \end{enumerate} \section{2004-09-05, グレブナfanの計算} \begin{enumerate} \item polymake が必要. 9/1, 9/2, 9/3, 9/4 のノートも参照. \item OpenXM の cvs への commit は大きい区切りで. 細かい変更は {\tt eventail/cone.sm1} で. \item {\tt OpenXM/src/kan96xx/Doc/gfan.sm1} 1.1 \end{enumerate} \section{2004-09-05, グレブナfanの計算} \begin{enumerate} \item polymake が必要. 9/1, 9/2, 9/3, 9/4 のノートも参照. @s/2004/08/21-note.pdf に変数等の説明あり. \item OpenXM の cvs への commit は大きい区切りで. 細かい変更は {\tt eventail/cone.sm1} で. \item {\tt OpenXM/src/kan96xx/Doc/gfan.sm1} 1.1 \end{enumerate} \section{2004-09-09, 11, list の強化} \begin{enumerate} \item array の {\tt join} を行うとメモリの無だ使いがはげしい. list の {\tt cons} を導入. rest も導入. join は使えるが危険. \item {\tt arrayToList}, {\tt listToArray} : 変換関数を準備. \item {\tt get} がリストでも動くように. \item {\tt Kan/dr.sm1} 1.35--1.36, 1.38 \\ {\tt Kan/extern.h} 1.24--1.25 \\ {\tt Kan/ext.c} 1.25 \\ {\tt Kan/kanExport0.c} 1.31--1.33 \\ {\tt Kan/list.c} 1.3--1.5 \\ {\tt Kan/primitive.c} 1.12 \\ {\tt Kan/smacro.sm1} 1.5 \\ {\tt Kan/usage.c} 1.32 \\ {\tt Kan/usage.sm1} 1.9 \end{enumerate} \section{2004-09-10, コンマ {\tt ,} の扱いの変更} \begin{enumerate} \item コンマ {\tt ,} はいままでマクロであったが, 空白として扱うように変更する. \item システムの変更は以下の通り. \\ {\tt Kan/scanner.c} 1.5--1.6 \\ {\tt Kan/scanner2.c} 1.4--1.5 \\ {\tt Kan/dr.sm1} 1.37 \\ {\tt Kan/smacro.sm1} 1.6 \item その他はライブラリ内部で {\tt ,,} を {\tt \_\_} へ, {\tt ,,,} を {\tt \_\_\_} へ変更した. \end{enumerate} \section{2004-09-11,12, infix operator を導入} \begin{enumerate} \item {\tt getattr} を加えた (step 1). \item {\tt attr} に {\tt ATTR\_INFIX} 属性 bit を立てて, infix operator とする. \item {\tt attr} の PROTECT 属性を bit で処理するように変更 (step 2). テストは {\tt k0} で \begin{verbatim} sm1(" [(getattr) /cons] extension :: "); cons = 1; \end{verbatim} Warning が表示されるか? \item infix 属性があるとき, {\tt getokenSM(GET)} で次の token を読み込み それを {\tt executeToken} してから, infix 属性のあるマクロを実行すれば いいかというと, それでは top level の処理しかできない. たとえば, tokenArray を順番に処理しているような場合はだめ. よって, {\tt executeToken} の戻り値の status の値を 用いる. status は {\tt loop} から {\tt exit} するときにも使われている ので, status の判定方法を見直す必要がある. \end{enumerate} \section{2004-09-13, 部分的な ecart division} \noindent Debug 用のデータ 1. {\footnotesize \begin{verbatim} [ [( (x Dx)^2 + (y Dy)^2 -1) ] (x,y) [ [ (Dx) 1 ] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] [(partialEcartGlobalVarX) [(x) (y)]] ] ecart.gb /ff set ff getRing ring_def show_ring \end{verbatim} } \noindent Debug 用のデータ 2. {\footnotesize \begin{verbatim} /ecart.checkOrder { 1 } def [(DebugReductionEcart) 3] system_variable [ [(1-x-y-z) (1-z)] (x,y,z) [ [(y) -1 (z) -1 (Dy) 1 (Dz) 1] [(x) 1 (Dx) 1]] [(partialEcartGlobalVarX) [(x)]] ] ecart.gb /ff set ff getRing ring_def show_ring [ [(1-z) (-x+1-y-z)] (x,y,z) [ [(y) -1 (z) -1 (Dy) 1 (Dz) 1] [(x) 1 (Dx) 1]] [(partialEcartGlobalVarX) [(x)]] ] /std set (1+x^3) std ecartd.reduction (x*y*z) std ecartd.reduction \end{verbatim} } GlobalVarX の変数については local order ではいけない. 無限ループとなる. {\tt ecart.checkOrder} も書き直さないといけない. \begin{enumerate} \item \verb@ ringp->partialEcart @ は int の配列 \verb@ ringp->partialEcartGlobalVarX @ の長さ. この配列に local でない変数 (first weight が non-negative な x 変数) のリストを入れる. {\tt ecartGetEllPartial()} で利用される. \item Todo: ring のメンバ {\tt ringInInputForm} の活用. ( weight vector や input 形式の ring を object として格納. \item Todo: {\tt KgetRingInfo} を実装する. index から 変数, 変数から index 等. \end{enumerate} \section{2004-09, {\tt ATTR\_EXPORT} と {\tt RestrictedMode}} \noindent 現在の RestrictedMode には以下の脆弱性がある (2004.9.19). \begin{verbatim} (cohom.sm1) run [(or_attr) 8 /gb] extension [(or_attr) 8 /;] extension ; [(RestrictedMode) 1] system_variable ; [ [{(hello) message } ] (x,y) ] gb ; hello <---- error を起こす前に {(hello) message} が実行されてしまう. ERROR(sm): << /name object def >> or << object /name set >> \end{verbatim} \noindent 原因: 引数に executableArray を与えることにより, 評価が抑制され {\tt ATTR\_EXPORT} bit がセットされた関数の評価がはじまってから executableArray が変数 {\tt arg1} に代入され, その変数を scanner が評価することにより, executableArray が評価される. \noindent 対策: {\tt isThereExecutableArrayOnStack(ob)} でスタックを検査するようにする. \begin{verbatim} (cohom.sm1) run [(or_attr) 8 /gb] extension [(or_attr) 8 /;] extension ; 0 1 10 { pop pop } for [(RestrictedMode) 1] system_variable ; [ [{(hello) message } ] (x,y) ] gb ; \end{verbatim} テスト 2 (こちらは正常に動くはず). \begin{verbatim} (ox.sm1) run [(or_attr) 8 /fctr] extension [(or_attr) 8 /pmat] extension ; [(or_attr) 8 /;] extension ; 0 1 10 { pop pop } for [(RestrictedMode) 1] system_variable ; [ (x^2-1) (x,y) ] fctr pmat ; \end{verbatim} \section{2004-11-23, POST ベースの cgiPolymake 等} \begin{enumerate} \item {\tt Kan/plugin/mytcpio.c} 1.15 \\ {\tt Kan/plugin/oxcgi.c} 1.7 \\ {\tt Kan/ext.c} 1.33 \\ {\tt Kan/Doc/cgi.sm1} 1.8--1.11 \\ {\tt polymake/cgi/cgi-polymake.sh} 1.3 \end{enumerate} GET では受渡しできるデータの量に制限があるため, POST ベースに変更した. \begin{verbatim} POST http://polymake.math.kobe-u.ac.jp/cgi-bin/cgi-asir.sh HTTP/0.9 Content-length: 20 oxMessageBody=2-1%0A \end{verbatim} POST のデータをうけとるため, \verb@ [(read) fd size] extension @ システムコールを加えた. システムコール {\tt perror} を用いて, tcpip のエラー等を表示するようにした. {\tt eventail/data/test32.sm1} の途中のエラーは, GET では受渡しできるデータの量に制限があるため 起きたようであるが, 適切なエラーメッセージがなくて 原因の究明に時間がかかった反省. {\tt misc-2004/11/cgi} も参照のこと. Risa/Asir の \verb@ set_secure_mode @ , \verb@ set_secure_flag @ にも対応中. \section{2004-12-16, gnuplot v4 への対応.} \begin{enumerate} \item 1.3-1.4 OpenXM/src/kan96xx/Doc/gnuplot.sm1 \item 1.11 OpenXM/src/kan96xx/plugin/file2.c \item 1.6 OpenXM/src/kan96xx/plugin/file2.h \item 1.6 OpenXM/src/kan96xx/plugin/file2.hh \item 1.4 OpenXM/src/kan96xx/plugin/file2.sm1 \item 1.15 OpenXM/src/asir-contrib/packages/src/gnuplot \end{enumerate} gnuplot で mouse を利用できるようにしたい. そのため, gnuplot を batch mode でなく, interactive mode で利用できるようにした. http://www.gnuplot.info にあった, サンプルプログラム {\tt gpReadMouseTest.c} ({\tt misc-2004/12/misc}) を参考に mkfifo, popen 等を用いて実装した. mkfifo, popen 等のシステムコールは plugin-file2 へ加えた. sm1 でやるテストの手順は以下のとおり. \begin{verbatim} (gnuplot.sm1) run plotstart.aux (splot x**2-y**2;) gnuplot plotstop.aux \end{verbatim} Windows, Debian package の build のテストはまだ. ({\tt gnuplot4ox} は {\tt gnuplot} に. {\tt gnuplot\_x11} は {\tt libexec} の下へ install されるため.) Bug: {\tt plot\_dots} で, 計算しながら表示するという方法がうまくいかない. 大きなデータを渡すとうまく動かない. cf. {\tt heat()}. \section{2005-01-23, EUC等 8-bit の名前を受け付ける. bug fix} \begin{enumerate} \item scanner2 の bug により, トップレベル以外では 8 bit の名前をうけつけ なかった. \item {\tt OpenXM/src/kan96xx/Kan/scanner2.c} 1.7 \end{enumerate} \section{2005-02-28, ox, bug fix} \begin{enumerate} \item Engine のみを quit すると control server が残るバグ. 解決: oxmain.c で SIGCHLD を受け取るようにした. \item Engine を quit してしまったあと, Engine でデータをおくろうとすると, SIGPIPE で クライアントが終了してしまうバグ. \begin{verbatim} (ox.sm1) run sm1connectr oxsm1.ccc (quit) oxsubmit oxsm1.ccc oxpopcmo --> クライアント終了. \end{verbatim} まだ完全に解決してない. ox texmacs が正しく動作するのか要テスト. \end{enumerate} \section{2005-06-9, 16, attribute, options.} \begin{enumerate} \item 全ての object に attr (attribute field) をつけた. 効率に関する調査は {\tt misc-2005/06/gfan/test1.sm1} (taka). 時間的効率についてはあまり問題ない. \item 構造体の {\tt attr} フィールドを初期化するため {\tt OINIT} マクロを 加えた. {\tt stackm.h} 初期化がないと segfault する場合も. \item {\tt @s/2005/06/16-note.pdf} (taka) に開発メモあり. \item {\tt attr} を {\tt groebner}, {\tt gb} 等で活用する. \end{enumerate} ソースの変更は多岐にわたるので一部のみ記す. \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Kan/dr.sm1} 1.49, {\tt setAttribute} 等のマクロ. \item {\tt OpenXM/src/kan96xx/kan/gb.c} 1.10,11, {\tt groebner} が attr で gb かどうかの情報を戻す. \item {\tt OpenXM/src/kan96xx/Doc/hol.sm1} 1.23, gb, pgb, gb\_h が option を attr で受け取れるようにする変更. \end{enumerate} 例: {\footnotesize \begin{verbatim} ob key getAttribute value Example: [(x-1) (y-1)] (gb) 1 setAttribute /ff set ff (gb) getAttribute :: ob getAttributeList attr-obj Example: [(x-1) (y-1)] [(gb) 1] setAttributeList /ff set ff getAttributeList :: sm1> [(x0,x1) ring_of_polynomials 0] define_ring [(x0^2+x1^2-h^2). (x0 x1 -4 h^2).] /ff set ; sm1>[ff [(gbCheck)]] groebner /gg set ; 3.gbCheck failed. Note that the result is NOT groebner basis. Completed. sm1>gg getAttributeList :: [ $gb$ , 0 ] [ [( (x Dx)^2 + (y Dy)^2 + 1) ( x y Dx Dy -1)] (x,y) [ [ (Dx) 1 ] ] ] [(gbCheck) 1] setAttributeList gb getAttributeList :: [ [[(h+x) (x^3 + 2 h^3 + 2 x h^2)] [(x) (x)]] (x)] [(reduceOnly)] setAttributeList gb_h pmat \end{verbatim} } \section{2005-07-07, gfan.sm1} \begin{enumerate} \item Collar-Kalkbrener-Moll のアルゴリズムを実装した. \item {\tt getNextCone}, {\tt ckmFlip} \item {\tt cone.ckmFlip} が 1 の時 CKM アルゴリズムを用いる. \item {\tt cone.DhH} が 1 の時 $\partial x = x \partial + hH$, 0 の時 $\partial x = x \partial + h^2$ を選択. {\tt cone.gb}, {\tt cone.reduction}, {\tt cone.gb\_gr}. \item 関連する sm1 本体の変更. \item {\tt eventail/data/test35.sm1}, {\tt test36.sm1}. \end{enumerate} \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Doc/gfan.sm1} 1.10, 1.11. \end{enumerate} \section{2005-07-18, Error Message} \begin{enumerate} \item サーバはエラーの位置およびエラーの位置での読み込みデータを XML 形式で送る. \begin{verbatim} (ox.sm1) run sm1connectr oxsm1.ccc (1 shell) oxsubmit oxsm1.ccc oxpopcmo :: \end{verbatim} \item {\tt scanner.c}, {\tt scanner2.c} で {\tt ScannerBuf} に 読み込んだデータを書き込む. \item {\tt stackmachineError()} で 大域変数 {\tt MsgStackTrace}, {\tt MsgSourceTrace} に書き込んでおく. \item {\tt kxx/sm1stackmachine.c} の {\tt Sm1\_pushError2} で, 上の大域変数に設定されたメッセージをもとに, error package の文字列に XML 形式で error message を書く. \item \verb@ [(traceShowScannerBuf)] extension :: @ \item Todo: {\tt executeToken} の中までみないと, すでに定義された関数のどの位置でエラーを起こしたのかがわからない. \end{enumerate} \section{2006-01-26, -engineLogToStdout} \begin{enumerate} \item engine を xterm 内部で動かさないで呼び出したプログラム の標準出力へつないだまま動かす. \begin{verbatim} (ox.sm1) run /Xm_engineLogToStdout 1 def asirconnectr ((x-2)^2). fctr :: \end{verbatim} \item cfep への対応. \begin{verbatim} ox_texmacs --view cfep --engineLogToStdout ox_texmacs --view debug --engineLogToStdout \end{verbatim} \end{enumerate} ソースの変更. \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Doc/ox.sm1} 1.46 \item {\tt OpenXM/src/kxx/ox\_texmacs.c} 1.26 \item {\tt OpenXM/src/kxx/ox100start.c} 1.7 \item {\tt OpenXM/src/util/ox\_pathfinder.c, h} 1.30 \end{enumerate} \section{2006-01-30, class の body を得る.} \begin{verbatim} [1,2,3] (error) dc /ff set %%CLASSNAME_ERROR_PACKET を生成. bodyは[1,2,3] ff (body) dc %% [classのタグ番号, class の body object] を戻す. --> [1,2,3] \end{verbatim} 関連. {\tt KnewErrorPacketObj()} ソースの変更. \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Kan/kclass.c} 1.6 \end{enumerate} \section{2006-02-01, 新しい error packet} \begin{verbatim} (ox.sm1) run sm1connectr oxsm1.ccc (1 shell) oxsubmit oxsm1.ccc oxpopcmo :: \end{verbatim} \verb@ errorPacket (body) dc 3 get @ が リスト(キーワード,値)となる. 場所(where)や理由(reason), 処理系によっては, line や parse error の場所. 関連事項: misc-2005/A1/cfep. {\tt oxclearstack}. ox\_texmacs で tunnel channel 0 へ cfep 用のエラー命令を送る. ({\tt outputStringToTunnel()}) \begin{verbatim} ox_texmacs --view debug !sm1;^E 1 shell ^E \end{verbatim} ソースの変更. \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Kan/stackmachine.c} 1.34 \item {\tt OpenXM/src/kan96xx/Doc/ox.sm1} 1.48 \item {\tt OpenXM/src/kxx/sm1stackmachine.c} 1.6 \item {\tt OpenXM/src/kxx/ox\_texmacs.c} 1.27 \item {\tt OpenXM/doc/OpenXM-specs/OX-RFC-103.oxw} 1.6 \end{enumerate} \section{2006-02-04, メッセージの localization (ox用)} オリジナル {\tt misc-2005/A1/cfep/packages/misc}. \begin{verbatim} /localizedString.file (Resource/sm1-ja_JP.eucJP.sm1) def localizedString.load %% 辞書をロードする. [(parse) (ox.sm1) pushfile] extension sm1connectr oxsm1.ccc ( hoge ) oxsubmit oxsm1.ccc oxpopcmo /e1 set e1 translateErrorForCfep message %% エラー obj の翻訳 \end{verbatim} エラー object の構造. [serial, 共通エラー番号, message, core] 空欄のときは, $-1$ か null object. ソースの変更. \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Kan/dr.sm1} 1.53, localizedString を追加. \item {\tt OpenXM/src/kan96xx/Doc/ox.sm1} 1.52, translateErrorForCfep を修正 \item {\tt OpenXM/src/kan96xx/Doc/Resource} 翻訳のためのリソース. \item {\tt OpenXM/src/kxx/Makefile.in} 1.36, Resource をコピー. \end{enumerate} \section{2006-02-04, {\tt -authEncoding file} の実装} OX-RFC-104 の {\tt -authEncoding file} を実装. \begin{verbatim} ~/.openxm/tmp.opt/c.txt --> 1435 (Do not put the newline character.) ~/.openxm/tmp.opt/d.txt --> 1234 chmod 700 ~/.openxm/tmp.opt ox -ox ox_sm1 -authEncoding file -passControl c.txt -passData d.txt [(oxCreateClient) (localhost) 1300 1200 [(1435) (1234)]] extension ; data ctrl ctrl data \end{verbatim} cfep で MyOpenGLView の event 入力用の delegate ox server ``ox\_nextevent'' は ox\_asir のサーバである. ``ox\_nextevent'' は MyOpenGLView から NSPipe, NSTask を用いて MyOpenGLView の出力を stdin で受信できる状態でないといけない. MyOpenGLView は {\tt ox} を用いて{\tt ox\_asir} よりの順方向接続をまつ予定. \begin{enumerate} \item {\tt OpenXM/src/kxx/oxmain.c} 1.22 \end{enumerate} \section{2006-12-21, UseDsmall option} \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Kan/output.c} \item {\tt OpenXM/src/kan96xx/Kan/global.c} \item {\tt OpenXM/src/kan96xx/Kan/kanExport0.c} \item {\tt OpenXM/src/kan96xx/Kan/option.c} \item {\tt OpenXM/src/kan96xx/Kan/usage.c} \end{enumerate} {\tt makeDsmall()}. \verb@ [(UseDsmall) 1] system_variable @ で 出力の時だけ D が小文字になる. asir \verb@ print_tex_form @ を呼び出すため導入. \section{2007-6-3, mgkz} \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Doc/gkz.sm1} 1.2 \item {\tt OpenXM/src/kan96xx/Doc/printhelp.sm1} 1.9 \end{enumerate} mgkz (メモ的な数学ノートは misc-2006/04) コマンドを追加. Modified A-hypergeometric system を生成. printhelp.sm1 に キーワード mgkz を追加. プログラム作成方法のメモ. まず, gkz を mgkz としてコピー. \verb@ ( ) error @ をプログラムの各部分に入れながら, [ ] mgkz を実行して, debug. すると変数の値を観察できて簡単. \section{2009-8-26, gfan} \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Doc/gfan.sm1} 1.13 \end{enumerate} Grobner cone で 線型空間を除いたものの 次元が $1$ or $0$ の時は正しく動作しない. この時に エラーメッセージを出す. (cf. taka: i-hg/crest09/Prog/fan1.sm1, fan2.sm1) \section{2009-9-4, gfan} \begin{enumerate} \item {\tt OpenXM/src/kan96xx/Doc/gfan.sm1} 1.17 \item {\tt OpenXM/src/kan96xx/trans/yy\_polymake.y} 1.5 \item {\tt OpenXM/src/kan96xx/trans/yylex\_polymake.c} 1.5 \item {\tt OpenXM/src/kan96xx/trans/data} \end{enumerate} gfan.sm1 package は polymake 2.0 の出力に対しては正しく動作する. しかし 2.2, 2.3 に対して動作しない. {\tt trans/data/data1b.txt} は 2.0 の出力, {\tt trans/data/data1.txt} は 2.3 の出力, 入力 property は INEQUALITIES で FACETS を 出力 property としている. {\tt trans/data/data2.txt} は簡単な例. 2.3 では VERTICES が UNDEF となる. これを正しく parse するように polymake2tfb を 変更した. \begin{verbatim} ./polymake2tfb This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-msys". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./ox_sm1d...done. (gdb) break main Breakpoint 1 at 0x10049b7b8: file oxserver00-d.c, line 37. (gdb) run Starting program: /home/Nobuki/OX4/OpenXM/src/kxx/ox_sm1d [New Thread 11260.0x17c8] [New Thread 11260.0x2e50] [New Thread 11260.0x8ac] [New Thread 11260.0x29d0] [New Thread 11260.0x27b8] Breakpoint 1, main (argc=1, argv=0x24cb10) at oxserver00-d.c:37 37 main(int argc, char *argv[]) { (gdb) call dup2(open("tmp-o.txt",0),0) // run macro package : dr.sm1, 9/26,1995 --- Version 09/22, 2013. sm1>macro package : module1.sm1, 1994 -- Nov 8, 1998 sm1 version : 3.050615 sm1 url : http://www.math.kobe-u.ac.jp/KAN name = ox_sm1 sm1>--------------------------------------------------- engineByteOrder=0 Hello world. Set EnvOfChildServer. Set EnvOfStackMachine. mtag is 514 (serial=11) : OX_DATA (CMO_STRING[4],[size=17],$ (1).. (0).. div $), mtag is 513 (serial=12) : OX_COMMAND function_id is 268; SM_executeStringByLocalParser KSexecuteString( (1).. (0).. div ) ERROR(kanExport[0|1].c): KisInvalidRational(): zero division. You have f/0. Trace: div<-; Breakpoint 2, Sm1_popErrorMessage (s=0x10049d084 "executeString: ") at sm1stackmachine.c:205 205 char *Sm1_popErrorMessage(char *s) { (gdb) print s $2 = 0x10049d084 "executeString: " (gdb) print ErrorMessageMode $3 = 2 (gdb) break popErrorStackByString Breakpoint 3 at 0x1004033f0: file stackmachine.c, line 1445. (gdb) continue Continuing. Breakpoint 3, popErrorStackByString () at stackmachine.c:1445 1445 char *popErrorStackByString(void) { (gdb) list 1440 }else{ 1441 return( (ErrorStack.ostack)[--(ErrorStack.sp)]); 1442 } 1443 } 1444 1445 char *popErrorStackByString(void) { 1446 struct object obj = OINIT; 1447 struct object eobj = OINIT; 1448 eobj = popErrorStack(); 1449 if (ectag(eobj) != CLASSNAME_ERROR_PACKET) { (gdb) break sGC_malloc Breakpoint 4 at 0x1004035a0: file stackmachine.c, line 1510. (gdb) continue Continuing. Breakpoint 4, sGC_malloc (n=93) at stackmachine.c:1510 1510 void *sGC_malloc(size_t n) { /* synchronized function */ (gdb) up #1 0x000000010040276b in Sm1_popErrorMessage (s=0x10049d084 "executeString: ") at sm1stackmachine.c:221 221 a = (char *) sGC_malloc(sizeof(char)*(strlen(s)+strlen(e)+2)); (gdb) print s $4 = 0x10049d084 "executeString: " (gdb) print e $5 = 0x6008d4d70 "\nERROR(kanExport[0|1].c): KisInvalidRational(): zero division. You have f/0." // 正常 (gdb) continue Continuing. 14 [main] ox_sm1d 11260 cygwin_exception::open_stackdumpfile: Dumping stack trace to ox_sm1d.exe.stackdump [Thread 11260.0x2e50 exited with code 35584] [Thread 11260.0x8ac exited with code 35584] [Thread 11260.0x29d0 exited with code 35584] [Thread 11260.0x2f84 exited with code 35584] [Thread 11260.0x2a28 exited with code 35584] [Inferior 1 (process 11260) exited with code 0105400] (gdb) quit GC_malloc や strcpy 等が怪しいとにらむ. char * 系 void * 系の宣言なしが segfault の原因? strcpy が変. kxx/serversm.h に #include void *sGC_malloc(int n); を加える. ./ox_sm1d ${WFILE} env CONTENT_LENGTH=`wc -m ${WFILE} | awk '{print $1}'` sm1 -q -s "[(parse) (cgi.sm1) pushfile] extension cgiPolymake quit " <${WFILE} rm -f ${WFILE} exit 0 : rm -f ${WFILE} \end{verbatim} } 送信側の {\tt cgiQueryPolymake.curl} は curl の form option を用いて post message をする. キーは {\tt oxMessageBody} である. 送る form は {\tt /tmp/sm1-q-cgi.txt???} に生成される. ここで ??? は pid である. 結果を受け取ったらこの一時ファイルは {\tt OpenXM\_tmp} 環境変数で指定される folder へ移動される. {\rm /tmp/sm1-q-cgi*} は動作エラー等により残ることがあるので定期的に削除することが 望ましい. {\tt cgiQueryPolymake.curl} は polymake version 2 形式の出力を文字列の list として戻す. これを tree 形式等に変換しているのは {\tt kan96xx/trans} 内のソースである. このフォルダはデータ形式の変換等のテストケースとして作成された. 考え方としては, \begin{center} \fbox{tree 形式のデータ} $\Leftrightarrow$ \fbox{tfb 形式のデータ} $\Leftrightarrow$ \fbox{polymake 形式} $\Leftrightarrow$ \fbox{polymake web server} \end{center} {\tt polymake2tfb} は polymake version 2 のファイルを入力とすると tfb 形式のデータを出力する. {\tiny \begin{verbatim} polymake2tfb < ~/.OpenXM_tmp/sm1-q-cgi-out.txt37402 polymake.data(polymake.POINTS([[1,0],[1,1]]),polymake.FACETS([[1,-1],[0,1]]),polymake.AFFINE_HULL()) \end{verbatim} } tfb 形式のデータは {\tt ox\_k0} が parse して, それを tree 形式に変換している. 逆変換も {\tt ox\_k0} が行う (ソース {\tt polymake.sm1}, 関数 {\tt tfbToTree} を参照). \end{document}