OmniAICreator/Qiita-1.07M huggingface dataset:
[MySQL]一時的に外部キー制約を回避したい

## どんな時に使うか
- テーブルを一括インポートしたい
- テーブルを一括削除したい

外部キー参照があると、テーブルを作成する順番や削除する順番を考えなければエラーになってしまう。
一括でインポート、削除したい時は一旦外部キー制約を回避した上で、作業後元に戻せば楽ちん

## やり方

外部キー制約を無視する
`SET FOREIGN_KEY_CHECKS = 0;`

外部キー制約を元に戻す
`SET FOREIGN_KEY_CHECKS = 1;`

## 注意
必ず作業後に外部キー制約を元に戻す。
そうでないとデータの不整合が発生するかも

## 所管
これで楽ちんや...
まあ一括インポート、一括削除するときなんて滅多にないけど。

以上
Youtubeの高度な検索のサイト紹介です。

# はじめに
この記事は別に特別な記事ではありません。
ただ、自分で、youtube検索をして動画を見ているときに、検索パラメータで、削除したい動画はどう指定するのかを調べていた時に、偶然出会ったサイトで、読んでいくとかなりよくできているページだったので、ここで、紹介しようと思いました。

# そのサイトとは
以下はそのリンクです。
ただし、このサイトは英語のため、ページでマウスの左ボタンで「日本語に翻訳」をクリックすると日本語で表示されます。
ご参考まで。
[50 以上の YouTube 検索演算子](https://seosly.com/blog/youtube-search-operators/)
「オルガ・ザール」という方のサイトですが、よく、まとめられています。
[オルガ・ザール](https://olgazarr.com/)


# 何を探していた時か?
それは、「森田健作」でyoutube検索していた時です。
いろいろ検索して出てきますが、それらの中にかなり、知事に関する動画もヒット
してしまいます。
歌のみにしたいので、知事に関する動画は削除したかったのです。
そこで、何をどうしたらいいのかと思っていました。
適当に検索キーを指定していた時に、もしかして－知事(マイナス)を指定すればいいのかと思い指定したところ、確かにそれらの動画は削除されていました。

そこで、ネットで調べ、それに関する詳しいサイトはないものかと調べてみました。
すると、先のリンク先が見つかりました。

# まだ十分読んでいませんが、一見よくできているサイトかなと思いました。
youtube動画の検索で、削除したい動画がある時は便利に使えます。
見たい動画だけの再生リストを作りたいときに利用します。
自分は、youtubeの再生プラグインをいろいろ作成しています。その時に、再生リストを作りますが、その時には不要な動画も含まれてしまいます。再生リストは、アメバのyoutube検索ボタンを利用して作成しています。

# アメバで再生リストを作る方法
わたしは、いつもyoutubeリストを作成するときは、アメバのyoutubeボタンで作成しています。生成したリストは、自前のレンタルサーバへ保存します。
この時、使用しているプラグインは、「AmebaYoutubeListプラグイン」です。
このプラグインで作成したリストの形式は、オリジナル形式のため、プレーヤーもオリジナルのプレーヤーになります。
このプレーヤーと再生リストで動作するサイトがあります。それが以下のサイトです。
[オリジナルサイト](https://favorite.tecoyan.net/test_debug/index_main.php?lnm=%E4%B8%AD%E5%B3%B6%E3%81%BF%E3%82%86%E3%81%8D#block)

このサイトを開くとクェリー一覧ボタンがあります。そのボタンをクリックするとクェリーの一覧が表示されます。そのクェリーリストは、アメバのyoutube検索で作成したリストです。先のプラグインをインストールしておけば、このアメバのyoutube検索ボタンで連続的に再生リストを作成し、保存できます。

AmebaYoutubeLlistプラグインのリンク
[ダウンロード](https://favorite.tecoyan.net/slim/zip/AmebaYoutubeLlist.zip)

# youtube検索の－パラメータの確認
先の森田健作でyoutube検索すると、知事関連の動画も検索されますので、ここで、歌だけの動画を検索するには、検索で、「森田健作 -知事」と入力します。
すると歌だけの動画リストが作成できます。
この確認をするには、先のサイトで確認できます。
[確認サイト](https://favorite.tecoyan.net/test_debug/index_main.php?lnm=%E6%A3%AE%E7%94%B0%E5%81%A5%E4%BD%9C%E3%80%80-%E7%9F%A5%E4%BA%8B)
ここをクリックして、クェリー一覧で、「・森田健作」と「・森田健作 -知事」をクリックすると比較できます。

以上のサンプルは、本題の補足です。本題は、「オルガ・ザール」という方のサイトです。



# あとがき
先の「オルガ・ザール」という方のサイトは、偶然みつかりました。
youtubeの検索パラメーターの説明が書かれていますので、ご参考になればと思い、記事にしました。
rex0220 計算式プラグイン 合計時間を"H時間m分"で表示

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、合計時間を"H時間m分"で表示してみます。

# 概要

テーブルの勤務時間の合計を"H時間m分"形式で文字列項目に設定します。
DURATION 関数で、時刻項目を milliseconds 単位に変換して計算することが出来ます。
DURATION_FORMAT 関数で、"H時間m分"形式に変換できます。

合計時間：　勤務時間の合計
勤務時間：　終了-開始-休憩

![2025-01-30_17h16_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/70135dbf-b266-6d91-2642-69d5720e4f68.png)

# 操作例

![2025-01-30_17h30_26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9cfd1a71-b5bd-e982-8419-fce1f8e3d02c.gif)

# 計算式プラグイン設定

「循環参照を許可」をチェック

- 勤務時間：　開始、終了、休憩を milliseconds に変換して計算

![2025-01-30_17h20_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/07a1b37a-cbe0-ad11-5579-815e1077208e.png)

```.js
OPTION: 循環参照を許可

// 年月 DATE (editable)
DATE_STARTOF(年月,"month")

// 合計時間 NUMBER
DURATION_FORMAT(
  SUM(DURATION(勤務時間)),
  "#H"
)

// 合計時間（時分）:合計時間_時分 SINGLE_LINE_TEXT
DURATION_FORMAT(
  SUM(DURATION(勤務時間)),
  "%H時間@m分"
)

// テーブル.曜日 SINGLE_LINE_TEXT
SUBSTR("日月火水木金土",DATE_FORMAT(日付,"e"),1)

// テーブル.勤務時間 TIME
LET(
  w, DURATION(終了)-DURATION(開始)-DURATION(休憩),
  IF(AND(終了,開始,休憩, w>0),
    DURATION_FORMAT(w, "%H:@m" )
  )
)
```
A判の起源

[2008年9月16日の日記](https://srad.jp/~yasuoka/journal/452482/)にも書いたが、日本でA2判・A3判として使われている紙のサイズは、18世紀末にフランスで使われていたGrand registre・Moyen papierと呼ばれる紙のサイズに由来する。たとえば、フランス共和暦13 Brumaire an VII (1798年11月3日)公布の法律2136号《[Loi sur le timbre](https://books.google.co.jp/books?id=1FxfAAAAcAAJ&gbpv=1&pg=RA1-PA57)》には、以下の6種類の紙のサイズが規定されていた。

![A判の起源.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/a8c99a47-d198-e93a-99f1-0c27f1e1edb9.jpeg)

これらのうち、Grand registreは0.4204m × 0.5946m = 0.2500m<sup>2</sup>で、現在のA2判である。Moyen papierは0.2973m × 0.4204m = 0.1250m<sup>2</sup>で、現在のA3判である。

これらの紙のサイズを、ドイツ工業規格DIN 476「Papierformate」(1922年8月18日制定)に持ち込んだのは、Walter Porstmannである(cf.《[Normung in den Graphischen Gewerben](https://www.google.co.jp/books/edition/Klimschs_Jahrbuch_des_Graphischen_Gewerb/6sY7AQAAMAAJ?gbpv=1&pg=PA126)》 Klimschs Jahrbuch, Bd.16 (1921/1922), S.126-132)。A0を1m<sup>2</sup>、A1を0.5m<sup>2</sup>、A2を0.25m<sup>2</sup>、A3を0.125m<sup>2</sup>、…という面積に設定したことから、Grand registreがA2、Moyen papierがA3になったわけである。一方、Friedrich Wilhelm Ostwaldが提案した紙のサイズ(cf. Wilhelm Ostwald: [Sekundäre Weltformate](https://www.digitale-sammlungen.de/de/details/bsb11167004), Brücke, 1912)は、DIN 476ではB判(Reihe B)・C判(Reihe C)として収録された。ただし、Ostwaldの提案も完全なオリジナルというわけではなく、B3はフランスのGrand papier、B4はPetit papier、B5はDemi-feuilleである。つまり、フランスの6種類の紙のサイズのうち、Effets de commerceを除く5種類が、いずれもDIN 476にそのまま採用されている。

![DIN470.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/7761064d-bae6-4405-7d4d-984a120bc14d.png)

ちなみに、日本標準規格第92号「紙ノ仕上寸法」(1929年12月4日決定)は、A判はDIN 476を踏襲しているものの、B判はDIN 476より少し大きい。ドイツのB0が1.4142m<sup>2</sup>なのに対して、日本のB0は1.5m<sup>2</sup>である。その後、A判とドイツのB判は、ISO/R 216「Trimmed sizes of writing paper and certain classes of printed matter」(1961年11月勧告)で国際規格となったが、日本のB判は国内規格のままである。
Docker環境でのRailsプロジェクト再立ち上げが分からなすぎた話

## はじめに

自分はプロジェクトにフロントエンドエンジニアとして入ることが多いが、バックエンドでの変更やデータベースでの変更がブランチに取り込まれた際に、500サーバーエラーなどアプリケーションのフロント自体が見れなくなるタイミングが開発していると頻繁に立ち会うことがあると思う。

そんな時よくDocker環境でのRailsプロジェクトの再立ち上げをするが、あんまり手順として残ってない気がしたので、残してみることにした。


## 具体的手順
バックエンドがRailsのDocker環境下に限られるが、そんな技術スタックのプロジェクトも多いと思うので下記に手順を書く。

#### 手順1
```terminal
docker compose down
```
ローカル環境を一旦ダウンさせる

#### 手順2
```terminal
docker compose down -v
```
ローカル環境のクリア
DB設定を変更した際に実行する

#### 手順3
```terminal
docker compose up
```
ローカル環境を立ち上げる

#### 手順4
```terminal
docker exec -it プロジェクト名 /bin/bash
```
shellに入る

#### 手順5
```terminal
bundle install
```
Gemのインストール

#### 手順6
```terminal
DATABASE_USER=root bundle exec rails db:migrate:reset
DATABASE_USER=root bundle exec rails db:migrate
```
マイグレーションを実行する

#### 手順7
```terminal
DATABASE_USER=root bundle exec rails db:migrate:reset;
bundle exec rails db:seed
```
seedデータを投入する

## さいごに
どのプロジェクトもRailsとDockerは大体上記の手順で立ち上げ直したら変更が反映されていたので、備忘録。
WSL2 + docker環境でLaravelアプリのレスポンスが異常に遅い場合の対処法

## 対処法

対象のLaravelプロジェクトを`/mnt`配下に置かない。

（WSL2では`/mnt`配下へのアクセスに問題を抱えているため）


### 参考記事
https://github.com/microsoft/WSL/issues/4197

https://stackoverflow.com/questions/63036490/docker-is-extremely-slow-when-running-laravel-on-nginx-container-wsl2
Spring Bootでvalidation errorが出せなかった時の解決策

# 概要
Spring BootでPUTしようとしたら、エラーメッセージではなくエラー画面が出たので、その解決策をメモしておきます。

# 環境
- フレームワーク: Spring Boot
- 言語: Kotlin

# やりたいこと
- 入力エラーが出たとき、validation messageを出したい

# 起きた問題
- エラー画面が出る


```kotlin:Form.kt
class Form(
    @field:Size(max =10, message="10文字以内で入力してください。")
    var title: String= ""
    ) {}
```

```kotlin:Controller.kt (PUTの部分) 
@PutMapping("/edit/{id}/finished")
    fun put(@Validated form: Form, @PathVariable("id") id: Long, error: BindingResult, ra: RedirectAttributes): String{
        if (error.hasErrors()) {
            ra.addFlashAttribute("org.springframework.validation.BindingResult.form", error)
            ra.addFlashAttribute("form", Form)
            return "redirect:/edit/$id"
        }
        else {
            formService.edit(form, id)
            return "redirect:/"
        }
    }
```


# 原因
- @Validated formと@PathVariableを逆にした
- @Validated formの直後に、BindingResultをおく必要がある


<table>
<caption>from "method argument" by official reference</caption>
  <tr>
    <td> Errors, BindingResult</td> 
    <td>For access to errors from validation and data binding for a command object (that is, a @ModelAttribute argument) or errors from the validation of a @RequestBody or @RequestPart arguments. You must declare an Errors, or BindingResult argument immediately after the validated method argument.</td>
  </tr>
</table>


# 最後に
- もう少し丁寧にリファレンスに目を通したい。

# 参照
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html#webmvc-ann-methods-arguments
個人的な備忘録：AWS・Azure・GCPを一元管理できるDatadogの基本を体系的にまとめてみた

## はじめに
Datadogは、インフラ、ログ、アプリケーション、ネットワーク、セキュリティを統合的に監視できるツールです。

:::note info
**特にクラウド環境での利用に適しており、リアルタイム監視やアラート機能が充実しています。**
:::

システムの状態をリアルタイムで把握したい、インシデント対応をスムーズにしたいと考えている場合は、***無料トライアルで試してみるのもおすすめです。***

## 書こうと思ったきっかけ
受講しているITスクールのチーム開発において、今回は運用監視をDatadogで一元管理することにしました。

![Screenshot 2025-01-25 at 1.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c06d3316-95b7-4b5d-61e1-67827deee5e2.png)

一部 **AWSのCloudWatchやLambdaといったサーバーレスアーキテクチャ** を構築していますが、基本的なリソース監視やログ監視はDatadogを活用 する方針です。

その中で、今回トライアル期間を活用して実装を進めてみようと思い、改めてDatadogについてキャッチアップ していきます。

## Datadogとは？
Datadog は、**クラウドやオンプレミス環境の 監視・分析 を行うための SaaS型オブザーバビリティプラットフォーム** です。

![Screenshot 2025-01-30 at 16.24.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/baef2fa2-d514-c1e6-1c87-77008f6818c2.png)
引用画像：https://www.datadoghq.com/ja/blog/network-performance-monitoring/

サーバー・コンテナ・アプリケーション・ネットワーク・セキュリティ など、システム全体のパフォーマンスを リアルタイムに可視化・監視 できます。

## Datadogの利用が適しているケース
正直、**AWSにはCloudWatchという監視サービス** がありますが、複数のクラウドやオンプレミス環境を一元管理したい場合 は、Datadogのような統合監視ツールを活用するのが効果的だと考えています。

![Screenshot 2025-01-30 at 16.40.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/07163b8e-e3b2-ff73-a6c2-d37619e35260.png)
引用画像：[Datadog公式](https://docs.datadoghq.com/ja/agent/remote_config/?tab=%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3%82%AE%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3yaml%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)

- **クラウド環境の監視を行いたい**  
  - AWS、Azure、GCP などのクラウドサービスと統合し、一元的に監視できる  

- **インフラの死活監視やリソース監視を自動化したい**  
  - CPU、メモリ、ディスク使用率、ネットワークトラフィックなどの監視を簡単に設定可能  

- **アプリケーションのパフォーマンスを改善したい**  
  - APM（Application Performance Monitoring）を活用し、リクエストのトレースやデータベースクエリの最適化ができる  

- **統合された監視ツールを探している**  
  - インフラ、アプリケーション、ログ、セキュリティ監視を **一元管理** し、可視化・アラート設定が可能  


## **Datadogの主要機能まとめ**

**インフラ監視（Infrastructure Monitoring）**  
- **CPU、メモリ、ディスク使用率、ネットワークトラフィック** の監視  
- **AWS、Azure、GCPなどのクラウドサービス** と統合  
- **Datadog Agent** を各ホストにインストールしてデータ収集  

**ログ管理（Log Management）**  
- **ログの収集、検索、分析**  
- **クエリを使用してログデータを可視化・アラート設定**  
- **フルスタックのログ分析でアプリケーションやシステムの異常検知が可能**  

**アプリケーションパフォーマンス監視（APM: Application Performance Monitoring）**  
- **リクエストのトレースによる処理遅延の特定**  
- **データベースクエリやAPI呼び出しのパフォーマンス分析**  
- **マイクロサービス環境に対応**  

**セキュリティ監視（Security Monitoring）**  
- **不正アクセスや脆弱性の検出**  
- **クラウド環境のコンプライアンスチェック**  
- **SIEM（Security Information and Event Management）機能**  

**ネットワーク監視（Network Performance Monitoring）**  
- **パケットロスやレイテンシーの監視**  
- **クラウドネットワークやオンプレミス環境のトラフィック可視化**  
- **マイクロサービス間の通信分析**  

**ダッシュボード & アラート**  
- **リアルタイムでメトリクスを可視化（グラフやテーブル表示）**  
- **カスタムダッシュボードの作成**  
- **異常を検知するとSlackやメールにアラート通知**  

## まとめ
ここまで読んでいただき、ありがとうございました！***私自身、実務でDatadogをたくさん使ってきたので、今回のチーム開発で触れる機会ができたことを嬉しく思っています。***

:::note warn
**ただ、今回はトライアル期間や無料枠の範囲内での利用となるため、サービスの制限はありますが、最大限活用していきたいと考えています。**
:::

今後もDatadogに関する情報を発信していく予定ですので、興味があればぜひチェックしてみてください！
Windows11でGitクライアントが全滅！？その解決策

# Windows11でGitクライアントが全滅！？その解決策

## こんな経験ありませんか？

「いつも通りGitクライアントを起動しようとしたら...あれ？落ちる...他のクライアントも試してみよう...え！？全部落ちる！？」

この突然の「Git難民」状態、私も経験しました（震え声）。でも大丈夫！意外とシンプルな解決策があったんです。

## 発生した症状（これはツラい）

なんと、以下の有名どころのGitクライアントが**すべて起動せず**、クラッシュする状態に...😱

- Fork（人気の高機能クライアント）
- SourceTree（老舗の定番クライアント）
- SourceGit（軽量で使いやすいクライアント）

しかも共通して「CrashDump」なんて物騒なファイルを吐き出して終了...

- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/0e49dffa-e6c0-5d86-f816-bc9c1ef4c6db.png)

## 解決策：意外とシンプルでした！

**Windows Update 24H2を適用**するだけで解決しました！

### 具体的な手順

1. Windowsの設定を開く
1. Windows Updateを確認
1. 24H2アップデートを適用
1. 再起動
1. ...以上！

- ![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/7cb9013a-fbef-cf4a-b9a5-ed45b3410bfe.png)

## なぜこれで解決したの？

正直なところ、別の問題を解決するために「ついで」にアップデートしてみたら、このGitクライアントの問題も解消されたという感じです。

Windows 24H2のアップデートには、何らかのシステムコンポーネントの修正が含まれていたのかもしれません。（詳しい原因までは追求できていません🙇‍♂️）

## この解決策のいいところ！

1. **超シンプル**
   - 特別な知識も不要
   - 設定もいじる必要なし
   - 再インストールとかの手間も不要

2. **確実**
   - 少なくとも私の環境では100%解決
   - 他の方でも同様の報告あり

3. **副作用なし**
   - システムアップデートなので安心
   - むしろ他の問題も解決するかも！

## さいごに

突然のGitクライアント危機、かなり焦りましたよね。でも意外とシンプルな解決策があったんです。

この記事を見つけた方、きっと同じ問題で困っているはず。この解決策で、あなたのGitライフが復活することを願っています...✨

## おまけ
「え！そんな簡単に解決するの！？」と思った方、私も最初は信じられませんでした（笑）。この記事が誰かの助けになれば嬉しいです。「いいね」もらえたら、次の記事のモチベーションになります😊
ユーティリティ項目のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

-----------------


+ [recordIdを利用する画面フローをユーティリティ項目上で利用できるのでしょうか。 ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KChMw)

:::note
アイデアに上がっていますが、回避策が提案されていますね。 


https://ideas.salesforce.com/s/idea/a0B8W00000GdkP0UAJ/allow-passing-record-id-to-flows-launched-from-utility-bar

英語ですが参考になると思います。 

https://salesforcetime.com/2023/09/21/passing-record-id-to-a-flow-in-the-utility-bar/

同様の質問 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLY5FSAW
:::


# 1つ以上のユーティリティが存在しないため、変更を保存できません。もう一度試すか、すべてのユーティリティが依然として有効であることを確認してください。

+ [アプリケーションマネージャーのユーティリティ項目の登録時のエラー](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jg7P3)

:::note
残念ながら既知の問題で修正なしになっていますね。

文字数に上限があるようです。回避策としては
Try to limit the number of characters in the rich text area to 3993.
3993文字より小さくするのかな。

[Creating a Rich Text Utility Item for a Lightning Console App throws a generic error when the character limit is reached.](https://trailblazer.salesforce.com/issues_view?id=a1p3A000001SGT6QAO)
:::
Javaで「パスワードフィールドの作成と列数(幅)の設定」の動作を確認してみた。

# 概要

Javaで「パスワードフィールドの作成と列数(幅)の設定」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jpasswordfield/index1.html

# 実装

以下のファイルを作成しました。

```JSample1_1.java
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JPanel;
import java.awt.Container;
import java.awt.BorderLayout;

class JSample1_1 extends JFrame{
  public static void main(String args[]){
    JSample1_1 frame = new JSample1_1("MyTitle");
    frame.setVisible(true);
  }

  JSample1_1(String title){
    setTitle(title);
    setBounds(100, 100, 600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPasswordField pass1 = new JPasswordField();
    pass1.setColumns(20);
    JPasswordField pass2 = new JPasswordField(10);

    JPanel p = new JPanel();
    p.add(pass1);
    p.add(pass2);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }
}
```

以下のコマンドを実行しました。

```
$ javac JSample1_1.java 
$ java JSample1_1
```

実行結果は以下の通りでした。

![Screenshot from 2025-01-30 16-27-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/559c9fb2-3774-4ee8-3d33-2a06aa52862a.png)

# まとめ

何かの役に立てばと。
＜太田心＞AIエンジニアとして活躍するための5つのステップ

太田心です。

AI（人工知能）は今後ますます注目される分野であり、AIエンジニアとして活躍するためには、適切なステップを踏んでスキルを習得し、実務経験を積むことが重要です。ここでは、AIエンジニアとして成功するための5つのステップを紹介します。

## 1. AIの基礎を理解する

AIエンジニアになるためには、まずAIの基礎をしっかりと理解することが必要です。以下の分野を学びましょう：

- **機械学習**：機械学習のアルゴリズムや理論について学びます。回帰分析や分類問題など、基礎的なアルゴリズムを理解することが重要です。
- **深層学習**：ニューラルネットワークやディープラーニングの基本的な概念を学びます。
- **データ解析**：データの前処理や探索的データ解析の方法について学び、モデルを構築するために重要なスキルを身につけます。

## 2. プログラミングスキルを習得する

AIエンジニアには、プログラミングスキルが不可欠です。以下の言語を学んでおきましょう：

- **Python**：AIの開発で最もよく使用される言語です。ライブラリ（TensorFlow, PyTorch, scikit-learnなど）が豊富で、学習にも使いやすいです。
- **R**：統計解析やデータビジュアライゼーションに強力なツールを提供します。
- **SQL**：データベースからデータを取得するための基本的なスキルです。

## 3. 実践的なプロジェクトを通じて経験を積む

AIの知識を深めるためには、実際にプロジェクトを行って経験を積むことが不可欠です。次の方法で実践を重ねましょう：

- **コンペティションに参加する**：Kaggleなどのプラットフォームでコンペティションに参加し、実際のデータセットを使って問題を解決します。
- **オープンソースプロジェクトに貢献する**：GitHubなどでAI関連のオープンソースプロジェクトに貢献し、他のエンジニアと共同で作業します。

## 4. 最新技術を追い続ける

AI技術は日進月歩で進化しています。常に最新技術を追い続けることが重要です。以下の方法で最新技術に触れましょう：

- **研究論文を読む**：arXivやGoogle Scholarを活用して、最新のAI研究論文を定期的に読む習慣をつけましょう。
- **オンラインコースを受講する**：CourseraやUdemy、edXなどのオンラインプラットフォームで最新のAI技術を学ぶことができます。

## 5. ネットワーキングとコミュニティに参加する

AIエンジニアとして活躍するためには、ネットワーキングが重要です。次の活動を通じて、業界の人々とつながりましょう：

- **ミートアップやカンファレンスに参加する**：AI関連のミートアップやカンファレンスに参加して、業界の最新情報を得るとともに、他のエンジニアと交流を深めます。
- **オンラインフォーラムに参加する**：Stack OverflowやRedditのAI関連フォーラムで質問したり、他のエンジニアと議論を交わすことでスキルアップを図ります。

---

これらのステップを踏むことで、AIエンジニアとしてのスキルを着実に身につけ、業界で活躍するための基盤を築くことができます。
git Commit時にgit tagとbulid statusをJenkinsジョブから更新する

コミット時にJenkinsジョブをトリガーし、
ビルド成功時にgit tagとbulid statusをgit CommitにプッシュするようなJenkinsジョブを作成する。忘れないようにメモ。

設定前
タグなし、ステータスなし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/283752ff-24db-2333-39a7-55454fd33843.png)

設定後
n回目のビルドを表したタグ
「Private-repo-git-webhook」ジョブからコミットしたステータス表記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/ad665514-840e-8d1e-e76d-c407f0e38ed8.png)


## 前提
* プライベートリポジトリとJenkinsの認証設定は済んでいること


## 設定

### github設定
#### webhook
プライベートリポジトリの[Settings]タブより、[Webhooks]を選択しPayloadURLを入力する。
`http://【Jenkinsサーバ】:8080/github-webhook/`
これを設定することで、リポジトリにコミットが来たタイミングで設定したエンドポイントにRESTAPIでリクエストを送るようになる。
そのリクエストをトリガーにしてJenkins側でパイプラインを構成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/8f7bb40e-3a55-4993-12c2-27ed6aebaf12.png)

#### git publisher用のアクセストークン作成
gitリポジトリへのアクセストークンとgit publisher用のアクセストークンは異なるため別途作成する必要がある。
`右上のアイコン`→`Settings`→`Developer Settings`→`Personal access tokens (classic)`から、「Generate new token」を実行しアクセストークンを発行しておく。
発行されたトークンはJenkins側で登録するため控えておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/f752192e-151f-ed6a-e25e-4070472ee94b.png)

発行時に
リポジトリ全体にアクセスができるようにチェックマークを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/546bf277-31fe-955a-564c-a961abe774be.png)


### Jenkins設定

#### アクセストークン設定
githubで作成したgit publisher用トークンを登録する。
`ダッシュボード`→`Jenkinsの管理`→`System`→`Github`に移動し、
Credentialsの追加ボタンから先ほど作成したアクセストークンを「Secret text」で登録する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/5c0ff5f0-8358-7227-8d53-2de4d127336f.png)




#### ジョブ作成の設定
Jenkinsで設定できる環境変数を確認する。
https://zenn.dev/snowcait/scraps/bc7675be46d01d
今回は、BUILD_NUMBERをタグにプッシュするように設定するため、
ログでNUMBERが確認できるようにシェルコマンドを実行しておく。
```
echo "JOB NAME IS　${JOB_NAME}"
echo "JOB NUMBER IS #${BUILD_NUMBER}"
```

GitHub hookにトリガーできるようにチェックマークをつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/032d49ff-1e6b-b884-e9b6-58c0850f8f87.png)


Git Publisher欄にて、
プッシュするタグ名とリモート名を設定する。
また、コミット時に反映する操作として「タグの作成」「タグの更新」にチェックマークを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/7d8815e4-97db-540c-e572-27ea869030d7.png)

Set GitHub commit status (universal)欄にて、
`Status result:`を`One of default messages and statuses`に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/318b5ace-2c3c-575c-6076-ae6e1e52fc38.png)

