pretty code

顯示具有 工作 標籤的文章。 顯示所有文章
顯示具有 工作 標籤的文章。 顯示所有文章

2025年7月6日 星期日

人的記憶力很不可取

早上連回工作站確認昨天測試結果,順便試一下還沒測試的參數。

突然無意間發現,似乎有一段 code 沒有整理到之前簡報?

馬上回去 review power point,沒想到我當初就有寫進去?

完全不計得有這回事?

最近測試很不順利,從上星期四晚上 debug 到今天還不能跑過所有的 PHY test!雖然這星期又多過了 2 個測試項,但還是覺得很阿雜。

我想應該要靜下心來好好重頭看過所有的文件,不要先入為主的認為沒用就心不在焉的看過!

就從我整理的 power point 及 word 文件開始好了,畢竟就連我有寫過的我都忘記了XD

2025年6月26日 星期四

Gatesim 終於可以 compile 成功了

坦白說,我一直很不喜歡 Synopsys!

尤其最近的一個工作項目是要跑他提供的 IP Testbench。

大部分情況下,我們從客戶那拿到的 input 都是 netlist,所以,IP 相關的文件會提到如何做客戶 design 的 gatesim!(實際上,他文件寫的對我解決問題都沒幫助!)

雖然我們客戶某些 rtl 資料夾不想給我們,但因為那本來就跟 netlist 無關,故不給好像也還合理?

但是當使用 NCVerilog 編譯的時候,連 Synopsys 自己 Testbench 的相關檔案編譯都會有錯誤,這我實在是不能接受!

我能接受你只給 vcs 的 Testbench,但既然你有 option 可以選擇,理論上你應該要測試過沒問題才對?

但從昨天中午拿到客戶最後給的 C code 檔案後,我都一直在解決編譯的錯誤,直到今天晚上 10 點左右,我才順利跑起 simulation!

雖然這兩天大部分的時間都在跟我同事看他 Testbench 的問題,即使扣掉開會及上課的時間,我應該至少也花了 4 ~ 5 個小時有,真的是浪費我的生命XD

拿這些時間多寫幾個 Vim functions 來幫助我工作不是更好嗎?

不如歸去呀XD

2025/06/27 更新

果然如我預期,早上上班登入工作站看到的結果是失敗。

此時第一件事一定是 dump waveform,優先檢查的是 clock 和 reset。

不過,Synopsys 提供的 define 打開就會報錯!還好這個錯誤是可以 Google 到的,只是 LD_PATH 設定的問題,不過,我自己得先補一個 NCVerilog 參數。

但在我一時還找不到 LD_PATH 該設的正確路徑時,為了不浪費中午的時間,於是自己寫一個 initial block 直接 dump VCD 最快,只要硬碟不要爆掉就好XD

稍微看了一下似乎沒看到異常的訊號?

下午只好又繼續翻閱各個文件。

晚上回家連回公司時,忽然想到何不試試 JTAG protocol?

雖然最簡單的 REVISION_CHECK 可以通過,但其他都會報錯,暫時還想不到解法,不過我應該會往自己有修改過的 Verilog 檔案去下手檢查?

2025/06/28 更新

雖然本來就有打算放假連回公司繼續測試,但每測試一次就要等一陣子,實在緩不濟急。

還好,據我多年 coding 經驗,EDA 只要還是由軟體人所開發,我大概就能知道他們是如何設計的?

雖然我可以無腦的複製一份最上層的資料夾再做另一個測試,但是很多 file_list 路徑都要修改,當然這也不是什麼太困難的事,但最麻煩的是我的工作站空間已經不足,我連 dump VCD 都不夠了,雖然我可以 dump fsdb,但不知為何似乎是 license 原因,我無法開啟 fsdb 檔案,故我還是需要 VCD 比較實在。

為了不浪費空間,而我的多個測試也不需要更動 Testbench 內容,最多只是調整 test script 參數。

最好的方式就是只複製 test script、test script 裡面用到的檔案(比如說直接透過 command line 傳給 xrun 的,非 file_list)、幾個 include 檔案(位在測試路徑下的,這些才是動態產生的,原本就在 Testbench 那包的,大部分都不需要修改,故用同一份即可),這些就是我最低限度的檔案,只複製這幾個檔案,我隨時可以長出好幾個測試,這樣更能加速我驗證收斂問題。

現在能限制我的就只剩下 NCVerilog license 個數了!

但我家只有 2 個呀XD 

2025年6月24日 星期二

詠春三板斧

一代宗師的武術界曾提到這樣一句話:詠春來來去去就是那三板斧!

今天不知為何在工作時想到這句話?

突然發現,其實我現在的工作每天也是只有用到三板斧XD

我目前工作的三板斧為:Vim、grep、sed。

Vim 不用多說,我自己就寫了一堆 Vim script functions,即使不算自己的 Vim function,我每天用到的 Vim 功能至少就 10 個以上起跳XD

不誇張的說,沒有 Vim,我大概沒辦法工作了!

其次是 grep,很多時候我要解決的問題或是完成手上的工作,說穿了就是在一堆資料中找東東!有了 grep 的幫助,真的節省我很多時間。

最後則是 sed,grep 找到的資料透過 sed 可以輕易的切出任何我要的片段,只要下對 regex,大概事情就完成一半了XD

如果硬要加上第四板斧,我想這道板斧應該就是 find 指令無誤!

Linux 與 Vim 的世界就是這樣的樸實無華,每天都能發現新玩意?

就像是我請教我主管問題一樣,不管何時都是如沐春風!

2025年6月22日 星期日

第一次覺得 AI 有幫助

昨天快篩一條線後,今天終於回了父母家一趟,所以放假這兩天其實都沒什麼在碰 Vim!

晚上回來後,想說來替 Vim 加一個功能好了XD


但是很多時候,我們好奇的是這根訊號它又被穿到哪個 module or cell 了!

如果是 cell 那還好辦,畢竟 pin 不會太多。

假設是另一個 module 或是 hard macro,此時 pin 的個數便會很多,甚至在一頁內都看不到 instantiation 的地方?

雖然可以用搜尋的方式找到分號,接著找右大括號,然後用 % 跳到左大括號,如此一來,我們就可以看到 instantiation 的 module name or cell name 了!

不過,如果可以比照 module 一樣處理,工作當然更方便。

可惜,這次用 Google 搜尋 Vim script 關鍵字都不順利,Vim help 又不好閱讀,於是直接詢問 Gemimi,想不到比我用 Google 快?

結論就是我又可以豐富我的 vimrc 了XD


2025/06/23 更新

今天去辦公室馬上拿真實的 netlist 來測試,果然還不錯,除了要稍微修改 regex 外,畢竟,真實的 netlist pin 很多,我原本的假設不一定成立!

不過,重點還是 [".", "(", ")"] 這 3 個字元是否存在於 hightlight 那行,假設有任一個存在,我就當作是 instantiation 語法!

目前使用的感想還行XD

2024年11月12日 星期二

怪事年年有

今天突然收到 IT 的資安警告信,意思是 Google Chrome Cache 資料夾偵測到類似木馬程式的東西!

印象中前幾個禮拜忙著 PAD Placement 時,Windows 就跳出過兩次警告,一次是 10/25 ,另一次是 10/29,為了這個,還把 Chrome 所有資料都刪過一次,沒想到今天居然又出現一樣的警告?

