エンジニアリングとお絵描き

お絵描きが趣味のエンジニアが、誰かの為になりそうなことや未来の自分の助けになりそうなことを書き残します.

【まぐれ合格体験記】3週間ちょっとでAWS SAA を取得した話

お久しぶりです.

5月20にAWS Certified Solution Architect - Associateに合格した為,体験記を残そうと思います.

結論

  • Udemyの対策問題を1周以上しよう

  • 隙間時間はYoutubeでCloudTechの対策動画を見よう

以下,たらたらと経緯を書きます.

721点で合格

この記事は「ほぼ運良く合格できた体験記」とでも言うべきものなので,参考にする際には注意してください.

というのも....

720点が合格点で、私は721点で合格しました.....

721点で合格したキャプチャ画像
721点合格....

受験中は「絶対落ちたな...まあ、これで勉強の機会になったからいいか」と思いながら回答していました.

勉強開始前スペックと受験動機

前提として,私は新卒研修で4日間のAWS研修を受け,S3の種類,アベイラビリティゾーン,AIMロール等,基礎的なことは学んでいました.

また,SAAの受験動機も,「AWS研修で学んだ内容を定着させたい」「折角AWSのモチベーションが上がっている今だからもっと勉強したい」という思いから来ていました.

そのため私が個人的に行った勉強とは別に,上記の研修が私の合格を後押ししてくれたことは間違いないと思います.

[補足]

研修以前の私のAWS経験は,以下の機能にアルバイトで少し触れた程度です.

  • S3
  • Lambda
  • Cognito
  • Amplify

「Cloud○○とかE〇△とか似た名前のサービス多すぎ!分からん!」って思ってる程度のレベルでした.

何故SAA?まずはCLFでは?

AWS Certified Cloud Practitioner(CLF)という試験では,AWS用語の基礎的な内容理解を問われるらしく,AWS初学者がまず受験するならCLFらしいです. ただ,会社の同期にCLFを飛ばしていきなりSAAを取得していた人が居て,彼曰く「研修受けたんだしSAA全然行けるよ!」とのことだったので,鵜呑みにしました.

結果としては,CLFよりも高難易度と言われるSAAを取得できたので良かったのですが,「AWS研修で学んだ内容を定着させたい」という私の目的から考えるとCLFでも全然良かったなと思います.

勉強内容

結論は冒頭にも書きましたが,

「Udemyの対策試験をぶん回しながら隙間時間にYoutubeで対策動画を見る」

というのが試験合格を最短で目指すには適切だと思います.

私は以下の3つを行いました.

  • 参考書を読む
  • Youtubeに上がっている無料対策動画を見る
  • Udemyの対策試験を行う

参考書を読む

「SAA試験に申し込んだ!まずは参考書を買おう!」という勢いのまま図書カードを握りしめて本屋に直行し,参考書を購入しました.

Amazon.co.jp: (模擬問題付き)徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書 第3版[SAA-C03]対応 : 鳥谷部 昭寛, 宮口 光平, 半田 大樹, 株式会社ソキウス・ジャパン: 本

「SAAの試験範囲の理解を深める」には良いと思うのですが,私は1/3くらい読み終えてから「これ読むより練習問題解いた方が試験対策になりそう....」という考えになり,最後まで読みませんでした.(もったいない)

資格試験申し込んだら,取り合えず本屋で参考書を買いたくなる衝動ってありますよね.

後述の試験対策で辞書的に使おうかとも思いましたが,正直ChatGPTに聞く方が分かりやすいのであまり出番は無かったです.(ChatGPTの回答は正確では無いかもですが,トンチンカンな回答は来ませんでした)

Youtubeに上がっている無料対策動画を見る

CloudTechというYoutubeチャンネルでSAA試験対策となる問題と解説が100問以上投稿されており,横になりながら聞いて学習していました.

www.youtube.com

www.youtube.com

私は上記の再生リスト2つを全問視聴し,分からない単語はChatGPT-4さんに聞いて学習しました.

内容が古かったり解説がちょっと分かにくい問題もありますが,通勤時間や隙間時間,やる気の出ない時に動画でのんびり勉強できるのは,かなり助かりました.

Udemyの対策試験を行う

