CourseraでGCPの専門講座を3つ修了しました

CourseraでGCPの専門講座を3つ修了しました

修了した専門講座は以下の通りです

  • Architecting with Google Cloud Platform 日本語版 f:id:repenguin:20200601224654p:plain
  • Architecting with Google Kubernetes Engine 日本語版 f:id:repenguin:20200601224651p:plain
  • Data Engineering on Google Cloud Platform 日本語版 f:id:repenguin:20200601224658p:plain

なぜAWSやAzureではなくGCPを選んだのか?

それは、私がGoogleが大好きだからです。あとはGoogle機械学習ビッグデータに強いからですね。

各コースについての感想

Architecting with Google Cloud Platform 日本語版

GCPの基本的なサービスを学べるコースです。
以下のようなサービスを学ぶことができました。

  • IAM
  • GCE(仮想マシン)
  • GAE(インフラをいい感じに管理してくれるやつ)
  • VPC(ネットワーク)
  • CLB(ロードバランサ)
  • オートスケーリング
  • GCS(ストレージ)
  • CLOUD_SQL(RDBMS)

IAMやネットワーク、ストレージあたりはどのシステムを開発するのにも必須項目になります。
主にVPCでゾーンをまたいだ冗長構成を作りCLBでオートスケーリングする、ストレージとCLOUD_SQLを使うテンプレートのようなアーキテクチャを学べました。
最後のコースではSREの話が出てきて非常に面白かったです。SRE本も出ているので読んでみようと思います。
オライリーから6月にはSREの実践本が出るらしいですね。楽しみです

www.amazon.co.jp

www.amazon.co.jp

Architecting with Google Kubernetes Engine 日本語版

数ヶ月前にコンテナというものを全く知らなかったのでDockerを勉強しました。
そうすると、今はk8sが業界の標準だと聞くじゃないですか。出発する船に乗り遅れては行けないので勉強することにしました。

Kubernetesの概念からGKE上でどのように動かしていくのかk8sだけでたっぷり4コース学びました。
Kubernetesはまともにクラウド上で動かそうと思うと結構お金がかかるのでラボとかで触れるのは本当にありがたいことです。
まぁただ、ラボは構成ファイルが用意されていて、ポイッと実行するだけなのでちゃんとコードを読んだりしないとあまり身につかないです...

Kubernetes本は結構売っているので公式サイトも含めて復習し直そうと思います。
実際に手を動かさないと身につかないですからね

Data Engineering on Google Cloud Platform 日本語版

ビッグデータの分散処理での加工や機械学習(Tensorflow)の基礎、バッチ処理やストリーミングデータの処理を勉強しました。
この講座はコロナの影響で一ヶ月無料キャンペーンをやっていてそれで受講しました。

機械学習って今まで触る機会がなかったんですけど、非常に面白いですね。
機械学習の基本的なコースではMLOpsにおいてどのようなことを行うのか、データエンジニアはどのような作業を担当するのかを学べました。

また、pub/subでデータを送信しバッチ処理やストリーミングデータ処理をDataflowで簡単に行い、BigQueryやBigTableに格納、DataStudioなどで可視化する。リアルタイムデータ分析における一連のアーキテクチャを学びました。
DataFlowが便利過ぎて、感動しました。
データエンジニアリングの専門講座が一番おもしろかったです。

コースの教師の方が書いた本も出ているらしいので興味のある方は買ってみてはいかがでしょうか。

https://www.amazon.co.jp/dp/1491974567/ref=cm_sw_r_tw_dp_U_x_s9q1EbD206AE3

まとめ

CourseraのGCPの専門講座は内容が少し古い部分もあり、ラボが動かないことも多々ありましたがサポートに問い合わせたらちゃんと回答してくれて、直してくれますし結果的には良かったです。
11000円ちょっとでGCPアーキテクチャを勉強できたので自分としてはとても満足しています。

これから

今後は引き続きGCPでサービスの開発を進めながら、どんどん自分に足りない知識や技術を勉強していきたいと思います。
直近では、プログラミング言語のRustを勉強しながら、Udemyでプロダクトマネジメントの勉強をし、請負のサービスを開発したりしようと思います。
ソフトウエアエンジニアとしての知識や能力がまだまだ足りていないので勉強することは山程ありますが、一歩ずつ確実に前進していきたいです。
あーどこかにGCPでガンガン開発できて、広く浅い知識が活かせる場所はないかなー

