OmniAICreator/Qiita-1.07M huggingface dataset:
[コンピュータグラフィックス] 鏡面反射における、フォンのモデルの計算 (正反射方向ベクトルの計算を含む)

以下のテキストで学習中、計算に詰まったので、計算過程を記録しておく。

- 画像情報教育振興協会 「コンピュータグラフィックス [改訂新版]」

https://www.amazon.co.jp/dp/4903474496/


# 1. 問題サンプル

- フォンのモデルを用いて、鏡面反射光の強さを求める。
- 以下の値を用いて計算する。
    - $W(\alpha)=0.8$
    - $I_i=10$
    - $N=(0,1,0)$
    - $L=(-1,2,0)$
    - $V=(2,1,0)$
    - $n=2$

# 2. 利用する数式

## 2-1. フォンのモデル

鏡面反射光の強さは以下のように表される。

テキスト p.148

```math
\begin{align}
I &= W(\alpha)I_icos^n\gamma \\
&= W(\alpha)I_i(\hat R \cdot \hat V)^n \\
\end{align}
```

## 2-2. 正反射方向ベクトルの計算

テキスト p.150~151

```math
\begin{align}
R &= V^{\prime} + 2 \hat N \\
V^{\prime} &= - \frac{\hat V}{|\hat V \cdot \hat N|} \\
\hat R &= \frac{R}{\|R\|} = |\hat V \cdot \hat N|R
\end{align}
```

鏡面反射光の計算のために p.151 の正反射方向ベクトルの計算式を利用したい。この場合、 $V = L$ として計算することになるので、式は以下のようになる。

```math
\begin{align}
R &= L^{\prime} + 2 \hat N ・・・①\\
L^{\prime} &= - \frac{\hat L}{|\hat L \cdot \hat N|}\\
\hat R &= \frac{R}{\|R\|} = |\hat L \cdot \hat N|R ・・・②
\end{align}
```

# 解法

これに、各種値を当てはめる。

## 1. L の単位ベクトル, N の単位ベクトルの計算

まず、 $\hat L, \hat N $を求める。

```math
\begin{align}
\hat L &= \frac{L}{|L|} = \frac{(-1,2,0)}{\sqrt{(-1)^2+2^2+0^2}} \\
&= \frac{(-1,2,0)}{\sqrt{5}} = \left(\frac{-1}{\sqrt{5}},\frac{2}{\sqrt{5}},0 \right) \\
\\
\hat N &= \frac{N}{|N|} = \frac{(0,1,0)}{\sqrt{0^2+1^2+0^2}} \\
&= \frac{(0,1,0)}{\sqrt{1}} = (0,1,0) \\
\\
\end{align}
```

## 2. R の計算

①より

```math
\begin{align}
R &= L^{\prime} + 2 \hat N \\
&= - \frac{\hat L}{|\hat L \cdot \hat N|} + 2 \hat N　\\
&= - \frac{\left(\frac{-1}{\sqrt{5}},\frac{2}{\sqrt{5}},0 \right) }{|\left(\frac{-1}{\sqrt{5}},\frac{2}{\sqrt{5}},0 \right) \cdot (0,1,0) |}  + 2 \hat N\\
&= - \frac{\left(\frac{-1}{\sqrt{5}},\frac{2}{\sqrt{5}},0 \right) }{|\left(0,\frac{2}{\sqrt{5}},0\right)|} + 2 (0,1,0)\\
&= - \left(\frac{-1}{2},1,0 \right) + (0,2,0)\\
&= \left(\frac{1}{2},-1,0 \right) + (0,2,0)\\
&= \left(\frac{1}{2},1,0 \right)\\
\end{align}
```

## 3. R の単位ベクトルの計算

②より

```math
\begin{align}
\hat R &= \frac{\left(\frac{1}{2},1,0 \right)}{|R|}\\
&= \frac{\left(\frac{1}{2},1,0 \right)}{\sqrt\frac{5}{4}}\\
&= \left(\frac{1}{\sqrt 5},\frac{2}{\sqrt 5},0 \right)\\
\end{align}
```

## 4. V の単位ベクトルの計算

$V=(2,1,0)$ より、
$\hat V = \frac{(2,1,0)}{\sqrt{2^2+1^2+0^2}} = (\frac{2}{\sqrt{5}},\frac{1}{\sqrt{5}},0)$


## 5. 鏡面反射光の計算

ここまでに求めた値を、鏡面反射光の強さのに式(フォンのモデル)に当てはめると、

```math
\begin{align}
I &= W(\alpha)I_icos^n\gamma \\
&= W(\alpha)I_i(\hat R \cdot \hat V)^n \\
&= 0.8 * 10 * \left(\left(\frac{1}{\sqrt 5},\frac{2}{\sqrt 5},0 \right) \cdot \left(\frac{2}{\sqrt 5},\frac{1}{\sqrt 5},0 \right) \right)^2 \\
&= 8 * \left(\frac{4}{5} \right)^2 = 5.12\\
\end{align}
```

できたぽよ！((φ(>ω<*)
【Go言語学習】struct{}{}

## struct{}{}
再度、なんだこりゃと思い

以前、関数の引数の定義において c <-chan struct{}　という表現を知った時、メモリを消費しない表現であると認識したが、受信専用で有ったためか　struct{}{}　は出てこなかったようで...
マップや送信専用チャネルの変数に入れる際は c chan<- struct{}{} とするようで、 
意味としては　struct{}型の空のインスタンス(値が何も無いので、値を管理するためのメモリを消費しない) を表現しているとのこと。
・インスタンス自体は存在するためnilではない
・配列のノリで struct{}{}{} をやると、文法エラー
・interface{}{}も文法エラー

## mapで試す
```Go
package main

import "fmt"

func main() {
	set := make(map[string]interface{})

	// 要素を追加
	set["item1"] = struct{}{}
	set["item2"] = ""
	set["item3"] = nil

	// 要素が存在するか確認
	if v, ok := set["item1"]; ok {
		if v == nil {
			fmt.Println("item1 exists and is nil")
		} else {
			fmt.Println("item1 exists and is not nil")
		}
	} else {
		fmt.Println("item1 does not exist")
	}

	if v, ok := set["item2"]; ok {
		if v == nil {
			fmt.Println("item2 exists and is nil")
		} else {
			fmt.Println("item2 exists and is not nil")
		}
	} else {
		fmt.Println("item2 does not exist")
	}

	if v, ok := set["item3"]; ok {
		if v == nil {
			fmt.Println("item3 exists and is nil")
		} else {
			fmt.Println("item3 exists and is not nil")
		}
	} else {
		fmt.Println("item3 does not exist")
	}
}
```
```
item1 exists and is not nil
item2 exists and is not nil
item3 exists and is nil
```
[数理最適化 / pyomo] 無料ツールで非線形問題を解きたい時 on Google Colaboratory

# 環境

Google Colaboratory に `glpk` と `pyomo` をインストールして最適化コードを実行していた。

```bash
!apt-get install -y glpk-utils
!pip install -q pyomo
```

# 発生した問題

ところが、非線形な問題を解こうとしたら、以下のようなエラーが出た。(つ'ヮ'c)ｳｯﾋｮｫｫｫｵｵｱｱｱｱｱ！

```bash
pyomo ValueError: Model constraint (C5) contains nonlinear terms that cannot be written to LP format
```

`glpk` では、非線形な問題は解けないらしい>_<。


# 対処法

`ipopt` というソルバーを使えば非線形問題も解けたので、手順を以下に記載する。

## 1. ipopt のインストール

```bash:Google Colaboratory
!wget -N -q "https://matematica.unipv.it/gualandi/solvers/ipopt-linux64.zip"
!unzip -o -q ipopt-linux64
```

これで `ipopt` が使えるようになる。


## 2. 実行コード

```python: Google Colaboratory
import pyomo.environ as pyo
from pyomo.opt import SolverFactory


model = pyo.ConcreteModel()

# ----------------------------------------
# パラメータ
# ----------------------------------------
model.setInv = pyo.Set(initialize=["productA","productB","productC"])
model.Demand = 30000
M = 1e7

# ----------------------------------------
# 決定変数
# ----------------------------------------
model.Cost = pyo.Var(model.setInv, bounds=(0, None))
model.Product = pyo.Var(model.setInv, bounds=(0, None), domain=pyo.NonNegativeIntegers)
model.Binary = pyo.Var(model.setInv, within=pyo.Binary)

# ----------------------------------------
# 目的関数
# ----------------------------------------
model.obj = pyo.Objective(expr = pyo.summation(model.Cost), sense=pyo.minimize)

# ----------------------------------------
# 制約条件
# ----------------------------------------
model.C1 = pyo.Constraint(expr = pyo.summation(model.Product) == model.Demand)
# 非線形な制約
model.C2 = pyo.Constraint(
    expr = model.Cost["productA"] == (
        0.02 * (model.Product["productA"] ** 3)
        + 0.7 * model.Product["productA"]
        + model.Binary["productA"] * 0.3
    )
)
model.C3 = pyo.Constraint(expr = model.Cost["productB"] == 0.2 * model.Product["productB"] + model.Binary["productB"] * 0.7)
# 非線形な制約
model.C4 = pyo.Constraint(expr = model.Cost["productC"] == 0.13 * (model.Product["productC"] ** 2))
model.C5 = pyo.Constraint(expr = model.Product["productA"] <= model.Binary["productA"] * M)
model.C6 = pyo.Constraint(expr = model.Product["productB"] <= model.Binary["productB"] * M)

# ----------------------------------------
# 求解
# ----------------------------------------
# opt = SolverFactory('glpk')
opt = SolverFactory('ipopt')

model.results = opt.solve(model)

model.pprint()
print("Result objective: ", pyo.value(model.obj))
```

でけた！( "´༥`"  )


# 参考資料

- 非線形問題を解きたいときに使える solver の解説

https://groups.google.com/g/pyomo-forum/c/ZtEGdLCHzCI?pli=1

- 非線形問題を解くときに使える `ipopt` を Google Colaboratory で install する方法

https://or.stackexchange.com/questions/7145/how-to-install-ipopt-on-google-colab-for-pyomo?newreg=2c1eb7118f4d4c10a7a9c5cd076d7e6e

- 自分は採用しなかったけど、以下のような方法もあるみたい (conda を使って install)

https://colab.research.google.com/github/ndcbe/CBE60499/blob/master/docs/01.00-Pyomo-Introduction.ipynb#scrollTo=h9AN8jjR8v2o
【Golang】Goroutineについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f22aafef-3524-8098-0d36-551dc0f21a01.png)

## Goroutine

とても簡単に言うと、`Goroutine (ゴルーチン)`とは、Go言語で**並列処理**を簡単に実現するためのものです。

参考)

