2019年8月19日 星期一

網頁表格轉 csv, 瀏覽器 inspector 手動剪貼版

玩資料視覺化, 經常需要從網頁上下載表格, 再轉成 csv。 以前就曾搜尋到 sebsauvage.net 上面的 html2csv.py, 後來忘記了; 最近又重新發現一次。 很簡單: python2 html2csv.py abc.html 它會把 abc.html 裡面的所有表格串在一起, 產生一個 abc.csv 。 如果有合併列或合併欄等等比較複雜的狀況, 還是需要後續處理, 但至少比自己寫 regexp 簡單多了。 全文完。

下載 html 檔 喂~ 這樣就結束? 這篇未免太 ㄌㄢˋ ㄩˊ ㄔㄨㄥ ㄕㄨˋ 了吧! [現在有同音異字的成語太多了, 我都不知道國字該怎麼寫才對...] 至少應該要交代一下如何取得 html 啊。 如果是大量的靜態網頁, 可以用 wget 或 lynx -dump 或 curl 取得。 有可能需要 設定 user agent 才不會被網站拒絕。 如果是 javascript 所動態產生的、 上述指令無法取得的網頁呢? 如果頁面數量很多, 那就考慮用 puppeteer。 如果只是單一或少數的 [js 動態產生的] 頁面, 那就手動另存新檔就好。 可是有一些 js 頁面需要你點幾個地方之後, 才會動態填值進表格。 這時 firefox 的 console 就很好用了 -- 即使不是 js 程式設計師也值得學一下。

2019年8月7日 星期三

尺規作圖遊樂場 Dr. Geo

過圓外一點 C 做切線 CE 跟 CF 還記得小時候學的 (沒有刻度的) 直尺與圓規作圖嗎? 光用這兩個工具, 就可以畫出相似三角形、 三角形的外接圓/內切圓等等圖形。 這是很燒腦又很好玩的益智遊戲。 用電腦畫更好玩, 因為繪圖完成後, 你可以用滑鼠抓著原圖的頂點或圓心, 改變原圖 (例如三角形) 的大小/形狀/位置的同時, 看著衍生圖 (例如外接圓或內切圓) 跟著變動, 超有成就感! 十幾年前我寫過 DrGeo: 物理老師也會心動的幾何教學玩具。 後來 Dr. Geo 大改版; 幾個月前得知: 新版的 Dr. Geo 不僅支援中文顯示, 也支援中文輸入, 今天終於要來重寫一篇新版的介紹文了。

2019年8月3日 星期六

簡單語音指令辨識

完整的自然語言語音辨識很複雜; 但在很多應用場合中, 如果可以讓用戶以十來個簡單語音指令控制電器/電腦/apps, 就已經很方便了, 而想要訓練這樣的類神經網路, 門檻當然比完整的語音辨識低很多。 Simple Audio Recognition (以下簡稱 SAR 一文) 所介紹的 tensorflow 原始碼當中的 speech_commands 範例, 就是這樣的工具。 餵一段一秒鐘的聲音, 它會判斷這是 "yes", "no", "up"、 "down"、 "left"、 "right"、 "on"、 "off"、 "stop"、 "go" 當中的哪一個語音命令, 或是未知的聲音 (UNKNOWN) 或是無聲 (SILENCE) (其實可能是很小聲的背景噪音)。 假設讀者已經先照著 貴哥的 colab 初學筆記 認識了 colab 的基本操作, 今天這篇文章將接續著帶大家用 colab 把 speech_commands 的操作流程幾乎走一遍。

2019年7月13日 星期六

貴哥的 colab 初學筆記

Google colaboratory 提供短暫 (數小時) 的免費雲端 GPU 算力, 真是深度學習初學者的福音啊! 前提是你要有 google drive 的帳號, 並且略會操作 Jupyter Notebook。 網路上已有很多入門教學文; 貴哥一看到有 shell 可用, 忍不住就好奇多探索一些, 於是也寫一篇自己的初學筆記。 基於 「站在巨人肩膀上」 的原則, 比較多人介紹的基本操作就只簡單帶過, 細節可參考 台大機械所 Wei-Hsiang Wang 的 Colab 基本操作筆記 (中文) 及 fuat 的 Google Colab Free GPU Tutorial (英文)

2019年7月9日 星期二

「Docker pull 卡住不動」 的實驗計畫

不太確定為什麼, 偶爾會遇到 docker pull 抓映像檔抓到一半突然卡住不動。 很多人都遇過相同的問題, 而且很多年了都沒有解決, 到現在 Bounty Source 還在懸賞。 我在電腦教室特別常遇到這個問題; 可惜上課期間來不及研究。 這篇的目的是希望下次再遇到時, 可以做一些實驗, 確認一下到底是伺服器那頭的問題, 還是我們這頭的問題。 如果夠多人測試不同的排列組合, 並且到上述 issue 回報自己的排列組合, 說不定對開發者除錯會有一些幫助。

以下提到設定檔的地方, 都以 lubuntu 18.04 bionic beaver 為準。

2019年6月27日 星期四

