跳至主要内容

5 篇文章 含有標籤「code」

任何電腦科學、資訊相關主題

檢視所有標籤

Raspotify / librespot 無法播放歌曲的暫時解法

· 閱讀時間約 2 分鐘

正文

平常有在 Raspberry Pi 上用 Spotify 播放音樂的習慣,用的是 Raspotify,就是把 librespot 包成 Debian 尤其是 Raspi 用的套件的專案,前幾天突然播不動,起先以為又是帳號被針對了…

後來弄巧成拙系統掛掉,也不確定是不是我親手搞爆的就是了,總之是乾脆重裝了,正好當作 clean install 升新版,之前一直懶得這麼做就卡在 Buster。

裝好後問題依舊,查到和我症狀一毛一樣的 issue,看起來是有災情,詳見 Getting status code 500s since Ads API sunset · Issue #1527 · librespot-org/librespot

起初找到的時候沒看到什麼簡便有效的方法,後來持續追蹤就看到有人說/etc/hosts 裡加上一筆 0.0.0.0 apresolve.spotify.com 的紀錄就行了,試了下還真的立竿見影,所以就是把那玩意擋掉的意思,蠻莫名其妙的…

我都已經是用付費帳號在播了還會撞到這種廣告關聯的問題…

不過開 issue 的人就有表示相信和 Spotify 的舊版廣告相關 API 下掉了有關…

暫且是這麼處置了,這件事也得記著,天知道會不會之後哪天變成反而因為這筆 DNS record 掛掉。

回顧

也不能說沒有收獲啦,因為一些很蠢的問題笨手笨腳的重裝很多次,時間花的遠沒有預期的久,主要好處是藉機升了新版。

再者是順便調整了音效介面相關的設定,音質似乎有顯著的變化,應該是好的方向啦… 我在這上面播也沒有追求音質就是了。

還有多學到了幾個音效相關的指令,像是 aplayspeaker-test,有點太晚就是,發現播不了的時候不確定到底是什麼部份出狀況, 因此重裝後也不曉得到底能不能播出聲音,但 raspotify 又處於播不了的狀態,等到找到有效解法才學會 speaker-test

後續更新

過沒太久 Raspotify 0.46.2 把 Librespot 升到最新版就把這問題給解決,不需要 workaround 了。

WSL 2 因可用記憶不足而無法啟動的問題

· 閱讀時間約 2 分鐘
系統資源不足,無法完成要求的服務。
錯誤碼: Wsl/Service/CreateInstance/CreateVm/HCS/0x800705aa

[process exited with code 4294967295 (0xffffffff)]
You can now close this terminal with Ctrl+D, or press Enter to restart.

昨天正在打 Splitgate 2 突然想開一下 wsl 又遇到上面這個錯誤,前一次遇到的時候明明就沒有在打遊戲,所以困惑到不行。

這次才明暸原來是當下的系統記憶體不足,我桌機只有 32GB 的確是不多啦,可明明就還剩 8GB 以上,關了遊戲以後還真的就能開了…

於是查到 Advanced settings configuration in WSL # Main WSL settings 裡記憶體的預設值竟然是系統總記憶體的 50%。

沒事也切太多了吧,來改小一點看看還會不會撞到,日後電腦升級再順道加大,但絕對不能放預設抓一半就是了,有點瞎,一半的意思不就是要電腦夠閒或是主力都在 wsl2 上,超不合理啊。


後續更新:

看來問題根本不在記憶體… 後來又碰上了,當下關了一堆程式,閒置記憶體剩餘超過一半還是給我同樣的錯誤。

總之再度查找了起來沒什麼鳥結果,只發現這問題遠比想像中的普遍,大家都對於不講明什麼樣的資源不足感到莫名又束手無策。

Python 的 := 符號 (Assignment expressions)

· 閱讀時間約 2 分鐘

別名海象符號

What’s New In Python 3.8: Assignment expressions

PEP 572 – Assignment Expressions

