
| 琴晚好地地 |
| 今朝冇左鼻 |
| 講話吾流利 |
| 喫野吾知味 |

BOOKCARD

| 龍飛鳳舞振家聲 |
| 招牌一出棟天庭 |
『龍飛鳳舞』指『喫夜粥練硬對拳頭』
『招牌』指『洪門』
『棟』指『棟穿』
『天庭』指『满清』
咸丰四年-儒略歷1854年,『陳開』白晝獄官, 夜晚洪門『洪順堂』大佬. 得知『洪秀全/全哥』係金田起義,之後仲係金陵建立『太平天國』.
『陳開』知道時機成熟,連仝 二花面『李文茂』, 『豐寧寺』主持『鄺能/和尚能』三人密謀 决定發動洪門起義. 『和尚能』議定作戰戰略『拜佛』『劏羊』『擒龍』.
『龍飛鳳舞振家聲 招牌一出棟天庭』.咸豐四年六月十一日即係1854年7月5日,主帥『陳開』領率『洪門子弟』,副帥『李文茂』領率『梨园子弟』,『和尚能』軍師.
首戰『拜佛』壹日 占領『佛山』, 『和尚能』以『塔坡寺』為本陳. 發動『劏羊』作戰.









買雜牌『B450-ITX』配『RYZEN5-1500X』砌臺ITX,摆係老竇屋企睇片.點知『BE200』WIFI吾認識. 早期版本,篮牙要更新BIOS.
壹年後……
平時冇點用,拎翻蒞諗住插支咪試下,壹插塊主板烧左,前后寄翻去3次,先肯换塊新RGBA版本,前後各壹條m.2磁碟,插4pin小喇叭著機BOOT.
以雜牌蒞講都算好,保养3年,壹年後烧左换新. 祗係記憶體吾兼容,間隙輕機. AID64記憶體測試報錯.舊版本返宜兼容記憶體.唯有降低頻率加大時序.
用『Ryzen DRAM Calculator』睇時序配置.
| 記憶體 | 默認值 | 修定後 |
| MEM FREQUENCY(Mhz) 頻率 | 2400 | 2133 |
| 主時序配置 | ||
| Tcl | 15 | 20 |
| Trcdrd | 15 | 20 |
| Trcdwr | 15 | 20 |
| Trp | 15 | 20 |
| Tras | 35 | 38 |
| 副時序配置 | ||
| Trc | 0 | |
| Trrds | 4 | |
| Trrdl | 6 | |
| Tfaw | 23 | |
| Twtrs | 3 |
休眠喚醒後顯示器黑屏,要撳『power』鍵重啟.BIOS 已UPADAE.『Win10/Linux』皆係.
| B450-ITX | RGBA版 |
| m.2磁碟 | 2 |
| BOOT-4pin | 1 |
| rgba燈 | 2 |
| 4pin風扇 | 2 |
| 3pin風扇 | 2 |
| DEBUG | 1 |



之前係老竇屋企砌臺ITX電腦愛蒞睇片,『BE200』新出買蒞試試, 點知係係『b450-itx』可以認藍牙,唔認WIFI.反而係『x99-itx』藍牙WIFI都認.
唯有『AX210』配『b450-itx』, 『BE200』配『x99-itx』.
下載最新Intel WiFi驅動.

係電腦發展初時定義左套『ASCII碼』,得128字符,英文加數字用單字節BYTE. 後蒞各國皆自定『字符編碼』,『Shift-JIS/EUC-KR/BIG5/GB2312』皆占两字節WORD,结果係編碼重叠.所以先有亂碼.
| 字 | Low 8bit | Height 8bit |
| ASCII-128 | 0 ~ 0x7F | N/A |
| BIG5漢字 | 0xA1 ~ 0xF9 | 0x40 ~ 0x7E
0xA1 ~ 0xFE |
| SHIFT-JIS日字 | 0x81~0x9f
0xe0~0xef |
0x40~0x7e
0x80~0xfc |
| EUC-KR韓字 | 0xA1~0xFE | 0xA1~0xFE |
| GB2312中字 | 0xA1 ~ 0xF7 | 0xA1 ~ 0xFE |
| GBK中字 | 0x81 ~ 0xFE | 0x40 ~ 0xFE |
『UTF-8』係Unicode『萬國碼』變體,首byte前缀標記字符長度.前缀0長度1, 前缀110長度2, 前缀1110長度3.以此类推.尾随byte前缀皆標記01.
| 『UTF-8』bin | 長度 |
| bin:0xxxxxxx | 1 |
| bin:110xxxxx 10xxxxxx | 2 |
| bin:1110xxxx 10xxxxxx 10xxxxxx | 3 |
| bin:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4 |
| bin:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 5 |
| bin:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 6 |
UTF-8判定
| if ((utf8[0] & 0x80) == 0x00)
return 1; |
值小於0x80的ASCII字元 |
| if ((utf8[0] & 0xE0) == 0xC0 &&
(utf8[1] & 0xC0) == 0x80) return 2; |
2字節UTF-8字符 |
| if ((utf8[0] & 0xF0) == 0xE0 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) return 3; |
3字節UTF-8字符 |
| if ((utf8[0] & 0xF8) == 0xF0 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) return 4; |
4字節UTF-8字符 |
| if ((utf8[0] & 0xFC) == 0xF8 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) return 5; |
5字節UTF-8字符 |
| if ((utf8[0] & 0xFE) == 0xFC &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) return 6; |
6字节UTF-8字符 |
值小於0x80係ASCII字符集
| if ((string[0] & 0x80) == 0x00)
return 1; |
BIG5漢字符集編碼范圍
| if ((string[0] >= 0xA1 && string[0] <= 0xF9) &&
(string[1] >= 0x40 && string[1] <= 0x7E || string[1] >= 0xA1 && string[1] <= 0xFE) ) return 2; |
SHIFT-JIS日字符集編碼范圍
| if ((string[0] >= 0x81 && string[0] <= 0xF9 ||
string[0] >= 0xe0 && string[0] <= 0xef) && (string[1] >= 0x40 && string[1] <= 0x7E || string[1] >= 0xA1 && string[1] <= 0xFE) ) return 2; |
EUC-KR韓字符集編碼范圍
| if ((string[0] >= 0xA1 && string[0] <= 0xFE) &&
(string[1] >= 0xA1 && string[1] <= 0xFE)) return 2; |
GB2312中字符集編碼范圍
| if ((string[0] >= 0xA1 && string[0] <= 0xF7) &&
(string[1] >= 0XA1 && string[1] <= 0XFE) ) return 2; |
GBK中字符集編碼范圍
| if ((string[0] >= 0x81 && string[0] <= 0xFE) &&
(string[1] >= 0XA0 && string[1] <= 0XFE) ) return 2; |

