今天嘗試將一個代碼庫拆分成若干模塊(準確用語應該是「」),目標可以說既典型又不典型:從邏輯上說,代碼分爲三塊,其中一塊是共享的。

很理所當然的,我會將其拆分爲A、B、C三個目錄,然後試圖從A和B中導入C。於是也很理所當然的,我期望可以直接進行相對導入。然而這時候就有了問題,也是我走了許多彎路,浪費了很多時間的原因所在。

爲了避免自己再犯錯,也爲了以後可以隨手發給別人,寫這麼一篇簡要但不減省地介紹和解釋一下Python導入相關的話題。

我的需求

首先,我的大前提就是不要去魔改sys.pathPYTHONPATH環境變量。

抽象出來,我的目標目錄結構大概是這樣:

my_code
├── common
│   └── shared.py
├── server
│   ├── app.py
│   ├── lib1.py
│   └── lib2.py
└── user_lib
    └── lib.py

其中server/user_lib/都會用到common …

近期折騰一文寫作的時候,其實我已經在嘗試使用firejail了。然而當時僅僅是在用它已經提供好的Profile,以及爲支持fcitx進行了細微修改,並沒有深入去瞭解其Profile如何寫就,以及它究竟能限制什麼。

而我由於在使用pass進行密碼管理,故而在firefox上使用passff插件以便自動填寫密碼。然而在默認的firejail profile下,passff無法正常工作。於是我起了去折騰的心,而直到今日終於解決問題。鑑於網上對於firejail的文章很少,中文尤其少,故而覺得可以留篇介紹文章。

其實我好幾年前就開始用pass了,但直到最近幾個月纔發現passff這個插件。

基本firejail知識

Firejail是一個沙盒軟件,所以可以期待它的功能也就是沙盒軟件的各項功能——文件系統隔離,進程隔離,訪問控制等等。它用到了Linux Namespace等機制以便實現沙盒,而且它本身需要SUID(顯然)。

我本身也在簡單的使用apparmor(最早是爲了限制ruijieclient的權限),那麼它們兩個是什麼關係呢?本來它們兩個是沒太大關係的,畢竟apparmor是直接工作在內核裏的,目的是控制進程的訪問權限以及其能力(比如可以/不可以修改某文件等);而firejail是沙盒,出了沙盒啥都沒了。然而firejail畢竟可以將外部信息暴露給沙盒內的程序,而且也可以進行訪問控制,於是這時候它就和apparmor的部分功能有所重疊。而firejail更是提供了一個apparmor整合模式,使得整個事情更複雜了。

所以,其實我並沒有弄清楚到底它們倆(當交織在一起時)關係是什麼。Arch …

忽然發現自己好像好久沒寫什麼技術性的博文了,但想想好像最近除了繼續在維護Easer 從而繼續學一堆Android開發相關的東西(庫和坑)以外,並沒有什麼成果可以說道(倒是有許多翻了資料,但沒時間實現的東西)。但最近倒是折騰/試用了許多軟件,拼拼湊湊來一篇文章倒也沒什麼不好意思的,畢竟許多情況下人們的問題是「不知道還有這個東西的存在」。

除了都是開源項目以及不依賴「雲」以外,折騰了的這些軟件並沒有什麼一致的目標。然而我卻是很意外地有一條線索將這些軟件串了起來。

同步軟件——Syncthing

出於各種原因,我需要在幾個設備間同步一些數據,主要是一些文檔之類的東西。由於設備涉及手機、筆記本以及臺式機,其存儲、電能都不大不相同,所以需要一個較爲靈活的軟件;然而這些設備並不一定會同時全部在線,我又不喜歡「雲」(噫,感覺好像找到了新一篇博文主題?),所以需要該軟件支持分佈式場景。挑來挑去,最後選擇了Syncthing,試用之後感覺的確比較符合我的需求。

其實更早的時候我是在用網/雲盤的,但很顯然,免費的網盤肯定是沒法完美的。用得最好的其實是堅果雲——雖然有每30天1G上傳的流量限制,總體來說還能接受(指早期;後來我因爲流量問題充過會員),而且對開發者以及Linux用戶(相對來說)比較友善 …

C/C++程序員應當對堆棧的區別很熟悉,畢竟這是和操作系統/低層直接相關的概念。如Java等不需要考慮堆棧的語言,其實質(從某種意義上可以認爲)是儘量使用堆而不用棧,但這樣不可避免地帶來了性能問題(計算和存儲雙方面的性能)。由於Rust目的是作爲一門系統編程語言,故而其不能選擇Java一類的方案;但同時,它也努力從語言中剝除堆棧的直接出現,以便降低概念的雜亂。

事實上,前文已經提過Rust對於剝除堆棧的努力之一:壽元。壽元的存在使得思考值是否有效時不需要同時考慮堆棧(操作系統特性)+作用域(語言特性)這兩組有所重疊的概念,而僅需要考慮作用域和壽元的組合(皆爲語言特性)。

在絕大多數時候,壽元和借用機制足以滿足對堆棧的抽象。但仍然有個別時候會有繞不過去的必須將值分配在堆上的需求,這時候可以使用Box<T>類型。

Box<T>告訴編譯器將值分配在堆上,然後返回這麼一個對象(類似於一個智能指針)。提取值時和引用一樣,使用*來獲取值。

