datagridviewのcellselectの挙動

monthcalendarコントロールの表示が環境によって大幅に変わるため、datagridviewでカレンダーを自作したときにcellselectの挙動がどうもおかしかったのでメモ。datagridviewのプロパティでmultiselectをtrueにしてselectmodeをcellselectにすると、datagridviewのセル単位で選択をすることができるようになる。選択したセルはselecedcellsプロパティを参照すると値を取得することができるが、マウスでdatagridviewのセルを選択する方向によってインデックスの並びが異なることに気づいた。

cal_image1.png右の画像は、datagridviewで自作したカレンダーを模したもの。たとえばこのdatagridviewのセルを選択するとき、マウスの選択する操作が左上を基点に右、下、へと動いてセルを範囲選択したという場合。この場合だと、selectedcellsのインデックス0の値は26になる。そしてインデックスの最後の値は9ということになる。

cal_image2.png次に、セルを選択するときの基点が右下で、マウスを左、上、という風に動かしてセルをを範囲選択した場合。この場合だと、selectedcells(0).valueの値は12になる。インデックスの最後の値は26という風になってしまう。

cal_image3.pngもう一つのパターン。今度はセルの選択の基点が右下で、マウスを上、左、という風に動かしてセルを範囲選択した場合。この場合だと、selectedcells(0).valueの値は23、インデックスの最後の値は26という風になる。

セルの選択の方法によってインデックスの並びがそれぞれ変わり、統一性はないということになる。特にカレンダーのような順番に並んだセルの値を参照するときなどの場合に不都合が生じることになる。

eeepcのcドライブの容量が急に少なくなった

eramでメモリの一部をramディスクにしたり不要ファイルを削ったりとeeepcをカスタマイズしていたらいつの間にかcドライブのディスク容量が100MB以下になっていて警告が表示されるようになった。色々といじり回してしまったためどこが原因がつきとめるのに苦労したが、どうやら原因はページファイルを無効にしたときの設定がうまく完了できなかったようで、cドライブ直下にpagefile.sysというファイルが残ったままになっていた。このファイルが1GBもの大容量となっていて、4GBしかcドライブの容量がないeeepcでは大問題となる。これをそのまま削除していいものかどうか迷った結果、システムのパフォーマンスからページファイルの設定をもう一度して、再度ページファイル無しと設定してから再起動をするとキレイになくなっていた。

Cannot create resource instance

環境。

  • java:J2SE v 1.4.2_18
  • tomcat:4.1.37

上記の環境をwindowsとlinuxマシンで構築した。windowsで開発して、出来上がったものをlinuxサーバで運用するというイメージ。同じ環境であれば、windowsで作ったものをlinuxでも同じように動くだろうと思いきや、Cannot create resource instanceというエラーが発生してどうしても動かない。発生する場所はjdbc接続でmysqlに接続するときにこのエラーが発生する。この接続エラーが発生する理由については結局わからず終い。jdbcドライバ、mysqlのバージョン、文字コードなどチェックはしたけれど、


  DataSource ds  = (DataSource)initCon.lookup("java:comp/env/my_DB");
  Connection con = ds.getConnection();

のgetConnection();でどうもエラーが発生してresource instanceをcreateできない。原因を探るためにlinuxにeclipseをインストールしてデバッグをしてみようとしたけれど、このlinux版eclipseが死ぬほど重い上にtomcatプラグインが謎のエラーを出してまともに作業できない。何をやってもうまくいかなかったので最後の手段と思ってjavaとtomcatのバージョンを最新バージョンのものへアップグレードすることにした。すると、何の問題もなく動くようになった。インストールしたバージョンは次の通り。

  • java:jdk1.6.0_07
  • tomcat:5.5.26

もともと玄箱に合わせてあえて古いバージョンを使ってたのだけれど、玄箱があまりに遅いため代わりの別のマシンでサーバを構築することしにしたので、特にソフトのバージョンにこだわる必要がなくなった。

調べてみたら同様のエラーに遭遇している人は割りと多くいる模様。javaのJ2SE v 1.4.2_18とtomcatの4.1.37という組み合わせはあまりよくないのかもしれない。

玄箱でアプリケーションサーバの構築

・・・は、難しい。スペックではCPUが200Mhzでメモリが64MBという構成に玄箱はなっているけれど、ウェブアプリケーションを動かすサーバとしてこの性能はどうなのかわからなかったけれど、実際に動かしてみると実用にならない程に遅いということがわかった。ユーザがログインするだけで30秒もかかり、ユーザ登録の入力チェックだけで1分以上かかってしまうという結果になった。まさかこれほど遅いとは思わなかった。この性能のサーバでは静的なホームページ公開か単一スレッドの掲示板cgiを動かすのが精一杯だと思われる。

これでは動かすこともままならないので、中古のサーバを購入してきてそれでテストしてみることに。こんどのスペックはCPUはpentiumⅢの933Mhz*2で、メモリは1GBという構成でテストしてみることに。結果はどうなることやら。これでもろくに動かないとなると新しく最新CPUのサーバを新調するしかないが・・・。

