OmniAICreator/Qiita-1.07M huggingface dataset:
論文読んでみた【Red Color and Risk-Taking Behavior in Online Environments】

# はじめに
ウェブアプリを作成する上で、色の使い方って重要ですよね。
特に心理学の観点から色がユーザにもたらす効果を理解することは重要だと思います。
そこで、今回は2015年に発表された論文「Red Color and Risk-Taking Behavior in Online Environments」に基づいて、色、特に赤色がユーザにどのような影響を与えるかを考察していきます！！

こちらの論文はオンライン環境における<font color="Red">赤色</font>がリスクテイキング行動に与える影響について調査したものです。
※[リスクテイキング行動](https://studyu.jp/feature/theme/risk-taking/)：成功する可能性と失敗する可能性がある状況で、リスク（危険）を伴う選択や行動を選ぶこと。

# 論文
- タイトル
Red Color and Risk-Taking Behavior in Online Environments
- 著者
Timo Gnambs、Markus Appel、Aileen Oeberst
- 投稿場所
PLOS ONE (2015)

## 赤色の特徴
色彩心理学の研究によると、色は単なる視覚的な情報だけでなく、ユーザーの心理的な反応を引き起こす力を持っているそうです。その中でも、赤色は危険や警告を連想させる色として認識されています。
普段の生活の中でも、信号機の「止まれ」や電車内での緊急停止ボタン、レッドカードなど「赤」が使われている場面は危険や警告を表していることがわかりますよね。

## 赤色がリスク回避行動を促す理由
この論文では、赤色がリスクテイキング行動にどのように影響を与えるかを、2つの実験を通じて明らかにしています。

### 実験1
実験1では、赤色が危険信号として作用し、参加者がリスクの少ない選択肢を選ぶようになるかどうかを検討しました。
- 方法
参加者に異なるリスクを持つ2つの選択肢を提示し、どちらかを選ぶタスクを与える。
- 結果
赤色が表示された場合に、よりリスクの少ない選択肢を選ぶ傾向が見られた。

### 実験2
実験2では、実際の行動を伴うリスクテイキング行動において、赤色がどのような影響を与えるかを検討しました。
- 方法
バルーンアナログリスクタスク（BART）と呼ばれる競争的なゲームを使用し、赤色が実際のリスクテイキング行動にどのように影響するかを調査。このゲームでは、参加者はバルーンを膨らませてポイントを獲得するが、バルーンが破裂するリスクも増加する。
- 結果
赤色のバルーンでは、参加者はバルーンを過度に膨らませることが少なく、バルーンが破裂する頻度が低くなる傾向が見られた。

### まとめ
2つの実験の結果から、赤色がユーザーに対して潜在的なリスクを強調し、より慎重な行動を促す効果を持つことが示されました。
オンラインバンキングなどセキュリティ関連の決定が求められる場面などでは、赤色を効果的に使うことで、ユーザーが慎重に行動するよう誘導できるかもしれません。

# 論文を読んでみて
## ウェブアプリ開発における色の選択の重要性
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/a33a2ee8-081b-5890-e019-d09d3834d906.png">
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/b2469bdc-082c-db03-203d-9cad9b1b9f29.png">


実際に見てみるとそれぞれの色から受ける印象が違うことがわかると思います。

ウェブアプリのデザインにおいて、色は単なる視覚的な要素以上の意味を持つことを改めて理解しました。ユーザーの注意を引く、誘導する、または感情的な反応を引き出すために、適切な色を配置させたデザインを心がけていきたいです。

# 終わりに
今回は、ウェブアプリを作成する際の、<font color="Red">赤色</font>の効果的な利用方法について学ぶことができました。
みなさんもデザインをする際は、色の持つ心理的な効果を意識してみてはいかがでしょうか。
私も今後、それぞれの色がユーザに与える心理的な影響について調査を続けて、シリーズ化していくつもりです。

それでは皆さん、次回の【この色どんな効果？】シリーズでお会いしましょう！！

# 参考文献
この記事は以下を参考にして執筆しました。
- T. Gnambs et al.,Red color and risk-taking behavior in online environments, 
PloS One (2015), https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0134033

- スタディラボ.「なぜ人は危険な行動を選択するのか？ 【リスクテイキング行動】の研究が目指す安全な社会」.2022-12-12, https://studyu.jp/feature/theme/risk-taking/ ,(参照 2024-8-26).
Pythonを使った3Dグラフの表示

f3という関数を様々な方法で表現する。

## 数値を色で表現する
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def f3(x0, x1):
    r = 2 * x0**2 + x1**2
    ans = r * np.exp(-r)
    return ans

xn = 9
x0 = np.linspace(-2, 2, xn)
x1 = np.linspace(-2, 2, xn)
y = np.zeros((len(x0), len(x1)))

for i0 in range(xn):
    for i1 in range (xn):
        y[i1, i0] = f3(x0[i0], x1[i1])

print(x0)
print(x1)
print(np.round(y, 1))

plt.figure(figsize=(3.5, 3))
plt.gray()
plt.pcolor(y)
plt.colorbar()
plt.show()
```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/3888eab1-88b6-78e0-0899-4e20a9dadc5d.png)

## 関数の表面を面で表現する
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def f3(x0, x1):
    r = 2 * x0**2 + x1**2
    ans = r * np.exp(-r)
    return ans

xn = 9
x0 = np.linspace(-2, 2, xn)
x1 = np.linspace(-2, 2, xn)
y = np.zeros((len(x0), len(x1)))

for i0 in range(xn):
    for i1 in range (xn):
        y[i1, i0] = f3(x0[i0], x1[i1])

print(x0)
print(x1)
print(np.round(y, 1))

xx0, xx1 = np.meshgrid(x0, x1)

print(xx0)
print(xx1)

plt.figure(figsize=(5, 3.5))
ax = plt.subplot(1, 1, 1, projection='3d')
ax.plot_surface(xx0, xx1, y, rstride=1, cstride=1, alpha=0.3, color='blue', edgecolor='black')
ax.set_zticks((0, 0.2))
ax.view_init(75, -95)
plt.show()
```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/561da0e8-cce2-e5f1-112b-38ab88e7a6bc.png)

## 等高線で表示する
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def f3(x0, x1):
    r = 2 * x0**2 + x1**2
    ans = r * np.exp(-r)
    return ans

xn = 50
x0 = np.linspace(-2, 2, xn)
x1 = np.linspace(-2, 2, xn)

y = np.zeros((len(x0), len(x1)))

for i0 in range(xn):
    for i1 in range (xn):
        y[i1, i0] = f3(x0[i0], x1[i1])

xx0, xx1 = np.meshgrid(x0, x1)

plt.figure(figsize=(4, 4))
cont = plt.contour(xx0, xx1, y, 5, colors='black')
cont.clabel(fmt='%3.2f', fontsize=8)
plt.xlabel('$x_0$', fontsize=14)
plt.ylabel('$x_1$', fontsize=14)
plt.show()
```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/05bc193b-92b4-a21f-b92d-18ce0297ddc8.png)
std::vectorとstd::arrayのネストによる多次元配列

# はじめに
C++で多次元配列を実装する場合、C言語スタイルの配列，例えば
```c++
int array[3][4][2];
```
をそのまま使用することも可能です．しかし，この方法ではサイズが固定されており変更ができない上に，代入操作ができないため，扱いが煩雑になることがあります．一方，以下のように`std::vector`や`std::array`をネストして使用する方法もあります．
```c++
std::vector<std::vector<std::vector<int>>> array(3, std::vector<std::vector<int>>(4, std::vector<int>(2)));
```
多少のメモリオーバーヘッドやアクセスのオーバーヘッドは発生しますが，コピー代入やムーブ代入が可能であり，これらにより操作が容易になり，プログラムの見通しも良くなることが期待できます．ただし，このように宣言記述が複雑になるため，簡潔に定義するためのソースコードを備忘録としてまとめておきます．

# ソースコード
## `std::vector`のネスト
次元（ネストの深さ）はコンパイル時に固定ですが，各次元の大きさは実行時に決定することができます．つまり，ソースコード中の次元`3,4,2`は定数でなく変数として実行時に指定することができます．
```c++
#include <iostream>
#include <vector>

// ベースケース: 0次元、単一のT型変数を返す
template <typename T> T nested_vector() { return T(); }

// 再帰ケース: 1次元以上、std::vectorをネストして返す
template <typename T, typename... Dims>
auto nested_vector(size_t first, Dims... dims) {
  return std::vector<decltype(nested_vector<T>(dims...))>(
      first, nested_vector<T>(dims...));
}

int main() {
  // 3x4x2のint型3次元配列を作成
  auto array = nested_vector<int>(3, 4, 2);

  // 値の代入
  array[0][0][0] = 1;
  array[2][3][1] = 42;

  // 値の確認
  std::cout << "array[0][0][0] = " << array[0][0][0] << std::endl; // 1
  std::cout << "array[2][3][1] = " << array[2][3][1] << std::endl; // 42

  return 0;
}
```

## `std::array`のネスト
次元（ネストの深さ）と各次元の大きさはコンパイル時に固定です．
```c++
#include <array>
#include <iostream>

