2010年07月30日のツイート

6月の読書メーター

6月はツマミ読みばかりしてたからか。。。

6月の読書メーター
読んだ本の数:1冊
読んだページ数:436ページ

借金取りの王子―君たちに明日はない〈2〉 (新潮文庫)借金取りの王子―君たちに明日はない〈2〉 (新潮文庫)
前作の「旧友」という話が好きで、たまに読み返していたシリーズの続編。出張の夜に読みました。「旧友」ほど好きな話はなかったですが、シリーズの根底に流れる「良い仕事」観や「人生」観が好きで、それが本作にも滲んでいると思う。
読了日:06月23日 著者:垣根 涼介

読書メーター

Tomcat7 のメモリリーク対策を覗き見るの巻

モレるという言葉に過剰反応してしまう、お腹の弱い日本男子代表のソメダです、こんばんわ。id:c9katayama さんが、こんなエントリ を書いていたり、こんなつぶやきをしていたり、

Tomcat7のJreMemoryLeakPreventionListenerがキモかわいい

http://twitter.com/c9katayama/status/18569788913

で完全に釣られました。チェックアウトしてコードみてみたですよ。c9katayama さんのエントリの補完的な内容をメモするですよ。

JreMemoryLeakPreventionListener

このリスナのそもそもの意図としては、Webapp クラスローダがコンテキストクラスローダの場合に、このリスナが扱ってるクラスをロードするとメモリリーク起きる可能性あるので、Server の初期化時に (正確にはコンテキストクラスローダが Common ローダのうちに)、先読みしておこう、というもののようです。Tomcat のクラスローダの構成は ここ 参照。

で、このクラスは LifeCycleListener の実装クラスで、このリスナを有効にする設定は server.xml に以下のように、Server 要素の子要素として定義されてます。

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

機能として利用したくなければ、これをコメントアウトしたり、また JreMemoryLeakPreventionListener で有効、無効にしたい機能などはここで設定すればよくなってるです。この辺りはドキュメントもされてますね。

中身の詳細は先のエントリの通りです。一点補足でいうと、urlCacheProtection はメモリリークというより、意図しないファイルロックが残ってしまうのを防ぐためのようです。appContextProtection は GWT が imageio 使う時に影響ある、gcDaemonProtection は JMX 系のクラスから呼び出される、といった事がコメントには書いてあるので、さらっと見てみてもよいと思います。

JdbcLeakPrevention

中身については先のエントリの通りなのですが、呼び出し元の WebappClassLoader#clearReferencesJdbc の実装のほうがキモいです。クラスローダ周りの処理なのでしょうがないのでしょうが、自分では書きたくない系です。

    private final void clearReferencesJdbc() {
        InputStream is = getResourceAsStream(
                "org/apache/catalina/loader/JdbcLeakPrevention.class");
        // We know roughly how big the class will be (~ 1K) so allow 2k as a
        // starting point
        byte[] classBytes = new byte[2048];
        int offset = 0;
        try {
            int read = is.read(classBytes, offset, classBytes.length-offset);
            while (read > -1) {
                offset += read;
                if (offset == classBytes.length) {
                    // Buffer full - double size
                    byte[] tmp = new byte[classBytes.length * 2];
                    System.arraycopy(classBytes, 0, tmp, 0, classBytes.length);
                    classBytes = tmp;
                }
                read = is.read(classBytes, offset, classBytes.length-offset);
            }
            Class<?> lpClass =
                defineClass("org.apache.catalina.loader.JdbcLeakPrevention",
                    classBytes, 0, offset);
            Object obj = lpClass.newInstance();
            @SuppressWarnings("unchecked") // clearJdbcDriverRegistrations() returns List<String> 
            List<String> driverNames = (List<String>) obj.getClass().getMethod(
                    "clearJdbcDriverRegistrations").invoke(obj);
            for (String name : driverNames) {
                log.error(sm.getString("webappClassLoader.clearJbdc",
                        contextName, name));
            }
        } catch (Exception e) {
            // So many things to go wrong above...
            log.warn(sm.getString(
                    "webappClassLoader.jdbcRemoveFailed", contextName), e);
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException ioe) {
                    log.warn(sm.getString(
                            "webappClassLoader.jdbcRemoveStreamError",
                            contextName), ioe);
                }
            }
        }
    }

StandardHost の MemoryLeakTrackingListener 周り

これまた内容は先のエントリの通りで、この機能の呼び出し元は ManagerServlet#findLeaks です。なので、manager をデプロイすればこの機能を利用してのメモリリークの検知をすることが出来るようになります。manager アプリにこんなのが追加されています。

ただし、実際には実行前に System.gc を呼び出すのでプロダクションシステムでは注意しろ、と書いてるので、ご利用は計画的に。

