pretty code

2023年7月2日 星期日

天籟之聲 - 郭靜

應該是去年聖誕節前幾天吧?

YouTube 突然跳出郭靜在去年的線上音樂會影片,一聽之下才發現郭靜好聽的歌還真不是普通的多!

自從很多年前出社會後就很少聽歌了,近 10 年的休閒活動也都是以閱讀為主,大概只有這幾年比較會聽歌,故對郭靜的印象還是停留在《下一個天亮》、《在樹上唱歌》以及《心牆》這幾首歌,連我這個很少看電視的人都知道這三首歌,可見當年的郭靜確實很紅!

查了一下才發現我們居然就讀同一所高中,再加上我個人喜歡帶有一點悲傷感的歌,正所謂人不親土親(我絕不會說是妹子可愛XD),故藉此機會更新了一下 KKBOX 的收藏歌單。

其實郭靜不只情歌好聽,一些輕快的歌聽了也是讓人心情愉快,這對最近的我真的很重要,我都快被數學搞到懷疑人生了!

不過我發現我喜歡的都是冷門歌曲,包括《夢在遠方》、《在曾有你的地方》、《回憶的閣樓》、《逆行的減法》。

還記得今年過年前老婆補上班日那天,我一個人在家大掃除時就連續聽了一整天《逆行的減法》,這首歌不算悲傷也不算輕快,但似乎還挺帶勁,讓人大掃除一整天也不會累,唯一的吐槽點就是封面照片也太像鮪魚了吧,害我聽到這首歌都先想到鮪魚XD

天真的我還以為這些歌夠冷門了,沒想到隨著把 YouTube 搜尋郭靜的影片看了一輪,才發現還有更冷門的歌,比如像是《隕落》、《月亮會記得》、《慶幸遇見你》、《像我這樣》、《不想有遺憾》、《手心》、《相思弦》、《拜你所傷》、《我想要有人為我傷心》、《簡單》、《明白》等,除了一些歌是郭靜在福茂的專輯外,大部份的歌都是這兩三年唱的 OST,還好只有少數幾首 KKBOX 沒有收錄,害我只能在 YouTube Music 上聆聽。

雖然這裡列出來的歌是我比較喜歡的,但其他演唱會一定會唱的歌其實也沒差這些冷門歌多少,硬要我找出一首最喜歡的歌,可能還比解數學難?


雖然說幾乎每首歌都好聽,但這半年大部份只聽郭靜的歌的我還是發現了一些小差異,早期的歌歌聲中還帶有一點稚氣,比較像小孩子?明顯跟後期的聲音有點不同,後期的歌聲要形容的話似乎聽起來比較有感情?咬字比較清楚,感覺聲音比較紮實?但這一兩年替 OST 唱的歌似乎又多了一些假音,印象之前搜尋郭靜時,似乎有看到聲音有稍出狀況的新聞,不知道是否是這個緣故?

其實郭靜不只歌聲好聽,有些照片看起來還蠻可愛的,挑了一張吃飽發呆的萌圖當手機桌面,數學看到煩時就會看個幾眼,感覺心情都好多了!


前一陣子回父母家吃飯時,《綜藝玩很大》剛好都重播郭靜固定班底的集數,於是老婆大人就陪我回頭去追星了,不得不說,郭靜當個綜藝人也蠻不錯的,尤其前面某集郭靜在猜頭上的牌子是什麼的時候,一些表情真的是很好笑,晚上吹頭髮 YouTube 沒有好看的影片時,我就會再看一遍XD

不知道為什麼又失眠了,剛好今天是郭靜《喵喵咪呀演唱會》加場開賣的日子,難得老婆大人點頭同意讓我參加演唱會,剛好趁此機會解鎖人生第一場聽演唱會成就,希望早上能搶到我喜歡的位置。

2023/08/18 更新

上全球最大男性交友網站發完 issue 後,把官方粉絲團提供的 DIY 票卡夾做好留個紀念,雖然老人怕麻煩都用電子票券就是了XD


2023/08/19 更新