// ベースケース: 0次元、単一のT型変数を返す
template <typename T> T nested_array() { return T(); }

// 再帰ケース: 1次元以上、std::arrayをネストして返す
template <typename T, size_t first, size_t... Dims> auto nested_array() {
  return std::array<decltype(nested_array<T, Dims...>()), first>{};
}

int main() {
  // 3x4x2のint型3次元配列を作成
  auto array = nested_array<int, 3, 4, 2>();

  // 値の代入
  array[0][0][0] = 1;
  array[2][3][1] = 42;

  // 値の確認
  std::cout << "array[0][0][0] = " << array[0][0][0] << std::endl; // 1
  std::cout << "array[2][3][1] = " << array[2][3][1] << std::endl; // 42

  return 0;
}
```

# おわりに
`boost::multi_array`を使って，次のように書くこともできます．
```
boost::multi_array<int, 3> array(boost::extents[3][4][2]);
```
`std::vector`のネストと同様，次元は固定ですが各次元の大きさは実行時に決定することができます．

では、次元自体を実行時に決定することは可能でしょうか？結論としては，C++はPythonのような動的型付けをサポートしていないので，次元によって型が変わるこれらの方法を用いた延長線上では実現できません．
ブラウザ上でjavascriptによるテキストの音声読み上げを行う方法

# やりたいこと
- サーバから受け取ったテキストをブラウザ上で読み上げてもらいたい
- まずは最小限，テキスト読み上げの機能だけを作りたい

# 解決策
次のように作るだけ．

```html:htmlファイル
<h1>デモ</h1>
<input class="text" value="こんにちは"/>
<button onclick="speak()">speak</button>
<script>
  const uttr = new SpeechSynthesisUtterance();  // 音声合成システムを作る
  function speak(){
    uttr.text = document.querySelector('.text').value; // テキストを設定
    window.speechSynthesis.speak(uttr);                // 読み上げ
  }
</script>
```

このhtmlファイルをローカルに保存して，ブラウザで表示すると次のような画面が出る．
speakボタンを押すと入力したテキストを読み上げてくれる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510180/2b47b406-04b1-df02-7a33-f79ad3fe8c82.png)


# まとめ
- 思ったより爆速解決した
- 技術の進歩ってすごい
世界の１月から１２月

多言語対応は、大変だけど月名ぐらいはすぐやれるよってお話です。

私が公開している Android アプリでは、言語リソースとしては、日本語と英語しか用意できておりませんが、月名を表示する部分では、DateUtils を使用して、なんちゃって多言語対応を行なっています。

https://developer.android.com/reference/android/text/format/DateUtils

以下のスクリーンショットのように月名を表示する部分がユーザーの言語設定に合わせて変化します。左から、日本語、英語、ドイツ語、スペイン語、フランス語、イタリア語の月名（省略形）です。
![languages_sized.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/ebef77c7-c0f9-8431-583a-d92d368b9fcc.png)

## ソースコード
```Kotlin
// 月名の取得
val cal = Calendar.getInstance()
val monthName = Array(12) { month ->
   cal.set(2024, month, 1)
   DateUtils.formatDateTime(this, cal.timeInMillis,
      DateUtils.FORMAT_SHOW_DATE
            or DateUtils.FORMAT_NO_MONTH_DAY
            or DateUtils.FORMAT_ABBREV_MONTH
            or DateUtils.FORMAT_NO_YEAR
   )
}
```
## 解説
このコードは、`Calendar` クラスと `DateUtils` クラスを使用して、省略された月名を取得するための処理を行っています。

各月（1月から12月）の省略された月名を生成し、`monthName` 配列に格納します。たとえば、ユーザーの言語設定が英語の場合は、`monthName[0]` は "Jan" となり、`monthName[1]` は "Feb" になります。

以下、具体的に何をしているかを説明します。

### 1. カレンダーのインスタンスを取得
```kotlin
val cal = Calendar.getInstance()
```
`Calendar.getInstance()` を使って、現在の日付と時間を持つカレンダーのインスタンスを作成します。

### 2. 月名の配列を生成
```kotlin
val monthName = Array(12) { month -> 
   // 中略
}
```
`Array(12)` を使って12個の要素を持つ配列を作成します。この配列は `month` というインデックスを使って、0 から 11 まで、ループします。

### 3. 各月のカレンダーを設定
```kotlin
cal.set(2024, month, 1)
```
`cal.set(2024, month, 1)` は、カレンダーの年月日を2024年の指定した月の1日に設定します。`month` は0から11の値を持ち、それぞれ1月から12月に対応します。

### 4. 月名のフォーマット
```kotlin
DateUtils.formatDateTime(this, cal.timeInMillis,
   DateUtils.FORMAT_SHOW_DATE
       or DateUtils.FORMAT_NO_MONTH_DAY
       or DateUtils.FORMAT_ABBREV_MONTH
       or DateUtils.FORMAT_NO_YEAR
)
```
`DateUtils.formatDateTime()` を使用して、`cal.timeInMillis`（ミリ秒で表された時間）を省略された月名にフォーマットします。このメソッドにはいくつかのフラグが指定されています。省略形ではなく、通常の月名を取得したい場合は、`FORMAT_ABBREV_MONTH` を削除してください。

   - `FORMAT_SHOW_DATE`: 日付を表示
   - `FORMAT_NO_MONTH_DAY`: 日を非表示
   - `FORMAT_ABBREV_MONTH`: 月名を省略形で表示（例: "Jan", "Feb"）
   - `FORMAT_NO_YEAR`: 年を非表示

`this` は `Context` を指し、`Activity` や `Fragment` 内で実行されていると仮定しています。

### さいごに
月名だけ、多言語対応してもなぁとは思いますが、やらないよりはいいかなってかんじで実装しています。

スクリーンショットのアプリは、これなので動作を見たい方は、使ってやってください。

https://play.google.com/store/apps/details?id=com.jyro.gehaltverwalter

## 参考URL
https://engineering.linecorp.com/ja/blog/internationalize-dates-android
【WordPress】突然「このサイトで重大なエラーが発生しました。」と表示された。

# 何が起こったか

私、自前VPSでWordPressのブログサーバを運用しているのですが、ブログにアクセスすると、**このサイトで重大なエラーが発生しました。** と、表示されました。(現在太対処済み)

![スクリーンショット 2024-08-26 092907.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/985f693c-3d76-a8cc-f1be-d0f09f9d3b98.png)

ブログのホーム画面、コントロールパネルへのログイン画面にアクセス時も同じ状況で、ログインしてコントロールパネルにも行けません。
SSHでログインして操作できるので、サーバ自体は無事で、WordPressの中に問題が発生したようです。

# WordPressの動作環境

* Conoha VPS
* Ubuntu 24.02
* WordPress 6.6.1

# やったこと

こちらの記事を参考にしました。
https://kinsta.com/jp/knowledgebase/there-has-been-a-critical-error-on-your-website/

## 1. WordPressをデバッグモードにする。

wp-config.phpをエディタで開き、以下の定義を追加する。

```wp-config.php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', false );
define( 'WP_DEBUG_LOG', true );
```
:::note
デフォでは
WP_DEBUG=false
に設定されているので、この値をtrueに変更する。
WP_DEBUG_DISPLAY、WP_DEBUG_LOGは定義を追加する。
:::

## 2.再度ブログにアクセスする。

デバッグ用ログが画面に出力される。

![スクリーンショット 2024-08-26 092914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/9cea381b-929a-9769-b2bc-b902832aa66d.png)

このログから、プラグインの中のwpforms-liteで実行エラーを起こしているっぽい。
確か、このプラグインはWordPressをアップグレードされたときに、勝手にインストールされてたプラグインだったと思う。
全然使っていないプラグインなので、消してしまおう。

## 3. wp-conent/plugins/wpforms-liteディレクトリをリネームする

```bash
cd wp-conent/plugins
mv wpforms-lite wpforms-lite_old
```

これでwp-conent/plugins/wpforms-liteの処理は動作しなくなる。

## 4. 再度ブログにアクセスする。

正しく動作すればブログのホームページにも、ログイン画面からコントロールパネルにも入ることが出来ます。

問題のwpforms-liteは無効化されていました。
今後も使う予定がないので、今のうちにプラグインを完全消去。

![スクリーンショット 2024-08-26 093658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/808704ef-9b40-7078-f8ce-0b52c2e8ad0b.png)

## 5. WordPressをデバッグモードから元に戻す。

上で書いた以下の変更を元に戻す

```wp-config.php
define( 'WP_DEBUG', false );
```

**対応完了です！**
CypressとPlaywrightについて


cypressからplaywrightへテストツールを移行してみよう！ということになったので、それぞれのテストツールの違いや実際の移行方法についてまとめようと思います。

## Cypressとは
セットアップが簡単でシンプルなUIを持っているため、短時間でテスト環境を構築し、直感的に使いたい場合に向いています。

ブラウザ内でリアルタイムに動作し、デバッグも容易なとこがポイント。ただし、対応ブラウザとしてはChromiumベースのブラウザ（Chrome、Edge）、Firefox、WebKit（Safari相当）に対応しているものの、サポートされているブラウザの種類が限られているようです。

Cypressは、E2Eテストのための一体型ソリューションとして設計されており、内蔵のテストランナー、アサーションライブラリ、モックやスタブの機能が備わっています。

## playwrightとは
一方Playwrightも比較的シンプルなセットアップを提供しますが、より多機能で、より高度なカスタマイズが可能です。

Playwrightは、複数のブラウザ（Chromium、Firefox、WebKit）の完全なサポートを提供し、異なるブラウザ間での一貫したテストを可能にします。また、ヘッドレスモード（GUIなし）でのテスト実行をデフォルトでサポートしており、CI/CD環境でのテスト実行に適しています。

特徴としては、クロスブラウザテストや、デバイスやネットワークのシミュレーションが得意で、モバイルデバイスのエミュレーションやWebKitのテストが必要な場合には、Playwrightが有利です。

## 両テストツールの違い
### Cypress
Cypressは**シングルスレッド**で動作し、ブラウザと同じランタイムでテストが実行されるため、テストの速度が他のツールに比べて遅い場合があります。ただし、リアルタイムにデバッグできる点は利点です。言語としては、JavaScript（またはTypeScript）に特化しており、Node.jsのエコシステムと密接に統合されています。
### Playwright
Playwrightは**マルチスレッド**で動作し、並列実行が可能です。これにより、テストの速度がCypressよりも高速になる場合があります。特に、大規模なテストスイートを実行する際にパフォーマンス上の利点があります。また、Playwrightは、JavaScript/TypeScriptだけでなく、Python、C#、Javaなど、複数のプログラミング言語をサポートしています。この多言語サポートにより、異なる開発環境やチーム構成に柔軟に対応できます

## 実際の移行方法
#### 1. Playwrightのセットアップ
まず、プロジェクトにPlaywrightをインストールしてセットアップします。

`npm install @playwright/test --save-dev`
インストールが完了したら、Playwrightの設定ファイルを生成します。

`npx playwright init`
このコマンドにより、デフォルトの設定とサンプルテストが作成されます。

#### 2. Cypress方式からPlaywright方式へテストコードを変換
CypressとPlaywrightはそれぞれ異なるAPIを持っているため、CypressのテストコードをPlaywright用に書き換える必要があります。

例①訪問するURLの違い:
Cypress: cy.visit('/path')
Playwright: await page.goto('/path')

例②要素の取得と操作:
Cypress: cy.get('selector').click()
Playwright: await page.click('selector')

例③アサーション:
Cypress: cy.contains('text')
Playwright: await expect(page).toHaveText('selector', 'text')

このように主要なテストケースや共通のテストロジックを抽出し、Playwrightで同じ機能を実現するコードに書き換えます。

#### 3. Playwrightの設定ファイルを必要に応じて書き換える
必要に応じて、設定ファイル（playwright.config）を編集し、テスト環境をカスタマイズします。たとえば、異なるブラウザやデバイスでテストを実行する設定を追加できます。

#### 4. Cypress固有の機能の置き換え
Cypressには独自の機能（例えば、スタブやモック、XHRの操作など）があるため、それらをPlaywrightで再実装する必要があります。例えば、Cypressのcy.interceptに相当するPlaywrightの機能は、page.routeです。リクエストのモックやスタブを行う場合は、この機能を使います。

#### 5. テストの実行とデバッグ
全てのテストがPlaywrightに変換されたら、テストを実行して結果を確認します。Cypressからの移行によって発生する可能性のある問題やバグをデバッグし、必要に応じてコードを修正します。
UnityでのMessagePack導入とIl2CPP環境での対応方法【Mac環境対応】

こんにちは！
この記事では、UnityプロジェクトにMessagePackを導入し、Il2CPP環境で動作確認する手順を解説します。
同様の記事はいくつもありますが、
最新環境だとうまくいかないケースやMac環境であったり、私自身も環境構築の際に苦労した部分もあったため、同じ問題に直面している方の参考になれば幸いです。


# この記事の目的
この記事を読むことで、以下のことができるようになります。

	•	UnityプロジェクトにNuGetを導入し、MessagePackをインストール
	•	Il2CPP環境で動作するようにMessagePackの設定
	•	Mac環境での特有の問題に対処

対象読者: Unity初心者から中級者で、MessagePackの導入やIl2CPP環境での対応に悩んでいる方

# 概要

この記事では、以下の手順を説明します。
```
1.	MessagePackをUnityプロジェクトに導入
	•	NuGetの導入
	•	NuGetを使用したMessagePackのインストール