係電腦發展初時.定義左套『ASCII碼』,得128字符,英文加數字用單字節BYTE. 後蒞各國皆自定『字符編碼』,『BIG5/GB2312』皆占两字節WORD,结果係編碼重叠.所以先有亂碼.
UNICODE『萬國碼』,各國各自有獨立編碼段,吾重叠,同『ASCII碼』兼容.
『UNICODE』係設計之初每字符占『2 BYTE』即『USC2』字符集. 但係『2 BYTE』够支持65535字符.所以後蒞有『USC4』占『4 BYTE』.
係同壹字符串USC2同USC4會混合出現.
但係『ASCII碼』只需單字節『1 BYTE』. 所以發明左『UTF-8』以節約地方.
『UTF-8』同『UNICODE』按照下表互為轉换.
| Unicode『USC2』字符集HEX | 『UTF-8』bin |
| 0x0000~0x007F | 0xxxxxxx |
| 0x0080~0x07FF | 110xxxxx 10xxxxxx |
| 0x0800~0xFFFF | 1110xxxx 10xxxxxx 10xxxxxx |
為左係同壹字符串『USC2』同『USC4』混合出現.係『USC4』字符『低16bit』同『高16bit』分別加前缀標記.
『低16bit』加『0xD800』,『高16bit』加『0xDC00』,再加壹區域0x10000.
前缀標記『0xD800』『0xDC00』各占6bit,各净低10bit加埋有『20bit』.够支持 『1048576』字符
| USC4-低16bit前缀標記 | 0xD800 | BIN:110110 00000 00000 |
| USC4-高16bit前缀標記 | 0xDC00 | BIN:110111 00000 00000 |
| USC4 | 前缀標記 | USC4=前缀標記+字符 |
| 低16bit | 0xD800 | BIN:110110 00000 00000 + BIN:xxxxxxxxxx |
| 高16bit | 0xDC00 | BIN:110111 00000 00000 + BIN:xxxxxxxxxx |
utf8 轉 usc4
| 首字節 | value = utf8[sour] & (0xFF >> (bytes + 1));
++sour; |
| 尾随字節 | for (int i = 1; i < bytes; ++i) {
value = value << 6; value = value | (utf8[sour] & 0x3f);// 提低6bit ++sour; } |
| 减壹區域 | value = value – 0x10000 |
| 低16bit | unicode[dest] = 0xD800 | ((value >> 10) & 0x3ff ); |
| 高16bit | unicode[dest+1] = 0xDC00 | ((value) & 0x3ff);
dest = dest + 2; |
utf8 轉 usc2
| 首字節 | value = utf8[sour] & (0xFF >> (bytes + 1));
++sour; |
| 尾随字節 | for (int i = 1; i < bytes; ++i) {
value = value << 6; value = value | (utf8[sour] & 0x3f); ++sour; } |
| 反轉字節 | v = (value >> 24) & 0xFF;
unicode[dest] = v; v = (value >> 16) & 0xFF; if (v != 0) { unicode[dest] = (unicode[dest] << 8) + v; ++dest; } |
| 反轉字節 | v = (value >> 8) & 0xFF;
unicode[dest] = v; v = value & 0xFF; if (v != 0) { unicode[dest] = (unicode[dest] << 8) + v; ++dest; } |
Usc4轉utf8
| 提取字符 | value = (unicode[sour] – 0xD800) << 10 | (unicode[sour + 1] – 0xDC00); |
| 加壹區域 | value = value + 0x10000; |
Usc2轉utf8
| 提取字符 | value = unicode[sour]; |
| 首字節 | utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6));
++dest; |
| 尾随字節 | for (int i = 1; i < bytes; ++i) {
utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F); ++dest; } ++sour; |
『UTF-8』首byte,前缀標記字符長度. 前缀0長度1, 前缀110長度2, 前缀1110長度3. 以此类推.尾随byte前缀皆標記01.
| 『UTF-8』bin | 長度 |
| bin:0xxxxxxx | 1 |
| bin:110xxxxx 10xxxxxx | 2 |
| bin:1110xxxx 10xxxxxx 10xxxxxx | 3 |
| bin:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4 |
| bin:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 5 |
| bin:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 6 |
按首BIT符號,計算UTF8字符長度,返回0非UFT8字符.
| 『UTF-8』字符 | |
| if ((utf8[0] & 0x80) == 0x00)
return 1; |
0xxxxxxx |
| if ((utf8[0] & 0xE0) == 0xC0 &&
(utf8[1] & 0xC0) == 0x80) return 2; |
110xxxxx 10xxxxxx |
| if ((utf8[0] & 0xF0) == 0xE0 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) return 3; |
1110xxxx
10xxxxxx 10xxxxxx |
| if ((utf8[0] & 0xF8) == 0xF0 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) return 4; |
11110xxx
10xxxxxx 10xxxxxx 10xxxxxx |
| if ((utf8[0] & 0xFC) == 0xF8 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) return 5; |
111110xx
10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
| if ((utf8[0] & 0xFE) == 0xFC &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) return 6; |
1111110x
10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
unicode轉utf8 , ASCII碼相等.
| int UnicodeToUTF8(char * utf8, const wchar_t * unicode)
{ int unicodeLength = 0; int bytes; int dest, sour; DWORD value; unicodeLength = Unicode_Length(unicode) ; sour = dest = 0; while (sour < unicodeLength) { bytes = 1; if (unicode[sour] >= 0xD800 && unicode[sour + 1] >= 0xDC00) bytes = 4; else if (unicode[sour] >= 0x00 && unicode[sour] <= 0x7F) bytes = 1; else if (unicode[sour] >= 0x80 && unicode[sour] <= 0x7FF) bytes = 2; else if (unicode[sour] >= 0x800 && unicode[sour] <= 0xFFFF) bytes = 3; else if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x10000 && ((unicode[sour + 1] << 16) | unicode[sour]) <= 0x1FFFFF) bytes = 4; else if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x200000 && ((unicode[sour + 1] << 16) | unicode[sour]) <= 0x3FFFFFF) bytes = 5; else if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x4000000 && ((unicode[sour + 1] << 16) | unicode[sour]) <= 0x7FFFFFFF) bytes = 6; else if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x80000000) bytes = 7;
if (bytes == 1) { utf8[dest] = unicode[sour]; ++dest; ++sour; } else if (unicode[sour] >= 0xD800 && unicode[sour + 1] >= 0xDC00) { value = (unicode[sour] – 0xD800) << 10 | (unicode[sour + 1] – 0xDC00); value = value + 0x10000; utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6)); ++dest; for (int i = 1; i < bytes; ++i) { utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F); ++dest; } sour = sour + 2; } else if (bytes == 2 || bytes == 3) { value = unicode[sour]; utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6)); ++dest; for (int i = 1; i < bytes; ++i) { utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F); ++dest; } ++sour; } else if (bytes >= 4) { value = (unicode[sour + 1] << 16) | unicode[sour]; utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6)); ++dest; for (int i = 1; i < bytes; ++i) { utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F); ++dest; } sour = sour + 2; } } utf8[dest] = NULL; return dest; } |
utf8 轉 unicode
| int UTF8ToUnicode(wchar_t * unicode, const char* utf8)
{ int utf8Length; int sour, dest; int bytes; dest = sour = 0; DWORD value; BYTE v; utf8Length = strlen(utf8); while (sour < utf8Length) { if ((utf8[sour] & 0x80) == 0x00) bytes = 1; else if ((utf8[sour] & 0xE0) == 0xC0) bytes = 2; else if ((utf8[sour] & 0xF0) == 0xE0) bytes = 3; else if ((utf8[sour] & 0xF8) == 0xF0) bytes = 4; else if ((utf8[sour] & 0xFC) == 0xF8) bytes = 5; else if ((utf8[sour] & 0xFE) == 0xFC) bytes = 6; else bytes = 7; if (bytes == 1) { unicode[dest] = utf8[sour]; ++dest; ++sour; } else if (bytes == 2 || bytes == 3) { value = utf8[sour] & (0xFF >> (bytes + 1)); ++sour; for (int i = 1; i < bytes; ++i) { value = value << 6; value = value | (utf8[sour] & 0x3f); ++sour; }
v = (value >> 24) & 0xFF; unicode[dest] = v; v = (value >> 16) & 0xFF; if (v != 0) { unicode[dest] = (unicode[dest] << 8) + v; ++dest; }
v = (value >> 8) & 0xFF; unicode[dest] = v; v = value & 0xFF; if (v != 0) { unicode[dest] = (unicode[dest] << 8) + v; ++dest; } } else if (bytes >= 4 ) { value = utf8[sour] & (0xFF >> (bytes + 1)); ++sour; for (int i = 1; i < bytes; ++i) { value = value << 6; value = value | (utf8[sour] & 0x3f); ++sour; } value = value – 0x10000; unicode[dest] = 0xD800 | ((value >> 10) & 0x3ff ); unicode[dest+1] = 0xDC00 | ((value) & 0x3ff); dest = dest + 2; } }
unicode[dest] = NULL; return dest; } |

『Android Studio』默認utf8編碼. 而『Visual Studio』按『地區設定』,轉本地字符編碼.
要强轉utf8可以係字加『u8』前缀
| char utf8[MAX_CHAR] = u8″abcdef屌㞗𡳞杘屄”; |
加『u8』前缀後,代碼移稙『Android Studio』繁鎖.可以加編譯詣令.
| #pragma execution_character_set(“utf-8”) |
适宜字符寫死係代碼. 若将字符保存係外部文檔,存為utf8即軟代碼.唔使諗編碼.
要强轉unicode係字加『L』前缀.USC2同USC4混埋.
| wchar_t unicode[MAX_CHAR] = L”屌㞗𡳞杘屄”; |

經緯度座標有叄種格式,『度分秒』『度分』『度』.
『度分秒』等於『時分秒』, 『1度=60分=3600秒』『1分=60秒』
| 經緯度座標 | |
| 度分秒DMS | DDD°MM’SS” |
| 度分DM | DDD°MM.MMM’ |
| 度D | DDD.DDDDD° |
| 度分秒 | 轉换 |
| 分轉度 | 除60 |
| 秒轉度 | 除3600 |
| 秒轉分 | 除60 |
| 度轉分 | 度小數乘60 |
| 分轉秒 | 分小數乘60 |
『度分秒』轉『度』
| 例『35°41′37.5″』即係『35度41分37.5秒』 |
| 41分轉度= 41/60 |
| 37.5秒轉度=37.5/3600 |
| 35 + 41/60 + 37.5/3600=35.69375度 |
| void DMS_TO_DD(float D,float M,float S,double * DD)
{ *DD = D + M/60.0f + S/3600.0f; } |
『度分』轉『度』
| 例『35°41.625』即係『35度41.625分』 |
| 41.625分轉度= 41/60 |
| 35 + 41.625/60 =35.69375度 |
| void DM_TO_DD(float D, float M, double* DD)
{ *DD = D + M / 60.0f; // 除60 } |
『度』轉『度分』
| 例『35.6937632°』即係『35度41.625792分』 |
| 『0.6937632°』度轉分 0.6937632*60=41.625792′ |
| 35 + 0.6937632*60=『35°41.625792’』=『35度41.625792分』 |
| void DD_TO_DM(double DD,int * D,float * M)
{ *D = (int)DD; // 度取整 *M = (DD – *D) * 60; // 度小數乘60 } |
『度』轉『度分秒』
| 例『35.6937632°』度即係『35度, 41分, 37.54秒』 |
| 取度小數『0.6937632°』度轉分 0.6937632°*60=41.625792′ |
| 取分小數『0.625792’』分轉秒 0.625792’*60=37.54752″ |
| 35°+ 0.6937632°*60 + 0.625792’*60=『35°41′37.5″』=『35度, 41分, 37.54秒』 |
| void DD_TO_DMS(double DD, float* D, float* M, float* S)
{ float MM; *D = (int)DD; // 度取整 MM = (DD – *D) * 60; // 度小數乘60 *M = (int)MM;// 分 *S = (*M – MM) * 60;// 分小數乘60 } |
| 1日 | 360度 |
| 1度 | 60分=3600秒 |
| 1分 | 60秒 |

係Windows拖拽或者縮放窗口, 會造成窗體閃爍, 啟用象筋拖放, 即係非實時拖放,可避免窗體閃爍.
| 進入像筋拖放 |
| SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, true, &drag_full_windows, NULL); |
| 退出像筋拖放 |
| SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, false, &drag_full_windows, NULL); |
通過監聽『WM_ENTERSIZEMOVE』進入拖拽, 『WM_EXITSIZEMOVE』退出像筋拖拽, 實施像筋象筋拖放
| LRESULT CALLBACK WindowProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ |
| if (msg == WM_ENTERSIZEMOVE)
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, true, &drag_full_windows, NULL);// 進入像筋拖放 else |
| if (msg == WM_EXITSIZEMOVE)
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, false, &drag_full_windows, NULL);// 退出像筋拖放 |
| return(DefWindowProc(hWnd, msg, wParam, lParam));
} |












WD BLACK AN1500原配两條SN730仲有ARGB燈,有人拆出蒞䶒賣殼.睇中佢自動组建Raid0,讀寫至高達『6500MB/S』,諗住買翻『SN730-1TB』, 睇到『PC300-1TB』特價,仲係『MLC SSD』. 1TB仲係1024GB.
打孖插入『PC300-1TB』自建Raid0. 温度高達65℃. 讀『3800 MB/S』,寫『2194MB/S』. 比『SN730』慢.
| WD BLACK AN1500-Raid0 | PC300 NVMe SK Hynix 1TB*2 |
| CrystalDiskMark讀 | 2800 MB/S |
| CrystalDiskMark寫 | 2194MB/S |
| CrystalDiskInfo | 69℃. |
| MLC SSD | SK Hynix H2702T8C0B3A |
| WD AN1500 | |
| 上行 | 6500MB/S |
| 下行 | 6500MB/S |
| 總線 | PCIe Gen3*4 SSD |




