OmniAICreator/Qiita-1.07M huggingface dataset:
「サーバ」と「サーバー」の違いとは？どちらを使うべき？

IT分野の記事やマニュアルを読んでいると、「サーバ」と「サーバー」の2つの表記を目にすることがあります。どちらも英語の"server"をカタカナ表記したものですが、これらにはどのような違いがあるのでしょうか？本記事では、「サーバ」と「サーバー」の違いと、使い分けのポイントについて解説します。

:::note info
参考までにお願い致します。
:::



#__1. 「サーバ」と「サーバー」の表記の違__
---------------------------------------
「サーバ」と「サーバー」は、基本的には同じ意味を持ちますが、以下のような違いがあります。

<dl>
  <dt>・サーバ: 長音符号（ー）を省略した表記。</dt>
  <dd>・例: 「Webサーバ」「ファイルサーバ」
  <dd>・IT分野や専門的な文章で使われることが多い。</dd>
</dd>
  <dt>・サーバー: 長音符号を含む表記。</dt>
  <dd>・例: 「このサーバーは処理が速いです」</dd>
  <dd>・一般的な文章や日常的な会話で使われることが多い。</dd>
</dl>


#__2. 使われる場面の違い__
---------------------------------------

表記の違いは、主に使われる場面によって分かれます。


・専門的な文章やIT業界の標準
IT関連の専門書や技術文書では、「サーバ」と表記されることが一般的です。これは、日本語のカタカナ表記において、特に技術用語では長音符号を省略する傾向があるためです。

<dl>
  <dt>例:</dt>
  <dd>「データベースサーバ」
  <dd>「アプリケーションサーバ」</dd>
</dd>

・一般向けの説明や日常会話
一方で、日常会話や一般の人向けの説明では「サーバー」と表記されることが多いです。特に、カジュアルな文章や広告などでは、長音符号を含むほうが発音しやすいため、こちらが好まれます。

  <dt>例:</dt>
  <dd>「サーバーが落ちた！」</dd>
  <dd>「新しいゲームサーバーが公開されました」</dd>
</dl>






#__3. どちらを使うべき？__
---------------------------------------


結論として、どちらの表記も間違いではありません。ただし、以下のような基準で使い分けると良いでしょう。


|  用途 | 推奨される表記 |
|:-:|:-:|
| IT専門用語・技術文書 |  サーバ |
| 一般向けの説明・会話  |  サーバー |
| 公式文書・規格書  |  サーバ |
| Web記事・広告  | サーバー  |




#__まとめ__
---------------------------------------

:::note info
「サーバ」と「サーバー」は、どちらも同じ"server"のカタカナ表記ですが、IT業界では「サーバ」、一般向けの文章では「サーバー」と使い分けられることが多いです。記事を書く際は、対象読者に合わせて適切な表記を選ぶようにしましょう。

今後、技術文書を作成する際や、IT関連の記事を執筆するときの参考にしてください！
:::
ChatGPTを使った初心者向け文章生成テクニック

## はじめに  
ChatGPTをビジネスで活用し始めたものの、思った通りの文章が得られずに悩んでいませんか？その鍵となるのが「**プロンプトエンジニアリング**」です。プロンプトエンジニアリングとは、LLM（大規模言語モデル）から最適なアウトプットを得るために、**プロンプト（入力文）を工夫して設計する**ことを指します。シンプルな一文でもChatGPTは答えを返してくれますが、プロンプト次第で回答の質は大きく変わります。本記事では、ChatGPT初心者のビジネスユーザー向けに、文章生成の質を高めるためのプロンプト作成のテクニックを解説します。

## プロンプト作成の基本テクニック  
### 明確かつ具体的な指示の重要性  
- **目的を明確に伝える**  
  曖昧な依頼では意図しない結果が返ってくる可能性があります。たとえば、  
  ```text
  レポートを書いてください。
  ```  
  ではなく、  
  ```text
  あなたはデータ分析の専門家です。昨月の売上データに基づき、経営層向けに主要なポイントを3点箇条書きでまとめたレポートを作成してください.
  ```  
  のように、**誰向けで何を求めているのか**を具体的に示すことが大切です。

### コンテキストと出力形式の指定  
- **背景情報の提供**  
  プロンプト内に文脈や背景情報を盛り込むことで、モデルがより適切なアウトプットを生成できます。  
- **出力形式の明示**  
  例: 「箇条書きで3つのポイントにまとめて」「200文字程度で簡潔に」といった具体的な形式指定を行いましょう.

### 役割や口調の指定  
- **ロールプロンプトの活用**  
  「あなたは経験豊富なビジネスコンサルタントです」といった役割指定を行うことで、専門的かつ適切な口調の文章が得られます.  
- **トーンの指定**  
  「丁寧な敬語で」「親しみやすい口調で」など、求める文体やトーンを明示すると効果的です.

## 文章のトーンやスタイルの調整  
- **プロンプトの文体がそのまま反映**  
  ChatGPTはプロンプトの文体を模倣するため、用途に合わせた文体を選択します.  
- **具体的なトーン指定の例**  
  ```text
  新サービスの紹介文を作成してください。ビジネス向けの丁寧な文体で、敬語（です・ます調）を用いて説明してください.
  ```

## 要約・リライトのコツ  
### 長文要約のポイント  
- **条件の明確化**  
  「以下の文章を3つの箇条書きで要約してください」など、具体的な条件を設定しましょう.  
- **文章と指示の区切り**  
  「### 要約対象の文章:」などの区切りを使用して、どこからどこまでが対象かを明確にします.

### 文章のリライト  
- **校正・推敲のレベル指定**  
  「誤字脱字の修正」や「文体を統一して推敲してください」といった具体的な改善指示を出すことで、目的に合ったリライトが可能です.  
- **希望する文体の指定**  
  例: 「上記メール本文を、取引先に送るビジネスメールとして適切な敬語表現に修正してください.」

## ビジネス文書作成への応用  
### メール文作成  
- **状況に応じた依頼文の作成**  
  依頼内容とその背景、求めるトーンを明示することで、部下への依頼メールやクライアント向けの連絡文の下書きを効率的に生成できます.

### 議事録や報告書の要約  
- **決定事項の抽出**  
  議事録全文ではなく、「決定事項を3点箇条書きで要約してください」と指示することで、必要な情報のみを抽出できます.

### 企画書や提案書のドラフト作成  
- **アウトライン作成の活用**  
  新製品のマーケティング戦略プランなど、企画書の骨子を生成する際、「箇条書きで提案してください」といった指示が有効です.  
- **ドラフトのリライト**  
  既存のドラフトに対して「より説得力のある表現に改善してください」といったリライト依頼も可能です.

### マニュアルや手順書の作成  
- **手順の整理**  
  「新人向けに業務Xの手順を箇条書きで説明してください」など、段階的な手順説明の依頼にも効果的です.

## まとめ  
プロンプトエンジニアリングの基本テクニックを活用することで、ChatGPTから得られる文章の質は飛躍的に向上します.  
- **明確な指示とコンテキストの提供**が、期待通りのアウトプットを得る鍵です.  
- 文章のトーンやスタイル、要約・リライトの手法を上手く使い分けることで、ビジネス文書の作成も効率的に行えます.

ぜひ、今回紹介したテクニックを試して、日々の業務効率化や文書作成のクオリティ向上にお役立てください.
/etc/profileに定義した環境変数がユーザごとに切り替わる

# 概要
/etc/profileに定義したはずの環境変数がユーザごとに切り替わるトラブルが起きた。色々調査した記録。

# 結論
- 環境変数の設定箇所を確認するときは外部ファイルを読み込んでないか確認しよう
- 環境変数の定義方法をプロジェクトとして統制しよう

# 想定
EXAMPLE_USER1
EXAMPLE_USER2
どちらでも環境変数`EXAMPLE_VALIABLE`の値は`CORRECT_EXAMPLE_VALUE`であるはず

# とりあえず原因箇所を特定しよう
## まずはファイルを見る
ユーザごとに設定値が変わってしまうなら十中八九.bash_profileか.bashrcに定義しているはず
```
cat .bash_profile ｜grep EXAMPLE_VALIABLE
```

```
cat .bashrc ｜grep EXAMPLE_VALIABLE
```
→どっちも定義を上書きしてはいなさそう？

## 状況を確認しよう
```
su - EXAMPLE_USER1
echo $EXAMPLE_VALIABLE
```
⇒`CORRECT_EXAMPLE_VALUE`

```
su EXAMPLE_USER1
echo $EXAMPLE_VALIABLE
```
⇒`CORRECT_EXAMPLE_VALUE`

```
su - EXAMPLE_USER2
echo $EXAMPLE_VALIABLE
```
⇒`INCORRECT_EXAMPLE_VALUE`

```
su EXAMPLE_USER2
echo $EXAMPLE_VALIABLE
```
⇒`CORRECT_EXAMPLE_VALUE`

つまり、EXAMPLE_USER2の環境変数設定を読み込んだときに環境変数が切り替わってしまうように見える

# 調査しよう
> EXAMPLE_USER2の環境変数設定を読み込んだときに環境変数が切り替わってしまう

