OmniAICreator/Qiita-1.07M huggingface dataset:
話題の画像1枚で動画生成できるViggle AI使ってみた

## Viggle AIとは
Viggle AIとは人物の画像１枚で動画生成することができるAIです。
今、いろんな有名人がダンスをする動画がViggle AIによって生成されています。
[VIGGLE](https://viggle.ai/)

## 使い方
### Discordグループに参加する
https://discord.com/invite/viggle

参加するとViggleへようこそが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/28260568-5ea8-6844-7f3a-5168bdf783a8.png)

左下のanimate-11~animate-20のどれかをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/29bb08e8-4c66-a052-5fbd-50e5728d85d0.png)

下のメッセージを送信のところで/animateと入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/82265c68-68fb-c065-9d2b-781aa5cdf239.png)

候補で出てきた/animateをクリックすると、以下のようにimage,motion_prompt,background,finetuneが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/b5797ca5-446c-96cd-b788-d8e9c7bffa72.png)

### 画像を選択
imageをクリックして画像を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/15d14f19-11af-0fc8-f75f-145fab89a70e.png)

### プロンプト（画像の人物を埋め込む動画）を選択
motoin_promptは[prompt](https://viggle.ai/prompt)ここから選択して選ぶ。
今回は$el_future_danceを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/6a8dd63d-8d4a-b025-12b3-853fa80b43d0.png)

### バックグランドを選択
white,Green,From template(プロンプトで選んだ動画のまま)が選択できる。
今回はFrom templateを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/3a37a7b8-8e40-b5fc-2ed7-6925d8af4689.png)

### 動画の精度を選択
finetuneをonにすると、生成に時間はかかるが高精度の動画が生成される。
今回はonを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/9ebf85e7-a4c2-8dbf-b506-d959fd25dea1.png)

## 動画生成
送信すると動画が生成される。2,3分ほど待つと動画ができる。
自分の動画が見つからないときは、右上のメンションから自分を探す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/0ab68b1f-9964-0a51-17dd-cee6222bda4a.png)

実際に生成された動画
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/b704cb36-6cbe-5cce-e4cf-694c811286ed.png)

## 感想
画像1枚で簡単に動画生成できてすごいと思いました。
誰もが、特別な技術がなくても動画生成できる時代になってきましたね。
ぜひ、興味のある方はやってみてください。
水平走査線についてかんがえる


参考

https://www.wizforest.com/OldGood/ntsc/#raster


