OmniAICreator/Qiita-1.07M huggingface dataset:
テキストエディタvi/vimを始めよう!

vi/vimはCUI用のエディタ。設定ファイルを編集するコマンドとして割り当てられていることがある。
viはCUI用なのですべてキーボードで特殊キー（矢印キー）を使わずアルファベットや記号だけで操作できる。（昨今矢印キーが使えるvimコマンドがつかわれることも）
ubuntuではviでvimが実行されるように設定されている。この状態だと入力中に矢印キーが使えないことがあるため、~/.vimrcにset nocompatlbleを追加

- モードの切り替え -
`ノーマルモード`：キーボードから入力はカーソルの移動や検索をするためのコマンドとして扱われる。
`挿入モード`：キーボードから`i`と入力することで。そこからキーボードからの文字入力の状態になる。`esc`でノーマルモードにする。

- ノーマルモードで`:`でプロンプトが表示され、
`w`：保存
`q`：viを終了
`q!`：編集したファイルを保存せずに終了する


`view`：ファイルを見る　`vim <ファイル名>`：vimモードでファイルを開く。



- ファイルを開いたら、
`i`：挿入モード　`a`：次の文字から挿入モード
`esc`：ノーマルモード　`o`：下の行から挿入モード

- 移動方法
`k` ：上に移動　`j` ：下に移動
`h` ：左に移動　`l` ：右に移動
`0`: 行頭に移動　`$`: 行末に移動

- 操作方法
`:q!` ：保存しないで終了　`:wq`：保存して終了
`u`： 戻す(control zのようなもの)
`control r`：戻りすぎた場合に

- コピーペースト
`yy`：1行コピー
`p`：コピーしたものをペースト
`o`：下の行に文字を入力する。
~~`J`：行の連結~~

- 削除
`x`：1文字削除
`dd`：1行削除　`3dd`：3行削除
`D`：行末まで削除
`dw`：1単語削除
`:%s/abc//g`：「abc」という文字列を一斉削除


- 選択
`v + k`：上に選択　`v + l`：右に選択
`VG`：最後まで選択
- 移動
`：set number`：行番号を表示
`：10`：10行目へ。
`$`：行末へ。　`0`：先頭へ。
~~`^`：インデントの先頭~~
`{`：段落ごとに上へ。　`}`：段落ごとに下へ。
`[[`：セクションごとに上へ。　`]]`：セクションごとに下へ。
`G`：ファイルの最後へ。~~`gg`：ファイルの先頭へ。~~
`ctrl + o`：移動前の場所に戻る。


- 検索置換

`/hoge`：hogeを検索　`n`：次の検索結果に移動　`N`：前の検索結果に移動
`：％s/hoge/hoge1/g`：すべてのhogeをhoge1に置換する。
`：％s/hoge/hoge1/gc`：確認しながら、置換する

``：



#### 最後に
サーバーの構築の際などでvimしか使えない環境があるので、vimを使えるようにしよう！
`cmder` windowsのOSと会話するソフト。
https://www.puttygen.com/windows-terminal-emulators
eclipseに複数のJREバージョンを用意してプロジェクトごとに切り替える

自分用雑メモ。

1. eclipseの[ウィンドウ]→[設定]→[Java]→[インストール済みJRE]を選択して追加ボタンで追加。
2. プロジェクト右クリック→プロパティ→[Javaのビルドパス]→[JREシステムライブラリー]を#1で追加したものを設定する
自作PCクラスタ構築手順の備忘録

# 記事の目的

自作PCクラスタの構築手順をしばしば失念するため，その備忘録をここに書き残すこととします．

# 自作PCクラスタ構築手順

## 1. 材料の準備

ノード/ファイルサーバ1台ごとに必要なもの
- [ ] CPU
- [ ] マザーボード
- [ ] PC用電源ユニット
- [ ] DRAM(DDR4やDDR5等)
- [ ] SSDまたはHDD
- [ ] LANケーブル
- [ ] PCケースまたはベンチ台

1つあればよいもの
- [ ] スイッチングハブ
- [ ] キーボード
- [ ] マウス
- [ ] モニター
- [ ] ディスプレイケーブル
- [ ] OSインストール用USB(LiveUSB)

オプショナルな材料
- [ ] グラフィックボード(GPU)
- [ ] Ethernetカード
- [ ] PCラック
- [ ] CPU冷却ファン(i9/Ryzen9クラスでは必須)


## 2. 組み上げ


(1) OSインストール用USB(LiveUSB)を作成しておく．
例えば，ubuntuであれば公式HPから```.iso```イメージをダウンロードし，UNetbootin等を用いてLiveUSBを作成しておく．

(2) マザーボードにCPUを取り付ける．この際にピン曲がりに注意．

(3) (2)をPCケースに取り付け，電源ユニット，DRAM，SSD/HDD等を取り付ける．この際，のちの混乱を避けるため，ストレージとしてはOSをインストールする予定のSSD/HDDのみを接続しておく．

(4) 組んだPCにLiveUSBを挿してOSのインストールを行う．なお，hostnameとローカルIPアドレスはノードごとに事前に決めておくこと．以下ではUbuntu 18.04をインストールした場合について記述する．

(5) 計算ノードでは(5-1)，ファイルサーバでは(5-2)を実行する．
(5-1) 計算ノードにログインしたら以下のスクリプトを実行する．次いで，```mkdir /mnt/nfs ```などを実行し，全計算ノード上の同じ場所にマウントポイントを作成する．また，```ssh-keygen```しておく．

```shell
#!/bin/sh
sudo apt install  -y gcc
sudo apt install  -y gfortran
sudo apt install  -y libopenmpi-dev
sudo apt -y install nfs-common
sudo apt -y install lm-sensors
sudo apt -y install openssh-server

#以下は好み次第では不要
sudo apt -y install libblas-dev
sudo apt -y install liblapack-dev 
sudo apt -y install libatlas3-base
sudo apt -y install libatlas-base-dev
sudo apt -y install libopencv-dev 
sudo apt -y install gcc-offload-nvptx

```



(5-2) ファイルサーバにログインしたら以下のスクリプトを実行する．次いで，```mkdir /mnt/nfs ```などを実行し，マウントポイントを作成する．また，```ssh-keygen```しておく．

```shell
#!/bin/sh
sudo apt install  -y gcc
sudo apt install  -y gfortran
sudo apt install  -y libopenmpi-dev
sudo apt -y install nfs-common
sudo apt -y install nfs-kernel-server
sudo apt -y install lm-sensors
sudo apt -y install openssh-server

#以下は好み次第では不要
sudo apt -y install libblas-dev
sudo apt -y install liblapack-dev 
sudo apt -y install libatlas3-base
sudo apt -y install libatlas-base-dev
sudo apt -y install libopencv-dev 
sudo apt -y install gcc-offload-nvptx

```

(6) ファイルサーバ上で，nfs用のディスクをマウント&フォーマットしたあとで，```/etc/exports```を編集して，計算ノードに対してアクセスを許可する．その後，```sudo systemctl start nfs-kernel-server```などとしてnfsサーバを起動する．


(7) 計算ノードのNICに，あらかじめ決めておいた固定IPを設定した上で(/etc/netplanから設定可能)，```sudo mount 192.168.0.200:/mnt/nfs /mnt/nfs```などとしてファイルサーバのnfs用領域をマウントする．

(8) 全ての計算ノード相互に```ssh-copy-id```を行い，パスワードなしで互いにログインできるようにしておく．

## さいごに

多分以上の手続きを行えばよいのですが，もし漏れがあれば追記します．
[SPA] Laravel Sanctum認証に必要な設定まとめ

## 環境
* php 8.0
* laravel 8.75
* laravel/sanctum 2.11
* fruitcake/laravel-cors 2.0

## 前提

* 面倒なことせずに`axios`を使うこと。
ただし探求心を忘れないものは`fetchAPI`で無為な時間を消費してもよい。
* フロント・バックエンド間は同ドメイン同士の通信が好ましい


## Laravel側の設定

```php:config/cors.php

    'supports_credentials' => true,

```

```diff_php:app/Http/Middleware/Authenticate.php
    protected function redirectTo($request) {
        if (!$request->expectsJson()) {
-             return route('login');
+            abort(401, 'Not Verified.');
        }
    }

```

`ability`または`abilities`を使用するためには以下も必要
```php:app\Http\Kernel\
protected $routeMiddleware = [
    //...
    'abilities' => \Laravel\Sanctum\Http\Middleware\CheckAbilities::class,
    'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class,
]

```

## 参考設定(Axios)
```ts:util.ts

const server_base_url = import.meta.env.VITE_SERVER_URL;
const api_server_base_url = import.meta.env.VITE_API_SERVER_URL;

const apiAxios = axios.create({
	baseURL: api_server_base_url,
	timeout: 5000,
	withCredentials: true,
	headers: {
		'Content-Type': 'application/json',
		Accept: '*/*',
		credentials: 'include',
	},
});
const baseAxios = axios.create({
	baseURL: server_base_url,
	timeout: 5000,
	headers: {
		'Content-Type': 'application/json',
		Accept: '*/*',
	},
});

baseAxios.get('sanctum/csrf-cookie');

function axiosLoginTokenSet(token: string) {
	apiAxios.interceptors.request.use(config => {
		(<AxiosRequestHeaders>config.headers).Authorization = `Bearer ${token}`;
		return config;
	});
}

```