Cloud Functions for FirebaseからプライベートIPのCloud SQLに接続する方法

はじめに:Cloud Functions for FirebaseからRDBMSを利用する

Firebaseは素晴らしいモバイルやWeb向けの包括的なアプリ・開発プラットフォームではありますが
標準のデータベースがCloud FirestoreというNoSQLになっています。
Cloud Firestoreは高速でスケーラブルな素晴らしいNoSQLではありますが、
OR句が使えなかったり複数のフィールドに対して特定のWhere句を書こうとすると複合インデックスを貼る必要があるなど
NoSQL特有の制限が多いのもまた事実です。
複雑なSQLなどを書こうとするとRDBMSが欲しくなることもあるでしょう。
RDBMSを使う選択肢としてはの主に2つあります。

1. RDBMSではありませんがデータウェアハウスであるBigQueryにデータを入れるという方法

概要

BigQueryはデータウェアハウスですが、標準のSQLが使用できる上データ量に関わらず高速に動作するためRDBMS代わりとして手段の1つとなるでしょう。
しかしデータウェアハウスであるため、基本的に更新や削除は制限付きです。
※BigQueryはストリーミングインサートなどすると一定時間更新や削除をすることができない
書き込みと読み取り専用の高速なRDBMSとして使用するのであればBigQueryを考慮しても良いでしょう。

方法

BigQueryへのデータの挿入は主に2つ方法があります。

  1. BigQueryのAPIを使用してストリーミングインサートをする。
    BigQuery へのデータのストリーミング  |  Google Cloud

  2. Export Collections to BigQueryを使用する
    これはFirebaseの拡張機能で指定した Cloud Firestore コレクションから BigQuery に、リアルタイムな増分更新を送信してくれるようです。
    やっていることはBigQueryにエクスポートするCloud Functionsを拡張機能が作成してくれるというものです。
    firebase.google.com

用途に応じて使い分けてみてください。

2. Cloud FunctionsからCloud SQL(今回はpostgres)に接続する

こちらが本題になります。 正直公式ドキュメントにわかりやすく書かれているのでブログにまとめる必要もないのですが、アウトプットは大事

今回の環境

・Cloud SQLのパブリックIPは無効化する(パブリックIPを使用するなら今回の話は関係ないです)
・Cloud SQLへの接続のため、踏み台サーバを用意する(今回は接続まで確認なのでまた別途気が向いたら書きます)
・Cloud Functionsの言語はTypeScript
・DBはpostgres

手順

ここにすべて書いてあります
cloud.google.com

1. CLOUD_SQLに接続するVPCを作成する

VPC ネットワークからVPC ネットワークの作成を押下し作成を開始します。
②各項目を入力する。今回は以下のようにします。 f:id:repenguin:20200505224112p:plain

名前:ネットワークの名前は何でもいいです
説明:(省略)
サブネット作成モード:カスタム
サブネットを作成する
名前:何でもいいです
リージョン:必ずCloud Functionsのリージョンと同一にしてください
IPアドレス範囲:10.0.1.0/24でも192.168.1.0/24でも好きにしてください。

あとはこの状態で作成を押下。 ③以下のようになっていればOK f:id:repenguin:20200505224832p:plain

2. Cloud SQLを作成する

①Cloud SQLインスタンスを作成を押下
②データベースエンジンを聞かれるので今回はpostgresを選択
f:id:repenguin:20200505225103p:plain ③必須項目を適当に入力して行きます。リージョンは別の場所でも大丈夫なはずですが、レイテンシーをおさえるため同一リージョンとします。
f:id:repenguin:20200505225712p:plain

④設定オプションの接続を開き、パブリックIPを無効化しプライベートIPを有効化します。この時先程作成したネットワークに接続します。 f:id:repenguin:20200505230117p:plain

※マネージドネットワークを作成するとか言われたら作成すれば大丈夫です。

⑤作成を押下

3. Cloud Functionsへ接続するためのサーバーレス VPC アクセスコネクタを作成する

ここにすべて書いてあります
cloud.google.com

VPCネットワーク -> サーバーレス VPC アクセスでコネクタを作成を押下
①各項目を入力する。今回は以下のようにします。
f:id:repenguin:20200505232341p:plain

名前:何でもいいです
リージョン:Cloud Functionsのリージョンと同一にしてください
ネットワーク:作成したネットワークを選択
IP範囲:他のリソースのサブネットとかぶらないアドレスにする必要があります。
例えば、10.0.1.0/24のサブネットがある場合、10.1.0.0などサブネットがかぶらない範囲を指定する必要があります。

