OmniAICreator/Qiita-1.07M huggingface dataset:
TcpListener で簡易 HTTP サーバーを作る

.NET の TcpListener で簡単な HTTP サーバーを作ります。

# 経緯

.NET には HttpListener がありますが、マルウェア誤判定や管理者権限やファイアーウォールなどであまり使い勝手が良くありません。

https://qiita.com/7shi/items/bcf1998f1dd3755ac82c

仕方ないので TcpListener で HTTP を扱うことにしました。

# 実装

8080 番ポートで待ち受けて Hello, HTTP! と返します。

HttpListener と違って管理者権限は不要で、自動的に出て来るファイアーウォールのダイアログで許可するだけで使えます。

```fsharp
open System
open System.IO
open System.Net
open System.Net.Sockets
open System.Text

let listener = new TcpListener(IPAddress.Any, 8080)
listener.Start()
let rec acceptLoop () = async {
    let! client = listener.AcceptTcpClientAsync() |> Async.AwaitTask
    use stream = client.GetStream()
    use sr = new StreamReader(stream)
    use sw = new StreamWriter(stream, Encoding.ASCII)
    let req = [|
        let mutable line = sr.ReadLine()
        while String.IsNullOrEmpty line |> not do
            yield line
            line <- sr.ReadLine() |]
    printfn "%A %A %s" DateTime.Now client.Client.RemoteEndPoint req.[0]
    let buf = Encoding.ASCII.GetBytes "Hello, HTTP!"
    fprintfn sw "HTTP/1.1 200 OK"
    fprintfn sw "Connection: close"
    fprintfn sw "Content-Length: %d" buf.Length
    fprintfn sw "Content-Type: text/plain"
    fprintfn sw ""
    sw.Flush()
    stream.Write(buf, 0, buf.Length)
    client.Close()
    return! acceptLoop () }
acceptLoop () |> Async.Start
Console.ReadLine() |> ignore
listener.Stop()
```

`sw.Flush()` がとても重要です。これがないとヘッダなしでデータ本体だけが送られてしまい、おかしなことになります。

# 画像

画像を返す例です。

以下の記事で実装した `captureScreen` を使用して画面をキャプチャします。

https://qiita.com/7shi/items/71be43cd0934f944721a

```fsharp
let rec acceptLoop () = async {
    let! client = listener.AcceptTcpClientAsync() |> Async.AwaitTask
    use stream = client.GetStream()
    use sr = new StreamReader(stream)
    use sw = new StreamWriter(stream, Encoding.ASCII)
    let request = [|
        let mutable line = sr.ReadLine()
        while String.IsNullOrEmpty line |> not do
            yield line
            line <- sr.ReadLine() |]
    printfn "%A %A %s" DateTime.Now client.Client.RemoteEndPoint request.[0]
    let status, mime, buf =
        if request.[0].StartsWith "GET / HTTP" then
            use bmp = captureScreen Screen.PrimaryScreen.Bounds
            use ms = new MemoryStream()
            bmp.Save(ms, ImageFormat.Png)
            "200 OK", "image/png", ms.ToArray()
        else
            let status = "404 Not Found"
            status, "text/plain", Encoding.ASCII.GetBytes status
    fprintfn sw "HTTP/1.1 %s" status
    fprintfn sw "Connection: close"
    fprintfn sw "Content-Length: %d" buf.Length
    fprintfn sw "Content-Type: %s" mime
    fprintfn sw ""
    sw.Flush()
    stream.Write(buf, 0, buf.Length)
    client.Close()
    return! acceptLoop () }
```

# 感想

HTTP を自前実装するのは勉強には良いのですが、あまり複雑なものを作ることは現実的ではありません。

定型的な処理をするような簡易的なツールに割り切って組み込むのが関の山という気がします。

# 参考

https://www.misuzilla.org/Blog/2016/01/31/CreateYourOwnHttpServerUsingCSharp
unity 3Dゲーム作成時 備忘録

## AddForce
Rigidbodyに対して力を加える。
FixedUpdate()に記述する。
```cs
void FixedUpdate()
  {
      //flagがtrueなら上方向に10.0ｆ力を加える
      if(flag){GetComponent<Rigidbody>().AddForce(new Vector3 (0.0f,10.0f,0.0f));}
      
  }
```

## Prefabでオブジェクトの生成
```cs
//InspectorでPrefabをアタッチ
public GameObject testPrefab;
public GameObject canvas;

/*省略*/

//Prefabを生成
GameObject newObj = Instantiate(testPrefab) as GameObject;

//親canvasの設定
newObj.transform.SetParent(canvas.transform, false); 

//向き(変更する場合は値を入力)
newObj.transform.eulerAngles=new Vector3 (0.0f,0.0f,0.0f);

//位置(親オブジェクトの位置に生成する例)
newObj.transform.position = transform.position;
```

### SetParent()でキャンバスをセットする。
public void SetParent (Transform parent, bool worldPositionStays);
→これを設定しておかないと、Canvasの外にprefabが複製されるので、解像度の調整をする際に問題になる恐れがある。
→カメラの調整をした際にCanvas外のPrefabの大きさがおかしくなる。
参考：https://docs.unity3d.com/ja/2020.3/ScriptReference/Transform.SetParent.html

## カメラの自動調整
>画面のサイズ(CameraのorthographicSize)をアスペクト比に合わせて自動で調整する
参考：https://kan-kikuchi.hatenablog.com/entry/CameraSizeUpdater
StreamDeckっぽいものを作る_2_OBS関係

VSCODE使って開発していく

OBS28.0から標準で搭載されたwebsocket5.0を使うようにする。今までプラグインで別途入れていたwebsocket4.x系とは内部処理が全然違うので今までのは使えない。
pythonライブラリにいいのがあるのでこれを使う


https://github.com/aatikturk/obsws-python

インストールしていく
```
python -m pip install --user obsws-python
```

クラス化して使いやすくしとく
```
import obsws_python

#   定数関係
from const import *

#   OBS通信クラス
class OBSSocket():
    #   コンストラクタ
    def __init__(self,hostIP = OBSHOSTIP,portNum = OBSPORT,passWord = OBSPASSWORD):
        self.HOST = hostIP                                       #   受信元IP(""でどこからでも可)
        self.PORT = portNum                                      #    受信元ポート番号
        self.PASSWORD = passWord                                 #   パスワード
#        self.WS = obsws(HOST,PORT,PASSWORD)                 #   OBS用ソケット生成
        # self.ReqCli = obsws_python.ReqClient(host=HOST,port=PORT,password=PASSWORD)   #    OBSリクエストクライアント生成
        # self.EveCli = obsws_python.EventClient(host=HOST,port=PORT,password=PASSWORD)    #   OBSイベントクライアント生成

    #   デストラクタ
    def __del__(self):
#        self.WS.disconnect()                                #   切断
        print("dest")
    
    #   オープン
    def Open(self):
#        self.WS.connect()                                   #   接続
        print("open")
    
    #   クローズ
    def Close(self):
#        self.WS.disconnect()                                #   切断
        print("close")
    
    #   シーン変更
    def OBSSceneChange(self,dicSceneParams):                        #   アクティブシーンの変更
        print(type(dicSceneParams))
#        self.WS.call(requests.SetCurrentScene(dicSceneParams[OBSSCENECHANGE_NAME]))   #   シーンの変更
        #self.ReqCli.set_current_program_scene(dicSceneParams[OBSSCENECHANGE_NAME])  #   シーン変更
        obsws_python.ReqClient(host=self.HOST,port=self.PORT,password=self.PASSWORD).set_current_program_scene(dicSceneParams[OBSSCENECHANGE_NAME]) #   シーンの変更
        # obsws_python.ReqClient().set_current_program_scene(dicSceneParams[OBSSCENECHANGE_NAME]) #   シーンの変更

    #   テキストグリッドの変更
    def OBSTextChange(self,dicTextGridParams):
#        self.WS.call(requests.SetSourceSettings(dicTextGridParams[OBSTEXTCHANGE_SORCE], {"text": dicTextGridParams[OBSTEXTCHANGE_TEXT]}))
        print("未実装")
```

定数関係をまとめとく
```
#   定数宣言
#   OBS
OBSHOSTIP = "xxxxx" #   OBSサーバのIPアドレス
OBSPORT = "xxxx"    #   OBSサーバのポート番号
OBSPASSWORD = "xxxxx"    #   OBSサーバのパスワード
#   OBSコマンド文字列定数(プロパティ名＝コマンド名_名前とする)
OBSSCENECHANGE = 'OBSSceneChange'               #   OBSアクティブシーン変更
OBSSCENECHANGE_NAME = OBSSCENECHANGE + '_Name'  #   OBSSceneChange用シーン名
OBSTEXTCHANGE = 'OBSTextChange'                 #   テキストグリッド変更
OBSTEXTCHANGE_SORCE = OBSTEXTCHANGE + '_Sorce'  #   OBSTextChange用対象の名前
OBSTEXTCHANGE_TEXT = OBSTEXTCHANGE + '_Text'    #   OBSTextChange用テキスト内容
```

後はリファレンス見ながら必要なメソッド追加してけばいいか
java forEach 備忘録

## 配列でforEach

