OmniAICreator/Qiita-1.07M huggingface dataset:
Cursor エディタでVimプラグインを使用しているときに長押しが発動する場合の対処法

## 問題
- CursorエディタでVimプラグインをインストールしたところ、カーソルの移動のために `j` や `k` などを長押しした際、特殊文字の表示が出てうまくスクロールできなかった


## 対応策
- 下記の方法で Cursor エディタ利用時に 長押しによる文字入力を false に変更するとうまく動作する
```
defaults write "$(osascript -e 'id of app "Cursor"')" ApplePressAndHoldEnabled -bool false
```
MRUKに対応したMeta QuestのMRアプリのテンプレートプロジェクトを作った

# 概要
昨年、Meta Quest向けのMRアプリのテンプレートプロジェクトを作ってGitHubで公開しました。
[記事](
https://qiita.com/noritsune/items/8b1ef9e99e668916e202)
[リポジトリ](https://github.com/noritsune/quest-mr-template)

時が経ち、Meta公式がMRアプリを作りやすくするためのSDKである、[Meta MR Utility Kit](https://assetstore.unity.com/packages/tools/integration/meta-mr-utility-kit-272450?locale=ja-JP&srsltid=AfmBOopgJfHdcrQ_6KIl2Ss1iiHxmtDHAl-XXkNEEW_Ov0aK0E7b6V82)を公開しました。
以下、MRUKと呼称します
これを使うとMRアプリでよく使う機能を簡単に実装することができます。

MRUKの登場により、これまでMR開発で使用していた一部の機能が非推奨となりました。
そこで今回、テンプレートプロジェクトをMRUKに対応しました。
(MetaのQuest向けSDKは更新が激しくて追うのが大変...)

このテンプレートを使用することで、MR開発初心者の方でもロケットスタートできることでしょう。

# 公開場所
GitHubで公開しています。
https://github.com/noritsune/quest3-mr-template

# 対象読者
- QuestでMRアプリを作りたい人
- 最新(2024年9月時点)のMRUKの使い方を知りたい人

# 使い方
上記GitHubリポジトリのREADME.mdを参照して下さい。

# 変更点
- シーンメッシュの生成をBuilding BlocksのRoomModelからMRUKのEffect Meshに変更
  - エディタ上で実行した際はテスト用に用意されている部屋のデータがロードされて、動作確認をしやすくなりました
- ポイントライト用のオクルージョンシェーダーを追加
  - 室内の照明に合わせてポイントライトを使う場合はEffectMeshにこのシェーダーを適用する
- Depth APIによる動的オクルージョンに対応
- ガーディアンを無効化
  - MRアプリに限り、`AndroidManifest.xml`に以下の記述を追加することでガーディアンを無効化出来ます
    - `<uses-feature android:name="com.oculus.feature.BOUNDARYLESS_APP" android:required="true" />`

# おわりに
MRUKには今回使用した機能以外にもたくさんの機能があります。
例えば、オブジェクトを出現させられそうな空きスペースを検索するなどです。
今後も追加されると思うので随時このテンプレートも対応させていきます。
minicomを使用したCiscoスイッチのホスト名変更

実機を触りたいな〜。
ということで入手できたので動作確認も含めて触っていきたいと思います。

# 使用するもの
PC OS:Ubuntu 22.04.4 LTS
Ciscoスイッチ:Cisco Catalyst 2960
コンソールケーブル:USB-RJ45シリアルケーブル
# コンソールケーブルの接続
スイッチの電源はオフの状態でPCとスイッチを接続します。
接続が完了したらスイッチの電源をオンにしてください。
![コンソール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/c9c2f2d4-28d2-0db9-4cbf-a571c4727fe2.jpeg)
# デバイスの確認
- ターミナルを開いて``sudo dmesg | grep ttyUSB``を実行します。
``［12345.678901］〜〜〜〜ttyUSB0``といった出力があればシリアル変換アダプタが``ttyUSB0``として認識されています。
# minicomの設定
- Ubuntuにminicomをインストールします。
``sudo apt-get install minicom``
- 設定メニューを開き「シリアルポート」を選択します。
``sudo minicom -s``
![設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/b26d615b-fe29-4c8b-92a0-9dc016c2f660.png)
- 各種設定をします。
シリアルデバイスは「デバイスの確認」で出力されたものを使用してください。
![設定３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/0b3d0355-da0b-b1a9-b5ea-d5fb4d0f07cb.png)
- 設定を保存して終了します。
# minicomの起動
- minicomを起動します。
``sudo minicom``
``Switch>``が表示されることを確認してください。
# ホスト名の変更
- 特権モードに移行します。
 ``Switch> enable``
 - グローバルコンフィギュレーションモードに移行
 `` Switch# configure terminal``
 - ホスト名の設定
 `` Switch(config)# hostname ◯◯◯◯``
 ![ホストネーム変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803710/442ddff0-b67f-1bb4-34b2-a2b371afccca.png)

以上で設定完了です！

# 最後に
今回スイッチとルーターをボーナスで購入して、ケーブルなどは知人に購入していただきました。
本当に感謝しかありません。
周りに支えていただきながら学習できていることを改めて実感いたしました。
「そんな機械どこに置くの!?」「電気代は!?」などと質問攻めにはあいましたが、なんとか実機に触れることができて良かったです。はい。
ありがたいことに最近バタバタしているので、ペースは落ちるかもしれませんが実機を使用して色々とやっていきたいと思います！
AWS Jr.Championsに選出されました


## はじめに
初めまして社会人2年目のBigJunです。この度、AWS Jr.Championsに選出されました！本記事では私の経験やこのプログラムについて、また今後の目標を共有したいと思います。

## AWS Jr.Championsとは
AWS Jr.Championsは、AWS Partner Network (APN) 参加企業に所属し、社会人歴1～3年目で突出したAWS活動実績を持つ若手エンジニアに対する表彰プログラムです。2024年度はなんと日本全国から95名の方々が選出されました。
### プログラムの特典
- Japan AWS Jr. Champions 限定 Meetup に招待され、コミュニティ活動への参加権
- 他企業のJapan AWS Jr.Championsとの交流
- 特別セミナー、Lightning Talk、Workshop等、インプットとアウトプットの機会

## 応募のきっかけ
#### AWSに興味を持った理由
一昨年の就職活動中に多くの面接官が「クラウド分野に注目している」と話していたことです。当時、IT未経験者だった私はクラウド技術について徹底的に調べ始めました。その結果、AWSやAzureなどのサービスが市場で拡大していることを知り、特に市場規模が最も大きいAWSについて学びたいと考えるようになりました。

#### これまでの学びや経験
私は2023年にIT企業へ入社し、1年半にわたりAWSを学んできました。これまでにAWS認定資格を計6つ取得しています。また、AWSを活用した外部公開ウェブサイトの構築、設計、運用、保守の案件にも1年間従事しています。

## 選考されるには
Japan AWS Jr. Championsを選出するうえで、資格取得するだけでなく積極的なアウトプットが求められ、他者に影響を与えられるような人材を高く評価しています。実際にAWSの[ウェブページ](https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-jr-champions-criteria/#:~:text=Japan%20AWS%20Jr.%20Champions%20%E3%81%B8,%E3%81%8C%E6%9C%9F%E5%BE%85%E3%81%95%E3%82%8C%E3%82%8B%E6%96%B9)にも以下のように記載されています。


:::note info
### Japan AWS Jr. Champions への期待
2024 Japan AWS Jr. Champions の皆様には、AWSのスキルをさらに向上させることを期待しています。外部への発信を行う人材としての成長も期待しています。
- この施策は、以下のような方を対象にしています：
  - 自らの学びや経験をアウトプットし、積極的にコミュニティへ貢献できる方
  - AWSに関する知識や経験を積極的に発信し、若手のロールモデルとなれる方
  - 技術力を高め、次のステップとして AWS Top Engineers への選出を目指す方
  - 将来的に AWS Ambassadors へのステップアップが期待される方
:::

応募するにあたって以下の内容を自分の経験から記載することを求められます。

:::note info
- **Challenge**: AWS に関して実践してきたチャレンジ (500 文字以内)。
例えば、AWS の技術的な挑戦や、新しいことへのチャレンジなどです。
- **Influence**: 周囲に与えた影響 (500 文字以内)。
例えば、コミュニティのリードや、自ら起点となって発信しているかなどです。
- **Output**: アウトプットを通じた周囲への貢献 (500 文字以内)。
例えば、勉強会や発表、外部イベント登壇、社内トレーニング整備などです。
:::

私がAWSから評価され、AWS Jr.Championsに選出頂いたのは以下の理由だと考えています。

- 自己学習でインプットしたことを活かし、案件でお客様に提案するというアウトプットに繋げたこと
- 上級資格を含むAWSの認定資格を計5つ取得を5カ月間で達成したこと

※評価される内容は様々であり、勉強会などで多く登壇して、選ばれている人もいましたので、案件でAWSを触っていない方も選ばれると思います。

## 今後の目標
選出されたことを踏まえ、今後の目標や挑戦について考えています。

- AWSに関する知識をさらに深める
- 来年度のAWS Jr.Champioinsが自社から2人選出されるために活動する
- 勉強会に参加やブログ投稿を通じて、アウトプットする機会を増やす
【flutter】リア友管理アプリ～Crystal～の開発

```mermaid
mindmap
root(me)
	friendA
		leaf
	friendB
		leaf
		leaf        
	friendC
		friendC
        		friendC

		leaf
		leaf
		leaf        
		leaf
		leaf
		leaf
		leaf
		leaf        
		leaf
		leaf
		leaf        
```


## どんなアプリなのか？
* Crystal・・・水晶を保持し、結晶のように友人を広げるアプリ

## なぜ思いついたか？
* 社会から隔絶された人間を排除するため。
* 知らない人からの迷惑メッセージをなくすため。
* 真っ当な友人を明確にするため。

## どんな機能があるのか？
* 友人の連絡先を管理できる。ただし、連絡先を交換できるのは、近接した場合のみ
* 友人の友人が視覚的にわかる。関係性マップを作成
* 友人の友人とのチャットは、友人の許可があれば可能。

## LINEやFaceBookと異なる点はなにか？
* Flutter

## 何で実装するのか？
* Flutter
* DB→？

### メモ

マスター・・・リンクシェル作成者
・メンバー勧誘
・リーダー/メンバー除名
・LS解散
・LS名称変更
・リーダー設定
・リーダー解除
リーダー・・・パールサックをもつ
・メンバー勧誘
・メンバー除名
メンバー・・・リンクシェルをもつ
既存のローカルプロジェクトをgitを使ってネットワークフォルダ上でバージョン管理する

# はじめに
Visual Studioのgit機能においてリモートリポジトリを登録後、
pushをしたところエラーが出てしまい、原因が分からず
最初から作り直すことになったので備忘録として残します。
Windowsにおける共有フォルダ(UNCパス上)に
リモートリポジトリを作成して登録し、pushするまでを記事にしました。

# 実施内容
## Visual Studio内リポジトリを作成
### ローカルリポジトリを作成
Visua Studioのgit機能を使用してローカルリポジトリのみを作成
コマンドから作成する方法は下記を参考

https://qiita.com/fujisawatk/items/ae7e7752be228cf82b1f

## UNCパス(サーバー上のファイル)にリモートリポジトリを作成  
### 作成したディレクトリに移動  

```
cd Z:\test\eposA
```
### gitフォルダを作成

```
mkdir git
```

### Gitリポジトリを作成  

```
git init --bare --shared
```
:::note info
bareオプションを使用すると、ベアリポジトリを作成します。
ベアリポジトリとは、ワークディレクトリを持たないリポジトリで、bareは｢裸の｣や｢むき出し｣を意味します。
git initでDIR環境が設定されていない場合、現在のワークディレクトリに設定されます
:::

:::note info
sharedオプションを使用することで、すべてのユーザーがこのリポジトリにpushできるよう設定します
:::

Gitコマンドリファレンス（日本語版）は以下です。

https://tracpath.com/docs/git-init/

## リモートリポジトリを登録
### ローカルリポジトリの作成ディレクトリに戻る

```
cd C:\work\projA
```

### リモートリポジトリを登録・プッシュ

```
git remote add origin Z:\test\reposA\.git
git push origin master
```


# 発生した問題
## UNCパスをドライブ割り当てしたけど、Z:コマンドで移動できない
Windowsのセキュリティの制約か、UACを設定してローカルグループポリシーエディタを開く  
「Windowsの設定」→「ローカルポリシー」→「セキュリティオプション」→「ローカルアカウントの権限」で「UACの動作を変更」

### レジストリエディタにて「EnableLinkedConnections」を構成
レジストリエディタを開く。 
**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Systeml**に移動
「新規」>「DWORD(32ビット)値」を選択して「EnableLinkedConnections」を作成。
編集ウィンドウで、値のデータフィールドに「1」を設定。
PC再起動。 

```
EnableLinkedConnections=1
```

https://www.partitionwizard.jp/disk-recovery/the-system-cannot-find-the-drive-specified.html



---

# git commit時にエラー
```
error: pathspec 'commit" did not match any file (s) known to git
```

## 解決策
コメント部分はダブルクォーテーションで囲みます。
```
git commit -m "first commit"
```

https://qiita.com/muramasa2/items/e10dbe0e0064c1f117b3
【備忘録】JavaでBase64エンコード/デコード

## 背景
今まで社内のExcelマクロでBase64のエンコードデコードを行ってきたが、これがJavaでもできることを知った。忘れないようにここに記す。
## 手法(Java8移行)
### エンコード
1.`java.util.Base64`をインポートする。
2.`Base64.getEncoder().encodeToStting();`でString型にエンコード

### デコード
1.`java.util.Base64`をインポートする。
2.`Base64.getDecoder().decode()`でエンコードされたString型をデコード

## 具体例
```
import java.util.Base64;

public class Main {
    public static void main(String[] args) {
        // 例として、元のバイト配列
        byte[] bin = "サンプルテキスト".getBytes(); // 文字列をバイト配列に変換

        // Base64でエンコードしてString型に変換
        String Bin = Base64.getEncoder().encodeToString(bin);
        System.out.println("Base64 Encoded: " + Bin);

        // Base64でエンコードされたStringをデコード
        byte[] decodedBytes = Base64.getDecoder().decode(Bin);

        // byte[]をString型に変換
        String decodedString = new String(decodedBytes);
        System.out.println("Decoded String: " + decodedString);
    }
}
```
### 出力結果
```
Base64 Encoded: 44OG44K544OI44Gn44GZ44CC44GT44Go44GE44Gf
Decoded String: サンプルテキスト
```
REST API、http/httpsとはなんぞや【Web】

## REST API
### 概要
REST API（RESTful API）とは、Webシステムを外部から利用するためのプログラムの呼び出し規約（API）の種類の一つです。

**HTTPプロトコルを利用してデータを操作する方法を定義しています。**
**操作の内容は、リソースの…取得（GET）、作成（POST）、更新（PUT）、削除（DELETE）などです。**

### 特徴
- リソースの識別: URL/URIでリソースを一意に識別してデータ操作を行います。
【イメージ】
　GET（ユーザーID 123の情報を取得）: https://api.example.com/users/123
- リクエストとレスポンス: クライアントがHTTP（またはHTTPS）で要求（リクエスト）を送信し、応答（レスポンス）がXML、HTML、JSON、CSV、プレーンテキストなどで返されます。

### HTTPプロトコル
- HTTP（HyperText Transfer Protocol）は、Web上でデータを送受信するためのプロトコルです。
- HTTPS（HTTP Secure）は、HTTPにセキュリティ機能を追加したもので、データの暗号化や認証を提供します。（データのやり取りをおこなう双方で証明書をもつイメージです。）
TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.の解決方法


## はじめに

fetch した script, css, html を挿入するときに上記のようなエラーが発生したので、その原因と解決方法をまとめます。

## 発生した問題

まず以下のようなコードでエラーが発生しました。

```ts
try {
  const res = (await fetch(url)).json();

  if (res.style) {
    document.head.appendChild(res.style); // ←ここでエラー
  }

} catch (error) {
  console.error("データの取得中にエラーが発生しました:", error);
}
```

appendChildメソッドは`Node.appendChild<HTMLScriptElement>(node: HTMLScriptElement): HTMLScriptElement`という定義がなされています。

resはjsonでparseしているのでそのままだとstring型で返ってきます。
そのため、当然HTMLScriptElementではないという型エラーが発生します。

## 解決方法

解決方法としてはいくつかあるのですが、自分はinsertAdjacentHTMLメソッドを使用することで解決しました。

```ts
try {
  const res = (await fetch(url)).json();

  if (res.style) {
    document.head.insertAdjacentHTML('beforeend', res.style);
  }

} catch (error) {
  console.error("データの取得中にエラーが発生しました:", error);
}
```

insertAdjacentHTMLメソッドとは、string型になっているHTMLやXMLを解釈して、指定した場所に挿入するメソッドです。

まさに今回のようなパターンで使えるメソッドだと思います。

## 参考資料

 
https://developer.mozilla.org/ja/docs/Web/API/Element/insertAdjacentHTML
 

https://developer.mozilla.org/ja/docs/Web/API/Node/appendChild
Rspec で特定種類のテストだけを対象に before / after を設定する例

# 例

system test の全てのテストケースを対象に `before(:each)` の処理をさせる場合

`rails_helper.rb` に以下を設定

```rb
RSpec.configure do |config|
  config.before(:each, :type => lambda { |spec_type| spec_type == :system}) do
   ...
  end
end
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
Gemini API ― File Upload/画像認識

# 概要
- [Gemini編 - 総目次](https://qiita.com/search?sort=&q=tag%3AGemini++user%3Ashokkaa)

(日記)前回

https://qiita.com/shokkaa/items/a74bb2f9a3e843430530

の続き。Geminiに画像の説明などを求める。

# 環境
- Ubuntu 24.04
- Node.js v22.4.1

# ファイルをアップロード
画像などのファイルをGeminiにアップロードする。
```js:src/fileUpload.ts
import { FileMetadata, GoogleAIFileManager } from "@google/generative-ai/server"
async function main() {
    const file = process.argv[2]
    const fileManager = new GoogleAIFileManager(process.env.GOOGLE_API_KEY ?? "")
    const metaData: FileMetadata = { mimeType: "image/jpeg", displayName: `Image file '${file}'` }
    const uploadResponse = await fileManager.uploadFile(file, metaData)
    console.log(uploadResponse)
}
main()
```
```sh:ファイルアップロード
export GOOGLE_API_KEY=<your-api-key>
npx -y ts-node src/fileUpload.ts aaa.jpg 
```
```yaml:結果(部分)
{  file: { uri: 'https://generativelanguage.googleapis.com/v1beta/files/b7v8vds91atw', ...}}
```
ファイルの寿命は48h

# インラインファイル
```ts:src/chatAboutFiles.ts
import { GoogleGenerativeAI, Part, FileDataPart } from "@google/generative-ai"
async function main() {
    const url = process.argv[2]
    const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY ?? "")
    const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" })
    const files: Array<Part> = [{ fileData: { fileUri: url, mimeType: "image/jpeg" } },]
    const chat = model.startChat()
    async function qa(q: string) {
        const a = await chat.sendMessage(q)
        console.log(`Q: ${q}`)
        console.log(`A: ${a.response.text()}`)
        console.log(a.response.usageMetadata)
    }
    await chat.sendMessage(files)
    await qa("画像を20文字で説明して")
    await qa("カード上の透かし文言は何")
}
main()
```
```sh:実行
npx -y ts-node src/chatAboutFiles.ts https://generativelanguage.googleapis.com/v1beta/files/b7v8vds91atw
```
ファイルはGemini上のURLで指定される
```:結果
Q: 画像を20文字で説明して
A: バトルスピリッツの新弾「全天の覇神」が10月26日発売！
{
  promptTokenCount: 372,
  candidatesTokenCount: 21,
  totalTokenCount: 393
}
Q: カード上の透かし文言は何
A: カード上の透かし文言は「SAMPLE」です。
{
  promptTokenCount: 404,
  candidatesTokenCount: 12,
  totalTokenCount: 416
}
```

[ソースコード](https://github.com/kyoya-p/samples/tree/master/2024/Gemini/GemCode5_FileUpload)


# 参考

サンプル画像(XよりTCGバトルスピリッツのカード紹介): https://pbs.twimg.com/media/GXpZw6casAAbMCX?format=jpg&name=4096x4096
EclipseでMinGW(gcc)を切り替える

##EclipseでMinGW(gcc)を切り替える
Eclipseは有名なIDEですが、Windows OSでC言語やC++言語の記事が少なかったのでまとめてみました。

Eclipseは、日本語化してます。2024-09.20240917版です。
https://willbrains.jp/

###MinGW GCC
本家
https://www.mingw-w64.org/
リスト
https://www.mingw-w64.org/downloads/

MinGWは、いろいろありますが、下記を使用しました。
MinGW-W64-builds
https://github.com/niXman/mingw-builds-binaries/releases

どれを使えばわからない場合
とりあえず Windows 10 or later 前提であればUCRTにします.
msvcrt は古い Windows version(e.g. Vista)用です.

1. アーキテクチャ (Architecture)
x86_64　: 64ビット版のWindows用。
        　最新のコンピュータで一般的に使用される。
i686　: 32ビット版のWindows用。
        　古い32ビットOSや互換性が必要な場合に使用する。
         64ビットシステムを使用している場合は x86_64 を選択すべきです。

2. スレッドモデル (Thread Model)
posix　: POSIXスレッドモデルを使用します。
これは標準的なPOSIX互換のスレッドライブラリで、クロスプラットフォームのコードに適しています。
win32　: Windowsのネイティブなスレッドモデルを使用します。
Windows固有のAPIを使うプログラムに最適です。

3. Cランタイムライブラリ (C Runtime Library)
seh (Structured Exception Handling) : 64ビットアーキテクチャの例外処理メカニズムとして使用され、最新のWindowsで推奨されます。
sjlj (Setjmp/Longjmp) : 例外処理のために少し古い方法を使用します。32ビット環境で使用されることが多いです。
dwarf (DWARF) : 32ビット環境でのデバッグ情報フォーマット。64ビットには対応していません。
x86_64ではseh、i686ではsjljまたはdwarfを選ぶのが標準です。

4. ビルドシステム
UCRT (Universal C Runtime) : 新しいCランタイムで、Windows 10以降で広くサポートされています。Windows APIの互換性を向上させるため、最新のWindows開発ではこれが推奨されます。
msvcrt (Microsoft C Runtime): 古いCランタイムライブラリです。互換性が必要な場合に使用しますが、UCRTの方が一般的に推奨されます。

###Eclipse初期のGCC
---\eclipse\mingw にあり、下記バージョンでした。
x86_64-8.1.0-release-posix-seh-rt_v6-rev0
gcc  --version
```
gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
```

###今回ダウンロードしたGCC
(1) x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0
gcc --version
```
gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-Builds project) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
```

(2) x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev0
gcc --version
```
gcc.exe (x86_64-win32-seh-rev0, Built by MinGW-Builds project) 14.2.0
```
##Eclipseの設定
初期状態では、eclipseフォルダ内にあるgcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0が使用されます。
プロジェクト作成後、コンパイラをその都度設定しても良いのですが、面倒です。
今回は、上記でダウンロードした（１）gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-Builds project) 14.2.0をプロジェクト作成時に指定されるように設定したいと思います。

ただし、GDBは、Eclipseのシステム（全体）設定からgdb.exeパスを再設定してください。

ポイントは、「設定する環境変数」「MINGW_HOME」です。
Windows OSの「環境変数を編集」
Eclipseの設定は触らず、ユーザーまたはシステムに設定します。
環境変数　MINGW_HOME　に
 ---\x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0\mingw64
 を設定します。
 さらに「PATH」を追加します。
 %MINGW_HOME%\bin
 
プロジェクトこどにバージョンを変えたい、PATHに追加したくない、コマンドラインでは別なもの使いたいなどの場合は、Eclipseの設定でMINGW_HOMEを設定します。
Eclipseのシステム（全体）設定
![スクリーンショット 2024-09-25 081015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952982/b5587bb1-32a8-7e4b-d87e-a8966db81e86.png)

Eclipseのプロジェクトこど設定
![スクリーンショット 2024-09-25 081129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952982/3bb20134-202e-f571-86b2-2dfd2b152be4.png)

GDBの設定
![スクリーンショット 2024-09-25 081447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952982/e6c50d23-1792-f60f-8b33-7ef4edceb012.png)
AWS CLIのバージョン2をインストールしてもバージョン1のままになる問題の解決方法

## はじめに
AWS初学者です。
<br>

AWSの勉強をするのは未経験時代にポートフォリオを作成したとき以来です。
<br>

約2年ぶりに学習を再開する際、AWS CLIのバージョンをアップグレードするのに手間取ってしまったため、備忘録としてまとめます。

## AWS CLIをバージョン2にアップグレードできない

ぼくのPCにはAWS CLIのバージョン1がインストールされていました。
<br>

```bash
$ aws --version
aws-cli/1.34.10 Python/3.10.2 Darwin/23.4.0 botocore/1.35.10
```
<br>

バージョン2へアップグレードするため、[公式ドキュメントの手順](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)にしたがって以下の2つのコマンドを実行します。
<br>

```bash
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
```
<br>

しかし上記のコマンドを叩いた後も手元の環境ではバージョン1のままです。
<br>

```bash
$ aws --version
aws-cli/1.34.10 Python/3.10.2 Darwin/23.4.0 botocore/1.35.10
```
<br>

ターミナルの再起動などをしても状況が変わらなかったため、対応に時間がかかりました。

## 原因と解決策

AWS CLIのバージョン1をアンインストールした上で再度バージョン2をインストールしたところ、問題が解消されました。
<br>

具体的には以下のコマンドを順番に実行しました。
<br>

```bash
$ pip uninstall awscli
Found existing installation: awscli 1.34.10
Uninstalling awscli-1.34.10:
  Would remove:
    /Library/Frameworks/Python.framework/Versions/3.10/bin/aws
    /Library/Frameworks/Python.framework/Versions/3.10/bin/aws.cmd
    /Library/Frameworks/Python.framework/Versions/3.10/bin/aws_bash_completer
    /Library/Frameworks/Python.framework/Versions/3.10/bin/aws_completer
    /Library/Frameworks/Python.framework/Versions/3.10/bin/aws_zsh_completer.sh
    /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/awscli-1.34.10.dist-info/*
    /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/awscli/*
Proceed (Y/n)? y
  Successfully uninstalled awscli-1.34.10
$ sudo installer -pkg ./AWSCLIV2.pkg -target /
installer: Package name is AWS Command Line Interface
installer: Upgrading at base path /
installer: The upgrade was successful.
```
<br>

これでバージョン2へアップグレードできました！
<br>

```bash
$ aws --version
aws-cli/2.17.56 Python/3.12.6 Darwin/23.4.0 exe/x86_64
```
<br>

バージョン1のインストールではpipを使用していたのに対し、バージョン2では.pkgファイルを用いてインストールを試みたため、競合が発生していたようです。
<br>

AWSのトラブルシューティング用のドキュメントにこの記事のケースについて記載がありました。
<br>

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-troubleshooting.html#tshoot-uninstall-multiple-version

## おわりに

わかってしまえば些細なことですが、新たな領域を学習する際はこういった初歩的な問題に苦戦することが予想されます。
<br>

インプットとアウトプットを繰り返し、焦らず着実に一歩ずつ歩みを進めていきます！
複数の日付の列を比較して最古の日付を特定する(SPSS Modeler データ加工逆引き1-23)

# 複数の日付の列を比較して最古の日付を特定する

![スクリーンショット 2024-09-17 8.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9274d4b3-acaf-2e9c-2813-8f460b1e21e4.png)


## 1.想定される利用目的

・イベントの特定
・日付を利用した特徴量の作成

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/date_compare.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-09-17 8.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/eb99ff2d-2508-73f3-fe00-6546bbab4b4e.png)

a.入力するデータは以下の通りです。

![スクリーンショット 2024-09-17 8.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/57822169-2f0b-68e4-0610-477a62c119e9.png)

b.[フィールド作成]ノードを編集します。@&#xFFF0;FIELDはワイルドカードです。複数のフィールドを同時に処理することが可能です。datetime_in_secondsは基準日1900年1月1日の０時０分０秒からの秒数を求める関数です。

![スクリーンショット 2024-09-17 8.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d734eafe-a5e3-4478-5f44-8aa933744de5.png)

[式ビルダー]ボタンを起動して日付関数から探すと便利に設定できます。

![スクリーンショット 2024-09-17 8.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/23e91853-f943-88b8-b62f-d53c745c7b6e.png)

　[ブレビュー]します。

![スクリーンショット 2024-09-17 8.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bf09c451-83c6-bb2e-0108-eb124f3dac72.png)

c.[フイールド作成]ノードを編集します。@&#xFFF0;FIELDS_BETWEEN(A,Z)でA列からZ列までをリストとして定義でき、min_nで最小値を選択できます。

![スクリーンショット 2024-09-17 8.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4425a726-e9e6-c16e-6f4b-6db6433de3eb.png)

d.[フィルター]ノードを編集します。

![スクリーンショット 2024-09-17 8.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/750e80b1-46d4-bf20-cf75-d6267c06805c.png)

　[テーブル]を実行します。

 ![スクリーンショット 2024-09-17 8.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/68e66db3-1537-de8d-4e41-61eb75de35f7.png)

#### 注意事項

比較するべき列が２列の場合にはmin(A,B)を利用します。

## 4.参考情報

#### タイムスタンプの差の計算

https://qiita.com/kawada2017/items/8e1291801aacf5427e7d

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Pythonで辞書の値の合計を求める

# 辞書とは
辞書とは**キーと値のペアでデータを保持するデータ構造**です。
Rubyでいうところの連想配列（ハッシュテーブル）にあたります。リストやタプルの場合、データ（値）の数が多くなるとどれがどのデータ（値）だったか調べるのが難しくなります。

その点、辞書はデータ（値）をキーで管理できるためどのデータなのか判別しやすいという利点があります。

# Pythonで辞書の作成
Pythonで辞書を作成するのには複数のやり方があります。

やり方１：キーと値を個別に指定
~~~Python:dict_create1.py
# 以下のように波括弧{}の中に「キー: 値」のように記述すると辞書が作成されます。
scores = {"ネットワーク": 60, "データベース": 80, "セキュリティ": 55}
print(scores) #{"ネットワーク": 60, "データベース": 80, "セキュリティ": 55}
~~~
やり方2 : dict型のコンストラクタdict()を使う
~~~Python:dict_create2.py
# キーワード引数キー=値を指定するとキーと値がそれぞれ登録されます。
scores = dict(ネットワーク=60, データベース=80, セキュリティ=55)
print(scores) #{"ネットワーク": 60, "データベース": 80, "セキュリティ": 55}
~~~

# 辞書の値の合計を求める
ここからが本題なのですが、辞書の値の合計を求めるには次のように記述します。
まず**valuesメソッドで辞書の値を取得してから**、sum関数を使います。
~~~Python:dict_sum.py
scores = {"ネットワーク": 60, "データベース": 80, "セキュリティ": 55}
total = sum(scores.values()))
print(total) #195
~~~
Lightning Experience の切り替えの成功の測定

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

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

+ [Lightning Experience の切り替えの成功の測定](https://help.salesforce.com/s/articleView?id=sf.lex_measure_success.htm&type=5)
+ [Get Lightning Experience Adoption Insights with the Lightning Usage App](https://admin.salesforce.com/blog/2018/lightning-usage-app)
+ [Lightning Experience Performance Optimization](https://trailhead.salesforce.com/content/learn/modules/lightning-experience-performance-optimization)

Lightning Usage アプリケーションで使用できる総計値を次に示します。

+ Lightning Experience および Salesforce モバイルアプリケーションの日次および月次の有効ユーザー数
+ 切り替えの合計数と切り替えた一意のユーザー数ごとの日次および月次の Salesforce Classic への切り替え数
+ 最も多く Salesforce Classic に切り替えたプロファイルおよびユーザー
+ Lightning Experience および Salesforce モバイルアプリケーションへのアクセスに使用されたブラウザーの種類
+ 最も遅いデスクトップレコードページ
+ Lightning Experience で最も頻繁に表示されたページ
+ 有効なユーザー、機能、権限セットライセンスの数

# 質問

+ [How can I check the utilization of each App Launcher?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ertF1)

Usage Appでは測定できないんだけどな
C++言語用のMakefileテンプレート

#Windows MinGW GCC(c++)用のMakefileテンプレート

ひな型は、AIで作成したものを修正しました。
Windows OS MinGW
実行ファイルはa.exeで、デバッグ用はdebug.exeです。
不要なオプションがあると思います。随時更新したいと思います。


```
# AtCoder Makefile
# main.cpp a.exe
#

# コンパイラとフラグの設定
CXX = g++.exe
CXXFLAGS = -Wall -Wextra -std=c++20 -O2 -march=native
CXXFLAGS += -finput-charset=UTF-8 -fexec-charset=CP932
# CXXFLAGS += -static-libgcc -static-libstdc++
CXXFLAGS += -Wuninitialized -fverbose-asm -fdiagnostics-color=always
# CXXFLAGS += -fsanitize=undefined

# デバッグ用のフラグ
DEBUG_FLAGS = -g3 -D_GLIBCXX_DEBUG -Wall -Wextra 
DEBUG_FLAGS += -O0 -std=c++20 -march=native
# DEBUG_FLAGS += -fsanitize=address  # ASanを有効にする場合 
DEBUG_FLAGS += -Wuninitialized
# DEBUG_FLAGS += -static-libgcc -static-libstdc++

# インクルードパスとライブラリパス
INCLUDE_DIRS = -IC:/Users/etsuk/ac-library
# LIBRARY_DIRS = -L/path/to/lib -L/path/to/another/lib
# LIBRARIES = -lmylib -lanotherlib

# 実行ファイルの名前
TARGET = a.exe
DEBUG_TARGET = debug.exe  # デバッグ用の実行ファイル

# ソースファイルとオブジェクトファイル
SRCS = main.cpp
OBJS = $(SRCS:.cpp=.o)
DEBUG_OBJS = $(SRCS:.cpp=.debug.o)
ASM_FILES = $(SRCS:.cpp=.s)
PREPROCESSED_FILES = $(SRCS:.cpp=.i)

# ビルド対象
all: $(TARGET)
# all: $(TARGET) $(ASM_FILES) $(PREPROCESSED_FILES)

# 実行ファイルのリンク
$(TARGET): $(OBJS)
	$(CXX) $(CXXFLAGS) $(LIBRARY_DIRS) -o $(TARGET) $(OBJS) $(LIBRARIES)

# 各.cppファイルをコンパイルして.oファイルを生成
%.o: %.cpp
	$(CXX) $(CXXFLAGS) $(INCLUDE_DIRS) -c $< -o $@

# デバッグ用コンパイル
debug: $(DEBUG_TARGET)

$(DEBUG_TARGET): $(DEBUG_OBJS)
	$(CXX) $(DEBUG_FLAGS) $(INCLUDE_DIRS) -o $(DEBUG_TARGET) $(DEBUG_OBJS)

# デバッグ用オブジェクトファイルを生成
%.debug.o: %.cpp
	$(CXX) $(DEBUG_FLAGS) $(INCLUDE_DIRS) -c $< -o $@

# デバッグ実行
debug-run: $(DEBUG_TARGET)
	./$(DEBUG_TARGET)

# 各.cppファイルをコンパイルして.sファイルを生成
%.s: %.cpp
	$(CXX) $(CXXFLAGS) $(INCLUDE_DIRS) -S $< -o $@

# 各.cppファイルをプリプロセッサのみ実行して.iファイルを生成
%.i: %.cpp
	$(CXX) $(CXXFLAGS) $(INCLUDE_DIRS) -E $< -o $@

# 実行ルール
run: $(TARGET)
	./$(TARGET)

# アセンブリファイルを生成
asm: $(ASM_FILES)

# プリプロセッサ出力を生成
preprocess: $(PREPROCESSED_FILES)

# ojtest
ojtest: $(TARGET)
	oj test

# クリーンアップ
clean:
	rm -f $(OBJS) $(TARGET) $(DEBUG_TARGET) $(DEBUG_OBJS) $(ASM_FILES) $(PREPROCESSED_FILES)

# .PHONYターゲット
.PHONY: all clean asm preprocess debug debug-run
```
EC2インスタンスタイプを変更した場合にDNSサーバの設定が初期化される事例について

# 【本記事を作成した意図】
以下記事にて、EC2 Windowsにて、m4.xlargeからr4.largeに変更したところ、参照先となるDNSサーバの設定がリセットされるという事象が発生した。原因はインスタンスタイプ変更にともない、ネットワークアダプタが変更されたことで、その結果ネットワークアダプタに対して設定していた参照先DNSサーバの設定が無効になったとのことだ。

記事について、2020年に投稿された記事であり、2024年9月でも同じ事象が発生しているのか、確認したく、AWSサポートに質問した。

[EC2 Windowsでインスタンスタイプを変更したらDNSサーバ設定がリセットされた話]
https://dev.classmethod.jp/articles/ec2-windows-dns-server-setting-reset-by-changing-instance-type/

# 【質問内容】
## ・背景

参考記事にて、EC2 Windowsで、m4.xlargeからr4.largeに変更したところ、参照先となるDNSサーバの設定がリセットされるという事象が発生。原因はインスタンスタイプ変更にともないネットワークアダプタが変更されたことで、その結果ネットワークアダプタに対して設定していた参照先DNSサーバの設定が無効になったとのこと。

## ・質問

① 【背景】で説明させて頂いた事象は、現在も発生する認識で相違ないか。

② Windows・Linuxにて、上記事例以外にもインスタンスファミリーを変更することで、設定が初期化されてしまう事例があるのか。

# 【AWSサポートからの回答(要約)】

## ■ 質問 1 への回答

m4.xlarge -> r4.large のインスタンスタイプの変更に伴うネットワークアダプターの切り替えは現在も発生する。こちらの影響により、参照先 DNS サーバー等のネットワーク設定がリセットされる。

資料 [1] の内容通り、m4.16xlarge を除く m4 インスタンスではネットワークアダプターは Intel 82599 Virtual Function (VF) が使用される一方で、r4 インスタンスでは Elastic Network Adapter (ENA) が使用される。
このような Intel 82599 VF から ENA への変更の場合において、ネットワークアダプターの切り替えが発生する [2]。
その他の場合においても、ネットワークアダプターの切り替えが発生する可能性があるため、インスタンスタイプを変更いただく際は検証等で事前にご確認して欲しい。

## ■ 質問 2 への回答

インスタンスタイプの変更に伴い設定が初期化される事例について調査したが、ネットワーク設定以外の初期化される項目の発見出来なかった。
しかしながら、OS 内部の設定の初期化に関してはお客様の環境に大きく依存するため、事前に検証環境等でインスタンスタイプの変更を実施して、検証して欲しい。
資料 [2] にてインスタンスタイプの互換性について記載があるので、インスタンスタイプを変更する際は参照。

また、旧世代のインスタンスタイプである m4.xlarge または r4.large を利用しており、現行世代のインスタンスタイプに変更する際は、ドライバーのアップグレード等の作業が必要になる。
こちらについては、資料 [3] をご参照。

:::note info
■ 参考資料
[1] Amazon EC2 インスタンスでの拡張ネットワーキング
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/enhanced-networking.html 

Elastic Network Adapter (ENA)
    Elastic Network Adapter (ENA) は、サポート対象のインスタンスタイプに対して最大 100 Gbps のネットワーク速度をサポートします。
    AWS Nitro System 上に構築されたインスタンスはすべて、ENA を使用してネットワークを強化しています。さらに、H1、I3、G3、m4.16xlarge、P2、P3、P3dn、R4 の Xen インスタンスタイプは ENA をサポートしています。
Intel 82599 Virtual Function (VF) インターフェイス
    Intel 82599 Virtual Function インターフェイスでは、サポートされているインスタンスタイプについて最大 10 Gbps のネットワーク速度がサポートされています。
    インスタンスタイプ C3、C4、D2、I2、M4 (m4.16xlarge を除く)、R3 では、拡張ネットワーキングに Intel 82599 VF インターフェイスが使用されます。


[2] インスタンスタイプ変更の互換性
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/resize-limitations.html 

ネットワークアダプター
    ドライバーのネットワークアダプターを別のネットワークアダプターに切り替えると、オペレーティングシステムが新しいアダプターを作成したときに、ネットワークアダプターの設定がリセットされます。設定を再構成するには、管理者権限を持つローカルアカウントへのアクセスが必要な場合があります。ネットワークアダプターを別のネットワークアダプターに切り替える例を次に示します。
        - AWS PV (T2 インスタンス) からインテル 82599 VF (M4 インスタンス)
        - インテル 82599 VF (ほとんどの M4 インスタンス) から ENA (M5 インスタンス)
        - ENA (M5インスタンス) から高帯域幅の ENA (M5nインスタンス)


[3] EC2 Windows インスタンスを現行世代のインスタンスタイプに移行する
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/migrating-latest-types.html 
:::
EC2インスタンスのAMI作成中にインスタンスを起動・削除した場合の挙動について

# 【本記事を作成した意図】
EC2インスタンスのAMI作成中にインスタンスを起動・削除した場合の挙動について、詳細に理解していなかったため、AWSサポートに質問してみた。

# 【質問】
① EC2停止後にAMI作成を行い、「保留中」のステータスの状態で、EC2を起動し、ファイル等の変更・削除・作成を行った場合でも、AMIは正常に作成できる認識。

この場合、EC2を停止した際の断面のAMIが取得される認識で相違ないか。

② EC2停止後にAMI作成を行い、「保留中」のステータスの状態で、EC2を終了したとしても、AMI取得は正常終了し、EC2を停止した際の断面のAMIが取得される認識で相違ないか。

③ ①・②の質問と関連するが、EC2停止後にAMI作成中にも関わらず、何故EC2に対して変更作業を行ったとしても、EC2を停止した際の断面が取得できるようになっているのか。

# 【AWSからの回答(要約)】
## ①の質問について
認識相違なし。

AMI は EC2 インスタンスの起動に必要な情報と EBS スナップショットの組み合わせから構成されている。
また EBS スナップショットの作成が開始された (pending 状態になった) 段階で静止点の確保が行われ、pending 状態の EBS スナップショットは、ボリュームに対する読み込み、書き込みの影響を受けない。[1]
すなわち AMI を作成された段階 (EC2 インスタンスが停止している段階) にて、静止点が確保される。

## ②の質問について

認識相違なし。
前述の通り AMI 作成時点で静止点が確保されているため。すなわち AMI 作成後の pendding 状態中に、AMI 取得元の EC2 インスタンスを終了した場合も、AMI の取得における API エラーなどは発生せず、停止した EC2 インスタンスに関するバックアップが取得される。

## ③の質問について
EC2 インスタンスが停止した状態の静止点、すなわち AMI 作成をリクエストされた時点の静止点は、AMI のステータスが pending となった時点で確保が完了しているため。
また、資料 [2] の記載通り、AMI ID が返された時点でスナップショットの静止点が確保されてるため、それ以降の操作 (EC2 インスタンスの終了など) は AMI 及び スナップショットに影響を与えない。
また、AMI 取得に関して上記以上に詳細な公開情報は確認できていない。

:::note info
■ 参考資料
[1] Amazon EBS スナップショットの作成
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html      

スナップショットは非同期に行われます。
ポイントインタイムのスナップショットはすばやく作成されますが、スナップショットが完了する (変更されたすべてのブロックが Amazon S3 に転送される) まで、スナップショットのステータスは pending です。
大きな初期スナップショットや、多数のブロックが変更されている後続のスナップショットの場合は、数時間かかることがあります。
この処理の完了中に、進行中のスナップショットはボリュームに対する継続的な読み取りと書き込みの影響を受けません。


[2] [AWS Black Belt Online Seminar] Amazon Elastic Block Store
https://d1.awsstatic.com/webinars/jp/pdf/services/20190320_AWS-BlackBelt-EBS.pdf#page=64 

バックアップと静止点
• Snapshotの作成を指示しレスポンスが返ってきたら、その時点のデータのバックアップが開始されている。


バックアップと静止点
• Snapshotの作成を指示しレスポンスが返ってきたら、その時点のデータのバックアップが開始されている。
• レスポンスが返ってきた時点でI/Oを再開して良いので、静止点を維持するのは短時間で済む
:::
Go言語でimport "C"をするとビルドできなくなる

## はじめに

GoでDLL ファイルを作ろうとした時にハマった点についてのメモです．

環境は以下のとおりです．

- Windows 11 Pro 23H2
- Go1.21.3

## 準備

`go mod init hoge`で module を作ります．

```:go.mod
module hoge

go 1.21.3
```

`main.go`は最低限で定義します．

```golang:main.go
package main

func main() {

}
```

ディレクトリ構造は次のようになります．

```
hoge
│  go.mod
│  main.go
```

ここで，`hoge`ディレクトリ内で以下のコマンドを実行すればビルドできます．windows 環境では`hoge.exe`が生成されます．

```powershell
go build
```

## 症状

Go で DLL を作る時，`"C"`を import します．

```golang:main.go
package main

import "C"

func main() {

}
```

DLL をビルドするためには以下のようにします．`-o hoge.dll`を抜くと，成功時に`hoge.dll`ではなく`hoge`が生成されたため，出力は指定します．

```powershell
go build -buildmode=c-shared -o hoge.dll
```

このコマンドを実行すると次のようなエラーが出ました．

```powershell
package hoge: build constraints exclude all Go files in C:\Users\Tsuyopon\gitFiles\dlltest
```

試しに`main.go`を指定して実行すると，`no Go source files`というエラーが出ました．

```powershell

go build -buildmode=c-shared main.go
go: no Go source files
```

## 原因

原因は`CGO_ENABLED`が 0 であることでした．

```powershell
go env CGO_ENABLED
0
```

## 解決策

以下のコマンドを実行します．

```powershell
go env -w CGO_ENABLED=1
```

再度確認すると設定が更新されていることがわかります．

```powershell
go env CGO_ENABLED
1
```

## 結果

再度以下のコマンドを実行すると`hoge.dll`が生成されました．

```powershell
go build -buildmode=c-shared -o hoge.dll
```
(Node.js) hh-mm-ssモジュールを理解する

# はじめに
node.jsのコードの中で hh-mm-ssモジュールを使用する機会があったので、どのようなモジュールであるのか簡単にまとめたいと思います。

# hh-mm-ssモジュールとは
時間の表現を管理するためのシンプルなライブラリです。
toMs, toS は、時間をそれぞれミリ秒、秒に変換する関数です。
fromMs, fromS は、ミリ秒や秒から「時間:分:秒」形式に変換します。

# サンプルコード
```javascript:hh-mm-ss.js
const TimeFormat = require("hh-mm-ss");

console.log(TimeFormat.toMs("00:01"));
console.log(TimeFormat.toS("02:00"));

console.log(TimeFormat.fromMs(3000));
console.log(TimeFormat.fromS(180));
console.log(TimeFormat.fromS(1800));
console.log(TimeFormat.fromS(18000));

const startTime = new Date();
console.log(`startTime: ${startTime}`);

setTimeout(() => {
  const endTime = new Date();
  console.log(`endTime: ${endTime}`);
  console.log(`Time difference in ms: ${endTime - startTime}`);
  console.log(
    `Time differencein in mm:ss: ${TimeFormat.fromMs(endTime - startTime)}`
  );
}, 2000);
```

・const TimeFormat = require("hh-mm-ss");
hh-mm-ss という外部パッケージを TimeFormat という名前でインポートしています。このパッケージは、時間を「時間:分:秒」形式に変換したり、その逆を行ったりする機能を提供します。


・console.log(TimeFormat.toMs("00:01"));
toMs("00:01") は、00:01 という時間（1秒）のフォーマットを、ミリ秒（1000ミリ秒 = 1秒） に変換します。結果は 1000 ミリ秒になります。

・console.log(TimeFormat.toS("02:00"));
toS("02:00") は、02:00（2分）のフォーマットを、秒 に変換します。結果は 120 秒です。

・console.log(TimeFormat.fromMs(3000));
fromMs はミリ秒から時間（mm:ss）形式に変換します。3000ミリ秒は 3秒なので、出力は "00:03" となります。

・console.log(TimeFormat.fromS(180));
fromS は秒を「時間:分:秒」のフォーマットに変換します。180 秒は 3分なので、出力は "03:00" となります。このようにhhの単位が必要でない時は、hhの部分は表示されません。

・console.log(TimeFormat.fromS(1800));
1800 秒は 30分、出力は "30:00"となります。

・console.log(TimeFormat.fromS(18000));
18000 秒は 5時間、出力は "5:00:00" となります。


・const startTime = new Date();
console.log(`startTime: ${startTime}`);
startTime は現在の時刻を取得するために new Date() を使っています。
console.log によって、現在の時間が表示されます。

・setTimeout(() => {
  const endTime = new Date();
  console.log(`endTime: ${endTime}`);
  console.log(`Time difference in ms: ${endTime - startTime}`);
  console.log(`Time difference in mm:ss: ${TimeFormat.fromMs(endTime - startTime)}`);
}, 2000);
setTimeout は2秒後に指定した関数を実行します。
2秒後、endTime という現在時刻を再度取得します。
endTime - startTime によって、2つの日時の差分をミリ秒で計算します。
TimeFormat.fromMs を使って、その差分を mm:ss 形式で表示します。

# 実行結果

![スクリーンショット 2024-09-24 16.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/3852951d-2531-4bb0-7fa3-33d54c63ff02.png)


# まとめ
node.jsのhh-mm-ssモジュールの使用方法についてまとめました。

# Reference

https://www.npmjs.com/package/hh-mm-ss
(Node.js) prettysizeモジュールを理解する

# はじめに
node.jsのコードの中でprettysizeモジュールを使用する機会があったので、どのようなモジュールであるのか簡単にまとめたいと思います。

# prettysizeモジュールとは
データのバイト数を人間が読みやすい形式に変換するための Node.js ライブラリです。ファイルサイズやデータの大きさを表示する際に、より直感的な形式（例えば KB、MB、GB など）で表現することができます。

# サンプルコード

```javascript:prettysize.js
const prettysize = require("prettysize");

const result1 = prettysize(1024);
const result2 = prettysize(1024 * 1024);
const result3 = prettysize(123456789);
const result4 = prettysize(10000000000);

console.log(result1);
console.log(result2);
console.log(result3);
console.log(result4);
```

・const prettysize = require("prettysize");
prettysize モジュールをインポートしています。これにより、ファイルサイズなどのバイト数を読みやすい形式に変換する機能を使用できます。


・const result1 = prettysize(1024);               // 1 KB
const result2 = prettysize(1024 * 1024);        // 1 MB
const result3 = prettysize(123456789);          // 約 117.74 MB
const result4 = prettysize(10000000000);        // 約 9.31 GB
	•	result1: 1024 バイトは 1 キロバイト（KB）に相当します。このため、結果は "1 KB" になります。
	•	result2: 1024 × 1024 バイトは 1 メガバイト（MB）に相当します。したがって、結果は "1 MB" です。
	•	result3: 123456789 バイトは約 117.74 メガバイト（MB）です。結果は "117.74 MB" になります。
	•	result4: 10000000000 バイトは約 9.31 ギガバイト（GB）です。したがって、結果は "9.31 GB" です。



# 実行結果

![スクリーンショット 2024-09-24 15.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/22926489-0fba-c176-d6e4-f24bda61575d.png)


# まとめ
node.jsのprettysizeモジュールの使用方法についてまとめました。自動で読みやすいサイズに変換してくれるので便利ですね！

# Reference

https://www.npmjs.com/package/prettysize
なぜアウトプットをしようと思ったのか。

## はじめに

ようやく、AWSの認定試験を一通り取得できた（ベータ試験除く）ので、本格的にアウトプット作業を始めたいと思います。

そして、初めて書く記事は私の今の気持ちを忘れないように書いておくポエムみたいな記事。

## 自己紹介。

* 愛媛の３年制の専門学校卒
* 卒業後は関東でSES企業に就職。11年ほど公共系とかの仕事をする。（激務）
* 仕事しかしていない人生に嫌気が差して、残業がほぼない札幌の自社開発系の会社へ転職
* 2022年の育休をきっかけにコツコツと勉強をするように。
* 2024年から外部勉強会に参加するようになって、自分もアウトプットをしたくなる。

## 私のアウトプットに価値なんてあるのか？

私のエンジニア人生、ほぼ枯れた技術ばかりを触っていて、特別なにかをしっているわけではない。

私の知っている知識はほぼインターネットで調べたことで構成されている。。

そんな状態なので、「私のアウトプットに価値はあるのか。」は今も解決できていない悩み。

ポジティブに考えると、今の職場においては、AWSに詳しい人はそこまでいないので、AWS周りはテックリードみたいな立ち振る舞いはできている。

が、私自身AWSの実務経験はまだ1年程度だし、ただただ今の職場のAWSの習熟度が低いだけな気もする。。

## それでも挑戦したい理由。

私はITを使って人を助けたいと思っているから。

別に新しいサービスを作りたいというわけではない。

普段のお仕事の中で、「うまく動かない」「どう実現すればいいんだろう？」といった小さなお困りごとを解決してあげたい。

そして、「ありがとう」「うまく動きました！」みたいなお言葉を頂ければそれ以上のことはないと思う。

それが私のモチベーションなんだと思う。

## 最後に。

失敗しても誰もみていない。

だったら、後ろ向きな気持ちは捨てて、後悔しないように残りのエンジニア人生を楽しみたいと思います！

早速どんな記事を書いてみようかなー？？
Devv – 独自の検索インデックスで構築された開発者向けAI検索エンジン

過去数ヶ月間で開発してきたツール、Devv (https://devv.ai) を紹介します。簡単に言えば、開発者向けに特化したAI駆動の検索エンジンです。

既に多くのAI検索エンジン（Perplexity、You.com、Phind、その他のオープンソースプロジェクト）が利用可能な中で、なぜ新たなものが必要なのかと疑問に思うかもしれません。

生成型検索エンジンはRAG（Retrieval-Augmented Generation）と大規模言語モデル（LLM）の組み合わせで構築されていることは周知の事実です。上記の多くの製品は一般的な検索エンジン（GoogleやBingのAPI）のインデックスを使用していますが、私たちは異なるアプローチを取りました。

開発ドメインに特化した垂直検索インデックスを作成しました。これには以下が含まれます：

## インデックスの構成

**ドキュメント**
プログラミング言語やライブラリの信頼できる情報源です。多くの方がDash (https://kapeli.com/dash) やdevdocs (https://devdocs.io/) のユーザーだと思います。

**コード**
自然言語ではありませんが、豊富な文脈情報を含んでいます。Djangoフレームワークに関する質問があれば、Djangoのリポジトリからのコードスニペットが最も説得力があります。

**ウェブ検索**
追加の文脈情報を含むため、検索エンジンからのデータも使用しています。

## 理由

- インデックスの品質がRAGシステムにとって重要であり、その効果がシステム全体の出力品質を決定します。
- LLMは急速に進化しているため、インデックス（RAG）に重点を置いています。現在優れているモデルも数ヶ月後には更に良いものに取って代わられる可能性があり、LLMのファインチューニングのコストも比較的低くなっています。
- 全てのプレイヤーが現在、どのようなLLM製品が最適かを探っています。私たちも異なる洞察を提供したいと考えています（また、基盤インフラの一部をオープンソース化し、オープンソースコミュニティへの貢献を期待しています）。

## 主な製品機能

- 3つのモード：
  - 高速モード：数秒以内に素早い回答を提供
  - エージェントモード：複雑なクエリに対して、Devvエージェントが質問を推論し適切な解決策を選択
  - GitHubモード（現在ベータ版）：自身のGitHubリポジトリと直接リンクし、特定のコードベースについて問い合わせ可能

- クリーンで直感的なUI/UXデザイン
- 現在はウェブ版のみですが、Chrome拡張機能とVSCodeプラグインも近日公開予定

## インデックス構築の技術詳細

**ドキュメントセクション**
devdocsプロジェクトのクローラーロジックを参考にしたスクリプトを使用して、ほとんどのドキュメントソースをクロールし、関数/シンボルの次元に応じてスライスしてからベクトルデータベースに埋め込みます。

**コード**
埋め込みだけでなく特別な処理が必要なため、言語タイプごとにカスタムパーサーを開発しました。リポジトリ内の論理構造（アーキテクチャレイアウト、関数定義間の呼び出し関係など）を抽出し、LMMを通じて意味的に処理します。

**ウェブ検索**
開発者向けニッチをターゲットにした自作のインデックスと、従来のAPIベースの手法を組み合わせています。関連サイト（ブログ、フォーラム、テックニュースサイトなど）をクロールしました。

エージェントモードでは、実際にマルチエージェントフレームワークを開発しました。まずユーザーのクエリを分類し、その分類に基づいて異なるエージェントを選択して問題に対処します。これらの様々なエージェントは、異なるモデルと解決手順を採用しています。
(Node.js) better-queueモジュールを理解する

# はじめに
node.jsのコードの中でbetter-queueモジュールを使用する機会があったので、どのようなモジュールであるのか簡単にまとめたいと思います。

# better-queueモジュールとは
Node.js環境で使用されるジョブ（タスク）キューを提供するためのモジュールです。主に、複数の非同期タスクを効率的に処理し、同時に実行されるタスク数を制御したい場合に便利です。シンプルかつ柔軟な設計で、並列処理、再試行、失敗時の処理、タスクの永続化などの機能をサポートします。

# サンプルコード
```javascript:better-queue.js
const Queue = require("better-queue");

// キューの処理
const queue = new Queue((task, cb) => {
  console.log(`Processing task: ${task.name}`);

  // 非同期処理
  setTimeout(() => {
    if (task.name === "Task 2") {
      console.error("An error occurred in Task 2");
      cb(true); // エラーが発生したことを通知
    } else {
      console.log(`Task ${task.name} complete`);
      cb(); // 成功を通知
    }
  }, 1000);
});

// タスクをキューに追加
queue.push({ name: "Task 1" });
queue.push({ name: "Task 2" });
queue.push({ name: "Task 3" });
```

・const Queue = require('better-queue');
better-queueライブラリを読み込んで、Queueクラスを使用できるようにしています。このクラスは、タスクのキューを管理するためのメインのインターフェースです。

・const queue = new Queue((task, cb) => {
ここで新しいキューqueueを作成しています。Queue()コンストラクタに渡している引数は、タスクの処理方法を定義するコールバック関数です。この関数は、キューからタスクを1つ取り出して実行する際に呼び出されます。つまりはこの関数は、(task,cb) => {}のことです。
taskはキューに追加されたタスクのオブジェクトを表し、cbはそのタスクが完了したことを通知するためのコールバック関数です。

・setTimeout(() => {
setTimeout()を使って非同期処理をシミュレートしています。実際にはこの部分で時間がかかるような処理（例えば、ファイルの読み書きやAPIの呼び出し）が行われます。

・if (task.name === 'Task 2') {
    console.error('An error occurred in Task 2');
    cb(true);
  } 
タスク名がTask 2だった場合、エラーを発生させてcb(true)を呼び出し、エラーが発生したことをキューに通知しています。


・else {
    console.log(`Task ${task.name} complete`);
    cb();
  }
それ以外のタスクでは、cb()を呼んでタスクが正常に完了したことを通知しています。

・queue.push({ name: 'Task 1' });
queue.push({ name: 'Task 2' });
queue.push({ name: 'Task 3' });
queue.push()メソッドを使って、タスクをキューに追加しています。それぞれのタスクはnameというプロパティを持つオブジェクトです。
Task 1、Task 2、Task 3の順番でキューに追加されており、キューが1つずつタスクを処理していきます。

### 動作フロー
1.	Task 1の処理を開始し、1秒後に完了。
2.	Task 2の処理を開始し、1秒後にエラーが発生。
3.	Task 3の処理を開始し、1秒後に完了。

# 実行結果

![スクリーンショット 2024-09-24 15.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/148926fd-974d-dbe5-ad1e-fbdf2d6b9994.png)

キューに追加された順番通りに実行されています。console.error()の部分が赤字で表示されています。

# まとめ
node.jsのbetter-queueモジュールの使用方法についてまとめました。このモジュールは他にも色々な使い方が出来ると思いますので、いずれ追記するかもしれません。

# Reference

https://www.npmjs.com/package/better-queue
2024/9/25主にITとかセキュリティの記事

Doctor Webがサイバー攻撃受け、ウイルスデータベース配信一時停止(9/23)
https://news.mynavi.jp/techplus/article/20240923-3028799/

CentOSサーバを標的とした新たなサイバー攻撃発見、管理者は対策を(9/23)
https://news.mynavi.jp/techplus/article/20240923-3028948/

CrowdStrikeのWindows停止事件　どのような経緯をたどったのか(9/21)
https://kn.itmedia.co.jp/kn/articles/2409/21/news068.html

ローカルLLMの活用事例4選！利用するメリットと導入時の注意点も徹底解説(9/23)
https://weel.co.jp/media/local-llm-programs/

金がないなら知恵をくれ　予算がないからできる「激安セキュリティ対策」(9/23)
https://techtarget.itmedia.co.jp/tt/news/2409/23/news02.html

台湾がサイバー攻撃、中国が警戒と情報提供呼びかけ(9/23)
https://jp.reuters.com/world/taiwan/BP43RG5GZFMJXEQPOW4WTPLJFQ-2024-09-23/

ホワイトハッカーとして活躍できる「セキュリティ認定資格」はこれだ(9/23)
https://techtarget.itmedia.co.jp/tt/news/2409/23/news03.html

“完全無欠のネットワーク”を作る「テレワークチェックリスト20項目」はこれだ(9/23)
https://techtarget.itmedia.co.jp/tt/news/2409/23/news01.html

米国「２０２７年式コネクテッドカー、中国製ソフトウエア禁止」…一息ついた韓国(9/23)
https://s.japanese.joins.com/JArticle/323998

「Amazon」を名乗るメールが届いたけど、詐欺でないか心配…本物かどうかすぐに確認する方法はある？(9/22)
https://news.yahoo.co.jp/articles/6db803447703cb6396d8d7ca6f387d091f44ea5e?source=rss

インド最高裁判所、YouTubeチャンネルがハッキングされ、XRP詐欺を宣伝される(9/23)
https://nextmoney.jp/?p=68370

[GA] AWS Backup に新しいボールトタイプ「論理的にエアギャップのあるボールト（Logically Air-gapped vault）」が追加されました(9/23)
https://dev.classmethod.jp/articles/ga-backup-logically-air-gapped-vault/

CompTIA PenTest+ 合格体験記(9/22)
https://qiita.com/yu1c1yu1c1/items/910fe1ee7e5824d246ad

Qwen2.0 とQwen2.5 応答を生成し比較してみた。(9/23)
https://qiita.com/muratatetsutaka84/items/63644631323bcc344e77

コラム(9/23)
https://www.nna.jp/news/2707876

誰が匿名性を恐れているのか？(9/23)
https://qiita.com/pseudonym2/items/c7d20ebe131a3efcd09b

＜アンカー＞合意形成へ多難な船出(9/23)
https://www.nikkei.com/article/DGKKZO83594840Q4A920C2TCT000/

マカオと香港・シンガポールの警察当局及びインターポールと合同でサイバーテロ対策訓練実施(9/23)
https://news.yahoo.co.jp/articles/e4fe7506b27bf2e2ce487fcd43a5c9311ab49aed?source=rss

個人情報を全校生徒が閲覧できる状態に 秋田市の中学校の教諭など3人戒告(9/23)
https://www.fnn.jp/articles/-/762510

ランサムウエアの脅威の本質に迫る、なぜ暗号化が強固なのか(9/24)
https://xtech.nikkei.com/atcl/nxt/column/18/02805/091800009/

クラウド時代の社名変更は甘くない、タクシーアプリ「GO」の5カ月プロジェクト(9/24)
https://xtech.nikkei.com/atcl/nxt/column/18/02952/091600001/

中途採用と人事交流を強化、15年間で部員数が10倍に急増した三井不動産のDX組織(9/24)
https://xtech.nikkei.com/atcl/nxt/column/18/02916/091100003/

経産省の本気が見える「SBOM導入の手引きver2.0」、ソフト調達・取引の指針に(9/24)
https://xtech.nikkei.com/atcl/nxt/column/18/02936/090200001/

アプリやタスクバーが操作不能に、「タスクマネージャー」を起動する3つの方法(9/24)
https://xtech.nikkei.com/atcl/nxt/column/18/02921/081900009/

偽の身分証明書で電話回線を乗っ取る「SIMスワップ」、キャッシュレス決済などで被害(9/24)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/080700180/

IHI運搬機械でサービス開発時に使用したアクセスキーが漏洩、個人情報流出の可能性(9/24)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/050700284/

「ひとり情シス」や中小企業に迫るサイバー脅威、でもどうやって守ればいい？(9/24)
https://xtech.nikkei.com/atcl/nxt/column/18/02938/091200022/
paizaラーニング問題集「【最安値】最安値を達成するには 4」を解いてみた

https://paiza.jp/works/mondai/dp_primer/dp_primer_apples_boss

▼考え方：

1.りんごを0個購入するときの金額の最小値は0円

2.りんごを1個からx個のいずれかを購入するときの金額の最小値はa円

3.りんごをx+1個より多く購入するときの金額の最小値は、以下3.1、3.2のように計算する。今回はi個購入するとする

　3.1. まず、りんごx個a円を購入する場合を考える。10,000,000円と、購入前の個数(i-x個)の金額の最小値(dp[i-x])にa円を加えた金額を比較し、小さいほうを最小値とする（事実上、後者が最小値になる。）

　3.2. 次に、りんごy個b円を購入する場合を考える。3.1で計算した最小値と、購入前の個数(i-y個)の金額の最小値(dp[i-y])にb円を加えた金額を比較し、小さいほうを最小値とする

　3.3. 最後に、りんごz個c円を購入する場合を考える。3.2で計算した最小値と、購入前の個数(i-z個)の金額の最小値(dp[i-z])にc円を加えた金額を比較し、小さいほうを最小値とする

4.題意より、i個以上購入する可能性があるため、i個以上購入したときの金額の最小値を計算する

▼コード：
```py
########## 処理0(準備) インプット,リスト定義など ###########

n,x,a,y,b,z,c = map(int, input().split())

# dp: りんごをi個購入した時の金額の最小値を格納するリスト
dp = [10000000] * (n+z)

########## 処理1 漸化式の定義、計算、出力 ##########

# 考え方1参照
dp[0] = 0

# 考え方2参照
for i in range(1,x):
    dp[i] = a

# 考え方3参照
for i in range(x+1,n+z):
    
    if i >= x+1:
        # 考え方3.1参照
        dp[i] = min(dp[i], dp[i-x] + a)
    
    if i >= y:
        # 考え方3.2参照
        dp[i] = min(dp[i], dp[i-y] + b)

    if i >= z:
        # 考え方3.3参照
        dp[i] = min(dp[i], dp[i-z] + c)

# 考え方4参照
print(min(dp[n:]))
```

▼気づいたこと：
考え方2のforループは、不要ですね。考え方3のforループに集約が可能でした。
集約にあたっては、考え方3のforループの開始をx+1ではなく1にします。
(Node.js) cli-spinnerモジュールを理解する

# はじめに
node.jsのコードの中でcli-spinnerモジュールを使用する機会があったので、どのようなモジュールであるのか簡単にまとめたいと思います。

# cli-spinnerとは
Node.js環境で使用されるライブラリで、コマンドラインアプリケーション上でスピナー（アニメーションのようなもの）を表示するために使用されます。スピナーがあることで、何も実行されていないわけではなく、処理中なんだなということが一目で分かり便利です。

# サンプルコード
```javascript:cli-spinner.js
const Spinner = require("cli-spinner").Spinner;
Spinner.setDefaultSpinnerString(1);
// Spinner.setDefaultSpinnerString("|/-\\");

const productionSpinner = new Spinner();
productionSpinner.setSpinnerTitle("Test Spinner..");
productionSpinner.start();
setTimeout(() => {
  productionSpinner.stop();
}, 2000);
```

・const Spinner = require("cli-spinner").Spinner;
cli-spinnerモジュールをインポートし、その中のSpinnerクラスを使用できるようにしています。

・Spinner.setDefaultSpinnerString(1);
Spinner.setDefaultSpinnerString()は、スピナーのデフォルトの回転パターンを設定します。ここでは、引数に1を渡しています。下図のように様々なスピナーがビルトインスピナーとして用意されています。

![スクリーンショット 2024-09-24 12.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/15e892c3-492e-3b5a-f367-377f7c92cc31.png)

数字の１などではなく、「"|/-\\"」のような文字列を指定することも出来ます。

・const productionSpinner = new Spinner();
新しいスピナーインスタンスを作成しています。

・productionSpinner.setSpinnerTitle("Test Spinner..");
setSpinnerTitle()メソッドを使って、スピナーに表示するタイトル（テキスト）を設定しています。実際はスピナーが左にあり、その右に「Test Spinner..」という文字列が表示されます。

・productionSpinner.start();
start()メソッドはスピナーを開始します。これにより、ターミナルにスピナーが表示され、回転し始めます。スピナーは非同期に動作し、stop()メソッドが呼び出されるまで回転し続けます。

・setTimeout(() => {
  productionSpinner.stop();
}, 2000);
setTimeout()は、指定した時間（ここでは2000ミリ秒＝2秒）が経過した後に実行する関数を指定します。
ここでは、productionSpinner.stop();が2秒後に実行されます。これにより、スピナーが停止します。
stop()を呼び出さない限り、スピナーは回転し続けますが、2秒後に自動的に終了するように設定されています。

# 実行結果
![スクリーンショット 2024-09-24 12.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/e617655a-caac-e66c-90b0-606e8dd8344a.png)

このコードにより、スピナーが一時的に表示され、2秒間だけ回転してその後停止する動作を実現しています。

# まとめ
node.jsのcli-spinnerモジュールの使用方法についてまとめました。

# Reference

https://www.npmjs.com/package/cli-spinner
if (!supabaseUrl) throw new Error('supabaseUrl is required.')でtsファイル実行できない

# はじめに
TypeScriptのファイル`.ts`を実行して、supabaseのテーブルデータを削除しようとしましたが、エラーで詰まってしまいました。
解決に時間がかかったので解決策をまとめます。

# 1つ目の事象
tsファイルを実行
```bash
$ npx ts-node --esm ./batch/index.ts
```
すると以下のエラーが発生しました。
```bash
/home/your_name/react-dev/name-card-app/node_modules/ts-node/dist-raw/node-internal-modules-esm-resolve.js:366
    throw new ERR_MODULE_NOT_FOUND(
          ^
CustomError: Cannot find module '/home/your_name/react-dev/name-card-app/src/utils/supabase' imported from /home/your_name/react-dev/name-card-app/batch/index.ts
```

# 原因
supabaseのファイルが読み込めていませんでした。
tsファイルを単独で実行する際には、拡張子をつける必要があるみたいです。

# 解決策
```ts
import { supabase } from "../src/utils/supabase";
// 下に修正
import { supabase } from "../src/utils/supabase.ts";
```
tsconfig.jsonも拡張子が使えるように修正
```json:tsconfig.json
{
  "compilerOptions": {
    "allowImportingTsExtensions": true, // 追加
```

# 2つ目の事象
このエラーの解決後に、再度実行すると、またエラーが発生しました。
supabaseUrlがありませんとエラーが出ています。
```bash
/home/your_name/react-dev/name-card-app/node_modules/@supabase/supabase-js/src/SupabaseClient.ts:75
    if (!supabaseUrl) throw new Error('supabaseUrl is required.')
                            ^
Error: supabaseUrl is required.
    at new SupabaseClient (/home/your_name/react-dev/name-card-app/node_modules/@supabase/supabase-js/src/SupabaseClient.ts:75:29)
    at createClient (/home/your_name/react-dev/name-card-app/node_modules/@supabase/supabase-js/src/index.ts:40:10)
    at file:///home/your_name/react-dev/name-card-app/src/utils/supabase.ts:4:25
    at ModuleJob.run (node:internal/modules/esm/module_job:194:25)
```

# 原因
直接tsファイルを実行する際は、envが読み込まれないようです。

# 解決策
最初に環境変数を読み込んであげればOKです。
```ts
import 'dotenv/config';
```

# まとめ
悩んだところなので、お役に立てば幸いです。