VPC ネットワークでまだ予約されていない CIDR /28 範囲である必要があります。

②作成を押下する

4. Cloud Functionsの関数を作成する

postgresとの接続は「node-postgres」を使用します

node-postgres.com

functions/src/index.ts

// 初期化
admin.initializeApp({
    credential: admin.credential.applicationDefault()
});

// コネクションプールの作成
const connectionPool = new Pool({
    max: 10
});

// コネクションプールの監視
connectionPool.on('error', (error: any, client: any) => {
    console.error('Unexpected error on idle client', error);
    process.exit(-1);
});

// ランタイムオプション(タイムアウト時間とかメモリとか)
const runtimeOptions: functions.RuntimeOptions = {
    timeoutSeconds: 60,
    memory: '256MB'
};

// リージョン名を必ず指定すること
const REGION_NAME = 'asia-northeast1';

// 関数
export const sqlConnectTestFunction = functions.region(REGION_NAME).runWith(runtimeOptions).https.onRequest(async (request, response) => {
    // Cloud SQLに接続
    const client = await pool.connect();
    try {
        // 現在日付時刻を取得
        const queryText = 'SELECT NOW()';
        const res = await client.query(queryText);
        console.log(res);
        response.status(200).send();
    } catch (error) {
        console.error(error);
        response.status(500).send();
    } finally {
        client.release();
    }
});
firebase deploy --only functions
5. 作成した関数をサーバーレス VPC アクセスコネクタに接続する。postgres接続のための環境変数を設定する

①関数を押下し編集を押下する
②詳細オプションのネットワーキングで下り設定に作成したVPC アクセスコネクタを選択する

f:id:repenguin:20200506001303p:plain

③「node-postgres」がプーリングの場合、環境変数を参照して接続をするので環境変数に各項目を設定する

f:id:repenguin:20200506001358p:plain

④デプロイボタンを押下 

6. テストしてみて完了

正直うろ覚えの書き起こしなので間違っていたら指摘ください。

最後に

今回はFirebaseからCloud SQLを操作する方法を書きました。
エミュレーターがあるのは良いですが、firestoreとhttpしか対応してないんですよね。
それ以外だと毎回デプロイするの地味に時間かかるから結構うんざりします。
サーバーレスは好きなんですけどね。
素人的にはCloud RunがCloud Functionsのイベントあたりに対応していいとこ取りで統合しちゃえばいいのにと思ったり。
というか最近のGCPはGKEとビッグデータ、AI周りしかあまり考えてない感じですかね。
クラウドサービス全体で勝つことは諦めて、マルチクラウドあたりを狙っている感じでしょうか。
Googleという企業が好きなので画期的なプロダクト開発を頑張ってほしいです。

Macの標準で入っているApple Gitをアップデートする方法

Macの標準で入っているApple Gitをアップデートする方法

正確にはUpdateではないです。新規で入れ直します

なんかGitに重大な脆弱性があったらしい

news.mynavi.jp

確認してみたところ脆弱性が修正されているバージョンがインストールされていたが、 ちょうどいい機会なのでアップデートしてみることにしました。

私の環境は以下の通り f:id:repenguin:20200419200558p:plain

① 何はともあれ、現状を確認

soma@smP16 ~ % git version
git version 2.24.2 (Apple Git-127)

脆弱性は修正されているバージョンですが、ほんのちょっと古いですね。 AppleさんはMacに標準でいろいろな古いソフトウェアをプリインストールするのをやめてください。 お願いします。

② Homebrew(パッケージマネージャー)を入れる(入ってなかったら)

brew.sh

公式サイトに書いてあるとおりにするだけなので問題ないでしょう

③ Homebrewでgitをインストールする

soma@smP16 ~ % brew install git

④ ターミナルの種類を確認

使っているターミナル?によってやり方が違う
昔のmacbashを使っていたみたいだけど、今はzshが標準のようだ。
(ここ4年ぶりぐらいにmacに戻ってきたので知らなかった)

bashzshもパスの通し方はあまり変わらないと思う。
自分が何を使っているか確認するときは新規でターミナルを開いて
f:id:repenguin:20200419201858p:plain

上の部分を見ればわかる

⑤ Homebrewでどこにインストールされたか確認する

