ラベル 症例子ちゃん の投稿を表示しています。 すべての投稿を表示
ラベル 症例子ちゃん の投稿を表示しています。 すべての投稿を表示

2010年9月29日水曜日

症例子ちゃん

#症例子ちゃん

最近症例子ちゃんの話題が少ないからもう開発を諦めたのでは?と思われるかもしれないが、とりあえず症例こちゃんを活用してサマリーをどんどん書きためています(サマリーのExcel形式のアウトプットも一応出来ていて、当初の目標の7割は達成した感じ)。

もっともファイルメーカーを使えばもっと簡単にできたんかもしれないけど、いまさら…というのもありめんどくさいのでとりあえずこのまましてます。

大学卒業するくらいにデザインパターンに関する本を読んで、「オブジェクト指向とは役割をクラスごとに分けてクラスの相互関係でプログラムを動かしていくんだ!」と感動して無数のクラスを作ってしまったorz

一度作ったはいいけど、かなり大きなプログラムになって保守していくのが大変になってきた。

そこでリファクタリングが重要だと言うことが分かってやっぱりやろうかなぁ…。

2009年8月16日日曜日

症例子ちゃんnext version

ホームページにuploadした症例子ちゃんはもうだいぶ古いバージョンになってしまっていて、今は格段に進歩している。

もちろん進歩しているといっても、安定化に重点が注がれているわけで、基本的な機能はあまり変わらず。

<いろいろな問題点>

その1

たくさんの項目から一つ選ぶ時、ラジオボタンやチェックボックスじゃ多すぎる時がある。

自分的にはあまり問題にしてなかったけど、上司がそういうのは使いにくいということでJComboBox(クリックするとリストが出てきて選べる形式)を導入した。

その2

画像が課題。

何枚もの画像ならそれは多分電子カルテの中で見たほうが早いし、容量の問題もあるけど、でもこの患者さんを代表する一枚なんてものがあるはず。

Summaryの中に画像を入れるかどうかはさておき、画像を画面のところにdrag and dropするとその元画像が自動的にある場所に保存されて、元画像からサムネール(縮小版)が勝手に作られ画面上はそれが表示される。そしてとなりの拡大というボタンを押せば画面がポップアップで出てきて元画像を参照できる。

とりあえずjavaで画像の扱い方を勉強し、これからやろうとすることはなんとか再現できた。なのでこれからは画像を縮小する方法を勉強して(と言ってもそういうアルゴリズムやパッケージがあるだろうからそれを利用するだけなんだけど)自分のプログラムに組み込む。

その3

マニュアル類。

このプログラムをなんとか使ってもらおうと上司に掛け合ってみたけど、「お前がいなくなったとき保守はどうするの?」と言われて困った。

マニュアル類はすごく重要なんだけど、なかなかそこまで手が回らない。

まぁ二年間はいるので大丈夫ですよ。といったけど。

マニュアル作りはこれからの課題でまずは機能実現からか。

2009年6月29日月曜日

症例子ちゃん is on the way

 
以前作りかけてそのままにしてた症例子ちゃん、最近また作り出してその勢いで最後までとりあえず完成。

一度作ってみたものの、すべてを一つのプログラムの中に納めるという強硬手段に出たために、途中から何がなにやら分からなくなってしまって最後はうんともすんともいわない始末。

その反省として、デザインパターンをちょっと勉強してそれを使ってみようと思ったものの、実はよく分かっていなくてなんとなくオブジェクト指向な感じですべてクラスからインスタンスを作るようにしたため、途中で行き詰まり。

そこからさらに反省して、最初から最後まで絶対に必要なものはstaticにしてそうでないものと厳密に分けた。

それとoutputを強化して退院時サマリーなんかをボタン一つで出せるようにしたり。

あんなこんなしているとある程度実用的なソフトに仕上がった。

ただ、原因不明のエラーと結構不親切な仕様もまだあるのでそれを使い込みながら改善していくのが課題。

