Skip to content

index

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

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


我的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/

好用軟體

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

關於CSV的各種編碼,還有BOM的雜記

各種CSV格式

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","|

欄位名稱沒有雙引號,沒有BOM header

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|

轉換成UTF-8 BOM

開頭: 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|

轉換成UTF-16 LE BOM (Little Endian)

開頭: 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.|

轉換成UTF-16 BE BOM (Big Endian)

開頭: 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|

其他:

  • 用LibreOffice、Google Spreadsheet匯出的預設欄位沒有雙引號,也沒加BOM header

(有空再來補各種版本Excel的匯出)

自然攝影中心 (nc.biodiv.tw)

系統狀態

系統板本: vBulletin 3.6.3 (付費版本) - PHP: 5.6 - MySQL: 5.5

附加檔案: - 磁碟空間: 202,188MB - 檔案數: 1,669,049 (包含.attach跟.thumb)

問題

  • 系統老舊
  • 資安風險 -常被通報
  • index.php, includes目錄等被植入莫名程式碼 (2021年底-2022年初移除)

目標

  • 把內容取出,結構化部分內容 (植物圖鑑 小圖連大圖)
  • 以靜態HTML頁面呈現,查詢
  • 封存並關閉現有網站

方法

  • 從 vBulletin 資料庫擷取"小圖連大圖"的文章串
  • 下載並整理相關的圖片檔案
  • 轉換內容為 11ty 可用的 Markdown 格式
  • 生成靜態 HTML 網站

實際處理紀錄

分析Database Schema

文字內容

  • 主要內容在post資料表裡,thread會關聯很多筆post
  • post有些是科的目錄,有些是種的內容,要區分
  • "小圖連大圖"是從一個threadid: 27653開始,主要是科(family)的連結
  • 大部分的各科的post包含屬(genus),會有科以下的物種(Species) 學名,少部分比較大的科如豆科菊科會是thread,然後再關聯許多筆post
  • 內容有很多BBCode

照片檔

  • 路徑是/src/html/nc/vbb35data/[1-9]/的目錄
  • 副檔名是.attach跟.thumb
  • 讀取照片是attachment.php處理
  • 路徑規則是user_id位數分開,如: 1234,檔案的路徑就是 ~/vbb35data/1/2/3/4/xxx.attachment (xxx即attachmentid)
MySQL to SQLite

把需要的資料取出來,轉成Sqlite方便處理

  1. Dump vbb35post and encoded as latin1
mysqldump -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
  1. Change encoding to utf8, edit post.sql and attachment.sql (latin1 -> utf8mb4)

    • !SET NAMES utf8mb4
    • DEFAULT CHARSET utf8mb4
  2. Import back to mysql (utf8 client readable for better check)

    1. create database nc_nice
    2. mysql -u root -p nc_nice < post.sql
    3. mysql -u root -p nc_nice < attachment.sql
  3. Use adminer.php to export csv

  4. import to sqlite3

sqlite> .headers on
sqlite> .mode csv
sqlite> .import post.csv post

Note

  1. 跟 4. 步驟也可以mysql直接轉csv或sql, import sqlite 甚至,python mysql client 直接讀取mysql也可以,但是我比較熟adminer.php,也習慣用adminer.php查看資料,所以才花點力氣轉來轉去。
Transform Data

寫一個script處理: 1-parse-data.py

  1. 從小圖連大圖, 複製貼上產生family.txt,純手工,寫parser效益太低
  2. 這一串thread的post取出所有科跟種的資料
  3. parse物種post的內容

  4. 取得higher taxa (很大概,視情況手工處理細節)

  5. 圖檔列表attach (list)

    • 小圖連大圖系列只需要26635張圖
  6. 產出整理後的資料: eggs.csv (4千多筆)

11ty Static Site Generator for Render

2-make-markdown.py

  • 從整理好的csv轉換成11ty的markdown格式跟metadata
  • 產生所有科跟屬的清單頁面,直接匯出到 11ty_folder/posts/plantae-index
  • 種的頁面匯出到 11ty_folder/posts/plantae
  • 首頁的科清單是用產出的family.txt,手動貼到index.njk裡

