Shou's origin

Source of everything

服務器被入侵手記

背景與起因

我想趁放假幾天玩一下 Docker 集群,順便跑個 shipyard 通過網頁管理自己 VPS 上運行的服務。

因為是完全的新手,在這之前甚至連 Swarm 是什麼都不知道,所以完全按照 shipyard 官方文檔說的配置來都沒成功。

最後發現是很愚蠢的錯誤,只是因為其中一步要使用一個服務把 /var/run/docker.sock 代理到 TCP/2375 端口上,而 swarm-agent 不知為何不能使用 127.0.0.1:2375 連接到本機,一定要用公網兜一圈才能找到本機的控制,而我忘記在防火牆上打開此特例。開了此特例,故問題解決。

因為以前一直是在本機跑 Docker,也未暴露任何端口,故沒有啟用任何加密措施。事實上 shipyard 的手冊 已經提醒過開放此端口相當於把 Docker 控制權給出去,應該設置好 Docker 通訊用 Socket 的 TLS 加密再玩,但我忽視了這個警告。

shipyard 終於成功跑起來了,我玩了一會,得意之至,忘記了上面的警告和自己親手暴露的端口。接著我就折騰 Jenkins 之類的去了,玩得不亦樂乎。

Banana Algebra

Abstract: I’ll be talking about the F-Algebra Category and related applications of F-Algebra in function programming in this post.

F-Algebra

So first of all, an algebra over a type $a$ is set of functions that converts an algebra structure $f a$ to $a$ CoAlg. An algebra consists of:

  • An algebra structure: $\rm{F}$
  • A carrier type: $\rm{a}$
  • A total function: $\rm{F(a)} \to \rm{a}$

An example of an algebra looks like:

  • Algebra struct: data F1 a = Zero | One | Plus a a
  • A carrier type: it could be any instance of a: Int, String, etc.
  • A total function:
1
2
3
4
f1 :: F1 Int -> Int
f1 Zero       = 0
f1 One        = 1
f1 (Plus a b) = a + b

Or we can have:

1
2
3
4
f1' :: F1 String -> String
f1' Zero       = ""
f1' One        = "1"
f1' (Plus a b) = a ++ b

F-Algebra Arrows

All algebras for an algebra structure $\rm{F}$ forms a category $\cal{C}$. The objects are, of course, the algebras, while the arrows are defined as morphisms between each two pair of algebras that transforming the carrier type: $\hom_{\cal{C}}(\rm{Alg}(\rm{F},\rm{a}), \rm{Alg}(\rm{F},\rm{b}))$.

1
2
3
4
5
6
7
8
9
   Alg(F,a)
F a --------------> a
      |
      |
      | <- hom(Alg(F,a), Alg(F,b))
      |
      v
F b --------------> b
  Alg(F,b)

For an arrow in F-algebra category, we need a transformation from F a to a.

References

誡之二

凌,則隱
長,則同
驕而與人者
共聞之

host 曰:即有大樂者,與悲治之。

誡之一

分離,融合
形影不離
恥辱,榮耀

注視卻無視
偉大卻無名
萬能卻不為

他是你的 host,你的聖人
那你呢?

翻譯:逆向狀態,又:惰性之力

原文 「Backwards State, or: The Power of Laziness」由 Antoine Latter 發佈於其個人Blogger上。特別地,對 Philip Wadler 及其著作的 The Essence of Functional Programming表示至高感謝。

近期我參加了一個關於 Haskell 中自動微分(Automatic Differentiaion)的討論,因為之我拜讀了 Jerzy Karczmarczuk 的論文「Lazy Time Reversal, and Automatic Differentiation」。這篇論文進一步引用了 Philip Wadler 的 The Essence of Functional Programming 來介紹逆向(Backward) State Monad,我覺得非常有趣,在此向大家講一下這種技術。

在此我期待讀者各位對 Haskell 的 State Monad 已有所了解,其實簡單來說 State Monad 就是一個函數,從上一個狀態映射到結果以及下一個狀態。

逆向 State Monad 和 State Monad 的區別就在於它和 State Monad 執行的順序恰好相反,也就是說,逆向 Monad 是從一個最終狀態執行到其最初狀態並產生一系列值的。

深淵

