« 2010年1月 | トップページ | 2010年3月 »

2010年2月

2010年2月15日 (月)

罫線の出る monsiaj

monsiaj-20100304 をちょっと改造。

2010年2月11日 (木)

スタンプエディターの右矢印

スタンプエディターで,左矢印でスタンプを取り込んで編集した後,右矢印でスタンプ箱に戻すと,スタンプの一番下に加えられる。これを,カーソルがある位置のすぐ下に挿入するようにした。

client/StampBoxPlugin.java

class EditorValueListener implements PropertyChangeListener {
 ・
 ・        
  public void propertyChange(PropertyChangeEvent e) {
    Object obj = e.getNewValue();
//pns^
    StampTreeNode targetNode;
    if (e.getOldValue() instanceof StampTreeNode) {
      targetNode = (StampTreeNode) e.getOldValue();
    } else {
      targetNode = null;
    }
//pns$
    if (obj != null && obj instanceof ModuleModel) {
      ModuleModel stamp = (ModuleModel) obj;
      String entity = stamp.getModuleInfo().getEntity();
      StampTree tree = userBox.getStampTree(entity);
//pns^
      // tree.addStamp(stamp, null);
      ((StampTreeTransferHandler)tree.getTransferHandler()).setPosition(StampTreeTransferHandler.Insert.AFTER);
      tree.addStamp(stamp, targetNode);
//pns$
      } else if (obj != null && obj instanceof ArrayList) {
 ・
 ・

order/EditorSetPanel.java

public void setEditorValue(Object value) {
  editorValue = value;
//pns   boundSupport.firePropertyChange(IStampEditorDialog.EDITOR_VALUE_PROP, null, editorValue);
  boundSupport.firePropertyChange(IStampEditorDialog.EDITOR_VALUE_PROP, getSelectedNode(), editorValue);
  curEditor.setValue(null);
}

2010年2月 8日 (月)

コードヘルパー

コードヘルパーという機能があって,例えば tx と入力して直後に「修飾キー+スペース」と押すとテキストスタンプのポップアップが出現して入力できるらしいのだが,どうもうまく動かなかった。調べてみたところ,Spotlight のショートカットとぶつかってしまっていたようだった。そこで,キーを「修飾キー+リターン」に変更したら動いた。これは結構便利かもしれない。

client/AbstractCodeHelper.java

public AbstractCodeHelper(KartePane kartePane, ChartMediator mediator) {
 ・
 ・        
  this.textPane.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
//    if ((e.getModifiersEx() == MODIFIER) && e.getKeyCode() == KeyEvent.VK_SPACE) {
      if ((e.getModifiersEx() == MODIFIER) && e.getKeyCode() == KeyEvent.VK_ENTER) {
        buildAndShowPopup();
      }
    }
  });

2010年2月 6日 (土)

サーバダウン時の対応

  • 二重化は難しそうなのでしていない。
  • 毎日診療終了後,メインマシンの Xen の仮想サーバ(dom-U)をバックアップマシンに丸ごとバックアップしている。
  • メインマシンが故障した場合,バックアップマシンで dom-U を立ち上げると,昨日診療終了時の状態でサーバが立ち上がり,クライアント側では設定変更をせずに,すぐに診療を続けることができる。クライアント側で一切設定変更をしなくて済むのがこの方式の利点。
  • 一度,メインマシンのメモリが壊れたが,その時は壊れたまま1日の診療を終了できた。そして,翌日新しいメモリを手に入れて交換するまで,バックアップマシンを使用した。幸い,データ喪失なしにメインマシンの故障に対応できた。
  • しかし,診療途中にメインマシンが故障してバックアップに切り替えた場合,その日の診療開始から故障するまでの診療内容の記録は失われてしまう。
  • 多分,その日の診療終了後に時間をかけて復旧すれば,データを救い出せるとは思うが,ハードディスクがどうやっても全く読めない最悪の事態もあり得る。
  • データを救い出せない場合,失われたデータは入力し直しになるが,その際,受付ノートと処方箋があれば,問診票や過去カルテを見ながら診療内容を思い出して再現できる自信はある。
  • そこで,処方箋と領収書を打ち出す際に,pdf ファイルとしてバックアップマシンにコピーを保存するように設定した。これで,メインマシンのハードディスクが全く読めないという事態になっても,サブマシン側に処方箋と領収書は残る。

印刷時に pdf ファイルをバックアップマシンにコピーする

