OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニア転職１年で本当に使ったgitコマンド

# はじめに
エンジニアに転職して1年経った今、これからGitを使い始めたいという方向けに改めて「Gitとは何か」「どんなコマンドを使うのか」をまとめたいと思います。
こちらの記事ではコマンドをまとめるだけですので、SSH接続される方はキーの設定はすでに済んでいるものとしております。設定方法については[GitHub公式](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)を参照してください。

# GitとGitHub
混同しがちですが、それぞれ以下の用途で利用します。
**Git**…バージョン管理システム。バックアップなどを手動で取る必要なく、過去のコードをいつでも遡れます。
**GitHub**…プロジェクト管理ツール。バージョン管理したソースコードをWeb上で自分を含めた一人以上のメンバーによって管理できます。共同開発をしたり、課題管理をしたり、コードレビューをしたりと、プロジェクトの管理全般を行います。

今回はGitで本当に実務で使ったコマンドたちを紹介していきたいと思います。

# ★★★ これがなきゃ始まらない！絶対使うコマンド
```
// Git管理を始める
git init

// GitHub上のリポジトリと紐つける
git remote add origin {リポジトリパス}

// リモートに存在するプロジェクトをローカルにクローンする
git clone {リポジトリパス}

// ブランチを切り替える
// 新しくブランチを作りたい場合は-bをつけることで作成＆切り替えが同時に可能
// 直接コミットIDを指定することで指定のコミットIDに移動することも可能
git checkout (-b) {ブランチ名} 
git checkout {コミットID}

// Git管理したいファイルをステージングする
git add {ファイルパス}

// ステージング前の変更を取り消す
git restore {ファイルパス}

// ステージングを取り消す
git restore --staged {ファイルパス}

// ステージングした変更を確定する
git commit -m "コミットメッセージ"

// 特定のコミットまで戻す
// コミットIDの部分に HEAD^ と指定すると直前のコミットを取り消すことができる
// オプションなしの場合はステージングも取り消す
// --softでステージングはしたままにする
// --hardで変更したコードそのものを取り消す
git reset (--soft/--hard) {戻したい時点のコミットID}
git reset (--soft/--hard) HEAD^

// リモートにGit管理しているソースコードを反映させる
// -uをつけることで今後このブランチをpull/pushするときには[origin {ブランチ名}]を指定しなくてよくなる
git push （-u) origin {ブランチ名}

// リモートのプロジェクトのソースコードをローカルに反映させる
// git pushですでに-uを指定していれば[origin {ブランチ名}]は省略して良い
git pull origin {ブランチ名}

// 二つのブランチのソースコードを統合する
git merge {統合したいブランチ名}

```

# ★★☆ ここまで覚えておけば小回りがきく！便利コマンド
```
// 空コミットする
git commit --allow-empty -m "空コミット"

// 変更をコミットせずに退避する
git stash

// 退避した変更を戻す。退避先にも情報は残したままにする
git stash apply {スタッシュ名}

// 退避した情報を削除する
git stash drop {スタッシュ名}

// 退避した変更を戻す。退避先の情報は削除する
git stash pop {スタッシュ名}

// スタッシュ名一覧
git stash list

// コミットを打ち消す
git revert {コミットID}

// 特定のコミットを別のブランチにコピーする
git cherry-pick {コミットID}

// コミットの履歴を見る
// --onelineでコミットIDとコミットメッセージのみを表示する
// -nで表示する行数を指定できる
git log (--oneline -n{表示したい行数})

// 指定したブランチへ共通のコミット以降を付け替える
git rebase {ブランチ名}

```

# ★☆☆ あまり使うことはないけど知っておいて損はない/プロジェクトによっては使うコマンド
```
// コミットした変更の中身を見る
git show {コミットID}

// 派生元のブランチを付け替える
git rebase --onto {付け替え先のブランチ名} {派生元のブランチ名} {付け替えたいブランチ名}

// Gitオブジェクトの中身を見る
git cat-file -p {オブジェクトのハッシュ}

// サブモジュール追加
git submodule add {リポジトリパス}

// サブモジュールの繋ぎ先変更
git submodule set-url {サブモジュール名} {リポジトリパス}

// ファイル削除
// サブモジュールディレクトリごとサブモジュールを削除するのにも使える
git rm -f {ファイルパス}

// 追跡対象から外す
git rm --cached {ファイルパス} 
```

# 終わりに
今ざっと思いつくのはこれくらいでしょうか。。
思い出したらまた追記します！
OpenLiteSpeed + NEXT.js v12 でのWebSocketエラー解消

## はじめに

他社で開発を依頼したプログラムの移植作業で直面したエラーです。開発中はプロキシを使っていなかったものと思われますが、本番環境で動作させるときにリバースプロキシを設定してエラーが発生しました。 `Next.js v12+` で発生するみたいです。解消法を備忘録も兼ねて書き留めます。

## 環境

- OpenLiteSpeed でリバースプロキシを使って Next.js (localhost:3000) に接続
- Next.js v12+

## 症状と対処法

### 症状

以下のようなエラーが出続ける...

```
WebSocket connection to 'ws://<DOMAIN_NAME>/_next/webpack-hmr' failed
```

### 対処法

OpenLiteSpeed の管理画面から Virtual Host → Web Socket Proxy で、 Web Socket Definition を以下のように追加するだけです。（ドメインは適宜書き換えてください）

![スクリーンショット 2023-05-04 17.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113613/360c6e69-d8eb-df2a-7bbb-8bc1c0320e7f.png)

もしCyberPanelや設定ファイルで設定するとき、 `vhconf.conf` の記述は以下の通りになります。

```
websocket /_next/webpack-hmr {
  address                 localhost:3000
}
```

##### Apache/Nginx の場合（参考）

ちなみに Apache や Nginx だとリダイレクトさせて対応すると解消するようです

https://qiita.com/sashisusesouyu/items/4351dc5080cf2b9eeea0
【Python初学者】jsonに存在するURLから画像を一括保存し、パスをローカルに書き換える

※当記事は[プログラミング初学者がPythonスクレイピングをやってみた](https://qiita.com/ito_futa/items/7dc0bb0955b326efd816)の続きを想定しています。

## 概要
前回の記事で指定したサイトからスクレイピングするところまでは出来ましたが、
画像がローカルにある訳ではなく、スクレイピング先のサイトURLになっているので、
使い勝手に欠けたり、そのまま使うと相手サイトに迷惑がかかる点がございます
（下記の"photo"）。

```json:result.json
    {
        "name": "がっつり味噌らーめん",
        "description": "めちゃくちゃ美味い",
        "price": "850円",
        "photo": "https://hogehoge/ramen1.png",
        "shop_name": "ラーメン屋の名前を一括挿入"
    }
```

そのため、Pythonを用いてjsonに保存されているURLから画像をローカルに一括保存します。
また、ついでに画像のパスを保存したローカルのものへと変更いたします。

## 実際のPythonコード

result.jsonが同フォルダで存在するディレクトリにて、下記.pyを実行します。

```Python:get_and_replace_image.py

## モジュールをインポート
import os
import requests
import json

# 画像を保存するためのフォルダ"photo"が存在しなければ、新規作成
if not os.path.exists('./photo'):
    os.mkdir('./photo')

# 対象のjsonファイル"result.json"を読み込みモードで開く
with open('result.json', 'r') as f:
    data = json.load(f)

# forループでurl変数にjsonのリストから"photo"に存在するURLをすべて割り当てる
for i in range(len(data)):
    url = data[i]['photo']
    if url is not None:
        response = requests.get(url)

        # 「photo_"番号"」という名前でjpgファイルを保存
        with open(f'./photo/photo_{i}.jpg', 'wb') as f:
            f.write(response.content)

        # jsonに存在する"phpto"の画像URLをローカルのパスに差し替え
        data[i]['photo'] = f'./photo/photo_{i}.jpg'

# json.dump()関数を使用してjsonファイルを上書き保存
with open('result.json', 'w') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)
```

これにより、"photo"フォルダが作成され、画像が保存されるとともに、
result.jsonの"photo"カラムのURLがローカルへと変更されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/4a393c3d-8bc9-55d1-c83c-71ca7b90cc8d.png)

