Excelに負けない家計簿アプリ開発に挑戦してみた。※初心者の声付き


:::note warn
ココロの声
開発中に思っていたことが、漏れ出してしまいそうなので、「ココロの声」に少し収めたいと思います
だいぶゆる～く開発していたので、**温かい目**で見てくださいm(__)m
:::


# はじめての開発

せっかくエンジニアになったんだから、開発をやってみたい！と思い、はじめました

初めての開発ということで、自分にとって身近なものをつくりたいと思い、
毎年Excelで作成していた家計簿をWebアプリとして開発してみました(o^―^o)

:::note
ココロの声
**GPTは使ってないよ！**(使いたかったけど)
:::

# 夢をかなえるブタ。

**夢をかなえるブタ。** は、今回開発した家計簿アプリのタイトルです

↓コイツ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/81aab8b8-bc32-dbff-7f5c-68d8fe97490e.png)

自分にとって、家計簿は「貯金」目的なので、タイトルは貯金箱から連想しました

・貯金箱→ブタ
・貯金すること→夢をかなえること

...っていうことで「夢をかなえるブタ。」です( •̀ ω •́ )✧


:::note
ココロの声
「夢をかなえるブタ。」は長いので、ここからは **夢ブタ。** とします_(:3」∠)_
:::

# カンタンな設計書
### 使用する言語と環境
業務でPHPを使用しているため、PHPベースで開発を進めました
また、言語そのものを勉強したかったので、フレームワークは使用しませんでした

||言語/環境|
---|---
開発環境| VSCode, Xampp
フロントエンド|HTML,CSS,javascript(chart.js)
バックエンド|PHP

:::note
ココロの声
そもそも、フレームワークとか言われたら、頭パンパンになる(-_-;)
:::

### 家計簿システムの大まかな仕様


1. 支出収入データの登録	
2. 登録データの表示(見える化)
3. 貯金機能

:::note
ココロの声
機能ベースで考えたつもりだったけど、画面ベースで考えていた(←後で気づく)
:::

# 作成手順
## 1. HTML,CSS,JavaScriptで画面を作成
まずは、画面の作成に取り掛かりました　
なんだかんだここに結構時間がかかったかもしれないです
3つあるので、順に説明します(^▽^)/
### ①画面TOP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/d16f7bb3-9a11-967d-eb82-00fd53df67c7.png)