SAA合格者の同期が行った対策が「Udemyの対策問題を2周する」というものだったので,2400円払って購入しました.

https://www.udemy.com/course/aws-knan/

CloudTechの練習問題よりも詳細な解説があり,難易度も高いように感じました. 2周はしたいと思っていたのですが,想定以上に時間がかかり,1周すらできず模擬試験3つ目を終えた辺りで試験当日を迎えてしまいました...(もったいない!) 分からない言葉などはChatGPT-4に適宜質問しながら学習していました.

終わり

プライベートでの合計勉強時間は20時間強かなと思います.

結果合格できて良かったんですが,付け焼刃というか,既に忘れかけている所もあるので,もっと勉強時間を確保すれば良かったなと思っています. ただ,この試験を受けたことでAWSアレルギーは軽減できたと思うので,思い切って申し込んで良かったです.

株式会社メディアドゥ様のサマーインターンシップへ参加した

2021年9月9日~15日までの平日5日間、株式会社メディアドゥ様のハッカソン型サマーインターンシップへ参加したので、インターンの内容や、学んだこと、感想を書きたいと思います! (結構時間が経ってしまったのでうろ覚えな点もあるかもしれません)

内容

電子書籍ビジネスをテーマに、ハッカソン形式にてチームでビジネスの企画とプロダクトの開発を行いました。 昨年から始まったようで、昨年は10日間、今年は5日間開催されたようです。

以下公式ページ techdo.mediado.jp

参加すると日当1万2千円を貰うことができ、加えて5万円分の「コミなび」ポイントが貰えます。(コミなびとはメディアドゥ様が運営している電子マンガサイトです)

加えてこのハッカソンには4つの賞があり、1つの賞を貰うことで追加で5万円分のコミなびポイントが貰えちゃいます...!!(1賞につき1チーム25万ポイントで、1チーム5名な為1人5万ポイント)

メチャクチャ豪華ですね!

参加までの流れ

6月くらいにインターン説明会へ参加し、そこでESの提出やコーディングテストを受験するURLを受け取り(メールアドレス登録?)、コーディングテストを受けて、ESを出して、合格すれば面談して、インターン内定という流れでした。私はみんな大好き魔法のスプレットシートでこのインターンを見つけました。

コーディングテストではtrackを使用し、"コードの間違いを指摘する簡単な問題を短時間に沢山解く問題"、"簡単なAPIを作る問題"、"SQL関係の問題"、とかだったと思います。 正直あまり自信は無かったのですが、無事合格できました。諦めない心が大事ですね!

これはインターン中に聞いたのですが、このコーディングテストはあくまで最低ラインを決める物であり、これが高得点だったとか、ギリギリだったとかは今後に影響は無いみたいです。

スケジュール

大分記憶が曖昧なのですが、初日はチームリーダーを決めたり、チーム名は決めたりとワークを行い、初日の後半から二日目にかけて何を開発するのか話し合い、土日を挟んで開発に臨んだ気がします。 因みにチーム名は「眼力(シリョク)アゲたい⤴⤴⤴」となりました(チームメンバー全員が目が悪かった為)

土日を挟むことで煮詰まった考えが整理され、客観的に開発テーマの軌道修正を行えた気がします。 テーマが決まったら実装を始め、最終日には最終発表を行いました。

開発テーマ

1チーム5人で開発し、お題は「電子書籍業界の売上を上げる為のプロダクトをつくる」というものでした。 このお題に沿って、チームで何を開発するのか、誰をターゲットにするのか、どうやって収益を上げるのか等を議論し、開発テーマを決めました。

自分はビジネスのことを考えて何かを作った経験が無かったため、「あったらいいね」というレベルの案は出せても、「それにお金を払うか?」「売り上げが上がるのか?」と問われたら微妙な案しか思いつかず、かなり大変な作業でした。ハッカソンではこの「何を作るか」が一番重要らしく、一番難しいらしいのですが、本当に難しいと感じました。

最終的には、「専門書を章ごとに自動で分割し、各章単位で販売・レコメンドするシステム」を開発することとなりました。 私は初めにこのテーマをチームメンバーから聞いた際、そこまで良さが分からなかったのですが、チームメンバーの一人(発案者ではない)がとてもいい案だと推し、この案で開発することになりました。

