2020年12月15日

[C] Implement SHA-1

最近因為工作需要把一串字串經過處理後變成另一個長度最多 48-byte 的唯一的字串,能做到這類事情理所當然地就會往 MD5、SHA-1 這類 hash function 去找,而且因為不是要用作加密金鑰,對於安全性的要求並不高,所以後來就選了 SHA-1 當作目標。

實際看了下演算法,其實超簡單的...雖然會有一些細節要特別注意,但整體上的實作相當容易。以下就一一說明要注意的細節,C code 就放在最後面供參囉。

2020年11月20日

[C++] Calling Unexpected Member Function when The Version of Library Header File is Older Than Shared Library

同事最近遇到一個神奇問題,簡單來說就是他修改了一個會 release 給客戶或其他產品的 library,在裡面新增了一個 API。但照理說這個剛 release 的 API 還沒有人用到才對,卻在一系列的 regression 中發現它竟然被 call 到,而且造成程式 crash?! 從此展開他的 debug 之旅...

2020年11月12日

[C] Alignment Via Bitwise Operations

有時候會因為 performance / memory access 等等考量需要把不足 4/8 bytes 的資料 align 到 4/8 bytes,做法很多個,這邊列個最近看到的作法以資紀錄。

2020年7月4日

[C++] Difference between Pointer and Array

C 的兩個型別:array & pointer 大概是觀念上最常被誤解誤用的型別了吧,雖然很多書上、文章裡也很常看到強調這兩個型別不同,不過因為 compiler 在某些情況下會把 array 退化成 pointer,也因此初學者分不清這兩個好像也滿正常的,畢竟差異的細微之處就算有一定經驗也不一定能說得很清楚。

這次剛好有人問了一個問題就是犯了 array 跟 pointer 型別混用、再加上用了 extern,連鎖效應導致遇上 segmentation fault。後來想想搭配圖跟轉出 assembly 或許比較容易了解那細微的不同之處吧。

2020年6月5日

[C++] Easy Way to Apply Producer-Consumer Parallelism

事情是這樣的,最近接到要把原本的架構套用 producer-consumer 的方式:一條 thread 產生資料、另一條 thread 處理資料 (當然,這邊只是為了方便討論所以都先假定各一條 thread),以此增加平行度。不過雖然這種方式很常見,要在原本沒有規劃的程式上套用起來還是會改動不少地方,而且為了讓處理邏輯比較獨立、清晰,就想了個方法讓這些改動可以儘可能的集中、且只需要儘可能少的修改現有邏輯。最後最重要的是:想要撤銷 producer-consumer 變回原本 sequential 的架構時也儘可能的簡單,換句話說:能輕易套用不同的資料處理模式

2020年5月28日

[C++] Compile Time if in C++17

要說的話...就是把原本要用 SFINAE (substitution failure is not an error) 才能做到的事情變成可以用更直覺的寫法來做到。

2020年5月19日

[筆記] Design and Analysis of Approximation Algorithms - Introduction

標題其實是這本書:Design and Analysis of Approximation Algorithms,這本書簡單來說是在介紹 approximation algorithm (中文好像會翻成逼近演算法、近似演算法)。這類演算法著重的地方是那些現在沒有 "有效率" (也就是 polynomial time 的方法) 的方法解決的最佳化問題 (optimization problem,換言之答案是要找出極值,不論是最大值或最小值),這類問題只要去找 NP-Complete、NP-hard 就有一大堆了。
當然學術上的方法是一回事,現實中當你遇到這類問題又一定要有一個解的時候,真正的問題就會變成你怎麼知道你找出來的解距離最佳解有多遠? 所以這本書的目的就是統整併分析目前有哪些方法可以有效率的解決找出一個近似解、同時告訴你這些近似解在理論上距離最佳解有多遠?

2020年5月16日

2020年5月15日

[C++] inline Variable and thread_local in C++17

inline variable 最大的用意應該就是允許在 header 就把變數的宣告 + 定義一次搞定吧。在 C++17 前除了少數特例 (比方說 literal type),基本上 header 只能放宣告,明確的定義是必須要放在單一的 translation unit 以遵守 ODR (one definition rule)。

2020年5月13日

[C++] Structure Binding in C++17

用一句最簡單的畫作結論的話就是語法糖
C++11 開始除了一些新觀念的引進 (比方說 move semantic) 之外,類似的語法糖也增加了不少,經典例子就是 lambda expression。而 structure binding 到底是啥呢? 舉個簡單例子:
std::pair<int, double> ms{1, 3.14};
auto [i, d] = ms;
一個很樸實無華但是稍微可以讓你的 code 更簡潔易懂的東西。

[生活] 工作日常 - 2019

上一篇的傳送門:工作日常 - 2018

這篇收錄 2019 年的工作日常,2019 年是個 hashtag 大爆發的一年 XD

2020年4月7日

[Python] Dangerous default value

最近跑 pylint 時偶然發現了一個 warning 叫 "Dangerous default value as argument",細追之後才發現一個陷阱

2020年3月23日

[生活] 工作日常 - 2018

因為 FB 搜尋貼文不是很方便,這篇收錄了 2018 年原本發在 FB 的工作日常 (不過早期的貼文沒有 hashtag,有些非主角人物也不好確認是誰了)

2020年3月12日

[程式] codeforces 1321C: Remove Adjacent

[題意]
給一個由小寫字母組的字串 s (長度介於 1 ~ 100),每次你可以從 s 中刪掉一個滿足特定條件的字母,問最多能刪掉幾個?
刪除字母的條件:令 s[idx] 為 s 的第 idx 的字母。若 s[idx - 1] 或 s[idx + 1] 的字母其字母順序 (令字母順序為 a -> b -> c -> ... -> x -> y -> z) 在 s[idx] 的字母順序的前一個,則我們可以刪掉 s[idx]

2020年2月13日

[C] XOR linked list

一言以蔽之,這是個用 single linked list 的架構去做到 double linked list 的效果的東西,主要目的就是為了節省記憶體使用量

2020年1月2日

[筆記] Automatic Log Parser

這其實是個很大的題目,作法百百種,但是核心概念就是要將原本需要人工設計、維護的 log parser 轉變為用程式自動地去找出隱藏在 log 中訊息架構。這樣說可能不太好理解,我們直接看圖:
圖中最上面是 hadoop 印 log 訊息的程式片段,在執行過程中會在 log 檔產生中間的訊息,而最下面則是一般使用 log parser 通常會想得到的結果。通常 log parser 要產生出最下方的結果依賴於使用者知道 log 訊息的架構,比方說每個 log 訊息最一開始是時間資訊、然後是嚴重程度、從哪個元件印出來的、訊息內會有那些地方是固定或可變的...等等。然而這種方法最大的困擾點是目標程式改版、訊息架構有些許變化,log parser 也一定要跟著修改才能運作。所以近年來就有人開始研究是否有辦法讓程式自己找出那海量的 log 訊息中的架構,這樣就不用花大量的時間去維護 log parser 了。

"Tools and Benchmarks for Automated Log Parsing." 這篇發表在 2019 ICSE (International Conference on Software Engineering) 的論文簡單來說就是整理了至今發表的各種方法並且加以評比各自的精準度與效能。另外他們也把程式放上 github 了,有興趣的可以下載來使用看看,對於有這類需求的人我想是個滿適合拿來入門的。