Redecentralization, Emergence, AI, Monopolies, and … Facts and Communication

最近(不巧)又跟人討論了 AI,於是獲得了指引,瞭解一些新概念,又在網路上逛到一些厲害的文章,覺得腦袋升級,在此記錄分享。(其中大部分是我還沒有時間深入去瞭解的,只是感覺光是讀完皮毛就已經腦洞大開(誤),想先記錄下來)

Emergence & Complex System

討論 AI 當時我不小心脫口說出「人工智慧還是 deterministic 的,跟意識還差距很遠,更何況根本就沒有所謂『真正的意識』,意識是一種現象,跟意識很像的東西就是意識。意識也是一種漸層,就像洗碗機的意識程度低於嬰兒、嬰兒的意識程度低於成人。意識並不是什麼神聖的人類獨有的東西。」,就獲得了一個指引,他只說「去瞭解一下 Emergence 和 Complex Systems ,可以讓你對意識和 AI 有更微妙的理解,《Gödel, Escher, Bach》是一本好書」。

Emergence 指的是一種現象,在一個複雜(有很多變數),或是很多很多部件的分散式(沒有中央控制)系統裡面,各個部件組合起來,整個系統卻顯現出難以從原本部件的規則推導出的特性。又分為強弱兩種,強的 Emergence 是無法以決定論去化約、推導的,弱的則可以。常見用來闡述 Emergence 現象的例子是人類經濟體、白蟻社會,還有人類大腦(產生出意識這種神奇的現象)。

AI and Monopolies

David Rosenthal 在他的文章《It isn’t about the technology》當中談到,網際網路的集中化問題,並不是因為去中心化這一方缺乏好的技術,而是經濟學法則在將網際網路推向集中。

他借用了 Charles Stross (科幻小說家)的 “Slow AI" 的概念。 “Slow AI" 是說,早在人工智慧一詞被發明出來之前,人類早就發明類似人工智慧的東西,並且普及了,這種東西叫做「公司」。公司成立的目的,通常是為了產出某種東西,並從中營利(營利通常是次要目標),例如福特汽車公司成立的目的是為了生產更多汽車來賺錢。公司就像人工智慧一樣,有個明確定義的目標和次要目標,它也像人工智慧(或是生物),會演化、適應所處的環境(市場、法規等等),甚至試圖操控整個環境、改造環境以達成目標。公司另一點很像人工智慧的地方是,公司經常只會設定單一面向的目標,針對這個面向去優化,並且只針對這個面向,一心一意,就像之前研究者挑戰虛擬的 AI 機器蟲在腳不碰地的狀況下前進,AI 發展出的解法是使用膝蓋走路

公司經常透露出一種「公司所有人可以掌控公司」的假象,有時候看起來更像是公司這個巨大的人工智慧操控了董事和執行團隊,例如為了達到目標,執行長經常會被撤換。Slow AI 也會試圖消滅對自己的存在造成威脅的競爭對手,透過併購,例如 Facebook 併購 Instagram,公司通常足夠聰明,如果沒有威脅的通常就不會採取行動,這也是為什麼沒有社交網路公司對分散式社交網路做任何事情。

要管制這樣的寡佔企業, The Verge 這篇說了一些想法,另外像是 GDPR 也是會威脅到這些寡佔企業的。

這才發現,David Rosenthal 引用的 Charles Stross 在 34C3 的演講我以前就有聽過,但當時完全沒聽懂。於是這次讀了逐字稿。這演講先是介紹「如何預測未來」,再介紹 Slow AI 的概念,最後論述自從人類 1990 年代起,為了要支持網際網路的發展,設定這些 Slow AI 要使用「競爭人類注意力」(廣告)的方式來賺錢,是如何創造出了厲害(可怕)的工具(武器),讓有心人士可以利用工具大量操控其他人(假新聞影響選舉, etc)。

David Rosenthal 文章裡面也引用很多其他文章,該讀的他都標上 Must Read (MR)。

出來 Charles Stross 之外, David Rosenthal 也提到 Cory Doctorow 和 Ted Chiang ,兩位都是科幻小說家(Ted Chiang 是《異星入境》電影原著作者)。

Facts and Communication

New York Times 在今年三月劍橋分析事件讓大家對臉書的不滿爆開來之前,已經持續寫 facebook 一段時間,時間之後關於 facebook 的文章數量更是增加,其他像是 The Guardian 和 Washington Post 也出了不少,後來就看到有人對於這些媒體採用的聳動標題表示不滿,質疑記者不夠瞭解這些科技在嚇大眾。

