code-prettify

2021年11月5日 星期五

如何在 MacOS 中傳輸檔案至 Garmin VENU 2

Garmin VENU 2 在連接上 Windows PC 後,會直接在 File Explorer 出現一個裝置,使用者可以直接將檔案或是音樂複製到裡面。但在 MacOS 中,若直接接上 VENU2,Finder 中並不會出現任何新裝置,到磁碟工具也不能手動 mount。這時候需要的是 Android File Transfer 這個 App,實際上 VENU 2 或是其他非 Apple watch 的穿戴式裝置大多是 Android 裝置。在安裝好之後,點開 Android File Transfer App 之後會看到以下畫面:


便可以像在 Windows PC 上一樣,複製任何你想要的檔案或音樂到 VENU 2 上。

2019年8月8日 星期四

C 與 C++ 中 switch case 不能宣告變數的真相

今天在工作上,同事遇到了 switch case 中,宣告變數會造成編譯錯誤的問題,其實只要在 label 後的 code 加上 {} 把 statement 放到新的 scope 即可,但是仔細研究後發現,雖然在 C 與 C++ 中都會編譯錯誤,但是編譯錯誤的訊息跟點是不一樣的,因此用這篇文章記錄一下查到的資料與心得。

C++


編譯錯誤會發生在第 11 行,g++ 噴出的錯誤訊息是

 11:9: error: jump to case label
 11 | default:
      | ^~~~~~~
 9:17: note: crosses initialization of 'int i'
 9   | int i = 0;

這表示的是 i 在 case label 0 的 scope 裡面有被宣告並同時初始化(declaration with initialization),根據 C++ standard 6.7.3,
declaration statement 在 declaration with initialization 的區域變數是無法自動帶進其他 block ( switch 其實就是多個 {label, block} + goto 組成)。

讓它在 C++ compiler 編譯過的其中一個方法是,根據標準,不使用 declaration with initialization,而是把宣告與定義分開,即:

但是這樣子在 C code 是依然是無法編譯過的,因為在 C 跟 C++ 中的編譯錯誤的原因不同,接下來看看 C 的情況。

C


編譯錯誤會發生在第 9 行, gcc 噴出的錯誤訊息是

:9:13: error: a label can only be part of a statement and a declaration is not a statement
 9 | int i = 0;
    | ^~~
Compiler returned: 1

根據 C standard 6.8.1,declaration 並不是 statement,只有 statement 可以被 labeled,所以會編譯錯誤,注意 C 並不禁止在 block 裡使用宣告過但未初始化的變數。

一個修正方法是,在 label 後加上 empty statement,即


不過這樣在 C++ 依然不會編譯過。

然而在 C 與 C++ 同時可以編譯過的實作中,如

可編譯過的原因也是不同的:


  • C: {...} 為 compound statement (即 block),故可以被 labeled
  • C++: 透過 block 將 local 變數的 scope 限制在 labeled block 裡。

參考資料:

2019年7月24日 星期三

Pytest cannot discover test in vscode

If someone also encounters such issue in VSCode with pytest :



Just add `__init__.py` in your test folder, then the auto test discover mechanism will back to normal.

2018年9月27日 星期四

2018 Q3 工作檢討

工作主要有兩項:

  1. 基於 LightFM 的推薦系統,使用 Flask 來製作 REST API service
  2. Looper 的支援,JUCE + Webview

1. 的部分,單純使用 LightFM 沒有什麼問題,但是要利用訓練出來的 feature vector 來做 cross-category recommendation 花了一點時間,主要是
  • 將不同類型的項目打包成一包向量,還要記錄對應的 index 與長度,在 predict 時還得適當的還原回來。
  • 記得 customize 的 user/item feature matrix 要先在前面塞一個 identity matrix,否則模型的表現可能會更差(e.g. AUC 99% -> 68%)
2. Looper 的支援,原本以為把之前做過的 porting 過來即可,沒想到 spec 完全不合,最後只有節拍器用到,而且還是改了不少。跟 F2E 這邊的溝通我自己也沒做好,把狀態邏輯做在 native 端,導致難以維護,幸好在支援結束前,調整為 native 只單純提供功能性的 function,狀態由 F2E 管理。

2017年11月26日 星期日

