Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Maven 在 Java 世界內歷史很久,可以說是一種標準了。但基於 Groovy 這 Script Language 的 Gradle 出來後身邊愈來愈多人/案子開始用 Gradle 而不是 Maven, 所以這次想寫寫從 Maven 到 Gradle 的感受。

懶惰

Groovy 本來就是一種很好理解,也很方便使用的 Script Lanuage 所以在 Gradle 身上也繼承了它的優點,我們先看看一個比較:


上面是 Gradle 的 Dependencies 下面是 Maven 的,可以發現差不多的設定雖從56行精簡到13行,對於懶惰的我真的是很方便。而且它還可以寫成
compile("org.slf4j:slf4j-api:1.7.+")
這樣它就會自動抓 1.7.x 的版本,類似的還有 last.release 之類的想知道詳細用法可以看看官方文件或留言問我噢 ~

跟 Maven 相容 

這也是很重要的一點,在 Gradle 的設定中我們可以發現


這樣的東西,表示 Gradle 是可以直接使用 Maven 的 Repositories 來載 Library。這樣放在公司私人 Nexus Server 或自己平常用的 Maven Library 通通都可以無痛拉到 Gradle 用 :目

另外很多 Maven 人困惑的問題是,我用 Gradle 做出來的東西可不可以上載到 Maven Repo 給其他人用?

答案是完全可以的,只需面加個 maven plugin 跟設定上載的 gradle task 就可以了,像這樣 :

自訂 Task  

在 Gradle 我們可以把一些日常會做的事變成一個 Gradle Task,Gradle 也提供很具彈性的語法來讓我們去做不同的變態事情 XD。

這邊是一小段 A 回來的 Code, 它的用途是 build 的時候會把 war 檔 deploy 到測試服務器運行 ( 懶惰 +1)

而且也直接兼容 Apache Ant 的,但我沒在用這東西所以沒辦法寫太詳細關於這 Part XD

總結

Gradle 很有潛力,也許未來會是一個趨勢去慢慢代換 Maven 的工具,他除了上面幾提到的還有很多很多用發像可以接照 Build (Testing, Production, Release) 的類形去讀不同的設定檔這樣,自動產生 Java 文檔再上傳到伺服器給同事看, etc... ( 又可以更懶惰了 誤 ) 我也在慢慢去發
掘不同的用發 XD 所以大家也可以投放時間玩玩看一齊學習 ~


Twitter 的推文其實可以提供很大的價值,我們可以透過分析 Twitter 的推文來了解預測趨勢,指標。就像在 Google I/O 2014 用過它來分析進球跟球迷的心情關係,也有電影公司用 trailer 的分享數加上文章的內容來預測票房收入。

那今天我們會介紹 Twitter 的 Stream API 配合一個 Java Library "Twitter4j" 就可以讓我們很簡單來使用這座資料金礦。

第一步,先要取得權限來使用 Twitter 的資料。但別擔心只要你有 Twitter 帳號就可以了, 先在這連結 https://apps.twitter.com/ 建立一個新的 Twitter App 。 他會要輸入 Name, Description, URL 隨便打就好了 。

成功後我們可以來到控制面板的 Keys and Access Tokens ,建立一個 Access Token 。然後抄下四樣東西 Consumer Key, Consumer Secret, Access Token, Access Token Secret 就可以開始開發了。

以下的教學會使用 Maven 和 IntelliJ IDEA。如果你們是用其他像是 Eclipse 有不懂可以再留言問吧

1. 接 New Project > Maven > 輪入資料 > 選擇儲存位置,來建立一個新專案

2. 成功後應該會有以下的東西










3. 修改 pom.xml 加入以下 Dependency (就是要用到的 Library 啦 )
 <dependencies>

        <dependency>
            <groupId>org.twitter4j</groupId>
            <artifactId>twitter4j-core</artifactId>
            <version>4.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.twitter4j</groupId>
            <artifactId>twitter4j-stream</artifactId>
            <version>4.0.2</version>
        </dependency>

    </dependencies>
4. 開個普通的 Java Class, 然後看 Source code 吧 ˊ_>ˋ




























5. 當你興奮的去跑他的時候 ⋯⋯ 你是不會成功的 java.lang.IllegalStateException: Authentication credentials are missing. 科科。因為還沒在提供剛才抄下的 Twitter 認證啦

6. 在 src/main/resources 建立一個新檔案名為 twitter4j.properties 以下面的格式填寫
debug=true
oauth.consumerKey=xxx
oauth.consumerSecret=xxx
oauth.accessToken=xxx
oauth.accessTokenSecret=xxx
把 xxx 換成對應的資料

7. 現在己經可以順便取到 Twitter 的 Stream 了囉

















完,謝謝大家家收看。

這是一個很常用的Pattern, 用來確保你的Class 只會有一個 instance. 然後其他地方就可以存取這個 instance 取到同樣的資料.

Class Diagram










Sample Code
/**
 * Created by Gary on 1/25/14.
 */
public class Singleton {
    private static Singleton instance;
    private Singleton(){
        // Initializing
    }
    public static synchronized Singleton getInstance(){
        if(instance == null)
            instance = new Singleton();
        return instance;
    }
    // Other Method...
    public void doSomething(){
     
    }
}

Call
Singleton.getInstance().doSomething();

例子:
這有一個倉庫只會存可樂, 一開始有100罐取完就沒.

倉庫
/**
 * Created by Gary on 1/25/14.
 */
public class WarehouseService {
    private static WarehouseService instance;
    private int coke;
    private WarehouseService(){
        coke = 100;
    }
    public static synchronized WarehouseService getInstance(){
        if(instance == null)
            instance = new WarehouseService();
        return instance;
    }

    // Return true if coke enough.
    public boolean getCoke(int qty){
        if(coke >= qty){
            coke -= qty;
            return true;
        }
        return false;
    }
 
    // Return current coke qty.
    public int getRemain(){
        return coke;
    }
}

取東西的人
/**
 * Created by Gary on 1/25/14.
 */
public class Customer {
    // Get Coke
    public Customer(String name, int cokeQty){
        String status = WarehouseService.getInstance().getCoke(cokeQty) ? "Success" : "Fail";
        System.out.println(name + " get coke " + status);
        System.out.println("Coke remain : " + WarehouseService.getInstance().getRemain());
    }
}

測試
/**
 * Created by Gary on 1/25/14.
 */
public class TestSingleton {
    public static void main(String[] args){
        new Customer("Crab", 10);
        new Customer("Gary" , 90);
        new Customer("Crab" , 10);
    }
}

結果
Crab get coke Success
Coke remain : 90
Gary get coke Success
Coke remain : 0
Crab get coke Fail
Coke remain : 0







Linked List Object

/*
 * Basal linked list class
 *
 * Constructor :
 * LinkedList()
 *
 * Including method :
 * add(int, Object), addCount(int), addToHead(Object), addToTail(Object),
 * count(), get(int), getHead(), getNode(int), getTail(), isEmpty(),
 * remove(int), removeFromHead(), removeFromTail(), setHead(Node),
 * set(Tail(Node), toString()
 *
 * Gary Wong
 *
 */

LinkedList.java
Node.java
1. 註解

//單行註解
/*
區段註解
*/

2. 引用其他Package

例子 引用 java.lang.* , 其中*不是一個物件只是表示引用所有在java.lang裹的物件
import java.lang.*;


先安裝好所需要的 JDK 和 JRE
http://www.oracle.com/technetwork/java/javase/downloads/index.html

開一個文字檔 另存為 Hello.java 內容如下 :


public class Hello{
public static void main(String[] args){
System.out.println("Hello Java");
}
}