### 実際にコミットしてみる。
test.txtを更新し、コミットしてプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/6e4a802e-cbd5-3b2e-201e-78e6f114c4eb.png)

Jenkinsでジョブがキックされたことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/d4e99dbe-1a31-0aa2-f8ed-1e7379da1a5b.png)

Githubでステータスの更新とタグの付与がされていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/f6507d3e-96ed-1109-d3e0-145520d78c7a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/c1508c4f-706f-61a2-2067-ef642703c174.png)
Reactのリストには必ずキーを付けよう！

Reactを使って複数の要素をリストとしてレンダーするとき、map()メソッドなどを使って以下のように書いたことがある方は多いと思います。

```Typescript
const items = ['りんご', 'みかん', 'ぶどう'];

function FruitList() {
  return (
    <ul>
      {items.map((item) => {
        return <li>{item}</li>;
      })}
    </ul>
  );
}
```

このとき、コンソール上で警告が表示されることがあります。
```
Warning: Each child in a list should have a unique "key" prop.
```

この警告が示すとおり、React ではリストを描画する要素（子要素）にはユニークな「key」プロップを指定しなければなりません。では、なぜキーが必要なのでしょうか？　本記事では、キーが必要な背景と、どのように運用すれば良いかを解説します。

**なぜキーが必要なのか？**