不敢說 8 個小時都在上班,但至少一天都認真工作 7 個小時以上,所以上的網站應該都是跟 Search IC 設計有關的!沒辦法,很多時候沒有文件,也只能透過 Google 找尋靈感。

如果以 10/29 以後為分界,我上最多的應該是全球最大男性交友網站 - github.com?

奇怪的點是,從年初來到這個新部門,上網找資料模式並未改變,之前為了查資料也很常上大陸及外國網站,但偏偏從 10/25 才開始陸續跳出警告?

之前第一次跳出警告,應該是忙著跟 OpenROAD 奮戰,故沒有看到什麼訊息就被我不小心按掉了,後來在事件檢視器及 Defender 頁面查了半天,都找不到警告訊息來源,也是透過 Google Search 才知道,Defender 事件是位在下面位置:

事件檢視器 -> 應用程式及服務記錄檔 -> Microsoft -> Windows -> Windows Defender -> Operational。

從這裡有記錄的時間得知,這邊的 Log 資料,最早日期可以追朔到 9 月初,應該是剛更新完電腦系統沒多久,故才沒有更早之前的記錄。

但問題來了,既然上網模式沒變,為什麼會跳出此訊息?

目前只能想到 3 個原因:

01. 被電腦或手機的 Chrome 同步到公司電腦,但這兩個地方我很少上網,大部分都是在滑 PTT。
02. Windowd Defender 誤判。
03. 大陸或國外網站真的有問題。

但工作又不可能不 Google,至少我現在還是菜鳥,不可能不上網找資料!

同樣也只能想到 3 個解法:

01. 自己租用 VM 專門用來上網查資料。
02. 買台小電腦帶去公司用手機網路查資料。
03. 乾脆就不查了XD

明明就很認真工作,今年居然收到兩次資安警告信,真是莫名的冤屈XD

2024年9月14日 星期六

2024 week 37 新玩意

01. 不要太相信 EDA 文件

我是不知道 EDA 授權金額多少錢,但 EDA 文件普遍寫得不好倒是真的,看起來寫了很多,但對解決問題沒啥幫助,不然就是文件寫的跟指令實際行為有時候會對不起來。

不過前提是文件要先從頭到尾認真看一遍,最好要看 2 ~ 3 遍,如果還是覺得哪邊怪,那恭喜你,你不孤單XD

02. 除非特例,少用 GUI mode,不然容易當機

我們跑的設計應該很小,但我這星期就遇到當機 2 ~ 3 次了,原本都以為是該指令要跑很久,後來越想越不對勁,去 EDA license 頁面確認,果然該 license 已經沒有被占用,資源是已釋放的狀態。

我猜,EDA 應該有另一個 thread 定期回報授權主機,避免當機占用 license,畢竟授權不便宜。

因此,不管是在哪個模式下,如果覺得 EDA 好像當機了,給它個面子等個 30 分鐘左右,如果從授權主機看不到你的使用授權,就可以放心地使用 kill 砍掉該 process。

印象中,top 指令看到都還是 run,而不是 zombie?

03. EDA 相關工作要建立 SOP

EDA 動不動就要跑很久,錯了再來一次的時間成本很寶貴。

要做什麼之前最好先想好,檢查再檢查,最好有 check list 可以檢查。

Vim、Shell Script、grep 各種技巧要不斷精進,這都是可以提高工作效率的投資。

要建立自己的工作模式,比如開幾個工作視窗,要不要用分頁,視窗要擺在哪邊,養成下意識的動作,做起事來會比較流暢。

2024年6月12日 星期三

關於 Verilog parser 這件事

連假都在盡最後努力讓自己的聖騎升上 97 級,再加上手上沒有那樣大的 netlist 檔案,所以放假三天就在打電動中渡過了XD

昨天一早就用 cProfile 確定最慢的執行函數是什麼?果不其然,前三名是 PLY yacc.py - parseopt_notrack、 PLY lex.py - token 以及 re.match,第四名 pyverilog parser.py - p_items 看起來貌似 constructor 沒錯?


光前三個就跑了 25 分鐘以上(cProfile 會增加程式執行時間,跑起來要更有耐心)。

要細究是哪個段落花時間只能 print message 了,但我想幫助不大,因為 PLY 應該已經是 Python 最有名的 lex/yacc solution 了,要優化應該也不是一天兩天的事。

順便實測其他 EDA tool 的花費時間,原來也不是我想的秒等級!

雖然這樣比有點不公平,比如 DC 還需要知道 cell library,還有不論是 DC or yosys,貌似 read_verilog 不只是 parsing 都還順便建立了 RTLIL 中介層,應該是比 pyverilog 只用一般資料結構儲存花時間,但也只能這樣比較了,畢竟我已經無法再細拆 command 了。

同樣的 netlist 檔案,花費秒數如下:

DC - 191
yosys - 380
pyverilog (建完語法樹) - 1546,離開程式 Python 釋放記憶體又花了至少 100 秒。

嗯,果然還是有一段差距。

2024/06/18 更新

透過 cProfile 分析得知,parser 花了很多時間做 match,撇開 C vs Python 語言差異不談,最快的解決方式就是只要處理 netlist 語法即可,不需要處理整個 Verilog 語法。

稍微查了一下,只有看到 C 語言版本的 netlist parser,再加上看 EDA 文件真的很 borning(EDA 文件都要真的操作才有感覺,還沒碰過的光看文件,坦白說收益不大),所以還是自己來吧。

從上星期五開始,扣掉家裡有事請假外,總共花了 16.5 小時使用 Python 實作。

概念也是非常簡單,我有一個函數負責取得以分號為結尾的字串或是 endmodule 關鍵字,這裡我稱呼它為工作字串,再來就是對工作字串做比對,只要分別針對 module,port,net,cell instance 處理並儲存結果即可。

目前暫時還沒想到 assign 要儲存啥以及偷懶不想處理一維陣列以上的情況,其餘我知道的語法都已處理完畢。

開發時間分析如下:

得到可以工作的字串 - 2.5 小時
使用 Rex 處理所有語法 - 8 小時
將儲存的資料結構轉成 pyverilog 的輸出格式 - 6 小時

程式碼行數:

得到工作字串 - 89 行
輸出 Verilog - 149 行
Rex 處理及其他 - 455 行

程式執行時間:

單純 parsing 及儲存 - 225 秒
輸出 Verilog - 56 秒

下面則是我的 netlist parser cProfile 結果:


目前還算滿意XD

雖然從結果來看,還是有進一步優化的可能性,但我覺得最多不可能再減少超過 50 秒?

就算再減少 50 秒也沒意義!我只有處理 netlist,不像 EDA Tool 處理整個 Verilog 語法,這樣的 parser 跟商用軟體比還是有段距離,但貌似我的工作大部分應該還是針對 netlist 做事?

個人還是覺得 lex/yacc 的方法比較正統,不像我的 code 為了解決縮排,使用者 Code 亂以及空白字元等問題,需要一些 if/else 來處理(取工作字串 89 行程式碼中,大部分都是在處理這些事情),這樣的 code 看起來也不開心XD

2024/06/21 更新

前天進公司後,想了一下還是加上多維陣列的功能,大概花了不到 5 分鐘吧。

