2026年,突然想用這個字了...
新年快樂
幸福,不是做自己喜歡的事,而是喜歡自己做的事
累積到上個月,已經掏錢給 Claude 滿一年了,從一開始 claude.ai 的用法,不停地在瀏覽器上詢問,自己也開發了簡單的小工具,目的是把程式碼打包成單一檔案,方便超額後可以續作 XD 不過,這樣的生態慢慢在 2025.02 之後都改變了。我也從 vim 模式轉成 vscode + github copilot + agent mode ,然而,當我又摸熟 github copilot + agent mode 後,又轉進了 claude code 的世界,並在 2025.07 也提播助理費到百元美金 XD 好用,當然要給他加薪一下
如果要說最大的生活改變?可能就是進入到定義任務的開發模式了,以及享受慣老闆機制,凡事避開自己親自 coding ,自己不 coding 也能欣賞 AI coding,也是一種自我成長的過程,可以接納更多種的解方。
慣老闆方面也要體驗一下的,當然就想要極致壓榨 AI ,倒垃圾前、洗澡前、睡前下個指令是基本的,同時開 2-4 個 Terminal 做不同的事也是合情合理,只是到頭來自己的 context switch 反而吃重,並且隨著 AI 能力越來越強後,漸漸地收斂到同時做 1~2 件事就好,放過自己吧!
放過自己後,就是享受生活的開始,不再計較要怎樣操爆 AI ,反而是在生活時間的碎片化下,如何靠 AI 輔助串起一切,凡事盡可能規劃 Save/Load 架構,做事做到一個地步肯定要叫 AI 更新 CLAUDE.md 檔案,甚至另外規劃個 PLAN.md ,就像小老闆時時刻刻盯著 KPI 。那何謂享受?既然等待 AI 的時間慢慢拉長(AI處理的任務深度加深),就開始看一堆動畫 XD 想想倒看了不少:
現在是 2025-09-21 ,打算讓 Claude code 卸下重擔。開始試試 OpenAI codex ,從一開始對話窗上不能上傳圖片、不能工作時先打好下一道指令等等, codex 版本迭代後,基本上跟 Claude Code 的差距越來越小了。再加上 OpenAI GPT-5 的成效,其實很接近 Claude Sonnect 4 / Opus 4.1 ,只要任務定義的清楚,基本上都是一樣的。
我想,這大概就是另類的小確幸吧?AI 輔助十分競爭,各家業者的差距也在縮減。
不過,也有些殘忍的事正在發生,美國已經大量關閉新鮮人的職缺,原本認為中高階者會被新人+AI輔助取代,隨著時間已經變成新人的職缺大量縮減,因為有經驗者 + AI 輔助可以做更多的事,企業也不用等新人犯錯練等。就像十年前有錢的新創,起手式先掏錢挖走有經驗的人。
這件事在工作上也滿有感受到的,觀察到同事正進行一個尚未有經驗的任務時,原本期待 AI輔助的過程,可以讓同事朝向有效的路線發展,事實上還是很吃“提問者的提問方式“,因為 AI 也會順著提問者的思維去規劃,回歸到下 prompt 的品質依舊重要。觀察到一些計劃方向也出現繞路的情況,所幸,隨著實務經驗增加後,還是回歸了正途。這件事代表:雇用有經驗者 + AI 輔助,還是跟以往的生態一樣的,只是一個人的經驗價值,仍有可能因為 AI 的出現被貶低。
目前 開發者 與 AI 輔助仍努力的找個平衡點,應該不是 AI 的泡沫化?略知很多 AI 服務(如 Perplexity)仍是努力燒錢中,尚未損益平衡,這也是恰巧聽到矽谷 podcast ,行內在搞新創的都有時時追蹤業內的頭部,據說 Anthropic 話語權仍很好的,而整合類(沒有研發自己的 LLM且本身也沒錢研發)都非常辛苦,也怕搞 LLM 大廠推出新服務就打亂了自己的步調。
而最底層食物鏈的開發者呢?我想,真的只剩投資了 :P 只能配置好資產(大盤指數也行也夠),避免產業鏈一個瞬間轉身就...受到重傷 Orz
% diskutil info /dev/disk10 | grep -E "(Block|Cluster|Sector)"Device Block Size: 512 BytesAllocation Block Size: 512 Bytes
# 1. 先一次性寫入 A 卡資料(只做這一次)diskutil unmountDisk /dev/disk10sudo dd if=a_card.img of=/dev/rdisk10 bs=1m# 2. 從最小範圍開始測試 - 只覆蓋 Boot Sector (512 bytes)sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=512 count=1 conv=notruncdiskutil mountDisk /dev/disk10# 檢查是否有資料,如果沒有繼續下一步# 3. 如果 512 bytes 不夠,擴大到 40KB(到 FAT 表開始位置)diskutil unmountDisk /dev/disk10sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=1k count=40 conv=notruncdiskutil mountDisk /dev/disk10# 檢查結果# 4. 如果還不夠,擴大到 100KBdiskutil unmountDisk /dev/disk10sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=1k count=100 conv=notruncdiskutil mountDisk /dev/disk10# 檢查結果# 5. 繼續擴大到 500KBdiskutil unmountDisk /dev/disk10sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=1k count=500 conv=notruncdiskutil mountDisk /dev/disk10# 檢查結果# 6. 最後到 1MBdiskutil unmountDisk /dev/disk10sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=1k count=1024 conv=notruncdiskutil mountDisk /dev/disk10
% diskutil unmountDisk /dev/disk10% sudo dd if=a_card.img of=/dev/rdisk10 bs=1m9297+1 records in9297+1 records out9748611584 bytes transferred in 642.300766 secs (15177643 bytes/sec)% sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=512 count=1 conv=notruncPassword:1+0 records in1+0 records out512 bytes transferred in 0.009456 secs (54146 bytes/sec)% diskutil mountDisk /dev/disk10Volume(s) mounted successfully
% diskutil unmountDisk /dev/disk10Unmount of all volumes on disk10 was successful% sudo fsck_msdos -f -y /dev/disk10Password:** /dev/rdisk10** Phase 1 - Preparing FAT** Phase 2 - Checking Directories** Phase 3 - Checking for Orphan ClustersWarning: 175 files, 31120736 KiB free (972523 clusters)% brew install testdisk% sudo photorec /dev/disk10
過程:
PhotoRec 7.2, Data Recovery Utility, February 2024Christophe GRENIER <grenier@cgsecurity.org>https://www.cgsecurity.orgDisk /dev/disk10 - 31 GB / 29 GiB (RO)Partition Start End Size in sectorsP FAT32 0 62333951 62333952 [NO NAME]Destination /path/recup_dirPass 1 - Reading sector 6458368/62333952, 217 files foundElapsed time 0h02m02s - Estimated time to completion 0h17m35jpg: 101 recoveredtxt: 94 recoveredmov: 17 recoveredgz: 5 recovered
希望可以救多一點
$ python3 proxy-server.py --port 12345 --proxy-target 'http://192.168.123.234:80' --proxy-paths '/cgi-bin/' -d project/path/html/code/Serving files from directory: project/path/html/code/Serving HTTP on 0.0.0.0 port 12345 (multi-threaded) ...Proxying paths ['/cgi-bin/'] to http://192.168.123.234:80^CServer stopped.
#!/usr/bin/env python3import http.serverimport socketserverimport http.clientimport argparseimport osimport sysimport socketfrom urllib.parse import urlparse# 使用 ThreadingMixIn 來處理並發請求class ThreadedHTTPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):daemon_threads = Trueallow_reuse_address = Trueclass ProxyHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):# 代理目標地址proxy_target = None# 需要代理的路徑前綴proxy_paths = []# 連接池(簡單實現)conn_pool = {}def __init__(self, *args, **kwargs):# 確保可以正確處理目錄參數super().__init__(*args, **kwargs)def do_GET(self):# 檢查是否需要代理這個請求for path_prefix in self.proxy_paths:if self.path.startswith(path_prefix):self.proxy_request()return# 如果不需要代理,則使用默認處理方式super().do_GET()def do_POST(self):# 為 POST 請求也提供代理功能for path_prefix in self.proxy_paths:if self.path.startswith(path_prefix):self.proxy_request()returnsuper().do_POST()def get_connection(self, host, is_ssl=False):"""從連接池獲取連接,或建立新連接"""key = (host, is_ssl)if key not in self.conn_pool:if is_ssl:self.conn_pool[key] = http.client.HTTPSConnection(host)else:self.conn_pool[key] = http.client.HTTPConnection(host)# 檢查連接是否仍然有效conn = self.conn_pool[key]try:# 嘗試使用一個非阻塞的方式檢查連接狀態old_timeout = conn.sock.gettimeout()conn.sock.settimeout(0.01)conn.sock.recv(1, socket.MSG_PEEK)conn.sock.settimeout(old_timeout)except (socket.error, AttributeError):# 連接已關閉或存在問題,創建新連接if is_ssl:self.conn_pool[key] = http.client.HTTPSConnection(host)else:self.conn_pool[key] = http.client.HTTPConnection(host)except Exception:# 其他類型的錯誤,可能連接仍然有效passreturn self.conn_pool[key]def proxy_request(self):"""使用 http.client 處理代理請求,這在 Python 3.2 中更高效"""target_url = urlparse(self.proxy_target + self.path)# 獲取請求頭部headers = {}for key, value in self.headers.items():# 排除一些特定的頭部if key.lower() not in ('host', 'content-length'):headers[key] = value# 設置正確的 Host 頭部headers['Host'] = target_url.netloc# 讀取請求體(如果有)content_length = int(self.headers.get('Content-Length', 0))body = self.rfile.read(content_length) if content_length > 0 else Nonetry:# 確定是否使用 HTTPSis_ssl = target_url.scheme == 'https'# 獲取或創建連接conn = self.get_connection(target_url.netloc, is_ssl)# 構建請求路徑request_path = target_url.pathif target_url.query:request_path += '?' + target_url.query# 發送請求conn.request(method=self.command,url=request_path,body=body,headers=headers)# 獲取響應response = conn.getresponse()# 設置響應狀態碼self.send_response(response.status)# 設置響應頭部for header in response.getheaders():key, value = headerif key.lower() != 'transfer-encoding': # 排除特定頭部self.send_header(key, value)self.end_headers()# 發送響應體self.wfile.write(response.read())# 不關閉連接,將其保留在連接池中except http.client.HTTPException as e:# 處理 HTTP 錯誤self.send_response(500)self.send_header('Content-Type', 'text/plain; charset=utf-8')self.end_headers()self.wfile.write("HTTP Error: {}".format(str(e)).encode('utf-8'))except Exception as e:# 處理其他錯誤self.send_response(500)self.send_header('Content-Type', 'text/plain; charset=utf-8')self.end_headers()self.wfile.write("Proxy error: {}".format(str(e)).encode('utf-8'))def run_server(port=8000, proxy_target="http://localhost:8080", proxy_paths=["/cgi-bin/"], directory=None):# 設置代理目標和路徑ProxyHTTPRequestHandler.proxy_target = proxy_targetProxyHTTPRequestHandler.proxy_paths = proxy_paths# 確保代理目標是有效的 URLif not ProxyHTTPRequestHandler.proxy_target.startswith(('http://', 'https://')):ProxyHTTPRequestHandler.proxy_target = "http://{}".format(ProxyHTTPRequestHandler.proxy_target)# 移除代理目標末尾的斜線(如果有)if ProxyHTTPRequestHandler.proxy_target.endswith('/'):ProxyHTTPRequestHandler.proxy_target = ProxyHTTPRequestHandler.proxy_target[:-1]# 設置工作目錄if directory:os.chdir(directory)print("Serving files from directory: {}".format(directory))else:print("Serving files from current directory: {}".format(os.getcwd()))# 提高 socket 超時時間以處理慢速連接socket.setdefaulttimeout(60)# 建立服務器(使用線程化服務器)server_address = ("", port)httpd = ThreadedHTTPServer(server_address, ProxyHTTPRequestHandler)print("Serving HTTP on 0.0.0.0 port {} (multi-threaded) ...".format(port))print("Proxying paths {} to {}".format(proxy_paths, proxy_target))try:httpd.serve_forever()except KeyboardInterrupt:print("\nServer stopped.")httpd.server_close()if __name__ == "__main__":# 解析命令行參數parser = argparse.ArgumentParser(description='HTTP Server with proxy capabilities (optimized for Python 3.2)')parser.add_argument('--port', type=int, default=8000, help='Port to listen on (default: 8000)')parser.add_argument('--proxy-target', type=str, default="http://localhost:8080",help='Target server to proxy to (default: http://localhost:8080)')parser.add_argument('--proxy-paths', type=str, default="/cgi-bin/",help='Comma-separated list of path prefixes to proxy (default: /cgi-bin/)')parser.add_argument('--directory', '-d', type=str, default=None,help='Specify directory to serve files from (default: current directory)')args = parser.parse_args()proxy_paths = [path.strip() for path in args.proxy_paths.split(',')]run_server(args.port, args.proxy_target, proxy_paths, args.directory)