OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】AWS Certified SysOps Administrator - Associate に２か月で合格した話


## AWS SOAに合格した備忘録
AWS実務未経験の一般人がSAA取得後２か月で合格に至るまでの経緯をまとめてみました。

## 学習を始めた段階のスキル
・~~AWSは一切触ったことなし~~
　Udemyの以下のハンズオン講座で一通りの操作を実施済
 「AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得」
https://www.udemy.com/share/101Yby3@DPFRHALO604eUdDNyITCqXD4QZwEw9970tZDsjOJFqzjrCjSEbMRu0iXwY3yg0Bkdg==/

・AWS CLF,SAA取得済

・実務でAzureポータルからVM作成やらDisk拡張やらを実施（約１年）


## 今回の勉強法
### 使用教材
AWS認定資格試験テキスト AWS認定SysOpsアドミニストレーター - アソシエイト AWS認定資格試験テキスト
https://www.amazon.co.jp/dp/481560908X?ref=ppx_yo2ov_dt_b_fed_asin_title

CloudTech
https://kws-cloud-tech.com/

### やったこと

①上記のAWS認定資格試験テキストを一通り流し読みする。
この時、練習問題は面倒なのでやりませんでした。
（だいたい２週間くらい？）

【読んだ感想】SAAと内容が被っているので改めて学ぶことはあまりなかったような気がしました。どうせ、この教材に書いてある内容が一問一答で試験に出るわけじゃないし適当に読んどこうって感じです。
実際、このテキストに戻ってサービスを確認するとか、このテキストじゃないと合格できなかったとは全然思わないです。Udemyで3000円以下でもっと良い講座があればそっちでもよいと思います。
どんなサービスがどんな場面でどう使われるのかがざっくり理解できれば十分です。



②CloudTechの問題練習（SOA-001~180）を1問ずつ答えと解説を確認しながら解く
※90日で5000円くらいのコースに課金しました

主にやったこと
・180問を10問ずつ解き、誤答したら解説を読み理解する
・間違えた問題に再挑戦し、誤答したら解説を読み理解する
・全問正解出来たら、再度180問解く（この作業の途中で面倒になりやめました）

やったこと詳細
SAAの際はPing-TのAI Assistantが活用できたのですが、CloudTechにはないため、ChatGPTさんに不明点は聞いて解決しました。
相変わらず諸学者には強い味方です。

180問終えるのに約20日かかりました。
10問を解いて解説を納得いくまでChatGPTで質問するのにだいたい80分くらいかけました。
80分×18セット=1440分=24時間?くらい

その後、間違えた問題だけ全問再挑戦し、さらに間違えた問題だけ再挑戦しました。

後学のために実際の正答率を残しておきます。
1回目：180問中113問正解（正答率62.78％）誤答67問
2回目：67問中37問正解（正答率55.22%）　誤答30問
3回目：30問中27問正解
解説よんでChatGPTさんの力を借りても、結局２回目は半分しか理解していませんでした。まぁ一般人はだいたいそんなもんだろうって感じで諦めて反復して記憶しましょう

めでたく全問正解することが出来たら、総復習で180問再度解くこととしました。

ただ、実際にやってもらえばわかると思うのですが、初見で解ける問題は総復習でも解けます。実際、60問ほど解いて誤答が4問くらいだったので総復習は辞めました。

この時点で受験の前日となっていました。

③AWS認定資格試験テキストの練習問題をダーッと解いて解説を見てみる
受験日当日朝、やることがなかったので、読み飛ばしていたテキストの練習問題を解いてみました。正答率は、まぁ6割程度だったと思います。

で、その時気づいたのですが、章末に模擬試験問題があるじゃないですか。
もちろん朝気づいたのでやる時間もなく、見るだけ心配になると思い一切触れませんでした。


## 試験当日
13:00からの試験でした。
自信度80％未満は「あとで見直しする」フラグを立てながら解いたところ、
自信あり40問、見直し25問でした。
720点以上で合格≒47問以上で合格？のため、期待値的に合格しているだろうと見込み退室しました。

## 合格通知について
当日の19:13にメールで通知が来ました。
SAAの時も19:14にメール通知が来ていたので、2024年上半期はこのくらいに合格発表なんでしょうね。

## 思うこと
SAA合格した人は、そのまま問題演習に入ったほうが良いです。
認定テキストをいっくら読んだって、実際の問題を解くのに必要なアウトプットの練習にはならないです。だったらハンズオンでIAMロールをアタッチして想定通り動作するか確認してたほうが何倍も役に立ちます。
認定テキストは読んでもちっとも役に立ちません（模擬試験は本番と類似の問題が出ているような気がしました。ちゃんと解いてないから知らんけど）


以上です。ここまで読んでいただきありがとうございました。
C# nullだった場合 ?? null 合体演算子

C#の??は「null 合体演算子」と呼ばれる演算子です。この演算子は、左側のオペランドがnullであるかどうかをチェックし、nullであれば右側のオペランドを返し、そうでなければ左側のオペランドを返します。

使用例:
```csharp
string name = null;
string result = name ?? "デフォルトの名前";
```

このコードでは、nameがnullの場合、resultには「デフォルトの名前」という文字列が代入されます。nameがnullでない場合は、その値がresultに代入されます。

??演算子を使うことで、nullチェックを簡潔に記述でき、デフォルト値を設定する場合に便利です。


---

参考になりましたら、いいね。お願いします！
コメントも気軽にお願いします。
とりあえず、作成して更新していく感じ。

参考
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-coalescing-operator
【WordPress】コピペで使えるパンくずリスト（複数階層対応）

パンくずリストは、ユーザーがサイト内で現在どの位置にいるのかを視覚的に示すための便利なナビゲーションです。特に階層構造のあるページや投稿では、ユーザーが親ページやトップページに戻りやすくするための有効な手段です。

この記事では、WordPressで簡単にコピペして使える汎用的なパンくずリストのコードスニペットを紹介します。このコードは、カスタム投稿タイプや多階層の子ページにも対応しています。

## コード全体

コードスニペットの全体は以下になります。

```php
<div class="breadcrumb">
  <a href="<?php echo home_url('/'); ?>">TOP</a>
  <?php
  $ancestors = get_post_ancestors($post);
  if (!empty($ancestors)) {
    $ancestors = array_reverse($ancestors);
    foreach ($ancestors as $ancestor_id) {
      $ancestor_title = get_the_title($ancestor_id);
      $ancestor_link = get_permalink($ancestor_id);
      echo '<a href="' . $ancestor_link . '">' . $ancestor_title . '</a>';
    }
  }
  ?>
  <span><?php the_title(); ?></span>
</div>
```

このコードを有効なテーマの `page.php` や `header.php` に追加するとパンくずリストとして表示されます。
- **スタイルの調整**
上記のスニペットには、スタイルの設定は含まれていません。`.breadcrumb` クラスに対して適宜CSSでスタイリングを行ってください。
- **`Warning: Undefined variable $post` が表示される場合**
ほとんどのテンプレートでは `$post` グローバル変数が自動的に設定されていますが、いくつかのテンプレートやカスタムクエリの中で使用する場合は、グローバル変数`$post`を明示的に参照する必要があります。
その場合は、コードスニペットを設置した箇所より前に、`global $post;` を追加してください。
- **全投稿タイプ、複数階層に対応**
このコードは、固定ページや投稿、カスタム投稿タイプに対応しており、多階層の子ページでも適切に動作します。

## 詳しい構造の説明
それでは、コードスニペットの仕組みを詳細に説明します。

### 1. トップページへのリンク

```php
<a href="<?php echo home_url('/'); ?>">TOP</a>
```

この部分では、サイトのトップページへのリンクを表示しています。

`home_url('/')` は WordPress の関数で、サイトのトップページの URL を取得します。これにより、どのページからでもトップページに戻るリンクを作成できます。

### 2. 親ページの取得と表示

```php
$ancestors = get_post_ancestors($post);
```

この行は、現在のページの親ページ ID の配列を取得しています。`get_post_ancestors()` 関数は、親ページ ID を取得し、さらにその上位のページまで遡って、すべての親ページの ID をリスト化します。

```php
if (!empty($ancestors)) {
```

この条件文は、親ページが存在する場合にのみ、以下の処理を実行することを意味しています。親ページがない場合は何も表示されません。

```php
$ancestors = array_reverse($ancestors);
```

`array_reverse($ancestors);` は、取得した親ページの配列を逆順に並べ替える関数です。これにより、トップページに近い順から表示されるようになります。

```php
foreach ($ancestors as $ancestor_id) {
```

このループは、各親ページの ID に対して処理を行います。各親ページのタイトルとリンクを取得し、それらをパンくずリストに追加します。

```php
$ancestor_title = get_the_title($ancestor_id);
```

`get_the_title($ancestor_id);` は、親ページのタイトルを取得する関数です。この関数は、指定されたページ ID に基づいてタイトルを取得します。