今思うと、この時の自分は、どういったテーマがこのハッカソンの趣旨、お題とマッチしているのかを把握できていなかったなと思います。 開発することになったテーマでは、対象を「新品の専門書は高くて買えない学生」と限定しており、実際に強い需要があろうことも確認できていて、「電子書籍ビズネスの売上を上げる」というお題に一番マッチしていました。お題・目的にマッチするテーマはどういった物なのか(何を満たしているのか)を見極めるセンサーをもっと磨いていきたいなと思いました。

また、メンターの方からの私個人へのフィードバックでは、「ファシリテーターをしているように思えた」と言って頂き、グループワークでは普段気づかない自分の一面が分かるなと思いました。

実装

「専門書を章ごとに自動で分割し、各章単位で販売・レコメンドするシステム」を開発したのですが、「章ごとに分割」や「章ごとのレコメンド」は別のメンバーがpythonで実装し、私は基本VueとVuetifyを用いてフロントを実装しました。新しく使った技術を挙げるとすれば、「BiBi」という電子書籍をデータをウェブで表示させるためのビューワーを使用した点です。この「BiBi」を用いれば、電子書籍データのフォーマット規格である「EPUB」データをウェブで簡単に表示させることができます。私は他のメンバーが実装した「EPUBデータの章ごとの分割」機能によって得られた「章単位のEPUBデータ」を「BiBi」を用いてWebに表示させる箇所を実装しました。

初めは「使ったことのない技術」&「時間がない」ということで不安でしたが、案外すぐに実装できて一安心でした。(詰まっても優秀なチームメンバーにアドバイスを貰いすぐに解決できました。圧倒的感謝)

以下BiBiの参考

techdo.mediado.jp bibi.epub.link

発表

実装はかなり余裕を持って終えることができ(実装期間2日半しかなかったのに余裕があることに驚き...)、発表練習も数回して本番を迎えたところ、CEO賞、CEO賞、CBDO賞、オーディエンス賞の4つの賞の内、CEO賞とCTO賞を受賞することができました!参加するだけでコミなびポイントは5万ポイント貰えているので、合計15万ポイント貰えることになりました...! 15万円分の漫画とは一体....????

f:id:pengin_0_maru:20211007215523j:plain
アプリケーションの画像(一覧画面)
f:id:pengin_0_maru:20211007215549j:plain
アプリケーションの画像(個別ページ)

振り返り

今回のハッカソンでは「短期間でのチーム開発」「ビジネスを考えたプロダクト開発」を学ぶことができたと思いました。個人開発や長期インターンでの開発業務ではこんなに短期間で動く物を作る経験は得られないので、とてもいい経験を得られたと思います。また、チームメンバーの中には飛びぬけて技術力や経験値が高い方もいて、そういった方と一緒に開発し、話を聞けたのもとてもいい刺激になったと思いました。

チームメンバーにも恵まれ、メンターの方も親切にアドバイスやフィードバックを下さり、とても充実した1週間だったと思います。

もう大学も始まり就活のことも考え始めないといけない時期なので、コミなびポイント15万円分はまだ使えていないのですが、3月辺りには消えてしまうらしいので、それまでに何か長編マンガをまとめ買いしたいと思います...!

株式会社いい生活 様のサマーインターンシップへ参加してきました...!!

とても久しぶりの更新です。

先週の8月23日から29日までの5日間、株式会社いい生活様のサマーインターンシップへ参加したので、インターンの内容や、学んだこと、感想を書きたいと思います!

内容

実際のプロダクトで使われている物件検索APIを用いて、物件検索アプリをチーム(4人)で開発しました。事前準備日5千円、インターン1日1万円の日当が支給され、合計5万5千円も貰えます....! 凄い!

スケジュール

  • 1日目:環境構築(Amazon Work Spaces)、講習、要件定義
  • 2日目~4日目:実装
  • 5日目:資料作成と発表。振り返り

1日目

