阿珏的部落格的國際化之路

最近,我給個人部落格來了次「大動作」—— 從單語言版本升級到了 多語言站點(簡體中文、繁體中文、英語、日語), 並且全流程實現了自動化。💪 主要包括: 自動同步主站文章 自動 AI 翻譯內容 自動建構與部署多語言站點 為何選擇 Hugo? 因為它那句自信的口號: 「The world’s fastest framework for building websites.」 —— 就這句話,我就決定是它了 😆。 不過我沒有採用「一套主題多語言切換」的傳統做法, 而是讓 每種語言都有獨立主題。 這樣每個語言版本都能保留自己的美學與排版風格, 真正做到「文化層面的在地化」。 設計目標與約束 🎯 語言:支援簡中、繁中、英文、日文,未來還可擴展。 主題:每種語言使用最合適的 Hugo 主題,而非強行複用。 內容同步:所有語言共用一份內容儲存庫,按需翻譯。 部署策略:各語言獨立建構與發布,可部署到不同分支或網域。 客製化頁面:像「友鏈」、「書房」、「歸檔」等頁面要在多語言下保持一致體驗。 多語言配置策略 🧩 我為每個語言單獨準備了一個設定檔: config/<lang>.toml,它們主要負責: 指定主題(例如 theme = "PaperMod")。 定義該語言特有的 title / description / keywords。 重寫選單設定 [[params.menu]],以匹配不同主題的導航結構。 注入客製化樣式,確保整體視覺一致。 這種結構非常清晰,也方便未來擴展更多語言版本。 GitHub Actions 自動部署矩陣 ⚙️ CI/CD 部分完全交給 GitHub Actions 來處理。 在 .github/workflows/hugo.yml 中,我使用了 矩陣建構, 為每種語言獨立建構、發布: matrix: include: - lang: en config: config/en.toml publish_branch: dist-en - lang: zh-cn config: config/zh.toml publish_branch: dist-zh - lang: ja config: config/ja.toml publish_branch: dist-ja - lang: zh-hant config: config/zh-hant.toml publish_branch: dist-zh-hant 建構階段 👇 ...

2025年11月2日 · 1 min · MoeJue

如何自製一個便攜式顯示器

如何手搓一個便攜式顯示器 前言 家裡有一台老舊的筆記型電腦,除了電池不行了,其他部件都還能正常使用。然而,由於技術更新換代太快,這台筆記型電腦除了瀏覽網頁外,幾乎沒有其他用途。丟掉可惜,賣掉又不值錢。所以我決定將它改造成一個便攜式顯示器,這樣就可以連接筆記型電腦、桌上型電腦,玩遊戲、看影片了,讓它繼續發揮餘熱。 順便提一下,硬碟已經被我改造成了一個行動硬碟。 材料準備 廢棄的顯示器 LED螢幕驅動板 螢幕排線 按鍵板 高壓板 電源 (12V 5A) 主要材料就是這些了,直接上某寶就可以買到,價格也不貴。 電源還是從我爸頸部按摩器上直接拆下來的,又省一筆。 改造過程 拆開筆記型電腦顯示器,將螢幕取出來。 如果你不知道你的螢幕所對應的驅動板,可以將螢幕後面的參數拍一張照片給商家,他們會根據你的參數給你推薦合適的驅動板。 當然如果你是電路大佬,也可以自己設計圖紙打樣手搓驅動板。 接線並用熱熔膠固定 ps:熱熔膠真是窮人的3D打印機 通電測試 我這邊為了圖省事,已經讓商家幫我裝好了相應的驅動。 接入訊號 測試按鍵板功能調節 使用瓦楞紙做一個外殼 看來我用廢紙皮做外殼的天賦還是不錯的。怕太醜還貼了張壁紙上去。 家裡有3D打印機的小夥伴直接設計外殼打印出來,效果會更好。 成品: 前面被熱熔膠黏得有點慘不忍睹。

2025年4月13日 · 1 min · MoeJue

一款開源簡潔高顏值的酷狗第三方客戶端V1.0.0 Beta

MoeKoe 音樂 一款開源、簡潔、高顏值的酷狗第三方客戶端 🌎 GitHub 儲存庫 | 📦️ 下載安裝包 | 💬 瀏覽部落格 前言 早在約 10 年前,當時我還在使用網頁版 QQ 時就已經開始使用酷狗音樂了(也是十多年的老粉絲了),所以這些年收藏的歌曲全部都在上面。後來我也嘗試開始使用網易雲或 QQ 音樂,也嘗試把酷狗的歌單匯入進去,但是效果都不盡理想。我聽的大多是日漫 OP,好多歌曲都沒辦法找到。 兜兜轉轉最後還是回到酷狗,但是在 Mac 端的酷狗,時常可能會出現不能播放的情況,雖說介面沒什麼功能,但也挺好的。在網友的推薦下,我現在一直是在酷狗的概念版上聽歌,並且是市面上為數不多能免費聽 VIP 歌曲的音樂播放軟體了,強力推薦。 我在我的個人介紹頁面說我特別喜歡聽歌,尤其是日漫 OP。怎麼證明呢?(之前我網頁版歌單也年久失修了)那就自己開發一個音樂播放器。 ✨ 特性 ✅ 使用 Vue.js 全家桶開發 🔴 酷狗帳號登入(掃碼/手機/帳號登入) 📃 支援歌詞顯示 📻 每日推薦歌曲 🚫🤝 無任何社交功能 🔗 官方伺服器直連,無任何第三方 API ✔️ 每日自動領取 VIP,登入即是 VIP 🎨 主題色切換 👋 啟動問候語 ⚙️ 多平台支援 🛠 更多特性開發中 待辦清單 [ ] 📺 支援 MV 播放 [ ] 🌚 自動切換淺色/深色模式 [ ] 👆 支援 Touch Bar [ ] 🖥️ 支援 PWA,可在 Chrome/Edge 中點擊網址列右邊的 ➕ 安裝到電腦 [ ] 🟥 支援 Last.fm Scrobble [ ] 🎧 支援 Mpris [ ] ⌨️ 自訂快捷鍵和全域快捷鍵 [ ] 🤟 多語言支援 [ ] 📻 桌面歌詞 [ ] ⚙️ 系統架構優化 [ ] 🎶 歌曲、歌單管理/收藏、取消收藏 📦️ 安裝 請造訪本專案的 Releases 頁面下載安裝包。 ...

