OmniAICreator/Qiita-1.07M huggingface dataset:
LLMが流行った理由と、その仕組みを初心者向けに解説

# **AIとLLMが流行った理由と、その仕組みを初心者向けに解説**  

こんにちは、しゅんです。最近、「AI」や「LLM（大規模言語モデル）」という言葉を耳にする機会が増えていませんか？  

AIは単なる流行ではなく、これからの時代に欠かせない技術です。しかし、**AIがどのように動いているのか、なぜここまで発展したのか**、気になったことはありませんか？  

この記事では、**AIの中核技術であるTransformer**について、初心者にもわかりやすく解説し、どのような仕組みで動いているのかを例え話を交えて説明していきます。  
新幹線の車内でGPTを使って書きました。
最後まで見てくれると嬉しいです。何か間違ったら、ぜひコメントしてください。よろしくお願いします

---

## **1. なぜ今AIが急速に進化しているのか？**  

AIがこれほど発展した背景には、3つの大きな理由があります。  

### **1.1 データの爆発的な増加**  

現代では、インターネットとモバイルデバイスの普及により、AIが学習できるテキスト、画像、音声データの量が膨大に増えました。これにより、AIはこれまで以上に多くの情報を処理し、精度を高めることができるようになりました。  

**例え話：「AIの勉強道具が増えた」**  
昔のAIは「1冊の教科書」で勉強していたけれど、今のAIは「世界中の図書館」の本を自由に読むことができるようになりました。  

---

### **1.2 計算能力の飛躍的な向上**  

AIは大量のデータを処理するために、通常のコンピュータでは時間がかかります。そこで登場したのが、**GPU（グラフィックプロセッシングユニット）** やTPU（Tensor Processing Unit）といった高速処理に特化したチップです。  

**例え話：「電卓からスーパーコンピュータへ」**  
昔のAIは「手計算で宿題を解く」ようなものでしたが、今は「スーパーコンピュータを使って一瞬で答えを出せる」ようになったのです。  

---

### **1.3 Transformerの登場**  

2017年、Googleが発表した論文「**Attention Is All You Need**」により、AIの学習方法が劇的に進化しました。  

**例え話：「勉強のやり方が劇的に進化した」**  
従来のAIは「1ページずつ本を読む」スタイルでしたが、Transformerは「本全体を同時に見て内容を理解する」速読の達人です。  

---

## **2. Transformerとは？**  

Transformerは、**文章や画像、音声などのデータを処理するための画期的なアルゴリズム(計算方法)** です。  

### **2.1 Transformerの構造**  

Transformerは、大きく分けて **「エンコーダ（Encoder）」** と **「デコーダ（Decoder）」** の2つの部分に分かれています。  

1. **エンコーダ（Encoder）**：  
   - 入力されたデータを細かく分け、意味を理解する処理を行う。  
   - 例：「本の内容を細かく要約する」  
   
2. **デコーダ（Decoder）**：  
   - エンコーダが理解した情報を基に、最適な回答や予測を生成する。  
   - 例：「要約を元に、質問に適切に答える」  

---

## **3. Transformerの重要な用語解説**  

Transformerの中で使われる重要な仕組みについて、詳しく解説していきます。  

---

### **3.1 自己注意機構（Self-Attention）**  

**「どの単語がどの単語と関連しているかを考える仕組み」**  

AIが文章を理解する際、文章の各単語同士の関連を見つける必要があります。例えば、「私はカレーが好き」という文章では、「カレー」と「好き」の関係が重要です。  

**例え話：「会話の重要ワードを拾う」**  
友達が「昨日、ラーメン屋でカレーを食べた」と言ったら、あなたは「ラーメン」よりも「カレー」に注目しますよね？AIも同じことをします。  

---

### **3.2 クエリ・キー・バリュー（Query, Key, Value）**  

自己注意機構の内部では、各単語に「検索用のタグ（Query）」と「関連づける情報（Key, Value）」が割り当てられます。  

**例え話：「図書館の本探し」**  
- クエリ（Query）→「おもしろい本を探す」  
- キー（Key）→「ジャンル：ミステリー」  
- バリュー（Value）→「シャーロック・ホームズの本」  

---

### **3.3 多頭注意機構（Multi-Head Attention）**  

複数の視点から文章を分析するために、AIは複数の自己注意機構を同時に動かします。  

**例え話：「探偵が複数の手がかりを分析する」**  
1人の探偵だけでなく、複数の探偵が異なる視点から事件を解決することで、より深い理解が得られます。  

---

### **3.4 位置エンコーディング（Positional Encoding）**  

文章の単語の順番を記録し、文脈を正しく理解するための技術です。  

**例え話：「料理の手順を守る」**  
「卵を割ってから焼く」と「焼いてから卵を割る」では、意味が全く異なります。AIはこの順序をきちんと覚えています。  

---

### **3.5 残差接続（Residual Connection）**  

深い層になるほど情報が消えてしまう問題を防ぐために、元の情報を保持しながら学習を続けます。  

**例え話：「復習をしながら新しい勉強を進める」**  
新しい知識を学んでも、過去の内容を振り返ることで忘れにくくなります。  

---

## **4. Transformerを活用した主要なAI技術**  

- **Vision Transformer（ViT）**：画像認識に応用  
- **BERT**：自然言語処理に応用  
- **DALL·E**：画像生成  
- **T5**：文章要約  

---

## **5. まとめ**  

今回の記事では、AIの進化の背景とTransformerの仕組みについて詳しく解説しました。  

**重要ポイント**  
1. AIが進化した理由は、データ・計算能力・新技術の向上。  
2. Transformerは、情報の関連性を理解する画期的な仕組み。  
3. AIはこれからも社会のあらゆる場面で活用される。  


## **最後に**  

ここまで読んでいただき、ありがとうございました！  
個人的には今年はAI Agentが成長しそうな年、それとマルチモーダルにも期待しています

AIは日々進化しており、これからますます私たちの生活を便利にしていくでしょう。興味を持った方は、ぜひ一緒にAIについてさらに深く学んでみてください。
お前はVimとEmacsから逃げられない

# お前はVimとEmacsから逃げられない
**VimとEmacs**は、プログラマーの**運命を握る双璧**である。それは単なるエディタの枠を超え、OSの深奥に根を張り、**あらゆる環境を支配**している。
**UNIX、Linux、MacOS、そしてWindows**――どの道を選ぼうと、彼らの影響下を逃れることは許されない。**これは宿命であり、真理である。**

<details>
この記事は、とあるVimmerが、VSCodeしか使ったことがない人々を啓発するために書いたものです。
具体的には、「VimとEmacsがあなたをすでに固く束縛している」という事実を示すべく、勢いで仕上げました。

なお、この文章の作成にはGPT-4oの力を借りています。

※nanoがエディタならcatやechoもエディタ（自論）
</details>

## Bash：VimとEmacsの闘争が息づく魔窟
**Bashは魔界である**。その奥底にはVimモードとEmacsモードという二大勢力の抗争が渦巻いている。**初期設定ではEmacsキーバインドが支配**し、`Ctrl+A`で行頭、`Ctrl+E`で行末に移動する操作がデフォルトとして君臨している。しかし、**コマンド一つでその秩序は崩壊**する。
`set -o vi`――この呪文を唱えた瞬間、**BashはVimモードへと変貌**を遂げる。そこで待ち受けるのは、**Vimの編集モードが清濁併せ呑む**世界だ。

Bashを使う限り、ユーザーは **「Vim」か「Emacs」かの二択を迫られる。** 第三の選択肢など存在しない。ここは**逃げ場なき戦場**である。

---

### 真理の第一方程式
**(Vim | Emacs) = Bash**

## MacOS：Emacsが浸透する静かなる支配
MacOSは、**Emacsが静かに息づく庭園**である。その起源を遡ればNEXTSTEPに行き着き、そこには既にEmacsキーバインドの種が蒔かれていた。`Ctrl+A`で行頭に、`Ctrl+E`で行末に――Macユーザーの日常は、**知らず知らずのうちにEmacsへ飲み込まれている**。

だが、それだけではない。MacOSにはVimもまたプリインストールされている。ターミナルを開き、`vi`と入力すれば、その瞬間に**Vimの世界が眼前に広がる**。MacOSはVimとEmacsが**共存しながらも緊張関係を保つ異界**なのだ。

このように、MacOSを使う者は、Emacsの影響を逃れられず、**Vimの存在を無視できない二重の呪縛に囚われる運命**にある。

---

### 真理の第二方程式
**Vim * Emacs = MacOS**

## Linux：Vimが覇を唱える大陸
Linuxは、**Vimが闊歩する帝国**である。すべてのLinuxディストリビューションは**Vimの存在を前提として設計**されている。ターミナルを開けば、そこに待つのはvimであり、設定ファイルを編集しようとすれば**Vimが呼び出される**。

さらに、リモートサーバーにSSHで接続した場合でも、Vim以外の選択肢など存在しない。そこにあるのは、ただひとつの真実――**「Vimが唯一のエディタである」** という現実だ。たとえ最小構成でLinuxをインストールしようが、そこで待つエディタは**Vimのただ一つ**である。

Linuxは、**Vimの影響から逃れる余地を一切与えない**。**使う者すべてがその支配下に置かれる**。

---

### 真理の第三方程式
**Vim = Linuxディストリビューション**