# 1. 要素の差分を特定するため

React は仮想DOM（Virtual DOM）を用いてUIの差分更新を行っています。リストの各要素をレンダーする際、どの要素がどのデータに対応するかを判別するためにキーを使います。

要素を更新するとき

要素の追加や削除が起きたとき

これらの場合に、「どの要素が変更されたのか」を正しく特定するためには、**一意なキー（key）**が重要です。

# 2. パフォーマンス最適化

React はキーを使ってリスト内の要素が入れ替わったかどうかを高速に判断できます。

キーが正しく設定されていないと、React は最悪の場合、リスト内の要素を1つずつ「差分があるか」を再計算しなければなりません。

キーが正しく設定されていると、React はキーを手がかりに要素の移動・更新をすぐに把握でき、差分計算のパフォーマンスを最適化できるのです。

**キー指定のベストプラクティス**

# 1. ユニークなIDを使う

リストがAPIから取得したデータやDBに格納されているデータなど「一意のIDを持つ」場合、そのIDをキーに使うのが最適です。
```Typescript
const users = [
  { id: 1, name: '太郎' },
  { id: 2, name: '花子' },
  { id: 3, name: '次郎' },
];

function UserList() {
  return (
    <ul>
      {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}
```

user.id はデータを一意に特定できるので、リストの順序が変わっても、React が正しく差分を把握できます。

