<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>USO800</title><link>http://blogs.wankuma.com/oakbow/</link><description>気分屋の日記</description><managingEditor>Oakbow</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Oakbow</dc:creator><title>[Hibernate] O/Rマッパーって、ほんとに必要？</title><link>http://blogs.wankuma.com/oakbow/archive/2010/08/12/192280.aspx</link><pubDate>Thu, 12 Aug 2010 23:43:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2010/08/12/192280.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/192280.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2010/08/12/192280.aspx#Feedback</comments><slash:comments>122</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/192280.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/192280.aspx</trackback:ping><description>&lt;p&gt;O/Rマッパー。&lt;br&gt;
半ば常識、使って当たり前みたいに言われているフレームワーク。&lt;br&gt;
多分この分野で一番元気なのはJavaだと思うんだけど、Javaに限っても結構な数があります。&lt;/p&gt;

&lt;p&gt;私の初O/RマッパーはHibernateでした。&lt;br&gt;
全体の開発期間は2年、実装からリリースまでの期間は1年半という、中規模程度のWebアプリケーションで採用。&lt;br&gt;
実際にはHibernateを素で触ることはほとんどなく、SpringのHibernateサポート機能を通じて操作しています。&lt;/p&gt;

&lt;p&gt;初見の感想は、&lt;br&gt;
「軍手二枚重ねにした上で、箸で皿に盛られた豆つまんでる様な感覚」&lt;br&gt;
でした。&lt;br&gt;
素手で掴めばいいだろうと。&lt;/p&gt;

&lt;p&gt;Hibernateを含めたO/Rマッパーの情報を漁ると、ほとんどが礼賛、という状況です。&lt;br&gt;
個人的には不思議でなりません。&lt;br&gt;
SQL覚えてなくていいとか分からなくてもいいなんて書いてある場合は、嘘はやめろとさえ思います。&lt;br&gt;
デバッグモードなりでコンソールにSQLを吐かせて、意図通りのクエリが発行されているか確認するのは必須でしょう。&lt;/p&gt;

&lt;p&gt;Javaのように、オブジェクトありきの言語では、実際O/Rマッパーは必要だと思います。&lt;br&gt;
オブジェクトへのマッピングを行うフレームワーク、という存在自体は。&lt;/p&gt;

&lt;p&gt;でも、CriteriaやHQLなどの、SQLを自動発行できる仕組みはそれほど必要だろうか？と思ってしまいます。&lt;/p&gt;

&lt;p&gt;もちろんあれば便利です。&lt;br&gt;
SQLを組むときとJavaでプログラミングしているとき、私は頭の中の思考回路というか、ロジックの組み方というか、頭の回転方法自体がちょっと違っています。&lt;br&gt;
しばらくJavaばかり触っていて、しばらくぶりにSQLを書くときなどは少々頭の切り替えが必要になります。&lt;br&gt;
Criteriaを使うのであれば、Java的思考からSQL的思考に切り替えずに組むことが出来ます。&lt;br&gt;
まあ、Criteria組み終えたらDAOをテスト実行して発行されるクエリを確認するので、そこで切り替えは必要にはなるのですけれど。&lt;/p&gt;

&lt;p&gt;こういう感覚が一般的なものなのか私くらいのものなのか分かりませんが、JavaよりSQLの経験の方が長く、よりDBに親しんでいる私でさえこう感じるので、世のJavaプログラマーがJava上でのプログラムで完結させたくなる気持ちは分からないでもありません。&lt;br&gt;
でも、私はこれ、RDBMSを使う時点で必要となる苦労だと思ってるんですよね。&lt;/p&gt;

&lt;p&gt;Hibernate、決して簡単ではありません。&lt;br&gt;
&lt;a href="http://www.itarchitect.jp/enterprise/-/20114.html"&gt;Hibernateトラブルシューティング&lt;/a&gt;&lt;br&gt;
こちらの第1回と第2回に説明されている内容くらいは基本として踏まえていないとまともに使えないと思います。&lt;br&gt;
さもないと、「動くけど使い物にならない」システムになりかねません。&lt;br&gt;
テスト工程で様々な問題が発覚し、リリース直前まで慌てることになります。&lt;br&gt;
･･･というかなりました。&lt;/p&gt;

&lt;p&gt;こういった意見への反論はたいてい、「それはHibernateへの理解が足らないから」というもので、実際その通りだと思います。&lt;br&gt;
逆に言うとそれだけ学習コストの高い代物で、1年程度のプロジェクトを１件こなして初級に到達できるように感じています。&lt;br&gt;
自在に操れるようになるまで案件いくつこなせばいいんでしょうか？&lt;br&gt;
少なくとも中級程度には使える人がプロジェクトメンバーにいないと、とても採用できないくらい難しいと感じています。&lt;/p&gt;

&lt;p&gt;O/Rマッパーの謳い文句にはよく、「90%のSQLを自動発行することで効率化」というものがあります。&lt;br&gt;
個人的に90%は眉唾ですが、少なくとも残り10%は手書きのSQLが必要であることを認めていることになります。&lt;br&gt;
量にして10%ですが、当然そのクエリは自動発行では対応できないような複雑なものだったり、パフォーマンスを要求されるものだったりするわけです。&lt;br&gt;
おそらく、RDBMSの実行計画とにらめっこしてクエリを書くことが出来る、中級以上のSQL熟練者が必要になるんじゃないでしょうか。&lt;/p&gt;