『ZLIB』係開源『壓縮』同『解壓』程式庫, 支持『DEFLATE』冇損壓縮算法,混合『LZ77算法』同『霍夫曼編碼』.
『Visual studio』冇內置『ZLIB』,下載『zlib-1.2.13.tar.gz』再編譯.
| http://www.zlib.net/ |
| http://www.zlib.net/zlib-1.2.13.tar.gz |
| 路徑 | 版本 |
| C:\Program Files (x86)\zlib-1.2.13\build\Debug | Debug |
| C:\Program Files (x86)\zlib-1.2.13\build\Release | Release |
| Debug調試版 | Release發行版 | |
| zlibstaticd.lib | zlibstatic.lib | 静態庫, 唔使dll |
| zlibd.lib | zlib.lib | 動態庫, 要dll |
| zlibd.dll | zlib.dll | 動態連结 |
| C:\Program Files\zlib\include\zconf.h | Zlib-API |
| C:\Program Files\zlib\include\zlib.h |
| #include <zlib.h> | Zlib-api |
| #include <zconf.h> |
| #if _DEBUG | |
| #pragma comment(lib, “..\\ZLIB\\zlibstaticd.lib”)
#else |
|
| #pragma comment(lib, “..\\ZLIB\\zlibstatic.lib”)
#endif |


『CMake』愛蒞生成makefile或project文件, 畀Visual studio編譯代碼.
登入『CMake官網』下載『cmake-3.27.7-windows-x86_64.msi』安装包.
驗証CMake安装
| https://cmake.org/ |
| https://cmake.org/download/ |
| cmake-3.28.0-rc3-windows-x86_64.msi |
| cmake-3.27.7-windows-x86_64.msi |




上次『USB3.0壹拆貳』插『SD讀卡機』冇反應,改買臺彎汤銘TERMINUS-FE2.1芯片,『USB2.0 壹拆肆』.聽講兼容冚辦闌USB2.0機體.
冇定位窿, 3D打印磁吸底座,吸係機槓壁.配線够長.
部『SD讀卡機』係USB3.0-19PIN,要轉9PIN.好彩識認.


華南X99-F8D Plus
臺X570冇定時輕機,睇翻佢本天書,要用『1R8/2R8-DDR4』記憶體,買两條32GB成千幾紋,索性買雜牌X99玩,開機慢到以為吾著. 壹分鐘先睇到bios logo
配置如下
雜牌X99-F8D Plus有捌條DDR4槽, 單條支持至高64GB.捌條槽最高512GB.DDR4-64GB依然偏貴.块X99話支持肆通道.買两條用住先.




買左雜牌『X99-F8D PLUS』, 睇岩『E5-2637 V4』支持雙U,頻率至高.『基頻3.5GHZ』畀『E5-1630V4』低200HZ.
用CPU-Z測單線程相若. 多線程跑分接近壹倍. 可能同雙CPU有關.
| INTEL XEON | E5-2637V4 | E5-1630V4 | E5-2630LV3 |
| CPU-Z單線程 | 462.4 | 470.7 | 233.2 |
| CPU-Z多線程 | 4368.2 | 2350.2 | 2136.7 |
| 主頻 | 3.5GHZ | 3.7GHZ | 1.8GHZ |
| 核心 | 4核 | 4核 | 8核 |
| 線程 | 8線程 | 8線程 | 16線程 |
| TDW | 140W | 140W | 55W |

買左雜牌『x99-EATX』,舊式ATX機槓要拆左光驅位支架.冇臺鉆拆拉釘驚拆爛.索性新買EATX機槓W100,分左右腔.10條PCIE槽位,有主板要11條PCIE槽位.
左腔裝主板同風扇,為左装『23030風扇』要移有機玻璃去門板外側.
右腔得86mm寬,装3.5寸機體同埋atx火牛都掹水,早知買W200吾使搞甘耐.

雜牌x99-eatx係登入Win10間謁會Te

eDriverW8x64.sys蓝屏. 心諗雜牌都係信唔過.
『TeeDriverW8x64.sys』係『Intel(R) Management Engine Interface』英特爾®管理引擎介面驅動程式.
『剷TeeDriverW8x64.sys』




新EATX機槓裝9把『200風扇』. BNFENIX-3PIN白色『230風扇』,為左装係『200扇位』削去两側. 9扇葉設計,扇速慢得800轉.9把『230風扇』要風扇集線器.
230扇葉大易斷扇軸,冇适合鐵網保謢扇葉.
| PC-FAN 23030 | 數值 |
| 尺碼 | 230*30mm |
| 電壓 | 12V |
| 電流 | 0.18A |
| Materials | PBT |
| Speed(R.P.M.) | 700~900轉/分 |
| 噪聲 | 20(dB-A) |
| 厚 | 25MM |
| 窿徑 | 4MM |




前幾日打印『SOCKET-2011風扁支架』,ABS打印90*90MM梗有壹角收縮翘邊.搞左幾日最後502黐死底座,要重黐美紋紙.
睇『噴砂磁鋼板平臺』分两層,下層磁貼底座,3M背胶黐住熱床. 上層係噴砂磁鋼,靠下層磁貼吸死.
厰家指南熱唔超80℃.事實比美紋紙仲衰,打印ABS只有熱床上到110℃,先睇到效果.等熱床降温後自動分離.









X99-EATX愛两正方SOCKET-2011散熱. 唔諗買『熱導管散熱』.學上次咁買两拆機銅散熱,正方『90mm*90mm』, 配两『AVC-9025-12V-0.13A』.風扇底座用3D打印. 尺寸太大ABS容易收縮變形.

