Apple email 亂碼小註解

我本來用 Apple 的 Macbook AIR 收信, 最近改成 Surface Book 2. 原本收到其他同仁用 Apple Macbook 寄出來的加密信件, 在 Apple 上直接用 Apple Mail 加上插件就可以看到解密後的郵件, 相當地方便! 但換到 Windows 底下就變亂碼了, 這件事有點麻煩, 所以花了點時間解決.

首先 Kleopatra 解密軟體是無辜的, 它只是忠實地解開 PGP key. 編輯器也是無辜的, 這並不是 UTF-8 誤設成 Big 5 這類的問題. 不然用 Word 裡面選擇編碼的功能就能挑出對的那個編碼方式.

我這次遇到的是郵件變成了有很多等於符號的亂碼, 例如 =8E=BB=E5=A6=82=E6=9E=9C…, 這該怎麼辦呢? 這種很多 “等於" 的亂碼是 Quoted-printable (QP) 編碼, 中文是 “可打印字符引用編碼". 也就是可以把任何編碼的文字變成可以印出來的 ASCII 字元. 解密完的 mail 中也可以看到這些字樣:

Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=utf-8

Apple 的電腦預設都是用 UTF-8 編碼寄出, 但是後續又被 quoted-printable 轉了一次. 解密軟體只負責解到 quoted-printable, 加上 Outlook 不像 Apple Mail 多了一道解 QP 的動作, 因此才會出現亂碼.

解決之道, 可以自己寫一個解 QP 的程式, 例如這位勇者仁兄 [1], 或者是到善心人士的網站上去轉 [2]. 這個網站還提供了很多轉來轉去的工具, 有需要的人可以做成書籤來備用. 另外有一個網站 [3] 提示了幾種亂碼的類型, 看到不同的亂碼就知道這是哪一類的問題. 基本上 unicode 就是 &# 開頭, 因此文件中一定會有很多 &#. 
random-character-1-620x200

幸虧有這些亂碼終結者, 我們才能有效率地解決網路上怪怪的相容性問題. 在此也感謝他們的貢獻!

[Note]

  1. https://social.msdn.microsoft.com/Forums/zh-TW/d1ff3e3f-bca2-4220-a970-e3557f623e90/-quotedprintable-?forum=233
  2. http://web.chacuo.net/charsetquotedprintable
  3. https://www.uni-ulm.de/acssu/ime/email_decoder_tc.php

Tesorflow on Windows 10 小筆記

最近想要自己安裝 tensorflow 到 Windows 10 底下, 找了一篇很好的文章來參考 [1].  不過實際動手做的時候, 遇到一些小問題, 所以另外做個筆記紀錄一下.

首先我們要安裝 Python [2], 這點沒有疑慮. 到官網抓下來安裝. 然後手動把路徑加到系統環境即可. 但接下來分岔成兩種作法: A 和 B:

(A) 在 Python 環境下安裝 tensorflow.

pip3 install –upgrade tensorflow-gpu

安裝過程一切順利, 但是在 python 提示號下, 可能會遇到 ctypes.WINDLL 找不到 cudart_dll_XXX 的問題. 理論上安裝完 cuda 就會好.  值得注意的是 cuda 和 cuDNN 的版本要搭配 tensorflow-gpu 的版本. 現在的 python 3.6 要搭 cuda 9.0 和 cuDNN 7.0, 這個組合試過沒問題. 但我也曾經試過 cuda 9.1 搭 DNN 9.1, 結果失敗了. 不敢說這組合一定不行, 但我不打算再試了, 先退版本再說.

安裝完 cuda, 用 “nvcc -V" 可以看 cuda driver 是否正確安裝? 但安裝 driver之前, cuda 安裝程式會說 “找不到相容的顯示卡, 但是沒關係可以先安裝." 這讓我擔心了一下. 難道說有兩張顯卡的話會亂抓? 於是我又另外下載 cuda-Z [3] 來驗證. 實測發現讓 Intel UHD 620 和 GTX-1050 共存, 或是把 620 關掉; cuda-z 都可以正確找到 GTX-1050. 

最後一個提醒點是, 如果在 windows 的 command shell 打 python 出現的  shell 底下無法正常使用 import tensorflow, 但是在 python 安裝時自己產生的 command shell 就沒這個問題. 可見得還是有些小地方設定不同.

