pretty code
2021年12月30日 星期四
Dropbox on Kobo
2021年12月29日 星期三
最有才的解 DRM 方式
2021年12月27日 星期一
《64》真是本神奇的書
2021年12月25日 星期六
慶祝耶誕節
2021年12月23日 星期四
ARP 廣播封包苦主
更換 LED 崁燈注意事項
2021年12月22日 星期三
x86 assembly in Linux - part 7
"Programming from the Ground Up" 第三章有一節 "Addressing Modes" (P.41),會描述各種定址方式的寫法,久沒寫組語,想要重頭溫習一定要來看這一節。
另外,就是 stack (第四章) 的傳遞,久沒碰真的會忘記,當然 x64 函數參數還會用到暫存器 (以 Windows 來說是前 4 個參數),剩下的才用 stack。
總之,記錄一下避免下次還要重頭回想。
2021年12月16日 星期四
常用 Wireshark filter 寫法
2021年12月14日 星期二
UEFI Network 相關 code 位置
2021年12月2日 星期四
電子閱讀器盤點篇
2021年11月17日 星期三
糟糕的電子書格式範例
先說明我不懂 CSS,但我總覺得一次用兩個以上的類似屬性不知有啥意義?
原本我為了解決從 R 家或 K 家購買的電子書無法在 Kindle Paperwrhite 3 指定字型的問題,每當我的小程式在轉檔時,一律會強制移除 font-family 的屬性,這幾乎可以解決六成以上的問題。
後來又發現有些書除了用 font-family 外,同時也會用 font 屬性且字型名稱會使用單引號或雙引號包住,故我也把處理這種 CSS 的步驟加到我的轉檔程式中。
近日又發現有些書會使用上面的 font CSS,但是其字型名稱卻不使用任何單引號或雙引號包住?有沒有搞錯,一個 CSS 各自表態,真是服了這些工程師!
趁著今天放假的下午,邊吹頭髮邊把這段處理步驟加上,目前我只知道大部份遇到的 case 都只使用 sans-serif 或是 serif 這兩種字型而已。
暫時就先這樣處理吧,反正遇到例外再加到字型陣列變數即可。
2021年11月14日 星期日
Kobo Elipsa 三大小幫手
2021年11月1日 星期一
Linux 下開啟檔案數量限制的相關指令及設定檔
2021年10月30日 星期六
車子燈泡規格
2021年10月25日 星期一
蝴蝶效應
2021年10月13日 星期三
Ubuntu LTS 版本
2021年10月1日 星期五
2021年9月20日 星期一
OneLineEPUB
2021年9月10日 星期五
Named Capture Group in Golang
2021年9月8日 星期三
使用 NFC 手機讀取悠遊卡內碼及電子發票驗證碼
2021年9月2日 星期四
凍結的 Windows 10 console 視窗
2021年8月27日 星期五
Can't find a default Python
2021年8月26日 星期四
Golang os/exec command
2021年8月25日 星期三
PostgreSQL 使用的一些心得
2021年8月20日 星期五
Add new mount point on Linux for growth size of database
2021年8月2日 星期一
煮湯時視線千萬不要離開鍋子
Lenovo ThinkPad KU-1255 外接鍵盤滑鼠中間鍵滾動失效
自從 6 月多配合電動升降桌買了這個鍵盤後,其中間鍵滾動視窗功能完全跟我熟悉的不太一樣,重點是時好時壞,原本以為是選項的緣故,在勾選了 ThinkPad 首選滾動後,中間鍵功能恢復成以前習慣的方式,不料過了一陣子後,還是會不定時失效。
2021年8月1日 星期日
FF3 2D 像素重置版
2021年7月30日 星期五
殘念的螢幕 VESA 組合架
雖然我的 28 吋螢幕已經夠高了,再加上還放在桌上型螢幕架上,理論上螢幕高度應該是可以的,但自從 6/2 我的電動升降桌到貨後 WFH 到現在,多少還是覺得差了一點,故開始考慮要買個螢幕伸縮支架。
可惜的是我的螢幕沒有 VESA 接口,好不容易看到有另外裝在螢幕上的 VESA 組合架,買來之後我才想到,我的 HDMI 接口是垂直的接上螢幕,裝了這個 VESA 組合架後,我就沒辦法再使用 HDMI 線了,於是我又多了一個 3C 垃圾XD
第一劑 AZ 疫苗注射體驗
2021年7月28日 星期三
PW3 永遠都是我的心頭好
2021年7月23日 星期五
Kobo 的《精通 Go 程式設計》一書
2021年7月18日 星期日
Kindle 轉檔閱讀的相關疑難雜症
COVID-19 下,每個人都應該看的一本書 - 《這裡沒有英雄:急診室醫師的COVID-19一線戰記【電子書加值版】》
2021年7月16日 星期五
膠水語言
2021年7月14日 星期三
依 109 年內政部人口統計資料概算 65 歲以下人口 AZ 施打可能情形
2021年7月8日 星期四
NickelMenu 初體驗
NickelMenu 是一個由高手開發的 Kobo 小工具,它可以增加自定義的選單在 Kobo 的閱讀器上,另外本身還內建一些功能,我們可以藉由它來執行支援的任務,比如說啟動程式、重新掃瞄書籍、重開機以及關機等等。
對於想在 Kobo 閱讀器上開發程式的人,我強烈建議要裝,只要照著範例啟動 daemon,便可以 Telnet 進去閱讀器,對於 debug 自己寫的程式非常方便,另外,我還建議使用 Golang 來開發,如果只是用到原生的 package,一般來說編譯不會有什麼問題,如果有用到第三方的 package,只要不是 binding 系統的 library 或其他 C 語言,我想應該也沒有什麼大問題。
下面是我的編譯設定:
SET PATH=%PATH%;C:\Go\bin
SET GOPATH=%CD%
SET GOOS=linux
SET GOARCH=arm
SET GOARM=7
menu_item :main :IP Address :cmd_output :500:/sbin/ifconfig | /usr/bin/awk '/inet addr/{print substr($2,6)}'
menu_item :main :Telnet :cmd_spawn :quiet:/bin/mount -t devpts | /bin/grep -q /dev/pts || { /bin/mkdir -p /dev/pts && /bin/mount -t devpts devpts /dev/pts; }
chain_success :cmd_spawn :quiet:/usr/bin/pkill -f "^/usr/bin/tcpsvd -E 0.0.0.0 1023" || true && exec /usr/bin/tcpsvd -E 0.0.0.0 1023 /usr/sbin/telnetd -i -l /bin/login
chain_success :dbg_toast :Started Telnet server on port 1023.
2021年7月6日 星期二
KoboPageTurner v0.4.0 改版記錄
2021年6月30日 星期三
Kobo Elipsa 入手初體驗
2021年6月29日 星期二
Kindle App 登入小技巧
2021年6月27日 星期日
改造 Google 圖書購買的 PDF 資訊書籍
2021年6月25日 星期五
A pointer variable in the loop statement of Golang
package main
import (
"fmt"
)
type Device struct {
ID string
}
type Arg struct {
Devices []*Device
}
func main() {
arg := Arg {
Devices : []*Device{
&Device {
ID : "1",
},
&Device {
ID : "2",
},
},
}
d3 := &Device {
ID : "3",
}
for i, d := range arg.Devices {
fmt.Printf("idx(%d) d=%p arg.Devices[%d]=%p d3=%p\n", i, d, i, arg.Devices[i], d3)
//d = d3
arg.Devices[i] = d3
fmt.Printf("idx(%d) d=%p arg.Devices[%d]=%p d3=%p\n", i, d, i, arg.Devices[i], d3)
}
for i, d := range arg.Devices {
fmt.Println(i, d.ID)
}
}
2021年6月24日 星期四
我的 3C 小收藏
剛才在電子書閱讀器討論區看到有人在分享手上有的 3C 收藏!讓我也想將我的收藏拿出來盤點一下。
Hide/Show Desktop Icons on Windows 10 by C code
int toggleIconByShell() {
int res = 0;
HWND progman;
HWND defView;
// Find SHELLDLL_DefView class
progman = FindWindowExA(NULL, NULL, "Progman", "Program Manager");
printf("Program is 0x%p\n", progman);
defView = FindWindowExA(progman, NULL, "SHELLDLL_DefView", "");
printf("SHELLDLL_DefView is 0x%p\n", defView);
// Send message to defView
int lParam = 0;
int wParam = 0x7402;
LSTATUS lResult = SendMessage(defView, WM_COMMAND, wParam, lParam);
if (lResult != ERROR_SUCCESS) {
printErrorCode(lResult);
res = lResult;
}
printf("OK\n");
return res;
}
2021/06/24 更新
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void printErrorCode(LSTATUS lResult)
{
printf("ErrorCode = %d(0x%08X) \n", (int)lResult, (int)lResult);
}
BOOL EnumCallback(HWND hwnd, LPARAM lParam)
{
char name[256];
memset(name, 0x00, sizeof(name));
GetClassNameA(hwnd, name, sizeof(name));
if (strcmp(name, "WorkerW") == 0) {
HWND *address = (HWND*)lParam;
HWND defView = FindWindowExA(hwnd, NULL, "SHELLDLL_DefView", "");
if (defView != NULL) {
*address = defView;
return FALSE;
}
}
return TRUE;
}
HWND getDefViewHandle()
{
HWND progman;
HWND defView;
// Find SHELLDLL_DefView class
progman = FindWindowExA(NULL, NULL, "Progman", "Program Manager");
printf("Program is 0x%p\n", progman);
defView = FindWindowExA(progman, NULL, "SHELLDLL_DefView", "");
printf("SHELLDLL_DefView is 0x%p\n", defView);
if (defView == NULL) {
HWND *address = &defView;
// defView is moved to "WorkerW"
EnumWindows(EnumCallback, (LPARAM)address);
printf("After searching WorkerW, SHELLDLL_DefView is 0x%p\n", *address);
defView = *address;
// SHELLDLL_DefView is not the child of WorkerW.
if (defView == NULL) {
HWND desktop = GetShellWindow();
defView = FindWindowExA(desktop, NULL, "SHELLDLL_DefView", "");
printf("After searching desktop, SHELLDLL_DefView is 0x%p\n", defView);
}
}
return defView;
}
int toggleIconByShell()
{
int res = 0;
HWND defView = getDefViewHandle();
if (defView == NULL) {
printf("SHELLDLL_DefView not found \n");
return -1;
}
// Send message to defView
int lParam = 0;
int wParam = 0x7402;
LSTATUS lResult = SendMessage(defView, WM_COMMAND, wParam, lParam);
if (lResult != ERROR_SUCCESS) {
printErrorCode(lResult);
res = lResult;
}
printf("OK\n");
return res;
}
int main(void) {
toggleIconByShell();
system("pause");
return 0;
}
2021/06/25 更新
2021年6月15日 星期二
Kindle, HyRead, Readmoo on Hisense A5
2021年6月9日 星期三
肩傷果然會反反覆覆的發作
Replace string in Windows batch
剛剛想要將我的測試程式一條龍自動化,故我需要一個方法把 Windows batch 裡面的某個路徑動態改變成我要的路徑,就只差這一步以後我新增 API 都可以很方便的測試了!
Google 了一下,原來也算是很簡單的一件事,連回公司電腦測試也都沒有問題,看來我這個專案以後開發會更輕鬆了。
set newstring=%mystring:abc=def%