OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails7] link_toでdeleteできない

# 背景

登録データを削除する機能を追加するため、以下の``link_to``を作成したが、deleteが機能せず削除できなかった。上手く検索できずにぐるぐるしたため、備忘録として残す。

``` ruby:/app/views/shops/edit.html.erb
<%= link_to('お店を削除', shop_path(@shop.id), method: :delete, data: { conform: "削除しますか？"} ) %>
```

# 状況

リンクをクリックすると削除されずに、詳細確認画面（shops#show）に戻ってきていた。

``` ログ
Started GET "/shops/3" for ::1 at 2024-10-13 22:19:26 +0900
Processing by ShopsController#show as HTML
  Parameters: {"id"=>"3"}
  Shop Load (0.2ms)  SELECT "shops".* FROM "shops" WHERE (3) LIMIT ?  [["LIMIT", 1]]
  ↳ app/controllers/shops_controller.rb:22:in `show'
```

# 原因

Rails7 以上では、rails-ujsが標準構成からはずれ、Turboが標準構成に追加されている。

rails-ujsとは何かについては、以下のサイトを参照。

> Railsの一部のRESTfulな動作や非同期な処理などを実現するために、JavaScriptの送信に関する処理などが書かれたライブラリです。

https://www.inodev.jp/entry/2019/12/03/234210

rails-ujsは、``link_to``ヘルパーの``method``や``conform``をjavascriptで処理するように定められているらしく、rails-ujsによってGET以外のHTTPメソッドが指定できるらしい。

Rails7では、rails-ujsの機能を吸収したTurboが標準構成となった。これにより、``method``などの書き方が変更になっている。

# 解決方法

``method``を``turbo_method``に、``confirm``を``turbo_confirm``に変更する。

``` ruby:link_to delete メソッドの書き方
<%# rails-ujsの場合 %>
<%= link_to 'お店を削除', shop, method: :delete, data: { confirm: "削除しますか？" } %>

