顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章

2025-01-31

Deepseek R1與π小數點

 農歷新年這幾天,Deepseek成為新聞談話的主題,因為它把NVDA股價嚇了一大跳,原本只是到Youtube找找看有什麼評論資訊,其中看到包括微軟退休工程師David Plummer的看法,他提到如果Deepseek所宣稱的都是真的,那就像你在家裡就可以自製一台法拉利跑車,而且功能完全跟公司貨真品法拉利一模一樣,這當會嚇掉法拉利公司的股價。

 David又提到從它的model來看,它是從大model來training出小model,這個小model不必依賴強大的硬體就能在一般人家裡的電腦執行AI。

就像幾十年前個人電腦發展史一樣,PC出來的時候讓一般人不必購買像大公司大機構裡的大電腦,而可以擁有自己的個人電腦來執行各種軟體。但這樣的問題是,當大model裡有什麼bug,由它train出來的小model便繼承了先前的bug。

 另外也看了Jeff Geerling以及Aleksandar Haber的Youtube video,發現只要用Raspberry Pi也可以安裝小model的Deepseek在家裡玩,於是動手用一台比Pi的性能還高一些的舊Macmini(16GB RAM)裝來玩玩看。從https://www.ollama.com可以找到六個distill的版本,當然也有原本的R1(671b)。我的舊Macmini完全沒有NVidia GPU,所以不可能快,不過我想正確性應該相同。

先裝一個最低階1.5b來玩,發現它幾乎答非所問,於是再裝一個8b的,問它列出π小數點後面100位,結果它開始跟我聊天,說什麼一般人不會用到小數點後面100位,接著東扯西扯。我想這跟我的電腦沒有NVidia GPU應該無關吧?但它還是繼續東扯西扯就是不肯列出小數點後面100位,後來終於列了小數點後40位,不過我一看,從第21位數開始就是錯的!因為我記得小數點後面50位,可以百分之百確認從第21位之後就是錯的。

 我再孤狗一下「怎麼用python程式列出π小數點後面100位」,得出來的結果是只用了三行python code就能做到要列幾位數就列幾位數,但是為什麼8b model 的deepseek一直列不出來?

 另外在一篇網路文章https://www.kelacyber.com/blog/deepseek-r1-security-flaws/ 裡看到說他利用兩年前早就公開的技術,可以jailbreak Deepseek來得到想要的資料,也就是說別的AI裡早已補起來的漏洞,在Deepseek卻仍存在!而且能從Deepseek得到一些違法的知識,像是製造爆裂物等等。

 目前OpenAI也質疑Deepseek偷了他們的東西來用,這也讓人難免不想到中國各行各業過去幾十年來總是盜用、抄襲別人的智慧財,OpenAI指責Deepseek利用OpenAI的model來train Deepseek的model,也就像盜印圖書館的書來自己成立一間圖書館,這樣當然不必花大錢買書。但目前對於版權的法律還沒進步到AI這一塊,因此就算OpenAI能舉出Deepseek抄襲、盜用,這個問題目前仍是無解。

2024-06-26

用mpv做簡報

 前面提到用mpv可以看youtube並且載入不同語文的字幕,後來想到是不是可以利用自製的vtt格式字幕來搭配mpv播放影片做簡報?

 一樣是影音播放軟體,VLC可能比mpv更出名,但我認為mpv比VLC好用,因為mpv可以在command line加上各種參數或由script來執行,達到把各種組合自動化的結果。

 這個試作是以最基本的簡報為目標,只用「圖片+文字」來構成,對於不想使用現成簡報軟體的時候,mpv是個不錯的選項,可以透過python或bash script呼叫ffmpeg,把「圖片、文字」組合成影片,再交給mpv播放,就達到基本簡報的目的了。

 關於影片製作以及字幕時序,是以每一秒換一張圖、一次字幕來算,或許會懷疑一秒不是太快了?不會!因為可以控制mpv的播放速度,如果設為0.1倍,原本的速度就變成10秒換一張圖、一次字幕的簡報速度。如果10秒不夠,那就按下暫停在某一張圖,便有充裕的時間進行講解,然後前進到下一個畫面,直到結束。

 vtt字幕的格式,以"WEBVTT"為第一行。
-----------
WEBVTT

1
00:00:00.000 --> 00:00:00.900
簡報文字第一行
簡報文字第二行

2
00:00:01.000 --> 00:00:01.900
簡報文字第三行
簡報文字第四行

3
00:00:02.000 --> 00:00:02.900
簡報文字第五行
簡報文字第六行

-----------
將文字檔存成例如 present.vtt 的檔名。1是搭配第一張圖的文字,2就是搭配第二張圖的文字,以此類推,可以只用一行,或很多行也可以,字很多的話,再把字體調小一些。

假設有十張圖要做簡報,我們用ffmpeg來組合圖片變成影片:
ffmpeg -framerate 1 -pattern_type glob -i 'present*.jpg' -c:a copy -c:v libx264 -r 1 present.mp4
"-framerate 1" 是一秒一張圖的意思(一般影片是30fps,一秒播30張圖),之後用mpv來播放時再把速度放慢到 "--speed=0.1" 就是一秒的十分之一,變成一張圖停留10秒(最慢可以設成 0.01秒,就是一張圖會停留100秒)。

