自製 ubike 租賃站點地圖

2 天 5 小時 ago
退休 後把伴我26年的古董車賣了, 現在開始過著大眾運輸+ubike的生活。 於是自製 ubike 租賃點 umap 地圖。 使用前需要先造訪一次 這個網址。 這個 "7984" 是我把 tdx api 包裝成 geojson 的一個服務, 另文再詳。 因為這個 https 服務採用我自簽的憑證, 你必須先選擇信任它, 之後造訪 umap 地圖時才可以成功載入 "7984" 所提供的 geojson 資料檔。 資料量很大, 所以我只放了台中跟高雄這兩處我的生活圈。 如果想要自己挑選縣市的話, 可以先學會 用 umap 建立自己的私房地圖。 然後在圖層設定選單當中, 點 「遠端資料」, 輸入上述 "7984" 網址, 意思是本圖層的資料直接從遠端網址匯入。 資料格式請設定為 geojson。 又把 「快取代理請求」 設定成 1日, 以便每日更新, 納入最新增/刪站點資訊。 我的
ckhung

linespector: 半手動備份 line 文字對話內容與低解析度圖片

1 週 4 天 ago
Line 沒有很好的文字搜尋的功能、 在電腦版 (chrome 擴充套件) 上面只能保留兩週的訊息、 即使是公開的群組也沒有 https 的網址可以分享、 ... 有各種不方便。 最近寫了一隻小程式 "linespector" 可以從電腦版把某個群組的近期文字對話內容與 (低解析度) 圖片全部合併儲存到一個 sqlite 資料庫檔案裡面, 再用 php 以網頁的方式呈現。 我拿它來把社區的 line 群組轉成網頁, 在內部的網站公告。 (當然事先已徵得群組管理員與成員同意) 如果你發現它有其他的用途, 也請留言分享。 我的開發環境是: linux mint debian edition 5 (elsie)、 apache2 2.4 (已啟用 php)、 chromium 103、 python 3.9。 下載我的程式碼: linespector 並解壓縮到某個目錄。 安裝
ckhung

運輸資料流通服務 tdx 範例

1 週 6 天 ago
交通部把 「公共運輸整合資訊流通服務平台 ptx」 改版升級成 「運輸資料流通服務 tdx」。 查詢公車站牌、 公車目前位置等等資訊變得更方便了! 請見 範例程式 以及 市公車 API 清單與示範。 首先, 你需要註冊一個會員帳號, 然後就會自動取得一組 ID 跟 Secret。 把這組 ID 跟 Secret 填入範例程式的 tdx-credential.sh, 即可執行並取得一個 json 檔, 內含 access_token。 請把程式中的 $TDX_TOKEN_DIR/tdx-credential.json 改成你自己設定的路徑, 不要 放在 apache2 (或其他網頁伺服器) 讀得到的地方。 路徑必須是所有人可執行; 檔案本身必須是所有人可讀取。 (主要是需要讓網頁伺服器執行者 www-data 讀取。) 。 這個 tdx-credential.sh 可以
ckhung

autossh: 建立具有韌性的反向 ssh 隧道

1 個月 1 週 ago
家裡或公司的防火牆裡面有一部 24 小時開機的電腦 H, 沒有對外的 IP 位址。 另外有一部具有公開位址的伺服器 PubS。 這時可以從 H 向 PubS 啟動一個 反向 ssh 隧道連線, 像這樣: ssh -4fNR '4380:localhost:22' ckhung@PubS 這裡的 4380 是任選的 port。 接下來就可以隨時隨地 (從網路其他任何地方) 先登入 PubS, 再從 PubS 登入 H: ssh -p 4380 localhost。 可是, 只要家裡跳電或分享器關機一陣子, 連線就斷掉, 哭哭了。 這時你需要 autossh, 它可以定時檢查連線是否暢通, 有必要時就會自動重新啟動連線。 先在 PubS 上面作一些準備。 這部分都採用 root 的身份做事。 我喜歡建立一個拉管線專用、 最低權限的機器人帳號: useradd sshbot -m -s
ckhung

用 iptables 對付惡意幫派網頁爬蟲

1 個月 2 週 ago
前一陣子查看了一下我的 apache 伺服器的 access.log, 發現竟然有成群結隊 (來自同一網段) 的惡意網頁爬蟲在輪流攻擊, 用 fail2ban 逐一擋根本對他們太客氣了, 甚至不一定擋得到。 於是改成連坐處分, 直接用 iptables 永久封鎖整個網段, log 檔變得安靜多了。 請下載、 解壓縮 access.mal.log.gz。 這是我某一天的 log 檔。 一如以往, 以下大量使用 perl-compatible regular expressions。 先查看每一分鐘的流量: perl -ne 'print "$1 $2:$3\n" if m#\[(\d\d)/[A-Z][a-z][a-z]/2023:(\d\d):(\d\d):#' access.mal.log | uniq -c | less 大部分時候, 每分鐘的瀏覽數是個位數字; 有些時段突然
ckhung

