タグ

ブックマーク / blog.64p.org (17)

  • log4jdbc は logback の設定をミスってるとすげー遅い - tokuhirom's blog

    log4jdbc を使うと jdbc でアクセスしたクエリのログが簡単にとれて便利なのだが、設定を誤るとパフォーマンスを超絶劣化させてくるので注意が必要である。 log4jdbc はデバッグレベルだと Throwable のインスタンスを取得してスタックトレースを取って、呼び出し元の情報を表示する。 これが極めて遅い。当に驚くほど遅い。 ↓具体的にはこのへんである。 private static String getDebugInfo() { Throwable t = new Throwable(); t.fillInStackTrace(); StackTraceElement[] stackTrace = t.getStackTrace(); if (stackTrace != null) https://github.com/arthurblake/log4jdbc/blob/m

  • java と strace - tokuhirom's blog

    java command は clone(2) するので、普通に strace してもダメ。 strace -f java ... のように -f オプションをつければ、clone した先も追ってくれるので、トレース可能となる。 ためしに以下のような何もしないプログラムを用意してみる。 public class Hello { public static void main(String[] args) { } } javac Hello.java とした後、strace -o java.log -f java Hello とすると、java.log というファイルが作成され、どのようなシステムコールを JVM が発行しているかがわかる。 ちなみに /usr/bin/perl -e0 した場合と比べると以下のようになり、Java で開発を行うと何もしないプログラムでもたくさんの syste

  • JSON-RPC 2.0 の over HTTP についての雑感 - tokuhirom's blog

    「うちは JSON-RPC やらんのかね」みたいなことを聞かれたので、前に考えた内容をここに晒す。 method 名について メソッド名が content-body にしか入らないので、ログがおいづらい。 (多分、実際に運用するにあたってはクライアント側で ?method=XXX みたいに付与するとかやって運用するんですかね? なんかちょっと末転倒っぽい) 特定の API method だけこっちのサーバーにふる、とかするのがつらそう。 id が意味ない over HTTP で運用する場合、id を付与していることのメリットがない。 デメリットとして、JSON 自体をまるっとキャッシュすることができなくなる。 メリットについて フォーマットがきまっているので、server2server とか、小規模のサービスとか、あるいは over TCP でやるんなら便利なケースはあるかな、とおもって

    yass
    yass 2015/05/11
    " メソッド名が content-body にしか入らないので、ログがおいづらい。/ over HTTP で運用する場合、id を付与していることのメリットがない。 デメリットとして、JSON 自体をまるっとキャッシュすることができなくなる。"
  • tokuhirom's blog

    Google guava と Java 8 Google guava は Java 7 で使っていると便利なのだが、Java 8 の世界では使わないほうがよいように思う。 Java 7 の世界で独自で関数型プログラミングしようとした結果、読みにくいコードになっている面がある Java 8 ととの機能の重複が多い バイナリ互換性を失うような変更が行われるため、後々困ることがある 自分のコードで guava に依存していると、ライブラリが要求している guava のバージョンにあわせられなくてつむことがある guava なにげに色々詰め込みすぎてるのでバイナリサイズがわりとでかい guava にある機能で java 8 にないものはわりとほとんど apache commons で代用できる。 そんな感じです。重要なのはバイナリ互換性まわりで、なにかとクラス削ったりしてくるのではまりがちですね!

    yass
    yass 2014/11/21
    " Google guava は Java 7 で使っていると便利なのだが、Java 8 の世界では使わないほうがよいように思う "
  • LL から Java に移行した人がはまりがちなこと - tokuhirom's blog

    こんにちは。Java 初心者です。 Java 初心者、得に LL から Java に来た人にありがちな問題について社内向けに書いたものをオープンアンドシェアさせていただきます。 前提として、我々は Java 8 でガンガン攻めているということをご承知おきください。 また、自分がこの数ヶ月で「うわー。こうしとくべきだったのかー」と気づいたやつをドヤ顔で語っているということにもご注意ください。 【追記】 対象は中規模 B2C の場合です(中規模というのは facebook より小さいという程度の意味です) 例外を握りつぶさないようにしよう Eclipse が生成する以下のようなコードをそのまま残しているケース。 これは言うまでもなく良くないですね。デバッグが困難になります。 try { } catch (IOException e) { e.printStackTrace(); } Perl

  • nanobench のインターフェース変えた - tokuhirom's blog

    lambda 使わないほうがいいんじゃない?という意見を kazuho さんから頂いたので、使わないようにしてみた。 lambda 使わない方がデバッガで追いやすいというのは一理あるので、それもまたいいのかな、と。 というわけで、以下のように書けばいいという感じになった。 import java.util.List; import java.util.ArrayList; import java.util.LinkedList; public class ListBenchmark { // Benchmarking method must be started with 'bench'. public void benchArrayList() { List<Integer> l = new ArrayList<>(); for (int i=0; i<1_000_000; ++i) {

  • nanobench - Java 8 で簡単にマイクロベンチマークをとれるフレームワーク作った - tokuhirom's blog

    Caliper や JMH などを試してみたが、案外あれは使うのが難しかったり、インストールが難しかったり、結果がよみづらかったりする。 Perl 5 に標準添付されているベンチマークフレームワークであるところの Benchmark.pm と同じぐらい気軽な感じで使えるベンチマークフレームワークが Java 8 用にあれば便利なのではないか、と思ったので作ってみた。 https://github.com/tokuhirom/nanobench 先日つくった HTML escape に関するマイクロベンチマークを nanobench を使って書きなおしてみる。 package me.geso.microbenchmarks; import me.geso.nanobench.Benchmark; import org.apache.commons.lang3.StringEscapeUtil

    yass
    yass 2014/06/27
    " Caliper や JMH などを試してみたが、案外あれは使うのが難しかったり、インストールが難しかったり、結果がよみづらかったりする。 Perl 5 に標準添付されている / Benchmark.pm と同じぐらい気軽な感じ"
  • Web Application の validation はどのレイヤーでかけるべきか - tokuhirom's blog

    数年前にも同じことかいた気がするけど、最近の状況にあわせてかいてみる。 途中で面倒になってきて説明が雑になっている点をご容赦ください。 言いたいことは「結局、昔はサーバサイドで懇切丁寧なエラーメッセージを出すためにModelではなくControllerでバリデーションに関する知識が必要だったけど 今はJavaScriptでやるから不要だよね111」ってことです。 この表題は、よく話題にあがるところなのだが、理想論としては Model, Controller, Client side のいずれにおいてもきっちりと validation を行うことがのぞましい。 しかし、実際にはなかなか面倒である。ということで、どこをはぶくかというと Controller における Validation であろう。 ユーザーに対する親切なメッセージは JS の側でだすのが理想的。model の validat

    yass
    yass 2013/11/26
    " 言いたいことは「結局、昔はサーバサイドで懇切丁寧なエラーメッセージを出すためにModelではなくControllerでバリデーションに関する知識が必要だったけど 今はJavaScriptでやるから不要だよね111」ってことです。"
  • Redis の sorted set にかんするメモ - tokuhirom's blog

    ほんとにチラ裏ですが。 http://japan.cnet.com/blog/kenn/2011/01/13/entry_30011467/ をみてて、なんで redis の ZRANK はやいのかなーとおもって、しらべたののメモです。 skip list については、http://www.geocities.jp/m_hiroi/light/pyalgo19.html このへんがわかりいいとおもいました。 INSERT: O(log(n)) REMOVE: O(log(n)) ですよ、と。 hash で member → score のデータを保持してる。 skip list で score → member のデータも保存してる skip list の実装は William Pugh のオリジナルのコピーだけど、ちがいも3つほどあるよ。 で、ZRANK がなんではやいのかというと、各

  • cron でうごかしているコマンドをタイムアウトさせる - tokuhirom's blog

    coreutils の timeout(1) をつかえば OK です。 http://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html softlimit -t 60 foobar という手もあるけど、CPU時間だから sleep してるとかだと死ねないという説もあるようです。

  • Using memcached with LZ4 - tokuhirom's blog

    Cache::Memcached::Fast uses Compress::Zlib by default to use compression. It's bit slow on high traffic environment. I got a Compress::Zlib as a bottleneck in our web application. In this case, you can use Compress::LZ4 for better performance. I'm using this as following form: use Cache::Memcached::Fast; use Compress::LZ4; my $memcache = Cache::Memcached::Fast->new(+{ %{config->cache}, utf8 => 1,

  • モダンな Perl の開発環境の構築方法 - tokuhirom's blog

    一般的な OSX 環境および Linux 環境における、モダンな Perl 開発環境の構築方法についてまとめてみたよ。 perlbrew のインストールperlbrew をつかうことにより、簡単に最新版の Perl5 を利用することができるようになる。 perlbrew をいれる。% curl -L http://xrl.us/perlbrew | perl - install % ~/perl5/perlbrew/bin/perlbrew init ~/.bashrc (または ~/.zshrc)に source ~/perl5/perlbrew/etc/bashrc を追記。あたらしいシェルをたちあげる。最新版の perl をインストールする。% perlbrew install perl-5.12.1 % perlbrew switch perl-5.12.1 ここまできたら、she

  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    yass
    yass 2009/12/07
  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    yass
    yass 2008/05/22
  • ssb がすばらしすぎる件 - TokuLog 改め だまってコードを書けよハゲ

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

  • TokuLog 改め だまってコードを書けよハゲ - ケータイシミュレータなんて使ってないで Moxy 使えばいいのに

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

  • 1