2021年1月11日~17日 振り返り

どうも!

先週の振り返りを書いていきます。

仕事

まだ2週間しかスクラム開発に参加してないですが、スクラム開発に対する感想としては1チームの人数が少ないのであれば、かなり開発がやりやすいです。

スプリントプランニングを通して、各関係者の間で何をどの順番にやるかが決定されるので、開発者としてはどのPBIを進めれば良いのか、時間があまりそうであれば、どのPBIを着手すれば良いかが分かるのが特に良いなと思います。

また、スプリントレビューでお客様にデモをすることで、どういう仕事をしたのか見てもらい、関係者からフィードバックを貰えるのが嬉しいです。

ただ淡々と仕事をすることもできますが、助かった・すごい!といった言葉は次の仕事の活力にもなるので、こういうフィードバックはどんどんやっていくべきだなと感じます。

やったこと

  • 仕様書の変更
  • 総額税表示関係の実装・修正
  • 単体・インテグレーションテストの修正
  • デプロイ・検証

プライベート

読書

  • Webブラウザセキュリティ
    • ちょうど日曜に物理本が届いたので読み始めています。
    • アプリケーションを作る以上、セキュリティを意識して実装をしないと問題を引き起こしてしまうので、読んだ内容は実践に活かしたいところです。

Webブラウザセキュリティ ― Webアプリケーションの安全性を支える仕組みを整理する – 技術書出版と販売のラムダノート

やったこと

  • C++入門 AtCoder Programming Guide for beginners (APG4b)の3, 4章
    • 競技プログラミングでよくC++が使われている印象があり、興味があったので入門してみました。
    • ひとまず、4章の最後まで終わったので次はABCのAとB問題あたりをひたすら解いてみようと思います。
  • AWS SAP対策
    • できれば1月中に取りたいので勉強しています。
    • ここらへんとかWizLabsで問題解いて分からないところはドキュメントを読むようにしています。

www.amazon.co.jp

最後に

最近、Today I Learned というPodcastを見つけて聴き始めました。

open.spotify.com

「#14. 人のコードを読む」「13. UberでのiOSアプリリライトにおける技術的、組織的な挑戦について」というエピソードがすごい面白かったので、他のエピソードも聴いてみたいと思います。

2021年1月4日~10日 振り返り

明けましておめでとうございます。 今年も宜しくお願いします。

去年は、5月ごろまで月一の振り返りブログを書いてたんですが、 精神的に色々辛いことがあったのと、振り返りが一ヶ月ごとだと習慣化しなくて挫折してしまいました。

なので、2021年は1週間ごとにやったことなど書いてみようと思います。

仕事

2021年1月から、今までやっていたプロジェクトが一旦解散したので、 違うチームに参加になりました。

このチームでは、スクラムで開発を進めていて、 1年半ぶりぐらいのスクラム開発だったので新鮮味があってモチベーションも上がってます!

あと、今のチームではScalaで開発していて、関数型プログラミングを便利にするためのライブラリであるCatsがゴリゴリ使われているので、 今持っている知識をアップデートする必要があり、ちょっと焦ってます笑

やったこと

  • 仕様書の修正
  • ある機能にバリデーションを追加
  • テストコードの追加
  • Postmanの整理
  • 検証環境へのデプロイ

プライベート

読書

圏論やらモナドやら関手やら、よう分からんということでHaskellの本を読んで学ぼうと思い読み始めました。 1年後、色々身についているのか楽しみです!

  • 実践Scala入門
  • Scala With Cats
  • すごいHaskellたのしく学ぼう! (まだ途中)
  • プログラミングHaskell第2版(まだ途中)

やったこと

僕は大学ではCSを学んでないのと、CSの基礎をすっ飛ばして今まで来ていて、 それはマズいと思い始めて、今年はAtCoderを通してアルゴリズムを学ぼうと思い初めて見ました。

まずはC++の基礎中の基礎を知りたかったので、APG4bをやっています。 これが終わったらABCを解いたりしていこうと思ってます。

ここらへんの記事が良さそうだったので、これに従っていこうと思います!

qiita.com

qiita.com

  • AtCoder APG4b 2章まで

2020年5月振り返り

4月を完全に振り返り忘れてた。。。 思い出せないので、5月の振り返り。

