2021-12-31

取得網路串流的URL

為什麼要取得網路串流的URL?因為眾多網站的串流都是要操作滑鼠去點按才能聽,
這樣就不能用自動化的程式去選播收聽,所以要想辦法把它的連結找出來。

以下是用firefox來說明,其它的browser應該有類似的用法。

先以祖國古典音樂電台網站為例:
https://www.classic.nl/livestreams

找到它的播放按鈕,就是一個很一般的三角型讓你Play的,按右鍵,選Inspect

找第一橫列的 Network
找第二橫列右邊的 Media
看Indicator裡有沒有 media 按下去
看File這一欄連結的字串,按老鼠右鍵Copy URL(或Copy cURL,或Open in New Tab)
會得到以下這一串資料

https://22543.live.streamtheworld.com/CLASSICFMAAC.aac?tdsdk=js-2.9&pname=TDSdk&pversion=2.9&banners=none&sbmid=c01352ab-737f-4992-9291-8544a0764fa1

而我們要的就是 https://22543.live.streamtheworld.com/CLASSICFMAAC.aac

再以我國的教育廣播電台為例:
https://www.ner.gov.tw/
找「收聽頻道」點下去找到第一個「臺北總臺FM臺」的三角型,一樣用上面列的方法,
在File這一欄看到一個數字"1",Copy URL得到
https://cast.ner.gov.tw/1

這樣就可以用任何自動化程式(bash/python)來把串流的URL交給播放程式收聽了。

2021-11-28

crontab定時播放音樂

最近做了一個Internet Radio, 收集了一百多個有興趣的網路電台,然後想用定時
機制來播放,當然"sleep"是一個立即可用的工具,但是要去算「睡幾分鐘」就不方便
,這時想到Linux環境下的crontab是個好用的工具,可以自由設定月、日、星期、日
、分來做一些原本要手工啟動的工作。

它的基本語法就是「分 時 日 月 星 程式(參數)」

但是遇到的問題是,設定好「程式+參數」之後,時間到了確實有進行動作,但是我要的
是播放音樂叫我起床卻沒有聲音!

為了證實程式有做動作,設了一個參考檔,只有程式有動起來,就會產生參考檔。

然而在時間到的時候,參考檔有產出,喇叭卻沒發出聲音!?
一開始以為是tty的問題,試來試去也是沒聲音,最後終於找到原因,就是環境參數
XDG_RUNTIME_DIR的問題。

這個參數雖然以 X開頭,但實際上跟Xorg無關,在純console mode也需要設定它。

因此把執行程式改成獨立的script,然後在script裡面設定環境參數,如下:

export XDG_RUNTIME_DIR="/run/user/NNNN"
/PATH/music_player URL
這裡的 /run/user/NNNN 要看你電腦裡的實際字串,它可能是1000或999
這樣就能借由crontab來定時播放音樂了。

2021-10-31

fluxbox+scrot 好用的截圖方式

fluxbox是一個可以自行定義包括佈景、按鍵、選單……很輕巧好用,我已經用了十幾年
的window manager,利用scrot這個截圖程式加上fluxbox的keys定義就能快速簡單
的截圖,保證比Windows截圖好用太多了。

最近MX Linux有推出一版flouxbox版。

我們可以把scrot的截圖功能,藉由fluxbox定義在任何鍵上,不過有些鍵可能要試試看
,才知道是不是跟某個軟體的內定按鍵有衝突?(例如幾乎所有軟體按F11是切換全螢幕,
如果在fluxbox裡自行定義F11的話,任何軟體按F11就不會切換全螢幕了)

可以執行xev來查某個按鍵的值,也就是說你可以把以下的截圖功能定義在別的組合鍵,
總之不會像Windows截圖要一次按三個鍵那麼難用,Windows還不會照你的意思把檔案
存到你指定的路徑,檔名也不是你可以指定的。 

以下是我習慣用PrintScreen鍵來截圖。
107:是Print Screen鍵
Mod1:是鍵盤上的Alt
Ctrl:就是鍵盤上的Ctrl(不分左或右都可以用)

在$HOME/.fluxbox/keys裡定義以下文字,就可以了

