All articles in feature

パッド

ウィンドウは物理画面や親ウィンドウの範囲内に収まっていなければならない.パッドとはそのような制約なしに自由な大きさで作成できる論理画面である.パッドの利点パッドの生成,操作,削除なんちゃってless パッドの利点 ウィンドウはかならず画面内に収まっていなければならないので,「後で表示するかもしれないが今は画面外にあるデータ」はなんらかの方法で確保しておくか,表示するときに取得,生成などをしなければならない.後者の場合は処理が複雑になりがちである.前者はシンプルに実装できそうだが,リソースを食いそうだ.パッドはこの前者の実装に便利である.すなわち,パッドを使用すると論理画面にまとめて表示データを格納しておいて,必要な分だけ物理画面で表示することが可能になる.しかも簡単に. パッドの生成,操作,削除 なんちゃってless スクロールのところでなんちゃってmoreを作成した.そしてパッドには上記のような利点がある.ということで,パッドを使用するサンプルはなんちゃってlessにしてみた. これはlessっぽい機能を持つ.C-n,C-p,C-v,M-vで画面を上下にスクロールする.そして’q’で終了する.また,画面右端での折り返しはしない.そのかわりC-f,C-bでの左右のスクロールを可能にしてみた.ちょっと残念なのが,冒頭のいくつかのdefine文だ.たぶんどっかのヘッダなどで定義されていると思うのだが,発見できなかった.また,ハマった点は,最初はrefreshしてからでないといきなりprefreshしても起動直後になにも表示されないということだった(サンプル中,main関数のswitch文の手前).ただし,何も表示されていない状態でキーを押すとファイルが表示される.

popenとpclose

パイプのopenとclose.popenとpclose読み込む書き出す popenとpclose popenとpcloseは指定したsystem関数にパイプ機能を加えた感じで使用できる.実際shell経由で引数のコマンドを渡すので,オーバーヘッドは大きいがワイルドカードなどを使用できる.で,パイプを使用すると,あるコマンドの出力を別のコマンドの入力に使用できる.例えばdmesg | headでは,dmesgの出力がheadの入力となりそしてそのheadの出力が端末に出力される. 読み込む popenはファイルストリームを開く.pcloseは閉じる.popenではファイルストリームが読み込み用か書き込み用かどちらかを選択する.読むか書くかと聞かれたら,なんとなくまずは読んでみたい気がするのは私だけだろうか.読み込み用で開く場合,popenしたプロセスはコマンドラインでは|の右側ということになる.以下,popenで読み込み用パイプストリームを開いた場合のサンプル. popenの第二引数に”r”を指定すると読み込みモードでパイプをオープンする.そしてこのとき読み込みようのファイルストリームが返る.失敗するとNULLを返す.以下実行結果.2003年 4月10日木曜日21:50:48JST 書き出す 読んだら書きたい.書き込み用でパイプをオープンしたプロセスはコマンドラインでは|の左側ということになる.以下サンプル. popenの第二引数に”w”を指定するとパイプを書き込みモードでオープンする.そして書き込みようのファイルストリームを返す.失敗するとNULLを返す.以下実行結果.Message: # ####################################################################################### ### ## #### ################# #### #### … More popenとpclose

beanタグライブラリ

beanタグライブラリはstruts-bean.tldに定義されている.こいつを使用すると,sessionにあるbeanなどから値を取り出せたりする.Sessionにいれた値を取り出すSessionにいれたBeanから値を取り出すSessionにいれたBeanからさらにBeanを取り出してそのBeanから値を取り出すActionFormBeanの値を取り出す Sessionにいれた値を取り出す あらかじめ,Actionクラスなどで,request.getSession().setAttribute(“hoge”,”fuga”);としておけば,JSPで とするとfugaが出力される. SessionにいれたBeanから値を取り出す あらかじめ,Actionクラスなどで,Sample sample = new Sample();request.getSession().setAttribute(“hoge”,sample);などとしておいて, とすると,hogeのgetFuga()が呼び出されて,その返り値が出力される.実は先に説明したSessionにいれた文字列を取り出す例は,ここで説明するパターンの特殊な場合である.つまり属性propertyを指定しなければ,nameで指定したオブジェクトがそのまま(toString())出力される. SessionにいれたBeanからさらにBeanを取り出してそのBeanから値を取り出す あらかじめ,Actionクラスなどで,Sample sample = new Sample();request.getSession().setAttribute(“hoge”,sample);などとしておいて,JSPで などとすると,まず一行目で属性idで指定した変数fooにhoge.getFuga()の返り値が格納され,二行目でfoo.getFooValue()の返り値が出力される. ActionFormBeanの値を取り出す JSPでは,そのJSPへforwardしたActionで指定したActionFormBeanは自動的にsessionに突っ込まれるらしく,こちらで突っ込むことなく使用できる.したがって,struts-config.xmlで … More beanタグライブラリ

