「ほっ」と。キャンペーン
<   2009年 07月 ( 38 )   > この月の画像一覧
AccessとOLEDB JET経由でLIKE文のワイルドカードが変わる

Access で LIKE 演算子で0文字以上の文字を表す時は * を使いますよね。
ところが、JETエンジン使って mdb にアクセスする OLEDB経由の ADO.Net だと % という純粋なSQLに近い形しないとダメなようです。

/*Accessだとヒットする。 OLEDB経由だとヒットしない*/
SELECT *
FROM Customer
WHERE Address LIKE '*京都*'
 
/*Accessだとヒットしない。 OLEDB経由だとヒットする*/
SELECT *
FROM Customer
WHERE Address LIKE '%京都%'


Access でテスト用のクエリを書いて、.Net のコードに移植してたんですが、これに気付かずちょっとハマってしまいした。
Visual Studio 上のサーバエクスプローラから mdf ファイルを指定し、クエリたたけば OLEDB 経由になるので、これからはこっち使ったほうが安全ですね。

この仕様については、Microsoft Jet SQL と ANSI SQL との比較で解説されてます。
下記の引用部分が、その仕様について言ってるところですね。
ANSI SQL のワイルドカード文字を使用できるのは、Jet 4.x と Microsoft OLE DB Provider for Jet を組み合わせて使う場合だけです。Microsoft Access または DAO を介して ANSI SQL のワイルドカード文字を使うと、リテラルとして解釈されます。Microsoft OLE DB Provider for Jet と Jet 4.x を使用しているときは、Jet SQL のワイルドカード文字がリテラルとして解釈されます。
[PR]
by jehoshaphat | 2009-07-31 12:39 | SQL | Trackback | Comments(0)
影響が大きいATLの脆弱性
ITpro:過去に類を見ないほど“怖い”脆弱性、MSがパッチを緊急リリース

Visual Studio内の ATL(Active Template Library) に脆弱性が見つかったようで、ATLを使って作成された COM や ActiveX コントロールにもその脆弱性が含まれるようです。
なんか相当数の ActiveX コントロールがこの脆弱性の影響を受けてそうです。
MSがパッチ(MS09-035)を出してますが、これはあくまで Visual Studio 用のパッチであり、過去に作成した ActiveX コントロールの脆弱性を直すものではないということみたいなので、ActiveX開発側の対応がちゃんと対応しないといけないようですね。
でも漏れは出てきそうな気がします。

ただ、この脆弱性に関連するIE用のパッチ(MS09-034)もあり、これを適用するとIE経由でのこの脆弱性をついた攻撃は回避できるようなので、ちょっとは安心できそうです。

で、この脆弱性はたった1つのタイプミスで起きたらしいです。
詳しくはCNET:「IE」に対する最新攻撃の原因、たった1つのタイプミス参照。
どうやら、本来Read関数にポインタを渡さないと行けないのに、ポインタのアドレスを渡してしまったようです。
これがたった一文字「&」が余分についてることで起きてるんですから、タイプミスとは恐ろしいもんですね。

特にポインタからむ C,C++ 系ライブラリ作成時はほんとにメモリ管理気をつけないと怖いです。ちょっとしたミスでライブラリ使う全ての製品に影響を与えてしまいますからね。
最近はポインタ意識しない言語増えたたためちょっとは気が楽ですが。。。
[PR]
by jehoshaphat | 2009-07-31 09:11 | 思ったこととかニュースとか。。 | Trackback | Comments(0)
(Firefox)「メモリが不足しているためこのページのスクリプトは停止しました」エラーの暫定的対応

(Firefox) いつのまにかFirefox3.5がReleaseされてたのでいれてみたでも書きましたが、Firefox3.5を入れてから「メモリが不足しているためこのページのスクリプトは停止しました。」というエラーが頻発するようになりました。

あまりに頻発しだしたんでいろいろ調査してみることに。。

で、わかったのは自PCの場合、ページファイル使用量が最大値の200-300MBくらい手前まで使いきるとこの現象が起きるということです。(ここで言うページファイルはVistaのタスクマネージャに出てくるページファイルの項目です。物理メモリ+HDD上におく仮想メモリのことらしいです)
ちょうど下記のような感じです。
最大値2583MBの時、2338MBのページファイルを占有しているとおきました。
(このテストは VirutalPC で大量メモリで起動し、VisualStudio でデバッグ中という環境で行いました。Firefoxが使ってる物理メモリ(プライベートワーキングセット)は200MBくらい使ってます)
e0091163_151972.jpg