## 後書き
元々、収集したjsonファイルをwebサイトでデータ表示を考えておりましたが、
その前にこの処理を挟むことで、不必要にスクレイピング先に何度も負担を与えずに済みそうです。

スクレイピングをする時はこのような処理を必須として行っていきたいと思います。
また、より負担を軽減するために、画像を1度取得した場合は、2回目以降スルーすることなども考えて参ります。
急に英語になったVScode

# アップデート後、なぜか英語に
- 直前に行ったアップデートが原因と思われる
- 日本語化プラグインは入っている

# やったこと
- VScodeの再起動（効果なし）
- 日本語化プラグインの入れ直し（効果なし）

# 解決方法
1. `Ctrl + Shift + P`を押す
1. `Configure Display Language`と入力
1. 言語の一覧から「日本語」を選択
1. VScodeを再起動

:::note warn
日本語化プラグインの入れ方
サイドメニューから「Extensions」を開き、「Japanese Language Pack」をインストール
:::
python初心者がダンジョンゲーム作成してみる

# 【１日目】python初心者がダンジョンゲーム作成してみる

## Day 0: ダンジョンゲームとは？
ダンジョンゲームは、迷宮やダンジョンと呼ばれる地下迷宮内を探索して、アイテムや宝物を集め、モンスターと戦って進み、最終的に目的地に到達するというゲームです。

主にファンタジー世界を舞台にしたRPGの一ジャンルとして位置づけられています。プレイヤーは自分のキャラクターを操作し、さまざまな罠や障害、敵キャラクターなどを乗り越えながら、ダンジョン内を探索していきます。ダンジョン内には、ボスモンスターや隠しアイテム、仕掛けなどが存在し、探索の過程でそれらを見つけ出すことが目的となります。

## Day 0: ダンジョンゲームの最低限要素
以下はダンジョンゲームの最低限の要素
短い期間なので、最低限の要素で作成する！

- プレイヤー: プレイヤーが操作するキャラクター
- レベル: プレイヤーが進むためのステージ、部屋、通路などの環境
- 敵: プレイヤーが遭遇する敵キャラクター
- アイテム: プレイヤーが収集することができるアイテム、武器、装備など
- 衝突検出: プレイヤーや敵との衝突を検出するための仕組み
- カメラ: レベル内でのプレイヤーの視点を制御するための仕組み
- UI: プレイヤーの情報やゲーム内の状態を表示するためのユーザーインターフェース

これらの要素を組み合わせて、ダンジョンゲームを作る

## Day 0: 計画を立てる

### Day 1: Pygameの基本を学ぶ