# 2. インデックス（配列の位置）をキーにしない

配列のindexをキーとして使うことは推奨されません。

リストの並びが変更される場合（要素を並び替えたり、途中で追加・削除されたりする場合）に、同じインデックスでも別の要素を指すことがあり、React が正しい要素の対応関係を保てなくなる。

これにより、バグが発生したり、コンポーネントの状態が不正に引き継がれてしまう可能性があります。

どうしても一意のIDが取得できず、かつ要素の並べ替えや削除が絶対に起きないのであれば、暫定的にインデックスを使うこともあります。しかし、基本的にはユニークなIDを準備するのが理想です。

# 3. key はリスト内で一意ならOK

複雑に考えがちですが、React が必要としているのは**「同じリスト内で一意」**なキーです。

同じコンポーネントが複数あったとしても、それぞれのリストごとにキーがユニークであれば問題ありません。

たとえば、A コンポーネントにリストがあって、B コンポーネントにもリストがあって、それぞれのリストが別のデータを扱うとき、両リストでキーの値が重複していても、それぞれのコンポーネントが独立している限りは衝突しません。

キーを指定しないとどうなる？

先ほどのサンプルのように、キーを指定しないまま書いた場合は、React から警告が表示されます。警告を無視してもコードは動作することが多いですが、以下のようなデメリットがあります。

パフォーマンス低下： どの要素が変更されたのかを判定しづらくなり、無駄な再レンダーが起きる可能性がある

予測不能な振る舞い： フォーム要素や入力値を含むコンポーネントが並び替えられた場合に、入力値やコンポーネントの状態が違う要素に引き継がれるリスクがある

React は高速なUI更新を実現するためにキーを頼りにしているので、正しくキーを指定することはReact の基本ルールと言えます。

# まとめ

リスト要素にキーを指定することはReactにおける必須事項であり、適切なキーがない場合はパフォーマンス上も機能上も問題が発生しやすいです。

API やDBからユニークなIDを使う

インデックスを使うのはなるべく避ける

リスト内で重複しないキーを付与する

これらのポイントを押さえておけば、React アプリケーションを安定的かつ効率的に動作させることができます。ぜひ、日々の開発で意識してみてください。

もしデータにユニークなIDが存在しない場合は、以下のような方法を検討しても良いでしょう。

新規要素を作るタイミングで UUID や連番を付ける

DBやサーバーが生成してくれるユニークキーがあればそれを利用する

（どうしても動的な並び替えが行われない確証がある場合にのみ）インデックスを利用する

React のドキュメントにもキーに関する解説があるので、公式ドキュメントも合わせて確認してみてください。

https://ja.react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key
【忘備録】ディレクトリ内のフォルダを個別ZIP化コマンド

## Windows
フォルダをドラッグアンドドロップして使用します。
`sendto`に作成すると便利
#### 前提条件
- **7ZIP**インストール済み


```bat
@echo off 
set ZIP_PATH="C:\Program Files\7-Zip\7z.exe" 
for %%f in (%*) do ( 
%ZIP_PATH% a -tzip %%f.zip %%f 
) 

exit /B 0 
```
## Linux
/usr/local/bin/に格納しておくと便利（chomod +xを忘れずに。）
ZIPNowfolder（ファイル名は任意）で保存し、個別にZIP化したいフォルダがあるディレクトリで実行すればOK
#### 前提条件
- zipコマンド使用可
```sh
#!/bin/bash

# 現在のディレクトリをターゲットディレクトリとして設定
TARGET_DIR=$(pwd)

# ターゲットディレクトリ内の各サブディレクトリを処理
for dir in "$TARGET_DIR"/*/; do
  # サブディレクトリ名を取得
  dirname=$(basename "$dir")
  
  # ZIPファイルの名前を設定
  zipfile="$TARGET_DIR/$dirname.zip"
  
  # サブディレクトリをZIPに圧縮
  zip -r "$zipfile" "$dir"
done
```
Next.js + Tailwind CSS + MicroCMSでサイトを作成した時の振り返り

# はじめに
友人が動画編集の受託をはじめるそうなので、サンプルのサイトを作成しました。
技術スタックとしてはNext.js、Tailwind CSSで作成、MicroCMSと連携させ、Vercelにデプロイしました。
書籍やほかのブログでもよくある鉄板構成なので、情報はありふれていますが、初学者の実体験を言語化できればと思います。

#### GitHub
https://github.com/NeverPlayTEKKEN/edit-pro
#### Link
https://edit-pro-9i6h.vercel.app/

# 技術選定
### Next.jsについて
そもそもNext.jsを使う必要がなかったな。となりました。
「モダンなフレームワーク・言語に触れたい」という動機があったので、ただ「触る」という目的であれば達成はできました。

しかし、複雑なUIは必要ない静的なサイトであったため、コンポーネントで書く良さとかReactフックの使い方に対する理解はそこまで深まりませんでした。

かといって、JQueryで書くか、といわれるとモチベーション的にもキャリア的にも厳しいところがあり、最適解は模索中です。

### Tailwind CSSについて
これまでCSSを書くことがほとんどなく、食わず嫌いしていましたが、Tailwind CSSに関してはノンストレスで書けるし、体験として爽快で最高でした。

ただ、一度完成させてからデザインが気に入らずFigmaでデザインしなおし、それをもとに新たに作り直しましたが、可読性が悪く（※自分のせい）marginやpaddingに関しても統一したルールが定められていないため、ほぼ一からの書き直しとなりました。

また、CSSをすっとばしてしまったので明らかに基礎力が足りておらず、現在作成している別サイトでは反省を生かし泣く泣くCSS modulesでスタイリングしています。

### microCMS、Vercelについて
ネット上に情報がたくさんあり、困ることがほとんどありませんでした。
また、microCMSのsdkが便利だったりnpmが便利だったり、vercelが便利だったり...
モダンな技術を使用して巨人の肩に乗る快適さを味わうことができました。

なお、「このまま勉強しても、結局使い方に詳しい人になるだけじゃね？」という危機感をもち、現在はよりハードウェアよりの知識や、WEBブラウザのしくみ自体を勉強するようになりました。

### その他
書いたことあったのでJavaScriptで書いちゃったけど、キャリアのことを考えたらTypeScriptで書いた方がよかったなって後から思いました。