然後在播放影片時,帶上自己做的字幕,播放時用的最基本參數是:
mpv --speed=0.1 present.mp4 --sub-file=present.vtt

mpv帶字幕時還有很多參數可用像是:
 --sub-border-color=\#000000\
 --sub-border-size=3\
 --sub-color=\#d0d0a0\
 --sub-shadow-color=\#2020d0\
 --sub-shadow-offset=15\
 --sub-back-color=\#3506080a\
 --sub-visibility=yes \
 --sub-align-x=left \
 --sub-align-y=top \
 --sub-pos=95\
 --speed=0.1\
(詳細說明請參考man mpv)

這樣製作出來的簡報mp4影片及自製字幕vtt加起來體積很小,很方便攜帶或傳送。

如果有RP2040微控器,也就是Pi Pico或Waveshare Zero之類的,焊上一個紅外線接收器,可以搭配circuitpython加上irremote(紅外線遙控)以及 adafruit-hid 來模擬鍵盤。
circuitpython的code.py可以加上以下模擬鍵盤的控制

kbd.send(Keycode.SPACE) #mpv 暫停/播放
kbd.send(Keycode.V) #mpv 字幕 顯示/隱藏
kbd.send(Keycode.LEFT_ARROW) #mpv 倒退10秒
kbd.send(Keycode.RIGHT_ARROW) #mpv 前進10秒
kbd.send(Keycode.SHIFT, Keycode.LEFT_ARROW) #mpv 倒退1秒
kbd.send(Keycode.SHIFT, Keycode.RIGHT_ARROW) #mpv 前進1秒
kbd.send(Keycode.R) #mpv 字幕上升
kbd.send(Keycode.SHIFT, Keycode.R) #mpv 字幕下降
kbd.send(Keycode.SHIFT, Keycode.G) #mpv 字體變大
kbd.send(Keycode.SHIFT, Keycode.F) #mpv 字體變小
(這些都是mpv內建控制播放用的按鍵。)

2024-03-16

隨手關歪壞(Wifi)

日常生活中大家常說「要隨手關燈、要隨手關水龍頭」,但是沒有人說「要隨手關歪壞」?一來是人們使用歪壞也沒幾年,對歪壞認識不多,反正種花電信來安裝,可以用就好了,沒想過要關掉。二是歪壞設備大部份是沒有像電燈的開關,沒辦法讓人按一下就關、就開。

大部份歪壞設備要透過網路從瀏覽器畫面登入,再慢慢翻頁到可以關或開的選項,然後進行設定,而且幾乎只有透過時程控管開或關,沒有按一下就開或關的,而且按一下設定之後,還要等一段時間讓歪壞重新啟動才能生效。

現在市售歪壞設備更是標榜「穿牆」,功率越強越好,賣方跟買方都有這樣訴求。所以我們打開歪壞一掃,左右鄰居的AP名字都會出現,有的甚至比你家裡的更強!

嚴格一點來看,歪壞訊號到處射,也會有安全上的隱憂吧?如果能「隨手關歪壞」應該會比較安全,也比較環保。

要能夠隨手關歪壞,大概只有自己DIY一途,DIY需要哪些東西?(可能需要一點電子焊接工作) 

1.一組SBC ARM電腦,例如各種Pi,Banana pi Zero, NanoPi Neo, RPi zero……,不需要高規格硬體。
2.作業系統使用Linux,所以需要一些基本的使用經驗。
3.Wifi硬體,SBC板上內建的,或PCIe/MiniPCIe介面的,或USB介面的,最好有外接天線。(可能會遇到某些硬體沒有支援AP mode,或需要自行compile driver,要實際試才知道)
4.紅外線接收頭(有些SBC會內建),網路買一個5元以內(搜尋1838B這一款),紅外線發射器(家裡不用的紅外線遙控器,或壞掉只剩一個按鍵正常的遙控器,因為我們只要用一個鍵就夠了)
5.一個LED(可以是onboard的或接在GPIO腳上)來顯示歪壞On/Off,或是接一個WS2812(NeoPixel)多彩LED,這個好用,只要三支GPIO就能控制幾十個RGB LED。
6.板上內建的MCU或外接的MCU(例如RPi pico 或 RP2040-zero),用來解讀紅外線訊號,下指令控制歪壞的開、關。
7.用某種語言來寫控制介面,例如常見的python,以及MCU上面的程式(例如circuitpython)。
8.底層控制程式,一為控制AP的hostapd,另一為dhcpd(可以用dnsmasq或是更簡便的busybox udhcpd)分配IP,以及routing, iptables NAT給client端。

SBC上面內建紅外線接收頭是最方便的,如果沒有,就要在GPIO上面插紅外線接收頭,如果從GPIO插有問題,那就把紅外線接收頭插在USB外接式MCU(RPi pico 或RP2040-zero)上面也可以。