今天終於參加了可愛的郭靜演唱會,也解鎖了人生中第一次演唱會,我喜歡這樣的演唱會服裝,不用奇裝異服換來換去,可惜的是頭髮不是老人喜歡的黑色XD

雖然早知道喜歡的歌都不會是演唱會的曲目,但一首都沒有還是有點小失望!還好在最後那段聽到一首我會喜歡的歌,感謝粉絲團的 PO 文,原來那首歌是彭佳惠的《大齡女子》,我覺得郭靜唱的比原唱好聽XD (杰老弟呀,該給人家一個交代吧?不過人生就是這樣,我愛的人不愛我…)

新買的望遠鏡果然很適合演唱會用,無奈我前面的先生不是扭來扭去就是一直拿著手機錄影,我右邊右邊的先生看起來是陪著女朋友來,整場腳一直動來動去,還好哥什麼都不擅長,最擅長的就是進入心流,算是沒受到什麼太大影響,幸好有多買了兩個座位隔出防火牆,不然一定會被影響,腳都伸到我多買的座位前方了XD

感性的時間完了,再來是我有興趣的成本會計部分:

一場演唱會算 2,000 人 參加,平均一人門票算 2,000 好了,總共收入是 4,000,000。

樂隊老師總共有 5 人,合唱老師有 2 人,再加上一隻我總覺得是怪獸手錶的玩偶工作人員,還有場地,燈光,佈置,化妝等其他族繁不及備載的工作人員,場地的工作人員我想是包含在場地租金中,全部成本給你算收入一半好了。

為了準備一場演唱會,之前要先彩排,這個星期還要練唱,還要保持最佳狀態,坦白說,我如果是歌手,不是為了歌迷,我還不是很願意花時間開這樣的演唱會!

果然還是要大巨蛋這樣的場地才能賺多一點錢,因為單位成本會遞減,當人數越多後邊際效益應該會越高,當然以上只是局外人的我的想像?

以後沒有買到第一排應該不會想參加了,太多外部因素無法控制,我還是做個浪跡天涯的工程師吧XD

2023/08/22 更新

原來場地租金比我想像中的貴一點(我從收入反推,以為最多五六十萬而已),至少 TICC 是以小時計算,不過我認為價錢應該都可以再協商,這只是公告牌價。難怪不是每個人都能開演唱會,也算是長知識了。


另外還有一種方式是由別的主辦方主導,歌手只是領取固定報酬,不需要管這些細節,賣不賣得好都不影響歌手收入,這也是一種方式。

有些國外樂團的演唱會似乎都沒有特別注重舞台佈置等效果,這樣成本會更低,收入會更多。這種也是我覺得比較好的方式,就算只有 2,000 人的場地,舞台效果等也只有最前面的特區會看到,如果主辦方也沒有適時的將現場投射到大螢幕(這次的主辦單位就做不好,這個場地好像也沒有網路說的那樣好?),其實特區以外的觀眾也感受不到,不如省下那些錢,純粹以歌聲及歌手本身魅力來一決勝負。

我想真正的歌迷才不會介意舞台效果,歌手就算只穿白上衣牛仔褲,我們也是看得很開心。

不過這又回到商業的本質了,來看演唱會的會是誰?那些人想看的是什麼?以賺錢來說,還是要以這些人為主就是了。

感覺結論就是像我這樣的老人不適合演唱會呀XD

最後來算一下為了這個演唱會花了多少錢吧?

座位 2600 x 4
望遠鏡 4680
台大停車 20
週邊商品 2230
DIY 票卡 15
停車 扣掉消費折抵後好像是 80 ?
晚餐 1419

其他
演唱會前幫老婆買了雙鞋子 2746
怕冷買了件外套 1290
逛無印買收納盒及清潔工具還有老婆褲子 2225
剛好看到的熱水瓶 5990
礦泉水 50 (沒帶皮包,老婆出的)
散場後的星巴客 2XX

其他不是必要支出,姑且不論,看一次演唱會真是勞民傷財呀?老婆下次還是不要點頭答應也不要跟好了!接下來的幾星期我要去賣血了…

2023/12/05 更新

