サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
GPT-4o
kameid.hatenadiary.org
Java には Integer.parseInt() という文字列を int に変換するメソッドが存在する。isInt() というメソッドは存在しない。なので、その文字列が数字かどうかの判断だけを行いたい場合でも、とりあえず parseInt() してみる、という実装になる。 try { Integer.parseInt(intstring); } catch (NumberFormatException e) { return false; } return true; という、よく見る実装となる。どうして、Java には isInt() が存在しないのか、例外オブジェクトの生成は重いと聞くし、int文字列かどうかの判定をしてから parseInt() したいのに・・・。 ・・・答えは、 「isInt() をもし実装したとすると、その内部処理は parseInt() とほぼ同一になるから
ブログを相当長いこと放置していたので、たまには生存確認をかねて、投稿を・・・。 お金が絡むところでは厳密な一貫性が要求され云々言うわけだけども、一貫性を妥協すると全てが得られる。少なくとも高い可用性とスケーラビリティーが。*1 以下のような CAP 定理に関する反証もあるけど、 While the impossibility proof of CAP is mathematically correct, it is based on assumptions that are too strict. By relaxing these assumptions, I found the solution presented here. Guy's Blog: A CAP Solution (Proving Brewer Wrong) 「Proving Brewer Wrong」と言っている割に
http://www.javaworld.com/javaworld/javatips/jw-javatip130.html の記事より。まとめるとこういう感じ。 ・すべてのオブジェクトは基本的に最低 8byte を要する。 Object は 8byte ・CPU に依存する話ではあるが、8byte ワードバウンダリで、 Long の場合、16byte、Integer の場合、12byte とはならず、 Integer の場合も 16byte となり、4byte は使われていない。 ・プリミティブ配列の場合は、基本の8byteプラス、8byte単位で拡張。 int なら 0->16 byte 1->16 byte 2->24 byte 3->24 byte ... という感じ。 ・多次元配列はオーバーヘッドがでかい。 int[256] は 1040byte 消費なのに対して、int[256
次は request, response、両方の値を参照している(つまり Mock が2つある)パターン。2つあっても基本的には一緒。並べるだけである。 package easymock; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { public void doPost(HttpSe
http://www.experts-exchange.com/articles/Programming/Languages/Java/File-permissions-with-Java.html より、 システムコールを使う String fileName = "/path/to/file", Process proc = Runtime.getRuntime().exec("chmod 755 " + fileName); JNA を使う。 JDK1.4 以上であれば、上記の代替として JNA が使える。 import com.sun.jna.Library; import com.sun.jna.Native; public class ChmodTest { private static LinkedOSLibrary linkedLibrary = (LinkedOSLibra
q4m の configure のオプション変更によってどの程度パフォーマンスに違いが出るのか比較してみた。 Intel(R) Xeon(TM) CPU 2.80GHz x 4 CPU OS : Debian(Etch) まずは、default 状態。 ./configure --with-mysql=/home/kameid/mysql-5.1.30/ --prefix=/usr/local/mysql 暗黙的に、以下のオプションを指定していることになる。 --with-sync=yes commit to disk at checkpoints (default) --with-delete=pwrite use pwrite for row deletions (default) t/05-multireader..........................ok 1/4 Mul
2009-11-03 追記: グーグルから飛んでこられる方が多いので、結論を追記。 char --> String への変換方法 char c = 'a'; String.valueOf(c); char[] --> String への変換方法 char[] cs = new char[10]; cs[0] = 'a'; cs[1] = 'b'; String.valueOf(cs); 以下、当時の検証内容。結論だけ知りたい方は読む必要なしです。 - 何気に本日書いた char[] c = new c[1]; c[0] = ...; ... String s = new String(c); .... というような処理。 が、帰宅途中に気になってきたのが上記の部分。要するに char 配列を引数に String を生成したのだ。これ、 String.valueOf(c[0]); と書くこと
詳しくは、 % perldoc -f select 一個目の select は、デフォルトの出力ファイルハンドルを変更するもの。 select MYOUT; print "Hi! My name is Kameid.\n"; select STDOUT; # 標準出力に出力ファイルハンドルを戻す 上記の print は標準出力ではなくて、MYOUT に出力される。まあ、あんま使わない方が良さそうだ。 もう一つの select は「4引数の select」と言うらしい。これは select(2) システムコールを呼ぶもの。良く使われるのは msec 単位での sleep の代用品としてだろう。1秒以下の sleep をしたい場合、 select(undef, undef, undef, 0.25); # sleep 0.25 と書いてもダメ。 とすることが出来る。 ただしこの用途には、Tim
こういうことになろうかと。 public class N { class Param { String A; String B; String C; // ... public String build() { // ... return null; } } public void put(Param p, int from, int to) { String s = p.build(); // パラメータを組み立てる。入力チェックとかもすればいい。 // ... } } 呼び出す方は以下のような感じ。 public void test() { new N().put(new N.Param() {{ A = "PC"; B = "M"; C = "P"; // ... }}, 23, 5); } Map を使って似たようなことが当然出来るが、違いはパラメータ名の間違えた時に、コンパイルエ
fdatasync() と fsync() について全く知識が無いので、調べ中。 両方とも、データをハードディスクに *物理的に* 格納するためのファンクションのようだ。 fdatasync() は (システム・コールから戻る前に) ファイルの全てのデータ・バッファーを ディスクにフラッシュ (flush) する。これは fsync() に似ているが、アクセス時刻のようなメタデータを更新しない。 データベースにアクセスしたり、ログ・ファイルに書き込むような アプリケーションはしばしば小さなデータの断片 (例えばログ・ファイルの一行) を書き込み、それがハードディスクに物理的に格納されることを保証する ために、すぐに fsync() を呼び出す。不幸なことに、 fsync() は常に二回の書き込み操作を行なう: 一つは新しく書き込まれたデータを、 もう一つは inode の修正時刻を更新する
※ タイトルは釣りですすみません。私の有頂天な感じが少しでも伝わればと思います。ええ。 いやあ、他人様のブログを見てたら、コメント欄に書いてあった方法が劇的に効果があったので、記す。これもしかして常識かもしれない。今までずっと我慢して使ってたのに・・・。 URL のところに、 about:configと入力し、設定画面を出す。 browser.cache.disk.enableの設定を false して、firefox 再起動。 設定が有効かどうかは、URL のところに、 about:cacheと入力して、確かめて欲しい。設定がきいてれば、Memory cache device のところが以下みたいな感じで使われていることが確認できるはずだ。 Memory cache device Number of entries: 1865 Maximum storage size: 24576 Ki
存在するのかしないのか、私自身も、C++ と混同していて、Java で使ったことはないけど(オーバーロードは使ってたけど)、実はあるんだっけ?となって即答出来なかったのでメモ。 C++ には存在するが、Java には存在しないというのが答え。JavaHouse-Brewers ML にそれに関する議論があった。 http://java-house.jp/ml/archive/j-h-b/042280.html#body から始まる一連のスレッドがそれ。なんで無いかという理由は、引数デフォルト値は読みにくくなる、「一つの目的のための実現手段が複数あり、なおかつ無視できないほど相互に干渉する」・・といったところ。 class A { void foo() { foo(10); }; void foo(int param = 10) { : }; }; コンパイラも困っちゃうでしょ、ということ。
2009-6-20追記↓: 神コメントのおかげで gonzui-1.2 bdb-0.6.4 Berkeley DB-4.7.25 の環境にて、動作を確認。 BerkeleyDB のインストール手順は、 ubuntu9.04 で Berkeley DB のインストール - kameidの備忘録 - Sharpen the Saw! 追記ここまで↑ 正直やりきる自信がない・・・。というか途中で諦める予感がひしひしとするが、将来再挑戦するときのために、やったことを残しておく。まだインストール始めてもいないのに何でこんな悲観的になってるかってゆーと、最初の一歩でハマっているからだ。 gonzui: System Requirements ここを見るとえらい簡単そうに見えるのだが。 Ruby ライブラリ * BDB 0.5.2+ gonzui: System Requirements いきなりこれが
ウチは、全エンジニアがセキュリティーに関するテストを毎年受けさせられており、合格してない人間はソースコードをコミットできないことになっている。かなり難しいテストで、なかなか受からない人も多い。で、受かってる人間でもやらかしてしまうことがあるのがこの手の問題*1。 これからは内製の時代! - しんさんの出張所 はてなブログ編 より。 今北用 新装開店のイトーヨーカドー通販サイトで、 セット売りが単品価格で表記されている!という内容のスレが立つ 皆前回の事もあってアホほど買う。売り切れ続出。 ↓ そして前回同様購入画面でも単品価格のまま、クレジット等の引き落としもされる 9時ごろからIYはサイト修正に一応はいる(だが見逃し多い。例:製図用シャーペン(2000本入)418円等 ) ↓ 9、10時ごろ電話しはじめる奴続出。「在庫が確保できればきちんと発送する」とのこと。 ↓ 9日に出汁の誤表記発見
2009-12-2追記: またしても神コメントを頂く。本記事末尾に、追記。 ※ テストに使用した MySQL5.1 は最新ではないので、既に修正済みかもしれない。 ※ Server version: 5.1.31 を使用してテストした。 MySQL5.1 の varchar カラムの怪しい動き - kameidの備忘録 - Sharpen the Saw! の記事に対してコメントを頂いた。 MySQL のリファレンスである MySQL :: MySQL 8.0 Reference Manual :: C.10.4 Limits on Table Column Count and Row Size へのポインタだ。 ちょっと上記記事の指摘がわかりにくかったかもしれないというのと、追加で判ったことがあるので、補記する。 なぜか、特定のサイズでだけ、「Row size too large.」とい
他にはあんまり見当たらない1億件時のベンチマーク。 ・・・よく見たらmikioさん自身が公開していた。 mixi engineer blog SSD との比較ということでの公開だけど、参考になる。 数万 qps の数字が出ることが多い 100 万件時に比べ、 100万件 → 数万 qps 1000万件 → 6500 qps 1億件 → 700 qps という性能の低下がはっきり見て取れる。 結局、データがファイルシステムのキャッシュに乗るか乗らないか、それ次第ということ。 もちろんキャッシュ無しで 700 qps は論理限界値というか、これ以上は出ない数字ではあるだろう。おそらくインデックスは全部メモリに乗ってて、データだけが物理ディスクにある状態なんだと思う。 でまあ、今お客さんに「500 qps で最終的に1億件・・・」と言われて困っている私が居るわけなんだけども。 当初の件数は少ない
キューにデータを挿入する際には特に不思議な動作は無いし、普通の insert 文を使うだけなので、割愛。問題は取得時。これも直感にそぐう動作をしていると思う。 queue_wait() にて、owner モードに入ると同時にキューのデータを一件取得する。 取得した時点で、他のコネクションにて queue_wait() を発行しても、同じデータは取得されなくなる。 queue_end() にて、取得したデータをキューから削除する。 queue_wait() を連続して発行すると、2回目からは暗黙的に queue_end() + queue_wait() の動きをする。 queue_abort() を行うことで、取得したデータはキューに返される。 他のコネクションにて、queue_wait() を行うと、そのデータが取得される。 検証してみよう。事前準備として、情報をキューに insert 文
遭遇しない人は一生遭遇しないであろう症状 # httpd -X とかやって apache を起動、終了を繰り返していると、そのうち、 [Mon Feb 09 17:54:50 2009] [crit] (28)No space left on device: mod_rewrite: could not create rewrite_log_lock Configuration Failed というメッセージをエラーログに吐いて、httpd が起動してすぐ終了してしまう(起動してない)という症状が出るようになる。 # ipcs -s ------ Semaphore Arrays -------- key semid owner perms nsems 0x00000000 11272192 daemon 600 1 0x00000000 11304961 daemon 600 1 ...
文字列を指定の文字エンコーディングでのバイト数で切る処理を作ってみた。固定バイト長の文字コードであれば指定のバイト長で切る処理というのはさほど難しいところはないのだが。 たとえば、"1234" という ASCII 文字列を、3 バイトで切りたい場合、"123"。文字数とバイト数が一致するため、もっとも簡単だ。 しかし、ShiftJIS 等の主要な文字コードでは、文字種によってバイト長が変化する。結局のところ、指定のバイト数に何文字まで入るか、というのはその文字コードに変換してみないとわからない。 Java では文字の内部表現は普通 UTF-8 だけど、DB では EUC で、カラム長は 256 バイト。というような場合。カラム長がバイト指定なのが全部悪いんだが。 で、先日見たとあるロジックはこの「文字列を指定の文字エンコーディングでのバイト数で切る処理」を実装してたのだが、なかなか気になる
make 使ってビルドする人が makefile の書き方を知っている必要がないように、ant を使ってビルドする人が、build.xml の書き方を知っている必要が無いように、Maven2 を利用する人は pom.xml の書き方を知っている必要は無い。*1 では、何を知っていないといけないのか?ということを考えてみた。ちなみに、社内で使う場合を前提としている。あしからず。 Maven2 とは何か?ということ ant の代わりくらいに思ってもらえば十分だと思うがそれだけだとメリットが分からないと思うので、何かしらの説明は必要だろう。 �\�¬ŠÇ—��@ŽÀ‘H“ü–å�@‘æ4�Í Maven2‚É‚æ‚éƒrƒ‹ƒh“ü–å�@‚È‚ºMaven2‚È‚Ì‚©�H 一番エッセンスがまとまっていると私が思ったのが上記のページ プロジェクトのディレクトリ構成が統一される 統一されたビルド
Guice で、@ImplementedBy を使用してインジェクションしているときの 簡単な動作検証。 (親)Main → Service → Logic → Dao という親子関係で構築されているクラス群を作成した。以下ソースを子から順に。 まず、Dao。実装は、DaoImpl と DaoImpl2。 package test.dao; import com.google.inject.ImplementedBy; @ImplementedBy(DaoImpl.class) public interface Dao { public String getName(int key); } package test.dao; public class DaoImpl implements Dao { private DaoImpl() { System.out.println(this);
どっかに和訳が転がってそうな気がしてならないんだけど、ちょっと見、見当たらなかったので、設定部分だけ訳した。 必須属性 name: キャッシュ名: キャッシュの名前を設定してください。これはキャッシュの識別に使用されます。 名称が重複しないようにしてください。 maxElementsInMemory: メモリ中のエレメント数: メモリ中に生成されるオブジェクトの最大数を設定してください。 maxElementsOnDisk: ディスク中の最大エレメント数: ディスク中に保持されるオブジェクトの最大数を設定してください。 デフォルト値は0です。これは無制限という意味になります。 eternal: 永続フラグ: エレメントを永続化させるかのboolean値。永続させる場合は、 タイムアウトは無視され、エレメントは削除されなくなります。 overflowToDisk: ディスク退避フラグ: エレ
サイボウズ奥さん作の q4m を職場で提案。 jdbc で接続するのはちょっと・・・という意見が出たので、一個ラッパーを挟むことにして、無事職場で導入されそうだ。 ラッパーは apache の mod で作成した。単純にキュー投入リクエストを受け取り q4m に投入するだけの簡単なもの。とはいえ内部で mod_dbd を使用したコネクションプーリングも行い、(apache 上で動作させているため)ログ出力等の周辺機能もプラガブルに追加、変更可能だ。apache を使わずこれらを作り込むのは結構大変だ。 これでキューへのデータ投入に関しては単純な http リクエストで行えるということになる。 php でも servlet でも cgi でも簡単に作れるこの機能をあえて apache の mod で作成したのは、パフォーマンスを一番期待できるのではと考えてのこと。ラッパーがボトルネックになる
複数のキューの中で、データのあるものを探して取って来る Q4M の便利機能。 mysql> SELECT queue_wait('high_priority_table', 'low_priority_table', 10); これのこと。 エラーキューとしてウチでは使おうと思っているが、これの動きに若干癖があったのでメモっとく。 まず、この書き方をするときは、タイムアウト指定が必須。 select queue_wait('a', 'b'); こういう書き方をすると、a テーブルの中身しか見てくれない。 select queue_wait('a', 'b', 60); のようにタイムアウトを必ず指定する。(上の例だと60秒) ちなみに、これはチュートリアルにも書いてある。 若干??になったのが、 チュートリアルの一番上に書いてある「一番簡単なq4mの使い方」の例 SQL mysql> SE
現状の queue_wait はオーナーモードで呼び出した時に、勝手に queue_end が走るようになっている。また、queue_end は非オーナーモードでも何度でも呼べる。 よく考えられた仕様なのだが、私が若干特殊な使い方をしようとしていることもあって、queue_wait 時に勝手に queue_end してもらいたくない。要するにオーナーモード時は queue_wait してほしくないということだ。また、queue_end もオーナーモードだけで実行出来てほしい。 ※ ちなみに、今自分がオーナーモードに居るかどうかは、 select queue_rowid(); で確認できる。オーナーモードでないと、このSQLはエラーになる。 で、queue_wait, queue_end の動作を上記のように変更する簡単なパッチを作成した。対象バージョンは 0.8.4。 使い方は、q4m の
職場では、SimpleDateFormat.parse() は問題を起こすと言うので、腫れ物に触るような扱い、というか、「使用禁止」である。んでどうしてるかというと、各自でパース機能を実装している。うーん。それはそれで微妙・・・。 と、書いたが、ウチの職場が(だけでなくおそらく日本中のそれなりの数の職場)こういうことになってしまった原因の大きな部分が、googleで、「SimpleDateFormat スレッドセーフ」というキーワードで検索したときに不動のトップで表示される http://www.geocities.co.jp/Playtown/1245/java/unsafe_simple_date_format.html にあると思う。(このページの作者様に何らかの「責任」があるといってるわけではない。何の責任もない。あくまで「原因」) いつからあるのかよくわからないこのページ、おそら
ソースからインストールした覚え書き。 ソースの tar.gz を mysql のサイトから持ってくる。 事前に /usr/local/mysql がホームディレクトリで、mysql グループの mysql ユーザを作成しておいた。 http://dev.mysql.com/doc/refman/5.1/ja/quick-install.html に書いてある手順を参考にして、、、 以下 root にて作業。 $ gunzip < mysql-5.1.30.tar.gz | tar -xvf - $ cd mysql-5.1.30 $ ./configure --prefix=/usr/local/mysql ... checking for termcap functions library... configure: error: No curses/termcap library fo
会社の debian にインストールしようとしたところ、 異なるエラーが出たため、一応記録しておく。 # ./configure --with-mysql=/home/kameid/mysql-5.1.30/ --prefix=/usr/local/mysql checking for mysql source code... "/home/kameid/mysql-5.1.30/" checking for int*... yes checking size of int*... configure: error: cannot compute sizeof (int*), 77 See `config.log' for more details.もーほんまナニコレって感じなんだけど、 http://www.infosia.co.jp/posts/249 ここ見つつ、一個ずつ解決していっ
このページを最初にブックマークしてみませんか?
『kameidの備忘録 - Sharpen the Saw!』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く