- Pygameのインストール: 
 最新のPygameをインストールする。公式サイト(https://www.pygame.org/news) から最新版をダウンロードすることができます。

- Pygameの基本機能の学習: 
 Pygameの基本的な機能を学習し、Pygameを使って2Dゲームを作るための基礎を身につけます。

- ウィンドウの作成: 
 Pygameでウィンドウを作成し、画面を描画する方法を学びます。

### Day 2: ゲームオブジェクトを作成する

- プレイヤーの作成: 
 Pygameでプレイヤーを作成し、キーボードの入力を受け付ける方法を学びます。

- 敵の作成: 
 敵を作成し、プレイヤーとの衝突を検出する方法を学びます。

- アイテムの作成: 
アイテムを作成し、プレイヤーがそれらを収集する方法を学びます。

### Day 3: 衝突検出とアニメーション

- 衝突検出の実装: 
Pygameで衝突検出を実装し、プレイヤーと敵、プレイヤーとアイテムの衝突を検出する方法を学びます。

- アニメーションの実装: 
Pygameでアニメーションを実装し、キャラクターやアイテムのアニメーションを表示する方法を学びます。

### Day 4: レベルの生成

- レベル生成アルゴリズムの学習: 
ランダムダンジョン生成など、レベル生成アルゴリズムを学習します。

- ダンジョンの生成: 
アルゴリズムを使ってダンジョンを生成し、プレイヤーが移動できるようにします。

### Day 5: レベルの描画

- レベルデータを使用してダンジョンを描画: 
生成されたダンジョンデータをもとに、Pygameを使用してダンジョンを描画します。

- カメラの実装: 
レベルの移動を可能にするため、カメラを実装します。

### Day 6: メニューとUI

- メインメニューの作成: 
メインメニュー画面を作成し、プレイヤーがゲームを開始する方法を提供します。

- スコアの表示: 
スコアを表示するUIを作成します。

- ライフの表示: 
プレイヤーのライフを表示するUIを作成します。

- ダイアログの表示: 
ゲーム中に必要な情報を表示するためのダイアログを作成します。

### Day 7: ゲームの調整と最終テスト

- ゲームバランスの調整: 
ゲームバランスを調整し、プレイヤーが楽しくプレイできるようにします。

- 最終テスト: 
ゲームを最終テストし、バグの修正や調整を行います。

## 参考サイト

1. [RogueBasin](https://roguebasin-com.translate.goog/index.php/Main_Page?_x_tr_sch=http&_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc)
ローグライクゲームに関する情報が豊富に掲載されているサイトで、ダンジョンゲームについても解説されています。

2. [TutsPlus](https://tutsplus.com/tutorials/search/dungeon-crawler)
ゲーム開発に関するチュートリアルが豊富に掲載されているサイトで、ダンジョンゲームの開発方法についても解説されています。

3. [Pygame公式ドキュメント](https://www.pygame.org/docs/)
Pygameを利用したゲーム開発に関する情報が掲載されているサイトで、ダンジョンゲームの開発にも役立つ情報があります。

4. [Redditのroguelikedevサブレディット](https://www.reddit.com/r/roguelikedev/)
ローグライクゲームやダンジョンゲームの開発についての情報共有やアドバイスを受けることができるコミュニティサイトです。

これらのサイトを参考に、ダンジョンゲームの開発を進めていこうかな(;^ω^)

英語の勉強も併せてやりたいところ…
Javaのオブジェクト指向（クラスとインスタンス）

# はじめに

研修でオブジェクト指向を学んだのでまとめます
長いので何個かにわけます！
間違いがあれば教えてください！

参考図書は 
https://sukkiri.jp/books/sukkiri_javap3
です

### オブジェクト指向

オブジェクト指向とはソフトウェア開発の部品化の考え方

継承・多態性・カプセル化をオブジェクト指向の3大機能と呼ぶ

### インスタンスとクラス

オブジェクト指向はまず最初にクラスを作る

クラスは金型のようなもので設計基盤

クラスを基にオブジェクト（インスタンス）を作成

##### クラス

``` Car.java
public class Car {
    String name; //車の名前
    int oil;     //ガソリンの量
}
```

簡易的なクラスです
クラスに定義されているnameやoilのような変数をフィールドと言います。
ここからインスタンスを生み出します

    クラス名　変数名 = new クラス名();

``` Main.java
public class Main {
    public static void main(String[] args) {
        
        Car c1 = new Car();
        Car c2 = new Car();
    }
}
```
Carクラスを基に2つのインスタンスを生み出しました

##### フィールドへの代入

フィールドへ代入するのは以下です

    インスタンス名.フィールド名 = 代入するもの

``` Main.java
public class Main {
    public static void main(String[] args) {
        
        Car c1 = new Car();
        Car c2 = new Car();

        c1.name = "honda";
        c1.oil = 100;
        System.out.println(c1.name);
    }
}
```

##### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243082/413fe411-1871-c0d0-faa4-ffc6f7924960.png)






##### メソッドの定義
このままのCarクラスでは何もできないのでメソッドを定義します

``` Car.java
public class Car {
    ...(省略)

    public void run(){
        System.out.println("run");
    }
}
```

```Main.java
public class Main {
    public static void main(String[] args) {
        
        Car c1 = new Car();
        Car c2 = new Car();

        c1.run();
    }
}
```

実行するとターミナルに run という文字が出ます（日本語だと文字化けの可能性があります）

##### コンストラクタ
インスタンスを生み出す際に自動的に実行されるものがコンストラクタです

    public クラス名(引数){}

で宣言できます。

引数によって複数のコンストラクタを定義できます
コンストラクタのオーバーロードです

```Car.java
public class Car {
    String name; //車の名前
    int oil;     //ガソリンの量

    public Car(){
        System.out.println("Create Car");
    }

    public Car(String name){
        System.out.println(name + ": Create Car");
        this.name = name;
    }
}
```

thisはそのインスタンス自信を指します。



```Main.java
public class Main {
    public static void main(String[] args) {
        
        Car c1 = new Car();
        Car c2 = new Car("nissan");
    }
}
```
##### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243082/c0d57007-45d6-b37b-b8d7-cc21b7c00d1c.png)

それぞれのコンストラクタが実行されているのがわかります

### おわりに
ざっくり書いたので書き漏らしているところが多々あります
つぎは継承についてまとめます
【お手軽】そのURLが安全かどうか確認する3つの方法

**はじめに**

インターネットは、情報を共有し、コミュニケーションを行うなど便利なツールですが、同時にウイルスやフィッシング詐欺、悪意のあるコンテンツが潜んでいることもあります。安全なウェブ閲覧のためには、クリックする前にURLが安全かどうかを確認することが重要です。この記事では、URLが安全かどうか簡単に試す3つの方法を紹介します。

<INS>※追記（2023/05/06）※</INS>
上記の方法をお試しいただいたとしても、URLだけでそのサイトが完全に安全かどうか確かめるのは難しそうです。そのため、この記事の内容はあくまで一つの手段としてご活用ください。

**方法1: ウイルス対策ソフトウェアを利用する**

ウイルス対策ソフトウェアは、不正なURLや危険なコンテンツを検出する機能を持っています。ウイルス対策ソフトウェアをインストールし、定期的に更新することで、安全なウェブ閲覧をサポートしてくれます。多くのウイルス対策ソフトウェアは、リンクをクリックする前に自動的にURLをスキャンし、安全性を判断してくれます。

**方法2: URLをオンラインでチェックする**

インターネット上には、URLの安全性をチェックできる無料のオンラインツールがいくつかあります。以下のウェブサイトは、URLを入力するだけで安全性を判断してくれるため、使いやすいです。

VirusTotal (https://www.virustotal.com/)
Google Safe Browsing (https://transparencyreport.google.com/safe-browsing/search)
Norton Safe Web (https://safeweb.norton.com/)
これらのツールを利用することで、クリックする前にURLの安全性を簡単に確認できます。

**方法3: URLの構造を確認する**

URLが安全かどうかを判断するためには、URLの構造にも注意が必要です。以下のポイントに注意して、URLを確認しましょう。

HTTPS: セキュアなウェブサイトは、「https://」で始まることが一般的です。HTTPよりも安全なプロトコルであるため、URLがHTTPSで始まるかどうかを確認しましょう。

ドメイン名: 不正なウェブサイトは、正規のウェブサイトに似たドメイン名を使用することがあります。ドメイン名が怪しい場合は、URLをクリックしないでください。
EC2,RDSだけなのに、ALB使い出したらすんごい重くなった・・・

# 前提と状況の説明
EC2を建てて、RDSに接続できている状態です。（今回RDSはあんま関係ないです）
この時点で、IPアドレスで検索すればアプリケーションが表示されていました。

ここで、ALBを設置して、ALB経由でEC2へアクセスするように試みました。
（パスでターゲットグループへ振り分けをしようとしたのですが、ここではあまり関係ないので割愛）

すると・・・・

ん？
たま〜に、表示されない・・・訳ではないけど、表示されるまでにめちゃくちゃ時間がかかるぞ・・・

## 結論：原因は何だったのか
ALBを配置する時に指定するサブネットに、`private subnetが含まれていた`ことでした。

ALBを配置する際は2つ以上の異なるアベイラビリティゾーンからサブネットを指定する必要があります。ここで指定するサブネットは基本的にはpublic subnetです！（多分）

ここに気付くのにそこそこ時間がかかりました汗

### 格闘の記録
- ALBのリスナールールが異なる？
- アプリケーションに問題ある？

って思ったけど、”アプリケーションが表示される時もある”ので、この辺ではないはず。。。

ALBを設置してから発生したので、やはりALBが怪しい！！と思って
- セキュリティグループ
- AZ（とサブネット） 
- ~~ACM~~

あたりをみてました。

# おわりに
ALBを設置するというたったそれだけのことでハマってしまいました・・・
聞けばこの現象を「（ALBの）ゆらぎ」と弊社では言うらしい・・・（確かにそれっぽい命名ｗ）

ということは他の人もそこそこハマっている気がするので、この記事が誰かの役に立てれたら嬉しいです。
WSFC環境でファイルサーバの役割が失敗する（入力された環境オプションが見つかりませんでした。）

# ■発生状況
WSFCにて、ファイルサーバの役割が起動成功せず失敗する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/24da77f0-d4de-80ed-41f4-51d366ef69f0.png)

>入力された環境オプションが見つかりませんでした。詳細なデータについては、'情報の詳細'を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0268634c-b492-f0dc-749f-b6d591a5a6fb.png)

>クラスター化された役割 'cluster-fs' の種類 'Network Name' のクラスター リソース 'cluster-fs' が失敗しました。エラー コード: '0xcb' ('入力された環境オプションが見つかりませんでした。')。
>
>リソースおよび役割のエラー ポリシーに基づいて、このノードでリソースをオンラインにする処理またはグループをクラスターの別のノードに移動した後に再起動する処理がクラスター サービスによって試行される場合があります。フェールオーバー クラスター マネージャーまたは Get-ClusterResource Windows PowerShell コマンドレットを使用して、リソースおよびグループの状態を確認してください。





# ■環境
```
OS 名:                 Microsoft Windows Server 2016 Standard Evaluation
OS バージョン:          10.0.14393 N/A ビルド 14393
```

# ■対処
## 手段①　DNSサフィックスを設定する
DNSサフィックスを正しく設定する。今回は`test.local`を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/b5e47e77-41f2-4f79-75a8-e488423e35a6.png)


## 手段②　DNSサーバを準備する
DNSサフィックスに対応するゾーンを利用したDNSサーバを準備する。
DNSサーバの設定をWindowsServerに設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/862d0157-b6ae-5e1e-5fe2-8bef4e9772c5.png)

<br>
<br>
<br>

これで正常に起動するようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/c64b578b-9dfe-9956-10aa-3c4122815fb6.png)


# ■参考
**Workgroup and Multi-domain clusters in Windows Server 2016**

https://techcommunity.microsoft.com/t5/failover-clustering/workgroup-and-multi-domain-clusters-in-windows-server-2016/ba-p/372059

<br>
<br>

**Workgroup Cluster の構築手順**

https://social.technet.microsoft.com/Forums/ja-JP/1c9622ab-5c48-410c-ba33-2f7d4880d527/workgroup-cluster-?forum=Wcsupportja
systemctl status crond.serviceでUnit crond.service could not be foundと言われた件

駆け出しおじさんエンジニアです。

AmazonLinuxでcronを使おうとした際に表題の通りになってつまづいたので
自分自身の覚書として記載しておきます。

## 結論
AmazonLinuxには標準でcronがインストールされていないので、インストールしてね

ということでした。

## 手順

クラスメソッド様の**Cronがインストールされていない問題**をハンズオンして解決に至りました。

https://dev.classmethod.jp/articles/diff-al-2023-and-al-2-packages-and-services/

<br>
<br>
 
<h5>1.cronの今の状態を確認してみる</h5>

```
$ systemctl status crond.service
Unit crond.service could not be found.
```
cronがありませんよーと言われました。

<br>
<br>

<h5>2.Fedoraのドキュメントを確認してみる</h5>

https://docs.fedoraproject.org/en-US/fedora/latest/system-administrators-guide/monitoring-and-automation/Automating_System_Tasks/

cronie というパッケージで使えるようになるらしい。

<br>
<br>
<h5>3.cronieをインストールしてみる</h5>

```sh
#cronieが標準リポジトリにあるか確認
$ dnf info cronie

#cronieがインストールされているか確認
$ rpm -q cronie cronie-anacron

#cronieをインストールする
$ dnf install cronie cronie-anacron

#cronをstartして完了
$ systemctl start crond.service
```

これでいけました。
fido-vertical-modeのfind-fileで補完をせずに新規にファイルを作成する

補完パッケージを使う時にいつも困る問題として、find-fileで新規にファイルを作成したいが、Enterを押すと補完が優先されてしまうことがあります。

fido-vertical-modeの場合には`M-j`で強制的に補完を無視して、新規ファイルの作成ができました。
`icomplete-fido-exit`というコマンドが割り当てられているようです。
転移学習の初歩とソース・ドメインに関するおはなし

# はじめに
コンピュータの発展に伴い，深層学習をはじめとした多くの機械学習手法が開発されてきました．その中でも教師あり学習手法は，モデルへの入力と期待される出力の組をデータセットとして与え，学習させることでモデルに予測をさせるというものです．

では転移学習とは機械学習においてどのような働きをなすのでしょうか？
本記事では，転移学習の概念についてケンブリッジ大学出版の「転移学習」[^1]という書籍を参考にしながら解説していきます.

# たとえば
まずは以下のような状況を考えてみましょう．

「男性の声のデータセットを用いて，音声認識を行う機械学習モデルを学習させた．このモデルを実際に使ってみると，男性の声には精度良く音声認識を行えたが，女性の声にたいしての精度はあまり良くなかった．」

この原因は，学習を行ったモデルを別の新たなドメインに適用しようとしたからだ，ということができるでしょう．
なら，「女性の声が沢山用意されたデータセットを与えてモデルを調整したらいいじゃないか！」と思うかもしれません．しかし，女友達がいない，などの理由で女性の声を沢山用意することができないという状況も考えられます．

# 転移学習とは
そこで登場するのが転移学習です．
転移学習には「あるドメインから抽出した知識を用いて，別のドメインや別のターゲットに関する学習を効率化させよう」というモチベーションがあります．
先程の例でいうと，男性の声のデータセットで十分に学習させたモデルを，少数の女性の声のデータセットで再度学習させることで，男女関係なく音声認識なモデルが構築しよう，ということです．

転移学習では知識の受け渡しが行われます．男性の声のデータセットで学習を進めることで，モデルは既に「どのように特徴量を抽出すればいいだろう」「どの特徴量に注目すればいいだろう」といった知識を得ていると考えられます．この知識を再利用することで，少数の女性の声のデータセットからでも十分な精度のモデルを構築できたら嬉しいですよね．

# 転移学習の定義
## ドメインとタスクの定式化

ここからは，数式を交えながら転移学習の定義について説明していきます．これまでもドメインやタスクといった言葉が出てきましたが、それぞれ
- ドメイン：モデルの入力に関する情報
- タスク：モデルの出力に関する情報

と理解しておいてください．

一般に，ドメイン$\mathbb{D}$は特徴空間$\mathscr{X}$と周辺確率分布$\mathbb{P}^X$から成ります．このことを，$\mathbb{D}=\lbrace \mathscr{X}, \mathbb{P}^X \rbrace$と表します．
どういうことかというと，モデルへの入力データを$\mathbf{x}$とすると$\mathbf{x}\in\mathscr{X}$であり，また$\mathbf{x}$の出現確率は$\mathbb{P}^X$により決められているということです．

同様に，タスク$\mathbb{T}=\lbrace \mathscr{Y}, f() \rbrace$とします．$\mathscr{Y}$はラベル空間といい，モデル出力が属する空間になります．ラベルといっても離散値である必要はなく，連続量でも構いません．$f()$は$\mathbf{x}\in\mathscr{X}$から$y\in\mathscr{Y}$を予測する関数であり，$y$の$\mathbf{x}$に対する条件付き確率を最大化する$y$を出力にすると考えれば，$f(\mathbf{x})$の代わりに$P(y|\mathbf{x})$と書いても問題ありません．

## 転移学習の定義
ここから，ソース・ターゲットという言葉が出てきますが，それぞれ
- ソース：転移させる元
- ターゲット：転移させる先

と理解しましょう．ターゲットとタスクは言葉が似ていますので注意してください．

ここで，ソース$s$の学習済みモデルが獲得した知識を利用してターゲット$t$におけるモデルを構築する転移学習を考えます．$s$，$t$それぞれのドメインは$\mathbb{D}_s$，$\mathbb{D}_t$であると理解してください．

データセットを用意しましょう．ソース$s$のデータセットを
```math
\mathscr{D}_s = \lbrace (\mathbf{x}_{s_i}, y_{s_i}) \rbrace ^{n_s} _{i=1}
```
とかきます．ここで$n_s$はソース$s$のサンプルデータ数です．同様に，ターゲット$t$のデータセットも
```math
\mathscr{D}_t = \lbrace (\mathbf{x}_{t_i}, y_{t_i}) \rbrace ^{n_t} _{i=1}
```
と表記します．このとき，転移学習は以下のように定義できます[^1]．


>ソースドメイン$\mathbb{D}_s$とタスク$\mathbb{T}_s$，ターゲットドメイン$\mathbb{D}_t$とタスク$\mathbb{T}_t$があるとする．転移学習とはドメイン$\mathbb{D}_t$に対するターゲットの予測関数$f_t()$の学習を$\mathbb{D}_s$と$\mathbb{T}_s$を用いて改善させることである．このとき，$\mathbb{D}_s \neq \mathbb{D}_t$であるか，または$\mathbb{T}_s \neq \mathbb{T}_t$である．

もし$\mathbb{D}_s = \mathbb{D}_t$かつ$\mathbb{T}_s = \mathbb{T}_t$だと，これは転移学習でない従来の学習手法と同じになってしまいます．

## 転移学習の分類
転移学習は大きく分けて２つに分類できます[^1]．
- ホモジニアス転移学習：$\mathscr{X}_s \cap \mathscr{X}_t \neq \varnothing$かつ$\mathscr{Y}_s = \mathscr{Y}_t$
- ヘテロジニアス転移学習：$\mathscr{X}_s \cap \mathscr{X}_t=\varnothing$または$\mathscr{Y}_s \neq \mathscr{Y}_t$

数式がややこしくなってきたので解説していきましょう．

ホモジニアス転移学習は，まずラベル空間が同じです．ということは，モデルの出力が同じ物理量であるということですから，ソースとターゲットとが同じようなタスクを達成しようとしていることとなります．また，ドメイン空間の共通部分が存在するということは，モデルへの入力も似たようなものである，ということです．

対してヘテロジニアス転移学習では，ドメイン空間の共通部分が存在しないか，またはラベル空間が異なります．つまり入力データが全く異なるものであるか，または出力データが全く異なるのです．

ホモジニアス転移学習の方が難易度は低そうですね．

[^1]: Q. Yang, U. Zhang, W Dai and S. J. Pan, Transfer Learning, Cambridge University Press, 2020.  https://www.cambridge.org/core/books/transfer-learning/CCFFAFE3CDBC245047F1DEC71D9EF3C7
Dartのエラー　"Error: Not a constant expression." の解決方法

Dartのエラー "Error: Not a constant expression." が発生して、一瞬戸惑ったので、解決方法のメモです。


## 発生した状況
最初に、以下のようにListTileを追加し、
```dart
              const ListTile(
                title: Text('ログアウト'),
              ),
            ],
```
そこに「onTap」を追加すると、発生した。
```dart
              const ListTile(
                title: Text('ログアウト'),
                onTap: (){},
              ),
```

## 解決方法
ListTileにつけていた「const」を外す。
※関数を入れたことにより、定数ではなくなったため、エラーが発生したと思われる。
```dart
              ListTile(
                title: Text('ログアウト'),
                onTap: () {},
              ),
```
[AWS Q&A 365][SES]AWSのよくある問題の毎日5選 #47

# 1. アカウントレベルの抑制リストとは何ですか？
回答：アカウントレベルの抑制リストとは、Amazon SESアカウントから送信されるすべてのメールを受信しないようにするメールアドレスのリストです。これは、悪いメールアドレスにメールを送信しないようにするための強力なツールであり、メール送信者の評判を管理するために役立ちます。

# 2.アカウントレベルの抑制リストを有効にするにはどうすればよいですか？
回答：アカウントレベルの抑制リストを有効にするには、Amazon SESコンソールにアクセスし、「抑制リスト」タブをクリックし、「アカウントレベルの抑制リスト」の横にある「有効化」ボタンをクリックする必要があります。有効にすると、バウンスまたは苦情のあったメールアドレスは自動的にリストに追加されます。

# 3.個々のメールアドレスをアカウントレベルの抑制リストに追加できますか？
回答：はい、Amazon SESコンソールにアクセスし、「抑制リスト」タブをクリックし、「アカウントレベルの抑制リスト」の横にある「メールアドレスの追加」ボタンをクリックすることで、個々のメールアドレスをアカウントレベルの抑制リストに追加できます。CSVファイルをアップロードすることで、複数のメールアドレスを一括で追加することもできます。

# 4.アカウントレベルの抑制リストに登録されているメールアドレスのリストを表示するにはどうすればよいですか？
回答：アカウントレベルの抑制リストに登録されているメールアドレスのリストを表示するには、Amazon SESコンソールにアクセスし、「抑制リスト」タブをクリックし、「アカウントレベルの抑制リスト」の横にある「メールアドレスの表示」ボタンをクリックする必要があります。リストのCSVファイルをダウンロードすることもできます。

# 5.アカウントレベルの抑制リストを無効にできますか？
回答：はい、Amazon SESコンソールにアクセスし、「抑制リスト」タブをクリックし、「アカウントレベル抑制リスト」の横にある「無効化」ボタンをクリックすることで、アカウントレベルの抑制リストを無効にできます。ただし、良好な送信者の評判を維持するために、リストを有効にしておくことを推奨します。
WSFC環境でファイルサーバの共有にてエラー「WinRM は要求を処理できません。(エラー コード 0x8009030e)」が発生する

# ■発生状況
WSFCのクラスター上に作成したファイルサーバーの役割について、`ファイル共有の追加`を行うと以下エラーが発生する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/604b4aeb-3817-a9ce-fa85-792a1333a8ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/65aeefb0-7162-a0fc-8226-084a5c984172.png)


```text:エラー
WinRM は要求を処理できません。 ネゴシエート認証の使用時に次のエラー(エラー コード 0x8009030e) が発生しました: 指定されたログオン セッションは存在しません。 そのセッションは既に終了している可能性があります。

このエラーは、指定された資格情報が対象のサーバーで無効であるか､サーパー IDを確認できなかった場合に発生することがあります。 サーバーIDを信頼している場合は、サーバー名をTrustedHosts 一覧に追加し、要求を再実行してください。 TrustedHosts 一覧を表示または編集するには winrm.cmd を使用します。 TrustedHosts 一覧に含まれているコンピューターは認証されていない可能性があります。 TrustedHosts 一覧の編集方法の詳細については、次のコマンドを実行します: winrm help config.
```

# ■環境

```
OS 名:                 Microsoft Windows Server 2016 Standard Evaluation
OS バージョン:          10.0.14393 N/A ビルド 14393
```

# ■解決策
WinRMのTrustedHostsにホストを追加します。
PowerShellを起動し、以下コマンドを入力します。

コマンド：`Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Value '*'`

```text:設定
PS C:\Users\Administrator> Set-Item WSMan:\localhost\Client\TrustedHosts -Value `*`

WinRM セキュリティの構成。
このコマンドは WinRM クライアントの TrustedHosts の一覧を変更します。TrustedHosts
の一覧内にあるコンピューターは認証されない可能性があります。クライアントはこれらのコンピューターに資格情報を送信する可能性があります。この一覧を変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y
PS C:\Users\Administrator>
```

<br>
<br>

確認として、以下コマンドを実施し`Value`が`*`となっていればOKです。
コマンド：`Get-Item WSMan:\localhost\Client\TrustedHosts`

```text:確認
PS C:\Users\Administrator> Get-Item WSMan:\localhost\Client\TrustedHosts

   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client

Type            Name                           SourceOfValue   Value
----            ----                           -------------   -----
System.String   TrustedHosts                                   *

PS C:\Users\Administrator>
```


# ■参考

WinRM の TrastedHosts にホストを追加 / 確認 / 削除する (Windows Tips)
https://www.ipentec.com/document/windows-windows-10-add-winrm-trasted-hosts
[AWS Q&A 365][SES]Daily Five Common Questions #47

# 1. What is an account-level suppression list? 
Answer: An account-level suppression list is a list of email addresses that are prevented from receiving any email sent from an Amazon SES account. It is a powerful tool for managing the reputation of an email sender, as it helps to prevent sending emails to known bad email addresses. 

# 2. How can I enable my account-level suppression list? 
Answer: To enable your account-level suppression list, you need to go to the Amazon SES console, click on the "Suppression Lists" tab, and then click on the "Enable" button next to "Account-level suppression list". Once enabled, any email address that bounces or complains will be automatically added to the list. 

# 3. Can I add individual email addresses to my account-level suppression list? 
Answer: Yes, you can add individual email addresses to your account-level suppression list by going to the Amazon SES console, clicking on the "Suppression Lists" tab, and then clicking on the "Add email addresses" button next to "Account-level suppression list". You can also add email addresses in bulk by uploading a CSV file. 

# 4. How can I view a list of email addresses that are on my account-level suppression list? 
Answer: To view a list of email addresses that are on your account-level suppression list, you need to go to the Amazon SES console, click on the "Suppression Lists" tab, and then click on the "View email addresses" button next to "Account-level suppression list". You can also download a CSV file of the list. 

# 5. Can I disable my account-level suppression list? 
Answer: Yes, you can disable your account-level suppression list by going to the Amazon SES console, clicking on the "Suppression Lists" tab, and then clicking on the "Disable" button next to "Account-level suppression list". However, it is recommended to keep the list enabled to maintain a good sender reputation.
タワーデフェンスゲーム　Unity タレット設置機能 13/14　49 Upgrade画面にキャンセルボタンを追加

# 概要
目次

https://qiita.com/RYA234/private/c3d52a0f4ab3258a494a

今回はUpgrade画面のキャンセルボタンを押すとUIが閉じるよう実装します・
以下gifアニメはその時の様子です。

![13-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7076e469-2e07-3f7a-fd78-b059b43ff5a4.gif)



# 開発環境
IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定
キャンセルボタンを押す時にUIManager.CloseNodeUIPanelを実行するよう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/ea9469b6-0c5d-68fa-8767-86c1e08af008.png)


# 実装のポイント
下図はキャンセルボタンを押してから実行される処理の流れです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7848b5d6-b1bf-6253-d201-628f412d3f7a.png)



