OmniAICreator/Qiita-1.07M huggingface dataset:
ResourcefulとRESTful

Laravelの学習中、ResourcefulとRESTfulについて触れることがあり、それぞれどういう仕組みなのかを簡単にまとめます。
## 前提
ResourcefulとRESTfulも、ルーティングの設計パターンに関連する概念である。

## Resourceful
Resourcefulなルーティングでは、`Route::resource('名前', 'コントローラ名')`という形式でルーティングを定義する。これにより、CRUD操作に対応する一連のルート(GET、POST、PUT、DELETE)が自動的に生成される。

```ruby
## これだけCRUDに対応するルートが自動的に生成される。
Route::resource('books', 'BookController');
```

## RESTful（Representational State Transfer）
Webアプリケーションの設計原則であり、リソースを表現し、HTTPメソッドを使用してそのリソースに対する操作を行う方法を定義する。

***
ResourcefulもRESTfulも、同じ結果をもたらすことがある。
例えば特定の本を取得する操作を行う場合。
```ruby:Resourceful
Route::resource('books', 'BookController');
```
```ruby:RESTful
Route::get('/books/{id}', 'BookController@show');
```

特定の本を削除する操作を行う場合。
```ruby:Resourceful
Route::resource('books', 'BookController');
```
```ruby:RESTful
Route::delete('/books/{id}', 'BookController@destroy');
```

Resourcefulのルート内容はどちらも同じ。
***
Resourcefulは、Resourcefulのルーティングを使用することで、CRUD操作に対応するルートが自動的に生成される。これにより、コードの量を減らすことができるメリットがある反面、必要としない操作のルートも生成されてしまう。また、特定のルートに制限を加えたい場合や、カスタムのルートを追加したい場合には、手動でルートを定義する必要がある。
RESTfulは、Resourcefulなルーティングよりも柔軟性がある。RESTfulなルーティングを使用する場合、必要なルートを手動で定義する必要があるが、その分、より細かい制御が可能である。

基本的なCRUD操作に対応するルーティングを使用する場合、Resourcefulなルーティングが便利だが、より複雑なルーティングや特定の制約を持つ場合、RESTfulでルートを定義することが適切かもしれない。

※Resourcefulなルーティングは、CRUD操作をシンプルに表現するための手法であり、RESTfulなルーティングは、リソース指向のアーキテクチャスタイルに基づいたルーティングの手法である。
したがって、ResourcefulなルーティングとRESTfulなルーティングは、異なる概念であるため、比較することはできない。それぞれのルーティングスタイルは、プロジェクトの要件や目的に応じて決められる。
エポックミリ秒ってなんだ。。

## 背景
現在担当している機能の中で、エポックミリ秒を扱っている処理があった。

## エポックミリ秒とは
UNIX時間(エポック秒)とは、1970年1月1日0時0分0秒(UTC)からの経過秒数を表す、コンピュータの時刻表現方法の一つです。 UNIX時間は、コンピュータの各種アプリケーションで時刻を扱う際に広く使われており、タイムスタンプやファイルの更新日時など、様々な場面で利用される。

ミリ秒単位で表すものを「エポックミリ秒」
秒単位は「エポック秒」と呼ばれる

## 参考サイト
以下のサイトで、指定した日付をエポックミリ秒、エポック秒に変換できる
https://yu-yum.net/epoch/
Azureについて（初心者向け）



Azureについて簡単に記載します。

アウトプット用です。


---------------------------

# Azureとは
Microsoft社が提供するクラウドサービスのこと


# クラウドサービスとは
ネットワークを経由してサービスを利用することの総称


# クラウドの種類（サービスモデル）
IaaS（イアース、アイアース）
PaaS（パース、パーズ）
SaaS（サース、サーズ）　呼び方はいろいろ・・・


# IaaS（VM、Azure Storage、Azure Virtual Network）
サーバーやストレージ、ネットワークなどを仮想化して利用できる。
提供範囲（仮想マシン、物理サーバー、ストレージ、ネットワーク）


# PaaS（App Service、Azure SQL Database）
アプリケーションを開発できるプラットフォームを利用できる。
提供範囲（IaaSの提供範囲に＋ランタイム、ミドルウェア、OS）


# SaaS（Microsoft365、Gmail、Amazon Workdocs）
ネットワークを経由してソフトウェアを利用できる。
ローカルにインストールされるものとは別。
提供範囲（IaaS、PaaSの提供範囲＋アプリケーション）

# Azureの使用について
・従量課金制
・無料プランあり（30日経過　or　クレジット（200ドル）を使い切ると終了）
（一人につき一度のみ利用可）
その

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Canvas to Transparent PNG</title>
</head>
<body>
  <canvas id="myCanvas" width="300" height="200"></canvas>
  <button id="downloadButton">Download as Transparent PNG</button>

  <script>
    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');

    // Canvasに描画する例として赤い四角を描画
    context.fillStyle = 'red';
    context.fillRect(50, 50, 200, 100);

    // ダウンロードボタンのクリック時にCanvasを透明なPNGに変換してダウンロード
    document.getElementById('downloadButton').addEventListener('click', function() {
      // Canvasを透明にクリア
      context.clearRect(0, 0, canvas.width, canvas.height);

      // 透明なCanvasに再描画
      context.fillStyle = 'red';
      context.fillRect(50, 50, 200, 100);

      // 透明なPNG画像としてダウンロード
      var dataURL = canvas.toDataURL('image/png');
      var link = document.createElement('a');
      link.href = dataURL;
      link.download = 'transparent_canvas_image.png';
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    });
  </script>
</body>
</html>
```
```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Canvas to Transparent PNG (jQuery)</title>
  <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
</head>
<body>
  <canvas id="myCanvas" width="300" height="200"></canvas>
  <button id="downloadButton">Download as Transparent PNG</button>

  <script>
    $(document).ready(function() {
      var canvas = $('#myCanvas')[0];
      var context = canvas.getContext('2d');

      // Canvasに描画する例として赤い四角を描画
      context.fillStyle = 'red';
      context.fillRect(50, 50, 200, 100);

      // ダウンロードボタンのクリック時にCanvasを透明なPNGに変換してダウンロード
      $('#downloadButton').click(function() {
        // Canvasを透明にクリア
        context.clearRect(0, 0, canvas.width, canvas.height);

        // 透明なCanvasに再描画
        context.fillStyle = 'red';
        context.fillRect(50, 50, 200, 100);

        // 透明なPNG画像としてダウンロード
        var dataURL = canvas.toDataURL('image/png');
        var link = $('<a></a>').attr('href', dataURL).attr('download', 'transparent_canvas_image.png');
        $('body').append(link);
        link[0].click();
        link.remove();
      });
    });
  </script>
</body>
</html>
```
herokuでClearDB MySQLからJawsDB Mariaに置き換え

#Clear DBからJAWSDB mariaに置換

Clear DB Mysqlの無料枠が昨年廃止に伴い、JAWS DB Mariaに置き換えしました。

1. DBのバックアップを取得

https://sequelpro.com/  を使用してDBに接続

```bash
heroku config
=== sevens-api Config Vars

DATABASE_URL:             mysql2://user:pass@shichimi.com:3306/db
DB_HOSTNAME:              shichimi.com
DB_NAME:                  db
DB_PASSWORD:              pass
DB_PORT:                  3306
DB_USERNAME:              user
JAWSDB_MARIA_URL:         mysql://user:pass@shichimi.com:3306/db
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:          hogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge
```

https://sequelpro.com/ を使用して`JawsDB maria`に接続して、バックアップをインポート

`database.yml`が下記です。
絵文字対応してます㊗️

```yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: 5

development:
  <<: *default
  database: development
  username: root
  password:
  socket: /var/lib/mysql/mysql.sock
  host: <%= ENV.fetch("DB_HOST_NAME") { "localhost" } %>

test:
  <<: *default
  database: test

production:
  <<: *default
  database: <%= ENV['DATABASE_NAME'] %>
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: <%= ENV['DB_HOSTNAME'] %>
  url: <%= ENV['DATABASE_URL'] %>