舊時『游戲紋理』再用『.bmp格式』, 冇壓缩即使256色盤依然佔用吉間.
『.PNG格式』利LZ77且冇失真壓縮. 且壓縮極高, 配合256色盤,适宜作『游戲紋理』.
| 數據塊 | 數值 |
| PNG圖檔標誌 | 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A |
| 圖檔頭 | IHDR |
| 调色板 | PLTE |
| 图像数据 | IDAT |
| 图像结束 | IEND |
PNG數據塊基本結构.
| 數據塊結构 | size | 簡介 |
| LENGTH | 整數4字節 | 數據長度 |
| CHUNK TYPE | 整數4字節 | 類型標記 |
| CHUNK DATA | 0~2^32字節 | 數據 |
| CRC32 | 整數4字節 | CRC32校驗 |
两字節肆字節數據,冚辦闌用『網络字節』存儲,需轉『主機字節』.
| 『網络字節』轉『主機字節』 |
| #define PNG_VALUE32(v) ((v & 0xff000000) >> 24 | (v & 0x00ff0000) >> 8 | (v & 0x0000ff00) << 8 | (v & 0x000000ff) << 24) |
| #define PNG_VALUE16(v) ((v & 0xff00) >> 8 | (v & 0x00ff) << 8) |
游戲引擎需讀PNG 伍個數據塊
| PNG數據塊 | 功能簡介 |
| IHDR | 文檔頭 |
| PLTE | 色盤 |
| IDAT | 圖像數值 |
| IEND | 結束 |
| tRNS | 圖像透明 |
| bKGD | 背景色 |
PNG圖檔頭捌字節標記,愛蒞識别PNG
| 0x89 | 0x50 | 0x4E | 0x47 | 0x0D | 0x0A | 0x1A | 0x0A |
| 137 | P | N | G | \r | \n | 26 | \n |
對比PNG標識
| if(memcmp(data, 0x0A1A0A0D474E5089, 8) != 0)
return false;// 非png圖檔 |
CRC32計算必需計『CHUNK TYPE + CHUNK DATA』, 長度『length + 4』而得.
| DWORD length = PNG_VALUE32(chunk->length) + 4; | 長 |
| DWORD64 crc = CRC32((PBYTE)(chunk) + 4,length); | CRC32計算 |
| DWORD64 crc_ = PNG_VALUE32(chunk->crc_); | 轉主機字節 |
| if(crc_ == crc)
return true;
|
比較crc值 |
首先定義PNG結构
| typedef struct PNG_TAG{ | |
| int width; | 圖宽 |
| int height; | 圖高 |
| int bitCount; | 位圖像素bits 8位,16位,24位,32位 |
| PNG_RGBA palette[256]; | 调色板 |
| PBYTE buffer; | 圖像数据 |
| int buffer_size; | 圖像数据長度 |
| int length; | 临時變量 |
| z_stream stream; | ZLIB解壓 |
| } PNG, *PNG_PTR; |
文檔頭結构 IHDR
| typedef struct PNG_IHDR_TAG{ | 文檔頭 IHDR |
| int length; | Data長度 |
| DWORD type; | 標記’IHDR’ |
| DWORD width; | 像素寬 |
| DWORD height; | 像素高 |
| BYTE BitDepth; | 圖像深度 |
| BYTE ColorType; | 顏色類型 |
| BYTE Compression; | LZ77派生演算法 ,壹定係0 |
| BYTE Filter; | 濾波,止值定0. 事實『0,1,2,3,4』伍種濾波 |
| BYTE Interlace; | 隔行掃描0=冇掃描,1=(Adam7 interlace) |
| DWORD CRC32; | CRC32校驗 |
| }PNG_IHDR,*PNG_IHDR_PTR; |
PNG支緩伍款顏色類型
| ColorType | 顏色類型 | 像素 |
| 0=Greyscale | 灰度圖像 | 1,2,4,8,16bit |
| 2=Truecolour | 真彩色圖像 | 8,16bit |
| 3=Indexed-colour | 索引彩色圖像 | 1,2,4,8bit |
| 4=Greyscale with alpha | 帶α通道資料灰度圖像 | 8,16bit |
| 6=Truecolour with alpha | 帶α通道資料真彩色圖像 | 8,16bit |
像素排列
| ColorType | 像素排列 |
| Greyscale | Y |
| Truecolour | RGB |
| Indexed-colour | i |
| Greyscale with alpha | RGBA |
| Truecolour with alpha | YA |
解析文檔頭 IHDR, 分配圖像時分, 每行像素多壹字節,記錄『Filter』濾波值,『0,1,2,3,4』伍種濾波;
| if(IHDR->ColorType == 0)
png->bitCount = IHDR->BitDepth; |
0:Greyscale:灰度圖像,1,2,4,8,16bit |
| if(IHDR->ColorType == 2)
png->bitCount = IHDR->BitDepth * 3; |
2:Truecolour:真彩色圖像,8,16bit |
| if(IHDR->ColorType == 3)
png->bitCount = IHDR->BitDepth; |
3:Indexed-colour:索引彩色圖像,1,2,4,8bit |
| if(IHDR->ColorType == 4)
png->bitCount = IHDR->BitDepth * 2; |
4:Greyscale with alpha:帶α通道資料灰度圖像,8,16bit |
| if(IHDR->ColorType == 6)
png->bitCount = IHDR->BitDepth * 4; |
6:Truecolour with alpha:帶α通道資料真彩色圖像,8,16bit |
| png->width = PNG_VALUE32(IHDR->width); | 像素寬 |
| png->height = PNG_VALUE32(IHDR->height); | 像素高 |
| int byte_count = (float)png->bitCount / 8.0f; | 像素大小 BIT to BYTE |
| png->buffer_size = (png->width * png->height * byte_count) + (png->height * 1); | 圖像数据長度,每行多壹字節 |
| png->buffer = (PBYTE)malloc(png->buffer_size); | 圖像数据 |
定義色盤RGB
| typedef struct PNG_RGB_TYP { | 色盤3字節 |
| BYTE red; | 紅 |
| BYTE green; | 錄 |
| BYTE blue; | 蓝 |
| } PNG_RGB, *PNG_RGB_PTR; |
定義色盤RGBA
| typedef struct PNG_RGBA_TYP { | 色盤4字節 |
| BYTE red; | 紅 |
| BYTE green; | 錄 |
| BYTE blue; | 蓝 |
| BYTE alpha; | 透明混合,透明0x00~實體0xFF |
| } PNG_RGBA, *PNG_RGBA_PTR; |
定義PNG色盤結构 ‘PLTE’
| typedef struct PNG_PLTE_TYP { | |
| int length; | Data長度 |
| DWORD type; | 標記’PLTE’ |
| PNG_RGB palette[256]; | 至多256色盤 |
| DWORD CRC32; | CRC32校驗 |
| } PNG_PLTE, *PNG_PLTE_PTR; |
分析PNG色盤 ‘PLTE’
| int length = PNG_VALUE32(chunk->length); | 長度 |
| int count = length / 3; | 色盤量 |
| for(int index = 0; index < count; ++index){ | |
| png->palette[index].red = PLTE->palette[index].red ; | 紅 |
| png->palette[index].green = PLTE->palette[index].green ; | 錄 |
| png->palette[index].blue = PLTE->palette[index].blue ; | 蓝 |
| png->palette[index].alpha = 0xff; } | 透明0x00~實體0xFF |
定義透明像素結构’tRNS’
| typedef struct PNG_tRNS_TYP{ | |
| int length; | 數據長度 |
| DWORD type; | 標記’tRNS’ |
| union { | |
| WORD grey; | 顏色類型 0 |
| struct {WORD Red,Green,Blue;}; | 顏色類型 2 |
| BYTE palette[256]; | 顏色類型 3 |
| DWORD CRC32; | CRC32校驗 |
| }PNG_tRNS,*PNG_tRNS_PTR; |
分析透明像素
| PNG_tRNS_PTR tRNS; | 透明像素 |
| tRNS->length = PNG_VALUE32(tRNS->length); | 數據長度 |
| if(IHDR->ColorType == 0 )
tRNS->grey = PNG_VALUE16(tRNS->grey); |
0:Greyscale:灰度圖像,1,2,4,8,16bit |
| if(IHDR->ColorType == 2 ) {
tRNS->Red = PNG_VALUE16(tRNS->Red); tRNS->Green = PNG_VALUE16(tRNS->Green); tRNS->Blue = PNG_VALUE16(tRNS->Blue); } |
2:Truecolour:真彩色圖像,8,16bit |
| if(IHDR->ColorType == 3) {
length = tRNS->length; for(int i = 0; i < length; ++i) { index = tRNS->palette[i]; png->palette[index].alpha = 0x00; } |
3:Indexed-colour:索引彩色圖像,1,2,4,8bit
透明0x00~實體0xFF |
定義背景色結构 ‘bKGD’
| typedef struct PNG_bKGD_TYP{ | |
| int length; | Data長度 |
| DWORD type; | 標記’bKGD’ |
| union { | |
| WORD Greyscale; | 顏色類型0 and 4灰度 |
| struct{WORD Red,Green,Blue;}; | 顏色類型2 and 6 -RGB三色 |
| BYTE Palette_Index;}; | 顏色類型3色盤索引 |
| DWORD CRC32; | CRC32校驗 |
| }PNG_bKGD,*PNG_bKGD_PTR; |
分析背景色’bKGD’
| int length = PNG_VALUE32(bKGD->length); | 長度 |
| if(IHDR->ColorType == 0 || IHDR->ColorType == 4)
bKGD->Greyscale = PNG_VALUE16(bKGD->Greyscale); |
灰度圖像 – 帶α通道資料灰度圖像 |
| if(IHDR->ColorType == 2 || IHDR->ColorType == 6) {
bKGD->Red = PNG_VALUE16(bKGD->Red); bKGD->Green = PNG_VALUE16(bKGD->Green); bKGD->Blue = PNG_VALUE16(bKGD->Blue); } |
真彩色圖像 – 帶α通道資料真彩色圖像 |
| if(IHDR->ColorType == 3)
bKGD->Palette_Index = bKGD->Palette_Index; |
索引彩色圖像 |
定義圖像數值結构 ‘IDAT’, 止數據塊可能有多個.
| typedef struct PNG_IDAT_TYP { | |
| int length; | Data長度 |
| DWORD type; | 標記’PLTE’ |
| BYTE data[1]; | 經壓縮圖像數據 |
| DWORD CRC32; | CRC32校驗 |
| } PNG_IDAT, *PNG_IDAT_PTR; |
每行像素多壹字節,記錄『Filter』濾波值,『0,1,2,3,4』伍種濾波;
| int length = PNG_VALUE32(IDAT->length); | 長度 |
| int size = png->buffer_size – png->length; | 剩余記憶體 |
| Uncompress_Data_gZip(png->buffer + png->length, &size,
IDAT->data,length, &png->stream); |
解压 |
| png->length = png->length + size; | 累積積數據長度 |
結束 IEND,檢測到’IEND’數據塊,己到文檔未端.
| typedef struct PNG_IEND_TAG{ | |
| int length; | Data長度0 |
| DWORD type; | 標記’IEND’ |
| DWORD CRC32; | CRC32校驗 |
| }PNG_IEND, *PNG_IEND_PTR; |
以顏色類型分別進行『反濾波』, 係每行像素首字節『濾波』值,有『0,1,2,3,4』伍款濾波, 以每粒像素單獨『復位』,帶α通道真彩色圖像8bit為例.
以cbax像素排列支缓伍款濾波
| c | b |
| a | x |
濾波算法
| filter濾波 | 濾波 | 復位 |
| 0= None | Filt(x) = Orig(x) | Recon(x) = Filt(x) |
| 1= Sub | Filt(x) = Orig(x) – Orig(a) | Recon(x) = Filt(x) + Recon(a) |
| 2= Up | Filt(x) = Orig(x) – Orig(b) | Recon(x) = Filt(x) + Recon(b) |
| 3= Average | Filt(x) = Orig(x) – floor((Orig(a) + Orig(b)) / 2) | Recon(x) = Filt(x) + floor((Recon(a) + Recon(b)) / 2) |
| 4= Paeth | Filt(x) = Orig(x) – PaethPredictor(Orig(a), Orig(b), Orig(c)) | Recon(x) = Filt(x) + PaethPredictor(Recon(a), Recon(b), Recon(c)) |
復位算法
| int byte_count = 4; | 每粒像素4字節 |
| int pixel_size = png->width * png->height; | 總像素量 |
| int buffer_size = png->width * png->height * byte_count; | 總字節量 |
| PBYTE buffer = (PBYTE)malloc(buffer_size); | 反濾波影像數據 |
| int col_size_recon = (png->width * 4) ; | 復位後每行字節量 |
| int col_size_filt = (png->width * 4) + 1; | 濾波後每行字節量 |
| for(int j = 0; j < png->height ; ++j) | 每行像素 |
| int filter = png->buffer[col_size_filt * j]; | 行首濾波=1 byte |
處理filter濾波0= None
| if(filter == 0) { | None |
| for(int i = 0; i < png->width; ++i){ | 逐像素復位 |
| Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
| Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
| Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
| Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
| buffer[(col_size_recon * j) + (i * 4) + 0] = Red; | 復位像素紅色 |
| buffer[(col_size_recon * j) + (i * 4) + 1] = Green; | 復位像素藍色 |
| buffer[(col_size_recon * j) + (i * 4) + 2] = Blue; | 復位像素綠色 |
| buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha; }} | 復位像素透明 |
處理filter濾波1 =Sub
| if(filter == 1) { | Sub |
| for(int i = 0; i < png->width; ++i){ | 逐像素復位 |
| Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
| Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
| Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
| Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
| aRed = aGreen = aBlue = aAlpha = 0; | 清零 |
| if(i > 0) { | |
| aRed = buffer[(col_size_recon * j) + ((i-1) * 4) + 0]; | a像素紅色 |
| aGreen = buffer[(col_size_recon * j) + ((i-1) * 4) + 1]; | a像素藍色 |
| aBlue = buffer[(col_size_recon * j) + ((i-1) * 4) + 2]; | a像素綠色 |
| aAlpha = buffer[(col_size_recon * j) + ((i-1) * 4) + 3]; } | a像素透明 |
| buffer[(col_size_recon * j) + (i * 4) + 0] = Red + aRed; | 復位像素紅色 |
| buffer[(col_size_recon * j) + (i * 4) + 1] = Green + aGreen; | 復位像素藍色 |
| buffer[(col_size_recon * j) + (i * 4) + 2] = Blue + aBlue; | 復位像素綠色 |
| buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha + aAlpha; }} | 復位像素透明 |
處理filter濾波2 =Up
| if(filter == 2){ | Up |
| for( i = 0; i < png->width; ++i){ | 逐像素復位 |
| Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
| Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
| Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
| Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
| bRed = bGreen = bBlue = bAlpha = 0; | 清零 |
| if(j > 0) { | |
| bRed = buffer[(col_size_recon * (j-1)) + (i * 4) + 0]; | b像素紅色 |
| bGreen = buffer[(col_size_recon * (j-1)) + (i * 4) + 1]; | b像素藍色 |
| bBlue = buffer[(col_size_recon * (j-1)) + (i * 4) + 2]; | b像素綠色 |
| bAlpha = buffer[(col_size_recon * (j-1)) + (i * 4) + 3];} | b像素透明 |
| buffer[(col_size_recon * j) + (i * 4) + 0] = Red + bRed; | 復位像素紅色 |
| buffer[(col_size_recon * j) + (i * 4) + 1] = Green + bGreen; | 復位像素藍色 |
| buffer[(col_size_recon * j) + (i * 4) + 2] = Blue + bBlue; | 復位像素綠色 |
| buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha + bAlpha; }} | 復位像素透明 |
處理filter濾波3 = Average
| if(filter == 3) { | Average |
| for( i = 0; i < png->width; ++i){ | 逐像素復位 |
| Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
| Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
| Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
| Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
| aRed = aGreen = aBlue = aAlpha = 0; | 清零 |
| bRed = bGreen = bBlue = bAlpha = 0; | 清零 |
| if(i > 0) { | |
| aRed = buffer[(col_size_recon * j) + ((i-1) * 4) + 0]; | a像素紅色 |
| aGreen = buffer[(col_size_recon * j) + ((i-1) * 4) + 1]; | a像素藍色 |
| aBlue = buffer[(col_size_recon * j) + ((i-1) * 4) + 2]; | a像素綠色 |
| aAlpha = buffer[(col_size_recon * j) + ((i-1) * 4) + 3]; } | a像素透明 |
| if(j > 0) { | |
| bRed = buffer[(col_size_recon * (j-1)) + (i * 4) + 0]; | b像素紅色 |
| bGreen = buffer[(col_size_recon * (j-1)) + (i * 4) + 1]; | b像素藍色 |
| bBlue = buffer[(col_size_recon * (j-1)) + (i * 4) + 2]; | b像素綠色 |
| bAlpha = buffer[(col_size_recon * (j-1)) + (i * 4) + 3];} | b像素透明 |
| buffer[(col_size_recon * j) + (i * 4) + 0] = Red + ((aRed+bRed)/2); | 復位像素紅色 |
| buffer[(col_size_recon * j) + (i * 4) + 1] = Green + ((aGreen+bGreen)/2); | 復位像素藍色 |
| buffer[(col_size_recon * j) + (i * 4) + 2] = Blue + ((aBlue+bBlue)/2); | 復位像素綠色 |
| buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha + ((aAlpha+bAlpha)/2); }} | 復位像素透明 |
Paeth預測函式
| BYTE PaethPredictor_PNG(BYTE a,BYTE b,BYTE c){ | 預測函式 |
| int p; | |
| int pa,pb,pc; | |
| p = a + b – c; | |
| pa = abs(p – a); | |
| pb = abs(p – b); | |
| pc = abs(p – c); | |
| if (pa <= pb && pa <= pc ) return a; | |
| else if (pb <= pc ) return b; | |
| else return c;} |
處理filter濾波4 =Paeth預測
| if(filter == 3) { | Average |
| for( i = 0; i < png->width; ++i){ | 逐像素復位 |
| Red = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 0]; | x像素紅色 |
| Green = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 1]; | x像素藍色 |
| Blue = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 2]; | x像素錄色 |
| Alpha = png->buffer[(col_size_filt * j) + 1 + (i * 4) + 3]; | x像素透明 |
| aRed = aGreen = aBlue = aAlpha = 0; | 清零 |
| bRed = bGreen = bBlue = bAlpha = 0; | 清零 |
| cRed = cGreen = cBlue = cAlpha = 0; | 清零 |
| if(i > 0) { | |
| aRed = buffer[(col_size_recon * j) + ((i-1) * 4) + 0]; | a像素紅色 |
| aGreen = buffer[(col_size_recon * j) + ((i-1) * 4) + 1]; | a像素藍色 |
| aBlue = buffer[(col_size_recon * j) + ((i-1) * 4) + 2]; | a像素綠色 |
| aAlpha = buffer[(col_size_recon * j) + ((i-1) * 4) + 3]; } | a像素透明 |
| if(j > 0) { | |
| bRed = buffer[(col_size_recon * (j-1)) + (i * 4) + 0]; | b像素紅色 |
| bGreen = buffer[(col_size_recon * (j-1)) + (i * 4) + 1]; | b像素藍色 |
| bBlue = buffer[(col_size_recon * (j-1)) + (i * 4) + 2]; | b像素綠色 |
| bAlpha = buffer[(col_size_recon * (j-1)) + (i * 4) + 3];} | b像素透明 |
| if(i > 0 && j > 0) { | |
| cRed = buffer[(col_size_recon * (j-1)) + ((i-1) * 4) + 0]; | c像素紅色 |
| cGreen = buffer[(col_size_recon * (j-1)) + ((i-1) * 4) + 1]; | c像素藍色 |
| cBlue = buffer[(col_size_recon * (j-1)) + ((i-1) * 4) + 2]; | c像素綠色 |
| cAlpha = buffer[(col_size_recon * (j-1)) + ((i-1) * 4) + 3];} | c像素透明 |
| buffer[(col_size_recon * j) + (i * 4) + 0] = Red + PaethPredictor_PNG(aRed,bRed,cRed); | 復位像素紅色 |
| buffer[(col_size_recon * j) + (i * 4) + 1] = Green + PaethPredictor_PNG(aGreen,bGreen,cGreen); | 復位像素藍色 |
| buffer[(col_size_recon * j) + (i * 4) + 2] = Blue + PaethPredictor_PNG(aBlue,bBlue,cBlue); | 復位像素綠色 |
| buffer[(col_size_recon * j) + (i * 4) + 3] = Alpha + PaethPredictor_PNG(aAlpha,bAlpha,cAlpha);}} | 復位像素透明 |
释放圖像
| free(png->buffer); | 释放 |
| png->buffer = buffer; | 替换復位圖像 |
| png->bitCount = 32; | rgba |
| png->buffer_size = buffer_size; |

