だいたいが早朝にバックアップをすると思うから気がつかないんだと思うけど。APIというサービスがあります。ECSとかAWSとか言われていたやつです。関連商品の取得方法にはいくつか方法があり大きく分けると、サーチ系のAPIのResponseGroupにSimilaritiesを指定するかSimilarityLookupというAPIを使うかです。ItemLookupのResponseGroupに指定すると5件、SimilarityLookupを使うと10件取得できます。SimilarityLookupのResponseGroupにSimilaritiesを指定するとさらにその10件の関連商品を取得できます。(まぁこの場合は殆どが被っていますが・・・。)ただしAmazonのホームページを見ると70件近くの関連商品が表示されています。マージ等、色々試してみましたがやっぱり公式サイトと同じリストを再現できません。́・ω・)煮詰まってしまったので公式サイトのHTMLから引っこ抜いてみました。http://www.amazon.co.jp/dp/{ASIN}このページにアクセスしますが、User-AgentをきちんとAjaxをサポートしているブラウザのやつに指定する必要があります。適当なUser-Agentつけて送ったらJavaScriptのコードが出力されませんでした。Firefox3.5のUser-Agentを使ったらJavaScbriptのコードも出力されました。Array("aaa","bbb","ccc");この様なコードが出力されているのでパースするだけです。Javaなら↓のようなコードでぱぱっと。System.out.println(m.group(1));}微妙・・。́・ω・)というわけで情報募集です。Mecabまだ不完全ですがGOOのキーワードランキングを取得して自動でMecabの辞書を作るプログラムを書いています。キーワードの取得と、そのキーワードのフリガナを取得してTSVファイルにまとめるところまで作りました。あとはMecabの辞書作成スクリプトの入力になるCSVファイルを作成するだけです。あとで日付毎にどれだけ単語が増えているのかといったデータも取ろうと思います。perlでさくっと書いたのですが、perlは色々と便利ですねー。関数の仕様が気に入りませんがそこは目をつぶります。なによりも自分のサーバだとモジュールが無い!とかそういう事を気にしないで気兼ねなくinstallしまくれるのが良いです。errorができるのが良いですね!あ、TSVファイルはこちらで公開中です。http://tech.orz.at/labs/↑随時更新しているので、時々「おや?」と思うことがあるかもしれませんが気にしない方向で。Solaris10http://memcached.googlecode.com/files/memcached-1.4.0.tar.gz-は削除、+は追加という意味です。getpid());あとは普通にビルドをすれば通ります。今回リンクしたlibeventは「libevent-1.4.11-stable」です。MySQLMySQLのTimestampを勘違いしていました。`・ω・))OracleのTimestampとは全然違って、そういう場合はDateTime型を使うのが正しいらしい。何が違うのかと言うと、データ追加時、または更新時、現在日時を自動で設定する。型の項目も更新しない。値を設定した場合、現在日時が設定される。(引用元)http://minazuki.cocolog-nifty.com/kaimemo/2008/01/mysql_timestamp_6d3b.htmlというわけで、基本的にはレコードの更新時間が入るみたいです。Oracleちょっと釣りみたいなタイトルです。LOBに関してはOracleが分厚いPDFファイルを用意しているので、そちらを参照して理解するのが良いと思います。今回はCLOBへアクセスする速度が速くなるわけではなく、いかにCLOBへアクセスさせないようにする方法です。アクセス速度自体はchunkのサイズとか気にすれば良いと思います。そもそもなぜCLOBを使うのか?これはVARCHAR2が4000バイトまでのため、AL32UTF8のデータベースの場合、日本語は最大4バイト消費します。(マニュアルによると、4バイトのUTF8は内部で6バイト使うみたいな事が書いてありましたので、ちょっと検証する必要はありそうです。)ちなみに全角文字が2バイトという神話はSJISやEUC(一部3バイトですが)の時代の話です。UTF8では半角カナや漢字は3バイト、一部の漢字は4バイト使います。CLOBに入れるデータは常に4000バイト以上とは限りません。4000バイトで収まる場合はVARCHAR2のカラムに入れて収まらない場合はCLOBのデータに入れれば良いと思います。1000バイトの文字列であればCLOBに入れる必要は無いわけです。今回はぱぱっと対応する策(松竹梅で言う梅コース)でどれほど効果があるか確認してみました。COMMENT_TEXTがCLOBの列です。梅コースのためVARCHAR2の列はありません。LENGTH関数はCLOBに対しては文字数を返します。(LENGTHBはCLOBには適用できません)。2000で判定しています。(サロゲート文字については未検証)。TO_CHARでVARCHAR2に変換しています。DIARY_COMMENT上記のSQLを実行すると1014レコード帰ってきます。全部CLOBとして取得する場合は3120msかかりますが、上記のSQLでは125ms程度になりました。※CLOBとしては2レコードしかありませんでしたものによりますが、4000バイト以上使う割合が少ないものではこういうやり方もありなのではないかと思います。最速はおそらくVARCHAR2(4000)の列をいくつか作って分割するという方法とかあると思います。設計が美しくないですけど。SolarisSolaris10にLua-5.1.4をインストールしてみます。事前にgcc4をインストールしないと警告がいっぱい出ます。gcc4のインストールは別の記事に書いてあるのでそちらを参照。INSTALL_TOP=/usr/local無事にビルドできました。・・・Luaはパッケージがあるのでpkgaddで入れれば良いと思います。SolarisLua5.1.4をSolaris10の素のままでビルドしようとすると警告が沢山でるのでgcc-4.4.0をインストールしてみます。configuration」といった感じのものでgcc4からサポートされたやつみたいです。staticな関数をライブラリの外に出す/出さないを指定できるgcc拡張のようです。gcc4.1以降はlibgmpとlibmpfrが必要との事なので、これらを事前にビルドします。libgmpをwgetで取得してgtarで展開します。その後以下の手順でビルド。installちなみに、--buildオプションを指定しないとビルドに失敗しました。「core2-pc-solaris2.10」と認識されていたのが原因のようです。こちらのページを参考にさせていただきました。次にlibmpfrをビルドします。こちらもwgetで取得してgtarで展開します。その後以下の手順でビルド。installこれでgccをビルドする準備が整いました。その前に、LD_LIBRARY_PATHに/usr/local/gcc4/libを入れておかないとlibgccのコンパイルでこけます。gcc-core-4.4.0.tar.gzとgcc-g++-4.4.0.tar.gzを取得してgtarで展開します。install一応確認。(GCC)そして環境変数のPATHにも/usr/local/gcc4/binを入れます。Luaのビルドは別の記事で。MySQL知り合いよりMySQLの使い方がひどいんですって話があって、その中でLIMITの話があったのでこういう事なのかなーと推測してみた。その話によるとなんでもかんでもLIMITをつけている。みたいな事をいろんなところでやっているという事でした。ROWみたいなおまじないでつけてるんじゃないのかなーと思いつつ、実際に実行計画をとってみました。テーブルを専用に用意するのは面倒なので、家のテーブルから適当にデータが入っているやつをチョイス。sec)これにSQLを発行してみる。sec)おや?rowsがひどいことになってます。(件数が上のCOUNTと違うのはオンラインで稼働中のテーブルなので・・)。これではLIMITをつけない場合と同じですね。Stopのような実行計画になると思っていました。MySQLのリファレンスによると、色々かかれていますね。BYをINDEXをつけている列につけてみました。sec)rowsが1件になりました。́・ω・)意味というか、それで要件を満たせるユースケースってどんなのがあるかなーと。要求された行数をクライアントに送信すると、クエリが中止されます(SQL_CALC_FOUND_ROWSを使用していない場合)。あるので、この場合は1件フェッチした場合にクエリが中断されるんだと思います。それを確認してみました。実際にEXPLAINじゃなくて実行してみた。データの中身は見せられないので切り取り。いうことはやっぱり中断はされているっぽいですね。MySQLってOracleのように何バイト読み込んだかみたいなものって見れないのかな・・。いいお勉強になりました。これくらいじゃ目くじら立てる原因にはならなそうなので他の要因がありそうです(まぁ積もりにつもった様々なイライラだと思いますがw)。テーブルの全データをメモリに載せようとしちゃうのかな。実行計画上は全件スキャンするようになっているし。RPATHxxxxには実行ファイルを指定。TyrantSolaris10でTCとTTが動作するようになってからというもの、最新版をずっと試していなかったので久しぶりにビルドしてみました。ちなみに会社にもインストールしていますが、会社ではLua拡張も組み込んでいます。社内用に構文や機能が追加してあるLua拡張版があるのですが、私は標準のままのLuaを使っています。今回はLuaをサポートしない場合のビルドメモ。Luaを組み込んでビルドします。他の記事にLuaにビルドの記事がありますので、Luaについてはそちらを参照。install無事にビルドできました。01:55日記2009前期開発http://www.atmarkit.co.jp/fjava/rensai4/webjousiki08/webjousiki08_3.html@ITってSI業界だと結構参考にされるサイトだと思うのですが(違っていたらごめんなさい)、こういうコードを鵜呑みのにして業務システムが作られていると思うとぞっとします。・PreparedStatement/ResultSetをCloseしていないConnectionをCloseした段階でPreparedStatementもCloseされるって?コネクションプールをしている場合も同じ事が言えますか?PreparedStatementCacheをしている場合も同じ事が言えますか?「データベースに接続したら後始末は確実に」という記事を参照しろと書いてあるにもかかわらず、掲載されているコードは参照してかつ参考しているとは思えない。・while(rs.next())の部分これWhileである必要ないですよね。Whileで回すって事はIdはユニークではないのでしょうか。Count==1の時のみ処理しています。何がしたいのか意味がわかりません。こんな冗長で分かりづらいコード書かないでIfで良いのでは。Struts2前の記事でIncludeクラスのエンコード設定がおかしいため、JspTemplateEngineで文字化けが発生する問題を取り上げましたが、今回はそれを回避するコードを書いてみました。IncludeクラスのInstanceを1回作成し、setDefaultEncodingを実行すればstaticなフィールドにデフォルトエンコードが設定されるのでContextListenerの中でそういったコードを書きます。ContextListenerの中でDispatcherへListenerを追加します。そのListenerの中で初期化処理を行います。いう風にするのかと言うと、Struts2のコントローラーはFilterで実装されています。ContextListenerで直接初期化処理を書いてしまうと、Filterの初期化よりも前に実行されてしまい、Struts2の初期化処理が行われていない状態で実行されてしまう事になるからです。Java検索すると結構見つかるものですが、JavaのCalendar#getActualMaximumを使った間違ったサンプルを多く見かけるので正しいやり方をメモメモ。相手の力量をはかるためのクイズとして使っても良いかもしれませんね。カレンダーがgetInstance()じゃない事は言及しません。以下は2006年2月の月末日を求めるコードです。1);System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));何がいけないか。月末に実行してみるとわかると思います。仮に今日が2009年3月31日だとします。1行目でCの値は2009年3月31日になります。(時間は省略)次に2行目でCの値は2006年3月31日になります。3行目でCの値は2006年2月31日になります。→2006年3月3日になります。2006年3月の月末日は31日のため、31が表示されます。Subversionなぜpythonかと言うと、rubyは入っていないしperlは5.6でNet::SMTP使えないしsendmail行方不明だし・・・。pythonはcvs2svnで必要だったのでインストールしてもらっていたのでした。PERLも5.10をインストールして貰えばいいんですが、依頼をして待つ時間を考えるとpythonで書いた方が早いだろうと判断したからです。動けばいいやーレベルで書いたので穴があるかもしれないです。ちなみにバージョンは2.6で確認しました。TyrantもSolaris10で動作するようになりました。ビルドもすんなり通ります。\(^o^)/ヤター!Luaをくっつけて色々試してます。Tyrant前回の記事の対応ではスピードが出ません。いうわけでちょっとport_getnの所を修正しました。checkでそこそこの速度で全部通るようになりました。cabinetの最新版はSolaris10で何も指定しなくても普通に通るようになりました。今回対象にしたのは、tokyotyrant-1.1.14です。Solaris」です。いうわけで以下修正ソースです。́・ω・)そんな恥ずかしいお話。ソースを斜め読みしたら、たまたま↓のコードが目に入りました。桁上げ処理の所がwhileじゃなくてifだ。1回しか処理していないね。