```php
$ancestor_link = get_permalink($ancestor_id);
```

`get_permalink($ancestor_id);` は、親ページのリンクを取得する関数です。この関数は、指定されたページ ID に基づいてページのパーマリンク（URL）を取得します。

```php
echo '<a href="' . $ancestor_link . '">' . $ancestor_title . '</a>';
```

この行は、親ページのタイトルをリンクとして表示しています。`echo` 文を使って、HTML のリンクタグを生成し、親ページのタイトルとリンクを表示します。

### 3. 現在のページのタイトル表示

```php
<span><?php the_title(); ?></span>
```

この部分では、現在表示しているページのタイトルを表示しています。

`<?php the_title(); ?>` は、現在のページのタイトルを取得して表示する WordPress の関数です。このタイトルはスパンタグで囲まれており、リンクではなくテキストとして表示されるため、ユーザーに現在のページであることを示します。

## まとめ

このパンくずリストは、WordPressサイトで階層構造のページや投稿、さらにはカスタム投稿タイプにも対応できる汎用的なソリューションです。コピペしてすぐに使える上、スタイルのカスタマイズも自由自在です。

ぜひ、あなたのサイトにも導入してみてください！
[Excel VBA] オートフィルタ／フィルタを解除する

### ざっくり説明
オートフィルタ／フィルタを解除します。

### コード
```vb:オートフィルタを解除
Function DeleteAutoFilter(ByVal WS As Worksheet)
'================================
'用途　　：オートフィルタの解除
'--------------------------------
'第一引数：Worksheetオブジェクト (Worksheet型)
'戻り値　：なし
'================================
    If WS.AutoFilterMode Then
        WS.Cells(1, 1).AutoFilter
    End If
End Function
```

```vb:フィルタを解除
Function ClearFilter(ByVal WS As Worksheet)
'================================
'用途　　：フィルタの解除
'--------------------------------
'第一引数：Worksheetオブジェクト (Worksheet型)
'戻り値　：なし
'================================
    If WS.FilterMode Then
        WS.ShowAllData
    End If
End Function
```

### 使用方法
第一引数に解除したいオートフィルタ／フィルタのあるWorksheetオブジェクトを渡す。

### 仕様等
特筆すべきこと無し

### 注意点
特筆すべきこと無し

### その他
- フィルタを解除して処理を動かしたい場合や、
保存前にオートフィルタ／フィルタを削除したい場合に重宝
- オートフィルタを解除すればフィルタも解除されます

***

フィルタとオートフィルタって何が違うねん、って方 向け解説
- オートフィルタ
データを絞り込むため、表に設定するもの
ON(True)の場合、セルの右下に[▼]が表示される

- フィルタ
データを個別に絞り込むための設定値
名簿を例に挙げると「男性のみ」「あ行の苗字の人のみ」etc

稚拙な説明ですがこんな感じです
【Revit】Revitのメインウィンドウハンドルの取得方法

# 概要
RevitAPIを使用した、Revitのウィンドウハンドルの取得方法をまとめました。

# 方法
Revit起動時の`OnStartup()`の引数である`UIControlledApplication`から取得可能です。

```C#
public Result OnStartup(UIControlledApplication uicapp)
{
    var revitHandle = uicapp.MainWindowHandle;
}
```

# ハンドルの取得を失敗した例
Revitアドインの開発中に、Revit起動後のアドイン実行中に下記のようなコードで、必要になったタイミングでウィンドウハンドルを取得しようとしました。ただ、原因がわからないですが数回に一度`GetCurrentProcess()`でRevitではないプロセスが返却される場合がありました。
この現象は記事に記載した方法で取得し、いつでも使用できるようフィールドで保持しておく形にすると、解消しました。
```C#
var process = Process.GetCurrentProcess();
var revitHandle = process.MainWindowHandle;
```

# Revitのウィンドウハンドルの使用例
一例ですが、開発中に使用する場面としては、アドインから新しい画面を起動する際に、Revitのウィンドウと親子関係を設定するときによく使用していました。
```C#
var view = new SampleView();
view.DataContext = new SampleViewModel();

if (revitHandle != IntPtr.Zero)
{
    // Revitのメインウィンドウを親にする
    var wnd = new WindowInteropHelper(view);
    wnd.Owner = revitHandle;
}

view.ShowDialog();
```
SalesforceMFA設定でデータローダでログインする方法

本橋孝昭です

今回はSalesforce　MFA設定されている環境でデータローダでログインする方法を確認します

なお、playground環境でMFAログインを試したい場合、ユーザの権限に
「ユーザーインターフェースログインの多要素認証」を付与しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d56d1f0e-c4ca-9b1f-ea6f-5c9016feec82.png)




## パターン1 MFAでログイン方法


Oathでログインする方法です
こちらでユーザ名、パスワードを入力しログインしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9d12c52b-245a-4b2a-1d00-24f9cd159638.png)

そうすることでMFA画面が出てログインすることができます

今回のパターンは、MFAでのログインのパターンです


次はMFAをしないでデータローダでログインする方法をご説明いたします

## パターン1 MFAではないログイン方法

まず事前準備としてユーザに
「API ログインの多要素認証」権限を付与しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7d8aa06b-e607-a018-af2c-2eb58abaf849.png)

そしてデータローダのこちらの画面から
・Usernameにユーザ名
・Passwordにパスワード+認証コードの6けたの数字

となります


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/09c32d67-5e94-35f5-7a68-f8b6d1d924e6.png)


なお認証コードとはこちらの拾い物画像だと745452となりますので
「パスワード+745452」をPasswordに入れてください
（※）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/df44f8ce-2ee5-885b-5d05-2cd6dede74f2.png)

※画像参考元

https://play.google.com/store/apps/details?id=com.salesforce.authenticator&hl=en_US&pli=1


そうするとログインが成功します

「API ログインの多要素認証」権限を付与した権限の場合、MFAの画面が出てこなくてログインが便利ですね
解いてみた。「Sランク：文字列収集」

