Skip to content

index

這個blog就是一些沒營養的隨筆

有空慢慢把舊blog(2013-2016)資料轉移過來


筆記一點關於古生物的Darwin Core詞彙

目前Darwin Core已儼然成為生物多樣性開放資料共同標準,針對古生物標本也有一些相關詞彙可用,跟現生生物標本資料最大不同的是必填欄位basisOfRecord要用FossilSpecimen。(非PreservedSpecimenLivingSpecimen)。

Geological Context

Geological Context這個Class應該就定義了大多數地層資訊用到的詞彙,列舉常用的如下:

地層學 (Stratigraphy)可以細分成可以細分岩石地層學 (Lithostratigraphy)、生物地層學 (Biostratigraphy)、年代地層學 (Chronostratigraphy)...

年代地層學(Chronostratigraphy)

層級 Earliest 詞彙 Latest 詞彙 範例
Eon / Eonothem earliestEonOrLowestEonothem latestEonOrHighestEonothem Phanerozoic
Era / Erathem earliestEraOrLowestErathem latestEraOrHighestErathem Cenozoic
Period / System earliestPeriodOrLowestSystem latestPeriodOrHighestSystem Neogene
Epoch / Series earliestEpochOrLowestSeries latestEpochOrHighestSeries Holocene
Age / Stage earliestAgeOrLowestStage latestAgeOrHighestStage Atlantic, Boreal

Note

國際地層委員會ICS會一直更新這個年代地層表

岩石地層學(Lithostratigraphy)

層級 詞彙
group
層(組) formation
member
小層 Bed

生物地層學 (Biostratigraphy)

Earliest 詞彙 Latest 詞彙 範例
lowestBiostratigraphicZone highestBiostratigraphicZone Maastrichtian

但原始資料遇到"晚中新世" (Late Miocene) 這種資料要如何處理?

問了一輪Digital TaiBIFer (TaiBIF開發,架構在ChatGPT上專注於生物多樣性開放資料的AI問答小幫手),得到的答案整理如下:

Late/Early/Middle加上地層單元名稱很常使用,但不是正式單元名稱,原始資料的"晚中新世"可以用以下表示:

terms value
earliestAgeOrLowestStage Tortonian
latestAgeOrHighestStage Messinian

我的理解:晚中新世下有6個Age/Stage,剛好3等分(Early/Late/Middle)後,最"Late"的2個是Tortonian跟Messinian => 但身為一個中間處理資料的角色,我認為不應該任意解讀原始資料的轉換,所以決定保留"Miocene",再想辦法處理"Late"這個字。因為早/中/晚一個想要表達精準一點但又沒那麼精準的定義,而且也不是每個單元名稱都可以3等分,有些除了早/中/晚也會用地層的上/下表示,這些用詞雖然模糊,但也保留了彈性,應該要被留下來,所以控制詞彙用以下處理:

terms value
earliestEpochOrLowestSeries Miocene
latestEpochOrHighestSeries Miocene

ChatGPT叫我把"Late"放到geologicalContextRemarks或verbatimGeologicalContext紀錄裡,聽起來很合理,但目前(2026-03-06)標準並沒有這個詞彙(ChatGPT腦補?) 我目前也還沒想到放那邊比較適合,另外可以放的地方是occurrenceRemarks跟dynamicProperties (萬用自訂欄位),但也怕會埋藏在雜亂的訊息中不容易被連結到,我先放個 TODO 在這邊,等那天智慧比較開了再來補充。

另外有一個看起來有關聯的 Chronometric Age Extension

Chronometric Age Extension,如果資料有特別做"年代測定"的方法、可以用精準一點的數值表示的話,就適合加上這個Extension。這邊我就懶的整理直接照抄AI給的答案跟TDWG網頁的內容。

The Chronometric Age (Chrono) terms are specifically for numerical ages (e.g., 10,000 years BP) or the specific process of dating a material. A "Formation" is a spatial/geological unit, which Darwin Core handles in its GeologicalContext class.

terms value
chrono:verbatimChronometricAge 76.6 to 74.5 Ma
chrono:chronometricAgeProtocol Ar-Ar dating of volcanic ash

比較跟DarwinCore的Geological Context不同

Feature Geological Context (DwC) Chronometric Age (Chrono)
Data Type Descriptive names (Strings) Numbers & Units (Floats/Integers)
Primary Goal Classification Measurement
Example Value "Late Miocene" "11.6 to 5.33 Ma"
Method Info Usually implied or omitted Explicit (e.g., "AMS Radiocarbon")
Uncertainty Hard to quantify (Vague) Precise (e.g., "± 50 years")
Best For General collection management Research-grade geochronology