網路教學 [1] 說可以用矩陣乘法測試 tensorflow, 但實測起來, 老舊的桌機跑 CPU only 反而比 CPU + GPU 快! 問題出在這個 interpreter 會動態去偵測 CPU 和 GPU, 花了不少時間去優化環境. Your CPU supports …. AVX2, found device…GeForce 1050 … Total Memory 2.00GiB…etc.   

tensorflow-1-768x329

(2B) 用 anaconda3 的環境. 安裝它的好處是不會獨佔 python 的環境, 它可以用 anaconda prompt interpreter, 或者用 IDE (integrated development environment) 來寫程式. 從 anaconda navigator 進去, 然後點選 Spyder, 就可以自己寫 python 程式 compile 來跑.

spyder-1-768x636

安裝 anaconda 時會要求順便安裝 Visual Code, 安裝  Visual Code 和 Visual studio 時又會推薦同時安裝 git. 所以這個家族人數不少.  安裝 Visual Studio 的好處是 cuda 有一些 sample code, 可以跑來看看. 不過這裡面有一大敗筆是 sample code 只支援到 MSC_VER 1911, 最新的 Video studio 2017 已經是 MSC_VER 1912, 我看要改得地方太多, 決定放棄.

[Reference]

  1. http://blog.csdn.net/u010099080/article/details/53418159#%E5%AE%89%E8%A3%85-cudnn
  2. https://www.python.org/downloads/release/python-364/, download 連結在下方.
  3. http://cuda-z.sourceforge.net/

Mac 加裝 Windows 小筆記

話說我的 Mac Book Air 是當初去大陸出差時, 因為 Mac Book Pro 忽然掛掉, 臨時跑去商場裡的蘋果店買的. 由於人生地不熟, 又怕有假貨, 所以買了最低規的版本, 想說這樣風險最小. 買回來後發現果然是真品, 又去淘寶買了一塊 512GB 的 SSD 來升級, 但 RAM  沒升, 還是 4GB.

隨著 Mac 和 Windows OS 不斷升級, 現在進到 Parallel 已經跑不太動了. 我最初懷疑是不是和 Mac Book Pro 一樣 SSD 掛掉? 所以買了一隻創見 JetDrive 520 來換 SSD. 換了 SSD 之後, 確實反應變快一點, 但最後效能還是卡在 CPU i5 1.4 GHz 和 4GB 的 DDR3 1600 上面.

既然花錢換 SSD 還是沒改善, 我不由得怒從心中起, 惡向膽邊生, 決定把整台重灌成 Windows! 畢竟公司的 VPN 只支援 Windows, 我用穩定的 Apple 硬體搭日漸穩定的 Windows 10 總可以再撐一陣子吧!?

不過事情並不像憨人想得那麼簡單, 有幾個奇怪的地方需要突破, 前後花了很多時間才搞定:

[Windows 10 與創見 JetDrive 520/525 相容性問題]

JetDrive 520 安裝 Windwos 10 dual boot 必定會失敗. 前面的步驟都沒問題, 等安裝完成之後, 第一次開機會卡在 “正在準備" 這個頁面. 推測是 Windows 10 多檢查了什麼? 但安裝 Windows 7 就沒有這個問題.

如果安裝 Windows 10, Bootcamp 會把輔助程式都抓下來, 流程全自動. 只是搭配創見 JetDrive 520 必死, 搭淘寶買的 SSD 沒問題.

創見 JetDrive 520 和 525 的差別是前者沒有衣服 (鋁殼外接盒) 可以穿, 官方如果能單獨賣殼讓我的 Jet825 升級, 這樣至少舊 256GB, 512GB 還可以當隨身碟. 但前幾天電話詢問創見還是沒有賣這種東西, 如果大家有需要更新 SSD, 可考慮買大陸流出的正廠 SSD, 或者至少是 JetDrive 525.

[硬碟分割問題] 

當我打算安裝 Windows 7, 會發現分割硬碟有 bug. 我沒辦法拉動分割比例, 甚至平均分配硬碟的按鈕也失效. 此時只能預設給 Windows 36 GB 且順利安裝, 但若試圖調整大小必失敗.

解決 Windows 7 分割問題的方法是, 做一隻可以安裝 Windows 10 USB 碟. 插著它去開 bootcamp, 選擇製作安裝碟後, 此時分割大小隨便怎麼拉都可以, 選好之後, 把這支碟拔掉, 插上 Windows 7 USB 安裝碟, 然後依正常流程處理. 