前天下午準時上去寬宏搶人生中的第二場演唱會票,可能是眼睛小的緣故,沒注意到預設是電腦選號,最後只能屈居 2F 中間區第 6 排,只能說怎麼會有這麼爛的設計,如果是手速比不過人我就認了,被系統這樣一搞真的是怒氣滿滿,光一開始加入會員要身分證字號我就覺得莫名奇妙了!希望下次郭靜演唱會不要再透過這個爛系統,到現在想到還是很生氣。

2023年6月17日 星期六

人終究還是會確診一次吧?

新冠疫情爆發後,不知不覺已經三年半了,一直以為自己應該是不會確診了?沒想到前幾天終究還是逃不開確診的命運, 趁著今天狀況勉強還行,記錄一下確診的狀態,也給未來的我老婆參考XD

直到現在還是想不通怎樣中的?回家後仍然保持消毒習慣的我,一天會用 2 個口罩,一個星期會用酒精消毒車子內裝一次,偶爾走在路上沒戴口罩以及離開辦公室座位為了洗臉沒帶口罩外,剩下有可能中的地方就是餐廳內用了,但我一向都是找人少的地方吃,即使貴一點也沒關係(這時不得不抱怨一下,不論男女,總是有人喜歡吃飯時一直講話,這種人偏偏又喜歡講話講得很大聲影響別人,每次,遇到這種客人就是覺得內心很幹)。總之,這三年除了禁內用時期外,我幾乎都還是正常內用居多,偏偏卻在這個時候確診,真是不可思議?

以下是到目前為止的狀況,記錄一下。

星期三下午時突然覺得莫名的累,喉嚨也突然覺得痛,就像是之前連續視訊上課一天半後的講話喉嚨痛,晚上快篩正常,但身體開始輕微發燒,約莫是 37.1 度左右。半夜因為身體燙都沒睡好,故隔天很早起來就決定請假一天。

星期四雖然請假在家,但發燒依舊,最高有到 37.8 度,好一點是 37.3 度,但似乎上上下下不定?因為發燒昏昏沉沉了一天,全身肌肉有點小酸痛。晚上八點多左右快篩陽性確診,但覺得好像還行,決定隔天看狀況決定是否要請假。半夜依舊身體發燙睡不好,再加上戴口罩不太好睡,半夜兩點起來就沒睡了,一直到早上五點多決定請假後又回去睡到八點多起床。

星期五一樣請假在家,今天似乎肌肉不再酸痛,但下午開始出現比較頻繁咳嗽狀況,另外,左膝蓋後方,左後臂外側,左後耳及左腦勺,開始出現不定期神經抽痛狀況,就好像之前帶狀皰疹的症狀?這次晚上比較好睡,但半夜也是醒來好幾次,半夜忘記哪一次醒來開始出現吞口水喉嚨就會痛的狀況。

星期六早上因為車子要保養不得不出門,只好全程戴口罩開車,順便去看皮膚科讓醫生確認,避免皰疹又發作了!今天咳嗽似乎變比較嚴重開始有痰,但在外面卻只有偶爾咳個兩三次,真佩服自己的忍耐力。另外,體溫似乎已經回到正常,只有一次量是 37 度。好像從快晚上開始,身體會莫名的發寒,尤其是下半身,本來是以為吹冷氣的緣故,後來才確定是身體自己在發寒。半夜也是睡到兩三點就睡不好,一直到早上又回龍睡了一下。

星期日早上又測了一下快篩一樣還是陽性,中午硬開車出去買午餐吃,下午下半身發冷的情況依舊,疑似皰疹神經痛的現象也是沒有舒緩,晚上睡覺最慘,一分鐘咳一次,不知道過了多久才睡著。

星期一早上上班前快篩依舊陽性,繼續請假一天休息。

2023年6月2日 星期五

Python 優化小經驗

這幾天看數學看到有點煩,剛好之前有寫一個函數實作 warpPerspective 的功能,只是一個很簡單的做插值計算並將數值填回去 numpy array 的程式,Python 居然要花到好幾秒鐘,為了轉換一下心情,底下是我有嘗試過的一些優化技巧,做個記錄先,有些我也不知如何解釋?