# 問題
[「Sランク：文字列収集」](https://paiza.jp/works/mondai/real_event/word_collection)

# コード
Javaで解いてみました。

``` Java
import java.util.*;

// 文字列とその値段を保持するクラス
class StrPrice {
    public String str = "";
    public int price = 0;
} 

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int nN = sc.nextInt();
        int nM = sc.nextInt();

        // 文字列とその値段の読み込み
        StrPrice[] asp = new StrPrice[nN];
        for (int i = 0; i < nN; i++) {
            StrPrice tmp = new StrPrice();
            tmp.str = sc.next();
            tmp.price = sc.nextInt();
            asp[i] = tmp;
        }

        // 購入する
        for (int i = 0; i < nM; i++) {
            String sQ = sc.next();
            int nPrice = 0;

            for (int j = 0; j < nN; j++) {
                if (asp[j].str.startsWith(sQ)) {
                    nPrice += asp[j].price;
                }
            }

            // 結果出力
            System.out.println(nPrice);
        }
    }
}

```

# 解説
## 標準入力からの数値の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。

## 文字列とその値段の読み込み
next()メソッドとnextInt()メソッドによる読み取りを行い、クラスStrPrice に格納し、配列に保存します。

## 集める文字列の検索と値段の合計
String クラスの startsWith() メソッドを用いて、文字列が前方一致するか調べます。一致した場合、買い（値段を足し）ます。
djangoの汎用手順

## Django汎用手順
djangoを学習し始めで忘れないように作りました。

```bash
# Python仮想環境(venv)の作成
python -m venv venv

# 仮想環境をアクティベートする（Mac/Linuxの場合）
source venv/bin/activate

# pipのアップグレード（任意）
pip install --upgrade pip

# Djangoのインストール
pip install django

# Djangoプロジェクトの作成
django-admin startproject <プロジェクト名>

# プロジェクトディレクトリに移動
cd <プロジェクト名>

# 初期マイグレーションの実行
python manage.py migrate

# アプリケーションの作成
python manage.py startapp <アプリ名>

# アプリケーションをプロジェクトの設定に追加（settings.pyを編集）
# settings.pyのINSTALLED_APPSにアプリ名を追加
# INSTALLED_APPS = [
#     ...
#     '<アプリ名>',
# ]

# プロジェクトのルートURL設定を編集（urls.pyを編集）
# アプリ用のパスをincludeで追加
# from django.urls import path, include
# urlpatterns = [
#     path('admin/', admin.site.urls),
#     path('<アプリ名>/', include('<アプリ名>.urls')),
# ]

# アプリのurls.pyを作成し、基本のルーティングを設定
# from django.urls import path
# from . import views
# urlpatterns = [
#     path('', views.index, name='index'),
# ]

# views.pyで基本的なビューを設定
# from django.http import HttpResponse
# def index(request):
#     return HttpResponse("Hello, Django!")

# 開発サーバーを起動して動作確認
python manage.py runserver

```
フレームワークと言語の違い。FlutterとDartの違い。

https://apps.apple.com/jp/app/%E9%9A%9C%E5%AE%B3%E8%80%85%E6%89%8B%E5%B8%B3one-%E6%89%8B%E5%B8%B3%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E6%96%BD%E8%A8%AD%E3%82%92%E6%8E%B2%E8%BC%89-%E7%B0%A1%E5%8D%98%E3%81%AB%E7%99%BA%E8%A6%8B%E3%81%A7%E3%81%8D%E3%82%8B/id6544791256



# FlutterとDartの違い/フレームワークと言語の違い
どうも超初心者プログラマーです。

ずっと個人アプリ開発をしているのですが基礎的なことを振り返ろうということで書きました。
参考になればとても嬉しいです。


## Dartとは

Dartのコード例
Dartはプログラミング言語で、Flutterの開発に使われます。まずは、基本的なDartのコードを書いてみます。

```dart
void main() {
  String greeting = 'Hello, World!';
  print(greeting);
}

```
このコードはDartの基本的なプログラムで、Hello, World!という文字列をコンソールに出力します。Dartは、単独でプログラムを書くことができる言語です。他の多くのプログラミング言語に似た構文を持っています。


## Flutterとは
次に、Flutterを使ったDartのコードを見てみましょう。Flutterは、DartでモバイルアプリケーションやWebアプリケーションを開発するためのフレームワークです。

```dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Hello, Flutter!'),
        ),
        body: Center(
          child: Text('Welcome to Flutter!'),
        ),
      ),
    );
  }
}

```


このコードはFlutterを使った簡単なアプリケーションで、「Hello, Flutter!」と書かれたタイトルバーと、「Welcome to Flutter!」というテキストが中央に表示される画面を作成します。

## 違いのポイント
Dart: プログラミング言語で、データの処理やロジックの記述に使われます。Dart自体はFlutterを使わなくても単独で動作します。
Flutter: フレームワークで、Dartを使ってユーザーインターフェースやアプリケーション全体の構造を作成するためのツールです。Flutterは、Dartのコードを使ってアプリを作るためのテンプレートや便利な機能を提供します。
Gatsby,microcms,でJamStackな個人サイトを構築！！

# 概要
タイトルの通り、技術ブログ、成果物の紹介などを行うための個人サイトを作成しました。まだ完成とは言い難い状況ですが、一定まとまったので記事にします！
使用した技術は主に、react(gatsby)、TailwindCSS、DaisyUI、microCMSで、cloudflareでホスティングしています。ヘッドレスcmsを用いたJamStackなサイトなっております。
管理が楽で表示も高速、JamStack気持ちいい〜ですね〜⊂( `ᾥ´ )っ⚡️
ランニングコスト0なのも個人サイトには嬉しすぎます。


↓以下サイトとなります。拙いですがソースコードも公開しています。
https://augustaro.com/
https://github.com/AugusTaro/MyAwsomeSite

## 経緯
フロントエンド(react)の学習がひと段落したので、今後の個人開発の拠点となる個人サイトを作ることにしました。

## 技術選定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/c049020a-fa9e-b5e9-b9fe-0e2459c84b69.png)



使用する技術を選ぶにあたり、以下の点を意識しました。

- 静的生成しcdnで配信すること
- ランニングコストを0にする
- 収益化可能
- クライアントに返すjsを最小限に抑える

以上を意識し技術選定を行いました。各技術について、詳しい選定の意図は以下の通りとなります。

### Gatsby
インタラクティブなサイトではなく、コンテンツを配信するのみの静的なサイトを作りたかったのでSSGを選択しました。またNextではなくGatsbyを選びました。（Nextで良かった感も否めませんが。。。）
理由としては、プラグインの利用によって画像の最適化が簡単に行えるためです。Nextでも簡単に遅延読み込みなど実装できますが、バックエンドの処理が必要となることから、ホスティングがVercel一択となるため今回はgatsbyを採用しました。（Vercelを避けた理由についても後述します。）

### Cloudflare
ホスティングはCloudflareを利用しています。サーバーを持ちたくないのでホスティングサービスを利用した静的なサイトとしたい、コストが少しでも発生するとサイトを閉じる理由になる、1円でも収益化できたら大きなモチベーションに繋がる、以上を考え要件を以下のとおりとしたところ消去法で決定されました。
- ホスティングサービスであること(非レンタルサーバー)
- 収益化可能
- ランニングコスト0(ドメインの利用料除く)

Netlifyとも迷いましたが
- 速度が日本だと遅い（といっても速い）
- 無料分を超過した場合課金される

といった点から却下しました。
またVercelは無料プランだと収益化不可であるため見送りました。
### TailwindCSS with DaisyUI
SSGかつCSRも最小限というところで、どうせなら限界までバンドルするjsを減らしたいと思いTailwindを選びました。（パフォーマンスへの影響などはあまり理解していません、、、）
一からコンポーネントをつくるのはしんどいので、純Tailwind製UIコンポーネントライブラリである、DaisyUIを採用しました。Tailwindのコンポーネントライブラリはまだ情報が少なめなので開拓したいですね〜

### microCMS
cmsを提供するサービスも複数あり迷いましたが日本製で評判の高いmicroCMSを採用しました。詳しくは触れませんが個人利用の範囲であれば無料プランでも全く問題なく快適に利用できます。APIがhtml形式でコンテンツを返してくれるので、そのまま貼り付けてもいい感じに表示できるのが好きです、また日本製なのも嬉しいところ。（ほぼここが選定理由かも、、、、）

# 今後の展望
qiitaなどに記事を投稿する際は、こんなの出しても平気かなと尻込みしてしまうので、適当な記事は積極的に個人サイトにpostして上手に描けたらQiitaなど棲み分けができれば良いかなと思います。
今後の個人サイトの進捗についてもどんどん更新していくつもりなので、ぜひ遊びに来てください！
【Unity】Android / iOS でAudioMixerを使ったボリューム変更ができない問題への対処

# 概要
ゲームをプレイしているとよく見るオプションからBGMやSEの音量を変更する機能。これを実現するのに、Audio Mixer の Group 機能を使った方法をよくネットで見かける。Edior　ではなんら問題なく動作するが、Android や iOS でビルドすると音量変更が全然動作しない。この記事はこの問題に対する対策を記録するためのもの。

# 結論
Audio Source の存在する Prefab 全てに、Audio Mixer Binder という自作のコンポーネントを追加することで解決。Audio Mixer Binder の振る舞いとしては、当該 Prefab がインスタンス化された際に、SoundManager と結合している Audio Mixer から、各種 Audio Mixer Group を取り出し、Audio Source の outputAudioMixerGroup を上書きして参照解決するというもの。

```c#:AudioMixerBinder.cs
	public class AudioMixerBinder : MonoBehaviour
	{
		private AudioSource audioSource;

		void Start()
		{
			audioSource = GetComponent<AudioSource>();

			// audioSource に設定されているものと同じミキサーグループをサウンド管理から得る
			var groups = Manager.Sound.GetMixer().FindMatchingGroups(audioSource.outputAudioMixerGroup.name);

			// 指定したミキサーグループがあるか？
			if (groups.Length == 0)
			{
				Print.Game.Error("[Audio] Not found audio mixer group. name=" + audioSource.outputAudioMixerGroup.name);
				return;
			}

			// ミキサーグループを設定する
			audioSource.outputAudioMixerGroup = groups[0];
		}
	}
```
見てわかる通り、AudioSource にあらかじめ設定されている AudioMixerGroup と同じ名前の AudioMixerGroup をSoundManagerから取り出して上書きしている。こうすることで、SoundManager の管理する AudioMixerGroup のたとえば、BGM などの音量を変更すると、ちゃんと当該 AudioSource の音量も変更されるようになった。

# 参考にした記事
https://discussions.unity.com/t/audiomixer-sub-groups-volume-on-android/898472/2
この記事によると、Addressable のビルドを行うことで、Audio Mixer が各 Audio Source ごとのパッケージにハードコピーされるとのこと。つまり、SoundManager 側にアタッチしている Audio Mixer をいくら操作しても、全然別のメモリに存在する Audio Mixer を使って動いている Audio Source のボリュームは変更することができないということになる。参考記事のコメントにもある通り、挙動や理由は理解することができるが、直感的ではないし、Editor では問題なく動作するので本件はUnity側にどうにか対応してほしいと思う。

# 環境
Unity 2022.3.39f1
【豆知識】リンク先の設定。どうやって決まるのか、理解度が少しアップした

# はじめに
課題がだいぶ進んできていますが、いまいちリンク先の設定があいまいな私。
今回は少し理解度がアップしたので、簡単な例をつけてリンク先の設定方法についてアウトプットして解像度をあげたい

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3


## 状況
```java
<%= link_to 'パスワードをお忘れの方はこちら', new_password_reset_path, 
```
上記コードのリンク先を＃から変更したが、書籍などを参考に変更しただけで理解不十分だった。
変更箇所のコードはどうやって決めることができるのか・・・。


## こういう事だった

リンク先を変更したい場合は、`link_to` ヘルパー内のURLやパスを指定する部分（今回の場合は `new_password_reset_path`）を変更する必要があります。これを決めるには、アプリケーションのルーティング**config/routes.rb**を確認し、目的のアクションに対応するパスを指定します。

以下に、リンク先を決定する手順になります。

### 手順

1. **ルーティングを確認**: ルーティングファイル `config/routes.rb` を確認します。このファイルには、コントローラーとアクションに対応するパスが定義されています。
    
    例:
    
    ```ruby
    resources :password_resets, only: [:new, :create, :edit, :update]
    ```
    この場合、`new_password_reset_path` は `PasswordResetsController` の `new` アクションに対応しています。
    
2. **目的のアクションを確認**: 目的のアクションがどのパスに対応するかを確認します。たとえば、`edit` アクションに対応するパスを使いたい場合は、`edit_password_reset_path` を使用します。
3. **ヘルパーの利用**: Rails は自動的にルーティングに対応するパスのヘルパーを提供します。たとえば、`password_resets` リソースの `new` アクションの場合は `new_password_reset_path`、`edit` アクションの場合は `edit_password_reset_path` です。
    
    例:
    
    ```
    <%= link_to 'パスワードをお忘れの方はこちら', edit_password_reset_path(token: @token) %>
    ```
    このコードは、`edit_password_reset_path` にリダイレクトし、パスワードリセットトークンをクエリパラメータとして渡します。
    
4. **変更内容を反映**: 目的のパスを決めたら、それに対応するヘルパーを `link_to` の第二引数に渡します。


## さいごに
特定のアクションにリンクさせたい場合、そのアクションに対応するパスのヘルパーを利用。ルーティングに詳しくなれば、どのパスを使用するかを簡単に決定できるようになるので、いろんな人のコード見てどこに何が書いてあり、どこからそのリンク先を指定しているのか、学習していきたいと思います。
[paiza]あんぱいあー（野球の審判 (paizaランク C 相当)

# そろそろ審判ってAIにならないのか？
野球に然り、オリンピックに然り、誤審がどうのこうのって騒がれてるけど、
AIじゃなくてもいいけどビデオ判定で全部済ませればよくね？とか思っちゃう今日このごろ。
そしたら審判分の人件費浮くよね？（カメラとかの維持費のほうが高いのかしら？

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/umpire

# チェック処理とかは端折ってる
/** ここから定型文 */
ここで記載したクラスについては、
[こっちの記事](https://qiita.com/AsilHatake/items/40204293bdf59cb9f9d8)に書いてある、標準入力をList化したりしてるMainクラスから呼び出す予定だし・なんか継承したりしてるYO!!

ちな、Mainを実行して標準入力から入力するのクソ面倒くさいので、
Java編については問題の入力例をパラメータにしたテストクラスとかも作って公開するYO!!

<details open><summary>開発・実行環境はこんな感じ</summary>

- VSCode
- Java 17
- jUnit 5.9
- maven

pom.xmlはこんな感じ

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.co.asil</groupId>
    <artifactId>paiza202408</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
```

</details>
/** ここまで定型文 */

## 実装クラス 
```java:Umpire.java
package jp.co.asil.paiza202408;

import java.util.List;
import java.util.stream.Collectors;

public class Umpire extends Question {

  public Umpire(List<String> list) {
    super(list);
  }

  @Override
  public List<String> answer() {
    // カウンター（ストライク数、ボール数）
    int[] counter = { 0, 0 };
    return list.subList(1, Integer.parseInt(list.get(0)) + 1).stream().map(ball -> {
      String ret = "";
      if (ball.equals("strike")) {
        counter[0]++;
        ret = counter[0] == 3 ? "out!" : "strike!";
      } else if (ball.equals("ball")) {
        counter[1]++;
        ret = counter[1] == 4 ? "fourball!" : "ball!";
      }
      return ret;
    }).collect(Collectors.toList());
  }

}
```

## 実装クラス 
```java:UmpireTest.java
package jp.co.asil.paiza202408;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;

import java.util.List;

import org.junit.jupiter.api.Test;

public class UmpireTest {
  @Test
  void testAnswer1() {
    Umpire testClass = new Umpire(List.of("5",
        "ball",
        "strike",
        "ball",
        "strike",
        "strike"));
    assertArrayEquals(testClass.answer().toArray(), new String[] { "ball!",
        "strike!",
        "ball!",
        "strike!",
        "out!" });
  }

  @Test
  void testAnswer2() {
    Umpire testClass = new Umpire(List.of("6",
        "ball",
        "strike",
        "ball",
        "ball",
        "strike",
        "ball"));
    assertArrayEquals(testClass.answer().toArray(), new String[] { "ball!",
        "strike!",
        "ball!",
        "ball!",
        "strike!",
        "fourball!" });
  }
}
```

# まとめ
ifの中でifをネストさせたくなかったため、多項式で文字列を設定するようにしてみました。
初めてのCI/CD! supabase! firebase!

# はじめに
プログラミングスクール「JISOU」のカリキュラムで
CICDでアプリケーションをデプロイできたのでまとめます

# やったこと
- React + Vite によるフロントエンド開発
- supabaseでバックエンド（DB）
- Jestでテスト
- firebaseでデプロイ
- github actionsでCICD

# Reactやってみた
普段業務でvueで開発してます
Reactの入口だけ触ってみた感じだと
第一印象は結構vueと違うな〜って感じでした
もちろん書き方が色々違うのは当然なんですが
変数の状態が変更されるときに、もう一度コードが上から再評価される仕組みなど
仕組み自体も結構違って、頭の切り替えが大変でした
もう少しReact触ってみたら,VueとReactの比較記事書きたいです

# supabaseについて(DBのみ)
めっちゃ楽やん！！！
まずデータベースをGUIでさらって作れて嬉しいし
それをフロントで呼び出して使うのもすっごく簡単
今までrailsでmySQLでDB構築したり
AWSのDynamoDBを使ったことがあるけど
ダントツに楽に構築できた。素晴らしい。

とはいえまだ、単純なgetやpostやdeleteしかやってないので
色々複雑なことをやろうとするとまた別の感想が出てくるのかもしれないけど...
例えば、今開発環境でも本番環境でも同じDBを参照してしまっているので
実際にサービスをリリースしようとしたらこのままじゃ明らかにアウトなので、今後はそこら辺も学んでいきたいです

初学者がとにかくアプリケーションをデプロイしたい、DBにデータ持たせたいって時は
とっても良さそう

# Firebaseについて(hostingのみ)
こちらもとっても簡単だった。
ただ、こちらはほとんど参考の手順通りにやってdeployまでやってるだけなので
あんまり理解はできてない感がある

# CI/CD
務めている会社でもCI/CDは推奨なんだけども
今開発しているプロダクトではCDが難しい開発環境で、ずっと対応できておらず
具体的な手法は今回初めて学ぶことができた
github actionsによるCI/CDをやってみた結果
やってみるだけなら意外と簡単だった
（.github/workflowの中に手順を書いたymlを置いてpushするだけ）
ymlファイルのベストプラクティスは色々学ばないとかもだけど、それはおいおい

CIなら早速業務でやるように提案してみよかな

# まとめ
すごく学びの多い課題だった！
業務がフロントエンド開発なので、やはり普段の学習もそちらにフォーカスが行きがちになっていたので
このカリキュラムで今まで触れたことのないものをたくさん触れられた
一度触れられたらこっちのもんで、あとは遊び倒しながら学んでいきたい

最終的にはすべて自己解決できたけど、もちろん初めてのことには付きもののエラーにはたくさん悩まされた
一つやるごとにエラーが出る...笑
でも、エラーを一つずつ潰して、アプリがきちんと画面に表示されるようになるのはやっぱり楽しい
これだからやめられないぜ！笑

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからお願いします👇

https://projisou.jp
AmplifyにXドメインの独自ドメインを設定する方法


アプリケーションのデプロイについては省略します。  

今回は手持ちのドメインのサブドメインとして登録してみます。  

## 設定方法

1. Amplify の設定画面から `ホスティング` → `カスタムドメイン` を開きます。  
   `ドメインを追加` を押下します。  

   ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/dd0ce62c-3ec0-9066-003f-41a5538ea0d4.png)

1. 設定したいドメイン名を入力します。  
   `手動設定` を選択し、 `ドメインを設定` を押下します。 

   ![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/18f2c408-1700-8844-eac0-28fdd9242940.png)

1. サブドメインを確認し、問題がなければ `Amplify マネージド証明書` を選択して `ドメインを追加` をクリックします。  

   ![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/d47d1c4b-81d1-01e7-d4a3-40ffa85109e5.png)

1. 表示された 3種類の `CNAME` をXドメインに設定していきます。  

   ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/5f4ae5f0-18a0-9a2a-3957-9e76f4b017e1.png)