2024年11月3日 · 2 min · MoeJue

重生之我要做商城 - 萌音商城V1.0上線

萌音系列的第N+1個項目來了呢。這其實又是一個鴿了好幾年的項目了,這回總算能把坑填上了。 先上項目地址: https://MoeKoe.cn 我為什麼一直在做項目? 這個問題就很有意思了,為什麼一直在做各種項目,而且還是不掙錢的東西。接觸過我之前一些項目的小夥伴都知道我開發什麼項目都是本著自己用的原則在創作的,當然這次也不例外。一直我就想在某個平台賣賣我那些留著沒用,丟了捨不得的小玩意,同時分享好玩有趣的產品給大家(未來可能還有我自己的IP產品)。「想把最美好的事和物分享給最美好的你」就算,本著「別人有我也要有」的原則,我也得有。 如果說我只是想賣點小玩意,我為何不直接上淘寶、閒魚這樣的平台呢?退一萬步講,就算不上這些平台,我也可以自己搭建一個現成的商城系統啊,現在市面上成熟好用的系統一抓一大把喔,為何還要自己開發呢? 一句話,因為我喜歡,這是我的愛好,我喜歡創造,喜歡做點有意思的東西和事。我想成為一個厲害而又有趣的人,而不是一個只會活著的普通人,我想認識更多有趣的靈魂。厲害對於我的定義並不是說他技術有多厲害、賺錢有多厲害,而是一個人面對挫折和困苦的時候,依然能笑著面對,依然能保持樂觀、不忘初心,這樣的人,我願稱他為厲害的人。 明明是一個發布新項目的文章,又給我寫成大白話部落格了,哈哈哈。 項目介紹 最近在搞什麼?在搞粉嫩粉嫩的東西,一個二次元少女萌系風格的魔法少女商城。 歡迎來到魔法少女的奇幻世界,開啟探索二次元無限可能的冒險之旅!這是專為二次元愛好者量身打造的線上商城。在這裡,你能找到最閃耀的魔法道具、最萌系的變身服飾,還有豐富多樣的二次元周邊商品。無論你鍾情於可愛的萌物,還是酷炫的收藏品,這裡都能滿足你對二次元的所有熱愛與期待! 點開網址你會發現一個讓你眼前一亮(粉)的感覺,沒錯,這就是我想要的風格,粉嫩粉嫩的,少女心爆棚,卡哇伊的感覺,這樣才能突出我的個性。 技術棧 Vue.js3 Vite Pinia Axios Node.js Express Mysql Nginx 前後端分離 MySQL執行緒池 Vue.js全家桶真是太棒了,省去自己寫原生的煩惱,目前國際化插件(i18n)這個版本還沒有上,由於市面上的UI庫並不直接符合我對這個項目的定位和我的個性,所以並沒有使用現成的界面庫,全靠自己手撸。 介紹: 支援虛擬幣USDT(只需填寫錢包地址,自動監控到帳,無須外置程式,監控系統有新訂單自動啟動,30分鐘無新訂單自動休眠,減少資源消耗) 支援支付寶當面付支付,即時到帳,自動回調 支援使用者註冊、登入、登出、修改密碼、修改頭像、商品評論 支援商品管理、商品分類管理 支援訂單管理、訂單支付、訂單發貨、物流查詢 支援商品訂單數據分析 全站響應式佈局 前後端分離 MySQL執行緒池 系統的基本資訊設定 第一個版本就只增加了基礎和必要的功能,新功能在設計的時候就已經考慮到了,資料庫和程式碼都做了預留(所以當你看到某一個按鈕點擊了沒有反應的時候不要緊張,因為它後面根本就沒有程式碼),會在未來的版本中進行添加。目前商城售賣的是一種實物發貨的形式,未來會加上虛擬商品的售賣,基本就是把萌音發卡的功能都直接給合併進來了。 我對這個項目的命名是mall,而不是shop,所以之後它有機會變成一個商場,而不只是一個商店。 未來: 多商戶模式。直接使用者申請入駐商城成為商家,借助萌音商城進行售賣自己的產品 商品多產品分類。產品更多的規格分類 更多的支付方式。因為目前作者沒有其他的支付權限,僅對接了兩個 支援虛擬商品。算是把發卡的功能給集成進來了 商品海報宣傳圖生成 郵件系統。可有可無的通知功能而已 右下角的多功能選單。下方的笑臉小人,會成為一個智能導航系統 增加商品介面數據顯示。數據一目了然 多語言支援(i18n)。跟隨國際化潮流,走向世界 簡訊系統。跟郵件系統一模一樣 Redis快取。本來是準備在這個版本加上去的,不過數據的控制也還好 暗黑模式。也是跟隨潮流 如何獲取原始碼? 贊助阿珏醬 233RMB+ 即可獲取原始碼。 曾經贊助過阿珏醬的小夥伴(如果之前贊助的總金額不足233需要進行補差價的形式,如果超過了233則只需再贊助1元重新簽訂契約即可直接獲得) 點擊這裡某社群官方交流群去贊助阿珏醬。因為放不了個人QQ連結,所以我放了群連結,加群@群主即可。 為什麼不設商業版? 為什麼不設商業版,而是贊助版,這有什麼區別呢?商業版,那就需要一個授權系統,同時可能還不一定提供原始碼,可能還需要提供技術支援,並且需要更多完善的功能。商業版的錢是給項目本身的,和作者是一種利益關係,一種商業合同的模式,作者需要對其(人)負責。(我特別不喜歡這種感覺,這可能就是我掙不到錢的原因吧) 而贊助版,贊助的是作者本人,是一種個人意願,一種朋友與朋友之間約定的一種契約模式,作者只對項目本身負責。 當然你可能會覺得我在玩文字遊戲,鑽文字的空子。所以嘛,這完全就是贊助行為了。雖然這次的贊助門檻有那麼點商業的氣息,那是因為我和我老婆們要恰飯的嘛 提示 贊助版提供Vue前端原始碼+編譯後的靜態檔案+Node.js後端源檔案。 所有贊助版獲得的都是源檔案,不存在加密或混淆的情況,還請不要洩露,同時也是保障自己的權益。 修改原始碼需要一定基礎程式設計知識,如果不會,請勿修改。 提供一次寶塔面板的部署服務。 網站的介面效果更傾向少女萌系風格,可能並不適用大眾向的產品,還請注意。 因為程式碼具有可複製性,契約一經簽訂,不可撤銷,還請諒解。 這次還是跟以往一樣採用了贊助版的模式獲取原始碼,為什麼這次又開放了原始碼的獲取呢?多少是受之前萌音社群的影響吧,萌音社群是我花了兩個月多精心寫出來的,同時沒有接受贊助獲得原始碼這個方式,純屬自己營運,那些要贊助的都被我勸退了,雖然最後還是收到了一筆贊助。最後呢,感覺對不起萌音社群,被自己給砸手裡了,沒讓更多人知道它的存在。那為什麼不直接開源呢?那樣我反而覺得更對不起這個項目,會讓人覺得這是一個觸手可得的東西,反而不再珍視它。雖然沒有直接開源,但我會把項目相關的架構和設計思路和部分程式碼發出來,給大家參考,並不影響大家學習。 ...