# コード部分

## UIManager

```diff_c_sharp:UIManager.cs
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class UIManager : Singleton<UIManager>
{
    [Header("Panels")]
    [SerializeField] private GameObject turretShopPanel;

    [SerializeField] private GameObject nodeUIPanel;
    [SerializeField] private TextMeshProUGUI upgradeText;
    [SerializeField] private TextMeshProUGUI sellText;
    [SerializeField] private TextMeshProUGUI turretLevelText;
    [SerializeField] private TextMeshProUGUI totalCoinsText;
    [SerializeField] private TextMeshProUGUI lifesText;
    public TurretUpgrade TurretUpgrade { get; set; }
    private Node _currentNodeSelected;


// 中略

+    public void CloseNodeUIPanel()
+    {
+        _currentNodeSelected.CloseAttackRangeSprite();
+        nodeUIPanel.SetActive(false);
+    }

// 中略

}


```

## Node

```diff_c_sharp:Node.cs
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class Node : MonoBehaviour
{
    public static Action<Node> OnNodeSelected;
    public static Action OnTurretSold;
    [SerializeField] private GameObject attackRangeSprite;
    
    public Turrets Turrets { get; set; }
    
    private float _rangeSize;
    private Vector3 _rangeOriginalSize;

// 中略

   
+    public void CloseAttackRangeSprite()
+    {
+        attackRangeSprite.SetActive(false);
+    }

// 中略


}


```




