星期一, 10月 24, 2022

Record of Lodoss War-Deedlit in Wonder Labyrinth-

Steam 頁面

 

全破了一輪。遊戲是橫向捲軸、類惡魔城遊戲。遊戲長度只有幾小時就能全破一輪。目前好像沒多周目要素。作為動作遊戲簡單爽快,裡面有些小機制,例如風火抗性要即時、輪流切換才能順利破關和打王有趣。

不過遊戲最香的,還是長腿精靈大姊姊蒂德莉特,哪怕是像素版一樣香。遊戲聽說還是羅德斯島戰記小說原作者的監督下完成的。

唯一小遺憾的是結局,雖然從小說續作已經知道了,但看到和帕恩的相遇只是夢一場,恢復記憶醒來後蒂德莉特去墳前告別,仍然是有點心酸。

全文連結

星期五, 10月 14, 2022

AI 研究小感

 壓力好像真的是寫程式的動力。

之前答應合作夥伴,解決土炮搜尋引擎中的查詢精確度問題(例如搜尋 dissection 跑出一堆 No CT evidence of dissection),打算用 deep learning NLP 處理並寫了研究計畫。
 
通過後花了很多時間自己標了 5000 份報告。樣本標好了,一直沒力做實驗。結果被 angio 的消息搞到嚴重焦慮,實驗就一口氣做完了。實驗過程中,我的 AI 能力也從調包俠順利轉職 Lv1 調參俠,還學會了通靈。
 
例如:class imbalance 太嚴重,模型 3 epoch 後全押 trivial answer 怎麼辦?
 
焚香入定向虛空無光之海祈禱,慷慨的虛空回應了真理:「Ez, Shuul'wah! Sk'woth'gl yu'gaz yog'ghyl ilfah!」歐我懂了 learning rate 要砍一半是吧?oh yeah 模型真的動了!!
 
從做產品的角度來說問題應該可說是解了,看到精美的 F1 score 和 accuracy 都 >95% 好到擔心是不是 overfitting。自己試了些 free typing 的自創 input 結果感覺還行,一部分的問題也有繞過或進一步 finetune 的思路。只要 model 扔進 pipeline 就行。
 
不過「研究」計畫產出的水論文階段真的就有點難倒我。上篇也是唯一一篇 published paper 還是快十年前的 case report 還是大佬手把手帶出來的,碩論雖然是資工相關但那是沒發表的文章。自己找了下 google scholar 看別人做的東西感覺賣點好像有限,方法也不 novel,得花腦筋想出夠好的賣點還有想辦法找高人了 XDDD

順便再次讚嘆 vast.ai,比特幣崩盤後租 GPU 的價格真的香,RTX 3090 24GB VRAM $0.3 USD/hr,model finetune 一次 17 分鐘解決,基本可以邊打報告邊 training ...
全文連結

星期三, 10月 12, 2022

大富翁三

Steam 頁面

大富翁系列是小時候很喜歡的遊戲之一,特別是二代、三代、四代(五代以後玩不習慣,都是玩了秒刪)。Steam 出了 DOSBox 版就入手了,二三代是重溫,四代是補票 XD

這幾天花了八小時把三代破過一輪,實現了孫小美的勝利 XD 以現在眼光來看,遊戲不困難,AI 太笨,特別是不會濫用道具和炒股存股。三代的道具店遙控骰子和路障還可以無限制買,搭配黑市存夠道具和卡片後基本就鎖定勝局,連 S/L都不大需要。

這塊地很值錢呢,他是我的了(使用購地卡)~
踩到噴錢的地點了,喔嫁禍卡和免費卡的複合式反應裝甲還有四層那沒事了~
AI 真是好心人有高價卡片都捨不得用拿來送我呢,看我用搶奪卡搶奪你所有的搶奪卡再搶走你其他高價卡~

不過 AI 雖笨,但回憶無價,當年玩二代三代的時候還是國小屁孩。現在重溫兼補票,很遺憾 Steam 版四代目前沒有超時空之旅,看未來官方會不會補了。

全文連結

星期二, 9月 27, 2022

老同學 Godie 見面

這次北台灣旅遊沒掀到人,反而回老家的時候掀到老同學。

Godie 是當年小學同學,後來又剛好同高中並且一起加入資訊社 TFCIS,上次見面應該是快 20 年前應該是 302 一起打 CS。命運的安排讓老同學上週五來奇美演講,就趁機掀吃飯了。

Godie 演講完後弄了自己的行程,順便回老家探望雙親順便換掉西裝,時間到在醫院見面,然後由我帶去吃附近唯一一家有冷氣且相對高檔的義大利餐廳 XDDD

隔了快 20 年,老同學們邊吃飯邊講古,我國小的事情只記得零碎片段,只零星記得幾個人名和一些瑣事,例如小六時幫 Godie 競選某個職位 XD

倒是 Godie 和一些同學有緣讀同所國中,一直保持聯絡最後也加了臉書。看到當年洽北北女同學變成照片中洋溢著幸福的二寶媽、另一個男同學變大人變帥還剛好在奇美(電子)工作,真的有時光飛逝滄海桑田的感覺。

吃飯中也聊了生活其他面向、工作、情感、居住無所不聊。連創業都聊,例如未來如果一起弄套交友軟體,一定要有特殊功能可以把優質對象直接下架並內線介紹給公司高層 etc XDDD。

這場快樂的吃飯以我地頭蛇請客結束。有老朋友來看我太難得了,也算是對當年大專乙組一題奪冠遲來的補請客了 :D

全文連結

星期四, 9月 22, 2022

Docker 取回硬碟空間

sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
Docker container 長時間執行後常遇到大量佔據硬碟空間,docker system prune 沒用,一個可能兇手就是大量 container log。用指令把冗餘 log file 清掉就能取回空間。新版 docker 好像有 log rotation 機制,有機會再研究 全文連結

星期一, 9月 12, 2022

台北旅行遊記

工作累積太多疲勞,剛好遇到中秋連假,就額外多請幾天,湊了六天連假來自助小旅遊。

本來考慮去九族文化村和日月潭,但想到本肥年近 40、體重近 90,續航力不佳,戶外景點很怕玩三小時人就沒力,然後就得回飯店待機。所以後來決定去台北。台北戶外玩累還可以玩室內行程,最不濟還有書局。這次行程玩了許多過去沒玩過,或很久沒來過的點。

這次去了陽明山。但這次沒做太多功課,純粹隨緣,結果有點失敗。大部分時間花在走路和搭公車移動上,吸了很多芬多精但沒看到太多景點有點可惜。 

陽明山上散步吸芬多精,來的時間不對,動線沒規劃完整,沒看很多景點,但至少吸了芬多精 XD


路上遇到野怪 -- 貓貓。貓貓看來並不怕人。至少肯擺 pose 給拍照


數位放大後的貓貓,不親人但也不怕人





回來前一天去了貓空。貓空是從來沒玩過的景點。貓空景點相對集中,下捷運動物園站後搭纜車到貓空站,然後徒步移動走玩右線和一部分左線。貓空真的有點日本小鎮的感覺。

貓空天恩宮,路過拍照,沒進去看


在貓空纜車上照到的街景

貓空夕陽照,剛好抓到太陽下山的 timing 


Y 區地下街照片,Y區地下街這次沒玩到太多,室內行程都去天瓏書局看書了



西門町夜景,新換的 S20FE 夜拍確實比前一支 LG V20 給力。

虎之穴店門口,還沒進店門在樓梯應該是可以拍照的 XD


天瓏書局,台南北門路的宏華收了以後,就沒有充滿電腦書的書店了。誠品電腦書不少,北門路也有天瓏台南據點。但純就數量而言台南沒一個比的上台北天瓏的量。

台北宅行程必逛安利美特,就算什麼都沒買來吸吸宅氣也好。永恆不變的入口照 XD

永遠的經典新世紀福音戰士。動畫擺了 N 年但永遠沒看完的一天 XD

 


新流行的作品,但個人對腐是完全不能接受的 XD

這次旅行唯一小遺憾就是沒掀到 Twsam,他說可愛小寶寶剛回家應該無法分身!看來未來幾年掀到的機率也非常渺茫了 QQ。當年 TFCIS iii 程設組五人,kochi 已知結婚生子,DNA 結婚更早,現在 Twsam 的狀態也從已知單身忽然跳到有小孩(看過低調的沒看過這麼低調的 XDDDD),DreamLinuxer 在美國,所以進度停滯不前的單身漢就剩下我了嗎?



全文連結

星期日, 8月 28, 2022

Bioshock remastered

好久沒廢寢忘食打 FPS 。這款躺在 Steam 吃灰很長一段時間,忘記為什麼忽然想拿出來打,但來了興趣就一口氣破完。

遊戲充滿了各種對立、矛盾元素。遊戲發生在海底遠離主世界塵囂的的烏托邦 -- 銷魂城(Rapture city)。裡面建築風格明明是幾十年前的美國,卻有遠超地表的超級黑科技,例如能讓人飛簷走壁、發射火球、閃電、甚至粒子化瞬間移動的基改技術。

但美侖美奐的城市卻因濫用基改物質(ADAM)和內鬥等因素,最後變成反烏托邦。美麗如渡假飯店的城市,內部最常見的住民卻是被 ADAM 侵蝕神智、精神失常的瘋子,或是被肉體心靈雙重改造蒐集 ADAM 的 Little girl 和其保護者 Big daddy。

遊戲的主線故事也牽涉到善惡兩極反轉,遊戲以主角墜機剛好來到銷魂城開始,在戰友透過收音機指導棋的幫助下,一路披荊斬棘幫自己逃生,並尋找殺死戰友家人、控制城市的惡魔。最後真相揭曉,惡魔也許不是好人,但戰友卻不是戰友。最後主角成功解除自身被埋下的心靈暗示,踏過屍山血海打死最終 BOSS,迎來結局。

遊戲的戰鬥系統有其特色,在後續系列作也持續使用。主角有 FPS 標配的槍械類武器的同時,也能透基改 plasmid 掌控各種能力,例如放電、引火、召喚蟲群、催眠他人等類法術能力、或提昇駭客技術、提高抗性等自我改造。主角也有駭客技術,遇到機械類敵人也能選擇解拼圖、改寫敵人邏輯取得控制權。遊戲連貨幣都有兩種,能買槍械子彈恢復藥劑的金錢,還有可以用來買 plasmid 或提自己能力的 ADAM。


遊戲過關還是要用點心思,特別是跟 Big Daddy 的戰鬥,對手攻高血厚硬拼往往拼不過,特別是什麼都缺的前期。要打贏必須用策略,例如激怒 Big Daddy 後把他引到被我方控制的火箭炮台。透過能造成麻痺的電擊 plasmid 不停強控、直到他被火箭炮擊殺。或是用催眠 plasmid 控制另外一個 Big Daddy 製造內鬥再減尾刀等。地圖本身也有少量解謎元素,例如被冰封的門要用點火能力打開、放在拿不到地方的鑰匙要用格空取物能力取得。

遊戲武器、Plasmid 都有升級系統。武器可以透過特定地點升級,解鎖更強的威力、豁免自己武器傷害等升級。Plasmid 可以在遊戲過程中買、合成更強的版本,付出 ADAM 解鎖更多安裝位置等。

遊戲有多重結局。結局好壞取決於怎麼處理 Little Sister。打倒 Big Daddy 後選擇殺掉 Little Sister 可以獲得更多 ADAM 卻會導向壞結局。選擇救贖 Little Sister 解除讓其變回常人,得到的 ADAM 會少一些,但從頭到尾都選救贖,遊戲才能有好解局。但救贖之路科學家其實會送禮表達感謝,算上禮物價值後其實 ADAM 沒少拿多少,我選擇救贖、最後看到好結局。

破關後再選 new game 發現有二周目 new game plus,但暫時沒力氣玩了。


全文連結

星期四, 8月 11, 2022

Autohotkey 抓多螢幕解析度方法

在公司打報告,希望用 OCR 判讀螢幕數字並自動抄錄以減少作業時間。這功能需要每個螢幕的長寬大小(pixel)才能讓程式知道 OCR 該看螢幕截圖的哪個位置。

原本是用 Autohotkey 的 SysGet Monitor 解決。但 SysGet 傳回的資料是錯的,也沒體力除錯了。為了省工不想寫額外程式,希望能用簡單的腳本解決。後來發現 powershell 可以做這件事情 

Get-WmiObject -Class Win32_VideoController | Out-File screen.out

輸出結果導向到檔案儲存,然後回 Autohotkey 從檔案中用 regex 從 VideoModeDescription 讀出解析度數值,然後做些加減乘除就有各螢幕大小和座標了。 值得一提的是其他的失敗方案:

Add-Type -AssemblyName System.Windows.Forms
System.Windows.Forms.Screen]::AllScreens

 這個 powershell 方法能得到全螢幕解析度,但會受到 scaling factor 干擾,得到的 width、height 必須乘以該螢幕的對應 scaling factor 才能還原為真實的螢幕解析度,但找了一陣子沒發現快速得到 scaling factor 的方法,因此就放棄此法。

[System.Windows.Forms.SystemInformation]::PrimaryMonitorSize 