[分割工具問題]

分割 Dual Boot 硬碟一定要用 BootCamp, 不能用磁碟工具. 主要差在 BootCamp 最後會在 USB 安裝碟裡面做出啟動磁區.

我用磁碟工具預設 36 GB 的版本順利安裝完 Windows 7,  曾經考慮新增一個分區, 然後再把它配給 Windows. 但 Windows 無法接受硬碟分成兩塊, 所以我把這兩塊和 EFI 開機分區全殺了, 打算重來一次.

不料從此以後, Mac 只看的ˊ到留給它的那 500 GB SSD, 即使從 Command-R reboot 進去,也看不到其他分區了.  SSD 瞬間縮水一半, 感覺心好痛!! 最後想到用 Windows USB 安裝碟進行假安裝, 真砍分區的補救措施, 重開機後, Mac boot 才看得到完整 SSD 大小, 過程好恐怖! 差點就到 PCHome 24 小時網站下 Notebook 訂單.

另外, 似乎是插著多餘 USB device 的關係, 磁碟工具根本無法完整磁碟的分割. 有時是做完後 fail, 有時是一直在 “準備分割硬碟", 但過了幾個小時還在準備中. 打開活動監視器, 也沒看到有什麼 disk IO, 只有 CPU 占了 1.5% 還活著而已.

有個第三方磁碟工具 Stellar Partition Manager 說自己是 Mac 硬碟管理的第一品牌, 於是我也拿它來做實驗. Stellar 的 UI 滿炫的, 只是反應有點慢. 它說現在的硬碟是啟動硬碟, 所以要製作一個啟動 USB 裝置來開機, 然後透過啟動裝置來分割目標 SSD. 這個講法也滿合理的, 於是我把家裡各種 16 GB 以上的裝置都拿來當過開機碟, 不過呢? 開不起來! 等了幾個小時也開不起來~~

[OS X 版本和 Windows 10 相容性問題]

OS X 10.9.5 版不認識 Windows 10, 一直叫我改用 Windows 7 “以上" 的版本, 連製作安裝光碟這步都走不下去.

[Windows 7 BootCamp 與更新問題]

Windows 7 雖然安裝成功了. 但是開心地更新 Windows 系統, 可能會導致系統出現藍白畫面當機. 接著開機時選 “修復電腦 (建議選項)" 救電腦的過程中, 會跑到某個畫面需要按 enter, 但這個時候 Mouse, 內建外接鍵盤完全沒反應. 只有開機時按 F8 可以自動復原系統.

正確的流程是, 剛才做出的 USB 安裝碟裡面的 Bootcamp 輔助程式得先執行, 然後才可以更新 Windows. 進到 USB 找 BootCamp 目錄底下有一個 setup.exe, 在 Windows 下執行它就可以. 其實若不執行它, 應該會發現 WIFI 不見了, 沒聲音..等問題. 但 USB/BT 似乎直接就是好的, 所以一時可能沒察覺到執行輔助程式的重要.

至於做好的 Windows 7 要不要做滿 – 升級到 Windows 10 我還沒有決定. 畢竟 Windows 10 專業版比 Windows 7 專業版還要便宜.  我可能會冒著全部重來一次的風險試試看.

RNDIS 小註解

RNDIS 是指  Remote Network Driver Interface Specification. 很多網站都介紹過這個技術, 此處專門整理手機和電腦以 RNDIS 連接, 誰上網給誰用的問題.

在 [1] 提到, 用 USB 介面傳 Ethernet 技術, 有兩大類技術:

  1. RNDIS – Microsoft 版的 NDIS.
  2. CDC (Communications Device Class) – 包括 Ethernet Control Model (ECM), Ethernet Emulation Model (EEM), and Network Control Model (NCM). 

對 Windows 來說, 通常它是 USB host, NoteBook 可以透過手機來上網. 

RNDIS本圖取材自 [2].

在 Windows 環境, 通常下載 RNDIS driver 就可以搞定. 在 Linux 環境, 預設支援 RNDIS. 相關設定可以參考 [3].

Linux_NDIS-1此時都是 PC 當 host. 根據 [4], RNDIS 可以透過 WIFI, Bluetooth 上網, 特別是透過實體cable 連接 (如 USB) 的時候叫做 Tethering.

