たのしい駆動開発

たのしいアウトプットの場所

Cloud Data Fusionの機能でつまづいた部分について

Google Cloud Platform Advent Calendar 2021の22日目カレンダー2の記事です。


最近Cloud Data Fusionをはじめて触りました。GUIベースで結構感覚的に処理ができるので、結構いいツールだと思います。
そして今回はCloud Data Fusionで説明が必要だなあと感じた機能について説明します。
Cloud Data Fusionについての説明や、インスタンスの作成などは公式ドキュメントを参考にしてください。



今回使用するサンプルのテーブルとデータは下記を使用します。

f:id:ssabcire:20211222093656p:plain

RawDenormalizer

BigQueryのテーブルの行列をPIVOT(行と列の入れ替え)したいときはRowDenormalizerを使います。
ただ、datesub_keyをPIVOTのkeyとして、namevalをPIVOT したいとき(下記のようなテーブルを想定)が面倒くさいです。理由はRowDenormalizerがkeyを1つしか指定できないためです。
そのため、Wranglerを使ってKeyにしたい列をmergeしてからRawDenormalizerをする必要があります。

Wranglerでの列Joinはこのように行います
f:id:ssabcire:20211222093912p:plain f:id:ssabcire:20211222093924p:plain

そして、RowDenormalizerでこのように指定します。
f:id:ssabcire:20211222094130p:plain

RowDenormalizerをした結果はこのようなデータになります。 f:id:ssabcire:20211222095727p:plain

Join

SQLで使うJoinは下記図の上のように使います。
ただ、縦結合、UNIONでデータをJoinさせたい場合は、下記図の下のように使います。

f:id:ssabcire:20211222094743p:plain

テーブル出力

パイプラインを実行するたびにテーブルの中身を上書きしたい場合は、設定を変更する場合があります。Truncate TableをTrueにします。

f:id:ssabcire:20211222095206p:plain

ちなみに、デフォルトではパイプラインを実行するたびにテーブルにInsertする処理が設定されています(Insert以外にUpdate, Upsertを選択できる)。

半年間休職してようやく復帰した

6月に適応障害と診断されて約半年間休職してました。そして、12月頭から復職しました。
診断された当時の記事はこちらから
ssabcire.hatenablog.com

休職中なにしてたの

休職中はとにかく好きなことだけしろと担当医者やカウンセラー、産業医に言われたので、はじめの2ヶ月間はずっとAPEX LEGENDSをやってました。おかげでランク上位7%くらいまで到達することができました。
3ヶ月目はリハビリとして少しずつ運動をしたり、プログラミングをやってました。ただコードを見ると次第に気分が悪くなることがあり、あまり集中できた時間はありませんでした。
4-6ヶ月目はメイドカフェ(コンカフェ)にハマってました。非現実感がすごくよかったです。あとは大家さんと揉めて引っ越しました。ちなみに民事と刑事の両方で訴えると言われました。草

原因はなんだったの

  • タイトなスケジュールの中でのパフォーマンスチューニング
  • 頻繁に起こる障害とその対応
  • 過去に作られた機能を重要案件で使いたいがパフォーマンスが悪いためリファクタリングが必要ということで自分が行ったが、一切ドキュメントがなかったためQA, dev, bizの全員が機能把握をしておらず、問題になった
  • 休日夜にアラート対応して、問題かもしれないということでbizにインシデントで報告したら実は問題ではなく、いろいろな人に怒られた

という過労に上乗せして多くの怒られ、しかし称賛はほぼ無いという状態が短期間に続いて、心身が崩壊しました。完全にバーンアウト(燃え尽き症候群)を引き起こす環境です。みなさんもバーンアウトを引き起こす環境になってないか注意してください...

今はどういう感じで働いてるのか

週5の8hで働いてます。ただ休職前の状態がトラウマで、あまりまだちゃんと動ける状態ではなく、1日2時間くらいしか集中できてないです。
また、午前中はベッドから出れなくて有給にシフトしたりなど、結構苦労してます。
ただカウンセラーの人には復職後はそれが正常と言われているので、少しずつ体を慣らしていくしかなさそうです。
今は新しいチームにいるんですが、現状を理解してもらっているのでかなり迷惑をかけつつもなんとか働いています。 (全然頭が働かなくて昼寝してたらミーティングの時間を過ぎてたを何回かやらかしました)

