« 2011年8月 | トップページ | 2011年10月 »

2011年9月

2011年9月26日 (月)

カルテをスワイプスクロール

Mac OS X は,Lion になって Safari でページをスワイプでめくれるようになった。OpenDolphin でもそれに似たような,ページをめくるようなスクロールができるようにしてみた。
 慣性スクロールでは,ScrollBar の getUnitIncrement で,1〜5ドットくらいの小さい値を返すようにする必要があるので,それを MyJScrollPane で設定している。KarteScrollPane では paint を横取りして,viewport を勝手に書き換えて,スワイプ風の表示をしている。複数カルテを開くと,その都度モニタ画面分のメモリを食うので,ヒープは -Xms512m 以上にしないと厳しい。

YouTube に操作の動画をアップロードしてみた。


水平スワイプスクロール

   


垂直スワイプスクロール


  • Quaqua を導入していないと,スクロールの際に JScrollPane#paint(Graphics g) は呼ばれず,うまく動作しない。
  • スクロール途中で,半分隠れたようなコンポネントの選択ができるようにした。メモリ使用量も減らした。(2011/10/16)

    Swipescroll2

2011年9月12日 (月)

飛ばない StampTree

StampTree で,左のような状態から node を閉じると,右の様な状態になる。この時,JScrollPane は小さくなった StampTree の全体を表示しようとするので,結果的にマウスカーソルの位置が「皮膚腫瘍」から「蕁麻疹・痒疹・掻痒症」まで一瞬で飛んだことになり,一瞬オリエンテーションを失ってしまう。

Nonjumping1

 

Nonjumping2

これは普通の動作ではあるのだが,自分としては,マウスカーソルを「皮膚腫瘍」で操作したのだから,下のように,操作後もマウスカーソルは「皮膚腫瘍」にあって欲しいと思う。

Nonjumping1

 

Nonjumping3

そこで,StampTree.java の getPreferredSize() をオーバーライドして,飛ばないようにしてみた。そういう仕様だと分かっていないと,Tree の上側がなくなってしまったように見えるので,一般にはおすすめできない設定だと思う。

2011年9月11日 (日)

ATOK 2011 クラッシュ対策(2)

その後,ATOK の挙動を詳しく調べてみたところ,「ATOK 入」の状態だと,JFrame を開閉する度に3〜4MB のメモリがどんどん消費されていくことが分かった。つまり,例えば1カルテの記入で,インスペクタ,カルテエディタ,数個のスタンプエディタ,シェーマエディタを開き,それぞれ編集して終了というような 10回程度のフレーム開閉があるとすると,1カルテを編集しただけで,30〜40MB のメモリが消費されてしまう。そのまま 20カルテ程度記載すると,消費メモリは 600〜800MB になって,あえなく ATOK はクラッシュする。

 当然ながら「ATOK 切」の状態であれば ATOK の消費メモリは増えないので,フレームの開閉の際に,ATOK をこまめに切ることができれば,ATOK のメモリ消費を抑えることができるはずである。

 Window#getInputContext() でとってきた InputContext を使って inputContext.selectInputMethod(Locale.US) のようにすると InputMethod の切換ができる。

JFrame f = new JFrame();
InputContext ic = f.getInputContext();
ic.selectInputMethod(Locale.US);

しかし,ATOK のメモリ消費を抑えるためには JFrame ができる前に U.S. に切り替わっていなければだめなので,この方法は使えない。どうしたものかと悩んでいたら,あるサイトで,AppleScript で System Events に「かな」キーと「英数」キーの key code を送って ime の on/off をする方法が紹介されていた。これを使って,ATOK をこまめに切るようにプログラムしてみた。

 ポイントは,「かな」キーで「ATOK 入」,「英数」キーで「ATOK 切」となるような設定である。これは下の左の画像のような設定ではダメで,右の状態になるように「言語とテキスト」設定画面の「入力ソース」を設定する。

Atokcheckng_2

 

Atokcheckok

 具体的には,チェックマークを「U.S.」と,ATOK の「ひらがな」だけにする。

Atokcheckatok

 

Atokcheckus

 これを使った ime on/off のスクリプト(IMEControl.javaExecuteScript.java, AppleScriptExecutor.java)を随所に組み込んで,JFrame の開閉時に可及的に ATOK を off にするようにしたところ,ATOK メモリ消費を約10分の1 に抑えることができた。これなら,お昼休みに1回 ATOK リセットすれば乗り切れる。

 この ime on/off の問題点は,System Events にキーコードを送るという方法なので,送信時にコマンドキーなどが押されているとうまくいかないという点である。コマンドーWでウインドウを閉じようとして,ぼんやりコマンドキーを押しっぱなしにしていると,いくら System Events に「英数」キーを送っても「コマンドー英数」になってしまうので,ime off にならない。この問題は,コマンドーWの後にすぐにキーを離すように特訓をして解決した。

2011年9月 1日 (木)

ATOK 2011 クラッシュ対策

ATOK 2010 のころから ATOK が1日数回クラッシュする現象に悩まされていた。カルテを書いていると,変換中にATOK が突然再起動してしまい,クラッシュレポートがはき出される。ATOK 2011 にしても症状は改善しておらず困っていたが,先日,何気なくアクティビティモニタを見たら,ATOK のメモリ使用量が異常に増えているのに気付いた。OpenDolphin でカルテを開くと,開く度に ATOK のメモリ使用量がどんどん増えていってしまう。調べてみると,エディタの mi でも同様に,ウインドウを開くと ATOK のメモリ使用量が増えるという現象がみられた。この現象は,ことえりでは見られず,ATOK 特有の問題のようだ。

ATOK 使用開始時の状態
メモリ使用量は 70.5 MB

クラッシュ寸前の状態
メモリ使用量は 735.4 MB

Atok2

 

Atok

スレッドも6だったのが39 まで増えている

Atok1

 

Atok2_2

以下のプログラムを走らせて,アクティビティモニタで ATOK のメモリ使用量をチェックすると,段々増えていって,やがてクラッシュするのが確認できた。ことえりではそういうことは起こらなかった。
import javax.swing.*;

public class AtokCrasher {
    
    public static void main(String[] argv) {
        for (int i=0; i<500; i++) {
            JFrame f = new JFrame();
            f.setVisible(true);
            
            f.setVisible(false);
            f.dispose();
        }        
    }
}
しかし,この現象を防ぐのにどうしたらいいのか分からなかったので(ソースも公開されてないし・・・),ATOK のメモリをモニタして,危うくなってきたらリセットできるようにした。ラベルの部分をクリックすると,ATOK をいったん終了して立ち上げ直す。(メモリのチェック,ATOK の再起動はスクリプトを使った:ExecuteScript.java

Atok_mem_monitor


この問題について,ジャストシステム社にお手紙を出したら,すぐにお返事が来て,状況が確認できたので,対策のための調査に入るとのことだった。ATOK 側で解決してもらえれば,ここに記載した改変は不要になる。期待して待ちたいと思う。

« 2011年8月 | トップページ | 2011年10月 »