沒想到這兩天拿它來試試其他手上有的 netlist,陸續又發現了一些問題,也順便修了 pin net 中,有 range 及 array 情況下,Rex 沒下好導致 capture group 抓取不正確的問題,昨天下午看了 Verilog 2001 Spec 後還發現我搞錯順序了,應該是先陣列才是 range,目前應該都沒問題了吧?

為了這個多維陣列,code 多了 30 幾行,程式執行時間也多了 20 幾秒,目前 parsing 大概要跑 245 秒左右。

單純 parsing


單純 parsing 加上處理多維陣列結果


最後想嘗試一下把我這個 parser 用到之前拔電路的小程式中,一般來說,我有兩個選擇:

1. 將我目前用的簡單資料結構轉成 pyverilog ast 結構再加上個別 class visit function,這樣我不用去改原本的 code。

2. 配合我 parser 用的簡單資料結構改寫我原本的 code。

目前是嘗試使用方法二,今天應該就能知道結果了。

對了,這個 600 多萬行的 Verilog,我的 parser 執行時會用掉 10G 多一點的記憶體,離開好像也是要花個幾秒等記憶體釋放。

跟之前用 pyverilog 的小程式比較,大概快了 35 分鐘,也不枉費我這幾天的努力XD


我的程式總共建了 9 條 Rex。

因為我的程式把行打散了,故我無法得知行數資訊,先前簡單用個 group 概念好讓自己的輸出接近 pyverilog 格式。

之前是用 yosys read_verilog + write_verilog 方式來驗證我的 parser 正確性,我們可以用 design -reset command 將兩個要比較的檔案寫在同一個 script 讓 yosys 幫忙轉檔,同一個檔案,讀加寫要花 30 分鐘(沒記錯的話,寫檔就花了 20 幾分鐘)。

由於之前就知道要怎麼改,故最後還是把 module.port_list 再包一層,裡面儲存另一個 list,這樣我就能讓同 group 的在同一行輸出,加上這個功能之後,我的輸出基本上就跟 pyverilog 一致,除了多維陣列還未驗證過 pyverilog 格式長怎樣。

也因為這樣輸出 verilog 函數行數再度減少,最終版本 parser 包含測試 main 函數只有 701 行(先前的行數統計也是包含 main)。

目前只剩一個謎題待解?

我能理解 pyverilog 因為比對緣故所以花了很多時間,但為什麼單純輸出 verilog 也要花上 10 來分鐘,對比我的 60 秒確實是有不小的差距!我猜 pyverilog 應該是使用 template file 方式產生 verilog,故浪費了很多時間在 File IO 。

其實 yosys 寫檔時間比 pyverilog 還更誇張,我能想到的就是它又二次轉了資料結構以利 verilog 輸出?

剛剛看了一下,輸出是在 yosys/backends/verilog/verilog_backend.cc 這支檔案,看起來是用 RTLIL::Design *design 來儲存整個 netlist,並直接用 std::ostream *&f 寫到 output,看來想知道事情緣由還是要把整個程式碼看過一遍才行。

2024/06/23 更新

快速的看了一下 yosys code,backend - write_verilog 呼叫順序為:

yosys/kernel/driver.cc - main 函數入口
中間未看…
yosys/kernel/register.cc - Backend::execute(這個應該沒有,因為被 verilog_backend 繼承了)
yosys/backends/verilog/verilog_backend.cc - execute,這裡會呼叫 Backends::extra_args,裡面會把 
原本是 NULL 的 std::ostream 在這裡開檔,之後便能寫檔了,這也是為什麼 execute 會接受一個 std::ostream *&f 的緣故,因為需要在這裡 new instance。

2024/06/25 更新

yosys 可以吃 tcl script file,故有用到 Tcl 提供的介面,script 裡面要執行的 command 其 callback 在 kernel/yosys.cc - tcl_yosys_cmd。

在 Pass::call 的過程中,便會呼叫到繼承 Pass 的相關 struct。

2024/06/26 更新

沒用 C++ 寫過大型程式,別說你懂 C++!

從以前到現在沒有認真記過 C++ 語法,導致看 yosys code 很吃力!很多執行順序不是現在的我看的出來的!

The virtual function of base class means inheritance class can override it, you could use override to tell compiler the function is overrided.

baes - virtual void function( )
inheritance - void function( ) override {}

The virtual function of base class equals 0 means the base class can't be created. The inheritance class must override this function.

base - virtual void function ( ) = 0
inheritance - void function ( ) override {}

另外,如果 class 有 static function,其 各個 Pass constructor 會在 main 之前就被呼叫,可能要看 C++11 3.6 節,這是我用 gdb 單步執行才發現的(我的理解可能有誤,至少我另外寫支小程式看不到這個現象?)。

kernel/register.cc - struct Pass 有一個成員 next_queued_pass,在 constructor 時會被設定,然後透過 register.cc global variable - first_queued_pass 記住最後一個 constructor 的 Pass。

接著 main 函數中會呼叫 yosys_setup,裡面會再呼叫 Pass::init_register(執行順序會倒著回來,之前的 first_queued_pass 記住的是最後一個 Pass constructor,沒記錯的話是 techlibs/sf2 - SynthSf2Pass)。

Pass::init_register 裡面會再呼叫 Pass::run_gister。

然後就是對 global variable - pass_register 設值,map 用的 key 就是 pass_name。

之後假設是執行 script 裡面的 command,最後就是在 Pass::call 裡面利用 pass_register 去執行該指令(pre_execute、execute、post_execute),這樣又會回到繼承 Pass 的 struct 裡的 execute 函數(backends/verilog/verilog_backend.cc - execute),因為已經被 override 了。


看到這邊對 yosys 怎麼呼叫有感覺了,應該不會再看下去了?

另外,今天針對同一個 netlist 呼叫 yosys read_verilog and write_verilog,真的要花 31 分鐘左右,這樣看來寫檔真的要 20 幾分鐘跑不掉。

接著把 yosys 儲存的 netlist 再用我的 parser 測試,parsing 時間又增加了 20 幾秒,寫 netlist 還是差不多 60 秒左右,總花費時間大概是在 360 秒內吧?

pyverilog 總執行時間則是暴增到 54 多分鐘(3275 seconds)。

其實這也很容易解釋,yosys write_verilog 對每個 wire declaration 都是單獨一行,故增加了 parsing 時間也是尚屬合理。

原本 netlsit - 340M,  618 萬行。
yosys netlist - 390M, 2166 萬行。

2024/06/27 更新

終於知道為什麼繼承 Pass 的 struct 都會在 main 之前 call constructor 了!跟 static member function沒有關係。

yosys 在每個繼承 Pass 的 struct 最後面宣告處宣告了一個 global static variable,所以才會在 main 之前 call constructor。

以工作站的 yosys 版本來說,總共有 235 Pass 被初始化了。

也就是下面圖片 Line 9 做的事。


下面是 GDB 下中斷的結果


我們可以用 grep -E -r '^\}\s*[a-zA-Z0-9]+\s*;' 找出所有這樣宣告的 Pass,這裡以 backends 為例。


2024/07/08 更新


parsing 106 秒
save netlist 22 秒

對比 Python 版

parsing 268 秒
save netlist 60 秒

搞定,收工XD

2024年6月8日 星期六

2024 week 23 新玩意

