跳至主要内容

第二次嘗試 Vibe Coding 後的一些雜感

· 閱讀時間約 13 分鐘

tl;dr

第二次小小嘗試了 vibe coding,成品如下,請勿認真檢視

成品小玩具

source code

前言

一時之間從某處取得了一個小玩具的靈感,本來打算動手挑戰看看,後來想下是個再次嘗試 vibe coding 或 AI assist 的機會。

一直以來都對 AI 在程式方面的各種應用很冷感,雖然是蠻排斥這股風潮的,但我從來都不否認 AI 在這方面確實能帶來前所未有的助益,既然如此我為什麼還是興趣缺缺?

純粹是出於動手親自一行一行寫出來的過程是充滿樂趣(以及挫折)的想法,這正是我認為寫程式最有意思的部份,沒什麼交給其他人代勞的理由。

先前曾經在一個極小且完全確定我手刻要怎麼辦的小小小測試程式上嘗試過,那時就有稍微改觀過,確認到其實並沒有那麼排斥這種做法,但也不特別喜愛,而且看起來可維護性或說永續性有點… 不樂觀?當時是用 vscode 免錢的 Copilot 搭配 GPT-5 mini。

連平常的網頁聊天提問一個禮拜都不見得會用上一次,但還是有訂閱 ChatGPT Plus,畢竟免費仔真的是稍微有真正的需求立刻就會不夠用,況且還不是程式這類的一般人需求。加上我完全認同 LLM 在語言方面的表現,之前預訂新琴的日文 email 都靠他了。

加上近期總算是比較積極去了解一些現在 AI 相關生態、工具的概念,便利用這個機會來稍微更深入的摸索下 Codex CLI

正題

需求背景說明

先來解釋下我想做的是什麼樣的小玩具,沒什麼難度也冷門的東西,搞不好早就有人做過但我也懶得去找了,反正我就是想藉機玩玩看。

簡訊這東西是論則計費的,有點年紀的人大概會知道,一則簡訊有其文字長度上限,若超過會再追加一則來容納,早年似乎甚至要自己切分,後來自動分割寄送、接收端自動合併似乎已經很普遍。

還需要前情提要一件事情是近年詐騙猖獗,公司行號若想要大量發送含有網址連結的簡訊內容,是需要事先和簡訊商申請網域白名單的,只能以白名單內的網域網址發送,否則會被系統阻擋。

現在有同樣內容的簡訊,有的號碼發送成功也有的失敗,推測原因在於不同的電信商遇到超過長度被切開的簡訊內容採取的掃瞄手段有差異而致,或許有的聰明點會合在一起看,有的比較懶就是切開來個別單獨看,那麼要是簡訊的連結正好在網域的部份被切開,或許就有可能導致被認為發送一個不在白名單內的網域的網址。

而我想到的輔助解方,就是搞個網頁小工具從視覺上提示訊息哪些部份會在第一則內,哪些會跑進下一則之類的,讓撰寫文案的人知道有被切分的可能,進而修改內文,看是要填充空格換行或是乾脆改寫,來避免踩上這顆地雷。

雖然老實說這年頭了還堅持要用簡訊根本莫名其妙,尤其是硬要塞網址在裡面…

不過不管那麼多,就是給我找到了一個小題目。

實際操作過程

確立了目標,動手前我就有稍微想過親自來的話會怎麼做,然後以此為出發點參考,去思考要如何運用 Codex 來替我達成。

於是打開了 Codex CLI,使用的是預設的模型 gpt-5.2-codex medium,建立了專案目錄,先幫他裝好我認為可能會用上的 lodash,寫了一份小需求文件 markdown,請他看一下,問他這樣能不能幫我做出來,或是有沒有什麼需要補充的?

Codex 很爽快的回答沒問題,但我沒有立刻讓他動手,而是先和他確認實作細節,像是如何分辨一個字會佔用幾個字元的額度(在我印象中一封簡訊是 70 個字,我人比較老以前傳得多…),也是這時候才想要更明確或者說去查明簡訊的行規,在這兩三句來回中馬上幫我把原本超級粗糙只打算 70 bytes 為分割單位的想法給完善且貼近現實許多,原來簡訊長度計算不是單看 bytes 而是有另外的編碼規則,來自大手簡訊商的 Twilio 的相關說明我放進最後的參考資料,專案的小需求文件裡也有放。