https://go.dev/doc/effective_go#goroutines

**並列処理**を適切に実装することで実行効率が良くなります。

具体的には、複数のCPUを利用してタスクを分散することで、全体の処理速度を高めることができます。

**3**秒かかる処理`A`と、**2**秒かかる処理`B`の2つを実装してみましょう。

まずは、`Goroutine`を使わずに直列で実装します。

```golang:main.go
// 3秒かかる処理
func A() {
	time.Sleep(3 * time.Second)
    println("A")
}

// 2秒かかる処理
func B() {
	time.Sleep(2 * time.Second)
    println("B")
}

func main() {
	A()
	B()
}
```

実行し、時間を計測してみます。

```bash
$ time go run main.go
A
B

real    0m5.078s
user    0m0.054s
sys     0m0.064s
```

予想通り**5**秒かかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/8b192108-2e0b-18cc-a808-d46f5d205c17.png)

次にGoroutineを使って実装してみます。

2つのgroutineを作成し、`sync`packageの`waitGroup`を使いそれぞれのgoroutineが終了するまで待つようにしてみます。

```golang
func A(waitGroup *sync.WaitGroup) {
	defer waitGroup.Done()
	time.Sleep(3 * time.Second)
	println("A")
}

func B(waitGroup *sync.WaitGroup) {
	defer waitGroup.Done()
	time.Sleep(2 * time.Second)
	println("B")
}

func main() {
	var waitGroup sync.WaitGroup
	// 2つのgoroutineを設定
	waitGroup.Add(2)

	go A(&waitGroup)
	go B(&waitGroup)

	// すべてのgoroutineの終了を待つ
	waitGroup.Wait()
}
```

こちらも実行して計測してみます。

```bash
time go run main.go 
B
A

real    0m3.067s
user    0m0.030s
sys     0m0.076s
```

**3**秒しかかからなくなりました。

そして、**B**の出力の方が先にきていることも注目ポイントです。

図で表してみるとこんなイメージでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/dc546045-565f-aa64-b22e-aeae774555f8.png)

このように、Goroutineを用いることで並列処理を簡単に実装することができ、アプリケーションの効率を向上させることができます。

## まとめ

- `Golang`の`Goroutine`を使うと、軽量な並列処理が簡単に実装でき、
実行効率を向上させることができる。
- `go func(){}()`という風に書くだけでGoroutineを実装することが可能
- `sync` packageの`WaitGroup`を使うと、複数の`Goroutine`を作成し、全ての`Goroutine`の完了まで待つことが可能
【備忘録】Snowflake トライアルアカウントにLooker Studioから接続する

## 注意
DB知識あまりなし、BI未経験、Snowflakeトライアルアカウント作ってすぐの者が書いています。
ベストプラクティスから大きく外れたことを記載している可能性があるので、自己責任で参考にしてください。
変なこと言ってたら教えてもらえると喜びます。

## サンプルデータのテーブルを確認する
SQLを発行するには、左ペインの「作成」から「SQLワークシート」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759447/cca4bf53-80f5-e512-71a5-0547caf9182a.png)

DBとして「SNOWFLAKE_SAMPLE_DATA」、スキーマとして「TPCH_SP1」を選択します。
左ペインで展開することでテーブルに「ORDER」があることがわかるので、とりあえず全選択してみます。

```SQL:SELECT文
SELECT * FROM ORDERS
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759447/dbf798ed-aec1-3951-078e-138f7953c594.png)

O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_TOTALPRICE,O_ORDERDATE,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENTが列としてあることがわかります。

## Looker studioから接続してみる
Looker Studioにログインし(要Googleアカウント)「作成」→「データソース」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759447/eab3d7fc-defb-1db1-e66b-72087793d7b1.png)

Snowflakeと検索してSnowflakeを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759447/a2c9c2f4-92dd-1ff7-aaff-680055e041e8.png)

ORDERSTATUSがF(Filled?)である注文情報を取得します。
```SQL:SELECT文
SELECT * FROM ORDERS WHERE O_ORDERSTATUS='F'AND O_ORDERDATE > '1995-06-01'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759447/ce8d8c9d-3b2e-daef-a45b-bf742f97781a.png)

アカウントURLは管理者>アカウントで、アカウントの列の「i」にカーソルを合わせると出てきます。
ロールについては、たぶんまだACCOUNTADMINに紐づいているWHしかないので、これしか選べませんでした(ほかを選ぶとWHが選べない)

## 可視化してみる
画面遷移したら、「探索」をクリックすると、下記のようなページに飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759447/4d903b3f-d523-c260-a203-12398487dda1.png)
画面右側円グラフを選択し、ディメンジョンを「O_ORDERDATE」指標を「O_TOTALPRICE」とすると、各日の売上を円グラフにすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759447/05671982-2e87-4f0c-b2d5-292d36396d9e.png)
Salesforceでフローを作成しよう～商談オブジェクトのレコードで重複を防ぐ方法～

こんにちは。本橋孝昭です

今回はSalesorceで商談オブジェクトレコードの重複を防ぐ方法をご紹介します


通常「Salesorceでデータの重複を防ぐ」というと皆さんは「重複ルール」作成をイメージすると思います

https://help.salesforce.com/s/articleView?id=sf.duplicate_rules_map_of_reference.htm&language=ja&type=5

しかしながら現状重複ルールは特定のオブジェクト（取引先・取引先責任者・リード・個人取引先・カスタムオブジェクトのみ）でのみしか作成できないので商談オブジェクトなどで重複ルールを作成することができません



それではどのようにすれば商談で重複を防ぐことが可能でしょうか

今回は１つのアイディアとして2023年からできたフローの新機能「カスタムエラー」を使用した重複を防ぐ方法をご紹介します


## フローのカスタムエラーってなんだ？

カスタムエラーで出来ることの詳細はこちらをご覧ください
入力規則のようなものや削除を防ぐことが可能です
今回はカスタムエラーで重複を防ぐ方法を解説します

https://qiita.com/Takaa/items/b53c49bfadc5542c2874


## カスタムエラーでフローを作成しよう

今回は例として
・商談作成時、商談編集時に商談名が同じ場合にエラーが出て重複を防ぐ

フローを作成しようと思います

フローの内容はこちらになります

![001フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2e501708-8ac3-2fec-07e4-129fff751a82.png)


![002フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/207e6b1f-4195-4a3f-c451-a8da4db7e646.png)