<%# Turboの場合 %>
<%= link_to 'お店を削除', cat, data: { turbo_method: :delete, turbo_confirm: "削除しますか？" } %>
```

参考にしたサイト

https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/tips

https://picolab.dev/2022/03/23/rails7-turbo/#toc2

## 補足

上記「参考にしたサイト」に記載があるが、destroyアクションのリダイレクトにおいて、不具合が発生する可能性があることからリダイレクトに``status: :see_other``を追加した。

```ruby:destroyメソッド
redirect_to shops_path, status: :see_other
```
VMwareでLinuxが音割れした時の確認

# VMware上でLinuxをpipewireでサウンド再生し音割れした時の確認

サウンド再生時にブツブツとなってしまうのを回避する。

:::note warn
PulseAudioの音量調節プログラムが起動していると悪化が激しくなりやすい
(pw-topとtopで確認した)
:::

## 再生できた時のサウンドカード情報

``` bash:
user@live-debian:~$ LANG=C aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: AudioPCI [Ensoniq AudioPCI], device 1: ES1371/2 [ES1371 DAC1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```

## VMware側の確認

以下が有れば必ずコメントにする。

``` text: vmxファイル
#pciSound.PlayBuffer = "500"  # サウンドバッファの指定
#sound.bufferTime = "400"     # サウンドカードのバックグラウンドノイズ対策
#sound.virtualDev = "hdaudio"
```

## Linux側の確認

以下のファイルは必須らしい。

``` bash: /etc/wireplumber/wireplumber.conf.d/50-alsa-config.conf
monitor.alsa.rules = [
  {
    matches = [
      # This matches the value of the 'node.name' property of the node.
      {
        node.name = "~alsa_output.*"
      }
    ]
    actions = {
      # Apply all the desired node specific settings here.
      update-props = {
        api.alsa.period-size   = 1024
        api.alsa.headroom      = 8192
        session.suspend-timeout-seconds = 0
      }
    }
  }
]
```

## あとがき

公式WiKiの情報に沿ってpipewire側の設定をしてもVMware側の設定の不備で解決に時間がかかったのでこれを残す。
メンタルの強弱とは？

# メンタルの強弱とは？
## 本記事のターゲット層
- 真面目、あるいはよくそう言われる
- 人から指摘を受けることが苦手（上司から言われる場合を含む）

## 1. はじめに
先日、SIer歴2年の方がXで以下のような投稿をしていました。
>上司にちょっと詰められただけで、土日も仕事のことばかり考えてしまう。 けど1番辛くてしんどいのは、上司に詰められたことではなくて、上司に詰められただけでずっとクヨクヨしてしまう自分のメンタルの弱さに絶望してしまうこと。

これって考え方は人それぞれだと思いますが、この人は真面目な方であり、私も若いときに同じ経験をしたことがあり、共感しました。
今回話す内容は重い内容かもしれないですが、真面目に物事を考えてしまう人へ、私が日頃意識していることをお伝えできればなと思います。

## 2. ストレス対策で重要なこと

まず認識を改めなければいけないのは**メンタルが弱い**わけではない。ということです。

**メンタルが弱い**のではなくて、詰められことに対する対処方法が分からないので**詰められたことを何十回も思い返して精神が疲弊している**のだと思います。**詰められたことを何十回も思い返す**と誰でも精神が疲弊してしまいます。

ストレス対策で重要なのは以下の5つだと考えています。
(1). ストレスの原因から離れる 
→休日に仕事のことを考えないようにするのもありです
(2). 頑張らない 
→頑張るのと同じように頑張らないことも大事です。頑張りすぎて限界を迎えてしまうと、そこから回復するのが大変です。
　（力量的に困難なことに無理して挑まない、精神的に疲弊しているときに無理しないという意味が含まれています）
(3). 自分に対する不利益発生を予測する 
→失敗したとき「こんなこと言われるに違いない」と覚悟するとストレスが軽くなります
(4). リラックスする
→力を抜くことも大事です。がこれは若いときには難しいかもしれません。
(5). 頭の中で考えずに、考えたことは紙などに書くようにする
→頭の負荷を軽くすることもストレス軽減になります

**自分が頑張らないと周囲が困るよ**って思っていませんか？
実はそれ、**正しいことなんです**。

周りが困った結果、困ると思った人たちが解決に動きますよね？
それは同僚かもしれないですし、上司かもしれないです。

しかし、困ると思った人たちが困らないように動くこと。
これを**仕事が円滑に動くように対処をする**という上司の仕事になります。

つまり、以下のような動きが良い行動だと思います。
**誤り）**
自分が頑張らないと周囲が困るよ！！

**正しい）**
自分が頑張りすぎてつぶれると周囲が困るよ。
それに、無理をしてもどうにもならない or 無理をしないとどうにもならない
だから「これはどうにもなりません、困ってますと声を上げることにしよう！！」　　　

## 3. まとめ
**メンタルが強い**ように見える人たちは(1)(2)は最低限やっているように思います。
 頑張れって人に言うくせに、”メンタル強い人たち”は適度に力を抜くんですよｗ
 
これって詰める人や頑張れっていう人たちは、誰も相手が100%鵜呑みにして精神を病むとは考えずにいっているのだと思います。
体育会系のようなノリで、テンションを維持するためにやっている感覚かもしれません。

でも能力が高い人はレベル高いことが出来てますよね？
そのレベルのことができるようにならないと・・・って思うならば大きな間違いです。
 
**もっと頑張る**で出来ることは100%頑張っていたことを120%出来るようになることではないと私は考えています。
**もっと頑張る**とは、いままでやっていたことを見直し、やり方や考え方を変えてみることだと思います。
→現にいまのマネジメントはそういう考え方ですし、努力しても絶対にできないことを要求することはパワハラといいます。
 
能力が高い人も長い年月コツコツと頑張ったからできるようになっているわけです。
言われた瞬間や翌日からいきなり言われたことができるようになっているわけではありません。
→こんな要求を真面目に受け止めると精神が疲弊してしまうわけです
中学生にもわかる！音楽共有SNS「DailyBeat」の仕組み（前編）

こんにちは！今日は、「DailyBeat」という音楽を共有するSNSについて、どんなふうに作られているのか、みんなにもわかりやすく説明していくね。

## DailyBeatって何？

DailyBeatは、毎日1曲の音楽を友達と共有できるSNSだよ。例えば、こんなことができるんだ：

- 今日聴いて気に入った曲を投稿する
- 友達が投稿した曲を聴く
- 好きな人をフォローして、その人の投稿をチェックする

音楽を通じて友達とつながることができる、そんなサービスなんだ。

## DailyBeatの主な機能

1. ユーザー登録とログイン
2. 毎日の楽曲投稿
3. みんなの投稿を見るタイムライン
4. 友達をフォローする機能
5. 投稿された曲を再生する機能

これらの機能がどんなふうに作られているのか、順番に見ていこう！

## DailyBeatの作り方

### 1. 使っている技術

DailyBeatは、主に以下の技術を使って作られているよ：

- Flask（フラスク）：Webサイトを作るためのPythonのツール
- SQLite：データを保存するための小さなデータベース
- SQLAlchemy：データベースを簡単に使うためのツール
- HTML, CSS, JavaScript：Webページを作って見た目を整えるための言語

では、それぞれの技術について、似たような技術と比べてみよう！

#### Webフレームワーク：Flask vs Django vs FastAPI

- **Flask**：
  - 良いところ：初心者でも使いやすく、必要な機能を簡単に追加できる
  - 悪いところ：大きなプロジェクトになると、自分で多くの設定をする必要がある

- **Django**：
  - 良いところ：多くの機能が最初から用意されている
  - 悪いところ：小さなプロジェクトには機能が多すぎて複雑になることがある

- **FastAPI**：
  - 良いところ：とても速く動作する
  - 悪いところ：まだ新しいので、参考になる情報が少ない

**選んだ理由**：Flaskは学習しやすく、必要な機能だけを追加できるので、DailyBeatのような中規模のプロジェクトにぴったりだと思ったんだ。

#### データベース：SQLite vs MySQL vs PostgreSQL

- **SQLite**：
  - 良いところ：設定が簡単で、1つのファイルにすべてのデータを保存できる
  - 悪いところ：同時にたくさんのユーザーが使うと遅くなることがある

- **MySQL**：
  - 良いところ：たくさんのユーザーが同時に使っても速く動作する
  - 悪いところ：設定が少し複雑

- **PostgreSQL**：
  - 良いところ：高度な機能がたくさんある
  - 悪いところ：小さなプロジェクトには機能が多すぎることがある

**選んだ理由**：SQLiteは設定が簡単で、小～中規模のWebサイトに適しているから選んだんだ。将来ユーザーが増えたら、MySQLやPostgreSQLに変更することもできるよ。

#### データベース操作ツール：SQLAlchemy vs 直接SQLを書く方法

- **SQLAlchemy**：
  - 良いところ：Pythonのコードでデータベースを簡単に操作できる
  - 悪いところ：少し覚えることが多い

- **直接SQLを書く方法**：
  - 良いところ：データベースを細かく制御できる
  - 悪いところ：複雑なSQLを書くのが大変

**選んだ理由**：SQLAlchemyを使うと、データベースの操作を簡単に書けるし、コードも読みやすくなるから選んだんだ。

#### フロントエンド：HTML/CSS/JavaScript vs React vs Vue.js

- **HTML/CSS/JavaScript**：
  - 良いところ：基本的な技術で、多くのブラウザで動作する
  - 悪いところ：複雑な動きを付けるのが少し大変

- **React**：
  - 良いところ：複雑な動きのあるWebサイトを作りやすい
  - 悪いところ：学ぶのに時間がかかる

- **Vue.js**：
  - 良いところ：Reactよりも学びやすい
  - 悪いところ：Reactほど広く使われていない

**選んだ理由**：HTML/CSS/JavaScriptは基本的な技術で、学習資料がたくさんあるし、DailyBeatの機能を作るのに十分だったから選んだんだ。

#### IT用語解説

- **SNS（ソーシャル・ネットワーキング・サービス）**：インターネットを通じて人々がつながり、情報を共有するサービスのこと。LINEやInstagramなどが有名だね。

- **Flask**：Pythonという簡単なプログラミング言語を使って、Webサイトを作るためのツール。初心者でも使いやすいように設計されているんだ。

- **データベース**：たくさんの情報を整理して保存しておく場所のこと。図書館の本棚みたいなもので、必要な情報をすぐに取り出せるようになっているんだ。

- **SQLite**：小さなデータベースのこと。1つのファイルにすべてのデータを保存できるから、初心者のプロジェクトに使いやすいんだ。

- **SQLAlchemy**：データベースを使うときに、難しいコマンドを覚えなくても簡単に操作できるようにするツール。

- **HTML, CSS, JavaScript**：Webページを作るための3つの言語だよ。
  - HTML：Webページの骨組みを作る
  - CSS：Webページを見た目よくする
  - JavaScript：Webページに動きをつける

次は、ユーザー登録とログイン機能について説明していくよ！
Emacs風のN-Prolog専用エディタ

# 道具に拘る
Lisp,Prologの開発、改良作業もほぼ終えました。飯高先生のPrologの本で数学の勉強と思いつつ、ついつい道具に拘ってしまいました。エディタです。Lisp用のエディタを改造してN-Prolog専用のエディタにしました。

# シンタックスハイライト
![bandicam 2024-10-14 15-17-09-214.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/acc057a3-31e7-e684-1867-8315bb429c1b.jpeg)

飯高先生の本にあったGCD計算の例です。オペレーターのところをしっかりシンタックスハイライティングするようにしました。PrologはLispと違ってスペースを区切りとはしていません。しっかし、オペレーターの字句との照合をおこなって判定しています。


# 述語、関数のヘルプ
![bandicam 2024-10-14 15-18-00-895.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/7afaf637-0148-64ba-3d87-20d5993f25a8.jpeg)

この述語ってどうやって使うんだっけ？ということが良くあります。いちいちマニュアルを読むのはめんどくさいです。Esc + I で述語、関数の説明を表示するようにしました。

# ユニコードもOK
![bandicam 2024-10-14 15-18-37-339.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/7a117f9d-e88a-a31a-d472-075ea9c191fc.jpeg)

あの懐かしいRUN/PROLOGのマニュアルにある例題です。漢字OKです。


# キーバインドはEmacs風
![bandicam 2024-10-14 15-19-09-738.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/64f10cbc-1cdc-8732-e9f5-0319a637a018.jpeg)

おおよそEmacsのサブセットです。


# Tmuxとでさらに便利に
![bandicam 2024-10-14 15-19-19-836.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/a6bd2eaa-5dba-7ff6-62cc-068d0e6d3685.jpeg)

tmuxでターミナルを分割してエディタとProlog処理系を同時に起動しておきます。そうするとEmacsのようにエディタと処理系を行ったり来たりできます。


というわけで道具の準備はできました。さあ、数学のお勉強を始めますか。

https://github.com/sasagawa888/nprolog
RailsのEnum型を使う

## Enum(列挙型)とは
名前がついた定数の集まりです。
あらかじめ用意した選択肢の列挙からデータを選択することで、可読性の向上, 値の代入ミスを防ぐことができます。

## DBのEnum(列挙型)
RailsのEnumを見る前にDBレベルでのENUMについて説明します。
DBのENUMはテーブル作成時に列挙された定義リストに存在する値のみを保管可能になるデータ型です。

要するに"banana", "apple", "orange"と定義すると、その３種類しか保存ができなくなります。

## Ruby on RailsでのEnum
Railsのenum型は`数値のカラム`に対してプログラム上で扱える別名を付与することで使用することが可能です。

重要な点としてDBレベルで見るとカラムの型は`数値`です。
これにより、DBのカラムの型自体をEnumにした場合と比べ、カラムに保存可能な値を変更したい際に、DBの変更が必要になる点や、アプリ側からカラムに保存可能な値がわかりづらいという問題点を解消できます。

## Enum型を定義する
今回はAnimalというModelを作成し、kindカラムに"猫", "犬", "それ以外"の選択肢を持つEnumを作成してみます

### migration
先述の通りEnumとして管理するkindカラムはDBレベルでは数値型になります
```shell
rails g migration Animal name:string kind:integer

railg g db:migrate
```

### model
Enumの定義はModelに記載します。
以下のように、文字列と数字を紐づけます。
```rb
class Animal < ApplicationRecord
  enum kind: {
    cat: 0, # 猫
    dog: 1, # 犬
    other: 2, # その他
  }
  略
end
```

### irbで確認
これでEnumを扱うことができるようになります。
このような設定を行うことで、アプリ上では人間が理解しやすい文字列で扱い、DB上ではカラムの型である数字を保存できます。
```shell
Animal.create(name: "まる", kind: :cat)
=> <Animal id: 1, name: "まる", kind: "cat">

Animal.create(name: "ぽち", :kind: dog)
=> <Animal id: 2, name: "ぽち", kind: "dog">
```


## 使える便利メソッド/スコープ
```shell
animal = Animal.first
# インスタンスが特定の値なのか問い合わせ
animal.cat?
=> true

# !でインスタンスのEnum値を更新
animal.dog!
animal.dog?
=> true

# Enumの値を取得
animal.kind
=> "dog"

# 文字列ではなく、DBに保存された数値を取得
animal.kind_before_type_cast
=> 1

# Enumの選択肢を取得
Animal.kinds
=> {"cat"=>0,"dog"=>1,"other"=>2,}

# 未定義の値を保存しようとするとArgumentErrorが発生します
Animal.create(name: "gon", kind: :person)
=> ArgumentError ('person' is not a valid kinds)

# 全てのkind: catを取得
Animal.now_on_cat

# 全てのkind: cat以外を取得
Animal.not_now_on_cat
```
[参考 Perfect Ruby on Rails](https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88-Ruby-Rails-%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-Perfect/dp/4297114623/ref=sr_1_1?adgrpid=55840125320&dib=eyJ2IjoiMSJ9.zwYSoqBTiQqAMC8FESUo4bqwxeDKUjRgXgO0Vq586LysdN5NF66OQZHtQFK7zjRr09FmPZN3U8gwR89AvwYsowXWUi77GbKutcpPlUa4do8K5oesA_U2Qo99wF6ykxpFjWGnw7dvU9md_4jTTl2NaYeKsqkCpLMfa9BXA9RwJgZWkxqS3UnM6V5o4NnkFnmLRjGf00l4IWNTNSSwAJIp68e4u6Ey80zk9v2YMLpjWado9882iWtx8vUefnRIQN4nmoHvHlQSbZgWu-M0ndX7rzzOaSxqSY_IHCxAWZFMO9g.iGsvuc0Hc2P0Uf0Bf9RT48jS4XhrY8hGvXmQTkP0nnQ&dib_tag=se&hvadid=259266803454&hvdev=c&hvlocphy=1009342&hvnetw=g&hvqmt=e&hvrand=16808610309163568230&hvtargid=kwd-398107106357&hydadcr=27517_10520072&jp-ad-ap=0&keywords=perfect+ruby+on+rails&qid=1728887278&sr=8-1)
[参考 Railsガイド](https://railsguides.jp/)
[tips][cpp][ProblemSolver] stack

※問題を解きやすくするcpp tipsです。

# stackの実装

stackは先入後出しのデータ構造です。これはシーケンシャルな配列上で、値の追加後に末尾を取り出すことと同義です。
cppでstackの実装をする場合、`<stack>`よりも`<vector>`の方が下記の点で実装しやすい場合があります。

- 末尾の値を参照し、変更できる


## 値の追加と参照
### `<stack>`でstackのpush実装

```cpp
#include <iostream>
#include <stack>
using namespace std;
int main(){
  stack<int> a;
  a.push(17);
  a.push(18);
  a.push(19);
  cout << a.top() << endl;
}
```

```output
19
```

### `<vector>`でstackのpush実装

```cpp
#include <iostream>
#include <stack>
using namespace std;
int main(){
  vector<int> a;
  a.push_back(17);
  a.push_back(18);
  a.push_back(19);
  cout << a.back() << endl;
}
```

```output
19
```

#### 末尾の値を変更

以下のように末尾の値を変更できます。
```cpp
a.back()++
```
```
cout << v[2]; // 20
```
or

```cpp
v.back() += 100;
```
```cpp
cout << v[2]; // 119
```

## 値の削除

### `<stack>`でstackのpop実装

```cpp
st.pop();
cout << st.top(); // 18
```

```output
18
```

```cpp
cout << st.size(); // 2
```

```output
2
```

### `<vector>`でstackのpop実装

vectorの`erase`は指定した要素を削除します。`pop_back()`を呼んでも同義です。

```cpp
v.erase(v.end())
cout << v.back(); // 18
```
or
```cpp
v.pop_back();
cout << v.back(); // 18
```
```output
18
```


```cpp
cout << v.size(); // 2
```

```output
2
```

## 備考

https://cpprefjp.github.io/reference/vector/vector/erase.html
Javaを基本からまとめてみた【DAO Tutorial 】

## 1. データ転送オブジェクト(DTO)を作成する

①Mainクラスを作成する

```Main.java



```
②Employee.javaを作成する

```Employee.java


```

## 2. DAOインターフェースを作成する

①DAO.javaを作成する

```EmployeeDAO.java


```


※ データアクセスで使用する全てのメソッドを定義する

②EmployeeDAO.javaを作成する

```EmployeeDAO.java


```


## 3. DAO実装を作成する

## 4. データソースを作成する

## 5. テストプログラムを作成する



## 参考サイト
[What is a DAO | DAO Tutorial for Beginners](https://www.youtube.com/watch?v=3J5L40MJfU4&list=PL3bGLnkkGnuX_Pa95v_FUdazcFhEF7iBi)
[DAO Interface | DAO Tutorial for Beginners]()
【Ruby】変数と引数の違いについて

# はじめに
こんにちは、progateでRubyを勉強したのち「ゼロからわかるRuby超入門」を勉強しています。
Rubyを勉強していて当たり前に変数とか引数という言葉が出てくると思うのですが、どう違うの。と言われたら明確に説明できますか？
中高の数学で変数があり、同じ意味でとらえてはいけないよということを本記事で紹介していきたいと思います

環境：ruby 3.3.5

# 変数とは
中高生数学でやった変数とは全く別物ということをまず前提で聞いてください。特に独学で勉強している方は、反射的に変数と聞けば`x`や`y`を想像してしまうのではないでしょうか。
知っている単語は無意識的に知っている知識で補おうとするので、勘違いしていることに気づかなくなってしまいます。そういったバイアスがあることを認識してさっそく変数はじめに
こんにちは、progateでRubyを勉強したのち「ゼロからわかるRuby超入門」を勉強しています。
Rubyを勉強していて当たり前に変数とか引数という言葉が出てくると思うのですが、どう違うの。と言われたら明確に説明できますか？
中高の数学で変数があり、同じ意味でとらえてはいけないよということを本記事で紹介していきたいと思います

環境：ruby 3.3.5

# 変数とは
中高生数学でやった変数とは全く別物ということをまず前提で聞いてください。特に独学で勉強している方は、反射的に変数と聞けば`x`や`y`を想像してしまうのではないでしょうか。
知っている単語は無意識的に知っている知識で補おうとするので、勘違いしていることに気づかなくなってしまいます。
そういったバイアスがあることを認識してさっそく変数についてみていきましょう。

変数とは、様々例えがありますが最初は概要を理解しやすいように、データや値を一時的に保存するための「名前付きの箱」と覚えておきましょう。
※含みを持たせた言い方をした理由は後々説明します。
プログラム内で、値を保持したり、その値を後で参照したり変更したりするために使用します。
値が変更するというところで、変数という名前がついていることがわかりますね。
```ruby:variable.rb
x = 10
y = 20
z = x + y
puts z  # => 30
```
`x` と `y` は変数です。`x` には 10、`y` には 20 という値がそれぞれ代入されています。
変数 `z` に、`x + y` の計算結果である 30 を代入しています。
改めて言いますが、数学の変数と違いますよ！ｗ

ここまでで、初めて学んだ方にはある程度変数の概要を理解していただけたと思います。
しかし、変数を箱だけで理解しようとすると後々苦労するので概要を理解できた方は以下の記事から変数の考え方について学びましょう。

https://qiita.com/scivola/items/2775fce84ff911fde36f#fn1

じゃあなんで箱っていったんだよ、と思われるかもしれませんがとっかかりとして説明しました。
変数ってなんだろって方にはまずは全体概要をつかんでもらって、けど変数は箱であるという理解だと限界があるので概要をつかめた方は
変数は名札であると理解しておきましょう。

# 引数
続いて、引数について説明していきたいと思います。
ややこしいことを言うかもしれませんが、引数は数学の変数と似ています。
そして、さらに引数にも実引数と仮引数があります
仮引数は、下記記載コードの`add(a, b)`の`a`と`b`を指します。
仮引数は関数定義時に設定され、のちに説明する実引数から渡されたデータを仮引数で受け取ります。
一方で、実引数は` add(10, 20)`の` 10`と`20`に該当します

実引数を`def add`の`a`と`b`に引き渡して`def add`が実行される仕組みとなっています。

```ruby:argument.rb
def add(a, b)
    a + b
end

result = add(10, 20)
puts result  # => 30
```
数学の変数と似てますよね。rubyに限らずですがプログラミングの変数と数学の変数は別物で、引数が数学の変数と似ていると思ってもらえれば大丈夫だと思います。


# まとめ
本日は変数と引数について説明しました。知識不足のためコメントにて助力をいただき記事の内容を一部修正しました。
変数についていろいろコロコロ意見変わってるなと思うかもしれませんが、私もコメントをいただいて理解を改めた次第です。
しかし、変数は箱であるという記述を残したのはこの記事を見て変数の簡単な概要を理解してほしい（箱のほうが理解はしやすいと思いました）という思いがあるからです。
特に独学だと余計に誰にも頼れないと思うので微力ながらお力になれば幸いです。
変数が箱であるという考えのみでは限界があるので、上記を見て変数についてある程度わかったら上記の記事にて「Ruby の変数は箱じゃない」を確認してください。
Go言語(Golang)における関数とメソッド


### 関数
関数は、独立して実行できるコードのブロックです。引数を受け取り、戻り値を返すことができます。

#### 例：
```go
package main

import "fmt"

// 関数の定義
func add(a int, b int) int {
    return a + b
}

func main() {
    result := add(3, 5)
    fmt.Println(result) // 出力: 8
}
```

### メソッド
メソッドは、特定の型に関連付けられた関数のことです。メソッドは、レシーバーと呼ばれる特別な引数を持ち、その型のインスタンスに対して呼び出されます。

#### 例：
```go
package main

import "fmt"

// 構造体の定義
type Rectangle struct {
    width, height int
}

// メソッドの定義
func (r Rectangle) Area() int {
    return r.width * r.height
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    area := rect.Area() // メソッドを呼び出し
    fmt.Println(area)   // 出力: 50
}
```

### まとめ
- **関数**は独立しており、特定の型に依存しません。
- **メソッド**は特定の型に関連付けられ、その型のインスタンスに対して呼び出されます。
paizaラーニング問題集「【シミュレーション 4】位置情報システム」を解いてみた

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__move_simulation

▼考え方

ポイントになる考え方1.～7.を以下に示します。

1.時刻t_1(=0),t_2,...,t_nと、各時刻におけるユーザーの位置情報(y,x)を、2次元リストtyxにセットします。以下に例を示します。

tyx = [[0, 0, 0], [100, 100, 100]]

2.リストtyxをもとに、題意に沿って計算した時刻とユーザの位置情報をリストuserlocationにセットします。以下に計算後の例を示します。

userlocation = [[0, 0, 0], [1, 1, 1], ...., [99, 99, 99], [100, 100, 100]]

3.各時刻におけるユーザーの位置情報を計算する処理になります。以下に概要を示します。赤文字の部分を説明しますと、リストtyxのt_i=0と3のデータから、t_i=1と2の位置情報を計算し、リストuserlocationにセットします。同様に、リストtyxのn行すべてを処理します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881331/9b308bf2-547c-c5bd-4a74-e60ed50d6f49.png)
							
4.リストtyxのt_i=0のデータを、リストuserlocationにセットします。

5.リストtyxのt_i=0と3は、3-0=3で1より大きい数値になりますので、題意よりt_i=1と2のユーザーの位置情報は、等速で直線移動したと想定して計算します。考え方5では、時間1あたりの移動量を計算します。

6.考え方5で計算した時間1あたりの移動量から、t_i=1と2のユーザーの位置情報を計算します。

題意より、座標が小数になる場合は小数点以下を切り捨てるか切り上げる必要があります。私は切り捨てを選択しました。明確な根拠はありませんが、切り上げた場合と四捨五入した場合はテストが通過しませんでした。また、意図通り切り捨てるために、int()を使用しました。

7.考え方3のfor文で、リストtyxの最後から1つ手前の行まで処理ができます。そのため、考え方7の処理で、リストtyxの最後の行をリストuserlocationにセットします。

▼コード
```py
########## 処理0(準備) インプット,リスト定義 ###########

n = int(input())

# 考え方1. 
tyx = [list(map(int,input().split(" "))) for i in range(n)]

# 考え方2.  
userlocation = []

########## 処理1 各時刻におけるユーザーの位置情報を計算、出力する処理 ###########

# 考え方3.
for i in range(1,n):
    
    # 考え方4.
    userlocation.append(tyx[i-1])

    # 考え方5.
    t_sabun = tyx[i][0] - tyx[i-1][0]
    if t_sabun > 1:
        
        y_sabun = tyx[i][1] - tyx[i-1][1]
        # y_zoubun: y軸方向の時間1あたりの移動量をセットする変数
        y_zoubun = y_sabun/t_sabun
        
        x_sabun = tyx[i][2] - tyx[i-1][2]
        # x_zoubun: x軸方向の時間1あたりの移動量をセットする変数
        x_zoubun = x_sabun/t_sabun

        # 考え方6.
        for j in range(1,t_sabun):
            userlocation.append([tyx[i-1][0]+j,int(tyx[i-1][1]+(y_zoubun*j)),int(tyx[i-1][2]+(x_zoubun*j))])

# 考え方7.
userlocation.append(tyx[i])

for i in range(len(userlocation)):
    print(userlocation[i][1],userlocation[i][2])
```
Fletアプリを実行しようとしたときにlibmpv.so.1が開けないと出た時の対処法

WSL2で
`flet run FILENAME.py`
を実行したときに以下のエラーが出た！

`Error while loading shared libraries: libmpv.so.1: cannot open shared object file: No such file or directory`

このエラーに対しては以下を実行することで解決しました。

```
sudo apt update
sudo apt install libmpv1
```

追記：
公式ドキュメントにLinuxでは追加の前提条件があったため乗せときます
https://flet.dev/docs/publish/linux#prerequisites
R6 データベーススペシャリスト 試験終了


先日、私にとって初めてのIPA高度試験区分を受験しました。
試験はデータベーススペシャリスト試験（以降、でスぺ）です
その感想を書きたいと思います。

この記事はデスぺ試験開催日の翌日に書いてます。

## 試験を受けた背景
　・文章力ないので論述の試験を受けたいが、いきなりLv4+苦手な論述に立ち向かえそうになかったから。
　・デスぺの勉強することにより、データの抽出・整理ができるようになりデータベースのみならず、DB設計だけでなくあらゆる情報の整理・整頓に役立つお思ったから
　・〇〇管理など基幹業務が題材となっていることが多いので、業務知識の勉強にもなる。
　・完成されたテーブルでしか実装したことないので、より上流から入り込みたかった。

## 勉強期間
・7月後半から開始

## 勉強比率
　　午前１：免除
　　午前２：10%
　　午後１：45%
　　午後２：45%
　午後試験にほぼ全振り(笑)

## 選択した問題
　午後１：問１、問２
　午後２：問２
　
## 手応え
　午前２：絶望
　　後の自己採点で13/25であることがわかり、イライラMAX
　午後１：わりとできた、
　　60%前後のボーダーにいるような気がする。
　　
　午後２：めっちゃできた。
　　　最低でも80%ぐらいは取れているのではないかと思うぐらいできた。
　　　
## 感想
　上記の手応えに書いてある通り午前２で爆死です（泣）
　午後の勉強に全振りして、午前問題をおろそかにした結果、一番気になる午後の採点結果を知ることなく不合格になるであろうことになっております。
　過去問道場で得点率70%ぐらいは取れていたので、余裕かましすぎました。
　ちょうど、理解が薄い部分がいくつか狙い撃ちのように出題され準備不足が露呈したことが本当に悔やまれます。
　
　知識を問う午前より、業務を把握し適切にデータモデルを設計することが大事だろ！
　だから、午前の不合格は取り消してほしい！とか自己中な愚痴を考えていますが
　どうにもならなさそうなので、あきらめて来年また受けようと思います。
　
　ただ、今回の受験で午後問題は対応できたことが知れたので、自信になったし
　背景に記載しているデータの整理や業務知識の獲得はできたと思うので勉強してよかったと思います。
　次は、僕が課題としている文章力克服のためシステムアーキテクトを受験したいと思います。
【ネットワーク】有線LANと無線LAN（Wi-Fi）の違い

# はじめに
この記事は、有線LANと無線LAN（Wi-Fi）の違いについて、自分なりに調べて学習した結果をまとめたものです。
自身のアウトプットのためにまとめたものですが、記事内容に間違いなどがあればコメントいただけると幸いです。

# ネットワークとは
二つのLANの話をする前に、まずはネットワークについてまとめます。
ネットワークとは、通信機器と通信機器を繋いだもので、同じネットワークで繋がれた機器同士でデータの送受信が可能です。
有線LANと無線LANとは、その名の通り、有線（ケーブル）で通信機器を繋ぐか、無線（電波）で通信機器を繋ぐかの接続方法のことです。

# 有線LANとは
有線LANとは、LANケーブルを用いて、物理的に通信機器同士を繋いで、ネットワークに接続する方法です。
オフィスの多くは有線LANを使用しており、サーバールームなどネットワークの大元となる場所から、各フロアや会議室に設置してあるWi-Fiルータやプリンター複合機に直接配線しているケースが多いです。
ルータに接続された後は、ルータが無線LANとして各フロア内や会議室内のネットワークを繋ぎます。
LANケーブルには直径5mm程度の「スタンダードタイプ」と、直径2mm程度の「極細タイプ」、平らな「フラットタイプ」の3種類があります。
スタンダードタイプは丈夫で、線が太いためノイズなどにも強いですが、取り回しが他2種類に比べて面倒です。
一方、極細タイプやフラットタイプは、線が細いため耐久性に難があり、取り扱いに注意が必要です。その代わり、取り回しがしやすく、デスクの周りや家具の裏に配線したり、PCに直接繋ぐ時などは便利です。

# 有線LANのメリット
・LANケーブルで直接繋ぐため、障害物や電波障害などの影響を受けにくい。
→壁や天井などの障害物、電子レンジなどの電波
・物理的な接続のため、電波を悪用される心配がなく、セキュリティ面で安心。
・ケーブルを機器に繋げば、ネットワークに繋がるため、無線LANよりも簡単にネットワークに接続できる。

# 有線LANのデメリット
・LANケーブルの劣化により、ネットワークの接続に影響が出る。
→折り曲げやケーブルを引っ張ったり、踏んだりすることで、ケーブルは痛んでいく。そもそも、耐用年数が約20年〜30年で自然劣化していく。
・物理的に繋ぐ必要があるため、配線に工夫が必要な場合がある。スマートフォンやタブレットには有線LANポートと呼ばれる接続口がないため、変換アダプタなどが必要になる。

# 無線LAN（Wi-Fi）とは
無線LAN（Wi-Fi）とは、電波を通信機器に送り、通信機器が電波を受信することにより、ネットワークに接続する方法。
無線Wi-Fi用のルータから、各通信機器に電波が送られます。各通信機器はその電波を受信して、ネットワークに接続します。

# 無線LANと Wi-Fiの違い
無線LANとWi-Fiは厳密には異なる意味を持ちますが、近年ではほぼ同一の意味で使われています。
無線LANとは、無線通信で構築されたネットワークそのものを指し、Wi-Fiは無線通信の中の一つの規格のことです。つまり、WiFiとは無線LANの国際標準規格となります。
無線LANの規格はIEEE802.11と呼ばれ、この規格に合格した製品が Wi-Fiとなります。無線LANの国際標準規格に合格した製品＝ Wi-Fiとなることから、無線LAN＝ Wi-Fiという認識が定着しました。
無線LANの通信規格にはWi-Fiの他に、BluetoothやNFC、WiMAXなどがあります。

# 無線LAN（ Wi-Fi）のメリット
・物理的にケーブルを繋ぐ必要がないため、電波の届く範囲内ならどこでもネットワーク通信が可能。
・ケーブルを配線する手間やスペースが必要なく、配線のことを考える必要がありません。
・複数台の通信機器に繋ぐのも簡単です。

# 無線LAN（ Wi-Fi）のデメリット
・天井や壁などの障害物により電波が届きにくくなってしまう。また電子レンジなどの家電製品が発する電波の影響でネットワークに繋がりにくくなってしまうことがあります。
・有線LANに比べて、電波であるため、電波を盗まれたり、悪用されるなどセキュリティ面での心配があります。

# 有線LANと無線LAN（ Wi-Fi）の使い分け
大規模なデータを扱う場合や、オンライン会議などで使う場合など、通信品質を高めたい場合は有線LANを使用した方が良いと思います。
一方で、場所を気にせず通信したい場合や、大規模なデータを扱わない場合などの通信品質をそれほど考慮しなくても良い場合は無線LAN（ Wi-Fi）を使用した方が良いと思います。
また、企業や学校のように、サーバールームなどのネットワーク基幹部分から各フロアへの接続は有線、各フロアのルータから各通信機器への接続は無線LAN（ Wi-Fi）といった具合に、使い分けるのも良いと思います。

# まとめ
今回は有線LANと無線LAN（ Wi-Fi）について、まとめてみました。
会社の上司からは、実際に自宅の Wi-Fiルータやモデムの設定を触ってみると、よりネットワークの仕組みが理解できると教わりました。
自宅のWi-Fiは備え付けのものなので、設定を変更できるかは分かりませんが、実際にルータやモデムを触ってみての感想や気づきなども次回以降記事に出来たらと思っています。
最後に、記事を読んで間違いの指摘などがあればコメントで教えていただけると幸いです。
ありがとうございました。
Macの大文字／小文字を区別しない仕様でハマった

## 環境
以下の環境で動作させています。
```
% sw_vers
ProductName:	macOS
ProductVersion:	12.6.5
BuildVersion:	21G531
```

## ハマってしまった事象
Macが大文字／小文字を区別しない仕様を失念していて、Mac環境で動作していたコードがLinux環境へのデプロイした際にエラーを引き起こしました。


```
// classes/trait/fuga.php　というトレイトファイルを呼び出したい


【classes/piyo.php】

namespace Hoge;

use Hoge/Trait/fuga.php // traitというディレクトリを大文字で記述してしまったことでエラーが発生

```

Macで「aa.php」と「AA.php」の作成を試みたところ、「AA.php」という名前の新しいファイルは作成されず、「aa.php」が更新されるだけでした。

```
% touch aa.php
% ls
aa.php
% touch AA.php
% ls
aa.php
```



## Macの大文字／小文字の区別はAPFSのオプションだった

事象について調べたところ、Macでの大文字と小文字の区別はディスクフォーマット時に
**Apple File System（APFS）** というファイルで指定されるオプションとなっていました。

[同じような事象に見舞われていたブログ](https://dev.classmethod.jp/articles/mac-apfs-ignore-case/)があったため同じ手順で確認したところ、自身の使用PCも大文字／小文字を区別しない設定になっていました。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_3890454_0291ef0c-6a40-7263-abaa-29deb33f3090.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890454/9c85bafe-d982-5cc4-b1c7-b6a3c3f87ae4.png)

[対処法](https://discussionsjapan.apple.com/thread/251660520?sortBy=rank)も存在するらしいのですが、再フォーマットが必要とのことで一旦保留…。



## 所感

開発／反映先でのOSの違いによる仕様の違い、特に使用するMacの仕様について正しく理解をする必要があると再認識させられました。

## 参考にした記事
https://discussionsjapan.apple.com/thread/251660520?sortBy=rank

https://dev.classmethod.jp/articles/mac-apfs-ignore-case/

https://www.wetch.co.jp/note/%E4%BB%8A%E3%81%95%E3%82%89mac-linux%E3%81%AE%E5%A4%A7%E6%96%87%E5%AD%97%E5%B0%8F%E6%96%87%E5%AD%97%E5%95%8F%E9%A1%8C%E3%81%A7%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F%E8%A9%B1/
【基本情報技術者】新人研修中に基本情報に合格しました


社会人２年目になりましたが、社会人１年目に取得した基本情報技術者試験について書きます。

## 僕のスペック
IT企業の自社開発部門配属、公立大学の先進機械科卒業、AtCoder緑(大学生当時)、センター国語５割弱

## 受験した経緯
大学は非情報科で、IT企業に就職し、現在はiOSアプリ開発、Webアプリ開発を行っています。
当時、現在の企業に入社してから4ヶ月間の新人研修中でした。基本情報技術者試験を取得するきっかけになったのは、配属先の事業部長から配属までに基本情報は取れと言われたことからです。
非情報科出身ということもあり、ITに対しての知識がほとんどありませんでした。体系的な知識を得るためにもちょうどいい機会だと思い、受験を決意しました。

## 受験結果
### 点数
科目A：__730__、　科目B：__900__

### 勉強法
勉強期間は __１ヶ月__ 、平日 __３時間__、休日 __８時間__ ほど

### 科目A

 https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C06%E5%B9%B4-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%86%E3%82%AF%E3%83%AC%E3%83%90%E3%83%BC%E6%96%B9%E5%BC%8F%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-%E3%81%8B%E3%82%84%E3%81%AE%E3%81%8D%E5%85%88%E7%94%9F%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E6%95%99%E5%AE%A4-%E6%A0%A2%E6%9C%A8-%E5%8E%9A/dp/4297138271/ref=pd_bxgy_d_sccl_1/357-1674573-3691339?pd_rd_w=TbBJU&content-id=amzn1.sym.5efa75be-7115-44c4-99e0-09e0ccdabd3a&pf_rd_p=5efa75be-7115-44c4-99e0-09e0ccdabd3a&pf_rd_r=6BMVV9ZT6RYAMCJF1P1P&pd_rd_wg=gY455&pd_rd_r=1969b24e-9690-4092-8648-2e5a3bd28d61&pd_rd_i=4297138271&psc=1 

(↑アフィリエイトではありません)
「イメージ＆クレバー方式でよくわかる」をひたすら読む。過去問はほとんどやっていません。IPAのテストの科目A(午前)は過去問がかなり流用されていますが、基本情報の過去問は参考書に書いてある内容そのままだったりしたので、参考書を読んでいれば回答できると感じやっていませんでした(面倒くさかった)
実際、読んでいただけで突破できたのでかなり再現性はあると思います。

### 科目B
科目Bは８割プログラミング、２割セキュリティなので、セキュリティは勉強せずプログラミンをだけを対策するのもいいかもしれません。僕は公式の問題例みたいなやつを一回解きました。公式の問題は７割弱くらいしか取れなかったと思います。本番の問題の方が簡単でしたね。
大学の時に競技プログラミン(AtCoder)をやっていてある程度for文などの簡単なコードは理解できたので科目Bはそこまで対策せず９割取ることができました。実際に本試験を受けてみて、プログラミングがどうしても解けない、苦手という方はAtCoderなどの競技プログラミングで簡単順に並べた過去問題を５０問くらい解いてみることもいいかなと思いました。

## 取得して良かったこと
①話がわかる
配属してから仕事場の会話で専門用語が必然的に多々出てきます。その時にその単語知っているか知っていないかの差は大きいです。知らないことは聞いてもいいのですが、知らないことの説明でまた知らないことが出てきてしまうなどのループにハマることがあります。なので、ある程度の知識はあった方がいいですね。

②やる気を認められる
僕の会社は資格を取る人が極端に少ないので、資格を取るだけでやる気があると思ってくれます。
そのような環境でなくても、資格取得で報奨金が出ることもあるのでそちらをモチベにしても良さそうです。
【Ant】build.xmlを実行後「シンボルを見つかりません」というエラーが出る

## 前提
現場業務中です。
言語：Java
フレームワーク：Struts
ビルドツール：Ant
という、相当古いシステムのため非常にニッチかと思いますが、
備忘録も兼ねて投稿します…
## やりたいこと
コード修正後、build.xmlを実行し、Jarファイルを生成、デプロイをしたい。
## エラー内容
「シンボルが見つけられません」というエラーが出力される。
## 調査
Import文でエラーが出ている。
いくつかのクラスで、Javaの共通部品（Utilクラス等をまとめたパッケージ）を
インポートできていない。
しかし、共通部品のJavaファイル自体は確実に存在しており、
プロジェクトエクスプローラーでも表示されている。
## 原因
Jarファイルの生成が出来ていない。
## 解決策
build.xmlファイルを実行するとき、ビルドターゲットの順序を指定する。
build.xmlを右クリック、「実行の構成」を選択。
ターゲットから、ビルドする部品を選択する。
このとき「共通部品」→「インポート文でエラーが出ている部品」の順でビルドするよう指定する。
SQLの基本操作と応用機能を解説：リレーショナルデータベースの効率的な管理方法

## はじめに
SQL（Structured Query Language）は、リレーショナルデータベースに対してデータの操作や管理を行うための言語です。

CRUDは、データベースにおける基本的な操作の頭文字を取ったもので、データの作成（Create）、読み取り（Read）、更新（Update）、削除（Delete）の4つの操作を指します。

これらの操作を理解することで、データベースの管理や利用がより効果的に行えるようになります。

## 知識整理
以下の内容を前提に、サンプルのusersテーブルを使用します。

:::note
このテーブルは、ユーザー情報を管理するためのもので、以下のカラムを持つと仮定します。
**・id (INT, PRIMARY KEY, AUTO_INCREMENT)**
**・username (VARCHAR)**
**・email (VARCHAR)**
**・password (VARCHAR)**
:::

## SQLの特徴

SQLはリレーショナルデータベースを操作するための標準言語であり、データを表形式（テーブル）で保存し、JOIN機能を使って複数のテーブルのデータを結合・抽出できます。

https://hnavi.co.jp/knowledge/blog/sql/

また、トランザクション管理を行うことで、データの一貫性と正確さを確保し、操作をまとめて実行しつつ、問題が発生した際には元に戻すことが可能です。

https://blog.senseshare.jp/database-transaction.html

SQLは国際標準化機構（ISO）により標準化されていますが、RDBMSごとに拡張機能や違いがあります。

## SQLコマンド集

### 1. Create（作成）
新しいレコードをテーブルに追加するには、INSERT文を使用します。

```sql
-- 新しいユーザーを追加
INSERT INTO users (username, email, password) 
VALUES ('alice', 'alice@example.com', 'securepassword123');
```

### 2. Read（読み取り）

テーブルからデータを取得するには、SELECT文を使用します。

```sql
-- 全てのユーザーを取得
SELECT * FROM users;

-- 特定のユーザーを取得（例えば、usernameが'alice'のユーザー）
SELECT * FROM users WHERE username = 'alice';

-- 特定のカラムのみ取得（例えば、usernameとemail）
SELECT username, email FROM users;
```

### 3. Update（更新）
既存のレコードを更新するには、UPDATE文を使用します。

```sql
-- usernameが'alice'のメールアドレスを更新
UPDATE users 
SET email = 'alice_new@example.com' 
WHERE username = 'alice';
```

### 4. Delete（削除）
レコードを削除するには、DELETE文を使用します。

```sql
-- usernameが'alice'というユーザーを削除
DELETE FROM users 
WHERE username = 'alice';
```

### 5. トランザクションの使用

複数の操作をまとめて行う場合、トランザクションを使用して、操作を一括管理できます。

```sql
-- トランザクションの開始
START TRANSACTION;

-- ユーザーの追加
INSERT INTO users (username, email, password) 
VALUES ('bob', 'bob@example.com', 'bobpassword123');

-- ユーザーのメールアドレスを更新
UPDATE users 
SET email = 'bob_new@example.com' 
WHERE username = 'bob';

-- 変更を確定
COMMIT;

-- エラーがあった場合、ロールバック
ROLLBACK;
```

### 6. 条件付き操作

条件に基づいてデータを操作する場合、WHERE句を使用します。

```sql
-- 特定のメールアドレスを持つユーザーを取得
SELECT * FROM users 
WHERE email = 'john@example.com';

-- usernameに特定の文字列を含むユーザーを取得
SELECT * FROM users 
WHERE username LIKE '%doe%';
```

### 7. ソートと制限

結果セットをソートしたり、取得するレコード数を制限することも可能です。

```sql
-- ユーザーをidでソートし、上位5件を取得
SELECT * FROM users 
ORDER BY id ASC 
LIMIT 5;
```

### 8. グルーピングと集計

データをグループ化し、集計関数を使うこともできます。

```sql
-- ユーザーの数をカウント
SELECT COUNT(*) AS user_count FROM users;

-- ユーザーのメールアドレスにドメインごとのカウント
SELECT SUBSTRING_INDEX(email, '@', -1) AS domain, COUNT(*) AS user_count 
FROM users 
GROUP BY domain;
```

### 9. テーブルの作成と削除

テーブルを作成したり削除する方法もあります。

```sql
-- usersテーブルの作成
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL,
    password VARCHAR(100) NOT NULL
);