# 苦労したこと
### デザイン
デザイナーさんって必要なんだな...と強く感じました。
ちょうどよい著作権フリーの画像がなく、最初はChatGPTで出力⇒修正をつづけていましたが、明らかに生成AIっぽいイラストは世間の風当たりも強く、イメージ向上にはつながりづらい...と感じたためフリー素材の組み合わせで作りました。

デザインは楽しいんだけど、自分のキャリアにはつながりづらいため、あまり工数をかけたくないポイントでした。

また、当初はスマホからみたときにきれいにみえていればいいかな...ぐらいの感じでしたがPCでみたときのダサさが我慢ならず、作りなおしました。

### Vercelへのデプロイ
開発環境では通るコンパイルがVercelでは通らない...ということが頻発しました。
半分趣味のため、npm run devで問題ないからGo！の精神で特攻しましたが、今後業務で使うかもしれないことを鑑みるともっと丁寧にひとつひとつ着実に進めていくべきだったと考えています。

また、Gitを使っていましたが、一人開発のためずっとmainブランチで開発し、Vercelとmainブランチを連携させたため、終盤は本番環境をいじり続ける危険人物になっていました。~~ひどすぎる...~~

### divタグ地獄
コンポーネントをどのように分割するかも悩むポイントとなりました。
ただ、オブジェクト指向っぽい感じとしてなんとなく理解し、ここはそこまで悩みませんでした。
シンプルにHTMLの知識が乏しかったため、divタグだらけとなりました。
これは素直に反省し、現在作成中のサイトに活かしています。

## 楽しかったこと
### 友人との要件の話し合い
仲のいい友人で、お金をもらわず、かっちりとした納期もないため（なんとなく一か月くらいというのはあった）のんびり話せたのがよかったです。

旧版を完成させて、こんな感じ！とみせるととても喜んでくれたため開発者冥利に尽き、二次開発のモチベーションとなりました。

### 追加機能の開発
作成当初はMicroCMSとの連携はしていませんでした。
旧版が完成した段階で、友人から「価格を修正したい」とか、「Twitter連携したい」といった要望があり「実現したいことはなんだろう？このとき、ユーザービリティが高い設計はなんだろう」と考えヘッドレスCMSを使うに至りました。

ひとのことを考えてものをつくる瞬間はいつも最高に楽しいです。

# まとめ
そんなに技術力は上がらなかったけど、楽しかったです。
Typescriptのお仕事がしたいです。
firestoreでwhere(docid, 'in', 配列)がうまく動かなかった

# はじめに
firestoreからのデータ取得で少し時間がかかってしまったので記事にします

# 問題
以下のように配列に含まれるドキュメントidと一致するドキュメントを取得しようとするが取得できない。色々出力してみるとやはりここが原因そう。
```jsx
query(コレクションのref, where('id', 'in', 配列))
```

# 解決策
whereで使ってる'id'はドキュメントのidをみているのではなくフィールドidをみてるみたいなのでここを直す必要がありました。

```jsx
query(コレクションのref, where(documentId(), 'in', 配列))
```

# 注意点
inだと30件までしか取得できないみたいです。

https://firebase.google.com/docs/firestore/query-data/queries?hl=ja#in_and_array-contains-any
python isinstance について

# Python の `isinstance(item, list)` について解説

## `isinstance()` とは？

Python の `isinstance()` は、指定したオブジェクトが特定の型（クラス）であるかどうかを判定するための組み込み関数です。

### 基本構文

```python
isinstance(object, classinfo)
```

- `object`：判定したいオブジェクト
- `classinfo`：確認したい型（クラス）

この関数は、`object` が `classinfo` のインスタンスであれば `True` を、そうでなければ `False` を返します。

## `isinstance(item, list)` の意味

`isinstance(item, list)` は、`item` が `list` 型のインスタンスかどうかをチェックするために使われます。

### 例

```python
item1 = [1, 2, 3]
item2 = "Hello"
item3 = (1, 2, 3)

print(isinstance(item1, list))  # True
print(isinstance(item2, list))  # False
print(isinstance(item3, list))  # False
```

上記の例では、`item1` はリストなので `True` になりますが、文字列（`str` 型）である `item2` やタプル（`tuple` 型）である `item3` は `False` になります。

## `isinstance()` を使うメリット

### 1. 型チェックによるエラー防止

Python は動的型付け言語なので、変数の型を明示的に指定する必要はありません。しかし、型の違いによるエラーを防ぐために `isinstance()` を使うことで、安全なコードを書けます。

```python
def add_elements(item):
    if isinstance(item, list):
        return sum(item)
    else:
        raise TypeError("引数はリスト型である必要があります。")

print(add_elements([1, 2, 3]))  # 6
print(add_elements("Hello"))   # TypeError
```

この関数は、引数がリストである場合のみ処理を続行し、そうでない場合は `TypeError` を発生させます。

### 2. 複数の型を同時にチェック

`isinstance()` は、複数の型をタプルとして渡すことで、一度に複数の型のチェックができます。

```python
item = (1, 2, 3)
print(isinstance(item, (list, tuple)))  # True
```

このコードでは、`item` が `list` または `tuple` のどちらかであれば `True` になります。

## `isinstance(item, list)` の注意点

### 1. サブクラスの影響

Python では `list` を継承したクラスも `isinstance(item, list)` に `True` を返します。

```python
class MyList(list):
    pass

my_list = MyList([1, 2, 3])
print(isinstance(my_list, list))  # True
```

このように、`MyList` は `list` を継承しているため、`isinstance(my_list, list)` は `True` になります。

### 2. `type()` との違い

`type(item) == list` を使うと、サブクラスは `False` になります。

```python
print(type(my_list) == list)  # False
```

したがって、サブクラスも許容する場合は `isinstance()` を、厳密に `list` のみをチェックする場合は `type()` を使うとよいでしょう。

## まとめ

| 項目                        | 説明                                                |
| ------------------------- | ------------------------------------------------- |
| `isinstance(item, list)`  | `item` が `list` のインスタンスかを判定する                     |
| 型チェックの利点                  | エラー防止、複数の型のチェックが可能                                |
| `type(item) == list` との違い | `isinstance()` はサブクラスも許容するが、`type()` は厳密な型チェックを行う |

`isinstance(item, list)` は、プログラムの安全性を向上させるために便利な関数です。型の違いによるエラーを防ぐために、適切に活用しましょう！
個人的な備忘録：Windows初学者向けに、ローカルとドメインの違いを簡単な表でまとめてみた

## はじめに

Windowsには **ローカル環境** と **ドメイン環境** という2つのユーザー管理の仕組みがあります。

:::note info
**それぞれの違いを理解することで、適切な環境を選択し、より効果的にPCやネットワークを運用することができます。**
:::

Windowsを使う上で「**ローカルとドメインの違いがよく分からない…**」という方にとって、参考になれば幸いです。

## 書こうと思ったきっかけ
最初にWindowsを学び始めたとき、ローカルとドメインの違いがいまいちピンとこなかった という経験がありました。

:::note warn
***個人PCではローカルアカウントを使っているのに、会社ではドメイン環境になっていて、何が違うのか分からず混乱することが多かったです。***
:::

しかし、実際に業務でPCを管理する立場になったとき、「**ローカル環境はスタンドアロンで管理が大変**」「**ドメイン環境はネットワーク全体で統合管理できる**」という違いが明確になりました。

このような経験から、同じように悩む方のために 「***ローカルとドメインの違いを分かりやすく整理した資料があれば役に立つのでは？***」 と思い、今回記事としてまとめました。

この比較表が、Windowsのユーザー管理を理解する手助けになれば嬉しいです！

## 簡単なまとめ

- **ローカル環境** は 個人利用や小規模な環境 に適している。
- **ドメイン環境** は 企業や組織のPCを統合管理 するのに最適。

## **Windowsのローカルとドメインの概念の比較表**

ここでは、ローカルとドメインの違いを表形式で簡単にまとめました。***個人的な備忘録ですが、参考になれば嬉しいです！***

| 項目 | ローカル (Local) | ドメイン (Domain) |
|------|----------------|----------------|
| **概要** | 1台のPC内で完結する環境 | ネットワーク上の複数のPCを一元管理する環境 |
| **ユーザー管理** | PCごとに個別にユーザーを作成・管理 | Active Directory (AD) で一元管理 |
| **認証** | PCごとに独立したアカウントでログイン | ADサーバーで認証し、どのPCでも同じアカウントでログイン可能 |
| **管理者** | 各PCのローカル管理者 (Administrator) | ドメイン管理者 (Domain Admin) が全PCを管理 |
| **パスワード管理** | 各PCごとにパスワード設定 | ドメイン内で一括管理され、ポリシー適用も可能 |
| **アクセス制御** | PC単位でフォルダやリソースの権限を設定 | ドメイン単位でグループポリシー (GPO) により制御 |
| **ネットワーク範囲** | スタンドアロン（単独）で動作 | ネットワーク上のすべてのPCを統合管理 |
| **メリット** | 簡単にセットアップ可能 | ユーザー管理・セキュリティポリシーの一元化 |
| **デメリット** | PCごとにユーザー管理が必要、セキュリティリスクが高い | 設定が複雑、ADサーバーが必要 |

## まとめ
ここまで読んでいただき、ありがとうございました！

今回は Windowsのローカルとドメインの違い について中心にまとめましたが、自分にとっても良い振り返りになりました。

:::note warn
**私自身、最初はこの違いをなかなか覚えられませんでしたが、実務を通じて少しずつ理解が深まり、今では言語化できるまでになりました。**
:::

