[GCP] PythonでBigQueryからグローバルウェイTMCNの価格を取得してmatplotlibで2軸で表示

まず、GCPにBigQueryにTMCNの価格を入れます。

1. nomics.comというサイトからFree CSVをdownload
https://nomics.com/assets/tmcn-timecoin-protocol

直近100日分のデータを取得できる。timestamp, open, hight, low, close, volumeなど、一般的なデータ形式。

2. GCPのBigQueryにDownloadしたtmcnのデータをimport

3. PythonでGCP BigQueryからデータを取得して、matplotlibで2軸の折れ線グラフを作る

from google.cloud import bigquery
import matplotlib.pyplot as plt

client = bigquery.Client.from_service_account_json('./client_credentials.json')

QUERY = (
    'SELECT * FROM `gce-test-331622.test.tmcn` ORDER BY timestamp ASC LIMIT 100')
query_job = client.query(QUERY)  
rows = query_job.result()

x = []
y1 = []
y2 = []
for row in rows:
    print(str(row.timestamp)[0:10] + " close:" + str(row.close) + " volume:" + str(row.volume))
    date = str(row.timestamp)[0:10]
    x.append(date)
    y1.append(row.close)
    y2.append(row.volume)

plt.figure(figsize=(10,8))
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

plt.title("tmcn 2021/08/13-2021/11/21")

ax1.plot(x, y1, marker=".", color = "magenta", linestyle = "--")
ax1.set_ylabel('$close-price(pink)$')
ax2.plot(x, y2, marker="o", color = "cyan", linestyle = ":")
ax2.set_ylabel('$trade-volume(blue)$')

plt.savefig('img/tmcn.jpg',dpi=100)

4. 作成した画像をHTMLで表示

	<h1>timcoin protocol</h1>
	<a href="https://github.com/TimeCoinProtocol/timecoin">TimeCoinProtocol / timecoin</a><br>
	<img src="img/tmcn.jpg" width="400" height="300">
// 省略

5. Githubにpushして、Google Cloud DeployでGCEにデプロイする

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud
  args: ['compute', 'scp', '--recurse', 'img', 'instance-1:/var/www/html/img' , '--zone','asia-northeast1-a']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud
  args: ['compute', 'scp', '--recurse', 'index.html', 'instance-1:/var/www/html/index.html' , '--zone','asia-northeast1-a']

