2025年12月9日 星期二
2025年12月8日 星期一
若總讓過去的遺憾牽著走,現在的步伐就會變得侷促;
而侷促的現在,往往難以走向真正想要的未來
聽著 Podcast 意外得到的道理,類似天能但天能是爛片。被過去的遺憾束縛而對未來焦慮,但過去跟未來都是我不能改變的,能改變的一直都只有現在。在決定現在時應該摒棄過去跟未來。中文
回頭看自己以前寫的 Blogger,真的很好:版面乾淨、外觀一致、標籤整理得井井有條。 當時寫 blog,只是想把它當成「學習的證據」。但當熱情淡了,它反而變成一種負擔,像做不完的家事一樣。其實「學習」不應該被塞進那麼功利的目的裡。寫下來的文字,應該是記錄自己真正體驗到的人生。
English
When I look back at the Blogger site I made before, it was actually very good — clean layout, consistent style, and well-organized tags. I used to treat blogging as “proof of learning.” But when the passion faded, it slowly became a burden, like a chore that never ends. Learning shouldn’t be pushed into such a utilitarian purpose. What I write should simply record the life we truly experience.
2022年10月10日 星期一
MD5 筆記
MD5 Intro
MD5 訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位元(16個字元(BYTES))的雜湊值(hash value),用於確保資訊傳輸完整一致。(節自wiki)
簡易 MD5 工具 : md5sum
基本上 Unix, Linux 的作業系統都有預設 md5sum
-
md5sum 用法
# pipe $ echo "123" | md5sum ba1f2511fc30423bdbb183fe33f3dd0f - # 讀檔 $ md5sum .gitignore 247bc32fd24d78844194917cb32d556a .gitignore # check $ md5sum .gitignore > tmp.md5 $ md5sum -c tmp.md5 .gitignore: OK # pipe check $ echo "247bc32fd24d78844194917cb32d556a .gitignore" | md5sum -c .gitignore: OK
openssl/evp.h
The EVP digest routines are a high level interface to message digests (節自 Linux man page)。這裡註記一下 EVP 大概是代表 Envelope。雖然現在已經被改掉,但以前的 openssl/evp.h 的 #ifndef 是 HEADER_ENVELOPE_H。
-
evp 大概的流程
#include <stdio.h> #include <string.h> #include <openssl/evp.h> int main(int argc, char *argv[]) { EVP_MD_CTX *mdctx; const EVP_MD *md; char mess1[] = "Test Message\n"; char mess2[] = "Hello World\n"; unsigned char md_value[EVP_MAX_MD_SIZE]; unsigned int md_len, i; if (argv[1] == NULL) { printf("Usage: mdtest digestname\n"); exit(1); } OpenSSL_add_all_algorithms(); // 有可能有些 algo 沒有 load, ex. RSA-SHA1 md = EVP_get_digestbyname(argv[1]); if (md == NULL) { printf("Unknown message digest %s\n", argv[1]); exit(1); } mdctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(mdctx, md, NULL); // _ex() 較有效率, 以前的 code 可能是 EVP_DigestInit() EVP_DigestUpdate(mdctx, mess1, strlen(mess1)); EVP_DigestUpdate(mdctx, mess2, strlen(mess2)); EVP_DigestFinal_ex(mdctx, md_value, &md_len); EVP_MD_CTX_free(mdctx); printf("Digest is: "); for (i = 0; i < md_len; i++) printf("%02x", md_value[i]); printf("\n"); exit(0); }
參考資料 :
1.MD5 wiki
2.MD5SUM wiki
3.linux man page
4.stackoverflow
2022年10月9日 星期日
讀取 Linux file info (stat)
讀取 Linux 的檔案資訊
Linux 的檔案有很多資訊,即使只用到檔案大小也是很方便。
stat
-
struct stat
stat 的資料結構
#include <sys/stat.h> struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* Inode number */ mode_t st_mode; /* File type and mode */ nlink_t st_nlink; /* Number of hard links */ uid_t st_uid; /* User ID of owner */ gid_t st_gid; /* Group ID of owner */ dev_t st_rdev; /* Device ID (if special file) */ off_t st_size; /* Total size, in bytes */ blksize_t st_blksize; /* Block size for filesystem I/O */ blkcnt_t st_blocks; /* Number of 512B blocks allocated */ /* Since Linux 2.6, the kernel supports nanosecond precision for the following timestamp fields. For the details before Linux 2.6, see NOTES. */ struct timespec st_atim; /* Time of last access */ struct timespec st_mtim; /* Time of last modification */ struct timespec st_ctim; /* Time of last status change */ #define st_atime st_atim.tv_sec /* Backward compatibility */ #define st_mtime st_mtim.tv_sec #define st_ctime st_ctim.tv_sec };
-
struct stat
讀取檔案 (這裡讀 .gitignore)
#include <stdio.h> // for printf #include <time.h> // for ctime #include <sys/stat.h> int main() { struct stat st; // 0 success, -1 failed // error code: errno if(stat(".gitignore", &st) == -1){ return -1; } printf("I-node number: %ld\n", (long) st.st_ino); printf("Mode: %lo (octal)\n", (unsigned long) st.st_mode); printf("Link count: %ld\n", (long) st.st_nlink); printf("Ownership: UID=%ld GID=%ld\n", (long) st.st_uid, (long) st.st_gid); printf("device containing file id: %ld\n", (long) st.st_dev); printf("device id: %ld\n", (long) st.st_rdev); printf("File size: %lld bytes\n", (long long) st.st_size); printf("Preferred I/O block size: %ld bytes\n", (long) st.st_blksize); printf("Blocks allocated: %lld\n", (long long) st.st_blocks); printf("Last status change: %s", ctime(&st.st_ctime)); printf("Last file access: %s", ctime(&st.st_atime)); printf("Last file modification: %s", ctime(&st.st_mtime)); return 0; }I-node number: 20057552 Mode: 100664 (octal) Link count: 1 Ownership: UID=1000 GID=1000 device containing file id: 66306 device id: 0 File size: 16 bytes Preferred I/O block size: 4096 bytes Blocks allocated: 8 Last status change: Tue Mar 29 14:03:01 2022 Last file access: Sun Oct 9 19:02:52 2022 Last file modification: Thu Jun 17 10:20:57 2021
參考資料 :
1.Linux manual page
2.程式人生
2022年9月25日 星期日
vscode 刪除空格 (Remove trailing spaces)
使用 vscode 自動刪除空格的原因
當你上 code 時,有 reviewer 看你的程式碼時,通常會用 meld 等軟體 review。當你的程式碼加了多餘的空格時,都會被這些程式碼 highlight,使得 reviewer 在查看你的程式碼時有一定的不便。
vscode 刪除空格
-
手動刪除空格 (Remove trailing spaces manually)
ctrl + alt + p,輸入 trail 你應該就可以看到相關快捷鍵。
-
自動刪除空格 (Remove trailing spaces automatically)
setting > 右上角的 open setting (JSON) > 加入以下這行。
"files.trimTrailingWhitespace": true
參考資料 :
1.remove-trailing-spaces-automatically-or-with-a-shortcut
Leet code
最近一直寫 Leetcode,部落格也就荒廢許久,想說突破 200 題來分享一下心得。
Distance question
Leetcode 上有很多問題是關於距離,這裡紀錄下一些有用的數學概念。
-
平均值 (mean)
平均值的歐幾里得距離最短 (4*4 + 4*4 < 1*1 + 7*7)
但相乘值最大 (4*4 > 1*7)
-
中位數 (median)
中位數的絕對偏差值最低 (跟其物件的距離之總和最短)
-
眾數 (mode)
mode minimizes distance for indicator function (理解不能)
這個我沒寫過類似的,寫過後我再更新。
參考資料 : 1.leetcode/discuss
Popular Posts
-
lvalue 、rvalue 基本概念 左值 (lvalue) : 一個佔據某個特定記憶體的值。 右值 (rvalue) : 一個 expression 結束後就消失的值。 基本上這兩個定義包含了全部的值,非左即右,非右即左。 int var = 4; // v...
-
Don't lie, I know you've been thinking it 別說謊了,我知道你一直很渴望 And two times, you let it slip from your lips 兩次了,你那不想讓人聽見的低語 You...
-
You try to hold me down so I became a soldier 你想要控制所以我成為了戰士 Built up all theses walls and now I'm climbing over 監牢般的城牆如今我已越過 Thos...
-
Ooh, don't we look good together? 我們看起來是不是很棒? There's a reason why they watch all night long 這就是為何他們整晚都看著我們的原因 Yeah, kn...
-
Job Company : Houzz Job : Back-End Software Engineer Source : Recruiter on LinkedIn Result : 止步二面 Summary 1. 英文程度不佳 :...
-
BCB TDateTime 時間操作及應用 在 BCB 裡有關時間的操作幾乎都是與 TDateTime 這個 Class 相關 若找不到相關資料可以用 BCB 的 HELP ( 游標移到要查詢的函式或Class 並按 F1 ) 介紹幾個個人有在用的函式 TDate...
-
報告在製作時,一定會遇到要字串轉數字 在 BCB 裡有方便的函式 常見的有 String str = "123" int x = StrToInt(str); float y = StrToFloat(str); 但有時候...
-
重新踏入網頁開發 重新踏入網頁開發 (1) - Nodejs 重新踏入網頁開發 (2) - ES6 重新踏入網頁開發 (3) - Route 重新踏入網頁開發 (4) - Dependency injection ...
-
BCB 選擇路徑(資料夾) 工作關係要將各式各樣的資料彙整並輸出 各式各樣的資料都放在同一目錄下 所以在設計程式就必須設計可以給使用者選擇目錄 但BCB10似乎沒有這種元件 (其實有 DirectoryListBox 但我駕馭不了) 於是Google發現大家用的...
-
warning: left shift count >= width of type 一般來說,就是 shift 的 bit 大於資料型態的 bit 數。但有時使用 unsigned long 仍然會出錯,因為 unsigned long 會依照系統的不同,有...