在跟其他人討論 AI 的時候,我經常分不清楚他們在討論 AI 、演算法、資訊科技,抑或是科技本身。

人會對自己不瞭解的東西有所畏懼,尤其是在媒體喜歡配合企業宣傳他們的人工智慧有多神奇的狀況下。雖然企業大部分是想要宣傳他們神奇的科技可以為使用者帶來什麼好處,讓使用者覺得選擇了這個產品就是超先進,但這個被過度塑造成為魔法的東西似乎反而引起了媒體和民眾的恐懼。

是該要正視表面下的恐懼。提供說明,揭祕魔法很重要,但說實在我不確定這樣能否說服足夠比例的人,也有可能不管怎麼說明都沒有用(來不及)。

用接收方可以接受的方式傳遞事實很重要, Vox 的這部影片提到,科學家並不一定是科學訊息最佳的傳播者

Buzzword and Hashtag

我這篇有這麼多 buzzword,不知道會不會紅。 #AI #blockchain #decentralize #fakenews #disinformation (誤)

#可是我不是發在 Medium.com 上

#Wordpress(.com) 的資料可攜性比較好啦,而且是開源的

Global shortcut key to create new iTerm window

I’ve always liked GNOME’s (and probably on other Linux desktops as well) feature of launching a terminal window anywhere with a global shortcut key Ctrl+Alt+T , and have configured my MacOS to achieve the same using Apptivate since a long time ago. Somehow it stopped working last week so I looked to fix it and refine the implementation.

I originally used this script /New-iTerm-Window.scpt with Apptivate, but it seems to break with the latest iTerm (iTerm2 3.2.0beta9) in multiple places.

New implementation

Follow the steps in “Creating System-Wide Keyboard Shortcut To Launch Applications" on StackOverflow, replace Step 4 with the following:

  1. Search for “AppleScript", create a “Run AppleScript" action.

  2. Paste the AppleScript as follows:

on run {input, parameters}
    if application "iTerm" is running then
        tell application "iTerm"
            create window with default profile command "/bin/bash -l"
        end tell
    else
        activate application "iTerm"
    end if
end run

Then continue to follow the steps from the Stackoverflow answer.

Now you can remove Apptivate! It’s not needed anymore.

References that have helped me throughout the process:

Bonus: Open new Finder window

Same step as above, but different script:

on run {input, parameters}
    tell application "Finder"
        activate
        set new_window to make new Finder window to home
    end tell
end run

Reference:

Github

These 2 workflows are on Github: https://github.com/pellaeon/Dotfiles/tree/master/workflow

中國 Android app 常見的混淆方案

最近遇到有趣的 android app 就會用 Mobile Security Framework 來逆向看看,一直以來很少遇到有溷肴的 app ,這次遇到了第一個: https://play.google.com/store/apps/details?id=com.fobwifi.transocks

一開始對他用了什麼溷肴完全沒頭緒,到 lib/ 底下把 native library 的檔名一個一個丟去搜尋就搜尋到東西了,原來用的是騰訊的樂固加殼

至於要怎麼反溷肴(脫殼),大概查到兩種方法。

http://www.holdheart.com/archives/33.html 這篇用 IDA 動態 attach 到運行中的應用程式來 debug ,看起來挺複雜的,原理雖然是大概看得懂但實在懶得自己操作一次。

另一個方法是利用 Xposed 去 hook 解密之後要載入的 dex 檔,有兩個相關專案,支援不同的溷肴方案:

也是第一次聽過 Frida 框架,蠻酷的,各個平臺都可以 instrumentation 。

然後還找到一些相關的資料:

找資料途中遇到有趣但比較不相關的東西:

臉書動態消息演算法的小測試

我平常用 SocialFixer 插件,可以標示fb文章為已讀,然後下次再顯示的時候就會自動隱藏。剛剛做了點測試: 我一直重複重新整理+標示所有文章為已讀,大概 6 次以後 fb 就幾乎只能不斷顯示已讀的文章,即使我去檢查我其他有按讚的專頁,在最近一天之內有我沒看過的文章,我仍然在動態消息上看不到。

然後我就隨便挑了一個有按讚的粉專的貼文讚,發現動態消息仍然沒有新東西。

