kagamihogeの日記

kagamihogeの日記です。

プログラミング失敗談

Jedisで単一コネクションをマルチスレッドで使用してはいけない

JedisはJavaのRedisクライアント。自明だが、単一コネクションをマルチスレッドで使いまわすとその動作は不定となる。 とりあえずソースコード。 package kagamihoge.jedissample; import java.util.concurrent.ExecutorService; import java.util.concurren…

PostgreSQLのfunction修正でsyntax error at or nearに悩んだ

環境 PostgreSQL 8.1.23 A5:SQL Mk-2 2.10.0 やったこと こんな感じにファンクションをPostgreSQLに作成したとする。 create or replace function gettest1(numeric) returns varchar as ' declare test_char varchar := ''AAA''; begin return test_char; e…

statspack練習にコミット間隔有無で比較

statspackさわる - kagamihogeの日記でstatspackを自分の環境で手軽に試せるようになった。なので、練習がてら分かりやすくハッキリと差が出るレポートを取得して眺めてみる。やることは、10万回insertを実行するJavaのプログラムを2種類用意する。1つは、1…

集計関数がメモリで処理しきれなくなったとき起きたこと

一般的にOracleなりRDBMSのパフォーマンスは、メモリでさばける量を超えると突然悪化すると言われる。その理由は、メモリで処理しきれていたものが、ディスクIOを必要とするようになるから、ということになる。よって、実際のところどの程度悪化するものなの…

where句なしでupdateしちゃったとき

RDBMSでwhere句なしのupdate/deleteをする機会は極めて限られ、本番環境でついうっかりやってしまうと夜逃げしたくなるレベルである。しかしやっちまったものは仕方ないので、どうすれば少なくとも無かったことにする状態に出来るのかを考える。 環境 Oracle…

サブクエリの条件が悪くメインクエリがフルスキャンになる