Arrays.stream(配列の変数名).forEach
```java
import java.util.Arrays;
//省略
public void forEachTest() {
		String[] sampleArray ={"aaa", "bbb", "ccc"};
		Arrays.stream(sampleArray).forEach(s -> System.out.println(s));	
}
```

## コンパイルエラー
forEachはvoid メソッドの為、値を戻すことができません
```java
public Boolean forEachTest() {
    String[] sampleArray ={"aaa", "bbb", "ccc"};
	Arrays.stream(sampleArray).forEach(s -> {
		//↓コンパイルエラー：void メソッドは値を戻すことができません
		if(s=="aaa") {return true;}
	});
	return false;
}
```

外側のスコープで定義されたローカル変数※ result は final または実質的に final でなければなりません
→※メンバ変数にすればfinalでなくてもエラーにならない。
```java
public String forEachTest() {
    String[] sampleArray ={"aaa", "bbb", "ccc"};
    String result="aaaを含まない";//メンバ変数にすればfinalでなくてもエラーにならない。

	Arrays.stream(sampleArray).forEach(s -> {
		//↓コンパイルエラー：外側のスコープで定義されたローカル変数 result は final または実質的に final でなければなりません
		if(s=="aaa") {result="aaaを含む";}
	});
	return result;
}
```
### Java - Lambda、匿名クラスでfinal変数を参照する必要がある理由
https://codechacha.com/ja/java-why-we-should-use-final-in-lambda/

### スレッド
https://www.bold.ne.jp/engineer-club/java-thread

### アトミック変数とは
https://talosta.hatenablog.com/entry/atomic

### 拡張for文を使用
```java
public Boolean forTest() {	
    String[] sampleArray ={"aaa", "bbb", "ccc"};
    String result="aaaを含まない";
	for(String s : sampleArray) {
		if(s=="aaa") {
			result "aaaを含む";
			return true;
		}
	}
	return false;
}
```
CSS サイズ変更

#### CSSでのサイズ変更のやり方

後ろの背景の設定は、background-color

````css
例文）background-color:#f3f372;
````

文字の幅や画像の幅の設定は、width

```css
例文）imgとh1{
width:200px;
}
```

文字の幅や画像の高さの設定は、height

```cs
例文)imgとh1{
height:80px;
}
```
AWS ALBリスナールールをAWS CLIで設定、自動でWEBの閉局・開局を実現する

今回はAWS ALB経由でAPサーバ上のWEBサービスを一定時間だけ開局、それ以外は閉局する場合、これをAWS CLIコマンドを使って自動化する方法を考えてみました。
[使用するコマンドaws elbv2の詳細はここを参照](https://docs.aws.amazon.com/cli/latest/reference/elbv2/)
#### 前提
・既にALB、ターゲットグループは設定されている。
・既に以下の様な画面が表示されている。
・以下のコマンドをcron等に設定して自動化させる。
![スクリーンショット 2023-02-13 031722.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/1d55df2d-974c-4b53-cb34-3cb49bf1c33c.jpeg)
#### １．リスナールール作成
➀ aws elbv2 create-ruleコマンドでルールを作成
&emsp;&emsp;コマンド仕様は以下となります。
　　awss elbv2 create-rule 
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;--listener-arn <リスナーARN>
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;--conditions <コンディションファイル> 
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;--priority <プライオリティ 1>
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;--actions <アクションファイル>
####
➁ コンディションファイル作成
```python
# cond.json
[
  {
      "Field": "path-pattern", # FieldはURLのパス形式を指定
      "PathPatternConfig": {
          "Values": ["/*"] # リクエストURLのパス ルートパス全て対象
      }
  }
]
```
➂ アクションファイル作成
```python
[
    {
        "Type": "fixed-response",
        "FixedResponseConfig": {
            "MessageBody": "<html><body><h1>closed right now</body></html>",
            "StatusCode": "503",
            "ContentType": "text/html"
        }
    }
]
```
➃ コマンド実行しルールを追加します。
&emsp;ここでは固定レスポンスを503で返し本文に閉局した旨を表示させます。
```python
aws elbv2 create-rule --listener-arn arn:aws:elasticloadbalancing:ap-northeast-1:773181940404:listener/app/bipro/9f3425e854e7525f/6ec0638ed3d93aba --conditions file://cond.json  --priority 1 --actions file://action.json
```
➄ ルールが追加された事を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/2ac521df-4999-7f4f-7783-d702d3e41a96.png)

➅ 画面を確認してルールが反映されている事を確認。
&emsp;固定レスポンスが返され、最初の画面が閉局しClosed right nowと変わりました。
![スクリーンショット 2023-02-13 033301.jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/bff8546b-52b1-75ea-5feb-ae5eaf15bd36.png)
#### ２．リスナールールの削除
➀ aws elbv2 delete-rule　コマンドで今度は１のルールを削除します。
&emsp;aws elbv2 delete-rule --rule-arn ＜ルール ARN＞
&emsp;ここで問題となるのはルールARNはcreate_ruleコマンドで自動的に割り当てられるので
&emsp;ルールARNを取得してこなければなりません。

➁ describe-rules コマンドでルールARNの取得。
&emsp;aws elbv2 describe-rules --listener-arn　＜リスナーARN＞
このコマンドコマンド結果を以下の様にgrepで"Priority": "1"の上の行のルールARNの部分を
抽出します。
```
grep '"Priority": "1"' -B 1 | grep -o 'arn:aws:[^"]*'` 
```
この抽出結果を delete-rule --rule-arn オプションにに組み込みます。

➂ delete-rule --rule-arn コマンドでルールの削除
```python
aws elbv2 delete-rule --rule-arn `aws elbv2 describe-rules --listener-arn &emsp;arn:aws:elasticloadbalancing:ap-northeast-1:773181940404:listener/app/＊＊＊（マスクしてます）/9f3425e854e7525f/6ec0638ed3d93aba | grep '"Priority": "1"' -B 1 | grep -o 'arn:aws:[^"]*'` 
```
➃ １で作成したルールが削除された事を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/8031df5e-6ca3-c40a-77fc-a74407b8c91c.png)
１の➄で追加されたルールが削除されている事が判ります。

➄ 閉局されていた画面がルールが削除された事で再び開局した事が確認出来ました。
![スクリーンショット 2023-02-13 031722.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/1d55df2d-974c-4b53-cb34-3cb49bf1c33c.jpeg)
Rust Diesel(1.4.8) でMySqlクエリを直接叩く

なんかシンプルに使いたいときのメモ。
diesel 2.0.0以降だとまた様相が違いそう。気が向いたら書く。


```

use diesel::deserialize::QueryableByName;
use diesel::{MysqlConnection, RunQueryDsl, sql_query};

// テーブルから読み込むための構造体
#[derive(Debug)]
pub struct HogeRecord {
    pub id: u64,
    pub hoge_num: u64,
}

impl QueryableByName<DB> for HogeRecord {
    fn build<R: diesel::row::NamedRow<diesel::mysql::Mysql>>(
        row: &R,
    ) -> diesel::deserialize::Result<Self> {
        Ok(HogeRecord {
            id: row.get("id")?,
            hoge_num: row.get("hoge_num")?,
        })
    }
}

impl HogeRecord {
    // シンプルな読み込み
    pub fn read () -> Vec<HogeRecord>{
        let conn = MysqlConnection::establish("DBのURL").unwrap();
        
        // 適当なクエリ
        let query = format!("SELECT id,hoge_num FROM hoges;");
        
        // selectならload関数使う
        let records: Vec<HogeRecord> = sql_query(query).load(conn).unwrap();

        records
    }
    
    // シンプルな書き込み
    pub fn write () {
        let conn = MysqlConnection::establish("DBのURL").unwrap();
        
        // 適当なクエリ
        let query = format!("UPDATE hoges SET hoge_num = 1");
        
        // updateとかinsertならexecute関数使う
        sql_query(query).execute(conn).unwrap();

    }
}

```
AWS ALBリスナールールをAWS CLIを使い自動的にWEBの閉局・開局を実現する

今回はAWS ALB経由のAPサーバにおいてWEBサービスを一定時間を開局、それ以外の時間は閉局したい時にこれを自動化する方法を考えてみました。
【Discord.js v14】DiscordのBotサンプル【TypeScript】

# イントロダクション
　本記事ではDiscord.jsとTypescriptを利用したBotを作成していきます。とにかく動くものを作りたいという方はぜひご覧ください。Discord.jsには様々なバージョンがありますが、本記事で利用するものはv14（v14.7.1）とします。なお筆者はQiita初投稿につき拙い文章となりますが、参考となれば幸いです。

# 前提事項
 * Discord.js,TypeScriptを導入している
 * Botに必要な”トークン”を持っている
 * DiscordのサーバーにBotを参加させている

※本記事では解説よりも動作するコードを提示することを目的としているため、詳細な解説は省きます。その他情報については他記事に頼ることとしますので検索ください。

# 筆者環境
| 環境 | Version |
| --- | --- |
| Node.js | v16.18.0 |
| TypeScript | v4.9.4 |
| discord.js | v14.7.1 |
| dotenv | v16.0.3 |
| Visual Studio Code | v1.75.1 |

dotenvパッケージを導入してください。Botのトークンを保存する目的で利用します。なお本記事ではnpmを利用してパッケージの導入を行います。discord.jsとdotenvは以下のコマンドで導入してください。
```
npm install discord.js dotenv
```

# フォルダ構造
本記事では以下のようにファイルが存在するとしています。コンパイル時のコマンドに入力するパスは適宜読み替えてください。なお筆者の環境ではtsconfig.jsonの"outDir"は"./build"としています。

:::note warn
コンパイル前にbuild/index.jsは存在しません。フォルダだけ用意してください。
:::

```
.
├─ build
|  └─index.js
├─ node_modules
├─ src
|  └─index.ts
├─ .env
└─ etc...
```

# サンプルコードの説明
Botが参加しているDiscordサーバー内のテキストチャンネルで
```
!ping
```
で始まる文字列を送信すると
```
Pong!
```
と返信するプログラムです。

# サンプルコード本体
:::note warn
.envファイルを必ず追加し、Botのトークンを入力してください。
.envファイルの位置はindex.tsと同一階層、または親階層としてください。
:::

```typescript:index.ts
import { Message, Client, Events, GatewayIntentBits } from 'discord.js'
import dotenv from 'dotenv'