-- usersテーブルの削除
DROP TABLE users;
```

## まとめ

これらの基本的なCRUD操作を理解することで、SQLを使ってデータベースの管理や操作ができるようになります。

実際にデータベースを使用して、これらのコマンドを試してみることをお勧めします。SQLは強力なツールであり、データの操作において非常に役立ちます。

さらに具体的な質問や、他のSQLのトピックについて知りたいことがあれば教えてください！

## 参考文献

https://qiita.com/shuyam/items/809ff4123d8dcb7321f9
Fedora 40にVirtualBoxをインストール

# 概要

fedora 40にVirtualBoxをインストールしました。

そのとき行った作業を記録として残しました。

# ダウンロード

以下のURLからOracle VM VirtualBox Base PackagesとOracle VM VirtualBox Extension Packをダウンロードしました。

https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

# インストール

上記のサイトよりダウンロードしましたファイルを使い、インストール作業を行いました。

## Oracle VM VirtualBox Base Packages

ダウンロードしたファイルがありますディレクトリへ移動し、以下のコマンドを実行しました。

```sh
sudo dnf install ./VirtualBox-7.0-7.0.18_162988_fedora40-1.x86_64.rpm 
```

## Oracle VM VirtualBox Extension Pack

ダウンロードしたファイルがありますディレクトリへ移動し、以下のコマンドを実行しました。

```sh
sudo VBoxManage extpack install ./Oracle_VM_VirtualBox_Extension_Pack-7.0.18.vbox-extpack 
```

# 起動

私の環境ではgnomeのランチャーにVirtualBoxのアイコンが追加されましたので、そちらから起動しました。

仮想マシン一覧の画面が表示されますと、起動成功となります。
GitHub Actions - Actのイベントペイロード、環境変数等の指定

# 内容

Github Actionsで実行される処理をローカルで行うことができる[Act](https://nektosact.com/introduction.html)のRunner（実行環境）で、  
Actのイベントペイロード、環境変数等の指定方法について記載する

# GitHubコンテキスト（`github.xxx`）の指定

調べた限りでは指定できないぽい

# イベントペイロード（`github.event.xxx`）の指定

指定する値は、[Webhook のイベントとペイロード](https://docs.github.com/ja/webhooks/webhook-events-and-payloads)参照

```json:.github/act/event.json
{
  "action": "opened",
  "number": 100,
  "pull_request": {
    "head": {
      "ref": "sample-head-ref"
    },
    "base": {
      "ref": "sample-base-ref"
    }
  }
}
```

実行例

```bash
act -W .github/workflows/test.yml -j test -e .github/act/event.json
```

# `inputs`の指定

`workflow_call`等のinputsの指定

```yaml:.github/workflows/test.yml
on:
  workflow_call:
    inputs:
      pr_number:
        type: string
        required: true
      ref:
        required: true
        type: string
