読者です 読者をやめる 読者になる 読者になる

Azure Virtual MachineでLet's Encryptを使おう!

かなりくだらない内容なので見なくてもいいです。あっている自信もないです。

適当に書いているので、その気分がなったら修正します。

PythonとそのフレームワークであるFlaskでLineBotを作ろうと思い、運用のためにMicrosoft AzureのVirtual MachineでUbuntu16.04 LTSを新規作成し、NginxやらPython3系用にpyenvやらあれやこれをどんどん入れました。

で、LineBotは通信のためにHTTPS通信でないとダメみたいなので、SSL証明書が必要なわけです。 opensslでも良かったのですが、もっと簡単にしたいなぁと考え、Let's Encryptを使おうと思いました。

以下経緯

( ^o^)SSL証明書を手に入れよう!

( ˘⊖˘) 。o(まてよ?先にcloudapp.netが使えるのか調べるべきでは?)

|Azure support (cloudapp.net) - Let's Encrypt Community Support| ┗(☋` )┓

三 ( ◠‿◠ )☛まず独自ドメインを手に入れるべきだぞ

▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああああああああああああああ"

普通最初に気づくべきでしたね。

とてもつらい思いをしました。

千円なくしました。

f:id:be_07:20160621091005j:plain

暑い日

我が家は8月あたりにならないとクーラーを使わないので、ベッドで寝るときとても苦労します。

なので今日みたいな日は氷枕が手放せません。

ストップ温暖化

PDOで起きた問題

メモ
  • 学校の講義でPDOを使う機会があり、かなり苦しめられたのでメモ代わりに残します。
  • 解決できませんでした。

JavaScriptPHPSQLを使ってデータベースの内容を非同期通信でウェイ!って表形式で表示する内容なのです。

コード

<?php

// 省略

// 追記部分
  if ($_POST['id'] == null && $_POST['name'] != null && $_POST['address'] != null && $_POST['email'] != null) {
      $name = $_POST['name'];
      $address = $_POST['address'];
      $email = $_POST['email'];
      $stmt = $pdo -> prepare("INSERT INTO ".table."(name, address, email) VALUES (?, ?, ?)");
      $stmt->bindParam(1, $name, PDO::PARAM_STR);
      $stmt->bindParam(2, $address, PDO::PARAM_STR);
      $stmt->bindParam(3, $email, PDO::PARAM_STR);
      $stmt->execute();
      $stmt = $pdo->prepare("SELECT * FROM ".table);
      $stmt -> execute();
      $result = $stmt->fetchALL(PDO::FETCH_ASSOC);
  }

// この後、$resultをjson_encodeしてechoで出力する
?>

id以外テキストボックスに何かしらの文字が書かれている場合、INSERT文で挿入し、その後SELECT文で全件取得するという内容です。 何も考えずにそのまま実行したところ、表が表示されない・・・

要素を検証したところ

Uncaught TypeError: Cannot read property 'insertCell' of undefined

は?

どうやら連想配列を要素とした配列として返すはずなのに、挿入した内容のみをresponseされたせいで、存在しないよってエラー吐いてるみたいです。 一応追加自体は出来ていますが、モヤモヤするので直します。

SAの方とあれこれ試してみるも結局できない。 仕様か?と悩み始めたところで

PDOStatement::closeCursor() 使うのでは?

とのアドバイスを受け修正。

PHP: PDOStatement::closeCursor - Manual

<?php

// 省略

// 追記部分
  if ($_POST['id'] == null && $_POST['name'] != null && $_POST['address'] != null && $_POST['email'] != null) {
      $name = $_POST['name'];
      $address = $_POST['address'];
      $email = $_POST['email'];
      $stmt = $pdo -> prepare("INSERT INTO ".table."(name, address, email) VALUES (?, ?, ?)");
      $stmt->bindParam(1, $name, PDO::PARAM_STR);
      $stmt->bindParam(2, $address, PDO::PARAM_STR);
      $stmt->bindParam(3, $email, PDO::PARAM_STR);
      $stmt->execute();
      $stmt->closeCursor();
      $stmt = $pdo->prepare("SELECT * FROM ".table);
      $stmt -> execute();
      $result = $stmt->fetchALL(PDO::FETCH_ASSOC);
  }