```

クライアント側で、各種環境変数を設定

```bash
shichimi: [master]$: heroku config:set DB_NAME="db-name"
Setting DB_NAME and restarting ⬢ shichimi-api... done, v68
DB_NAME: db-name
shichimi: [master]$: heroku config:set DB_PASSWORD="pass"
Setting DB_PASSWORD and restarting ⬢ shichimi-api... done, v69
DB_PASSWORD: pass
shichimi: [master]$: heroku config:set DB_HOSTNAME="shichimi.com"
Setting DB_HOSTNAME and restarting ⬢ shichimi-api... done, v70
DB_HOSTNAME: shichimi.com
shichimi: [master]$: heroku config:set DB_USERNAME="user"
Setting DB_USERNAME and restarting ⬢ shichimi-api... done, v71
DB_USERNAME: user
shichimi: [master]$: heroku config:set DATABASE_URL=" mysql2://user:pass@shcihimi.com:3306/db-name"
Setting DATABASE_URL and restarting ⬢ shichimi-api... done, v72
DATABASE_URL:  mysql2://user:pass@shcihimi.com:3306/db-name
```

`database.yml`の設定が不要な場合、環境変数だけ、上記コマンドで、環境変数の設定だけ変更すれば良いです。
`database.yml`のファイルを変更する場合は下記でコミットしましょう！

```bash
git push heroku main
```

## 注意点

余談ですが、私の場合環境変数のURL schemeが`mysql`になっており、`mysql2`にしないと疎通できませんでした😭
各々の環境に合ったURL shcemeにしましょう
PC重いときに見なおしたほうがいいこと【CPU使用率削減アイデア】


# ごみ箱を整理する

全部空っぽにしましょう。

# PC起動時に勝手に立ち上がるアプリを設定しなおす

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334349/5f725e1c-e8d7-8063-a5b9-3a03251ec7c8.png)
なぜか起動時に自動的に立ち上がってしまうものがあったりするので消しましょう


# 起動しっぱなしのPCだったら再起動
ずっとスリープ→起動を繰り返していてシャットダウンを久しくしていない
一度思い切って再起動しましょう。なぜか　軽くなります。
(一時データを蓄積しすぎてしまうのかなと思います)


## 作業を一つずつ進める
一つずつ進めましょう。
並行していろいろやっていると思い市気もちるし、なにも完了しないから結局何も終わってないみたいな焦燥感にかられます（自戒）
【AWS】S3とCloudFrontで静的Webサイト公開


https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/getting-started-cloudfront-overview.html

## S3のみで静的Webサイトを公開する
1. 適当にS3バケットを作成する
1. バケット設定のプロパティ -> 静的ウェブサイトホスティングの編集を押す
1. 有効にするにチェックを入れる
1. インデックスドキュメントにindex.htmlと入力する
1. (任意) JSON形式でリダイレクト設定をする
    https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-page-redirect.html?icmpid=docs_amazons3_console
1. 適当なindex.htmlファイルをアップロードする
1. アクセス許可のブロックパブリックアクセスで、すべて無効にして公開する
1. バケットポリシーに下記を記載する
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::s3-site-test-20220730-1/*"
        }
    ]
}
```
1. 静的ウェブサイトホスティングの設定箇所に記載されているURlをクリックする

## CloudFrontとS3で静的Webサイトを公開する
1. 適当にS3バケットを作成する
1. CloudFrontコンソール画面で、ディストリビューションを作成を押す
1. オリジンドメインで、S3バケットを指定する
1. Origin path - optionalでindex.htmlを記入する
1. オリジンアクセスで、Origin access control settings (recommended)にチェックを入れる
   ![S3cloudfront3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/1be80aa1-6e2e-2c87-595c-cfabba66b543.png)
   ![S3cloudfront4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/bfc016d0-a794-a387-3979-20f2523f0bb5.png)
1. 「Create new OAC」を押して、OACを作成し、ポリシーをコピーを押す
1. S3コンソール画面に戻り、アクセス許可->バケットポリシーで編集を押す
1. コピーしたポリシーを張り付けて保存する
1. CloudFrontの画面に戻り、作成を押す
1. ディストリビューションを作成を押す
1. CloudFrontコンソール画面で作成したディストリビューションを選択して、ディストリビューションドメイン名をURLとして開く

## まとめ
今回はS3 + CloudFrontを用いて、静的Webサイトの公開の仕方を紹介した。
iOSのシミュレータ不具合

再ダウンロードは時間かかるだけで意味ない

```shell
for a in `ps -ef | grep -i xcode.app | awk '{print $2}'`
do 
sudo kill -9 $a
done

rm -rf ~/Library/Caches/*
rm -rf ~/Library/Developers/CoreSimulator/Devices/*
for a in `ps -ef | grep -i coresimu | awk '{print $2}'`
do 
sudo kill -9 $a
done
```

その後デバイス削除➡再作成
対角部分群

# 対角部分群（diagonal subgroup）
対角部分群とは，ある群$G$の直積$G^n=G\times \cdots \times G$の部分群のうち群$G$の同一の要素からなるもの．

例）
$G = \set{(L,R)|L \in {\rm SU}(N),~R \in {\rm SU}(N) }$に対して部分群$H=\set{(V,V)|V \in {\rm SU}(N)}$は$G$の対角部分群である．ここで${\rm SU}(N)$は特殊ユニタリー群とした．

# おわり
説明している文献を見つけられなかったのでメモ．QCDのカイラル対称性とその自発的破れを非線形表現で調べるときに役立つかも．

詳しい方からのコメント等頂けると大変ありがたいです．

# 参考文献
[1] A. Pich, "Effective Field Theory", [arXiv:hep-ph/9806303](https://arxiv.org/abs/hep-ph/9806303), (1998).
【Mac】ストレージが足りない時にはこれをみて！

# はじめに
こんにちは。
Flutter開発を始めてかれこれ1年半が経ったエンジニアです。

ある日突然、Flutter開発中にデバッグができなくなり、なにごと？！となりました。
確認すると、ストレージが足りずアプリをデバッグできるほどのメモリが残っていないとのこと。

モバイルアプリ開発をするエンジニアとして、これは致命傷。
ただ、ストレージを開けようと不要なファイルを削除しようと思っても
「これは消していいファイルなのか」
「1ファイル消したとして500MBしか開かない...」
といった悩みが。

今回、そんな悩みがバカらしく思うくらい大量にストレージを開けられた方法を2つ紹介します！

## こんな人に読んでほしい

* Macユーザでストレージを開けたい方
* モバイルアプリ開発をする方
* XCodeをインストールしている方
* AndroidStudioをインストールしている方

## ストレージの確認方法

![スクリーンショット 2024-01-16 14.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/3149cb3e-543e-2412-89fb-eb974638a5b0.png)

```ディスプレイ左上にあるリンゴマーク > システム設定 > 一般 > ストレージ``` から現在のストレージを確認できます。

XCodeを使用したことがある方は、システムデータが大半を占めているのではないでしょうか？
ここの不要なファイルを削除することで、一気にストレージを確保することができます。

## XCodeのキャッシュを削除する

ターミナルで以下のコマンドを実行してみてください。

```~/Library/Developer/Xcode/DerivedData```

```DerivedData```というディレクトリが開かれたかと思います。
このフォルダは、XCodeのログやキャッシュが格納されており、ビルド時に自動生成されるので、削除しても問題ありません。

以下のコマンドを実行して削除することが可能です。

```
rm -rf ~/Library/Developer/Xcode/DerivedData/*
```

5GB程度のストレージが開いたのではないでしょうか？


## シュミレータの不要なデータを削除する

XCodeで生成するシミュレータには、過去のiOSやMacOSのバージョンデータが蓄積されています。
ただ、その中に、すでにサポートする必要のないバージョンの情報を持っている場合があります。

以下のコマンドを実行してみてください。

```
xcrun simctl list
```

僕はこのコマンドを実行した時に、ものすごい量のOSバージョンが表示されました。

ただし、確認して欲しいところは、```unavailable```という表記が生まれているバージョンです。

これは、利用不能のバージョンであるという意味なので、削除してしまって問題ない。
むしろ削除したほうがいいデータになります。

以下のコマンドを実行して削除できます。

```
xcrun simctl delete unavailable
```

僕はこれによって、25GBほどストレージを空けることができました！！

## AndroidStudioの使用しなくなったエミュレータを削除する

モバイルアプリ開発をしていれば、iOSだけでなくAndroidStudioを使用してエミュレータを生成することもあるかと思います。
その際に、2つ以上のエミュレータを使用して開発することもあるのではないでしょうか？
その度に、新しくエミュレータを作成していると、1つのエミュレータに対して5GB程度ストレージを占めてしまいます。
なので、以下の方法で削除しましょう！

```AndroidStudio > DeviceManager > 対象のエミュレータの3点リーダ > delete```

# 最後に

どうでしたか？？
自分は上記方法で、合計50GB程度削除することができました！

他にもストレージを開けられる方法があればコメントで教えてください！
ER図のIE記法（鳥の足ってなんぞ）

## Crow's Foot 記法
ER 図のための書き方のひとつ

「![20200223190753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/8374bec7-2e2a-34ab-5ca3-3544df0d9e64.png)」のような鳥の足に見える記号を使うため、「Crow's Foot 記法」(Crow's Foot = カラスの足) 「鳥の足記法」と呼ばれています。

