盧云宏++侯文涵++趙前++張麗穎++周世平
摘 要OnlineJudge(OJ)是基于圖形化用戶(hù)界面的在線評(píng)測(cè)系統(tǒng),用于在線檢測(cè)代碼的正確性。本文利用python語(yǔ)言和Linux環(huán)境的命令行方式,為當(dāng)前OJ設(shè)計(jì)并搭建一個(gè)基于Linux的純命令行在線提交環(huán)境,使用該環(huán)境可以在純命令行下向OJ提交題目。該環(huán)境成本低,占用資源少,運(yùn)行速度快,服務(wù)端便于統(tǒng)一管理。
【關(guān)鍵詞】程序設(shè)計(jì) 命令行 在線提交環(huán)境(平臺(tái))
1 前言
人機(jī)交互隨軟件技術(shù)的發(fā)展而進(jìn)步,一直在按照用戶(hù)的期望向著友好、方便、自然的方向發(fā)展。人機(jī)交互從原始的命令行(Command Line Interface,CLI)到圖形化用戶(hù)界面(Graphical User Interface, GUI),再發(fā)展到現(xiàn)在的自然用戶(hù)界面(NaturalUserInterface, NUI)。雖然當(dāng)前CUI已經(jīng)不是主流了,但命令行技術(shù)作為更接近底層的文本模式,永遠(yuǎn)不會(huì)過(guò)時(shí)。
隨著程序設(shè)計(jì)基礎(chǔ)教學(xué)的發(fā)展,各個(gè)高校紛紛建立OJ,但當(dāng)前OJ平臺(tái)是基于圖形化用戶(hù)界面的,目前還沒(méi)有OJ平臺(tái)使用命令行界面。針對(duì)當(dāng)前的情況,本文使用純命令行界面,設(shè)計(jì)并搭建了純命令行的OJ在線提交環(huán)境。作為日常使用,圖形化界面是方便且易于操作的,但作為服務(wù)器,圖形模式會(huì)占用大量的系統(tǒng)資源,尤其是內(nèi)存?;诜?wù)器的考慮,該環(huán)境的搭建借用Linux環(huán)境的命令行方式。系統(tǒng)終端為純文本,不使用圖形化界面,占用資源少,運(yùn)行速度快,可以對(duì)資源有效利用。另外,該系統(tǒng)運(yùn)行環(huán)境相對(duì)簡(jiǎn)單,不需要太多的外部環(huán)境,客戶(hù)端不需要特殊環(huán)境搭建,可以通過(guò)終端方式(借用putty,ssh,Xshell等工具)實(shí)現(xiàn)登錄。
2 實(shí)驗(yàn)平臺(tái)環(huán)境搭建
本文基于遠(yuǎn)程登錄,ssh映射的原理,將OJ服務(wù)器與用戶(hù)之間增加一個(gè)Linux服務(wù)器和一個(gè)中轉(zhuǎn)服務(wù)器,搭建該環(huán)境。使用的搭建工具包括Linux服務(wù)器,OJ服務(wù)器,終端軟件。搭建提交環(huán)境步驟如下:
(1)實(shí)現(xiàn)端口轉(zhuǎn)發(fā)。因?yàn)長(zhǎng)inux服務(wù)器使用的是局域網(wǎng),只能在特定(124)網(wǎng)段使用,需要將端口轉(zhuǎn)發(fā)到中轉(zhuǎn)服務(wù)器的特定(6666)端口上才能實(shí)現(xiàn)外網(wǎng)訪問(wèn)。
(2)創(chuàng)建固定數(shù)目的學(xué)生賬戶(hù)和老師賬戶(hù)。
(3)給賬戶(hù)設(shè)定權(quán)限。使學(xué)生之間不能互相訪問(wèn)進(jìn)入各自的目錄下,但教師用戶(hù)可以進(jìn)入學(xué)生的目錄。
(4)將特定的功能分配到每個(gè)用戶(hù),如設(shè)定提交指令。
這其中所有的操作通過(guò)shell腳本實(shí)現(xiàn),每一個(gè)操作都建了一個(gè)腳本。
當(dāng)前OJ的結(jié)構(gòu)是用戶(hù)直接登錄到OJ服務(wù)器,本文將OJ服務(wù)器與用戶(hù)之間增加一個(gè)Linux服務(wù)器和一個(gè)中轉(zhuǎn)服務(wù)器,各個(gè)服務(wù)器與運(yùn)行在Linux服務(wù)器中的服務(wù)程序構(gòu)成了為本校OJ設(shè)計(jì)的命令行提交系統(tǒng)。用戶(hù)需要通過(guò)終端方式遠(yuǎn)程登錄到Linux服務(wù)器,再進(jìn)行相應(yīng)操作,Linux服務(wù)器將登錄請(qǐng)求和提交題目操作傳遞到OJ服務(wù)器,OJ服務(wù)器再對(duì)這些操作進(jìn)行相應(yīng)處理,再通過(guò)服務(wù)器之間的連接將結(jié)果依次返回。但是Linux服務(wù)器不能被用戶(hù)直接訪問(wèn),用戶(hù)需要通過(guò)一個(gè)能被直接訪問(wèn)到的服務(wù)器登錄到Linux服務(wù)器,所以我們將OJ平臺(tái)的服務(wù)器作為中轉(zhuǎn)服務(wù)器,靠ssh端口映射將中轉(zhuǎn)服務(wù)器與Linux服務(wù)器聯(lián)系起來(lái)。為了加以區(qū)別,本文將中轉(zhuǎn)服務(wù)器與OJ服務(wù)器分別表示。系統(tǒng)的數(shù)據(jù)交互體系結(jié)構(gòu)如圖1所示。
3 系統(tǒng)實(shí)現(xiàn)
該系統(tǒng)實(shí)現(xiàn)的功能主要包括用戶(hù)登錄、代碼編寫(xiě)及編譯、代碼運(yùn)行、代碼暫存、用戶(hù)提交、結(jié)果返回。用戶(hù)通過(guò)終端程序,遠(yuǎn)程登錄到Linux服務(wù)器,再登錄OJ賬號(hào),連接到OJ服務(wù)器,進(jìn)行想要進(jìn)行的操作。代碼的編寫(xiě)可以使用Linux系統(tǒng)中的編輯器(如vim等)。在終端中輸入“vimtest(文件名稱(chēng)).c”,回車(chē)進(jìn)入vim編輯器,進(jìn)入編輯狀態(tài)(按a鍵),輸入代碼語(yǔ)句。輸入完成后,退出編輯狀態(tài)(按esc鍵),輸入“:wq”,按回車(chē),可保存代碼文件且退出vim編輯器回到終端命令窗口。代碼的編譯可以依靠gcc命令,輸入“gcctest.c”編譯代碼,最后使用“./test.out”執(zhí)行,查看結(jié)果。因?yàn)榇a的編寫(xiě)、編譯、運(yùn)行和暫存功能是在Linux服務(wù)器內(nèi)部實(shí)現(xiàn)的,所以在這里重點(diǎn)介紹一下用戶(hù)登錄,用戶(hù)提交(包括結(jié)果返回)的過(guò)程。
3.1 登錄
通過(guò)終端程序遠(yuǎn)程登錄到Linux服務(wù)器后,用戶(hù)要進(jìn)行登錄賬號(hào)操作,通過(guò)命令行向Linux服務(wù)器提交登錄請(qǐng)求,Linux服務(wù)器接收到請(qǐng)求后,返回相應(yīng)結(jié)果,用戶(hù)輸入賬號(hào)密碼。登錄具體操作通過(guò)python語(yǔ)言中的提交表單實(shí)現(xiàn),服務(wù)程序?qū)⒂脩?hù)輸入的賬號(hào)密碼提交到OJ服務(wù)器,OJ服務(wù)器對(duì)賬號(hào)密碼進(jìn)行驗(yàn)證。若驗(yàn)證錯(cuò)誤,則登錄失敗,將結(jié)果依次返回;若驗(yàn)證正確,Linux服務(wù)器對(duì)登錄結(jié)果進(jìn)行處理,判斷用戶(hù)是否屬于學(xué)生組,若是,則需要判斷學(xué)生是否使用的自己的賬號(hào),檢測(cè)cookie是否有效,是則登錄成功,否則登錄失敗。不屬于學(xué)生組(屬于教師組)則只需檢測(cè)cookie是否有效。用戶(hù)登錄的流程如圖2所示。
3.2 題目提交
題目分為兩類(lèi),一類(lèi)是OJ系統(tǒng)上普通的題目,可以任意選擇提交,需要輸入的參數(shù)有四個(gè),格式如下:
--problem
其中第一個(gè)參數(shù)(problem)是題目的種類(lèi),第二個(gè)參數(shù)(Problemid)是題目序號(hào),第三個(gè)參數(shù)(Code file)是代碼所在的文件,第四個(gè)參數(shù)(Language)是編程語(yǔ)言的種類(lèi)。
另一類(lèi)是作業(yè)題目,由學(xué)生將指定題目在規(guī)定時(shí)間內(nèi)提交,需要輸入的參數(shù)如下:
--contest
第二個(gè)參數(shù)(Contestcid)作業(yè)序號(hào),其他參數(shù)意義同上。
用戶(hù)提交的參數(shù)傳遞到Linux服務(wù)器,Linux服務(wù)器獲取到參數(shù)數(shù)據(jù)且未檢測(cè)到無(wú)異常后,程序會(huì)利用參數(shù)構(gòu)造POST數(shù)據(jù),如果線程不出現(xiàn)異常,學(xué)生提交的代碼會(huì)通過(guò)該程序的POST數(shù)據(jù)傳輸?shù)絆J。OJ接收到數(shù)據(jù)后會(huì)進(jìn)行提交、判題、檢測(cè)相似度和返回結(jié)果等操作。程序通過(guò)抓取網(wǎng)頁(yè)數(shù)據(jù),返回抓取到的信息并顯示到命令行。學(xué)生提交題目流程如圖3所示。
4 結(jié)果分析
本文針對(duì)煙臺(tái)大學(xué)OJ(202.194.119.110)搭建了在線提交平臺(tái),測(cè)試得到如下結(jié)果:命令行界面資源消耗少,占用內(nèi)存少,運(yùn)行速度優(yōu)于圖形化用戶(hù)界面;對(duì)服務(wù)器配置要求低,成本低于圖形化界面;服務(wù)端實(shí)驗(yàn)環(huán)境便于統(tǒng)一維護(hù);暫存代碼功能相比u盤(pán)存儲(chǔ),更加方便安全。另外學(xué)生使用該提交環(huán)境的同時(shí)增加了對(duì)命令行的使用,減少了對(duì)鼠標(biāo)等外設(shè)的依賴(lài)。
5 總結(jié)
本文針對(duì)當(dāng)前程序設(shè)計(jì)基礎(chǔ)教學(xué)中的需求,設(shè)計(jì)并搭建了基于Linux的在線提交環(huán)境,該環(huán)境實(shí)現(xiàn)了通過(guò)命令行提交代碼的一系列功能。命令行不需要頻繁地使用鼠標(biāo)等其它交互手段,在熟練記憶命令的前提下,命令行的效率是所有的交互手段中最高的,通過(guò)使用該在線提交環(huán)境,可以快速便捷的進(jìn)行命令行操作,提高了效率,節(jié)省了用戶(hù)的時(shí)間。使用者在使用該在線提交環(huán)境的同時(shí),對(duì)命令行有了更深入的了解,也提高了自己操作計(jì)算機(jī)的效率。
參考文獻(xiàn)
[1]陳蒙,王鋒,鄧輝,季凱帆.基于Python的天文軟件命令行界面設(shè)計(jì)與實(shí)現(xiàn)[J].天文研究與技術(shù),2015(02):196-203.
[2]李斌.怎樣在程序中與命令行程序交互[J].電腦編程技巧與維護(hù),2015(12):95.
[3]房曉南,徐功文,孫云晨,張化祥,杜顏伶.基于.NET與在線評(píng)測(cè)的分布式程序設(shè)計(jì)教學(xué)實(shí)驗(yàn)平臺(tái)[J].實(shí)驗(yàn)室研究與探索,2013(11):351-354+380.
作者簡(jiǎn)介
盧云宏(1972-),男,山東省煙臺(tái)市人。博士學(xué)位?,F(xiàn)為煙臺(tái)大學(xué)計(jì)算機(jī)與控制工程學(xué)院講師。主要研究方向?yàn)槌绦蛟O(shè)計(jì)和編譯技術(shù)。
作者單位
煙臺(tái)大學(xué)計(jì)算機(jī)與控制工程學(xué)院 山東省煙臺(tái)市 264005