2009年4月13日月曜日

Again

ほどほどにprogrammingから遠ざかっていたわけで、それからまたやろうとすると、なんか感が鈍る。

変な間違いはいつまでたってもなかなか直らないわけで。

症例子ちゃんは続きをしようかとおもったけど、でもデータが入っているHDを実家に忘れたためアジャパー。

というわけで、どうしようかと悩み中。

結局Excelで出来ることをわざわざ自分でプログラミングする必要はない、という結論に至り、Excelの関数のお勉強をすることに。

2009年3月19日木曜日

動いた!

 
見た感じは以前作ったものとまったく変わりはないけど、 プログラムの中身は相当変わっている。
そう、
Change!
テキストボックスを移動したりスペースを考慮したりというのは以前した結果をそのまま流用できるから便利。

2009年3月18日水曜日

オブジェクト指向?

オブジェクト指向もどきでプログラムを作ってみた。

いわゆる役割ごとにクラスを作ってそれにやらせるというもの。

ただ、クラスの作り方が悪いのだろうか、後から後からたくさんのクラスが出来すぎてだんだんまとまりが悪くなってきた。

もちろん一つのプログラムで全てを書くよりも良いのかもしれないけど。

そろそろ全体の関係図を書くようにしとこうか。UMLの勉強もしないと…。


結論:でもやっぱりクラスを分けた方が分かりやすい。

2009年3月16日月曜日

bankAccount

自分の持っているJavaの本にはクラスの例として銀行の口座の例が載っていた。

口座番号と加入者名、預金額を一つのクラスにまとめてコンストラクタを用いて新規口座を作る、と言ったもの。

その時は一体これが何の役に立つんだろうかと思った。

もっと単純に、ArrayListなんかを使ってすれば増減も簡単にできるし良いんじゃないかと。

でも今作っているプログラムはArrayListでループを何重にも回したせいで何がなんだか分からなくなった。

そこでどこかのサイトに「プログラミングのコツ」みたいな記事があって何気なく読んでみると
データはクラスにまとめてクラスを引数にする
と書いてあった。

ちょうど、オブジェクト指向に挫折して、とりあえず適当な大きさのクラスに分けることから始めようとしていた矢先。

というわけでまたほぼ一からの作り直しになるけど、でも確実に進歩していると思う。でも三月中には終わらないかぁ。

2009年3月14日土曜日

メモ

追記:やっぱりちゃんと動かなかったのでコンパイルしながら修正。

これだとOutOfMemoryError: Java heap spaceが起こってしまう。多分breakでのlabelのつけ方がおかしいせい。

普段breakは多重ループを抜け出すときに遠くに置くから普通の使い方が分からなくなってしまったorz

forループを使いすぎるのは良くないというけれど、じゃあどうすりゃ良いの?と思う。 Genericsは配列で使うとなぜかエラーになるので使わないことした。

とりあえず何も考えずにコードを書いてみたけど動くのかなぁ…。。。。

// mergeが終わった後のString[] itemNewを使って
dataRecord = new ArrayList[itemNew.length];
for(int i = 0; i < dataRecord.length; i++){
dataRecord[i] = new ArrayList();
dataRecord[i].add(itemNew[i]);
}

// preDataRecord→dataRecordへの移動
for(int i = 0; i < dataRecord.length;i++){
goNext:
for(int j = 0; j < preDataRecord.length; j++){
if(((String) dataRecord[i].get(0)).equals((String) preDataRecord[j].get(0))){
// k = 0はitemNameになることに注意
for(int k = 1; k < preDataRecord[j].size();k++){
dataRecord[i].add(preDataRecord[j].get(k))
}
break goNext;
}
}
// preDataRecordが見つからない場合はdataRecordに""空白を挿入
for(int k = 1; k < dataRecord[i].size();k++){
dataRecord[i].add(" ")
}
}

2009年3月12日木曜日

症例子ちゃん again