## Windows：WSLがもたらす昇華
かつてWindowsは、VimやEmacsから逃れる避難所のように見えた。しかし、その**幻想はWSL（Windows Subsystem for Linux）の登場によって打ち砕かれる**。
WSLは、**WindowsにLinuxの魂を吹き込む存在**である。これを導入すれば、Bashが使えるようになり、**VimモードかEmacsモードの選択**を迫られる。そして当然ながら、**vimもプリインストールされている**。

ここに至り、Windowsはもはや**独立した存在ではない**。それは**Linuxへと昇華され、Vimの支配下に組み込まれる**のだ。

---

### 真理の第四方程式
**Vim = Linux = WSL = Windows**

## 結論：お前らは逃げられない
Bashは「Vim」と「Emacs」の**抗争が続く魔窟**であり、MacOSは「Vim」と「Emacs」が**共存する異界**である。LinuxはVimの覇権のもとに統治され、**WindowsはWSLによってLinuxに呑み込まれた**。

これらすべての事実が指し示すのは、**「VimとEmacsから逃れる術は存在しない」** という冷厳な現実である。この記事を読み終えた今、あなたがすべきことは明確だ。まず、**エディタとしてVimかEmacsのどちらかを選べ**。そして、MacOSを使うなら、**その両方から逃れられないことを心に刻んでおく**が良い。
漢字「漸」に学ぶ“少しずつ確実に”の知恵

# 私たちがよく耳にする「漸進的」という言葉

私たちがよく耳にする「漸進的」という言葉。これは「段階的に進む」「徐々に前に進んでいく」という意味ですが、この言葉の由来である漢字「漸」には、実はとても奥深い背景があります。今回は、その成り立ちをひも解きながら、"少しずつ確実に"の大切さを考えてみたいと思います。

## 「漸」の成り立ち：水と刃物の意外な関係

「漸」という漢字は、「水」と「斬」という二つの要素から成り立ちます。

* 水（さんずい偏）
漢字を見ても分かるように、水に関係することを表す偏です。滴り落ちる水の様子は、目には見えにくいほど少しずつですが、確実に形を変えていくもの。川の流れや雨のしずくが地形を変えていくように、緩やかでも力強く変化するイメージです。

* 斬（ざん）
「斬」というと「切る」イメージが強いかもしれません。ですが、その構成要素をさらに遡ると、実は「車」（円形の刃物）と「斤」（斧）に由来しているといわれます。ここでいう「車」は、もともと古代の円形刃物を指していた可能性が高く、農具や儀式用具として使われました。円形ゆえに太陽や天を象徴する神聖な形とされ、インドのチャクラムや日本の円盤手裏剣にも通じると考えられています。

このように、一見すると無関係に見える「水」と「刃物」が合わさった文字が「漸」なのです。水がしずくとして少しずつ落ちるように、円形の刃物がするすると動いて物を切り開くように、「着実に、でも確実な変化」を表しているともいえます。

## 「漸進」のイメージ：直線ではなく"段階的"に

「漸」の字を用いた「漸進」は、現代で「段階的な進歩」や「徐々に前進すること」を指します。たとえば「前進」だけですと、どこか一直線にまっすぐ進むイメージがありますよね。一方、「漸進」は螺旋階段を上るように、一歩ずつ、確実にステップを踏んでいくようなイメージが強い言葉です。

この考え方は、ビジネスや日常生活の多くの場面で役立ちます。大きな目標を掲げても、一気に飛躍して達成することは難しいもの。むしろ、小さな課題を一つひとつクリアしながら段階的に成長したほうが、結果的に大きな変化を生む場合が多いのです。

## 古代から続く"少しずつ"のパワー

水が岩を穿つように、古来より人々は、わずかな行動の積み重ねが大きな成果につながることをよく理解していました。日本における「継続は力なり」という言葉もそうですし、中国思想でも「千里の道も一歩より」という格言があります。どちらも、"少しずつでも続ければ、大きな山をも動かせる"という真理を表しているのです。

「漸」の字にある円形の刃物のイメージは、絶え間なく回転しながら進む車輪に通じます。それは、同じ場所を回っているようで実は前へ進んでいる、そんな連続性や持続性を感じさせてくれます。目には見えにくくても、毎日少しずつ積み重ねた努力は着実に前へ進んでいるのです。

## 現代社会における漸進の意義

現代は、とかくスピードや効率が求められがちです。最短ルートを探すことや、即座に大きな成果を上げることに注目が集まりやすいですよね。しかし、その一方で、急激な変化は組織や個人に大きな負荷をかけるリスクも伴います。

* 組織やプロジェクトのマネジメント
急いで結果を出そうとすると、思わぬトラブルやメンバー間の摩擦が生まれやすくなります。「漸進的アプローチ」を採用して、段階的に仕様を固めたり、小さな成果を積み重ねることで、リスクを軽減しながら確かな成果を目指すことができます。

* 個人のキャリアや学習
一度に多くの知識を詰め込もうとしても、なかなか身につかないものです。毎日少しずつ勉強や練習を続けることで、着実に能力を高めることができます。モチベーションを維持しやすく、振り返ってみたときに驚くほど大きく成長している自分に気づくはずです。

## 「漸」の精神を日々の生活に生かす

古代アジアの人々が円形の刃物や滴り落ちる水に着目していたように、自然の中には、時間とともに確実に姿を変えるものがたくさんあります。それらを手掛かりに、日々の生活や仕事のやり方を振り返ってみるのはいかがでしょうか。

* 目標を小さく区切る
ゴールを細かく分割し、それを一つずつ達成していくことで「できた」という実感が得やすくなります。成功体験が積み重なると、次へのモチベーションも高まります。

* 定期的に立ち止まる時間をつくる
漸進は急がば回れの考え方と相性がいいです。定期的に進捗を確認し、軌道修正をすることで、大きな失敗を防ぎながら確かな成長を得られます。

* 長い視野で考える
水が岩を削るのは一朝一夕にはできません。数ヶ月、数年という単位で物事を考えると、いま取り組む小さなステップの意味が見えてきます。

## まとめ

「漸」という漢字の背景を知ると、私たちが使う「漸進的」という言葉に、古代の人々が持っていた"少しずつ、しかし確実に"という視点が宿っていることが分かります。すぐに大きな変化を求めたくなる現代だからこそ、あえて緩やかながら着実に進む道を選んでみるのも良いのではないでしょうか。

水滴が岩を穿ち、円形の刃がするすると前に進むように、私たちも毎日の小さな行動を積み重ねることで、気づけば大きく変化しているかもしれません。漸進という視点を大切に、焦らず一歩ずつ進んでいきたいですね。

少しでも参考になれば幸いです。ぜひ、日常や仕事の中で「漸進」というキーワードを思い出しながら、着実なステップを踏んでみてくださいね。
Go言語(プログラミング)入門メモ⑮

## Stringerで表示内容を変更する
Goでよく使われるインターフェース。fmt.Printlnなどで変数の内容を表示することがあるが、この内容を変更することができる。Stringerは、fmtパッケージに含まれるインターフェース。このインターフェースにあるStringメソッドを実装すると、fmt.Printlnなどにようる表示が変更される。

## Stringerインターフェースの利用
Stringerはfmtパッケージのprint.goに書かれているインターフェース。Stringerインターフェースは、Stringメソッドを持っている。Stringerインターフェースを実装した構造体をfmt.Println関数の引数にすると、Stringメソッドの返り値が出力される。
Stringer インターフェースを実装することで。fmt.Println関数の表示内容を自由に変えることができる。

## 表示内容の変更
NameとAgeを持った構造体Personを作成する。main関数内で初期化して変数mikeに代入する。さらに、「fmt.Println(mike)」と実行すると「｛Mike 22｝」が表示される。
~~~
type Person struct {
    Name string
    Age int
}

func main() {
    n := Person{"Mike", 22}
    fmt.Println(mike)
}

//以下のように出力される
{Mike 22}
~~~
このPrintlnで表示される{Mike 22}といった内容を自分で書き換えたいときにStringerを使用する。
Personに紐づけたStringメソッドを作り、返り値として「return fmt.Sprintf("My name is %v.", p.Name)」と書く。fmt.Sprintfは、p.Nameを%vに代入して文字列として返す。この場合の表示結果は「return "My name is" + p.Name」と同じになる。

~~~
type Person struct {
    Name string
    Age int
}

func (p Person) String() string {    //Stringメソッドを実装
    return fmt.Sprintf("My name is %v.", p.Name)
}
~~~

Stringメソッドを作成した状態で実行すると、fmt.Printlnの表示結果が変わり、「My name is Mike」と表示される。
~~~
func main() {
    mike := Person{"Mike", 22}
    fmt.Println(mike)
}

//以下のように出力される
My name is Mike
~~~
構造体PersonにはNameとAgeがある。なのでStringメソッドを実装しないでfmt.Println(mike)を実行すると、Mikeの年齢も併せて表示される。そのため、年齢を隠して表示したいときに、Stringインターフェースを使うことで、Nameだけを表示するようにできる。

## 学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897
plotly yfinance ローソクチャート描画

# plotlyとyfinanceでローソクチャートを描画したい


```python
import plotly.graph_objects as go

import pandas as pd
from datetime import datetime
import yfinance as yf

ticker = "NVDA"
period = "1y"
interval = "1d"
df = yf.download(ticker, period=period, interval=interval)
df.reset_index(inplace=True)
df.columns = df.columns.droplevel(0)
df.columns = ['Date','Open', 'High', 'Low', 'Close', 'Volume']

fig = go.Figure(
    data=[
            go.Candlestick(
                x=df['Date'],
                open=df['Open'],
                high=df['High'],
                low=df['Low'],
                close=df['Close'],
            ),
        ],
    )

fig.show()
```
Cursor AIをしっかり活用しよう