仕事

  • プッシュ通知システムをGoで実装
    • Goを初めてさわったからいまいちベストプラクティスが分からなくて、色んな人の記事やドキュメント読みつつ実装してた
    • エラーハンドリングやロギングはどのプログラミング言語でもいつも悩む
  • AWS CDKを用いてAWSリソースを構築
    • 前々からプロジェクトで使いたかったECS on Fargateを構築した
    • その他もろもろリソース構築した

正直、4月、5月はいろいろあって精神的にキツかった。 自分の実力不足から来るものもあれば他の要因もあって、久しぶりに辛いなーと思うことが多かった。。。

話は逸れるけど、 人材の専門性を語る上でT型人材みたいな一つの専門領域を突き抜けて、他の領域は広く浅く身につけるといったことを聞くけど、 自分の場合、まだ専門性を持ててないことに焦りを感じる。

プログラミング言語はいろいろやってきたし、インフラも構築もできるけどいまいち〇〇は俺に聞けと言えるものがない。 みんなどうやってそういう専門性を身に着けてるんだろう?

プライベート

  • 5月初旬ぐらいにPS4買ってフォートナイトを始めた
    • ドハマリしてるので、他のことが手に付かない(笑)

筋トレ

  • 5月はジムがお休みで行けてない
    • ただ、プロテインも飲まなくなって体重が4キロほど減った

LIST - やりたいことリストのAndroidアプリをリリースしました!

自分の「やりたいことリスト」が作れる、LISTのAndroidアプリを4月10日にリリースしました!

play.google.com

今年の1月6日にiOSアプリはリリースされているんですが、そのiOSアプリのリリースをSNSにシェアしたとき、アプリへの感想に加え、

「Androidアプリがリリースされる予定はありますか?」「Android版欲しいと思ったらなかった。いっそのことiPhoneに変える?」 といった、

LISTのAndroidアプリも欲しいという声もたくさんいただきました。

最初はAndroidアプリってニーズがあるのだろうかと思っていたし、「LIST Android先行配信メール」という先行配信用のGoogleフォームに500人以上の方がメールアドレスを登録してくださるなんて思ってもみませんでした。

SNSにAndroidアプリを求める声を書いてくださったり、Googleフォームにメールアドレスを登録してくださった方々ありがとうございます。

iOSアプリのリリースから3ヶ月間、大変お待たせしました!!

ぜひAndroidでもLISTを使っていただいて、「自分のやりたいことリスト」を作ってみてください!

使ってみて良かったら、お友達にも共有してもらえると嬉しいです。

そして、不具合を見つけたり要望があればお問い合わせからお願い致します。

play.google.com

LISTのAndroid版アプリ開発経緯

少しだけ開発経緯について書かせてください。

たしか、2019年の1月か2月ぐらいにぴょんくんからサービスのアイデアを聞かせてもらって、Android開発を任せてもらったのがきっかけです。

そのときは、Androidアプリの開発をやったことがなかったので、まずは書籍を買ってサンプルアプリを作ったりし始めました。

ただ、サンプルアプリを作り続けてもリリースできそうなアプリを作れるわけもなく時間だけが過ぎてしまい、2019年8月末には開発合宿はしたけどAndroidのレイアウトについてもまともに理解してない状況でした。

2019年9月~12月は他の開発で忙しくなったこともあり、まともに手を動かせてませんでした。

この間に、LISTに関連するものを作ったのは https://100list.app のLPぐらい。。。

そんなAndroidのコードが全く書けないときに助けてくださったのが今働いている会社の先輩で、1聞いたら10も教えてくれるめちゃめちゃ優しい先輩でした。

どういうライブラリを使えば良いか、MVVMで作るにはどうするか、データバインディングって何?DIって何使えばよい?targetVersionどうすれば良い?とか大きなものから細かいものまで色々!

あと、自分ならこう作るよーとgithubのリポジトリ検索アプリのサンプルコード書いて見せてくださったり、TwitterでAndroidで分からないところをつぶやいているとリプライくれたり、もうすぐリリースできるってなったときにAndroid App Bundle使ったほうが良い、証明書はGoogleに預けたほうが良いとか、アップロード証明書についてとか、どうやってGoogle Playに申請するのかを、忙しいのにZoomで教えてくれました。