2.	Il2CPP環境での対応
	•	ソースジェネレータの環境構築
	•	コードの生成とUnityプロジェクトへの反映
```
### 環境情報

	•	OS: macOS Sonoma バージョン14.5
	•	Unity: 2022.3.27f1


# 1. MessagePackをUnityプロジェクトに導入

### NuGetの導入
まず、UnityプロジェクトでNuGetを利用できるようにします。
```
1.	NuGetForUnityのリポジトリから、NuGetForUnity.4.1.1.unitypackageをダウンロードします。
2.	ダウンロードしたunitypackageをUnityプロジェクトにインポートします。
3.	Unityのメニューに「NuGet」が表示されていることを確認します。
```
NuGetForUnityのリポジトリ:https://github.com/GlitchEnzo/NuGetForUnity


### NuGetを使用したMessagePackのインストール
次に、NuGetを使用してMessagePackをインストールします。

	1.	UnityのメニューからNuGet -> Manage NuGet Packagesを選択します。
	2.	検索欄に「MessagePack」と入力し、バージョン2.4.35を選択してインストールします。	
※ 注意: 私は、最新バージョンをインストールした際にエラーが発生してしまったため、今回は安定して動作するバージョンを選びました。
このバージョン選択の理由や、他のバージョンでの問題はまだ十分に調査していないため、注意してください。
これで、Unityエディター上でMessagePackが利用可能になります。


# 2. Il2CPP環境での対応

### ソースジェネレータの環境構築

Il2CPP環境でMessagePackを使用する際には、ソースジェネレータを利用する必要があります。
しかし、私の場合はUnity上でソースジェネレータをうまく動作させることが難しかったです。
外部ツールを使用してコードを生成する方法を取りました。

こちらの記事が参考になりました。
https://qiita.com/nekomimi-daimao/items/cd1e59c71b78bf5afda8
記事内で推奨されている手順に従えば、スムーズに進められます。
私は、生成したコードをMessagePackGenerated.csとして保存しました。

### コードの生成とUnityプロジェクトへの反映

生成したコードをUnityプロジェクトに組み込みます。

1.	MessagePackGenerated.csをAssets/Scripts/Generatedフォルダに配置します。
これは例です。プロジェクトの構成に応じて適切な場所を選んでください。

2.	次に、以下のスクリプトをStartup.csとして作成し、Unityプロジェクトに追加します。
以下公式でも同様の記載になっています。
https://github.com/MessagePack-CSharp/MessagePack-CSharp/blob/master/README.md

```C#
using MessagePack;
using MessagePack.Resolvers;
using UnityEngine;