Amazon WorkSpacesを用いて環境構築を行い、VPN接続を行いました。その後はインターンで使用する技術の簡単な講義(git/GitLab、TypeScript、React、Firebase)を受け、開発するアプリケーションの要件定義を行いました。 要件定義は「ペルソナ」を考えたり、「USM(ユーザーストーリーマッピング)」を行ったりとワークを行い、どのようなユーザーがどういった要望を持っているかを考え、それを元にどういった機能を持つアプリケーションを開発するか話し合いました。 環境構築・講義の時間が押してしまい、要件定義を決める時間が少なくて焦りましたが、何とかまとめることができました。

2日目~ 4日目

この期間はひたすら実装を行いました。Slackの「ハドルミーティング」という機能を使用し、常に会話できる状態で作業を行ったことでメンバー間での助け合いを活発に行う事ができました。私はFirebaseを用いた開発の経験があったため、Firebase周りで多く助言ができたと思います。逆に、私はReactを用いた開発に慣れておらず、TypeScriptを用いた型定義もまだまだ未熟である為、VsCodeのLive Share機能を用いてチームメンバーに沢山助けて頂き、とても勉強になりました。

5日目

致命的なバグが起きていないか動作確認を行い、急いでスライド作りに取り掛かりました。1度はリハーサルができたのですが、結構ぎりぎりになってしまい、もう少し余裕を持てたらよかったかもしれません。 他の班の発表も聞き、班によって思ったよりも特色が出るなぁと感じました。実装ばかりに目が行きがちですが、発表資料やアプリのデザインも重要だと感じました。

私はFirebaseを用いたDB周りを主に担当した為、「物件のidと口コミをDBに保存する機能」「物件にステータスを付与し、そのステータスを用いて検索一覧で絞り込む機能」等の機能を実装・説明しました。

f:id:pengin_0_maru:20210829234206j:plain
ステータス付与機能
f:id:pengin_0_maru:20210829234105j:plain
ステータスによる絞り込み機能
f:id:pengin_0_maru:20210829234001j:plain
口コミ追加機能

昼会・座談会

1日目から4日目には、昼会と座談会があり(1日目は昼会は無かった)、それぞれ30分ほど社員の方と雑談形式で質問ができる時間がありました(昼会は任意参加)。 どうしていい生活へ入社したのか?いい生活の良いところは?など、気になる質問をドシドシ投げかけることができ、企業を理解する良い時間となりました。

色々な方のお話を聞いた感触としては「会社の規模」「自社開発」という点でいい生活への就職を決めた方が多い印象でした。 また、院卒の社員の方が多めだったのも印象的でした。私は高専から大学へ編入し、院まで進んでいるのですが、同じようなキャリアの社員の方は多い一方、高専卒で働いている社員はあまりいないようでした。(高専卒を採用していないわけでは無いみたいです)

理系で大学院まで行ったが営業職で就職した方や、院まで情報系を専攻していたがデザイナーとして就職した方など、これまでの経歴に捕らわれずにキャリアを選んだ方の話を聞くことができ、自分も広い視野を持って就職活動に臨みたいと思いました。

感想

1週間という短い期間でチーム開発を行った経験は無かったため、どのようになるのか不安もありましたが、急ぎつつ、学びつつ、楽しみつつ開発を行う事ができとても良かったです。Firebase、TypeScriptというある程度触れたことのある技術と、Reactという未経験の技術を両方使えたこともラッキーだったかなと思いました。(使ったことが無い技術ばかりだと辛く、経験のある技術ばかりだと学びが少ないかも?)

また、本インターンシップではGitHubでは無くGitLabを使ってチーム開発を行い、普段とは異なる技術に触れる良い機会となりました。 Amazon Work Spaces を用いているため開発環境は結構重く、初めは戸惑いましたが、慣れたらあまり気にならなくなりました。

メンターの方も親切に教えてくださり、充実した1週間だったと思います...!!

一週間ありがとうございました!

Vue.js と Pixi.js を 用いた個人アプリ制作

はじめに

今後、以前に作成した以下の間違え探しゲームを元に、もっとちゃんと遊べる間違え探しゲームを作っていこうと思います。

1日で作れる簡単なWebゲームを作りたい...! - メモ日記

今回は、Vue.jsを用いた環境で、元とする上記の間違え探しゲームが動くようになるまでに詰まった個所と、その際参考にした記事を備忘録としてまとめました。