先輩がいないとリリースまでこぎつけられなかったと思います。kamedonさん、本当にありがとうございます!!!!!

あと、もうひとり会社の先輩で感謝したい先輩がいて、先輩が書いたAndroidアプリのコードを読ませて欲しいとお願いしたら快く読ませてくれました。

正直、身近にAndroidアプリのコードを見せてもらえる先輩がいないと考えるときつかったなと思います。Nishidaさん、ありがとうございます!!!!!

この二人の先輩のおかげで、Android開発で分からない部分が出てきてもすぐに解決して開発をスムーズに進められたなと思います。

github見てみると、ほぼ毎日開発してました(笑) 焦っているのが読み取れますw

f:id:ryskit:20200413232103p:plain

LISTの開発

僕がLPとか作ったりしている頃、Asano YukiShigetani YuNakagawa Takashiひらやま富永が先行してiOSアプリを爆速で形作っていったのは近くで見ていてすげーなと思いました。

Androidアプリ作るときにだいぶサーバーサイドとiOSのコードは読ませてもらいました! Asanoさん、Takashi、爆速で開発、インフラ構築ありがとう!!

とみーさん、デザイン作成ありがとうございます!! Android用に緊急でSVG修正してくださったり、Google Play用に画像修正してくださったり助かりました!

さいごに

ぴょんくんねごさん

Androidアプリ開発未経験なのに、任せてくれてありがとうございます!!

iOSとAndroidアプリを揃えていろいろ施策やっていきたいはずなのに、AndroidのリリースはiOSがリリースされた後でも問題ないよ!と待ってもらったことも精神的に助かりました。

引き続き、機能開発頑張るのでよろしくお願いします!

改めて最後に

LISTのAndroidアプリの開発に参加できて良かったなと思います。

普段はプログラマーとして働いていて、主にサーバーサイドの開発をしているので、アプリを開発することはなかなかありません。

こういう機会をもらって、Androidアプリを一から開発してリリースまで持っていけたのは自分の中で自信にもつながりました。

あと、アプリ開発中はサーバーサイドの開発の感覚と違うので、「めっちゃ難しい...」「なるほど。わからん。」という気持ちがたくさん湧いてきます。

これは初めてプログラミングを始めたときと同じ気持ちだなと思って、久しぶりにこういう感覚を味わえたのは楽しかったです。

自分なりに頑張って作ったので、ぜひLISTをインストールしてもらってたくさん使ってもらえると嬉しいです。

このアプリが自分の「やりたいことリスト」を作る手助けになればと思います。

「LIST」公式サイト| やりたいことを、みつけよう。

「LIST」Official Instagram

「LIST」Official Twitter

play.google.com

LIST やりたいことリスト

LIST やりたいことリスト

  • YOHAKU, K.K
  • ライフスタイル
  • 無料
apps.apple.com

2020年3月振り返り

今月も振り返ります。

仕事

プロジェクトでやったこと

  • 要件定義
  • 仕様書作成
  • アーキテクチャ図作成
  • etc...

今月は設計・ドキュメント作成が仕事の大半を占める。

仕様書、設計書等のドキュメントを書く力が足りなさすぎることを実感しました。

以下、ドキュメントを書く際に意識する(自分に対して)

  • ドキュメントの目的はなにか
  • どのような読者を想定しているか
  • このシステムの特徴はなにか
  • どういったことを仕様として書くのか
  • そのワーディングの定義は?
    • ないなら定義する
    • ブレたワーディングを使わない
    • 他のシステムとの連携があるなら、共通のワードを使うなど
  • 自分がそのドキュメントで伝えたい思いはなにか
  • 思いを論理的に書く
  • etc...

プライベート

読書

  • ズボラPDCA
    • うーんって感じ
  • 理科系の作文技術
    • 学生のときに読んだのを思い出して、読み返してみた
    • ドキュメント書く上で学ぶことが多い
    • これは何度も読み直す必要あり
  • まんがでわかる 理科系の作文技術
    • サクッと読める
  • 1%の努力
    • めちゃ良かった
    • The Third Doorを読み直したくなった
  • 世界で一番やさしい 会議の教科書
    • 会議仕切るのを参考にするために読んだ
    • 良い!
  • マイクロサービスパターン(読み終わってない)
    • まだ読み始めたばかりだけど、面白い!
  • Design It!
    • 良い!
    • これも噛めば噛むほど味が出るやつ
  • 実践 AWS CDK
    • 良い
    • VPCを使ったAWSサービスの使用例をほしかった
  • ブルーピリオド
    • 久しぶりに当たり!
  • 筋トレが最強のソリューションである
    • 筋トレします