まとめと雑感

メモリリーク対策や検知の対象とされているのは、全般的に Webapp クラスローダ周りです。これ不要になった Webapp クラスローダへの不正な参照が残ってしまう事を防ぐ、という意図のように見えるのですが、そもそも Webapp クラスローダが不要になるのが、コンテキストのリロード時以外にあるのかなぁ、という素朴な疑問。もしそうであれば、プロダクションで、コンテキストのリロードをしないような運用をしていれば、影響ないのかな、と思ったり。ここはもうちょっとコード読む必要あるかも、です。勘違い等してたらコメント頂けると幸いでございます。

LOB のデータを CLI からファイルにダンプする方法

  • お題 : 「BLOB のカラムをコマンドのみでファイルにダンプする」

ということで、非バイナリアンな私は Cafe Babe 程度のたしなみしかないですが、LOB のカラムの中身をちょいっと拝見したい時もあるわけです。

コード書いてバイト配列書き出せば良いのだけれど、例えば Python だったら DB API をインストールして、とか、そういう環境的な準備が面倒な時に、まぁ、それなりの精度でダンプ出来る方法を、ということで。環境は MySQL 5.1.x です。

下準備

以下のような形で LOB のデータを入れておく

mysql> create table lobtest (id int,lob longblob);
mysql> insert into lobtest (id,lob) values (1,load_file('/Users/someda/test.gif'));

抜き出し

$ mysql -Ns -u root -p -e "SELECT hex(lob) FROM lobtest WHERE id = 1" | awk '{s=$1;len=length(s); for(i=1;i<=len;i=i+60){print substr(s,i,60)}}' | xxd -r -ps -c 30 > out.gif

やっていることは、

  1. LOB のデータを 16 進数で文字表現で抜き出してから、
  2. awk で 30byte 毎に改行を入れた形式に変換して、
  3. それを xxd で戻す

という 3 ステップの組み合わせです。特にバッファしたりせず、データ全てをメモリに乗せるので、あまり大きなサイズの LOB には使わないほうが良いかも。ただ、手元環境で、2010年度でそれなりに近代的なマシンでは 100MB 程度ならば動く感じでした。

抜き出すファイルのサイズによってはエラーが出ることもあるので、mysql のオプションに --max_allowed_packet=48M とか (サイズは適当) をつければ解消することもあるかと思います。

確認と雑感

$ cksum test.gif out.gif
3114775889 1442 test.gif
3114775889 1442 out.gif

通常のバイナリだったら、この方法で zip やら画像やら xls やらは普通にダンプ出来たのですが、逆にテキストファイルで、日本語のエンコード処理がかかっているようなモノが怪しい時がありました。

専用のユーティリティがあるような気もするのですが、そこは MySQL 初心者ということで。。。

追記 (7/7)

天の声が聞こえました。