で、試しに仮想メモリのサイズをかなり増やしてみました。
最初上記エラー発生時は 500MB でしたが、それを 2500MB にしてみます。(Vistaは仮想メモリサイズ増やす時に再起動しなくていいので楽ですね。)
e0091163_153625.jpg


そしたら、メモリ不足のエラーが消えて正常に表示されるようになりました。ただし、仮想メモリの初期サイズを十分に確保しないとダメなようです。
(つまり最大サイズだけ増やしたのではNG)
e0091163_15599.jpg


抜本的な解決法にはなりませんが、とりあえず仮想メモリのサイズを増やしてやるといいようですね。
[PR]
by jehoshaphat | 2009-07-29 01:07 | Webがらみ | Trackback | Comments(0)
(ADO.Net)OLEDB経由でのMDBへの副問い合わせにパラメータクエリを使うとおかしくなることがある

OleDbCommand , OleDbDataAdapter オブジェクトを使って、SQLクエリを書いたんですが、どうも挙動がおかしいのです。
SQLには WHERE,FROM 句の中で副問い合わせ(サブクエリ)を多数使い、サブクエリ内で OleDbParameter を使いパラメータで抽出条件となる値を設定してます。

で、サブクエリを書いた位置によって、「抽出条件でデータ型が一致しません。」とかいうエラーがでたり、明らかに条件に一致するデータがあるのに抽出できなかったりとするのです。

どうやら何かの原因でパラメータの順序が入れ替わっているようです。
(もともと OLEDB のパラメータクエリは、プレースホルダを ? で表現し、OleDbCommand.Parameters に追加した順番で適用されます。)

いろいろ検索してると、MSサポート:OLE DB Provider for Jet 4.0 または Office 12.0 Access Database Engine OLE DB Provider を使用時にサブ クエリを持つパラメータ クエリを実行すると、予期しない結果を返す場合があるというのを見つけました。

どうやら、この問題は JET のバグっぽいですね。

対策としては、上記のページにあるようにメインのSQLクエリの前に
PARAMETERS p1 Text,p2 Long; SLECT ....
という感じで PARAMETERS を使い、ここで宣言したパラメータ変数(?)の順番で、パラメータを設定すればいいようです。


この原因探るのに数時間かかりました。この現象気付く人も結構少ないんじゃないでしょうか。。
バグってのはほんと勘弁してほしいですよね。
[PR]
by jehoshaphat | 2009-07-28 22:46 | .Net開発 | Trackback | Comments(0)
スリープ状態が有効にならない
Vistaの休止状態の記事を書いてて、ふと思いだしたのがサーバにしてるPCの電源オプションです。
Windows Server 2008(x64) なんですが、確か終了オプションにスタンバイとかスリープとか無かったような。。。

確認してみると、確かにありません。
コントロールパネルの電源オプション(Vista同様わかりにくい)にも、スリープや休止状態に関する設定が無いか見てみましたが、やはりありません。
どうやら、OSがスリープ、休止状態機能を認識してないっぽいです。

それで、下記コマンドでシステムがどの電源オプションに対応しているか調べてみました。

>powercfg /a
以下のスリープ状態はこのシステムでは利用できません:
スタンバイ (S1)
内部システム コンポーネントでこのスタンバイ状態が無効になっています。
スタンバイ (S2)
システム ファームウェアはこのスタンバイ状態をサポートしていません。
内部システム コンポーネントでこのスタンバイ状態が無効になっています。
スタンバイ (S3)
システム ファームウェアはこのスタンバイ状態をサポートしていません。
内部システム コンポーネントでこのスタンバイ状態が無効になっています。
休止状態
内部システム コンポーネントで休止状態が無効になっています。
ハイブリッド スリープ


ググってみるとMSサポート:Windows XP、Windows Server 2003、Windows Vista、および Windows Server 2008 で 4 GB を超えるメモリを搭載したコンピュータを休止状態にできないというのを発見。
どうやら4GBを超えるメモリが搭載していると休止状態はサポートされないようです。
確かにサーバPCのメモリは4GBです。