  • lp ユーザの $HOME を調べて,.ssh を作成し,公開鍵認証でバックアップマシンとパスワードなしで通信できるように設定しておく。
    root@orca # su - lp
    lp@orca $ echo $HOME (lp のホームディレクトリを確認)
    /var/spool/lpd
    lp@orca $ exit
    root@orca # mkdir /var/spool/lpd/.ssh
    root@orca # cp 秘密鍵 /var/spool/lpd/.ssh (秘密鍵の設定)
    root@orca # chmod 600 /var/spool/lpd/.ssh/秘密鍵
    root@orca # chown -R lp:lp /var/spool/lpd/.ssh (.ssh ディレクトリを lp がアクセスできるように設定)
    root@orca # su - lp
    lp@orca $ slogin -i .ssh/秘密鍵 -l backup backup-machine
    The authenticity of host '[backup-machine]: ([192.168.1.xxx]:22)' can't be established.
    RSA key fingerprint is 5b:46:eb:d1:b8:f9:8f:f7:71:95:0a:11:6d:58:a6:dc.
    Are you sure you want to continue connecting (yes/no)? yes
    
    Linux backup 2.6.18-6-686 #1 SMP Tue Jun 17 21:31:27 UTC 2008 i686
    
    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    Last login: Fri Aug 22 05:11:42 2008 from 192.168.1.xxx
    backup@backup-machine $
    
  • /usr/lib/cups/backend/pdf を作る。実行属性を与えるのを忘れずに。
    #!/bin/sh
    #
    # lp が書き込みできるディレクトリ,何でもいい
    PDFDIR=/var/spool/cups-pdf/ANONYMOUS
    
    # pdf ファイルの名前
    PDFNAME=`date +%Y%m%d-%H%M%S`
    
    # ps ファイルを pdf に変換するコマンド
    PS2PDF="/usr/bin/ps2pdf -sPAPERSIZE=a5"
    
    # pdf ファイルをコピーするマシン
    BACKUPDIR="backup@backup-machine:pdf"
    
    # 公開鍵認証
    KEY=/var/spool/lpd/.ssh/秘密鍵
    
    # ここの設定が,cups でプリンタ登録する際にデバイス欄に現れる
    # pdf1 のところを pdf2 などとして別ファイルを作ればプリンタを増やせる
    if [ $# -eq 0 ]; then
    echo "direct pdf1:/ \"customized backend\" \"PDF Writing\""
    exit 0
    fi
    
    # まず,実際の印刷処理を行う
    lp -d lp1 $6 (領収書,処方箋は lp1 で印刷している)
    
    # ps ファイルを pdf に変換
    $PS2PDF $6 $PDFDIR/$PDFNAME.pdf
    chmod 666 $PDFDIR/$PDFNAME.pdf
    
    # 出来上がった pdf をバックアップマシンに転送
    scp -i $KEY $PDFDIR/$PDFNAME.pdf $BACKUPDIR
    
    # 転送終了後消去
    rm $PDFDIR/$PDFNAME.pdf
    
    exit 0
    
  • cups にアクセスして,pdf という名前でプリンタを新しく作る。デバイスは PDF Writing,モデル/ドライバは何も選択せずにプリンタの追加をクリック,メーカーは Raw,モデルは Raw Queue (en) を選択。
  • ORCA の「出力先プリンタ割り当て情報」(システム管理マスタ)で,出力先を,上で登録したプリンタ名 pdf にする。

2010年2月 1日 (月)

TreeCellEditor 設定

スタンプ箱のラベルを編集するのに,オリジナルでは右クリックから「名称変更」を選ぶようになっている。DefaultTreeCellEditor を組み込むと,右クリックを使わなくても,マウスをトリプルクリックするか,マウスクリックを休止をはさんで 2 回行なって 1200 ミリ秒待つと編集が開始されるようになる。これをスタンプ箱に組み込んだ。ついでに,1200 ミリ秒を少し短くした。

client/StampTree.java

public StampTree(TreeModel model) {
 ・
 ・
  // TreeCellEditor セット
  this.setEditable(true);
  this.setCellEditor(new MyDefaultTreeCellEditor(this, renderer));

ui/MyDefaultTreeCellEditor.java

package open.dolphin.ui;

import java.util.EventObject;
import javax.swing.DefaultCellEditor;
import javax.swing.JTree;
import javax.swing.Timer;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;

/**
 * TreeCellEditor
 * @author pns
 */
public class MyDefaultTreeCellEditor extends DefaultTreeCellEditor {
  public MyDefaultTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
    super(tree, renderer);
    realEditor = this.createTreeCellEditor();
  }

  @Override
  protected TreeCellEditor createTreeCellEditor() {
    DefaultTextField textField = new DefaultTextField(BorderFactory.createLineBorder(Color.blue));
    textField.setOpaque(true); // これをしないと,編集時のバックグランドが白くならない

    DefaultCellEditor editor = new DefaultCellEditor(textField) {
      @Override
      public boolean shouldSelectCell(EventObject event) {
      boolean retValue = super.shouldSelectCell(event);
      return retValue;
      }
    };

    // One click to edit.
    editor.setClickCountToStart(1);
    return editor;
  }

  /**
   * 編集が始まるまでの delay を早くした(デフォルトは 1200 msec)
   */
  @Override
  protected void startEditingTimer() {
    if(timer == null) {
      timer = new Timer(900, this);
      timer.setRepeats(false);
    }
    timer.start();
  }
}

« 2010年1月 | トップページ | 2010年3月 »