```

```json:.github/act/event.json
{
  "inputs": {
    "pr_number": 100,
    "ref": "feature/test-branch"
  }
}
```

実行例

```bash
act -W .github/workflows/test.yml -j test -e .github/act/event.json
```

# Environment variables（`vars.xxx`）の指定

```text:.github/act/.vars
ACCOUNT_ID="1234567890"
REGION="ap-northeast-1"
```

実行例（ファイル指定）

```bash
act -W .github/workflows/test.yml -j test --var-file .github/act/.vars
```

実行例（値指定）

```bash
act -W .github/workflows/test.yml -j test --var VARIABLE=somevalue
```

# Environment secrets（`secrets.xxx`）の指定

```text:.github/act/.secrets
SECRETS_ARN="xxxxx"
```

実行例（ファイル指定）

```bash
act -W .github/workflows/test.yml -j test --secret-file .github/act/.secrets
```

実行例（値指定）

```bash
act -W .github/workflows/test.yml -j test --secret-file -s MY_SECRET=somevalue
```

以下のように値を指定しない場合は環境変数から参照される

```bash
act -W .github/workflows/test.yml -j test --secret-file -s MY_SECRET
```

## `GITHUB_TOKEN`の指定

実行例

```bash
act -W .github/workflows/test.yml -j test -s GITHUB_TOKEN="$(gh auth token)"
```

# 環境変数の指定

```text:.github/act/.envs
AWS_ACCESS_KEY_ID="xxxxxx"
AWS_SECRET_ACCESS_KEY="yyyyyy"
AWS_SESSION_TOKEN="zzzzzz"
```

実行例

```bash
act -W .github/workflows/test.yml -j test --env-file .github/act/.envs
```

# アクター（`github.actor`）の指定

実行例

```bash
act .github/workflows/test.yml -j test -a "dependabot[bot]"
```

# `env.ACT`フラグ

Actから実行した場合、環境変数に`ACT`が追加される  

以下、AWS認証処理に利用した例  
Actからの実行時はAWS認証をスキップし、  
[環境変数の指定](#環境変数の指定)で設定した認証情報でAWSアクセスするようにしている

```yaml
runs:
  using: 'composite'
  steps:
    - name: AWS Credentials
      if: ${{ !env.ACT }}  # Actからの実行時はスキップ
      uses: aws-actions/configure-aws-credentials@v4
      with:
        aws-region: ${{ inputs.region }}
        role-to-assume: arn:aws:iam::${{ inputs.account_id }}:role/${{ inputs.role_name }}
        role-duration-seconds: 3600
