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 のみを利用しつつ、気が向いたときにまた別のオンラインコンパイラーを試したいと思います。

2015年1月19日月曜日

paiza.IO の API を使ってみた


paiza.IO はオンラインコンパイラーの1つです。

特徴としては、
  • 多彩な言語
  • 複数ファイルに対応
  • Github(Gist)連携
  • Twitter から実行
  • ブログパーツ
  • API
といったところでしょうか。

今回は、iutest のテスト環境として使えないかの実験として API を使ってみました。

API 仕様
API の仕様は以下の URL から確認できます。
http://api.paiza.io/docs/swagger/#!/runners/
※ 公式トップからのリンクだと https で接続するのですが、それだと正しく表示されないので注意

API は3つ。
create
コードを送って、コンパイル・実行をします。
create の返答はセッションIDとステータスになります。
実行結果などを取得するには、取得したセッションIDを使って別の API から取得します。

get_status
実行状況を確認する API です。create で返ってきたセッションIDをパラメータに GET します。
GET すると、セッションIDとステータスが返ってきます。

get_detail
ステータスが "completed" になったら、get_detail API で詳細結果を取得します。
こちらもセッションIDをパラメータに GET します。

ビルドおよび実行時の標準出力やエラーの内容、実行時間や使用メモリ量などが返ってきます。

API を試してみる
API仕様のページで「Try it out!」のボタンを押すと、APIを実際に試すことができます。
http://api.paiza.io/docs/swagger/#!/runners/

まずは、runners/create を開いて source_code に適当なコードを書きます。
他のパラメータはデフォルトのままで OK です。

「Try it out!」ボタンを押すと、下のように結果が表示されます。


次に、runners/get_status を開きます。
id のところに create の返答の id のところにある文字列をコピペします。

「Try it out!」ボタンを押すと、下のように結果が表示されます。


ステータスが completed になったら、runners/get_details を開きます。
get_status と同様に id を入力します。


「Try it out!」ボタンを押すと、下のように結果が表示されます。


簡単ですねぇ^^

iutest を使えるようにしてみる
Wandbox と同様に iutest が実行できるようにしてみました。
https://github.com/srz-zumix/iutest/tree/master/tools/paiza.io

で、早速サンプルを実行してみたのですが、
source_code: Too long

ざんねーーん…orz
2万行超のコードでも余裕で実行できる Wandbox の素晴らしさを再確認しました(T^T)

困ったこと
残念な結果に終わりました。
とりあえず、ここまでやってみて困ったことをまとめておきます。

  • でかいコードが実行できない
    実験した結果では、100,000 byte まで実行可能でした。
    iutest のソースコードは 720,334 byte あるので余裕でオーバーしてます。。。
  • コンパイルオプションが指定できない
  • 複数ファイルに対応しているが API からは使えない

まとめ
使ってみた感想としては、API を使って CI 環境の一部として使うのは難しそうだと感じた。
(他の言語、環境によっては十分かもしれないが)
ただ、WEB ページからの実行は便利だと思いました。Twitter のツイートでも実行できるし、公式の謳い文句にあるように勉強会のときには使えるのかも。

iutest としては、次は ideone を試してみようと思ってます。

2015年1月13日火曜日

Twilio を使ってみた - その1

新年あけましておめでとうございますm(__)m
今年もよろしくお願いします。

さて、2015年最初の投稿は「やってみたシリーズ」として Twilio を紹介したいと思います。

Twilio とは

Twilio とは、「電話やSMSを操作できるサービス」です。
Twilio がどういったものかは、こちらが参考になると思います。
ASCII.jp:たった4行で電話が作れるAPI「Twilio」とは? (1/2)|Twilioではじめるクラウド電話開発

なにができるの?
Twilio でできることは、基本的に「電話をかける」ことと「電話を受ける」ことです。(SMS もあります)
電話がかかってきたときの動作や電話をかけることはアプリケーション側の領域になります。
なので、ざっくりと言うとなんでもできます。