所以我推測 fb 的動態消息演算法的運作方式:

  1. 每隔一段時間挑選貼文,加到一個 queue 裡面,這個速率大概是每5分鐘挑選一篇沒看過的貼文
  2. queue 的大小是有限的,也就是說太舊的沒看過的貼文也會被移出 queue
  3. 在平臺上面產生任何互動行為(按讚、留言、分享等等),似乎並不會直接立即影響到動態消息所挑選的內容
  4. 挑選貼文的演算法有些盲點,即使粉專最近有發文,也不一定會被挑選到
  5. 強烈偏好真人帳號產生的內容,朋友發文、回應等等

不過當然實際的運作應該不會這麼簡單。

不讓 Firefox 一啟動就載入所有分頁

上次評測各種分頁群組相關套件已經有兩個月左右了,後來我開了新的 Firefox Quantum 的 profile 測試 Experimental Simple Tab Groups 插件,沒什麼大問題,就逐漸很習慣地使用 Firefox Quantum 了。事隔兩個月再來做一個盤點,最近到底在用什麼插件。

Experimental Simple Tab Groups -> Simple Tab Groups

沒注意到,後來 Experimental Simple Tab Groups (ESTG) 就停止維護了, addons.mozilla.org 的套件頁面也刪掉了,看來也該轉移到新的 Simple Tab Groups (STG) 了,原本打算用匯出分頁群組的功能備份,然後再匯入新的 Simple Tab Groups ,但不知道為什麼點了匯出沒反應,可能是 user.js 我加了某些特殊設定的關係。

