OmniAICreator/Qiita-1.07M huggingface dataset:
C#管理者実行

```C#:runadmin.cs

using System; 
using System.IO;
using System.Diagnostics;
using System.Security.Cryptography;
using System.Windows.Forms;

public class RunAdmin
{
	//ハッシュ取得用メソッド
	static string gethash(string strFilePath){

		var fs = new FileStream(strFilePath, FileMode.Open, FileAccess.Read);

		byte[] sha1byte = SHA1.Create().ComputeHash(fs);

		string sha1string = BitConverter.ToString(sha1byte).Replace("-","").ToUpper();

		return sha1string;

	}


	public static void Main(string[] args)
	{

		//自プログラムフォルダパス取得
		string ExePath = System.Reflection.Assembly.GetEntryAssembly().Location;

		//自プログラムフォルダ取得
		string ExeDir = Path.GetDirectoryName(ExePath);

		//対象プログラム
		string TargetExe = "TestApp.exe";

		//対象プログラムハッシュ
		string TargetHash = "B20ECB788F4AAA98A62C5AE334B3C4EE6A26D013";

		//string TargetArguments = "";
	
		

		//引数なし（初回起動時）
		if ( args.Length == 0 ){

			Process p1 = new Process();		

			//別ユーザーとして自プログラムを実行
			p1.StartInfo.FileName = ExePath;
			p1.StartInfo.Arguments = "/runadmin";
			//p.StartInfo.UserName = ""
			//p.StartInfo.Domain = ""
			//p.StartInfo.Password = ""
			p1.StartInfo.UseShellExecute = false;

			p1.Start();
			p1.WaitForExit();

		//引数runadmin指定（2回目起動時）
		} else if( args[0] == "/runadmin" ) {

			string hashresult = gethash(Path.Combine(ExeDir,TargetExe));

			if ( hashresult == TargetHash){

				Process p2 = new Process();

				//別ユーザーとして起動されたので、対象のプログラムを管理者権限で実行
				//対象のファイルのファイルハッシュチェック
				//自分の実行フォルダパス

				p2.StartInfo.FileName = TargetExe;
				p2.StartInfo.UseShellExecute = true;
				p2.StartInfo.Verb = "RunAs";

				//引数が必要な場合に使用
				//p.StartInfo.Arguments = TargetArguments;
				
				p2.Start();
				p2.WaitForExit();

			}else{

				//ハッシュが登録ずみでない
				MessageBox.Show("ファイルハッシュが一致しません");

			}
		} 
	}
}
```
LT発表のソースコードについて(nagauta)@Babylon.js 勉強会 vol.2

# ソースコードについて@Babylon.js 勉強会 vol.2

### 初めに
https://babylonjs.connpass.com/event/276698/
今更ですが僕の発表「LT 2 2D画像を3Dモデルに変換して表示するアプリを作ってみる」のソースコードについて記述しておきたいと思います。

### 発表資料
https://drive.google.com/file/d/1c2ydFHkEjBjfAcOgqxJTM7DwIMsgGHNZ/view

### 概要
機械学習(単眼深度推定モデル)を用いて2D画像を3Dモデルに変換し表示するアプリケーションを作成した。

### アプリケーションの構成図
![2023-04-01_demo-img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/b9b5769c-75e9-af2d-1e00-fbb642ce1210.png)

### 実行環境
* python:3.9
* FastAPI
* huggingface.co