のであれば、疑わしいのはEXAMPLE_USER2の.bash_profileか.bashrc

先輩「sourceしてんじゃない？」

```
cat .bash_profile ｜grep source
source /hoge/fuga/EXTRANAL_FILE

cat /hoge/fuga/EXTRANAL_FILE｜grep EXAMPLE_VALIABLE
export EXAMPLE_VALIABLE=INCORRECT_EXAMPLE_VALUE
```
⇒これだ！！

# 反省
- 環境変数はprofile系のファイルに直接書かれていると思い込んでいたこと
- ファイルや定義方法がプロジェクトとして統制されておらず、各チーム任せになっていること
【AWS】AWS CLIでSSOログインを設定する方法

## 1. はじめに

AWS CLIでSSOログインを設定する手順を簡単にまとめた備忘録です。  
アクセスキーを使わずにAWSへログインできるので、セキュリティ的にも安全です。

**📌 参考:**  
本記事は AWS 公式ドキュメントを参考にしています。  
- 👉[AWS IAM Identity Center のセットアップ手順](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)  
- 👉 [AWS CLI を使用した IAM Identity Center 認証の設定
](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html#sso-configure-profile-token-auto-sso)

## 2. 本記事の環境

以下の環境で実施しました。

- **PC**: M1 MacBook Air  
- **OS**: macOS Monterey 12.7.6  
- **AWS CLI**: バージョン 2.11.15
- **エディタ**: Visual Studio Code (VSCode)  


## 3. 事前準備

事前に以下を準備してください。

### 3.1 AWS CLI

以下のコマンドでAWS CLIがインストールされているか確認します。
```shell-session
# コマンド
aws --version
# 出力例
aws-cli/2.11.15 Python/3.9.11 Darwin/x86_64
```

### 3.2 SSOが有効なAWS環境があること

AWS SSOを使用するには、AWS IAM Identity Center (旧AWS SSO) が設定済みのAWS環境が必要です。 詳細な設定方法については、AWS公式ドキュメントを参照してください。

## 4. SSOログインの設定手順
### 4.1 AWS CLIのSSO設定
以下のコマンドを実行します。
```shell-session
# コマンド
aws configure sso
```
コマンド実行後、対話形式で設定を進めます。
```
SSO session name (Recommended):test
SSO start URL [None]: https://d-XXXXXXX.awsapps.com/start/#
SSO region [None]: ap-northeast-1
SSO registration scopes [sso:account:access]: sso:account:access
```

```shell-session
#入力後に以下が出力されます。
To use this profile, specify the profile name using --profile, as shown:
aws s3 ls --profile {プロファイル名}

```

### 4.2 SSOでログイン
以下のコマンドを実行します。
```shell-session
aws sso login --profile {プロファイル名}

#以下が出力されブラウザが自動で開きます。
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://d-XXXXXX.awsapps.com/start/...

Then enter the code:

#ここに表示されるコードとブラウザに表示されたコードを確認する。
{コード}

#ブラウザ上で許可をすると以下のように出力される。
Successfully logged into Start URL: https://d-XXXXXX.awsapps.com/start/...

```

## 5. 接続確認
```shell-session
#以下コマンドを実行し、バケット名が表示されれば接続OK。
aws s3 ls --profile {profile名}
:
```
なお、`--profile`を指定しないと以下が出力されます。
```
Unable to locate credentials. You can configure credentials by running "aws configure".
```
環境変数にprofile名をセットすることも可能です。
```
export AWS_PROFILE={profile名}
```





## 6. 確認のみ
以降は設定値の確認方法になります。

### 6.1 プロファイルの確認
以下のコマンドで、SSOの認証情報が正しく適用されているか確認できます。
```
aws sts get-caller-identity --profile XXXXXX
{
    "UserId": "XXXXXXX",
    "Account": "{AWSアカウントID}",
    "Arn": "arn:aws:sts::{AWSアカウントID}:assumed-role/{フェデレーティッドユーザー名}"
}
```
### 6.2 設定ファイルの確認
以下のコマンドで、Configの内容が確認できます。
```
cat ~/.aws/config

[profile XXXXXX]
sso_session = test
sso_account_id = AWSアカウントID
sso_role_name = ロール名
region = ap-northeast-1
output = json

[sso-session test]
sso_start_url = https://d-XXXXXX.awsapps.com/start/#
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access

[default]
region = ap-notrheast-1
output = json

```


## 7. まとめ
- AWS CLIでSSOログインを設定すると、アクセスキー不要で安全に利用できる
- ログインセッションが切れたら `aws sso login` を再実行  
- `AWS_PROFILE` 環境変数を設定すると、毎回 `--profile` を指定しなくてよい  
- プロファイルを活用することで、複数のAWSアカウントを簡単に切り替えられる
（今回は未実施）

以上、AWS CLIのSSOログイン設定の備忘録でした。
Slackボットによる知識データの定期投稿と質問応答の自動化

## **1. はじめに**
Slackを活用した業務効率化の方法として、**知識データの定期投稿と質問応答を自動化**するSlackボットを開発しました。本記事では、その目的や実装方法を詳しく解説します。

---

## **2. 目的**
### **(1) 知識データの定期投稿**
- 会社の利用手引きやマニュアル、業務ルールを**定期的にSlackへ投稿**
- **現在はランダム投稿** だが、将来的には時間に応じた投稿も検討

### **(2) 質問応答システム**
- Slackボットにメンションすることで、**即時に知識データを検索**
- RAG（Retrieval-Augmented Generation）を活用し、適切な回答を生成

---

## **3. Slackボットのフロー**
このSlackボットは、次のような流れで動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976506/3de5fff5-824c-4dd3-8314-2a45ac4bd1e2.png)

1. **ユーザーがボットに質問**
2. **SlackボットがRAGシステムを使い、回答を検索**
3. **検索結果をもとに、適切な回答を生成して返信**
4. **ボットが定期的にSlackチャンネルに知識データを投稿**

---

## **4. 知識データの定期投稿**
### **(1) 現在の仕組み**
- **Cloud Scheduler + Cloud Run** を活用し、**ランダムで知識データを投稿**
- 投稿データはCloud Shell内の**docxファイルやCSV**で管理

### **(2) 改善の方向性**
- **時間に応じた投稿**（例：朝は業務開始の注意事項、午後は研修資料など）
- **特定のトピックごとの投稿スケジュールを設定**

---

## **5. 質問応答システム**
### **(1) 現在の実装**
- **Slack API + Cloud Run** でボットを動作
- **RAG検索（コサイン類似度）** を使用して適切な知識データを取得
- **Gemini 2.0** を活用し、ユーザーに分かりやすい回答を生成

### **(2) 実際のSlackでのやり取り**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976506/b6c0be34-8f3c-412d-a904-824511978ea7.png)


---

## **6. 今後の展望**
- **BigQuery導入によるデータ管理強化**
- **SlackのInteractive Components活用**
- **投稿スケジュール最適化（曜日・時間に応じた知識データの分類）**

---
elm327の研究 その14

# 概要
elm327の研究やってみた。
練習問題やってみた。

# 練習問題
codepenで、elm327のエミュレーションせよ。

# 参考にしたページ

https://note.com/asamin_moto/n/n8ae511a8708e

# 成果物

