2019年の振り返りと2020年の抱負

はじめに

2019年は大学院を卒業し、会社に就職と人生で割と大きなイベントがあった年でした。入社して3ヶ月間の研修後配属された職場は、(私が入社した会社からは)想像がつかない程居心地の良い場所であり、また所属チームのメンバーのスキルも高く、刺激を多く貰いました。

何を学んだか

実務編

職場では主にインフラ担当として、以下を扱いました。

  • Kubernetes (EKS)
  • Terraform
  • MySQL
    • パフォーマンスチューニング系

Kubernetesについては配属される前は名前だけ知ってる状態でしたが、実務で扱うことになると知った直後、猛勉強しました。実際に実務で扱ってからは、ある種毎日がインプットとアウトプットの連続であり、Kubernetesについてどんどん理解を深めることができて楽しかったです。

また職場ではAWSを主に使用しているため、AWS関連のサービスについても学習しました。

以下、学習に使用した書籍になります。今でも読み返しています。

Docker実践ガイド 第2版 impress top gearシリーズ

Docker実践ガイド 第2版 impress top gearシリーズ

Kubernetes完全ガイド impress top gearシリーズ

Kubernetes完全ガイド impress top gearシリーズ

実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing))

実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing))

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

  • 作者:ミック
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/04/11
  • メディア: 単行本(ソフトカバー)

booth.pm

プライベート編

実務では主にインフラを担当しているため、プライベートではフロントエンドに興味が湧きました。

2020年の抱負

2020年は社会人2年目に突入し、より専門性を職場で求められると思いますので、今まで以上に精進していきたいと思います。直近として、年度内にAWS SAPの取得を頑張ります。あとちょくちょくleetcodeもやっていきます。

では、今年もよろしくお願いします!

【合格体験記】AWS認定ソリューションアーキテクトアソシエイト(AWS-SAA)に合格したので振り返る

はじめに

はじめまして。令和新卒エンジニアの八雲です。

入社して早半年が過ぎ、ちょうど良いタイミングだったのでAWS認定ソリューションアーキテクトアソシエイト(AWS-SAA)を受験し、無事合格できたので振り返りの意味も込めて記事に起こしました。

これからAWS認定資格を受験しようと考えている新人の方への一助になれば幸いです。

対象とする読者

  • 基本情報技術者レベルの知識を持つ方
  • インフラに興味のある方
  • 新人でこれから資格を取ろうとしている方
  • 短期間で合格したい方

私について

  • IT企業に2019年度入社の新入社員
  • 情報系出身
  • Linux歴3年
    • 研究室のサーバー管理を担当してました
  • 趣味でAWSを用いてサービス構築の経験あり
    • 無料枠でEC2を立てて sudo rm -rf *は基本
    • fitbitで取得したバイタル情報の可視化をしてました
    • lambda, DynamoDB, Athena等はこの時学習済み

なぜ受験しようと考えたのか

  • 業務でAWSを用いており, AWSの知識が必要であったから
    • 現在関わっている業務ではバリバリにAWSを使い倒しており、AWS各種サービスの知識がなければシステムがどのように動いているのか把握できません。AWSの各サービスを体系的に学ぶために、AWS-SAAの資格学習はちょうど良いと判断しました
  • 自信をつけたかった
    • 職場では主にインフラ担当であり、アプリチームと連携して仕事をしています。その中で、アプリチームからAWSについて質問を度々受けますが、自信を持って回答できませんでした。そのため、体系的に学習しAWSの資格を取得することで、自身の発言に自信を持て、またアプリチームの信頼も得られればと思い、取得を決意しました。

勉強方法

試験までに主に2つの学習教材を使用しました。

  • Udemy講座
  • BlackBelt

試験受験まで以下の流れで学習しました。

  1. AWS模擬試験受験
    • PSI試験でAWS認定ソリューションアーキテクトアソシエイト模擬試験(AWS-SAA-P01)を選択して受験
    • スコアレポートから自身の苦手分野(理解が充分でないサービス)を把握
      • 本来であれば分野ごとに得点率が記載されたスコアレポートが試験後にダウンロードできるようになるが、何故か出来ず。試験中に問題のスクショを取っていたので、それを用いて苦手分野を確認しました。
  2. Udemy講座の受講
    • 特に理解し難いサービスはハンズオンも実施して頭にインプットさせる。
  3. Udemy講座に付いてきた模擬試験を繰り返し解く
    • Udemy講座を全て学習し終わったら模擬試験を解いて理解度をチェック
    • 誤答の多かった分野は再学習。模擬試験で全問正解できるまで復習
  4. BlackBeltの読み込み

