不明原因,我的 Steam 手把的其中一顆電池很難退出,有時還需要用鑷子硬摳,但很怕破壞到電池的保護殼導致漏液。
今天剛好有六角螺絲起子可以轉開螺絲,就嘗試自己修:
- 握把上總共有 4 支螺絲
- 將電池蓋打開,撕掉操作說明的貼紙後,還可以看到 3 個螺絲鎖孔
7 支螺絲都鬆開以後,便可把背板取下,換看到以下機構:
檢查了一下,可能導致電池退出困難的原因,可能是彈簧片的品質不佳,左右鬆緊不同:
先用鉗子壓鬆彈簧片,再觀察一陣子確認狀況是否有好轉。
軟體開發、伺服器和生活瑣事
不明原因,我的 Steam 手把的其中一顆電池很難退出,有時還需要用鑷子硬摳,但很怕破壞到電池的保護殼導致漏液。
今天剛好有六角螺絲起子可以轉開螺絲,就嘗試自己修:
7 支螺絲都鬆開以後,便可把背板取下,換看到以下機構:
檢查了一下,可能導致電池退出困難的原因,可能是彈簧片的品質不佳,左右鬆緊不同:
先用鉗子壓鬆彈簧片,再觀察一陣子確認狀況是否有好轉。
原本以為錄影會影響到遊戲順暢度,沒想到跑 Deemo 再加上 1080p 錄影,居然可以順順的玩遊戲,且影片也很清晰:
看了一下 meta data,似乎有上 60 fps,實在很酷
在電腦上播放原始檔,覺得畫面和聲音有一點時間差,可能需要會去重新校正時間吧,感覺半個小時跑不掉
標題不知道寫什麼好,反正外掛說 SEO 100 分 …..
在開始聊 Meilisearch 之前,我想先來聊一下全文檢索。
MySQL 搜尋功能都是精確搜尋,也就是搜尋的關鍵字一定會出現。例如:
SELECT title FROM news WHERE news_content like '%逢甲夜市%'
以上的語法,搜尋結果中一定會包含「逢甲夜市」四個字。
但若我需要模糊搜尋,搜尋「逢甲」或是「夜市」,該怎麼辦?
這個時候要改用 MySQL 的全文檢索功能。
需要被全文檢索的欄位,必須先建立 fulltext 的索引:
create index full_text_idx_news on news (news_content) using full_text
搜尋時就可以使用全文檢索語法:
SELECT title FROM meilisearch_index_urls WHERE match(news_content) AGAINST ("逢甲夜市")
這時「逢甲夜市」、「逢甲」、「夜市」應該都有機會被列出來,但是準確度並不高。
以英語系的語言,要將詞彙區分出來較為容易,因為每個詞中間都有空白:
This is night market
很明顯可以分成四個詞:
中文就沒有這麼方便了,以「這是夜市」來說,這句話中一個空白都沒有,只能依照字詞長度做分割:
將所有排列組合全部列出以後,再用其他文章出現的字詞,將常用詞會出現的機率 (詞頻) 將機率大的列出。
這裡介紹中研院花了數年開發出來的中文斷詞系統 (CKIP),他不但能將詞彙列出,甚至還可以便辭性與外來語:
要成精準的分中文字詞,需要先有一個語料庫,才能較準確的搜尋與分析。而這次要介紹的 Meilisearch,就有支援不同語言的分析,所以在全文件檢索上的精確度高上許多。
Meilisearch 是一個使用 Rust 開發的全文檢索引擎,有以下特點:
先開啟 Meilisearch Github 官方網站中的 release 頁面,先抓穩定板 (這裡以 v1.10.3 為主),在下方「assets」選擇適合你的 binary 檔下載。
剛下載的 binary 沒有執行權限,使用 chmod 給他執行全賢執行權限:
chmod +x meilisearch-linux-amd64
安裝到這裡,就算是結束了。
預設的啟動方式,就是直接行 Meilisearch:
啟動後除了可以看到他們 logo 以外,往下一些還可以看到他建立了一個目錄 ./data.ms
作為資料除存使用,這邊主要儲存索引黨。
Meilisearch 使用 RESTful API,所以參考官方文件,透過 curl 便可確定是否已經能正常運作:
這邊使用 GET /indexes
來要求 Meilisearch 列出所有的 indexes,剛安裝好的當然沒什麼東西,所以 results
是空的沒錯。
Meilisearch 的資料為 document
,不是資料表,所以資料只要標明欄位名稱、內容,級可以被建立索引,且前後的 document 其使欄位不同也可以被接受。
這裡準備一個範例 document:
[ { "id": 1, "name": "日升", "phone": "0987654321", "tag": ["programming", "photograing", "readding"] }, { "id": 2, "name": "日落", "tag": ["programming", "PHP", "back-end", "docker"] } ]
然後按照 Meilisearch add documents 的說明新增資料:
這邊 Meilisearch 並不會告訴你是否成功,因為所有的動作都會先進度工作佇列,再慢慢處理。
執行後拿到的 tasekUid
是「0」,我們可以再使用這個 ID 去查詢執行狀態:
curl -X GET 'http:///localhost:7700/tasks/0'
task 這邊回有很詳細的狀態,像是成功或失敗,開始時間、結束時間等等。
操作沒有很複雜,看一下 Meiliserch 官方文件差不多都可以解決。
我這邊建立索引的新聞內容,目前放在自家網站 Zeroplex
的新聞搜尋工具,大家可以拿一些奇怪的中文字去搜尋看,Meilisearch 全文檢索功能在中文處理上效果不錯
上述新聞搜尋工具,目前為以下項目做全文檢索:
搜尋會回傳的內容有:
目前使用狀況大致如下:
document
數量約 140 萬筆目前使用的狀況:
以下是我在 KaLUG 分享時使用的簡報,歡迎大家參考:
Raspberry Pi Pico W Getting Start 的範例程式其實蠻簡單的:
import network from time import sleep wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect("Zeroplex", "wifi-password") while wlan.isconnected() == False: print('Waiting for connection...') sleep(1) print(wlan.ifconfig())
但事實上這段 Pico W 的行為會和程式碼有一段差距。
先來看一下 active()
這段:
wlan.active(True) wlan.connect("Zeroplex", "wifi-password")
在啟用 wifi 以後,必須先掃描所有 wifi SSID。掃描會花上一段時間,因此若不先等待掃描完畢,而直接 connect()
可能會出現錯誤,像是「SSID 不存在」之類的。
較好的寫法會是:
wlan = network.WLAN(network.STA_IF) wlan.active(True) # wait for SSID scan and discover sleep(5) # connect wlan.connect("Zeroplex", "wifi-password") # check connection if False == wlan.isconnected(): print('failed to connect') else: print('connected')