這個方法則是只能得到主螢幕解析度,看不到第二第三顆的。

 年紀真的大了,花了一個半小時研究城市又開始眩暈 QQ

--------------------------------------------

$pinvokeCode = @" 
using System; 
using System.Runtime.InteropServices; 
using System.Collections.Generic;
namespace Resolution 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct DEVMODE1 
    { 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
        public string dmDeviceName; 
        public short dmSpecVersion; 
        public short dmDriverVersion; 
        public short dmSize; 
        public short dmDriverExtra; 
        public int dmFields; 
        public short dmOrientation; 
        public short dmPaperSize; 
        public short dmPaperLength; 
        public short dmPaperWidth; 
        public short dmScale; 
        public short dmCopies; 
        public short dmDefaultSource; 
        public short dmPrintQuality; 
        public short dmColor; 
        public short dmDuplex; 
        public short dmYResolution; 
        public short dmTTOption; 
        public short dmCollate; 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
        public string dmFormName; 
        public short dmLogPixels; 
        public short dmBitsPerPel; 
        public int dmPelsWidth; 
        public int dmPelsHeight; 
        public int dmDisplayFlags; 
        public int dmDisplayFrequency; 
        public int dmICMMethod; 
        public int dmICMIntent; 
        public int dmMediaType; 
        public int dmDitherType; 
        public int dmReserved1; 
        public int dmReserved2; 
        public int dmPanningWidth; 
        public int dmPanningHeight; 
    }; 
	
	[Flags()]
	public enum DisplayDeviceStateFlags : int
	{
		/// <summary>The device is part of the desktop.</summary>
		AttachedToDesktop = 0x1,
		MultiDriver = 0x2,
		/// <summary>The device is part of the desktop.</summary>
		PrimaryDevice = 0x4,
		/// <summary>Represents a pseudo device used to mirror application drawing for remoting or other purposes.</summary>
		MirroringDriver = 0x8,
		/// <summary>The device is VGA compatible.</summary>
		VGACompatible = 0x10,
		/// <summary>The device is removable; it cannot be the primary display.</summary>
		Removable = 0x20,
		/// <summary>The device has more display modes than its output devices support.</summary>
		ModesPruned = 0x8000000,
		Remote = 0x4000000,
		Disconnect = 0x2000000
	}
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
	public struct DISPLAY_DEVICE 
	{
		  [MarshalAs(UnmanagedType.U4)]
		  public int cb;
		  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
		  public string DeviceName;
		  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
		  public string DeviceString;
		  [MarshalAs(UnmanagedType.U4)]
		  public DisplayDeviceStateFlags StateFlags;
		  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
		  public string DeviceID;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
		  public string DeviceKey;
	}
    class User_32 
    { 
        [DllImport("user32.dll")] 
        public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode); 
        [DllImport("user32.dll")] 
        public static extern int ChangeDisplaySettings(ref DEVMODE1 devMode, int flags); 
		[DllImport("user32.dll")]
		public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);
        public const int ENUM_CURRENT_SETTINGS = -1; 
        public const int CDS_UPDATEREGISTRY = 0x01; 
        public const int CDS_TEST = 0x02; 
        public const int DISP_CHANGE_SUCCESSFUL = 0; 
        public const int DISP_CHANGE_RESTART = 1; 
        public const int DISP_CHANGE_FAILED = -1; 
    } 
    public class Displays
    {
		public static IList<string> GetDisplayNames()
		{
			var returnVals = new List<string>();
			for(var x=0U; x<1024; ++x)
			{
				DISPLAY_DEVICE outVar = new DISPLAY_DEVICE();
				outVar.cb = (short)Marshal.SizeOf(outVar);
				if(User_32.EnumDisplayDevices(null, x, ref outVar, 1U))
				{
					returnVals.Add(outVar.DeviceName);
				}
			}
			return returnVals;
		}
		
		public static string GetCurrentResolution(string deviceName)
        {
            string returnValue = null;
            DEVMODE1 dm = GetDevMode1();
            if (0 != User_32.EnumDisplaySettings(deviceName, User_32.ENUM_CURRENT_SETTINGS, ref dm))
            {
                returnValue = dm.dmPelsWidth + "," + dm.dmPelsHeight;
            }
            return returnValue;
        }
		
		public static IList<string> GetResolutions()
		{
			var displays = GetDisplayNames();
			var returnValue = new List<string>();
			foreach(var display in displays)
			{
				returnValue.Add(GetCurrentResolution(display));
			}
			return returnValue;
		}
		
        private static DEVMODE1 GetDevMode1() 
        { 
            DEVMODE1 dm = new DEVMODE1(); 
            dm.dmDeviceName = new String(new char[32]); 
            dm.dmFormName = new String(new char[32]); 
            dm.dmSize = (short)Marshal.SizeOf(dm); 
            return dm; 
        } 
    }
} 
"@
Add-Type $pinvokeCode
[Resolution.Displays]::GetResolutions();

方法出處 

結果本以為能用的方法失敗,最後換了這個方法,在 Autohotkey 中呼叫 powershell.exe 執行這段腳本,用 Out-File 導出成文字檔用 regex parse。 話說 powershell 可以直接執行 C# 代碼耶,作為「腳本語言」這會不會太強了點?XDDDDD

全文連結

星期日, 7月 24, 2022

再戰 VB6

VB6 自動化研究又有了進度。爆肝摸索、找了可靠的第三方庫、殺了一卡車 bug、解完山一樣高的例外,看完海一樣深的 log 以後,自動化表單查詢程式終於穩定運行,也不枉昨天搞到 9PM。

禮拜日開一天,就看到機器人已經查了約 500 份病歷。這樣查詢完 N=2~3K 的 study 還真的就電腦多開幾天的事。資料齊了後用 python 簡單統計和 NLP,應該就能生成大部分夥伴和統計專家需要的資料。
 
可以的話還是希望能用 SQL。從 VB6 form dump 資料其實比直接下 SQL 複雜很多,效能還差。幾行 SQL 就可以解決的事,為了合法合規不得不用複雜的方式。
 

 
全文連結

星期日, 7月 10, 2022

醫療人員寫程式有用嗎?

 改自 ptt 的發文

以個人經驗來說,醫療人會點程式有沒有用?個人經驗是有的,我自己弄的東西:

關鍵字搜尋引擎

有引擎前,蒐集 case 主要靠自己作筆記。有引擎後 keyword 和查詢條件丟下去 case就噴出來。可能辛苦作筆記收了不曉得多久才能收一兩百個,引擎只要用正確的搜尋條件一分鐘就生出一千個。

查資料自動化

最近做回溯研究收案超過兩千個。這幾天弄出 RPA 機器人可以自動填病歷號查資料,申請通過正式上線。一樣的事情,別人可能要弄經費、請助理、花不知道多久搞定。我自己做可能電腦多開幾個晚上還不用想辦法找錢。

各種自動化和改善工作流程

學會 Autohotkey,可以打 fu 自動變成 Advise follow-up,一鍵自動從其他表單帶入資料、一鍵文字自動排版...

隨著技能樹越來越深廣,能做的事情還能越來越炫炮,例如



幫普通表單程式加上改字型、拼字檢查、自動完成、顏色佈景...等功能。潛在應用的地方很多,例如 HIS 或 RIS 各式表單程式。

以前會想:這種事委託專門單位、學校、或是外包廠商不就能做?自己會的價值在哪裡?

後來發現專門單位可以非常忙,手上待處理的案件可以到四位數。需求如果對全院不夠重要、急迫不一定能可以做,可以做也可能要排隊,排隊成功程式開始做也可能要反覆修改處理眉角問題,每次修改可能又是另一個循環。學校或外包廠商做,要想辦法弄資源,弄計畫、請經費、etc,一個程式綁一堆東西,原始碼還可能在別人手上、以後只能一直投入。自己弄就沒有上述一堆問題、程式想改就開記事本改就好。       


「又快又好」是可能形成價值的。以大規模撈 case 查資料做回溯性研究為例,別人流程是:

1. 寫申請單委託資訊單位
2. 花時間排隊(可以等很久
3. 得到結果,發現眉角問題、協商修正 * N(用 nodule 查結果 Nodule、nodlue 沒撈到 etc.)
4. 請助理一筆筆查資料整理
5. 生成那張跑統計的 Excel 表格。

而如果都能自己做呢?可能 IRB 通過的當天,下班前搜尋引擎就把 case 列出來了。然後多花幾個晚上用機器人把資料查好。最後用 python 字串、報表分析,很快就能統計好大部分資料,這時候可能別人還在排隊。大幅改善效率,就能大幅降低投入成本和時間,就能顯著提高研究成功率。這時哪怕作為醫療人員和研究者的本職技能都不頂尖,別人也會願意合作。
                                                               
就算一時做不了這些事,起碼也能讓自己上班更輕鬆。別人花時間按 Enter 和空白幫報告排版還是從其他系統抄數字,你一鍵就無腦完成,更快下班不好嗎?如果喜歡寫,替自己節省精力,創造機會的同時還能做喜歡的事,緩解 burnout 不香嗎?

所以如果本來就有寫程式的興趣,可以繼續鑽研深入,然後設法找自己周圍有必要但別人顧不到的事,遵循法規、看好政治和環境允許的限度,抓準機會切進去,programming skill 不會虧待我們。

至於學哪些語言,我是學 Python 和 Autohotkey 為主。AHK 主攻辦公室自動化,Python 補一些 AHK 不好做的事情,例如運用瀏覽器自動化測試套件自動點頁面之類。Python 也可以銜接 Machine Learning 和 Deep learning。另外零碎玩過一些 Rust、C/C++、PHP 之類的東西,但這些對醫療職業可能就不那麼直接有用。

值得一提的是數學,有後悔沒趁年輕的時候學好數學,最近鑽研 Deep learning 和統計都遇到數學的檻,回頭補同濟的高等數學。結果現在奔四體質變差很多,用腦一多就 tinnitus 甚至 vertigo,而且有些基礎的東西忘了還要「復健」。所以如果還在學校,學習數學其實是好選擇。程式語法那些在有明確目的的情形下快速入門不難,但數學就不行。線性代數和微積分剛好也是現在 deep learning 會用到的東西。  

全文連結

星期四, 7月 07, 2022

Python future 安裝 No module named 'src' 解法

安裝 Pyinstaller 時會自動安裝依賴包 future,然後就遇到這問題,從連結找到解法。 手動去 github 抓包,解壓縮,setup.py 中 import src 之前加入一行 statement 即可:
sys.path.append('')
其實 sys.path.append('.') 也可以。看來是 path 的問題。弄好後 python setup.py install 問題解決!
全文連結

星期一, 7月 04, 2022

魔法少女天穹法妮雅

Steam 頁面

夏特時收的小遊戲。一打開就廢寢忘食通關主線。「實用」部份非常實用該有的都有,不多描述>////<

撇開實用,RPG 的部份也屬於上乘,劇情就簡單流暢的王道魔法少女變身救世,戰鬥方面多種難度可選,角色 Build 有彈性,近身格鬥或各系魔法隨選。

蒐集要素多,各式打材料、拼練成,開寶箱或練成的特殊道具可以開特殊玩法,例如把魔攻倍增普攻變 1 的特殊道具,可以打造純粹的魔法砲台少女,或是花海量資源和肝才能疊出的自動秒殺裝再瘋狂跑圖練級,不小心就跑到 99 級 etc. 。

遊戲還有多週目要素,可以繼承等級、道具、魔法提昇難度進行虐菜挑戰。看網路上攻略一堆練功魔人想發設法疊滿屬性,角色屬性貼出來讓人懷疑這真的是同一款遊戲嗎 XD

無論是作為 RPG 本身的劇情或「實用」成份都屬於上乘。Steam 上的好東西越來越多了。 全文連結

星期六, 6月 25, 2022

吐槽 VB6

 最近又一次受 VB6.0 荼毒迫害。

最近和其他單位同事合作回溯性分析,分析公司用戶資料。資料能透過資訊系統一筆筆查,問題是筆數多(N>2K),資料分散在不同報表程式和網頁表單上。因各種因素,不能直連 production DB 下 SQL。反覆請人代撈實務不可行。但政策不禁自動化軟體代替鍵盤滑鼠操作報表軟體,只要遵循審查流程。

然後就又跟 VB6.0 槓上了。很大部份資料需透過一 VB6.0 報表軟體查詢。報表軟體上有 ListView 顯示用戶的多筆紀錄,操作者點選 ListView 上的紀錄,程式跳出對應該紀錄的進一步細節。

真人鍵盤滑鼠操作沒啥問題,用自動化 VB6 就開始不講武德。

在家中做模擬,就發現 MSDN 上的東西很多對 VB6 沒用。例如,MSDN 說 LVM_SETITEMSTATE 可以改變 ListView 目前被圈選的 item。實際使用畫面上 ListView 被 highlight 的 item 會變,但後續 side effect 不會觸發。又例如 MSDN 說 LVM_SETITEM 可改變 ListView 呈現的資料,結果實際使用只會改畫面上的資料,隨便重排資料修改就不見了。

那用 code injection 解決呢?很久前就試過,VB6 編出來的 code 本質是編成 native code 的虛擬機操作,大量意義不明的中間變數和莫名操作,一切 control flow 最終回歸 MSVBVM60.DLL 和元件庫。有效操作被嚴重稀釋。逆向天然自帶虛擬機的 binary 嚴重超過我業餘用戶的能力,我連自己寫的 mock 都沒辦法分析,生產環境中的報表軟體就不用試了。

最後,又一次倒在 VB6 鐵拳之下,還是只有模擬鍵盤滑鼠按鍵的方式可行。方案沒技術含量,而且使用期間電腦不能操作,但自動點選存資料還是弄出來了,之後走審查流程後就在公司內正式開發、使用。順利的話能解決分析需求,還有機會與另外一個 side project (搜尋引擎)形成連動,做成一條龍。

業餘 side project 坑好像越挖越大,一開始是好玩,然後是實用,現在目標變成發展產業鏈了 XDD。但還是要吐槽 VB6,根本就上個時代的遺毒...

全文連結

星期四, 6月 23, 2022

讀書:程序員進階心法:快速突破成長瓶頸

博客來

書本其實並沒有單一的主題,而是將有關程序員成長的方方面面,從入行、職業路線的進階,為人處事、找工作、如何寫好代碼等都全部帶到,而且都有足夠深度。感覺是長期累積的心得文集。有人說這本書應該可以多讀幾次,每次都能感受不同的醍醐味。

全文連結

星期四, 6月 09, 2022

高等數學同濟七版

亞馬遜連結

最近很多研究活動在數學上撞牆,只好拿書回來念。目前快唸完第三章,做了點習題。目前學起來還算舒服,連我這奔四並且數學倒退到初中程度的大叔都勉強能跟上,有些東西跳著看,例如三角函數或曲率這累跟我本行沒半毛錢關係、業餘研究很可能也用不到的就不客氣的跳了。

這書知乎評價看來普通,有人說這套「如果你不是美食家,也不是嚴格控制營養攝入的運動員,只是想舒舒服服吃頓飯,同濟版高數還是很不錯的。」不過我只是想用最短時間,快速學過自學工科需要的數學,應該也夠用了。未來想更進一步再換更好但更花時間的教材吧。不想學數學的工程師不是個好醫生(?)




全文連結

星期二, 5月 31, 2022

閃紅的艾麗絲

Steam 全年齡版購買頁面

別人的遊玩影片 XD

某次趁特價入手的 Steam ARPG 小品黃油(羞)。最近剛普通難度通過一輪。

故事中規中矩,就英雄巫女拯救世界。特色是動作非常有打擊感確實夠要求技術。另外有豐富的收集、再挑戰和多周目元素。第一周照攻略花了很多時間弄了釣魚、蒐素材繼承武器 etc.。破台一輪後出現挑戰模式,可以獎勵點數強化下週目角色等。

攻略中那種無傷打出幾百連擊實在太誇張了,我劇情黨後期只用一兩招反覆搭配食物補血硬換而已....哪天想打困難、地獄模式再開來研究吧 XD

全文連結

星期日, 5月 29, 2022

ReadThisPaper

官網

臉書 Python Taiwan 社團上看到的。

輸入論文標題後可以搜尋論文,然後網站按照順序排列出搞懂這篇論文需要理解的其他論文,自動化生成「技能樹」

用 NegBERT 論文丟進去試了一下,確實找到了些確實有關的基礎論文,未來要寫 paper 可以試試。

全文連結

星期五, 5月 27, 2022

Windows 下簡單安裝 Python 3.9 和 PIP 方法

出處

雖說在 Windows 下寫 Python 大多時候我靠 WinPython 解決,但特殊情況下可能需要可攜、精簡的 Python 執行環境。官方的 python windows embeddable package 內容簡單,但缺少 PIP,而這篇文提供了裝好 PIP 的方法。

修改 python39._pth

第一行加入 Lib/site-packages,最後一行 import site 移除註解,改好後檔案類似   

Lib/site-packages
python39.zip
.

# Uncomment to run site.main() automatically
import site

下載安裝 PIP

接下來進 python 根目錄,下載 get-pip.py,然後用 python 執行

python get-pip.py

設定可臨時改動 PATH 的腳本

set PATH=%PATH%;%CD%;%CD%\Scripts

寫好存檔後在 python 目錄下執行。

一切弄好後,試驗 pip install selenium 成功!

全文連結

星期一, 5月 23, 2022

Dungeon Hack 遊玩心得

 

小時候 DOS 時代的的回憶,中文操作手冊還保留很久當成故事書看 XD。真的二十年沒玩了,趁最近上架 Steam 就買回來懷舊。Steam 版還是有小問題,就是沒有雲端存檔,要手動備份同步存檔,不過 DOS 遊戲目錄結構簡單,存檔位置很好找。

以現在眼光來看,遊戲有些機制其實太 hard core。高難模式死掉強制刪存檔。某些會負能量攻擊或石化的敵人太強,一打中就是掉等級或秒殺。遊戲還很少鑑定手段拿了一堆藥和裝備不知道幹麻,等快過了才從攻略網站知道有艾恩石可以防石化即死或負能量打落等級。

遊戲平衡也不大行,牧師太強勢了,治療、提供食物、防負能量打落等級、水下呼吸、解詛咒裝備、解毒....都集中在同一個職業,導致有沒有兼職牧師打起來根本就是兩款遊戲。

不過這遊戲不是玩遊戲性,是玩懷舊時光穿梭回憶小時候的,小時候很害怕陰暗地下城的氣氛,英文還不好,好像從來沒下過第二層,這次 Steam 版終於破了一輪 XD

全文連結

星期三, 5月 18, 2022

系列文章:Step by step guide to master natural language processing

Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8
Part 9
Part 10
Part 11
Part 12
Part 13
Part 14
Part 15
Part 16
Part 17
Part 18
Part 19
Part 20
簡介 NLP 的一系列文章,深入淺出,涵蓋面夠廣。裡面的 python 代碼不是重點,對概念的簡單說明和範例才是 XD。TutorialsPoint 也有簡介 NLP 的文章但寫的太 formal。缺點大概就是寫到 Topic modeling 以後「筆力」就不大夠了。但整個系列作為讀書前的導讀應該還是不錯的。 全文連結

星期四, 5月 05, 2022

星期二, 5月 03, 2022

閱讀:Clinical Notes — The “Negative” Story

連結

否定語句(Negation,例如 No evidence of embolism)在放射科報告很常見,但特定情況下會造成困擾,例如我目前經營的搜尋引擎,輸入關鍵字會連否定句裡面的內容也被列入搜尋結果。

這篇 Medium 的文章深入淺出的總結了 negation 有關的概念並總結了一些處理方法。對常見 negation pattern 的總結是亮點,例如

Termination patterns: abdominal pain denied
Prefixes: non-diabetic, non-hypertensive
Double negation: not abnormal, not unusual    
Symbols usage: Hypertension +, Diabetes -
Positive/Negative usage: Hypertension positive, Diabetes negative.
Yes/No phrases: Hypertension — No, Diabetes — Yes, Urinary problems — No.
Use of more generic language than clinical terminology: No complaint of high sugar (rather than No Diabetes).

其實還有一些是作者沒提到的,例如病歷上的英文可能不符合英文文法(例:no fracture or dislocation seen),這對基於語法分析的方法(例如 NegBio)可能會有影響。symbol 實際上病歷也有很多種,(+)(V)(O) 我都看過 XD

這篇的缺點是引用的處理方法(NegEx 等)有些舊了。連 NegBio 都沒提到,更後面的 deep learning 方法當然沒有了。


全文連結

星期一, 5月 02, 2022

星期日, 5月 01, 2022

星期六, 4月 23, 2022

Basics of Linear Algebra for Machine Learning: Discover the Mathematical Language of Data in Python 讀後感

書本簡介

本書完全從學習 ML/DL 的應用角度出發,內容非常淺,還有大半篇幅是 python 代碼。如果是正經學習線性代數這本書不夠,但對非工科出身,在工作之餘為了 ML/DL 才回頭研究的人來說,這本就合適,最起碼可以快速鳥瞰跟 ML 相關的內容,也不會迷失在 ML 相對用不到的細節裡,200+ 頁的篇幅也很快可以看完。以後需要學更多東西再找別的書補完。





全文連結

星期日, 4月 10, 2022

文石 BOOX Note5 入手!

閱讀大量文件時,用電腦或 ipad 看久眼睛很累,還是習慣用 e-ink 電子書閱讀器。

原本機器是 N 年前從露天花幾千元入手,賣家裝好多看系統的二手 Amazon DXG。多年來使用愉快,只有中間換過幾次電池。

但最近好幾次看 PDF,電腦上沒問題,但 DXG 全部顯示空白頁面,Google 起來疑似多看系統 bug。而 DXG 的多看好像 N 年沒更新,至少我找不到,決定換新機。

新機首先希望是 10.3 吋。6 吋、8 吋看久實在不舒服,不要求能放口袋。另外希望可以看不同店家的電子書,不要鎖死在閱讀器官方商城,所以只考慮開放系統。

原本想買 HyRead 產品,但現場試用有莫名卡頓感,PTT 上也有類似抱怨,一些慣用操作如文件放大旋轉瀏覽也不順。Boox 的機器試用就順手很多,決定改買 Boox Note5。請店員設定,裝好 Google Play 後帶回家。

新機放大旋轉檢視 PDF,換頁流暢度遠勝舊機,少了切幻燈片的卡頓感,一時還不大習慣 XD。App 試了 JPTT 和內建瀏覽器 Wifi 上網。第三方 App 能裝能用,以後裝不同商城電子書或裝 App 看不同格式文件應該沒問題。

DXG 就從此安心退役了。

新舊機器比較圖,左方 DxG 右方 Boox Note5,新機器的螢幕大一些,也沒有佔空間的實體鍵盤。

新機器看 PDF,大螢幕看起來還是比較輕鬆。

全文連結

FFMpeg 影片批次轉檔

 出去玩時喜歡手機錄影,每次回來都一堆影片檔。原始檔案都很大,直接上傳太佔空間,需要批次壓縮。

原本作法是用 anyvideo converter 批次處理,但 GUI 操作繁瑣,也不喜歡裝癰腫的軟體。後來發現 ffmpeg 也可以做一樣的事情。

FFMpeg 命令列產生器

先用上方連結點選 GUI,頁面會自動轉成 FFMpeg 需要的命令列參數。可以把它記下,不用每次都去網頁點,我得到的參數是這樣的:

ffmpeg -i 輸入影片 -c:v libx264 -preset slow -crf 20 -c:a copy 輸出影片


套上 Windows cmd 下可用的迴圈語法,就是

for /r "來源目錄" %a in (*.mp4) do ffmpeg -i "%a" "輸出目錄\%~na.mp4" -c:v libx264 -preset slow -crf 20 -c:a copy
用這方式就不需要每次都開 GUI 調參,目錄指定好就流水線處理到底了。

全文連結

星期二, 3月 29, 2022

文章:Fine-Tuning BERT for text-classification in Pytorch

文章連結

這是簡介用 PyTorch 進行 BERT fine tuning 做 downstream task 的很簡單入門文章。亮點是簡單、圖漂亮、有程式可參考。可以當作 cheatsheet,適合已經了解重要概念後(例如何為 transformer)要寫程式時回頭參考,用來入門則太簡略。

因為自架業務部門搜尋引擎,需要處理 negation 等問題的原因,未來跟 NLP、BERT 打交道的機會應該不少,收錄這篇供自己回頭參考 XD

全文連結

星期二, 3月 22, 2022

Unsupervised Text Classification with Lbl2Vec

Github
介紹文

今天被 Medium 演算法推薦,蠻有趣的思路。

這個庫的功用是做 text classification。特點是對每個 category 設定至少一個關鍵字後,就可以用 unsupervised 的方式對文本進行分類。

整體原理其實接近人類分類的方式。人類大量分類文章的時候,可能看文章出現特定關鍵字就歸類到特定分類了。

而 Lbl2Vec 如果我理解沒錯(錯了再改 XD),則是先將 word 和 text 在同樣的 feature space 做 embedding,先將 text 依據對 keyword 的「距離」先分類一次,去掉 outlier 後求每個分類的 centroid,再根據新算出的分類 centroid 正式分類所有 text。

這樣分類的方法可以不用標註部分資料,只要每個分類都能找出至少一個 keyword 就好。之前研究的地址分區里問題感覺或許可以用,也許未來有緣就當作備案試試看。

全文連結

負面範例:Predicting Tesla Stocks (TSLA) using Python & PyCaret

文章連結

難得 Medium 的演算法會推薦辣眼睛的文章,放在腦海裡越想後勁越強 XD

文章標題很吸引人,利用 python 和 PyCaret 來預測特斯拉股價。但看到一半,作者吹噓「用了 PyCaret,模型不調參 R square 也就是正確率有 99%」就喉頭一甜,差點吐血。

網頁下拉,細看 test data 的 feature,赫然看到 feature 裡面有今日高低價。已知今日高低價,用模型求收盤價???如果投資者買賣股票的時候能預知今日高低價,又何需機器學習?

有這種條件,模型乾脆再簡化點,直接高低價相加取平均當模型輸出就好,連 linear regresser 都不用,拿來有漲跌幅限制的國家使用 performance 會更好 XD

另外作者選用的所有模型都只是拿單日開盤資訊 fit 收盤價,完全不參考過去行情。模型不用參考過去行情,僅憑單日資料就有 99% 「正確率」,作者不覺得哪裡不對?

討論區反而有亮點,PyCaret 開發者親自回應,指出文章 technical flaw 很多,這種文章只會傷害 PyCaret。很遺憾我調包俠無法看出全部問題就是了 QQ

----

結果作者還來回應我的吐槽,作者指出「可以用 API 做更細的時間粒度,例如以 5min 為單位預測股價」。

問題根本不在這裡好吧?看起來就是作者隨便拿了 data,就隨便丟給模型去 fit,對 feature 完全不理解,連常識等級的 domain knowledge 都沒有。看到結果也無法反思。

這種派大星都可以當 data scientist 在 Medium 寫文章教人,我忽然覺得我也可以學好 XD

----

結果我 Medium 第一個 follower 就是被我吐槽的作者 XD

全文連結

星期四, 3月 03, 2022

DuckDNS

VPS 買的 noip 域名到期了。noip 免費版每個月就要手動更新一次不然域名會失效。每年 24.95 美金也覺得不值得。我只是要連到自己的 VPS 而已。隨手搜尋一下免費 DNS 就換到 DuckDNS。

DuckDNS 官網看起來簡陋,看起來像小團隊自架的免費服務,但使用起來很簡單。直接用 Google account 登入,頁面填想要的域名,照著 install 頁面設定 crontab 定時執行 HTTP update API,不到 10 分鐘新域名就可以用了。install 頁面還很貼心的會根據實際使用者自動修改頁面中的教學,自動帶入正確的域名和 API key。只要 curl 和 crontab 有裝,直接一步步複製貼上頁面的指令就好。

應該會改用這家了,只要把一些工作用腳本指向新域名就好 XD 


全文連結

星期一, 2月 28, 2022

Gunbuster 觀後感

 Gunbuster 是 1988 年的老動畫,之所以認識這部動畫,是因為追動漫鋼琴時偶然追到了 Pianeet 的 Gunbuster Fantasy 組曲。因為曲子好聽去追原動畫 XD


這部動漫的監督是新世紀福音戰士的庵野秀明。本作的本意是彌補製作「王立宇宙軍」造成的巨大虧損。動畫刻意集合了各種「宅」要素力求打開市場,結果「王立宇宙軍」沒紅,這部為了彌補虧損而做的作品反而大紅了。

前三集是真實系開局,天真活潑 or 傻白甜女主經歷艱辛登上宇宙。後來經過各種挫折,特別是在戰場上無能導致坑死自己初戀後,逐漸成長為獨當一面的 Gunbuster 駕駛員。

本作對人物和感情刻劃非常深刻,因為反覆在接近光速的情形下執行任務,與地球上的朋友無可避免出現「時間差」。姊姊與教練的悲戀。為了挽救人類,兩人選擇自我犧牲選擇進入 Buster Machine 3 號,容格乘著量產機陪同赴死被勸回,歷經萬年漂流返回地球,地球亮出「歡迎回家」伴隨著音樂全劇落幕。聲優真摯的演技和悲壯的音樂更把整部作品盤活。

神作。

全文連結

星期五, 2月 25, 2022

成人鋼琴班愉快學琴中, 老師教新曲子,趁這首還沒忘之前留影紀念。這已經是錯音、漏音、糊掉最少的版本。

從「自我檢查」的角度來說,錄音錄影其實比單純錄音就好,搭配影像還可以回憶當時用力的情形。

總而言之,不漏音好難,控制手速避免不自主飆車好難。彈到後面手軟掉變成不曉得什麼東西 XD

全文連結

星期日, 2月 20, 2022

李宏毅老師 youtube 深度學習課程:attention、transformer、BERT

【機器學習2021】Transformer (上)
【機器學習2021】Transformer (下)
【機器學習2021】自注意力機制 (Self-attention) (上)
【機器學習2021】自注意力機制 (Self-attention) (下)
【機器學習2021】自督導式學習 (Self-supervised Learning) (二) – BERT簡介
【機器學習2021】自督導式學習 (Self-supervised Learning) (三) – BERT的奇聞軼事 

為了研究 BERT 能否解決 negation detection 決定線上進修,剛好找到李宏毅老師的課。

之前上過吳恩達老師在 deeplearning.ai 的深度學習課程。兩位老師的課都非常的深入淺出,吳老師的課有作業,李老師的課程內容比較新,技術細節講的比較深細。

看了幾堂 attention、transformer 和 BERT 的簡介有相見恨晚的感覺。 暫時沒時間寫濃縮筆記,先發文佔樓,以後想更再更吧。這個清單還沒放上李老師對 BERT variant 的簡介,有看再放上來。

全文連結

星期三, 2月 02, 2022

「超速學習」閱讀心得


 

一直對「如何學習」很有興趣,這本讀完感覺不錯,決定用它寫心得,寫心得的同時也是運用其中的技巧,鞏固內化書本上的知識,也方便未來的自己提取技巧不用整本重讀。

這本書重要概念大概如下:

後設學習

確定「為什麼、做什麼、及怎麼做」,「怎麼做」可以切分成「概念、事實、程序」。後設學習可以佔整體計畫的 10% 時間。後設學習可避免學習毫無目的性,在無限的知識中沒有效率的「漫遊」

專心致志


講拖延症、專心的重要性和專心的技巧。

實質上我認為最好的技巧,也是書本沒有講的,是每天花時間冥想。冥想可以實際上改造大腦。變得可以忍受工作和學習中的難受、沉悶和從根本上控制住分心(掉舉)。

直截了當


用「最短路徑」去達成學習目標,例如學語言,就直接去需要該語言的生活環境,學工作技能就從做中學。

反覆操練

其實覺得這個名字不完整,因為書中的例子還包含很多「分而治之」(divide and conquer)的技巧,例如學音樂把譜分段,並針對不會的困難段落反覆練習。

提取記憶

用測驗、回想...來鞏固記憶,不是學完就算了。

意見回饋


我想這是自學者最欠缺的。其實有人潑冷水比自己「十年磨一劍」好的多。

我學專業技能之所以能有進度,很大是因為學長姐,臨床同仁甚至病人會給「回饋」。做了錯誤的判斷就會從回饋得到「重拳」,就會一直進步。

但「重拳」太重也可能把人擊垮,可能必須在「不痛不癢的回饋」和「太重的重拳」中間拿一個度。

保留記憶

書中提出了幾種技巧來克服「遺忘曲線」的問題。淺見比較有用的方法是「過度學習:超越完美的練習」和「記憶法」。考專科的時候不自覺的用了這些技巧。

培養直覺

覺得翻譯為「技能直覺化」比較好。將學到的技能內化為直覺。

個人經驗上這是個水磨功夫,只有不斷反覆熟悉技能、接受回饋,試著簡化提取要點才能題取出技能的「神髓」才能內化為直覺。

例如當年自學軟體重構的相關知識,書都會教「何時該重構」,但實質上我不是用背的,而是很多次栽在充滿壞味道上的坑以後,對坑的感知因為大量經驗內化形成直覺,跟本不用背,也不會忘記,甚至書本講的「何時該重構」也只是印證了我的經驗而已。

勇於實驗

書中提到各種實驗技巧,在不會太痛苦的前提下,擴展現有的技能樹使之更全面,跨出舒適圈。


看完這本書以後,覺得最無腦的技能入門方式其實是去上針對性、有提供測驗的線上課。線上課除了最後兩步(培養直覺、勇於實驗)外幾乎都涉獵到了。至於後兩者也只能技能稍微入門後再自己反覆錘鍊、內化和擴展了。

全文連結

星期六, 1月 22, 2022

Linux 監控 CPU 使用率腳本

Linode 寄信提示 CPU 異常使用率,超過 90% 使用率,一次好幾小時。根據網路拼湊、修改出腳本來定期監控 CPU 使用率。原則上五分鐘監控一次,使用率超過 70% 觸發 log,log 寫在監控腳本同目錄下。

cpuuse=$(cat /proc/loadavg | awk '{print $3}'|cut -f 1 -d ".")
if [ "$cpuuse" -ge 70 ]; then
MESSAGE=$(date +%s).log
  echo "CPU current usage is: $cpuuse%" >> $MESSAGE
  echo "" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "Top 20 processes which consuming high CPU" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "$(top -bn1 | head -20)" >> $MESSAGE
  echo "" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "Top 10 Processes which consuming high CPU using the ps command" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "$(ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10)" >> $MESSAGE

else
  echo "CPU usage OK"
fi

腳本存好,chmod +x 以後下 crontab

crontab -e
*/10 * * * * /bin/bash /opt/scripts/cpu-alert.sh

以目前使用者身份執行腳本一次(不一定跟 cron 同使用者!),確認腳本沒問題

crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done
全文連結

星期四, 1月 20, 2022

QNAP docker 建置 nginx reverse proxy

問題背景:我開發的關鍵服務建置在公司內虛擬機(VM),虛擬機放實體 NAS( QNAP)。基於未知原因,公司內某些網段的電腦無法直連 VM,tracert 顯示路由到 default gateway 就掉。

Bug 還在協商溝通,暫時解不掉,只能先想辦法繞過。因關鍵服務大多利用 HTTP,所以決定用 nginx 建立 reverse proxy 解決。

整件事最大困難:QNAP 系統高度自製,很多資料找不到。很多工具沒有裝(例如 apt-get)。

本來考慮用 QNAP 軟體市集找 nginx,失敗,改用 container station 上。用 nginx container,以 docker volume 覆蓋設定檔。

然後發現 container station GUI 並不友好。例如 exposed port、volume 等參數每次建立 container 都要重新指定,非常麻煩。docker volume 還只能指定一整個目錄,無法只覆蓋目錄下的單一檔案,所以萬一 config 檔同目錄還有其他檔案就不好處理。

後來解法是 ssh,command line 用 docker 指令就好。container station 的 GUI 只是套殼,其實沒必要用。docker 指令操作結果也會反映在 container station 的介面上。File Station 看到的 Public 資料夾在 /share/Public。文字編輯可以用 Text Editor 就不必用沒調整過的 vi,還支援瀏覽器貼上!

QNAP 上 docker 操作 nginx 我用的指令如下:

docker run --rm -p 9080:9080 -p 8888:8888 -p 9090:9090 --name nginx -v ${PWD}/minimal.conf:/etc/nginx/nginx.conf:ro -d nginx


nginx.conf 設定檔長這樣
events {}

http {
client_max_body_size 0;

server {
listen 9080;
server_name <QNAP 內網 IP>:9080;
proxy_set_header Host <QNAP 內網 IP>:9080;

location / {
proxy_pass http://<VM IP>:80;
}
}

server {
listen 9090;
server_name <QNAP 內網 IP>:9090;
proxy_set_header Host <QNAP 內網 IP>:9090;

location / {
proxy_pass http://<VM IP>:808;
}
}

server {
listen 8888;
server_name <QNAP 內網 IP>:8888;

location / {
proxy_pass http://<VM IP>:8888;
}
}
}
port 9080 和 9090 分別對應不同 Laravel 服務。port 8888 給 jupyter-notebook 用。

jupyter-notebook 必須修改 NotebookApp.allow_origin 允許 cross origin API 不然修改會無法存檔。

nginx 設定 client_max_body_size 是避免用 notebook 上傳檔案的時候因檔案太大導致上傳失敗,設定 proxy_set_header Host 可避免 Laravel 的 redirection 錯誤導向到 VM IP。

Laravel app 也必須修改,包括:
.env
PROXY_URL = <QNAP 內網 IP>:port
PROXY_SCHEMA = http

app/Http/Middleware\TrustProxies.php
protected $proxies = [
    '**'
];

routes/web.php
$proxy_schema = env('PROXY_SCHEMA');
if (!empty($proxy_url)) {
    URL::forceRootUrl($proxy_url);
}
 
if (!empty($proxy_schema)) {
    URL::forceScheme($proxy_schema);
}

設定好後需重啟 Laravel
其他工具也可以透過 docker 使用。例如使用 git docker container 把 working directory 掛載進去做 commit。就可以繞過 QNAP 一堆東西都沒裝,偏偏還不好修改的問題。
全文連結

星期二, 1月 18, 2022

好站:小狐狸事務所

 連結

舊的站台書籤隨著換樣板全不見了 XDDD

閒逛發現的好站,部落格文章種類非常多,投資理財,大數據、深度學習、區塊練...都涉獵了。

重點是文章產量大且穩定,同樣是寫了 10+ 年的部落格,我就做不到持續產出。

其實寫筆記也是確保學習效果的好方法,單純看過可能很容易就忘,也可以留下自己曾經做過得紀錄,該勉勵自己了

全文連結

星期一, 1月 17, 2022

有趣的網路 bug

 幫公司做的土炮搜尋引擎和某些服務放在某虛擬機,稱 VirtA
VirtA 放在實體 NAS 上,稱為 NasA

公司內某些 PC,可以連 NasA 但連不到 VirtA,所有 port 都不通。tracert 顯示封包到 default gateway 就掉包。公司內不同網段的 PC  則完全正常,但產生連線問題的 PC 逐漸增加。

聯絡了資訊單位和科內真資訊大佬,做了各種諮詢和推論。最後被科內大老依照經驗找到問題,原來是 NasA 的實體網卡!讓虛擬機從不同網卡出去,bug 就不見了。

原本懷疑 routing 和 default gateway router 的問題,結果不是,真是活久見 XD

話說,我不是甲方嗎? 

---

結果空歡喜一場,問題還是在 route...

全文連結

星期五, 12月 10, 2021

生命中第一次開刀 X 勞累

11 月單位換新機器以來,臨時增加的 loading,包含下班後線上進修,趁工程師在的時候學 workstation 、陪伴長官測試 etc 產生骨牌效應,工作狀態爆炸,進入做不完導致加班更累,加班更累導致更做不完的惡性循環,甚至可以電腦前發愣一小時但就是什麼都沒辦法做。

經過連續工作 non-stop 2x 天後(11 月份的四個六日分別是:連續加班、值班、上台北 *2),工時和業務累積量逐漸正常,然後換身體炸掉。本來一年沒發的 biliary colic 三天發了兩次。11/26 日 5 AM 痛到掛急診,打了四針(止痛 *2 IV lock *1 溶血重抽血 *1),榮幸被急診長官探視慰問,還幫忙聯絡了 intern 同梯的優秀外科醫生,直接約時間安排外科治療。

為了隔天來台北學習,離開急診後沒有留一口氣回家,而是黑咖啡撐著繼續清工作。結果本來嚴重疲累時偶發性的眩暈升級成 nausea + vomiting。趕業務趕到一半,看著影像猛地一陣噁心,直衝廁所抱著馬桶準備吐,還好情緒平穩後沒吐出來,不然真成了「打報告打到吐出來」的第一人。這種情況不知道是腹痛引發的嚴重失眠導致的,Tramadol 的 side effect,焦慮引起的,還是兼而有之難以查考了。

後來一心三用,邊恍神邊工作邊補眠把住院工作清完了。還有些業務不想弄也沒力氣弄了。好在已跟科內長官請了假,六日上課、散心後,回台南做一點必要的業務和報告後,就直接住院準備開刀,請假期間大多業務分出去也不用管了,趁病假的中間設法休息。
深深覺得,我知道自己不是事情最多的,但我可以肯定自己身體特別差,這波好了後有點想跟上頭談談了 =.=

----

第一次麻醉感覺蠻奇妙的,麻醉科醫師一邊跟我哈拉一邊 IV push。藥推進來的時候感覺的到刺痛,忽然間覺得腦袋轉不過來,眼前的畫面卡格,然後人就在恢復室了。

這次的 LC 復原蠻快,上週三上午開刀,週五就順利出院。今天就順利拆線。除了遵照醫囑不敢去健身房或做劇烈運動外,行動幾乎照常了。

暈眩的問題也去看神內了,初步看起來像週邊型暈眩,用藥控制症狀,做了腦部誘發電位,下週看結果。作為醬料系吊車尾神內耳鼻喉的知識早全忘了(沒想到這句話也可以說的如此坦然、如此自信、如此風采)就看醫師怎麼診斷了。

----

Gallstone 圖...就不附了,偷看病理報告已經 chronic cholecystitis 了。


 

 

全文連結

星期四, 11月 25, 2021

串流平台母湯亂做

 

串流平台亂做真的很母湯

這陣子接了新業務,為了避免業務品質貽笑後人,去買了線上課程溫故知新。課程本身是 online video streaming 的方式授課,中間有簡單的 quiz。
 
課程本身品質不錯,但程式出了問題。
 
有天沒事按 Ctrl-U 看源碼,發現純靜態網頁,完全沒混淆,影片網址明文放在 iframe 裡指向外部 video hosting platform。然後 platform 只檢查 referer(驚)
 
然後花不到兩小時就試出對課程內容時間轉移(time shifting)的可行方式。網站唯一小亮點是登入有 reCaptcha,可是手動匯出 cookie 就能繞過哪怕我換了 IP (驚喜)。整個過程 python 土炮 multiprocessing + request 就可以搞定,連 headless browser 都逼不出來。
 
平台看起來是專業醫師團隊架的,強烈懷疑是不是欠了外包商錢搞成這種方式 orz
全文連結

星期日, 10月 17, 2021

土炮、搜尋引擎、血淚

 用自己做的搜尋引擎幫自己查資料真的很有感

一切從念研究所開始,唸研究所時希望「一魚多吃」,最好弄一套題目又可以畢業又可可以實際使用,那時公司需要搜尋引擎和 GIS,不過只有「GIS 和搜尋引擎」沒有研究所該有的水準,所以改成「GIS、搜尋引擎搭配大數據架構」,從架構規劃就加了複雜度,CodeIgniter/PHP 其實只是前端,收到 search term 後寫到 Apache Kafka,再 dispatch 到 Apache Spark ,做完平行處理再合併結果。

然後一連串慘劇就來了。所方因為各種原因無法幫忙,人力方面只剩 0.5 人還是個外行(我),project 因為加了各種「賣點」無論架構和程式碼都嚴重肥大、失控,遠超 0.5 外行人可以吃下的程度,但我已經在高層們面前開了支票做這件事情。

公司方爭取資料也遇到嚴重瓶頸,業務資料具備敏感性,走正規流程詢問過公司專業法律人士確認法律上可以做,層層取得同意。同意後還是在資訊單位排單約「一年」才得到拋轉程式,資訊單位真的很忙。

畢業後痛定思痛,程式大規模重構。這次純從實用、好寫出發,不考量「研究賣點」也不考慮其他 team member 維護(反正也沒有 team member),程式碼全砍,放棄了 CodeIgniter 用 Laravel 重寫,Kafka、Spark 也砍掉了。

程式重構和拿到資料後,Project 起死回生。重生的系統本質是套殼的 Elasticsearch,前端用快樂的 Jquery 搭 Bootstrap(攤手),後端 Laravel/PHP,搜尋核心業務邏輯用 Python。系統規模約三至四萬行,加上 JSON 和 CSV 則一百萬行(驚喜)。PHP 和 Python 的手寫 code 有作到 100% 測試涵蓋,linting、CI/CD 沒上,總之程式會動就好 orz

搜尋採用批次處理。Laravel/PHP 接到 search term 送到 message queue (DB 用資料表模擬)後馬上返回,後端 python 批次做完查詢後保存結果。使用者送出查詢後可關掉頁面隨時回來「讀檔」。資料拋轉則是用神奇的 Autohotkey!(因為公司提供的拋轉程式是 VB.Net Windows form 應用程式 :D)


今日新系統今天迎來第一個真正的搜尋業務,就是幫我週二的 morning meeting 找案例 XD。輸入複雜的 search criteria 後看系統載入、返回結果,覺得系統該死的難用的同時也有恍惚感和滄桑感。


前面的路還有很長,系統還只有分公司資料,當初答應的 GIS 也還沒重構完成,未來再慢慢補齊功能,並爭取匯入完整資料,期待有一天正式上線吧。

這應該是我做過規模最大、最坑的 side project 了(吐血)









全文連結

星期六, 10月 16, 2021

GUNBUSTER FANTASY (Kohei Tanaka / Pianeet) - ガンバスター幻想曲

 

Duke of Pianeet 的 Gunbuster 改編曲。動畫是庵野秀明監督的作品,暫時還沒看,但不妨礙欣賞好聽的動漫歌。

改編者 Duke of Pianeet 的產量、聲量好像小於 Animenz,但技術實力強勁,這首應該算改編到走火入魔了,第一次看到 ACG 鋼琴曲把李斯特超技摻進去的...

全文連結

星期五, 10月 15, 2021

墾丁旅遊

 工作狀況不理想,趁國慶和公司設備維修期間短暫請假休息。翻網誌上次來墾丁已經是九年前了。旅遊前兩天剛好遇到颱風,整天下雨和刮風就飽了,只能玩飯店內設施(哭哭)。風雨改善後去玩了海生館還有計程車包車。

凱撒大飯店大部分設施還是沒變,熟悉的場景 XD


西餐廳(2021)
西餐廳(2012)

遺憾的是地下一樓娛樂場所設備精簡掉了,2012 年還有大型電玩機台,這次去就看不到了 雖然補了新機器,但還是大型機台能引起回憶啊 >"<

地下一樓(2021)


地下一樓(2012)


 

二樓自助餐廳

歐風自助式早餐

飯店的歐風自助式早餐品質不錯,不過不是當地特色料理,價格也高,就吃一次 XD


海角七號阿嘉的家

計程車包車去的,當年應該沒玩到 XD



大飯店海景,海灘封閉了,錄影的時候風雨已經減少很多但海浪還是看得出大風。

今天玩完回家,休息下準備下週上班 QQ






全文連結

星期日, 10月 10, 2021

部落格 16 年了!

 部落格 2005 年開張,到現在(2021 年)已經 16 年了耶!!!

人也從懵懂少年快變成中年大叔。

回頭看自己寫的文章,包含當年在醫學生時期的掙扎,各種腦洞的嘴泡,以現在的眼光來看忽然有種羞恥感,但也產生了玄妙的感覺,好像變成長輩,隔著 16 年的時光長河,和過去身為少年的自己對話。少年跳脫頑皮的訴說,慈祥的長輩靜靜傾聽。只是遺憾長輩說什麼過去那個少年都沒辦法聽到。

最近工作感覺困頓,再回來整理充滿回憶的部落格。清了壞掉的超連結,無法運作的 widget 等過期元素。再來版面大修,現在對 HTML/JS 的理解遠超當年的少年時期(當然絕對不能跟職業人士比 XD),按自己喜歡的樣式套背景圖、改版面、套香香的 Google Font 中文字型,再加了半自動播放的 Youtube playlist,終於讓網誌成功復活!

邊整理部落格邊看過去文章,看到十多歲的自己可以 3AM 睡隔天若無其事,二十多歲的自己可以三天一班但睡一覺就復活,可以熬夜趕線上活動 code 再做 meeting 投影片熬到 5AM 人還是沒事,現在變成11PM 不睡隔天就廢掉的 35 歲超齡大叔,光陰如梭,無限感慨。

全文連結

星期六, 10月 09, 2021

換新手機了!

 舊手機 LG V20 陪伴我四年還五年,換過 N 次電池(這是最後一隻允許直接換電池的安卓旗艦),過保不知多久。

去年五月 3.5 耳機孔模組故障時就想換,但靠著淘寶買來的零件,親身施展天魔手殘維修大法,弄壞一顆主相機後,終於把原本故障的,和被我弄壞的零件全替換好,繼續用到了現在 XD

但卡頓情形還是無法完全改善。最後掃個實聯制 QR code 都會過熱當機,又剛好要出門玩乾脆換機升級。

我是 LG 愛用者(LG Gpro2 -> LG V20),但 LG 手機部門倒掉的情況下也只好換家了。跳槽到三星,14K 買了 S20FE

新手機升級感非常強。CPU 升級到 S865 ,6G RAM、全新儲存元件,操作如絲般滑順,沒比較不知道舊手機已經卡成狗啊....相機提昇也非常明顯,無愧 DxoMark 30 分的差距

資料轉移完畢後,LG V20 直接重設原廠狀態,關機收起來當備品,再拿出來的機會應該很少了,感謝陪了我四五年,再見了 V20。

全文連結

星期日, 9月 12, 2021

人生第一個深度學習應用

成功弄出第一個自己的深度學習應用 XD

問題起源於幾年前唸書時期的研究計畫,得弄一個能從大量(去識別後,連匿名 ID 都沒有的)free typing 地址中分析出區、里的程式。

難點在於地址是 free typing,不一定會填區里,有也不一定對。特別是「里」的資料還經過行政區域調整(舊里合併、消失,新里出現),還有亂碼(特殊造字),通用字(鹽塩曹[石曹]𥕢...)等問題,甚至官方資料也不保證乾淨(曾經從政府門牌查詢網頁查詢出填色方塊字██...)。

資料品質多慘?約 20% 資料連 Google 都分析不出區里,剩下 80% 很多判讀結果也有明顯錯誤(例如台南地址判讀成高雄的)。最重要的是,未來如果上線對接真實資料做分析,就不方便採用 Google Map Platform 等線上服務。

原本做法是應用工人智慧,寫個土炮 parser 硬讀,搭配大量特殊規則和自製資料清潔 pipeline 應對各種坑,但效果並不好(「區」「里」正確率約 6x%、50%),本來差不多放棄了,但最近研究 ML/DL 忽然想到這問題其實類似中文文本分類問題,也許可以 ML/DL 解決?經過大量搜尋後發現也許可以用 TextCNN 解決這問題。

最初版本是依據好心人 CSDN 分享的「中文新聞分類」代碼依樣畫葫蘆。文本資料轉簡體,Jieba 斷詞,用簡中新聞訓練出來的 pretrained word2vec vector 做 embedding,結果分類正確率只有 4X%,而CSDN 上新聞分類範例的正確率是 90%。

研究後發現 training data 可解釋部份問題,jieba 斷詞用在地址並不理想,檢視後發現很多不合理的斷詞。個人也懷疑用新聞訓練的 word2vec 和斷詞也不適用於地址(例如博愛、仁愛語意近似,但仁愛路和博愛路就完全不同)。於是換了土炮斷詞法,改了 stopwords,用 gensim 拿公開門牌資料重新訓練 word2vec,再搭配土炮 parser 的資料清潔 pipeline,調了下少數個人看得懂的參數。model 正確率拉到 60%(里,600+ 個分類)和 88%(區、37 個分類)。土炮 parser 也不用扔,拿來做 ensemble,混合雙打正確率就拉到 65%(里)和 90%(區)了。

弄好後復盤,才注意到這是第一個親手寫出來的 deep learning 應用,雖然核心 model 代碼借(ㄔㄠ)鑒(ㄒㄧˊ)了公開代碼,不過 data cleaning、找出 accuracy 低下(部份)原因並改善、部份參數最佳化、做 ensemble、還有把一切從 jupyter notebook 打包成完整的 pipeline 都是自己完成的。成功踏入 deep learning 調包俠境界,並且有生之年應該有機率進階調參俠 XD

可改善的地方還有很多,也許可以換更好的模型(往 Hierarchical classification 去找?),進一步參數探索,土炮 parser 也可繼續打磨,改善 ensemble 的整體效能。不過作為非資訊專業人員作到「證明問題可以用 deep learning解決」,應該夠交差了,請公司內專業 AI 人士改善模型我再套回 pipeline 也許是比較好的做法,我可以去做別的事。

最後,pytorch 真是美!

全文連結

星期三, 9月 08, 2021

Onedrive 停用自動更新

原本用 Google Drive 放個人資料,買 Office 365 有附 Onedrive 空間就開始使用 Onedrive。Onedrive 用起來什麼都好,就是會自動更新到新版,然後新版永遠無法啟動(默),於是每次 Onedrive 自動更新後就得重裝。

為了這件事,爬了大量網路文章,網路上提到的方法大多是工作排程器停用 Onedrive standalone update task。微軟官方網頁也是這樣寫的。但事實上 task 停用以後,Onedrive 還是會偷偷自動更新(Windows update 直呼內行!)

今天換思路,直接進 Onedrive 的程式目錄(%localappdata%\Microsoft\OneDrive),找 Update 和 StandaloneUpdater 兩個子目錄(沒有這些目錄則手動創造空白子目錄),右鍵內容 -> 安全性把 System 群組在內所有權限全部勾「拒絕」,並實驗確認目錄無法修改。

設好之後故意打開 Onedrive standalone update task,結果 Onedrive 無法更新,停留在穩定的舊版。討厭的新版再見~再也不用無限重裝舊版了 XD
全文連結

星期四, 9月 02, 2021

Vast.ai 發現

最近想試試 TextCNN 看能不能解一個問題,把塵封許久,裡面還有 $8 credit 的 vast.ai 請出來。

原本以為 vast.ai 的 container 只能 SSH 或 jupyter notebook 二選一,可我想兩個都要。為此還花了幾小時自製 docker image 用 supervisord 啟動同時執行 jupyter notebook 和 sshd,結果在本機端成功啟動但在 vast.ai 無法使用。

繞了大圈才注意到,vast.ai 給的 ssh 連接指令是:

ssh -p 12345 root@ssh4.vast.ai -L 8080:localhost:8080


如果單純只要 ssh,何必多開 port 8080 做 SSH tunneling 呢?去查文獻才發現,這個 port 8080 是讓你在 ssh 裡面開 notebook 用的。

jupyter notebook -ip=127.0.0.1 --port=8080 --allow-root



在 Windows 本機,putty 打開 SSH tunneling 連上後,在 bash 啟動 jupyter notebook 時指定 port 8080,本機瀏覽器開 localhost:8080 就能進 notebook 。自己土炮的 docker image 用這個方法就可以同時開 ssh tmux 和 jupyter notebook

不得不說 vast.ai 的 documentation 不夠清楚,雖然 RTX 3090 $0.561/hr 的價格真香 XD
全文連結

星期五, 7月 23, 2021

自炊電子書經驗

家裡書越來越多,很多技術性的書籍,讀過一遍以後通常只會拿來查,很少完整重看第二遍,放在家中佔地方,工作出差又不好帶,所以就動了自炊的想法。後來剛好看到夠便宜且夠用的掃描器,Microtek ArtixScan DI 2125c,一台不到 2500,支援 A4 彩色雙面掃描 600dpi 有 20 張的自動進紙,低廉的價格作為實驗品足夠好。折騰了一兩天終於弄出了自己的 pipeline 

找影印店裁書,掃描存圖檔 

圖檔要檢視有沒有跳頁或是嚴重扭曲,有的話重掃並且設定好檔名,使檔名 lexicological order 和紙本頁面順序一致。 

重排檔名,和依照檔名順序重設修改時間

避免檔名或修改時間的順序紊亂,導致匯入其他 App 後順序順序錯亂,以下 powershell 腳本「-whatif」要拿掉才會真正改檔名,否則只是預覽。

依原本檔名順序批次重新命名

(Dir *.jpg) | sort name | ForEach { $count=1 } {
	$scount=([string]$count).PadLeft(4,'0')
	rename-item $_ -NewName ngimg-$scount.jpg -whatif; $count++ 
}

依檔名重排修改時間

$dirs = (Dir *.jpg) | sort name
ForEach($d in $dirs) {
	$file = Get-Item $d
	$file.LastWriteTime=(Get-Date)
}

圖檔轉檔為 PNG

不用 jpg 是怕反覆修改存檔越來越失真。後面的步驟每次使用 mogrify 前都建議複製圖檔目錄做備份,因為 mogrify 會原本修改原本圖檔造成不可逆變化。

magick mogrify -format png *.jpg

去背景

magick mogrify *.png -transparent white -fuzz 50%

fuzz 網路教學設 90%,我保險一點設 50%

Imagemagick 切黑邊,傾斜校正(deskew)然後再切黑邊 

切除黑邊

magick mogrify -fuzz 30% -define trim:percent-background=10% -background black -trim +repage *.png 

個人測試的結果,percent-background 不設成 0 可避免去黑邊的時候吃掉太多正常內容,切完後周圍會有很細微黑邊但個人可接受。書中有大量黑底的,可把 percent-background 拉高或把 fuzz 壓低,try and error 根據最終效果做調整

傾斜校正(deskew)

magick mogrify -deskew 80% *.png

個人使用體驗,deskew 設 80% 會比網路上普遍的 40% 好些,至少對我的掃描器是如此。如果先做傾斜校正,圖檔四周可能多出不同色,和原本黑邊混雜,造成後續去黑邊困難。所以先去黑邊再傾斜校正,再去一次黑邊去除掉傾斜校正造成的額外黑邊。 

影像銳化

magick mogrify *.png -sharpen 0x1.5 -modulate 100,130,100

modulate 三個參數分別代表亮度、對比和 hue。100 代表原值。個人選擇調高對比。sharpen 0x1.5 是網路建議,測試後肉眼可接受。 

圖片檔案批次匯入,做 OCR,存成 pdf 

我用掃描器附的  Finereader 解決

建立 PDF 目錄(table of content)

網路上找了一堆免費或試用軟體,後來發現 k2pdfopt 可用。

k2pdfopt -mode copy -n -toclist 目錄檔.txt 輸入pdf.pdf -o 輸出pdf.pdf
其中目錄檔的格式如下,前面的數字代表對應 pdf 的頁數,+ 號代表縮排
20 Chapter 1 大章節
+21 1.1 小章節1
+26 1.2 小章節2

弄好後可用免費的 PDF-Xchange editor 把目錄中不小心插入的空白項目等移掉,PDF-Xchange editor 若只是刪除現有目錄中的項目是不會加浮水印的。 

到這步自炊電子書 pdf 就完成了。原本的書看是要膠裝保留還是丟掉。附上自炊的電腦叢書抓圖。Pdf 有目錄,文字沒有歪斜且清楚。旁邊很醜的字是個人閱讀用鉛筆做的筆記,300dpi 下(我自己)還是能看懂寫什麼。 


除了文中方法,我也試了不少 App,包含中國製 Camscanner 掃描全能王,Adobe scan、Microsoft Lens 等但各有各的問題。

Camscanner 最好用,但有浮水印,電腦版還要你把資料傳上雲端,之前好像還爆發過資安疑慮,MS Lens 發現 Android App 不能一次匯入大於一百張就放棄了。

花了一兩天,發現其實以裁書後用掃描器掃描的圖片品質,用 Imagemagick 搭 pipeline 做後處理就很夠用了。影像來源才是決定電子書品質的關鍵,影像來源太差,例如用手機搭自拍支架拍照片,照片還有手指,不管後續用什麼軟體,得到的結果都是歪七扭八又模糊。

當然買好點的機器也是解法,網路一致推薦的自炊神器富士通 Scansnap ix1500 除了掃描速度更快,機器軟硬體好像還附贈更好的校正功能,說不定就不用自己土炮後處理 pipeline 了?但那台機器對只想「試試看」自炊的我太貴了,後來就算了。

全文連結

星期四, 4月 16, 2020

第一次用 Rust 寫程式成功

程式背景是需要用 Chromium embedded framework 寫 client 做 overlay UI 去「注入」某報表軟體,幫軟體增加原生 UI 沒有的功能(關鍵字變色)。原來用 python 搭 cefpython 被我嫌慢,改用 native C++ client + Rust 做。

初步使用結果,語言加入的新機制幫忙不小,如 Ownership 和 lifetime 替我抓出「把 stack 的 local variable 直接 pass reference 給另外一個 thread」這種蠢錯誤。除此外 Rust 「安全」的設計還有很多,例如  function 不直接回傳「結果」,而是把結果值包在特殊物件(Result)裡,不寫 error handling 的 code 就不能把撈出來用等等,compiler 盡了努力確保 error handling 完整,不完整甚至不給 compile。

缺點就是 learning curve 很陡。例如指針裸奔不能用,物件要非常清楚考慮 life cycle 的問題,我為了把一個 TCP socket object 給兩個 thread 用搞了半天才說服 compiler。大量的 Error handling 讓 code 膨脹,Rust 給了語法糖來緩解膨脹但也增加了 learning curve。Rust 的某些設計,如完全沒有 object inheritance 而是用 Trait 做 duck typing 等等也讓我花了時間上手。

但 Rust 的「好處」也體驗的到。這次寫 multithreading 完全沒遇見 segmentation fault 或任何 memory-related error。即使是 Panic (我偷懶用 panic 做 error handling)也在 Rust 的管理之下,至少報錯非常清楚,這次完全沒用 debugger 或看 stack dump。

Rust 的套件管理也很好用,cargo.toml 寫好 dependency,剩下的 cargo 自動處理。不需要搞定 lib compile、linking 或各種環境設定鳥問題,舒適度堪比 Docker pull XD

整體而言,至少在我的 use case 裡,Rust 確實做到用語言設計,在 compile time 抓了大量會在 runtime 炸掉的問題。但 learning curve 陡峭,寫程式也很難「想到哪寫到哪」,也許在完成 prototyping 或業務邏輯固定後用 Rust 來重構 bottleneck 是不錯的用法 XD
全文連結

星期一, 8月 13, 2018

Doom 2016 Nightmare 全破心得

終於把 Doom(2016) Nightmare 全破了。這遊戲在 Steam 收藏櫃裡藏好久,總算口試完能玩一下 XD

2016 版和 Doom 3 完全不同風格。 Doom3 接近恐怖路線,所以有「拿手電筒時不能同時拿武器」的設定,然後怪就經常從背後冒出來。Doom 2016 淡化了恐怖元素,徹徹底底的走暴力路線,電燈黑掉然怪從背後冒出來的橋段沒有了,改成前方一次冒一堆怪出來。新作暴力到一開始玩有點不適應,噴番茄醬就算了,開槍、電鋸殺還會有肉塊,「榮譽擊殺」還有對怪物處刑肢解特寫鏡頭。不過玩到中段就開始無視這些元素,只會擔心放動畫期間會不會被其他怪集火瞬秒 XD

跟少數幾款玩過的近代 FPS 比起來,Doom 很多設計看的出都是為了不讓玩家龜著打。例如不會自動回血,所以躲柱子後面等回血是沒用的。雜魚怪也有地圖砲,龜定點就等著被連發小範圍地圖攻擊連死,很多怪都要走位才好打甚至不走位不能打,例如拿盾牌的殭屍基本上正面打不動,一定要用範圍攻擊或是繞背,也有怪近距離肉搏和正面特強,玩家一定要拉開距離否則就是被秒。不過遊戲雖然逼玩家走位,但多死幾次關卡熟了其實還是可以猥瑣(在 Nightmare 模式成功用猥瑣解怪,成就感更大 XD),有的地圖只要爬到「二樓」怪就只會一隻隻冒出來而不是一次來一波、有的地圖其實有防禦面積不大的小圈圈可以繞等等。


Doom 2016 武器繼承了 Doom1、Doom2。經典的武器包括單管、雙管霰彈槍、機槍、火箭砲、電漿槍、BFG2000 等都在。但作了很大調整,除了 BFG 外其他武器一開始都大幅變弱,沒升級的單管霰彈近距離轟雜魚,如果不打頭有可能五六發才死。然後多了武器升級系統,盧恩符文和裝甲升級系統。武器升級後、升級滿根本是截然不同的東西。升級榴彈砲的單管霰彈可以用到大後期。完全升級的雙管霰彈和攻城模式 Gauss cannon 就是 bug 槍,前者近距離見誰秒誰,噴 Boss 也不在話下,後者基本是小型 BFG。

因為有升級系統,遊戲其實是越後面越簡單,因為怪變強很多,但是升級武器、盧恩符文和裝備的玩家變強更多,即使是剛開始最弱殭屍都能一擊敲掉半條血的 Nightmare 模式,練成少數 bug 槍、符文,裝備升級,拿 BFG 後也能橫著走。只要升級速度趕得上關卡變難速度基本沒那麼難打。


整體而言,新版 Doom 回歸了元祖 Doom 的成功元素,而 Nightmare 模式夠難很有挑戰性,但用點心思(研究地圖、升級裝備、武器...)其實也沒那麼難打。期待續作了。






全文連結

星期六, 2月 11, 2017

義大利麵代碼怪,AHK 0.208


為了增加實力,決定研究常用 opensource 專案的原始碼,目標是自己常用的 autohotkey,從遠古的 0.208 版入手。

根據 solution file,這版本是 VC++ 7.1 時代的原始產物。花了點時間,解決了所有的 compile & link error 總算在 VS2015 編譯通過,開始研究原始碼之旅。

 
目前心得:

1. 為什麼這東西 VC++ 7.1 版允許編譯?

我修掉的 bug 類似:
 
a.cpp:
    static SomeClass foo;

b.cpp:
    foo = .....

b.cpp 沒有 extern declaration,就直接使用了另外一個 compilation unit 的 global static variable。我沒裝 VC++ 7.1 實際去編,不過假設放在 public Git repo 都能編的話,那 VC++ 7.1 允許這種東西 compile & link 也挺神奇的 orz



2. 神奇的巨集海

 ...
# define ARG1 (mArgc > 0 ? sArgDeref[0] : "")
...
# define FOUR_ARGS ARG1, ARG2, ARG3, ARG4
...
if (WinActivate(FOUR_ARGS, mActionType == ACT_WINACTIVATEBOTTOM))
...



這甚麼優(ㄜˇ)雅(ㄒㄧㄣ)的寫法。結果一個 class 的 definition 都看不完就累了,看完 28000+ 行原始碼可能要花時間 orz


結論:我和義大利麵代碼怪特別有緣,就連挑 opensource 專案能都遇到義大利麵代碼怪,還有我以前的寫法並不糟 XDDDDDDDDD
全文連結

星期六, 5月 14, 2016

支持死刑的理由

保留自己八卦版的文章

: 首先我不知道能不能把理論過程寫好,寫漂亮,但我發現目前論述都太容易
: 缺乏一個真正好好說理過程,或許你仍然可以不同意,但我相信可以理性溝通
: 第一、死刑不可回復性
: 第二、冤獄產生不可避免
: 第三、死刑嚇阻性問題
: 第四、國家可否殺人問題
: 第五、憲法上問題
: 第六、生命的價值
: 第七、我們想要什麼樣的社會



推您這篇文,總結了廢死常見的思路。

個人簡單來說:

一、人命無價,所以不能放在天平上,不可以有死刑?

不必要的娛樂用電,可能帶來火力發電,每年製造一堆空氣汙染
不必要的汽機車造成的空氣汙染
抽菸害人吸到二手菸

以上都能引起肺癌,根本就是隨機殺人。而且台灣肺癌每年成千上萬的死亡,其實殺人數遠比死刑來的高。但我們還是在做這些事情。因為做這些事情雖然會導致其他人類死亡,但是利大於弊,所以政府允許抽菸,然後就會有二手菸讓不想吸菸的人得肺癌死去

廢死喜歡主張「每條命都無價」,但事實上我們每天在做把人命放上天平的事情,不管你喜不喜歡把人命標上價格放在天秤的一端,你每天的日常生活其實都在這麼做。所以說「每條命都無價」我認為不是對不對的問題,而是昧於現實的問題,因為不管你贊不贊成你早就在做了。


所以即使人命關天,一旦誤傷難以恢復,國家冤錯案不可避免,我認為只要能論述「利大於弊」還是可以支持死刑。接下來論述「利大於弊」,死刑的「弊」您都說完了,那「利」在哪裡?

我簡單修改 #1M-J5-g6 我自己的文章

死刑不是復仇。
死刑不是復仇。
死刑不是復仇。

死刑是用與罪相當的刑罰,不帶仇恨,嚴肅而莊嚴的否定罪惡死刑的意義在於刑罰的公平,「罪刑相當」。犯罪的「罪」與制裁的「刑」必須相當,秩序才能為人信服,罪惡越重要罰越重,否則難以服人。


1. 公司如果監守自盜偷錢,跟上班遲到罰一樣重,大家服不服?

2. 學校烙人打人跟上課打瞌睡罰一樣重,學生服不服?


老師會把作弊的學生記大過或是退學,不是仇恨學生,而是不這樣做,無以表示對錯誤行為的否定,無法維護校規之威信,會讓認真遵守校規的學生對校規的信心產生動搖,覺得遵守校規是傻瓜。所以將學生退學就算老師會因此難過流淚,該做也是得做。

而死刑呢?就是因為殺人時在太惡劣了,所以不用死刑,沒有任何「罰」可以跟罪犯的「罪」相等,若不判死無以維護善良與正義的尊嚴。「不是我愛殺人,而是不殺服不了人」
----------------------------------------------------
檢察官請求對被告鄭捷處以死刑,核屬罪刑相當,合乎法律之目的,且無違背內部性界限,亦無權利濫用之違法,更無違反比例原則、平等原則、公平正義等法則,爰分別量處如附表編號1 至4 所示之死刑,並均宣告褫奪公權終身,以彰顯國法尊嚴並維護法治、保障社會安全;
----------------------------------------------------
為什麼要用死刑?因為面對極惡的罪,不用同等的刑罰,會無法「彰顯國法尊嚴並維護法治」讓百姓覺得法律不公平都偏袒壞人,民眾一旦開始瞧不起法律,那「保障社會安全」就做不到了



二、犯罪的成因很複雜,死刑不能解決問題,所以不要用死刑?

我認為會這樣說的人,都對刑罰產生了不切實際的幻想,錯誤的幻想刑罰必須是解救一切問題的萬靈丹。死刑不具備萬靈丹的效用,所以不要有死刑。

對,我也贊成光用死刑根本解決不了問題。但我還是支持死刑

一樣用比喻來說:國中生加入幫派飆車打同學,我相信也有複雜的成因(包括家庭教育等)。如果學校的老師「只」把每個飆車打同學的極惡國中生開除退學,那肯定不能徹底解決問題,一樣會有一批一批的極惡國中生上來繼續入幫派飆車砍人,永遠退學個沒完。

但如果反過來說:「讓同學退學根本不能解決問題,所以以後一律採用愛的教育。以後加入幫派飆車打同學的,一律等同曠課處理,警告一次加罰掃廁所。」請問原本已經囂張的打人小孩聽到了會怎樣?鐵定是氣燄更加囂張


看出問題了嗎?

「將所有犯大錯的小孩退學」雖然不能徹底解決小孩犯錯問題,但還是能在問題發生後,「罪刑相當」犯大錯用重罰的方式,讓很多人對已經失去顏面的規範重拾信心,讓很多人認為這校規起碼公平,情形越惡劣罰越重。倘若因為小孩犯錯成因複雜,就放棄對犯錯的小孩採取「罪刑相當」的處罰,那會讓其他人對校規失去信心。而且,沒有理由「超級壞小孩退學」跟「找出小孩犯錯的原因」不能同時進行

死刑也是一樣。把所有惡劣殺人的人都抓去斃了,以後還是會有殺人犯。但把他們斃了起碼會讓人覺得:這社會法律真公平,做大壞事有大惡報,罪刑相當,刑罰公平,遵守的心甘情願。而且沒有理由「解決犯罪深層原因」是廢死的專利,維持死刑還是可以同時「解決犯罪深層原因」。

死刑不需要解決所有的問題,只要在法律和善良的威信受到踐踏時,避免已經重創的威信進一步受傷,這樣就夠了



三、「犯罪的成因很複雜,不全是死刑犯的錯」會有宿命論的問題


「殺人犯和罪犯犯罪的成因很複雜,包括環境、教育、生理等原因,不能全歸咎於殺人犯,所以不該用死刑」
「如果你我投生到殺人犯的家中受教育,也許也會變成殺人犯,所以他們情有可原,不能用死刑」


這樣的論點,如果替換成

「我賺多賺少都是由上天決定,如果上天跟眷顧比爾蓋茲一樣眷顧我,我也能賺大錢」
「我錢賺得少,很多都是由環境決定,不能完全怪我」


你看出問題了嗎?「犯罪外力決定論」「人沒有自由意志」其實就是「宿命論」

宿命論的問題大家應該都清楚,如果人一旦相信宿命論,認為人的一切都是由外力決定,那人就會失去向上的動力。「犯罪他力決定論」問題也是如此,如果一旦因為犯罪成因複雜,就不用「罪刑相當」去處罰罪犯,那就會落入類似宿命論的問題:人沒有去惡向善的理由。反正你會壞,是因為你的環境壞,你會好,是因為你的環境好。那我當好人不就傻瓜?

所以個人以為,就算犯罪成因複雜,很多犯罪真的都受到外在影響,也不能放棄「罪刑相當」,因為「善有善報,惡有惡報」是人去惡向善的重要動力。一旦甚麼當推給外力,你善也是環境的功勞,你沒有賞,你惡也是環境的錯,所以你沒有錯。那人就失去向善的動力。

打比方:我知道學生暴力打人加入幫派成因也很多。但如果我跟學生說:「你打人是受環境影響,你打人不是你的錯,所以你暴力打人加入幫派比照打瞌睡處罰就好」「你奮發向上是你父母教的好,不是你的功勞,鄭捷如果出生在你家也會奮發向上」請問會有甚麼結果?一定是紀律渙散,所有人都變壞,因為行善無功,做惡無過,沒有因果,沒有動力了。

所以不管「犯罪由環境決定」是不是真的,我認為都必須維持應報理論,因為應報理論就是講求現世就有因果,有因果善有善報惡有惡報是人行善去惡的動力。所以即使「犯罪由外在環境決定」是真的,也不影響應報理論的正當性。因為否定「善有善報,惡有惡報,自己負責」,甚麼都推給外力,那人就都不用向上了。 全文連結

星期二, 3月 29, 2016

關於廢除死刑

修改自己 ptt 的文。

很多人,甚至支持死刑的人都把死刑當成報仇。但其實死刑不是復仇。死刑是用與罪相當的刑罰,不帶仇恨,嚴肅而莊嚴的否定罪惡。

死刑的意義在於刑罰的公平,「罪刑相當」。犯罪的「罪」與制裁的「刑」必須相當,秩序才能為人信服,罪惡越重要罰越重,否則難以服人。舉例:

1. 公司如果監守自盜偷錢,跟上班遲到罰一樣重,大家服不服?

2. 學校烙人打人跟上課打瞌睡罰一樣重,學生服不服?

而面對惡劣傷害人命的時候,「正因為生命無可取代,在正義的天平上只能以生命平衡生命」(康德)。就是因為生命貴重,除了生命之外沒有任何「罰」與罪犯的「罪」相等所以執行死刑。日常生活中,大家都知道做錯事,要情形越惡劣罰越重,不然沒有人會願意遵守規矩。怎麼遇到了惡劣殺人的時候,腦筋就忽然轉彎了呢?

老師會把作弊的學生記大過或是退學,不是因為要對學生以牙還牙,要對學生用漢摩拉比法典,而是學生太惡劣,不這樣做,無以表示對錯誤行為的否定,無法肯定秩序,無法維護校規之威信,會讓認真遵守校規的學生對校規的信心產生動搖,覺得遵守校規是傻瓜。所以將學生退學就算老師會因此流淚,該做也是得做。

最後,引一段鄭捷的判決書,證明這理論不是我發明的
----------------------------------------------------
檢察官請求對被告鄭捷處以死刑,核屬罪刑相當,合乎法律之目的,且無違背內部性界限,亦無權利濫用之違法,更無違反比例原則、平等原則、公平正義等法則,爰分別量處如附表編號1 至4 所示之死刑,並均宣告褫奪公權終身,以彰顯國法尊嚴並維護法治、保障社會安全
----------------------------------------------------
為什麼要用死刑?因為面對極惡的罪,不用同等的刑罰,會無法「彰顯國法尊嚴並維護法治」讓百姓覺得法律不公平都偏袒壞人,民眾一旦開始瞧不起法律,那「保障社會安全」就做不到了





-----

關於廢除死刑,個人以為死刑只是一種工具:執行死刑不是因為愛殺罪犯,而是因為罪刑不相當會動搖法律威信動搖民信,簡單講「不是勞子愛殺人,而是不殺服不了人」

所以要廢除死刑,也不是不可以,但必須要有能讓人信服,代替死刑解決問題的新方案。

打個比方:老闆把偷錢的員工開除,不是因為老闆恨他,是因為如果不開除,公司上下沒有人會服公司的規矩,如果有人能想出某個神奇的方案,不開除偷錢的員工也能維護公司的風氣,那老闆也樂得不開除員工傷大家和氣,前提是這種方法確實存在。

但這種「替代方案廢死法」,必須先提出可行方案(但很遺憾,我認為目前能替代死刑服眾的全國性方案實質上不存在),讓眾人接受這方案能有效替代死刑,不會不能服眾,讓民眾產生「法律都在偏袒壞人,壞人殺人我們還要養他」這種對法律不服氣的心理,先對話讓大多數國民同意,再廢除死刑。絕對不是現在「精英」不修法,不以理服人,就直接「我精英才懂,你們在座支持死刑的都是OO」霸王硬上弓強行停止執行死刑這種自我感覺良好的做法。 全文連結

星期六, 11月 14, 2015

Rootkits: Subverting the Windows Kernel

書本連結 困頓時期的小確幸讀物。之所以讀這本書主要是玩 DLL hook 想要對安全更深的了解。以快速瀏覽不查 code 為前提看完。內容整理清楚,深入淺出,可以清楚理解思路。幾個缺憾: 1. 這是 2005 年的書,很多內容都已經過期 2. 書中同時涉獵眾多不同主題,每個主題都只能點到為止。對系統和漏洞的進一步了解,想要紮深基本功的話可能還需要別的書(望向厚厚 Windows internals) 不過最重要的問題是最近根本沒有時間體力打開 IDE 寫程式囧 全文連結

星期三, 8月 20, 2014

Computer Networking: A Top-Down Approach (6th Edition)

Computer Networking: A Top-Down Approach (6th Edition)
上次 CPPGM 小確幸系列因為要準備考試和工作負荷不了,日常生活的IT小確幸就換成念書。今天在中午 meeting 快 Hypoxic-Ischemic Encephalopathy 的情形下把這本書除習題和後文 reference 外全掃完了XD

全文約八百頁,算淺白易懂。跨了不少 topic。不過可能由於是入門用 introductory course 的原因,不少東西看得出都寫得極為簡略而且有所保留,比如用一個 chapter 同時介紹密碼學 + SSL、IPSec (本來以為 Bruce Schneier 老大的密碼學入門已經極簡了,沒想到還可以更簡),不過從整體性的角度來看網路大有幫忙,比之前支離破碎亂學完整的多。

下本小確幸系列還不確定要選哪本書 XD

全文連結

星期日, 2月 16, 2014

CPPGM

http://www.cppgm.org/

這陣子除了工作以外,最有意義的活動就是參加了CPPGM,挑戰一人徒手打造standard compliant C++ toolchain。不需要做優化,只針對linux x64 platform,但禁一切3rd party code的使用,只能用GCC和GCC附帶的東西。這和一人帶一把小刀去和整個軍隊單挑一樣愚蠢,可是我還是很熱血的報了。還支撐到PA7通過....

最後陣亡並不是因為PA8時間到寫不出來,而是因為累了,加上要去國外報paper,準備專科考試等眾多因素,實在沒辦法挪出多餘的時間和體力去應付這需求越來越膨脹的怪物。

活動只有越變越難,一開始是寫tokenizer之類的小東西,後來慢慢把整個preprocessor弄出來,接下來開始parse完整的C++ grammar,然後PA7開始慢慢加入syntax analysis。我掛掉的PA8是要求模擬linking產生fake image。接下來的題目是真正的code generation和完整實作C++除了STL以外的東西(statement, expression, class, template....要產生Linux X64 ELF的樣子QQ)。

PA1在寫tokenizer的時候,自己去Google了paper把regular expression自己實作出來,覺得好有挑戰性啊XD。開始做preprocessor的時候又覺得照paper寫regular expression相比之下是無腦小事。開始寫parser generator的時候又覺得前面並沒那麼難。開始做name lookup, 抓ambiguity這些事的時候,又覺得寫parser generator其實也挺快樂的XD。開始產生fake image的時候就累了,退出orz

最後的結果,扣掉中間一些小單元測試和parser generator生出來的code的話,約一萬八千行,加上parser generator幫我生的code就三萬行,其實只能算中規模的C++ project,跟GCC幾百萬行比起來真是遜爆了XD

做CPPGM收穫不少,首先,雖然這個大師課並沒有老師手把手的教東西,不過確實也學到很多。寫的過程中,畢生所有知道的design pattern還有技巧全部都用上了,至少在code成長到一萬八千行,每個unit的藕合性等等還可以看,debug起來還不至於陷入無底深淵。C++、除錯、程式架構的功力算是有長足的進步。再來,寫CPPGM填補了我內心中當初想走二類組的願望。不只讓人體驗到寫程式,還體驗到吐出來XD。現在內心的「不甘願」確實少了很多XD

CPPGM寫作過程之中也再度發現自己的罩門:我對advance c++、除錯、組合語言,作業系統等認知不足。我從頭到尾都用cout在debug,gdb完全不會用。但cout debug法只要project稍微一大就會遇到很多困難。現在程式架構清楚的時候還勉強堪用。以後把expression, statement, class, template那些全加進來應該就會完全不夠。對作業系統和組合語言不懂,將來做code generation的時候應該會無比困難。不熟template,以後做相關功能的時候應該就會吃鱉,放下CPPGM以後,鑽研advance C++,除錯,組語,作業系統...的慾望大了不少。


放棄CPPGM雖然可惜,不過人生也恢復成彩色的。突然有好多時間和體力可以在家做醫院的事情,有好多閒情逸致可以看技術書籍,卡通和漫畫,好多時間彈鋼琴XD,但也同時伴隨著失去目標的迷茫感。接下來要挑戰甚麼呢? 全文連結

星期日, 12月 29, 2013

醫療崩潰 不尊重專業也是病因


今日聯合報民意論壇,有人指出醫師成長,是「政府投入、病患給與成長、學習機會」,所以醫師是「公共財」。看了真是毛骨悚然。我甚麼時候成了別人的財產了?

專業受到外來幫忙,不代表自己沒有付出。若無顧客反應,可口可樂很難有成功配方。若無國家環境,台積電能很難成為晶圓代工龍頭。無台灣人支持,統一企業不會順利成長。若受環境幫忙就算公共財,自己的辛苦努力都不算。那台積電和可口可樂秘方應該也是公共財。小民缺錢,不知道政府能不能發幾張台積電股票給我過好年?

極少數人對專業人員毫不尊重。醫護自發的,額外的付出奉獻,全部當成欠他的,讓醫護奉獻的心貼在冷屁股上,也是醫療崩壞原因之一。人是互相的,君之視臣如草芥,則臣視君如寇仇。有人把醫護當財產看,那醫護把他當鈔票看,也只是剛好而已。
全文連結

星期日, 10月 13, 2013

Re: 小三數學「聯想法」解題 家長痛批看不懂

http://tinyurl.com/llawbne

有幾點想法

1. 以網路上提供的題目照片來說。題目根本沒有限制要用哪種解法(假設考卷上其他地方沒限制用估算法)。這種情況下只要是合理的解題法應該都能用。有人想用積分來算長方形面積,可以說他解錯嗎?換個情況,假設題目明白限定用估算法,今天老師一樣把整題打錯,家長還會意見那麼大嗎?

2. 許多建構式數學想教的東西個人是贊成的。但不應該是這樣教。有些東西比較適合久了以後讓人自行「體會」出來,反而更能達到熟練和理解。以概算來說,我也是碰到許多繁瑣計算以後自然理解出來的。

所謂繁瑣的計算,是比如:

86953415656489 - 54697814312345 約等於?
1. 20000000000000 2. 30000000000000 3.40000000000000 4. 50000000000000

以教概算來說,與其將「概算」這個想法轉化成僵硬不能變通的計算步驟叫學生生吞活剝吃下去(建構式數學不是還蠻反對背東西?)。不如真的丟幾題數字非常大的題目讓學生算算看。也許學生經過幾十題龐大數字的計算後,再學概算的概念,就能深刻體會為什麼要概算?甚麼時候該用概算?概算到底有甚麼幫忙?等等。或許想法不是完美無缺。但無論如何,我認為這都比把「概算」轉換成僵硬的步驟叫小學生吞下去。然後在沒明說要用概算的情形下,丟三位數減法這種根本無法讓小學生體會到「為何要概算」的題目好多了。

3. 這是借題發揮,引申自上一點,很多建構式數學想教的東西我認為比較適合讓人自行體會出來。直接明白講反而讓人難以體會。或許有人會認為這種教法可以教出會思考,有理解的人。但就個人看過的案例而言,這種方法會讓人無法達到「熟練」。而對某個東西根本不熟,說要多能思考能有理解我認為都是騙人的。所以我認為現在我所看到的建構式數學反而不如以前的填鴨式數學。

填鴨式數學,至少我弄熟了之後慢慢有心得,還有機會自己產生理解和思考(比如大數目算久了,概算就容易一點就通)

現在的建構式數學,連基本的熟練度都達不到,你是要根據甚麼思考和理解? 全文連結

星期日, 5月 26, 2013

網路通訊隨意監控,政府有如「老大哥」

最近智產局「封鎖盜版」法案引起軒然大波,個人有些看法:


從前有個國家小偷充斥。為了有效打擊犯罪,該國政府推出新法規:以後警察可以不經過法院,在任何場所直接進行搜索。若有人疑似小偷,也可不必審判就直接關有期徒刑。不料風聲一出,全國抗議。政府不得不出面澄清:絕對不會冤枉到好人,只有真的小偷會被抓。有網友擔心用在政敵身上,絕對是誤解立法意旨......

檢調監聽電話,要法院同意。政府要關人,要法院審判。美國DMCA智產法案要關閉盜版網站,也一樣要法院許可。智產局的新法案,卻可以不必經過司法機構,就任意讀取網路通訊,想封哪個網站就封哪個網站。若說這樣沒問題,那辛苦工作的檢調和法院豈不是傻瓜?贊成打擊盜版,但不能違背人權和正當程序。

------------------

投稿用文章,這部落格真的好久沒更新了XDDDDDDD 全文連結

星期四, 10月 04, 2012

墾丁行

由於連續三個月在血管攝影室工作,搞到人非常低落(有時真厭惡工作,但偏偏我又不是一人吃飽,全家吃飽)。為了紓壓就選擇全家去十幾年沒去的墾丁。 久違的墾丁凱撒飯店,可供喝咖啡欣賞風景的大廳一角。

住房選擇花園套房。多了外面可以連通游泳池的小房間。小房間有種樹,稍微有種叢林的感覺,很遺憾的是游泳池沒有去泡,蚊蟲倒是一堆。住進大飯店大套房的第一件事情是打蚊子....

花園套房連通到外面的情景,只可惜除了蚊子之外沒享受到甚麼XD

夜晚的墾丁大街。當飯店附的高級自助餐吃完以後,就是到處去覓食了。

海洋生物博物館,來墾丁的最大行程之一。最可怕的是剛好血管攝影室的老闆也剛好同一時間在海生館全家出遊,還剛好不期而遇,只能說孽緣不淺嗎?XDDDDDD

夜晚娛樂之一,凱薩大飯店B1的復古電動,宛如進入時光隧道,光陰倒流到我只有國小的時候啊,畫面中這個氣墊球桌非常有特色,似乎是只有投錢的人才會贏,我跟我妹玩了一次,投錢的是我妹,所以我進的球都沒有分數。第一次碰到這種規則的XDDDDD

時光隧道之復古轟炸超人,聽到音樂差點眼淚跟眼屎都快流出來了。圖中有隻可愛的大學女生小手。我和我妹玩得很開心。

去過一趟之後壓力削減不少。當然最開心的還是離開血管攝影室,但這又是另一個故事了.... 全文連結

星期二, 7月 31, 2012

Deus Ex: human revolution


deus_ex_human_revolution

最近玩過的RPG中最好玩的一款,個人評價比KoA:R或The witcher 2還要高!

乍看下是科幻風格的FPS,但FPS的比重其實不高,戰鬥的部分更重視的是隱匿行動和破解,由經驗值就可以看出端倪:殺死一個敵人只能得到10~20經驗值,把敵人打暈可能能拿50。從頭到尾沒被敵人目擊可以得500。破解的話,要是能破解對方的砲台或機器人,使之攻擊自己人,或把監視器關掉,關卡的難度都會大大降低。而且主角的能力雖然很強,但正面挨子彈卻挨不了幾槍,遊戲擺明了不是類似Doom一人從頭殺到尾那種。

Deus-Ex-Human-Revolution-6151

劇情部分就不多做說明。模糊來說男主角的公司在重大突破發表前被襲擊。男主角一路追查弄清楚事情真相。遊戲最後的數個結局讓玩家自由選擇,代表了對不同價值的重視。怎麼選擇就看個人。

下一款RPG,預計要玩Bioshock,Metacritics 九十幾分的高分,雖然過了五年,但也值得見識一下。
全文連結