技術選び

はじめ、Nuxt.jsとTypeScript、Pixi.jsを用いて開発しようと考えていました。 Nuxt.jsとTypeScriptを選んだ理由は、「Vue.js、JavaScriptよりもNuxt.js、TypeScriptの方が流行りらしいから...!」という安直なものです。

私は、「とにかく学ぶなら流行りの技術!」という思いから上記の考えに至ったのですが、実際開発フェーズに移ると...

当然何も分からず全然コードが書けませんでした...

理由は明白で、「JavaScriptとVueの知識、経験が全く足りていないから」です。 Nuxt.js、TypeScript共に、Vue.jsとJavaScriptが理解できている前提の技術であるため、学習の順番が異なっていることに気づかされました。 手を動かす前に、ちゃんと使う技術について調べ、今の自分やプロダクトに相応しいが吟味することがどれほど重要かを再確認しました....。

参考:Nuxt.jsに飛びつく前に~Nuxt.jsを習得するための前提技術と、その勉強方法の紹介~ - Qiita

ということで、多少経験のあるVue.js、ゲーム制作に便利と思われるPixi.jsを用いて開発することにしました。

画像が表示できない

1日で作れる簡単なWebゲームを作りたい...! - メモ日記 を作成した際にも詰まったのですが、素材画像がどうしても表示できず、困り果てていました。

結果として、次の記事を参考にさせて頂くことで解決できました。

【Vue.js】なぜかimgが表示されない時の解決法とその理由 - ryoのぼやき

require()を使い画像をモジュールとして読み込むことで、無事Pixi.jsのキャンバス上に画像を表示させることができました。

ゲーム画面を再度表示する際のエラー

一度開いたゲーム画面から、別の画面に移動し、再度ゲーム画面を開く際、以前のデータが残っており、エラーが出てしまいました。

以下の記事を参考にし、無事解決できました。

Next.js + PixiJSでPIXI.loaders.Loaderを使った際、ホットリロード時に'Error: Resource named "RESOURCE_NAME" already exists.' となるのを防ぐ 🛡 - みかづきブログ・カスタム

Warging "Texture added to the cache with an id [0] that already had an entry" when using Spritesheet.parse() - Pixi.js - HTML5 Game Devs Forum

https://pixijs.download/dev/docs/PIXI.utils.html#clearTextureCache

Dockerを学ぶ

Docker に触れる機会があったため、ある程度理解して使えるレベルになりたいと思い、学んだことを備忘録としてまとめました。(まとめたと言うよりも殴り書きした....?)

ざっくり理解して使えるようになることが目的な為、正確では無いと思います。

Docker とは何なのか

wikiには

「コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである」

とあります。

私はとりあえず、「仮想化の技術をより軽くして、環境構築が楽になり、環境の共有が簡単になる便利な物なんだな~」と思っておくことにします。

Dockerの種類

Dockerには無償版Docker CE (Docker Community Edition) と、有償版Docker EE (Docker Enterprise Edition)の2種類あるようです。

今後docker ce が出てきたら「無償版のDocker」と理解すれば良いと思います。(こういった小さな理解の積み重ねを大事にしていきたい)

Dockerにまつわる用語

Dockerについて調べると必ず出てくる用語が「コンテナ」と「イメージ」です。 Dockerに関する記事の多くで、この2つの説明が初めに長く書かれており、「これ...全部読むの...」と心が折れかけ、読んだ後も、「読んだけど...分からん...結局何が違うんだ...??」と私はなりました。

結局私は、「イメージを用いてコンテナを作る。他人と環境を共有する際にはイメージを送受信して共有する。」というのが大事なのかなと思いました。

Docker Compose とは何なのか

Docker Compose とは、複数のコンテナで構成されたシステムの構築を簡単に行うツールみたいです。 「Docker Compose は無くてもDockerは使えるけど、使うと便利でよく使われているツール」という認識ができているだけでも、勉強する際に取っつきやすくなると思います。

Dockerを使えるようにするには、Dockerのインストールと、Docker Composeのインストールが必要になることが多いと思います。

Docker イメージの作成

Docker イメージを作成する方法は以下のように2種類あるようです。

  1. Dockerfileを使用してDocker イメージを作成する
  2. コンテナからDockerイメージを作成する