<p class="codepen" data-height="500" data-default-tab="html,result" data-slug-hash="NPWrdvR" data-pen-title="elm327 emu" data-user="ohisama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ohisama/pen/NPWrdvR">
  elm327 emu</a> by ohisama (<a href="https://codepen.io/ohisama">@ohisama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

以上。
【AI投資システム構築】概要＆今後の投稿予定

# はじめに
数年前から多くのAI投資サービスが登場し、投資の自動化が進んでいます。
AIの力を活用すれば、従来の人が行うテクニカルチャート分析より、
複雑な統計分析に基づいた予測が可能になります。
私も10年ぐらい前から自前でAI投資システムを構築し、
FX（外国為替取引）での運用を試みています。
今後、私が試行してきたことの整理もかねて、
為替レートを予測するための学習モデルの作り方や、
FX自動売買システムの構築方法について、順を追って投稿していこうと思います。

# FX自動売買システム＋AI予測 概要

・為替情報の取得と、トレードの実行はMT4、またはMT5を用いています。MT4/MT5で動作するプログラムはMQL4/MQL5というプログラミング言語を使います。

::: note info
これから初めて構築するという人は、通信の安定性の面から、MT5の方がオススメです。その代わり、MQL5は少し取っ付きにくいかもしれません。C++言語を扱える人なら大丈夫かも。
:::

https://www.metatrader4.com/ja

https://www.metatrader5.com/ja

・取得した為替情報から未来の為替レートを予測する学習モデルの構築は、
　ディープラーニング向けのフレームワーク（TensorFlow）と各種ライブラリ（Keras,Pandas,Numpy）を用いています。プログラミング言語はPython3です。

https://www.tensorflow.org/?hl=ja

https://keras.io/

私が作成した学習モデルは、
複数の通貨ペアに対して、数時間後の為替レートを予測する学習モデルです。
現在のレートより上がるか下がるかの正答率では、
学習済の期間／未学習の期間にかかわらず、
55～65％の確率で予測できる学習モデルが作成できました。

::: note alert
作成した学習モデルだけでは、急なトレンド転換に対応できず、利益は出せません。
私は学習モデルの予測結果に加えて、ファンダメンタル分析や様々なリスク対策を施しトレードを行っています。その結果、トレードの勝率は70％を超えています。
:::

# 今後の掲載予定
下記内容を順次、投稿しようと思っています。
現在の本業とは全く関係がないので、
プライベートの時間を使って週次の掲載を目標に頑張っていきます。
※途中、生成AIネタとか、AR/VRネタ、ロボット/ドローンネタとか、挟むかもしれません。
 1. 学習用データの集め方
 1. データの前処理方法
 1. どのデータを使用するべきか
 1. 時系列データの扱いについて
 1. 学習モデルの作り方
 1. 学習方法
 1. MT4/MT5と学習モデルの連携システム構成
 1. トレードシミュレーション方法
 1. 売買の判断基準（さまざまなリスク対策）

:::note warn
ディープラーニングの学習モデルの作成方法やMT4/MT5の使い方などの情報は、
書籍やネットに情報が溢れているので、私の投稿では１から詳細を記載するつもりはありません（おすすめの書籍とか記載するかも）
その代わり、私の経験で困ったことや陥ったことなど、
注意点を重点的に記載するつもりです。
:::
個人向けのAI投資システムの構築方法として、少しでも参考にして頂けますと幸いです。
よろしくお願いいたします。
scipy.spatial.cKDTreeとquery_ball_pointを用いた近傍探索

`scipy.spatial.cKDTree`や`scipy.spatial.cKDTree.query_ball_point`を用いた近傍探索は点群処理の前処理で使われることがあるので以下簡単に確認を行います。

## サンプルコード
下記のようなコードを動かすことで`scipy.spatial.cKDTree`や`scipy.spatial.cKDTree.query_ball_point`を用いた近傍探索を行うことができます。

```python
import matplotlib.pyplot as plt
import numpy as np
from scipy import spatial

x, y = np.mgrid[1:6, 1:6]
points = np.c_[x.ravel(), y.ravel()]

tree = spatial.cKDTree(points)

points = np.asarray(points)
plt.plot(points[:,0], points[:,1], '.')

for results in tree.query_ball_point(([2, 3], [5, 5]), 1):
    nearby_points = points[results]
    plt.plot(nearby_points[:,0], nearby_points[:,1], 'o')

plt.margins(0.1, 0.1)
plt.savefig("cKD-Tree.png")
```

・実行結果
![cKD-Tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/ca47a9fd-fbd2-40f0-a53a-5c2e6696e6d4.png)


実行結果の理解にあたっては「`(2,3)`の半径`1`以内の点である`(2,2)`、`(1,3)`、`(2,3)`、`(3,3)`、`(2,4)`」がオレンジ、「`(5,5)`の半径`1`以内の点である`(4,5)`、`(5,4)`、`(5,5)`」が緑で表されたことに着目すると良いです。


## サンプルコードの理解
以下、前節で取り扱ったコードの詳細について確認を行います。

```python
import matplotlib.pyplot as plt
import numpy as np
from scipy import spatial

x, y = np.mgrid[1:6, 1:6]
points = np.c_[x.ravel(), y.ravel()]

print(points)

tree = spatial.cKDTree(points)
nearby_points = tree.query_ball_point([2, 2], 1)

print(nearby_points)
print(points[nearby_points])
```

・実行結果
```
[[1 1]
 [1 2]
 [1 3]
 [1 4]
 [1 5]
 [2 1]
 [2 2]
 [2 3]
 [2 4]
 [2 5]
 [3 1]
 [3 2]
 [3 3]
 [3 4]
 [3 5]
 [4 1]
 [4 2]
 [4 3]
 [4 4]
 [4 5]
 [5 1]
 [5 2]
 [5 3]
 [5 4]
 [5 5]]
[1, 7, 6, 5, 11]
[[1 2]
 [2 3]
 [2 2]
 [2 1]
 [3 2]]
```

上記より、`scipy.spatial.cKDTree.query_ball_point`は`(2,2)`の半径`1`以内の点を探索し、`points`の点のインデックスの形式で出力を行っていることが確認できます。ここでは二次元を取り扱いましたが、三次元の点群を取り扱うなども可能です。

・参考

https://qiita.com/Chi_corp_123/items/12cd8622bff40ac2ef4f
git push origin時の「error: failed to push some refs to 〜」について

## はじめに
業務上githubを使用する機会が増えてきたため、まずは初歩的なコマンドから確認するため、ローカルリポジトリからリモートリポジトリにpushを行っていました。
すると以下のエラーが出力されたため、原因の確認とそれに対応する対処法をまとめました。

## 事象

```
$ git push origin main
To https://github.com/XXXXXX/XXXXXX
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/XXXXXX/XXXXXX'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

## 先に原因
ローカルのmainブランチがリモートのmainブランチよりも古いため、Gitが拒否している状態であるため、pushができなかった。

## 先に対処法
リモートの変更を取り込んでから再度プッシュする必要がありました。

```
git pull origin <branch name> --rebase  # リモートの変更をローカルに適用
git push origin <branch name>  # 変更をプッシュ
```

## なぜエラーになったのか？
実は今回ファイルをpushする前に作業ブランチをスイッチしておりました。
現在進めているブランチとは異なるブランチで新しくpushしてしまった結果、リモートとローカルの履歴が異なり、エラーが出力されたと考えています。

他にエラーが発生する原因として検索してみると以下の事象も考えうるとのことでした。

    •	リモートに変更が加わったが、ローカルに取り込んでいない
	•	ローカルのmainが古く、リモートの最新のコミットを知らない
	•	その状態でローカルの変更をプッシュしようとすると、Gitは「データの損失を防ぐため」拒否する


以上です。引き続きgitについて理解していきます。
VSCodeのFormat On saveが動かない

# 症状

しばらくぶりにVSCodeを使うと、Prettierアイコンが赤色になり、Format On Saveが使えませんでした。

![スクリーンショット 2025-02-23 14.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194904/1958995f-77f5-440d-b0dc-ad575867050c.png)

OutputではCannot find Prettier package.jsonとのこと。

![スクリーンショット 2025-02-23 14.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194904/dffa1ecf-fdf2-43c1-8655-432c9227b7c4.png)

設定のFormat On Saveは有効になっているし、Default FormatterもPretteirになっていました。
Prettierを再インストールしても直りません。

![スクリーンショット 2025-02-23 14.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194904/59c99de0-ac16-4083-8891-393e22a985ce.png)

# 解決方法
User settingsの方のsettings.jsonに下記のように、拡張機能のPrettierではなく、localにインストールされたPrettierを使用するように設定されていました。
しかし、localにPrettierをインストールしているわけではないので、動かなかったようです（多分）。
こちらを削除すると自動整形してくれるようになりました。

```
"prettier.prettierPath": "/usr/local/lib/node_modules/prettier"
```

# おまけ（settings.jsonの編集方法）

VSCodeのsettings.jsonは下記より編集できます。

- command + shift + Pを押す（コマンドパレットを開く）
- 入力ボックスがVSCodeの上の方に現れるので、"settings"などで検索する
- "Preference: Open User Settings(JSON)"を選択する

![スクリーンショット 2025-02-23 14.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194904/87db59c7-781f-4423-91a7-f3b90bb4850c.png)

# 最後に

今回の不具合の原因になったコードがいつ、どのように追加されていたのかはさっぱりわかりませんが、AIとやりとりする中で理解せずに追加してしまったのかもしれないなと思います。

最後までお読みいただきありがとうございます！
間違い等あればご指摘お願い致します！
リアルタイム音声認識システムのためのフロントエンドマイク入力

# リアルタイム音声認識サービス
近年、様々な音声認識サービスが世の中には展開されてます。
音声認識サービスのシステム構成は様々な形態があり、特にリアルタイム音声認識を行うサービスでは

* 「専用のアプリケーションをPC/スマホにインストールして、サーバ側で音声認識」
* 「専用のアプリケーションをPC/スマホにインストールして、エッジ側で音声認識」
*  「専用のデバイス端末で録音した音声をサーバ側で音声認識」
*  「Webブラウザからマイク入力した音声をサーバ側で音声認識」

などといったような形態のものが存在します。すべてを調査したわけではないですが、やはりサービス形態として最も多いのは「Webブラウザからマイク入力した音声をサーバ側で音声認識する」という形態でしょう。

そこで、今回はブラウザ上でマイクからの入力をリアルタイムでサーバに送信する部分をどのように作るか検討していきます。

# ブラウザ上でマイクを扱う
ブラウザ上でJavascriptからマイクを利用するには、[Web Audio API](https://developer.mozilla.org/ja/docs/Web/API/Web_Audio_API "Web Audio API")が利用できそうです。

どうやら、ScriptProcessorNode はすでに非推奨になっており、AudioWorkletを利用する必要がありそうですが、まだまだ現役っぽいので一旦今回はそちらで進めていきます。

ドキュメントを読み進めてみると、まずはAudioContextと呼ばれるオブジェクトを生成します。

```mic_input.js
audioContext = new (window.AudioContext || window.webkitAudioContext)({ sampleRate: 16000 });
```

`window.AudioContext || window.webkitAudioContext`はブラウザによって名称が異なるため、その対応となります。

ここで、AudioContextの[コンストラクタの仕様](https://developer.mozilla.org/ja/docs/Web/API/AudioContext/AudioContext "AudioContext Constructor")を確認してみると、いくつかオプションを指定できるようです。

サンプリングレートを利用する音声認識エンジンの入力に合わせておきましょう。(大体8k or 16kかと思われますが)
※指定しなかった場合、デバイスの規定値が利用されるようです


```mic_input.js
audioContext = new (window.AudioContext || window.webkitAudioContext)({ sampleRate: 16000 });
```

以下のコードにおいて`scriptProcessor.onaudioprocess = onAudioProcess;`の部分で指定した関数(onAudioProcess)が実際にリアルタイムに音声を処理する関数となります。録音中に繰り返し何度も呼び出されます。
```mic_input.js
navigator.getUserMedia({ audio: true }, function (stream) {
        // 録音関連
        localMediaStream = stream;
        var scriptProcessor = audioContext.createScriptProcessor(bufferSize, 2, 1);
        localScriptProcessor = scriptProcessor;
        var mediastreamsource = audioContext.createMediaStreamSource(stream);
        mediastreamsource.connect(scriptProcessor);
        scriptProcessor.onaudioprocess = onAudioProcess;
        scriptProcessor.connect(audioContext.destination);
    },
    function (e) {
        console.log(e);
    }
);
```

では、実際に音声を処理する部分を作成していきます。
```mic_input.js
// 録音中繰り返し呼び出されます
var onAudioProcess = function (e) {
	// 音声のバッファを作成
	var input = e.inputBuffer.getChannelData(0);
	var bufferData = new Float32Array(bufferSize);
	for (var i = 0; i < bufferSize; i++) {
	    bufferData[i] = input[i];
	}
    
	//!!!ここでデータをサーバーに送信したりする処理を記述!!!
};
```
これで、フロントエンド側で音声データを逐次マイクから取得することができました。
ここで取得した音声データを音声認識サーバに送信することでリアルタイムに音声認識が可能となります。

リアルタイム音声認識システムでは、HTTP/Websocket/gRPC/ソケット通信など様々な種類のインタフェースが定義されます。

`!!!ここでデータをサーバーに送信したりする処理を記述!!!`という部分には各IFに応じた、送信処理を記述します。
AWS Storage Gatewayのユースケースと他のAWSサービスとの連携例

#### **1. AWS Storage Gatewayの概要**
AWS Storage Gatewayは、オンプレミス環境とAWSクラウドストレージをシームレスに統合するためのハイブリッドストレージサービスです。主に以下の3つのゲートウェイタイプが提供されています。

1. **File Gateway**  
   - NFS/SMBを介してS3バケットをマウントし、オブジェクトストレージとして利用可能。
   - 主な用途:
     - オンプレミスのデータをS3にバックアップ・アーカイブ
     - ビッグデータ分析のためのデータ収集
     - クラウドネイティブアプリケーションのストレージ
   - **連携例:**  
     - **Amazon S3**: データをS3に保存し、ライフサイクルポリシーでGlacierへアーカイブ  
     - **Amazon Athena**: S3上のデータをSQLで直接クエリ  
     - **AWS Lambda**: S3イベントをトリガーしてデータ処理を自動化  

2. **Volume Gateway**  
   - iSCSIベースの仮想ストレージを提供し、ブロックストレージとしてAWSにバックアップ可能。
   - 動作モード:
     - **Cached Mode**: 頻繁にアクセスするデータをオンプレミスにキャッシュし、AWS上のEBS Snapshotsと連携  
     - **Stored Mode**: すべてのデータをオンプレミスに保存し、AWSにはスナップショットとしてバックアップ
   - **連携例:**  
     - **Amazon EBS**: EBSスナップショットを作成し、EC2インスタンスでリストア  
     - **AWS Backup**: 自動スナップショット管理でデータ保護  
     - **Amazon EC2**: 物理サーバのディスクをEBSスナップショットからリストアし、クラウド移行を実施  

3. **Tape Gateway**  
   - 仮想テープライブラリ (VTL) をエミュレートし、AWSにデータを保存するバックアップソリューション。
   - 主な用途:
     - 既存のバックアップアプリケーション（Veeam, Commvault, NetBackupなど）と連携してクラウドへバックアップ  
     - オンプレミスの古い物理テープライブラリの置き換え
   - **連携例:**  
     - **Amazon S3 Glacier/Glacier Deep Archive**: 長期保存コストを削減  
     - **AWS Backup**: バックアップのライフサイクル管理  
     - **AWS Snowball**: 大量のアーカイブデータを高速移行  

#### **2. 他のAWSサービスとの連携例**
| AWSサービス | 連携内容 |
|------------|---------------------------|
| **Amazon S3** | File Gatewayを使用してNFS/SMB経由でS3にデータを保存し、オブジェクトストレージとして活用 |
| **Amazon S3 Glacier** | Tape Gatewayで仮想テープとしてバックアップし、長期アーカイブを実現 |
| **Amazon EC2** | Volume Gatewayのスナップショットを使い、EC2にディスクをリストア |
| **AWS Backup** | Volume Gatewayと統合して、EBSスナップショットの管理やVTLバックアップを簡素化 |
| **AWS Lambda** | File GatewayでS3に保存されたデータの変更をイベントトリガーとして処理 |
| **Amazon Athena** | File Gateway経由でS3に保存されたログファイルやCSVデータをSQLで分析 |
| **AWS Snowball** | Tape GatewayのデータをAWSに移行する際に大量データ転送を高速化 |

#### **3. 具体的なユースケース**

構成図
![file_gateway_s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/bf34bd3b-33a7-4c5d-995e-dac274f0f9ab.png)

- **オンプレミスのファイルサーバをクラウドストレージ化（File Gateway + S3）**  
  企業のファイルサーバをS3に統合し、オンプレのストレージ負荷を削減。S3のライフサイクル管理で自動アーカイブも可能。

構成図
![aws_disaster_recovery.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/1101458a-4571-4fc4-b7d5-a956831eb700.png)

- **データの災害対策（Volume Gateway + AWS Backup）**  
  オンプレのブロックストレージをVolume Gatewayでバックアップし、AWS Backupで定期的にスナップショットを取得することで、災害復旧環境を実現。

構成図
![aws_tape_gateway_glacier.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/f9829af6-5e4c-4716-ac0f-6b6bb4231504.png)

- **物理テープをクラウドへ移行（Tape Gateway + Glacier）**  
  物理テープをTape Gatewayで仮想化し、S3 Glacierへ移行することで、従来のテープ保管コストや管理の負担を削減。

構成図

![ai_ml_data_collection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/a2d20d19-a116-4163-bd82-44d9b900f237.png)

- **AI/MLデータの収集（File Gateway + S3 + SageMaker）**  
  工場のセンサーや監視カメラのデータをFile Gateway経由でS3にアップロードし、SageMakerで機械学習モデルを訓練。

AWS Storage Gatewayを利用することで、オンプレ環境とAWSクラウドの統合がスムーズに進み、データの可用性・耐久性を高めながら運用コストの最適化が可能になります。
【電脳少女 プログラミング2088 Bランク】 ギャングのアジトをPython3で効率性や可読性を意識してコーディングしてみた

# 概要

今回は、[プログラミングゲームの解答コードを投稿しよう！](https://qiita.com/official-events/efe957f155af900604b3)のQiita公式イベントの記事となります。

paizaの新作プログラミングゲーム 「電脳少女プログラミング2088 ─壊レタ君を再構築─」 の「ギャングのアジト（Bランク）」に挑戦しました。本記事では、提出したコードの解説を行います。


# 開発方針

- 処理時間とメモリ使用量をできるだけ抑え、**効率性**をあげる
- **可読性**の高いコードを心がける
- 使用言語は、**Python3**を選択

# 問題概要

標準入力から以下のフォーマットでデータが与えられます。
1行目にピクセルアートのサイズが与えられ、2行目以降にピクセルアートの配置が記述されます。

このピクセルアートが左右対称であるかを判定し、左右対称なら「**Yes**」、左右非対称なら「**No**」と出力してください。

### 例1）

```
5
0 0 1 0 0
0 1 1 1 0
1 1 1 1 1
0 1 0 1 0
0 0 1 0 0
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/2f4259ef-db53-4005-87d2-55e0de97f721.png)