```

# 参考

- [act - User Guide](https://nektosact.com/usage/)
- [nektos/actのgithubコンテキストの確認](https://qiita.com/Sasaki1994/items/7ff4e5b3e8ae5957e50a)
フィルターで非表示となっている行を無視して、列幅を自動調整する

Excelで列幅をセルの文字列に合わせて自動調整するには、列番号の境界線をダブルクリックすれば、自動調整されます。

![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479442/fc4490c8-025a-50ca-6364-0a659978d553.png)

なお、フィルターで一部の行が非表示になっている場合は、列番を自動調整したときに、下記のように非表示になっている行も含めて列幅が調整されます。

![スクリーンショット 2024-10-14 132619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479442/d61d86c9-b532-a470-5f73-cf7f2fff41a0.png)

長い文字が入力された行が非表示の場合に、最長の文字が入力されたセルに合わせて自動調整されるため、上記画像のように余分な幅が生まれます。
フィルター箇所のみを印刷等で横幅１ページで印刷する場合に、なるべく文字が小さくならないようにしたいときは、この余白は余計です。かと言って、自分で幅を調整するのは面倒・・・。

そういうときは２つの対応策があります。

# １．可視セルのみ選択状態にしてセルの書式から列幅を自動調整する
列幅を調整したいセルを範囲選択します。
そのままでは非表示の箇所も含みますので、セルを範囲選択した状態でALT＋;で可視セルのみを選択状態にします。
その上で、［ホーム］タブの［セル］グループにある［書式］をクリックして［列の幅の自動調整］をクリックします。

![スクリーンショット 2024-10-14 133606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479442/9912b60b-6b3d-e72e-2135-624820631e7c.png)

そうすると、非表示のセルは無視して、列幅が自動調整されました。（上記画像はすでに実行後の状態です。）

# ２．ExcelVBAで列幅を自動調整する
列幅を自動調整したい列を下記のように選択して、マクロを実行します。
そうすると、フィルターで非表示となっている行を無視して自動調整されます。（下記の画像はすでに実行後の状態です。）

![スクリーンショット 2024-10-14 133426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479442/6b63347b-d799-c477-f1db-b7c36c2042f3.png)


<details open><summary>コードは下記の通りです。</summary>

```vb:ExcelVBA
Sub sb非表示セルを無視して列幅自動調整()
    Dim i As Long
    For i = 1 To Selection.Columns.count
        Call sb非表示セルを無視して列幅自動調整サブ(i)
    Next i