## 忘れがちなこと
フロント側であらかじめ`${server_url}/sanctum/csrf-cookie`に`GET`で通信しておくこと。
>CSRF保護

https://readouble.com/laravel/8.x/ja/sanctum.html

この通信の際には`withCredentials: true`や、`headers.credentials: 'include'`は必要ない。
【AtCoder】ABC241E  Putting Candies  Python解説

## はじめに 

ABC 241 E 問題 Putting Candies を解くために考えたこと、ACできるPython3(PyPy3)コードを紹介します。
また、今回は試験的にスライド形式にしています。筆者の記事をよく見てくださる方は、これまでとどちらが見やすいかコメントくださるとうれしいです。



## E.Putting Candies

[問題ページ](https://atcoder.jp/contests/abc241/tasks/abc241_e)
難易度 ： <font color="deepskyblue"> 水色 1248 </font>

## 考察
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012066/ff9b15cb-4fae-5bad-3fef-3856669b9a46.png)
$K$ 回愚直に操作を追うことはできませんが、ループ構造に注目すると高速に最終値を求めることができそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012066/f156ab79-1b3c-d5d6-24e1-1dda60ff7a21.png)
最終合計値を求めるためには、ループ構造を含む 3つの部分の合計値を求める必要があることがわかりました。
**操作回数 $i$ を入力して、$i$ 回目の操作までの合計値を求められるテーブルを作成しておけば、これらを $O(1)$ で求めることができそうです。**
終点の位置など、ループにまつわる情報を求めたいので、ループ構造を検知する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012066/d31bc509-c13a-384b-b829-050a9e73c580.png)
状態の遷移を素直に前から見ていくと、**初めて加算値が重複した位置でループ構造の終点を検出**できます。同時に、その値をそれまでに加算していた位置で始点を検出できます。
したがって、**加算値 $( mod\ N)$ を入力してそれが何回目の操作かを求められるテーブルを作成しておけば、これらを $O(1)$ で求めることができそうです。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3012066/3c6d60d7-85d5-15f2-cec3-82932a1b124b.png)
操作回数は $N$ 回までありえるので、これを満たすテーブルを用意します。範囲外参照を絶対に起こさない程十分大きなサイズで余裕を持たせてもよいと思います。

# コード
pypy3
124 ms/ 2000 ms

```php
N,K=[int(nk) for nk in input().split()]
A=[int(a) for a in input().split()]
count_acc=[0 for _ in range(N+1)]
mod_count=[N for _ in range(N)]
mod_count[0]=0
for i in range(1,N+1):
    count_acc[i]=count_acc[i-1]+A[count_acc[i-1]%N]
    # 加算値が既出ならループ検出
    if mod_count[count_acc[i]%N]<N:
        end=i
        start=mod_count[count_acc[i]%N]
        break

    mod_count[count_acc[i]%N]=i


if end>K:
    ans=count_
    ans=count_acc[K]

else:
    # 1周目
    ans=count_acc[end]
    rem=K-end
    # ループ回数
    rep=rem//(end-start)
    ans+=(count_acc[end]-count_acc[start])*rep
    # 最終周
    rem%=(end-start)
    ans+=count_acc[start+rem]-count_acc[start]

print(ans)
```

