2024年3月18日 星期一

Python: googletrans 與 bilingual_book_maker

2024年3月18日 星期一

2023年3月應朋友的要求,將開源的專案「bilingual_book_maker」可以在 Colab 中使用(參見:雄:OpenAI : ChatGPT 應用 : 製作雙語電子書),利用它可以把 EPUB 格式的電子書變成「雙語」的內容。前一陣子陸續有人反應有問題,不過,因為我根本沒在使用,加上有時問題會在一陣子後又消息了,所以沒有積極地去查原因。前天換有在使用的朋友跟我說了,哈!開始認真地找解方。

底下記錄一下排除問題的關鍵。

httpx 版本的問題

googletrans 已經滿久沒更新了,而 openai 持續地在更新,但是兩者都有用到 httpx,一個要舊版的,一個要新版的,因此安裝完 googletrans 以後,出現了「dependency conflicts」的錯誤訊息:

  Building wheel for googletrans (setup.py) ... done
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
openai 1.14.1 requires httpx<1,>=0.23.0, but you have httpx 0.13.3 which is incompatible.

httpx 版本的衝突,由訊息看來,因為 googletrans 是後安裝的,所以最後 httpx 用的版本是 0.13.3 ,而不是 openai 要的版本( >=0.23.0 )。這也導致開始翻譯時,出現了這些訊息:

Traceback (most recent call last):
  File "/usr/local/bin/bbook_maker", line 5, in <module>
    from book_maker.cli import main
  File "/usr/local/lib/python3.10/dist-packages/book_maker/cli.py", line 7, in <module>
    from book_maker.translator import MODEL_DICT
  File "/usr/local/lib/python3.10/dist-packages/book_maker/translator/__init__.py", line 2, in <module>
    from book_maker.translator.chatgptapi_translator import ChatGPTAPI
  File "/usr/local/lib/python3.10/dist-packages/book_maker/translator/chatgptapi_translator.py", line 7, in <module>
    from openai import AzureOpenAI, OpenAI, RateLimitError
  File "/usr/local/lib/python3.10/dist-packages/openai/__init__.py", line 8, in <module>
    from . import types
  File "/usr/local/lib/python3.10/dist-packages/openai/types/__init__.py", line 5, in <module>
    from .image import Image as Image
  File "/usr/local/lib/python3.10/dist-packages/openai/types/image.py", line 5, in <module>
    from .._models import BaseModel
  File "/usr/local/lib/python3.10/dist-packages/openai/_models.py", line 23, in <module>
    from ._types import (
  File "/usr/local/lib/python3.10/dist-packages/openai/_types.py", line 23, in <module>
    from httpx import URL, Proxy, Timeout, Response, BaseTransport, AsyncBaseTransport
ImportError: cannot import name 'BaseTransport' from 'httpx' (/usr/local/lib/python3.10/dist-packages/httpx/__init__.py)

openai 比較重要,試著以它為主,讓 googletrans 使用較新版本的 httpx 看看,也就是安裝 googletrans 時,不要檢查 dependency,將原本的安裝指令:

!pip -q install  googletrans==4.0.0-rc1

多加「--no-dependencies」改為:

!pip -q install --no-dependencies googletrans==4.0.0-rc1

httpcore 的問題

前面雖然解決了 googletrans 安裝時的問題,執行時,換 httpcore 有問題,出現了這樣的錯誤訊息:

AttributeError: module 'httpcore' has no attribute 'SyncHTTPTransport'

查了一下,可以在使用 googletrans 前,先執行:

import httpcore
setattr(httpcore, 'SyncHTTPTransport', 'AsyncHTTPProxy')

利用這兩行來 patch,只要比 googletrans 先執行,就不會出現 AtributeError。

httpx[http2]

本以為可以順利執行 google 翻譯了吧!結果又出現這樣的訊息:

Using http2=True, but the 'h2' package is not installed. Make sure to install httpx using `pip
install httpx[http2]`.

不過,這看起來比較好解決,就照提示,安裝 httpx[https] 就好,所以在安裝 googletrans 之前,先執行:

!pip -q install httpx[http2]

經過以上的修正,終於可以讓 googletrans 順利地和 bilingual_book_maker 搭配,以 google 翻譯來進行翻譯。

不過,為了讓使用更有彈性來選擇是否以 googletrans 幫 bilingual_book_maker 執行 google 翻譯的功能,我加上了「install_googletrans」的設定參數,如果勾選了,就使用 googletrans ,否則使用 bilingual_book_maker 專案內建的功能。這樣子,必要的時候,可以選擇關閉我亂改的部份,直接執行 bilingual_book_maker,也方便除錯。

這個雖然是自己沒在使用的工具,累積了除錯及解決問題的能力,時間沒有白花,收穫還挺多的,相信它是一個善的循環。

相關文章


2024年3月3日 星期日

3DP : Delta 校正尺寸大小

2024年3月3日 星期日

第二部 3D printer 是 Delta 型的,當初滑塊、效應器都是自己用 PLA 印的,PLA 的缺點就是久了會脆化,所以都忘記已經重印過幾次了。年前在檢修、測試時,效應器又部份零件斷了,加上熱敏電阻 NTC 也斷了,索性一次下單,通通換成金屬件。

這幾次很認真的調校,重新復習靭體的各參數,忘了什麼時候改用 Marlin 1.1.9.1 的,暫時不換版本。Marlin 有支援 M665 可以讓我們先以 G-code 來邊改邊測試,調校時,可以用:

M665 H289.9

H289.9 將 Z 的最大高度設為 289.9 mm。

可以用:

M665 L217

L217 將懸臂的長度設為 217mm。

這部機器三軸及調度調校完以後,列印完 20x20x20 的測試方塊後, Z 的調度沒問題,但是 X / Y 的尺寸卻是略小,只有 19.84mm:


Marlin 中,跟 X / Y 尺寸大小相關的參數是 DELTA_DIAGONAL_ROD,我目前 Configuration.h 中的的設定是:

#define DELTA_DIAGONAL_ROD 217

要將 217 調整為多少呢?應該是 20mm 的大小,卻印出 19.84mm ,所以依比例計算一下:

217 * 19.84 / 217 = 215.264

可以先用 G-code 來暫時改一下 DELTA_DIAGONAL_ROD,下這樣的指令:

M665 L215.264

重新再印一次 20x20x20 的方塊,確定尺寸正確了,再修改 Marlin 的參數:

#define DELTA_DIAGONAL_ROD 215.264


久沒摸了,不少東西忘了,不過,稍加複習一下,好像又喚醒了沉睡的能力。比較頭痛的是線材吸了不少水份,還沒進到料管就斷了,要來試試看有什麼方法救。


2024年2月29日 星期四

Biking : 春崎產業道路

2024年2月29日 星期四

天氣狀況 : 陰

TRIP DIST : 7.03
TRIP TIME : 0:33:52
AVG. SPEED : 12.4
MAX. SPEED : 42.4

今年居然在櫻花開得最茂盛時,忘了騰龍御櫻。雖然花不多了,還是要補一下功課,騎一趟春崎產業道路。不過,看來今天我的體力不行,自行車的碼錶也不給力,只記錄到一半的行程。

在東山高中上來的叉路口喝水,遠遠就看得到騰龍御櫻的櫻花。兩位女士正在路口猶豫要如何回到汽車停放的杏花林。她們由樟湖步道走下來的,要再由老泉街45巷走上杏花林,有一點距離,幸好下午太陽不見了,不然一定曬到哀哀叫。

氣喘噓噓地過了春崎的第一個大彎道,不到菜園前的第二個大彎就累到下車「高尚」一下了。幸好走一小段後,又能繼續踩踏,菜園後的第三個大彎,節奏對了,踩起來就輕鬆許多。

過了菜園沒多遠的這個路口:

電線桿補一張特寫:

好奇心驅使下,就將車牽向小路去了。看到了櫻花,也看到了小木屋,那是以前去騰龍御櫻賞花時,走到最低處可見的小木屋。原來石階小路走三小段就進到騰龍御櫻了。



哈!這樣子少騎一個陡陡的大彎,直接就闖進櫻花林了。

在坡頂遇到一位年輕人騎 Gogoro 上來賞花,小聊了一下。他在家當奶爸,照顧一歲多的小孩,下午小孩的阿嬤幫忙照顧半天,他則「不勤快」地接單跑外送;只能說,選擇在家當奶爸,勇氣可嘉。

2024年2月21日 星期三

Colab : 讓 OpenSCAD 可以輸出圖片

2024年2月21日 星期三

 在一般的電腦中,OpenSCAD 可以利用 -o xxx.png ,來輸出模型的預覽圖片,但是相同的指令在 Google Colab 中卻會出現類似這樣的錯誤訊息:

Compiling design (CSG Products normalization)...
Normalized CSG tree has 102 elements
Unable to open a connection to the X server.
DISPLAY=
Can't create OpenGL OffscreenView. Code: -1.

然後圖片並沒有輸出任何內容。

主要的原因是 OpenSCAD 輸出圖片時,需要有一個「顯示器」,但它在 Colab 這種遠端的虛擬機環境中並找不到,就出現錯誤訊息了。

沒關係,既然是虛擬機,那就安裝 Xvfb 和 pyvirtualdisplay,來一個虛擬的顯示器吧!

在安裝完 OpenSCAD 後,順便加上這樣的指令,來安裝 Xvfb 和 pyvirtualdisplay:

if not os.path.exists('/usr/bin/Xvfb') :
  print('安裝 xvfb ...')
  !apt-get -qq install xvfb 2>/dev/null >/dev/null
try: from pyvirtualdisplay import Display
except:
  print('安裝 pyvirtualdisplay ...')
  !pip -q install pyvirtualdisplay

要啟用虛擬顯示器就加上這兩行:

from pyvirtualdisplay import Display
Display().start()

有了 Xvfb + pyvirtualdisplay 助攻,就可以在 Colab 中,順利地讓 OpenSCAD 輸出圖片了。

相關文章


OpenSCAD : 輸出 PNG 圖片快速預覽

 最近試著將 OpenSCAD 產生 3D 模型檔案的程序在 Google Colab 中完成,所以得研究一下如何在命令列中下指令。OpenSCAD 可以使用的的參數在官網中有說明文件:

OpenSCAD 在輸出檔案時,除了輸出成 3D 模型,也可以輸出 PNG 圖檔;輸出成 PNG 圖有什麼作用?輸出圖片所需花費的時間很少,可以讓我們快速的預覽模型長什麼樣,確定沒問題了,再開始製作 3D 模型。而且我們可以利用「--camera」的參數,自訂要從哪一個視角來看模型。

[圖1] 由圖形界面取得 viewport 的數值

「--camera」參數是由七個數字所組成的,七數字包括:

  • translate 三個,分別是 x, y, z 的位移大小。
  • rotate 三個,分別是 x, y, z 的旋轉角度。
  • distance 一個,是由多遠來觀察模型。

每一個數字間用逗號分隔即可。如果不知道數字要用多少,可以先在圖形模式中調整,然後如 [圖1] ,觀察視窗左下角的數字後記下來。

假設我的 OpenSCAD 的程式檔名為 lenticular-card-new.scad,然後想輸出的第一張預覽圖片檔名為 test-1.png,用這樣的指令:

openscad -o test-1.png --camera=0,0,0,60,0,75,140 lenticular-card-new.scad

注意「--camera=0,0,0,60,0,75,140」,拆解一下:

  • translate : 0,0,0
  • rotate: 60,0,75
  • distance: 140

模型放正中央,然後 X 為中心,旋轉 60 度;Z 軸為中心,旋轉 75 度的結果:

[圖2] --camera=0,0,0,60,0,75,140

想看另一面,就執行以下指令:

openscad -o test-2.png --camera=0,0,0,60,0,270,140 lenticular-card-new.scad

模型放正中央,然後 X 為中心,旋轉 60 度;Z 軸為中心,旋轉 270 度的結果:

[圖3] --camera=0,0,0,60,0,270,140

Google Colab 中可以直接顯示圖片,而 OpenSCAD 有輸出為 PNG 圖片的功能,這樣子可以在調整完模型的參數後,快速預覽可能結果,再進一步將參數最佳,確認沒問題後再製作模型,應該可減少一些無謂的等待。

相關文章

2024年2月9日 星期五

Life : 2024 門迎百福::戶納千祥

2024年2月9日 星期五

中午在門口將去年的春聯「拿下」時,聽到樓上也在撕春聯,啪啪啪~處理滿久的樣子。哈!這幾年我都是將春聯貼磁鐵條上,就直接吸在鐵門上,不但貼的時候好調整,取下時更簡單。

今年決定換一下內容,想想,幹嘛那麼在意別人的眼光,認真寫就對了;再說,這幾個月,我也花了不少時間磨了一下,雖比不上高手,自己看了開心就好。


小孩則負責摺紙生肖的部份,這一回沒有提供樣本,讓她用去年拆下的兔子喚起記憶後,再行改裝,反正作者說是龍,它就是龍。

新年快樂!祝福看到此文的人,都能平安健康,財源滾滾來。 ^_^

相關文章


3DP : 電源供應器故障

大概是人家說的「樂極生悲」,常常當我們正覺得對現狀很滿意時,總會殺出個意外,然後歡樂就瞬間結束。第一部 3D printer 是 2015年1月跟著別人的的教學,一步步組裝的,它命運乖舛,一開始就被懵懂的我弄得東修西補的 (雄:3DP : 新手上路多坎坷)。大概兩年前, X 軸動作不正常,才發現步進馬達的端子融掉了(雄:3DP : 步進馬達杜邦端子融化),後來將端子重做,換了另一片控制板,又印了不少東西,那一陣子其實也是這部 3D printer 運作最好的時候。之後先是發現 LCD 無法在不插 USB 時時看到畫面,最後是連動也動不了了,就這樣停機兩年左右。最近因為要測試,家裡三部 3D printer 一部部搬出來維修,其中 Delta 型的 3D printer 溫度感測器斷了,為了買很便宜的熱敏電阻,就順便加買了鋁件,及第一部 3D printer 的控制板(這是第三片了)。領貨時付了一千七百多元,結果主角熱敏電阻居然被店家給漏放了。

終於輪到維修第一部 3D printer 了,先拍張照,不然怎麼配置早忘得差不多了:

這片 RAMPS 和另一片都不能讓機器動起來,不插 USB 時,看起來 Arduino 有電,但是 LCD 沒畫面,插上 USB ,電腦送指令,但不會動作。換上新買的 RAMPS 1.6 的控制板呢?該正常運作了吧!

想得美!這麼順利的話,這一篇就不用記錄了。

解決不了問題,只好開始一步步除錯了,在一堆線裡找問題點不容易,換上新的控制板接的線那麼少,還是沒動作,於是往 firmware 的方向去試了(其實也不合理,以前明明都好好的)。試了大半天,耳朵突然聽到沙沙沙,像有人在噴水的聲音,找了一下,應該機器上的電源供應器發出來的。什麼都試了,就是沒有懷疑過電源供應器。

換!將原來 Delta 3D printer 12V 6A 的變壓器先加兩根電線後接上去試。果然~果然是 PSU 的問題,三片 RAMPS 控制板都能讓 LCD 單機操作,都能讓馬達正常動作了。這下子變成 RAMPS 小富翁了!

後來順便將步進馬達的控制晶片一片片測試,找出一片 A4988 會讓馬達亂跑,趕緊將它做記號。看來還得再備幾片 A4988 才行了。

相關連結


2024年2月2日 星期五

Hiking : 太平山步道

2024年2月2日 星期五

去年底,同事打電話來約二月上太平山,哈!離開學校都第五年了,同事還記得約我,二話不說,馬上答應。原來還擔心自己的雙腳會不會山路走一走, ITBS 又犯,今天走完見晴懷古步道,跟需要上上下下的翠峰湖環山步道,居然安全無恙;看來,這兩週的刻意鍛鍊可能發揮了作用。

上一次到太平山是 2007年七月初跟另一批同事的三日遊,久到我只記得開同事的車,手煞車未全放開,一路聞到燒焦味的糗事。這一回換一批人,八個人都不開車,租小巴士,可以放輕鬆地看山看水就好。

運氣不錯,天氣並沒有如氣象預報的糟,上午11點多的太平山雖然不時有霧氣飄來,但也有藍天白雲。當然要抓緊這麼好的機會,走一下步道。由於約定的午餐是12點半,所以只能先選擇路程較短、所需花費時間較少的見晴懷古步道。

當大家都在排隊等著拍長滿青苔的鐵軌,我選擇一旁林間的這個景:


雲霧飄進林間,陽光穿透進來,仙境般的景緻,真真實實的在眼前,居然沒有吸引到大家的目光。

拍完雖然很興奮地提醒同事快去搶拍,結果大家選擇繼續排隊拍經典的鐵軌。人生就是這樣,無論人、事、物,稍縱即逝,當你錯過了,就錯過了!煙消霧散時,難得一見的美景亦隨之消逝。

我喜歡大自然,見晴懷古步道雖短,卻值得細細品味;缺點就是太熱門,人太多,當你想駐足,腳步聲卻催促著,當你想聆聽,嘻鬧聲蓋過了一切。

在太平山莊用完午餐,由於蹦蹦車去程是「半點」發車,回程是「整點」發車,算一算時間應該不夠再去翠峰湖,所以大家決定捨蹦蹦車,去走步道。這樣也好,可以補上回未去的景點。

從太平山莊到翠峰湖有16公里,在山裡繞來繞去的,終於可以下車。感謝同事知道我容易暈車,讓我坐在副駕駛座,不然,肯定像走完見晴懷古步道的繩索橋後,暈頭轉向的。


沒有事先做功課,到了環山步道東口才知道翠峰湖環山步道是經過認證的全球首條「寧靜步道」(Quiet Trail)。不過,今天一路都沒聽到蟲嗚鳥叫,也完全沒有遇到其它遊客,哈!有夠寧靜的。大概正是因為少人有走,讓人有踏入原始森林的感覺,樹林和苔蘚類構成了各式各樣的綠色動物在一旁窺視著我們。


步道有一點滿特別的,在木頭上釘了鋼筋止滑,讓人可以避免踩在布滿青苔的木頭、石頭,或是溼滑的泥土中,我是覺得這個設計有發揮作用,同事則覺得這樣更滑,所以寧可踩在土上。最後花了兩個小時十分鐘走完 3.95公里的步道,所有的人鞋子,我的最乾淨。鞋子髒了沒關係,環山步道的東口有廁所,也有洗鞋子的水糟,水槽邊還有各式的刷子,這設計真是貼心啊!辛苦的是今天的司機劉大哥,不介意大家的髒鞋,由步道西口載大家去上廁所兼刷鞋子。

能再度和老同事一起出遊是件樂事,更開心的是今天一雙腳都乖乖的,沒找麻煩,希望可以繼續保持下去。


2024年2月1日 星期四

Biking : 恆光 - 樟樹步道

2024年2月1日 星期四

 天氣狀況 : 晴

TRIP DIST : 12.19
TRIP TIME : 1:02:04
AVG. SPEED : 11.7
MAX. SPEED : 43.0

前幾天和朋友聊到我的 ITBS ,如果太久沒去運動,會犯,所以我盡量每天去快走個四公里左右的河堤;但是上週居然連走政大環山路一個上坡,加一個下坡而已就犯。他問了一個問題:「這樣到底是要走,還是不要走?」。再更早之前,遇到水果行的店員在河堤跑步,聊到 ITBS,她則是說不要理它,痛~繼續走!哈!當時我心想,痛是我在痛耶!而且那種痛讓人一跛一跛的,根本也走不了多遠就痛到不敢了。

不過,仔細地思考了一下,現在不像以前經常在教室、辦公室......之間移動,少了每天爬樓梯的上上下下,的確會造成有些肌肉愈來愈少用,所以應該要再多增加一些戶外活動的時間,讓自己的肌肉訓練一下。像昨天早上騎車,下午又跟小孩去走政大環山路一整圈,雙腳都乖乖的,或許跟有刻意訓練上下坡有關。

今天原本設定的目標是上貓空,到草湳折返,結果因為要趕回家煮午餐給小孩吃,只到貓纜站,牽車走完樟樹步道後就下山。

在老泉路上路過一處大彎,幾棵伏倒的竹子,空氣中滿滿的竹葉香:

這味道讓我又想起母親跟阿嬤包的粽子了,人總是在失去後,才會愈加想念。

在準備轉入老泉路26巷的叉路口,先在東山高中的方向看到一隻老鷹滑向樹梢,看來牠的巢可能就在那裡。後來在另一個方向又看到兩隻在天上盤旋著:

一個騎著公路車的車友由前方而來,邊騎邊跟他攀談了一下,他整車都是碳纖維的,據說,光將兩個輪框換成碳纖維的,就少了一公斤。不過,這車可不便宜,車架就六萬元了。

路過杏花林,路邊的山櫻花開了,杏花則是枝條上空盪盪的。

樟樹步道的魯冰花看來剛開沒多久,過年應該會更精彩。不過來看花的遊客可能也是滿滿的,走起來就不輕鬆了。


2024年1月31日 星期三

Biking : 河濱自行車道看花趣

2024年1月31日 星期三

天氣狀況 : 晴

TRIP DIST : 22.13
TRIP TIME : 1:04:51
AVG. SPEED : 20.4
MAX. SPEED : 32.8

前兩天走河堤,政大靠抽水站的櫻花也有幾棵開花了,跟小孩預測,這週天氣回溫,花兒多半會忍不住綻放;昨天看到某則報導說陽光公園的櫻花盛開了,鏡頭中拍到的是滿熱鬧、滿美的,於是今天的目標就是去驗證一下,鏡頭裡跟鏡頭外是否有落差。

週間騎車的好處就是一路人少、車少,藍天綠水的碧潭也是遊客不多。溪洲路河濱的櫻花部份開了:

陽光公園的花呢?其實主要是集中在停車場旁的步道。



幾棵櫻花開得比較多一些,近看就如上面的照片一樣,拉遠就稱不上壯觀了。百聞不如一見,很多事物還是得自己去看、去體驗才是真的。

測試一下 Google Maps 的定位記錄,還是得手動對齊道路,及修正部份記錄點才行,或許是自己的手機 GPS 不準確的關係,下回再用 GPS 手錶的記錄來比較一下。


2024年1月30日 星期二

Life : 薄麵餅

2024年1月30日 星期二

晚上搶救了一團據說想做麵包,但是發酵失敗,要被放生的麵團。本想試試將軟趴趴的麵團多加一些麵粉,將它桿成薄薄的,煎成蛋餅皮後放冰箱;但是試完一片後,並不好操作,要和更多麵粉,只好改試第二種方式。

第二次是在平底鍋先放少許油,將軟趴趴的麵團直接下鍋,等幾秒鐘再翻面後,再以鍋鏟反覆壓扁,因為有油的關係,既不沾鍋,也不黏鏟子,變成這樣:

[圖1] 底面沾油後翻面

塑形幾次後,蓋上鍋蓋燜烤至稍有金黃色:

[圖2] 起鍋前的薄麵餅

這薄麵餅口感如何?哈!單吃就是被壓扁的麵包。後來才知道,原來麵團裡有加蜂蜜,難怪吃起來甜甜的,沒有麵香(因為微發酵過了),倒是有蜂蜜味。總共煎了三大片,我接下來三天的早餐就吃煎蛋麵餅了。

[圖3] 煎蛋麵餅



2024年1月28日 星期日

3DP : 火烤鴨嘴獸

2024年1月28日 星期日

 家中的三部 3D printer 各有各的毛病,閒置已久,最近因為想要驗證利用 OpenSCAD 程式製作的模型效果如何,先將問題看起來較小的CoreXY 的 Smar Trap Core 搬出來修,將 X/Y 軸一個斷的皮帶夾改用束帶及螺絲固定;本以為只有這個小問題,後來發現 Z 軸的固定座,列印件上有一側也裂開了,只好先拿大衣夾夾住,簡單處理後,只能說可印而已,那品質滿差的,還需要找問題點。

檢修了好幾天,目前三部 3D printer 的問題簡略的記錄如下:

  • Prusa i3 :完全開不了機,可能是控制板的問題,等新的控制板到貨。
  • Delta 的 Micromake :列印件斷裂、 NTC 熱敏電阻斷在加熱塊裡面;等待金屬件及熱敏電阻更換。
  • Smart Trap Core :XY軸左側列印件及 Z 軸列印件以打火機補強,看能撐多久,等另外兩部能列印以後,再重印零件替換。

真的是禍不單行,不順利時,怎麼玩,怎麼壞!

在測試 Smar Trap Core 時,找了一隻小鴨嘴獸來印:

尺寸是對的,可能因為 PLA 塑料放太久受潮,或是擠出機、熱端的問題,表面實在難看。倒是用打火機烤了一下,滿漂亮的:

[圖1] 有用火烤過與沒烤過比較圖

[國1] 中間那隻鴨嘴獸是用打火機烤過的,表面變得光亮許多。

家裡這個打火機靠近熱源的地方是金屬的,比較耐高溫,而且火焰細小、溫高,當 PLA 塑料被烤到後,沒一會兒就「液化」,因為彼此的吸引地,將縫給填滿,表面就變得光光亮亮了。

[圖2] 火烤過的鴨嘴獸
以火烤操作的經驗是,不要貪心,一次烤一小部份,也不要烤太久,不然可能塌陷或是起泡;再來就是要利用重力來塑形,遆時地轉動物件,讓「液化」的塑料流向想流的地方。紅色的料比較沒有色差的問題,以前黃色的的物件被烤過以後,是看得出的,這一支紅色的料,倒是愈烤愈漂亮。這種方式玩,費時費工,但能燒出不同的風格,滿適合公仔的。


2024年1月26日 星期五

Life : 懇親會

2024年1月26日 星期五

好久沒搭火車,久到都忘了上一次搭火車是什麼時候;今天應小孩的要求去參加下部隊後的懇親會。為了他的福利,又溼又冷的天,一大早就出門。

臺北火車站的「地下迷宮」總令人生畏,今天倒是第一次體驗到無縫接軌,出了捷運淡水線的閘門,看到別人在用自動購票機,沒什麼人在排隊,就跟著投銅板買了票,順著走就進到月臺,跟我原來的沙盤推演完全不同。

還記得民國83年因為在中央大學資訊種子班受訓,每週會搭火車來回中壢跟臺北,人擠人,幾乎都是站回臺北;大概是因為今天非尖峰時間搭的,車廂內沒什麼人,輕鬆沒有壓力情境下,突然覺得搭火車滿不錯。

這應該是第一次走在內壢的街道上,火車站附近好熱鬧,一路經過了學校、市場,到處都是人。下回或許可以騎自行車搭火車,再騎回臺北;之前都能沿著河濱到大溪折返了,內壢應該更近些。

懇親會什麼感覺?哈!我跟小孩開玩笑,跟以前在學校的母姐會、班親會差不多。

小孩手氣好,抽了個好單位,別的不說,光是單純就算是賺到。

人嘛~圖什麼?能健康、平安,比什麼都來得重要。




2024年1月18日 星期四

Biking : 北47+北47-1

2024年1月18日 星期四

 天氣狀況 : 晴

TRIP DIST : 51.80
TRIP TIME : 3:10:37
AVG. SPEED : 16.3
MAX. SPEED : 40.9

青春不能留白,歲月會留痕跡,騎自行當然也要留記錄,好久沒騎車了,今天是 2024年的第一騎。原本打算由石碇淡蘭橋一路順著淡蘭古道走到石碇老街的,結果淡蘭橋到虎爺廟路口那段居然施工封閉,只好由虎爺廟那端開始走。

在入口不遠處的平臺前面多了三座新的不鏽鋼長條椅,公所總算想通了,在這種日照不足、陰暗潮溼的地方,木頭椅真的不實用。

到了石碇老街,本來想看看還有沒有豆漿可買,王家豆腐居然從一月15日開始休息到農曆初二,在猜,可能是越南媳婦回娘家去了。沒豆漿可買,只好繼續往北47前進了。

當我正「大粒汗,小粒汗」努力的踩踏上坡時,突然覺得左大腿有東西啪~的停在上面,定睛一看,居然是一隻蚱蜢。我停下來,小心的拿出手機,先快速地拍兩張,準備對焦近拍時,咻~小傢伙就這樣無情地跳走了。

來到北47指標五公里處,不禁又想起之前用手比六,讓畫面變成「4567」的老梗。哈!拍照是讓屁股離開椅墊的最佳理由,當然又來一張:

離開「4567」就是彎來彎去的陡坡,辛苦是有代價的,眼前一叢叢的山櫻花。拿起手機拍照時,才想著,這應該是這一路來的第一棵山櫻花;拍完回頭一看,哈!原來這是第二棵才對,那~剛剛眼睛是在看什麼路!


在北47指標六公里前,多了一支「常有獼猴出沒,請減速慢行」的標誌;站在它旁邊拍照,就多一隻猴子了!


山路其實不難騎,放輕齒慢慢踩,不心急就對了;人生其實也是同樣的道理。來到二格山自然中心,北47也快到最高點,看來店家應該沒在營業了,但是門口的山櫻花還是盛開著,以前來這邊吃他們自製的厚片吐司,花生的香味和紫蘇梅綠茶的味道都還記得呢!可惜了,少了一處可以邊補充熱量,邊欣賞美景的休息點。

既然都騎完北47了,決定繼續騎往北宜公路,再由海倫咖啡轉進北47-1,順便去買許家麵線。

進入北47-1後,氣溫降了,熱鬧的聲音也沒了。正在想,今天怎麼連鳥叫聲都沒聽到時,左側馬路邊突然出現一隻體型不小的藍腹鷴。牠嚇一跳,我也嚇了一跳。我立即停下來,小心地拿出手機,看看能不能捕捉到難得一見的身影。此時的牠也沒閒著,快步地由我的前方走到另一邊:

我匆匆拍到兩張模糊的影像,來不及拍第三張,牠就一溜煙鑽進邊坡的樹林裡了。

正邊騎邊回想剛剛的巧遇時,右側邊坡樹林裡又瞥見一個較小的身影,但牠很機警地迅速藏身林中,不再現身。在短短不到五分鐘內,撞見了兩隻藍腹鷴,是不是該去買張彩券!

由北47接北47-1,這一段除了前面稍有緩坡,幾乎都是一路陡下,車子極少,空氣比北47或是北宜公路好太多了。下滑到許家麵線,買了傳統麵線,一包兩束,兩包共180元,老闆說冷藏可以放三、四個月,其實真要吃,哪會放到那麼久。

下到烏塗窟後,接著就是加速踩踏,結束 2024年的第一騎。




2024年1月17日 星期三

HTML5 FUN : 找出成績記錄中錯的題目

2024年1月17日 星期三

 在「雄:HTML5 FUN : 利用 Google Form 登錄遊戲成績」中說到,目前 HTML5 FUN 的部份遊戲可以利用 Google 表單將遊戲的成績和作答歷程寫入 Google 試算表中。如果是照範例建立的表單及試算表,在試算表的 H 欄中,應該是:

  • 作答歷程(題目,使用秒數,錯的次數,回答內容)

這些記錄是一人一格,做過的題目全部記錄在一個儲存格中,如果解析出錯的哪些題目呢?

先來看看 H 欄中的內容特徵是什麼:

  • 全部是一個字串。
  • 每一題最後會有換行字元。
  • 每一題都有四項記錄,記錄跟記錄間有半形逗號:
    • 題目
    • 使用秒數
    • 錯的次數
    • 回答內容

如果答對的,「錯的次數」應該就會是 0,例如:

[Z],3,1,c
[V],9,1,T
[K],3,0,K
[P],8,0,P

這個人的第一題作答歷程是「[Z],3,1,c」,分解一下:

  • 題目: [Z] 
  • 使用秒數: 3 
  • 錯的次數: 1
  • 回答內容: c 

所以如果將答對的題目(「錯的次數」是「0」)的通通去掉,剩下的就是錯的,進一步再解析出「題目」的內容,這樣就知道錯了哪些了。

底下的試算表是已經在 J 欄中加入解析公式的,可以參考:


以 H2 的資料來說,用的公式是 (請參考J欄):

=REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(H2, "([^,]+,\d+,0,[^\n]+\n*)", "♥"), "(^[\n♥]+)", ""), "([^,]+),\d+,\d+,[^\n♥]*[\n♥]+", "$1")