『Adobe』同『Google』合作,制作『日月韓漢』矢量字庫,目前支缓65535『日月韓漢』字.以字量蒞睇依然有大量異體字未收納.
1. 官網下載『源界明朝』字庫,
2. 解壓
3. 將『SuperOTC\SourceHanSerif.ttc』复制到『C:\Windows\Fonts』
|
https://github.com/adobe-fonts/source-han-serif/archive/1.001R.zip |
|
https://typekit.com/fonts/source-han-sans-traditional-chinese |

随著『Android studio』更新版本,『Gradle』需升級.
| https://services.gradle.org/distributions/gradle-8.2.1-bin.zip |
| C:\Users\admin\.gradle\wrapper\dists\gradle-8.2.1-bin\5hap6b9n41hkg4jeh2au2pllh\gradle-8.2.1-bin.zip |
| Connection timed out: no further information. If you are behind an HTTP proxy, please configure the proxy settings either in IDE or Gradle. |

Android studio近日彈出gradle版本晤兼容.修改工程配置. 如果唔得重裝『Android Studio』.
| Android Studio版本 | Android Gradle Plugin Version插件版本 |
| Hedgehog | 2023.1.1 | 3.2~8.2 |
| Giraffe | 2022.3.1 | 3.2~8.1 |
| Flamingo | 2022.2.1 | 3.2~8.0 |
| Electric Eel | 2022.1.1 | 3.2~7.4 |
| Dolphin | 2021.3.1 | 3.2~7.3 |
| Android Gradle Plugin Version插件版本 | Gradle Version |
| 8.1 | 8.0 |
| 8.0 | 8.0 |
| 7.4 | 7.5 |
| 7.4 | 7.4 |
| 7.2 | 7.3.3 |
| 7.1 | 7.2 |
| 7.0 | 7.0 |
| 4.2.0+ | 6.7.1 |
| The project is using an incompatible version (AGP 8.1.0) of the Android Gradle plugin. Latest supported version is AGP 8.0.0 |


换『臺達FLEX-500W火牛』後,『X99i』唔識認『TOSHIBA XG3 1TB』同『Seagate XM1440 960Gb』仲試過藍屏死機.
睇蒞都係要買翻『益衡FLEX-600W』, 貴係貴D, 勝在稳定唔死機.