***今回の内容が、誰かの技術の支えになれば幸いです！***
ChatGPTの新しいMap機能を見逃していた！

## はじめに

こんにちは、株式会社ナイトレイの開発部のアレックスです！

この前ChatGPTで日本の観光地について調べていたら、偶然interactiveの地図がチャット内に出てきました。

2024年12月17日にChatGPTの検索機能がアップデートされたと同時に、地図で検索結果が現れる機能も追加されたようなので、1ヶ月以上前から利用可能になっているようです。その使い方、メリット、デメリットについてまとめてみます！

## Map機能を使うには

プロンプトによってMapが表示されたりされなかったりしますが、基本的にはChatGPT Search機能と連携されているため、ウェブ検索が実行されるプロンプトじゃないとMapが出てこないようです（現在2024年1月30日）。

## 実際に使ってみた

![1000033912.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778915/2cb0c81b-1ea4-4298-c55c-698d32b8657e.jpeg)

![1000033913.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778915/a2b8d3a1-1eea-7a71-5918-035f9f45c285.jpeg)

![1000033914.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778915/a03775a0-8c17-6767-96a4-55a94af7b07a.jpeg)

実際使ってみたところで、確かにプロンプトを踏まえてMapに検索結果を表示してもらえました。しかも、「近くにある」というだけで東京だということを理解してくれました。それが本当に位置情報に基づいて回答してくれているか、自分の今までのChatGPTとの会話のメモリーに基づいて回答してくれているかが分かりませんでした！

しかし、検索結果自体が少なくて、しかも３つの内営業中じゃないようです。

パソコンで使ってみたところ、５つの検索結果まで表示できるようになったものの、携帯より情報が少なく、値段を意味するドル記号も合っているかどうかは曖昧でした。それにウェブサイトへのリンクで、ちゃんとウェブサイトに飛ばしてくれるリンクは５つのうち１しかありませんでした！

![Screenshot 2025-01-30 at 14.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778915/11079e39-05e7-6720-440d-a4da13d8b6ed.png)

## 感想

結局イタリアンレストランを探すのに少しもの足りませんでした。ただ、私が使ってみたイタリアンレストラン以外にも、観光地など、もっと幅広く利用することも可能のようです。ただ、私は再現できませんでした。洋服屋さんぐらいは出力してもらえました！

![Screenshot 2025-01-30 at 15.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778915/2ea52b55-7ed1-7d3a-c833-56a9888d36f3.png)

GoogleのMap検索機能に近づけようとしているように見えたんですが、機能がまだまだ発達しないと少し使う場が想像できません！

まだあんまり広く話されている機能ではないと思いますので、これからは改善されるかもしれないと思われます。

## 参照

[**ChatGPT Search creeps closer to Google – OpenAI’s Ship-mas brings maps for Local Search, improved results for navigational queries, and live mode with Search**](https://www.gsqi.com/marketing-blog/chatgpt-search-new-features-december-2024/)

[**ChatGPT Search with new features including maps, navigational queries, and live mode with Search　(Youtube)**](https://www.youtube.com/watch?v=Sa6jeupa5vY)
ubuntuに特定のRバージョン4.4.1をインストールしたい

* 特定のRバージョンのインストール方法を以下に記載してます

# 1. すでに入っているRが入っている場合のそのバージョンを確認
```
dpkg -l | grep r-base
```
そしたら入っている場合は以下のような結果が返ってきます
```
dpkg -l | grep r-recomm
ii  libgcr-base-3-1:amd64                         3.41.2-1build3                           amd64        Library for Crypto related tasks
ii  r-base                                        4.4.1-3.2404.0                           all          GNU R statistical computation and graphics system
ii  r-base-core                                   4.4.2-1.2404.0                           amd64        GNU R core of statistical computation and graphics system
ii  r-base-html                                   4.4.2-1.2404.0                           all          GNU R html docs for statistical computing system functions
ii  r-recommended                                 4.4.1-3.2404.0                           all          GNU R collection of recommended packages [metapackage]

```
今回はこの4.4.2を4.4.1にダウングレードしていきいます。

# 2. 不要なバージョンの削除
* 今回は4.4.2は不必要であり4.4.1にダウングレードしていくので、不要な4.4.2のRとそのパッケージは削除します
* r-base-coreをアンインストールしたら自動的にr-base-htmlも削除されました
* ちなみにこのステップはスキップしても新たなバージョンをインストールする際にもとのバージョンは上書きされるため、自動的に削除されます
```
sudo apt remove r-base-core
```
* 他にも削除したいバージョンのものは```sudo apt remove ***```で削除できます

# 3. aptのインストール可能なバージョンをリストアップ
```
apt policy r-base-core
```
そうするとこのような結果が返ってきます
```
r-base-core:
  Installed: (none)
  Candidate: 4.4.2-1.2404.0
  Version table:
     4.4.2-1.2404.0 500
        500 https://cloud.r-project.org/bin/linux/ubuntu noble-cran40/ Packages
        100 /var/lib/dpkg/status
     4.4.1-3.2404.0 500
        500 https://cloud.r-project.org/bin/linux/ubuntu noble-cran40/ Packages
     4.4.1-1.2404.0 500
        500 https://cloud.r-project.org/bin/linux/ubuntu noble-cran40/ Packages
     4.4.0-2.2404.0 500
        500 https://cloud.r-project.org/bin/linux/ubuntu noble-cran40/ Packages
     4.3.3-2build2 500
        500 http://jp.archive.ubuntu.com/ubuntu noble/universe amd64 Packages
```
# 4. 特定のバージョンのインストール
* ステップ3でリストアップしたものから自分のほしいバージョンを指定して、インストールします
```
sudo apt-get install r-base-core=4.4.1-3.2404.0 r-recommended=4.4.1-3.2404.0
```
# 5. 確認＆完了！
もう一度```dpkg -l | grep r-base```をすると無事r-base-coreとr-base-devが4.4.1になっているのを確認できました！
```
ii  libgcr-base-3-1:amd64                         3.41.2-1build3                           amd64        Library for Crypto related tasks
ii  r-base                                        4.4.1-3.2404.0                           all          GNU R statistical computation and graphics system
ii  r-base-core                                   4.4.1-3.2404.0                           amd64        GNU R core of statistical computation and graphics system
ii  r-base-dev                                    4.4.1-3.2404.0                           all          GNU R installation of auxiliary GNU R packages
ii  r-base-html                                   4.4.1-3.2404.0                           all          GNU R html docs for statistical computing system functions

```
【JavaScript】ダイアログ要素の開閉で発火するイベント「ToggleEvent」

## はじめに
`<dialog>` 要素は、ダイアログに使われたり、Modalに使われたりと便利な要素です。
しかし、今までは `<dialog>` 要素を開いたり、閉じたりすることで発火するイベントがありませんでした。

ですが、Chrome 132 以降では、「ToggleEvent」が使えるようになり、これから `<dialog>` 要素がより使いやすくなります。

そのため、この記事では、ダイアログ要素の開閉で発火するイベント「ToggleEvent」について紹介しようと思います。

## ToggleEvent
ToggleEventは、ポップオーバー要素の状態が表示と非表示の間で切り替わるときに発火するイベントです。

- **コンストラクター**
    - `toggleEvent()`
- **インスタンスプロパティ**
    - `ToggleEvent.newState`：要素が遷移した後の状態を表す（`"open"` or `"closed"`）
    - `ToggleEvent.oldState`：要素が遷移した前の状態を表す（`"open"` or `"closed"`）

https://developer.mozilla.org/ja/docs/Web/API/ToggleEvent


### 使い方

```sample.js
const dialog = document.getElementById("sample");

dialog.addEventListener("beforetoggle", (event) => {
    console.log(event.newState) // "open" or "closed"
    console.log(event.oldState) // "open" or "closed"
})
```

## まとめ
この記事では、ダイアログ要素の開閉で発火するイベント「ToggleEvent」について紹介しました。

ToggleEventを使えば、ダイアログ要素が表示されたことをトリガーとして、要素を変更したり、スタイルをアップデートしたりできるようになります。

さっと思いつく使い方は、「Modalが表示されたら、Modalの要素にフォーカスを当てる」とかでしょうか？

ToggleEventは、実験的な機能なので、全ブラウザで使えるようになったら、色々と使うタイミングが思いつくのかもしれないですね....

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
後輩のためのFigma入門（Step2）

# 後輩のためのFigmaの使い方

後輩のためにFigmaに関して書きました。

Step2は「図形を使ってみよう」です。

## セットアップ

まず、デザインファイルを作成してみましょう。

**Step1**　New design fileをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/99468820-6e5d-a374-6e90-93e3de0d4a52.png)

以下の画面になれば作成できています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/91ef7041-1c86-3927-3ce3-5066c9efbf68.png)

<br> <!-- 空行を追加 -->
**Step2**　左上のUntitledをダブルクリックすると、ファイル名を変えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/624a2834-bdfa-fdeb-7924-523813897a77.png)

<br> <!-- 空行を追加 -->

**Step3**　下のパレットの四角を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/c0d5979e-f8e0-020b-d86e-4684fb3f71d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/872efad1-078c-6319-97c6-3c57c9080a60.png)

<br> <!-- 空行を追加 -->

**Step4**　ボード上でドラッグを行うことで、四角形を出すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/fce1d8af-b051-3d2a-0d4c-b7174586a5e5.png)