以前症例子ちゃんという症例管理ソフトを作っていてそれで国試が終わったら本格開発するぞー!と意気込んでいたものの、国試が終わると熱が完全に冷めてしまった。

原因の一つがオブジェクト指向にとらわれすぎた点。

オブジェクト指向の本を読んで「なんてオブジェクト指向はすばらしいんだ!」と感動しつつもオブジェクト指向を実践するのはとても難しく、いざ手を動かそうとするとしり込みしてしまったこと。

もっというとクラスの概念がまだしっかりしていなかった時点でインターフェイスなどを使おうとしたのが間違えだったのかもしれない。

「最近症例子ちゃんどうなったの?」

という声を聞いて、そろそろまた始めようかなぁと思ってみた。

ただ、前回の開発で主な機能はできた。

今回はとりあえずオブジェクト指向の前段階としてクラスを使ってソースファイルを分けてみることにする。

それで調子がつかめれば本格的に作り直してみようかと思う。

2009年2月17日火曜日

Sqlite覚書

http://leoclock.blogspot.com/2008/10/sqlitejdbc-javasqlite.html
というJavaからSqliteを呼び出す非常に便利なツールがあったのでこれを使う際の覚書。

基本的には上記リンク先を見ればよいが、いくつかのtipsとメモ。

コンパイルは普通にすればよいが、実行するときにちょっと工夫がいる。 3.6.7.1はバージョン名
  • Mac, Unix: java -classpath ".:sqlite-jdbc-3.6.7.1.jar"***
  • Windows: java -classpath ";sqlite-jdbc-3.6.7.1.jar" *** 
 ***にはclassファイルが入る(sample.javaならsample)。Macでプログラミングをしていたのでなんでならないのかなぁと一時間ぐらい考えた(赤字の部分が違う)。

import java.sql.*; // めんどくさいので全部

Class.forName("org.sqlite.JDBC");  // よく分からないけど、これを入れる。
Connection connection = null; // 接続を作る?
String sqlState = null;  // SQL問い合わせ文を入れるためのストリング。

connection = DriverManager.getConnection("jdbc:sqlite:sample.db"); // sample.dbに接続
Statement statement = connection.createStatement(); // statementを作る
statement.setQueryTimeout(30);    // set timeout to 30 sec.

statement.executeUpdate("************"); // ******にSql文が入る

ResultSet rs = statement.executeQuery("select * from ***"); // 結果を取得
 /*
  *結果を取得する時はrsに全部入るので一個ずつ切って右に流れていくrs.next()で次!
  * rs.geXXX()で結果を取得する
  *getInt(""), getDouble(), getString(), getTime() etc..
  */

2009年1月21日水曜日

国試勉強とSQL

Dr. みとまのターゲット講座を見ていると「あーそうだったんだ!」ということが多い。

例えば1/2生理食塩水を投与するタイミングは血圧が保たれていて、かつ血漿浸透圧350以上という条件が必要、など。

しかしだ、現実的にここまでクリアカットに分かれるものなのか…とちょっと思ってしまった。

背理法で考えると、(卒業した人80%くらいがターゲット講座を見ているとして)「テコムが…」とか「みとま先生が…」とか言うのを聞いたことがない。

だから意味がないとかどうとかは言わないけど。

この超直前の時期に「初めて知ったわー」ということが多いのが不安(でもなぜか模試ではそこそこ点数は取れているのだが…)。ポジティブに考えよう。


ところで、「いちばんやさしい オブジェクト指向の本」という本を読んだら、プログラムはなるべく再利用できるように書いた方が良いということが分かった。

そうでなくとも、オブジェクトとオブジェクトの結びつきが強い今のプログラミング手法だと、コードが1000行くらいを超えたあたりからある箇所を修正したら全体に影響が出てしまって、もはや手に負えない。

なるべくメソッド同士、クラス同士はくっつきすぎない方が良いらしい。

ただ、オブジェクト指向は「言うは易し、行うは難し」でその具体例?として結城浩の「デザインパターン入門」を読み始めてみたが(と言っても国試勉強があるので、本格的には国試が終わってから)、非常に奥が深い。