おまけ

引っ越しやら生活費やらで貯金が尽きてしまって生活が苦しいので、ほんのちょっとでも干し芋寄付していただけると嬉しいです🥺

www.amazon.jp

適応障害と診断されたお話

体と心の調子が全然良くなく、心療内科にかかったところ適応障害と診断されました。

経緯

4月~5月頃にかなりハードな案件があり、毎日8-12時間労働かつ休日も出勤みたいなことを繰り返していた結果、頭痛腹痛が毎日のように起きました。
その案件が終わったあと、燃え尽きたように仕事のやる気が全部消え、全く仕事に集中できなくなり、思考力が劣り、ミスが増えるようになりました。
これはまずいと思い1週間休みを取ってリフレッシュの機会を多く設けたにもかかわらず、復帰後何も改善しません。
多くの人に迷惑をかけられないので心療内科にかかったところ、上記の症状と診断されました。

これまでを振り返ってみると、その徴候はかなりあった

大学時代のお話ですが、大学1-3年頃まで、授業が16週あるうちの5-6週目くらいから必ず大学に行く気力が全くなくなり、毎週カウンセリングに通いながらなんとか通学し単位をとっていました。
しかし4年になり研究のみになって忙しさを自分で調整できるようになり、それ は起きなくなっていたのです。今思えば、このときから症状が起きていたんだろうなと。。。

また、就職後に腹痛がよく起きるようになり、腸の調子を良くする薬も飲んでいたのですが、これもストレス起因で起きる過敏性腸症候群だったようです。

病気との付き合い方

これはどうしようかとても悩んでいます。今は薬で抑えながら勤務を続けることを選んでいますが、薬の副作用の眠気が半端なく、まともに仕事ができません...
根本的な解決は休職らしいのですが、いかんせん貯金もあまりないので (そして大学の学費+生活費で奨学金返済が1000万近くある)
難しいなあと思っています。
とりあえず1ヶ月ほど様子を見つつ、これからどうするか考えていこうと思っています。

補足

ブラックな会社やんけ...となるかと思いますが、今回ほんと珍しくハードな案件が入ってきただけで、いつも月の残業時間は10時間行くかな〜くらいですし、こういう症状を患ったことも気軽に相談できるいい上長もいます。
自分がもともとストレス耐性が低いことによることが問題です。つらい😇

正直仕事って人間には早い代物ですね。全部AIやら自動化されてほしいです。へへ

プログラミングをはじめて3年が経ったので振り返る

プログラミングを始めて約 3 年が経ちました。今までも節目ごとに書いてきたので、よかったら見てください。

ssabcire.hatenablog.com

ssabcire.hatenablog.com

それにしても、1-2 年目のときの記事を振り返ると、かなり挫折オブ挫折な人生を歩んでるな〜と思います 😇
でもまあなんだかんだ生存してるのはすごいなと思います。脱落していく人を多く見てるので、、、


1年振り返り

2020/3 月

  • コロナが蔓延しはじめ、卒業式がなくなる。ただ卒業式に出る予定はなかったからラッキーだった
  • 月末あたりに緊急事態宣言が出てリモートワークになる。朝会の運営をしていたので、かなり新卒の間で模索していたのが印象的

4 月

  • 新卒で入社。
  • 4 月 1 日はコロナのせいで会社のイベント系が諸々中止になったので、普通にぬるっと普段どおりの仕事をしていた
  • 採用担当を始めた
  • 所属チームのコードオーナー & ブランチオーナーになった
  • 会社で MVP をもらった

5 月

めっちゃ技術の勉強してた。

  • gRPC
  • logging json log format
  • editor config
  • protobuf
  • pytest

etc...
他にも採用担当してたり、テックブログの運営してたり、結構多くのことをやってた。

6 月

この時期は QA が立ち上がったということもあり、ほとんどエラーの調査ばっかやってた。 エラーの調査はわからないことばかりなので辛かった...

7 月

  • git flow の理解と導入
  • あまりチームの雰囲気が良くない感じがあったので、チームビルディングの本を読み始める
  • 体調不良やメンタル不良を頻繁に感じ始める

8 月

  • Datadog, Github Actions を勉強する
  • 学生のころやっていたことが仕事で活かせる場面があった。これは本当に楽しかった
  • 仕事のマンネリ化や、新卒のフレッシュ感の薄れを感じ始める

