OmniAICreator/Qiita-1.07M huggingface dataset:
基本情報技術者試験に役立つすべてのリンクまとめ

※現在ちょっとずつ更新中

## 合格体験記

1. [基本情報技術者試験 合格へのみちのり](https://qiita.com/monocot/items/69afd34770c316e76bea)
1. [基本情報の学習](https://qiita.com/HERUESTA/items/4edb284aa2a860346f84) 


## 勉強法

1. [基本情報技術者試験の科目Bで満点取ったので，対策方法をまとめた](https://qiita.com/raedion/items/c00c5235659e24eea066)
1. 


## 問題

1. [IPAの基本情報技術者試験科目B](https://www.ipa.go.jp/shiken/syllabus/henkou/2022/20221226.html)
1. [基本情報技術者試験ドットコム](https://www.fe-siken.com/fekakomon.php)

## 書籍

1. [【令和６年度】 いちばんやさしい 基本情報技術者　絶対合格の教科書＋出る順問題集](https://www.sbcr.jp/product/4815624262/)
helloLedJNI

https://qiita.com/mailtotakaf/items/4a8c0bf22253e24be231

を

https://qiita.com/mailtotakaf/items/294aff5d0988329eaf0b

のコードに変えただけです。^^;



```LedJNI.java
package ledJNI;

public class LedJNI {
    static {
        System.loadLibrary("LedJNIImpl");
    }

    public native void ledOn();
    
    public static void main(String[] args) {
        new LedJNI().ledOn();
    }
}
```
```LedJNIImple.c
#include <jni.h>
#include "LedJNI.h"
#include <stdio.h>
#include <wiringPi.h>
#define LED 17  // 17ピンからLEDのプラス端子に印加

JNIEXPORT void JNICALL Java_LedJNI_ledOn(JNIEnv *env, jobject obj) {
        wiringPiSetupSys();

        pinMode(LED, OUTPUT);

        for (int i=0 ; i < 5 ; i++) {
                digitalWrite(LED, HIGH);  //オン
                delay(500);
                digitalWrite(LED, LOW);   //オフ
                delay(500);
        }
        return;
}
```
```bash
sudo apt-get install wiringpi
```
③ 共有ライブラリのコンパイル
```bash
gcc -shared -o libLedJNIImpl.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux LedJNIImpl.c -lwiringPi
```
実行
```bash
java -Djava.library.path=. LedJNI
```
React + Spring Framework + MongoDBでアプリ作成④

# はじめに

この記事は以下の記事の続きです。

https://qiita.com/acu8/items/a51074fd3080a213a158

https://qiita.com/acu8/items/cda8b4985ef205bfdba9


https://qiita.com/acu8/items/cb6ecce67e1734f7d2a3

今回はフロントエンドにMongoDBのデータを表示させる手順を中心に共有していきます。

以下の記事で紹介したデータを画面上に表示させる設定を行なっていきますので、ハンズオンを進める場合はこちらの記事も参考にしてください。
https://qiita.com/acu8/items/7ccd3247dfbe39bc0b5c


# フロントエンドの実装
今まではApp.tsxのみ使用して画面表示をしていましたが、今回はコンポーネントを作成してApp.tsxにインポートして画面表示させたいと思います。

```tsx: UserList.tsx
import React, { useEffect, useState } from 'react';
import axios from 'axios';

interface User {
  id: string;
  name: string;
  email: string;
}

const UserList: React.FC = () => {
  const [users, setUsers] = useState<User[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    const fetchUsers = async () => {
      try {
        const response = await axios.get('http://localhost:8080/api/users');
        setUsers(response.data);
        setLoading(false);
      } catch (err) {
        setError('ユーザーデータの取得に失敗しました');
        setLoading(false);
      }
    };

    fetchUsers();
  }, []);

  if (loading) return <div>Loading...</div>;
  if (error) return <div>Error: {error}</div>;

  return (
    <div className="container mx-auto p-4">
      <h1 className="text-2xl font-bold mb-4">ユーザー一覧</h1>
      <div className="grid gap-4">
        {users.map(user => (
          <div key={user.id} className="border p-4 rounded shadow">
            <h2 className="font-bold">{user.name}</h2>
            <p className="text-gray-600">{user.email}</p>
          </div>
        ))}
      </div>
    </div>
  );
};

export default UserList;
```

App.tsxにインポートします。

```tsx: App.tsx
import UserList from "./components/UserList";
import "./App.css";

function App() {
  return (
    <div>
      <UserList />
    </div>
  );
}

export default App;
```

バックエンドとフロントエンドの両方を以下のコマンドで起動して、データが取得できているか確認しましょう。

### バックエンド起動
```
./mvnw spring-boot:run
```

### フロントエンド起動
```
npm run dev
```

画面に以下のようなデータが表示されていれば成功です。
![スクリーンショット 2024-11-17 14.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/640d5129-52a2-a208-ca0e-ea56339442c2.png)

# おわりに
今回でこのシリーズが完了です。
今までJavaやReactを利用する時はそれぞれフロントからバックエンドまで一貫して同じ言語やフレームワークだったので、今回のように2つの言語を違うフレームワークを利用する経験はいい学習の機会になりました。
あまり参考にできるリソースがなかったので、今回のシリーズが今後アプリ開発をする人の参考になれば幸いです！


# 参考
今回ご紹介したコードはこちらに公開しています。
https://github.com/acu8/react-spring-mongoapp


# JISOUのメンバー募集中！

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
初、Qiitaの開始

# 初めてQiitaのはじめる。
おもに、テック系のアウトプットを行おうと思う。
また、ガジェットなどほしいものなども書いていけたらとおもう。
まずは、ファーストステップとして、とにかく書くことを目的とします。
React + Spring Framework + MongoDBでアプリ作成③

この記事は以下の記事の続きです。

今回はMongoDBの接続手順などを中心に共有していきます。

https://qiita.com/acu8/items/a51074fd3080a213a158

https://qiita.com/acu8/items/cda8b4985ef205bfdba9

以下の記事で紹介したデータを画面上に表示させる設定を行なっていきますので、ハンズオンを進める場合はこちらの記事も参考にしてください。

https://qiita.com/acu8/items/7ccd3247dfbe39bc0b5c


# バックエンドとMongoDBの接続
application.propertiesでDBとの接続設定を行なっていきます。
接続設定のdemoの部分は自身のプロジェクト名を入れてください。

```java: application.properties
# MongoDB接続設定
spring.data.mongodb.uri=mongodb+srv://<username>:<password>@cluster0.xxxxx.mongodb.net/demo

# 既存の設定
server.port=8080
spring.web.cors.allowed-origins=http://localhost:5173
spring.web.cors.allowed-methods=GET,POST,PUT,DELETE
spring.web.cors.allowed-headers=*

```

### MongoDBから取得するデータのモデルクラスを作成します。
```java: User.java
// src/main/java/com/example/demo/model/User.java

package com.example.demo.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "users")
public class User {
    @Id
    private String id;
    private String name;
    private String email;

    // getter/setter
    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

```

Repositoryを作成します。
```java: UserRepository.java

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserRepository extends MongoRepository<User, String> {
}
```
Controllerを作成します。

```java: UserController.java

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
@CrossOrigin(origins = "http://localhost:5173")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}
```

ここまで完了したら以下のコマンドでバックエンドを起動します。
```
./mvnw spring-boot:run
```

`http://localhost:8080/api/users`にアクセスして以下のように画面上にデータが表示されたらバックエンドとの接続は完了です。

![スクリーンショット 2024-11-17 14.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/5c1f588a-171a-00e5-b4f4-bc8e1dd492d2.png)


# おわりに
次回はこのシリーズ最後のフロントエンドにMongoDBのデータを表示させていきます。
皆様の参考になれば幸いです！


# JISOUのメンバー募集中！

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
MongoDBのはじめかた【VSCode利用】

# はじめに

VSCodeを利用してMongoDBを簡単に始める方法を説明していきます。
簡単に始めたいので、インストールなどは一切せずにMongoDB Atlasを使用して始めていきます。

# MongoDB Atlasのセットアップ
まずはMongoDBでアカウントを作ってください。

https://www.mongodb.com/cloud/atlas/register?psafe_param=1&utm_content=rlsapostreg&utm_source=google&utm_campaign=search_gs_pl_evergreen_atlas_general_retarget-brand-postreg_gic-null_apac-all_ps-all_desktop_eng_lead&utm_term=&utm_medium=cpc_paid_search&utm_ad=&utm_ad_campaign_id=14412646494&adgroup=131761134692&cq_cmp=14412646494&gad_source=1&gclid=Cj0KCQiAouG5BhDBARIsAOc08RTR9yRNPHWIZaC89fj07Nd_Ec60-gZbyOlRY05b2UW6eKfTiMcez1IaAnwdEALw_wcB

プランの選択が出てきたら、「Free」を選択することで無料利用することが可能です。
クラスター名はデフォルトの「Cluster0」でOKです。

### ネットワークアクセスの変更
左側のメニューにある「Network Access」をクリックし「Add IP Address」を選択します。
自動的に現在のIPアドレスが取得されますので、追加されたアドレスの「Edit」を選択します。
モーダルが開くので「Allow Accerss From Anywhere」に変更します。
![スクリーンショット 2024-11-17 12.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/2443c156-23bb-ea44-d29c-ab117ad5ab28.png)


こうすることで、開発中の予期せぬエラーを防ぐことができますので、開発中のみこの設定をしておくと便利です。

# VSCodeの設定

VSCodeの拡張機能の中から「MongoDB for VS Code」をインストールします。

インストールが完了すると、一番左側のメニューにMongoDBの葉っぱのマークが出てくるので、それをクリックします。
「Add Connection」をクリックすると、VSCodeの上部に接続文字列をいれる部分が出てくるので、そこに以下の手順で入手した文字列を入力します。

```: 接続文字列の入手
1. MongoDB Atlas画面からCluster0の「Connect」ボタンをクリック

2. MongoDB for VS Codeをクリック

3. 「Connect to your MongoDB deployment.」に表示される接続文字列をコピーして入手
```

```: パスワードの入手
1. MongoDB Atlasの左側メニューからSecurity > Database Accessをクリック

2. ユーザーのActionsに表示されているEditを選択

3. Edit Passwordを選択し、任意のパスワードを入れるか、Autogenerate Secure Passwordを選択してパスワードを入力します。この時、パスワードはメモしておいてください。

4. 画面右下のUpdate Userをクリックし、パスワードを保存。上記の接続文字列内にメモしたパスワードを入れてください。

```

# MongoDBプレイグラウンドでテストしてみる
VSCodeのMongoDBアイコンをクリックして、「Create New Playground」をクリックします。
中に入っているデータをそのまま使ってもいいですし、以下のデータを挿入してテストをしてみてください。

```sql
// データを挿入
use('demo');
db.users.insertMany([
  {
    name: "John Doe",
    email: "john@example.com"
  },
  {
    name: "Jane Doe",
    email: "jane@example.com"
  },
  {
    name: "Bob Smith",
    email: "bob@example.com"
  }
]);

```

Playground内に上記を入力したら、VSCode右上に表示される右向きの三角形をクリックして、実行ができます。

上記で挿入したデータが入っているか確認するには、playgroundの内容を削除して以下を入力してください。
```sql
use('demo');
db.users.find();
```


# おわりに

普段はRDBを中心に使うことが多かったのですが、現場の技術検証中にMongoDBが選択肢に上がったので使ってみました。
画面上の操作もしやすいのでVSCodeとあわせると簡単にセットアップが完了できるところがいいなと感じました。
皆様の参考になれば幸いです！



# JISOUのメンバー募集中！

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
React + Spring Framework + MongoDBでアプリ作成②

# はじめに
この記事は以下の記事の続きです。

https://qiita.com/acu8/items/a51074fd3080a213a158

今回はバックエンド側のセットアップの手順を共有していきます。

# セットアップ
バックエンドの技術スタックは以下の通りです。
```:開発環境
言語:
Java

フレームワーク：
Spring Boot3.4.0
```
# プロジェクトの作成
Spring Initializrを使用してプロジェクトを作成します。

https://start.spring.io/

以下の設定を選択してください。
```
Project: Maven
Language: Java
Spring Boot: 3.4.0

Project Metadata:
Group: com.example
Artifact: demo
Name: demo
Description: Demo project for Spring Boot
Package name: com.example.demo
```
プロジェクトによって必要な依存関係を選択してください。
今回は以下の2つを入れておきます。

```:依存関係
Spring Web
```
Generateボタンを押してローカルにzipファイルを保存します。
zipファイルを解凍したものをフロントエンドが入っているフォルダに入れます。
(※フロントエンドのプロジェクトの中に入れないように注意してください。)

# アプリケーションプロパティの設定
追加したバックエンド側のフォルダ内を確認して、
src/main/resources/application.propertiesに以下の設定を追加します。

```java:application.properties
# サーバーポート設定
server.port=8080

# CORS設定
spring.web.cors.allowed-origins=http://localhost:5173
spring.web.cors.allowed-methods=GET,POST,PUT,DELETE
spring.web.cors.allowed-headers=*

# ログレベル設定（オプション）
logging.level.root=INFO
logging.level.com.example=DEBUG
```

# サンプルコントローラーの作成
mainフォルダ>Java>プロジェクト名フォルダ配下にcontrollerフォルダを作成し、その中にコントローラーファイルを作成します。
ファイルの中はこのような形で記載をしてみました。

```java: HelloController.java
package com.example.demo.controller;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:5173")
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello from Spring Boot!";
    }
}

```

# フロントエンドとの連携
フロントエンドとバックエンドの連携はaxiosで行いますので、インストールを進めます。
```
npm install axios
```

フロントエンドのApp.tsxファイルを以下のように変更し、バックエンドのコントローラーのmessageを受け取ります。
```ts: App.tsx
// src/App.tsx
import { useEffect, useState } from "react";
import axios from "axios";
import "./App.css";

function App() {
  const [message, setMessage] = useState("");

  useEffect(() => {
    axios
      .get("http://localhost:8080/api/hello")
      .then((response) => {
        setMessage(response.data);
      })
      .catch((error) => {
        console.error("Error fetching data:", error);
      });
  }, []);

  return (
    <div>
      <h1>Spring Boot + React</h1>
      <p>Message from backend: {message}</p>
    </div>
  );
}

export default App;

```

ここまででセットアップが完了です。

# 両サイドを起動する
まずはバックエンドを以下のコマンドで起動します。

```
./mvnw spring-boot:run
```

特にエラーが出ておらず起動が完了していれば、別のコマンド画面を開いてフロントサイドに移動します。
フロントサイドに移動したら以下のコマンドで起動します。
```
npm run dev
```
ローカルで起動したらURLをクリックし、画面で以下のような表示がされていれば接続が成功しています。


![スクリーンショット 2024-11-17 11.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/86c05dff-c7b1-d97a-4fbf-dcf3ed15da96.png)

# おわりに

ここまででフロントエンドReactとバックエンドSpringのセットアップが完了しました。
次回はMongoDBを使ったデータベースのセットアップ方法を説明していきたいと思います。


# JISOUのメンバー募集中！

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
React + Spring Framework + MongoDBでアプリ作成①

# はじめに
フロントをReact, Typescript、バックエンドをJavaとSpringを使用したアプリの技術検証をする機会があったので、今回はフロントエンド側の基本的なセットアップの流れをご紹介します。


# フロントセットアップ
フロントエンドは以下の技術スタックです。
```: 開発環境
言語：
Typescript

ライブラリ
React

フレームワーク
Vite

```

まずはViteをインストールします。my-appの部分は好きなプロジェクト名にしてください。
```
npm create vite@latest my-app -- --template react-ts
```
インストールができたら、プロジェクト配下に移動します
```
cd my-app
```

その後、依存関係をインストールします。
```
npm install
```
完了したら、一度ローカルで起動をしてみてください。

```
npm run dev
```
問題なく起動ができればVite + Reactのロゴと文字が画面上に表示されます。


# Hello Worldの表示

src配下にあるApp.tsxを以下のように書き換えることで画面上の表示を変更することができます。
```tsx: App.tsx
import "./App.css";

function App() {
  return (
    <>
      <div>
        <h1>Hello World</h1>
      </div>
    </>
  );
}

export default App;
```

index.cssとApp.cssが効いていると画面の中央に文字が表示されますが、これらのファイルの中身を消すことで以下のようにcssなしのまま表示ができます。

![スクリーンショット 2024-11-17 10.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/4bb56ae8-8dc0-97b9-bedd-ded5eaa159d7.png)


# おわりに
ここまででフロントエンド側のセットアップが完了しました。
次の記事ではバックエンド側のセットアップを実施していきます！



# JISOUのメンバー募集中！

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
【Pyxel】PyxelUniversalFontを使ったゲームの実行ファイル化が上手くいかない

## 実行ファイル化がうまくいかない！！！
　タイトル通り、pyxel+PyxelUniversalFontだとpyxappの扱いが少々複雑になるようです。つまずいたので、ほぼ日本語オンリーになりますが記事で残しておきます。

## 環境
macbook air(M1)
python3.12.2
pyxel 2.2.3

## pyxel package
　pyxappを生成してくれるコマンドですね。最初に正解を言っておくと、
 
・pyファイル
・pyxresファイル
・その他のデータ、リソースファイル(db,csv,pickle等)
・__PyxelUniversalFontに同梱されているフォントファイル！！！__

をパッケージ化するディレクトリに入れておけば、正しく実行ファイル化できます。


## app2html
　PyxelUniversalFontを使っているゲームでは、これは諦めた方がいいです。というのも外部モジュールがhtml上のビルドで同梱されず、PyxelUniversalFontなどのimportが効かないためです。小規模なゲームであればpyxresファイルに無理やり描画内容を突っ込むというフィジカル解決法があるので、そちらをどうぞ。
「同梱されていないなら同梱すればいいじゃない」と思う方がいるかもしれません。実際私も試験的にPyxelUniversalFontのソースを直接pyxappに入れてhtml化してみました。結果、エラーメッセージが変化してpillowが同梱されていません、Javascriptかpythonで入れてくださいみたいなのが出ます。
　つまり、pillowも同じように直接pyxappに入れてあげれば多分動くんでしょう。パワーによる同梱は可能です。ただ、倫理的というか著作権的にちょっと危なそうですし、パワーすぎる解決法なのでおすすめはしません。githubからとってきてライセンスとかreadmeとか全部捨ててビルドしたゲームをネット上で晒す勇気があなたにはありますか？
　それでもhtml形式が欲しいんだ！という方は自力でpyxresにフォント実装するか、全てASCII化して`pyxel.text`で描画しましょう。

## app2exe
　本命です。まず、app2htmlと違ってこいつは外部モジュールを使うことができます。そのため、PyxelUniversalFontも動きます。しかし、そのままソースファイルだけをディレクトリに突っ込んでパッケージにしたものを実行ファイルにすると、「指定されたフォントがありません」的なログが出ます。つまり、app2exeはスクリプトをインポートできてもライブラリパッケージに含まれるリソースまでは同梱してくれないのです。
　なので、フォントリソースだけは手動で同梱する必要があります。
 　そのフォントリソースは自分のハードディスクから発掘しましょう。
  ~~~
  which python
  ~~~
  これをコンソールで打ち込むとそのコマンドのソースの場所を教えてくれます。これで大まかなpythonのファイルの位置を掴みます。掴んだら、それを頼りにしてpythonのバージョン別ディレクトリを探します。
~~~:私の場合
/Users/username/.pyenv/shims/python
~~~
　私の場合pyenv使ってバージョン管理してるので大元のディレクトリがpyenvですね。pyenvじゃない場合もpythonっぽい名前のディレクトリがホームディレクトリ直下とかライブラリ直下とかにあると思います。コマンドラインでもできますけど、コピーするときのパスがだるいのでGUIで開きに行きましょう。
 　`.`から始まる名前は隠しファイルですよ！`option+shift+.`で表示しないと見つからないですからね。
  　で、次に開くのはpyenvの場合「versions」です。ファイル構造は人によって色々あると思いますけど、最終的に「python〇〇.〇〇」みたいな名前のディレクトリが開ければOKです。
「python」「lib」「versions」「python〇〇.〇〇」この辺をぽんぽん開いてけば見つかるはず。
　で、「python〇〇.〇〇」の中にある「site-packages」。これがpipで入れたライブラリを入れてるディレクトリです。この中に「PyxelUniversalFont」があるはずです。
 　それも開いたら、「fonts」というフォントリソースを格納してるディレクトリがあります。その中から任意のフォント.ttf（全部コピーしとけば確実）をコピーして自分がプログラムをいつも書いてるディレクトリにペーストしましょう。
  こいつをpyxappに同梱すれば、app2exeで作られた実行ファイルが正常にフォントをレンダーしてくれます。
　この説明だいぶわかりづらいと思うので、私の場合のフォントパス書いときますね。参考にしてください。
~~~
/Users/username/.pyenv/versions/3.12.2/lib/python3.12/site-packages/PyxelUniversalFont/fonts
~~~

## 雑記
### pyxel packageについて
　pyxel packageコマンドってちょっと使い方わかりづらくない？と思ったので補足。
 ~~~
 pyxel package ディレクトリ 起動スクリプト.py
 ~~~
 　まず、プログラム動かすのに必要なファイルは全部一個のディレクトリに入れてください。起動スクリプトも含めてです。そしてそのディレクトリをコマンド実行時に指定します。起動スクリプトも指定する必要がありますが、この起動スクリプトっていうのは`if __name__=="__main__"`が書いてあるファイルのことです。
  ディレクトリには色々入れます。ソースコードやpyxresファイルはもちろん、pickleとかcsvとかsqliteとか`open()`とかで使ってるファイルも全部入れます。上記のフォントファイル.ttfも入れましょう。

### pyxapp以外の実行ファイル化について
　何かしらの原因でpyxappをうまく扱えないときに、pyinstallerやnuitkaなどといったその他のツールに頼ろうとするのはやめましょう。たとえエラーを吐くのだとしても、pyxappはpyxelプログラムに伴うリソースを自動で同梱し、いくつかのオプションも自動で指定してくれるフォーマットです。
　この作っているのがゲーム前提だからこそやってくれている自動化部分をpyinstallerやnuitkaでは手動で設定する必要があり、pyxappで遭遇したエラーとは別の大量のエラーに襲われます（体験談）。
　pyxappで出るエラーはちゃんと逃げずにトラブルシューティングしましょうね。
Rを学びたい Step8 株価の移動平均線を表示する

## はじめに
Rを学びたいStep8です。株の移動平均線を表示します。

```R:
# 必要なパッケージをロード
library(quantmod)

# フォント設定
par(family = "Hiragino Sans")  # macOS用日本語フォント

# トヨタ自動車（7203.T）のデータを取得
symbol <- "7203.T"
getSymbols(symbol, src = "yahoo", from = "2023-01-01")



# 移動平均線を計算
data <- get(symbol)

data$SMA20 <- SMA(Cl(data), n = 20)
data$SMA50 <- SMA(Cl(data), n = 50)
data$SMA100 <- SMA(Cl(data), n = 100)

# PNGファイルとして保存
file_name <- "toyota_stock_chart_japanese.png"
png(filename = file_name, width = 1200, height = 800, res = 120, family = "Hiragino Sans")

# チャートを作成
chartSeries(data, 
            theme = chartTheme("white"), 
            TA = "addVo(); addSMA(20, col='blue'); addSMA(50, col='green'); addSMA(100, col='red')",
            up.col = "green", dn.col = "red", 
            up.border = "black", dn.border = "black")

# 日本語タイトルを追加
title(main = "Toyota chart 2023year ", col.main = "black", font.main = 1)

# デバイスを閉じる
dev.off()

cat("チャートを保存しました:", file_name, "\n")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/210965c4-2784-141e-030e-cf866c162dc9.png)
EBAZ4205を使って、FPGAを使ったシステム開発の環境を構築する


関連記事
[EBAZ4205を使って、FPGAを使ったシステム開発の環境を構築する](https://qiita.com/GeekMasahiro/items/6bdb8886fb5c32c332cb)
[EBAZ4205でLinuxを動かして見る](https://qiita.com/GeekMasahiro/items/bb411ab40bb2e80e4c2a)
[petalinuxをBuildrootでビルドする](https://qiita.com/GeekMasahiro/items/7ce3d4fe108f2cfe49a3)

# はじめに

XilinxのZynqを搭載している基板EBAZ4205を使って、FPGAを使ったシステム開発の環境を構築してみます。
最終的には、Nervesを動作させてる予定です。

まずは、Xilinxのツールをインストールして、動作確認を行います。

参考資料

https://docs.amd.com/r/en-US/Vitis-Tutorials-Vitis-Platform-Creation/Vitis-Tutorials-Vitis-Platform-Creation-XD101

# ツールの役割分担

- Vivado: ハードウエアの設計
  xsaファイルを生成
- Vitis: ソフトウエアの開発
  xsaファイルを使って、ソフトウエアを開発

ツールをインストールする時は、vitisを含んでいる、vivadoをインストールすると楽です。
最初、含んでないものを入れてその後追加でvitisを入れたので、手順は省略します。

# vivadoの動作確認

ハードウエア単体でチップを動作させてみて、動作確認を行います。

ハードウエアの情報を入力する必要があるので、次のリンクを参考にします。

https://hhuysqt.github.io/zynq1/


チュートリアル詳しい事を知りたくなったら、後で、次のリンクを参考にします。

https://docs.amd.com/r/2024.1-%E6%97%A5%E6%9C%AC%E8%AA%9E/ug986-vivado-tutorial-implementation/%E3%81%93%E3%81%AE%E8%B3%87%E6%96%99%E3%81%AB%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E8%A8%AD%E8%A8%88%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9

# vitisの動作確認

https://qiita.com/iwatake2222/items/24a8a94741fdbb80f62a

これを、vivado 2024.1, vitis 2024.1で出来れば良さそう。

vitisでやってみる。

File -> New Component -> Platform を選択

ebaz4205-test01のフォルダーを選択する

Broesを押して、ebaz4205-test01/design_1_wrapper.xsaを選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/61636237-0556-4517-e748-746ea0ea196c.png)

standalone/ps7_cortexa9_0を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/e1dbaee4-a7a4-7c32-fc2a-237f6ca766de.png)

次の画面で、Finishを選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/9fab1776-6d56-16d9-24e2-9830aadbc16d.png)


次の画面にdriverの表がある。この表の、一番右に、Import Exampleを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/3092c16b-ef05-52cf-31fe-88004a18d70a.png)


UARTのサンプルを取り込んで、Create Boot ImageでBoot.binを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/0d1226fa-c336-df98-902d-808138429745.png)

作成後、FatでフォーマットしたSDカードにコピーして、Zynqに挿入して起動する。
起動をTFカードに変更して行う必要がある。

起動すると、UARTに出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/19bbe21f-a815-4847-7f7c-1ad25c66c55e.png)

# まとめ

- vivadoでハードウエアを作成
- vitisでソフトウエアを作成
- boot.binを作成して、SDカードから起動し、UARTに出力される事を確認
- visisでは、ARMのコードをクロスコンパイルする環境も含まれていて、ソフトウエアも含めて開発が出来て便利

参考

# vitisのチュートリアル
https://docs.amd.com/r/en-US/Vitis-Tutorials-Vitis-Platform-Creation/Vitis-Tutorials-Vitis-Platform-Creation-XD101


https://qiita.com/iwatake2222/items/24a8a94741fdbb80f62a


関連記事
[EBAZ4205を使って、FPGAを使ったシステム開発の環境を構築する](https://qiita.com/GeekMasahiro/items/6bdb8886fb5c32c332cb)
[EBAZ4205でLinuxを動かして見る](https://qiita.com/GeekMasahiro/items/bb411ab40bb2e80e4c2a)
[petalinuxをBuildrootでビルドする](https://qiita.com/GeekMasahiro/items/7ce3d4fe108f2cfe49a3)
clsxの使用例

# clsxとは何か
clsxは、Reactやその他JavaScriptでよく使用される***軽量なユーティリティライブラリ***である。
cssクラス名を効率的に結合・管理するために使われる。
主に、***条件付きでクラス名を切り替えるような場合に便利。***

#使用方法

## npmやyarnを使ってインストール

```
npm install clsx
```

## 基本的な使用例

```ts
import clsx from 'clsx';

function Button({isHighlighted, isDisabled}) {
    return (
        <button className={clsx(
        'default-style',                    //常に適用されているクラス
        isHighlighted && 'highlighted',     //強調されているときに適用
        isDisabled && 'disabled'            //無効化されているときに適用
        )}
        >
          Click Me
        </button>
    );
}
```
`isHighlighted`が`true`の場合　→　`highlighted`クラスが追加される。
`isDisabled`が`true`の場合　→　`disabled`クラスが追加される。

# clsxを使用するメリット
1．コードの可読性向上：クラス名を条件に応じて追加する処理が簡潔になる。
2．エラー回避：無効値を自動的に無視できるので、意図しないクラス適用を防げる。


無効値：`null`、`undefined`、`false`、空文字(`''`)


### `clsx`を使用することで、簡潔かつ安全なコードを実現できる。
ブロックパラメーター表示を自動化しよう（Simulink）

# はじめに
JMAABモデリングガイドラインver6.1のルールにこんなのがあります。

「db_0140 : ブロックパラメーターの表示」
ブロック注釈には、プロジェクトで定めたブロックパラメーターを表示します。


Simulinkにおいて、ブロックパラメーターを表示することは、モデル可読性にとって非常に重要な要素だと思っていますが、表示すべきブロックパラメーターは、このブロックの場合は、このパラメーターを表示！など一意に言えないと思います。
（明確にブロックパラメーターの表示を定めているプロジェクトってあるんだろうか……？）

例えば、図のようなOutportブロックでは、条件付きサブシステムの中と外とでは機能が違うため、条件付きサブシステムの中では表示させたいし、外では表示させたくありません。
![enabledOutput (小) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640587/6058f102-aed8-253f-c85d-30505b5bc122.png)

そこで、ブロックパラメーターの既定値と異なれば表示させて、同じならば表示させないといったことや、設定したパラメータ値の変数名ではなく、その変数の値を表示したい。MATLABが日本語設定であればパラメーターは日本語、英語であれば英語表記などといったことなど、いろいろ対応してみたので、その実装に役立つパラメーターなどをいろいろ発見したので、紹介したいと思います。

# ブロックパラメーター表示に役立つパラメーター
## プロンプト
Outportでいえば、[ディセーブル時の出力:]や[初期出力:]といった文字列です。これは、ブロックパラメーターの「IntrinsicDialogParameters」から拾えます。
![スクリーンショット 2024-11-17 183220 (小).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640587/02f91430-b54c-0b9c-1932-07d30bd7d202.png)

## 値の名前
[ディセーブル時の出力:]の「保持」や「リセット」といった文字列です。
このデータは、下記フォルダの.xmlファイルから引っ張ってこれます。

```
% get(0,'lang')は、現在のMATLABの言語設定値
fullfile(matlabroot, 'resources', 'Simulink', get(0,'lang'), 'dialog.xml')
```

「パラメーター値 + _CB」という形でリスト化されてます。
![スクリーンショット 2024-11-17 183829 (小).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640587/3673154c-a9c6-8ff1-c978-c49cbf3fe5a0.png)

## 値の評価
例えば下図の値、モデルワークスペースとベースワークスペースのパラメーターを使用して演算しています。
![スクリーンショット 2024-11-17 184254 (小).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640587/c72d9b80-564f-c4f6-3a0a-70e11644a59d.png)

これは、「slResolve」という関数を使うと演算してくれます。
指定したブロックパス（モデル名などでも可）が使用可能なパラメーター（モデルワークスペース、ベースワークスペース、データディクショナリ、マスクワークスペース）を使用して評価してくれます。便利。
```
output = slResolve('評価する文字列', ブロックパスやブロックハンドル)
```

## 表示されるパラメーターの判定
ブロックパラメーターは、条件によって、表示されたり、されなかったりするものがあります。下記図のOutportブロックは、条件付きサブシステムの内側と外側で、表示されているパラメーターが違います。
![図1 (小).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640587/56169827-bbab-a52f-4828-2662a51e2e73.png)

表示されていないパラメーターは、機能しないものと考えていいはずなので、今表示されているかされてないのか判定したいはずです。これは、ブロックオブジェクトのisValidPropertyを使用して判定できます。
```
% Outportブロックの[ディセーブル時の出力]設定が表示されているか判定
blkobj = get_param('testModel/Outport','Object');
isvalidprop = blkobj.isValidProperty('OutputWhenDisable'); % logical値がリターン
```

# おわりに
ここらへんの知見は、公式ドキュメントにも載っていなかったりするので、まとめてみました。これらを使用したスクリプトをマスクの初期化に入れ込んで、パラメーター表示させると、結構いい感じに機能してくれるんではないでしょうか？誰かにささってくれるといいなぁ。
NumPyが固有ベクトルを正規化して出力することを確かめてみた

これまで無意識で使っていたのですが、**`NumPy`、固有ベクトルを正規化している** らしいです。
（たしかに、複数の行列の固有ベクトルを比較するとき、統一的な出力にした方が解釈しやすい、、）と思いつつ、
実際に確かめてみたいと思います。

本記事では↓の例題を考えます。

```math:例題
行列 A = \left(\begin{matrix} 4 & 1 \\ -2 & 1 \end{matrix}\right)の固有値と固有ベクトルを求めよ。　
```
これを素直に解くと、λ をAの固有値（=定数）として、
（※手計算の過程を飛ばして[先へ](#`numpy`を使って解く)進む。）

```math
\begin{align}
\det\left(\begin{matrix} 4 - \lambda & 1 \\ -2  & 1 - \lambda \end{matrix}\right) = 0 \\
\iff (4 - \lambda)(1 - \lambda) - (-2) = 0 \\
\iff \lambda^2 -5\lambda + 6 = 0 \\
\iff \lambda = 2, 3
\end{align}
```
と固有値が求まりました。
それぞれの固有値に対する固有ベクトルは、

```math
\begin{align}

\lambda = 2 の時、\boldsymbol{x_1}\ = \left(\begin{matrix} 1 \\ -2\\
\end{matrix}\right) \\

\lambda = 3 の時、\boldsymbol{x_2}\ = \left(\begin{matrix} 1 \\ -1 \end{matrix}\right) \\
\end{align}
```
となりました。
コーディングしてみましょう。

# `numpy`を使って解く
```python:by_numpy
import numpy as np
A = np.array([[4, 1],
             [-2, 1]])
eigenvalues_A, eigenvectors_A = np.linalg.eig(A)
eigenvalues_A, eigenvectors_A
```
とすると、出力は
```python:出力_by_numpy
(array([3., 2.]),
 array([[ 0.70710678, -0.4472136 ],
        [-0.70710678,  0.89442719]]))
```
となりました。

ここで、`numpy`
```math
\begin{align}
\lambda = 2 \text{ の時 }、\boldsymbol{x_1}\ = \left(\begin{matrix} -0.4472... \\ 0.8944...\end{matrix}\right) \\
\lambda = 3 \text{ の時 }、\boldsymbol{x_2}\ = \left(\begin{matrix} 0.7071... \\ 0.7071...\end{matrix}\right) \\
\end{align}
```
となります。

ここで、手計算で出した固有ベクトルを正規化してみましょう。
```math
\begin{align}

\lambda = 2 の時、\boldsymbol{x_1}\ = \left(\begin{matrix} 1 \\ -2\\
\end{matrix}\right) \\
\text{を正規化すると、} \\
x_{11} = \frac{1}{\sqrt{1^2 + (-2)^2}} = \frac{1}{\sqrt{5}} = 0.4472... \\
x_{21} = \frac{-2}{\sqrt{1^2 + (-2)^2}} = \frac{-2}{\sqrt{5}} = - 0.8944... \\
\end{align}
```
よって、NumPyが固有ベクトルを正規化して出力していることを確かめることができました。


# `scipy`を使って解く
`scipy`を使っても解けます。
```python:by_scipy
from scipy.linalg import eig
eigenvalues, eigenvectors = eig(A)
eigenvalues, eigenvectors
```

```python:_by_scipy
(array([3.+0.j, 2.+0.j]),
 array([[ 0.70710678, -0.4472136 ],
        [-0.70710678,  0.89442719]]))
```
ちなみに、ここでの`.j`は虚部が０であることを表してます。
Replit AgentやDifyでWEBスクレイピングツールを無料で使う方法

cozeで、WEBスクレイピングツールをワークフロー化してそれをAPI化します

動画でも解説
https://www.youtube.com/watch?v=t0kVg025ZZE


ワークフローの設定
https://www.coze.com/
クリック

１）cozeにログイン（googleなどで）
２）Workspaceクリック
３）右上の＋Resourcesクリック
　　＝＞すぐ下に出る、Workflowクリック
４）Create workflowが表示されるので、
　　＝＞Workflow nameとWorkflow descriptionに分かりやすい名前入れる
　　＝＞両方入れたら、右下Confirmをクリック
５）ワークフロー編集画面が表示される
６）左上の紫色のPluginをクリック
７）SearchにWEBと入れる＝＞一覧からwebSpiderをクリック
　　＝＞下に画面が開く＝＞url2jsonのAddボタンをクリック
８）Startとurl2jsonをつなぐ　＝＞　url2jsonとEndをつなぐ
９）Startの設定　＝＞入力欄が２行あるので、したの行の右の⊖をクリックして削除
１０）url2jsonの設定　＝＞Prease selectのところをStart＝＞BOT_USER_INPUTに設定
１１）Endの設定　＝＞Prease selectのところをurl2json＝＞web_contentに設定
１２）ワークフローの設定完了（URLを入れるとそのURLをスクレイピングしてJSONにしてくれる）
１３）右上Test runボタンをクリック　Prease enter BOT_USER_INPUTに取得したいURLを入れる
１４）右下Test runボタンをクリック　＝＞実際に動く
１５）ワークフローのTest run完了
１６）右上のPublishボタンをクリック＝＞画面が変わって自分がつけた名前のワークフローに緑のチェックが付くとＯＫ

ＡＰＩ化
https://www.coze.com/open/oauth/pats
を開く
１）右上のadd tokenボタンをクリック
２）Add personal access tokenが開くので、
　　Nameは、Secret tokenのまま
　　Expiration timeは、30dayあたりを選択（30日後に期限が切れる）
　　Permissions*は、チェック入れられるところに全部チェック入れる（多分Workflow Runだけでも良い）
　　その下の、
　　Select specified team space をチェックして、Personalを選択すると、右下のConfirmボタンが押せるのでクリック
この画面の下の方にでAPIという文字を見たらチェックすること。私の画面に表示されないが、表示されていた気がする。
３）New Personal Access Token画面が表示＝＞下にTokensがあるので右下のコピーマークをクリックしてコピーする
４）メモ帳などに貼り付けておく


ＡＰＩ呼び出し方
https://www.coze.com/docs/developer_guides/workflow_run?_lang=en

１）画面したの方にあるCode samples　Request sampleをチェック

以下の

pat_hfwkehfncaf****
"workflow_id": "73664689170551*****",
"user_id":"12345",
"user_name":"George"

をそれぞれ以下に変更

pat_yxkQjIbZyniAUU0zeIDJzOrhUoDxtHkS39Byv0Y0J4Wb7Jf73D3r74DroIHXbg5F　＜＝自分で取得したtoken

"workflow_id": "7438173077177925650",　＜＝作成したワークフローを開いたURLのworkflow_id=の右側の数値

"user_id":"7429341768674296849",　＜＝ワークフロー画面左上の＜をクリックして、
　　左下のマークをクリックしてSettingsをクリックして表示されたAccountの一番下のUID:の右側の数値

"user_name":"George"は以下のように修正(URLは自分がスクレイピングしたいURL)
"BOT_USER_INPUT":"https://www.google.com/"

＜サンプル＞
`
curl --location --request POST 'https://api.coze.com/v1/workflow/run' \
--header 'Authorization: Bearer pat_hfwkehfncaf****' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: api.coze.com' \
--header 'Connection: keep-alive' \
--data-raw '{
    "workflow_id": "73664689170551*****",
    "parameters": {
        "user_id":"12345",
        "user_name":"George"
    }
}'
`

＜修正後＞
`
curl --location --request POST 'https://api.coze.com/v1/workflow/run' \
--header 'Authorization: Bearer pat_yxkQjIbZyniAUU0zeIDJzOrhUoDxtHkS39Byv0Y0J4Wb7Jf73D3r74DroIHXbg5F' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: api.coze.com' \
--header 'Connection: keep-alive' \
--data-raw '{
    "workflow_id": "7438173077177925650",
    "parameters": {
        "user_id":"7429341768674296849",
        "BOT_USER_INPUT":"https://crowdworks.jp/public/jobs/search?category_id=228&order=new&page=1"
    }
}'
`
このcurlを全部コピーして実行すれば結果が戻ります。
コマンドプロンプト、パワーシェルでは動かない
私は、cursorのGit Bashで動かしました。

このままでは、アプリに組み込めないので、ChatGPTなどに、
一番簡単なpythonにしてと書いて、curlを全部投げればええ感じにpythonにしてくれます
difyやReplit Agentで使えるようになります！！
【Target class [App\Http\Controllers\***] does not exist. 】何をやっても抜け出せない人、これかもよ。【Laravel】




個人的によく見かけるこのエラーについて
### 【Target class [App\Http\Controllers\***] does not exist. 】

解決方法を調べると、主にこれら4つの方法が出てきます。

--

①Controller.php内の namespaceのパスに誤りがある。
　　namespace App\Http\Controllers\Auth;
  
②route内のパスに誤りがある。
　　Route::get('/hello','App\Http\Controllers\HelloController::class','index');
  
  ③routeでController名だけ指定した場合に、そもそも指定のControllerをuseし忘れている。
　　use App\Http\Controllers\HelloController;　←useしてる？
　　Route::get('/hello','HelloController::class','index');
  
④大文字小文字の違い・スペルミス
　　× App\Http\Controller\ ***　←Controllerにsがついてない！

--

先輩エンジニアの皆さん、本当にいつも良質な情報をありがとうございます（涙）

--

でもね、エンジニアの勉強を始めたころに
どれにも当てはまらないエラーにどハマりしまして
無駄に半日ほど過ごした経験があります。

--

ということで、5つ目の解決方法を提示させていただきたいと思います。
1〜4で解消できなかった方は、ぜひ以下を試してみてください。

```
（訂正前）
Route::get('user/top', [App\Http\Controllers\UserController::class, 'top']);

（訂正後）
Route::get('user/top', [\App\Http\Controllers\UserController::class, 'top']);
```


わかりましたか？

＿人人人人人人人人人人人人人人人人人人人人人人＿
＞　パスの前にバックスラッシュ一本つけるだけ　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣

以上です。
ご清聴ありがとうございました。

※なぜこのバックスラッシュが必要なときと必要でない時があるのか
 わかりきっていない私目のためにお優しい有識者の方ご教授くださりますと幸いです。
CloudformationでALB作成

ALBでコードを作りました。

```
AWSTemplateFormatVersion: '2010-09-09'
Description: ALB and EC2 with CloudFormation

Parameters:
  Subnet1:
    Type: String
    Description: Subnet 1 ID
  Subnet2:
    Type: String
    Description: Subnet 2 ID
  VpcId:
    Type: String
    Description: VPC ID
  KeyName:
    Type: String
    Description: Name of an existing EC2 KeyPair for SSH access

Resources:
  # Security Group for ALB and EC2
  MySecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for ALB and EC2
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0  # Restrict to your IP for SSH access
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0  # Allow HTTP traffic

  # Load Balancer
  MyLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: MyLoadBalancer
      Scheme: internet-facing
      Subnets:
        - !Ref Subnet1
        - !Ref Subnet2
      SecurityGroups:
        - !Ref MySecurityGroup

  # Target Group
  MyTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: MyTargetGroup
      Port: 80
      Protocol: HTTP
      TargetType: instance
      VpcId: !Ref VpcId
      Targets:
        - Id: !Ref MyEC2Instance

  # EC2 Instance
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-08ce76bae392de7dc  # Example: Amazon Linux 2 AMI
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref MySecurityGroup
      SubnetId: !Ref Subnet1

  # Listener for ALB
  MyALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref MyTargetGroup
      LoadBalancerArn: !Ref MyLoadBalancer
      Port: 80
      Protocol: HTTP
```

これで構築完了。
PHPで「objectにキャストする」とは？配列からオブジェクトへの変換を解説

## はじめに
こんにちは！未経験からエンジニア転職を目指している者です。オンラインスクールで本格的に学習して6ヶ月目に入りました。現在、PHPとLaravelを学びながら、ポートフォリオの作成を進めています。

学習の中で「objectでキャストする」という表現が出てきたとき、少し理解に時間がかかりました。そこで今回は、この「objectでキャストする」について整理し、具体例を交えてわかりやすく解説します。同じように悩んでいる方の参考になれば幸いです。

---

## 概要
PHPでは、配列をオブジェクトとして扱いたい場面がよくあります。その際に使われるのが「objectでキャストする」という方法です。

このキャストによって、データにアクセスする方法が変わり、コードが見やすくなります。

---

## 具体例

1.配列の例
まず、通常の連想配列を見てみましょう。

```php
$dummyData = [
    'id' => 12,
    'title' => '更新された投稿',
    'body' => '更新された投稿の内容です。'
];
echo $dummyData['title']; // 出力: 更新された投稿
```

2.objectにキャストする
これをオブジェクトにキャストしてみます。

```php
$dummyData = (object)[
    'id' => 12,
    'title' => '更新された投稿',
    'body' => '更新された投稿の内容です。'
];
echo $dummyData->title; // 出力: 更新された投稿
```

キャストすることで、['キー名'] ではなく、->キー名 でアクセスできるようになりました。

## 課題点
連想配列を使う場合、次のような課題があります：

1. コードの読みやすさ
['キー名'] 形式は視覚的に長く、コードが煩雑に見えることがあります。

2. コードの統一性
他のオブジェクトと同様に -> 記法を使いたい場合、連想配列だと記法が異なり、不便です。

## 利点
オブジェクトにキャストすることで、以下の利点が得られます：

1. コードの簡潔化
配列の ['キー名'] 形式から、オブジェクトの ->キー名 に変えることで、コードが読みやすくなります。

2. 統一された記法
オブジェクトのアクセス方法が統一され、Laravelなどのフレームワークとも親和性が高まります。

## まとめ
今回は、PHPで「objectにキャストする」方法について解説しました。この方法を知っていると、コードの見通しが良くなり、Laravelや他のフレームワークでの開発がよりスムーズになります。

最後まで読んでいただき、ありがとうございます！
大学生が卒業旅行のために二週間でwebアプリ作ってみた話

おはようございます。こんにちわ。こんばんわ。都内の理系大学生です。

今回初めての quita 投稿になります。作成した[みんなで割り勘](https://groupwarikan.com/) について書いていきます。今回[高校からの同級生](https://qiita.com/ssgaolai)との共同制作になります。こちらの記事も見てみてください。

割り勘アプリと聞いてどんなアプリかイメージつかない人もいるかと思うので簡単に機能を説明します。

## 旅行や飲み会など大勢の行事で支払管理を助けるアプリ
今回作成したアプリでは大勢の行事で、お金の建て替えが多かれ少なかれ発生した際に起こる「だれにいくら返せばいいんだっけ？」を解消することが出来ます。

旅行ではご飯代やアクティビティ代を立て替えてもらうことが多いと思います。そんなときに支払った金額を「みんなで割り勘」に記入しておけば、勝手に清算をしてくれるというアプリです。

**「そういうアプリって前からあるよね？」** と感じる人もいると思うので作成に至った経緯、理由を説明させてください。

## 現在の貯金面と大学時代の経験
急に話が変わりますが、理由はタイトルのように二つあります。
まず一つですが「現在の貯金面」です。私は今大学四年生で、卒論が終われば楽しい修学旅行が待っているはず、、！！とただいつも通りに過ごしていました。しかし卒業旅行の資金足りないことに気づいていました。バイトをすればいいじゃないと思いましたが私の前に現れたのは

**\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\１０３万の壁//////////////////**

卒業旅行には強敵すぎる壁がありました。しかし卒業旅行は諦めたくありません。自分の金銭面理由で友人の卒業旅行を止めたくない。そんな思いから「アプリで金が入る仕組みを作る」という行動に変わっていきました。

そしてwebアプリとして割り勘アプリを選びました。理由はこれまで友人との旅行で割り勘アプリを使っている中で「この機能ほしいな」という思いが生まれていたので、それらを形にするチャンスだと思ったからです。

具体的には

・外貨対応（実装済み）
・支払のばらつきをなくす機能（実装済み）
・レストランなど個人が違うものを頼みたいときへの対応（未実装）

といったあたりです。まだ未実装のモノは現在トライしています。

いろいろ書きましたが今の思いは
**・卒業旅行あきらめたくない！**
**・アプリで稼いだお金で卒業旅行行けたらかっこいいな！**
この二つです。
## アプリの現状と次回予告
https://groupwarikan.com/

ぜひ賛否の意見よろしくお願いします。

webアプリでお金を稼ぐのが難しいのは理解してますが、先ほどの思いが強いのでアドレナリンがドバドバ出て短期間で制作しました。ここから広告申請や機能拡張など取り組むことは山ほどありますが、とりあえず
### 拡散よろしくお願いします。

今回読んでいただきありがとうございました。経過報告はここでしていこうと思います。
[個人開発]学習記録アプリの振り返り2（データベースに保存・CICD追加）

## 状況
先月作った学習記録アプリにデータベースに登録する機能とCICDの機能を追加したので学習内容を振り返ります。

※前回の記事

https://qiita.com/shin-tech/items/63e6752b6be119f3d5c4

## 使用ツール
* React
* JavaScript
* Vite
* Supabase
* Firebase
* Jest

## 作成したアプリ
![学習記録アプリ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/037653bd-824c-3874-c78b-dfd65485a903.gif)

## 学習の振り返り
初めてSupabaseを使用し、データベースに登録・削除する機能を追加しました。

CICDに関しても初めての経験で、JestとSupabaseの環境変数の読み込みの部分でエラーが起きたり、自動デプロイや自動テストに関してはymlファイルへの記述に苦戦しながら作業を進めました。

同じJISOUのメンバーの方の記事や英語記事なども活用して、なんとかCICDの実装が出来たので、大変でしたがとてもいい経験になりました。

これから何個もアプリ作成に取り組み、理解の粒度を深めていきたいです。

## JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
[反省録] テキスト（Typography）にリンクをつける際: p vs span

## 概要
テキストにリンクをつける際、`<p>`リンクか`<span>`リンクかどのような違いがあるか

## 実際例
「リストページに戻る」ボタンの実装にあたって、普通のように実装しました。
```
<Link href="リストページ">
    <Typography>HogeHoge</Typography>
</Link>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674843/92b34f3e-1155-75c8-8c76-1273c9b5384a.png)

### 問題
実装結果、以下のようにHyperlinkが余計に長く、操作に邪魔になったりすることがありました。

![Screenshot 2024-11-17 at 5.37.17 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674843/5435a9df-7eb2-48f8-d923-03d338102ae8.png)

### 解決
テキストのみにリンクがつくことを想定していたため、以下のように修正。

```
<Link href="リストページ">
    <Typography component="span">HogeHoge</Typography>
</Link>
```

pタグでなく、spanタグとして実装するとこのようにリンクがテキストの幅のみになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674843/66e99098-bfbc-4276-97dc-a38d068cde31.png)

## 原因
pタグとspanタグの仕組み的な違いによる

![Screenshot 2024-11-17 at 5.13.51 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674843/4df46d6c-a034-906a-d868-dfc00071b75f.png)


![Screenshot 2024-11-17 at 5.14.26 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674843/eb637a8f-497f-2539-ca2b-6ad5376bf4f7.png)

## p vs span
- p: block-level element
    - `<p>, <div>, <h1> - <h6>, <section>, <article>, <header>, <footer>, <form>, <ul> & <ol>, <nav>, <main>`
    - ブロック単位で分かれます。
    - 一般的にブロック単位であるため、普通の場合は上記のように一行目全体的になります。
- span: inline-level element
    - `<span>, <a>, <img>, <em>, <b>, <i>, <code>, <small>, <br>`
    - そのコンテンツ単位に限って分かれます。
    - 上記例のようにテキストのみにリンクをつける場合は、display: inlineを考慮しないとなりません。

## 結論
- ブロック単位でデザイン・実装が必要なら`<p>`, `<div>`のようなblock-level elementを
- テキスト単位でデザイン・実装が必要なら`<span>`のようなinline-level emenetを

## 参照
[W3C](https://www.w3schools.com/html/html_blocks.asp)
[Block level vs Inline level](https://medium.com/@leroyleowdev/block-level-element-vs-inline-level-elements-html-css-e565216ed5d9)
5分で終わる！最も簡単にlocalでRailsを動かす

# 導入
今回は最新のrails8を最も簡単にセットアップして動くようにするコードを用意したので軽い検証や初めてrailsを使う方はぜひ使ってみてください！

# 必要なもの
* [docker desktop](https://www.docker.com/ja-jp/products/docker-desktop/)
* [vscode](https://code.visualstudio.com/download)

これだけです！
初学者向けに今回はvscodeで説明していますがエディターはなんでもいいです

# 手順
gitが普通に使える方は以下のリポジトリからクローンしてREADME.md通りに構築してください

https://github.com/YuuseiMatsunaga/easy-rails-start

gitがよくわからない方は以下の手順で進めてください

1. 適当な空のフォルダを開きます
![スクリーンショット 2024-11-17 17.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178067/90c72bee-ed30-885d-feae-5e6e912a9de8.png)

<br>
2. `Dockerfile.local`, `Makefile`, `setup.sh` の3つのファイルを作成します

![スクリーンショット 2024-11-17 18.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178067/6476c0c8-d84c-eb81-f037-227b7be8115d.png)


<br>
3. それぞれの中身は以下をコピペしてください

Dockerfile.local
```
FROM ruby:3.3.6-slim-bullseye
RUN apt-get update -qq && apt-get install -y \
  build-essential \
  sqlite3 \
  libsqlite3-dev \
  git
WORKDIR /usr/src/app
ENV BUNDLE_PATH=/usr/src/app/vendor/bundle
RUN echo "source 'https://rubygems.org'\ngem 'rails', '~> 8.0.0'\ngem 'sqlite3'" > Gemfile && \
    touch Gemfile.lock
COPY setup.sh /usr/src/app/setup.sh
RUN chmod +x /usr/src/app/setup.sh
RUN bundle install
EXPOSE 3000
ENTRYPOINT ["sh", "/usr/src/app/setup.sh"]
```

setup.sh
```
#!/bin/bash

if [ ! -f /usr/src/app/Gemfile ]; then
  rails new . --database=sqlite3 --skip-bundle --force --skip-git
fi

bundle install
bundle exec rails db:migrate
rm -f tmp/pids/server.pid
bundle exec rails server -b 0.0.0.0
```

Makefile
```
CONTAINER_NAME = rails-container
IMAGE_NAME = rails-sample-app

build:
	docker build -t $(IMAGE_NAME) . -f Dockerfile.local
run:
	docker run --rm -p 3000:3000 \
		-v $(PWD):/usr/src/app \
		-v $(PWD)/vendor/bundle:/usr/src/app/vendor/bundle \
		--name $(CONTAINER_NAME) $(IMAGE_NAME)
c:
	docker exec -it $(CONTAINER_NAME) bundle exec rails c
bash:
	docker exec -it $(CONTAINER_NAME) bash
stop:
	@docker ps -q -f name=$(CONTAINER_NAME) | xargs -r docker stop
```
<br>

4 . ターミナルを開いてください
![スクリーンショット 2024-11-17 18.09.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178067/c28f4d8d-fda1-0f09-d351-d4fca036cdc8.png)

ターミナルに以下のコマンドを打ちます
```
make build
```
```
make run
```
ターミナルが写真のようになった後、http://localhost:3000 にアクセスしてrailsの画面が表示されれば成功です
![スクリーンショット 2024-11-17 18.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178067/d1fd0b84-caf8-fd51-ef0e-e601a5a8a9cc.png)

:::note warn
コンテナを落としたい時はcontrol + c だけだとコンテナは止まらないので `make stop` をするかdocker desktopで手動で止めてください
:::
<br>

rails consoleを開きたい場合は
```
make c
```

コンテナに入りたい場合は
```
make bash
```

を使ってください
Form内の送信ボタンがsubmitできない

入力フォームを作成中、ボタンを押しても画面遷移しなかったので対策を自分用に残しておきます。

## 画面遷移の流れ
入力画面→確認画面(ここで問題発生)→完了画面

## ファイル構成
``` 
form
 └input.php　  //入力画面
 └confirm.php　//確認画面・完了画面
 
 ※確認画面・完了画面はフラグで切替え。
```

## ソース

```input.php
<!DOCTYPE html>
<meta charset="utf-8">
<header>

    <body>
        └入力画面</br>
        </br>
        <form method="POST" action="confirm.php">
            氏名</br>
            <input type="text" name="my-name">
            </br>
            メールアドレス</br>
            <input type="email" name="email">
            </br>
            <input type="submit" name="confirm-btn" value="確認ボタン">
        </form>
    </body>
</header>
</html>

```
```comfirm.php
<!-- 確認・完了画面-->
<!-- 条件によって表示する画面を切り替える -->
<?php
$pageFlg = 1;
var_dump($_POST['submit-btn']);
if (!empty($_POST['confirm-btn'])) {
    $pageFlg = 0;
    //echo '0です';
} else if (!empty($_POST['submit-btn'])) {
    $pageFlg = 1;
    echo '1です';
}
?>
<!DOCTYPE html>
<meta charset="utf-8">
<header></header>

<body>
    画面名</br>
    <!-- 確認画面 -->
    <?php if ($pageFlg === 0) : ?>
        └確認画面</br>
        氏名</br>
        <?php echo $_POST['my-name']; ?></br>
        e-mail</br>
        <?php echo $_POST['email']; ?></br>
        <input type="back">
        <input type="submit" name="submit-btn" value="完了ボタン">
    <?php endif ?>
    <!-- 完了画面 -->
    <?php if ($pageFlg === 1) : ?>
        └完了画面
        </br>
        送信完了しました。
    <?php endif ?>
</body>
</html>

```

input.phpの送信ボタンは機能するのに、comfirm.phpの確認ボタンはなぜ機能しないのだろう…？違いは？

## 原因
`<form></form>`の中にボタンが入っていなかった。
ボタンを`<input>`タグで作成する場合、formタグ内に記述する必要があった。

## 対策
`<form>`タグの追加
```confirm.php
<!-- 確認・完了画面-->
<!-- 条件によって表示する画面を切り替える -->
<?php
$pageFlg = 1;
var_dump($_POST['submit-btn']);
if (!empty($_POST['confirm-btn'])) {
    $pageFlg = 0;
    //echo '0です';
} else if (!empty($_POST['submit-btn'])) {
    $pageFlg = 1;
    echo '1です';
}
?>
<!DOCTYPE html>
<meta charset="utf-8">
<header></header>

<body>
    <!--追加-->
    <form>
        画面名</br>
        <!-- 確認画面 -->
        <?php if ($pageFlg === 0) : ?>
            └確認画面</br>
            氏名</br>
            <?php echo $_POST['my-name']; ?></br>
            e-mail</br>
            <?php echo $_POST['email']; ?></br>
            <input type="back">
            <input type="submit" name="submit-btn" value="完了ボタン">
        <?php endif ?>
        <!-- 完了画面 -->
        <?php if ($pageFlg === 1) : ?>
            └完了画面
            </br>
            送信完了しました。
        <?php endif ?>
    </form> <!--追加-->
</body>
</html>

```
## おわりに
`<input>`タグを使わず、`<button tyep="submit" onclick="submit();">`でボタンを設置することも可能だなと思いました。(むしろこっちが理想では？)
この場合、現ソースはPOSTした値の有無でフラグ切替えをしているため、ボタンが押されたかの判定処理も変更が必要になりますね。
これはまた今度、考えてみます。。
SORACOM Onyx – LTE USB ドングル (SC-QGLC4-C1)をRaspberry Pi zero 2wでセットアップしてみた

## 2024/12/17にサポートより、ご連絡をいただきNetwork Managerに対応したsetup_eg25.shがリリースされたことを確認いたしましたので、下記の記事の内容は過去のものとなりました。


Soracom Onyx - LTE™ USB ドングルをRaspberry Pi zero 2Wにセットアップを行いました。

 [参照した公式Document](https://users.soracom.io/ja-jp/guides/usb-dongles/soracom-onyx/raspberrypi/)

ドングル経由の通信はうまくできたのですが、内蔵のWi-Fiを一度OFFにすると２度ともOnにならなくなりました。
私が調べた限りでは、ネットワークの管理が、2023年のbookwormからこれまでのdhcpcdではなくNetworkManagerが標準に変わっていますが、setup_eg25.shの中身を見ると、2020年2月と書かれており、中身がnetworkManagerに対応した内容となっていないことで、内蔵のWiFiが正常に動作しなくなってしまったように見受けられます。
応急的に、setup_eg25.shが作る/etc/network/interfacesの記述を変更して稼働するようになっていますが、他のユーザーも同様に困ると思いますので、setup_eg25.shのアップデートをお願いいたします。

具体的には、/etc/network/interfacesに追加されている、ifaceとwpa-confの行をコメントアウトしました。これが正しいのか、他の行もNetworkManagerでは不要なのかも調べきれていませんが、とりあえずはこれで何とかなっていますので、共有いたします。
AT89C51のProgrammer設計編

AtmelのAT89C51のProgrammerを考えてみました。

AT89C51は8051を使ったマイコンです。書き込みには12Vが必要なタイプと5Vだけで良いものがあります。AT89C51はパラレルでの書き込みですがAT89S51は線の少ないISPが使えるようです。

Flashは4Kで1000回の書き込み保証があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/2fff8d40-70ee-bd92-3d94-4d807c7aa871.png)

MEEPROMMERをベースに考えて見ます。

https://github.com/yamori813/MEEPROMMER/blob/master/Hardware/Prototype_schema.jpg

|AT89C51|Pin|Arduino||
|:--|:--|:--|:--|
|ADDR|P1.0-P1.7|A0-A2|74HC595|
|ADDR|P2.0-P2.3|A0-A2|74HC595|
|MODE|P2.6|D10|
|MODE|P2.7|D11|
|MODE|P3.6|D12|
|MODE|P3.7|D13|
|DATA|P0.0-P0.7|D2-D9|
|PROG ALE||A3|
|EA/VPP||A4|CONTROL|

MODEの4本をDIP SWにすればMEEPROMMERのシールドをそのまま使えそうです。

チップが1個しかないので、実際作るかは未定です。
Laravelの脆弱性CVE-2024-52301が個人開発しているプロダクトに影響するかを調べてみた

個人で開発をしているプロダクトで、脆弱性CVE-2024-52301を踏んでしまっているかを調べてみた際の備忘録です。

# 脆弱性CVE-2024-52301について解説
2024年11月13日ごろに発表されました。

https://github.com/laravel/framework/security/advisories/GHSA-gv7v-rgg6-548h

CVSSのスコアは8.7で深刻度は高。

https://nvd.nist.gov/vuln/detail/CVE-2024-52301

内容としては、php.iniの項目の一つであるregister_argc_argvをonに設定していた場合に、クエリストリングから環境変数を変更できてしまうという内容です。

すでに本脆弱性に対応したバージョンは公開されているので、バージョンを上げることで対処することができる脆弱性です。

なぜかEOLを迎えているバージョン6から9も対応されています、助かりますね！
~~EOLになってもいろいろな理由でバージョンを上げることができないプロダクト、あると思います。~~
深刻な脆弱性だった場合はEOL関係なしに修正されるものなんだろうか:thinking:




# register_argc_argvについて解説
php.iniの一項目で、コマンドラインからphpファイルを実行した際に、引数を取得するかしないかを設定する項目です。
詳しくは以下の公式サイトをご覧ください。

https://www.php.net/manual/ja/ini.core.php#ini.register-argc-argv

https://www.php.net/manual/ja/reserved.variables.argv.php

https://www.php.net/manual/ja/reserved.variables.argc.php

# つまり脆弱性CVE-2024-52301ってなんなのさ？
register-argc-argvの設定値をonに設定していた場合、クエリストリングで環境変数を変更されてしまう脆弱性。

# register_argc_argvの設定値を確認していく
今回の脆弱性を踏んでしまっているかを確認するために、register_argc_argvの設定値を確認します。
(さっさと脆弱性対応済みのバージョンに上げてしまってもいいのですが、気になったので調べてみます)

以下のコマンドでSAPI(Server Application Programming Interface)がFPMを使用している場合。
つまりWebAPI等でphpファイルが実行された際の設定値を確認することができます。
```terminal
php-fpm -i | grep register_argc_argv
```
帰ってきた値が以下であれば、今回の脆弱性が発生する要因であるregister_argc_argvの設定値はoffに設定されているので今回の脆弱性は踏んでいないといった具合です。

```terminal
register_argc_argv => Off => Off
```

ちなみに自分はハマったのですが、以下のコマンドだと今回の脆弱性とは関係しない、コマンドラインから実行した際のregister_argc_argvの設定値が取得されます。
```terminal
php -i | grep register_argc_argv
```

こちらのコマンドラインから実行した際のregister_argc_argvの設定値は、確認をしても意味がないです。
この値は必ずonに上書きされているので、今回の脆弱性が発生する要因になる、SAPIがFPMを使用している場合のregister_argc_argvの設定値とは違う値になるので。

言われてみるとそのとおりなのですが、コマンドラインからphpファイルが実行された場合は必ずphp.iniの設定でregister_argc_argvの設定値はonに上書きされるようになっています。
だからコマンドラインから実行した場合と、SAPIがFPMを使用している場合でregister_argc_argvの設定値が違うわけなんですね。

https://www.php.net/manual/ja/features.commandline.differences.php#:~:text=%E4%B8%8A%E6%9B%B8%E3%81%8D%E3%81%95%E3%82%8C%E3%82%8B%20php.ini%20%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96

> register_argc_argv
> コマンドラインから実行した際のデフォルト値: true
この設定が true なので、CLI SAPI では常に argc (アプリケーションに渡した引数の数) および argv (実際の引数の配列) を使うことができます。
> CLI SAPI を使用するときに PHP の \\$argc 変数と \\$argv 変数が登録され、適切な値がセットされます。 あるいは \\$_SERVER や \\$_SERVER['argv'] を使うこともできます。


Laravelの機能の一つであるタスクスケジューラーやartisanコマンドといった、性質上コマンドラインから実行する必要がある機能を使用するためには、register_argc_argvの設定値をonにする必要がある。
だからLaravelを使用しているプロダクトではregister_argc_argvの設定値をonにしておかないとLaravelの機能の大半が使用できなくなるのかなと思っていたのですが、コマンドラインから実行する際は自動的にonに書き換えられるんですね...知らなかった...

タスクスケジューラーを実行した際や、artisanコマンドからファイルを実行した際にphp_sapi_nameメソッドを使い、現在使用されているSAPIを確認すると、CLI SAPIが使用されていることが確認できます。
だからregister_argc_argvの設定値をoffに設定していても、タスクスケジューラー等が使えるんですね。

https://www.php.net/manual/ja/function.php-sapi-name.php



# 最後に
コマンドラインからphpファイルを実行する際には必ずregister_argc_argvの設定値はonに上書きされる。
なのでコマンドラインで実行した際に引数を取得するかしないかを決めるというregister_argc_argvの性質上、SAPIでFPMが使用されているときには意味のない設定値であるregister_argc_argvをonに設定する必要はない。
なのでほとんどのプロダクトではregister_argc_argvの設定値はoffに設定されているのではないかなと感じました。