brew ls git
/usr/local/Cellar/git/2.26.1_1/.bottle/etc/gitconfig
/usr/local/Cellar/git/2.26.1_1/bin/git
/usr/local/Cellar/git/2.26.1_1/bin/git-cvsserver
/usr/local/Cellar/git/2.26.1_1/bin/git-receive-pack
/usr/local/Cellar/git/2.26.1_1/bin/git-shell
/usr/local/Cellar/git/2.26.1_1/bin/git-upload-archive
/usr/local/Cellar/git/2.26.1_1/bin/git-upload-pack
/usr/local/Cellar/git/2.26.1_1/etc/bash_completion.d/ (2 files)
/usr/local/Cellar/git/2.26.1_1/libexec/git-core/ (197 files)
/usr/local/Cellar/git/2.26.1_1/share/doc/ (860 files)
/usr/local/Cellar/git/2.26.1_1/share/emacs/ (2 files)
/usr/local/Cellar/git/2.26.1_1/share/git-core/ (170 files)
/usr/local/Cellar/git/2.26.1_1/share/gitweb/ (5 files)
/usr/local/Cellar/git/2.26.1_1/share/locale/ (16 files)
/usr/local/Cellar/git/2.26.1_1/share/man/ (175 files)
/usr/local/Cellar/git/2.26.1_1/share/perl5/ (20 files)
/usr/local/Cellar/git/2.26.1_1/share/zsh/ (2 files)

なんかいっぱい出てきたけど

/usr/local/Cellar/git/2.26.1_1/bin/

にパスを通せば良い

⑥ パスを通す zshを使っているので .zshrcを編集すれば良い

cd
vim .zshrc

.zshrcはこんな感じになる

export PATH=$PATH:/usr/local/Cellar/git/2.26.1_1/bin/

環境変数をいじるときは下手にネットのコマンドをそのまま打つと全部のパスが吹き飛ぶとかあるからバックアップを取ることを推奨する
昔やらかして基本的なコマンドすら使えなくなった

⑦ パスをロードする
パスをロードするか、ターミナルを再起動しないと有効にならない
ロードするコマンドは以下の通り

source .zshrc

⑧ gitのバージョンが上がっていることを確認

soma@smP16 ~ % git version
git version 2.26.1

はいめでたしめでたし

VSCodeの私的プラグインメモ

VSCodeの私的プラグインメモ

テキストに色を付けてくれるやつ

marketplace.visualstudio.com

Smart search your codes.

marketplace.visualstudio.com

Reactを使う人

marketplace.visualstudio.com

これもReact

marketplace.visualstudio.com

Gitの履歴をインラインエディタで確認できるやつ

marketplace.visualstudio.com

Golang必須

marketplace.visualstudio.com

Iconをわかりやすくするやつ

以前はMaterial Iconを使っていたが公式が出すならそっちでいい

marketplace.visualstudio.com

AIで補完を推奨してくれるやつ

正直役に立っているのかよくわからない

marketplace.visualstudio.com

React-Firebase-material-ui導入

完全私的用のメモです 以下の知識やコードを利用することにより問題が発生した場合でも私は一切の責任を負いません。

React

Install

reactでSPAを作るときは「create-react-app」を使用する

yarnを使用するのでHomebrewを入れた後にbrewでyarnを入れる。

その後

yarn create react-app myPrj --template typescript

インストール後、

cd myPrj
yarn start

Reactのアイコンがくるくるしてる画面が出ればOK f:id:repenguin:20191229195257p:plain

firebaseSDKを導入

以下のドキュメント通りに入れていく

firebase.google.com

①npm install --save firebase

②npm install -g firebase-tools

①firebase login

②firebaseプロジェクトを作成し、firestoreを使う場合データベースの作成も行っておく

③firebase init

eslint導入

yarn run eslint --init

インタフェースデザインのお約束(オライリー)を読んだ