107 :Exec scrot $HOME/`date +'%m%d_%H%M%S'`.png
Mod1 107 :Exec scrot -u $HOME/`date +'%m%d_%H%M%S'`.png -e '2clip $f'
Ctrl 107 :Exec sleep 0.2s; scrot --line width=2 -s $HOME/`date +'%m%d_%H%M%S'`.png -e '2clip $f'

按PrintScreen鍵(107)就是截取整個螢幕,並且自動存檔在$HOME這一層,你也可以
指定任何一個地方。
按Ctrl+PrintScreen,螢幕上會出現一個十字,你可以用老鼠去劃定一個方塊,放掉
之後它自動存檔。
按Alt+PrintScreen,抓目前操作的應用軟體畫面,自動存檔到$HOME這一層。

這裡定義的檔名會以「月日_時分秒.png」
 

2021-09-19

孤兒Pi的救星Armbian

英國Raspberry Pi推出後大受歡迎,中國廠商也紛紛跳進去搶食這塊市場,因此出現
各種香蕉、芭樂、蓮霧……Pi, 但是在若干年後的現在一些比較早期出廠的中國品牌Pi
,廠商已經沒再推出新版OS,因此往往會有力不從心、軟體受到OS限制而無法更新
的問題,特別像是一些沒有Video out的小型Pi變成孤兒了。

 還好有一群熱心的自由軟體支持者在維護著"armbian"這套Linux OS for ARM.
https://github.com/armbian
可以到這裡找找有沒有適用你的孤兒Pi的版本?
https://www.armbian.com/download/?device_support=Supported

這裡的Download會有兩種流派Linux可以選,Ubuntu或Debian, 目前Ubuntu的版本
有Focal, 也就是20.04, 建議有興趣的人可以選這一支,它有一個好處就是LTS(Long Term 
Support), 就是一直到2025年都還會有來自Ubuntu的update可用, 因為Ubuntu在每
偶數年份會推出LTS, 為期五年。 

如果你的Pi一直健在,也可以換下一個LTS版本22.04,因為它又有另一個五年期到2027年的支援。

2021-07-17

Linux環境下的IR receiver

在Linux環要用紅外線遙控器來做一些事,找到最多都文章都是用lirc, 但是我發現
可以完全不用lirc, 只要裝了ir-keytable加上python pexpect就可以做任何事了。

對於有GPIO腳可以裝IR sensor的機器來說,例如各種pi(主要都是ARM電腦), 只要把
IR sensor三支腳的
信號腳接到GPIO
一支腳接供電
一支腳接地
就可以利用IR遙控你的電腦了。

至於沒有GPIO腳的電腦(例如一般X86電腦),最簡單的方法是買一支RTL-SDR(露天或
PCHome大約400元)它上面就有IR sensor, 而且附紅外線發射器。

至於要怎麼把接IR sensor的GPIO腳enable ?

在ARM電腦可能稍微麻煩一點,有的要在/boot/config.txt設定(如Raspberry Pi),
有的要用distribution附的工具設定(例如armbian-config).

而x86電腦只要把RTL-SDR插入就可以了,不用任何設定IR sensor.

再來就是要安裝 ir-keytable, 每個Linux distribution應該都有這個package,
用系統工具(例如apt-get, yum)就能裝好。

必需以root身份執行 ir-keytable,如果不知道發射器的協定,就用
sudo ir-keytable -c -p all -t
如果知道那個搖控器的protocol, 例如 NEC, 那就可以用
sudo ir-keytable -c -p nec -t
(我還在用網樂通的遙控器,它就是NEC protocol, 感謝黎智英先生,很多台灣人都有
黎先生贈送的網樂通,可惜香港蘋果已經在2021/6/24被中國政府強迫關門了)

然後拿著紅外線遙控器對著電腦把每個遙控鍵都按一遍,記錄一下每個鍵的值,
再來就是寫個程式讓你要的動作對應某個按鍵(或按鍵組合),這程式用
python3 + pexpect 就夠用了

import pexpect
ir = pexpect.spawn('sudo ir-keytable -c -p nec -t')

ir.timeout = None

while True:
    ir.expect("EV_SYN")
    T = ir.before.split()
    if not b'repeat' in T:
	K = str(T[-4])
	if '902' in K:	print('Mute') #0x732902
	elif '91e' in K:     print('Home')  #0x73291e
	elif '91d' in K:     print('Power') #0x73291d
        elif '940' in K:     print('Blue')  #0x732940
        elif '909' in K:     print('Up')    #0x732909