01. DC log level information

這兩天突然發現自己移植的 DC script 居然都沒原始專案的 log 輸出?明明該有的 output 檔案都在,但不論是螢幕還是 log 都看不到執行該 command 的顯示!

本來以為是自己多下了一個 tee -i 的參數,從 man 中又看不出有什麼關聯?

終於在昨天中午想通了,一般來說,我們會用 -f script 的方式來執行 DC,如果該 script 裡面有 DC command 便會顯示執行結果。

但我的 script 裡面又帶了一層 script,我真正的 command 都是位在第二層,所以當然什麼都看不到,也算是學了一課。

02. MBFF 

2010 我就有看到台大學生的論文在研究這個,所以應該不是新東西?難道 IC 產業是學術跑在實務前面?

03. Verilog Parser 待釐清事項

之前有簡單寫個用 Rex 來 parsing netlist 的 parser,雖然我只是測試抓取的部分,並未實際去產生對應的資料結構來儲存資料,實測的結果都不需要 3 分鐘。

昨天拿最近用 DC 跑完的 netlist 測試一下,速度依然很快,但在我只建 3 條表示式的 rule 中,就有兩條有些 statement 語句判斷不到,印象中我有處理 escaped identifier 這塊,DC 又有 rule command 可以避免使用奇怪的命名規則,理論應該會比 yosys netlist 來得好才對?改天 EDA 文件看煩了再來試試。

回到 pyverilog 本身,使用 lex/yacc 的方式應該是最正規了,問題是出在 match token 速度才那麼慢嗎?還是在 Python 建資料結構時 constructor 拖慢了速度?

明明其他 EDA parsing 都只花了不到 5 分鐘,難道只是 C/C++ vs Python 的差異?

昨天沒想到,現在 Profile 功能應該已經內建在 Python3,跑一下就知道原因發生在哪?

04. Windows 11 升級

最近微軟不知又發什麼神經,Team Classic 又要改版,偏偏新版又跟著作業系統,而我的電腦就是屬於需升級的那批。

之前為了加速開發,自己買了一顆 SSD 當作業碟,才發現空間已經用了快一半!既然現在已經轉部門半年了,很多軟體跟資料都用不到了,便趁此機會把軟體都移除,目前已用空間還有 15X G,但已經比之前好多了。

不過貌似 Windows 11 升級檢查軟體在 IT DC 環境下不能執行?所以我也不知道是否能升級,但單以 CPU 來看我的 10 年前電腦應該是不在支援清單中。

算了不升級也好,還要浪費半天時間不能做事,抱電腦回來又要再花半天整理工作環境,幸好目前部門我只需要 Vim,Python 跟遠端登入軟體即可,應該不用像以前一樣一堆東西要裝。

下次線上上課只能用 Team Web App,但要記得使用 FireFox,不要用 Chrome,不然就會像某年上資安課一樣一直斷線,被人事判斷沒有上課,導致一樣的課上了兩次,追根究柢都是微軟寫的軟體不好XD

2024年6月7日 星期五

AT 叛客

昨天差點被當成不法分子,真的是好氣又好笑,以後不那麼認真了XD

有鑒於 EDA 或是跟 IC Desing 有關的工具使用,動輒都是好幾個小時或是天起跳,連個 Verilog Parser 都要快半小時!

昨天不知為什麼突然想到(應該是一直看 EDA 文件很容易分心XD),既然純 Python code 很慢,用像是 PyInstaller 的工具包成執行檔後,執行速度是不是會比較快?

印象中之前有寫個等公車的小程式,裡面就有使用 PyInstaller,我就不用再去找參數怎麼用了,下載下來後,一執行安裝 batch,Windows Defender 就一直跳出警告,說是判斷有病毒,稍微查了一下應該是被當成惡意程式,調整了參數,還是會被誤判,後來去忙別的事我也就忘了XD

下午 4 點多時突然接到 IT 郵件,說是發現在執行惡意程式,於是寫信回復事情發生原由(突然想到,郵件裡有 CC 主管嗎?昨天沒特別注意,沒有的話要報告一下)。

原來我已經轉型成駭客我都不知道了XD

對了,昨天是自己耍白癡,PyInstaller 只是包成執行檔,並沒有重新編譯,應該是對執行時間沒有幫助,昨天不知道為什麼會突然覺得有用?一定是太久沒寫程式,腦袋都僵化了,來到新部門後,似乎還沒發現寫程式在這邊有甚麼用?可能是我還太嫩了吧,目前只感覺這些東西很吃經驗,至於能不能寫程式幫助其他同事,我還真的不太肯定XD

突然好懷念 AT 叛客這個暱稱,離開會計本業也快 20 年了,現在的路也不知道到底走得對不對?

後記

用家裡訂閱的小紅傘測試了一下,也是跳出差不多的警告,這樣我就放心了XD

俗話說的好,寧願錯殺也不要錯放,畢竟不管是家裡還是公司電腦,都是拿來做事的,最怕的是什麼都偵測不出來,這樣我才會害怕XD


話雖如此,昨天下班前還是不放心地針對整個 Python 安裝目錄掃瞄了一下,理所當然的是回報沒有問題?

唉,程式設計師不可能永遠自己造輪子,現在第三方函式庫又常有漏洞,除了有專門的團隊每天去追蹤這些資安資訊,一般程式設計師還記的自己用過什麼函式庫已經很厲害了,怎麼可能還定期去看是否有更新,自己沒待過像是 Google 這樣的大公司,不知道他們都是怎樣解決的?

2024年2月26日 星期一

cell library parser

看了好多天的文件,有點阿雜XD

因為工作站無法自行安裝 Python module,想要檢查 cell library 的目標一直無法達成。今天簡單用 regex + stack + FSM 寫個 parser,parser 部分花了 3 個小時,另外又花了半小時將之前用 Python module 寫的 code 複用。

兩個 Open cell library 檔案加一個 TSMC cell library 看起來都可以 parsing,只是不知為何工作站 parsing TSMC 69 M 大小的檔案大概要花 7 秒鐘,可能是先 parsing 到 list 再從 list iterate loop 花了一點時間,但整體還算滿意。

有機會還是要學 Compiler 使用正統的 parsing 方式,雖然要利用第三方工具,但之後擴充應該比較容易?

目前 cell library 這樣的格式看起來擴充性還行?

2023年12月6日 星期三

離職交接真是門大學問

最近最讓我頭痛的一個交接項目是我剛來這家公司參與的專案,這個專案的目的是要管理 Android based 設備,因為 OTA 等特殊操作緣故,我們的 app 需要 sign key。除了 Client 端,我們 Server 端將 API 與 DB API 切開,故整體又分為兩大 Server。

當初我負責的是 DB 部份,一開始只會寫 C 和把 PHP 當 script 的我,對 Web 架構並沒有那樣熟悉,故使用 C 來寫 Apache 的 plug-in,中間使用 FastCGI protocol 來溝通,這樣的好處是 Web Request 流量可以由 Apache 來承擔,只要頭過身就過?當然我自己本身的處理能力要夠快,這部份的瓶頸一開始只會出現在 DB 端,只要 device 數量不要太誇張,理論上都沒什麼問題。印象當初透過模擬器測試,1000 ~ 2000 台是沒什麼大問題,除了上下載的檔案不能過大否則容易 timeout。