GNU textutils はいらんかえ〜♪ fold -w 60 - ... はっ、Kyushu-AWKers と言いながら AWK を排除してしまった(w RT @tksmd: ブログ書きました。 http://d.hatena.ne.jp/tksmd

http://twitter.com/matsu_hiroshi/status/17845462804

ということで、awk が消えて fold が登場しました。

$ mysql -Ns -u root -p -e "SELECT hex(lob) FROM lobtest WHERE id = 1" | fold -w60 | xxd -r -ps -c 30 > out.gif

5月の読書メーター

ソフトウェア企業の競争戦略は面白かった。図書館で借りた本だけど買ってもよいかも。

5月の読書メーター
読んだ本の数:2冊
読んだページ数:689ページ

態度が悪くてすみません―内なる「他者」との出会い (角川oneテーマ21)態度が悪くてすみません―内なる「他者」との出会い (角川oneテーマ21)
実家帰省時にたまたま目にして読んだ本。言語と身体の二章を読んで、自然言語解析が字面だけの解釈だけでは難しいのは、「文脈」以上に「身体性」というものを測定しきれないからなのかな、と思ったり。五章の書評の中では、歴史そのものの解釈、「いま、ここにいる、私」を最上位として「考えない」視点が考えさせられる点でした。適応者生存は優れているから、残る、っていう話ではないですものね。ここ最近読んだ本の中で偶然にも「歴史」がキーワードになるものが多かったのも何かの力かも。
読了日:05月25日 著者:内田 樹
ソフトウエア企業の競争戦略ソフトウエア企業の競争戦略
製品企業も、景気の悪化や製品のコモディティ化が進んでいくと、結果サービス売上の比率が大きくなり、プラットフォームプレーヤにならない限りは、サービス企業に近づく、という事実とそれを元にした論考に驚く。多くの企業がその利益率や、労働集約的なビジネスからの脱却を見据え製品企業への転換を目論むケースがあるのだけれど、そこには注意深い思索が必要なのだと体感。勿論これは狙うマーケットにもよるのだろうけれども。同期安定化プロセスの事も遅ればせながら初めて知りました。もう一度どこかで読み直したい一冊。
読了日:05月21日 著者:マイケル・A. クスマノ

読書メーター

FxUG Flex4勉強会第111回@全国ツアー 京都 に行ってきました

Flex4勉強会第111回@全国ツアー 京都 に行って参りました。こってり時間を間違えて、14:00 OPEN 14:30 START だと思っていたら、実際は 30 分早かったようで、、、入った時には、Adobe 轟さんのセッションの最後の方でした。そんな訳で轟さんのセッションはほとんど聞けずで残念だったのですが、こことかこことかから、割に最新情報キャッチアップしているはずだ、というつもりになって、気を取り直して聞いてきました。

Flex4,Flash Builder4について

AKABANA のありかわさんのお話。Flex4 と Flash Builder4 のお話。以前聞いた事のある話からの差分として、気になった事をメモ。

ステートの話

ステート処理の充実の一環として、color などの プロパティを state に紐づけて設定する事が可能に。

<state>.color = #ffffff;

みたいなイメージ。Flex3 での state は結局 transition などは便利なんだけれども、こういった色を変える、とかちょっとした所では、やっぱり AS 書いて扱わないといけない所があった分、私は State 自体をあまり使わなかったのですが、こういった指定が簡単になるのであれば、フロントエンドの UI の調整はかなりしやすくなるので、アリだな、と思います。

CSSセレクタ改善の話

CSSセレクタで、ネームスペースが指定出来るようになったり、子孫セレクタが設定出来るようになったり、という話。これ、HTML の CSS のメタファにあまり近づけすぎない方がよいかも、と思いました。というのも、HTML の CSS で出来る padding/margin といった表示要素の変更に制限があったり、といった「似て非なるもの」なのに「できない」と思わせるのであれば、最初から違う雰囲気の方が、まだ迷いが少なくてよいか、と。

レイアウトの話

レイアウトオブジェクトを設定出来るようになる、というのは◎。マルチデバイスな環境において、例えばスクリーンサイズが小さいデバイスでは、VBox で、そうでなければ HBox で、とか、ウィンドウのリサイズ時に一定サイズより下回れば、VBox レイアウトで、といった所で、ユーザにとって嬉しい事を簡単に実現出来そうな使いどころ、シチュエーションはありそうに思いました。レイアウトが動的に簡単に切り替えられる、というのは良いですね。

プロファイラの話

お話聞いた限りで、Flex Builder 3 との差分はあまりないとの事でしたが、ありかわさんに後で質問したところ「信頼性があがってる」とのこと。(w) これは、地味ですが大事なところで、メモリ漏れ探してるんだけれどもプロファイラがいまいち怪しい、となると、結局ツールとして使わなくなるので。(手でメモリ量を trace しまくったり ^^;)

FlexUnit の統合の話

開発は楽になりそうだな、と思う反面、これを回帰テストでまわしやすい環境までは、もう一歩、という印象。テストユーティリティの話でいえば、FlexMonkey がずっと気になってます。

DCD のテンプレート変更の話

テンプレート生成時に yui フレームワークにのっとったテンプレを吐き出せる、というのは、フレームワーカや、そこそこの規模のプロジェクトのアーキテクトなどには嬉しい機能なように感じました。

その他

懇親会でも話題にあがったのですが。Flash Builder は良い、と。ただ Flash Catalyst をデザイナさんに使ってもらうには、正直敷居が高いのでは、という懸念が払拭出来ず、でした。というのも、今までのワークフローが

  1. デザイナさんがデザイン及び画像等の aseet 作成
  2. プログラマが組み込み
  3. 表示がうまく行かない場合、プログラマが組み込み調整

というスタイルを前提で考えると、Flash Builder と Flash Catalyst の連携が解決する領域は、2,3 の「プログラマの試行錯誤の部分」だと思うのです。言い換えると、デザイナさんにとっては、ほとんどメリットが見えない、と。もちろん、デザイナさんが作ったワイヤーフレームなりが、そのままアプリになる、というのは大きなメリットだと思うのですが、正直ツールが出たてのこのタイミングで「寸分狂わず」のクオリティはやっぱり難しいだろうし、そういった所で、デザイナさんに、Flash Catalyst を使ってもらう「説明」がしにくい部分だと思うのです。

そういった問題の解決策としては、プログラマがデザインによるか、デザインとプログラムの橋渡しをするような、Flash Catalyst 専門のレイヤを置く、といった所でしょうか。

AIR2について

事例がの話が面白く。AIR to AIR の連携とかも面白いだろうな、と思ったり。

これは AIR2 どうこうよりも、以前から AIR がデスクトップの領域に入るにあたり、Java (Swing とか SWT とか) や C# などの既存とどう差異を見いだしていくのは、今後も気になる所です。それなりに綺麗なアプリを簡単に作れる、といった所はありますが、ソケット通信やネイティブ連携などは、それこそ JavaC# のほうに一日 (以上の ?!) の長がありますし、その中でどうポジショニングを確立していくのか、というところは単純に楽しみです。

Flashコンテンツの最適化

1->10 Design の長井さんのお話。百聞は一見にしかず、で このサイト みればわかるかと。このサイト制作にまつわる最適化のお話でした。Flash Player は演算処理よりも描画処理の方が圧倒的に CPU を使うランタイムである、という話が印象的でした。自作の 3D エンジン作る辺りに意気込みを感じました。

業務フロー設計アプリのFlex3から4への移行

前職の同僚の方々のお話で、いつもちょっとした子ネタを入れられているのが心憎い。Flex Builder 3 + Flex 3.5 で開発している自社製品を、Flash Builder 4 + Flex 4 に移行させてみた、というお話。Flex Builder 3 -> Flash Builder 4 まではすんなり、SDK の移行がやっぱり大変、ということでした。コンパイルエラーを取る所まではいけたけれども、実行時のエラーまでは解決出来ず、今日までの所ではタイムアップだったとのこと。

実行環境のアップグレードって、そもそも既存アプリを開発した後はよっぽどの事がない限り、なかなか思い切れない所です。が、先延ばししすぎても危ない所 (バージョン二つまたぎのアップグレードなどになると、情報も少なくなるし、危険度もあがるので) なので、考えないといけない部分はあるでしょうね。

完全に上手くいかなくても、こういった移行に関する情報 (苦労話 ?!) を出していくことって大事だなー、と思った次第です。

iPadを使った、"MoPH"のマイクロライブ

京都精華大学の平野先生の「公演」。MOPH については、以前「Motion Score」と呼ばれていた時に見たもので、相変わらず面白く。

平野先生とは懇親会でお話させて頂いたのですが、その中で非常に面白い事をおっしゃっていたのですが、「ユーザビリティ、というと、『敷居を低くする』という方向に行きがち。ただ、ピアノみたいな楽器は、誰が叩いても簡単に音が鳴る「簡単」なインターフェースだけれども、それこそプロになると、全然違うアウトプットを出せる『奥深さ』も同時にインターフェースが備えている」という話。そういった視点で、アプリケーションを考えると、また一風違った世界が見えるのではないか、と思った次第です。

まとめ

読み返すと、なんとなく批判的に見える所もありますが、単純にまだ僕自身が「わからない、見いだせてない」所もあるのかな、と思いますので、ご容赦です。後、FxUG 京都は、デザイナさんも入れば、アカデミアでインターフェースをやっている人がいたり、はたまた開発者がいたり、とその「雑多感」が面白い所だな、と思いました。極端な話、FxUG で Flex 関係なく、ユーザビリティの話する人がいても面白いのでは、と。そんな事を考えながら懇親会から帰ってきた次第でございます。

運営の関係者の皆様、ありがとうございました&お疲れ様でした。

4月の読書メーター

昨年末位から 読書メーター - あなたの読書量をグラフで記録・管理 を使って、読書のちょっとしたメモを残してたのですが、気づけばまとめ機能みたいなのが出来たので貼付けてみるテスト。そして、はてダの Twitter 連携も。。

  • -

4月の読書メーター
読んだ本の数:2冊
読んだページ数:599ページ

芸術起業論芸術起業論
「作品の価値は、もの自体だけでは決まらない」「価値や評価は、作品を作る人と見る人との心の振幅の取引が成立すればちゃんと上向いてゆく」序盤のこの文章だけでひきこまれました。制作をするため、続けるために自分が生きる場そのものからをプロデュースする感覚、視点。換金をすること。エンジニアリングを如何に価値付けし、換金するか、という自身の問題にまだ答えは見いだせないけれども、何がしかヒントはある気がする。歴史に学ぶ事。
読了日:04月11日 著者:村上 隆
フリー~〈無料〉からお金を生みだす新戦略フリー~〈無料〉からお金を生みだす新戦略
新幹線移動で最後の方読んだせいか、SF まわりの下りとか潤沢さに対する論証は何だか冗長に感じたし、ポイントがよくわからなくなったり。。。ただ論旨の中央にある、稀少性をどこに見いだし、それをどのように課金していくのか、という点 (これは今までのビジネスのポイントと変わらない) に対し、今の時代背景をあわせた良い論の展開がされていると思う。例証も多かったのでまた参照する機会がある一冊だと思いました。
読了日:04月02日 著者:クリス・アンダーソン