MSサポート:Windows Server 2008 を実行しているコンピュータで Windows Vista のユーザー エクスペリエンス機能を有効にする方でスリープの要件が書かれていました。
BIOSもS3にしてますし、ドライバも最新に入れなおしました。

でも、やはりダメです。
マザボやユーティリティの問題かと思い、いろいろやってみましたが、結局スリープを有効にできませんでした。
(参考:Vistaでスリープ失敗メインPCが休止状態から勝手に復帰)

まあ、サーバOSで常に電源入れっぱなしなので、スリープ使えなくてもいいんですが、気になります。
[PR]
by jehoshaphat | 2009-07-28 04:10 | 豆知識 | Trackback | Comments(0)
いつの間にかauでUTF-8のメールが見えるように

携帯へのメール送信テストの評価を手伝っていたんですが、試しに文字コードが UTF-8 のメールをauの携帯に送信してみました。

以前1,2年ほど前にやった時は携帯が UTF-8 には対応してない とのことで文字化けしてたんですが、今回は正常に見れてます。(機種は同じ)

で、KDDI のページ見てると、どうやら昨年の11月あたりから UTF-8 も表示できるように対応したっぽいです。(それも UTF-8 がデフォルトの iPhone のおかげ)
上のニュースリリース見た感じでは、ezweb のゲートウェイ側で対応したっぽいです。

ただ、Unicodeオンリーな文字(⑴とか㎥とか)は、? として出力してます。
多分、ゲートウェイで JIS(iso-2022-jp) に変換出来るものだけ変換して、それ以外は ? であらわす仕様なんでしょう。

なので、UTF-8 に対応したからと言って Unicode オンリーな文字が表示できるわけではないようです。

でもまあ、Gmailで文字コードを UTF-8 にして送ってくる友人からのメールがちゃんと見えるようになったのはよかったです。
[PR]
by jehoshaphat | 2009-07-27 19:21 | 豆知識 | Trackback | Comments(0)
(Vista)休止状態有効にする
動画編集作業中、Cドライブの容量が少なくなったのでディスククリーンアップを使って一時的に休止状態ファイル(hiberfil.sys)を消しました。
(OSは Windows Vista です)
で、空き領域を確保したのち、再度休止状態を有効にしようと思ったんですが、どこで有効にするのか不明に。。

XPの時は電源オプションの詳細設定タブから休止状態を有効にするみたいなチェックがあったと思うんですが、Vistaの電源オプションにはそれっぽいのがありません。
(というか、Vistaの電源オプションわかりにくすぎ。。)

それで、ググったところコマンドから指定しないとダメみたいです。(GUIでは用意されてない)
下記コマンドで休止状態を有効にできるようです。

>powercfg /hibernate on


これで有効にして休止状態にして、電源投入後、復元に失敗したとのメッセージが。。
再起動して、コマンドから休止状態OFFにし、再度ONにしたらちゃんと復元できるようなりました。一体何だったんだろう。。

参考:
MSサポート:Windows Vista ベースのコンピューターで休止状態を有効にする方法
[PR]
by jehoshaphat | 2009-07-27 18:33 | 豆知識 | Trackback | Comments(0)
(.Net)DataGridViewでソートするとチェックボックス列の値が消える
DataGridView で DB から取得した DataTable をデータソースとしてバインドし、DataGridViewCheckBoxColumn 列を追加しました。
その状態で、何かチェックを付けてソートすると、チェックが全て消えるという現象が発生。

調べてみると、uedakoの日記:DataGridViewとチェックボックスとソートの話で同じ現象で悩んでる人発見。

どうやら、バインド列と非バインド列が混在してる場合、こうなるのがMSの仕様だそうです。
確かに、MSDN:Windows フォーム DataGridView コントロール内の列の並べ替えモードをみると、そう書かれています。

で、ソート時に非バインド列で値を保持するためには、DataGridView.VirtualMode = True にして、仮想モードでやればいいようです。
しかし、これをすると様々な動作を自分で書いて実装しないと行けないらしく非常に面倒です。(仮想モードは大量のデータをグリッドに表示するときにパフォーマンスを落とさないようするときに使う場合が多いみたい)
一応仮想モード時のサンプルがMSDN:方法 : Windows フォーム DataGridView コントロールで仮想モードを実装するにあるんですが、ちらっと見たところやっぱり面倒くさそうです。

