2015年1月26日月曜日

ideone の API を使ってみた

前回は paiza.IO を使ってみました。「ブログズミ: paiza.IO の API を使ってみた
paiza.IO は実行できるコードサイズに制限があったため、iutest での使用要件を満たしていませんでした。
今回は、ideone の API を使ってみたいと思います。

まずは登録から
Ideone の API は Sphere Engine として提供されています。
この Sphere Engine を使うためには、Ideone のアカウントとは別に登録をしなければいけません。

ちなみに、この Sphere Engine は無償ではありません


Pay-As-You-Go のプランがお試しプランといった感じで、初期投資0円で使えます。
最初に一定回数分 API が使えるようになっています。

今回はこのプランで登録しました。
登録をすると、アカウント設定ページに API のパスワード設定が追加されているので好きなパスワードを設定してください。


API を使う
Ideone の API は WSDL を使う実装なようで、よくわからなかったのと、めんどくさかったので既存のパッケージを使いました。
https://pypi.python.org/pypi/ideone/0.2.0

from ideone import Ideone

i = Ideone('ユーザー名', 'パスワード')
r = i.create_submission(code, language_name='C++14')
link = r['link']
x = i.submission_status(link)
while not int(x['status']) == 0:
 x = i.submission_status(link)
print i.submission_details(link)

基本的には、create して status を確認して details で結果を取得する流れになります。

お試しコードを実行した結果
{status: 0, memory: 3140, langName: C++14, output: hoge
, signal: 0, error: OK, langId: 44, cmpinfo: , source: #include <iostream>

int main(int argc, char** argv)
{
        std::cout << "hoge" << std::endl;
        return 0;
}

, result: 15, stderr: , time: 0.0, date: 2015-01-24 12:52:06, input: , langVersion: gcc-4.9.2, public: True}

あと何回 API が使えるかどうかはアカウント設定ページの右側 manage codes のところで確認できます。


iutest で使う
コードが実行できるようになったので、iutest で実行してみました。

が、よくわからないエラーが出ました。
$ make sample USER=xxxx PASSWORD=xxxx
python iuideone.py sample.cpp -u xxxx -p xxxx --expand_include --encoding utf-8-sig
Traceback (most recent call last):
  File "iuideone.py", line 190, in <module>
    main()
  File "iuideone.py", line 187, in main
    run(options)
  File "iuideone.py", line 179, in run
    r = run_ideone(code, options)
  File "iuideone.py", line 124, in run_ideone
    r = i.create_submission(code, language_name=options.compiler, std_input=options.stdin)
  File "build/bdist.cygwin-1.7.32-i686/egg/ideone/__init__.py", line 176, in create_submission
  File "build/bdist.cygwin-1.7.32-i686/egg/suds/client.py", line 542, in __call__
  File "build/bdist.cygwin-1.7.32-i686/egg/suds/client.py", line 602, in invoke
  File "build/bdist.cygwin-1.7.32-i686/egg/suds/client.py", line 649, in send
  File "build/bdist.cygwin-1.7.32-i686/egg/suds/client.py", line 702, in failed
  File "build/bdist.cygwin-1.7.32-i686/egg/suds/bindings/binding.py", line 258,in get_fault
  File "build/bdist.cygwin-1.7.32-i686/egg/suds/sax/parser.py", line 136, in parse
  File "/usr/lib/python2.7/xml/sax/expatreader.py", line 107, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/usr/lib/python2.7/xml/sax/xmlreader.py", line 123, in parse
    self.feed(buffer)
  File "/usr/lib/python2.7/xml/sax/expatreader.py", line 214, in feed
    self._err_handler.fatalError(exc)
  File "/usr/lib/python2.7/xml/sax/handler.py", line 38, in fatalError
    raise exception
xml.sax._exceptions.SAXParseException: <unknown>:1:49: syntax error
Makefile:17: recipe for target 'sample' failed
make: *** [sample] Error 1


ライブラリをちょこっといじってプリントデバッグしたところ、500 が返ってきてることがわかりました。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator,
 contact@ideone.com and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.</p>
<p>More information about this error may be available
in the server error log.</p>
</body></html>

コードが長すぎるのでしょうかね…
(ボーダーラインを調べようとしたが、確定できなかったので長さだけが原因ではないかも)

というわけで、またもや Wandbox の偉大さを実感する結果となりました。
しばらくは、Wandbox のみを利用しつつ、気が向いたときにまた別のオンラインコンパイラーを試したいと思います。

0 件のコメント:

コメントを投稿