顯示具有 資訊 標籤的文章。 顯示所有文章
顯示具有 資訊 標籤的文章。 顯示所有文章

2013年11月23日 星期六

以醫學資訊學方法監控洗手頻率與院內感染

    因為在思考學校教的統計 regression 方法,想說拿醫院的甚麼資料來分析呢?
    又剛好想到醫院感染控制可以做甚麼?洗手嗎?跟院內感染管制最相關的事,不就是洗手了嗎? 是的!

    好了,所以要如何把洗手數據化呢?這就是醫學資訊學說的 data, 要如何取得這個 data 呢?叫人來算嗎?哈哈,怎麼可能,怎會有人好好的幫你做這件事情呢?當然要使用自動化的方法囉,在所有的洗手設備上裝置 counter 計數器!一旦這件事情完成,就可以進一步做數據分析了!
    Counter 可以分成兩種設計:
  1. 腳踏開關的洗手設備,這種應該最簡單了,踏一下,就加一次 counter。
  2. 乾洗手(瓶裝),要設計 counter 嗎?比較複雜;簡單點,用每天減少的體積,或秤重減少量,也是一個數據化。

    分析資料欄位看起來可以像是:
乾洗手減少量 | 腳踏洗手啟動次數 | 病房病人數 | 細菌培養陽性人數 | 護理人員數 | 醫師人數 | 執行床旁處置次數* | ... | 是否發生院內感染

* 執行床旁處置包含哪些?(e.g. 打點滴、輸血、打針...) 是否可以從護理資訊系統取得呢?
**可能需要各病房一起執行!

    可以預期的,洗手次數與院內感染是有相關的,然後,如果可以分析出來,哪裡會是閾值 (threshould),就可以做為往後監控院內感染的指標了!

2013年9月23日 星期一

關於 PDFCreator (v1.7.1) 列印空白頁之解決辦法

PDFCreator 用了好一段時間,算是能找到免費產品中好用的轉換 PDF 程式!不過好像在 2012 升到 1.5 版本以後出現列印空白頁的狀況(如底下的連結)
http://forums.pdfforge.org/discussion/9848/blank-pages-windows-7-64bit#Item_21

很多人提出疑問,希望能解決這個問題(其實,我也去問問題了!),我發現好像提問的人都是使用中文!我也發現如果使用 firefox 列印中文 title 的網頁,會印出空白頁,IE卻不會;另外還check 了 PDFCreator 的 log 檔,發現這列列印空白頁的紀錄中,都少了一行暫存檔 "....xxxx.ps" 的情形。
    所以我推測,也許是中文編碼讓程式不知道在哪裡跳脫了,而沒能去執行列印這個重要的 postscritp "xxxx.ps"檔案!
    我想解決這個問題,但是我又不可能去看 source code (程度不足啦!),找找看變通的辦法吧!竟然真的找到了!!

    PDFCreator 其實還有一些神奇的功能,用 vbs 寫的,存在目錄 "C:\Program Files\PDFCreator\Scripts\ " 底下,而解決這個問題的答案就是使用其中一項功能 "AddBookmarks.vbs"。不用擔心,完全不必去看程式幹嘛的,只要選用 PDFCreator 的功能即可。原因應該是啟動這個功能後,可以避免程式刪掉那個重要的 "xxxx.ps"檔案!

    以下藍色的字體即為解決方法 step by step:

  • 開啟 PDFCreator 程式(如下畫面)

  • 點選功能選單 "印表機" -> "選項 (Ctrl+O)",出現如下畫面
  •  
  • 點選螢光筆圈起來的部分 "動作" -> "儲存前動作" -> 勾選checkbox "儲存前動作" -> 在 "程式/指令碼" 下拉選單中,選取 "AddBookmarks.vbs" -> 按右下角 "儲存(S)" 按鈕。
  • 完成! 打開 word 來印一份文件試試看囉!

**後記:因為在別人的網頁上看到解決這個問題要置換一個 PDFCreator.exe 的檔案....然後有人回覆置換後不能使用....。我覺得這個太可怕了,一方面不知道這程式哪來的(也許是高手修正了問題! :-P),一方面可能造成系統不穩定吧!所以才決定擠出自己一點時間,把這個小技巧跟大家分享 :-P,希望能幫得上忙!

