260206CABE conference
2026 CABE會議 - 手機網頁 - AI製作流程
分享一下這次用AI作2026 動物行為暨生態研討會手機網頁版呈現,真的只是用很基本使用,沒有複雜的AI指令,原汁原味重現prompt指令供大家參考(也順便可以笑一下我的英文很爛)。
分享一下這次用AI作2026 動物行為暨生態研討會手機網頁版呈現,真的只是用很基本使用,沒有複雜的AI指令,原汁原味重現prompt指令供大家參考(也順便可以笑一下我的英文很爛)。
想收集TBIA所有「紀錄者/採集者」 (recordedBy)的名字,先想到用之前有使用過的XSV,但要安裝時發現已經沒有在維護了,XSV的介紹叫大家改用qsv,跟XSV一樣參數簡單、速度超快。TBIA下載所有的資料,解壓縮完有27.9GB (29,536,885筆資料),用qsv讀取recordedBy跟拿掉重複輸出,大概幾十秒就做完了。
但我想到要比對一下人名跟資料集名稱 (datasetName)對映,順便也統計一下筆數,似乎就要寫一點點程式,查一下資料才發現duckdb這套強大的資料庫可以直接用我熟悉的SQL語法處理,甚至不用匯入,直接對CSV欄位名稱下語法就好,速度一樣超快,還有漂亮的輸出,真是相見恨晚。
先簡單列出不重複的人名

加上資料集名稱與統計關聯的資料筆數
duckdb -c "SELECT recordedBy, datasetName, count(*) FROM 'tbia_6927dd263f39e705b9843d70.csv' GROUP BY recordedBy, datasetName ORDER BY count(*)"