visual_studio_ZLIB
Visual Studio-ZLIB壓縮同解壓
『ZLIB』開源『壓縮』同『解壓』程式庫, 支持『DEFLATE』冇損壓縮演算法,佢混合『LZ77演算法』同『霍夫曼編碼』.
『DEFLATE』壓縮演算法冇專利權.畀人大量應用係『網絡』『圖檔』『文檔』『影片』.
| .PNG/ Libpng | 圖檔解壓 |
| .ZIP | 壓縮檔 |
| .tar | 壓縮檔 |
| .gz | 壓縮檔 |
| HTTP | 壓縮傅送 |
| FFmpeg | 影片解壓 |
下載『ZLIB』
| http://www.zlib.net/ |
| http://www.zlib.net/zlib-1.2.13.tar.gz |
『Android studio』內置『ZLIB』, 唔使下載.但要係『CMakeLists.txt』增添『zlib』庫.
| CMakeLists.txt文檔 | |
| find_library( z-lib z ) | 搜索zlib |
| target_link_libraries( ${z-lib} ) | 連接zlib |
包含『ZLIB』頭文檔
| #include <zlib.h> | Zlib-api |
| #include <zconf.h> |
『z_stream』壓縮同解壓皆需此結構體
| z_stream stream; | zlib流結構體 |
| stream.zalloc = Z_NULL; | NULL用默認記憶體分配函數 |
| stream.zfree = Z_NULL; | NULL用默認記憶體釋放函數 |
| stream.opaque = Z_NULL; | |
| stream.next_in = (Bytef*)sour; | 蒞源 |
| stream.avail_in = (uInt)sour_length; | 蒞源長 |
| stream.next_out = dest; | 輸出 |
| stream.avail_out = (uInt)*dest_length; | 輸出長 |
『ZLIB』壓縮分三步
| 壓縮 | |
| deflateInit(&stream, level) | 分配記憶體,level壓縮等級 |
| deflate(&stream, flush); | 壓縮數據, flush設0 |
| deflateEnd(&stream); | 釋放記憶體 |
| int deflateInit2( | deflateInit()加強版 |
| z_streamp strm, | zlib流結構體 |
| int level, | level壓縮等級0~9.
0:速度快,唔壓縮. 9:速度慢,壓縮率高. |
| int method, | 壓縮演算法僅支緩Z_DEFLATED |
| int windowBits, | 處理RAW DEFLATE手法. |
| int memLevel, | 指定記憶體分配MAX_MEM_LEVEL |
| int strategy)); | 壓縮策略,僅影響壓縮比.默認Z_DEFAULT_STRATEGY |
| level | 壓縮等級 |
| #define Z_NO_COMPRESSION 0 | 唔壓縮 |
| #define Z_BEST_SPEED 1 | 高速,低壓縮率 |
| #define Z_BEST_COMPRESSION 9 | 高壓縮率, 慢速 |
| #define Z_DEFAULT_COMPRESSION (-1) | 默認壓縮 |
| windowBits | 處理RAW DEFLATE手法. |
| 8~15: | 純deflate壓縮 |
| -8~-15: | zlib頭 + deflate + zlib尾 |
| > 16: | Gzip頭+ deflate + Gzip尾 |
| method | 壓縮演算法 |
| #define Z_DEFLATED 8 | DEFLATE冇損壓縮 |
| memLevel | 記憶體分配 |
| MemLevel=1 | 最小記憶體,速度慢壓縮比低 |
| MemLevel=9
#define MAX_MEM_LEVEL 9 |
最大記憶體,最佳速度 |
| MemLevel=8 | 默認值 |
| strategy | 壓縮演算法設定 |
| #define Z_FILTERED 1 | 僅FILTERED生成數據 |
| #define Z_HUFFMAN_ONLY 2 | 僅霍夫曼編碼 |
| #define Z_RLE 3 | 匹配長度=1 |
| #define Z_FIXED 4 | 禁霍夫曼編碼 |
| #define Z_DEFAULT_STRATEGY 0 | 默認壓縮設定 |
| int deflate(z_stream *strm, int flush); | 壓縮/解壓 |
| strm: | z_stream 結構 |
| flush: | 操作標誌 |
| 返回值 |
| flush | 操作標誌 |
| Z_NO_FLUSH: | 標准壓縮操作 |
| Z_SYNC_FLUSH: | 同步刷新操作 |
| Z_FULL_FLUSH: | 完全刷新操作 |
| Z_FINISH: | 結束操作, 壓縮完成後返回 |
| deflate()返回值 | |
| Z_OK: | 壓縮操作成功 |
| Z_STREAM_END: | 輸入資料釋數壓縮, 壓縮器處於結束狀態 |
| Z_BUF_ERROR: | 緩衝吾够 |
| Z_STREAM_ERROR: | 內部錯誤 |
『ZLIB』解壓分三步
| 解壓 | |
| inflateInit(&stream) | 分配記憶體 |
| inflate(&stream, Z_NO_FLUSH); | 解壓數據 |
| inflateEnd(stream); | 釋放記憶體 |
| 返回碼 | |
| #define Z_OK 0 | 壓縮操作成功 |
| #define Z_STREAM_END 1 | 輸入資料已經被完全壓縮,並且壓縮器處於結束狀態。 |
| #define Z_NEED_DICT 2 | 愛密碼 |
| #define Z_ERRNO (-1) | |
| #define Z_STREAM_ERROR (-2) | |
| #define Z_DATA_ERROR (-3) | 加密數據損壞壞,或缺失. |
| #define Z_MEM_ERROR (-4) | 唔夠記憶體 |
| #define Z_BUF_ERROR (-5) | 唔夠緩存 |
| #define Z_VERSION_ERROR (-6) |
解壓示例
int Uncompress_Data_gZip(PBYTE dest,int * dest_length,PBYTE sour,int sour_length)
{
z_stream stream;
int ret;
stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0;
stream.opaque = (voidpf)0;
stream.next_in = (Bytef*)sour;
stream.avail_in = (uInt)sour_length;
stream.next_out = dest;
stream.avail_out = (uInt)*dest_length;
MAX_MEM_LEVEL
ret = inflateInit2(&stream, 16+MAX_WBITS);
if (ret != Z_OK)
return ret;
ret = inflate(&stream, Z_NO_FLUSH);// 解壓
*dest_length = stream.total_out;
inflateEnd(&stream);
return ret;
}
壓縮示例
bool Compress_Data_gZip(PBYTE dest,int * dest_length,PBYTE sour,int sour_length, int level)
{
int ret;
int flush;
//int sour_offset,dest_offset;
//int have;
z_stream stream;
//BYTE in[ZIP_CHUNK];
//BYTE out[ZIP_CHUNK];
stream.zalloc = Z_NULL;// 記憶體分配函數
stream.zfree = Z_NULL;// 記憶體釋放函數
stream.opaque = Z_NULL;
stream.next_in = (Bytef*)sour; // 輸入
stream.avail_in = (uInt)sour_length;
stream.next_out = dest;//輸出
stream.avail_out = (uInt)*dest_length;
ret = deflateInit(&stream, level);// 内存分配
if (ret != Z_OK)
return false;
flush = Z_FINISH;
//flush = Z_NO_FLUSH;// 允許壓縮演算法決定累積多少資料再產生輸出,以達到壓縮效率最高.
while (ret == Z_OK) {
ret = deflate(&stream, flush); // 進行壓縮
if (ret == Z_STREAM_END)
break;
else
if (ret == Z_BUF_ERROR)//緩衝吾够
break;
else
if (ret == Z_STREAM_ERROR)// 內部錯誤
break;
}
*dest_length = stream.total_out;
deflateEnd(&stream);// 釋放記憶體
return Z_OK;
}




『Gigabyte-X570 AORUS MASTER』成日間歇藍屏重啟.耳聞『EVGA 1000 G2』火牛質量嘛嘛,唯有試换火牛,睇中古台達『火牛GM1300』.冚模块設計.
買翻蒞壹直冇装機.

『CRC32』同『MD5』『SHA1』壹樣,計『貳进制』數值『指紋』,佢速度快,HASH校验值肆字節.两DWORD值相等比較. 适宜網络數據傳輸, 校驗數據係咪完璧.
DWORD CRC32_Table[256] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};
DWORD CRC32(PBYTE buf, int len){
int i;
DWORD crc;
crc = 0xffffffffL;
for (i = 0; i < len; ++i )
crc = CRC32_Table[(crc ^ buf[i]) & 0xff] ^ (crc >> 8);
crc = crc ^ 0xffffffffL;
return crc;
}




『TOSHIBA XG3 1TB』冇拉拉唔識認,後蒞『Seagate XM1440 960Gb』都唔識認.睇蒞係中古『臺達FLEX-500』造工嘛嘛.
上次買『Seagate XM1440 960Gb』係22110規格.『x99-itx』係2280規格且係主板背面.
『M.2槽2280轉22110』.卡高啱啱好利用機箱托板散热,『XM1440』維持係50℃,基本冇跌速.


『Android studio』內置架餐『Image Asset』. 畀幅圖檔佢,『Image Asset』帮你自動生成各式圖檔.
揀『Launcher Icons(Legacy only)』冚辦闌圖檔背景透明.
『Android 8.0』及以上,程式圖檔强制背景色,揀『Launcher Icons(Adaptive and Legacy)』.
| Android 8.0及以上 | 圖檔背景白色 | Launcher Icons(Adaptive and Legacy) |
| Android 7.1及以下 | 圖檔背景透明 | Launcher Icons(Legacy only) |
| Configure Image Asset | Android 8.0(API 26) 及以上 |
| Icon type | Launcher Icons(Adaptive and Legacy) |
| Name | ic_launcher |
| Layer name | ic_launcher_foreground |
| Asset type | Image |
| path | 『.png』背景透明圖檔 |
| Trim | 修剪勾yes |
| Resize | 100% |
| Asset type | 勾Color |
| Color | 0xFFFFFF |
| Configure Image Asset | Android 7.1以下 |
| Icon type | Launcher Icons(Legacy only) |
| Name | ic_launcher |
| Asset type | 勾Image |
| Path | 『.png』背景透明圖檔 |
| Trim | 修剪勾yes |
| Padding | 0% |
| Background | 背景0xFFFFFF |
| Scaling | Crop/ Shrink to fit自适应宽度 |
| Shape | 揀None |
| Effect | 勾None |
| 資料夾 | Size(px) |
| mipmap-xxxhdpi | 192*192 |
| mipmap-xxhdpi | 144*144 |
| mipmap-xhdpi | 96*96 |
| mipmap-hdpi | 72*72 |
| mipmap-mdpi | 48*48 |

Android Studio係右下角彈出警示,『Cannot load settings from file』冇法載入『misc.xml』,事實係文檔損毁.內容大致如下.粘貼後諸存.
| 『misc.xml』文檔 |
| <?xml version=”1.0″ encoding=”UTF-8″?>
<project version=”4″> <component name=”ProjectRootManager” version=”2″ languageLevel=”JDK_17″ default=”true” project-jdk-name=”Android Studio default JDK” project-jdk-type=”JavaSDK”> <output url=”file://$PROJECT_DIR$/build/classes” /> </component> <component name=”ProjectType”> <option name=”id” value=”Android” /> </component> </project> |
| Load settings |
| Cannot load settings from file |
| “D:\ANDROID\GeomanticCompass\.idea\misc.xml”;illegal character(NULL,Unicode 0) encountered: not valid in any content at[row,col{unknown-source}]:[1,2] Please correct the file content |