https://knooto.info/erd-crows-foot/

わかりやすく見る場合はこちらを

https://qiita.com/ramuneru/items/32fbf3032b625f71b69d

## 
IE記法では、多重度を書く際に1やNのような数字や変数を使わず、専用の記号が使われます。

基本的には、

- 0（〇を書く）
- 1（ | を書く）
- たくさん（![20200223190753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/8374bec7-2e2a-34ab-5ca3-3544df0d9e64.png)）
の3つの基本表記が使われます。

![スクリーンショット 2024-01-16 15.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/0612ad1e-8970-71e8-abfc-00478957da5e.png)


## リレーションの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/44ac0713-1671-f21f-a8c9-a2e73734eea6.png)
AWS DataSyncとは？の備忘録

## AWS DataSyncはどんなサービス？
データ移行を簡素化し、高速化する。

### 具体例

#### ①オンプレミス←→AWSデータ間
オンプレミスと AWS ストレージサービス間のデータ移動を自動化して加速化する安全なオンラインサービスです。その際、オンプレミスにAWS DataSyncエージェントをインストールして設定します。

#### ②AWSサービス←→AWSサービス間
S3
EFS
Fsx for windows file server
Fsx for lustre
Fsx for OpenZFS
Fsx for NetApp ONTAP


#### ③他クラウドサービス←→AWSサービス間
AWS DataSync は他のパブリッククラウドと AWS ストレージサービス間のデータ移動に対応しています。


### ※使い方（重要）
AWS DataSyncデータエージェントを
データ転送元
データ転送先
の両方にインストールする必要があります。
terraform-aws-modules/lambda/awsとPoetryを使ってLambda Layerを作成

### 課題

Terraformの `terraform-aws-modules/lambda/aws` と `poetry` を利用してLambda Layerを作成したい場合の方法です。


基本はドキュメントの例にあるように `create_layer = true` を設定すれば良いのですが、そのままドキュメント通りに実装すると、`Unable to import module` となります。

https://registry.terraform.io/modules/terraform-aws-modules/lambda/aws/latest


これは、こちらに記載のある `python` ディレクトリ配下にモジュールをインストールする構造を実現できません。

https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html


### 実現方法


`poetry_install` と一緒に、`prefix_in_zip  = "python"` とするとLambda Layerとして以下のように定義すると、Layerのモジュールをインポートして利用できるようになります。

```
.
├── package
│   ├── poetry.lock
│   ├── pyproject.toml
└── layer
    └── main.tf
```





```terraform
module "layer" {
  source  = "terraform-aws-modules/lambda/aws"
  version = "6.5.0"


  layer_name   = "layer-name"
  runtime      = "python3.11"
  description  = "Layer"
  create_layer = true

  source_path = [
    {
      path           = "${path.module}/../package"
      poetry_install = true
      prefix_in_zip  = "python"
    }
  ]
}
```
第2回目の転職について

## 第2回目の転職について
人によって、転職を考える理由は、様々だと思うが、私の転職するきっかけについて書く。

- 1社目：大手製造メーカーで生産技術、組み込み開発業務に従事。
- 2社目：大手自動車部品メーカーで組み込み開発業務に従事。
そして、この度、第3社目となる大手SIerへと転職する事となった。

## 転職理由
- 1社目：大手製造メーカー
　入社して以来、工場の生産技術業務に携わり、人手作業の自動化を推進。その中で、ソフトウェアの重要性を感じ、ハードに近い組み込み技術者へと社内ローテーションで転身。
  その後、数々のプロジェクトを推進し、その結果、気づいたら主任となっていた。本会社での主任は、ソフトウェアの設計する仕事というよりは、要件をまとめ、外注管理するのが主な仕事であり、もっとソフトウェア設計スキルを向上さしたいと考え、転職に踏み切った。
- 2社目：大手自動車部品メーカーで組み込み開発業務に従事。
　本会社では、自動車のInCarにおける大規模な車載機器の組み込み開発の業務に携わる事となった。自動車OEMのプロジェクトの最初から合流でき、低レイヤー業務を推進した。プロジェクトの開発が終わる頃、自動車のInCarだけの業務に携わっている事に危機感を感じ、もっとエッジtoクラウドでの経験、知識が必要と考え、転職に踏み切った。

 当初、自動車のInCar、OutCarを経験できる業務に拘っていたが、自身の経験を振り返る中で、自動車×生産技術×ソフトウェアの掛け算での経験を活かせる仕事を探し、この度、第3社目への会社へ転職する事となった。

 以後、私のキャリアの備忘録として、記事をUPしていきたいと思う。
GitHub Actions で Pulumi する

# GitHub Actions で Pulumi を実行してみた

サンプル通りですが，それでできたということで．
GitHub から実行できるようにすることを考える．

https://www.pulumi.com/docs/using-pulumi/continuous-delivery/github-actions/

## 何かしら動く状況になった

前回で，Pulumi が動く状況になった

- AWS
    - sso
- TypeScript

## GitHub の準備をする

- repo を作る
    - push する

この辺りは普通の手順

## GitHub Actions で反映させてみる

- workflow 用の設定を作る
    - push する
    - PR を作る
        - 失敗することを確認する
            - secret を設定する → 通るようになる
    - merge する
        - 反映されることを確認する

workflow の設定は，リンク先にある通り．そのまま実装するだけで，preview / run の流れが実行可能になる．
今回は時間の都合で，API キーで設定する．[^oidc]

[^oidc]: https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services 
OpenID Connect (OIDC) を使うと、GitHub Actions ワークフローでは、有効期間の長い GitHub シークレットとしてアマゾン ウェブ サービス (AWS) 資格情報を格納しなくても、AWS 内のリソースにアクセスできます。

```plantuml
class PulumiCloud
package AWS {
  class S3
}
package GitHub {
  class GitRepository
}
class LocalMachine

LocalMachine -up- GitRepository : git push
GitRepository -up- PulumiCloud : pulumi up / preview
PulumiCloud -right- S3 : API
```

# Refs

https://qiita.com/atm-snag/items/0cd43d023f92ec6416f4
Microsoft Copilotで、日本語プログラミング その2

# 概要
Microsoft Copilotのプロンプトを細工して、日本語プログラムを実行させようとする試みです。
FizzBuzzをやってみた。

# Ohisama prompt

```
日本語プログラムの実行結果を答えてください。全ての結果を表示願います。
変数ｎに0を入れ１を加えて、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、両方で割り切れる場合は「FizzBuzz」と表示し、
それ以外の数値ではその数値を表示します。100回繰り返す。

```

# 回答


日本語でのプログラムの実行結果をお見せしますね。以下のようになります：