2つ目の方法でイメージを作成する際には、以下のコマンドを実行するだけです。

docker commit [コンテナ名] [イメージ名]

私は2つ目が楽で良いね!と思ってしまったのですが、作成したDockerイメージが何の操作をしてできたか分からなくなってしまう為、1つ目のDockerfileによってDockerイメージを作成する方が良いみたいです。

Dockerfile

Dockerfileとは、「Dockerのイメージ作成に関するコマンドをコード化してまとめたもの」らしいです。Dockerfileも、Docker Compose と同様に、「無くても使えるけどあると便利なもの」だと思います。

「Dockerfileを使うことで、同一のDocker イメージを簡単に作れて、便利」というのを覚えておけば良いと思います。

コマンド

以下、よく使うコマンドのメモです。

docker run //Docker イメージを使用して、コンテナを起動するコマンド
docker run -d //デーモンを使用してバックグランドで起動させる

docker run hello-world //「hello-world」というDocker イメージを使用して、コンテナを起動させる

docker run コマンドではDocker Hub からDocker イメージのダウンロードと、コンテナの起動まで実行する。

docker pull [イメージ名]:[タグ名]//Dockerイメージのダウンロードだけを行うコマンド

ローカル環境のDocekrイメージの一覧

docker images

Docker コンテナの一覧を確認する

docker ps  //実行中のコンテナの一覧表示
docker ps -a //全てのコンテナの一覧表示

停止中のコンテナ、イメージを放置すると、不要なデータが残り続けることになるため、不要になってコンテナ、イメージは削除する。

docker rm <コンテナ名orCONTAINER ID>// コンテナの削除
docker rmi <Dockerイメージ名orIMAGE ID> //イメージの削除

docker rm $(docker ps -aq)//停止中のコンテナを全て削除

実行中のコンテナにログイン、ログアウト

docker exec -it [コンテナ名もしくはコンテナID] [シェルのコマンド] //ログイン
exit //ログアウト

コンテナとローカル・ファイルシステム間でファイルとフォルダをコピーする

docker cp <ホスト側のファイル> <コンテナ名>:<コンテナ内のコピー先ディレクトリ>//ホスト側からコンテナ内にファイルをコピー
docker cp <コンテナ名>:<コンテナ内のコピー元ファイル> <ホスト側のコピー先ディレクトリ>//コンテナからホストへファイルをコピー

コンテナの起動、停止

docker start <コンテナ名orコンテナID>
docker stop <コンテナ名orコンテナID>

docker stop $(docker ps -q)//稼働中のコンテナを全て停止

参考

Docker - Wikipedia

Docker入門(第一回)~Dockerとは何か、何が良いのか~ | さくらのナレッジ

Dockerのイメージとコンテナの違い | CodeCampus

【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに? 〜 | SIOS Tech. Lab

Dockerを使ってみる

Dockerを学び、使ってみようと思ったのですが、仕組みを理解するには時間がかかりそうなため、取り合えず動かしてみた備忘録です。

開発環境にはWSL2を使用しています。

参考1:UbuntuにDockerエンジンをインストールする

参考2:Windows WSL2にDockerをインストールする

参考2は、私が初めてWSL2を導入した際にも参考にさせて頂いた動画です。

本日は、参考1を見ながら環境構築を行いました。その際、Docker Compose のバージョンが古いというエラーが発生してしまった為、以下の記事を参考にして解決しました。

参考3 :Docker Composeのバージョンが古くてversion: ‘3’の記述が使えない

Firebase hosting を行った際のコンフリクト

firebaseでhostingを行うと.firebaseというフォルダ内にhosting.(ランダムな値).cacheというファイルが作成されるようです。

先日、このファイルでコンフリクトが起きてしまったのですが、このファイルはgitにupせず、.gitignoreに追加するのが良いようです。

参考:What's the purpose of .firebase/hosting. ALPHANUM.cache

コンフリクトへの対処も経験の1つですが、可能であればコンフリクトが起きない方が精神的に良いので、こういった「upする必要のないファイルを.gitignoreに追加していないことによるコンフリクト」は起きないように配慮していきたいと思います。