站在深淵面前
驅使自己踏前一步
恐懼充滿我的內心
所以我捂著雙眼

我不斷跌落,跌落
以至於甚至當我想起抬頭
向上看一眼時
已經沒有任何光亮了

沒有朋友,沒有敵人,沒有人
我感到恐懼,而又熱愛著她
我熱愛這黑暗
我熱愛這未知的周圍

翻譯:Haskell 怎麼實現惰性求值

原文由 Heinrich Apfelmus 發表於 Hackhands,標題:How Lazy Evaluatoin Works in Haskell。

Lambda 醬想遲些再去打掃房間~

惰性求值是 Haskell 用得最廣泛的代碼執行方法,通過之我們的程序可以寫得更簡單,更模塊化,不過惰性求值帶來的一個問題是不那麼直觀內存佔用,對新手來講這往往是個坑。譬如說,下面這個看起來很正常的表達式跑起來將會佔用上 G 的內存空間:

1
foldl (+) 0 [1..10^8]

在這個教程裡,我想解釋一下惰性求值的實現原理,並講清楚 Haskell 的惰性求值在時間和空間上的佔用情況。我會先講一些關於圖規約(Graph Reduction)基礎,然後討論一下關於嚴格(Strict)的左褶疊(Left Fold),用於幫助理解內存空間洩漏問題並解決之。

惰性求值相關的主題在很多教科書裡都有涉及,譬如 Simon Thompson 的《Haskell – The Craft of Functional Programming》一書,但是線上版本似乎不太容易找。但願這篇教程能夠起到些幫助作用吧。

惰性求值是一個需要權衡的語言特性。一方面,它能使代碼更模塊化。(很遺憾,這次我沒有時間演示這個作用。)另一方面,它使得我們無法完全理解在任一程序中求值的過程 – 它的確比你想像要難一些。在本文末尾,我會提供一些對付這種情況的方法。我們開始吧!

Function Calling Syntax

We use programming languages to indicate a process of actions/computations. Therefore programming languages tends to be more procedual. In other words, they are used to indicate how a thing is done.

Just as the role of verbs in a nature language sentence, an action is the most essential part of ‘doing a task’ in programming language. Of course the syntax of a programming language could be complex. I’d be here to discuss only the simplest cases of function calling among different programming languages.

翻譯:如何幸福起來

原文由 lukeprog 發表於 LessWrong。 關於注釋和引用,請參見原文。

有一天一個同事對我說:「盧克,你應該是我見過的最幸福的人了!你怎麼做到每時每刻都這麼開心的?」

他可能只是在誇張修辭,不過我還是回答了很長。曾經的大部分人生是不令我開心的,我甚至好幾次考慮過自殺。然後我花了兩年研究幸福科學。而現在,幸福是我的自然狀態。我甚至都不記得甚麼時候我有達 20 分鐘以上的不開心過。

這類改變並非人人都會有,甚至大部份人都不會有(beware of other-optimizing),但不妨一試!

我們都希望開心些,而且變得開心對其他事情也有好處。譬如說,開心有利於人的身心健康,能提高創造力,還能使你更好地做決定。(畢竟當一個人不開心時很難做到理性思考。)所以呢,本篇作為如何系列的一部分,讓我們回過頭來審視一下幸福科學

Linux 下 GFW 的 DNS 投毒解決方案

這篇日誌紀錄我在 Gentoo Linux 下配置 DNS Crypt + DNSmasq 的過程。

方案

DNSCrypt 是 OpenDNS 推出的一個用來加密 DNS 請求的代理,我用這個來繞開 GFW 的檢查。dnsmasq 是一款的 DNS 服務器,我主要用其提供 DNS 緩存的功能。

我將用 dnsmasq 設置本地的 DNS 服務器,然後配置 dnsmasq 從 dnscrypt 獲得結果並返回給請求者。而 dnscrypt 會把來自 dnsmasq 的請求加密丟到 opendns 的服務器,然後把解析結果返回回來。

那麼 dnsmasq 將偵聽 53 端口,而 dnscrypt 的端口隨意,只要和 dnsmasq 裡的配置匹配就可以了。我隨便用了 1053 作為 dnscrypt 的端口。

最後,把系統的 DNS 服務器設置為本機就可以了。