cloudbuild.yamlで以下のように書くと、argsは下のargsしか実行されないので、2回書かなければならないので注意が必要

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud
  args: ['compute', 'scp', '--recurse', 'img', 'instance-1:/var/www/html/img' , '--
  args: ['compute', 'scp', '--recurse', 'index.html', 'instance-1:/var/www/html/index.html' , '--zone','asia-northeast1-a']

うーむ、データ量が多い時などはBigQueryは使えそうだにゃーーーーーーーー

[GCP] ローカルのPythonでBigQueryの値を取得したい

### 1.google-cloud-bigqueryをinstall
公式のドキュメントに沿って進めます
https://googleapis.dev/python/bigquery/latest/index.html

$ pip3 install google-cloud-bigquery

### 2. credential情報の取得
– GCP IAMのサービスアカウント「*-compute@developer.gserviceaccount.com」のKeysからADD Keyでjsonタイプのcrudential情報を取得
– client_credentials.jsonに名前を変更してpythonを実行するフォルダに保存

### 3. Pythonを実行
BigQueryでテーブルを作成した日本アマチュアゴルフランキングのデータを操作します。

from google.cloud import bigquery

client = bigquery.Client.from_service_account_json('./client_credentials.json')

QUERY = (
    'SELECT * FROM `gce-test-331622.test.ranking` ORDER BY rank ASC LIMIT 10')
query_job = client.query(QUERY)  
rows = query_job.result()

for row in rows:
    print("ランク:" + str(row.rank) + " 名前:" + row.name + " 年齢:" + str(row.age))

$ python3 main.py
ランク:1 名前:中島 啓太 年齢:21
ランク:2 名前:蝉川 泰果 年齢:20
ランク:3 名前:米澤 蓮 年齢:22
ランク:4 名前:鈴木 晃祐 年齢:21
ランク:5 名前:杉浦 悠太 年齢:20
ランク:6 名前:河本 力 年齢:21
ランク:7 名前:平田 憲聖 年齢:20
ランク:8 名前:大嶋 港 年齢:16
ランク:9 名前:松井 琳空海 年齢:14
ランク:10 名前:岡田 晃平 年齢:19

ぎょええええええええええええええええええええええ

for row in rows:
    print("ランク:" + str(row.rank) + " 名前:" + row.name + " 年齢:" + str(row.age))
    f = open(today +'.txt', 'a')
    f.write("ランク:" + str(row.rank) + " " + row.name + " 年齢:" + str(row.age))
    f.write("\n")
    f.close()

テキストに書き込んで、PHPで読み込むこともできる
うおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお
感動した🍣

[GCP] BigQueryで日本アマチュアゴルフランキングのデータを操作

BigQueryで、publicデータではなく、独自のデータの操作方法について学びます。
日本アマチュアゴルフランキングのサイトから、Excelデータをダウンロードします。
http://www.jga.or.jp/jga/html/jagr/male/ranking/ranking_1.html

1.1行目のカラムは残して、CSVで保存

2.BigQueryのAdd Data
3.Create tableでテーブル作成
L 保存したCSVを読み込む

 L スキーマを設定していく。ストロークPT、プレイスPTはfloatにする

4. Advanced optionsでheader rows to skipを1に設定する
5. Create tableでテーブルが作成される

6. Queryで実行する

SELECT * FROM `gce-test-331622.test.ranking` LIMIT 1000

ぎゃああああああああああああああああああああああああ
助けてええええええええええええええええええ

[GCP] BigQueryを使いたい

BigQueryとは
L サーバレスなデータウェアハウス
  L 自動スケーリングにより大規模なデータセットから高速に分析結果を得ることができる
  L 1ヶ月10GBまでストレージ無料枠
  L ウェブUI, bqコマンド、BigQuery REST APIからクエリ実行

まずBigQueryのページを開きます

public datasetでBitcoin Cash Cryptocurrencyを選択

queryの実行

SELECT FROM `bigquery-public-data.crypto_bitcoin.transactions-2021-10-28T23_18_45` WHERE block_timestamp_month = "2021-11-21" LIMIT 10

Syntax error: SELECT list must not be empty at [1:8]

あれ?

SELECT * FROM `bigquery-public-data.crypto_bitcoin.transactions-2021-10-28T23_18_45` WHERE block_timestamp_month = "2021-10-28" LIMIT 10

This query will process 564.8 MiB when run
-> no result

あれええええええええ

samplesのshakespeareを使います。

SELECT * FROM `bigquery-public-data.samples.shakespeare` LIMIT 10

基本はselect文で抽出するのね。
うーん、データが大きすぎるとテストするのも躊躇しますね。

[GCP] GCEにGo Revelの環境を構築してデプロイ

### 環境構築
1.ローカルにGCloudをインストール
$ curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-363.0.0-linux-x86_64.tar.gz
$ tar -zxvf google-cloud-sdk-363.0.0-linux-x86_64.tar.gz
$ ./google-cloud-sdk/install.sh
$ ./google-cloud-sdk/bin/gcloud init
Your Google Cloud SDK is configured and ready to use!
$ pwd
/home/vagrant/gcp/

$ cd ~
$ sudo vi .bash_profile

source /home/vagrant/gcp/gcpgoogle-cloud-sdk/completion.bash.inc
source /home/vagrant/gcp/gcpgoogle-cloud-sdk/path.bash.inc
$ source ~/.bashrc

2.GCPでGCEの作成
Region: asia-northeast1(Tokyo)
Zone: asia-northeast1-a
Machine Series: E2
Machine Type: e2-micro(2 vCPU, 1GB memory)
Boot disk: Ubuntu20.04LTS ※defaultだとDebianになっているので、 ubuntuに変更する
Access Scope: Allow default access
Firewall: Allow HTTP traffic
-> create
-> 設定した内容で作られているかinstancesのviewで確認できる

gcloudによる接続確認
$ gcloud compute ssh instance-3

3.GCE(ubuntu20.04)にGoのインストール
$ sudo apt install golang-go
$ sudo apt-get install –reinstall ca-certificates
$ git config –global http.sslverify false
$ go get github.com/revel/revel
$ go get github.com/revel/cmd/revel
$ go get github.com/cbonello/revel-csrf
$ go get github.com/vansante/go-ffprobe
$ go get github.com/aws/aws-sdk-go
$ go get github.com/go-sql-driver/mysql

$ cd go/src/github.com
$ mkdir me

4.GCEにデプロイ
$ gcloud compute scp –recurse go/src/github.com/me/prd instance-3:/home/vagrant/go/src/github.com/me –zone asia-northeast1-a

5.GCEにmysqlインストール
$ sudo apt update
$ sudo apt install mysql-server
$ sudo mysql –defaults-file=/etc/mysql/debian.cnf
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘${new password}’;
$ mysql -u root -p
mysql> create database test;
mysql> use test;

create table users(
id int primary key auto_increment,
name varchar(255) unique,
email varchar(255),
password varchar(255),
filepath varchar(255),
message text
);
insert user
mysql> insert into users(name, password) values (‘user1’, ‘5f4dcc3b5aa765d61d8327deb882cf99’);

sudo vi /home/vagrant/go/src/github.com/me/prd/conf/app.conf
http.port = 80

firewall設定
GCPホーム > ネットワーキング > VPCネットワーク > ファイアウォールルール

項目 入力例
名前 default-allow-9000
説明 Allow 9000 from anywhere
ログ オフ
ネットワーク default
優先度 1000
送信 / 受信 上り
一致したときのアクション 許可
ターゲット タグ use-9000
IP 範囲 0.0.0.0/0
プロトコルとポート tcp:9000

GCE
GCPホーム > コンピューティング > Compute Engine > VMインスタンス
ファイアウォール ネットワークタグ に先ほどのターゲットタグである「use-9000」追記

/home/vagrant/go/bin/revel run -a prd
${externalIP}:9000 で動作確認

ぎゃああああああああああああああああああああああああああああ

[GCP] Load balancerにより冗長化構成にする

1. Create Snapshot
cloneしたいGCEのsnapshotを作成する
source diskでinstanceを選択する

2. snapshotからCREATE INSTANCEでデータを復元
Boot diskがsnapshotとなる。
その他の設定は、入力していく。

3. Compute Engineのメニューからinstance groupの作成
L VMをtemplateではなく、一つ一つ指定する為、unmanaged instance groupにする
Name: instance-group-1
Location: multiple asia-northeast1-a (zoneが一つしか設定できない為、VMは同じゾーンの必要がある)
Network: default
Subnetwork: default
VM Instances: instance1, instance2

4. loadbalancerの作成
Network service -> Load blancing -> Create Load Balancer
HTTP(S) Load Balancingを選択する
Name: lb-1
Create backend service -> Name: lb-backend-service1
L Backendでinstance groupを選択する
L health-check1を作成する
Host and path ruleはURLによって振り分けることができる
Review and finalizeで確認してCreate
Create

5. LoadbalancerのIPを叩くと、接続される

6.(optional) LoadBalancerのipをCloud CDNに接続

一応、GCPの基礎は出来たかな。

7. SSL化
front-end configurationでprotocolをhttpsとし、ドメインを入力
nameはmanagedssl-sslcertなどにする

よっしゃあああああああああああああああああああああ

[GCP] Cloud BuildでGithubからGCEにデプロイ

AWSのCode Deployの様に、GithubからGCEにdeployするのに、Git cloneではなくCloud Buildでデプロイをする

1. Cloud BuildでGithubの対象レポジトリをauthorizeする
2. IAMから、Cloud Buildのユーザ(*@cloudbuild.gserviceaccount.com)に、「Compute Admin」「Service Account User」の権限を付与する
3. cloudbuild.yamlにspcコマンドを書く

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud
  args: ['compute', 'scp', '--recurse', 'index.html', 'instance-1:/var/www/html/index.html' , '--zone','asia-northeast1-a']

4. git pushすると、pushをtrigerにファイルがGCEにコピーされる

GCEのexternal ipを叩くと、pushした内容が反映されていることがわかる

cloud source repositoryは特に必要ないですね。。

全体は大分できてきた

あとはELBか…

[GCP] Cloud Source Repositoryを利用

1. Add a repositoryでConnect external repositoryを選択

2. Githubをaurthorizeする

3. Cloud Source Repositories APIをenableにする
 
4. RepositoryとConnectする

5. テキストを追加してGit push

<p>Paragraph added!</p>

$ git add .
$ git commit -m “text added”
$ git push -u origin master

6. Githubの変更が自動的に反映
Cloud Source Repositoryにミラーリングされているのがわかる

なるほど、githubみたいなもんだな
これをGCEにデプロイしたい

[GCP] お名前.comのドメインを使いたい

1. CloudDNSを開く

2. Create DNS Zone
zone name: test
dns name: ${お名前.comのdomain}
DNSSEC: off

3. Create A record
GCEのExternal IPをIPv4 Addressに割り当てる

4. GCP DNSのNSをお名前.comの対象ドメインに割り当てる
ns-cloud-e1.googledomains.com.
ns-cloud-e2.googledomains.com.
ns-cloud-e3.googledomains.com.
ns-cloud-e4.googledomains.com.

5. GCEにapache2をインストール
$ ssh ${external ip} -i id_rsa
$ sudo apt update
$ sudo apt install apache2
$ sudo systemctl status apache2
$ sudo systemctl enable apache2

// NS反映までしばらく待ちます。

6. 動作確認
– GCEのExternal IPを叩いて、apacheの画面が表示されるか確認
– 続いて、お名前.comのドメインを叩いてApacheの画面が表示されるか確認

きたあああああああああああああああああああああああ
完全に理解した

次は、GithubからGCEへのDeploy
最後にELBとしたい

[GCP] SQLでMySQLを作成してローカルから接続

1. GCPでSQLを選択します
2. CREATE INSTANCE
L mysqlを選択します

allo accessで自分のIPを入力する

3. ローカルから接続
UserはGCP SQLのコントロールパネルから編集する

mysqlのinstance typeなどはEditで編集できる

### 接続
$ mysql -u root -h ${public ip} -P 3306 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 110
Server version: 5.7.36-google-log (Google)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
+——————–+
4 rows in set (0.29 sec)

ぬおおおおおおおおおおお
意外と簡単に行けるやんかああああああああああああ

次はドメイン、ELB、デプロイだが