01. 陣列運算一次做比在 two for loop 中做還快。

比如說將一張圖像的齊次座標乘上 Homography matrix,將 3 x (width x height) 的座標先填上 ndarray,之後在一起乘 H matrix,並除以第 3 個分量,比在 loop 中每個 pixel 單獨計算還來得快。

這個好理解,numpy 底層應該有對 matrix 運算優化,可能是 multiprocess 之類的,故有吃到 numpy 的 buffer 靈氣。

02. image[h, w, :] = xx1 * yy1[h, w, :] + xx2 * yy2[h, w, :] + xx3 * yy3[h, w, :] + xx4 * yy4[h, w, :] 優化。

上句右邊計算結果也是一個 ndarray,將上句拆成 3 句可以優化。

image[h, w, 0] = xx1 * yy1[h, w, 0] + ...
image[h, w, 1] = xx1 * yy1[h, w, 1] + ...
image[h, w, 2] = xx1 * yy1[h, w, 2] + ...

這個也好理解,可能是少掉中間那個臨時變數的消耗?

03. 使用 cProfile 做 profile 追蹤,看是否能看出端倪?

---------
command line

py -m cProfile -o xxx.prof xxxx.py
py -m cProfile -s tottime xxx.py

---------
In xxx.py

import cProfile, pstats, io
from pstats import SortKey

pr = cProfile.Profile()
pr.enable()

warpPerspective(img, M, (maxWidth, maxHeight))

pr.disable()
s = io.StringIO()
sortby = 'tottime'
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats(20)
print(s.getvalue())
---------

cProfile 可以在程式碼中直接呼叫相關 class 也可以在 command line 中觸發,如果在 command line 觸發時有儲存檔案 xxx.prof,可以用 SnakeViz 這個第三方模組開啟並作分析,SnakeViz 會另外開啟一個 browser window 方便看 call stack,會比原來的 cProfile 結果好看。

---------
pip install snakeviz
snakeviz xxx.prof
---------

但因為我已經知道是那個函數花時間而我的函數又都是計算賦值的工作(純 Python code,沒有呼叫 other functions),故這個工具幫助不大。

04. 改用 multiprocess 並配合 SharedMemory 分享 read data 和 write data。

share read data 沒有什麼問題,但 share write data 一直沒成功,後來才知道要如何寫,如果照文件說的應該同時讀寫是沒問題的?至少我在 Process 和 Thread 中都沒有使用 lock 來保護 share write data。

---------
This style of shared memory permits distinct processes to potentially read and write to a common (or shared) region of volatile memory.
---------

分享 write data 的用法,重點是在 main process 中複製建立的 blank_ 而不是建立 Process 前將 blank 指給 blank_(在個別的 Process 中寫到的還是 blank_ 而不會是 blank)。

---------
blank = np.ones((max_h, max_w, 3), np.uint8)

share_blank = shared_memory.SharedMemory(name='share_blank', create=True, size=blank.nbytes)
blank_ = np.ndarray((max_h, max_w, 3), dtype=np.uint8, buffer=share_blank.buf)

p_count = 1
p = Process(target=warpPerspective_task, args=(p_count, i, H_Inv, img.shape[1], img.shape[0], max_w, max_h))
p.start()
p.join()

blank = blank_.copy()

p.close()
p.unlink()
---------

另外,我電腦有 4 核心,開 4 個 process 分區塊寫 blank_ 對加速並沒有幫助,跟沒有開 Process 時運行時間差不了太多?

05. 將 01 步驟中的大 matrix 計算,配合 4 個 process,各個 process 在 task 中各自計算自己那部份的 matrix。

看起來跟 04 步驟很像,但這樣卻可以再省個 300 ~ 400 毫秒?

06. 如果在迴圈中有存取 class variable,用一個 local variable 來接它,可以減少執行時間。


總之,在不懂 Python 底層的情況下,我目前也只能先試到這樣﹍

2023年5月31日 星期三

cl command line