End Sub

Sub sb非表示セルを無視して列幅自動調整サブ(columnIndex As Long)
'用途：選択列の幅を表示されている行の最大列幅で自動調整（非フィルター非表示を考慮しない）   
    Dim SelectedColumn As Range
    ' アクティブシートの使用範囲に基づいて範囲を設定
    Set SelectedColumn = Intersect(Selection.Columns(columnIndex), ActiveSheet.usedRange)
   
    Dim TargetRng As Range
    Dim MaximumColumnWidth As Double
    MaximumColumnWidth = 0 ' 最大列幅を初期化子※Double型としているのは、列幅が小数点以下まで取得可能なため
       
    ' 最初に列幅を最小(0)に設定します。
    Selection.Columns(columnIndex).ColumnWidth = 0
   
    For Each TargetRng In SelectedColumn.Rows ' 選択している列内の各セルをループ
        If Not TargetRng.Hidden And Not IsEmpty(TargetRng.Value) Then ' セルの行が非表示でなく、セルが空でない場合
                 
            TargetRng.Columns.AutoFit ' 列幅を自動調整
            Dim AutoFitWidth As Double
            AutoFitWidth = TargetRng.ColumnWidth ' AutoFitWidthに自動調整した列幅を代入
           
            If AutoFitWidth > MaximumColumnWidth Then ' 自動調整した列幅がこれまでの最大列幅より大きい場合
                MaximumColumnWidth = AutoFitWidth ' 最大列幅を更新
            End If
        End If
    Next TargetRng
 
    SelectedColumn.ColumnWidth = MaximumColumnWidth ' 選択している列全体の列幅を最大列幅に設定
       