9 月

10 月

  • マイクロサービスの設計に携わる
  • 英語を話す / 聞くことが多少できるようになる
  • アジャイルの本を読んで実践してみる (ただ理想と現実はかなり乖離があるなと思った)
  • 昇給した
  • かなり疲れてた。全然やる気もなんにもない状況だった。ミスもかなりしてた

11 月

  • infra チームに所属
  • ドメイン知識がかなり深くなったのを実感する。実装速度もはじめの頃と比べて 3 倍くらい早くなった所感
  • 疲れが半端なかった。
  • 家で集中が続かなくなってきた
  • マインドフルネスってやつを始めてみたけど、必ず睡眠に入ってしまうのと、頭はスッキリするけど集中が続くわけではなかった

12 月

  • シングルトン実装した。初めて知って実装したけど、結構良かった
  • リポジトリのリーダブル化がかなり進んだ
  • Advent Calendar を開催。
  • Kubernetes の Over Commit を知る
  • HTTP まわりに詳しくなる
    • Keep Alive
    • TCP の状態遷移について
    • NAT について
  • メンタルが全然良くなかった。リフレッシュしても全然疲れが取れなかった

2021/ 1 月

  • ほぼ全部のエラーを潰した
  • Zapier 触った


3年目で書いた記事

ssabcire.hatenablog.com

ssabcire.hatenablog.com

ssabcire.hatenablog.com

ssabcire.hatenablog.com

ssabcire.hatenablog.com

ssabcire.hatenablog.com

ssabcire.hatenablog.com

ssabcire.hatenablog.com

ssabcire.hatenablog.com


振り返り

1 年やってたことに対して振り返ると

前半はとてもいろいろなことを任されていたな〜〜と感じます。
後半は、結構技術面に関することやチームビルディングを主にやってたんだなあと。

目標に対して振り返ると

去年私が立てた目標は自動化できる仕事はすべて人間から奪い去るでした。
そこで CircleCI, Github Action, GAS, Zapier, Kubernetes を使って多くのことを自動化し、人がやる仕事を減らせたことはとても良かったなと思ってます。

あとはブログを書くことがかなり減りましたね。インプットをわずかな休日に行って、仕事でアウトプットを行うという状態だったためだと思います。

しかし本数が減ったとしても、ブログを書くことで他の人の時間を減らせることができるなら、それは嬉しい限りです

1 年間、成長したな〜、良かったな〜と思うこと

  • 英語。はじめの頃と比べると、本当に話せるようになったなと思う。もっと話せるように頑張っていきたい
  • テックブログを Medium に英語メインで開設したのは自分の中でもいい挑戦だったなと思う。KGI, KPI などを立てて数字を追ったりして、毎回施策をたてて PDCA を回していくようなことが本当に楽しかった

1 年間、ここが課題だな〜と思うこと

  • 人へ説明すること。自分は人に説明するときにいつも端折ってしまうんだけど、相手が理解できなくて結局時間がかかってしまうので、1-10 までちゃんと説明する癖をつけないといけない
  • 個人開発することが殆どなくなった。あれ作りたいな〜と思うことや、この技術触ってみようという気持ちが湧かなくなった。 今は仕事で使う技術を使いこなせるかということにずっと重点を置いている。しかし個人開発することで仕事に活かせることがあるので、やらないといけないけど...
  • メンタルヘルスの管理が難しい。運動、腸活、マインドフルネス、自然といったことをたくさん試してきたけど、全く回復しない。どうにかして改善策を見つけたい...

4年目で頑張りたいこと

まず 1 つめに英語です。英語が少し話せるようにはなったものの、まだまだ壁は高いです... 来年の振り返りのときには、完璧にできるような状態にしたいですね。
2 つめにビジネス理解です。親が 1 次産業の自営業をやってるんですが、コロナ禍で全然売れてない状況です。そこに自分がビジネス理解とエンジニア技術を注ぎ込めば、とても儲かるのでは...?みたいな思惑がありますwww😇
この部分も将来的にいい経験になり、今後に活かすことができるだろうと踏んでいるので、今年はそれらを固めていきたいと思っています。

requests.Session をシングルトンで書いて使い回す