開発

  • https://100list.app のAndroid版を開発中
  • Android難しいが、もっといろんなアプリのコード読んで学びたい

筋トレ

  • コロナでジムに行くのを躊躇うので、家でダンベル持ち上げるぐらい
  • ちゃんと運動したい

2020年2月振り返り

はい、今月も振り返ります。

といっても、あんまり記憶ないです。 ちゃんと記録しとかないとどんどん忘れますね...

仕事

  • 2月は1月に落ち着いたプロジェクトの仕様変更依頼などに対応
  • バグ修正
  • 2月から新しいプロジェクトが立ち上がったので、それのアーキテクチャ設計と調査
    • 大規模のプッシュ配信システムのアーキテクチャ考えるの楽しい
    • 仕様書やDesign It!っていう本で書かれているASRを考える・書くことは大切ですね(大変だけど)
    • データモデリング
    • ワーディング大切。曖昧に言葉を使って仕様書書くとブレる。

プライベート

  • https://100list.appのAndroid版をとにかく開発
    • iOSはすでにリリースされてるので焦ってる
    • 引き続きがんばります
  • 仕事終わったらとりあえずスタバに行って22時ぐらいまで開発してた(おそらく3月もそうなる)
  • ジムは2月は13回行った
  • ランニング5km走れるようになった
  • ドメイン駆動設計入門を読んだ
  • AOJのC++でプログラミング入門を始めた

2020年1月振り返り

今年から1ヶ月ごとの振り返りを書いていく。

理由は、毎年毎年年末になると何してたのか思い出せず自分の棚卸しさえできてないけど、毎月書けば振り返りもしやすそうだから。

とりあえず、お試しで毎月書くようにするよ!

