2019/11/15

一行指令修改整個目錄內文字檔的字串

最近下載了一個 open source 的 Android app 來改。基於某些考量,必須修改 application id。因此,source code 當中有很多 package、import 等敘述都要修改,算算竟有將近一百個檔案。

作這樣修改其實不難,只要一道指令:
grep -rl OLD_APPID | xargs sed -i 's/OLD_APPID/NEW_APPID/g'

2019/01/07

Python 的 kbhit() 和 getch()

開發靠鍵盤控制的程式時,通常會需要以下兩個功能:
  • kbhit() 偵測是否有按鍵
  • getch() 讀取按鍵
因為要跨平台,所以決定用 Python 來開發,這時才發現上述兩個功能並沒有很標準的解法。再加上除了一般按鍵,還要支援功能鍵、方向鍵等特殊按鍵,讓這件事更加麻煩。折騰很久才找到既簡單又漂亮的解法,getkey。

getkey 直接用 pip 安裝即可:
pip install getkey
使用範例如下:
#!/usr/bin/env python3

from getkey import getkey, keys

while True:
    k = getkey(blocking=False)
    if len(k) > 0:
        if len(k) == 1:
            if keys.name(k) == "ESC":
                break
            print(k)
        else:
            print(keys.name(k))
簡單說明如下:
  • blocking=False 代表不管有沒有按鍵 getkey() 都會馬上返回,從返回值就可以判斷是否有按鍵
  • 若是一般按鍵,如 '0'~'9'、'A'~'Z' 等,返回值長度是 1,可以直接拿來用
  • 若是功能鍵、方向鍵等,返回值長度大於 1,建議用 keys.name() 來翻譯
這個解法的好處在於將平台的差異完全隱藏,可以支援 Windows、Unix/Linux、MacOS,甚至 Cygwin 等等,也可以正確解出功能鍵和方向鍵等。

有缺點嗎?有。原作者似乎不再更新和修正,在 Windows 上的 Python 3.x 安裝和使用會有一些問題,請參考原作者原專案的待解問題清單:
https://github.com/kcsaff/getkey/issues
所幸,有善心人士提供 修正版,但須下載原始碼來安裝:
git clone https://github.com/li-rupert/getkey.git
不會 git 的人,可以下載以下檔案解開:
https://github.com/li-rupert/getkey/archive/master.zip
安裝指令如下:
python setup.py install

2016/06/07

救回 Samsung Galaxy Tab 2 7.0 P3100

朋友家裡一台 Samsung Galaxy Tab 2 7.0 (型號 GT-P3100) 給國小的小朋友玩。小朋友不知從哪裡學到連結一些來路不明的網站下載了很多 app 來玩。後來一開機就出現一堆錯誤,然後記憶體被佔光,機器幾乎無法操作。

恢復出廠設定沒用;按 Volume Up + Power 進入復原模式清掉 user data 也沒用。很明顯的是已經中毒頗深,整部機器已被不肖軟件進駐控制了。看來得把整個 ROM 重新刷乾淨才行。以下記錄搶救的過程,給自己或有興趣的網友參考。

因為是給一般使用者,我決定刷回官方的版本。但現在官方網站已經找不到這麼舊的機型的資料了。禮失,求諸野。收集這些舊資料也是一門生意,google 一下就找到不少。只是內容可不可靠,會不會有木馬,實在很難判斷。根據自己的直覺,我選擇了以下這個版本:
想免費下載完畢約需四小時,要有耐心。下載完畢,請解開到一特定目錄。

刷機還需要另一隻 Windows 的程式,Odin。下載這類程式又是需要懷疑是否為不良軟件 (malware) 的時候了。再度根據自己的直覺 (有沒有可靠的人用過),我選擇了以下的版本:
刷機動作很簡單,主要參考以下網址:
注意! 上述網頁建議用管理員的身份執行 Odin3 比較不會遇到麻煩,但我覺得這樣風險比較大。我在 Windows 10 用一般身份就可以成功刷回官方版本了。

目前還沒有發現任何異常,包含 Odin3。


2015/04/24

縮小影像檔的大小

用 avconv 來縮小影像檔的大小:
avconv -i INPUT.mp4 -s 640x360 OUTPUT.mp4
若影片的聲音是 acc 編碼,上述指令可能會警告你程式的 acc 編碼器還在驗證階段,要求你多加一個參數 ("-strict experimental") 確定你要用這個實驗品:
avconv -i INPUT.mp4 -s 640x360 -strict experimental OUTPUT.mp4
若影片太長,你只要前 N 秒,可以加上參數 "-t N"。若只要影像,不要聲音,請參考 去除影片檔聲音的方法

2015/04/13

以分頁視窗來操作 Cygwin

一直以來,非常困擾 Cygwin 無法讓我像在 Ubuntu 上一樣,開啟多個分頁 (tab) 來切換不同的工作。終於找到一個完美的解法:ConEmu