x arduinoは、あまり関係ないよ(液晶でちょつと

目的
たぶん、VDPや液晶に理解できないと思うので
ちょつと解説

じゃじゃん~~~~~~~~~
例のぶつ

![o_coq138.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0f5dbfb4-bf31-cb40-7f7c-4e9184e37612.jpeg)

ブラウン管テレビでーす。

故障すると1点の点だけが表示されます。(やばい)

左から右に点が流れていったものが「水平走査線」だよ!!

![o_coq139.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6c4fa004-c623-a4ad-b593-7a972977585a.jpeg)

TTLとかのカウンターでタイミングを取っているよ

MSXやファミコンは、専用のコントローラで表示させているよ
MSXのは、「VDP」と言うよ

DOS/V VGAやPC-9801は、主に汎用のTTLでビデオ出力回路は、組んでいるよ
当然、ビデオコントローラも使っているが画面サイズ等の設定用だよ

ST7735等の液晶は、どちらかと言えば「VDP」に近い形だよ

データは、左から右に入っているよ
ラインは、上から下に進むよ

```

        12345678
12345678        12345678                
000100000110000000110000000000000000000000000...
001100001001000001001000000000000000000000000...
010100000000100000000100000000000000000000000...
000100000000100000111100000000000000000000000...
000100000001000000000100000000000000000000000...
000100000010000001001000000000000000000000000...
000100001111100000110000000000000000000000000...
000000000000000000000000000000000000000000000...


```

ドットスキャン方式は、1ドット毎に処理する
1ラインバッファー方式は、暇な時に1ライン分作っおくよ
2ラインバッファー方式は、1ライン毎交互に処理するよ

98系は、1ドット分そのまま出力するよ
MSX系は、交互に出力と書かれているが確認は、とれていないよ

なんとなく、左から右に流れていくと言う事と
表示されない時間があると言う事がわかれば合格だよ!!!

●おまけ

x 黒がダブって1色、潰れる

デジタルRGB と　アナログRGB があるよ

デジタルRGBは、8色　で　TTL 5Vがそのまま出ているよ

アナログRGBは、8色+ロー、ハイの16色だよ
16色の時は、オペアンプでロー、ハイだしているが理解が足りないので参考まで

![o_coq140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9329d973-c1ad-c82e-041a-276630cfb4f1.jpeg)


![o_coq141.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7f8cb197-eb26-02b4-72b7-ffe962fb603e.jpeg)
sphinx



インストール
```
pip install sphinx sphinx_rtd_theme sphinx-autobuild
```




sphinxの実行
```
#
# -F, conf.pyやmakeファイルを生成するオプション。スフィンクスPJの最初だけつける
# -H <PJ名>
# -A <作者>
# -V <version>
# -o <出力先ディレクトリ>
# 最後に対象のソースコードが入ったディレクトリを指定する
sphinx-apidoc -F -H kaida_PJ0525 -A Ryosuke -V 0.0.1 -o ./docs ./mylibraries
```


conf.py
```
import os
import sys

sys.path.insert(0, os.path.abspath('../mylibraries'))


# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html

# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information

project = 'kaida_lib'
copyright = '2024, ryosuke'
author = 'ryosuke'

version = '0.0.1'
release = '0.0.1'

# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.viewcode',
    'sphinx.ext.todo',
    'sphinx.ext.napoleon'
]

templates_path = ['_templates']
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']

language = 'ja'

# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output

html_theme = 'sphinx_rtd_theme'
html_static_path = ['_static']

# -- Options for todo extension ----------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/extensions/todo.html#configuration

todo_include_todos = True


```

ビルド
```
# sphinxビルドコマンドを実行
# -b: ビルダー。HTMLを指定してあげる
# 次に、ビルド用のコードが入っているディレクトリ。つまり./docs
# 最後に、ビルド先のディレクトリ。つまり./docs/_build
sphinx-build -b html ./docs ./docs/_build

```
word


```python

# Documentオブジェクトを作成
doc = docx.Document()

# 1ページ目
doc.add_paragraph('目次')
# 改ページ
doc.add_page_break()


# 2ページ目(文章の練習)
# タイトルを追加
doc.add_heading('1. 要旨', level=1)
# パラグラフ(本文)を追加
doc.add_paragraph('Hello, this is a paragraph.')
# タイトルを追加
doc.add_heading('Section2-1', level=2)
# 別のパラグラフを追加
doc.add_paragraph('This is another paragraph.')
# 改ページ
doc.add_page_break()


# 3ページ目(画像の練習)
# タイトルを追加
doc.add_heading('2. 結果', level=1)
# 画像の追加
doc.add_picture('output/acc1.png', width=docx.shared.Inches(3))
doc.add_picture('output/acc2.png', width=docx.shared.Inches(3))
doc.add_picture('output/acc3.png', width=docx.shared.Inches(3))

# 改ページ
doc.add_page_break()


# 4ページ目を挿入(テーブルの練習)
# タイトルを追加
doc.add_heading('3. 引用文書一覧', level=1)

table3_1 = doc.add_table(rows=3, cols=3)

# 各セルにテキストを挿入
table3_1.cell(0, 0).text = "Row 1, Cell 1"
table3_1.cell(0, 1).text = "Row 1, Cell 2"
table3_1.cell(0, 2).text = "Row 1, Cell 3"

table3_1.cell(1, 0).text = "Row 2, Cell 1"
table3_1.cell(1, 1).text = "Row 2, Cell 2"
table3_1.cell(1, 2).text = "Row 2, Cell 3"

table3_1.cell(2, 0).text = "Row 3, Cell 1"
table3_1.cell(2, 1).text = "Row 3, Cell 2"
table3_1.cell(2, 2).text = "Row 3, Cell 3"


# ファイルを保存
doc.save('new_document.docx')
```
[Docker] DjangoRESTframeworkとVue.js間の通信ができない問題

# はじめに
研究の一環で，DjangoRESTframework(以下DRF)とVue.jsを使ってWebアプリを作ることになり，Webアプリ初心者の私が丸１日嵌ってしまった問題について書いています．同じような方の参考になれば幸いです．

# 問題背景
Docker ComposeでDRFとVue.jsの環境構築を行いました．以下の記事を参考に，それぞれのコンテナ内でチュートリアルを済ませたものの，コンテナ間のAPI通信がうまくいかず躓いてしまいました．

https://blog.fantom.co.jp/2023/04/02/vue-django-rest-framework-api-1/

エラー内容としては，Vue Routeを利用してSPAのルーティングを行なった際，localhostにアクセスすると適切なページが表示されなかった，というものです．

# 環境
今回問題が発生した環境を以下にまとめます．
- バージョン
    - vue: 5.0.8
    - django: 4.2
- DjangoとVue.jsのコンテナは同一のコンテナネットワーク内に配置されている
- コンテナのポート番号はそれぞれ8000番と8080番を使用

# 原因
色々と調べてみると，今回のエラーの原因となっている箇所が２つありました．
### その１ コンテナ間のURL指定
以下のvue.config.jsファイル内の`target: "http://localhost:8000/",`部分が原因のようです．
```js:vue.config.js
 devServer: {
    host: "localhost",
    hot: "only",
    proxy: {
      "^/api": {
        target: "http://localhost:8000/",
        changeOrigin: true,
      },
    },
  },
```
どうやらVueコンテナで`localhost`と記述すると，そのコンテナ内でポート番号を探索するため，別のコンテナにアクセスする場合は，`localhost`の代わりに`コンテナのサービス名`を記述する必要があるみたいです．
### その２　ポート番号の重複
Vueコンテナでは，コンテナ外からのアクセスのポート番号を8080番としている．この状態でVueの開発サーバーをポート番号8080番で立ち上げると，ポートの競合が発生してしまい，コンテナ外との通信がうまういかなくなってしまいます．
そのため，vueの開発サーバーのポート番号を変更する必要があります．

# 解決方法
上記２つの問題を解決するためにvue.config.jsファイルを以下のように変更します．
```js:vue.config.js
 devServer: {
    host: "localhost",
    port: 8081,      // サーバーのポート番号を8081に変更
    hot: "only",
    proxy: {
      "^/api": {
        target: "http://django:8000/",   // 'localhost'の代わりに'コンテナのサービス名を使用'
        changeOrigin: true,
      },
    },
  },
```
これにより，DRFコンテナとVueコンテナ間のAPI通信が可能になりました！

# 参考
https://zenn.dev/kettle_tomorrow/articles/df3bba621a1e43

https://qiita.com/FuuMuuToi/items/8fea28a0a771375383c9
AWKちょいメモ


# セットアップ
WSL Ubuntu の gawk を使うものとする

# Help

```
$ gawk
Usage: gawk [POSIX or GNU style options] -f progfile [--] file ...
Usage: gawk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:          GNU long options: (standard)
        -f progfile             --file=progfile
        -F fs                   --field-separator=fs
        -v var=val              --assign=var=val
Short options:          GNU long options: (extensions)
        -b                      --characters-as-bytes
        -c                      --traditional
        -C                      --copyright
        -d[file]                --dump-variables[=file]
        -D[file]                --debug[=file]
        -e 'program-text'       --source='program-text'
        -E file                 --exec=file
        -g                      --gen-pot
        -h                      --help
        -i includefile          --include=includefile
        -l library              --load=library
        -L[fatal|invalid|no-ext]        --lint[=fatal|invalid|no-ext]
        -M                      --bignum
        -N                      --use-lc-numeric
        -n                      --non-decimal-data
        -o[file]                --pretty-print[=file]
        -O                      --optimize
        -p[file]                --profile[=file]
        -P                      --posix
        -r                      --re-interval
        -s                      --no-optimize
        -S                      --sandbox
        -t                      --lint-old
        -V                      --version

To report bugs, see node `Bugs' in `gawk.info'
which is section `Reporting Problems and Bugs' in the
printed version.  This same information may be found at
https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.
PLEASE do NOT try to report bugs by posting in comp.lang.awk,
or by using a web forum such as Stack Overflow.

gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.

Examples:
        gawk '{ sum += $1 }; END { print sum }' file
        gawk -F: '{ print $1 }' /etc/passwd
```

# 入力ファイル
```
$ cat test.csv
1,ringo,100,3
2,banana,150,2
3,mango,300,1
```

# １カラム目だけ出力する

```
$ gawk -F , '{print $1}' test.csv
1
2
3
```

# 各カラムをそのまま出力する。区切り文字は半角カンマとする。
```
$ gawk -F , '{print $0}' test.csv
1,ringo,100,3
2,banana,150,2
3,mango,300,1
```

# 各カラムを連結して出力する。区切り文字は半角カンマとする。
```
$ gawk -F , '{print $1","$2","$3}' test.csv
1,ringo,100
2,banana,150
3,mango,300
```

# ３カラム目と４カラム目をかけ算して出力
```
$ gawk -F , '{print $0","$3*$4}' test.csv
1,ringo,100,3,300
2,banana,150,2,300
3,mango,300,1,300
```
# ３カラム目と４カラム目のかけ算を合計して出力
```
$ gawk -F , 'BEGIN{} {goukei+=$3*$4} END{print goukei}' test.csv
900
```
# ３カラム目と４カラム目のかけ算の平均を出力
```
$ gawk -F , 'BEGIN{} {count++; goukei+=$3*$4;} END{print goukei/count}' test.csv
300
```
# AWK プログラムを別ファイルにして実行する
```
$ cat hello.awk
BEGIN{}
{count++; goukei+=$3*$4;}
END{print goukei/count}
$ gawk -F , -f hello.awk test.csv
300
```

# 最後の行まで合計して出力

```
$ cat test.csv
1,ringo,100,3
2,banana,150,2
3,mango,300,1

$ gawk -F , '{ sum += $4 }; END { print sum }' test.csv
6
```
Pythonにてプロ野球の打率トップ5自動抽出

# この記事について
プロ野球ファンなら誰しも一度は見たことがあるであろうスポナビにて今回はセリーグ、パリーグに分けたトップ5を抽出しエクセルに出力するツールを作成いたしました。
打率の5傑を確認したいときに最適なツールとなっております。(後で本塁打と打点、OPSも作成予定)
ご興味があればご自由にお使いください。
# 今回作成したソースコード
※pipでインストールするものは事前にしておいてください。
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd

# URL
url = "https://baseball.yahoo.co.jp/npb/stats"
r = requests.get(url)

# 接続確認
if r.status_code == 200:
    print("接続に成功しました")
else:
    print("接続に失敗しました")

soup = BeautifulSoup(r.text, "lxml")

# 打率データが含まれるセクションを探す
atbat_section = soup.find_all("section", class_="bb-splits__item")

# データを格納するリスト
atbat_data = []

# 各セクションのデータを抽出
for section in atbat_section:
    lines = section.text.strip().split('\n')
    for line in lines:
        if line:
            atbat_data.append(line.strip())

# 出力データの初期化
se_league_data = []
pa_league_data = []

# データの分割と整理
is_se_league = True  # 初期状態はセ・リーグ

for data in atbat_data:
    if 'パ・リーグ' in data:
        is_se_league = False  # パ・リーグに切り替え
    if '順位' in data or '成績一覧を見る' in data:
        continue  # 不要な行をスキップ
    if "本塁打" in data:
        break
    if is_se_league:
        se_league_data.append(data)
    else:
        pa_league_data.append(data)

# データの整形
def format_data(data_list):
    formatted_data = []
    for i in range(1, len(data_list), 4):  # 4つの要素ずつ処理する
        if i + 4 < len(data_list):  # 現在の要素から4つ後にデータがある場合
            player_data = {
                "順位": data_list[i],
                "選手名": data_list[i + 1],
                "チーム名": data_list[i + 2],
                "打率": data_list[i + 3]
            }
            formatted_data.append(player_data)
    return formatted_data

se_league_formatted = format_data(se_league_data)
pa_league_formatted = format_data(pa_league_data)

# DataFrameの作成
se_leagu_df = pd.DataFrame(se_league_formatted).drop(0)
pa_leagu_df = pd.DataFrame(pa_league_formatted).drop(0)

# DataFrameの表示
print("セリーグ 打率データ")
print(se_leagu_df)
print("パリーグ 打率データ")
print(pa_leagu_df)

# エクセル出力
se_leagu_df.to_excel("セリーグ打率データ.xlsx", index=False)
pa_leagu_df.to_excel("パリーグ打率データ.xlsx", index=False)
```

# 実行結果
![セリーグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803740/b09715dd-758a-9421-fd36-ea07009d55c3.png)
![パリーグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803740/015ed82f-77db-09bc-eea3-b6f603234890.png)

# 最後に
いかがでしたでしょうか。
正直それほど難しくなくPythonを知っている人であれば朝飯前だと思いますが、個人的にはPythonで何か作るのは初めてだったのでまあまあの出来でうれしい限りです。
そのうち他の要素も抽出できるコードを書いて野球の試合を見なくてもいいようになりたいです？？？
ありがとうございました。
laravelの個人的に学んだこと(ディレクトリ)

# appディレクトリ
主にアプリケーションの処理を書いていく

# bootstrapディレクトリ
初期起動時の処理

# configディレクトリ
設定ファイル

# databaseディレクトリ
データベース関連

# publicディレクトリ
画面に表示されるディレクトリ

# resourceディレクトリ
画面に描写される関連ファイルの元となるディレクトリ

# routesディレクトリ
ルート定義のディレクトリ

# storageディレクトリ
倉庫

# testディレクトリ
テスト関連

# vendorディレクトリ
railsでいうgemみたいなもの
railsのemail_fieldのバリデーションが効かない

## 発生した事象
フォームヘルパーのemail_fieldにはバリデーションがあります。
email形式でない文字を入力した際に「メールアドレスに「＠」を挿入してください～」というような文言が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/0a58c8f7-177e-8c9a-e6dd-3e7369cd399b.png)

該当コード
```erb
  <div>
    <%= form.label :name, style: "display: block" %>
    <%= form.text_field :name %>
  </div>

  <div>
    <%= form.label :email, style: "display: block" %>
    <%= form.email_field :email %>
  </div>

  <div>
    <%= form.submit %>
  </div>
```

このときに<%= form.submit %>の部分を以下のbuttonタグに置き換えます。
```erb 
  <div>
    <button type="button" onclick="submit()">Create User</button>
  </div>
```

とすると下の写真のようにemail_fieldのバリデーションが効きません、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/b7a9ae8a-5047-5eb1-a6cb-aa6e71f651e2.png)

## 原因
原因としましてはonclick="submit()"でした。
onclick="submit()"を使用すると、フォームヘルパーのバリデーションが効かないみたいでした。
onclick="submit()"だとページリロードが走っているので、バリデーションをスキップしてしまってるのかもしれません。

## 以下追記
コメントで[requestSubmit()](https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/requestSubmit)を使用すると行けるのではということで、試してみた結果requestSubmit()だとバリデーションが効きました。
```html
<button type="button" onclick="requestSubmit()">Create User</button>
```
モノイドとプロ函手~表現論を齧ろう~

## 自己射はモノイドを構成する．
### モノイドとは
集合$A$と演算$(\cdot):A\times A\rightarrow A$の組$(A,\cdot)$であり，次を満たすものを言う．
* 演算が結合的であること．
  任意の$a,b,c\in M$に対し，
  ```math
  (a\cdot b)\cdot c=a\cdot (b\cdot c)
  ```
  が成り立つ．
* 単位元が存在すること．
  単位元$e\in M$が存在し，任意の$m\in M$に対し，
  ```math
  m\cdot e = e\cdot m = m
  ```
  が成り立つ．

### 自己射の集合がモノイドになるということ．
対称が$1$つしかない圏$\mathbb{1}$の対象$*$を考える．
この時$\text{Hom}(\*,\*)$はモノイドとなる．
なぜならば，圏の公理により合成可能な圏の射の組$f,g,h$には結合法則$f\cdot(g\cdot h)=(f\cdot g)\cdot h$が成り立ち，あらゆる対象には恒等射$id_{\*}:\*\rightarrow\*$が存在するので，射の合成を演算とし，恒等射を単位元と考えると$\text{Hom}(\*,\*)$はモノイドとなる．
この時次のような函手を考えることができる．
```math
\begin{align}
\Delta_\mathbb{1}^{(*)}&:\mathbb{1}\rightarrow\mathbb{Set} \\
\Delta^\mathbb{1}_{(*)}&:\mathbb{1^{op}}\rightarrow\mathbb{Set}
\end{align}
```
それぞれモノイドを導くが，片方は共変，もう片方は反変となっている．
つまり$a,b:*\rightarrow *$に対して，
```math
\begin{align}
\Delta_{(a\cdot b)}^{(*)} &= \Delta_{(a)}^{(*)} \cdot \Delta_{(b)}^{(*)} \\
\Delta^{(a\cdot b)}_{(*)} &= \Delta^{(b)}_{(*)} \cdot \Delta^{(a)}_{(*)}
\end{align}
```
## モノイドの作用とプロ函手
モノイドの作用とは集合$X$とモノイド$M$に対して，写像$\varrho:X\times M\rightarrow X$であって，次を満たすものを言う．
略記として，$\varrho(m,x)=\varrho_m(x)$を用いる．
* モノイドの単位元$e\in M$と$x\in X$に対して，
  ```math
  \varrho_e(x)=x
  ```
* モノイドの元$m,n\in M$に対して，
  ```math
  \varrho_{(m\cdot n)}(x)=\varrho_m(\varrho_n(x))
  ```
これを圏として解釈する．
函手$P:\mathbb{1}\times\mathbb{Set}\rightarrow\mathbb{Set}$を考え$P(*,S)=S$とすると，モノイドの作用となる．
* ```math
  P(id_*,S)=id_{P(*,S)}=id_{S}
  ```
* ```math
  P(a\cdot b,S)=P(a,S)\cdot P(b,S)
  ```
ここで第一成分を反変成分として考えると，$P:\mathbb{1^{op}\times\mathbb{Set}\rightarrow\mathbb{Set}}$となり，
* ```math
  P(id_*,S)=id_{P(*,S)}=id_{S}
  ```
* ```math
  P(a\cdot b,S)=P(b,S) \cdot P(a,S)
  ```
プロ函手としてモノイドの作用をとらえることができる．
また$\mathbb{Set}$の代わりにベクトルの圏を用いると，
$P:\mathbb{1}\times\mathbb{Vect}\rightarrow\mathbb{Vect}$はモノイドの表現となる．
PowerAutomateDesktop: テーブル使ってなくても、テーブルで取れるんですね

# 背景

会社にて、PAD でデータ取れないって相談があがっていた。

最近触ってなかったなと思ったので試してみた記録

# 概要

- [Fanuc](https://fanuc.co.jp/) さんの更新情報がみたい

- 普通にテーブルで取れるかと思ったら、テーブル使ってない、という落ち
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/be95998d-69fa-0594-7c54-3e9b0f1de993.png)

- とはいえ、やってみたら、取れたって話

# 詳細

- 設定をこんな感じにすると
   - 基本 <code>#main > div.update-outer > section:nth-child(1) > div > dl</code>
       - ここは、デバッグツールでコピーするだけかな![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ce0276d0-e7d5-8734-d41f-a7049c5a5022.png)

   - #Value3(件名): <code>dd:eq(1) > a:eq(0)</code>
       - 日付のところは、<code>dd.news-item__date</code> としたほうが間違いはない。
       - 二件目以降は、eq() の番号を増やせば OK
   - 記事については、件名とURLを以下で取得
       - <code>href</code>
       - <code>innerHTML</code> もしくは<code>own Text</code>
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/79f996e6-420f-4f2c-8930-39eba78c97a6.png)

- いい感じに取れました![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/78cc92e3-3cd0-0e88-572c-3e7a45426e2b.png)

- 実際に取得するとこんな感じ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/06e0d398-82cc-6397-f59b-0fb1a60fe14f.png)


# あとがき

こういう感じでのデータ取得が、CLoud 版の Automate でも簡単に取れるようになるとありがたいんですけどね :thinking:
Google ChromeでMediaStreamSourceの音がならない問題

[simple-peer](https://github.com/feross/simple-peer)を使ってボイスチャットをするwebアプリを作ってたらstream関連のWeb Audio APIで3時間くらい沼にはまってしまったので供養しようと思います。

# 問題提起
```javascript:良い例.js
peer.on("stream", stream => {
    const audioElement = document.querySelector("audio");
    audioElement.srcObject = stream;
    audioElement.play();
});
```
simple-peerの[githubに例示されている](https://github.com/feross/simple-peer?tab=readme-ov-file#videovoice)ようにAudioElementのsrcObjectに直接streamを代入した場合はどのブラウザでも音が鳴るのですが、
```javascript:良くない例.js
let audioContext = new AudioContext();

peer.on("stream", stream => {
    const audioElement = document.querySelector("audio");
    const mediaStreamSource = audioContext.createMediaStreamSource(stream);
    const destination = audioContext.createMediaStreamDestination();
    mediaStreamSource.connect(destination);
    audioElement.srcObject = destination.stream;
    audioElement.play();
});
```
Web Audio APIを噛ませた場合、Safariなどでは音が鳴るのにも関わらずChromeでは音が鳴らなくなってしまいます。

# 原因
何年も前からあるChromeのバグ ( https://issues.chromium.org/issues/40094084 ) が原因のようで、elementのsourceになっていないstreamは音がならないようになってしまっているようです(多分)。

# で、どうすればいいのよ？
適当なelementのsrcObjectに生のstreamを入れた後、別のelementにWeb Audio APIから出力したstreamを入れるとChromeでも鳴るようになります。
この時、未編集の音とWeb Audio APIで編集した音が2重で鳴ってしまうので生のstreamが入っているelementはmutedをtrueに設定しておきます。
```javascript:解決策.js
let audioContext = new AudioContext();

peer.on("stream", stream => {
    /* 適当なAudioElementのsrcObjectにstreamを直接入れる */
    const fakeAudioElement = document.querySelector("audio"); /* new Audio()とかでも可 */
    fakeAudioElement.srcObject = stream;
    fakeAudioElement.muted = true;
    fakeAudioElement.play();
    /* 別のAudioElementにWeb Audio APIから出力したstreamを入れる */
    const audioElement = new Audio();
    const mediaStreamSource = audioContext.createMediaStreamSource(stream);
    const destination = audioContext.createMediaStreamDestination();
    // TODO: write Web Audio API processing here
    mediaStreamSource.connect(destination);
    audioElement.srcObject = destination.stream;
    audioElement.play();
});
```
これで鳴るようになっている...はず！

# 参考文献
https://stackoverflow.com/questions/54514273/webrtc-via-web-audio-api-silent-on-google-chrome

https://developer.mozilla.org/ja/docs/Web/API/AudioContext/createMediaStreamSource

(最終閲覧日はともに2024/05/29)
VSCodeでLinuxサーバにSSH接続して開発する

# 投稿背景
開発の研修用に1台のWindowsServer2022のセットアップ作業を行っていたが、
・Windowsだとデフォルトではリモートデスクトップ接続の上限が２セッションである。

その旨を共有したところ、
もっと多人数で1台のWindowsServer上で開発演習ができないか...との声が。
そのため、多人数で同マシンに接続して開発するならこのやり方がいいんじゃないか、
というのを残す意図で投稿。

# VScodeでSSH接続するメリット
VSCode拡張機能を使いSSH接続することで以下のメリットがある。
・ローカルに入れるのはVSCodeだけでいい＝ローカルで環境構築しなくていい。
・Linux環境でも、VSCodeを使ってあたかもGUIのように操作できる。
・SSHなので基本何人でも接続できる。WindowsのRDPより同時接続数が多い。

Windowsでも出来るようだが、GUIの分確実に重くなるのでLinux推奨。

# VSCodeのRemote Development拡張機能をインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673518/aeab75e5-c613-5cc8-ea27-e04ffc2d63e2.png)

# ssh configの構成
HostnameにIPアドレス、IdentityFileにsshのキーを指定する。
今回はAWSでSSHキーをすでに生成済みなので、SSHキー生成などの手順は割愛。
Windowsの場合、ファイルの権限が適正に閉じていないとエラーになるので注意。
~~~
Host test
  HostName xxx.com
  IdentityFile C:\Users\userA\.ssh\xxx.pem
  User ec2-user
~~~

# 接続
構成が済めばこのようにリモートの一覧に出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673518/b17e02b3-3228-37ce-212b-146965c10c45.png)

接続！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673518/b7474eb2-caa3-5c0d-f7aa-caa93698c5b2.png)

拡張機能をSSH接続ホストに改めて入れてあげれば、何の支障もなく開発できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673518/ea07cf81-41ee-2244-4fdd-1f20bc2a5df1.png)
EC-cubeプラグインを4.3にマイグレーションしました

4.2と4.3の互換性は担保されているそうです。

# 具体的に修正したところ

### ルーティングの記述
```diff_php
+use Symfony\Component\Routing\Annotation\Route

/**
*@Route("/hello" name= "hello" methods={"GET","POST"})
*/
public function index() {

```
インポートの方法とルーティングの記述を修正

### ContainerInterfaceのインポートを変更
```php
use Psr\Container\ContainerInterface;
```

### Eccubecondigのインタンス化の削除と修正
```diff_php
-$condig = new EccubeConfig($container)
+$config = $container->get(EccubeConfig::class)->get('eccube_theme_admin_dir')
```

### helloCondigTypeの変更
```diff_php
+use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;

-public function index(ContainerInterface $container){
+public function index(ContainerBagInterface $container){
```

### Found unconstructed IntlDateFormatterエラーが、出たのでフォームをdatetimeでbuildしているファイルに下記を記述
```php
setlocale(LC_ALL, 'ja_JP.UTF-8');
\Locale::setDefault('ja');
```

参考サイト
https://doc4.ec-cube.net/update-42-43
React ノーコード/ローコードツール 4選

## はじめに
2週間前からReactの学習を始めて、Udemyで動画を見てプログラミングコーチングスクールの課題になっているTodoアプリを作っているのですが、フロントエンドが初めてということもあり、慣れない画面ばかりでちょっと疲れてきました。学習の息抜きがてらに、フロントエンドの知識がなくても高速でアプリをリリースできそうなReactのローコードツールを調べてみました。
元々、FlutterFlowというローコードツールに2年ほど前に興味をもって少し触ってみたのが、私がプログラミング学習を始めるきっかけの一つでした。ローコードプラットフォームは初学者の入口としてはとてもいいと思います。Reactのローコードツールで代表的なものを調べてみました。

## draftbit 
https://draftbit.com/

FlutterのノーコードツールFlutterFlowと並んで有名なツール。アプリ画面エディタを操作して、コーディング知識があまりない初心者でも、GUIで直感的にアプリを制作できる。ネイティブモバイルアプリ、レスポンシブWebアプリ、社内ツールを作れる。
ソースコードがダウンロードできるので、ノーコードツールにありがちな、ロックインされないの良い。

私の様に、フロントエンドの知識ほぼ0状態だと、環境構築もいらないし、とにかく動くモックを作ってリリースしたい、という状況だととても良さそう！本番環境でどこまで耐えられるアプリになるのかは不明（LPを見る限りだとアプリストアにリリースしているアプリが並んではいるのでユーザー数少ないうちは全然問題なさそう）


## Locofy.ai

デザインからコードへの変換するツール

![Monosnap Locofy.ai - ship your products 10x faster — with low code - Google Chrome 2024-05-29 20.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502843/ba82e3c8-d635-9e61-45ef-babb907aab20.png)

・1クリックでデザインをコードに変換
・コードとインタラクティブ・プレビューをすぐに確認できる
・レスポンシブレイアウトに柔軟に対応
・エクスポート、デプロイ、GitHubへの同期が可能


## Quest.AI
https://www.quest.ai/

FigmaからReactJSコードを生成するツール。
GUIで操作して画面を作ることもできる。

![Monosnap The easiest way to build React Apps _ Figma to React _ Quest - Google Chrome 2024-05-29 20.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502843/21d28332-4b59-9d8a-f9bf-0117df14014c.png)

(LPより)
・コードを一行も書かずに美しいステートアニメーションやバリアントアニメーションを作成できる
・生成されたコードを GitHub リポジトリにプッシュします。単一のコンポーネントまたはアプリ全体をプッシュすると、変更をマージ。
・独自のFigmaデザインに基づいて、フル機能のカスタムコンポーネントを作成。
・コードをエクスポート。生成されたコードは本番環境に対応し、既存の CI/CD パイプラインを使用してすぐにデプロイできる。Javascript または Typescript としてエクスポート可能。


## FigamとGPTで作る
これが本命でしょ、という気が最初からしていましたが、調べてみるととても良さそうなソリューションに思えます。（他のツールの新しいサブスク増やさなくていいからコスト的にも◎）
すでに紹介している方がいて、
https://zenn.dev/silverbirder/articles/47965727b4f05b

```
「FigmaのデザインからReactコンポーネント作成」
「完璧ではありませんが、数分程度でFigmaの1画面が構築できました。(修正は2度ぐらい)」
「ゼロから開発するよりも、ある程度雛形となるコードを作成してくれる方が時間短縮になります。
また、自身では知らない方法でコード作成してくれる場合もあり、勉強になります。」

上記URLの記事より引用

```

とのこと、これは期待できそうですね。ノーコード/ローコードじゃないかもしれませんが、フロントエンドの知識があまりなくても、Figmaが使えれば、爆速で開発できそうな気配が漂っています！



## これはピボットするプロダクトのリストでは？
以上、React ノーコード/ローコードツールを調べてみました。
非開発者・開発者両方をターゲットにしているdraftbitと、開発者向けにフォーカスして作り込んできた Locofy.aiとQuest.AIとなっていました。

draftbit以外は「Figmaでデザイン作って、Reactコードを生成」というツールばかりでした。FigmaからReactコードを作るというフローであれば、GPTかClaudeで十分なので他のツールにお金を払う必要性はあまりない様に感じます。

調べていて気付いたのですが、汎用型AIの進化が早すぎて、Locofy.aiとQuest.AIはGPTにできない価値を創出するのは相当難しくなっていると感じました。
GPT3とか3.5の頃だと、特化型AIなので、Reactへの変換精度が高いです！とかあったかもしれませんが、もはやそれはあまり余地がなくなってきていると思われます。また、開発者向けだとGUI画面では付加価値が出せないので、FigmaとGPT以外に間を変換するツールとしてのニーズはなくなっていっている様な気がします。

drafbitはノーコードツールが欲しい非開発者ニーズが取り込める余地があるかもしれないのですが、それもCopilotあたりに全部もっていかれる様な気もしますよね。GUI画面操作してモジュールを組んでいくの結構難易度高いし、学習コスト高いですからね。簡単そうに見えて以外と難しくて、ツールの学習に結構な時間がかかってしまうものです。だったらCopilotに手書きの絵をプロンプトでwebアプリ作ってもらう方が全然いいじゃん、となる様な気がしてきます。

ということで、Reactのローコードツールを調べていたら、
**「汎用型AIによってピボットを迫られているプロダクトリスト」**
を作ってしまいました。
転職日記（編集途中）


**転職日記:writing_hand_tone2:**

転職活動の経過を記録。

<br>

・目次
1.退職
2.自己分析
3.転職活動

<br>


1.退職
-
スキルアップのため退職を決断。
退職を決めたら、退職の準備をしていく。

<br>

　<INS>__①上司に相談__
 
　　退職の話を切り出すのはドキドキした。
  
　　しかし、話をしないことには退職の準備が進まないのでその狭間に立って大変だった。
  
　　退職は決断力が大事だと感じた。
  
　　仮に引き止められた場合、退職せずにそのままの会社で働いていくかどうかを考えると
  
　　きっとそうではなく、退職したいと考えるので、
  
　　<font color="DeepSkyBlue">__「なぜ退職したいか」「退職後のキャリアプラン」__</font>
  
　　をしっかり考えておくと、少し気がラクだったな。
  
<br>

　<INS>__②役職者と会話__
 
　　上司に相談してから着々と役職者へ話が進んでいった。
  
　　会話できる機会を設けてもらい、上司と会話したことを同じように伝え、
  
　  　<font color="DeepSkyBlue">__「引継ぎの調整」「退職日付」「退職届の提出方法」「貸与品の返却の仕方」__</font>
    
　　などの確認をした。
  
　　自身が担当していた業務を事前にまとめておくと、
  
　　業務を引継ぐ際、スムーズに行うことができたな。
  
 <br>
 
　<INS>__③総務と有給消化の相談__
 
　　役職者へ退職する旨を伝え終わったら、
   
　　退職の手続きを対応してくれる総務へ
  
 　 　<font color="DeepSkyBlue">__「有給がどれだけ残っているか」「使用期間の調整」__</font>

 　　を確認し、有給申請を提出した。
  

  <br>
 
　<INS>__④健康保険証や貸与品の返却__

 　　<font color="DeepSkyBlue">__「いつに何を返却」「どこへ返却」「返却方法」__</font>

　　などの不明点を最初に細かく聞いておくと、

　　返却漏れもなく、面倒なやり取りも発生しない気がするな。



<br>

2.自己分析
-
転職活動をする前に、自身について考える時間を設ける。

<br>


 　<INS>__①スキル__
  
　　自身がこれまでに経験した業務内容や

　　学習してきたことをまとめると、

　　今できることが分かって、自信を持てたな。
  
  <br>

　<INS>__②働く条件__

　　働いていく中で何を大事にしたいかは、

　　人によって様々な意見があると考えている。

　　　<font color="DeepSkyBlue">__「近場で働きたい」「年収アップしたい」「職種を変えたい」__</font>

　　と再度考えてみると、転職活動をする際に意見と一致した求人を探しやすいと感じた。

<br>

3.転職活動
-
転職活動を始めていく。


<br>

　①転職サイトの新規登録
 　②求人探し
  　③応募
   　④面接
    　⑤採用合否
　

<br>


<br>
<br>
<br>

今後も更新していきます。
Ubuntuで動作が重いときの対処法

Ubuntuで動作が重たくなることってありますよね
そういうときのための解決方法をここにまとめました

### 更新履歴
2024-05-29 記事投稿
2024-06-01 更新履歴の追加・シェルスクリプトの改善

## 環境
バージョン - Ubuntu24.04LTS
カーネル - 6.8.0-31-generic

## 1. aptコマンドを実行してみる
まず最初に、sudo apt updateなどを実行してみましょう
以下のシェルスプリクトに主要コマンドをまとめました
（ログがaptupdate.logに出力されます）
```
#!/bin/sh

echo "パスワードを入力してください"
sudo apt > /dev/null 2>&1 ; clear
sleep 1
date +"%Y-%m-%d %H:%M:%S" >> aptupdate.log 
echo " " >> aptupdate.log
echo "==== パスワードの入力 ====" >> aptupdate.log
echo "OK" >> aptupdate.log
echo " " >> aptupdate.log
echo "==== パッケージリストの更新中 ===="
echo "==== sudo apt-get update ====" >> aptupdate.log 
sudo apt-get update -y >> aptupdate.log
echo "完了"
echo " "
echo " " >> aptupdate.log
echo "==== パッケージを最新状態にアップグレード ====" 
echo "==== sudo apt-get upgrade ====" >> aptupdate.log
sudo apt-get upgrade -y >> aptupdate.log
echo "完了"
echo " "
echo " " >> aptupdate.log
echo "==== システム全体のパッケージを最新状態にアップグレード ===="
echo "==== sudo apt-get full-upgrade ====" >> aptupdate.log
sudo apt-get full-upgrade -y >> aptupdate.log
echo "完了"
echo " "
echo " " >> aptupdate.log
echo "==== ディストリビューションを最新状態にアップグレード ===="
echo "==== sudo apt-get dist-upgrade ====" >> aptupdate.log
sudo apt-get dist-upgrade -y >> aptupdate.log
echo "完了"
echo " "
echo " " >> aptupdate.log
echo "==== 必要のなくなったパッケージの削除 ===="
echo "==== sudo apt-get autoremove ====" >> aptupdate.log
sudo apt-get autoremove -y >> aptupdate.log
echo "完了"
echo " "
echo " " >> aptupdate.log
echo "==== 必要のなくなったdebパッケージの削除 ===="
echo "==== sudo apt-get autoclean ====" >> aptupdate.log
sudo apt-get autoclean -y >> aptupdate.log
echo "完了"
echo " "
echo " " >> aptupdate.log
sleep 1
echo "==== SnapStoreをアップデートしています ===="
echo "==== snap refresh snap-store ====" >> aptupdate.log
sudo killall snap-store >> aptupdate.log 2>&1
sudo snap refresh snap-store >> aptupdate.log 2>&1
echo "完了"
echo " "
echo " " >> aptupdate.log
echo "==== Ubuntuの最新バージョンを確認しています ===="
echo "==== do-release-upgrade -c ====" >> aptupdate.log
sudo do-release-upgrade -c
sudo do-release-upgrade -c >> aptupdate.log 2>&1
echo " "
echo " " >> aptupdate.log

sleep 1
echo "==== すべての処理が正常に終了しました ===="
echo "==== 処理終了 ===="  >> aptupdate.log
echo " " >> aptupdate.log
echo " " >> aptupdate.log
```

## 2. PCに挿しているUSBなどをすべて抜いてみる
PCに挿しているWi-FiモジュールやUSBドライブなどを、
一旦抜いてみてください。USBのドライバなどが動作に影響していた場合は、
この手順で解決します

## 3. Ubuntuを再起動してみる
ずっとUbuntuを動かしている場合は、メモリやCPUの動作が重くなる場合があります
その場合は、一旦再起動してみましょう

## 4. 不要なアプリやカーネルをアンインストール
Ubuntuにいらないアプリや前のバージョンのカーネルがある場合、
徐々にUbuntuの動作が重くなってきます
不要なアプリ・カーネル等をアンインストールしてみましょう

## 終わりに
UbuntuはWindowsやMacに比べて、動作が不安定です
Ubuntuを実行していて動作が重くなった場合は、
上記の手順を実行してみてください
EC2 インスタンスを既存のECS Clusterに入れたいが入らないとき

# 概要

題名の通りです。




## やろうとしたこと


```python
    userdata = """#!/bin/sh
    # ECS_CLUSTER
    echo ECS_CLUSTER={0} >> /etc/ecs/ecs.config
    """.format(CLUSTER)
    instance = ec2.create_instances(
        InstanceType=InstanceType, 'm5a.4xlarge',
        UserData=userdata,
        NetworkInterfaces=[
            {
                'AssociatePublicIpAddress': True,
                "DeviceIndex": 0,
            }],
        TagSpecifications=[
            {
                'ResourceType': 'instance',
                'Tags': [
                    {
                        'Key': 'Name',
                        'Value': 'test instance'
                    },
                ]
            },
        ],
        MaxCount=1, MinCount=1,
        CpuOptions={
            'CoreCount': CoreCount,
            'ThreadsPerCore': ThreadsPerCore
        },
        LaunchTemplate={
            'LaunchTemplateId': templateid,  # 'lt-xxxx',
            'Version': f'{template_version}' 
        },
    )
```

雑ですがこんな感じで起動テンプレートでEC2を作り、
それをクラスターにUserDataを使って紐つけようとしていましたが、クラスターに入らず、
ハマりました。


## チェックすべきこと

起動テンプレートの高度な詳細で、

IAM インスタンスプロフィール
で
ecsInstanceRole

がアサインされていることを確認してください。
私の場合はこれを忘れていたようです。


以上。
【Cognito】メール認証、電話認証をせずにユーザー認証させるように頑張ってみたお話

## 結論
ユーザー登録後(ここ重要)lambdaで強制的に権限を変更する
つまり、登録からログインする前に何かしらでlambdaを起動させる必要がある

## サインアップフォーム

```js:signin.tsx
import React, { useState } from 'react';
import { CognitoUserAttribute, CognitoUserPool } from 'amazon-cognito-identity-js';
import { poolData } from '../../../../lib/cognito';


export const SignUp = () => {
  const router = useRouter()
  const [state, setState] = useState({
    password: '',
    email: '',
    error: ''
  });

  const handleChange = (event) => {
    setState({
      ...state,
      [event.target.name]: event.target.value
    });
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    const { password, email } = state;

    const attributeList = [
      new CognitoUserAttribute({ Name: 'email', Value: email }),

    ];

    poolData.signUp(email, password, attributeList, null, (err, result) => {
      if (err) {
        setState({ ...state, error: err.message });
        return;
      }
      alert('登録完了しました。メールアドレスを確認してください。');
    });
  };

  const authexe = async () => {
    // fetchでapiの実行
    const url = `url`;
    let method = "POST";
    let headers = {
      "Content-Type": "application/json",
    };
    const body = JSON.stringify({ userName: state.email })
    // urlに対してPOSTリクエストを送る
    await fetch(url, { method, headers, body })
      .then((response) => {
        alert(JSON.stringify(response));
        return response;
      })

  }

  return (
    <form onSubmit={handleSubmit} className={style.signupForm}>
      <h1>Sign Up</h1>
      {state.error && <p style={{ color: 'red' }}>{state.error}</p>}

    <input
          type="text"
          name="email"
          value={state.email}
          placeholder="メールアドレス"
          onChange={handleChange}
          required={true}
        />

    <input
          type="password"
          name="password"
          value={state.password}
          placeholder="パスワード"
          onChange={handleChange}
          required={true}
        />

    <div onClick={onClick}> Sign Up </div>
    <div onClick={authexe}> 認証ボタン </div>
    </form>
  );
};

```

## lambdaの認証強制書き換えコード

```python:lambda
import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('cognito-idp')
    user_pool_id = "自分のユーザープールID"
    user_name = event['userName']

    # ユーザー属性を更新して確認済みに設定
    client.admin_update_user_attributes(
        UserPoolId=user_pool_id,
        Username=user_name,
        UserAttributes=[
            {
                'Name': 'email_verified',
                'Value': 'true'
            },
        ]
    )

    # ユーザーの認証ステータスを更新
    client.admin_confirm_sign_up(
        UserPoolId=user_pool_id,
        Username=user_name
    )
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

## 詰まってたところ
PreSignUp_SignUpを利用してこのコードを実行すると「ユーザーが見つからないよ！」というエラーが出ました。
これ、実行タイミング的にユーザー追加する前に実行されるみたいなので、ここでは実行できないみたいですね
Ubuntu24.04LTSにアップグレードしたらCPU使用率が爆上がりした＆解決策

## 環境
Ubuntu24.04LTS - 6.8.0-31-generic
CPU 11th Gen Intel® Core™ i7-11700 × 16
GPU NVIDIA GeForce RTX™ 3060
メモリ 16GB

## 発生した問題
Ubuntu23.10を今まで使っていたのですが、
サポート期限が迫っていたので、Ubuntu24.04LTSにアップグレードした際に、
動作がカクカクになり、CPU使用率が爆上がりしました

（以下画像は,解決後にyesコマンドを同時実行して再現したものです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691296/fa15ed9c-0cff-a363-5490-765924da9ff6.png)

## 解決策
グラフィック動作が結構重たかったので、「追加のドライバー」アプリで確認したところ、
グラフィックドライバがオープンソースになっていました。
これを一番上のプロプライエタリ・検証済みに変更したことで、
動作が解消されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691296/82fc983d-8443-51ff-1977-f381b30e46fe.png)
【Laravel】API実行時のExceptionログにリクエスト情報を含める

Webアプリケーションの開発中や運用中に、実行時例外が発生することは避けられませんが、例外が発生した際にリクエストの内容がわからないと、問題の原因を特定するのが非常に困難になることがあります。

そこで、Laravelで例外が発生した際に、リクエスト内容をエラーの詳細と共にログに出力するように設定することで、問題の原因を迅速に特定し、調査をスムーズに進めることができるようにする方法について解説をします。

# やりたいこと

Laravelアプリケーションで例外が発生したときに、リクエストの詳細情報（URL、HTTPメソッド、リクエストパラメータ、ヘッダーなど）を含むログを出力するように設定します。

これにより、ログから直接、問題の原因を調査するのが容易になります。

# コード例

### Handler.phpの編集

まず、`app/Exceptions/Handler.php` ファイルを開きます。そして、以下のように修正します。

```php
<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Request;

class Handler extends ExceptionHandler
{
    /**
     * Report or log an exception.
     *
     * @param  \Throwable  $exception
     * @return void
     *
     * @throws \Exception
     */
    public function report(Throwable $exception)
    {
        // リクエスト情報を含めて例外をログに記録
        $request = Request::all();
        $headers = Request::header();
        $method = Request::method();
        $url = Request::url();

        $logData = [
            'file' => $exception->getFile(),
            'line' => $exception->getLine(),
            'trace' => $exception->getTraceAsString(),
            'url' => $url,
            'method' => $method,
            'request' => $request,
            'headers' => $headers,
        ];

        Log::error('Exception occurred: ' . $exception->getMessage(), $logData);
    }
}
```

### コードの説明

1. **reportメソッドのオーバーライド:**
   `report` メソッドをオーバーライドし、例外が発生した際にリクエスト情報を含めて例外をログに記録します。親クラスの `report` メソッドを呼び出さず、カスタムロギングのみを行うことで、重複したログの記録を回避します。

2. **リクエスト情報の取得:**
   `Request` ファサードを使用して、リクエストの全パラメータ (`Request::all()`)、ヘッダー (`Request::header()`)、HTTPメソッド (`Request::method()`)、およびURL (`Request::url()`) を取得します。

3. **ログデータの構築:**
   例外のファイル名、行番号、トレース情報とともに、取得したリクエスト情報を含む配列を構築します。

4. **ログの記録:**
   `Log::error` メソッドを使用して、例外メッセージとリクエスト情報を含む詳細なログを記録します。

## まとめ

この設定により、Laravelアプリケーションで例外が発生した際に、リクエスト内容を含む詳細なログが記録されるようになります。

これにより、エラーの原因を迅速に特定し、問題解決のための調査が大幅にスムーズになり、リクエスト情報をログに含めることで、特に実行時例外が発生したときの問題解決に役立ちます。
zipファイルを解凍する

```py
import argparse
import zipfile
import os


def unzip_files(input_file_path: str, output_dir_pass: str) -> None:

    with zipfile.ZipFile(input_file_path, "r") as zip:
        for item in zip.namelist():
            zip.extract(item, output_dir_pass)


def main() -> None:
    parse = argparse.ArgumentParser()
    parse.add_argument("--input_file_path", "-i", default="./image.zip")
    parse.add_argument("--output_dir_pass", "-o", default=None)
    args = parse.parse_args()

    if not args.output_dir_pass:
        args.output_dir_pass = os.getcwd()

    unzip_files(args.input_file_path, args.output_dir_pass)


if __name__ == "__main__":
    main()
```
ESXi and Cisco Switch LACP Configuration Memo

# ESXi and Cisco Switch LACP Configuration Memo
## Objectives
- Set same configuration at next timing...
## Refs

https://knowledge.broadcom.com/external/article/322877/esxiesx-ciscohp-etherchannel-lacp.html

https://knowledge.broadcom.com/external/article/312554/configuring-lacp-on-a-vsphere-distribute.html

https://community.cisco.com/t5/switching/implementing-lag-between-stack-switches-and-vmware-esxi-6-7-0/td-p/4503813

## Cisco Switch Configuration Memo
:::note
Check Mode Actice
:::
```cisco_ios
interface Port-channel2
 switchport trunk encapsulation dot1q
 switchport mode trunk

interface GigabitEthernet0/2
 switchport trunk encapsulation dot1q
 switchport mode trunk
 channel-group 2 mode active

interface GigabitEthernet0/3
 switchport trunk encapsulation dot1q
 switchport mode trunk
 channel-group 2 mode active
```
:::note
Check src-dst-ip
:::
```cisco_ios
c3560-2#config t
c3560-2(config)#port-channel load-balance src-dst-ip
```
```cisco_ios
 c3560-2#show etherchannel load-balance
EtherChannel Load-Balancing Configuration:
        src-dst-ip

EtherChannel Load-Balancing Addresses Used Per-Protocol:
Non-IP: Source XOR Destination MAC address
  IPv4: Source XOR Destination IP address
  IPv6: Source XOR Destination IP address
```
```cisco_ios
c3560-2#show etherchannel summary
Flags:  D - down        P - bundled in port-channel
        I - stand-alone s - suspended
        H - Hot-standby (LACP only)
        R - Layer3      S - Layer2
        U - in use      f - failed to allocate aggregator

        M - not in use, minimum links not met
        u - unsuitable for bundling
        w - waiting to be aggregated
        d - default port


Number of channel-groups in use: 2
Number of aggregators:           2

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
1      Po1(SU)         PAgP      Gi0/9(P)    Gi0/10(P)
2      Po2(SU)         LACP      Gi0/2(P)    Gi0/3(P)
```
## VCSA Configuration Memo
:::note
ロードバランシングモード -> ソースとターゲットIPアドレス
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67892/4d7d1029-5039-0fba-5d06-f7e921dcbaba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67892/f95af0df-86a2-b53f-a1c0-adb8a57e585f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67892/8605b363-ff7b-7a14-6728-0a95fd7f84e6.png)

:::note
ロードバランシング -> IPハッシュに基づいたルート
アクティブアップリンク -> LAG
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67892/81946acc-e5b9-2754-cea1-09ebd5f50c3d.png)
エラトステネスの篩