多分このデザインパターンを知っているのと知らないのとでは作り方が大きく変わるような気がする。

せっかくなので読み終えてから作り直したいのでとりあえず
  • JavaプログラムでSQLite JDBCのコマンドプロンプトからの呼び出し練習
  • JavaプログラムによるSQLite <-> CSV の変換(とりあえず全てtext/Stringとする)
  •  SQLiteのコマンドの練習
をしようかと。

2009年1月18日日曜日

Memo

// 初期値のロード
******ItemListLoader();
void ItemListLoader(){
}

******InitLoad();
void InitLoad(){
}

// パネルの作成
******LeftPanelMaker();
void LeftPanelMaker(){
}

******RightPanelMaker();
void RightPanelMaker(){
}

******ToolBarMaker();
void ToolBarMaker(){
}

******MenuBarMaker();
void MenuBarMaker(){
}

// datasetを受け取ってロードする
******LoadData(dataset);
LoadData(HashMap[] dataset){
}

// データベースの管理
// 基本的に全てのデータを返す
// LoadData側で必要なデータのSelectionをかける
// SQLiteで管理

******dataset = OpenData(keyNum);
public HashMap[] OpenData(int keyNum){
    // keyNum番目のdatasetを返す
    HashMap[] dataset;

    return dataset;
}

******SaveData(keyNum, dataset);
public void SaveData(int keyNum, HashMap[] dataset){
    // 保存する
}

******keyNum = DeleteData(keyNum);
public int DeleteData(int keyNum){
    // keyNum番目のデータを削除してkeyNum--;を返す
    if(keyNum != 1) keyNum--;
    return keyNum;
}

******dataset = InsertData(keyNum, dataset);
public HashMap[] InsertData(int keyNum, HashMap[] dataset){
    // keyNum番目にdatasetを挿入する
    return HashMap[] dataset;
}

******keyNum = NewData(keyNum);
public int NewData(int keyNum){
    // 一番最後にinsertする!
    return keyNum; // 一番最後の番号+1を戻す
}

// 初期値の保存
******InitSave();
void InitSaver(){
    // getSize()で画面の大きさなども保存する
    // keyNumは最後のデータ番号を保存する
}
******DataWriter();
// データの出力
void DataWriter(){
    // Select * from ***
    // 全て
}

2009年1月17日土曜日

Tips

  • 症例子ちゃんでitemlist.txtを変えた時に古い項目をどうするか→必要な項目を読み出すように設計し直す(必要のない項目をdatasetにどのように採用すべきか、もしくはSQLiteの使用の考慮)
  • 追加ボタンを押したら一度ロックが入るようにする
  • JFormattedTextFieldは削除する(誤作動が多いため)
  • JListの追加の仕方のチェック(なんか順番が変)
  • 退院時サマリーの取得の仕方→parserを使って配列などのintermediateな形式にしてそこから取得できないかを考える
あとは一緒
  • デザインパターンを勉強してコーディングし直し
  • JFreeChart
  • SQLiteを使用する

2009年1月15日木曜日

デザインパターン

とりあえず症例子ちゃんの大まかなプログラミングは終わった。

やること
  • Bug取り(一番最後のデータを消すとエラー)
  • デザインパターンを勉強してプログラムの設計し直し
  • JFreeChartを使って推移を追えるようにすること
  • 将来的なことを考えて、データベースをSQLiteで設計できるかどうか考える(ただし、リレーショナルデータベースにするとちょっと管理が大変かも…)
  • 実践でのテストと要望を拾い上げること
とりあえずターゲット講座を聞いているが、この講座は非常にためになる。

まさに目からウロコ。

2009年1月13日火曜日