# 補足
- 類題
[問題ページ](https://atcoder.jp/contests/abc179/tasks/abc179_e)
ネタバレ防止で、abc 175 ～ 180 C ～ E と記します。
こちらの問題も記事にしているのでぜひご覧ください(230221時点、未掲載 すぐにあげます)

# 終わり

質問やご指摘、ご意見はこちらまで
Twitter : [Waaa1471](https://twitter.com/Waaaa1471)
第４正規形

# 第４正規形とは
```独立な多値従属性が複数存在するテーブルを分割```することで作られます。

# 多値従属性とは
```キーと集合との対応```のことをいう。

社員ID、チームコード、製品コードの列をもつテーブルがある。
このテーブルは社員IDを一つ決めるとそれに対してチームコード、製品コードが複数決まります。
記号でこう表す。
```
{社員ID}→→{チームコード}
{社員ID}→→{製品コード}
```

# 第４正規形の意義
```複数の多値従属性を一つのテーブルで表現しようとするのは、正味の話かなり無理のある設計```だから

冗長性を残したテーブルとして成立しているため、論理的には作ることができます。そのため、こうしたテーブル構成を```明示的に禁止しておくのが第四正規形の意義```です。
これは要するに、
関連エンティティをつくる場合は、そこに含まれる```関連は一つだけにする```ことという設計上のルールが必要だということです。

# 出典
https://www.shoeisha.co.jp/book/detail/9784798124704

# 感想
とりあえず第3正規形まで作成してみる
その後にそれ以降の正規形を試してみようと思う。
Svelteのカウントアップアニメーション

 
<b>Svelteで使えるカウントアップアニメーションが欲しい</b>
ので、公式のタイプライターアニメーションを参考にしつつ作ってみた。


```js:
{#if true}
    <span class="result-length">Result: 
        <span in:countUp={{}}>{result}</span>
    </span>
{/if}

<script lang="ts">
let result = 1000;

function countUp(node, { speed = 3 }) {
		const valid = node.childNodes.length === 1 && node.childNodes[0].nodeType === Node.TEXT_NODE && !isNaN(node.textContent);

		if (!valid) {
			throw new Error(`This transition only works on elements with a single number type node child`);
		}

		const goal_number = Number(node.textContent);
		const duration = goal_number / (speed * 1);

		return {
			duration,
			tick: t => {
				// console.log(~~(goal_number * t));
				const i = ~~(goal_number * t);
				node.textContent = i;
			},
		};
	}
</script>
```

中途半端なので、加減速とかの処理は入ってません。

>公式のアニメーション 

https://svelte.jp/examples/custom-js-transitions
javascriptでの正規表現 置き換え

## ■経緯
簡単なのに、ちょっとはまるし忘れるので。

## ■文法

/　正規表現/g;
→デリミタ 正規表現 デリミタ gオプション;


## ■サンプル

```javascript
// 不要文字列(" \)削除
const regex = /(\"|\\)/g;
const replacedUrl = str.replace(regex, '');
```
Go言語のnewについて

Go言語のnewは、指定された型の新しい領域を確保し、その領域のアドレスを返すために使用されます。以下に、newを使用したサンプルコードを記載。

```go: golang sample
func main() {
    // ポインタを作成する
    p := new(int)

    // ポインタのアドレスを出力する
    fmt.Println(p) // => 0xc0000a6008

    // ポインタの値を設定する
    *p = 123

    // ポインタの値を出力する
    fmt.Println(*p) // => 123
}
```

この例では、new関数を使用して、int型の新しい領域を確保し、そのポインタを変数pに代入しています。次に、ポインタpに123を設定し、その値を出力しています。

new関数のTiptsとしては、new関数は、単純なポインタの割り当てに適しています。new関数は、ゼロ値で初期化されたポインタを返すため、ポインタが格納する値を初期化する必要がある場合は、明示的に初期化する必要があります。また、new関数は、配列やスライス、マップなどの初期化には適しておらず、make関数を使用することを推奨します。

make関数は、動的に配列、スライス、マップなどのメモリを割り当てるために使用され、配列やスライス、マップの初期化に適しています。make関数は、new関数と異なり、ゼロ値で初期化された配列やスライスを作成することができます。

https://pkg.go.dev/builtin
Go言語のlenについて

Go言語のlenは、配列、スライス、マップ、文字列などの長さを取得するために使用されます。以下に、配列、スライス、マップ、文字列のlenを取得するサンプルコードを記載。

```go: golang sample
func main() {
    // 配列のlenを取得する
    a := [3]int{1, 2, 3}
    fmt.Println(len(a)) // => 3

    // スライスのlenを取得する
    s := []int{1, 2, 3}
    fmt.Println(len(s)) // => 3

    // マップのlenを取得する
    m := map[string]int{"apple": 100, "banana": 200}
    fmt.Println(len(m)) // => 2

    // 文字列のlenを取得する
    str := "hello world"
    fmt.Println(len(str)) // => 11
}
```
この例では、配列、スライス、マップ、文字列のlenを取得しています。各データ型に対して、len関数を使用して長さを取得し、出力しています。

len関数のTiptsとしては、スライスやマップの要素数や文字列の文字数を取得する場合、len関数を使用することが一般的です。また、len関数は、スライスやマップの容量や配列のサイズを取得することはできません。len関数が返す値は、その配列、スライス、マップ、文字列に格納されている要素の数です。そのため、コード中で配列、スライス、マップ、文字列を操作する際には、len関数を使用して適切に要素数を取得することが重要です。

https://pkg.go.dev/builtin#len
Go言語のmakeについて

Go言語のmakeは、動的に配列、スライス、マップなどのメモリを割り当てるために使用されます。makeは、newとは異なり、ゼロ値で初期化された配列やスライスを作成することができます。以下に、makeを使用したスライスのサンプルコードを記載。

```go: golang sampple

func main() {
    // スライスをmakeで作成する
    s := make([]int, 3, 5)

    // スライスの要素を設定する
    s[0] = 1
    s[1] = 2
    s[2] = 3

    // スライスの要素を出力する
    fmt.Println(s) // => [1 2 3]

    // スライスの要素数と容量を出力する
    fmt.Printf("len=%d cap=%d\n", len(s), cap(s)) // => len=3 cap=5
}
```

この例では、make関数を使用して、要素数が3、容量が5のint型スライスを作成しています。スライスの要素を設定し、要素を出力しています。また、スライスの要素数と容量を出力しています。

make関数の第1引数は、作成するスライス、配列、マップの型を指定します。第2引数は、作成するスライスやマップの初期要素数を指定します。第3引数は、作成するスライスやマップの容量を指定します。スライスやマップの容量は、内部的に使用される配列のサイズを指定します。スライスの容量は、そのスライスが追加要素を含めることができる最大の要素数です。

make関数を使用する際のTiptsとしては、スライスやマップを作成する場合、要素数と容量を区別することが重要です。スライスの要素数は、スライスに実際に格納されている要素数を指定し、容量は、スライスが拡張することができる最大要素数を指定します。また、make関数を使用する場合は、配列やスライス、マップの初期化に適しており、new関数は単純なポインターの割り当てに適しています。

https://pkg.go.dev/builtin#make
Laravelのkitloong/laravel-migrations-generator使ってphp artisan migrate:generateしたらColumn not found: 1054 Unknown column 'GENERATION_EXPRESSION' in 'field list' エラーでたので対応した

Laravelの既存機能をコピーして新しい機能を作る時、既存DBテーブルからマイグレーションを作成できるライブラリを見つけました。
実行したけどエラーでマイグレーションが生成できなかったため、対応しました。
また、ぱっと日本語記事が見つからなかったため、記事化しました。

# 原因

DBが古く`INFORMATION_SCHEMA`の`COLUMNS`テーブルに`GENERATION_EXPRESSION`カラムが無いためエラーになっていました。
そのため、DBをアップグレードすると解決します。

## mysql

mysql5.7～
https://dev.mysql.com/doc/refman/5.7/en/information-schema-columns-table.html
mysql5.7でGENERATION_EXPRESSIONカラム追加された

## mariadb

MariaDB 10.2.5～
https://mariadb.com/kb/en/information-schema-columns-table/
> GENERATION_EXPRESSION	The expression used for computing the column value in a generated (virtual, or computed) column.	MariaDB 10.2.5


# 既存のDB|tableからマイグレーションを自動作成するライブラリ
```
composer require kitloong/laravel-migrations-generator --dev
```

* "version": "v6.8.0"
    * Laravel5.5～10まで対応しています。
* (参考：上記ライブラリ) https://github.com/kitloong/laravel-migrations-generator

# テーブルを指定してマイグレーションを自動作成
```
php artisan migrate:generate --tables="table1,table2,table3,table4,table5"
```

# エラー
```
Column not found: 1054 Unknown column 'GENERATION_EXPRESSION' in 'field list' 
```

少しでも参考になれば嬉しいです。
高品質な画像拡大： AnyRec AI、VanceAI、NeroとPythonの活用法

画像を拡大する場合、通常、画像の品質が低下します。しかし、現代の技術を使用することで、画像を拡大するときの品質低下を軽減することができます。この記事では、AnyRec AI Image Upscaler、VanceAI Image Upscaler、およびNero Image Upscalerという3つのツールを紹介し、これらのツールを使用して画像を拡大する方法について説明します。

AnyRec AI Image Upscaler (https://www.anyrec.io/ja/image-upscaler/) は、人工知能（AI）を使用して画像を拡大するためのオンラインツールです。このツールは、多数の画像を解析し、AIアルゴリズムによって最適な拡大方法を決定します。これにより、画像の品質を維持しながら、より高品質な拡大画像を作成することができます。

VanceAI Image Upscaler (https://vanceai.com/image-enlarger/) は、デジタル画像の拡大に特化したオンラインツールです。このツールは、画像を拡大する前に、AIアルゴリズムを使用して画像を分析し、最適なアルゴリズムを選択します。その後、選択されたアルゴリズムに基づいて画像を拡大し、最終的に高品質の拡大画像を作成します。

Nero Image Upscaler (https://ai.nero.com/image-upscaler) は、高速かつ効率的に画像を拡大するためのソフトウェアです。このツールは、ノイズ低減、エッジ保護、および解像度強化などの機能を備えています。Nero Image Upscalerは、高品質の拡大画像を作成することができ、さまざまな用途に適しています。

これらのツールを使用して画像を拡大する方法は非常に簡単です。まず、選択したツールのウェブサイトにアクセスし、画像をアップロードします。次に、拡大の方法を選択し、ボタンをクリックして拡大プロセスを開始します。プロセスが完了すると、高品質の拡大画像がダウンロード可能になります。

画像を拡大するときに、品質低下を軽減するためには、いくつかのヒントがあります。まず、元の画像ができるだけ高品質であることが重要です。また、拡大の際に、ツールが使用するアルを使用する前に、可能な限り元の画像の品質を向上させることをお勧めします。また、適切なアルゴリズムを選択し、拡大後の画像を慎重にチェックすることが重要です。

最後に、AnyRec AI Image Upscaler、VanceAI Image Upscaler、およびNero Image Upscalerのいずれかを使用する場合は、それぞれのウェブサイトにアクセスし、使用方法や機能について詳しく調べてから利用することをお勧めします。また、画像の拡大に関する基本的な知識を身につけることも大切です。それにより、より高品質な拡大画像を作成することができます。

もし、Pythonを使用して画像を拡大する場合は、OpenCVやPillowといったライブラリを使用することができます。以下に、OpenCVを使用した画像拡大の例を示します。

まず、OpenCVをインストールします。

pip install opencv-python

次に、以下のコードを使用して画像を読み込みます。

import cv2

image = cv2.imread('image.jpg')

次に、以下のコードを使用して画像を拡大します。

scale_percent = 200 # 200%に拡大
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)

resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)

上記のコードでは、200%に拡大しています。interpolationパラメータには、cv2.INTER_CUBICやcv2.INTER_LINEARを使用することもできます。最後に、以下のコードを使用して拡大後の画像を保存します。

cv2.imwrite('resized_image.jpg', resized)

これらのツールとは別に、Pythonを使用して画像を拡大することもできます。OpenCVやPillowといったライブラリを使用することで、簡単に画像を拡大することができます。ただし、適切なアルゴリズムを選択することや、拡大後の品質を慎重にチェックすることが重要です。
ボイスーコッド正規形

# ボイスコッド正規形とは
```第3と第4の間にこの正規形が定義されている```。

```一つのテーブルで非キーからキーへの関数従属をなくした状態```

ありえない組み合わせのレコードを登録することがないよう、アプリケーション側で制御する必要があります。

# 非キーからキーへの関数従属とは
社員ID、チームID、チーム補佐の列をもつテーブルがあるとする。
```
{社員ID、チームID}→{チーム補佐}
```
の関数従属がある。

一方
チーム補佐がチームIDに従属する関係性も存在する。
```
{チーム補佐}→{チームID}
```
これが非キーがキーへの関数従属が成り立つ。

# 分解後に非可逆的の分解になってしまう
下の関数従属性の関係を失わないように分解をする
```
{社員ID、チームID}→{チーム補佐}
```
```
{チーム補佐}→{チームID}
```

関係を壊すと非可逆的な分解になってしまう。

# 気づき
関係を壊しそうで大変だ。

# 分解後
社員ID,チーム補佐のテーブルとチーム補佐とチームコードのテーブルに分けることができる。

しかし
これにも問題がある。
社員ID,チーム補佐のテーブルでチーム補佐を変えると自動的に社員IDが暗黙に複数のチームに所属することになる。
# 気づき
社員IDは一つのチームにしか所属できないようになっていた場合このテーブルは適していなさそうだ。

ややこしいできるかな？心配だ。

# 出典
https://www.shoeisha.co.jp/book/detail/9784798124704
Go言語のインターフェースについて

Go言語のインターフェースは、構造体や型に対してメソッドを定義し、それを利用するための型です。インターフェースは、プログラムの柔軟性を高め、コードの再利用性を高めることができます。

以下に、Go言語のインターフェースを使用した簡単なサンプルコードを記載。

```go:Smaple Interface

// Animalインターフェースを定義します
type Animal interface {
    Speak() string
}

// Dog構造体を定義します
type Dog struct {
    Name string
}

// Dog構造体にSpeak()メソッドを定義します
func (d Dog) Speak() string {
    return "わんわん"
}

func main() {
    // Animalインターフェースを持つ変数を宣言します
    var a Animal

    // Dog構造体のインスタンスをAnimalインターフェースを介して代入します
    a = Dog{"ポチ"}

    // Animalインターフェースを介してDog構造体のSpeak()メソッドを呼び出します
    fmt.Println(a.Speak()) // => わんわん
}
```
このサンプルでは、Animalというインターフェースを定義し、Dogという構造体にSpeak()メソッドを定義しています。そして、インターフェースの変数を定義し、Dog構造体のインスタンスを代入しています。最後に、インターフェースを介してSpeak()メソッドを呼び出しています。

このように、インターフェースは、様々な型や構造体に対してメソッドを定義し、それを利用することができる型です。Go言語において、インターフェースは非常に重要な役割を果たしており、プログラムの柔軟性や拡張性を高めることができます。

https://go.dev/doc/effective_go#interfaces
Master's in UI UX Design Course In Germany for Indian Students

![ui ux course in germany.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191739/b361499a-a085-19d1-be5e-79106d15a359.png)

Get more detail about Master's in <a href="https://pfhindia.com/ui-ux-design-course/"> ui ux design course in germany </a> for Indian Students
Laravel blade ディレクティブを追加する拡張機能を作った

# Add-Directives-To-Laravel-Blade

下記の記事を書いたついでに、暇なので作りました。

https://qiita.com/kazumacchi/items/1e58108999ad29ac2717


is_bool, is_array, is_int やら何やらも追加しようと思いましたが、テンプレート内ではほとんど使われないだろうなぁ…と思い除外しました。

用意されていたらある程度使われそう（※個人の感想です）なのに、標準で用意されていないものに絞って追加してます。

## インストール方法

```bash
composer require kanagama/add-directives-to-larave-blade
```

## 追加されるディレクティブ一覧

### @true

$conditions 条件式が true の場合のみ表示されます。

```php
@true ($condition)
  // $condition が true の場合の処理
@endtrue
```

### @false

$conditions 条件式が false の場合のみ表示されます。

```php
@false ($condition)
  // $condition が false の場合の処理
@endfalse
```

### @notempty

@empty ディレクティブと反対の挙動をします

$conditions が empty でない場合に表示されます

```php
@notempty ($condition)
  // $condition が empty でない場合の処理
@endnotempty
```

### @notisset

@isset ディレクティブと反対の挙動をします

$conditions が定義されていない、または null の場合に表示されます

```php
@notisset ($condition)
  // $condition が定義されていない、または null の場合の処理
@endnotisset
```

### @isnull

$conditions が null の場合に表示されます

```php
@isnull ($condition)
  // $condition が null の場合の処理
@endisnull
```


### @isnotnull

$conditions が null でない場合に表示されます

```php
@isnotnull ($condition)
  // $condition が null でない場合の処理
@endisnotnull
```


### @loop

$conditions の回数分表示されます

@foreach ディレクティブと同じく、$loop 変数が利用できます。

```php
@loop ($condition)
  // $condition が 3 の場合、3回表示されます
  {{ $loop->index }}
@endloop
```


## github

https://github.com/kanagama/add-directives-to-laravel-blade

## packagist

https://packagist.org/packages/kanagama/add-directives-to-larave-blade
エクセルで範囲指定したセルの値を返す AppleScript

## 作成した動機

例えばこのようなエクセルがあったとして、各セルの数値を合計した値を知りたいといった場合、
いちいち計算式書くの面倒なのでAppleScriptを書いてみました。
![スクリーンショット 2023-02-21 14.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810463/a1ab3628-2d5e-369c-2b39-5aa30cdc8d90.png)

## 調べながら、前進
エクセルの範囲指定された領域を取得するには、以下のスクリプトでできました。
```sample01.scpt
tell application "Microsoft Excel"
	get selection
end tell

```

get selection で返ってくるのは range オブジェクトです。
```sample02.scpt
tell application "Microsoft Excel"
	set myRange to get selection
	class of myRange
end tell
```

```結果.txt
range
```


この状態では各セルの値が取れそうもないので、スクリプトエディタ.appでエクセルの用語説明を見てみます。
![スクリーンショット 2023-02-21 14.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810463/fafeb2f9-49b8-5760-c416-ffa89ac9bafb.png)
renge の arias プロパティがそれっぽいですね。
![スクリーンショット 2023-02-21 14.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810463/0d96a6da-f320-af9d-42a0-dbc8aa36f3f6.png)

>areas (list of specifier, r/o) : Returns a list of range objects that represents all the ranges in a multiple-area selection.

DeepLで翻訳してみると
>areas (list of specifier, r/o) : 複数領域選択におけるすべての領域を表す範囲オブジェクトのリストを返す。

renge の arias プロパティを見てみましょう
```sample3.scpt
tell application "Microsoft Excel"
	set myRange to get selection
	--class of myRange --> range object
	areas of myRange
end tell
```
```結果.txt
{range "[Book1]Sheet1!$A$1:$C$3" of application "Microsoft Excel"}
```
返ってきた値には、範囲指定されたセルのアドレスが入っていました。
なので、これでどうなるか……試してみます

```sample4.scpt
tell application "Microsoft Excel"
	set myRange to get selection
	value of areas of myRange
end tell
```
```結果.txt
{{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0}}
```
各セルの値がリストで取得できました。

## 範囲指定したセルの数字の合計を求める
これまでの成果をハンドラにし、合計を求めます。

```ExTotal.scpt
set myList to getVals()

set total to 0
repeat with r from 1 to number of myList
	set myRow to item r of myList
	repeat with c from 1 to number of myRow
		set myVal to item c of myRow
		set total to total + myVal
	end repeat
end repeat
total

on getVals()
	tell application "Microsoft Excel"
		set myRange to get selection -- range obj
		tell myRange
			value of areas
		end tell
	end tell
end getVals
```
```結果.txt
45.0
```
何かの参考になれば、幸いです。
fortranで自分自身（実行形式）のコマンドパスを得るには？

たとえばfortranからpythonのコードをsystem callするとき、そのpythonコードのパスをそのfortranプログラムの実行形式と同じディレクトリにあるものを使う、としておかないと整理がつかなくなる。将来的にはpythonを親に据えるべきだろうから当面の対処法ではあるけれど。


[ここにあったコード](https://community.intel.com/t5/Intel-Fortran-Compiler/How-to-get-an-executable-s-location/td-p/749967)をuse IFPORTしないでいいように修正しモジュール化した。

使い方の例：
どこかでcall setcmdpath()しておく。そうするとcmdpathにパスが入っている。
```fortran
＝＝＝セットする＝＝＝
   use,m_cmdpath,only:setcmdpath
...
          call setcmdpath()  
...

＝＝＝＝使う側＝＝＝＝
   use,m_cmdpath,only:cmdpath
...
           cmdl=trim(cmdpath)//'ctrl2ctrlp.py >outx' 
           call system(cmdl) !Main part 
```
こういうことをしたあと、outxファイルをfortranで読む必要はある。
以下が、cmdpathを得るモジュール. gfortran,ifortで動作確認した。
```fortran
module m_cmdpath
  character(1024),public :: cmdpath
  public setcmdpath
  private
contains
subroutine setcmdpath() !Set cmdpath, which is the full path to the command (fortran program) itself.
  use ISO_C_BINDING
  implicit none
  interface
     function readlink(path, buf, bufsize) bind(C, NAME = 'readlink')
       import
       integer(C_SIZE_T) :: readlink
       character(KIND = C_CHAR), intent(IN) :: path(*)
       character(KIND = C_CHAR) :: buf(*)
       integer(C_SIZE_T), value :: bufsize
     end function readlink
     function getpid() bind(C, NAME = 'getpid')
       import
       integer(C_SIZE_T) :: getpid
     end function getpid
  end interface
  integer :: pid, i, idx
  integer(C_SIZE_T) :: szret
  character(512) :: path
  character(KIND = C_CHAR) :: cbuf(256)
  cbuf=''
  pid = getpid()
  write (path, '(i0)') pid
  path = '/proc/'//TRIM(path)//'/exe'
  szret = readlink(TRIM(path)//C_NULL_CHAR, cbuf, SIZE(cbuf, KIND = C_SIZE_T))
  if (szret == -1) stop 'Error reading link'
  path = ''
  do i = 1, SIZE(cbuf)
     if (cbuf(i) == C_NULL_CHAR) exit
     path(i:i) = cbuf(i)
  enddo
  idx = INDEX(path, '/', BACK = .TRUE.)
  cmdpath=TRIM(path(:idx - 1))//'/'
end subroutine setcmdpath
endmodule m_cmdpath
```
Elixir 挑戦記 - 開発環境構築

# Elixir 挑戦記

- 統合的アプローチによる学習
- とりあえず手を動かしてみるシリーズ
- 調べたり取り組んだりした内容をひたすら書いていく
- あとで整理してまとめたい

# 今回の記事について

こちらの記事を参考に、開発環境を作成

https://zenn.dev/koga1020/articles/d260bc1bde8267

# フォルダ構成

```text
dev
├ app (mix project)
│  ├─ 自動生成されたファイル群(mix.exs など)
│  └─ run.sh
├ data (ノートブック置き場)
├ docker-compose.yml
└ Dockerfile
```

# 各ファイルの設定

```bash:run.sh
cd /app
mix local.hex --force
mix local.rebar --force
mix deps.get
mix compile
iex --sname sname@app --cookie cookie -S mix
```

```yaml:docker-compose.yml
---
version: "3.2"

services:
  app:
    build: .
    tty: true
    volumes:
      - ./app:/app
      - _build:/app/_build # Volume Trick
      - deps:/app/deps # Volume Trick
  livebook:
    image: livebook/livebook:0.8.1
    ports:
      - 8080:8080
    environment:
      - LIVEBOOK_COOKIE=sname
      - LIVEBOOK_DEFAULT_RUNTIME=attached:sname@app:cookie
    volumes:
      - ./data:/data

volumes:
  _build:
  deps:

```

```dockerfile:Dockerfile
FROM hexpm/elixir:1.14.3-erlang-25.2.3-ubuntu-jammy-20221130

RUN apt-get upgrade -y \
  && apt-get update \
  && apt-get install -y \
  sudo \
  unzip \
  vim \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

CMD [ "/bin/bash", "/app/run.sh" ]

```

# 動かし方

```bash
cd dev
docker compose build
docker compose up
```

# 作業方法

- `http://localhost:8080`でLivebookに繋いでコーディング
    - `mix.exs`で指定したdepsパッケージも利用可能
        - 変更時は `IEx.Helpers.recompile()` で対応できる
    - `dbg/0` で効率アップを狙いたい
- 最終的に`*.exs` としてエクスポートし、プロジェクトに含める
    - 順次実行で処理の流れを確認しやすい`*.livemd`も手元に残る

# 気になること

`.devcontainer`を利用すれば 開発 / 実行 の設定を分けられそうな気がするけど、一旦置いておく
JustPDF5[作成]をWindows Power Automate Desk Topで使う

環境　windows11pro 64bit　/Windows Power Automate 2.28
**結論**
**Windows Power Automate DesktopでJustPdf5CmdCreator.exe実行できた**
**pdfにするための画像ファイルの名前が長いと、JustPDFの仕様の500ページに到達する前に失敗する。**
**GUIのJustPDF5[作成]は、UIオートメーションでも制御は可能ですが、JustPdf5CmdCreator.exeの方が、使い勝手が良く、速い。**

**1.JustPDF5の仕様**
JustPDF5を標準でインストールすると、"C:\Program Files (x86)\JustSystems\JustPdf5\Creator\JustPdf5CmdCreator.exe"
として、「JustPdf5CmdCreator.exe」がインストールされます。
これが、コマンドライン入力を担います。コマンドライン入力に関し、マニュアルに記載はなく、ヘルプに出てくるだけです。
当該ヘルプに、複数のpng-filesを1つのPDFにする場合は
JustPdf5CmdCreator.exe◇/combine◇"ファイルパス1"◇"ファイルパス2"◇・・・◇/out◇"出力先フォルダー" 
とコマンドを実行するとなっています。
◇は、半角スペース。◇と""とPath区切り記号(/)を、厳格に守ることでコマンドライン入力を受け付けます。
これ重要、◇と""とPath区切り記号(/)を、厳格に守る。
combineは、PDF形式以外の、たとえばpng_fileをPDF形式にしてから、結合させるという便利なものです。

**2.Windows Power Automate DesktopでJustPdf5CmdCreator.exeを実行する考え方**
Windows Power Automate Desktopは、外部スクリプトとしてCMDを許しているのでここで実施。また、CMD内に、変数の書き込みを許しています。

**2.Windows Power Automate DesktopでJustPdf5CmdCreator.exeの実行例**
ファイル構成
Sドライブで実施
S:/03_PDFs_by_justPDF5 #作成したPDF-fileを保存するフォルダ
S:/04_main_work/test# test用のpngファイルを保存しているフォルダ。*連番.pngなります。
JustPdf5CmdCreator.exeは、**windows11の詳細設定でPathを記憶**させておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631026/8b510296-0a29-9ca3-9b9a-5514131b805b.png)
step1は、pdfにする元画像の取得です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631026/604040ad-d311-cda7-a79e-e607ff0a1050.png)

step2は、%pngFiles%をリスト形式から、一分に結合します。区切り文字を" "にすることが重要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631026/e2bfbd69-079f-192e-fa83-289f33895fd3.png)

step3はCMD部分でcoreです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631026/da4317a5-3be4-4d58-eab2-85f25b2bfdf3.png)


コマンドは
 ` ` ` 
JustPdf5CmdCreator.exe /combine "%JoinedText%" /out "S:\03_PDFs_by_justPDF5" /imagecomp 1
 ` ` ` 
%JoinedText%の両脇の"が大事。最後の/imagecomp 1はpdf圧縮の程度で、数字の1は、JustPDF本体(GUI版)で設定します。

**3.Windows Power Automate Desktop(CMD)でJustPdf5CmdCreator.exeを実行した場合の制限事項**
pdfにしたい元fileの名前の文字数が、
JustPDF本体の制限500ページを到達する前に失敗します。およそ、7000文字程度で諦めました。Windows Power Automate Desktopでbasenameを簡単に取得して、かつ、連結するのは面倒なので、Windows Power Automate Desktop(CMD)でJustPdf5CmdCreator.exeを実行する場合は、フォルダ名とファイル名を簡便にしてrenameし、pdf作成後、名前を元に戻すテクニックが必要となります。仮にsドライブのaフォルダに???.pngとして元データとを置くと、コマンドラインに必要な文字数は、「"S:\a\???.png"◇」
◇は、半角スペースで文字数は、15文字で460ページくらいは、出来る計算となります(実際は失敗中。)
フィクションなどから拾う情報処理用語 その33 監視 (吉四六)

出典は Wikipedia の[吉四六](https://ja.wikipedia.org/wiki/%E5%90%89%E5%9B%9B%E5%85%AD)

大分県中南部に伝わる伝承を纏めたのが吉四六話で今回は「柿の見張り番」と呼ばれる話を取り上げる。

吉四六が子供の頃のエピソードである。

ある日、吉四六の家の柿がたわわに実った。親は盗まれないように、吉四六に柿の木を見ているように言った。しかし、自分自身も食べたくてしょうがない。おまけに村の友人がやってきて、柿を食べようと吉四六をけしかける。そこで、吉四六は頓智を働かせ、友人と一緒に全部柿を平らげてしまった。畑仕事から戻ってきた親は吉四六をしかりつけるが、吉四六はこう言った。「柿の実は友達がもいで行ってしまったけど、柿の木はずっと見ていた」と。親は呆れて開いた口が塞がらなかったのであった。
Visual Studioのパフォーマンスを向上するために

visual studioのパフォーマンスを向上するためには、いくつかの設定やtuningがありますが、
以下に、パフォーマンスを改善するために行うことができるいくつかの方法を紹介してと思います。
visual studioのツール外（external）とツール内（internal）の観点から述べます。

## external
visual studioツール外では、以下のような手順も試してみることをお勧めします。

### 1. 不要なファイルの削除
visual studioは多くのcache fileやprojectのbuild中に作成される一時ファイルを生成します。これらのファイルが多くなると、パフォーマンスに影響を与えることがあります。不要なファイルを削除することで、パフォーマンスを向上できます。

### 2. clean installの実行
visual studioのクリーンインストールを実行することで、visual studioの設定や構成を初期状態に戻すことができます。これにより、不要な設定やcomponentsが残っている場合には、これらが削除され、パフォーマンスが改善される可能性があります。

## internal
### 1. 不要な拡張機能の無効化
Visual Studioには多数の拡張機能がありますが、必要のないものを無効化することで、Visual Studioのパフォーマンスを向上できます。以下の手順で不要な拡張機能を無効化できます。
[拡張機能管理] -> [インストール済み] から、不要な拡張機能を選択し、[無効にする] ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3019265/ef3e2a19-4b8f-9a63-be13-759f11389173.png)

### 2. パフォーマンスの向上に特化したVisual Studioの設定を調整
Visual Studioにはパフォーマンス向上に特化した設定があります。以下の手順で有効化できます。
[ツール] -> [オプション] ->キーワードでパフォーマンスを探す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3019265/0ed51c32-48e2-5abf-ea65-e50a90f58c86.png)

### 3. ハードウェアに合わせた設定の調整
Visual Studioはハードウェアによってはパフォーマンスが低下することがあります。そのため、ハードウェアに合わせて設定を調整することで、パフォーマンスを向上できます。以下の手順で調整できます。
[ツール] -> [オプション] -> [環境] -> [全般] -> [可能なハードウェアのグラフィックス アクセラレータを使用する] にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3019265/595603df-03ee-8133-b0d7-f23cb585f8e8.png)
AWS SAAの試験結果