11ty 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)

  • build all pages (2025-02-03)
  • 11ty deployment to (Cloundflare or S3/Cloudfront?)
  • image transfer and link
  • decorate 11ty layout
  • search (install findpage plugin?)

Legacy Site (nc.biodiv.tw)

  • archive

貢獻

歡迎任何貢獻!

Zotero

管理研究文獻的Zotero真的太好用了,我一直沒有用的原因是自己沒有在做研究,所以覺得用不到,但拿來當筆記軟體,處理輸入的資料也是超級好用的,相用恨晚。 Zotero的好用不是他有多強大花俏的功能,而是簡單到剛剛好就可以! 之前用過各種筆記軟體,EverNote, OneNote, Dropbox paper, HackMD, LogSeq, Notion… 現在花錢買Heptabase,(有空再來寫使用心得)結果也是建立一堆很難再被看到的垃圾資訊的卡片,也很難走到用視覺化處理、產出。input的東西還是要靠工具或紀律做最低限度的整理,例如,收藏資料要選型別 (blog, video, journal, website…)決定使用的資料欄位,一開始覺得很煩,但後來覺得很重要, 匯出的時候看到自己的垃圾曾經被過去的自己整理過會很感動🥹 然後,匯出方便、格式單純不囉嗦,有手機App版本,桌機也支援Linux,open source 加分… 誠摯推薦 https://www.zotero.org 我沒有做研究,所以我也不知道跟Endnote, Mendelay… 的差別,我也沒用過匯出的引用格式,畢竟我收錄的都是一些廢文、短影音、幹話… 難登大雅之堂。

分類

letter: my words (特有) bill: note (特有) manuscript: 討論

/⭐️

AWS EC2 計價

大分類

  • On-Demand: 用多少算多少
  • Savings Plans: 先講用多少、用多久,會比較便宜,改type比較彈性
  • Reserved Instances: 先講用多少、用多久,會比較便宜,但要用1~3年
  • Spot Instances: 競價,價格是浮動的,出價太低instance會被砍掉
  • Dedicated: 專屬

我還沒有plan,考慮on-demand

EC2 Instance Type Pricing

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/

Diff Type

T2: Intel CPU

  • Up to 3.3 GHz Intel Xeon Scalable processor (Haswell E5-2676 v3 or Broadwell E5-2686 v4)

T3a: AMD CPU, 比T3省10%

  • AMD EPYC 7000 series processors (AMD EPYC 7571) with an all core turbo clock speed of 2.5 GHz

T3: Inter CPU

  • Up to 3.1 GHz Intel Xeon Scalable processor (Skylake 8175M or Cascade Lake 8259CL)

T4g: Arm-based, 最便宜, 某些情況會更快? (大部分時間,都不全速使用CPU的應用程式設計?)

  • custom built AWS Graviton2 processors

Diff Regions

Which AWS Region Is Cheapest? A Costing Report

Diff Latency Test

Speed Test

結論

便宜程度: N.Virginia (us-east-1), Ohio (us-east-2), Oregon (us-west-2)

Latency: Tokyo, Singapore, California, Oregon, Ohio, N.Virginia

[讀書] 作弊 - 安德魯.克萊門斯

The School Story, Andrew Clements

圖片來源: 安德魯.克萊門斯 6: 作弊 (第2版) | 成長/校園小說 | 商品 | 誠品線上

有一天收到圖書館預約書通知,書名是「作弊」,以為是老婆或小孩用我的借書證預約的,總之搞不清楚的狀態下去拿書了。看到書的封面才想起來,可能很久很久以前忘記看到那位朋友介紹這位作者,覺的可以讓小孩多看一些讀物,於是上網預約這系列的書: 「我們叫它粉靈豆」、「成績單」...,很熱門,等了幾個月書才到,而當然後來書在家放超過借書期限後,又原封不動還回去了。

這本認真的看了一下,故事很流暢的翻完,真是很有趣

整本書跟作弊根本沒什麼直接關係

Python Tkinter的Listbox無法scroll

環境: Windows 11, Python 3.8

用鍵盤上下鍵觸發Listbox.yview_scroll也沒反應。

這個很詭異的問題是下拉選單原本是用python預設的srcoll動作,但是選項小於15個時, 不會有scroll的反應, 目前用手動加上scrollbar解決。