Restlet

Restletは,JavaでRestアプリケーションを構築するための,軽量フレームワークである.これを使用すると,サーバ,クライアントのどちら側のRestアプリケーションでも簡単に作成できそうなので,試してみた.基本(Restlet 1.1.1)WADL拡張(Restlet 1.1.1)基本(Restlet 1.1.1)まずは基本.バージョン1.0と1.1では多少雰囲気が異なるようだが,機能が充実してそうなtestingの1.1.1を試してみる.はじめにいつもの2008-11-28T22:30+09:00 matsuまず,Restletについて簡単に調査したあと,入門の手始めとして例によってHelloしてみる.リソースの基本バリエーション2008-11-29T01:10+09:00 matsuRESTなんだから,まずはリソースに注目してみたい.Restletではリソースを表現であるRepresentationクラスのサブクラスがいくつかあるが,そのうち基本的なものを試してみた.Restletのアーキテクチャと設定ファイル2008-11-29T22:50+09:00 matsu何となく動かせるようになったので,Restletのアーキテクチャについて,基本から調査してみる.Restletの主要なクラスをじっくり見てみる(その1 RestletとFilter)2008-11-30T03:15+09:00 matsuフレームワークとしてのRestletでは,Restletクラスを継承して,いろいろな機能をもったRestletクラスが提供されている.それをガチャガチャと組み合わせて,RESTシステムを構築する.ということで,どんな機能を持ったRestletがあるのかを調査してみた.Restletの主要なクラスをじっくり見てみる(その2 RouterとRoute)2008-12-07T12:45+09:00 matsuRouterは複数のRouteを持ち,Routeは要求に応じてスコアを返す.Routerはスコアとルーティングモードに応じてRouteを選択し動かす.Restletの主要なクラスをじっくり見てみる(その3 FinderとHandler)2008-12-20T09:15+09:00 matsuそろそろREST(Representational State Transfer)と言っている割りに,いつになったらその「Representation」が出て来るんだ?と思えて来る.HandlerはそのRepresentationを扱うResourceの親.そしてFinderはHandlerを見つけて生成するRestletである.WADL拡張(Restlet 1.1.1)Restletのバージョン1.1で追加された機能として,WADLに関する拡張機能は比較的重要なものではないだろうか.この機能によって,WADLファイルを読み込んで,アプリケーションを自動的に構成できたりするようだ.サーバ側でWADLを使用してみる2008-11-29T00:20+09:00 matsuWADL拡張機能を使用すると,リソースクラスとWADLファイルを作成するだけでサーバ側restletを構築できるTOPページ不安火FeatureAutomakeAXISBASHスクリプトCommon LispC++C言語GDBGTKHibernateJFreeChartJNIMPEGNMSPerlPostgreSQLRestletSpringStrutsTaglibXMLXUL埋火PC Clusterベンチマーク調査ギガビットイーサネットの調査MPIで並列プログラミングSoftwarehpl_filterSiteGeneratorGCMonHKBSoftware(En)SiteGenerator

SpringでのMIMEのサポート(Spring1.2.1)

SpringはMIMEもサポートしているらしいので,試してみた.SpringでのMIMEサポートメール送信処理の記述setTextサンプル実行 SpringでのMIMEサポート Springでの,MIMEサポートは以下のような状況である.MailSenderの実装クラスはJavaMailSender.MIME形式のメールを構築するためのヘルパークラスがある.このように,さほど大がかりなものではないが,文字コードの扱いに関して,APIとしてややこしい部分があるので,その点に注意. 本頁のサンプルでは,MIMEで非マルチパートメールとマルチパートメールを送信するものを作成した. メール送信処理の記述 メール送信処理を記述する,MimeMailBLImplを以下に示す. setText MimeMessageHelperを使用すると,いちいちsetTextなどをする際に文字コードを指定する必要がない. コンストラクタのものが設定される. MimeMessageHelper#setTextには,その設定が楽になった分,HTMLメールか否かの引数がある.setText(String text)通常のテキストを設定する.setText(String text, boolean html)第二引数で,HTMLメールか否かを指定する. 第二引数に応じて,Content-Typeがtext/htmlに変化する.setText(String plainText, String htmlText)プレーンテキストと,HTMLテキストの両方を設定する. これは両方メールに記述し,メールクライアントにて表示を選択するようなメールである. サンプル実行 … More SpringでのMIMEのサポート(Spring1.2.1)

JNDIにてDataSourceを取得する設定(Spring1.2.1)

