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 後檔名有空白的問題了。

2012年11月16日 星期五

LibreOffice 打字時崩潰

LibreOffice 打字時崩潰

用 ibus 在 LibreOffice 打字時有時候 LibreOffice 就會崩潰了,

後來發現崩潰總是發生在,ibus 的輸出緩衝區滿了的時候,

第一個想到的作法就是去改 ibus 的緩衝區設定,

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

不過從這邊修改不知道什麼原因常常會自己又變回 4 或 8 之類得很小的數值,

另外找到了從 gconf-editor 設定的方式(不過限定於新酷音)

在這個項目下 desktop -> ibus -> engine -> Chewing -> maxChiSymbolLen

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

只是這種設定只是治標不治本,當打超出設定的緩衝區時還是會崩潰 Orz

2012年11月15日 星期四

停用 F10 選單鍵 (ubuntu 12.04)

之前在 mosut 聚會聽到了 mc 這個 cli 的檔案管理程式

今天想說來是用看看好了, mc 裡面的離開是 F10,

由於 F10 在 gonme-terminal 預設是開啟選單,所以就依照之前 這篇 把 F10 disable 了,

在 mc 裡面就可以正常離開了,不過發生了一件事,竟然跳出了右鍵選單,

結果到處試了一下,F10 好像被設定成選單鍵了,原本在 stackoverflow 找到用 compizconfig-settings-manager

可以設定,不過似乎找不到對應的設定,後來有找到了下面的方式:

mkdir -p ~/.config/gtk-3.0
cat <<EOF > ~/.config/gtk-3.0/gtk.css

@binding-set NoKeyboardNavigation {
     unbind "<shift>F10"
}

* {
     gtk-key-bindings: NoKeyboardNavigation
}

EOF

也就是先建立 ~/.config/gtk-3.0/gtk.css 這個檔案,並且加入 unbind 的設定,

這樣就 OK 了,在 12.04 unity 下測試是正常的。

2012年11月10日 星期六

使用 ffmpeg, avconv 做螢幕錄影

ffmpeg

ffmpeg -f x11grab -r 25 -s 1366x768 -i :0.0 -sameq /tmp/out.mp4

avconv

avconv -f x11grab -r 25 -s 1366x768 -i :0.0 -same_quant /tmp/test.mp4

說明

f x11grab 從螢幕

-r 25 fps

-s 1366x768 解析度

-i :0.0 錄影的位置,可以用+改變位置 ex. -i :0.0+10,20

-sameq & -same_quant 與來源使用相同的 quantizer,avconv 的 man page 說不等同於畫質

,只是不知道還有什麼方式來讓畫質變好 Orz

最後檔名為輸出的檔案,ctrl-c 停止錄影

2012年11月8日 星期四

open in terminal

開啟 terminal(cmd) 於特定目錄

有時候在寫程式的時候會需要在特定目錄執行程式,

不管在 linux, windows 底下如果直接開啟 terminal 以後,

還要在 cd, cd, cd 半天才能到那個目錄下(如果那個目錄很深)

介紹兩個方法來解決這個問題

第一種

Linux 下安裝 nautilus-open-terminal

安裝後在瀏覽資料夾的時候按右鍵就會有 Open in terminal 的選項的

Windows (7/vista) 按住 shift 按右鍵會有 在此處開啟命令視窗

第二種

不管 linux, windows 開啟一個 terminal 以後,

把資料夾直接拉進 terminal 後,該路徑就會在 terminal 上了,

所以可以先打好 cd 再把資料夾拉進去。