# 参考




Section8 49

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23174280#content


github コミット分


https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/965b8ff70d1b068823420fa5aa5bd8c185dbc3b3#diff-551fbd16a1030b416b24e57d93084acfc07594060f1fc316f909fd3c64c68a01
タワーデフェンスゲーム　Unity タレット設置機能 12/14　 49 ライフと金額のUIを実装

# 概要
目次

https://qiita.com/RYA234/private/c3d52a0f4ab3258a494a



今回は画面左上にあるライフと金額UIを実装します。
下gifアニメはタレットの強化で金額が減って、敵を撃退できなくライフが減っている様子です。

![12-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/a5509c67-f2b2-7c28-bbc9-a4dee4729936.gif)


# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定

## Canvas以下にCoinPanelを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/fd5fd8d4-c276-0af7-0b41-ca1de412642b.png)


## UIManagerスクリプトにLifes-TMPとCoins-TMPをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/3c689c22-1e28-b3a4-a313-fe53f18a0bef.png)



# 実装のポイント

下図はCurrencySytemから金額情報を取得するときの流れです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/80f69fec-83d8-fe23-345b-5653658f5c10.png)



下図はLevelManagerからライフ情報を取得するときの流れです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/2ce3d92c-831d-673a-227e-2150afa8cdf5.png)




