<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>転職  |  OZの教える×プログラミング成長記</title>
	<atom:link href="https://oz006.com/category/%E8%BB%A2%E8%81%B7/feed/" rel="self" type="application/rss+xml" />
	<link>https://oz006.com</link>
	<description></description>
	<lastBuildDate>Thu, 17 Jul 2025 05:19:14 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://oz006.com/wp-content/uploads/2024/10/cropped-OZLogo-32x32.png</url>
	<title>転職  |  OZの教える×プログラミング成長記</title>
	<link>https://oz006.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>予備校講師によるAWS・SAAの勉強方法</title>
		<link>https://oz006.com/aws-saa-study-method/</link>
					<comments>https://oz006.com/aws-saa-study-method/#respond</comments>
		
		<dc:creator><![CDATA[oz]]></dc:creator>
		<pubDate>Sat, 31 May 2025 12:57:50 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[転職]]></category>
		<guid isPermaLink="false">https://oz006.com/?p=643</guid>

					<description><![CDATA[２０２５年２月１７日から学習を始めて、３月１３日に受験して、合格することができました。この記事では、私自身、AWS・SAAの取得に向けて、どういった勉強を行ったかを記事にしてみたいと思います。これから、SAAを受験しよう [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1000" height="1000" src="https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-31-21.19.39-An-illustration-of-a-Japanese-cram-school-teacher-予備校講師-teaching-AWS-SAA-Solutions-Architect-Associate-exam-preparation.-The-scene-is-set-in-a-mod.webp" alt="" class="wp-image-660" srcset="https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-31-21.19.39-An-illustration-of-a-Japanese-cram-school-teacher-予備校講師-teaching-AWS-SAA-Solutions-Architect-Associate-exam-preparation.-The-scene-is-set-in-a-mod.webp 1000w, https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-31-21.19.39-An-illustration-of-a-Japanese-cram-school-teacher-予備校講師-teaching-AWS-SAA-Solutions-Architect-Associate-exam-preparation.-The-scene-is-set-in-a-mod-300x300.webp 300w, https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-31-21.19.39-An-illustration-of-a-Japanese-cram-school-teacher-予備校講師-teaching-AWS-SAA-Solutions-Architect-Associate-exam-preparation.-The-scene-is-set-in-a-mod-150x150.webp 150w, https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-31-21.19.39-An-illustration-of-a-Japanese-cram-school-teacher-予備校講師-teaching-AWS-SAA-Solutions-Architect-Associate-exam-preparation.-The-scene-is-set-in-a-mod-768x768.webp 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<p>２０２５年２月１７日から学習を始めて、３月１３日に受験して、合格することができました。<br>この記事では、私自身、AWS・SAAの取得に向けて、どういった勉強を行ったかを記事にしてみたいと思います。これから、SAAを受験しようと考えている方の少しでも参考になれば幸いです(^^)</p>



<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame2 preset6 animation-fade rtoc_open default" data-id="643" data-theme="Cocoon Child">
			<div id="rtoc-mokuji-title" class=" rtoc_left">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1"><strong>学習開始前の前提知識</strong></a></li><li class="rtoc-item"><a href="#rtoc-2">取得スコアは？</a></li><li class="rtoc-item"><a href="#rtoc-3">最初に行ったことは？</a></li><li class="rtoc-item"><a href="#rtoc-4">使用した教材一覧</a></li><li class="rtoc-item"><a href="#rtoc-5">費用の目安</a></li><li class="rtoc-item"><a href="#rtoc-6"><strong>1日の学習時間配分</strong></a></li><li class="rtoc-item"><a href="#rtoc-7">行った勉強手順</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-8">STEP1:Ping-tを解きまくれ！解説フォローはChatGPT！</a></li><li class="rtoc-item"><a href="#rtoc-9">STEP２:ある程度、OutPutできたらInput！</a></li><li class="rtoc-item"><a href="#rtoc-10">STEP３:Ping-tをすべて解き終えたら、模擬試験問題を時間を測って解く！</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-11">まとめ</a></li></ol></div><h2 id="rtoc-1"  class="wp-block-heading"><strong>学習開始前の前提知識</strong></h2>



<p><span class="marker-under"><strong>プログラミング学習を始めて、半年以上経ったくらいの状態でAWSは触ったことすらない状態からスタート</strong></span>しました。当然、実務未経験の状態です。レンタルサーバーを借りて、ポートフォリオを閲覧できる状態のレベルからのスタートです。学習しようと思ったきっかけとしては、知らないワードが出てくるとすごく気になってしまう性格のため、<strong><span class="marker-under">AWSの勉強をしないと、この先、エンジニアになったときに会話の中で知らないワードが多く飛び交う可能性があると感じた</span></strong>ため、学習しておこうと思ったのがきっかけです。</p>



<ul class="wp-block-list">
<li></li>
</ul>



<h2 id="rtoc-2"  class="wp-block-heading">取得スコアは？</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="617" src="https://oz006.com/wp-content/uploads/2025/05/AWS証明書.jpeg" alt="" class="wp-image-644" srcset="https://oz006.com/wp-content/uploads/2025/05/AWS証明書.jpeg 1000w, https://oz006.com/wp-content/uploads/2025/05/AWS証明書-300x185.jpeg 300w, https://oz006.com/wp-content/uploads/2025/05/AWS証明書-768x474.jpeg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<p>私の取得したスコアは、743でした。合格スコアが720なので、結構ギリギリですね(^_^;)<br>ただ、生徒たちにも伝えていますが、<strong>『<span class="marker-under">どんな試験でも合格するためにはどうすればいいかを常に考え、戦略を練って試験に望むこと</span>』</strong>が大切で、私の場合、インフラの学習がメインではないため、必ず１ヶ月以内の短期間で勉強して合格しようと決めていました。</p>



<h2 id="rtoc-3"  class="wp-block-heading">最初に行ったことは？</h2>



<p>当然ですが<strong>『情報収集』</strong>です。どのような教材を使用すれば効率良く勉強できるのかをネットなどで調べました。調べる際は、教材の難易度やレビューを参考にしながら行いましたが、Ping-tの評判は、ダントツで良かったため、まずはPing-tを使って学習することを決めました。<br><br>それと、<strong><span class="marker-under">どんな試験においても私が１番最初に確認することなのですが、どんな問題が出題され、どれくらいの制限時間で解かなければいけないのかの確認</span></strong>です。これを確認するために、<strong>書籍「AWS認定ソリューションアーキテクトアソシエイトテキスト＆問題集」を書店で購入</strong>して、最初に模擬問題を印刷し、問題のイメージと傾向、どんな知識が身につけば問題を解けるようになるのかを分析しました。<br><br><strong>そこでは<span class="marker-under">全く解けなくていい</span>です（解こうなんて思っていません笑）。４択問題で出題されることや、４分野のカテゴリーがあること、また、何問正解すれば合格できるのか、１問にかけることができる時間はどれくらいかを計算したりします。</strong><br><br>調べると、AWS資格試験にて、Non-native english speakersなら受験時間を追加で30分延長することができることが分かったりするので、時間に余裕はありそうであることや、試験の申し込みするタイミング（どのような申込み方法で、いつまでに申し込むべきかなど）なども、最初に確認しておくことをオススメします。オンラインで受験する場合は、意外と２・３日前でも申込みができるが、時間帯が限定されていたりする可能性は高くなるので、１週間以上前から、受験日は決め、申し込みをすることをオススメします。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="359" src="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.36.45.png" alt="" class="wp-image-654" srcset="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.36.45.png 1000w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.36.45-300x108.png 300w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.36.45-768x276.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 id="rtoc-4"  class="wp-block-heading">使用した教材一覧</h2>



<p><strong>①Ping-t</strong><br><strong>②書籍「AWS認定ソリューションアーキテクトアソシエイトテキスト＆問題集」</strong><br><strong>③Youtube「AWS資格 対策講座」</strong><br><strong>④Udemy「【ベストセラー完全日本語化】AWS 認定ソリューションアーキテクト アソシエイト SAA-C03 対応 2023 最新版」</strong></p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1000" height="490" src="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.49.21.jpg" alt="" class="wp-image-655" style="width:239px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.49.21.jpg 1000w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.49.21-300x147.jpg 300w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.49.21-768x376.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="768" height="1024" src="https://oz006.com/wp-content/uploads/2025/05/IMG_2496-768x1024.jpg" alt="" class="wp-image-657" style="width:261px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/05/IMG_2496-768x1024.jpg 768w, https://oz006.com/wp-content/uploads/2025/05/IMG_2496-225x300.jpg 225w, https://oz006.com/wp-content/uploads/2025/05/IMG_2496.jpg 1000w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="682" height="614" src="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.51.09.jpg" alt="" class="wp-image-656" style="width:288px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.51.09.jpg 682w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.51.09-300x270.jpg 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="664" height="600" src="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.55.44.jpg" alt="" class="wp-image-658" style="width:286px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.55.44.jpg 664w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-31-20.55.44-300x271.jpg 300w" sizes="auto, (max-width: 664px) 100vw, 664px" /></figure>



<p>上記４つをメインに使用して勉強しました。<br>上記の中で圧倒的に使用したのは、やはりPing-tでしたね。３週間の期間、問題を解かなった日はありませんでした。入浴中や寝る直前なども問題を解いて解いて解きまくりましたね(^^)<br><strong>最終的にはレベル１５になった状態で受験</strong>しています。さすがに、ここまで繰り返す必要はないと思います。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="462" src="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-29-185352.png" alt="" class="wp-image-648" srcset="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-29-185352.png 1000w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-29-185352-300x139.png 300w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-29-185352-768x355.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<h2 id="rtoc-5"  class="wp-block-heading">費用の目安</h2>



<p>●Ping-t：無料<br>●書籍価格：2000円程度<br>●Udemy：セール時に購入すれば、1500円程度 <br>●受験料：約16,500円（税込） <br>●総学習コストの目安：20000円程度</p>



<h2 id="rtoc-6"  class="wp-block-heading"><strong>1日の学習時間配分</strong></h2>



<p><strong><span class="marker-under">平日：１〜２時間、休日：５〜６時間くらいは毎日、勉強を続けました。</span></strong>仕事と両立しながら、勉強していましたが、仕事柄、勉強するのが習慣化していたので特に苦にはなりませんでした。ただ、勉強中、「飽きてきたら違う教材を使いながら、気分を変えて勉強する」ということは、意識していましたね。Ping-t解きまくって、疲れてきたらYoutubeで１周して、見てるだけだと眠くなるから、なぐり書き（読めない字レベル）しながら視聴したり、書いた内容を白紙にざっとOutPutして書き出してみたりと飽きない工夫を考えてやっていました。疲れてきたら、場所を変えて気分を変えたりもよくやっていますね。私の場合、朝のカフェ→図書館→自宅という流れが多かったです。ちなみに、仕事の休憩時間でも、Ping-tは解いていました(^^)</p>



<h2 id="rtoc-7"  class="wp-block-heading">行った勉強手順</h2>



<h3 id="rtoc-8"  class="wp-block-heading">STEP1:Ping-tを解きまくれ！解説フォローはChatGPT！</h3>



<p>まずは、Ping-tを片っ端から解きました。私は<span class="marker-under">、<strong>Inputからではなく、OutPutから始める勉強をよくやります</strong></span>。分からなくても問題を解きます。解いてどういう知識を頭に入れればいいかを確認していく作業のイメージですね。<strong>１周目は、全く分からなくても、勘などを頼りに選択肢を選びます</strong>。<strong>「間違ってもいいので、これじゃないかな？？」と思って選択して間違えた経験の方が記憶に残る</strong>ので、分からないなりにもこれかもしれないと思いながら解く経験も結構大切だと思います。</p>



<p>解説はしっかりと熟読して次に進めます。このとき、<strong>解説で分からないところは、ChatGPTに聞くようにしていきました</strong>。ChatGPTに問題と解説を張り付けて、「この問題に対して、専門用語をなるべく使わずに具体例を多く入れて解説してください。」とプロンプトを入力して、その解説で分からないところを深堀していけば、当然内容が頭に入っていきます。ほんと、いい時代になりましたね(^^)</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1000" height="825" src="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-29-190921.png" alt="" class="wp-image-649" style="width:653px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-29-190921.png 1000w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-29-190921-300x248.png 300w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-29-190921-768x634.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>当然、１周目を解き終えたあとは、2周・３周繰り返して、全部解答がスラスラ答えられるようになるまで、繰り返し問題を解きます。そんな感じで、ある程度どんどん進めていきます。</p>



<h3 id="rtoc-9"  class="wp-block-heading">STEP２:ある程度、OutPutできたらInput！</h3>



<p>私の場合、疲れた合間にInputとして、<strong>②書籍「AWS認定ソリューションアーキテクトアソシエイトテキスト＆問題集」</strong>を読んだり、<strong>③Youtube「AWS資格 対策講座」や、④Udemy「【ベストセラー完全日本語化】AWS 認定ソリューションアーキテクト アソシエイト SAA-C03 対応 2023 最新版」</strong>を視聴していました。<br><br>今なのであれば、Inputに使う順番は、</p>



<p><strong>③Youtube「AWS資格 対策講座」</strong><br>↓ <br><strong>②書籍「AWS認定ソリューションアーキテクトアソシエイトテキスト＆問題集」</strong><br>↓<br><strong>④Udemy「【ベストセラー完全日本語化】AWS 認定ソリューションアーキテクト アソシエイト SAA-C03 対応 2023 最新版」</strong><br><br>という流れが良いかなと思っています。</p>



<p><strong>Youtube「AWS資格 対策講座」</strong>の内容は、イラスト付きで、覚えるべきポイントがシンプルに頭に入ってくるので、<strong><span class="marker-under">ノートになぐり書きではありますが、要点のまとめとなりそうな部分はすべてまとめて</span></strong>いきました。</p>



<p>AWSには、さまざまなサービスがありますが、それぞれのサービスを、一言で言えばこういうもの！<br>って言えるようになるのは非常に大切だと思います。以下のようなイメージですね(^^)<br><br><strong>コンピューティング系</strong></p>



<ul class="wp-block-list">
<li><strong>EC2</strong> → 「クラウド上の仮想パソコン」</li>



<li><strong>Lambda</strong> → 「必要な時だけ動くプログラム実行環境」</li>
</ul>



<p><strong>ストレージ系</strong></p>



<ul class="wp-block-list">
<li><strong>S3</strong> → 「インターネット上の巨大な倉庫」</li>



<li><strong>EBS</strong> → 「EC2専用の外付けハードディスク（USBみたいなもの）」</li>
</ul>



<p><strong>データベース系</strong></p>



<ul class="wp-block-list">
<li><strong>RDS</strong> → 「お任せデータベース管理サービス」</li>



<li><strong>DynamoDB</strong> → 「超高速なNoSQLデータベース」</li>
</ul>



<p><strong>ネットワーク系</strong></p>



<ul class="wp-block-list">
<li><strong>CloudFront</strong> → 「世界中にデータを高速配信する仕組み」</li>



<li><strong>Route 53</strong> → 「インターネットの住所録管理」</li>
</ul>



<p><strong>監視・管理系</strong></p>



<ul class="wp-block-list">
<li><strong>CloudWatch</strong> → 「システムの健康状態を見張る監視カメラ」</li>



<li><strong>IAM</strong> → 「誰が何をできるかを決める警備システム」</li>
</ul>



<p><strong>開発・デプロイ系</strong></p>



<p><strong>Elastic Beanstalk</strong> → 「アプリを投げ込むだけで動かしてくれる箱」<br><br><br><strong>④Udemy「【ベストセラー完全日本語化】AWS 認定ソリューションアーキテクト アソシエイト SAA-C03 対応 2023 最新版」</strong>に関しては、ハンズオンは全然やっておりません。Ping-tを解いてもYoutubeを見ても書籍を読んでもイメージが抽象的な感じがする部分は重点的に視聴をするようにしました。</p>



<h3 id="rtoc-10"  class="wp-block-heading">STEP３:Ping-tをすべて解き終えたら、模擬試験問題を時間を測って解く！</h3>



<p>最後は模擬試験で占めるのがいいですよね(^^)<br><strong>②書籍「AWS認定ソリューションアーキテクトアソシエイトテキスト＆問題集」</strong>でダウンロードできる模試を試験３日前くらいに解き、やり直しをして終了です。特に２回目解いたりはしていません。</p>



<h2 id="rtoc-11"  class="wp-block-heading">まとめ</h2>



<p>AWS初心者から約1ヶ月でSAAに合格することができました。振り返ってみると、<strong>「短期集中で効率よく合格する」という明確な目標設定</strong>と、「分からなくてもOutPutしまくる学習スタイル」が功を奏したと思います。</p>



<p>特に重要だったのは以下の3点です。</p>



<p><strong>①戦略的な教材選択</strong><br>情報収集に時間をかけて、自分に合った教材を厳選したこと。Ping-tをメインに据えて、他の教材で知識を補完する形が効果的でした。</p>



<p><strong>②ChatGPTをフル活用</strong><br>分からない解説をそのままにせず、ChatGPTで理解できるまで深掘りしたこと。</p>



<p><strong>③飽きない工夫</strong><br>同じ教材ばかりでなく、疲れたら違う教材に切り替える、場所を変える、なぐり書きでアウトプットするなど、モチベーション維持を意識しました。</p>



<p><strong>これからSAAを受験される方へ</strong><br>AWS未経験でも、正しい戦略と継続的な学習があれば必ず合格できます。特に短期集中を目指す方は、「完璧を求めすぎず、合格点を取る」という割り切りも大切です。</p>



<p>この記事が、これからSAAに挑戦される方の参考になれば嬉しいです。頑張ってください！(^^)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oz006.com/aws-saa-study-method/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>プログラミング学習１年を経て、思うこと</title>
		<link>https://oz006.com/change-job-1year/</link>
					<comments>https://oz006.com/change-job-1year/#respond</comments>
		
		<dc:creator><![CDATA[oz]]></dc:creator>
		<pubDate>Sat, 24 May 2025 03:25:36 +0000</pubDate>
				<category><![CDATA[転職]]></category>
		<category><![CDATA[30台で転職]]></category>
		<category><![CDATA[IT転職]]></category>
		<category><![CDATA[エンジニア転職]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://oz006.com/?p=625</guid>

					<description><![CDATA[こんにちは(^^)今回の記事では、プログラミング学習を始めて１年が経ち、プログラミングスクール「ウェブカツ」を無事卒業することができたので、今の心境などを記事にしたいと思います。 Contents １年を経て思うこと コ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="1000" src="https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-24-09.13.30-An-inspiring-digital-illustration-representing-one-year-of-programming-learning.-The-scene-shows-a-young-person-sitting-at-a-desk-in-a-cozy-room-surr.webp" alt="" class="wp-image-626" srcset="https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-24-09.13.30-An-inspiring-digital-illustration-representing-one-year-of-programming-learning.-The-scene-shows-a-young-person-sitting-at-a-desk-in-a-cozy-room-surr.webp 1000w, https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-24-09.13.30-An-inspiring-digital-illustration-representing-one-year-of-programming-learning.-The-scene-shows-a-young-person-sitting-at-a-desk-in-a-cozy-room-surr-300x300.webp 300w, https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-24-09.13.30-An-inspiring-digital-illustration-representing-one-year-of-programming-learning.-The-scene-shows-a-young-person-sitting-at-a-desk-in-a-cozy-room-surr-150x150.webp 150w, https://oz006.com/wp-content/uploads/2025/05/DALL·E-2025-05-24-09.13.30-An-inspiring-digital-illustration-representing-one-year-of-programming-learning.-The-scene-shows-a-young-person-sitting-at-a-desk-in-a-cozy-room-surr-768x768.webp 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>こんにちは(^^)<br>今回の記事では、プログラミング学習を始めて１年が経ち、プログラミングスクール「ウェブカツ」を無事卒業することができたので、今の心境などを記事にしたいと思います。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="638" height="292" src="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-24-13.12.53.png" alt="" class="wp-image-639" srcset="https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-24-13.12.53.png 638w, https://oz006.com/wp-content/uploads/2025/05/スクリーンショット-2025-05-24-13.12.53-300x137.png 300w" sizes="auto, (max-width: 638px) 100vw, 638px" /></figure>



<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame2 preset6 animation-fade rtoc_open default" data-id="625" data-theme="Cocoon Child">
			<div id="rtoc-mokuji-title" class=" rtoc_left">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">１年を経て思うこと</a></li><li class="rtoc-item"><a href="#rtoc-2">コードを書くのは楽しいか？</a></li><li class="rtoc-item"><a href="#rtoc-3">１年を振り返っての反省点</a></li><li class="rtoc-item"><a href="#rtoc-4">プログラミングスクール「ウェブカツ」について</a></li><li class="rtoc-item"><a href="#rtoc-5">ウェブカツで１番学ぶべきこと</a></li><li class="rtoc-item"><a href="#rtoc-6">卒業試験について</a></li><li class="rtoc-item"><a href="#rtoc-7">今後に向けて</a></li></ol></div><h2 id="rtoc-1"  class="wp-block-heading">１年を経て思うこと</h2>



<p>まず、プログラミングを学習したことによって、普段の仕事や生活における「思考」が変わりました。<strong><span class="marker-under">「これはAIに聞いたらすぐに解決するな」から、「こういったものが作れたら、楽になるな」という思考が常に頭の中に出てくる</span></strong>ようになりました。いい意味で「楽をする」「効率化」するためには？を考える思考は、どこにいっても大切な思考法だと思うので、プログラミングを学習して良かったと思います。</p>



<h2 id="rtoc-2"  class="wp-block-heading">コードを書くのは楽しいか？</h2>



<p>楽しいか楽しくないか？と２択で聞かれると、現状は「楽しい」です(^^)<br>ただ、コードを書くこと自体に、楽しさはそれほど感じません。<br><br><strong><span class="marker-under">「なぜそうなるのか？」や「どんな仕組みで動いているのか？」を理解することの方が好き</span></strong>です。<br>そして、<strong><span class="marker-under-red">実際に周囲の役に立つものを作って、喜んでもらうことに快感</span></strong>を覚えます。</p>



<p>実は、現職の会社で２つのアプリを作成して、運用させてもらいました。<br>（さすがにポートフォリオにはできないですがほんとはしたい、、、笑）<br><br><strong>１つはシンプルに、塾生が与えられたパスワードでログインして、授業解説動画を閲覧できるウェブサイト</strong>を作成して運用しています。講師ごとのページがあり、自由に解説動画や解説PDFなどをアップロードをすることができる仕様で、講師側はGoogleアカウントでもログインできるようにしました。<br><br><strong>もう１つは生徒との面談予約システム</strong>です。事前に講師が面談可能日時をチェックしておき、その枠に対して、生徒が面談をウェブ上で申し込むというシステムです。<strong><span class="marker-under">今までアナログで電話や直接電話での面談予約だったため、かなり効率化されて、特に事務のお姉さんたちに、非常に喜ばれました</span></strong>&#x2728;&#xfe0f;<br>ただ、こういったものは導入して使ってもらえるまでの説明や、ITに関する考え方そのものに対して、いろいろな人がいるので、使うのに抵抗があるな〜と思っていそうな方に、事前に上手に歩み寄り、メリットなどを説明しながら、巻き込んでいくという作業の方が大変でした。<br>難しい言葉を使わずにITの良さを感じてもらう「営業」の練習にもなったかなと今となっては思っています(^^)</p>



<h2 id="rtoc-3"  class="wp-block-heading">１年を振り返っての反省点</h2>



<p>結構、考えたのですが特に思いつきませんでした笑。色々と遠回りもしたのかもしれませんが、遠回りって実は大切で、愚直に色々と行動し体験しないと深みは出ないと思っています（ポジティブすぎる？）<br><br>ただ、<strong>Xやブログ記事での発信はもっと数を多くするべき</strong>だなとは思いました。<br><br><span class="marker-under-blue"><strong>どれだけ頑張ったとしても、発信して認知されなければ意味がない</strong></span>ですよね。そのあたりは、反省点として捉え、今後、発信数やブログの記事投稿を増やしていこうと思っています。</p>



<h2 id="rtoc-4"  class="wp-block-heading">プログラミングスクール「ウェブカツ」について</h2>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="697" src="https://oz006.com/wp-content/uploads/2025/05/卒業証書.jpg" alt="" class="wp-image-628" srcset="https://oz006.com/wp-content/uploads/2025/05/卒業証書.jpg 1000w, https://oz006.com/wp-content/uploads/2025/05/卒業証書-300x209.jpg 300w, https://oz006.com/wp-content/uploads/2025/05/卒業証書-768x535.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>２０２５年５月２３日（金）に無事、卒業することができました&#x2728;&#xfe0f;<br>レギュラー部員だったため、１年以上かかりましたが、１年〜２年修行期間で頑張ると決めていた私にとっては、非常にありがたかったです。<strong><span class="marker-under">ウェブカツのおかげで、業界のことを、右も左も分からなかった状態から、ウェブの根本の部分から始まり、フレームワークの使い方まで幅広く学習することができ、１年前の自分と今日の自分とでは別人のように成長できた</span></strong>こと、大変感謝しております。</p>



<h2 id="rtoc-5"  class="wp-block-heading">ウェブカツで１番学ぶべきこと</h2>



<p>ウェブカツの１番の強みだと間違いなく言えるのは、<strong><span class="marker-under">「ビジネス視点」の考え方</span></strong>だと思います。プログラミングのスキルも学習できますが、これに関しては、UdemyやYoutube、書籍でも学習可能です。<br><br>でも<strong><span class="marker-under">「営業部」や「起業部」で学習する内容は、本当にその通りだなと共感できる</span></strong>ところであり、プログラミングができるだけのエンジニアになるのではなく、「稼げるエンジニア」とはどういったエンジニアなのかを具体的に教えてくれるスクールはここだけではないでしょうか？</p>



<p>私は経営側のポジションでもあるため、売上・数値、こういったものばかりをこの数年間、扱ってきたのですが、お金の話って、職員に話すと嫌がられたりします。私はそれが不思議とまでは言わないですが、「商売なので、お金の話をして何が悪い。綺麗事では何も守れない。」と思っていました。そんなときに、ウェブカツのかずきち顧問のメッセージを読んで、ウェブカツを受講し、卒業した今となっては、<strong><span class="marker-under">「心の中のモヤモヤ」が晴れた感じ</span></strong>がしています。引き続き、周囲の役に立ち、売上に貢献し、尽力できる人財を目指して、精進していこうと思いました。</p>



<p>なので、これから、ウェブカツを受講しようと悩んでいる方が、もしこのブログ記事を読んでくださっているのであれば、伝えたいのは、<strong><span class="marker-under">ウェブカツは、「技術も当然学習できるスクールですが、どんな業種でも役に立つ考え方や、綺麗事</span><span class="marker-under">だけ</span><span class="marker-under">ではない本質が学べるスクールだよ」</span></strong>ということですね。</p>



<p>実際に、ウェブカツの後半に突入したくらいからは、ドキュメントを調べて、パパっと実装に取り組めるようになったり、エラーに対して何の抵抗もなくなったり、多分こんな感じで実装できるだろうな〜というイメージがすぐに沸き、AIとの会話のキャッチボールも、より具体的でスムーズにできるようになったと感じています。つい２日前ほどから、Next.jsを学習しながら、自己紹介HPを作っていますが、何の抵抗もなく、サクサク作りたいものに合わせて、調べ、実装していくという流れを身につけることができたと思います。ほんと、感謝です。</p>



<h2 id="rtoc-6"  class="wp-block-heading">卒業試験について</h2>



<p>卒業試験は、４月１１日に受験を開始して、１回目の納品が５月７日。レビュー後、２回目の納品が、５月１９日という流れで卒業することができたため、約１ヶ月ちょっとでの卒業となりました。<br><br>卒業試験のおかげで、始めてレビューというものを受けましたが、やっぱり<strong><span class="marker-under">誰かにレビューしてもらうことの大切さを実感</span></strong>しましたね。自分では気付けないことや、思いもしなかったことの指摘、また、改善策のアドバイスなどがいただけるということが、どれほど成長につながるかという体験をさせていただきました。<br>今後、つよつよのエンジニアの方と出会い、一緒に働き、レビューをいただきながら、どんどん成長していきたいなと感じることができましたし、卒業試験では、顧客のことを想像しながら、あったら嬉しいだろうな〜という機能の実装や、こっちのほうが使いやすい・一目で分かりやすいだろうな〜という観点で実装することができたので、この経験が非常に大きいなと感じております。<br><br>これから試験を受けることを考えておられる方にアドバイスをするとしたら、他の先輩方も書いてくださっていますが、<strong><span class="marker-under">実際に本番環境の「デプロイ」まで</span></strong>、きちんとEC2やレンタルサーバーなどで行っておくことが大切だと思います。私は、卒業試験前にAWSのSAAの資格を取得できたので、EC2へのデプロイなどはあまり抵抗なくスムーズにできました。GitHubAcitonsによって、CI/CDも構築できたので、開発を比較的スムーズに行うことができたと感じています。この経験がないまま、卒業試験に挑むともっと時間がかかったんだろうなと感じています。やっぱり環境構築が１番挫折しやすいと思うので、嫌いなこと、効率化できそうなことは、前始末が大切だと思います。</p>



<h2 id="rtoc-7"  class="wp-block-heading">今後に向けて</h2>



<p>技術面で言えば、React、Next.js，Laravel、AWSの深堀りをして学習していきたいです。<br>今、興味があるのは「りあクト」と呼ばれる書籍、Laravel12を本格的に触る、AWS Skill Builderを使って、実際にAWSをもっと色々と使ってみると言ったところですかね。購入したいUdemyもたくさんありますが、欲張り過ぎはよくないので、ちょっと我慢、、、笑。<br><br>ちょっと我慢しつつ、ここからはひとまず、<strong><span class="marker-under">転職活動、本格スタート</span></strong>ですね&#x1f525;<br>人生で始めての転職活動、不安でいっぱいですが、死ぬまでに「新しいことに挑戦してみたい！」と自分で決めてから、ここまで、ほぼ毎日努力を積み重ねてきた自分を信じて頑張っていけたらと思っていますし、素敵なご縁、出会いがあればいいなとワクワクもしております。<br><br>現在は、自己紹介HPを作成中ですが、来週中には完成させて６月頭より、本格的に動いていこうと思っています&#x1f525;</p>



<p>住まいは、生まれてからずっと大阪ではありますが、関西だけで探すのではなく、家族ぐるみで関東へ進出することも考えております。<br><br>エンジニア転職を必ず成功させ、良い報告ができるように頑張りますね。<br><br>ここまで読んでいただき、ありがとうございました！！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oz006.com/change-job-1year/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Quizopiaコード説明~ポケモンなきごえクイズ編~</title>
		<link>https://oz006.com/portfolio-quizopia-code-explain/</link>
					<comments>https://oz006.com/portfolio-quizopia-code-explain/#respond</comments>
		
		<dc:creator><![CDATA[oz]]></dc:creator>
		<pubDate>Sun, 06 Apr 2025 16:54:53 +0000</pubDate>
				<category><![CDATA[転職]]></category>
		<guid isPermaLink="false">https://oz006.com/?p=588</guid>

					<description><![CDATA[この記事では、ポートフォリオ「Quizopia」のコードの一部を説明しています。 Contents PokemonCryQuizController.php の一部紹介 フロントエンド部分の説明（RandomPokemo [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="1000" src="https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac.webp" alt="" class="wp-image-604" srcset="https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac.webp 1000w, https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac-300x300.webp 300w, https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac-150x150.webp 150w, https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac-768x768.webp 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>この記事では、ポートフォリオ「Quizopia」のコードの一部を説明しています。</p>



<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame2 preset6 animation-fade rtoc_open default" data-id="588" data-theme="Cocoon Child">
			<div id="rtoc-mokuji-title" class=" rtoc_left">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">PokemonCryQuizController.php の一部紹介</a></li><li class="rtoc-item"><a href="#rtoc-2">フロントエンド部分の説明（RandomPokemonCry.tsx）</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-3">1. コンポーネント構造と状態管理</a></li><li class="rtoc-item"><a href="#rtoc-4">2. 音声再生機能</a></li><li class="rtoc-item"><a href="#rtoc-5">3. クイズゲームのロジック</a></li><li class="rtoc-item"><a href="#rtoc-6">4. ゲーム進行管理</a></li><li class="rtoc-item"><a href="#rtoc-7">5. 副作用とイニシャライズ</a></li><li class="rtoc-item"><a href="#rtoc-8">6. UI部分</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-9">まとめ. フロントエンド・バックエンド連携フロー</a></li></ol></div><h2 id="rtoc-1"  class="wp-block-heading">PokemonCryQuizController.php の一部紹介</h2>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code> // 問題セットを生成するプライベートメソッド
    private function generateQuestionSet()
    {
        $questions = [];
        $usedPokemonIds = [];

        // 5問の問題を生成
        for ($i = 0; $i &lt; 5; $i++) {
            do {
                $randomPokemonId = rand(1, 251);
            } while (in_array($randomPokemonId, $usedPokemonIds));

            $usedPokemonIds[] = $randomPokemonId;
            $options = $this-&gt;generateOptions($randomPokemonId);

            $questions[] = [
                &#39;pokemonId&#39; =&gt; $randomPokemonId,
                &#39;options&#39; =&gt; $options,
            ];
        }

        return $questions;
    }

    // 選択肢を生成するプライベートメソッド
    private function generateOptions($correctId)
    {
        $options = [$correctId];
        
        // 正解以外の3つの選択肢を生成
        while (count($options) &lt; 4) {
            $randomId = rand(1, 251);
            if (!in_array($randomId, $options)) {
                $options[] = $randomId;
            }
        }
        
        // 選択肢をシャッフル
        shuffle($options);
        
        return $options;
    }</code></pre></div>



<h4 class="wp-block-heading">1. <code>generateQuestionSet()</code> 関数</h4>



<ul class="wp-block-list">
<li>5つのランダムなポケモン問題を生成</li>



<li>各問題について重複しないポケモンIDを選択（1-251の範囲）</li>



<li>各問題に4つの選択肢を設定</li>
</ul>



<h4 class="wp-block-heading">2. <code>generateOptions($correctId)</code> 関数</h4>



<ul class="wp-block-list">
<li>正解のポケモンID (<code>$correctId</code>) と、他3つのランダムなポケモンIDを選択肢として生成</li>



<li>選択肢をシャッフルして返す</li>
</ul>



<h5 class="wp-block-heading">コード実行途中のイメージ例</h5>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>// generateQuestionSet内の処理
$randomPokemonId = 25; // 例: ピカチュウのIDが選ばれたとします
$usedPokemonIds = [25]; // 使用済みIDリストに追加

// generateOptions(25)の呼び出し
$options = [25]; // 最初に正解のIDを追加
// 3つのランダムなIDを追加（重複しないように）
$options = [25, 4, 129, 150]; // 例: フシギソウ、コイキング、ミュウツーが追加されたとする
// シャッフル後 
$options = [129, 25, 150, 4]; // シャッフル後はこのような順序になる可能性がある

// generateQuestionSetに戻り、問題を追加
$questions = [
    [
        &#39;pokemonId&#39; =&gt; 25, // ピカチュウのID
        &#39;options&#39; =&gt; [129, 25, 150, 4] // シャッフルされた選択肢
    ]
];</code></pre></div>



<p>5回分のループが完了した後（最終状態）</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$usedPokemonIds = [25, 149, 6, 151, 39]; // 選ばれた5匹のポケモンID

$questions = [
    [
        &#39;pokemonId&#39; =&gt; 25, // ピカチュウ
        &#39;options&#39; =&gt; [129, 25, 150, 4] // コイキング, ピカチュウ, ミュウツー, フシギソウ
    ],
    [
        &#39;pokemonId&#39; =&gt; 149, // カイリュー
        &#39;options&#39; =&gt; [149, 36, 78, 94] // カイリュー, ピクシー, ギャロップ, ゲンガー
    ],
    [
        &#39;pokemonId&#39; =&gt; 6, // リザードン
        &#39;options&#39; =&gt; [123, 6, 45, 249] // ストライク, リザードン, ラフレシア, ルギア
    ],
    [
        &#39;pokemonId&#39; =&gt; 151, // ミュウ
        &#39;options&#39; =&gt; [74, 151, 114, 130] // イシツブテ, ミュウ, モンジャラ, ギャラドス
    ],
    [
        &#39;pokemonId&#39; =&gt; 39, // プリン
        &#39;options&#39; =&gt; [39, 145, 88, 201] // プリン, サンダース, ベトベトン, アンノーン
    ]
];</code></pre></div>



<h4 class="wp-block-heading">3. playRandom 関数 &#8211; クイズを開始する処理</h4>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>public function playRandom()
{
    // 新しい問題セットを生成
    $questions = $this-&gt;generateQuestionSet();
    Session::put(&#39;quiz_questions&#39;, $questions);
    Session::put(&#39;current_question_index&#39;, 0);
    Session::put(&#39;score&#39;, 0);

    // 現在の問題を取得
    $currentIndex = Session::get(&#39;current_question_index&#39;);
    $questions = Session::get(&#39;quiz_questions&#39;);
    $currentQuestion = $questions[$currentIndex];

    return Inertia::render(&#39;Play/RandomPokemonCry&#39;, [
        &#39;pokemonId&#39; =&gt; $currentQuestion[&#39;pokemonId&#39;],
        &#39;options&#39; =&gt; $currentQuestion[&#39;options&#39;],
        &#39;questionCount&#39; =&gt; $currentIndex + 1,
        &#39;score&#39; =&gt; Session::get(&#39;score&#39;),
    ]);
}</code></pre></div>



<p>この関数はクイズの開始時に実行され、ランダムな問題を生成してクイズの最初の画面を表示します。</p>



<p><strong>具体的な処理の流れ</strong></p>



<ol class="wp-block-list">
<li><code>generateQuestionSet()</code>を呼び出して5問のランダムな問題を作成</li>



<li>問題セット、現在の問題インデックス（0）、スコア（0）をセッションに保存</li>



<li>最初の問題（インデックス0）の情報を取得</li>



<li>Inertia.jsを使ってフロントエンド画面を表示するためのデータを渡す</li>
</ol>



<p>以下は具体的なイメージです。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>// 生成された$questions配列の例（セッションに保存される）
$questions = [
    [
        &#39;pokemonId&#39; =&gt; 25, // ピカチュウ
        &#39;options&#39; =&gt; [129, 25, 150, 4] // コイキング, ピカチュウ, ミュウツー, フシギソウ
    ],
    // ... 以下4問分の問題データ
];

// フロントエンドに渡されるデータのイメージ
[
    &#39;pokemonId&#39; =&gt; 25, // この音声が再生される
    &#39;options&#39; =&gt; [129, 25, 150, 4], // 選択肢として表示される
    &#39;questionCount&#39; =&gt; 1, // 「1/5問目」と表示
    &#39;score&#39; =&gt; 0 // 現在のスコア
]</code></pre></div>



<h4 class="wp-block-heading">4. nextQuestion 関数 &#8211; 次の問題へ進む処理</h4>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>public function nextQuestion()
{
    $currentIndex = Session::get(&#39;current_question_index&#39;,0);
    $questions = Session::get(&#39;quiz_questions&#39;, []);
    $currentIndex++;

    if ($currentIndex &gt;= 5) {
        // クイズ終了
        Session::forget([&#39;quiz_questions&#39;, &#39;current_question_index&#39;]);
        return redirect()-&gt;route(&#39;play.random-pokemon-cry&#39;);
    }

    Session::put(&#39;current_question_index&#39;, $currentIndex);

    return Inertia::render(&#39;Play/RandomPokemonCry&#39;, [
            &#39;pokemonId&#39; =&gt; $currentQuestion[&#39;pokemonId&#39;],
            &#39;options&#39; =&gt; $currentQuestion[&#39;options&#39;],
            &#39;questionCount&#39; =&gt; $currentIndex + 1,
            &#39;score&#39; =&gt; Session::get(&#39;score&#39;, 0),
        ]);
}</code></pre></div>



<p>ユーザーが「次へ」ボタンを押した時に実行され、次の問題に進めるか、クイズを終了するかを制御します。</p>



<p><strong>具体的な処理の流れ：</strong></p>



<ol class="wp-block-list">
<li>現在の問題インデックスを取得して1増やす</li>



<li>もし問題が5問すべて終わったら（インデックスが5以上）：
<ul class="wp-block-list">
<li>セッションから問題関連のデータを削除</li>



<li>クイズ開始画面にリダイレクト（新しいクイズがスタート）</li>
</ul>
</li>



<li>まだ問題が残っている場合：
<ul class="wp-block-list">
<li>新しいインデックスをセッションに保存</li>



<li>同じ画面にリダイレクト（次の問題が表示される）</li>
</ul>
</li>
</ol>



<p>以下は具体的なイメージです。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>/ セッションの状態変化
// 例：2問目が終わって3問目に進む場合
// 変更前
Session::get(&#39;current_question_index&#39;) = 1; // 2問目（0からカウント）
// 変更後
Session::put(&#39;current_question_index&#39;, 2); // 3問目に更新

// 例：最後の問題（5問目）が終わった場合
// 変更前
Session::get(&#39;current_question_index&#39;) = 4; // 5問目
// 変更後
// 新しいクイズを開始</code></pre></div>



<h4 class="wp-block-heading">5. updateScore 関数 &#8211; スコアを更新する処理</h4>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>public function updateScore()
{
    $currentScore = Session::get(&#39;score&#39;, 0);
    Session::put(&#39;score&#39;, $currentScore + 1);
    return response()-&gt;json([&#39;success&#39; =&gt; true]);
}</code></pre></div>



<p>ユーザーが正解を選んだときに呼び出され、スコアを1点増やします。</p>



<p><strong>具体的な処理の流れ：</strong></p>



<ol class="wp-block-list">
<li>現在のスコアをセッションから取得</li>



<li>スコアに1を加えて更新</li>



<li>成功したことを示すJSONレスポンスを返す（Ajaxリクエスト用）</li>
</ol>



<p>以下は具体的なイメージです。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>// 例：現在のスコアが2点で正解した場合
// 変更前
Session::get(&#39;score&#39;) = 2;
// 変更後
Session::put(&#39;score&#39;, 3); // 3点に更新

// フロントエンドに返すレスポンス
{ &quot;success&quot;: true }</code></pre></div>



<h4 class="wp-block-heading">6. resetQuiz 関数 &#8211; クイズをリセットする処理</h4>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>public function resetQuiz()
{
    // セッションを完全にクリア
    Session::forget([&#39;quiz_questions&#39;, &#39;current_question_index&#39;, &#39;score&#39;]);

    return redirect()-&gt;route(&#39;play.random-pokemon-cry&#39;);  
}</code></pre></div>



<p>クイズを中断して最初からやり直したい場合などに、クイズデータをリセットします。</p>



<p><strong>具体的な処理の流れ：</strong></p>



<ol class="wp-block-list">
<li>クイズ関連のセッションデータをすべて削除</li>



<li>成功したことを示すJSONレスポンスを返す</li>
</ol>



<p>以下は具体的なイメージです。</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>// セッションから以下のデータが削除される
- &#39;quiz_questions&#39;（問題セット）
- &#39;current_question_index&#39;（現在の問題インデックス）
- &#39;score&#39;（現在のスコア）

// フロントエンドに返すレスポンス
{ &quot;success&quot;: true }</code></pre></div>



<h2 id="rtoc-2"  class="wp-block-heading">フロントエンド部分の説明（RandomPokemonCry.tsx）</h2>



<h3 id="rtoc-3"  class="wp-block-heading">1. コンポーネント構造と状態管理</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>RandomPokemonCry = ({
    pokemonId,
    options,
    questionCount,
    score: initialScore,
}: {
    pokemonId: number;
    options: number[];
    questionCount: number;
    score: number;
}) =&gt; {
    // State管理
    const [pokemons] = useState&lt;Pokemon[]&gt;(pokemonData);
    const [currentQuiz, setCurrentQuiz] = useState&lt;CurrentQuiz | null&gt;(null);
    const [selectedAnswer, setSelectedAnswer] = useState&lt;Pokemon | null&gt;(null);
    const [showResult, setShowResult] = useState&lt;boolean&gt;(false);
    const [isLoading, setIsLoading] = useState&lt;boolean&gt;(false);
    const [isQuizFinished, setIsQuizFinished] = useState&lt;boolean&gt;(false);
    const [score, setScore] = useState&lt;number&gt;(initialScore);
    const TOTAL_QUESTIONS = 5;</code></pre></div>



<p>このコンポーネントはサーバーから受け取った情報（pokemonId, options, questionCount, score）によって、ポケモンのなき声クイズを表示します。具体的には、以下の状態を管理しています。</p>



<ul class="wp-block-list">
<li>pokemons: 全ポケモンデータの配列（JSONファイルからインポート）</li>



<li>currentQuiz: 現在の問題データ（選択肢と正解）</li>



<li>selectedAnswer: ユーザーが選んだ回答</li>



<li>showResult: 回答結果を表示するかどうか</li>



<li>isLoading: 音声ロード中かどうか</li>



<li>isQuizFinished: クイズが終了したかどうか</li>



<li>score: 現在のスコア</li>
</ul>



<h3 id="rtoc-4"  class="wp-block-heading">2. 音声再生機能</h3>



<div class="hcb_wrap"><pre class="prism off-numbers lang-ts" data-lang="TypeScript"><code>// オーディオ参照
const audioRef = useRef&lt;HTMLAudioElement | null&gt;(null);

// 音声再生関数
const playSound = async () =&gt; {
    if (isLoading) return;

    try {
        setIsLoading(true);

        // 音声ファイルのパスを設定（M4A形式を使用）
        const paddedId = pokemonId.toString().padStart(3, &quot;0&quot;);
        const audioPath = `/audio/pokemon_cries/${paddedId}.m4a`;

        // 既存のオーディオ要素をクリーンアップ
        if (audioRef.current) {
            audioRef.current.pause();
            audioRef.current.removeAttribute(&quot;src&quot;);
            audioRef.current.load();
        }

        // HTML5 Audio要素を使用
        if (!audioRef.current) {
            audioRef.current = new Audio();
        }
        
        // ...イベントリスナー設定、再生処理など
    } catch (error) {
        // エラーハンドリング
    }
};</code></pre></div>



<p>この部分はポケモンの鳴き声を再生するための機能です。</p>



<ul class="wp-block-list">
<li>audioRef: HTML Audio要素への参照</li>



<li>playSound関数: 選択されたポケモンIDに基づいて音声ファイルをロードして再生</li>



<li>エラーハンドリング: 特にiOSデバイスでの再生問題に対応する詳細な処理</li>
</ul>



<h3 id="rtoc-5"  class="wp-block-heading">3. クイズゲームのロジック</h3>



<div class="hcb_wrap"><pre class="prism off-numbers lang-ts" data-lang="TypeScript"><code>// 回答チェック関数
const checkAnswer = async (pokemon: Pokemon) =&gt; {
    try {
        setSelectedAnswer(pokemon);
        setShowResult(true);

        if (pokemon.pokeapi_id === currentQuiz?.correct.pokeapi_id) {
            // 正解の場合、スコアを更新
            const response = await axios.post(route(&quot;play.update-score&quot;));
            setScore(response.data.score || score + 1);
        }
    } catch (error) {
        console.error(&quot;回答処理エラー:&quot;, error);
        alert(&quot;エラーが発生しました。もう一度お試しください。&quot;);
    }
};

// クイズ生成関数
const generateQuiz = () =&gt; {
    if (isQuizFinished) return;

    // 問題数が上限に達した場合は結果画面を表示
    if (questionCount &gt; TOTAL_QUESTIONS) {
        setIsQuizFinished(true);
        return;
    }

    const selectedPokemons = options
        .map((id) =&gt; pokemons.find((p) =&gt; p.pokeapi_id === id))
        .filter((p): p is Pokemon =&gt; p !== undefined);

    const correctAnswer = selectedPokemons.find(
        (p) =&gt; p.pokeapi_id === pokemonId
    );

    if (correctAnswer) {
        setCurrentQuiz({
            choices: selectedPokemons,
            correct: correctAnswer,
        });
        setSelectedAnswer(null);
        setShowResult(false);
    }
};</code></pre></div>



<p>上記の関数がクイズゲームの中核ロジックを実装しています。</p>



<ul class="wp-block-list">
<li>checkAnswer: ユーザーが選んだ回答が正解かどうかをチェックし、正解ならplay.update-scoreエンドポイントを呼び出してスコアを更新</li>



<li>generateQuiz: サーバーから受け取った選択肢IDを実際のポケモンオブジェクトに変換し、クイズ問題を構築</li>
</ul>



<h3 id="rtoc-6"  class="wp-block-heading">4. ゲーム進行管理</h3>



<div class="hcb_wrap"><pre class="prism off-numbers lang-ts" data-lang="TypeScript"><code>// 次の問題へ進む関数
const handleNextQuestion = () =&gt; {
    if (questionCount &gt;= TOTAL_QUESTIONS) {
        setIsQuizFinished(true);
    } else {
        router.get(route(&quot;play.next-question&quot;));
    }
};

// クイズをリセットする関数
const resetQuiz = () =&gt; {
    setIsLoading(true); // ボタンを無効化してユーザー操作を防ぐ
    router.get(route(&quot;play.reset-pokemon-cry&quot;));
};</code></pre></div>



<p>上記の関数は、ゲームの進行を管理します。</p>



<ul class="wp-block-list">
<li>handleNextQuestion: 現在の問題が最後なら結果画面に移動、そうでなければサーバーに次の問題をリクエスト</li>



<li>resetQuiz: クイズをリセットしてサーバーから新しい問題セットを取得</li>
</ul>



<h3 id="rtoc-7"  class="wp-block-heading">5. 副作用とイニシャライズ</h3>



<div class="hcb_wrap"><pre class="prism off-numbers lang-ts" data-lang="TypeScript"><code>// 初回マウント時にクイズを生成
useEffect(() =&gt; {
    // 問題数が上限に達した場合は結果画面を表示
    if (questionCount &gt; TOTAL_QUESTIONS) {
        setIsQuizFinished(true);
    } else {
        generateQuiz();
    }

    // モバイルデバイスの場合、オーディオ初期化のためのダミー要素を作成
    if (isMobile) {
        // オーディオ要素の初期化と各種イベントリスナーの設定
    }

    return () =&gt; {
        // クリーンアップ処理
    };
}, [pokemonId, options, questionCount]);</code></pre></div>



<p>このuseEffect部分は、</p>



<ul class="wp-block-list">
<li>コンポーネントのマウント時にクイズを初期化</li>



<li>問題数が上限を超えている場合は結果画面を表示</li>



<li>モバイルデバイス（特にiOS）向けの音声再生初期化処理</li>



<li>コンポーネントのアンマウント時のクリーンアップ</li>
</ul>



<h3 id="rtoc-8"  class="wp-block-heading">6. UI部分</h3>



<div class="hcb_wrap"><pre class="prism off-numbers lang-ts" data-lang="TypeScript"><code>return (
    &lt;PlayMainLayout&gt;
        &lt;div className=&quot;container mx-auto px-4 py-8&quot;&gt;
            {/* 非表示のオーディオ要素 */}
            &lt;audio
                ref={audioRef}
                style={{ display: &quot;none&quot; }}
                preload=&quot;none&quot;
                playsInline
            /&gt;

            &lt;Card className=&quot;w-full max-w-2xl mx-auto&quot;&gt;
                &lt;CardHeader&gt;
                    &lt;CardTitle className=&quot;text-center text-2xl&quot;&gt;
                        ポケモン なきごえ クイズ
                    &lt;/CardTitle&gt;
                    &lt;div className=&quot;text-center text-lg&quot;&gt;
                        {!isQuizFinished && (
                            &lt;div&gt;
                                もんだい {questionCount}/{TOTAL_QUESTIONS}
                            &lt;/div&gt;
                        )}
                        &lt;div&gt;スコア: {score}&lt;/div&gt;
                    &lt;/div&gt;
                &lt;/CardHeader&gt;

                &lt;CardContent&gt;
                    {!isQuizFinished ? (
                        &lt;&gt;
                            {/* なきごえを聞くボタン */}
                            &lt;div className=&quot;flex justify-center mb-8&quot;&gt;
                                &lt;Button onClick={handlePlayButtonClick} /* ... */}&gt;
                                    &lt;Volume2 className=&quot;w-6 h-6&quot; /&gt;
                                    {isLoading
                                        ? &quot;よみこみちゅう...&quot;
                                        : &quot;なきごえを きく&quot;}
                                &lt;/Button&gt;
                            &lt;/div&gt;

                            {/* 選択肢ボタン */}
                            &lt;div className=&quot;grid grid-cols-2 gap-4&quot;&gt;
                                {currentQuiz?.choices.map((pokemon) =&gt; (
                                    &lt;Button
                                        key={pokemon.pokeapi_id}
                                        onClick={() =&gt; checkAnswer(pokemon)}
                                        disabled={showResult}
                                        variant={/* 条件付きスタイル */}
                                    &gt;
                                        {pokemon.pokeapi_species_name_ja}
                                    &lt;/Button&gt;
                                ))}
                            &lt;/div&gt;

                            {/* 結果表示と次の問題ボタン */}
                            {showResult && (
                                &lt;div className=&quot;mt-8 text-center&quot;&gt;
                                    &lt;p className=&quot;text-xl mb-4&quot;&gt;
                                        {selectedAnswer?.pokeapi_id ===
                                        currentQuiz?.correct.pokeapi_id
                                            ? &quot;せいかい！ &#x1f389;&quot;
                                            : `ざんねん... せいかいは「${currentQuiz?.correct.pokeapi_species_name_ja}」でした`}
                                    &lt;/p&gt;
                                    &lt;Button
                                        onClick={handleNextQuestion}
                                        className=&quot;text-lg&quot;
                                    &gt;
                                        {questionCount === TOTAL_QUESTIONS
                                            ? &quot;けっかを みる&quot;
                                            : &quot;つぎの もんだい&quot;}
                                    &lt;/Button&gt;
                                &lt;/div&gt;
                            )}
                        &lt;/&gt;
                    ) : (
                        // クイズ終了時の結果表示
                        &lt;div className=&quot;text-center&quot;&gt;
                            &lt;h2 className=&quot;text-2xl mb-4&quot;&gt;
                                クイズ しゅうりょう！
                            &lt;/h2&gt;
                            &lt;p className=&quot;text-xl mb-4&quot;&gt;
                                {TOTAL_QUESTIONS}もんちゅう {score}もん せいかい！
                            &lt;/p&gt;
                            &lt;Button onClick={resetQuiz} className=&quot;text-lg&quot;&gt;
                                もういちど ちょうせん する
                            &lt;/Button&gt;
                        &lt;/div&gt;
                    )}
                &lt;/CardContent&gt;
            &lt;/Card&gt;
        &lt;/div&gt;
    &lt;/PlayMainLayout&gt;
);</code></pre></div>



<p>UIはクイズの状態に応じて異なる内容を表示しています。</p>



<h5 class="wp-block-heading">クイズ進行中</h5>



<ul class="wp-block-list">
<li>問題番号とスコア表示</li>



<li>「なきごえを きく」ボタン</li>



<li>4つの選択肢ボタン</li>



<li>回答後の結果表示と次の問題へ進むボタン</li>
</ul>



<h5 class="wp-block-heading">クイズ終了時</h5>



<ul class="wp-block-list">
<li>結果概要（全5問中何問正解したか）</li>



<li>「もういちど ちょうせん する」ボタン</li>
</ul>



<h2 id="rtoc-9"  class="wp-block-heading">まとめ. フロントエンド・バックエンド連携フロー</h2>



<h6 class="wp-block-heading">1.初期表示時</h6>



<ol class="wp-block-list"></ol>



<ul class="wp-block-list">
<li>サーバー側のplayRandomメソッドが5問分の問題データを生成</li>



<li>最初の問題データをフロントエンドに送信</li>



<li>フロントエンドのuseEffectでgenerateQuizを実行し、UIを構築</li>
</ul>



<h6 class="wp-block-heading">2.回答選択時</h6>



<ol class="wp-block-list"></ol>



<ul class="wp-block-list">
<li>checkAnswer関数が実行され、選択されたポケモンが正解かチェック</li>



<li>正解の場合、axios.post(route(&#8220;play.update-score&#8221;))でサーバーにスコアを更新させる</li>



<li>結果表示と「つぎのもんだいへ」ボタンを表示</li>
</ul>



<h6 class="wp-block-heading">3.次の問題へ進む時</h6>



<ol class="wp-block-list"></ol>



<ul class="wp-block-list">
<li>handleNextQuestion関数が実行され、router.get(route(&#8220;play.next-question&#8221;))で次の問題をリクエスト</li>



<li>サーバー側のnextQuestionメソッドが問題インデックスを進め、次の問題データを返す</li>



<li>新しい問題データでページが再レンダリングされる</li>
</ul>



<h6 class="wp-block-heading">4.クイズ終了時</h6>



<ol class="wp-block-list"></ol>



<ul class="wp-block-list">
<li>最終問題の結果表示後、結果画面に切り替わる</li>



<li>「もういちどちょうせんする」ボタンが表示される</li>



<li>ボタンクリックでresetQuiz関数が実行され、router.get(route(&#8220;play.reset-pokemon-cry&#8221;))でクイズをリセット</li>



<li>サーバー側で新しい問題セットが生成され、最初からクイズが始まる</li>
</ul>



<p>このフロントエンドの実装はサーバーサイドのコントローラーと連携して、双方向の通信でクイズゲームの状態を管理しています。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://oz006.com/portfolio-quizopia-code-explain/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ポートフォリオ【Quizopia】紹介</title>
		<link>https://oz006.com/portfolio-quizopia/</link>
					<comments>https://oz006.com/portfolio-quizopia/#respond</comments>
		
		<dc:creator><![CDATA[oz]]></dc:creator>
		<pubDate>Sun, 06 Apr 2025 16:07:49 +0000</pubDate>
				<category><![CDATA[転職]]></category>
		<guid isPermaLink="false">https://oz006.com/?p=546</guid>

					<description><![CDATA[今回の記事では、作成したポートフォリオについて、まとめていきたいと思います。 下記が、今回、ご紹介するポートフォリオ「Quizopia」のサイトURLです。 https://quizopia.oz006.comquizo [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="1000" src="https://oz006.com/wp-content/uploads/2025/04/5f89bbe5-4e3f-45f1-b341-8a2794c0a0d6.webp" alt="" class="wp-image-580" srcset="https://oz006.com/wp-content/uploads/2025/04/5f89bbe5-4e3f-45f1-b341-8a2794c0a0d6.webp 1000w, https://oz006.com/wp-content/uploads/2025/04/5f89bbe5-4e3f-45f1-b341-8a2794c0a0d6-300x300.webp 300w, https://oz006.com/wp-content/uploads/2025/04/5f89bbe5-4e3f-45f1-b341-8a2794c0a0d6-150x150.webp 150w, https://oz006.com/wp-content/uploads/2025/04/5f89bbe5-4e3f-45f1-b341-8a2794c0a0d6-768x768.webp 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>今回の記事では、作成したポートフォリオについて、まとめていきたいと思います。</p>



<p>下記が、今回、ご紹介するポートフォリオ「Quizopia」のサイトURLです。</p>




<a rel="noopener" href="https://quizopia.oz006.com" title="https://quizopia.oz006.com" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fquizopia.oz006.com?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">https://quizopia.oz006.com</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://quizopia.oz006.com" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">quizopia.oz006.com</div></div></div></div></a>



<p></p>



<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame2 preset6 animation-fade rtoc_open default" data-id="546" data-theme="Cocoon Child">
			<div id="rtoc-mokuji-title" class=" rtoc_left">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">「Quizopia」作成の経緯</a></li><li class="rtoc-item"><a href="#rtoc-2">作成手順①：Udemy教材の活用</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-3">講義を進めるときに意識したポイント</a></li><li class="rtoc-item"><a href="#rtoc-4">Udemy教材終了時の実装内容</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-5">作成手順②：オリジナル機能を搭載する</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-6">トップ画面</a></li><li class="rtoc-item"><a href="#rtoc-7">プレイヤーログイン機能</a></li><li class="rtoc-item"><a href="#rtoc-8"><strong>プレイヤーレベルアップ機能</strong>（アバター・経験値・レベル表示）</a></li><li class="rtoc-item"><a href="#rtoc-9">プレイヤークイズ復習機能（プレイヤーのみ可能）</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-10">クイズ作成者機能紹介</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-11">クイズ作成者登録画面</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-12">ポケモンなきごえクイズ機能紹介</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-13">なきごえクイズで苦労した点</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-14">家族の感想と今後に向けて</a></li><li class="rtoc-item"><a href="#rtoc-15">補足：コード説明パート（時間があるときに更新）</a></li></ol></div><h2 id="rtoc-1"  class="wp-block-heading">「Quizopia」作成の経緯</h2>



<p><strong>プログラミングスクール「ウェブカツ」では、たくさん手を動かし、自ら考え、アウトプットしていくスタイルのスクール</strong>のため、毎月のように、何かを作りながら学習を進めていました。このアプリを作る段階では、入部後９ヶ月が経過しており、Laravel部まで終了していた状態でした。JS上級部でReactも学習済みだったため、<strong>LaravelとReactの２つを組み合わせたアウトプットを作りたい</strong>と考えていたところ、<span class="marker-under"><strong>小１の娘が最近、クイズにハマっており、普段から、「クイズ出して～、クイズ出して～」と頻繁に言う</strong></span>ので、クイズアプリを作って喜ばせてあげようと思ったのがきっかけです。</p>



<h4 class="wp-block-heading">TypeScriptもせっかくなので学習しておこう♫</h4>



<p>せっかくなので、<strong><span class="marker-under">未学習のTypeScriptについても触っておこうと思い</span></strong>、TypeScriptの使用も決めました。使用した感想は、<strong><span class="marker-under">型定義は最初は手間を感じましたが、コードが増えるにつれて、コードが読みやすくなり、その恩恵を実感</span></strong>することができ、すぐに慣れて使用することができました。<br></p>



<h2 id="rtoc-2"  class="wp-block-heading">作成手順①：Udemy教材の活用</h2>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="695" height="528" src="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-162621.jpg" alt="" class="wp-image-548" srcset="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-162621.jpg 695w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-162621-300x228.jpg 300w" sizes="auto, (max-width: 695px) 100vw, 695px" /></figure>



<p>まず、初めにUdemy教材<br>~<strong>【Laravel11】クイズアプリを作りながら自力でアプリ開発する力を身に着けよう【要件定義・設計～プログラミングまで</strong>~<br><br>を取り組み、アプリの骨組みを作成しました。この講座は、<strong><span class="marker-under">要件定義・設計の流れを丁寧に解説してくださっており、draw.ioの使い方やマインドマップの使い方、アプリでコードを書き始める前に、どのようなことを考え、準備しておくべきかの説明が具体的にされており、また説明も分かりやすく聞きやすいため、非常にお勧めの講座</span></strong>です。</p>




<a rel="noopener" href="https://www.udemy.com/course/laravel_quiz_app/?srsltid=AfmBOortfObisxLus6P6d8Kk2Xg1R3fjYrV2zCarM7QzRAl6R8Mz-DoK" title="【Laravel11&amp;12対応】クイズアプリを作りながら自力でアプリ開発する力を身につけよう【要件定義・設計〜実装まで】" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://img-c.udemycdn.com/course/480x270/5968922_c796.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【Laravel11&12対応】クイズアプリを作りながら自力でアプリ開発する力を身につけよう【要件定義・設計〜実装まで】</div><div class="blogcard-snippet external-blogcard-snippet">Laravel11 or Laravel12 を用いたクイズアプリ開発を通してプログラミングを学ぶだけではなく、要件定義から基本設計・詳細設計を行い、それを元にプログラミングをするという実践的なアプリケーション開発の流れを体験して、自分で作...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.udemy.com/course/laravel_quiz_app/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.udemy.com</div></div></div></div></a>



<h3 id="rtoc-3"  class="wp-block-heading">講義を進めるときに意識したポイント</h3>



<p>Udemyの講義を<strong>そのまま模写して真似しているだけでは、頭をあまり使わない</strong>ため、<br><br><strong>バックエンドでは、Laravel11を使用して、<br>フロントエンドでは、Reactを使って、</strong><br><br>講義を進めていきました。<br>その際、Inertia.jsを使用することになるため、Inertia.jsのドキュメントも読みつつ、開発を進めるにつれて、英語のドキュメントに対しての抵抗感も薄れていきました。</p>



<h3 id="rtoc-4"  class="wp-block-heading">Udemy教材終了時の実装内容</h3>



<p>こちらの講義を終了した時点で実装が完了したのが、以下の機能です。</p>



<ul class="wp-block-list">
<li><strong>管理者として登録・ログインすると、４択クイズの問題の作成者になれる</strong><br>→ただし、ログイン認証において、メール認証機能などはない状態（Laravelのデフォルト状態）<br></li>



<li><strong>クイズはカテゴリーを作成し、各カテゴリーに関するクイズを登録することで、クイズの解答者（未ログイン者でもOK）は、クイズを解くことができる</strong><br></li>



<li><strong>UIには、TAILBLOCKSを使用</strong><br></li>
</ul>



<h2 id="rtoc-5"  class="wp-block-heading">作成手順②：オリジナル機能を搭載する</h2>



<p>娘と話し合い、どんな機能がほしいかを聞いたところ、<strong>１番最初に言われたのが、「ポケモンなき声クイズ」がほしい！とのことでした。</strong>聞いたときには、「PokeAPIうまく使えば、できそうだな」という感じでした。他にも、話を聞いて、一緒に情報を整理していくと以下の機能を追加実装することに決めました。</p>



<ul class="wp-block-list">
<li><strong>プレイヤーログイン機能</strong>（プレイヤー名・パスワードのみ登録）</li>



<li><strong>プレイヤーレベルアップ機能</strong>（アバター・経験値・レベル表示）</li>



<li><strong>プレイヤークイズ復習機能</strong>（プレイヤーのみ可能）</li>



<li><strong>プレイヤーランキング機能</strong></li>



<li><strong>ポケモンランダムなき声クイズ機能</strong></li>



<li><strong>クイズ作成者の登録・ログイン方法にGoogle認証機能</strong></li>



<li><strong>クイズ作成者の登録でのEmail認証機能</strong></li>
</ul>



<p>そして、UI部分は、TAILBLOCKSでは、ありきたりな見栄えになってしまうので、使用したことがないUIコンポーネントを使ってみようと思い、<strong>shadcn/uiを使う</strong>ことを決めました。</p>



<h4 class="wp-block-heading"><strong>shadcn/</strong>uiを使用しての感想</h4>



<p>コンポーネントを完全にプロジェクトにインストールして使用することができるため、アレンジがしやすく、また、直感的で使いやすく、オシャレなUIがすぐに作成できるため、とても気に入っています。ドキュメントも分かりやすかったです。ただ、<strong>日本語訳されたドキュメントは情報が古かったため、うまくインストールされないこともあったりと、調べ方の良い経験</strong>にもなりました。</p>



<h3 id="rtoc-6"  class="wp-block-heading">トップ画面</h3>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1000" height="566" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.29.30.png" alt="" class="wp-image-572" style="width:814px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.29.30.png 1000w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.29.30-300x170.png 300w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.29.30-768x435.png 768w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.29.30-120x68.png 120w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.29.30-160x90.png 160w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.29.30-320x180.png 320w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1000" height="467" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.27.28.png" alt="" class="wp-image-571" style="width:784px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.27.28.png 1000w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.27.28-300x140.png 300w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.27.28-768x359.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<h3 id="rtoc-7"  class="wp-block-heading">プレイヤーログイン機能</h3>



<p>プレイヤーとして登録する場合は、娘が登録して使うため、<strong>プレイヤー名（重複は不可）とパスワードだけをDBに登録して簡易にログイン</strong>できるようにしました。<br>よって、まずサイトを訪れた際のヘッダー部分は、以下のようになります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="41" src="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-172827.png" alt="" class="wp-image-553" srcset="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-172827.png 1000w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-172827-300x12.png 300w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-172827-768x31.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>プレイヤー登録ボタンを押すと以下の画面に移動します。</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="968" height="1024" src="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173206-968x1024.png" alt="" class="wp-image-554" style="width:484px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173206-968x1024.png 968w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173206-284x300.png 284w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173206-768x812.png 768w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173206.png 1055w" sizes="auto, (max-width: 968px) 100vw, 968px" /></figure>
</div>



<p>プレイヤーログインボタンを押すと以下の画面に移動します。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="996" height="944" src="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173405.png" alt="" class="wp-image-555" style="width:483px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173405.png 996w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173405-300x284.png 300w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173405-768x728.png 768w" sizes="auto, (max-width: 996px) 100vw, 996px" /></figure>



<h3 id="rtoc-8"  class="wp-block-heading"><strong>プレイヤーレベルアップ機能</strong>（アバター・経験値・レベル表示）</h3>



<p>プレイヤーとして、ログインすると、ヘッダーが以下のように変わります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="64" src="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173557.png" alt="" class="wp-image-556" srcset="https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173557.png 1000w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173557-300x19.png 300w, https://oz006.com/wp-content/uploads/2025/03/スクリーンショット-2025-03-22-173557-768x49.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>以下のようにプレイヤー情報カードのようなものを作成しました。けいけんちは、クイズを１問解くと１追加されていき、１０ごとにレベルが上がっていく分かりやすいレベルアップ方式にしました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="453" height="165" src="https://oz006.com/wp-content/uploads/2025/03/image.png" alt="" class="wp-image-557" srcset="https://oz006.com/wp-content/uploads/2025/03/image.png 453w, https://oz006.com/wp-content/uploads/2025/03/image-300x109.png 300w" sizes="auto, (max-width: 453px) 100vw, 453px" /></figure>



<p>アバターの画像の部分をクリックすると、以下のような画面が表示され、画像の変更が可能です。</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="740" src="https://oz006.com/wp-content/uploads/2025/03/image-1-1024x740.png" alt="" class="wp-image-558" style="width:455px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/03/image-1-1024x740.png 1024w, https://oz006.com/wp-content/uploads/2025/03/image-1-300x217.png 300w, https://oz006.com/wp-content/uploads/2025/03/image-1-768x555.png 768w, https://oz006.com/wp-content/uploads/2025/03/image-1.png 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 id="rtoc-9"  class="wp-block-heading">プレイヤークイズ復習機能（プレイヤーのみ可能）</h3>



<p><strong><span class="marker-under">プレイヤーとしてログインしてクイズを解くメリットとして、間違えた問題を復習できる機能を追加しました</span></strong>。また、<strong><span class="marker-under">クイズを解く問題数も選択できる機能がプレイヤーにはあります</span></strong>。<br><br>以下がプレイヤーとしてのクイズを解く前の画面です。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1000" height="459" src="https://oz006.com/wp-content/uploads/2025/03/image-2.png" alt="" class="wp-image-560" style="width:739px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/03/image-2.png 1000w, https://oz006.com/wp-content/uploads/2025/03/image-2-300x138.png 300w, https://oz006.com/wp-content/uploads/2025/03/image-2-768x353.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>これに対して、プレイヤーとしてログインせずにクイズを解く前の画面が以下になります。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1000" height="353" src="https://oz006.com/wp-content/uploads/2025/03/image-3.png" alt="" class="wp-image-561" style="width:742px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/03/image-3.png 1000w, https://oz006.com/wp-content/uploads/2025/03/image-3-300x106.png 300w, https://oz006.com/wp-content/uploads/2025/03/image-3-768x271.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>クイズスタートボタンを押すと、、以下のような画面になり、チェックボックスで正解を選びます。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="790" height="457" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.06.22.png" alt="" class="wp-image-564" style="width:729px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.06.22.png 790w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.06.22-300x174.png 300w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.06.22-768x444.png 768w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.06.22-120x68.png 120w" sizes="auto, (max-width: 790px) 100vw, 790px" /></figure>



<p>※問題文の右側のサウンドマークを押すと、問題文を読んでくれます。<br>※英語だと、ネイティブな発音で読んでくれます。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="921" height="623" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.08.30.png" alt="" class="wp-image-565" style="width:727px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.08.30.png 921w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.08.30-300x203.png 300w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.08.30-768x520.png 768w" sizes="auto, (max-width: 921px) 100vw, 921px" /></figure>



<p>上の画像が正解したときの画面で、下の画像が不正解のときの画面です。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="918" height="623" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.10.02.png" alt="" class="wp-image-566" style="width:712px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.10.02.png 918w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.10.02-300x204.png 300w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.10.02-768x521.png 768w" sizes="auto, (max-width: 918px) 100vw, 918px" /></figure>



<p>プレイヤーとしてログインした状態で、すべて問題を解き終わると、以下のような画面になります。<br>正解数だけでなく、正解率も表示してくれます。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="695" height="530" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.15.16.png" alt="" class="wp-image-568" style="width:711px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.15.16.png 695w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.15.16-300x229.png 300w" sizes="auto, (max-width: 695px) 100vw, 695px" /></figure>



<p>これに対して、ログインせずに問題をすべて解き終わると、少しさびしい感じがします笑。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="700" height="308" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.12.03.png" alt="" class="wp-image-567" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.12.03.png 700w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.12.03-300x132.png 300w" sizes="auto, (max-width: 700px) 100vw, 700px" /></figure>



<p>ちなみに、１０問正解して、レベルがあがったときは、下記のような画面が出現します。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="611" height="277" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.18.27.png" alt="" class="wp-image-569" style="width:699px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.18.27.png 611w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.18.27-300x136.png 300w" sizes="auto, (max-width: 611px) 100vw, 611px" /></figure>



<p>そして、レベルが高いプレイヤーベスト３がランキング表に乗るようになっています。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="313" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.31.36.png" alt="" class="wp-image-573" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.31.36.png 1000w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.31.36-300x94.png 300w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.31.36-768x240.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<h2 id="rtoc-10"  class="wp-block-heading">クイズ作成者機能紹介</h2>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="358" height="60" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.34.17.png" alt="" class="wp-image-574" style="width:573px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.34.17.png 358w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.34.17-300x50.png 300w" sizes="auto, (max-width: 358px) 100vw, 358px" /></figure>



<p>ヘッダーの右側に「クイズ作成者登録」・「クイズ作成者ログイン」ボタンがあります。</p>



<h3 id="rtoc-11"  class="wp-block-heading">クイズ作成者登録画面</h3>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="496" height="710" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.35.59.png" alt="" class="wp-image-575" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.35.59.png 496w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-04-0.35.59-210x300.png 210w" sizes="auto, (max-width: 496px) 100vw, 496px" /></figure>



<p>このサイトのテーマカラーは、黄色・紫としたので、こちらでは紫を上手に使ってみました。<br><strong>Googleアカウントで登録ボタン</strong>を押せば、Googlleアカウントでの登録も可能です。</p>



<p>新規登録時には、メール認証が必要で、以下のようなメールが届きます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="658" height="444" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.03.12.png" alt="" class="wp-image-577" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.03.12.png 658w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.03.12-300x202.png 300w" sizes="auto, (max-width: 658px) 100vw, 658px" /></figure>



<p>上記の、このボタンをクリックを押すと登録が完了して、以下のクイズ作成者画面に移動します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="416" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.01.46-1.png" alt="" class="wp-image-579" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.01.46-1.png 1000w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.01.46-1-300x125.png 300w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.01.46-1-768x319.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>カテゴリー新規登録ボタンを押すと、クイズのカテゴリーを新規登録することが可能です。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="697" height="504" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.15.22.png" alt="" class="wp-image-581" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.15.22.png 697w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.15.22-300x217.png 300w" sizes="auto, (max-width: 697px) 100vw, 697px" /></figure>



<p>登録したカテゴリーに対して、クイズを作成していきます。</p>



<p>カテゴリーの詳細ボタンを押すと以下の画面に移動します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="604" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.17.37.png" alt="" class="wp-image-582" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.17.37.png 1000w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.17.37-300x181.png 300w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.17.37-768x464.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>上記の画面でクイズの新規追加・編集・削除を行うことが可能です。<br>カテゴリー編集ボタンやクイズを追加ボタンを押すと、以下の画面に移動します。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="714" height="583" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.25.53.png" alt="" class="wp-image-584" style="width:566px;height:auto" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.25.53.png 714w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.25.53-300x245.png 300w" sizes="auto, (max-width: 714px) 100vw, 714px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="565" height="875" src="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.19.59.png" alt="" class="wp-image-583" srcset="https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.19.59.png 565w, https://oz006.com/wp-content/uploads/2025/04/スクリーンショット-2025-04-05-23.19.59-194x300.png 194w" sizes="auto, (max-width: 565px) 100vw, 565px" /></figure>



<p>ユーザーが使いやすいように、左上に戻るボタンと右下に登録ボタンを配置しました。<br>地味ですが、ユーザーの使いやすさに関しては、今後もこだわっていきたいと思います。</p>



<h2 id="rtoc-12"  class="wp-block-heading">ポケモンなきごえクイズ機能紹介</h2>



<p>その名の通り、ポケモンのなきごえクイズがランダムで生成され、なきごえを聞いて、４択から正解を選ぶクイズです。この機能が１番、苦労した部分です。</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Quizopia~ポケモンなきごえクイズ機能紹介~" width="1256" height="942" src="https://www.youtube.com/embed/NywDOB0YILY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h3 id="rtoc-13"  class="wp-block-heading">なきごえクイズで苦労した点</h3>



<p>まず、初期の実装方法としては、PokeAPIからそのまま音声ファイルをAxiosを使って取得して、Laravelのコントローラーを使ってクイズを作成して、クイズと音声を流すという実装にしていました。<br>この実装方法でも問題なく、クイズは作成できた（上記の動画）のですが、問題点が２つありました。</p>



<p><strong>①<span class="marker-under-blue">iPhoneやiPadなどのiOS環境では音声が出力されない</span><br>②<span class="marker-under-blue">本番環境でクイズをたくさん使用した場合、PokeAPIの制限がかかる可能性がある</span></strong></p>



<p>特に、①のiOS端末で音声が流れない問題は解決するのに時間がかかり、大変な思いをしましたが、今となっては良い思い出です。</p>



<p></p>



<h4 class="wp-block-heading">①<strong>iPhoneやiPadなどのiOS環境では音声が出力されない</strong>の解決方法</h4>



<p>howler.jsを入れてみたり、色々と試しましたがうまくいかずで、解決に丸１日かかりました。<br>解決方法として、<strong><span class="marker-under">m4a形式のなきごえ音声ファイルをサーバーに用意して使用する</span></strong>ことで解決することができました。最初は、mp3形式のなきごえ音声ファイルを使っていたのですが、iOSとmp3は相性が悪いということを知ることができました。ちなみに、このときにスマホやタブレットでchrome://inspectを使えば、コンソールを見ることができることを覚えました。</p>



<p></p>



<h4 class="wp-block-heading"><strong>②クイズをたくさん使用した場合、PokeAPIの制限がかかる可能性の解決方法</strong></h4>



<p>PokeAPIからなき声のmp3形式のなきごえ音声データをダウンロードし、<br>次に、Apowersoft( <a href="https://www.apowersoft.jp/free-online-video-converter">https://www.apowersoft.jp/free-online-video-converter</a> )を使用して、m4a形式に変換を行い、こちらを<strong><span class="marker-under">サーバーに保存して使用する形の実装</span></strong>に切り替えました。さすがに、約１０００匹分のポケモンのなきごえはいらないと思ったので、赤緑と金銀世代のポケモンである２５１匹分のなきごえデータをダウンロードすることに決めました。</p>



<p></p>



<h5 class="wp-block-heading">ダウンロードは手動ではなく、プログラミングによる自動処理で感動！</h5>



<p>手動で２５１匹分のなきごえ音声ファイルをダウンロードするのは非常に手間がかかるため、プログラミングを用いて、ダウンロードを試みました。以下のコードを実行してみて、<strong>ダウンロードが自動で進んでいく様子を見たときは、プログラミングを学習していて良かったと嬉しく思いました(^^)</strong></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="プログラミング自動処理" width="1256" height="707" src="https://www.youtube.com/embed/oHgMwjZx4oo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>以下、使用した自動ダウンロード用のphpファイル</p>



<div class="hcb_wrap"><pre class="prism off-numbers lang-php" data-lang="PHP"><code>&lt;?php

require __DIR__ . &#39;/../vendor/autoload.php&#39;;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

// 保存先ディレクトリの設定
$saveDir = __DIR__ . &#39;/../public/audio/pokemon_cries/&#39;;

// ディレクトリが存在しない場合は作成
if (!file_exists($saveDir)) {
    mkdir($saveDir, 0755, true);
}

// HTTPクライアントの初期化
$client = new Client();

// ダウンロード済みのファイル数をカウント
$downloadedCount = 0;

// 進捗表示用の関数
function showProgress($current, $total) {
    $percent = floor(($current / $total) * 100);
    echo sprintf(&quot;\rダウンロード進捗: %d/%d (%d%%)&quot;, $current, $total, $percent);
}

echo &quot;ポケモンの鳴き声のダウンロードを開始します...\n&quot;;

// ダウンロードする開始ID、終了IDを設定
$startId = 152;
$endId = 251;
$total = $endId - $startId + 1;

// $startIdから$endIdまでのポケモンの鳴き声をダウンロード
for ($id = $startId; $id &lt;= $endId; $id++) {
    try {
        // PokeAPIからポケモンデータを取得
        $response = $client-&gt;get(&quot;https://pokeapi.co/api/v2/pokemon/{$id}&quot;);
        $pokemonData = json_decode($response-&gt;getBody(), true);
        
        // 鳴き声のURLを取得
        $cryUrl = $pokemonData[&#39;cries&#39;][&#39;latest&#39;];
        
        // ファイル名を設定（3桁の数字にパディング）
        $fileName = sprintf(&quot;%03d.mp3&quot;, $id);
        $savePath = $saveDir . $fileName;
        
        // 鳴き声データをダウンロード
        $client-&gt;get($cryUrl, [&#39;sink&#39; =&gt; $savePath]);
        
        $downloadedCount++;
        showProgress($downloadedCount, $total);
        
        // APIの制限を考慮して待機（1秒）
        sleep(1);
        
    } catch (GuzzleException $e) {
        echo &quot;\nエラー（ポケモンID: {$id}）: &quot; . $e-&gt;getMessage() . &quot;\n&quot;;
        // エラー時は少し長めに待機（3秒）
        sleep(3);
    }
}

echo &quot;\n\nダウンロードが完了しました！\n&quot;;
echo &quot;保存先ディレクトリ: &quot; . $saveDir . &quot;\n&quot;
echo &quot;ダウンロードされたファイル数: &quot; . $downloadedCount . &quot;\n&quot;;
echo &quot;\n注意: ファイルはMP3形式でダウンロードされています。M4A形式に変換する必要があります。\n&quot;;</code></pre></div>



<h2 id="rtoc-14"  class="wp-block-heading">家族の感想と今後に向けて</h2>



<p>アプリが完成したので、娘と嫁にアプリを実際に使ってもらったのですが、娘は大喜び！！<br>夢中になって、ポケモンなきごえクイズをやってくれていました。嫁も同世代でポケモン好きなので、夜１人でなきごえクイズをやっているところを見たときに、微笑ましく思いました(^^)笑<br>ちなみに、最初に作ったときは、赤緑だけの１５１匹のクイズだったのですが、どうしても金銀まで入れてほしいという嫁のリクエストにより、２５１匹まで増えました笑。</p>



<p><strong><span class="marker-under">自分が作ったアプリで、誰かが笑ったり、喜んだりする姿を見れるのは嬉しいです。</span></strong><br><br>引き続きスキルを磨き、作りたいものが作れるエンジニア、人の役にたてるものが作れるエンジニアになれるように精進していこうと思います！</p>



<p>このブログを読んでくださった方も、Quizopiaをぜひ触ってみてもらえたら幸いです。</p>




<a rel="noopener" href="https://quizopia.oz006.com" title="https://quizopia.oz006.com" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fquizopia.oz006.com?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">https://quizopia.oz006.com</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://quizopia.oz006.com" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">quizopia.oz006.com</div></div></div></div></a>



<p>ここまで読んでいただき、ありがとうございました(^^)</p>



<h2 id="rtoc-15"  class="wp-block-heading">補足：コード説明パート（時間があるときに更新）</h2>



<p>自分の作ったコードを他人に説明できることは大切だと思うので、主要パートのコードの解説を、今後、別記事にしていきます。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-oz wp-block-embed-oz"><div class="wp-block-embed__wrapper">

<a href="https://oz006.com/portfolio-quizopia-code-explain/" title="Quizopiaコード説明~ポケモンなきごえクイズ編~" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac-160x90.webp 160w, https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac-120x68.webp 120w, https://oz006.com/wp-content/uploads/2025/04/DALL·E-2025-04-07-01.52.45-A-fun-and-pop-style-illustration-with-the-word-Code-in-bold-playful-letters.-The-image-features-a-cheerful-colorful-scene-with-cute-cartoon-charac-320x180.webp 320w" sizes="auto, (max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Quizopiaコード説明~ポケモンなきごえクイズ編~</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、ポートフォリオ「Quizopia」のコードの一部を説明しています。 PokemonCryQuizController.php の一部紹介 // 問題セットを生成するプライベートメソッド private function gen...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://oz006.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">oz006.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.07</div></div></div></div></a>
</div></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://oz006.com/portfolio-quizopia/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>プログラミング学習８ヵ月で思うこと</title>
		<link>https://oz006.com/programing-study/</link>
					<comments>https://oz006.com/programing-study/#respond</comments>
		
		<dc:creator><![CDATA[oz]]></dc:creator>
		<pubDate>Mon, 30 Dec 2024 15:07:50 +0000</pubDate>
				<category><![CDATA[転職]]></category>
		<guid isPermaLink="false">https://oz006.com/?p=490</guid>

					<description><![CDATA[今年も、もうすぐ終わりますね。５月１日からウェブカツを始めて、約８カ月間、学習したことになります。学習状況ですが、完全ではないですが、ほぼ毎日学習を継続することができました。学習当初と比べると、見えている景色が全然違って [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="571" src="https://oz006.com/wp-content/uploads/2024/12/DALL·E-2024-12-30-22.59.07-A-cozy-indoor-scene-of-a-young-person-learning-programming-during-the-winter-holidays.-The-room-features-warm-lighting-a-desk-with-a-laptop-displayin.webp" alt="" class="wp-image-498" srcset="https://oz006.com/wp-content/uploads/2024/12/DALL·E-2024-12-30-22.59.07-A-cozy-indoor-scene-of-a-young-person-learning-programming-during-the-winter-holidays.-The-room-features-warm-lighting-a-desk-with-a-laptop-displayin.webp 1000w, https://oz006.com/wp-content/uploads/2024/12/DALL·E-2024-12-30-22.59.07-A-cozy-indoor-scene-of-a-young-person-learning-programming-during-the-winter-holidays.-The-room-features-warm-lighting-a-desk-with-a-laptop-displayin-300x171.webp 300w, https://oz006.com/wp-content/uploads/2024/12/DALL·E-2024-12-30-22.59.07-A-cozy-indoor-scene-of-a-young-person-learning-programming-during-the-winter-holidays.-The-room-features-warm-lighting-a-desk-with-a-laptop-displayin-768x439.webp 768w, https://oz006.com/wp-content/uploads/2024/12/DALL·E-2024-12-30-22.59.07-A-cozy-indoor-scene-of-a-young-person-learning-programming-during-the-winter-holidays.-The-room-features-warm-lighting-a-desk-with-a-laptop-displayin-120x68.webp 120w, https://oz006.com/wp-content/uploads/2024/12/DALL·E-2024-12-30-22.59.07-A-cozy-indoor-scene-of-a-young-person-learning-programming-during-the-winter-holidays.-The-room-features-warm-lighting-a-desk-with-a-laptop-displayin-160x90.webp 160w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>今年も、もうすぐ終わりますね。<span class="marker-under">５月１日からウェブカツを始めて、約８カ月間、学習したことになります</span>。学習状況ですが、完全ではないですが、ほぼ毎日学習を継続することができました。学習当初と比べると、見えている景色が全然違っています。以下は、Githubの草の画像ですが、来年度は、しっかりとビッシリ生い茂っている草に成長させたいと思います。こうやって草で学習管理していると、Gitを早く知りたかったと今となっては思います。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="210" src="https://oz006.com/wp-content/uploads/2024/12/スクリーンショット-2024-12-30-21.32.55-1024x210.png" alt="" class="wp-image-497" srcset="https://oz006.com/wp-content/uploads/2024/12/スクリーンショット-2024-12-30-21.32.55-1024x210.png 1024w, https://oz006.com/wp-content/uploads/2024/12/スクリーンショット-2024-12-30-21.32.55-300x61.png 300w, https://oz006.com/wp-content/uploads/2024/12/スクリーンショット-2024-12-30-21.32.55-768x157.png 768w, https://oz006.com/wp-content/uploads/2024/12/スクリーンショット-2024-12-30-21.32.55.png 1288w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>学習状況としては、2024年12月３０日(月）時点で、フルスクラッチのポートフォリオ完成、Laravelでのアウトプットとしてのポートフォリオがとりあえず完成&#x1f525;Reactでアプリを３つほど作った段階で、次は、Vue.jsを予習として扱っていこうと思っているところです。</p>



<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame2 preset6 animation-fade rtoc_open default" data-id="490" data-theme="Cocoon Child">
			<div id="rtoc-mokuji-title" class=" rtoc_left">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">今後の目標・予定</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-2">余裕があれば、行いたいこと</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-3">ウェブカツを８ヶ月学習して思うこと</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-4">学習の方向性が明確である</a></li><li class="rtoc-item"><a href="#rtoc-5">自走力が鍛えられる</a></li><li class="rtoc-item"><a href="#rtoc-6">練習制限が絶妙な抑止剤</a></li><li class="rtoc-item"><a href="#rtoc-7">ウェブマーケティング部・法務部・営業部・起業部が楽しみ過ぎる</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-8">今年の感想と来年の抱負</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-9">今年の私の中での漢字は「終」</a></li><li class="rtoc-item"><a href="#rtoc-10">来年の私の中での漢字は「始」にしたい</a></li></ul></li></ol></div><h2 id="rtoc-1"  class="wp-block-heading">今後の目標・予定</h2>



<p><strong>１月</strong><br>●Vue.jsとLaravelでの開発（React.jsともやってみたい）<br>●フルスクラッチ・Laravelのポートフォリオで工夫した点など、ブログにまとめる<br>●学習の中でよく使われてきた語句・用語などをブログにまとめる<br>●Reactで作ったアプリの精度をより高める<br><br><strong>２月</strong><br>●ウェブカツ（JS上級・Laravel部）を通して、自分が予習した内容に抜けなどないかチェック<br>→こちらは学習内容が多そうなので、しっかりと部活に打ち込み、とにかく手を動かすことを予定<br><br><strong>３月</strong><br>●ウェブカツ（ウェブマーケティング部）を学習。こちら非常に楽しみ♪<br>→余裕が出たら何をするかは、未定<br>→このあたりで、一度、進路相談を活用してみようかなとも検討中。</p>



<p><strong>４月</strong><br>●ウェブカツ（法務部・営業部・起業部）を学習。こちらも非常に楽しみ♪<br>→余裕が出たら何をするかは、未定</p>



<p><strong>５月</strong><br>状況次第で卒業試験申し込む</p>



<p><strong>８月</strong><br>転職活動開始予定</p>



<h3 id="rtoc-2"  class="wp-block-heading">余裕があれば、行いたいこと</h3>



<p>●オブジェクト指向部で作った成果物をパワーアップする<br>●DB設計指南書を１冊さらっと読む<br>●処理を高速化するための方法について学習する（書籍は購入しているが読めておらず、、）<br>●母がパッチワークの講師のため、作品を販売できるECサイトの作成<br>●AWSについての知識を深める<br>●TypeScriptの知識を深める<br>●Dockerの知識をもう少し深める（現状、LaravelSailは使える・Dockerの仕組みもOK）<br>●クリーンコードについて、ノートにまとめ、すぐに閲覧・引き出せるようにしておく<br>●業界における就職・転職活動の情報収集</p>



<h2 id="rtoc-3"  class="wp-block-heading">ウェブカツを８ヶ月学習して思うこと</h2>



<p>いつか書こうとは思っていたウェブカツについてのレビューを半年少しではありますが、書かせていただこうと思います。卒業したら、お礼も含めて、もう一度、記事にまとめたいです。</p>



<h3 id="rtoc-4"  class="wp-block-heading">学習の方向性が明確である</h3>



<p>ウェブカツの良いところは、学習する方向性をハッキリと示してくださっているところです。<br>「ウェブカツに通っていなければ、私はウェブ制作の道を目標に学習していたのかもしれない。」「バックエンドについて、学習することはなかったか、もしくは、触れるまでに相当な時間がかかっていたかもしれない」と思うことがよくあります。<br>何をどういった順番で学習するべきという方向性があったからこそ、準備や計画なども立てやすく学習することができています。</p>



<h3 id="rtoc-5"  class="wp-block-heading">自走力が鍛えられる</h3>



<p>私は、現職で予備校講師をしているのですが、実力を伸ばすのが速い子達というのは、自分の頭で考え、処理し、自己解決能力が高いという共通点を持っているということを肌感覚で知っています。<br>当然、必要な情報収集も自ら行い、軌道修正していくという側面も持っています。なので、プログラミングスクールを探す段階でも、手取り足取りマンツーマンで教えてもらえるところではなく、しっかりと自走力が鍛えられそうなスクールはないかな？と探している中で、見つけたのがウェブカツでした。<br>ウェブカツ入部後は、最初は当然、動画を見ながら丁寧に進めていましたが、<strong><span class="marker-under">最近では、ドキュメントやら、AIやらを使って、どんどん調べて進めて、ガンガンコードを読んで理解して、エラー出ても、エラーから学んで、理解していけばいいという耐性が染みついてきました</span></strong>。これは、ウェブカツのおかげだな〜と感じています。<br>最初の方から、どんどん自分でコードを書かせようとしてくださっていたり、どうなっていけば「稼げる人間」になれるのかのビジョンを明確にしてくれていて、それでいて、その考えにすごく共感が持てたおかげで、しっかりと学習に打ち込むことができました。</p>



<h4 class="wp-block-heading">最初の鬼門と呼ばれる「ウェブサービス部」について思うこと</h4>



<p>これについても、私はある意味、「誠実だな」と思ってしまう部分（思うようにしている部分？）があります。これまた、予備校講師・経営者の両方をやっていると、よく思うことがあります。<br>新規の生徒を多く獲得するのであれば、「体験授業」では、難しい内容ではなく「生徒が解けた！できるようになった！」と思ってもらう授業内容をした方がいいに決まっています。<br>普段の授業でも、<span class="marker-under">簡単な問題を解かせ、達成感を持たせて、「数学、分かるから大丈夫！」という気持ちにさせていた方が、予備校としては退塾者も減り、生徒数は増えます</span>。ただその代わり、「本物の学力」は、そんな安っぽい教育では身につくことは絶対にありません。<br><br>本当に良い講師というのは、<strong><span class="marker-under">自らも普段から勉強していること、入試問題を普段から解くことによって、どういうレベルに達すれば、生徒が目標を達成できるかを把握しており、その目標までたどり着く最短ルートや、課題などを明確に提示し、それを伝えて、納得してもらえる人間力がある講師</span></strong>だと私は思っています。「伝える」と「伝わる」は別次元のものであり、どれだけ正しいことを言っていても、伝われなければ全く意味がなく、この「伝わる」かどうかは、「誰が」言うかの部分がほぼ９０％以上を占めると体感していますし、本物の優しさというのは、「厳しさの中にある」と私はよく思います。<br><br>なので、「ウェブサービス部」という初心者からすれば難しい内容を、入部して１ヶ月後で取り組ませるというカリキュラムに関しては、私は、「誠実だな」と思ってしまいます（おかしいのかな？）。<br>だって、そこで辞められたら、当然、運営側は「儲からない」ですからね。</p>



<h3 id="rtoc-6"  class="wp-block-heading">練習制限が絶妙な抑止剤</h3>



<p>約８カ月間、プログラミングを学習して思うのは、まず１〜２ヶ月勉強した程度では、理解はできたとしても、身につくレベルには達することはできないなと感じています。こういったことって、やっぱり、体感しないと分からないことですよね。もし、練習制限がなかったら、気持ちの焦りだけが先走り、危ない行動・非効率な行動に出ていた可能性もあっただろうと感じています。<br><br>最近よくプログラミング学習をしていてイメージするのが、ワンピースの麦わらの一味の２年間の修行期間です。麦わらの一味は、じっくりと２年間、修行期間をおいたからこそ、確実な力をつけ、現在の場面でそれぞれのキャラが活躍できているわけですよね。自分の能力をしっかりと磨く期間は大切な期間だと思いますし、今は私の中で、「その期間！」と日々、思いながら、学習を継続しています。</p>



<h3 id="rtoc-7"  class="wp-block-heading">ウェブマーケティング部・法務部・営業部・起業部が楽しみ過ぎる</h3>



<p>まだ練習制限がかかっており、未学習の状態でこういったことを書くのは失礼なのかもしれませんが、これまでのウェブカツのメッセージ性などを見て感じていると、私の中では、これらの部活が楽しみでなりません。でも、それくらいウェブカツのメッセージ性には共感できるものがありますし、今後が、「楽しみだな」と思える学習環境というのがいいですよね(^^)引き続き、よろしくお願い致します。</p>



<h2 id="rtoc-8"  class="wp-block-heading">今年の感想と来年の抱負</h2>



<p>はい！というわけで色々と綴ってきましたが、おそらく今年最後のブログ記事だと思うので、最後に１年の感想と来年の抱負について書いておこうと思います。</p>



<h3 id="rtoc-9"  class="wp-block-heading">今年の私の中での漢字は「終」</h3>



<p>１年を振り返ったときに、真っ先に出てきたのが、いろいろな物が今年は壊れて失い、役目を「終」えた１年だったなと。今日も壊れた暖房を家族で買いに行っておりました笑。</p>



<p>●エアコン・暖房<br>●車<br>●修理された車が２日後にコインパーキングでサイドミラーを壊される<br>●テレビ（急にボンッと言って、煙がでる）<br>●歯（唐揚げで奥歯が欠けました、、、笑いましたが笑）<br>●５３年継続されていた行きつけのカフェ<br>（本日が営業最終日でした。朝に行きましたが寂しすぎる、、）<br>などなど<br><br>こう書くと、結構、悲壮感ありそうな１年に見えますが、普通に充実した１年ではありました。ただ、失ったり、終わったりすることで感じられることの多さを実感させていただき、普段当たり前にあるものの大切さ、時間の大切さ、健康の大切さをより感じる１年だったと思います。</p>



<h3 id="rtoc-10"  class="wp-block-heading">来年の私の中での漢字は「始」にしたい</h3>



<p>よって、２０２５年は、「始」にふさわしい１年にしたいと思っています。今までの出会いや、新しい出会いを大切にしながら、積極的に挑戦し、新しいキャリアを進み始めることができるように、日々、努力を継続していく１年にできたらと思っております。<br>今、ハッと時計を見たら、ブログを書いている間に、１２月３１日（火）を迎えてしまいました。<br><br>今日で大掃除などもだいぶ落ち着いたので、３１日（火）も家族に隠れて、バリバリ勉強しようと思います笑。ここまで読んでいただき、ありがとうございました。<br><br>皆様、良い年末をお過ごしくださいませ。よいお年を(^^)</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://oz006.com/programing-study/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>３０代後半からエンジニアを目指します&#x1f525;</title>
		<link>https://oz006.com/change-jobs/</link>
					<comments>https://oz006.com/change-jobs/#respond</comments>
		
		<dc:creator><![CDATA[oz]]></dc:creator>
		<pubDate>Fri, 11 Oct 2024 14:55:41 +0000</pubDate>
				<category><![CDATA[転職]]></category>
		<guid isPermaLink="false">https://oz006.com/?p=13</guid>

					<description><![CDATA[どうもはじめまして。オザキカズヒロ（OZ）と申します。私は、現在、３０代後半でエンジニアを目指して学習中です。 ３０代後半での転職は不安と思われる方、転職したいが勇気が出ない方は、たくさんいらっしゃると思いますが、この記 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="563" src="https://oz006.com/wp-content/uploads/2024/10/DALL·E-2024-10-10-11.38.19-A-person-transitioning-into-a-career-as-an-engineer-depicted-standing-confidently-in-front-of-a-blend-of-office-and-industrial-environments.-In-one-p-edited.jpeg" alt="" class="wp-image-31" srcset="https://oz006.com/wp-content/uploads/2024/10/DALL·E-2024-10-10-11.38.19-A-person-transitioning-into-a-career-as-an-engineer-depicted-standing-confidently-in-front-of-a-blend-of-office-and-industrial-environments.-In-one-p-edited.jpeg 1000w, https://oz006.com/wp-content/uploads/2024/10/DALL·E-2024-10-10-11.38.19-A-person-transitioning-into-a-career-as-an-engineer-depicted-standing-confidently-in-front-of-a-blend-of-office-and-industrial-environments.-In-one-p-edited-300x169.jpeg 300w, https://oz006.com/wp-content/uploads/2024/10/DALL·E-2024-10-10-11.38.19-A-person-transitioning-into-a-career-as-an-engineer-depicted-standing-confidently-in-front-of-a-blend-of-office-and-industrial-environments.-In-one-p-edited-768x432.jpeg 768w, https://oz006.com/wp-content/uploads/2024/10/DALL·E-2024-10-10-11.38.19-A-person-transitioning-into-a-career-as-an-engineer-depicted-standing-confidently-in-front-of-a-blend-of-office-and-industrial-environments.-In-one-p-edited-120x68.jpeg 120w, https://oz006.com/wp-content/uploads/2024/10/DALL·E-2024-10-10-11.38.19-A-person-transitioning-into-a-career-as-an-engineer-depicted-standing-confidently-in-front-of-a-blend-of-office-and-industrial-environments.-In-one-p-edited-160x90.jpeg 160w, https://oz006.com/wp-content/uploads/2024/10/DALL·E-2024-10-10-11.38.19-A-person-transitioning-into-a-career-as-an-engineer-depicted-standing-confidently-in-front-of-a-blend-of-office-and-industrial-environments.-In-one-p-edited-320x180.jpeg 320w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>どうもはじめまして。<strong>オザキカズヒロ（OZ）</strong>と申します。<br>私は、現在、<span class="marker-under-red"><span class="marker-under"><strong>３０代後半でエンジニアを目指して学習中</strong></span></span>です。<br><br>３０代後半での転職は不安と思われる方、転職したいが勇気が出ない方は、<br>たくさんいらっしゃると思いますが、<br>この記事がそういった方々の<strong><span class="marker-under-blue"><span class="marker-under">勇気づけ</span></span></strong>に少しでもなれば幸いです。</p>



<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame2 preset6 animation-fade rtoc_open default" data-id="13" data-theme="Cocoon Child">
			<div id="rtoc-mokuji-title" class=" rtoc_left">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">３０代後半でなぜ転職を考えた？</a></li><li class="rtoc-item"><a href="#rtoc-2">転職することを決めてからの行動</a></li><li class="rtoc-item"><a href="#rtoc-3">ブログの運用目的</a></li><li class="rtoc-item"><a href="#rtoc-4">始めてのフルスクラッチアプリ制作</a></li><li class="rtoc-item"><a href="#rtoc-5">今後に向けて</a></li></ol></div><h2 id="rtoc-1"  class="wp-block-heading">３０代後半でなぜ転職を考えた？</h2>



<p>３０代後半って人生の中で、いろいろ考える時期なんです。<br>私の場合は、「人はいつか死ぬ」ということを最近、強く意識しています（してしまいます）。<br><br>「<strong><span class="marker-under">今のままの人生で本当にいいのだろうか？</span></strong>」<br><br>いつか死ぬのであれば、限られた人生をできるだけ素敵なモノにしたいと思ったことが始まりでした。<br><br>生まれも育ちも大阪で、国公立の教育大学卒業後、<br><br><span class="marker-under"><strong>塾講師・予備校講師として１５年間ほど</strong></span><br><br>ありがたいことに部門の運営方針を決める役職もいただいており、現在も働いております。<br>年収は、平均年収＋２００〜３００万ほどはあり、家族と共に不自由のない生活を送ることができています。<br><br>小学２年生〜高校３年生、あるいは、卒業した大学生講師とも、たくさんコミュニケーションを取っているので、関西圏内の教育業界にはそこそこの自信はあります。<br>教育に関するご相談などがありましたら、お問い合わせフォームよりご質問ください。<br>（可能なかぎり、お答えさせていただきます）<br><br>私が現在の会社に入社するときには、夢がありました。<br><br>当時の私の夢は、<br><br>「<span class="marker-under"><strong>他人にとっての恩師となり、卒業して大人になった生徒たちが、<br>自分に会いに来てくれることや、そんな生徒たちと一緒に働くこと</strong></span>」<br><br>でした。<br><br>幸いなことに、この夢は実現しました。<br>当然、嬉しかったのですが、管理職歴も長くなり、<strong><span class="marker-under">仕事で結果を出すことに執着する</span></strong>精神状態で、<br>常に仕事のことを考えており、大量のビジネス本を読んだり、好きで休日出勤をしたり、<br>午前１１時頃に出社して、夜の２時頃まで働くという生活を数年間は送っていたため、<br>心から喜ぶであったり、そういった嬉しい瞬間を、１つ１つゆっくりと感じる時間を過ごしたことは、ほとんどありません。<br><br>このように書くとネガティブな感じで伝わるかもしれませんが、<br>うちの会社は、決してブラック企業ではありません。<br>社員のことをすごく大切にしてくれ、ノルマなどにも厳しすぎず、<br>この業界では相当珍しい部類に入ると思います。<br>私は好きで働いていましたし、若い頃は、誰かに認められたいという気持ちは当然ありました。<br>ありがたいことに、毎年結果が出ていたため（当然、大量の失敗も経てですが）、昇級していくうちに本当にたくさんのことを体感し、学ぶことができたと感謝しております。<br><br>そんな私にとって、転職の１番のきっかけになったのが、<strong><span class="marker-under">AIやWEBアプリの存在</span></strong>だと思います。<br>教育業界であれば、AIを使用した英単語暗記アプリであったり、業務効率化ができるアプリが存在し、私は実際にそういったアプリの導入を検討できる役職だったため、営業に来てくださった方の話を聞き、試験的に運用させていただいき、複数のアプリを会社に導入しました。<br><br>特に印象が強かったのは、AIで記憶の定着を可視化でき、管理できるアプリでしたね。<br>CSVファイルで４択問題を入力して、インポートすれば、AIが自動で問題の聞き方を変えてくれたり、解答者の間違いによって、問題の出し方を易しくしてくれたり、このアプリ１つで、講師と生徒ともにハッピーになれると、感動したことを今でも覚えています。<br><br>こういったツールを触るうちに、自然とプログラミングを勉強してみたいなという気持ちになり、<br>調べて実際に触ってみたのが、<strong><span class="marker-under">Progate（プロゲート）</span></strong>でした。<br><br>最初は、「<strong>触ってみるだけで、仕組みさえ、ある程度知ることができたらいい</strong>」<br><br>くらいの気持ちで考えていたのですが、<br>HTML・CSS編が終わる頃には、夢中になってPCと向き合っていました。<br>今となっては、かわいい失敗と思いますが、当時はProgate（プロゲート）で書いたコードをすべて、A3サイズのノートに書き写し、解説スライドをきれいにまとめ、自分なりのコメントを書き込んだり、覚えているかどうかを白紙にアウトプットしたり、学んだ内容を１問１答形式で問題を自作し、夜中に確認していたり、それほど夢中になって勉強していたことを覚えています。<br><br>そこで当時、人生で初めて転職について調べてみたのですが、そこで調べた結果のほとんどが、<br><br>「<strong><span class="marker-under-blue">３０代でエンジニアはオワコン</span></strong>」<br>「<strong><span class="marker-under-blue">３０代でエンジニアは転職すべきではない</span></strong>」という情報ばかりでした。<br><br>本当にそうなのか？と疑問に思い、<br>某プログラミングスクールでWEB面談もさせていただいたのですが、<br>そこでも、「<strong><span class="marker-under-blue">絶対に辞めた方がいいですよ</span></strong>」と言われ、<br>当時は「<strong>そりゃそうだよな、、。そんな甘い世界じゃないよな、、。</strong>」と思ったことを覚えています。<br><br>これが５年ほど前のことなのですが、ちょうど悩んでいたこのタイミングに、翌年より、高校生を指導する部門で運営側に回ることが決まり、長年、小中学生を担当する部門だったため、<span class="marker-under"><strong>新しく、高校数学と化学の猛勉強をやり直す</strong></span>という日々が始まりました。<br><br>【<span class="marker-under-red"><strong>朝一に図書館に行き、出社まで勉強→出社→帰ってきて勉強→休みの日も勉強</strong></span>】<br><br>というひたすら勉強と教材を作成するという日々を繰り返した結果、<br>新規開校してから３年で、２００名を超える高校生が通う校舎にまで発展し、部門全体でも大きな成長を遂げました。<br><br>そして、「結果が出たな」と実感ができた今年の２０２４年、<br>自分の中で「<span class="marker-under">教育業界をやり切った</span>」「<span class="marker-under">この業界で味わえる感動をほとんど味わうことができた</span>」と感じ、引退を決意しました。不思議と決意に時間はあまりかからなかったです。</p>



<h2 id="rtoc-2"  class="wp-block-heading">転職することを決めてからの行動</h2>



<p>転職することを決めてからは、今後どのように勉強していくかを考えました。<br>まず決めたのが<span class="marker-under">１年〜２年かけてしっかりと勉強しながら、転職活動をする</span>こと。<br><br><span class="marker-under">今の仕事をしながら、</span>プログラミング学習を続け、しっかりとスキルを身に着けつつ、軌道修正をしていくことを決めました。仕事をしながらという選択をしたのは、当然、リスク管理や、学習教材などにコストをかけられるようにするためです。<br><br>ただ、<strong><span class="marker-under">仕事をしながらとなると、１日のプログラミング学習時間は、平日３時間〜４時間、休日は６時間〜７時間程度になることが予想</span></strong>できたので、効率よく学習するためのスクールを検討することに決めました。<br><br>現在、日本では１０００以上存在するプログラミングスクールですが、<br>１週間ほどかけて、ネットの情報や口コミなどを調べた結果、もうこのスクールに決めようかな？と考えていた直前に、<strong><span class="marker-under">ウェブカツ</span></strong>と出会い、<strong><span class="marker-under">ウェブカツ</span></strong>に入部することを決めました。<br><br>ウェブカツについては、また別の記事を書こうと思いますが、<br>決め手となったのは、<strong><span class="marker-under">顧問である「かずきち」さんのメッセージ性に心を打たれた</span></strong>のが１番大きかったです。<br><br>１０年以上、仕事に没頭してきた私からすると、かずきちさんがブログなどで書かれている内容は、すべて「<strong><span class="marker-under">腑に落ちる</span></strong>」という表現が適切で、「分かる！」「その通りです！」と共感できることだらけでした。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-text-align-left">世の中はとても単純。<br>トライアンドエラーする奴が必ず勝つ。<br>トライをしない奴はエラーもしない。<br><br>引用：<a href="https://qiita.com/kazukichi/items/7379b75fba2f90d3cf45">https://qiita.com/kazukichi/items/7379b75fba2f90d3cf45</a></p>
</blockquote>



<p>上記は、かずきちさんの記事の最後の部分ですが、この記事は、仕事に真摯に向き合って来た人にとっては、かなり刺さる内容なのではないでしょうか？<br>記事を最後まで読み終えたときに、このスクールで「稼げる力」をつけたいと決意し、１年かけて卒業することを心に決め、２０２４年５月１日に入部をしました。<br><br>入部してからは、朝に大体２〜３時間、夜仕事から帰ってきて１〜２時間程度学習を継続している状態です。「<span class="marker-under-blue">仕事との両立は大変かな？</span>」と不安に思っていましたが、<span class="marker-under">新しいことを毎日知ることができる喜びや、できることが少しずつ増えていくという実感は、充実した時間を過ごしていると感じる</span>ことができるため、プログラミングを学ぶかどうか悩んでいる方は、実際にトライしてみて、楽しいと感じることができるかで継続するかどうかを検討すればいいと思います。<br><br>ただ、「仕事にする」となると「楽しい」というだけではダメだと思っていて、私は現職において、教えることが楽しいと最初の頃は思っていましたが、今は全くと言ってもいいくらい、そんな感情はありません（子どもはかわいいですけどね）。管理職として「周囲の力を結集し、結果を出す者」という認識で、長い間働いていくうちに、「生徒・保護者の幸せ・職員の幸せ・自分や家族の幸せ」を叶えるためには、「<span class="marker-under">自分を磨き、良い商材を作り、世のニーズを汲み取った形で提供すること</span>」が必要だと身体で覚えるようになりました。当然、結果を出せる良い商材を作れるようになるまでには、大量のエラーを繰り返し、地道に修正を加えていくという作業を何度も何度も繰り返す必要があるため、どんな業界で働くとしても、こういった泥臭い作業をこなせる精神は大切だと思っています。<br><br>ウェブカツに入部してからは、ウェブカツの部活内容をベースに進めつつ、学習を終えたら、Youtube、Udemy，書籍などを活用して勉強しています。<br><br>現在は、学習を始めてから５ヶ月が経過しており、WordPress部の学習中のため、WordPressを使ったブログを作ってみようと思い立ち、このブログの開設に至っています。<br></p>



<h2 id="rtoc-3"  class="wp-block-heading">ブログの運用目的</h2>



<p>今後、このブログでは、少しずつではありますが、<span class="marker-under">プログラミングやITに関する情報をできるだけ読み手の方を意識しながら発信</span>していけたらと考えています。目標は１週間に１記事書くという形で行動できたらと思います。現在の仕事柄、iPadを使って、解説動画を大量に作成しているため、簡易ではありますが、超シンプルな解説動画を作りながら、学んでいきたいと思い、ブログタイトルを「<strong>教える✕プログラミング</strong>」と決めました。<br><br>「<span class="marker-under-red"><strong>SNSで自分のことを発信する</strong></span>」とは無縁な人生を送っていましたが、Xで１日約１〜２投稿も始めています。ありがたいことに、このXの投稿に対して、毎回のように「いいね」をしてくださる方もいて、自分が「いいね」される立場になって、久しぶりに「<span class="marker-under-red">見守ってくれる人がいる」という実感</span>を持つことができ、大変励みになっています。ありがとうございます。<br><br>また、現在、作成しているアプリなどを、こちらのブログで紹介し、ポートフォリオの役割を果たせたらと考えています。長年、何かを売るという営業的な側面も経験してきたため、「<span class="marker-under-blue">どれだけ努力をしても売れなければ意味がない</span>」と思っているため、当然、<span class="marker-under-red">どれだけプログラミングができるようになっても、伝わらなければ意味がない</span>ので、コツコツの発信を通して、少しずつ信頼を積み重ねて、将来のお仕事につながればいいと考えています。<br><br></p>



<h2 id="rtoc-4"  class="wp-block-heading">始めてのフルスクラッチアプリ制作</h2>



<p>ウェブカツに入部して、１ヶ月後に作成したアウトプット作品を今回、公開します。<br><br>以下がアウトプット作品のリンクです。<br>↓↓↓↓<br><a href="https://ozakijyuku.oz006.com">https://ozakijyuku.oz006.com</a><br><br>架空の個人塾のホームページを想定しながら、</p>



<ul class="wp-block-list">
<li><span class="badge">ログイン機能</span></li>



<li><span class="badge-red">新規ユーザー登録画面</span></li>



<li><span class="badge-pink">お気に入り登録機能</span></li>



<li><span class="badge-purple">画像アップロード機能</span></li>
</ul>



<p>などを実装しています。</p>



<p><span class="marker-under">ログインすれば、高１数学内容である【数と式】【図形と計量】の解説動画をYoutubeが視聴でき、質問を投稿したり、学習時間を記録することができる構成</span>になっております。手軽に新規登録できるようにメール送信・認証機能は外しています。一部、未完成の部分はあるのですが、とりあえず先に進み、後で修正に戻ってこようと思っています。</p>



<p>ウェブサービス部は難しかったですが、<strong>【<span class="marker-under">WEB全体の仕組み</span>】</strong>を理解することができたので、その後の学習効率は大きく上がったと感じています。また、データベースとのやりとりをたくさん行うことができたので、エラー文などの対応にも慣れたと感じます。<br></p>



<h2 id="rtoc-5"  class="wp-block-heading">今後に向けて</h2>



<p>ここまでお読みいただいき、ありがとうございます。今後、<span class="marker-under">さらに学習を重ねて、スキルを身に着け、稼げる力をつけていけたら</span>と思っています。<br><br>そのために次回からは、自作したキャラの会話形式も用いたブログにしていきたいと考えています。<br>考えたキャラクターたちに自己紹介をさせますね。</p>


<div class="speech-wrap sb-id-7 sbs-stn sbp-l sbis-sb cf">
<div class="speech-person">
<figure class="speech-icon"><img loading="lazy" decoding="async" class="speech-icon-image" src="https://oz006.com/wp-content/uploads/2024/10/OZ01.png" alt="OZ" width="506" height="510" /></figure>
</div>
<div class="speech-balloon">
<p>はじめまして。OZです♪関西出身です。</p>
<p>プログラミング学習がんばるで〜&#x2728;&#xfe0f;</p>
</div>
</div>
<div class="speech-wrap sb-id-8 sbs-stn sbp-r sbis-sb cf">
<div class="speech-person"> </div>
</div>
<div class="speech-wrap sb-id-8 sbs-stn sbp-l sbis-sb cf">
<div class="speech-person">
<figure class="speech-icon"><img loading="lazy" decoding="async" class="speech-icon-image" src="https://oz006.com/wp-content/uploads/2024/10/プロ太01.png" alt="" width="506" height="510" /></figure>
</div>
<div class="speech-balloon">
<p>プロ太です。プログラミング歴３０年になります。関東出身です。</p>
<p>私がしっかりレクチャーしましょう&#x2728;&#xfe0f;</p>
</div>
</div>


<p>上記２キャラクターは、<span class="marker-under">３０代後半では必ず遊んだことがありそうな、ボンバーマンビーダマンと戦隊キャラ</span>をモチーフにして作成しました笑。この２キャラを使いながら、楽しく勉強していけたらと思っています。どんなことでも、些細な楽しむ要素を入れることは、継続する上では大切ですよね。<br><br>今後の活動を温かく見守っていただければ幸いです。<br>では、また次回の記事でお会いしましょう(^^)</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://oz006.com/change-jobs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