2024年10月2日 · 1 min · MoeJue

使用ESP8266-NodeMCU開發板顯示一下我的QQ頭像

诶,說好的自己寫esp8266的開發板韌體的我回來了。 20年說好的,今天回來還願了 ESP8266串口WiFi模塊 - WiFi殺手 今天我們把OLED顯示屏也接上,我此次買的是4腳的OLED(128*64),不支持彩色顯示的。 NodeMCU開發板 NodeMCU是一個開源的IoT物聯網硬體開發板,由於它支持WIFI功能且使用方法十分類似Arduino開發板,所以近些年獲得了越來越多來自全世界的創客朋友們的青睞。NodeMCU尺寸與Arduino Nano類似。它並不是Arduino團隊開發的,但是我們也可以使用Arduino IDE 對它進行開發。 作為萬物互聯的IoT基礎,首先物聯網控制板的成本不能過高。高昂的物聯網控制元件不利於項目成本控制也不利於廣大創客愛好者學習和使用它。在這一點上,NodeMCU比樹莓派以及Arduino家族的IoT平台等更具優勢。 細心的朋友可能已經發現了,這會我開發板叫做ESP8266-NodeMCU。然而在其它的網站或資料中,有時是用ESP8266有時是用NodeMCU。那麼ESP8266和NodeMCU之間是什麼關係呢? ESP8266是一塊晶片(被鐵殼子包住的方形的東西),而NodeMCU則是以ESP8266晶片為核心的開發板,如下圖所示。 要想對ESP8266晶片來進行實驗操作是很困難的,因為我們很難將小小一枚晶片上的引腳與我們的電腦連接起來然後再進行上傳程式等操作。於是便誕生了圍繞ESP8266晶片的各種開發板。NodeMCU就是這些開發板中的一員。 NodeMCU開發板上的兩排插針與ESP8266晶片的引腳相連。有了開發板上的兩排插針,我們就可以很輕鬆的使用杜邦線將晶片的引腳接到實驗電路中。NodeMCU開發板上還配有USB接口以及電壓轉換電路。這些為我們提供了很大的便利。我們只要用一根USB數據線就可以輕鬆的實現為ESP8266供電以及上傳程式的操作。當然,NodeMCU開發板上的電路功能還不止這些,我就不再繼續延伸下去了 驅動的安裝 雖然之前已經講過開發板的驅動安裝了,但是不夠詳細。 目前市面上的ESP8266驅動有多種,即使是同一塊NodeMcu的開發板驅動也可能是不一樣的。目前主流的是CH340和CP210X的驅動 驅動的下載請直接去晶片的製造商的官網下載即可 CP210X:https://cn.silabs.com/developers/usb-to-uart-bridge-vcp-drivers CH340C:https://www.wch.cn/downloads/CH341SER_EXE.html 下載適合自己平台的驅動安裝程式 需要看清楚自己的串口晶片型號是否在驅動程式的支持範圍內 如何查看自己的開發板需要什麼驅動 直接看,下圖中豎著的長方形黑條,那個就是USB轉串口晶片。上面會寫明晶片的型號名稱 問你買的商家 顯示屏的焊接 不要焊接錯了,不然會燒壞晶片的 OLED接線: GND - GND VCC - VCC SCL - GPIO5(D1) SDA - GPIO4(D2) 烙鐵加熱中 下面就是焊接好的,注意接線,不一定是按我這個順序的,要看名稱 Arduino IDE的安裝 下載arduino IDE https://www.arduino.cc/en/software 安裝 安裝還要我教? 配置 點擊工具-開發板-開發板管理器,在設置中寫上開發板地址:http://arduino.esp8266.com/stable/package_esp8266com_index.json 之後就會自動下載相應的支援庫文件了,期間需要保證網絡的科學性 選擇開發板 NodeMCU1.0(ESP-12EModule) 選擇端口 在電腦的設備管理器中找到你的開發板的COM口 Arduino代碼 有時候我覺得我逼逼叨叨說一大堆還不如直接上代碼來的直接,我覺得你肯定也是想直接看代碼的而不是聽我說一堆廢話 我也盡可能在代碼中註釋了(編寫arduino代碼請遵循C/C++語言規範) 下列的例子中,連接WiFi使用的是庫,首次連接需要使用手機連接ESP8266發送出來的WiFi先進行配網操作。寫出屏幕使用的是庫,支持中文直接寫出 這是一個簡單的連接WiFi和屏幕顯示圖片的示例 #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <ESP8266WiFi.h> #include <NTPClient.h> #include <WiFiManager.h> #include <U8g2lib.h> #define SDA 4 // SDA引脚,默认gpio4(D2) #define SCL 5 // SCL引脚,默认gpio5(D1) Adafruit_SSD1306 oled(128, 64, &Wire,-1); //OLED 屏幕实例化 WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP,"pool.ntp.org", 8*3600, 60000); U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE); // 选择显示屏幕 // 只执行一次 void setup() { u8g2.begin(); // 初始化 u8g2.enableUTF8Print(); // UTF8允许 u8g2.setFont(u8g2_font_wqy12_t_gb2312b); //字体大小 u8g2_font_wqy15_t_gb2312b // 初始化屏幕 OLED_Init(); OLED_Showchin(1,13,"正在连接WiFi....",0); WiFiManager wifiManager; wifiManager.autoConnect("ESP8266"); OLED_Showchin(1,27,"WiFi连接成功!",0); OLED_Showchin(1,41,"名称: " + WiFi.SSID(),0); OLED_Showchin(1,55,"IP: " + WiFi.localIP().toString(),1); // 获取时间 timeClient.begin(); u8g2.setFont(u8g2_font_wqy15_t_gb2312b); //字体大小 u8g2_font_wqy15_t_gb2312b OLED_Showchin(1,13,"宁小建",0); OLED_Showchin(1,27,"hhhhhhhhhhhh",0); OLED_Showchin(1,55,"大傻逼哈哈哈",1); timeClient.update(); OLED_Showchin(1,20,"当前北京时间: ",0); OLED_Showchin(1,41,timeClient.getFormattedTime(),1); delay(1000); OLED_img(); } // 重复执行程序 void loop() { // 更新时间 // timeClient.update(); // OLED_Showchin(1,27,"当前北京时间: ",0); // OLED_Showchin(1,41,timeClient.getFormattedTime(),0); } // 打印输出到屏幕(支持中文) void OLED_Showchin(uint8_t x, uint8_t y, String string, uint8_t boot) { u8g2.setCursor(x, y); //设置显示坐标 u8g2.print(string); // 指定缓存区需要打印的字符串 u8g2.sendBuffer(); // 将定位信息发送到缓冲区 if(boot == 1){ delay(1000); u8g2.clearBuffer(); // 清除缓存,其实初始化里有清除,循环时一定要加上 } } // 屏幕初始化 void OLED_Init() { oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); //"SSD1306_SWITCHCAPVCC"表示显示器为OLED ,"0x3C"为OLED屏幕默认通信地址 oled.setTextColor(WHITE);//开像素点发光 oled.clearDisplay();//清屏 } // 输出屏幕 void OLED_ShowString(uint8_t x, uint8_t y, uint8_t font_size, String string) { oled.setTextSize(font_size); //设置字体尺寸 (>=1) oled.setCursor(x, y); //设置显示坐标 oled.println(string); //显示内容 oled.display(); //开启显示 } // 绘画 void OLED_img() { // 图片数据 const unsigned char gImage_1[518] = { 0X00,0X01,0X40,0X00,0X40,0X00, 0X00,0X40,0X00,0X00,0X00,0X3E,0XF0,0X00,0X00,0X80,0X00,0X00,0X00,0X1F,0XE0,0X00, 0X00,0X00,0X00,0X00,0X00,0X06,0XB0,0X00,0X01,0X00,0X00,0X00,0X00,0X03,0XF8,0X00, 0X00,0X00,0X00,0X00,0X00,0X03,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XDC,0X00, 0X04,0X00,0X00,0X00,0X00,0X01,0XC0,0X00,0X0E,0X00,0X00,0X00,0X00,0X00,0X80,0X00, 0X06,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X00,0X00,0X00,0X10,0X00,0X00,0X00, 0X08,0X00,0X00,0X00,0X0E,0X00,0X00,0X00,0X08,0X00,0X00,0X00,0X8F,0X00,0X00,0X00, 0X00,0X00,0X02,0X02,0X47,0X00,0X00,0X00,0X00,0X00,0X01,0X10,0X63,0X80,0X00,0X00, 0X00,0X00,0X01,0XC9,0X73,0XC0,0X00,0X00,0X00,0X00,0X00,0XE4,0X79,0XE0,0X00,0X00, 0X00,0X02,0X00,0XFA,0XF9,0XE0,0X00,0X00,0X10,0X02,0X00,0X7D,0X8C,0XF0,0X00,0X00, 0X10,0X03,0X01,0X7E,0X90,0XF1,0X80,0X00,0X10,0X01,0X20,0XFD,0X1C,0X7B,0XE0,0X00, 0X00,0X01,0XA0,0X7D,0X03,0X7B,0X20,0X00,0X10,0X01,0XD8,0XFF,0X8B,0X7E,0X30,0X00, 0X00,0X01,0XFC,0X7F,0X83,0XB6,0X10,0X00,0X00,0X00,0XF7,0XFF,0XC7,0XBE,0X10,0X00, 0X00,0X01,0X8F,0XFF,0XE3,0XF6,0X10,0X00,0X01,0X01,0X4F,0XFF,0XFF,0XFF,0X10,0X00, 0X00,0X01,0XCF,0XFF,0XFF,0XDF,0X10,0X00,0X00,0X01,0XC3,0XFF,0XFF,0XDF,0X70,0X00, 0X01,0X03,0XE3,0XFF,0XFF,0XDF,0XE0,0X00,0X04,0X01,0XE7,0XFF,0XFF,0XDF,0XE4,0X00, 0X07,0X00,0XFB,0XFF,0XFF,0XDF,0XC0,0X00,0X07,0X00,0XFB,0XFF,0XFF,0XFE,0X00,0X00, 0X13,0X00,0X7F,0XFF,0XFF,0XFC,0X00,0X00,0X01,0X20,0X3F,0XFF,0XFF,0XFC,0X00,0X00, 0X00,0X00,0X3F,0XFF,0XFF,0XF8,0X00,0X0B,0X00,0X00,0X1F,0XFE,0X0F,0XF8,0X00,0X1F, 0X00,0X00,0X1F,0XF8,0X6F,0XF0,0X00,0XFF,0X00,0X00,0X1F,0XE1,0XFF,0XF0,0X05,0XFF, 0X00,0X00,0X0F,0XF3,0XFF,0XE0,0X03,0XFF,0X00,0X40,0X0F,0XF7,0XFF,0XC0,0X07,0XFF, 0X00,0X00,0X07,0XFF,0XFF,0X80,0X07,0XFF,0X08,0X00,0X07,0XFF,0XFF,0X00,0X0F,0XFF, 0X00,0X00,0X23,0XFF,0XFE,0X00,0X0F,0XFF,0X00,0X08,0X60,0XFF,0XFE,0X00,0X0F,0XFF, 0X00,0X40,0X20,0X3F,0XFE,0X00,0X1F,0XFF,0X00,0X00,0X10,0X0B,0XFF,0X80,0X1F,0XFF, 0X00,0X00,0X40,0X00,0X3F,0X00,0X1F,0XFF,0X00,0X00,0X10,0X00,0X3F,0X00,0X1F,0XFF, 0X20,0X00,0X02,0X00,0X3F,0X00,0X3F,0XFF,0X00,0X00,0X00,0X00,0X7F,0X80,0X3F,0XFF, 0X00,0X00,0X00,0X10,0X7F,0X80,0X7F,0XFF,0X00,0X00,0X00,0X80,0X7F,0X80,0X7F,0XFF, 0X10,0X00,0X00,0X00,0X7F,0X80,0XFF,0XFF,0X30,0X00,0X00,0X00,0X7F,0X80,0XFF,0XFF, 0X10,0X10,0X00,0X00,0X7F,0XC1,0XFF,0XFF,0X00,0X00,0X00,0X00,0X7F,0XF3,0XFF,0XFF, 0X00,0X00,0X01,0X00,0X3F,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X04,0X3F,0XFF,0XFF,0XFF, 0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0X00,0X00,0X10,0X80,0X1F,0XFF,0XFF,0XFF, 0X01,0X00,0X00,0X05,0X1F,0XFF,0XFF,0XFB,0X00,0X00,0X00,0X00,0X1F,0XF7,0XFF,0XFC, 0X00,0X00,0X00,0X00,0X1F,0XFB,0XFF,0XFF,0X00,0X00,0X40,0X00,0X19,0XFF,0XFF,0XFF, }; oled.clearDisplay(); oled.drawBitmap(3, 1, gImage_1, 64, 64, WHITE); oled.display(); } ...