Use Chrono only if you start adding columns like "Date Method," "Lab Number," or "Error Margin."

另外還有一個頭更大的學名處理

除了舊學名這個老問題,古生物還會遇到:已滅絕物種、分類不確定等、這個我暫時也是先放個 TODO 在這邊,有空再回來。

參考資料

地層名稱相關

雲林西螺 - 參訪陳源和醬油

醬油製作,純釀與調和醬油 (速成醬油)

  • 原料:豆子
  • 氨基酸 (甜度)
  • 酸分解液 (動物毛髮或不要的部分)
  • 豆片?

西螺醬油

  • 靠濁水溪的水源,產業:米、醬油、西瓜
  • 全盛時期登記有19間 (20年前)

醬油製作

  • 黑豆蒸煮
  • 製麴洗麴:控制溫濕度 5-7天細心照顧
  • 下缸日曝
  • 壓榨熬煮
  • 裝瓶殺菌

  • 蛋白質變氨基酸
  • 以前有養菌室,現在法規不行,牆壁都要消毒
  • 優勢菌
  • 夏天吹電風扇,冬天蓋被子

食品

  • 成分,順序不能亂寫,照比重排
  • 現在食品法規,沒有5000萬沒辦法做,跟以前環境不一樣,很難創業
  • 生抽:中國、香港講的是「清醬油」,跟我們講的生抽不一樣 (比較鹹)
陳源和醬油廠
日曬
陳源和醬油廠
好美的醬缸
陳源和醬油廠
發酵的豆子
陳源和醬油廠
可愛的春聯

參觀北投焚化爐

在臉書社填海社看到揪團看焚化爐活動,結果報名十分踴躍還分成2隊,我們是跟著RE-THINK團隊,大家果然都是對垃圾議題非常有興趣的,問題非常多,也都問的很深入。

以下是當場聽到隨手抄的筆記整理,很有可能聽錯或記錯,請斟酌參考。

台北市的垃圾

  • 台北市目前每垃圾量為2200-2500公噸,包含事業廢棄物(不是藍袋子的家庭垃圾都算) => 1人每天垃圾量0.8-1公斤
  • 實施垃圾分類前每天為3500公噸

焚化爐

  • 台灣目前26座焚化爐
  • 除了台北市跟高雄市外,焚化爐都是公辦民營
  • 除了台北市外,沒有一個縣市可以完全焚燒 (新百岳)
  • 台北市有三個焚化爐
  • 內湖: 600噸
  • 木柵: 1300噸
  • 北投: 1500-1600噸
  • 各縣市垃圾由中央調配,但因為地方自治法,地方可以拒絕

北投焚化爐

  • 以前是士林區,後來劃分成北投區
  • 9、10、11月做歲修,其他焚化爐輪流
  • 北投焚化爐有4個爐
  • 當初設定20年,現在已超過5年
  • 設備老舊,燃燒的垃圾種類也跟現在的不一樣
  • 香港蓋一個新的可以每天燒3000噸,費用高
  • 當年花80億蓋
  • 曾經幫基隆、南投、雲林燒,現在沒有了
  • 83% 燃燒率
  • 幫外縣市燒的話,會還他灰,1:1的比例,飛灰處理更貴
  • 每天400多台車進來

廚餘

  • 130-150噸廚餘
  • 目前有機肥
  • 新北市有做黑水虻(比例很低)
  • 廚餘水除掉,剩不到一半重量,弄乾切小塊,剩更少。送到木柵焚化爐後山。

底灰

  • 市政工程有規定要用40%底渣
  • 地磚用回收料、成本很高,要有補助才會有廠商做

其他

  • 1.5噸卡車,裝潢廢棄物丟棄費用破萬
  • 完全不能燒的: PVC(但是家裡丟出來的還是會燒到)跟醫療廢棄物(有放射線)
  • 代清業者,一噸收3600元?
  • 檢查,一袋30個寶特瓶以上就要罰6000元,其他有的可能3個月不能進來,整車退運
  • 台中醫療廢棄物1公斤,25-30元
  • 公告的回收物跟清潔隊的認定可能不同,例如:乾淨的保麗龍跟塑膠袋,怎樣算乾淨的
  • 理論上不會有味道,臭味都是垃圾中有餿水漏出來
  • 金紙處理: 週六內湖專爐專燒,每年有淨爐儀式
  • Q: 垃圾會燒起來嗎 A: 每年夏天都會燒起來 (會請消防局來噴水)