# コード部分


## UIManager

```diff_c_sharp:UIManager.cs
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class UIManager : Singleton<UIManager>
{
    [Header("Panels")]
    [SerializeField] private GameObject turretShopPanel;

    [SerializeField] private GameObject nodeUIPanel;
    [SerializeField] private TextMeshProUGUI upgradeText;
    [SerializeField] private TextMeshProUGUI sellText;
    [SerializeField] private TextMeshProUGUI turretLevelText;
+    [SerializeField] private TextMeshProUGUI totalCoinsText;
+    [SerializeField] private TextMeshProUGUI lifesText;
    public TurretUpgrade TurretUpgrade { get; set; }
    private Node _currentNodeSelected;

    private void Update()
    {
+        totalCoinsText.text = CurrencySystem.Instance.TotalCoins.ToString();
+        lifesText.text = LevelManager.Instance.TotalLives.ToString();
        
    }
    // 中略
}


```



# 参考




Section8 49

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23174280#content

github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/46a20712abceb3cb115f34bbdf2bca25aedb6164
SQLserver A5M2接続方法 備忘録

## データベースの追加と削除
* 「データベースの追加と削除」を押下
* 「Microsoft SQLserverとSQLserverCompact(S)」を選択

## データベースの内容を登録 -SQLserver
||||
|----|----|----|
|接続ﾀｲﾌﾟ|SQLserver||
|サーバー名|MMSMのサーバー名を入力|「localhost」では接続不可![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/f1e18247-1eef-f33c-86e6-8e433256a33d.png)|
|ポート番号||不要|
|●|WindowsNTの統合セキュリティを使用する|「SQLserver認証を使用する」の場合はあらかじめ設定しておく|
|データベース名|データベース名を入力||
タワーデフェンスゲーム　Unity タレット設置機能 9/14　47 タレットUpgrade画面のUIテキストを反映するように実装

# 概要
目次

https://qiita.com/RYA234/private/c3d52a0f4ab3258a494a

今回はタレットのUpgrade画面のUIの数値部分を更新します。
以下gifアニメはゲーム開始時にUI情報を更新している様子です。
初期値の100からタレットのアプデ代10に変化していることを確認できます。

![9-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/73a41d3c-0301-c00e-7954-817374ac4af6.gif)






# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定


# 実装のポイント

ボタンイベントについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/8bd56000-4c60-e0be-aae9-87c692b86e9e.png)



Upgradeの引数について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/f3bfd39b-aa69-e7a3-dc2f-02b12c5a1878.png)

Levelの引数について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/981bb7b4-5fa1-e5ca-d59d-fdf4571cb37c.png)


レベルの引数について　下図


# コード部分

## UIManager

```diff_c_sharp:UIManager.cs
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class UIManager : Singleton<UIManager>
{
    [Header("Panels")]
    [SerializeField] private GameObject turretShopPanel;
    [SerializeField] private GameObject nodeUIPanel;
+    [SerializeField] private TextMeshProUGUI upgradeText;
    [SerializeField] private TextMeshProUGUI sellText;
+    [SerializeField] private TextMeshProUGUI turretLevelText;
    public TurretUpgrade TurretUpgrade { get; set; }
    private Node _currentNodeSelected;
    

    // 追加箇所
    public void CloseTurretShopPanel()
    {
        turretShopPanel.SetActive(false);
    }

    public void UpgradeTurret()
    {
        _currentNodeSelected.Turrets.TurretUpgrade.UpgradeTurret();
+        UpdateUpgradeText();
+        UpdateTurretLevel();
    }
    private void ShowNodeUI()
    { 
        nodeUIPanel.SetActive(true);
+        UpdateUpgradeText();
+        UpdateTurretLevel();
    }

+    private void UpdateUpgradeText()
+    {
+        upgradeText.text = _currentNodeSelected.Turrets.TurretUpgrade.UpgradeCost.ToString();
+    }

+    private void UpdateTurretLevel()
+    {
+        turretLevelText.text = $"Level {_currentNodeSelected.Turrets.TurretUpgrade.Level}";
+    }
    private void NodeSelected(Node nodeSelected)
    {
        _currentNodeSelected = nodeSelected;
        if (_currentNodeSelected.IsEmpty())
        {
            turretShopPanel.SetActive(true);
        }
        else
        {
            ShowNodeUI();
        }
    }
    private void OnEnable()
    {
        Node.OnNodeSelected += NodeSelected;
    }

    private void OnDisable()
    {
        Node.OnNodeSelected -= NodeSelected;
    }
}


```


# 参考




Section8 47

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23145742#content

github コミット分

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23145742#content
タワーデフェンスゲーム　Unity タレット設置機能 7/14　47 UpgradeのUIを実装 タレット設置済みで実施するとUpgradeUIを開くようにする

# 概要
目次

https://qiita.com/RYA234/private/c3d52a0f4ab3258a494a

今回はタレット設置済みのNodeオブジェクトをクリックしたとき、タレットアプデUIを表示するようにします。

以下gifアニメはタレット設置済みのNodeオブジェクトをクリックしたときUIが表示される様子です。

![7-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/72114852-e8e9-00bb-5328-adc89e28973a.gif)


# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定
UIを新規作成します。
UIは真ん中の下部に配置するにはAltキーを押してアンカープリセットを選択します。
![iiiii.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/78a7b777-6c49-4555-50bf-dd3ffc185e66.gif)



UIManagerコンポーネントにNodeUIPanelをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/94fad12e-bdc3-cb59-b86d-7dce085654b9.png)




# 実装のポイント
UIManagerクラスの内容を修正します。
新規メソッドShowNodeUIを加えます。
ShowNodeUIメソッドをはNodeUIを表示するメソッドです。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/08f1edb4-cb63-8ee0-e800-334039cfb373.png)


# コード部分

## UIManager

```diff_c_sharp:UIManager.cs
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class UIManager : Singleton<UIManager>
{
    [Header("Panels")]
    [SerializeField] private GameObject turretShopPanel;

    [SerializeField] private GameObject nodeUIPanel;
    
    private Node _currentNodeSelected;

    public void CloseTurretShopPanel()
    {
        turretShopPanel.SetActive(false);
    }
    
+    private void ShowNodeUI()
+    {
+        nodeUIPanel.SetActive(true);
+    }
    private void NodeSelected(Node nodeSelected)
    {
        _currentNodeSelected = nodeSelected;
        if (_currentNodeSelected.IsEmpty())
        {
            turretShopPanel.SetActive(true);
        }
+        else
+        {
+            ShowNodeUI();
+        }
    }
    private void OnEnable()
    {
        Node.OnNodeSelected += NodeSelected;
    }

    private void OnDisable()
    {
        Node.OnNodeSelected -= NodeSelected;
    }
}


```



# 参考

Section8 47

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23145742#content

github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/8519d66b8b0e2013ba0fe3e06458e876adf963ad
Seeed Studio XIAO ESP32C3 + SSD1306 有機LED + U8g2 日本語表示(簡単)

:::note info
Seeed Studio XIAO ESP32C3を購入したので、色々単体検証を実施中。動くもの、うごかないものの癖をメモっていきます。
:::
# SSD1306の有機LEDディスプレイ
利用には、U8g2を利用。結論はXIAO ESP32C3で利用できる。サンプルコードにJAPANESEというのがあるけど、文字化けしちゃうので、調べたところたぶんフォントをコンバートしたりなかなか手順が多そうだったが、オンラインで必要な表示したいラベルをフォン化してくれるサービスを発見したのでご紹介。