Springにて,HibernateのDataSourceをJNDIで取得する方法を調査してみた.JNDIによるDataSourceの設定Tomcatでのセキュリティ設定Servletコンテキストの設定デプロイと動作確認 JNDIによるDataSourceの設定 以下に本頁のサンプルのbeans.xmlを示す. id値sampleDataSourceがポイントである. classをJndiObjectFactoryBeanとし,あとはJNDI名を指定するだけである. 本頁のポイントは以上である. あとは以下の各要素を設定すると動作確認ができる.Springを使用したサーブレットのサンプル作成Tomcatでのセキュリティ設定DataSourceの設定を含むServletコンテキストの設定デプロイと動作確認これらのトピックはそれぞれ別頁に記述されており,本頁のサンプルではそれらを総合して動作させる. Tomcatでのセキュリティ設定 本頁のサンプルではシステムプロパティや設定ファイルを読み込むので,PermissionErrorが発生するかもしれない. ここでの主題ではないので,ざっくりと以下のような設定を行う.grant codeBase “file:/WEBアプリケーションのパス/-” {permission java.security.AllPermission;};これはザルな設定なので,重要な環境では,必要最小限の許可のみを行うようにする. 設定ファイルは,Debianな環境では/etc/tomcat4/policy.d/04webapps.policyになると思う. Servletコンテキストの設定 デプロイと動作確認 まず,warファイルを作成する.$ ant warできあがるspringsample.warを,先でservlet.xmlで設定した${webapp.docbase}に配置する. … More JNDIにてDataSourceを取得する設定(Spring1.2.1)

BeanFactoryPostProcessorとPropertyPlaceholderConfigurer(Spring1.2.1)

BeanFactoryPostProcessorは,BeanFactoryをインスタンス化した後に,そのインスタンスを引数にとり,何らかの処理をするものである.アプリケーションの起動後の初期化パターンとして使えることがあると思う.BeanFactoryPostProcessorの一つ,PropertyPlaceholderConfigurerは,設定ファイルであるbeans.xmlでの設定値を更に外部プロパティファイルへと移動することが可能な機能を持つらしいので,BeanFacotryPostProcesssorの挙動確認を兼ねて試してみた.BeanFactoryPostProcessorの組み込みPropertyPlaceholderConfigurerサンプルドライバ BeanFactoryPostProcessorの組み込み BeanFactoryPostProcessorは,インタフェースであり,以下のメソッドを宣言している.void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)ここで,アプリケーションにBeanFactoryPostProcessorを組み込むというのは,以下の作業を指す.BeanFactoryPostProcessor具象クラスの作成. あるいはSpringFrameworkにある上記具象クラスの選定. 本頁のサンプルでは,あるいはSpringFrameworkにあるPropertyPlaceholderConfigurerを使用する. この詳細は後述.BeanFactoryクラスの生成.上で作成あるいは生成したBeanFactoryPostProcessorクラスの生成.BeanFactoryPostProcessorのpostProcessBeanFactoryを呼び出す. 引数は先に生成したBeanFactoryオブジェクトである.postProcessBeanFactoryメソッド内で何をするかは,各アプリケーション毎の要件による. で,上の手作業でハードコードする手順だと,BeanFactoryPostProcessorはBeanFactory生成後処理の,統一的な仕組みを提供するということ以外にあまり意味はない. ところが,BeanFactoryを拡張したApplicationContextは,上記の作業のいくつかを自動的に行ってくれる. すなわち読み込んだbeans.xmlにBeanFactoryPostProcessorの具象クラスがあればそれを検出,生成し,該当beans.xmlを読み込んだBeanFactoryを引数としてpostProcessBeanFactoryを実行してくれる. BeanFactoryPostProcessor自身もbeans.xmlに記述することで,柔軟に初期化処理のモジュール化やDIが可能となる. PropertyPlaceholderConfigurer PropertyPlaceholderConfigurerは,beans.xmlに設定シンボルを記述し,そのシンボルに別プロパティファイルのプロパティ値を埋め込む. 以下はPropertyPlaceholderConfigurerを使用する本頁のサンプルのbeans.xmlである. ${…}で記述された部分は,今までならそのまま文字列としてbeanにsetされていたが,PropertyPlaceholderConfigurerの働きにより,プロパティファイルの値に置き換えられる. 例えば,プロパティファイルにsampleBean.value1=HOGEとあれば,beans.xmlの${sampleBean.value1}という記述はHOGEと置き換えられて処理される. この置き換えのタイミングは,PropertyPlaceholderConfigurer#postProcessBeanFactory呼び出し時である. サンプルドライバ … More BeanFactoryPostProcessorとPropertyPlaceholderConfigurer(Spring1.2.1)

breakとcontinue