End Sub
```
</details>
実行結果自体は、１．と２．で変わりませんので、お好みで使い分けてください。
私は、可視セルのみ選択状態にするショートカット等を覚えるのが面倒なので、リボンにこのマクロを登録して使っています。

:::note info
[参考:初心者のためのOffice講座－選択したセル範囲の列幅を自動調整するには［列の幅の自動調整］](https://hamachan.info/excel2019-jidoutyousei/)
:::
ESP32: Thonny の使い方

Arch Linux で確認しました。
こちらを行って、MicroPython のプログラムが動くことを確認しておきます。
[ESP32: MicroPython の使い方](https://qiita.com/ekzemplaro/items/8158dcd5035337fa204d)

## インストール

```bash
yay -S thonny
```

## 起動

```bash
thonny
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/263fe89b-b96a-85cc-9e9e-d4542c71197c.png)

バージョンの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/977957e4-2352-300b-6163-f5dd7d908760.png)

インタプリタの設定
MycroPython(ESP32)
/dev/ttyUSB0
を選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4bdac86f-f245-4738-b710-0a3f0db6b238.png)



## プログラムの実行

コードの入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e329497c-e8ca-6604-064d-8d3b8a71e51c.png)


実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d4d23fae-24de-dd63-6c9a-94787278bed3.png)
Reactで縦型のタイムラインUIを実装してみた

# はじめに
2021年～2024年のようにタイムラインが記載されてるwebサイトをたまに見かける事があり、どうやって作るのか気になったので調べてみました。`react-vertical-timeline-component` というライブラリがありましたので、これを使わせていただきタイムラインコンポーネントを作成してみます。

# ゴール
画像のような縦型のタイムラインコンポーネントを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/51328a49-1d93-037a-5b5c-580c762c47a9.png)


# 環境
- react: 18.3.1
- vite: 5.4.8

# インストール
```
npm install react-vertical-timeline-component
```
こちらをインストールし使わせていただきます。

https://github.com/enumura1/timeline-component-tt

https://www.npmjs.com/package/react-vertical-timeline-component


# タイムラインの作成

```jsx:App.jsx
import { VerticalTimeline, VerticalTimelineElement } from 'react-vertical-timeline-component';
import 'react-vertical-timeline-component/style.min.css';

// サンプルデータを準備
const timelineElements = [
  {
    id: "event-2024",
    date: "2024",
    title: "title 2024",
    description: "description description description description description",
    color: "#AED6F1"
  },
  {
    id: "event-2023",
    date: "2023",
    title: "title 2023",
    description: "description description description description description",
    color: "#A3E4D7"
  },
  {
    id: "event-2022",
    date: "2022",
    title: "title 2022",
    description: "description description description description description",
    color: "#F5B7B1"
  },
  {
    id: "event-2021",
    date: "2021",
    title: "title 2021",
    description: "description description description description description",
    color: "#FAD7A0"
  }
];

export default function TimelineExample() {
  return (
    // 縦線の色を指定
    <VerticalTimeline lineColor="#ddd">
      {timelineElements.map((element) => (
        <VerticalTimelineElement
          key={element.id}
          className="vertical-timeline-element--work"
          // 背景色とテキスト色を設定
          contentStyle={{ background: element.color, color: '#0D266A' }}
          // ◀部分の色
          contentArrowStyle={{ borderRight: `7px solid ${element.color}` }}
          // 日付
          date={element.date}
          // アイコンの背景色
          iconStyle={{ background: element.color }}
          // アイコン
          icon={<span style={{ fontSize: '32px', display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%' }}>🌟</span>}
        >
          <h2 className="vertical-timeline-element-title">{element.title}</h2>
          <p>{element.description}</p>
        </VerticalTimelineElement>
      ))}
    </VerticalTimeline>
  );
}
```


# 動作確認

サーバを立ち上げて見た目を確認します。

```
npm run dev
```

縦方向に2021～2024年のタイムラインが表示されて並んで表示されている事を確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/5a5f7c12-10a4-113d-acf7-923612990b68.png)
今更SourceTreeからGithubに繋いだときに認証エラーで詰まった話

# 概要

久しぶりにSourceTreeからGitHubのリポジトリに変更を`push`しようとした際、エラーが発生して少し詰まったので、備忘録的に解決方法を共有します。

# 解決方法まとめ

- **SourceTree**からGitHubに接続するために[Personal Access Tokens](https://github.com/settings/tokens?type=beta)が必要
- SourceTreeの`Advanced`設定から、**事前にGitHubアカウント情報を削除**
- **Personal Access Token**発行時の推奨権限：
  - **Contents**：Read and write
  - **Commit Statuses**：Read and write
  - **Pull Requests permissions**：Read and write
  - **Workflows permissions**：Read and write

# 背景

SourceTreeからGitHubへの`push`を試みた際に、**認証エラー**が発生し接続ができなくなりました。

- **SourceTree**経由の`pull`は成功  
- コマンドライン上での`git push`も正常  
- しかし、**SourceTreeからの`push`だけ失敗**

# 原因

GitHubではセキュリティ向上のため、**パスワードでの認証を廃止**し、**Personal Access Token**の使用が必須になっているみたいです。(多分結構前から、、、)

**Personal Access Token**の発行時には適切な権限を設定する必要があります。

# 対応手順

## 1. 古い認証情報をSourceTreeから削除する。

`SourceTree > Settings > Advanced`から、GitHubの**アカウント情報を削除**します。

**日本語設定**の場合、「`Advanced`」ボタンが押せないことがあるため、その場合は**言語を英語**に変更します。

![スクリーンショット 2024-10-14 13.22.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/2d6b86aa-711a-e7f5-0b2e-83a26ade957d.png)

## 2. Personal Access Tokens発行画面にアクセス

[GithubのPersonal Access Tokens発行画面](https://github.com/settings/tokens?type=beta)にアクセスし、`Fine-grained Tokens`の`Generate new token`を選びます。

![スクリーンショット 2024-10-14 13.28.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/41a9f6e7-5293-7acb-2d29-f127333c53ad.png)

## 3. Personal Access Tokensの権限を選択

`Repository Access`を`All repositories`に設定します。
その後、`Permission > Repository permissions`から下記の権限を選択します。

| 名前 | レベル | 概要 |
| ---- | ---- | ---- |
| Contents | Read and write | git clone, git pull, git push に必要|
| Metadata |Read-only | リポジトリメタデータの取得に必要（git ls-remote など）|
| Pull requests |Read and write  | プルリクの作成・操作に必要 |
| Workflows permissions |Read and write  | `git push`でGitHub Actionsをトリガーする場合必要 |

![スクリーンショット 2024-10-14 13.38.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/d36384be-5976-0943-fd39-9bba632b4885.png)
![スクリーンショット 2024-10-14 13.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/365c69ab-e231-046c-9f58-3a478e9f58fc.png)
![スクリーンショット 2024-10-14 13.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/60220c08-2107-69c3-6728-ee9a35da58ee.png)
![スクリーンショット 2024-10-14 13.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/89a8b2ac-b536-235f-a235-186c918f8166.png)

## 3. 発行したトークンをSourceTreeに設定

SourceTreeで`push`を行った際に、認証を求められるので、先ほど、発行したトークンで認証を行ってください。

![スクリーンショット 2024-10-14 13.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703812/8eeefcda-7a30-8719-110f-99d2073a362c.png)

# FAQ

## `git pull`時に403エラーがでる。

権限設定がたりていません。

[3. Personal Access Tokensの権限を選択](https://qiita.com/Nicasdream0/items/a9f20dc4e3dd880bc3d4#3-personal-access-tokens%E3%81%AE%E6%A8%A9%E9%99%90%E3%82%92%E9%81%B8%E6%8A%9E)を見直してください。

## `git pull`時に400エラーがでる。

`Personal access tokens (classic)`を使っていた場合、400エラーがでる場合があります。

トークン発行時に`Tokens (classic)`ではなく、`Fine-grained Toknes`を選択してください。

# 感想

エンジニア歴五年目でこんなところに躓くとは思わなかった、、、
自己紹介サイト (開発背景、使用技術、選定技術の理由...)


 
      
# 自己紹介サイトURL
# https://ora-hp.onrender.com/

# 使用技術
#### フロントエンド
- HTML: 構造を定義するためのマークアップ言語
- CSS: デザインとレイアウトを担当
- NES.CSS: レトロなスタイルを簡単に適用できるCSSフレームワーク

#### バックエンド
- Flask: 軽量なPythonフレームワーク
- Docker: コンテナ化
- Render.com: コンテナ化したアプリケーションをホストするためのクラウドプラットフォーム
- Github Actions: 継続的インテグレーション/デリバリー(CI/CD)パイプラインの構築
- Gunicorn: Flaskアプリケーションを本番環境で実行するためのWSGIサーバー

# 選定技術の理由
#### レトロなタッチで独創的なデザインのHPを作成しつつ、自動デプロイが可能な効率的な開発環境を構築することを目的とした為。

# 今後の展望
#### ブログページの更新
【超初学者】AWSのサービスをポケモン方式で覚えてみる

## :book: 購読対象
- AWS超初心者
- SAA勉強中し始めた方
- AWSのサービスが多すぎてめまい症状を催している方
- ポケモン好きな方

:::note warn
登場するポケモン、仕様は初代をベースとしております。
:::

## :beginner: はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/2a7db5a6-a11b-416f-68e7-69f2d3812f18.png)
突然ですが、あなたはポケモンとAWSサービスどちらが覚えやすいですか？
どちらも200以上のサービス（ポケモン）が存在していて覚えるのも一苦労ですよね:sweat_drops:

私はポケモン大好きなのでニドラン♂とニドラン♀の違いも余裕で分かりますし、
エビワラーとサラムラーの違いが判らない人とかありえない:frowning2:という感じです。

一報AWSに関しては
ALB/NLB/S3/EC2わけのわからない2つとか3つの英語を並べられてもなんのこっちゃ…
>EBSとEFSの違いは何ですか？

そんなわかるか～ボケー！:rage:と苦戦しておりました。（約1年前...）
今ではポケモンと同じくらいサービスも覚えていますし、より深い知識もついたと思います。
色々な覚え方はあると思うのですが、私の覚え方を紹介できればと思います:dizzy:


## :baby_chick: タイプ別に覚える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/868ec31b-a12d-67a1-2c7f-3a5276f1d7d8.png)

一部ですがタイプ別にポケモンが並んでいますね。あなたのお気に入りのポケモンはいましたか？新たなポケモンをゲットした際は、まずそのポケモンのタイプを覚えると思います！タイプが分かれば相性のよいポケモンが分かったり、技マシンを覚えられそうか？とかいろいろと楽しみが増えますよね:smiley:


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/3f60ba5a-3cf9-82d9-61fd-03d864ddf142.png)

こちらはAWSのサービスのタイプ別の図です。こちらもほんの一部なのですが、ポケモンのようにタイプ別に分けることができます。新しいサービスを覚える際はこのタイプ（種類）を覚えると良いですよ:point_up:

:::note info
ポイント：最初はなんとな～く覚る感じで良いと思います。
ガルーラは「ノーマル」「格闘」どっちかなんだよなー。みたいな感じで
:::


## :baby_chick: 効果はばつぐん/効果はいまいち
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/23416bff-d6d5-90c6-4456-17d4cd671e28.png)

はい、ゼニガメの例ですがどのタイプに効果はばつぐん、いまひとつか相性の良いタイプか覚えますよね。イシツブテにピカチュウの電気ショックは効きませんからね:zap:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/df21293d-9188-6851-911a-e4d3d7e568ed.png)

効果は抜群の技で攻め、相手からみて効果はいまいちの相性の相手と戦う。これがポケモンのセオリーですね。AWSでも同じです。サービスにおけるメリット、デメリットをしっかり覚えることが大事です。

:::note info
ポイント：最初はざっくり1ワードで覚える感じが良いと思います。
- メリット：安い！らくちん！
- デメリット：起動が遅い！長時間起動できない！
:::

## :baby_chick: ポケモンの世界で言うと？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/5e3f17e8-57f4-517c-7ec5-a7b766231bb7.png)

どうしても覚えるのが厳しい場合はポケモンの世界で例えてみたりしました。
例としてS3の種類をポケモンの世界で例えて考えてみましょう:point_up:
- S3 Standard：バッグ（ポケモンをすぐに取り出せる）
- S3 Intelligent-Tiering：ポケモンセンター（いい感じにポケモンを治してくれる）
- S3 Standard-IA：マサキパソコン（頻繁には使わないけど、たまーに使う）
- S3 One Zone-IA：サファリパーク（特定の地域のみに保存される）
- S3 Glacier：古代ポケモンの化石（取り出しに時間がかかる）


:::note warn
ポイント：あくまで覚えるきっかけ程度にした方が良いです。
多少強引な関連付けをしたりして自分の中で定義があいまいになると逆にわけわからなくなってしまう諸刃の剣です:knife:
:::

## :ramen: 締め
SAA合格できるくらいの知識がついてくるとサービスの特性が分かってきて新しいサービスが出ても違和感なく覚えていくのですが、それまでの道半ばで心が折れてしまい「AWS面白くない」「AWS敷居が高い」と去っていく仲間を幾度と見てきました。

ひとりひとり適切な勉強方法は異なると思いますが、少しでも楽しく勉強できたらと常に思います:grin:時にはひと休みゲームをしても良いと思います:video_game:

AWSサービス勉強中の皆さん！ここを乗り越えたらもっと面白くなりますよ:point_up:
そう:bangbang:ポケモンのように:baby_chick:
UnityでQuest向け開発　rayでinteractするとイベントが発生する方法

# 目標
![exp_RayInteractCube.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860179/11ea1cd3-1f00-53ac-e2cc-534ead86879b.gif)

これを最速で実現しましょう。
読めばすぐ分かるんですけど、意外とここまでの解説が存在せず2時間ぐらいかかったのでまとめる。

# 前提
- rayつきコントローラーが表示されている
- コントローラーで動くことができる
が条件です。
稚拙ですが過去にまとめた記事がありますので、ここが実装できてない場合は先にこちらを。
https://qiita.com/yoshimatsu_taishi/items/42bbccd6b5337ba4c8fc

# 環境
- **Unity 2021.3.29**
- **Meta XR Core SDK** 68.0.3
Quest向けに開発するSDK
- **Meta XR Simulator** 68.0.2
UnityのGame上でVRの動きを確認できるシミュレーター
- **Meta XR Interaction SDK** 68.0.0
インタラクト系のSDK
- 実機：MetaQuest3

# 手法
## Building Blockからゲームオブジェクトを置く
・Meta > Tools > **Building Blocks**を開きます。
・**Ray Interaction**をHierarchyにドラッグアンドドロップします。
これで8割完成です。Building Blocksシステム考えた人ほんとうに~~神~~𝑮𝑶𝑶𝑫です
（宗教上の理由で表現を変えました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860179/75450da2-916b-c316-09d5-2b0f4627e458.png)

するとinteractするようのモデルがシーンに現れます。
Hierarchy上では"[BuildingBlock]Ray Interaction"というゲームオブジェクト名です。
（レンダーパイプラインの関係でマテリアルエラーを起こしていますが本編と関係ないので許容）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860179/3fae9062-4a3e-7e41-8ba5-ed049d3400a2.png)

### ちょこっとコライダーに関して解説を挟みます。
・"[BuildingBlock] Ray Interaction"に追加されているRayInteractableコンポーネントがその名の通り、rayでinteractすることを可能にする機能です。
・Surface項目に子の"Collider"というゲームオブジェクトがアタッチされていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860179/9556a8a8-ea0a-87ba-244d-b4ebc85e929f.png)

・"Collider"ゲームオブジェクトにアタッチされているコンポーネントを確認してみると、
Unityで元々用意されているBoxColliderと、Quest向け開発用のCollider Surfaceというコンポーネントがアタッチされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860179/09d17502-4553-23d0-dc95-678b679a8e1c.png)
公式マニュアルにあるように、これを使うことでray interactの接触を判断しているみたいですね。
https://developers.meta.com/horizon/documentation/unity/unity-isdk-surfaces/?locale=ja_JP
引用：
> サーフェスコンポーネントは、3D空間内の幾何学的サーフェスを表示します。これは、Unityの物理演算に依存しない、インタラクターの衝突面として動作します。RayInteractableとPokeInteractableはどちらも、ポインターのドラッグオーバーシュートとタッチ制限(ボタンなどのオブジェクトをポークしたときに指が止まるポイント)を処理するためにサーフェスコンポーネントを使用します。

> ColliderSurfaceは、メッシュコライダーなどのコライダーとのインタラクションに使用されます。

## eventを設定する
・先ほど追加した **[BuildingBlock] Ray Interaction**に、
**Interactable Unity Event Wrapper**コンポーネントをアタッチします。
このスクリプトを使うことで、イベントの内容とトリガーを設定できる（と僕は思っている）
公式の解説はこちら
https://developers.meta.com/horizon/reference/unity/v69/class_oculus_interaction_interactable_unity_event_wrapper?locale=ja_JP

・試しに[BuildingBlock] Ray Interactionにinteractしたら同じシーン内に存在しているSphereが消えるようにイベントを設定してみました。
・詳しくは下記の画像参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860179/761b706f-8411-3542-9fbb-9270c964c38e.png)

# 完成
![exp_RayInteractCube.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860179/11ea1cd3-1f00-53ac-e2cc-534ead86879b.gif)

これでinteractする方法がわかったので、あとは各々のシーンに合わせて、interact後の挙動をスクリプトなどで作ればいいっていうことですね。やったね！

# 参考
**こわくない Meta Quest 開発**
Interaction SDKのサンプルシーン解説でお世話になりました
https://qiita.com/shogo0x2e/items/9ed38c3004cf374d0070

**Interactable Unity Event Wrapperをつければいいんや！って気づかせてくれた解説**
https://zenn.dev/mzn_yuina/scraps/89d67dfcc53dfb