2015年8月16日 星期日

新天鵝堡拼圖



四月底去德國時,在新天鵝堡買了2000片的拼圖,前幾個月進度緩慢,反而這幾個禮拜準備考試,念書累了拼一下,終於在今天完成!!

以前很少拼圖,那麼多片也是第一次(小時候看舅舅拼1500就拼很久了),在拼之前還特別google看別人怎麼拼。雖然不是老手,但拼完總是有些心得:

  • 找一塊空地/空桌規劃為拼圖區,要做好長期抗戰的準備。不能只預留拼圖的完成大小,因為零散的一塊塊拼圖會佔更多空間。
  • 找一塊夠大的紙板(例如攤平的紙箱)當作底,素色面朝上,拼到一半要拍照留念比較美觀。
  • 找一些小紙盒,或是有凹槽的保麗龍(買家電時在紙箱內的),分類用。
  • 拼圖分類:
    • 找邊:最重要的邊緣先分出來!!
    • 依顏色區分,例如最醒目的紅色,建築的米白、天藍、雪白、黑色
    • 左上的樹是失焦的部分,對應的是糊糊的拼圖片
    • 斑駁色,包括兩邊下方的藍黑斑駁色、右邊超多樹枝區、背景細密樹林、不是很純白的白色(遠方雪山、左下積雪等)
  • 剛開始先拼建築,也就是紅色和米色的部分
    • 有些屋頂的雪可能會被歸到雪白類
    • 被樹枝覆蓋,或是和背景相接處,在分類時可能也歸在不同的地方。倒也不用特地去找。
  • 接下來是失焦的樹,但模糊的拼圖片看起來都很像,拼不順利。拼到一半先換兩邊下方的陰暗樹林。
  • 右邊樹枝是最耗眼力的部分,有鑑於東湊西湊太費時(一堆樹枝、雪塊、葉子都差不多),於是出動Radiologist大絕,直接在原圖找絕對位置,然後放到紙板上大概的位置!當然還是有些小技巧
    • 對原圖時最重要的是方向要對,例如雪會在樹枝之上、陰影在樹枝之下、雪塊的上半是較完整的圓弧、根據背景的顏色可以猜在上方還是下方
    • 無法猜方向就只能四個方向都找,找的時候先盯著拼圖片,記住一些特徵,例如樹枝交叉的角度、雪塊的形狀、一塊特別形狀的陰影之類的。
    • 因為和原圖比還是有色差,有時候先在紙板上已定位好的拼圖片比較,猜測大致的位置
    • 原圖是相對比較小的,最好有個比例尺可以時時參考,例如已知拼好的某一雪塊的長度大概是拼圖片的大小,這樣對於手上這片的目標物大小比較有概念。
    • 拼到七、八成以上,就不一定要對原圖,常常在半成品上比對一下就能找到位置,通常是老婆的工作,我繼續比對原圖
  • 有了右邊樹枝的經驗,左邊的樹就容易多了,建築下方及左方的部分也是用類似的方法完成。
  • 背景的細密樹林、遠山、天空、左下雪地則由老婆完成!
  • 找時間再去雷諾瓦裱框
結論:相輔相成的兩個技巧就是「找原圖絕對座標法」以及「鄰近片拼湊法」,優缺點大致剛好相反:
  • 前者耗眼力,但一旦找到就可當作已拼上,一次找一片,不需要額外的空間放置散落的拼圖片。因為原圖和拼圖有色差、比例的問題,有時候找起來沒那麼容易。
  • 後者在拼圖片數目太多時嚴重影響效率,而且需要額外的空間,通常要再依色澤、明暗度 分成幾個subgroup。優點是不需要分辨上下左右,拼起來就是了。拼圖片的大小寬窄、特殊片(全凸、全凹、三凸、三凹)也提供線索。
另外也找到新天鵝堡的3D拼圖,發現小時候好像拼過,真是有緣!

2015年8月9日 星期日

Structure of AutoHotkey Script

開始上工打報告,除了看說明檔學AHK的語法、函數,有些程式撰寫的概念是在說明檔學不到的,身為業餘工程師(?)分享一些用血淚(?)堆出的心得~

單一檔案


  • 大概是老師輩比較常用的,攜帶方便,一個ahk檔和一個AutoHotkey.exe主檔就可以到處帶著走,不管電腦有沒有安裝AutoHotkey,或是電腦內AutoHotkey版本不一樣,只要把ahk檔拖曳到主檔就好了。
  • 老師輩的AHK大部分是以字母順序排序,而且hotstring以全部大寫設定
    • 優點:管理方便,搜尋快速(人眼搜尋就很快了)
    • 缺點:
      • 只有hotstring字母按順序,送出string沒什麼順序,明明是相似的內容(例如left、right)但彼此距離很遠。
      • 重複的string可能分給不同的hotstring而不自知。
  • CWY老師的script雖然是字母排列,但是兼顧系統分類,例如:
    • 「J」開頭通常是joint →  JGH 是glenohumeral joint
    • 「B」開頭是bone的某個部分 →  BFI 是femoral intertrochanteric region
    • 「Q」開頭指的是某個方位 →  QP 是posterior aspect。