文字檔控用 SQL 語法肉博 csv

我是奉行 unix 哲學 的文字檔控。 用 grep 從 csv 檔撈資料的時候突然想到: 可不可以改用 SQL 指令來查詢 csv 檔呢? 果然搜尋到 qtextql 兩個專案。 而且後者直接用 apt install textql 安裝就可以用。 這工具除了讓 SQL 老手可以很方便地檢索 .csv 檔之外, 也很適合拿來當作 SQL 語法入門, 讓初學者可以 (省略無聊而繁瑣的建立資料庫步驟) 在十分鐘之內單刀直入從 (比較有趣的) SELECT 指令開始學起。

2019年6月5日 星期三

avfs: 不必解開, 直接把壓縮檔當成目錄大搖大擺走進去

我每年會備份一次個人檔案。 硬碟上有歷年的 .tgz 備份檔。 有時需要把舊文件挖出來看。 問題是: 不記得我要的檔案在哪一年份的備份裡。 於是逐年 [解壓縮、 搜尋、 刪掉] 直到找到為止, 有點麻煩。 今天終於發現一招好用的方案: 採用 AVFS。

2019年5月12日 星期日

用 certbot 幫同網域下眾網站創建共用的 ssl 憑證

從去年起, chrome 已經開始把 http (沒有 s) 的網站標示為不安全了。 現代的站長一定要學會 用 let's encryp 把 http 網站升級成 https 網站 (中文)。 但是如果你 (1) 擁有同網域底下一整個艦隊很多個網站, 但是 (2) 懶得逐一申請, 而且 (3) 委託代管 DNS 或自管 DNS, 那麼就可以直接拿同一個憑證給同網域的所有網站共用。 例如我擁有 frdm.info, 委託 pchome 代管 DNS, 而且想要讓 abcdef.frdm.info 跟 uvwxyz.frdm.info 及其他子網域都共用同一組 ssl 憑證。 以下就是我的筆記。 也可以參考 Sam Tang 的中文文章 Saurabh Palande 的英文文章

2019年4月22日 星期一

已經是邊緣人不能再遺失手機通訊錄了啊!

先前手機摔壞了, 螢幕碎到不能看, 還好 adb 連線 還可以用。 於是用 scrcpy 從電腦操作搶救資料。 其中一個任務是要把通訊錄倒出來。 結果發現不知為何連 「通訊錄」 app 的匯出功能也壞掉了。 查看一下舊的匯出檔, 發現上次備份是三年前 orz。 可是電話跟簡訊 apps 明明都還看得見通訊錄, 顯然資料還在。 搜尋到 這個問答, 得知檔案放在 /data/data/com.android.providers.contacts/databases/contacts2.db 。 不過 /data/data 這個目錄需要 root 權限才可以進入。 把它 copy 到 /sdcard 底下, 再用 adb 或 primitive ftpd 把它傳到電腦上。 這是一個 sqlite 格式的檔案。 在 lubuntu 底下, 需要安裝 sqlite3 套件才能處理。 再下載 sqlite 轉 vcf 的 shell script, 最後終於成功地把通訊錄救出來。 還好我早已 幫手機取得 root 權限, 不然通訊錄就這樣毀了, 我會不會變得跟冥王星一樣邊緣啊~~ (抖)

2019年4月7日 星期日

自己的行事曆和通訊錄自己管: nextcloud 安裝、 行事曆、 備份及手機連線

Nextcloud 是 owncloud 的 fork。 它讓你自架私有雲取代 dropbox、 google drive、 google calendar、 google 通訊錄等等服務。 我自己的雲端檔案沒有用任何軟體管理, 就直接用 scp 存取。 對我而言, nextcloud 最重要的是拿來取代 google calendar (還有通訊錄; 不過目前還沒用)。

2019年3月31日 星期日

ubuntu 18.04 之 mysql 忘記 root 密碼

今天在家裡的 lubuntu 18.04 電腦上想要把冷凍很久的 mysql 拿出來用, 但因為事業做太大、 serves 養太多了, 突然發現完全想不起來這個不重要的 mysql 帳號的 root 用戶密碼。 沒關係, 記得搜尋得到解法。 找到一篇 2012 年的文章 , 但是在執行 mysqld_safe --skip-grant-tables & 的時候, 卻看到這樣的訊息: mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 然後 mysqld_safe 馬上結束, 我也就無法繼續往下做。

2019年2月16日 星期六

網頁爬蟲終極武器: puppeteer

無頭瀏覽器

下載靜態網頁可以用 wget 或 curl。 那如果是 javascript 動態產生/填寫的頁面呢? 如果只需要網頁快照截圖, 可以用 cutycapt; 如果需要取得 javascript 所產生的文字內容, 那就用 puppeteer。 (字的原意: 操偶師) 它會呼叫 chrome 幫它執行頁面的 javascript, 但不會真的在桌面上打開 chrome 視窗。 在這種模式下運作的瀏覽器, 稱為 headless browser。 今天我們要用 puppeteer 及 headless chrome 來製作網頁爬蟲。