給大家的建議:做好回收

北投焚化爐
垃圾車傾倒的地方
北投焚化爐
集中一起燒的金紙
北投焚化爐
目前垃圾量算很少的
北投焚化爐
超大型夾娃娃
北投焚化爐
垃圾要一直翻動,讓他稍微乾燥一點,比較好燒
北投焚化爐
廢氣監控,講者說他沒有遇到超標過

另一場的分享:【垃圾去哪兒?北投焚化爐開箱實錄 🏭】

251127tech duckdb

  • 2025-12-02 補充

DuckDB - 直接用SQL語法篩選資料,免匯入

想收集TBIA所有「紀錄者/採集者」 (recordedBy)的名字,先想到用之前有使用過的XSV,但要安裝時發現已經沒有在維護了,XSV的介紹叫大家改用qsv,跟XSV一樣參數簡單、速度超快。TBIA下載所有的資料,解壓縮完有27.9GB (29,536,885筆資料),用qsv讀取recordedBy跟拿掉重複輸出,大概幾十秒就做完了。

qsv select recordedBy tbia_{hash}.csv | qsv dedup

但我想到要比對一下人名跟資料集名稱 (datasetName)對映,順便也統計一下筆數,似乎就要寫一點點程式,查一下資料才發現duckdb這套強大的資料庫可以直接用我熟悉的SQL語法處理,甚至不用匯入,直接對CSV欄位名稱下語法就好,速度一樣超快,還有漂亮的輸出,真是相見恨晚。

先簡單列出不重複的人名

duckdb-recordedBy

加上資料集名稱與統計關聯的資料筆數

duckdb -c "SELECT recordedBy, datasetName, count(*) FROM 'tbia_6927dd263f39e705b9843d70.csv' GROUP BY recordedBy, datasetName ORDER BY count(*)"

duckdb-recordedBy-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 (有框線)

GeoPick - 自行定義地理區域範圍的好用工具

在生物多樣性資訊開放資料標準領域,關於地名、地理位置、精確度... 要用什麼格式描述與紀錄,有洋洋灑灑的一篇指引提供參考 Georeferencing Best Practices,但人生已經很難了,沒有好用的工具會更困難。於是有人寫了好用的服務讓這件事變的更簡單、更直覺,就是︰ Geopick

間單的說只要4個步驟︰

  1. 選取已知或自行定義地理區域範圍
  2. 填寫誰定義的、備註
  3. 驗證 & 產出

就完成了。

詳細來說有兩種使用情境,第一種︰

直接使用已知或常用地名

這邊用「天母」這個含糊的地名來當例子,天母這個地名非正式行政區的名字,不同時期、不同背景,會有不同的範圍,導致有所謂的真正的天母、老天母、天母邊緣、不是天母(北投),甚至有人開玩笑建商也有一個最廣的範圍定義...

先不管確切範圍,在界面上方的搜尋欄輸入: "天母",就有下拉選單的資料,地名資料來自於OpenStreetMap的Nominatim,然後就有一個被標注在天母圓環的點位了 (這邊也不討論「真」天母圓環是那一個,那又是另一個故事了,這邊指的是天母東/西路跟中山北路,假日有市集的那個圓環),然後填上georeferencedBy (誰填的) 這個欄位就自動產生 locality 地名欄位的資訊:

Nominatim: 天母, 士林區, 蘭雅, 臺北市, 11152, 臺灣

有趣的是這個工具沒有使用 DarwinCore常用的 country (國家)、stateProvince (省/州)、county (縣/市/郡)、municipality (地方行政區)... 這樣的欄位,大概是考慮各國系統太複雜了,本國人常常也不一定會完全理解 (隨便問一題,你知道台灣現在有那幾個城市是省轄市嗎),總之這個locality就填寫完成了,前面還加上" Nominatim:",交待了來源。

自行定義範圍與名稱

第二種,就是要自行命名一個我自己認定的範圍,也想給一個名稱,直接用地圖上的劃線工具把我要的區域框出來,然猴給locality(地點名稱)、georeferencedBy (誰填的) 跟georeferenceRemarks(說明備註),就這樣。

然後他就自動產生可以盡可能詳細的放入DarwinCore欄位的資料,直接複製打包帶走,很方便。

示範內容如下圖:

至於這些詳細欄位內容的定義與使用就請移駕Darwin Core Quick Reference Guide - Darwin Core (Location Class)。