## U8g2
ライブラリマネージャーでダウンロードして、サンプリコードを実行
問題なく動作。Esp32-C3はArduinoに比べて起動が早いのですぐに表示されるのが嬉しい。

## U8g2日本語
超簡単日本語表示の手順だけ書きます。

1. U8g2のサンプルプログラムが動くこと
2. コーディングにはページバッファーを利用する（利用しないと文字化けしました）
3. 必要なフォントを生成機でダウンロード（以下のURLから）
4. ダウンロードしたファイルをコンパイルするinoと同じディレクトリに入れる
5. インクルードして、コンパイル

### フォントのダウンロード
これまで、U8g2フォントを生成するなど結構手間がかかりましたが、とりあえず、日本語を出したい場合、このサイトで生成できます。
  https://www.kidsgo.net/u8g2/index.php#converter


![スクリーンショット 2023-05-04 13.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120804/baab8751-1b6a-6658-37a4-1776211cb715.png)

ここに必要なダブルバイトの日本語（ひらがな、かたかな漢字）を入れていきます。
最大4Kまで入れられるそうです。

入れたら、今すぐ生成ボタンでダウンロード
ダウンロードしたファイルは組み込みたいArduinoのプログラムと同じでディレクトリに保存します。

### 二行追加するだけ

Arduino　IDE上の開発画面で、サイトに表示されている、フォントファイル名をインクロード
#include "u8g2_font_30f202xxxxxxxxxxxxx.h"
ファイル名はダウンロードごとに変わりますー

フォントを読み込みます。
u8g2.setFont(u8g2_font_unifont_myfonts);


### テストコード

```C++:TestU8g2.ino
/*
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
#include "u8g2_font_30f202xxxxxxxxxxxxx.h"//ここにこのソースと同じディレクトリに配置した上記でダウンロードしたフォントファイルをインクルード


// お手持ちのディスプレイを指定
U8G2_SSD1306_128X32_UNIVISION_1_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE, /* clock=*/SCL, /* data=*/SDA);  // pin remapping with ESP8266 HW I2C

void setup(void) {
  u8g2.begin();
  u8g2.enableUTF8Print();  //UTF8文字を有効化
Arduino print() function
}

void loop(void) {
  
  u8g2.setFontDirection(0);
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_unifont_myfonts);//ダウンロードした日本語ファイルを有効化
    u8g2.setCursor(0, 13);
    u8g2.print("おはよ！");
    u8g2.setCursor(0, 26);
    u8g2.print("元気?(^^)");
  } while (u8g2.nextPage());

  delay(1000);
}
```
## まとめ

これなら簡単に、必要な文字だけ組み込めるなのでシステムメモリーも軽軽量化。現在はフォントサイズが指定ですが、綺麗に表示できました。ちゃちゃっと日本語表示したい方は便利です。ちなみに、簡体字、繁体字（香港）、韓国語などのダブルバイトも行けるそうです。国際語対応するのが簡単です！

これで簡単に表示器を作れるので何作ろうかな。
タワーデフェンスゲーム　Unity タレット設置機能 3/14 45 タレットボタンを動的に生成する

# 概要
目次

https://qiita.com/RYA234/private/c3d52a0f4ab3258a494a




今回は、タレットカードをプレハブ化して起動時に動的生成するようにします。
以下gifアニメはゲーム再生後　タレットボタンがTurretSettingの情報に基づいて作成されている様子です。

![TurretCardDynamic.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/76a95945-a1ab-62c5-f578-b84f9500bf0e.gif)






# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定
新規オブジェクトを作成しTurretShopMangerスクリプトをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/fca5cbfd-f628-a84e-600c-813085d7437a.png)


TurretCardをプレハブ化しTurretCardスクリプトをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/de564645-c495-b742-eca8-0aac62803726.png)



# 実装のポイント
TurretCardとTurretShopManagerを新規作成します。
TurretShopManagerクラスでScriptableObjectでの情報をタレットカード上に反映します。
TurretCardクラスではTurretShopManagerクラス経由で得られるTurretSettingの情報をUI上に反映します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/9f0f0e54-4407-3c50-82a8-eee032477122.png)


# コード部分
## TurretCard
```diff_c_sharp:TurretCard.cs
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class TurretCard : MonoBehaviour
{
    [SerializeField] private Image turretImage;
    [SerializeField] private TextMeshProUGUI turretCost;

    public void SetupTurretButton(TurretSetting turretSetting)
    {
        turretImage.sprite = turretSetting.TurretShopSprite;
        turretCost.text = turretSetting.TurretShopCost.ToString();

    }
}


```

## TurretShopManager
```diff_c_sharp:TurretShopManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TurretShopManager : MonoBehaviour
{
    [SerializeField] private GameObject turretCardPrefab;
    [SerializeField] private Transform turretPanelContainer;

    [Header("Turret Setting")] [SerializeField]
    private TurretSetting[] turrets;

    private void Start()
    {
        for (int i = 0; i < turrets.Length; i++)
        {
            CreateTurretCard(turrets[i]);
        }
    }

    private void CreateTurretCard(TurretSetting turretSetting)
    {
        GameObject newInstance = Instantiate(turretCardPrefab, turretPanelContainer.position, Quaternion.identity);
        newInstance.transform.SetParent(turretPanelContainer);
        newInstance.transform.localScale = Vector3.one;

        TurretCard cardButton = newInstance.GetComponent<TurretCard>();
        cardButton.SetupTurretButton(turretSetting);

    }

}


```





# 参考




Section8 45

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23190276?start=30#overview

github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/8528c5821789360d935798806e6e801c093d2186
タワーデフェンスゲーム　Unity タレット設置機能 2/14　タレットカードに関するScriptableObjectの作成

# 概要
目次

https://qiita.com/RYA234/private/c3d52a0f4ab3258a494a



今回は、タレットカードの情報を入れておくScriptableObject（TurretSettingクラス）を作成します。

下図はメニューからTurretSettingを新規作成するときの様子です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e7c8e40a-de61-b54a-35f1-a989a593047f.png)


下図は設定後のScriptableObjectをインスペクター上で確認してるときの様子です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/f8635569-b9b8-cd26-ff9c-efd5a26528de.png)




# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定
特になし

# 実装のポイント
新規クラスにTurretSettingクラスを作成します。ScriptableObjectを継承しています。ScriptableObjectは大量のデータを保存するために使用できるデータコンテナであり、フォルダ上に置くオブジェクトです。

TurretSettingは後に作成する　TurretShopManagerクラスで用います。下図参照




# コード部分
```diff_c_sharp:TurretSetting.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName ="Turret Setting")]
public class TurretSetting : ScriptableObject
{
    // 購入後設置するタレット
    public GameObject TurretPrefab;
    // 購入するのに必要なコスト
    public int TurretShopCost;
    // タレットカードで表示される画像
    public Sprite TurretShopSprite;
}
```


# 参考

ScriptableObject

https://docs.unity3d.com/ja/2018.4/Manual/class-ScriptableObject.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/f12af61b-ba77-80a5-de2e-3ca4deb4f4d8.png)


CreateAssetMenuAttribute

https://docs.unity3d.com/ja/2021.2/ScriptReference/CreateAssetMenuAttribute.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/a9f6ab88-1c00-967d-695a-2b0c3548ab44.png)




Section8 44

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23190276#overview


github コミット分

無し
タワーデフェンスゲーム　Unity タレット設置機能 １/14　タレットUIの作成

# 概要
目次

https://qiita.com/RYA234/private/c3d52a0f4ab3258a494a


今回はuGuiを使ってタレットを購入するUIを作成します。
以下作成したUIの画像です。（赤枠で囲まれた部分）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/6689395c-5c89-ce01-39f6-96aaeb4be96a.png)


# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定
uGUiでキャンバスを作成します。
## タレットUIの作成

### uGuiのキャンバス作成　
ヒエラルキー右クリック→UI→キャンバスグループ選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/b00af52a-0d33-52ec-5c38-4dc182040b21.png)


