2024年6月29日 星期六

iahway: 我在這裡,你們在哪裡?

俗稱冰棒的定位 app Zenly 去年已下架。 就算沒下架, 我也不會去用它呀, 因為它不是自由軟體。 沒關係, 請大家來試試我做的拼裝車 "iahway: I am here. Where are you?" 今年會在 ICOS 裡面分享。 因為我很懶惰, 真正的苦工都是別的軟體在做, 我只是用 50 列左右的 php 程式把它們串起來。 iahway 很陽春:

  1. 不必註冊
  2. 定位資訊不宜太頻繁更新, 會有點 lag
  3. 每次查看,要對地圖有動作 (pan 或 zoom), 資料才會更新
  4. 沒有隱私保護, 凡是知道網址且知道群組名稱的人都可以查看所有參與者的最後位置
  5. 我的伺服器隨時可能關掉; 但你可以自己架

iahway 的定位資訊流 gpslogger 記錄到自定義 url

一、 gpslogger

先從 f-droid 安裝 gpslogger

  1. 你可以有好幾組 「配置」, 也就是好幾組適用於不同情境的設定, 例如你可能參加好幾個不同的登山群組。 從主選單的第一列 「預設配置檔案」 點進去, 點 「新增配置檔案」, 取一個名字對應到某個登山群組, 例如中文的 「軟體自由協會登山隊」 或是英文的 「slat-hiking」 之類的, 中文至少要兩個字, 英文至少要6個字元, 等一下設定 umap 時需要用到 。 有點不便的是: 名字取好就不能更改了; 如果想改, 只能刪掉重來。
  2. 再從主選單的 「記錄細節」 進去, 啟用 「記錄到自定義 URL」、 「URL」 的部分填上: https://v.im.cyut.edu.tw/iahway/log.php?%ALL&uid=我的外號 其中 「我的外號」 可以是任意的中英文字串。 或是 (圖中的 alt 2.) 從主選單點 custom URL, 直接進入 「記錄到自定義 URL」 頁面設定。
  3. 從主選單的 「性能」 點進去, 可以設定記錄的頻率。 我通常設定 「記錄間隔」 30 秒或更久、 「按距離過濾」 20 米或更遠 (低於這個距離就不要重複記錄)。
  4. 上面的 %ALL 是叫 gpslogger 把所有的資訊通通傳給網頁伺服器。 如果不想傳這麼多資料給我 (站長) 看, 可以點 「參數」 查看文件, 看看有哪些資訊可以分開個別傳送。

按下 「開始記錄」, 至少產生一個資料點之後, 可以用: wget -O test.json 'https://v.im.cyut.edu.tw/iahway/query.php?gr=軟體自由協會登山隊' 測試一下。 如果成功抓回 test.json, 還可以用 jq . test.json 檢視輸出。 然後, 不介意被貴哥看見你的行程的讀者, 可以略過第二、三節, 直奔第四節。

二、 自架伺服器

我那部伺服器不知道還會運作多久。 建議大家自己或請朋友架設網頁伺服器。 首先, umap 只吃 https的網址。 也就是說, 你的網頁伺服器必須 (例如用 certbot 的 let's encrypt) 去申請憑證。 以下用我的 linux 及 apache2 來說明, 都是用 root 的身份在下指令。

mkdir /var/www/html/iahway/
cd /var/www/html/iahway/
touch log.php # 建一個空的檔
wget https://ckhung.github.io/a/m/24/iahway/query.php
# 只有上面這個小程式是我寫的

然後編輯你的 apache2 設定檔 /etc/apache2/sites-enabled/某個site.conf, 找到 CustomLog 那一句 (通常附近也會有一句 ErrorLog)。 把原來的 CustomLog 註解掉, 改用以下兩句取代:

CustomLog ${APACHE_LOG_DIR}/access.log combined "expr=%{REQUEST_URI} !~ m#^/iahway/#"
CustomLog ${APACHE_LOG_DIR}/access-iahway.log combined "expr=%{REQUEST_URI} =~ m#^/iahway/#"

以上的目的是要把造訪 iahway/ 底下的所有記錄跟主要的 access.log 分流, 以便分開管理 access.log 跟 access-iahway.log 的權限, 又能減輕 query.php 讀記錄時的負擔。 我是在 apache2 的 expression 頁面 搜尋 "expr=" 從這些範例學的。

再來, 為了要讓 umap 可以讀取 query.php, 可以在同一個設定檔內加這句: Header set Access-Control-Allow-Origin "*", 並且回命令列上:a2enmod headers ; systemctl restart apache2 詳見 enable cross-origin resource sharing

一開始我只想到要手動建立 /var/log/apache2/access-iahway.log 並且把 owner 改成 www-data (網頁伺服器)。 當天測試成功; 但隔天就失敗了。 原來是因為 logrotate 會把舊的 log 檔會改名、 再建新的 log 檔, 而新的 log 檔的 owner 就又變成 root, 網頁伺服器又讀不到它了。 所以我稍微改了一下 /etc/logrotate.d/apache2 , 全域設定的部分都沒有更動, 只把針對個別檔案的設定改成以下:

/var/log/apache2/access-iahway.log {
    create 640 www-data adm
}

/var/log/apache2/*.log {
    create 640 root adm
}

[補充筆記: 規則重複會被抱怨? 我遇到這個問題時只調整一下順序就解決了, 並沒有用到 ignoreduplicates。] 如此一來, 未來的 access.log 與 error.log 的 owner 都會是 root, 只有 root 可以讀; 而 access-iahway.log 的 owner 則會是 www-data, 會透過 apache2 及下面的 query.php (部分) 分享給全世界。

三、 query.php 測試模式

想要修改程式或測試資料的話, 可以在命令列上測試 query.php。 例如 php query.php -g gr=軟體自由協會登山隊 -l ~/test.log 這個指令會改從 ~/test.log 讀取 log 檔 (而不是預設的 /var/log/apache2/access-iahway.log ) 並且指定抓取每一位 (在 gpslogger 裡面) 把配置檔案名稱設為 「軟體自由協會登山隊」 的隊員他的最後一筆定位資訊、 產生群組裡所有隊員最新位置的 geojson 檔。

四、 umap

三個群組, 共11位成員的目前位置 假設你已略熟 umap 的操作。 請登入、 建立一張新的地圖、 編輯圖層。 點選 「遠端資料」, 網址填入: https://v.im.cyut.edu.tw/iahway/query.php?gr=軟體自由協會登山隊 然後點 「驗證遠端網址」 如果沒有紅色的錯誤訊息、 在地圖上你目前的位置有出現標記, 那就成功了! 另外建議:

  1. 本圖層的 「進階屬性」=>「標籤鍵」 設定成 「uid」。
  2. 本圖層的 「互動選項」=>「顯示標籤」 設定成 「經常」。
  3. 本圖層的 「形狀屬性」=>「圖示標誌」 可以 (根據群組的名稱或特性) 選各種符號, 或是 「表情符號或字元」, 輸入任意的中英文甚至 unicode
  4. 圖磚改成 OpenStreetMap (而不要用預設的、 較慢的 OSM-Fr)。
  5. 「編輯權限」=>「誰可以檢視」 設定成 「任何有連結的人」。

如果有很多個群組, 可以把每個群組放在各自的圖層、 採用各自的圖示/顏色。 我很想看到很多群組的壯觀景象; 可惜到目前為止, 沒有山友對 iahway 有興趣, 我在地圖上永遠只能看到我自己孤單一個人... 只好隨便 fake 自嗨一下, 把自己的足跡拆成十幾個人、 分散放在三個群組裡, 如附圖。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。