2010年6月23日 星期三

RhD陰性病人輸注分離術血小板產生 anti-D

在6天內輸注3U 分離術血小板(RhD+),第7天時測得產生抗體(anti-D),應該是血袋中殘留的紅血球造成的 ,還好病人是男性,不會有生產的問題。

*6月16日PLT = 3 x1000/ul
**備血,Antibody screening:Negative
**輸注分離術血小板 6/16 x 1U, 6/18 x 1U

*6月19日 PLT= 12 x1000/ul
**備血,Antibody screening:Negative
**輸注分離術血小板 6/20 x 1U

*6月22日 PLT= 5 x1000/ul
**備血,Antibody screening:Positive, Ab ID result: anti-D

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年6月1日 星期二

更換 HEPA 注意事項

今天實驗室換 HEPA filter,聯絡人拿著相機狂拍。

過了一會兒,我路過在 BSC(Bio Safty Cabnet)旁,看到有個同事沒戴口罩還在團團轉做工,趕快請他戴上口罩(雖然不一定有用)。等我走遠了發現,奇怪,位於更遠位置的同事,以前都不戴口罩的,怎今天已經都武裝完備?那為什麼沒人告訴在"高危險區"的同事該戴口罩呢?同時,我發現"聯絡人"也已經戴上了口罩。

這群沒同事愛(幫他們想個台階,可能沒想到吧),沒安全觀念的人真該好好教教。如果沒戴口罩的人感染了什麼的,難道其他人躲得過麼?休息區在一起,每天也得見面講話的,以為實驗室有多大?

可能老闆會說:怎麼別人都知道要戴口罩,你不知道呢?
這是兩回事,就好像水庫洩洪時,有開警報警告民眾;跟直接放了水,再問民眾,你怎麼看到大水來了還不躲呢?

結論:更換 HEPA 注意事項,要先通知周邊相關人員,做好安全防護措施。更理想點,評估怎樣的防護設備才是有效的,並且提供相關設備。