<br> <!-- 空行を追加 -->

**Step5**　今出した四角をクリックして選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/b08b9f2c-aa51-71bf-01a8-0c28ea632429.png)

<br> <!-- 空行を追加 -->

**Step6**　右側で、縦横の長さや、色を調節することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/7c8b107e-fba3-357e-4ab7-d4a0b2bffdac.png)

<br> <!-- 空行を追加 -->

**Step7**　また、下のボタンを押すことで、他の形の図形でも、同じようなことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/e6a9bb05-d8d9-8c8d-9f33-ddf13dc2c1f7.png)

## 続き
今回は、軽く図形の扱い方を解説しました。
それぞれの図形専用の機能も多くあり、解説したいのですが、それはStep4くらいで解説しようと思います。

https://qiita.com/ko-tarou/items/9cf545ed708fe0aea911
【テスト技法】ドメイン分析テスト

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在はRailsを勉強しているのですが、並行してソフトウェアテスト技法も学ぶことで、Railsチュートリアルの理解が深まるのではないかと考え、テスト技法の勉強を始めました。
今回学んだドメイン分析テストについて、記憶が薄れないうちに簡単にまとめておきたいと思います。
ちなみに、テスト技法はUdemyで勉強しています。とても分かりやすいので、テスト技法を勉強したいと思う方はぜひ見てみてください。

https://www.udemy.com/share/102NaE3@Klm5Y802jzOOWemmUmgcZKwsmg5ZeKSLdssOdLltCQUeMwrYsLoBehQBwhoefOb3yw==/

## ドメイン分析テスト
ドメイン分析テストとは、複数の条件式が存在する場合に、条件漏れを防ぐためのテスト手法です。
この手法では、以下の3つのポイントを利用してテストケースを算出します。

* on：境界上の値
* off：境界のすぐ隣の値
* in：範囲内の任意の値
* out（参考）: 範囲外の値

| ポイント名 | 概要                               | a >=20 | a>20   | 
| ---------- | ---------------------------------- | ------ | ------ | 
| on         | 境界上の点                         | 20     | 20     | 
| off        | 境界に隣接する点(境界上の点を除く) | 19     | 21     | 
| in         | on/off 以外のドメインの内側        | 25など | 25など | 
| out        | on/off 以外のドメインの外側        | 15など | 15など | 

ここで注意すべき点は、**onは条件を満たす境界上の値である必要がある**ということです。
例えば、`a > 20`の場合、on は境界値である必要があり `on =20`ですが、この値は`a >20` の範囲外になります
したがって、off の値を選ぶ際には、境界の内側に入るように`off = 21`と選択する必要があります

ドメイン分析テストでは、この on, off, in の3つ を使用してテストケースを設計します。


ドメイン分析テストではこの中のon, off, inの3つを使用することになります。
テストは境界値にバグが潜みやすいのでon, offが使われるのはわかるとしてもoutではなくinが採用されている理由が不明ですよね。これについて例題を見ながら説明します。


例えば以下の例題があるとします
```ruby
if x >= 5 && x + y > 12
  # 処理A
else
  # 処理B
end
```

この場合について、以下のようなドメインテストマトリックスという表を書く必要があります

| 変数           | 条件       | ポイント | 1   | 2   | 3   | 4   | 
| -------------- | ---------- | -------- | --- | --- | --- | --- | 
| x              | x >= 5     | on       | 5   |     |     |     | 
|                |            | off      |     | 4   |     |     | 
|                |            | in       |     |     | 6   | 6   | 
| x + y          | x + y > 12 | on       |     |     | 12  |     | 
|                |            | off      |     |     |     | 13  | 
|                |            | in       | 15  | 15  |     |     | 
| 期待される結果 |            |          | A   | B   | A   | B   | 

この表を見ると分かるように、変数 x の on/off を検証している間は、x + y の値を in に固定しています。
もし out を使用してしまうと、要件を満たさない値が含まれてしまい、正しくテストができなくなってしまいます。
そのため、on, off, in の3種類を使うことで、効率的に境界値をテストできるのです。


### ドメイン分析テストの本質
ここで気づいた方もいるかもしれませんが、ドメイン分析テストは、複数の条件がある場合に「一方の条件を in で固定し、もう一方の境界値をテストする」という手法です。
これを理解すれば、複雑に考えずにスムーズに適用できるようになります。

最終的に、ドメインテストマトリックスを書くことで、4つのテストケースだけで網羅的にテストできると分かりました。

# まとめ
本記事では ドメイン分析テスト について解説しました。
この手法は境界値テストの延長線上にあるテスト手法であり、以下のようなケースで有効です。

* 境界値テストを実施しようとしたが、条件が複数あるため、どのようにテストすればいいか分からないとき
* 複数の条件を組み合わせてテストケースを網羅したいとき

実際にテストを設計する際には、ドメインテストマトリックスを作成し、on, off, in の3種類をうまく使い分けることで、少ないテストケースで効率的にバグを見つけることができます。
kubectl logs で複数の Pod をまたいでログを確認する

## やりたいこと

[kubectl logs](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_logs/) コマンドを使うことで任意の Pod のログを確認することができる。

```console
$ kubectl get pod | grep kyoko-sakura-server
kyoko-sakura-server-659fbcf96-dk7xq                        1/1     Running             0          11m
kyoko-sakura-server-659fbcf96-jqvfv                        1/1     Running             0          20m

$ kubectl logs -f pod/kyoko-sakura-server-659fbcf96-dk7xq
# ログが表示される

$ kubectl logs -f pod/kyoko-sakura-server-659fbcf96-jqvfv 
# ログが表示される
```

複数の Pod をまたいでログを確認することはできないかな？ 🤔

## 方法

それらの Pod が同じ Deployment に属するのであれば、Deployment 単位でログを確認すればよい。

```console
$ kubectl get deployment | grep kyoko-sakura-server
kyoko-sakura-server                       2/2     2            2           7d1h

$ kubectl logs -f deployment/kyoko-sakura-server
# ログが表示される
```
jq コマンドで入力に JSON 形式でない行が含まれる場合にそれを取り除く

## 問題