CursorAIを最大限に活用できていますか？Microsoftのエンジニア、Zohaib Raufさんは、CursorAIとLLMを活用することで、長年先送りにしていた多くのサイドプロジェクトを完成させることができたそうです。彼の**CursorAIを使ってサイドプロジェクトを素早く完成させるコツ**を3つのステップにまとめてみました。

## 目次

- [目次](#目次)
- [仕様を具体化する](#仕様を具体化する)
- [初期コードを生成する](#初期コードを生成する)
- [小さな単位に分割する](#小さな単位に分割する)
- [🍯 その他の便利なヒント](#-その他の便利なヒント)

## 仕様を具体化する

まず、GPTを活用して作りたいアプリケーションの仕様を具体化します。十分な詳細が集まったと判断したら、**「他の開発者やAIがこのアプリを作れるほど詳細な技術仕様書を作成してください」**とリクエストしてみましょう。最終仕様をまとめたら、それを常に参照できるように**SPEC.mdファイルを作成して保管（重要！）**しましょう。

<center><b>👇 プロンプト例</b></center>

「他の人やAIがこの文書を見てウェブサイトを作れるように、markdown形式の仕様書を作成してください。プロジェクトの詳細、UX/UI、各機能に必要な要素を必ず含めてください。技術はTypeScript、React、TailwindCSSを中心に使用します。」

![spec.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539939/ab480b87-6d84-1d32-a209-caab8097e462.jpeg)

<center>🔼 SPEC.mdファイルを先に作成しましょう</center>

## 初期コードを生成する

Viteなどでプロジェクトをセットアップしたら、先ほど作成したSPEC.mdファイルをプロジェクトフォルダに配置します。その後、Cursor IDEのComposer > Select Agentに移動し、**SPEC.mdをコンテキストとして追加してコードの実装を依頼**します。これにより、わずか数分で基本的な機能を備えた土台を作ることができます。

## 小さな単位に分割する

次は詳細な機能の実装に移ります。ここでよくある間違いは、一度に多くの実装を依頼することです。複数のタスクを同時に依頼すると、エラーが発生する確率が高くなり、修正にも時間がかかってしまいます。そのため、**機能をできるだけ小さな単位に分割し、一つずつ着実に実装することをお勧めします**。また、既存のコードやドキュメントへのリンクをコンテキストとして提供できるので、これを積極的に活用してAIの幻覚（hallucination）を防ぐことが重要です。

![cursorrules.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539939/bb9b8f4b-8595-2268-e69b-c51c6849bb6a.jpeg)

<center>🔼 .cursorrules を積極的に活用しましょう</center>

## 🍯 その他の便利なヒント

- 必要に応じて複数のLLMを使い分けてみましょう。Zohaibさんは、機能の初期ドラフト作成にはo1を、細かい反復作業にはClaude-3.5-sonnetを活用しているそうです。
- [vo.dev](https://v0.dev/?utm_source=Nomad+Academy&utm_campaign=a8b6833d84-EMAIL_CAMPAIGN_2025_01_24&utm_medium=email&utm_term=0_4313d957c9-7ac123137e-160968050)のようなツールを使用すると、UXの実装がより簡単になります。
- SPEC.mdやウェブサイトのドキュメントなど、プロジェクトに関連するマークダウンファイルは、コンテキストとして追加できるように必ず保存しておきましょう。
- プロジェクトディレクトリに.cursorrulesファイルを作成し、プロジェクトを望ましい方向へ導きましょう。特定の技術を中心とした開発を依頼したり、不要な技術を除外したりすることができます。
- コード全体を理解した状態で作業を進めましょう。AIが生成したコードの内容を把握していないと、デバッグが困難な状況に陥る可能性があります。

<br>

👉 原文は[こちら](https://zohaib.me/using-llms-and-cursor-for-finishing-projects-productivity/?utm_source=Nomad+Academy&utm_campaign=a8b6833d84-EMAIL_CAMPAIGN_2025_01_24&utm_medium=email&utm_term=0_4313d957c9-7ac123137e-160968050)でご確認いただけます。
flywayMigrateで"Migration checksum mismatch for migration version"エラーが出る

## エラー内容

flywayMigrate実行時に下記エラーが発生する

```bash
Execution failed for task 'flywayMigrate'.
> Error occurred while executing flywayMigrate
  Validate failed: Migrations have failed validation
  Migration checksum mismatch for migration version *
  -> Applied to database : **********
  -> Resolved locally    : **********
```

## 原因
マイグレーションファイルが変更されたり、すでにDBに適用済みのマイグレーションとマイグレーションファイルの内容が異なるなどの理由でFlywayのチェックサムが一致しない状態になっています。

## 解決方法

一度flywayRepairで修復して再度flywayMigrateを実行すると解消します。

```bash
./gradlew flywayRepair
./gradlew flywayMigrate
```
Git for Windowsが使い物にならないぐらい遅くなったので回避した話

# はじめに

タイトルは「回避」であり「改善」ではない。

開発ではVisual Studio Cod (1.96.4) を利用している。

```Text:
バージョン: 1.96.4 (system setup)
コミット: cd4ee3b1c348a13bafd8f9ad8060705f6d4b9cba
日付: 2025-01-16T00:16:19.038Z
Electron: 32.2.6
ElectronBuildId: 10629634
Chromium: 128.0.6613.186
Node.js: 20.18.1
V8: 12.8.374.38-electron.0
OS: Windows_NT x64 10.0.19045
```

またGitコマンドはGit for Windows (2.47.1.windows.2) を利用している。

![20250122_144122_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/b949c23c-af45-ad5e-bce9-ed1b435b203b.png)


Visual Studio Codeも更新が出たら即適用しているし、Git for Windowsも自動更新を有効にしており、新しいVerが出る度にほぼ無意識のうちに更新している。(あれ？今なんか出たな。Gitの更新だったか？？？みたいな状態)

# Gitが遅くなったきっかけ(たぶん)

年末に

https://qiita.com/qrrq/items/0e116a59743874d18cb1

を拝見して幾つかの拡張をインストールした。(2024年12月末)

が、入れてみたものの、やはり私には不要だなと思った拡張もあったので幾つかを無効にした。(2025年1月22日)

するとVisual Studio Codeの「ソース管理」に「Git リポジトリのワークスペースをスキャンしています...」と出たままで何も表示されなくなった。

![20250122_141917_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/c07f3420-e0cc-c596-1429-6e92632724cc.png)

厳密には10分ほどしたら徐々に表示されていく感じではあったので動いているようではあった。

![20250122_144101_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/5c24b499-1d49-29bf-3659-45e6291f6a87.png)

コンソールに出る実行時刻から徐々に進んでいることが確認できる。

![20250122_144122_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/ef5cd26d-4c4f-4ee5-b183-319d32392c74.png)

Visual Studio Code側の問題か？とも思ったが試しGit Bashでgit statusとかを試したが応答が返ってくるのにかなりの時間を要する状態だった。ということはVisual Studio Codeの側の問題ではなくGit for Windows側の問題のように思われた。

またリポジトリによっては問題なく利用できるものもあったので、改行コードの扱いを変更したりとかしてみたが変化はなかった。(「Windows Git 遅い」で検索してヒットする方法を幾つか試した)

最終手段か？？？と、Visual Studo Codeのキャッシュをクリアしたり再インストールしたり、Git for Windowsの再インストールをしたりと色々試したが、結局改善されなかった。(再インストールの過程ではインストール先フォルダとかデータフォルダとかも削除)

ふとGit for Windowsをダウングレードしてみたら？？？と思って v4.45.1 にして試したら改善した。
爆速になった。

そうなると、あとはどのVerから問題が発生するのか、である。

# 確認結果

以下のような結果となった。

| Ver | 結果 |
|:-----------:|:------------:|
| 2.48.0-rc2.windows.1 | ？ |
| 2.47.1(2) | × |
| 2.47.1 | × |
| 2.46.2 | × |
| 2.46.1 | × |
| 2.46.0 | ○ |
| 2.45.2 | ○ |

マイナーVerUPした2.48系でも試したいが、試すとしたら安定版になってからかな。(現時点での最新が↑の2.48.0-rc2.windows.1。未確認という意味で「？」に)

# 最後に

ダウングレードは自己責任で！
お絵描きアプリの作成


お絵描きアプリUI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938270/e5d5bed0-cd3a-ad58-3487-0a0601244e82.png)

・コード作成(HTML、Javascript、CSS + Electronを使用)



参考文献
・色変更https://qiita.com/tsuyopon_xyz/items/1df124d4ecec69bd4fff 「HTMLのcanvasとJavaScriptでお絵かきアプリ作る【カラーパレット・消しゴム機能追加編】」
・Visual Studio Code の拡張機能で、Github Copilotを使用
・お絵描き初期https://tsuyopon.xyz/2018/09/14/how-to-create-drawing-app-part1/　「【初心者】HTMLのcanvasとJavaScriptでお絵かきアプリ作る【ベース作り編】」
アプリ実装(Electron)
・https://ics.media/entry/7298/ 「最新版で学ぶElectron入門ウェブ技術でPCアプリを開発しよう」
BizRobo!　ロボット(DA)　不安定なら一度お試しを　~お勧めの「ガードチョイスと処理」組み合わせ　アプリ起動編~

<br>
<br>
こんにちは！<br>
今回はBizRobo! ロボット(DA)でお勧めの「ガードチョイスと処理」組み合わせ～アプリ起動編～の紹介です！<br>
アプリの起動処理で安定しない、不安定だという方は一度お試しください！<br><br>
内容に入る前に少し脱線します。<br>
この記事は大中小のロジックの内、「小」に当たる、「1動作単位」のロジックです。<br>
これに関しては、大中小のロジックというのは完全に私の勝手な考えです！<br>
後々大中小のロジックを言語化した記事を書ければいいなと考えております。<br>
ということで、話に戻っていきます！<br>



:::note warn
動作保証をする記事ではなく、経験を基に比較的安定した処理の中身の紹介です。
:::

<h1>アプリ起動時</h1>
<h3>処理の流れ</h3>
・ファイル名を指定して実行を起動(Win+R)<br>
・ガードチョイス(ApplicationFound)<br>
・ガードチョイス(TreeStopChanging)<br>
・クリップボードに入力値を載せる<br>
・ガードチョイス(2秒待機)<br>
・貼り付け(Ctrl+V)<br>
・ガードチョイス(LocationFound)<br>
・実行(Enter or Click)<br>

<h3>解説</h3>
アプリ起動するだけなのに、ステップ多くないと思われる方がいると思います。<br>
では、なぜここまでステップがあるのかについて説明していきます。<br>
まず、待機を除いた動きとしては3つです。<br>
・ファイル名を指定して実行を起動する。<br>
・アプリケーションのファイルパス(.exe)を入力する。<br>
・実行して起動する。<br>
ステップが多い理由はこの３つの動きを正しく待つためです。<br>
正しく待つことを踏まえて、最初の流れを組み合わせで表すと次のイメージです。<br>

・ファイル名を指定して実行を起動＋起動の待機(ApplicationFound)
　→ファイル名を指定して実行を起動して、起動が確認できるまで待つ。
・起動＝操作可能状態とは必ずなるわけではないので、更新状態を待つ(TreeStopChanging)
・入力が完了するまで待機(LocationFound)＋実行
　→入力が完了したことを確認して、実行する。(対象のアプリを起動する)

 このように、実行したことを確認または実行できる状態であることを確認する待機があることで、「空振り」を減らすことに繋がります。


<h1>まとめ</h1>
ここまでお疲れさまでした。
大前提ですが、初心者の方はここまでしなくてもまず「動く」ができればＯＫです。
ただ、ある程度慣れてきて方は動作に対してどんな待機が必要かを考えられるようになると、
より安定化したロボットになってくると思います！

では、より良いRPAライフを～

<h1>参考</h1>
・ガードチョイスに関して<br>
<a href="https://knowledge.bizrobo.com/hc/ja/articles/360032997271-Guarded-Choice-%E3%82%AC%E3%83%BC%E3%83%89%E3%83%81%E3%83%A7%E3%82%A4%E3%82%B9-%E3%81%AE%E7%89%B9%E5%BE%B4">Guarded Choice（ガードチョイス）の特徴</a><br>
サイト名：BizRobo! ナレッジベース<br>
企業名：オープン株式会社<br>
更新日：2024年08月24日 09:44
Power Apps の And ・ Or ・Not 条件の表現方法まとめ

ごきげんよう、百合宮桜です。
本日は Power Apps における And・Or・Not 条件の表現方法をお伝えします。
公式のリファレンスはこちら👇ですので合わせてご参照ください。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-logicals

# And 条件
And 条件とは複数の条件の全てに当てはまっているものを検索する条件のことです。

例えば、以下の表で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/f8112007-d8c9-8cd0-248a-5de3bf1b73bc.png)

- Tool = Power Automate
- Role = エンジニア

という2つの条件どちらにも当てはまっている人を探したい時に利用します。
今回の場合は「ゆりみー」が当てはまっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/d19e97ee-117f-de0c-309a-2443cbf7cbe6.png)

以下の3通りの方法で表現できます。

```text:And 関数で表現する
LookUp(Favtool,And(Tool="Power Automate",Role="エンジニア"))
```

```visualbasic:And という文字でつなぐ
LookUp(Favtool,Tool="Power Automate" And Role="エンジニア")
```

```javascript:&& という文字でつなぐ
LookUp(Favtool,Tool="Power Automate" && Role="エンジニア")
```


# Or 条件
Or 条件とは複数の条件のいずれか1つ以上に当てはまっているものを検索する条件のことです。

例えば、以下の表で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/f8112007-d8c9-8cd0-248a-5de3bf1b73bc.png)

- Tool = Power Automate
- Role = エンジニア

という2つの条件のいずれかに当てはまっている人を探したい時に利用します。
今回の場合は「ゆりみー」と「ゆきりん」が当てはまっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/13762d1f-1017-d1d9-d4f2-7e6562f0fa83.png)


以下の3通りの方法で表現できます。

```text:Or 関数で表現する
Filter(Favtool,Or(Tool="Power Automate",Role="エンジニア"))
```

```visualbasic:Or という文字でつなぐ
Filter(Favtool,Tool="Power Automate" Or Role="エンジニア")
```

```javascript:|| という文字でつなぐ
Filter(Favtool,Tool="Power Automate" || Role="エンジニア")

/*この |（縦線・パイプライン・バーティカルバーなどと呼ばれます） は Shift ＋ ￥ で入力できます。*/
```

# Not 条件
Not とは「○○ではないもの（EX:空白ではない）」を検索する条件のことです。

例えば、以下の表で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/f8112007-d8c9-8cd0-248a-5de3bf1b73bc.png)

- Role ≠ エンジニア（Role がエンジニアではない人）

という条件に当てはまっている人を探したい時に利用します。
今回の場合は「りなたむ」が当てはまっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/aa21c38d-76c7-a3ea-ef64-720651f2fc66.png)


