沒穿方服

索引

顯示╱隱藏內文

這篇不是什麼新知,只是我第一次處理,覺得比看起來容易,希望改善「看起來比較難」情況。

村里邊界,右下文字部分要自己處理 mouse 事件

整個處理大致都被 GeoJSON 包裝好了

原本沒碰過 GeoJSON,自己想像要處理區塊框線、互動,以為要折磨很多事;但其實在 Leaflet 裡可以看成載入一個 GeoJSON 資源,再用 addTo(map) 掛上去就結束了。

建立與顯示:

const layer = Leaflet.geoJSON(data as GeoJsonObject, options);
layer.addTo(map);

外觀、互動行為等,可以用 options 去調,以下是一個 options 物件:

{
  style: () => ({
    fill: false,
  }),
  onEachFeature: function (feat: Feature, layer: Path) {
    layer.on('mouseover', function () {
      layer.setStyle({ fill: true });
    });
    layer.on('mouseout', function () {
      layer.setStyle({ fill: false });
    });
  },
}

要關閉圖層,就 remove 掉:

layer.removeFrom(map);


取得地圖資料

另一個問題是圖資怎麼來,首選當然是內政部的開放資料:
縣市界:鄉鎮市區界線(TWD97經緯度)、村(里)界:村里界圖(TWD97經緯度)

但要怎麼轉成 GeoJSON 格式?尋找現成整理好的,似乎都失連,或看起來有點年代,幸好裡面原理沒變,參考 jason2506/Taiwan.TopoJSON,它是用 mapshaper 將 .shp 轉為 .geojson。

具體指令例,縣市:

mapshaper raw/COUNTY_MOI_1090820.shp -simplify interval=400 \
  -filter 'COUNTYNAME !== "金門縣" && COUNTYNAME !== "連江縣"' \
  -rename-fields name=COUNTYNAME -filter-fields name \
  -o format=geojson precision=0.0001 \
  counties.geojson

村里:

mapshaper raw/VILLAGE_NLSC_1130807.shp -simplify interval=30 \
  -rename-fields id=VILLCODE \
  -verbose \
  -filter 'COUNTYNAME !== "金門縣" && COUNTYNAME !== "連江縣"' \
  -each 'name=TOWNNAME + " " + VILLNAME' -filter-fields id,name \
  -o format=geojson precision=0.0001 \
  villages.geojson

其中 -simplify interval=precision 參數可以控制產出的精細度,也決定了檔案大小。 上面範例出來的結果是 61.35 KB 和 7.21 MB,後者檔案很大,但其實掛在 Cloudflare R2,在 HTTP/2 和壓縮加持下傳輸量只有 1.7 MB,使用上是沒什麼問題的。

利用植物偽裝。隨便撿一塊黃牌是方便監視用的,下次可以換成狗比較看不見的紅或綠色 據說王太太也是用烤雞捕狗

今年八月鎖定一隻個性激動,愛吠愛淋雨的大白,基於之前動保處人員說他們也會結紮公犬,會比較乖之類的(有這種事?),就蒐證請求處理,結果又回一些沒用的話,爭取後結論是動保處只能出借誘捕籠,民眾要自己捕捉,誘餌也要自己準備。

在「精準捕捉」這個奇葩政策下,就是幾乎已經放棄捕犬。 反正我也沒親身用過(犬)誘捕籠,聽里長說之前放都被人偷開或破壞,就讓我來實驗看看吧。

結果放了將近一個月(通常大概只能借一個禮拜),曾經目睹大白接近,甚至鑽進去把食物叼出來(身手真好),但最後只抓到另一隻近期新來的乖乖狗,近看才確認是已紮母犬,只好放走,放狗混帳竟是我自己。

尖耳黃臉黑,蠻漂亮的 買鹹酥雞的一晚,加菜是意外