&lt;p&gt;O/Rマッパーが自動発行してくれる90%のSQLは単純で組むのが簡単なものがほとんどなわけで。&lt;br&gt;
あれ？&lt;br&gt;
Hibernate使うならHibernate熟練者が必要だけど、どっちにしろSQLの熟練者もいるよね？&lt;br&gt;
最初からその人に簡単な方までやってもらえばいいんじゃね？&lt;br&gt;
数は多くて正直めんどくさいけど、書くのに時間はかからないわけで。&lt;/p&gt;

&lt;p&gt;もちろんホンモノの世のHibernate熟練者はSQL覚えなくていいなんてタワゴト吐いたりはしてないでしょうし、SQL熟練者を兼ねている可能性は高いです。&lt;br&gt;
でも、Hibernate熟練者とSQL熟練者、探すならどっちが楽でしょうね？&lt;br&gt;
彼らが技術リーダー的立場になって、他のプロジェクトメンバーにノウハウ伝授しつつスキルレベルを向上させながら開発していく、なんてことも多いと思いますが、どっちが習得しやすくて、以後のプロジェクトでもより活用しやすいでしょうね？&lt;/p&gt;

&lt;p&gt;Hibernateは現状、JavaのO/Rマッパーの中では最も評価が高く、おそらく採用実績も多いと思いますが、10年後には存在しているかすら怪しいです。&lt;br&gt;
RDBMSは10年後も現役でしょうし、今のSQLの知識は変わらず活きると思いますけどね。&lt;br&gt;
KVSって対抗馬がいるんで今より地位は下がる可能性は結構高いとは思いますけれど。&lt;/p&gt;


&lt;p&gt;「軍手二枚重ねにした上で、箸で皿に盛られた豆つまんでる様な感覚」&lt;br&gt;
Hibernateを触り始めてもう二年になりますが、この感覚はあまり変わりません。&lt;br&gt;
さすがに慣れたので、軍手二枚重ねが一枚になったくらいではありますけれど。&lt;br&gt;
「動くけど使い物にならない」ところをNative Queryに書き換えまくり（HQLはハナから考慮の対象外）ましたが、もっと早くからCriteriaの仕様箇所を限定すべきだった、という思いが強いです。&lt;br&gt;
書き換えた方がよい箇所はまだまだあるんですが、優先度や工数、金銭的な問題で手を出せないという現実がありまして。&lt;br&gt;
技術者的感覚では手を出したくてたまらないところですが、運用に入っているとそうもいきません。&lt;/p&gt;

&lt;p&gt;Hibernateがもたらしたものはなにか？&lt;br&gt;
純粋な意味でのO/Rマッピングでは助けてくれました。&lt;br&gt;
オブジェクトへのマッピングを手作業でやっていてはとても大変だったでしょう。&lt;br&gt;
でも、Natige Queryへの書き換えを余儀なくされた分、楽させてもらった部分、効率化の恩恵は軽く吹っ飛んでいます。&lt;br&gt;
Native Queryへの書き換え（できればストアドへの書き換え）を行いたい部分は要するに使えはするけど重ったるいとか、もっさりしてるとかそういう機能な訳でして。&lt;br&gt;
そういった部分で顧客の心象を悪くしているだろうなーとか思ったりもする訳で。&lt;/p&gt;

&lt;p&gt;私自身はフルストアドを真面目に提案したくらいSQL寄りな考え方なので割り引いてもらう必要があるとは思いますが、Hibernateがもたらした効率化は軽くマイナスになっています。&lt;br&gt;
O/Rマッパーというものを経験できたという意味で私の経歴にはプラスになっているのですが、こと採用プロジェクトにかんしてはマイナスです。&lt;br&gt;
使わなかった方がマシか、発行クエリをすべてNative Queryにしてしまうか、まあコレクションじゃないオブジェクトに対する単純なCRUD操作くらいに限定すべきだった、という感想です。&lt;br&gt;
それもまた、プロジェクトが終わったあと、ある意味神の視点からじゃないと出せない都合のいい感想ですけれど。&lt;/p&gt;

&lt;p&gt;まあ私が見た痛い目は、対象となるデータ量の見積もりが甘かったってことに尽きるんですけどね。&lt;br&gt;
バッチ処理やバルク処理に弱いとは聞いてたけど、四日かかる処理が15分に短縮できたとかどこの世界ですかって話になる訳で。&lt;/p&gt;