研究了一下,最後發現可以直接到 ESTG 插件的資料夾,把 storage.js 複製到 STG 的資料夾就可以了,兩個資料夾都在 profile 資料夾裡面的 browser-extension-data/ 裡面。(當然要記得備份 profile 資料夾免得出事。

LoadTabOnSelect

STG 還是有個麻煩地方,雖然可以設定離開分頁群組的時候自動 unload 裡面的分頁,但是只要進到某個分頁群組,裡面的所有分頁就會開始自動載入,一次吃掉大量資源。搜尋了一下,找到 STG 的 github 上面有相關的 issue ,推薦 LoadTabOnSelect 這個插件,就點開來安裝了。

Firefox 60 隱私及生產力設定

自從 Mozilla 2017 年釋出 Firefox 57 ,毀掉分頁群組和其他所有有用的插件之後,我就先跳去用 Waterfox 了。

後來我就持續不定時觀察各種分頁群組插件的完成度,是否達到接近 Quicksaver 本來做的 TabGroups 插件,上次做的調查是在 tabHide API 釋出不久之後,當時最好的選項 Simple Tab Groups 都還不是很好,我就沒有跳槽。

Firefox Quantum 首次通過勉強可用的測試

近期開始重新測試 Simple Tab Groups, 發現作者釋出了一個基於 tabHide 的實驗版本,短暫測試之後覺得還算可用,就先把工作用的 Profile 匯入到 Firefox Quantum + Experimental Simple Tab Groups 。測試的結論:

  • Experimental Simple Tab Groups 十分穩定,不會遺失分頁(這個 profile 有 50~100 個分頁,通常每次會同時開啟 10~20 個),切換方式也和以前差不多,速度也很快,整體來說沒什麼大問題
  • UnloadTabs: Firefox Quantum 沒有提供修改分頁標籤外觀的 WebExtensions API ,因此需要透過奇怪的 NativeExt 修改 UserChrome 樣式來達成這個效果,有點麻煩,我還沒試
  • Firefox Quantum 沒有比 Waterfox 快(這個 profile 和我的另一個更多分頁的 Waterfox profile 相比,插件也不一樣)
  • Firefox Quantum 會使用比 Waterfox 更多的程序(通常 Waterfox 只有兩個),總和起來吃掉比 Waterfox 更多的記憶體(沒有經過科學測量,只是我偶爾打開系統監視器看)
  • Firefox Quantum 在 MacOS 睡眠的時候似乎仍然會不斷 allocate 更多記憶體,但可能是因為睡眠停掉了某些作業系統的機制,吃掉更多的記憶體沒有被壓縮或是釋放,經常睡眠一個晚上起來就發現系統沒有反應,好不容易打開 Firefox Quantum 發現數個 process 吃掉 5GB 的記憶體。Waterfox 也有這個問題但比較輕微。

總結是勉強可以接受繼續用,畢竟 Waterfox 的安全性還是令我有點擔心,感覺維護人力不是很夠,我也沒時間去看他們有沒有真的 backport 每一個 mozilla 對 Firefox 做的 security patch 。

轉移更多 Profile

原本除了 Firefox 之外,我還有數十個 Chrome 的 profile ,拿來瀏覽比較不重要的網頁(like Facebook, Netflix) ,因為 Chrome 的 profile 切換比 Firefox 方便非常多。

但最近碰巧發現,Chrome 支援一個 Battery Status API ,讓網站可以得知使用者目前裝置的電力狀態,並且 Chrome 不提供任何設定的方法關閉這個 API ,Firefox 則是曾經釋出但是後來停止支援這個 API 。從這一案例,我看 Chrome 應該還有很多類似的缺陷,因此開始考慮轉移一些 chrome profile 到 Firefox 。

但考慮到我未來還有很多需求建立很多個 firefox profile ,因此開始 survey 一些適合所有 profile 都設定的選項,舉例來說:

  • 停用 WebGL :我沒有需要在瀏覽器裡面玩遊戲或是開這類型的網頁應用程式,而且 WebGL 可以拿來做 fingerprinting
  • 停用 WebAssembly :我非常反對的標準,你要快速的應用程式應該乖乖去開發原生應用程式。並且目前 Javascript 提供一定程度的原始碼透明性(雖然很多會混淆,但認真一點的話還是可以理解高階行為),WebAssembly 會把網頁應用程式變成一個黑盒子
  • WebVR :預設是停用的,但也是我用不到的功能
  • 停用 EME :我只要在要看 Netflix 的那個 profile 打開就好,其他 profile 沒必要開
  • 等等, Chrome 更誇張,連 WebUSB, WebBluetooth 都有了

整體來說,我覺得現在的網頁平臺越來越多 feature creep ,這些標準的支持者經常打著「Universal/ubiquitous platform」的名號,使用「網頁有跨平臺、快速發佈、使用簡單的優勢,因此應該讓網頁平臺支援更多應用程式功能,方便使用者及開發者」類似的論調。將網頁平臺視為一個應用程式發佈的管道我並不反對,然而當這些應用程式能夠存取越來越多底層作業系統的功能的時候,我不禁覺得,你們只是想要偷懶不去開發原生應用程式才來支持 web 增加功能,然而這卻越來越將 web 變成一個「任意程式碼執行的管道」,也賦予了瀏覽器越來越多本來應該是桌面環境要做的事情,這個是明顯的 Inner-platform effect anti-pattern

總之我自覺身為一個 web 的使用者,為了自己未來的利益(更好用、更安全的應用程式和網頁)著想,應該要抵制這些功能。

回歸到技術的解決方案,我最後找到 pyllyukko/user.js ,集合了幾乎所有我要的選項。我使用他的 relaxed 版本的 user.js 為基礎來修改,關掉更多安全選項以便利使用。修改後的結果放進我自己的設定檔 repo

我第一個轉移的 chrome profile 就是其中一個主要拿來看 facebook 的 profile 。因為我的 Firefox profile 太多了,因此我每一個都要選不同的佈景主題,方便我切換過去的時候知道這是哪一個。(不過 addons.mozilla.org 網站上面的佈景主題大部分都很醜,像長輩圖那種,再不然就很中二,要找到好的不容易,而且網站上面也沒有提供什麼方式可以簡單找到高品質的佈景主題)

插件

在新的這個 firefox profile 裡面,我裝了這些插件:

  • Experimental Simple Tab Groups
  • Privacy Badger
  • HTTPS Everywhere
  • Link Cleaner
  • Octotree
  • Snooze Tabs
  • Social Fixer for Facebook: 可以幫 fb 貼文標已讀,就不會一直出現重複的貼文,還可以以關鍵字過濾貼文,和各種強大的客製化功能
  • Flagfox
  • Facebook Container
  • Firefox Multi-Account Containers

Multi-account Containers 基本上是通用版的 Facebook container ,但它不會在你點 fb 上面的連結的時候把連結複製到另一個 container 開啟,查了一下發現兩個是可以並存的,所以我就讓他們並存了。另外 Experimental Simple Tab Groups 也有一個功能是把特定分頁群組指派成特定 container ,只要是那個 container 的分頁都會在那個群組開啟,也可以設定正規表達式抓取新開啟的分頁進到 container ,但後來想想我應該不需要同 container 的分頁都集中在一個群組,所以我就把兩個功能分開用了(就是不特別設定 simple tab groups 裡面的正規表達式)。

未解決的可用性問題

雖然研究了這麼多,但整體而言 Firefox Quantum 對我來說還是有很多可用性問題,尤其是當我轉移越來越多 profile (不管是從 chrome 或是 waterfox )過去,問題會越來越嚴重:

為什麼我不使用 container 功能取代 profile ?

  1. 因為這樣我就沒辦法「只開啟一部分(特定用途)的分頁」,我是照用途來分 profile 的(工作、閱讀新聞、閱讀文章、開發程式、開發網頁程式、學習科學、看影片、聽音樂等等),這樣我每次在做一件事情的時候只要開啟一個 profile ,不用就可以關掉,如果全部都擠在同一個 profile 的不同 container ,那一次全部開啟就很吃資源。

  2. 因為這樣沒辦法「只在有需要的時候啟用插件」,插件的安裝是跨 container 的,越多啟用的插件也表示越吃資源。然而我只有在看 Netflix 的時候需要啟用 NflxMultiSubs 、看 FB 的時候啟用 Social Fixer ,工作的時候啟用 Jitsi Meetings ,安裝的更多插件是資源的耗用,也是額外不必要的安全風險。

  3. 「特定網站在特定 container 開啟」的功能,在你有同個網站的一個以上的帳號的時候不適用,比如說 Facebook container 還是沒辦法同時登入兩個不同的 facebook 帳號。

一次開啟多個 Firefox profile 的問題

如果我在 Firefox Quantum 一次開啟很多個 profile ,每個 profile 的 Firefox 應用程式 instance 的圖示,都是 Firefox ,所以我的 Dock 上面就會有 N 個一模一樣的 Firefox 圖示,切換的時候根本不知道哪個是哪個……以前我都是用 Firefox-on-OS-X Label 這個 XUL 插件讓不同 Firefox profile 的 instance 的圖示顯示不同的 label ,但 XUL 插件被 mozilla 毀了,所以。

相容性

歡迎來到 2018 年,今年世界上的人類們還沒解決不同瀏覽器之間的相容性問題——哦,不過最近幾年不是微軟的錯了,是 Google 的錯。

  • Firefox 無法使用 U2F 登入 Google 帳號,儘管已經支援 U2F 協定,而且可以在 Github 上面用 U2F 登入, fuck you, google
  • Firefox 無法使用 Google Hangout (很不幸我還是得用這個服務),儘管 google 的說明文件表示支援 firefox ,這明顯是個謊言兒, fuck you, google

總結

Firefox Quantum 對我來說還是有重大的可用性問題,因此短期之內應該還是維持「不重要的網站用 Quantum 開,主要的使用還是在 Waterfox 」。

參考

Feitian U2F NFC 和 macOS 上面 U2F 的現狀

最近取得一個 Feitian (廠牌)製造的 U2F Key ,除了拿來當作線上帳號二階認證的因子之外我還想要研究一下能不能拿它來登入 MacOS 、放我的 ssh key,研究了很久才發現 U2F 和放 ssh key 完全是兩個不同的功能。

有三個常見相關的功能:

  • U2F: challenge-response 式的二階認證標準
  • CCID: 可以產生和儲存 RSA 或是 Elliptic curve key 的智慧卡,這就是儲存 ssh key 或是 PGP key 需要的功能
  • TOTP: 用對稱式金鑰產生 one time password 的協定

像是 Yubikey 4 有標示支援 OpenGPG,應該就表示支援 CCID ,Yubikey 也要靠他們出的軟體來切換 U2F/CCID/TOTP 模式。

另外我原本擔心我的 Feitian U2F key 有沒有受到之前 Infineon 晶片有爆出 RSA key generation 弱點的影響,查了之後才知道這個弱點不影響 U2F 的安全性,只會影響智慧卡(CCID)的部分。

U2F

U2F 除了可以拿來登入線上服務之外也可以拿來登入作業系統,通常是透過安裝和設定 pam-u2f ,這個網路上教學很多這邊就先不寫。

相關專案:

CCID

有幾個和 CCID 相關的專案:

其他

Feitian U2F key 似乎可以切換成 CCID 模式,只是要用他們家奇怪的 windows 應用程式,現在手邊沒有 windows 所以就沒有測試。

然後雖然現在已經 Firefox 60 了,Google 帳號還是不支援在 Firefox 上面使用硬體金鑰當作第二階段認證因子…… fuck you google

參考