こちらが画面TOPになります　
タイトルの挿入、ボタンの作成、背景の変更だけなので、問題はなかったです(^▽^)
個人的には、このシュールな感じが結構ハマっています^.^
背景のブタは、[ドッド絵ダウン](https://dotown.maeda-design-room.net/category/creatures/page/5/)から取ってきました　L●GOみたいな感じでおススメです

### ②支出画面/収入画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/26e090c8-b34b-d47b-dc07-3f6f8d3da1be.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/0999a5a8-f938-27fe-b01c-a20fb784f2bd.png)

この画面は一番こだわりました！
円グラフはどうしても作りたかったのですが、意外とややこしくて、大変でした
ただ、表示させるだけでなく、画面を更新すると動かせるようにもできたので、それは収穫です(⌒∇⌒)
また、途中でデータを追加していくと、7つ以上のデータだと表示されないということが判明したので、右にスクロールバーも作成しました

:::note
ココロの声
開発中に気づく不備は、できれば気づきたくなかった(-_-;)
もっとうまくやってくれるものだと思ってた(←他人任せ)
:::


### ③貯金画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/271109d0-3aa5-ab37-9f56-963b5d200055.png)

...諦めました(╯°□°）╯︵ ┻━┻

:::note
ココロの声
想像以上に時間がなかった　理想と現実のギャップは大きい(´；ω；`)ｳｩｩ
:::

## 2. DBの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/8f3d7d91-5259-8112-cfc4-e20dcd6e04b4.png)
DBでは、income(収入)とexpence(支出)に分けて2つのテーブルを作成しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/56ec22da-f047-bcd1-a6ff-4ffec865e713.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/938704c2-636c-2ca3-3197-c8b0f08b41c8.png)

income(収入)もexpence(支出)も、構造は同じです
・category：カテゴリー
・detail：詳細(店の名前とか)
・price：金額
・memo：メモ
・created_at：データを登録した年月日

:::note
ココロの声
いちば～ん、わかりやすかった！SQL、だいすき♡
:::

## 3. PHPでDBと連携
DBと連携させることが一番大変でした(;^ω^)
下のソースは、一部ですが、ほぼ取得したいデータごとに変数を用意している状態で、開発中はいいものの、あとから見直したら、すごくわかりづらいコードが完成しました

例1: 12月分の給料カテゴリーの合計に対する比率を出している。
(各月、各カテゴリーごとに変数を用意。)
```
<?php
    try {
    // 円グラフ
    $dbhh = new PDO("mysql:dbname=kakeibo;host=localhost;charset=utf8", "root");
    $sqla = "SELECT category, ROUND(SUM(price) / (SELECT SUM(price) FROM income WHERE created_at BETWEEN '2024-12-16'AND '2024-12-21'), 3)*100 AS ratio 
             FROM income 
             WHERE category= '給料'AND created_at BETWEEN '2024-12-16'AND '2024-12-21';";
    $stmta = $dbhh->query($sqla);
    $recorda = $stmta->fetch(PDO::FETCH_ASSOC);  
    $kyuryo= $recorda['ratio'];
```
例2：円グラフの割合を無理やり合計値で出そうとしている
```
<style>
.pie {
   display: flex;
     justify-content: center;
     align-items: center;
     width: 300px;
     height: 300px;
     font-size: 26px;
     font-weight: 700;
     border-radius: 50%;
     background-image: radial-gradient(#f2f2f2 30%, transparent 31%), 
                       conic-gradient(#ff8c00 0% <?php echo $kyuryo; ?>%,
                                      #ffd700 <?php echo $kyuryo; ?>% <?php echo $kyuryo+$bournus; ?>%,
                                      #f5deb3 <?php echo $kyuryo+$bournus; ?>% <?php echo $kyuryo+$bournus+$other; ?>%);
 }
 </style>
 
<div class="pie" align="left">合計</div>
```

この2つの例はほんの一部で、他にもいわゆる"べた張り"状態のソースがずら～っと続いてしまいました


:::note
ココロの声
正直言うと、その時はべた張りの方が楽だった、その時は...。
:::

# 一旦、完成。
正直、思っていた6割ぐらいの出来ですが、キリがないので、一旦完成としました
まぁ、家計簿としての機能は備わっているから、いいんじゃないかなっと(←甘い)
![ezgif-1-ccef448a37.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873013/6b9b14fb-a374-adb2-cfde-96f92de4ae5f.gif)


ひとまず、一旦完成してみての、振り返りを書いてみたいと思います

## 必要なことが多すぎる
普段から、割とインターネットに触れている方だと思いますが、
機能を使っているだけではわからない、だけど必要な処理が開発をする上で多いなと感じました(-_-;)
実際に、自分で開発すると、その必要性に気づかされるのですが、つくってみないと分からないもんだなと実感させられました
一方で、それが分かってくれば、連鎖状に他のことについても知れてくるような気がしていて、今回の開発はその一歩になったのではないかと思います

:::note
ココロの声
必要なことを知っていれば、時間が足りないってことないんだろうなぁ
:::

## 共通化が難しい
頭の中にはあっても、それを実現することの難しさがありました

なんといっても、「共通化」！！！
分かっていたつもりであっても、べた張りに進んでしまっていました
効率重視であるはずのプログラミングの概念を覆してしまいましたね(-_-;)

進み続けるよりも、一旦立ち止まって考える作業の必要性を感じました

:::note
ココロの声
べた張り、楽だけど、めんどくさかった、（笑）
:::

# 結果、圧倒的Excelの勝利

今のところ、夢ブタより断然Excelの方が家計簿として有能のままでした(´；ω；`)ｳｩｩ
くやしぃですねぇ

機能的にはまだまだですが、来年(2025)からは、夢ブタを使っていこうと思います！
初めての開発したものなので、大切にしていきたいです(⌒∇⌒)
それで、来年以降も夢ブタvol1,vol2...って続いて、自分の成長が少しでも見れたら幸いです

:::note
ココロの声
ココロの声が、駄々洩れな状態で初めての開発日記書いてみましたが、いかがでしたでしょうか？
未経験者である人もない人も、自分のココロの声と共感していただけたら、嬉しいです(o^―^o)
:::