```plaintext
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

これは、0から始めて100までの数値に対して、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、両方で割り切れる場合は「FizzBuzz」と表示し、それ以外の数値ではその数値を表示するプログラムの実行結果です。
ご要望に応じて全ての結果を表示しました。
他にご質問があれば、お気軽にどうぞ！


以上。
MotionBERT: A Unified Perspective on Learning Human Motion Representations

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/e5c31cb2-2afb-5818-bb17-a0fe89d340ef.png)
動画から3Dポーズ推定をしたり3Dメッシュ再構成をしたり、または行動認識を行ったりするモデルは多数提案されているが、従来はそれぞれ独立したタスクに対してモデルを作らなければならなかった。この研究では、一つのモデルで複数のタスクが解ける統一モデルを提案している。評価実験では、統一モデルで複数のタスクに対し従来の専用モデルよりも高精度なSOTAとなるスコアを達成している。

---

# 2. 新規性
タスクに依存したモデルではなく、複数タスクを一つのモデルで解きかつ従来の専用モデルよりも精度が高い点が新規性となっている。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/444fd0b2-5851-005e-4875-63f0b5d37f88.png)
事前学習として動画から2Dの人体のスケルトンを予測できるようにして置き、Motion Encorderでノイズを含む2Dのスケルトンから3Dの動作を復元できるように学習を行う。ここで獲得された動き情報の表現では、人間の動きに関する幾何学的・運動学的・物理学的な知識が暗黙的に学習され、これを複数のサブタスクに転移させることで、一つのモデルで複数のタスクを解くことに成功している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/330f1319-2ea5-0970-e851-b3a3a8713d52.png)
Motion EncorderはDual-stream Spatio-temporal Transformer(DSTformer)から構成されており、空間的に相関のある部位と時間的に相関のある部位を捉えることができ、骨格の関節間の時空間的な動作特徴を包括的にまた適応的にトラッキングすることができるようになっている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d5e5a539-5c0e-9825-a828-814712954561.png)
Human3.6Mデータセットで評価実験を行っており、従来手法を超える高精度な3Dポーズ予測を実現した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/59842a31-2bd2-38c0-892e-e4499f7cbbe0.png)
スケルトンを入力とした行動認識や3Dメッシュの再構成の精度についても、従来手法を上回る精度を達成している。

---

Paper URL: <https://openaccess.thecvf.com/content/ICCV2023/html/Zhu_MotionBERT_A_Unified_Perspective_on_Learning_Human_Motion_Representations_ICCV_2023_paper.html>

last updates: Nov 24 2023
Beyond Image Borders: Learning Feature Extrapolation for Unbounded Image Composition

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/6e21463f-447f-c9d0-0f02-0eaf5b93353d.png)
入力画像を適切にクロッピングして画像の美観を整える技術はよく用いられるが、画像の境界付近の冗長なコンテンスを削除する際に範囲に制限があった。また、別の従来手法では画像を外挿して拡張し、美観のよい位置でクロップする手法が主流だったが、拡張された部分が不自然なため画像のクオリティが下がるという問題があった。
この論文では、ユーザーがカメラを構えてシャッターを切った瞬間にフレームの外側の情報も一緒に保持しておき、最も美観のよい位置を探してユーザーにカメラをどの位置に向けるとよいか提示するシステムを提案している。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ae099924-8268-4189-a74f-692118605dba.png)
カメラのファインダーから見える景色の中で、どちら方向にカメラを向けるとよい美観の写真が取れるか、ユーザーに提示するシステムを提案している。カメラを移動後にどんな写真が取れるかも合わせて予測している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ae8e3219-f0ec-7fcd-f68a-d6a006e7fab6.png)
あるシーンの画像とその周辺領域を含む画像に対して、CNNで特徴を取得する。周辺情報を含む画像特徴は、クロップ領域とその周辺領域に特徴を分けることができる。クロップ領域の特徴に対してどの位置でクロッピングするとよいか計算させる際に、周辺領域の特徴量も考慮することで、デコード時にシームレスな外挿が実現できる。このとき、オリジナル画像に対して、カメラをどの方向に動かしたか、またズームイン・アウトなどの操作も併せて求められるため、推論時は美観のよい写真を撮れる位置にユーザーを誘導することができる。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/bad10c47-696f-054b-125a-3226189a4b35.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/688a2a54-4e0f-ed2d-81b1-deed197e201e.png)
従来手法と比べて外挿が自然で、かつ美観の整った写真を撮ることができている。

---

Paper URL: <https://openaccess.thecvf.com/content/ICCV2023/html/Liu_Beyond_Image_Borders_Learning_Feature_Extrapolation_for_Unbounded_Image_Composition_ICCV_2023_paper.html>

last updates: Nov 24 2023
Text2Room: Extracting Textured 3D Meshes from 2D Text-to-Image Models

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d2c0914b-f3ce-7dd6-9b49-08e9a994789b.png)
テキストプロンプトを入力としてお部屋のレイアウトを3Dメッシュでテクスチャまで生成する技術を提案している。事前学習としてテキストと画像をペアにしたモデルを採用しており、異なるカメラ視点からの見かけを合成して出力することで、3次元シーンの再構成を実現している。シームレスな3Dシーンを生成するために、単眼の深度推定と画像補完であるインペインティングを用いている。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c4286dcc-b2d9-3640-35dd-56b60b266537.png)
各生成画像のコンテンツをシームレスなテクスチャ入りの3Dメッシュに合成する際に、適切なカメラ視点の選択を行うことで自然な見かけを実現した。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/33b542b2-52a6-ca4f-f9b4-891bc7abb47c.png)
各カメラポーズに対して、インペインティングを用いて生成された画像のRGBとDepthの両方を補完する。Depth AlighnmentとMesh Filteringを行って次のメッシュをパッチ単位で取得し、生成済みのシーンと合成していく。これを繰り返すことで、任意視点からの見かけに対してシームレスにテクスチャが連続した3Dメッシュが構築できる。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/dc8a1c77-0c88-341f-9cf6-377a1bacf1c3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/10ff78ec-f493-6ed5-fddb-c92cb3c2c7f3.png)
テキストプロンプトから、部屋の詳細な家具やテクスチャ情報まで反映させて3次元シーンを構築できるようになった。

---

Paper URL: <https://openaccess.thecvf.com/content/ICCV2023/html/Hollein_Text2Room_Extracting_Textured_3D_Meshes_from_2D_Text-to-Image_Models_ICCV_2023_paper.html>

last updates: Nov 24 2023
Scalable Diffusion Models with Transformers

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a1bfe19d-0e8e-2be6-0cba-800c613e9b53.png)
トランスフォーマーを用いた拡散モデル(Diffusion Models with Transformers)の新しいアーキテクチャを提案している。通常はU-Netをバックボーンとして使用し潜在空間でパッチ毎にトランスフォーマーで演算をするが、この部分をシーケンスに変換するDiffution Transformers Block(DiT-block)を新たに提案しており、従来手法と比べて潜在空間上で高い表現力を獲得できるようにした。ImageNet512/256のベンチマークで従来の拡散モデルよりも高精度な2.27のFIDを達成している。

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f79d5f62-965d-a37f-260a-419365dc4991.png)
Diffusion Transformers(DiT, 拡散トランスフォーマー)を提案しており、通常IxIxCで構成されるパッチをT=(I/p)^2の長さのシーケンスにシェイプ変換するDiT Blockを挿入することで、小さなパッチであっても長いシーケンスを構築することができ表現力を増す効果がある。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/dc7dfcf1-5950-8390-3790-aa6b9e85eab0.png)
入力の潜在表現はパッチに分解されていくつかのDiT-Blockで処理される。各Dit-Blockでは、制約条件をMLPで特徴抽出し、その特徴をレイヤーごとに挿入する適応的レイヤーノルムのアプローチが、クロスアテンションや追加のトークンを介した手法よりも精度が高かったため、これを採用している。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b325e9fa-10a7-3a2c-1314-92a1006beba1.png)
円の大きさは拡散モデルのflopsを表している。左図は円が小さいほど精度が高いことを示す。モデルのGflopsが増加するほど性能は安定していくことが分かった。
また、右図では提案手法が従来のU-Netベースの拡散モデル(ADM/LDM)と比べて計算効率が高く高精度であることを示している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2742309d-7ed3-7b59-1d4b-cbe0f7268217.png)
トランスフォーマーの深さ/幅を増やしてモデルのGflopsを増やすことで、パッチサイズが小さくなりトークンのDit-Blockで長さが長くなるため内部表現力が増し、視覚的な精度が急激に向上することが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/92fc5f22-3e08-ee6c-93c5-02a3ef212b0a.png)
左図はGflopsとFIDの関係性を示しており、強い正の相関がみられる。右図はDiTのモデルが大きくなると計算効率が向上していくことを示している。

---

Paper URL: <https://openaccess.thecvf.com/content/ICCV2023/html/Peebles_Scalable_Diffusion_Models_with_Transformers_ICCV_2023_paper.html>

last updates: Nov 24 2023
NEUTRINOのNSFでGPUを使うモードで出力するとメモリ不足になる事象の対処方法

## はじめに
私は作曲が趣味で、音声合成技術を使った歌を作る、いわゆるボカロPなんかもやっています。近年ではフリーの音声合成エンジンも出ていて、中でもAIの技術を用いたNEUTRINOは調声なしでいい歌い方をしてくれて、なおかつGPUを用いた高速な出力にも対応しているので重宝しています。
本記事はNEUTRINOを使った時のトラブルシューティングについて記載しています。

## エラー内容
私の制作環境ではグラフィックカードNVIDIA GeForce RTX 3070搭載です。VRAMは8GBなので、推奨環境の6GBを超えています。それにも関わらず、GPUを用いて出力しようとすると、NSFで以下のエラーが発生します。
```
2023-02-13 20:12:28.1606929 [E:onnxruntime:, sequential_executor.cc:369
onnxruntime::SequentialExecutor::Execute] Non-zero status code returned while running Pad node. 
Name:'Pad_1108' Status Message: D:\a\_work\1\s\onnxruntime\core\framework\bfc_arena.cc:342 
onnxruntime::BFCArena::AllocateRawInternal 
Failed to allocate memory for requested buffer of size 885197568
```
バッファのためのメモリを確保できないと言っています。CPUのみでの出力だとエラーが出ずに回避はできますが、せっかく割といいGPUを搭載しているマシンですので、何とかしたいところです。

## 原因
NEUTRINOのNSFでは、GPUを用いた場合のVRAMの使用量は楽譜中のフレーズの長さによって決まります。フレーズは休符またはブレス記号で囲まれた区間となります。このフレーズが長すぎる場合、メモリ不足が起きます。そういえば、楽譜作成ソフトで楽譜を見た時、休符もブレスもなくて、休みの無い歌わせ方をしていました。

## 対処方法
楽譜作成ソフトで休符またはブレス記号を入れます。休符だと、歌のメロディを変える必要が出てくるので、例ではメロディに影響がないブレス記号を入れました。ちなみに、このブレス記号を入れると、息つぎしている音もリアルに入ってきます。
例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676555/1eca1918-6970-5cc5-6b39-19ce123ae941.png)

楽譜作成ソフトは、配布元が推奨しているMuseScoreを使っています。ブレス記号の入れ方ですが、画面左側上の方の、ブレスと休止を開いて、カンマをドラッグ＆ドロップすることで入れることができます。画面右側、楽譜の赤枠で囲っているところが実際にブレス記号を入れた個所になります。試行錯誤は必要ですが、こうしてブレス記号で区切ることによって、NSFでエラーが出なくなりました。

## おわりに
NEUTRINOは本当に強力なソフトウェアですので、どんどん広まっていってほしいです。もし同じ事象で悩んでいる人がいたら、この記事で解決できることを願っています。
Uncertainty-aware Unsupervised Multi-Object Tracking

# 1. 概要
複数物体のトラッキングを行う際に、教師データとしてBounding Boxの矩形情報だけを使って、個別のIDを予測しトラッキングを実現する研究。従来手法では、矩形情報に加えて個別のID番号をペアで学習に用いることが多かったが、アノテーションコストがかさみデータ構築が大変だった。矩形情報だけからトラッキングできるようになったことで、高精度な物体検出器と組み合わせることで、アノテーション不要で自動の物体検出とトラッキングができる。この研究では、特に物体の見え方がフレーム毎に異なる不確実性を考慮している。


---

# 2. 新規性
教師なしで複数物体のトラッキングを行う手法を提案している。教師なし学習では不確実性(Uncertainty)が避けられないが、提案手法では、1)学習された不正確な関連付けを認識するアルゴリズム、2)適切なデータオーギュメンテーションの自動生成、をそれぞれ提案している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/8e013e59-2875-af48-461b-594fa3044466.png)
フレーム間の物体それぞれについてどれが同一の物体か関連性を求め、不確実なペアを計算する。次に、不確実性の残る関連性を持つペアを修正し、フレーム間で修正されたラベル情報を伝播させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/743ac29f-5ec3-ff8c-0267-31a40ffe3e9a.png)
不確実性の高い物体とその特徴量に対して、頑健性を向上させるようにオーギュメンテーションを行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9c0fb7cf-a2f5-76be-d67c-94ed84486f68.png)
オーギュメンテーションされた特徴と修正されたペア情報をContrastive Learning(対照学習)を用いて分類する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a5005ca5-c283-22bd-9642-630a7682bb51.png)
MOT17の学習データセットで検証してみると、67%不確実なペアが”不確かな”領域に分類され、99%の正しいペアの関連付けが”確かな”領域に分類されている。また、従来手法ではトラッキングの時間が増えると急激に精度が劣化していたが、提案手法は一貫して高い精度を保てていることが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/fb9eca07-65ad-ee1f-d626-fd79022c0f18.png)
従来手法と比較してもトラッキング性能が向上していることが分かる。

---

Paper URL: <https://openaccess.thecvf.com/content/ICCV2023/html/Liu_Uncertainty-aware_Unsupervised_Multi-Object_Tracking_ICCV_2023_paper.html>

last updates: Nov 24 2023
Robust Frame-to-Frame Camera Rotation Estimation in Crowded Scenes

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/93792c96-77c5-3915-c6c9-70837d498e21.png)
2枚の連続した画像から、カメラがどのように傾いたかを予測できるモデルを提案している。単眼カメラを用いたカメラ回転の推定方法はこれまでにもよく研究されてきたが、高速に高精度な予測ができる手法は実現が難しかった。提案手法では、ハフ変換(Hough Transform)をSO(3)(3次元の特殊直行群：Special Orthogonal Group)で一般化させることで、カメラ回転の推定を実現している。また、BUsy Street Scenes Dataset (BUSS)という17の動画シーケンスから成る新たなデータセットを公開しており、高精度なベンチマークが可能となっている。
*SO(3): 特殊直行群は行列が直行行列かつ行列式が1であるような行列の集合を指し、SO(3)では3次元空間における回転操作を表現するための群を指す。

---

# 2. 新規性
SO(3)上でのHough変換の効率的かつ頑健な一般化を導入し、光学フローと最も互換性のあるカメラ回転を効率的に発見できるアルゴリズムを提案している。Hough変換は直線や円などの幾何学的な形状を検出するための方法で、SO(3)上でのHough変換は3次元空間における回転の検出に用いられている。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5cf91145-a850-083f-979a-90faa25fc6a9.png)
動き場を示すオプティカルフローは2次元ベクトルで表現されるが、3次元の回転は3次元表現となるため、光学的なオプティカルフローによって推定された回転が複数の可能性を持っており、1次元の空間上で表現される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/7355e000-0d7d-8a8d-9195-f3d37e3060f0.png)
これを一般化させると、遠くの物体は見かけ上の動きが小さく表現されるため主にカメラの回転によってオプティカルフローが生成されると考えることができる。一方、動いている近くの物体のオプティカルフローは、カメラの回転による影響よりも動き情報が大きいことが多いため一貫した回転を示さないことが多い。SO(3)上のハフ変換を求めることで、遠方物体の回転方向を予測することができ、これがカメラ自身の回転とみなせるため、高速かつ高精度にカメラ回転を予測することができる。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/8bae0797-dace-d6c7-cf52-1612153490ea.png)
BUsy Street Scenes Dataset (BUSS)を公開しており、約10秒間の30fpsで撮影されたフルHD解像度(1920x1080)で構成された17の動画から成る。いずれの動画も手持ちのスマートフォンで撮影されており、混雑した市街地で撮影され、ジャイロスコープによる実際の回転情報が同期して公開されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/1c3928f6-640b-6c72-bf69-abb175fda7c7.png)
提案手法は、従来手法よりも高速かつ少ないエラーでカメラ回転を予測できている。同じ速度では、従来手法より50%も精度が向上している。

---

Paper URL: <https://openaccess.thecvf.com/content/ICCV2023/html/Delattre_Robust_Frame-to-Frame_Camera_Rotation_Estimation_in_Crowded_Scenes_ICCV_2023_paper.html>

last updates: Nov 24 2023
Steered Diffusion: A Generalized Framework for Plug-and-Play Conditional Image Synthesis

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d7fae815-9389-39b8-c4d7-0b1196c0f445.png)
テキストによる画像生成や編集では、制約を与える条件付きモデルがよく用いられる(Conditional Generative Models)。一方、高品質な生成結果を得ようとすると大規模なアノテーション付きのデータセットが必要となってしまう。そこで、この研究では追加の学習を一切必要としないゼロショットの条件付き画像生成モデルを提案している。一般的によく使う画像生成モデルに組み込むことができ、特定のタスクに特化した学習を一切必要としないため、アーキテクチャに対する依存性が無く使い勝手がよい。

---

# 2. 新規性
特定のタスクに特化した学習を必要としないSteered Diffusionを提案している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/81d1a2aa-dd38-9b57-fd7b-558af20a149e.png)
Diffusion ModelをFreezingした状態で特徴量抽出器のように用いる。各サンプリングステップtでは、学習データを用いた明示的なモデリングではなく、暗黙的な特徴を学習できるようにしている(Implicit Learning)。これにより、ノイズの少ない画像のおおよその推定結果(Implicit Prediction)を予測できるようにしている。さらに、その結果を提案手法であるImplicit Steering Control(ISC)アルゴリズムを用いて制約条件を付与していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/700c2cd3-dd95-fd6f-ebba-0d08294422d6.png)
制約条件を与えると、出力結果の画像空間から条件下の空間へ逆マッピングが必要となる。提案手法ではノイズの少ないImplicit Predictionの予測結果を用いて事前学習済みの凍結したネットワークを用いて条件下の画像空間へ逆マッピングを行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f232b1ba-7c03-2b69-00d7-a55b894cbe55.png)
インペインティングや超解像の場合、線形逆問題(Linear Inverse Problems)を用いて、既知の線形劣化関数D(x)を用いて画像を劣化させ、その部分を条件cで置き換えてサンプリングプロセスを進める。
制約条件を考慮したノイズの少ない画像(Steered Implicit Prediction)は、次のステップのサンプリングに使用されより高品質な画像にアップデートされていく。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/76b8f08b-708f-c52a-32bf-1179db3447a4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f1267455-d4de-557b-39f3-41f9b8cc2e00.png)
超解像(Super-Reslution)やセグメンテーション画像を実写に復元するSemantic Generation、欠損した画像を補完するImage Painting、テキストによる画像編集など、様々なタスクを追加学習なしで高品質に実現できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/035fa5e8-18fc-34b8-65c4-3e892c0e2e94.png)
定量評価の結果も、提案手法は従来手法と比べて高品質な画像編集ができていることが分かる。

---

Paper URL: <https://openaccess.thecvf.com/content/ICCV2023/html/Nair_Steered_Diffusion_A_Generalized_Framework_for_Plug-and-Play_Conditional_Image_Synthesis_ICCV_2023_paper.html>

last updates: Nov 24 2023
WSLのApacheからDockerで建てたデータベースに接続したい

# WSLのApacheからDockerで建てたデータベースに接続したい
解決したらすぐ記事書く、これ大事

## やったこと

- WSLでapacheを入れて鯖を立てる
```bash
sudo apt install apache2
```
みたいな感じですぐ立つ
- MYSQLのコンテナ持ってきて起動する
```bash
git clone https://example.com
```
好きなもの持ってこよう
公式のやつがあればそれでいいんじゃないかな
自分は友人の作ったものを持ってきた

- webページを作ってDBとつなげようとする
今回はphpのmysqli_connect関数を使用することにした。
[公式の関数リファレンス](https://www.php.net/manual/ja/mysqli.construct.php)

```php3
$db_host = "localhost";
$db_user = "root";
$db_pass = "rootpass";
$db_name = "db_name";