## エラトステネスの篩とは

素数を見つけ出すアルゴリズム。
「その数の平方根より小さい素数の倍数を消せば、残った数が素数である」という考え方に従って素数を探す。

### フローチャート

100以下の素数を全て求める場合、以下のアルゴリズムとなる。

素数かどうか確かめたい数を代入する配列を、`array`とする。
`i`は`array`の添字。
`k`は倍数を取り除く素数。(`k`が２なら２の倍数を取り除き、`k`が３なら３の倍数を取り除く)

変数`array`に0~100までの全ての添字に値1が対応した状態でスタートし、素数でない添字には0を代入していく。
素数でない添字に0を代入する処理が終わった段階で要素が1の添字が素数となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733055/98b47d03-caed-4a91-ab67-2f3dd2defb5d.png)
defineXXXXの関数を使うとnot definedと出る時の対処法

ここでいうdefineXXXX関数は以下のような関数(?)です。
- defineProps
- defineModel
# 初っ端からの結論
結論を言いましょう。defineXXXXの関数はマクロなので**デリケート**だからです！
# マクロとは
このマクロは、.vueファイルとかからコンパイル(Vite等)するときにdefinePropsから別形態に変化します。
Vue SFC Playgroundで見ると分かるでしょう。

https://play.vuejs.org/#eNp9kU1PwzAMhv9K8GlI0yax21QmAdoBDjABx1yq1m0zmg/lY1Sq8t9xUnXsMO1m+3ltv05GeDJmdQoIWyhcZYXxzKEPZseVkEZbz0aLTWSN1ZJxICUHriqtnGcle2Q1NkLhwWrjFvczkK4lRH0LDh32vb7jQLBYTxtoNiUepelLj5QxVnQPu3GkvhiLNcVJfCGAJXhHsxvRro5OK3I7pjYOlZZG9Gg/jBe0m8OWZZJYSZt/33LN24DLuV51WP1cqR/dkGocDhYd2hOdema+tC36Ce+/3nGg+AylrkNP6hvwE53uQ/I4yZ6Dqsn2hS67fc1vLlT77faDR+Xmo5LRpIxZnz/i5cbp/3Y3q03u4ypC/ANes6So