多個檔案

  • 最近幾屆的學長姐開始區分不同用途的script,通常有一個打plain film,有一個打CT/MR,根據group可能再多一個打特殊檢查例如mammography。
  • 優缺點大致和單一檔案的情形相反:
    • 優點:
      • 各script所用的hotstring可以重複,同樣是「C0」,可以設定為Chest X-ray的normal report,也可以設定為Chest CT的normal template。
      • script內的hotstring較少,效能較好(影響不大),比較不會因為電腦lag出現使string延遲送出
    • 缺點:
      • 需要切換script,當然,通常打報告時會集中打同一種類的檢查,再打另一種類的檢查,並不如想像中要一直切換(除了值班時急診報告?)
      • 管理不易,有些通用hotstring要在每一個script都寫一次,例如 L 是left,R 是right,不論是哪一種報告的script都需要

樹狀結構

  • 學弟妹接觸AHK較多,開始會用樹狀結構,把某些hotstring寫在main.ahk,再各自有CT.ahk、CXR.ahk之類的,然後include main.ahk,大致也是我用的方法但底下會再細談
  • 優點和上一個類似,新增的優點是有main.ahk可以寫通用的hotstring
  • 缺點就是複雜,如果加上一堆hotkey、function、subroutine,因為AHK先天不嚴格的語言結構,有時候很難找到出錯的地方,debug不易。但如果每個script都是純粹的hotstring/string pairs,樹狀結構其實是最好的。

Some Tips

  • 我的script架構是樹狀,基本上就像其他程式語言的library一樣,分工合作!
  • 因為hotstring的數量不會太影響效能,所以原則上是能縮寫就縮寫,從word、phrase、sentence到paragraph,只要用縮寫就是會比較快!(當然,要記憶的hotstring較多)
  • 基於歷史因素,因為resident時打最多的是急診CT,main.ahk就包括general term以及CT/MR會用到的片語/句子/範本
    • 在script中以用途/部位分類:
      • history/title:哪幾個部位的CT、有沒有打顯影劑,事實上這部位是以dynamic hotstring去送出字串。
      • 方位:上下左右內外深淺,及搭配「aspect of」
      • 一般字詞:thickening, wall thickening, fat stranding, stenosis, narrowing之類的都有設定hotstring
      • 輔助詞:把finding串接成句子/不完整句的一些輔助詞,例如there is, is suspected, is noted, suggestive of, probably, showing, causing, nature to be determined之類的
      • 各部位:brain, neck, chest, body, MSK, intervention
    • 在各個部分,剛開始以字母排序但後來就隨意了,反正有Hotstring Helper可以查詢,不需要用Ctrl + F找
    • 通常hotstring以「1」結尾代表名詞複數,例如::nd::nodule,則:*:nd1::nodules,加星號表示不用ending character。但在形容詞/動詞則是詞性變化,例如::enl::enlarged, :*:enl1::enlargement;::sig::significant, :*:sig1::significantly。
    • 用數字也可以代表程度,例如brain atrophy、leukoaraiosis的罐頭敘述
    • 基本上hotstring以2個或3個字母為主,因為排列組合後其實很夠用,最最最常用的才是1個字母,不常用的或是template可用到4個字母。為了避免重複,以子音決定所用的hotstring。
    • 其他一些dynamic hotstring也會在main.ahk設定,為了避免dynamic hotstring和一般的hotstring相衝突,dynamic hotstring常以特殊字元結尾當作trigger(例如 =, /)
  • Plain film的ahk以CXR, KUB, MSK plain film為主,然後在最後一行include main.ahk
    • main.ahk裡的auto-execute section無法被執行(函數的定義還會在),所以需要用到的dynamic hotstring需要在plain film重新寫入。
    • 如果有重複的function、subroutine名稱會出錯,考慮加上namespace的概念,例如main_func和plain_func以區分。
    • hotstring是先搶先贏制,所以plain film中的hotstring會優先於最後一行include進來的main.ahk。例如::ll::left lung,則main.ahk的::ll::on the left side就沒作用
    • Hotkey無法重複定義,但如果用dynamic hotkey則可以啟動、停止、覆蓋舊的hotkey
    • 在確認報告(F3)時,會check報告內容(plain film報告不分段)再送出
      • 句首字母大寫
      • 兩個以上的點「..」變成一個點「.」:打報告時以「.」來觸發hotstring(雖然沒有證據證明,但我覺得按空白鍵觸發比較容易在string還沒全部送出前就穿插在句子中間)
      • 「.,」變成「,」:需要補充句子(例如要加上more on the right side.)則以「,」觸發hotstring
      • 如果有三個字母/數字就接著句點,表示hotstring打錯或是沒觸發,出現提醒。
    • 打plain film時,active的視窗是PACS還是可以按F3送出報告。
    • 因為plain film有時候會爆量打不完,所以hotstring要盡量用1-2個字母,就像嘸蝦米輸入法一樣,一碼/兩碼都有對應的字(雖然很多要死背)。
  • 另外還有mammography的ahk
  • 一旦發現有字詞沒有hotstring一定要馬上新增,不能偷懶!
  • 少用到的字母如Z, X, Y, Q等都可以用來當hotstring,例如前面提到的Q當作某個aspect(記法:Quadrant)、Z當作和某個檢查/臨床correlation(記法:coRRelation)的敘述