$connect = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
```

しかし、どうしてもDBへの接続ができていないようだった
DBの名前が違うか？、user名違うか？、そもそもPHPにmysqlのモジュールが入ってないか？とか考えてた

## 解決
```php3
$db_host = "localhost:コンテナのport番号";
$db_user = "root";
$db_pass = "rootpass";
$db_name = "db_name";

$connect = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
```
接続する際にポート番号の指定をしていなかったことが原因
色々な記事を見ると``$host = "localhost"``だったのでじゃあそれでいいんだと思っていたが違った
他の記事とは環境が違うことを考慮すべきだった
当然ながらdockerコンテナのport番号がデフォルト設定``localhost(:3306)``ではない場合
起動する際にport番号をデフォルトに変更するか、上記のようにこっちからport指定する必要がある。
ほかは大体Dockerで完結させているでわからなかった。

### なぜこんなことやったか
DockerもLinuxもなにもわからないときに
「Apache入れるだけでサーバー立てられるの神じゃん…これ使おう」
となってほかの情報を仕入れようとしなかったからです
友人のcomposeにはApacheとPHPの入ったサーバーコンテナもあったのに

## 結論 : 面倒くさいことしないで全部Dockerで完結させろ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/0f1f3978-bb13-ded8-2281-6166273a84ad.png)
データベースくん、迫真のポート主張
【Databricks SDK for Python】アカウントコンソール上の操作をコード化する

# はじめに
Databricks のアカウントコンソールでは、Databricks アカウント最上位の権限を持つアカウント管理者のみが、UnityCatalog 関連の設定や、ユーザー・グループ・ワークスペース管理などを行うことができます。

しかし、基本的にはコンソール上の操作となるため、追加するユーザーやグループの作成する量が多いと工数が肥大化することが懸念されます。

上記の解決策のひとつとして、Databricks SDK for Python を使用することです。
Databricks は細かな操作含めて様々な API をサポートしており、こちらのSDKを使用すればそれらを Python で実行することができます。

 Databricks CLI や REST API 経由で実施することなく、Databricks のノートブック上でアカウントコンソール上の操作が簡単に実行できるため今回一部紹介します。
 
# 前提条件
1. 本記事では Databricks on AWS 上の環境で実施しています。
1. Databricks Runtime Version は 13.3 LTS です。
1. アカウント管理者の権限を持つユーザー情報が必要です。

# 初期設定
まずノートブックを開いて、パッケージをインストールします。
```python
%pip install databricks-sdk --upgrade
dbutils.library.restartPython()
```
次にアカウントコンソール操作を行うため、アカウント管理者ユーザーで認証します。
```python
from databricks.sdk import AccountClient, WorkspaceClient
from databricks.sdk.service import iam

