2019年3月23日 星期六

HTML note

div 和 span 都有title 屬性,有點像是滑鼠移到該位置時會提示說明的功能

input 屬性type為text 的html 增加placeholder能達到位輸入時提示訊息,以往在html5前都還要額外做才能有這種功能.

input 屬性type為radio button的特性:如果有多個同名的radio都有check or change event,只要有一個被hidden不想被選到,但如果操作鍵盤按上下左右鍵就算被隱藏還是會被觸發,這沒遇到真不知道有這種特性!所以記得要用disabled不要單純只hide起來 !

2019年1月1日 星期二

Java lambda on Eclipse

看了人家用 Intellij 寫lambda時,當寫下匿名類別時會有提示改成lambda,想說看Eclipse有沒有這個功能,目前Google大神時沒找到有這個功能,但還是可以透過下列方法達到類似效果
I use the version of Eclipse
(Version: 2018-09 (4.9.0)、Build id: 20180917-1800)

Click the right button of the Mouse




2018年6月30日 星期六

Clean Architecture 心得

咦~好久沒寫blog了,是什麼動機想寫下些心得呢?主要是最近又買新書了,是最近銷售前矛的書- Clean Architecture (整潔的軟體設計與架構篇),這一系列的名家名著已是書櫃上套書了.回到想下心得的動機是書中的第一章重點 :

軟體架構的目標是最小化建制和維護系統所需要的人力資源.

這句話卻是呼應了這五年來,在現在待的大公司中深深體會到的,我所負責的系統是該單位中人人覺得棘手的模組,負責過的人沒一個想繼續待下去,因此常常換人.直到我五年前開始跳入火坑.

這公司的系統開發模式一直以來就是外包導向,也就是給廠商開發,“會”寫code的(不代表很會寫)正職人員不是在專門寫code的,只做維運工作和測試等,當然有review code的責任,但實際上真的有在review的人真的少之又少...

初期的我當然不可能馬上了解系統的邏輯,所有的商業邏輯只在程式碼中,唯一熟悉系統的人就是廠商,甚至正職維運的人還要把log請廠商找出問題,依賴性之重可想而知,另外明明是很簡單的需求,都能報個幾天,每次上線都搞到前一天的下班後(就是加班)才能搞定,而且每次上線都是提心吊膽.

有鑒於,這些種種問題,想待下去就只能靠改變了 !

重構 !

從熟悉所有know-how和重構,到所有掌權(把責任回到正職人員身上),總共花了三年 !
這三年真的過得非常艱辛,下班後回家再加班到凌晨一兩點是常有的事.

當然之後的工作生活就是輕鬆愜意,如魚得水.所有的需求和資源都掌握自己手上,每次上版都踏實且心安理得.

要能工作的順遂,最重要的就是軟體的架構 !

當時有重新架構系統,才能在短時間內完成需求,剩下的時間就能從容不迫的面對其他雜事,當時間和專案能完全掌握,這種生活完全不用加班,而且績效還不錯呢!(也就是紅利和獎金領得不錯,驕傲狀...XD)

後續有機會再來寫書中其他心得和親身經驗的分享.









2013年6月6日 星期四