要不了幾分鐘立刻就生出了一個非常像樣也滿足需求的原型,是早就聽聞各種吹捧,但是親自來體驗仍然有些震撼,儘管只是一個小到不行,js 也不出 100 行的小玩意依舊如此。

後續就是我逐一去了解生出來的內容在幹嘛,有些也是直接問他那麼寫的用意。

既然被我稱作原型就說明還有很多值得加強、完善的地方,後頭密集地請他完成,我很少有親自介入的部份,想看他能做到什麼程度,當然有些很小條的還是乾脆自己動手比較快,有些問題光用講的他似乎無法理解問題出在哪,即便我有信心不是我描述不到位,然而圖片終究勝過千言萬語,有兩三次這種情況都是截圖給他看過就即刻得到解決了。

個人粗略心得淺見

先聲明,我的前端能力自認應該是連 AI 浪潮掀起前的轉職班出身一年經驗的前端工程師都不如的程度,所以一些關於做法上的心得看法或許外行到令人看不下去。

  • 生原型超級迅速,處理方法,或者貼金一點叫演算法,和我原先規劃的幾乎一模一樣,可能是需求真的太沒什麼,所以解決方法也就這樣了。
  • 衍生的修改調整,特別是請他拿掉一些東西,他很容易會真的只拿掉那樣東西,用來容納他的元素或相關的隨著其消失而跟著失去意義的東西例如樣式,他不太會考慮進去也一起順便拿掉。有幾分像是拿翹的老害養老員工的做事態度,我不是說給我的感覺像,是成果上來看蠻像,好像沒什麼眼界不會多深入思考又懶惰的員工會做的事的感覺。
  • 有時提新的改動需求給他,他又超級善解人意,連自己都沒想到的部份都幫你想出來了,並且非常切中要害。
  • 最初的原型還算乾淨,一旦開始追加功能以後,就像我說的很容易留髒東西,要是都不管的話,應該不出多久就會完全無法給人看,他自己也越來越難改得動吧,所以我中間還有停下來叫他重新檢視下有沒有已經變廢物可以清理掉的東西,有清出一些但我沒有很認真的親身下來檢查個徹底。
  • 後來想加上授權條款,我大致挑了下想用 GPLv3,然後問他我的相依是否能夠相容這個授權,這方面我真的是大外行,Codex 給我的回答是需要一路追到底才有辦法知道,請他看了以後他的第一個想法竟然是自己寫 js 整個跑過,看起來是蠻誇張的,我立刻說不要,能不能用現成的工具,跑了出錯我就先放置了,但他想要自幹的心態真的是有點常冒出來。像是我中間想導入 astro,看起來他對這個 framework 的理解似乎不是很深,可能不夠熱門的緣故吧,他有些理解和文件是有出入的。另外 lodash 的部份他竟然說打算乾脆自己把 debounce 的部份做進來,我也是回絕他這個建議。astro 這邊就有稍微多一點是我自己來的,說到底也是沒有多少啦。
  • 後來有個以其前後是否有相鄰元素來決定樣式的需求,我心理有個想法,正好看他會不會用和我預想的一樣的方式實現,想不到他竟然選擇用 js 來處理,這似乎是蠻舊時代的做法,用 css 的 has()+ 來達成應該已經蠻普遍了才對?而且個人認為這樣更好理解,這種純粹 presentation 的東西寫在原本就不多又不太複雜的邏輯內對我來說也略嫌噁心。不過我跟他說應該可以用 has() 和 + 來做吧?他馬上就用如我預想的方式做到了。類似的情況還有一兩個,一時想不起來。
  • 對於樣式的小細節調整,例如對齊,有時候會講很多遍都改不好,我有相當的信心確定不是我語表能力有問題,總之還是轉個彎,截圖給他看,通常都是圖一給就能馬上修好了,好像不能完全怪他,畢竟我沒有給他任何測試手段,所以他等同是在盲寫。有時候這種問題,我會先看看 code 並用 dev tools 查找下大概是什麼原因,然後告訴他說不定問題出在這,這種情況效率確實蠻好的。
  • cli 版本的廢話非常少不會油腔滑調動不動就想捧人,也相對不會自作主張非常多,這點在上次使用時加上摸 Gemini CLI 的時候就隱約有察覺,現在更是完全確信。這回唯一的自作主張只有預覽框的統計資訊,這個我沒想到,但的確是我會想要的,還不賴。