3.8 加入的這個海象符號當年有注意到但沒看懂,也就被我淡忘掉了。

本來就很受不了多做一次不必要運算的行為,可是為了省那一次又多寫一個 assignment 也頗令人煩躁不舒爽,近期開始養成每天寫上一、兩題的習慣後特別有感。

讀到這則 Fastest Way to Read Excel in Python | Haki Benita 裡頭有用到才讓我回想起其存在並去找出究竟是什麼意思。

不算很常見,初見也不直覺,但用得上的時候真的能簡潔不少。

直接偷 release note 裡的例子來說明。

沒有 walrus operator 的情況下,一段程式懶惰的寫法如下:

if len(a) > 10:
print(f"List is too long ({len(a)} elements, expected <= 10)")

前述的減少不必要運算的不偷懶寫法則可能變成:

n = len(a)

if n > 10:

print(f"List is too long ({n} elements, expected <= 10)")

用上這個新符號的化就能夠簡化成:

if (n := len(a)) > 10:

print(f"List is too long ({n} elements, expected <= 10)")

拿這個例子來看就很容易理解,也就是顧名思義 assign 的同時亦是一個 expression,所以才能用在 if 的後頭。

另一個顯然很好用的情況就是在 while loop 裡:

# Loop over fixed length blocks

while (block := f.read(256)) != '':

process(block)

傳統的寫法多半會變成:

block = f.read(256)

while block != '':

process(block)

block = f.read(256)

Java Text Blocks (文字區塊)的運用要點

· 閱讀時間約 2 分鐘

最近開始拾起一些在 Java 裡屬相對較新的功能,例如本次想要稍微提下的 Text Blocks,這也是我個人期盼已久的功能。

自 Java 15 起 Text Blocks 脫離預覽成為標準功能,然而我的理解只停留在類似 Python 用 3 個引號括起來就可以寫下多行內容的程度。

至於縮排是怎麼認定的?尾巴的空白會保留還是被去掉?等問題由於過往的輕度使用大概都是在 SQL 語句上,便不是那麼在乎實際字串組成後的排版會長成什麼模樣,只要在原始碼裡面看起來順眼就行。

這回我下定決心要有足夠的理解便找到了這則官方教學 Programmer's Guide to Text Blocks,內容相當完善,相信已經涵蓋絕大部份使用上需注意的要點,亦有充足易懂的範例,強烈建議讀過原文,看似有相當長度實際上非常好理解且有不少示範,所以閱讀起來並不花費太多時間,以下取出一些摘要:

  • 基本語法
  • 解釋成品字串縮排空白計算的原則
  • 結尾的 3 個引號是否單獨成行會影響組成字串最後是否有個換行符號
  • 保留尾巴空白的技巧
  • 混用空白字元(空白跟 tab 等)縮排可能造成的問題
  • 如何使用跳脫連成同一行
  • 推薦/避免使用 Text Blocks 的時機
  • 應運而生的一些 instance method

以上要點大部份都是我原先沒想過要知道的事情,著是獲益匪淺,若干年前老覺得 Java 各種沒人性,近年許多實用功能補上來變成正式版,對於 Java 反而變得頗有好感了。

撿到一篇講古文:離線交易儲值卡的興衰史

· 閱讀時間約 1 分鐘

你所不知的塑膠貨幣歷史

2023-09-03 plastic money on Computers Are Bad

上面是一篇在 Hacker News Daily 看到專門講述 stored value cards,也就是一種餘額實際存在卡片內,離線進行交易的應用之興衰史。

裡頭從緣起、規範制定開發及相關技術、成功試驗案例乃至如今仍在營運中的大規模應用皆有涵蓋,相當詳盡。

令人感慨的是網路連線已經相當普及可靠,使得該技術在現代條件下沒有太多選用的理由,即便他有較線上交易簡便之處,當然也有其更複雜之處。

很喜歡這種講古的文章,這則又帶有一股哀傷的情緒…