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

2013年4月26日 星期五

[Python] 使用 sympy 解聯立方程組

使用 sympy 解聯立方程組

4x + 3y + 3z = 350

4x + 2y + 5z = 360

8x + 8y + 10z = 840

from sympy import *

x = Symbol('x')
y = Symbol('y')
z = Symbol('z')

f1 = 4*x + 3*y + 3*z - 350
f2 = 4*x + 2*y + 5*z - 360
f3 = 8*x + 8*y + 10*z - 840

sol = solve((f1, f2, f3), x, y, z)
pprint(sol)
# OUT: {x: 50, y: 30, z: 20}

使用 evalf 將分數轉為小數輸出

ex.

4x2 + 5x - 6 = 0

from sympy import *
x = Symbol('x')
f = 4*x**2 + 5*x -6
sol = solve(f, x)
pprint(sol)
# OUT: [-2, 3/4]
print sol[1].evalf()
# OUT: 0.750000000000000