→ 左右対称なので「**Yes**」 と出力

### 例2）

```
3
0 0 0
1 1 0
0 0 1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/86028057-80ca-4d8d-be1f-aec977ac1775.png)



→ 左右非対称なので「**No**」 と出力


# 処理方式

コードを書く前に、処理方式を整理しちゃいます。
今回の問題のキーとなるのは、「**左右対称の判定方法**」です。


配列の中身を1つずつチェックしていけば、コーディングできますが処理内容が複雑になってしまい、可読性や効率性の面では良くありません。

今回は渡されたピクセルアートを反転したものと比較することで、判定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/0d26a0eb-a562-41a5-a12a-c285e7e80709.png)


また、行ごとにチェックし左右非対称となる場合は、その時点で処理を終了して不要な処理を省くようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/8cc7313e-fa1f-46d1-a2a0-66ac890b8792.png)

# 提出コード

コード量はこれだけです。（コーディング時間は、10分くらいでした）

```python
# coding: utf-8
n = int(input())
for _ in range(n):
    l = list(map(int, input().split()))
    if l != l[::-1]:
        print('No')
        break
else:
    print('Yes')
```


# コード解説

### 1. 標準入力の受け取り

下記コードは、ピクセルアートのサイズを取得し、あとのループ処理で使用するため`int型`を指定しています。

```python
n = int(input())
```

下記コードは、ピクセルアートの1行分を取得する処理です。
`list`や`map`や`split`などを使っていますが、これは競技プログラミングにおける標準入力の取得方法としてよく使われる手法です。「こういうものだ」と覚えておくと便利かもしれません。

変数`l`には`list型`で`[0, 0, 1, 0, 1]`といった内容が格納されます。

```python
l = list(map(int, input().split()))
```

### 2. for-else

Python特有の`for-else構文`を使って、ループ処理が正常に終わったときのみ`Yes`を出力するようにしました。


```python
for _ in range(n):
    # ループ内の処理