原始碼: rtdeb/GeoPick: Simple uncertainty radius calc for lines and polygons

真心感謝無私奉獻的Geopick、OpenStreetMap、Nominatim、ESRI World Imagery與GBIF ~

我的Debian GNU/Linux 桌面環境

安裝Debian 12、Gnome Desktop,語系選繁體中文。

新的Gnome不習慣,login的畫面點齒輪改成Gnome Classic

(2025.04.16)

基本桌面設定

  • 輸入法: 英文Dvorak、中文新酷音 (設定直接改就好了)
  • 終端機: 換一下配色

Add sudoer

edit /etc/sudoers

%your-username ALL=(ALL:ALL) ALL

logout/login 後才有作用

Caps Lock改成 Ctrl

修改 /etc/default/keyboard

XKBOPTIONS="ctrl:nocaps"

Install Packages/Tools

Update packages

sudo apt update
sudo apt upgrade

Development

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

chsh -s /bin/zsh
logout/login 後才有作用

Docker

https://docs.docker.com/engine/install/debian/

好用軟體

Command line

  • lazydocker, lazygit
  • fastfetch (好用好看的system info)
  • Alacritty (好用的 Terminal Emulator,標榜OpenGL、速度快)

Desktop

Floorp

到 https://ppa.floorp.app/ 按步驟安裝

Chromium

apt get install chrome

Zotero

Installation Instructions

Debian 12會報錯,要 install libdbus-glib-1-2

系統管理

  • bmon: command-line 看網路狀況

硬碟壞掉處理

我的Intel Nuc小電腦的電源不知道什麼原因按了都沒反應,本來以為是電源線接觸不良或變壓器壞掉,送檢測結果是硬碟壞掉,但是不知道為什麼連開機BIOS也沒出現。

總之就把硬碟拆下來接外接盒,其他電腦也是讀不到。

fdisk 有看到sdb device,想要手動mount,出現以下錯誤。

sudo mount -t ext4 /dev/sdX1 /mnt/mydisk

mount: /mnt/mydisk: wrong fs type, bad option, bad superblock on /dev/sdb1, ...

以下靠Chat-GPT亂試,至少把資料救回來了。


lsblk看也是有device,但是沒有partition。

lsblk -f

fsck檢查 (忘記這個可以幹嘛)

sudo fsck -b 32768 /dev/sdb1

看仔細

lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

會有以下幾種狀況

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

重新請Chat-GPT統整

Step 1: Identify the Device

sudo file -s /dev/sdX

Step 2: Check Filesystem Signature

sudo file -s /dev/sdb

Step 3: Recovery or Format?

=> Recover data

先安裝testdisk這個神奇工具

sudo apt install testdisk

進入文字互動介面

sudo testdisk
testdisk 操作
  • [Create] a new log file
  • Select /dev/sdb
  • Choose partition table type (Intel = MBR, or EFI GPT if it's a newer disk)
  • [Analyse] to find lost partitions
  • [Quick Search] or [Deeper Search] if needed
  • When partitions are found, press P to list files inside
  • If files are there, you can:
  • Copy files (press C)
  • Or [Write] to restore the partition table

reboot 重開機,用lsblk看,partition回來了。testdisk太神了!!!

開機磁區還是壞的,開機抓不到硬碟,但是可以用外接盒讀回其他資料,至少資料有救回來。

重灌作業系統,分割磁區後就又可以正常使用了。

處理CSV的命令列利器: XSV

在Global Names的Tutorial: Parse names into a CSV file看到一個處理CSV超有效率的工具。

通常拿到一個csv,想快速得到這個csv的欄位有那些,總共幾筆,隨便列出幾筆看看資料長什麼樣子,然後決定只取其中幾個欄位資料,做簡單的條件篩選,最後匯出另一個我要的csv => 這些處裡可以用xsv一行指令做完。

安裝

因為是rust程式寫的,要先裝Cargo

以Linux為例:

curl https://sh.rustup.rs -sSf | sh

然後就可以用cargo安裝xsv

cargo install xsv

在shell的rc檔加上執行路徑

source "$HOME/.cargo/env""

處理情境: 整理TaiCOL物種清單

TaiCOL下載名錄,解壓縮是78MB,資料筆數233,440,不到10000元的NUC小PC處理完大概最多花不到2秒。

下載: 臺灣物種名錄 Catalogue of Life in Taiwan

列出headers

xsv headers TaiCOL_name_20250221.csv

找出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處理資料很直覺,適合處理大檔案。