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

2013年3月13日 星期三

[shell] 大量取代檔案中關鍵字

大量取代檔案中關鍵字

github 的時候突然發現可以改 username,

之前被 jserv 嫌帳號太難記就索性換掉,

換完才想到 blog 的圖都放在上面阿 Orz,

部落格上面的就複製下來取代掉,原始檔的部份當然就交給指令來取代:

grep a13524000 * | cut -d ':' -f 1 | uniq | xargs sed -i 's/a13524000/float-tw/g'

先用 grep 找到有關鍵字的檔案,再用 cut 切出檔名,用 uniq 去除重複的,

最後用 xargs 餵給 sed 做取代

2013年2月3日 星期日

[PC^2] special judge

[PC2] special judge

剛辦完 ACmarathon 剛好研究了 pc2 的 special judge 怎麼設定

所使用的 pc2 版本是 9.2.3 系統是 Ubuntu 12.04 LTS

首先需要設定的是題目所使用的 Validator 也就是 judge 的程式

通常如果不用 special judge 的話可以使用 pc: sup:2 的 Validator

那 special judge 的話就選用 External Validator

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

然後按 Validator Prog... 後面選擇 judge 的程式,可以是現成的某個程式 (diff...)

也可以自己寫,第二個部份就是 Validator Command Line

這邊是設定如何去執行這個 Validator 這邊有提供五個變數可以使用

{:validator} judge 程式的名稱,也就是前面選擇的程式(不包含路徑)

{:infile} input file,input 測資的檔名

{:outfile} outpu file,參賽者程式接受 input 後的 output

{:ansfile} 從 pc2 設定的答案檔名

{:resfile} 必須輸出的 judge 結果(是個 xml file)

先舉個例子,如果你所選擇的 judge 程式叫做 sp 然後你的 Validator Command Line 這樣寫:

./{:validator} {:infile} {:outfile} {:ansfile} {:resfile}

那執行 judge 的時候就會這樣執行:

./sp input outpu ans result

當然如果你的 judge 程式是用 java, python 寫的也可以這樣寫:

java {:validator} {:infile} {:outfile} {:ansfile} {:resfile}

python {:validator} {:infile} {:outfile} {:ansfile} {:resfile}

當然這些參數的順序是可以任意變動的,如果不需要某些檔案也可以不寫

執行時檔案都會被放在同一個目錄下,像是 pc2-9.2.3/bin/executesite1judge1

當你的 judge 程式執行完後必須依照所給定的 resfile 檔名產生一個檔案

這個檔案的內容大概是這樣:

<?xml version="1.0"?>
<result outcome =  "No - Wrong Answer" security = "132XRSAM.txt">Answer and output file different at line  1</result>

這是一個 WA 的範例,首先第一行就是 xml 的 tag

接著第二行是一個 result tag 裡面包含 outcome 和 security

outcome 就是 judge 的結果,pc2 會去比對在 Judgements 裡面所設定的結果來回應給 client

預設包含這幾種結果:

Yes
No - Compilation Error
No - Run-time Error
No - Time-limit Exceeded
No - Wrong Answer
No - Excessive Output
No - Output Format Error
No - Other - Contact Staff

如果 result file 沒有被正確產生,或是比對不到一樣的結果則會回應 "Undetermined"

security 則是 resfile 的檔案名稱(猜測應該是為了防止上傳可以產生 result file 的程式用的)

tag 裡面的字串並不會被 pc2 拿來使用,可以是一些錯誤的原因之類的

而如果 AC 的話 outcome 的文字可以使用 "Yes" 或 "accepted" 下面是一個 AC 的範例:

<?xml version="1.0"?>
<result outcome =  "accepted" security = "561XRSAM.txt"></result>

另外如果檔案有被產生,而 xml 格式有錯誤(像是少了 security)則狀態會留在 NEW 而 client 也不會收到結果

如果有這樣的問題可以檢查一下(這個問題弄了超久 Orz)

2013年1月12日 星期六

[Linux] 與藍牙裝置建立 spp 連線

首先將電腦與藍牙裝置進行配對

接著使用以下指令之一取得電腦之 BD Address:

$ hciconfig -a
or
$ hciconfig dev
or
$ hcitool dev

例:
┌[float@float-X220]:~
└─$ hcitool dev
Devices:
        hci0    40:2C:F4:E3:14:31

以我自己為例就是 40:2C:F4:E3:14:31

然後取得藍牙裝置的 BD Address:

$ hcitool scan

例:
┌[float@float-X220]:~
└─$ hcitool scan
Scanning ...
        98:E7:9A:08:52:96   float-XT535

這邊是 98:E7:9A:08:52:96

再來建立虛擬序列埠裝置:

$ sudo mknod /dev/rfcomm0 c 216 1
$ sudo chmod 666 /dev/rfcomm0

修改 /etc/bluetooth/rfcomm.conf 為其建立設定:

$ sudo vim /etc/bluetooth/rfcomm.conf

rfcomm0{
    bind no;                    //設置是否自動綁定設備
    device 40:2C:F4:E3:14:31;   //設定綁定設備的BD Address(電腦)
    channel 1;                  //設定設備通道
    comment "BTM";              //對設備的描述
}

添加 SPP(Serial Port Profile) 的SDP協議通道:

$ sudo sdptool add --channel=1 SP

將虛擬序列埠與藍牙裝置綁定:

$ sudo rfcomm bind /dev/rfcomm0 98:E7:9A:08:52:96 1

連接:

$ sudo hcitool cc 98:E7:9A:08:52:96

接著就可以使用可以連接序列埠的程式進行連線,像是 picocom 或 minicom

這邊推薦 picocom 因為我覺得比起 minicom 他的操作簡單許多:

$ picocom /dev/rfcomm0

離開方式為 ^a ^x  (ctrl+a ctrl+x)

2012年12月6日 星期四

find 和 xargs 包含空白

某次剛好遇到想要計算 code 的總行數,

就下了這樣的指令,:

find . -name "*.cpp" | xargs wc -l

在我的電腦上可以正常運作,只是在 e0 的電腦上不行,

研究了一下發現是因為檔名中有空白的問題,

找到了這個解法,:

find . -name "*.cpp" -print0 | xargs -0 wc -l

find-print0 是將每個輸出的結尾加上 null,

xargs-0 則是將分隔的符號由空白改成 null

所以就可以解決 find 後檔名有空白的問題了。