Canvasのインスペクター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/cb21cea4-df72-07f3-df0f-822e6affcc0c.png)


### 外枠の黒を作成
ヒエラルキー右クリック→UI→パネルを選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/8d9136c2-7779-1745-dc34-39150264942b.png)

インスペクター上の設定座標を以下画像の様に設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/d09a5787-886f-6b54-2849-dd43416aa278.png)


## グリッド枠の作成
uGuiのパネルを作成
以下インスペクターの画面
１．外枠より若干サイズを小さくします。
２．背景色を白にします。
３．タレットボタンを並べるためにGridLayoutGroupコンポーネントをアタッチしています。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/f1979441-6c94-6634-09f1-a234ac93abe5.png)


## キャンセルボタンの作成
UIを閉じるキャンセルボタンを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/0a1f77ef-af4c-7a73-5aa0-f0f9ed5aed67.png)

以下インスペクター

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4d156569-7e8a-4acf-fb46-c0db36d74dea.png)


## タレットボタンを作成
現時点では画像、テキストのみです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7dc6f558-0df4-cbb9-610f-be247fa451b5.png)

グリッドが聞いているか確認
下gifアニメは複製したタレットボタンをオンオフした際レイアウトが変化しているか確認している様子です。

![GridLayoutddde.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e04729f2-8b57-091f-d102-dbee29b7b4f8.gif)



# 参考




Section8 44.

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23190276#content



github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/91b856ca3dd4df919ae865b307920762b7b35462#diff-a9250c2873c9aabf365bbc06e1a71a0efba76a0bf523045b63686024d169fd49
インストール不要、どこからでもアクセスできるオンラインIDE（統合開発環境）　５選

# オンラインIDE
## １，CodeSandbox - React、Vue、AngularなどのフロントエンドフレームワークやNode.jsなどのバックエンドフレームワークをサポートしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/78e7fe05-2373-2e4d-8bf9-824ce43cb209.png)


## ２，StackBlitz - Angular、React、Vueなどのフロントエンドフレームワークをサポートしています。
https://stackblitz.com/

## ３，Replit - Python、Java、Node.js、Ruby、Go、C++などの言語をサポートしています。

https://replit.com

## ４、Gitpod - GitHub、GitLab、Bitbucketなどのバージョン管理システムとシームレスに統合し、多数のプログラミング言語をサポートしています。

https://www.gitpod.io/

## ５，Cloud9 - Python、Java、Node.js、Ruby、Go、PHP、C++などの言語をサポートしています。
https://aws.amazon.com/jp/cloud9/

これらのオンラインIDEは、ブラウザ上で実行されるため、インストールが不要で、どこからでもアクセスすることができます。また、多数の機能を提供しており、開発者がスムーズに開発作業を行うことができます。
RaspberryPi4 初回起動編

# はじめに

RaspberryPi4の初回起動までをまとめる
セットアップに使っている環境はUbuntu 20.04です

# 起動ディスクの作成

### Raspberry Pi Imagerのインストール
snapで入るらしい

```
sudo snap install rpi-imager
```

起動するとこんな感じ
![Screenshot from 2023-05-03 13-08-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133206/92bb0d67-7ae5-3884-6ae3-e747b6a727a0.png)

* OS
    * 64bitのfullイメージを選択
* ストレージ
    * インストールするSDを選択
あとはおもむろに書き込むを押す


### 初回セットアップ

画面に従ってセットアップする

# ネットワーク回りの初回設定

これ見ながら設定

[RaspberryPi4 ネットワーク編](https://qiita.com/kanon700/items/3291c19037edf945b53d)


# はじめにインストールするもの

``` bash
sudo apt install net-tools curl git vim fish -y
```

### 設定ファイルの移行
よく使ってるものは移動させる

```
.ssh
.gitconfig
.local/share/fish/fish_history
.config/fish/config.fish
.bashrc
.bash_profile
```

## fish回りの設定

```bash
curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
fisher install edc/bass
```
プログラミング学習に便利な無料プラットフォーム　４選

# 無料で利用できるプラットフォーム:earth_asia:

### Firebase
https://firebase.google.com/?hl=ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/10887413-37b5-7726-beec-2e072c69b997.png)

**Firebaseは、Googleが提供するモバイルおよびWebアプリケーションのためのマルチプラットフォームのクラウドサービスプラットフォームです。
Firebaseは、データベース、認証、ストレージ、分析、クラウドメッセージング、リアルタイムのデータ同期など、多数の機能を提供しています。
Firebaseは、開発者が独自のサーバーを用意する必要がなく、簡単にスケーラブルなアプリケーションを構築できるようにすることを目的としています。
Firebaseはまた、開発者がアプリケーションのユーザーに最適な体験を提供するために、リアルタイムのデータ同期とプッシュ通知を使用することができます。Firebaseは、多数の言語とプラットフォームで使用できます。**

### Vercel
https://vercel.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/2624f94d-a431-40e0-6d9c-75e3f3cc1931.png)

**Vercel（ヴァーセル）は、Next.jsなどのフレームワークや、React、Vue.jsなどのフロントエンドライブラリーで作成されたWebサイトをホスティングするためのクラウドプラットフォームです。Vercelは、高速でスケーラブルなグローバルな配信を提供し、セキュリティやデプロイの自動化などの機能も提供しています。
Vercelは、Webサイトのホスティングを容易にするために、GitHub、GitLab、Bitbucketなどのバージョン管理システムとのシームレスな統合を提供しています。また、Vercelは、デプロイパイプラインの自動化、テスト、ロールバックなどの機能も提供しています。これにより、開発者はアプリケーションのリリースサイクルを迅速かつ容易に管理できます。
Vercelは、サーバーレスのアーキテクチャーを採用しているため、コードを自動的にスケールして、トラフィックの急増に対応できます。Vercelは、オープンソースのフレームワークをサポートすることで、開発者が使用する技術の選択肢を広げています。**

### Heroku
https://www.heroku.com/home

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/4806c9af-cc22-b7d0-0e5f-0596b1e5cad0.png)


**Heroku（ヘロク）は、PaaS（Platform-as-a-Service）として知られるクラウドプラットフォームの1つで、アプリケーションの開発、実行、スケーリングを容易にするために設計されています。Herokuは、複数のプログラミング言語、フレームワーク、データベースに対応しており、開発者が好きなものを使用してWebアプリケーションを構築することができます。
Herokuは、Gitを使用したコードのデプロイ、簡単なスケーリング、アドオンの追加などの機能を提供しています。また、Herokuは、自動的にアプリケーションをバックアップする機能や、さまざまなメトリクスを監視し、アプリケーションのパフォーマンスを分析する機能なども提供しています。
Herokuは、無料のプランから始めることができ、小規模なアプリケーションを実行するのに十分です。さらに、必要に応じて、ホスティングプランをアップグレードして、スケーラブルなアプリケーションを構築することもできます。Herokuは、クラウドベンダーに依存しないアプリケーションの構築を可能にするオープンプラットフォームであり、開発者にとって非常に人気があります。**

### Netlify
https://www.netlify.com/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/37d9c65d-0328-34dc-a4a0-2bc45c67df6e.png)

**Netlify（ネットリファイ）は、静的なWebサイトのホスティング、ビルド、デプロイを容易にするために設計されたクラウドプラットフォームです。Netlifyは、GitHub、GitLab、Bitbucketなどのバージョン管理システムとシームレスに統合し、フロントエンドの技術スタックであるReact、Vue、Angular、Gatsby、Next.jsなどをサポートしています。
Netlifyは、開発者がWebサイトのデプロイやプレビューを素早く行えるようにするために、Gitのコードベースから自動的にビルドを行います。また、Netlifyは、高速なグローバルなCDN（Content Delivery Network）を使用して、Webサイトを高速かつセキュアに配信します。Netlifyは、自動的にHTTPSを提供するために、Let's Encrypt SSL証明書を使用しています。
Netlifyは、静的Webサイトのビルド、デプロイ、ホスティングだけでなく、フォームの処理、データベースの統合、バックエンドのサーバーレス機能など、多数の機能を提供しています。これらの機能により、Netlifyは、小規模なWebアプリケーションの開発を迅速かつ容易にすることができます。**