HarukaのMEMO

Linuxやプログラミング関係の備忘録

簡単グラフ描画ライブラリPlotlyをTornado上で動かしてみる

少し前から Plotly という Python のグラフ描画ライブラリを使うようになりました.
これが Matplotlib より簡単で,シンプルなグラフ描画なら結構使えるということがわかり,自身の研究にも用いたりしています.

そして,Plotly で検索をかけると一緒に出てくるのが Dash という Web アプリケーションライブラリ.

何でも,Plotly を簡単に Web で描画するためにあるらしく,実際 Dash を使うと簡単に Web アプリケーションとして作り上げられます.

しかし,以前から私は Python の Web アプリケーションライブラリといえば Tornado を用いています.使い勝手が違う Dash で本格的に Web アプリ開発は厳しそうだなと感じたので,Plotly をうまく Tornado にのせられないか,と今回試してみました.

結果は意外とすんなりいけました.

Tornado とは

Wikipediaから

TornadoはPythonで書かれたスケーラブルでノンブロッキングなWebサーバ、Webフレームワークである。FriendFeedによって開発され、Facebookに吸収されたのちにオープンソース化された。

ja.wikipedia.org

環境

OS: Open SUSE tumbleweed
Python version: Python 3.6.8

ライブラリのインストール

$ pip install plotly tornado

Tornadoのコード

app.py
import tornado.ioloop
import tornado.web
import os
import plot

# '/' が呼ばれたときの処理
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        # "index.html" と一緒にグラフのデータを渡す
        self.render("index.html", 
                   graph_01=plot.graph_01()    # 描画したいグラフの呼び出し
                  )

# application オブジェクトの作成
def make_app():
    return tornado.web.Application(
        [
            (r"/", MainHandler),    # '/' と MainHandlerの結びつけ
        ],
        template_path=os.path.join(os.getcwd(),  "templates"),
        static_path=os.path.join(os.getcwd(),  "static"),
    )

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)    # ポート番号の選択
    tornado.ioloop.IOLoop.current().start()    # 実行

次に templates というディレクトリを作成し,その下に index.html を置きます.

index.html
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Display Demo</title>
</head>
<body>
    <h1> Display Demo </h1>

    <div id="main">
        {% autoescape None %}
        <p>{{graph_01}}</p>
     </div>
</body>
</html>

index.html 内の

{{graph_01}}

の部分でグラフを描画しています.{{ }} は Tornado が html 内で変数展開するための表記です.
また,

{% autoescape None %}

も必要であり,これは render で受け取った文字列を素の文字列として表示するのではなく,動作するコードとして描画するための表記です.
これに関しては以前にこのブログで書いています.
haruka0000.hatenablog.com

それでは次に Plotly 部分を説明します.

Plotlyのコード

plot.py
import plotly
import plotly.graph_objs as go

def graph_01():
    plot_obj = plotly.offline.plot({
                "data": [go.Scatter(x=[1, 2, 3, 4], y=[4, 5, 2, 8])],   # 描画したいデータ
                "layout": go.Layout(title="hello world"),    # タイトル
               }, auto_open=False, output_type="div")   # 出力タイプを'file'から'div'へ変更

    return plot_obj

これだけです.
Plotly をオフラインで使い,描画部分のみを利用しています.
今回のであれば,オンライン部分を Tornado が受け持っていることになります.
output_type を file にすると,結果が html で保存されますが,今回は html のデータそのものが欲しいので,div にします.

これであとは実行するだけです.

実行

$ python app.py

そして,
http://localhost:8888/
にアクセスすると,以下のような画面が表示されており,完成です.

f:id:krulcifer-einfolk-fafnir:20190114230238p:plain
実行結果

最後に

正直この記事はニッチな要望というか,自分のメモのためにだけ書いているようなものです.
わざわざ Dash を使わずに Tornado で Plotly を使う人はいないと思います.
しかし,私は以前プロコン用に Tornado でそこそこ機能をつけた Web アプリを開発した経験があり,Tornado の書きやすさ,特に素の Python に近い書き方で実装できる点が忘れられずやってみました.
こんな使い方は推奨しませんが,Tornado は本当にいいと思うので, bottle や Flask, django 以外の選択肢として選んでみても面白いと思います.

GitHub で同じコードを公開しています.
github.com

サラマンカ留学④ 〜 サラマンカへ移動 〜

サラマンカへの移動はバスをおすすめしているサイトが多かったので,高速バスを使いました.

高速バスの予約

Avanzaというスペインの高速バスのサイトで予約しました.