結論

成效出乎我預料的好,無怪乎完全不會寫程式的傢伙們各個興奮度更勝興奮哥,不過我也只是用於這般小小小玩具上,不曉得在真正的大專案及至渾身是病的畸形老害專案上效果如何,後者的話有嘗試請 Gemini CLI (當時用免費仔配的 Gemini 2.5) 幫忙翻看盤點整理某一段的 DB 操作過,覺得有些許幫助。

我會認為這和大家現在說的純手工屬於不同型態的做事方式,要有一個測試用原型,靠 vibe coding 毫無疑問是極具速度優勢的,一旦需要開始完善並在其上追加功能的話,有明顯感受到能熟練使用 IDE 並且已有腦內藍圖的話,vibe coding 便沒有快上那麼多了,越小的改動越不具備,然而在精雕細琢的過程往往就是多次細微的修改調整。

此外遇上預期外的結果或錯誤的時候,自身對正在雕塑的整體不熟悉沒掌握的話,全靠 AI 來修正,效率很可能會嚴重低下,先承認從中間開始我就沒有很仔細地檢視他幫我生的 html 和 css 了,一是量大,二是這種表現層的部份真的是相對枯燥,也正是我會想交由 AI 代勞的部份,前述對不齊之類的問題反應三番兩次還是改不到位的時候親自下去看就會花上較多的時間,看別人的 code 從來都不是見簡單迅速的事。反觀若是自己正在密集調改的專案程式的話,看出問題大概在哪、要上哪修正都只是一瞬的事情。

html, css 是偷懶了,但主要功能邏輯的 js 部份我都會先搞明白才接受修改並往後推進。

所以說對成品的掌握度是一個顯而意見的區別,這便導出了我的外行結論:vibe coding 可以迅速的產生會動的成品,即刻帶來高度的做出了些什麼東西的成就感;手工則是因對成品瞭若指掌能自然產生安全感,在製作過程中靠著學習,應用了原先不具備的技能或早先不知道的知識,還有碰壁親手解決所獲得的成長喜悅,綜上再結合成踏實感。

日前我是絲毫沒有嘗試此般方法的念頭,嚴正鄙視正統 vibe coding(正統的定義私以為是真的完全不看產出的 code,純靠 monkey test 驗收、回饋後續修正方向,會去看產出的內容,知道自己在幹嘛的就不能算正統 vibe coding),後來 vibe coding 這個詞彙的定義似乎越來越寬鬆,好像只要不是在 IDE 上的輔助就算數,界線逐漸模糊。

經過又一次輕度嘗試,改觀了不少,未來我會更樂於、更積極的在有需要進行相關工作的時候優先使用看看。

不得不說前端或 app 這種介面類的差事真的很適合交給 AI,可以像個慣老闆一樣吹毛求疪瘋狂要求調整,馬上就能驗收。

本次的簡短摸索也讓我蠻肯定要是真的全靠 vibe 只提需求和修改其他都不管的話,那麼程式三兩下就會失控到完全不可讀的程度,至於 AI 能否繼續在其上有效作業,不看好,出錯率跟奇妙的 bug 多半也會跟著大幅增加我猜。

我已經有見識到沒有全盤考慮進去只針對提問局部修,讓 css specificity 造成他改了兩三遍還是改不對的問題了,看起來應該都要錯到一定次數後他才會把考慮進去的範圍擴大。

後記

小玩具做完,想要回頭好好了解業界相關規範,去細讀當初查到的 Twilio 說明網頁,才發現果然已經有更進階的工具 Messaging Segment Calculator 存在,不過即便當初就知道有還是會以同樣的題目來試試啦。

此外關於技術上的決定,可能某些部份會令人感到莫名其妙,最直接的原因還是我學藝不精,列出幾個我認為可能會讓人問號的:

  • 用 astro 純粹是我還不會用 vite 之類的打包工具,加上前陣子才開始學 astro,就直接套上來利用他的打包效果了。
  • 事後去摸了下 Twilio 的那個工具,才發現我很可能對簡訊編碼的相關細節理解太淺,因此預覽的效果說不定會和實際的簡訊有出入,真有這個問題的話全是我對相關規格不夠了解,而以不正確的規格進行實作導致,不是 AI 的問題,做出來的有滿足我訂的規格。