public class Startup
{
    static bool _serializerRegistered;

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Initialize()
    {
        if (!_serializerRegistered)
        {
            // リゾルバの登録
            StaticCompositeResolver.Instance.Register(
                GeneratedResolver.Instance,
                StandardResolver.Instance
            );

            // デフォルトオプションの設定
            var option = MessagePackSerializerOptions.Standard.WithResolver(StaticCompositeResolver.Instance);
            MessagePackSerializer.DefaultOptions = option;
            _serializerRegistered = true;
        }
    }
}
```
コードの補足説明
・RuntimeInitializeOnLoadMethod属性を使用することで、シーンがロードされる前に一度だけ初期化処理が実行されるようになります。
・StaticCompositeResolver.Instance.Register(...)では、生成されたリゾルバと標準リゾルバを登録します。これにより、シリアライズやデシリアライズの際に正しいリゾルバが使用されます。
これにより、プロジェクト全体でMessagePackの設定が有効になります。
この設定により、Il2CPP環境でもMessagePackが正しく動作するようになります。


# まとめ

以上の手順を実施することで、UnityプロジェクトにMessagePackを導入し、Il2CPP環境でも動作するように設定することができます。私自身も手探りで進めた部分が多くありましたが、この記事が同じ悩みを持つ方の助けになれば幸いです。

# 免責事項
この記事で紹介したサンプルコードは、私自身の学習と経験をもとに作成したものです。このコードを使用することで生じたトラブルや損害については、一切の責任を負いかねます。自己責任のもとでご利用ください。
Windows11で英語USキーボードがどうやっても消せない!!!(Explorer Patcherが悪さをしてました)

# 対象
Windows11で日本語環境&USキーボードの状態で、なぜかMicrosoft IME/Google IME以外にUS入力がずっと鎮座して時々勝手に切り替わってクソ迷惑を受けている上に言語の追加と削除をしても消えなくてストレスで爆発しそうな方！
# 原因
Explorer Patcher使っていませんか？

# 対応
1. Explorer Patcher設定画面を起動
1. ウィンドウの切り替えを開く
1. ウィンドウの切り替え(Alt+Tab)のスタイルを`Simple Window Switcher`以外にする
1. エクスプローラーを再起動する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/66ab95a3-084d-4674-04a0-f40e9987303a.png)
1. Windowsの設定より時刻と言語→言語と地域→言語の追加→英語(米国)を追加する
1. 追加した英語(米国)を削除する

以上で解決します。

# 最後に
[ナポリタン寿司のPC日記様の記事](https://www.naporitansushi.com/windows11-us-keyboard/)のお陰で解決したのでこんな焼き増し記事ではなくこちらもぜひ閲覧してください。

https://www.naporitansushi.com/windows11-us-keyboard/
Next.js: ページコンポーネントのエクスポートでのビルドエラー解消

## アジェンダ
Next.jsを使って開発する際、ページコンポーネントのエクスポート方法が原因でビルドエラーが発生することがあります。そのエラー内容と解決法について簡単にまとめます。

## エラー内容
具体的なエラーメッセージは以下のようなものになります。

```
Build optimization failed: found page without a React Component as default export in pages/game
```

このエラーは、`pages`ディレクトリ内のファイルがReactコンポーネントをデフォルトエクスポートしていない場合に発生します。
Next.jsでは、`pages`ディレクトリにあるファイルはすべてページコンポーネントとして扱われ、Reactコンポーネントをデフォルトエクスポートする必要があります(私の場合はネームドエクスポートを使用していたため)。

## 解決策
### 1. **ファイルのエクスポートを確認する**
`pages/game.tsx`などのファイルが正しくデフォルトエクスポートされていることを確認してください。以下のように、コンポーネントをデフォルトエクスポートする必要があります。

```tsx:hoge.tsx
const Hoge: React.FC = () => {
  return <div>Game Component</div>;
};

export default Game;
```

### 2. **ディレクトリ構造の見直し**
もし`game.tsx`がページコンポーネントとして使用されていない場合、`pages`ディレクトリから`components`ディレクトリなどに移動してください。これにより、Next.jsはそのファイルをページとして認識せず、エラーが解消されます。

## まとめ

前述した通り、Next.jsでの開発において、`pages`ディレクトリ内のファイルがReactコンポーネントをデフォルトエクスポートしているかどうかを常に確認することが重要になります。また、ページとして機能させないコンポーネントは、別の適切なディレクトリに移動することで、ビルドエラーを回避できます。
【ChatGPT＋Code Interpreter】でデータを検索します。


　どうも、カーブミラーです。

　今回は、データを検索します。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::

　ニュースはないので、
　　さっそく本題です。

　昨日（2024/08/25）は
　　データをソートしました。

　今回は、
　　検索します。

　検索したら
　　リストする。

***
***user***
CodeInterpreterで、サンプルデータから女性だけのリストをお願いします。

***ChatGPT***
以下は女性だけを抽出したサンプルデータのCSV形式のリストです。

```
Name,Gender,Age
John Smith,Female,46
Michael Brown,Female,20
Emma Davis,Female,47
William Wilson,Female,38
Sophia Martinez,Female,23
```

こちらでご確認ください。

***user***
CodeInterpreterで、ここから年齢でソートしてください。

***ChatGPT***
以下は、年齢でソートされた女性のリストのCSV形式です。

```
Name,Gender,Age
Michael Brown,Female,20
Sophia Martinez,Female,23
William Wilson,Female,38
John Smith,Female,46
Emma Davis,Female,47
```

ご確認ください。

***user***
CodeInterpreterで、サンプルデータから“m”の付く名前をリストしてください。

***ChatGPT***
以下は、名前に「m」が付くサンプルデータのリストです。

```
Name,Gender,Age
John Smith,Female,46
Emily Johnson,Male,56
Michael Brown,Female,20
Emma Davis,Female,47
William Wilson,Female,38
Sophia Martinez,Female,23
James Garcia,Male,32
Olivia Thompson,Male,39
Liam White,Male,27
```

ご確認ください。

***user***（小文字だけにしたい）
CodeInterpreterで、サンプルデータから“m”（小文字）の付く名前をリストしてください。

***ChatGPT***
以下は、小文字の「m」が付く名前のサンプルデータのリストです。

```
Name,Gender,Age
John Smith,Female,46
Emily Johnson,Male,56
Emma Davis,Female,47
William Wilson,Female,38
James Garcia,Male,32
Olivia Thompson,Male,39
Liam White,Male,27
```

ご確認ください。

***

　性別で検索とか、
　　年齢で検索とか、
　　　名前で検索とか。

　それから
　　名前に指定文字が含まれるものを
　　　リストアップできます。

　こちらは
　　Pythonコード上で
　　　正規表現が
　　　　使われています。

　正規表現とは
　　文字列検索や置換に
　　　よく使われていますので
　　　　ご存知の方も
　　　　　多いかと思います。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【マインクラフト（統合版）】Websocketサーバーを使って階段ブロックに座れるようにしてみました

# はじめに

以下のように階段ブロックの淵をスニーク移動すると階段に座れます。
![階段ブロック（サクラ）](https://socket-manager.github.io/document/minecraft-contents/img/chair/sakura.gif "階段ブロック（サクラ）")

座れるブロックは設定ファイルで変更できるようにしています。
現在の設定で座れるブロックは以下の通り。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/chair/chair_list.png" height="560px" width="728px" />
※特に基準はありませんが、こちら側の任意で現在５ブロックだけ選抜登録しています。

例えば座れるブロックを追加すると以下のようにガラスブロックでも座れます。
![階段ブロック（ガラス）](https://socket-manager.github.io/document/minecraft-contents/img/chair/glass.gif "階段ブロック（ガラス）")


# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Windows Edition v1.21.21</dd>
    <dt>socket-manager</dt>
    <dd>v1.14.0</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
</dl>

:::note info
socket-manager環境の導入手順は以下のページをご覧ください。
:::

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/


# サーバー側の実装

今回はスニークイベントが発生した時に送信される"PlayerTravelled"というサブスクライブイベントを使用しています。
受信したイベントデータのtravelMethodというパラメータ値（＝７：スニーク）をみて判断しています。

:::note info
サブスクライブイベントの処理内容については以下のページでご紹介しています。
:::

https://socket-manager.github.io/document/extra-minecraft

今回はスニーク移動を検知した際にプレイヤーの真下にあるブロックが座れるブロックなのかどうかを判断するため、以下のフレームワーク上のマインクラフト設定ファイルをご用意しています。

```php:setting/minecraft.php
return [
    ・
    ・
    ・
    /**
     * @var array 座れる階段ブロック（複数指定可能）
     */
    'stairs_ids' =>
    [
        'stone_stairs',     // 丸石
        'oak_stairs',       // オーク
        'cherry_stairs',    // サクラ
        'brick_stairs',     // レンガ
        'quartz_stairs'     // クォーツ
    ]
];
```

スニーク検知後の処理の流れは以下の通りです。

<dl>
    <dt>1)プレイヤー真下のブロックが対象のブロックかを検査</dt>
    <dd>サーバーから<code>testforblock</code>コマンドを発行して検査</dd>
    <dt>2)プレイヤーが搭乗可能なダミーエンティティを召喚</dt>
    <dd>サーバーから<code>summon</code>コマンドを発行</dd>
    <dt>3)プレイヤーをダミーエンティティに搭乗させる</dt>
    <dd>サーバーから<code>ride</code>コマンドを発行</dd>
</dl>

```json:testforblockコマンドのレスポンス
{
    "body":
    {
        "matches":true（一致） or false（不一致）,
        "position":{"x":<Ｘ座標>,"y":<Ｙ座標>,"z":<Ｚ座標>},
        "statusCode":<数字>,
        "statusMessage":<文字列>
    },
    "header":
    {
        "messagePurpose":<文字列>,
        "requestId":<ＵＵＩＤ>,
        "version":<数字>
    }
}
```

上記の`matches`の項目を参照して一致しているかどうかを判断しています。

:::note info
ダミーエンティティの作り方は以下のページでご紹介しています。
:::

https://qiita.com/glasses_seven/items/abf1aecba67284e88e27

https://qiita.com/glasses_seven/items/0670face6b1f3b93969a/

実装内容の詳細は他のコンテンツも含めて以下のページでご紹介していますのでご興味のある方はご覧ください。

https://socket-manager.github.io/document/minecraft-contents/chair


# おわりに
`testforblock`発行時のレスポンスの内容は以下ページの機能を使って確認しています。

https://qiita.com/glasses_seven/items/df5bc779d2cc6aff2d9f

今回の実装ではダミーエンティティを追加しているためリソースパックを使用しています。
リソースパックの適用方法については以下のページをご覧ください。

https://qiita.com/glasses_seven/items/7a174722c9030e669eac

今回の実装内容は以下の実装で応用しています。

https://qiita.com/glasses_seven/items/cd55c6bd721a9ced1f06/
react-hook-formでネストしたオブジェクトごとのエラー件数を取得する

```
// schemaイメージ
const schema = z.object({
  fromA: z.object({
    text: z.string().max(10),
  }),
  formB: z.object({
    text: z.string().max(10),
  }),
});