繰り返し制御breakとcontinueはfor文,while文,until文(このページではこの三つをループと呼ぶ)で使用できるコマンドである.breakcontinue break breakはループを抜けるように指示する.while :doecho hogebreakdone上の例で:はtrueコマンドと同じである.trueコマンドは必ずtrueを返す.すなわち上の例は無限ループだが,hogeと一回表示したあとbreak文でループを抜ける.breakは一つの数値パラメータをとることができる.この数値(正の整数)で抜けるループの数を指定することができる. continue continueは次の繰り返しに飛ぶように指示する.while :doecho hogecontinueecho fugadone上の例も無限ループである.hogeを表示したあと,continueによって次の繰り返しに飛ぶ.したがって,fugaと表示されることはない.continueも一つの数値パラメータをとることができる.この数値(正の整数)でどのループの次の繰り返しに飛ぶかを指定できる.

セマフォ

共有メモリの話題に入る前の準備としてセマフォについて記述する.同期の問題セマフォとはセマフォを使ってみるセマフォと共有メモリ 同期の問題 二つのプロセス(もしくはスレッド)A,Bが共有する変数xがあったとする.そしてA,B両者がxに1を足すとする.xが0なら処理後のxの状態が2になっていることを期待してみる.Aがx(=0)の値を読み込む.Aがx(=0)に1を足してそれをxに書き込む.Bがx(=1)の値を読み込む.Bがx(=1)に1を足してそれをxに書き込む.この時x=2.上は「たまたま」正常なタイミングで動作した場合である.もしかしたら以下の状況なるかもしれない.Aがx(=0)の値を読み込む.Bがx(=0)の値を読み込む.Aがx(=0)に1を足してそれをxに書き込む.Bがx(=0)に1を足してそれをxに書き込む.この時x=1.期待に反してx=1となってしまった.これは「たまたま」プロセスの切替えタイミングが悪く,同期をとって処理すべき変数xに対してA,Bが非同期で処理してしまったから起こった現象である.このような処理をクリティカルセクションという.誰かがxをクリティカルセクションを処理しているときに,別の誰かはxを処理できない様にする必要がある. セマフォとは 上の問題を解決するために,ロック変数yを考えてみる.変数yが0の時は別のプロセスはxに対して処理をせず,1なら処理をする.したがってA,Bはxに対して処理する前にyをチェック,変更する.先のタイミングが悪かったパターンは以下のようになる.Aはy(=1)を読み込む.Aはyが1なのでこれを0にする.Aがx(=0)の値を読み込む.Bはy(=0)を読み込む.Bはyが0なので待つ.Aがx(=0)に1を足してそれをxに書き込む.Aはyを1に戻す.Bはy(=1)を読み込む.Bはyが1なのでこれを0にする.Bがx(=1)の値を読み込む.Bがx(=1)に1を足してそれをxに書き込む.Bはyを1に戻す.この時x=2.これでうまくいった.が,よく考えるとyに対してもまた最初のxと同じ状況が発生し得る.これではきりがないので,それを処理する間プロセスの切替えがおこらない何かが必要になる.これがセマフォ(semaphore)である.セマフォはDijkstraが発表したらしい.先のyがセマフォだったとすると,あるプロセスがyを読み込んで値を変更するまでの間,他のプロセスはyに対して処理しないことが保証されている.すなわちセマフォに対する処理はアトミックであることが保証されている.セマフォについてまとめてみた.0か正の整数をとる.waitとsignalという二つの操作だけが可能.waitをしたとき,値が1より大きければ値をデクリメントする.0ならば待つ.signalをしたとき,値が0より大きくなるのを待っているプロセスがあれば,そのプロセスを再開する.なければ値をインクリメントする.バイナリセマフォは0と1の二値をとる.汎用セマフォは0と複数の正の値をとる(例えば0,1,2).こうすると,クリティカルセクションの処理は以下のようになる.セマフォにwait操作をする.クリティカルセクションの実行.セマフォにsignal操作をする.これで問題は解決する. セマフォを使ってみる セマフォを使用するための関数には以下の3つがある.int semget(key_t key, int nsems, int semflg)keyで指定したnsems個からなるセマフォ集合の識別子を取得する.semflgはオプションでパーミッションなどもここで設定する.semflgでIPC_EXCLを指定するとセマフォが一意となることが保証される(keyがセマフォのために既に使用されていればsemgetは失敗する).int semop(int semid, struct sembuf *sops, unsigned nsops);semidで指定したセマフォ集合の操作のメンバを操作する.sopsはセマフォに設定したい値を持つsembuf構造体のnsops個の配列である.int … More セマフォ

bzlibでbz2ファイルを読み書きしてみる

bz2はメモリを喰うがzlibより圧縮効率がよいらしいので,そのライブラリbzlibを試してみた.bzlib.h圧縮エラーメッセージの取得解凍コンパイルと実行 bzlib.h 圧縮 データをbz2形式圧縮してファイル出力するサンプルを以下に示す. include include include define BZ2_MODE “wb” intmain(int argc, char *argv[]){if (argc != 4){fprintf(stderr, “Usage : %s … More bzlibでbz2ファイルを読み書きしてみる