それで、DBから取得した後の DataTable に対して Boolean 型の DataColumn を追加して、それを DataGridView にバインドさせる方法をとることにしました。
なお、チェックボックス列は先頭に表示することとします。(DataGridViewColumnの DisplayIndex プロパティで指定)
コードはこんな感じです。

Public Class Form1
'TableAdapter VisualStudioのDataSetデザイナが作ってくれたやつ使用
Private m_adp As New Database1DataSetTableAdapters.table1TableAdapter()
'DBから取得したデータを保存してる DataTalbe
Private m_tbl As DataTable
 
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'DBからデータ取得
m_tbl = m_adp.GetData()
 
'DataTable にチェックボックス用の Boolean 列用意
Dim clmCheck As New DataColumn("check", Type.GetType("System.Boolean"))
m_tbl.Columns.Add(clmCheck)
 
'グリッドにバインド
Me.DataGridView1.DataSource = m_tbl
 
'チェックボックス用列を最初に表示
Me.DataGridView1.Columns("check").DisplayIndex = 0
Me.DataGridView1.Columns("check").SortMode = DataGridViewColumnSortMode.Automatic
End Sub
End Class

これでちゃんとソートしても値が保持されるようになりました。
[PR]
by jehoshaphat | 2009-07-25 04:32 | .Net開発 | Trackback | Comments(0)
Hyper-Vの仮想HDDイメージを保存してたハードディスクがお亡くなりに
ことの発端は、公開してるWEBアプリでログインができないという苦情をもらってからです。

このWEBアプリは Hyper-V 上の CentOS で構築してます。DB は MySQL。
で、MySQL のデータファイル置いてる /var は /(ルート) とは別の仮想HDDファイルとして、外付けのUSB HDD においてました。

まず、ログインできんということはDBがおかしいと思い、リモート端末から MySQL Administrator でデータを見ようとしましたが、見れません。
次に、CentOS のコンソールにつなぎ MySQL サービスを再起動かけてみました。
すると、下記のようなことに。

[root@localhost ~]# service mysqld restart
rm: cannot remove `/var/lock/subsys/mysqld': 読み込み専用ファイルシステムです
rm: cannot remove `/var/lib/mysql/mysql.sock': 読み込み専用ファイルシステムです
MySQL を停止中: [ OK ]
touch: cannot touch `/var/log/mysqld.log': 読み込み専用ファイルシステムです
chown: `/var/log/mysqld.log' の所有権を変更中: 読み込み専用ファイルシステムです
chmod: changing permissions of `/var/log/mysqld.log': 読み込み専用ファイルシステムです
chown: `/var/lib/mysql' の所有権を変更中: 読み込み専用ファイルシステムです
chmod: changing permissions of `/var/lib/mysql': 読み込み専用ファイルシステムです
Timeout error occurred trying to start MySQL Daemon.
MySQL を起動中: [失敗]

MySQL関連ファイルが読めないようです。

そこから探っていくと、仮想HDDファイル自体が壊れていることが発覚。
そして、外付けUSB HDD を「ファイルシステムエラーを自動的に修復する」オプションありでホストOSリブート時にチェックディスクすると、なんと仮想HDDのファイルが、FILE0001 .chk というファイルに変わってしまっています。
どうやら、修復に失敗した模様。破損ファイルからデータ復元は非常に難しいみたいなのであきらめました。

不良セクタのチェックありで、チェックディスク走らすと下記のようになりました。
e0091163_9335044.jpg

大量の不良セクタです。これがチェックディスク走らすたびに増えていきます。
本当に危篤状態のようで。。。。

まあ、これ以上HDDがよくなることは無いと思うので、スクラップ行きですな。

やっぱり日ごろから S.M.A.R.T 情報チェックして、HDDの健康も監視しておかないといけませんね。
ただ、USB接続の場合 S.M.A.R.T って取得できなかった気が。。
[PR]
by jehoshaphat | 2009-07-24 08:35 | ハードウェア | Trackback | Comments(2)
Google Reader で画像が表示されなくなった
件名の通りですが、Google Reader で購読してるブログの画像ファイルが見えなくなりました。

で、調べてると、URL で https だと画像表示されて、http だと表示されないことが分かりました。

ということで、
https://www.google.com/reader/view/....
とするとちゃんと表示されました。
[PR]
by jehoshaphat | 2009-07-24 08:25 | 豆知識 | Trackback | Comments(0)