OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerfileとdocker-compose.ymlとは？役割と違いをわかりやすく解説

`Dockerfile`と`docker-compose.yml`の役割や使い分け、関連性について説明しますね。

### 1. Dockerfile
- **Dockerイメージを作成するための設計図**です。
- 各ステップに従って、ソフトウェアや設定がイメージに組み込まれます。
- たとえば、`Dockerfile`には次のような情報を記述できます：
  - ベースイメージ（例：`FROM ubuntu:20.04`）
  - 必要なソフトウェアのインストールコマンド（例：`RUN apt-get install -y python3`）
  - アプリケーションの実行に必要な設定（例：`COPY`でアプリケーションファイルをコピーしたり、`CMD`で実行コマンドを指定する）

#### 使用例:
```Dockerfile
# ベースイメージを指定
FROM python:3.9

# アプリケーションコードをイメージにコピー
COPY . /app

# 作業ディレクトリを設定
WORKDIR /app

# 必要なパッケージをインストール
RUN pip install -r requirements.txt

# アプリケーションを起動するコマンド
CMD ["python", "app.py"]
```

### 2. docker-compose.yml
- **複数のコンテナを管理するための設定ファイル**です。
- アプリケーションが複数のサービス（たとえば、Webサーバーとデータベース）で構成される場合、それらをまとめて起動・管理するのに便利です。
- `docker-compose.yml`では、どの`Dockerfile`を使うか、ネットワーク設定、ボリュームの設定、依存関係などを指定できます。
- コマンド一つで複数のコンテナを連携して起動したり停止したりできるので、開発やテストに非常に便利です。

#### 使用例:
```yaml
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    image: postgres:13
    environment:
      POSTGRES_USER: example
      POSTGRES_PASSWORD: example
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:
```

### Dockerfileとdocker-compose.ymlの関連性
- `Dockerfile`は、各サービスの**イメージの作成**に必要で、個々のコンテナの動作環境を定義します。
- `docker-compose.yml`は、**全体を構成する複数のコンテナの起動や設定**に使われ、`Dockerfile`を基にした各サービス（コンテナ）の関連性を管理します。

### まとめ
- **Dockerfile**：個々のコンテナイメージの設計図を定義。
- **docker-compose.yml**：複数のコンテナをまとめて管理し、相互に連携させる設定。

これにより、アプリケーションを構成する複数のサービスを手軽に扱えるようになります。

https://qiita.com/SMZPP/items/d3f78d6d74b5c474dfd0
忙しい人向けPython自動化スクリプト集

## はじめに
忙しい毎日で、ルーチン作業に時間を取られることはありませんか？本記事では、Pythonを活用してよくある業務を自動化することで、少しでも作業を効率化する方法をご紹介します。今回はすぐに使える簡単なスクリプト集ですので、Pythonが少しわかる方ならすぐに導入できます！

---

## 1. 毎日のファイル整理を自動化する

### 目的
毎日ダウンロードフォルダに溜まっていくファイルを、日付ごとや種類ごとにフォルダ分けして整理するスクリプトです。指定したフォルダのファイルを、拡張子ごとに自動で整理します。

### コード
```python
import os
import shutil

def organize_files(folder_path):
    # フォルダ内のファイルを取得
    files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
    
    for file in files:
        file_ext = file.split('.')[-1]  # ファイルの拡張子を取得
        target_folder = os.path.join(folder_path, file_ext)

        # 拡張子ごとのフォルダがない場合は作成
        if not os.path.exists(target_folder):
            os.makedirs(target_folder)

        # ファイルを移動
        shutil.move(os.path.join(folder_path, file), os.path.join(target_folder, file))

# 使用例
organize_files('/path/to/your/downloads')
```

### 説明
- **`os`**: ファイルとフォルダの操作を行うための標準ライブラリです。
- **`shutil`**: ファイルの移動やコピーを行います。
- ダウンロードフォルダのパスを指定するだけで、拡張子ごとに自動でフォルダが作成され、ファイルが整理されます。

---

## 2. 定時に毎日メールを自動送信する

### 目的
定時に自動でメールを送信するPythonスクリプトです。週報や定例の連絡を自動化できます。

### コード
```python
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import schedule
import time

def send_email():
    sender = 'you@example.com'
    receiver = 'recipient@example.com'
    subject = '毎日の定例メール'
    body = 'お疲れ様です。本日の進捗を報告します。'

    # メールの設定
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = receiver
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))

    # SMTPサーバーを通じてメール送信
    with smtplib.SMTP('smtp.example.com', 587) as server:
        server.starttls()
        server.login(sender, 'password')
        server.sendmail(sender, receiver, msg.as_string())

# 毎日9時にメールを送信
schedule.every().day.at("09:00").do(send_email)

# スケジューリングの実行
while True:
    schedule.run_pending()
    time.sleep(60)
```

### 説明
- **`smtplib`**: SMTPサーバーを利用してメールを送信するためのライブラリです。
- **`schedule`**: 定期的なタスクを実行するライブラリで、毎日指定した時間にメール送信を自動化できます。
- 注意点として、メールアカウント情報やパスワードの取り扱いには注意し、環境変数や秘密情報管理ツールを使用しましょう。

---

## 3. Excelデータの自動集計

### 目的
Excelファイルから特定のデータを取得し、自動で集計するスクリプトです。大量のデータを手動で集計するのは大変ですが、このスクリプトで作業が一気に楽になります。

### コード
```python
import pandas as pd

def aggregate_excel_data(file_path):
    df = pd.read_excel(file_path)
    
    # 特定の列の合計値を取得
    total_sales = df['売上'].sum()
    print(f"総売上: {total_sales}円")

# 使用例
aggregate_excel_data('/path/to/your/sales_data.xlsx')
```

### 説明
- **`pandas`**: データ解析用のライブラリで、ExcelやCSVファイルの操作が簡単にできます。
- 例では「売上」列の合計を算出していますが、カスタマイズして他の集計やフィルタリングも可能です。

---

## おわりに
このような簡単な自動化スクリプトを使うことで、日々のルーチン作業を効率化し、よりクリエイティブな仕事に集中できるようになります。ぜひ、自分の作業に合わせてカスタマイズし、日々の業務に役立ててください。
Dockerの基礎をクリアに！イメージ、コンテナ、ボリュームの簡単解説

Dockerのイメージ、コンテナ、ボリュームについて簡単に説明しますね。それぞれの役割を理解すると、Dockerの基本的な使い方がわかりやすくなります。

### 1. Dockerイメージ
- **定義ファイルの集合体**で、アプリケーションを実行するためのファイルや設定が入っています。
- 一種の**テンプレート**のようなもので、これを元にしてコンテナが作成されます。
- たとえば、「Pythonのバージョン3.9が入ったUbuntu」や「Node.jsと必要なライブラリが揃ったWebアプリ」という形で、設定や依存関係がイメージにまとめられています。

### 2. Dockerコンテナ
- **実際に稼働するアプリケーションの実体**で、イメージを基に作られたプロセスです。
- コンテナが動いているとき、その中のアプリケーションが起動し、外部とやりとりしたり、データを処理したりします。
- イメージが「設計図」なら、コンテナは「実際に動いているアプリケーション」だと考えると良いでしょう。
- コンテナは独立した環境で動くため、ホストマシンや他のコンテナと隔離された状態で動作しますが、必要に応じて外部と通信も可能です。

### 3. Dockerボリューム
- コンテナに**永続的なストレージ**を提供する仕組みです。
- 通常、コンテナが停止すると、その中で作成・変更されたデータは消えてしまいます（コンテナの「一時的な」ファイルシステムに保存されているため）。
- ボリュームを使うことで、コンテナが削除されてもデータを保持することができます。
- 例えば、データベースコンテナでボリュームを設定すると、データベースをリスタートしてもデータが消えないので便利です。

### まとめ
- **イメージ**：コンテナを作るための「テンプレート」。
- **コンテナ**：イメージを基に動作する「アプリケーションの実行環境」。
- **ボリューム**：コンテナのデータを永続化するための「ストレージ」。

このように、イメージ、コンテナ、ボリュームの役割を押さえておくと、Dockerの使い方がかなりスムーズになると思います！


https://qiita.com/SMZPP/items/f1d3de47ad80ca9bc6ea

https://qiita.com/SMZPP/items/6f821ad65451d9387cc8
新人エンジニアが、仕事を「何もわからない」から「何とかわかる」ようにするには

# はじめに
私は文系から新卒でサーバエンジニアになり、もうすぐ3年になります。
最近、同じく新卒未経験の後輩エンジニアと会話すると「仕事が全然わからない」ということをよく耳にするので、今回は、仕事を進めるうえで最低限押さえておくべきポイントに絞って、まとめていきます。


# まずわからない理由は深く考えない
未経験だと、**「何がわからないかもわからない…」** **「先輩に沢山説明してもらったあとに『なにか質問ある？』と聞かれたけど、全部わからないとは言えない…」** ということがあります。
本来であれば、わからない理由を切り分けて理解を進めていきたい気持ちはあると思いますが、本当に何もわからないのであれば、切り分けることには期待せず、以下を意識しましょう。

:::note info
<font color="red">**意識するポイント**</font color>
**①<INS>現場の資料</INS>をたくさん見る**
**②先輩にもたくさん<INS>質問</INS>する**
**③あとは「<INS>try & error</INS>」！**
:::