&lt;p&gt;というわけで、私自身は今後Hibernateを他のプロジェクトで使うことはないと思います。&lt;br&gt;
iBatisとかS2JDBCとかS2DAOに興味はありますけどね。&lt;br&gt;
正直アプリケーションが吐くクエリは完全に管理したいので、フルストアドが理想なのは変わりません。&lt;br&gt;
メンバーの担当分野を層で分けるやり方って、あんまり一般的じゃないのかなあ。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/192280.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Small Talk]「～を検索」は正直邪魔だと思います。</title><link>http://blogs.wankuma.com/oakbow/archive/2010/01/12/184900.aspx</link><pubDate>Tue, 12 Jan 2010 21:15:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2010/01/12/184900.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/184900.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2010/01/12/184900.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/184900.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/184900.aspx</trackback:ping><description>&lt;P&gt;Google Tool Barのアレです。&lt;/P&gt;
&lt;P&gt;検索キーワードの入力欄に文字列を入力すると、全角スペース一個分くらいの隙間の跡に「を検索」って表示されるようになりましたね。&lt;/P&gt;
&lt;P&gt;慣れてはきましたが、治りかけのかさぶた（今剥がすと確実に出血）くらいどうにかしたくなってくるのは私だけでしょうか。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;携帯電話の予測変換ばりに、入力中の検索キーワードの文字列に対して補完機能が働くようになりましたね。&lt;/P&gt;
&lt;P&gt;この機能自体には結構感心しました。IMEをONにするの忘れて直接入力していても、ローマ字から日本語に補完してくれるし。&lt;/P&gt;
&lt;P&gt;でも、でもね。&lt;/P&gt;
&lt;P&gt;私の環境だけなのか分かりませんが、リコメンド機能よろしく出てくるプルダウンメニューが、びろーんと下に垂れ下がったままになることがよくあります。&lt;/P&gt;
&lt;P&gt;舌をびろーんと垂れ下げたまましまい忘れてるシュウたんは可愛いですが、こちらは可愛くありません。&lt;/P&gt;
&lt;P&gt;タブに重なるので切り替えにくくなるし、当座の作業に問題なくても気になって仕方ないのでなんとか閉じさせようとするんですが、これがなぜかなかなか閉じないんですね。&lt;/P&gt;
&lt;P&gt;自宅環境のIE8ではあんまり起きない気がするので、会社環境のIE7が原因なのかな？&lt;/P&gt;
&lt;P&gt;できればさっさとIE8にしたいところですが、Webアプリケーションの動作確認の時には重宝するので悩みどころです。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/184900.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Small Talk]ごめん、組閣で忙しくて･･･</title><link>http://blogs.wankuma.com/oakbow/archive/2009/09/14/181239.aspx</link><pubDate>Mon, 14 Sep 2009 23:43:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/09/14/181239.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/181239.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/09/14/181239.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/181239.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/181239.aspx</trackback:ping><description>&lt;P&gt;（最長）4年に一度の一発ネタ。もうすぐ期限切れです。ご賞味はお早めに。&lt;/P&gt;
&lt;P&gt;私は麻生内閣と福田内閣と安倍内閣でもう使っちゃったので今回は見送ります。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;「ちょっと～～、30分の遅刻よ！」&lt;/LI&gt;
&lt;LI&gt;「今日は早く帰れるって言ったでしょ！」&lt;/LI&gt;
&lt;LI&gt;「晩御飯ま～だ～？」&lt;/LI&gt;
&lt;LI&gt;「仕事とあたし、どっちが大事？」&lt;/LI&gt;
&lt;LI&gt;「君、昨日中に仕上げるっていってた企画書、まだできとらんのかね？！」&lt;/LI&gt;
&lt;LI&gt;「おい、上原ぁ！！！！！！！！」&lt;/LI&gt;
&lt;LI&gt;「奥さん、今日こそは耳揃えて返してくれるんだろうなァ」&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;などなど、ちょっとしたピンチにご活用ください（最後のはアウトかもしれん）。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ちょっとした変化球として&lt;/P&gt;
&lt;P&gt;「燕尾服仕立てるの結構時間かかっちゃって・・・」&lt;/P&gt;
&lt;P&gt;「連立調整に手間取ってさ・・・」&lt;/P&gt;
&lt;P&gt;などがあります。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;応用すれば「補正予算が・・・」「内閣不信任案が・・・」とかちょっと前だったら「衆院選が・・・」いろいろいくらでも活用できますが、あまり政治ネタばかり使うとウザくなるのでほどほどに。&lt;/P&gt;
&lt;P&gt;ほとぼりが冷めたころに、できればスポーツとか別ジャンルでやるとよいです☆&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/181239.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Browser]IEのウィンドウごとのセッション共有・非共有</title><link>http://blogs.wankuma.com/oakbow/archive/2009/09/13/181169.aspx</link><pubDate>Sun, 13 Sep 2009 00:26:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/09/13/181169.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/181169.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/09/13/181169.aspx#Feedback</comments><slash:comments>1905</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/181169.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/181169.aspx</trackback:ping><description>&lt;P&gt;私の自宅環境（Windows Xp Professional）でも、とうとうWindows UpdateでIE8が入りました。&lt;/P&gt;
&lt;P&gt;会社では3台のPCがあって、それぞれブラウザが違ったりします。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Windows Server2003 R2 日本語版を2年ほど前に自分でインストール。最初に入ってたブラウザはIE6。&lt;BR&gt;自動更新が利かない環境なので、手動でWindows Updateをやっている。&lt;BR&gt;1～2ヶ月ほど前から重要な更新でIE8が出てくるようになるも、IE6のまま使用。&lt;/LI&gt;
&lt;LI&gt;Windows Server2003 R2 英語版を2年ほど前に自分でインストール。最初に入っていたブラウザは多分IE7。&lt;BR&gt;自動更新が利かない環境なので、手動でWindows Updateをやっている。&lt;BR&gt;2～3ヶ月ほど前に重要な更新でIE8が出てきたので、そのまま入れて使用。&lt;/LI&gt;
&lt;LI&gt;Windows Xp Professional 日本語版のプリインストールマシン。1年半ほど前に購入。最初に入っていたブラウザはIE7。&lt;BR&gt;会社のWSUSの環境下にあるので、自動更新でWindows Updateをやっている。&lt;BR&gt;IE8は会社的にまだっぽいので、重要な更新に出てくることは無い。IE7のまま使用。&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;WindowsXpプリインストールマシンでも、ブラウザがIE6だったりIE7だったりする。&lt;/P&gt;
&lt;P&gt;重要な更新でIE8が出てくるようになった時期もなんかちょっと違ったりしますね。環境かな？&lt;/P&gt;
&lt;P&gt;IE7は日本だけなぜかまともにWindows Updateで配信されていないので、ほとんどの人がIE6→IE8に一気に飛んじゃうでしょうか。&lt;/P&gt;
&lt;P&gt;重要な更新に含まれているので、今後一気に移行が進んでいきそうですね。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;さて、前置きが長くなりましたが、IEのセッションクッキーについて。&lt;/P&gt;
&lt;P&gt;Webアプリケーションで一般的に使用されるセッションは、セッションIDと呼ばれるキーとなる情報をクライアントとサーバ双方で保持することで成り立っています。&lt;/P&gt;
&lt;P&gt;クライアント（ブラウザ）がWebアプリケーションに最初にアクセスしたときに、WebアプリケーションはセッションIDを生成し、その値を持つクッキーの発行をブラウザに要求します。&lt;/P&gt;
&lt;P&gt;クッキーに対応したブラウザであればその要求を受け入れ、以後同じサイトへのアクセスであれば、毎回セッションIDをクッキーで送信するようになります。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;通常のクッキーはプレーンテキストでブラウザが管理する一時ファイル領域に保存され、ブラウザやOSがシャットダウンされても、次回アクセス時にそのまま使用できるようになっています。&lt;/P&gt;
&lt;P&gt;が、セッションクッキーだけは別で、これはブラウザが保持するメモリ領域のみに保持され、ブラウザやOSがシャットダウンされると消えてしまうようになっています。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ここまでが一般のセッションクッキーの共通知識ですよね。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;で、複数のウィンドウを開いているときに、セッションクッキーがブラウザでどう扱われているかって情報は見かけない気がして、数年前に一度調べたことがあります。&lt;/P&gt;
&lt;P&gt;IE8が出てから復習もかねて調べなおしたりしたので、そのまとめ。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;IE6&lt;BR&gt;セッションはプロセス単位で共有しています。ごく普通のマルチスレッドアプリケーションのメモリの扱いと一緒っていっていいかな？&lt;BR&gt;IE6では、「CTRL+N」や「ファイル」→「新規ウィンドウ」、ハイパーリンクをShiftキーを押しながらクリック、ページ内のHTMLやJavaScriptの記述により別ウィンドウを開く、という操作では、ウィンドウ自体は別であっても同じプロセス内で動作しています。&lt;BR&gt;すでに存在するウィンドウから開いたウィンドウであれば同じプロセス、と考えていいと思います。&lt;BR&gt;それに対して、スタートメニューやデスクトップのアイコンからなど、既存のウィンドウに依存しないやり方で新しくウィンドウを開いた場合は、別のプロセスで起動します。&lt;BR&gt;このような違いが発生するので、例えば後者のやり方で二つのウィンドウを開いた状態にすると、セッション管理された会員ページとかで、別々の会員としてログインして動作確認をしたりって事が可能です。&lt;BR&gt;前者のやり方でウィンドウを二つ開くと、片方で会員ページにログインすれば、もう片方はいきなり会員ページ内にアクセスさせても普通に操作できたりもします。&lt;BR&gt;一人の会員に対して何度もログインログアウトを繰り返すような動作確認を行う場合、こちらのやり方を採用するとちょっとだけ楽が出来ます。
&lt;LI&gt;IE7&lt;BR&gt;IE6と同じと考えてもらっていいです。当然ですがタブは同じウィンドウであれば同じプロセス内にあり、セッションを共有します。
&lt;LI&gt;IE8&lt;BR&gt;IE6/7の考え方は通用せず、上記のようなやり方であればいずれもセッションを共有します。プロセスが違うウィンドウであっても。&lt;BR&gt;そもそもIE6/7であればウィンドウの数よりプロセスの数が多くなることはありませんでしたが、IE8の場合はプロセスがひとつであっても、タブを増やすと複数のプロセスが出来たりします。&lt;BR&gt;IE8でセッションを共有しない新しいウィンドウを開きたい場合は、「ファイル」→「新規セッション」でウィンドウを開きます。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;たいていのWebアプリケーションではセッションを使用するでしょうから、ページ遷移などで予期せぬセッション情報の書き換えなどが発生しないように、ブラウザでどのようにセッションが共有されているかは抑えておきたいところです。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;私は機能ごとに必要な値をできるだけセッションに持たせないように作るんですが、その理由が複数のウィンドウ開いたときに問題が発生するからだったりします。&lt;/P&gt;
&lt;P&gt;ごく普通にユーザーが行う操作を制限したりするのは昨今のトレンドに反するし、何より複数のウィンドウ開いて操作しちゃったせいで問題が発生したって問い合わせがエンドユーザーから結構あったから。&lt;/P&gt;
&lt;P&gt;エンドユーザーからの問い合わせは「入力値とは異なる値に書き換わった」ってなものになるので、上のようなウィンドウ間でのセッション共有が発生する仕組みを知らないと、原因すら分からないことになったりもします。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/181169.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Oracle] 権限管理はどうする？</title><link>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179980.aspx</link><pubDate>Sun, 09 Aug 2009 13:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179980.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/179980.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179980.aspx#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/179980.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/179980.aspx</trackback:ping><description>&lt;P&gt;DB の権限管理って、一般的にはデータベースロール、データベースユーザー、データベーススキーマの仕組みを駆使するものだと思っています。&lt;/P&gt;
&lt;P&gt;MS SQL で自分で DB 設計をした過去のWebアプリケーションは、DB アクセスはすべてストアドでした。&lt;BR&gt;ActiveDirectory 環境ではなかったので、Web サーバとDB サーバ双方に ID とパスワードが同じアカウントを作成し、Windows 認証で DB に接続するようにします。&lt;BR&gt;Web アプリケーションは管理側と一般ユーザー側という構成だったので、管理側が実行できる必要のあるストアドに対して EXECUTE 権限のある DB ロールと、一般ユーザー側が実行できる必要のあるストアドに対して EXECUTE 権限のある DB ロールを作成。&lt;BR&gt;実際に Web アプリケーションが接続するユーザーにこのロールを割り当てれば基本的にそれで終わり。&lt;/P&gt;
&lt;P&gt;ストアド内で普通に SELECT とかしているものに関して SELECT 権限を実行者に与えなくてもいいんですが、 sp_executesql などで DynamicSQL 発行してる場合は別。&lt;BR&gt;なので sp_executesql でアクセスしているテーブルやビューなどのデータベースオブジェクトがあるストアドを実行しているユーザーには、必要最低限の CRUD の権限を与えました。&lt;BR&gt;今思えば敢えて sp_executesql 使う必要は全くないストアドばっかだった気がしますが･･･。&lt;BR&gt;SQL インジェクションの脆弱性も出る可能性あるんだし。&lt;/P&gt;
&lt;P&gt;まあ、MS SQL での権限管理はとても簡単でした。&lt;BR&gt;sp_executesql 使ってない場合はストアドの実行権限しか付与しないですみます。&lt;BR&gt;DB からみたらクライアントに相当する Web アプリケーションには一切の CRUD 権限を与えなくていいので、DB 関連のセキュリティにあまり悩まなくていいです。&lt;BR&gt;他にもたくさんある、ストアドを使う利点の一つでしかないですけれど。&lt;/P&gt;
&lt;P&gt;そんな MS SQL での踏まえた後の Oracle。&lt;BR&gt;残念ながらオールストアドという私の野望は達成できなかった上、ビューも禁止されているので、Hibernate 経由ながら直にテーブルアクセスです。&lt;BR&gt;DBアクセスするアプリケーションの構成は、例えるとこんな感じ。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;わんくま運営者･･･システム全体を統括する管理ページ&lt;/LI&gt;
&lt;LI&gt;わんくまメンバー･･･個々のブログの管理ページ&lt;/LI&gt;
&lt;LI&gt;一般ユーザー･･･外部に一般公開されているページ&lt;/LI&gt;
&lt;LI&gt;月次バッチ･･･月初に一回だけ実行されるバッチ処理&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;月次バッチは Web アプリじゃなくて、cron で定期実行される Java アプリ。&lt;BR&gt;管理ページが複数ないことも多いけど、構成としては割と一般的でしょうか。&lt;/P&gt;
&lt;P&gt;Oracle では以下のような権限管理の構成にしてみました。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA_ADMIN（DBユーザー）&lt;BR&gt;WANKUMA_ADMIN_ROLE という データベースロールを付与。このロールはわんくま運営者が扱う管理ページで必要とされる CRUD 操作の権限をまとめたもの。&lt;BR&gt;直接オブジェクト権限を与えることはしない。&lt;BR&gt;システム権限は CONNECT 権限のみ付与。&lt;BR&gt;ユーザーテーブル領域に対する権限は与えていないので、自スキーマですら CREATE TABLE を行うことは出来ない。&lt;BR&gt;ただし Oracle の仕様により、自スキーマであれば一時表（一時テーブル）を作成することは出来る。&lt;BR&gt;後述する WANKUMA スキーマ内のすべてのテーブルとシーケンスに対して、シノニムを作成。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA_MEMBER（DBユーザー）&lt;BR&gt;WANKUMA_MEMBER_ROLE という データベースロールを付与。このロールは個々のブログ保有者が扱う管理ページで必要とされる CRUD 操作の権限をまとめたもの。&lt;BR&gt;あとは WANKUMA_ADMIN と同じ。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA_GENERAL（DBユーザー）&lt;BR&gt;WANKUMA_GENERAL_ROLE という データベースロールを付与。このロールは一般公開されたページで必要とされる CRUD 操作の権限をまとめたもの。&lt;BR&gt;あとは WANKUMA_ADMIN と同じ。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA_BATCH（DBユーザー）&lt;BR&gt;WANKUMA_BATCHL_ROLE という データベースロールを付与。このロールは月次バッチで必要とされる CRUD 操作の権限をまとめたもの。&lt;BR&gt;あとは WANKUMA_ADMIN と同じ。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;このようにして、データベースユーザーとデータベーススキーマを切り離すことが出来ない Oracle で、実質的に DB 接続にしか使用できない、スキーマとしての存在を殺した DBユーザーを作成。&lt;BR&gt;これらとは別に、以下のようなデータベーススキーマを作成しています。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA&lt;BR&gt;すべてのテーブルはこのスキーマ内に作成。&lt;BR&gt;システム権限は UNLIMITED TABLESPACE のみ付与。&lt;BR&gt;CONNECT 権限を与えていないので、このスキーマ（≒ DB ユーザー）に直接接続することは出来ない。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;こんな感じにして、上とは逆に実質的に DB ユーザーとしての存在を殺して、スキーマとしてしか機能しないって風に。&lt;/P&gt;
&lt;P&gt;正直「Oracleでは普通こういう風にやるよ！」ってのを知らないんですね。&lt;BR&gt;さすがにデータベースオブジェクトの所有者に直接アクセス、とかいうのは無いだろうなあと思っていろいろ考えてたら、こういう形に行き着いたというところ。&lt;BR&gt;「MS SQLだったらこうするよ！」みたいな権限管理ベストプラクティスを知ってるって言えるほどじゃないですけれど、マイクロソフトは結構その手の資料が充実してるので、（多分）なんとかなりました。&lt;BR&gt;Oracle も Books Online に相当する結構膨大な資料があるんですが、あれ読んでても正直よくわからなかったというところ。&lt;BR&gt;メーカーサイドじゃない技術資料は例えば @IT とかにかなり豊富に存在する Oracle ですが、権限管理に関するものは見つけられませんでした。&lt;BR&gt;こういうのは書籍ベースじゃないとなかなかないのかしらん。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/179980.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Oracle] 照合順序はどう使う？</title><link>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179972.aspx</link><pubDate>Sun, 09 Aug 2009 01:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179972.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/179972.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179972.aspx#Feedback</comments><slash:comments>3236</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/179972.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/179972.aspx</trackback:ping><description>&lt;P&gt;MS SQL には照合順序というものがあります。英語で言うと COLLATION でしょうか。&lt;/P&gt;
&lt;P&gt;手っ取り早く言うと文字の大小比較に使う設定で、例えば CS （Case Sensitive）だと大文字小文字を区別するし、CI（Case Ignore）だと区別しません。&lt;/P&gt;
&lt;P&gt;MS SQLの照合順序は日本語だけでもかなりの数があるので、最初はちょっと混乱します。&lt;/P&gt;
&lt;P&gt;若干複雑なところもありますが、使えるようになるととても便利なので、私は COLLATE とか結構多用していました。&lt;/P&gt;
&lt;P&gt;インスタンス、データベース、テーブル、カラム、クエリそれぞれの単位で設定できるでとても便利。&lt;/P&gt;
&lt;P&gt;大文字小文字やひらがなカタカナを区別しないLike検索とかソートとかって結構要求されることが多いし、これをアプリケーション側でちまちま実装するよりかは早くて簡単ですから。&lt;/P&gt;
&lt;P&gt;ただし比較対照のカラムの照合順序があってないとエラーが発生するので、意味が分かっていない当時は結構苦慮していましたけれども。&lt;/P&gt;
&lt;P&gt;一時テーブルの照合順序は確かインストール時の照合順序か何かがデフォルトになるので、一時テーブルと結合するときには注意が必要だったりとかもあったような。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ちゃんと触ったことはないけど、MySQLにも数は少ないながら照合順序の仕組みはちゃんとあって、テーブルやカラム単位での指定もできるし、COLLATE でクエリ単位で使うことも出来たと思います。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;で、Oracle。&lt;/P&gt;
&lt;P&gt;大文字小文字やひらがなカタカナを区別しないLike検索と、辞書順ソートの要求はやっぱりあったので、MS SQLと同じノリで照合順序で対応しようとしました。&lt;/P&gt;
&lt;P&gt;が･･･。&lt;/P&gt;
&lt;P&gt;なんか仕組みが違います。&lt;/P&gt;
&lt;P&gt;Oracleには NLS という多言語対応の仕組みが合って、照合順序に相当するものは NLS_SORT とNLS_COMP のようです。&lt;/P&gt;
&lt;P&gt;照合順序とはちょっと違うので、言語ソートとか呼んでいるみたい。&lt;/P&gt;
&lt;P&gt;基本的に環境変数で設定を行う Oracle のやり方には混乱しっぱなしですが、これらの設定は インスタンス（≒データベース）、セッション単位で設定を行うことが出来ます。&lt;/P&gt;
&lt;P&gt;テーブルやカラム単位では設定することはできないようです。&lt;/P&gt;
&lt;P&gt;（権限があれば）必要とするクエリの直前に ALTER SESSION を発行してまた元に戻せばいいので、クエリ単位でできる、といえないこともないです。&lt;/P&gt;
&lt;P&gt;COLLATE はどうやらありません。&lt;/P&gt;
&lt;P&gt;NLSSORT 関数というものはあるので、単純な比較や order by だけであれば、クエリの内部で照合順序を使うようなことは可能です。&lt;/P&gt;
&lt;P&gt;が、これは % や _ などのメタ文字との組み合わせがほぼ必須となる、like 検索では使用できないようです。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;はて、と困りました。&lt;/P&gt;
&lt;P&gt;「よーしパパ照合順序で対応しちゃうぞ～～！」と意気込んでみたら、なんか事情が違います。&lt;/P&gt;
&lt;P&gt;生クエリをゴリゴリ書いたりできるプロジェクトであれば、 ALTER SESSION と NLSSORT 関数を使いまわしてなんとかできそうなんですが、今のプロジェクトでは O/Rマッパーである Hibernate を使っており、基本的に SQL は自動生成です。&lt;/P&gt;
&lt;P&gt;特定のクエリ発行時だけ ALTER SESSION を発行するメソッドを呼び出すようにするとかなんとか考えたりもしたんですが、当時はある程度固まったDAO の使い方のルールに例外的措置を加えることになってしまうので、それもどうかという話になり。&lt;/P&gt;
&lt;P&gt;あれこれ考えた末、結果的にはログイントリガで ALTER SESSION を発行することで対応しました。&lt;/P&gt;
&lt;P&gt;NLS_SORT に JAPANESE_M_CI、NLS_COMP に LINGUISTIC を設定しています。&lt;/P&gt;
&lt;P&gt;なんか CLOB なカラムには見事に効いていないようですが･･･（Oracle Textとか使わないとなのかしらん）。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;しかしプロジェクト終盤に入った今は、このやり方は失敗だったのかなあと思っています。&lt;/P&gt;
&lt;P&gt;当然すべての文字列型の比較やソートでこの NLS_SORT と NLS_COMP の設定が有効になるわけで、辞書順ソートや比較が必要のないケースではパフォーマンス上の問題が発生します。&lt;/P&gt;
&lt;P&gt;というか、実際に発生したんですね。&lt;/P&gt;
&lt;P&gt;CHAR型だけど値の中身は全部数値になってるカラムを IN 句で1000件条件指定して UPDATE するクエリを実行したら、10分以上ダンマリって結果が･･･。&lt;/P&gt;
&lt;P&gt;2万件の UPDATE を1000件ずつ実行してるんですが、1時間たっても終わらないのでブラウザがタイムアウトとか阿保みたいな状態になってしまいました。&lt;/P&gt;
&lt;P&gt;Oracleを扱う上でとても参考させていただいている &lt;A href="http://www.shift-the-oracle.com/"&gt;Shift-The-Oracle&lt;/A&gt; さんも以下のように警告しています。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;また NLS_COMP と NLS_SORT の NLS パラメータ を設定することによってオプティマイザによるアクセスパスがパフォーマンスに影響が出るくらいに大きく変化することにも注意を払う必要がある。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.shift-the-oracle.com/sql/national-language-compare.html"&gt;全角・半角、大文字・小文字を区別しない検索&lt;/A&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;文字列型カラムを大量に指定しない限りそこまで影響が出たりはしないのか、ログイントリガを設定した当初はあれこれ心配したものの特に遅くなったりもしなかったので、大丈夫かなと踏んでいたんですが。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;世のOracle使いの方々は、「大文字小文字やひらがなカタカナを区別しないLike検索」の際には、どうやっているんでしょうか？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/179972.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Oracle]ORA-00600エラー発生</title><link>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179971.aspx</link><pubDate>Sun, 09 Aug 2009 00:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179971.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/179971.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179971.aspx#Feedback</comments><slash:comments>858</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/179971.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/179971.aspx</trackback:ping><description>&lt;P&gt;ORA-00600。&lt;/P&gt;
&lt;P&gt;（最近更新されてないけど）Oracleの技術情報が豊富な &lt;A href="http://www.shift-the-oracle.com/"&gt;Shift-The-Oracle&lt;/A&gt; さんでは、以下の様に解説されています。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;サポートに問い合わせるか、その機能や使用方法をやめる。の二択であると言っても過言ではない。&lt;/P&gt;&lt;A href="http://www.shift-the-oracle.com/oerrs/ora-00600.html"&gt;ORA-00600 - オラクル・Oracle エラー FAQ&lt;/A&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;また、 &lt;A href="http://ameblo.jp/archive-redo-blog/"&gt;Archive Redo Blog &lt;/A&gt;&amp;nbsp;さんのところでは以下のように解説されています。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;内部エラーというのは、文字通りOracleの内部で発生したエラーで、メッセージが定義されていないものがすべてこのコードで返されるというわけです。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://ameblo.jp/archive-redo-blog/entry-10035195423.html"&gt;[Oracle] ORA-00600エラーへの対処方法&lt;/A&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;エラーコードが同じであっても全然別物だったりするってことですね。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;斯様に恐ろしいエラーなんですが、うちとこでも発生しました。こんな感じの。&lt;/P&gt;
&lt;P&gt;&lt;PRE&gt;ORA-00600: 内部エラー・コード、引数: [qernsRowP],・・・&lt;/PRE&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;発生した原因のひとつは直前に行ったインデックスってのはすぐ分かったんですが、さすがにインデックス張っただけでエラーが発生するとは思えないので、原因の特定を若干行いました。&lt;BR&gt;結果分かったことは以下のようなものです。&lt;BR&gt;テーブルの形はこんな感じ。&lt;/P&gt;&lt;PRE&gt;create table MEMBER (
 USER_ID number(10) not null,
 NAME varchar(50 char) not null,
 primary key( USER_ID )
)
&lt;/PRE&gt;
&lt;UL&gt;
&lt;LI&gt;言語ソート JAPANESE_M_CI を使うと発生する。&lt;BR&gt;業務上の理由から、辞書順のソートと比較が必要なため、JAPANESE_M_CI に設定しています。&lt;BR&gt;具体的にはログオントリガで NLS_SORT を JAPANESE_M_CI に、NLS_COMP を LINGUISTIC に ALTER SESSION しています。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;PK かつ FK（外部参照制約）と文字列カラムへの複合インデックスを張ると発生する。&lt;BR&gt;USER_ID と NAMEに対して張っています。&lt;BR&gt;実際には PK や FKであるかどうかは関係ないかもしれませんが、文字列カラムへの単体のインデックスを張るだけでは発生しませんでした。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;複合インデックスを張っているカラムを SELECT し、distinct をかけたインラインビューに対して rownum するクエリを発行すると発生する。&lt;BR&gt;具体的には以下のようなクエリです。&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;select *
from (
 select distinct USER_ID,NAME
 from MEMBER
 order by NAME
)
where rownum &amp;lt;= 10
&lt;/PRE&gt;
&lt;P&gt;distinctをつけなかったり、インラインビューになっている中のクエリだけで実行した場合には発生しませんでした。&lt;BR&gt;もしかしたら order by も影響しているかもしれません。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;これらの条件をすべて満たした環境下で発生しました。&lt;BR&gt;NLS_SORT や NLS_COMP の設定を行っているログイントリガを無効化したり、インデックスをはずしたり、エラーが発生するクエリの中身を書き換えたり、どれかひとつの条件を満たさないようにすると起きなくなります。&lt;BR&gt;また、ややこしいことに、再現性は100%ではなく、50%程度。&lt;BR&gt;業務上よく実行されるクエリなのですぐに問題発生に気づきましたが、エラーが起こらずすんなり意図した結果が出ることもあれば、エラーが発生して落ちることもあり。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;サポート直行といわれる ORA-00600 の情報はネット上でもほとんど見つからないので、原因を特定することすら困難だったりするようです。&lt;BR&gt;サポートで解決した情報は外部に公開できませんし。&lt;BR&gt;うちとこはサポート契約していないので、とりあえず要因のひとつになっているインデックスをあきらめました。&lt;BR&gt;そこまで固執する必要があるインデックスじゃなかったのでこの解決策自体はいいんですが、ちょっとインデックス張るのが怖くなりましたね･･･。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/179971.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Small Talk]わんくま勉強会、いけなくてごめんなさい</title><link>http://blogs.wankuma.com/oakbow/archive/2009/08/08/179966.aspx</link><pubDate>Sat, 08 Aug 2009 23:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/08/08/179966.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/179966.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/08/08/179966.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/179966.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/179966.aspx</trackback:ping><description>&lt;P&gt;先日行われた「東京勉強会#36」ですが、体調不良で寝込んでしまい、行くことが出来ませんでした。&lt;/P&gt;
&lt;P&gt;申し訳ありませんでした。&lt;/P&gt;
&lt;P&gt;せめて当日朝にでも欠席の連絡が出来ればよかったんですが、勉強会の案内のメールに連絡先が書いてあることに気づいたのはかなり後・・・。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;こういったユーザーイベントにかかるスタッフの労力は大変なものだと思いますので、それに応えるためにも、以後気をつけたいと思います。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/179966.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>Oracleは全角の%や_もメタ文字として認識してしまう</title><link>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159868.aspx</link><pubDate>Fri, 24 Oct 2008 21:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159868.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/159868.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159868.aspx#Feedback</comments><slash:comments>53</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/159868.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/159868.aspx</trackback:ping><description>&lt;P&gt;SQL Serverはどうなんだろう？　というのは調べてないんですけれども。&lt;/P&gt;
&lt;P&gt;SQLのLIKE句で使える %（0文字以上の文字列に一致） や _（1文字に一致） などのメタ文字ですが。&lt;/P&gt;
&lt;P&gt;Oracleではこれらが全角文字であってもメタ文字として動作してしまいます。&lt;/P&gt;
&lt;P&gt;マニュアル読んでもそういった記述は見当たらなかったんですが、otn とかでもそういう話題があるし、Oracle使ってる人の間では一般的な認識なのかしら？&lt;/P&gt;
&lt;P&gt;設定などで変更できるわけでもないみたいで。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;先のエントリに書いたHibernateのメタ文字エスケープの問題もあって、結局半角全角両方のエスケープが必要でした。&lt;/P&gt;
&lt;P&gt;エスケープシーケンスに設定した文字をあわせて、5文字ですね。&lt;/P&gt;
&lt;P&gt;よくまとまってるのはこのあたりでしょうか。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://ameblo.jp/archive-redo-blog/entry-10033356201.html"&gt;http://ameblo.jp/archive-redo-blog/entry-10033356201.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;個人的にはこちらも、えー、なにこれ？　って仕様。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/159868.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>Hibernateは％メタ文字をエスケープしてくれない</title><link>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159867.aspx</link><pubDate>Fri, 24 Oct 2008 21:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159867.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/159867.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159867.aspx#Feedback</comments><slash:comments>109</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/159867.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/159867.aspx</trackback:ping><description>&lt;P&gt;Hibernateで、クライテリア使って開発してます。&lt;/P&gt;
&lt;P&gt;あいまい検索とか俗に言われるSQLでのlike句では、&lt;/P&gt;
&lt;P&gt;Restrictions.like("フィールド名", "&lt;SPAN style="COLOR: rgb(42,0,255)"&gt;文字列&lt;/SPAN&gt;", MatchMode)&lt;/P&gt;
&lt;P&gt;って書き方で実現できます。&lt;/P&gt;
&lt;P&gt;MatchModeってのは前方一致とか後方一致の指定のための列挙型です。&lt;/P&gt;
&lt;P&gt;DB内の文字列検索とかには普通に使うだろうと思います。&lt;/P&gt;
&lt;P&gt;が、ユーザーの入力文字列が入るだろう文字列部分に % あたりが入ってても、Hibernateはエスケープなどはやってくれず、そのままクエリ投げてしまいます。&lt;/P&gt;
&lt;P&gt;つまり、入力フォームのヴァリデーションなどで入力必須とかにして全件一致を防いだつもりでいても、全件一致のクエリが投げられるわけで。&lt;/P&gt;
&lt;P&gt;個人的には　えー、なにこれ？　って仕様です。バグかと思うくらいの。&lt;/P&gt;
&lt;P&gt;エスケープありとなしが用意されているとかなら分かるんですけど、どうやらなさそうだし。&lt;/P&gt;
&lt;P&gt;あんまり騒がれてる様子もないけど、みんなどうしてるんだろ？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;うちとこでは、フレームワーク全般を担当しているプロジェクトメンバーさんが、%や_などのメタ文字をエスケープしてくれるメソッドを追加してくれました。&lt;/P&gt;
&lt;P&gt;プロジェクト内では Restrictions.like を避けて、追加したメソッドを使うことで解決してます。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/159867.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>