因為最新 Android 版本和當初開發版本已經離很遠了,有些 API 或權限改變不能用那都是可預期的,再加上現在都是用 Android Studio 當開發環境,故這個專案交接其實只要知道 Code 跟文件放在哪裡就好,坦白說這很合理,這個專案應該不會再有重見天日的一天XD

但既然要交接,想說至少讓 Server 端拉最新 Code 下來,配合現在 Node.js 等版本,讓他可以無痛跑起來,避免以後真的要用沒人可以處理,這樣也算是我的小小心意。

沒想到就是這個決定,害我邁向偉大航道的計劃一直無法順利展開,假日除了忙家人的事、土炮結構光比較外,其餘時間都在想怎樣讓 Server 在新的開發環境版本下能夠繼續存活,避免改動更多的 Code。

Web Server

這部份是當初前同事寫的,完全都用 Node.js 開發,但他當初離職交接文件有註明:因為要混淆 code 關係,Node.js 只能用很舊的版本(6.X -> 0.12),而目前最新 LTS 版本是 20.10.0。從這可以看出這中間變化一定不小,為了更貼近現況,我決定使用我目前手上的版本 18.X,這是兩年內的版本,還算可以接受,理論上應該要跳到最新版本,但顧慮到其他人手上版本大概也是介於 18.X 前後,便決定使用這個版本。

前同事很貼心的寫了批次檔可以一鍵安裝,但安裝後一直無法順利執行,原本以為是同事離職文件提到的 npm issue,在多次安裝後依然無法解決。後來靜下心來一看,錯誤雖然是說找不到模組,但確實是有安裝成功,還好在經歷了之前幾個交接項目的荼毒,認定是版本問題,去 N 年前的開發資料夾找到版本號並更新到 package.json,大概改動了幾項,執行便不再有問題。故問題的本質是不要用 * 號當版本號。

其實這會有資安問題,但除非一直用最新版本 daily build 每日做檢查,不然隔一段時間一次進最新版的問題會讓你想哭,由於我沒待過像亞馬遜那樣的大公司,我本身也不是寫 Node.js 的,目前還沒想到怎樣的方式才是最好的?

Device Simulator

搞定 Server 後,雖然已經沒有當初的 Android device 可以跑,但 N 年前我寫了一個可以模擬多台 device 的模擬器,雖然我只實作測試 peformance 需要的指令,但拿來驗證 Server 綽綽有餘!

無奈 socket.io 一直斷線,依稀記得似乎是兩邊的版本要一致?老樣子,找到當初 socket.io 相關模組用版本號,同時更新 Server 及 Simulator package 後,這部份就搞定了。

Record Server

坦白說在搞定上面兩項後,我已經一夜白髮了XD

但路都走到這裡了,還是想完成當初內心承諾,於是再接再勵的勇往直前!原本以為這是最簡單的,畢竟是當初自己開發的,沒想到安裝和設定雖然簡單,但透過 UI 設定 Record Server 的最後步驟一直無法成功?

雖然我都有 Log,但全部架構已經遺忘的差不多了,回頭看文件也是一頭霧水,故一時間也看不出所以然,再加上之前判斷錯誤那一行寫的不嚴謹,多往下做了幾個無謂動作,最後將 Log filter 開到最細並且回過頭來從 request 端看到出問題地方的 code,才讓我發現問題不是出在接收端,而是在我必須發 API 給 Web Server 取 token 那端發生錯誤,由於我使用的是很有名的 libcurl 函式庫,故用我當初最粗 Log filter 的關鍵字就可以 google了,而這個錯誤就是 error code 35。

A problem occurred somewhere in the SSL/TLS handshake. You really want the error buffer and read the message there as it pinpoints the problem slightly more. Could be certificates (file formats, paths, permissions), passwords, and others.

從官方文件可以得知問題是出在 HTTPS 握手階段,只可惜雖然我有將 libcurl debug mode 打開,但並未看到更多錯誤訊息。

我依稀聽過這似乎是 HTTPS 安全性政策更新造成的問題,最初的 SSL 早就被禁用,還好我當初就有留指定 TLS 版本的 code,將註解打開並重新編譯執行檔即可。但不論我指定 1.1 還是 1.2,error code 35 依舊發生?

這不禁讓我懷疑是不是又是 Web Server 某些模組版本需要調整?思考了一下,還是看看之前自己來公司到現在寫的測試資料夾裡面是不是有什麼可以快速發 Web Request 的 code 來利用,我應該至少要有 Node.js、Python、Golang 的資料夾可以搜尋?

剛好第一個找到的就是 Node.js example,用的又是內建模組 https,完全是我需要的,這樣可以先排除版本問題XD

不試不知道,Web Server 居然有收到 API?但我還是很不敢相信,還好當初這個專案開發完後,有鑒於用 C 開發 Web Service 真是自討苦吃,故當初有稍微自學一下 Golang,並稍微的開發 Golang 版的 Record Server,雖然只實作了 3 個 API,但剛好也是 UI 打過來的 API,拿來驗證也是綽綽有餘,最後發現我的 Golang 版 Server 也是可以順利的發 API 給 Web Server。

事已至此,我也認命了,一定是 libcurl 的問題,雖然我不知道為什麼 TLS 1.2 會有問題就是?

之前用了好幾個第三方 C/C++ 模組,除了一個是 C++ Template 外,每個都要用我慣用的 GCC 重新編譯。

本想直接使用 vcpkg + VC 來搞定,但鑒於之前的使用經驗,我也不會期待可以一次搞定!幸好天公疼憨人,想到去年當 C++ 講師時,為了讓學員最後一堂課作業方便使用,當初網路爬蟲沒有使用 boost 而仍舊使用 libcurl,記得當初所用版本打開 TLS 1.2 是正常的?

最後直接使用官方下載的最新編譯好版本(8.4.0_9)配合我舊版的 TDM-gcc(9.2.0)也是無痛接軌,且此版本似乎不再依賴 openssl?至少我只有 link libcurl.dll.a 加上執行時期的 libcurl.dll 便可以執行 HTTPS request。

終於整體 Server 架構都已搞定,看著訊息打來打去,DB 也如預期的記錄系統使用率歷史資料,今天只要順利跑過一整天測試,我終於可以完成最後一項交接項目了!

後記

一來辦公室就開始壓力測試,昨天下班前無聊順手點了一下 screenshot 指令,device simulator 居然會 crash,雖然多做了錯誤檢查避開這個奇怪錯誤,但想說還是在壓力測試前試著搞定本來可以用的指令?還好昨天洗澡時就覺得這個問題好像跟兩年前幫另一個同事解決 issue 的狀況很像,都是 multiparty form-data empy?

邊喝咖啡邊看之前的 Tech-Note,看來是 Node.js 14 開始,某些平台 stream 會有問題,指定 multiparty = 4.2.2 即可。

今天終於可以輕鬆一下了,只要測試沒有其他大問題,我可以慢慢地為這最後一個交接項目收尾了,一切真是得來不易呀,畢竟也從上星期開始搞到今天XD

放張多台 device screenshot command result 圖留作紀念。


下午還是花了點時間確認一下 openssl 版本,如下圖所示,1.0.1 才算正式支援。我 N 年前使用的 libcurl link 的是 1.0.0o,這也是為什麼不支援 TLS 1.2 的真正原因。