/**
 * JSON.stringifyでwalkする
 */
const getFormErrorCount = (errors: FieldErrors<typeof schema>) => {
  // グループごとのエラーをmessageでカウントする
  let messageCount = 0;
  JSON.stringify(errors, (key: string, value: object) => {
    if (key === 'message') {
      messageCount++;
    }
    if (key === 'ref') {
      return undefined;
    }
    return value;
  });
}

// フォームAの文字数が溢れていたら 1が返る
getFormErrorCount(errors.fromA); // => 1
getFormErrorCount(errors.fromB); // => 0

```
LookerStudioでMAX関数を使おうとするとエラーになったので対応してみた

GoogleAnalytics4で収集されたカスタムイベントのカスタム指標の値をLookerStudioで日別最大値のグラフとして表示しようとして、データソースに対して計算フィールドを追加しようとしたところエラーでできなかったので、データの統合を使って対応してみました。
ここではその対応方法をメモしておきます。

# エラー内容
LookerStudioのデータソースでMAX関数を利用した新しい計算フィールドを追加しようとすると以下のように「再集計の指標はサポートされていません。」と出て追加できませんでした。

![2024-08-26_11h09_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/6cd9bb11-f8f3-a0c1-a10d-8655760f4745.png)

# 参照サイト

https://support.google.com/looker-studio/faq/7219787?hl=ja#7410735&zippy=%2C%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E5%86%85%E5%AE%B9

> 2）上記の理由により、計算フィールドの関数は集計後のデータに適用されます。元データに戻り、その指標のすべての固有のインスタンスを調べることはできません（また、調べても基本的に意味はありません）。たとえば、Google 広告データソースで SUM(Impressions) の数式を使って計算フィールドを作成しようとすると、次のエラーが発生します。
>
> 再集計の指標はサポートされていません。
>
> これは、インプレッション数がすでに集計されて（おり、[自動] の集計タイプを変更できなくなって）いるためです。

https://engun.co.jp/data-portal-new-field/

https://dev.classmethod.jp/articles/looker-studio-data-integration/

# 対応方法

日別の最大値を表示したいグラフのプロパティでデータ結合を行います。

![2024-08-26_11h21_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/6d94a0c7-8c33-68b8-caad-788da66781b2.png)

同じデータソースのテーブルを追加して結合します。
ディメンションには日付、時間、分とその他一致させたいディメンションを指定しておきます。
（どうも秒レベルまで一致させるのは無理みたいです、分レベルで一致してしまったデータは集計されてしまいそうです。）
指標には日別の最大値を取りたい値を選択しておきます。

![2024-08-26_11h24_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/7c77817a-c524-df89-aa45-422de9c9e03b.png)

結合の設定では、結合演算子に左外部結合を選択して、結合条件でそれぞれのディメンションを関連付けします。

![2024-08-26_11h24_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/892ae6af-7c50-3a4e-95f0-e86c11784dcb.png)

この状態でグラフのプロパティで、ディメンションに日付を選択し、指標でフィールドを追加をクリックします。

![2024-08-26_11h45_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/59fbc17d-9547-4619-4ddc-0d5d7bd9a9ad.png)

新規フィールドの設定でMAX関数を使うとエラーになりません。
このフィールドを用いるとグラフで日別の最大値を表示できます。

![2024-08-26_11h46_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/1941b62f-27d3-6afe-91e8-2c930d2d3060.png)

# 所感

エラーの内容がまだよくわかっていませんが、グラフを作った時点で集計されてしまっているので関数を適用できないということかと思っています。
今回データ統合やグラフ毎の計算フィールドの利用を初めて知りました。
データの統合では違うソースのデータを紐づけたりといろいろできそうですね。
グラフ毎の計算フィールドはグラフを細かくカスタマイズできるのでかなり便利です。
LookerStudioはかなりデータをカスタマイズできるので良いですね。
OSPFで使用するコマンドまとめ

# はじめに
この記事は下記URLの動画文字起こししたものになります。
https://www.youtube.com/watch?v=pLP6IUBb8J4&t=272s

## コマンド一覧
OSPFの有効化
(config)#router ospf<プロセス番号>
インターフェースの設定
(config-router)#network<IPアドレス><ワイルドカードマスク>area<エリアID>
ルータIDの設定
(config-router)#router-id<ルータID>
デフォルトゲートウェイの情報伝達
(config-router)#default-information originate
デフォルトルート情報を他のルーターに広報するために使用される
ループバックインターフェースの設定
(config)#interface Loopback<番号>
ネイバーの確認　ネイバーのID　IPアドレス　インターフェース等
show ip ospf neighbor
プロトコルの確認
show ip protocols　ルータIDなど自身に設定されている設定の確認
インターフェースの設定　show ip ospf interface<インターフェース>
→helloインターバル、プライオリティ、リンクの状態(DR/BDR)、ルータID等
LSDB要約情報 show ip ospf database
→保持しているデータベースの情報
[Swift]RxSwiftの導入(CocoaPods)

# RxSwiftとは
RxSwiftとはリアクティブプログラミングを実現するためのライブラリを提供してくれます。
リアクティブプログラミングとは、一言で説明すると
**「何かの値が変化したら、その変化に応じて素早く自動的に何かのアクションを行う」**
です。
- ID・PWを全て入力し終えたら、ログインボタンを活性させる
- PW設定において非推奨の文字が入力されたら警告を表示させる
- お天気アプリなどで検索対象の地域を設定したら、その地域の天気情報を表示させる

もっと身近な例で例えるとExcelで「ある値を入力すると自動で計算結果が変更される」ようなイメージです。
学習コストが高く私自身まだまだ経験、理解が浅い状況ですので少しずつアプトプットを進めていきます。

## RxSwiftを導入してみる。
今回RxSwiftとRxCocoaをCocoaPodsで導入していきます。
`SettingRxSwift`サンプルPJを作成し、導入までの流れを記入していきます。

### 1️⃣podファイルを生成
-下記のコマンドをターミナルで実行します。
```title.Swift
pod init
```
`ls-la`でPodfileの確認が出来れば生成が成功してます。

### 2️⃣ライブラリのインストール
次にPodfileにRxSwiftとRxCocoaをインストールします。
`open Podfile`でPodfileの中身を確認します。
![スクリーンショット 2024-08-12 10.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/3e85f0ac-f419-1295-2df2-2c1601cd81a6.png)

私が作成した際のPodfileの中身は上記のような状態です。
ここに下記のコマンドを追加しインストールをしていきます。追加後は念の為`Command + S`でファイルを保存します。
```title.Swift
pod 'RxSwift' 
pod 'RxCocoa' 
```

ターミナルに戻り、以下のコマンドを実行していきます。
以下のコマンドを打ちます。

初めてライブラリを導入する際は以下のコマンドを実行します。
```title.Swift
pod install
```

2回目以降、ライブラリを追加したり削除したりする場合は以下のコマンドを実行します。
```title.Swift
pod update
```
### 対象ファイルにインポートする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/eba6f4fe-4bf4-ceca-1b76-2d473d75551d.png)
 **⇧**
**ここはよく間違えてたのですが、青色のPJファイルでそのまま追加をして試みてました。しかしここだと上手くいきません。下の白色のファイルの方へ追加をしていきます。**

`import RxSwift`や`import RxCocoa`のように追加をしたいViewControllerやViewModelのファイルにインポートします
これでRxSwift'と'RxCocoa'の導入は完了です。


# まとめ
RxSwiftを利用している中で理解できない部分があり悶絶する日もあります。
先日参加した勉強会後の交流会で、他の参加者とRxSwiftの難しさについて話し合いましたが、自分だけでなく多くの人が同じように難しさを感じていることを知りました。そのおかげで、わからなくて悶絶するのは自分だけではないんだと思えば少し気持ちが楽になりました。
自分のペースで少しずつ前進し、成長していくことが大切だと改めて実感したので、これからも自己研鑽を続けていこうと思います。

# 参考文献
https://qiita.com/ke__kyukyun1828/items/2900f0467304ad7e8d86
エクセルのデータからAccessにデータをインポート



```vb

Sub ImportFromAlreadyOpenWorkbook()
    Dim xlApp As Object
    Dim xlWorkbook As Object
    Dim xlWorksheet As Object
    Dim rs As DAO.Recordset
    Dim i As Integer
    Dim j As Integer

    ' 既に開いているExcelのインスタンスを取得
    Set xlApp = GetObject(, "Excel.Application")
    
    ' 開いているワークブックを取得（例: 1番目の開いているワークブック）
    Set xlWorkbook = xlApp.Workbooks(1)
    
    ' 1番目のシートを使用
    Set xlWorksheet = xlWorkbook.Sheets(1)

    ' Accessテーブルを開く
    Set rs = CurrentDb.OpenRecordset("更新用テーブル")

    ' Excelデータをテーブルにインポート
    For i = 2 To xlWorksheet.UsedRange.Rows.Count ' 2行目から最終行まで（1行目はヘッダーと仮定）
        rs.AddNew
        For j = 1 To xlWorksheet.UsedRange.Columns.Count
            rs.Fields(j - 1).Value = xlWorksheet.Cells(i, j).Value
        Next j
        rs.Update
    Next i

    ' クリーンアップ
    rs.Close
    Set rs = Nothing
    Set xlWorksheet = Nothing
    Set xlWorkbook = Nothing
    Set xlApp = Nothing