參考資料

義美蠻有心做環保的,退瓶費雜感

· 閱讀時間約 2 分鐘

今天去義美消費結帳的時候前面的客人買了義美的保健食品,店員主動告知帶空瓶和外盒回來可以退 15 元,這是公司要求特別說明的。

而輪到我要結的時候,我有買一瓶花生醬,店員也和我說空瓶可以退 5 元,別直接回收掉囉。

挺意外義美現在會有這樣的政策,印象中只知道台酒的有退瓶費,小時候幫家裡拿米酒瓶去退過,依稀記得是一個 6 元,現在只查得到 2 元,或許是我記錯了吧。

之前在全聯買 18 天玻璃瓶的好像也能退。倒是 -4 會收可是似乎只限收他們有賣的品項的瓶子,而且沒有退瓶費,以前以為都收,當時的店員還很好心說這次幫我混進去,以後記得別再拿來了。

為了確認退瓶費的過往價碼查了下新聞才發現當初政府為鼓勵回收的相關措施竟然反而被各種玩爛,不愧是炎黃子孫,尤其是更早年代的…

既然義美應該是自發的,大概就沒有那些問題了吧?

再查得徹底一點原來不是 -4 不退,是要看品項

也是再再查到發現小時候退到 6 元可能不是完全錯誤的,至少不是始終都是 2 元,居然曾有人拍賣 4 元版本的空瓶

4 元押瓶費紅標米酒空瓶 4 元押瓶費標籤特寫

一天之內猛地憶起兩件跟現下 AI 能連結起來的往事…

· 閱讀時間約 3 分鐘

一、

在過去某份工作裡有位從他身上學到許多的 tech lead,他平常不親自下來寫程式,但是 code review 都經過他,他對專案瞭若指掌,每次 review 都能有很多意見回饋甚至手把手帶人改,令我敬佩不已,仔細想想這與我能夠認同的 AI 的用法極為相近,就是完全理解要 check in 的程式碼,有需要的時候也完全改得動這樣。雖說指示並不是他下,也因此現在才聯想在一起。

二、

還是學生的時候,曾找到一份打工,貌似是騙人去菲律賓學英語的仲介,第一次去的時候地點在學校的新創中心這種出租辦公室內,起初只知道工作內容是用英文寫文章,去了才聽他們介紹大概的業務,真的只有很大概,給了幾張照片就叫我瞎掰一篇在那邊的補習班學英文的體驗,我聽了就莫名其妙,我都沒去過我是要怎麼掰?

想要多了解一點他們也說不出來,甚至給不出什麼學校簡章之類的玩意,還叫我自己上網查,靠北是要查三小。

領回去這個題目以後叫我下次自備電腦來,寫的過程還得在他們辦公室,不懂意義在哪。

但當時沒多想,只覺得一切實在很三小,第二次去的時候已經搬出學校裡的空間,去到外邊沒多遠桌遊店的隔壁店面,這回去了隨便瞎掰點東西他們也沒仔細看就交差了,我也直接說我不幹了,印象中應該是有領到稿費。

結語

總之想說的是,即便在那個沒有 LLM 的久遠年代,老早就有一批缺乏道德良知和責任感的人渣,以此等粗劣的手法憑空捏造文案之類的內容行騙。

不過主要是把瞎掰的工作外包出去這部分使我將之和現在的 LLM 連結起來…

一方面也是跟現在的工作剛報到的時候就遇到員餐用 AI 生商品圖的事情有關,生的超假而且和實際的飲料完全不符,一天到晚被人問那款飲料實際長怎樣,搞到後來還要發公告澄清說明。主要是因為生成的圖片裡蒟蒻晶球之類的東西他媽比清心的冰塊還要多。更可笑的是公告裡不承認使用生成的圖片這個作法本身就有問題,而是推卸說新手不太會用 AI。

那時我就在想到底是多低能會覺得商品照可以完全用生的,也不寫個「圖片為 AI 生成,僅供參考」,而且要生好歹也生個接近一點的,擺明就是認為生出來的看起來像真的照片了想要魚目混珠,又不是說用畫的一看就知道僅為示意用,到底是多弱智才會覺得這種作法沒有問題。

Spring Cloud AWS Secrets Manager 即使選用也得指定區域的擾人錯誤

· 閱讀時間約 9 分鐘