シングルトンの実装をしたrequests.Sessionクラスを使うことで、毎回同じ識別子のクラスを使い回すことが出来ます。
そうすることで、リクエストを飛ばすたびに毎回ホストとセッションをつなぐ必要がなくなるので、めちゃ便利です。


import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry


class RequestSession():
    _has_instance = None
    def __new__(cls):
        if not cls._has_instance:
            cls._has_instance = super(RequestSession, cls).__new__(cls)
            cls.session = cls.create_session()
        return cls._has_instance
    @staticmethod
    def create_session():
        session = requests.Session()
        retries = Retry(total=1)  # このへんは別になくてもOK
        session.mount("http://", HTTPAdapter(max_retries=retries))
        return session


では次にこれがちゃんとシングルトンになっているのかを確認します。

>>> rs = RequestSession()
>>> id(rs)
140271749279264
>>> rs2 = RequestSession()
>>> id(rs2)
140271749279264

識別子の値が一緒なので、同じインスタンスだとわかります。


ネットワークを確認する

ではこれを使用して、ネットワークを確認します。
しかし、Mac上にssコマンドやwatchコマンドがないので、Dockerコンテナ上で動かします。

FROM python:3

RUN apt-get -y install iproute2 watch

RUN pip install --upgrade pip
RUN pip install requests


次に、下記コマンドを叩きます。これで TCP の情報をリアルタイムで確認することが出来ます。

docker container run -it <IMAGE ID> bash
watch ss -aot


別窓でインタラクティブモードでpythonを起動します。

docker ps
docker exec -it <CONTAINER ID> bash
python


TCP の状態を確認するために、まずは通常の get を使います

import requests
requests.get("https://google.com")
requests.get("https://google.com")
requests.get("https://yahoo.co.jp")


別窓のssコマンドにはこのように表示されたかと思います。

State       Recv-Q   Send-Q     Local Address:Port         Peer Address:Port

TIME-WAIT   0        0             172.17.0.2:.....      172.217.25.196:https
timer:(timewait,49sec,0)
TIME-WAIT   0        0             172.17.0.2:.....      216.58.220.142:https
timer:(timewait,49sec,0)
TIME-WAIT   0        0             172.17.0.2:.....      216.58.220.142:https
timer:(timewait,50sec,0)
TIME-WAIT   0        0             172.17.0.2:.....      216.58.220.142:https
timer:(timewait,50sec,0)
TIME-WAIT   0        0             172.17.0.2:.....      172.217.25.196:https
timer:(timewait,50sec,0)
TIME-WAIT   0        0             172.17.0.2:.....      216.58.220.142:https
timer:(timewait,49sec,0)
TIME-WAIT   0        0             172.17.0.2:.....      172.217.25.196:https
timer:(timewait,49sec,0)
TIME-WAIT   0        0             172.17.0.2:.....      172.217.25.196:https
timer:(timewait,50sec,0)


次はシングルトンで書いたほうでgetしてみます。

rs = RequestSession()
rs.session.get("https://google.com")
rs.session.get("https://google.com")
rs.session.get("https://yahoo.co.jp")


State   Recv-Q    Send-Q       Local Address:Port          Peer Address:Port
ESTAB   0         0               172.17.0.2:.....       172.217.25.196:https
ESTAB   0         0               172.17.0.2:.....       216.58.220.142:https


requests.get()session.get()で、TCPのコネクション数がかなり違うかと思います。



シングルトンで実装することで何が嬉しいのか ()

ローカルから外部サーバーに通信するとき、ルーターのNAPT機能を使用しています。
ただ、リクエストをしすぎてポート番号が枯渇してしまった場合、色々と問題が起きてしまいます。
そのため、ホストとのセッションを維持し続けて通信することで、上記問題は多少増しになるよね!といった感じです。
(上記で説明したように、requests.get()などは毎回セッション繋ぎに行ってます)
このあたりをより詳しく知りたい方はKeep Aliveで調べると面白いと思います。




おまけ

2020年も最後ですね。最後になにかやっときたいな〜〜〜〜けどめんどくさいな〜〜〜と思ってたら社内の人からこれネタにできるやんと言われたので書いた感じです😇
TwitterのTLは今年買ってよかったものとか2020年の振り返りばっかで溢れてますが、逆張り陰キャなのでそういうのは書きません()
今年も私のブログをご覧いただきありがとうございました。来年もよろしくお願いします🥲 みなさん良いお年を!