# ①現場の資料をたくさん見る
現場に入ると最初は設計書や資料をまとめて渡されることが多いと思います。
特に初めての現場だと、見ても本当に何もわからないので投げやりになりそうですが、今後の**とっかかり(=わからない理由を切り分ける)材料**にもなるので、下記だけは把握しておきましょう。

**・自分がいるチームが所管している<INS>システムを確認する</INS>**
新人としては、まずは大分類として**システム名だけ覚える**でも大丈夫です。
そこから中分類、小分類として関連する**サーバ名やミドルウェア、ソフトウェア名**が出てくるようになると、話の把握がしやすくなります。

**・現場の<INS>環境を把握する</INS>**
自システムの確認が終わったら、**関連システム**や**関連チーム**も確認してみましょう。
現場によっては、なにかしら関連チームへの**調整**や**申請**が多いところもあります。
会議などで知らないシステム名やチームの名前を聞いたら、資料を探してみたり、先輩に聞いてみたりしましょう。

あとは気晴らしに一見あまり重要そうでもない「○○ビルの入館ルール」「○○申請方法」「○○利用ガイド」とかをみるのもよいです。
思わぬところで手助けになったり話のネタになったりします。


# ②先輩にもたくさん<INS>質問</INS>する
資料を確認の上、不明点は１つずつ先輩に質問してみましょう。
そのうえで大事なことは以下です。

**・回答内容がわからなくても<INS>メモ</INS>はしておく**
私の体感では、先輩に質問しても多くは **「なんか思ってた回答と違う…」** **「回答の内容もよくわからない…」** ということがあったりします。
特に急ぎの内容や仕事に影響が出ないような質問をしたのであれば、とりあえずその場では回答を**メモ**しておいて、**自己学習**に戻りましょう。
そのうちなんとなくこんなことを言っていたのかと理解できる日が来ますので、それまではいっぱい**知識ととっかかり**を増やしましょう。


# ③あとは「<INS>try & error</INS>」！
**結局触ってみるのが一番早いです。**
とはいえ、①や②も後々効いてくるので、しっかり**自分から学ぶ意識**は忘れないようにしましょう。①や②を繰り返していると、他の現場の方から 「そんなことまで知っているんだ」と思ってもらえます。
またtry & errorは大事なのですが、それと同時に**必ず報連相も忘れない**ようにしましょう。
**信頼を得ることも仕事をしていく上では重要だと思います。**


# さいごに
人によっては「これだけ？」と思われるかもしれませんが、シンプルに**学び続けていくこと**が大事だと思います。
技術的にはまだまだでも、現場を知っていけば仕事は「何とかわかる」ことも多いです。
そうやって時間を積み重ねていくことで、技術も伸びていくと信じています。
私もまだまだ精進中のため、改めて今回のことを意識して頑張ります。
PostmanでBodyに設定したJSONが取得できなかったら

# 結論
文字の下に赤い波線がなかったら文字コード周りのエラーの可能性があるから「Beautify」を押そう
波線はJSON形式が間違っているので、JSON形式を見直そう
![スクリーンショット 2024-11-14 155303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791111/83c5f549-ebf0-ad7a-f56a-c3a524fbb271.png)


# 以下自分語り
Laravelで作成したAPIを送信するテストを行う際、Excelに送信するJSONのサンプルがあったのだが、取得データがnullとなっていた。
$request->getContent();で送信されたデータを確認したが、String型で取れているし、PostmanでJSONエラーにもなってないし、見た感じ問題なさそうだし、何なら直接入力した場合はデータ取得できるし…と調査やら確認やらで2時間以上費やした。また同じように路頭に迷いそうだったのでメモ
BizRobo! エレメントツリーを活用したDAロボット作成

皆さんはDAロボットを開発する際にエレメントツリーを活用して
ロボット開発されていますでしょうか？

思った箇所をクリックしに行ってくれない、、
などの状況に陥った際の原因の1つに
コンポーネントの指定が上手くいっていないことが挙げられます。
その場合、エレメントツリーを確認し適当な設定に修正する必要があります。

エレメントツリーの活用はDAロボット作成のポイントになる部分でもありますので
今回はエレメントツリーについてご説明できればと思います。
※ver11.4を使用して説明します

# エレメントツリーとは
エレメントツリーとは
DAによってWindowsのデスクトップアプリケーションを自動化する際に、
画面構成情報を解析して表示したツリー構造の情報のことです。※１

実際の開発画面でいいますとこの赤枠で囲われた部分に表示されている
情報のことを指しています。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/050eabf4-7f6b-7e37-9a64-ab3c47784dee.png)

「＋」を押すことでも詳細を見ることができますが、
クリックしたいボタンや記入したい箇所がある場合はその要素をレコーダービュー上で選択すると
自動でエレメントツリー上でも該当箇所が選択され、詳細を見ることができます。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/e3f86311-71e6-3733-b013-e2e75e4464fe.png)


:::note info
エレメントツリーの一番上にはアプリケーション名が記載されています
:::

上記の様にレコーダービュー上で該当箇所を選択しステップを作成した場合、
ステップのコンポーネントはロボット側が自動的に生成してくれます。
しかし、この自動生成が場合によってはエラーを引き起こす原因になる可能性があります。

# エレメントツリーの活用例
**【エラー発生例】**
「一番上の申請者をクリックする」という仕組みを作りたいため、
作成時に一番上にあったAさんの申請者番号「001」部分をクリックし
クリックステップを作成。
しかし、実際にロボットを稼働させると想定していた動きにならなかった。

**【原因】**
申請者クリックステップのコンポーネントが「○○項目[name=”001”]」となっており、
Aさん以外の申請者の処理で不具合が発生。
※申請者番号「002」のBさんが一番上の申請者となった場合
　ロボットは「○○項目[name=”001”]」の要素を探しに行きますが
　Bさんは「○○項目[name=”002”]」のためクリックされず、
　Aさんが申請者にいた場合はAさんをクリックしに行ってしまい、
　Aさんがいない場合は該当するコンポーネントが無いためエラーが発生してしまいます。

**【解決法】**
この場合は、変動的な「name属性」で指定するのではなく
「[○○項目]エレメントの1番目」という指定の仕方をとる必要があります。
そこで活用するのがエレメントツリーです。

該当箇所をレコーダービュー上でクリックし、エレメントツリーで緑に囲われた部分を確認してみましょう。
属性の中に「automationId=”1”」のような1番目の申請者は「1」、2番目の申請者は「2」
と順番に対応した属性がある場合はその属性をコンポーネントとして用いましょう。

もしくは、エレメントツリーで緑に囲われている該当箇所を右クリックし
コンポーネントセレクターのコピー > フルパスコンポーネントセレクターのコピー を選択。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/947ad03d-b385-a81c-4776-ac43bdfb3c6e.png)

すると、該当箇所のフルパスが取得できるため、
取得して値（例：ウィンドウ > ○○ > ○○ > ○○項目:nth-of-type(1)）をコンポーネントに張り付けましょう。
※「エレメント名:nth-of-type(n)」は、該当エレメントのn番目のエレメントを指定します
例）ウィンドウ > メニュー_バー > メニュー項目:nth-of-type(3)は
　　メニュー_バー直下のメニュー項目の3番目を指定する
  
 作成するロボットによって、どのようなコンポーネントの指定方法が
 やりたい動きを反映できるか、安定的か、は異なるため
 何度か試してみて最善の指定方法を見つけていきましょう！

# 参考サイト
※１　BizRobo!ナレッジベース 用語集 エレメントツリー
https://knowledge.bizrobo.com/hc/ja/articles/360028390531
Gnuplot使ってみる

授業の課題で.datをグラフ化するためにgnuplotを使うときに見るやつです．間違っているかもしれないよ．
最低限のことしかわかりません．
　OSは　Ubuntu 24.04.1 LTS　です．
参考：
https://www.cse.kyoto-su.ac.jp/~oomoto/lecture/program/gnuplot/gnuplot.html
http://dsl4.eee.u-ryukyu.ac.jp/DOCS/gnuplot/node153.html

# やってみよう

gnuplotを入れる．(もしかしたらはじめから入ってたかも)

```
sudo apt install gnuplot
```
入れたら
```
gnuplot
```
これでgnuplotが使えるようになる．以下は

```
gnuplot>
```
を省略して書きます．
gnuplotの記事見てたら.csvじゃなくて.datのファイル使ってた．なんでだろ．
だから.datのファイルをまず作る．
![ik-dat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929173/8a2d1239-1e09-a6d3-349c-0a4569456fd5.png)

このファイル名は ik.dat です．
とりあえずこのファイルをグラフにしたかったら
```
p "ik.dat" 
```
これで何かしらのグラフが生成された．(多分１列目と２列目のグラフが生成された.)
ここで言う列は行列のときとおんなじような感じ．
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929173/225ee2b9-8324-9d5c-9abb-f28087c5db18.png)

ここでp とは　plot の略称だと思う．pじゃなくてplotって打ってもちゃんと出てくる
```
plot "ik.dat"
```
列を指定したいときはu hoge:hoge (hogeに出力したい列番号入れる.左はx軸，右がy軸)ここでの u は　using　のこと．さっきと同じように u を使おうが　using　使おうが同じ．例えば1列目と3列目を使いたいときは　u 1:3　と打てばいい
ik.dat での例は
```
p "ik.dat" u 1:3
```
でも
```
plot "ik.dat" using 1:3
```
でもいい(pのところだけplotに変えてもいい)
このとき
　![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929173/eb78512e-c72d-ac8c-1cbf-1eaaba255ee8.png)
が出力される．