// この後、$resultをjson_encodeしてechoで出力する
?>

これだと思いながら実行したところ

Uncaught TypeError: Cannot read property 'insertCell' of undefined

f:id:be_07:20160610192407j:plain

もう打つ手がなかったので、$pdoをnullにするという暴挙に出ました。

<?php

// 省略

// 追記部分
  if ($_POST['id'] == null && $_POST['name'] != null && $_POST['address'] != null && $_POST['email'] != null) {
      $name = $_POST['name'];
      $address = $_POST['address'];
      $email = $_POST['email'];
      $stmt = $pdo -> prepare("INSERT INTO ".table."(name, address, email) VALUES (?, ?, ?)");
      $stmt->bindParam(1, $name, PDO::PARAM_STR);
      $stmt->bindParam(2, $address, PDO::PARAM_STR);
      $stmt->bindParam(3, $email, PDO::PARAM_STR);
      $stmt->execute();
      $stmt->closeCursor();
      $pdo = null;
      $pdo = new PDO('mysql:host='.host.';dbname='.dbname,user,pass, $options);
      $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $stmt = $pdo->prepare("SELECT * FROM ".table);
      $stmt -> execute();
      $result = $stmt->fetchALL(PDO::FETCH_ASSOC);
  }

// この後、$resultをjson_encodeしてechoで出力する
?>

祈るような気持ちで実行したところ

Uncaught TypeError: Cannot read property 'insertCell' of undefined

f:id:be_07:20160610191552j:plain

結局

JavaScript側でどうにかしました。 結局できなかったのは自分ができないだけなのか、PDOの仕様なのか分からずじまいでした・・・

最後に

f:id:be_07:20160610192559p:plain

すごいHaskell みんなで学ぼう

友達とみんなですごいH本を読みながらHaskellの勉強会やり始めました。

頑張ります!

バブみ

最近のオタクは、俺の嫁よりもママと呼ぶ人が多いらしいのでバブみを感じられるオタクソリューションが求められるのではないだろうか

TensorFlowを使って算数②

メモ

be-07.hatenablog.com

上記の続き。次はTensorBoardを使ってグラフの可視化も行います。

実行環境は同じPython3です。

途中までしか書いていません。修正します。

コード

import tensorflow as tf


def x2_plus_b(x, b):
    # 関数の第一引数 x を出力する _x という名前の定数型のopを定義
    _x = tf.constant(x)
    # 関数の第二引数 b を出力する _b という名前の定数型のopを定義
    _b = tf.constant(b)
    # resultに_xの2乗を代入
    result = tf.square(_x)
    # resultに_bを加算
    result = tf.add(result, _b)
    # resultを返す
    return result


def monitor_calculation(x, b):
    # Graph のタイトルを付ける。
    title = "b = {0}".format(b)
    # c = x^2 + b
    c = x2_plus_b(float(x), float(b))
    # TensorBoardで表示する。第一引数でtag付け。第二引数は値
    s = tf.scalar_summary(title, c)
    m = tf.merge_summary([s])  # if you are using some summaries, merge them
    return m


if __name__ == '__main__':
    # Session オブジェクトを作成し、sessという別名をつける
    with tf.Session() as sess:
        # 計算したsummaryを、tf.train.SummaryWriterで書き出す writer に代入
        # その際に、フォルダの直下に "log" ファイルが作成され、出力される。
        writer = tf.train.SummaryWriter("log", graph_def=sess.graph)
        # -10 から 11までの数字
        xaxis = range(-10, 12)

    # 三回ループする
    for b in range(3):
        for x in xaxis:
            # monitor_calculation を実行し、summary_str に代入
            summary_str = sess.run(monitor_calculation(x, b))
            writer.add_summary(summary_str, x)

実行結果

WARNING:tensorflow:When passing a `Graph` object, please use the `graph` named argument instead of `graph_def`.

???

どうやらgraph_defというのは非推奨らしい。 直します。

writer = tf.train.SummaryWriter("log", graph=sess.graph)

TensorBoardを実行

tensorboard --logdir=/path/to/log-directory

f:id:be_07:20160609104930p:plain

グラフができました。

qiitaの記事だとGRAPHを押すと、データフローが可視化されるはずですがエラーが。なぜ