主要都是利用 Google 試算表的「REGEXREPLACE」:

  • 將對的題目那行置換為「♥」。使用的規則:
    • ([^,]+,\d+,0,[^\n]+\n*)
  • 將開頭的換行及「♥」全部去掉(空字串)。使用的規則:
    • (^[\n♥]+)
  • 將錯的記錄行解析,並置換為題目內容就好,其它的資訊不保留。使用的規則:
    • ([^,]+),\d+,\d+,[^\n♥]*[\n♥]+

這個例子是因為題庫的題目是考字母,然後都用中括號括住了,所以將所有錯的題目合起來,就變成:

  • [Z][V][O][R][S][M][F]

一題一題很清楚,如果是單字的話,可能要再加個逗號、空格,或是其它符號來分開,如果想在每一個錯的題目後面加一個逗號和一個空格,公式可以改為 (請參考K欄):

=REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(H2, "([^,]+,\d+,0,[^\n]+\n*)", "♥"), "(^[\n♥]+)", ""), "([^,]+),\d+,\d+,[^\n♥]*[\n♥]+", "$1, ")

在最後面的「"$1"」中加料即可。(註:$1 就是找到的題目內容)。

關於記錄的解析公式如果有什麼問題,或是需求,歡迎在底下留言區留言討論哦!

相關連結


 
雄::gsyan © 2009. Design by Pocket