覚え書き 症例子ちゃん

  • JListのnewは消す(誤動作が多そう)
  • http://www.javadrive.jp/tutorial/joptionpane/index12.htmlを参考にして部分一致の検索と選択を考える
  • 日付やデータ入力にはjformattedtextfieldを使ってみる
  • http://www.javadrive.jp/tutorial/jframe/index11.htmlを参考にしてWindow Iconを設定する
  • JListの大きさをsetFixedCellHeightで出来ないか考える
  •  データの推移を表示する方法を引き続き考える

2009年1月10日土曜日

JavaアプリケーションをMacのapp形式にする方法

以下複数のサイトを見て実際にやった覚え書き
macでのapp作成方法

・Jar Bundlerを使う
/Developer/Applications/Java Tools/Jar Bundler.app/にある。なければDeveloper Toolをインストール?

・Use Macintosh Barにチェックを付ける
ここにチェックを付けると、メニューバーがウィンドウ内ではなく上のバーに入る。

・JVM versionを1.4+にする(ここ重要!)
どうしてだか分からないが、JVMを1.4*となっているのを1.4+に直さないとうまく起動してくれない。

・Additional Sourcesを適宜追加
読み込み時に必要なファイルetcなどを追加しておくと、Contents/Resources/Java/のなかにJarファイルと一緒に入っている

もしくは何もなしにファイルをアプリケーションを作成して、パッケージの内容を表示させると
Contents/Resources/Java/のなかにJarファイルが入っているのでその中に本来あるべきフォルダなどを入れた方が楽かも。
・Propertiesでbundle nameを付ける

2009年1月9日金曜日

それらしく

 
とりあえず大方の課題はクリアしたので、後は細かい設定とバグ取りがメイン。
それが終わればさらに追加したかった機能などを加えていくことにする。
今日TECOM第四回模試とターゲット講座のテキストを受領。

前回の第三回模試は恐ろしく難しかったので今回に期待。

後なぜかMECからMEC BOOKという付録がついてきた。何じゃそりゃ??と思ってみてみると、なんとまとめ本。

ターゲット講座もまとめ本だしこれ以上まとめ本が増えても困るんだけどなぁ…。

2009年1月6日火曜日

了解

今Eclipseを使って作っているのだがなぜジェネリックを使うとコンパイルエラーが出るのかと思ってかなり悩んだ。

実は2chのJava質問スレッドに同じような質問がされていて、やっぱりネットってすごいなと思った。

結論:

EclipseがSDK 1.5に対応していなかった。(コードチェックが1.4までしか選べなかった…)

というわけでジェネリックもあきらめて書き直すと、型を指定していなかったので、いたるところで型が違うと怒られる。

というわけでキャストを重ねて対処。

時間がなくなったのでここで終了。

2009年1月4日日曜日

経過

医学教育出版社のi模試という国試対策の問題を解いてみた。

激ムズ。

もちろん解ける問題はあったし、勉強不足なところも否定はしないけれども。
というわけで症例子ちゃんもかなり出来た。おしまい。

2009年1月3日土曜日

症例子ちゃんの設計2

クリアすべき課題
  • add_data() メソッドの作成:これまでいる患者さんに対して新規の患者さんを作成する
  • propertyの活用:add_data()を作った後に

    • 第一引数:add_data()を呼び出した時に前項目をコピーすれば1、しなければ0
    • 第二引数:ボックスの大きさの指定など

  • Fieldに対してListenerを付ける:逐次変更を保存するのは動作が遅くなりそうなので変更がなければthroughという方針
  • 左のPanelの作成:

    • 患者ID, 患者氏名・かな:検索可能にする
    • Case ID:これは表示するだけ(JLabelにして編集不可)
    • 記録日リスト:同一患者IDに対して記録日を呼び出し、JListにロードする。もしチェックされればopen_data(int data_num)を呼び出す。ちなみに最後はNEWにする。
    • 新規作成ボタン:new_data()の呼び出し
  • 上のパネルの作成:JToggleButtonで<< <> >>の設定etc
  • メニューバーの設定:Fileの書き出しなど
  • 設定ファイルの作成:データの保管場所などの設定ファイルの作成