おすすめは学習教材はUdemy講座のこれだけでOK! AWS認定ソリューションアーキテクト-アソシエイト試験突破講座(初心者向け21時間完全コース)です。これを軸に学習すれば無駄なくAWSの各サービスの概要・詳細・連携について知識を付けることができます。

試験当日

試験を受けるテストセンターは2種類から選べます。

  • PSIテストセンター
  • ピアソンVUEテストセンター

今回私は渋谷のPSIテストセンターを予約して受験しました。試験端末はKIOSK端末であり、カメラを通して試験官に監視されながらの受験となります。 試験を開始する前に、運転免許証・クレジットカードを試験官に見せて本人確認を行います。しかし運悪く試験端末の調子が悪くフリーズをしてしまい、結局本人確認が終わったのは試験開始予定時間から40分程過ぎた頃でした。 今後受験を行う方はピアソンVUEでの受験をお勧めします。

余談ですが、試験会場に用意されているキーボードは日本語キーボードですが、入力は英字キーボードになっています。それを知らないと、本人確認の際のメールアドレス入力時に『@(アットマーク)』が打てない!となるので注意しておきましょう。

試験自体はつつがなく進み、全ての問題を解き終わり、アンケートに回答し試験終了ボタンを押下直後に画面に『合格』と表示されました!

反省点

試験を受けて、もう少し勉強をしておくべきだったサービスを以下にまとめました。

  • EC2
  • Cloud Front
    • OAI(オリジンアクセスアイデンティ)
      • OAIを使用してS3のアクセス制限を実現する等の知識が必要です
  • Cognitio
  • ELB
    • 試験ではUdemy講座で扱った内容以上に詳しく聞かれた印象
      • 特にELBの証明書関連は理解していたほうが良いです
  • Elastic Beanstalk
    • Elastic Beanstalkが適している要件をきちんと把握している必要あり

最後に

AWS-SAAに無事合格できてほっとしています。資格取得のために幅広い分野のサービスを体系的に学習して各サービスの連携や設計のベストプラクティス等を知れたのはとても良かったです。アソシエイト資格を取得したことで、自信もつけれたと思います。