出発地:Madrid Aerop.T4
到着地:Salamanca
で予約します.One wayは片道,Return wayは往復で,往復で予約するほうが手数料的にも安いのですが,私は5ヶ月の滞在のため,直前にどこか寄って帰りたくなるかもと考え,片道で予約しました.

f:id:krulcifer-einfolk-fafnir:20190110220156p:plain
avanza予約サイト
booking.avanzabus.com
時間によっては,予約がNot Availableとなっている時間もあります.
飛行機が着く時間から1時間半くらいは余裕があるバスを選ぶほうがいいと思います.

あとは,普通の予約サイトと変わらないので,省きますが,ここは注意が必要と思いましたので,残します.予約者情報の入力ページですが,Document Typeという欄がありますので,そこはデフォルトではNIF/NIEになっていると思いますので,それをPassportに変更して,パスポート番号を入力してください.NIF/NIEはたしかスペインでのマイナンバー的なものだったかな?
ZipCodeは郵便番号なので,スペインの住む場所の郵便番号でいいと思います.

f:id:krulcifer-einfolk-fafnir:20190110221255p:plain
Avanza個人情報入力ページ

予約ができたら,サイトでPDFがダウンロードできるようになります.もしくは入力したメールアドレスにPDFが添付されたメールが届きます.

そのPDFにはQRコードがあり,それがチケットになりますので,印刷するか,スマホで提示できる状態にしておいてください.スマホの場合はオフラインの場合でも開けるように端末側に保存しとくほうがいいです.ただ,いつスマホが調子悪くなるかもわからないので,移動中に予約した人以外は家で印刷して持参するのがいいと思います.
私は成田空港で予約したので印刷しませんでしたが…

バス乗り場に移動

これが正直一番不安でした.日本のバス乗り場は,例えば東京方面や大阪方面,高速バスと市内バス,シャトルバスという風に別れていると思いますが,バラハス空港第4ターミナルの乗り場は,表記がありません.そして,すべて隣合わせの駐車スペースです.1〜10番くらいまで番号が振られており,ざっくりと1〜4番くらいが高速バスとなっていました.

そして,出発予定のバスの時刻表等もないので,到着したバスの前側の表記と到着した時刻から判断して乗りました.
待っている間中,
 「ここで合っているのか.」
 「Avanzaのバスと見てわかるのだろうか.」
 「Avanzaはそもそも予約サイトの名前でバスは別の会社が運行してるのではないだろうか.」
 「時間通りに来るのか.」
と不安でしたが,問題なく乗れました.時間もちょうどくらいに来て,バスにはAvanzaの文字があり,「Madrid 〜... 〜 Salamanca」と電光掲示板が前についていました.

まず,スーツケース等の荷物を自分で勝手に荷室に積み込みます.
その後,運転手にチケットを見せて確認してもらい,乗り込みます.

乗り場の場所も私は不安だったので以下に残しておきます.
確かこのときは3番で乗ったと思いますが,少し早めに来て,1〜4くらいが見える場所で待機しておくほうがいいと思います.
goo.gl

バス移動

基本的にサラマンカまで直でいくので,乗っているだけでいいです.
車内は,WiFiが使えます.
しかし,時間か容量かどちらかの制限があるので,ずっとは使えなかったと思います.
暇をつぶすなら,飛行機のエンタメシステムと同じ,映画等を見られる車載タブレットがあるので,それを見るか,景色を見ているほうがいいと思います.景色は特になんの特徴もなかったですが...

私同様にSIMは現地で購入する予定で,かつ空港のSIMは高いのと胡散臭そうで嫌という理由で買わないような人がもしいれば,車内WiFiサラマンカに着く直前で使ったほうがいいと思います(レアケースすぎるが笑)そして,そのときにサラマンカ周辺の地図をGoogle MapにDLしておくほうがいいと思います.

なぜなら,私は結構早い段階で,車内WiFiを使い切り,インターネットなしの状態でサラマンカに到着し,「まあ,GPSはネット無しでも使えるからホテルまで行けるやろ」と思っていたのですが,甘かったです.以下にその顛末を示します.

サラマンカで迷う

Google Mapが表示されるのは直近で見た地域周辺だけで,それ以外は一度ネットに繋がないと見えません.

それを忘れてたので,私のMapで見えるのは,遥か離れたMadrid周辺の地図,
そして,現在地に飛ぶと何もない荒野にポツンと佇む青い点と,たまたま先にお気に入り登録していた明後日から住む寮の場所を示す点,そして大学を示す点の3点だけでした(笑)

バス到着地付近の店は到着時刻(20:30くらいかな)には閉まっており,そもそもスペイン語は喋れず,というか人がいなくて...


ホテルを予約したときにざっくりと確認した寮と大学の2点との位置関係を必死に思い出して,相対的にこの辺だったよな,とそちらに向かって歩きました.

石畳の道路なので,何度も重いスーツケースが引っかかり,時々勝手に車輪のストッパーがかかってつんのめりながら,歩きました.

21時くらいになって,流石にあまり遅い時間に一人で歩くのは危険と思ったので,docomoスマホのデータローミングを一瞬だけ使って,Google Mapにオフラインでのローカル地図をDLしました.

というか,わりと勘だけでホテル近辺にまで来れてたのがわかりました.
1,980円もったいないな,とは思いましたが...

それでなんとかホテルまでつきました.結果的に1,980円払うなら空港で探して買っても良かったかな,という感じです.空港で見かけたSIMショップは高かったのと同時に売り切れてたのもあって辞めたので,最近はAmazonで事前に買えるみたいだからそのほうが賢いのでしょうね.

サラマンカ留学③ 〜 マドリード到着 〜

マドリードのバラハス空港に到着後の移動を書きます.

入国審査

飛行機を降り,ひたすらarrivalの方に向かって移動していきます.途中,ガラス張りの通路を左折し,開きっぱなしのドアの方に進んだ記憶があります.
波打った天井の建物をひたすらBaggagesの方に進みます.

入国審査に並ぶところに到着するとスタッフがEUの国から来た人とそれ以外の人で別れるように支持を出してくれます.
All passportsのほうに並べばいいです.

スペイン人の審査官は陽気でした.私の並んだところだけかもしれませんが.
 スペイン人審査官 「Your name is 〇〇?」
 私        「Yes!」
 スペイン人審査官 「Ok. アリガトウ」
 私        「グラシアス」
とお互いの国の言葉で感謝してパスしました(笑)


そしてそこからBaggagesの文字を追いかけどんどん地下に降りると,地下鉄があり,地下鉄でターミナル4(T4)に移動になります.ちなみに今いるのはT4Sという場所になります.

荷物の受け取り

地下鉄を降りてエスカレータを上がると荷物受け取り所につきます.
この掲示板で便名を確認し,その場所で待ちます.

QR149便であれば,2番でした.

受け取ったら,Exitの方へ行くと出られます.
simは空港販売だと高いと聞いたので,空港内と次に乗る高速バスにもWifiがあるので,買いませんでした.

サラマンカ留学② 〜 渡航 〜

航空券の調達から乗り継ぎと到着に関して書こうと思います.

航空券の選定

航空券はエアトリを使って探しました.エアトリでないと行けないというわけではないのですが,予約サイトによっては,予約したのに当日にできてないなどのトラブルがあるらしく,国内で大手だろうと思われるエアトリを選びました.
格安航空券・飛行機チケット・LCC(国内線)比較検索予約サイト【エアトリ】

複数のレビューサイトを見て,航空会社を選びましたが,ざっくりいうと,

  • 韓国と中国系は好みが別れる(というか悪い)
  • ロシア航空も評判があまり
  • 日本のは高い(1.8〜2倍くらい,時期にとって違うはず)
  • エミレーツやエティハドも当たり外れがあるみたい

というかんじなので,キャセイ,ルフトハンザ,カタール航空の中から選ぶことにしました.
そして,移動時間があまり長すぎず,かといって乗り継ぎが2時間を切らないものを探し,その時最も安く条件にマッチしたカタール航空を選びました.

選んだ便は,QR807便からQR149便に乗り換えるものです.
東京 〜 ドーハ 〜 マドリード で乗り継ぎます

ドーハへ

私は成田からの搭乗でした.
カタール航空第2ターミナルJカウンターでした.
持ち込み荷物が7キロまでなの忘れてて焦りました.預け入れ荷物は30キロまでだったかな.

機内

出発時刻が早まることがあるので,早めに移動するほうがいいです.
私の場合も22:20が22:00に変更になりました.

機内は以下の感じです.わりと綺麗と感じました.
機内のアナウンスはQR807では日本語もありました

機内食は焦って和食を選んでしましました.まさかドーハに行きながらざる蕎麦を食べるとは.

もう一食はキッシュにしました.

マドリード

ドーハのハマド空港に到着し,ひたすらTransitのほうに歩いて行くと,黄色いでかいクマに会えます.


自身の乗る便を青の電光掲示板で確認し,そちらに向かいます.

QR149便は確か搭乗口がD18でDとかFはモノレールで移動です.
でかい看板でDとか書かれてるので大丈夫と思います.

飛行機までの移動はバスでした.

そして搭乗.
QR807便に比べると機体が古い感じがありました.
ここでは流石に機内アナウンスは日本語がありませんでした.当たり前ですが.

機内食は朝食がベーコンとスクランブルエッグ,昼食がミートパイでした.
朝食と昼食の間隔が短かったせいか,昼食は簡素に感じました.

サラマンカ留学① 〜 査証申請 〜

サラマンカに留学にあたり,多くのサイトやブログを参考にさせて頂き,またその都度情報は最新でないと怖いなと感じたので,次にサラマンカに行く誰かの役に立てたらと思い,ここに残させていただきます.

特に心配症の私が,ここも書いておいて欲しかった,と思った点について書いて行ければと思います.

スペイン査証の調達

早速,これに関しては少し前なので情報が曖昧になり,申し訳ないのですが,重要と思った点に関してのみ記載します.

準備の開始

申請に約1ヶ月,長ければ2ヶ月近くかかり,その書類の準備にも時間がかかることから,3ヶ月前くらいからゆったりと準備するといいと思います.

メールでビザ書類の調達

私の場合は,短期留学査証にあたるのですが,これが2018年に要項が変わったらしく,しかもその変更がスペイン大使館の公式サイトからDLできるものに反映されていません.
www.exteriores.gob.es

大使館のメールアドレスに,「短期留学(nヶ月)の査証を申請したいのですが.」と送ると,本文に「必要書類を添付しました」とだけかかれたメールが返って来ます.
「駐日スペイン大使館 〇〇部…」的な文面かと思っていたので,びっくりしました.自動返信メールかと思いましたが,後に違うようだとわかりました.

書類作成

書類は基本的に送られてきたものをベースに作ればいいのですが,2018年の更新の際に一部表記の欠落があったりしているので,現在公開されているもの(旧)とメールで受け取ったもの(新)の2つの必要書類欄を見比べながらしたほうがいいかもしれません.
実際,私の申請時には,受け入れ機関の承諾書類的なものがスペイン語期間について明記されているものでないといけないようですが,そのことについて新書類では書かれておらず,相手先の期間が私に気を使って英語で作成してくれたものを再度スペイン語で作成してもらい,後日発送することになりました.

わざわざ大使館に提出に行ったのに〜.

大使館に提出

作成した書類は大使館に直接提出に行く必要があります.
いろいろなサイトで書かれている通り,平日かつ昼12時までに行わなければいけません.
そして,申請者が多い時期は混むので開館と同時に入るほうがいいと思います.

私と同じ田舎者のために,場所について書いておきます.
最寄り駅:六本木一丁目駅
泉ガーデンパークの方に向かってひたすらエスカレーターを登って,ガーデンパークを超えて道路に出たら左折です.そしたらスウェーデン大使館か何かの向かいにあります.

開館は9:30だったかな.私はどこから入っていいのかわからず,「大使館って警備が厳重そう…」という恐怖心があり,なかなか踏み込めませんでしたが,明らかな正門の左側の小さな関係者入り口のようなところから入ってオッケーでした.
手荷物検査を受けて,ボロボロの番号札を受け取り,あとは呼ばれるのを待ちます.

少し開館より早くついても,入れてくれてるみたいでした.

大使館で査証の受け取り

査証申請が通ったとメールが来るので,上述の時間と同じ12時までに受け取りに行きます.

これからスペインへ

留学

前々から準備していましたスペインへの留学出発日になりました。
大学の実務訓練という名目でサラマンカ大学の研究室に行き、そこで研究をします。
今後は、スペインの写真をいくつかあげるかもしれない。

ただ、さっそくカメラの充電器を忘れたので、充電器を現地調達しないと(^^;)

Cettiのスニーカー

Cettiのスニーカーを買いました

スペインのスニーカーブランドの Cetti のスニーカーを先日アメ横のイケダヤ靴店さんで買いました.

伸縮性の高い生地とブルーの本革の組み合わせで,履き心地も良いです.

先日,高速バスに遅れそうになって不本意ながらこのスニーカーで走りましたが,フィット感よくただのデザイン性重視のスニーカーじゃないんだな,と感じました.

先日も同店で,Slowwalk のスニーカーを購入させていただきましたが,どちらもスペイン製ということで,どっちをスペインに履いていくか迷いますね.

向こうでもいろいろ買って,帰りの荷物が困りそうな予感(笑)