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| ┗(☋` )┓
三 ( ◠‿◠ )☛まず独自ドメインを手に入れるべきだぞ
▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああああああああああああああ"
普通最初に気づくべきでしたね。
とてもつらい思いをしました。
千円なくしました。
暑い日
我が家は8月あたりにならないとクーラーを使わないので、ベッドで寝るときとても苦労します。
なので今日みたいな日は氷枕が手放せません。
ストップ温暖化
PDOで起きた問題
- 学校の講義でPDOを使う機会があり、かなり苦しめられたのでメモ代わりに残します。
- 解決できませんでした。
JavaScriptとPHPとSQLを使ってデータベースの内容を非同期通信でウェイ!って表形式で表示する内容なのです。
コード
<?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
もう打つ手がなかったので、$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
結局
JavaScript側でどうにかしました。 結局できなかったのは自分ができないだけなのか、PDOの仕様なのか分からずじまいでした・・・
最後に
すごいHaskell みんなで学ぼう
友達とみんなですごいH本を読みながらHaskellの勉強会やり始めました。
頑張ります!
TensorFlowを使って算数②
上記の続き。次は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
グラフができました。
qiitaの記事だとGRAPHを押すと、データフローが可視化されるはずですがエラーが。なぜ