年號愛蒞紀年,『天皇更替』『天災人禍』之時更改年號.
| 飛鳥時代-年號/元號 | 儒略曆 | 天皇 |
| 大化 | 645年6月 | 孝德天皇 |
| 白雉 | 650年2月 | |
| 朱鳥 | 686年7月 | 天武天皇 |
| 大寶 | 701年3月 | 文武天皇 |
| 慶雲 | 704年5月 | |
| 和銅 | 708年正月 | 元明天皇 |
| 奈良時代-年號 | 儒略曆 | |
| 靈龜 | 715年九月 | 元正天皇 |
| 養老 | 717年十一月 | |
| 神龜 | 724年二月 | 聖武天皇 |
| 天平 | 729年八月 | |
| 天平感寶 | 749年四月 | |
| 天平勝寶 | 749年七月 | 孝謙天皇 |
| 天平寶字 | 757年八月 | |
| 天平神護 | 765年正月 | 稱德天皇 |
| 神護景雲 | 767年八月 | |
| 寶龜 | 770年十月 | 光仁天皇 |
| 天應 | 781年四月 | |
| 延曆 | 782年八月 | 桓武天皇 |
| 平安時代-年號 | 儒略曆 | 天皇 |
| 大同 | 806年五月 | 平城天皇 |
| 弘仁 | 810年九月 | 嵯峨天皇 |
| 天長 | 824年正月 | 淳和天皇 |
| 承和 | 834年正月 | 仁明天皇 |
| 嘉祥 | 848年六月 | |
| 仁壽 | 851年四月 | 文德天皇 |
| 齊衡 | 854年十一月 | |
| 天安 | 857年二月 | |
| 貞觀 | 859年四月 | 清和天皇 |
| 元慶 | 877年四月 | 陽成天皇 |
| 仁和 | 885年二月 | 光孝天皇 |
| 寬平 | 889年四月 | 宇多天皇 |
| 昌泰 | 898年四月 | 醍醐天皇 |
| 延喜 | 901年七月 | |
| 延長 | 923年閏四月 | |
| 承平 | 931年四月 | 朱雀天皇 |
| 天慶 | 938年五月 | |
| 天曆 | 947年四月 | 村上天皇 |
| 天德 | 957年十月 | |
| 應和 | 961年二月 | |
| 康保 | 964年七月 | |
| 安和 | 968年八月 | 冷泉天皇 |
| 天祿 | 970年三月 | 圓融天皇 |
| 天延 | 973年十二月 | |
| 貞元 | 976年七月 | |
| 天元 | 978年十一月 | |
| 永觀 | 983年四月 | |
| 寬和 | 985年四月 | 花山天皇 |
| 永延 | 987年四月 | 一條天皇 |
| 永祚 | 989年八月 | |
| 正曆 | 990年十一月 | |
| 長德 | 995年二月 | |
| 長保 | 999年正月 | |
| 寬弘 | 1004年七月 | |
| 長和 | 1012年十二月 | 三條天皇 |
| 寬仁 | 1017年四月 | 後一條天皇 |
| 治安 | 1021年二月 | |
| 萬壽 | 1024年七月 | |
| 長元 | 1028年七月 | |
| 長曆 | 1037年四月 | 後朱雀天皇 |
| 長久 | 1040年十一月 | |
| 寬德 | 1044年十一月 | |
| 永承 | 1046年四月 | 後冷泉天皇 |
| 天喜 | 1053年正月 | |
| 康平 | 1058年八月 | |
| 治曆 | 1065年八月 | |
| 延久 | 1069年四月 | 後三條天皇 |
| 承保 | 1074年八月 | 白河天皇 |
| 承曆 | 1077年十一月 | |
| 永保 | 1081年二月 | |
| 應德 | 1084年二月 | |
| 寬治 | 1087年四月 | 堀河天皇 |
| 嘉保 | 1094年十二月 | |
| 永長 | 1096年十二月 | |
| 承德 | 1097年十一月 | |
| 康和 | 1099年八月 | |
| 長治 | 1104年二月 | |
| 嘉承 | 1106年四月 | |
| 天仁 | 1108年八月 | 鳥羽天皇 |
| 天永 | 1110年七月 | |
| 永久 | 1113年七月 | |
| 元永 | 1118年四月 | |
| 保安 | 1120年四月 | |
| 天治 | 1124年四月 | 崇德天皇 |
| 大治 | 1126年正月 | |
| 天承 | 1131年正月 | |
| 長承 | 1132年八月 | |
| 保延 | 1135年四月 | |
| 永治 | 1141年七月 | |
| 康治 | 1142年四月 | 近衛天皇 |
| 天養 | 1144年二月 | |
| 久安 | 1145年七月 | |
| 仁平 | 1151年正月 | |
| 久壽 | 1154年十月 | |
| 保元 | 1156年四月 | 後白河天皇 |
| 平治 | 1159年四月 | 二條天皇 |
| 永曆 | 1160年正月 | |
| 應保 | 1161年九月 | |
| 長寬 | 1163年三月 | |
| 永萬 | 1165年六月 | |
| 仁安 | 1166年八月 | 六條天皇 |
| 嘉應 | 1169年四月 | 高倉天皇 |
| 承安 | 1171年四月 | |
| 安元 | 1175年七月 | |
| 治承 | 1177年八月 | |
| 養和 | 1181年七月 | 安德天皇 |
| 壽永 | 1182年五月 | |
| 元曆 | 1184年四月 | 後鳥羽天皇 |
| 鎌倉時代-年號 | 儒略曆 | 天皇 |
| 文治 | 1185年八月 | 後鳥羽天皇 |
| 建久 | 1190年四月 | |
| 正治 | 1199年四月 | 土御門天皇 |
| 建仁 | 1201年二月 | |
| 元久 | 1204年二月 | |
| 建永 | 1206年四月 | |
| 承元 | 1207年十月 | |
| 建曆 | 1211年三月 | 順德天皇 |
| 建保 | 1213年十二月 | |
| 承久 | 1219年四月 | |
| 貞應 | 1222年四月 | 後堀河天皇 |
| 元仁 | 1224年十一月 | |
| 嘉祿 | 1225年四月 | |
| 安貞 | 1227年十二月 | |
| 寬喜 | 1229年三月 | |
| 貞永 | 1232年四月 | |
| 天福 | 1233年四月 | 四條天皇 |
| 文曆 | 1234年十一月 | |
| 嘉禎 | 1235年九月 | |
| 曆仁 | 1238年十一月 | |
| 延應 | 1239年二月 | |
| 仁治 | 1240年七月 | |
| 寬元 | 1243年二月 | 後嵯峨天皇 |
| 寶治 | 1247年二月 | 後深草天皇 |
| 建長 | 1249年三月 | |
| 康元 | 1256年十月 | |
| 正嘉 | 1257年三月 | |
| 正元 | 1259年三月 | |
| 文應 | 1260年四月 | 龜山天皇 |
| 弘長 | 1261年二月 | |
| 文永 | 1264年二月 | |
| 建治 | 1275年四月 | 後宇多天皇 |
| 弘安 | 1278年二月 | |
| 正應 | 1288年四月 | 伏見天皇 |
| 永仁 | 1293年八月 | |
| 正安 | 1299年四月 | 後伏見天皇 |
| 乾元 | 1302年十一月 | 後二條天皇 |
| 嘉元 | 1303年八月 | |
| 德治 | 1306年十二月 | |
| 延慶 | 1308年十月 | 花園天皇 |
| 應長 | 1311年四月 | |
| 正和 | 1312年三月 | |
| 文保 | 1317年二月 | |
| 元應 | 1319年四月 | 後醍醐天皇 |
| 元亨 | 1321年二月 | |
| 正中 | 1324年十二月 | |
| 嘉曆 | 1326年四月 | |
| 元德 | 1329年八月 | |
| 元弘 | 1331年八月 |
| 室町時代-建武新政年號 | 儒略曆 | 天皇 |
| 建武 | 1334年正月 | 後醍醐天皇 |
| 室町時代-南朝年號 | 儒略曆 | 天皇 |
| 延元 | 1336年二月 | 後醍醐天皇 |
| 興國 | 1340年四月 | 後村上天皇 |
| 正平 | 1346年四月 | |
| 建德 | 1370年十二月 | 長慶天皇 |
| 文中 | 1372年三月 | |
| 天授 | 1375年五月 | |
| 弘和 | 1381年二月 | |
| 元中 | 1384年四月 | 後龜山天皇 |
| 室町時代-北朝年號 | 儒略曆 | 天皇 |
| 建武 | 1336年二月 | 光明天皇 |
| 曆應 | 1338年八月 | |
| 康永 | 1342年四月 | |
| 貞和 | 1345年十月 | |
| 觀應 | 1350年二月 | 崇光天皇 |
| 文和 | 1352年九月 | 後光嚴天皇 |
| 延文 | 1356年三月 | |
| 康安 | 1361年三月 | |
| 貞治 | 1362年九月 | |
| 應安 | 1368年二月 | |
| 永和 | 1375年二月 | 後圓融天皇 |
| 康曆 | 1379年三月 | |
| 永德 | 1381年二月 | |
| 至德 | 1384年二月 | 後小松天皇 |
| 嘉慶 | 1387年八月 | |
| 康應 | 1389年二月 | |
| 明德 | 1390年三月 |
| 室町時代-明德統一年號 | 儒略曆 | 天皇 |
| 應永 | 1394年七月 | 後小松天皇 |
| 正長 | 1428年四月 | 稱光天皇 |
| 永享 | 1429年九月 | 後花園天皇 |
| 嘉吉 | 1441年二月 | |
| 文安 | 1444年二月 | |
| 寶德 | 1449年七月 | |
| 享德 | 1452年七月 | |
| 康正 | 1455年七月 | |
| 長祿 | 1457年九月 | |
| 寬正 | 1460年十二月 | |
| 文正 | 1466年二月 | 後土御門天皇 |
| 應仁 | 1467年三月 | |
| 文明 | 1469年四月 | |
| 長享 | 1487年七月 | |
| 延德 | 1489年八月 | |
| 明應 | 1492年七月 | |
| 文龜 | 1501年二月 | 後柏原天皇 |
| 永正 | 1504年二月 | |
| 大永 | 1521年八月 | |
| 享祿 | 1528年八月 | 後奈良天皇 |
| 天文 | 1532年七月 | |
| 弘治 | 1555年十月 | |
| 永祿 | 1558年二月 | 正親町天皇 |
| 安土桃山時代-年號 | 儒略曆 | 天皇 |
| 元龜 | 1570年四月 | 正親町天皇 |
| 天正 | 1573年七月 | |
| 文祿 | 1592年十二月 | 後陽成天皇 |
| 慶長 | 1596年十月 |
| 江戶時代-年號 | 儒略曆 | 天皇 |
| 元和 | 1615年七月 | 後水尾天皇 |
| 寬永 | 1624年二月 | |
| 正保 | 1644年十二月 | 後光明天皇 |
| 慶安 | 1648年二月 | |
| 承應 | 1652年九月 | |
| 明曆 | 1655年四月 | 後西天皇 |
| 萬治 | 1658年七月 | |
| 寬文 | 1661年四月 | |
| 延寶 | 1673年九月 | 靈元天皇 |
| 天和 | 1681年九月 | |
| 貞享 | 1684年二月 | |
| 元祿 | 1688年九月 | 東山天皇 |
| 寶永 | 1704年三月 | |
| 正德 | 1711年四月 | 中御門天皇 |
| 享保 | 1716年六月 | |
| 元文 | 1736年四月 | 櫻町天皇 |
| 寬保 | 1741年二月 | |
| 延享 | 1744年二月 | |
| 寬延 | 1748年七月 | 桃園天皇 |
| 寶曆 | 1751年十月 | |
| 明和 | 1764年六月 | 後櫻町天皇 |
| 安永 | 1772年十一月 | 後桃園天皇 |
| 天明 | 1781年四月 | 光格天皇 |
| 寬政 | 1789年正月 | |
| 享和 | 1801年二月 | |
| 文化 | 1804年二月 | |
| 文政 | 1818年四月 | 仁孝天皇 |
| 天保 | 1830年十二月 | |
| 弘化 | 1844年十二月 | |
| 嘉永 | 1848年二月 | 孝明天皇 |
| 安政 | 1854年十一月 | |
| 萬延 | 1860年三月 | |
| 文久 | 1861年二月 | |
| 元治 | 1864年二月 | |
| 慶應 | 1865年四月 |
| 一世一元-年號 | 儒略曆 | 天皇 |
| 明治 | 1868年舊曆9月 | 明治天皇 |
| 大正 | 1912年7月 | 大正天皇 |
| 昭和 | 1926年12月 | 昭和天皇 |
| 平成 | 1989年1月 | 明仁天皇 |
| 令和 | 2019年5月 | 德仁天皇 |
禮拜行星
| 禮拜 | 行星 | 希臘神祇 |
| 禮拜日SUNDAY | 日曜日 | 太陽神 |
| 禮拜壹MONDAY | 月曜日 | 月光女神 |
| 禮拜貳TUESDAY | 火曜日 | 戰神 |
| 禮拜三WEDNESDAY | 水曜日 | 神使 |
| 禮拜肆THURSDAY | 木曜日 | 天神 |
| 禮拜伍FRIDAY | 金曜日 | 愛神 |
| 禮拜陸SATURDAY | 土曜日 | 農神 |