else:
    print('Yes')
```


### 3. 左右非対称の判定

`l[::-1]` で リストを逆順にした新しいリストを作成するスライス構文です。
ここで左右非対称と判定された場合に、`No`を出力したあと`break`でループ処理を抜けます。


```python
if l != l[::-1]:
    print('No')
    break
```


# 結果

Bランクの問題なので、処理時間は余裕ですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/85a8b0a1-c22a-45a7-906e-83ee5b1117c7.png)

# 終わりに

今回は、paizaのBランクの問題を解いてみました。

paizaのスキルチェックだと、どのように改善したら良いかや答えが分からなかったりするので、このようなイベントで他人のコードを確認できるのが嬉しいですね。

また、paizaの問題の画面だと、様々な標準入力のパターンを試せなかったため、[paiza.io](https://paiza.io/ja) を使って試しました。ブラウザだけで様々な言語の実行が試せるのでよく使っています。プログラム初心者ほど使ったほうがいいと思うので、ぜひ触ってみてください。

ここまで読んで頂きありがとうございました。
科学計算ライブラリ GSL のインストール

## インストール
Ubuntu では次のようにインストールを行う。

　sudo apt install libgsl-dev

この場合、GSL のバージョンが最新版でない可能性があるが、次のコマンドで GSL のバージョンが確認できる。最新版が必要な場合は後述するソースインストールを行う。

　pkg-config --modversion gsl

ソースインストールの場合は、GSL のサイトからタールボール (*.tar.gz) をダウンロードし、それを解凍したら、そのフォルダの中に入り次のコマンドを実行する。
最新のタールボールはリストの一番下にある gsl-latest.tar.gz を選ぶとよい。

　./configure
　make
　sudo make install

インストール成功後、必要なら環境変数 (C_INCLUDE_PATH, LD_LIBRARY_PATH) の設定を行う。 
Windows でも GSL は利用できるようだが、かなりインストールが面倒なようなので、直接インストールするのではなく **WSL 上で利用するほうがラクチン**である。

## コンパイル

ソースファイル example.c をコンパイルするには以下のようにする。-std=c11 のところで C のバージョンを指定しているが、古いバージョンだと複素数 (complex.h) が標準で使えないので注意すること。

-g オプションはデバッガを使わない場合は不要である。-o オプションを省略すると a.out が出力される。

　gcc -g -std=c11 -o example example.c -lgsl -lgslcblas -lm

-lgsl は libgsl.so (GSLライブラリ本体)、-lgslcblas は libgslcblas.so (低レベル BLAS ライブラリ)、-lm は libm.so (標準C数学ライブラリ) をリンクすることを意味する。

デバッグが終わったら gcc の -g オプションの代わりに -O1, -O2 などを指定してビルドしなおしたほうがよい。
Kaggleをgoogle colabで実装するためにAPIを利用するまで

# 序論
  今日はgoogle colaboでKaggleを行うために学習データをダウンロードするための設定を行います．~~ほんとはローカルのPCでやりたいけど，まだDockerContainerの設定について理解し切れてない...~~

# 理想
  コードを，実行したらランタイムのファイル場所に自動的に格納されれるようにしたい．理由としてはドライブに保存するとなると，学習データセットによっては容量が大きすぎて管理できないから．

# 内容
## Step1 
  Kaggleホームページより.jsonファイルをダウンロード．
アカウントのマイページ設定のところ下の方のcreateAPIをクリック．
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807183/310994a4-143e-4a07-8b05-0003a183e6d8.png)

## Step2
  driveの任意のフォルダに.jsonファイルを置く．
私の場合はColab NotebooksフォルダのKaggleフォルダに置いた．

## Step3
  コードを記載する．
```python
import os
from google.colab import drive
drive.mount('/content/drive')

!cp "/content/drive/MyDrive/Colab Notebooks/Kaggle/kaggle.json" /content/
!chmod 600 /content/kaggle.json

os.environ['KAGGLE_CONFIG_DIR'] = '/content/'
```
上記のコードはドライブにマウントして，Step2に置いたファイルを/content/にコピーし，!chmodで権限を与えています．権限に関してはこれがないと，データセットをダウンロードできないです．

## Step4
  ``!pip install kaggle``
Kaggle用のコマンドを使えるようになるためにインストール
## Step5
  あとはコンペッションのdatasetのところのAPIを取得して下記を記載して実行するだけ．
```
# Kaggleのdataset用のapiを設定．ここではタイタニック
!kaggle competitions download -c titanic
```
下記コードは別で実行．.zipファイルがランタイムにないと実行エラーとなっていしまいます．
```
# 以下でファイルを解凍
%%bash
dir
for file in *.zip; do 
    folder="${file%.zip}"
    mkdir -p "$folder"
    unzip -o "$file" -d "$folder"
done
```
定期ミーティングの準備を簡単に

<h1>開発の経緯</h1>
<article>
大学で行われる定期ミーティング。組織のメンバのグループ分けを手動で名札を並び替えて行っていた。しかし、毎週手動で行うのは負担が大きく、毎年度名札を作り増すのは更に負担だった。そこで、メンバが使い慣れているLINEを用いてグループ分けシステムを開発した。
</ariticle>

<h1>設計の前に</h1>
<article>
上で書いたグループ分けの機能を実装するにあたって、欠席メンバの特定が必要なことに気が付いた。なぜなら、在籍メンバの集合から欠席メンバの集合を引いた差が出席予定のメンバの集合となるからである。そこで今回は、「グループ作成機能」と「欠席管理機能」を併せて実装することにした。
</article>

<h1>設計</h1>
<article>
　上で書いたように、今回はメンバの使いやすさを重視してLINE上で使えるように設計する。調べてみると、LINEを用いた開発にはしばしばLINEmessagingAPIが用いられるようだ。LINEmessagingAPIとはユーザからのメッセージを取得及び任意のタイミングでメッセージを送信できるものらしい。よし、これでフロントエンドの問題は解決した。次はバックエンドをどうするか。少し調べるとGoogleAppScriptなるものを見つけた。このサイトは自身でサーバを設けなくてもGoogleAppScriptによって書かれたスクリプトが実行できるサービスを提供している。しかもLINEmessagingAPIにも対応している！
 <br>
　では、データの保存をどうするか。GoogleAppScriptからはspreadsheetの操作が容易らしいのでそこに記録することにする。
</article>

<h1>大まかなフロー</h1>
<article>
ここでは簡単にOrdered Listで書くことにする。
</article>
<ol>
    <li>公式アカウントにメッセージを送信する</li>
    <li>メッセージによって処理を条件分岐する</li>
    <li>リプライメッセージを設定して返信する</li>
</ol>

<h1>LINEmessagineAPI</h1>
<p>下のコードはLINEmessagingAPIを用いてLINEからメッセージを受け取り、リプライを送信する最も簡単なフレームである。</p>

```
function doPost(e){

  let data = JSON.parse(e.postData.contents);
  let events = data.events;

  for(let i = 0; i < events.length; i++){
    let event = events[i];

    if(event.type == 'message'){

      //メッセージが送信されたときの処理

      let return_text = "ACK";

    　contents = {
     
        // event.replyToken は受信したメッセージに含まれる応答トークン
        replyToken: event.replyToken, 
        messages: [{ type: 'text', text:  return_text }],
    　};  
    
      reply(contents);
    }
  }

function reply(contents){

  let channelAccessToken = YOUR_ACCESS_TOKEN;

  let replyUrl = "https://api.line.me/v2/bot/message/reply"; 

  let options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: 'Bearer ' + channelAccessToken
    },
    payload: JSON.stringify(contents)
  };
  
  UrlFetchApp.fetch(replyUrl, options);
}
```

<h2>>MessagingAPIのイベントタイプ</h2>
<article>
イベントタイプには以下のものがある。

<ul>
    <li>message : メッセージ全般の送信イベント</li>
    <li>follow：フォロー（友達登録 / ブロック解除）イベント</li>
    <li>unfollow：アンフォロー（ブロック）イベント</li>
    <li>unsend：送信取り消しイベント</li>
    <li>text：テキストメッセージの送信イベント</li>
    <li>image：画像送信イベント</li>
    <li>movie：動画送信イベント</li>
</ul>
</article>

<article>
</article>
PDFファイルを指定値まで圧縮させる

# PDFファイルのサイズを圧縮したい
仕事で使うPDFファイルを用意したがファイルサイズに制限があった…
そんなことありませんでしょうか。
私はありました。

# 環境
Windows 11 (22H2)
Python 3.12.4 (packaged by Anaconda)

# 解決策1
### 手作業で圧縮する
一番簡単です。
CubePDFなどを使用してPDF->PDFの印刷を行います。

件数が少なかったり、頻度が低いのであればこれで問題ないと思います。

# 解決策2
### ツールを作成する
今回の目玉です。
pythonのAspose.PDFライブラリを使用してPDFファイルを圧縮します。

ライブラリのインストール
```
pip install aspose-pdf
```

## 参考
https://blog.aspose.com/ja/pdf/compress-pdf-in-python/

#### コード

```python:pdf-compress.py
import aspose.pdf as ap
import os