End Sub

```
Marketing cloud personalizationについてメモ

１．setting between the mc and your target website
　　　https://help.salesforce.com/s/articleView?id=sf.use_interaction_studio_to_personalize_websites_configurations.htm&type=5

2.example for setting sitemap
     https://developer.salesforce.com/docs/marketing/personalization/guide/b2b.html

3.how to import data to catalog object(product,article....)
https://help.salesforce.com/s/articleView?id=sf.mc_pers_etl_catalog_object_data_feed.htm&type=5


⭐for instance,you should have those fields in your csv file
id	catalogObjectType	attribute:name	attribute:url	attribute:imageUrl	attribute:kokaibi	attribute:archived	categories	relatedCatalogObject:Keywords

⭐if you don't have the  following item attributes: ID, name, URL, image URL. you probably can not use Einstein recipe
https://help.salesforce.com/s/articleView?id=sf.mc_pers_einstein_recipe_troubleshoot.htm&type=5

4.create a web template
   you can use global template
   you can also use the following samples
         https://is-template-guide.herokuapp.com/


5.create a web campaign


6.enable the einstein recipe
 ---->![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/79c90f32-0d3c-b73d-7df0-d71d0d6992a2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/3587a761-f630-55bc-c72f-36d3811af65a.png)
v-comboboxのドロップダウンアイコンを非表示にしたいとき

`v-combobox`のドロップダウンアイコン（こんなやつ→▼）を非表示にしたくてAPIを調べてたけど、`append-icon`を空文字にして指定するだけでよかったみたい


```html
<v-combobox>
    outlined
    append-icon="" <!-- ここでappend-iconを空文字に設定 -->
```
AWS DOP合格(更新)記(2024/8/26投稿)

# はじめに
この度AWSのAWS Certified DevOps Engineer - Professional認定試験を受験してきましたので、勉強した内容と受験した感想を書いておきます。
今回は更新目的の受験になります。

前回は3年前の12月に受験していました。

https://qiita.com/handy-dd18/items/3166f949b84bc15371a7

# 前提
* AWSのCICD周りのサービスは過去に業務で扱ってました
* AWS認定は全て取っています(詳細は[こちら](https://qiita.com/handy-dd18/items/d21d914bf1c475d777f2))
    * PASは[こちら](https://qiita.com/handy-dd18/items/18e8a856906f97bbb964)
    * DEAは[こちら](https://qiita.com/handy-dd18/items/cd9410fc2c02a28b4c1d)
* AZ-900/DP-900/AI-900/AZ-104/AZ-204/AZ-700/AZ-305/AZ-500/DP-203は取得済み
* Google Cloud認定はMLとWorkspaceを除いた9つ取ってます

# 学習内容
今回は以下の模擬問題だけを受講して試験に臨みました。

* [①Udemy模擬問題](https://www.udemy.com/share/10aDEy3@vRxfCOY6I5e860GUyP6COIu4kbkvvRyUpWgv3cwwG_b5QbnuWVsDMM7JspDf37ah/)

## ①Udemy
購入したUdemyの模擬試験講座は以下になります。
演習テストが2つあり、それプラス「ボーナスセット」という演習テスト(40問、100分)が付いていました。

今回は時間がなかったのと旧バージョン試験からの更新箇所をキャッチアップしたかったので、演習テスト1のみを解いて間違えた問題の解説を読み込むところまでを行いました。

- [75問 × 2セット + 40問 合計190問 AWS Certified DevOps Engineer Professional (DevOpsエンジニアプロフェッショナル) 試験の本番ライクな問題＋詳解による徹底対策！](https://www.udemy.com/share/10aDEy3@vRxfCOY6I5e860GUyP6COIu4kbkvvRyUpWgv3cwwG_b5QbnuWVsDMM7JspDf37ah/)

まずUdemyの内容としては、比較的本番に近しい形式の内容になっていたと思います。
見直しをした際に何故その選択肢が間違いなのかをその理由まで詳しく説明されていたので、理解しやすかったです。
一部「それを正答でない理由にするのは少し弱いのでは？」と思う問題もありましたが、概ね納得のできる根拠がかかれていました。

また、新バージョンの問題を解いてみた感想としては、3年前と別物に感じました。
3年前に受験した際は以下のようなコメントを残していましたが、新バージョンはそれだけでは全然足りないと思います。

> あとBeanstalkやCodeシリーズはAWS公式のチュートリアルを試しに動かすところまでやってます。
https://qiita.com/handy-dd18/items/3166f949b84bc15371a7

受験にあたって、旧バージョンと新バージョンの試験概要の比較とかは特に確認していませんでしたが、CICD/OPS部分以外の要素もかなり出てくるようになっていたので、普段業務などで触っていないサービスがあれば一度作ってみるか、テキストなどに概要や機能を整理してみたほうが良いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/634578dd-b66a-39c2-1838-aec2a4b23a2c.png)
https://d1.awsstatic.com/ja_JP/training-and-certification/docs-devops-pro/AWS-Certified-DevOps-Engineer-Professional_Exam-Guide.pdf

# 受験した感想
一部Udemyの模擬試験と類似した問題は出ましたが、半分以上は初見の問題が多かったです。
ただ、出題された問題の傾向としては似ていたので、C01で合格していてC02を初めて受けるという方は一度問題を解いてみたほうがパッとキャッチアップできて良いかもしれません。

全75問を10問15～20分で解いていって、全て解き終わった頃には見直しフラグ31問、残り30分強という感じだったので、時間は全然足りませんでした。。
問題文が長めなのは旧バージョンとそこまで変わらないので、時間配分は気を付けたほうが良さそうです。

# 受験結果
見直しフラグが多かったので合格できているか心配でしたが、合格スコアは超えていたので良かったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/13edfd24-dbdb-9c4a-1b90-845e6c1c8714.png)


# おわりに
DOPの更新期限は12月でしたが、無事更新できて安心しました。
来週はAWSの新試験×2を受験してくるので、終わったら勉強方法などをまとめたいと思います。

この記事がどなたかの参考になれば幸いです。
Eclipse Java でpackageを使用する

## この記事の内容
Eclipseはじめて触る人がPackageを使えるまで

最終的なpackageのフォルダ構成
```
PackageTest/
└── src/
    └── test/
        ├── another.pg/
        │   ├── MathUtils.java
        │   └── package-info.java
        └── pg/
            ├── Main.java
            └── package-info.java

```

## やり方　初期設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/ca515094-e07d-1aea-5cab-e08f3cc0bebe.png)
起動時の画面


ファイル＞新規＞JavaProject
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/7e5f9f68-c884-ef59-4ed2-3087dccd3a94.png)

プロジェクト名入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/772ce38e-4eb6-2f4a-674d-0277ea10135b.png)

現在のフォルダ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/a37cd392-aa8c-f8f3-a737-a119a57e40aa.png)

srcフォルダ右クリック＞新規＞パッケージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/739cde36-7053-9a63-cc4c-1bf69d9c2575.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/11c8e49f-8d15-d432-f33b-b4bb8555309b.png)

mainのクラス作成
作成したpackageで右クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/b6919438-7a46-90c1-3fe0-26c6d417049a.png)

public static void mainにチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/db98aeb2-a070-c2ba-7225-4d6087426d9d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/6a84a6e2-a452-d834-df62-84d9e7ddb289.png)

hello worldで動作確認
```
    public static void main(String[] args) {
        // Hello, World!
        System.out.println("Hello, World!");
    }
```
デバックボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/4af92d81-2f35-97a4-2241-aeff25b9b412.png)

## 別のpackageを使用

srcを右クリック別のpackageを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/4337899e-6afa-d703-c489-d140966fc38b.png)

新規クラス作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/7d2a539f-5130-5efa-18da-0ccb79d73c78.png)

```MathUtils.java
package test.another.pg;

public class MathUtils {
	
    public static int add(int a, int b) {
        return a + b;
    }

}

```


Mainに戻りpackageのinportとstatic関数の呼び出し

```
//パッケージをインポート
import test.another.pg.MathUtils;

public class Main {

