只放拖鞋的鞋櫃

先講結論:這些 functions 目的是希望,執行程式碼裡面的 function literal 的時候有更好的可讀性。

Function identifier return value
let it last line of literal
run this last line of literal
also it this
apply this this

Let it Run this literal, it Also Apply this

這是我背誦記憶的口訣:Let 用 it,Run 用 this,都是回傳 function literal 最後一行的值。Also 用 it,Apply 用 this,都是回傳 this

閱讀全文 >>

This function might be the most useful one in my own scripts, and I had introduced it for several times.

Let’s say you are working in a big project such as Android Framework, or your are a command-line heavy user. The change-directory-command, cd, would be typed thounsands times per day. THAT IS SO ANNOYING!.

Try adding this function to ~/.bashrc

閱讀全文 >>

長話短說,可以用 ffmpeg 做到一些簡單的影片編輯功能,好比說

把 input.mp4 裡面 00:24:32 到 00:29:34 這段時間的影像擷取出來

1
$ ffmpeg -i input.mp4 -ss 00:24:32 -to 00:29:34 -threads 2 -y clip001.mp4

從一張圖片產生一個長度 15 秒的影片,同時把尺寸轉為 1280x720

1
$ ffmpeg -loop 1 -i image.png -t 15 -vf scale=1280:720 -pix_fmt yuv420p -y image.mp4

將一個完全沒有音軌的影片,塞入 15 秒的無聲音軌,指定頻率為 48000 Hz。

1
$ ffmpeg -f lavfi -i anullsrc=r=48000 -i image.mp4 -t 15 -c:v copy -c:a aac  -y silent.mp4

接著把幾個 mp4 檔接成一個檔案,先把它們都轉成 ts 檔,最後再接回 mp4 檔

1
2
3
4
5
6
7
$ ffmpeg -i clip0.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts -y clip0.ts
$ ffmpeg -i clip1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts -y clip1.ts
$ ffmpeg -i clip2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts -y clip2.ts

$ ffmpeg -i "concat:clip0.ts|clip1.ts|clip2.ts" -c copy -bsf:a aac_adtstoasc -y output.mp4

$ rm clip0.ts clip1.ts clip2.ts
閱讀全文 >>

最近公司做的產品,收到來自外面鄉親貢獻的 PR,想起了這個被自己遺忘很久的東西,趁著再次補起記憶的時候,順便做一點紀錄。

簡單來說就是 Java 的 Nested class 盡量寫成 static 比較好。至於為什麼比較好,也許就要多花點功夫來了解。

閱讀全文 >>

比起各種政治立場或是國族認同,我覺得最能夠找出共識的議題應該就是環保了(好吧,雖然還是會有些科學的爭議)。姑且不論層次比較高的空汙、能源議題,若能夠隨手做一點小事來降低對生態的衝擊,也不是一件壞事。

這篇文章記錄了我在日常生活中會做的一點小事,成本不高,希望能給你參考之後一同來試試看,簡單來說就是

  • 減少使用塑膠袋,盡量隨身攜帶重複使用
  • 出門自備筷子與手帕
  • 想買飲料來喝,就自備罐子與吸管

上述除了第三點可能稍微有點麻煩之外,一二點都是很自然就能做到的小事了

閱讀全文 >>

ConstraintLayout 是 Support Library 裡面新增的一個 ViewGroup,從功能上來看非常強大,效能上不輸、甚至贏過傳統的 Layout。因為放在 Support Library 裡面,幾乎市面上所有的手機都相容,就放心使用吧。

以往在建構複雜的畫面時,經常是 LinearLayout 與 RelativeLayout 等等相互組合,拼湊出相當深且複雜的樹狀 xml。略懂 View render 過程的都知道,效能就在深邃的遞迴之中持續消耗。改用 ConstraintLayout 取代傳統 Layout 的複雜組合,把 xml 檔變得更加扁平,效率很容易就能提升。

粗看 ConstraintLayout 會覺得跟 RelativeLayout 有點像,其實它還能做到很多 RelativeLayout 做不到的事情。以下就稍微簡介 ConstraintLayout 的安裝與使用。

閱讀全文 >>

多人開發的場合,大家寫程式的習慣用法往往不一樣。除了實作上的思維不同,在所難免,至少在程式碼風格上可以一致。

不同的語言有不同的 coding style,在 Java 裡面我通常就是參考(以前是 Sun Microsystems 現在是 Oracle) Code Conventions for the Java TM Programming Language。隨著開發時間的拉長,遞交程式的數量變多之後,總是會有幾次忘記加上空白之類的小瑕疵,這種檢查理當交給程式去做。

雖然寫程式沒有 freestyle,但是我們有 checkstyle

閱讀全文 >>

當我們需要一張圖片,慢慢交錯顯示出另外一張圖片的時候,經常使用 TransitionDrawable。繼承自 LayerDrawable 的 TransitionDrawble 的實作,則是在 onDraw 的時候只拿前兩張來交換顯示。

實務上使用時,需要交換顯示的圖片往往不只兩張,這時候就需要一點取巧的做法。

閱讀全文 >>

在 Android 上面想要做兩三個 Tabs,並且希望透過左右滑動切換 Tab 的時候,通常就會用到 ViewPager。若希望每個 Tab 都是一個獨立的 Fragment,我們能使用 FragmentStatePagerAdapter。只是這個 Adapter 的使用方法跟 ListView 或 RecyclerView 的 Adapter 有點不一樣,一不小心就會踩到洞。

測試的方法也不難,只要進到系統設定裡面的開發者選項,把 Don’t keep activties 打開便能測試。就我自己的經驗,在 MainActivity 用了 ViewPager 顯示幾個 Fragments,打開一個新的 Activity 觸發系統將 MainActivity 砍掉,接著回到 MainActivity 的時候就能發現,所有的 View 都是 null。

閱讀全文 >>
Next →