解碼紅外線發射器的某個按鍵所發出來訊號的值,如果是內建MCU,可以在SBC上面執行例如"sudo ir-keytable -c -t"來讀取按鍵值,以便寫入介面程式。如果用RPi pico或RP2040-zero這種外接MCU,可以用"adafruit_irremote"這個circuitpython用的library來讀取按鍵值。

用bash寫一個同時啟動dhcpd以及hostapd的介面程式。

最後寫一個銜接MCU到OS的介面程式,來「開」「關」歪壞AP。
1.紅外線『發射器』送出訊號
2.紅外線『接收頭』收到訊號
3.MCU確認這個訊號是要控制歪壞AP,而非其他按鍵
4.MCU向介面程式傳達『收到了』
5.介面程式檢查hostapd,若是未執行,就執行bash介面,啟動hostapd及dhcpd
6.介面程式檢查hostapd,若是執行中,就執行bash介面,中斷hostapd及dhcpd

完成之後,按下遙控器上某一個鍵,歪壞就開啟,LED就亮,再按一下同一鍵,歪壞就關閉,LED就滅,這樣就能「隨手關歪壞」了。

2023-10-27

UV-K5 firmware資訊更新

使用了一段時間之後,在收接飛航通訊方面效果最好的是使用
https://github.com/egzumer/uv-k5-firmware-custom
這個github的firmware,它針對AM mode改良,所以聽起來不輸Uniden的scanner.

它包括spectrum功能,可以開啟頻譜模式來掃描飛航通訊,而且可以用到12.8MHz寬的範圍來掃描。

 

 按F以及5啟動頻譜模式,以截圖中的掃描來說,凸出來這一支訊號就是128.5MHz, 所謂12.8MHz寬,是在頻譜模式按4切換成128,再按1(7減少)增加到100.00k,最左端是118.1MHz最右端是130.9MHz。這個範圍掃描時會停在ATIS,因為它是不間斷發射(RCSS ATIS=127.4),所以按一下PTT下方的第一個按鍵Fn1,會把這個頻率列為不接收,下一輪掃到這裡就跳過,如果你所在環境還有其他強雜訊,使得掃描時停在那個訊號,就按一下Fn1來跳過。

 這裡說切換為100.00k是因為幾乎全部的通訊都落在小數後一位,即NNN.M,例如127.4 118.1 125.5 119.7 128.5,除了131.95外都適用。

 幾個重要按鍵:
1/7 增減掃描頻率間隔
4 掃描總數(循環改變)
2/8 增減掃描時改變頻率的間隔(按上/下鍵來改變頻率)
5 直接輸入你要起始的頻率(用*來輸入小數點)
3/9 改變收聽訊號的dB值
6 收聽頻率的頻寬
0 切換FM/AM/SSB
F/# 改變squelch線的高低
Fn1(PTT下面第一個鍵) 把出現的頻率列為跳過
Fn2(PTT下面第二個鍵) 頻譜掃描中,按Fn2可以切換背光
PTT 可以停在掃到的頻率

 從頻譜掃描來找出會出現的頻率,然後把頻率寫入記憶,常態收聽時切換到記憶模式(非VFO模式),按*鍵啟動記憶掃描。

 記憶掃描途中可以長按*鍵來切換 I 跟 II 兩個群組或是不分群組全部掃描
在非掃描時的記憶頻率,按5可以把這個頻率切換為第I或第II群組,或不屬群組.

 

 這是非掃描時的畫面,同時顯示兩個記憶頻道名稱及頻率,目前收到的是119.7000

 如果不想用web界面的方式燒錄(在Linux只能用chrome,不能用firefox),可以用k5prog這個工具,它已經修正bug,可以正常使用(之前版本會在半途中斷無法完成)。
https://github.com/sq5bpf/k5prog
在使用k5prog燒錄之前,要把下載來的bin或自己compile出來的bin拆解開,工具是這一支程式 https://github.com/amnemonic/Quansheng_UV-K5_Firmware/blob/main/uvmod_kitchen/qsfirm.py

 進入燒錄模式的按鍵是
1.先關機,插入連接線(3.5mm/2.5mm耳機接頭)
2.按住PTT不放,開電源,這時螢幕無顯示,照明用LED必須亮起來

執行方式如以下這一行
qsfirm.py unpack abc-xyz.bin k5flash.bin abc-xyz_ver.bin
"unpack" 這個就是拆解出給k5prog燒錄的格式
abc-xyz.bin 就是下載來或自行compile出來的bin檔
abc-xyz_ver.bin 只是看看它是什麼版本用的,與燒錄無關
k5flash.bin 是要交給 k5prog 燒錄用的格式檔bin,然後開始燒錄

k5prog -b k5flash.bin -YYYYY -F
這裡一定要加 -YYYYY -F
開始它會列出一些資訊,其中包括firmware的大小:
Writing blocks from address 0x0 until 0xf000, firmware size is 0xefec
然後看它的最後一行是不是 0xef00 跟 0x00ec
*** FLASH at 0xef00 length 0x00ec  result=1
這樣就表示全部燒錄完成了

記憶頻道的管理要用chirp, 請找next裡新的版本才有支援UV-K5機種
https://trac.chirp.danplanet.com/chirp_next/