以下のログファイルから JSON 形式の行を [jq](https://jqlang.github.io/jq/) コマンドで処理したい。

```sample.log
hoge
{"time":"2024-01-01T00:00:00.000000+09:00","level":"INFO","request_id":"aaa","message":"👼"}
fuga
{"time":"2024-01-01T23:59:59.999999+09:00","level":"ERROR","request_id":"bbb","message":"👿"}
{"time":"2024-01-31T00:00:00.000000+09:00","level":"ERROR","request_id":"ccc","message":"😈"}
foo
```

例えば `"level":"ERROR"` の行のみを取得したい。しかし JSON 形式ではない行のせいでパースエラーが発生してしまう 😢

```console
$ cat sample.log | jq -c 'select(.level == "ERROR")'
jq: parse error: Invalid numeric literal at line 2, column 0
```

例えば grep コマンドでJSON 形式ではない行を取り除くことでエラーを防ぐことができる。

```console
$ cat sample.log | grep '^{.*}$' | jq -c 'select(.level == "ERROR")'
{"time":"2024-01-01T23:59:59.999999+09:00","level":"ERROR","request_id":"bbb","message":"👿"}
{"time":"2024-01-31T00:00:00.000000+09:00","level":"ERROR","request_id":"ccc","message":"😈"}
```

もっといい方法、具体的には jq コマンドだけでエラーを防ぐ方法はないだろうか？ 🤔

## 解決方法

jq コマンドの `-R` オプションと `fromjson?` を利用する。

```console
$ cat sample.log | jq -cR 'fromjson? | select(.level == "ERROR")'
{"time":"2024-01-01T23:59:59.999999+09:00","level":"ERROR","request_id":"bbb","message":"👿"}
{"time":"2024-01-31T00:00:00.000000+09:00","level":"ERROR","request_id":"ccc","message":"😈"}
```

- `-R`
  - 入力を生の文字列として読み込む
  - 通常、jq は入力を JSON として解析するが、`-R` オプションを使用すると、入力をそのまま文字列として扱う
- `fromjson?`
  - 各行を JSON として解析する
  - `?` は解析に失敗した場合、エラーを無視して null を返すことを表す

## 参考



- [とほほのjq入門 - とほほのWWW入門](https://www.tohoho-web.com/ex/jq.html)
VSCodeでcompose.yamlの"Run Service"を無効にする

# compose.yamlに勝手に表示されるアイツを消したい
VSCodeを1.96.4にアップデートしたらcompose.yamlに"Run All Service"とか"Run Service"が勝手に表示されるようになってしまいました。

![スクリーンショット 2025-01-30 13.25.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/dbba33de-3987-3288-9b79-c3b5c7e0d931.png)
誤ってクリックすると勝手にコンテナが起動します。
非常に邪魔。邪魔です。

# compose.yamlの名前を変える
#### NG
+ docker-compose.yaml
+ compose.yml
ではだめでした。

#### OK
+ compose_.yaml
にすると"Run All Service"は消えました。

が！そうすると
```sh:
docker compose up
no configuration file provided: not found
```
compose.yamlを自動認識してくれない…。
-f でいちいち指定する必要があります。

# Docker拡張機能を無効にする
Microsoft謹製のDocker拡張機能を無効にすればOKです。

![スクリーンショット 2025-01-30 13.53.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/51eb54ec-84d6-cb56-2b93-9e9095558793.png)
コイツです。

あ〜スッキリ。
【忘備録】.NET Framework3.5 インストール時のエラーの解消法

# 環境
|version|環境|ネットワーク|
|-|-|-|
|WindowsServer2022|仮想サーバ|オフライン|

# 💥現象
#### Microsoftが提供する、dotnetfx35.exeを実行すると以下のエラーが発生
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898103/08738fc6-3c0f-1b6e-27e5-700ab9f0fb8f.png)

#### 「windowsの機能と有効化または無効化」からでも失敗してしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898103/cb65dada-db76-c07a-7ffb-27276f4eff70.png)

# 🔴解決方法の結論
#### 1. Windows インストール メディアを用意
#### 2. 「windowsの機能と有効化または無効化」にて、確認フェーズで、[代替ソース パスの指定]をクリック
#### 3. パスに、インストールメディア > sources > sxs　（適宜変更）を指定して実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898103/6b92b2ac-8cfc-e698-eb66-9c9b1a87d69a.png)
#### 4.インストール完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898103/19fad607-aad2-707d-afec-dea48ffcec27.png)


# 概要・所感
この環境は、仮想環境(Hyper-v)で作成しており、インストールメディアが、ホストマシンにあります。
そのため、インストールが出来なかったのかと想定されます。
面倒ですが、仮想のドライブ内にwindowsのメディアを用意して、指定をすることで解決する事ができました。
もし、同じ現象で困っている方がいらっしゃいましたら、参考に頂けますと幸いです。

# 付録
参考記事

https://learn.microsoft.com/ja-jp/troubleshoot/windows-client/application-management/dotnet-framework-35-installation-error

コマンドでも可能のようです。
【Git】git stash コミット前の変更を退避する

# はじめに
コミット前の変更を一時的に退避させるコマンド `git stash` の使い方を備忘録としてまとめます。


# 基本の使い方
### スタックに退避する
```
$ git stash
$ git stash save
```


|オプション  |意味  |
|---|---|
|なし  |変更をスタックに退避する（untracked、ignoredファイルは除く）|
|-u  |(--include-untracked) untrackedファイルも一緒に退避する  |
|-a  |(--all) untrackedファイルに加えて、ignoredファイルも一緒に退避する |
|-k  |(--keep-index) ステージ済みの変更は退避しない |
|--patch |退避したい変更を対話的に選択する |

### スタックに退避した変更を再適用する
```
$ git stash apply
$ git stash apply stash@{0}　# stash@{0}は直近に退避した変更
```
|オプション  |意味  |
|---|---|
|なし  | stash@{n}を指定しなければ、直近に退避された変更を再適用する。ステージ状態はリセットされる |
|--index |ステージ状態も含めて再適用する  |

### スタックに退避した作業を削除する
```
$ git stash drop
$ git stash drop stash@{0}
```

### スタックに退避した変更を再適用し、スタックから削除する
```
$ git stash pop
$ git stash pop stash@{0}
```

# その他の使い方

### 作業ディレクトリの削除
```
# 要注意・要オプション
$ git clean

# こちらの方が安全
$ git stash --a # 一旦すべてを退避させる
```

### スタックに退避した変更内容を見る
```
$ git stash show
$ git stash show stash@{0}
```
|オプション  |意味  |
|---|---|
|なし  |直近に退避した変更内容を見る |
|-p  |変更内容を詳しく見る  |

### メッセ―ジを追加して退避する
```
$ git stash save "メッセージ"
```
### スタックの一覧を見る
```
$ git stash list
```

### スタックを空にする
```
$ git stash clear
```

### スタックに退避した変更内容からブランチを作成する
- 新しいブランチを作成する
- 作業をスタックに退避したときのコミットをチェックアウトする
- スタックにある作業を再適用する
- 成功すればスタックからその作業を削除する
```
$ git stash branch "[作成するブランチ名]"
```

# `git stash` の実行前後に使うコマンド
### 作業ディレクトリの状態を確認する
```
$ git status
```
|オプション  |意味  |
|---|---|
|なし  |デフォルトでallが対象。作業ディレクトリのファイルとステージングの状態を表示する  |
|-s  |(--short) ショートフォーマットで表示する  |


# おわりに
退避する際は`git stash -u` `git stash -a`とオプション付きで覚えた方が安心して使えそうです


# 参考

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E4%BD%9C%E6%A5%AD%E3%81%AE%E9%9A%A0%E3%81%97%E3%81%8B%E3%81%9F%E3%81%A8%E6%B6%88%E3%81%97%E3%81%8B%E3%81%9F
名刺交換マニュアル

## **1. 名刺を渡す順番**
### **基本ルール**
- **目下から目上へ** 渡すのが基本。
- **訪問者から訪問先へ** 渡すのがマナー。
- ビジネスでは **お金を支払う側が目上**、支払われる側が目下となる。
  - 営業・業務請負側はクライアントに **先に渡す**。

### **複数人での名刺交換**
- **上司より先に渡さない！**
- 互いの **上司同士** が先に交換し、その後部下同士で交換する。
- 交換の順番が **相手への序列を示す** ことになる。

---

## **2. 名刺交換時の基本マナー**
✅ 必ず **立って** 行う。  
❌ **座ったまま交換するのはNG！**  

✅ **名刺入れ** に保管し、**ポケットに直入れしない**。  
❌ **汚れた名刺・折れ曲がった名刺を渡すのはNG！**  

✅ 名刺は **事前に多めに用意** する。  
✅ 名刺入れは **すぐに取り出せる場所に保管** しておく。  

---

## **3. 名刺交換の仕方【基本編】**
### **名刺を渡す手順**
1. **挨拶前に名刺入れを準備** しておく。
2. 相手に近づき **名刺を両手で持つ**（相手から見て正面向き）。
3. 相手の目を見て  
   - **「●●社の△△と申します。よろしくお願いいたします。」**
4. **軽くお辞儀をしながら差し出す**。

### **名刺を受け取る手順**
1. **「頂戴いたします」** と言いながら **両手で受け取る**。
2. 胸の高さよりも上で持ち **名刺の内容を確認**。
3. **「○○様（さん）ですね」と復唱** するのが丁寧。
4. **難しい名前や珍しい苗字の場合は、その場で確認** し、会話のきっかけにする。

### **同時に交換する場合**
- **自分の名刺は右手で渡し**、相手の名刺は **左手に持った名刺入れの上で受け取る**。
- **相手よりも低い位置で渡す** ようにする。
- **受け取る前に渡してはいけない**（相手が差し出すのを待つ）。

---

## **4. 名刺交換の仕方【応用編】**
### **目上の人が先に差し出した場合**
✅ 先に受け取るのは失礼にあたるため、**「申し遅れました」** などと一言添え、 **相手よりも低い位置で名刺を差し出す**。  
✅ ただし、**すぐに受け取らない方が失礼になる場合もある** ため、臨機応変に対応。  
✅ **先にもらう場合は「ありがとうございます」と言って受け取り、すぐに名刺を渡す**。  

### **相手の準備が整う前に渡すのはNG！**
- **相手を焦らせる原因** になるため、**落ち着いて準備ができるのを待つ**。
- **相手への配慮が好印象につながる**。

---

## **5. 受け取った名刺の扱い方**
### **名刺の置き方**
✅ すぐにしまわず **テーブルの左上に名刺入れの上に置く**。  
✅ **複数枚ある場合**  
   - 役職の高い人の名刺を **名刺入れの上** に置く。  
   - 役職順に **一列に並べる**。  
   - **名刺入れの上に重ねて置かない！**  
✅ **役職順が不明な場合** は、**交換した順番に並べる**。  
✅ **人数が多い場合** は、**席順に並べる** と名前を覚えやすい。  

### **名刺をしまうタイミング**
❌ **打ち合わせ中にしまうのはマナー違反！**  
✅ **資料が多い場合や不都合が生じる場合のみ、一言断ってしまう**。  
✅ **打ち合わせ終了後、相手がしまうのを待ってからしまう**。  

---

## **6. まとめ：名刺は社会人の顔！**
- 名刺交換は **ビジネスにおける重要な自己紹介の場**。
- **マナーを守ること** はもちろん、交換後も **丁寧に扱う** ことが大切。
- **相手への敬意を示し、好印象を与えられるよう心がける**。
さくらのレンタルサーバーで日本語ファイル名の画像が読み込めない！


以前Next.jsでexport(SSG)して、MicroCMSをつかって画像最適化もする必要があったときに、画像のファイル名が日本語だとURLエンコードされてNext.jsで画像を表示できない問題がありました。
その時は下記の記事に書いてある方法で解決はしたのですが、サーバーによって違いがあるようでさくらのレンタルサーバーだと404エラーになってしまいました。
https://zenn.dev/yuto0623/articles/66408a970a8754

## さくらのレンタルサーバーでは日本語ファイル名のファイルは参照できない？
どうやらローカルからサーバーにアップするときの文字コードに問題があるようでした。
私はFileZillaを使ってアップロードしていたのですが、設定を変えることによって解決できました。

## FileZillaで日本語ファイル名のファイルをアップする方法
FileZillaのサイトマネージャーで文字コードの設定があるので、そこでUTF-8を強制を選択すれば無事に404エラーにならずアップすることができました。

## 終わり
サーバーによって問題がない場合もあり中々気付かなかったのですが、誰かの参考になれば幸いです。