把對應按鍵的值找出來,做為你要執行的動作代碼,就能完全不必用鍵盤、螢幕來
操作一台電腦,不管是X86或是ARM。
用一台小小的什麼ARM pi,透過espeak-ng可以做為報時、報氣象、網路收音機,
不過pi本身的音效不太好,最好就是接一台USB DAC來撥放高品質的音樂。

2021-06-25

有關心靈成長的Youtube video

五月中旬,抵抗了一年多的武漢瘟疫最終還是在台灣爆開來,公司馬上改成居家上班,讓大家盡量避開傳染。

 這段期間免不了會出現擔憂恐懼與不安的心情,不過能躲在家裡上班,有比較多的時間可以尋找未知領域的東西,youtube是相當好的資訊來源。

這裡介紹幾個值得參考的,有關心靈成長,不是講些虛幻的天堂、地獄、來世、前生……那種傳統宗教空洞、畫虎爛威脅恐赫人的屁話,而是真正講到人的意識活動,像是mind, conscious, cognition, emotion等等心智活動,能幫助人面對自己。

  1.  Eckhart Tolle    談 now, present, presence, 用漢語來說感該就是「當下」,    「活在當下」是人們常說的一句口頭禪,但是整天把「活在當下」掛在嘴上的人大概一萬個人裡面找不到一個能真正能活在當下的,因為人的mind一直在想過去或是想未來,而否定當下。Eckhart先生曾經寫過一本「The power of Now」台灣有翻譯本,對「活在當下」有很好的闡釋以及實踐方法。
  2. Yongey Mingyur 談 awareness, 用漢語來說應該就是「覺查、覺知」,跟Eckhart的「當下」有很好的銜接,Yongey Mingyur談的 meditation 也有很好的實踐性,感覺他有一種類似達賴的調調。
  3. 「純正的佛法」,這位解說者沒說出名字,人相當年輕,使用簡體漢字,應該是中國人,他對傳統佛教的一些經文、教法,有很好、很正確的觀點,能突破傳統佛教徒與佛教工作者的無知盲點。可以先看一下他解說「心經」的video。

    另外日本學者Susumu Shimazono在2004用英文出的書 "From Salvation to Spirituality: Popular Religions Movements in Modern Japan", 這本書台灣有翻譯本,叫做「由救贖到靈性︰當代日本的大眾宗教運動」,島薗進,聯經出版,從這本書可以看到隨著人類歷史不斷的往自由、人權、人道、個人主義前進,傳統宗教已經越來越沒有市場,因為宗教救不了任何人,只有像毒品麻醉人的功能。

    人的自我覺醒、靈性成長才是解脫苦難之道。
    或者應該說,無可渡之人、亦無可渡之法!一切都在自我心靈之中。

2021-05-30

閱讀youtube字幕

 Youtube的影片非常多,如果每個影片都要從頭到尾看,相當花時間,當然我們可以
跳著看,但這也是花時間的事。有一個能偷時間的方法,就是「只看字幕」!

可以透過 youtube-dl 這個工具,就能下載影片或以及影片裡的字幕
https://github.com/ytdl-org/youtube-dl

基本上,字幕大都是以影片的原始語言存在的,例如日語影片會有日文字幕,然而
大部份影片會有英文字幕,所以我們可以指定要下載的字幕語文
youtube-dl --write-sub --sub-lang en https://www.youtube.com/watch?v=xxyyzz123

如果不想下載完整的影片,可以在下載完字幕(xxxx.vtt)之後按 Ctrl-C 中斷。

下載來的字幕至少會有兩種格式,都需要人工處理一下才適合閱讀

  1. 最簡單處理的是只要濾掉時間那一行,也就是以00開頭(或影片超過一小時就會有01開頭的)
  2. 比較複雜的字幕除了時間之外,內容也會重複兩次,這個要處理
    • 有這個關鍵字 :start position: 的一行不要
    • 有兩個減號 -- 的一行不要
    • 再來用python寫個小工具把重複的行刪除
 fout = open(argv[1]+'.out', 'w')
Line_old = ''
for line in f:
    if line == Line_old:
       pass
    else:
       print(line)
       Line_old = line
       fout.write(line)

