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

March 17, 2017

Org-mode list of features

Org-mode 功能概廓介紹

Org-mode 是 Emacs 上的殺手級應用,slogan 「Your Life in Plain Text」 - 「與文字共舞」, 是的你沒看錯 org mode 就是一個以純文字展現的應用。

Org mode 是個高效率的文字編輯系統,可以用來作筆記,維護 TODO Lists,規劃計畫,文件草稿。它常與 GTD 放在一起討論, 作為 GTD 工作與時間管理上的實踐工具。但其功能遠不止於此,它可以當簡報工具、心智圖、專案管理、繪製表格、試算表、資料庫、 文件加密、文學編程 (Literate programming)、Redmine bugs/issues report 工具、出版、寫 blog (網誌出版系統)。 也正因為它有這麼多的面向,所以初學者非常容易混謠或是只看到片面的現像。

以下以 http://orgmode.org/features.html 內容為主,加上個人觀點的說明:

編輯 - Editing

Org 引用 outline.el 為實作基礎,可便利的在各個標題快速移動,收折標題與內文,方便撰文時以筆記標題式呈現全貌利於思考佈局, 展開看細部的角度來寫作。這功能不僅在寫 code 同時在寫文件上也很方便。

todo folding

圖片來源 Mishadoff Blog - Emacs org-mode use cases, for non-programmers. 這同時是一篇介紹 org-mode 編輯功能的好文章, 推薦初學者服用。

計劃 - Planning

Org 提供 TODO lists 可用來作工作管理及時程計劃。預設有幾個 keyword 如 TODO | DONE。狀態 keywords 可以自行擴充設定。

* 購物清單
** DONE 買午奶
   CLOSED: [2017-03-15 Wed 15:59]
** TODO 買洗衣機
planning

Tasks 可以加標籤 tags 埋屬性 properties 加上時間標籤(期限/結束時間/排程),搭配 GTD 對時間及工作管理上非常好用。 GTD 可以大大改善工作效率,真心推薦。實作可參考以下文章。

todo statistics

計時 - Clocking

我並沒有使用這個功能,主因是沒有計算工時的需求。它主要的概念是針對各別的 Task 作 clocking in 及 clocking out, 由 in/out 的時間差來計算工時,其關鍵點在於累加統計以及產生漂亮的報表。

clocking

行程表 - Agendas

當有數千個工作項 tasks 時,只要將工作即期的時間排定,Agendas 能讓使用者很輕易的專注在未來即將發生的事件而能預先準備, 作到提醒的功能。預設的 Agendas 可以將 scheduled 及 deadline 的工作以週間的方式呈現。Agenda 可依個人喜好客制化, 以每天/每月/針對 TODO 的關鍵字/針對 tag 等等呈現。這個特色可以讓 Agenda 無痕的融入您的工作流程中。

agenda

個人的實際經驗,工作上鎖碎的雜事很多,如果同時間也在籌辦大型活動,每日超過百封的信件及同時間上千個待辦事項在排隊等著處理時, 這個情況十分可怕,身處在其間的人很有可能快要精神錯亂。這個時候就非常需要導入一個工作流程如 GTD。 Agenda 在這個流程中可以妥善的幫忙當守門人,防止掉球的事情發生。非常有用真心推薦。

Capturing - 快照?? 速記?? 速寫??

沒能找到較好的中文翻譯。Capturing 的動作主要事先建立個人專屬的 TODO 模版 (templates),當有好的點子或新的工作項目, 快速喚起 Capture 把事情先寫下來,然後回神到目前的工作上。避免臨時出現的雜事/念,干擾工作,而快速的把事情記下來等 待工作告一段落後有空時在整理,依分類、優先權重、緊急來分批處理。

capture

表格與試算表 - Tables

Org 的表格功能超級直覺好用,有一陣子我還特別會用 Orgtbl-mode 在 reStructuredText 上繪製表格, 後來乾脆就直接用 org-mode 匯出成 reST 使用。如要用一分鐘來介紹 org-mode ,我會只介紹 tables 及 outline 這兩個神奇的功能。