a = AccountClient(
  host = "https://accounts.cloud.databricks.com",
  account_id = "<アカウントID>",
  username   = "<アカウント管理者のメールアドレス>",
  password   = "<アカウント管理者のパスワード>"
)
```
今回は検証用のため、認証方法は基本認証を採用しております。
運用環境では推奨されていないので、以下あたりのドキュメントを参考にそれぞれにあった認証を行ってください。
参考: https://docs.databricks.com/en/dev-tools/auth/index.html#supported-authentication-types-by-databricks-tool-or-sdk

# アカウントコンソール操作例
## グループを作成する
```python
a.groups.create(display_name="<グループ名>")
```
## グループにユーザーを追加する
### 方法1(追加)
```python
a.groups.patch(id=<グループのID>, operations=[iam.Patch(op=iam.PatchOp.ADD, value={"members": [{"value":"<ユーザーのID>"}]})])
```
### 方法2(上書き)
```python
a.groups.update(id=<グループのID>, members=[iam.ComplexValue(value="<ユーザーのID>")])
```
## ワークスペースへグループを追加する(追加するグループはUser権限)
```python
a.workspace_assignment.update(permissions = [iam.WorkspacePermission.USER], workspace_id=<ワークスペースのID>, principal_id=<グループのID>)
```
# 最後に
アカウントコンソール操作に関わらず他にも色々な操作ができるので、以下ドキュメントを参考に試していただければと思います。

# 参考
[Python 用 Databricks SDK](https://docs.databricks.com/en/dev-tools/sdk-python.html)
[Databricks アカウント API リファレンス](https://databricks-sdk-py.readthedocs.io/en/latest/clients.html#databricks.sdk.AccountClient)
[gitコード例](https://github.com/databricks/databricks-sdk-py/tree/main/examples)
AWS Glue

## はじめに
この記事はAWS MLS試験勉強のための、AWS Glueに関する知識のまとめです。


## AWS Glueとは

AWS Glueは、データ分析前のデータ整備に向けてデータの検出、準備、結合を行う**サーバーレス**なETL（Extract, Transform, Load）サービスです。データレイクやデータウェアハウスの構築・保守を効率化することができ、機械学習パイプラインの**前処理ステップ**としても活用されます。

- クローラーにより自動的にデータのスキーマを読み取り、Data Catalog（メタデータ辞書）を作成
- Amazon Athena や Redshift Spectrum からそのCatalogを参照してSQLクエリ実行が可能
- JSONやCSVなどの構造化／半構造化データを処理し、Parquet等の最適形式に変換
- SageMakerによるモデル学習前の整形にも利用可

> **MLS試験対策ポイント**：Athenaとの連携、Data Catalogの役割、ETLワークフローにおけるGlueの位置づけは重要。

---

## ジョブのブックマーク

Glueでは、ジョブ実行時の**状態を記録**し、再実行時に前回処理済みのデータをスキップする機能「**ジョブのブックマーク**」が利用可能です。

- 継続的なETL（バッチ処理や定期更新）において**増分処理**を実現
- `--job-bookmark-option` で `job-bookmark-enable` や `job-bookmark-disable` を指定可能

> **MLS視点**：データの重複処理を防ぐ＝コスト最適化・信頼性向上に直結。

---

## AWS Glue DataBrew

ノーコードでデータのクレンジング・変換・前処理ができるビジュアルツールです。エンジニアだけでなく、データアナリストや非プログラマでも扱えるように設計されています。

---

## AWS Glue Sensitive Data Detection

AWS Glueは、ETLパイプライン内で**個人情報（PII）や機密データを検出**する機能を内包しています。

- Glue StudioでUIベースで設定可能
- 名前、電話番号、メールアドレス、住所などを検出し、マスキング処理や新しいカラムへのコピーが可能
- **リアルタイムETL中に処理できる**のが特長

### Macieとの違い（2025年4月時点）

| 比較項目 | Glue Sensitive Data Detection | Amazon Macie |
|--|--|--|
| 主な対象 | Glueジョブ中のデータ | S3バケット内の静的データ |
| 処理タイミング | ETL中のリアルタイム処理 | 定期的バッチスキャン |
| 処理内容 | 検出後に即座にマスキングや除外処理 | ダッシュボード通知、SNS連携 |
| カスタム識別子 | 正規表現や条件を指定可 | カスタムデータ識別子の作成可 |

### DynamoDBのトランザクション機能との違い

- GlueのSensitive Detectionは**検出のみ**。削除やロールバック処理はできません。
- DynamoDBのトランザクションは、**整合性の保証された更新／削除**が可能で、特に**アプリケーション側の制御**に強い。

---

## AWS Glue JDBC接続

AWS Glueは、以下のようなJDBC互換のデータベースと直接接続し、抽出・変換処理が可能です：

- Amazon RDS（MySQL, PostgreSQL, MariaDB）
- Amazon Redshift
- Oracle, SQL Server（要VPC設定とIAM認可）

**Glue Connection**を定義し、クローラーやジョブで利用する形で接続します。

> **実務TIPS**：接続エラーが出る場合、セキュリティグループやVPCルートテーブル、GlueのIAMロール設定を再確認すること。

---

## スクリプトの記述（実践例：PySpark）

Glueジョブのスクリプトは**Python（PySpark）**や**Scala**で記述されます。以下はCSV→大文字変換→S3出力の簡単な例です：

```python
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.dynamicframe import DynamicFrame
from pyspark.sql.functions import upper