![003フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/82542ae7-dd38-c6f6-54ce-e7d6c10faf7f.png)

![004フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/415a3d6f-46b8-c571-b7f0-4788b8b6bb98.png)


なお、エラーのメッセージは
>同じ商談名の商談があります
こちらのURLからご確認ください
https://empathetic-unicorn-7scd2x-dev-ed.trailblaze.lightning.force.com/lightning/r/Opportunity/{!$Record.Id}/view

としましたが、これは私のデモ環境の商談URLが
https://empathetic-unicorn-7scd2x-dev-ed.trailblaze.lightning.force.com/lightning/r/Opportunity/006F900000w5xYKIAY/view

となっているからです

empathetic-unicorn-7scd2x-dev-ed.trailblaze.lightning.force.com
部分はSalesforce環境により異なるのでご注意ください



![005フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/71203589-42df-5505-4a77-dec8c1ebe0fb.png)


上記フローを作成すれば商談作成時、商談名編集時にすでに同じ名前の商談レコードがある場合、以下画像のようなエラーが出てエラーをだして同じ商談名の商談作成を防ぐことが可能です

![007フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f3c6b65e-ca3f-8197-a7a6-99a3566ee9c8.png)
JESTによるテスト実行でidentity-obj-proxyをインストールしていないとエラーが出る

## 初めに
元医療職 → WEB制作者がReact開発で詰まった箇所を日々発信しています！
現在はJISOUというコミュニティに所属してReact開発を学習中。
今回も簡単なテストを実行したところ、テスト失敗になったので、原因と解決策を共有します。

## エラー内容
テストの内容はApp.tsxに対して、Hello Worldというテキストがあるかを確認する、簡単なテストです。
`npm run test`を実行すると以下のようなエラーが返ってきて、パスしませんでした。

![スクリーンショット 2024-05-13 20.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688379/35576fdf-74d2-8b09-edb7-3d013a84a620.png)

どうやらApp.cssが認識されていないようです。
jest.config.jsファイルを確認してもちゃんと以下の記述があります。
```javascript
moduleNameMapper: {
  '\\.(css|less)$': 'identity-obj-proxy'
}
```

## 解決策
原因はidentity-obj-proxyがインストールされていないことが原因でした。
identity-obj-proxyがインストールできているかどうかは、package.json内に以下の記述があればインストールされているそうです。
```json
"identity-obj-proxy": "^3.0.0"
```

もしこの記述がなければ以下のコマンドを入力してインストールします。
```
$ npm install --save-dev identity-obj-proxy
```

## まとめ
今まではApp.tsxファイルにある
```react
import './App.css'
```
という記述を削除していたため、エラーになりませんでした。
ですが今回は削除せずに実行したところパスしませんでした。
テストは本当にエラーのバリエーションが多くて、毎回慣れませんね。
マジックメソッド②

## はじめに

マジックメソッドについて整理する。2回目。

### __toStringメソッド

print命令などでオブジェクトの文字列表現を要求された際

#### 参考コード

```php:Person.php
class Person
{
    public $firstName;
    public $lastName;

    // 中略

    public function __toString() : string
    {
        return $this->lastName.$this->firstName;
    }
}
```

```php:toString.php
require_once 'Person.php';

$p = new Person('太郎', '山田');
print $p; // 山田太郎
```

### __invokeメソッド

オブジェクトが関数の形式で呼び出された際。

#### 参考コード

```FliendList.php
class FliendList implements IteratorAggregate
{
    // 中略
    private array $list = [];

    public function getIterator()
    {
        return new ArrayIterator($this->list);
    }

    public function add(Person $p): void
    {
        $this->list[] = $p;
    }
}
```

```php:invoke.php
require_once 'Person.php';
require_once 'FliendList.php';

$list = new FliendList();
$list->add(new Person('太郎', '山田'));
$list->add(new Person('奈美', '掛谷'));
$list->add(new Person('賢', '高江'));

print $list(1); // 結果：掛谷奈美
```

### __cloneメソッド

clone命令でオブジェクトを複製した際。

#### 参考コード

オブジェクトの内容をディープコピーしたい際に使う。

```php:FliendList.php
class FliendList implements IteratorAggregate
{
    // 中略
    public function __clone() : void
    {
        foreach ($this->list as &$value) {
            $value = clone $value;
        }
    
    }
}
```

```php:clone_deep.php
require_once 'Person.php';
require_once 'FliendList.php';

$list = new FliendList();
$list->add(new Person('太郎', '山田'));
$list->add(new Person('奈美', '掛谷'));
$list->add(new Person('賢', '高江'));

$list2 = clone $list;
var_dump($list2(1) === $list(1)); // 結果：bool(false)
```
情報セキュリティ

脆弱性
情報セキュリティの重大な欠陥。
脅威
人的脅威：ソーシャルエンジニアリング：パスワードを見て盗んだり、ゴミから情報を盗む
物理脅威：災害
技術脅威

ISMS：企業が情報セキュリティをマネージするのに使わられる。これを持っていると情報セキュリティが高い。
JIS Q 27000

真正性：偽造やなりすましがない本物であること。
信頼性；意図した結果が返ってくること。
責任追跡性：誰が関与したか追跡できるようにすること。
否認防止性：あとで「じぶんではない」と否定されないようにすること。
[API] RESTfulなAPIとは

# まとめ
RESTfulなAPIは、Representational State Transfer（表現状態転送）アーキテクチャを基盤として設計されたAPIのことです。RESTは、分散システムにおけるネットワーク上でのリソースの表現と状態の転送を促進するための原則や制約のセットを指します。

下記の**6原則**に従うことで、RESTfulなAPIはシンプルで柔軟な設計となり、スケーラビリティやインタープロシャル通信の促進などの利点を提供します。