好直覺、好快 ~~
DuckDB – An in-process SQL OLAP database management system
補充應用:
篩選出資料集名稱為: "科博典藏 (NMNS Collection)-真菌學門" 的分類資訊`。
duckdb -csv -c " select id, kingdom, kingdom_c, phylum, phylum_c, 'class', class_c, 'order', order_c, family, family_c, genus, genus_c, scientificName, common_name_c from 'tbia_6927dd263f39e705b9843d70.csv' where datasetName='科博典藏 (NMNS Collection)-真菌學門'" > nmns-fungi.csv
-csv 設定 .mode csv,不然的話預設會匯出duckbox (有框線)
安裝Debian 12、Gnome Desktop,語系選繁體中文。
新的Gnome不習慣,login的畫面點齒輪改成Gnome Classic
(2025.04.16)
edit /etc/sudoers
%your-username ALL=(ALL:ALL) ALL
logout/login 後才有作用
修改 /etc/default/keyboard
XKBOPTIONS="ctrl:nocaps"
Update packages
sudo apt install vim emacs git zsh tmux curl wget tig sqlite3
sudo apt install build-essential libreadline-dev libsqlite3-dev zlib1g-dev libssl-dev liblzma-dev libbz2-dev tk-dev libffi-dev llvm libncurses5-dev libncursesw5-dev liblzma-dev
Set default SHELL to zsh
logout/login 後才有作用Docker
https://docs.docker.com/engine/install/debian/
Floorp
到 https://ppa.floorp.app/ 按步驟安裝
Chromium
Zotero
Debian 12會報錯,要 install libdbus-glib-1-2
我的Intel Nuc小電腦的電源不知道什麼原因按了都沒反應,本來以為是電源線接觸不良或變壓器壞掉,送檢測結果是硬碟壞掉,但是不知道為什麼連開機BIOS也沒出現。
總之就把硬碟拆下來接外接盒,其他電腦也是讀不到。
fdisk 有看到sdb device,想要手動mount,出現以下錯誤。
mount: /mnt/mydisk: wrong fs type, bad option, bad superblock on /dev/sdb1, ...
以下靠Chat-GPT亂試,至少把資料救回來了。
用 lsblk看也是有device,但是沒有partition。
用fsck檢查 (忘記這個可以幹嘛)
看仔細
會有以下幾種狀況
| Situation | Meaning | Action |
|---|---|---|
| Blank disk | Partition and format | Partition and format |
| Corrupted disk | Broken partition table or FS | Try recovery |
| Filesystem directly on disk but not detected | Rare, but possible | Try force mounting or inspecting |
=> Recover data
先安裝testdisk這個神奇工具
進入文字互動介面
reboot 重開機,用lsblk看,partition回來了。testdisk太神了!!!
開機磁區還是壞的,開機抓不到硬碟,但是可以用外接盒讀回其他資料,至少資料有救回來。
重灌作業系統,分割磁區後就又可以正常使用了。
在Global Names的Tutorial: Parse names into a CSV file看到一個處理CSV超有效率的工具。
通常拿到一個csv,想快速得到這個csv的欄位有那些,總共幾筆,隨便列出幾筆看看資料長什麼樣子,然後決定只取其中幾個欄位資料,做簡單的條件篩選,最後匯出另一個我要的csv => 這些處裡可以用xsv一行指令做完。
因為是rust程式寫的,要先裝Cargo。
以Linux為例:
然後就可以用cargo安裝xsv
在shell的rc檔加上執行路徑
TaiCOL下載名錄,解壓縮是78MB,資料筆數233,440,不到10000元的NUC小PC處理完大概最多花不到2秒。
下載: 臺灣物種名錄 Catalogue of Life in Taiwan
列出headers
找出type_name_id跟namecode欄位有值的,並且隨機列出10列 (sample 10)
xsv search -s type_name_id '.+' TaiCOL_name_20250221.csv |xsv search -s namecode '.+' | xsv select name_id,type_name_id,namecode,original_name_id | xsv sample 10
轉換檔案: 篩選出分類階層是種(Species)的
xsv search -s rank 'Species' TaiCOL_name_20250221.csv | xsv select simple_name,name_author,s2_rank,latin_s2,s3_rank,latin_s3,common_name_c,alternative_name_c,kingdom,kingdom_c,phylum,phylum_c,class,class_c,order,order_c,family,family_c,genus,genus_c | xsv fmt -t '\t' > out.csv
search -s rank 'Species': 找出rank欄位等於"Species"xsv select simple_name,...: 取用那些欄位xsv fmt -t '\t': 轉成tab分隔 (避免處理雙引號)篩選出有文獻的學名
xsv search -s protologue '.+' TaiCOL_name_20250221.csv |xsv select name_id,type_name_id,namecode,original_name_id,protologue | wc -l
以前處理這些事情筆數少用Excel/LiberOffice,幾萬筆以上可能要開OpenRefine,不然就要寫script程式處理 (Python的話可能用Pandas之類的套件)或是開jupyter notebook處理,都是很麻煩。XSV速度超快、pipeline處理資料很直覺,適合處理大檔案。
Windows的Notepad++轉換編碼後輸出,用hexdump看內容結果。
d 的編碼: 64
00000000 22 64 61 74 61 49 44 22 2c 22 65 76 65 6e 74 49 |"dataID","eventI|
00000010 44 22 2c 22 65 76 65 6e 74 44 61 74 65 22 2c 22 |D","eventDate","|
00000020 73 65 61 73 6f 6e 22 2c 22 79 65 61 72 22 2c 22 |season","year","|
d 的編碼: 64
00000000 64 61 74 61 49 44 2c 65 76 65 6e 74 49 44 2c 65 |dataID,eventID,e|
00000010 76 65 6e 74 44 61 74 65 2c 73 65 61 73 6f 6e 2c |ventDate,season,|
00000020 79 65 61 72 2c 72 65 67 69 6f 6e 2c 6c 6f 63 61 |year,region,loca|
開頭: EF BB BF
d 的編碼: 64 (同ASCII)
00000000 ef bb bf 22 64 61 74 61 49 44 22 2c 22 65 76 65 |..."dataID","eve|
00000010 6e 74 49 44 22 2c 22 65 76 65 6e 74 44 61 74 65 |ntID","eventDate|
00000020 22 2c 22 73 65 61 73 6f 6e 22 2c 22 79 65 61 72 |","season","year|
開頭: FF FE (11111111 11111110)
d 的編碼: 64 00
00000000 ff fe 22 00 64 00 61 00 74 00 61 00 49 00 44 00 |..".d.a.t.a.I.D.|
00000010 22 00 2c 00 22 00 65 00 76 00 65 00 6e 00 74 00 |".,.".e.v.e.n.t.|
00000020 49 00 44 00 22 00 2c 00 22 00 65 00 76 00 65 00 |I.D.".,.".e.v.e.|
開頭: FE FF (11111110 11111111)
d 的編碼: 00 64
00000000 fe ff 00 22 00 64 00 61 00 74 00 61 00 49 00 44 |...".d.a.t.a.I.D|
00000010 00 22 00 2c 00 22 00 65 00 76 00 65 00 6e 00 74 |.".,.".e.v.e.n.t|
00000020 00 49 00 44 00 22 00 2c 00 22 00 65 00 76 00 65 |.I.D.".,.".e.v.e|
(有空再來補各種版本Excel的匯出)
系統板本: vBulletin 3.6.3 (付費版本) - PHP: 5.6 - MySQL: 5.5
附加檔案: - 磁碟空間: 202,188MB - 檔案數: 1,669,049 (包含.attach跟.thumb)
文字內容
post資料表裡,thread會關聯很多筆post照片檔
/src/html/nc/vbb35data/[1-9]/的目錄attachment.php處理把需要的資料取出來,轉成Sqlite方便處理
latin1mysqldump -u root -p nc_biodiv --default-character-set=latin1 nc_biodiv vbb35post > post.sql
mysqldump -u root -p nc_biodiv --default-character-set=latin1 nc_biodiv vbb35attachment > attachment.sql
Change encoding to utf8, edit post.sql and attachment.sql (latin1 -> utf8mb4)
Import back to mysql (utf8 client readable for better check)
mysql -u root -p nc_nice < post.sqlmysql -u root -p nc_nice < attachment.sqlUse adminer.php to export csv
import to sqlite3
Note
寫一個script處理: 1-parse-data.py
family.txt,純手工,寫parser效益太低parse物種post的內容
取得higher taxa (很大概,視情況手工處理細節)
圖檔列表attach (list)
產出整理後的資料: eggs.csv (4千多筆)
2-make-markdown.py
11ty_folder/posts/plantae-index11ty_folder/posts/plantae11ty build:
11ty配合High Performance Blog template產生最終呈現網頁。
處理參考High Performance Blog的指令
Note
有4千多個檔案,會發生JavaScript heap out of memory error 執行 NODE_OPTIONS="--max-old-space-size=4096" npx eleventy 似乎就好了
New Site (NC2)
Legacy Site (nc.biodiv.tw)
歡迎任何貢獻!
我還沒有plan,考慮on-demand
pricing: hourly (monthly) USD
| type | Mem | vCPU | T2 | T3a | T3 | T4g |
|---|---|---|---|---|---|---|
tokyo |
||||||
| nano | 0.5 | 1 | 0.0076 (5.472) | 0.0061 | 0.0068 | 0.0054 |
| micro | 1 | 1 | 0.0152 (15.5) | 0.0122 | 0.0136 | 0.0108 |
| small | 2 | 1 | 0.0304 (31.008) | 0.0245 (24.99) | 0.0272 (27.744) | 0.0216 (22.032) |
| medium | 4 | 2 | 0.0608 (62.106) | 0.049 (49.98) | 0.0544 (55.488) | 0.0432 (44.064) |
| large | 8 | 2 | 0.1216 (124.032) | 0.0979 | 0.1088 | 0.0864 |
| xlarge | 16 | 4 | 0.2432 (248.064) | 0.1958 | 0.2176 | 0.01728 |
| 2xlarge | 32 | 8 | 0.4864 | 0.3917 | 0.4352 | 0.3456 |
oregon |
||||||
| nano | 0.5 | 1 | ||||
| micro | 1 | 1 | ||||
| small | 2 | 1 | 0.0168 (17.136) | |||
| medium | 4 | 2 | ||||
| large | 8 | 2 | ||||
| xlarge | 16 | 4 | ||||
| 2xlarge | 32 | 8 |
via: https://aws.amazon.com/ec2/pricing/on-demand/
T2: Intel CPU
T3a: AMD CPU, 比T3省10%
T3: Inter CPU
T4g: Arm-based, 最便宜, 某些情況會更快? (大部分時間,都不全速使用CPU的應用程式設計?)
Which AWS Region Is Cheapest? A Costing Report
便宜程度: N.Virginia (us-east-1), Ohio (us-east-2), Oregon (us-west-2)
Latency: Tokyo, Singapore, California, Oregon, Ohio, N.Virginia
環境: Windows 11, Python 3.8
用鍵盤上下鍵觸發Listbox.yview_scroll也沒反應。
這個很詭異的問題是下拉選單原本是用python預設的srcoll動作,但是選項小於15個時, 不會有scroll的反應, 目前用手動加上scrollbar解決。