以下の2通りの方法で表現できます。

```text:Not 関数で表現する
Filter(Favtool,Not(Role="エンジニア"))
```

```javascript:! で表現する
Filter(Favtool,!(Role="エンジニア"))
```

# まとめ
And・Or・Not には様々な表現があることをご理解いただけたと思います。どの表現方法でも同じ処理を行うので、どれを使うかは好みです。
初めのうちはどれか1つを覚えておけば良いかと思いますが、慣れてきたら他の表現も使えるようにしておくと他の人が作ったアプリを引き継ぐ際に混乱しないで済みますよ。
ただ、チームで開発する時は表現がバラバラだと混乱のもとになりますので、ルールを設けても良いかと思います。
全てのひとにとってベストな形のアプリ開発になりますように(≧▽≦)
それではごきげんよう！
Claudeを効果的に使用するためのガイド

## 一般的なコツ

### 1. 明確さと具体性を重視
- タスクや質問を冒頭で明確に
- 必要な文脈や詳細を提供 
- 複雑な課題は小分けに

### 2. 例示の活用
- 期待する出力の例を提示
- フォーマットや文体の参考を提供

### 3. 段階的思考の促進 
- 「ステップバイステップで考えて」と依頼
- 理由付けを求める

### 4. 反復的な改善
- 具体的な修正点を指示
- 「このように変更して」と明確に

### 5. 知識の活用
- 背景情報や文脈を含める
- 使用目的を説明

### 6. ロールプレイの活用
- 特定の役割や視点を指定

## タスク別のコツ

### コンテンツ作成
1. 対象読者を明確に
2. トーンとスタイルを指定  
3. 構造を定義

### 文書要約・Q&A
1. 焦点を絞る
2. 文書名を参照
3. 引用を求める

### データ分析
- 希望する形式を明確に
- 重要な指標を指定

### ブレインストーミング
- 具体的なトピックを指定
- 出力形式を指示

## 品質向上のために
1. 不確実性の認知を許可
2. 複雑なタスクは分割
3. 文脈情報を毎回含める

## 悪い例と良い例の比較

### マーケティング戦略の立案

悪い例:
「マーケティング戦略を作って」

良い例:
「環境に配慮したスマートフォンアクセサリーの新製品ラインのマーケティング戦略について、以下の項目を含めた包括的な戦略を立案してください：

1. 市場分析:
- 環境配慮型テックアクセサリーの現在のトレンド
- 主要競合2-3社の戦略
- 市場規模と成長予測

2. ターゲット層の詳細:
- 理想的な顧客像
- 課題と解決方法

3. マーケティングミックス:
- 製品: 主要機能
- 価格: 価格戦略と根拠
- 流通: 推奨チャネル
- プロモーション:
 - 重点的な5つのマーケティングチャネル（メリット・デメリット含む）
 - ローンチ時の3つのキャンペーンアイデア

4. コンテンツ戦略:
- ターゲットに響く5つのテーマ
- コンテンツタイプの提案

5. KPIと測定:
- 重要な5つの指標
- 推奨測定ツール」

改善点：役割設定、具体的なタスク分解、構造化された出力要求、ブレインストーリング、説明の要求が含まれており、分析と創造性の余地を残しつつ明確なガイドラインを提供しています。
memoization について Leetcodeを 使って調べる !!!

> 今回はleetcode 2623を使ってmemoizationについて調べましょう！

#### Linkはこちら

https://leetcode.com/problems/memoize/?envType=study-plan-v2&envId=30-days-of-javascript