最近嘗試使用 Spring Cloud Config 的時候遇到了一個預料之外的錯誤,完整內容有點長,就放到底下吧。

即便沒有用上 Spring Cloud AWS Secrets Manager 相關功能,只要沒有指定 region 就會噴錯,尤其是已經指定非必須 (optional) 載入相關設定依然會發生。

查找了下得到幾個迂迴的作法,可以指定區域,但這顯得有點蠢,也可以將相關功能給關閉,需要自己主動做這件事也是有點不爽,但現在暫時只能這麼做了。

關閉功能的 property:

spring.cloud.aws.secretsmanager.enabled=false

另外有其他專案確實有直接使用到 Spring Cloud AWS Secrets Manager,只有本機在情況下使用,其他環境不使用,就沒有以任何方式指定 region,先前使用 3.0.0 版的時候是沒有問題的,後來更新到 3.4.1 和 3.4.2 就遇上同樣問題了。

看起來是若干年前就曾經出現過的問題,後來有修好但是這幾版又復發…

參考連結

錯誤訊息

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-12-19T06:05:50.574Z ERROR 1 --- [thunderstruck] [ main] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'secretsManagerClient' defined in class path resource [io/awspring/cloud/autoconfigure/config/secretsmanager/SecretsManagerAutoConfiguration.class]: Failed to instantiate [software.amazon.awssdk.services.secretsmanager.SecretsManagerClient]: Factory method 'secretsManagerClient' threw exception with message: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1228) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1194) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1130) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:990) ~[spring-context-6.2.14.jar:6.2.14]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.14.jar:6.2.14]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:194) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:174) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:102) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171) ~[spring-web-6.2.14.jar:6.2.14]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4416) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:564) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:650) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:923) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1839) ~[catalina.jar:11.0.14]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328) ~[na:na]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:81) ~[tomcat-util.jar:11.0.14]
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:125) ~[na:na]
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:727) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:378) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1579) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:262) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:741) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:767) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1162) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1158) ~[catalina.jar:11.0.14]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328) ~[na:na]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:81) ~[tomcat-util.jar:11.0.14]
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:149) ~[na:na]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:714) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:201) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:410) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:864) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.Catalina.start(Catalina.java:756) ~[catalina.jar:11.0.14]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na]
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:339) ~[bootstrap.jar:11.0.14]
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:470) ~[bootstrap.jar:11.0.14]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [software.amazon.awssdk.services.secretsmanager.SecretsManagerClient]: Factory method 'secretsManagerClient' threw exception with message: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:200) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:89) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-6.2.14.jar:6.2.14]
... 59 common frames omitted
Caused by: software.amazon.awssdk.core.exception.SdkClientException: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:130) ~[sdk-core-2.31.78.jar:na]
at software.amazon.awssdk.regions.providers.AwsRegionProviderChain.getRegion(AwsRegionProviderChain.java:70) ~[regions-2.31.78.jar:na]
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.resolveRegion(AwsClientBuilderConfigurer.java:181) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.resolveRegion(AwsClientBuilderConfigurer.java:168) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.configure(AwsClientBuilderConfigurer.java:86) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.configureSyncClient(AwsClientBuilderConfigurer.java:140) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at io.awspring.cloud.autoconfigure.config.secretsmanager.SecretsManagerAutoConfiguration.secretsManagerClient(SecretsManagerAutoConfiguration.java:55) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:172) ~[spring-beans-6.2.14.jar:6.2.14]
... 62 common frames omitted

19-Dec-2025 06:05:50.578 SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [/usr/local/tomcat/webapps/ROOT.war]
java.lang.IllegalStateException: Error starting child
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:567)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:650)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:923)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1839)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:81)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:125)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:727)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:378)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1579)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:262)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:741)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:767)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1162)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1158)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:81)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:149)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:714)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:201)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:410)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:864)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
at org.apache.catalina.startup.Catalina.start(Catalina.java:756)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:339)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:470)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:404)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:564)
... 34 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'secretsManagerClient' defined in class path resource [io/awspring/cloud/autoconfigure/config/secretsmanager/SecretsManagerAutoConfiguration.class]: Failed to instantiate [software.amazon.awssdk.services.secretsmanager.SecretsManagerClient]: Factory method 'secretsManagerClient' threw exception with message: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1228)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1130)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:990)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:194)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:174)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:102)
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4416)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
... 35 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [software.amazon.awssdk.services.secretsmanager.SecretsManagerClient]: Factory method 'secretsManagerClient' threw exception with message: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:200)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:89)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
... 59 more
Caused by: software.amazon.awssdk.core.exception.SdkClientException: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:130)
at software.amazon.awssdk.regions.providers.AwsRegionProviderChain.getRegion(AwsRegionProviderChain.java:70)
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.resolveRegion(AwsClientBuilderConfigurer.java:181)
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.resolveRegion(AwsClientBuilderConfigurer.java:168)
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.configure(AwsClientBuilderConfigurer.java:86)
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.configureSyncClient(AwsClientBuilderConfigurer.java:140)
at io.awspring.cloud.autoconfigure.config.secretsmanager.SecretsManagerAutoConfiguration.secretsManagerClient(SecretsManagerAutoConfiguration.java:55)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:172)
... 62 more
19-Dec-2025 06:05:50.581 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/ROOT.war] has finished in [8,138] ms

60% 鍵盤主力一段時間後的小小心得

· 閱讀時間約 1 分鐘

60% 鍵盤用了一陣子,整體來說還是不比 75% 來得有效率,不過讓我終於嘗試替換掉 Caps Lock 以後得到了一個不錯的心得,把 Caps Lock 換成 Fn 再搭配周圍的按鍵設成第二組方向鍵跟六塊肌,還沒用到成為肌肉記憶,不過可以讓我不必把手移開,挺不賴,再花點時間適應。

keyboard fn2 layout

極力反推 <Shipgo17 世購國際> 集運服務

· 閱讀時間約 3 分鐘

前言

從一路發逃難出來前用了好長一段時間,而且算得上頻繁吧,也是逃得很晚了。

後來隨便找了 Shipgo17,起初只覺得怎麼網頁那麼垃圾,委託收貨要填那麼多有的沒的完全不知道意義在哪裡,申請寄回也難用到爆炸,費用上沒有比較便宜,速度又慢。

唯一好處大概就是客服態度還算可以吧,但是回覆速度也很慢。

光上述部份就已經夠糟的,更扯的是後來有遇到幾個實在是極為要不得的狀況。

日本站 - 包裏遺漏運回

首先是包裏漏寄回,因為這種服務用很習慣了,頻率高加上一次運回的量也不少,後來基於信任就沒有特別清點,當然這也說明我自己買了啥都沒放心上… 夠蠢的。

後來有一次又運回了一大包,有覺得怪怪的並沒有多想,過了大概一個月,才接到客服通知說整理倉庫發現有東西當初沒打包到寄回來給我,當初整併沒包到所以也沒算到錢。

我當然是要寄回,其實感覺非常差,不過至少還算誠實,所以我也沒特別怎樣,但很確定該放棄這家了。

所以後來經學長推薦改用運匠,體驗真的良好許多,速度快,網頁雖說偏簡陋,但 UX 真的像是正常東西太多了,缺點的話則是國家站點較少,只有日本和支那。

美國站 - 主動催問才會入庫,包裏遺失近兩個月後尋回

這個站點使用的較為稀少,最初使用的時候沒有什麼問題,然而近期使用一次就讓人完全失去信任,在經過上面事件後還會使用的原因一樣是懶… 只能說自己還是沒學乖。

僅僅是因為運匠沒有美國站就再給他機會,疏不知這一次終於徹底把我打醒,印象中規定上就寫說要 2 天才會入庫,超過請聯絡,光是原本規定的就久到不可思議了,

我還是照規矩來,等到第 4 天還是不見蹤影才找客服,又逢假日,所以等周末過完才有消息,結果說只有收到一件,叫我再跟貨運確認,讓我賭爛到不行。

寫信給線上購物,說他們運出一概不負責,自己去跟 UPS 問,還提醒我他們規定不能送到轉運,整個很三小…

看 UPS 物流追蹤說是丟在碼頭的樣子,明明顯示已送達,查送達證明卻沒有照片,於是提起未送達申訴。

過了一個月 UPS 回說送到了,請再確認,還以為是想隨便把案子結掉,又氣了一回,再過五天 Shipgo 突然通知那包入庫了。

所以總的來說,應該是 UPS 和 Shipgo 都有問題,而且 UPS 或許責任更大一些,無法確定,可 Shipgo 相信是脫不了關係。

怎麼可能這麼大一個集貨服務,會跟這麼大的快遞沒有往來,東西就這樣丟下了也不找下的?我合理懷疑找別家就不會發生同樣問題。

之後打算依照這則[心得] 五家美國集運心得分享改試看看好運,日後有心得再來分享。

Raspotify / librespot 無法播放歌曲的暫時解法

· 閱讀時間約 2 分鐘

正文

平常有在 Raspberry Pi 上用 Spotify 播放音樂的習慣,用的是 Raspotify,就是把 librespot 包成 Debian 尤其是 Raspi 用的套件的專案,前幾天突然播不動,起先以為又是帳號被針對了…

後來弄巧成拙系統掛掉,也不確定是不是我親手搞爆的就是了,總之是乾脆重裝了,正好當作 clean install 升新版,之前一直懶得這麼做就卡在 Buster。

裝好後問題依舊,查到和我症狀一毛一樣的 issue,看起來是有災情,詳見 Getting status code 500s since Ads API sunset · Issue #1527 · librespot-org/librespot

起初找到的時候沒看到什麼簡便有效的方法,後來持續追蹤就看到有人說/etc/hosts 裡加上一筆 0.0.0.0 apresolve.spotify.com 的紀錄就行了,試了下還真的立竿見影,所以就是把那玩意擋掉的意思,蠻莫名其妙的…

我都已經是用付費帳號在播了還會撞到這種廣告關聯的問題…

不過開 issue 的人就有表示相信和 Spotify 的舊版廣告相關 API 下掉了有關…

暫且是這麼處置了,這件事也得記著,天知道會不會之後哪天變成反而因為這筆 DNS record 掛掉。

回顧

也不能說沒有收獲啦,因為一些很蠢的問題笨手笨腳的重裝很多次,時間花的遠沒有預期的久,主要好處是藉機升了新版。

再者是順便調整了音效介面相關的設定,音質似乎有顯著的變化,應該是好的方向啦… 我在這上面播也沒有追求音質就是了。

還有多學到了幾個音效相關的指令,像是 aplayspeaker-test,有點太晚就是,發現播不了的時候不確定到底是什麼部份出狀況, 因此重裝後也不曉得到底能不能播出聲音,但 raspotify 又處於播不了的狀態,等到找到有效解法才學會 speaker-test

後續更新

過沒太久 Raspotify 0.46.2 把 Librespot 升到最新版就把這問題給解決,不需要 workaround 了。

首次使用吸吸管(環保塑膠吸管)心得

· 閱讀時間約 3 分鐘

正題

過去就有使用過一些宣稱對環境友善的吸管,我對吸管的態度是需要他,可是搞到都禁用或用些廢物代替還是太白爛了,什麼插到烏龜你媽,那個問題是垃圾沒有被正確處置而不是那玩意材質是不是塑膠好嗎?每天看到吸管這樣用一次就丟用萬年不化,也是蠻不爽的,因此有點餘力還是會盡量選擇可能有改善的產品。

前陣子發現了吸吸管這個玩意,決定買來試試。

金屬吸管和矽膠吸管的麻煩點就是清洗很不方便,所以有好幾支金屬吸管但實在不愛用。

買來丟著一陣子剛剛才首次使用,會丟著的原因就是他有些事前作業要執行,看起來稍嫌複雜麻煩,實際操作了一遍也的確沒有到很直觀。

總之這部份就省略,直接說用起來感覺還不賴,雖然是用夾合的,實際吸起來不會不放心,清洗方面也便利許多。

之後就來看看到底是否耐用了。

這玩意要是真有那麼實用,那或許應該要成為新的日用品,至於那個使用門檻的問題,只要未來夠普及成為常識就不是什麼問題了,如同許多家電一樣。

以下順道分享下過往曾使用的其他聲稱環保的吸管產品。

玩艸植造 - 蒲草吸管

食力上申請試用的,用掛號寄給我也沒事前發寄送通知,害我拿到的時候距離提交心得只剩一天,來不及交出去,從此在試用平台黑掉沒機會試新的,有夠雞巴堵爛。

本身有個野草味,這可能有點看人,我還可以接受,放久了會脆化容易裂開的樣子,不算是個非常好用的產品,但絕對強過難用得要死的紙吸管數倍,有堪用以上程度。

也有想過要再購入,但是當時好像只有超大量的包裝,因而沒有再度使用。

蔗糖提煉環保吸管(Bio-PE)

之前逛百貨有那種舶來品展的時候順便買的,韓國東西,說是蔗糖提煉材質製造的,外觀和使用上完全就和一般吸管沒兩樣,也一樣有單獨的塑膠套包裝,不知道這個吸管套是否也是環保材質,所以當然好用,至於有沒有實質的環保功用,不得而知。

本來在找到吸吸管之前有想要再買,似乎沒有到很容易找,所以作罷。

圖片是從 momo 上的商店幹來的,想說不放個圖大概不知道在說哪個產品。

ECO STRAW

線上樂譜掃瞄轉檔服務實作了 ChatGPT 唬爛出來的功能

· 閱讀時間約 3 分鐘

Hacker News Daily 上讀到了這篇文章 - Adding a feature because ChatGPT incorrectly thinks it exists

我大致說下內容:

主角是一個叫作 Soundslice Sheet Music Scanner 的線上服務,提供上傳樂譜相片,將其轉檔為類似 GuitarPro 或 MuseScore 那種打譜軟體用的格式,方便閱讀、播放、編輯。

前陣子開始觀察到一些奇妙的錯誤,檢查了上傳的圖片,竟然是和 ChatGPT 的對話擷圖,上頭有 ASCII tab 譜,作者起先完全不明白這是怎麼回事,直到他親自試過才發現是 ChatGPT 豪洨說如果你想播放這個譜的內容的話可以用他們的服務。

然而該服務並沒有支援這種格式,完全是 ChatGPT 的幻覺。

這令他們受到了不切實際的期待,有損他們的商譽,考慮要直接在網站聲明沒有那種功能,最後決定乾脆把這個不存在的功能給做出來,反正本來就在他們排定會做的功能裡,只是順位在最底。

作者表示這大概是世界上第一次有人去做了 AI 妄想、唬洨存在的功能。


這一切是頗有共鳴的,問些相對冷門的領域的東西的問題 ChatGPT 就很會唬洨,我最近的例子是 CedarSpring Web Testing 相關的問題,都回答我一些不存在的功能或用法。

不過我更在意的是這年頭居然還有人在用那種 ASCII tab 譜,我以為是古早的時空背景下才流行,如今已經不太有人使用的東西才是…

我自己是沒有親自經歷過,畢竟是出社會後才真正開始學琴,但我想像中應該是早年網路頻寬比較有限,再加上打譜軟體也沒那麼普及等等因素才蔚為潮流的格式,在 Ultimate Guitar、911 Tabs 之類的網站上廣為使用。

在我還是學生的時候就已經都聽到是在用 gp 譜了啊,我過去還有找到可以讀取 gp 譜格式的開源軟體 powertabeditor,當時也早就有 Songsterr 這種線上網頁形式的,而且我看樂譜數量也是相當龐大了。

實在是有夠謎的…

WSL 2 因可用記憶不足而無法啟動的問題

· 閱讀時間約 2 分鐘
系統資源不足,無法完成要求的服務。
錯誤碼: Wsl/Service/CreateInstance/CreateVm/HCS/0x800705aa

[process exited with code 4294967295 (0xffffffff)]
You can now close this terminal with Ctrl+D, or press Enter to restart.

昨天正在打 Splitgate 2 突然想開一下 wsl 又遇到上面這個錯誤,前一次遇到的時候明明就沒有在打遊戲,所以困惑到不行。

這次才明暸原來是當下的系統記憶體不足,我桌機只有 32GB 的確是不多啦,可明明就還剩 8GB 以上,關了遊戲以後還真的就能開了…

於是查到 Advanced settings configuration in WSL # Main WSL settings 裡記憶體的預設值竟然是系統總記憶體的 50%。

沒事也切太多了吧,來改小一點看看還會不會撞到,日後電腦升級再順道加大,但絕對不能放預設抓一半就是了,有點瞎,一半的意思不就是要電腦夠閒或是主力都在 wsl2 上,超不合理啊。


後續更新:

看來問題根本不在記憶體… 後來又碰上了,當下關了一堆程式,閒置記憶體剩餘超過一半還是給我同樣的錯誤。

總之再度查找了起來沒什麼鳥結果,只發現這問題遠比想像中的普遍,大家都對於不講明什麼樣的資源不足感到莫名又束手無策。