2023-07-20
老人家因為食慾、味覺、牙齒、吞嚥、經濟等因素,經常有蛋白質攝取不足的問題。 美國聯邦政府建議的蛋白質攝取量是每天 0.8公克乘以 [體重公斤數] 的蛋白質, 例如 60 公斤的人每天應該吃 48 公克的蛋白質。 65歲以上的健康長者吸收力已退化, 為避免肌少症最好把乘數調高到 1.0 或 1.2, 且最好要分散在三餐, 讓身體有時間吸收。 但腎臟病者可能也不宜攝取過多蛋白質。 乳清蛋白有助於補充蛋白質的不足, 例如受傷/手術時, 但是不宜拿它來取代正常食物的蛋白質。 素食者可吃豆類, 首推新鮮毛豆仁、黑豆及黃豆。 加工豆類食品當中, 可以吃豆皮、 豆干絲、 小方豆干; 建議少吃油脂量高的日式炸豆皮。 另外, 一定要運動。 整天坐著不動很容易導致肌少症。 嗯, 原來我的豆干零食還可以算是好物呢! 早餐爬完文趕快去吃~ New York Times KFF health news
2023-07-19
上個學期教資料視覺化, 其中一個主題是繪製客製地圖, 就做了這個例子: 台中公共腳踏車租賃地點。 像這種 marker 個數太多太密集的地圖, 需要用 cluster map 來做, 當訪客拉近 (zoom in) 時, 才把一個 cluster 拆成更多個小的 clusters。 雖然 umap 也可以製作 cluster map (例: 清冠一號中醫診所地圖) 不過 umap 只能顯示每個 marker 的名稱; 用我的小程式則可以顯示所有 properties 的完整資訊。 請先下載 程式碼, 然後用瀏覽器打開其中的 index.html, 拉近拉遠測試一下。 如果是 firefox, 要先到 about:config 裡面把 security.fileuri.strict_origin_policy 設成 false; 如果是 chromium,
2023-07-18
在 hacker news 上面看到這篇 Introducing zq: an Easier (and Faster) Alternative to jq 。 玩懂了之後, 發現用它來轉檔 (json => csv 或 csv => json) 及篇輯/篩選 json 檔的內容超方便, 甚至比 jq 簡單很多! 只是他們把 zq 的太多功能與特色擠在一篇文章介紹, 所以步調太快, 有點難懂。 這裡我拿臺中市 151 公車停靠站 tcbus-151.json 來作範例, 展示最常用的 zq 基本語法。 這個檔案是從 ptx 公共運輸整合資訊流通服務平台 撈出來的。 一、 簡介 到 github 的 release 頁面 下載適合你的作業系統的版本。 以我下載的 linux-amd64 版本來說, 解壓縮之後把 zq 與 zed 兩個執行檔搬到 /usr/bin 底下就
2023-07-18
這幾天在設定一部新的伺服器。 建立一個檔案 /etc/cron.daily/backup.sh 把一些備份的指令寫在裡面。 兩三天下來卻一直沒等到備份檔的出現。 查看 cron 的 log 檔: journalctl _COMM=cron 看到這樣的內容: Jul 13 05:17:01 ckhung CRON[2075]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0) Jul 13 05:17:01 ckhung CRON[2076]: (root) CMD (cd / && run-parts --report /etc/cron.hourly) Jul 13 05:17:01 ckhung CRON[2075]: pam_unix(cron:session):
2023-07-01
最近想要清家裡, 把一堆舊衣服、 舊電器、 電腦週邊等等拿去回收。 於是搜尋到 iTaichung 環保地圖。 可是它把每個店家獨立顯示在一張地圖上, 感覺很難用。 於是製作了 台中環保商店地圖, 把所有的店家放在同一張地圖上, 並且在這裡記錄一下步驟, 順便當作網頁爬蟲/資料視覺化的教材。 點前幾頁, 再點到最後一頁, 看出簡單的網址規則。 先產生一個頁碼檔 pn.txt: perl -e 'for $i (1..207) { print("$i\n") }' > pn.txt 或是 python3 -c 'for i in range(1,208): print(i)' > pn.txt 。 [請省略這一步, 減輕官網負擔。 請改直接下載 我整理過的、 含有 207 個 html 檔以及後續中間步驟的綜合壓縮檔。] 我當初這樣下載 207 個 html 檔: for
2023-06-25
讀到一個神奇的正規表示式, 竟然可以拿來判斷字串長度是否為質數?! ^x?$|^(xx+?)\1+$ "|" 的左邊很簡單, 只是在比對長度為0或者1的字串。 比較燒腦的右邊則是在嘗試比對 「長度恰好為 p*(q+1)」 的字串。 小括弧裡面的部分抓取 「長度至少為2的子串, 越短越好」。 這裡用 non-greedy 的 +? 而不是較常見的 (greedy 的) + 來表達「越短越好」。 後面的 \1+ 表示 「重複前面小括弧比對成功的同一字串任意次, 至少1次」。 如果小括弧內的字串長度為 p, 後面的成功比對次數為 q, 那麼整個字串的長度就是 p*(q+1), 不是質數。 用 python 寫, 程式長這樣: import re def is_prime(n): return not re.match(r'^x?$|^(xx+?)\1+$', 'x'*n)
2023-06-23
雖然偶爾才遇到... utf8 轉碼 big5 很討厭, 因為 big5 的字集比較小, 會有很多字轉不過去。 今天拿 衛服部「清冠一號動態表」 的中醫診所地址清單做例子, 因為 地址轉經緯度的 TGOS 服務 要求輸入檔案必須採用 big5 編碼。 把網頁存成 cg1.html 。 轉檔: python3 html2csv.py cg1.html > cg1.csv。 手動編輯 cg1.csv, 去掉 "###" 以下所有多餘的列。 某些列的某些欄位因為內含逗點, 所以被雙引號包起來, 以免那些逗點被當成欄位分隔符號。 比較簡單的方式是: libreoffice cg1.csv、 手動刪掉許多欄位, 只保留代號+名稱+地址三欄、 另存新檔成為 2.csv、 再用 nano/geany/vim 手動編輯 2.csv, 找到所有含有雙引號的地址 (共五列)、 手動把
2023-06-18
[本來想重寫 TGOS 的教學文, 做這張圖時才發現 umap 已中文化, 介面改了不少, 而且有提供 cluster map 的功能, 就乾脆連 umap 教學也一起重寫。] 接續前一篇 轉碼 big5 除錯記, 已經得到整理過的清冠一號中醫診所地址檔 3.csv。 (仍舊是 utf8 編碼, 但不會讓 iconv 消化不良。) 下一步要轉成 TGOS 規定的格式。 經過很多次實驗, 發現幾件事: 地址欄如果有郵遞區號, 很多時候反而會出錯。 最好刪掉。 很多筆資料裡面的「巿」跟平常打字出現的「市」其實並不一樣: echo '巿市' | xxd 會看到前者的編碼是 e5 b7 bf 而常用的「市」則是 e5 b8 82。 id 欄必須是整數, 中間跳號沒有關係, 也不需要按照順序。 但是為了等一下處理 (join 指令) 方便, 最好每一列的 id 位數相同 (例如都是