如果反過來, 手機要用電腦上網呢 [5]? 此時主要的設定在電腦上, 也就是讓已經存在電腦上的網路 (透過電腦上 Realtek PCIe GBE 網卡), 允許這個新的 (手機過來的區域連線 4) 網路的分享連線. 此時 PC 仍然是 host.

sharing-network

[REF]

  1. https://en.wikipedia.org/wiki/Ethernet_over_USB
  2. https://docs.microsoft.com/en-us/windows-hardware/drivers/network/overview-of-remote-ndis–rndis-
  3. https://support.criticallink.com/redmine/projects/arm9-platforms/wiki/Enabling_USB_RNDIS_Support
  4. https://wiki.gentoo.org/wiki/Android_USB_Tethering
  5. 【分享】手機透過電腦上網~USB傳輸線

Webkit 歷史圖示

Webkit-Browser-1-768x487

最早的技術擁有者應該是 Netscape, 但 KDE 用了一套自訂的 Javascript engine – KJS 和 webcore engine – KHTML. 其中 KHTML 做得比 Netscape Navigator 的 Gecko 還小, 所以被 Apple 相中拿來開發 Webkit. KDE 原本沒有做 webview 的部分, 所以 Webkit 的名稱是 Apple 取的.

Apple 除了開發 Webkit, 又以兩手策略開發封閉性的 Safari. 到了 2010 年, Apple 做出 multi-process 的技術, 把 main process 和 render process 分開, 因此把 Webkit 改為不相容的 Webkit 2.0.

Google 的策略是借用 Webkit 的 Webcore, 其他自己搞. 後來開發出  V8 Javacript engine, 算是有了重大突破. 接著 Google 又做出 Blink engine, 把 webcore 換掉, 這些好料都放進了 Chrome. 當然 Google 也是兩手策略, 不會平台讓 Apple 佔便宜.

QT 和 GTK 都基於 Webkit 2.0 做出新版. 同理, WPE (Wayland for Webkit) 當然也是 ‘for’ Webkit 2.0 才聰明. 

那 Chrome 有 multi-process 嗎? Chrome (Chromium) 的做法是起好幾個 Webkit [1]. 以空間換取時間. 至於沒有 mutli-process 的弱點, 據說是用 timer 來多工執行, 沒有用到多核的優點 [3].

Chrome-768x713

那 Blink 比起原來的 Webcore 差多少? 根據 [2], Blink 從 Webkit 裡面刪掉 8.8 百萬行的 source code…身輕如燕, 難怪叫做 blink. 不意外地, Qt 等等上層 API 也 port 到了 Blink.

對了, Chromium 是鉻, Cobalt 是鈷, 看起來是兄弟關係. 那麼 Google 的 Cobalt 又是做甚麼的? 這個資訊很難找, keyword 下錯絕對搜尋不到, 客官要看這裡 [4]. Cobalt 的作者本來是負責維護 Chromium 裡面的一段代碼, 叫做  H5VCC (HTML5 Video Container for Consoles). 他在各種平台 porting 這段 9 百萬行的 code  好幾年後, 終於受不了了. 決定要推出符合下面特色的功能:

  • Limited Memory. 記憶體少.
  • Slow CPUs. CPU 慢.
  • Fewer cores. 更少核.
  • Sometimes No GPU. 可能沒 GPU.
  • Sometimes No JIT. 考量安全性, 也不需要支援 just in time 代碼.
  • Heterogenous Development Environments. 跨平台環境.
  • No navigation. 不用瀏覽, 只要呈現.
  • No scrolling. 不需要捲動畫面.

因為 Cobalt 弱弱地不用處理很多事情, 連 Javascript engine 都可以偷掉. We have, perhaps surprisingly, not written our own JavaScript Engine from scratch. Because of the JITing constraint, we have to be flexible with which engine(s) we work with. We have a bindings layer that interfaces with the JS Engine so that application script can interface with natively-backed objects (like DOM elements). 因此近來成為 porting Youtube 的主流.

[REF]

  1. https://www.chromium.org/developers/design-documents/multi-process-architecture
  2. http://browserg.nom.es/
  3. https://www.zhihu.com/question/20930880
  4. https://cobalt.googlesource.com/cobalt/+/refs/heads/master/src/README.md