只放拖鞋的鞋櫃

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。

閱讀全文 >>

在 Android 上要儲存檔案經常會用到 Internal 或 External Storage,對部分的應用程式來說,常見的需求是「把檔案存到 SD card」。

從結論來說,Android 並沒有 SD card 這樣的概念,External Storage 也不一定是外接式儲存裝置。先有這樣的認知,接著就可以問以下幾個問題

  • 有哪些 Storage 可以用?
  • Context 與 Environment 有哪些 Storage 的 API 可以用?
  • 有怎樣的權限問題?
閱讀全文 >>
Next →