# カレントディレクトリを実行ファイルのディレクトリに変更
os.chdir(os.path.dirname(os.path.abspath(__file__)))

# カレントディレクトリのファイルリストを読み込む
files = os.listdir(os.getcwd())

# 出力先フォルダを作成
if os.path.isdir('compressed'):
    pass
else:
    os.mkdir('compressed')

# pdfファイルのみを取り出す
pdf_files = [i for i in files if i.endswith('.pdf')]
path = os.getcwd()

for pdf_file in pdf_files:
    in_file = path + '\\' + pdf_file
    compressPdfDocument = ap.Document(in_file)
    count = 1
    quality = 91
    print('-----------')
    print(pdf_file)
    print(str(count) + '回目')
    print(os.path.getsize(pdf_file))
    
    # オブジェクトの作成
    pdfoptimizeOptions = ap.optimization.OptimizationOptions()

    # 画像圧縮を有効にする
    pdfoptimizeOptions.image_compression_options.compress_images = True

    # 画質を設定する
    pdfoptimizeOptions.image_compression_options.image_quality = quality

    # PDFを圧縮
    compressPdfDocument.optimize_resources(pdfoptimizeOptions)

    # 圧縮されたPDFファイルを保存する
    out_file = path + '\\compressed\\' + pdf_file
    compressPdfDocument.save(out_file)
    
    # ファイルサイズの上限を設定
    limit_mb = 1
    limit_byte = limit_mb * ( 1024 ** 2 )
    
    # ファイルサイズが指定値を超える場合画質を落として再実行    
    compressPdfDocument = ap.Document(out_file)
    while os.path.getsize(out_file) > limit_byte:
        count += 1
        quality -= 10
        print(str(count) + '回目')
        print(os.path.getsize(out_file))
        pdfoptimizeOptions.image_compression_options.image_quality = quality
        compressPdfDocument.optimize_resources(pdfoptimizeOptions)
        compressPdfDocument.save(out_file)
        if quality <= 1:
            break

```

#### コードの詳細
挙動としては以下のようになっています。
1. カレントディレクトリ内に出力先ファイルを作成
2. カレントディレクトリ内のPDFファイルを読み込む
3. 指定サイズ以下になるまで画質を段階的に落としながらサイズ圧縮

ポイントは`3. 指定サイズ以下になるまで画質を段階的に落としながらサイズ圧縮`の部分です。

ファイルサイズ制限があるので、そこまでは自動的に繰り返し圧縮できるようにしました。

動作確認用に何回目の圧縮で何byteになったかを出力するようにしていますが、この辺りはツールとしては不必要な部分です。

また、本コード内では指定ファイルサイズを1MBとしていますが、ここは必要に応じて変更してください。
（MB以外の単位を使用する場合は`limit_byte`の調整が必要な点に注意）

```python
    limit_mb = 1
    limit_byte = limit_mb * ( 1024 ** 2 )
```
#### 実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581035/90eab738-8721-4763-86f4-92264acee56c.png)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581035/28f32e97-ff7c-4a64-a3f0-ad5363effc7e.png)

compressedフォルダ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581035/41d99c99-aa06-43b8-ae68-41339ef1f350.png)


# 最後に
画質設定を0-100の間で指定する必要があるため、画質設定:1(10回目の圧縮)でも指定ファイル以下にならなかった場合は最初に挙げた手作業での圧縮で対応する必要があります。

画像や文字の割合によって圧縮率が変わるようなので、ファイルによっては指定サイズ以下にならないことがある点は残念ですが、この記事がどなたかの参考になれば幸いです。
FizzBuzzを制す者、基礎を制す！

「FizzBuzz？ 簡単そう」と思った僕。でも、いざ書くと if の順番 でハマった！間違えると FizzBuzzがFizzになる という罠…。「なぜ？」を考えながら、正しい書き方を整理してみた。
条件の順番が大事！

FizzBuzzの基本ルール:

3の倍数 → Fizz
5の倍数 → Buzz
3と5の倍数 → FizzBuzz（これを最優先に！）

NG例（FizzBuzzが出ない）:
```js
if (count % 3 === 0) { 
    console.log("Fizz"); 
} else if (count % 5 === 0) { 
    console.log("Buzz"); 
} else if (count % 3 === 0 && count % 5 === 0) {  
    console.log("FizzBuzz"); }  
```

☠ if の順番ミス！3の倍数でFizzが出てしまい、FizzBuzzになるはずの数がFizzに…

[僕の失敗談と解決話](https://paizabeginner.wordpress.com/2025/02/23/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-fizzbuzz%e3%82%92%e5%88%b6%e3%81%99%e8%80%85%e3%80%81%e5%9f%ba%e7%a4%8e%e3%82%92%e5%88%b6%e3%81%99%ef%bc%81/)
layoutの@idに+をつける理由

AndroidのLayoutにID名を指定するが、その時に+をつける理由をメモします。
```xml
            <!-- ↓この'+'部分 -->
<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginHorizontal="20dp"
    android:layout_gravity="center"
    android:textSize="16sp"
    android:text="表示テスト"/>