以下重點回顧,下次我有信心成功:

  • 位置很重要:隱密、容易監視、降低狗戒心

    這次我優先考量隱密性(防小人),但放一兩天發現狗不靠近,才換到稍微開放的地方,之後接觸率就增加了。

    一個人搬誘捕籠要用背負、扛的,有點難度,但後來看動保處大哥也是扛出去才拆解上車,所以這作法應該正確。

  • 清空餵食者放的食物

    當時有一位隱藏的大餵食者會深夜偷丟大包雞骨,還有一些零星亂餵的人,因為在誘捕我就清得很勤,結果狗的出現率就遞減,這之間要抓一個平衡,在狗絕跡前速戰速決。

  • 投其所好

    當然要針對狗的個性誘捕,這群狗的偏好第一是雞脖子,再來就是雞骨人丟的骨架內臟,至於狗罐頭、貓食甚至鹹酥雞,似乎都激不起衝動,沒有被吃。

  • 關鍵的掛鏈

    這次最飲恨的就是沒有先摸熟這個機關,連結「踏板的掛鏈」和「掉落門的長桿」的部分,決定了踏板的敏感度,如果這個鏈條掛得太靠外面(籠子外面),會變成踩到踏板也不會觸發關門,大白可能就是這樣才逍遙法外。

從 react-masonry-css 示例

註 1:這篇談的是 2020 前的 CSS 解法 (flexbox),且使用 react-masonry-css 這個老套件,並非新的 JS 解或還未定案的 CSS 標準(參考),目前(2024)看來,舊方法還是有適用的地方。

註 2:能調整的前提是每個元素的高度已知。

以 CSS 為主的解法,看中的是單純性和效能,避免頻繁計算每個元素的實際尺寸,而缺點如下:

  • 排序問題,因為以多個 column「直行」為容器,所以元素其實是由上排到下,而不是由左到右。
    這點在 react-masonry-css 是用 JS 硬把元素分配給各個 column 解決。
  • 高度不均。因為根本沒有考慮元素的高度,當然避免不了有的 column 特別長或短的問題。
    具體可以看 issue #73 中的附圖:very different columns height - paulcollett/react-masonry-css

針對高度不均,造成底部有很大落差不齊的情況,折衷辦法是預先給予每個元素「高度」的參考,類似給每個 <img> 賦予已知的 height 值;然後再用 JS 計算累積高度,最後搬動特別突出的元素,直到無法再用搬動方式改善為止。

實作也很單純,主要價值還是知道多做這一小步,就能得到不少改善。

程式碼參考我的 fork: bootleq/react-masonry-css at forker,具體在 balanceColumnsmoveOddItem 兩個函數:
react-masonry-css/src/react-masonry-css.js at 4866d3596#L72

從來沒貢獻過 Firefox 本體,很久以前嘗試,光是 build 環境要裝 Visual C++ 等開發工具,太麻煩就放棄了。

現在我的環境有 WSL,又見 mozilla 文件已經寫得很詳細,就再來洗頭看看。
文件:Firefox Contributors’ Quick Reference

記錄在 Bug 1905331,功能很小,就是「尋找列」(Findbar) 找不到東西時會有一個 beep 音效,但 PDF 檢視時少了這個聲音,就把它加上去而已:

1905331 - Findbar in PDF viewer doesn't play "not found" sound

這個 bug 也是弄了 3 個月才結案,merge 後再跑 2 個月,11/26 才跟著 Firefox 133 正式上線。

安裝到能 build 起來已經不容易

官方說明(Firefox Source Docs)其實很不錯,更快的方式應該是找 mentor 或在 chat 問路,但我還是先自己試試。
文件:Getting Set Up To Work On The Firefox Codebase

Windows 下會教你用 MozillaBuild 安裝,會建立專用的 shell 設好獨立環境,缺點是會跟本來慣用的 shell 切開,有些東西像 git 也是另外裝一套,但確保跑得起來是第一優先啦,不做抵抗。

具體就是以下指令跑成功,該裝的就裝完了:
python3 bootstrap.py --vcs=git

但初期我還遇到 build script / 原始碼有些檔案沒處理好 python open 編碼的問題,也是追了一下。

然後 git pull 之後就能建自己的 Firefox 了:

./mach build ./mach run

在 WSL 跑 hg-git 慢到不行

WSL 遇過在 Windows 目錄跑執行檔會突然變超慢的問題(參考,把執行檔搬到 WSL 目錄竟然就沒事了),用前面裝的環境就剛好迎面撞上。

另 Firefox 原始碼還是用 Mercurial 做版本控制,如果要用 git 就要裝 hg-git 來中介,加上原始碼規模不小,結果一些 git 指令都要等非常久,久到中間一定要做別的事才行。

