OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】静的解析ツール「Larastan」の導入

## 1. Larastanとは
[Larastan](https://github.com/larastan/larastan)はPHPの静的型解析ツールである[PHPStan](https://phpstan.org/user-guide/getting-started)をベースにしており、
アプリケーション内のコードを解析して型の整合性やエラーをチェックします。
これにより、潜在的な型関連のバグやエラーを早期に発見し、修正することができます。


## 2. 導入方法
### 2.1 インストール
Composerを使用してLarastanをプロジェクトに追加。
```PHPのバージョン < 8.0の場合
composer require nunomaduro/larastan:^1.0 --dev
```
```PHPのバージョン >= 8.0の場合
composer require nunomaduro/larastan:^2.0 --dev
```
### 2.2 設定ファイルの作成
プロジェクトのルートディレクトリに設定ファイル```phpstan.neon```を設置。
```phpstan.neon
includes:
　- ./vendor/nunomaduro/larastan/extension.neon

parameters:

　paths:
　　- app/

　# The level 9 is the highest level
　level: 0

　excludePaths:
　　- ./*/*/FileToBeExcluded.php

　checkMissingIterableValueType: false
　checkGenericClassInNonGenericObjectType: false
```
### 2.3 各種設定
```paths:``` 解析をかけるpathを指定します。例えば```resources/views```配下のファイルを解析に明けたければ以下のようになります。
```
paths:
　　- resources/views
```
```level:``` 0~9のレベル別に解析される粒度を選択できます。[公式ドキュメント](https://phpstan.org/user-guide/rule-levels)
高いレベルは低いレベルのエラーを含みます。
### 2.4 実行
プロジェクトルートディレクトリでコマンドを実行。
```
./vendor/bin/phpstan analyse
```
メモリが足りない場合は上限を指定して実行します。
```
./vendor/bin/phpstan analyse --memory-limit 1G
```
### 2.5 実行結果
```ruby:エラーがない場合
 [OK] No errors  
```
```ruby:エラーがある場合
 ------ ---------------------------------------------------------------------------------------- 
  Line   Http/Controllers/Member/MemberController.php                                            
 ------ ---------------------------------------------------------------------------------------- 
  48     Access to an undefined property App\Http\Controllers\Member\MemberController::$schema. 
 ------ ----------------------------------------------------------------------------------------

  [ERROR] Found 1 error
```
エラーの箇所が表示されます。
## 3. 最後に
初めて静的解析ツールを使用しましたが、エディターの拡張機能や目視だけでは発見しきれないエラーを早期に発見することができました。こうした便利なツールを賢く効率的に使っていきたいものです。
### 参考サイト
[Larastan GitHub](https://github.com/larastan/larastan)
[Laravelを使ったプロジェクトを始めるならLarastanくらいは導入しようよ](https://zenn.dev/bs_kansai/articles/4a476c4b28f1d6)
jestでReact is not definedが出た

# はじめに
どうもこんにちは！僕は現在1ヵ月本気の技術力向上を目指している現役高校生1年生です！
現在Reactでアプリ開発をしているのですが、jestを用いてテストを行おうとしたところエラーが出てうまくいかなかったのでまとめます。

# 問題
以下のエラーが出ました。
```terminal
Error: Uncaught [ReferenceError: React is not defined]
```

# 解決策
結論
<font color="red">.babelrcを編集する</font>

```:.babelrc
変更前
{
    "presets": [
        "@babel/preset-env","@babel/preset-react"
    ]
}

変更後
{
    "presets": [
        "@babel/preset-env",
        [
            "@babel/preset-react", {
                "runtime": "automatic"
            }
        ]
    ]
}
```

# 原因
僕も明確な理解はしていませんが、解決策のように書くことで、トランスパイルを自動で行ってくれることで解決することが出来ているのだと思います。

トランスパイルとは、簡単に言い換えると新しい言語仕様を古いものに変換してくれるというものです。わりとこの考え方はでてくるので知っておいて損ないと思います。
「[しまぶーのIT大学](https://www.youtube.com/@shimabu_it)」というYoutuberの方はJavaScriptについて詳しく解説されていたと思いますのでぜひご覧になってみてください。

参考にした資料も貼っておくので詳しく知りたい方はそれを見たり、さらに調べたりしてみてください。

# 参考
https://zenn.dev/nbstsh/scraps/97ded6d64561e5

https://archive.jestjs.io/docs/ja/22.x/getting-started

# 終わりに
参考の一つ目の記事にほぼ同じ内容が記載されているのですがより書いてみました。参考になれば幸いです！

# About Me
- X(Twitter)

https://twitter.com/shunii_hack
【RxSwift】１回で効率よくイベントを流すshare()

# 目次
[1.share()とは](#1-share()とは)
[2.実例](#2-実例)
[3.おわりに](#3-おわりに)

# 1. share()とは
ひとことで言うと`１回でイベントを流せる機能`です。
つまりは、`１度subscribeしたものはもう２度とsubscribeしなくてOKな機能＋１度でイベントを流し切る機能`です。
どう言うことか、実例を挙げてみていきます。
# 2. 実例
## `share()`を使わない例
まずは`share()`を使わずに書いてみます。(超非効率)
~~~swift: hasnoshare.swift
let subject = PublishSubject<Int>()
let observable = subject
  .debug("observable")

observable
  .bind(to: Binder(self) { _, value in
    print("サブスクライバー1: \(value)")
  })
  .disposed(by: bag)

// 1回目のイベントを発行
subject.onNext(1)

observable
  .bind(to: Binder(self) { _, value in
    print("サブスクライバー2: \(value)")
  })
  .disposed(by: bag)

// 2回目のイベントを発行
subject.onNext(2)
~~~

~~~Bash:実行結果
observable -> subscribed
observable -> Event next(1)
サブスクライバー1: 1
observable -> subscribed
observable -> Event next(2)
サブスクライバー1: 2
observable -> Event next(2)
サブスクライバー2: 2
~~~
とても冗長です。
まず、`.bind`のサブスクライブ処理が２回走っています。`observable.bind()`が呼ばれるたびにサブスクライブ処理が貼りまします。
次に、`onNext(2)`がサブスクライバー毎に呼ばれているので、２回呼ばれています。

## `share()`を使った例
対して`.share()`を使用した例です。

~~~swift: hasshare.swift
let subject = PublishSubject<Int>()
let observable = subject
  .debug("observable")
  .share() // これを追加するだけ

observable
  .bind(to: Binder(self) { _, value in
    print("サブスクライバー1: \(value)")
  })
  .disposed(by: bag)

// 1回目のイベントを発行
subject.onNext(1)

observable
  .bind(to: Binder(self) { _, value in
    print("サブスクライバー2: \(value)")
  })
  .disposed(by: bag)

// 2回目のイベントを発行
subject.onNext(2)
~~~

~~~Bash:実行結果
observable -> subscribed
observable -> Event next(1)
サブスクライバー1: 1
observable -> Event next(2)
サブスクライバー1: 2
サブスクライバー2: 2
~~~
これで、サブスクライブ処理は１度のみ、`.onNext(2)`は１度で２つのサブスクライバーを通っています！
簡単ですね！

# 3. おわりに
RxSwiftを触っていると、であった`shere()`について解説しました。
RxSwiftのシェアは複数のサブスクライバーのストリームをひとつに束ねて、流れてくる値を複数のサブスクライバー間でシェアしているみたいです。
本記事を読んでいただきありがとうございました！
bindValueでSQLインジェクション対策


## 目次
1. [SQLインジェクションについて](#SQLインジェクションについて)
2. [SQLインジェクション対策](#SQLインジェクション対策)
3. [bindValue()関数](#bindValue()関数)

## SQLインジェクションについて
**SQLインジェクション**とは、第三者がSQLコマンドを悪用してデータベースの情報へ不正アクセスし、情報を搾取や改ざん削除する攻撃手法である。

<br>


## SQLインジェクション対策
 1. 入力値を制限する
 2. 入力値をいったん変数に格納する
 3. エスケープ処理、サニタイジングを行う
 4. 常に最新の環境を保つ
 5. セキュリティソフトWAFを導入する

上記5つの対策があるが、「2. 入力値をいったん変数に格納する」対策方法についてピックアップする。

<br>

## 入力値をいったん変数に格納する

入力された文字列をそのままSQL文として利用せず、いったん変数に格納する対策方法です。あらかじめ**プリペアドステートメント**と呼ばれるSQL文を用意しておき、その一部を**プレースホルダ**と呼ばれる予約場所に設定しておきます。その後、プレースホルダに入力データを割り当てる（バインドする）ことによりスクリプトの実行を防ぐことができます。<br>
今回は、PHPのPDOを用いた方法を使ってみることにする。

<br>

## bindValue()関数
PDOステートメントのbindValueは、値をパラメータにバインドします。<br>

```php:PDO::bindValue
bindValue(`param`:name, `value`$name, `type`PDO::PARAM_STR);
```
`param` 名前つきプレースホルダを使用するプリペアドステートメントの場合は、 :name 形式のパラメータ名となる。<br>
`value` パラメータにバインドする値。入力値。<br>
`type` パラメータに対してPDO::PARAM_ 定数 を使った明示的なデータ型を指定する。

<br>

名前付けされたプレースホルダを用いてプリペアドステートメントを実行する。
```php:例
$stmt = $dbh->prepare("SELECT name, id, password FROM user WHERE id = :id AND password = :password");
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->bindValue(':password', $password, PDO::PARAM_STR);
$stmt->execute();
```
`$id`はint型である。
`$password`はcharacters,char型である。
<br>
疑問符プレースホルダを用いてプリペアドステートメントを実行する方法もあるので、詳細はPHP公式リファレンスを見て頂けたら幸いです。




## 参考
+ [【初心者向け】SQLインジェクションの5つの対策と被害事例](https://www.nttpc.co.jp/column/security/sql_injection.html)
+ [PDOStatement::bindValue(PHP公式リファレンス)](https://www.php.net/manual/ja/pdostatement.bindvalue.php)

<br>
著者: E.R (株式会社ウィズツーワン)
Ctrl+¥で日本語入力切替ソース公開

長らくGoogle IMEを使ってましたが候補がとんでもないところに出たり出てこなかったりでMicrosoft IMEに乗り換えました。
ただ、Microsoft IMEはGoogle IMEと違って日本語入力オン／オフキーの選択が少ない。(全角／半角キー、Ctrl+Space、etc...)
自分としては全角／半角キーはどうしても使いにくいのでCtrl+¥で日本語入力のオン／オフがしたいのでC#(.Net Framework 4.8.1)で組んでみました。

https://github.com/Yukki76/JapaneseInputHelper
量子ソフトウェア開発環境のまとめ 2024年版 (量子アセンブリ言語)

量子ソフトウェア開発環境について俯瞰したいと思ってまとめ記事を作成しました。次の内容で分割した連載記事になる予定です。

1. 量子アセンブリ言語
1. 量子プログラミング言語
1. 量子SDK
1. 量子クラウドコンピューティング

この記事では「量子アセンブリ言語」を紹介します。比較表で量子アセンブリ言語の違いをまとめてあります。
それぞれの言語ごとに論文へのリンクと [ベル状態(Bell state)](https://en.wikipedia.org/wiki/Bell_state) のコードサンプルを載せています。

## 量子アセンブリ言語とは

量子アセンブリ言語とは量子コンピュータやそのシミュレータを動かすためのプログラミング言語でハードウェアには直接依存しません。量子アセンブリ言語を使って量子回路を操作したり値を測定するコードを記述します。

## 量子アセンブリ言語の比較

主要な量子アセンブリ言語を開発年順に並べました。

| 量子アセンブリ言語 | サポート団体 | 開発年 | ライセンス | 実行環境(シミュレータ) |
|:-:|:-:|:-:|:-:|:-:|
| QMASM | D-wave | 2016 | BSD-ish | D-Wave Ocean |
| Quil | Rigetti | 2016 | APL2.0 | qvm |
| OpenQASM | IBM | 2017 | APL2.0 | IBM Q Emulator |
| cQASM | QuTech | 2018 | APL2.0 | QX emulator |
| Blackbird | Xanadu | 2019 | APL2.0 | Strawberry Fields simulator |

## 量子アセンブリ言語 (Quantum instruction sets)

### QMASM

[QMASM](https://www.dwavesys.com/resources/application/a-quantum-macro-assembler/) は D-wave が開発した量子アセンブラ。量子アニーリング型コンピュータで組み合わせ最適化問題を解くための言語。[論文](https://ieeexplore.ieee.org/document/7761637) は 2016年に公開されました。
量子アニーリング型のためコードサンプルなし

### Quil
  
[Quil](https://github.com/quil-lang/quil) は [Rigetti](https://www.rigetti.com/) がサポートしているアセンブリ言語。2016年に [論文](https://arxiv.org/abs/1608.03355) があります。
[PyQuil](https://pyquil-docs.rigetti.com/en/stable/) で Quil のプログラムを生成して [quilc](https://github.com/quil-lang/quilc) でコンパイルします。[qvm](https://github.com/quil-lang/qvm) でシミュレーションできます。

Quil のコード

```
H 0
CNOT 0 1
```

### OpenQASM
  
[OpenQASM](https://openqasm.com/) は [IBM Q](https://www.ibm.com/jp-ja/quantum) が対応しているアセンブリ言語。現状では v3 のドラフトを策定中。[OpenQASM v1](https://arxiv.org/abs/1707.03429v1) と [OpenQASM v2](https://arxiv.org/abs/1707.03429v2) の論文がそれぞれ公開されています。

OpenQASM 2.0 による Bell state のコードサンプル

```qml
OPENQASM 2.0;
include "qelib1.inc";

qreg q[2];
creg c[2];

reset q[0];
h q[0];
reset q[1];
cx q[0],q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];
```

### cQASM 

[cQASM](https://www.quantum-inspire.com/kbase/cqasm/) は [QuTech](https://qutech.nl/) がサポートしてる量子アセンブリ言語。2018年に [cQASM v1.0: Towards a Common Quantum Assembly Language](https://arxiv.org/abs/1805.09607v1
) の論文が公開されている。[libqasm](https://libqasm.readthedocs.io/en/latest/index.html) という名前のライブラリで提供されていて [C](https://libqasm.readthedocs.io/en/latest/doxy/index.html) と [Python](https://pypi.org/project/libqasm/) の API があります。

cQASM による Bell state のコードサンプル
```qml
qubits 2

.prepare
    prep_z q[0:1]

.entangle
    H q[0]
    CNOT q[0], q[1]

.measurement
    measure_all
```

### Blackbird  
  
[Blackbird](https://quantum-blackbird.readthedocs.io/en/latest/) は [Xanadu](https://www.xanadu.ai/) がサポートするアセンブリ言語。フォトニックモードを使います。2019年に公開された [論文](https://quantum-journal.org/papers/q-2019-03-11-129/) があります。

Blackbird を使った Bell state のサンプルコード

```
version 1.0
target X8_01 (shots=1)

Vac | 0
Vac | 1

BSgate(pi/4, pi) | (0, 1)

Rgate(pi/2) | 1

MeasureFock() | 0
MeasureFock() | 1
```


## 参考文献

https://en.wikipedia.org/wiki/Quantum_programming
【初心者向け】Java変数のデータ型~基本データ型~

## :ledger:基本データ型（プリミティブ型）

整数や実数といった`値`を格納するための仕組みです。
Javaでは基本データ型に属するのは8種類しかありません。

| 型 | 概要 | サイズ |
|:-:|:-:|:-:|
| byte |  整数 |  8ビット |
| short |  整数 | 16ビット  |
| int |  整数 |  32ビット |
| long  |  整数 | 64ビット  |
| flort   |  浮動小数点数 | 32ビット  |
| double | 浮動小数点数  | 64ビット  |
| char  | Unicodeが持つ1文字<br/>「’」（シングルクォーテーション）で<br/>囲むことでchar値を指定できる  |  16ビット |
| boolean  | true、もしくはfalseを表す真偽値  | 1ビット  |

## :ledger:整数と浮動小数点数
数値型にはまず`整数`と`浮動小数点数（実数）`の2タイプがあります。
`整数`と`小数`は、その構造が異なるため小数を使いたいときは明示しない限り使えません。

### 整数型
まず`int`と`long`を比べてみましょう。この2つは単純に桁数の問題です。


`int` 32ビット（4バイト）の整数で、およそ21億の値を扱うことができます。

`long` 64ビット（8バイト）の整数で、およそ922京の値を扱うことができます。
　　　使用する際は数値の後ろに`「L」`をつける必要があります。
~~~java:long サンプル
long num = 10000000000L;
~~~

:::note info
long を使うとコンピュータのメモリに負荷がかかるので
通常はintを使い、足らないほどの大きな値の場合のみlongを利用しましょう。
:::

intよりも小さい数値を扱うための `byte`や`short`の2つも用意されています。

・使用できる範囲が狭い
・int型の方が高速で処理できる

この2点から基本的には`int型`を使用します。

### 小数型（浮動小数点数）

小数点を扱う`double`と`float`の２つの型をみていきます。

小数を扱う時は`double`を使うことがほどんどです。

扱っている数値がfloatかdoubleかを明示する際は
long のときのように数値の末尾に`d`か`f`をそれぞれ付与してください。
~~~ java:double
double sum = 1.1d;
~~~
~~~ java:float
float  sum = 2.2f;
~~~

:::note info
省略した場合はdouble型とみなされるため
プログラム内でdoubleしか扱わない時は`d`や`f`を書かなくても大丈夫です。
:::

## :ledger:文字型
`char型`についでです。
これは`「一文字」`だけを取り扱う型になります。
~~~java:サンプル
char sample ='あ';
~~~
char型の変数に値を代入する際は`'(シングルクォーテーション）`で囲みます。

:::note warn
データは文字としてではなく文字コード(Unicode)を格納しています
"サンプル"のような「言葉としての文字の集まり」を扱うデータ型は文字列（String）です。Javaでは、文字と文字列は異なるデータ型です。
:::


## :ledger:真偽値型
`boolean型`についでです。

`true `か `false` の二択、二種類しか持てません。

if文やfor文などの条件分岐で使われることが多いです。

***
ここまで基本データ型について説明をしました。
次回は参照型についでです。
`git blame`と`git rebase`の使用例

# はじめに

https://qiita.com/kohki_takatama/items/58c8063c1f6bb7303bfa

↑ の記事で <font color="LimeGreen">`git blame`便利そ～ `git rebase`使い道わからん～hoge~</font>ってやってたんですが、
ありがたいコメントを契機に、一気に理解できたので記事にさせていただきます。
# いただいたコメント

> 私の場合、`git rebase` で コミット整理する際に よく使います。  
> ちょっとした間違いを修正するときとか  
> (`git commit --amend` の、ずっと前のコミットでも直せる版)。
> 
> `git rebase`する前に、修正対象コミット を見つけるために、`git blame`するんです。
> 
> やり方としては：  
> 直したい行をコミットしちゃったコミットを、  
> `git blame` で特定しておきます。
> 
> 見つけたコミットに対して、修正コミットを、  
> `git commit --fixup COMMIT`,  
> `git commit --squash COMMIT`  
> というオプション付きで コミットします。  
> すると、対象の `COMMIT` のコミットメッセージを使って、  
> `fixup! COMMIT のコミットメッセージ`  
> `squash! COMMIT のコミットメッセージ`  
> というメッセージで コミットができます。
> 
> その後、`git rebase -i --autosquash BASE_COMMIT` すると、  
> 自動的に、`COMMIT` の直後に 修正コミットを持ってきて、`COMMIT` とくっつけようとします。  
> fixup / squash は、コミットメッセージ修正 なし / あり の違い。  
> (`--autosquash` の並べ替えは、コミットメッセージ内容 で判定するので、  
> 同一のコミットメッセージが rebase範囲に絡むと、誤爆しうる。  
> あと、手動で `fixup!` `squash!` を足したコミットメッセージ でコミットしても、効果は同じ。)
> 
> 首尾よく rebaseできれば、対象の `COMMIT` が、  
> 間違えていた行を 正しく修正したコミットに生まれ変わります。
> 
> なお、`git commit --fixup`, `git commit --squash` を使いましたが；  
> `git rebase -i` で 自分で指示するなら、  
> 普通にコミットしたうえで、自分で並び替えてもいいです。

長文ありがたい・・・めっちゃ丁寧・・・これはしっかり理解せねば。
# わかりやすかった具体例

ChatGPTに示してもらった具体例で完全に理解しました。

> 具体例を用いて、`git blame`, `git commit --fixup/--squash`, および`git rebase -i --autosquash`を使用したコミットの整理プロセスを説明します。この例では、`example.rb`ファイルを修正し、過去のコミットに統合するプロセスを示します。
> 
> ### 初期のコミット履歴
> 
> 最初に、プロジェクトのコミット履歴を見てみましょう。以下はシンプルな履歴の例です。
> 
> ```
> a1b2c3d [最新] Fix typo in README
> e4f5g6h Update example.rb with new feature
> i7j8k9l Initial commit
> ```
> 
> ### ステップ1: `git blame`で修正対象のコミットを特定
> 
> `example.rb`の特定の行に問題があり、それがどのコミットで導入されたかを特定します。
> 
> ```sh
> git blame example.rb
> ```
> 
> このコマンドの結果から、`e4f5g6h`コミットが修正対象であることを特定しました。
> 
> ### ステップ2: 修正を加え、`git commit --fixup`で修正コミットを作成
> 
> `example.rb`に修正を加え、ステージングした後、`git commit --fixup e4f5g6h`を実行します。
> 
> ```
> git add example.rb
> git commit --fixup e4f5g6h
> ```
> 
> これにより、次のようなコミットが追加されます：
> 
> ```
> a2b3c4d [最新] fixup! Update example.rb with new feature
> a1b2c3d Fix typo in README
> e4f5g6h Update example.rb with new feature
> i7j8k9l Initial commit
> ```
> 
> ### ステップ3: `git rebase -i --autosquash`でコミットを整理
> 
> `i7j8k9l`コミットからリベースを開始します。
> 
> ```
> git rebase -i --autosquash i7j8k9l
> ```
> 
> このコマンドはインタラクティブなリベースセッションを開始し、`fixup!`プレフィックスを持つコミットを自動的に元のコミットに統合するように指示します。
> 
> ### 実行後のコミット履歴
> 
> リベースが完了すると、コミット履歴は次のようになります。
> 
> ```
> a3b4c5d [最新] Fix typo in README
> e5f6g7h Update example.rb with new feature (and fixes)
> i7j8k9l Initial commit
> ```
> 
> `e4f5g6h`コミットは`e5f6g7h`になり、元の変更と`fixup!`による修正が統合されました。コミットメッセージは元のコミットから引き継がれ、必要に応じて編集できます。
> 
> このプロセスにより、プロジェクトの履歴がクリーンに保たれ、過去のコミットに対する修正が簡単に行えるようになります。

# おわりに

改めてコメントありがとうございました。

`git rebase`の使い道を知ってエンジニアとして1レベルアップした気分です。

あとはこれを実践して身体に覚えさせる・・・！
OpenAIの動画生成モデル：Soraについて

先週OpenAIが動画生成モデルSoraを公開しました。非常に話題になりました。
これまでの動画生成モデル、例えばStable DiffusionやPikaなどは、基本的に画像から最大数秒程度の動画しか生成できませんでしたが、Soraは約1分程度の動画を生成できる能力を持っています。しかも、超高品質で動画を生成されます。

OpenAIもSoraの中身を説明する論文「Video generation models as world simulators」を先日公開しました。
この論文を読み終わって、中身をある程度理解しました。
OpenAIが明かしていない部分も一部ありますが、Soraの特徴は主に以下の2点だと思います。

## 1.patchに分割
一つはpatchという単位で画像データを分割しました。
この方法は、論文によればGPT-4を参考にして開発されました。皆さんご存知の通り、LLMは埋め込みモデルによって、テキスト情報を個々のトークンに分割し、これらのトークン間の関係を学習することでトレーニングされています。

Soraも同様に、画像データを統一な単位へと分割処理がありました。OpenAIは、この分割された単位を”patch”と呼ばれます。
処理のイメージとしては、以下のスクリーンショット通りです。
まずは一枚の画像を埋め込みモデルを用いて多数の小さなpatchに分割し、各patchが画像の一部のピクセルデータを保存します。これらのパッチを並ぶことで、一枚の画像の内容を保存できます。フレームレート(fps)によって変わりますが、1秒間の動画は大体30枚や60枚の画像で構成されています。これらの画像ごとのpatchを一枚づつ時間順で並べば、1秒間の動画の情報も示すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/ff6b97fd-c7d6-0325-3ab5-2fc4c0f3a1a3.png)

SoraもTransformerベースであるため、テキストと同じように、1tokenずつ（1patch）順序立てて出力を生成するモデルです。しかし、動画においては、画像の順序とpatchの順序（一つの画像内の複数のパッチの配置順序）両方が存在しますので、Soraがこれら二つの順序をどのように調整するかについては、論文では説明されていません。恐らくコアとなる技術だと思われます。


## 2.Dall-Eによって生成された学習データを利用
もう一つの特徴は、SoraはChatGPTのDALL·Eによって作成された学習データを使用してトレーニングされました。（これが高い精度を実現する理由の一つにもなります）

具体的には、DALL·Eに画像を説明する処理を行ってもらいました。一般的なアノテーションとは異なります。DALL·Eのマルチモーダル能力が強いために、画像を非常に具体的に説明できます。なので、モデルも動画生成時に注意すべき細部をより多く学習することが可能になります。
先月読んだ記事では、最近のマルチモーダルモデルのトレーニングデータは、徐々に人間のアノテーションに依存しない傾向があります。その理由は、強力なLMM（例えばDALL·E）によるアノテーションが処理速度も速く、コストも低く抑えられ、あと何よりも一貫性を確保できるからです。（人々の間で画像データの理解にはある程度の偏りがどうしてもあり、表現の仕方も異なるため、モデルの学習過程で誤差が生じ、出力の質を安定させることが難しいからです）
しかし、OpenAIがSoraに使用しているトレーニングデータがどの程度具体的に記述されているかについては、論文には説明されていません、これは何度の試しで得た経験なので、共有したいくないかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/52c3a964-aa23-06cc-e99c-ab45faff62e4.png)

Soraがもうすぐ公開されると思いますので、使ってみるのが楽しみです。

興味ある方：

論文：

https://openai.com/research/video-generation-models-as-world-simulators
「お名前.com」で取得したドメインをOCI DNSで登録・管理してみる

OCI DNS（Oracle Cloud Infrastructure Domain Name System）は、ドメインレコードを管理するサービスです。
ドメインの取得は他のドメイン登録業者（例：onamae.com）やドメインレジストリ（例：ICANN）を通じて行われます。OCI DNSはこのようなドメインに関するDNSレコードを管理し、そのドメインをOCIでホスティングするサービスに接続できるようにします。
<br>今回は「お名前.com」で取得したドメインをOCI DNSで登録、OCI上に構築したWebサーバに対してFQDNで接続してみます。

<br>■事前作業
・「お名前.com」のサイトよりドメイン取得

■目次
１．Webサーバの作成
２．DNSゾーンの作成
３．名前解決するためのAレコードを作成
４．「お名前.com」でのネームサーバー設定
５．Webサーバに接続確認

# １．Webサーバの作成
<br>（１）OCIコンソールにログインしCompute Instanceを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/1c9c3752-9b5e-d957-5962-5b34eb87fc52.png)
<br>（２）作成したCompute InstanceにWebサーバをインストールします。
```
1. Apache HTTPサーバーをインストールします
sudo yum -y install httpd

2. TCPの80番(http)および443番(https)ポートをオープンします
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp

3. ファイアウォールを再ロードします
sudo firewall-cmd --reload

4. Webサーバーを起動します
sudo systemctl start httpd

5. index.html ファイルを作成し、Webサーバーかを示す文字列を記述します。
  sudo sh -c 'echo "Web Server OCI DNS test (host:`hostname`)" > /var/www/html/index.html'
  ```
<br>（３）パブリックIPでWebサーバに接続できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/f89adf86-950d-c435-527f-4f8a1988b77c.png)

# ２．DNSゾーンの作成
（１）OCIのコンソールの「ネットワーキング」-「DNSゾーン管理」-「ゾーン」に移動し、ゾーンの作成を行います。
他の項目はデフォルトのままにし、「ゾーン名」に「お名前.com」で取得したドメイン名を入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/cee26633-a67d-7350-eac1-7d313ae97321.png)
<br>（２）ゾーンが作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/bd7519ec-1989-98de-5ff6-8c47a5a77dd5.png)

# ３．名前解決するためのAレコードを作成
（１）上記の２で作成したゾーンを開き、「リソース」-「レコード」を選択します。
その後、「レコードの管理」ボタンを押すと、レコードの管理画面が表示されます。

「レコードの追加」を押して、以下の情報を入力します。
**・レコード情報 ― 名前**：任意のラベル
**・レコード情報 ― タイプ**：A - IPv4アドレス
**・レコード情報 ― TTL**：3600（デフォルト）
**・RDATA/回答 ― アドレス**：上記１で作成したWebサーバのIPアドレス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/82838b18-e4e9-2d07-f08b-fe15d34f2248.png)

<br>（２）レコードの管理画面にAレコードが追加されたことを確認し、「変更の公開」を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/de21c3ab-a6af-8742-3b16-3da5296edb6d.png)

# ４．「お名前.com」でのネームサーバー設定
お名前.comで取得したドメインであるため、オラクルDNS管理のネームサーバーの情報をお名前.comに登録する必要があります。

（１）上記３で作成したネームサーバーの情報を確認します。
タイプが「NS」のRDATAの値がネームサーバーの情報になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/a3433b02-d4f1-1303-51d1-eee646c81ea5.png)

<br>（２）「お名前.com」の「ネームサーバーの変更」画面に移動し、該当ドメインに対して、４の（１）で確認したネームサーバーの情報を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/1e201970-1a6f-841e-80c4-316fefc5384b.png)

# ５．Webサーバに接続確認

登録したドメイン名を入力して、Webサーバに接続できることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536679/2a360e79-eb71-4114-3fd2-9e06cde56ebe.png)


<br><br>以上、「お名前.com」で取得したドメインをOCI DNSで登録、OCI上に構築したWebサーバに対してFQDNで接続してみました。
Windows 11のメディアプレイヤーで、履歴を無効化する方法

![スクリーンショット 2024-02-22 121715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700063/0d34608b-e20f-25ea-c360-4e06508867aa.png)
今回はWindows 10から搭載されている、アプリ版 メディアプレイヤーの**履歴**を無効化する方法を試行錯誤して発見したので紹介していきたいと思います。

:::note alert
履歴やプレイリスト等の機能を利用されている方は続行しないでください。
**筆者は責任を負いません。全て自己責任でお願いします。**
:::

## 履歴無効化の方法
エクスプローラーの上部アドレスバーに下記ディレクトリを張り付けて開く。
```
%USERPROFILE%\AppData\Local\Packages\Microsoft.ZuneMusic_8wekyb3d8bbwe
```

#### **直接開けない場合**は以下の手順で開く。
Win+R　を押し、cmdと入力。
コマンドプロンプトに、以下のコマンドを順に入力。
```
cd %USERPROFILE%\AppData\Local\Packages\Microsoft.ZuneMusic_8wekyb3d8bbwe
```
```
start .
```
1\. LocalStateフォルダ内のファイルをすべて削除（履歴等が削除されます。メディアプレイヤーは閉じておいてください。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700063/6f0ba680-77b5-aba7-7fcb-ea0d13cbf4e7.png)
2\. メディアプレイヤーを起動し、完全に起動したらメディアプレイヤーを閉じる。**これを二回行う。**（この段階で履歴が削除されているはずです。何も再生しないでください。）
3\. LocalState フォルダを右クリック→プロパティ
4\. 読み取り専用にチェック
4\. できたら**OK**を押してプロパティ関連のウィンドウを全て閉じる
#### これで履歴無効化できました。
Ubuntuでマウス加速を無効化/有効化する

Ubuntuや多くのLinuxを使っているときのマウス加速がうざすぎる
そういえばWindows似で有名なZorin OSをはマウス加速が無いことに気づいた
そこで、Ubuntuでもマウス加速を無効化しようというお話

Linuxのデスクトップ環境でマウスやキーボードを制御する**xinput**というユーティリティがあり、ターミナルでこいつを設定することで動作を変えられるようだ
以下は僕が実際に操作した例である

```terminal
$ xinput --list #デバイス一覧のコマンドらしい
⎡ Virtual core pointer                          id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ Microsoft Microsoft 5-Button Mouse with IntelliEye(TM)	id=11	[slave  pointer  (2)]
⎜   ...(省略)
⎣ Virtual core keyboard                   	    id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
   ...(省略)
$ xinput --list-props 11 #僕の使ってるマウスはMicrosoftの5buttonで、そのidの11を指定した
Device 'Microsoft Microsoft 5-Button Mouse with IntelliEye(TM)':
	Device Enabled (190):	1
    (中略)
	libinput Accel Speed (336):	1.000000
	libinput Accel Speed Default (337):	0.000000
	libinput Accel Profiles Available (338):	1, 1
	libinput Accel Profile Enabled (339):	1, 0
	libinput Accel Profile Enabled Default (340):	1, 0
	(省略)
$ xinput --set-prop 11 339 0, 1 #libinput Accel Profile Enabled (339) の値がマウス加速の有効化/無効化を制御しているらしい
$
```
上記のようにしたところ、その瞬間からマウス加速が無効化された(再起動やログアウトは必要ない)
今回はマウスのidが11だったが、各自の環境で変わるはずなのでここは注意
libinput Accel Profile Enabled (???) の数値も変わるようだ
`$ xinput --set-prop 11 339 1, 0`としたら再びマウス加速が有効になった

マウス加速の有効/無効を確認する簡単な方法は、マウスカーソルを画面中央に配置し、その状態でマウスパッドに左指を置く。マウスをゆっくりと動かしてカーソルを右端に到達させ、すばやく左指のところまで動かす。ここでカーソルが画面中央ならマウス加速なし、画面左端ならマウス加速が有効である。

## マウス速度
ちなみに libinput Accel Speed (336) の値を
`xinput --set-prop 11 336 -1`とするとマウスがとんでもなく遅くなった
ここでは速度が設定できるようだ
Accel Speed で許可される値は -1〜1で、遅い〜速いと設定できる

## 参考資料
https://ja.linux-console.net/?p=17027

↑参考にした記事はこれ。とても参考になった


https://qiita.com/soramimi_jp/items/fe6982660f4fe5cb8e29

↑ちなみにずっと前からこの記事を読んでいたがアテにならなかった
Chrome / VsCode / コンソールではタブを保持するより使い捨てた方が良い

# 圧倒

自分の場合、どんなツールであってもタブが開いてると圧倒されてしまうので、
たまに「わああああ！」っていう気持ちで閉じてる

どんどんタブを使い捨てるスタイルで開発している

# ブラウザ

- ページにアクセスする時は、アドレスバーで文字検索してアクセスしている。ブックマークは直接は使わない。
- 名前をつけてページをブックマークすると、その名前でアドレスバー検索もできるようになるので、検索用にブックマークすることはある
- よく使うページは Slackのチャンネルの「関連ページ」に追加しているので、忘れることはない


# VsCode

- 「ファイル名を文字検索して開く」という操作を多用している。
- ファイル一覧から開くということはほとんどない。サイドバーのファイル一覧は表示していない。
- デメリットとして「ファイルのディレクトリ構造に無頓着になりやすい」という弊害もある。

# コンソール

- peco でコマンド履歴を呼び出して使っている
- 使うのは localのサーバー起動用のタブ +   Linux操作用のタブをいくつかぐらい
- 画面分割はしない

# 保持派 VS 使い捨て派

ブラウザでたくさんタブを保持して使い分けてる人もいるし、それを見ると「どうやって管理してるんだろ、すごい」って思う


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
React Router v6のルーティングでrenderの代わりにelementを使う

# はじめに
現在Udemyの下記の講座を学習中です。

本講座では、**Reactのバージョンが古い（React v17＆React Router v5）のですが、私は最新のバージョン（React v18＆React Router v6）を使っているため、
バージョンの不一致で時々エラーがでます。**
**今回はルーティングの処理でエラーが出たので**解決方法をまとめます。

https://www.udemy.com/share/104d6k3@kpiiMmhsXhSVVYBZZXWfIxA-Ofb7n2ijDgmc4Bf0W7nCQE4Ur1sQjxdFHSZA64voTQ==/

なお、使用言語は**Ract×TypeScript**です。
# 問題
**renderを使ったルーティング処理で「renderが使えない」とエラーが出てしまいました。**
```tsx:Router.tsx
import { FC, memo } from "react";
import { Route, Routes } from "react-router-dom";
import { Login } from "../components/pages/Login";
import { homeRoutes } from "./HomeRoutes";

export const Router: FC = memo(() => {
   
    return (
        <Routes>
            <Route path="/">
                <Login />
            </Route>
        
            <Route path="/home" render={({ match: { url } }) => (
                <Routes>
                    {homeRoutes.map((route) => (
                        <Route key={route.path} path={`${url}${route.path}`}>
                            {route.children}
                        </Route>
                    ))}
                </Routes>
            )} />
        </Routes>
    )

})
```
# 解決方法
**React 18 では render がサポートされていないため、代わりに element を使用しました。**
```tsx:Router.tsx
import { FC, memo } from "react";
import { Route, Routes } from "react-router-dom";
import { Login } from "../components/pages/Login";
import { homeRoutes } from "./HomeRoutes";

export const Router: FC = memo(() => {


    return (
        <Routes>
            <Route path="/" element={<Login />} />

            <Route path="/home" element={
                <Routes>
                    {homeRoutes.map((route) => (
                        <Route key={route.path} path={route.path} element={route.children} />
                    ))}
                </Routes>
            } />
        </Routes>
    )

})
```

# おわりに
**renderとelementの違いとは？**

**render**
**ルーティングされたときに表示させたいものを、関数として指定します。**
また、その関数は、Reactコンポーネントを返す必要があります。
```jsx
<Route path="/about" render={() => <AboutPage />} />
```

**element**
**JSX要素を直接指定**します。
**つまり、関数を使わずにコンポーネントやJSXをそのまま書くことができます**
```jsx
<Route path="/about" element={<AboutPage />} />
```
**elementを使用したほうが、見た目が少しすっきりしますね。**

# 参考
React Routerの公式ドキュメントにelementの使い方が載っています。

https://reactrouter.com/en/main/route/route#elementcomponent
Unity Androidの画面差（アスペクト比）に対応する

## やりたいこと
スマホの画面の大きさに合わせて縦横が自動で調節される

## 細かいことはいいからやり方教えて
スクリプトを作成、設定
新規クラス、executeAlways属性追加
```
    [ExecuteAlways]
    public class CameraAspectKeeper
```
```
        private void Update()
        {
            float screenAspect = Screen.width / (float)Screen.height; //画面のアスペクト比
            float targetAspect = aspectVec.x / aspectVec.y; //目的のアスペクト比

            float magRate = targetAspect / screenAspect; //目的アスペクト比にするための倍率

            var viewportRect = new Rect(0, 0, 1, 1); //Viewport初期値でRectを作成

            if (magRate < 1)
            {
                viewportRect.width = magRate; //使用する横幅を変更
                viewportRect.x = 0.5f - viewportRect.width * 0.5f;//中央寄せ
            }
            else
            {
                viewportRect.height = 1 / magRate; //使用する縦幅を変更
                viewportRect.y = 0.5f - viewportRect.height * 0.5f;//中央余生
            }

            targetCamera.rect = viewportRect; //カメラのViewportに適用
        }
```
Mainのカメラをアタッチ　解像度を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/1bbe75ae-0c6c-373e-ea68-c96054e9fed1.png)

MainCameraのBackGroundを黒で塗りつぶす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/9dffce77-ccf5-62d5-ce5d-070bcf2ea649.png)


UIの設定
CanvasのCanvasScalerを下記に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/9fc5a8a8-c699-1d9e-ef7b-ca64d9ef65a8.png)

以上
Game画面でFreeAspectに画面を変えてみると確認できる。

## 補足
executeAlways属性はゲームの実行時でなくてもInspectrorの値が変更される。
実行していない時にGame画面を調整するとCameraのViewRectが変化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/01a9b1e9-2344-6c85-790b-3eb736c688de.png)

機能の仕組み
画面の大きさに合わせてCameraのViewRectを変化させることで画面のアスペクト比を固定で変化させている。


## 参考サイト

https://3dunity.org/game-create-lesson/clicker-game/mobile-adjustment/

https://qiita.com/kiku09020/items/7c4a66d6c8ea7c500a09
Automatic Termination for Neural Architecture Search #2

## 2 Perliminaries and problem setting
x：訓練データ
y:出力
w:重み
c:ハイパパラメータ
lossが最小になるようなwとcを探索するのがgoalです。
lossの式は以下のように表されます。
```math
L_D(w,c)=E_{(x,y)~D}[l(y,f_{w,c}(x))]
```
```math
L_{S_n}(w,c)=\frac{1}{|S_n|} E_{(x,y)~D}[l(y,f_{w,c}(x))]
```
Sはデータサイズとする。NASは２つの門体を最小化する。重みの最適化とアーキテクチャの最適化だ。最近ではNASは重み共有によって最適化を施す。スーパーネットは1度トレーニングされ、スーパーネットのサブグラフとして、すべてのアーキテクチャはwから直接重みを継承します。典型的な重み共有アプローチは、離散的なアーキテクチャ検索空間を連続空間に変換し、すなわち、cを実数値ベクトルθによってc(θ)として再パラメータ化します。重みとアーキテクチャパラメータθは、
```math
θ∗ = argmin(LSval(w∗θ, c(θ))) s.t. w∗θ = argminw LStrain(w, c(θ))
```
のように最適化を通じてトレーニングされます。
## 3.Related works 
## 3.1 Stopping methods for other machine learning problems 
学習にはハイパパラメータ探索する外側のループと最適化したハイパパラメータを用いて行う内側のループと２種類ある。内側のループに関してはベイズ最適化など様々な研究がなされてきた。しかしハイパパラメータを探索する外側のループというものはあまり研究されていない。確率的に求めるもの、期待改良から求めるものは過去にありますがこれらはNASには適していない。よって従来研究にはNASにおける最適化を行なう研究は全然ない。

## 3.2 DART
DARTの探索はDAG(directed acyclic graph)といったグラフのように探索します。そしてノードとエッジを用いて畳み込みのような手法で探索します。ここでノードiからjの重みをαとして一般にノードiからjの重みは
```math
∑^{K−1}_{ν′=0} \frac{exp(α(i,j)ν)}{ ∑^{K−1}_{ν=0 }exp(α(i,j)ν')} · oν(xi)
```
離散空間を連続空間に緩和するために、DARTSではオペレーション候補の選択をSoftmax関数で表現します。
 ## 3.2.2  DART++
 ２つのステップで探索を行う。１つは２つのスキップ接続があるとき一方の探索を終了させるもの。もう一つは１０エポックで重みが安定していたら探索を終了するというもの。これらはDARTを考えらパラメータなので１０エポックで安定していればよい。
 ## 3.2.3 RobustDART
 パラメータの探索時間に関するヘッセ行列の固有値と汎化性能について調査したもの。大きな固有値は探索に影響を与え、これらの固有値の探索を終了するには ¯ λαmax(i−k)/¯ λαmax(i) < 0.75 の条件を満たすときに探索を停止する。

## 3.3 ASNG-NAS
カテゴリカル分布におけるCを考慮した最適化を行なう。
```math

```
ASNG-NASのアルゴリズムは簡単に４つで表される。
1.ｃからｓａｍｐｌｉｎｇする
2.ｗの更新
3.θの更新
4.ステップサイズの適応

θの収束について：θは自動で収束しない代わりにθは固定され１００エポックまで実行する。収束にはカテゴリカル分布の平均値に収束する。ある論文ではエポック50で0.9を達成しこれがとてもよいとされているが、このθの停止基準というのは汎化誤差に対して大きく影響するため簡単に決めていいものではない。
【ChatGPT有＋DALL-E3】三角形を用いた画像生成をしてみます。


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

　今回は、三角形を用いた画像生成をしてみます。

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

　今日（2024/02/22）は、
　　猫の日です(=^･^=)

　“それがどうした？”と
　　言われたら、
　　　それまでなんですけどねw

　ネコ好きなんで
　　お許しください(汗)
***
　さて、
　　本題です。

　三角形を用いた、と
　　言われても
　　　ピンッときませんよねw

　最近は
　　見なくなりましたけど、
　　　いち時期、女性が
　　　　三角形のピースで
　　　　　構成された
　　　　　　バッグなんかを
　　　　　　　持っていました。

　あれは
　　GoogleSGEによると、
***
***Google SGE***
三角形で構成されたバッグには、三宅一生が立ち上げた日本のファッションブランド「イッセイミヤケ」のバッグ「BAOBAO」があります。
﻿
BAOBAOは、三角形のパーツを組み合わせて構成された、おもちゃのようなデザインが特徴です。三角形を構造体とし、使用すると平面が立体になり、フォルムが変化します。
﻿
BAOBAOは、2010年にブランドがスタートし、お洒落に敏感な方から注目され、たちまち大人気となりました。﻿
***

　あっ、
　　イッセイミヤケでしたか。
　　　今回まで調べたことが
　　　　ありませんでした(汗)

　まぁ、それは置いときましてw

　私が
　　このバッグを知ったのは
　　　『ランウェイで笑って』という
　　　　週刊少年マガジンで
　　　　　連載されていた
　　　　　　マンガです。

　作者は
　　猪ノ谷言葉さん、とのこと。
　　　詳しくは、ウィキペディアへ。

　マンガの内容も
　　ウィキペディアで
　　　お調べください。

　このマンガの中で
　　このバッグが
　　　登場したのです。
　　　　私は、それを見たんですね。
***
　そのバッグを
　　描画する、という話ではなく、
　　　この三角形のピースで
　　　　構成されたものを
　　　　　描画したいと
　　　　　　思ったわけです。
***
　三角形というピースは
　　なんでも立体物を
　　　構成可能です。

　三角錐をはじめとして
　　正方形や球体、その他諸々。

　現在の動画生成AIにも
　　取り入れられています。
　　　口パク動画なんて、
　　　　そのひとつになります。

　顔の形に、
　　三角形のピースを
　　　組み合わせて
　　　　構成したメッシュを
　　　　　顔画像にかぶせて合わせる。

　その表面に
　　顔画像を貼り付けて、
　　　メッシュの口の部分を
　　　　動かすと、口パクができます。

　身体の方も
　　似た技術を
　　　使っている、かもしれませんね。

　実は、わたくし、
　　以前、そういうことを
　　　やっていました。
　　　　もちろん、お仕事で。

　それで
　　多少は知っている、
　　　というわけです。
***
　さて、
　　解説を
　　　ここまでにして、
　　　　やり取りにいきましょうか。

　ChatGPTからの
　　コメントは省略します。
***
***user***
三角形のピースで構成されたパーカー。描画

***ChatGPT***
![1708569175449.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/5eff43cc-b6b3-030d-ffe2-e85787147e8f.jpeg)

***user***
三角形のピースで構成されたコーヒーマグ。描画

***ChatGPT***
![1708569193855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/216a15d5-6a0f-4079-bad0-73855d424609.jpeg)

***user***
三角形のピースで構成された女性の顔。描画

***ChatGPT***
![1708569215618.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/2f045bad-10a3-11df-36c6-900492397c80.jpeg)

***user***
三角形のピースで構成された地球儀。描画

***ChatGPT***
![1708569235013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/9310b94a-bc33-dff6-b770-988eb85da6bf.jpeg)
***

　ここまで来たら
　　Prompt Shareを
　　　やってもいい気がしますねw

　やろうと
　　思ったところで、
　　　ChatGPTの制限が
　　　　掛かりました。残念。

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

　今回は、ここまで。
Springのアノテーションってめちゃ便利じゃね？？？


annotation : 注釈,注記
を意味した英単語です。

Springではアノテーションが様々な役割を果たしています。
なので今回アノテーションについて調べてみました！

# 1. Springにおけるアノテーションとは

```java:java

@Controller
@GetMapping("/")

```

＠~~~
このような形で記述します。

特定のクラスやメソッドに対してフレームワークの機能や設定を指定することができます。

Springではこのアノテーションを付けることで「え！そんなところまで補完してくれるの！？」と大きい声を出すほど色々やってくれます。

# 2. 実際に使っているアノテーションを紹介

例を挙げるとキリがないので現状開発で使っている主なアノテーションを挙げます。

#### @&#xFFF0;Autowired
@Autowired: このアノテーションは、DI（Dependency Injection）を実現するために使用されます。Springコンテナは、@Autowiredアノテーションが付いたフィールドやメソッドのパラメータに対して、適切なBean（コンポーネント）を自動的に注入します。

ぶっちゃけまだDIがよくわかってないんですよね。。。
今後の課題ですね。

#### @&#xFFF0;Controller

@Controller: このアノテーションは、Spring MVCフレームワークにおいて、HTTPリクエストを処理するコントローラークラスを示します。

これは大発明ですよ！！
このアノテーションを付けるだけでコントローラーであることが一発で分かるし、スクラッチで作成するとめんどくさい部分を解決してくれます。
大好き。

#### @&#xFFF0;RestController

@&#xFFF0;RestController: @&#xFFF0;Controllerと同様にHTTPリクエストを処理するクラスを示しますが、@&#xFFF0;RestControllerはJSONやXMLなどのデータをHTTPレスポンスとして返す場合に利用されます。

実はまだ使った時ありません。
しかし説明文を読むだけでまた良さが伝わってきます。
現状AjaxやSPAでの開発をしていないので使ってないですが。いつかお世話になる未来が見えます。

#### @&#xFFF0;GetMapping()
#### @&#xFFF0;PostMapping()
@&#xFFF0;GetMapping / @&#xFFF0;PostMapping: これらのアノテーションは、それぞれGETリクエストやPOSTリクエストを処理するメソッドを指定します。

本当に一番使っています。
例えば↓のように実装すると、「lp」にアクセスするとroot関数が実行されます。
デバックすると時などURLから、実行した関数をすぐ発見することができます。
Springって便利やね。

```java:java
	@GetMapping("/lp")
	public String root() {		
	}
```

#### @&#xFFF0;Data

@&#xFFF0;Data: Lombokプロジェクトのアノテーションで、クラスに通常必要なメソッド（getter、setter、toString、equals、hashCodeなど）を自動的に生成します。

この子にもほんとにお世話になってます。
この子のおかげでわざわざgetter,setter書かなくて済むんですから。
書かなくてもいいと同時にコードの量が少なくなるので見やすくなります。

#### @&#xFFF0;NoArgsConstructor
#### @&#xFFF0;AllArgsConstructor

@&#xFFF0;NoArgsConstructor / @&#xFFF0;AllArgsConstructor: Lombokのアノテーションで、引数なしのデフォルトコンストラクタや、全てのフィールドを引数に持つコンストラクタを自動的に生成します。

この子もねー
日々感謝しています。
上記の@&#xFFF0;Dataと同じように便利なコンストラクタを自動生成してくれます。


# 3.終わりに

アノテーションって意味が分かっていないとまともにコードを読めないと思います。
これからもいろんなアノテーションとの出会いがあると思うのでこの都度調べてに付けたいですね。
とあるサイトを見てみると40種類はあるそうです。自作もできるそうなのでもしかすると相当数ありそうですね。

# 4.予告
次の投稿は2024年3月1日の予定です！
こんどこそCORSについて！
Websocketで、異空間通信。その3

# 概要
メタバースを使った、ドローン自動運転シュミレーターを提供します。

# 詳細
エージェント（ドローン）が環境で、自動運転するシュミレータを作り、結果をwebsocketに出力、neosvrで受け取り、ＢＯＸを移動させる。
websocketサーバーは、elixirで準備します。
エージェントと環境は、Plunkerで提供します。
設定は、ドローンが、８の字飛行運転を続けるシュミレーターです。
各ポイントは、以下です。

```
var point1 = {
  'x': 50,
  'y': 100
};
var point3 = {
  'x': 50,
  'y': 200
};
var point2 = {
  'x': 250,
  'y': 100
};
var point4 = {
  'x': 250,
  'y': 200
};
```

ドローンは、ステートマシンを持っていて、ポイントをクリアすれば、次のポイントに向かいます。
ドローンは、X,Yを得て、自分で判断します。
環境は、６０ｆｐｓで更新し、ドローンを移動し、位置を更新します。
環境は、Box2dです。2軸しかありません。
環境には、重力をかけています。
ドローンは、位置を受け取り、方向量ベクトルを出力します。
ドローンは、PID制御されています。
２個使っています。

```
var Agent3 = function() {
	this.err2 = 0;
  this.err = 0;
  this.P = 0;
  this.I = 0;
  this.D = 0;
};
Agent3.prototype.get_action = function(setPoint, input) {
  var Kp = 100;
  var Ki = 22;
  var Kd = 22;
  var dt = 0.01;
	this.P = setPoint - input;
  this.I += this.P * dt;
  this.D = (this.P - this.err2) / dt;
	var u = Kp * this.P + Ki * this.I + Kd * this.D;
	this.err2 = this.err;
	this.err = this.P;
	return u;
}

```

さらに、ドローンの位置情報をwebsocketで、垂れ流しします。
neosvrは、ドローンの位置情報をwebsocketで受け取り、ＢＯＸを移動させます。

#  写真

![2024-02-22 02.08.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e42e624d-72aa-45f9-a113-84375b0342e1.jpeg)


# 成果物


https://embed.plnkr.co/plunk/T4m0WdXAcEupvlO7


以上。
AWS Control Towerについて

概要
-------------------------
AWS Control Towerの機能
・ランディングゾーン
複数のアカウント環境をAWSのセキュリティとコンプライアンスのベストプラクティスに基づき、Control Towerが自動的にセットアップします

・コントロール
以下3つがランディングゾーンで設定されたAWSアカウントのガバナンスを提供するためのルール
・予防コントロール
・検出コントロール
・プロアクティブコントロール

予防コントロール、検出コントロール、プロアクティブコントロールは以下の3つのカテゴリから適用される
・必須
・強く推奨
・選択的

・Account Factory
新規アカウントの発行を標準化するテンプレート

・ダッシュボード
ランディングゾーンのOUやアカウントに適用されているコントロールの確認やポリシーの非準拠の検出などの確認できる

備考
次は、手順とコントロールについてもう少し掘りたいと思います



https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/aws-multi-account-landing-zone.html


https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/migration-aws-environment/understanding-landing-zones.html

https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/what-is-control-tower.html

https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/how-control-tower-works.html#how-controls-work
【Nuxt2=>Nuxt3の移行メモ】$fetchでFormDataをPOSTする時、Content-Typeを設定しないようにする

## 現状

Nuxt2のコード例
```nuxt2.ts
const formData = new FormData()
formData.append('file', myFile)

const result = await axios.post('myApi', formData)
```
そのままNuxt3に書き換えしたら、
```nuxt3.ts
const formData = new FormData()
formData.append('file', myFile)

const result = await $fetch('myApi', {
    method: 'POST',
    body: formData
  }
)
```
**400 Bad Request**になりました。

## 調査

[**MDNのドキュメント**](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects#sending_files_using_a_formdata_object)調べてみたら、FetchApiを使ってFormDataをPOSTしたいとき、Content-Typeは何も設定しないのが正解でした。

> :::note alert
> **Warning:** When using FormData to submit POST requests using XMLHttpRequest or the Fetch API with the multipart/form-data content type (e.g. when uploading files and blobs to the server), do not explicitly set the Content-Type header on the request. Doing so will prevent the browser from being able to set the Content-Type header with the boundary expression it will use to delimit form fields in the request body.
>:::

## 解決
デフォルトの`Content-Type: "application/json; charset=UTF-8"`設定しているため、FormDataを送りたいときContent-Typeを削除することにしました。
```nuxt3.ts
// デフォルトのheaders設定
const opts = {
  headers: new Headers(),
}
opts.headers.set("Content-Type", "application/json; charset=UTF-8")

// FormDataを送る時onRequestの中にContent-Typeを削除
onRequest({ request, options }) {
  options.headers = opts.headers;
  if (options.body instanceof FormData) {
    options.headers.delete("Content-Type");
  }
}
```
これで無事POSTできるようになりました。

## 参考
- [onRequest](https://github.com/unjs/ofetch?tab=readme-ov-file#onrequest-request-options-)
- [FormData](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects#sending_files_using_a_formdata_object)

********************************
弊社ではエンジニアを募集しています。ご興味ございましたら以下からどうぞ。

https://www.wantedly.com/companies/company_1847744/projects

![採用バナー細長2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692514/73b64289-cf1f-f70f-a417-46c64635a153.png)

********************************
はじめてのGit


## Gitを使ったプロジェクト管理の手順

**1**. 自身のPCにGitで管理するディレクトリを用意する

- [こちらのリンク](https://prog-8.com/docs/git-env-win) を参考に設定する.
- ディレクトリの状態変化をローカルリポジトリに登録し, リモートリポジトリと同期する.
- リポジトリは, ファイルやフォルダのデータとその変更履歴を収納しておく場所である.ローカルリポジトリとリモートリポジトリの同期によって, 複数人でコードと変更履歴を共有できる.

**2**. リモートリポジトリのクローンを作成する

- GitHubページから `git@~` を取得する.
- コマンドプロンプトで操作し, クローンを作成したい場所に移動する.

```zsh
cd 作成したいディレクトリへのパス
```

- クローンを作成する.

```zsh
git clone git@github.com:ユーザ名/リモートリポジトリ名.git
```


**3**. 変更内容をローカルリポジトリにコミットする

- ファイルやフォルダの変更をローカルリポジトリに登録する.
- ディレクトリからコミットする領域を指定する.
- ディレクトリ全体をコミットする場合は `git add *` を使用する.
- 特定のファイルやフォルダを指定してコミットしたい場合は `git add ファイル名orフォルダ名` を使用する.
- コミットを完了させる.

```zsh
git commit -m "コメント"
```

- コメントには変更内容の説明を記述する.

**4**. ローカルリポジトリをリモートリポジトリにプッシュする

- ローカルリポジトリの内容をリモートリポジトリにプッシュし, 変更履歴を共有する.
- プッシュは以下のコマンドで行う.

```zsh
git push origin main
```

- 逆に, リモートリポジトリの内容をローカルリポジトリに反映させる場合は, プルを行う.

```zsh
git pull origin main
```

これらの手順によって, プロジェクトのコードや変更履歴を効果的に管理し, チームでの共同作業を円滑に進めることができる.


### Git で作業するときの流れ. (簡易ver.)
1. `git pull` 
1. 作業 
   1. `git fetch`
   1. `git merge`
1. `git add *`
1. `git commit -m "コメント"`
1. `git push origin main`

## すでに作業しているローカルレポジトリを新たにGitで扱う方法

1. Github で空のリモートレポジトリを作成する. (リポジトリ名はローカルリポジトリ名に合わせる.)
1. `git remote add origin https://github.com/ユーザ名/リモートレポジトリ名.git`
2. `git add *`
3. `git commit -m "Initial"`
4. `git push -u origin main`

## ローカルリポジトリでのファイル削除をリモートに反映させる

```zsh
git add -u
git commit -m "cleanup"
git push
```
カテゴリ別施工事例追加（カスタム投稿タイプ）

## 前提
通常の投稿タイプをお知らせで使用しており、カスタム投稿タイプで施工事例を追加したい

## 流れ
1. functions.phpに施工事例のカスタム投稿タイプを管理画面に表示するように設定。カスタム投稿タイプにカテゴリとタグが表示される記述を書く。<br><br>
```php

/* ---------- カスタム投稿タイプを追加 ---------- */
add_action( 'init', 'create_post_type' );

function create_post_type() {

  register_post_type(
    'works',
    array(
      'label' => '施工事例',
      'public' => true,
      'has_archive' => true,
      'show_in_rest' => true,
      'menu_position' => 5,
      'supports' => array(
        'title',
        'editor',
        'thumbnail',
        'revisions',
      ),
    )
  );

  register_taxonomy(
    'workscat',
    'works',
    array(
      'label' => 'カテゴリー',
      'hierarchical' => true,
      'public' => true,
      'show_in_rest' => true,
    )
  );

  register_taxonomy(
    'workstag',
    'works',
    array(
      'label' => 'タグ',
      'hierarchical' => false,
      'public' => true,
      'show_in_rest' => true,
      'update_count_callback' => '_update_post_term_count',
    )
  );

}
```



1. Custom Post Type Permalinksのプラグインを入れて、カスタム投稿タイプのURL構造を決定。末尾を/%post_id%にする。<br><br>
1. archive-works.phpとsingle-works.phpという名前のファイルを作り、archive-works.phpを固定ページのテンプレートにする。<br><br>
1. 管理画面から施工事例ページをつくり、テンプレートを適用。<br><br>
1. archive-works.phpの中とsingle-works.phpの中に呼び出したい内容を書く。※この時、カスタム投稿タイプのループのみを取得するため、Queryにカスタム投稿タイプ名「works」を入れる。いつものお知らせに使用している、
```php
<?php
      if ($query->have_posts()) :
      while ($query->have_posts()) : $query->the_post(); ?>
```
の部分を下記に変更するだけ

```php
<?php
  $args = [
    'post_type' => 'works', // カスタム投稿名
  ];
  $my_query = new WP_Query($args); ?>
 
<?php if ($my_query->have_posts()): // 投稿がある場合 ?>               
           <?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
```
カテゴリを表示したいときは、
```php
<?php
  // カテゴリーのデータを取得
  $cat = get_the_category();
  $cat = $cat[0];
?>
```
上記をループ前に書き、出力表示したいところに以下を書く

```php
<?php
        if ($terms = get_the_terms($post->ID, 'workscat')) {
               foreach ( $terms as $term ) {
               echo ('<span>') ;
               echo esc_html($term->name)  ;
               echo ('</span>') ;
            }
        }
    ?> 
```
【初心者向け】scratchの始め方

こんちは、tetudo-meganeでございます。
今回は何にしようか迷ったんですけど、さすがに鉄道車両の解説とかだったらダメかなと思ったんで、やっぱりscratchのことしようと思います。
今回のは初心者向けなんでぜひ見てってください。
アカウントの作り方はscratchの言う通りにしたら作れるので作っちゃってください！

## アカウントを作った後
アカウントを作ったら(https://scratch.mit.edu/community_guidelines) [コミュニティガイドライン]を見ましょう。まあ、英語を日本語に翻訳してるんで意味わからんところありますがw
それを読んだらここに書くscratch上での常識のようなものも守りましょう！
・無変更リミックスをしない
・無差別に宣伝をしない（大体の人怒る）
・無差別にフォローしない（大体1時間に1回以上なら怒るかも）
あとは一般常識守ってれば大丈夫です。

## 作品を作る
やっぱりscratchきたら作品は作りたいですよね。
僕は最初、こんな感じのスクリプトで演奏などをよくやってました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712471/ccac6396-4a8f-e52b-dc10-cd66b31f1ad8.png)
※最初作ったのはこの作品ではないです
ただ、scratchでのプログラミングが上手くなるためにはこれだけだと物足りません。

なので、次は動きを付けた作品を作ってみるというのがいいと思います。
例えば　文字PV　とか
初心者だったらスプライトをたくさん使って作るのもよし、上級者だったら一つにまとめるのもいいかもですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712471/0d2bcece-b8d5-b314-104f-e24807075f1b.png)
今でも僕はこうやって腕が落ちたなとかんじたら文字PVつくってます。
こんな感じで結構いろんなことがscratchでできます。
僕は音声編集をscratchでやってます（笑）

最後までご覧いただきありがとうございました！

（ちなみに、僕はサムネ・アイコン製作してるんでよかったらぜひご利用ください）
pythonのprint()の上位互換icecreamが使いやすい話

## 使いやすい
お恥ずかしながらたまにデバッグモード使うのもめんどくさいとき、printに頼った経験は皆さんも多々あると思いますが、loggerとかと併用してたり、print文がそもそも多かったりすると、どの行のprintがどの出力かわかんなかったりします。

```python
def multiply(a, b):
    return a * b

print(multiply(1, 2))
print(multiply(3, 4))
print(multiply(4, 5))
print(multiply(5, 6))
print(multiply(6, 7))
print(multiply(7, 8))
print(multiply(8, 9))
```

出力
```python
6
12
20
30
42
56
72
```

「上から5行目だから、、、1,2,3....」

その対策として、以下のようにする人もいるかもしれません。（私です）


```python
print(multiply(6, 7), '5行目')
```
これいちいち書くの面倒ですし、誰にも見られたくないですよね。

そこで皆さん
```python
pip install icecream
```
しましょう。

何が良いって、何の出力化も明示してくれるところです。しかもカラフル。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/7bf7fa87-8d1d-ce75-7e78-b8087fb91414.png)

しかも一行で2つ出力しても何を出力しているかちゃんと教えてくれる。

```python
# loggingの例
logger = logging.getLogger()
ic(logger, type(logger))
```
出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/ecbe2571-60e4-f595-7d19-761089588b89.png)

ちゃんと改行して、
```python
 logger: 
 type(logger): 
```
という風に、何の出力か教えてくれます。
これいいよね。

## 辞書もお手の物
以下のような辞書をicecreamで出力してみます。
```python
data = {
  "products": [
    {
      "name": "T-shirt",
      "details": {
        "color": "blue",
        "size": "medium",
        "material": "cotton"
      }
    },
    {
      "name": "Jeans",
      "details": {
        "color": "black",
        "size": "32",
        "material": "denim"
      }
    },
    {
      "name": "Sneakers",
      "details": {
        "color": "white",
        "size": "10",
        "material": "leather"
      }
    },
    {
      "name": "Backpack",
      "details": {
        "color": "gray",
        "size": "large",
        "material": "nylon"
      }
    },
    {
      "name": "Watch",
      "details": {
        "color": "silver",
        "size": "one-size",
        "material": "stainless steel"
      }
    }
  ]
}

```
出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/b053d605-aab7-0cc4-3659-7c974dbb2cbf.png)
インデントはともかく、まあ悪くない

## 引数なしでも便利
ある関数を定義して、その関数が実行されているか、またはどこまで到達しているかを引数なしのic()で確認することができます。引数なしとありを組み合わせると、結構パワフルですよね。

ic.disable() と ic.enable() 関数によって、デバッグ出力のオン/オフを簡単に切り替えることができます。

```python
def add_and_subtract(a, b):
    addition = a + b
    ic()
    ic(addition)
    subtraction = a - b
    return addition, subtraction

def main():
    add_and_subtract(10, 5)
    add_and_subtract(20, 15)
    ic.disable()
    add_and_subtract(30, 25) #　この行はprintされなくなる
    ic.enable()
    add_and_subtract(40, 35)

if __name__ == '__main__':
    main()

```
出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/266b0ee1-cbe2-c6c5-218b-8c55c456ffcb.png)


このようにic() は出力に変数名や式を含めるため、デバッグ情報がどのコード行から来たのかが明確になります。
Automatic Termination for Neural Architecture Search(ATNAS)

## 1.introduction
ここではAutomatic Termination for Neural Architecture Search(ATNAS)のpart1のintroductionのみの論文読んでみました。近々part2から７までも記事を書こうと思います。
## 1.1 NAS (Neural architecture search)
NASは自動的にアーキテクチャのモデルを作るものであり、NASアルゴリズムはランダムサーチ、進化計算、ベイズ最適化、強化学習、ニューラルネットワーク最適化、動的な重み調整などのものは様々なタスクにおいてどれも高性能の評価を達してる。
しかしこれらの手法は何千ものGPUが必要なため計算量がとても多い。
なので近年NASの探索においては計算量を減らすことが研究の主流になってきてる。
## 1.2 早期終了　(early-stopping ) 
NASが早期終了といった適切な時間内で探索が終了するように基準を設け、探索のコストを減らしていた。早期終了はコストを減らすだけでなく、精度も向上させる。ここから性能を維持したNASの早期終了に焦点を当てる。
## 1.3 DARTS
早期終了のなかでもone-shot学習に注目する。one-shotのNASは大規模なネットワークにおいて最適化するカスタマイズを加えることで探索コストを減らした。これらのネットワークは探索領域において重み共有や確率的な最適化により期待した精度を出している。
DARTSは微分可能なNASとして知られました。これは大幅に精度を向上させNASよりもよい精度でタスクを解いた。しかしDARTSはランダムサーチを悪化させるようなものとして知られている。DARTSとして協力的なオペレーション設定と補助スキップ接続によるDARTSが早期終了に関する研究では論文者が知るかりで最高性能の精度を誇っている。
## 1.4 RobustDARTS
RobustsDARTSはヘッセ行列の固有値によってモデルの変性を軽減する。（ここではヘッセ行列はネットワークパラメータの汎化誤差によるものとする）固有値が上昇する前に探索を終了させることで、flat minimと汎化誤差を期待するが、訓練データと汎化誤差の間の割れ目により過学習や過少適合が起きてしまった。これらを改善するために、早期終了を行うDARTS+を提案した。
## 1.5  RobutsDARTSと固有値
RobutsDARTSは閾値によるヘッセ行列の最大値を滑らかにするように修正した。（ここでのヘッセ行列の基準は様々なタスクにおいて、汎化の精度とヘッセ行列の固有値を学習する）
しかしヘッセ行列の固有値計算にはコストが高すぎることが問題としてなった。
## 1.6 DARTS ++とP-DARTS
DARTS++はいくつかのスキップ接続のパラメータが安定したときにDARTSの探索を終了する。P-DARTSはシンプルで実装が可能にしたものであり、スキップ接続の個数を限りあるものにすることでコスト削減を行った。しかしこの２つはどちらも検証をするような論文はない。
## 1.7 Automatic Termination for Neural Architecture Search(ATNAS)
ASNG-NASは勾配ベースのone-shot学習を行うNASであり、少ないGPUでDARTSよりもよい性能を出しているネットワークである。このようなシンプルな探索である一方、自動で探索を行うといった手法はまだありません。なのでこの論文ではASNG-NASを用いたAutomatic Termination for Neural Architecture Search(ATNAS)という終了基準を提案する。
これは関連研究のようなDARTSが基になっている早期終了、NAS,DARTS++,RobutstDARTだけでなくどんな分野においても探索可能な手法を提案します。
## 1.8 終了条件
この論文ではどんな分野でも最小化できるように終了条件は汎化誤差で行う。以前の汎化誤差と今の探索に対するパラメータのgapを考える。そして終了基準についての上限も評価する。終了の上限が検証誤差の見積もりよりも小さかったら、ネットワーク探索は終了する。
なぜなら汎化誤差向上のためのより重要な削減は期待できないと考えるから。
## 1.9 
提案手法は加速と最適な探索を平行で行うことで、よりよい効率性を重視します。
## 1.10 研究の要約
1.NNの過去の検証誤差と今のステップにおけるパラメーターのgapに基づいく終了基準を提案した。この終了基準の閾値は各エポックごとに自動で決まるものとする。提案手法は汎化誤差を考慮した計算量削減を行った。
2.汎化性能を保てるように早期終了を行ういくつかの実験を行った。ASNG-NASやDARTSといったone-shot NAS アルゴリズムでテストを行い、評価にはベンチマーク関数を用いた。
問い合わせフォームにスパムが大量に来たため、簡易対策をした話【Laravel】

# はじめに
実務で問い合わせフォームにいつからか大量のスパムが送られるようになり、どうにかならないかと相談を受けたため、色々調べて以下の簡易的な対策を実施することにしました。

# スパムを送信するロジックについて
調べたところによると、スパムはbotを使用して、フォーム内のすべての項目に値を自動入力し、送信してくるケースが多いようです。

その特性を利用して、表示上見えないフォームを作成し、そのフォームに値が入っていたらスパムと判断（普通はフォームが見えず、値が入力できないため）し、404を返す形で実装します。こういった形は「Honeybot」と呼ばれるようです！

# 実装したコード
````php:contact.blade.php
    <form  method="POST" action="{{ route('contact') }}">
        @csrf
        <div>
            <h2>お問合せフォーム</h2>
            <dl>
                <dt>
                    <label for="name">氏名<span>必須</span></label>
                </dt>
                <dd>
                    <input type="text" class="form-control{{ $errors->has('name') ? ' is-invalid' : '' }}" name="name" id="name" placeholder="氏名" value="{{ old('name', '') }}" >
                </dd>
                // こちらを今回追加
                <dd style="display:none;">
                     {{ Form::text('subject', '') }}
                </dd>
            </dl>
        </div>
    </form>
````

````php:ContactController.php
    if(isset($request['subject'])){
        abort('404')
    }
````

# さいごに
今回こちらを実装したことで、実際にスパムが来なくなりました！
ちょっとした工夫が大切なんだなと勉強になりました。
wsususcn2.cabをDLしてくれるbat

```bat:wsusscn2AutoDL.bat
@echo off
REM #================================#
REM  Filename:wsusscn2AutoDL bat
REM  date:2024.02.22
REM  created by Kairi
REM #================================#

set SetDate=%date:/=%
set DLURL=https://catalog.s.download.windowsupdate.com/microsoftupdate/v6/wsusscan/wsusscn2.cab
set DLPath=C:\WinUpdate\wsusscn2.cab 

if exist %DLPath% (goto TRUE) else (goto FALSE)

REM ファイルの有無を確認する
:TRUE
echo ファイル有り
dir /B %DLPath%

ren %DLPath% wsusscn2_%SetDate%
bitsadmin /transfer download %DLURL% %DLPath%

timeout /t 10 > nul
goto END

:FALSE
echo ファイル無し

bitsadmin /transfer download %DLURL% %DLPath%

timeout /t 10 > nul
goto END
```

タスクスケジューラに仕込めば決まった日時でDLしてくれると思う