# 目次
- [Separation of Concerns (クライントとサーバーの分離)](#Client-Server (クライントとサーバーの分離))
- [Statelessness (状態不要)](#Statelessness (状態不要))
- [Uniform Interface (統一インターフェース)](#UniformInterface (統一インターフェース))
- [Cacheability (キャッシュ可能性)](#Cacheability (キャッシュ可能性))
- [Layered System (階層システム)](#LayeredSystem (階層システム))
- [Code-On-Demand (オンデマンドのコード)](#Code-On-Demand (オンデマンドのコード))

# Separation of Concerns (クライントとサーバーの分離)
RESTではクライアントとサーバーが互いに独立し、完全に分離していることが求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/d5cc0a06-bbb5-b2ea-f30e-c3ec7b3504a7.png)


# Statelessness (状態不要)
クライアントとサーバー間の通信は状態を保持しないことが原則です。それぞれのリクエストは、必要な情報を含む完全な状態で行われ、サーバーはそれを処理して適切なレスポンスを返します。

# Uniform Interface (統一インターフェース)
RESTfulなAPIは、HTTPメソッド（GET、POST、PUT、DELETEなど）を使用してリソースに対する操作を定義します。これにより、APIの操作が一貫していて予測可能になります。

# Cacheability (キャッシュ可能性)
サーバーは、レスポンスに対してキャッシュを利用するためのメカニズムを提供する（提供する情報がURIを通して表現できる）ことが推奨されます。これにより、効率的なネットワーク利用やレスポンスの高速化が可能になります。

# Layered System (階層システム)
RESTfulなアーキテクチャは、クライアントとサーバーの間に中間層を持つことができます。これにより、システムがより拡張可能になり、柔軟性が向上します。

# Code-On-Demand (オンデマンドのコード)
サーバーは、クライアントが実行するためのコード（スクリプトなど）を提供することができます。この機能はオプションであり、必須ではありませんが、RESTfulなアーキテクチャの柔軟性を向上させる一つの手段です。

# 参考リンク
- [【図解】RESTful API とは何なのか【2024年版】](https://www.amazon.co.jp/dp/4873113539?ref_=cm_sw_r_cp_ud_dp_V3Q7XMR8AENYHQTE80XR)
-[RESTful APIとは？RESTの6原則とメリット・デメリットを解説！](https://udemy.benesse.co.jp/development/restful-api.html) 
- [【Web API 設計 〜 理論編 〜】RESTの核心に迫る！REST ful APIは4原則ではなかった!? RESTとROAについて](https://zenn.dev/aiq_dev/articles/48100d5b3f13fe)
vscodeのRemoteSSHで接続できない&vscode server周りで躓いている場合のエラー対処

vscode version : 1.88.1
接続元のOS:Windows
接続先のOS:Ubuntu
備考:接続先も接続元もプロキシ環境下

VscodeをSSH先のサーバーに接続したくRemoteSSHの拡張機能をつかって接続しようとしたが、下記エラーが発生した。
```
(省略)
Resolver error: Error: Failed to download VS Code Server (XHR failed)
(省略)
```

下記コマンドでcmd上でSSHを実施し、コンフィグ情報は間違っていないことを確認
```
ssh -F ~/.ssh/config <ホスト名>
```

エラーをよく読むとwgetやcurlの際のプロキシ周りでエラーが発生し、ダウンロードができていないことがわかった。
下記のブログを読んで、接続元にVS Code Serverを手動でインストールを実施。
https://www.sukimalog.com/archives/33951761.html
scpで接続先に配置して、.vscode-server/bin/{コミットID}配下にて展開を実施した。


が、ブログ通りに、.vscode-server/bin/{コミットID}配下に配置しても下記エラーが発生してしまった。ファイルを置いてもダウンロードしてしまうようである。
```
(省略)
Resolver error: Error: Failed to download VS Code Server (XHR failed)
(省略)
```
で下記のgithubでの議論を確認。
https://github.com/microsoft/vscode-remote-release/issues/9758

vscodeのsetting.jsonに下記を追記
```
"remote.SSH.useExecServer": false
```
こうするとダウンロードの挙動が止まって、無事vscode上でSSHすることができた。

最初から公式のGithubで検索すればよかった。これで16時から20時の4時間も費やしてしまった。
全く異なる2種類の公開鍵の使い方

# 公開鍵暗号方式と公開鍵認証

公開鍵と一言に言っても二種類の使い方があるようです。
公開鍵で暗号化して秘密鍵で復号化する公開鍵暗号方式と
署名が本人によるものなのかを検証する公開鍵認証です。
今まであまり深く調べることがなかったので調べてみました。

# 公開鍵暗号方式
安全な通信を行うためによく使われる暗号方式です。

1. 最初にサーバー側で公開鍵と秘密鍵を生成しておきます。
2. クライアントからアクセス要求があったら、公開鍵を返します。
3. クライアントは共通鍵を生成し、公開鍵を使って暗号化します。
4. クライアントは暗号化した共通鍵をサーバーに送信します。
5. サーバーは秘密鍵を使って暗号化された共通鍵を復号化します。
6. 共通鍵を使って暗号化された通信を行います。

# 公開鍵認証
証明書が本人のものであるか確認する手段です。
SSH接続のセッションの確立を例にとってお話しします。

1. 最初にクライアント側で公開鍵と秘密鍵を生成し、サーバーに配置しておきます。
2. クライアント側で秘密鍵を使ってセッションIDやユーザー名などの情報を含む署名を作成します。
3. 署名と共にサーバーに認証要求を出します。
4. サーバー側でその署名が本人のものであるか、公開鍵を使って検証します。

※認証が始まる前に公開鍵暗号方式で共通鍵を共有している状態です。
パスワードの入力の代わりに公開鍵認証を行っているというイメージです。

HTTPSでは両方の機能を使っており、ドメインが管理者本人のものであるか確認するために公開鍵認証を使い、暗号化された通信を行います。

# さいごに
@angel_p_57 さん ご指摘ありがとうございました。
SSHについて誤解していたので正しい知識を得られて良かったです。

## 参考
https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432
https://www.jipdec.or.jp/project/research/why-e-signature/public-key-cryptography.html
https://pfs.nifcloud.com/navi/words/ssh.htm
hyaku outlook 複数セル

' ここから

Sub CopyRangeValuesToOutlookBody()
    Dim olApp As Object
    Dim olMail As Object
    Dim rng As Range
    Dim htmlBody As String
    Dim row As Range
    Dim cell As Range

    ' Outlookアプリケーションのインスタンスを取得
    On Error Resume Next
    Set olApp = GetObject(, "Outlook.Application")
    If olApp Is Nothing Then
        Set olApp = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0

    ' メールオブジェクトを作成
    Set olMail = olApp.CreateItem(0) ' 0はメールを表す定数

    ' セル範囲を指定
    Set rng = ThisWorkbook.Sheets("Sheet1").Range("A1:C6") ' 適切なシート名とセル範囲を指定してください

    ' HTML形式で表を構築
    htmlBody = "<table border='1' cellpadding='5'>"

    ' 各行に対して
    For Each row In rng.Rows
        htmlBody = htmlBody & "<tr>"
        ' 各セルに対して
        For Each cell In row.Cells
            htmlBody = htmlBody & "<td>" & cell.Value & "</td>"
        Next cell
        htmlBody = htmlBody & "</tr>"
    Next row

    htmlBody = htmlBody & "</table>"

    ' Outlookの本文にHTML形式で表を貼り付け
    olMail.HTMLBody = htmlBody

    ' メールを表示
    olMail.Display

    ' コピー元のセルにフォーカスを戻す（オプション）
    Application.CutCopyMode = False
End Sub
Go言語で可変引数の関数にスライスを展開する方法

Go言語において、可変引数の関数を扱う際、スライスを引数として、関数が可変数の引数を受け取る場合に非常に便利です。例えば、ログの出力、数値の集計、文字列の結合など、さまざまなシチュエーションで役立ちます。


### 可変引数の基本

まず、可変引数関数の基本から見ていきましょう。可変引数関数は、任意の数の引数を同じ型で受け取れる関数です。関数定義時には、パラメータの型の前に `...` を置くことで、その型の任意の数の引数を受け取ることを示します。


例：以下の max 関数は、渡された整数の中から最大値を返します。

```go
func max(values ...int) int {
	maxVal := values[0]
	for _, val := range values[1:] {
		if val > maxVal {
			maxVal = val
		}
	}
	return maxVal
}
```

### スライスを可変引数に展開する

次に、あるスライスから条件に合う値のみを選び出し、それを max 関数に渡す例を見てみましょう。たとえば、10以上の値のみを選んで最大値を求めたい場合、以下のように書けます。

```go
func filterAndProcess(threshold int, values ...int) int {
	var filtered []int
	for _, value := range values {
		if value >= threshold {
			filtered = append(filtered, value)
		}
	}
	return max(filtered...)
}
```

この関数 `filterAndProcess` は、まずスライス `values` から閾値 `threshold` 以上の値のみを選択して新たなスライスに格納します。そして、その結果得られたスライスを `max` 関数の可変引数に展開して渡し、最大値を求めて返します。

### 実行例

```go
package main

import "fmt"

func max(values ...int) int {
	maxVal := values[0]
	for _, val := range values[1:] {
		if val > maxVal {
			maxVal = val
		}
	}
	return maxVal
}

func filterAndProcess(threshold int, values ...int) int {
	var filtered []int
	for _, value := range values {
		if value >= threshold {
			filtered = append(filtered, value)
		}
	}
	return max(filtered...)
}

func main() {
	values := []int{5, 10, 15, 20, 25, 3, 7}
	threshold := 10
	result := filterAndProcess(threshold, values...)
	fmt.Println(threshold, "より大きな数字", result)
}
```

この例では、values スライス内の10以上の値 {10, 15, 20, 25} を max 関数に渡しています。filterAndProcess 関数を通じて、max 関数がこのフィルターされたスライスから最大値を計算し、結果として25が出力されます。

下記に試してきます。
https://go.dev/play/p/8y8IfEwOK0M

### 最後

Go言語における可変引数とスライスの展開は、関数の柔軟性を高める重要な特徴です。この機能を活用することで、コードの再利用性を高め、さまざまなシチュエーションでの関数の適用性を向上させることができます。
firebaseへデプロイしても画面表示が変わらない

## 初めに
元医療職 → WEB制作者がReact開発で詰まった箇所を日々発信しています！
現在はJISOUというコミュニティに所属してReact開発を学習中。
今回はReact+typescriptで簡易アプリを作成して、firebaseにデプロイしても画面が切り替わりませんでした。
その解決方法をまとめます！

## 問題点
VSCode上でアプリを作成して`firebase deploy`をしても画面表示は以下のまま変わらず...

![スクリーンショット 2024-05-13 19.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688379/462ed0df-730d-efba-fac1-33dd48459497.png)

デプロイの際のターミナルへの入力は以下のとおりです。
```
$ npm run build
$ firebase deploy
```

## 解決策
今回解決した方法はfirebase.jsonファイルを編集しました。

```json
{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```

hostingディレクトリのpublicには現在publicが設定されています。
つまりプロジェクトの**publicフォルダにあるindex.htmlをfirebaseに反映している**そうです。
今回はdistフォルダにあるindex.htmlを反映したかったため、以下のように修正しました。
```json
{
  "hosting": {
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```

この後以下を入力しました。
```
$ npm run build
$ firebase deploy
```
上記を実行することで、作成したプロジェクトがfirebase上に反映されました！！
非エンジニア38年でプログラミングを始めました！

Qiitaに初めて投稿します、シュンです。プログラミングコーチング、JISOUというサービスでReactの学習を始めました。毎日Qiitaに投稿していく目標を達成すべく、1本目の投稿をしていきます。1本目は決意表明です。

# これからやること
プログラミングコーチとコミュニティの力を使って、自分のモチベーションを上げながらフロントエンドの実装ができるようになる

# 経歴
学生時代からテレビ局でアルバイトを始めて、映像の世界へ。テレビ局でディレクターとして働いたのち、30手前でプレシリーズAぐらいのスタートアップに初期社員として入社。8年働いて色んな経験を積む。M&Aのタイミングで2年前に会社を辞めて、流れで個人事業主に。40代、50代で飛躍するためにいったんしゃがんでリスキリングすべく、仕事はほどほどにしてコーディング学習、撮影・編集スキル（10年現場を離れていた為）、英語学習など、自分のスキルを高めることに時間を使っている38歳。

# プログラミングと私
スタートアップだったこともあり、ずっと横にエンジニアやPdMやPjMがいてよく一緒に仕事していたしお酒も飲んでいたが、一切コードはかかずに過ごす。興味がでて30代前半でプログラミングスクールにお金を払って通うも、モチベーションが2週間も持たずお金が溶けて終わること2回。
興味はあるけど、難しいしよくわからんし、他に得意なことがあるからそっにやった方が稼げるし楽しいし、もうプログラミングは無理かなと諦めて数年たったところで、ChatGPT革命が到来。むちゃくちゃ楽しくコードが作れて実行できるのでやっとモチベーションが湧いてプログラミングについて本気で学習開始。いまは週3ぐらいはコードを書いて（生成して）います。

# なぜやるほのか
3つの理由があります。
・少人数でスケールするビジネスを作りたいから
・コードや技術を学び、エンジニアの気持ちや大変さが分かるようになりたいから
・課題や無駄をコードを通じて解決するプロセスが楽しいと思えてきたから

# 目標
短期：JavaScriptとReactの基礎を学んで簡単なコードを書けるようになる
中期：フロントエンドReactで、バックエンドPythonまたはNode.jsで小規模なWebサービスを自分でリリース、運用できるようになる
長期：エンジニアを理解し、エンジニアとクリエイターのいる世界に売れるモノづくりができる組織を作れる様になる

今日は以上です！
Application Insights の環境変数について

## はじめに
本記事は、App Service における Application Insights に関する環境変数を有効・無効化した場合の挙動について検証した結果をまとめたものである。

## 前提
* App Service は作成済み
* デフォルトの環境変数は下記の通り
    * WEBSITES_ENABLE_APP_SERVICE_STORAGE
    * DOCKER_ENGINE_CI
    * DOCKER_REGISTRY_SERVER_USERNAME
    * DOCKER_REGISTRY_SERVER_PASSWORD
    * DOCKER_REGISTRY_SERVER_URL
    * MICROSOFT_PROVIDER_AUTHENTICATION_SECRET
    * Auth0_AUTHENTICATION_SECRET


## 検証
#### 1. Application Insights を有効化し、App Service を再起動
下記の環境変数が追加された

| 環境変数 | 値 |
| :- | :- |
| APPINSIGHTS_INSTRUMENTATIONKEY | c88XXXXXe44 |
| APPLICATIONINSIGHTS_CONNECTION_STRING | InstrumentationKey=c88XXXXXe44;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/ |
| ApplicationInsightsAgent_EXTENSION_VERSION | ~3 |
| XDT_MicrosoftApplicationInsights_Mode | recommended |
| APPINSIGHTS_PROFILERFEATURE_VERSION | 1.0.0 |
| DiagnosticServices_EXTENSION_VERSION | ~3 |
| APPINSIGHTS_SNAPSHOTFEATURE_VERSION | 1.0.0 |
| SnapshotDebugger_EXTENSION_VERSION | diabled |
| InstrumentationEngine_EXTENSION_VERSION | disabled |
| XDT_MicrosoftApplicationInsights_BaseExtensions | disabled |
| XDT_MicrosoftApplicationInsights_PreemptSdk | disabled |
| APPLICATIONINSIGHTS_CONFIGURATION_CONTENT ||

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/48d93b4f-4792-0dea-d9ba-ab426b602436.png)


#### 2. Application Insights を無効化し、App Service を再起動
APPINSIGHTS_INSTRUMENTATIONKEY と APPLICATIONINSIGHTS_CONNECTION_STRING を除く環境変数の値が disabledになった

| 環境変数 | 値 |
| :- | :- |
| APPINSIGHTS_INSTRUMENTATIONKEY | c88XXXXXe44 |
| APPLICATIONINSIGHTS_CONNECTION_STRING | InstrumentationKey=c88XXXXXe44;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/ |
| ApplicationInsightsAgent_EXTENSION_VERSION | disabled |
| XDT_MicrosoftApplicationInsights_Mode | default |
| APPINSIGHTS_PROFILERFEATURE_VERSION | disabled |
| DiagnosticServices_EXTENSION_VERSION | disabled |
| APPINSIGHTS_SNAPSHOTFEATURE_VERSION | disabled |
| SnapshotDebugger_EXTENSION_VERSION | diabled |
| InstrumentationEngine_EXTENSION_VERSION | disabled |
| XDT_MicrosoftApplicationInsights_BaseExtensions | disabled |
| XDT_MicrosoftApplicationInsights_PreemptSdk | disabled |
| APPLICATIONINSIGHTS_CONFIGURATION_CONTENT ||

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517570/d885abbc-e272-cb38-cd07-2ccd57a90f48.png)


#### 3.  Application Insights を有効化した状態で環境変数を削除し、App Service を再起動
Application Insights が無効化された



## 結果
* Application Insights の有効・無効は環境変数によって判断されている
* 環境変数が disabled の状態は、環境変数を削除した状態と同じである


以上
メモ、FlutterのOSSライブラリを修正してPRを投げる

# やりたいこと

プロジェクトで使用しているライブラリでうまく動かないところを見つけた！
調査して、ライブラリ内の一部を修正すれば良いことがわかった！
**今後バージョン追従を手動でやりたくない！（重要）**
よし、修正したのをマージしてもらおう！

# やったこと

1. forkする
![スクリーンショット 2024-05-13 18.23.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/a7fa2a7b-e279-517b-0ff5-f5b1a27d500a.png)
2. ローカルにcloneする
3. cloneしたプロジェクトを参照するようパスを修正する
![スクリーンショット 2024-05-13 18.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/297e19f7-b073-609f-9e51-16a3640eaa64.png)
4. 修正する
5. PullRequestを投げる

![スクリーンショット 2024-05-13 18.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/f67168a1-73c9-324a-f234-15c9fb7a6c13.png)

# まとめ

ほぼGithubでコントリビュートするための雑なメモですが、
何にせよまとめておくといつか誰かの役に立つこともあるので...
やってみたシリーズ６編　紹介画像に留める。

信頼できると思われる人向けに、ホームページにzip圧縮資料をアップしました6_0です。
信用ならないと言う人は、信頼のおける人が検査したのが、あったらやってみてください。
address　https://tattyan0-0.sakura.ne.jp/etc/index.html
html_stadio_6_0.zipというのが、対象。

参考画面、メモリー的には画像の方が食うが、テキスト送りの重たさは無いから。
![スクリーンショット 2024-05-13 174449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/6c625a32-b615-40e6-8824-306e99d175cd.png)
起動した画面が少し変わった。

![スクリーンショット 2024-05-13 174524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/384b8039-e3be-0f88-d211-c0240d505abf.png)
controlポップアップ

![スクリーンショット 2024-05-13 174606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/86164b95-61cd-aebb-a867-d01f2d055803.png)
画像を読み込んだところ。

![スクリーンショット 2024-05-13 174649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/3ebce793-f31b-12e8-4c8e-739022712796.png)
表でノーイメージ選択。板だけ。

![スクリーンショット 2024-05-13 174830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/9988cf1f-bdfb-fb3b-551a-229815d3d735.png)
色々調整して、画面に出したとこ。

![スクリーンショット 2024-05-13 174847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/12e10cdb-aa14-20fb-4a7e-6ac790ff8503.png)
その時の、基本コードの書き出し。

![スクリーンショット 2024-05-13 175219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/ee61dbc1-f483-2337-5fd1-488e18dc105c.png)
videoをセットして動かしたとこ。

![スクリーンショット 2024-05-13 175411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/c3f21166-6ddf-fa72-4c5b-d9d7157eb42e.png)
audioをセットして鳴らしたとこ。残念やなぁ聞こえんって。

![スクリーンショット 2024-05-13 180310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/ecd20361-239e-888e-144c-1bda8cbfa9af.png)
テーブルに背景入れて、画像付けて、上のレイヤーに文字を仮だししたとこ。

おわり。ファンがいたら、ありがとう。以後まだまだ組んでいきます。
【Unity】マウスカーソルを使った視点の移動とカメラ追従の実装のメモ（FPS風）

## はじめに
　今回はUnityでFPS風の視点移動を実装する方法を説明したいと思います。以下が最終的にイメージしているものです。マウス操作で視点移動とPlayerの向きを変更させ、wasdで移動です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/UZmc1NSFY0k?si=oNo3JU7DdNOCJqpv" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 準備するもの
　まず以下の画像のようにcubeでplayerを作り、そのオブジェクト配下にメインカメラを置きます。(今回はカメラの挙動がわかりやすいようにcubeをplayer配下に置き、その中にMainCameraを置いています。)
![スクリーンショット 2024-05-13 17.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554505/65fb228d-ab68-7780-d141-5813d6988da5.png)

## C#スクリプト
　今回はプレイヤーとカメラに一つずつスクリプトつけようと思います。
以下がプレイヤーにつけるスクリプトです。
ここではプレイヤーの移動と左右の視点移動を実装しています。
```C#:player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class player : MonoBehaviour
{
    private float speed=30.0f;

    void Update()
    {
        // Playerの前後左右の移動
        float xMovement = Input.GetAxis("Horizontal") * speed * Time.deltaTime; // 左右の移動
        float zMovement = Input.GetAxis("Vertical") * speed * Time.deltaTime; // 前後の移動
        transform.Translate(xMovement, 0, zMovement); // オブジェクトの位置を更新


        //マウスカーソルで左右視点移動
        float mx = Input.GetAxis("Mouse X");//カーソルの横の移動量を取得
        float my = Input.GetAxis("Mouse Y");//カーソルの縦の移動量を取得
        if (Mathf.Abs(mx) > 0.001f) // X方向に一定量移動していれば横回転
        {
            transform.RotateAround(transform.position, Vector3.up, mx); // 回転軸はplayerオブジェクトのワールド座標Y軸

        }
    }
}
```
:::note warn
注意
public class 〇〇 : MonoBehaviour
〇〇の部分がスクリプト名と異なる場合、エラーの原因となるので注意！
:::
補足
```
transform.RotateAround(回転の中心, 回転の軸（Vector3.upは(0,1,0)のことなのでｙ軸を軸としている）, 変化量); 
```


---

　次にMainCameraにつけるスクリプです。以下がそのスクリプトです。ここでは縦方向にカメラを移動させるための実装を書いています。
```C#:camerarotation.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class camerarotation : MonoBehaviour
{
    public GameObject player;//playerのゲームオブジェクトを入れる変数を設定
    void Update()
    {
        float my = Input.GetAxis("Mouse Y");//マウスの縦方向の移動量を取得
                
        if (Mathf.Abs(my) > 0.001f)// Y方向に一定量移動していれば縦回転
        {
            transform.RotateAround(player.transform.position, Vector3.right, -my);
        }
    }
}
```
:::note warn
注意
MainCameraにスクリプトをつけた後以下のようにplayerオブジェクトをアタッチする
![スクリーンショット 2024-05-13 18.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554505/3b81b22d-617b-15e8-59ae-3a807f76e0b1.png)
:::
補足
```
transform.RotateAround(player.transform.position, transform.right, -my);
```
playerを中心としてx軸を回転の軸として回転する。

## まとめ
　今回はFPSのような視点を使ったゲームを作ろうと思ったので調べながら実装を行いました。アセットなども使わずに簡単に実装できたので良かったです。これからも学習したことを載せていきます。
【WordPress】【ワードプレス】最新記事を持ってくる

# 任意のxxx.php
```php
<?php $args = ['numberposts' => 5,'post_status' =>'publish'];
  $recent_posts = wp_get_recent_posts($args);
  foreach ($recent_posts as $post) {
      echo '<a href="' . get_permalink($post['ID']) . '">' . $post['post_title'] . '</a>';
  }
?>
```
scp

linuxの内容をmacの方に持ってこれないかと検討したところcspに辿り着いた。

# csp
```
root@*******# scp ~/hello.py ユーザー名@送り先のipアドレス:/Users/ユーザー名/Desktop/hello.py
Password:
hello.py                                     100%   40    68.0KB/s   00:00    
```
# 出典
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-ssh-clients-scp

https://terakoya.sejuku.net/question/detail/35000

### リモートログインを許可する
https://blog.mothule.com/mac/mac-how-to-use-scp
### ユーザー名(macのユーザー名)

https://support.apple.com/ja-jp/guide/mac-help/mh35548/mac#:~:text=%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E5%90%8D%E3%82%92%E5%BF%98%E3%82%8C%E3%81%A6,%E6%A8%AA%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

### 送りたい先のipアドレス
コピーしたかったので自分のipアドレス

https://www.iodata.jp/support/qanda/answer/s17702.htm#:~:text=%E3%80%8CApple%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%80%8D%EF%BC%88%E7%94%BB%E9%9D%A2%E5%B7%A6%E4%B8%8A,%E3%82%B2%E3%83%BC%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A4%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

### パスワード
この場合は自分のパソコンのパスワードを入力したらできた。

# 感想
もしかしたら別方法があるかもしれない。
もっと知らなければならない。
しかしこれでqiitaにも簡単に投稿できそうだ。
最初は当てにせずもっとちゃんとしたところで調べてください。
gitでpushできない時の解決策　(ローカルリポジトリとリモートリポジトリに差がある)

# 初めに
webアプリの保守をしていた時にpushができなかったのでその解決方法を紹介します。

# エラー内容
```
To https://~
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://~'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you want to integrate the remote changes, use 'git pull'
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
# 原因
そもそも僕はリモートリポジトリに何かしらデータを反映させてました。
でもwebアプリの保守のためにローカルリポジトリではコミットを遡って開発していました。
2つのリポジトリに差があることがpushできない原因になっていました。

# 解決方法
解決策は2つあって
## 解決策1. リモートリポジトリの内容をローカルリポジトリに反映させて、修正してからpushする
一旦ローカルリポジトリにリモートリポジトリの内容を反映させて、もう一度修正してからpushをする方法です。

## 解決策2. ローカルリポジトリの内容をリモートリポジトリに強制的に反映させる
できないことはないのですが、重要な情報がリモートリポジトリにあった場合上書きしてしまうのでやめた方がいいと思います

僕は結局解決策1を使ってpushを行いました。

# エラーが消えない!方へ
上記をやってもエラーが消えない方はpushする先を間違えているのかもしれません。
僕はfeature-login-maintenanceというブランチからmainブランチにpushしていました。
feature-login-maintenanceからfeature-login-maintenanceにpushするとうまくいきました。

# 最後に
結局pushする先が間違えていたからpushができなかったのかもしれません。
エラー内容もmain->mainのpushがrejectされているので、pushする先をしっかり確認したいと思いました。
Apple Developer EUのデジタルサービス法（DSA）の対応

# はじめに
![Screenshot 2024-05-13 at 17.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/13892c47-32a1-ee52-dede-f000453def56.png)
>新しいアプリをApp Storeに提出するには、お客様がトレーダーであるかどうかをお知らせいただく必要があります。EUのデジタルサービス法により、Appleは、EUのApp Storeでアプリを配信するすべてのトレーダーの連絡先情報を確認および表示する必要があります。詳しく見る

全然審査が終わらないな〜・・・と思ってたら、App Store Connectで👆のような警告が出ていました。。

トレーダー?
EUのデジタルサービス法？

よくわからない言葉があったので調べてみました。

# 対象
日本国内向けにアプリを展開している人
**EUにはアプリを配信していない人**

# そもそも何の警告？
>2020年12月15日、欧州委員会はDigital Services Act (DSA) の法律案を公表。DSAは全ての仲介サービス提供者(プラットフォーム事業者等) に対して、違法コンテンツの流通に関する責任を規定するとともに、事業者の規模に応じたユーザ保護のための義務を規定。

https://www.soumu.go.jp/main_content/000738571.pdf

というのが、デジタルサービス法らしいです。

 もうちょい簡単に言うと、
 **・欧州委員会はApp Store でアプリを配信するAppleのような巨大プラットフォーマーに対し、オンラインでの違法で有害な活動や偽情報の拡散防止するように義務付けた**

**・理由はユーザーの安全性を確保するため**
 
**・App Storeにアプリを公開してるデベロッパには、連絡先情報を確認した上で公開することが義務付けられた**

みたいな感じかと。。:rolling_eyes:

より詳しくはこちらを👇

https://developer.apple.com/jp/help/app-store-connect/manage-compliance-information/manage-european-union-digital-services-act-trader-requirements/


# デベロッパがトレーダーであるかどうか？
そもそも「トレーダー」って何ですか？と言う話ですが、、、

>DSA では、取引業者を「公開会社か非公開会社を問わず、自己の商取引、事業、技術または職業に関連する目的のために、自己の名において、または代理人を通じて行動する自然人、または法人」と定義しています。
https://itunespartner.apple.com/ja-jp/books/support/5401-manage-digital-services-act-compliance-information

と書いていますが、よくわかりませんね、、

色々と情報が錯綜しているようですが、わかりやすく表現するなら

「**EU向けに有料アプリまたはアプリ内課金、広告収入アプリを配信するすべての企業、個人が該当する。営利目的の場合は該当**」
という感覚で良いのではないかと思います。

# 対処法
## とりあえずヨーロッパを配信地域から外す
App Store Connectの`収益化` → `価格および配信状況` → `アプリの配信状況` → `配信状況を管理`のボタンから編集できます。
![Screenshot 2024-05-13 at 17.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/ac7653a9-4594-773a-3f9f-c76d69190823.png)

## ノントレーダーを選択する
App Store Connect → `ビジネス` → 法人を選択
![Screenshot 2024-05-13 at 17.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/e8bb4321-2463-e337-6e5c-604dd73d55a6.png)

![Screenshot 2024-05-13 at 17.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/b8ffc931-5881-6a2e-593d-4ec4c17ecf7e.png)


私の場合はこれで解決しました！！！

EUに配信している方は色々と申告が必要そうなので、、ドキュメント見ながら頑張ってください:muscle:

https://developer.apple.com/jp/help/app-store-connect/manage-compliance-information/manage-european-union-digital-services-act-trader-requirements/
【備忘録】SupabaseAuthのOAuth認証がvercelにデプロイすると認証時にlocalhostへリダイレクトされることを解決する

# はじめに
**SupabaseAuthのOAuth認証** を使って認証を行うと **デプロイ先** から **localhost** に **リダイレクト** されることを解決した **備忘録** です。

## Supabaseのdashboardから設定する
**Supabase** の **dashboard** から **Authentication** の **URL Configuration** を開きます。

開いた時に **localhost** が **Site URL** に指定されていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/32a7d328-4533-43f9-126f-388e6dc0ddeb.png)

**localhost** に指定されていた **Site URL** を **デプロイ先URL** に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/6abbc719-45bd-8748-fa20-471898b85ad6.png)

これで認証時に正しく **リダイレクト** されます。

## さいごに
公式ドキュメントのリンクです。

**vercel** へのデプロイでは **デプロイ先URL** が環境変数に追加されるのでリダイレクト先に渡すことでうまくいくようです。

https://supabase.com/docs/guides/auth/redirect-urls
CUDAないしNvidia HPC SDKを導入したDockerコンテナを作る

とくに地の文で説明することもないので、[手抜きの王、手抜きキング](https://qiita.com/uts1_6/items/11e348ead4bae71571b8)な記事を書きます。

### `Dockerfile`
```dockerfile:Dockerfile
# Nvidia HPC Contianerベースイメージを使用
FROM nvidia/cuda:11.8.0-base-ubuntu20.04

RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# 必要なパッケージのインストール
RUN apt-get update && \
    apt-get install -y \
    bash-completion \
    build-essential \
    wget \
    make \
    cmake \
    gcc \
    gfortran \
    tar \
    vim \
    && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Install NVIDA HPC SDK
WORKDIR /installs/nvidia
RUN wget  https://developer.download.nvidia.com/hpc-sdk/24.3/nvhpc_2024_243_Linux_x86_64_cuda_multi.tar.gz
RUN tar xpzf nvhpc_2024_243_Linux_x86_64_cuda_multi.tar.gz
RUN nvhpc_2024_243_Linux_x86_64_cuda_multi/install
RUN rm -rf nvhpc_2024_243_Linux_x86_64_cuda_multi.tar.gz nvhpc_2024_243_Linux_x86_64_cuda_multi
RUN echo "export PATH=\$PATH:/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/compilers/bin/" >> /root/.bashrc

# ソースコードのコピー
COPY . /app/source

# ビルド作業ディレクトリの作成と移動
WORKDIR /app/source
```

### イメージ作成
```bash
docker build ローカルディレクトリパス -t イメージ名
```

### コンテナ作成
```bash
docker run --name コンテナ名 --gpus all -it イメージ名
```
`--gpus all`を忘れずに！！
【WordPress】【ワードプレス】人気記事を持ってくる

# functions.php
```javascript
// 記事のPVを取得
function getPostViews($postID) {
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if ($count=='') {
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0 View";
    }
    return $count.' Views';
}

// 記事のPVをカウントする
function setPostViews($postID) {
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if ($count=='') {
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    } else {
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
```


# single.php
```javascript
if (!is_user_logged_in() && !is_robots()) {
    setPostViews(get_the_ID());
}
```


# 任意のxxx.php
```php
  <h4>よく読まれている記事</h4>
    <hr>
    <?php $args = ['post_type'=>'post','meta_key'=>'post_views_count','orderby'=>'meta_value_num','posts_per_page'=> 5,'order'=>'DESC','post_status'=>'publish'];?>
    <?php $the_view_query = new WP_Query( $args );?>
    <?php if ($the_view_query->have_posts()) {?>
      <?php while($the_view_query->have_posts()) { ?>
        <?php $the_view_query->the_post();?>
        <!-- タイトル表示 -->
        <div>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            <p><?php echo getPostViews($post->ID); ?></p>
        </div>
      <?php } ?>
    <?php } ?>
    <?php wp_reset_postdata();?>


```

前日pv
https://dev.ore-shika.com/post/wp-last-pv/
アラサー未経験から半年でWeb系エンジニアになった話

# はじめに
メーカー勤務、IT系未経験から半年でWebアプリケーションエンジニアになることができた私の半年間をまとめてみたいと思います。
>IT業界に興味があるけど踏み出せない・・・
>何から始めればいいの？

という方の後押しに少しでもなれれば嬉しいです！

## 簡単な自己紹介
- 医療系大学に通うも、単位が取り切れず中退
- メーカーの開発課で派遣社員として製品評価業務に従事
- データ分析を繰り返すうち、業務効率化の楽しさに気づく
- 近くでWebプログラミングの`職業訓練`があることを知る(24歳)
- すぐに仕事をやめ、半年間プログラミングを学ぶ(終了時25歳)
- Webアプリケーションエンジニアとして働き2年目　👈現在(26歳)

職業訓練校に通うまでは、一切プログラミングに触れたことはなかったです。
`言語っていろいろあるみたい・・・`
`エンジニアって何？`
本当にこんなレベルでした。
同じようなレベルでITへの挑戦を検討中の方、安心してください！楽しくプログラミングを学べればエンジニアになれる未来はあります！

では実際にWebアプリケーションエンジニアになるまでの半年間を振り返っていきます。
## 職業訓練校での半年間
私が行った職業訓練校で学んだ言語はこちらです
- HTML/CSS
- JavaScript
- PHP
- Python
- Java

それぞれ1ヶ月づつくらいのペースで、最後のJavaは後述のチーム開発を含め2か月程度のスケジュールでした。
>### HTML/CSS
>とにかく楽しかったです。規則に則ってコードを打つと画面が完成される！！とワクワクが止まらなかったです

>### JavaScript
>ここから変数やライブラリなど、プログラミングの基本となる概念が出てきました。ここで躓いてしまう人もいましたし、私自身も理解してコードを打つというよりは、テンプレートを使って何とか動かしている状態でした。
>
>JavaScriptのライブラリ(便利な機能を集めた拡張機能のようなもの)であるjQueryを使い始めると、動きのあるページが作れて楽しかったです

### チーム開発
チーム開発はPHPとJavaの２回ありました。
>#### PHP
>5名程度のチームで、PHPを用いて投稿ツールを作りました。開発期間は2週間程度だったと記憶しています。
>たまたま仲のいい方たちと同じチームになったので、和気あいあいと開発ができました。
>実装した機能はこちらです
>- ログイン機能
>- タイムライン
>- 新規投稿機能
>- マイページ/投稿削除機能
>
>フロントからバックエンド、DB設計まで幅広くアウトプットできる良い機会となったと思います。

>#### Java
>Javaを用いたECサイトのチーム開発を行いました。同様に5名程度のチームでしたが、そのうちの2名がほぼ開発はできないレベルの方でした・・・
>5人分の作業を3人でこなしたことと、盛り込みたい機能が多かったため、家に帰っても黙々と作業をしていましたが、ストレスどころか楽しくてしょうがなかったです！
開発期間は2か月程度でした。
>実装した機能はこちらです
>- ログイン機能
>- メイン画面（特集ページ、閲覧履歴の表示、検索窓など）
>- テキスト検索・カテゴリ検索機能
>- お気に入り・カート機能
>- マイページ（登録情報の変更、購入履歴）
>- 在庫管理・管理者画面（発注画面等）
>
>PHPでの投稿ツールの開発に比べ、実装する機能も増え、扱うデータ量も格段に増えたためDB設計も重要になってきました。完成して一連の操作ができたときにはとても達成感を感じたのを覚えています。

## 転職活動
最後の2か月間のECサイト開発中に転職活動をしました。転職サイトに登録し、様々な求人も見ましたが、結果的には`ハローワーク`から紹介いただいた企業への就職が決まりました。

Webサイトの`フロントエンドエンジニア`を中心に応募しましたが、未経験ということが大きかったのか`書類選考落ち`。
オープンポジションでの募集に応募し、内定はいただけたものの、エンジニアではないポジションになる可能性を排除したく、転職活動を続行。

その後、`SES`企業から内定をいただき、社長の営業力のおかげで、第一希望であった`Wedアプリ系`の案件に従事することができました。

## 未経験エンジニアが転職するために必要なこと
私と同様、中途採用で未経験で入社した人は皆、どこかしらの`スクール`や`職業訓練校`で学んできていました。そこで学べる最低限の知識がないと、転職は難しいと思います。
スクールに通っていた同期は、前職の仕事終わりに自宅で`オンライン講義`を受講していたそうです。かなりハードではありますが、そんなやり方もできるのだなと参考になりました。

## 最後に
私の場合はほとんど`運`でWebアプリ系エンジニアになれましたが、「組み込み系エンジニアは常に人材不足で受かりやすい」、「そこで経験を積んでからWebアプリ系エンジニアに移行するというキャリアプランもある」と当時教えていただきました。

私はWebアプリ系をやりたい！と強く志願していました。あの時妥協して組み込みに行かず強く意思表示をして良かったなと思っています。

やりたいことが決まっている場合は、
①それに必要な知識を学べるスクール等で学ぶこと
②妥協せず転職活動を続けること
は最低限必要だと思います。

以下は私が転職する際に気を付けていたことです。
>・**ポートフォリオをこまめに更新する**
>職業訓練校で学んだ知識をもとに何か作ってみて、ポートフォリオに組み込んでいました

 >・**不採用の場合はポートフォリオのレビューをお願いした**
 >実際にレビューをいただけたのは1社だけでしたが、足りない点はもちろん、褒めていただける部分も多かったので自信につながりました。

未経験エンジニアが転職するのは簡単なことではないです。
実際、職業訓練校の同期の半数以上はITとは関係のない職種に就職していました。
逆に言えばエンジニアになれる可能性も少なくないということです！
エンジニアは楽しいです！少しの学びが大きな自信と豊かな未来を創るかもしれません。

勇気を出して一歩踏み出してみませんか？
Excelのlambda使って3つ以上のセルの一致を確認するユーザ定義関数作った

Excel触っているとたくさん(3つ以上)のセルが一致しているかどうかを数式で書きたい場面出てこないだろうか、自分はたまにある。まあ5,6個程度ならAND関数を連結してもいいんだけど、もっと数が増えると？ググると解決策は割と簡単に出てくるんだが、どうもExcelの数式はちょっと複雑になるともう何だかよく分からなくなる。

そこでふとそう言えばlambda使ってユーザ定義関数作れないだろうかと思い作ってみた。
作り方の基本はこれもググれば出てくるので割愛。

# 2024/05/27 記事更新
5/23 上手く行かないケースの指摘を受けて確かにと思い記事更新。
5/27 セル配列で列を渡した際上手く行かなかったケースに対応。

色々とご指摘頂いたので対応できるように更新。

https://qiita.com/shinmuro/items/0f40533aa87b19feb307#comment-b92f0fd6e46585597604

ついでに指摘頂いた方ほど汎用的なわけではないが、再帰使ったコードに変えてみた。
これで`{FALSE,FALSE,FALSE}`ケースでも TRUE返すようになった。

名前: _countall(cells)
```
=REDUCE(0, cells, LAMBDA(x, _, x + 1))
```

名前: _eqall(cells)
``` 
=LAMBDA(cells,
  LET(
      _eq2, LAMBDA(x, y, x = y),
      arr, TOCOL(cells),
      SWITCH(
          _countall(arr),
          1, TRUE,
          2, _eq2(INDEX(arr, 1), INDEX(arr, 2)),
          IF(_eq2(INDEX(arr, 1), INDEX(arr, 2)), _eqall(DROP(arr, 1)))
      )
  )
)
```

## 再帰の上限
[公式のLAMBDA関数の説明](https://support.microsoft.com/ja-jp/office/lambda-%E9%96%A2%E6%95%B0-bd212d27-1cd1-4321-a34a-ccbf254b8b67)では数は明記されてないが、
再帰が多すぎるとエラーとなると書いてあったので試してみると、どうやら1639個目で`#NUM!`となった。どういう上限設定なんだろ。

## 1048576個(Excel2007以降の行上限数)対応版
色々試してると、セル配列ってそのものを`=`比較できる事を知ったので、それを利用した版も書いてみた。

### 2024/05/29 更新
- _andall は通常の AND でも同等の動作をするとアドバイス頂いたので更新



名前: _andall

<details open><summary>通常のANDで行けるので未使用</summary>

```
=LAMBDA(cells,REDUCE(, cells, LAMBDA(x,y, IF(x = FALSE, FALSE, AND(x, y)))))
```
</details>

名前: _eqall2
```
=LET(arr, TOCOL(cells), AND(DROP(arr, 1) = DROP(arr, -1)))
```

こっちは`_eqall2(A:A)`としても`TRUE`を返してくれる。
これどこまでも行けるのかなと`_eqall2(A:B)`を試したがこちらは`#NUM!`が返ってくる。
考えてみれば`TOCOL`関数で行配列に変換してるからそこの上限に引っかかるのかな。

## 旧コード

指摘を頂く前の旧コードは以下に残しておく。
<details open><summary>旧コード部分</summary>

名前の管理画面で以下のように入れる。使うのはeqの方。

| 名前 | 参照範囲 |
|:-:|:-|
| eqfn  | =LAMBDA(x,y, IF(x=y, x, FALSE))  |
| eq  | =LAMBDA(cellrange, REDUCE(,cellrange,eqfn)   |

テスト。以下のような値が入ってる場合
| A1 | B1 | C1 |
|:-:|:-:|:-:|
| 1  |  2 | 3  |

```
=eq(A1:C1)
-> FALSE
```
こちらだと、
| A1 | B1 | C1 |
|:-:|:-:|:-:|
| 1  |  1 | 1  |

```
=eq(A1:C1)
-> 1
```

</details>

ごく簡単なものだけど個人的に初めてlambda使って実用し得るユーザ定義関数作れたと思うので記事をアップ。
毒。Windowsだからって不必要にベタベタ画面コピー貼らなくていいと思う。視認性下がる。
前回遷移したページURL取得(リファラ)

## 前ページのURLvue-routerを使ってリファラを取得する
##### リファラ：直前に滞在していたWebページのこと

```
import { useRouter } from '#imports'
const router = useRouter()
const previousPath = ref<string | null>("/")

router.beforeEach((to, from, next) => {
  previousPath.value = from.fullPath
  
　// 前回アクセスしたURL
  console.log(previousPath.value)
  
  next()
})
```
## 解説
```
router.beforeEach((to, from, next) => {
// to: 現在から移動しようとするルート
// from： 現在から前のルート
// next(): ナビゲーションを許可する
}
```

## 補足
### history backでも取得可能みたい
```
// 1つ前のレコード
router.go(-1)
```
参考URL:[Nuxt.js(Vue.js)でhistory backする方法](https://qiita.com/TK-C/items/cd4ecde92146197f40d7)