跳到主要內容

文章

【電子書】國家解剖學(Anatomy of the State)

這是一本憾動人心的小書,Murray N. Rothbard 的 Anatomy of the State,原書請至 Mises Institue 網頁免費下載或是購買,中文版也終於在每日辛苦翻譯後集結完成。

我把它翻成《國家解剖學》,先前我在《國家的故事》一文中曾經嘗試要討論的國家成長歷程,在本書中有 Rothbard 大師的完整推導,還加上各種值得深入閱讀的材料。

從國家的產生、國家的性質、國家的各種轉型變種、國家的盟友、國家慣用的蠱惑人心伎倆、國家與國家之間的互動,還有我們要怎麼對抗國家等,文章雖短,但卻字字珠璣,值得閱讀。

中文版與本站相同,同樣採用姓名標示的創用CC授權,內容若有任何翻譯失真,請以 email 與我聯絡以利討論修正,最後,若是這本中文版有激起任何火花,歡迎廣為散播,我個人更推薦有興趣的讀者,可到 Mises Institute 豐富的資料庫進行延伸閱讀。

下載 epub下載 mobi下載 pdf

更新紀錄:
2013/03/24:發表 epub/mobi 格式2013/04/07:發表 pdf 格式2013/04/27:修正 Adobe Digital Editions 開啟 epub 的亂碼問題
最近的文章

把 Blogger 搬家到 GitHub Page 上

因為同事的推薦,想來試試看用 Hugo 來 Host 我的 lwstudio.org 部落格,因為同事大大成功地用 GitHub Page 設定好 Namecheap.com 域名的 HTTPS 連線。替我之前撞的找出了一線生機。計畫先來把我的實驗步驟分成幾段計畫,這篇文章應該會緩慢地更新:設定 HUGO 上 GitHub Page調整 HUGO 的 template把 blog.lwstudio.org 設定到 GitHub Page 上做一個 Blogger export to Hugo 的未知龐大工具小工具把現有的 Blogger 轉到 HUGO GitHub Page 去測試 Export 的站內連結是否正確轉換把 lwstudio.org 也轉到 GitHub Page 去,然後放著 Blogger 長蜘蛛網設定 HUGO 上 GitHub Page基本上跟著這篇教學做

在 Blogger 上開啟 Namecheap 域名的 HTTPS 失敗了

自我揭露:這是一篇邊做邊紀錄的流水帳,而且我還失敗了。很久很久以前我申請了lwstudio.org的域名後就直接掛到 Blogger 用了,在 Chrome 開始歧視標明非 HTTPS 的連線之前,網誌看起來還不會很掉漆,但你知道的,落伍的安全性機制總是會慢慢被淘汰,我也已經到了自己覺得好像不能忍受沒有 HTTPS 連線的坎站了。撞牆路首先,我 Google 了一下該怎樣打開 Blogger 的 HTTPS 發現了這篇 Turn on HTTPS for your blog 的官方指引,裡面提到了要先去 Let's Encrypt 註冊。Let's Encrypt我的網域是在 Namecheap 買的,適用Without Shell Access的情況,前往 Check our list of hosting providers 頁面找找,噩耗出現在 Namecheap.com 是列在 No Planned Support 名單裡,好喔,此路不通,而且我有很不祥的預感。Namecheap Q&A我在 Namecheap 的網站裡找到這篇 How do I use my domain with my Blogger account,看起來我之前就是照這篇設定的然後,所以這篇沒用。回去 Blogger 設定看看基本上,用 Namecheap 的域名轉過去 Blogger 的組合,應該是沒辦法簡單開啟 HTTPS 了,從 How Do I Activate an SSL Certificate How to install SSL certificates 兩篇看起來,因為 Let's Encrypt 不支援的關係,所以要自己買 SSL 憑證安裝在 Self-hosted 伺服器上。有閒再來弄看來可能要跳轉域名供應商了,換一個 Let's Encrypt 有支援的。陸如說這個

InputStream 、 DataInputStream 與 BufferedInputStream

Java 有很多不同的 InputStream 類別,老是搞不清楚,InputStream、DataInputStream跟BufferedInputStream最近出現在我看的書的練習題裡,一些從 Java Doc (1.8) 文件中拉出來的相關連結:CloseableFilterInputStreamInputStreamDataInputStreamBufferedInputStreamInputStream是抽象類別,實踐了Closeable,所以可以當成try with resource裡的資源。類別方法裡定義了InputStream.nullInputStream()可以產生空的InputStream。另外也規範所有實作子類別必須提供public int read() throws IOException方法來回傳下一個 byte 的內容。FilterInputStream在生成時吃進InputStream後把InputStream存起來,並且覆寫了所有InputStream裡的方法,大部分覆寫的方法都是把原來的操作轉到物件生成時丟進去的InputStream上,以供更細分的子類別使用,例如: public int read(byte b[], int off, int len) throws IOException { return in.read(b, off, len); } DataInputStream跟BufferedInputStream都進一步繼承FilterInputStream。DataInputStream主要是從InputStream直接讀入 Java 的 primitive data type。BufferedInputStream在內部會產生一個緩衝陣列(buffer array)來支援mark跟reset方法,透過額外使用的緩衝空間來先讀入資料,以優化資料讀入的效能。