1. Xドメインの設定画面を開き、 `DNSレコード設定` を開きます。  
   Amplify に設定したいドメインの `選択する` を押下します。  

   ![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/a18e940f-4d16-f95c-dc0b-fd6563478c4c.png)

1. `DNSレコード設定を追加する` を押下します。  

   ![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/0ea8c1c3-c3d3-04c6-ab32-645a63328207.png)

1. Amplify のカスタムドメイン設定で表示された3種類の `CNAME` を順に登録していきます。  

   1. 所有権確認用の `CNAME`

      ![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/618a7d07-f6e4-cb3a-0158-05271e1a6f59.png)
      ![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/bec99ad9-9221-a2b2-ae69-37ddaaad3978.png)

   1. 設定したいドメインの `CNAME`

      ![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/92ba316f-21bb-314c-86ce-f16597740d5d.png)
      ![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/4a52911b-c0a6-2064-cbcf-6aca542d3d8b.png)

   1. `www` 用のドメインの `CNAME`

      ![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/48646d5d-f62a-bfe7-1310-606a7b634a1f.png)
      ![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/74d00d3b-64a7-7a05-d7f5-acd3dc1f9ade.png)

1. DNSレコードの設定が終わると、 Amplify のドメインも自動的に反映されます。  
   反映されるまでしばらく待ちます。  
   今回は10分くらいで反映されました。  

   ![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/fcf35140-70b5-1575-b69e-918c6831a490.png)

