跳到主要內容

文章

目前顯示的是 九月, 2020的文章

把 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; …