- 天氣睛,但路線八九成有樹蔭
- 腳踏車至貓空纜車動物園站
- 纜車至指南宮站
- 步行於指南路三段157巷,過地藏王寶殿後右側有大成殿步道
- 步道階梯一路向下,接到指南路三段,岔路往右走茶展中心步道
- 步道旁可到指南溪稍微戲水
- 步道過長虹橋後階梯往上,往左至壺穴吊橋,原路回再往土地公廟、指南路三段40號停車場,見Benz S Class、BMW ActiveHybrid 7高級車
- 步行指南路三段40號至貓空站,路上在「雪敲ice Climber」吃冰
- 貓空站回動物園站
2020年6月21日 星期日
20200621 指南宮站 - 貓空站
2019年8月24日 星期六
MacBook Pro升級SSD
動機
- MacBook Pro (13-inch, retina, Late 2013),原SSD 256GB,希望自行換成更大容量
文獻
- 必看:最詳細的國外論壇資料
- 硬體/韌體:
- 某些年份的MacBook Air/Pro,SSD可更換,不像RAM是焊死的。但即使更換新的SSD,不一定支援最快的讀寫速度
- MacBook的SSD為特製規格,Transcend JetDrive系列(貴)可直接裝上;或是以市面上可買到的SSD加上轉接器(Sintech),較便宜
- 某些廠牌、型號的SSD確認與MacBook不相容
- 較大容量的SSD,耗電(idle/read/write)會些微增加
- 和SSD無關,特殊機型更換SSD後hibernate(休眠)後可能會偵測不到,有完美但複雜的解決方法(我沒試過),或者把hibernate關掉(待機稍微增加耗電)
- 新的SSD安裝Win 10會出現藍屏,但有解決方法(我沒試過)
- 軟體:
- 至少升級至MacOs 10.13 High Sierra,才能支援NVMe
準備
- 購買Sintech轉接器(等兩週以上才寄到...)
- 購買SSD,建議便宜的就好,很多都保固五年壞了就再換
- 購買工具,需要五星、六星螺絲起子各一,注意是MacBook需要的,和iPhone的大小不一樣
- 準備USB隨身碟製作開機碟,參考這篇教學。花比較多時間的是下載MacOS High Sierra Full Installer
- 備份目前的SSD,最標準做法當然是用Time Machine
過程
- MacBook關機
- 五星起子將背板螺絲×10卸下
- 網路上有建議disconnect battery,但需要大一點的六星起子,所以這步驟沒做
- 六星起子將SSD螺絲×1卸下
- 拔下舊SSD,插上新的
- 螺絲鎖回
- 插上開機USB,開機時按住option,進入MacOS Installer
- 開啟Disk Utility,將新裝上的SSD格式化(預設格式)
- 原本的Installer點繼續,安裝全新High Sierra到新的SSD
- 安裝好,重新開機,這時按住Command+R,進入Recovery Mode,選擇之前的備份來回復
- 特定機型建議關閉休眠,可參考論壇資料
- 測試讀寫速度,寫入速度有點弱
2018年12月11日 星期二
20181113-20 九州
路線地圖
11/13 (D1)
11/13 (D1)
- 出水市展望所看南遷的鶴群
- 仙巖園:遠眺桜島
- 吟松,花の温泉ホテル
- 飯店旁玩沙、泡溫泉
- 車子搭渡輪到桜島
- 桜島,湯之平展望所
- 鵜戶神宮
- 青島神社
- 晚餐:宮崎牛焼肉
- 高千穂峡,瀑布旁划船、淡水魚水族館
- 原尻の滝
- 九州自然動物園:自己開車、遊園車+餵食
- 御宿 一禅
- 金鱗湖
- 別府地獄:海地獄、鬼石坊主地獄、鬼山地獄、灶地獄、白池地獄、血の池地獄、龍卷地獄
- 阿蘇火山博物館
- 住熊本
- 熊本城
- 阿卡將
- 島栖outlet
- 小倉吃河豚
- 海響館
- 九年庵
- 御船山樂園
- 稲佐山夜景:停山腰停車場,走上坡路一公里...
- 稲佐山温泉ホテル
- 原爆資料館
- 豪斯登堡主題公園
- 住富崗
- 太宰府天満宮
- BIC CAMERA
2018年3月29日 星期四
北加州三日遊
Day 1
- 19:50的飛機,17:30出發,除了星期五晚上的塞車一切順利
- 到達SFO當地時間約16:00,我到 Stephon 住處暫留 + 晚餐,Wendy & Annie 去拜訪前輩
- 晚上參觀 Stephon 實驗室,然後接 Wendy & Annie,吃宵夜
- Stephon 的房東拒絕外人入住,臨時找附近的 hotel
- 到 Standford 吃早餐
- 開 Stephon 的車 + BART,到 Exploratorium 一遊,我一直跟 Annie 解說原理
- 回 Stanford 載 Wendy,趕路到 Livermore 的 outlet(50分鐘車程),剩一小時可逛
Day 3
- 早起搭 Uber 至 SFO,租車、接 Wendy & Stephon 雙方父母。本來覺得大家行李多要租 van,但發現 van 好大台!
- 到 Stephon 住處吃早餐、整理行李,開始往南行。午餐為 400° Burger at Carmel-by-the-sea。
- 再往南行,到 Big Sur State Park 幾乎沒有訊號,兩台車失聯,來回繞一陣子才找到目的地 Wind and Sea。
- 晚上又往回開半小時在 River Inn 吃晚餐。回來後倒頭大睡...
Day 4
- 接近中午時去接一位伴娘,幾乎是一樣的路線(只有一條路)開得更順了
- 工作人員(外燴、DJ、planner)陸續抵達準備食物、場地;賓客陸續抵達,與 Stephon 的台灣朋友們聊了一陣
- 下午證婚儀式,晚上精緻晚餐、賓客致詞、跳舞、繼續 social,體驗美式婚禮 party
- 大家搭 shuttle 回去,我和 Annie 開車趕回 SFO;晚上11點多到,1點多的飛機不急
- 到達台灣是隔天早上5點,洗個澡馬上上班
2017年7月16日 星期日
2017 北海道-東北 自助行
Day 1
- 中午抵達新千歲機場,午餐吃機場的白樺山莊拉麵
- 到一樓租車櫃台,檢查文件後再搭接駁車到Times租車新千歲站。BUT,我帶了國際駕照但日本要看的原始駕照+日文譯本,補救方法是拿駕照到札幌的 JAF (Japan Automobile Federation) 申請。
- 打算搭計程車去,比手劃腳加上 google map 總算能理解我們的目的地;車費有點多,接近一萬日元...
- 理論上申請後等取件是一小時至數天,還好 15 分鐘左右就現場取件了
- 走到附近的車站,坐接駁車回新千歲機場,完成程序
- 日本人的英文真的是難以溝通,在 Times 直接拿一堆印好各國語言的 A4 紙來對話或告知事情
- 日本人很仔細檢查車身,把既有的小刮痕註記起來並簽名
- 租 Mazda Axela 也就是台灣的馬三,比較意外是四門房車款;行李廂空間比想像中大,竟然能剛好塞下26吋、28吋行李並列
- 去年也在日本開過車,右駕沒什麼困擾,倒是左右手的功能互換要適應至少一天,暫時會變成打雨刷轉向的三寶,回台灣時也會再困擾一次
- 另外也申請 Hokkaido Expressway Pass 的 ETC 卡,不過釧路以東就沒有自動車道,都是一堆鄉間小路的國道及山路
- 導航系統有英文語音,目的地通常是輸入電話號碼,但有些地方其實沒有電話,資料上的電話是觀光局辦公室,要用 MAPCODE 或是 Google Map 自行導航
- 因為去申請譯本浪費好多時間,在自動車道飆了一下竟然被警車從後面追到,大概是看我外國人所以似乎是(比手劃腳)教育一番後放我一馬
- 自動車道速限大部分都是70或80,但大部分人都是開(儀表板上的)100左右;不然就是要會看測速照相的機器,長得像台灣高速公路的ETC
- 第一天沒景點,晚上住富良野民宿,走到附近吃拉麵
- 富田農場看花
- 富良野cheese工房
- 釧路濕原國立公園,溫根內木道:走步道,小圈約2公里
- 釧路市丹頂鶴自然公園:900公尺來回,籠內沒加蓋,通常是養一隻,然後會有一隻野生的飛來一起住
- 晚上住東橫INN,晚餐吃附近的爐邊燒,再去看傳說中的幣舞橋
Day 3
- 細岡展望台:遙望釧路濕原
- 往東行,在厚岸休息,順便吃個牡蠣
- 花咲灯台
- 納沙布岬:日本最東端,但日本認為附近的北方四島(俄佔)應該要歸還給他們!
- 到附近一家店挑一隻花咲蟹煮來吃
- 標津鮭魚科學館
- 野付半島:走步道,看到野生丹頂鶴
- 晚上住知床,晚餐吃附近的居酒屋「潮風」
- 知床五湖環湖(三小時)
- 可能遇到熊(前一天才剛目擊),看到熊的話會取消行程,原路退回
- 後來發現該擔心的不是熊是超多的蚊子...
- 遊完湖不久就下超大雨,剛好知床自然中心旁的フレペの滝(少女之淚瀑布)步道封鎖中,原因是可能有熊出沒
- 知床世界遺產中心,體驗超潮的擴增實境 iPad 導覽
- 雙美瀑布
- 本來要去摩周湖展望台,不過天氣太差完全看不到湖...
- 屈斜路湖,砂湯
- 阿寒湖遊覽船,看球藻
- 住阿寒湖旁的高級飯店
- 本來要去流氷科學館,到達時才發現沒開...
- 本來要搭層雲峽纜車,但天氣不好作罷...
- 到附近看流星、銀河瀑布
- 旭山動物園:工作人員都是年輕人
- 梅光軒拉麵
- 晚上住旭山 dormy inn
- 三浦綾子記念文学館
- 大雪山旭岳 ropeway
- 雖然平地天氣不好但山上能見度還不錯
- 步道走一圈約一小時,看夫妻池、姿見池
- 旭岳攻頂的話需要登山裝備
- 中富良野町營薰衣草園,以及旁邊去第二次的富田農場
- ふらのぶどう果汁工場:非常虛,買個冰淇淋就走了
- 晚上住札幌,晚餐吃附近的螃蟹吃到飽(えびかに合戦札幌本店),其實吃到第二輪就沒力了...
- 阿卡將 shopping ...
- 北海道神宮:偶遇葉信甫!
- 阿卡將 shopping 第二攤...
- 時計台、電視台、大通公園、舊本廳舍
- 晚上住洞爺湖畔
- 早上在湖邊走一下買早餐,象徵性地參考八景的一部分,例如月浦展望台
- 登別熊牧場:要搭纜車上去
- 可以買飼料餵熊,熊為了吃飼料,已學習站立、揮手、合掌等乞食動作,越討喜的越可能獲得觀光客餵食(由上往下丟飼料,熊用嘴接得很好)。看起來非常不自然,但人類自己的世界何嘗不是
- 另外還有賽鴨的場地,可以下賭注
- 登別地獄谷:大中午很熱還要觀賞地熱,只走最短的步道
- 大沼公園:很多島以及橋,風景不錯,也是只走一條最短的步道
- 民宿:下行李後,主人載我們去纜車站
- 函館山纜車
- 萬里無雲看夜景,機會難得於是付費請專業的照,成品可寄回台灣的地址
- 七、八點附近會很多團體超級多人,要排隊上去,在纜車內及觀景台都很擁擠,等到九點左右會比較適合
- 結束後走回民宿
- 到新函館站還車,搭新幹線到新青森
- 網路上查了一下,大行李通常放每節車箱最後一排後面的空間,沒有特別的行李放置處
- 弘前城
- 因為天守下方的石墩需要修復,把整個建築移到一旁,建築內有播放當時工程的縮時攝影
- 到處都是櫻花,花季來更美
- 因為東北車多不像北海道可以趕路,加上晚上住宿處需要六點前報到,因此放棄了行程「奧入瀨溪流館」
- 晚上住妙乃湯
- 華麗日式晚餐可選擇六點或六點半兩梯,但六點半這梯趕不上八點男女湯換池,雖然說後來去泡覺得還好,就是金湯、銀湯兩種
- 早餐也是兩個梯次,一次非常華麗道地,但納豆還是一樣從小就不敢吃 orz
Day 10
- 田澤湖,辰子像
- 淨土之濱,再次面向太平洋
- 付費搭小船可以看青之洞窟,以及沿路餵食海鷗
- 趕在四點半前到達橋野鐵礦山遺跡,獲得下班前熱心老人全日文導覽...
- 雖然是世界遺產,但就只是遺跡,應該是因為歷史意義,實際上沒什麼景觀
- 本來是順著國道35走但剛好封路,繞了一圈才到北上。本來要去一家牛肉餐廳,到現場才說今晚只接受預訂,但熱情的櫃台推薦了另一家還幫我們打電話去訂位。
- 晚上住東橫INN
Day 11
- 毛越寺:也是遺跡...
- 中尊寺
- 五百公尺的上坡路旁有好多寺,盡頭處有要收費的金色堂、讚衡藏
- 松島
- 突然又到了東岸,搭50分鐘遊覽船看各種島,看到後來船上好多人睡著 XD
- 附近景點還有五大堂、瑞巖寺
- 仙台車站吃牛舌,然後在隔壁的 yodobashi 最後 shopping。Apple watch 想要的顏色沒貨,另外到仙台一番町商店街的 Apple 直營店才有(每個店員都能直接用 iPhone 上的 app 結帳,很潮又有效率!)
- 仙台機場還車,返台
2017年4月3日 星期一
MacBook Pro掛了
可能發生原因
- MacBook 散熱孔在螢幕/基座交接處,而且有部分散熱是靠鍵盤
- 因為買了外接螢幕,在家裡比較常使用 ClamShell 模式,鍵盤剛好放在 MacBook 上
- 如果玩遊戲或跑程式,MacBook 的溫度會顯著上升(但其實沒有到「燙」),可能造成以下故障(應該是螢幕掛了)
症狀
- 通常平常是關蓋睡眠,所以首先發現開蓋後螢幕全黑
- 直接按電源鍵重開機,有開機聲、鍵盤背光會亮,但螢幕一直是黑的
- 接外接螢幕重開機,有開機聲,但讀取畫面跑一半突然螢幕變黑
- 黑色畫面中直接輸入登入密碼再 Enter,無效
- Rest PRAM/NVRAM
- 開機時按 Win+Opt+P+R 直到第二次開機聲 → 無效
- Reset SMC
- 拔掉外接電源
- 按住 Shift+Control+Option 及電源鍵10秒鐘後放開
- 接外接電源
- 嘗試開機 → 無效
- 接外接螢幕(以下步驟都有接),開機時按 Shift 可進安全模式,當然有些功能會受限,但至少能上網(WiFi)
- 接 macOS Sierra 的開機 USB,開機時按 Option 選擇 USB,用磁碟工具程式修復,顯示無錯誤
- 開機時按 Command + C 可進 single-user mode,用 fsck -fy 指令修復,顯示無錯誤
- 開機時按 D,檢測硬體說「顯示器可能發生問題」,參考代碼 VFD002
- 有錯誤碼比較容易 google 到精確的資訊,發現很多人有一樣的問題,這台是 MacBook Pro 13" (Late 2013) 不在召回之列而且也過保固了,換螢幕要10000多整個不划算,到 iFixit 看零件也差不多價錢
解決方法
- 接外接螢幕、外接電源,開機時看到讀取畫面時馬上關蓋變成 ClamShell 模式,可以順利到登入畫面、進入系統,但開蓋後螢幕又會黑掉,再關蓋也是一樣
- 目前就關蓋當超薄主機的功能,可惜了 TrackPad 不能用(除非把螢幕鋸掉一半?)
2017年3月22日 星期三
Deskew - 掃描文件轉正
去接老婆時常常要多等個 10-20 分鐘,一問之下原來是掃描文件後,如果看到 pdf 檔裡文件太歪,就要重新掃描。一聽到這問題,直覺上就認為是簡單的 post processing 就能解決問題啊!目前用的方案為:
- 掃描後的 pdf 檔
- 以 Ghostscript 將 pdf 轉成多張 tif
- 以 Deskew 將每個 tif 轉正
- 以 ImageMagick 將 tif 轉成 jpg,調整壓縮比及resolution,再以 ImageMagick 將 jpg 包成 pdf
曾經嘗試但未採用的方案:
- Adobe Acrobat Pro
- 付費軟體,得來不易
- 沒有開 OCR 的話效果很差,但預設的 OCR 只有英文的
- 手動旋轉不易調整
- PDFill
- 可以用水平線轉正
- 乍看功能很多,但看首頁就知道,這個軟體的 UI 設計爛到不行,使用起來非常不直覺
- Scan Tailor
- 頗接近需求的軟體,可惜除了 deskew,還會把其他步驟綁在一起才能輸出(例如 Select Content),自動化抓好的話很順利,抓不好每張都要調整反正花更多時間
- unpaper
- 其實是第一個找到的,看起來功能很完整很強大,除了 deskew 外還有其他掃描文件常需要的校正功能,但因為是純命令列所以參數很多
- 比較詭異的是 input / output 是少見的 pnm format (.pbm, .pgm, .ppm)
- 嘗試了一下發現效果沒有想像中好,大概需要再調參數...
- Photoshop
- 修圖很好用,當然也能拉水平線轉正,但無法自動化用在 pdf 檔...
2017年2月25日 星期六
Firefox WebExtension 入門 - 筆記 & 心得
緣起
- Sleipnir 是日本人開發的瀏覽器,支援 IE 核心、免安裝、可設定很多熱鍵及滑鼠手勢,多年以來是用 2.99 版,因為第三版之後介面比較華麗(跑得比較慢)而且可以設定的項目反而變少。搭配的套件是 SeaHorse,也就是類似 Firefox 的 GreaseMonkey,用使用者自定的 JavaScript 去「後處理」網頁。一張爛圖可以用 Photoshop 修成好圖,爛網站也可以用 user script 修成好用的介面。
- 因為用的是非常舊的版本,遇到較新版本的IE開始不是很相容,當然也有可能是院內網的問題,總之下定決心轉換跑道,希望用比較新的工具!
- 剛開始嘗試寫成 Chrome 的 extension,但發現遇到的問題比 Firefox 多一些,於是又改寫成 Firefox 的 WebE xtension,還好後者本來就向前者致敬,不需要改很多東西。
背景知識
- Firefox 以前的套件稱作 add-on,要查 add-on SDK;但每個頁面最上面都會提示你說這是舊的技術,建議改用 WebExtension
- 最終的套件是用把所有檔案 zip 打包再改成 xpi 副檔名。在開發過程中,建議用Firefox Developer Edition,在 about:debug 頁面中可以直接 load 資料夾中的 manifest.json 作測試。
- manifest.json 是整個套件最重要的檔案,包含這個套件的基本資訊、套件可以用到的權限、定義 content scripts 的 rules。很明顯的是一個 JSON 的結構。
- content script 就是 user script,但rule是定義在 manifest.json 而不是在script 裡
- matches:某個 script 要套用的網頁 URL 規則,要注意的是 URL 包含 scheme, host, path
- run_at:通常等到網頁 loading 完才執行 script,但可以設定在 loading 完成前就執行
- js:為了安全因素 content script 執行的 scope 是和網頁不同的,如果希望無痛轉移原本的 Sleipnir + SeaHorse,需要在 content script 中再把舊的 script 注入(inject)到網頁裡。
- Chrome extension 的資料比 Firefox 多,詳見此篇,必讀!
- Content script 當作一種橋樑,一方面可以和套件的其他部分溝通,一方面可以和網頁溝通。
- background script 是 Firefox 執行後就會在背景常駐的一個 script,作為一個中央指揮部,用來(暫時)儲存使用者的帳號/密碼、定時 refresh session id 以免被登出。這些功能本來是寫在背景執行的 AutoHotkey script,搭配 Sleipnir 開啟。
- popup:容易誤解的名詞,是指(選擇性地)在右上角可以顯示一個圖示,按下圖示時會出現的框(事實上是一個網頁)
- 要在 manifest.json 裡定義 browser_action
- 網頁原始檔不能有任何 inline JavaScript,應該要用外部連結到另一個 js 檔(主要是 submit button 會用到)
- popup、background script、content script 可以互相溝通,利用 browser.runtime.sendMessage 及 browser.runtime.onMessage
結構
- 啟動 firefox,預設首頁就是院內網登入頁;background script 直接開啟 popup,提示使用者輸入帳號/密碼
- popup 用 http request 去檢查帳密能不能登入,如果登入成功,會將帳密傳給 background script 儲存,所以 firefox 還開著的時候都可以記憶帳密、快速登入
- popup 也會 sendMessage 給開啟的登入頁的 content script,自動填入帳密;事實上,登入頁的 content script 會先向 background script 請求帳密,以達成自動登入
- content script 可以指定數個 script 依序讀入,加上 content script 和 page script 是分開的,所以能 load 額外的 jQuery 或 jQuery UI,又不會和原本的網頁衝突
- 針對 IE only 的網頁(例如需要用到 ActiveX 的頁面),裝了幾個類似 IE tab 的現成套件好像都沒有作用,目前先設計 content script 在 document_start 時就把網頁 title(會顯示在 firefox 的視窗 title)改成特定的文字(含 url),再由背景的 AutoHotkey script 去抓 title 中的 url,另外由 IE 開啟。當然,這招是很 low 的解法,還沒有考慮 cookie、session 等。
發佈/更新
- manifest.json 裡的版本號更新,將所有檔案打包成 zip 檔
- 到套件中心登入,第一次上傳時,「如何散布此版本」選擇「您自行處理」,表示我要自己管理更新來源,而不是放在官方網站上,因為放在官網的套件需要人工審查,要排隊等.超.久!
- 上傳後會自動審查,沒有重大錯誤就 OK 了,會提供簽章過的 xpi 檔,下載之(沒有簽章過的套件,是不能裝在一般 firefox)
- 套件會抓 manifest.json 裡的 update_url 所連結的檔案(一定要 https 開頭的連結),格式也是 JSON,包含各版本的檔案連結;所以 updates.json 和 xpi 檔要放到一個網路空間(例如 dropbox),xpi 檔的連結寫進 updates.json,updates.json 的連結寫進 manifest.json
- 整個發佈/更新流程可以用 web-ext 完成,但我還在研究中...
2016年11月24日 星期四
2016-11 Maldives
這次去的是Maldives的Club Med Kani島,潛水中心是Euro-Diver,由價目表可知:
- 什麼都貴,租裝備好貴!只有蛙鞋不用錢
- 全部都是船潛
- 防寒衣只有短袖的 (shorty)
- 高氧氣瓶不用加錢,超爽der~~
- 6 days/13 dives 的方案比較划算
- 每人都必備潛水電腦表、浮力袋
行前準備:
- 因為我是大近視一定需要有度數的面鏡,就順便兩人都買了
- 潛水電腦表有點貴,只買了一支
- 向朋友借了一個浮力袋
- 向教練借了:防寒衣 × 2、BCD × 2、調節器 × 2、潛水用水電筒 × 2、相機+潛水殼、潛水電腦表 × 1、潛水裝備箱
- 潛水證照
實際行程及心得:
- D1:搭長榮到新加坡,再搭新航到Maldives
- 抵達時接近半夜了,從機場島坐船到Kani島約30分鐘
- D2:
- 下水前一定要有一次orientation dive確定潛水程度,然後orientation dive一定前一天要預約,所以這一天只能先玩浮潛,順便熟悉潛水相機
- 浮潛、獨木舟、stand-up paddle、sailboat是免費的 (sailboat要先上一堂課才能自己出海),其他行程都要另外收費(而且都很貴)
- 下午四點在潛水中心看證照、確認裝備(要求每個人都要浮力袋,所以租一個)、預約隔日潛水。潛水時間為上午8:30潛兩支,兩支中間會在船上休息、聊天,下午1:50潛一支,夜潛不一定有
- D3:
- 依規定早上orientation dive後,只能等下午正式潛水。剛好有大陸人上課,所以10點多開一趟!
- 那邊都是套腳式蛙鞋,我的腳太嫩一天結束右腳第4指、腳跟直接磨破皮。接下來幾天靠著OK蹦+自己的普通棉襪+Acetaminophen撐過 Orz
- D4 ~ D6
- 如果四天都潛滿潛好,扣掉orientation dive後只有11支,還好很幸運地D5、D6都有夜潛湊到13支優惠價,其中D6的夜潛大概是老闆被我們的瘋狂潛水所感動,才三人+教練就成行了(通常至少要四人)
- 教練包括老闆(法)、老闆娘(父母是越南人但她是土生土長法國人)、法籍男、日籍女、日籍男、埃及男...等
- 早上船潛滿多人,下午較少人。法國人最多,俄國人最猛(完全不穿防寒衣)。
- 貴族級服務:BCD/調節器/氣瓶在岸上組裝好、剩下的裝備放在個人的籃子裡,船員會幫忙搬到船上。潛點到了會搬氣瓶到椅子上幫忙穿BCD,潛完了上船也是幫忙卸裝備、換下一支氣瓶或拆BCD/調節器。回碼頭也是船員把裝備搬下船。
- 通常到達潛點後,教練先自由潛水確定潛點,確定大家直接下潛就到位。通常下去後就是順著流飄沿路找生物,或是抓著海底看很久的manta rays。在水下教練是用不同的手勢表達發現的生物,通常是海龜、鯊魚、manta、龍蝦、壯觀的魚群。
- 每次潛完會記錄最大深度、潛水時間、氣瓶殘壓,最後一天可以領一張潛水記錄,內容還包括每次的潛水地點、教練。
- D7
- 搭飛機前一天不能潛水,繼續進行其他水面活動~
- D8 ~ D10:Singapore
- 去了環球影城、夜間動物園、濱海灣花園、水族館、玩Luge
- 第一天有時差,相當於只在飛機睡四小時,超累 Orz
- 水族館非常棒,尤其最裡面的大池+餵食秀,那麼多(肥)魚的爭食畫面是平常潛水無法看到的
- Luge在紐西蘭玩過了,好玩但就是貴啊...
- 第一天堅持搭公共運輸走好多路讓腳的傷口有點惡化,後兩天都直接叫Uber!
結論
- 免錢的最貴,下次還是要自己帶套鞋、蛙鞋 T_T
2016年10月11日 星期二
AutoHotkey: traditional & expression
在 AutoHotkey 的官方說明檔講到變數Variables時,就開始提到 traditional & expression。Traditional 指的是 AutoHotkey 的傳統,寫什麼就是什麼,剛開始會覺得方便,但偶爾就會遇到一些陷阱,在文末會提到。
b := "test2"
a = add
b = test%a%
c := "test" . a
MsgBox,,,% "test" var1 var2
MsgBox,test
MsgBox % var
MsgBox % var%a%
字串
a = test1b := "test2"
- Traditional 就是寫什麼是什麼(但忽略開頭的空白)
- Expression 的話就是要有一對雙引號 " 夾住字串,相當於要從雙引號中取出字串
a = add
b = test%a%
c := "test" . a
- Traditional 字串串接變數要用兩個 % 把變數的值先取出
- Expression 的話可以用一個點 . 或一個空白鍵相隔,就是字串串接
a = c
bc = test
d := b%a%
- 前兩個 traditional 很直覺,但第三行是什麼? %a% 是對 a 取值,所以是 c 這個字,右邊就是 bc,因為是 expression 所以要對 bc 取值,所以 d 的值也是 test
流程控制
if a > 2
c = 1
else if a = b
c = 2
- Traditional 模式,運算元左邊視為變數,運算元右邊視為普通文字,所以第一行會取出 a 的值,如果比 2 大則為 true。第三行右邊的 b 就只是一個 b,a 的值如果就是 b 這個字的話會是 true
if (a>b)
c = 1
else if StrLen(a)
c = 2
- 如果 if 之後接的是括號、函數呼叫或是運算元 ! 或 not,則視為 expression。第一行會比較 a 的值以及 b 的值,而第三行當然是呼叫 StrLen 函數,而不是視為 StrLen 這幾個文字
Command & Function
MsgBox,,,test,MsgBox,,,% "test" var1 var2
MsgBox,test
MsgBox % var
MsgBox % var%a%
- 以 MsgBox 這個典型的 command 來說,最左邊是 command 的名稱,右邊以逗點分隔參數,參數區預設為 traditional 模式,所以可以空著不寫,AutoHotkey 會幫你填入最常用的預設值
- 如果某一個參數之後就全部空著,那麼連逗號都不必寫,全部空掉也可以
- 第二行的第三個參數先一個%再接一個空格(或tab),表示這個參數變成 expression 模式,可以自由串接變數
- 第三、四、五行僅限於部分 command,只用第一個參數代表省略其他的參數,一樣也區分 traditional 或 expression 模式
SubStr( var, 1, 2)
SubStr( var%a%, 1, 2)
SubStr( "test", 2)
SubStr( "test", 2, )
- Function 是以 function 名稱加上一對小括號,參數也是以逗號分隔但只限expression模式。
- 空的參數應該要以 "" 表示,或者就不要有逗號,第三行是錯誤示範
常見陷阱
- 因為 AutoHotkey 不用宣告變數類別,所以數字類的值有可能是字串,也可能是數字(整數、小數等)
- a 是 01 的字串
- b 牽涉到數學運算,所以變成數字 1
- c 牽涉到字串串接,所以又變為 01 字串
- 在 AutoHotkey_L 版本可以用到object類的陣列,如果key是像數字的字串,會自動被轉成數字,所以 r[a] 事實上變成 r[1] 而不是 r["01"] 也不是 r["1"],除非指定 r["" a] 才是 r["01"]
- if 之後如果有兩行以下則要用大括號 { } 包起來,但如果 if 是traditional模式,事實上第一行被視為 a 的值是不是 2 { 這個字串,也就是 { 被誤解了。所以原本的 } 就會被 AutoHotkey 解讀為多出來的,而這個 if 影響的只有 c=1 不包括 d=1 (因為根本沒有大括號包起來)
- 第二個 if 是 expression 模式,而且很有效率順便給 a 變數一個值。可是 := 這個運算元的優先順序是很低的,a 的值會變成 (c+1) && (d>0) 整串的結果,而不是 c+1
2016年10月2日 星期日
MammoSR
前幾個月上了一堂課突然獲得資格:打國民健康署的乳房篩檢報告。這在外面的醫院幾乎是必備技能/資格,但在本院根本是賽缺中的賽缺。原因如下:
- 在院內的報告系統(RIS)打好報告,還要在國健署專用的紙本報告(附表7的第二頁、附表12)上勾選你看到了什麼、結果是什麼,然後蓋章。同一件事情分成兩次做已經很蠢,更蠢的是把電子化的資料要化為紙本資料。
- 最蠢的是,其實國健署的系統也是電子化的啊,所以每個禮拜會有專員來把紙本的資料再key到那個系統內。無以倫比的官府效率!
- 多做這些麻煩的事,報酬卻和一般的乳房攝影報告一樣。不同工卻同酬,而且是比外院低很多的酬,非常不公平。
- 更慘的是,乳房攝影報告通常是胸腔影像團隊負責的,一個報告量最大、報告完成度最低、平均pay最低、離職率最高的團隊,還要接受這麼鳥的業務,落入惡性循環。(這不就是台灣的縮影嗎)
很不幸的接到了賽缺,只好想辦法讓這業務稍微不賽一點。目前的流程是「院內系統打報告→勾選表格→蓋章→交卷」,變成「AHK程式打報告→報告貼到院內系統、生出一個勾選好的網頁表單→列印→印出來的表單塞回檢查單」。詳述如下:
- 主程式MammoSR:
- Open study
- 從RIS的舊片清單讀舊片資料,包括日期(直接輸出到報告內文)、單號(經由Impax Context Server在Impax開啟影像)
- 舊片清單沒有資料的話,把Comparison欄位設定為No
- 除了breast density其他欄位為combobox,可選取預設的幾個文字選項,也可以自行輸入(修改)
- 有意義的finding,也就是屬於BI-RADS 0, 3-6的finding,要以程式內的按鈕輸入,並在那個finding的suggestion選取相對應的處置,否則都視為一般finding。
- 提供B1, B2按鈕,為BI-RADS 1, 2的預設報告內容,這兩個應該是最常用的
- 不管按鈕按了什麼,輸出的報告內容可以在文字框自由修改
- Save:
- 報告貼到RIS
- 以xml檔儲存本次報告
- 以xml檔的資料以及範本output.html,生成一個勾選好的表單html
- 將html檔以chrome開啟,檢查是否有錯誤。html也能手動勾選後儲存變更。
- Send:將本報告的html傳送到print server儲存
- Print All:打了一組報告後,可以傳送列印指令,print server將列印該放射科醫師已儲存未列印的html,以傳送時間排序
- 自動抓RIS上的資訊,包括放射師、病人姓名、檢查單號等。如果單號改變會自動存檔後reset GUI,如果有之前的存檔會自動匯入
- output.html
- 第一頁是每個檢查都會填寫的,就是基本的判讀結果;第二頁是BI-RADS 0, 3-6才需要勾選的finding細節,如果BI-RADS 1, 2的話第二頁是隱藏的
- 文字輸入部分是span,以紅色底線標示表示可以手動修改(紅色底線不會印出來);其他都是checkbox input勾選符合的選項
- 有任何變動的話,會在最底下出現Save按鈕,按Save後才能儲存變更(javascript無法儲存檔案,其實還是間接用AutoHotkey去完成的)
- MammoSRprint
- 將xml轉成html,主要靠output.html裡各個欄位的name屬性去修改值
- 第二頁有些病人資料(生日、身份證字號)是靠院內portal系統去抓的
- MammoSRprintClient
- 將html傳送到server,或者傳送print all的指令
- 所使用的是Socket library,用的是TCP,雖然不是最detailed的library,沒辦法做很多細部設定,但就跟ahk一樣很簡單上手
- MammoSRprintServer
- 接收html儲存到相對應的資料夾(放射科醫師姓名),html會加入一段開啟時列印的javascript
- 接收到print指令,以chrome打開html來列印
待改進部分:
- 雖然叫MammoSR但還不是很嚴謹的structure report,主要是太嚴謹的話用起來不方便,小程式還是以工作便利性優先
- 設計表單時是以chrome的呈現結果為準,可惜網路上已經很難找到支援WinXP的portable chrome(版本49以下),目前用的是之前存在隨身碟的版本37
- 在server端的列印還是以類似按鍵精靈的方式去點列印鍵,最佳解應該是可以在背景以command line方式執行批次列印(還沒嘗試chrome的--kiosk-printing)
2016年9月27日 星期二
颱風天解數學
颱風天Facebook上出現學弟提出的一個問題,感覺是個國中/國小數學競賽的程度,適合幾年沒碰數學的人回憶一下 orz
題目:98/49 = 8/4 = 2,相當於分母分子消掉重覆的數字9;64/16 = 4/1 = 4,相當於分母分子消掉重覆的數字6。還有其他解嗎?
為了定義清楚,以及稍微縮小範圍,以數學的語言重新描述:
找到所有a, b, c符合(10a+b)/(10c+a) = b/c,其中a, b, c為1~9的整數
題目:98/49 = 8/4 = 2,相當於分母分子消掉重覆的數字9;64/16 = 4/1 = 4,相當於分母分子消掉重覆的數字6。還有其他解嗎?
為了定義清楚,以及稍微縮小範圍,以數學的語言重新描述:
找到所有a, b, c符合(10a+b)/(10c+a) = b/c,其中a, b, c為1~9的整數
- 整理後得a(10c-b)=9bc,所以左方被9整除,考慮
- a=9 → 10c-b=bc → 10c=b(c+1),右方為10的倍數,考慮
- b=5 → c=1,95/19=5/1
- 2|b → b=8, c=4,98/49=8/4
- 9|10c-b,考慮
- 10c-b = 9 ~ 81共九種可能性,不難發現都是b=c → a * 9b = 9b^2 → a=b,也就是無聊解99/99=9/9, 88/88=8/8, ..., 11/11=1/1
- 3|a 以及 3|10c-b
- a=3 → 10c-b=3bc → 10c=b(3c+1),類似前面的分析可知無論b=5或2都無解
- a=6 → 20c=b(3c+2),考慮
- b=5, c=2,65/26=5/2
- 3c+2=5, c=1, b=4,64/16=4/1
回過頭來考慮其他三類型:
- (10 a+b)/(10a+c)=b/c 或 (10b+a)/(10c+a)=b/c 都會是無聊解因為就是分子分母一樣
- (10b+a)/(10a+c)=b/c其實就是前面的解b, c互換,變成19/95=1/5,49/98=4/8,26/65=2/5,16/64=1/4
2016年8月13日 星期六
iOS 9.3.3 JB
偶然發現盤古已釋出iOS 9的JB,機不可失馬上來升級!升級資訊主要參考瘋先生,在Mac環境完成iPhone 6及iPad Mini 2的升級與JB。略整理如下:
- 不論是Mac或Windows,我會先更新iTunes(也只有JB時才在更新),然後用iTunes完整備份(包含app)。另外我習慣關掉iTunes的自動同步,避免發生非預期的同步。越獄時建議關掉iTunes。
- 備份的同時可以下載iOS 9.3.3的ipsw,可以google的到,並選擇對應的機型下載。如果忘記是哪個機型,Apple官網有提供辨識方法。
- 這次的JB方式有兩個,自行選擇所需要的軟體下載
- 下載PP助手,PP助手導入盤古越獄:但PP助手安全性一直受質疑,所以...
- 利用Impactor導入盤古:下載Impactor及盤古越獄安裝檔(NvwaStone_1.1.ipa)
- 基本上越獄的步驟都是「備份→升級→回復備份→越獄」,只要注意不要把最後兩步驟搞混就好;另外如果哪邊不順利或是死機就是從第二步驟再跑一次
- 升級是用iTunes的「回復iPhone」,搭配Windows的Shift或Mac的Alt按下按鈕,可選擇剛才下載的ipsw。升級後在iPhone做些初始設定後,最後一步選「從iTunes回復」,然後在iTunes選擇最近的那個備份來回復。
- 在電腦開Impactor,將盤古越獄安裝檔ipa拖曳進Impactor,裝完iPhone裡就有盤古越獄app。這次越獄比較特別需要用到憑證,要照瘋先生網誌裡講的到「設定」裡去信任憑證。
- 越獄的方法就是打開盤古app,點START,然後按電源鍵一下。跳出訊息後再解鎖進去看桌面有沒有Cydia,有Cydia就越獄成功。
- 事實上這次越獄號稱是「比較有彈性」的越獄,或者其實像以前的「非完美越獄」,也就是重新開機後就變成沒越獄的狀態,Cydia和其他Cydia安裝的app都還在,但無法開啟會閃退,要用盤古app再越獄一次。
- 有些偵側JB的app,就可以重開機使用而不用重刷
- 因為平常使用很少會重開機,影響不會很大;以前要從電腦上的盤古來JB,但這次盤古直接裝在iPhone裡,方便很多!
過程中遇到的一些問題及心得:
- 雖然有PkgBackup之類的Cydia備份工具但一直無法正常用,所以都是用最陽春的備份方式:手機錄影。用另外一隻手機錄Cydia的已安裝套件,一頁頁滑到底。
- 目前Cydia會裝的是
- Activator:各種自訂手勢
- CCSettings:自訂開關控制器,例如3G網路、wifi、藍牙、定位
- Fully Masked Passwords:輸入密碼時,按鍵盤不會出現放大的字元
- iFile
- Speed Intensifier:加快iOS各種轉場動畫
- WiFi Passwords:記憶並呈現曾經輸入過的wifi密碼
- ActionMenu:選取文字後的選單增強,尚未支援iOS9
- Six Icon Dock:尚未支援iOS9,先裝了betterFiveIconDock
- 因為之前裝Six Icon Dock後來改betterFiveIconDock,Dock最右邊的app會被隱藏起來,只能靠搜尋app來執行很不方便。用iFile到 /var/mobile/Library/SpringBoard 把IconState.plist和IconSupportState.plist刪掉後respring,重新整理桌面和dock。
- 不知道是不是越獄的bug,在越獄狀態下iOS自己的「設定」會閃退開不起來,但在裝了Cydia的PreferenceOrganizer 2後就解決了。
2016年6月19日 星期日
2016 日本行
Google相簿:https://goo.gl/photos/Bpz6Vs61TqbWZKWR
Day 1
- 桃園→名古屋
- 機場快速列車搭至名鉄名古屋駅
- 車站附近領車:Subaru Impreza、Mazda 5 MPV、Mazda 6 Wagon、Toyota老車
- 開車至惠那峽,搭遊船,沿岸很多被命名的石頭但不一定認得出來
![]() |
| 品字岩 |
- 開車至馬籠宿,大家不知道10am-4pm以外的時間可以開車上去,傻傻地拖行李爬坡。馬籠茶屋附晚餐、早餐。
![]() |
| 血紅色的生馬肉 |
- 晚餐畢四處走走,但其實店都關了,後來硬闖了一家還沒鎖門裡面燈還亮著的雜貨店XD
Day2
- 早上行程是臨時增加的中山道健行,因為茶屋主人非常推薦!
- 前一天晚餐後熱烈討論行程怎麼走,狀況當時有四台車、18個人,有一位痛風發作所以不能走,大家想要完整走完全程(將近8公里)。
- 結論是兩隊人馬+病患先開兩台車到妻籠,病患待在妻籠停車場,其他人從妻籠走向馬籠,再開另外兩台車。另兩隊當然是直接從馬籠走向妻籠。
- 缺點是開車的兩隊會花比較多的時間:除了剛開始開車,馬籠比妻籠高一些,所以妻籠往馬籠的上坡較長。優點是上坡較緩,而且走到後段有一間免費喝茶處,到馬籠時商店、郵局也都營業了可以逛逛。
![]() |
| 有熊的話要搖鈴示警 |
![]() |
| 免費喝茶休憩所 |
- 中山道走完,時間有點趕,買了些零食後就往合掌村邁進(各車各走各的)。這天是我開車,高速公路上一直跟著前車飆,最先抵達目的!
- 雖然時間不多,能看的點都盡量看了。走到展望台實在有點累,畢竟今天已經走過中山道了…
- 開車至高山Alpina Hotel,我們這車最先到所以先去有名的飛驒牛肉店訂位。可惜沒那麼多空位,最後只有6個人去。Hotel印的優惠券可換得每人一大杯免費啤酒,很划算。結束後又去居酒屋續攤,喝些地酒,五個人各點一種(我拿到深山菊),苦的到甜的都不錯喝。
Day 3
- 走到附近的高山陣屋,也就是以前的國稅局,看裡面的房間、構造。
- 到附近的老街,飛驒牛的商品很多,各式的吃法都有。
- 往上高地國家公園是禁止私人車輛通行的,所以是先停在停車場再搭巴士或計程車上去。反觀台灣,大家都開車塞爆各大山上景點,最美的風景是廢氣和塞車。
- 到hotel下行李後,往大正池的步道來回(3.5公里*2)。時而看到野生猴子,靠太近其實會有攻擊動作,要小心。
![]() |
| 大正池 |
- 晚餐極度豐盛,還有舖床服務,加上在國家公園內,難怪這間要那麼貴T_T
Day 4
- 開車至松本車站,大家下車後司機開車去加滿油還車,然後租車店再載司機們到車站。
- 坐火車到信濃大町,將行李直接寄到晚上的hotel,然後坐巴士到扇澤開始黑部立山路線。接下來就是一直換交通工具。
- 沿途有很多蓋章的點,集滿可以換紀念品,但大家在第二個點就miss了...
- 黑部水壩
- 六月底才洩洪,只好以後有機會再來
- 傳說中的水壩咖哩飯有點弱...
- 黑部平
- 有步道可以走但大家趕下一班纜車,未久留
- 大觀峰
- 室堂
- 可惜剛好超過開放時間(3:15pm),無緣參觀6公尺雪壁,只好走步道摸摸雪
- 美女平
- 立山
- 搭火車至富山
- Hotel就在富山車站旁,晚餐也是去很近的拉麵いろは。吃完再走一公里多到著名的Starbucks環水公園店。
Day 5
- 下雨,逛藥妝店搜刮後,坐巴士到富山機場,回國
2016年3月12日 星期六
Hotstring優化:追求極致速度
AutoHotkey的最大優點就是簡易的語法,方便設定hotstring及hotkey。不過畢竟最後是CPU在跑,寫一行程式碼,不一定比三行程式碼還快,要讓程式跑得快,還是要以電腦的角度去思考。例如以最簡單的 ::btw::by the way 為例,trigger之後AutoHotkey會模擬鍵盤傳給Windows的code,Windows再送到active的文字編輯器,文字編輯器被接收到一個鍵會觸發/更新一些內建數值(例如目前是第幾個字元、總共幾個字元、儲存上個狀態以便Ctrl+Z可以復原等等),然後更新文字輸入區的畫面,讓使用者知道程式沒當掉依然有反應。在AutoHotkey的範圍內可做到幾點優化:
- SetBatchLines -1
- 預設設定下,AutoHotkey每執行一行程式碼,會短暫休息,再執行下一行,以避免讓CPU太操。但既然用AutoHotkey就是要效率,給他催下去!
- SendMode, Input
- 預設的Send是SendEvent模式,但SendInput在大部分的狀況下是Z>B,包括
- 送字速度快
- 因為有buffer,如果程式正在send字串時使用者也按下鍵盤,使用者按的鍵會在字串送完時接上,而不會中斷(最多buffer 5000個字元)
- SetKeyDelay, -1, -1
- 這個設定也是類似SetBatchLines,為了模擬正常人類按鍵,按下去會有一定duration,兩個按鍵間一定有一些delay,通常是遊戲才會偵測有沒有cheat
- 雖然這個設定影響的是SendEvent,但有非常少數情況下AutoHotkey會自動從SendInput轉換成SendEvent或SendPlay,所以還是可以設定
- 複製貼上法
- 對於較大量的字串,例如某個procedure note的範本,用send會非常慢。比較直覺的方式是用剪貼簿當作媒介來複製、貼上
- 註解掉的兩行是為了保留原本的剪貼簿內容,但在連續輸入的情況下不太需要
- 有一說要搭配ClipWait,但日常小量字串應該都能順利運作,所以沒有使用
- 實測比較SendInput和sendByClipboard,發現大概以7~10個字元為分界,更多的字元後者較快,較少的字元前者較快。
- sendByClipboard的缺點:
- 組合鍵(用到Ctrl, Alt, Shift, Win等)無法用(不過通常也不會很大量)
- 單行定義的Hotstring會依據首字是否大寫/全部大寫,送出相對應的字串(首字大寫/全部大寫),sendByClipboard只能用笨方法來模擬。(注意後兩個搭配c選項)
- 直接送字法
- 利用剪貼簿畢竟多了一道程序,可以直接設定輸入框裡要顯示的文字。
- Standard edit control可以搭配Edit library,測試會比剪貼簿方法還快,但缺點是全部文字整個更新,畫面可能會閃一下,或者捲軸的位置不一樣:
- Scintilla control是SciTE、NotePad++所使用的,可以搭配Scintilla wrapper以及自己寫的RemoteScintilla,速度和standard edit差不多,優點是很多強大的功能。
- 在自己的gui建立及操作Scintilla control要用Scintilla wrapper,但如果要access或modify其他process中的Scintilla control,則要用RemoteScintilla,利用_RemoteBuf library搭配Scintilla Documentation裡列出的messages(AutoHotkey的ControlGetText和ControlSetText只針對standard edit)。
- 利用SCI_ADDTEXT,可以在游標處插入字串,而且游標會跳到加入字串的最後面,和Hotstring或是複製貼上的動作是一致的。
2016年3月5日 星期六
Automatic Lung CAD
Low dose chest CT漸漸成為趨勢,幾乎是chest X-ray般的輻射劑量,卻提供超多細節,以及chest radiologist的工作量 T_____T
本院chest CT檢查量就像物價一樣漲個不停,打起來最爽快的莫過於cancer follow up,爽點包括:
本院chest CT檢查量就像物價一樣漲個不停,打起來最爽快的莫過於cancer follow up,爽點包括:
- 已經有診斷、有治療,定期追蹤看有沒有復發、轉移,大部 分都是post-op changes, non-specific changes,以及一些雜魚tiny stable nodules。
- 有前人打的報告,copy & paste再做些修改。
- 之後會繼續來追蹤,有nodule沒看到,下次總會有機會再看到。
- Multiple bilateral lung metastases最為#無痛,而且可以#秒殺,因為就已經是一堆nodules了啊!
相反地,low dose chest CT可怕之處在於:
- 通常是較健康的人(例如健檢),只有非常少、非常小的nodule
- 因為是健康的人,氣吸很飽,肺變得很大,守備範圍加大…
- 這個檢查要看細切影像(1mm),動輒兩三百張,非常耗神耗眼…
- 萬一沒找到lesion,下次回診時可能已經真的有cancer了,雖然不一定有相關性,但被告的機率感覺比較高,#怕怕der
- 因為low dose,soft tissue看不清楚,liver到底有沒有tumor只能瞎猜
當LDCT成為事實,CAD就是義務!
目前部內的架構是:
- 做完CT → 細切傳至部內RAID(Osirix, iMac)
↘ 粗切傳至醫院資訊室PACS
為了自動化CAD,幻想中的流程是
CT → 某台強大電腦運算CAD ← user query
- 可惜本人image processing很弱,只看paper無法自己拼成可用的程式
- 也是有別人寫好的現成的matlab code,但效果沒有很好…
於是規劃了複雜的流程
CT → RAID → Workstation (CAD) → Orthanc server ← user query
CT → RAID → Workstation (CAD) → Orthanc server ← user query
細節如下:
- 做CT,series name需要改為「LungCARE」,傳至部內RAID
- Osirix設定auto-routing,有「LungCARE」的series會自動傳至#S牌工作站
- 工作站設定「LungCARE」的study自動apply為MM Oncology,而且會在背景先做CAD
- AutoHotkey程式,每天早上三點(所謂三更半夜四下無人)會執行
- 登入
- 篩選「昨天」的「LungCARE」
- 打開study
- Show lung CAD results
- Accept all candidates(本來是要醫師自己到場accept或reject每一個candidate)
- Complete and archive:result會存成一個新的series
- 工作站設定result的series再自動re-routing到自己架的server(Orthanc)
主要的考量包括:
- S牌工作站
- 可以找GGN,accuracy還算OK
- 軟體介面是AutoHotkey可以access到的
- 向工程師要到某種帳號,可以做進階設定
- CAD可以pre-processing,不用現場等,前提是一定要命名為LungCARE
- 其他工作站:
- G牌:本部最舊的,很久沒更新;軟體只能一次處理一個case,無法批次處理;用linux系統,不熟…
- P牌:CAD很弱...
- T牌:介面無法用AutoHotkey抓,不能找GGN或是4mm以下的nodule
- RAID轉運站
- 每一台CT都會傳到RAID,而且Osirix可以設定auto-routing,就不再麻煩放射師要另外傳到工作站
- 缺點是主機老舊,硬碟容量小,其實就是一個外接硬碟而已,還要常常手動更換,和「RAID」完全沾不上邊…
- Orthanc server
- 支援web介面查詢、瀏覽series、基本影像操作(亮度/對比)
- 支援REST API,可以用http request配合json查詢、抓影像
使用者端(chest radiologist們)則用另一個AutoHotkey程式,將下列動作綁在一個hotkey:
- 抓RIS目前報告的病歷號
- 用http request去查自架server是否有符合的result,有的話…
- 在已開啟/新開啟的firefox或chrome打開連結,直接連到web viewer的頁面
目前要再做一個server,針對非LDCT,可以丟一個病歷號過去,然後:
- 從RAID拉影像(用dcm4che)
- 修改series name為「LungCARE」(用ExifTool,或是出動Python)
- 將dicom傳到工作站,等CAD
- 登入工作站,accept candidates,export result
- 回傳通知CAD已完成
雖然很複雜,但目前能力只能做到這樣,希望以後有更好的流程~
2015年12月18日 星期五
Dynamic Hotstring實例
之前在「自己寫武功祕笈:Radiologist的第一個Autohotkey」提到一點dynamic hotstring的使用,這篇再介紹幾個實用範例。
Prerequisite
- Regular expression:雖然看起來像火星文但真得很重要(自行覆頌三遍),可參「Regular Expression入門」
- AutoHotkey_L:一般而言用Unicode 32-bit
- Dynamic hotstring的library:AutoHotkey的論壇上可以找到幾種版本,我用的是比較多選項的這個版本
- 下載Hotstring.ahk存到AutoHotkey主程式資料夾內的Lib資料夾,或者ahk檔資料夾內的Lib資料夾(詳見說明)
- ahk檔開頭加上#include <Hotstring>
- 自訂的hotstring是以函數方式執行,所以要放在auto-execute section內,簡單來說就是在第一個return之前的範圍
範例1:日期
- 輸入:8個數字,再加上一個分隔字元,例如20151218/
輸出:2015/12/18
範例2:檢查部位
- 輸入:不定部位的字母代號,加上without/with contrast enhancement數字代號,以及一個結尾符號,例如b1=
輸出:CT of the brain without contrast enhancement shows:
範例3:lines and tubes for CXR
- 輸入:數個字母代號,加上結尾符號,例如tgv=
輸出:Placement of endotracheal tube, nasoenteric tube, central venous catheter(s).
2015年12月11日 星期五
醫病溝通
根本就是平行世界。大部分時候只是醫生覺得病人懂了自己講的,病人也覺得懂了醫生講的,其實是各自腦補。
今天第一次參加這種面對面溝通,雖然主要是針對一線的醫師,但也會做到procedure的敝科也無法置身事外。簡而言之就是常見的劇本:病人因為碰到一連串的事件不幸掛了,家屬不能接受,列出某些不滿意的事項(通常都是小缺失),質疑如果沒有這些小事件,是不是就不會有今天的結果。當然,「人好好的進醫院,怎麼會變這樣」的經典台詞也出現。幾個簡單心得如下:
今天第一次參加這種面對面溝通,雖然主要是針對一線的醫師,但也會做到procedure的敝科也無法置身事外。簡而言之就是常見的劇本:病人因為碰到一連串的事件不幸掛了,家屬不能接受,列出某些不滿意的事項(通常都是小缺失),質疑如果沒有這些小事件,是不是就不會有今天的結果。當然,「人好好的進醫院,怎麼會變這樣」的經典台詞也出現。幾個簡單心得如下:
- 大部分人「不理性」, 更何況是剛遭遇那麼重大的事件。同樣的質疑點一提再提,不知道是不接受還是聽不進去,或是瞬間就忘了,一直鬼打牆似的對話重播。大概就是問了A,回答A,有可能還沒回答完又突然想到質疑B,回答B後換C,C回答後又回到A,講半天完全沒進度沒共識。
- 大部分人無法被「告知」、無法「理解」、更不用說「記住」專業的知識。以前說什麼要「告知同意」,但病人/家屬絕對不可能理解100%,甚至可能是「-100%」,也就是完全誤解。再加上記憶力是有限的而且不可靠,事後醫生說他講過,但家屬覺得沒講過,各說各話,沒錄音根本沒證據,只能說還好簽同意書已經是routine。
- 承上點,除了沒有專業的知識,有些完全錯誤的知識反而根深諦固,例如沒看過急性中風,質疑為什麼30分鐘前人是好的,見面時就發作,「哪有那麼巧的」;醫院冷氣那麼冷,害人身體變虛,害人感染;「再觀察」就是沒在治療,「保守治療」就是沒有盡力治療。不勝枚舉,只能說還好這些觀念在法庭上沒有什麼威脅…
- 大部分人無法注意到「醫療上」會影響病人的因素,只能把注意力放在「醫療外」的枝微末節,但覺得是這些細節影響了預後。這部分大概是最難想像、最難掌握的,護理師不經意的一個動作(沒有蓋被子)、某位醫師(包括大P或菜鳥)隨口的病情評估(這一定好起來/好不起來),反而記得一清二楚,連那個人長得胖瘦高矮都記著,總之就是各種服務不周到。有些人希望醫生講越多越詳細越好,做個手術可能會死可能會植物人是基本的,各種替代治療不管對病人是好是壞都要知道;有些人反而不敢聽那麼多,聽越多越怕,覺得不吉利;反正怎樣都能怪。
- 大部分人沒有benefit/risk的概念,不知道在不同狀況下會有不同的考慮,沒有標準答案,也不是SOP。可能遇到的說詞是:為什麼某個(侵入性)治療要「拖」緊急時才做,不能提早做,不能「預防」嗎?侵入性治療一定兼有benefit/risk,沒有適應症甚至有禁忌症的狀況下,risk1 > benefit1,整體效益可能benefit1 - risk1 - cost < 0;但在危急狀況下,不做治療的risk嚴重許多,不治療效益是 - BigRISK,治療的效益是benefit2 - risk2 - cost,所以有可能要治療。注意benefit1不一定等於benefit2,risk1也不一定等於risk2;而且,在危急狀況當下,很可能不治療或治療的效益都是負的,只能「兩害相權取其輕」。隨著各專科專業化,有時候連不同科醫生間也會吵起來,互相思考不周,只看到人家某種治療的benefit,卻沒去了解相關的risk,或者反之。
行醫生涯,很難不會越來越保守,尤其是還很菜的時候… 大家常說的一句話是「還沒踢到鐵板,只是做得不夠多」。在踢到鐵板前,前輩們會叮嚀先穿好鐵鞋,雖然鐵鞋會造成某種程度的不便(例如別人覺得你效率低落),但為了防止踢到鐵板,確實是智慧的傳承,是一種自己人才知道的,benefit/risk之間巧妙的平衡。
2015年9月7日 星期一
Triangulation of mammography
所謂的breast lesion的triangulation,是說MLO或CC其中一張看到lesion,但另一個view不確定在哪,則再照ML。如果(相對breast中軸)的距離,ML比MLO高,則lesion在medial side,反之則在lateral side。可參考這篇paper或是這張小小示意圖。
以數學表示之:
以數學表示之:
- 以nipple為原點之極座標系,假設lesion在(r, θ),θ = 0表示正上方,θ = π/2表示lateral,θ = -π/2表示medial。如果直角座標系則是(r sinθ, r cosθ)
- 於是lesion在ML時高度為r cosθ,在CC時為r sinθ。事實上,對於某φ角度(原點及方向同θ)之造影,lesion高度為r cos(θ-φ)。
- 對cos(θ-φ)作圖,θ from -π to π表示lesion從medial到lateral,φ from 0 to π/2表示從ML到CC,Z軸表示lesion高度,如圖。
- 直接看contour plot,medial lesion也就是t from -π to 0的部分,在p from 0 to π/2也就是ML到CC,顏色變深也就是值變小;lateral lesion也就是t from 0 to π則相反。大致上正確。
- 仔細想發現不對呀,就cos(θ-φ)而言,for any θ from -π to π,在φ from 0 to π/2並不一定是嚴格遞增或遞減,例如一個lesion在θ = π/8處,則ML排到CC的高度應該像這張圖。
- 因此結論是:原始敘述並不完全正確,而且lesion在各個view間的關係並不在「直線」上,而是在cos曲線上。
2015年8月16日 星期日
新天鵝堡拼圖
四月底去德國時,在新天鵝堡買了2000片的拼圖,前幾個月進度緩慢,反而這幾個禮拜準備考試,念書累了拼一下,終於在今天完成!!
以前很少拼圖,那麼多片也是第一次(小時候看舅舅拼1500就拼很久了),在拼之前還特別google看別人怎麼拼。雖然不是老手,但拼完總是有些心得:
- 找一塊空地/空桌規劃為拼圖區,要做好長期抗戰的準備。不能只預留拼圖的完成大小,因為零散的一塊塊拼圖會佔更多空間。
- 找一塊夠大的紙板(例如攤平的紙箱)當作底,素色面朝上,拼到一半要拍照留念比較美觀。
- 找一些小紙盒,或是有凹槽的保麗龍(買家電時在紙箱內的),分類用。
- 拼圖分類:
- 找邊:最重要的邊緣先分出來!!
- 依顏色區分,例如最醒目的紅色,建築的米白、天藍、雪白、黑色
- 左上的樹是失焦的部分,對應的是糊糊的拼圖片
- 斑駁色,包括兩邊下方的藍黑斑駁色、右邊超多樹枝區、背景細密樹林、不是很純白的白色(遠方雪山、左下積雪等)
- 剛開始先拼建築,也就是紅色和米色的部分
- 有些屋頂的雪可能會被歸到雪白類
- 被樹枝覆蓋,或是和背景相接處,在分類時可能也歸在不同的地方。倒也不用特地去找。
- 接下來是失焦的樹,但模糊的拼圖片看起來都很像,拼不順利。拼到一半先換兩邊下方的陰暗樹林。
- 右邊樹枝是最耗眼力的部分,有鑑於東湊西湊太費時(一堆樹枝、雪塊、葉子都差不多),於是出動Radiologist大絕,直接在原圖找絕對位置,然後放到紙板上大概的位置!當然還是有些小技巧
- 對原圖時最重要的是方向要對,例如雪會在樹枝之上、陰影在樹枝之下、雪塊的上半是較完整的圓弧、根據背景的顏色可以猜在上方還是下方
- 無法猜方向就只能四個方向都找,找的時候先盯著拼圖片,記住一些特徵,例如樹枝交叉的角度、雪塊的形狀、一塊特別形狀的陰影之類的。
- 因為和原圖比還是有色差,有時候先在紙板上已定位好的拼圖片比較,猜測大致的位置
- 原圖是相對比較小的,最好有個比例尺可以時時參考,例如已知拼好的某一雪塊的長度大概是拼圖片的大小,這樣對於手上這片的目標物大小比較有概念。
- 拼到七、八成以上,就不一定要對原圖,常常在半成品上比對一下就能找到位置,通常是老婆的工作,我繼續比對原圖
- 有了右邊樹枝的經驗,左邊的樹就容易多了,建築下方及左方的部分也是用類似的方法完成。
- 背景的細密樹林、遠山、天空、左下雪地則由老婆完成!
- 找時間再去雷諾瓦裱框。
結論:相輔相成的兩個技巧就是「找原圖絕對座標法」以及「鄰近片拼湊法」,優缺點大致剛好相反:
- 前者耗眼力,但一旦找到就可當作已拼上,一次找一片,不需要額外的空間放置散落的拼圖片。因為原圖和拼圖有色差、比例的問題,有時候找起來沒那麼容易。
- 後者在拼圖片數目太多時嚴重影響效率,而且需要額外的空間,通常要再依色澤、明暗度 分成幾個subgroup。優點是不需要分辨上下左右,拼起來就是了。拼圖片的大小寬窄、特殊片(全凸、全凹、三凸、三凹)也提供線索。
另外也找到新天鵝堡的3D拼圖,發現小時候好像拼過,真是有緣!
訂閱:
文章 (Atom)









































