<ItemGroup> <None Include="app.yaml" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup>
runtime: aspnetcore env: flex
dotnet publish -c Release
gcloud app deploy bin\<configuration>\netcore<version>\publish\app.yaml
runtime: custom env: flex
FROM gcr.io/google-appengine/aspnetcore:2.0 ADD ./ /app ENV ASPNETCORE_URLS=http://*:${PORT} WORKDIR /app ENTRYPOINT [ "dotnet", "MainProject.dll" ]
<ItemGroup> <None Include="app.yaml" CopyToOutputDirectory="PreserveNewest" /> <None Include="Dockerfile" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup>
# First let’s build the app and publish it. FROM gcr.io/cloud-builders/csharp/dotnet AS builder COPY . /src WORKDIR /src RUN dotnet restore --packages /packages RUN dotnet publish -c Release -o /published # Now let's build the app's image. FROM gcr.io/google-appengine/aspnetcore:2.0 COPY --from=builder /published /app ENV ASPNETCORE_URLS=http://*:${PORT} WORKDIR /app ENTRYPOINT [ "dotnet", "multistage-2.0.dll" ]
gcloud app deploy app.yaml
kubectl run myservice --image=gcr.io/<your project id>/<app name> --port=8080
gcloud components install kubectl
gcloud container clusters get-credentials
kubectl expose deployment myservice --port=80 --target-port=8080 --type=LoadBalancer
「私たち Shopify は、本番環境に送り込むすべてのコンテナを監視、統制する包括的な方法を探していました。私たちは毎営業日に 6,000 ものビルドを出荷し、33 万種以上のコンテナ イメージを含むレジストリを保守しています。弊社の Kubernetes パイプラインに Grafeas と Kritis を導入すれば、弊社で作るすべてのコンテナ イメージの脆弱性とビルドの情報を自動的に保存し、Shopify ビルド コンテナのポリシーを徹底させることができます。弊社の Kubernetes クラスタは、ビルダーが署名したイメージしか実行しません。Grafeas と Kritis は、デベロッパーをコード開発に専念させつつ、今まで以上のセキュリティ保護に本当に役に立ちます。より多くの企業が Grafeas と Kritis をプロジェクトに組み込むことを期待しています。」 — Jonathan Pulsifer 氏、Shopify のシニア セキュリティ エンジニア(Shopify のブログもご覧ください)
「新しくリリースされた App Engine ファイアウォールのおかげで、リソースが豊富なハッカーが私たち Reblaze のゲートウェイを迂回して App Engine アプリケーションに直接アクセスしようとしても、防止できるようになりました。この新機能により、お客様は Reblaze の包括的なウェブ セキュリティ機能(DDoS 保護、WAF/IPS、ボット緩和、フルリモート管理など)を App Engine で利用できます。」 — Tzury Bar Yochay 氏、Reblaze Technologies の CTO
「App Engine ファイアウォールにより、お客様は、Cloudflare の IP アドレスからのトラフィックだけを受け入れるようにアプリケーションをロックできます。Cloudflare はリバース プロキシ サーバーを使用しているので、App Engine ファイアウォールと Cloudflare の統合により、アプリケーションのオリジン サーバーへの直接アクセスの防止が強化され、Cloudflare は悪意ある挙動をフィルタリングし、ブロックできます。」 — Travis Perkins 氏、Cloudflare のアライアンス責任者
「Palo Alto Networks は、この機能の設計とユース ケースに関して Google Cloud と密接に共同作業を進めてきました。複数のネットワーク インターフェースをサポートした VM により、プライベート データセンター時代と同様のエンタープライズ セキュリティを提供できます。私たちの顧客企業は、GCP に入ってくるトラフィックだけでなく、GCP プロジェクト間や VPC 間のトラフィックも調査できるようになります。」 — Adam Geller 氏、Palo Alto Networks の仮想化およびクラウド製品管理担当 VP
「私たちは、NETSCOUT のパケット ベースのアプリケーション アシュアランスを GCP のマルチインターフェース VM インスタンスに拡張できることを示すため、Google と協力して作業を進めてきました。そのことをうれしく思っています。GCP の顧客企業は、ユーザー エクスペリエンスや運用効率、生産性に影響を与える問題を先取り的に見つけ出して、クラウドへの移行やハイブリッド クラウドへのデプロイの中断を最小限に抑えつつ、マルチインターフェースのメリットを活用できるようになります。」 — Paul Barrett 氏、NETSCOUT のエンタープライズ事業本部 CTO
「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 }