例えば、
・電話をかけてくじを引く > Twilio 抽選アプリ | Twilio for KDDI Web Communications
・アプリ間通信 > 株式会社マナボ | 活用事例 | Twilio for KDDI Web Communications
・CI で失敗したり、システムに障害が発生した際に電話をかける
ということができます。
Twilio は既に多くの会社で活用されているようです。公式サイトに活用事例が載っているので、そちらを見るとどのように利用できるかイメージがつかみやすくなると思います。
活用事例 | Twilio for KDDI Web Communications

このように、電話がかかってきたのを起因に何かさせたり、何らかの通知として電話をかけたりなどに利用できます。

とりあえずやってみた
無料のトライアルアカウントがあるのでそちらでやってみました。

その前に
トライアルアカウントを作成する前に、Twilio では考えておくとよいものがあります。
Twilio では電話を受けたり、かけたりする際に URL を叩きます。その先の設定ファイル(TwiML)またはアプリケーションをアップロードする場所が必要になります。

レンタルサーバーを使う手もありますが、今回は TwiML ホスティングサービスの Twimlbin を使っています。
今後、本格的に Twilio を使って開発をする場合はよく考えておくとよいかもしれません。

登録
Twilio のホームページでサインアップをクリック。
以下の様な登録画面が表示されるので、必要情報を入力し「利用開始」ボタンを押します。


次に電話番号の入力画面が出ます。電話番号は国際番号です。


入力したら、「Text Me」ボタンを押します。
すると、入力した電話番号に SMS で数字が送られてきます。
以下の様な認証画面が表示されていますので、そちらに数字を入力し、「Submit」ボタンを押します。


これで登録が完了しました。
トライアル用の番号が発行されます。今回はトライアルのまま進めるので、「始めましょう」ボタンを押します。


テスト
登録後、テスト画面が表示されますのでテストしておきましょう。
テストは電話をかける・うけるの2つができます。

テストで動作を確認したらアカウントポータルに移動しましょう。

電話をうけたときの処理を書く
今回はお試しとして、Twilio に電話をかけて、任意の言葉をしゃべらせます。

まず、今回は Twilio の動作を TwiML で設定したいと思います。
TwiML は、通話や SMS を受信した時の動作を Twilio に指示するための、命令のセットです。
詳細はドキュメントをご確認ください。

今回は任意の言葉をしゃべらせるのでSay 動詞を使います。

TwiML は XML 形式で記述します。今回はこのような TwiML を書きました。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say voice="woman" language="ja-jp">ここにテキスト</Say>
</Response>

Request URL を作成する
Request URL を作成します。
Twilio は電話がかかってきたときに、指定の URL を叩きます。
この URL を作成します。

この URL は TwiML を返す URL であればなんでも構いません。
今回は TwiML ホスティングサービスの Twimlbin を利用して URL を作成したいと思います。

まずは、Twimlbin を開いて、「Create A New Twimlbin」を押してください。


編集ページが開くので、先ほどの TwiML の内容をテキストボックスにコピペします。
入力すると自動で保存がされます。


URL はテキストボックの下に表示されています。
Private, Public どちらでもよいので、URL をコピーしてください。

Private の URL は、あとで TwiML の編集が可能な URL です。
Public の URL は、編集不可な URL です。
(使用目的にあわせて使い分けてください)

これで、Request URL の作成は終わりです。

URL を設定する
再び Twilio のダッシュボードに戻ってください。
電話番号をクリックすると、以下の様な画面になります。


音声通話のところに Request URL を入力し、保存を押します。

これですべての設定が完了しました。

サンプル
下記番号に電話をかけるとあいさつをしてくれます。
※ トライアルアカウントなので最初にテスト用メッセージが流れます。
※ 通話料が発生します。


終了しました。

というわけで、
あけましておめでとうございます。今年もよろしくお願いしますm(__)m

参考にしたところ

次回
次回は押された番号で別々の処理をするようにしてみたいと思います。