即使在 Windows 下,我還是習慣用 gcc 來編譯自己寫的 C 程式,如果是別人的專案,只要是寫得好的 project,用 gcc 理論上也不會有什麼大問題。

至於一些有名的專案,為了減少編譯問題,大部份都還是提供 VC 的編譯選項,確實 Windows 下用 VC 問題會比較少!

另外,有些專案也會附上 cmake 設定檔,只要電腦環境有安裝好其他的相依性函式庫,這種的問題也不大。

但如果是一些 github 上的小專案,又沒有提供編譯說明文件,這時就會有點小麻煩,理論上用 IDE 來設定應該會比較輕鬆?

但我是個不習慣使用 IDE 的人,還是來找一下 command line 編譯選項好了。

https://github.com/j30206868/StereoSGBMNote

以上面專案為例,此專案是實作 SGBM 匹配演算法的專案,可以幫助我們學習演算法,他本身有用到 OpenCV。

底下是編譯步驟:

01. 配合電腦的 VC  版本,找到 OpenCV 有提供預先編譯好的版本,以 VS2015 為例,可以下載 3.4.10 版本!

02. 將下載檔案解壓縮到某個資料夾,此處我是解壓縮到 E:\OpenCV_C。

03. 切換目錄到 StereoSGBMNote 專案路徑,在這裡新增一個 build.bat,內容如下。

@echo off

set path=%path%;E:\OpenCV_C\opencv\build\x64\vc14\bin

cl main.cpp stereoSGBM.cpp /Fe"test.exe" /I E:\OpenCV_C\opencv\build\include /link E:\OpenCV_C\opencv\build\x64\vc14\lib\opencv_world3410.lib

echo.
pause

set path 是為了執行的時候可以找到相關 DLL 檔。
/Fe 是指定執行檔名稱。
/I 是指定標頭檔路徑。
/link 是指定 link 的 library,預設是 Release。

有些原始碼會有其他字元集的註解,假設跟當前終端機預設不同會有警告,如果是 UTF-8 編碼字元,可以加上 /utf-8 消除編譯警告。

04. 配合批次檔內容,開啟對應的 VC prompt,以此例來說是 "VS2015 x64 Native Tools Command Prompt"。

05. 在開啟的 VS 視窗中,切換工作目錄到專案路徑,執行我們剛準備好的 build.bat 即可。

2023年5月15日 星期一

勞工保險條例第 65-4 條

昨天聚餐時媽媽問了一個問題,大意是說為什麼她的同事勞保退休年金有調整變多但她的數字卻沒有變化?

一直以為是她的同事沒有說清楚,因為媽媽在一兩年前也有調整一次,理論上大家都一樣才對,害我又以為是她的同事在那亂說!

回家查了一下,才知道是我孤陋寡聞,這個東西還真的每個人都不一樣!

根據勞工保險條例第 65-4 條:「本保險之年金給付金額,於中央主計機關發布之消費者物價指數累計成長率達正負百分之五時,即依該成長率調整之。」

又根據勞工保險條例施行細則第 96 條第二項:「本條例中華民國九十七年七月十七日修正之條文施行第二年起,前項消費者物價指數累計成長率達正負百分之五時,保險人應於當年五月底前報請中央主管機關核定公告,並自當年五月開始調整年金給付金額。」

簡單來說只要跟退休那年的物價指數相比相差達正負百分之五時,該年度五月份年金金額就會乘上那個相差比例。

比如說有位勞工在 2010 年退休,勞保退休年金月領 20,000 元,今年(2023)物價指數相差剛好是正百分之五,則該年度年金調整後金額為 20,000 x 1.05 =  21,000,年金調整過後就會以該年度(2023)當基準重新計算,直到物價指數又相差達正負百分之五時,便會再重調整一次。

另外,民眾在六月份刷存摺時會看到兩筆金額,分別是 20,000 和 1,000,自七月起就會是一筆金額 21,000 入帳(似乎五月份年金是六月領?)。

我想應該不會有人遇到負百分之五的情況吧?

2023年5月3日 星期三

Create requirements.txt from current Python code.

pip install pipreqs.

pipresq --encoding utf-8

requirements.txt will be in current working folder.

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