『月曆』即係『崇禎曆書』. 将『陰曆』同『陽曆』同步. 『崇禎曆書』 由 『湯若望』『龍華民』『羅雅谷』『鄧玉函』編纂.
| 10天干 | 甲乙丙丁戊己庚辛壬癸 |
| 12地支 | 子丑寅卯辰巳午未申酉戌亥 |
| 60干支 | 甲子,乙丑,丙寅,丁卯,戊辰,己巳,庚午,辛未,壬申,癸酉,
甲戌,乙亥,丙子,丁丑,戊寅,己卯,庚辰,辛巳,壬午,癸未, 甲申,乙酉,丙戌,丁亥,戊子,己丑,庚寅,辛卯,壬辰,癸巳, 甲午,乙未,丙申,丁酉,戊戌,己亥,庚子,辛丑,壬寅,癸卯, 甲辰,乙巳,丙午,丁未,戊申,己酉,庚戌,辛亥,壬子,癸丑, 甲寅,乙卯,丙辰,丁己,戊午,己未,庚申,辛酉,壬戌,癸亥 |
| 12地支 | 月 |
| 子月 | 正月 |
| 丑月 | 貳月 |
| 寅月 | 叁月 |
| 卯月 | 肆月 |
| 辰月 | 伍月 |
| 巳月 | 陸月 |
| 午月 | 柒月 |
| 未月 | 捌月 |
| 申月 | 玖月 |
| 酉月 | 拾月” |
| 戌月 | 冬月 |
| 亥月 | 臘月 |
| 12地支 | 時鐘 |
| 子時 | 23:00~00:59 |
| 丑時 | 01:00~02:59 |
| 寅時 | 03:00~04:59 |
| 卯時 | 05:00~06:59 |
| 辰時 | 07:00~08:59 |
| 巳時 | 09:00~10:59 |
| 午時 | 11:00~12:59 |
| 未時 | 13:00~14:59 |
| 申時 | 15:00~16:59 |
| 酉時 | 17:00~18:59 |
| 戌時 | 19:00~20:59 |
| 亥時 | 21:00~22:59 |
| 月份 | 二十四節氣 | 角度 |
| 1月上旬 | 小寒 | 315℃ |
| 1月下旬 | 大寒 | 330℃ |
| 2月上旬 | 立春 | 345℃ |
| 2月下旬 | 雨水 | 0℃ |
| 3月上旬 | 惊蛰 | 15℃ |
| 3月下旬 | 春分 | 30℃ |
| 4月上旬 | 清明 | 45℃ |
| 4月下旬 | 谷雨 | 60℃ |
| 5月上旬 | 立夏 | 75℃ |
| 5月下旬 | 小满 | 90℃ |
| 6月上旬 | 芒种 | 105℃ |
| 6月下旬 | 夏至 | 120℃ |
| 7月上旬 | 小暑 | 135℃ |
| 7月下旬 | 大暑 | 150℃ |
| 8月上旬 | 立秋 | 165℃ |
| 8月下旬 | 处暑 | 180℃ |
| 9月上旬 | 白露 | 195℃ |
| 9月下旬 | 秋分 | 210℃ |
| 10月上旬 | 寒露 | 225℃ |
| 10月下旬 | 霜降 | 240℃ |
| 11月上旬 | 立冬 | 255℃ |
| 11月下旬 | 小雪 | 270℃ |
| 12月上旬 | 大雪 | 285℃ |
| 12月下旬 | 冬至 | 300℃ |
| 地支 | 子 | 丑 | 寅 | 卯 | 辰 | 巳 | 午 | 未 | 申 | 酉 | 戌 | 亥 |
| 生肖 | 鼠 | 牛 | 虎 | 兎 | 竜 | 蛇 | 馬 | 羊 | 猿 | 雞 | 犬 | 豚 |

『儒略曆』由『羅馬』皇帝,贒明『儒略凱撒』頒發,同後蒞修正『格里曆』加入400年壹『閏』. 佢以『年』『月』『日』『時』『分』『秒』『禮拜』定義曆法.
| 壹年 | 2月 | |
| 常年 | 365日 | 28日 |
| 閏年 | 366日 | 29日 |
| 規則壹:年份係 4 倍數則係『閏年』 |
| 規則貳:年份係 100倍數,規則壹冇效,依然係『常年』 |
| 規則叁:年份係 400倍數,規則貳冇效,係『閏年』. |
| 月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 日數 | 31 | 28 | 31 | 30 | 31 | 30 | 31 | 31 | 30 | 31 | 30 | 31 |
| 元年正月 | 1號 | 2號 | 3號 | 4號 | 5號 | 6號 | 7號 |
| 禮拜 | 禮拜壹 | 禮拜貳 | 禮拜参 | 禮拜肆 | 禮拜伍 | 禮拜陸 | 禮拜日 |










臺『SAMSUNG E2220W』22寸16比10,2012年2月出厰,玩左拾幾年,咁『』玩, 點知白撞兩贊壞人,右下角出現黑斑.
諗住買『DELL U3025E』30寸16比10貴得滯.『DELL P2423』22寸16比10特價.冇內置喇叭,冇『HDMI/DisplayPort』音頻輸出口,要插DELL-USB音箱. IPS屏『画面鮮豔』比『SAMSUNG E2220W』清𥇦.
『NVIDIA Quadro K1200』得肆『DisplayPort』口. 買『miniDisplayPort轉DisplayPort線』線徑4.5mm.两頭冇磁環, 5mm卡扣磁環窿扣唔實.改為7mm卡扣磁環. 用『NVIDIA控制面板』,解析度『1920*1200』自訂頻率『75Hz』.
| 1. 『NVIDIA控制面板』
2. 撳『顯示』->『變更解析度』 3. 撳『自訂』 4. 撳『建立自訂解析度』 |





之前臺『Gigabyte-X570 AORUS MASTER』壹直未能投入使用, 决定啟用『x99 ITX-server』配『INTEL XEON E5-1630V4』. 『MSI GT710-1GB』連玩PHOTOSHOP都慢
『NVIDIA Quadro K1200』4GB顯存,配肆個『mini-display』, 配轉HDMI儀.用『GPU-Z』測比『RX550』慢.



『XEON E5-2630LV3』最高功耗140瓦,『QUADRO K6000』最高功耗45瓦,未計WIFI同磁盤,接近200瓦功耗.『mineNAS-ITX機箱』送『同漢250瓦火牛』,冇主板8pin線,要靠4pin轉8pin線,長期高功率輸出,火牛頂唔順.
『益衡FLEX-600瓦』太貴,買『臺達FLEX-500瓦』係其肆份壹.原配主板8pin線,同PCIE-8PIN線.
换火牛後著機唔識認『TOSHIBA XG3 1TB』同『Seagate XM1440 960Gb』,試過藍屏死機.反而『同漢250瓦火牛』係未試過藍屏死機.



自WindowsNT以蒞,Windows冇好似Win9x咁頻繁重装,但係Window11可能新出,自動更新後問題多多, 重装『Window11』 『android studio』浪費大量時間.
Windows11可備份『系統映像』,還原Windows11,好似用GHOST咁.備『磁碟機』比『C:』所用容量大.

Windows11自更新後『剪取工具』神左,『全屏』得, 『視窗』冇返應.發現可將Windows10『剪取工具』移植過蒞Windows11.
首先复制Win10『SnippingTool.exe』『SnippingTool.exe.mui』, 位置如下: 『zh-TW』係默認語言.
| C:\Windows\System32\SnippingTool.exe |
| C:\Windows\System32\zh-TW\SnippingTool.exe.mui |
係Win11粘貼同壹位置
| C:\Windows\System32\SnippingTool.exe |
| C:\Windows\System32\zh-TW\SnippingTool.exe.mui |
再釘選『工作列』『開始』






冇啦啦换『Gigabyte-X570 AORUS MASTER』换左硬碟.唔著機『DEBUG』燈『00』.壹係CPU,唔係就火牛.
拆『AVC大霜塔』連CPU掹埋出蒞.重新插反粒U著機.睇蒞係『SOCKET AM4』夹唔死粒CPU.硅脂固化後『大霜塔』自重令CPU鬆脫.
『AM4防脫定位支架』壓死粒U, 即使硅脂黐死『大霜塔』都唔會連根撥起.兼容『AVC大霜塔』.







MLC時代過去,TLC粒, 三年保養, 每日全盤寫入壹次.『SAMSUNG-990 PRO 2TB』特價,標稱謮寫均超柒千兆.驚高熱而跌速,主板自帶散熱装甲熱過辣雞.特登買風扇散熱,高温達『50℃』,實測『讀6584MB』『寫6301MB』.
| SSD | 讀 | 寫 |
| 990 PRO 2TB | 6584 MB/S | 6301 MB/S |
你必須登入才能發表留言。