dotenv.config();

const client: Client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMembers,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent
    ],
});

client.once(Events.ClientReady, (c: Client) => {
    console.log(`Ready! Logged in as ${c.user?.tag}`);
});

client.on(Events.MessageCreate, async (message: Message) => {
    if (message.author.bot) {
        return;
    }

    if (message.content.startsWith('!ping')) {
        message.reply('Pong!');
    }
});

client.login(process.env.TOKEN);
```

```:.env
TOKEN='YOUR_BOT_TOKEN'
```

# Botの実行
まずはindex.tsをコンパイルします。
```
tsc -p .
```
コンパイルに成功するとindex.jsが生成されます。筆者環境ではbuildフォルダに出力するよう設定しました。

以下のコマンドでBotを実行します。
```
node build/index.js
```
ターミナルに次のメッセージが表示されれば、Botが正常に起動した証拠です。
```
Ready! Logged in as YourBotName#1234
```

:::note info
YourBotName#1234は例です。
実際にはあなたのBotの名前とディスクリミネータ（#以降の番号のこと）が表示されます。
:::

それではDiscordのサーバーで`!ping`と入力して送信してみてください。
そうするとBotから`Pong!`と返信が来るはずです。

# まとめ
本記事では簡単なDiscordのBotを作成しました。一部を端折っていますが必須の部分は記載できていると思います。これをスタートに自分のBotを製作していきましょう。
Flutter Androidビルド作成が失敗するKeystore file ‘android/app/key.jks' not found for signing config 'release'.

# はじめに
FlutterアプリをGoogle Play Storeに公開する手順は以下のような記事で解説されています。

https://gakogako.com/flutter_android_release/

https://zenn.dev/kazutxt/books/flutter_practice_introduction/viewer/42_chapter5_googleplay



ただ、私の場合はその通りにやってもできなかったので、、、ここに記録したいと思います。

**私はAndroidアプリを公開するのは初めてではないので、既にkeystoreファイルは持っています。なので最初の準備はすっ飛ばして進めました。**


だからなのかわかりませんが、`flutter build appbundle`の部分でエラーに見舞われました。。

# 前提
Keystoreファイルの作成、`key.properties`の作成など[ここまでの手順](https://gakogako.com/flutter_android_release/#flutter_cleanする)は完了済みとする。

必要ファイルは👇のように設置。

![Screenshot 2023-02-13 at 1.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/ed94a1f7-fa94-ffb2-922e-36bc6abc9b9a.png)


# Keystoreが見つからないと言われる

```console
flutter clean
flutter pub get
flutter build appbundle
```

を順に実行すると以下のようなエラーが発生。。。

```console
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:validateSigningRelease'.
> Keystore file '/Users/user/Desktop/basic/flutter/sample/android/app/key.jks' not found for signing config 'release'.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 57s
Running Gradle task 'bundleRelease'...                             66.2s
Gradle task bundleRelease failed with exit code 1
```

Keystoreファイルが見つからないようだ。

参考にした記事の通りに`key.properties`を作成したが、コピペではダメだったようだ。

## Android StudioのGenerate Signed Bundleを確認
まず私の場合はkeyAliasが違ったようです。。
私の場合すでにAndroidアプリをリリースしているので、そっちで`Build>Generate Signed Bundle`で確認ができます。

![Screenshot 2023-02-13 at 1.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/f79e259d-256d-3da3-cb3c-83fedb29c22a.png)


また画像と同じような感じで`key.properties`のstoreFileへのパスですが参考記事のコピペではなく、絶対パスで指定すると通りました！

```properties:key.properties
storePassword=パスワード
keyPassword=パスワード
keyAlias=key0
storeFile=/Users/user/Desktop/basic/flutter/sample/android/app/keystore
```
【Tomcat】初心者がCentosにTomcatサーバーを構築する。

# 本学習の流れ
今回は以前AWSで作成したCentosのサーバーにTomcatのサーバーを構築し、アプリをサーバー上で動かせるようにします。

今回の学習の流れです。
+ JDKのインストール
+ Tomcatのインストール
+ サービスの作成と登録
+ Tomcatを起動


# JDKのインストール
Tomcatの動作にはjavaが必要となるため、JDKをインストールします。
rootにLinux版JDK9のrpmを配置します。
とインストール手順にありましたが、rootユーザーでWinscpからログインを試したところ、パケットが大きすぎて処理できないと言われてしました。
解決策がわからなかったため、一旦centosに配置してインストールを進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3142287/18908271-c20b-c3d2-ee9a-ecf6ace79cdd.png)
一応インストールはできました。
後から思ったんですが、コマンドでファイル移動できたかも？

# Tomcatのインストール
#### Tomcatユーザ作成
Tomcat専用のTomcatユーザを作成します。
Tomcatの専用ユーザがなぜ必要なのか調べてみましたが、記事によってはセキュリティダウンにつながるのでNGと書かれているものもありました。もう少し勉強しないと自分ではわかりませんでした。
```
# useradd -s /sbin/nologin tomcat
```
#### Apache Tomcatのダウンロードと配置
まず、Apache Tomcatのダウンロードページからtar.gz形式のApache Tomcat本体をダウンロードする。
今回はバージョン9.0.71をダウンロードする。
```
# curl -O https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.71/bin/apache-tomcat-9.0.71.tar.gz
```
※最新版でないと解答が上手くいかない場合があるみたいなので注意。

ダウンロードしたtar gzファイルを解凍し、配置する。
```
# tar -xvzf /root/apache-tomcat-9.0.71.tar.gz
# mv ~/apache-tomcat-9.0.71 /opt
# chown -R tomcat:tomcat /opt/apache-tomcat-9.0.71
```

# サービスの作成と登録
CentOS 7からはサービスをsystemdが管理するようになりました。
systemdが何者なのかまだ調べられていませんが追々勉強することにします。
一旦登録だけします。
```
# vi /etc/systemd/system/tomcat.service
```
以下の内容を書き込みます。
```
[Unit]
 Description=Apache Tomcat 9
 After=network.target

 [Service]
 User=tomcat
 Group=tomcat
 Type=oneshot
 PIDFile=/opt/apache-tomcat-9.0.71/tomcat.pid
 RemainAfterExit=yes

 ExecStart=/opt/apache-tomcat-9.0.71/bin/startup.sh
 ExecStop=/opt/apache-tomcat-9.0.71/bin/shutdown.sh
 ExecReStart=/opt/apache-tomcat-9.0.71/bin/shutdown.sh;/opt/apache-tomcat-9.0.71/bin/startup.sh

 [Install]
 WantedBy=multi-user.target