### ソースコード
https://huggingface.co/spaces/nagauta/image2mesh
機械学習のロジックは[image2mesh by mattiagatti](https://huggingface.co/spaces/mattiagatti/image2mesh)をそのまま使用している。
今回の発表のため、上記をAPIとして利用できるようにfastAPIでラップした。またWEBアプリケーションとして実行できるように編集をおこなった。

### アウトプット
サンプルのbed.pngを読み込ませた場合(結構待ち時間アリマス)
* ファイルを選択を押下する
* 変換するを押下する
* オブジェクトが表示されるまで気長に待機する
![スクリーンショット 2023-05-21 22.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/282e9c23-ce0d-8691-14ea-f08f0d1fd867.png)

### リファレンス
[Generate a 3D Mesh from an Image with Python](https://towardsdatascience.com/generate-a-3d-mesh-from-an-image-with-python-12210c73e5cc)
[image2mesh by mattiagatti](https://huggingface.co/spaces/mattiagatti/image2mesh)

### 所感
画像によっては微妙なモデルが表示されてしまう。
理解を深めていき解決策を調査したい。
HuggingFaceを初めて使用したが、機械学習を試すのに気軽でめっちゃ便利だなあと思った。

### TODO
本稿に深層学習モデルやソースコードの解説を追記予定。
備忘録：Flutterの生産性

# はじめに

界隈で話題になった、

[アプリ開発市場の現状と今後の予想（2023〜2026）](https://otihateten.hatenablog.com/entry/2023/05/16/233508)

の中で「Flutterはどのくらい工数を圧縮できるのか？」という話題があり、
これは自分も感覚値だと1.5とか1.7とかなのだけど、営業と話していても顧客と話していても話題に上がるので、もうちょっと考えてみようとなった。

自分はFlutterの案件を3年前から取り組んでいて、3案件ほど開発や保守を行なってきたエンジニアです。
主にPMをすることが多いですが、レビューやたまにコードを書いたりもしています。

# 考察

自分の担当する案件ではいわゆるV字モデルでの開発をすることが多い。

なので、おおまかな工程で区切って考えてみます。

| 工程 | 概要 |
|:--|:--|
| 要件定義  | お客様の要望を取りまとめて、アプリで実現する目処を立てる。次工程以降の見積もりをすることもある。  |
| 基本設計  | 画面、機能のアプリの外観を整理する。細かい仕様もここで詰める  |
| 詳細設計  | アプリのHow Toを決める。画面間、機能間の共通機能の取り決めやコンポーネントの設計をする  |
| 製造  | アプリの実装、パターンよりも粗いレベルで挙動の実現度を確認する（動作確認）  |
| 単体試験  | アプリに対しての試験、ホワイトボックスをベースにブラックボックスレベルでも確認する  |
| 結合試験  | 画面間、機能間、あるいはモジュール間の連結を確認する  |
| 総合試験  | 本番相当の環境を用意し、シナリオベースの試験、性能・負荷などの非機能試験、ユーザーシナリオ以外の運用想定シナリオの試験を行う  |

これをFlutterで対応する場合は、

| 工程 | Flutterでやる場合 |
|:--|:--|
| 要件定義  | 開発言語の生産性は関係しない。ただし、クロスプラットフォーム言語の場合、OSレイヤに近い機能を使う場合には制限やAPIがない場合、結局2OSそれぞれ実装しないといけないこともある。とはいえ、それらの事情は基本設計以降に回す。  |
| 基本設計  | 2OS独自の機能がなければ、１OSの工数で進められる  |
| 詳細設計  | 2OS独自の機能がなければ、１OSの工数で進められる  |
| 製造  | 2OS独自の機能がなければ、１OSの工数で進められる  |
| 単体試験  | この時点で実機や2OSそれぞれの試験を行うか次第だが、１OSでも十分な感覚  |
| 結合試験  | この時点では実機で実際の動作確認をした方がいいので、２OS分の工数がかかる  |
| 総合試験  | この時点では実機で実際の動作確認をした方がいいので、２OS分の工数がかかる  |

完全に個人感覚になりますが、基本設計〜単体試験が１OSで十分なので、
それぞれNative開発した時に１００＋１００＝２００のような計算だとすると...130程度でしょうか（※）。

※要件定義(10)+基本設計(10)+詳細設計(20)+製造(20)+単体試験(20)+結合試験(10)+総合試験(10)で雑に計算した場合。

# まとめ

気になったので、雑にまとめてみました。
作るアプリや会社としての知見、その時の体制やPJの進め方によって前後すると思います。
Flutterでの生産性を上げていく場合、どこまでがFlutterで工数を圧縮できて、それ以外の部分はどう品質を保つかは知見の蓄積が必要かな、と思いました。
useEffectとuseCallbackの使い分け

# 記事を書いた背景
こんにちは！
最近ReactとRailsでマーケットプレイスアプリケーションと記事投稿アプリケーションを作りました。
最初にマーケットプレイスアプリケーションを作った際に、バックエンドからデータを取得するときにaxios通信を使いました。そのときuseCallbackを使用しました。
次に記事投稿アプリケーションを作ったのですが、バックエンドからデータを取得する機能をつける際にuseEffectを使う方法があると気づきました。

どのような違いがあって、どんな場面でどちらを使うといいのか、こちらに書いていこうと思います！

# useEffectの基本構造
```react
useEffect（実行する関数, [着目したい値]);
```
React Hooksの基本のフックの一つ。
[]に変数などの値を入れて、その値が変化した時に関数を実行できます。
[]に何も入れずに空配列で使用すると、最初の一回だけ実行したい処理を実行できます。
この方法は初期データを取得する時などに使われます。

# 今回の使用方法(useEffect)
記事投稿アプリケーションを作るにあたり、axios通信を使用してバックエンドから記事一覧を表示する際に使用しました。
コードは以下のように書きました。
※今回はuseEffect部分について着目するため、useEffect部分のみ抜粋します。
```react:app/src/components/hooks/useAllPosts.ts
  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await axios.get<PostWithIdType[]>('http://localhost:3001/posts');
        setPosts(response.data);
      } catch (error) {
        setError(true);
      } finally {
        setLoading(false);
      }
    };
    fetchData();
  }, []); 
```
　(バージョン"react": "^18.2.0","typescript": "^4.4.4")
こちらのコードではaxiosを使用してgetメソッドでバックエンドURLの情報を取得し、一覧表示データをフロントへ返しています。
記事一覧情報取得はページを表示する際に一度だけ読み込まれる必要があります。
そのため、useEffectの第二引数は空配列[]にしています。

# useCallbackの基本構造

```react
const 関数名　= useCallback（実行する関数, [着目したい値]);
```
useCallbackは関数のメモ化をします。
関数が毎回呼ばれてしまうのを防ぐことができます。
useEfffectと同じく、[]の値が変化すると第一引数の関数が実行されます。

# 今回の使用方法(useCallback)
マーケットプレイスアプリケーションを作るにあたり、axios通信を使用してバックエンドから商品一覧を表示する際にuseCallbackを使用しました。
コードは以下のように書きました。
※今回はuseCallback部分について着目するため、useCallback部分のみ抜粋します。
```react
 const getItems = useCallback(() => {
   axios
   .get<Array<Item>>("http://localhost:3000/items")
   .then((res) => setItems(res.data));
 }, []);
```
(バージョン"react": "^18.2.0", "typescript": "^4.9.3")
# useEffectとuseCallbackどちらを使用するのが良い？
どちらの機能も一言で表すと"着目している値が変化した時に関数を実行させる"機能です。
今回のように、バックエンドからデータ一覧を取得して表示する際にはuseEffectとuseCallback、どちらを取得するのが良いのでしょうか？

着目する点は、useCallbackは再レンダリングによる不必要な関数生成を防ぐために使うという点です。
今回は不必要に何度も呼ばれてしまう関数はありません。
そのため、useEffectの使用が適切です。

以上、useEffectとuseCallbackの使い分けでした！
最後まで読んでくださり、ありがとうございました。
ヒーローで教える、オーバーライドとオーバーロードの違い

# 概要
プログラミングを始めてから多くの人が躓くであろう、「オーバーライド」と「オーバーロード」について説明していきたいと思います。この２つは今後プログラミングをしていく上で、とても重要な項目なのでしっかり理解しておくことをお勧めします。
これ以降、ヒーローになったつもりで記事を書いていくのでご承知の上、お読みになって下さい。
みんな、私についてこい！
# 目次
 - [オーバーライド：力の強化](#オーバーライド力の強化)
 - [オーバーロード：力の多様性](#オーバーロード力の多様性)
 - [オーバーライドとオーバーロード：力の使い分け](#オーバーライドとオーバーロード力の使い分け)
 - [まとめ](#まとめ)
 
# オーバーライド：力の強化
まず、"オーバーライド"という力について話しよう。これは、ヒーローが元々持っている力を新しく、より強くする力なんだ。例えば、ヒーローが元々「飛ぶ」能力を持っているとしよう。でも、この「飛ぶ」能力を使って、さらに速く飛べるようにしたいと思ったらどうする？そう、それがオーバーライドの力なんだ！「飛ぶ」能力を「超高速飛行」に進化させることができるんだ。
# オーバーロード：力の多様性
次に、"オーバーロード"という力について話すぞ。これは、ヒーローが既に持っている能力をたくさんの違う方法で使えるようにする力だよ。例えば、スーパーヒーローが「力」を使って重い物を持ち上げる能力があるとする。でも、この「力」を使って、小さな物をそっと優しく持ち上げることも、とても重い物を持ち上げることもできるようにしたいと思ったらどうする？そう、それがオーバーロードの力なんだ！一つの能力を色々な形で使うことができるんだ。



# オーバーライドとオーバーロード：力の使い分け
それぞれの力は、ヒーローがどのように問題を解決するかによって使い分けられるんだ。オーバーライドは、既存の能力を強化して新しい挑戦に対応するときに使うんだ。一方、オーバーロードは、一つの能力を多様な状況で使いたいときに便利なんだ。だから、ヒーローは常にこれらのパワーをどのように使うかを考えなければならないんだ。
# まとめ
それぞれの能力、オーバーライドとオーバーロードは、ヒーローが自分の力を最大限に活用するためにとても大切なものなんだ。オーバーライドは力を強化し、オーバーロードは力を多様に使う。これらのパワーを理解して使いこなすことで、君も素晴らしいプログラミングのヒーローになれるぞ！

それでは、ヒーローのみんな、力を合わせて世界を救おう！それぞれの能力を使いこなして、最強のプログラミングヒーローになろう！それぞれの挑戦に対して最適な力を選択し、プログラミングの世界で活躍しよう！あなたの冒険が成功することを願っています。それじゃあ、またな！
Rubyの実行コンテキスト

## 実行コンテキストとは
実行コンテキストとは、プログラムの実行時の文脈や環境のことを言います。
その実行時にどのような変数やメソッドが定義されていて、スコープはどうなっているのかなどです。

Rubyの場合、プログラムを実行すると[main](https://docs.ruby-lang.org/ja/latest/class/main.html)というオブジェクトが生成され、これがトップレベル、グローバルの実行コンテキストになります。(※ ```main```は```Object```クラスのインスタンス)
したがって、Rubyにおいてプログラムは、mainというグローバルコンテキストの中で実行されるということになります。

```irb```を起動してselfと入力すると、mainが返ってきますが、これはmainというコンテキストで実行されるということです。
```irb
  irb(main):001:0> self
  => main
```

クラス定義やインスタンスを作成すると、実行コンテキストが作成されます。


## Binding
Rubyでは[Bindingクラス](https://docs.ruby-lang.org/ja/latest/class/Binding.html#I_RECEIVER)によって、上記で説明した実行コンテキストをオブジェクトとして持つことができます。
[bindingメソッド](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/binding.html)を実行するとその実行コンテキストのオブジェクトを生成します。

```irb
  irb(main):001:0> b = binding
  => #<Binding:0x00000001008ba668>
```
class定義やインスタンス生成によって作成された実行コンテキストも以下のようにbindingメソッドによってオブジェクト化することができます。
```ruby
  class Hoge
    def self.class_binding
      binding
    end
    def instance_binding
      binding
    end
  end

  cb = Hoge.class_binding
  ib = Hoge.new.instance_binding
  puts cb, cb.receiver
  # => #<Binding:0x0000000102e60d40>
  # => Hoge
  puts ib, ib.receiver
  # => #<Binding:0x0000000102e60b60>
  # => #<Hoge:0x0000000102e60ca0>
```
トップレベル、グローバルの実行コンテキストのオブジェクトは定数になっていて、[TOPLEVEL_BINDING](https://docs.ruby-lang.org/ja/latest/method/Object/c/TOPLEVEL_BINDING.html)で参照することができます。
```irb
  irb(main):001:0> b = TOPLEVEL_BINDING
  => #<Binding:0x0000000109ddcca0>
```

## eval
[evalメソッド](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/eval.html)では、このBindingオブジェクトを指定することによって、評価のコンテキストを変えることができます。

```ruby
  @x = 'global'

  class Hoge
    def initialize(x)
      @x = x
    end

    def self_binding
      binding
    end
  end

  hoge = Hoge.new('instance')
  instance_binding = hoge.self_binding

  eval("puts @x", TOPLEVEL_BINDING)
  # => global
  eval("puts @x", instance_binding)
  # => instance
```
1つ目の```eval```は第2引数に```TOPLEVEL_BINDING```を渡しているため、第1引数のscriptを```TOPLEVEL_BINDING```の実行コンテキストで評価しています。
そのため、インスタンス変数```@x```は、グローバルコンテキストのインスタンス変数を参照します。

2つ目の```eval```は第2引数にインスタンス生成によって生成された実行コンテキストのオブジェクトを渡しているため、その実行コンテキストで評価されています。この場合、生成されたインスタンスのインスタンス変数```@x```を参照します。

## 参考記事
https://medium.com/rubycademy/context-binding-in-ruby-fa118ea62269

https://bparanj.gitbooks.io/ruby-basics/content/part2/binding.html
Unity BuildSettingsからシーン（Scene）の名前を取得する方法

## 0.0 はじめに
シーンの遷移(SceneManager.LoadScene)などを行う際に、下記のようにBuildSettings内のScenes in Buildへシーンを登録しますが、この登録されたシーンの名前を取得する方法を見つけるのに、少し手間取ったので忘れないよう記事作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/3811ce2a-6c59-970f-e98d-e36c7f061542.png)
















## 1.0 取得方法
EditorBuildSettingsを使うためにネームスペースにusing UnityEditorを追加します。
EditorBuildSettings.scenesシーンの情報が入っています。
シーンの情報は順番に配列の形で格納されています。
これを使ってまず各シーンのパスを入手。
そのパスからシーンの名前を取得します。最後はGetFileNameWithoutExtension（ファイル名だけを取得する関数を使いました。）




```C# Test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; // EditorBuildSettingsを使うために追加

public class Test : MonoBehaviour
{
    private void Start() {
        CheckSceneName();
    }

    /// <summary>
    /// BuildSettingsからシーンの名前を取得する方法
    /// 登録されているシーンをコンソールに印字する
    /// </summary>
    void CheckSceneName() {

        for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) {
            // シーンのパスを取得
            string scenePath = EditorBuildSettings.scenes[i].path;

            // パスからシーン名を取得
            string sceneName = System.IO.Path.GetFileNameWithoutExtension(scenePath);

            // コンソールに表示
            Debug.Log($"{i}番目のsceneの名前は {sceneName} です");
        }

    }

    /// <summary>
    /// BuildSettingsに登録されているシーンの名前を取得する
    /// 返り値はStringの配列
    /// </summary>
    string[] GetSceneName() {

        // シーンの名前を入れる配列
        string[] sceneNameArray = new string[EditorBuildSettings.scenes.Length];

        for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) {
            // シーンのパスを取得
            string scenePath = EditorBuildSettings.scenes[i].path;

            // パスからシーン名を取得
            string sceneName = System.IO.Path.GetFileNameWithoutExtension(scenePath);

            // 配列に登録
            sceneNameArray[i] = sceneName;
        }

        return sceneNameArray;
    }
}
```







## 2.0 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/03ffc05a-97a9-57c2-1eb1-df1a76465685.png)










## 3.0 おまけ
下記はシーンの名前を配列で返す関数です。
 
```C# Test2.cs

/// <summary>
/// BuildSettingsに登録されているシーンの名前を取得する2
/// 返り値はStringの配列
/// </summary>
string[] GetSceneName() {
    
    // シーンの名前を入れる配列
    string[] sceneNameArray = new string[EditorBuildSettings.scenes.Length];

    for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) {
        // シーンのパスを取得
        string scenePath = EditorBuildSettings.scenes[i].path;

        // パスからシーン名を取得
        string sceneName = System.IO.Path.GetFileNameWithoutExtension(scenePath);

        // 配列に登録
        sceneNameArray[i] = sceneName;
    }

    return sceneNameArray;
}
```
【SwiftUI】UIWindowSceneを@Environmentを使って取得する

# はじめに
SwiftUIで`UIWindow`を使うことがたまにあります。
ちょっとめんどなので`@Environment`で簡単に使えるようにしてみました。

この`UIWindow`の取得方法がベストなのかはわからないです。
もっと良い方法があればコメントください。

# 実装
```swift
private struct UIWindowSceneEnvironmentKey: EnvironmentKey {
    static var defaultValue: UIWindowScene? {
        return UIApplication.shared.connectedScenes.first(where: {
            $0.activationState == .foregroundActive
        }) as? UIWindowScene
    }
}

extension EnvironmentValues {
    var windowScene: UIWindowScene? {
        get { self[UIWindowSceneEnvironmentKey.self] }
        set { self[UIWindowSceneEnvironmentKey.self] = newValue }
    }
}

extension View {
    func windowSceneValue(_ windowScene: UIWindowScene?) -> some View {
        environment(\.windowScene, windowScene)
    }
}
```

# 使い方
iOS14からレビュー依頼を出す際にUIWindowSceneが必要になりました。
今回は例としてレビュー依頼を実装してみます
```swift
import SwiftUI
import StoreKit

struct ContentView: View {
    @Environment(\.windowScene) var windowScene
    var body: some View {
        Button("レビュー依頼") {
            if let windowScene {
                SKStoreReviewController.requestReview(in: windowScene)
            }
        }
    }
}
```

# おわり
簡単に書けるようになりました
MockeryのshouldReceiveがvscode上でundefinedになり赤線が消えない

### 現象

サンプルコード
``` php
class SampleTest extends TestCase
{
  public SampleRepositoryInterface $repository;

  public function setUp()
  {
    parent::setUp();
    $this->repository = \Mockery::mock(SampleRepositoryInterface::class);
  }
  
  public function test_sample()
  {
    $this->repository->shouldReceive('getAll')->andReturn([]);
  }
}
```

`SampleRepositoryInterface`に`shouldReceive`を定義していないので赤線が出る。
![スクリーンショット 2023-05-21 22.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946622/9f81f2f5-cdce-6171-1af4-858ff5af385a.png)

### 解消方法
アノテーションで`\Mockery\MockInterface`を指定することでphp-intelephenseが`shouldReceive`を認識できるようになる。

``` php
/**
 * @var SampleRepositoryInterface|\Mockery\MockInterface $repository
 * /
public SampleRepositoryInterface $repository;
```

![スクリーンショット 2023-05-21 22.14.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946622/b9b8d201-56a9-9a93-2b0c-13d8ddbca057.png)


### 参考
https://github.com/bmewburn/vscode-intelephense/issues/1784#issuecomment-1208644051
https://github.com/bmewburn/intelephense-docs/blob/master/gettingStarted.md#type-declarations-and-annotations
AndroidStudio検索履歴を見る方法

今回はAndroidStudioでコード検索の履歴を見る方法です。
自分は毎回検索欄に入力していたのですが、最近履歴が見れることを知りました。
同じ言葉で検索をするときに便利だったりします。


![スクリーンショット 2023-05-21 22.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/60008a25-3fd2-2de3-7daf-16d812ddf99c.png)

検索時に出てくる虫眼鏡をクリックすると検索履歴が出てきます。
間違えてクリックした時に履歴が出てきて知りました。


AndroidStudioにはまだ知らない機能がありそうですね。
【Android】TextViewで動的に前後のスペースを消す方法【Kotlin】

# はじめに
今回はTextViewに設定したテキストのスペースを動的に消す方法を記事に残します。
文字にしてみると語彙力のなさの影響か　わかりにくくなりますが、簡単にいうと、
"　Hello World! "→ "Hello World!"というようにしたいということです。


# trim()
trimメソッドを利用します。

        val text = "　Hello World! "
        text.trim()


また、　前のスペースだけ覗きたい場合は

        val text = "　Hello World! "
        text.trimStart()

同じように、後ろのスペースだけ覗きたい場合は

        val text = "　Hello World! "
        text.trimEnd()

注意事項として　trimメソッドで取り除けるのは半角スペースのみだそうです。
ROS rqt memo

ROSの中デバッグするためにqtツール箱が用意されている。qtについての勉強メモ。

インストール
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sudo apt-get install ros-noetic-rqt
sudo apt-get install ros-noetic-rqt-common-plugins
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

rqt_console
=
エラーなどのLogが表示される。
![Screenshot from 2023-05-21 21-33-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3181208/e0076064-a9a4-430f-f31c-9a408e4e5e10.png)


rqt_graph
=
ノード間の関係性がわかるように表示される。動かない時にまずこれだ、超助かる。

例：mrobot_teleopがどこにも繋がっていないから、キーボード操作に反応しない。

![Screenshot from 2023-05-21 21-36-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3181208/41451dcc-6080-d969-2d03-458a9843145f.png)


rqt_plot
=
グラフ表示、まだ使ってないから、とりあえずメモ

rosrun rqt_reconfigure rqt_reconfigure
=
runしている状態でダイナミックにパラメータを変更しながら、動きを確認する機能。対応したいパラメータを事前にソースコードに入れる必要がある。まだ使ってないから、とりあえずメモ

rqt_image_view
=
カメラを使う場合、カメラから得た画像情報をリアルタイムで表示してくれる
![Screenshot from 2023-08-20 13-29-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3181208/c20256d1-97e0-9859-8d3d-ef55cfc6ed58.png)

これをプラスopencv、学習モデルで使うと画像認識の結果をモニタリングすることができる
【Paiza問題集】標準出力メニュー/半角スペース区切りの出力

# Paiza問題集
Pythonで回答

## 標準出力メニュー/半角スペース区切りの出力

### Step1 2つの数値を出力
```Python
"""
2つの数値を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_step1
"""

# 数値を1行で表示
print('{} {}'.format(1, 1))
```


### Step2 3つの数値を出力
```Python
"""
3つの数値を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_step2
"""

# 8, 1, 3 を半角スペース区切りで出力
print('{} {} {}'.format(8, 1, 3))
```


### Step3 10個の数値を出力【末尾に半角スペースあり】
```Python
"""
10個の数値を出力【末尾に半角スペースあり】
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_step3
"""

# 数値を表示
for i in range(1, 11):
    print(i, end=" ")

# 改行
print()
```


### Step4 10個の数値を出力【末尾に半角スペースなし】
```Python
"""
10個の数値を出力【末尾に半角スペースなし】
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_step4
"""

# 数値を表示
for i in range(1, 11):
    if i != 10:
        print(i, end=" ")
    else:
        print(i)
```


### Final問題 1000個の数値を出力
```Python
"""
1000個の数値を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_boss
"""

# 数値を表示
for i in range(1, 1001):
    if i != 1000:
        print(i, end=" ")
    else:
        print(i)
```
RubyでAtCoder ABC302(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC302のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Attack
https://atcoder.jp/contests/abc302/tasks/abc302_a
```ruby:a-302.rb
a, b = gets.split.map(&:to_i)
puts a % b == 0 ? a / b : a / b + 1
```

# B - Find snuke
https://atcoder.jp/contests/abc302/tasks/abc302_b
```ruby:b-302.rb
h, w = gets.split.map(&:to_i)
array = Array.new(h){ gets.chomp }
directions = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]
str = "nuke"
h.times do |i|
  w.times do |j|
    next if array[i][j] != "s"
    directions.each do |di, dj|
      ni = i + di * 4
      nj = j + dj * 4
      next unless ni >= 0 && ni < h && nj >= 0 && nj < w
      flag = true
      4.times do |k|
        if array[i + di * (k + 1)][j + dj * (k + 1)] != str[k]
          flag = false
          break
        end
      end
      if flag
        5.times do |l|
          puts "#{i + 1 + di * l} #{j + 1 + dj * l}"
        end
        exit
      end
    end
  end
end
```
## 解説
（他の方の提出結果を参考にしました）

最初に移動先の設定するための配列`directions`を用意しておきます。そして、要素がsであれば、上下左右斜めの8通りで条件を満たす場合があるかを順に調べていくことで実装することができます。

# C - Almost Equal
https://atcoder.jp/contests/abc302/tasks/abc302_c
```ruby:c-302.rb
# 修正前
n, m = gets.split.map(&:to_i)
array = Array.new(n){ gets.chomp }

array.permutation(n) do |na|
	flag = true
	(n - 1).times do |i|
		count = 0
		m.times do |j|
			count += 1 if na[i][j] != na[i + 1][j]
		end
		if count != 1
			flag = false
			break
		end
	end
	if flag
		puts "Yes"
		exit
	end
end
puts "No"
```
```ruby:c-302.rb
# 修正後
n, m = gets.split.map(&:to_i)
array = Array.new(n){ gets.chomp.chars }

result = array.permutation(n).any? do |rearranged_array|
	rearranged_array.each_cons(2).all?{ |(pre_str, nxt_str)|
      pre_str.zip(nxt_str).count{ |c, nc| c != nc } == 1
    }
end
puts result ? "Yes" : "No"
```
## 解説
Nが８以下と小さいため、並べ替えについて全探索することができます。そして、並べ替え後の文字列について条件を満たすものがあればYesを出力して終了、最後までなければNoを出力します。

# D - Impartial Gift
https://atcoder.jp/contests/abc302/tasks/abc302_d
```ruby:d-302.rb
n, m, d = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort
b = gets.split.map(&:to_i)

ans = -1
b.each do |bb|
	i = a.bsearch_index{ |aa| aa > bb + d} || n
	i -= 1
	ans = [ans, a[i] + bb].max if i >= 0 && (a[i] - bb).abs <= d
end
puts ans
```
## 解説
（他の方の提出結果を参考にしました）

`bsearch_index`メソッドを使って二分探索により差がd以下となる場所を求め、最大値を更新していくことで実装することができます。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
[AWS Q&A 365][SQS]AWSのよくある問題の毎日5選 #62

# 1. Amazon Simple Queue Serviceに関連するキュータの制限は何ですか？
回答：Amazon Simple Queue Serviceでは、アカウントごとに作成できるキューの数に制限があります。デフォルトの制限は100ですが、AWSサポートに連絡することで増やすことができます。

# 2. Amazon Simple Queue Serviceに関連するメッセージの制限は何ですか？
回答：Amazon Simple Queue Serviceでは、送信および受信できるメッセージのサイズに制限があります。メッセージの最大サイズは256KBです。また、キューごとに送信および受信できるメッセージの数にも制限があります。デフォルトの制限は1つのキューあたり12万件のメッセージですが、AWSサポートに連絡することで増やすことができます。

# 3. Amazon Simple Queue Serviceに関連するポリシーの制限は何ですか？
回答：Amazon Simple Queue Serviceでは、キューにアタッチできるポリシーの数に制限があります。デフォルトの制限は1つのキューあたり5つのポリシーですが、AWSサポートに連絡することで増やすことができます。

# 4. Amazon Simple Queue Serviceで制限を超えた場合はどうなりますか？
回答：Amazon Simple Queue Serviceで制限を超えると、キューの作成やメッセージの送信がエラーメッセージとともに失敗する場合があります。問題を解決するためには、AWSサポートに連絡して制限を増やす必要があります。

# 5. Amazon Simple Queue Serviceの価格に関連する制限はありますか？
回答：いいえ、Amazon Simple Queue Serviceの価格に関連する制限はありません。価格はサービスのリクエスト数とデータ転送量に基づいており、利用量に制限はありません。
【Java】オーバーロードとオーバーライドは紛らわしい

## 前置き
Java Silverを最近勉強したのだが、これはオーバーライド？それともオーバーロードだろうかと分からなくなることがある。どちらもとても大切な手段だが、とにかく名前が紛らわしい！以下ではコードも用いて違いを見ていく

## オーバーロードについて
### プログラミングの困りごと
プログラムを書いている時にこのような場面が出てくる。

```
public satic int add(int x,int y) {
    return x + y;
}
```
これは引数のxとyに値を入れると、xにyを足した値を返してくれるメソッドである。例えばx=2、y=3を引数として渡すと、合計した5が返ってくる、という具合。
このaddというメソッドはとても便利なので、他の処理にも使いたいと思う機会があるかもしれない。ただしここで注意すべきなのは、**メソッドに同じ名前はつけられない**である。JVM(読みこんだファイルをCPUに送るといった役割)がどのメソッドを使えば良いか分からなくなるのである。

### オーバーロード(多重定義)を使用する
そこでオーバーロードを使う。日本語名だと多重定義であり、引数が異なれば同じ名前のメソッドを定義することが可能になる。例えばもう1つaddメソッドを作りたい場合、以下のメソッドなら作成可能である。

これは引数の数はそのままで、引数の型がdouble型になっている。

```
public satic double add(double x,double y) {
    return x + y;
}
```

また、引数の数を変えて定義することも可能である。

```
public satic int add(int x,int y,int z) {
    return x + y + z;
}
```

以上のように、同じ名前のメソッドを定義することをオーバーロードという。

## オーバーライドについて
### オブジェクト指向の1つ、継承との関わり
継承は簡単に言うと**似たようなクラスを作ることができる**機能である。

```
public class A {
	public void sleep(){
		System.out.println("Aは眠った");
	}
}
```

```
public class B extends A{

}
```
上記のコードはAというクラスを用意し、その中でsleepメソッドを準備している。
さらにBクラスはAクラスを継承している状態である。
この状態でBクラスのインスタンスを生成し、sleepメソッドを動かしてみる。

```
public class Main{
	public static void main(String[] args) {
		B b  = new B();
		b.sleep();
}
}
```

すると「Aは眠った」と結果に出力される。
しかし、今回はBのインスタンスを生成しているのに、「Aは眠った」と出力されるのは違和感がある。そこで、Bクラス専用のsleepメソッドを定義しよう。

### オーバーライド(再定義)を使用する
今度は以下のようにBクラス内にsleepメソッドを追記してみる。ここで注意するのは、引数リストの定義は、型・数・順番の全てが同じでなければいけないということだ。今回は渡す引数は無いので、空のまま実装する。

```
public class B extends A{
	public void sleep(){
		System.out.println("Bは眠った");
	}
}
```

ではBクラス内にsleepメソッドを定義した状態で以下のコードを実行してみる。

```
public class Main{
	public static void main(String[] args) {
		B b  = new B();
		b.sleep();
}
}
```
結果は「Bは眠った」と出力され、無事Bクラスで定義した内容が出力されることを確認できた。

上記のように、親クラスのメソッドを子クラス側で上書きすることをオーバーライドという。
[AWS Q&A 365][SQS]Daily Five Common Questions #62

# 1. What are the quotas related to queues in Amazon Simple Queue Service? 
Answer: Amazon Simple Queue Service has a limit on the number of queues that can be created per account. The default limit is 100, but it can be increased by contacting AWS Support. 

# 2. What are the quotas related to messages in Amazon Simple Queue Service? 
Answer: Amazon Simple Queue Service has a limit on the size of messages that can be sent and received. The maximum size of a message is 256KB. There is also a limit on the number of messages that can be sent and received per queue. The default limit is 120,000 messages per queue, but it can be increased by contacting AWS Support. 

# 3. What are the quotas related to policies in Amazon Simple Queue Service? 
Answer: Amazon Simple Queue Service has a limit on the number of policies that can be attached to a queue. The default limit is 5 policies per queue, but it can be increased by contacting AWS Support. 

# 4. What happens if a quota is exceeded in Amazon Simple Queue Service? 
Answer: If a quota is exceeded in Amazon Simple Queue Service, requests to create or send messages may fail with an error message indicating that the quota has been exceeded. To resolve the issue, the quota can be increased by contacting AWS Support. 
# 5. Are there any quotas related to Amazon Simple Queue Service pricing? 
Answer: No, there are no quotas related to Amazon Simple Queue Service pricing. Pricing is based on the number of requests and data transfer in and out of the service, and there is no limit on the amount of usage.
[C言語] 簡易電卓の作成

# はじめに
初めてC言語で電卓プログラムを作成しました。
サンプルを元に自分なりに改良しました。

# 最終コード
```
#include <stdio.h>
#include <string.h>

int main()
{
    double result = 0.0;
    double num;
    char op[2];

    printf("加減乗除(+,-,*,/)ができます。例,2+5 終了時はq\n");

    if (scanf("%lf", &result) != 1)
    {
        printf("計算できません\n");
        return 0;
    }
    
    while (1)
    {
        // 演算子の入力
        if (scanf("%1s", op) != 1)
        {
            break;  // 入力が正常でなければループを終了
        }

        if (strcmp(op, "q") == 0)
        {
            break;  // "q" が入力された場合、計算を終了
        }

        // 数値の入力
        if (scanf("%lf", &num) != 1)
        {
            break;  // 入力が正常でなければループを終了
        }

        switch (op[0])
        {
        case '+':
            result += num;
            break;
        case '-':
            result -= num;
            break;
        case '*':
            result *= num;
            break;
        case '/':
            if (num == 0.0)
            {
                printf( "ゼロでの割算はできません\n" );
                return 0;
            }
            result /= num;
            break;
        default:
            printf("演算記号の指定が違います\n");
            return 0;
        }

        printf("結果:%g\n", result);
    }

    printf("最終結果:%g\n", result);

    return 0;
}
```

# 解説
①「2+5」と入力後、Enterキーを押下
②「結果:7」と表示
③「-3」と入力後、Enterキーを押下
④「結果:4」と表示
⑤「q」を入力とEnterキー押下し、最終結果の表示とプログラムの終了

# プログラムを作成した理由
・C言語を勉強すれば、他のプログラム言語に苦労しないと20年以上のベテランエンジニアにおすすめされた為
・連続で計算できないか挑戦したかった為

# 参考
https://dixq.net/forum/viewtopic.php?t=19077
MySQLの必須コマンド集１０選

# 1.はじめに
MySQLの必須コマンド集をまとめました。
基本となるコマンド１０選なので、まずはここからマスターできればと思いまとめました。
# 2.各コマンドについて
### (1) データベースの作成
　CREATE DATABASE コマンドは、新しいデータベースを作成するために使用されます。指定した名前のデータベースが作成されます。
```:sql
CREATE DATABASE データベース名;
```

### (2) データベースの選択
　USE コマンドは、既存のデータベースを選択するために使用されます。選択されたデータベースで実行されるすべての操作は、このコマンドによって指定されたデータベースに対して行われます。
```:sql
USE データベース名;
```

### (3) テーブルの作成
　CREATE TABLE コマンドは、新しいテーブルをデータベース内に作成するために使用されます。テーブルは、列とそのデータ型の定義に基づいて作成されます。
```:sql
CREATE TABLE テーブル名 (
    列名1 データ型1,
    列名2 データ型2,
    ...
);
```

### (4) レコードの挿入
　INSERT INTO コマンドは、テーブルに新しいレコードを挿入するために使用されます。指定した列に対応する値を指定することで、テーブルに新しい行が追加されます。
```:sql
INSERT INTO テーブル名 (列1, 列2, ...) VALUES (値1, 値2, ...);
```

### (5) レコードの更新
　UPDATE コマンドは、既存のレコードの値を更新するために使用されます。指定した条件に一致する行が見つかった場合、指定した列の値が更新されます。
```:sql
UPDATE テーブル名 SET 列名1 = 新しい値1, 列名2 = 新しい値2 WHERE 条件;
```

### (6) レコードの削除
　DELETE FROM コマンドは、指定した条件に一致するレコードをテーブルから削除するために使用されます。
```:sql
DELETE FROM テーブル名 WHERE 条件;
```

### (7) テーブルの削除
DROP TABLE コマンドは、指定したテーブルをデータベースから完全に削除するために使用されます。
```:sql
DROP TABLE テーブル名;
```

### (8) レコードの検索:
　SELECT コマンドは、テーブルからデータを取得するために使用されます。指定した列の値を返す条件を指定することができます。
```:sql
SELECT 列1, 列2, ... FROM テーブル名 WHERE 条件;
```

### (9) テーブルの一覧表示:
SHOW TABLES コマンドは、データベース内のすべてのテーブルの一覧を表示します。
```:sql
SHOW TABLES;
```
### (10) テーブルの構造表示:
DESCRIBE コマンドは、指定したテーブルの構造（列名、データ型、制約など）を表示します。これにより、テーブルの設計やスキーマを確認することができます。
```:sql
DESCRIBE テーブル名;
```

# 3.まとめ
MySQLを使用するにあたって、必須となるコマンド１０選をまとめました。
これらはMySQLにおける基本的なコマンドです。さらに詳しい情報や高度な操作については、MySQLの公式ドキュメントやチュートリアルを参照してください。
今後MySQLを学習する糧になると幸いです。
Cronを使い、コマンドなどを定期的に自動実行させる

# 概要

サーバ上で定期的にコマンドを実行させたいときに、シェルスクリプトをローカルで実行させる方法があるので、そちらをまとめる。

# 実行させるシェルの作成

まずは、シェルスクリプトを作成する。
```
vi シェルスクリプト名
```
シェルスクリプトの書き方は、およそ以下の通り。
- 1回目、2回目に実行するコマンド
    - ここに、`cat ファイル名`とか、`sudo ~~`みたいなコマンドを入れる。
これを、必要な分だけ続けていく
```:シェルの内容
#! /bin/bash
1回目に実行するコマンド
2回目に実行するコマンド
・・・以下略
```
次に、先ほど作成したシェルスクリプト名に実行権限を与える
```
sudo chmod 755 シェルスクリプト名
```
これで、以下のように入力する事で、シェルスクリプトの中身を実行する事ができる。
```
./シェルスクリプト名
```

# cronの設定
以下のコマンドで一般ユーザから、rootに変更する。
```
su -
```

その後、以下のコマンドで、crontabを編集する。
```
crontab -e
```
crontabは、空白を開けて分、字などを記録していく。
書式はこんな感じ。
```
00 17 23 * * /home/username/sample_make_c_list.sh
```
左から、[分] [時] [日] [月] [曜日] [コマンド(スクリプトパス)]
上記の形で見ると、`毎月23日17時に、sample_make_c_list.shを実行する`
という形である。

- 分は0～59の数字で指定
- 時は0～23の数字で指定
- 日は1～31の数字で指定
- 月は1～12の数字で指定
- 曜日は0と7が日曜日、1以降は順に、月、火、水、木、金、土
- コマンド（フルパスで指定するかカレントディレクトリからの相対パスで指定する

保存したら、以下のコマンドで、登録されているシェルを確認できる。
```
crontab -l
```
また、実行できるかの確認のために、以下のコマンドで、crond.serviceが起動しているかを確認する。

```
systemctl status crond.service
```
activeになっているならOK
```:出力結果
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 金 2023-04-28 17:01:03 JST; 1 weeks 2 days ago
 Main PID: 592 (crond)
    Tasks: 1
   Memory: 1.2M
```

# 曜日判定と、定期処理で実行させる。

毎月第三金曜日にシェルを実行させるみたいな方法を設定させる方法。
シェルスクリプトを、以下の形で編集させる。
```
vi シェルスクリプト名
```

```:編集内容
#金曜日のみ実施する場合
a=` date +%w`
if [ "$a" == "5" ];then
1回目に実行するコマンド
2回目に実行するコマンド
・・・以下略
fi
```
dateコマンドの結果を%wとして取得し、その値をaとする。そして、その内容がifで指定する数字と等しいなら、if文内を実行するという内容になる。曜日は、上記のcrontabの書き方を参照すること。

## crontabの設定
そして、これを`crontab -e`で設定するときに、以下のように設定する。
```
00 17 24-31 * * シェルスクリプト名
```
この場合、24日～31日の間の17時でシェルスクリプトを実行し続ける形になる。
他にも、最初の週であれば、1~7、その次なら8~14といった形になる、


# 参考サイト

https://eng-entrance.com/linux-command-crontab

https://qiita.com/h_k92/items/8c5eef4f0eece9d25e91

https://magazine.re-web.org/day-decision-shell/
【SQL結合の深掘り】内部結合と外部結合を理解する

データベースでの作業において、単一のテーブルからデータを取得するだけでなく、複数のテーブルから情報を集めることがよくあります。これを実現するためにSQLでは「結合」を使用します。この記事では、SQLの結合について掘り下げ、内部結合と外部結合について解説します。

## 1. 結合の基本
結合とは、2つ以上のテーブルを特定の条件でつなげ、一つの結果セットとして表示する操作です。結合にはいくつか種類があります。

- 内部結合（INNER JOIN）
- 左外部結合（LEFT JOIN）
- 右外部結合（RIGHT JOIN）
- 完全外部結合（FULL JOIN）

それぞれの結合の特性と使用例について解説していきます。

## 2. 内部結合（INNER JOIN）
内部結合は、結合するテーブルの共通部分のみを取得します。共通しない部分は結果セットに含まれません。

```sql
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
```
このクエリでは、`Employees`テーブルと`Departments`テーブルを`DepartmentID`を基に結合しています。結果として、`DepartmentID`が一致する行のみが出力されます。

## 3. 左外部結合（LEFT JOIN）
左外部結合は、左のテーブルの全ての行と、それと一致する右のテーブルの行を取得します。右のテーブルに一致する行がない場合でも、左のテーブルの行は全て表示され、一致しなかった列はNULLとなります。

```sql
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
```
このクエリでは、`Employees`テーブルと`Departments`テーブルを結合しますが、`Departments`テーブルに一致する行がなくても、`Employees`テーブルの行は全て表示されます。

## 4. 右外部結合（RIGHT JOIN）
右外部結合は左外部結合の逆で、右のテーブルの全ての行と、それと一致する左のテーブルの行を取得します。左のテーブルに一致する行がない場合でも、右のテーブルの行は全て表示され、一致しなかった列はNULLとなります。

```sql
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
```
このクエリでは、`Employees`テーブルと`Departments`テーブルを結合しますが、`Employees`テーブルに一致する行がなくても、`Departments`テーブルの行は全て表示されます。

## 5. 完全外部結合（FULL JOIN）
完全外部結合は、左テーブルと右テーブルの全ての行を取得します。一致しない行がある場合でもその行は表示され、一致しなかった列はNULLとなります。

```sql
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
FULL JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
```
このクエリでは、`Employees`テーブルと`Departments`テーブルを結合しますが、一方のテーブルに一致する行がなくても、その行は表示され、一致しなかった列はNULLと表示されます。

## まとめ
SQLの結合は、データ分析や情報取得において非常に重要なツール。内部結合、外部結合を適切に使い分けることで、データベースから求める情報をより効率的に取り出すことができます。
Computer Hacking Forensic Investigator（CHFI）試験に合格したので記事にしてみました！

# はじめに

Computer Hacking Forensic Investigator（CHFI）試験に合格したので、合格体験記として残そうと思います。

# Who am i ?

しがないエンジニアです。EC-Councilの資格はCHFIの他にCND、CEH、CEH Practicalを取得しています。

# この記事の想定読者

- CHFIに興味を持っているが、いまいち試験を受ける気になれない人
- CHFIについて知りたい人
- その他

# 背景

なぜCHFI試験を受けようかと思ったのかと言うと、体系的なフォレンジックの資格を勉強したかったというのが理由です。資格もとれればなお良いと思ってました。なお、仕事ではファストフォレンジックをさっとやったことあるくらいで、がっつりフォレンジックをやったことはありません。

経済産業省から提示されている「情報セキュリティサービスにおける
技術及び品質の確保に資する取組の例示」にもCHFIが専門資格として入っています。 

https://www.meti.go.jp/press/2022/03/20230330002/20230330002-2.pdf

上記のpdfではComputer Hacking Forensic Investigatorではなく、Certified Hacking Forensic Investigatorとなっています。おそらく誤記のように思われます。

日本ではデジタルフォレンジック研究会という所が有名です。

https://digitalforensic.jp/

私も記事を書いているので、よかったら参考になさってください。私はCDFP-Bしか取得してませんが、どうやらその上位資格もあるようです。

https://qiita.com/forest_moririri/items/0c303323811ec42d1939


# 本題

CHFIについてですが、以下が詳しいです。申し込みもできます。

https://www.gsx.co.jp/services/securitylearning/eccouncil/chfi.html

意外とCHFIの歴史は長いらしいですね。CEHの次とか。

CHFIはComputer Hacking Forensic InvestigatorというEC-Councilが主催する資格試験なのですが、CEH試験よりも難易度高い気がします。（もちろん毛色が異なる資格というのは理解していますが。）

こういったフォレンジック系の勉強はSANSの研修を受講するかEC-Councilの研修を受講するかの大体2択になる気がしています。フォレンジックは法律の分野がわりと広範囲に関わってくるので、細かい法律を理解しておくことが重要ですね。（私も苦手です。）

私はEC-Councilの資格はCHFIの他にCND、CEH、CEH Practicalを取得しているのですが、受講および取得順序はCEH→CND→CEH Practical→CHFIという順序でした。

この順で適切だったと思います。人によるかもしれませんが、少なくともCNDは受講したあとで試験を受けるべきだと感じました。

CNDおよびCEH MASTER（CEH＋CEH Practical）については以下を参照なさってください。

https://qiita.com/forest_moririri/items/177de91b69c109b5e6a0

https://qiita.com/forest_moririri/items/fbbf63abf70e8f57b661


# 勉強方法

ざっと箇条書きで記載しておきます。

- 研修の受講
- テキストの復習
- ネットサーフィン（わからない所のリサーチ）
- 検索エンジンの代わりとして、ChatGPTとか生成系AIも活用してみました。

テキストの復習をしていればそれほど試験は難しくないと思いますが、人によるのかもしれません。

CHFIは他のEC-Councilの試験とは違い、合格基準点が明記されていませんので、「何点とれば合格」というのがわからないというのも苦しい所だと思います。なお、私は76%で合格しました。基準点はその時々で異なるようです。

https://cert.eccouncil.org/computer-hacking-forensic-investigator.html

上記のページの合格基準をGoogle翻訳で日本語化したものをコピペしておきます。

```
合格基準:
認定試験の高い整合性を維持するために、EC-Council 試験は複数の形式 
(つまり、異なる問題バンク) で提供されます。
各フォームは、対象分野の専門家からなる委員会の監視下で、
適切なサンプル グループを使用したベータ テストを通じて慎重に分析され、
各試験が学術的な厳密さだけでなく、「現実世界」への適用可能性を備えていることが保証されます。
また、各質問の難易度を決定するプロセスもあります。
個別の評価は、各試験フォームの全体的な「カット スコア」に影響します。
各フォームの評価基準が同等であることを保証するために、
カットスコアは「試験フォームごと」に基づいて設定されます。
どの試験形式に挑戦するかに応じて、カットスコアは 60% ～ 85% の範囲になります。
```

分野ごとにどんな問題が出るか予想して勉強するというのが効果的な気がしました。

# 試験当日、試験が終わった直後

試験当日はパスポートが身分証として必須です。

試験時間はMAX 4hということもありすごい疲れました。1.5～2hくらいで終わるかと思います。

試験の監督官が日本人ではないので、ある程度の英語力も必須です。

プレッシャーから開放されたときは、かなり疲れがきました。

# 最後に

それでは、よいハッカーライフを！！
tailwindでgrid-template-rowsをカスタムして高さ100%を実現する

こちらの記事をtailwindで実現する方法
* 参考
    * CSSでフッターの下に隙間ができないようにメインコンテンツの高さを調整する
        * https://zenn.dev/catnose99/articles/a873bbbe25b15b
 



# tailwind.config.jsの書き方

* tailwindでは限られたパターンのgrid-template-rowsしか定義されていない。なので定義にないパターンは拡張する設定をtailwind.config.jsに書く必要がある。
    * https://tailwindcss.com/docs/grid-template-rows#class-reference

```js
/** @type {import('tailwindcss').Config} */
module.exports = {
　// content,pluginsなどは省略
  theme: {
    extend: {
      gridTemplateRows: {
        'base-layout': 'auto 1fr auto'
      }
    }
  },
}
```
* 公式ドキュメント
    * https://tailwindcss.com/docs/grid-template-rows#customizing-your-theme

# 利用側

```html
<div class="grid grid-rows-base-layout grid-cols-1 min-h-screen">
</div>
```
ChatGPTに聞く: ROCKとHIP HOPの未来と可能性

### 初めに
元々、ROCKとHIP HOPの可能性について考えたことがあったが、結局月並みな答えしか出なかった私です。
いっそのこと、ChatGPT(GPT4)に聞いてみました。

### ChatGPTからの回答は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373806/c963622c-71ff-e921-935f-e48175811716.png)

途中で切れました。。。

:::note
「続き」と入力すると、切れたところから、ちゃんとその続きを出力してくれます。
:::

### Abemaで得られた私の結論というか感想

ChatGPTに比較してもらっているうちに、HIP HOPよりの私ではありますが、なんとなくROCKにも興味が出てきました。
せっかくなので、AbemaTVにアクセスしてみたところ、以下が見つかり、しばらくみていたところ、ROCKの方に新たな可能性を見出しました。(単なる感想です)
https://abema.tv/now-on-air/metrock

正確には、メトロックというらしい。

それほど好きじゃなかった ROCK の方が、新しく見える不思議さ。
TABキーを自動で入力していって、アマゾンプライムビデオをランダムに選択して再生するPowershellPGM

<h3>TABキーを自動で入力していって、アマゾンプライムビデオをランダムに選択して再生するPowershellPGM</h3>

powershellからTABキーを乱数で何回か自動入力し、アマゾンプライムビデオのシリーズ一覧画面からランダムに動画を選択し、再生するPGMを作りました


2023.5.22 修正したプログラムをgithubに追加しましたRandamPrimeVideo3.ps1)

<hr>
githubURL:https://github.com/NanjoMiyako/RandomPrimeVideo

<hr>
使い方<br>

RandamPrimeVideo2.ps1
当該powershellPGMを起動し、ランダム再生するシリーズの数をコンソールから入力し、シリーズ集表示画面の右下の<font color="red">「並べ替え」</font>ボタンをクリックし、PGMからの自動TAB入力＆再生開始まで待ちます(15秒ほど)

RandamPrimeVideo3.ps1
当該powershellPGMを起動し、ランダム再生するシリーズの数をコンソールから入力し、一話毎の分数を入力し、PageDownを一回押したうえで、並べ替えボタンのクリック位置の座標をコンソールから入力し、シリーズ一覧表示をすべてのエピソード表示モードにしてから、PGMからの自動TAB入力＆再生開始まで待ちます(15秒ほど)



<hr>
参考にしたサイト

<a href="https://bit-easy1.com/to-the-top-short-key/">【「一番上まで」と「一番下まで」のショートカットキー（windows）】ブラウザで閲覧ページの一番下と一番上に移動する便利なショートカットキーの紹介。 | ikeblog</a><br>
<a href="https://learn.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364423(v=msdn.10)?redirectedfrom=MSDN">SendKeys メソッド | Microsoft Learn</a><br>
<a href="https://letspowershell.blogspot.com/2016/06/powershell_20.html">PowerShellをはじめよう　～PowerShell入門～: PowerShellでマウスポインタの座標を取得する</a><br>
<a href="https://tarenagashi.hatenablog.jp/entry/2020/12/07/213259">PowerShellでマウス操作「任意の場所をクリック」 - たれながし.info</a><br>
<a href="https://jidouka.work/?p=183">GUI操作を自動化する [PowerShell] - 自動化.work</a><br>
<a href="https://www.haruru29.net/blog/how-to-create-infinite-loop-with-powershell/">PowerShellで無限ループを作る方法や、処理完了までリトライする(待つ)方法</a><br>
<a href="https://dobon.net/vb/dotnet/form/startposition.html">フォームを画面の真ん中（あるいは、任意の位置）に表示する - .NET Tips (VB.NET,C#...)</a><br>
🐛 gitmoji(絵文字)を使ってコミットログをかわいくしよう！✨

# :sparkles: はじめに
この記事では、Gitのコミットメッセージに絵文字のプレフィックスを追加する方法を説明します。
これにより、コミットログが見やすくなり、変更内容を一目で把握できるようになります。
最近ではMojoが拡張子に🔥を使えるようになってたりと、世界的に絵文字が受け入れられていますね。

例：絵文字のプレフィックスをつけたプロジェクト画面。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/5be17907-25c0-7244-5bf8-a7042eb014a4.png)

# :+1: 絵文字をコミットメッセージに追加する利点
絵文字をコミットメッセージに追加することで、次のような利点があります。

- コミットの内容が一見してすぐに分かる
- 見た目が楽しい
- カテゴライズのためにコミットを分割するようになる

# :pencil: 絵文字をコミットメッセージに追加する方法
やり方は非常に簡単で、```:{絵文字名}:``` をコミットメッセージに入力するだけです。
例：
```
git commit -m ":bug: バグ修正"
```

# :bulb: どの絵文字を使うべきか
gitmojiというサイトで絵文字とコミット種別の対応が定義されています。

https://gitmoji.dev/

数が多いので、よく使うgitmojiを以下に記します。 
(表示制限の都合で一部絵文字はブログでは白黒になっています)

```
:tada: プロジェクト開始 🎉
:bug: バグ修正 🐛
:sparkles: 新機能の追加 ✨
:zap: 機能追加 ⚡️
:memo: ドキュメントの追加・修正 📝
:recycle: リファクタリング ♻️
:fire: 不要機能やファイルの削除 🔥
:construction: 作成途中のコミット 🚧
```

あまり完璧に分類することには拘らず、まず使いやすい数個から気軽に使っていきましょう。
特にチームで適用する場合、分類や間違えの指摘を厳密にしすぎてしまうと、かえって開発がやりにくくなります。

# :cookie:  おまけ：VSCodeプラグインの利用
gitmojiを覚えるまでは、以下のようなプラグインを使うと便利です。

https://marketplace.visualstudio.com/items?itemName=seatonjiang.gitmoji-vscode

以下のような感じで、簡単にgitmojiを選択することができます。
![gitmoji-plugin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/3521d61a-fffa-def0-c07e-16cce7e64e6c.gif)


# :rocket: 最後に
絵文字を使うことで、Gitのコミットログが一目で理解でき、開発がより楽しくなります。
ツール導入の必要もなく、誰でも簡単に試せますので、ぜひ使ってみて下さい。
「アルゴリズムと数学　演習問題集」のページに解説へのリンクを追加するChrome拡張機能

# 機能

『「アルゴリズム×数学」が基礎からしっかり身につく本』の[AtCoderの「アルゴリズムと数学　演習問題集」](https://atcoder.jp/contests/math-and-algorithm/tasks)のページに、[GitHubのリンク](https://github.com/E869120/math-algorithm-book)を追加します。

開いているページが節末問題の場合、専用の解説リンクを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78100/6498db96-3e28-f303-caf0-e8fc0827dfb2.png)

# インストール

https://chrome.google.com/webstore/detail/atcoder-math-and-algorith/jpdmohcbpngfckbndmibeokobcfilend

# 要望・問題報告

[GitHubのissue](https://github.com/taketakeyyy/atcoder-math-and-algorithm-extension/issues)によろしくお願いします。

# Chrome Extension 開発の小話

Chrome拡張開発のManifest V2が段階的に廃止され、V3へ上がります。Manifest V2を使っているとStoreから除外されるそうなので、V3対応が必要になります。[V2廃止のスケジュールはこちら](https://developer.chrome.com/docs/extensions/migrating/mv2-sunset/)で確認できます。
人間の「創造性」についてChatGPTに訊いてみた

## 経緯
以下のnote記事を読んで、「創造性＝クリエイティビティは人間固有のものなのか？AIにもあるのでは？」と思った

[文春オンライン「ChatGPTには逆立ちしてもできないことがある」平井鳥取県知事が誤解覚悟で「使用禁止」を訴えた真意】の記事を読んで](https://note.com/sakura3345/n/nee7bc1670573)

## ダイアログ
（最初に、私がこれまで学んできたことと仕事において考えるべき社会問題について伝え、それらを関連させて新しいアイデアを出してもらった）

Q1.
"人間にある創造性はAIにはない"
こういう言い方がよくされます。
でも、今あなたが答えてくれた内容は、私にはある程度のクリエイティビティがあるように思われますが、本当に引用符内のことは正しいでしょうか。


>AI、特にGPT-4のような進歩したAIは、人間が認識する「創造性」を表現できるように見えるかもしれませんが、それはAIが人間と同じように創造的な思考を行っているわけではありません。AIの「創造性」は、大量のデータと先進的なアルゴリズムを基にしたパターン認識と予測の結果です。

>AIはトレーニングデータに基づいてパターンを学習し、新たな入力に対してそのパターンに基づいた予測を行います。そのため、AIが新しいアイデアやコンセプトを生み出すことはありません。AIはあくまで既存の情報に基づいて予測を行います。

>それに対して、人間の創造性は新しいアイデアや概念を生み出す能力を含んでいます。人間は過去の経験や知識を組み合わせて全く新しいアイデアを生み出すことができます。また、人間は感情や直感を基にして意思決定を行い、個々の経験に基づいた独自の視点を持っています。これらは現在のAIの能力を超えています。

>したがって、AIが創造的な解答を生成しているように見える場合でも、それはあくまで大量のデータと複雑なアルゴリズムを基にした予測の結果であり、人間の持つ本質的な創造性とは異なります。そのため、引用された「人間にある創造性はAIにはない」は、現在のところは正しいと言えます。

Q2.
人間の思考も、そのロジックを説明することはできるはずです。
人間が全く新しい創造をしたように見えても、それも過去の経験や学習したことの組み合わせや類推にすぎないのではないですか。
そうではなく、全く新しいものを創る能力が人間にだけあると言うなら、それはどういうロジックで、何を使って実現されていると言えますか。

>人間の創造性を理解するためには、認知科学、心理学、神経科学などの多角的な視点からアプローチする必要があります。人間の創造性は、過去の経験や知識の組み合わせだけでなく、直感、感情、インスピレーション、そして何よりも無意識の力に大きく依存しています。

>一般的に言えば、人間の創造性は次の要素から生まれます:

> 1. 経験と知識: 人間の創造性は、個々の経験や知識に基づいています。新しいアイデアや概念は、過去の経験や知識の組み合わせから生まれることが多いです。
>1. 直感: 直感は、意識的な思考プロセスを経ずに問題解決やアイデア生成に至る能力であり、創造性に大きな役割を果たします。AIは現在のところ直感を模倣することができません。
>1. 感情: 感情は人間の創造性に深く関わっています。喜び、恐れ、驚き、悲しみなどの感情は新しいアイデアを引き出す触媒となることがあります。
>1. 無意識の思考: 潜在的な意識は、意識的な思考がアクセスできないアイデアや組み合わせを生成することがあります。これは「ひらめき」とも呼ばれ、一見突然現れる新たな視点やアイデアは、しばしば無意識の思考から生まれます。

>これらの要素はすべて、人間の創造性を形成し、AIがまだ模倣できない部分です。AIはデータとアルゴリズムに基づいて動作しますが、直感、感情、無意識の思考といった非論理的または非直線的な要素をうまく取り入れることはまだできていません。これが人間の創造性がAIとは基本的に異なる理由の一つです。

## 考察・感想
冒頭で引用した記事においても、（AIができる）「既存の知識の新たな組み合わせ」は「創造」と呼べるか、という点について考察されていた。
これを読んだ際、以下のようなことを考えた。

例えば、一般的に起業家は創造性が豊かだと見なされると思うけれども、どれほど「新しい」ビジネスといえど、AIでは絶対に出せ得ない（＝その考え方自体がまだこの世界には存在しない）なんてことあるだろうか？

このように考えると、人間特有の創造性というのはなかなか理解しがたく思えたので、前節の対話をしてみた。

ChatGPTの見解としては、「無意識」が最も重要なものらしい。（「何よりも」と言っているし）
回答に出てくる「直感」「ひらめき」「インスピレーション」というのは、無意識から生じて「本質的な創造」を可能にするもの としてひとまとめに捉えることができるだろうか。
もう一つ、「感情」というキーワードが出てきた。確かに、AIには持てないものとして一番に挙げられるものだろう。（将来的には、少なくともシミュレーションするくらいはできそうだけど）
意識/無意識でいえば、感情は意識側のものに思えるけれども、無意識部分にも影響して「直感」などを生じさせるきっかけになるものと考えることができるだろうか。

事例としてもう少し考えてみると、たとえば「電気」とか「コンピュータ」というのは大昔にはなかったわけだが、これを（存在しない状況から）今のAIが提案できるかと言われれば、できないように思える。
このような発明には多分に「ひらめき」「インスピレーション」といったものが寄与したはずで、これこそが「本質的な創造」といえるだろうか。
しかし、このような発明をできるかと言われれば、大多数の人間はできないだろう。そうすると、AIにない創造性を持つのは一部の人間だけということになってしまうが・・・。

ここで結論は出せないけれど、AI時代を生きる我々は、（AIにない）人間の創造性というものについて考える必要があると思う。
今回の対話から、心理学を学ぶと何か示唆が得られそうだと感じた。
「無意識」についてのフロイトの論文をまとめた本を買ってみたので、まずはそれを読むことからやってみようと思う。
なにか新しい発見があれば続きを書きたい。
データサイエンスのための線形代数 第27回 解の数

:::note info
本記事は数学講座[6.2 解の数](https://www.matongxue.com/lessons/547/parts/713)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# 解の数の判別方法

[データサイエンスのための線形代数 第20回 行列関数の単射](https://qiita.com/Junlee/items/d266d464d0620c72044b)で説明した通りで、
- 単射の時に、値域の任意のベクトルに対して、定義域で**唯一なベクトル**があります。
- 非単射の時に、値域の任意のベクトルに対して、定義域で**無限のベクトル**があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/d61ce5fd-0150-4076-87b4-800e040be579.png)

単射の条件が、$A$行列が列フルランクです。

**まとめて、判別方法は以下の通りです：**

線形方程式$\boldsymbol{A}\boldsymbol{x}=\boldsymbol{b}$について考えます。ここで、その拡大行列を$\boldsymbol{B}=(\boldsymbol{A}\ |\ \boldsymbol{b_{}})$とします。行列$\boldsymbol{A}はm\times n$の行列である場合、以下のような性質が成り立ちます：

- 唯一の解が存在する場合、その条件は$rank(\boldsymbol{A})=rank(\boldsymbol{B})=n$です。
- 無数の解が存在する場合、その条件は$rank(\boldsymbol{A})=rank(\boldsymbol{B})<n$です。

$rank(\boldsymbol{A})=rank(\boldsymbol{B})$が解ある([解の存在性](https://qiita.com/Junlee/items/55a3187777652d294976#%E8%A7%A3%E3%81%AE%E5%AD%98%E5%9C%A8%E6%80%A7))の前提条件です！

# フルランク行列が唯一解あり

フルランクが全単射ですので、解あり且つ唯一解です。
- 定義域：値域 = 1 : 1(列フルランク 唯一解)
- 到達域：値域 = 1 : 1(行フルランク 解あり)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/16760e70-c699-bc79-6b38-f332c93c93db.png)

# 解の数の例

以下の線形方程式に解があるか、また解の数は？

```math
\begin{cases}
    -x_1+2x_2=0\\
    \qquad\quad2x_2=2\\
    \ \ \ x_1-2x_2=0
\end{cases}
```

解：

係数行列$A$と拡大行列$B$:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/3ddf43d3-c593-65c0-fcbd-a4d0f8421f23.png)

$rank(\boldsymbol{A})=rank(\boldsymbol{B})=2$ですので、上記の解の数の判別方法にれば、**唯一解**になります。

# フルランク行列の例

以下の線形方程式に解があるか、また解の数は？

```math
\begin{cases}x+y+z=2\\2x+y-z=3\\-2x+y-z=1\end{cases}
```

解：

線形方程式を以下の行列関数に変換します：

```math
\underbrace{\begin{pmatrix}1&1&1\\2&1&-1\\-2&1&-1\end{pmatrix}}_{\boldsymbol{A}}\underbrace{\begin{pmatrix}x\\y\\z\end{pmatrix}}_{\boldsymbol{x}}=\underbrace{\begin{pmatrix}2\\3\\1\end{pmatrix}}_{\boldsymbol{b}}
```

$A$と基本行変換をすると：

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/9477f66d-119f-d38a-8c1f-052195f681c0.png" width=480>

フルランク行列ですので、**唯一解になります**。

# 参照情報
【Python】version 3.11.2 へアップデートする際にハマった

# ハマった

```
$ pyenv install 3.11.2

python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.0.tar.xz...
-> https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tar.xz
Installing Python-3.11.0...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 13.3.1 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/hq/9m1dyvx961ldl2p4kmfmmsgw0000gn/T/python-build.20230508155239.50164
Results logged to /var/folders/hq/9m1dyvx961ldl2p4kmfmmsgw0000gn/T/python-build.20230508155239.50164.log

Last 10 log lines:
  "_libintl_setlocale", referenced from:
      __locale_setlocale in _localemodule.o
      __locale_localeconv in _localemodule.o
  "_libintl_textdomain", referenced from:
      __locale_textdomain in _localemodule.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Programs/_freeze_module] Error 1
make: *** Waiting for unfinished jobs....
2 warnings generated.
```

# 解決方法

```
$ brew install gettext
$ pyenv install 3.11.2
```

https://formulae.brew.sh/formula/gettext
crosエラーの解決方法

CORSは何かというと、「どこからのリクエストを許可するのか」ということです。

・この記事を書く経緯
RailsとReactでアプリ開発をしていたときに、このようなエラーに遭遇したので忘れないように記事にしました。
```
Access to XMLHttpRequest at 'http://localhost:3065/user' from origin 
'http://localhost:3000' has been blocked by CORS policy: Response to
 preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' 
header is present on the requested resource.
```

・解決策
結論として解決策は以下の通りになります。

1. Gemfileに以下のgemを追加します。

```
gem 'rack-cors'
```

2.`bundle install`を実行します。
3. `config/initializers/cors.rb`を作成し、以下のように記述します。

```
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:3000' #ReactのサーバーのURLを設定してください。
    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :delete, :options, :head],
      credentials: true
  end
end

```

4.Railsの`config/application.rb`に以下を追加します。

```
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore

```

これでCORSの設定が完了し、ReactのフロントエンドからRailsのAPIを呼び出すことができるようになります。
ただし、この設定により、すべてのリクエストに対してCORSが有効になるため、セキュリティーには十分に注意してください。必要に応じて、`origins`や`methods`などを適宜変更してください。
再帰関数

# 再帰関数
再帰関数とは関数の中で自分自身を呼び出している関数のこと。

```javascript:例
function fn(num) {
  if (num <= 1) {
    return num;
  } else {
    return num + fn(num - 1);
  }
}
```
```javascript:結果
console.log(fn(3));
// ▶︎ 6
```

## どのような処理になっているか
fn(3)の時はifの処理はスルーされ、elseの処理が実行される。
```javascript
return 3 + fn(n + 1)
```
fn(2)の時もifの処理はスルーされ、elseの処理が実行される。
```javascript
return 3 + fn(n + 1)
```
fn(1)は「n<=1」はtrueになるのでnum「1」がreturnされる。
```javascript
return num
```
fn(1)で返された結果「1」がfn(2)の「fn(num - 1)」にreturnされる。

以上の流れを踏まえるとこのようになる
```javascript: 結果
function fn(num) {
  if (num <= 1) {
    return num;
  } else {
    return num + fn(num - 1);
  }
}

// ▶︎ 6
fn(3) = return 3 + 2 + 1
fn(2) = return 2 + 1
fn(1) = return 1
```
## 参考
https://fuuno.net/nani/nani09/nani09.html