f.close()
fout.close() 
當然只看字幕有時也會有些問題,例如字幕是不會分別主持人跟受訪者的對話內容,
所以不知道這段話是受訪者或主時人說的。

但是先看看字幕,覺得值得花時間看影片時,再去看吧! 

2021-04-25

辨識是否在WSL或正常Linux環境

 例用python來播放網路影音的script, 為了在標準Linux或是在WSL環境都能通用,
首先需要辨識環境,再啟用對應的播放軟體。

我們可以用 os.uname() 或 platform.uname() 來判別是在正常Linux環境或是在WSL
下的Linux環境,再呼叫指定的播放器。

在WSL環境的Linux可以直接執行Windows的播放器,例如VLC, 它在WSL裡的路徑是
/mnt/c/Program\ Files/VideoLAN/VLC/vlc.exe

platform.uname()或是os.uname() 如果是在WSL裡的linux執行會列出:
uname_result(system='Linux', node='MY_LAPTOP', release='5.4.72-microsoft-standard-WSL2', version='xxxxxx', machine='x86_64')

import csv, platform, os
from sys import argv, exit

LIST="""\
Classic Portland,http://allclassical-ice.streamguys.com/ac96kmp3
Classic NL,http://playerservices.streamtheworld.com/pls/CLASSICFM.pls
Clarinet obbo,http://213.141.131.10:8002/clarinet
Caprice cello, http://79.111.14.76:8002/cello
Chamber music,http://chambermusic.stream.publicradio.org/chambermusic.mp3
WMNF,http://stream.wmnf.org:8000/wmnf_hd3
Taiwan PBS,http://stream.pbs.gov.tw:1935/live/mp3:PBS/playlist.m3u8
ICRT,http://live.leanstream.co/ICRTFM-MP3"""

MENU = csv.reader(LIST.split('\n'))
n = 1

if len(argv) == 1:
   for x,y in MENU:
       if n%3 == 0:
          END = '\n'
       else:
          END = '\t'
       print('\033[32;1m'+str(n)+'.\033[m' +x,end=END)
       n+=1
   print('\n')
   exit(1)
else:
   for x,y in MENU:
       if argv[1].isdigit():
           if n == int(argv[1]):
               MusicLink = y
               break
           else:
               n+=1

if 'WSL' in platform.uname().release:
      PLAYER = '/mnt/c/Program\ Files/VideoLAN/VLC/vlc.exe'
else:
      PLAYER = 'mpv'

os.system('%s %s '%(PLAYER,MusicLink))

 

2021-04-05

在Linux對Raspberry Pi Pico改裝micropython

 這是在純文字的 Linux shell 裡對 Pico 進行的基礎動作。
(也可以用來對 BBC micro:bit 動作)

使用 lsusb 可以看到這個 Pico 是這樣
Bus 001 Device 017: ID 2e8a:0003 Raspberry Pi RP2 Boot
再用 cat /proc/partitions 可以看到它預設 partition 已經割出一個
   8       32     131072 sdc
   8       33     131071 sdc1
(因為我已經插了一支 USB 佔掉 sdb, 所以這裡顯示 sdc)

如果用 fdisk -l 可以看到
/dev/sdc1 1 262143 262143 128M e W95 FAT16 (LBA)

在這裡可以下載 micropython for Pico
https://micropython.org/download/rp2-pico/

rp2-pico-20210403-unstable-v1.14-132-gd87f42b0e.uf2 (目前最新的)

按住 Pico USB旁邊的 BOOTSEL 然後插上 micro USB 到你的電腦
用手動掛載 Pico:
mount /dev/sdc1 /media/sdc1
再把下載來的 micropython 的 uf2 檔直接 copy 到 Pico 的 partition 1
cp rp2-pico-20210205-unstable-v1.14-8-g1f800cac3.uf2 /media/sdc1

然後 Pico 自己會 reboot 進入 micropython mode

使用 miniterm (只要裝了 python serial 就會有的一個好用 terminal)
miniterm /dev/ttyACM0 115200 --raw  就連進 Pico 的 micropython 提示符號

2021-03-31

Raspberry Pi 也發售微控器了

 2021年Raspberry Pi推出這一款微控器:
https://tutorials-raspberrypi.com/raspberry-pi-pico-programming-with-the-affordable-microcontroller/

這個Raspberry Pi Pico, 是一個比一般 Arduino 腳位多,還有 dual cores
售價一百多元台幣的 micro controller.
注意,它不是之前所有的 RPi 那種小型ARM電腦!

板上有26支 GPIO, 因為有 dual cores, 在使用 micropython 時可以跑兩個 threads.
133MHz, 內建溫度感測sensor.
Arduino IDE有支援,所以可以藉由Arduino來開發程式。

特點之一是低耗電,所以可以撐很久。
缺點之一是沒有對外連線,不過Microcontroller本來就不負責連線的事,只要加上週邊設備就能連了。

2021-02-28

在Linux環境用真實遙控器來飛虛擬飛機

 在Linux環境的crrcsim是一個能夠連接真實遙器來練習操作的軟體,就是
把真正控制飛機的遙控器透過實體線路接到serial port或USB port就可以
操作crrcsim裡的各種飛機。

多年前一台亞拓(ALIGN)的飛機摔壞之後就沒再使用那台5 channel遙控器,
最近在Linux裡裝了crrcsim,透過serial port接到電腦之後試了一下,
可以操控crrcsim裡的飛機。

我這台電腦有內建serial port,連接與設定如下:
Options --> Control --> Input Method
選擇FMSPIC /dev/ttyS0 9600
Configure --> Custom
Aileron --> 3 Inv
Elevator --> 1
Rudder --> 0
Throttle --> 2
再進入Options --> Controls
Configure --> Calibrate
把搖桿推到最大值,校正各個操作channel
Next --> Finish --> OK
Simulation --> Restart 就可以飛了

有個問題:
日本手左邊是Elevator + Aileron 或是 Elevator + Rudder ?

2021-01-29

TDoA 定位計算的應用

Time Difference of Arrive 利用訊號到達不同點,或是相反從不同點來的訊號
來計算出單一點的位置。小到室內定位,大到地球表面的定位,都可以用 TDoA 來算出。

原理相同,但做法不同,室內定位是多個發射源對單一接收點,來算出那個單一點的
位置。地表定位,是利用多個接收點,來算出單一發射源的位置。

在業餘無線電的短波頻帶,三不五時就有脈衝電波出現,台灣從南到北都在那種脈衝
訊號的強大干擾下!

從接收機發出來的聲音,聽起來跟冷戰時代的西伯利亞啄木鳥(前蘇聯的短波雷達)不
太一樣,但是訊號強大,推斷應該就是一種短波雷達,它是利用短波可以來回在地表
與電離層之間反射,像打水漂一樣可以超越地平線,去偵測遠方的飛行物。

但不管是前蘇聯或現在收到的這個,經常在業餘短波帶發射,非常大的干擾,讓業餘
無線電玩家十分厭惡,但又無法反制,因為這種電波是國家級的發射站,出力都是以
萬瓦計算的,不是小小業餘無線電玩家能有力氣反制的。

不過我們還是可以來看看到底是哪個流氓國家在這樣搞?

有幸的是現在Internet網際網路很發達,加上SDR也發達,全世界各地都有人提供
SDR讓人無償使用,其中一種KiwiSDR的網頁就有提供TDoA的運算。

任何人都可藉由 http://rx.linkfanel.net/ 的地圖來開啟一台KiwiSDR,例
如收到那種另人厭惡的短波脈衝訊號,調好頻率(例如:7050KHz),然後在頁面
右下角的操作介面的extension拉下來到 TDoA, 這時頁面左下角會出現另一個
操作介面,這時候先不用動它,而是在頁面上半出現的地圖上,去找幾個其他的
KiwiSDR,用滑鼠按它之後會在左下角那個介面裡出現站台呼號,基本上至少找
三台,更多台是會更準確一些,但也不用選太多,先找四台來試應該夠,選好之後
,按左下角介面的左下角黃色的Submit,它就會開始錄音,等候一分鐘,它會
開始運算,可能要算一兩分鐘,然後頁面上半的地圖會顯示一些線條,以及它推測
出來的發射源經緯度。

最近幾次的干擾不論是出現在7MHz或14MHz,用這種方式算出的結果,都指向中國
內蒙,推測應該是中國在內蒙的雷達站使用短波脈衝。