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