1. 最後に設定したドメインでアクセスができるか確認して完了です。
【Laravel】依存性注入(DI)とは

## 依存性注入とは
依存性注入（Dependency Injection、DI）とは、ソフトウェア設計パターンの一つで、クラスがその依存オブジェクトを自分で生成するのではなく、外部から提供される方法。

## 実装例
```php
public function __construct(
//コンストラクタの引数
//このクラスが動作するために必要な依存オブジェクト。
//Mainというサービスと、Factoryという工場（ファクトリー）クラスを依存として受け取る。
   Main $main_service,
   Factory $apply_validate_factory
) {
//依存オブジェクトの代入
//コンストラクタで受け取った依存オブジェクトをクラスのプロパティに代入。
//これにより、クラス内の他メソッドでこれらを使用できる。
   $this->main_service = $main_service;
   $this->apply_validate_factory = $apply_validate_factory;
}
```


## DIのメリット
柔軟性の向上:異なる実装を容易に差し替えられる。
テストの容易さ: ユニットテストがしやすくなる。
コードの再利用性:同じクラスを異なるコンテキストで再利用することが容易になる。

## 具体的な使用例
```php
class MyController extends Controller
{
    protected $main_service;
    protected $apply_validate_factory;

    public function __construct(Main $main_service, Factory $apply_validate_factory)
    {
        $this->main_service = $main_service;
        $this->apply_validate_factory = $apply_validate_factory;
    }

    public function index()
    {
        // ここで $main_service と $apply_validate_factory を利用
    }
}
```
ESP32: LEDの制御の簡単な例 (PWM)

## プログラム

```text:ledc_ex03.ino
// ---------------------------------------------------------------------
//	ledc_ex03.ino
//
//						Aug/19/2024
// ---------------------------------------------------------------------
#define HAPTIC_PWM_BITS     8
int ledpins[8] = {32,33,25,26,27,14,12,13};

void setup() {
	int freq = 175;

for (int it=0; it<8; it++)
	{
	pinMode(ledpins[it],OUTPUT);
	ledcAttach(ledpins[it],freq,HAPTIC_PWM_BITS);
	}
}

// ---------------------------------------------------------------------
void loop() {
	int pattern[8] = {16,32,64,256,64,32,16,0};

	for (int it=0; it<8; it++)
		{
		for (int jt=0; jt<8; jt++)
			{
			ledcWrite(ledpins[it],pattern[jt]);
			delay(250);
			}
		delay(250);
		}
}

// ---------------------------------------------------------------------
```
パーフェクトRubyonRails備忘録5

# ActiveJobによる非同期実行

- どういう時に使う？
    - リクエストからレスポンスまで時間がかかりそうな時などに、レスポンスだけ返して処理は非同期で実行する
- ジョブの実装
    - ジョブクラスの生成
    
    ```bash
    rails g job async_log
    ```
    
    - `app/jobs/async_log_job.rb` ファイルとテストファイルが作られる
    - ジョブクラスの実装
    
    ```ruby
    class AsyncLogJob < ApplicationJob
      queue_as :default
      
      def perform(message: "hello")
        AsyncLog.create!(message: message) # 実行したい処理を書く
      end
    end
    ```
    
    - ジョブをキューに入れる
        - ジョブの実行はバックエンドが担当する(ややこしや)
        - デフォルトのバックエンドは `async`
        - 追加方法
            - `AsyncLogJob.perform_later`
            - バックエンドキューにジョブを追加し、非同期実行している
        - 実行タイミングの指定もできる
            - `AsyncLogJob.set(wait: 1.minute).perform_later`
            - １分後にバックエンドキューに追加される
            - `wait_until`で実行日時の指定もできる
- ジョブへ渡す引数には制限がある
    - 利用できるオブジェクトの代表例
        - 基本型(Nil, String, Integer, Float, BigDecimal, True, False)
        - Symbol
        - 日時を扱う型
        - Hash
        - Array
        - ActiveRecord
- 複数キューの管理
    - `queue_as :default`となっている部分を `queue_as :async_log`などに変更することでジョブごとにキューを扱える
    - バックエンドがsidekiqの場合、 `sidekiq.yml`ファイルに追加したいキューを追加し、sidekiqプロセスを再起動する必要がある
    
    ```yaml
    # config/sidekiq.yml
    :queues:
      - default
      - aysnc_log
    ```
    
- ジョブの例外処理
    - ジョブのリトライ
    
    ```ruby
    class AsyncLogJob < ApplicationJob
      # 略
      retry_on StandardError, wait: 1.minute, attempts: 3
      # StandardErrorになったら１分待って、３回まで再実行する
      # 例外は複数指定可能
    ```
    
    - ジョブの破棄
    
    ```ruby
    class AsyncLogJob < ApplicationJob
      # 略
      discard_on StarndardError
      # StandardErrorになったらジョブを破棄する
    ```
    