args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# 入力S3と出力S3
input_path = "s3://your-input-bucket/your-input-key"
output_path = "s3://your-output-bucket/your-output-key"

# Data Catalogから読み込み
datasource = glueContext.create_dynamic_frame.from_catalog(
    database="your-database",
    table_name="your-table",
    transformation_ctx="datasource"
)

# Spark DataFrameに変換し、'name'列を大文字化
df = datasource.toDF()
df_transformed = df.withColumn('name_uppercase', upper(df['name']))

# 再度DynamicFrameに変換
transformed = DynamicFrame.fromDF(df_transformed, glueContext, "transformed")

# S3へCSV出力
glueContext.write_dynamic_frame.from_options(
    frame=transformed,
    connection_type="s3",
    connection_options={"path": output_path},
    format="csv"
)

# ジョブ完了通知
job = glueContext.create_job(args['JOB_NAME'])
job.commit()
```
Next.jsをFirebaseにデプロイしたらApplication error: a client-side exception has occurredエラーが出る

# はじめに

Next.jsをFirebaseにデプロイしたらうまくアクセスができなかったのでまとめます

# 問題

Firebaseにデプロイして、とあるページにアクセスするとエラーが表示されるようになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/77e2aeb7-374e-4d0d-ea6b-10906d3181f3.png)


# 解決方法

SSRのサーバー側の読み取り権限がないのが問題でした

GCPでCloudRunを開いて該当のSSRを探します。
セキュリティから**未認証の呼び出しを許可**にすることでとりあえず回避しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/ca2e061b-f66a-14a8-c480-0ce7b9a17e4e.png)

# おわりに

あとでただしくせっていはしたいで
【ChatGPT有＋DALL-E3】で作成した画像をJPEGで保存する方法。


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

　今回は、DALL-E3で描いた画像をJPEGフォーマットで保存する方法です。

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

　今回は、
　　DALL-E3で描いた画像を
　　　JPEGフォーマットで
　　　　保存する方法です。

　画像は
　　セッションとしては
　　　残っていますが、
　　　　ダウンロードしなければ、
　　　　　ほかへと出せません。

　もちろん、
　　ChatGPTさんにも
　　　ダウンロード機能は
　　　　ありますよね。

　このダウンロードでは
　　画像をPNGフォーマットで
　　　保存します。

　普段使いならば
　　構わないのですが、
　　　SNS等にアップロードするには
　　　　ファイルサイズが大きく、
　　　　　枚数を考えると、
　　　　　　考えものです。

　特にQiitaでのアップロードは
　　制限が掛かり、
　　　記事作成で
　　　　つまづくことにも
　　　　　なります。

　そこで、
　　別のフォーマットに変換して、
　　　ダウンロードすれば、
　　　　サイズダウンができます。

　本来ならば、
　　スマホでの操作をしていますから
　　　専用のアプリを
　　　　ダウンロードすれば
　　　　　なんの問題もありません。

　ですが、
　　画像をダウンロードしなければ、
　　　アプリに渡せません。

　それならば、
　　画像を別のフォーマットにして
　　　ダウンロードすれば、
　　　　手間が減ります。

　そこで
　　今回のやり取りになりました。
　　　画像添付できません(汗)
***
***User***
ラブラドールレトリバーの鼻先に止まるアゲハを描いてください。ラブラドールレトリバーはアゲハを見るので、寄り目になっています。

***ChatGPT***
（画像）
こちらがラブラドールレトリバーの鼻先に止まったアゲハの絵です。ラブラドールはアゲハをじっと見つめています。

***User***（ここが肝）
この画像で、JPEGファイルを作成してください。

***ChatGPT***
JPEGファイルの作成が完了しました。以下のリンクからダウンロードできます。

ラブラドールレトリバーとアゲハのJPEG画像 （←リンク）​
***
　以上になります。

　簡単ですね(=^･^=)

　ちなみに、
　　このダウンロードのリンクは
　　　保存期間があるらしく
　　　　それを過ぎると、
　　　　　リンクが切れます。

　まぁ、
　　それは
　　　“サーバーを圧迫するから”と
　　　　考えれば、
　　　　　わかるでしょう。

　ちなみに、
　　上記の画像は、
　　　通常の場合だと、1.4MB
　　　今回の場合だと、89KB
　　　　でした。

　桁というより、
　　単位が違うwww

　それなのに
　　それほどの
　　　劣化は見られません。

　これならば、
　　SNSにアップしても
　　　苦にならないレベルでしょう。

　仕掛けは、
　　CodeInterpreterです。

　内部で、
　　Pythonコードを書いて、
　　　実行したわけですね(=^･^=)
***
　どうでしたか？

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

　今回は、ここまで。
ゼロつくDeepLearning_cp3

# はじめに

「[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)」についてのまとめを数回に分けて行いたいと思います。

こちらは[2章 パーセプトロン](https://qiita.com/ponponnsan/items/2c935ce480d3a4ec56c9)の記事の続きです。まだ読まれていない方は読んでもらった方が理解が深まるかと思います。

YOUTUBEでのおすすめチャンネルは以下の通り
- [ヨビノリ](https://www.youtube.com/@yobinori)
- [AIcia Solid Project](https://www.youtube.com/@AIcia_Solid)

# 何をまとめるのか
さて、このまとめではpythonのコードを動かしたり、何か実装するということは行いません。

ちなみに、書籍のソースコードは[こちら](https://github.com/oreilly-japan/deep-learning-from-scratch)にまとめられています。

なので1章はとばし、2章からのスタートになります。

今回は**3章**をまとめます。

また、個人的に重要だと思うポイントを記載したいと思います。

## 3章　ニューラルネットワーク

ニューラルネットワークは、適切な重みをデータから自動で学習できるというのがニューラルネットワークの重要な性質の一つです。

ニューラルネットワークは以下のようになっています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/a3b54ed0-a5e6-03d7-4d11-0201f0d1710f.jpeg" width="300">

一番左を「入力層」、真ん中を「中間層」または「隠れ層」、一番右の列を「出力層」と言います。

このネットワークのことを本では、「2層ネットワーク」と呼んでいます。実際に重みを持つ層の数を数えているみたいです。別の本ではネットワークを構成する層に従って「3層ネットワーク」と呼ぶ場合があります。


ニューラルネットワークの中間層の処理を詳しく見てみましょう。図は以下の通りになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/3eef3f26-da1f-9d40-f928-c9c04be6cb1a.jpeg" width="300">




ニューラルネットワークの中間層は、前の層の入力に重みをかけ、バイアスを足した総和(a)をそのまま次層のノードに渡すのではありません。

前の層の入力に重みをかけ、バイアスを足した総和(a)を**活性化関数 (h())** によって変換し、yを出しています。そして次層のノードに渡します。


## 活性化関数

活性化関数が備えている性質は主に2つあります。

1つ目は**ある値より小さいと無視して、ある値より大きかったら次に伝える**という点です。

2つ目は**微分可能である**ということです。

上記の条件を満たす3つの活性化関数を紹介します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/2c1af5d6-a32c-98e9-11bc-ce2722e09521.jpeg" width="600">

### シグモイド関数
- eはネイピア数の2.7182...の実数を表す
- 0から1までの範囲で入力層から受けとった値を表現できる(確率みたいに表せる)
- 重要でない値は小さく、重要な値は大きく表せる
- 非線形なので、微分可能

### ハイパボリックタンジェント
- eはネイピア数の2.7182...の実数を表す
- -1から1までの範囲で入力層から受けとった値を表現できる
- 重要でない値はより小さく、重要な値は大きく表せる
- 非線形なので、微分可能

### RELU関数
- 入力が0を超えていればその入力をそのまま出力し、0以下ならば0を出力する
- 重要でない値は0で、重要な値はより大きく表せる
- 本当はu=0の時は微分できないが、通例では微分すると1となるとみなして微分可能としている。

## 行列の積
行列の積の方法は以下の図のようになります。
行列の積により、数字が大きい同士の積の結果は大きく表すことができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/eb4b7c17-fa83-34b2-95bc-277cd84ef9a9.jpeg" width="600">

また、行列でニューラルネットワークの重みを表すことで、数式を簡略化できるのも嬉しいところです。
(以下の図の数式ではバイアスは省略しています)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/9e8fb3c5-e430-88ad-0223-f800f32d7be1.jpeg" width="600">


## 実際の処理の際に気を付けること
入力は、1つずつではなく「まとまりのあるデータ」にする場合が多いです。
この「まとまりのあるデータ」を**バッチ**と言います。
バッチ処理には、コンピューターにとっても嬉しく、1枚あたりの処理時間を大幅に短縮できるメリットがあります。

また、データ転送がボトルネックになる場合は、バッチ処理を行うことで[バス帯域](https://jp.fujitsu.com/family/familyroom/syuppan/family/webs/serial-comp2/pdf/comp04.pdf)の負荷を低減することができます。
つまり、大きな配列を一度に計算してしまった方が、早く処理が完了します。
SwiftUIのTextFieldの高さを調整する方法: フォントサイズによるアプローチ

SwiftUIでユーザーインターフェースを設計する際、`TextField` の視覚的な高さを調整することが時には必要になります。しかし、`TextField` の高さを直接調整することはできません。この記事では、`TextField` の高さを変更する一つの効果的な方法として、フォントサイズを利用するアプローチについて解説します。

### `TextField` の高さの問題

SwiftUIの`TextField`は、デフォルトでその内容に合わせてサイズが決定されます。多くの場合、これは便利ですが、時には特定のデザインニーズに合わせて、より高い`TextField`を必要とすることがあります。しかし、`.frame(height:)` メソッドを用いても、`TextField` の高さは変更されません。これは、`TextField` が内部的にコンテンツ（特にテキスト）のサイズに基づいて高さを自動調整するためです。

### フォントサイズを使用した解決策

`TextField`の高さを効果的に調整する方法の一つは、フォントサイズを変更することです。`TextField`内のテキストのフォントサイズを大きくすると、自動的に`TextField`全体の高さも増加します。これは、`TextField`が含むテキストのサイズに基づいて高さが設定されるためです。

以下は、このアプローチを使用したコードの例です:

```swift
TextField("Your Text Here", text: $yourText)
    .font(.system(size: 20)) // フォントサイズを増やす
