echo Impossible|sed 's/Im/To be /'

February 26, 2017

ffmpeg - edit video by ffmpeg

Edit vide by ffmpeg

Date:<2017-02-28 Tue 12:51>

演講被要求 Demo 採錄影的方式呈現。最後用 audacity 錄音,ffmpeg 剪輯及混音,留個記錄給未來的自已查詢。

# 影片切段 Split/Trim video using FFmpeg
$> ffmpeg -ss 00:00 -t 00:18.7 -i input.mp4 -vcodec copy -acode copy output.mp4

# 多影片合併 Merge video files and convert to desired formats
$> cat flist.txt
file './s1.mp4'
file './s2.mp4'
file './s3.mp4'
$> ffmpeg -f concat -safe 0 -i flist.txt -c copy output.mp4

# 除去影片聲音
$> ffmpeg -i input.mp4 -vcodec copy -an output.mp4

# 取出影片聲音 | aac 或 mp3 由影片原始檔案決定
$> ffmpeg -i input.mp4 -acodec copy -vn output.aac
$> ffmpeg -i input.mp4 -acodec copy -vn output.mp3

# 匯入音軌
$> ffmpeg -i input.mp4 -i in.aac -map 0:v -map 1:a -bsf:a aac_adtstoasc -c copy output.mp4
$> ffmpeg -i input.mp4 -i in.mp3 -map 0:v -map 1:a -c copy output.mp4

# 重新壓製 (encode)
$> ffmpeg -i input.mp4 -c:v mpeg4 -b:v 20000K -acodec copy output.mp4

# other 影片旋轉
$> ffmpeg -i input.mp4 -vf vflip output.mp4
$> ffmpeg -i input.mp4 -vf hflip output.mp4

# PIP Picture in Picture with FFMPEG
$> ffmpeg -y -i main.mp4 -i overlay.mp4 -filter_complex \
"[1]scale=iw/4:ih/4 [pip]; [0][pip] overlay=main_w-overlay_w:main_h-overlay_h" \
-c:a aac -c:v mpeg4 -b:v 20000k -r 30 output.mp4

發現 2 秒的影片接上 120 秒的聲音,影片會停在最後的畫面直到聲音撥完。猜測應該可以用圖檔配 mp3。

各段影片中的聲音格式不可以混用,例如前面用 mp3 之後接 aac,這會造成後面接的聲音無法解析。

February 13, 2017

Emacs - fixed problem ansi-term work with top/less/more

Emacs - fixed problem ansi-term work with top/less/more

一直以來我在 Emacs 的 ansi-term 模式下使用 top/less/more 時一直有頂端少了幾行的問題。如下圖所示:

ansi-term problem

今天有空追查了 term.el 後才終於搞懂問題。由於之前設訂了行距,致使 term 的行數計算錯誤導致,其設定如下:

(setq-default line-spacing 5) ;; 修改行距

解決的方式有二個可供選擇,(1) 設定 term-mode-hook 在啟動 term-mode 時把當時 term buffer 行距設為 0 ,這應該是最簡便的解法,在 init.el 加入以下設定:

(add-hook 'term-mode-hook (function (lambda () (setq line-spacing 0))))

(2) 覆寫 term-check-size function 協助校正終端機高度 (term-height)。這樣作可以保有修改行距的權力, 但校正值的選擇我目前用嘗試錯誤的方法自行測試校正,高度校正值我是用 window-text-height 與行距的比例來作調整,事實上這個算式需包含字高的設定才行。

(defun term-check-size (process)
  (let ((height-adjust (/ (window-text-height) 5))) ;; Modify 5, range is 5~40, Please try and error.
    (when (or (/= term-height (window-text-height))
          (/= term-width (term-window-width)))
      (term-reset-size (- (window-text-height)  height-adjust) (term-window-width))
      (set-process-window-size process term-height term-width))))

方法各有優缺點,不熟 emacs-lisp 建議用方法(1)。

ansi-term ok

July 25, 2015

Emacs Copy/Paste work with clipboard of X Server.

Emacs Copy/Paste work with clipboard of X Server

工作上常需要 Emacs 與 X Server 相互 Copy/Paste 文字,為了暸解這功能搞了幾天。

xsel man page

The X server maintains three selections, called PRIMARY, SECONDARY and CLIPBOARD. The PRIMARY selection is conventionally used to implement copying and pasting via the middle mouse button. The SECONDARY and CLIPBOARD selections are less frequently used by application programs. This program operates on the PRIMARY selection unless otherwise specified.

By default, this program outputs the selection without modification if both standard input and standard output are terminals (ttys). Otherwise, the current selection is output if standard output is not a terminal (tty), and the selection is set from standard input if standard input is not a terminal (tty). If any input or output options are given then the program behaves only in the requested mode.

If both input and output is required then the previous selection is output before being replaced by the contents of standard input.

實際上 X server 有三個 selections, 名稱為 PRIMARY, SECONDRY, CLIPBOARD. 用在滑鼠中鍵的稱為 PRIMARY,應用程式用多為 CLIPBOARD 與 SECONDARY。

Copy from X-window, Paste to Emacs

Emacs paste text from Clipboard

透過 X-window 的剪貼簿貼文字:

(x-clipboard-yank)
or
(insert (x-get-selection 'CLIPBOARD))

綁定組合鍵:

(global-set-key (kbd "C-x C-y 1") 'x-clipboard-yank)

Emacs paste text from PRIMARY

透過滑鼠標記後貼文字:

(mouse-yank-primary 1)
or
(insert (x-get-selection 'PRIMARY))

綁定組合鍵:

(global-set-key (kbd "C-x C-y 2") (lambda () (interactive) (mouse-yank-primary 1)))

Copy from Emacs, Paste to X-window

Emacs copy text to Clipboard

請參考以下兩個 URL

xclip-mode 用了二年多快,近來常用 TRAMP mode (Transparent Remote Access, Multiple Protocols) 遠端 edit/coding。 但 xclip-mode 與 TRAMP mode 是互斥的,後改用 yank-to-x-clipboard 在有需要時在 copy 到 Clipboard 後使用。

Emacs copy text to PRIMARY

X-window 下的 emacs 只要 mark 標註一段文字,就會自動複製到 PRIMARY。其中的文字之後用滑鼠中鍵就可以貼上。

May 16, 2015

Sed del lines from file tail

Sed 删除檔案最後幾行

Sed 在自動編輯與刪行上非常便利簡便,但要砍檔案末幾行,用 sed 實在想不出比較好的方法。

最後請出 tac 來解決問題。如果您有更好的方法,還請讓我知道,感謝。

$> tac /etc/passwd | sed '1,5d' | tac

May 16, 2015

Emacs lisp exception

Emacs Elisp 例外處理

網路上找到了二篇 Elisp exception 相關的 blog.

result

(let ((result (ignore-errors
                (error "Failed")
                t)))
  (unless result
    (message "action exception")))

condition-case

(condition-case err-var
    (progn
      (error "Failed"))
  (error "Error: %s" err-var))

unwind-protect

(ignore-errors
  (unwind-protect
      (progn
        (error "hoge"))
    (message "This code is must executed!!")))

May 08, 2015

Emacs Recursion in lambda in Elisp

Emacs Elisp 在 lambda 下使用 Recursion

Recursion 是 lisp 的天性,習慣後也愛上它的簡捷便利。但在 lambda 下如何作 Recursion 還真不知如何下手。

Stack Overflow - emacs - Recursion in lambda in Elisp 找到 labels [1] 這個線索,細看後謎團也就解決了。

Example

(message (format "%s"
(cl-labels
    ((my-ranges (s e sp)
                (if (< s e)
                    (cons s (my-ranges (+ s sp) e sp)))))
  (my-ranges 1 11 2))))

Message OutPut: '(1 3 5 7 9)
[1]Emacs 24.3 之後建議改用 cl-labels

May 04, 2015

Emacs Elisp script

用 Emacs lisp 當 script language

與 Emacs 相處越久,越習慣 elisp 後,漸漸把常用的工具也 elisp 化。底下簡單記錄幾個入門用法。

Elisp with arguments

$> cat elisp-argv.el

#!/bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(princ (format "hello %s!\n" argv))
(while argv
  (princ (format "Hello %s!\n" (pop argv))))

$> chmod +x elisp-argv.el
$> ./elisp-argv.el lloyd huang
hello (-- lloyd huang)!
Hello --!
Hello lloyd!
Hello huang!

Elisp with standard input

$> cat elisp-stdin.el

#!/bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(let (line)
  (while (setq line (ignore-errors (read-from-minibuffer "")))
    (princ (format "--> [%s]!\n" line))))

$> chmod +x elisp-stdin.el
$> cat /etc/passwd | ./elisp-stdin.el
--> [root:x:0:0:root:/root:/bin/bash]!
--> [bin:x:1:1:bin:/bin:/bin/false]!
skip ...

Elisp enable debug mode

$> cat elisp-debug.el

#!/bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(setq debug-on-error t)
(typo-err)

$> chmod +x elisp-debug.el
$> ./elisp-debug.el
Debugger entered--Lisp error: (void-function typo-err)
  (typo-err)
  eval-buffer(#<buffer  *load*> nil "elisp-debug.el" nil t)  ; Reading at buffer position 118
  load-with-code-conversion("elisp-debug.el" "elisp-debug.el" nil t)
  load("elisp-debug.el" nil t t)
  command-line-1(("-scriptload" "./elisp-debug.el" "--"))
  command-line()
  normal-top-level()

Elisp exit

$> cat elisp-exit.el

#!/bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(princ "hi all 1")
(kill-emacs)
(princ "hi all 2")

$> chmod +x elisp-debug.el
$> ./elisp-exit.el
hi all 1

August 31, 2012

COSCUP2012: How to write a bash script like the python?

如何撰寫 bash script 讓它擁有 python 語法上的特性?


增加一個習慣讓 bash script 如同 python 一樣,本身既是單一程式也是其它人的模組 module,方便其它人再引用 reuse 以及作單元測試 unit testing。

借由一個 import.sh 的實作,讓 bash script 擁有 python 以下幾個重要的語法特性

  • import (import module)
  • from (import function from module)
  • del (del module)
  • help (docstring)

黃宇新 ( lloyd huang ) 1998 年進入 Coventive ,目前在 IA 部門從事 embedded Linux 的工作,是個好吃鬼,喜愛義式咖啡,最大的榮耀是曾經擁有一台無敵的 TP240,以及一群 KaLUG 的好朋友。


緊張刺激驚險萬分

在 COSCUP 上台前的一個多小時,laptop 突然無法正常投影,1xx 天沒重開機遇到 check and repair filesystem, 之後的是 X window 起不來,搞的驚險緊張萬分。謝謝 timchen119 使徒提姆@Python 及 Roxane 奔走幫忙, 小菲 的加油打氣。

特別感謝 qerter 的火力支援,出借 laptop 確定簡報可以投影,整個過程緊張到慌了手腳,不知道在作什麼,連思考下一步都有問題。在確定有備案的情況後,焦慮的心安定下來,在台上兩位講者接力下的一小時空擋內,順利修好機器後上台。

上台後,畢竟還是受了影響,幾個埋好的梗忘了抖,Live Demo 結尾亂了手順,可惜漏了二項沒亮。事後回顧 IRC log 上的討論,會眾反應看來不惡,感謝捧場,希望還有機會可以回收在講一回。:-)

本次的 簡報 , 範例import.sh.gz 在此請自行取用,謝謝。

How to write a bash script like the python? from Lloyd Huang

17:01 <Rxa> Python 三聯法orz
17:01 <txs> Python 很棒呀 (L)
17:01 <sx_> r0 我今天這個題目看起來是講bash, 其實是講 python
17:01 <cxi> [r0] 這是在逼人學派森啊 >.<
17:01 <zxr> python和js甚麼時候關係變得這麼好
17:02 <sxy> 今天好幾場java script跟python都變成好朋友
17:03 <Rxa> 今天真的是Python Loop......
17:08 <cx2> /dev/null
17:08 <exn> 為什麼是 return 2?
17:08 <kx6> [r0]這與法太噁心了
17:08 <dxx> 其實把東西倒到 /dev/null 不會覺得噁心耶 :|
17:08 <sxy> 他都說很難懂了啊
17:09 <lxq> exn: 因為只有執行 return 阿
17:09 <dxx> python 讓我飛上天了~
17:09 <Rxa> [r0]因為python我會飛
17:09 <Rxa> XDDD
17:09 <lxq> 然後 stderr 倒掉而已
17:09 <exn> lxq: 我的意思是 return 1 > /dev/null 這樣應該也行吧?
17:09 <lxq> 不是 return 2
17:10 <lxq> return > /dev/null 應該也型
17:10 <ix7> std err
17:10 <Sxy> 今天 PyCon 內容真豐富(?)
17:10 <lxq> 喔
17:10 <ixo> stdout & stderr
17:10 <lxq> 但是
17:10 <dxx> PyCUP (?
17:10 <exn> lxq: hmm 害我想半天為啥要寫 2 XDDD
17:10 <lx2> return 2> /dev/null 才是對的,因為 return > /dev/null 的話搞不好實際上有執行
17:10 <lxq> 但是你不知道
17:11 <lxq> 不是只是要顯示而已,把 function 裡面都改成 rm 你就懂了
17:11 <Kxo> 今年python大舉入侵XD
17:11 <Sxy> Python 101
17:11 <lxq> 今年是 Python 年!
17:11 <lxq> 明天歡迎到 Python Taiwan 攤位聊聊 :)
17:11 <sxc> 今年Python 好多
17:14 <Jxn> [r0] help最不好做!!
17:14 <yxc> pydoc rules
17:15 <axm> 擁有了import的力量 感覺好威
17:15 <dxx> cool!
17:16 <sx_> [r0] 通常用忘記更多來學習更多
17:16 <kxs> lloydhuang 把 import.sh 講得我都想學 python 了 XD
17:17 <dx_> 為什麼你會飛
17:17 <cxp> ←討厭寫 shell script 的 zsh user orz
17:18 <dxx> zsh 覺得太複雜了...
17:20 <jxh> 天瓏攤位還在嗎?等下去搬書
17:21 <sxy> 搬python嗎
17:21 <axm> 這次好多Live DEMO
17:24 <kxs> [r0] 連三場 live demo & py
17:28 <exn> [R0] QA
17:28 <sx_> import gf
17:28 <bxy> #import all...
17:29 <dxx> from python import * (誤
17:29 <Jxn> [r0] end

May 16, 2011

Tip. Telnetd inetd bind IP address

Telnetd 如何 bind IP address


近來在 Linux 上開 vserver 開很兇,而有些沒有辦法聽 IP address 的服務,在 vserver 上會造成管理上的問題。 要在設定上想辦法讓它只聽或綁特定的 IP address。


Telnetd 透過 inetd.conf 的設定,可以只聽特定的 IP address,設定方法如下。其它相關的服務也可比照辦理。

cat /etc/inetd.conf | grep in.telnetd

127.0.0.1:telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd

December 22, 2010

Tip. PDF watermart

在 PDF 上加浮水印


最近寫文件比寫 code 多。自從用了 ReStructuredText 配合 Trac 後更是大大便利,兼顧 wiki 共筆網頁方便瀏覽的特性以及 Latex PDF 文件印刷美觀輸出,只要訂好 Latex 格式,輸出品質絕不輸 MS Word Office.


這幾日為了在文件上加上浮水印 (watermark) ,花了點時間 google 爬網。得到了兩個作法。

  1. 由 Latex 直接印上浮水印,生成 PDF。
  2. 後製作,在即有的 PDF 上透過列印或程式合成製作有浮水印的 PDF。

兩種方法各有優點,在測試過考量作法及用途後,最後採用第二種方法,而用的工具則是 pdftk 。輸出結果如下,如你所見, 一種是以背景方式出現,但會被圖蓋過去。另一種是戳印,但會把字及圖直接蓋掉。

$ pdftk INPUT.pdf background Watermark.pdf output OUTPUT-1.pdf  # background 背景
$ pdftk INPUT.pdf stamp Watermark.pdf output OUTPUT-2.pdf       # stamp 戳印

wm1 wm2

看了幾個範列大部份的都採用背景方式出現,浮水印就讓圖蓋過去。但無意中我抓到了這個浮水印圖檔 logo.pdf ,它打開了我一線曙光。

$ pdfinfo logo.pdf
Title:          NCTU LOGO_10
Creator:        Adobe Illustrator CS2
Producer:       Adobe PDF library 7.77
CreationDate:   Mon Jul 27 17:07:13 2009
ModDate:        Mon Jul 27 17:11:55 2009
Tagged:         no
Pages:          1
Encrypted:      no
Page size:      107.49 x 105.676 pts
File size:      360988 bytes
Optimized:      no
PDF version:    1.5

是的這是張具有透明度的 pdf 檔,而這個透明度讓事情變得不一樣了。在數日的嘗試後,我總算是找到了在 Linux 上生成 具透明度 pdf 與簍空字的工具及方法,於是效果如下。

$ inkscape watermark.svg -A watermark.pdf
$ pdftk INPUT.pdf stamp watermark.pdf output OUTPUT-3.pdf

$ mkbitmap -s 1 -t 0.2 watermark.bmp ; potrace watermark.pbm ; epstopdf watermark.eps
$ pdftk INPUT.pdf stamp watermark.pdf output OUTPUT-4.pdf

wm3 wm4

作法是用 inkscape 作出具透明度的 pdf 或是由 svg 轉 pdf。而簍空字則是爬網 google 找到的方法,用 mkbitmappotrace 再用 inkscape 或是 epstopdf 作成 pdf 再交由 pdftk 處理。