仕事

  • 今関わっているチームの小さいプロジェクトが一段落しそうってことで、去年よりも時間的に余裕のある仕事ができている
  • 本番運用時にエラーや障害の検知、運用時に毎回検知しておきたいログ等をメール、Slack、Push通知で知らせるように、AWS CDKでCloudWatch Alarm, Cloud Watch Logsのフィルターを作成
  • CloudWatch Alarmのアクションで実行されるAWS Lambdaをserverless frameworkで実装(Rust)
  • バグ修正
  • Cコンパイラの実装は関数宣言まで(https://www.sigbus.info/compilerbook)

プライベート

  • https://100list.app のLP修正
  • Androidアプリの実装(急ぎます)
  • Pythonでスクレイピングのためのコード書いた
    • 期日のほんとギリギリでデータ取れたので良かった
  • 1/11(土)にジムに契約して、1/13日(日)からジム行き始めた
    • 週3でジムに通って1時間ほど鍛えるのが目標だけど、週5ぐらいで行ってるし継続できてる
    • チェストプレス、ショルダープレス、アブドミナル、ラットプルダウンあたりのマシンで70kgを軽々できるようになるのが直近の目標
      • どのマシンもまだ50kg台程度しか重量上げられてない。。。
    • ランニングは20kmぐらい走れるようになりたい
      • ジム行き始めは10分もきつかったけど、今は9km/h で25分ぐらい走れるようになったよ(体調次第のところもある)
    • 体重はまだ全然減らないんだけど?
    • プロテインとかサプリメントも飲みだしたよ
  • 30日プランクチャレンジも始めた
    • この記事書いてる日で9日目  * 今の自己ベストは105秒
  • 1/25に梅田のb-monsterに初めて行った
    • 朝7時から自分の限界まで追い込むので最高
    • まだ入会してないけど、あれだけ追い込めるなら価値あるから悩んでる
    • 朝から活動するの良いですね(いつも起きるの遅いから改善必須)
  • ブログは技術ネタのみで今年50記事書くのが目標で、今月4記事
  • AtCoderの練習問題を解き始めた
    • コンテストはまだ参加してない

最後に

やりたいことを管理して日頃から見返すとやる気出るからLISTっていうアプリはおすすめです!

https://100list.app

Amazon Linux2にPython3をインストールする

Pythonは書いたことなかったんですがスクレイピングするためにサクッと書いて、それをローカルではなくEC2上で動かす必要性が出てきました。

利用しようとしたAmazon Linux2にプリインストールされているのはPythonの2系なのですが、ローカルで書いたスクリプトはPython3系で書いたため、EC2上にPython3をインストールする必要がありました。

そのときに実行した手順を備忘録として書いておきます。

前提

  • Amazon Linux 2 AMI(ami-011facbea5ec0363b)でEC2を起動

手順

Python3をインストール

sudo amazon-linux-extras install python3 -y

pip3をアップデート

sudo pip3 install --upgrade pip

Python3のバージョンを確認

python3 --version

Python 3.6.2(現時点だと3.8.1が最新なので、ちょっと古いね...)

必要なパッケージをインストールする

pip3 install boto3
pip3 install requests
pip3 install beautifulsoup4

おまけ

端末から抜けたりしても、スクリプトは実行し続けてほしい場合は、nohup使うと良いよ

nohup python3 main.py > ~/output.log &

プロセス確認する場合

ps aux | grep main.py

Serverless FrameworkとGoでAWS利用費を毎朝Slackに通知する

f:id:ryskit:20200119180331p:plain

以前、「AWS LambdaでAWS利用費を毎朝Slackに通知する」というタイトルで記事を書きました。 この中では、Serverless Frameworkを使わず、Goで書いたコードをビルドしてZip化、AWSリソースは手作業で作成、デプロイももちろん手作業でZipをアップロードしていました。

blog.ryskit.com

ただ正直、AWSリソースを手で作成するの面倒だし、修正してコマンド一発でデプロイしたいところです。

で、今回それを解決するためにServerless Frameworkを導入し、手作業ではなくターミナルからコマンドでデプロイできるようにします。

それでは、いってみましょう!

前提

AWS LambdaでAWS利用費を毎朝Slackに通知する - そうきたか で作成したコードを利用します。

ソースコードはこちらからダウンロードできます。

github.com

Serverless Frameworkをインストールする

すでに僕の環境にはNodeが入っていたので、npmでインストールしました。

npm install -g serverless

以下のリンク先にインストール方法は書いてあるので、参考にしてみてください!

serverless.com

Serverless Frameworkの設定ファイルを作る

以下のようなコマンドを実行すれば、ServerlessFrameworkの雛形を作成できますが今回は使いません。

serverless create -u https://github.com/serverless/serverless-golang/ -p hello-go-lambda

今回はすでに作成した環境があるので、そこにserverless.yml という名前のファイルを作成します。

service: aws-billing-notification

provider:
  name: aws
  runtime: go1.x
  stage: prd
  region: ap-northeast-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - "logs:CreateLogGroup"
        - "logs:CreateLogStream"
        - "logs:PutLogEvents"
        - "ce:GetCostAndUsage"
      Resource:
        - "*"

package:
 exclude:
   - ./**
 include:
   - ./bin/**

functions:
  billing-notification:
    handler: bin/main
    events:
      - schedule: cron(0 22 * * ? *)

あと、もう一つ作業があります。ファイルをリネームします。

以前、billing-notification.goという名前でファイルを作成していたのですが、main.go という名前にリネームしておいてください。

リネームできたら以下のコマンドでビルドします。

GOOS=linux go build -o bin/main

これで準備は完了です。

デプロイ

serverless frameworkのCLIコマンドでデプロイします。

以下のように実行してみてください。

sls deploy

これでしばらく待って、AWS Lambda, IAMロール, CloudwatchEvent等が作成されていればOKです!

試してみよう

以下のコマンドを実行して、請求金額がSlackに通知できれば完璧です!!

sls invoke -f billing-notification

最後に

いかがでしたでしょうか?

手作業で作成してデプロイするよりも遥かに簡単になりました!

以下に対応したコードをあげているので、参考にして試してみてください!

github.com

AWS CDKで作成したリソースのARN文字列を取得して加工する方法

f:id:ryskit:20200109205701p:plain

AWS-CDKではいくつかのコンストラクトでAWSリソースを作成することが可能です。

今回は低レベルのコンストラクトを利用したAWSリソースのArnを取得して、その文字列を加工してCWAlarmのDimensionのvalueに渡そうとしたときに詰まった部分を書いていきます。

前提

  • AWS-CDKはTypeScriptで記述している
  • Application LoadBalancerはCfnLoadBalanerを使ってリソースを作成している

実現したいこと

Application LoadBalancer(ALB)のTargetResponseTime(リクエストがロードバランサーから送信され、ターゲットからの応答を受信するまでの経過時間 (秒))をメトリクスとしてCloudWatchAlarmを作成したい。

Application LoadBalancerメトリクスの説明

ALBのTargetResponseTimeをメトリクスとする場合、リソースを作成するときにディメンションに以下のどれかを指定する必要がある。

  • LoadBalancer
  • AvailabilityZone、LoadBalancer
  • TargetGroup、LoadBalancer
  • TargetGroup、AvailabilityZone、LoadBalancer

参考: Application Load Balancer の CloudWatch メトリクス

今回は、LoadBalancerのみを指定するが、 以下の説明に記載されているように指定する必要があります。

ディメンション 説明
LoadBalancer ロードバランサーでメトリクスデータをフィルタリングします。ロードバランサーを次のように指定します。app/ロードバランサー名/1234567890123456 (ロードバランサー ARN の最後の部分)。

ALBのARNの例: arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/example-alb/abcdefg123456789

ディメンションには上記のARNのloadbalancer/以降の文字列をValueとして渡してあげれば問題ない。

問題点

例えば、以下のようなALBのリソースを記述したコードがあります。

const alb = new elb.CfnLoadBalancer(this, 'example', {
   ....
});

alb.ref のように書くとARNを取得できるので、以下のようにリソースを作成するコードを書いてみたけど、 作成されたCW AlarmのLoadBalancerのディメンションには、そのままのARN arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/example-alb/a123bcd456e7f8g9 が指定されており、TargetResponseTimeを取得できない状態でした。

※ alb.refの返り値は文字列です

const albDimentionValue = alb.ref.replace(/.+loadbalancer\/(.+)/, '$1');
const albTargetResponseTimeAlarm = new cw.CfnAlarm(this, 'targetResponseTimeAlarm', {
      actionsEnabled: true,
      alarmName: 'TargetResponseTimeAlarm',
      alarmActions: [scalingPolicy.ref],
      comparisonOperator: "GreaterThanOrEqualToThreshold",
      threshold: 3,
      evaluationPeriods: 3,
      namespace: "AWS/ApplicationELB",
      metricName: "TargetResponseTime",
      statistic: "Average",
      dimensions: [
        {
          name: "LoadBalancer",
          value: albDimentionValue
        }
      ],
      period: cdk.Duration.minutes(1).toSeconds(),
    });
    albTargetResponseTimeAlarm.addDependsOn(scalingPolicy);

解決策

どうやって解決したかというと、CloudFormationにもある組み込み関数を使えば、ARNの文字列を加工することができました。 CDKにもCloudFormationと同じ組み込み関数がcoreに定義されているのでそれを利用しました。

const splitAlbArn = cdk.Fn.split('/', alb.ref);
const albDimensionValue = `${cdk.Fn.select(1, splitAlbArn)}/${cdk.Fn.select(2, splitAlbArn)}/${cdk.Fn.select(3, splitAlbArn)}`;
const albTargetResponseTimeAlarm = new cw.CfnAlarm(this, 'targetResponseTimeAlarm', {
      actionsEnabled: true,
      alarmName: 'TargetResponseTimeAlarm',
      alarmActions: [scalingPolicy.ref],
      comparisonOperator: "GreaterThanOrEqualToThreshold",
      threshold: 3,
      evaluationPeriods: 3,
      namespace: "AWS/ApplicationELB",
      metricName: "TargetResponseTime",
      statistic: "Average",
      dimensions: [
        {
          name: "LoadBalancer",
          value: albDimensionValue
        }
      ],
      period: cdk.Duration.minutes(1).toSeconds(),
    });
    albTargetResponseTimeAlarm.addDependsOn(scalingPolicy);

最後に

AWS-CDKに関する記事はまだまだ少ないので、参考になれば幸いです。