2013年9月21日 星期六

製作 gif 動畫

製作 gif 動畫

因為看到了一些 vim plugin 利用 gif 動畫來 Demo plugin 的效果,

最近也自己在寫 vim plugin 所以也想來做看看,

製作過程分成三個步驟

錄製影片

首先我利用 kazam 來錄製影片,選用 kazam 的原因是因為他可以利用拖拉的方式來選取

錄製範圍,雖然在一些小地方的中文顯示有點問題,不過不影響使用。

將影片轉成 gif 檔

接下來使用 mplayer 把影片轉換成 gif 檔。

mplayer input.mp4 -ao null -vo gif89a:fps=13 output=output.gif

另外可以加上 -ss 和 -endpos 來設定轉換的時間起點和長度,

這部份可以參考後面附的參考資料。

壓縮 gif 檔

由於轉換出來的 gif 檔案會很大,以我自己錄製的檔案為例,

原本解析度 818x502 時間長度 37 秒總共大小才 662 KB 的 mp4 影片,

轉換成 gif 檔後竟然有 8.2 MB,這樣放在網頁上的載入時間怕會有點久,

所以利用 convert 幫他瘦身一下

convert output.gif -fuzz 10% -layers Optimize optimised.gif

剛剛提到的檔案瘦身之後剩下 666 KB。

我錄起來的結果是有些小地方不太清楚,不知道像 YouCompleteMe 的是怎麼錄的,

感覺就蠻清晰的 Orz,我自己錄的在這 easyreST

2013年7月2日 星期二

[rsST] 修改 rst2html highlight style

[reST] 修改 rst2html code highlight sytle

不知道為什麼上一篇裝完新的 rst2html 轉出來的 syntax highlight 超醜,明明 restview 弄出來得很漂亮阿....

rst2html 不加參數

https://github.com/float-tw/float-blog/raw/master/img/rst2html.jpeg

restview

https://github.com/float-tw/float-blog/raw/master/img/restview.jpeg

查了一下可以從 pygmentize 匯出 syntax highlight 的 css (來源):

$ pygmentize -S default -f html -a .highlight > style.css

匯出以後會得到一個像這樣的檔案:

.highlight .hll { background-color: #ffffcc }
.highlight  { background: #f8f8f8; }
.highlight .c { color: #408080; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */

接下來看一下把這段 code 原本用 rst2html 轉換後的結果

int main()
{
    int x;
    printf("hello\n");
    return 0;
}
$ rst2html test.rst > test.html
<pre class="code c literal-block">
<span class="keyword type">int</span> <span class="name function">main</span><span class="punctuation">()</span>
<span class="punctuation">{</span>
    <span class="keyword type">int</span> <span class="name">x</span><span class="punctuation">;</span>
    <span class="name">printf</span><span class="punctuation">(</span><span class="literal string">&quot;hello</span><span class="literal string escape">\n</span><span class="literal string">&quot;</span><span class="punctuation">);</span>
    <span class="keyword">return</span> <span class="literal number integer">0</span><span class="punctuation">;</span>
<span class="punctuation">}</span>
</pre>

接下來需要修改一下 rst2html 的參數和剛剛的 sytle.css 讓 css 可以正確生效

首先是 <pre> 的 class 部份 code-block 轉換出來的是 code 而 sytle.css 裡面用的是 highlight 所以要先把 highlight 都改成 code:

.code .hll { background-color: #ffffcc }
.code  { background: #f8f8f8; }
.code .c { color: #408080; font-style: italic } /* Comment */
.code .err { border: 1px solid #FF0000 } /* Error */
.code .k { color: #008000; font-weight: bold } /* Keyword */
.code .o { color: #666666 } /* Operator */
.code .cm { color: #408080; font-style: italic } /* Comment.Multiline */
.code .cp { color: #BC7A00 } /* Comment.Preproc */

接著是不同部份所使用 highlight 的 class 原本轉出來的結果是使用較長的敘述,

這部份需要在 rst2html 加上 --syntax-highlight=short

使他使用簡短敘述,完成後同時指定 --stylesheet=style.css 使用剛剛的 css:

$ rst2html.py --stylesheet=style.css --syntax-highlight=short test.rst > test.html

轉換完的 html

<pre class="code c literal-block">
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
    <span class="kt">int</span> <span class="n">x</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;hello</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

使用後的結果就如這裡所示

2013年6月29日 星期六

[reST] Code Syntax Highlight

[reST] Code Syntax Highlight

今天參加了 Tainan.py X MOSUT 的聚會,其中一個主題是 sphinx 的文件教學,

sphinx 的文件是用 reStructuredText 撰寫的,講者 demo 的時候剛好 demo 到了在 reST 裡面使用 code syntax highlight

當初要開始用 reST 寫部落格的時候也稍微作過一些功課,只是 syntax highlight 的部份沒有試出來,

今天聽完分享後在繼續查了些資料,我原本用來轉換的 rst2html 是 Docutils 所帶的,當使用 code-block 區塊的時候,像是:

.. code-block:: c

    int main()
    {
        printf("hello\n");
        return 0;
    }

是會發生錯誤的:

$ rst2html test.rst > test.html
test.rst:1: (ERROR/3) Unknown directive type "code-block".

.. code-block:: c

    int main()
    {
        printf("hello\n");
        return 0;
    }

接著找到這篇發現 Docutils 0.9 的版本後就支援了 code-block 而 Ubuntu 12.04.2 所套件庫裡的 Docutils 卻是 0.8.1:

$ rst2html --version
rst2html (Docutils 0.8.1 [release], Python 2.7.3, on linux2)

所以我就把他移除了(怒),接著從 pip 安裝 Docutils:

$ sudo apt-get remove docutils
$ sudo pip install docutils

目前 pip 上的 Docutils 是 0.10 版,趕快來試用一下

int main()
{
    printf("hello\n");
    return 0;
}

哈,太好了可以用了 :)

2013年6月12日 星期三

[Convert] 將文字轉成圖片

[Convert] 將文字轉成圖片

有時候在簡報或者寫 blog 時會有需要將一些輸出結果呈現出來的時候,

螢幕截圖是一個不錯的方式,不過截圖可能會比較模糊而且麻煩,

最近發現 convert 就有附帶一個功能是將文字直接轉換成圖片,用在這個地方剛剛好。

首先先舉個用 convert 將文字轉成圖片的例子:

$ convert -size 64x32 label:float convert_label.jpeg

指定大小 64x32 文字內容為 float 就可以得到以下圖片

https://github.com/float-tw/float-blog/raw/master/img/convert_label.jpeg

接下來要把 ifconfig lo 的結果轉換成圖片,首先先看一下原本的執行結果:

$ ifconfig lo
lo    Link encap:Local Loopback
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:38990 errors:0 dropped:0 overruns:0 frame:0
      TX packets:38990 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:4280371 (4.2 MB)  TX bytes:4280371 (4.2 MB)

那我們可以用 pipe 導給 convert 將結果轉成圖片:

$ ifconfig lo | convert label:@- convert_label_ifconfig.jpeg

label:@- 的部份是表示 label 的內容由標準輸入取得,就可以得到

https://github.com/float-tw/float-blog/raw/master/img/convert_label_ifconfig.jpeg

當然我們也可以指定圖片為黑底白字:

$ ifconfig lo | convert -background black -fill white label:@- convert_label_ifconfig_black.jpeg
https://github.com/float-tw/float-blog/raw/master/img/convert_label_ifconfig_black.jpeg

當然 label 在使用上還有很多參數可以使用,這部份可以參考這片 [1] 以及官方的範例 [2]

2013年6月8日 星期六

[Linux] 使用 convert 做圖片轉檔

[Linux] 使用 convert 做圖片轉檔

convert 是 ImageMagick 的一個 CLI tool

所以安裝 ImageMagick 就可以得到他了!

可以用來做圖片轉檔,調整大小,也還有其他很強大的功能

這邊簡單介紹一下圖片轉檔和調整大小的方法

首先,圖片轉檔的部份非常簡單舉個例子,如果要把 png 檔轉成 jpeg 檔:

convert input.png outpu.jpeg

好了,就這樣,要轉的檔名放前面,輸出檔名放後面,convert 會自己根據副檔名做轉換

簡單吧。

調整大小的話:

convert input.png -resize 64x64 output.png

這樣就可以把圖片縮放到可以放入 64x64 的方形內,

那如果要把他轉成真的是 64x64 呢?加上驚嘆號強制調整,像這樣:

convert input.png -resize 64x64\! output.png

倒斜線是有時候因為 shell 的關係可能驚嘆號是脫逸字元,有時不加也是可以的。

2013年6月2日 星期日

[Linux] 文字檔編碼工具

[Linux] 文字檔編碼工具

一開使用這些工具是因為在 linux 下的 smplayer 在載入影片字幕的時候,

雖然設定成解 big5 編碼,可是還是會有部份的字變成亂碼,

把字幕檔轉成 UTF-8 就沒有這個問題了,另外偶爾也會遇到 code 裡面有中文註解,

用 gedit 開會有解碼錯誤的問題,或是一些原本 windows 底下的檔案。

iconv

沒記錯的話 ubuntu 12.04 預設是有安裝,

最早用的工具,因為參數蠻好記的範例如下:

iconv -f big5 -t utf8 -o output.txt input.txt

-f form-code

-t to-code

-o 輸出檔名

enca

用了一段時間後突然想到,是不是應該在轉換前先檢查一下檔案原本的編碼是什麼,

因為偶爾也會遇到簡體的編碼,

一開始想到的是用 file ,的確 file 可以用來檢查編碼,

不過後來發現了一個缺點,big5 編碼的檔案會被誤認成 ISO-8859,

所以就查到了這個,Ubuntu 12.04 預設沒有安裝 apt-get install enca 一下就可以了。:

enca input.txt

就可以檢查檔案編碼了,在 manpage 裡面可以查到他支援的編碼,測了幾個檔案 big5 可以正常偵測

另外更強大的是這個 enconv 他可以用來直接把檔案轉成系統的編碼:

enconv input.txt

假設系統編碼是 utf-8 而 input.txt 是 big5 編碼,那 input.txt 就會被轉成 utf-8,

非常的方便,完全不需要什麼參數 :)

當然,這兩個工具都有其他更多的參數可以使用,有興趣的可以問一下男人,

另外還有看到其他的工具像是 convmv 參數跟 iconv 類似,不過就沒有裝來玩了。

2013年5月17日 星期五

[Linux] 檔名相關指令

[Linux] 檔名相關指令

取得檔案(相對路徑)的絕對路徑:

readlink -f dir/to/file

ex

float@dorm:~/float-blog$ readlink -f ~/float-blog/linux_file_name_command.rst
/home/float/float-blog/linux_file_name_command.rst

取得檔案所在目錄:

dirnam dir/to/file

ex

float@dorm:~/float-blog$ dirname ~/float-blog/linux_file_name_command.rst
/home/float/float-blog

取得檔案名稱:

basename dir/to/file

ex

float@dorm:~/float-blog$ basename ~/float-blog/linux_file_name_command.rst
linux_file_name_command.rst