    public static void main(String[] args) {
        // Hello, World!
        System.out.println("Hello, World!");
        
        int result = MathUtils.add(5, 10);
        System.out.println("The sum is: " + result);

    }
```
出力結果
```
Hello, World!
The sum is: 15
```

やったね
クリーンコード学習メモ

リーダブルなコードを書くための学習メモです。

## クリーンコードとコメント
コメントではなく、なるべくコードで意味を伝える。Gitなどバージョン管理システムの発展によって、変更履歴などコメントを残す必要がなくなったため。また、コメントはプログラミングではないので、冗長に見えたり、日本語の曖昧さによって読み手に負荷を与えかねない。

## クリーンコードが優先されないケース
- パフォーマンス優先のケース
- 速度重視の場合（開発速度のこと）

## 命名規則
- 変数がどのようなデータを保持しているのかがわかりやすい、かつ、長過ぎないことに注意して命名する。
- 識別子とケース(※識別子とは関数名や変数名、クラス名などを識別するためのもの)
    - ケバブケースはHTMLのname属性やid、URLのパス名などに使用されることが多い。`name="user-email"`、`id="user-name"`など。
    - スネークケースは関数名やDBのテーブル、カラム名、定数名に用いられることが多い。`time_calculation`など。
        - `API_KEY`など大文字をスネークケースで繋ぐことをアッパースネークケース（コンスタントケース）と呼ぶ。
    - パスカルケース（アッパーキャメルケース）はクラスやインターフェース名に使用されることが多い。`Users`、`MyClass`など。
    - キャメルケース（ローワーキャメルケース）は、変数名でよく用いる。`userId`、`novelName`など。

## 変数の命名規則
審議値は必ず`true`または`false`になるので、それを正しく表現する。また、基本的には肯定的な命名をする。is~や、英語の過去分詞系を用いると良い（done、completedなど）。

## 定数の命名規則
参照として用いる値を格納する際には、アッパースネークケースを用いると良い。

## 関数の命名規則
処理内容がわかるように、なるべく（長くならない程度に）具体性を持たせる。

## 同じ意味合いの単語は統一する
類似単語例：
```
start, begin
stop, end
modify, update, change
create, new, factory
find, search
done, finish, complete
deliver, dispatch, send
select, choose
show, display
```

## 反対の意味を持つ値は対比のある名前をつける
対比の例：
```
first <-> last
next <-> previous
create <-> delete
source <-> destination
add <-> remove
show <-> hide
min <-> max
public <-> private
success <-> failure
```

## コメント
最近だとコメントで処理の意図を伝えることは少ない。
Gitなどバージョン管理システムの発展もそうだが、そもそも、「わかりやすいコード」を心がけることに重きをおいた方がいい。
関数名に加えて、中の処理にも気を遣うことが大事。しかし、パフォーマンスに大きく関わる処理の場合、コードの読みやすさよりも、パフォーマンスを重視した方がいい。

- 悪いコメント
1. 付加情報のない無意味なコメント
2. 冗長なコメント
3. 形式的なコメント  
メンバ変数１つ１つに対するコメントは基本的には不要。
4. 改修履歴コメント
Git lensなど拡張機能で補える。
5. バージョン管理のためのコメント
バージョン管理のためのコメントはGitで行うようにする。

- 良いコメント
    - 良いコメントというのは、コメントでしか表すことが困難なことを記していること
1. TODOコメント
2. 使用上の注意
3. 使用上の警告 
4. 公開するライブラリのためのAPIコメント
5. コピーライトコメント
6. パフォーマンスなどに関わるコメント
for文の方が速いからforeachに書き直して欲しくないときなど。
7. 書き方としてややこしくなるのが避けられない処理へのコメント
正規表現の意図を表すコメントなど

## マジックナンバー（数値）、マジックキャラクター（文字列）を避ける
```javascript
Console.log(1200 * 1.1);
```
上記の`1.1`は税率なのですが、このように数値ベタ書きだと、消費税の計算だということに気づけないことがある。なので、以下のように修正する。
```javascript
const TAX_RATE = 1.1;
console.log(1200 * TAX_RATE);
```
[T-DASH] 動的に変数を定義、設定する

# Outline

データ駆動開発は、スクリプトとデータを分離する開発技法である。
これにより、スクリプトのメンテナンス性を改善することができる。
そのため、テストコードから変数をできる限り外出しをする。
外だしする方法として、変数を用いることがある。
ただ、T-DASHでは変数を宣言（定義）して設定する機能がない。

その変数宣言方法いくつかあるとおもうが、できる限りエレガントに再利用性の高い方法を説明する

https://service.valtes.co.jp/t-dash/

# 技術的情報

基本的に変数名を用いて定義する

robot framework風
```
Set Suite Variable  ${hoge}  abcde
Log ${hoge}
```
変数hogeにabcdeの値を設定する。
これで十分ことが足りるが、複数の変数を定義する場合、どうであろうか？
また、これをカスタム動作で定義することになるが、ハードコーディングで変数名を指定するのは使いやすいだろうか？

そこで、任意の変数名に対して値を設定する方法が必要になる
```
Set Dynamic Variable
    [Arguments]  ${argv1}  ${argv2}
    Set Sute Variable  ${${argv1}}  ${argv2}
```
${${argv1}} この記述により、${argv1}という変数を作り出す。
これにより、カスタム動作内ではハードコーディングなしで、保守性の高い変数宣言を実現できる


# T-DASH

## カスタム動作

以下設定内容を variables.yamlのファイル名で保存する

```
ACT-CAT-CUSTOM-8c3c0ac4-cbd0-42dc-986b-8590d2ab805f:
  action_category_name: variables
  icon: ''
  color: '#309184'
  custom_data:
    file_name: variables
    pip_list: []
    library_list: []
  actions:
    ACT-CUSTOM-8b671349-a425-46a6-9d92-fddf6520a539:
      action_name: 動的変数に値を設定する
      action_type: operation
      action_format: 変数名「設定値1」に値「設定値2」を設定する
      action_note: ''
      action_args:
      - value1
      - value2
      action_def:
      - - Set Suite Variable
        - ${${value1}}
        - ${value2}
      - - Log
        - set ${value2} in ${value1} variable
```

次に、作成された variables.yamlをT-DASHの動作定義 -> カスタム動作 -> カスタム動作をインポート にてインポートし、実際にインポートされた設定内容を開く


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/e17fc918-82e3-794b-7988-f4eda86ae3b1.png)

特に編集する必要はないが、変数の有効範囲を変えたい場合、 Set Suite Variable をほかの関数にする

参考

https://qiita.com/emurin/items/028bae7a25d4c020ed62

## テストケース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/43f8504e-447c-224e-d0a6-cf6ef8ad8035.png)


1行目のように、変数 dynamic_valueを生成し、値「テスト」を入れる
3行目のように、生成された変数 ${dynamic_value} を用いる
windows11更新永久停止

```
★復元
windows11＞設定＞システム＞右の回復＞右の復元

★永久停止
WindowsサービスでWindows 11の自動更新を停止する
Windows 11の自動更新を無効にするには、Windowsの更新サービスを停止することによって実現する
ことができます。手順は以下のようです。

Windows + Rキーを押し、「ファイル名を指定して実行」ダイアログに「services.msc」と入力し、
Enterキーを押して「Windowsサービス」を開きます。
サービス一覧を下にスクロールし、
Windows Updateサービスを見つけます。
Windows Updateサービスをダブルクリックし、
「プロパティ」ウィンドウを開きます。
「全般」タブで「スタートアップの種類」オプションの隣にあるドロップダウンアイコンをクリックし、
「無効」オプションを選択します。
「適用」をクリックし、「OK」をクリックし、変更を適用します。
それによって、Windows 11の自動更新が永久に無効になるようになります。

必要の場合、windows update 有効にする。
React+FirebaseUiでGoogleアカウントサインイン実装

## FirebaseUIとは

サインイン用ボタンの生成、サインイン画面の表示などを行ってくれます。

ログイン後のcallbackなども設定可能です。

設定可能な項目はGithub側にReadmeがあります。

https://firebase.google.com/docs/auth/web/firebaseui?hl=ja

https://github.com/firebase/firebaseui-web?tab=readme-ov-file

webで使用する場合はfirebaseui-webを参考にする方が良いかもしれません。

https://github.com/firebase/firebaseui-web/blob/master/README.md

Googleのサインインボタンに関しては以下のページも参照可能です。

HTML要素で生成可能でこちらを利用する場合FirebaseUIは必要ありません。

https://developers.google.com/identity/branding-guidelines?hl=ja

## install

npmを使用する場合は以下のコマンドを実行します。(今回はfirebaseは既に設定済みのプロジェクトを使用しています。)

`npm install firebaseui`

## Firebase Authentication の有効化

Firebase Consoleでプロジェクトの構築 > Authenticationを開き、ログイン方法のタブでGoogleをプロバイダとして追加する必要があります。

## フロント実装

Reactでのサンプルで作成したのはこんなの

```jsx

import { GoogleAuthProvider, User, UserCredential, getAuth } from 'firebase/auth';
import * as firebaseui from 'firebaseui';
import 'firebaseui/dist/firebaseui.css';

const Signin = () => {
    const initFirebaseUi = () => {
        const uiConfig = {
            signInFlow: 'popup',  // Webアプリではpopupが推奨とのこと、現在callbacksもこちらでないと反応しない
            signInOptions: [ // 利用可能とするプロバイダー
                GoogleAuthProvider.PROVIDER_ID.
            ],
            callbacks: {
		            // 成功時の処理
                signInSuccessWithAuthResult: (authResult:UserCredential, redirectUrl: string) => {
                    // success()
                    // リダイレクトを行わない = false
                    return false;
                },
                //失敗時の処理
                signInFailure: (e: any) => {
                    // error();
                }
            }
        }
        // 既にinstanceがあればそちらを使用する
        const ui = firebaseui.auth.AuthUI.getInstance() || new firebaseui.auth.AuthUI(getAuth());

				// id='firebase-ui'　に表示
        ui.start('#firebase-ui', uiConfig);
    }

    useEffect(() => {
        initFirebaseUi();
    }, []);
    
	return (
		<div id='SigninView'>
			<div id='firebase-ui' />
		</div>
	)
}
```

- signInFlowはモバイルアプリとWebアプリで推奨が異なるみたいなので、Webアプリの今回はpopupに。それとcallbacksの処理もpopupでしか呼び出されなかった
- 今回認証プロバイダーはGoogleのみ。追加したい場合はここに追記。Firebase側の設定含めいまだにTwitterなのが気になる
- サインイン成功時に処理を行いたかったため戻り値をfalseにして自動の画面遷移を無しに。signInSuccessWithAuthResultを設定しない場合とtrueを返す場合は、uiConfig内でリダイレクト先を設定しないとエラーになる

## あとがき

特定のメールドメインのみ許容するようにしたりとかはFirebaseUIを使わずにGoogleAuthProviderを作成しsetCustomPropertiesで設定することになりそう。

https://firebase.google.com/docs/reference/node/firebase.auth.GoogleAuthProvider#setcustomparameters

フロントエンド以外での制御だとCustom ClaimやFirestore Security Rulesを使うことになると思う。

Claimに関しては利用したことが無いので今後調べる。
Einstein LLM 




+ [What's applicationName in EinsteinLlmAdditionalConfigInputRepresentation?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifdbS)


---------
+ [Salesforce が Einstein Studio を発表: 独自の AI モデルを構築してデプロイ](https://qiita.com/Keiji_otsubo/items/54090b85ff56a7964a9b)
+ [Module : Einstein Copilot](https://qiita.com/Keiji_otsubo/items/7885b4cb4587b01c8119)
最近Discordでよく見かけるSteamリンク、NSFW鯖スパムについて

こんにちは、りょうです。
今回は最近(結構前からだけど)見かけるSteamリンクやNSFW鯖スパムについてです。

## Steamリンクスパム
こういうのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/c2931acb-ffeb-8b8a-deae-5403fa0c86cd.png)
このメッセージの構造です。URL短縮サービスのURLが含まれていることがわかると思います。
```
Bro steam gift 50$ - [steamcommunity.com/gift-card/pay/50](https://shorturl.at/wdNn0 )
@here @everyone
```
これを踏んだときにその短縮URLのリダイレクト先に飛ばされます。
これは期限が切れたのか短縮URLのサイトに飛びますが、基本的にはSteamに似せたフィッシングサイトに飛ばされます。
そこでアカウント情報を抜き取られたりするわけです。

**対策**
まず、怪しいリンクは踏まない！これが一番大事。
次にリンクの確認。カーソルを合わせたらこのように表示されるのでここでも判別できます。
別のURLが含まれていたらそれは怪しいです。基本確認画面もでるしね。
これはSteamリンクに限った話ではなく、Nitroなどでも同じような詐欺が行われています。

![Screenshot 2024-08-25 10.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/8d4a3d37-86e6-a89f-69c4-4a8eb809efe9.png)

## NSFW鯖スパム
こういうやつです。まあようはエロ鯖ですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/5ab93e2f-b9f1-35cb-0ce7-3916ff3e90d7.png)

認証をさせてアカウント情報を抜き取って乗っ取ってやられるスパムです。
このChaptcha.botに偽装しているのが多いですね。
botプロフィールを開いてユーザー名が`Chaptcha.bot#3928`で、コマンドというのが出ていれば本物です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/8c9b6108-6ffb-9db1-f3c9-005bfd2390a8.png)

認証時にこのようなURLに飛ばされてアカウント情報を入力するように求められます。
ここで抜き取られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/278f26c3-dc56-a6b7-86aa-9cbeec07bbe2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/d8663ffd-9bbf-ec21-d149-c7056f633a68.png)