- 詳細は以下
    
    [Active Job の基礎 - Railsガイド](https://railsguides.jp/active_job_basics.html)
【Rails】button_to_functionが使用できない

## はじめに
Railsのアップデート中にbutton_to_functionを使用している箇所でエラーが出たので、その対応をまとめます。

## 問題
以下のように、button_to_functionを使用するとエラーがでます。
```ruby
<%= button_to_function "ボタン", "clickButton()", {:class=> "button"} %>
```

## 解決方法
button_to_functionはRails4.1で削除されました。
javascriptなどでボタンをクリックしたときのコードを実装します。
```ruby
<a href="#" id="button" class="button">ボタン</a>

$(document).ready(function() {
  $("#button").click(function() {
    clickButton();
  });
})
```

## 参考
https://www.techscore.com/tech/Ruby/rails-4.0/view/
第一回：【プログラミングは理系？文系？】勉強の方法とルール

こんにちは、[株式会社カスタマトリックス](https://www.customatrix.co.jp/)の寺尾です。

本日より **新卒社員と学ぶWEBプログラミング** 企画を開始します。
可能な限り毎日更新していくのでご期待ください。

本日は第一回ということで「**今回の勉強企画の勉強方法とルールについて**」を説明していきます。

# プログラミングの勉強ってむずくない？
プログラミングと聞くと一定数の人間は数学アレルギーが再発するのではないかと思います。
しかし現代におけるプログラミング、とりわけWEB系プログラミングにおいては数学的知識は凝った事を求めない限り「変数(x=?)」程度であり、中1レベルです。

むしろプログラミング言語を理解し読み解く力が必要なので **プログラミングは文系科目** といっても過言ではない...とまでは言えないかもしれないですが、初歩知識の点で簡単といえるでしょう

# 勉強の方法（前提）
物事を記憶する事について、私は二つのアプローチがあると考えています。

- そのまま覚える派
- 間接的に理解を深めて導き出す派

```数学や物理の公式を覚える際.
1. 「sin(90∘−θ)=cosθ」と公式を丸覚えする
2. 「sinθ = a / c」「cosθ = b / c」という情報と直角三角形を照らし合わせて変換公式を導き出す
```

もちろんこれは非常に簡単な例ですが、多くの場合はこのように分けられます。

さて、これは理系にのみ当て嵌るのでしょうか？
日本史に置き換えてみましょう。

```本能寺の変の時期を覚える際.
1. 1582年6月21日明智光秀が謀反を起こした
2. 「織田信長は1500年代に活躍した・1500年末期には秀吉が天下を統一した」という情報から1570~1589あたりに起きたのだろうと導き出す
```

こんな感じになると思います。
当然テストでは1のやり方の方が適切で良い点を取れるのですが、今からちょっとした雑談や仕事に役立てるとしたらどうでしょうか？

プログラミングに限らず物事は「特定の何かだけ覚えている」より「 **自分の知識を組み合わせて新しい知見を生み出す** 」方が幅も効いて良いですよね！

# 勉強の方法（本筋）
つまりどういう勉強をして欲しいのか、教えていくのかを書いていきます。

今回の企画は一発で完璧なエンジニアを目指すものではありません。まずは「会話の通じるプログラマ」を目指していただきます。

```今回の勉強で気を付けるべきこと.
1. まずは分からなくても「単語」を知る事
2. 分からない単語であればメモをする事
3. 少しずつ分かる単語を増やす事
4. どこかのタイミングで過去の単元を復習し、自分で意味を導き出す事
```
先ほど説明した「導き出す」を成し遂げるには、まずは知ってる知識の幅を広げていくしかありません。
その種まきとしてこの企画で多くの「単語」を提示するので、それをまずはメモして、企画記事で学ぶなり自分で調べるなり、質問をするなりして知識の幅を広げていきましょう。

これを自分は洞察学習の一つと考えて運用、推奨しています。

# 今回の企画のルール
さて、今回の企画中のルールを記述します。

```ルール.
1. 無知の知を努力する
2. 「とりあえずやってみる」の禁止
3. 自分で説明できない事は実行しない
```

1については方法のところでも話した通り、「知らないことを自覚する」事が非常に重要なためそれについて努力を心がけましょう。

2について、「一旦作ってみよう」でプログラミングに手を出すと基本挫折を味わいます。（そんな簡単にゼロ知識でTODOリストを作れたら仕事として稼ぎにならないので...）
挫折を味わう回数は原則減らす方向に動きましょう、試行錯誤は最後の手段で細かいところに対して適用するべきです。完全に折れてPC触らなくなったら二度とエンジニアになる機会を失ってしまいます。

3はほぼ2と同じですが、「自分で説明できないコードは基本書かない」ということです。
どうやったら停止できるか自分でも分からない時限爆弾を作りたいでしょうか？そんな事はないでしょう。

# まとめ
全編を通して今回の企画で気を付けてほしいのは「 **知らない事象そのものを無理に知る必要はない、知らない単語から少しずつ知っていこう** 」です。
日常のニュース、会話、読書、いろんな所で理解せずにそのまま忘れている知らない単語が見えてきた時、一気に人生の幅が広がる事でしょう。

さて、明日から実際に勉強を開始します。
まずはWEBサイトの仕組みやインターネット・通信などの基礎部分からになります。
深堀はしないものの早速知らない単語だらけだと思います。知らない事は何も悪くないので一つ一つ立ち向かっていきましょう。

# おまけ
株式会社カスタマトリックスはエンジニアを募集しています！
完全未経験でも可！

- 新卒の方
https://www.customatrix.co.jp/newgrads/index.html

- 中途の方
https://customatrix.co.jp/career/index.html

https://www.instagram.com/cmx_pr/
[SOLVED] two wifi drivers to activate Wifi5 in linux mint ver. 22 

 Wireless USB adapters used presently are Buffalo WI-U2-433DM that would have the rtl8812au specification, and Chinese EDUP with the rtl8811au.
 The PC used is FMV-AH550/5B (core i5, memory 4Gbx2, SSD 500Gb). There is no option for a 'secure boot' in the BIOS. The OS is the Linux Mint Wilma Cinnamon ver.22.

 I could not set up the wifi on the Q4OS and the Ubuntu 22.04LTS at all, which was unexpectedly troublesome. But as I got to understand more about the linux, I am able to set up the wifi.
 
 Anyway in conclusion, it is found that if the rtl8821au is installed correctly in the linux mint, the rtl8812au works at dual bands (2.4/5GHz).

 The procedure to install the drivers is as follows, referring to https://github.com/morrownr/8821au-20210708 [Note],*

$ sudo apt install git
$ git clone https://github.com/morrownr/8821au-20210708
$ cd 8821au-20210708
$ sudo sh install-driver.sh
and,
in case input Y,
    cntl+x to quit then, 
    Y ---> rebooting

 After rebooting, either of the USB adapters is plugged in, then the 5GHz band is selected, hence the connection speed is about 300Mbps (upload: 220Mbps).
 
Note:
 *Another version is in 
https://github.com/morrownr/8812au-20210820, which can also be used to activate the wifi.
自宅にて勉強してみたが…

本日はなるべく誘惑が目につかないような部屋で勉強をしてみた。
悪くはないがやはり自宅というだけで怠け気味になってしまった…。
とは言っても思ったよりは集中できていたような気がするし、なにより帰る時間や外に出なくて良いので気楽に勉強できました。
時々…というか自宅勉強がメインになるかもしれません。

最近母と「家を建てるならこんな部屋があったらいいな」という話が出て、コワーキングスペースで盛り上がりました。
なおさら欲しくなっちゃいましたね。

<br>

いつものようにAWSコンソールにログインしようとした時のこと、
![CleanShot 2024-08-19 at 15.50.37@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798584/c0df002a-5bf7-3425-b011-26767becfa66.png)
なんだおまえ！？
IAMユーザーってなんだよ、いつもはメールアドレスとパスワードでログインできてたじゃねえか！
しかもアカウントIDの項目に既に数字入ってるけど、俺このページ初めてだぞ…。
本物のAWSサイトであることをよーく確認した後ユーザー名(メールアドレス)とパスワードを入力してサインイン。→失敗

まあIAMユーザーなんて作った覚えないですし…。いやはや、まずい、ログインができない…。

と焦っていると、「ルートユーザーのEメールを使用したサインイン」という文字(画像:サインインボタンの下)を発見。
クリックすると、いつものログイン画面だ！
ということで無事ログインできたのでした。
それにしてもなぜIAMログインページになったんだろう？焦っちゃったよ。

<br>

今日はSQL GUIツールを新調しました。
![CleanShot 2024-08-19 at 18.01.08@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798584/d52f2ab6-aa78-2361-0843-872413c85fd7.png)
彼の名前は**DataGrip**
よくわからないけどすごいやつ。

これに乗り換えた一番の理由は「peppyも使っているから」
モダンなデザインに加えてテーマをカスタムでき、さらにあのpeppyがテーマを配布しています。
[JetBrains Marketplace - ppy colours](https://plugins.jetbrains.com/plugin/22022-ppy-colours)
これは使うしかないでしょう。(既にテーマ適用済み)
まるで「友人が⚪︎⚪︎高校に行くから俺も行く」みたいな理由ですが大目に見てください。

JetBrains製品はこれが初めてで、他のツールも使っていたらさらなる恩恵が受けられるのでしょうが今の用途ではDataGripくらいですね。

他にも兄からTablePlusというツールも教えてもらっていたのでそちらも使いたかったのですが、今日はDataGripを優先させました。
また今度TablePlusも使ってみようと思います。
AWS Certified Cloud Practitioner 合格体験記

皆さん、こんにちは、WANGです。

私は8月17日にAWS Certified Cloud Practitionerの資格試験に合格しました。最終スコアは821点で、予想よりも少し低かったですが、無事に合格できてとても嬉しいです。

ここで、試験に合格するための心得を皆さんにシェアしたいと思います。

1. **勉強前の情報収集が重要です**
   この資格試験の前にAWSについての知識がほとんどなかったので、まずは公式サイトで試験の詳細情報を確認しました。AWS公式には試験範囲の詳細な説明があり、また各フォーラムで試験の難易度、試験内容、そして学習準備に関する議論を調べました。（Redditにはこの部分に関する議論が充実しており、英語が読める方はぜひ試してみてください）reddit sub @AWSCertifications

2. **学習内容**
   AWS公式が提供するホワイトペーパーは、少なくとも一度は読んでおくべきです。これによって試験の出題範囲や内容を大まかに理解することができます。また、ホワイトペーパーの説明は公式な表現が多く、第三者がまとめた内容よりも少し難解ですが、公式の内容に大まかな印象を持っておくことが重要です。私の経験から言えば、試験内容の用語はホワイトペーパーの表現と非常に一致しています。

3. **間違った問題を繰り返し練習することが非常に重要です**
   ここで、私が整理した学習ルートを皆さんに紹介します。

   1. [AWS Certified Cloud Practitioner Certification Course (CLF-C02) - Pass the Exam!] Youtuber @freecodecamp
      このYouTuberは、AWS試験のすべての内容を解説してくれます。試験に出題されるほぼすべての概念と詳細な説明を網羅しており、14時間の動画をすべて覚えることができれば、試験に合格するのは難しくないでしょう。

   2. **模擬試験について**
      1. [ExamPro CLF-C02](https://www.exampro.co/clf-c02)
         ここには無料の模擬試験があります。6つの模擬試験をすべて解放するには29.99USDが必要ですが、模擬試験の内容と難易度は非常に近く、また間違いを集めた再テストシステムも完備しており、個人的に非常にお勧めです。

      2. [Tutorials Dojo](https://portal.tutorialsdojo.com)
         RedditではTDとして知られており、こちらにも非常に充実した模擬試験があります。料金は10USDですが、試験の内容と難易度は実際の試験よりも難しいです。もし高得点を目指したい方にはこちらもおすすめです。70％程度の正解率を達成できれば、合格は間違いないでしょう。

4. **ノートについて**
   私は試験の時に緊張しやすいタイプなので、どの試験でも後悔しないように長時間準備します。この試験を2週間、さらには1週間で合格する方もいるようですが（この試験は比較的簡単だと言われています）、私は油断せず、約1か月半かけて勉強と練習を行いました。勉強と練習の比率は大体3:7で、大部分の時間を練習問題に費やしました。すべての間違った問題をノートに手書きすることで、印象を深めることができました。1か月半で2冊のノートが埋まりました。少し地道な方法ですが、試験に不安を感じている方にはおすすめです。

皆さんが試験に合格できることを祈っています！
Shift_JISに変換する際に『 〜 』が化けちゃう【波ダッシュ・全角チルダ問題】

## 解決策
文字列をShift_JISに変換する際 "～"が消える事例に遭遇した人へ
下記のコードを付けよう
<br>
~~~ ruby
# 全角チルダを波ダッシュに変換
.gsub('～', '〜')
~~~

## 原因
上のインライン部分に書いてあるとおり、実は"**～**"と"**〜**"は違う文字

全角チルダ " **～** "はShift_JISにエンコードする際バグってしまうみたい

https://www.tohoho-web.com/ex/dash-tilde.html
macでphpのバージョンを切り替える

1, Homebrewを最新の状態にアップデートし、アップグレード
```
brew update
brew upgrade
```
2, インストール可能なバージョンを確認
```
brew search php
```
3, 必要なPHPをインストール
```
brew install php@8.2
```
4, 以下で切り替えと反映
```
echo 'export PATH="/usr/local/opt/php@8.2/bin:$PATH"' >> ~/.bash_profile
echo 'export PATH="/usr/local/opt/php@8.2/sbin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
```
【O'Reilly】初めての自動テスト読んでみた。

# 初めに

個人的な都合で自動テストに詳しくならないといけないので今回の本を読んでみました。

www.amazon.co.jp/dp/4873118166

# 簡単にこの本ってどんなものなの？

Rubyを通して自動テストの初歩について解説しています。

テスター視点で自動テストの特徴や簡単な設計運用、単体・結合・E2E、TDDについて解説しています。

# どんな人が読むべきだと思う？

以下の人が読むべきだと思います。

- 自動テストに振れたことない・触れたばかりのテスターや開発者
- 自動テストにおける単体・結合・E2Eを簡単に知りたい人
- Rubyの自動テストを勉強したい人

逆に読まなくていい人はこんな感じです。

- 実践的な自動テストの設計運用を知りたい人
- JSTQBの試験対策
- 自動テストにおける単体・結合・E2Eを簡単に分かっている人
- Rubyにアレルギーを感じる人
- SPAやSSRのテストアプローチを知りたい人
- 手動・自動テスト関係ない汎用的なテストについて知りたい人
- 現在と2017年の違いを把握できない人

# 本の内容について詳細解説

## 1章

自動テストについて概要レベルで解説しています。

またテストピラミッドの解説もしています。

## 2~3章

E2Eテストのやり方をRuby・Capybaraで解説しています。

## 4章

結合テストの解説をしています。

本章における結合テストはAPIテストを指しています。

## 5章

RestAPIに対するAPIテストを解説しています。

## 6章

Rubyのユニットテストについて解説しています。

## 7章

JavaScriptによるフロントエンドのユニットテストについて解説しています。

しかし本書籍は2017年発行であるため、SPAではなくMPAに対するテストになっております。

またjQueryのテストも記載されています。

## 8章

テストピラミッドの詳細な解説をしています。

逆ピラミッドやトロフィーピラミッドの解説もあります。

## 9章

コードに慣れていないテスターのためにRubyの綺麗な書き方を解説しています。

簡単なリファクタリングも解説しています。

## 10章

綺麗なテストコードの解説をしています。

## 11章

モックの使い方を解説しています。

## 12章

TDDの解説をしています。

# 最後に

かなり初心者向けな内容でしたが、今まで読んできたオライリー本ではとても分かりやすい内容でした。(実務経験があるからかもしれんが….)

まるで原書が日本語であるかのように訳されたような文章に感じませんでした。
JavaScript/TypeScriptのテンプレートリテラル内改行でエラー回避(CSS-in-JSスタイリング)

## アジェンダ
JavaScriptやTypeScriptを使用して開発を行う際、コードの書き方がエラーの発生に大きく影響を与えることがあります。
私が遭遇したものでは、CSS-in-JSライブラリ（私の場合では、`@emotion/react`）を使ってスタイリングを行う際に、改行を適切に使うことがエラー回避に役立つ場合がありました。
本記事では、なぜ改行が重要なのか、簡単にまとめます。

## 実際の例(CSS-in-JSとテンプレートリテラル)
次のコードは、`@emotion/react` の `css` 関数を使用してボタンのスタイルを定義しようとしたものです。

```tsx
import { css } from "@emotion/react";

<button className={css`${hogeStyle};　${!hogeCheck ? hoverStyle : ''};　${fogoFlag ? fogoFlagStyle : ''};`} onClick={onHogeClick}>
    {value}
</button>
```

このコードは一見問題がなさそうに見えますが、JavaScript/TypeScriptのパーサー（コードを解析するプログラム）は、この記述を正しく解釈できず、エラーを引き起こしました。

## エラーの発生: `colon expected`

先ほどのコードで、以下のようなエラーメッセージが発生しました。

```
colon expected ts-styled-plugin(9999)
```

これは、JavaScriptやTypeScriptのコードで構文エラーが発生しており、CSS-in-JSの記述において、コロンが期待される場所で欠如しているか、記述が誤っている場合に発生するものになります。

## 解決法: 改行によるエラー回避

上記のコードでエラーが発生する理由は、テンプレートリテラルの中で複数な式が混在しているため、パーサーがそれを適切に解釈できないからのようです。JavaScript/TypeScriptのパーサーは、コードを解析する際に文法や構文に基づいてコードを分解しますが、複雑なテンプレートリテラルが一行で書かれていると、その境界を正確に認識できなくなるそうです。

この問題を解決するために、次のようにコードを改行して記述します。

```tsx
<button
  className={css`
    ${hogeStyle};
    ${!hogeCheck ? hoverStyle : ''};
    ${fogoFlag ? fogoFlagStyle : ''};
  `}
  onClick={onHogeClick}
>
  {value}
</button>
```

この改行により、パーサーは各部分をより正確に解析できるようになり、エラーがなくなりました。
改行があることで、CSSの各スタイルルールが明確に区切られ、パーサーがそれを誤解する可能性が減ります。

## 改行が重要な理由
この教訓から以下のような理由で、改行が重要だと言えます。

### 1. **構文の明確化**
   改行により、テンプレートリテラル内の構文が明確に区別されます。これにより、パーサーが各部分を正しく解析できるようになります。

### 2. **可読性の向上**
   改行を適切に使用することで、コードの可読性が向上します。複雑な条件分岐やスタイル設定が行われる場合、一行で書かれていると理解しにくくなりますが、改行することで視覚的に把握しやすくなります。

### 3. **エラーの回避**
   改行を使用することで、特定のエラー（例えば `colon expected` エラー）を防ぐことができます。これは、コードの構造が明確になり、パーサーが誤解する余地が少なくなるためです。

## まとめ
コードを書いていく中で、意図しないエラーが発生した場合、単に改行を入れることで問題が解決することがあります。
特に複雑なテンプレートリテラルを使用している場合は、このテクニックを活用することで、エラーの発生を防ぐことができるかもしれません。

## 参照
- [JavaScriptのテンプレートリテラル内で条件分岐を行う方法 – Webrandum](https://webrandum.net/javascript-template-literals-if/)
Paiza×Qiitaキャンペーン Javaで解説してみた【D Eメールアドレス 編】

# 問題へのリンク

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/email_address

# 解答コード

<details><summary>詳細</summary>

~~~

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		final String S = scanner.next();
		final String T = scanner.next();
		
		System.out.printf("%s@%s\n",S,T);
		scanner.close();
	}
}

~~~

</details>

# 解説

<details><summary>詳細</summary>

~~~

System.out.println(S + "@" + T);

~~~

でもいいんですが、個人的には書式がお勧めです。
String同士の演算だと、演算子毎に結合処理として新規のStringが生成されますので効率が悪くなります。2個だけなのでパフォーマンスとしては誤差ですが、これが癖づくと大規模なプログラムを組む際にボトルネックを生み出してしまう危険性があります。
StringBuilderを使うのもよいですが、出力時に表示方法を合わせるだけですので、書式を使う方が意図にあったプログラムでしょう。
"%s" は引数の値を文字として挿入する場所を示す文字です。

### 参考[^1]
[^1]: 執筆時、paizaのJavaは18

https://docs.oracle.com/javase/jp/18/docs/api/java.base/java/util/Formatter.html

## 注意点
printlnと異なり、printfには改行は含まれていませんので 

改行文字
~~~
\n
~~~

を最後につけることを忘れないようにしましょう。

</details>
binding.pryを使ったデバックの方法（Docker内で）

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## 手順
1．gem 'pry-byebug'をインストール
2．
```
docker ps（コンテナIDを調べる）
```
3．
```
docker attach (CONTAINER ID)
```
4.メソッド内に binding.pryを書く
5．ブラウザで確認したい画面を開く
6．ターミナルで値を確認する

## 終わらせ方
1.検証が終わったらexit
2.ctrl + (Pの後Q)
3.binding.pryをけす
ESP32: LEDの制御 (PWM)

こちらのページを参考にしました。
[LED Control (LEDC)](https://docs.espressif.com/projects/arduino-esp32/en/latest/api/ledc.html)

8個のLED の明るさを変化させます。

## プログラム

```text:ledc_ex01.ino
// ---------------------------------------------------------------------
//	ledc_ex01.ino
//
//						Aug/19/2024
// ---------------------------------------------------------------------
// use 12 bit precision for LEDC timer
#define LEDC_TIMER_12_BIT 12

// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 5000

int ledpins[8] = {32,33,25,26,27,14,12,13};

// define starting duty, target duty and maximum fade time
#define LEDC_START_DUTY  (0)
#define LEDC_TARGET_DUTY (4095)
#define LEDC_FADE_TIME   (3000)

bool fade_ended = false;  // status of LED fade
bool fade_on = true;

void ARDUINO_ISR_ATTR LED_FADE_ISR() {
  fade_ended = true;
}

int icount = 0;
// ---------------------------------------------------------------------
void setup() {
	Serial.begin(115200);
	while (!Serial) {
		delay(10);
	}

Serial.println("*** setup *** aaa ***");

	// Setup timer with given frequency, resolution and attach it to a led pin with auto-selected channel

for (int it=0; it<8; it++)
	{
	ledcAttach(ledpins[it], LEDC_BASE_FREQ, LEDC_TIMER_12_BIT);
	}

	// Setup and start fade on led (duty from 0 to 4095)
for (int it=0; it<8; it++)
	{
	ledcFade(ledpins[it], LEDC_START_DUTY, LEDC_TARGET_DUTY, LEDC_FADE_TIME);
}

	Serial.println("LED Fade on started.");

	// Wait for fade to end
	delay(LEDC_FADE_TIME);

	// Setup and start fade off led and use ISR (duty from 4095 to 0)
for (int it=0; it<8; it++)
	{
	ledcFadeWithInterrupt(ledpins[it], LEDC_TARGET_DUTY, LEDC_START_DUTY, LEDC_FADE_TIME, LED_FADE_ISR);
}

	Serial.println("LED Fade off started.");
}

// ---------------------------------------------------------------------
void loop() {
	delay(2000);
	// Check if fade_ended flag was set to true in ISR
	if (fade_ended) {
		Serial.print("LED fade ended icoount = ");
		Serial.println(icount);
		icount++;
		fade_ended = false;

		// Check if last fade was fade on
		if (fade_on) {
			for (int it=0; it<8; it++)
			{
			ledcFadeWithInterrupt(ledpins[it], LEDC_START_DUTY, LEDC_TARGET_DUTY, LEDC_FADE_TIME, LED_FADE_ISR);
			}

			Serial.println("LED Fade off started. loop");
			fade_on = false;
		} else {
		for (int it=0; it<8; it++)
			{
			ledcFadeWithInterrupt(ledpins[it], LEDC_TARGET_DUTY, LEDC_START_DUTY, LEDC_FADE_TIME, LED_FADE_ISR);
			}

			Serial.println("LED Fade on started. loop");
			fade_on = true;
		}
	}
}

// ---------------------------------------------------------------------
```
ルーターの設定画面ってどう入るんだつけ？

家のネットワーク状態が調子悪い時、ルーターの状態ってどうなってるのかなと思って、ルーターの設定画面を開きたいときってあったりしませんか？

ルーターの設定画面は、ブラウザからアクセスできる製品がほとんどだと思いますが、どこへアクセスすればいいのかメーカーの Web サイトで調べたりして時間がかかっていました。そんなときは、デフォルト ゲートウェイへアクセスすればいんだよっていうお話です。

## デフォルト ゲートウェイの IP アドレス
### Windows
デフォルト ゲートウェイは、コマンド プロンプトまたは PowerShell で `ipconfig` を実行すると確認ができます。

![ipconfig_ipv4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/d33ac61f-0719-72fb-9fbe-40f47ad2b5f2.png)

https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/ipconfig

### Mac
ターミナル で、`route -n get 0.0.0.0` を実行するとデフォルト ゲートウェイが確認できます。

![route.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/57212a06-2ed7-db97-b084-4ce304a879ec.png)

## ルーターの設定画面を開く
確認した IP アドレス（今回の例では **192.168.0.1**）を任意のブラウザのアドレスバーへ入力することでルーターの設定画面へアクセスできます。めでたしめでたし。

![setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/98aae127-a240-f6d4-e3c1-6ff7c684c3df.png)

## デフォルト ゲートウェイってなに？
デフォルト ゲートウェイは、コンピュータやネットワーク機器が他のネットワークにデータを送信するときに使うルーターやネットワーク デバイスのことです。通常、デフォルト ゲートウェイは LAN（ローカルエリア ネットワーク）とインターネットなどの外部ネットワークをつなぐ役割を果たします。

つまり、"家のルーター" = "デフォルト ゲートウェイ" となるため、デフォルト ゲートウェイへアクセスすると、ルーターへアクセスでき、設定画面が開くという結果になります。

## さいごに
ルーターにアクセスできたけど、次はパスワードなんだっけとならないようにルーターへログインするためのパスワードはしっかり覚えておきましょう！
[paiza]ポムポムプリンのおしり（【殿堂入りキャンペーン】N倍の文字列 (paizaランク D 相当)

# 見上げた夜空の星達の光
プログラムなら掛け算のアレだし、SQLだと全カラム取ってくる的なアレだし、何でもござれのワイルドカード的なアレを沢山繋げちゃうZO!!

とりあえずJavaでDランクはコレにて終了！

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/square

# チェック処理とかは端折ってる
/** ここから定型文 */
ここで記載したクラスについては、
[こっちの記事](https://qiita.com/AsilHatake/items/40204293bdf59cb9f9d8)に書いてある、標準入力をList化したりしてるMainクラスから呼び出す予定だし・なんか継承したりしてるYO!!

ちな、Mainを実行して標準入力から入力するのクソ面倒くさいので、
Java編については問題の入力例をパラメータにしたテストクラスとかも作って公開するYO!!

<details open><summary>開発・実行環境はこんな感じ</summary>

- VSCode
- Java 17
- jUnit 5.9
- maven

pom.xmlはこんな感じ

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.co.asil</groupId>
    <artifactId>paiza202408</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
```

</details>
/** ここまで定型文 */

## 実装クラス 
```java:Square.java
package jp.co.asil.paiza202408;

import java.util.List;

public class Square extends Question {

  public Square(List<String> list) {
    super(list);
  }

  /**
   * 整数 N が入力されるので、N 個の*を繋げた文字列を出力するプログラムを作成しましょう。
   * 
   * 例えば N = 3の場合
   *
   * ***
   * 
   * のように出力してください。
   */
  @Override
  public List<String> answer() {
    return List.of("*".repeat(Integer.parseInt(list.get(0))));
  }
}
```
## テストクラス 
```java:SquareTest.java
package jp.co.asil.paiza202408;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.List;

import org.junit.jupiter.api.Test;

public class SquareTest {
  @Test
  void testAnswer1() {
    Square testClass = new Square(List.of("4"));
    assertEquals(testClass.answer().get(0), "****");
  }

  @Test
  void testAnswer2() {
    Square testClass = new Square(List.of("6"));
    assertEquals(testClass.answer().get(0), "******");
  }

  @Test
  void testAnswer3() {
    Square testClass = new Square(List.of("100"));
    assertEquals(testClass.answer().get(0), "****************************************************************************************************");
  }
}
```

# まとまとめ
Java 11から使用可能な`String.repeat`メソッドを使って文字を生成してます。
java 8とかだとIntStreamのrangeで指定数のstreamを作り、mapToObjで 数字を【*】に変換して、collectしたListをString.joinでチョチョイのジョイやで。

```java:java8でチョチョイのジョイ
  public List<String> answer() {
    return List.of(String.join("",
        IntStream.range(0, Integer.parseInt(list.get(0))).mapToObj(i -> "*").collect(Collectors.toList())));
  }
```