2014年4月29日

Book: "Java 8 Lambdas" By Richard Warburton, O'Reilly

Java SE 8 帶來全新的 Lambda 語法,也是這次新版最重要的新功能,Lambda 讓 Java 語言更容易開發平行運算應用程式碼,充分利用現代電腦多核心處理的威力。Lambda 語法可簡化過去採用匿名類別(Anonymous Class)的設計,更簡潔的語法能提高可讀性。

比學習新語法更重要的事情,就是先熟悉函數型程式設計(Functional Programming)的觀念。函數型介面(Functional Interface),例如常見的 Runnable 與 Comparator 等,在 Java 8 可以改用 Lambda 的語法,取代過去匿名類別的寫法,以 Runnable 介面為例:

new Thread(new Runnable() {
    public void run() {
        System.out.println("Run!");
    }
}).start();

可以用 Labmda 語法改寫:

new Thread(() -> {
    System.out.println("Run!");
}).start();

Comparator 類別改用 Lambda 語法改寫,更容易看出語法的簡潔。

Collections.sort(users, (User u1, User u2) -> u1.id.compareTo(u2.id));

如果只把 Java 8 的 Lambda 當作語法糖衣,那麼也許不需要大費周章學習它,但是作者 Richard Warburton 仍寫一本專書介紹 Lambda,目的是幫助有這些需求的學習者:
  1. 想撰寫更簡潔的程式碼,特別是針對集合(Collections)的處理。
  2. 用平行處理的做法提升效能。
  3. 建立更好的 DSL 領域描述語言。
  4. 學習 Lambda 語法的測試與除錯。
Lambda  本身只是一種新的語法,即使不用它同樣能完成 Java 程式功能。但是過去的經驗中,不難發現 Java 程式碼在平行世界變得複雜難懂,造成維護的不易,函數型程式設計的觀念也不容易妥善實踐。

程式語言帶給設計者不僅止語法,而是包含蘊含的觀念。支援 Lambda 語法的 Java 8,可以說是正式將函數型程式設計的觀念,一步步傳遞給程式設計師。

作為一本 Lambda 入門書, 這本 Java 8 Lambdas 擁有接近五顆星的高評價,透過清楚的程式範例與易懂的說明,可以幫助學習者省下不少時間花費。

Buy Java 8 Lambdas from O'Reilly

2014年2月28日

Book: "Java EE 7 Essentials" By Arun Gupta, O'Reilly

Java Platform Enterprise Edition(簡稱 Java EE)的最新版本 Java EE 7 增加不少新功能,例如:
  1. Java API for WebSocket(WebSocket 1.0)
  2. Java API for JSON Processing(JSON-P 1.0)
  3. Batch Applications for Java Platform(Batch 1.0)
  4. Concurrency Utilities for Java EE(Concurrency 1.0)
  5. Java API for RESTful Web Services

為滿足新的 Web 開發需求,我們需要先認識 Java EE 7 有哪些合適的功能,在未來適當時機可以應用,如此才能儘早讓手邊的專案做好準備。

例如 Java EE 7 開始提供 WebSocket 的支援,這也是許多現代 Web 開發必要的支援,看起來新版本很美好。

很多專案仍停留在古老的 Java EE 5 階段,開發者甚至還來不及瞭解 Java EE 6,也可能還沒開始使用 Tomcat 7.0。

現在又要認識新的 Java EE 7,開始試用支援 Servlet 3.1 的 Tomcat 8.0,我們需要一份好的指南,介紹 Java EE 7 帶來哪些新功能?要如何使用?最好還能有些實際範例,這本書可以減少學習所需的時間,用較快的方式瞭解 Java EE 7。

作者 Arun Gupta 是 Oracle 的技術傳道士,他曾寫過「Java EE 6 Pocket Guide」,新書比較起來厚度更多(頁數增加近80%),內容也談得更詳細。

在 GitHub 取得這本書的範例程式碼

Buy "Java EE 7 Essentials" from O'Reilly。

2014年2月25日

使用 youtube-dl 備份 YouTube 影片,解決 1080p 高畫質影片無法下載問題

YouTube 近期有些改變,有許多影片備份軟體,無法正常下載 1080p 解析度以上的高畫質影片。這個問題並不是 YouTube 增加防堵措施,而是新的高畫質影片採用 MPEG-DASH 格式,影片與聲音檔案分開提供,所以過去的下載方式已不管用。

為了解決影片備份的問題,本篇介紹用「youtube-dl」與「mencoder」兩個工具來達成任務。

Mac OS X 可以使用 HomeBrew 安裝需要的軟體(mplayer 內建 mencoder 工具)。

brew install youtube-dl
brew install mplayer

Ubuntu 使用 APT 安裝:

apt-get install youtube-dl mencoder

假設要備份的 YouTube 影片網址是:

http://www.youtube.com/watch?v=VIDEO_ID

使用 youtube-dl 工具

先使用 -F 參數查詢有哪些格式可下載。

youtube-dl -F http://www.youtube.com/watch?v=VIDEO_ID

清單範例如下:

Available formats:
22 : mp4 [1280x720]
18 : mp4 [640x360]
43 : webm [640x360]
5 : flv [400x240]
36 : 3gp [320x240]
17 : 3gp [176x144]
137 : mp4 [1080p] (DASH Video)
136 : mp4 [720p] (DASH Video)
135 : mp4 [480p] (DASH Video)
134 : mp4 [360p] (DASH Video)
133 : mp4 [240p] (DASH Video)
160 : mp4 [192p] (DASH Video)
140 : m4a [128k] (DASH Audio)
171 : webm [128k] (DASH Audio)

可以看到 1080p 高畫質影片僅有 DASH Video 格式,代碼是 137,128k 的聲音檔(m4a)代碼則為 140。

先下載 1080p 的影片檔。

youtube-dl --no-playlist --max-quality 137 http://www.youtube.com/watch?v=VIDEO_ID

再下載 128k 的聲音檔。

youtube-dl --no-playlist --max-quality 140 http://www.youtube.com/watch?v=VIDEO_ID

直接下載的影片檔,某些播放軟體可以開啟,但是聲音檔需要另外指定,這樣並不方便。

使用 mencoder 合併影片與聲音

使用 mencoder 工具可以合併影片與聲音檔案,輸出成大多數播放軟體可以支援的 MP4 格式。

mencoder -oac copy -ovc copy -fafmttag 0x706d -of lavf -lavfopts format=mp4 VIDEO.mp4 -audiofile VIDEO.m4a -o VIDEO-MERGED.mp4

搭配 ffmpeg 自動合併影片與聲音

(感謝 Grey Lee 補充這個更簡單的方法)

先安裝 ffmpeg 工具。

brew install ffmpeg

使用 -f 137+140 下載 mp4 及 m4a 後自動使用 ffmpeg 合併檔案。

youtube-dl -f 137+140 http://www.youtube.com/watch?v=VIDEO_ID

暫時不用煩惱 YouTube 高畫質影片無法備份的問題了 : )
lyhcode by lyhcode
歡迎轉載,請務必註明出處!