好用的 SearchFox

Mozilla 的程式碼搜尋,還支援 blame,重點是真的快。
https://searchfox.org/

哪那麼多 Findbar 呀

2008 年寫過 Firefox 3.0 的擴充套件,當時也改過 Findbar,記得 XUL 原始碼只有 gBrowser 裡面有 findbar,很輕鬆就能變造它的外觀和行為。

現在就不一樣了,tabbrowser(全域的 gBrowser)裡面有從某處初始化 findbar 的邏輯,widgets/browser-custom-element 裡面有視情況建立 FinderParent (remoteBrowser 時) 或一般 Finder (non-remote) 的分歧, 然後 PDF 的 viewer 模組裡又有自己的 findbar,這東西還有部分是從 pdfjs repo 不定期複製過來的,……各種各種。

這邊 trace code 和認識多年來的架構變更、引進概念(例如 fission 是什麼、modalHighlight 是什麼)也是個門檻。 還好 findbar 是相對冷門的功能,本身變動沒有很多。

Phabricator 協作平台

類似工具我之前主要是用 GitLab,還是第一次知道 Phabricator(音同 fabricator),配合 moz-phab 這個指令用起來很方便。

除了 Phabricator 本身有很多協作功能外,在 commit message 和遠端 branch 管理方面也可以省很多心力, 因為新的 branch 在用 moz-phab push 時就會自動生成對應的 Differential 頁面(跟本來的 branch name 已經無關),並把訊息塞到 commit message, 之後如果 review 來回要做 force push 也沒關係,只要在 commit message 保留 Differential Revision: .../D215196 這段文字,所有記錄就會回到同一頁,reviewer 也能看到你硬改了哪些東西。

Random fail 的測試

推上 Phabricator 的東西並不會跑所有測試,我這次接觸到的 CI 主要在程式要 land(類似所謂 merge 進主線)的時候,會由有權限的人 Pushing to Try,我才上去看測試死在哪,例如這具屍體

之前工作時很頭痛的 random fail 問題,或稱 intermittent test / flaky test,就是平常跑都會過,偏偏就偶爾會死掉卡住 CI,這種要找出死因可能很花時間,於是常常不了了之。

這邊見識到 Firefox 的作法是有一個小組會去抓出案例,研究後登記起來,也提供查詢: Sheriffed intermittent failures

然後跑測試時有一個 verify flag,對特定測試重複跑很多次,判斷是 intermittent 還是真的錯誤。

用 chat 求助

其實這個 bug 真正實作和討論的時間並不長,中間拖比較久是 reviewer 擺著,最後在 chat 求助才有人幫 land。

Extension API 的 Find API

原來跟瀏覽器的 findbar 根本沒關係呀!

之前一直想動 Findbar,很想從這裡下手,仔細研究才看懂走不通。

聲明:現實中不認識,僅客觀收集資料,請留意片面之詞

陽明山大魔王級餵養人鄭秀琴,2005 年搬到竹子湖路,隔年開始救助流浪狗,自費送醫、植晶片。 十年後多達百隻狗,包括藏獒、黃金獵犬、古代牧羊犬、德國狼犬等純種犬。

小屋周邊種植草木,路旁廢棄物整成花圃,大門掛「羊明山」名牌,門號 112。

具體位置是 108 公車鞍部站,小觀音山登山路線入口鐵柵門旁街景

因狗群遊蕩,陽管處長期受民眾投訴,2009 開始透過各種法律輔導,但都沒用,終於在 2017 年底以「竊占國土」等理由,聯同動保處、保七大批警力,強制拆除地上物。

拆除後,阿罵在山上無家,但不肯離開,睡帳篷、報廢巴士等,堆物資繼續養狗(仍有數十隻狗沒被帶走)。

算到今年(2024)已餵狗 19 年、駐紮 7 年,阿罵已 95 歲。


目錄

  1. 阿罵的特色
  2. 阿罵時間線
  3. 選摘(我沒貼圖,這裡收一些照片連結提供畫面)
  4. 動保野保波瀾