ブラウザsafariのフォーカス

safariというブラウザのjavascriptについて。
親画面からサブウインドウをopenした後、サブウインドウ側からフォーカスを親画面に渡す方法が他のブラウザとは違うようなのでメモ。safariではjavascriptでフォーカスを渡す場合、現在フォーカスが当たっているウインドウのフォーカスをblurしてからでないと他の画面にフォーカスを渡すことができない模様。親画面からサブウインドウを開いて、サブウインドウでの処理が終わった後に再び親画面へフォーカスを渡す場合は、

	window.blur();
	window.opener.focus();

という風にする必要がある。

ウェブブラウザの違いによる文字化け

ウェブアプリケーションを作成する場合には避けては通れない問題の一つに文字化けがある。日本語データをクライアントとサーバでやりとりする場合にはURLエンコードをする必要があるので、それをデコードしたりする場合に問題が高確率で発生する。jspによるウェブアプリケーション作成時にも文字化けの問題が発生したのでメモ。

クライアントからデータをpostする場合に、ブラウザによって文字が化ける場合と化けない場合がある。request.getParameter(“Value”)でクライアントから送られた日本語データをサーバで受け取った場合に通常の状態ではfirefoxでは文字化けせずに受け取ることができたが、その他のブラウザ(ie,opera,safari)では文字化けが発生してしまった。サーバ側でrequest.getCharacterEncoding()の値を確認してみたところ、firefoxには文字コードが指定されていたが、その他のブラウザの場合は値がnullとなっていた。ならば、サーバ側でrequest.setCharacterEncoding(“UTF-8”)とすれば問題解決かと思ったけれど、そう簡単な問題でなく、サーバにリクエストが届く前にcharacterencodeingを指定しなければならない模様。

解決方法は、フィルタークラスを使って、リクエストの文字コードを指定してあげることで解決をすることができる。つまりviewからcontrollerへ命令を出す前に、文字コードの指定をしてからcontrollerへ値を渡すということになる。他にセンスが悪い解決方法としては、requestの環境変数からブラウザを判別して、問題のあるブラウザのみ文字コードの変換をするというのもあるけれど、これはブラウザの挙動を逐一チェックしなければならないので解決策が見つからない場合の最後の手段。とりあえずpostデータの文字化け問題はフィルタークラスを通すことで解決をすることが可能。

参考サイト

JavaでHello World サーブレット(フィルタ)編
http://www.hellohiro.com/filter.htm

Operation not allowed after ResultSet closed

mysqlにselect文を投げてその結果をresultsetオブジェクトに格納して、その内容をjspページに表示させようとしたときにOperation not allowed after ResultSet closedというエラーが発生した。駄目なのか。resultsetを単なるオブジェクトとして、vbで言うところのrecordsetのような感じで扱うことはできない模様。データベースへのコネクションとステートメントを確立してresultsetに結果を放り込む、この一連の経過でのみresultsetは扱うことができる模様。コネクションとステートメントを切断すると同時にresultsetもcloseされてしまう。

代替案として、多重配列でresultsetの内容をセットしておくという方法を採ることにした。

抽斗の意味

ネットで調べ物をしていたら「抽斗」という見慣れない言葉が使われていた。なんて読むのかわからなかったので国語辞書で検索をかけてみてもヒットしない。googleで調べていると、どうやら「引き出し」という意味らしい。国語辞書にも載っていないらしく調べるのに苦労した。

ハーマンミラー:セラチェアの昇降機能の故障

0722-002.jpgセラチェアを購入した。そしていきなり故障した。故障箇所は座面右側にある昇降レバー。使用はじめて数時間で変な音とともに昇降レバーが反応しなくなった。右の画像は壊れた直後の状態。昇降レバーから伸びるケーブルが本体部分につながるようになっているけれど、それを支えるゴムでできた接合部分が外れてしまった。これを正しくはめ直せばまた昇降機能は元通り動くようになるだろうけれど、意外に直せない。可能な範囲で元に戻すべく挑戦してみたけれど、直すには何か工具を使うか分解するかという方法をとらないことには無理だと判断した。工具で買ったばかりの椅子を傷だらけにするのも、分解して製品保証を無効にするのも、どちらも気が進まないのでおとなしく交換してもらうことに。

その後、新しくやってきたセラチェアの同じ部分を確認してみたところ、どうもこの部分は機構が脆弱にできている模様。リクライニングをしているうちにゴムの接合部分がずれてはずれそうな感じになる。セラチェアをこれから購入しようと検討している人は気に留めておいたら無難かもしれない。

xbox360のリングランプが赤く点滅して故障した

0722-021.jpgxbox360は故障が多いという噂は聞いていたけれど、私の所有するxbox360もついにその時が来てしまった。本体の電源を入れると、電源ボタン回りのリングが赤い点滅状態になり起動ができなくなってしまった。昨日まで普通に動いていたのにいきなりの故障。保証期間はとっくに切れているのでソニータイマーではなさそうだけれど、壊れるなら前もって兆候くらい現して欲しい。

0722-023.jpg赤リングが3つ点滅