## 受験経緯
現在のPJで、AWSを用いた構築が多く学習を開始。この機会にAWSソリューションアーキテクト・アソシエイト試験(SAA-03)を受けてみようということで試験を予約。
2月中旬の新宿付近での受験予定だったが、試験日の1週間前に予約することができた。
（[再受験無料キャンペーン](https://pages.awscloud.com/TrainCert-Japan-PearsonVUE-Retake-2022.html)中だったので空きがないかと思いきや、試験会場が沢山あるから大丈夫なのかも）

## 学習開始前の知識レベル
新米エンジニアとして働いているので基礎知識はあるが、
クラウド系のサービスをほとんど触ったこともなく、実務でもわからないことだらけの状態。
S3が何のサービスなのかは理解しているが、実際に触ったことはほとんどないレベル。

## 試験勉強
当初は、kindle unlimitedの本を用いて学習していたが、紙の本の方が学習しやすいと思い下記を購入。
[「要点整理から攻略する　『AWS認定ソリューションアーキテクト-アソシエイト』」](https://www.amazon.co.jp/%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B-%E3%80%8EAWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E3%80%8F-Compass-Infrastructure-%E3%83%88%E3%83%AC%E3%83%8E%E3%82%B1%E3%83%BC%E3%83%88%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4839979448)
様々な対策本が出版されているが、かなり分厚い方。
(この教材を学習した後でも、初めて聞くサービスが過去問に出てくるので、薄すぎる本は個人的にお勧めできない)
この教材と、kindle unlimitedで無料で購読できた問題集、AWS公式から出ている無料の模擬試験を用いて、1日2時間程度の学習を1カ月継続。最後の方にAWS公式の模擬試験を解いてみて80%ほどの正答率に。

## 試験本番
問題を解き始めて、最初の数問は難しく感じた。他の投稿者も書かれている通り、サービス名を答えるだけの簡単な問題は少なく、どのアーキテクチャを採用することで最も可用性を高められるか、最もコストを抑えられるか、といったことを理解する必要がある。消去法である程度の選択肢を絞ることもできるが、1択に絞れないという問題も多くあった。(勉強不足だっただけですが...)
他の投稿で「問題文の日本語が理解しずらい」といった意見を見かけたが、個人的には日本語が分かりにくいということはなかった。単純にAWS公式の模擬試験よりも難しいという印象。

## 試験結果
試験を12時頃に受けて、1時間ほどで試験を終えて退出。その日の夜9時ごろにAWS認定アカウントの試験履歴からスコアレポートがダウンロードできるようになっていた。(メールはその数時間後に届く)
結果は...840点!  意外と高得点!  
2択まで絞ってあとは雰囲気で解いた問題もあったが、それが正解していたのか。とにかく、合格していてよかった。(試験代が高いので...)
Mauticをコマンドラインで手動アップデートする

Mauticのアップデートをコマンドラインで行う度に403エラーになる人向けの備忘録です。

## アップデート手順
以下の方法で、コマンドラインからアップデートします。※事前にバックアップを忘れずに取りましょう。
### アップデートの確認
    su - /* 更新可能なユーザーに変更
    cd [Mautic Root] /* Mauticのルートフォルダに移動
    php bin/console mautic:update:find /* 更新の確認

### アップデートの実行
    php bin/console mautic:update:apply

### --finishの実行
    php bin/console mautic:update:apply --finish

これで完了。ただし、403になるケースがあり、フォーラムでもやり取りされています。
[こちらの記事](https://forum.mautic.org/t/403-forbidden-after-fresh-install-with-softaculous/23891/11)を参考に、.htaccessを修正します。



## .htaccesの修正
    # Deny access via HTTP requests to all PHP files.
    <FilesMatch "\.php$">
        #Require all denied　/* この行のコメントアウト
    </FilesMatch>

## キャッシュクリア
    php bin/console cache:clear
python conda pip「WARNING: Retrying (Retry(total=4, connect) after connection broken by 'ProxyError」エラーの対処法

会社で conda env 環境構築時に, 下記のようなエラーに遭遇しました。

```
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Your proxy appears to only use HTTP and not HTTPS, try changing your proxy URL to be HTTP. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#https-proxy-error-http-proxy', SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1129)')))': /simple/numpy/
```

会社でこれまでは conda install も pip も正常に使用出来ていて, proxy の設定も問題が無いはず. 急にエラーが出るようになった。ハマってあれこれ試行錯誤, なんとか 対処法が分かりました。

結論： pip のバージョンを 20.2.4 以下にする (22.0 などにしない)

これで解決します。
新しく conda の 環境を生成する際にも、pip のバージョンを指定しましょう (指定しないと22.0 など最新のpip がインストールされてしまう)

```
conda create -n torchRT8b python=3.9 pip=20.2.4
```

※pip 22 が proxy 環境下で使用出来ないのは, openssl 証明書関連の問題のようですが、その対処方法が分からないため pip 20 を使用。これで問題なくpytorch 1.12 等も使用可能。

もし意図せずpip および urllibをアップデートしてしまった場合は, conda install を用いてダウングレードすればOK

```
conda install pip==20.2.4 urllib3==1.26.18
```
UbuntuコンテナでEXLAが動かない

# 本記事について

UbuntuコンテナでEXLAを動かそうとしたら依存関係で詰まったので、備忘録として残しておく

# 環境

- macOS Ventura 13.2.1
- Rancher Desktop 1.7.0
- Ubuntu 22.04.1 LTS (Jammy Jellyfish)
- Erlang 25.2.3
- Elixir 1.14.3
- Nx 0.5.1
- EXLA 0.5.1

# 解決方法

```dockerfile:Dockerfile
FROM hexpm/elixir:1.14.3-erlang-25.2.3-ubuntu-jammy-20221130

# For EXLA (xla)
RUN apt-get upgrade -y \
  && apt-get update \
  && apt-get install --no-install-recommends -y \
  curl \
  build-essential \
  ca-certificates \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
```

# 遭遇したエラーと対策

```bash
** (RuntimeError) expected either curl or wget to be available in your system, but neither was found
```

→ curl をインストール

```bash
** (RuntimeError) could not find v0.4.4 release under https://github.com/elixir-nx/xla/releases
```

→ ca-certificates をインストール ( HTTPS接続に対応させるため )

```bash
** (Mix) "make" not found in the path. If you have set the MAKE environment variable,
please make sure it is correct.
```

→ build-essential をインストール
Railsクイズ 初心者向け


# ルール
全5問
1問あたり15秒で答える！
paramsは　`{name: 'なまえ'}`

答えは最後にまとめて

# 第1問

できる？　できない？
```
user = User.new()
user.create(params)
```

# 第2問

できる？　できない？
```
user = User.new()
user.update(params)
```

# 第3問

できる？　できない？
```
user = User.new()
user.save(params)
```

# 第4問

返り値は？
インスタンス?  boolean?
```
User.create!(name: 'namae')
```

# 第5問

返り値は？
インスタンス?  boolean?
```
user = User.create()
user.update!(name: 'namae')
```
　
　
　
　
　
　
　

　
　
　
　
# 感想
チームメンバーに出題してみて意外と面白かったです
何問正解できましたか？　



# 答え

1. できない
2. できる
3. できない
4. インスタンス
5. boolean
C#.NETでミューテックスを使って重複起動禁止

# やり方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/956238a7-c09e-34ff-eba8-1f6b84e44980.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f605df3c-3453-af9c-1b4e-48ae444f730d.png)

```c#:サンプルプログラムコード
using System;
using System.Threading;
using System.Windows.Forms;

namespace MutexTest
{
    internal class Program
    {
        static void Main(string[] args)
        {

            string mutex_name_ = "mumumu";

            bool is_created_new_;

            //ミューテックス取れるかどうか。
            Mutex mutex_ = new Mutex(true, mutex_name_, out is_created_new_);

            if (!is_created_new_)
            {
                //何がどうしてダメなのかユーザーに見せて、後から起動したものは終了。
                MessageBox.Show("アプリ『" + mutex_name_ + "』が起動中。2つ以上の同時起動ダメ。");
                mutex_.Close();
                return;
            }

            //アプリ起動中のままにしておくため、入力待ちで止める。
            Console.ReadLine();

            //アプリ終了時にはミューテックス解放。
            //例外時に解放漏れをしないようにtry catchのfinallyで行った方がいい。
            //これはサンプルコードなのでそこは行わない。
            mutex_.ReleaseMutex();
            mutex_.Close();

        }
    }
}
```

# 参考サイトさん

https://wa3.i-3-i.info/word13360.html

https://www.fenet.jp/dotnet/column/language/3862/

https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/145winmutex/winmutex.html

# バージョン

Windows 10 Pro 22H2 OSビルド 19045.2604
Microsoft .NET Framework Version 4.8.04084
Safari でピクチャインピクチャする AppleScript

# そもそもピクチャインピクチャとは？

> パソコンやテレビの画面の一部に、小さな画面を別表示すること。パソコンの操作画面上にテレビ、動画、ウェブカメラの映像を表示したり、テレビの画面上に別のチャンネルの映像を流したりすることを指す。（デジタル大辞泉）

つまり PC で、他の作業しながら右下とかには動画を流し続けるアレです。


Mac の Safari でも動画を常に最前面に表示させたまま、Safari の別ページに切り替えたり、Safari は非表示にして別のアプリを操作したりできます。なんなら仮想デスクトップを切り替えたりしても最前面で表示してくれます。


# Safari でピクチャインピクチャする AppleScript

AppleScript は以下の通りです。

```applescript:AppleScript
tell application "System Events" to tell process "Safari" to tell first window to tell first toolbar
	tell (first group whose role description of first UI element is "tab group")
		
		-- メニューを出す
		perform action "AXShowMenu" of button 2 of (radio button 1 whose value is true) of UI element 1
		
		delay 0.1
		
		-- メニュー項目に「Picture in Picture」が存在するかどうかで場合分け
		if name of menu item 2 of menu 1 contains "Picture in Picture" then
			
			-- 存在する場合はそのメニュー項目をクリック
			click menu item 2 of menu 1
			
		else
			
			-- 存在しない場合は ESC キーを押す
			key code 53
			
		end if
	end tell
end tell
```

※「Picture in Picture」の部分は言語設定が英語の場合。


## 簡略的な解説

この AppleScript は、

1. **ツールバーのタブグループという UI 要素の、いま開いているタブの右端の「･･･」の部分をクリックしてメニューを出す（`perform action "AXShowMenu" of button ～`）**
2. **メニュー項目に「Picture in Picture」が存在する場合はそれをクリックし、存在しない場合は ESC キーを押す（`click menu item ～`）**

という2つのことをしているだけです（にもかかわらずやたら長いのは、それぞれの UI 要素にたどり着くためのパスが長いからです）。

質問があればコメントにどうぞ。
【Solidity】(tips)mappingとネストされたmapping


mappingとネストされたmappingについて下記します。
Sampleのcontractではmappingを用いて、アドレスaddress→そのアドレスが持っているお金の残高uint型を定義します。
※deleteによりmappingを初期値に戻すことができます。
Sample2のcontractでは、アドレス①address→(アドレス②address→そのアドレスが持っているお金の残高uint)型を定義します。
こちらの意味に関しては、あるアドレス①が、あるアドレス②へお金を割り当てる際に使用します。
つまり、あるアドレス①があるアドレス②へ割り当てたお金の残高をデータとして管理することができます。

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Sample {
    mapping(address => uint) public balance;

    function sendMoney(address _address, uint _amount) public {
        balance[_address] = _amount;
    }

    function remove(address _address) public {
        delete balance[_address];
    }
}

contract Sample2{
   mapping(address => mapping(address=>uint)) public balance;

   function sendMoney(address _address, uint _amount) public {
        balance[msg.sender][_address] = _amount;
    }

    function remove(address _address) public {
        delete balance[msg.sender][_address];
    }
}
```
※RemixIDEにより動作確認
Azure 可用性ゾーンの物理ゾーンと論理ゾーンのマッピングの確認

# 本記事について

Azure で高可用性を持つアーキテクチャを構成するオプションとして、データセンターレベルでの分離となる[可用性ゾーン](https://learn.microsoft.com/ja-jp/azure/reliability/availability-zones-overview)があります。可用性ゾーンは各リージョンに3つ以上存在しますが、その物理的なゾーン番号と各ユーザーのサブスクリプションに表示される論理的なゾーン番号は異なります。それぞれ物理ゾーンの番号と各サブスクリプションごとに設定された論理ゾーンの番号はマッピングされており、[Check Zone Peers API](https://learn.microsoft.com/ja-jp/rest/api/resources/subscriptions/check-zone-peers?tabs=HTTP&tryIt=true&source=docs#code-try-0) にてチェックできます。

本記事では、[Check Zone Peers API](https://learn.microsoft.com/ja-jp/rest/api/resources/subscriptions/check-zone-peers?tabs=HTTP&tryIt=true&source=docs#code-try-0)の使い方を見ていきます。

# Check Zone Peers の使い方

## リソースプロバイダーの登録

まず、リソースプロバイダーの登録が必要です。Azure CLI だと下記コマンドを実行します。

```bash
az feature register -n AvailabilityZonePeering --namespace Microsoft.Resources
```

## Bearer トークンの取得

次に API 実行のために、Bearer トークンを取得します。

```http
POST https://login.microsoftonline.com/<テナントID>/oauth2/token
```

Header は Content-Type: application/x-www-form-urlencoded とし、それぞれ下記の値を入れます。

```
grant_type: client_credentials
client_id: <サービスプリンシパルのアプリケーションID>
client_secret: <サービスプリンシパルのシークレット>
resource: https://management.azure.com/
```

PostMan での実行例は、下記になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/b3200ede-6f3a-94d5-23cd-06e82732dcef.png)

## Zone Check Peers の実行

下記の API Call を実行します。

```http
POST https://management.azure.com/subscriptions/<サブスクリプションID>/providers/Microsoft.Resources/checkZonePeers/?api-version=2020-01-01
```

Authorization を Bearer にし、さきほど取得したトークンを入れます。Content-Type を application/json にし、Body に下記を入れます。（下記は東日本リージョンを検索する例です。）

```JSON
{
  "location": "japaneast",
  "subscriptionIds": [
    "subscriptions/<サブスクリプションID>"
  ]
}
```

Postman での実行例は下記です。（この例だと物理ゾーンと論理ゾーンの数字が同じですが、違う値を取ることもあります。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/dacb2de6-15ab-45e6-8fb9-e693323a37ce.png)

# 最後に

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
Visual Studioで単一ファイルとして発行する方法

## 前書き
Visual Studioのデフォルトの設定で発行すると.dllやら.xmlやらたくさんのファイルが出来てしまい、配布時に つ[.exe] といった感じで渡せない。
どういう設定で単一ファイルを発行できるのか調べてみた。

## 本題
* 発行の設定
プロジェクト右クリック>発行 の画面から編集をクリック
![2023-02-21_13h20_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/aa335c2d-e8cb-9bc6-ea7b-e1faa09621d3.png)
配置モードを「自己完結」に設定
「単一ファイルの作成」にチェック
![2023-02-21_13h21_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/0b91a6e4-7282-3180-e96b-1cda6a94537f.png)

* プロジェクトの設定
プロジェクトをダブルクリック
PropertyGroupに「IncludeNativeLibrariesForSelfExtract」設定を追加
![2023-02-21_13h21_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/dd2707d0-d2f6-835f-31b7-fe6e478293d5.png)

コピー用
```xml
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
```

## まとめ
これで作成されるファイル達が単一ファイル(.exe)にまとめられる
OtterspaceとSBT

# はじめに

Otterspaceは、DAO管理およびバッジ認証のツールです。
他のDAOアプリケーションとの大きな違いは、非金融DAOコミュニティを目指しているという点かと思います。(GoerliTestnetで公開されているようです)

https://otterspace.mirror.xyz/Cec_bTSsLgcohuaV5dkOJTbaYuFB6tF8jhxzN_30k1A

IV. Whales are not Otters’ friends
However, one of the main benefits of coin voting is that it is very sybil resistant, as agents would need to accumulate 51% of the tokens to take control. 

# demo

![スクリーンショット 2023-02-21 13.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/9939cacd-d576-bd6e-be7f-bdd82a333e49.png)

https://badges.otterspace.xyz/
https://github.com/otterspace-xyz/otterspace-contracts
https://github.com/otterspace-xyz/badges
https://github.com/rugpullindex/ERC4973
https://github.com/ethereum/EIPs/pull/4973


# 類似のSBT

OtterSpaceでは、4973がメインとなっているが他にもいくつか、SBTを表現する提案が存在しています

EIP 1238 Non Transferrable Non-Fungible Tokens (譲渡不能トークン)
https://erc1238.notion.site/
卒業証明書などに利用

EIP 4671 Non Tradable Token


EIP 4973 Account Bound Token
World of Warcraftにおいて、装備を取り外して、これらの装備を別のアカウントに転送できる構造をもつ。OtterSpaceなどで利用。
https://eips.ethereum.org/EIPS/eip-4973


EIP 4974 Experience Token Standard

EIP 5114 Soulbound Badge
Twitterバッジのようなもの

EIP 5192 Minimal Soulbound NFTs


# ミニマムSBTを動かしてみる

Minimal SoulBound NFTの議論はこちら
https://ethereum-magicians.org/t/final-eip-5192-minimal-soulbound-nfts/9814/4

# Account Bound Token

Account Bound Tokenの作者のブログ
https://timdaub.github.io/2022/05/30/what-are-account-bound-tokens/

具体的な実装
https://github.com/Nightfallsh4/POST

# リンク

本家
https://ottr.me/

関連記事
https://otterspace.mirror.xyz/
https://otterspace.mirror.xyz/Cec_bTSsLgcohuaV5dkOJTbaYuFB6tF8jhxzN_30k1A
https://www.daomasters.xyz/tools/otterspace
https://www.alchemy.com/dapps/otterspace

技術
https://github.com/otterspace-xyz/otterspace-contracts
https://forum.bankless.community/t/bdao-season-role-holder-badges-otterspace-pilot/4172
https://gov.optimism.io/t/introducing-otterspace-a-soulbound-badge-solution-for-daos/3221
PHP：PHP_CodeSnifferでのコーディングルール適用領域の指定方法と例外ルールの設定（XMLファイル）

コーディングルール適用も例外ルール設定もXMLファイルを作成して行う。

# コーディングルールの適用領域の指定

## XMLファイルをゼロから作成

初期記述でひとまず以下だけ書く。
・ルール名称は好みの名称
・
・ディレクトリvendor内はルール適用外の指定
・エラー箇所の文字は着色して表示する指定
・エラーログ内容を表示する指定

```xml
<?xml version="1.0"?>
<ruleset name="Custom PSR12">
<description>A custom PSR12</description>
<file>./</file>
<exclude-pattern>./vendor/*</exclude-pattern>
<arg name="colors"/>
<arg value="s"/>
</ruleset>
```

## ターミナルでXMLファイルを指定してコーディングチェックする

これにより、指定した領域のファイル全てにチェックをかけられる。

```
./vendor/bin/phpcs --standard=cordingRule.xml
```


# 例外ルールの設定
※例外ルールは本当に例外にしてはならないものもあるがこれはダミー。

超注意！　ルールの例外なくPSR12そのままのルールならばその上のargタグの最後のスラッシュと同じスラッシュを入れて終わりだが、以下のexclude（例外）を入れる場合は
(1)スラッシュを削除する
(2)</rule>で閉じるを記述する
開発していると、PSRルールそのものでは厳しすぎると言ったことがよく起こる。

```xml
<?xml version="1.0"?>
<ruleset name="Custom PSR12">
<description>A custom PSR12</description>
<file>./</file>
<exclude-pattern>./vendor/*</exclude-pattern>
<arg name="colors"/>
<arg value="s"/>
<rule ref="PSR12">
    <exclude name="Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase"/>
    <exclude name="PSR1.Files.SideEffects.FoundWithSymbols"/>
    <exclude name="PSR1.Classes.ClassDeclaration.MissingNamespace"/>
    <exclude name="PSR2.Classes.ClassDeclaration.OpenBraceNewLine"/>
    <exclude name="Squiz.Scope.MethodScope.Missing"/>
</rule>
</ruleset>
```

exclude要素の例外ルール名は、以下のようなエラー情報を表示させられるがそこに書かれている。
例：　Generic.ControlStructures.InlineControlStructure.NotAllowed

```warp
FILE: /var/www/html/test.php
------------------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
------------------------------------------------------------------------------
 16 | ERROR | [x] Inline control structures are not allowed
    |       |     (Generic.ControlStructures.InlineControlStructure.NotAllowed)
------------------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
------------------------------------------------------------------------------
```

# composer.jsonでコマンドを短縮名化
コーディングチェックは高頻度に利用するため、もっとチェック指示作業を簡単にしたい。
よって、compser.jsonで短縮名登録をしておく。
「scripts」欄で、コマンドを「composer phpcs」と打つだけで実行できるようにしている。

```json
{
    "name": "root/html",
    "autoload": {
        "psr-4": {
            "Root\\Html\\": "src/"
        }
    },
    "require": {},
    "require-dev": {
        "squizlabs/php_codesniffer": "3.*"
    },
    "scripts": {
        "phpcs": "./vendor/bin/phpcs --standard=phpcs.xml"
    }
}

```

これで、以下のコマンドだけでコーディングチェックが実行できる。

```warp
composer phpcs
```

## 真っ赤にハイライトして出力される「error code 2」とは

コーディングチェックのコマンドを実行すると、真っ赤に「error」と表示されるためとても気になるが、気にせずOK。
これは、コーディングルールチェックをして規約違反、つまりエラーがあった場合に、PHP_CodeSnifferが出力する情報なだけ。
エラーがなければ0を返し、表示されない模様。
TCP/IPについて

今回のTCP/IPについてまとめる。

# プロトコルとは？
・コンピューター同士がネットワークを利用し「パケット」を処理するときの約束事を指す。
　※パケット：ネットワークでやりとりするデータを小さな単位で分割したもの
##### プロトコルが必要な理由
　　・PCのメーカーが異なっていて、OSが異なっていても無線でも有線でも気にすること
　　　なく<font color="Red">同じパケット</font>をやり取りできる。

# TCP/IPの階層モデル
|階層　|階層名  |役割  |プロトコル　　|
|:---:|---|:---|:---:|
|4|アプリケーション層　|ユーザに対してアプリケーションを提供  　　　　　　|HTTP,DNS,SSH,SMTP|
|3|トランスポート層  |データの通信制御を行う  |TCP,UDP|
|2|インターネット層  |IPアドレスを確保・通信経路を確保する  |IP,ICMP,ARP|
|1|ネットワークインターフェイス層　　　　　　　　　　　|直接接続している機器同士を通信する  |Ethernet|

# TCP/IPの通信の流れ
![TCP_IP.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172936/bb43d66a-44ed-9cc7-2fcf-cc385185c020.png)

※カプセル化：ヘッダーをそれぞれの階層で付け加える処理のことを指す。
※非カプセル化：ヘッダーをそれぞれの階層で取り外す処理のことを指す。
Firebase & Flutter の勉強会を開催しました


はじめまして、Hirokaの高橋です。
今回は社内にて開催された勉強会について紹介します！

## 開催概要
Firebase を使った Flutter アプリを作成するハンズオンです。
Firebase や Flutter を学びながら、Connpass のようなイベント申込みアプリを作成しました。

- 日時：2023年2月19日（日）
- 場所：株式会社 HIROKA サテライトオフィス鳴門[（うずコワーク）](https://www.instagram.com/uzucowork/)
- 参加費：無料
- 主催：[GDG四国](https://twitter.com/gdgshikoku/)

## 開催内容
- オープニング・Firebase & Flutter の概要説明
- ハンズオン
- 交流会・LT会

[【資料】](https://docs.google.com/presentation/d/1OVstmFtnAVPMJgEaWmStjf69NNDy_YyQc6LKM9n8VnI/edit?usp=sharing&resourcekey=0-AIitgJhCrSpQN3YNgcMwAA)
<img width="500" alt="勉強会風景" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737838/0dc42c00-a87c-23a8-e510-f056b692b72e.jpeg">

## まとめ
弊社でGDG四国主催の勉強会は2回目でしたが、
徳島、愛媛、香川、名古屋から多くの方が足を運んでいただき予想を上回る参加人数となりました！

今回は2つの課題があり、初心者〜上級者までやりがいのあるハンズオンでした。
交流会ではIT企業さん同士の横の繋がりや、企業さんと学生さんの接点を持つことができ、
大盛況のうちに終了いたしました。
開催してくださったGDG四国オーガナイザー様、誠にありがとうございました。

Hirokaではこれからも様々な勉強会を開催していきたいと思っております。
鳴門で勉強会を開催したい方、このような取り組みに興味を持っていただけた方、
ぜひご連絡いただければ幸いです！
8thwallのimage targetの作り方

# はじめに

8thwallのimage targetを用いることで画像に3Dのオブジェクトを重ねることが可能となります。また面白いのは、コップなどの湾曲した形状にも対応しているということで今回試してみました。

ドキュメント
https://www.8thwall.com/docs/web/#manage-image-targets

# 3Dファイルを用意する

ポイントは下記のような感じ。

ポリゴン数が 35,000 トリスを超えない
結合されたファイル サイズは 10 MB を超えません
スケールは (1, 1, 1) 

https://www.8thwall.com/glb



# 画像を登録する

1
![スクリーンショット 2023-02-13 10.56.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/4e06e2a3-129c-8f36-2810-22be9d89430d.png)

2
![スクリーンショット 2023-02-13 10.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/a719ba81-304c-6da7-c2a7-892ce2523bd0.png)

3
![スクリーンショット 2023-02-13 10.57.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/4a5fbad3-741d-e2d0-f3fe-86016bcd7c92.png)

# アニメーションglbの設定

A-Frameのanimation mixierを使ったサンプルプロジェクトが用意されているので、こちらを参考につくる

https://www.8thwall.com/8thwall/animation-mixer-aframe


## blenderでアニメーションを作成する

## runを作成

アニメーション > 「タイムライン」を選択
![スクリーンショット 2023-02-14 10.33.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/225a319b-fc8a-6aa8-eb90-183fcfcabd75.png)

オブジェクトを動かしてキーフレームをセット
![スクリーンショット 2023-02-14 10.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/b8ce2c9d-7eb5-14fc-487d-fd9a667ec987.png)

アニメーション > 「ドープシート」を選択
![スクリーンショット 2023-02-14 10.35.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/03bd2ae5-9cb2-ad45-8fad-3591122823c0.png)

名前をrunに設定する
![スクリーンショット 2023-02-14 10.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/2c376412-b3f9-684c-f7e3-b28cbe3426f0.png)

## jumpを作成

新規アニメーションをセット
![スクリーンショット 2023-02-14 10.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/50b31d4b-96b4-5b70-4014-ebd563655b9b.png)

タイムラインに戻りキーフレームを削除 (xで削除する)

![スクリーンショット 2023-02-14 10.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/338bb608-6cc8-40c7-1c02-c7bd630b3983.png)

オブジェクトを動かしてキーフレームをセット

# Conclusion