阿罵的特色

  • 國文能力很好,有學識
  • 高尊嚴,不乞討,說又沒人拿槍逼她養狗;拆除事件鬧大時,請大家不要發露宿照片
  • 語氣惡毒,有時很好笑
  • 對抗公權力
  • 光明正大,什麼動向都丟上網,無辜路人常被蒐證公開
  • 民眾、動保蟑螂、愛心人士都在那邊棄養,阿罵不會全收(但還是會餵食)。有主動救援、抓紮、送養
  • 很固執,某程度會偏離現實,本篇內容也別盡信

阿罵時間線

1999
隻身搬進鞍部氣象站附近,兒女認養雪納瑞、米格魯跟阿罵作伴(69 歲)。
註:依臉書揭露年齡是 58 歲,但據報導、部分貼文自述及狀函等,可推論 +11 才是真實年紀。
2005-05-28
搬進北投區竹子湖路 112 號(75 歲)。
2006
開始救助棄養、受傷的流浪狗,自費送醫,並植晶片。
2009
陽管處開始以「竊占國土」等各種辦法對付阿罵。
2009-06-19
阿罵部落格《我的地盤---羊明山》第一篇文章〈大屯山與遊客〉。

Profile「我是養大型流浪犬的人」,至 2012 元旦最後一篇〈羊明山是快樂幸福家族〉停更。
內容多為記錄生活,也有違建糾紛的記錄,例如 〈羊明山狗窩是違建一〉。

前後應該也有用無名小站《yms112的網路日誌》,但已失連(web archive),有些內容和留言應該就遺失了,例如這篇〈無國法陽明山管理處-1〉可窺見網友討論。

其他足跡。

2009-12-26
公務背景人士找人挖掘土石,挖到阿罵家牆角,阿罵向警察隊報案,稱被吃案。之後陸續發生各種糾紛,阿罵角度覺得被針對、被整。

阿罵的主張:112 號的車庫被偽造文書改成 112 之 1 領取百萬補償金,挖土一層樓深(土質好,價值高)回填廢棄物,還告 112 違反水土保持法,判 4 個月罰款 12 萬,也已繳錢。