```
ファイル権限を755に変更します。
```
# chmod 755 /etc/systemd/system/tomcat.service
```
サービスを有効にします。
```
# systemctl enable tomcat
```
サービスの登録が完了しました。

# Tomcatを起動してみる。
次のコマンドで起動します。
```
# systemctl start tomcat
```
自作のアプリがデプロイされていればこれでアプリがサーバー上で動く、、、はずです。
今回はデプロイまで出来ていないのでいったんここまでにします。
一応停止しておきます。
```
# systemctl stop tomcat
```
tasks.register()に渡す第二引数と第三引数に関するメモ

`Plugin<Project>`を継承したクラスにてオーバーライドされる`apply()`では、タスクを登録することができる。

```kotlin
class CustomPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        with(target) {
            tasks.register("customTaskName", CustomTask::class) {
                dependsOn(taskName)
                ...
            }
        }
    }
}
```

タスクを登録する際、`Project`の`tasks`プロパティの`register()`を呼び出す。

第一引数には、タスク名を渡す。

ただ、第二引数に付けられた名前が`type : KClass<T>`となっており、使われ方がよくわからなかった。

そして、第三引数として渡すブロックは`configurationAction: Action<in T>`となっていてますますわからない。

なので、調べてみることにした。

まず、第二引数として渡される`type`なのだが、これはカスタムタスクの種類を表しているらしい。
もちろん、渡されるのはクラスだが名前はタイプとなっている。。。。~~ややこしい。~~

このクラスでは、Gradleタスクの実行に必要なプロパティやアクションなどが定義される。
つまり、`DefaultTask`を継承しているクラスということだ。

このクラスのインスタンスは、Gradleビルドスクリプトによって作成される。

そして、第三引数のブロックだが、このブロックの内部でインスタンスのプロパティを独自に設定することができるようになっている。つまり、タスクを設定するために実行されるアクションである。

第二引数で渡されたクラスのインスタンスは、実際に必要とみなされたときに作成される。
そしてそのタイミングで第三引数のブロックが呼び出されてタスクに関する設定を行う。例えば、`dependsOn`を呼び出して依存しているタスクを指定するとか、プロパティを設定したりできる。

最終的に、登録されたタスクに定義されたアクションが、ビルドプロセスの一部として、ビルドの実行時に呼び出されることになる。
Windows PC から Steam Link を使って Steam Deck に接続する

やってることはWindows PC からSteamLink経由でSteamDeckを遠隔操作してるだけですが、少し躓くところがあったので忘備録に。

# 環境
 - Steam Deck OSバージョン 3.4.4
 - Windows 11 22H2
 - SteamLink : バージョン 1.2.0.241

# Steam Deck 側の準備
メニューから「設定 - RemotePlay - PINを設定」を開く。
「Remote Playを有効にする」のスイッチを有効にする。
「PINを設定」を押して、接続時に必要な任意のPINを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/1efa1a23-a677-e062-fd60-c37b0b3323db.png)

# PC側の準備
Steam Link のクライアントソフトを下記リンク先からダウンロード。
https://store.steampowered.com/remoteplay?l=japanese#anywhere

ダウンロードしたZIPファイルを解凍して「setup.exe」からインストーラを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/cb82d0a5-7dea-a32a-89c0-115a03ad6d73.png)

Steam Link はデフォルトだとフルスクリーンで起動するので、必要であればウィンドウモードで起動させるためのショートカットを作成する。
下記のように `--windowed` オプションを指定してショートカットファイルをつくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/0207cefe-79e9-d9bb-a6d3-3eff06edd300.png)

ここから、SteamLinkにSteamDeckをリンクさせる作業を始めるが、同じPC上でSteamクライアントとSteamLinkを同時に起動している状態だと何故かSteamDeckがオフラインのまま接続出来なかったので一旦Steamクライアントを終了する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/86efa321-4870-4bfa-e915-851847fbf425.png)

Steamクライアントのメニューから「Steam - 終了」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/3144010d-b610-6ac6-6393-4d29c42f4af6.png)

SteamLink上でsteamdeckがオンライン状態になったら「プレイ開始」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/85bf8258-d5db-6328-1953-1c19070e5393.png)

リンクさせるためのPINがSteamLinkに表示されるので、これをSteamDeck側で入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/4a496ff5-1f18-4d8f-03e7-4449e50e0406.png)

SteamDeckに接続するためのPIN入力を求められるので、SteamDeckで予め設定したPINを入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/b28826b5-b0ba-7548-cc6c-53c61343d97c.png)

以上で、PCのSteamLinkからSteamDeckをリモートで操作できるようになる。
一度リンクした後は、PC上でSteamクライアントと同時にSteamLinkを起動してもSteamDeckのオンライン状態を認識できるようになる。
SteamDeckの「Remote Playe - コンピュータ＆デバイス」には、SteamクライアントとSteamLink両方のステータスが表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/bfe981ed-9773-57e8-0ae6-66cf681a2f7e.png)

なお、SteamLinkを終了させる場合はEscキー長押しで現れるメニューから「ストリーミングを停止」を選択して終了すること。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/7ee76891-3fb7-0db2-27d6-12442bede805.png)

ストリーミングを停止せずにSteamLinkウィンドウのXボタンから直接閉じてしまうと、**SteamDeck側の画面がブラックアウトして操作不能になり、電源ボタン長押しで強制終了しなくてはいけなくなる。**

Gaming ModeからDesktop Modeに切り替えると一旦リンクが切れるが、もう一度SteamLinkから「プレイ開始」を押せば、Desktop Modeになった後でもSteamDeckに接続できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/a9348a4e-d580-3c8a-9bc9-23d0a22ed26c.png)
[Mac] Finder のツールバーから VSCode をワンクリックで開く

## はじめに

みなさん、『cd to』というアプリをご存知でしょうか？

https://github.com/jbtule/cdto

これは、Finder のツールバーに表示させておけば、現在 Finder で開いてるフォルダーをカレントディレクトリーとして Terminal をワンクリックで開いてくれる機能拡張アプリで、非常に便利です。

この記事では、『cd to』の VScode バージョン、すなわち『**Finder のツールバーで VScodeアイコンをワンクリックすると、現在Finderで開いているフォルダーを VScode で開いてくれる**』機能を実装してみます。

## Automator

Mac 標準アプリ『Automator』を使用します。
ワークフロー、アプリケーション、クイックアクションなどから選択できるのですが、ここではアプリケーションを作成してみます。
次に行う作業として、『シェルスクリプトを実行』という項目を選択します。Automatorには無数の機能があるので、「シェルスクリプト」などで検索して見つけるのが良いです。
そしたら、以下のコマンドをシェルスクリプトにコピペします。シェル環境や出力は特にいじる必要はありません。

```shell
finderPath=`osascript -e 'tell application "Finder" to get the POSIX path of (target of front window as alias)'`
open -n -b "com.microsoft.VSCode" --args "$finderPath"
```
このAutomatorファイルは、適当な名前（ここでは、open_vscode.app とする）をつけてアプリケーションとして保存しておきます。

## ツールバーに追加

Finder でアプリケーションの中から、先ほど保存した open_vscode.app を探します。見つけたら、右クリックで『情報を見る』を選択。
まずは、アイコンをそれっぽいものに変更します。ネットから適当に VSCode 系のアイコン画像を拾ってきます。これを、『情報を見る』でポップアップ表示されたウィンドウの上に位置している小さなアプリアイコンの上に、ドラッグ&ドロップして置き換えます。
そしたら、Finder からアイコン変更した open_vscode.app を選択した上で、『コマンドキー⌘』を押しながら、Finder 上部のツールバーにドラッグ&ドロップして配置させます。
![Screenshot 2023-02-12 at 15.57.33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738192/7906c478-3e14-7fb3-b12d-8abba77d8a4f.jpeg)
これで上図のように、VScode のアイコンが Finder のメニューバーに追加されました（ダークモードなので少し見えにくいかもしれませんが）。ここをワンクリックすると "秒で" VScode が起動し、そのディレクトリ内のファイルを VScode内で編集できるようになります。
ちなみに右隣にあるのは前述した『cd to』です。ここを押すと、Terminal が開きます。

## まとめ

いかがだったでしょうか。一見すると地味な機能に見えますが、毎回 VScode を起動してからフォルダーを移動して、、という数秒の手間が省けることで、想像以上の快適さが手に入ります。皆さんも是非導入してみてください。
[Python 学習] for をつかったループ処理

## はじめに

<h3>1.for文には以下の特徴があります</h3>


<ol>
   <li>文字列を繰り返し出力する</li>
   <li>リストの中の要素を一つずつ出力する</li>
   <li>while と違い繰り返し処理の回数が決められている</li>
</ol>

<h3>2. 文字列を繰り返し出力する</h3>

```main.py
for i in range(10):    # 10回繰り返し処理を行う
    print('YOU')       #　出力する文字列
```

<h3>3.リストを作成して中身の要素を順番に出力する</h3>

```index.py
alp = ["Apple", "Orange", "Srawberry", "Kiwi"]

for i in alp: # alpのリストの各要素を変数iに代入していく
    print(i)  # 順番に変数iに代入された各要素を出力する
```

「for i in alp」は、「for i in range(4)」に書き換える場合、「print(i)」ではなく
「print(alp[i])」と書き換えなくてはいけません。

```index.py
alp = ["Apple", "Orange", "Srawberry", "Kiwi"]

for i in range(4): 
    print(alp[i]) 
```
<h3>4.シンプルなクイズを作成する。</h3>

```quiz.py
Q_list = [

"印度の首都はどこ?",
"日本の初代内閣総理大臣は誰?",
"日経平均株価の構成銘柄はいくつ?",
"マイクロソフトの本社はどこ?"
]

ans_list = ["ニューデリー", "伊藤博文", "225", "レドモンド"]

for i in range(4): #リストの要素を順番に出力する
    print(Q_list[i])
    ans = input()
    if ans == ans_list[i]:
        print('正解')
    else:
        print('不正解')
```
```
出力結果:

印度の首都はどこ?
ムンバイ
不正解
日本の初代内閣総理大臣は誰?
伊藤博文
正解
日経平均株価の構成銘柄はいくつ?
200
不正解
マイクロソフトの本社はどこ?
レドモンド
正解

```

<h3>最後に</h3>

暫くpythonを学習していなかったため、基礎固めのために投稿しました。
phpで配列から引数を自動展開する方法

可変長引数の話題でよく目にする、関数の引数は以下の通り。
```php
function hoge(...$array)
{
    var_dump($array);
}

hoge('hoge', 'piyo', 'hello', 'world');

array(4) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(4) "piyo"
  [2]=>
  string(5) "hello"
  [3]=>
  string(5) "world"
}
```

'...'入力時に引数を配列から自動展開してくれる機能がある。
この際、配列鍵が歯抜けでも問題がない。

```php
$array = ['hoge', 'piyo', 'hello', 'world'];
もしくは
$array = ['hoge', 'piyo', 'hello'];
これを関数の引数としたい

hoge(...$array);

array() {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(4) "piyo"
  [2]=>
  string(5) "hello"
...

function humu($one, $two, $three){
var_dump('one', $one, 'two', $two, 'three', $three);
}
$array = ['hoge', 'piyo', 'hello', 'world'];
unset($array[0]);
humu(...$array);
string(3) "one"
string(4) "piyo"
string(3) "two"
string(5) "hello"
string(5) "three"
string(5) "world"
```

ちなみに引数名を指定しない場合は、配列鍵が入る。
```php
hoge(...["one" => 'hoge', "two" => 'piyo', "three" => 'hello', "four" => 'world']);
array(4) {
  ["one"]=>
  string(4) "hoge"
  ["two"]=>
  string(4) "piyo"
  ["three"]=>
  string(5) "hello"
  ["four"]=>
  string(5) "world"
}
```
配列鍵と固定引数がある場合は、配列鍵が指定されているとエラーが生じる。

```php
function fuga($Hi, $Fu, $Mi, $four, ...$hoka){
echo "Hi . $Hi\n";
echo "Fu . $Fu\n";
echo "Mi . $Mi\n";
echo "four . $four\n";
var_dump($hoka);
}
//error
fuga(...["one" => 'hoge', "two" => 'piyo', "three" => 'hello', "four" => 'world']);

これは通る
fuga(...['hoge', 'piyo', 'hello', 'world', 'aa' => 'fumu']);
Hi . hoge
Fu . piyo
Mi . hello
four . world
array(1) {
  ["aa"]=>
  string(4) "fumu"
}
```

最後に可変長引数が設定されているObject内の関数をReflectionClassで覗くと以下のようになっている。

```php

class Object{
function fiction(...$one){
}}

(new \ReflectionClass('\NameSpace\Object'))->getMethod('fiction')->getparameters();
= [
    ReflectionParameter {
      +name: "one",
      position: 0,
      isVariadic: true,
    },
  ]
# Variadic (可変長引数)
(new \ReflectionClass('\NameSpace\Object'))->getMethod('fiction')->getparameters()[0]->isVariadic();
= true
```
Elixir Image で SVG を PNG に変換する

## はじめに

皆さんは SVG を PNG に変換したいときどうしていますか？

Google で検索すると大量にオンライン変換ツールが出てきます

https://www.google.com/search?q=svg+to+png&rlz=1C5CHFA_enJP795JP795&sxsrf=AJOqlzVHSPRe9mettRBPXyNZd_g3FR1Sbw%3A1676215009149&ei=4QLpY4_qCPaO2roP-eWhoAs&ved=0ahUKEwjP3r_Bo5D9AhV2h1YBHflyCLQQ4dUDCA8&uact=5&oq=svg+to+png&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzIECCMQJzIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDoHCCMQsAMQJzoKCAAQRxDWBBCwAzoHCCMQsAIQJzoHCAAQDRCABDoICAAQBxAeEBM6CwgAEAcQHhDxBBATSgQIQRgASgQIRhgAUNAGWOgIYMANaAFwAXgAgAF0iAHJApIBAzAuM5gBAKABAcgBCsABAQ&sclient=gws-wiz-serp

でも、オンラインには上げられない、もしくは怪しいサイトにはアクセスしたくない、ということもありますよね

Elixir なら手元で変換可能です！

というわけで、今回は Image モジュールで SVG を PNG に変換するだけの小ネタです

https://github.com/elixir-image/image

いつものように Livebook を使います

https://livebook.dev/

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/vix/svg_to_png.livemd

## 実行環境

- Elixir: 1.14.2 OTP 24
- Livebook: 0.9.3

以下のリポジトリーの Docker コンテナ上で起動しています

https://github.com/RyoWakabayashi/elixir-learning

:::note info

Docker が使える環境であれば簡単に実行できます

https://docs.docker.com/engine/install/

Docker Desktop を無償利用できない場合は Rancher Desktop を使ってください

https://rancherdesktop.io/

:::

## セットアップ

必要なモジュールをインストールします

```elixir
Mix.install([
  {:image, "~> 0.35"},
  {:req, "~> 0.3"},
  {:kino, "~> 0.9"}
])
```

Req はモデルファイルや画像を Web からダウンロードするのに使っています

https://github.com/wojtekmach/req

## SVG のダウンロード

元画像には ElixirConf EU のヘッダーに使われているアイコンを使ってみます

https://www.elixirconf.eu/

元画像（SVG）

![元画像](https://www.elixirconf.eu/assets/images/drops.svg)

SVG の画像を Web からダウンロードします

```elixir
svg_img =
  "https://www.elixirconf.eu/assets/images/drops.svg"
  |> Req.get!()
  |> then(& &1.body)
  |> Image.from_svg!()
```

![drops.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/3c00dc0e-c1e4-f7cf-be59-7978354b9e99.png)

実はこの時点で Livebook に表示された画像を右クリック |> 保存で PNG として保存可能です

## PNG 形式で保存

せっかくなので、コードでも保存しましょう

```elixir
Image.write(svg_img, "png_img.png")
```

実行結果は以下のようになります

```elixir
{:ok, %Vix.Vips.Image{ref: #Reference<0.795797202.1408368656.27075>}}
```

Image モジュールは内部的に Vix というモジュールを利用していて、その画像形式が返っています

https://github.com/akash-akya/vix

ファイルを確認すると、確かに PNG 形式になっています

## まとめ

SVG を扱えるのは何気に便利です
モニターの右半分が真っ暗

**生じた問題**
ある日突然モニターのきれいに右半分が真っ暗になる。HDMIをグラボから抜き差しすると治る。

**解決方法**
モニター側の設定でHDRをオフにする

**あとがき**
HDRって何の意味があるんですかね
XCode14 Fireabaseのライブラリ追加

XCodeでSwiftを使ってFirebaseと連携したアプリ開発をする際のFirabase-ios-sdkのライブラリのimport方法について明記します

### やること
- Firabase-ios-sdkのパッケージ追加
- プロジェクトの設定にライブラリの追加
- ソースコードに読み込みたいライブラリのimport文を記述

### Firabase-ios-sdkのパッケージ追加
XCodeの[File]->[Add packages..]を選択すると以下のウィンドウが表示されるので「Firebase」と検索すると「firebase-ios-sdk」がすぐ見つかると思います。
![スクリーンショット 2023-02-13 0.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/857cddf0-08b6-2600-1615-cd57692d7902.png)

[Add package]ボタンをクリックしてダウンロードしましょう

### プロジェクトの設定にライブラリの追加
次にプロジェクトの設定に必要なライブラリを追加します
XCode上でプロジェクトフォルダのアイコンをクリックするとプロジェクトの設定画面（.xcodeprjファイル）が開くので[Frameworks, libraries,and Enabdded content]の項目の(+)アイコンをクリックして選択します
![スクリーンショット 2023-02-12 23.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/48adf6ff-dd3c-1713-6558-8f9e1ad82cbb.png)
![スクリーンショット 2023-02-12 23.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/dea2ef8e-7184-f260-cd67-3bfba9f0331b.png)


### ソースコードに読み込みたいライブラリのimport文を記述
最後に必要なライブラリを記述します
```
import Firebase
import FirebaseAuth
```
お母さんでもわかるクラスとインスタンス

## はじめに
今回はお母さんでもわかる「クラスとインスタンス」の説明を頑張って考えました。

なぜこの記事を書こうと思ったのかというと、他の記事を読んでも単語と役割が全く結び付かなかったからです。
「なんかやりたいことはわかったけど、インスタンスって結局何のことだっけ？」「コンストラクタって何してる？と聞かれると答えられない」みたいな感じになってしまいました。

ですので、こんな記事が欲しかったなというものを自分なりに書きました！
すごくわかりやすく考えられたと思うのでぜひ最後までご覧ください！

## 目次
・[プロパティとメソッド](#プロパティとメソッド) 
・[インスタンスとオブジェクト](#インスタンスとオブジェクト) 
・[クラスとコンストラクタ](#クラスとコンストラクタ) 


## クラスとは
```index.js
class たいやき{
  constructor(生地、中身){
   this.生地=生地
   this.中身=中身
  }

  showNakami() {
    console.log(`${this.生地}, ${this.中身}`);
  }
}

const A = new たいやき(パイ生地,あんこ);
const B = new たいやき(普通の生地,チョコ);

console.log(A.生地);//パイ生地
B.showNakami();//普通の生地,チョコ

```

このような構成になっているんですけど、今これがこうで〜と説明してもなかなか頭に入ってこないと思います。
ですのでまずはクラスの中の部分から説明をしていきます！

## プロパティとメソッド
初めからクラスの構成を見てもを学ぶ前に、プロパティとメソッドから説明いたします！

### プロパティ
プロパティとは「所有物、属性、性質」等の意味があり、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782070/c814c129-5653-c0f4-5ebc-825169070d9b.jpeg" width=50%>

こんな感じで「プロパティのkey」と「プロパティのvalue」で構成されています。

ではクラスのどの部分を指しているのかというと、
```index.js
//this.プロパティ名=プロパティの値
this.生地=生地
this.中身=中身

//呼び出し方(Aはオブジェクト名)
console.log(A.生地);
```
ここですね！
よくある「プロパティ名：プロパティの値；」とは構成が異なりますが、これはオブジェクト内のプロパティ名に値を代入している記述になります。

※ちなみに、**代入することを初期化という**らしい。
→例えば、代入しなくても`const taiyaki;`でも成立するけど、taiyakiの中に意図しないものが入っているのを防ぐために`const taiyaki = anko`と値を入れるかららしい。
（代入しないで俺の嫌いなレバーとか入ってたら嫌だもん）

### メソッド
メソッドとは「オブジェクトの中にある関数」のことで、機能的にも関数と変わりありません！
上記のコードでは、
```index.js
  showNakami() {
    console.log(`${this.生地}, ${this.中身}`);
  }

//呼び出し方(Bはオブジェクト名)
B.showNakami();
```
この部分がメソッドに当たります！
なぜ呼び方が違うのかというと、「呼び方を変えた方がわかりやすいよねー」って感じだからです!(適当ですいません)

## インスタンスとオブジェクト
続いて、インスタンスとオブジェクトについてです。

ここはあまり深く考えず、
**インスタンスとはオブジェクトの中の一つで、インスタンスもオブジェクトのような役割をになっている**
と思ってくれていいかなと思います。

※厳密には「インスタンスはオブジェクトである」と言えるが、「必ずしもオブジェクトはインスタンスである」とは言えない。
→「俺は人間だけど、必ずしも人間は俺じゃない」的な！！


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782070/0beaa428-b795-9dfb-92d4-6ffbffbdeeed.jpeg" width=50%>


イメージはこんな感じです！

そして、下記の呼び方としては「たいやきオブジェクト」ではなく「たいやきインスタンス」になります！
インスタンスと呼ぶけどオブジェクトの役割を果たします！
```index.js
class たいやき{
  constructor(生地、中身){
   this.生地=生地
   this.中身=中身
  }

  showNakami() {
    console.log(`${this.生地}, ${this.中身}`);
  }
}
```

##  クラスとコンストラクタ
### クラス
改めてクラスの確認です！
クラスとは下記の部分ですが、このままではまだ使用できません。
```index.js
class たいやき{
  constructor(生地、中身){
   this.生地=生地
   this.中身=中身
  }

  showNakami() {
    console.log(`${this.生地}, ${this.中身}`);
  }
}
```
なぜかというと、まだ**インスタンス（という名のオブジェクト）になっていない**からです。

ではどのようにインスタンスにするのかそれは、
```index.js
const A = new たいやき(パイ生地,あんこ);
```
このように記述することで、Aというインスタンスを作ることができ、オブジェクトのようにデータを取得することができます！
これをインスタンス化といいます！

### コンストラクタ
```index.js
constructor(生地、中身){
   this.生地=生地
   this.中身=中身
  }
```
コンストラクタはこの部分をいいますが、
プロパティのところでも少し触れましたが、コンストラクタは**変数を初期化するために使うことが多い**です。
上記のインスタンス化が行われたらすぐに、初期化が実行されます！

そしてみんな気になっているthisですが、インスタンスしたものをさしています！
（今回の例でいくと「A」と「B」のこと）

※ちなみにthisについては[「このサイト」](https://wp-p.info/tpl_rep.php?cat=js-application&fl=r10)がとにかくわかりやすい！！！


## まとめ
今回は機能について細かく見るというよりは、「これはこういうことを言ってるんだよ〜」みたいな考え方について書いてみました！

クラスに限らず、概念を理解するのはとても難しい。
けど理解すると細かい機能までスッと入ってくるのでとても大切です！

これからもまずは概念からしっかり学んでいきたいと思います！

ご精読ありがとうございました！！！
GradleプラグインとGradleタスクの違いのメモ

私は、GradleプラグインとGradleタスクの違いがわからなかった。

Gradle素人として、いくつか疑問が浮かんできた。

「プラグインとタスクの本質的な違いはなんだろう？」

「GradleプラグインとGradleタスクの使う場面ってどこだろう？」

まずは、Gradleプラグインについて調べてみた。

Gradleプラグインは、新しい既存の機能を拡張するために存在している。
そして、Gradleプラグインを使うことで新しいタスクの追加や、既存の設定を上書きしたりすることができるようだ。

ここで出てきたタスクという単語。

そう、Gradleタスクはプラグインによって追加することができるのだ。

:::note warn
もちろん、プラグインをわざわざ作成しなくても、直接**build.gradle**に定義することも可能。
:::

そして、ここでいうタスクとは、Gradleのビルドにおける１つの作業単位を表す。この作業単位とは、実際にはクラスのコンパイルや、JARの作成、そしてJavaDocの作成などのひとまとまりのロジックを意味している。

そしてこのタスクは、別のタスクに依存することができる。なのでタスクを連結させて複雑なビルドの内容を表現することができるようだ。

つまり、Gradleプラグインは、Gradleタスクと上書きされた設定オプションを提供するためのものであり、Gradleタスクは、そのビルドにおける１つの作業単位をあらわす。

ドキュメントなどを読んでいると、直接**build.gradle.kts**に`DefaultTask`を継承した抽象クラスを作成して、`tasks.register()`を呼び出すことでタスクを追加しているのを確認することができる。

しかし、これは`Plugin<Project>`を継承したプラグインクラスでオーバーライドされる`apply()`に第一引数として渡される`Project`変数の`tasks`プロパティを使っても同じようにタスクを登録することができる。

そういう意味で、プラグインは上書きされた設定オプションのみならず、タスクも提供することができるのだ。

# 参考文献

https://www.javatpoint.com/gradle-projects-and-tasks

https://www.baeldung.com/gradle-custom-task

https://www.baeldung.com/gradle-create-plugin

https://docs.gradle.org/current/userguide/custom_tasks.html
ES Modulesについて

# はじめに



#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>


ES Modulesについて学んだことを書きます。



# 具体的な内容



## ES Modulesとは何か


ECMA Script Modulesの略。



ES2015仕様において策定された、JavaScriptファイルから別


のJavaScriptファイルを読み込む仕組みです。


ES Moldulesは標準としてNode.jsとブラウザ両方に対応し


たモジュールシステムの仕様です。


# ES Modulesのメリットは？



ES　Modulesは言語レベルの文法、ブラウザサポート、デフォルトでstrictモード、


非同期import、トップレベルでのawaitの使用、静的解析の向上、ツリーシェイキングなど様々なメリットがあります。



# まとめ


JSファイルを細かく分けた場合、ウェブサーバーから転送すべきファイルの数が増える傾向があるらしいです。

この辺はまだまだ学習必要です。
【Git】カレントブランチ名を取得する方法


以下のコマンドでカレントブランチ名を取得できます。

## `git rev-parse`
```:ターミナル
$ git rev-parse --abbrev-ref HEAD
main

$ git rev-parse --abbrev-ref @
main
```
detached HEADの場合にはHEADと出力される。


## `git symbolic-ref`
```:ターミナル
$ git symbolic-ref --short HEAD
main
```
detached HEADの場合には`fatal: ref HEAD is not a symbolic ref`と表示され異常終了する（終了コード: 128）。


## `git branch`
```:ターミナル
$ git branch --show-current
main
```
detached HEADの場合には何も出力されず正常終了する。

## `git name-rev`
```:ターミナル
$ git name-rev --name-only HEAD
main

$ git name-rev --name-only @   
main
```

detached HEADの場合にもブランチを取得できる。
NFTゲーム開発　（開発準備編）

# はじめに
個人でNFTゲームを開発する為に何が必要なのか、準備しなくてはならない項目についてまとめました。

### 参考にした本
* [マスタリング・イーサリアム ―スマートコントラクトとDAppの構築](https://amzn.to/3xRzfF8)
* [SolidityとEthereumによる実践スマートコントラクト開発 ―Truffle Suiteを用いた開発の基礎からデプロイまで](https://amzn.to/3xRWFu5)
* [詳解 ビットコイン ―ゼロから設計する過程で学ぶデジタル通貨システム](https://amzn.to/3xqrGnC)
* [ブロックチェーン dapp＆ゲーム開発入門 Solidityによるイーサリアム分散アプリプログラミング](https://amzn.to/39o2IgD)

## NFTゲームについて
NFT（Non-Fungible Token）は、一意性を持つデジタルアセットを表すトークンです。NFTゲームは、このNFTを使って、プレイヤーが所有し、トレードすることができるゲームのことを指します。

NFTゲームは、ブロックチェーン技術を使って、アイテムやアバターなどのデジタルアセットを所有し、トレードすることができます。これにより、プレイヤーは、ゲーム内で所有しているアイテムやアバターを、他のプレイヤーと取引することができます。

NFTゲームには、サンドボックス型のゲーム、カードゲーム、RPGなど様々なタイプがあります。

ただし、NFTゲームはまだ新しい分野であり、普及が進んでいるため、今後の動向については不透明です。

## NFTゲームの開発方法
NFTゲームの開発には、以下のようなステップが必要です。

1. ゲームのコンセプトやビジョンを定義する: ゲームの世界観や目的、ターゲットプレイヤーなどを明確に定義する。
1. ゲームエンジンの選択: UnityやUnreal Engineなどのゲームエンジンを使って、ゲームを開発する。
1. スマートコントラクトの開発: Ethereumなどのブロックチェーンプラットフォーム上で、スマートコントラクトを開発する。スマートコントラクトは、NFTトークンを生成し、管理するために必要です。
1. ゲームのデザインとアセットの作成: ゲームのグラフィックやサウンド、アイテムやアバターなどのアセットを作成する。
1. ゲームのプログラミング: ゲームのシステムやメカニクス、UIなどを開発する。
1. ゲームのテストとデバッグ: ゲームをテストし、バグを修正する。
1. リリース: ゲームをリリースする。

### スマートコントラクトの開発

スマートコントラクトの開発には、以下のようなステップが必要です。

1. スマートコントラクトの要件定義: スマートコントラクトが実現するビジネスロジックや機能を明確に定義する。
1. スマートコントラクトの設計: スマートコントラクトのアーキテクチャやデータ構造、インターフェースなどを設計する。
1. スマートコントラクトのコーディング: Solidityなどのスマートコントラクト向けのプログラミング言語を使って、スマートコントラクトをコーディングする。
1. スマートコントラクトのテスト: スマートコントラクトをテストすることで、正しく機能しているかを確認する。
1. スマートコントラクトのデプロイ: スマートコントラクトをブロックチェーン上にデプロイする。
1. スマートコントラクトの管理: スマートコントラクトを運用し、アップグレードや修正が必要な場合は、適切に対応する。

環境構築は以下のリンクでまとめました。

https://qiita.com/nekoharuyuki/items/b00754ee638ec3418668

#### web3の認証を実装する方法

Web3の認証を実装するには、以下の手順が必要です。

1. Web3 APIのセットアップ：Web3.jsなどのWeb3 APIを使用して、Ethereumブロックチェーンと通信するためのインターフェースをセットアップします。
1. エクスペリエンスの定義：Web3認証のユーザーエクスペリエンスを定義する必要があります。これは、Web3認証のインターフェースとアプリケーションの使用方法を定義することを意味します。
1. Ethereumアカウントの作成：Ethereumブロックチェーン上にユーザーアカウントを作成する必要があります。これは、Ethereumトランザクションを送信するために必要なものです。
1. ユーザー認証：Web3 APIを使用して、ユーザー認証を実装する必要があります。これには、EthereumアカウントとEthereumアドレスを使用することが含まれます。
1. 認証の保存：Web3認証によって取得された情報を永続化する必要があります。これには、データベースなどの保存手段が含まれます。

#### Web3 ウォレットを実装する方法

1. Web3 フレームワークの選択: Web3 ウォレットを実装するためには、Web3 フレームワークが必要です。例えば、Truffle、Embark、DappHub などがあります。
1. スマートコントラクトの開発: ウォレットと連携するスマートコントラクトを開発する必要があります。このスマートコントラクトは、ウォレットに対するトランザクションの取引履歴を管理する役割を持ちます。
1. ウォレットのインターフェイスの開発: ウォレットのインターフェイスを開発し、ユーザーがトランザクションを送信したり、バランスを確認したりできるようにする必要があります。
1. ウォレットのテスト: ウォレットが正常に動作するか、正しいトランザクション履歴が保存されているかをテストする必要があります。
1. ウォレットのデプロイ: 最後に、ウォレットを適切なブロックチェーンネットワーク上にデプロイして利用可能にする必要があります。

これらの手順を適切に実施することで、Web3 ウォレットを実装することができます。

#### Web3の認証とウォレットを簡単に実装する代替手段
Web3の認証とウォレットが必要なことがわかったので、最も評判の良い2つのオプション　MetaMask 、 WalletConnect について、詳しく見てみましょう。これらの各オプションは、確かなユーザー エクスペリエンスを提供します。MetaMask と WalletConnect の組み合わせは、ネイティブの暗号化ユーザーにとって完璧な体験です。MetaMask は間違いなく Web ユーザーにとって最高のツールであり、WalletConnect はモバイル ユーザーにとって頼りになるツールです。

# まとめ
今回は、個人でNFTゲームを開発する為に何が必要なのか、準備しなくてはならない項目についてまとめました。
別の記事で、web3の認証やウォレットを簡単に実装する為に、Unity と Moralis Metaverse SDK を試したのでまとめようと思います。
効率よく学習する方法

わたしは2023/1から[HappinessChain](https://happiness-chain.vercel.app/)というスクールに加入し、プログラミング学習を開始しました。
現在加入から１月ほどたちますが日々学習を進めていく中で気づいた学習のコツについて、記事をまとめました。
# 学習をするうえで重要なコト
**アウトプット**
当たり前すぎる話だとは思いますが、学習を進める中で、とにもかくにもアウトプットをすることが重要だと感じています。
# アウトプットがなぜ重要か
インプットだけでは何が身についているのか確認ができません。
そのため、身についた気になって全く身についていないという状態になります。
よくある例としては、書籍等を読んで身についた気になるが実際にやろうとするとできない。  
しかし、アウトプットを行うことでインプットした中で何が身についていないかの確認ができ、習熟度もあがります。  
# 効率よくアウトプットするためのコツ
「インプット→アウトプット→インプット...」と繰り返し学習をしていくと思いますが、
アウトプットまでのインプット量を多すぎないことが重要だと考えています。
# インプット量が多すぎることによる問題点
* 何が身についたのかわからないまま時間が過ぎていく
* アウトプットするときには期間が空きすぎてほぼ忘れている
* （個人的にですが）飽きる・楽しくない
# 最後に
わたし自身もこれを教訓にインプットを行ったら、こまめなアウトプットを心がけていきたいと思います。
PyTorchを参考書だけで勉強する

Qiita投稿練習のために良い題材がないか探していたところ，最近読んで良かった参考書があったので紹介させていただきます．

# 動機

大学の卒業研究のなかでPyTorchのコードを読む必要が生じた．

# PyTorchとは

> PyTorchとは、Pythonのオープンソース機械学習ライブラリ(Deep Learningライブラリ)です。

> PyTorchで「パイトーチ」と読み、2016年1月15日、Facebookの人工知能研究グループにより初期開発されました。初版が公開された2016年から徐々に注目を集め、現在ではPythonの機械学習ライブラリとして高い人気を誇ります。

# 参考書

今回はこちらの参考書を使いました．
[最短コースでわかる PyTorch &深層学習プログラミング](https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E3%82%B3%E3%83%BC%E3%82%B9%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-PyTorch-%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E8%B5%A4%E7%9F%B3-%E9%9B%85%E5%85%B8/dp/4296110322/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=204IRD9OWSO7D&keywords=PyTorch+%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92&qid=1676190298&s=books&sprefix=PyTorch+%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%2Cstripbooks%2C189&sr=1-1, "最短コースでわかる PyTorch &深層学習プログラミング ")
<div style="text-align: center">
  <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3134179/e0d35f91-5864-151b-1936-f3afc92184fe.jpeg" >
</div>

定価4070円．ページ数は567pあります．
しかしこのページ数にもかかわらず，かなりサクサク読み進めることができます．お値段も，この情報量を大学の講義で学ぶとなると半年はかかると思うので，コスパとしては十分良いと思います．

# 本書籍を読んだ感想

早速ですが，本書籍を読んだ所感は以下の通りです．

+ Pythonの知識があれば1ヶ月かからず読める．
+ 数式が少なく，数学が苦手でも取り組みやすい．
+ 複雑なPyTorchのコードが理解できるようになる．
+ 基礎的なCNNの構築ができるようになる．
+ **PyTorchの導入本としてかなり良い！**

主に画像処理をメインとしており，前半は機械学習によるクラス分類，後半はCNNによる画像のクラス分類を取り扱っています．

# 読む前の私の学習状況

+ Pythonのコードはある程度読める
+ 深層学習についての知識が申し訳程度にある
+ 基礎的な線形代数，微積分の知識がある

PyTorchを勉強する下地はある程度ありましたが，これらの知識を持っていたことによる利点は**読み進めるスピードが速まったくらい**です．

本書籍には，（付録として）numpyやmatplotlibだけでなくprint関数の使い方から記載されているので，pythonの知識がない方でも読むことができる本となっています．

# 特徴
本書籍の特徴には以下のようものが挙げられます．

**1\. 図解が多い**
**2\. 自分で多層ニューラルネットワークを構築できるようになる**
**3\. 比較的新しい**
**4\. 初心者向け**

### 1\.図解が多い
本書籍の最大の特徴といえるのが，**図やコードが豊富**であることです．
本書籍では，アヤメの分類や，MNISTの手書き数字の分類など，有名なデータセットを使いながら，すべてのコードを順序通りに解説してくれるのでとにかく分かりやすいです．

また，これらのコードは著者のgithubからダウンロードすることで，Google Colab(ブラウザでPythonを実行できる環境)で実行できるため，参考書を片手に実行することでより深くコードを理解できます．

なお，本書籍の後半ではGPUが必須となるため，GPUを持っていない方はColabにて実行する必要があります（私もColabでコードを実行しましたが，特に問題なく動かせました）．

### 2\.自分でネットワークを構築できるようになる 

本書籍ではコードの解説が丁寧に添えてあるので，ニューラルネットワークの構築を簡単に行うことができます．それも全結合層や畳み込み層，プーリング層といった基本構造だけでなく，ドロップアウトやバッチ正規化のようなチューニング技法も学ぶことができ，より本格的なネットワークを作成することができます．

また，終盤では事前学習済みモデルに対してfine-tuningや転移学習を行う方法についても紹介されており，かなり実用性もあると思います．


### 3\.比較的新しい

これはプログラミングの参考書あるあるなのですが，参考書の執筆された年が古いと，**自分の環境で動作しない**ということがあります．
参考書に記載されているコードが実行できないと，勉強をやめる理由ができてしまい挫折の原因となります．

この本の第一刷が発行されたのは2021年9月です．

時の流れが速いプログラミング界隈においてこれが新しいか古いかは微妙なところですが，少なくとも2023年2月時点で私が実行したときは滞りなく動作しました．

また，本書籍の著者は，本書籍の解説や補足情報をご自身の[Qiita](https://qiita.com/makaishi2/items/2c40fe43c01b35acb8c4)で随時更新しているので，急に実行できなくなるという心配はないと思います．

### 4\.初心者向け

本書籍の難易度は，プログラミング言語の学習というジャンルにおいてはかなり易しく，567pという~~ポケモンの攻略本くらいの~~分厚さにもかかわらず，一日１～２時間程度の勉強で，１ヶ月かからず読了することができました．

そのため機械学習についての知識がない方でも，モチベーションを保ったまま読み進めることができると思います．

一方，ニューラルネットワークとはなんなのかといった本質的なことを深掘りした本ではないため，本質的な理解というよりは，
+ コードが読める
+ 基礎的なネットワークを自分で設計し，実行できる

ということがメインの参考書となります．

# まとめ

本書籍は深層学習をしっかり学ぶというよりは，PyTorchで動かすことをメインにした書籍です．

それゆえにストレスなく学習を進めることができ，参考書に苦手意識がある方にもオススメできる一冊です．

以上，PyTorchを参考書だけで学習した話でした．内容や表記法について良くない点があればご教授してもらえると嬉しいです．
Raspberry PiにAnthias(Screenly)をインストールしてみた


# はじめに
はじめまして。
投稿練習も兼ねて、ラズパイ（Raspberry Pi 3 Model B）にAnthias(Screenly OSE)をインストールしてデジタルサイネージ環境を構築したときのメモとして書きます。

# Anthias（Screenly OSE）について
・Screenly OSEがAnthiasに名称変更された
(https://www.screenly.io/blog/2022/12/06/screenly-ose-now-called-anthias/)
・Raspberry Pi Imager(v1.7.3)からもインストールが可能になった
(https://www.screenly.io/blog/2022/12/13/anthias-and-screenly-now-in-rpi-imager/)

## インストール方法
https://github.com/Screenly/Anthias によると、インストール方法がいくつか提供されている
（１）Raspbery Pi ImagerでAnthiasをインストール
（２）Balena Hub（ビルド済のディスクイメージ）を使ってインストール
（３）Raspberry Pi Imager（ビルド済のディスクイメージ）を使ってインストール
（４）Raspberry Pi Imager（Raspberry Pi OS Lite）をインストール後にAnthiasをインストール

# 結果

### （１）Raspbery ImagerでAnthiasをインストール
・Raspberry Pi Imager(v1.7.3)を起動
・OSを選ぶ→Other specific-purpose OS→Anthias→Anthias(pi3)を選択してインストール
[インストール結果]
・コンテンツのアップロード可能
・CUIモードへの切り替えができない（ctrl+alt+F1またはF2）
・SSH接続の設定は可能(https://docs.balena.io/learn/manage/ssh-access/)
・縦型モニタ用の設定方法がわからなかったので横表示のみ可能
  ※Balena OSベースで構築されているようで、詳細がわからなかった

### （２）belnaEtcherを使ってインストール
https://hub.balena.io/fleets からインストール
screenly-ose-pi3を選択
[インストール結果]
・（１）と同じく、CUIモードにできないのと、モニタの設定が不明
※OSはBalena OSがベース

### （３）Raspberry Pi Imagerを使ってインストール
https://github.com/Screenly/Anthias/releases/tag/v0.18.5
から、2022-12-12-raspberrypi3.zipをダウンロードし解凍（raspberrypi3.img）。
Raspberry Pi Imager(v1.7.3)を起動
OSを選ぶ→カスタムイメージを使う→Anthias→Anthias(pi3)を選択してインストール
[インストール結果]
・（１）と同じく、CUIモードにできないのと、モニタの設定が不明
※OSはBalena OSがベース

### （４）Raspberry ImagerでOS(LITE)をインストールしてからAnthiasをインストール
Raspberry Pi Imager(v1.7.3)を起動
OSを選ぶ→Raspberry Pi OS (other)→Raspberry Pi OS Lite (32-bit)を選択してインストール
インストール後ログインして各種設定。
```bash <(curl -sL https://install-anthias.srly.io)```
を実行
[インストール結果]
・CUIモードに切り替え可
・モニタの向き設定
　/boot/raspi.config（display_rotate=で設定可能）
※OSはRapberry Pi OSがベース

# 結論
まだまだ調べてみないとわからないが、現時点で縦型設定も可能なのは、
（４）Lite OSインストール後にAnthias(Screenly)インストールする方法のみ
というかRaspberry Pi OSベースの場合のみ
UnrealEngineでMSB3073が出た時

VisualStudioなどでビルドしたときにMSB3073が出た時は

# 確認
* UnrealEditorを閉じてからビルド
* Intermediateフォルダを削除して「Generate Visual Studio project files」
  * slnファイルをVisualStudioで開いてからリビルド
* code -1　の場合
    * ディスクの容量がいっぱいか確認

以下、そのほかのパターンは以下…

# UE5.3→5.4にアップデート時に発生時に試したこと
code 6

5.3に一度戻してから

DefaultBuildSettingsを最新に変更
```
public FPSGameEditorTarget(TargetInfo Target) : base(Target)
{
    Type = TargetType.Editor;
    
    //DefaultBuildSettings = BuildSettingsVersion.V2;
    // から↓に変更
    DefaultBuildSettings = BuildSettingsVersion.Latest;

    
    ExtraModuleNames.Add("FPSGame");
    // シェアード ビルド環境に対する違反を無視するかどうかを設定します (定義を修正するエディタ ターゲットなど)
    //bOverrideBuildEnvironment = true;
}
```

# Pluginの更新
まだ、バージョンアップしていないものはEngine側からProject側に移動してビルドが通るようにする

Intermediate、DerivedDataCache、Savedフォルダを削除
slnファイルを削除
Generate Visual Studio project filesで新しく作成

クリーンしてからビルドで解消


# Gitのパスでのエラー
Unhandled exception. System.ArgumentException: Path fragment '"Python/\346\226\260\350\246\217 \343\203\206\343\202\255\343\202\271\343\203\210
…
…
11>Microsoft.MakeFile.Targets(44,5): Error MSB3073 : コマンド "D:\ue\download_engine\UE_5.4\Engine\Build\BatchFiles\Build.bat FPSGameEditor Win64 Development -Project="D:\ue\YGameFPS\FPSGame\FPSGame.uproject" -WaitMutex -FromMsBuild -architecture=x64" はコード -532462766 で終了しました。

https://qiita.com/mechamogera/items/dd56b2a8fcbebee30d04
ここを参考に
コマンドプロンプトで「git config --global core.quotepath false」を実行で解消

git上に\346\226\260\350\246\217 \343\203\206\343\202\255\343\202\271\343\203\210
が追加状態で存在していたのでもしかしたらそれをgit上で処理するのでも大丈夫かも？
（フォルダ上ではこのファイルは存在してませんでした。

\346\226\260\350\246\217 \343\203\206\343\202\255\343\202\271\343\203\210
ちなみにこれはChatgptに聞いたら「新規 テキスト ドキュメント.txt」でした。

# このコード-1073741819が出ているとき
AutomationTool exiting with ExitCode=-1073741819 (-1073741819)

-1073741819→ERROR_ACCESS_DENIEDとのこと。

VisualStudioからリビルドを行う
環境を新しく構築したときの初めの実行で起きたのではまってしまった

→読み取り専用のフラグをはずす（エンジン、Projectともに

VisualStudioInstallerから下記も確認。

.NET 6.0 ランタイム（長期サポート）
MSVC v143 – VS 2022 C++ x64/x86 ビルドツール (v14.38-17.8)　←UE5.4用
MSVC v143 – VS 2022 C++ x64/x86 ビルドツール (v14.36-17.6)　←UE5.3用
MSVC v143 – VS 2022 C++ x64/x86 ビルドツール (v14.34-17.4)　←UE5.2用

https://ue5study.com/how/ue5-4-packaging-visual-studio-settings/

Fatal error. Internal CLR error. (0x80131506)