ConEmu 的主要功能是讓你能在 Windows 上以分頁的方式開啟多個 cmd 或 powershell 視窗。當然,用來開啟 Cygwin 分頁也沒問題。有人說,先安裝 Cygwin 再安裝 ConEmu,就能讓 ConEmu 自己抓到 Cygwin。我沒試出此功能,但自己加也很簡單,方法如下:
  1. 開啟 ConEmu 的設定畫面 (點右上角三條線圖示)
  2. Settings > Startup > Tasks
  3. 點在 Predefined tasks 底下的 "+"
  4. 如下圖所示,自訂定義命令字串: 
    %SystemDrive%\cygwin64\bin\mintty.exe -


這樣可能還會有一個小困擾,就是中文有亂碼的情況。解決方法是在 mitty 執行時按滑鼠右鍵開啟設定視窗,再將 Text 底下的 Local/Character set 設成 zh_TW/Big5 即可 (記得 Apply 後 Save)。

後記: 發現用 mintty  有一個缺點,就是不能利用 ConEmu 搜尋 console 的功能。解法是直接用 Cygwin 的 bash:
C:\cygwin64\bin\bash.exe --login -i -new_console:C:"C:\cygwin64\Cygwin.ico"
-new_console 及之後的那一串是用來設定 icon 的,照抄即可。

2015/03/28

重建不小心刪除的 Ubuntu /dev 目錄

若你跟我一樣不小心做了刪除  /dev 目錄的蠢事,以下是我嘗試重建的記錄。僅供參考,請自行應變。

簡單說,執行以下命令就可大部分重建回來:
cd /dev; sudo /sbin/MAKEDEV generic
若你想先確認這個指令做了哪些動作,可以加 "-n -v" 參數做一次 dry run (也就是沒有實際產生作用的演練,只看看輸出訊息)。

實際情況是,你不見得可以執行上述命令。譬如說,還沒關機就發現此狀況,但 terminal 已經開不起來;或關機了,可能就再也無法開機等等。這些狀況的應變太瑣碎,就不多談了。

2014/05/14

Ubuntu 與 Wake on LAN

Wake on LAN (WOL) 就是透過網路指定某一台 PC 開機。

被叫者的設定

需要被叫醒的 PC 必須完成以下設定:
  • BIOS 需啟動相關叫醒功能,譬如 Asus P5K 主機板的設定項目是:
    • Power > APM Configuration
      • Power on By PCI Devices [Enable]
      • Power on By PCIE Devices [Enable]
  • 然後網路卡 (NIC) 必須啟動 WOL 功能:
    • 在 Windows 底下,直接去查網路卡有沒有相關設定
    • 在 Ubuntu 底下,可用 ethtool 查詢和改變網路卡的設定
      • sudo ethtool eth0 來查看網路卡有哪些功能
        • "Supports Wake-on:"g 就是支援 WOL
        • 有沒有啟動 WOL 就看 "Wake-on:" 有沒有 g
      • sudo ethtool -s eth0 wol g 來啟動 WOL
      • sudo ethtool -P eth0 查出網路卡位址 (ether address 或 mac address),等一下會用到
  • 最後一點,就是要讓 PC 處於可被叫醒的狀態。譬如,我的 Asus P5K 先斷電再復電後是叫不醒的。一定要先做一次:手動按開機鍵,不用開完機,幾秒之後再按一次開機鍵關機,感覺好像是讓 BIOS 有機會將機器設成待命狀態。最簡單的檢查方法就是檢查網路埠的 link 燈號。可被 WOL 叫醒的機器,關機時 link 燈必須是亮著的,這樣才可以收到 WOL 封包。

叫人者的設定

執行叫醒任務的 PC 一般比較沒有限制,只要有合適的工具即可。以下只介紹 Ubuntu 的部份。請先安裝 wakeonlan 套件,然後執行以下命令即可:
wakeonlan 00:11:22:33:44:55 #這裡請改成被叫者的網路卡位址
沒有成功?請查被叫者的電源線是否接好且有電,以及網路線是否有 link 燈號且跟叫人者有連接起來。若以上都確認沒問題,也許查查叫人者 PC 是否有兩張網路卡。wakeonlan 似乎不能控制由哪張網路卡送出 WOL magic packet,以下方法可解決這個問題:
  • 方法一是指定哪個 subnet 的 broadcast:
    wakeonlan -i 192.168.0.255 00:11:22:33:44:55
  • 方法二是設定 static arp entry:
    sudo arp -i eth1 -s 192.168.0.1 00:11:22:33:44:55
    wakeonlan -i 192.168.0.1 00:11:22:33:44:55
還是沒有成功?我建議查網路相關連結,可以的話先試試將被叫者和叫人者直接連結起來。

參考資料