```
公式ドキュメントでは
>文字列の先頭にあるアット記号（@）は、 XML パーサーは ID 文字列の残りの部分を解析して展開し、 定義できます。プラス記号（+）は、新しいリソース名であることを示します。 これを作成して R.java 内のリソースに追加する必要がある 表示されます。

と書かれています。Javaに新しいリソースを生成してるみたい。
私の環境では`+`は使用しなくてもビルドは通り正常に動作します。IDEの方でうまく補完しているかもしれません。
ConstraintLayoutなどでIDの指定をする場合、+は書かずに指定します。ですがこちらも同じく+を書いたとしてもエラー無く動作しますので、絶対に書いてはいけないこともなさそう。

#### 参考

https://developer.android.com/develop/ui/views/layout/declaring-layout?hl=ja#id
【ChatGPT】つたないPromptからしっかりしたPromptを作成するPromptのご紹介です。


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

　今回は、つたないPromptからしっかりしたPromptを作成するPromptのご紹介です。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、ニュースです。

　昨日（2025/02/22）
　　OpenAI Operatorが
　　　日本でも使えるようになりました｡

　もちろん、使えるのは
　　今のところ、Proユーザーのみ。

　それでも
　　今後、Plusユーザーにも
　　　開放される可能性もありますので
　　　　チェックしておきます。

　KEITOさんがYouTube動画を
　　アップしてくれてます。
　　　[唯一見つけたOpenAI Operator（オペレーター）の神活用【ブラウジングAIエージェント】](https://youtu.be/xMycam1Ibc8?si=BxDUFTO_TzeHPAkp)
***
　では、【本題】です。

　今回は、
　　つたないPromptから
　　　しっかりしたPromptを
　　　　作成するPromptのご紹介です。

　こちらが
　　そのPromptを教えてくれた際の
　　　ポストになります。
　　　　[テツメモさんポスト](https://x.com/tetumemo/status/1892742848627540191?t=PbgWz76PszG2wdOQcPektA&s=19)

　テツメモさんは、
　　AIクリエイターです。

　今回のPromptは、こちら。
```Text:つたない→しっかりしたPrompt作成Prompt
#
上記は新人が作成した不十分なプロンプトです。プロンプトエンジニアリングの専門家として詳細かつ明確な変数付きの指示文に改善しコードボックスで出力してください。
```

　つたないPromptに
　　このPromptを追記して送信すれば、
　　　しっかりしたPromptが
　　　　作成されます。

　出力されたPromptの
　　変数部分を書き換えて
　　　送信すれば、
　　　　つたないPromptよりも
　　　　　良いものが出力されます。

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

　今回は、ここまで。
macOSタグが消える原因：インデックス破損と対策

![250223_tagrestore_opt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/c93f1b66-2787-42ab-94c2-12990cfca6a1.jpeg)

## 概要

macOSのFinderで、ファイルにタグを付けてもスマートフォルダやサイドバーの検索結果から消えてしまう問題が定期的に発生します（1〜2ヶ月に1回程度）。再起動やセーフブートでは改善されず、調査の結果、**Spotlightインデックスの破損**が原因と判明しました。

## 症状

![SS 2025-02-22 21.39.06_opt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/110dab04-6510-4fd7-8df1-af0797f6dcfb.jpeg)

:::note
フォルダにタグ（赤）を付けています、サイドバーでは列挙されません。ほんとうは7項目ある。
:::

- ファイル自体にタグが付いているが、タグリストおよび検索結果に現れない
- 再起動やセーフモードでは問題は解消されない

## 原因と解決策

Spotlightのインデックスが定期的に壊れてしまうため、Finderのタグ検索も正常に動作しなくなります。  
この場合、以下のコマンドでシステム全体のインデックスを再構築することで、問題が解決します。

```bash
$ sudo mdutil -E /
```

### コマンドの概要

- **sudo**  
  管理者権限で実行するためのコマンドです。

- **mdutil**  
  Spotlightのインデックス管理ユーティリティです。

- **-E**  
  指定したボリューム上の既存インデックスを削除し、再構築するオプションです。

- **/**  
  ルートディレクトリ全体（内蔵ディスク全体）を対象にすることを意味します。

## 実行手順

1. ターミナルを開く  
2. 上記コマンドを実行する  
3. Spotlightが再インデックスを行うため、しばらく時間がかかる（状況によっては数分～数十分）  
4. 再構築完了後、Finderのタグ検索が正常に動作することを確認する

![SS 2025-02-23 11.45.21_opt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/a7c1e015-42a5-4512-9e67-82faaac6b9f2.jpeg)

:::note
復活！助かる！
:::

## 環境

以下のバージョンで実施しました。

- macOS Sequoia 15.2
- MacBook Pro (14-inch, 2021)

## リンク

:::note warn
ドンズバの記事やディスカッションを発見できませんでした。
:::

:::note
この記事は [📘macOSタグが消える原因：インデックス破損と対策 - MXT Forest](https://silme.zelo-loop.com/mxt/%F0%9F%93%92%E8%A8%98%E4%BA%8B-Tech/%F0%9F%93%98macOS%E3%82%BF%E3%82%B0%E3%81%8C%E6%B6%88%E3%81%88%E3%82%8B%E5%8E%9F%E5%9B%A0%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E7%A0%B4%E6%90%8D%E3%81%A8%E5%AF%BE%E7%AD%96) に基づいています。最新の情報や更新は、元の記事で確認してください。
:::

## まとめ

Finderでタグが消える原因は、Spotlightのインデックスの破損のようです。「sudo mdutil -E /」を実行してインデックスを再構築することで、問題は解消されました。同様の問題に直面している方の参考になれば幸いです。
「アプリケーション"Docker"は、応答しないため開けません。」の解決策

## Dockerが開かない...
　こんにちは。駆け出しエンジニアです。とある日dockerを開こうとしたら、下図のような警告が出ちゃました。

![スクリーンショット 2025-02-23 11.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475239/38f3d1b3-2581-40f1-87c3-8707cd17aee5.png)

Dockerを完全削除し再インストールしても変わらず...

## 解決策
[Docker公式](https://github.com/docker/for-mac/issues/7527)の記事の手順通りにやれば解決できました！

以下は、公式サイトから引用した手順です。

:::note warn
警告
以下のコマンドがどのように動作しているか私自身理解していないため、自己責任でお願いします。
:::

手順1. Docker Desktopを終了し、アクティビティモニタを使って残りのdockerプロセスが実行されていないことを確認する。

手順2. 以下のコマンドを実行する

```terminal:
#!/bin/bash

# Stop the docker services
echo "Stopping Docker..."
sudo pkill '[dD]ocker'

# Stop the vmnetd service
echo "Stopping com.docker.vmnetd service..."
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.vmnetd.plist

# Stop the socket service
echo "Stopping com.docker.socket service..."
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.socket.plist

# Remove vmnetd binary
echo "Removing com.docker.vmnetd binary..."
sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd

# Remove socket binary
echo "Removing com.docker.socket binary..."
sudo rm -f /Library/PrivilegedHelperTools/com.docker.socket

# Install new binaries
echo "Install new binaries..."
sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/PrivilegedHelperTools/
sudo cp /Applications/Docker.app/Contents/MacOS/com.docker.socket /Library/PrivilegedHelperTools/
```
手順3. Dockerデスクトップを再起動する

※これでもうまくいかない場合は、リリースノートから現在サポートされているリリースのいずれかをダウンロードし、アプリケーションを再インストールして、最後にステップ2を再度実行してください。

## 最後に
　正直、上記コードの内容はあまり理解していませんので、なぜ直ったかはわからないです。今後は環境構築についても学んでいこうと考えております。

 【参考記事】
 【Docker公式】https://github.com/docker/for-mac/issues/7527
ubuntuにwordpressをセットアップする手順及び設定。

今回の設定では、ubuntu Apache PHP Mysql等は設定すみで、バーチャルドメイン下のディレクトリ内での設定を条件に記述します。
今回の例はレンタルのクラウドVPS利用し、vscode等にてssh接続可能と言う前提です。
参考サイト：https://www.kagoya.jp/howto/cloud/vps/usevps/
こちらも参考まで。
https://qiita.com/shinsakujazzbass/items/dff4955d56f8426ceb96
/var/www/の直下にバーチャルドメインとしディレクトリ作成例として。
```
# mkdir samplewp //samplewpバーチャルドメインとして設定cerbot利用でhttps化。
# wget https://ja.wordpress.org/wordpress-6.7.2-ja.tar.gz //WordPressサイトよりDL
# tar -xzvf wordpress-6.7.2-ja.tar.gz //解凍されwordpressディレクトリ生成される。
# rm -rf samplewp //一旦samplewp削除。
# mv wordpress samplewp //新たにsamplwpを作成。
# chown -R www-data:www-data samplewp //ユーザを必ずwww-dataに変更。
```
この時点で、ターミナルまたは、vscode等のエディタにて編集できる様準備する。
後は、Mysql上にsample_db等のデータベースをphpMyAdmin等で作成。
そのデーtベースに合わせ、WordPress設定をする。
また今回サーバのPHPバージョンが、複数ありディレクトリ毎にバージョンを指定する設定も紹介します。
```
# update-alternatives --config php
There are 2 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status
------------------------------------------------------------
  0            /usr/bin/php8.4   120       auto mode
* 1            /usr/bin/php7.3   100       manual mode //デフォルトで利用設定
  2            /usr/bin/php8.4   120       manual mode //ディレクトリ内で利用可能

Press <enter> to keep the current choice[*], or type selection number:

```
と言う状況でのWordPress最新のPHP8以上推奨なのでsamplewpの直下に.htaccessに下記を記述する事でPHP8.4利用可能となる。
```
<FilesMatch "\.php$">
  SetHandler "proxy:unix:/run/php/php8.4-fpm.sock|fcgi://localhost"