2012年7月19日 星期四

PDF password

先參考這篇文章:HowTo: Linux Remove a PDF File Password Using Command Line Options
http://www.cyberciti.biz/faq/removing-password-from-pdf-on-linux/comment-page-1/#comment-70471


I made some test.

  1.  If the encrypted pdf file set an "file open" password, and you don't know the password. Then neither pdftk, qpdf nor gs can decrypt the pdf.
  2.  If you know either owner or user password, you can decrypt the pdf with qpdf. Though there may have som error message. The idea is that you can open and show the content first.
  3. ghostscript method is great! and I use it on win32, find gs for win32 on http://sourceforge.net/projects/ghostscript/  (gs905w32.exe 2012-7-19), download and install
  4. set path for gs, (computer-> mouse right click-> content-> advanced system setup-> environment-> user variable-> add or edit-> add path "C:\Program Files\gs\gs9.05\bin"

want a batch convert on win32? try this

  1. copy all encrypted pdf files into a working directory, and create a sub directory named conv
  2. in cmd mode, in this directory type(in quote"): "dir *.pdf /b >conv.txt"
  3. create a batch file :conv.bat content as 
    • FOR /F "eol=; usebackq delims==" %%i in (conv.txt) do gswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=conv/%%i -c .setpdfwrite -f %%i
  4. in cmd mode, in this dir type: "conv"
  5. done! all decrypted files will be sent to sub dir "conv"

2010年11月4日 星期四

檢體追蹤系統上線測試

兩年前的醫檢年會看到長庚開發的檢體追蹤系統海報,很想在自己醫院也能執行這樣的系統,經過斷斷續續溝通與資訊室的設計,還有護理車的購入,好像是突然間在11月開始進行了測試,這星期真是荒廢了手上的所有其他業務,每天跟資訊室的人打數十通的電話,都快被我煩死了吧!

2010年6月13日 星期日

文件掃描系統備份

備份在不同的電腦(掃描備份.bat)

@echo off
rem // copy to local (different directory)
cd d:\
xcopy d:\檢驗科\*.* c:\檢驗科scan備份\ /s /y

rem // copy to web directory (before transform)
NET USE o: \\192.168.xx.xx\d$\檢驗科 /user:lis2k
xcopy d:\檢驗科\*.* O:\ /y /s
NET USE O: /delete

rem // rename d:\檢驗科 加上日期
rem cd d:\
rename 檢驗科 檢驗科%Date:~4,4%%date:~9,2%%date:~12,2%

  • 備份檔案轉入網頁資料庫
(1) filetransfer.bat
cd c:\appserv\php5
php -f filetransfer.php >> filetransfer.log

(2) filetransfer.php
//include mdb2
require_once("config.inc.php");
$scanDir="d:/檢驗科";
//check $dest_dir_name in function getDirectory

getDirectory( $scanDir );
for ($i=1;$i<=5;$i++){
//每次刪減一個level的目錄
delEmptyDirectory( $scanDir );
}
echo "Files Transfered";

//test empty directory
function is_empty_dir($dir)
{
if (($files = @scandir($dir)) && count($files) <= 2) {
return true;
}
return false;
}

//delete empty directory
function delEmptyDirectory($path){
$ignore = array( 'cgi-bin', '.', '..' );
$dh = @opendir( $path );
while( false !== ( $file = readdir( $dh ) ) ){
if( !in_array( $file, $ignore ) ){
if( is_dir( "$path/$file" ) ){
if (($files = @scandir("$path/$file")) && count($files) <= 2) {
rmdir("$path/$file");
}else{
delEmptyDirectory( "$path/$file", ($level+1) );
} //if 空目錄刪除, else 往下scan
} //if is_dir
} //if !in_array
} // while( false !== ( $file = readdir( $dh ) ) )
closedir( $dh );
} //function delEmptyDirectory

//test recursive directory list
function getDirectory( $path = '.', $level = 0 ){
global $mdb2;
$today=date("Ymd");
echo "$today files transfer start....\n";
//if backup to different dir, change the path below
$dest_dir_name="i:/backup/$today/";
//backup destination directory with date 2010(Y)04(m)22(d) sub-directory
if (!is_dir($dest_dir_name)){
mkdir($dest_dir_name);
echo "create dir $dest_dir_name \n";
//如果沒有這個目錄,mkdir
}
$ignore = array( 'cgi-bin', '.', '..' );
// Directories to ignore when listing output. Many hosts
// will deny PHP access to the cgi-bin.

$dh = @opendir( $path );
// Open the directory to the handle $dh

while( false !== ( $file = readdir( $dh ) ) ){
// Loop through the directory

if( !in_array( $file, $ignore ) ){
// Check that this file is not to be ignored

// $spaces = str_repeat( ' ', ( $level * 4 ) );
// Just to add spacing to the list, to better
// show the directory tree.

if( is_dir( "$path/$file" ) ){
// Its a directory, so we need to keep reading down...

// echo $i++."$spaces $path/$file
";
// unmark to echo directory name
getDirectory( "$path/$file", ($level+1) );
echo "go subDir $path/$file \n";
// Re-call this same function but on a new directory.
// this is what makes function recursive.

} else {
$full_path="$path/$file";
// echo $i++."$spaces $path/$file
";
$path_parts = pathinfo($full_path);
$file_mod_time=date ("YmdHis", filemtime($full_path));
$source_dir_name= $path_parts['dirname'];//directory
$source_file_name= $path_parts['basename'];//filename with ext
$dest_file_name= md5_file($full_path);//filename change to md5
$file_ext=$path_parts['extension'];//file ext
$source_file_name_no_ext= $path_parts['filename']; // since PHP 5.2.0, filename without ext
rename($full_path,"$dest_dir_name/$dest_file_name.$file_ext");
// exec_sql("insert into file_search(source_dir_name,source_file_name,dest_dir_name,dest_file_name,file_ext) values('$source_dir_name','$source_file_name','$dest_dir_name','$dest_file_name','$file_ext')");
exec_sql("insert into file_search(source_file_name,dest_dir_name,dest_file_name,file_ext,file_mod_time) values('$full_path','$today/','$dest_file_name','$file_ext','$file_mod_time')");
// echo "$path/$file".md5_file("$path/$file")."
";
// Just print out the filename
} //if is_dir
} //if !in_array
} // while( false !== ( $file = readdir( $dh ) ) )
closedir( $dh );
// Close the directory handle
} //function getDirectory

?>

2010年6月2日 星期三

a loggable laboratory bullitin information pratice

a loggable laboratory bullitin information pratice.
您的實驗室都如何進行人員公告、SOP修訂閱讀紀錄?
使用E-MAIL?使用紙本一個人一個人蓋章?
您如何知道E-MAIL已經有效通知,人員於何時讀取?三班輪替的人員蓋完章要花多少時間?
同仁跟你反映過:什麼時候公告的?我不知道!?

我想讓這流程有效率一點,設計了公告紀錄網頁,與檢驗報告查詢系統連結。

程式碼還沒想好放在哪,有興趣可以直接找我拿。

系統需求:APACHE OR IIS 網頁伺服器, MYSQL, PHP+PEAR(auth, mdb2)

**program lists(in subDIR \msg)
  1. ../login.php
  2. styles.css
  3. config.inc.php
  4. header.php
  5. index.php
  6. msg_add.php
  7. msg_edit.php
  8. msg_read_log.php
  9. msg_read_log_user.php
  10. msg_show.php
  11. sample_posteddata.php
**Database schema
table
  1. MSG_cont(
    CREATE TABLE msg_cont (
    m_id int(11) NOT NULL auto_increment,
    m_date varchar(14) default NULL,
    m_title1 varchar(128) NOT NULL default '',
    m_title2 varchar(128) default NULL,
    m_content text NOT NULL,
    to_show char(1) NOT NULL default '1',
    post_oper varchar(5) NOT NULL default '',
    read_count int(11) default '1',
    PRIMARY KEY (m_id),
    FULLTEXT KEY m_content(m_content),
    KEY post_oper(post_oper)
    ) TYPE=MyISAM COMMENT='message 內容';
  2. msg_read_log(
    CREATE TABLE msg_read_log (
    m_id int(11) NOT NULL default '0',
    oper_id varchar(5) NOT NULL default '',
    post_date varchar(14) default NULL,
    read_date varchar(14) default '9',
    remark varchar(64) NOT NULL default '',
    PRIMARY KEY (m_id,oper_id),
    KEY m_id(m_id),
    KEY oper_id(oper_id)
    ) TYPE=MyISAM COMMENT='message read log';
  3. Msg_search(
    CREATE TABLE msg_search (
    m_id int(11) NOT NULL default '0',
    m_key varchar(128) NOT NULL default '',
    PRIMARY KEY (m_id,m_key),
    FULLTEXT KEY m_key(m_key)
    ) TYPE=MyISAM;
  4. Oper(
    CREATE TABLE oper (
    oper_id varchar(6) default NULL,
    oper_name varchar(10) default NULL,
    pswd_desc varchar(15) default NULL,
    EXPER_TYPE varchar(10) default NULL,
    e_mail varchar(60) default NULL,
    auth_right varchar(10) NOT NULL default 'user',
    UNIQUE KEY oper_id(oper_id)
    ) TYPE=MyISAM;
  5. msg_cont_backup(
    CREATE TABLE msg_cont_backup (
    m_id int(11) NOT NULL auto_increment,
    m_date varchar(14) default NULL,
    m_title1 varchar(128) NOT NULL default '',
    m_title2 varchar(128) default NULL,
    m_content text NOT NULL,
    to_show char(1) NOT NULL default '0',
    post_oper varchar(5) NOT NULL default '',
    read_count int(11) default '1',
    PRIMARY KEY (m_id),
    FULLTEXT KEY m_content(m_content),
    KEY post_oper(post_oper)
    ) TYPE=MyISAM COMMENT='message 內容';
  6. msg_read_log_backup(
    CREATE TABLE msg_read_log_backup (
    m_id int(11) NOT NULL default '0',
    oper_id varchar(5) NOT NULL default '',
    post_date varchar(14) default NULL,
    read_date varchar(14) default NULL,
    remark varchar(64) NOT NULL default '',
    KEY m_id(m_id)
    ) TYPE=MyISAM COMMENT='message read log';
**Solved problems(邊做邊學,東西還真不少) :java tab, confirm box, php session, (expire time, content,) mdb2, page, ajax-like search menu, ckeditor, ckeditor-html-mysql transform, css cross menu ...

**USER FRIENDLY INTERFACE
  • CKEditor :可將word格式直接貼上,增加可讀性
  • CKFinder:檔案上傳(未完成,中文檔名有問題)
**Target:
  • message 管理,選擇人員公佈
    • message 可包括各組公告、SOP修改公告、
    • message 可搜尋
  • 人員登錄
  • 依照登錄與 讀取公告,紀錄讀取公告時間
  • 追蹤未讀取的名單
  • 顯示各公告的讀取情況
**注意事項:必須放在人員每天會操作的系統,我選擇報告查詢網頁,必須有限時登出的功能(增加UPDATE頻率),簡單,容易操作,一目瞭然,重要詞句可以HIGHLIGHT,要好用才會有人用是我的設計哲學。

2010年4月25日 星期日

文件掃描系統

理想:備份的文件全部掃入電腦存檔,不再使用紙本儲存。
設備:kodak i1220 scanner
軟體:kodak capture pro
TODO:備份文件可網頁搜尋(almost complete)
說明:
  1. 計畫目標:將每天產生數千張的檢驗單轉成電子化保存,解決無處可放的困境及滿足單據保存三年還有便於尋找。
  2. 設備及軟體如上述。scanner每分鐘可掃30頁(雙面60頁),軟體可將檢驗單上的條碼(檢驗單號或者檢體試管編號)做辨識及轉換成檔案名稱,可以選擇圖檔(TIFF)或PDF,方便尋找。軟體還可以選擇掃描條件如紙張厚度,單/雙面,去除空白頁,彩色/黑白,條碼辨識區塊,輸出檔案名稱架構(如組別/日期/流水號),最多可同時輸出兩種檔案格式。
  3. 實做:已經施行兩個月,started from 2010/4/1。
  4. 容量:約2000張/天,需3G硬碟空間/月。PDF 與 TIFF格式大小相差不大。
  5. 備份:因為事關資料重要性,計畫備份兩份在不同的電腦。
  6. 困境:有黏貼的單張較麻煩。要花人力去掃描。
  7. 進階:備份同時,將檔名寫入資料庫,可用網頁查詢聯結。不需幾秒就找到原始單據了,突然有一種"爽"的感覺。
  8. 注意事項:不能有訂書針,一開始我覺得最麻煩的事情,大家一起努力解決了(買了好幾個除針文具),科內能不用的幾乎都不用了。
  9. 其他應用:A.占空間的紀錄單張。不過需要另外解決 OCR (光學辨識文字系統)的問題,通常這些單張,不會有條碼,沒設定好檔案名稱,將來也是找不到資料呀!B.實習生的學習紀錄,實習生辛苦的幾個月,現在都有本"portofolio",實習完後只剩下影本。如果評鑑時展示電子檔的學習歷程,夠cool吧!

2009年12月25日 星期五

條碼兩、三事

實驗室用的條碼這麼多,您了解多少?就我使用的經驗簡單說明
  1. 25碼
    1. 純數字,要雙位數
    2. 可讀性高
    3. 使用10年的時間,儀器讀取效果很好,10位數字的列印長度約3~3.5cm
    4. 列印粗細比1:3, 空白間距 2
  2. 39碼
    1. 數字、英文皆可
    2. 列印字串前後要加 "*" 的符號,e.g. *A12345*
    3. 如果列印比例較小,儀器可讀性較差
    4. 我最不喜歡用的格式,有幾台機器讀不到;可是也有方便的地方,它有字形檔,可以直接輸出印表機
  3. 128碼
    1. 又分好幾種,數字、英文皆可
    2. 即將在2010轉用的格式,因為條碼增加了英文,可讀性比39碼高,但列印長度比25碼長。害的我還是得更改條碼紙的長度。
  4. 設定
    1. 呼叫 dos 模式 batch 檔,需附帶設定 ini 檔及要列印的文字txt檔,e.g. wingin set.ini barcode.txt
    2. 粗細比列 e.g. 1:3, 2:5
    3. 空白間距

2009年10月7日 星期三

rescue data

醫院發報告系統做的 Log 檔,幫了大忙!

同事要查詢最近新開的 H1N1 報表,我貪圖方便,給同事最簡易版的查詢介面,直接 select 資料 from Table,也經過一個月都沒事,沒想到意外還是發生了,同事選完資料,沒有匯出,直接就按了 DEL!

資料能救回來,該感謝10年前建構系統的人,在發出報告時,會同時紀錄另一筆Log,把Log資料撈回來,再補幾個欄位。真是不幸中的大幸。

fax to web

公司有一條Fax 專線,除了用傳真機傳出外,我幫它接了數據機,當作收入傳真的工具,經過數據機,會將傳入的傳真變成圖檔(.tif)儲存。
剛開始都幫大家傳圖檔,後來資料越來越多,乾脆做底下的方案,讓使用者直接從網頁拿自己的傳真,就沒有我的事囉。

需求:
  1. 電腦一台,公司使用win2000介面
  2. 數據機,在ADSL出來之前的上網工具
  3. 網頁伺服器 (IIS or apache) + support php
作業:
  1. 先要設定好電腦與數據機的連線,要開啟一個服務(service): telephony
  2. 設定好傳真檔案儲存的目錄
  3. 將上面的目錄設定為網頁的一個目錄
  4. 將底下的php 程式在同一個目錄,存成 index.php
  5. 程式碼在這裡一直無法正常顯示(與html衝突),把它作成google notes,連結如下
  6. http://www.google.com/notebook/public/01591039688914798723/BDQ55DQoQwL_X1cck?hl=zh-TW

2009年8月9日 星期日

連線程式練習

連線程式小試,同事一直反應,人工分類完,再以手工 key in 電腦常常出錯,造成修改報告頻繁,只好自己找資料,買了RS-232 測試的工具玩一玩,找到底下這篇論文參考,真的可以用喔!
使用儀器:白血球分類計數儀 comdek MD-200

感謝 洪敬瑞 成功大學研究所論文的參考
論文種類 碩士論文
口試日期 2004-07-22
論文名稱(中) 建立臨床檢驗室數位醫療資訊系統
論文名稱(英) Impiementation of Clinical Laboratory Information System
做了部份修改,有些小問題,製作時才會遇到。
  1. timer 要設定 Interval timer1(500ms), timer2(1ms), timer3(1ms)
  2. item() 要設定群組,才能給順序呼叫
  3. 檢體編號說有12位數,可是怎麼測都只有8位數,又亂跳位置!難!

'==============程式碼================
Dim InByte() As Byte
Dim buf(0 To 11) As String
Public counter%, reg$
Private CN As ADODB.Connection
Private RS As ADODB.Recordset

Private Sub Command1_Click()
'SEND BUTTON
Dim SQL_STR As String
Dim I%
'===CHECK 基本資料是否齊全
If Len(Text1.Text) <> 10 Or IsNull(Text1.Text) Or item(12) = 0 Then
MsgBox "試管號碼錯誤 或是" & Chr(13) & "總和值有問題" & Chr(13) _
& "無法繼續?", vbCritical, "注意!!"
Call RESET_FORM
Exit Sub
End If

'===依序將不是0的ITEM資料填入 EXPER_SIGN
For I = 0 To 11
' If item(I) > 0 Then
SQL_STR = "UPDATE EXPER_SIGN SET " _
& "EXPER_DATA2='" & item(I) & "' " _
& "WHERE TUBE_NUMBER='" & Text1.Text & "' " _
& "AND EXPER_CODE='" & Label1(I) & "' " _
& "AND TYPE_FLAG<>'Y';" '注意已經確認的報告不要再 UPDATE!!
CN.Execute SQL_STR, 1
'MsgBox SQL_STR
'===ADD"人工閱片確認"
If Label1(I) = "NEUT" Then
SQL_STR = "UPDATE EXPER_SIGN SET " _
& "DATA_REMARK='人工閱片確認' " _
& "WHERE TUBE_NUMBER='" & Text1.Text & "' " _
& "AND EXPER_CODE='" & Label1(I) & "' " _
& "AND TYPE_FLAG<>'Y';" '注意已經確認的報告不要再 UPDATE!!
CN.Execute SQL_STR
End If
'===INSERT LOG
SQL_STR = "INSERT INTO EXPER_LOG " _
& "SELECT LAB_NO,GROUP_CODE,SOUR_FLAG,EXPER_CLASS," _
& "EXPER_TYPE,EXPER_CODE,EXPER_NO,TUBE_NUMBER,KEY_FLAG,TYPE_FLAG, " _
& "'" & Trim(Format(Date, "YYYYMMDD") - 19110000) & "','" & Format(Time, "HHNN") & "','CBC'," _
& "CHR_NO,ID_NO,EXPER_DATE,EXPER_TIME," _
& "FEE_NO,TAKE_DATE,TAKE_TIME,SIGN_DATE,SIGN_TIME,MACHINE_CODE,MACHINE_SEQ," _
& "COMP_DATE,COMP_TIME,EXPER_DATA,EXPER_DATA2,EXPER_DATA3,EXPER_DATA4,EXPER_DATA5," _
& "DATA_REMARK,LOCAL_NO,REPORT_NO,REPORT_DATE,REPORT_TIME,REPORT_OPER,EXPER_DOC " _
& "FROM EXPER_SIGN " _
& "WHERE TUBE_NUMBER='" & Text1.Text & "' " _
& "AND EXPER_CODE='" & Label1(I) & "';"
CN.Execute SQL_STR
' End If
Next I

'===RESET FORM
Call RESET_FORM

End Sub

Private Sub form_load()
MSComm1.CommPort = 1
MSComm1.Settings = "1200,N,8,1"
MSComm1.PortOpen = True
counter = 0

'===DATA CONNECT
Set CN = New ADODB.Connection
CN.ConnectionString = "Provider=MSDASQL.1;Password=xxx;Persist Security Info=True;User ID=exp;Data Source=wfh2"
CN.Open

End Sub

Private Sub Form_Unload(Cancel As Integer)
RS.Close
RS.ActiveConnection = Nothing

End Sub

Private Sub Text1_Change()
If Len(Text1.Text) = 10 Then
Call DATA_GRID(Text1.Text)
Command1.SetFocus
Else
Exit Sub
End If
End Sub



Private Sub Timer1_timer()
If MSComm1.DSRHolding Then
MSComm1.RTSEnable = False
Else
Timer2.Enabled = True
Timer1.Enabled = False
'Text1.Text = "TIMER1"
End If
End Sub

Private Sub Timer2_timer()
MSComm1.RTSEnable = True
Timer3.Enabled = True
Timer2.Enabled = False
'Text1.Text = "TIMER2"
End Sub

Private Sub Timer3_timer()
On Error Resume Next
'Text1.Text = "timer3"
Dim I%, j%
Dim reg1$, reg_ID$, tube_number$
Dim sum_all As Currency

Timer2.Enabled = False
InByte = MSComm1.Input

For I = LBound(InByte) To UBound(InByte)
reg = reg + Hex(InByte(I))
Next I
'Text2.Text = reg
counter = counter + 1
If counter = 75 Then
Timer1.Enabled = True
Timer3.Enabled = False
MSComm1.RTSEnable = False
counter = 0
'print out reg contents
'Text2.Text = Text2.Text & Chr(13) & "counter>75: " & reg
'此型號要取最後121個字元
reg = Right(reg, 141)
reg_ID = Left(reg, 20)
tube_number = Right(Format(Date, "yymmdd"), 5) + "0" + Mid(reg_ID, 13, 1) _
+ Mid(reg_ID, 20, 1) + Mid(reg_ID, 17, 1) + Mid(reg_ID, 18, 1)
Text2.Text = tube_number
Text2.Text = reg + "x" + Mid(reg_ID, 5, 1) + Mid(reg_ID, 2, 1) + Mid(reg_ID, 3, 1) _
+ Mid(reg_ID, 10, 1) + Mid(reg_ID, 8, 1) + Mid(reg_ID, 9, 1) _
+ Mid(reg_ID, 15, 1) + Mid(reg_ID, 12, 1) + Mid(reg_ID, 13, 1) _
+ Mid(reg_ID, 20, 1) + Mid(reg_ID, 17, 1) + Mid(reg_ID, 18, 1)

reg = Right(reg, 121)
'trim extra "0"
For I = 2 To 120 Step 2
'reg1 = reg1 & Format(Val(Mid(reg, I, 2)))
reg1 = reg1 & Mid(reg, I, 1)
Next I

buf(0) = Mid(reg1, 1, 5)
For j = 1 To 11
buf(j) = Mid(reg1, (j * 5 + 1), 5)
Next j

For j = 0 To 11
' Text1.Text = Text1.Text + buf(j) + Chr(13)
item(j).Text = Int(Val(Left(buf(j), 3) + "." + Right(buf(j), 2)) * 10 + 0.5) / 10
sum_all = sum_all + item(j)
Next j
End If
item(12).Text = sum_all
End Sub
Private Sub DATA_GRID(tube_number As String)
Dim SQL_STR As String

Set RS = New ADODB.Recordset
RS.CursorLocation = adUseClient
SQL_STR = "SELECT TUBE_NUMBER,CHR_NO,GROUP_CODE,EXPER_CODE,EXPER_DATA2 " _
& "FROM EXPER_SIGN " _
& "WHERE TUBE_NUMBER ='" & tube_number & "' " _
& "AND TYPE_FLAG<>'Y';"
RS.Open SQL_STR, CN, adOpenKeyset, adLockOptimistic
RS.MoveLast
'MsgBox RS.RecordCount
Text2.Text = Text2.Text & "RecordCount=" & RS.RecordCount

If RS.RecordCount = 0 Then
MsgBox "找不到試管號碼??", vbCritical, "注意!"
End If
Set DataGrid1.DataSource = RS

End Sub
Private Sub RESET_FORM()
Dim I%

'===RESET FORM
Text1.Text = ""
For I = 0 To 12
item(I).Text = 0
Next I
Set DataGrid1.DataSource = Nothing
Text1.SetFocus

End Sub

2009年3月22日 星期日

I want to kill the lab WIKI site

wiki Lab 網站已經被我殺死了,因為老闆說:下星期二之前各組把資料"給我"貼上去。

需要用到"給我"嗎?

極端的管理實在很難拿捏,沒有督促資料不會放上去,督促太嚴格又造成使用者的困擾。最終還是回到了原點。有沒有更好的方法呢?

2008年12月8日 星期一

輸血醫學會年會有感

97年輸血學會年會的主題為:資訊科技在血庫的應用
討論一些資訊功能,好像很先進,課程中有人發問提到有關Donor抗原性的資訊整合,好像進入一塊"無人管"(參考 關於管理這件事)之境,捐血中心擁有最大的資訊中心,也沒表示可以試試看。那研討會的資訊科技到底用到哪兒去了!
我一直想做一件事,是目前工作位置上的夢想:整合全台灣受血者抗體的資料庫,以技術上來說並不困難,困難點在於取得與整理資料。
技術上需要哪些?
  • 使用者帳號,
  • 各醫院好用的查詢介面,
  • 資料加密(最重要),
  • 可以上傳新案例的抗體資料,就這樣,不難!
困難點:
  • 可能要先跟衛生署/健保局報備,必須收集病人資料;
  • 請各醫院(或先從願意加入計劃的大型醫院)提供有抗體的病人資料(困難呀);
  • 資料整合(困難呀!每個醫院格式都不同,整理完大概也去了半條命)
有什麼好處?
  • 一些奇怪抗體的病人,如果在別的醫院出現,可以省去部分篩檢的工作,病人用血的安全性可以提升,像台大提供的病人抗體卡,就可以完全被此功能取代,直接幫病人服務,病人老是說不準自己有什麼抗體。
  • 可以統計全台的抗體呈現情形,將以往各醫院自行統計的資料加大族群,
  • 可以統計大家的需求量,因為以前沒有這種服務,藉由查詢量來評量這種服務的需求
最後:ㄏㄡˋ,又要罵老闆了!老闆說這種需要別的單位配合的事情,先不考慮。
好想尋找別的出路,在這做一點成就感都沒有!

2008年9月2日 星期二

節省文件空間的辦法

A scanner, a PDF 製作 and a creative ideal...
看著文件區資料越來越多,CBC/生化 每個月的品管資料一疊又一疊,倉庫的空間也越來越少,有沒有一個解決方案呢?
當然有這樣的ideal囉,不過得花點錢,也就是用錢來換空間。
方法是這樣的:現在掃描器製造都有設計ADF(自動餵紙),只要把這些QC資料整疊拿來掃描成檔案,再設計一個簡單的文件管理資料庫,還有想好備份的事情,就搞定囉!
我很想把文件區的減肥前跟減肥後的照片拿來當成果,再拿去年會報告。可惜老闆不支持,就算了吧!
如果有人看了這方法,減肥成功,可以讓我羨慕一下嗎!

2008年7月23日 星期三

wiki 之於檢驗科

2005年醫檢學會年會報告了一篇[WIKI應用於檢驗標準作業程序之管理],那時覺得wiki的概念可以拿來檢驗科運用,當時也在科裡設了wikipedia 的版本的網站,也在科裡面上過課,告訴大家它的好處,自己則在上面放了些安全教育相關的東西,還有一些零星的會議記錄,文件資料。可是沒很多時間整理,大家也多一事不如少一事,當初設立的理想就晾在那裡。
直到老闆發現後,竟然實踐了 這個ideal。
我與老闆的差別在哪兒呢?--落實維護,及命令權。
落實後的新問題:幫大家備份資料,萬一當機了,怎對得起大家心血維護的東西呢!
真是自找的。
*二老闆現在要去新的醫院,他也想搞一套這東西,理想與實踐中間的門檻要由誰來跨呢?

2008年6月19日 星期四

資訊室

細菌的代檢業務需要....的資訊系統
資訊室:因為....所以....所以先不做

我..<*$#%@&*..,如果我說"我來做好了",資訊室的臉不知道要擺哪裡!也許他們也不在乎。

可是如果我去做,我的業務誰來幫我呢?!只好繼續看細菌室痛苦,心理罵資訊室,什麼進度也沒有