「Google Cloud Platform(GCP)へのワークロードの移行過程では、複数のデータセンター間で通信のセキュリティを強化することが必要でした。ファイアウォールや場当たり的な認証といった旧来の方法では、あっという間に ACL がぐちゃぐちゃになってしまい、とても対応できません。一方、Cloud Endpoints は標準化された認証システムを提供してくれました。」 — Laurie Clark-Michalek 氏、Qubit のインフラストラクチャ エンジニア
「本番リソース用の SSL 証明書を更新した経験のある方は、それがいかにストレスの多い、ミスが起こりやすい作業であるかを知っています。そうしたことから、私たちは App Engine のマネージド SSL 証明書にとても期待しています。カスタム ドメインにプログラムで簡単に暗号化を追加できるだけでなく、更新プロセスも完全に自動化されています。これは私たちエンジニアにとって、オペレーション リスクが減るということです。」 — James Baldassari 氏、mabl のエンジニア
$ gcloud beta app domain-mappings update DOMAIN --certificate-management 'AUTOMATIC'
1019.00, 492.00, 739.00 1023.00, 492.00, 737.00 1019.00, 491.00, 738.00 1022.00, 491.00, 739.00 1018.00, 492.00, 740.00 1023.00, 491.00, 734.00 1018.00, 492.00, 740.00 ...
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) ax.scatter(g_data[:,0], g_data[:,1], g_data[:,2], c=g_label) plt.show()
import tensorflow as tf weights = tf.Variable(tf.zeros([3, 3]), dtype=tf.float32) biases = tf.Variable(tf.zeros([3]), dtype=tf.float32) glove_data = tf.placeholder(tf.float32) rps_data = tf.matmul(glove_data, weights) + biases
rps_labels = tf.placeholder(tf.float32) loss = tf.losses.softmax_cross_entropy(onehot_labels=rps_labels, logits=rps_data)
[[1 0 0] [1 0 0] ..., [0 1 0] [0 1 0] ..., [0 0 1] [0 0 1]]
[1 0 0]
[0 1 0]
[0 0 1]
# define an optimizer optimizer = tf.train.GradientDescentOptimizer(learning_rate=1).minimize(loss) # create a Session sess = tf.Session() # init the variables initializer = tf.global_variables_initializer() sess.run(initializer) # train the model for i in range(10000): sess.run(optimizer, {glove_data: g_data, rps_labels: g_label})
steps = 0, loss = 0.978381 steps = 1000, loss = 0.010096 steps = 2000, loss = 0.005078 steps = 3000, loss = 0.003402 steps = 4000, loss = 0.002562 steps = 5000, loss = 0.002057 steps = 6000, loss = 0.001719 steps = 7000, loss = 0.001478 steps = 8000, loss = 0.001296 steps = 9000, loss = 0.001154
float weights[3][3] = { {3.007032,-9.370312,6.363242}, {10.726093,-0.494137,-10.231989}, {3.132884,-6.927588,3.794688}, };
float lg[3]; lg[0] = (d[0] * weights[0][0]) + (d[1] * weights[1][0]) + (d[2] * weights[2][0]) + biases[0]; lg[1] = (d[0] * weights[0][1]) + (d[1] * weights[1][1]) + (d[2] * weights[2][1]) + biases[1]; lg[2] = (d[0] * weights[0][2]) + (d[1] * weights[1][2]) + (d[2] * weights[2][2]) + biases[2];
// control servo if (lg[0] > lg[1] && lg[0] > lg[2]) { analogWrite(5, 190); // rock -> paper } else if (lg[1] > lg[0] && lg[1] > lg[2]) { analogWrite(5, 127); // paper -> scissors } else { analogWrite(5, 50); // scissors -> rock }