[Mock Project] 工程師搜尋機

寫一個小系統來配對出符合條件的工程師。工程師的屬性分別有:programmingLanguages: ProgrammingLanguage[]Location: StringExperience Year: int public class Engineer { String name; ProgrammingLanguage[] programmingLanguages; String location; int experienceYear; public Engineer(String n, ProgrammingLanguage[] lngs, String l, int y) { name = n; programmingLanguages = lngs; location = l; experienceYear = y; } } 準備一個過濾器的介面 import java.util.List; @FunctionalInterface public interface EngineerMatcher<X extends Engineer> { List<X> match(List<X> engineers); } 資料庫跟過濾器們 import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class PlayfulEngineer { static List<Engineer> engineers = new ArrayList<>(); static { Engineer ravi = new Engineer("Ravi", new ProgrammingLanguage[]{ProgrammingLanguage.Java, ProgrammingLanguage.Ruby}, …

泛型 Java Functional Interface 的特規化

如果某個特殊型別的 Functional Interface 常常被使用時,有時候直接宣告型別會比較方便引用。可以透過兩種方式來做特規,介面與抽象類別:Generic Functional Interface @FunctionalInterface public interface TwoArgsProcessor<X> { X process(X arg1, X arg2); } 介面(Interface) @FunctionalInterface public interface TwoIntsProcessor extends TwoArgsProcessor<Integer> { } 抽象類別(Abstract Class) abstract class TwoIntsProcessorAbstract implements TwoArgsProcessor<Integer> { }

使用複合條件來判斷是否進入下一輪 Java 迴圈

在 Java 迴圈寫法中,假如我想要透過一個外部判斷來提前中斷這個迴圈,之前我習慣寫: public class Test { public static void main(String[] args) { int [] ints = {1,2,3,4,5}; boolean continueCond = true; for (int i=0; i<ints.length; i++) { continueCond = ints[i] < 4; if (!continueCond) break; System.out.println(ints[i]); } } } 但這樣寫其實有點冗,今天看到在 Functional Interfaces in Java 裡的一個範例寫法: public class Test { public static void main(String[] args) { int [] ints = {1,2,3,4,5}; boolean continueCond = true; for (int i=0; i<ints.length && continueCond; i++) { continueCond &= ints[i] < 4; System.out.println(ints[i]); } } } 但這樣寫的行為跟使用 if (!continueCond) break; 強制跳出迴圈有些差異,由於 for 裡面是要走完全部才會跳出,所以第二種寫法依然會把 4 給印出來。以這個範例來說,變成要把需要跳開的動作包在一個條件裡: public class Test { public static void main(String[] args) { int [] ints = {1,2,3,4,5}; boolean continueCond = true; …

Windows 裡的類 homebrew 工具: scoop.sh

新工作的環境是 Windows 系統,所有的開發工具生態系都要重新摸索。剛開始發現可以用 Git for Windows 裝好後的 console 下平常習慣的 bash 指令後,努力想要自己寫一些 shell script 去自動化開發工具跟環境變數的初始化,簡單的情境下好似都還堪用。

可是如果要安裝的套件都要一個一個手刻 script 好像又有些白癡。

因緣際會下被提點去找其他平台上的類 Homebrew 方案,權衡系統權限低落等實際情況下,好像也只剩 scoop.sh 可以用了。

搞了一整天反覆試驗了一陣子,總算是把裝機清單給列了出來:
# https://scoop.sh/ scoop uninstall scoop # for broken installation, remove the directory of ~/scoop # Scoop installation Set-ExecutionPolicy RemoteSigned -scope CurrentUser iex (new-object net.webclient).downloadstring('https://get.scoop.sh') # add Git so that scoop can install packages from extras bucket scoop install git scoop install openssh [environment]::setenvironmentvariable('GIT_SSH', (resolve-path (scoop which ssh)), 'USER') scoop bucket add extras # Common unix like apps and python scoop install which scoop install python scoop install curl scoop install cacert python -m pip install --upgrade pip # Java Tools scoop install maven scoop install gradle # AWS cli tool pip insta…