香港人跑到台灣正顎遊記
背景故事 在中學(台:國中)的時候我的牙醫看到我的情況一直都在跟我說要做矯正,我都說不要,主要原因是我有看過倒及(台:戽斗 / 英:Underbite)這個基本上透過矯正基本上算於沒救(就算能矯正過來臉型還是很醜),再加上咬合導致的顎關節有聲或者痛這問題看來也很常見,那不如不要浪費錢還比較好。 就是這樣這個問題一直拖到大學,後來在快畢業的時候遇到疫情,一直載口罩加上因為嘴巴沒辦法完全閉合所以一直在張嘴呼吸。除了把關節的問題弄得更嚴重之外,連臉型也跟著跑掉(連家人都說怎麼下巴比起以前更凸了),但是因為不知道解決方法所以還是一直放著沒弄。 台灣牙醫興健保 也是因為疫情關系,香港很多公司也沒再在招人。本來我大學是讀 CS 相關的,畢業之後大概除了香港科學園之外(開發類),只能跑去當 IT(當狗 當技術支援與整合)。在疫情的環境下,CS 的工作大減,IT 需求大增;但是作為 CS 出生寫 code 技術滿不錯的畢業生來說,去當 IT 反而有一種「降等」的感覺。當時台灣還沒受疫情波及,所以我決定去試試找台灣的工作。但是在網上看了一轉,台灣大部分(有一定程度技術需求)的工作都需要碩士畢業學歷,所以我就選了一家南部的四大再進修一下,邊留意市場狀況。 到了台灣半年左右知道了健保有每半年免費洗牙之後,我便間中在下課之後去附近的牙醫診所洗牙(畢竟有免費的不用有點對不起自己)。那間診所是由一位成大出身的老牙醫經營,洗牙完全不痛,一看就知道是大師級的人物。有一次去洗的時候好奇問了一下牙醫我這情況還有救嗎?他伸手摸一下我的下顎然後按住下巴開合一下,說「你這情況需要動手術」,我才知道原來還有這治療方法!?然後我就問他要了轉診單找了推薦的醫師去成大醫院咨詢。 去到成大醫院之後找到了老牙醫推薦的口腔顎面外科王東堯醫師,不問不知道,一問嚇一跳,原來他是台大畢業的香港人,所以才有這麼高的素質。來回好幾次照了 X 光 CT 之後決定了要開 BSSO(就是比較複雜的 multi-axis 旋轉 + 移動的那種正顎,並非那種單純縮下巴 / 拉出上顎的單軸式移動正顎),加上我的頭骨可能對於男性一般值來講也是偏細 + 薄,CT 掃出來重建的 3D 模型也一大堆穿洞(太薄的骨頭掃不出來),最後委托外面的 3D 醫學模型公司來做 3D 模型重建 + 特別設計手術用的咬合板(因為 BSSO 上下顎都要切開,所以需要設計幾個定位用類似牙模的東西來讓醫師開刀的時候知道骨頭要移動多少)。 在我做最後決定前,因為尊重原因我有先知會我的父母。我媽就是很擔心,所以把我拉去香港的診所要醫療意見。跑了好幾個禮拜之後大概的結論是 香港也不是不能做,只不過可能要排 6 - 8 年;要快的話可以去私家,我這個 case 整套下來大約要花 40 - 60 萬港紙(相比起台灣找大醫院做的話大約是 40 萬台幣左右)香港的做法會偏保守,一般會先矯正 1 - 2 年,之後開完正顎之後再矯正 1 - 2 年;台灣這邊王醫師開出來的是 surgery first approach,可以省下一開始的矯正,整體治療時長會減少到 1.5年 左右兩位香港的醫師看完台灣醫師給的治療計劃後都覺得沒甚麼問題,甚至有一位聽到台灣開的價格之後主動建議「你們還是在台灣開比較好」 所以後來就按原定計劃在台灣開刀了。 檢查與開刀經歷 開刀其實不麻煩(畢竟麻煩的是醫師),最麻煩的事情大概就是每隔幾個禮貌要回去一次檢查這個那個甚麼的。這個我覺得比較少人有寫到網絡上分享,大概就是 X 光檢查、驗血、拍照記錄CT 掃描(取得頭骨 3D 模型)制作咬合板,用來於手術中移動上下顎骨頭的時候可以準確的對到設計位置(順便一提,這是用醫療級 SLA 3D 列印做出來的,很酷)備血(兩次,隔大約一個月,以防不時之需) 進開刀房 開刀其實沒甚麼大不了(畢竟對我來說睡一覺醒過來不是看到醫生就是轉生異世界),大概跟其他網上分享的經歷差不多:前一天先住院做檢查,然後就是等第二天早上開刀。開刀前 12 小時不能吃喝,然後開刀大概 8 - 10 個小時,但是對我來說就是睡覺醒來就好了。 這一覺我猜連續睡了快 2 天(手術 + ICU) Propofol 真是個好東西,醒來的速度也有夠快。醒過來之後第一件事大概感覺得呼吸很困難,然後就慢慢感覺到氣管裡有種卡住東西但是也能呼吸的感覺。可能差不多這個時候醫師發現了我可以自主呼吸,就來幫我把插在氣管裡的呼吸機喉管拔掉,這個時候就舒服一點了。接著躺著休息一陣子之後被轉移到另一張床上,然後馬上被推進一般病房去。(果然 ICU 的床位還是很搶手的) 進去之後大概就是抱著我的 IKEA 鯊鯊在睡,間中會被叫起來照 X 光之類的。每朝早上王醫師來查房的時候都會有這樣的對話: 王醫師:你覺得怎樣?我:很腫王:你已經不算腫的了 剛被推出 ICU 的時候會有一條從下巴拉到頭頂的繃帶用來固住定住下顎。因為本來你的臉已經是在腫了,還要被繃帶壓住,所以一開始真的超級不舒服。然後大概在 2 / 3 天之後,用來固定的繃帶會被拆開,這個時候才真的比較可以講話和看到明顯的術後變化。 整體來說,術後大概躺了 1.5 天深切治療部(加護病房 / ICU),睡了 4 天醫院一般病房(其中兩天不能吃喝,但是因為有輸葡萄糖液所以完全不覺得餓),之後連續喝純液體 2 個星期(應該沒甚麼人能體會到連續喝舒跑 + 寶礦力兩個星期的慘況) + 4 個星期流質之後,在第二個月終於可以吃到比較軟的食物(如粥、布丁之類的),第三個月才能吃飯。雖然說開刀是沒開到關節的位置,但是因為整個下顎的部分都腫起來,不要說咬合,實際上連把食物吞進去的動作也沒辦法到(因為這時候還沒矯正,牙齒還是在 open bite 的狀態 ,加上肌肉不知道為甚麼沒辦法發力),所以吃流質的時候是需要用針管透過一條橡膠管插進喉嚨裡面,然後把液體往裡面擠來「吃飯」。 術後矯正 在大約術後一個月左右開始來做術後矯正,然後裡就是一般牙齒的矯正過程了。由於(醫師說)牙齒在骨頭開刀之後會動很快,所以矯正也應該只需要 1 - 1.5 年就好。跟著那幾個月就是一般牙齒矯正的各種慘況:牙齒很酸,沒辦法吃硬的東西之類的,但是比起正顎後那一個月來說還是舒適很多。 雖然說整個過程都超級辛苦,但是自從開完半年左右,好處就慢慢出現了。首先當然是咬合變好顎關節痛的頻率也減少了很多,同時間附帶的是臉部線條變順暢;其次就是終於可以用鼻子呼吸而不是嘴巴,所以睡覺品質也變得更好;而加上因為有讓醫師在全身麻醉的時候順便把智齒都拔掉,所以之後也不用擔心那會有蛀牙問題( 一年後的想法 我對正顎的想法大概就是很值得做,無論是在功能上還是生活品質上面都有很好的改善。唯一的可惜就是我沒有早點做(聽說大概 21 - 22 歲做會更好),有人說早點做的話神經線恢複的速度會更快,但是我覺得還好(? 另外由於健保給付了一部分的病房 跟 X 光 費用,所以出院的時候除了手術、開刀房借用跟升級藥物到比較好的止痛藥等的費用之外,基本上都包含在健保內。當時心裡面是有點過不去(畢竟我又沒付多少健保費),但是近幾個月開始在台灣半導體業工作,每月收到薪資單看到被扣的健保費用之後心裡還是有好過一點。。。
香港人在新竹租房奇遇記(?)
最近因為在新竹科學園區找到了算是人生第一份正規的科技業工作,所以就準備打算直接搬家到新竹東區來方便上下班。然而想不到新竹的租房市場真的比想像中和資料收集中的還要坑人(特別是新手),所以就來寫一篇部落格來記錄一下。 事前資料收集 第一次做任何事情之前,最重要的就是做資料收集了。首先,在新竹科學園區附近找房子,有幾個重點: 591 上面的都是釣魚的Facebook 租屋群,騙子超多,下面再詳細解釋本地的不動產(門市),通常都只會登出超難租出或是貴價的,學長說那種風險很高不建議考慮掃街(建議的方法,但是很浪費時間和體力) 591 新竹租房問題 可能對於第一次來台灣的香港人,最早接觸到的租(買)房平台就是 591 了。可是在新竹的租房情況下,591 一般會出現釣魚問題。 簡單來說是 591 上面都只有仲介,放出來的圖片是真的,物件也應該是真的,但是你看到的時候通常都已經租出了。當你真的約房仲出來看的時候(就是你人已經去到新竹的時候),他才跟你說房子已經沒了,要不要看其他的? 如果你回答【好喔】,那你就踩進去這個陷阱了。他會把他手上有的租不出去的爛房子都給你看(網上也有人說他會假裝又有房子被租走了,來讓你趕快決定),然後很多人就因為「已經來了,不能空手而回」的想法而租到爛的物件。所以一般來說除非你真的沒辦法多來幾次,而且對房子的品質沒甚麼考慮的話,否則一般都不推薦這個方法。 Facebook 租屋群組 這又是另一個大坑,裡面就是房仲跟騙子的聚集地。其中一個最大的群組就是這個: 這個群組上主要會看到三類帖子,第一類是房仲,第二類是騙子,第三類是房仲或是騙子裝的房東自租。 房仲 房仲就比較簡單,你看到有浮水印的,多數都是房仲所推出來的房子。一般來說都會附上房仲的登記號碼(我猜政府應該是有管理制度,可以查詢到該房仲是不是合法經營的)。一般來說透過房仲找的話對方會多收你租金的 50% 作為中介費(一次性),所以如果你是很忙沒時間找而且不怕價格偏高的話,透過房仲來找房也不免是一個快捷省時間的方法。至於哪家房仲或是不動產公司比較好,這個你可以參考台灣 ptt 或是 dcard 上面的帖文。 浮水印例子(一) 浮水印例子(二) 網絡騙子 騙子的概念大概就是要來騙你訂金的,因為通常這類帖子都是由機械人或是詐騙集團發出來,背後大概有個模板所以就比較好分辨了。如果你看到類似這種的,有很大機率都是假的租房帖文。 關閉留言功能的 要求「優質房客」 房東自租 這個就要特別注意了。雖然說確實會有機會是有房間是由房東自己釋出,但是更多時候是房仲騙你去看房或是騙子的技巧。例如說這種的,資料看上去是真的可是把回應功能關掉的;或是寫著「可預訂」的,一般都是假的。 一般來說房東自租的物件真的超級少,你要到當地掃街才會有機會找到,所以在 FB 或是 ptt 上能找到的,即使真的是房東自租,你也不應該去看(價格不合理、環境差等而導致沒人租)。 本地的不動產 當你人已經去到新竹後,你可以選擇到附近的不動產門市看看。一般來說跟你在 FB 上看到的差不多,但是沒有了騙子與房東自租的部分,所以基本上貼在店外的就是 What you see is what you get 類房間。如果有看到有興趣、價錢 ok 的話直接進去說要看房就好了。然而,在科學園區工作了好幾年的學長卻建議不要找這種的,風險很高(我也不太懂),但是基於前人經驗之談,我在這次找房間的時候就直接跳過這個選項。 掃街 最後我決定直接掃街,從金山前到後每條巷子都走一趟。這邊的文化我覺得比較有趣的是,很多房子外面都貼著「套房出租」的 banner。 這種打電話過去有機會是房仲,也有可能是房東,這完全要看你運氣;有時候打電話過去會被告知已經全租出了,也有可能是同一個房仲在其他地方會有其他房間等等的。再加上這附近的人口超多流動率也有夠高,根據我的抽樣統計在我找房子的這個月這附近大約有 23 - 25 間空房出現(以及被租走),所以如果第一天找不到的話可以多待幾天再找,到時候可能就能找到了。 關於外國人租房的這回事 基本想如果你想在科學園附近租房的話,有兩樣東西是必要的 園區內公司之工作證件或報到通知單居留證(部分房東對於外國人特別抗拒,所以這個也很看運氣)或 台灣人當保證人 第一項這倒是不大問題(你要是沒在園區找到工作,搬過去幹麼?),問題是第 2 跟 3 項。在我找房的過程中,遇到最多的是當房東或房仲知道我是香港人的時候,他就馬上拒絕租給我(大部分都是直接說不考慮租給外國人)。 另外我也有找到另一間房東自租的房子,房東是高雄人,人滿好的,可是聊了很久之後打算租下去的時候才跟我說需要保證人才能簽約。單單是這幾點我就完全感受到台灣老一輩人排外的文化( 所以簡單來說,如果你是本地人的話房子已經夠難找了,如果是外地(國)人的話這個就更難了。就我找房的這兩次新竹之旅來說,大概 70 - 80% 都是需要保證人 或是 不租外國人的,所以如果你真的像我這樣要在新竹找房子,記得一定要預留至少 4 - 5 天時間。 我的找房經歷 由於我還沒有考到機車駕照,在只有單車跟步行的情況下,我選擇了金山街一帶的房子。那邊在當地人口中被叫做「新手村」,作為「新手」,住「新手村」就最合適不過了。我第一次去那邊的時候是搭高鐵,到新莊車站之後走路到附近的公車(巴士)站,再轉科學園紅線進去科學園;面試完之後再經科學園路走到金山街。 之後第二次去新竹的時候因為不用去面試,可以直接去金山街,所以這次我選擇搭火車(台鐵) 到新莊車站 再走路過去。雖然說有一部分路上次有走過,想著應該後面那段都是差不多,結果走過光復路一段之後全是上坡,走到快要體力不支( 後來第二天繼續去掃街的時候我選擇直接搭去竹中車站,這樣走路的距離在地圖上看短了不少 中間一開始看到有一片綠色我還以為是一個公園,怎知道去到之後才發現是一個山坡(結果又是上坡,果然金「山」街真的在山上的啊) 這山坡大概有 4 - 5 層樓高,而且還要是這種小徑的樓梯有夠難走 還好走完這一次之後我終於找到合適的房子並下了訂金(下次去的時候應該就會直接「的士 ~」) 結論 如果你找到了在新竹科學園區的工作,雖然很恭喜你,但是最難的部分才剛開始。之後還要考慮到住宿、交通(聽說在新竹的話必須要懂得騎車,雖然說 Ubike 看上去也滿多的)跟食的問題(聽說除了火鍋跟 M 記以外都沒好吃的),所以適應力的技能點也要點好點滿才進去喔(
Golang trie tree IP 轉國碼(Country Code)
最近因為有人 report 說 Zoraxy 的 GeoIP 功能不準,於是我在重新 review 這個 geoip database module 的時候發現:欸幹真的寫錯了欸!? 然後在花了一整個晚上 debug 之後,我終於找到正確的演算法和做法了。這裡為了省下後人在掘怎樣用 Golang 寫 IP 轉 Country Code 的 resolver,我這裡給大家一個快速上手的教學。 甚麼是 IP 轉 CC? IP 就是 IP 地址,CC 是 country code,有時稱為 ISO 國碼,例如說 HK TW US GB 之類的。IPv4 跟 v6 的地址區間通常會被 assign 到某一個國家的 ISP 上,而造成說只要知道 IP 地址,某程度上你可以知道那個 request 是從哪個國家出來的(先不要說 VPN 或是 ip spoofing 之類的部分的話)。可是由於每隔一段時間就會有 ISP 倒閉、收購或是重組之類的,所以 IP 轉 CC 的可靠度並非 100% 準確,這個時候我們就需要從一個可靠的來源來定期更新這一個 IP range 到 CC 的 mapping database 了。 這個 database 最出名的應該就是 maxmind 的 geoip database,人家都整理好所有數據到一個 database 檔案裡面,也提供 api 讓你可以快速查詢 cc,很多現代只會拉 library 的開發者通常就會直接選用它。然而,基於它的 license 問題,如果真接用它的方案的話會讓授權和 licensing 變得一團亂,所以基於多種考慮之下這個方案我們最終沒有使用,而是使用 Public domain 或 CC-0 的資料來源。 GeoIP Data Source 最後我們使用了來自 GeoFeed + Whois + ASN (CC-0)的資料來源: https://github.com/sapics/ip-location-db/tree/main/geolite2-country 問題是它的資料表是一個 csv 檔案,大概長這樣: 1.0.0.0,1.0.0.255,AU 1.0.1.0,1.0.3.255,CN 1.0.4.0,1.0.7.255,AU 1.0.8.0,1.0.15.255,CN 1.0.16.0,1.0.31.255,JP 1.0.32.0,1.0.63.255,CN 1.0.64.0,1.0.127.255,JP 1.0.128.0,1.0.255.255,TH 1.1.0.0,1.1.0.255,CN 1.1.1.0,1.1.1.255,AU 1.1.2.0,1.1.63.255,CN 1.1.64.0,1.1.127.255,JP .... 223.255.248.0,223.255.251.255,HK 223.255.252.0,223.255.253.255,CN 223.255.254.0,223.255.254.255,SG 223.255.255.0,223.255.255.255,AU 那假設我給你一個 ip 地址:A.B.C.D,你要怎樣把 country code 從 csv 裡面抓出來呢? 最直觀的答案:O(n) 當然如果會一點寫程式的人就會想到:那我把整個 csv loop 一次,看看哪一行的 start ip 跟 end ip 是包含我這個 ip 地址的就好了啦?這個的確是我們做給嵌入式裝置的做法(不過是為了省 memory),原理大概這樣: func isIPv4InRange(startIP, endIP, testIP string) (bool, error) { start := net.ParseIP(startIP) end := net.ParseIP(endIP) test := net.ParseIP(testIP) if start == nil || end == nil || test == nil {…
在 Zoraxy 加入 TLS SNI 功能
最近我在開發的 Zoraxy v3 在我開發 Zoraxy 之前我也不知道 https 證書這東西對於 reverse proxy 伺服器來說到底有多複雜。一開始的時候因為我都是用一個域名(domain name),所以 reverse proxy 裡面也是只需要處理一個主機名稱(host name)。而初代的 Zoraxy 則是直接用 TLS hello info 裡面的 server name 作為 certificate 的 key 來找到合適的 certificate 並回傳給客戶端,所以時間複雜度(time complexity)而言是 O(1) 的速度。換成程式碼大概長這樣: http.ListenAndServeTLS(":443", "server.crt", "server.key", nil) 到後來發現 virtual directory 帶來的麻煩後,Zoraxy v2 加入了 sub-domain 的支援。為了解決找 certificate 的問題, v2 的做法是讓使用者把每個 sub-domain 都 map 到一張 certificate 上面,所以結果就是同一個域名下會有很多張證書(例如說 a.example.com 會有 a.example.com 的證書、b.example.com 會有 b.example.com 的證書)。這樣設計的好處是一來找 certificate 的演算法比較簡單,二來我們可以根據 hello info 的 server name 進行也是 O(1) 時間複雜度的 certificate lookup,不用任何存取 file system 的 loop 便可以直接找到證書。 if fileExists(helloInfo.ServerName+".pem") && fileExists( helloInfo.ServerName+".key") { //Direct hit pubKey = helloInfo.ServerName+".pem" priKey = helloInfo.ServerName+".key" } 然後在 Zoraxy v2 用了這一年多之後就又出現問題了。coauthor 的其中一張證書裡面包含了幾個不同的 domain 跟 subdomain,也有使用者的證書是含 wildcard 的,也有是舊版用 Common Name 來定義(而不是 DNS entry)來標記 host name 的,結果就是一大堆 issue 就出現在 repo 上面。 SNI 的基本概念 SNI 的原理大概就是由伺服器端跟據 TLS Hello Info 的 Server Name 來自動回傳合適的 certificate 給 Client (這裡因為 Zoraxy 是一個 http proxy,那我就以瀏覽器為 client 的例子)。對於很直接的域名例如說 v1 跟 v2 裡面出現的,基本上就是只要把 certificate map 到一個 string 轉 certificate 的資料結構裡面就可以了。但是對於 v3 之後的複雜案例,則是需要一些更複雜的邏輯來處理。 相信來得我部落格的人不是工程師應該都是技術大佬,所以我就直接把 code 拿出來講好了。這裡是 Zoraxy v3 TLS 解釋器裡面最重要的 function func(m * Manager) CertMatchExists(serverName string) bool { for _, certCacheEntry: = range m.LoadedCerts { if certCacheEntry.Cert.VerifyHostname(serverName) == nil || certCacheEntry.Cert.Issuer.CommonName ==…
在不更改電路板 BOM 表下把 Macropad 變成 Numpad
話說幾個月之前,我設計並開源了一個四鍵的 macropad (快速鍵鍵盤)方案。電路板上使用 WCH 制的 CH552G 晶片,配合機械鍵與幾顆電阻電容就做成了一個超簡易的四鍵機械 macropad 後來在 hackaday 上分享後不知道為甚麼突然爆紅,收到很多留言,所以我就在想,說不定我可以用同一套零件的方案改用 grid layout 來做到數字鍵盤欸?所以我就來試試看了。 甚麼是 Grid Layout? 以 Arduino 的基本電路為例,通常要抓一個按鈕是不是被按下,一般都會對一個針腳進行讀取(e.g. digitalRead),但是在這樣的情況下,每一個按鈕就會需要用到一個 GPIO 針腳。如果我要做一個標準的 4 x 5 鍵數字鍵盤的話,我不就是需要用上 Arduino Mega 才行了嗎?所以這當然是不可行的。 但是如果你有留意到,外面很多 Arduino 按鈕的範例都是使用 Pull Low (下拉)和檢測針腳是不是 high (高電平)的方法來實現的。因此如果我們有辮法在需要讀到某個按鈕的時候的狀態的時候才對它提供高電平,而沒在讀取的時候提供低電平(即使按下也不會產生高電平狀態)的話,那樣我們就能用一只 GPIO 來選擇讀取哪個按鈕,另一只 GPIO 來讀取選擇了的按鈕來增加總讀取的按鈕數量。 於是就出現了 grid layout 跟 line scanning 的方法了。簡單來說就是對於一個 4 x 5 的 grid 而言,我們只需要控制 5 個針腳以選擇哪一行 (row),然後 4 個針腳來讀取哪一列 (column) 就好。以這樣的方法,原本會需要用到 20 個針腳的電路,現在用 4 + 5 = 9 個針腳就能讀完了。 可是,這樣會出現一個問題。在小量生產 PCBA 的情況下,每一顆零件和焊接費用都是滿貴的。而這個 layout 會讓 10K 電阻比原先的 BOM (四顆)多了一顆!? 不過解決方法也很簡單,只要把電路反過來,使用 pull HIGH + LOW activate 的設計(即是說按鈕按下的時候 MCU 是讀取到 LOW / 0 而不是 HIGH /1 ),那電路的設計就變成下面的樣子,把電阻搬到 INPUT line 上面,從而省下一顆電阻( 設計好了之後就是電路板設計了。這裡用的是 EasyEDA,根據上面的原理大致畫一畫之後電路板就出來了。 正面(預留了 numpad + macropad 兩者的插孔) 背面 組裝的部分也是沒甚麼特別的,先把 micro USB 和 CH552G 焊上去之後,再焊一些比較大的零部件,最後就是燒錄程序作測試。 背面電路板,原型機板本背面甚麼都沒有印 正面裝上 keycap 後的效果,由於是開發軟體用的原型機所以用上了最便宜的量產通用型鍵帽 測試用的 Arduino 寫的 Ch552 numpad firmware,需要先灌 CH55X Arduino 燒錄器 外殼設計與打印 由於這片電路板背面也有零件,因此沒辦法馬上使用,必須要先把外殼生出來才能安心放桌面上使用(不然把零件撞掉就麻煩了),這裡使用 Aprint Editor 簡單的為這台東西設計個外殼 因為不知道要傾斜角度多少會比較舒適,因此設計成可以拆卸的結構以方便測試 原型機成品 由於這是原型機,主要作為軟體開發和測試用,因此外殼甚麼的都是拿手邊剛好有的材料來印(黑色 PLA)。但是外型差不多就是這樣。 正面 底部,兩則的是防滑膠條;用戶可以在那個洞黏上金屬板以增加重量 Micro USB 與 firmware program 的按鈕有一個凹位方便開發者使用 後方的 IO 就只有 micro USB 口與兩顆 LED 最終(小)量(生)產的版本應該會好看很多,但是功能上這東西的確比我想像中的要好(這篇文章就是用這個鍵盤寫的),如果加上配重塊與專用鍵帽的話我猜真的可以取代現在我在用的數字鍵盤的樣子(?
AI 產圖與魔法 #淡淡杯
話說最近 FB 上出現了這麼一個有趣的比賽,但是作為技術系開發者,當然是要用最原始的 stable diffusion 來產,於是這就是作品: 魔法如下(Positive weight 跟 negative weight) ANIME GIRL, FEMININE,((PERFECT FACE)),((SEXY FACE)),((DETAILED PUPILS)).(ARTIST),ARTIST,ARTIST,(ARTIST). OIL PAINTING. ((NO BREAST)), SMIRK,LOOK AT VIEWER, (((WHITE HAIR))).(INTRICATE),long hair, asian, (loli), (HIGH DETAIL),SHARP, GREY EYES, 14, ((maid)), cherry blossom, ((sakura)), leaf, (flower), nature, ((blue sky)), white cloud, black cat ((nipple)), ((((ugly)))), (((duplicate))), ((morbid)), ((mutilated)), (((tranny))), (((trans))), (((trannsexual))), (hermaphrodite), [out of frame], extra fingers, mutated hands, ((poorly drawn hands)), ((poorly drawn face)), (((mutation))), (((deformed))), ((ugly)), blurry, ((bad anatomy)), (((bad proportions))), ((extra limbs)), cloned face, (((disfigured))). (((more than 2 nipples))). [[[adult]]], out of frame, ugly, extra limbs, (bad anatomy), gross proportions, (malformed limbs), ((missing arms)), ((missing legs)), (((extra arms))), (((extra legs))), mutated hands, (fused fingers), (too many fingers), (((long neck))), (((background))), ((((big breast)))), (((hand))) #淡如盃 技術細節 可能看到這裡的你會在想,到底 stable diffusion + pre-train model 跟外面的 midjourney 之類的差別在哪?雖然我也不清楚其他系統的做法,但是我猜的是他們也是基於一個 pre-train model 並加入一堆 preset 的 rule / theme 來讓它產出那模型的獨有風格。舉例說,上面的 negative weight 中,除了最後幾個(background)、(hand) 之類用作減少背景雜亂和手部生產錯誤的 negative weight 以外,其他基本上也就是固定的了。因此我猜可能其他的服務也是透過類似的方法來實現。 嘛當然,如果能避免直接出現手部(例如用 hands in pocket、hands out of frame 的 positive weight)的話那效果會更好。 手指與手套 加入黑色手套 (black glove) 不知道為甚麼,有時候好像也能改善手指數目和動作生成的問題(我猜可能只是看不見而已),以下是兩張例子: 色系與背景 特別強調背景的物品或色系看來有時候也會讓整體的繪圖質素有所提升(可能是因為通常背景畫得好的繪師,人物也畫得不錯?),例如說當我特別定義了 blue sky, white cloud, sunlight 等大自然的感覺的字眼之後,整個產出的氣氛也變得特別悠和 加入其他現代化的字眼如 future, glass wall, minimalist 之類的也可以做到類似效果 不過我覺得最特別的是加入了 (((hong kong))) 為背景所產出來的,不知道為甚麼有一種未來城市的感覺(?…
再見 Typora,你好 MarkText!
話說我自大學開始我就很喜歡用 Typora 來做筆記,但是最近它開始要收費了然後 Beta 版本的 Typora 連啟動都啟動不了。 嘛,軟體要收費我覺得是沒問題,但是像 Typora 這種一點預先通知都沒有,直到前幾天突然急用要啟動它的時候才彈出不能用的通知,真的超級沒良心。由於是急用所以我就先用一個開源的 keygen 來應付一下,連接在下面: https://github.com/taozhiyu/TyProAction 但是,由於按照它的條款,使用這 keygen 產出的授權只能夠使用 24 小時,所以在處理完手上的工作之後我就把用了快 3 年的 Typora 刪除掉正式找替代品了。在幾個小時後我找到了一個完美的代替開源方案: MarkText https://github.com/marktext/marktext 我覺得這個應該就不用多說了,就是一個很好用的開源 Markdown Editor 軟體。 它可以支援自定的字體(這裡我把它預設的換成了 Noto Sans HK Medium),也能夠透過 Ctrl + J 叫出旁邊的 title list。 至於怎樣把它設定到跟 Typora 的 hotkey 一樣,你可以到 File > Preference 那邊,在 Key Bindings 下找到以下功能並把 hotkey 改成 Ctrl + {號碼} 這樣你就可以直接無痛轉用到 MarkText 了!
便宜又好用的 SOP8 IC 清單
這裡收集了一些最近我發現的 SOP-8 IC,如果剛好你在找一些簡單的替代 IC 可能會在這裡找到喔! 型號用途備注 TC118S 單馬達驅動 IC (類 H 橋)1.8A MaxLM386音頻放大器TC4056A鋰電充電管理器,可替代 TP4056AO4496N-Channel MOSFET30V / 10AAO4435P-Channel MOSFET30V / 10ANE555DR就 555 啊,但是在 SOP8 包裝TP4333鋰電池充放同步升壓管理器 4.2V 1A XPT8871 LTK5128音頻功放5WM62429數字電位器(需接 MCU 使用)XL1509降壓3V / 5V/ 12V 版本CN5711LED 驅動(使用 PWM 調光暗)MOC213R2M光電耦合元件TP8485ERS-485 / RS-422 接口
神奇蹦蹦的 IC 與他們的用法
最近我在世界上其中一個最大的電子零件零售商的網站隨便看的時候,發現了一批不錯的 IC,於是順便把這些新發現記錄下來,之後需要用的時候就方便很多了! 基本中的基本 首先,最基本中的基本就是一些大家都在用,到處可見的 IC。由於這些 IC 的線路圖和模組設計教學整個網絡上都是,這裡就直接省略跳過詳細解釋它們的用途。通常在創客的 DIY 中最常見的就是: TP4056 - 單節 3.7V 鋰電池 1A 充電晶片XL6009 - 直流到直流升壓晶片LM2596(s) - 直流到直流降壓晶片 一些比較少見但是還是整個網絡上都是的晶片: MP1584(EN) - DC 可調降壓晶片 (小型 DIY 降壓用)D0505S-1W (D0505S-2W) - 5V DC 到 5V DC 直流隔離器(用於藍牙接收器與喇叭驅動電源隔離用)AMS1117-x (x 可以是 3.0, 3.3, 5.0 等) - 12V DC 到 x 的 LDO8205A + DW01 - 鋰電池保護板 很多時候 Maker 為了做帶電池的裝置就是用 TP4056 + XL6009 / MP1584 這樣配合著用,可是這樣做很浪費空間,所以我就開始找不少關於電源管理的方案,以下的應該就已經踏進沒甚麼人知道的領域了。 5V 0.8A 充放控制器 - HT4928(s) HT4928 是一片用起來很方便的鋰電池充電和升壓輸出的晶片。通常你很容易在那些便宜的單節 18650 行動充電器 (充電寶)裡面找到它。雖然用它來充手機是超級的慢,但是作為一些低功率裝置的供電(例如 Pi zero w)來說是不錯的選項。 5V 1A 充放控制器 - TP4333 如果 0.8A 差了一點點才夠,你可以考慮使用 TP4333。它也是一個用於行充的電源方案,但是用的外接零件會多幾個(R1,S1 跟 D5 如不需要手電筒功能可省略)。 5V 2A 充放控制器 - IP5306 / IP5307 這是一片大功率的鋰電充電和升壓晶片。能夠在 SOP8 package 裡做到 10W 的同時充放電,還帶 4 顆 LED 作電量顯示。(注:這東西發熱滿厲害的,記得底部的銅要鋪好鋪滿) 順帶一提,如果 IP5306 太貴,你可以試試看用替代用 IC FM5324 鎘鎳氫電池充電器 - CJC5122 / ASC0304B 這是一片 NiMH 充電器 IC,支援 1 到 4 顆的 NiMH 電池充電,預設是以 300mA 的充電速度來充。以下為 3.6V NiMH (3 顆串流)時的電路圖(R1 R2 及 R3 在不同配置下需要變更其電阻值) 單節鋰電池保護晶片 - XB8887A 通常的保護板需要使用兩塊晶片來做保護功能,可是這一片就能做到單片保證的功能。對於需要用到 18650 同時對空間要求很高的 project 很有用。 Charger 的部分可以配合 TP4056 晶片使用,這樣兩塊 SOP8 的晶片就能做到原本要一整片指甲大小的 PCB 的功能。 更小的單節鋰電池保護晶片 - XB5306A 如果 SOP8 還是太大,你可以考慮用這一片 XB5306A 。 使用 SOT23-6 包裝,真的打個噴嚏就不見了。電路圖跟上面的相近,Over current cutoff 電流量則降至 3A 使用 SOP8 Package 的升降壓晶片 - XL6007 對於一些對厚度很有要求的 project,要放進 XL6009 可能會有一點難度。這個時候就可以考慮使用 XL6007 了。這一片 SOP8 的晶片與 XL6009…
KIOXIA 32GB EXCERIA Micro SD 卡跑分
嗯,就大概這樣… 嘛,對於一張 36HKD 的卡來說不能要求太高吧(?)
目前第 1 頁,共有 2 頁