AWSの進化は目まぐるしく、早いペースで既存サービスの更新、新サービスの追加が行われていて、ネット上にある記事の内容が古いことなんてざらにあります。AWS認定ソリューションアーキテクトアソシエイト試験の新しいバージョンも予告され(https://aws.amazon.com/jp/certification/coming-soon/)、試験内容が難しくなることが予想されます。

今後も継続してAWSの勉強をしていくつもりです。次はソリューションアーキテクトプロフェッショナルに向けて頑張ります!

YOLOv3を用いてポケモンGOの黒卵の出現を自動検出してGoogle-Homeに喋らせる

はじめに

みなさんはポケモンGOというゲームをご存知でしょうか.ポケモンGOは位置情報を利用し,実際に現実世界に繰り出し様々な土地で出現するポケモンをゲットし収集するゲームです.

このポケモンGOの中に『レイド』なるものがあります.レイドでは,ポケモンGOの世界で『ジム』と呼ばれる場所に45分間出現する特別なポケモンをみんなで協力して倒すことができ,ポケモンを倒した人は報酬としてそのポケモンをゲットするチャンスが与えられます.ジムでレイドが行われる場合,一時間前にそのジム上に『卵』が出現します.出現する卵の色によって,出現する特別なポケモンの強さが変わり,黒卵の場合は『伝説のポケモン』が出現します.

伝説のポケモンは黒卵のレイドでしか入手できないため,ポケモンGOをプレイするポケモンマスターは日々黒卵が出現しているかをチェックし,黒卵が出現したジムの周りに集まる習性があります.私も土日はポケモンGOの画面を開き黒卵が出現しているかをチェックしています.

 

しかし,常にポケモンGOの画面を開き黒卵の出現をチェックするのは大変で,出現に気づかないことが多々あります.

そこでふと『黒卵が出現しているかのチェックを自動化できないか』と思い,やってみました.

どうやって作るか

YOLOv3を用いてMacbookPro上に出力したポケモンGO内のレイド一覧画面を認識し,黒卵を検出 → 黒卵を検出した場合,google-home-notifierを用いてGoolgleHomeに喋らせる,という方法で自動化したいと思います(無理矢理感あふれる)

YOLOv3の導入

 cd 任意の場所
 git clone https://github.com/pjreddie/darknet.git

認識させたい物体(黒卵)の学習準備

下記サイトを参考に黒卵の画像を学習させます.黒卵の画像の水増し,画像内の検出させたい物体の位置とラベルの出力を行います.

wakuphas.hatenablog.com

認識させたい物体(黒卵)の学習

Google Colaboratory(無料でGPUを利用できる環境が提供されている)を用いて学習を行います.

  • Google Colab上にYolo v3動作環境を用意する
 !apt update
 !nvcc -V
 !ln -sf /usr/local/cuda-9.2 /usr/local/cuda
 !apt-get install gcc-4.8 g++-4.8
 !update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 
 !update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50 --slave /usr/bin/g++ g++ /usr/bin/g++-7
 !update-alternatives --config gcc
 # 入力欄が出てくるのでg++-4.8のインデックスを入力
  • GoogleDriveからGoogle Colabへファイルを取得する 下記サイトを参考に先ほどGoogleDriveにアップロードしたファイルをGoogle Colabへコピーする.
 import os
 import google.colab
 import googleapiclient.discovery
 import googleapiclient.http
 
 google.colab.auth.authenticate_user()
 drive_service = googleapiclient.discovery.build('drive', 'v3')
 
 upload_filename = 'darknet.zip'
 
 file_list = drive_service.files().list(q="name='" + upload_filename + "'").execute().get('files')
 
 file_id = None
 for file in file_list:
   if file.get('name') == upload_filename:
     file_id = file.get('id')
     break
 
 if file_id is None:
   print(upload_filename + ' is None.')
 else:
   with open(upload_filename, 'wb') as f:
     request = drive_service.files().get_media(fileId=file_id)
     media = googleapiclient.http.MediaIoBaseDownload(f, request)
 
     done = False
     while not done:
       progress_status, done = media.next_chunk()
       print(100*progress_status.progress(), end="")
       print("complete")
  • GoogleDriveからダウンロードしたzipを解凍
 !unzip darknet.zip
 %%bash
 cd darknet
 make
  • 学習を開始.darknet53.conv.74は重みの初期値ファイル.
 %%bash
 cd darknet
 ./darknet  detector  train  cfg/obj.data cfg/yolov3-voc-obj.cfg darknet53.conv.74

学習が開始されると,あらかじめ設定されている試行回数(ここでは100)毎に重みファイルが出力されます.試したところ,だいたい試行回数1000の重みファイルで物体はある程度検出可能であったため,試行回数1100で学習を終えました.重みファイルは随時ダウンロードしておきます.

  • 黒卵を検出できるかの確認
 ./darknet detector test  cfg/obj.data cfg/yolov3-voc-obj.cfg backup/yolov3-voc-obj_1100.weights iOS.png

f:id:ykmrt777:20190407162545j:plain
きちんと黒卵を検出できている

YOLOv3によるポケモンGO画面の監視方法

ポケモンGOの画面をミラーリングソフト(iPad/iPhone画面録画ソフト)を利用してMacbookProに出力し,MacbookProのスクリーンショット画像をYOLOv3で認識します.

screencapture ./test.jpg
./darknet detector test cfg/obj.data cfg/yolov3-voc-obj.cfg backup/yolov3-voc-obj_1100.weights test.jpg > result.txt

GoogleHomeへの通知

google-home-notifierを利用する.下記サイトにmacOSでのgoogle-home-notifier導入について解説されているので,指示に従って行います.

qiita.com

  • main.jsの作成
const googlehome = require('google-home-notifier')
const language = 'ja';

googlehome.device('Google-Home', language); 

googlehome.notify('ポケモンGOで星5レイドが出現しました。', function(res) {
  console.log(res);
});

コマンドを実行すると,GoogleHomeMiniが独特の声で喋ります.

YOLOv3の黒卵検知とGoogleHomeへの通知の自動化

Pythonとlaunchdで自動化を行う.

  • search_black_eggs.pyの作成 ポケモンGOのスクショ画像を画像認識し,黒卵を検出した場合GoogleHomeに通知するまでの流れのスクリプトを記述します.
import os
import subprocess

cmd = 'screencapture ./pokemongo_raid.jpg'
cmd_darknet = './darknet detector test cfg/obj.data cfg/yolov3-voc-obj.cfg backup/yolov3-voc-obj_1100.weights pokemongo_raid.jpg > result.txt'
subprocess.call(cmd,shell=True)
subprocess.call(cmd_darknet,shell=True)
test_data = open("result.txt", "r")
contents = test_data.read()
fd = contents.find('black_eggs')
test_data.close()
if fd > 0:
    notification_cmd = './notification_gh.sh'
    subprocess.call(notification_cmd.split(),shell=True)
    print('end')
  • launchdでsearch_black_eggs.pyを自動実行させる 下記サイトを参考に行います. banmian.hatenablog.com

結果

こんな感じになりました.

これでゲームに熱中していてもGooleHomeが教えてくれます,やったね!

感想

初めてこうして記事を書きましたが,文字に起こしてアウトプットすることは非常に大変でした.ただ,継続は力なりと言いますので今後も何かネタがあったら書きたいと思います.