此外表格可由 .csv .tsv 匯入產生,表格還可以加上試算表的功能,計算的語法可用 Calc Emacs Package 或是 Emacs lisp code。

tables

匯出 - Exporting

匯出格式官方支援的有 HTML, LATEX, ODT(OpenDocument 格式),也提供 backends 的接口方便其它開發轉換成其它格式。 例如 Org2OPML (mindmaps 心智圖),列入官方的 Markdown exportOx-Rst (reStructuredText),Org-Reveal (Reveal.js), org-ioslide (Google I/O HTML5 slide) 等等。

export

文件內嵌程式碼 - Working with source code

Org 讓文學編程 (literate programming) 變的很容易且自然。程式片段可以很輕易置入於文件中, 編輯程式時又可以在一區隔開的 Org buffer 進行,語法高亮、縮排、字串補齊等方便 coding 的能力完完全全延用您 Emacs 的設定, 執行的結果也可附註於檔案內。

整體呈現的觀感與 jupyter/ipython notebook 很相近,較大的差異是 jupyter 呈現在 browser 上,而 org-mode 則呈現在 Emacs 裏。

babel

Posted by Lloyd Huang in on March 17, 2017

March 08, 2017

Emacs Org-mode format export to reStructuredText

Emacs Org-mode format export to reStructuredText

reStructuredText 使用經驗

工作上寫技術文件的比重就越來越高了,文件是很重要的溝通工具。依時間演進下所使用的工具如下:

LinuxSGML -> CJK-LaTex ChiLaTex -> DocBook -> OO.o -> CJK-LaTex -> reStructuredText

reST 我由 2009 年開始使用直到現在,投資報酬率很高,累積的工具也越來越多。其間也試用過 Markdown , 個人主觀經驗作為文件排版格式 reST 還是比較合適。

Markdown 原始設計,易讀的純文字檔,便於轉換成 xhtml html。就設計的概念及推廣實作它是非常成功的,但作為文件還是少了些特性,如表格、 目錄章節、索引、註腳、列印、出版等功能。但以網路流通性易學及多人協作上考量,它是目前首選。

Org-mode - Emacs 上的殺手級應用,作為 GTD 實踐工具,我由 2010 年開始使用。它大大的改善工作習慣及效率,以及時間掌握與應用。 隨著時間對 Org-mode 使用也走出了單純的 GTD 工具往簡報、Mind Map、Project Management、簡易試算表、簡易資料庫、文件加密、Literate programming 等使用面向。但文件排版與個人筆記我還是交給 reST + Latex + Sphinx。

最近我開始使用 org-mode + ox-rst 來產出 reST 文件。原因無他,就是 Emacs org-mode 實在是太方便及好用了。

Ox-Rst exports your Org documents to reStructuredText. Ox-Rst relies on the Org-mode 9.0 export framework.

一般來說,文件格式的轉換會有失真的現象。例如 html 轉 text,hyperlink 字型及顏色的特性就會失去。但 ox-rst 很巧妙的在 org-mode 語法上作了合宜的擴充,幾乎可以一對一轉換,強烈推薦給 reST 及 org-mode 的愛用者。

問題筆記

在使用上遇到了一個比較困擾的問題,就是 ^ 插入符號 Caret 及 _ 底線 Underscore 的使用,這兩個符號在 org-mode 上會特別解釋。情況如下:

model^rgb_led = modelrgbled
L^A T_E X = LATEX

如果要避免這個問題,在 org-mode 把 ^ 設定為不解釋即可,作法如下:

#+OPTIONS: ^:nil

reStructuredText 與 ox-rst 使用入門

ox-rst 是個 Emacs Org-mode 的延伸使用套件 GitHub ox-rst 官網 已經有很詳細的使用說明文件。但使用的關鍵還是在 reST 的語法熟悉上, 畢竟實際還是在寫 reST。以下是 OpenFoundry 上的兩篇介紹文,提供給有興趣的人參考。

Posted by Lloyd Huang in on March 08, 2017

February 26, 2017

ffmpeg - edit video by ffmpeg

Edit video by ffmpeg

Date:<2017-03-03 Fri 10:47>

演講被要求 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