要下班了,留個記錄先,看起來大部份元件有定期回收機制,故會重啟 process,目前只有我的 Record App 和 node.exe 記憶體增加了,但應該尚屬合理,只有大量且多日的壓力測試才能做更進一步的分析。


2023/12/08 更新

前天電腦沒關機讓他又跑了一天,直到昨天 7 點多下班才關掉所有測試,留下最後記錄XD

2023年11月23日 星期四

有內鬼,停止交易

沒想到老婆大人居然沒聽過這句臺詞,看來我們有代溝?

前天主管突然告知某部門想要和我跟我同事聊聊,看看是否有機會過去幫忙,我們都覺得聊聊也不錯,便在今天跟該部門主管聊了一下。

初步感覺要做的事還蠻有趣的,應該也是我擅長的,便表達有意願過去試試,當然前期免不了要多學一些新的東西,但與純數學比起來確實有趣多了,最主要還是做的事對公司有幫助,畢竟我還蠻喜歡這家公司,我想該主管一定覺得奇怪幹嘛問了好幾次對公司有沒有幫助XD

總之,目前就看該部門最後意願,上不上都不錯。

假設最後過去,手上想做的事要做些安排才行。

簡易管委會財報系統原本預期花 2 天簡單學 Vue.js,3 天時間開發,再留 2 天跑一下 use case,確認這樣的設計對委員們有幫助,畢竟做事還是要有意義,去的話這些事可能就要分段進行,最糟情況在過年放假時完成所有事項?

3D scanner 雖然已經決定買 Pop3,之前問了兩家代理商都沒有現貨,還是改採網路下單排預購?

還是想讓 KOReader 離開後藍牙可以正常,這個應該只能趁假日零碎時間來應用,就讓水到自然渠成吧。

假設最後沒過去,就照之前順序完成相關事項並順便放大假,但中間還想多完成一個 Kobo EInkBro,畢竟 GCP VM 都還沒砍,每月一直燒錢也不是辦法(目前來到歷史新高 NT $170 / per month)XD

2023年11月20日 星期一

交接專案待釐清事項

Go module

go.mod 裡面的 module 是 local path,故重拉一個新的 git 下來時,需執行 go mod download、go get local module\pkg\xxxxx 等、go get local module\cmd,三年前開發時的做法是否是對的?

Node.js npm mongodb

N 年前開發時使用的是 3.1.6 版本,package.json 寫法是 "^3.1.6",此寫法表示是相容該指定版本,此時此刻在我電腦重新拉 git,npm 會安裝 3.7.4 版本,如果執行自動測試,connect MongoDB 便會有問題,錯誤是無法連接,在 package.json 拿掉 ^,再 npm install 一次,強制使用 3.1.6 版本就正常,應該是跟 driver 安全政策有關,待驗證。

更正:不是跟安全性政策有關,單純只是從 Node.js 18 開始,解析 DNS 時,某些環境會導致 localhost 被解析為 IPv6 address,請詳此處。 

其實錯誤訊息也可以看出被解析為 IPv6 address,昨天忙著寫文件沒有時間去解決問題,今天還是順利的找到原因了XD


有時候一個問題要不要修複,其實考量的點很多,絕對不是選擇一條最快解決的路就好。以我例子來說,這是個內部專案不會對外,故沒有安全性問題;同事依照我的文件是否可以正常執行沒有副作用?Yes(當然有極小可能性會有問題,畢竟其他 modules 不一定跟我當初版本一樣,就跟這個問題的發生原因一樣)。

故我昨天強制指定版本就是最快也是對我最方便的解決方式,當然沒有時間順便修掉 warning 也是有點小遺憾,就看之後時間允不允許囉?

2023/11/21 下午更新

早上還不覺得怎樣?下午越想越不對勁!如果說是因為 Node.js 實作的改變,mongodb 本身應該也有用到一些 Node.js 相關呼叫,否則無法解釋指定 3.1.6 版本就沒有問題的事實?

總之,這個問題解法真多,還有不改 code 直接帶參數給 node.exe 的解法!

2023/12/03 更新

版本真的是一個大問題!尤其專案是 N 年前開發的!陸續在其他交接專案都有遇到不能執行的問題,不論是我離職同事寫的 Server 還是我的 Device simulator,還好 N 年前開發時的資料夾還沒砍掉,順利找到當初使用的版本,只是虛驚一場。

這告訴我們一件事,package.json 版本千萬不要使用星號

2023年11月10日 星期五

將來的事將來再說

鄭伊健和張柏芝主演的《蜀山傳》中,徒弟問了師父一個問題,師父只是淡淡的回了一句:將來的事將來再說…

話雖如此,但這將來也是有點久,即使我上星期五就知道答案,但拖到昨天才有非正式通知,也害我多看了沒用的數學 4 天?

這 1Q 的數學深不得我心,可能跟我本來的屬性不合,前 3Q 的至少是偏應用,還可以用學到的知識來土砲結構光系統,但這 1Q 的是純演算法跟數學,又不是要發頂會論文,坦白說我也還未入流,只是在浪費生命罷了。

站在管理的角度來說,這樣很不可取,浪費公司跟我的時間在一個沒有未來的學習,拿去多學一些對公司有用的不是很好,雖說也跟主管稍微提到這樣不行,無奈主管對我很好,我也只能欣然接受。

在這家公司 9 年多了,我對公司只有滿滿的感激,沒賺錢還有幾個月的年中加年終可拿,補班也不用我們上班,年底還有聖誕節可放!

衷心希望公司可以再起一波,只可惜以後沒有益生菌可購買了XD

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

上星期五就已經想好接下來要做什麼了!先簡短記錄,晚點再補細節。

01. 開發社區簡易財報查詢系統。

這一個多月假日除了土砲結構光系統外,有空都在補歷年財報電子檔資料,補到現在也才補了 9 年,算是一件吃力不討好的事,重點是也沒有人要求!責任心還是不要那麼重比較好。

超過 7 年的紙本資料都發霉了,就回朔到 103 年 6 月就好,勢不可去盡…

犧牲了自己假日時間,總算也是有點收穫,追回了一筆兩萬多塊的重覆付款,只能說這個永大很爛!

坦白說開發這個系統對我也沒什麼幫助,過去有建檔的資料都已經在我腦袋中,就當替 10 年後的我買個保險,以免 10 年後還住這個社區XD

這個簡易系統有 3 個方向可實作,分別是 UI 三大框架選一個,Excel VBA,Google Sheet Action Script。

UI 三大框架就是要配 Github Page,資料也不知會不會有隱私問題,但我認為漏水或修繕本就是應揭露事項,我是不覺得有任何問題,本人也不會笨到去揭露社區名稱,好吧,我承認我住新竹XD

VBA 或是 Action Sheet 好處是跟著檔案走,比較不用顧慮 UI 設計,但以目前已經有 120 多個 sheet 的 Excel 檔案來說,存檔都需要好幾秒,長久下去不是辦法,我猜跟 Excel 檔案本質就是一堆 XML 的組成有關,故效能會隨資料越多而越差,應該是線性成長?去去去,油漆工演算法不要來搗亂XD