## leetcode : 2623. Memoize

### memoizationとは?

Memoization(Memoization)は functionの結果をキャッシングし、同じ入力に対して
キャッシングされた結果を返却します。
これにより、反復的な計算を防止し、性能を最適化できます。


### leetcode : 2623の正解
```typescript
type Fn = (...params: number[]) => number

function memoize(fn: Fn): Fn {
    const cache : {[key: string]: number} = {};
    
    return function(...args) : number{
        const key = args.toString();
        if (cache[key] !== undefined){
            return cache[key]
        }else{
            const result = fn(...args);
            cache[key] = result
            return result
        }
        
    }
}


/** 
 * let callCount = 0;
 * const memoizedFn = memoize(function (a, b) {
 *	 callCount += 1;
 *   return a + b;
 * })
 * memoizedFn(2, 3) // 5
 * memoizedFn(2, 3) // 5
 * console.log(callCount) // 1 
 */
```


### study!

今までのキャッシングはredisを使ったんですが、性能を最適化する時memoizationについて考えるようになりました。


アルゴリズムでは以下のように使うことができます。
例はフィボナッチ計算するコードです。
```typescript
const fibonacci = ((): ((n: number) => number) => {
  const memo: Record<number, number> = {};

  const fib = (n: number): number => {
    if (n <= 1) return n;
    if (memo[n] !== undefined) return memo[n]; 

    memo[n] = fib(n - 1) + fib(n - 2);
    return memo[n];
  };

  return fib;
})();

console.log(fibonacci(10)); 
console.log(fibonacci(15)); 

```

:::note info
出力
55
610
:::


### 最後に
日本語の勉強するために作成しておりますので、間違った日本語や内容がありましたらいつでもフィードバックいただければ幸いです。

[참고자료]
gsub グループごとに置換するものを変更する

# グループごとに置換するものを変更する

>置換文字列 replace 中の \& と \0 はマッチした部分文字列に、 \1 ... \9 は n 番目の括弧の内容に置き換えられます。置換文字列内では \`、\'、\+ も使えます。これらは $`、$'、$+ に対応します。

https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html#:~:text=%E7%BD%AE%E6%8F%9B%E6%96%87%E5%AD%97%E5%88%97%20replace%20%E4%B8%AD%E3%81%AE%20%5C%26%20%E3%81%A8%20%5C0%20%E3%81%AF%E3%83%9E%E3%83%83%E3%83%81%E3%81%97%E3%81%9F%E9%83%A8%E5%88%86%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E3%80%81%20%5C1%20...%20%5C9%20%E3%81%AF%20n%20%E7%95%AA%E7%9B%AE%E3%81%AE%E6%8B%AC%E5%BC%A7%E3%81%AE%E5%86%85%E5%AE%B9%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E7%BD%AE%E6%8F%9B%E6%96%87%E5%AD%97%E5%88%97%E5%86%85%E3%81%A7%E3%81%AF%20%5C%60%E3%80%81%5C%27%E3%80%81%5C%2B%20%E3%82%82%E4%BD%BF%E3%81%88%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%82%89%E3%81%AF%20%24%60%E3%80%81%24%27%E3%80%81%24%2B%20%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

```rb
irb(main):027> "abcdefghijklfmnopqrstuvwxyz".gsub(/(\d{3})(\d{3})/,'\1,#')
irb(main):028>
=> "abcdefghijklfmnopqrstuvwxyz"
irb(main):029> "abcdefghijklfmnopqrstuvwxyz".gsub(/(\S{3})(\S{3})/,'\1,#')
irb(main):030>
=> "abc,#ghi,#fmn,#rst,#xyz"
irb(main):031> "abcdefghijklfmnopqrstuvwxyz".gsub(/(\S{3})(\S{3})/,'\1,\2#')
irb(main):032>
=> "abc,def#ghi,jkl#fmn,opq#rst,uvw#xyz" # 交互になってる
```
マーケティングミックスモデリング(MMM)を分かりやすく解説

マーケティングミックスモデリング(Marketing Mix Modeling, MMM)は、企業が自分のマーケティング施策が売上にどれだけ影響を与えているかを分析するための法方です。広告やプロモーション、価格、販路、季節要因など、複雑に関わる要因を数値化して、どれが何にもっとも効いているのかを解明します。
※この記事は、ChatGPTの出力を基に作成しています。

### **MMMの基本の模式と流れ**
1. **データの収集**
   過去の売上データや広告消費データ、価格・プロモーション情報を集めます。その他にも、季節要因や天気、競合の動きも考慮します。

2. **データの前処理**
   集めたデータを数学模式に適した形に処理します。例えば、軸を正規化したり、一緒に考えられるスケールに変換します。

3. **模式構築と分析**
   回帰分析やその他の統計モデルを構築し、要因と売上の関連を描き出します。たとえば、正規化された売上をもとに、不同の広告資産がどれだけの効果を持っているかを数値化します。

4. **分析結果の解釈と可視化**
   それぞれの施策の売上への貢献度を解釈します。例えば、テレビ広告が25%貢献したのに対して、SNS広告は10%というように数値で示します。

5. **予算配分の最適化とシミュレーション**
   分析結果を基に、予算配分を更新し、売上最適化を目指したプランの実行シミュレーションを行います。

---

### **MMMの実際の例紀**

#### **1. ファストフードチェーンの例紀**
- **背景**: テレビ広告、デジタル広告、店頭プロモーションを実施していたが、どれが最も効果的か不明。
- **結果**: テレビ広告は売上の25%、店頭プロモーションは40%と最大貢献。その結果、テレビの予算を20%削減、店頭施策を強化した。

#### **2. 食品メーカーの例紀**
- **背景**: 新製品の開発に伴い、テレビ、雜誌、SNS広告を実施。
- **結果**: テレビ広告は売上の40%に貢献したが、雜誌広告は5%のみ。SNS広告を強化した結果、売上が15%増加。

#### **3. Eコマース企業の例紀**
- **背景**: Google広告、Facebook広告、インフルエンサーマーケティングを実施していたが、売上に対する貢献度が不明。
- **結果**: Google広告は50%の売上貢献。Facebook広告のリマーケティング力が高いため、これを強化した結果、売上は20%増加。

---

### **MMMの利点**
- **実質的な分析力**: どの施策が売上に最も効いているかが分かる。
- **予算の最適化**: 予算を最も効率的に配分できる。
- **数学に基づく決定**: 個人的な感覚や主観を排除した意思決定が可能。

MMMを活用することで、「何が売上に効果を与えているのか」を明確にし、方向性のあるマーケティング戻利を実現できるのがMMMの最大の魅力です。
ApidogでAPIドキュメントを瞬時に自動生成する方法

## はじめに
ソフトやアプリをいくつも使って、ドキュメントをあちこちにインポートするのって大変じゃないですか？あれこれ切り替えていると、時間がかかるし、フォーマットが合わないなんてことも。結果、仕事の効率がガタ落ち。そんな悩みを解決するために、[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)を使えば一発解決！

:::note info
[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)は、APIドキュメントをシームレスに自動生成するツールです。手動で煩雑なコーディングやドキュメント作業を行う必要がなく、ワンクリックで最新の情報を反映させたドキュメントを作成できます。さらに、コードへの侵入がゼロであるため、読みやすさが保たれ、プロジェクトの整理が格段に向上します。クラウド上で管理されるので、チームメンバーとのコラボレーションも簡単。効率的にプロジェクトを進めたいあなたに最適なソリューションです。
:::

このガイドでは、[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)のプラグインを使ってAPIドキュメントを素早く生成する方法を紹介します。時間を節約しつつ効率的に！

- **ドキュメントを簡単生成**：手動で書く必要はなし。クリック一つで自動生成と更新が可能
- **コードに無干渉**：Swaggerの複雑なコード注釈を追加することなく、コードをより明確に
- **便利なチームコラボ**：ファイルのエクスポート不要、クラウド管理でリンクを直接共有
- **美しいドキュメント表示**：見やすいインターフェース

![官网.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/e50151d5-2673-9c25-313b-171591056c76.png)


## ステップ1：Apidogプラグイン（Apidog Fast Request）をインストール

![Apidog -fast-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/ce5c31ba-7187-8ae3-dd4b-9e63000b5802.png)