JSタブにするとコンパイルされたファイルが見れます。
```vue:App.vue
<script setup>
import {ref} from "vue"
const a = defineProps()
const msg = ref("hello!")
</script>

<template>
  <h2>{{msg}}</h2>
</template>
```
```js:JS
/* Analyzed bindings: {
  "ref": "setup-const",
  "a": "setup-reactive-const",
  "msg": "setup-ref"
} */
import {ref} from "vue"

const __sfc__ = {
  __name: 'App',
  setup(__props, { expose: __expose }) {
  __expose();

const a = __props
const msg = ref("hello!")

const __returned__ = { a, msg, ref }
Object.defineProperty(__returned__, '__isScriptSetup', { enumerable: false, value: true })
return __returned__
}

};
//~以下略~
```
App.vueとJSを比較すると、`const msg = ref("hello!")`はそのままなのに対し、`const a = defineProps()`は`const a = __props`になっています！
これがマクロというものです。
# バグる原因
ではこうしてみましょう(自分が引っ掛かった実例の再現)
```js:App.vue
<script setup>
import {ref} from "vue"
const a = defineProps(["data"]).data
const msg = ref("hello!")
</script>

<template>
  <h2>{{msg}}</h2>
</template>
```
`defineProps`の後に付け足すと...
```js:JS(抜粋)
const a = defineProps(["data"]).data
```
**`__props`に変換されなくなってしまった！**
このように、これに何か付け足されたりするとうまくコンパイルされずにエラーになってしまいます。
# 結論
- defineXXXXはマクロと言って関数が変数に変換される
- defineXXXXの関数は本当はない
- コンパイラは繊細なので、defineXXXXに何か付け足されるとうまくコンパイルできなくなって正常に動作しなくなる
これはよく引っ掛かります。ぜひご参考に。
Azure インフラ 仮想マシン関連まとめ - Microsoft Build 2024