目前在補舊資料時,是透過 Python 將新增資料填上分析總表以及各別科目 sheet,坦白說已經很好用了,比第一次從頭到尾建電子檔節省了不少人力,當然每月新增的資料還是免不了人力介入。

我們社區就是沒錢,難怪沒人主動要當管理委員?目前活存來到接近歷史新低。編號 13 的那筆資料剛好也是某次的調漲管理費用起始點,希望能像那次一樣,可以逐漸往上成長還能夠有餘額轉定存!


02. 購買消費性 3D 掃瞄儀來確定土砲結構光系統差距。

原本想購買 REVOPOINT POP3,但在 Reddit 看到前一代的評論,只能說慘不忍睹。

另外在同討論串看到推薦 EinScan-SE 這台,但價差多了 3 萬,總共要 5 萬塊,確實是有點買不下手。在 YouTube 看到一個影片,這台搭配轉盤,一個面速力達母寬度的小物件,看起來會轉 8 次,轉一次約會有 17,000 左右的點,感覺我的土砲結構光系統跟他並沒有到 100 倍以上的差距?


還是多看一些 YouTube 的影片再做決定?

03. Review 世界未來趨勢。

進入賺錢的產業或公司才是最重要的!你會什麼程式語言根本不是重點,結論還是鞏固基礎能力就好,正所謂萬變不離其宗。

退一步則是找自己有興趣的,有興趣才能持久。

千萬別為了工作而工作!

04. 多陪爸爸媽媽。

把買的那幾本相關書看一看。

05. Kobo(找到之前找我面試的 email)、Readmoo、HyRead 選一家投履歷。

一直有印象 Kobo 之前有找我面試?但遍尋 Gmail 卻一無所獲?目前只看到蝦皮的 email?

2023年11月3日 星期五

Magic symbol - _ZN6google15ErrnoLogMessageC1EPKciimMNS_10LogMessageEFvvE

同事最近在搞 Vitis-AI 的板子,過程中遇到一些問題,花了一天多的時間幫忙釐清並解決編譯問題,還是稍微記錄一下好了XD

這個 magic string 就是所謂的 name mangling,請看這裡

環境介紹:同事沒有使用 PetaLinux 而是使用 Ubuntu 22.04。

同事在執行下面這支 script 時發生問題,一開始就跑不起來,看了 code 後發現,並沒有人去呼叫 main function,故需要改成先帶 main 再帶 target board 型號的方式來執行此 script。(後來才發現 Xilinx 文件是錯的,4.3.2 有錯,但 4.3 有稍微提到 run_all_target.sh 這支 script,裡面就可以看到正確呼叫 run_all_cifar10_target.sh 的參數傳法)

Vitis-AI-Tutorials/Tutorials/RESNET18/files/target/run_all_cifar10_target.sh

再來還是跟執行 run_all_cifar10_target.sh 有關的錯誤。

01.  missing symbol - _ZN6google15ErrnoLogMessageC1EPKciimMNS_10LogMessageEFvvE

這個名稱是 gcc 在編譯函數等 object 時所定義的 symbol name,gcc 是 follow 這個文件,我們也可以把這串名字丟到此網站,我們就可以看到此 symbol 的原型宣告如下:

google::ErrnoLogMessage::ErrnoLogMessage(char const*, int, int, unsigned long, void (google::LogMessage::*)())

同事的問題就是在安裝的 glog 中找不到同樣名稱的函數,嚴格說起來是差在第 4 個參數,我們跟這串文字差了一個 m,而這個 m 就表示參數是 unsigned long。

同事還蠻幸運的,在降版本到第二個版本後,就順利編譯出有一樣 symbol 的 so 檔。

02. missing symbol - xclIPSetReadRange

這個問題跟上面類似,也是版本相關的 issue,後來在 review XRT 版本後,確定某些版本以前的 code 確實缺少了這個函數(XRT/src/runtime_src/core/pcie/linux/shim.cpp),後來便決定使用 202220.2.14.354。

底下是自己編譯此版本會遇到的問題。

首先在 sudo <XRT>/src/runtime_src/tools/scripts/xrtdeps.sh 時,會看到類似沒有安裝 gcc 8 的訊息,因為環境已經有 gcc 11 了。

接著執行 build.sh 發現很快就結束了,原因是 script 中,gcc 版本是 hard code 寫死,直接改成對應的版本即可,接下來就是一連串的 sudo apt-get install 地獄XD

此 script 會先執行 configure 相關工作,反正遇到什麼錯誤就 google 一下,安裝對應的 xxx-dev 版本即可,印象中有 4 ~ 5 個要裝。

最麻煩的是在 runtime_src/xdp/CMakeLists.txt:427 會報找不到 xdp_hw_emu_device_offload_plugin 錯誤,但這個東西如果我沒搞錯應該是編譯時才會編譯,懷疑是 CMakeLists.txt 沒寫好,可能跟相容 cross-compile 有關?

想了一下,直接註解 427 及 428 行即可。

接下來是一連串的 build error,最糟糕的都是直到編譯某支檔案時才會報找不到 header file 的錯誤,此時也只能一個一個 apt-get 安裝,印象編譯到 40 幾趴還會有錯誤,大概也是有 4 ~ 5 個要安裝,之後便可以順利編譯出 Debug 和 Release 版本了。

接著使用 objdump -T xxx_core.so | grep xclIPSetReadRange 確認一下,這次就可以順利看到 symbol。

由於 Release 版本還在編譯,簡單使用 export LD_LIBRARY_PATH=/XXX/Debug 來讓執行時可以找到 xxx_core.so 的 xclIPSetReadRange symbol 來驗證是否有順利解決問題。

花了一天多幫同事搞定這個問題,最後還是沒能在 target board 跑出想要的結果,但這又是另一個故事了XD

2023/11/24 更新

為了寫技術文件,從零亂的計算紙中找到蛛絲馬跡,凡走過必留下痕跡。

fix configure error

sudo apt-get install libdrm-dev
sudo apt-get install ocl-icd-opencl-dev
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install rapidjson-dev

-------------
CMake Error at runtime_src/xdp/CMakeLists.txt:427 (add_dependencies):
  The dependency target "xrt_hwemu" of target
  "xdp_hw_emu_device_offload_plugin" does not exist.

https://github.com/Xilinx/XRT/issues/6942

fix it
comment runtime_src/xdp/CMakeLists.txt line427, line428

-------------------------------------------------------------------
fix build error

sudo apt-get install uuid-dev
sudo apt-get install ocl-icd-dev
sudo apt-get install libcurl-dev
sudo apt-get install libudev-dev

2023年8月28日 星期一

I code so I am

折戟沉沙鐵未銷,正所謂爛船也有破釘三斤XD

今年過年後開始,工作型態正式變成研究 CV 課題!

感謝公司及大小老闆們沒有一下就要我們生出東西,取而代之的是讓我們從頭開始學習。

坦白說數學不是我的強項,尤其對我這麼一個 AT 叛客來說,我以前查帳時還是按計算機比較多,根本沒有用到數學,轉換跑道後雖然寫了很多年的程式,也去過兩家上市公司以及錄取國家考試資訊處理職系,不論是工作或生活其實也沒用到什麼數學?

如果說現在沒有工作,我當然是有信心在半年內把需要的數學底子練起來,奈何年紀漸長,雙親年紀漸大,要用錢的地方很多,已經無法像以前一樣想辭職就辭職。

