OmniAICreator/Qiita-1.07M huggingface dataset:
データ分析業務を経験して個人的に感じている各資格の方向性と強み

# はじめに

こんにちは、[くふうカンパニー](https://kufu.company/)グループでデータ分析を担当しているfukiです。
営業・CSからデータ分析に転向し、様々な資格を調査・取得しました。

今回は、業務や採用面接を通じて感じた各資格の方向性と強みについてまとめました。資格取得を検討している方の参考になれば幸いです。
※個人の印象なので、「自分はこう感じる」などのご意見歓迎です！


それではさっそく、各資格を見ていきましょう！

## 各資格の方向性・強み
### Python系
Python系の認定資格です。
データサイエンスではPythonはほぼ必須で利用するので、実務を行う可能性がある場合は理解しておいて損は無いと思います。
他にも分析分野ではRなどの言語がありますが、利用機会は減少&機械学習には強くない為、これから学ぶのであればPythonが良いのではと思います！

#### Python3 エンジニア認定基礎試験
Pythonを体系的に理解したい場合に良い資格です。
ただ、面接などでは有利になることは少ないと思われます。

* 概要：Pythonの基礎的なコード、標準的なライブラリがある程度理解出来ているかを証明する資格
* 難易度：★☆☆☆☆
* 受験費用：11,000円（税込）
* 強み：これからPythonを理解するのに役立つ(データ分析のコードでは無い)
* 面接や業務での印象：
    * 資格自体の知名度はあまり無いので面接ではどんな資格ですか？と聞かれるた
    * 学習を進めていると言う印象は最低限持ってもらえる

#### Python 3 エンジニア認定データ分析試験
基礎試験のデータ分析寄りの資格です、基礎的な内容に加えて、分析の知識が身に付きます。
データ分析職を目指す人は最初からデータ分析試験を受験しても良いかもしれないです。


* 概要：分析に利用する基礎知識とよく利用するPythonのライブラリ、コードの理解を証明する資格
* 難易度：★★☆☆☆
* 受験費用：11,000円（税込）
* 強み：データ分析の仕事をする上では必須の内容なのでやっておいて損は無い
* 面接や業務での印象：
    * 基礎試験同様にあまり知名度は無いが、未経験のDS採用をやっている会社さん等の採用担当は知っていることがある。
    * データ分析学習のために利用する資格という印象


### 統計系
統計関連の知識は分析や機械学習に限らず実務でも多分に利用します。
なぜなら、取得してきたデータがどのような特性を持っているかを理解した上で分析・予測等を行う必要があるからです。
この知識が抜けていると本来の結果とは全く別の結果を出してしまう事になりかねないので私はデータに関わる人であれば身に付けておいた方が良いと考えています！

#### 統計検定 2級
データの背景や特性を把握するために必要な知識が身に付く資格です。
数学の知識が必要になりますが、データ分析では重要度の高い知識です！

* 概要：大学1~2年程度統計学の理解度を証明する資格
* 難易度：★★★☆☆
* 受験費用：7,000円（税込）
* 強み：データ分析の実務でもよく利用する
* 面接や業務での印象：
    * 分析する上で間違った示唆・結果を出さないために必要な知識が身に付く
    * 分析の前提となる知識なので、個人的にはPython実装系の資格よりも重要度が高い
    * 面接でも実務に近い知見を持っていると一定の評価が得られる


#### 統計検定 準1級
統計検定2級の知識を更に深めた内容です。

* 概要：大学3~4年程度の統計学の理解度を証明する資格
* 難易度：★★★★☆
* 受験費用：8,000円（税込）
* 強み：分析実務〜数年経験レベルの知識が得られる
* 面接や業務での印象：
    * 複雑な分析やモデルの実装でも利用する知識が身に付く
    * 他メンバーからも経験豊富な分析者という印象や、専門的な知識を持っていると思ってもらえる。

#### 統計検定 1級
統計検定の中でも一番の難易度を誇る資格です。
1級では専門分野ごとに受験していく必要があり、それぞれの知識を証明することが出来ます！

* 概要：定量的なデータ解析に深くかかわるような大学での専門分野修了程度
* 難易度：★★★★★
* 受験費用：6,000円（税込）※分野ごとに受験する必要あり
* 強み：研究者・分析シニアレベルの知見が身に付く
* 面接や業務での印象：
    * 準1級の内容を分野ごとに専門的な知見があると思ってもらえる。



### ディープラーニング系
機械学習の中でもディープラーニングの知見を身に付ける資格です。
昨今のAIブームはディープラーニングを起点にしたものが多いのでこちらから興味を持った人が多いのでは無いでしょうか。（私もそうです笑）

ディープラーニングは上記で紹介した知識の延長上にあるものですが、AIを活用・実装するには重要な知識となるのでぜひ学習してみてください。

#### G検定
G検定はディープラーニングの基礎知識を持ち、事業活用の方針を決定する能力を証明する資格です。AIの理解を深めるためのビジネス寄りの資格として位置づけられています。

* 概要：ディープラーニング協会の「ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識」を証明する資格
* 難易度：★★★☆☆
* 受験費用：13,200円（税込）
* 強み：ディープラーニングの概要を体型的に理解できる
* 面接や業務での印象：
    * 資格としてはビジネス寄りの資格のため、「AIの理解があるビジネスマン」という印象になる
    * ビジネスに適応できる力が身につく
    * 分析者としての知識とはまた別になるが、AIに興味があり理解しているという印象を持ってもらえる


#### E資格
E資格はディープラーニングを実装できるエンジニアの能力を証明する資格です。深層学習の理論と実装スキルを身につけるための高度な資格です。
それなりの費用が掛かってしまうのが難点ですが、それを評価してもらえるので時間とお金に余裕があればぜひ取得してみて下さい！

* 概要：ディープラーニング協会の「深層学習を実装可能なエンジニア」の理解度を証明する資格
* 難易度：★★★★★
* 受験費用：33,000円（税込）
* 学習費用：10〜数十万円
* 強み：深層学習の実装理論を理解できる
* 面接や業務での印象：
    * MLエンジニア寄りの知識が身に付くが、「分析」の界隈ではあまり利用しない
    * 学習に認定講座を受ける必要がある為、学習期間と費用が比較的多くなるため、面接では知識に加えて行動力を評価して頂くことができる

## 最後に
データサイエンス関連の資格についてご紹介しましたが、いかがでしたでしょうか？
データサイエンススキルは、現在のビジネス環境において非常に注目を集めてきています。
自身のキャリアの方向性によって受けるべき資格を取得することで業務や面接でも違った印象を持ってもらうことが出来るのではと思います。
ぜひこの機会にデータ分析の世界に足を踏み入れて、新たな可能性を探求してみてください。
YYYYMMDDhhmmssをYYYY-MM-DD hh:mm:ssに変換するワンライナー

ただの小ネタです。特に説明いらないよね？

```console
$ echo 20240518123456 | sed 's/../& /g' | xargs printf '%s%s-%s-%s %s:%s:%s\n'
2024-05-18 12:34:56

$ printf '%s%s-%s-%s %s:%s:%s\n' $(echo 20240518123456 | sed 's/../& /g')
2024-05-18 12:34:56
```

```console:bash 5.2以上
$ v=20240518123456; printf '%s%s-%s-%s %s:%s:%s\n' ${v//??/& }
2024-05-18 12:34:56
```

おしまい
[Rails] Rails7 cocoon導入方法

## 注意
2024/6/23追記
ここから先の話はローカル環境では動いたのですが、本番環境では動かない可能性がかなり高いです。環境によってはローカルでも動くかわかりません。
近日記事の編集を予定していますが、この記事を参考にしてしまった人は本当に申し訳なかったです。
これから読む方はそれを承知の上読んでください。

## 目的
rails7でフォームの追加・削除をしたかったのでcocoonを使い実装しました。
cocoonの公式githubではrails6までのやり方しか書いておらず
なおかつrails7ではrails6とは導入方法が異なり、導入の記事も少なくハマったので備忘録として残そうと思い記事にしました。

#### 対象者
- rails7でcocoonの導入がわからない人・ハマっている人

## 開発環境
- rails 7.0.4.3
- ruby 3.1.2
- cocoon 1.2.15
- jQuery 3.7.1

## 導入方法
#### cocoonをインストール
```:Gemfile
gem 'cocoon'
```
```:ターミナル
$ bundle install
$ yarn add @nathanvda/cocoon
```
cocoonのインストールはrails6でもrails7でも全く一緒です。

#### cocoonを設定
ここからrails６とrails7では違ってきます。
公式のgithubにはrails6までのやり方しか書いておらず、ここから苦戦しました。
[cocoon公式github](https://github.com/nathanvda/cocoon)


cocoonは`cocoon.js`というファイルを読み込まないと使えないので<font color='red'>`importmap.rb`</font>で読み込ませます

```config/importmap.rb
pin '@nathanvda/cocoon'
```

```application.js
公式のgithubを参考にして下のように書くと読み込めないというエラーになるので
import '@nathanvda/cocoon'

rails7ではこちらのように書く こっちが正解
import './cocoon'
```

ちなみにrails7からjsファイルを使うときは<font color='red'>`importmap.rb`</font>にピン留めしてjsファイルを読み込むようになりました。
こちらの記事でrails7のimportmapについて解説しているので知りたい方は是非。

https://techracho.bpsinc.jp/hachi8833/2024_04_10/112183


#### jQueryの設定
cocoonはjQueryで構成されているのでjQueryを使えるように設定します。
```config/importmap.rb
pin "jquery", to: "https://code.jquery.com/jquery-3.7.1.min.js"
```

```application.js
import "jquery”
```

このように設定してあげればrails７でcocoonを動かすことができます。
<br>
#### おまけ
cocoon導入前にも一応jQueryが使える環境だったのですが、下のように設定していました。

```config/importmap.rb
pin "jquery", to: "https://ga.jspm.io/npm:jquery@3.7.1/dist/jquery.js"
```

```application.js
import jquery from "jquery"

window.$ = jquery
```

この設定でcocoonを使おうとすると`cocoon.js`を読み込んだ時に
「jQueryが定義されていません」と怒られるので
下の記事を参考にし設定を直したら動くようになりました。めでたしめでたし。

https://blog.furu07yu.com/entry/rails7-importmap-semantic-ui

## まとめ
#### cocoonの導入手順
- cocoonのインストール
- cocoonの設定
- jQueryの設定

この3つができればcocoonを動かすことができます。
間違いなどあればコメントして頂けると非常に嬉しいです。

#### その他参考URL
https://zenn.dev/yama525/articles/a94d30496aa3ab
https://qiita.com/okiiiiiina/items/8868a7fcb6ec0817d064
[ReviewAI 使用例] くるむ [新大久保 韓国料理店]


# はじめに

レビュー分析AIサービスの ReviewAI (レビューアイ) を開発しています。
本記事ではレビュー分析の例として、新大久保の韓国料理の人気店を取り上げていきます！
[人気店の記事をまとめているページはこちらです。](https://qiita.com/RetegyLink/items/3d94852bf25a724a82cc)

今回は、くるむ の食べログに集まっているレビューを分析します。

## くるむ

くるむ

新大久保で話題のサムギョプサルが食べられるお店

> 新大久保駅から徒歩5分とアクセス抜群。改装された2階の店内は半個室席が多く、落ち着いた雰囲気が魅力的。人気の蜂の巣サムギョプサルは2人前から注文可能で、野菜とのバランスが良く、組み合わせの自由度が高いと評判。残った野菜はスムージーとして提供してもらえるのもうれしいポイント。ランチタイムは混雑するため、夜に訪れるのがおすすめです。
> 引用元 [AutoReserve](https://autoreserve.com/ja/restaurants/ff2agG6tuqbDf1Yr4Kqj)

[食べログ](https://tabelog.com/tokyo/A1304/A130404/13155099/)

## ReviewAI (レビューアイ)

弊社 RetegyLink が開発中のレビュー分析 AI です。
https://reviewai.next-seed.work/
試作版を公開中で、現在は
- [食べログ](https://tabelog.com/)
- [じゃらん](https://www.jalan.net/)
のレビューを分析できます。

# レビュー分析

さっそくですが、こちらが分析結果です！
最後・分 という単語が気になりますね。
もちろん、サムギョプサル・肉 といった単語もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/26ae6503-3195-fdf4-8408-a40e89dd000b.png)


## サムギョプサル

<font color=steelblue>**良い評価**</font>

- 芸術的な野菜見て楽しい食べて美味しい最高ですサムギョプサルは、味変しながら食べれる所が良いですよね〜
- お肉については、サムギョプサル、牛のお肉、鶏のお肉など、いろいろなタイプが1人ずつ選べます！
- 蜂の巣サムギョプサルは是非食べて欲しいです。
- サムギョプサルと一緒に焼くキムチも最高に美味しい。

## 肉

<font color=steelblue>**良い評価**</font>

- お肉も美味しいし家族で感動しながらいただきました。
- お店の方がお肉を焼いてくれるのでありがたい。
- このボリュームにはビックリ笑お肉は文句なし。
- お肉の種類もいろいろあり、選べるので嬉しいです。


## 最後

<font color=steelblue>**良い評価**</font>

- 野菜は最後に残るとスムージーにしてくれるのでそれも楽しみかなと思います。
- 最後にのこった「サンチュなど」をスムージーにしてくれます。
- 大量に出てきますが最後には野菜スムージーにしてくれるので、おいしく全部いただけます！

## 分

行列のすごい人気店のようです。

<font color=steelblue>**良い評価**</font>

- 前に2組待っていて、待ち時間30分くらいで入ることができました。
- 土日のランチは行列必至なので、開店30分前には行くと◎
- 30分以上待ちましたが許容範囲内です。

<font color=chocolate>**黄色・橙色の評価**</font>

- 平日の13時過ぎ新大久保でサムギョプサルランチに、どこも行列がすぎて、こちらも30分待ちました。
- 15組目だと席数的にすぐに入れるはずなのだが、一度に満席にすると店員さんの手が足りなくなるためか、結局30分近く待たされた。
- 平日で夜遅いというのに10分待ち。


## ReviewAI の改善点

今回は記載していませんが、
実は 最後・スムージー・野菜 に同じ文章が多く抜き出されていました。
分析結果として表示するには冗長なので、調整していきたいです。

# おわりに

最後の余った野菜のスムージーが楽しみな人気店でした！

観点ごとの詳細を確認されたい方は、ぜひサイトにアクセスして確認してください！
レビュー分析AI の [ReviewAI](https://reviewai.next-seed.work/) は試作版を公開中です。
今回分析した くるむ の URL はこちらです。
```
https://tabelog.com/tokyo/A1304/A130404/13155099/
```

今後どんどん使いやすくしていく予定ですので、
ぜひ皆様の ReviewAI に関するご意見を[アンケート](https://docs.google.com/forms/d/e/1FAIpQLSc-yVTDeqqMc9GqM93BvzaYWCB6wyToesYj_wl8bhwKgw8LqQ/viewform?usp=sf_link)で教えてくださると幸いです。
[Go] lsコマンドを一部実装してみる

# はじめに
Goを勉強したいので、手始めに`ls`コマンドを一部実装してみようかなと思います。今回は、`ls`でファイル名の一覧が表示されること、またオプションは、`-l`でファイルの詳細一覧が出力されることを目標として設定します。

# 実装
今回のリポジトリですmm

https://github.com/ayanami77/go-my-commands/blob/main/my-ls/main.go

では最初に、`ls`を実装していきます。ポイントは、`os`ライブラリが提供している`os.Getwd()`でカレントディレクトリのパスを取得し、`os.ReadDir()`でディレクトリ内のファイルを全て返して、ファイル名を出力しているようにしている点です。

```main.go
package main

import (
	"fmt"
	"os"
)

func main() {
	dir, err := os.Getwd()
	if err != nil {
		panic(err)
	}
	files, _ := os.ReadDir(dir)

	listFiles(files)
}

func listFiles(files []fs.DirEntry) {
	for _, f := range files {
		fmt.Printf("%s ", f.Name())
	}
}
```
では、スクリプトを実行してみます。

```bash
$ go run main.go
README.md go.mod main.go 
```
ここまでは、上手くいっていそうです。つづけて、オプションの`-l`を実装します。
ポイントは、`flag`ライブラリが提供する`flag.Bool()`でコマンドライン引数を受け取るようにし、`fs`ライブラリの`fs.DirEntry`といったインターフェースに属する関数を活用し、ファイルの各種情報を出力している点です。
```diff_go: main.go
package main

import (
	"flag"
	"fmt"
	"io/fs"
	"os"
	"time"
)

func main() {
+	isListed := flag.Bool("l", false, "List files")
+	flag.Parse()

	dir, err := os.Getwd()
	if err != nil {
		panic(err)
	}
	files, _ := os.ReadDir(dir)

+	if *isListed {
+		listFilesWithDetails(files)
+		return
+	}

	listFiles(files)
}

func listFiles(files []fs.DirEntry) {
	for _, f := range files {
		fmt.Printf("%s ", f.Name())
	}
}

+func listFilesWithDetails(files []fs.DirEntry) {
+	for _, f := range files {
+		info, err := f.Info()
+		if err != nil {
+			panic(err)
+		}
+		fmt.Printf("%s %s %d %s\n", info.Mode(), formatDate(info.ModTime()), info.Size(), f.Name())
+	}
+}

+func formatDate(t time.Time) string {
+	return t.Format("Jan 02 15:04")
+}
```
では、スクリプトを実行してみます。
```bash
$ go run main.go -l
-rw-r--r-- May 16 22:51 8 README.md
-rw-r--r-- May 16 18:18 30 go.mod
-rw-r--r-- May 18 15:42 719 main.go
```
こちらも、期待通りの結果が返ってきました。なお、今回は本来の`-l`にあるような、ハードリンクの数や所有者・所有グループまでは実装しませんでした。特に後者の理由は、Goの標準ライブラリのみではシンプルには書けないようだからです。Goの限界なのでしょう。

# おわりに
こうして実装に取り組むと学びが色々とあると感じますし、やはり面白いです。
アドバイスや指摘があれば、頂けると幸いです。次は、`grep`コマンドの実装に挑戦してみようかな～
ショートカットコマンド集


エンジニアとして役に立ちそうなショートカットコマンド集を作りました。
上のコマンドが mac で
下のコマンドが windows です。

## 作業中よく使うもの
コピー
cmd + C
ctrl + C

ペースト
cmd + V
ctrl + V

切り取り
cmd + V
ctrl + V

右の文字削除
fn + delete
ctrl + delete

一つ前の状態へ戻す
cmd + Z
ctrl + Z

一つ後の状態へ戻す
cmd + shift + Z
ctrl + shift + Z

タブを閉じる
cmd + W
ctrl + W

タブの切替　進む
ctrl + Tab
ctrl + Tab

タブの切替　戻る
ctrl + shift + Tab
ctrl + shift + Tab

ウィンドウの最小化
cmd + M
alt + space → N

ウィンドウの最大化
なし
alt + space →　X

スクリーンショット
cmd + shift + 3/4/5
win + shift + S


## 画面移動


画面上スクロール
fn + ↑
page up

画面下スクロール
fn + ↓
page down

ページの最前列へ移動
cmd + ↑
pg up

ページの最後尾へ移動
cmd + ↓
pg down

アプリケーション切り替え
cmd + Tab
ctrl + Tab

アプリケーションを閉じる
cmd + Q
alt + F4


## 選択やキャレット


全選択
cmd + A
ctrl + A

行の先頭へ移動
cmd + →
home

行の語尾へ移動
cmd + ←
end

単語の先頭へ移動
opt + ←
ctrl + ←

単語の後尾へ移動
opt + →
ctrl + →

選択
shift + 矢印キー
shift + 矢印キー

行を選択
cmd + shift + 矢印キー
shift + Home or shift + End

単語を選択
opt + shift + →/←
ctrl + shift + →/←


## ファイルやウィンドウ


保存
cmd + S
ctrl + S

名前をつけて保存
cmd + shift + A
ctrl + shift + S

新規ファイル作成
cmd + N
ctrl + N

ファイルを開く
cmd + O
ctrl + O

新規ウィンドウ
cmd + shift + N
ctrl + shift + N

ファイル名を指定して実行
cmd + space
win + R

ファイル名を変更
Enter
Fn + F2


## ブラウザ


ページリロード
cmd + R
F5 / ctrl + R

スーパーリロード
cmd + shift + R
ctrl + F5

チェックボックス　チェック
space
space

ブラウザ　ダウンロードページを開く
cmd + shift + J
ctrl + J

ブラウザ　履歴ページを開く
cmd + Y
ctrl + H

ブラウザ　設定画面
cmd + ,
ctrl + ,

ブラウザ　新規タブ
cmd + T
ctrl + T

プリントアウト
cmd + P
ctrl + P


## vs code


インデント追加
Tab
Tab

インデント戻す
Tab + shift
Tab + shift

コメントアウト / 解除
cmd + /
ctrl + /

フォーマット整形
shift + option + F
shift + alt + F

複数選択 クリック
opt + click
alt + click

複数選択　同じ文字
cmd + D
ctrl + D

複数選択時　スキップ
cmd + K
ctrl + K

サイドバーの切り替え
cmd + B
mtrl + B

ターミナル開く・閉じる
cmd + J
ctrl + J

クイックオープン
cmd + P
ctrl + P

ファイル内検索
cmd + F
ctrl + F

ファイル検索
cmd + shift + F
cmd + shift + F

プロジェクト内置換
cmd + shift + H
cmd + shift + H

コマンドライン
cmd + J
ctrl + J

別タブで(ファイルなど)開く
cmd + click
ctrl + crick


## コマンドライン、ターミナル


過去のコマンド呼び出し
↑ / ↓
↑ / ↓

先頭へ移動
ctrl + A
ctrl + A

末尾へ移動
ctrl + E
ctrl + E

行を削除
ctrl + U
ctrl + U

ログのクリア
ctrl + I
Alt + F7

パスのコピー
任意のファイルをドラッグ＆ドロップ
なし

キャンセル
ctrl + C
ctrl + C
「Deprecated imperative apply of Flutter's Gradle plugins」対応した時に遭遇した現象のメモ

## はじめに

Flutter 3.16からGradleの新しい宣言的な書き方がサポートされ、（確か）Flutter 3.19系からは古い書き方のままだと警告されます。
以下のマイグレーションガイドに応じて対応すればいいのですが、そこで一点ハマったことのメモです。

https://docs.flutter.dev/release/breaking-changes/flutter-gradle-plugin-apply#google-mobile-services-and-crashlytics

## 遭遇したエラー

com.google.firebase.crashlyticsの書き方を宣言的にすると以下のエラーが発生しました。
2.2.0は古いバージョンだったので、当時最新の2.9.9にするとエラーはおさまりました。

```
* What went wrong: Plugin [id: 'com.google.firebase.crashlytics', version: '2.2.0', apply: false] was not found in any of the following sources: - Gradle Core Plugins (plugin is not in 'org.gradle' namespace) - Included Builds (None of the included builds contain this plugin) - Plugin Repositories (could not resolve plugin artifact 'com.google.firebase.crashlytics:com.google.firebase.crashlytics.gradle.plugin:2.2.0')
```

具体的には
以下のコードを
```android/app/build.gradle
~~~
apply plugin: 'com.google.firebase.crashlytics'
~~~
```
```android/build.gradle
buildscript {
~~~
    dependencies {
            classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
~~~
```
こうしていました
```android/app/build.gradle
plugins {
    id "com.google.firebase.crashlytics"
~~~
```
```android/settings.gradle
~~~
plugins {
    id "com.google.firebase.crashlytics" version "2.9.9" apply false
```
公式のマイグレーションのサンプルとバージョン以外同じです。

## 原因

Google's Maven Repositoryを見ると原因が分かりました。

新しく指定しているcom.google.firebase.crashlyticsは2.8.1以降しかリポジトリに存在しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/66840c39-1ec0-562c-ead3-095ca888e7fe.png)

これまで指定していたcom.google.firebase:firebase-crashlytics-gradleは2.2.0も存在しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/0afaa931-a9d6-9505-635c-0a805a07fe44.png)

## まとめ

Google's Maven Repositoryにはcrashlyticsがcom.google.firebase.crashlyticsとcom.google.firebaseそれぞれにある。
com.google.firebase.crashlyticsの方は2.8.1以降の新しいものしかない。
zodのschemaから型定義を生成する方法

毎回、忘れてしまうのでschemaから型定義を生成する方法を下記にメモします。


```typescript
import { z } from 'zod';

export const ServerErrorSchema = z.object({
  message: z.string(),
});

export type ServerError = z.infer<typeof ServerErrorSchema>;
```
Metagptでgpt-4oのモデルを試してみた。

## gpt-4oでMetaGptを試してみたらすごかった
gpt-4oのモデルが発表されて、playground上で使用したり、cursorで使用していました。
MetaGPTでも使用したら精度上がってるんじゃないか？？ってことで、使ってみました。

metagptのインストールやconfigの設定では[公式ドキュメント](https://docs.deepwisdom.ai/main/en/guide/get_started/quickstart.html)参考にしてみてください。
ドキュメントには記載されていませんが、`~/.metagpt/config2.yaml`のmodelの欄を`gpt-4o`とするとgpt-4oモデルを使用する事ができます。

## 条件
- モデル:gpt-4o
- 費用：0.2ドルくらい
- 時間：1分半くらい

## Create cli based blackjack game.

```
metagpt "Create cli based blackjack game.in japanese.folder name is cli_blackjack_jp"
```
こちらのコマンドで、metagptにcliのブラックジャックのゲームを作ってと指示して、あとは勝手にAIエージェントを立てて、要件を定義して、コードを書いてくれます。

実行したカレントディレクトリに`./workspace`という名前のディレクトリ内に実行した成果物が作成されます。
僕の場合、`./workspace/cli_blackjack_jp`という名前のディレクトが作成されました。
ターミナルの出力に色々と過程が記述されるので、見てみてください。

完了したら、`python3 ./workspace/cli_blackjack_jp/cli_blackjack_jp/main.py`のように実行してみてください。`cli_blackjack_jp`の部分は各自書きかえてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300617/790212a0-4014-1e89-5d3f-212eaa91c981.png)

手札だけ見づらいので、文字列で表示するように修正しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300617/b65f2eb8-f5a2-7248-a68e-b8df67e39ee5.png)

はい、大枠をmetagptが2分以内で作り、cursorを使用した僕が数カ所微修正を5分したらキレイになりましたね！！
手直しをmetagptにしてもらう方法もあるんですかね？教えてください〜

### おまけ
```
metagpt "Create cli based blackjack game"
```
と指示すると、英語でblackjackを作ってくれます。
こっちは一箇所だけバグがあって、修正しました。
多分、日本語と英語で精度は変わらなそう。

## github
できあがったゲームのソースファイルをgithubに上げたので見てください。

https://github.com/kogasura/cli-blackjack


## 続編？
反響あれば、webベースのアプリ作るかも。
スクリプトでinDesign CC の特定のテキストエリアに文字を挿入する

## 環境
- inDesignCC(2024)
- Visual Studio Code
    - plugin: [ExtendScript Debugger v2.0.3](https://marketplace.visualstudio.com/items?itemName=Adobe.extendscript-debug)

## ステップ

#### Step1
inDesignで新規ファイルを作成、テキストエリアを作成、テキストエリアにスクリプトラベルを登録する。
スクリプトラベルは例として `input-hoge`としておく。

> スクリプトラベルの設定方法↓
> テキストエリアを選択した状態で、
> ヘッダーメニュー ウインドウ > ユーティリティー > スクリプトラベル

![スクリーンショット 0006-05-18 15.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73246/a8042ead-ae8b-42e9-2eeb-787b30b50583.png)



#### Step2
Visual Studio Codeなどでスクリプトを組む
javascriptのコードの場合ES3(1999年12月の仕様)までしか使えません。

```js:index.jsx(index.js)
(function(){
  // 今開いているinDesignドキュメントを取得
  var doc = app.activeDocument;
  
  // 1ページ目を取得
  var targetPage = doc.pages.item(0);
  
  // ページに含まれているテキストエリアのリストを取得する
  var textFrames = targetPage.textFrames;
  
  // findByIdのような関数がないため、テキストエリアのスクリプトラベル名をkeyとした配列を生成する
  var formatTextFrames = {};
  var maxTextFrames = textFrames.length;
  for (var j = 0; j < maxTextFrames; j++) {
    formatTextFrames[textFrames[j].label] = textFrames[j];
  }
  
  // テキストエリアのリストから目的のものを探して文字を挿入する
  var textFrameInputHoge = formatTextFrames['input-hoge'];
  textFrameInputHoge.contents = '新しく挿入する文言';
})();
```
#### Step3
実行する。
今回は`Visual Studio Code`のデバッグプライグイン`plugin: ExtendScript Debugger`を使って実行した。
※ ExtendScript DebuggerプラグインはMacの場合,M1系のチップに対応していないため、`Visual Studio Code`をRosettaで起動しておく必要がある。

![スクリーンショット 0006-05-18 15.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73246/f2fca85d-74d4-5b1f-4fb9-c379b0bc719e.png)


#### Step4
inDesignの文言が切り替わっている
![スクリーンショット 0006-05-18 15.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73246/964ec70a-05ea-edd5-5da4-2a414ce0f484.png)
【Python】図形を描いてみた！！

# アルゴリズムを勉強しよう
今日はPythonのアルゴリズムの勉強としていろんな図形を書いていきます。
以下の順番で図形を書いていきます。

①直角三角形
②ピラミッド
③ダイヤモンド
④自分で考えた図形

## 直角三角形
期待する出力
```
*
**
***
****
*****
```
実際にプログラムを書いていきます。
以下になります。
```python
for i in range(1, 5 + 1):
    print('*' * i, end= '')
    print()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/c12d679d-3695-5e69-eaea-350d723f0a5d.png)

## ピラミッド
期待する出力
```
    *
   ***
  *****
 *******
********* 
```
### 実際のプログラム
```python
n = 5 * 2
n_1 = n // 2 - 1
for i in range(1, n, 2):
    print(' ' * n_1, end='*' * i)
    n_1 -= 1
    print()
```
#### 考え方
今回は、5段のピラミッドを表示しています。
まずは、ループを何回するか考えます。5段表示をする場合はその2倍の数をループします。
「*」を表示する数は奇数個になります。
今回は、[1, 3, 5, 7, 9]の数を表示します。

出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/202940bb-2e0b-28be-2202-f29f5a870d96.png)

## ダイヤモンド
期待する出力
```
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
```

### 実際のプログラム
```python
n = 5 * 2
n_1 = n // 2 - 1
a_list = []
for i in range(1, n, 2):
    print(' ' * n_1, end='*' * i)
    n_1 -= 1
    a_list.append(i) # 数値を格納
    print()
a_list.pop(-1) # 末尾の大きな数字を外に出す。
n_2 = 0
for j in reversed(a_list):
    n_2 += 1
    print(' ' * n_2, end='*' * j)
    print()
```
出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/b2950314-0e76-44cd-1a9a-057816c9ed95.png)
#### 考え方
上記に記述したピラミッドを逆ピラミッドにします。
for文のreversedを使用して「*」を表示します。表示する「*」は上から順に減らしていきます。

## 自分で考えた図形
```
*        *
**      **
***    ***
****  ****
**********
```
### 実際のプログラム
```python
n = 5 * 2
roop = n // 2
m = n - 2
for i in range(1, roop + 1):
    print('*' * i + ' ' * m + '*' * i)
    m -= 2
```
出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/ad53e52f-901b-459d-9f8d-f0858c9d64dc.png)

#### 考え方
1番下の「*」の数から2を引きながらスペースを調整しながら、for文で表示を行う。
Eclipseで「サーバーの起動に失敗しました」と出てくるときによくあるコーディングミス

この記事は、windowsにインストールしたEclipse2022を使用しています。

Eclipseで開発していると、たびたびエラーが出てきてしまいますが、中でもこのメッセージが出てきたときは困惑しました。

![スクリーンショット (98).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790891/f052c0c7-374a-8763-d5d4-273ecd01334c.png)

Tomcatを使用していますので、
'開始中　Tomcat10_Java17'に問題が発生しました。
サーバーTomcat10_Java17は起動に失敗しました。

と出現しましたが、このメッセージだけだと何も原因がわからず、
知らないうちにサーバを壊してしまったのではないかと不安な気持ちになりました。

原因追及のためにコードを見直した結果、だいたいこのパターンでこのメッセージが出るな。と
予測がつくようになったので共有します。

Delete_event.javaというファイルの中を覗いてみます。

![スクリーンショット (99).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790891/4104b008-76d3-c327-d59b-ba18e757d560.png)

```Delete_event.java
@WebServlet("/student/delete_reserve")
```

ここの部分がエラーの原因でした。

DBからデータを削除する処理はだいたい同じですので、コピーして再利用することが多く、
こちらはDelete_reserve.javaのコードをコピー後、変えるのを忘れて実行していたのです。

こちらをこのように修正すれば…

```Delete_event.java
@WebServlet("/student/delete_event")
```

エラーは出ずに、実行ができました。

'開始中　Tomcat10_Java17'に問題が発生しました。
サーバーTomcat10_Java17は起動に失敗しました。

という言葉で、サーバーの心配をしてしまいましたが、
サーブレットとそのマッピングが正しく定義されていませんでした。
Symfony6でのルーティングの方法

# 従来のやり方
```php
/**
*@Route('/hello', name='hello')
*/
public function helloControler() {
    return $this->render('/hello/hello.html.twig',[
        message => 'Hello!'
    ]);
}
```

# Symfony6でのやり方
```diff_php
-/**
-*@Route('/hello', name='hello')
-*/
+#[Route('/hello', name:'hello')]
public function helloControler() {
    return $this->render('/hello/hello.html.twig',[
        message => 'Hello!'
    ]);
}
```
急いですぐにLaravelの作業がしやすい環境をDockerのDebianで作る


今回は急いでLaravelの動く環境が欲しいので急いですぐになんとかします！

## すぐ着手

まずDockerをパパッと起動します。

```bash
cd oisogi-laravel
docker run -it --rm -p 8080:8080 -v .:/opt debian
```

必要なものまとめてインストールします。

```bash
apt-get update
apt-get -y install php php-sqlite3 php-curl php-fdomdocument composer
```

MySQLのためだけにdocker-composeする時間はもったいない印象です。
時短のため.envをSQLite3で使うよう一旦ちょっと変えます。
gitを使っている場合はここで`.gitignore`によって無視されるパスを指定するのが時短ポイントです。

`DB_`の部分は例えばこんな感じです。

```bash
DB_CONNECTION=sqlite
DB_DATABASE=database/db.sqlite
```

ほぼいつものコマンドを実行します。

```bash
cd /opt
composer install
bash -c 'source .env;touch $DB_DATABASE'
php artisan migrate
```

１つだけオリジナリティーを混ぜました。コレです。

```bash
bash -c 'source .env;touch $DB_DATABASE'
```

これはSQLite3のデータベースという体で空のファイルをすぐ作るだけです。
~~↑`touch`のことをこんな言い方する上級者さんたちに怒られそう~~

このファイルは無ければ無いで

```bash
php artisan migrate
```

した時に怒られます。

これで一通りOKのはずです。

## すぐ実用する

今回は例としてLaravelを普通に動かしてみます。

```bash
php artisan serve --host 0.0.0.0 --port 8080
```

では、動いてるはずなので`http://localhost:8080/`をDockerの外のブラウザで開きます。

動きました。あとはそのまま作業です。
bashを抜けるとコンテナは自動で消しておいてくれます。
（`docker run`するときに`--rm`をつけておきました）

一旦これでOK🎉🥳✨
【ChatGPT＋DALL-E3】写真を再現する（特に一部を）


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

　今回は、写真を再現する話です。ふつうに再現しても、再現が足りなかったりします。それを少しだけよくしましょう。

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

　昨日（2024/05/17）、
　　久しぶりに、アプリ版に
　　　無料版のアカウントでアクセス。

　そこで、
　　いくつか変化があったので、
　　　いろいろとチェックしました。

　上部の“ChatGPT”と
　　書かれていたところが、
　　　“Plusを入手する”
　　　　になっています。
![Screenshot_20240517-180247.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/d4f8346e-59ae-30a5-2b23-184cd94fa226.png)
　
　気になって、
　　右上のメニューで
　　　“詳細を表示する”を
　　　　選択しました。

　出てきたのが
　　こちらです。
![Screenshot_20240517-180258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/805d573b-3654-7f23-94c1-98f293662b63.png)

　“Dynamic”と表記されています。

　このDynamicというのは、
　　最近、ChatGPTに
　　　搭載された機能です。

　これは
　　リクエスト（Prompt）の
　　　内容を判断して、
　　　　GPT-3.5/GPT-4/GPT-4oを
　　　　　切り替えてくれる
　　　　　　という機能です。

　でも、アプリ版だけの
　　機能のようですね。
***
　さて、
　　本題です。

　画像をアップロードして
　　“再現してください”でも
　　　まあまあの再現度です。

　しかし、
　　画像の一部だけを
　　　再現したい場合は
　　　　満足いかないでしょう。

　どうしたら
　　満足度を上げることが
　　　できるでしょうか。
***
　これは簡単です。

　画像の一部分だけを
　　ほかのアプリなんかでカットして、
　　　ChatGPTにアップロードします。

　えっ？
　　“そんな手間、掛けたくない”？
　　　贅沢だなぁ😅

　実は、もうひとつ
　　手があります。

　再現して欲しい部分を
　　指定してください。

　例えば、
　　結婚式の写真で
　　　教会の前で花嫁が
　　　　たたずむ姿があるとします。

　ふつうに再現してもらうと、
　　教会の様式から
　　　どこの結婚式か判断されます。

　でもそうすると
　　教会の再現に、力が注がれ、
　　　花嫁衣装は詳細のない
　　　　一般的なものになります。

　花嫁衣装が
　　欲しいのに。

　そこで
　　そのことを伝えるのです。

　上記の例でいえば、
　　“服装を再現してください”

　もちろん、
　　完璧には再現できません。

　ですが、
　　かなり近付くかと
　　　思います。

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

　今回は、ここまで。
【AWS】Lambdaで「StartQuery へのリクエスト中にエラーが発生しました」と表示された場合

# 概要

AWS LambdaをCloudformationで作成した際、
「StartQuery へのリクエスト中にエラーが発生しました」
というエラーに遭遇しました。

原因と解決法を紹介します。

# エラー概要

以下でCF実行。

```yaml
  LambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - 
            Effect: Allow
            Principal:
              Service:
                - sns.amazonaws.com
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      RoleName: LambdaRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSNSFullAccess
```

すると下記エラーがLambdaに表示されていて、試しに「テスト」のところから実施してみましたが失敗していました。

> StartQuery へのリクエスト中にエラーが発生しました Log group '/aws/lambda/xxxxxxx' does not exist for account ID 'xxxxxxx' (Service: AWSLogs; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: xxxxxxx; Proxy: null)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/a7d15d55-0ea2-0350-6539-95c14dc079d4.png)

# 原因
エラーメッセージは、Lambda関数がCloudWatch Logsにログを書き込むための権限がない、と言っています。

「`/aws/lambda/xxxxxxx`」という名前のロググループが存在しないというエラーなので、手動で作成する？と思いましたが、さすがにそこだけ手動でやってくれというのはおかしいと思い調べてみる。

すると、Lambda関数が実行されるIAMロールにCloudWatch Logsにログを書き込む権限が必要であり、それが無かったために生じたエラーとわかりました。

# 解決方法

ということで以下のようにポリシーを付与します。

```yaml
  LambdaRoleTclosing:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - 
            Effect: Allow
            Principal:
              Service:
                - sns.amazonaws.com
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      RoleName: LambdaRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSNSFullAccess
        - arn:aws:iam::aws:policy/AWSLambdaExecute # 追加
```

これでもう一度Cloudformation実行！

先ほどと同じLambdaの画面を確認してみる。
すると、先ほどと同じ箇所に同じエラー（StartQueryリクエストのエラー）が出ています。

しかしこれは問題ありませんでした。
StartQueryとは、CloudWatch Logs Insightsのクエリを実行するためのAPI。
既存のロググループに対してクエリを実行しますが、ロググループが存在しない場合は初めてのLambda関数実行時に自動作成されるからです。

なので、Lambda関数をテストで実行してみます。
すると、CloudWatch Logsにロググループが作成されたことが確認できました。

### (参考)AWSLambdaExecuteとは

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}
```

AWSが提供する管理ポリシーの一つ。
S3バケットからオブジェクトの取得、バケットへの配置、CloudWatch Logsにログを書き込むための権限を提供するポリシーです。
全てのS3バケットとCloudWatch Logsに対するアクセスを許可しているため、セキュリティ上のリスクを踏まえて付与を判断されてください。
超ズボラ・VSCode+DockerでPython環境構築方法

# はじめに
かなりズボラにVSCode+Docker環境を構築した方法を書いておきます。
コンテキストとして私は初学者で、将来アプリケーションをクラウドでデプロイすることも考え、Dockerでの開発環境を整えることにしました。
Dockerfile やYamlを手でいじることなく、通常の仮想環境と同じような使用感でDockerを動かせています。
Windows10環境です。

# 具体的な手順
### 流れ
Microsoft learnのページに従う
→ なんかVSCode+Dockerでpython環境動くようになる
→ 好きな拡張機能を入れる
→ 好きなライブラリをpipで入れる
→ pip-chillしてrequirements.txtに書いておく




### 0.準備
- Docker Desktopのインストール
- Visual Studio Codeのインストール
- pythonでのpip やrequirements.txtの使い方を理解する

### 1.Microsoft learn のページを参考にdev container諸々の導入
下記のMicrosoft learnのコースが非常に親切で、これに従うと特に何も理解していなくてもVSCode上でDockerのPython環境ができてしまいます。devcontainerすごい！

https://learn.microsoft.com/ja-jp/training/modules/use-docker-container-dev-env-vs-code/

このコースに従って操作すると、下記が得られている状態となります。
- なんかよくわからないがVSCodeでDocker上のPythonが動かせる状態
- 拡張機能の入れ方とReopenの手順の理解
- リビルドの手順の理解

↓動作画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/74ca25c8-9e5d-a169-71a0-a036bf436ea0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/531a1b9e-f202-6f69-8acf-eed4c3633feb.png)


### 2. ライブラリを管理する方法を覚える
1.を最後まで行ったなら、postCreateCommand によってリビルド時にrequirements.txtを参照してライブラリをインストールするように設定できているはずです。ということは、あとはこの環境でrequirements.txtをいじる要領だけ覚えておけばうまく運用できそうです。私はライブラリをインストールした後にpip-chillを使う方法を好んで使っています。
- まずpip-chillをいれます。`$ pip install pip-chill`
- つぎにpipで好きなライブラリを入れます。
- その後pip-chillを実行したら結果をrequirements.txtに転記します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/f8442e6e-6a50-c8d9-b3ab-483b4302bcc0.png)

これで、入れたライブラリはリビルド時にインストールされます。
ここまでやると、VSCodeを立ち上げたらDocker環境であることをほとんど意識せず普通の仮想環境みたいに使える状態になっているかと思います。

### 3.使う
後は普通にコードかいて、ターミナルからコードを実行したりします。`$ python hogehoge.py`
devcontainerのおかげでなんかほとんどDockerの知識を使わずに環境ができてしまいました。何か後でしわ寄せを食らったりするのでしょうか(デプロイのときとか苦労したりするのかな)
まあとにかくこうしてDocker上で動くPython開発環境ができたので、楽しく使わせてもらっています。

# おすすめの記事
この記事の操作では必ずしも必要ではないですが、Dockerについて理解を深めるのにはこの記事がよかったです。
この記事の環境構築の前に2部まで読みました。一般的な「Dockerを簡単に解説！」的な記事とは一線を画す丁寧さで、イメージとコンテナの関係、それぞれのコマンドが何を意味しているのか等について、とても参考になりました。


https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/1-1-readme

このあとDockerに関する理解をさらに深めてもう少し応用的な使い方もできるようになりたいです。
クラウド環境でQiskitを使う手順 (Google Colabの場合)

Google Colaboratory などのクラウド環境でQiskitを使いたい場合の手順です。

**ご注意**：クラウド環境では、毎回、Qiskitのインストールが必要になってしまうので、ご自身のパソコンにQiskitをインストールして使うことをおすすめしています。インストールの手順はこちら（[macOS版](https://qiita.com/kifumi/items/8f3617051635f986cc5f)、[Windows版](https://qiita.com/kifumi/items/d36d0601d963a17bcf93)）をご覧ください。
また、Google Colabでは毎回Qiskitのインストールが必要ですが、qBraidの場合はインストールは必要ありません。[「qBraid LabでQiskitを使う手順」](https://qiita.com/kifumi/items/0bf725b9686c15201f27)をご参照ください。

# 1. クラウド環境へのログイン
Google Colabratory を例に紹介します。ブラウザーを開き、 https://colab.research.google.com/ のサイトに入り、右上の「ログイン」からログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/b25ea38f-e18d-8c5b-0220-0af4ed1cf4e8.png)

# 2. ノートブックを開く
以下のいずれかの方法で、ノートブックを開きます。
- 左下の「＋ノートブックを新規作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/5929f457-cdb1-6127-6102-d01f9bcaa247.png)
- 上記のウィンドウが出てこなかった場合、左上の「ファイル」→「ノートブックを新規作成」をクリック。

# 3. Qiskit をインストール
以下のコマンドを最初のセルに入れて、「Shift」+「Enter」で実行します。Qiskitと関連ライブラリーがインストールされます。
```
!pip install qiskit qiskit-ibm-runtime jupyter qiskit-aer qiskit[visualization]
```

# 4. Qiskit で Hello world
続けて、QiskitのHello worldを実行して、Qiskitが正しく動くか確認してみましょう。
[Qiskit公式ドキュメントのHello world](https://docs.quantum.ibm.com/start/hello-world) から最初のセルのコードをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/2ed9083d-715a-b365-6b0d-6548eb739a14.png)

ノートブックの次のセルに貼り付け、「Shift」+「Enter」で実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/5a0f0fb5-a95b-7628-18c9-a65930e9fd7b.png)

正しくQiskitが動いている場合は、以下の回路図が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151117/49937210-b757-9638-e800-89f4a042fb3e.png)

# 5. 次にQiskitを使う場合
次にQiskitを使う場合や、新しいノートブックを立ち上げた場合、上記の1〜3の手順を毎回行います。

以上です！
Cloudflareのbot検知を回避するnodriverを紹介します

## はじめに
前回、Cloudflareのbot検知を回避する方法として、DrissionPageを紹介させていただきました。

https://qiita.com/Kazukiya/items/707d56e8f1122e41fee1

現時点だと、こちらのライブラリは問題なく使えるため、そのまま使用しても問題ありません。

ですが、READMEが中国語なのでとっつきにくい印象があります。また、セキュリティ面に関しても多少不安が残ります。

そこで、より安心して使えるライブラリを紹介します。

## nodriver
このライブラリは、[Undetected-Chromedriver](https://github.com/ultrafunkamsterdam/undetected-chromedriver)の開発者が開発した後継のプロジェクトです。

https://github.com/ultrafunkamsterdam/nodriver

Undetected-Chromedriverのライブラリは前に使っていましたが、なにか問題が起きたことはありませんでした。
なので、DrissionPageよりは安心して使えると思います。

もちろん、絶対に安心ではない点についてはご理解ください。

## 利便性の高いドキュメント
安全面以外にもこのライブラリを推すポイントがあります。

それは、このnodriverのGitHubリポジトリには、詳細なドキュメントが用意されていることです。

クイックスタートガイドやクラスに実装されたメソッドについての詳細な説明が記載されており、これはとても助かります。

https://ultrafunkamsterdam.github.io/nodriver/

ドキュメントでは、クラスがBrowser、Tab、Elementの3つに分類されており、それぞれのクラスに属するメソッドが体系的に整理されています。

各メソッドについては、引数や返り値の型、説明が明確に記述されているため、開発者にとって利用しやすいリファレンスとなっています。

また、Cursorを使ってドキュメントを読み込むことで、自然言語処理による簡単な実装が可能です。

さらに、各クラスのページをChatGPTやClaudeにコピー＆ペーストすることで、それぞれのメソッドについての詳細な解説を得ることができます。

## 基本的な使い方

それでは、前回同様Cloudflareのbot対策がされている[Unite API](https://uniteapi.dev/meta)を使って、実際に値が取れるか試してみます。

今回はここのゲーム数を取得してみます。

![スクリーンショット 2024-05-18 12.06.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849608/44b1be14-a0ed-7732-44f7-dee8f1d7df4c.png)

```Python
import nodriver as uc
import re

async def main():

    browser = await uc.start()
    page = await browser.get('https://uniteapi.dev/meta')

    await page.wait(5)

    game_info = await page.query_selector('#__next > div.sc-bd5970f2-0.krVYZr > div.sc-eaff77bf-0.bvmFlh > h3')

    # ゲーム数の抽出
    game_count_match = re.search(r"(\d+)\s*games", game_info.text_all)
    if game_count_match:
        game_count = int(game_count_match.group(1))
    else:
        game_count = None

    print(game_count)

if __name__ == '__main__':

    # since asyncio.run never worked (for me)
    uc.loop().run_until_complete(main())
```

実際にCloudflareのbot対策を回避し、取得することを確認しました！

```
150906
```

## 終わりに
DrissionPageが上手く使えなかった方は是非試してみてください。
スクレイピングの幅が広がります。
PythonでAWS CLIコマンド実行の練習 (boto3編)

# 目的
https://qiita.com/sincere_networker/items/acc5f86244fe5e50e290

上記ではsubprocess.runでAWS CLIコマンドを実行していたが、boto3に変更してみる

https://docs.aws.amazon.com/ja_jp/pythonsdk/

# Pythonスクリプトの作成
直近３ヶ月間の最大スループット値(In/Out)を取得する
```python:get_ec2_throughput_boto3.py
import boto3
import json
import time
from datetime import datetime, timedelta

def cloudwatch_get_metric(metric_name):
    # boto3クライアントを作成
    cloudwatch = boto3.client('cloudwatch')

    # CloudWatchからメトリクスデータを取得
    response = cloudwatch.get_metric_statistics(
        Namespace='AWS/EC2',
        MetricName=metric_name,
        Dimensions=[
            {
                'Name': 'InstanceId',
                'Value': 'i-085509fb0174af9cd'
            },
        ],
        StartTime=start_time,
        EndTime=end_time,
        Period=period,
        Statistics=['Maximum']
    )

    # データを処理する
    datapoints = response['Datapoints']
    maximum_values = [datapoint['Maximum'] for datapoint in datapoints]

    return maximum_values

start_script_time = time.time()

# 現在の日付から3か月前の日付を計算
end_time = datetime.utcnow()
start_time = end_time - timedelta(days=90)
period = 3600 * 24 * 90

# 日付をISO 8601形式に変換
start_time_str = start_time.strftime('%Y-%m-%dT%H:%M:%S')
end_time_str = end_time.strftime('%Y-%m-%dT%H:%M:%S')
print(f'{start_time_str=}')
print(f'{end_time_str=}')

NetworkIn = cloudwatch_get_metric('NetworkIn')[0] if cloudwatch_get_metric('NetworkIn') else None
NetworkOut = cloudwatch_get_metric('NetworkOut')[0] if cloudwatch_get_metric('NetworkOut') else None
print(f'{NetworkIn=}')
print(f'{NetworkOut=}')

end_script_time = time.time()
elapsed_time = end_script_time - start_script_time

print(f'{elapsed_time=}')
```
# 実行
```:出力
[cloudshell-user@ip-10-130-39-130 ~]$ python get_ec2_throughput_boto3.py 
start_time_str='2024-02-18T02:25:34'
end_time_str='2024-05-18T02:25:34'
NetworkIn=57597321.0
NetworkOut=68488705.0
elapsed_time=0.5444772243499756
```
subprocess.runでの実行時間は2.34秒だったので、1.8秒短くなりました。
【賞金/賞品あり】2024年学生向けハッカソンまとめ

## はじめに
本記事では、2024年に開催される学生向けのハッカソンをまとめました。
記載されている情報に誤りがある場合は、
コメントなどで教えていただけると幸いです。

## 技育CAMP
- **日程**: 2024/6/8~9,2024/6/22~23,2024/7/13~14,2024/7/20~21
- **場所**: オンライン
- **賞金**: 
    - 最優秀賞:チームに賞金50,000円贈呈いたします
    - 優秀賞:チームに賞金30,000円贈呈いたします
    - 努力賞:チームに賞金5,000円贈呈いたします
    - 参加賞:支給条件として２日間の参加とハッカソンの成果発表された方全員に参加賞1,000円を贈呈いたします
- **詳細**: [技育CAMP | サポーターズ公式サイト](https://talent.supporterz.jp/geekcamp/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795089/46182899-3155-96b0-824b-1a798203c0c5.png)


## RSS Hackathon 2024 Beyond
- **日程**: 2024年6月21日〜6月23日
- **締切**: 2024年6月9日(日)23:59
- **場所**: 東京都中央区京橋3-1-1 東京スクエアガーデン7F
- **賞金**: 総額75万円
- **補助**: 一都三県（東京都、千葉県、神奈川県、埼玉県）以外にお住まいの方には交通費・宿泊費一部支給あり
- **詳細**: [RSS Hackathon 2024 Beyond公式サイト](https://race-ss.co.jp/hackathon)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795089/f43f6a3f-aa9c-8cd9-d152-9b7267f44507.png)


## 福岡24時間AIハッカソン 2024
- **日程**: 2024年7月20日（土）〜21日（日）
- **締切**: 2024年6月23日（日）23時59分
- **場所**: 福岡デザイン＆テクノロジー専門学校
- **賞金**: 10万円
- **副賞**: 「AIフェスティバル 2024」ご招待
- **詳細**: [福岡24時間AIハッカソン 2024公式サイト]()
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795089/aa9b6907-2437-7baf-91d0-7d507308ec3e.png)

## 学生向けハイブリット型ハッカソンTornado2024
- **日程**: 2024年8月20日(火)〜9月21日(土)
- **締切**: 2024年8月2日(金)
- **場所**: 帝京大学霞ヶ関キャンパス
- **賞金**: 30万円
- **詳細**: [Tornado2024公式サイト](https://tornado-official.jp/tornado2024/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795089/3f211d0f-bf66-e285-870b-55daeead7c11.png)

## TWOGATE DEVCAMP 2024 SUMMER 高専生・高専卒生向けハッカソン
- **日程**: 2024年8月21日(水)〜8月27日(火) ※土日除く
- **締切**: 2024年7月17日(水)
- **場所**: 3日オンライン＆2日オフライン（都内予定）
- **賞金**: 最優秀賞 HHKB Studio そのほかにも賞あり
- **各種補助**: 交通費・食費一部補助（交通費は距離に応じて最大3万円程度補助予定）、宿泊施設提供、単位認定の相談受付可能

https://devcamp.twogate.com/2024

## 全国学生対抗SFプロトタイピング ハッカソン2024 - 名古屋テレビ【メ～テレ】
- **日程**: 9/14(土)～16(月・祝)
- **優勝賞金**: 30万円

https://www.nagoyatv.com/hackathon-electricsheep/

## Hack U 東京電機大学 2024
※ 東京電機大学生であること（社会人学生を除く）
- **日程**: 2024年9月24日(火)〜10月5日(土)
- **場所**: LINEヤフー株式会社 紀尾井町オフィス
- **賞**: 審査員が優秀作品を複数選定し、表彰と副賞を贈呈

https://hacku.yahoo.co.jp/dendai2024/

## JPHAKCS
- **日程**: 10月26日(土) ~ 27日(日) ※10月1日（火）締め切り
- **場所**: 全国8つの会場

https://jphacks.com/

## すぱじゃむ（本選）
- **日程**: 11月16日(土)～18日(月) ※予選の応募開始は6月を予定
- **場所**: ライムリゾート箱根
- **優勝賞品**: シリコンバレーツアー
- **各種補助**: 本選の宿泊・飲食代は主催が負担します。温泉地までの交通費に関しては、規定に沿って補助させていただきます。

https://spajam.jp/

## 参考資料

https://qiita.com/mahiro72/items/934ddb15edf8b45e35d6

👆 技育CAMP や Hack U、すぱじゃむなど の定期的に開催されているイベントに関しては、こちらの記事が 参加者のレベル感 など、詳細に書かれているのでとても参考になります。
CodeIgniter4 でGETかPOSTか判断する

## getMethod()
4.2くらいの頃に非推奨になっていた時期があり、
それ以来 `getMethod()` はなんとなく使わないようにしてました。
（'post' や 'get' のような小文字でしか返ってこないというバグがあったようです）

:::note
getMethod()は現在非推奨ではありません。
:::
:::note
4.5 で小文字バグは修正され、現在は問題なく利用できるようです。
:::

`getMethod()` を使わずに POST かどうか判断するために、
~~~php
if ($this->request->getPost()) {
}
~~~
みたいなコードを書いていたのですが、それもどうなのかなと思い改めてドキュメントを見たところ、`is()` が追加されてました。

## is()
4.3 の時点で追加されていました！
真偽値を返すので、下記みたいな感じで使えるみたいです。
~~~php
if ($this->request->is('get')){
    // GET の場合
}
if ($this->request->is('post')){
    // POST の場合
}
~~~

基本的にはこちらを使うのでよさそうです。

## 参考
[ CodeIgniter4 User Guide - IncomingRequest Class ](https://codeigniter.com/user_guide/incoming/incomingrequest.html#is)
CodeIgniter4でのバリデーション（ルールの設定からエラーメッセージの表示 ）

今まで結構ふんわりバリデーションをしてたので基本的なことをおさらいしました。

## 設定
`Config/Validation.php` にバリデーションルールを書く。

~~~php:Config/Validation.php

public array $hoge = [
    'name' => [
        'field' => 'name',
    
        'label' => 'Name',
        'rules' => 'required|max_length[30]',
    ],
];
~~~


## コントローラー
`$this->validateData()`を用いてバリデーションします。
4.4以降の場合、`$this->validator->getValidated()`でデータを取得。

:::note warn
日本語のユーザーガイドでは`$this->validate()`が使用されていますが、現在推奨されていないようです。
:::

~~~php:Hoge.php
class Hoge extend BaseController {

    public function store() {
        if (!$this->validateData($this->request->getPost(), 'hoge')) {
            return redirect()->to('/行先')->withInput();
        }
        $validData = $this->validator->getValidated();
        // 好きなことをする
    }
}
~~~


## ビュー（エラーメッセージの表示）
codeigniter3 のときにあった`set_error_delimiters()`みたいなのないかなーと思っていたらありました。
4.3以降は`validation_show_error`が利用できるようです。

エラーメッセージ用のhtmlを好きなところ（今回は`Views/errors/validation`）に`single_error.php`を作成し、
`config/Validation.php` に設定。
~~~php:single_error.php
<span class='red'><?php echo esc($error); ?></span>
~~~

~~~php:Validation.php
public array $templates = [
    'single_error' => 'errors/validation/single_error',
];
~~~

エラーメッセージを表示したいViewで、以下のように書けばバリデーションに引っかかったときにエラーメッセージが表示される。

~~~php:HogeView.php
<div>
<?php
    echo form_label('お名前'); 
    // <label>お名前</label>
    
    echo form_input('name', '');
    // <input type="text" name="name" value="">
    
    echo validation_show_error('name', 'single_error');
    // <span class='red'>お名前を入力してください</span>
?>
</div>
~~~

## おまけ
### エラーメッセージの日本語化
composer で翻訳をして、
~~~
composer require codeigniter4/translations
~~~
`Config/App.php` の `$defalutLocale` を `ja` にする。

もしくは

`app/Language` に `ja`ディレクトリと`Validation.php`を作成し、一つずつ書いていく。
（カスタムバリデーションのエラーメッセージなどはこれ）

~~~php:Language/Validation.php
<?php
return [
    'required' => '{field} を入力してください。',
];
~~~

# 参考
[ Codeigniter4 User Guide ](https://codeigniter.com/user_guide/index.html)
[ Codeigniter4 ユーザーガイド ](https://ci-trans-jp.gitlab.io/user_guide_4_jp/index.html)
[ CodeIgniter4のシステムメッセージを日本語にする ](http://blog.a-way-out.net/blog/2020/12/05/codeigniter4-system-message-translations/)
CodeIgniter4でPHP Unitテストが全部引っかかる

ただのうっかりでしたが、気づくのに時間がかかってしまったためメモ。

## どうして
- ついこないだまで問題なくパスしていた Controller 周りのテストがほぼ全部ひかっかる
- 特に Controller 内の変更はしていない
- リダイレクト先のURLがすべて同じURL（未ログイン時に遷移する画面のURL）になっている

## 原因
Filler に csrf を追加したので、post 値に `csrf_hash()` を書く必要があった（のに書いてなかった）

途中で csrf 追加したので全然気が付きませんでした。
CodeIgniter4 の set_value() で値保持できない

ただのうっかりだったのですが、気づくのに時間がかかってしまったのでメモ。

## どうして
`old()` は使えるのに、`set_value()`だと値の保持ができない

## 原因
BaseController の `initController()` 内に
~~~php
$this->session = \Config\Services::session();
~~~
を記載してないだけでした。

`old()` は`\Config\Services::session()`を呼び出してなければ内部で呼び出してくれるため、設定忘れていても利用できたみたいです。
[React] コンポーネントを用いたレンダリング

# 目次
- [使用するプロジェクトのフォルダ構成](#使用するプロジェクトのフォルダ構成)
- [main.jsxのソースコード](#main.jsxのソースコード)
- [main.jsxのソースコードの解説](#main.jsxのソースコードの解説)
- [index.htmlのソースコード](#index.htmlのソースコード)

# 使用するプロジェクトのフォルダ構成
~~~:fold_structure
├── node_modules/
├── public/
│   └── vite.svg
├── src/
│   ├── App.jsx
│   ├── App.css
│   ├── index.css
│   ├── lectures.js
│   ├── main.jsx
│   └── (other components)
├── index.html
├── package.json
├── README.md
└── vite.config.js
~~~

# index.htmlのソースコード

~~~html:index.html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + React</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>
~~~

# main.jsxのソースコード
~~~ts:main.jsx
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App.jsx";
import "./index.css";
import lectures from "./lectures.js";

ReactDOM.createRoot(document.getElementById("root")).render(
    <App lectures={lectures}　/>
);
~~~

# main.jsxのソースコードの解説
1. `ReactDOM.createRoot(document.getElementById("root"))`
`ReactDOM.createRoot`は、React 18で導入された新しいAPIで、Reactアプリケーションのルートを作成します。
`document.getElementById("root")`は、HTMLドキュメント内の`id`属性が`root`であるDOM要素を取得します。この要素は通常、Reactアプリケーションがレンダリングされるコンテナです。

1. `.render(<App lectures={lectures} />)`
`.render`メソッドは、指定したReactコンポーネント（ここでは`<App />`）を先ほど取得したDOM要素にレンダリングします。
`<App lectures={lectures} />`は、Appコンポーネントを呼び出しています。このとき、`lectures`という名前のプロパティをAppコンポーネントに渡しています。`lectures`は、このコンポーネントで使用されるデータを含む変数です。

# 全体の流れ
#### 1. DOM要素の取得
~~~ts:main.jsx
document.getElementById("root")
~~~
これは下記のHTMLのDOMから、`id`が`root`の要素を取得します。
~~~html:index.html
<div id="root"></div>
~~~

#### 2. Reactアプリケーションのルート作成
~~~ts:main.jsx
ReactDOM.createRoot(document.getElementById("root"))
~~~
これはReactの新しいルートAPIを使用して、`root`要素をReactアプリケーションのルートとして設定します。

#### 3.Reactコンポーネントのレンダリング
~~~ts:main.jsx
.render(<App lectures={lectures}　/>）
~~~
これはAppコンポーネントをroot要素にレンダリングし、`lectures`というプロパティをAppコンポーネントに渡します。

# 参考リンク
- [【2024年最新】React(v18)完全入門ガイド｜Hooks、Next14、Redux、TypeScript
_セクション4:まずはxx_26.★重要★本コースでxx](https://www.udemy.com/)
robloxでassistant その57

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
壁を作れ。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```

local a = 0
local add = math.pi / 12
local radius = 30
local width = 6
for count = 0, 30 do
	local p = Instance.new("Part")
	p.Size = Vector3.new(4, 1, 2)
	p.Parent = game.Workspace
	local x = math.cos(a) * radius
	local y = math.sin(a) * radius
	local h = 20
	p.Position = Vector3.new(x, h / 2, y)
	p.Orientation = Vector3.new(0, a * 180 / math.pi * -1, 0)
	p.Size = Vector3.new(1, h, width)
	p.Anchored = true
	radius = radius + 1
	width = width + 0.3
	a = a + add
end
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1425e34d-da83-779b-ed60-4124a18c7c6a.png)


以上。
Termuxでlibfprint設定のエラーを解決する方法

この記事では、Termux上のUbuntuで、
libfprint設定中のエラーの解決方を
書いています

## 解決法
下記のコマンドを順番に実行
```bash:
rm /var/lib/dpkg/info/udisks2.postinst
rm /var/lib/dpkg/info/libfprint0:*.postins
rm /var/lib/dpkg/info/fprintd.postinst
rm /var/lib/dpkg/info/fprintd.postinst
rm /var/lib/dpkg/info/libfprint-2-2*.postinst
rm /var/lib/dpkg/info/libpam-fprintd*.postinst
dpkg --configure -a
```
Docker　WordPress環境　テーマファイルをローカルマシンでかつ自前のエディタで触りたい！(Windows環境)

DockerでWordPress環境用意しましたが、テキストエディタで触りたいけど、触れない…
どうやら、DockerのVolumeであれこれ指定する必要があるらしい

色々調べた備忘録残します。

Docker Volumeを使用して、ローカルのファイルシステムとDockerコンテナ内のファイルシステムを同期させることができます。
これにより、ローカルでファイルを編集し、それがコンテナ内に反映されるようになります。

Docker Composeを使用している場合は、docker-compose.yml ファイルに以下のような設定を追加します。

```
services:
  wordpress:
    volumes:
      - ./path/to/local/theme:/var/www/html/wp-content/themes/your-theme
```

この設定では、ローカルの path/to/local/theme ディレクトリと、
コンテナ内の /var/www/html/wp-content/themes/your-theme ディレクトリを同期します。your-theme は編集したいテーマのディレクトリ名に置き換えてください。

設定を追加したら、Docker Composeを再起動します。

```
docker-compose down
docker-compose up -d
```

これで、ローカルのテキストエディタでファイルを編集すると、その変更がDockerコンテナ内にも反映されるようになります。

ちなみに
ローカルの - ./path/to/local/theme ディレクトリを、同期したいローカルのディレクトリは、
例えば、C:\Users\USER\Desktop\yourthemeにしたい場合、

```
services:
  wordpress:
    volumes:
      - /c/Users/USER/Desktop/yourtheme:/var/www/html/wp-content/themes/your-theme
```

▼簡易作業流れ
・Docker Desktopを立ち上げる
・VSコードを立ち上げある
・ymlがあるフォルダにカレントディレクトリを移動する
・ymlを適宣設定を終えたら、Docker Composeをターミナルで起動する（docker-compose up -d）
そうすると同期指定したファイル群から触れるようになる！！

参考文献
DockerでWordPressローカル環境を立ち上げてみた！
https://wpmake.jp/contents/customize/docker-wp-localdev/
画像モデルのトレーニング時間を短縮する EfficientTrain++ を解説

※ この記事は「EfficientTrain++: Generalized Curriculum Learning for Efficient Visual Backbone Training」の要約になります。

## この記事を読んでわかること
1. EfficientTrain++は、画像系のモデルのトレーニング効率を改善するための一般化されたカリキュラム学習手法
2. 低周波成分を利用し、徐々に難易度の高いパターンを導入することでトレーニング時間を短縮する
3. ImageNet-1K/22Kでの実験により、トレーニング時間を1.5〜3.0倍削減しつつ精度を維持することを確認

## 想定読者

1. **機械学習研究者および開発者**: 特に、画像系のモデルのトレーニングに関心があり、効率的なトレーニング方法を探している人

2. **データサイエンティスト・AIエンジニア**: 大規模なデータセットを用いてモデルを訓練する必要があり、トレーニングコストを削減したいと考えている専門家

## 従来手法の問題点

視覚バックボーンモデル (例えば Vision Transformers のような) はトレーニングが高コストです。これを解決するために、カリキュラム学習手法を用いることができますが、この手法も従来のものでは限界があります。

その理由は以下になります。

1. **トレーニング時間と計算コストの高さ**:
   - **大規模データとモデルの複雑性**: 近年の視覚バックボーン（例えば、Vision Transformers）は非常に大規模なデータセット（数億の画像）と膨大な数のパラメータ（数十億）を持っています。これにより、トレーニングには非常に多くの計算リソースと時間が必要になります。
   - **経済的負担**: 高価な計算リソース（例えば、TPUやGPU）を長時間使用することは、多くの研究者や企業にとって経済的な負担となります。このため、頻繁にモデルをトレーニングすることが難しくなり、イテレーションサイクルが遅くなります。
   - **環境負荷**: 計算リソースの大量消費は高い電力消費を伴い、それにより大きな炭素排出を引き起こします。環境への悪影響が問題視される中で、効率的なトレーニング手法の必要性が増しています。

2. **既存のカリキュラム学習手法の限界**:
   - **難易度評価の難しさ**: 既存のカリキュラム学習手法では、トレーニングデータの難易度を適切に評価し、容易なサンプルから難しいサンプルへと順に導入する必要があります。しかし、この難易度評価を一般的かつ軽量に行うことは困難です。
   - **汎用性の欠如**: 既存の手法は特定のタスクやデータセットに対して最適化されている場合が多く、異なるタスクやデータセットに対しては効果が限定的です。これにより、さまざまなモデルやデータセットに適用することが難しくなります。
   - **計算コストの増加**: 既存のカリキュラム学習手法では、データの難易度を評価するために追加の計算が必要となる場合が多く、結果としてトレーニング全体の計算コストが増加することがあります。

## Efficient Train++ で低コストで性能を上げる

### EfficientTrain++ とは？

EfficientTrain++は、視覚バックボーンのトレーニング効率を向上させるための一般化されたカリキュラム学習手法です。従来のカリキュラム学習が簡単なデータから徐々に難しいデータに移行するのに対し、EfficientTrain++は各データ例の中で徐々に難易度の高いパターンを見つけ出し、それを学習に取り入れる「ソフトセレクション」アプローチを採用しています。この方法により、トレーニング全体を通じてすべてのデータを活用しつつ、学習初期段階では「学びやすい」パターンに焦点を当て、トレーニングが進むにつれて難しいパターンを徐々に導入します。

### EfficientTrain++ のメリット

1. **トレーニング時間の短縮**:
   - EfficientTrain++は、視覚バックボーン（例えば、ResNet、ConvNeXt、DeiTなど）のトレーニング時間を1.5〜3.0倍短縮します。これにより、計算リソースとコストの大幅な節約が可能になります。

2. **精度の維持または向上**:
   - トレーニング時間を短縮しつつ、モデルの精度を維持または向上させることができます。これにより、効率的なトレーニングが実現します。

3. **コスト削減**:
   - 計算コストの削減に伴い、消費電力と炭素排出量も削減できます。これは、環境保護の観点からも重要です。

4. **一般性と簡便性**:
   - EfficientTrain++は、さまざまな視覚バックボーンモデルに簡単に適用でき、追加のハイパーパラメータ調整が不要です。

5. **自己教師あり学習への適用**:
   - EfficientTrain++は、自己教師あり学習（例えば、MAE）にも効果を発揮します。

### EfficientTrain++ の手順

1. **低周波成分の抽出**:
   - トレーニング初期段階では、入力データのフーリエスペクトルにおける低周波成分を学習します。これにより、モデルは「学びやすい」パターンを先に学習します。
       - 低周波成分は画像の大まかな特徴を捉えているため、モデルはまず簡単なパターンを学習することができます。

2. **データ拡張の調整**:
   - 初期段階では、データ拡張の強度を弱めに設定し、元の画像内容を重視します。これにより、モデルはより自然な画像パターンを学習します。

3. **カリキュラム学習スケジュールの設計**:
   - トレーニングが進むにつれて、徐々に高周波成分や難易度の高いパターンを導入します。これを実現するために、専用の検索アルゴリズムを使用して効果的なカリキュラム学習スケジュールを設計します。

4. **効率的な大規模並列トレーニング**:
   - 多数のGPUを使用した大規模並列トレーニングを効率化するための技術を導入します。これにより、トレーニング速度をさらに向上させます。

5. **データ前処理の最適化**:
   - CPUやメモリのデータ前処理負荷を軽減するための技術を導入し、トレーニング全体の効率を向上させます。

## まとめ

いかがだったでしょうか？画像系のモデルに対するカリキュラム学習手法である Efficient Train++ の概要でした。
画像系が専門でない人もおもしろいアイディアなので知っておくとよさそうですね。

おわり。