官方教程中有一個Box<T>的例子。)

開源協議的選擇其實是一個老生常談的話題,其主要集中在GPL、LGPL、Apache 2、BSD和MIT協議上。雖然有時候也可能會加上MPL或者WTFPL,但絲毫不影響討論的主旨:商業。

在網上隨便一搜「開源協議對比」之類的文句,返回的結果一般都是在討論「哪個協議對商業更友好」之類的東西;結果基本都是或明或暗地在說:「避免GPL」,「選擇MIT、BSD、Apache」。

這一結論在其所限定的框架內的確沒錯,但處處透着不對勁。而我實在是太過習慣於發現不對勁後嘗試思考(雖然並不總是有結論)。於是,對這裏的不對勁,稍微思考便發現——和許多其他透着不對勁的話題一樣——它的問題出在前提上:開源的目的就是爲了商業使用?

畢竟這是個資本主義的時代,商業主導了我們的生活,同時也規約人們的思維模式。商人們不斷宣傳「成功人士」以及金錢的神話,將創新和商業進行綁定,從而導致人們不自覺地認爲商業就是對的,「允許商業使用」是必須的前提。 在上世紀末與本世紀初的時代,這一切都還可以被經濟增長所掩蓋。但到了這兩年,到了川建國同志撕下美國一直以來的面具和面子,進行保守主義轉向,並且對個別國家(比如中國)進行經濟 …

前兩天matrix.org的服務器掛了一天,但和人交流還是要有的。然而和人的其他交流方式主要是微信,實在是太難受(不說別的,沒有桌面客戶端這點就足夠了)。於是糾結了幾分鐘以後,決定自己搭一個XMPP服務器 臨時用着 ,並給要聯繫的人也創建一個賬號。

由於之前就看過相關軟件,直接就選擇了 ejabberd 來做後端。準備使用其他服務端軟件的可以不用繼續看下去了。

在網上找到一個 算是挺不錯的教程 ,但其中有一些細節寫得不是很好,讓我配置時候走了一點彎路。做好基礎搭建之後我又做了一些別的事情,都是在網上零零散散的內容。所以起心自己整理一下,順便交代一下自己遇到的問題(萬一有人知道呢)。

故而,本文會作爲 教程 的補充/修改而使用,多數內容請直接參看原文。這次配置用到的服務器是 ubuntu ,源中有ejabberd等軟件。下文假定軟件已經安裝完畢。

域名配置

我並不知道 ejabberd 是否可以配置爲不使用SSL加密(我參考的 教程 什麼都沒說直接就開始配置SSL),但出於安全考慮,能使用SSL還是用SSL比較好。

那既然要用SSL,證書就要準備好。像我這種臨時使用的,生成證書肯定是選擇Let's Encrypt,免費又快捷 …

嘛,衆所周知yaourt項目死掉了,於是出了各種奇奇怪怪的問題。之後也沒有一個佔據統治地位的 AUR Helper 存在,所以就只能比着 wiki上的簡單對比 自己隨便挑挑用。但我又想找個“最好”的,wiki的對比內容並不足夠,於是就逐漸試用各個AUR Helper,故而有此文。

本文嘗試總結自己試用這些AUR Helper的體會,並簡單進行比較。我試用的雖然肯定不是全部,但也爲數不少,故而此文多少可以方便一下其他人(如果有人看的話,咕)。

參與軟件及試用經歷

首先列舉一下我都試用了哪些軟件,然後描述我的試用感受……畢竟萬一這些軟件也死了的話,這篇文章的主體就沒什麼必要看了。

在選擇之前,我是抱着尋找一個「和yaourt一樣」的軟件的心態去的,於是找的主要都是pacman wrapper。下面先說明yaourt中哪些功能我很喜歡,然後介紹我對各個AUR Helper的試用體會。說來也有趣,在使用過程中,我發現一些工具提供的一些新功能超出了我的預期,甚至有些連想都未曾想到 …

本文尚未施工完畢,並且作者很懶於是沒有任何計劃 推薦閱讀互聯(Federated)社交網絡

Mastodon

整體而言,就如其協議所設計的目的一樣,Mastodon是一個微博客服務,其功能也是微博客相關的東西:有長度限制的狀態發表(文本、圖片),發表狀態的可見性,轉發、評論、讚,關注,還有個人介紹頁。當然,類似於多數“現代”系統,狀態發表內容中可以標記預警(包括但不限於NSFW),默認顯示替換文字,展開後顯示原始文字。

發表內容有四檔可見性,除去正常的全部可見、僅關注者可見及僅被提及者(還有自己)可見外,另一個比較特別的是不顯示在公共時間軸上但人人可見。

默認UI糅合了一定的Material Design、一定的Flat Design。其顏色我比較喜歡,但部分細節可能還有改進空間。Mastodon默認擁有四個分欄,分管不同功能。我在其他服務中並未見到這種設計,算是一個不大不小的優秀創新點,畢竟可以同時處理回覆以及查看動態,有利於提高效率(但該設計對那些只會單線程思考的人來說並沒有什麼用,反而新鮮的設計會導致他們產生失控感進而憤怒)。

Mastodon支持OStatus和ActivityPub協議,因而可以和相當多數系統互聯 …