2024 年 5 月 21 ～ 23 日に、Microsoft Build という開発者向けのイベントが行われました。
Copilot+ PC の発表など、Twitter でも大変盛り上がりましたね！ [Surface Pro](https://www.microsoft.com/ja-jp/surface/devices/surface-pro-11th-edition) を欲しがっている方が多い印象です。私も現在 Surface Pro 9 を使っていますが、新しい Surface Pro はとてもかっこよくて惹かれますね～


さて、本記事では、この Microsoft Build 2024 で発表されたもののうち、インフラの中でも仮想マシン関連を軽くまとめてお伝えします。

# 【プレビュー】独自 Arm プロセッサ「Azure Cobalt 100」を用いた Virtual Machine の提供開始

Coblat 100 チップセットを搭載した第 1 世代の 仮想マシンが提供開始されました。

Coblat 100 は、2023 年 11 月の Microsoft Ignite 2023 で発表された、クラウ ドコンピューティング向けとなる Microsoft 初の自社開発プロセッサーです。Microsoft Teams や Azure SQL を含むプログラムですでに Cobalt 100 が活用されています。

[Dpsv6](https://aka.ms/Dpsv6-series_pp) / [Dpdsv6](https://aka.ms/Dpdsv6-series_pp) / [Dplsv6](https://aka.ms/Dplsv6-series_pp) / [Dpldsv6](https://aka.ms/Dpldsv6-series_pp) / [Epsv6](https://aka.ms/Epsv6-series_pp) / [Epdsv6](https://aka.ms/Epdsv6-series_pp) の6シリーズで、これらはスケールアウト ワークロードと、Azure Kubernetes Service (AKS) で実行されているものなどのクラウド ネイティブ コンピューティング ソリューションを効率的に実行するように設計されています。

対応 OS は Canonical Ubuntu、CentOS、Debian、Red Hat Enterprise Linux、SUSE Enterprise Linux、Alma Linux、Azure Linux (AKS 経由)、Flatcar Linux、Windows 11 Pro および Enterprise などです。

プレビューの参加リクエストは[こちら](https://forms.office.com/pages/responsepage.aspx?id=v4j5cvGGr0GRqy180BHbRyMSy8VejZVEo6yZykiPSHpUM1U3OFZRVkxWSTFNV0hVQk40SlJWUzVVNS4u)から可能です。

https://azure.microsoft.com/ja-jp/updates/preview-azure-cobalt-100-armbased-virtual-machines/

# 【一般提供開始】ND MI300X V5 シリーズ

AMD 社製の AI 特化チップ「AMD Instinct MI300X」を搭載した Virtual Machine の ND MI300X V5 シリーズが一般提供開始されました。主に生成 AI 向けに設計された VM シリーズの第 5 世代です。コード変更なしで、旧世代比 2 ～ 3 倍の性能向上が達成できます。GPT-4 Turbo に最適化されていますが、OpenAI 以外のモデルでも高い性能を発揮します。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/sizes/gpu-accelerated/nd-mi300x-v5-series/?wt.mc_id=MVP_380462

# 【プレビュー】Azure Compute Fleet 

Azure Compute Fleet は、仮想マシンの「タイプ」「可用性」「価格」などから横断して、効率的にプロビジョニング・管理する新しいサービスです。
ワークロードの実際の需要や可用性基づいて、VM サイズ、価格モデル、パフォーマンスの最適な組み合わせを自動的に構成します。

https://azure.microsoft.com/ja-jp/updates/azure-fleet-preview/

# 個人的推し

ここで取り上げなかったものも含め気になるアップデートばかりだった　Microsoft Bulid 2024 の発表ですが、その中でも **Azure Compute Fleet** がとても気になっています。
実際のワークロードに基づいて最適な VM を自動的に構成する、ということなので、今までは「オーバースペックだけど大きめのサイズにしておこう」だとか「急な需要で対応できずダウンしてしまった」といったような事象が防げるという解釈をしています。
どのサイズ使ったらいいか問題はずっとついて回っていたのであまりにもありがたいですね～！

Azure Compute Fleet については気になるので実際に構築もしてみようと思います。

なお、Microsoft Bulid 2024 で公式から発表された情報については以下の URL から確認してください。

https://news.microsoft.com/build-2024-book-of-news/ja/
Case文の中で変数宣言はできない

Case文の中で変数宣言(グローバル変数も)は宣言できない

breakは状態を分ける役割。例えばjumpとshotをbreakで分けなければjumpshotという状態になる。分けるとjump中にshotはできないしその逆でshotから状態遷移しないとjumpできなくなる。
How to enable SNMP v1,v2c on VCSA 7.0

# How to enable SNMP v1,v2c on VCSA 7.0
1. login
    ```
    $ ssh root@<VCSA IPAddress>

    VMware vCenter Server 7.0.3.01600

    Type: vCenter Server with an embedded Platform Services Controller

    Password:
    Connected to service

        * List APIs: "help api list"
        * List Plugins: "help pi list"
        * Launch BASH: "shell"

    Command>
    ```
1. Enable
    - https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vcenter.configuration.doc/GUID-5B9CA353-4F3A-471B-A57C-E640F3AF7E34.html
    ```
    snmp.enable
    ```
1. Set Communmity Name
    - https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vcenter.configuration.doc/GUID-04815BDB-5AF6-4067-A471-28E7F1800C78.html
    ```
    snmp.set --communities public
    ```
1. Set Sending Trap Target
    - https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vcenter.configuration.doc/GUID-4BBF45F9-3E8C-40A0-B8CA-7185738E1C65.html
    ```
    snmp.set --targets <SNMP Manager IPAddress>@162/public
    ```
1. Send Trap Test (warmStart)
    ```
    Command> snmp.test
    Results:
       Success: True
       Message: A warmStart notification was sent to 1 target.
    ```
1. Check Configuration
    ```
    Command> snmp.get
    Config:
       Authentication: none
       Communities: public
       Enable: True
       Processlist: False
       Engineid: 80001f888067b71a1b7c08576600000000
       Loglevel: warning
       Notraps: ''
       Port: 161
       Privacy: none
       Syscontact: ''
       Syslocation: ''
       Targets:
         1:
             Ip: <SNMP Manager IPAddress>
             Port: 162
             Community: public
       Users:
       Remoteusers:
       V3targets:
       Pid: 14708
    ```