攝取蛋白質、預防肌少症的建議

2 個月 2 週 ago
老人家因為食慾、味覺、牙齒、吞嚥、經濟等因素,經常有蛋白質攝取不足的問題。 美國聯邦政府建議的蛋白質攝取量是每天 0.8公克乘以 [體重公斤數] 的蛋白質, 例如 60 公斤的人每天應該吃 48 公克的蛋白質。 65歲以上的健康長者吸收力已退化, 為避免肌少症最好把乘數調高到 1.0 或 1.2, 且最好要分散在三餐, 讓身體有時間吸收。 但腎臟病者可能也不宜攝取過多蛋白質。 乳清蛋白有助於補充蛋白質的不足, 例如受傷/手術時, 但是不宜拿它來取代正常食物的蛋白質。 素食者可吃豆類, 首推新鮮毛豆仁、黑豆及黃豆。 加工豆類食品當中, 可以吃豆皮、 豆干絲、 小方豆干; 建議少吃油脂量高的日式炸豆皮。 另外, 一定要運動。 整天坐著不動很容易導致肌少症。 嗯, 原來我的豆干零食還可以算是好物呢! 早餐爬完文趕快去吃~ New York Times KFF health news
ckhung

繪製 (公共腳踏車租賃地點、公車站牌、...) 群聚(地)圖不必改程式碼

2 個月 2 週 ago
上個學期教資料視覺化, 其中一個主題是繪製客製地圖, 就做了這個例子: 台中公共腳踏車租賃地點。 像這種 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,
ckhung

json 裁剪/轉檔 (例如轉 csv) 都交給它了: 強大且易用的 zq

2 個月 2 週 ago
在 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 底下就
ckhung

我的 cron 為什麼不會動?

2 個月 2 週 ago
這幾天在設定一部新的伺服器。 建立一個檔案 /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):
ckhung

台中市環保地圖

3 個月 ago
最近想要清家裡, 把一堆舊衣服、 舊電器、 電腦週邊等等拿去回收。 於是搜尋到 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
ckhung

判斷字串長度是否為質數的正規表示式

3 個月 1 週 ago
讀到一個神奇的正規表示式, 竟然可以拿來判斷字串長度是否為質數?! ^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)
ckhung

轉碼 big5 除錯記

3 個月 1 週 ago
雖然偶爾才遇到... 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, 找到所有含有雙引號的地址 (共五列)、 手動把
ckhung

TGOS 批次地址查經緯度 + umap 私房地圖範例: 清冠一號中醫診所地圖

3 個月 2 週 ago
[本來想重寫 TGOS 的教學文, 做這張圖時才發現 umap 已中文化, 介面改了不少, 而且有提供 cluster map 的功能, 就乾脆連 umap 教學也一起重寫。] 接續前一篇 轉碼 big5 除錯記, 已經得到整理過的清冠一號中醫診所地址檔 3.csv。 (仍舊是 utf8 編碼, 但不會讓 iconv 消化不良。) 下一步要轉成 TGOS 規定的格式。 經過很多次實驗, 發現幾件事: 地址欄如果有郵遞區號, 很多時候反而會出錯。 最好刪掉。 很多筆資料裡面的「巿」跟平常打字出現的「市」其實並不一樣: echo '巿市' | xxd 會看到前者的編碼是 e5 b7 bf 而常用的「市」則是 e5 b8 82。 id 欄必須是整數, 中間跳號沒有關係, 也不需要按照順序。 但是為了等一下處理 (join 指令) 方便, 最好每一列的 id 位數相同 (例如都是
ckhung
Checked
8 小時 32 分鐘 ago
大人問小孩: 「全世界的玩具隨便你挑? 這怎麼可能? 如果我要的玩具只有一個, 正好又被別人借走了呢?」
「玩具閘門後面, 每種玩具永遠只有一個。 任何人想玩, 隨時都可以生一個複製品給你。
這裡沒有人搶玩具。 這裡是 玩具烏托邦。」
* * * *
貴哥在這裡分享自由軟體跟免費雲端工具的知識與技術, 目的是希望打破 「品牌忠誠肥羊」 們的迷思、 要「讓數位高牆倒下」 (請搜尋)。

(還有其他雜七雜八不想放到 「資訊人權貴ㄓ疑」 的筆記跟感言)
Subscribe to 玩具烏托邦 feed