也因為如此,一直覺得進度緩慢,尤其前半年很少寫到程式,更覺得自己好像失去了什麼?

還好有郭靜妹子天籟之聲的陪伴,才讓這個無趣的生活有點笑容…

今早在準備開會報告資料時,無意間讓我發現學習專案作者的 Matlab code 與我移植的 Python code 用的公式居然不同?

數學小白的我居然可以在幾秒之內想到可能的問題,原來是作者有留一手或是無心之失,兩者的投影相位圖是使用不同數學函數!

Python code 和網頁說明是使用 cos 函數,但 Data 給的卻是用 sin 函數,難怪會有所謂的錯位情況?一開始還以為是翻拍的圖導致?

除了手畫 0 ~ 2 pi 的圖來驗證作者思路外,也簡單讀取 0 pi 的圖來畫出波型圖,終於可以證明我的想法無誤!

僅以最後的大衛朗基羅絕對相位正規化灰階圖來為這幾個月的學習留下最好的回憶!


希望有一天也能像尼飛彼多一樣,說出那樣霸氣的一句話:我好像有點強XD

2023年8月21日 星期一

是誰殺了我的大衛朗基羅

右邊是原作者的點雲,明顯跟我不在同一個檔次XD

原本以為是自己少搬了作者的 Code,上星期五放假時還特地做了 memo 寄信給自己,想說早上提早來辦公室便可以輕鬆搞定XD

沒想到今天一整天除了下午開會報告進度花了兩個小時外,其餘時間都在跟我的大衛朗基羅奮戰,可惜直到下班前都還是一無所獲。

還是學阿甘去跑步好了,看看能不能從中悟道?

奈何身為一個資本主義下的小小工程師,一日不工作無法養活自己,只好爬爬樓梯再回去做柯南吧!

邪惡組織的黑衣壞人,快出來別躲了,我已經看到你了?

你為什麼要殺了我的大衛朗基羅呀XD


2023/08/22 更新

起床後做伏地挺身時想到一些關於大衛朗基羅的解法,條列一下:

01. 作者給的公式是否正確,如何推導?我的想像應該是要把投影機逆投影變成相機,產生四步法的相位圖,配合格雷碼的輸出,產生像是右相機的圖片,但這裡有兩個難點,一是我不知道作者產生相位的公式到底跟它原投影的是否一致?二是格雷碼並沒有覆蓋到整張圖片,我很難推斷出右相機的格雷碼圖形應該要位在相機解析度的哪個區塊?

02. 再比對一次作者給的 Matlab 和 Python code 是否有一致,也許是自己哪裡疏忽少搬了?

03. 老老實實的回去看作者相對相位和絕對相位關於補償的算法,搞不好答案就在這裡?

早上坐公車時一直在思考問題出在哪裡,都沒時間看看窗外妹子XD

雙目相機是否有要求左右相機要一樣?即使相機不一樣,只要得到各自校正好的內參,理論上應該是沒影響才對?至少以我目前幼幼園小班的程度,我是這樣認為的。

註記:一般我們還是會保持左右相機參數儘量一致,對電腦視覺來說,環境光影響成像品質甚巨,為了讓雙目相機拍攝到的景像一致,使用同樣的相機我們比較好讓他們同步工作,這是我目前的理解。

故問題一我根本不用管格雷碼會投射到左相機圖片的哪個區塊,一樣站在投影機的角度思考即可,記得確認一下小氣的作者是否有放原始的 pattern?

2023/08/23 更新

問題應該還是出在數學,因為投影機的 pattern 在不同 y 下都相同,感覺好像抓到什麼?校正後的相機和投影機一定存在某種關係,只是我還不知道罷了。

江湖一點訣,說破不值錢。需要的數學還是從針孔相機模型那來的,詳此處

終於,我也有個帥帥的大衛朗基羅了,雖然我的相位值還是會有缺口,但我覺得應該是作者只給影片翻拍的圖,而不是原始相機的圖片,可能是 distorted image or something,故才有此結果?


2023/08/28 更新

今早突然神來一筆,發現錯位情況來自相位產生公式不同所導致,詳此篇

2023年3月14日 星期二

產生 GIF 最簡單的方式

有時候想用 gif 動畫表示實驗結果,又不確定那些線上網站工具是否會有問題?

最簡單的方式就是使用 ImageMagick,還可以指定置中好解決圖片大小不一的問題(-background rgb(0,0,0) -gravity center -extent 640x480),extent 就是圖片裡面最大張的規格,如果小於此規格的圖片背景就會填上黑色。

convert -background rgb(0,0,0) -gravity center -extent 640x480 -delay 70 -loop 0 test\*.jpg test\case_g.gif

2022年5月24日 星期二

睡不著的老人

真糟糕,又睡不著覺了。

今天已經很早就開始上工,但已經做了一個多小時才想到沒有打卡XD

真是精實的一個多小時,檢查了 2 個測試的問題,寫好郵件,還順手檢查了一個兩年前寫好的工具的測試結果,好跟我們這一季做的實驗看是否有匹配?

我果然是個認真的好員工呀XD

WFH 其實是個很好的政策,想要驗證什麼馬上可以驗證,不用像以前一樣要等到隔天上班才能知道結果,對我這個急性子的人來說真是煎熬?

每家公司都應該要支持 WFH 才對,只要招募到正常值以上的員工,整體來說一定是 Z > B。

2022年2月28日 星期一

反樸歸真的 fread and fwrite

最近有位同事要離職,為了讓同事好好交接,決定把他未完成的工作接下來做。

雖然平常開會都會討論個人進度,但因為自己不是負責的人,故也不知道原本是如何實作的?

現在變成自己要做,還是先來研究一下,有沒有什麼簡單又可以加速開發的方式?

看了一下他之前的 Code,原來 UEFI Shell 中間過程的傳遞也是一個 C struct 的變數,只是再設計成另外一種格式轉成文字檔,然後由 Windows 的另一個 Tool 來接手 parsing。

看到這裡我就覺得有點阿雜,感覺一直在訂 Spec 寫 Parser,我們似乎可以省略這個過程?反正原本的格式雖然是字串,但不參照 Spec,其實人也無法一眼看出那些數值的真實意義。

接著我直覺想到的就是使用 C struct 並搭配 fread and fwrite 函數,直接把資料存成 binary 檔案,反正現在常用的程式語言,都有 Binding C language 的能力,像我喜歡的 Go 就可以使用 cgo 的方式來使用 C Code!

剛才測試了一下,指定 struct alignment 的語法,VC and GCC 看起來都通用,最困難的點已經不是問題了,剩下的就是開發時 Debug 的問題了。


#include <stdio.h>

#pragma pack(push, 1)
struct Arg {
    int id;
    char name[3];
    int command;
};
#pragma pack(pop)

int main(void)
{
    struct Arg arg = {1, "AA", 2};

#if 1
    FILE *f = fopen("struct.bin", "ab");
    if (f) {
        fwrite(&arg, 1, sizeof(arg), f);
        fclose(f);
    }
#else
    FILE *f = fopen("struct.bin", "rb");
    if (f) {
        fread(&arg, 1, sizeof(arg), f);
        fclose(f);

        printf("%d, %s, %d \n", arg.id, arg.name, arg.command);
    }
#endif

    return 0;
}