とりあえずグラフが作れることはわかった．
# グラフの体裁を整えよう

 次に，グラフの体裁を整える．レポートだと体裁整えないと，減点くらっちゃうしね．
 グラフの名前を入れたいときは
 ```
 set title "hoge"
 ```
 って入れればグラフ上にhogeって出てくれる．嬉しい．
 軸に名前をつけたいときは
 ```
 set xlabel "x-axis"
set ylabel "y-label"
```
と打てばx軸y軸のそれぞれに名前がつく．

他にも
```
set label "hoge"
```
って打てばどっかにhogeが表示される．
https://sk.kuee.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/label.html
ここに詳しいことが書いてある．位置を指定してlabelを出せるみたい．

あとは表示するグラフの範囲だね！
これもめっちゃ簡単で
```
set xrange [hoge:hoge]
set yrange [hoge:hoge]
```
で範囲を指定できる．

set hogehoge
って書いたあとにplotしないとplotしたグラフは変わらない．(はず)

以上のことを組み合わせて2,3列目を使ってグラフを出力させると

```
set title "y-x graph"
set xlabel "x-axis"
set ylabel "y-axis"
set xrange [0:20]
set yrange [-30:10]
p "ik.dat" u 2:3
```
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929173/1c23ddd7-f3e2-d458-7a55-211d7e8fcf3e.png)

ってなるよ．これでとりあえずレポートは作れそう．

# 終わり
間違ってるところ，タイプミス等あったら教えてください．よろしくお願いします．
[UE5]StateTreeを勉強する クイックスタートガイドを見る

今回は以下のガイドの3までの導入を目標とする。かなり平易に書かれているため、リンク先を読むだけでStateTreeの学習の下準備が終わるだろう。なお、この投稿の記述時に使っているバージョンは5.4.4。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/statetree-quick-start-guide
>目的
このガイドでは、State Tree を使用して、プレイヤーが撃って破壊できる移動するターゲットを作成します。

>目標
プレイヤーが撃って破壊できるターゲット アクタの ブループリント を作成します。
ターゲット アクタを移動および破棄するロジックを含む State Tree を作成します。
State Tree Task を作成し、それらを State Tree で使用します。
State Tree Evaluator を作成し、それらを State Tree で使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/665d2c03-df52-e3a6-7fe7-e749c6490e63.png)
ここで引っかかる人はST_ShootingTargetを開いて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/bb1bfcca-d13c-65e1-5df2-11d1ee857c3f.png)
ここのドロップダウンがStateTreeComponentであることを確認しよう。なお、変更したら保存をしてCompileボタンを押して反映させる必要がある。

ここにさえ引っかからなければおそらくStateTreeを触る段階まで来れるのではないだろうか。

# 雑多な補足
StateTreeとあんまり関係ないが、せっかくなのでいくつか。
英語表記になっていないことで、ガイドに書かれている項目を探すのに時間がかかってしまうことがあるが、言語設定を英語に変えることで、同じ表記にすることができる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/a1a8b44d-be1f-5d42-7426-01421872bf38.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/de82440e-71e3-b863-914e-521e9a37f4c8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/a7eb75cc-fe37-2ffb-7554-e9f5e6f8403a.png)
日本語でなくなるデメリットもあるが、海外のTipsを読みつつ作品を作るときはこっちの方がいいと思う。
- - -
念のため自分で作ったものを新規で作ったAdditionalフォルダに分けておいた。サンプルなので中身が見られる反面、考えなしだとごちゃごちゃになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934437/a9f3f4e1-21cb-5884-1514-91fe20984b62.png)
- - -
ファイル名規則について。
ST_XXXXXX
BP_XXXXXX
のように、UnrealEngineではファイル種別を2文字に略し、アンダーバーをつけてからファイル個別の名前を付けるのがプロアマ問わず一般的。UE村の因習なので他では大体通用しない。フォルダ分けが甘くても検索で当てやすいあたりがメリット。
- - -
State（ステート）＝状態。
Schema（スキーマ）＝構造。
大した意味ではないが、しれっと使われる上に知らないと何のこっちゃとなるので覚えておいた方がいい。
- - -
BluePrintとC++によるコーディング実装について。
大体ガイドはBluePrintで書かれているが、C++で実装することもできる。やれることはほぼ同じだが、両方にメリットとデメリットがあり
+ 機能の検索性
BluePrintは数文字で機能を絞り込めるが、C++だと厳しい。
+ ビルド時間
BluePrintはエディタ上で勝手にやってくれるが、C++だとビルド、UE再起動で時間がかかる
+ メモリ解放
BluePrintは勝手にやってくれるが、C++はメモリ解放を書かないといけない。逆に言うと変なタイミングでGCを走らせられない（変なところで一瞬固まったりしない）ということでもある。
+ 処理速度
基本的にC++のほうが速いと言われている。
+ バージョン管理
BluePrintはバイナリファイルなのでマージが困難。C++はテキストなので大体は自動的に処理できる。BluePrintが集団開発に向かないと言われるのはこれが10割。

とどちらがいいとは言い切れない。
BluePrintの方が初心者にわかりやすいが、それでもある程度のプログラム知識は必要である。また、BluePrintとC++の変換はかなり面倒くさい（実質作り直しになる）。よって途中での切り替えは推奨しない。連携は容易なため部分によって使い分けるのは十分可能。
レスポンスタブのデータグリッドビューの色分け

# sWebMachineGun.exe実践編

レスポンスタブのDataGRidViewの各カラムの色わけについて

## 対象としているタブ

<B>「Response」</B>タブのデータグリッドビューの各カラムの色分けについて

![088.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/5682fd67-b106-4be1-3b4e-dc00c7f8692c.png)

## 設定するタブ

<B>「GeneralSetting」</B>タブの<B>「ResponseColor」</B>グループがそれ。

![089.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/54d94a24-0976-9b21-aa79-013839ae9ef5.png)

<dl>
 <dt>登録方法
  <dd>ドロップダウンリストボックスで、対象カラムを選択して、「Color」ボタンで色を選択して、テキストボックスに条件を入力して「Set」ボタンで登録できます。<br><br>
 <dt>編集/削除の方法
  <dd>リストの項目をダブルクリックすると、編集できるようになります。<br><br>
 <dt>ヘルプ
  <dd>
<B>「Help」</B>ボタンでちょっとした説明がでます。
<ul>
<li>基本的には先頭一致で、ヒットしたら指定した背景色を塗る
<li><B>「ContentType」</B>カラムは正規表現
<li><B>「ContentLength」</B>カラムに<B>「-1」</B>をセットした場合、最初のレコードと同じ値だったら&quot;ヒット&quot;とする
<li><B>「ContentLength」</B>カラムには<B>「10000-」</B>と10000より大きい。<B>「-5000」</B>で5000未満という指定もできる<B>(ver6.0.4.1以降)</B>
<li><B>「Location」</B>カラムに<B>「-1」</B>と指定すると最初のレコードのリダイレクトURLと同じ値だったら&quot;ヒット&quot;とする
<li><B>「Location」</B>カラムに<B>「-2」</B>と指定すると最初のレコードのリダイレクトURL(クエリ文字列を除いた部分)と同じ値だったら&quot;ヒット&quot;とする
</ul> 
</dl>

![090.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/09c7a95c-a0d3-501a-c1a5-748ea5d70241.png)

<B>「Default」<B>ボタンだとこんな感じ<B>(ver6.0.4.1)</B>

| カラム名      | 値                  | 
|:-------------|--------------------:|
| ContentLength| -1                  |
| ContentLength| 10000-              |
| ContentType  | application/.*?json |
| ContentType  | text/.*?json        |
| ContentType  | text/.*?xml         |
| ContentType  | text/.*?xml         |
| ContentType  | text/html           |
| ContentType  | text/plain          |
| Location     | -1                  |
| StatusCode   | 2                   |
| StatusCode   | 3                   |
| StatusCode   | 4                   |
| StatusCode   | 5                   |

# sWebMachineGun.exe Index

[sWebMachineGun.exe のメインメニューに戻る](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3)
Salesforce におけるfindメソッドを考える

SFIDを受け取ってレコードを取得する汎用処理がないようだったので、自前で実装してみました。



~~~Apex
public class SObjectDAO {
    /**
     * ObjectIdによるレコード検索
     * @param String selectFields：SELECT項目（"*"で全項目を取得）
     * @param Id objectId：ObjectId
     * @return SObject：検索結果のオブジェクト
     */
    public static SObject findById(String selectFields, Id objectId){

        if( String.isBlank(selectFields) ){
            return null;
        }

        // Idからオブジェクト名を取得
        String sObjectName = objectId.getSObjectType().getDescribe().getName();
        if( String.isBlank(sObjectName) ){
            return null;
        }

        // クエリ組み立て
        String query = selectFields == '*' ? SObjectDAO.getSelectAllQuery(sObjectName, '')
                                           : 'SELECT ' + selectFields + ' FROM ' + sObjectName;
        query += ' WHERE Id = \'' + objectId + '\' LIMIT 1';

        // クエリ実行
        List<SObject> resultList = Database.query(query);
        if(resultList.size() == 0){
            return null;
        }

        // 検索結果を返す
        return resultList[0];
    }