Use wine to play Diablo 2 on macOS high sierra

[Update] After updating to macOS 10.13.6, the Diablo 2 macOS installer works perfectly, no need to use wine anymore.

After upgrading to macOS High Sierra, the installer of Diablo 2 is no longer runnable, and it seems like that Blizzard does not provide a update for this issue until now.

There are at least two ways to make Diablo 2 playable on macOS High Sierra

  1. Install on macOS Sierra and then copy the bundle to the High Sierra machine
  2. Use wine to simulate a Windows environment

This article would cover 2. only, here are the steps


  1. Install homebrew
  2. Open terminal and type
    • brew cask install xquartz
    • brew install wine
    • wine [your_d2_installer_dir]/Installer.exe
    • wine [your_lod_installer_dir]/Installer.exe
  3. This completes the installation, to start game, go to terminal and type
    wine ~/.wine/drive_c/Program\ Files\ \(x86\)/Diablo\ II/Diablo\ II.exe -w

    You can save this as a script for quick launch,
    happy D2 :)
  4. Screenshot

2017年4月8日 星期六

Retina display support for legacy Xcode project

If you have legacy Xcode project that you want to support retina display, do not forget add `NSHighResolutionCapable` attribute(1st row) to your plist file and set to `YES`, as following


if this attribute does not exist in your plist file, just add it manually.

2015年6月20日 星期六

[閱讀心得] 秦始皇 一場歷史的思辨之旅

      「歷」,經歷過,過去的。「史」,事件,歷史直白點的解釋便是過去的事件。也因為如此,中學的歷史教育,對學生留下最深刻的就是一張張年份與事件的對應表,如;

{ "西元 1895" : "中日甲午戰爭,中國戰敗", "西元 1453 年" : "英法百年戰爭結束", ...}

但,這樣子學習歷史真的有達到這門課程期望的效果嗎?

        這本書在一開始,從對學生一詞的解釋,間接指出學習歷史應是從中學習判斷與思考的能力,也就是透過歷史,來「學」習在社會中「生」存的所需的技術,而不單單只是記下什麼年代發生了什麼事。隨後便以張良與黃石公的互動為例,說明膽視,聰明,並不足以造就成功,而是如何將自己擁有的天賦提煉成智慧,而該例中的智慧,是兵法中的「忍」與「先」。「忍」等待適當的時機,「先」攻其敵人之不備,張良先前就是不懂這兩個道理,才導致刺殺秦王行動失敗。接著便進入本書主角秦始皇的章節,開頭先以秦始皇與李斯跟尉繚的互動,以及如何平定戰亂,統一六國來說明其擁有不凡的天賦。然而也因為這樣的不凡,使得他無法正視自己的失敗之處,更因此讓小人趁虛而入,宦官干政,民不聊生,加上秦二世的無能,終究導致秦朝的滅亡。

        本書有趣之處在於,當書中人物面臨重大決策時,作者會希望你停下來想想,如果是你的話,會如何下決策,就如同 coursera 中的影音課程,在課堂途中會暫停,並詢問你一些問題。這也是作者想表達的:歷史該怎麼學習。該學習的是,在面臨重大決策時,古人是怎麼下決定的,他當時的情境是如何,他所考量的因素有哪些,他的決定對他未來造成的影響又如何?這樣子的訓練,跟古板的背下事件與年份的對應極為不同。將年份表背下,指訓練了在考試中有限的選項中,選擇正確答案的決策能力,然而現實社會中面臨的問題,有很多時候是沒有現成的選項的,選項很有可能是需要自己整理目前的情況,歸納可能的做法,並分析各種做法的利弊,才能做出決定,而不只是單單從某個資料庫中篩選並撈出答案就可以的,也就是除了知識之外,還要有書名中強調的「思」考與分「辨」的能力。

這本書強烈推薦給覺得目前中學歷史非常無趣的人來閱讀,至少我自己以前學歷史的時候,總是覺得就是一個死背的科目,老師也老是用課文挖空,學生填空的方式來驗收學習成果,更加令人覺得無聊。但這本書介紹了對學習歷史的新觀點與方法,並藉由這種方法,磨利自己心中名為「智慧」的那把刀,我相信這也是歷史這門學問的初衷。