環境 Oracle Database Express Edition 11g Release 2をWindows上で動作 起きたこととか 下記のようなSQLを実行したところ、ちょっと表現が難しいくらい猛烈な実行時間がかかってしまった。 UPDATE BILLING B SET AMOUNT = 0 WHERE B.BILLING_ID = (SELECT O…

CHARとVARCHAR2を比較するときCHARがサイズ分の長さがないときどうなるか

CHARとVARCHAR2を比較するときは下記のサイトにあるようなことに注意する必要がある。 CHAR と VARCHAR2 の違い - オラクル・Oracleをマスターするための基本と仕組みところで上のサイトなど非空白埋め比較セマンティクスを紹介しているところでは、CHARがそ…

for の中でループカウンタをデクリメントをかんがえる

なんとなしにソースコード覗いてたらこんな箇所があったわけですよ。 for (int i=0; i< list.size(); i++) { if (isNantara(list.get(i))) { list.remove(i); i--; } } 最初、何が書いてあるのかマッタク分からなかった。が、よくよく読むと、リスト中の要素…

オートボクシングで NullPointerException

Java 界隈では比較的良く知られていると思われるオートボクシングの罠。そして見事にハマッたので記録を残しておく。再現させるソースコードは下記の通り。 public static final int HOGE=1; public static void main(String[] args) { Integer v = null; if…

コンストラクタが private なクラスをモックで差し替えてテストしたかった

最近ようやくテストコードを書くことに目覚め始めました。で、まぁ、とあるクラスをテストしようと思ったが、一部にミドルウェアと通信する箇所があるので、そこはユニットテストのときはなんもしないようにしたかった。DI なんて便利なモノがまだ無い環境な…

Javaプログラマであるかを見分ける10の質問に対する回答なのかネタなのかフィクションなのかもうよくわからないもの

Javaプログラマであるかを見分ける10の質問 - やさしいデスマーチ ==演算子とequalsメソッドの違いは何か? ==は、なぜか文字列が一致しているのに時々思ったとおりに動かないことがあるが、equalsは動くため。 文字列の連結は原則として+演算子を使ってはな…

jboss-web.xmlがどうたらでデプロイできない

なんでじゃーと思っていろいろ調べて http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd の URL をブラウザでアクセスしたところ・・・…たまたま jboss.org サーバがメンテナンスでダウンしていたっていう。もうなんていうか MacBook Air 11インチ欲しい!

phpのifで死んだ

PHP3 というかなり古い環境に手を入れてたときの失敗談。最近の PHP ではどういう挙動になるかわかりませんが。こんな感じのコードがあったわけです。 if($hogeFlag = "1") { print "true"; } else { print "false"; } hogeFlag の値が何になろうが、絶対に …

privateメソッドは不要、出力パラメータに御用心

privateメソッドは不要 - @katzchang.contexts書いてあることに同意。Meyer センセを始めとして「値を返すだけの function と副作用を伴う procedure は分離しる!」とむかしから言われてるアレと同根かなぁと。で、トラバ元のエントリとは直接関係無いのだ…

コンポーネントの境界を越えて描画し続けてしまうと

こうなる。ねーよwwwwCanvas に何か描画するときに、終了条件付けずに実行したらこうなってしまった。まさか突き抜けてしまうとは……

setter の書き方ミスってスタックオーバーフロー

スタックオーバーフローというより凡ミスなんですが。 private var b:int; public function set valueB(b:int):void { this.valueB = b;//setter から setter を呼んでいる! } 延々と setter メソッド再帰呼び出し状態に陥ってしまいましたとさ……set キーワ…

オブジェクト指向プログラミング入門

本書の最大の特徴は、コンピュータサイエンスの学生向けの教科書として書かれている点。まえがきにも書かれているのだけど、大学 3,4 年から修士 1 年向けレベルの教科書として書かれている。俺も一応情報系の学生の端くれだけど、その点から見てこの本はか…

なりすまし継承にご用心

インターフェイスには記述されていないけど、実装クラスには存在するpublicメソッド。(以下省略)こうすることにより、そのメソッドへのアクセスパスを隠すコトができます。いざ、ライブラリ内で使用したくなったら、実装型にキャストするなり何なりで、使う…

デザインパターンとともに学ぶオブジェクト指向のこころ

本書は題名どおり、デザインパターンとともに OOP の原則について解説している本だけど、真価はそこには無い。最大の特徴は、誤ったオブジェクト指向についての理解に対する分析と解説にある。手続き型なやり方の特徴と限界を踏まえた上で、OOP の利点につい…

OOP 学習の教材に目の前の汚いコードを使ってみる - 2

「ここのコードはこんな感じに書き換えればいいんじゃね?」的なことをプロジェクトの wiki にまとめて皆に見てもらう。OOP 学習の教材に目の前の汚いコードを使ってみる - kagamihogeのblog ……というわけで。テキトーに選んだ機能をこんな感じのクラス構造…

俺の OOP の理解がどう間違っていたかのふりかえり

しばらくしたら―また数冊 OOP の本読んだりしたら―追加もしくは更に修正入ると思う。 OOP やデザインパターンは特別な人たちの特別なもの? デザインパターンを適切なときに適切に使うことは難しい……そう考えていた時期が俺にもありました。OOP とかデザイン…

Struts の すごい つかいかた

アリなのかナシなのか謎だけど、まぁビビッたので軽くメモ的に。 struts-config-less とりあえず、とある Action 内のコード。 ActionForward forward = new ActionForward( "/Hoge/Foo.do" ); forward.setName("SUCCESS");struts-config.xml の意味が無いっ…

Commons FileUpload の getFileName にやられた

またしてもイマサラ感漂うフルクサイ話題。「ファイルアップロードするとファイル名が小文字になっちゃうんだけど」という報告があがってきたので調査開始。 the filename case bug is the only change since the FileUpload 1.1 release, Nabble - Commons …

Commons FileUpload 1.0 にやられた

今時 Struts 1.1 とか Commons FileUpload 1.0 とかビミョウな代物使ってる人は少なそうそうだけど…ちょっとはまったのでそれについてメモ。実際、知ってる人には有名な挙動(バグ?)なんだそうだけど。どんな動作かというと、マルチパートアクセスのリクエ…

インデックスがあるのにフルスキャン? - おわり

インデックスがあるのにフルスキャン? - 3 - kagamihogeのblog出社後とりあえず色々試してみようと考え・・・ただその前に。DB の初期化スクリプトをいちおう見ておくかぁ、と軽い気持ちでファイル開いたら一瞬で終結を見た。 CREATE TABLE HOGE_TABLE ( HOGE_…

インデックスがあるのにフルスキャン?

「なんか遅いから早くして(意訳)」という仕事が回ってきた。大量データ投入後の試験待たずとも、遅いのは前々から分かってたから覚悟は出来てたんだけど・・・人外魔境と化したコードにどう手を入れたもんですかねぇ。さて。何はともあれ計測一番。SQL Server…

継承はしご

Struts アプリの保守はそろそろキツくなってきたのかもなぁ・・・。実装継承を前提にした設計で組むってのは、最初はいいんだけど後になって機能追加やらなんやらでコードにアレコレ手を入れる段になると色々キツい面があるのでは、って気が最近してきた。まず…

インスタンス・アクション

Struts の話。public class HogeAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { FooAction fooAction = new FooAction(); ActionForward fo…

Session Hazard

ものすごい HttpSession の使い方してるコードに出会ってしまった。どんな使い方か端的に言えば、セッションに 5,6 個のフラグ乗っていてアクションはこのフラグを基に振る舞いが決まる。その振る舞い次第でフラグの値も随時更新される。セッションにバイン…

return 無し getter

今日のアレなコード。 public void getNantokaString(String[] hoge) { ... hoge[0] = "honyarara"; return; }・・・まぁ、気持ちはわからんでもないんだが・・・。最初、何の違和感もなくスルーしてた俺も俺。やっぱ疲れてるんかなぁ。あ、俺の名誉のために言って…