    /**
     * SOQLの"SELECT *"のクエリStringを取得する
     * @param String sObjectName：SObject名
     * @param String otherClause：SELECT, FROM以外の条件句（WHERE、GROUPBY、ORDERBY、LIMITなど）
     * @return String：SOQLクエリString
     */
    public static String getSelectAllQuery(String sObjectName, String otherClause) {
        // オブジェクトの情報を取得する
        Schema.SObjectType sObjectType = Schema.getGlobalDescribe().get(sObjectName);
        // 項目情報を取得するためにDescribeSObjectResult型に変換
        Schema.DescribeSObjectResult sObjectResult = sObjectType.getDescribe();
        // 当該オブジェクトの全項目を取得してMapに格納
        Map<String, Schema.SObjectField> fields = sObjectResult.fields.getMap();

        // 全項目のAPI参照名のList
        List<String> allFieldNameList = new List<String>(fields.keySet());
        // SELECT句生成
        string selectClause = catStrings(', ', allFieldNameList);
        // SOQL生成
        String soql = 'SELECT ' + selectClause + ' FROM ' + sObjectName + ' ' + otherClause;
        return soql;
    }
}
~~~

~~~apex:使用方法
Id accountId = '〇〇' // 15 or 18桁のSFID

// 戻り値がSObject型なので、受け取る際に適切なオブジェクトにキャストする
Account acc = (Account)SObjectDAO.findById("*", accountId);
~~~

<br />

