文字列

Lispの文字列は値が文字のベクタとして表現され扱われるが,多くのプログラミング言語と同様,文字用の表記方法や文字列用の表記方法が用意されている.文字文字列文字列の比較文字列の大文字小文字変換文字列の連結部分文字列 文字 文字列 文字列の比較 文字列の大文字小文字変換 文字列の大文字小文字を変換するには以下の関数を使用する.string-upcase文字列に小文字があれば大文字に変換するstring-downcase文字列に大文字があれば小文字に変換するnstring-upcasestring-upcaseの破壊的関数nstring-downcasestring-downcaseの破壊的関数試してみる. (setf str “HoGe”)“HoGe”(string-upcase str)“HOGE”(string-downcase str)“hoge”(nstring-downcase str)“hoge”str“hoge”(nstring-upcase str)“HOGE”str“HOGE”破壊的関数の後は引数の値が破壊(大文字もしくは小文字に変換)されていることに注意. 文字列の連結 部分文字列

ハッシュ

Lispのハッシュを使ってみた.ハッシュの作成と値の取り出しレコードの設定削除キーの比較領域の拡張 ハッシュの作成と値の取り出し レコードの設定 削除 キーの比較 領域の拡張 ハッシュは領域が足りなくなったら自動的に領域を拡張する.これによりハッシュは好きなだけ要素を格納できる.ここで問題になるのは領域を拡張する際の大きさである.メモリ領域の確保はコストが大きいので,領域拡張回数は少ない方がよい.拡張回数を少なくするには拡張サイズを大きくする方法があるが,それだと無駄にメモリ領域を消費する危険がある.このトレードオフの問題はプログラマがチューニングして解決するしかないように思われる.試しに以下のサンプルを使用してキーワード引数sizeの効果を確認してみた.(setf hash (make-hash-table :size 10000))(setf str “HOGE”) (do ‘(i 0 (+ i 1))((> i … More ハッシュ

関数とクロージャ

Common Lispでの関数の詳細についていろいろと試してみた.関数の基本(setf 関数名)という関数名大域関数と局所関数関数のパラメータレキシカル変数と関数とクロージャ動的スコープ 関数の基本 (setf 関数名)という関数名 大域関数と局所関数 関数のパラメータ レキシカル変数と関数とクロージャ 動的スコープ

スクリプトの実行と環境

スクリプトが実行される際の環境について.スクリプトの実行bashのオプション別スクリプトによるshの環境の定義や変更(sourceコマンド)別shプロセスへの環境の引き渡し(exportコマンド)shの実行制御(setコマンド)shのパラメータ変数の設定(setコマンド,shiftコマンド)環境の削除(unsetコマンド) スクリプトの実行 ユーザがシステムにログインすると,普通は/bin/shというプログラムが起動する.そしてそのプログラムのコマンドプロンプトを通して人がシステムと対話する.ユーザはこのコマンドプロンプトからいくつかのコマンドを実行していくが,それらのプロセスは最初のshプロセスの子プロセスということになる.だから,shのコマンドプロンプトから実行したスクリプトもshの子プロセスとしてのshプロセスなのだ.スクリプトを起動するshプロセスとスクリプト自身であるshプロセスが別なので,当然環境が異なる.ここでいう環境とは,以下のものを指す.bashのオプションパラメータ,変数とその値定義されている関数 bashのオプション 別スクリプトによるshの環境の定義や変更(sourceコマンド) 別shプロセスへの環境の引き渡し(exportコマンド) (以下の文章は”スクリプト”を”プロセス”と書いた方が正確かもしれない)sourceコマンドはイメージ的には子スクリプトの環境定義を親プロセスに渡すものであった(実際は子スクリプトのプロセスは作成されず子スクリプトが実行するコマンドを親スクリプトが実行する).逆に親スクリプトの環境を子プロセスに変数の定義を引き渡すにはexportコマンドを使用する.a=hogeexport b=fugaecho $a $bbashecho $a $b一回目のechoではhoge fugaと出力されるが,二回目のechoではexportされた変数bの値であるfugaしか出力されない. shの実行制御(setコマンド) bashのオプションを先述したが,例えばスクリプト中のある部分だけデバッグしたくなった場合,オプションと同様の実行制御を途中で切替えられると便利である.これにはsetコマンドを使用する.以下にsetコマンドのオプションを示す.-nまたは-o noexecsh -nと同様-vまたは-o verbosesh -vと同様-xまたは-o xtracesh … More スクリプトの実行と環境

シンボルとパッケージ

Common Lispのシンボルには,いろいろな情報が格納されている.また,Common Lispにはパッケージというものがあって,これによってシンボルの名前空間を拡張できる.シンボルの構成シンボル名属性リストパッケージシンボルのインターンパッケージの定義と移動 シンボルの構成 シンボルは以下から構成される.シンボル名パッケージ変数値関数属性リストシンボルは簡単に作成できて,見ためも単なる文字列のように見えるが,内部では構造を持っていて,いろいろな情報を持っている. シンボル名 前節のとおり,シンボルは単なる名前ではなく実体を伴うオブジェクトである.人間はシンボル名を通して,シンボルを単なる名前として認識できる.シンボルのシンボル名はsymbol-nameによって参照できる. (symbol-name ‘SYMBOL)“SYMBOL”(symbol-name ‘Symbol)“SYMBOL”(symbol-name ‘symbol)“SYMBOL”特に指定しない限り,シンボルに大文字小文字の区別はない.空白や(や)などをシンボル名に持つシンボルは|で囲んで表現する.シンボル名に|(パイプ)そのものを含める場合には,|の前に\を置いてエスケープする.(symbol-name ‘|hoge fuga foo|)“hoge fuga foo”(setf |()| 10)10|()|10(symbol-name ‘|||)“|” 属性リスト … More シンボルとパッケージ

DTDとは

XML文書の意味付けや構造はそのXML文書を使用する人(もしくはシステム)で合意がなされていればそれでよい.だが,プログラムでXML文書をためには何らかの表現方法があった方が便利である.DTDこの表現方法を提供する.また,人同士の合意を形成する上でも曖昧さを排除するのに役立つ.妥当性文書とDTD,XML SchemaDTDxmllint 妥当性文書とDTD,XML Schema XMLは整形式文書でなければならない.しかし,それだけでは足りない.XMLではタグを自由に決められる.だから,そのタグが何を表すのかはそのタグを作った人にきかなけらばわからない.そんなこんなでXML文書をやりとりする人同士でタグの取り決めを行う必要がある.この取り決めを行う仕様がDTD(Data Type Definition)やXML Schemaである.ただし,より上位の取り決め,例えばhogeタグが何を指すのかという問題は,DTDではなく別のドキュメントなどで取り決めておく必要がある.DTDやXML Schemaはこの「より上位の取り決め」にもとづいて,XML文書の「構造」を定義するものである.そしてDTDやXML SchemaにしたがったXML文書を妥当性文書と呼ぶ.DTDやXML Schemaではどんなタグ(要素)やそのタグの属性があるのかといったXML文書の構造をとりきめる.DTDはXMLとは異なる文法で記述する.XML SchemaはXMLに似た文法で記述する.ここではDTDについて説明する. DTD xmllint とにかく,上記の例を試してみる.xmllint -shell sample01.xmlxmllintコマンドはlibxml2_2.4.16-2_i386.debにある.実行例.$ xmllint -shell sample01.xml/ … More DTDとは

チャートのSVG出力(JFreechart 1.0.0-pre2)

JFreeChartはGraphics2Dに対して描画できる.そしてApacheプロジェクトのbaticはGraphics2DのサブクラスであるSVGGraphics2Dを入力としてSVGを出力できる.両者のI/Fがつながるので,両者を単純に使用するだけでチャートをSVGで出力することができる.SVGサンプルSVG出力 SVG SVGはSimple Vector Graphicsは,XMLで記述されるベクトル方式の画像フォーマットである. ビューアにはAdobeのビューアや,ApacheプロジェクトのBatikなどがある. BatikはさらにSVGを生成するモジュールもあり,今回はそれを使用してJFreeChartの出力をSVGとしてみる. サンプル 以前作成したPieChartをBatikを使用してSVG出力するサンプルを作成してみた. サンプルの実行方法を以下に示す.$ tar zxvf SVGMaker-0_01.tar.gz$ ant preparelib$ java -jar jfreechartsample.jarantタスクpreparelibでは,サンプルが依存するJFreeChart,Log4J,BatikをHTTPにてダウンロードするが,HTTPプロキシには対応していない. そのような環境の場合は,別途依存jarファイルを入手されたい. 実行すると,カレントディレクトリにchart.svgが出力される. … More チャートのSVG出力(JFreechart 1.0.0-pre2)

コマンドライン引数の取得とgetopt

コマンドライン引数を取得する方法と,それを簡単に行なうライブラリ関数getoptについて.引数の取得とりあえず引数を取ってみるgetopt 引数の取得 いろんなコマンドはいろんな引数をとる.int main(int argc,char *argv[])のargcが引数の数でargvが引数の値である.0番目の引数の値はプログラム自身の名前である. とりあえず引数を取ってみる 次のプログラムは全ての引数を表示するだけのものである. include int main(int argc,char *argv[]){int i; for(i=0;i<argc;i++){fprintf(stdout,”arg %d is %s\n”,i,argv[i]);} exit(0); }これを実行すると以下の感じになる.$> … More コマンドライン引数の取得とgetopt

コマンドライン引数の取得 その2

関数getopt_longは長い形式のオプションの取得に便利な関数である.これはGNU拡張らしい.長いオプションは大抵–で始まる.getopt_long外部変数オプションの設定サンプルgetopt_long_only getopt_long getopt_longはgetoptを拡張して–で始まる長い形式のオプションを解釈できるようにした関数である.POSIX準拠ではなく,GNU独自のものらしい.長い形式のオプションは一意に決まる限り短く省略できる.例えば,–foo –foovarの二つのみをオプションに持つコマンドがあった場合,–foovarは一意に決まる省略形–foovでも解釈される.int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int longindex); 各引数について以下に示す. argc,argv[]main関数の引数をそのまま渡す.*optstringgetoptと同様,短い形式のオプションを示す.*longopts長い形式のオプションを示す構造体optionの配列.longindex マッチした長い形式のオプションに対するlongoptsのインデクス.getopt_longのさらなる説明はオプションを示す構造体optionの説明が中心になる.struct … More コマンドライン引数の取得 その2

forkとwaitとゾンビプロセス

forkはプロセスのコピーを作成する.そしてwaitで待つ.処理の流れが一本から複数に分かれる様がフォークみたいだからforkなのだろうか.forkで何がコピーされるのかforkのサンプルwaitwaitのサンプルゾンビプロセスについて forkで何がコピーされるのか forkはそれを実行したプロセスの子プロセスを作成する.子プロセスは親プロセスのコピーである.プロセスをどこまで実行したか(プログラムカウンタ?)もコピーされるので,子プロセスはforkの返り値が返るところから実行される(と,思う).あと,ファイルディスクリプタなどもオープンされていればそのままコピーされる.コピーされないのはpidやppidとファイルロックやサスペンド中のシグナルぐらいだろうか.そして,そのforkの返り値によって,プロセスは自分が親プロセスか子プロセスかを知ることができる.成功すれば子プロセスには0が返り,親プロセスには子プロセスのPIDが返される.エラーの時は親プロセスに-1が返り,子プロセスは生成されない.-1が返ったときには,errnoに値がセットされているはず.EAGAIN親プロセスのページ・テーブルのコピーと子プロセスのタスク構造に生成に必要なメモリをfork が割り当てることができなかった.ENOMEMメモリが足りないために,forkは必要なカーネル構造体を割り当てることができなかった. 子プロセスはPIDが固有で,PPIDを親プロセスのPIDに設定されている以外は親プロセスのものがコピーされる. forkのサンプル 子プロセスを生成して子プロセスの親プロセスがそれぞれ自分と相手のPIDを表示するサンプルを作成してみた. 実行すると,以下のようになる.fork donefork donechild process. pid = 1261. my ppid = 1260parent process. pid … More forkとwaitとゾンビプロセス