2011-06-01
正式購得建物,每年也有繳交「不當得利」。
2011-12-25
臉書第一篇貼文,帳號是 Yms Cheng(鄭羊明山)yms.cheng
另有兩個帳號 Cheng Yms(鄭羊明山)cheng.yms.9 和 Cheng Yms cheng.yms,還有一個本名帳號(後述)。
2015-11-22
媒體專訪《用心生活》86 歲鄭秀琴山中奇緣 獨養百個毛小孩(自由時報電子報)、
《用心生活》採訪側記 鄭秀琴人生晚期 學上臉書記錄狗兒子
註:阿罵勘誤,文中野薑花是芋頭花才對,且被剷地前,數年都開 12 朵。
2017-01-21
鄭秀琴」臉書第一篇貼文。 (此帳號於 2024 年底無法使用,換了新帳號
2017-02-28
(阿罵視角)赤慶法王帶來大批動保蟑螂和流浪記者,說十幾個狗場能續養,房子和狗都歸他處理。
「我說如果簽名那我今晚就會死了」
Cheng Yms - 2017,2,28日,刺慶喇嘛... | Facebook
註:阿罵和法王原本就見過面,稱 2008 就叫法王小鄭
2017-12-25
(88 歲)
強制「拆屋還地」剷平阿罵住的房屋,狗則吹箭捕捉,發包民間協會代養 3 個月。
拆除費用 43 萬、收容費用 281 萬,將跟阿罵追討。

屋內財產可能也有損失,兩年後阿罵仍表示千萬名畫、古董至今未還。

拆除後阿罵露宿了很多天,後來找到住廢棄巴士的方法,但也屢屢被處理掉。

拆除時引起廣泛關心,有人上山支援,搜尋相關日期可找到記錄,略摘:

得標廠商「台灣流浪動物希望協會」相關:


公家機關的說明:

2020-05-19
陽管處、動保處、保七再度聯合,強制移除財產,查封住宿巴士,收容犬隻。

Yms Cheng - 被陽明山國家公園管理處張順發,... | Facebook

阿罵控訴這次搶得很徹底,從巴士拖人出來、警力壓制不給拍照(以保護為由)、只給她從隙縫拍照、讓她淋雨等。
鄭秀琴 - 交通部人員說,這中巴... | Facebook

之後大概就是持續鬥法,陸續也還有大批人馬圍剿,移除小巴、捕犬等。
2020-09-09 中巴被拖吊;不能放牠,放牠就是違法囉
2020-11-12 稱有被推撞受傷、讓人狗淋雨 6、7 小時


很長一段時間,阿罵都在鐵柵門旁,搭建簡陋住所,帆布蓋著,堆放飲水飼料,就和狗在一起。

那邊正好是小觀音山登山路線出入口,登山社群經常有人發照片批評,甚至陽管處還另外規劃替代路線,位置在鞍部停車場旁邊草叢的小洞。

申請爬小觀音山的山友,經過時也會被阿罵錄影,威嚇管制區不得闖入(確實是生態保護區),經常上傳不收登山杖的「畜生」「人渣渣」畫面。

陽管處一名配合人員經常上阿罵鏡頭,被稱為「黃鼠狼」,誘捕犬隻被稱為「偷狗」,一年捕「幾十隻」。

2024-05-01
違反水土保持法遭判 6 個月。

2020 調查阿罵於拆除後「再度」占用,判決成立,可易科罰金每日 1,000 元。
老婦濫墾陽明山國有地蓋狗場 違水土保持法遭判6月 | 社會 | 中央社 CNA
法院「參酌鄭婦智識程度為國小肄業,且仰賴老人年金維生」。

2024-06-08
六月初又有一波強力移除,月底已經整圈用圍籬阻擋,架監視器,很難再堆東西,也警告他人不要再協助。

國家公園公告: 陽管處呼籲民眾勿協助他人占用國有土地及餵食國家公園內犬隻

2024-08-02 陽管處臉書說明
陽明山國家公園 - 【有關鞍部氣象站附近犬隻處理情形】... | Facebook
7/15、7/17、7/23、8/15、8/29 多次誘捕,持續針對阿罵棄養(未於期限領回)、未鍊繩、肆意餵食遊蕩動物等行為開罰。

鄭秀琴 - 跳蚤,小鬼,小虎,苛雞 不知又帶去那裡丟棄? | Facebook

小觀音山生態保護區戰備道入口處美化圍籬。

2024-10 圍籬噴漆「112 号」的景象,照片
(阿罵跟黃鼠狼對話中有承認是自己噴的)

現在(這篇發文時)
阿罵臉書 10/19 變成無法查看的狀態,也可能不設公開了,不確定。

10/22:原來是帳號被 FB 偵測遭盜用而先鎖定,已恢復

2024-12-21
阿罵臉書應該是弄丟了,無法查看,又開了新帳號:「鄭秀琴」。
2025-03
應該已下山。
4/22 在臉書偶然看到有人說,當天上山,阿罵已經沒有住在上面;他三月上山時,就沒看到了。
之後也陸續有不再看見的回報。
(註:但 Google Map 3 月的街景照片仍能看見阿罵坐在鐵門前)
我於 6/28(六)前往登山,確實已沒有居住跡象,也沒有狗;但路邊有三落飼料灑在地上,仍有人餵食。
2025-06-05
違反水土保持法上訴二審,駁回。
2025-07-02
應可確認已離開。
陽管處《113-114陽明山遊蕩犬族群動態調查期末報告書20250702》中提及,單趟調查最高記錄 24 個體「大多數為鞍部 C 姓女士之放養犬,C 姓女士已於 2025 年離開,因此遊蕩犬數量於近 3 期迅速下降」。
2026-02-09
離世。
水土保持法相關判決書,公訴不受理。

選摘


動保野保波瀾

  • 2020-12-10 哇!是阿嬤養的豬?侵佔陽明山國有地的餵養爭議 - 窩窩|專注為動物發聲的獨立媒體
  • 談到餵養爭議,經常提及陽明山上有一個餵養人,十幾二十人每天堵他,用盡各種方法,掌握時間勸導,完全沒用,即使具有保七權力也沒用,以此作為「禁餵」無法執行的理據。
    例:20221228 犬隻族群管理公共政策討論協作會議中,北市動保處救援隊長提及 (2:49:00) 一個陽明山餵養人(不一定指阿罵),農委會技正也補充強調 (2:54:27) 陽明山執行單位是保七。