**対策**
Steamリンクと同様にこれも入らない、認証しないってことが大事です。
ちなみに認証してもロールはもらえません。
あとはBOTが本物かどうかの確認をする、もし認証してしまったらパスワードを変更するなどしてください。

### 10/28 追記
WickBOTでのMaliciousLinksをオンにするとだいたい防げます。
ただこれはDiscordに似たリンクなども検知される(discloudやvoicecord等)のでそれが大丈夫な人だけ設定してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/9e7c624a-233d-ff53-0c7d-c770ce44741d.png)

## まとめ
今回は乗っ取り系スパムについて解説と対策でした。
サーバー側での対策としてはAutomodで`@everyone`や招待リンクを送信できないようにすれば問題ないです。
確認もせず飛びついてアカウント乗っ取られるなんてアホみたいですよね。
なのでしっかり見極めるようにしましょう。

わからないことあったら書いてくれれば答えていきます。

Discordにいる荒らしの情報や対策方法の共有をしている自鯖です
ぜひ参加お願いします↓↓↓↓

https://discord.com/invite/ESRGwGQhxc
Ruby on Rails コマンドラインまとめ

## 1. Rails New
- **実行方法**: `rails new <アプリケーション名>`
- **できること**: 新しいRailsプロジェクトを作成する
- **実行例**:
    ```bash
    rails new myapp
    ```

## 2. Rails Server
- **実行方法**: `rails s` または `rails server`
- **できること**: ローカル開発サーバーを起動し、アプリケーションをブラウザでテストする
- **実行例**:
    ```bash
    rails s
    ```

## 3. Rails Generate
- **実行方法**: `rails generate <タイプ> <名前>` または `rails g <タイプ> <名前>`
- **できること**: コントローラ、モデル、リソース、スキャフォールドを作成する

### 例:
- **コントローラの作成**:
    - **実行例**:
        ```bash
        rails generate controller Home index show
        ```

- **モデルの作成**:
    - **実行例**:
        ```bash
        rails generate model User name:string email:string
        ```

- **リソースの作成**:
    - **実行例**:
        ```bash
        rails generate resource Article title:string body:text
        ```

- **スキャフォールドの作成**:
    - **実行例**:
        ```bash
        rails generate scaffold Product name:string price:decimal
        ```

## 4. Rails Console
- **実行方法**: `rails console` または `rails c`
- **できること**: アプリケーションのデータ操作やコードのテストを行う
- **実行例**:
    ```bash
    rails console
    ```

## 5. Rails dbconsole
- **実行方法**: `rails dbconsole` または `rails db`
- **できること**: データベースと対話し、データを操作する
- **実行例**:
    ```bash
    rails dbconsole
    ```

## 6. Rails Destroy
- **実行方法**: `rails destroy <タイプ> <名前>` または `rails d <タイプ> <名前>`
- **できること**: `rails generate` で作成したファイルを削除する
- **実行例**:
    ```bash
    rails destroy controller Home
    ```

## 7. Rails About
- **実行方法**: `rails about`
- **できること**: 現在のRailsアプリケーションに関する情報（RubyGems、Railsバージョンなど）を表示する
- **実行例**:
    ```bash
    rails about
    ```

## 8. Rails Assets
- **実行方法**: `rails assets:precompile` または `rails assets:clean`
- **できること**: 静的アセット（JavaScript、CSS、画像など）の管理と最適化を行う
- **実行例**:
    ```bash
    rails assets:precompile
    rails assets:clean
    ```

## 9. Rails Runner
- **実行方法**: `rails runner '<コード>'`
- **できること**: アプリケーション環境内でRubyコードを実行する
- **実行例**:
    ```bash
    rails runner 'puts User.all'
    ```

## 10. Rails Notes
- **実行方法**: `rails notes`
- **できること**: `TODO`, `FIXME`, `OPTIMIZE` などの注釈をコードから検索し、一覧表示する
- **実行例**:
    ```bash
    rails notes
    ```

## 11. Rails Tmp
- **実行方法**: `rails tmp:clear`
- **できること**: 一時ファイル（キャッシュ、セッションなど）を削除する
- **実行例**:
    ```bash
    rails tmp:clear
    ```

## 12. Rails Routes
- **実行方法**: `rails routes`
- **できること**: アプリケーション内の全ルートを表示する
- **実行例**:
    ```bash
    rails routes
    ```

## 13. その他の高度なRailsコマンド
- **実行方法**: `rails new <アプリ名> --database=postgresql` など
- **できること**: データベースの種類やソースコード管理システムを指定して新しいRailsアプリケーションを作成する
- **実行例**:
    ```bash
    rails new myapp --database=postgresql
    ```



## 参考元
https://www.bacancytechnology.com/blog/rails-command-line