読者です 読者をやめる 読者になる 読者になる

kagamihogeの日記

kagamihogeの日記です。

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; }・・・まぁ、気持ちはわからんでもないんだが・・・。最初、何の違和感もなくスルーしてた俺も俺。やっぱ疲れてるんかなぁ。あ、俺の名誉のために言って…

出力パラメータはやっぱ良くないんだろうなぁ

出力パラメータというのは、例えばこんな感じ。 public void setHogeList(List list, Hoge hoge) { list.add(hoge); }2007/08/23 追記 ソースコードの間違いを修正 引数で渡されたオブジェクトが、メソッド中で状態変更されるよーなコード。C 言語なんかでは…

空のリストは渡さないで下さい

if (hogeList != null && !hogeList.isEmpty()) { doHoge(hogeList); }こんな感じのコードがあった。doHoge の javadoc には「引数の List は null とリストが空の場合は呼んじゃダメ」と書いてある。hogeList の中身はユーザの入力値を元に作るので、空のケ…

getter/setter があればクラス?

HogeClass hoge = new HogeClass(); hoge.setAre(str1); hoge.setSore(str2); hoge.setDore(str3); 時々でいいから…引数付きコンストラクタの事思い出して上げて下さい。 未経験でこの業界入って、Java で Struts な Web アプリのチームに配属されて、Action…

「アジャイルソフトウェア開発の奥義」のボーリングにやられる

アジャイルソフトウェア開発の奥義 を今読んでいる。この本の第 6 章でペアプログラミングについて書いており、テスト書きながら段々とコードをシンプルにしていく様が面白おかしく(?)書かれている。そこではボウリングを題材にしているのだが・・・最終的に…

thumbnail です

俺がいるプロジェクトの内情暴露になってしまうけど・・・まぁいいや。ある日、画面周りの仕様について話していた。A さん「あの、ここの機能にそれぞれついてる略称なんですけど」プロジェクト固有の方言、とでもいうべきか。あるデータの一覧出すときに、デフ…

統一感のないネーミング

今回は動作しない系の話ではないですが、非常に悩ましい状況に陥った体験。とりあえず、その部分のコード。void hoge_foo() { int areSore; int DoreKore; int foo_bar; ... }このプロジェクトは関数ローカルにコーディング規則がありませんでした。とはいえ…

warning には意味がある - 2

先のエントリの続き的な内容。今回は動作不良ではなく、C の懐の深さを垣間見ることになりました。とりあえずコード。int aresore1(int *foo, int *var) {...} int aresore2(int *foo, int *var) {...}先に書いたエントリのコードの特徴(関連する関数をまと…

warning には意味がある

昨日のとおりすがり氏のコメントより これでfdが型チェックにひっかからない辺りが…… 型チェック、でもう一件ヒドイ目にあったのを思い出したのでその件について。確か、その日も「なんだかよくわからないけど落ちるのでデバック手伝って」という指令を受け…

どんな使われ方をするかは分からない

今日も今日とて他人様の書いた素晴らしいコード*1のデバッグ。本日俺を最高に「ハイ!」ってやつにさせてくれたコードはこちら。int fd; fd = hogeDeviceOpen(&fd, READ_ONLY);hogeDeviceRead(fd, ...);色々省いてるんで分かり辛いけど、やってることは単純…

コンパイルで防げるものは防ぎたい

中々見つからなかったバグがようやく判明したのでそのメモ。とりあえずソースコード。hoge1.cextern int func_hoge1(int a, int b, int c) { //... }hoge2.cint func_main() { func_hoge1(20, 30); }func_hoge1 の引数は 3 つだが、func_main でそれを呼び出…

Big Driveのわな

我が家のPCのHDDがだんだん手狭になってきたので、引越しを決意しました。いいかげんSATAに移行したかったんだけど、それはまた今度にということで300GB買ってきました。が、Big Driveなんてものを知らなかったので137GB以上のHDDを認識してくれない。ただ、…

自分で作った縄が勝手に首に巻きついてきた

スクリプト言語でちゃちゃっとプログラム作れないと、仕事にしろ研究にしろ自由度が低くなる 要するにその場しのぎのクイックハックも重要だ、というだけの話です。 プログラマなら大なり小なりやっていることだと思うので、異論を唱える人はそうはいないと…

HttpSessionなActionForm

かなり意味不明なタイトルですが、これが一番しっくりくるのであえてコレにしました。ちなみに、この日記内でしか通用しないローカルなネーミングです。 HttpSessionにバインドされたオブジェクトの行方 昨日、blogをブラブラしてたときにある日記を見つけま…

深く考えない行動の結末 - 低水準入出力

深く考えずにこんな感じのコードを書いていた。while (1) { ssize_t ret = read(fd, buf, 1024); if (ret == 0) { break; } if (ret int errno_hoge = errno; printf("ERROR! no=%d\n", errno_hoge); break; } }これはまぁ特に問題なく終わる。 で、readの部…

データ破壊

ここのところ低水準入出力ルーチン使ってディスクを読み書きするコードを相手にしています。その時にやってしまった衝撃的な失敗。それは、ディスクに書き込みを行う機能で、大量のデータを投入したらどうなるかのテスト中のこと。途中までは上手く行くのだ…

エンディアンを知る

リトルエンディアン。エンディアンの話は知っていたが、やはり知識として知っているだけでは失敗するのだなぁと思いました。 失敗コードの概要 C言語でバイナリ読み込みを行うコードを考える。用意されているバイナリデータはこんな感じ。 f2 a5 ea 67 で、…

openとread

Cでファイル入出力するやり方はいろいろあるが、今回はバイナリ読み出しが必要なので低水準ファイル入出力を使うことに。 やはり、原理を理解してはいても失敗するものはするものだなぁと改めて思ってしまいました。 失敗内容の概要 とりあえず、コードはこ…

スタックとヒープ

わかっているようで全然わかっていなかった。これじゃJava厨と呼ばれても仕方ない・・・。プログラマのためのメモリとポインタの基礎 このテの内容を扱った文献はたくさんあるけど、とりあえずこれをメモ。最近ちょっとCを触っているのだが、いわゆるリスト処理…

それなんて返り値

Javaで業務アプリケーション組む分には配列を返り値とするメソッドはそんなに出てこないと思います。コレクションフレームワークに頼った方が何かと楽なんで。そんなこと今更書くことでもないですが・・・。それはさておき。最近、JSPのスクリプトレットを書い…

ダーティ・コード・リーディング

激しく造語。ここ一年アレなコードに色々出会ってきたので、自分なりの汚いコードの読み方をまとめてみたい。 前提知識を捨てる xxという機能だからこんな感じの実装だろう、Javaだからアレはあんな感じに書いてるだろう・・・とか、そういう前提を捨てる。捨て…