##### 参考URL
[Apex上でSelect *を実装してみた](https://qiita.com/arufian/items/dd376e23dd3e568b9f1a)

[Salesforce Spring '21の新機能、SOQLのFIELDS()関数について](https://base.terrasky.co.jp/articles/qAkDk)
初心者がサーブレット&JSPでキャラクター管理システムを作ってみる話1

こんにちは。寒い地域に住んでる情報系の大学生です。

今現在、webアプリケーションの開発にチャレンジしているので、せっかくだから記録でもつけようかと思い記事を書きました。(困ったときに助言とかしていただけるかなぁ...とかも思っていたり)

作ろうとしているのはキャラクター管理ができるシステム。
すっきりわかるサーブレット&JSP第4版という参考書を見ながら作っていくので、主にサーブレットとJSP、そしてDAOを使って製作していきます。

今までは大学で出た課題やpaizaの問題を解くだけで、要件定義や設計の類とかはやったことが無く、社会に出る前に上流工程をちょっとは経験しておこうと思ってやり始めました。
あと今年参加したインターンシップで、ちょっとだけ上流工程(ヒアリングや画面遷移図の作成、データベース設計など)をやらせていただいたとき、上流工程楽しいなって思ったというのもあるかも。

とりあえず、現在作業ができている(or考えている)ところまでまとめますね。

## 持たせたい機能
* キャラクターの情報を持つことができる
* キャラクターの登録、更新、削除ができる
* キャラクター一覧を表示することができる
* すべての画面からtopの画面に遷移することができる

## データベース
データベース設計をしました。
データベース設計の仕方は大学の講義で学んだので、その時の知識とその講義のために買った参考資料を基に作成しました。ただ、あまりにも項目が多いと初心者には難しいと思ったので、細かくは作ってないです。
ゲームごとに管理しようと思っているので、ゲームの情報を持つゲームテーブルと、キャラクターの情報を持つキャラクターテーブルの２つを作りました。
データベースはH2データベースを使っていこうと思います。

## 画面遷移
まず登録機能から作っていこうと思ったので、ファイル名をエクセルにメモしつつ登録機能の画面遷移を考えました。
写真はその一部です。
参考書が結構細かく考えていたので、なるだけ細かく、プログラミングのときに困らないよう意識して考えました。

![スクリーンショット 2024-11-14 115921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842140/460345a1-c04a-4261-6ab5-e4076bfee2ed.png)
(drowioで書きました)

なかなか難しかったけど、流れが決まってくると頭がすっきりしてきますね。謎解きみたいで楽しい。

とりあえず、今回はここまでかな。
次は一覧表示からの更新、削除の流れを考えていく予定です。
良い感じに考えられたらまた記事を投稿しますね。
Macの環境づくり

自分がMac使い始めるたびにやっていることをまとめます。

## Homebrew

### インストール

https://brew.sh/ja/

Homebrewで必要なアプリのセットアップを行います。
HomebrewのインストールにはAdmin権限が必要です。

### 個人的なbrewリスト

#### 一般的なアプリ

```sh
brew install --cask google-chrome
brew install --cask google-japanese-ime
brew install --cask rectangle
brew install --cask alt-tab
brew install --cask miro
brew install --cask deepl
brew install --cask obsidian
brew install --cask discord
brew install --cask slack
```

rectangle便利。`Ctrl`+`opt`+`方向キー or Enter`で画面上のウィンドウの配置を右半分上半分全体とかにできる。Windowsなら標準で`Win`+`方向キー`でやってくれるやつ。

alt-tabも便利。`⌘+Tab`をWindowsと同じ挙動にしてくれる。Windowsのウィンドウ操作でよいところをrectangleとalt-tabで再現するとストレスが少ない。

#### 開発用アプリ

```sh
brew install go
brew install --cask cursor
brew install --cask visual-studio-code
```

cursorはAI搭載VScode。まだあまり使いこなせてないです。

### brew bundle

brew bundleを使うとまとめてインストールできて楽らしい。
知らなかったので、次の機会に使ってみたいです。

https://qiita.com/hayato94087/items/9b0cb9425701cbf14759

## その他インストール

brewがインストールに推奨されないソフトウェアもあるので、それぞれ個別にインストールします。

- [nvm](https://github.com/nvm-sh/nvm)

goのバージョン管理はgoの後方互換性を信じてやりません（必要な時がきたらやります）。

## Macの設定

### キーボードショートカット

- スクリーンショットの選択範囲を保存`⌘⇧4`と選択範囲をクリップボードにコピー`^⌘⇧4`を入れ替える
- 「F1, F2, etc.を通常のFunctionキーとして扱う」をON
- キーボード「次のウィンドウを操作対象にする」を`⌘@`から`` ⌘` ``にする。

### ディスプレイの設定

- ディスプレイのアレンジを変更して物理的な配置に合わせる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/ce6035d0-7427-f641-49d4-41772e806e80.png)
Macの上にディスプレイが来るようにしているのでこんな感じ。

### スクリーンロック

- すぐ切れると不便なので電源接続時は長めに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/e41be1af-0e23-04de-1e05-21df8b9b94a4.png)

### ドック

サイズは小さめ。アイコンが判別可能＆クリックちょうどいいくらいのサイズに。
いらないアプリは即Dockから消します。

## Office

MacのPowerPointだとフォント設定時に日本が選べないので、自分で作る必要があります。

https://note.com/tonaya/n/n4343ae854c03
Pythonで九九表

# はじめに
Python勉強用のために過去ほかの言語で勉強したコードをPythonでやりなおします
# code

```python:code
# 横列の表示
print("   ", end="")  # 先頭の空白を揃える
for i in range(1, 10):
    print(f"{i:3}", end=" ")  # ヘッダーの列幅を3に設定
print()  # 改行

# 各段の掛け算結果を縦に出力
for i in range(1, 10):
    print(f"{i:2} ", end="")  # 段の番号とスペースを合わせて揃える
    for j in range(1, 10):
        print(f"{i * j:3}", end=" ")  # 各結果を3文字幅で出力
    print()  # 段ごとに改行

```
# 解説
　{i * j:2} は Python のフォーマット文字列で、特に {} 内の書式指定を使って、整数を指定の桁数で表示する方法
 今回は２桁にそろえています
 参考：
 
 https://note.nkmk.me/python-f-strings/

 # 結果
 ![SnapCrab_NoName_2024-11-14_15-0-58_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531555/73742c6f-b466-683e-fcfc-350fe9388e75.png)

# 最後に
他の言語といったりきたりしていると頭がおかしくなりそうです。
OWASP ZAP(desktop)を用いたフルスキャンの手順

# OWASP(Desktop)を用いたフルスキャン

基本以下でまとまってる

https://qiita.com/sangi/items/ba7e3d39237045c9be36

## 流れの概略(躓いた際のメモも付記)
### プロキシ設定
* 今回はローカル環境で実施したため、ローカルホストを設定
（インターネット上に開発環境があるケースでは、リバースプロキシが必要）

### モード設定
* プロテクトモードに設定（コンテキストに登録したサイトのみを攻撃する）
* 標準モードでは管理外の外部サイトをスパイダーした際に攻撃する可能性がある⇒危険

詳細は以下が丁寧

https://sys-guard.com/post-17904/

### ターゲットサイトをFireFoxで開き、一通りの操作を行う
* OWASP ZAPのGUIのFireFoxは使わない　⇒　Webアプリケーションの特定の機能が使えなかったりする
* ブラウザのFireFoxを開き、ローカルプロキシを手動で設定
* スパイダーによるページ漏れを回避するため、一通りの操作を手動で実施する必要がある

### ターゲットサイトに認証が必要な場合
* 筆者のケースでは、フォーム認証が必要であった
* 以下を参考に、Form based authenticationの設定を実施

https://qiita.com/ponyanko_pon/items/f288f263e79f950a208a

https://www.n-novice.com/entry/2017/12/28/210000

* 重要な観点は以下の通り
    * 認証用パラメタ（userID, password）
    * ユーザ登録
    * セッション管理

### 攻撃前の事前設定
* コンテキストに設定
* 設定すると、アイコンに赤丸が表示

### 診断対象の確認
* 対象コンテキストを選択⇒スパイダーを実行
* 診断対象のサイトリストを取得。裏でクローリングしてくれる

### 問題なければ動的スキャンの実施
raspberryPi4でおうちVPN

OS : Ubuntu 24.04 server

# ネットワーク設定 netplan

### 拡張イーサネットポートのインターフェース名を固定する

まずは拡張イーサネットポートのMACアドレスを調べる
```
ip a
```
次にMACアドレスを指定して、そのネットワークインターフェース名を固定する
これをしないと再起動時に変更されてしまう可能性があります
```
echo -e 'SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="XX:XX:XX:XX:XX:XX", NAME="eth-baffalo"' | sudo tee /etc/udev/rules.d/99-nic-name.rules
```
設定を適用するために再起動


### netplanの設定ファイルを作成
（バックアップ推奨）
```yaml:/etc/netplan/01-netcfg.yaml

# 新規作成
network:
  ethernets:
    # ネットワークインターフェース名
    eth0:
      dhcp4: false
    eth-baffalo:
      dhcp4: true
  bridges:
    br0:
      dhcp4: false
      # IP アドレス/サブネットマスク
      addresses: [192.168.11.2/24]
      # デフォルトゲートウェイ
      # [metric] : 優先度を設定 (複数の NIC 搭載の場合に指定)
      # 値が低い方が優先度高
      routes:
        - to: default
          via: 192.168.11.1
          metric: 100
      nameservers:
        # 参照するームサーバー
        addresses: [192.168.11.1]
        # DNS サーチベース
        search: [srv.world,server.education]
      dhcp6: false
      interfaces:
        - eth0
      parameters:
        forward-delay: 0
        stp: false
      optional: true

  version: 2

```
設定を適用するために
```sh
netplan apply
```


元々存在するイーサネットポートが eth0
USBで拡張したイーサネットポートが eth-baffalo
また、仮想ブリッジを用いているのは、拡張イーサネットポートを外すことになったとき設定変更をやりやすくするため



### SoftEther VPN のインストールと初期設定

ソフトウェアインストールリンク生成

https://www.softether-download.com/ja.aspx?product=softether

アーキテクチャは ```umname -m```で確認
私のラズパイは aarc64 だったので ARM64 を選択

ダウンロードリンクをコピーし、```wget https://jp.softether-download.com/```で取得

ファイルを解凍
```sh
tar -xzvf softether-vpnserver-***.tar.gz
```

これ以降は公式ページに従って行った

https://ja.softether.org/4-docs/1-manual/7/7.3



# SoftEtherVPN ローカルブリッジ設定
今回は簡単のためにサーバー管理ツールを用いて設定した。
サーバー管理モードで接続するが、その前に管理者パスワードをvpncmdで設定しなければならない点に注意

https://ja.softether.org/4-docs/1-manual/7/7.4

ローカルブリッジ設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721392/261d27c8-58ac-2eb8-62ec-df639c553d04.png)

今回私は、仮想HUB名をvpnとして設定したため、先ほど設定したeth-baffaloとブリッジ接続（ついでにwifiのwlan0も繋いでおいた）

この時、拡張イーサネットポートを用いていない場合はbr0に接続すればOK

ただ混雑するのか速度は低速になります

以上の設定だけで簡単にVPNクライアントを家のネットワークと繋ぐことが出来ます。ポート開放とかの設定は割愛
Railsで親レコードの際にアソシエーション先の子レードが削除できない場合には削除されないようにする

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題を解決することができます。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提
親：子 ＝ 投稿：コメント
という親子関係で、親レコードの作成と一緒に子レコードの作成、親レコードの削除と一緒に子レコードの削除を行いたいということがあります。

その際に、親レコードを削除子レコードが特定の条件の場合には削除できないというバリデーションをつけたいということがあったので、その書き方をメモとして残しておきます。

# 実装内容
親レコード：Post、子レコード：Comment
という形の構造です。

親レコードであるPostモデルに `bofore_destroy` でバリデーションをつけます。
この際に、`prepend: true` オプションを忘れずにつけなければなりません。

`prepend: true` を指定すると 子レコードを実際に削除する前に、処理を行ってくれるようになります。

```ruby:app/models/post.rb
  before_destroy :check_delete_post, prepend: true

  private

  def check_delete_post
    ActiveRecord::Base.transaction do
      comments.each do |comment|
        unless comment.destroy
          errors.add(:base, "コメント：#{comment.id}が削除できなかったため、ユーザーを削除できませんでした。")
          raise ActiveRecord::RecordNotDestroyed
        end
      end
    end
  rescue ActiveRecord::RecordNotDestroyed
    throw(:abort)
  end
```

投稿に紐づくコメントが1つでも削除できないものがあった場合には、ロールバックしてコメントを1件も削除せずにエラーを出すようにします。


```ruby:app/models/comment.rb
  before_destroy :check_destroy

  private

  def check_destroy
    if status == "published"
      errors.add(:base, "コメントが公開されているため、削除できませんでした。")
      throw(:abort)
    end
  end
```

# 参考記事

https://tech.actindi.net/2016/01/07/3661113852
開発用にMacBook Pro を購入したから環境設定する 1

## Homebrew のインストール
Homebrewで入れられるものはすべてHomebrewでインストールしようと考えているが、
まずはHomebrewがないと何も始まらないため使えるようにする。

### ターミナルの準備
Launchpad上で右クリックしてその他タブからターミナルを選択
![ターミナルの開き方](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892313/100abe85-82b0-a45c-eeab-f67b27e75f4f.png)

### サイトへアクセス
購入したばかりでなんのブラウザも入っていないため、Safariで公式サイトへアクセス。

[Homebrew(日本語版)](https://brew.sh/ja/)

サイトのコードをコピー
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

## ターミナル操作
1\. 準備しておいたターミナルを開き、右クリックで張り付け（またはCommand V)実行する
2\. passwordを要求されるため自身のMacBookのロック解除に使用しているパスワードを入力
![brewPassWordターミナルスクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892313/28ea7638-0613-8435-f99e-f5250dddd139.png)

3\. Rerurnキーを押下
![brewReturnKeyターミナルスクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892313/f10f0c34-e90d-b42d-0774-51483ad663d5.png)

4\. Pathを通すため、.zprofileに必要な情報を書き込む
```
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名が入ってるはず/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
```
:::note warn
↑コードを書きはしたがターミナルにあるものをコピーしてください
:::

5\. 問題なく書き込まれたかを確認する
```
open /Users/ユーザ名/.zprofile
```

6\. ターミナルに再読み込みさせる
```
source /Users/ユーザ名/.zprofile
```

7\. 問題なくHomebrewがインストールされたかを確認
```
brew -v
```

Homebrewのバージョン情報が表示されたら完了
![brewCompleteターミナルスクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892313/6e62f9e1-3a0d-e458-9dda-c519928870d9.png)
Vue.jsでテスト実行まで触れてみた。

# Vue.jsやってみよう
最近の技術に触れてないので、なんとなく有名なやつを触れました。

## 環境構築
### VueCLIのインストール
以下のコマンドを流して`npm run`まで進めます。
プロジェクトオプションは全てデフォルトで行きます。

```
npm install -g vue-cli
vue init webpack my-project
cd my-project
npm install
npm run dev
```
成功したら、下記のようなログが出ます。
> DONE  Compiled successfully in 5051ms 18:04:32
> I  Your application is running here: http://localhost:8080

`http://localhost:8080`にアクセスすると、親より見た画面が表示されます。
![welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131573/6b80e4ab-eb78-815e-48f3-d87c5132ad2b.png)

ついでにSASSを使う準備もしておきます。
```
cd src
npm install sass-loader node-sass --save-dev
```


### 1-a.テストを流してみる
とある方がテストを流していたので、試してみます。
Vueのe2eテスト初体験です・・・！
```
npm test
〜 中略 〜
FAIL  test/unit/specs/HelloWorld.spec.js
  ● Test suite failed to run

    SecurityError: localStorage is not available for opaque origins
```

はい。失敗しました。
原因は`jest.conf.js`の設定にありました。
以下の`testURL`を追加する必要があるようです。

```
module.exports = {
  testURL: 'http://localhost/',
  rootDir: path.resolve(__dirname, '../../'),
...
```

今度こそテスト実行します。

```
 PASS  test/unit/specs/HelloWorld.spec.js
  HelloWorld.vue
    ✓ should render correct contents (22ms)

----------------|----------|----------|----------|----------|-------------------|
|  File         |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------------|----------|----------|----------|----------|-------------------|
All files       |      100 |      100 |      100 |      100 |                   |
 HelloWorld.vue |      100 |      100 |      100 |      100 |                   |
----------------|----------|----------|----------|----------|-------------------|

```
とりあえず時間がないのでテストまで。。。
次回は、RSSリーダを作成できたら良いな。。。

## 参考にさせて頂いた記事
https://qiita.com/kennyttotheleft/items/2d6c3942dc07b8dd6e37


＊追記
タイトルを修正いたしました。
誤解を招いてしまい、すみません。。。
軍儀の盤面を表現する文字列「GFEN」の提案

# 軍儀とは

マンガ「HUNTERxHUNTER」の劇中ゲームが商品化されたゲーム
https://store.universal-music.co.jp/s/hunter-gungi/

# GFEN

GFEN(Gungi Forsyth-Edwards Notation)
軍儀の盤面を表現する文字列

# 前身

## FEN（チェス）

https://ja.wikipedia.org/wiki/Forsyth-Edwards_Notation

## SFEN（将棋）

https://qiita.com/samakusa/items/fe183f0c3f2b4c905ba5

# GFEN(局面)

## 構成

局面のGFEN文字列は「(盤上) (手番) (持ち駒) (手数)」の形式。

手数は、直前の区切りスペースと共になら省略してよいものとする。

## 盤上

盤上の配置に関する決まりごとは以下の通り。

- 1行目の左側から駒の種類(駒の表記参照)を左から右に向かって表記していく（記述の順序に図示）
  - マスの駒は3段まであるので、1マスにつき1段目～3段目までを3文字で表記する
  - 高さが3段未満で空きがある場合、駒がある段が終わったら`.`で表記する
- 行ごとの区切り文字としてスラッシュ`/`を表記する
  - 1行目/2行目/.../9行目 となる
- 駒のないマスは、連続するマスの数を数字で表記する

### 記述の順序（前身のSFENから引用）

順序は以下と同じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642/69722b8b-6e06-9c80-128d-9a79db246a0d.png)


### 駒の表記

| 駒  | 先手 | 後手 | 
| --- | ---- | ---- | 
| 帥  | K    | k    | 
| 大  | R    | r    | 
| 中  | B    | b    | 
| 小  | G    | g    | 
| 侍  | S    | s    | 
| 槍  | L    | l    | 
| 馬  | V    | v    | 
| 忍  | N    | n    | 
| 砦  | T    | t    | 
| 兵  | P    | p    | 
| 砲  | O    | o    | 
| 弓  | Y    | y    | 
| 筒  | U    | u    | 
| 謀  | X    | x    | 

## 手番
1文字で表記する。
先手は`b`、後手は`w`と表記する。

## 持駒
「(先手の持ち駒)(後手の持駒)」の形式で表記するが、順番は任意。

どちらも持ち駒がないときは`-`と表記する。

持ち駒ひとつひとつは、その枚数+駒の種類(1枚の場合は省略)で表記する。

例：先手が兵2枚、弓1枚。後手が兵3枚、侍2枚、砲1枚、筒1枚持っている場合、`2PY3p2sou`となる。

## 手数

手数が数値で書かれる。
省略可能。

## 例
### 例1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642/1139528b-c6d6-16b5-4cdf-8d0128297bab.png)


`8k./9/6R.2/7V.V./9/9/9/9/9 - b`

# GFEN(指し手)

## 構成

指し手のGFEN文字列は「(移動元のマス目文字列 or 持駒)(移動先のマス目文字列)(取りorツケor入れ替え)」の形式。

移動元の一番上の駒を、移動先の一番上に移動するので、前の2つはXY座標のみでよい。



持駒を打つ場合は、マス目文字列の代わりに、駒の1文字だけと表記する。

駒の文字は、局面の駒の表記に準じる。そのため、先手後手で同じ駒でも違う文字になる。

取りorツケor入れ替えは、以下に従う。
- ツケる
  - `A`と表記する
    - 味方の駒の上にツケる場合、表記してもしなくてもよい
  - 移動させた駒が謀であり、下段の敵駒の入れ替えをおこなう
    - 入れ替えた段について、`C`と表記する
    - 入れ替えなかった段について、`.`と表記する
      - 入れ替えをまったくしなかった場合、あるいは下段に味方の駒しかなかった場合、`C`と`.`について表記を省略してよい
    - 1段目、2段目の順に、連続で表記する
    - 例：`CC`, `C.`, `.C`
- 取る
  - 何も表記しない
- 移動(何もないマス)
  - 何も表記しない

いくつかの種類の指し手について、複数の表記法があることになるが、実装ではどれにするかをなるべく固定した方がいいだろう。

## マス目文字列

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642/c9d8f543-ae96-7380-1220-8f9a25dc4379.png)