2024年6月16日 · 4 min · MoeJue

真 · 逃避現實

一直以來我都有一個想買VR設備的願望,今天終於圓了 在 @本群吉祥物 的推薦下,買了Oculus品牌的VR一體機 開卡省錢卡 -> 領優惠券 -> 儲值 -> 下單 -> 一氣呵成 (心在淌血) 由於Oculus品牌沒有進入中國市場等原因,所以我這也捆綁買了一個千兆的路由器 到貨就是兩個大箱子 一個是裝著VR本體的,商家額外贈送了一個USB充電電池,SMARTOOOLS西班牙品牌,貌似還行 另外一個箱子則是我的千兆路由器和好幾百一根的USB3.0 link線 長得跟個花生殼似的路由器 一堆看不懂的說明書,還是外置風扇(#哭笑)。由於這個路由器品牌也是國外的,三線插頭是歐洲標準,國內的三孔插座還得接個轉換器 外包裝 - 反面,下面放著一些熱門遊戲推薦 正面,簡約炫酷 包裝裡面的盒子,印著Oculus的logo 掀起蓋子,哇塞 Oculus Quest 六自由度VR,是目前市面上最強VR一體機 官方有附帶一對手柄電池,和設備基本操作說明書,和一本厚厚的詳細到看不懂的說明書 擺拍,主機+左右手柄 接下來就是開機上手,下載我心心念念已久的Beat Saber、VRChat……開啟我的逃避現實之旅…….. 後話: 一般開箱我都不做評測,因為專業的評測需要專業的學術知識去支撐,還需要會說那些厲害的術語。但是我不會,我也不想誤導看我文章的人,一本正經的胡說八道。我僅僅只是說我想說的話 讓我在VRChat裡等你們,之後有空的話我也會拍我遊玩的影片到小破站 如果有想進一步了解Oculus Quest的,我這邊推薦一個專業的評測影片。 Oculus Quest VR 讓我們離「刀劍神域」「頭號玩家」還有多遠? https://www.youtube.com/watch?v=2z-QyogFp9o (如果能打開的話)

2020年9月18日 · 1 min · MoeJue

Android 檢視 APK 安裝包的 AndroidManifest.xml 檔案

起因 上週在做安卓系統的廠商推送功能,某些機型無法離線廠推,所以準備解包apk看一下打包參數是否出問題。 序言 在Android開發中,可能需要從我們自己的應用程式跳轉到別的應用程式的介面,但是在不知道別的應用程式的包名以及類名(class name)的情況下,是很難做到這一點的。有個最簡單的方法就是下載應用程式的apk檔案,然後修改副檔名為zip或者rar,之後解壓縮檔案。在解壓縮出來的檔案中,就會有一個AndroidManifest.xml的檔案,但是打開之後,可能是亂碼,這就尷尬了,那怎麼辦呢? AXMLPrinter2.jar是一款常用的apk反編譯工具,主要用於反編譯apk檔案,包括包名、版本號和圖示等資訊,可以用AXMLPrinter2對androidmanifest.xml反編譯進行明文查看。 使用方法 1、 下載工具AXMLPrinter2.jar工具 地址:https://code.google.com/archive/p/android4me/downloads 2、 將要查看的AndroidManfist.xml檔案複製至與工具相同資料夾下 3、 在當前資料夾打開DOS視窗 4、 執行如下命令 java -jar AXMLPrinter2.jar AndroidManifest.xml >> AndroidManifest.txt 執行完該命令後會在該資料夾生成AndroidManifest.txt檔案,該檔案便是解碼後的檔案。 當然,可能有些執行後就會報錯:「‘java’ 不是內部或外部命令,也不是可執行的程式或批次處理檔案。」 這是因為沒有安裝Java環境或未配置環境變數導致的。 安裝JDK 首先先來回顧下安裝JDK的過程 下載JDK並安裝 JDK1.6、1.7、1.8任君選擇下載,想用哪個直接下載哪個吧 官方網站下載JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安裝很簡單,無腦下一步操作就行了,這裡不再贅述 配置JDK環境變數 (1)右擊電腦中的「我的電腦」,Win10為「這台電腦」,選擇「屬性」,選擇「進階系統設定」,在新介面中選擇「環境變數」,我們只編輯「系統變數」就可以了 (2) 點擊「新建」添加變數名為「JAVA_HOME」,變數值為「C:\Program Files\Java\jdk1.8.0_60」,這個值就是你安裝的JDK路徑,你安裝到了哪裡,就用那個地址就行 再新建一個變數名為「CLASSPATH」,變數值為「.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar」的變數,並確定保存,注意值內的「.;」不要漏掉,每一個符號都不能少 最關鍵的一步來了,找找有沒有叫「path」的變數,大小寫都行,沒有則新建,有則直接點擊「編輯」 如果已經有path這個變數了,那麼裡面一定保存了一些內容,我們不管它,為了更方便編輯,我們把其中的變數值先複製出來 然後將內容貼上到文字編輯器中,在內容的最前面添加內容「%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;」,結果如下 然後再把整個值複製後貼上到之前編輯的變數值中,確定保存。 回顧一下上面的步驟,其中總共添加了三個值: JAVA_HOME:C:\Program Files\Java\jdk1.8.0_60 CLASSPATH:.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar PATH:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 下面是驗證安裝是否成功 Win+R打開「執行」,輸入cmd後打開命令列 輸入「java」,正常會顯示一大堆的操作提示 輸入「java -version」,正常會顯示你安裝的java版本號資訊 輸入「javac」,正常會顯示javac的一些用法 完結撒花!

2020年4月19日 · 1 min · MoeJue

支付寶當面付對接

當面付顧名思義,面對面付款,幫助商家在線下消費場景下實現快速收款;當面付產品支援條碼支付和掃碼支付兩種付款方式。 我們這裡對接的就是掃碼支付 掃碼支付,指用戶打開支付寶錢包中的「掃一掃」功能,掃描商家展示在某收銀場景下的二維碼並進行支付的模式。該模式適用於線下實體店支付、面對面支付等場景。業務流程如下圖所示: 由於當面付的簽約非常簡單,允許個體工商戶/個人商戶簽約。所以該方式也被大量用於線上的掃碼支付,由於該方式違反了支付寶的相關條款,有一定風險,咱作為技術交流,暫且先拋開這個問題。 作為技術對接,即使你沒有簽約當面付產品,也是可以進行開發的。 支付能力直接涉及到交易與資金,為了方便開放者調試支付能力,開放平台已經準備好沙箱環境,包括沙箱環境帳號和沙箱版支付寶錢包,這樣開發者就可以在沙箱環境調試了。點擊了解如何接入沙箱並接入沙箱環境。 所以我這邊開發使用的是沙箱環境,畢竟裡面好多錢,隨便用。 首先先下載相應的開發語言的sdk 下載:https://docs.open.alipay.com/194/105201/ 掃碼支付文檔:https://docs.open.alipay.com/194/106078/ 配置密鑰 為了保證交易雙方(商戶和支付寶)的身份和數據安全,開發者在調用接口前,需要配置雙方密鑰,對交易數據進行雙方校驗。 下載支付寶開放平台開發助手進行密鑰生成。 生成密鑰後,開發者需要在開放平台開發者中心進行密鑰配置,配置完成後可以獲取支付寶公鑰 設計接入 由於我這邊的設計不需要用到輪詢(後面會說),所以沒有加上 以下是我業務中的相關代碼 public function pay(){ if (request()->isPost()) { // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线, // 需保证商户系统端不能重复,建议通过数据库sequence生成, $uid = Session::get('sq.uid'); $outTradeNo = order\_num() . $uid; // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费” $subject = '聚合平台用户积分充值'; // (必填) 订单总金额,单位为元,不能超过1亿元 // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】 $totalAmount = input('post.pay\_money/f'); if($totalAmount < 1){ return \['status' => 1, 'msg' => '最低充值金額1元'\]; } if($totalAmount > 9999999){ return \['status' => 1, 'msg' => '充值最大金額不能超過9999999元'\]; } // (不推荐使用) 订单可打折金额,可以配合商家平台配置折扣活动,如果订单部分商品参与打折,可以将部分商品总价填写至此字段,默认全部商品可打折 // 如果该值未传入,但传入了【订单总金额】,【不可打折金额】 则该值默认为【订单总金额】- 【不可打折金额】 //String discountableAmount = "1.00"; // // (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段 // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】 // $undiscountableAmount = "0.01"; // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号) // 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID //$sellerId = ""; // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元" $body = "聚合平台用戶積分儲值" . $totalAmount . '元'; //商户操作员编号,添加此参数可以为商户操作员做销售统计 // $operatorId = ""; // (可选) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持 // $storeId = ""; // 支付宝的店铺编号 // $alipayStoreId= ""; // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),系统商开发使用,详情请咨询支付宝技术支持 // $providerId = ""; //系统商pid,作为系统商返佣数据提取的依据 // $extendParams = new ExtendParams(); // $extendParams->setSysServiceProviderId($providerId); // $extendParamsArr = $extendParams->getExtendParams(); // 支付超时,线下扫码交易定义为5分钟 $timeExpress = "5m"; // 商品明细列表,需填写购买商品详细信息, // $goodsDetailList = array(); // // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail // $goods1 = new GoodsDetail(); // $goods1->setGoodsId("apple-01"); // $goods1->setGoodsName("iphone"); // $goods1->setPrice(3000); // $goods1->setQuantity(1); // //得到商品1明细数组 // $goods1Arr = $goods1->getGoodsDetail(); // // 继续创建并添加第一条商品信息,用户购买的产品为“xx牙刷”,单价为5.05元,购买了两件 // $goods2 = new GoodsDetail(); // $goods2->setGoodsId("apple-02"); // $goods2->setGoodsName("ipad"); // $goods2->setPrice(1000); // $goods2->setQuantity(1); // //得到商品1明细数组 // $goods2Arr = $goods2->getGoodsDetail(); // $goodsDetailList = array($goods1Arr,$goods2Arr); //第三方应用授权令牌,商户授权系统商开发模式下使用 $appAuthToken = "";//根据真实值填写 // 创建请求builder,设置请求参数 $qrPayRequestBuilder = new AlipayTradePrecreateContentBuilder(); $qrPayRequestBuilder->setOutTradeNo($outTradeNo); $qrPayRequestBuilder->setTotalAmount($totalAmount); $qrPayRequestBuilder->setTimeExpress($timeExpress); $qrPayRequestBuilder->setSubject($subject); $qrPayRequestBuilder->setBody($body); // $qrPayRequestBuilder->setUndiscountableAmount($undiscountableAmount); // $qrPayRequestBuilder->setExtendParams($extendParamsArr); // $qrPayRequestBuilder->setGoodsDetailList($goodsDetailList); // $qrPayRequestBuilder->setStoreId($storeId); // $qrPayRequestBuilder->setOperatorId($operatorId); // $qrPayRequestBuilder->setAlipayStoreId($alipayStoreId); $qrPayRequestBuilder->setAppAuthToken($appAuthToken); // 调用qrPay方法获取当面付应答 require ROOT\_PATH.'extend/f2fpay/config/config.php'; $qrPay = new AlipayTradeService($config); $qrPayResult = $qrPay->qrPay($qrPayRequestBuilder); // 根据状态值进行业务处理 switch ($qrPayResult->getTradeStatus()){ case "SUCCESS": $response = $qrPayResult->getResponse(); Db::name('order') ->insert(\[ 'uid' => $uid, 'pay\_id' => $outTradeNo, 'money' => $totalAmount, 'creat\_time' => time(), 'subject' => $subject \]); return \['status' => 0, 'msg' => '支付寶創建訂單二維碼成功!!!"','data' => \[ 'qr\_code' => $response->qr\_code, 'outTradeNo' => $outTradeNo \]\]; // $qrcode = $qrPay->create\_erweima($response->qr\_code); // echo $qrcode; // print\_r($response); break; case "FAILED": return \['status' => 1, 'msg' => '支付寶創建訂單二維碼失敗!!!"'\]; // if(!empty($qrPayResult->getResponse())){ // print\_r($qrPayResult->getResponse()); // } break; case "UNKNOWN": return \['status' => 1, 'msg' => '系統異常,狀態未知!!!"'\]; // echo "系統異常,狀態未知!!!"."<br>--------------------------<br>"; // if(!empty($qrPayResult->getResponse())){ // print\_r($qrPayResult->getResponse()); // } break; default: return \['status' => 1, 'msg' => '不支持的返回狀態,創建訂單二維碼返回異常!!!'\]; break; } return ; } } 以上就是當面付預下單代碼 關於這個SDK,我非常有必要吐槽一下,哪個傢伙寫的demo,還在PHP例子裡引入了個lotusphp框架,一大堆沒有用的東西,完全沒有考慮我們開發者能不能接受得了。 我也是花了一點時間,把SDK給精簡了一下,只拿出我需要的部分,放入了我自己的框架中,加上了namespace,自動載入。 掃碼支付有一個獨有的功能—-異步通知 這個也正是線上支付最為需要的功能 當收銀台調用預下單請求 API 生成二維碼展示給用戶後,用戶通過手機掃描二維碼進行支付,支付寶會將該筆訂單的變更信息,沿著商戶調用預下單請求時所傳入的異步通知地址 notify_url,通過 POST 請求的形式將支付結果作為參數通知到商戶系統。 記住這個異步通知地址需要在應用那設置一下。 ...

2020年4月4日 · 3 min · MoeJue

ESP8266 串列埠WiFi模組 - WiFi殺手

前陣子買了個ESP8266,準備拿來玩玩。實際閒置數月,然後就拖到了2020年 ESP8266是一個WiFi物聯網模組,實際應用很廣,功能簡單來講就是:從wifi接收到數據,序列埠輸出;從序列埠接收數據,wifi輸出數據。 這玩意技術成熟,成本低廉,所以售價也就十幾塊錢的事 開箱 我這裡買的還是帶OLED液晶螢幕的套裝(給以後玩好玩的東西準備) 最經典的應該就是WiFi殺手了。所以咱就先刷一個WiFi殺手的韌體玩玩 韌體:https://github.com/samdenty/Wi-PWN?wi-pwn=7.0 原理是透過發送取消認證報文讓客戶端以為路由器需要讓自己斷開連接從而斷開wifi,偽造路由器向客戶端發送取消認證報文,使客戶端主動斷開wifi連接。並且支援自訂熱點偽造(批量生成假Wi-Fi訊號)。 使用能數據傳輸的數據線連接電腦,桌上型電腦盡量插到後面的埠去 插上後,Windows系統的電腦會自動安裝驅動程式,如下圖所示,記住這個COM 還需要安裝ch341ser驅動程式,USB轉序列埠CH341/CH340的WINDOWS驅動程式安裝包。按提示安裝即可。這個需要另外下載 韌體燒錄 我這裡使用的是NodeMcu FIRMWARE PROGRAMMER燒錄工具 1、operation 這裡的com埠選擇之前看到的那一個。或者在裝置管理員中看你ESP8266開發板是插在哪個埠 2、config選擇你的韌體位址,其他預設不動 3、Advanced - Baudrate 這個鮑率看你開發板背面寫的 如圖所示,圈出來的那塊 配置好後點擊 Flash(F)鍵開始燒錄,這個過程可能有點久,慢慢等就是了 燒錄完成後,插拔一次,燒錄成功後應該就會出現一個名為 wi-pwn 的一個公開WiFi 連接後瀏覽器打開這個後台,http://192.168.4.1/ 按引導操作即可。 我這裡演示一下批量偽造WiFi,點擊Beacom開始工作 工作狀態,運行中,藍色指示燈閃爍常亮 我不知道手機為什麼搜尋半天也就幾個 還有很多功能我就不一一試了 總結:沒什麼好總結的,我也是第一次玩,把我玩的整個過程記錄一下,分享經驗。 這次用的是別人寫好的韌體,下次就輪到我自己寫個了…………..待

2020年2月3日 · 1 min · MoeJue

一款美翻了的阿里圖床程式

拖延一時爽,一直拖延一直爽,一不經意間又拖延了一個月,就連元旦都沒有出來露個面,說來慚愧。 作為補償,趁著今天週末,我來發佈一個阿里圖床。 之前的程式好多小夥伴都說難以安裝,這次的阿里圖床就很簡單了,直接上傳到你的伺服器訪問就能使用了,一點都不需要配置,就是這麼簡單。(真的不是偷懶什麼都沒寫) 瞧瞧介面,是不是很美。 因為比較簡單,所以暫時沒有演示地址。如果有搭建好的小夥伴可以在下方評論出自己的圖床地址給其他小夥伴參考參考 專案地址 這兩天換上了新logo,也很漂亮的不是嗎(抓著公司ps大佬幫忙做的) 幻想領域圖床也開放驗證碼了,大家不要上傳不好的圖片喔 最後 雖說遲是遲到了,但我還是要說一句:祝大家新的一年裡快快樂樂!

2020年1月12日 · 1 min · MoeJue