IDEAを開き、「設定 > 環境設定 > プラグイン」に進み、「[Apidog Fast Request](https://plugins.jetbrains.com/plugin/25925-apidog-fast-request--auto-detect-endpoints-http-rest-client0)」を検索してインストールします。

## ステップ2：アクセス令牌(Token)の設定


[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)に登録し、プロジェクトを作成済みであることを確認してください。それから、Apidogでアクセス令牌を取得し、IDEAのプラグインにバインドします。

1、Apidogクライアントを開き、右上の【アバター】-->【アカウント設定】-->【APIアクセスToken】-->【新規】をクリックし、トークン名を記入したら、【保存してTokenを生成】をクリックしてTokenをコピーします。
![apidog-token-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/0f8cee15-f5ef-5c1c-c066-c8f4908c014a.png)
2. IDEAで、右上の「設定-->環境設定-->Apidog Fast Request」をクリックし、「Upload to Apidog」を見つけて、先ほどコピーしたアクセス・トークンをここに貼り付けます：
![apidog-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/3ccb9d4c-d103-7b39-b4c4-74b704d7cccf.png)

注：（サーバーアドレスはデフォルトで問題ありません。）
ここまでで、設定は完了です。次はドキュメントの自動生成です！

## ステップ3：ドキュメントを生成

![apidog-cha-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/d98f1b87-f523-dff4-3b11-964f253e0a8e.png)

IDEAで右クリックして「Upload to Apidog」を選択してドキュメントを生成。一つのAPIまたはプロジェクト全体のドキュメントを生成可能。

## ステップ4：生成されたドキュメントを確認

![apidog-x-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/4e56ff9f-a1e4-8255-1469-6e98ffffb37f.png)

[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)プロジェクトで右上のリフレッシュをクリックし、IDEAから同期されたドキュメントを確認。

**詳細はこちら：**

https://docs.apidog.com/jp/apidog-intellij-idea-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-644365m0


## 結論

おめでとうございます！美しくて機能的なAPIドキュメントを作成しました。更新がある場合、「**Upload to Apidog**」を再度クリックするだけです。[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)の便利さをぜひ体験してください！詳細な機能と技術サポートについては、[Apidogの公式ヘルプドキュメント](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)をご覧ください。

**最後まで読んでくださり、ありがとうございました！
この記事を読んで少しでも理解を深めていただければ幸いです！**
マテリアライズドビューを高速リフレッシュに対応させる

employeeテーブルをもとに作成されているマテリアライズドビューemployee_mvがあるとします。このemployee_mvを高速リフレッシュに対応させる手順は以下の通りです。

① employeeに対するマテリアライズドビューログを作成する。

```SQL
CREATE MATERIALIZED VIEW LOG ON employee;
```

② employee_mvのリフレッシュ方法を高速リフレッシュに変更する。

```SQL
ALTER MATERIALIZED VIEW employee_mv REFRESH FAST;
```

③ マテリアライズドビューログを初期化するため、完全リフレッシュを行う。

```SQL
EXECUTE DBMS_MVIEW.REFRESH(LIST => 'employee_mv', METHOD => 'c', ATOMIC_REFRESH => false);
```

---

employee_mvが高速リフレッシュに対応したことを確認するため、リフレッシュを実行します。

```SQL
EXECUTE DBMS_MVIEW.REFRESH('employee_mv');
```

以下のクエリにより、employee_mvが高速リフレッシュに対応していること、および高速リフレッシュによりリフレッシュされたことが確認できるはずです。

```SQL
SELECT mview_name, refresh_method, last_refresh_type 
FROM USER_MVIEWS 
WHERE mview_name = 'EMPLOYEE_MV'
```

|MVIEW_NAME|REFRESH_METHOD|LAST_REFRESH_TYPE|
|:-|:-|:-|
|EMPLOYEE_MV|FAST|FAST|

---

環境情報: 

- Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
「マネジメントに関する一考察：資源の相互交換による信頼と評価の構築」

[『武器としての組織心理学』](https://www.diamond.co.jp/book/9784478111376.html)という本に
上司と部下はお互いに資源を与えあう と書いてあった。
これが僕のマネジメント論にとても良い変化をもたらしてくれたので
そのことについてざっくり書いてみる。

どんな資源か？
・上司から部下へ：「仕事」や「評価」
・部下から上司へ：「情報（報告など）」や「信頼」

ここに自分の考えを付け加えると、
これらの資源の交換はすべて、「仕事」から始まると思った。
上司が仕事を与え、部下がそれを遂行する過程で上司への報告が発生し、成果物ができる。
その成果物を上司が評価することで、部下から上司への信頼が発生する。といった具合に。

つまり、上司が部下に気を遣って仕事を与えないと
仕事を通じて生まれる評価という資源も与えられなくなる。
そうすると、上司が信頼を獲得することもままならなくなってしまう。

この考え方を知ってから、メンバーに仕事をアサインすることに抵抗がなくなった。
むしろ、仕事を与えない＝資源を与えないということであり、
それは無礼ともいえるのではないか？とまで。

なので、仕事はどんどん与えていくし、時には負荷をかけるかもしれない。
でもその分は評価として報いる。
そうすることで、メンバーへ提供する資源を最大化していきたい。

今それができてるかは置いといて、そういうマネージャーでありたいと思う。
Laravelのスケジュールでのログの挙動

Laravelのスケジュールでコマンドを実行するときは下記の様に実行される。

```bash
'/usr/local/bin/php' 'artisan' test:command > '/dev/null' 2>&1
```

上記は標準出力、標準エラー出力を`/dev/null`に出力している。つまりスケジュールで実行した処理の中で`print`や`echo`を使い出力した文字列は`/dev/null`に消え去ってしまうという事。

普通にログなんかは書き込めます。ただ、問題はstderr等にログで出力するとき。
例えば、**dockerのログへ出力したいとき**。

その場合は

```php
Schedule::command("test:command")
    ->everyMinute()
    ->appendOutputTo('/proc/1/fd/1'); // sendOutputTo('/proc/1/fd/1', ture) でも同じ。
```

こんな感じでスケジュールをセット。そうすると、

```bash
'/usr/local/bin/php' 'artisan' test:command >> '/proc/1/fd/1' 2>&1
```

こんな感じで実行される。ただ、これだと全てのスケジュールイベントに`appendOutputTo('/proc/1/fd/1');`をつけないといけないのでスケジュールのFacadeを差し替えると楽。

下記の様なクラスを作って
```php
<?php

namespace App\Scheduling;
use Illuminate\Console\Scheduling\Schedule;

class DockerLog extends Schedule {
    public function exec($command, array $parameters = [])
    {
        return parent::exec($command, $parameters)->appendOutputTo('/proc/1/fd/1');
    }
}
```

`App\Provider\AppServiceProvider`の`register`メソッドに下記を追加
 ```php
        $this->app->singleton(Schedule::class, function ($app) {
            $config = $this->app['config'];
            $timezone = $config->get('app.schedule_timezone', $config->get('app.timezone'));
            return new DockerLog($timezone);
        });
 ```
Raspberry Pi zero 2 w(bookworm)のwifiがつながらない場合

ルーターは、openwrtです。rpi zero 2wのwifiがつながりませんでした。
rpi 3Bで起動するとつながるので、パスワードの間違いはありません。
結局、[ここ(forums.raspberrypi.com/viewtopic.php?t=366155)](https://forums.raspberrypi.com/viewtopic.php?t=366155) によって、cmdline.txtに
```
brcmfmac.feature_disable=0x82000
```
をつけると出来ました。
フロー：商談で最終活動日から一定数の日付が過ぎたら通知する


+ [商談で最終活動日から一定数の日付が過ぎたら通知するには](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KCNqU0AX)

# 事前準備

### 商談オブジェクトにカスタム項目を追加

最終活動日が15日前ならtrueになる。

```
AND(
ISBLANK(LastActivityDate),
LastActivityDate < Today() -15
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d8134643-7a9d-4e91-d8d4-620e997750dd.png)


### カスタム通知設定の作成

設定--> 通知ビルダー --> カスタム通知


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e47602ec-9d50-83d4-7b94-c99b67c02d87.png)

設定--> 通知ビルダー --> 通知の配信設定

先程作ったカスタム通知のところで、下記のように編集をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5a7ff1dc-61d9-7f59-698a-db39b7efb609.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/32abcd04-90ac-623a-d99a-126f0b7eb90a.png)

# フローの作成

新規フロー --> 最初から開始を選んで右下の次へをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/01ad855c-f644-1553-b66f-be35fa14efaa.png)

スケジュールトリガーフローを選択して右下の作成をクリック

スケージュールを設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/66f187b9-d57d-b339-4659-a96a0034178c.png)

オブジェクトを選択をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a7001505-9406-fa22-ded2-90965e206a0a.png)

以下の条件をセットします

+ 事前に作成した最終活動日が15日前という数式項目がtrue
+ isCloseという項目がfalse (まだ完了していない商談を対象とします)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/92a241a2-7f3a-03de-b42f-98fa6bc1bdf8.png)

### レコードの取得要素を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4ca58226-960c-f398-f8a8-210a4674e98e.png)


### テキスト型のコレクション変数を追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/11c2d6bf-60c5-0498-a9de-e46e123a24e3.png)

### OwnerIdsというコレクション変数にこの商談レコードの所有者Idを割り当てます。（これが通知先）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ae5e0149-43c3-38b3-097a-3a52664266b0.png)

### ハイパーリンク用の数式変数を追加します

```
LEFT({!$Api.Enterprise_Server_URL_620} , FIND('/services', {!$Api.Enterprise_Server_URL_620})) & "/lightning/r/kenmei__c/"& {!$Record.Id} &"/view"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c82b980c-197c-17c9-fd3d-6a5e17af58e1.png)

### テキストテンプレートを追加します

```
商談名: {!$Record.Name}
```

商談名をクリックしたらこのレコードにリダイレクトされるようにハイパーリンクを設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/701cf2a1-fc78-a7a5-7ebf-fd89a8bd3b94.png)

```
{!HYPERLINK}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ab422018-5d36-071b-d681-489124b07bb9.png)


### カスタム通知を送信アクションを追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5a72fd7a-5c7c-7621-1330-0324130fb6c8.png)
リセットCSS・ノーマライズCSSは@layerで囲うといいよ。という提案

# 課題

:::note info
以下のHTMLでは可読性のため、
- reset.cssまたはnormalize.css
- style.css

にわけて記載するCSSをstyleタグに集約して記載していますが、分けていても同じ結果になります。
:::

例えば、以下のHTMLコードにおいて「Link Text」はコメントにある通り「赤太文字」で記載されます。

`a:link`への書き方はリセットCSSでも見かける記述です。また、詳細度を比較すると「0-1-1」と「0-1-0」なので赤太文字が適用されるのはおかしくありません。
しかし、ページの編集者としては下の「青イタリック体」を適用してほしい、という状況が多いと思います。
なぜなら、リセットCSS・ノーマライズCSSは「共通CSSやページ側のCSSで何も指定していないときに適用されるスタイル」を定義するファイルだからです。
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>@layerのテスト</title>
  <style>
    /* リセットCSS または ノーマライズCSS */
    /* 赤太文字 → こちらが適用される */
    a:link,
    a:active,
    a:visited{
      color: red;
      font-weight: bold;
    }

    /* ページ用のCSS */
    /* 青イタリック体 */
    .inlineLink{
      color: blue;
      font-style: italic;
    }
  </style>
</head>
<body>
  <a class="inlineLink" href="https://example.com">Link Text</a>
</body>
</html>
```

# 解決策

以下のように無名の`@layer`で囲うと「青イタリック体」が適用されます。
`@layer`で囲ったルールと囲っていないルールでは、詳細度に関係なく囲っていないルールが優先されるからです。
※ `!important`したときは別ですが。
名前付きにして、共通CSSなどでレイヤーの順番をあらかじめ定義しておいてもいいかと思います。

```diff_html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>@layerのテスト</title>
  <style>
    /* リセットCSS または ノーマライズCSS */
-   /* 赤太文字 → こちらが適用される */
+   /* 赤太文字 */
+ @layer {
    a:link,
    a:active,
    a:visited{
      color: red;
      font-weight: bold;
    }
+ }

-   /* ページ用のCSS */
+   /* ページ用のCSS → こちらが適用される */
    /* 青イタリック体 */
    .inlineLink{
      color: blue;
      font-style: italic;
    }
  </style>
</head>
<body>
  <a class="inlineLink" href="https://example.com">Link Text</a>
</body>
</html>
```

以上

# 参考

https://developer.mozilla.org/ja/docs/Web/CSS/Specificity

https://developer.mozilla.org/ja/docs/Web/CSS/@layer
npm実行時のPowerShell実行ポリシーエラーの対処方法

## 発生した問題

npmコマンドを実行しようとしたところ、以下のようなセキュリティエラーが発生しました。

```plaintext
npm : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\nodejs\npm.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照
してください。
+ npm run install:all
+ ~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

## 原因

PowerShellの実行ポリシーが制限されており、スクリプトの実行が許可されていないことが原因でした。

## 解決手順

### 1. PowerShellのインストール

最新のPowerShellをwingetを使用してインストールします：

```powershell
winget search Microsoft.PowerShell
```

### 2. 現在の実行ポリシーの確認

PowerShellを管理者権限で起動し、以下のコマンドで現在の実行ポリシーを確認します：

```powershell
Get-ExecutionPolicy
```

結果が"Restricted"であることを確認しました。

### 3. 実行ポリシーの変更

以下のコマンドを実行して、実行ポリシーを"RemoteSigned"に変更します：

```powershell
Set-ExecutionPolicy RemoteSigned
```

## 実行ポリシーについて

PowerShellの実行ポリシーには以下の種類があります：

| 実行ポリシー | 署名あり | 署名なし/ローカル | 署名なし/非ローカル | 説明 |
| --- | --- | --- | --- | --- |
| Restricted | x | x | x | すべてのスクリプトの実行を制限 (初期設定) |
| AllSigned | o | x | x | 署名のあるスクリプトのみ実行可能 |
| RemoteSigned | o | o | x | ローカル上のスクリプトと非ローカル上の署名のあるスクリプトのみ実行可能 |
| Unrestricted | o | o | △ | すべてのスクリプトが実行可能だが非ローカル上のスクリプトは実行時に許可が必要 |
| Bypass | o | o | o | すべてのスクリプトが実行可能 |

この設定変更後、npmコマンドが正常に実行できるようになりました。

## 参考

* [Windows への PowerShell のインストール](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4#install-powershell-using-winget-recommended)
* [PowerShell のスクリプトが実行できない場合の対処方法](https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750)
【アジャイル開発・スクラム】SCRUM BOOT CAMP THE BOOK スクラムチームではじめるアジャイル開発

【アジャイル開発・スクラム】SCRUM BOOT CAMP THE BOOK スクラムチームではじめるアジャイル開発
<iframe width="560" height="315" src="https://www.youtube.com/embed/2A1GkEYgTsI?si=BmGRQeC4xStawQ3n" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
【アジャイル開発・スクラム】アジャイルな見積りと計画づくり~価値あるソフトウェアを育てる概念と技法~

【アジャイル開発・スクラム】アジャイルな見積りと計画づくり~価値あるソフトウェアを育てる概念と技法~
<iframe width="560" height="315" src="https://www.youtube.com/embed/O9Q08yRU9PE?si=Rr-XMlNnPvTCh5Yp" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
【Go】コマンドライン上で引数を渡して実行するスクリプト


## 概要


Go言語の[flag](https://pkg.go.dev/flag)パッケージを使用。コマンドライン引数を指定し実行できるスクリプトのサンプルコード


## サンプルコード


```go
package main

import (
	"flag"
	"fmt"
)

// 実行コマンド: go run . -option1=<オプション1> -option2=<オプション2> -option3=<オプション3>
func main() {
    // オプション
    op1 := flag.String("option1", "オプション1のデフォルト値", "オプション1")
    op2 := flag.String("option2", "オプション2のデフォルト値", "オプション2")
    op3 := flag.String("option3", "オプション3のデフォルト値", "オプション3")

    flag.Parse()

	fmt.Println("option1: " + *op1)
	fmt.Println("option2: " + *op2)
	fmt.Println("option3: " + *op3)
}
```


## 実行


```bash
$ go run . -option1=Hello -option3=World!
# 出力
# option1: Hello
# option2: オプション2のデフォルト値
# option3: World!
```
React100本ノックやってみた

## はじめに

この記事は以下の【Reactアプリ100本ノック】を参考に作成しました。

https://qiita.com/Sicut_study/items/3c5cd798313854a471a0

## **問題**


"Hello World" React コンポーネントの作成

## **目的**


Reactを使用して、画面中央に"Hello World"というメッセージを表示するコンポーネントを作成します。

## **達成条件**



1. Reactの新しいプロジェクトが正しくセットアップされていること。
2. 画面に"Hello World"というテキストが中央に表示されていること。

## **実際に解いてみた**

### **利用技術**

- React
- TypeScript
- Cursor
- TailWindCSS
- Next.js

## 結果



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993206/c0c3d1f7-d841-9ac6-ddb8-f8d6bcf5addf.png)

## コード


```tsx
export default function HelloWorld() {
  return (
    <div className="flex justify-center py-80">
      <a>hello,world!</a>
    </div>
  );
}
```

## 感想
<br>

中央に表示する際、justify-items-centerとitems-centerの違いの復習になりました。
Railsのログにおいてあるカラムの値がFILTEREDで表示されない

# はじめに
現在、フロントエンドからS3に対して presignedURLを通じた

ファイルアップロードを試みています。

成功後は あらかじめ生成した s3のkeyをbackendにPostして DBにインサートしています。

そこでRailsのログを眺めていたところ

先ほどの keyはただの文字列であるのに対して

カラムのログには "[FILTERED]"と出ていました。

こういうのって password とかそういうのだけではないの？

というのが疑問の発端です。

# 結論
Railsデフォルトのセキュリティ機能で

特定の文字列を含むデータベースカラムの値をログに表示させるとき、

条件に合致したら "[FILETERD]"と出力するためです。

原因は　`config/initilizers/parameter_logging.rb`の下記

```rb:parameter_logging.rb
# Configure sensitive parameters which will be filtered from the log file.
Rails.application.config.filter_parameters += %i[
  passw secret token _key crypt salt certificate otp ssn
]
```

今回の場合は "s3_key"というカラムを表示させようとしていたので 

上記条件に引っ掛かり "FILTERED"と表示されたというわけです。

# 終わりに
セキュリティ機能なので 無闇にいじることはやめておきます。

カラム名を変えるか、開発環境だけ出るようにするかにしたいと思います。

ただカラム名は 変に変えると後でわからなくなるし、本番でFILTEREDとしたら

追跡するの大変ではなかろうか。

普通どうやるもんなのでしょうかね。
Svelte5のことをLLMに完全に理解してほしい

## ！！！！注意！！！！ Svelte公式が親切すぎるのでこの記事はありえないほど短文になりました

なんとSvelteはLLM用の公式ドキュメントを用意している。

https://svelte.jp/docs/llms

下記から自分の目的に合ったものをLLMのシステムプロンプトに突っ込めばそれで完了！

今の時代に最適化されてる公式ドキュメントですごい...
＜アクセス権限＞SalesforceConnectの外部データソースは、Apexから取得でき、Where句で条件をかけられるのか？

CTA試験において、以下のようなケースでSalesforceConnectを使うユースケースがある。
　・大量のデータを扱うときに、古いデータをAWS S3など外部ストレージにアーカイブし、適宜Salesforceから古いデータを参照したい。
　・ERPの注文データを、Salesforceに物理的に連携せずに、リアルにSalesforceから参照したい。
 ※1時間あたり2万Callout、1時間あたり新規10万行の制限あり。

ただ、SalesforcConnectは、外部データソースに対して、プロファイルや権限セットで見えるか否かくらいしか制御ができず、特定の条件においてデータを参照させるなどの制御を行うことが厳しい。
※共有設定、共有ルールを使ったデータ制限は不可。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/ed46ff08-cee5-251f-0384-6a4dcca70ed4.png)


細やかな権限制御を行う対処として、いくつか方式はあるかと思うが、カスタム開発してデータを絞り込む方法があり、以下の通り。

まず、Trailheadの手順に従い、外部データソースや外部オブジェクトの設定を行う。
そうすると、対向のHerokuシステムにあるOrderの全量が表示される。


https://trailhead.salesforce.com/ja/content/learn/projects/quickstart-lightning-connect/quickstart-lightning-connect2

以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/28977f35-e4b4-836a-257b-60b24b401865.png)


Apexの WHERE句で、customerID__c = '101'と限定する。

Apex

    public with sharing class ExternalObjectController {
        public List<Order__x> orders { get; set; }

        public ExternalObjectController() {
            // 条件付きでデータを取得する
            orders = [SELECT Id, customerID__c FROM Order__x WHERE customerID__c = '101'];
        }
    }

Visualforceのソースコード

    <apex:page controller="ExternalObjectController">
        <apex:pageBlock title="External Orders">
            <apex:pageBlockTable value="{!orders}" var="order">
                <apex:column value="{!order.Id}" />
                <apex:column value="{!order.customerID__c }" />
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:page>


↓するとデータを限定できる。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/f5684003-a26c-bbce-3dbd-cb85df290503.png)

なので、基本的にSalesforceConnectと回答するが、「アクセス権限を絞りたい要件がある場合は？」となったら、LWC＋Apexでデータを限定する、というのが回答の1つ。

LWC＋ApexCalloutで対向システムから条件を指定してデータを取得し表示することも理論上できるが、エンタープライズ向けだと制限に抵触したりいろいろ大変なので、LWC＋Apexで外部データソースにクエリかけて絞り込んで表示がよさそ
Svelte5でuseAsyncフックを作りたい

## 結論

旧来のSvelteでは作りづらかったカスタムフック、Svelte5なら簡単に作れるようになったよ。例えばこんな感じ

```ts:useAsync.svelte.ts
export function useAsync<Fetcher extends (...args: any[]) => Promise<any>>(fetcher: Fetcher) {

  let data = $state<Awaited<ReturnType<Fetcher>> | null>(null);
  let error = $state<Error | null>(null);
  let isPending = $state(false);

  async function fetch(...args: Parameters<Fetcher>) {
    isPending = true;
    try {
      const result = await fetcher(...args);
      data = result;
      error = null;
    } catch (err) {
      error = err as Error | null;
      data = null;
    } finally {
      isPending = false;
    }
  }

  return {
    get data() {
      return data;
    },
    get error() {
      return error;
    },
    get isPending() {
      return isPending;
    },
    fetch,
  };
}
```

`xxxx.svelte.ts` ファイル内ではSvelte5で登場したRunesを使えるんだ。この関数のレスポンスそのものがリアクティブな値として返されるんだ。 **応答を分割代入するとリアクティブ性が消えるから気をつけてね。（分割代入してもリアクティブ性を失いたくないなら、$derivedを介してやる必要がある）**

```ts:usage
async function hoge() {
  return "something";
}

const asyncExecutor = useAsync(hoge);
asyncExecutor.exec()
// asyncExecutor.data, asyncExecutor.isPending, asyncExecutor.errorがリアクティブになる
// ただし分割代入して使いたいなら、そのままだとリアクティブ性を失うので、やりたければ下記のようにする必要がある
// let {data, isPending, error} = $derived(asyncExecutor);
```

## 補足

とはいえ、そもそもSvelteには最初からPromiseをテンプレートに描画するためのシンタックスがあるからuseAsyncやuseFetchを用意せずとも、概ね同じことを実現できるんだよね。使い勝手は好みによるところがあると思うから、どちらを使うかはそこ次第かな。

> ```svelte
> {#await promise}
> 	<!-- promise is pending -->
> 	<p>waiting for the promise to resolve...</p>
> {:then value}
> 	<!-- promise was fulfilled or not a Promise -->
> 	<p>The value is {value}</p>
> {:catch error}
> 	<!-- promise was rejected -->
> 	<p>Something went wrong: {error.message}</p>
> {/await}
> ```

https://svelte.jp/docs/svelte/await

## おまけ

Svelte5のカスタムフック集としてすごく参考になるページがあるから下記に掲載するね。

https://userunes.com/
Swift6対応でまず何をすれば良いか分からない人向けのまとめ

## 本記事について
この記事自体は、有用な情報を書いていないです！笑
私自身Swift6の対応をしよう思った時に、何から始めれば良いかわからないところがあって、今回この記事を書きました。
なので、基本的には自分用のまとめ記事なのですが、Swift6対応をこれからしていく人にも役に立てればなと思います。

※Swift6対応と書いてますが、メインはStrict Concurrency対応です。

## 本題
### WWDC2024「Swift 6へのアプリの移行」
https://developer.apple.com/jp/videos/play/wwdc2024/10169/
まずはなんといっても公式動画。

ここでSwift6の特徴だったり、移行に関するやり方の紹介が出ています。
また、移行時の警告に対する対応の一例なんかもあります。

### 移行のためのマイグレーションガイド（日本語訳）
https://swift-migration-guide.jp/documentation/migrationguide/
WWDCの内容から、さらに深い情報が載っている印象です。
WWDCの内容をもう少しわかりやすく知りたい方などは、下記の[Swift6の解説の動画](https://qiita.com/Takia/items/ebf06dc0819b1cb22c29#xcode-16--swift-6-%E3%82%AD%E3%83%A3%E3%83%83%E3%83%81%E3%82%A2%E3%83%83%E3%83%97-swift-concurrency%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%A8%E6%9C%80%E9%87%8D%E8%A6%81%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%92%E7%B7%8F%E5%BE%A9%E7%BF%92)を参照した方がいいと思います。
このマイグレーションガイド自体は、元々英語の記事でしたが、日本語訳のバージョンも作っていただいているので、非常に助かってます。

- 個人的に特に参考になる項目
    - [頻出のコンパイルエラー](https://swift-migration-guide.jp/documentation/swift-6-concurrency-migration-guide-----/commonproblems)
        - 実際にSwift6に対応していくにあたってどう対応すれば良いかを考えるのに役立ちます
    - [移行戦略](https://swift-migration-guide.jp/documentation/swift-6-concurrency-migration-guide-----/migrationstrategy#Swift5%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E4%BD%BF%E3%81%86)
        - Swift6対応のコツとして、upcoming featureフラグを活用するのがおすすめです。これ以外のfeatureフラグについては、この1個下の項目を参照いただくといいかもしれません

### Swift 6 に備える - 今後の機能（Upcoming Feature）の段階的適用 編
https://zenn.dev/treastrain/articles/d2fd1b44e3ead5

Swift5からSwift6にする際、さまざまなビルドエラーが発生するので、
そのエラーを細分化して、対応しやすくするためにupcoming featureフラグを活用するのがおすすめです。
それに関する情報がここにあります。

### Swift.org Documentation - attributes
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes
Sendable、preconcurrency、unchecked（Sendable）など
今回のSwift6対応に関するattributesのリファレンスがあるので、ここも確認すると理解が進みます。

### iOSDC Japan 2024: 座談会 「Strict ConcurrencyとSwift 6が開く新時代: 私たちはどう生きるか？」
https://www.youtube.com/watch?v=IQtWiJMcFv0
Swiftの有識者たちが、今回のSwift6の対応の一環であるStrict Concurrencyについて座談会を行う動画です。
個人的にこのStrict Concurrencyに関する対応を行うことで、よくわからないクラッシュが減ったという情報が、今回このSwift6に対応するモチベに繋がったので、非常に有用な情報でした。

### Xcode 16 & Swift 6 キャッチアップ: Swift Concurrencyの基礎と最重要ポイントを総復習
https://www.youtube.com/watch?v=jJgEtjx8KHY
上記座談会の参加者であるkoherさんがSwift Concurrencyに関する全般的な知識を、わかりやすく解説してくれています。

### 事例別！Strict Concurrency対応方法
https://zenn.dev/matsuji/articles/99fd796f8e405a
上記座談会の参加者であるmatsujiさんの記事。
警告に対して、どう言う原因で、どう対処すれば良いのかというのをわかりやすく解説されています。

### 各企業さんのテックブログ
実際のコードに対して、どういう対策をとったなど参考になります。
#### STORES レジにおけるSwift6移行対応
STORESさん
https://product.st.inc/entry/2024/12/23/182125

#### Swift 6に向けた準備：Strict Concurrency CheckingをTargeted設定にした際に発生した問題と解決方法
ZOZOさん
https://techblog.zozo.com/entry/swift6-strict-concurrency-checking

#### iOSアプリのSWIFT_STRICT_CONCURRENCYをcompleteにした
Gunosyさん
https://tech.gunosy.io/entry/swift_strict_concurreycy


### その他参考記事
#### エラーログとそれに対する対応
実際対応すると訳分からんエラーログが出てくるので、それの対応を書いてある具体的なありがたい記事です。
https://qiita.com/satoru_pripara/items/df491bfd412f510927f8

## まとめ
いつもみなさんの記事や動画に助けられて生活しています。感謝 :pray: