<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Yuren&apos;s Blog - 全部文章</title><description>撰寫就是一種思考方式，發佈與分享只是副產品，而真正的意義是在自我的知識脈絡裡面有了歸屬與連結。</description><link>https://yurenju.blog/</link><language>zh-Hant</language><item><title>按下快門的後日談</title><link>https://yurenju.blog/zh/posts/2026-03-21_shutter-afterstory/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2026-03-21_shutter-afterstory/</guid><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;cloud-chair.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1600&quot; height=&quot;1111&quot; src=&quot;/_astro/cloud-chair.DwHDKzfg_ZFFfJ.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;最近買了柯達的半格玩具底片相機試試水溫，想不到沖洗照片出來的記憶這麼的活靈活現。原本已經忘記的時刻，重看照片時左右兩格並列的排版像似雙格漫畫的故事，自己也被拉回到按下快門的那個時刻。&lt;/p&gt;
&lt;p&gt;數位相機或手機所紀錄的總是「當下」，所見即所得的可以馬上看到照片，但在那個時刻並還不是一種「回憶」。只有隔一陣子重新回顧照片，「當下」才有機會沈澱成「回憶」。而社群網路時代並不是所有的照片都有機會成為回憶。&lt;/p&gt;
&lt;p&gt;另外一方面，底片攝影的產物從來沒有「當下」。按下快門拓印在底片上的影像，就得等到整卷底片拍完沖洗後才能看到。而這些時刻隨著時間會被淡忘，但有些部份又在夢裡被梳理、醞釀與發酵。最後收到沖洗的照片時，原本以為已經遺忘的部份，又從深藏在腦海裡的角落竄了出來，比起當初想像的更溫暖與生動。&lt;/p&gt;
&lt;p&gt;底片攝影從來沒有當下。它總是經過醞釀發酵，首次成型時，已經是一段美好回憶了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;sakura-and-door.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1600&quot; height=&quot;1111&quot; src=&quot;/_astro/sakura-and-door.CTvpRRq9_Z5Dshk.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;bicycle-and-bench.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1600&quot; height=&quot;1111&quot; src=&quot;/_astro/bicycle-and-bench.BruBytGf_Z1FfaM.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>OpenClaw 所開啟的大門</title><link>https://yurenju.blog/zh/posts/2026-02-06_the-door-opened-by-openclaw/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2026-02-06_the-door-opened-by-openclaw/</guid><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;openclaw-logo.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;774&quot; height=&quot;427&quot; src=&quot;/_astro/openclaw-logo.DVrFFRTQ_JmPhF.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;「OpenClaw 跟其他 AI Bot 有什麼不同阿？」&lt;/p&gt;
&lt;p&gt;要回答這個問題可以從我第一個請他幫忙的事情開始：&lt;strong&gt;找我喜歡的咖啡館&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我自己對於咖啡有特定的喜好，以至於會需要在 Google 地圖上每間咖啡館點進去看菜單是否標示咖啡產地資訊、處理方式等等才能篩選出喜歡的咖啡館，所以這件事情一直都很困擾我，其他 Bot 也沒支援看 Google 地圖的店家照片功能。&lt;/p&gt;
&lt;p&gt;所以架好 OpenClaw 之後的第一個問題也是問附近的咖啡館。而下一個問題就是詢問是否能夠看店內的照片或是 Google 評論，這個時候他的回答就很有意思了。&lt;/p&gt;
&lt;p&gt;「目前只回傳基本資訊，沒有照片和評論內容。」&lt;/p&gt;
&lt;p&gt;「要的話我可以幫這個 skill 加上照片和評論功能，不過需要一點時間改 code。要弄嗎？」&lt;/p&gt;
&lt;p&gt;我看到回覆真是下巴掉下來，以前不管用 ChatGPT 或是 Gemini 時，可以客製化的空間有限，而從來沒遇過 Bot 可以修改自己的程式來解決我的問題，就像他拿著烙鐵打開自己的機械胸腔重新焊接一樣。&lt;/p&gt;
&lt;p&gt;最後跟他討論過後，這是產生的結果。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;bernard-cafe-scout.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;839&quot; height=&quot;1390&quot; src=&quot;/_astro/bernard-cafe-scout.CW-WyqDy_MwO64.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;回過頭來，如果要回答「OpenClaw 跟其他 AI Bot 的不同之處」，我會說 OpenClaw 就像是「有了一個軟體工程師的夥伴，而且給了他一台電腦」。除了利用電腦上現有的工具來解決問題之外，最重要的是他可以&lt;strong&gt;製作與修改工具&lt;/strong&gt;。如果他手上的工具不能看 Google 地圖的圖片，那他就修改程式加上看圖片的功能。&lt;/p&gt;
&lt;p&gt;現行大多的 AI 聊天機器人更多的是提供工具，而這些工具要先有其他人提供，使用者才可以存取特定服務。而 OpenClaw 即使沒有人提供工具，他也可以自己造出來。即使像 Claude Code 這樣的工具跟 OpenClaw 還是有點差別，Claude Code 也可以造工具，但是目的是要和你一起協作開發軟體。&lt;/p&gt;
&lt;p&gt;而 OpenClaw 製作工具的目的則是更通用的解決你的問題。&lt;/p&gt;
&lt;p&gt;接著我就開始嘗試解決自己的一些困擾。比如說我有看各國新聞的習慣，但是為了閱讀速度，我通常得找有中文版的國外新聞網站，比如說紐約時報、德國之聲、法廣等。但有了 OpenClaw 之後，我直接請他研究一下各個國家原文新聞網站有提供 RSS 的媒體，然後請他根據他對我的認識，從這些媒體裡面挑出我可能會有興趣的新聞翻譯成中文，然後每天早上製作一份語音的新聞簡報，這樣我早上起床之後就可以聽一下新聞。&lt;/p&gt;
&lt;p&gt;然後在附上評分機制，作為他下次篩選新聞的依據 😁&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;bernard-daily-news.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1288&quot; height=&quot;1417&quot; src=&quot;/_astro/bernard-daily-news.CXWOmuSN_Z2llxwL.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;當然這就繞回來那房間裡的大象，OpenClaw 真的很不安全嗎？&lt;/p&gt;
&lt;p&gt;這個也很容易想像，如果你給軟體工程師一台電腦（即使沒有管理者權限），然後衡量他能做出什麼事情、有多危險。可以詢問一下身旁的工程師朋友關於工程師圈的蠢事，不小心刪除資料庫、把 git 弄亂、砍掉根目錄等等，這個 Bot 都有可能作出來（即使模型本身有很多保護措施）。&lt;/p&gt;
&lt;p&gt;OpenClaw 就是差不多是這個危險程度之上，再加上還可能會被 Prompt Injection 導致劫持去作其他事情。以我的例子來說，如果有人在 RSS 或是評論裡面塞入惡意留言，我沒把握他可以很好的預防這類型的攻擊。&lt;/p&gt;
&lt;p&gt;所以我會說安全問題是挺嚴重的，特別是你沒有提供一個獨立的環境給他使用，而是把他跑在自己的電腦裡面，這樣安全問題就更大了。&lt;/p&gt;
&lt;p&gt;但這絲毫掩蓋不了 OpenClaw 是個充滿創意跟樂趣的實驗。如果看 Anthropic 或是 OpenAI 作實驗的方式就相對謹慎，希望在可控範圍內完成更多事情。而 OpenClaw 是反其道而行：如果我給 AI Bot 一台電腦，那會多有趣？&lt;/p&gt;
&lt;p&gt;這就跟溼婆跳舞一樣，是毀滅的開端，也是重生之時。&lt;/p&gt;</content:encoded><category>技術</category></item><item><title>富士山與夕陽</title><link>https://yurenju.blog/zh/posts/2026-01-23_layers-of-context-and-me/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2026-01-23_layers-of-context-and-me/</guid><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;《入境大廳》裡面提到從異鄉人成為在地人，其中的關鍵是不用事事再跟故鄉比較。食物哪邊比較好吃、街道怎樣乾淨、空氣味道的差異等。之前從來沒成為異鄉人的我，最近卻因為富士山溫習起了地球科學。&lt;/p&gt;
&lt;p&gt;居所附近的高樓並不多，天氣好的時候視野極佳。去年入秋的某一天，才注意到住所外的走廊上竟然可以看到富士山。之前沒注意到的原因是由於氣候的關係，在秋冬之際的視野才可以望向這麼遠的地方。從那天起每天出門都有轉扭蛋的新鮮感，偶爾就能看到遠處的富士山。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;fujisan.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/fujisan.lvM743dQ_Z7ajq.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;比扭蛋更新奇的發現是每天夕陽落下的位置，竟然愈來愈靠近富士山。這才又回想起地球科學裡面地球傾斜角度造成夕陽每天的位置都會不同。特別是有了富士山這樣的參照點之後，變化就更明顯了。&lt;/p&gt;
&lt;p&gt;那不就有一天，正好可以看到落日在富士山頂上？查詢了一下，還有一個專有名詞叫做「鑽石富士」。&lt;/p&gt;
&lt;p&gt;雖然不是每日天氣都這麼好，但看到落日移動的偏移確實讓人興奮，而這也是在台灣不容易感受到的。跟季節感一樣，在高緯度國家四季的切分明確，觀察日落的軌跡也更為明顯，但也不全然是好事。最近的天氣預告是大晴天，但是正中午萬里無雲的時候，氣溫是四度。&lt;/p&gt;
&lt;p&gt;秋天可以悠哉的坐在戶外座位喝杯熱茶看看書，冬天則是風大吹到頭痛。而居所落地窗的方向正好照不到陽光，某天發現對面遠處的大樓帷幕正好可以把陽光反射到室內，就把手腳湊到亮光處，努力的吸收著為數不多的反射陽光。&lt;/p&gt;
&lt;p&gt;而這也是作為異鄉人的寫照，短期內無法擺脫時不時就想跟故鄉比較的心態。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;taipei-101-sunrise.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/taipei-101-sunrise.DgxD2sJJ_ZGwezq.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;但最近翻閱舊照片時，發現了一張台北 101 的日出。&lt;/p&gt;
&lt;p&gt;那是我在台灣剛搬入新家尚未適應、輾轉難眠的凌晨，卻因禍得福的看到了美麗的日出景色。仔細回想，那時也曾經思考日出是不是會一天天越來越靠近台北 101。接續著翻閱照片，發現日出與日落的景色總是讓我著迷，相簿裡面拍攝了各個不同國家的魔幻時刻，從希臘到土耳其，從沙漠到海洋。&lt;/p&gt;
&lt;p&gt;是異鄉或在地人，自我認同並非得一定要這樣切分。就跟那些拍攝的所有魔幻時刻一樣，每張照片都是構築自我的切片。每個人自我認同的成型並不僅是兩個時刻的互相比較，而是每個切片中的記憶與情緒交疊在一起，才形成了一個完整卻仍然待續的故事。&lt;/p&gt;
&lt;p&gt;回過頭來，當我引頸期盼「鑽石富士」美景的到來時，那兩天是陰天呢。前後各拍到的照片，正好在山峰的左側跟右側。&lt;/p&gt;
&lt;p&gt;即使是錯過了，這樣的經歷、有趣橋段以及與過往生活的聯繫，還是值得按下快門好好的保存，跟著其他珍貴回憶一起收入相簿裡面，擺脫異鄉與在地人涇渭分明的分野裡，理出自成一格而不被現有邊界侷限的觀點。&lt;/p&gt;
&lt;p&gt;讓這些美好的脈絡切片，一層層疊加構築成為現在這個獨一無二的自己。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;fuji-diamond.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;1024&quot; src=&quot;/_astro/fuji-diamond.M-WtcLXp_20m9DF.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>語言是概念的剪刀</title><link>https://yurenju.blog/zh/posts/2026-01-17_language-as-scissors/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2026-01-17_language-as-scissors/</guid><pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近學日文時發現了語言間有趣的差異。日文的「爪（Tsume）」一詞，意思既是動物的爪子，同時也是人類的指甲。而中文裡兩者卻是分開的概念，無法混為一談，爪子是爪子，指甲是指甲。&lt;/p&gt;
&lt;p&gt;這跟索緒爾的「語言是概念的切分」有異曲同工之妙。世界在還沒有語言之前，概念是一團混沌，當指著一個人時，所指的可能是人、女性、姊姊甚至母親。這些模糊的邊界，在有了語言之後才清晰了起來，「姊姊」這樣的角色才有了清楚的定位。&lt;/p&gt;
&lt;p&gt;但至於角色或概念怎麼樣被切分，在不同語言就有相異的切法。如英文用了 Sister 形容共同父母的女性親屬，但在中文裡則分成了姊姊與妹妹。而當這些詞彙誕生的同時，文化就跟著產生了。因為重視長幼，所以有分別。&lt;/p&gt;
&lt;p&gt;如果語言是把剪刀，概念就是布料。經過不同剪刀裁剪出來的不同形狀，就是文化。&lt;/p&gt;
&lt;p&gt;看語言怎麼切割概念，就能觀察到特定文化裡重視的事情。日文裁剪出了「木漏れ日」用來描述從樹葉之間灑落的細碎陽光。秋冬之際，家裡附近的車站前種滿了銀杏樹，中午用完餐之後就會在這條街道上散步。坐在橙黃色的銀杏樹下就可以感受到從樹葉隙縫灑落的陽光，還有葉子之間摩擦的窸窣聲響，在冷冽氣溫裡享受著冬陽餘溫。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;ginkgo.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/ginkgo.BQrjK5aJ_1DsVhx.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;隔著一條街則種滿了櫻花樹，春天的尾巴時，走在這條街道就可以看到如大雪紛飛的「桜吹雪」。不論是走在路上偶爾會有花瓣輕輕擦過臉龐，或是行車經過時捲起的粉色漩渦，都體現了這個詞彙的意象。&lt;/p&gt;
&lt;p&gt;但生而為人最有趣的還是可以接觸到不同文化，經過長時間的咀嚼消化後，嘗試著找出自己的定位。語言只是把剪刀，而文化則是裁剪過了布料。但終究需要有個裁縫師來製作衣裳。原來的我們都只擁有一把剪刀，但在這個世界探索夠久了後，就會累積更多的工具與素材，當汲汲營營於生活時，總是只能解決眼前的問題，難以注意到其他選項。&lt;/p&gt;
&lt;p&gt;只有停下腳步沉思後，逐漸找到原生文化中哪邊是自己喜歡與討厭的部份時，才有機會退一步看看實際擁有了哪些不同的布料與琳瑯滿目的針線剪刀。&lt;/p&gt;
&lt;p&gt;是時候當個專屬於自己的裁縫，縫製出自己也喜歡的模樣了。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>專案的消亡也是一種侘寂</title><link>https://yurenju.blog/zh/posts/2026-01-16_wabi-sabi-of-loss/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2026-01-16_wabi-sabi-of-loss/</guid><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;ginkgo-tree-chair.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1638&quot; height=&quot;2048&quot; src=&quot;/_astro/ginkgo-tree-chair.-VDLNl2i_1bIPdu.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;帳號被從前一個專案的組織移除了，真是一個時代的結束，不過也代表另外一個時期的開始。&lt;/p&gt;
&lt;p&gt;之前在看侘寂的書（可能不是你想像的那種侘寂風格），其中一段是觀察事物的建造與消亡，嘗試著欣賞這些狀態轉變的有趣之處。書裡面舉的例子是古代的旅人為了在荒野裡過夜，割下來燈心草箍成一束，過夜之後割掉綁起臨時庇護處的繩子，而這個營地就此消散。&lt;/p&gt;
&lt;p&gt;荒原中留地上散落成一圈的燈心草，隨著時間會慢慢的被風吹散，被土壤中的細菌蠶食腐敗，這樣的美感就是侘寂，也就是「死與新生」。&lt;/p&gt;
&lt;p&gt;燈心草被旅人割下時，作為植物的生命結束了，但又轉為庇護處的新個體成型。隔天解開繩子後，營地又再度崩解，而最終這些殘存都會化做下一個個體的基礎。&lt;/p&gt;
&lt;p&gt;人生也是一樣。一件事情結束後，這些痕跡會慢慢消失，但是腐敗後留下來的養分，總是會滋養著另外一件事情的發芽，如果能夠欣賞這樣的狀態轉變，那也是種侘寂。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>季節之間</title><link>https://yurenju.blog/zh/posts/2025-11-16_between-seasons/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-11-16_between-seasons/</guid><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;「你來東京的這段時間有什麼感想？」&lt;/p&gt;
&lt;p&gt;幾個朋友在不同時間問了這問題，剛開始來的時候、過了幾個月後、甚至到最近這個問題偶爾就會蹦出來，我也經常問自己。這個問題（與答案）就像是在七星潭聽到的海潮聲一樣，海浪一波波的打上來，退去時白色的浪花捲起細碎的石子，滾動的聲響形成了悠揚的節奏。&lt;/p&gt;
&lt;p&gt;「季節感吧，」我說。&lt;/p&gt;
&lt;p&gt;在日本的時光裡，時間的推進會留下痕跡，四季的變化有不同的彰顯方式，像年輪一樣留下密度不一的刻印。&lt;/p&gt;
&lt;p&gt;春天時住所附近的道路兩旁種滿的櫻花，一台小貨卡呼嘯而過捲起了粉紅色飛揚的花瓣。在到處都看得到繡球花盛開的酷夏中滿身大汗的一同參與了祭典抬轎，肩膀上的瘀青還隱隱作痛時，蟬鳴已經慢慢的停了下來，百貨公司洗手間的水龍頭也開始變成熱水了。&lt;/p&gt;
&lt;p&gt;原本在公寓門口外眺望時從沒發現的遠方，隨著入秋後富士山也偶爾撥雲見日的露了出來。&lt;/p&gt;
&lt;p&gt;而這幾天到盛岡的南昌莊，染紅的楓葉跟日式建築好像把時間按了暫停一樣。手腳開始會在這個季節感到寒冷，陽光斜射入室內時會不自主的會伸長四肢到陽光所及的位置。&lt;/p&gt;
&lt;p&gt;在日本的歲月裡，季節感就像是浪花捲起的節奏一樣，一波波的向我襲來。這些記憶若有好好的折疊、書寫與收納，最終就能成為屬於自己的年輪，記錄著在這片土地生活過的痕跡。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;sakura.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/sakura.DdC-4px9_Z1Fotfo.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;hydrangea.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/hydrangea.Ch8rPHU7_Z8Jbnb.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mitaka-festival.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/mitaka-festival.xtIq3fMf_Z1vhReS.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;fujimt.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;1638&quot; src=&quot;/_astro/fujimt.V8nX2A4J_Z2fuViw.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;autumn-leaves.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/autumn-leaves.0XGgW-IT_ZdLOGq.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>書寫是一種遲來的理解</title><link>https://yurenju.blog/zh/posts/2025-11-03_writing-belated-understanding/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-11-03_writing-belated-understanding/</guid><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;writing-belated-understanding.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/writing-belated-understanding.C5NIaUWL_Z13lzfK.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;好幾個月前跟朋友聊到紙筆書寫與鍵盤打字之間的細微差異，後來就逐漸地重新使用筆記本與原子筆寫筆記。我甚至沒有「拾回」手寫的感覺，因為從來沒有開始過。從高中的年紀開始有筆記型電腦後，就幾乎沒有大量手寫了。&lt;/p&gt;
&lt;p&gt;這讓我想到幾年前有次晚上聚餐後，開車載著母親與帶我長大的幾位阿姨們回下榻的旅館，因為他們都陪著我長大，話題不知不覺也回到了小時候。我原本還沒上學前台語很好，但上小學讀書之後，可能是因為教育環境或是同學之間更多使用國語，所以台語就逐漸的變差了。&lt;/p&gt;
&lt;p&gt;「你是不是外省小孩啊？」一位只講台語的親戚經常這樣跟我開玩笑，而慢慢地這樣的「玩笑」也逐漸在親戚之間傳開了。他沒有惡意只是開玩笑，不過後來我就愈來愈不願意講台語，甚至不太喜歡去那個親戚家裡，因為聊沒兩句，又是那句「外省小孩」。&lt;/p&gt;
&lt;p&gt;從此之後，台語再也沒有起色。&lt;/p&gt;
&lt;p&gt;當然我的英語也沒多好，可喜可賀的是長大後因為家教老師教得很有趣，到最後英語也至少到可以溝通的程度，也才覺得語言其實是學得會，而現在又開始重新學起了日文，雖然困難，但是也有覺得慢慢的在進步。&lt;/p&gt;
&lt;p&gt;除了台語很爛以外，另外一個經常被提及的就是「字寫得很醜」，所以在高中年紀有了第一台屬於自己的筆記型電腦之後，大概就下意識的避開了手寫。從此之後就展開長達二三十年的鍵盤打字撰寫各類筆記與文章的人生，打字已經成為了內化的思考方式，那是可以隨著意識逐漸展開的一種與自己對話的方式。&lt;/p&gt;
&lt;p&gt;但經過這幾年對於筆記與書寫的各種研究之後，用紙筆書寫對於思考的影響經常被不同的人提及，這也是為什麼又重新考慮使用紙筆書寫的原因。&lt;/p&gt;
&lt;p&gt;最後我買了一個新玩具 ── 電子紙筆記本，跨越在數位與書寫之間的產物。&lt;/p&gt;
&lt;p&gt;嘗試著用它寫了幾周的日記後，日記撰寫的篇幅愈來愈長了，好像這數十年來沒有書寫的份量，都慢慢的滲透了進去。當然，我是個三分鐘熱度的傢伙，是否能夠持續的使用需要長期的觀察。&lt;/p&gt;
&lt;p&gt;但至少現在很享受「拾回」書寫的感覺。書寫時的連續感確實讓想法在字裡行間咀嚼、組織與醞釀，與在鍵盤上打字的那種節奏段落感有所不同，但都是種不同的思考方式。&lt;/p&gt;
&lt;p&gt;回過頭來，年幼的我在那個當下找不到反抗途徑，好像唯一只有「拒絕」才能有一條出路，拒絕書寫、拒絕講台語。&lt;/p&gt;
&lt;p&gt;但現在的我已經年長，才瞭解這並不是零和遊戲，並不是那種誰贏誰就一定要輸的對抗關係。而是可以找到一個適合自己切入的角度，在各種擅長與不擅長之間，找到一個專屬於自己的定位。&lt;/p&gt;
&lt;p&gt;即使我的字跡一樣潦草，但在這些筆畫之間還是有思考的痕跡，而後轉換成了有趣的想法。最終讓年長後的自己，消解了小時候的困惑情緒。&lt;/p&gt;
&lt;p&gt;而或許有一天我也能重拾台語。希望那天來臨時，我也不再是為了任何人的貶低或誇讚，而是單純只為了自己而學。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>御岳山的大口真神</title><link>https://yurenju.blog/zh/posts/2025-10-18_mitake-ookami/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-10-18_mitake-ookami/</guid><pubDate>Sat, 18 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;metake-jinja-with-mountains.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;1638&quot; src=&quot;/_astro/metake-jinja-with-mountains.BlH0Azgf_ZhCB95.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;御岳山下榻旅館的主人是個很健談的阿姨，用膳時總熱情的介紹關於御岳山的各種大小事情，比如御岳山上極佳的水質、從房間裡面可以遠眺東京灣以及川崎、他家的柴犬有多可愛等等。&lt;/p&gt;
&lt;p&gt;我嘗試用為數不多的日文單字嘗試理解旅館主人說的各種事情，也體會到溝通跟語言是兩種能力，她用著極少的英文單字、大量的日文跟比手畫腳，竟然還讓我聽懂了七七八八。&lt;/p&gt;
&lt;p&gt;不過會來御岳山待一晚，主要是因緣際會得知最近有獵戶座流星雨。最近有很多有趣的機緣都跟夜空有關，就尋思著要找個地方看流星雨。最佳觀賞日是十月 21 日，但天氣預報是陰天，又想起之前來過御岳溪谷勘查戶外抱石的地點，覺得御岳山是個光害很少、適合觀星的地方，所以就在一個距離最佳觀賞日還有一段距離的日子來到御岳山了。&lt;/p&gt;
&lt;p&gt;當然沒看到流星雨呢（笑）。&lt;/p&gt;
&lt;p&gt;最接近的一次是我正在調整腳架拍攝弦月時，突然眼角餘光看到一條明亮的斜線畫過天際。驚訝之餘，仔細回想也不知道是否真的是流星，而有生以來每次有機會看到流星都差不多都是這樣不經意的掃到，看來這次也不是幸運的那天。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;nightsky.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/nightsky.Dlk8VBMM_Z1iLedB.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;不過滿天的星空倒是有的。我把沙發搬到了窗戶旁邊，就直接躺在星空下望著獵戶座，直到睏意來襲，惺忪地睡著幾次之後慢慢的爬回床上就寢。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;ookami-by-akira-himekawa.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;1638&quot; src=&quot;/_astro/ookami-by-akira-himekawa.D-cBkC6U_W5uwl.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;隔天早上用膳時，旅館主人拿出了一張裱框的畫，是六張水墨畫風格的狼，又用日文很詳盡的介紹了這張畫，我只聽懂了「任天堂」出現在對話裡。聽著她跟隔壁房客解釋時，我也查了一下。&lt;/p&gt;
&lt;p&gt;原來狼就叫做 “Ōkami”。&lt;/p&gt;
&lt;p&gt;那不就是卡普空的《大神》遊戲的日文&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;？後來我也慢慢聽到了一些關鍵字，原來是因為鹿跟野豬會吃農夫種的菜，而狼則是會吃這些對農民來說的害獸，所以在這帶才被供奉為神，而御嶽神社所祭拜的「大口真神」就是狼的神明化身。&lt;/p&gt;
&lt;p&gt;這也是為什麼御岳山上這麼多人帶著寵物犬（都是犬科）來祈求寵物健康。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;paw.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;1638&quot; src=&quot;/_astro/paw.Drb60L01_Z2pbOJA.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;後來又多看了幾幅旅館的一些跟狼相關的作品，真的很有《大神》的味道。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;ookami-3.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/ookami-3.CM2zCeY-_Z1jHvIA.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;這種巧合真的很有意思。&lt;/p&gt;
&lt;p&gt;這些記憶原本只是零散的放在腦袋裡，當中有些特別新奇或是在意的片段，就好像夜空裡特別閃耀的星星，所以為這顆星星取了名字。隨著有趣的記憶累積的愈來愈多，有時候這些記憶就意想不到的產生了連結，聯繫起來的星星們，就成了一個星座。&lt;/p&gt;
&lt;p&gt;而每個人都有自己專屬的獵戶座，即使沒有流星也很棒。&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;後來研究了一下，《大神》參考的應該是廣泛的與狼相關的神話，而不是參考御岳山的神話，但這樣跟自己覺得有趣的記憶相連接還是很有趣。那六幅畫則是出自於姫川明（姫川明輝）的作品，負責任天堂《薩爾達傳說》的官方漫畫。 &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded><category>生活</category></item><item><title>牆上紙膠帶貼出的畫框</title><link>https://yurenju.blog/zh/posts/2025-09-27_wall-frame-of-memories/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-09-27_wall-frame-of-memories/</guid><pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;frame.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/frame.DJ1COMjK_Z27tRON.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;距離在牆上用紙膠帶貼上畫框已經好一陣子了。&lt;/p&gt;
&lt;p&gt;最近早上很常聽《Jazz Impressions of Japan》專輯的《Fujiyama》，這首歌帶點寧靜悠揚，很適合從睡醒還在嘗試咀嚼夢中的訊息時，在沖咖啡時讓香氣與音樂慢慢的梳理自己到可以整理思緒的狀態。&lt;/p&gt;
&lt;p&gt;坐在沙發上，抬頭就是這個畫框。&lt;/p&gt;
&lt;p&gt;一直在想該填補些什麼。想說應該是要可以跟自己有所連結的事情，前陣子在咖啡館看到了一張宣傳在吉祥寺的小型畫展的明信片廣告也去看了一下，但也沒找到適合的作品。說到底我也不知道什麼才適合，似乎在真的掛上一幅畫之前，都很難下定決心。&lt;/p&gt;
&lt;p&gt;直到九月份到來，過去的我在行事曆上提醒自己要去看銀座靖山画廊的個人畫展。&lt;/p&gt;
&lt;p&gt;那時剛來日本沒多久，因為去參觀 SOMPO 美術館的《花瓶裡的十四朵向日葵》梵谷畫作，卻意外看到藝術家石神雄介的作品《星を見た日》，一路把我帶回小時候看到滿天螢火蟲、猶如閃爍的銀河般的場景。印象太深刻的關係，我在 &lt;a href=&quot;https://artsticker.app/posts/358740&quot;&gt;ArtSticker 網站&lt;/a&gt; 分享了這段有趣的體驗，這也才知道石神雄介在九月份的個人畫展。&lt;/p&gt;
&lt;p&gt;在畫廊時很幸運地遇到了石神雄介本人，很驚訝也很開心他還記得我的留言。跟藝術家有機會可以當面交流想法真的是很珍貴的機會。一直覺得藝術家想要訴說的事透過作品傳達時，會根據觀眾自身的經驗用一種不同的形式被接收到，而更多的是畫作觸動了觀眾自己的回憶或想法。《星を見た日》描繪了躺在車上看流星雨的場景，但卻帶領我穿越到小時候，想起我和哥哥小時候看到宛如銀河般成千上萬螢火蟲的回憶。&lt;/p&gt;
&lt;p&gt;而藝術家描繪出來的情境，跟觀眾所感受所帶出來的回憶，就像夢境一樣的影像互相交疊融合，在展覽的空間才形成一個獨一無二的觀展體驗。有趣的是當跟藝術家交流這些想法時，說不定我們所談及到對於一件事情不同面向的看法，都有機會成為我們各自的人生中未來創作的作品。&lt;/p&gt;
&lt;p&gt;關於牆上的那個畫框，最終也可以替換成了適合的模樣。夜裡暈開的光點就像是小時候看到的景色，但遠方被照亮的山勢、車尾紅色燈光被拉長的軌跡，這些沒有在記憶中出現的片段，卻就像夢境一樣，光怪陸離又合情合理的交融在一起。&lt;/p&gt;
&lt;p&gt;它就像扇窗戶一樣，但望出去看到的卻是一個跨越時空脈絡所連結起來的夢境。小時候的我、長大的我，還有我所遇到的各種人事物，都在這個夢境裡面交織著。&lt;/p&gt;
&lt;p&gt;這是畫作《追憶の宮殿（瞬く大気）》，來自藝術家石神雄介。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;painting.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;2048&quot; height=&quot;2048&quot; src=&quot;/_astro/painting.CfE8_IYO_CrMBi.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>讓 Claude Code 自己做驗收測試</title><link>https://yurenju.blog/zh/posts/2025-07-22_claude-acceptance-test/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-07-22_claude-acceptance-test/</guid><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近幾個月一直在使用 Cursor 與 Claude Code 進行開發，並且一直在推進邊界，看 LLM 輔助可以到達什麼程度。覺得在這個過程裡面，也遇到大家經常遇到的問題：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;寫得很快，但時好時壞。好的時候很驚訝，壞的時候也很驚訝&lt;/li&gt;
&lt;li&gt;需求不夠清楚時，它會自行補足細節，而這些細節不見得是我要的&lt;/li&gt;
&lt;li&gt;LLM 寫得太快太多讓開發者認知過載，確認內容時總是忍不住想全盤接受&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;經過各種嘗試之後，從一個軟體開發者的角度，我找到了適合自己與 LLM 的工作方法，也就是回歸到驗收測試。經過這麼長時間的 AI 協同工作後，我發現跟 LLM 合作與跟真人工程師合作有許多相似之處：當需求越明確，討論得越多，通常可以產生更符合預期的產出。&lt;/p&gt;
&lt;p&gt;而需求要如何才能明確，就讓我想到剛入行時學習的一套框架 Cucumber 以及其語法 Gherkin。Cucumber 是一套 Behavior-driven development (BDD) 工具，他透過撰寫人類與機器皆可閱讀的文件作為驗收條件。比如說我們如果要開發一個 Todo 軟體，其中一個規格就是要可以按下 Enter 來送出待辦事項，使用 Gherkin 語法就可以這麼敘述：&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light vitesse-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#121212;color:#24292e;--shiki-dark:#dbd7caee; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;gherkin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;  Scenario&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt; Add todo item&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;    When &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt;I enter &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;&quot;Buy milk&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt; in the input field&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;    And &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt;I press the Enter key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;    Then &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt;I should see &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;&quot;Buy milk&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt; in the list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;    And &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt;the input field should be cleared&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但他要怎麼轉化成可自動執行的測試呢？通常要寫一段 glue code 來將規格銜接到測試邏輯：&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light vitesse-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#121212;color:#24292e;--shiki-dark:#dbd7caee; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; Given&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; When&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; Then&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#666666&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;@cucumber/cucumber&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; expect&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#666666&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;@playwright/test&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#758575DD&quot;&gt;// Assume we have a page object to manipulate the browser&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;When&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;I enter {string} in the input field&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#BD976A&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#758575DD&quot;&gt;  // Find the input field and enter text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; inputField&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#666666&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;locator&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;input[type=&quot;text&quot;]&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; inputField&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;fill&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;When&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;I press the Enter key&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; ()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#758575DD&quot;&gt;  // Press Enter key in the input field&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; inputField&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#666666&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;locator&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;input[type=&quot;text&quot;]&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; inputField&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;press&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;Enter&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;Then&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;I should see {string} in the list&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#BD976A&quot;&gt;expectedText&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#758575DD&quot;&gt;  // Verify that the todo item appears in the list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; todoItems&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#666666&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;locator&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;.todo-item&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; itemTexts&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#666666&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; todoItems&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;allTextContents&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;  expect&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt;itemTexts&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;toContain&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt;expectedText&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;Then&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;the input field should be cleared&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; ()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#758575DD&quot;&gt;  // Verify that the input field is cleared&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; inputField&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#666666&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;locator&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;input[type=&quot;text&quot;]&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#CB7676&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BD976A&quot;&gt; value&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#666666&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt; inputField&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;inputValue&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;  expect&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BD976A&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#80A665&quot;&gt;toBe&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D77&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#666666&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以前我在幾個 side project 使用過 Cucumber，但是後來從來沒在 Production 的專案裡面用過，主要還是要導入這樣的機制並不容易，通常團隊可以接受 TDD 的就已經很少見了，更別說要從規格銜接到自動化測試。&lt;/p&gt;
&lt;p&gt;另外也跟我經常是在新創團隊工作有關，通常新創團隊不會有那麼長的時間可以實踐規格到測試的週期規劃。&lt;/p&gt;
&lt;p&gt;但其中最大的一個障礙就是撰寫 glue code 了，因為他是把每個句子拆開來寫成一段動作，所以一個測試場景會被拆成很多小片段，另外撰寫 gherkin 的時候也要很注意，要記得相同功能的句子要寫的一樣，才有辦法在 glue code 裡面被合併。比如說：&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light vitesse-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#121212;color:#24292e;--shiki-dark:#dbd7caee; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;gherkin&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;When &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt;I click the button &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;&quot;ok&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#4D9375&quot;&gt;When &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#DBD7CAEE&quot;&gt;I go to click the button &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#C98A7D&quot;&gt;&quot;ok&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣就會被拆成兩個不同的測試邏輯片段，要記得做相同的事情時，敘述要完全相同。&lt;/p&gt;
&lt;p&gt;總之使用 Cucumber 是個新奇有趣的體驗，但各種阻礙確實讓我沒有在 production 專案使用過 Cucumber。&lt;/p&gt;
&lt;p&gt;但到了 LLM 進行軟體開發的年代事情又不一樣了，因為 LLM 可以直接讀取 gherkin 撰寫的規格，然後&lt;strong&gt;直接執行，不需要寫 glue code&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;由於 LLM 可以直接閱讀以及理解規格，然後藉由  Model Context Protocol (MCP) 直接讓 Cursor 或 Claude Code 來操作瀏覽器、手機模擬器來輔助開發。這也代表我們可以用 gherkin 敘述預期的行為是怎樣後，LLM 可以透過 MCP 自行確認他的開發成果是否可以通過驗收。&lt;/p&gt;
&lt;p&gt;而 Gherkin 語法就可以當作一個很好的橋樑，他是一個標準語法可以讓人類與 LLM 都可以讀懂，所以我們就可以在開發前透過這份規格來確認實作內容，而在開發完成之後可以讓 LLM 執行閱讀這份規格，並且使用 MCP 操作瀏覽器、手機來進行驗收，詳細的展示可以看點選到下面的 Youtube 影片觀看。&lt;/p&gt;
&lt;p&gt;!youtube[WvGY_Jcm_kY]&lt;/p&gt;
&lt;p&gt;這樣除了可以拿來跟 LLM 溝通以外，當它發現不符合驗收條件時，也可以觀察並且修改實作。&lt;/p&gt;
&lt;p&gt;有興趣的話可以到 github 自己試試看： &lt;a href=&quot;https://github.com/yurenju/llm-bdd-coding-demo&quot;&gt;yurenju/llm-bdd-coding-demo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;bdd--tdd&quot;&gt;BDD + TDD&lt;/h2&gt;
&lt;p&gt;BDD 可以透過更明確的規格以及驗收條件，降低產出結果不如預期的問題，但卻不能解決開發者&lt;strong&gt;認知過載&lt;/strong&gt;的問題。而加上循序漸近式的 TDD 可以緩解這個問題。&lt;/p&gt;
&lt;p&gt;當使用 BDD 時，已經可以很好的確定開發規格以及驗收標準，但是另外一個是 LLM 開發現在很經常遇到的狀況，就是 LLM 寫得太快了，當一次產出的內容大過我的認知負擔後，我就會經不起誘惑，直接按下 &lt;strong&gt;確定&lt;/strong&gt;，但有時候不仔細看總是會產出不是我想要的內容。&lt;/p&gt;
&lt;p&gt;為了解決這樣的認知負荷，我最近都在測試 BDD + TDD。BDD 的部分跟前面敘述的一樣使用 Gherkin 作為驗收標準。但我會請 LLM 拆解元件，並且在開發每一個元件時，遵守以下的順序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先寫介面 (Interface)、空類別或是空函式，並且拋出未實作的錯誤如 &lt;code&gt;throw new Error(&apos;not implemented yet&apos;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;請它&lt;strong&gt;只寫測試敘述&lt;/strong&gt;，也就是自動化測試的 &lt;code&gt;describe(&apos;敘述&apos;)&lt;/code&gt; 與 &lt;code&gt;it(&apos;敘述&apos;)&lt;/code&gt;，並且讓我檢查，不要實作任何測試邏輯&lt;/li&gt;
&lt;li&gt;接下來我會知道它想要寫大概到什麼程度的測試，並且直接在這個階段跟他溝通測試的顆粒細度，通常我都會大砍測試項目，因為一般來說它會寫得太細&lt;/li&gt;
&lt;li&gt;確認測試項目之後，再請他寫測試邏輯&lt;/li&gt;
&lt;li&gt;執行測試，這個時候應該新增測試都要是錯誤的（紅燈階段）&lt;/li&gt;
&lt;li&gt;請它開始實作，並且在實作完後跑測試，理論上我們寫的測試最後要全部通過（綠燈階段）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在這樣的開發流程下，就可以確保每個階段的產出都在我的認知負荷內，我可以很好的確認它的產出，然後有明確的「什麼是對的」之後，跟 BDD 流程相同，在有明確的完成條件下它可以做得很好。&lt;/p&gt;
&lt;p&gt;如果你對這樣的開發流程有興趣，你可以參考我之前寫的 &lt;a href=&quot;https://github.com/yurenju/cursor-tdd-rules&quot;&gt;yurenju/cursor-tdd-rules&lt;/a&gt;，如果需要在 Claude Code 使用的話還需要稍微修改一下。&lt;/p&gt;
&lt;p&gt;不過請記住這些都是還在發展的合作協同開發方式，現在工具跟使用技巧更新的很快，或許很快就不適用了。&lt;/p&gt;
&lt;p&gt;使用的這樣開發方式，最主要的目的就是要降低自己的認知負擔，讓專案可以在自己的掌握下盡可能使用 LLM 來完成我的目的，同時也透過劃定邊界、目標的方式更好的跟 LLM 溝通自己的目標到底是什麼。&lt;/p&gt;
&lt;p&gt;而在這樣的過程中，我也覺得在開發初期就會更清楚自己想要什麼。跟 LLM 一起工作與跟人類工作的訣竅都差不多，就是要更頻繁的溝通與確認需求。&lt;/p&gt;
&lt;p&gt;所以或許跟與人類一起工作也沒什麼太大差別，加強自己的溝通能力就是了。&lt;/p&gt;</content:encoded><category>技術</category></item><item><title>叫 AI 幫我寫程式，結果他聽不懂人話？</title><link>https://yurenju.blog/zh/posts/2025-04-23_ai-coding-doesnt-understand-me/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-04-23_ai-coding-doesnt-understand-me/</guid><pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近公司的一個新專案的其中一個子專案實驗了新的開發方式：嘗試絕大部分的程式都使用 AI (Cursor) 編寫，盡可能地減少人為介入，希望透過進行小範圍的嘗試來理解未來可能的軟體開發模式。&lt;/p&gt;
&lt;p&gt;我們也希望透過 AI 的協助可以讓我們大幅度的縮短開發時程，達到以下的效果：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;reduce-development-cycle.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;952&quot; height=&quot;620&quot; src=&quot;/_astro/reduce-development-cycle.DfsiRO6k_4RYfV.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;如果你也嘗試過在稍微大的專案這麼做，你可以猜到我們初期的結果是這樣：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;expected-and-actual.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;952&quot; height=&quot;620&quot; src=&quot;/_astro/expected-and-actual.DN7tC4id_G5Qat.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;只要想要讓 AI 多做一點事情時，就經常會無法照著預想做。大部分可以一次就完成的工作，通常都是簡潔明瞭，不容易有疑義的任務，這個通常一次就可以做得很好。&lt;/p&gt;
&lt;p&gt;當然我們不會因為這樣就不用 AI 進行開發了。就自己來說，現在有超過八九成的程式碼都是用 AI 開發的了，其中大量地使用對話的方式進行開發。而由於 AI 有深厚的軟體開發能力，而我可以認真地當一個監工，確保他的工作能夠如預期的完成。&lt;/p&gt;
&lt;p&gt;但到底要怎麼樣達到這一步？實際在專案導入 AI 前，得先回到平常在團隊裡面是怎麼開發軟體專案的。&lt;/p&gt;
&lt;h2 id=&quot;以往的軟體開發討論&quot;&gt;以往的軟體開發討論&lt;/h2&gt;
&lt;p&gt;在以往的軟體開發流程當中，團隊內經常會透過從產品面向進行策略上的討論，到工程團隊之後開始討論技術解決方案，經過了開會討論以及文件記錄，最終大家取得共識之後，在一次次的開發迭代之後，逐漸開發出產品。&lt;/p&gt;
&lt;p&gt;所以軟體開發流程裡面很重要的是團隊的&lt;strong&gt;共識&lt;/strong&gt;以及&lt;strong&gt;脈絡&lt;/strong&gt;，當我們只靠著幾句話就期待 AI 可以透過他所學習到的軟體工程師常識做出我們心目中理想的系統，缺乏的就是傳遞最重要的共識與脈絡給它。&lt;/p&gt;
&lt;p&gt;因為它不是你的蛔蟲，不會從短短的幾句對話知道這些脈絡。&lt;/p&gt;
&lt;p&gt;團隊之間可以透過開會以及文件來凝聚共識與梳理脈絡，那我們怎麼樣給 AI 這樣的資訊呢？有幾件事情可以嘗試看看。&lt;/p&gt;
&lt;h2 id=&quot;用規則-rule-定義方向&quot;&gt;用規則 (Rule) 定義方向&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;rule-for-right-track.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1904&quot; height=&quot;1241&quot; src=&quot;/_astro/rule-for-right-track.Ccz50Og7_Z11rC5v.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;在 Cursor 裡面可以定義規則，雖然說要寫優質的規則還是需要花很多時間推敲與改善，但規則還是可以為 AI 訂定一個大致上的方向，讓行事作風可以更接近團隊。&lt;/p&gt;
&lt;p&gt;比如說要不要寫測試？要寫到什麼程度？偏好怎麼樣的 git commit message？元件的撰寫慣例、命名規則與採用的技術堆疊是哪些？這些沒有交代時，他經常就會隨心所欲，就像是一個剛加入團隊還沒適應開發文化的軟體工程師。&lt;/p&gt;
&lt;h2 id=&quot;切分規格-spec逐步前進&quot;&gt;切分規格 (Spec)，逐步前進&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;rules-specs-impl.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1904&quot; height=&quot;1241&quot; src=&quot;/_astro/rules-specs-impl.DIlftk9A_6AljF.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;實作前先寫一份功能規格（當然是請他寫），並且先充分的閱讀與討論規格，確保他想做的事情跟你想做的事情一樣，確定之後再請他實作。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;rule-spec-workflow.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1904&quot; height=&quot;1241&quot; src=&quot;/_astro/rule-spec-workflow.D4vnUEhT_ZpHewc.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;至於功能規格不用全部都自己寫，我們的狀況是通常會先把任務在專案管理服務（比如說 Asana）先開出來之後，我會先把我所知道這個任務要做什麼告訴它，並且請它寫出規格，然後就它展開的這份規格進行討論與更新，完成規格之後再開一個新的 Chat Context 請他按照這份規格實作。&lt;/p&gt;
&lt;p&gt;如果覺得規格寫得不好，那就修訂產生 spec 的 rule，讓團隊之後要生成 spec 都可以有更好的文件品質。&lt;/p&gt;
&lt;p&gt;至於規格的篇幅長短會依照團隊習慣有所不同，但是小一點的話閱讀起來比較容易，同時也比較可以按照我們的意思開發，這也有助於我們更好的達成目標。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;feature-specs.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1904&quot; height=&quot;1241&quot; src=&quot;/_astro/feature-specs.C9NK3AYu_Z1e9vYV.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;前面有提到沒有脈絡或共識，會很難讓它做出我們想要的產品。除了透過 Rule 建立脈絡與共識外，另外避免這個問題的方法是訂出目標之後，先不要一次把所有規格寫出來，而是只寫你正要完成的那個功能的規格。&lt;/p&gt;
&lt;p&gt;由於我們會根據它寫的 spec 來矯正它想前進的方向，所以在每一次撰寫與實作一份 spec 時都能修正偏差，這樣就能讓專案從想法往實際產品的路上可以朝著預期的方向。&lt;/p&gt;
&lt;h2 id=&quot;規格最好有驗收條件&quot;&gt;規格最好有驗收條件&lt;/h2&gt;
&lt;p&gt;規格的內容會跟著每個團隊的不同而有差異，但會建議有驗收條件 (Acceptance Criteria)，這個驗收條件是用來明確的告訴 AI 怎麼樣才是完成了，這樣明確的條件可以讓 AI 更具體地知道它到底要完成到什麼程度。&lt;/p&gt;
&lt;p&gt;而驗收條件有很多方式，從工程師的角度來說可以用自動化的測試或是檢驗來代替，比如說單元測試或是整合測試。另外如果是在進行網頁應用程式的開發，可以用 &lt;a href=&quot;https://github.com/microsoft/playwright-mcp&quot;&gt;microsoft/playwright-mcp&lt;/a&gt; 跟 AI 說直接打開瀏覽器看目前的結果是什麼，讓他直接開啟網頁操作來驗證。&lt;/p&gt;
&lt;p&gt;當它可以更好的判斷目前的成果時，就更容易地可以判斷完成度並且採取後續行動。&lt;/p&gt;
&lt;p&gt;如果沒辦法自動化檢測，那也可以請他列出手動測試的方式，由開發者自行驗證，然後再跟他說結果。不過當然還是可以由他自行檢驗、自行修正會更好。&lt;/p&gt;
&lt;h2 id=&quot;到目前為止&quot;&gt;到目前為止…&lt;/h2&gt;
&lt;p&gt;因為我們也還在嘗試這樣的開發模式，在這樣的過程中也很有多需要調整的地方。目前覺得從 rules -&gt; spec -&gt; implementation 這樣的工作流程運作起來還行，寫 spec 時就有機會跟 AI 討論以及更新計畫，這樣就可以在開始動工前，先調整成我們想要完成的樣子。&lt;/p&gt;
&lt;p&gt;但我們也遇到了 Cursor 不太擅長遵守規則的問題。雖然說隨著時間這些問題應該會慢慢地被修正，或是累積出更好的實踐方式。不過在那天到達前我們大概都要經常得修改規則，目前確實覺得規則寫太長就會開始忘東忘西，明確並且短一點會更好，另外規則的敘述也很重要，因為會影響 AI 什麼時候會想要套用特定規則。&lt;/p&gt;
&lt;p&gt;另外，最近也滿多人談論 Vibe Coding，也就是用近乎直覺的方式用對話進行開發，不太管實作細節。&lt;/p&gt;
&lt;p&gt;但其實所謂的「直覺」很大一部份都是你在一個領域已經有了深厚的背景知識與經驗，所以才能讓你看起來毫不費力地的用「直覺」完成，實際上並不是每個人都可以做到，更何況在還牽涉到表達能力。&lt;/p&gt;
&lt;p&gt;要達到這個程度，還是得看操作的人對於這個產品的領域是否有足夠深入的看法，以及具備足夠細緻清晰的表達能力。&lt;/p&gt;
&lt;p&gt;我會覺得每個人應該都從自己的角度切入，看自己適合用怎麼樣的方式跟 AI 一起協作開發軟體專案。身為軟體工程師與一個好奇的人，再加上自己在經年累月的寫作有累積了一定的表達能力，就會採取適合我的方法跟 AI 協作，更精準的描述自己的需求、切分工作、設定驗收條件與軟體開發偏好，甚至用自動化測試的方式來讓 AI 可以做得更好。&lt;/p&gt;
&lt;p&gt;我只是從我的角度出發，了解自己喜歡與擅長什麼，然後訂製了跟 AI 的工作流程，而也在這個互動時發現到了比起寫程式，我更喜歡打造產品。與 AI 互動時才有機會把這兩件事情拆得更開，回過頭來理解自己。&lt;/p&gt;
&lt;p&gt;而每個人都不同，我的建議是回過頭審視自己喜歡什麼、擅長什麼，再找到一個適合的方式跟 AI 協作，理解自己這件事情是沒有捷徑的，每個人就是要花很多時間探索。&lt;/p&gt;
&lt;p&gt;甚至如果你的興趣就是自己撰寫程式，這個過程讓你感到快樂的話，那或許不用 AI 對你才是最好的。&lt;a href=&quot;https://www.youtube.com/watch?v=pVr3sEeus6E&amp;#x26;t=1245s&quot;&gt;浦澤直樹的專訪&lt;/a&gt;中提到了對 AI 繪圖的看法，他說：「因為我覺得繪畫是很快樂的事情，像我可以在工作中找到樂趣的人來說，交給 AI 做不就太可惜了嗎？」。&lt;/p&gt;
&lt;p&gt;大眾都在追求的東西，不見得就是適合你，還是得回過頭來理解自己是怎樣的人，對什麼事情充滿熱情，用屬於自己的觀點邁出下一步。&lt;/p&gt;
&lt;p&gt;AI 聽不懂人話沒關係，你嘗試著理解你自己更重要。&lt;/p&gt;</content:encoded><category>技術</category></item><item><title>在 Claude Desktop 內直接進行代幣買賣</title><link>https://yurenju.blog/zh/posts/2025-03-13_uniswap-mcp/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-03-13_uniswap-mcp/</guid><pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;對話型 AI 工具最早都無法存取任何外部資訊，後來才逐漸地加入外部工具如搜尋功能。但「搜尋」這樣的功能又大又廣，針對一個特殊的功能比如說看天氣、查股票價格等等雖然搜尋網路資料也做得到，但還是比不上直接透過 API 整合一個新的天氣或是股市功能。&lt;/p&gt;
&lt;p&gt;回過頭來看網路上的服務成千上萬，不可能一一的透過 API 接上。更何況有些工具並不是 HTTP API 形式，而是本地電腦才有的工具。比如說寫程式的時候，希望編輯器可以存取到瀏覽器的精確畫面、結構以及開發者除錯資訊，這些就無法透過 HTTP API 的形式接上。&lt;/p&gt;
&lt;p&gt;而 MCP 就是一套開放標準，用來讓 AI 理解要怎麼樣去取用一個工具。比如說希望它幫忙管理待辦事項，就使用一組 Asana 的 MCP 透過 API 連接上待辦事項服務，這樣就可以讓它協助規畫整個專案以及撰寫所需要的資料，甚至管理任務的相依性等等。&lt;/p&gt;
&lt;p&gt;前面舉例的瀏覽器協助開發，也可以透過 &lt;a href=&quot;https://github.com/executeautomation/mcp-playwright&quot;&gt;mcp-playwright&lt;/a&gt; 來操作瀏覽器以及直接閱讀 console 判斷錯誤以及自動修正。&lt;/p&gt;
&lt;p&gt;剛好工作上有個相關的任務需要研究相關的事情，就嘗試透過 Protocolink, Moralis 寫了一個 Uniswap 的 MCP，讓它可以直接在 Claude Desktop 進行交易。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;uniswap-mcp.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1704&quot; height=&quot;1344&quot; src=&quot;/_astro/uniswap-mcp.CdheqHGK_18vyDW.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;可以到 &lt;a href=&quot;https://www.youtube.com/watch?v=7fRmwQYaBLg&quot;&gt;這個 Youtube 連結&lt;/a&gt; 看展示。&lt;/p&gt;
&lt;p&gt;做完之後又讓我想到了這近十年來傳訊軟體的發展。在最早以前是 LINE 跟 Telegram 的 mini app 開始流行推廣，不過後來大多都導到外部網頁實作大部分功能，僅有小部分簡易的 UI 會內嵌在傳訊對話裡面。如果是我也會這麼做，畢竟在外部網站實作還是比較簡單，只要在最必要的使用者驗證在 LINE 裡面處理就好。&lt;/p&gt;
&lt;p&gt;而前幾個月看到 Vercel 的  &lt;a href=&quot;https://vercel.com/blog/ai-sdk-3-generative-ui&quot;&gt;AI SDK 3.0&lt;/a&gt; 是我意識到未來軟體使用者介面可能會很不一樣的時刻。他的公告裡面包含了一個工具可以詢問天氣之後，直接產生一個天氣的顯示介面。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;vercel-ai-sdk.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1653&quot; height=&quot;757&quot; src=&quot;/_astro/vercel-ai-sdk.B-R26kZc_1WPIDt.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;我原本以為是完全動態產生 UI，後來仔細看了一下文件原來還是要&lt;a href=&quot;https://sdk.vercel.ai/docs/ai-sdk-ui/generative-user-interfaces#create-ui-components&quot;&gt;預先定義 UI&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;不過即使他們還沒做到，但是也開啟了一個想像空間：假如說未來 UI 元件可以根據收到資料的脈絡，動態的組合出適合的 UI 介面，那會是怎麼樣的體驗？如果往後的使用者互動跟現在完全不一樣呢？會是語音對談之後，直接完全動態的產生合適的使用者介面嗎？&lt;/p&gt;
&lt;p&gt;那在你我所在的產業，又會產生怎麼樣的影響？&lt;/p&gt;
&lt;p&gt;我覺得嘗試著去投射或是想像未來是件有趣的事情，未來看起來是混沌又有趣的，但我希望有趣的成分多一點。&lt;/p&gt;
&lt;h2 id=&quot;後記&quot;&gt;後記&lt;/h2&gt;
&lt;p&gt;這個 uniswap-mcp 只是為了研究目的而撰寫，程式碼 99% 全部都是由 Cursor 寫的。你我都知道，我們不該把私鑰透過環境變數傳入程式，但如果還是很好奇的話，以下是它的源碼，請只拿來做測試與研究，還有不要放太多錢進去。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yurenju/uniswap-mcp&quot;&gt;https://github.com/yurenju/uniswap-mcp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>技術</category></item><item><title>寫在 Perplexity Comet 瀏覽器釋出之前</title><link>https://yurenju.blog/zh/posts/2025-02-25_before-perplexity-comet/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-02-25_before-perplexity-comet/</guid><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;perplexity-comet-browser.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1966&quot; height=&quot;745&quot; src=&quot;/_astro/perplexity-comet-browser.BynsB0Tb_Z1LJI8J.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;Perplexity 要推出新的瀏覽器 Comet 了，雖然不知道它實際上會推出怎樣的瀏覽器，但是想像一下是滿有趣的。假設這個瀏覽器是人類跟 AI 協作一起上網，比如說你想要找什麼資料，他會幫你到各個搜尋引擎搜索跟閱讀整理資料。你需要改 Google Docs 或是 Notion，他可以直接幫你打開網頁更新文件。如果是這樣的話我覺得改變會滿大的。&lt;/p&gt;
&lt;p&gt;之前有聽過一個為什麼要做人形機器人的原因，是因為整個世界都是用人作為參考去設計的，樓梯、門把、洗衣機、電視遙控器等等。一個新的造物如果是別種型態，就沒辦法操作這些累積的幾百幾千年的基礎建設。&lt;/p&gt;
&lt;p&gt;我覺得這個瀏覽器感覺有點類似這樣。以往的網路服務如果想要讓機器存取，就需要開新的 API 才作得到。甚至面對各種自動化爬蟲還設置了真人偵測器，比如說像是 reCAPTCHA。&lt;/p&gt;
&lt;p&gt;但如果接下來的瀏覽器，是人跟 AI 協作上網時，一下子許多基礎建設都可以使用了，自動化操作再也沒有了藩籬，需要人接手操作時，AI 會請求你幫忙一下，通過之後他再繼續工作。這樣想像起來的未來世界是很不一樣的，很多以前覺得要跨網頁服務的整合，一下子都變得簡單了起來 — 同時我們還要解決很多新問題 🤣&lt;/p&gt;
&lt;p&gt;未來果然還是混沌又有趣的，我希望有趣的成分比混沌多一點。&lt;/p&gt;</content:encoded><category>技術</category></item><item><title>甘露咖啡</title><link>https://yurenju.blog/zh/posts/2025-02-24_nectar-coffee/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-02-24_nectar-coffee/</guid><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;nectar-coffee.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1200&quot; height=&quot;1200&quot; src=&quot;/_astro/nectar-coffee.BGpzhQdv_Z209G3w.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;當開著車沿著雪山隧道往頭城方向前進時，我們總是在路上談論一些生活中微小的事情。有時候談到那道從窗外斜射入室的光線怎麼樣映照在籐製的椅子上，有時候談到宜蘭花店老闆的 podcast，有時候談到全世界似乎只有我們被困擾的小事情。&lt;/p&gt;
&lt;p&gt;通常還沒討論出結果來，我們已經坐著電梯到頂樓，跟老闆 Natalie 打了聲招呼，在甘露咖啡拉開椅子坐下來了。話題還沒結束，此時又要苦惱著今天要喝什麼咖啡；那杯我也想喝的限量咖啡的十個圈圈是不是已經都寫上其他客人的名字；或是暗暗竊喜的把最後一個圓圈簽上自己的名字。&lt;/p&gt;
&lt;p&gt;話題還沒結束，老闆又加入戰局，提出一些更不能收尾的討論方向，一邊端上好喝到讓人瞪大眼睛合不攏嘴的咖啡，而話題就開枝散葉的持續到回家的前一刻。&lt;/p&gt;
&lt;p&gt;由於總是沒有答案，甘露咖啡原本似乎是我們的目的地，但它總成為旅途的一部份。&lt;/p&gt;
&lt;p&gt;上個月去甘露咖啡時，跟 Natalie 提到接下來我要去東京工作了。在驚訝之餘，我們也交換了很多關於生活的看法，生活就是一種流動且沒有對錯的抉擇，我們在每條岔路上做的每個選擇，都沒有重頭來過的機會。與其懊惱與後悔，不如接受沒人有全知之眼可以看透每個歧路的各種結局。告訴自己，當下的我們已經努力做出最適合的那個決定了。&lt;/p&gt;
&lt;p&gt;剩下就是學著欣賞旅途中的風景了。&lt;/p&gt;
&lt;p&gt;最近甘露咖啡貼出了公告，最後的營業日是一周之後。我很開心 Natalie 宣布了屬於自己的決定，也很享受在頂樓的這間咖啡館度過的每段時光。我們一起嘗試過頌缽；討論過咖啡味道的音樂性與顏色；看著朋友在可以遠眺龜山島、風光明媚的陽台上喝著酒苦著臉開視訊會議；我在這羨慕著朋友按下 GR 膠捲相機的快門；我們討論著《我的完美日常》帶來的感動。&lt;/p&gt;
&lt;p&gt;起初開著車穿越雪山隧道時，總覺得甘露是一個目的地，但它從來不只是。當我們在黃昏時揮手道別時，它已經從目的地蛻變成為我與朋友們珍藏的一段美好旅程了。&lt;/p&gt;
&lt;p&gt;當我走進在吉祥寺的咖啡館，收到那張也畫了圈的集點卡時不禁莞爾一笑。我知道了，在這刻甘露咖啡已經隨著我一起踏上了全新的旅程。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>SOMPO 美術館的淡藍色夜空</title><link>https://yurenju.blog/zh/posts/2025-02-11_sompo-in-pale-blue/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-02-11_sompo-in-pale-blue/</guid><pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;sompo-outside.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1200&quot; height=&quot;1200&quot; src=&quot;/_astro/sompo-outside.BfiHgES__1ruhcG.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;今天去 SOMPO 美術館看了在亞洲唯一典藏的梵谷向日葵系列畫作《花瓶裡的十四朵向日葵》，不過意外的發現了另一個藝術家石神雄介跟夜空相關的作品，讓我想起幾件小時候的事情。&lt;/p&gt;
&lt;p&gt;其一是小時候我曾經參加夏令營，其中一天營隊借宿在山上的學校。那天晚上只有一些細微的蟲鳴聲，出奇地安靜。學校這側無風無雲，而遙遠的夜空則是一陣陣的打著閃電。就像是按住快轉鍵的快轉方式一樣，閃電瞬間蔓延織成了蜘蛛網，銀白色的複雜線條交錯著，瞬間佈滿了遠方的天空。原本預期幾秒後的延遲轟然巨響會隨之而來，但它卻從來沒有從那側遙遠的夜空傳過來。&lt;/p&gt;
&lt;p&gt;就這樣，閃電像是默片一樣反覆地在遠方的夜空閃現交織、消失，直到我沉沉睡去。&lt;/p&gt;
&lt;p&gt;其二是小時候我跟我哥在南投，夜晚跟著父親的獵人朋友們一起去打獵飛鼠。隨著深入後山，晚上伸手不見五指的狀況，已經不容得獵人們繼續帶著孩子前行了。這個時候獵人叔叔就要我們在原地等候，等到他們打獵結束之後再原路回來找我們。&lt;/p&gt;
&lt;p&gt;我們兩個小孩就這樣在後山的一片森林裡面，那時真的是不知道天高地厚，這個地方是完全沒有任何人造光源的地方，但不知道為何當初也不曾感到害怕。原本我們還在嘻笑聊天，不過過了一陣子之後我跟我哥都安靜下來，看著夜裡的森林慢慢的變化。&lt;/p&gt;
&lt;p&gt;周遭竟然緩緩地亮了起來，我們被數以千計的螢火蟲包圍了。就像是置身於銀河一樣，璀璨的星系降落到我們身旁。即使沒有地球大氣的散射作用，這些星星也還是像呼吸一樣的一閃一滅，就如同恆星一樣的展現生命力。而這一幕就這樣深深烙印在心裏，成為了一輩子無法忘記的光景。&lt;/p&gt;
&lt;p&gt;在東京都現代美術館的坂本龍一展覽裡面有一段敘述：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你會想起多少次童年中某個特定的下午，某個深深成為你生命一部份的下午，如果沒有它，你甚至無法想像自己的人生？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;這兩次經驗確確實實的構成了我，在長大成年的數十年裡偶爾就會想起這幾夜的場景，成為我身而為人的基石。這或許也是我為什麼喜歡各種跟夜空相關的藝術作品，比如 Emilíana Torrini 的歌曲《Nightfall》總是讓我覺得人就是無垠星空當中的一個流星，劃過星空時跟誰相遇都是一種難得的緣分。&lt;/p&gt;
&lt;p&gt;所以我看到這幅《星を見た日》(The day we saw the stars) 時，也一樣地被夜空、流星以及人物像是夢境般的透明質感吸引了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;the-day-we-saw-the-stars.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;960&quot; height=&quot;1200&quot; src=&quot;/_astro/the-day-we-saw-the-stars.BqdNqV5H_2b1i4.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;看著這幅畫，心裡又響起了《Nightfall》。就跟歌詞裡面描述的那樣，生命就僅僅只是一個閃爍的瞬間，就像是一道流星劃過夜空，被日落時的光影輕輕地托著飛行，穿越在這短暫而美麗的淡藍色夜空裡面。&lt;/p&gt;
&lt;p&gt;如果我們在夜空中千載難逢的相遇了，那就頷首微笑點個頭吧。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>集點卡與歸屬感</title><link>https://yurenju.blog/zh/posts/2025-02-03_point-card-belonging/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2025-02-03_point-card-belonging/</guid><pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;point-card-belonging.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1200&quot; height=&quot;1200&quot; src=&quot;/_astro/point-card-belonging.CWcfMUTZ_Z17XkAv.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;不像家裡寢室的窗簾的嚴密遮光，最近早上起來會看到窗簾與窗戶之間的間隙透出的光，迷迷糊糊地提醒著我已經不在家了。不過這也有其他好處，這讓我更明顯的感受到一天的框架，就像《我的完美日常》裡面每天早上聽到寺院的掃地聲一樣。&lt;/p&gt;
&lt;p&gt;最近跟朋友談到了幾次關於歸屬感，提到對一個地方的喜愛，不再需要與家鄉或是任何地方比較，而是單純的喜歡時，那就是一種歸屬了。但是這種觀察往往要等到已經成為在地人才能展現出來。那麼剛踏入異鄉的人呢？身為外人要怎麼樣開始融入？&lt;/p&gt;
&lt;p&gt;我想，還是得從垃圾分類做起。可燃、不可燃垃圾的界線，分清楚寶特瓶與「可回收的塑膠包裝與容器」是不同的，仔細研究說明後突然恍然大悟，這也讓我從心裡快樂，也或許就是那融入的第一步。&lt;/p&gt;
&lt;p&gt;前幾天晚上又回到吉祥寺，想起了朋友推薦的咖啡館，之前晚餐前在那邊喝了咖啡，很喜歡那邊的氛圍。上次來的時候有一對年邁的夫婦帶著他們的寵物狗一起進來喝咖啡，黃昏時窗外的人群輕鬆的在這條街道上散步，店裡賣著咖啡豆與咖啡館特製的衣服，上面寫著「Light Up」，我想大家會喜歡吉祥寺是有原因的。&lt;/p&gt;
&lt;p&gt;想到這裡，天色已經暗了下來，街邊的路燈也點著了。看看手錶還差半個小時才關門，還是決定去外帶一杯咖啡。&lt;/p&gt;
&lt;p&gt;點完咖啡時，服務生突然問了我一句話，一時沒有聽清楚關鍵字，就說了「はい」。後來他抽出了一張小卡，慎重地在第一格寫上咖啡品項與日期，原來是集點卡。&lt;/p&gt;
&lt;p&gt;或許，集點卡也代表融入的那一步，這也代表著我有可能來這邊喝十次咖啡，蒐集滿一次折扣機會，而那次折扣就會像是徽章一樣，慶祝著我更深入的與這個社區連結了。&lt;/p&gt;
&lt;p&gt;而到底要幾張集點卡才能產生歸屬感呢？如果有一天早上，看著窗簾透進來的陽光與掃地的聲音，再也不用想起家裡的窗簾遮光有多嚴密時，我才能把家的感覺，延伸到另外一座城市吧。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>《言葉之庭》與《我的完美日常》之間的疑問與解答</title><link>https://yurenju.blog/zh/posts/2024-12-31_perfect-answers-with-questions/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2024-12-31_perfect-answers-with-questions/</guid><pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;Shinjuku Gyo-en.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1200&quot; height=&quot;724&quot; src=&quot;/_astro/Shinjuku%20Gyo-en.CNPe3EqT_CfwK6.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;今天跟 Chialin 聊到為什麼我喜歡《言葉之庭》以前的新海誠，或許是因為那個時期的他想要表達的事情很細微，甚至是大家都不太在乎的事情。像是小時候心裡的一些情愫，在那個時候沒有好好的理解，成長至今偶爾想起來時，還會被困在小時候的場景。&lt;/p&gt;
&lt;p&gt;《言葉之庭》的青年喜歡上比起自己年長的異性，《秒速五公分》的小學生在還沒理解自己心意時，就與產生好感的對象分離到一個自己無法想像的異鄉，《雲的彼端》在訂下約定之後就從此音訊全無，直到成年。&lt;/p&gt;
&lt;p&gt;這些事情長大後來看似乎都可以莞爾一笑來面對自己青澀的回憶，但小時候的自己對這件事情是完全無法理解，而心裡的感受與掙扎是那時一生中最震撼的回憶。&lt;/p&gt;
&lt;p&gt;這幾天整理文章的時候又翻到對以前自己的評論：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;這次我終於下定決心整理了自己所有在 blogger 與 medium 上面的文章。就跟實體的搬家一樣，這個過程總是雜亂又痛苦，但當拿起自己十幾年前無意間寫下的文章時，我討厭那個幼稚的自己，同時間又羨慕他可以那麼不在乎。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其實我自己小時候的疑惑，有些到現在也還沒答案，偶爾想起來，也不知道該用什麼心情面對。&lt;/p&gt;
&lt;p&gt;而新海誠早期的電影就像是把小時候刻骨銘心的震撼與困惑，經過數年的沉澱之後又重新透過電影傳遞一般。而那些依然困惑的人，就會被這樣的細微心情給吸引並感動。&lt;/p&gt;
&lt;p&gt;而《我的完美日常》則是另外一方面的感受，更像是思想經年累月的淬鍊之後，在每天日常生活的重複洗禮下，找出了那條平凡、單調，但又無比美麗的路徑，引領著自己在這條小徑上面重新發現生活中的美好之處，即使偶爾想起過往的回憶會忍不住地落淚，但是回到那個周而復始的生活當中後，還是能夠打起精神，持續在每日生活當中察覺那些美好部分。&lt;/p&gt;
&lt;p&gt;新海誠的困惑，相對於文·溫德斯的堅定是個很有趣的對比。前者困在小時候的情愫，無法解釋的狀況下，透過超越細節的場景敘述將觀眾投射到了他所構築的想像世界，與觀眾分享了他的困惑。而文·溫德斯則是堅定地給出了他自己的答案，但同時也展現自己的困惑之處。&lt;/p&gt;
&lt;p&gt;不管是疑問或是答案，那都是探索的一種，他們都已經在屬於自己的回答上走的夠遠了。我也經常在回答屬於自己的疑惑，每次下決定時總是不知道這樣的決策是好是壞。&lt;/p&gt;
&lt;p&gt;到頭來，或許根本沒有所謂好壞，那就只是一條持續向前的路，每次的疑問與答案之間都是在一次次的重新定義自己，好好地打磨刻畫成自己想要的模樣。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>夢、日夢與那些懸而未決的事</title><link>https://yurenju.blog/zh/posts/2024-12-23_dreams-and-daydreams/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2024-12-23_dreams-and-daydreams/</guid><pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;ceiling-tree-shadows.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1200&quot; height=&quot;1200&quot; src=&quot;/_astro/ceiling-tree-shadows.o0hHMLl-_ZHbUpu.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;有一種說法是夢境是鞏固記憶的副產品。當人沉沉入睡時，當天獲得的各種喜怒哀樂的體驗會在大腦中整理歸檔，將一部分新形成的記憶收納到長期記憶當中，而搬動時揚起的塵埃，就形成了夢境。&lt;/p&gt;
&lt;p&gt;另外一方面，在一些在清醒時放空的時刻，我的思緒偶爾也會飄離。比如說早上起床時坐在還沒開燈的客廳發呆，看著斜射入客廳的陽光映在窗簾上，想起了昨天跟人對話時的彆扭情緒；或是沖咖啡等待悶蒸的三十秒空檔，想起便利商店的店員貼心的舉動。&lt;/p&gt;
&lt;p&gt;清醒時的思緒飄盪在《空間詩學》裡面稱為「日夢」。這個過程釐清了我的思緒，無意識地暗暗決定了下次我該怎麼做，這些看似隨機的飄動，仔細端看都是我說不出口，但卻在乎的事情。&lt;/p&gt;
&lt;p&gt;夢與日夢是個循環過程。夜裡做夢的成因是大腦歸納記憶，白天的日夢則導致了價值觀的重新梳理，而這梳理過的價值觀又或許成為晚上做夢的新題材。&lt;/p&gt;
&lt;p&gt;這樣一次次的將自己的記憶折疊收納之後，就形塑成了一本自我預言的解答之書。它沒辦法隨意翻閱，但是在未來發生各種事情時，心裡會迅速地翻到對於這件事情該有的情緒反應那頁，讓我在開心時開心，悲傷時悲傷。&lt;/p&gt;
&lt;p&gt;要修訂這本書並不容易，但是隨著經常重新反思自己，透過書寫或其他方式抽離著看自己情緒反應或是反射性行為，就可以慢慢地體諒自己那些衝動行事，或是無端悲傷。拍拍自己的肩膀，找到一個好時機跟自己和解。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>2024 賀年卡</title><link>https://yurenju.blog/zh/posts/2024-12-08_new-year-card/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2024-12-08_new-year-card/</guid><pubDate>Sun, 08 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;New Year card.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;5651&quot; height=&quot;5651&quot; src=&quot;/_astro/New%20Year%20card.5MaLBs7F_Z2vGPIk.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;昨天收到了朋友的賀年卡，年末時收到確實讓人有種今年的一切都沉澱了下來，值得重新翻閱 — 不過我想翻遠一點，從前年開始。&lt;/p&gt;
&lt;p&gt;2022 年開始對我來說是個很大的改變，身心俱疲的從職場離開，今年又重回職場。這兩年內花很多時間問自己與朋友他們為何喜歡「什麼」。這個「什麼」有很多種，可能是工作，可能是居住的空間，可能是興趣如畫畫，也有可能是對於小朋友的付出。&lt;/p&gt;
&lt;p&gt;這反映著自己心裡的困惑，我到底喜歡什麼、想要什麼。從工作開始到各種興趣或非常上手的技能等等，我擅長的不代表我喜歡，反之亦然，而喜歡的也不代表可以長長久久的做。喜歡、擅長、可以長久的作，這幾個排列組合總是讓人困惑。&lt;/p&gt;
&lt;p&gt;這幾年下來，做最多事情的就是探索以及設定一些生活目標去達成。其中一個就是去熊野古道。這條古道五年前我也曾經去過，但那次在第二天卻迷路了，最後搭了民宿老闆的便車直接到終點。至此就成為了心中的一個遺憾。&lt;/p&gt;
&lt;p&gt;而 2023 年又跟朋友一起去了熊野古道，在季節的末端追趕著櫻花，一起體驗著上次的未竟之事，造訪了上次大雨中收留我的咖啡館老闆，跟民宿養的寵物羊合照，在步道旅程當中一起享受著民宿老闆準備的便當。&lt;/p&gt;
&lt;p&gt;最後到達了熊野大社時，我以為會感動得熱淚盈眶，但沒有。完成了人生成就清單上的一項任務時，打起勾的感覺就是一種淡然但長久瀰漫的複雜感受，喜悅中但帶著點迷惘。但很慶幸能跟著志同道合的朋友們一起完成了這件事情，如果沒有一起到達熊野大社，一輩子也不會體會到這種複雜交織的感受。&lt;/p&gt;
&lt;p&gt;隨著這幾年的各種嘗試，有種慢慢地更認識自己是誰了，如同在翻閱小說一樣，只是小說中的主角也還在路途中，即使一些謎團解開了，但是還是不知道結局是怎樣，正如同在神倉書斎的居住體驗一樣。旅行、攀岩，甚至去頭城的甘露咖啡當中的各種無俚頭話題，對我來說都是一種自我探索。&lt;/p&gt;
&lt;p&gt;2024 年末了，如果再問自己，我到底是個怎樣的人、喜歡什麼？我還是沒有個簡單的答案，但肯定比起兩年前更瞭解自己了。&lt;/p&gt;
&lt;p&gt;收到這張賀年卡時真的感到很暖心，也很為朋友感到開心。知道他還有另外一個計劃是製作自己設計的 T-Shirt，加上這張設計與融合自己興趣並具的賀年卡時讓我覺得，其實我們都在尋找自我的路上，那個自我的輪廓總是很模糊，但是隨著創造與實踐的路上，我們總會慢慢朝著那個理想輪廓而邁進，不管是隨著自己的體驗改變未來的輪廓，或是透過改變現在的自己來符合自己的理想輪廓。&lt;/p&gt;
&lt;p&gt;而接下來，2025 新的篇章就要開啟了，下一頁仍是空白著的，或許心裡有個大綱，或許沒有，但都無礙於我們展開新的旅程。在旅程中我們還是會遇到驚滔駭浪，或只是平凡的欣賞著路旁的淡藍色花草。&lt;/p&gt;
&lt;p&gt;不管怎樣，在世界的下個城市或村莊遇見時，再來分享彼此的故事吧。&lt;/p&gt;</content:encoded><category>生活</category></item><item><title>尾道、咖啡館與花火大會</title><link>https://yurenju.blog/zh/posts/2024-08-04_onomichi-fireworks-and-cafe/</link><guid isPermaLink="true">https://yurenju.blog/zh/posts/2024-08-04_onomichi-fireworks-and-cafe/</guid><pubDate>Sun, 04 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;封面照&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1200&quot; height=&quot;1200&quot; src=&quot;/_astro/cover_onomichi-cafe-fireworks.CtCXoKLQ_a33NP.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;「三十分鐘前我看到你經過咖啡館前，」咖啡館的老闆一邊打理著檯面一邊笑著對我說。&lt;/p&gt;
&lt;p&gt;聽到這句話前的我，前一週都還在岡山的共用空間工作，週五才坐火車到了尾道做個旅行中的小旅行。在極度炎熱的夏季中午找餐廳時，經過這間咖啡館的門口，我嗅到了一間好咖啡館的氣味，也理所當然的在吃完午餐後造訪這間咖啡館。&lt;/p&gt;
&lt;p&gt;拉開大片的木質玻璃窗拉門就可以進入這間小巧精緻的咖啡館，裡面有四個肩挨著肩的座位。而門口整齊著陳列的純白包裝但用不同顏色標示不同產區的咖啡豆，用最不突兀的方式點綴著店面。坐在裡面的感覺很微妙，大片的落地窗帶來的開闊抵銷了只有四個座位與吧台區的狹窄感，但是這樣肩並肩、面對面的座位安排，就跟《&lt;a href=&quot;https://www.facebook.com/yixialonetogether/?locale=zh_TW&quot;&gt;一席&lt;/a&gt;》一樣，對話也是組成這間咖啡館的重要元素。&lt;/p&gt;
&lt;p&gt;老闆英文很不錯，隔壁的客人感覺也是熟客。老闆介紹這位客人是在尾道賣生啤酒的另外一位老闆，明日花火大會的晚上，他們會一起在咖啡館的門口賣生啤酒與餐點。只能理解幾個日語單字的我聽不太懂他們的對話，大部分都是咖啡館老闆居中翻譯，不過從他們親切的討論語氣中可以感受到他們是熟識的朋友，這種造訪對方的店、需要時互相支援的氛圍讓人覺得很有趣，在旁邊嘗試著捕捉空中幾個聽得懂的日語的我（像是煙火 Hanabi），好像也有種似乎融入當地熱鬧祭典準備的參與感。&lt;/p&gt;
&lt;p&gt;花火大會總是夏天來日本不可避免的絢麗火花，摩肩擦踵的擁擠人潮稱不上是我喜歡的元素，但是熱情的攤販跟大家穿著浴衣所帶來的夏季感還是很值得參與感受，這也是我再次造訪尾道的其中一個原因。不過因為明天我打算坐纜車到山上的千光寺看煙火，距離這個濱海的咖啡館有段距離，也不太確定有沒有機會到時候再來買生啤酒。總之短暫的閒聊之後就離開了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;纜車&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;960&quot; height=&quot;1200&quot; src=&quot;/_astro/cable-car.gLSKoGZL_Z4A23K.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;「我明天再來，」離開前我這麼跟老闆說。旅行的時候要找到一間適合自己的咖啡館很難，偶爾這樣的咖啡館出現時，都像是在沙漠裡面發現到綠洲一般的珍貴。&lt;/p&gt;
&lt;p&gt;對我來說，日本是一個讓人熟悉，同時有存在些隔閡的地方。在每次體驗到賓至如歸的服務時讓我感到溫暖與熟悉，但同時也從社會的各方面可以感受到人與人之間是存在一點距離的。對我這個才剛開始學習日語的人更是如此，一個人旅行時還進一步加乘了這樣的感受。語言加上人際關係的隔閡，讓我在旅途的孤獨中就像是在尋找自我的邊際一樣。&lt;/p&gt;
&lt;p&gt;聽起來很孤單，其實我很享受這種感覺。但是當在旅程中出現這樣一間有機會打破隔閡的咖啡館時，還是讓我很開心。我喜歡獨自旅行中，不經意冒出來那一點點恰到好處的連結。&lt;/p&gt;
&lt;p&gt;隔天，趁著早晨的溫度還舒適的適合散步時，我又走到同一間咖啡館買咖啡。&lt;/p&gt;
&lt;p&gt;「可以跟你聊聊嗎？」隔壁的客人用簡易的英文這樣問我，原來他是一位急診室醫生。今天休假，剛從大阪看煙火回來尾道，還跟我說了大阪的花火大會非常多人，他預告了尾道的也會一樣的擁擠。早上跟我一樣到咖啡館報到，準備用保溫瓶帶著滿滿的能量（咖啡）去他岳父的診所幫忙。我們都一樣，想要用一杯好的咖啡來開啟一整天。&lt;/p&gt;
&lt;p&gt;這個咖啡館就像是在地居民交流場所一樣，除了像我一樣的遊客外，總是有熟客陸陸續續的造訪，我也很喜歡這樣在旅途中遇到了一些不同的人，可以在同一個時空互相分享生活小事的時刻。&lt;/p&gt;
&lt;p&gt;醫生離開後，老闆跟我說醫生正在學習英語，所以也很努力的在找機會用英語對話。我也說身為剛開始學習日語幾個禮拜的我，真的很能體會學習新語言的困難。老闆有一股很容易輕鬆聊天的特質，不知不覺我們已經從語言學習一路聊到的在人生的路上「失敗」的重要性，我提到了我在各種創業公司的工作經驗，他也提到了他曾經開過的咖啡烘培事業等，對於可以用英文可以聊到深入的話題讓我很驚訝。而這樣的交流也有種慢慢的從一個普通的遊客，逐漸構築起與尾道這個地方跟在地人更深入的聯繫。&lt;/p&gt;
&lt;p&gt;離開咖啡館前，老闆說他有保留了幾個在咖啡館附近堤防邊可以看到花火的座席，如果我在山上的千光寺找不到適合看煙火的地點，可以到他預留的位置看煙火。我有點感動，對他來說我只是一個見過兩次面的客人，卻願意讓一個位置給我，我也很珍惜這樣可以跟當地人建立一些聯繫的機會。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;在商店街的祭典現場&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;960&quot; height=&quot;1200&quot; src=&quot;/_astro/festival.CTsmeXts_18rRcU.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;當天晚上，在萬頭攢動、堪比台北 101 的觀賞煙火的人潮下，我遠遠的就看到了正在準備水餃餐點的咖啡館老闆，還有昨天看到的生啤酒老闆，跟他們招手。&lt;/p&gt;
&lt;p&gt;這次在旅程中陪伴我的一本書《&lt;a href=&quot;https://www.kobo.com/tw/zh/ebook/Y3afKG7jRjmZopHiwKgqWw&quot;&gt;入境大廳&lt;/a&gt;》，作者對於家鄉的形容非常的精闢。他說家鄉就是個有一層層安全網，隨時可以把你從各種困境接住的地方，而身處異鄉的人就連遇到小小的問題，都要花費巨大的力氣才有辦法解決。&lt;/p&gt;
&lt;p&gt;尾道不是我的家鄉，理所當然的不會有各種令人感到熟悉的安全網。但經過這次在尾道參與的花火大會後，這些與當地人的聯繫，確實讓我慢慢的對這個地方產生了一些些不一樣的感受。&lt;/p&gt;
&lt;p&gt;在花火大會賣著餃子的咖啡館老闆、昨天遇見賣生啤酒的咖啡館熟客、剛從大阪回來要趕往診所的急診室醫生，與這些人的交談與認識，自己似乎慢慢的融入了這個地方，感受到尾道與在這邊生活的人所構築的立體感。&lt;/p&gt;
&lt;p&gt;而煙火在盛夏尾道的夜空綻放時，所有人不自覺張大嘴巴發出此起彼落的驚嘆聲。這樣在同一個時間與空間裡我們共享著這同一份絢麗時，這些旅程中的連結，我也獲得了屬於自己跟尾道的那份熟識感。&lt;/p&gt;
&lt;p&gt;就像在宇宙中獨自單人旅行時，偶然的遇見了另外一艘星艦，在彼此的軌道最接近的時候，似乎可以從圓形的觀景窗中，看到對方也貼在玻璃窗上開心的跟我揮手。&lt;/p&gt;
&lt;p&gt;你好，謝謝，下次見。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;煙火綻放&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;960&quot; height=&quot;1200&quot; src=&quot;/_astro/fireworks.Kyza1ie4_Z2up4Bi.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>生活</category></item></channel></rss>