[Clean Code] ClientTest.java

      public class ClientTest {
    private static final int PORT = 8009;
    private static final int TIMEOUT = 2000;

    Server server;
    Thread serverThread;

    @Before
    public void createServer() throws Exception {
        try {
            server = new Server(PORT, TIMEOUT);
            serverThread = new Thread(server);
            serverThread.start();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }

    }

    @After
    public void shutdownServer() throws InterruptedException {
        if (server != null) {
            server.stopProcessing();
            serverThread.join();
        }
    }

    class TrivialClient implements Runnable {
        int clientNumber;

        TrivialClient(int clientNumber) {
            this.clientNumber = clientNumber;
        }

        public void run() {
            try {
                connectSendReceive(clientNumber);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Test(timeout = 10000)
    public void shouldRunInUnder10Seconds() throws Exception {
        Thread[] threads = new Thread[10];

        for (int i = 0; i < threads.length; ++i) {
            threads[i] = new Thread(new TrivialClient(i));
            threads[i].start();
        }

        for (int i = 0; i < threads.length; ++i) {
            threads[i].join();
        }
    }

    private void connectSendReceive(int i) throws IOException {
        System.out.printf("Client %2d: connecting\n", i);
        Socket socket = new Socket("localhost", PORT);
        System.out.printf("Client %2d: sending message\n", i);
        MessageUtils.sendMessage(socket, Integer.toString(i));
        System.out.printf("Client %2d: getting reply\n", i);
        MessageUtils.getMessage(socket);
        System.out.printf("Client %2d: finished\n", i);
        socket.close();
    }
}




以上是我在閱讀時發現這段Code內容有誤後,寫信反應給出版社 ,然後主編就更正這內容給我

,相信不久就會在出版社網站更新,先貼出來給需要的讀者。



PS. 感謝陳主編






2012年10月30日 星期二

Builder Pattern

這邊的Builder Pattern 跟 GOF的design pattern 中的builder pattern 略為不同,
這是由java語言大師Josh Bloch所提出,主要用來建構immutable物件,透過一個static 的inner  class來控制Outer class的屬性,模式如下:

class SearchCriteria {
private final String firstName;
...
public String getFirstName() {
        return firstName;
    }
... 
private SearchCriteria(Builder builder){
    this.finstName = builder.firstName;
    ....
}
     
public static class Builder {
   private String firstName;
   ...
   public SearchCriteria firstName(String firstName) {
            this.firstName = firstName;
            return this;
        } 
    ...
    
   public SearchCriteria build() {
            return new ( this );
        }
} 

}

使用時就是
SearchCriteria   criteria  = new SearchCriteria.Builder().firstName("Joseph")...一直點下去再.build();

這個Pattern有啥好處?
在對於要建立一個不可變物件時很好用,因為
SearchCriteria 物件在生成後沒有人可以動到它內部的屬性,可達想要的immutable物件
的特性(如:thread safe 等等),
其次在於如果constructor 有多個參數要設定,其中又有幾個是可有可無,這種建構子會
很多,整個class會落落長(台語,很多很長的意思),
Pattern的好處就是同樣達到目地,但可以漂亮又有彈性的達成,在維護和擴充上都有幫助。
 
補充說明:Builder 的設值只會更改 Builder 的內容, SearchCriteria 這個物件直到 
Builder的build() 執行後才產生,所以它生出來的是 immutable !
 
 
這個知識本來從沒聽過,在換工作後,和高手一起工作時,經過他的提點再自己google
仔細了解才體會這個pattern !

 

2012年10月10日 星期三

Eclipse shortcut


ctrl + shift + r  => 找出想開啟的檔案
ctrl + e  =>開啟編輯區的檔案列表
ctrl + pageUp/pageDown => 切換編輯區的檔案
alt + 左/右 => 切換編輯歷程

ctrl + t => 秀出實作樹狀
ctrl + d =>刪除一行
ctrl + m =>將編輯區最大化及還原
ctrl + F11 =>再次執行上次執行的程式

ctrl + / =>單行註解
ctrl + shift + / =>將mark處多行註解
ctrl + shift + \ =>將mark處多行註解取消
ctrl + shift + p  => 對應的大括號
ctrl + shift + o  => 自動import lib
ctrl + shift + f =>code排版
ctrl + shift + g =>找出使用該method或變數的地方

shift + F2 =>看javaDoc

F3 =>秀出變數宣告處
F4 =>秀出 type 階層

alt + shift + z => 產生try catch區塊

2012年8月16日 星期四

看MLB學英文

今天牛奶小子被證實使用睪固酮就禁賽50場

MLB官網的新聞:

Giants' Cabrera receives 50-game ban

Melky banned 50 games for testosterone use

 球迷留言:Melky you idiot. 你真是笨ㄚ~或是罵法: 你是白癡喔~或不忍苛責:你真糊塗

 ban

  1. 禁止; 禁令[C][(+on/against)]
    The police lifted the ban against parking in this street. 警察取消了不准在這條街上停車的禁令。

    We have put a ban on smoking. 我們已禁止吸煙。
 idiot
  1. 白癡
  2. 傻瓜, 笨蛋, 糊塗蟲
    He was an idiot to lose his glasses. 他是個糊塗蟲把自己的眼鏡也丟了。


    PS .很諷刺的水手王牌投手-(King) Felix Hernandez,今天投出Perfect game 。牛奶為什在國內會紅,是當時王建民在NY時他也在,所以台灣有看MLB應該都認識,況且這幾年他又猛到誇張還是今年明星賽的MVP,所以才被懷疑有用禁藥 ! 最後還是被驗出~他也承認...

COVID-19 確診經歷紀實

原本以為真的是天選之人,就算先前家裡兩個小孩都確診都逃過了(可能有中獎但無症狀吧),不過就在2023年六月18日破解自認為天選之人的"心態",為什麼可以確認就是這天中獎的呢?因為在前都是居家上班,到人多的室內場所都會戴口罩,就剛好這天傍晚原本只想說要去附近的國...