</FilesMatch>
```
参考サイト：https://qiita.com/shinsakujazzbass/items/e3093f17d2e677950c1b
ubuntu独特設定も有るので、投稿しまた。
Datadog image pull & push(Public ECR to Private ECR)

# はじめに
監視ツールDatadogのImageがpublic ECRにあり、閉域網内のECSでDatadogを利用するため、Public ECRのイメージを取得し、Private ECRにプッシュする必要があります。
その際、CPUアーキテクチャに注意すべきです。


# やり方
- 「docker pull」でPublic ECRからDatadog imageをpull
- 「docker push」でPrivate ECRにDatadog imageをpush

## 実際に発行したコマンド①
```shell
$ docker pull public.ecr.aws/datadog/agent:latest
$ docker tag public.ecr.aws/datadog/agent:latest 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker push 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
```

### エラー
上記の通り、Datadog ImageをPrivate ECRに格納しましたが、ECS taskを起動した結果、エラーが発生しました。

:::note alert
exec /usr/bin/npm: exec format error
:::

### 原因
x86とARMのミスマッチ問題でした。
- ECSのInfrastructure：Linux/ARM64
- docker engineの実行環境：WSLで実行したため、linux/x86_64 
```shell
$ docker system info --format '{{.OSType}}/{{.Architecture}}'
linux/x86_64
```

docker pullをoption指定なしで実行すると、実行環境と同じArchitectureのimageがpullされるため、以下の通り「platform」を指定することが必要です。
```shell
docker pull --platform linux/arm64 public.ecr.aws/datadog/agent:latest
```

## コマンド(修正版)
```shell
$ docker pull --platform linux/arm64 public.ecr.aws/datadog/agent:latest
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker tag public.ecr.aws/datadog/agent:latest 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
$ docker push 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
```

# 備考
コストが安く、性能が高いため、今回はAWSの推奨通りARMを利用しました。
https://tech-blog.yayoi-kk.co.jp/entry/2024/08/09/110000

個人的な考えとしては、AWSにおけるARMの利用はまだMinorと思われますので、主流のやり方(Linux/x86_64)を選択したほうが無難ですが、ARMはRISC（reduced instruction set computer）構造ですので、省電力のメリットもあります。
Vimコマンド

自分用メモ
## ノーマルモード
デフォルトのモード。
「esc」キーでノーマルモードに戻れる



### Undo, Redo
操作を元に戻したり、取り消した操作をやり直す際に使用するコマンド
| 入力 | 結果 |
|:-----------|:------------|
| u  | 操作を元に戻す（←） |
| ctl + r | 取り消した操作をやり直す（→） |


### カーソル移動
十時キーでもカーソル移動は可能だが覚えておくと便利
| 入力 | カーソル |
|:-----------|:------------|
| h  | ←|
| l | → |
| k | ↑ |
| j | ↓ |


## インサートモード
文字入力するためのモード。
「a」「i」キーでインサートモードに入る
| 入力 | 特徴 |
|:-----------|:------------|
| a  | 現在指定しているカーソルが右に一つズレて開始される|
| i | 現在指定しているカーソルから開始される |


## コマンドラインモード
vimコマンドを実行するためのモード
「:」キーの後にコマンドを入力することでコマンドラインモードに入る

### ファイルの保存と終了
| 入力 | 結果 |
|:-----------|:------------|
| q!  | 保存せず終了 |
| q  | 終了<br>※ファイル内容が変更されている場合は使用できない |
| w | 上書き保存 |
| wq | 上書き保存して終了 |

## ビジュアルモード
範囲選択を実行するためのモード
「v」「V」キーでビジュアルモードに入る
「shift」キーを押しながら範囲指定するのと同じ（vimでは不可）
| 入力 | 結果 |
|:-----------|:------------|
| v  | 1文字づつ指定可能 |
| V  | 行単位で指定可能 |

### コピー&ペースト

| 入力 | 結果 |
|:-----------|:------------|
| y  | コピー<br>範囲してした状態で行う |
| p  | ペースト |
git cherry-pickを分かりやすく解説


## はじめに

今回は、Gitの便利なコマンドの一つである `git cherry-pick` について、IT初心者の方にも分かりやすく解説します。

この記事を書こうと思った理由は、私自身が以前Gitについて学習していたものの、現在の現場で実際に `git cherry-pick` を使う機会があり、その記録を残したいと思ったからです。

この記事が、同じようにGitを学習中の方や、これから `git cherry-pick` を使ってみたい方の参考になれば幸いです。

## git cherry-pickとは？

`git cherry-pick` は、他のブランチから特定のコミットだけを現在のブランチに取り込むコマンドです。

通常、ブランチを統合するには `git merge` や `git rebase` を使いますが、これらのコマンドはブランチ全体の変更をまとめて取り込みます。

一方、`git cherry-pick` は特定のコミットだけを選んで取り込むため、「このコミットだけ欲しい！」という場合に便利です。

### どんな時に使うの？

`git cherry-pick` は、主に以下のような場面で役立ちます。

* **バグ修正:** 他のブランチで修正されたバグを、現在のブランチに素早く適用したい場合
* **機能追加:** 他のブランチで開発された特定の機能だけを、現在のブランチに取り込みたい場合
* **ホットフィックス:** 緊急性の高い修正を、メインのブランチに素早く適用したい場合

## git cherry-pickの使い方

ここでは、`git cherry-pick` の基本的な使い方を解説します。

### 1. コミットのハッシュ値を確認

まず、取り込みたいコミットのハッシュ値を確認します。ハッシュ値は、`git log` コマンドで確認できます。

```bash
git log --oneline
```

このコマンドを実行すると、コミットのハッシュ値とコミットメッセージが一覧で表示されます。

### 2. git cherry-pickを実行

取り込みたいコミットのハッシュ値を指定して、`git cherry-pick` を実行します。

```bash
git cherry-pick <コミットのハッシュ値>
```

例えば、ハッシュ値が `abcdef1234567890` のコミットを取り込みたい場合は、以下のようになります。

```bash
git cherry-pick abcdef1234567890
```

### 3. コンフリクトの解消（必要な場合）

取り込むコミットが現在のブランチと競合する場合（コンフリクト）、コンフリクトを解消する必要があります。

コンフリクトが発生した場合は、コンフリクトしているファイルを修正し、`git add` と `git cherry-pick --continue` を実行します。

```bash
git add <コンフリクトを修正したファイル>
git cherry-pick --continue
```

### 4. 取り込み完了

コンフリクトがなければ、これでコミットの取り込みは完了です。

## git cherry-pickの注意点

`git cherry-pick` は便利なコマンドですが、注意点もあります。

* **コミット履歴が変わる:** `git cherry-pick` を使うと、コミットのハッシュ値が変わります。そのため、他の人と共有しているブランチでは、注意が必要です。
* **コンフリクトに注意:** `git cherry-pick` は、コンフリクトが発生しやすいコマンドです。コンフリクトが発生した場合は、慎重に解消する必要があります。

## まとめ

`git cherry-pick` は、特定のコミットだけを他のブランチから取り込む便利なコマンドです。

使いこなすことで、開発効率を上げることができます。

ぜひ、この記事を参考にして、`git cherry-pick` を使ってみてください。
タスクスケジューラでconhostを使用したPowerShellスクリプトの非表示化

# はじめに
タスクスケジューラで`PowerShell`のスクリプトを実行したときに、オプションのウィンドウを非表示`-WindowStyle Hidden`を指定しても、期待に反して一瞬青い画面が表示されてしまいます。

短時間のタスクを実行する際に、一瞬でも画面が表示されるのはあまり好ましい状態ではありません。

## なぜ一瞬青い画面が表示されてしまうのか
PowerShellのGitHubのIssueに書かれている内容です。

>powershell.exe is a console application. The console window is automatically created by the OS when the process starts. The powershell.exe code that processes -WindowStyle Hidden is therefore executed after the console window is opened hence the flash.
[PowerShellのGitHubのIssue](https://github.com/PowerShell/PowerShell/issues/3028#issuecomment-275212445)

Google翻訳：
powershell.exe はコンソール アプリケーションです。プロセスの開始時に、コンソール ウィンドウは OS によって自動的に作成されます。したがって、`-WindowStyle Hidden` を処理する powershell.exe コードは、コンソール ウィンドウが開かれた後に実行されるため、フラッシュが発生します。

# VBScriptは避けたい
完全に非表示にしたい場合、ネット検索すると`VBScript`を使用した方法が散見されます。
しかし、`VBScript`は残念ながら廃止方向(2027年頃にデフォルトで無効)になっているため使用するのは避けたいです。

https://qiita.com/yaju/items/d3aaee0bf876d86c3c69

# conhostを利用する方法
他にいい方法がないか調べたところ`conhost`を利用する方法を見つけたので備忘録として記事にしておきます。

## conhostとは
Windowsオペレーティングシステムの一部で、コマンドプロンプトやPowerShellなどのコンソールアプリケーションのユーザーインターフェースを管理するプロセスです。具体的には、テキストのレンダリングやコピー・ペースト機能などを提供します。Windows Vista以降のバージョンで導入されました。
通常、システムのC:\Windows\System32フォルダーに格納されており、Windowsの起動時に自動的に起動します。

### headlessオプション
`conhost`にはオプションに`headless`があり、コンソールウィンドウを表示せずにバックグラウンドでコマンドを実行するためのオプションです。これにより、コンソールアプリケーションがユーザーに見えない形で実行されるため、視覚的な干渉を避けることができます。

コマンドプロンプトで確認できます。

```bat
conhost --headless powershell -NoProfile -ExecutionPolicy Bypass -File C:\Tool\Task\example.ps1
```

# タスクスケジューラーの指定方法
C:\Tool\example.ps1 を動かす場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/cd3a7d33-f12a-45d8-bd46-9cf99bea8321.png)

1.プログラム/スクリプトに「conhost.exe」をセットします
2.引数の追加に「--headless powershell -NoProfile -ExecutionPolicy Bypass -File C:\Tool\Task\example.ps1」をセットします
3.開始(オプション)に「C:\Tool\task」をセットします

## 実行後
タスクスケジューラからタスクを実施、PowerShellスクリプトが非表示で実行され、CSVファイルが出力された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/20e889b7-fc5d-4d7f-ba56-d44c7e5dd967.png)

## 補足
* PowerShellのオプション `-NoProfile` は、PowerShellの実行時に読み込む環境情報を読み込まないため、起動が多少速くなります。不要な場合は指定しなくてもいいです

* タスクスケジューラーの開始(オプション)は、PowerShellスクリプトの作業用の「カレントディレクトリ」を指定するためです。不要な場合は指定しなくてもいいです

### CSVファイル出力スクリプト
サンプルで使用したCSVファイル出力スクリプト

```powershell:example.ps1
# 出力するCSVファイルのパス
$csvFilePath = "output.csv"

# 出力するCSVファイルのパス
$data = @(
    [PSCustomObject]@{ID=1; 名前="山田"; 年齢=30},
    [PSCustomObject]@{ID=2; 名前="佐藤"; 年齢=25},
    [PSCustomObject]@{ID=3; 名前="鈴木"; 年齢=40}
)

# 一旦UTF-8でエクスポートし、それをShift_JISで保存
$data | Export-Csv -NoTypeInformation $csvFilePath -Encoding Default
```

# 最後に
これで、非表示のためだけに`VBScript`を使用することとおさらばすることができますね。