```

このコードでは、`TextField`のフォントサイズを20ポイントに設定しています。この変更により、`TextField`の高さが自然に増加し、より大きなテキスト入力エリアをユーザーに提供します。

### まとめ

`TextField`の高さを調整するために、`.frame(height:)` メソッドを使用するのではなく、フォントサイズを調整する方法が効果的です。これにより、テキストフィールド内のテキストが大きく表示され、結果として全体の高さが増加します。この方法は、特にユーザーインターフェースでより目立つテキスト入力フィールドが必要な場合に有効です。

SwiftUIでは、UIコンポーネントのサイズと外観を調整する多くの方法がありますが、`TextField` の高さの調整に関しては、フォントサイズの変更が直接的でシンプルな解決策となります。この方法を用いることで、デザインの要求に応じたより柔軟なUIを実現できるでしょう。

---
個人でアプリを開発しています。ベビーカーや車椅子利用の方に便利な、駅のエレベーター出入口を探せるアプリを開発しました。ぜひご利用ください。

https://apps.apple.com/jp/app/%E9%A7%85%E3%81%AE%E3%82%A8%E3%83%AC%E3%83%99%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97/id6472233345
【TypeScript】await pageで行える基本操作について

# 目的

Playwrightの学習中に学んだことを備忘録として残しておきます。
基本的な用法を理解することと、書く順番を意識すること。

#### ページの移動と待機
```typescript
await page.goto('https://example.com')
await page.waitForLoadState('load')
```
入力したURLに移動してページが読み込まれるのを待ちます。

#### 要素の取得とクリック
```typescript
const button = await page.waitForSelector('button')
await button.click()
```
waitForSelector()を使用して要素を取得してから、click()を使用して要素を表示させます。

#### テキストの入力
```typescript
await page.type('input[name="username"]', 'exampleUser')
```
入力エリアに指定したテキストを入力します。

#### テキストの取得
```typescript
const pageTitle = await page.title()
console.log('Page title:', pageTitle)
```
ページのタイトルの取得に使用します。

#### スクリーンショットの作成
```typescript
await page.screenshot({ path: 'screenshot.png' })
```
スクリーンショットの作成と保存場所の設定ができます。
Playwrightには録画機能もあります。

#### 特定の要素の待機
```typescript
await page.waitForSelector('.some-element', { timeout: 5000 })
```
waitForSelectorに詳細なオプションを指定することもできます。
学習中に発生したエラーでオプションの設定方法を学んだ。。

# 感想
基本的な用法だけをまとめています。
書いてみることでそれぞれの用法を整理できた気がします。
ゼロつくDeepLearning_cp2

# はじめに

こんにちは。お久しぶりです。
私ごとですが転職しましたponponnsanです。

現在この記事を書いている時点では6日目なのですが、楽しくやらせていただいています。

なんせ自社開発である点がとても嬉しいです。守られている感じかします。

さて、今回は研修の課題図書でもある

[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)についてのまとめを数回に分けて行いたいと思います。

実はこの本に出会ってからは2年ほど経ちますが、読んだことはないんですね。オライリーの本難しいと思って敬遠していた節があります。

代わりにYOUTUBEで当時は学習していました。

「[ヨビノリ](https://www.youtube.com/@yobinori)」や「[AIcia Solid Project](https://www.youtube.com/@AIcia_Solid)」は　わかりやすく説明してくださるのでとてもおすすめです。

# 何をまとめるのか
さて、このまとめではpythonのコードを動かしたり、何か実装するということは行いません。

ちなみに、書籍のソースコードは[こちら](https://github.com/oreilly-japan/deep-learning-from-scratch)にまとめられています。

なので1章はとばし、2章からのスタートになります。

また、個人的に重要だと思うポイントを記載したいと思います。

## 2章　パーセプトロン
パーセプトロンとは、複数の信号を入力として受け取り、一つの信号を受信します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/9d5395a9-e75d-820d-6854-0ee082171583.jpeg" width="400">



図の⚪︎はニューロンやノードと呼ばれます。

パーセプトロンは複数ある入力信号のそれぞれに固有の重み(w1,w2)を持ち、その重みが起きければ大きいほど重みに対応する信号の重要性が高くなります。

それぞれの入力と重みを掛け、全てを合計します。この合計が閾値を超えた場合、「1」という信号を発します。「ニューロンの発火」と呼ばれることもあります。

上記を数式で表すと以下のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/46798b63-8add-a0d6-b702-56993287bd9e.png" width="400">



## 単純パーセプトロン
上記の数式により、

パーセプトロンでは、ANDゲートやNANDゲート、ORゲートが表現可能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/e2ddc878-0968-9f9b-bcd3-1370486c2144.jpeg" width="400">


実際のパーセプトロンでは、上記の数式にバイアス\(b\)がつくので、以下のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/ac966510-30fe-820f-fced-745024aa348c.png" width="400">



## 多層パーセプトロン
では、XORゲートはどうでしょうか？
実は、XORゲートはANDゲートのように単純に表せません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/84b58cab-35d8-a5b8-c9a0-85c5c6a529ca.jpeg" width="200">


そこで、パーセプトロンの層を増やすことを考えます。
以下の例では、第一層目でNANDとORを、第二層目でANDゲートを組み合わせ、XORゲートを表現しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/5098aeb8-1d3f-f72a-fb10-4033f89e326d.jpeg" width="400">


層を増やすことにより、XORゲートを表現できるとわかりました。
パーセプトロンは、層を重ねることで、非線形のようなより柔軟な表現が可能になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/6fcb59fe-3f37-549e-5832-44d3a6a0457f.jpeg" width="400">