## 例

## 例1

※ありえない着手も、持駒が無限にあるとして考える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642/4ca2aecd-7de4-a129-5f43-6610e6a64251.png)


上記局面で、先手が、一番右の馬を2つ前に動かした場合

`1d1b`

上記局面で、先手が、一番右の馬の1つ前に馬を着手した場合

`V1c`

上記局面で、先手が、一番右の馬を左の馬にツケた場合

`1d2d`または`1d2dA`

## 例2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642/628c8842-d192-73f1-03a9-f351efcc8581.png)

上記局面で、先手が、謀を右上に動かして馬を取った場合

`4c3b`

上記局面で、先手が、謀を右上に動かしてツケた場合

`4c3bA`または`4c3bA.`

上記局面で、先手が、謀を右上に動かしてツケて馬を入れ替えた場合

`4c3bAC`
Railsで親テーブル（親レコード）に対して子テーブル（子レコード）から複数の紐付きをする際のアソシエーション設定

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題を解決することができます。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

親子関係のあるテーブルで子レコードが親レコードに2つの紐付きがある場合のアソシエーションのさせたい場合がありました。

例えば、商品（Product）があり、その商品の詳細画面でおすすめの商品を3つ表示したいという場合です。
この場合、商品テーブル（products_table）に紐づく形でおすすめ商品テーブル（product_recommend_products_table）を作成しました。
そうなると`product_recommend_products_table` から `products_table` に対して、2つの外部キーを紐づける形になります。

その際に、Railsのアソシエーションの設定が少し複雑だったので、備忘録として残しておきます。


# 実装

Productモデルのアソシエーションの書き方

```ruby:app/models/product.rb
class Product < ApplicationRecord
  has_many :product_recommend_products, foreign_key: :associated_product_id, dependent: :destroy, inverse_of: :associated_product
  has_many :recommend_products, through: :product_recommend_products, source: :recommend_product
end
```

ProductRecommendProductモデルのアソシエーションの書き方

```ruby:app/models/product_recommend_product.rb
class ProductRecommendProduct < ApplicationRecord
  belongs_to :associated_product, class_name: 'Product', foreign_key: :associated_product_id
  belongs_to :recommend_product, class_name: 'Product', foreign_key: :recommend_product_id
end
```

# 参考記事

https://stackoverflow.com/questions/6559164/rails-associations-has-many-through-but-same-model

https://techtechmedia.com/inverse-of-rails/
217日目 Amazon Lexについて学んだ社畜M

## ♠はじめに
こんにちは、社畜Mだぜ。
今回は俺が以前調べたAWSの機能の一つ「Amazon Lex」について俺なりにまとめてみたぜ。

さぁ、行くぜ！！！

**デュエル！**
## ♠Amazon Lexとは
俺のターン！Amazon Lexを説明していくぜ。
Amazon Lexは、自然言語理解 (NLU)と自動音声認識 (ASR)を統合したサービスで、開発者が簡単に会話型のチャットボットや音声アプリケーションを構築できるプラットフォームです。
実際私たちの知っている会社だとNTTが利用してコールセンターの稼働削減に調整していたりします。

画像で出てきている**AmazonConnect**とは、簡単な説明として企業が顧客対応を効率的に行うための柔軟な通話およびチャットシステムを提供しているシステムです。

