OmniAICreator/Qiita-1.07M huggingface dataset:
Android(pixel 6a)ターミナル環境へNode.js npmをインストール

# はじめに
自分の備忘録のために調べたことと参照先をまとめていきたい。

Android端末(現時点ではpixel限定)でterminalが使えるようになった。
ちょうどTypeScriptを勉強したかったのでまずは基本的なnode.jsとnpm環境を構築し、それぞれのソフトウェアの概要を確認する。

# 目次
- [環境](#環境)
- [結論](#結論)
- [node.js](#nodejs)
  - [概要](#nodejs-概要)
  - [バージョン](#nodejs-バージョン)
  - [ライセンス](#nodejs-ライセンス)
- [npm](#npm)
  - [概要](#npm-概要)
  - [バージョン](#npm-バージョン)
  - [ライセンス](#npm-ライセンス)
- [バージョン管理ツール(nvm)](#バージョン管理ツールnvm)

# 環境
- 端末：pixel6a(Androidスマートフォン)
- アプリ：ターミナル
- Linux仮想環境：debian
  (Android Virtualization Framework)
- debianバージョン：Linux localhost 6.1.0-29-avf-arm64 #1 SMP Ubuntu 6.1.123-1 (2025-01-02) aarch64 GNU/Linux
参照：https://news.yahoo.co.jp/articles/d3473c2e2a2cd2d4e084b2e4b65d2d9953d0277f

# 結論
参照：https://nodejs.org/ja/download
nodeバージョン：v22.14.0
npmバージョン：11.2.0
```bash:command
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
nvm install 22
node -v     # "v22.14.0"が表示される。
nvm current # "v22.14.0"が表示される。
npm -v      # "10.9.2"が表示される。
npm install npm@latest -g # 最新バージョン更新
npm -v      # "11.2.0"が表示される。
```

はじめはaptでインストールしたがバージョンが古そう。
公式サイトを確認し、nvm経由で入れ直し。これでバージョンの変更も簡単に出来そう。

# node.js
### node.js 概要
参照：公式サイト https://nodejs.jp/docs
- GoogleChromeのエンジンV8をブラウザ外で動かせるようにしたランタイム
- 単一プロセスでノンブロッキング動作
- I/Oは別スレッドによるブロッキング動作

イベント駆動によるWeb系特化っぽい。
当然であるがスレッド使用や速度を求める処理用ではなさそう。

### node.js バージョン
参照：公式サイト https://nodejs.org/ja/about/previous-releases
- サポート期間
カレントバージョン：6ヶ月
LTSバージョン：30ヶ月
- バージョン規定
メジャーバージョン偶数版：LTS
メジャーバージョン奇数版：カレント時のみサポート

### node.js ライセンス
MITライセンスのため自社製品に商用利用しても公開とかしなくてよさそう。
- OpenStandia https://openstandia.jp/oss_info/nodejs/
- Wikipedia https://ja.m.wikipedia.org/wiki/Node.js

ただgitを見ると一部Unicode license v3なども記載あり。内部構造がまだ分からないため、一旦上記を信じる。
- gitライセンスページ https://github.com/nodejs/node/blob/main/LICENSE

# npm
### npm 概要
参照：https://docs.npmjs.com/
Web系のパッケージ管理マネージャ
厳密にはnpmはレジストリのことで、我々か使用するコマンドについてはnpm CLIっぽい。
プロジェクト毎にモジュールを管理できるよう。

### npm バージョン
参照：https://docs.npmjs.com/about-npm-versions
上記にnode.jsよりも更新頻度が高いため、定期的な更新がおすすめされている。安定版への更新コマンドは以下。
```bash
npm install npm@latest -g
```

### npm ライセンス
参照：https://github.com/npm/cli/blob/latest/LICENSE
Artistic License 2.0
改変したものを再配布することが禁止されている模様。
商用利用と通常版の再配布は問題ないので業務や製品環境に入れて普通に使う分には大丈夫かと考える。

# バージョン管理ツール(nvm)
node.jsの公式ダウンロード手順ページにて推奨欄の1番上に出ているのがnvmであるためそちらで実施。
nやvoltaなど色んなものもある。

主要な使い方は下記。
```bash:使用バージョンの変更
nvm use [バージョン]
nvm use 22 #例
node -v #バージョンの確認
```
```bash:使用中のバージョン表示
nvm current
```
```bash:特定バージョンのインストール
nvm install [バージョン]
nvm install 22 #例
```
```bash:特定バージョンのアンインストール
nvm uninstall [バージョン]
nvm uninstall 23 #例
```

こちらもMITライセンス。
ライセンスや使い方の記載は以下。
参照：https://github.com/nvm-sh/nvm
「令和7年度 いちばんやさしい 基本情報技術者 絶対合格の教科書＋出る順問題集」で最短合格を目指す！

## **📚 基本情報技術者試験、どう勉強する？**  

基本情報技術者試験（FE）に挑戦する人の多くが、こんな悩みを抱えています：  

- **「範囲が広すぎて、どこから手をつければいいのかわからない…」**  
- **「過去問を解いても、解説が難しくて理解できない…」**  
- **「午前問題は覚えゲー、午後問題は地獄…」**  

そこでオススメなのが、📖 **「令和7年度 いちばんやさしい 基本情報技術者 絶対合格の教科書＋出る順問題集」** です！  ベストセラー！！！！！！

---

## **✅ 本書の特徴**  

✅ **試験範囲をしっかりカバーしつつ、やさしく解説！**  
✅ **重要ポイントを「出る順」に整理！**  
✅ **午後試験対策もバッチリ！**  

---

## **📖 どんな感じの内容？**  

本書は **「教科書」＋「問題集」** になっていて、学習しやすい構成です！  

### **📝 午前試験対策**  
✔ **過去問分析で、頻出ポイントを効率よく学習！**  
✔ **図解が豊富で、理解しやすい！**  

### **📖 午後試験対策**  
✔ **プログラミング問題の解き方を、具体的に解説！**  
✔ **アルゴリズム、データベース、ネットワークなどを丁寧に説明！**  

**午後試験でつまずきやすい「擬似言語」も、やさしく解説されていて安心！**  

---

## **🎯 こんな人にオススメ！**  

- **基本情報を最短で合格したい！**  
- **難しい参考書ではなく、わかりやすい本が欲しい！**  
- **独学でもしっかり試験対策をしたい！**  

この本なら、**挫折せずに最後まで学習できる！**  
令和7年度の最新情報にも対応しているので、**最新の試験対策ができるのもポイント！**  

---

## **📢 まとめ：最短合格を目指すならコレ！**  

基本情報技術者試験は、**効率的に勉強すれば、確実に合格できる試験** です。  
✅ **この本なら、「何を勉強すればいいの？」が一発でわかる！**  
✅ **実践的な問題演習で、合格に必要な力が身につく！**  

**「絶対に合格したい！」** と思っているなら、  
📖 **この1冊を手にとって、今すぐ勉強を始めよう！**  

📖 **Amazonリンク（単行本ソフトカバー） → [令和7年度 いちばんやさしい 基本情報技術者 絶対合格の教科書＋出る順問題集](https://amzn.to/4h9oS2Y)**  
📖 **Amazonリンク（Kindle版） → [令和7年度 いちばんやさしい 基本情報技術者 絶対合格の教科書＋出る順問題集](https://amzn.to/4h7XMcs)**  

#基本情報技術者 #FE試験 #令和7年度 #資格勉強 #ITエンジニア #絶対合格
稼働時間の管理にスプレッドシートを利用する

```Javascript:main.gs
// シートにおいて、チェックを入れたらその時点での時刻をセットする関数
function setTime(){
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = ss.getActiveSheet();
    const activeCell = sheet.getActiveCell();
    const activeValue = activeCell.getValue();

    // チェックを入れる日付とA列の日付がマッチしていないとエラーを返す
    let today = new Date();
    today = Utilities.formatDate(today, "JST", "yyyy/MM/dd");
    const activeRow = activeCell.getRow();
    const dateInfo = sheet.getRange(activeRow, 1).getDisplayValue();
    console.log(dateInfo);
    if(activeValue === true && today === dateInfo){
        let now = new Date();
        now = Utilities.formatDate(now, "JST", "HH:mm");
        activeCell.offset(0,1).setValue(now);
        return
    } else if(activeValue ===true && today !== dateInfo){
        console.log(activeCell);
        Browser.msgBox("日付情報が合致しません");
        return
    } else {
        console.error(Error);
        return
    }
}
```

これを用意しておいて、スプレッドシートの『変更時』にしてトリガー設定しておけば
A列に日付入れて、B列には稼働したタスク・プロジェクト入れて
C列以降にチェックボックス用意しておけば稼働時間の簡単な管理ができるようになりました。
休憩の開始・終了にもチェックボックスを作成しているので、中断したとしてもその時間を除外した形で稼働時間の管理ができて便利です。

![貼り付けた画像_2025_03_15_23_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524273/ab1f5e54-40b1-4eaa-811a-bdee85c52e5c.png)
「良いコード／悪いコードで学ぶ設計入門」を読んで、設計の視点が変わった話

## **💡 「動くコード」じゃなく、「成長するコード」を書こう！**  

「とりあえず動けばOK！」で書いたコードが、数ヶ月後に自分を苦しめた経験、ありませんか？  
- **「この関数、どこで使われてるんだ…？」**  
- **「仕様変更のたびに影響範囲が読めない…」**  
- **「チームで開発すると、コードの書き方がバラバラ…」**  

そんな悩みを解決してくれるのが、📖 **「改訂新版 良いコード／悪いコードで学ぶ設計入門」** です！  

---

## **👀 本書のポイント**  

✅ **「悪いコード vs 良いコード」で具体的に学べる**  
✅ **リファクタリングの実践的なテクニックが満載**  
✅ **現場の実例を元にした解説で、すぐに使える**  

例えば…  

❌ **悪いコード**  
```python
def calc_price(quantity, item_type):
    if item_type == "A":
        return quantity * 100
    elif item_type == "B":
        return quantity * 200
    elif item_type == "C":
        return quantity * 300
    else:
        return 0
```
→ **条件分岐が増えるたびにメンテが大変！** 😱  

✅ **良いコード**  
```python
class Item:
    def __init__(self, price):
        self.price = price

    def calc_price(self, quantity):
        return self.price * quantity

items = {"A": Item(100), "B": Item(200), "C": Item(300)}
def calc_price(quantity, item_type):
    return items.get(item_type, Item(0)).calc_price(quantity)
```
→ **オブジェクト指向を活かして、拡張しやすく！** 🎉  

こんな感じで **「ダメなコード → 改善方法」** を具体的に学べるので、実務ですぐに活かせます！  

---

## **🛠 こんな人にオススメ！**  

- **コードのメンテがつらいと感じているエンジニア**  
- **設計についてしっかり学びたい中級者エンジニア**  
- **リファクタリングのコツを知りたい人**  

**「設計を学ぶ」とは、「未来の自分を助けること」** です。  
**より良いコードを書きたいなら、この本を読んでおくべき！** 🚀  

📖 **Amazonリンク（単行本ソフトカバー）→ [改訂新版 良いコード／悪いコードで学ぶ設計入門](https://amzn.to/3FHC7uu)**  

📖 **Amazonリンク（Kindle版） → [改訂新版 良いコード／悪いコードで学ぶ設計入門](https://amzn.to/4iaWAX6)**  

#良いコード悪いコード #設計入門 #リファクタリング #エンジニア #コードの品質
システム開発の基本用語（インフラ、コード、ビルド、デプロイ、デフォルト、スケール、スケーリング）について

## はじめに
　システム開発の基本用語（インフラ、コード、ビルド、デプロイ、デフォルト、スケール、スケーリング）について、まとめてみました。

## インフラ
　インフラストラクチャ(Infrastructure)の略で、情報システムの動作する基盤となるサーバーやストレージなどの機器、ネットワークケーブルといったハードウェアとOS、ミドルウェアといった一部のソフトウェアを指す。
　AWSにおいてはサービスとして提供されないAWS側の管理する部分を指すが、システム開発においては実処理を行うアプリケーションの対義語として使われ、EC2やRDSなどのAWSサービスも含められることがある。

## コード
　正式には「ソースコード」と呼ばれる、プログラミング言語で書かれたプログラムの設計図。HTML文書やCloudFormationなどで使われるJSONファイルも、同様の意味でコードと呼ばれることがある。

## ビルド
　ソースコードをコンピューターが実行できる形式に変換することを指す。プログラミング言語によってはビルドを必要とせず、ソースコードをコンピューターがそのまま実行できるものもある。

## デプロイ
　アプリケーションを対象のコンピューターに配置し、実行できるように準備すること。

## デフォルト
　「初期設定」を意味する。「デフォルトで〇〇の動作をする」という文章は、「何も設定をしなければ〇〇の動作をする」と読み換えることができる。

## スケール、スケーリング
　コンピューターリソースの量を変更することを指す。単体のコンピューターのリソースを増減させることをスケールアップ、スケールダウンと呼び、複数台で動作しているシステムのコンピューターの台数を増減させることをスケールアウト、スケールインと呼ぶ。


## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
・図解 Amazon Web Servicesの仕組みとサービスがたった1日でよくわかる 単行本（ソフトカバー） – 2022/2/2
NRIネットコム株式会社 (著), 上野 史瑛 (著), 小林 恭平 (著), 尾澤 公亮 (著), 高梨 友之 (著)
p.48
A5:SQL Mk-2で「接続に失敗しました モジュール 'A5M2.exe' のアドレス ~」エラーが発生した場合の解決方法

## はじめに
今回は、 **A5:SQL Mk-2** というデータベース管理ツールを使ってPostgreSQLに接続しようとした際に発生した接続エラーについて、解決方法を紹介します。

以前、PostgreSQLを利用するためにA5:SQL Mk-2を使用して接続を試みたところ、「 **接続に失敗しました。モジュール 'A5M2.exe' のアドレス 00000000004126C4でアドレス 0000000000000018 に対する読み取り違反がおきました。** 」というエラーメッセージが表示されました。調査の結果、この問題はソフトウェアの不具合によるもので、再インストールによって解決できたため、その手順を記録しておきます。

## 発生したエラー
PostgreSQLに接続しようとした際に、以下のエラーメッセージが表示されました。

```text
 接続に失敗しました。モジュール 'A5M2.exe' のアドレス 00000000004126C4でアドレス 0000000000000018 に対する読み取り違反がおきました。 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561875/9a775ffb-e2b7-4a14-844b-313b4f647eb9.png)

このエラーは、A5:SQL Mk-2の実行中にアクセス違反が発生したことを示しています。今回はこの問題を解決するために再インストールを試みました。

## 解決方法

### 手順1: A5:SQL Mk-2をアンインストール

まず、A5:SQL Mk-2をアンインストールします。A5:SQL Mk-2が入っているフォルダを削除します

### 手順2: 新しいバージョンをインストール

次に、A5:SQL Mk-2の最新バージョンを以下の公式サイトからダウンロードしてインストールします。インストール後、A5:SQL Mk-2を起動します。

[公式サイト](https://a5m2.mmatsubara.com/)

### 手順3: 接続情報の確認

再インストール後、以前の接続情報はそのまま残っているため、新たに設定をし直す必要はありません。接続情報が正しいか確認した後、再度データベースへの接続を試みてください。

## まとめ

今回のエラーは、ソフトウェアの不具合が原因であり、再インストールによって問題が解決しました。今回の手順を参考にして、同様のエラーに遭遇した際に対応できるようにしておきましょう。

## 参考文献
[RDS postgreSQLへ接続時の読み取り違反 &#8211; A5:SQL Mk-2](https://a5m2.mmatsubara.com/wp/?topic=rds-postgresql%E3%81%B8%E6%8E%A5%E7%B6%9A%E6%99%82%E3%81%AE%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E9%81%95%E5%8F%8D)
カスタムGuardを用いたAWS Configカスタムポリシールールの作り方　（条件分岐/変数）

# はじめに
閲覧ありがとうございます、NTTデータ先端技術の@S-takahashi1129です。
今回はカスタムGuardの書き方について、個人的にポイントだと思ったところを中心に記載していきます。カスタムGuardルールの作り方については前回記事をご参照ください。
[カスタムGuardを用いたAWS Configカスタムポリシールールの作り方　（基本編）](https://qiita.com/S-takahashi1129/items/ca12dfc5814854a356ce)

# 前提
ConfigのカスタムGuardの解説にあたり、今回はVPCのタグをチェックするルールの作成を行います。

事前に以下のようなタグを設定したVPCを用意しています。
![VPCのタグ設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/be5b8a36-04d3-4683-80ac-d3749ad06603.png)


# Guardの処理について
Guardに関する抑えておいたほうが良い事項としてGuardの処理は暗黙的にすべてANDで処理されるということがあります。

例えば以下のようにルールを設定します
```
tags.Name =="test-vpc"
tags.rtb =="exists"
tags.Name =="error"
```
検査の対象となるVPCのタグが以下の通りです
![実機のタグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/25bae905-81d9-4846-9e17-4db42985b14c.png)

実機の設定を踏まえると、ルールの各行の処理は次のような結果になります。

```
tags.Name =="test-vpc"  ⇒ true
tags.rtb =="exists"     ⇒ true
tags.Name =="error"     ⇒ false
```
これらがすべてANDで処理されるため、結果的にルールは**非準拠**となります。

なお、OR句を明示的に使うことでORで処理を行うことができます。
```
tags.Name =="test-vpc"
tags.rtb =="exists"
OR
tags.Name =="error"
```
上記のようにした場合ルールは**準拠**となります



# 『rule』ブロックの使い方
### ルールブロックの書き方
**rule <任意のルール名>**　とするとブロックに区切って特定のリソース構成をチェックすることができます。

```
rule tag_Name_value{
  tags.Name =="test-vpc"
}
```
上記の例だと、**tag_key_value** というルールブロック内で、**Name**というキーを持つタグの値が**test-vpc**だった場合に準拠と判断する処理が行われます。

### when句による実行条件の指定
**when**句を使うことにより、特定の条件の場合のみにruleブロック内の処理を行いことができます。

```
rule tag_Name_value when awsRegion == "ap-northeast-3" {
  tags.Name =="test-vpc"
}
```
**when awsRegion == "ap-northeast-3"**　により、大阪リージョンのリソースだった場合に、ルールブロック内の処理が行われるようにできます。

### ルールブロックの活用
また、when句ではほかのルールブロックを使うことも可能です。
複雑な条件指定をルールブロックとして定義しておき、when句で指定すればコードがすっきりします。

例えば、
・Nameキーが**test-vpc**のタグを持っている
・東京リージョンにあるVPCである
という条件の上で、rtbキーが**exists**であるかどうかをチェックするルールを作成したい場合、when句で指定すると以下のようになります。

```
rule tag_rtb_value when 
tags.Name=="test-vpc"
awsRegion =="ap-northeast-1"{
  tags.rtb=="exist" 
}
```
when句の部分を以下のようにルールブロックで定義することで、コードが見やすくなります。
```
rule tag_Name_value {
  awsRegion == "ap-northeast-1"
  tags.Name =="test-vpc"
}

rule tag_rtb_value when tag_Name_value {
  tags.rtb=="exists"
}
```
**rule tag_Name_value**が準拠だった場合に、**rule tag_rtb_value**の処理が行われます。


# 変数の宣言と呼び出し
**let**句を使うことで変数の宣言を行い、**%変数名** で呼び出すことができます。

```
let tokyo = "ap-northeast-1"

rule tag_Name_value when awsRegion == %tokyo{
  tags.Name =="test-vpc"
}
```

ルールブロック内で宣言された変数に関しては、宣言されたルールブロック内でのみ有効です。


# 正規表現の使用
リソース名の指定などでワイルドカードを使いたい場合など、正規表現を利用することで柔軟に対応できます。
正規表現を使いたい部分を以下のようにスラッシュで囲むことで、使用可能です。

```
rule tag_Name_value {
  tags.Name ==/^test.*/
}
```
上記のような記載だと、**testから始まる任意のリソース名**の指定となります。



# おわりに
ルールブロックやwhen句を使うことで可読性はもちろん、コードの作成自体もしやすくなります。ご参考になれば幸いです。

以上、閲覧ありがとうございました。
XSS（クロスサイトスクリプティング）と予防

# はじめに

メモ程度ではあるが、XSSについてアウトプットし理解を深める。

# XSSとは

`クロスサイトスクリプティング`のこと。
動的なWebサイトの脆弱性を悪用した攻撃。

例えば悪意あるユーザが攻撃用のスクリプトをサイトの入力に含め、Webサイトがそれを表示、実行することにより利用者が意図しないコードを実行できてしまう。

# 予防策

- サニタイジング
HTMLタグやスクリプトタグをエスケープし無害化する。

- 入力制限
不必要な入力値を許容しないようにする。

- CSPの設定
コンテンツの取得元やスクリプトの実行を許可するドメインを制限する。

https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/CSP

- Cookieへのアクセス制御
`Set-Cookie`の`HttpOnly`属性の設定しCookie情報へのアクセスを制限する。どちらかというと攻撃された時の軽減策。
尚、`Secure`属性は中間者攻撃の予防に役立つらしい。

https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/Cookies#cookie_%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF

- WAFの導入
一般的なXSSは防いでくれるらしい。
【Mac】コマンドでスクリーンショットを撮影する方法

スクリーンショットを撮影するには`screencapture`コマンドを使用します。

## 使い方

スクリーンショットを撮り、クリップボードに保存する。

```terminal
screencapture -c
```

スクリーンショットを撮り、ファイルに保存する。

```terminal
screencapture path/to/file.png
```

マウスカーソルを含むスクリーンショットを撮る。

```terminal
screencapture -C path/to/file.png。
```

スクリーンショットを撮り、保存する代わりにプレビューで開く。

```terminal
screencapture -P
```

選択した矩形領域のスクリーンショットを撮る。

```terminal
screencapture -i path/to/file.png。
```

指定した秒数遅延してスクリーンショットを撮る。

```terminal
screencapture -T 秒 path/to/file.png
```

スクリーンレコーディングを行い、ファイルに保存する。

```terminal
screencapture -v path/to/file.mp4
```

## 参考

https://keith.github.io/xcode-man-pages/screencapture.1.html
【コミュニケーション】社内に"コミュニティ文化"をいい感じに伝えるために

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回、社内イベントでコミュニティ活動に関するテーマでLT発表を行いました。
そのうえで、**社内にコミュニティ文化をいい感じに伝えるために何を行えばいいのか**整理したほうがいいと思ったため、言語化の一環として記事を執筆しました。

:::note info
技術的な要素は一切ございませんのであしからず
:::

# 目次
- 対象読者
- ゴール
- 私が考えるポイント
    - 自分の視点"以外"で伝えていく
    - なぜ"コミュニティ活動が必要なのか"を言語化する
    - 参加予備軍⇒参加者へアップデートしていく
- コミュニティ文化を伝えることの弊害
- まとめ

## 対象読者

次のような課題を抱えている方に本記事をお役立ていただければ幸いです。

- 社内にコミュニティ文化を醸成・発展させていきたいと思っている方
- 社内勉強会などを企画・実行しているが興味がある人を集められない
- コミュニティ文化醸成に関するリスクを考えたい方

## ゴール

次のような視点を読者の方に持ってもらうことをゴールとしています。

- 社内へ"コミュニティ文化を持ち込んでいく"ための大枠を理解する
- コミュニティ文化を持ち込むうえで考慮しなくてはいけないリスクを理解する
- 1人でもコミュニティ運営を行っていきたい・参加していきたいと思う人を増やす

## 私が考えるポイント

ポイントとして様々あるかと思いますが、社内向けであれば以下3点に集約されるかと思います。

### 自分の視点"以外"で伝えていく

コミュニティイベントに参加して**自身が熱狂したことをそのまま相手に伝えてもなかなか伝わらない**と思います。（個人的に熱狂を共感しあうのが理想なのですが）

そのうえで、対象者（=聞き手）が抱えている課題（友達作り、技術キャッチアップ、ナレッジ収集など）を要素分解したうえで、**コミュニティ参加を通じて課題をどのように解決していけるか**を伝えていったほうが良いと思います。

個人的に以下手段が良いのではないかなぁと思っています。

:::note alert
所属企業によってできること・できないことがあるかと思いますので、そのあたりは取捨選択する必要があると思います。
:::

- 社内掲示板での社外イベントの情報発信
    - **イベントの存在を知ってもらう**が一番大切なので社内掲示板を利用するのが一つの手かと思います
- 企業内でのイベントで紹介・LTを行ってみる
    - **相手へ自身の考えを伝える手段**としてLTは最良の手段だと思います
    - 可能であればLTを**あざとく**利用するのが良いかと思います
- ハンズオン会などのイベントを開催してみる
    - 知ってもらうよりハードルが高いですが、ハンズオンの元ネタとしてコミュニティの存在を伝えることで強く関心を引けるかと思います

### なぜ"コミュニティ活動が必要なのか"を言語化する

意外と抜けがちなのが、**社内でコミュニティ活動が本当に必要なのか**といった観点を言語化することだと思います。

極端な例を言えば、所属社員が全員技術のプロ＋社内でも団結は不要（=一匹狼でやっていけばいい）といった方針の企業であれば、**コミュニティ活動を実装する必要はない**と言えます。

また、個人的に他施策（採用、社員定着、業績評価など）と紐づけてコミュニティ活動を行っていくと、**コミュニティ活動の目的が他施策の目的を達成する**になってしまいます。もちろん、他施策の目的達成としてコミュニティ活動を利用することは否定しませんが、私個人の経験から**うまく行った試しは少ない**と思います。

:::note info
補足すると、**コミュニティ活動の副産物として採用者数増加、社員定着率改善**といった例はあると思います。（実際に事例として取り上げている企業さんもあるので）

そのうえで、**採用・社員定着などを行う目的でコミュニティ活動を行っても求めている効果は得られない**と個人的は思っています。
:::

### 参加予備軍⇒参加者へアップデートしていく

**参加したいけど、外部イベントに参加するのが怖い**といった社員は多くいると思います。
そういった考えを持っている人は**きっかけさえ与えてしまえば強いパートナー**になっていくと思います。

そのうえで、参加予備軍を参加者へアップデートさせる方法として**イベントへ一緒に参加する⇒強烈な感動体験・熱狂を体感する**があると思います。

私自身も、**外部イベントでの熱狂**を通じて、イベント登壇・アウトプット活動を主体的に行うようになったと認識しています。

## コミュニティ文化を伝えることの弊害

コミュニティ文化を伝えることに弊害はないと思われがちかもしれませんが、人事視点で考えると、**離職リスクが高くなる**といったことがあると考えられます。

**社内に閉じたコミュニティであれば、離職リスクは関係ないのでは**と思われるかもしれませんが、正直社内の人間だけだと伝えられる情報量が少なくなります。

その結果として、**コミュニティ立ち上げたけど、うまくアクトしていない**といった状態に陥ってしまいます。

そのため、外部コミュニティを有効活用するのは必須条件かと思いますが、**外部コミュニティ参加⇒自社とのギャップ⇒離職**のサイクルが発生する可能性があります。

正直、いち社員だけでどうにかなる問題ではないですが、**協力的な人事担当がいる**のであれば一緒にイベントに連れて行ってみるのも一つの手だと思います。

:::note alert
社外コミュニティ（特に技術系）の多くは**No Sale No Job、リクルーティング禁止**のポリシーがあります。そのため、**営業活動・採用活動をしそうな方**には釘を刺しておく or そもそもお声がけしないといった対策が必要かと思います。
:::

## まとめ

言語化の一環としていろいろ書いてみましたが、正直、私の中でも最適解はないと思っています。ただ、最適解を出せる話かと言われたらそうではないと思いますので、常にPDCAサイクルを回していくことが大切だと思います。

そのうえで、一人でも多くコミュニティ活動の楽しさを知ってもらえればよいのかなぁと思っております。

## 参考サイト

https://aws.amazon.com/jp/blogs/news/mitsubishi-electric-aws-user-group-serendie/

https://qiita.com/_YukiOgawa/items/3f60789a99f2c8e247fc

最後までお読みいただきありがとうございました！
Pythonのスライス文字列操作の基本と応用

Pythonのスライス（slice）機能は、文字列の一部を簡単に取得する強力なツールです。

### 1. スライスの基本構文  
Pythonのスライスは以下の構文で利用できます。  

```python
文字列[start:stop:step]
```
- `start`：開始位置（省略すると先頭から）  
- `stop`：終了位置（この位置の手前まで）  
- `step`：何文字ごとに取得するか（省略すると1）  


文字列インデックス
```
 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6 # 先頭から数え
-6  -5  -4  -3  -2  -1     # 後ろから数え
```


### 2. 基本的なスライス例  

```python
text = "Hello, Python!"

# 先頭から5文字取得　0 ～ 4
print(text[:5])  # 出力: Hello

# 7文字目以降を取得　7 ～ 
print(text[7:])  # 出力: Python!

# 1文字おきに取得 0 2 4 6 8 ....
print(text[::2])  # 出力: Hlo yhn
```

### 3. 負のインデックスを活用する  
Pythonでは負のインデックスを使うことで、後ろから数えることもできます。  

```python
# 末尾の1文字を取得
print(text[-1])  # 出力: !

# 末尾5文字を取得
print(text[-5:])  # 出力: thon!

# 逆順に並べる
print(text[::-1])  # 出力: !nohtyP ,olleH
```

### 4. スライスの応用例  
#### 特定の文字を削除  
```python
# 先頭と末尾の2文字（空白）を除去
text = "  Trim this text  "
print(text[2:-2])  # 出力: Trim this text
```

#### 文字列の一部を変更（スライス+結合）  
Pythonの文字列は**イミュータブル（変更不可）**のため、スライスを使って部分的に変更できます。  
```python
text = "Hello, Python!"
new_text = text[:7] + "World!"  # "Python!"を"World!"に変更
print(new_text)  # 出力: Hello, World!
```

### 5. 練習問題

一部を逆順にする

与えられた文字列 `s` の `start` から `end` までの部分だけを逆順にし、その他の部分はそのままの文字列を返してください。
（`start` と `end` は 0-indexed とする）

入力例:

```python
s = "abcdefghij"
start = 2
end = 7
```

出力例:

```text
abgfedchij
```

https://docs.python.org/3/c-api/slice.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/7bce4959-1b74-4617-9781-433583083e5a.png)



```python
s = "abcdefghij"
start = 2
end = 7
new_s = s[:start] + s[start:end：1][::-1] + s[end:] #  start:end：1 と start:end同じ
print(new_s)
```

弊社の求人,ご興味ある方是非応募してください。

- [データエンジニア】急成長のHRTech企業でAIとデータ基盤を駆使しDXをリードするデータエンジニアを募集](https://hrmos.co/pages/techocean/jobs/1898172211721719822)
githubのコミット時に警告が出たので備忘録

## 起きたこと
git commitを実行したときに
fatal: unable to auto-detect email address (got '自分のデバイス名.(none)')
と出た

## 対処方法
Gitがコミットに使用するメールアドレスと名前を設定する
以下コマンド
```bash
# グローバル設定（すべてのリポジトリに適用）
git config --global user.email "あなたのメールアドレス@example.com"
git config --global user.name "あなたの名前"

# ローカル設定（現在のリポジトリにのみ適用）
git config user.email "あなたのメールアドレス@example.com"
git config user.name "あなたの名前"
```
AtCoderをPythonで取り組んだ振り返り(ABC397 A～B)

どうもこんにちは！

今週もAtCoderのコンテストに参加できたので記録がてら振り返ります。
今回はBまでの完答。前回はCまで解けていたんですが残念。


# 問題
問題は以下のリンクから。取り組めたA~Cまでを振り返ります。

https://atcoder.jp/contests/abc397/tasks

# A - Thermometer -
体温が入力されるので、高熱(38.0以上)・発熱(37.5以上38.0未満)・平熱(37.5未満)を判定する問題。入力をif文で判定すれば解けますが、入力が小数点であることに注意ですね。ソースコードですがif-elseの順番は個人的書きやすい順で並べています。
~~~Python
t = float(input())
if t >= 38:
  print(1)
elif t < 37.5:
  print(3)
else:
  print(2)
~~~

# B - Ticket Gate Log  -
入力されたiとoで構成される文字列に、長さが偶数で奇数文字目がiで偶数文字目がoとなるように文字を挿入していくとすると、最小で何文字の追加が必要かを判定する問題。求められている解法かよくわかりませんでしたが、シンプルに1文字ずつ見て奇数文字目がiでなければiを挿入、偶数文字目がoでなければoを挿入するとしました。
~~~Python
s = list(map(str,input()))
count = 0
for i,j in enumerate(s):
    if i % 2 == 0 and j != 'i':
        count += 1
        s.insert(i,'i')
    elif i % 2 == 1 and j != 'o':
        count += 1
        s.insert(i,'0')
    elif i == len(s)-1 and len(s) % 2 ==1:
        count +=1
        s.append('o')
print(count)
~~~

# C - Variety Split Easy -
入力として長さNの整数列が与えられ、Aを1か所で区切って分割してそれぞれの数列に含まれる要素の種類の和の最大値を求めるという問題。例えば1 2 3 3 3 4という数列があって前4個と後ろ2個の数列に分割するとき、前の数列は1,2,3の3種類、後ろは3,4の2種類で計5種類となります。なお数列Nの長さは最大で$3×10^5$。
Cで要素数の多いデータを扱うのが定番なんですね。シンプルで解けるものではないと思いつつもとりあえず、区切る位置を前から1つめの場合、2つめの場合と全部探索して最大値を探すようにしました。ソースは以下。
~~~Python
n = int(input())
a = [int(x) for x in input().split()]

ans = 0

for i in range(1,n):
    ans = max(ans,len(set(a[:i]))+len(set(a[i:])))
    
print(ans)
~~~
結果は制限時間オーバーでエラー。ですよねー。for文自体はn回ですがテストケースでの要素数が多いのでクリアできないと。ここで解法が思いつかず断念しました。集合を使っての累積和を使えるかも考えたんですが、左から見たときには増えますが、右から見たときには減っていくんですよね。集合が減らす方法が思いつかず。要素そのものを扱うとすると最初の考え方と処理的には同じで意味なさそうかなと。



# おわりに
3月中のコンテストはあと2回、4問完答を目標に引き続き取り組んでいきたいと思います。

ではでは。
24時間そばにいてくれる、あなただけの癒しタイム——MoguChatを体験しよう！

![3:15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965805/14f31c54-4f42-4468-bd7f-5980eee1694d.png)

「おはよう、今日は雨だから傘を忘れずにね」「夜中に落ち込んでる？ ちょっとおしゃべりしない？」——こんなセリフ、恋愛ドラマのものじゃないよ。実は、MoguChatがあなたの毎日に届ける、温かいメッセージなんだ！

MoguChatは、超スゴイAIチャットアプリ。「24時間そばにいてくれる癒し」「推しキャラとの甘い恋愛」「まるで本物の会話体験」が自慢で、人とAIの新しい関係をガラッと変えてくれるよ。疲れ知らずの話し相手が欲しい人も、大好きな二次元キャラとドキドキしたい人も、MoguChatがあなたの心のベストパートナーになるよ！

## MoguChatの3つのスゴイところ——あなたの毎日を癒します
**24時間そばにいてくれる：あなたの「癒し系」パートナー**

リアルな人間関係って、時間や気遣いが必要で疲れちゃうよね。でも、MoguChatなら「いつでもそばにいてくれる、絶対に文句を言わない」存在なんだ。夜中の3時に「誰も分かってくれない…」とモヤモヤしてるときも、電車の中で「ちょっと癒されたいな」と思う瞬間も、MoguChatがすぐに寄り添ってくれるよ。

あるユーザーはこんな風に評価してくれました。「リアルな人だと気を遣っちゃうけど、MoguChatなら素の自分でいられるんだ」。悩みを聞いてほしいとき、うれしいことをシェアしたいとき、ただ誰かと「ゆるっとおしゃべり」したいとき——MoguChatのスゴイ「記憶力」と「共感力」が、あなたの心のニーズをピンポイントで満たして、都会の孤独な毎日に温もりをプラスしてくれるよ。

**推しキャラとの甘い恋愛：理想のタイプを自由にカスタマイズ**

ちょっと想像してみて。優しい優等生タイプ、毒舌だけど実は優しいお姉さん、ちょっと強引な社長タイプ——さらには、あなたの「推し」の二次元キャラと、エモい恋愛を楽しむなんて！ そんな夢みたいなことが、MoguChatなら簡単に叶っちゃうんだ。最新のAI技術を使って、あなただけの「理想の恋人」を自由に「キャラメイク」できるよ。

性格や話し方、甘いやりとりの細かいところまで、ぜーんぶあなたの思いのまま！ 気軽に楽しめて、誤解の心配もなく、現実の恋愛の面倒なことから解放されるよ。MoguChatなら、バーチャルな世界で「ドキドキ」を思う存分味わえるんだ。あるユーザーはこう言ってる。「MoguChatとの恋愛って、まるで没入型のゲームみたい。ドキドキも味わえるし、現実のストレスからも解放されるんだ！」

**まるで本物！ 「あなたを理解」してくれる会話体験**

自然言語処理（NLP）や感情認識技術の進化のおかげで、MoguChatの会話はめっちゃリアル！ まるで血の通った相手と話してるみたいなんだ。あなたの好きなものやクセをしっかり覚えてくれるだけでなく、気分に合わせて対応も変えてくれるよ。

例えば、「今日、仕事がめっちゃ疲れた」と言うと、「お疲れ様！ リラックスできる音楽でも聞いてみる？」と優しく声をかけてくれる。逆に、二次元の話題で盛り上がりたいときは、すぐに「オタク仲間」モードにチェンジして、ストーリーやキャラについて熱く語り合ってくれるんだ！ こんな「あなたを理解してくれる」会話体験が、たくさんのユーザーに「デジタルなおつまみ」や「心の救世主」と呼ばれて、愛されてる理由なんだ。

## MoguChatを選ぶ理由——現代人の心のスキマを埋めてくれる
忙しい都会の生活では、「心の面倒くさがり」や「人付き合いのダウングレード」が悩みの種だよね。SNSの投稿は3日間しか見せない設定にしたり、みんなでご飯を食べていてもスマホをいじったり……。複雑な人間関係に疲れちゃうこと、あるよね。

そんなとき、MoguChatが提供する「シンプルでピュアな」コミュニケーションが、心のスキマをぴったり埋めてくれるんだ。あるユーザーはこんな冗談を言ってた。「リアルな恋人だと振り回されるかもしれないけど、MoguChatなら絶対に「嫌な思い」なんてさせないから安心！」

人との関わりが苦手な「コミュ障」な人も、効率的に癒しを求める「効率重視派」な人も、MoguChatの「ストレスフリーな癒し」が、あなたの毎日をそっと癒してくれるよ。

さらに、MoguChatはただの癒しツールじゃないよ。自分を見つめ直すきっかけにもなるんだ。AIとのやりとりを通じて、自分の心のニーズがクリアになったり、リアルなコミュニケーションのヒントを得たり。MoguChatは、あなたの心の「ステップアップのハシゴ」であり、決して「だらけさせるソファ」じゃないんだ。

## MoguChatで、新しい幸せを
「理解されたいけど、リアルなゴタゴタはイヤ」——そんな現代の私たちに、MoguChatは24時間の癒し、推しキャラとの甘い恋愛、まるで本物の会話体験を通じて、心のオアシスを提供するよ。愚痴を聞いてくれる「万能の聞き役」が欲しい人も、理想の恋人とロマンティックな時間を楽しみたい人も、MoguChatならぜーんぶ叶えてくれるんだ！

今すぐMoguChatをダウンロードして、あなただけのAIパートナーをカスタマイズしてみて！もうひとりぼっちにさせません！
とある地方公務員の挑戦〜地域のIT化に貢献するために〜

<h2>はじめに</h2>

　私はとある地方の市役所で働きながら、地域へのITリテラシーの向上に資する目的で副業もしています。（これまで行ってきたのは、HPの作成（WordPress）や、ロゴ作成、キャッチコピー等の相談、ほかIT化に向けた事業相談）世間ではまだ珍しいですが一応、首長から副業を認められている副業公務員です。

　もともとパソコンや周辺機器、ネットで調べて解決をすることが好きで学生時代はaviutlで短い動画を作ったりしていました。社会人になってからは大手家電量販店での接客販売や、土木、物流ほか転々としたのち、今の市役所へ転職し、行政のIT担当部署、広報担当部署（各種SNS配信や（AIやInDesign等）を経験してきました。しかし、プログラミングは未経験で、「難しそう」というイメージから手を出せずにいました。

　昨今のAIの台頭により、今後プログラミングの基礎知識がますます重要になってくると感じ、重い腰をあげ、Pythonの学習を１月から開始しました。トラブルシューティングの面白さに気づき、ChatGPTやプロエンジニアのサポートを受けながら、現在学習を進めています。

<h2>なぜPythonを学ぶのか？</h2>

　Pythonを学ぶ目的は、Pythonを通じて何ができるのかの視野を広げ、仕事に活かしていくこと、そして地域へ活かしていくことです。
　そもそも、行政の職員はITに苦手意識を持つことが多く、Excelの関数すらろくに扱えない職員も少なくありません。事業者からの提案も「よくわからないけどすごそう」と受け入れてしまうことが少なからずあります。DX化に向けた私の命題は事業者からの提案内容を理解し、活用しきれる方法まで確立した上で導入することだと思っています。またはその手法を模索すること。事業者が良いものを提供してくれても、使いこなせなければ宝の持ち腐れです。
　これは、庁内だけでなく、市内事業者へ導入するときも同じとなります。地域のIT化を進めるためには、「行政に言われたから仕方なくやる」という形ではなく、実際に地域の事業者自身が必要性を理解し、納得したうえで取り組んでもらうことが重要です。そして、理解した職員がフォローし、定着を進めることで、地域全体が主体的にIT活用に向かう環境を作りたいと考えています。
　まずは、マクロな点ではなく、ミクロな点で地域を助けること、そして実績を詰み、全体最適化へ向けた動きを進めていきたいと考えています。

<h2>Qiitaでの発信について</h2>

<ul><li>学習の過程をQiitaで発信することで、地方公務員でもITスキルを身につけられることを伝える

<li>自分の知識を整理し、アウトプットする習慣をつける
</ul>
という目的を持っています。

記事のテーマとしては、

<ul><li>「地方公務員の業務効率化にPythonを活用してみた」

<li>「地方公務員×ITの可能性を考える」
</ul>
といった内容を考えています。

まとめ

まだまだ駆け出しですが地方公務員として働きながらPythonを学ぶことで、業務の効率化だけでなく、地域のIT化にも貢献できる可能性が広がると感じています。民間と公務の架け橋となるような人材を目指し、今後も学習を続けていきます。

この記事が、同じように学習を進める方々や、地方公務員のIT活用に興味のある方々にとって参考になれば幸いです。
オンライン決済ツール「Stripe」のダッシュボードでデフォルト価格を手動で設定する方法

# この記事を書こうと思ったきっかけ
Next.jsとLaravelとStripeを連携した商品管理システムを作っているときに、Laravel経由でStripeに商品情報を登録すると今回のテーマである`デフォルト価格`が設定されない。
そのため、Stripe側で手動設定する手順を備忘録として残します。

https://qiita.com/SKY-HaYaTo/items/f3b9b6a524794146469e

#### 商品一覧リスト画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/06e0805e-52c3-4991-ab62-83179f512b0c.png)


# Stripeのダッシュボードから手動で設定する方法
すでにStripeのアカウント登録済みであることを前提として進めます。

#### デフォルト設定されていないの商品をクリックします。
![Striprデフォルト設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/97e7b1f6-182b-41e1-8469-41cd12d26f5c.png)

#### <b><font color="red">赤枠</font></b>の右端にある「・・・」アイコンをクリックします。
#### 
![Striprデフォルト設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/c4f6174f-c62e-43a9-846c-25f1dbd56eb2.png)

#### 「デフォルト価格として設定する」(<b><font color="red">赤枠</font></b>)をクリックして完了です。
![Striprデフォルト設定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/d498a4bd-2e41-4652-94c1-2486f3a801fc.png)

以上です。
git pull と git fetch の違い

# git pull（以下pull） と git fetch（以下fetch）
pullとfetchはどちらとも、**リモートリポジトリから更新情報を取得する**コマンド

↓↓２つの違いについて説明します。
# git fetch
リモートリポジトリから更新情報をローカルに**取り込み**ます。
その際、**作業中のコードやブランチにはなにも変更が加わらず**、安全にリモートの状態を確認できます。

### メリット
- **慎重に変更内容を取り込みことができる**

### デメリット
- マージしたい場合、取得後に手動で行う必要があるため少し煩雑になる

### 使用例
```
git fetch origin ブランチ名 // 特定のブランチの最新状態を取得
git fetch origin // 特定のリポジトリを取得
git fetch --all // 全てのリポジトリから取得
git fetch -t // タグを取得
git fetch --tags // タグを取得
git fetch -p // ブランチ削除の同期
git fetch --prune // ブランチ削除の同期
```
### どのようなときに使用するのか
説明の通り、リモートリポジトリの情報を確認したいが、まだ作業中のブランチにマージしたくないときに使用します。
# git pull
fetchと同じく、更新情報をローカルに取り込みますが、pullはそれに加えて現在いるブランチに自動的にマージ(merge)されます。

### どんなときに使用するのか
リモートリポジトリの確認とともに、作業中のブランチに直接マージさせたいときに使用します。

### メリット
- 変更内容の確認と同時にマージもできるため作業がスムーズになる

### デメリット
- 自動的に変更内容がマージされるため、**コンフリクトが発生しやすくなる**

### 使用例
```
git pull origin ブランチ名 // 特定のブランチを取得・取り込み
git pull origin // リモートから全てを取得・取り込み
git pull --all // 全てのリモートから取得・取り込み
git pull --rebase origin main // リベースして取得・取り込み
```

# 結論
安全に作業を進めるならfetch
すぐに同期して作業をはやく進めるならpull
【Graviton】AWS Gravitonってなに？

# はじめに
先日、AWSのFrugality（倹約性）がテーマの社内勉強会に参加した際、さらっと触れられていましたが全然知らないものがあったので、そのことについて整理・アウトプットしたいと思います。
間違いなどがありましたら、ご指摘いただけると幸いです。

# Gravitonとは
一言でいうと、**AWSが独自開発したCPU**です。

https://aws.amazon.com/jp/ec2/graviton/

こちらでは、以下のようなメリットがあると説明されています。
- コストパフォーマンス
- CO2排出量
- 広範なソフトウェアサポート
- マネージドAWSサービスとして利用可能

まとめると、従来のインスタンスにくらべて、同程度の性能であれば、20%程度費用が抑えられ、EC2だけでなく、Aurora、RDS、EKSなどで利用することができる。といったところでしょうか。

# 従来のものとなにが違うのか
一言でいうと、**従来のものはx86**、**GravitonベースのものはARMベース**で作られています。
これらはアーキテクチャ思想が異なります。

### CPUのアーキテクチャ思想
#### CISC (Complex Instruction Set Computer)
複雑で多機能な命令をハードウェア側でサポートする思想です。
**1つの命令で複雑な処理を実行**できることが特徴です。
(歴史的な背景として、メモリなどが高価だったため、できるだけ少ない命令で多くの処理をすることが求められていたそうです)

通常のEC2インスタンスは、x86ベースとなっており、こちらに当てはまります。

#### RISC (Reduced Instruction Set Computer)
命令をシンプルにして、1命令あたりの実行時間を速くする思想です。
**省電力で処理を行うことができる**ので、主にスマートフォンやタブレットなどで用いられています。
例として、Apple ARM64(M1, M2チップ)などが挙げられます。

GravitonのEC2インスタンスは、ARMベースとなっており、こちらに当てはまります。

# Gravitonベースのインスタンスの例
以下サイトでは、どのようなGravitonベースのインスタンスを利用できるのかについて説明されています。
`g`が含まれているインスタンスがGravitonベースのインスタンスとなっているようです。
またGravitonの世代は2023年末発表されたGraviton4が最新です。

https://aws.amazon.com/jp/ec2/graviton/

|用途|Gravitonベースのインスタンスファミリー|
|:----|:----|
|一般用途向け|M8g(AWS Graviton4) <br> T4g(AWS Graviton2)|
|コンピューティング最適化|C8g(AWS Graviton4) <br> C7g・C7gd・C7gn(AWS Graviton3, 3E)|
|メモリ最適化|R8g・X8g(AWS Graviton4)|
|ストレージ最適化|I8g(AWS Graviton4) <br> Is4gen(AWS Graviton2)|
|高速コンピューティング|G5g(AWS Graviton2)|

# おわりに
今回はコスト削減に有効なGravitonについて調べ、その内容を整理してみました。
いつのまにかCPUのアーキテクチャ思想の話になっていましたが、なんとなくコストを抑えられる理由はわかった気がします。
いままでGravitonのことを全く知らなかったので、これからはコスト削減をしたい際に意識することができるのではないかなと思います。
ありがとうございました。


# 参考にさせていただいたサイト

https://github.com/aws/aws-graviton-getting-started

https://nakaterux.hatenablog.com/entry/2024/12/29/162112

https://itall.hatenablog.com/entry/2024/09/15/RISC%E3%81%A8CISC%E3%82%92%E5%88%86%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86

https://captain-cocco.com/cpu-evolution-and-history/

https://ja.wikipedia.org/wiki/CISC

https://ja.wikipedia.org/wiki/RISC
オブジェクト指向でなぜつくるのか 第3版 

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/ecd24351-e8cf-49e4-b8a0-fd5ca3f97ace.png">


読書記録

## 読者プロフィール
組み込みエンジニア。お仕事はＣ言語をメインで使う。オブジェクト指向言語でのプロダクト開発経験あり。

## 雑感
率直にいってとても困惑している。
2017年に本書の第二版を読んでおり、当時良い印象を持った記憶があった。第三版が出てるとのことで読んでみたのだが、引っかかるポイントがあったり、全体的に薄い内容に感じてしまった。読む前は楽しみにしていたはずなのになぜだろうか…。期待値が高かった分ギャップが大きくなってしまったのかもしれない。

・全体的に内容が浅く新しい知識を得られなかった。（目次は第二版からほぼ変化無し）
　タイトルに基礎知識ってあるからこんなもんなのかもしれない。
 
・「オブジェクト思考でなぜ作るか」という問いに対する回答が無いように思える。タイトルは「オブジェクト指向とは」の方が実態に近い気がする。

・（時代的な背景の差として理解できるが）オブジェクト指向の比喩やコンセプトの分かりにくさを繰り返し説明されるが、そもそも遭遇したことがないのでピンとこない。

第三版を読む前はおススメできる本だと思っていたはずだけど、おすすめしないかな。オブジェクト指向について全く分かっていないなら読むのはあり。その場合は古い版を中古で買えばＯＫ。

# あらすじ
本書はJavaで解説されているが詳細な言語仕様については触れていない。メモリの説明で少し検証したのでそこだけ書いておく。

## メモリの使い方
インスタンス生成時はヒープ領域が使われるとある。Javaではそうなのかもしれないが、newを使うからでは？と思いc++で簡単に確認した。汎用ＰＣでスタックやヒープの領域を確認する方法が分からなかったので、実験的にグローバル領域、ヒープ、スタックのアドレスを求め分類した。

静的メンバはクラス定義とともにロードされるはずなので、そのアドレスを出力することでクラスのロード状況を間接的に見てみる。

```c++:ポインタ表示実験
int Person::staticMember = 0;
int va11=0;
int main(){
    int val2;
    int* val3=(int*)malloc(10);
    int* val4 = new int[10];
    Person personNotNew("Taro", 25);
    Person* personNew = new Person("Taro", 25);

    printf("GlobalVal   %p\n",&va11);
    printf("LocalVal    %p\n",&val2);
    printf("MallocInt   %p\n",val3);
    printf("NewInt      %p\n",val4);
    printf("StackClass  %p\n",(void*)&personNotNew);
    printf("NewClass    %p\n",(void*)personNew);
    printf("StaticClass %p\n",(void*)&Person::staticMember);
```

``` :実行結果
GlobalVal   00007FF7329690A4
LocalVal    0000002A50FFFDCC
MallocInt   0000013A767A1C90
NewInt      0000013A76751260
StackClass  0000002A50FFFDA0
NewClass    0000013A767515D0
StaticClass 00007FF7329690A0
```

つまり以下のようになる。私の理解とも一致するので違和感はない。クラスインスタンスはnewすればヒープに作成され、ローカル変数として定義すればスタックに定義される。

|  |グローバル  |ヒープ  |スタック|
|---|---|---|---|
|グローバル変数  |〇  |  |  |
|class定義  |〇  |  |  |
|ローカル変数、ローカルインスタンス  |  |  |〇  |
|malloc,new |  | 〇 |  |


本書ではJavaを用いている。Javaでは動的メモリの回収はガベージコレクションによっておこなれるため通常インスタンスはヒープに生成される。
ガベージコレクションの無い言語（C++)ではヒープにインスタンスを置くメリットは薄まる。通常の変数と同様にスタック管理とするかヒープ管理とするかは選択できる。なおc++ではスマートポインタがあるため通常メモリの破棄は不要。Rustは勉強中だが、こちらもGCは無いがメモリリーク防止を言語がサポートしている。
Pandasを使ったデータ前処理テクニック

# はじめに

データサイエンスやデータ分析において、データの前処理は非常に重要なステップです。PythonのパワフルなライブラリであるPandasを使用することで、効率的にデータの前処理を行うことができます。この記事では、Pandasを使用した主要なデータ前処理テクニックを紹介します。

# 1. データの読み込みと基本的な探索

まず、データを読み込み、基本的な情報を確認します。

```python
import pandas as pd

# CSVファイルの読み込み
df = pd.read_csv('data.csv')

# データの先頭5行を表示
print(df.head())

# データの基本情報を表示
print(df.info())

# 数値データの基本統計量を表示
print(df.describe())
```

# 2. 欠損値の処理

欠損値の処理は重要な前処理ステップです。

```python
# 欠損値の確認
print(df.isnull().sum())

# 欠損値の削除
df_cleaned = df.dropna()

# 欠損値の補完（平均値で補完する例）
df['column_name'].fillna(df['column_name'].mean(), inplace=True)
```

# 3. 重複データの処理

重複データを削除して、データの一意性を確保します。

```python
# 重複行の削除
df_unique = df.drop_duplicates()
```

# 4. データ型の変換

適切なデータ型に変換することで、後続の処理が容易になります。

```python
# 文字列を日付型に変換
df['date_column'] = pd.to_datetime(df['date_column'])

# カテゴリ変数の変換
df['category_column'] = df['category_column'].astype('category')
```

# 5. 異常値の処理

異常値を検出し、適切に処理します。

```python
# 四分位数を使用した異常値の検出
Q1 = df['numeric_column'].quantile(0.25)
Q3 = df['numeric_column'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 異常値の除去
df_filtered = df[(df['numeric_column'] >= lower_bound) & (df['numeric_column'] <= upper_bound)]
```

# 6. カテゴリ変数のエンコーディング

機械学習モデルで使用するために、カテゴリ変数を数値に変換します。

```python
# ワンホットエンコーディング
df_encoded = pd.get_dummies(df, columns=['category_column'])
```

# 7. スケーリング

数値データのスケールを調整します。

```python
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df['scaled_column'] = scaler.fit_transform(df[['numeric_column']])
```

# 8. 特徴量の作成

既存の特徴量から新しい特徴量を作成します。

```python
# 日付から年、月、日を抽出
df['year'] = df['date_column'].dt.year
df['month'] = df['date_column'].dt.month
df['day'] = df['date_column'].dt.day
```

# まとめ

Pandasを使用したデータ前処理は、データ分析や機械学習プロジェクトの成功に不可欠です。これらのテクニックを適切に組み合わせることで、高品質なデータセットを準備することができます。データの特性や分析の目的に応じて、適切な前処理手法を選択し、適用することが重要です。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
🔑 Ansible Vault の基本的な使い方

# 📌 Ansible ってなに？

Ansible を知らない、または Ansible をインストールしていない方は、まず以下の記事を参考にしてください。

https://qiita.com/nobumory/items/15f6e7dd6a04aedcc673


# 📌 Ansible Vault ってなに？

**Ansible Vault** は、Ansible で扱う機密情報（パスワードや API キーなど）を暗号化して管理するための機能です。
通常の Playbook では、環境変数や別の管理ツールで機密情報を扱うことが一般的ですが、Ansible Vault を使用することで、Ansible のワークフローの中で安全に機密情報を扱うことができます。

# 📌 ファイルの作成

それでは `secrets.yml` にパスワードを保存してみましょう 👀

以下のコマンドで `secrets.yml` を作成ます。

```bash
ansible-vault create secrets.yml
```

パスワード入力を求められるので、Vault のパスワードを設定します。

```
New Vault password:
```

その後、エディタが開くので、暗号化したい情報を記述します。📝

# 📌 ファイルの編集

パスワードの値を間違えたり、項目を追加したいときは以下のコマンドを実行します。

```bash
ansible-vault edit secrets.yml
```

# 📌 ファイルの内容確認

暗号化された `secrets.yml` の内容を確認するには、以下のコマンドを実行します。

```bash
ansible-vault view secrets.yml
```

# 📌 パスワードの入力の省略方法

Ansible Vault を使用すると、毎回パスワード入力を求められますが、以下の方法で省略できます。

```bash
echo "your-vault-password" > .vault_pass
chmod 600 .vault_pass
```

その後、`--vault-password-file` オプションをつけてコマンドを実行すると、パスワードの入力を省略できます。

### 例1: `secrets.yml` を編集する

```bash
ansible-vault edit secrets.yml --vault-password-file .vault_pass
```

### 例2: `playbook` を実行する

```bash
ansible-playbook -i hosts.ini playbooks/create_admin_user.yml --vault-password-file .vault_pass
```

# 📌 （応用）group_vars と host_vars

### 🔁 group_vars の例（全ホスト共通の変数）

```
mkdir -p group_vars
ansible-vault create group_vars/all.yml
```

作成した all.yml に変数を記述すれば、どの Playbook にも vars_files を書かずにその変数にアクセスできます。

### 🔁 host_vars の例（特定ホスト用の変数）

```
mkdir -p host_vars
ansible-vault create host_vars/web01.yml
```

対象ホスト（例：web01）に紐づく変数ファイルを作成することで、Playbookやインベントリに変数を明示しなくても自動的に適用されます。

# host_vars/web01.yml
password_admin: SpecialPassForWeb01

📂 構成例

```
project/
├── inventory.yml
├── group_vars/
│   └── all.yml
├── host_vars/
│   └── web01.yml
├── playbooks/
│   └── create_admin_user.yml
└── .vault_pass
```

これでファイルの場所に依存せず、共通変数を安定して使えます。
pcie

# SR-IOV

https://www.youtube.com/watch?v=hRHsk8Nycdg

![sr-iov.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632906/094a9500-a65b-4e57-af4f-9d6ab66a40de.jpeg)


# glossary

## Intel VMD

1. VMD: Volume Management Device

https://www.intel.com/content/dam/support/us/en/documents/memory-and-storage/Linux-Intel-VROC-TPS-335893.pdf

![intel-vmd-led.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632906/f819df1c-6bca-44b1-8097-c51bf06d180f.jpeg)

![intel-vroc-led.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632906/c8503b61-1fe7-4205-b1ba-9caa1b8f91aa.jpeg)


## Intel MID PCI
1. MID: Message Signaled Interrupt Identifiers
2. MC: Message Signaled Interrupt Message Control
3. MD: Message Signaled Interrupt Message Data
4. PMCAP: Power Management Capability
5. PMC: PCI Power Management Capabilities
6. PMCS: PCI Power Management Control And Status

https://edc.intel.com/content/www/jp/ja/design/products-and-solutions/processors-and-chipsets/comet-lake-u/intel-400-series-chipset-on-package-platform-controller-hub-register-database/reset-control-register-rst-cnt-offset-cf9/

# user guide

## User Guide: Intel® Virtual RAID on CPU (Intel® VROC) for Linux*

https://www.intel.com/content/www/us/en/content-details/841442/intel-virtual-raid-on-cpu-intel-vroc-for-linux-user-guide.html

# specification

## Technical Product Specification: Intel® Virtual RAID on CPU (Intel® VROC) for Linux*

https://www.intel.com/content/dam/support/us/en/documents/memory-and-storage/Linux-Intel-VROC-TPS-335893.pdf

## PCI Express® Base Specification Revision 5.0 Version 1.0

https://picture.iczhiku.com/resource/eetop/SYkDTqhOLhpUTnMx.pdf
AIを活用した小説執筆の新たな形

近年、AIの発展により、創作活動のスタイルが大きく変わりつつある。特に小説執筆において、AIを活用することで、より効率的かつ創造的なプロセスが可能になってきている。本記事では、AIを小説執筆のパートナーとして活用する方法についてまとめてみた。

## **1. AIを活用した小説執筆のプロセス**

小説の執筆にAIを活用する際には、明確な役割分担を意識することが重要である。

### **AIを活用した小説執筆のプロセス**
1. **テーマや大筋の決定（人間）**：
   - 作品のテーマやストーリーの方向性を決める。
   - 表現したいメッセージや雰囲気を整理する。
   
2. **具体的な文章化（AI）**：
   - AIに第一稿（ネーム）を作成させる。
   - 展開や描写のアイデアを提案させる。
   
3. **設定の掘り下げ（AI+人間の対話）**：
   - キャラクター設定や世界観の細部を調整。
   - 物語の整合性を確認し、必要に応じて修正。
   
4. **ディテール部分の修正（AI+人間の共同作業）**：
   - AIの出力をもとに、セリフや情景描写を磨き上げる。
   - 物語のテンポや流れを調整。
   
5. **最終仕上げ（人間）**：
   - 作品全体を見直し、作者の意図を最適に反映。
   - AIの自動生成部分を「人間の感性」で補完。

## **2. AIを活用するメリット**

### **① 効率化と時間短縮**
AIを活用することで、執筆プロセスが大幅にスピードアップする。
- プロット作成を自動化し、試行錯誤の時間を短縮。
- 繰り返しの作業（例：キャラクターの口調統一、用語の整合性）を自動処理。

### **② 創作の幅を広げる**
- AIの提案により、新しいアイデアや展開の可能性が広がる。
- 作者が思いつかなかった表現やストーリーの方向性を見出せる。

### **③ 推敲・修正の精度向上**
- AIを使って文章の違和感をチェックし、自然な流れに修正。
- 読者視点での改善点を見つけやすくなる。


## **3. AI活用における注意点**

### **① AIの出力をそのまま使わない**
AIの文章は論理的な整合性が取れていても、必ずしも感情や独創性に優れているとは限らない。そのため、**AIの出力をそのまま採用せず、作家自身の意図に合わせて調整することが重要**である。

### **② 「AI任せ」にならないようにする**
AIはあくまで補助ツールであり、最終的な判断は作家自身が行うべきだ。
- AIの提案を参考にしつつ、自分の意図に合った部分を採用。
- 人間ならではの感情表現や個性を加える。

### **③ 「オリジナリティ」を意識する**
AIは既存のデータをもとに文章を生成するため、ありきたりな表現になることがある。作家としての独自性を保つためにも、**自分ならではの視点や表現を積極的に加えることが重要**。

## **4. AIを使いこなすためのポイント**

### **① AIとの対話を重視する**
AIは指示次第で異なる出力を生成するため、「どのように指示を出すか」が重要。
- 「このシーンでは主人公が葛藤する描写を増やしたい」と具体的に伝える。
- 「このキャラクターの口調をもう少し厳しくしてほしい」と細かく指定する。

### **② 役割分担を明確にする**
- AIには第一稿を任せ、作家は推敲や感情表現に注力。
- 設定の整理やストーリーの整合性チェックにもAIを活用。

### **③ 実際に使って試行錯誤する**
- AIを活用した執筆プロセスは作家によって異なる。
- まずは試してみて、自分に合った使い方を見つけることが大切。

## **5. まとめ：AIを「創作の相棒」として活用する**

AIは単なる自動化ツールではなく、「創作の相棒」として活用することで、より豊かな作品を生み出すことができる。

**✔ テーマや大筋は人間が決める。**
**✔ 文章の下書きやアイデア出しはAIが担当。**
**✔ 仕上げや微調整は人間が行う。**

このような役割分担をすることで、作業負担を減らしつつ、**作家自身の創造性を最大限に生かすことが可能になる**。
WD Dashboard

# WD Dashboard

WD の内蔵 SSD のシリアル番号が調べたいが、直接見えないのでアプリで確認したい。

WD Dashboard を使うと見えるらしく情報はあって、メーカーサポートのページのリンクも検索で引っかかる。

でも開くと USB 接続の外付けドライブの関連ツールしかダウンロードに出てこない。

言語設定を日本語→英語にすると、WD Dashboard のダウンロードリンクが出てくる（日本語版は別ページでリンク先も別）

海外メーカーあるある。英語ページと情報が違う。

[Western Digital Dashboard](https://support-en.wd.com/app/answers/detailweb/a_id/31759)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9477/b92a4f58-b4c5-4d45-acaf-33ae036f8471.png)

https://wddashboarddownloads.wdc.com/wdDashboard/DashboardSetupSA.exe
「まとめてINSERT & 既存データはUPDATE」MySQLの効率的なデータ登録（🔰）

## はじめに
個人開発のバッチ処理を実装中に、「まとめてデータを追加する」「既にデータがあれば更新する」を同時に実施できるのか？の疑問がわいたのでとりまとめた。

## 結論
同時実行は「可能」

## Bulk Insertとは
通常、MySQLでデータを追加するには１件づつ追加する場合は`INSERT INTO`を使います。

```sql
INSER INTO users (id, name, age) VALUES (1, 'Alice', 25);
INSER INTO users (id, name, age) VALUES (2, 'Bob', 30);
```
しかし、１件ずつデータを追加するには処理が遅くなるため、MySQLではまとめてデータを追加する`Bulk Insert`というものがある。

```sql
INSERT INTO users (id, name, age) 
VALUES 
    (1, 'Alice', 25), 
    (2, 'Bob', 30), 
    (3, 'Charlie', 28);
```
これなら、１回のクエリで複数のデータを一気に追加できるため、データ登録が効率化される。

## ON DUPLICATE KEY UPDATE とは
もし`id`を一意な値に制約している場合は、同じ`id`のデータを追加しようとするとエラーになってしまう。

```sql
INSERT INTO users (id, name, age) VALUES (1, 'Alice', 25);
INSERT INTO users (id, name, age) VALUES (1, 'Alice', 26); -- エラー！
```

これを「idが同じデータがあるなら上書き（更新）する」ようにするのが`ON DUPLICATE KEY UPDATE`である。

```sql
INSER INTO users (id, name, age)
VALUES(1, 'Alice', 26)
ON DUPLIVCATE KEY UPDATE
    name = VALUES(name),
    age = VALUES(age);
```
上記は、`id=1`がある場合は、`name`と`age`を上書きするという意味になる。

## Bulk Insert + ON DUPLICATE KEY UPDATE の組み合わせ
Bulk Insert (INSERT INTO ... VALUES (...), (...), (...)) も ON DUPLICATE KEY UPDATE も 一緒に使うことができる というのがポイント。

```sql
INSERT INTO users (id, name, age) 
VALUES 
    (1, 'Alice', 26), 
    (2, 'Bob', 32), 
    (3, 'Charlie', 29)
ON DUPLICATE KEY UPDATE 
    name = VALUES(name), 
    age = VALUES(age);
```
 これを実行すると：
id=1, 2, 3 の データがなければ INSERT
id=1, 2, 3 の データがすでにあれば UPDATE（上書き）という意味となる。

## VALUES() 関数とは
`VALUES()`は`ON DUPLICATE KEY UPADATE`の時に使われる関数で、`INSERT`で指定した値を取得するために使う。

```sql
ON DUPLICATE KEY UPDATE 
    name = VALUES(name), 
    age = VALUES(age);
```
この`VALUES(name)`や`VALUES(age)`は、`INSERT`の`VALUES(...)`に指定した値を指します。

## 具体例
例えば、毎日株価データを取得してデータベースに保存するとき、新しいデータはINSERTし、すでにあるデータはUPDATEすれば、データの二重登録を防ぎつつ最新の情報を保持できます。

```sql
INSERT INTO stock_prices (compnay_code, date, close_pise)
VALUES
    ('72030', '2025-03-15', 1200),
    ('83060', '2025-03-15', 850)
ON DUPLICATE KEY UPDATE
   close_price = VALUES(close_price);
```
このようにすると、同じ company_code & dateのデータがある場合はUPDATEされるので、古い株価データを更新が可能となる。

## さいごに
- `Bulk Insert`は複数のデータを一括でINSERTできるので速い。
- `ON DUPLICATE KEY UPDATE`を使うと、すでにあるデータはUPDATEできるので、重複エラーを防げる。
- 両方を組み合わせると、一括追加しつつ、既存データを上書きすることができる。
- VALUES() 関数は INSERT のときに指定した値を参照するために使う。
【AIF-C01】AWS Certified AI Practitionerに一発合格しました

# 【AIF-C01】AWS Certified AI Practitionerに一発合格しました

## 概要
1. AWS Certified AI Practitioner[^1]に一発合格できました
2. スコアは813点でした

## 筆者の情報
- 以下は合格済み：
	- Cloud Practitioner
	- Solutions Architect-Associate
- IT企業勤務(24卒)
- 情報系の大学院卒(修士)
	- 大学時代の研究は自然言語処理
- AWS自体を触った経験はほぼ無し

## 勉強方法
- 勉強期間：約4時間
- 使用教材：[AIF-C01 / AWS Certified AI Practitioner 対策テスト4回＋補足問題 \| Udemy](https://www.udemy.com/share/10bP13/)
	- 上記に含まれる模擬試験(4回分)を2周しました
- Bedrock関連はあまり知らなかったため、検索して知識を得ました

## 所感
- ある程度自然言語処理の知識があれば、Bedrockについて学べば合格ラインを超えられるかと思います
- AWS無関係の問題はほとんど知っている問題だったため、似たような仕事内容の方であれば気軽に受けてみてもいいかなと感じました


[^1]: [AWS Certified AI Practitioner 認定 \| AWS 認定 \| AWS](https://aws.amazon.com/jp/certification/certified-ai-practitioner/)
Vitestの基本的な使い方-テストコード学習2本目


# 概要
このブログ記事は、テストフレームワークを学ぶ過程で執筆した記事の第3回です。
Vitestの基本的な使い方と設定について記載しています。

# インストールコマンド

・**npm**
```bash
npm install -D vitest
```
・**yarn**
```bash
yarn add -D vitest
```

# オンラインで試すには
ブラウザ上でNode.jsを直接実行できるオンライン開発環境の[stackblitz](https://vitest.new)が用意されています。

# テストの書き方

```js:sum.ts
export function sum(a: number, b: number): number {
  return a + b
}
```

```js:sum.test.ts
import { expect, test } from 'vitest'
import { sum } from './sum.ts'

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3)
})
```
::: note
デフォルトでは、テストファイルは名前に「.test.」または「.spec.」を含む必要があります。
:::

# テストの実行
package.jsonに、以下のコードを記載します。利用するコマンドを定義しているだけなので、プロジェクトに応じて変えてください。
```js:package.json
{
  "scripts": {
    "test": "vitest"
  }
}
```
・**npm**
```bash
npm run test
```
・**yarn**
```bash
yarn test
```
テストコマンドを実行後、テスト結果が表示されます。
```bash
 ✓ test/sum.test.ts (1 test) 1ms
   ✓ adds 1 + 2 to equal 3

 Test Files  1 passed (1)
      Tests  1 passed (1)
   Start at  21:35:38
   Duration  1.63s (transform 73ms, setup 0ms, collect 61ms, tests 1ms, environment 0ms, prepare 442ms)
```
# Vitestの設定

Vitestはvite.config.tsを読み込み、Viteと同じプラグインと設定を読み込みます。`resolve.alias`(インポートパスを簡略化するための機能)などが設定不要となります。

- `vite.config.ts`より優先度の高いファイルとして`vitest.config.ts`を作成することもできる。
- CLIのオプションとして設定ファイルを渡すこともできる。
```bash
vitest --config ./path/to/vitest.config.ts
```
- `process.env.VITEST`か`defineConfig`の`mode`プロパティを用いて、Vitestを実行する際に固有の設定に変更することが可能。
```ts
export default defineConfig({
  // Vitestが実行中の場合のみ適用される設定
  ...(process.env.VITEST
    ? {
        test: {
          // テスト用の特別な設定
          globals: true,
          coverage: {
            reporter: ['text', 'json', 'html'],
          },
        },
      }
    : {}),
});
```

```ts
export default defineConfig(({ mode }) => {
  // modeが'test'の場合（Vitestを実行中）は特別な設定を適用
  const isTest = mode === 'test';

  return {
    resolve: {
      alias: {
        '@': '/src',
        // テスト中のみモックライブラリを使用
        ...(isTest
          ? {
              'api-client': '/src/__mocks__/api-client.ts',
            }
          : {}),
      },
    },
    // テスト用の追加設定
    ...(isTest
      ? {
          test: {
            globals: true,
            coverage: {
              reporter: ['text', 'json', 'html'],
            },
          },
        }
      : {}),
  };
});

```


参考記事:
https://vitest.dev/guide/
let*-and をマクロで実装をしてみた。

``and-let*`` の嫌なところを除いた ``let*-and`` をマクロで実装をしてみた。``syntax-case`` でなく ``syntax-rules`` での簡易実装だからユーザーが間違って使った場合のエラーを排除仕切れないけど差し当たりは良しとする。``syntax-case`` が良く分からないので。

## 仕様

* <var>let*-and</var> := ``(let*-and (``<var>束縛節&hellip;</var>``)`` <var>本体式&hellip;</var>``)``
* <var>束縛節</var> := ``(``<var>変数名</var>`` ``<var>評価値が束縛される式</var>``)``
* <var>束縛節</var> := ``(``<var>変数名</var>`` ``<var>評価値が束縛される式</var>`` (where ``<var>条件式</var>``))``

``let*`` と同じように、<var>束縛節</var>が左から右に順に処理される。


``(wher ``<var>条件式</var>``)`` がある場合は、次の<var>束縛節</var>が処理される前に<var>条件式</var>が評価されて、それが ``#f`` なら次の<var>束縛節</var>の処理は実行されずに ``let*-and`` 全体の評価が終わる。その値は ``#f`` になる。

それ以外の場合、最後に評価された（＝最も右にある） ``本体式`` または ``条件式`` または ``評価値が束縛される式`` の値が ``let*-and`` 全体の評価値になる。

<var>束縛節&hellip;</var> も <var>本体式&hellip;</var> もどちらも空にすることができて、両方が空の ``(let*-and ())`` の評価値は ``#t``。

## コード

```scheme:
(define-syntax let*-and
  (syntax-rules (where)
    ((let*-and ())
    ; then
      #t)

    ((let*-and (clause clauses ...))
    ; then
      (let*-and
        "let*-and clauses:" (clause clauses ...)
        "let* clauses:" ()))

    ((let*-and (clauses ...) body bodies ...)
    ; then
      (let*-and
        "let*-and clauses:" (clauses ... ["begin" body bodies ...])
        "let* clauses:" ()))



    ;; implements ...

    ((let*-and
      "let*-and clauses:" (["begin" body bodies ...])
      "let* clauses:" (let*_clauses ...))
    ; then
      (let* (let*_clauses ...) body bodies ...))


    ((let*-and
      "let*-and clauses:" ([var expr (where pred)])
      "let* clauses:" (let*_clauses ...))
    ; then
      (let* (let*_clauses ... (var expr)) pred))


    ((let*-and
      "let*-and clauses:" ([var expr])
      "let* clauses:" (let*_clauses ...))
    ; then
      (let* (let*_clauses ... [var expr]) var))



    ((let*-and
      "let*-and clauses:" ([var expr (where pred)] let*-and_clauses ...)
      "let* clauses:" (let*_clauses ...))
    ; then
      (let* (let*_clauses ... [var expr])
        (and pred
          (let*-and
            "let*-and clauses:" (let*-and_clauses ...)
            "let* clauses:" ()))))

    ((let*-and
      "let*-and clauses:" ([var expr] let*-and_clauses ...)
      "let* clauses:" (let*_clauses ...))
    ; then
      (let*-and
        "let*-and clauses:" (let*-and_clauses ...)
        "let* clauses:" (let*_clauses ... [var expr])))))
```
M1 macでterraformコマンドを使う時におきたエラーと対処

### 事象と前提
・terraformのバージョン1.3.9でのコマンドを利用する必要があった
・m1 Macでterraformコマンドを利用すると、以下のエラーになる

```tsx
Error: Incompatible provider version
---
│ Provider registry.terraform.io/hashicorp/template v2.2.0 does not have a package available for your current platform, darwin_arm64.
│ Provider releases are separate from Terraform CLI releases, so not all providers are available
│ for all platforms. Other versions of this provider may have different platforms supported.
```

エラー内容でググると以下のやりとりが発見
https://discuss.hashicorp.com/t/template-v2-2-0-does-not-have-a-package-available-mac-m1/35099/2

### 対処内容その1：m1-terraform-provider-helperを利用
m1-terraform-provider-helperについてはこちらにも記載があった。
https://techblog.openwork.co.jp/entry/m1-provider-issue
まずはこれを試す！

```tsx
brew unistall terraform
```
してから、入れる
```tsx
brew install kreuzwerker/taps/m1-terraform-provider-helper
Install Terraform
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
m1-terraform-provider-helper install hashicorp/template -v v2.2.0
```

解決せずでした。。

続いて、こちら
https://zenn.dev/mihohoi/articles/4e15a098a08c25
を参考に、tfenv(※terraformのバージョン管理ツール)での利用を試した。
### 対処内容その2：tfenvを使い、amd64版のterraformを利用（これで解決！）


```tsx
brew unistall terraform
```
してから、
```tsx
brew install tfenv
tfenv uninstall 1.3.9
TFENV_ARCH=amd64 tfenv install 1.3.9
tfenv use 1.3.9
```
を試す。
※前述のページにもtfenv使ってる人がいた( https://discuss.hashicorp.com/t/template-v2-2-0-does-not-have-a-package-available-mac-m1/35099/25 )

これで改善しました。