インタフェースデザインのお約束(O'Reilly)を読みました

UXのTipsが101個書いてある本です。

基本というよりは、痒い所に手が届く系の本ですね

Tips的な本っていままでジャンル問わずいろいろ読んできましたけど、なんか微妙な感じがするのは気のせいなんですかね

実践できる環境があってがユーザ離脱率が減少したりしたら、この本すごいって思うのかもしれませんが、実践できる環境がないので何とも言えません。

私は仕事柄UI,UXを意識することはほとんどありません。業務システムでUIもフレームワークでパターン化されているので考える余地がないんですよね。

個人的にWeb開発の仕事を受けているのでそっちで活かしていきたいと思います。

勉強になったこと

  • 独自の仕様を作るな、なぜならユーザに新たなUI部品を使うための学習コストとなるからだ

  • アイコンは慎重に選べ、保存(フロッピー)などの古いアイコンはクラウドに保存などの新しいアイコンに書き換えろ

  • HTML5のINPUT type属性を使いこなせ 入力UIは基本的に標準のものを使え

  • よほど革新的なものでない限り世の中の標準に従え、ユーザは競合サービスのUIと大きく離れていると操作方法に困惑して離脱してしまう

総評

実践できる環境がないので正直なんとも言えませんが、安いし読んでよかったと思います。

なんかはてなのリンク生成バグっているんだけど...

https://www.amazon.co.jp/dp/4873118948/ref=cm_sw_r_tw_dp_U_x_XAZYDbGXR06DX

データ指向アプリケーションデザイン(オライリー)

データ指向アプリケーションデザイン ――信頼性、拡張性、保守性の高い分散システム設計の原理

O'Reillyから2019年07月に発売されたデータ指向アプリケーションデザインを読みました。

ネットにはあまり感想等上がっていないので書くことにします。

内容について

この本はタイトルの通り、信頼性、拡張性、保守性の高い分散システム設計の原理ということで分散システム設計を支える

技術の原理(データ構造やアルゴリズム、ネットワークなど)

について書かれている本です。

決して分散システム設計のベストプラクティスなどを書いてある本ではないので、注意してください。

全体的に分散システムに利用される技術の論文をわかりやすくまとめたものになります。

例えば、トランザクションの章であれば、ACIDの解説から始まり

ACIDは原子性(Atomicity)、一貫性(Consistency)、分離性(Isolation)、永続 性(Durability)を意味します。

「引用:データ指向アプリケーションデザイン ――信頼性、拡張性、保守性の高い分散システム設計の原理 page: 241 7.1.1 ACIDの意味 」

分離の種類(read commited, スナップショット分離)などシングル構成におけるトランザクションの基礎理論から書かれています。

続いて、9章の一貫性と合理性では分散システムにおけるトランザクション処理について書かれています。

初めにCAP定理について解説されており、分散システムのトランザクションにおける様々な問題やそれを解決する手法・技術について解説されています。

総評

分散システムにおける課題と解決手法(技術)について、論文に書かれるような低レイヤーな部分をまとめた本になります。

一般的なエンジニアにとってこのような低レイヤーな部分は、正直知らなくてもなんとかなる部分です。

なぜならすごい人たちが考えた高度な技術はフレームワーククラウドのサービスに実装されており、私たちは利用方法だけ学べば事足りるからです。

また全体的に論文の引用のため、アルゴリズムなど難しい部分も多いです。私はすべて理解することは不可能だと感じました。

しかし、論文の細部まで理解していなくとも全体的にどのような技術が使われておりどのようなメリットやデメリットが存在するのかを知っておくと、アーキテクチャーの選定などに大いに役に立つと感じました。

分散システムなんか扱うことないし、そんな賢くないしって人や

トランザクションってあれでしょ、一連の動作まとめてコミットしたり、ロールバックするものでしょ。

DBにおけるマスター/スレーブ構成って勝手にコピーして障害起きたらフェイルオーバーしてくれるんでしょ。

みたいなぼんやりとしか知らない人にとってはすごいおすすめの本です。

最近のトレンドである、クラウド(AWS,GCP,Azure)などを深く理解するうえでも非常に約に立つでしょう。

購入方法など

日本のAmazonではKindle版が発売されていません。(2019/11/10現在)

https://www.amazon.co.jp/dp/4873118700/?coliid=I2DJKU61H6V4AX&colid=1FBGJNYK3ACE4&psc=1&ref_=lv_ov_lig_dp_it

650ページにも及ぶ巨大書籍のため、電子書籍版を購入することをお勧めします。

以下のページからオライリー電子書籍版を購入することができます。(電子書籍版は最新タイトルだと一か月ぐらい遅れる感じなのかな)

www.oreilly.co.jp

今回の本だと、電子版だと通常版と比べ1000円ほどお安く買うことができました。

おすすめです。

余談

次は以下の本を読む予定です。電子書籍版が発売されるのをまつか、どうするか悩みますね

www.oreilly.co.jp

www.oreilly.co.jp