NTTでは、Amazon Connectに通話リクエストが来た際、設定されたフローに従って自動的にAmazon Lexを呼び出すことができます。このプロセスでは、顧客からの問い合わせ内容をLexが理解し、必要な情報を取得します。
例えば、顧客が「セミナーの予約をしたい」と言った場合、Lexはそのリクエストを認識し、予約に必要な情報（参加日や人数など）を尋ねます。これにより、オペレーターが介入することなく、自動的に予約を完了させることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/967f876e-d6a3-3270-a5ed-475712113e8e.png)
※[Amazon Connect×Amazon Lexで自動応答やってみた！](https://business.ntt-east.co.jp/content/cloudsolution/ih_column-25.html#section-1)


## ♠Amazon Lexの有用性
次にAmazon Lexの有用性についてだ。
- **カスタマーサポートの自動化**
カスタマーサポートにおけるFAQや簡単な問い合わせを自動化することで、対応時間を短縮し、サポートチームの負担を軽減。ユーザーがよく尋ねる質問を自動的に処理するボットを構築することで、顧客満足度も向上します。
　　
- **業務プロセスの効率化**
社内向けボットを作成して、従業員のITサポートや業務プロセスを支援。たとえば、システムアクセスのガイドやパスワードリセットを自動化することで、生産性を向上させることができます。
　　
- **マーケティングとエンゲージメント**
チャットボットをSNSやWebサイトに組み込むことで、訪問者と即座にコミュニケーションを取り、エンゲージメントを高められます。たとえば、新商品の紹介やキャンペーン情報の提供をボットがリアルタイムで行い、コンバージョン率を高めることができます。
　　
- **24時間体制でのサポート**
Amazon Lexを使用することで、24時間365日対応可能なサポートボットを構築できます。これにより、ユーザーはいつでもサポートを受けることができ、顧客からみた印象などが向上します。
<br>

## ♠Amazon Lexを使うときのポイント
Amazon Lexは便利だがもちろん使うときには注意点もあるぜ。
- **多様な発話パターンを考慮**
ユーザーの話し方は人それぞれです。予想外の言い回しが出てくることも多いので、インテントにはできるだけたくさんのサンプルフレーズを登録して、幅広い表現に対応できるようにしましょう。
　
- **インテントとスロットの設計における精度のバランス** 
インテントを増やしすぎると誤認識が発生しやすくなります。複数のインテントが似通っている場合、それぞれのスロットや応答の設計を工夫し、認識精度を維持することが大切です。
　
- **応答の過不足を避ける**
ボットの応答がユーザーの期待に対して過剰または不足していると、ユーザー体験が損なわれます。たとえば、簡潔な問い合わせに対して必要以上に詳細な説明をすることで逆に混乱を招くことがあります。適切な情報量を意識しましょう。
　
- **音声認識の環境要因**
音声入力を利用する場合、周囲のノイズや音質の変動が影響を及ぼします。利用環境に合わせてテストを行い、音声認識の精度がどのように変動するかを確認してください。
　
- **データ保護とセキュリティ** 
会話型アプリケーションは個人情報を扱うことがあるため、データの保護や暗号化は必須です。Amazon LexではAWSのセキュリティ機能を活用し、ユーザーデータが安全に管理されるよう配慮する必要があります。
　
- **料金モデルを把握する**
Amazon Lexの料金は使用量に応じて変動します。開発段階や負荷テストの際にコストが予想以上にかからないよう、料金モデルを理解し、適切なリソース管理を行いましょう。
　
- **外部システムとの連携の複雑さ**
複雑な動的処理を行う場合、AWS Lambdaを活用して外部APIやデータベースと連携することが多いです。外部システムの応答速度やエラーハンドリングも考慮し、スムーズなデータフローを維持できるように設計します。

<br>

## ♠まとめ
Amazon Lexは初心者でも始めやすい会話型AIサービスです。カスタマーサポートの自動化や業務効率化、マーケティング強化など幅広い用途に対応。サーバーレスでスケーラブルな設計は、小規模から大規模な企業まで、誰でも手軽に導入できます。

## ♠おまけ
今回の社会人が知っておいた方がいいビジネスマナーはこいつだ！
「**訪問時は最低限のマナーを**」だぜ。
顧客や取引先などを訪問する際、事前に準備しておくことは大事だ。もしもたまたま近くに立ち寄って突然訪ねることになっても、最低限のマナーとしてアポイント（会議や打ち合わせなどの予定を事前に取り決めて設定する）を取ることだ。
だが、アポイントを取ったとしても下記のことも忘れてはいけないぜ。
**1.忘れ物はないか**
**2.身だしなみは清潔か**
**3.余裕を持って到着できるか**
これは最低限確認しておくことは大事だぜ。
万が一予定時刻に間に合わない場合、必ず連絡を入れることも忘るなよ？

今回はここまでだぜ！！！
**俺はこれでターンエンド**
csvのカラムを簡単に並べ替える

- [なぜやるのか](#なぜやるのか)
- [どうやるのか](#どうやるのか)


# なぜやるのか

そこそこの行数のcsvを頻繁に扱う案件があり、読み込むデータの統合を簡単にやりたかった。
pandasの様なライブラリを使えば出来るが、より簡単にやりたかった。

# どうやるのか

csvkitに含まれるcsvcutを使う。
インスコ方法などはググってください。

```
$ zsh --version
zsh 5.9 (x86_64-apple-darwin21.3.0)
```

読み込むファイル(sample.csv)

```
column_A,column_B,column_C,column_E,column_F,column_D
0,1,2,4,5,3
```

```
$ csvcut -c column_A,column_B,column_C,column_D,column_E,column_F sample.csv 
column_A,column_B,column_C,column_D,column_E,column_F
0,1,2,3,4,5
```

結果を別ファイルとかにしたいときはリダイレクト使う

```
$ csvcut -c column_A,column_B,column_C,column_D,column_E,column_F sample.csv > result.csv
```

標準出力とかコマンドの結果を入力にしたいときはパイプで

```
$  cat sample.csv |csvcut -c column_A,column_B,column_C,column_D,column_E,column_F
column_A,column_B,column_C,column_D,column_E,column_F
0,1,2,3,4,5
```
scaffdogの機能を利用して、playwrightとNext.jsのpageを作成するためのtemplateを作成する

# scaffdogの機能を利用して、playwrightとNext.jsのpageを作成する

## 0. 想定しているdirectory

```
project-root
|- src/app  // app router directory
|- e2e      // e2e directory
```

## 1. how to

outputの機能を利用してしまった場合にはパスが取りづらくなってしまうため、
nameの形式で入力してもらうことを想定しています。

```
routingが、sample/sample2の場合は[sample/sample2]。
singleやdyanamicの場合も、
/sample -> sample
/sample/[id]/sample2 -> sample/[id]/sample2
を想定しています。
```

https://gist.github.com/ziiima/86de170af7fb114fe7ff70465ca4c41b
音量ミキサー、windows7、表示されない、で検索

以前にも「ある日、気がつくとタスクバーから音量が消えていた」ことがあって結構に探したように覚えてましたが再発してまた結構に探しましたのでちゃんと記録しておこう、と。

今更。 ww

普通に辿って操作して何とかなるようなら何の苦労もないんですが検索して出てくるのはそんなのばかりで、…

役に立ったのは

https://j-press.info/kowaza/windows7-volume-ico/

というページの下半分、「グレーアウト時の対処方法」がソレ。 やはりレジストリ操作しないとダメな件のようです。 前回何をしたかは全く覚えていませんで、正に喉元過ぎれば的な失態ですな。

とにかくこれで出るようになりました、という報告というか資料ということで了。
働かないおじさんの正体とは

## 私も無事働かないおじさんになったので投稿

こんにちは！私はとある大手の会社でぬくぬくと過ごしている者です。

どれくらいぬくぬくしているかというと、この記事を執筆している時点で年内あと47日なんですが、もう年内の仕事がすべて終わっているような状況です。

## 働かないおじさん問題とは

働かないおじさん問題とは、職場で全く働いていないように見える給料泥棒のようなおじ様たちのことを言います。

給料だけが高く、たとえばExcelが全くできない、生成AIなんていうものはChatGPTという単語さえ知らないようなおじさまが高給をもらっている例が多いようです

私の以前の職場で社長の知り合いということで子会社の社長になり、2000万以上の収入をもらっている方がいました。

その方は朝からずっと日経新聞を読んでいて外出することもあるのですが、基本的には同僚の同年代の社員とおしゃべりして１日が終わっていました。

そんな働かないおじさんですが最近私は考え方を改めたので私が考えを改めた経緯などをご紹介いたします。

## 働かないおじさんは線で考えてほしい

結論から言うと、働かないおじさんとは実は高給取りで何も仕事をしてないおじさんではなかったということです！

たとえば忖度という言葉があります。他人の気持ちを推し量り、何か見返りになることを優先的に融通してくれる悪しき風習ですが、忖度してもらえるような身分になるため、おじさんたちは日夜頑張っていたのです。

働かないおじさんになるためには、人間関係が重要です。よい人間関係を築いたからこそ忖度してもらえたり、優先的に良いポジションをまわしてもらったんだと思ってます。

## 働かないおじさんにあなたもなろう！

いつか私たちは歳を取っていきます。年齢を重ねて転職先を探しても、年齢ではじかれるようになってしまいます。

あなたがたとえ働くおじさんだとしても、年齢というものは時として不利に働くことが多いんです。

しかし働かないおじさんは年齢のことなんて関係ありません。

なぜなら働かないおじさんには仕事をまわしてくれる知り合いがいくつもいて、面識のない人と面接をするようなことがないからです。

働かないおじさんにいったんなってしまえば、安泰なんです！

ここからは働かないおじさんになるためのやり方を紹介します。

これは私が働かないおじさんたちをみて感じたことです。

## 働かないおじさんになる方法①人間関係を築くことに振り切る

働かないおじさんだと私が思っている人にある日言われたアドバイスが「男芸者に徹しろ！」でした。

確かに私の周りのいつ働いているかわからないような働かないおじさん化してるような人たちは仕事よりもより良い人間関係を築くことを意識している気がします。

良い人間関係を会社の役員様と築けると有利な仕事がもらえます。その仕事をこなせばもっと困難な数多な仕事より圧倒的に評価され、釣り合わない報酬を得ることができるんです。

## 働かないおじさんになる方法②自称も含めた知り合いが多い

たとえば役員の方と知り合いになりたいと思っても知り合いになれるものではありません。

そこで、役員の方がいつも話しているような「役員の友達」と知り合いになるんです。

そうすると結果としてあなたのことを紹介してくれる機会にも恵まれると思います。

働かないおじさんの口癖として「おれの知り合い」というキーワードがよく出てきます。

多分1回話したことがあるかないかだと思いますが、こっちから知り合いと言ってしまえばそのことについて深く詮索されるようなことはないです。

「おれの知り合い」というフレーズは、働かないおじさんの人脈の広さを誇示することができる魔法の言葉です。

## 働かないおじさんになる方法③動かないけれど堂々としている

働かないおじさんはサッカーでいうところのフォワードにあたります。

フォワードの仕事は点をとることですから守備は基本的にしなくていいわけです。

逆に守備をしていると決定的なチャンスで体力が残っていないなんていうことになります。

働かないおじさんにとって大事なのは大物感です。

フォワードでいうとコートジボワールにいたドログバ選手のような存在感。

働かないおじさんの働く時はめっちゃいい仕事する雰囲気のだし方、それは一緒に働けばわかりますが、もう国宝級の何かすごいことができそうな雰囲気です。

## 働かないおじさんになる方法④小太り体系で自転車好き

私がみた働かないおじさんはみんなどこか小太りです。

できれば毛髪の量も少ないのが理想です。

その太り方ですが、アメリカ人の貧困層のような太り方のイメージではなくどちらかというと力士のような太り方です。

胸板が厚い感じの太り方です。それは自転車で坂道を駆け上がったりすることで鍛えることができます。

ジムに行くのもいいと思います。

体型は太いけれど体幹はしっかりしているイメージです。




## 結論

私は働かないおじさんになろうとしてますが、実は週末や夜遅い時間に仕事をすることが多いです。

そう、働かないおじさんとは本当に働いていないおじさんと働いているところを人に見せたくないおじさんがいるんです。

私はポジティブに生きていきたいから働かないおじさんを目指していくつもりです。

働かないおじさんになるためめちゃくちゃ勉強して努力していきます。

その努力は働かないおじさんという結晶になって将来報われるはずなんです。

私としてはより自由に働きたいので働かないおじさんの研究をもっとしていき、この記事をもっと更新していきたいと思ってます。
UVを切り替えたい

mayaでマルチUVチャンネルを持つメッシュにて、
マテリアルごとにUVを変えて使用したい場面がありまして。

通常であれば、
rerationShipEditorからポチポチやるのかなと思うのですが
メッシュが大量にあると日が傾いてしまうので一気にやりたくなりました。

調査
--

とりあえずそれっぽいコマンドが無いかを探してみるとー

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/uvLink.html

これっぽいですね。

```python
import maya.cmds as cmds
cmds.uvLink(uvSet='pCylinderShape2.uvSet[3].uvSetName', texture='checker4' )
```
uvSetのオプションには　UVSetの名前をstringで渡す感じかとおもったら、これアトリビュートですね。
対象のUVsetのuvSetNameアトリビュートをstringで与えるんですね。

となると、　接続したいuvSetNameがどのindex(uvSet)にあるかを確認しないとなりませんね。
ひとまずUVSetのindex総当たりで検索かけるとこんな感じでしょうかね。
多分API経由だともっと賢く取れると思います。

```python
def findUVsetIDfromName(mesh,uvSetName):
    uvIndex = cmds.getAttr(mesh  + ".uvSet", mi =True)
                
    if uvIndex == None:
        print(mesh + " donot have any UVsets-----")
        return None
        
    else:
        for index in uvIndex:
            uvSetName  = cmds.getAttr(mesh  + ".uvSet["+str(index)+"].uvSetName")
        
            if setUVsetName != uvSetName:
                continue
            else:
                return index            
    return None                
    
```


とりあえず実装
--



```python
import maya.cmds as cmds

def findUVsetIDfromName(mesh,uvSetName):
    uvIndex = cmds.getAttr(mesh  + ".uvSet", mi =True)
                
    if uvIndex == None:
        print(mesh + " donot have any UVsets-----")
        return None
        
    else:
        for index in uvIndex:
            uvSetName  = cmds.getAttr(mesh  + ".uvSet["+str(index)+"].uvSetName")
        
            if setUVsetName != uvSetName:
                continue
            else:
                return index     
    return None

def setUVset(targets,targetTextureName,uvSetName):
    for mesh in targets:
        uvIndex = findUVsetIDfromName(mesh,uvSetName)
        if uvIndex == None:
            continue
                
        cmds.uvLink(texture= targetTextureName,uvSet=mesh  + ".uvSet["+str(uvIndex)+"].uvSetName")

targets = ["pSphere1","pSphere2","pSphere3"]
targetTextureName = "ramp1"
setUVsetName = "uvSet"
setUVset(targets,targetTextureName,setUVsetName)

```

こんなデータを作って実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/53db83eb-0d5d-68e5-00bc-2119248dc8ac.png)

お、UV切り替わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/081b0731-57a5-9ead-c4a0-e641c6b3f5a7.png)

一気にUVの切り替えをできるようになりました。

現行ですとテクスチャー名を指定してますが、
シェーダー名からアサインされてるオブジェクトに対して実行する
など　もう少し使い勝手を良くできる気はします。
文字列の置き換え（CodePen）

## なにはともあれ
以下が実物です。よければ使ってください。

<p class="codepen" data-height="800" data-default-tab="result" data-slug-hash="YzmgXpE" data-pen-title="文字列の置き換え" data-user="8787kazuye" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/8787kazuye/pen/YzmgXpE">
  文字列の置き換え</a> by 8787kazuye (<a href="https://codepen.io/8787kazuye">@8787kazuye</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 経緯とか
最初は手作業で文字の置き換えをして、少ししてから検索置換ツールを使って文字の置き換えをして、としていました。しかし、なんかうまく動かなかったり、もっといっきに置換したい！となり、作ることにしました（といってもほとんどChatGPTがやったんですが）。
CodePenでつくってあるので、もし自分好みに作り替えたい方がいたらつかってください。なにとぞ！
SAA-C03対策メモ

# データベースとストレージ
**Redshift**
* データウェアハウス用DBであらゆるデータを構造化して格納し高速での分析が可能。
クラスターの起動時間とスナップショットのデータ量に応じて料金が加算される。
* Redshift SpectrumでS3バケットに保存されたファイルに対して高度なクエリを実行できる

**StorageGW**
* オンプレミス環境のストレージをS3へ接続して拡張できる
1、ファイルゲートウェイ(ファイルストレージ)：データファイルやバックアップイメージをS3に保存
2、ボリュームゲートウェイ(ブロックストレージ)：オンプレミスアプリケーションにクラウドバックアップを提供
→キャッシュ型(プライマリがS3)から保管型(プライマリはオンプレミス)の選択
3、テープゲートウェイ：S3とGlacierにデータを保管する仮想テープストレージとVTL管理を提供する

**Amazon Kinesis Data Stream**
* ストリームデータ処理に利用するサービス。

**Amazon Kinesis Data Firehose**
* ストリームデータを変換したり、ストレージやDBへ配信するサービス。

**Aurora**
* マルチAZで分散されたクラスター構成により、従来のRDSよりも高速高性能なリレーショナルDB。最大で15個のレプリカを作成し、プライマリDBに障害が発生した場合はレプリカを昇格することでダウンタイムを最小限に抑える。
* また、グローバルデータベースによって複数のAWSリージョンにレプリカDBインスタンスを展開することも可能。リージョン間では低レイテンシーの読み取りが可能。

**DynamoDB**
* Key-value型のNOSQLDB。フルマネージドサービス。サーバレスで、追加料金でデフォルト暗号化の設定ができる。
* テーブルサイズは無制限だが、1つのデータは400KBまで。
*  
以下、２つのモードがある
１、オンデマンドモード：利用するキャパシティが予測できないときに選択する。リクエスト数に応じて自動スケーリングを実施して課金される。

２、プロビジョニングモード：利用するキャパシティが予測できるときに利用する。事前に予想したキャパシティユニット(WCUとRCU)を設定する。設定したCUによって課金される。キャパシティ容量に近くなるとHTTP400コードとProvionedThroughputExceptionが発せられる。

* DynamoDBストリームでイベントをトリガーにLamdaを起動して非同期的に処理をすることも可能

# コンテナ

**AWS ParallelCluster**
* HPC(ハイパフォーマンスクラスター)をデプロイおよび管理するサービス。必要なコンピューターリソース、スケジュール、共有ファイルなどを自動で展開可能。

**EFA**
* 大規模ネットワークで高いレベルの通信を必要とするアプリケーションのためのネットワークインターフェース。EC2のみで使用可能。

**Amazon ECS**
* Docker形式のコンテナサービス

**Amaznon EKS**
* Kubernetes形式のコンテナサービス

**コンテナサービス**
* EC2起動タイプとサーバレスのFargate起動タイプがある
→EC2起動タイプの場合はインスタンスタイプやサイズなどを設定する必要あり

# EC2
**Auto Scaling**
* 事前に設定した閾値をもとに対象のインスタンスをスケーリングする
* インスタンスの起動に24時間失敗し続けると起動を停止する
* インスタンスの状態がImpaired(障害)となると数分間チェックされるが、リカバリーされない場合は新しくインスタンスを起動してImpaired状態のインスタンスを終了する
* 障害調査時はAutoScalingグループを停止→インスタンスの停止→調査のスッテプが必要(インスタンスを先に停止すると新規に立ち上げてしまうため)
* スケーリングポリシー
１、簡易スケーリング：閾値としては１つ設定する
２、ステップスケーリングポリシー：複数の閾値を設定し、段階的にスケーリングする
３、手動スケーリング：手動で調整してスケーリングする
４、スケジュールされたスケーリング：スケーリングする日時を指定しておく

**インスタンスの購入方法**
* オンデマンドインスタンス：使用した量を秒単位で支払う。
* リザーブドインスタンス：１年または３年の期間利用を予約することでオンデマンドより割引できる
* スポットインスタンス：AWSの余っているリソースを利用して格安で利用するプラン。状況により、インスタンスの停止が強制される。

**AMI**
* インスタンス起動の設定イメージ
* AMIを複数のアカウントで共有するにはLaunchPermissionプロパティの変更が必要
* 暗号化されている場合は複合化するためのKMSキーも共有することが必要

 **セキュリティグループ**
* 設定の方法としてはCIDRを指定してIPアドレスの範囲を設定するか、別のセキュリティグループIDを設定する
* 設定の変更は即時にEC2に反される

# VPCと接続