技術系メモ

メモ。内容は保証しません。

はてなブログのmarkdown編集で、最適化問題を記述するためのコードメモ

$$
\begin{aligned}
& \text{maxmize} && m \\\\
& \text{subject to} && \sum\_{a\_1 \in A\_2}\pi(s, a\_1)Q(s, a\_1, a\_2) \leq m && \forall a\_2 \in A\_2 
\end{aligned}
$$

以下、出力

$$ \begin{aligned} & \text{maxmize} && m \\ & \text{subject to} && \sum_{a_1 \in A_2}\pi(s, a_1)Q(s, a_1, a_2) \leq m && \forall a_2 \in A_2 \end{aligned} $$

【ajax, flask】flaskのアプリケーションでajax通信を行うサンプル

ajax通信でget送信をし、結果を受け取る簡単なサンプルコードを紹介します。

ディレクトリ構成は以下のようになってます。
(javascriptのファイルはhtmlに書いちゃってます)

├── app.py
└── templates
    └── index.html

html

まずhtml側のコード。

<html>
  <head>
    <meta charset="utf-8">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

    <script  type="text/javascript">
      function test_ajax(){
        var value = document.getElementById("value").value;
        // 以下のコードでajax通信を行う
        $.ajax({ 
          type:"GET", 
          url:"/test_ajax/",
          data:{
            value:value , 
          }, 
        })
          .done(function(data, text, jq){
            $('#result').html(data["result"]);
          });
      }
    </script>
  </head>

  <body>
    <div>
      <div id="results">
        <input id="value" type="text" value="5">
        <button id="calc", onClick="test_ajax()">送信</button> <br>
        結果:<span id="result"></span>
      </div> 
    </div>
  </body>
</html>

入力された数値をサーバー側に送信して、
返却された値を表示します。
$ajaxの部分がajax通信の部分です。
done以下でサーバーから返却された値を表示します。

flaskのコード

次のflask側のコード。

from flask import *

app = Flask(__name__)


@app.route("/", methods=["GET", "POST"])
def index():
    return render_template("index.html")


@app.route("/test_ajax/", methods=["GET", "POST"])
def test_ajax():
    value = request.args.get("value")
    value = int(value)
    result = value * 2

    return jsonify({
        "result" :result, 
        })


if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=8888, threaded=True)

ajaxのget送信を受け取るのがtest_ajaxメソッドになります。
送信されたvalueを受け取り受けったvalueを2倍にして返してます。

【matplotlib】x軸のラベルを斜めにする

まず、x軸のラベルを斜めにしたコードと、
完成したグラフが以下になります。

import matplotlib.pyplot as plt
import numpy as np

xs = np.arange(5)
ys = [x**2 for x in xs]

fig,ax = plt.subplots()
ax.set_xticks(xs)
# x軸のラベルを斜めにする。rotationで回転する角度
ax.set_xticklabels(xs,rotation=30)
ax.plot(xs,ys)
plt.show()

f:id:ttt242242:20190617044626p:plain

コードの中のコメントにもあるように
ax.set_xticklabelsを用いてラベルを斜めにします。
rotationでどの程度斜めにするかを決定します。

【matplotlib】x軸のラベルの表示間隔の変更

x軸のラベルが多すぎて、重なってしまう際の対処方法についてお話します。

元のグラフ

まず以下のコードで、元のx軸が重なってしまっているコードを表示します。

import matplotlib.pyplot as plt

xs = ["AAAAAAAAAA","BBBBBBBBBBBB","CCCCCCCCCCCC","DDDDDDDDDDD","EEEEEEEEEEE","FFFFFFFFFFFF"]
ys = [1,2,4,8,16,32]
fig,ax = plt.subplots()
ax.plot(xs,ys)

f:id:ttt242242:20190616054020p:plain

x軸の目盛りが重なっています。

x軸の表示する目盛りを変更したグラフ

x軸の表示間隔を変更するコードが以下になります。

import matplotlib.pyplot as plt

xs = ["AAAAAAAAAA","BBBBBBBBBBBB","CCCCCCCCCCCC","DDDDDDDDDDD","EEEEEEEEEEE","FFFFFFFFFFFF"]
ys = [1,2,4,8,16,32]
fig,ax = plt.subplots()

# 変更部分
for idx,label in enumerate(ax.get_xticklabels()):
    if idx % 2 == 0:
        label.set_visible(False)
# ========================================================

ax.plot(xs,ys)

f:id:ttt242242:20190616054024p:plain

ax.get_xticklabels()ですべてのx軸のラベルを取得できます。
そして、非表示にしたライベルに対してset_visibleで表示、非表示を設定します。

恐らく、もっと良い方法があると思いますが、
暫定案として共有させていただきました。

【flask, javascript】flaskからhtml, javascriptに変数を渡す

python側のコード。
単純にxという変数を渡すだけ

from flask import *

@app.route("/", methods=["GET", "POST"])
def index():
     x = 10
     return render_template("index.html",x=x)

flask からhtml

flaskから受け取ったxを取得する

{{x}}

flaskからjavascript

flaskから受け取ったxを取得する

var x = {{x|tojson}}

pybox2dをUbuntuにインストール

まず必要なライブラリをインストールする

sudo apt-get install build-essential python-dev swig python-pygame git

pybox2dをクローン

git clone https://github.com/pybox2d/pybox2d
cd pybox2d

最後にbuildし、インストールする

python setup.py build
python setup.py install

確認してみる

import gym

env = gym.make("LunarLander-v2")
#=>[2019-05-30 05:27:52,569] Making new env: LunarLander-v2