OmniAICreator/Qiita-1.07M huggingface dataset:
mkcertを使って、サクッとhttps通信などのための自己署名SSL証明書を作る

# 概要
- HTTPSプロトコルのWebサーバー等を立てるためには、SSLサーバー証明書が必要です。
- 3か月有効期間のSSLサーバー証明書を無料で発行してくれる、Let's Encryptのような機関は存在しますので、そちらをお使いいただくのが一般的ですが、
- ubuntu22.04には、お気軽に自己署名証明書を作成するパッケージ、mkcert が存在します。
- 今回は、mkcertの使い方の簡単な説明をしてみたいとおもいます。

# 前提
- ubuntu22.04 はインストール済であると仮定します。(WSL2でもおそらく可能なはず)


# 手順
- まず、mkcertパッケージを導入してください
```
$ sudo apt install mkcert
```

- 次に、ローカルのルート証明書を作成します。
```
$ mkcert -install
```
- 生成される場所は各ユーザーのホームディレクトリ内になります。
```
 ~/.local/share/mkcert/rootCA.pem ・・・ローカルのルート証明書
 ~/.local/share/mkcert/rootCA-key.pem ・・・秘密鍵
```

- 出来上がった rootCA.pem をWindows上にコピーしたのち、拡張子 .crt を追加します。
```
rootCA.pem.crt
```
- これをWindowsでダブルクリックして、
-- 「証明書のインストール」--> 「現在のユーザー」 --> 「証明書を次のストアに配置する」--> 「信頼されたルート証明機関」
-- インストールを実行します。

**ここまでの操作で、ルート証明書作成と、Windowsへのインストールは完了です。**

-
-
-

# SSLサーバー証明書
**次は、Webサイトごとの SSLサーバー証明書を作成します。（複数作成可能）**
- 再びLinux環境にて、
```
$ mkcert www.example.com
```
 www.example.com.pem ・・・SSLサーバー証明書
 www.example.com-key.pem ・・・秘密鍵

- 「www.example.com」のところは、実際の設置予定のWebサーバーのURL（ドメイン名）を記述します。
-  上記 SSLサーバー証明書と秘密鍵をWebサーバー上の
```
 /etc/ssl/certs/www.example.com.pem
 /etc/ssl/private/www.example.com-key.pem
```
のように配置して、Apache等のSSL証明書ファイルとして指定してください。

# 補足情報
- この方法で作成した SSLサーバー証明書 の有効期間は27か月です。（約２年３か月）
- 自己署名したローカル・ルート証明書は有効期限10年で作成されているようですので、２年３か月後はWebサイトごとの SSLサーバー証明書を再作成してWebサーバー側に設置するだけで継続できるようです。
- Android端末にも導入可能です。

- 以前(10年ぐらい前？)は、opensslコマンドを使用して、自己署名SSL証明書の有効期間10年が使えていたのですが、現在は主要なブラウザが3年以上の有効期間の証明書を無効にする扱いになっているようです。（そして、さらに短くされるという話もあります）

- ローカルLAN内にHTTPSサーバーを設置する場合、Let's Encryptでは外部からのIPアドレスのバリデーションが不可能なので、自己署名証明書を使う用途はあると思います。(※1)

- また、非公開サーバーでテストする場合も、テスト端末だけにルート証明書を入れてLet's Encryptを使わない、というのもありなのかな、と。（まあ事情によりますが）

- :
- さらにどうでもいいことなんですが、SSLサーバー証明書はドメイン名を証明する書類なのでIPアドレスのみのサーバーには使えません（SSLになりません）。こういう場合は、管理可能なDNSサーバーに、ローカルサーバーのIPアドレス（192.168とかで始まるIP）で適当な名前のサーバーを登録しておくことは一応可能です。もちろんLANの外側からはアクセス出来ないのは許容ということで。

- ;
- (※1) 一応裏技があって、３か月ごとの更新時のみ、ローカルサーバーをグローバルIP(ルーターからstaticルートを設定して引き込む)にして、外部からアクセス可能にしてLetsの更新を掛ける手とか、DNSのTXTレコードでLetsの認証を掛ける方法とか・・・（色々面倒ですけど）
PythonでExcelワークシートの背景を設定する方法

データ分析とレポート作成において、視覚的な美しさは情報を効果的に伝える上で重要な役割を果たします。Excelのワークシートを使用する際、データの読みやすさと情報のインパクトを高めるために、背景色や画像の設定が重要です。Pythonの力を借りれば、開発者は簡単にExcelファイルを操作し、ワークシートの外観をカスタマイズすることができます。本記事では、Pythonプログラムで**Excelワークシートの背景色と画像を設定する方法**を紹介します。

- **[Excelワークシートの背景色を設定する](#excelワークシートの背景色を設定する)**
- **[Excelワークシートの背景画像を設定する](#excelワークシートの背景画像を設定する)**

本記事で使用する手法には、Spire.XLS for Pythonが必要です。[Spire.XLS for Python](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)は公式ウェブサイトからダウンロードするか、PyPIからインストールすることができます: `pip install Spire.XLS`。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## Excelワークシートの背景色を設定する
指定したセル範囲の背景色を設定するには、**CellRange.Style.Color** プロパティを使用します。ワークシート内の特定のセル範囲の背景色を設定する手順は以下の通りです:
1. **Workbook** クラスのインスタンスを作成します。
2. **Workbook.LoadFromFile()** メソッドを使用してExcelワークブックをロードします。
3. **Workbook.Worksheets.get_Item()** メソッドを使用してワークシートを取得します。
4. **Worksheet.AllocatedRange** プロパティを使用して使用されている範囲を取得します。
5. **CellRange.Style.Color** プロパティを使用して使用されている範囲の背景色を設定します。
6. **Workbook.SaveToFile()** メソッドを使用してワークブックを保存します。

**コード例**
```python
from spire.xls import *
from spire.xls.common import *

# Workbookクラスのインスタンスを作成する
wb = Workbook()

# Excelファイルを読み込む
wb.LoadFromFile("サンプル.xlsx")

# ワークシートを取得する
sheet = wb.Worksheets.get_Item(0)

# ワークシートの使用範囲を取得する
usedRange = sheet.AllocatedRange

# 使用範囲の背景色を明るく柔らかい色に設定する
usedRange.Style.Color = Color.FromRgb(144, 238, 144)

# ワークブックを保存する
wb.SaveToFile("output/ワークシートの背景色.xlsx", FileFormat.Version2016)
wb.Dispose()
```

**結果**
![Excelワークシートの背景色を設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b256a25b-4121-7f35-72a7-0db293bbe600.png)

## Excelワークシートの背景画像を設定する
Excelワークシートの背景画像を設定するには、**PageSetup** クラスを使用します。**Worksheet.PageSetup.BackgroundImage** プロパティを使用することで、ワークシート全体に背景画像を設定することができます。手順は以下の通りです:
1. **Workbook** クラスのインスタンスを作成します。
2. **Workbook.LoadFromFile()** メソッドを使用してExcelワークブックをロードします。
3. **Workbook.Worksheets.get_Item()** メソッドを使用してワークシートを取得します。
4. **Image.FromFile()** メソッドを使用して画像を読み込みます。
5. **Worksheet.PageSetup.BackgroundImage** プロパティを使用してワークシートの背景画像を設定します。
6. **Workbook.SaveToFile()** メソッドを使用してワークブックを保存します。

**コード例**
```python
from spire.xls import *
from spire.xls.common import *

# Workbookクラスのインスタンスを作成する
wb = Workbook()

# Excelファイルを読み込む
wb.LoadFromFile("サンプル.xlsx")

# ワークシートを取得する
sheet = wb.Worksheets.get_Item(0)

# 画像を読み込む
image = Image.FromFile("背景画像.jpg")

# ワークシートの背景を設定する
sheet.PageSetup.BackgoundImage = image

# ワークブックを保存する
wb.SaveToFile("output/ワークブックの背景画像.xlsx", FileFormat.Version2016)
wb.Dispose()
```

**結果**
![Excelワークシートの背景画像を設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6ce62d55-1501-94ea-2110-c34f5d22a385.png)

本記事では、Pythonコードを使用してSpire.XLS for Pythonを使ってExcelワークシートの背景色や画像を設定する方法を示しました。このAPIの使用中に問題が発生した場合は、技術サポートのために[Spire.XLS Forum](https://www.e-iceblue.com/forum/spire-xls-f4.html)にアクセスしてください。
Excelファイルを操作するための[Spire.XLS for Pythonチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html)もあります。
[DatePicker]DatePickerのカスタマイズ方法を紹介！

# はじめに
過去に投稿した「[[DatePicker]DatePickerの使用方法を紹介！](https://qiita.com/moriokatakashir/items/7a7614781543b1a57b63)」では、
DatePickerを使用して、日付と時刻を入力するためのコンポーネント作成、使用方法を紹介しました。
今回は、さらに進んでDatePickerのカスタマイズ方法を紹介します！

# 1.スタイルのカスタマイズ
まず、DatePickerのスタイルをカスタマイズします。
このcssをコンポーネントへ挿入すると、ポップアップするカレンダーの大きさや位置、テキストの大きさ等をカスタマイズできるようになります。

```css
/* styles/InputDateTime.module.css */

.datePicker {
  width: 100%;
  max-width: 90%;
  margin: 0 auto;
  padding: 5px;
  box-sizing: border-box;
  font-size: 36px;
  text-align: center;
}

.customCalendar {
  /* カレンダーに対するスタイルを指定 */
  transform: scale(1.3);
  margin: 18px 0 0 60px;
}
```
# 2.InputDateTimeコンポーネントのカスタマイズ
次に、InputDateTimeコンポーネントに、以下の3点のカスタマイズを施します！
・先ほどのスタイルを適用
・ヘッダーをカスタム
・テキストの日本語化

```jsx
// components/InputDateTime.js

import React from "react";
import DatePicker, { registerLocale } from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
import styles from "/src/styles/InputDateTime.module.css";
import ja from "date-fns/locale/ja";

/**
 * @param selectedDate - 選択された日付と時刻
 * @param onChange - 日付と時刻が変更されたときのコールバック関数
 */
const InputDateTime = ({ selectedDate, onChange }) => {
  registerLocale("ja", ja);

  const renderCustomHeader = ({ date, decreaseMonth, increaseMonth }) => {
    const year = new Intl.DateTimeFormat("ja", { year: "numeric" }).format(
      date
    );
    const month = new Intl.DateTimeFormat("ja", { month: "long" }).format(date);

    return (
      <div className={styles.customHeader}>
        <button onClick={decreaseMonth}>{`<`}</button>
        <span>{` ${year} ${month} `}</span>
        <button onClick={increaseMonth}>{`>`}</button>
      </div>
    );
  };

  return (
    <DatePicker
      selected={selectedDate}
      onChange={(date) => onChange(date)}
      showTimeSelect
      timeFormat="HH:mm"
      timeIntervals={15}
      dateFormat="yyyy/MM/dd, HH:mm"
      timeCaption="時間"
      customInput={<CustomInput />}
      calendarClassName={styles.customCalendar}
      locale="ja"
      renderCustomHeader={renderCustomHeader}
    />
  );
};

// カスタム入力フィールドのコンポーネント
const CustomInput = React.forwardRef(({ value, onClick }, ref) => (
  <input
    value={value}
    onClick={onClick}
    readOnly
    ref={ref}
    className={styles.datePicker}
  />
));

// displayNameを追加
CustomInput.displayName = "CustomInput";

export default InputDateTime;
```
![スクリーンショット_20240314_152040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570986/2e787934-b300-926f-1841-ec35d03ebae2.png)

![スクリーンショット_20240314_152125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570986/e575e0f8-4b0f-68f3-238f-91ab9bf95f6d.png)


# まとめ

今回は、DatePickerのカスタム例を紹介しました！
今回の記事を参考に、DatePickerを色々とカスタムしてみてください！
Salesforce認定アドミニストレーターを受験することになったから過去問を解いてアウトプットしていこうと思う。Q71 ~ Q80

## Q71. 過去のユーザーの履歴とそれらに関連づけられたレコードを追跡できなくなるため, ユーザーレコードを新しいユーザーデータで上書きしないことをお勧めする.
A: 間違い
### 解説
ユーザーデータの上書きは,　基本的には推奨されないが, その理由はレコードの追跡ができなくなるから, ではない. 上書きすることでセキュリティやデータの整合性に関する問題が発生する可能性があるから推奨されていない. Salesforceのシステムは履歴情報とレコードの関連性を保持するため, 上書きによって過去の履歴情報が失われることはない.

## Q72. 次のうち, ケースが関連するオブジェクトは？
選択肢 : 
    A連絡先
    Bアカウント
    Cキャンペーン
    D予測

A: A, B
### 解説
「キャンペーン」と「予測」は, ケースに直接関連するものではない.

## Q73. セールスラップは, 取引の管理に苦労しています. 経営陣は管理者に営業担当者がより多くの商談に優先順位をつけて成約できるように支援するよう依頼した. 管理者とより多くの取引を閉じる必要がある.
選択肢 : 
    A　Einstein リードスコアリング
    B　Einstein 商談スコアリング
    C　Einstein 検索のパーソナライズ
    D　Einstein 活動キャプチャ

A: B
### 解説
Einstein商談スコアリングとは, SalesforceのAI機能の一部として提供されており, 商談の成功確率をスコアリングすることで営業担当者がどの商談に優先的に取り組むべきかを判断するのに役立つ.

## Q74. 役割について正しいのはどれですか？
選択肢 : 
    Aレコード タイプの作成中にロールが必要です。
    Bユーザーが組織に対して持つ可視性のレベルを制御します。
    Cユーザーは 1 つのロールに関連付けることができます。
    Dユーザーは 1 つのロールに関連付ける必要があります。

A: B, C
### 解説
役割はあくまでオプションであり, 関連付ける必要があるわけではない.

## Q75. 組織で個人取引先が有効になると, 「個人取引先」という名前のデフォルトの個人取引先レコードタイプが自動的に作成されます.
A: はい
### 解説
Salesforceで「個人取引先」機能を有効にすると, システムは自動的に「個人取引先」という名前のデフォルトのレコードタイプを作成する.

-- 個人取引先 公式ヘルプ --
https://help.salesforce.com/s/articleView?id=sf.account_person.htm&type=5

## Q76. 数式項目はいつ再計算されますか？
A: 自動計算
### 解説
数式フィールドは, リアルタイムで自動計算される.

## Q77. 管理者は, 新しいレコードを作成することになっている本番環境のフローを持っている. ただし, 新しいレコードは作成されていません. 原因はなんですか？
A: フローが非アクティブ
### 解説
フローに期待通りの動作をさせるためには, 実際に動作させる前に「アクティブ化」する必要がある.

## Q78. 「Number of Golfers at Client」という Account オブジェクトに「Number」タイプのカスタム項目を作成しました. フィールドに次のデータを入力します: [073] Saleforce CRM には何が保存されていますか?
A: 73
### 解説
「Number」タイプのフィールドは数値を保存するためのものなので, 先頭の0は無視され, 73が保存される.

## Q79. Salesforce.com IdeaExchangeにアイデアを送信できるのは誰ですか？
A: Idea Exchangeにログインしているユーザー
### 解説
Idea Exchangeとは, Salesforceのユーザーコミュニティが新しい機能や改善を提案し, 投票するためのプラットフォームです. 

-- Idea Exchangeについて --
https://sf.forum.circlace.com/articles/548953249521078272

## Q80. レポートをスケジュールするために指定する必要があるのは, 次のうちどれ？
選択肢 : 
    A 希望開始時間
    B 実行中のユーザー
    C メール通報
    D 開始日
    E すべて

A: E
### 解説
Aについて, レポートが実行される具体的な時間を指定する.
Bについて, レポートが実行される際の, ユーザーコンテキストを指定する.
Cについて, 結果を受け取るユーザーやグループへの通知設定をする.
Dについて, スケジュールの開始日を指定する.
.htaccess URL正規化やリダイレクトの書き方 index.html index.phpなし

滅多にやらない作業なので、自分用のメモとして残しておきます。

# 結論
.htaccessに下記コードを記述する
~~~
RewriteCond %{THE_REQUEST} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
~~~

# .htaccessファイル配置場所
.htaccessはWordPressをインストールしたディレクトリ直下（wp-adminやwp-contentディレクトリと同じ階層）に配置されています。
アクセルキャンプ復習動画　3/6 復習動画　関数その①

```lua
local function create_block()
	local block = Instance.new("Part", game.workspace)
	block.Position = Vector3.new(10, 10, 10)
	block.Size = Vector3.new(5, 5, 5)
	block.Anchored = true
end

create_block()
```
Unity UIでScriptからButtonをSelect状態にする

## Unity UIのButtonをSelect状態にする方法

`EventSystem`の`SelectedGameObject`にGameObjectを指定することでSelect状態にできる。
```c#
EventSystem.current.SetSelectedGameObject(button.gameObject);
```

たとえば、`Start()`時に`Button`をSelect状態にしたいとき。

```C#
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class UIClass : MonoBehaviour
{
    [SeializeField] private Button button;

    private void Start()
    {
        EventSystem.current.SetSelectedGameObject(button.gameObject);
    }
}
```

`Button`以外でも、`Toggle`、`InputField`など`Selectable`クラスを継承しているクラスは、この方法でSelect状態にできる。

## Start()時に上手くSelect状態にならない時
タイミングで、`Button`オブジェクトがまだ読み込まれていないうちに`Start()`が呼ばれると`SetSelectedGameObject`がきかないときがある。
その時は、コルーチンで1フレーム待ってから、`SetSelectedGameObject`を呼ぶ。

```C#
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections;

public class UIClass : MonoBehaviour
{
    [SeializeField] private Button button;

    private void Start()
    {
        StartCoroutine("ForceSelect");
    }

    private IEnumerator ForceSelect()
    {
        yield return null; // 1フレーム待つ
        EventSystem.current.SetSelectedGameObject(button.gameObject);
    }
}
```

## 参考
https://note.com/futinuro/n/nbb51267ef422
コードジェネレータを使用してWEBサイトにSNSシェアボタンを実装してみた

# はじめに
WEBサイトにSNSシェアボタンを実装する方法について調査する機会がありましたので記事にまとめました。
・調査対象はLINE、X、Facebook
・公式サイトのコードジェネレータを使用
・実行結果のスナップショットはiPhone13mini(iOS17.3.1)で取得
・2024年3月時点の情報をもとに作成

# LINE
■コードジェネレータ
https://developers.line.biz/ja/docs/line-social-plugins/install-guide/using-line-share-buttons/#using-official-line-icons

■生成されたサンプルコード
```
<div class="line-it-button" data-lang="ja" data-type="share-b" data-env="REAL" data-url="https://www.generosity.co.jp/" data-color="default" data-size="large" data-count="false" data-ver="3" style="display: none;"></div>
<script src="https://www.line-website.com/social-plugins/js/thirdparty/loader.min.js" async="async" defer="defer"></script>
```

■実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/674bc1e7-6728-7c8d-efe8-06536ae50267.png)


# X
■コードジェネレータ
https://publish.twitter.com/?buttonType=TweetButton&widget=Button
下記画面が表示されるので、「set customization options」でパラメータを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/5dfedf9b-28e2-2918-a58e-b501862a084e.png)

■生成されたサンプルコード
```
<a href="https://twitter.com/share?ref_src=twsrc%5Etfw" class="twitter-share-button" data-text="ここが本文" data-url="https://www.generosity.co.jp/" data-hashtags="tag1" data-show-count="false">Tweet</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
```

■実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/5a044c4e-e4f0-196c-1c78-32de4687ca02.png)

# Facebook
■コードジェネレータ
https://developers.facebook.com/docs/plugins/share-button/?locale=ja_JP

■生成されたサンプルコード
```
<div id="fb-root"></div>
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v19.0" nonce="XYnRGtqe"></script>
<div class="fb-share-button" data-href="https://generosity.co.jp/" data-layout="" data-size=""><a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fgenerosity.co.jp%2F&amp;src=sdkpreparse" class="fb-xfbml-parse-ignore">シェアする</a></div>
```

■実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/f424ece3-7745-f1a2-a599-49724f8355e6.png)
Facebookアプリは起動されなかったです。

# 最後に
コードジェネレータに必要なパラメータを入力するだけで、簡単にシェアボタンを生成することができます。
そのため、開発者は煩雑なコーディング作業から解放され、代わりにより多くの時間を他の重要な開発タスクに費やすことができます。

また、コードジェネレータは、SNSプラットフォームの最新の仕様や機能に常にアップデートされています。これにより、常に最新のシェアボタンを利用することができます。

総括すると、コードジェネレータは開発プロセスをスムーズにし、開発者がより効率的に作業できるよう支援します。そのため、SNSシェアボタンの実装を検討する際には、コードジェネレータの活用を検討することをお勧めします。
Ruby on Railsのモジュラーモノリス化を推し進めるpacks-railsというgemがすごいという話📦


こんにちは、akitoshigaです。

現在Ruby on Railsのモジュラーモノリス化を行っており、その際に利用した`packs-rails`というgemが大変便利だったのですが情報が少なかったので紹介します。

## 1. packs-railsとは?
一定の規則に従って、単一のRails on Railsアプリケーションをモジュール分割するgemです。
このgem単体でも利用できますが主に[packwerk](https://github.com/Shopify/packwerk)と組み合わせて使われることが多いと思います。
`packwerk`とはRuby on Railsの静的解析を行うgemでモジュールごとの依存関係の管理ができます。

https://github.com/rubyatscale/packs-rails

## 2.一体何がすごいのか?
### 2.1 （ほぼ）設定不要
`packs-rails`は内部で`zeitwerk`というgemを利用しています。
`packs-rails`の指定のディレクトリ構成に従えば、`zeitwerk`のおかげで面倒な設定をせずにディレクトリ・ファイルの移動が可能になります。

`zeitwerk`とはRailsでオートロードの仕組みを提供するgemのことです。
Railsのコードでいちいち`require`しなくて良いのはこのgemのおかげです。

https://github.com/fxn/zeitwerk

## 3. 使い方
gemをインストール後、以下の構成に従って、ディレクトリを配置するだけです。
``` 
# https://github.com/rubyatscale/packs-rails のREADME.mdより抜粋

package.yml # root level pack
app/ # Unpackaged code
  models/
  ...
packs/
  my_domain/
    package.yml # See the packwerk docs for more info
    package_todo.yml # See the packwerk docs for more info
    app/
      public/ # Recommended location for public API
        my_domain.rb # creates the primary namespaces
        my_domain/
          my_subdomain.rb
      services/ # Private services
        my_domain/
          some_private_class.rb
      models/ # Private models
        some_other_non_namespaced_private_model.rb # this works too
        my_domain/
          my_private_namespaced_model.rb
      controllers/
      views/
    config/
      initializers/ # Initializers can live in packs and load as expected
    lib/
      tasks/
    spec/ # With packs-rails, specs for a pack live next to the pack
      public/
        my_domain_spec.rb
        my_domain/
          my_subdomain_spec.rb
      services/
        my_domain/
          some_private_class_spec.rb
      models/
        some_other_non_namespaced_private_model_spec.rb
        my_domain/
          my_private_namespaced_model_spec.rb
      factories/ # packs-rails will automatically load pack factories into FactoryBot, see Ecosystem and Integrations#factory_bot below
        my_domain/
          my_private_namespaced_model_factory.rb
  my_other_domain/
    ... # other packs have a similar structure
  my_other_other_domain/
    ...
```
ドキュメントルートの`apps/`と同じ階層の`packs/`の中に任意のディレクトリ（図の`my_domain`）を配置します。
そのなかで通常のRuby on Railsアプリと同じ感覚でファイルを配置することができます。

上記のディレクトリ構成に加えて`helpers`や`mailers`などの任意のディレクトリも配置することが可能ですが、`assets/`に関しては別途設定が必要です。

それについては以下の記事で詳しく説明しています。

https://qiita.com/akitoshiga/items/a898a24524689b50f6bc
    
## 4.注意点
### 4．1.ディレクトリ作成は手動で行う必要がある
あたりまえですが、上記の階層構造のディレクトリを作成しなければいけないのでそれがやや手間だなと思いました。
自分はシェルスクリプトを作成して対応しました。

### 4．2．名前空間は共有されている
これも当たり前なのですが、モジュール分けしたからといって名前空間が新たに定義されるわけではないので、モジュール間で同一名のクラス名があったときは衝突します。

同名のクラスを定義したい場合は上のmy_domain/配下にモジュールを定義する必要があります。
既存のRailsをモジュール分割する場合は新たに名前空間を追加するのでその点が大変かと思います。
## 5.まとめ
注意すべき点はありますが、かなり簡単に利用できるので最初感動しました。

Railsのモジュラーモノリス化はいくつか実装手段がありますが`packs-rails`おすすめなので是非選択肢の1つとして検討してみてください🙌
Numpyが18年ぶりのメジャーアップデート！　改善点、変更点まとめ

![numpy_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743979/4ed7ccbd-2272-e939-a7cc-11f82825d31b.png)

-------------------------------------------------------------------
# NumPy 2.0.0の主要な変更点

皆さんもお世話になっているであろう科学計算ライブラリNumPyが、2006年以降初めてのメジャーアップデートを発表しました。そこで、変更点をざっくりとまとめてみました。以下は変更点の一部であり、それ以外については実際のドキュメントを参照してください。

> 免責事項：この記事は、NumPy 2.0.0の変更点について個人的な見解を述べたものであり、NumPyの開発チームや関係者の公式な見解を代表するものではありません。変更点の影響や対応方法については、必ず公式のリリースノートと移行ガイドを参照してください。また、この記事には不正確な情報が含まれている可能性があります。記事の内容を実際のプロジェクトに適用する前に、必ず公式ドキュメントで情報を確認してください。

**概要**
------

*   2006年以来の最初のメジャーリリース
*   破壊的な変更あり
*   多くの新機能とPython/C APIの変更が含まれる
*   ABIの変更、型昇格ルールの変更、非推奨の警告のないAPI変更などの重大な変更を含む
*   Python APIとC APIから非推奨の関数、エイリアス、マクロなどが削除された
*   将来のNumPyの改善とメンテナンスを容易にするための内部変更が多数含まれる

**新機能**
-------

* 可変長文字列dtype (StringDType)
* numpy.strings名前空間、文字列操作のための高速なユニバーサル関数(ufuncs)
* numpy.fftでのfloat32/longdoubleサポート
* Array API標準のサポート

これらは NumPy 2.0 の新機能のほんの一部です。リリースノートには他にも多くの新機能、改善、変更が記載されています。
## パフォーマンスの改善

- ソート関数の高速化
- macOSでの線形代数の高速化
- 固定長文字列操作の高速化
- 新しいトレース/イントロスペクションAPI

## Python APIの改善

- パブリックAPIとプライベートAPIの明確な分離
- 非推奨の関数/エイリアスの削除
- 標準的なdtype名と新しい`isdtype`関数

## C APIの改善

- カスタムdtype作成のための新しいパブリックAPI
- 古い関数/マクロの削除
- 新しい初期化関数

## 動作の改善

- 型昇格の動作の改善 (NEP 50)
- 64ビットWindowsでのデフォルト整数型の変更 (64ビット整数型に)
- 最大配列次元数の変更 (32 → 64)

## ドキュメントの改善

- リファレンスガイドのナビゲーションの改善
- モジュール構造のドキュメント追加
- ビルドドキュメントの書き直し

## 下位互換性の問題

- Python/C APIの重大な変更
- NumPy ABIの変更 (1.xx用バイナリは2.0で動作しない)

## サポートPythonバージョン

- 3.9〜3.12

---

以上が、NumPy 2.0.0の主要な変更点のまとめです。詳細については、公式のリリースノートと移行ガイドを参照してください。

- [NumPy 2.0.0 リリースノート](https://numpy.org/devdocs/release/2.0.0-notes.html)
- [NumPy 2.0 移行ガイド](https://numpy.org/devdocs/numpy_2_0_migration_guide.html)

# 移行の際は慎重に！
BytePlus レコメンド事例紹介

今日は、弊社顧客ディップ株式会社、株式会社テラーノベルの公開事例紹介ビデオをご共有します。興味があったらぜひ見てみてください。

両社ともBytePlus Recommend（BytePlus レコメンド）をご利用いただいています。両社のビジネスに貢献できていることを嬉しく思います。


## ディップ株式会社事例
ビデオ
<iframe width="1280" height="720" src="https://www.youtube.com/embed/Cdrb28lIr-4" title="Enhancing User Experiences and Conversion Rates with BytePlus Recommend" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


ウェブサイトケーススタディ
https://www.byteplus.com/ja/case-study/baitoru



## 株式会社テラーノベル事例
ビデオ
<iframe width="1280" height="720" src="https://www.youtube.com/embed/c87PQsNClaU" title="Supercharging User Engagement with BytePlus Recommend&#39;s Advanced Deep Learning Techniques" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

ウェブサイト
https://www.byteplus.com/ja/case-study/teller-novel
Ruby 3.2以上 (というか psych 4.0.5 以上) と timecop 0.9.5以下を組み合わせると、YAML の Date がパースされなくなる

# 現象

Ruby 3.2 (というか psych 4.0.5以上)と timecop 0.9.5以下を組み合わせると、YAML の Date がパースされなくなる。


```ruby:Gemfile
gem 'psych', '4.0.5'
gem 'timecop', '0.9.5'
```

```ruby:main.rb
require 'yaml'
require 'timecop'

puts YAML.unsafe_load('2024-03-14').class
# => String
```




# 原因


psych の `Psych::ScalarScanner#tokenize` で Date のパースをしているので、モンキーパッチしてエラーを見てみる。[v4.0.5/lib/psych/scalar_scanner.rb#L63-L69](https://github.com/ruby/psych/blob/v4.0.5/lib/psych/scalar_scanner.rb#L63-L69) を一部改変したものが以下。

```ruby
module Psych
  # 省略...
  class ScalarScanner
    # 省略...
    def def tokenize string
      # 省略...
      elsif string.match?(/^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/)
        require 'date'
        begin
          class_loader.date.strptime(string, '%F', Date::GREGORIAN)
        rescue ArgumentError => e
          # エラーの出力
          pp e
          string
        end
```

これで動かすと、以下のようなエラーが得られる。 Timecop が `Date.strptime` の第3引数で怒っていることがわかる

```
#<ArgumentError: Timecop's Date::strptime_with_mock_date only supports Date::ITALY for the start argument.>
```

[Ruby 3.1 には psych 4.0.3](https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/)が同梱されており、 [Ruby 3.2 には psych 5.0.1](https://www.ruby-lang.org/ja/news/2022/12/25/ruby-3-2-0-released/)が同梱されているが、psych 4.0.5 で、Date 型とみなした文字列のパース(`Date.strptime`)の基準日が `Date::ITARLY` から `DATE::GREGORIAN` に変更される修正が行われた。

参考
- [Dump Date/DateTime as proleptic Gregorian date as well as Time #573](https://github.com/ruby/psych/pull/573)
- [Date.strptime](https://docs.ruby-lang.org/ja/3.2/method/Date/s/strptime.html)
- [Date::GREGORIAN](https://docs.ruby-lang.org/ja/3.2/class/Date.html#C_-G-R-E-G-O-R-I-A-N)


timecop は `Date.strptime` をモックしているが、0.9.5 以下だと `Date::ITALY` 以外を例外にしている。

```ruby
def strptime_with_mock_date(str = '-4712-01-01', fmt = '%F', start = Date::ITALY)
  unless start == Date::ITALY
    raise ArgumentError, "Timecop's #{self}::#{__method__} only " +
      "supports Date::ITALY for the start argument."
  end
```
[v0.9.5/lib/timecop/time_extensions.rb#L48-L51](https://github.com/travisjeffery/timecop/blob/v0.9.5/lib/timecop/time_extensions.rb#L48-L51) より

# 解決方法

timecop を 0.9.6 以上にすればいい。以下の timecop の PRで修正されている。
[Allow other "dates of calendar reform" in Date#strptime #389
](https://github.com/travisjeffery/timecop/pull/389/)



```ruby:Gemfile
gem 'psych', '4.0.5'
gem 'timecop', '0.9.6'
```

```ruby
require 'yaml'
require 'timecop'

puts YAML.unsafe_load('2024-03-14').class
# => Date
```
sshの時にpasswordを入力しないでlogin

# SSHでloginする時にpasswordを入力せずにloginする方法

```
export USER_AT_HOST="your-user-name-on-host@hostname"
export PUBKEYPATH="$HOME/.ssh/id_rsa.pub"
ssh-copy-id -i "$PUBKEYPATH" "$USER_AT_HOST"
```

# Reference
https://code.visualstudio.com/docs/remote/troubleshooting#_finding-problems-starting-or-connected-to-the-server
【Mongoose / TypeScript】JSからTSへの移行苦戦録もとい参考サイト集

## 状況と概要
ガバガバJSで開発を続けることに違和感を感じたので、TSに乗り換えてみようと思って既存のスクリプトを修正しようとしたときにぶち当たった壁のことをお話しします。

## 1. 実行環境の設定を変更
すばらしきサイト様です。

https://azukiazusa.dev/blog/express-typescript-mondodb/#routesindexts

https://qiita.com/katkatprog/items/0205f55377896faace5c

## 2. Mongoose関連
JSからの移行で一番苦しいのが厳しくなった「データ型」問題ですが…。

### スキーマちゃん、モデルちゃん問題
JSでMongooseのスキーマやモデルを作るときは`{}`（オブジェクトこと連想配列）を使っておけば万事が解決してました。特に、クエリを実行したときの戻り値やコールバックにとる引数のことですね。
でもTSはそんなガバガバを看過しないので、Mongoose本来のデータ構造である`Document`クラスを継承したインターフェイスを使うことで、安全に弄りまわせるということらしいです。

https://osamtimizer.hatenablog.com/entry/2018/07/07/204706

### クエリちゃん問題
Mongooseを使って接続したMongoDBから情報を取得するにはクエリを実行しますが、TSにしたとたんその非同期処理の挙動が変わったのです。取得した結果のプロパティが`undefined`地獄になりました。
そんな私の２時間の悩みを救ったのがこちら。

https://stackoverflow.com/questions/68704738/why-do-i-get-undefined-when-console-logobject-property-of-mongoose

特に感動したのがこれら。
- `router`のメソッドで非同期処理を使いたいときはコールバックを`async`にすればいい
- `find()`の実行結果は一度`lean()`でJSオブジェクトに変換する

## 3. セッション
TSにはC#の拡張メソッド的なノリで後から定義を追加できる`declare`とかいうものがあるらしいです。
チートだなぁ、そうに決まってる

https://akoskm.com/how-to-use-express-session-with-custom-sessiondata-typescript

## まとめ
界隈の外人ニキネキも邦人ニキネキも天才だなと思いました。
Pendoガイドを画面の好きなところに移動できるようにする

ガイドを移動できるようにしたいという声をよく聞くので、ちょっと実験がてら実装してみたので、メモ。

これをcode blockに入れれば動く。はず。
動画：
![CleanShot0nRJ27pS.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/eceb156e-3967-6b59-1af9-576b368ad384.gif)


```javascript
// Pendoのガイドコンテナのマウスオンを検知
window['pendo-guide-container'].onpointermove = function (event) {
    //マウスボタンが押されている間動作
    if (event.buttons) {
       //マウス動作をトラッキング。なんかうまく動いてないけど
        this.setPointerCapture(event.pointerId)
        // Pendoのガイドは複数の親子DIVで構成されている。ガイドコンテナが入ってる親DIVもサイズ変更しないとrelative配置でガイドコンテナが飛んでいってしまうので、それの調整を行う
        //親エレメントは%調整されているので% <> px変換をする
        let parentHeight = this.offsetParent.offsetHeight;
        let parentWidth = this.offsetParent.offsetWidth;
        //親のエレメントを取得する
        let topInPercentage = parseFloat(window['pendo-g-SRc0u1vUZSQ3C-fYHTNdqQhhYwg'].style.top);
        let leftInPercentage = parseFloat(window['pendo-g-SRc0u1vUZSQ3C-fYHTNdqQhhYwg'].style.left);

        // ピクセス変換
        let topInPixels = (topInPercentage / 100) * parentHeight;
        let leftInPixels = (leftInPercentage / 100) * parentWidth;

        topInPixels += event.movementY;
        leftInPixels += event.movementX;

        // %に戻す
        topInPercentage = (topInPixels / parentHeight) * 100;
        leftInPercentage = (leftInPixels / parentWidth) * 100;
　　　　   
        // 値をセット
        window['pendo-g-SRc0u1vUZSQ3C-fYHTNdqQhhYwg'].style.top = topInPercentage + '%';
        window['pendo-g-SRc0u1vUZSQ3C-fYHTNdqQhhYwg'].style.left = leftInPercentage + '%';
        return false
          
    }
    return true
}
```
【線形代数】固有値・固有ベクトル

# ０.はじめに
大学で線形代数の講義を受講している者です。
ざっくりと計算方法を個人的な備忘録としてまとめております。

##### 関連学習
[【線形代数】ベクトル](https://qiita.com/AkihideKato/items/f581ee500782b2272c0a)
[【線形代数】行列](https://qiita.com/AkihideKato/items/7d92b048d5bd392389e8)
[【線形代数】連立方程式](https://qiita.com/AkihideKato/items/6ddd947e438c4fae77a6)
[【線形代数】線形空間・線形写像](https://qiita.com/AkihideKato/items/2f03f8a996372525db6d)
[【線形代数】座標](https://qiita.com/AkihideKato/items/cda674d9fcf3f1fc00ba)
[【線形代数】固有値・固有ベクトル](https://qiita.com/AkihideKato/items/42a6bd7eec6ca66085c8)

# 固有値・固有ベクトル
Ax = λxの場合、λを固有値、向きが変わらないベクトルを固有ベクトルという

### 例
```math
A = \begin{pmatrix}
4 & 1 \\
2 & 3
\end{pmatrix}
,
P_1\begin{pmatrix}
1 \\
-2
\end{pmatrix}
```
```math
A×P_1 = \begin{pmatrix}
2\\
-4\\
\end{pmatrix}
```
``A×P_1``の解を**2で括る**
```math
\begin{pmatrix}
1\\
-2\\
\end{pmatrix}
```
``A×P_1``の解と``P_1``の値が**同一**となった
- 括った値2のことを``「固有値」``
- 同一となった値というのは向きが変わらないベクトルを``「固有ベクトル」``

#### 図解
ベクトルに行列を掛け合わせると向きと大きさが変化する
P_1の(1,0)に行列Aを掛け合わせることにより向きと大きさが変化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581998/77bd7f10-dccd-8f3a-93d9-bcc006fed948.png)

# 定義式

## 固有方程式
```math
|A - \lambda E | = 0
```
## 固有ベクトル式
```math
Ax=\lambda x (x \neq0)
```
```math
\Longleftrightarrow
(A - \lambda E) x = 0 (x \neq 0)
```

## 固有値を求める場合
行列Aの固有値を求める
```math
A = \begin{pmatrix}
4 & 1 \\
2 & 3
\end{pmatrix}
```
```math
\begin{pmatrix}
4 & 1 \\
2 & 3
\end{pmatrix}
× \lambda
\begin{pmatrix}
1 & 0 \\
0 & 1
\end{pmatrix}
=
0
```
```math
\begin{pmatrix}
4 - \lambda & 1 \\
2 & 3 - \lambda
\end{pmatrix}
=
0
```
サラスの方法を用いて行列を解くと
```math
12-7λ-λ²-2=0
```
```math
(λ-2)(λ-5)=0
```
因数分解し解を求める
よって**固有値は2,5**

## 固有ベクトルを求める場合
固有値2,5を使用し固有ベクトルを求める
```math
2をA-λEに代入する
```
```math
\begin{pmatrix}
4 & 1 \\
2 & 3
\end{pmatrix}
- 2
\begin{pmatrix}
1 & 0 \\
0 & 1
\end{pmatrix}
```
```math
A-λE = 
\begin{pmatrix}
2 & 1 \\
2 & 1
\end{pmatrix}
```
```math
固有ベクトル定義式：「|A-λE|x = 0」を使用する
```
```math
\begin{pmatrix}
2 & 1 \\
2 & 1
\end{pmatrix}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix}
= 0
\longrightarrow
\begin{pmatrix}
2x_1 + x_2 = 0 \\
2x_1 + x_2 = 0
\end{pmatrix}
```

``x₁``を``α``とする。``x₂ = -2α``
よって``x₁は1``、``x₂は-2``
**``固有値2の固有ベクトルはα(1.-2)``**
固有値5も同じように代入し固有ベクトルを求める
**``固有値5の固有ベクトルはβ(1,1)``**

# 対角化	
### 対角行列
対角線上以外すべて0の行列
n次正方行列のAの固有値が並ぶ対角行列のこと
固有値が1.2.3である場合、以下のようなものを対角化行列という
```math
\begin{pmatrix}
1 & 0 & 0 \\
0 & 2 & 0 \\
0 & 0 & 3 \\
\end{pmatrix}
```
### 対角化公式
```math
P^-¹AP = D
```
```math
AP = PD
```

### 例題
行列Aを対角化した場合、2,5の対角化行列になるのか確認する
```math
A = \begin{pmatrix}
4 & 1\\
2 & 3\\
\end{pmatrix}
```
```math
固有値α = \begin{pmatrix}
1 ,-2\\
\end{pmatrix}
```
```math
固有値β = \begin{pmatrix}
1,1\\
\end{pmatrix}
```
対角化公式内のPはαとβのベクトルであるため以下になる
```math
P = \begin{pmatrix}
1 & 1\\
-2 & 1\\
\end{pmatrix}
```
P⁻¹はPの逆行列
P⁻¹APを計算する
```math
1/3\begin{pmatrix}
1 & -1\\
2 & 1\\
\end{pmatrix}
×
\begin{pmatrix}
4 & 1\\
2 & 3\\
\end{pmatrix}
×
\begin{pmatrix}
1 & 1\\
-2 & 1\\
\end{pmatrix}
```
解は以下になる
```math
\begin{pmatrix}
2 & 0\\
0 & 5\\
\end{pmatrix}
```
行列Aを対角化すると**固有値2,5**の結果となる
Jetpack Composeのアニメーション設定(easing)の定義と効果について

## Easingとは？
Easing関数は、アニメーションの速度変化を定義するために使用されます。アニメーションが開始から終了までどのように進行するか、つまりアニメーションのテンポを制御します。
* LinearEasing
* FastOutSlowInEasing
* FastOutLinearInEasing
* LinearOutSlowInEasing

は、Jetpack Composeなどで使用される一般的なEasing関数の例です。それぞれの関数はアニメーションに異なる特性を与え、ユーザーインタフェースの動きをより自然またはダイナミックに見せることができます。

## 定義
Easing.ktからの抜粋です。
```
/**
 * Elements that begin and end at rest use this standard easing. They speed up quickly
 * and slow down gradually, in order to emphasize the end of the transition.
 *
 * Standard easing puts subtle attention at the end of an animation, by giving more
 * time to deceleration than acceleration. It is the most common form of easing.
 *
 * This is equivalent to the Android `FastOutSlowInInterpolator`
 */
val FastOutSlowInEasing: Easing = CubicBezierEasing(0.4f, 0.0f, 0.2f, 1.0f)

/**
 * Incoming elements are animated using deceleration easing, which starts a transition
 * at peak velocity (the fastest point of an element’s movement) and ends at rest.
 *
 * This is equivalent to the Android `LinearOutSlowInInterpolator`
 */
val LinearOutSlowInEasing: Easing = CubicBezierEasing(0.0f, 0.0f, 0.2f, 1.0f)

/**
 * Elements exiting a screen use acceleration easing, where they start at rest and
 * end at peak velocity.
 *
 * This is equivalent to the Android `FastOutLinearInInterpolator`
 */
val FastOutLinearInEasing: Easing = CubicBezierEasing(0.4f, 0.0f, 1.0f, 1.0f)

/**
 * It returns fraction unmodified. This is useful as a default value for
 * cases where a [Easing] is required but no actual easing is desired.
 */
val LinearEasing: Easing = Easing { fraction -> fraction }
```

## 結局どんな動きするの？

* FastOutSlowInEasing
  * 定義: CubicBezierEasing(0.4f, 0.0f, 0.2f, 1.0f)
  * 特徴: アニメーションは素早く加速し、徐々に減速して終了します。これにより、アニメーションの終了を強調し、最後の動きに微妙な注意を向けます。加速よりも減速に時間を多く割いています。
  * 使用場面: 開始と終了が静止している要素の標準的なイージング。多くのUIアニメーションで最も一般的に使用されます。
* LinearOutSlowInEasing
  * 定義: CubicBezierEasing(0.0f, 0.0f, 0.2f, 1.0f)
  * 特徴: ピーク速度（要素の動きの最速点）でアニメーションが開始し、静止状態で終了します。つまり、最初から減速していく動きをします。
  * 使用場面: 新たに表示される要素のアニメーションに使用され、最初の動きを速くして徐々に停止に向かわせます。
* FastOutLinearInEasing
  * 定義: CubicBezierEasing(0.4f, 0.0f, 1.0f, 1.0f)
  * 特徴: 静止状態から開始し、ピーク速度で終了します。つまり、加速していく動きをします。
  * 使用場面: 画面から消える要素に使用され、速度を上げていくアニメーションに適しています。
* LinearEasing
  * 定義: Easing { fraction -> fraction }
  * 特徴: アニメーションの進行具合が直線的に変化します。開始から終了までの速度が一定です。
  * 使用場面: 特にイージングを必要としない場合や、一定の速度でアニメーションさせたい場合に使用します。


これらは、アニメーションにリズムや生命を吹き込むために重要です。
ユーザーにとって快適で予測可能なインタラクションを提供できますので色々といじってみましょう。
線分の交差判定

検索で引っかかったものがコーナーケースに引っかかるようだったので


```c
int cross_product(point_t a, point_t b, point_t c) {
    return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}

int is_intersect(point_t a, point_t b, point_t c, point_t d) {
    int cp1 = cross_product(a, b, c);
    int cp2 = cross_product(a, b, d);
    int cp3 = cross_product(c, d, a);
    int cp4 = cross_product(c, d, b);

    if (((cp1 > 0 && cp2 < 0) || (cp1 < 0 && cp2 > 0)) && ((cp3 > 0 && cp4 < 0) || (cp3 < 0 && cp4 > 0))) {
        return 1;
    }
    if (cp1 == 0 && cp2 == 0 && cp3 == 0 && cp4 == 0) {
        if ((a.x <= c.x && c.x <= b.x) || (a.x <= d.x && d.x <= b.x) || (c.x <= a.x && a.x <= d.x) || (c.x <= b.x && b.x <= d.x)) {
            return 1;
        }
    }
    return 0;
}
```
PowerShell 集計

$logPath = "C:\logs\access.log"
$outputPath = "C:\logs\top_urls_by_second.csv"

# 读取日志文件，并提取时间戳和URL
$logs = Get-Content $logPath | ForEach-Object {
    if ($_ -match "\[(\d+)/\w+/\d+:(\d+):(\d+):(\d+)\] \"\w+ (\S+)") {
        $time = "{0:D2}:{1:D2}:{2:D2}" -f $matches[2], $matches[3], $matches[4]
        $url = $matches[5]
        [PSCustomObject]@{
            Time = $time
            URL = $url
        }
    }
}

# 分组统计每秒的URL访问次数
$groupedLogs = $logs | Group-Object Time, URL | ForEach-Object {
    [PSCustomObject]@{
        Time = $_.Name.Split(',')[0].Trim()
        URL = $_.Name.Split(',')[1].Trim()
        Count = $_.Group.Count
    }
} | Sort-Object Time, Count -Descending

# 选择每秒访问次数前3的URL
$result = @()
$groupedLogs | Group-Object Time | ForEach-Object {
    $timeGroup = $_
    $topUrls = $_.Group | Sort-Object Count -Descending | Select-Object -First 3
    foreach ($url in $topUrls) {
        $result += [PSCustomObject]@{
            Time = $timeGroup.Name
            URL = $url.URL
            Count = $url.Count
        }
    }
}

# 输出结果到CSV文件
$result | Export-Csv -Path $outputPath -NoTypeInformation
react-hook-formで数値をバリデーションする

# はじめに
react-hook-formを使って数値のバリデーションを実装したので、その方法をまとめました。なお、使用言語はTypeScript、UIはChakuraUIを使用しています。
# 問題
学習記録アプリを作成しており、**学習時間が0の場合は、「0以上で入力してください」というエラーメッセージを出力します。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/8d0ab32b-475e-169a-b0ae-977983d8c3d2.png)
# 解決方法
下記のように実装しました。

```tsx:tsx
<FormLabel>学習時間</FormLabel>
<Input 
type="number" {
...register("studyTime", { 
required: true,
valueAsNumber: true, 
//最小値が1未満（つまり0）の場合は、エラーメッセージを出力
min: {  value: 1, message: "0以上で入力してください" } 
})} 
value={studyTime}  
onChange={onChangeStudyTime} 
min={0} 
step={1}/>
{errors.studyTime && "0以上で入力してください" }
```

# おわりに
もし仮にnullが入ってきた場合は、`valueAsNumber`で0に変換するようにしています。
# 参考
公式ドキュメントにエラーのハンドリング方法が載っています。

https://www.react-hook-form.com/get-started#Handleerrors
【flutter】DropdownButtonFormFieldを使って選択したい

こんにちは！
今回はDropdownButtonFormFieldを使って、itemsの中から選択するコードを紹介したいと思います。
今回も最後まで読んでいただけたら嬉しいです！

## 1. DropdownButtonFormFieldを使った実装
### ・ コード
```php
DropdownButtonFormField<String>(//<String>は、選択肢の型を指定します
          style: const TextStyle(
            fontSize: 14.0,
            fontWeight: FontWeight.w400,
            color: Color(0xff40536A),
          ),
          //ドロップダウンボタンが選択されていない場合に表示されるテキストを指定しています。
          hint: const Text(
            "この中からお選びください",
            style: TextStyle(
              fontSize: 14.0,
              fontWeight: FontWeight.w400,
              color: Color(0xff40536A),
            ),
          ),
          //ドロップダウンメニューの選択肢を定義しています。DropdownMenuItemのリストとして提供され、各アイテムは選択肢の値と表示するテキストを持ちます。
          items: [
            DropdownMenuItem(
              value: 'りんご',
              child: Text('りんご'),
            ),
            DropdownMenuItem(
              value: 'バナナ',
              child: Text('バナナ'),
            ),
            DropdownMenuItem(
              value: 'オレンジ',
              child: Text('オレンジ'),
            ),
            DropdownMenuItem(
              value: 'ぶどう',
              child: Text('ぶどう'),
            ),
            DropdownMenuItem(
              value: 'いちご',
              child: Text('いちご'),
            ),
            DropdownMenuItem(
              value: 'スイカ',
              child: Text('スイカ'),
            ),
          ],
          //ユーザーがドロップダウンメニューで選択を変更したときに実行されるコールバック関数を指定しています。
          onChanged: (String? value) {
            setState(() {
              selectedValue = value;
            });
          }),
```

### ・　実装結果
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524127/4fcb2dd3-ab5f-0027-083b-fe806ef0a619.gif)

## 終わりに
今回は実際にDropdownButtonFormFieldを使ってitemsを選択して表示するコードをと実装結果を紹介しました！
今回も記事を見ていただきありがとうございました！
PM（プロジェクトマネージャー）として大切なこと

PM（プロジェクトマネージャー）は、プロジェクトを推進する上で必要不可欠な存在ですが、職務領域が不明確な場合に、しばしばトラブルを招く存在でもあります。

そのようなトラブルを最小限に抑制、可能であれば事前防止するために、GeNEE社の中のプロジェクトマネージャーの存在意義を明確にしようと考えていたのですが、これがなかなかな難しい。現在時点では、「プロジェクトマネージャーはこうあるべきだ。」と確固たる定義づけができませんでしたので、まずはその前工程として、「プロジェクトマネージャーはこのような行動を取ってはいけない。」といった内容をまとめてみました。

１：開発者に全て任せてしまう。丸投げしてしまう。
開発経験のないプロジェクトマネージャーにありがちなことですが、開発者に嫌われないようにと、全てを任せてしまう、ひどい場合だと丸投げしてしまうことがあります。開発者の主業務は『開発』になります。お客様のビジネスを完全に理解しているわけではありませんし、全てを任せてしまうのは非常に危険な行為と言えます。プロジェクトマネージャーの役割はお客様と開発者の架け橋になることでもあります。受けた情報をしっかりと咀嚼し、プロジェクトに参画するメンバーに適切な方法で共有することが大切です。

２：お客様の言いなりになってしまう。PMとしての意見を言わない。
お客様の気分を害さないようにと、何も意見を言わないプロジェクトマネージャーもいます。お客様はシステムやアプリのプロフェッショナルではないので、誤った判断をされることが多いです。「おっしゃる通りです。」と全て受け入れるのではなく、「●●●のケースを取る場合、将来的に×××といったリスクが発生する可能性がございますが、そちらのリスクを許容してこちらの機能を実装しますか。リスクを回避する策として▲▲▲案もございますが、こちらについて詳しくご説明してもよろしいでしょうか。」というような提案も時には必要です。お客様の発言や判断を客観的に考え、状況によってはしっかりと説得することもプロジェクトマネージャーの重要な役割の一つです。調整を煩わしいと感じ、「我関せず」の顔をするのは、職務怠慢ともいえます。

３：納期（リミット）を意識しない。
一例ですが、お客様側で準備すべきもの（業務フロー表や社内関係者へのヒアリングシートなど、開発会社側では取得が難しいものを指します。）が期日までに揃わなかったとき、「大丈夫ですよ。期限を１週間後ろ倒しにしましょう。」と言い、納期意識が薄いプロジェクトマネージャーも存在します。その場は丸く収まるかもしれません。しかし最終的な納期変更が許されない場合、後工程に控えた開発者、デザイナーなどは非常に困ってしまいます。気遣いで期限やスケジュールを変更してしまうと、最終的にどこかでしわ寄せが来ます。お客様都合で１週間遅れたならその事実を基に再交渉し、最終的な納期も調整する必要があるでしょう。

４：共有ドキュメントを作らない。適切な共有ができない。
最近では、slackやChatworkといったチャットツールでビジネスのやり取りをする機会も増えました。連絡速度は各段に上がりましたが、重要な情報をしっかりと管理し、共有しないとプロジェクトメンバーは古い情報を基に行動してしまう可能性があります。Googleスプレッドシートでも構わないのですが、メンバー内の知識レベルが均一になるように、共有環境を作るのもプロジェクトメンバーの重要な役割の一つです。

５：関連資料を確認せずに関係者に丸投げする。
プロジェクトマネージャーは、開発者とお客様から関連資料を受け取る立場にあります。開発者からは設計書、要件定義書、仕様書などを受け取って確認します。お客様からは要望書や提案書などを受け取ります。関連資料を受け取った際、そのファイルを一度も開くことなく、右から左に横流しするプロジェクトマネージャーもいます。これは非常に危険な行為です。開発者から上がってきた成果物に対しては、要件をしっかりと満たしているか、ミスがないか、抜け漏れがないか、を確認する必要がありますし、お客様からいただいた資料は、不明確な部分がないか、開発者がスムーズに作業に入れるか、などの観点でチェックをする必要があります。場合によっては、資料作成者に質問し、疑問点をつぶさなければなりません。

６：利己的な判断をしてしまう。
お客様と開発者の架け橋となるプロジェクトマネージャーは、時にその両者の職域にまで踏み込む必要があります。一例ですが、ライティングコンテンツをお客様側で準備する場合、コンテンツ管理を可能な範囲でしてあげたり、情報収集に役立つ情報やツールを提供したりすることで、プロジェクトが円滑に進むことがあります。反対に、「それはプロジェクトマネージャーの職域にはない仕事です。」と他人事のように割り切ってしまうと、お客様側のスキルや特性に全てを委ねることになり、スケジュールや品質が大きくブレるリスクになりかねません。請け負える範囲には限界があるかと思いますが、可能な範囲で職務領域を広げることで、プロジェクト全体にポジティブな影響を与えることが多々あります。

７：技術系の話を避ける。
技術の話になると、下を向いてしまうプロジェクトマネージャーもいます。法人営業のスタッフならまだしも、プロジェクトマネージャーを名乗る人間としては感心ができない話です。技術の話にも興味を持ち、状況によっては、その技術を深堀りして調べることもプロジェクトマネージャーの重要な役割です。システムやモバイルアプリというITサービスを扱っている以上、技術についても前向きに習得する、習得したいといった姿勢が必要です。

８：メールの返事が遅い。返事をしない。
大規模プロジェクトを牽引するプロジェクトマネージャーのもとには毎日大量のメールが届きます。お客様、開発者、関係会社、BPと呼ばれるビジネスパートナー、ベンダーなど、案件の規模が大きくなればなるほどその量は比例して増えていきます。メールが届いた際、急ぎか急ぎでないかを峻別する能力も勿論大切ですが、これはある程度の経験が必要です。ここでお伝えしたいことは、メールが届いているのに、返事をしなかったり、２，３日後に返事をするプロジェクトマネージャーは問題意識を持ってください、ということです。プロジェクトマネージャーがすぐに返信しないことで、開発者が本来対応すべきでない作業を始めてしまったり、お客様の意思決定を遅らせてしまう可能性があるのです。
嫌なことから逃げるに逃げ続けた結果、空っぽキャリアができました

限界界隈でエンジニアしているYSといいます。

Qiitaの『自分のエンジニアとしてキャリアを振り返ろう！』という記事を見て刺激を受けたので投稿してみます。
https://qiita.com/official-events/72b44470c9c08f6f080b

QiitaやX(旧Twitter)界隈にはキラキラしたエンジニアさんがたくさんいますよね？
私はその対局にいる人間です。

小さいときから、とにかく面倒なことをやりたくない、嫌なことから逃げ続けた結果、本当に空っぽのキャリアしかないことに気づきました。スキルを向上させるために日頃から大事にしていることもなければ、スキルアップやキャリアアップとか、そういうのがないのです。本当に空っぽ。

そのため、以下に[期待されている記事](URL "https://qiita.com/official-events/72b44470c9c08f6f080b")はございませんのであしからず。

# 育った環境
自分で言うのも何なんですが、私の育った環境はすばらしいものでした。
父は私大トップからメガバンク、母も県内トップ高校から伝統のある大学を優秀な成績で修めて卒業。両親ともに忍耐力と持続力のある人柄。
なんでこの親から私みたいなのが生まれたのだろう？と **今でも** 思っています。

# 学生時代
とにかく面倒なことをやりたくない、嫌なことから逃げ続けていました。中学では、赤点スレスレの低空飛行。高校では1学年450人いるなか、校長直々に親を呼び出しを受けた3名に選出されるなど輝かしい名誉をもらっています。
もちろん、進学できない可能性があるという訓告ですね(笑)

さすがに見かねた親は、塾へ通学させて大学受験を画策します。でも、すばらしい講師がいても、本人のやる気がないと効果はでません。ナマケモノを鍛えてもグリズリーにはならないのです。
そんな私ですが、神様の気まぐれで、有名校に受かってしまったのです。

合格した大学は、都内でもハイカラ(死語)で有名な学校です。
みなさんも想像してください。陰キャラでモブ中のモブがそんな学校に受かったら何が起きるのでしょう？
はい、ご想像のとおりです。

# 就職から究極体験
実は私は就職活動をしたことがありません。大学卒業当時、氷河期の絶頂期でした。取り柄はもちろん、信念もない。日々を楽して過ごしたい。静かに暮らしたいだけなのです。
そんな私ですが、神様の気まぐれで、公務員に受かってしまったのです(2回目)

公務員と一言で言っても、さまざまです。私が働いていたのは行刑施設です。詳細は割愛しますが、当時思っていたのは **『人を◯しても衣食住は保証されるのだな』** でした。

# 転職と2度目の究極体験
そんな折に見つけたのが未経験者歓迎！やる気重視！人財募集！などというブラック臭しかしない求人広告です。1ヶ月の研修後に嘘デタラメの履歴書を持たされて、面接。いきなり現場へ放り込まれます。
そんな私ですが、神様の気まぐれで、プロジェクトが上手く行ってしまったのです(3回目)

さらに同業で再転職をしたところでオフショア開発に携わりました。オフショア開発でプロジェクト管理スキルを深めたのですね？と思った方、違います。オフショア先で連れて行かれた **『海外キャバクラ』** にハマったのです。さらに現地企業へ転職してしまいます。

中年が女性にハマるとろくなことにならないと聞いたことありませんか？私はまさにこれだったのです。

# さらに転職から今
海外でやりたい放題やっていた頃、日本企業が国内市場に見切りをつけて海外へ目を向けていました(正確には現在進行形)

ここまでの私のキャリアを整理すると
- 開発経験あり(年数はともかく)
- 海外勤務経験あり(動機はともかく)
- 英語と中国語可(程度はともかく)

パット見、なんかすごそうですよね？
そんな私ですが、神様の気まぐれで、某大企業に受かってしまったのです(4回目)

さらにこの頃、パートナーに出会い、子どもにも恵まれました。

でもね、思うんです。
嫌なことから逃げるに逃げ続けて、最小限の工数で、最大・最速の成果を求めて場当たり、付け焼き刃でやってきた結果、私のキャリアって何？何がセールスポイントなの？何がしたいの？というスパイラルにはまっています。上司から今後のキャリアどう考えていますか？と聞かれて、沈黙しちゃいました。私はどうしたいのでしょう？

# 『自分のエンジニアとしてキャリアを振り返ろう！』
今はブリッジセールスエンジニアとして活動していいます。過去のキャリアは書いた通りで、それ以上のものがありません。開発経験はさておき、海外経験や外国語能力は不純な動機が出発点です。
根が陰キャラなので『ジョニー、今日はすてきだね！私も今日は最高だよ！頑張ろうぜ！』みたいなノリはしんどいです。セールスエンジニアに向いてません。でも、ベースの開発経験が少なすぎて、開発への転職は無理ゲー過ぎて、この場所以外に行き場を失っています。

どう考えても手詰まりです。本当にありがとうございました。

# 最後に若い方へお伝えしたいこと
私がもしも世の中の役に立てることがあるとしたら、私の過去を見ていただいた上で、プークスクスしていただいた上で、反面教師にしてもらえることくらいでしょうか。

ちなみに、30歳まで童貞であれば魔法使いになれるは都市伝説です。
みなさん、さっさと恋愛しましょう。
Salesforce認定Platformアプリケーションビルダー試験レポート

この投稿は先日「Salesforce認定Platformアプリケーションビルダー試験」
に合格しましたので、そのレポートになります。

【目次】
１．受験することになった経緯
２．主な勉強方法（使用した教材）
３．試験結果・感想
４．まとめ

１．受験するまでの経緯
　12月にSalesforce認定アドミニストレーター試験に合格したので、
　さらなるステップアップの為に受験。
　↓Salesforce認定アドミニストレーター試験を受験した経緯はこちら 
　https://qiita.com/iwamatch/items/ae6d7f929ae77940797d

２．主な勉強方法（使用した教材）
①Trailhead(trailmix)
　まずは認定アドミニストレーターと同様にTrailheadを実施。
  以下のTrailmixを100%になるまで実施しました。
  実施方法も認定アドミニストレーターの時と同様ですが、
  そもそも認定アドミニストレーターのTrailmixを100%実施すると、
  80%程度は完了しているので、それほど時間はかかりませんでした。

https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/prepare-for-your-salesforce-platform-app-builder

②Web問題集
　以下に挙げた問題集をこの順番で3回繰り返して解きました。
　間違えた問題に関する事項は上記trailheadの文章や公式ヘルプを検索して、
　理解するようにしました。

A.TysonBlog（215問）
　認定アドミニストレーターの学習時にも感じたことだが、
　各問題に対するの解説が無いと、理解が進まず非常に効率が悪い。
　色々と探したがこちらが最も丁寧、かつ、正確に思えたので、
　ここに載っている解説をまず完璧に理解することを心掛けた。
https://tysonblog-whitelabel.com/category/salesforce/salesforce-appbuilder   

B.JPN試験（114問）
　認定アドミニストレーターの時もお世話になったサイト。
　こちらの2023/11/14バージョンを実施しました。
　Aとの重複もそれなりにありますが、類似の問題が試験にもかなり出ていたと思うので、
　実施して正解でした。
https://www.jpnshiken.com/shiken/Salesforce.Platform-App-Builder-JPN.v2023-11-14.q114.html

C.JPNTEST（125問）
　Bとは似て非なるサイト。252問あるが、無料分の125問だけ実施。
　A,Bと重複していない問題もそれなりに存在し、実際に試験に出題された問題も
　あったと思われることから実施しておくに越したことはないが、
　A,Bだけでも合格点には届くかもしれないです。
https://www.jpntest.com/free/Platform-App-Builder-JPN-mondaishu-salesforce-certified-platform-app-builder-platform-app-builder%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88

３．試験結果・感想
　試験は105分で60問を解きますが、58分で完了しました。
　結果は「合格」で、以下表の通り、正答率は78%程度と思われます。
　63%で合格ですので、余裕を持って合格できて良かったです。
　（単元ごとの問題数と結果得点は公表されないため、
　　結果は計算により求めた想定値となります）
|単元|配点(%)|問題数(想定)|得点数(想定)
|---|--:|--:|--:
|SALESFORCEの基本|23|14|13
|データモデリングおよび管理|22|13|9
|ビジネスロジックとプロセスの自動化|28|17|15
|ユーザインターフェース|17|10|5
|アプリケーションのリリース|10|6|5
|(合計)|100|60|47

４．まとめ
　認定アドミニストレーターに続き合格できて、ホッとしています。
　実際の問題では知識を問うというよりは、各想定される場面において、
　何を使えば実現できるかや、どういう設定をするのが望ましいかという
　問題になっていたり、実際の入力規則の関数の使い方を問われたりします。
　特に配点の28%を占める自動化については、フローやプロセスビルダー、
　ワークフロールールの違いをしっかり押さえないと合格は難しいと思います。
　2024年4月からはSalesforceを利用した実務の方もいよいよ始まってくるので、
  生かしていきたいと思います。
　もし時間が取れれば認定Platformデベロッパーにも挑戦したいと思います。

以上
Neovimでprettierのフォーマットをかけると謎の差分が出る問題



## 問題
Neovimでnune-lsを通してprettierでフォーマットを書ける設定を書いた
```
map("n", "<C-f>", "<CMD>lua vim.lsp.buf.format({ async = false })<CR><CMD>w<CR>", opts)
```

しかしCLIでprettierコマンドを使った時と謎の差分が出てしまっていた
![スクリーンショット 2024-03-08 13.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662481/7fdf02bf-c140-dc7c-1976-cdea5e005a45.png)
.prettierrcが読み込まれていないか,Neovimで実行されるprettierとCLIで実行されるprettierのバージョンが同じか等を調査したが解決できなかった

## 原因
Masonでインストールしていたtypescript-language-serverがprettierのフォーマット後に実行を行っていたのが原因だった

## 解決策
typescript-language-serverのフォーマット機能をオフにするだけです
自分の環境ではMasonを使っているのでmason-lspconfigで設定を行っています

```lua
  {
    "williamboman/mason-lspconfig.nvim",
    config = function()
      local lspconfig = require("lspconfig")
      require("mason-lspconfig").setup_handlers({
        tsserver = function()
          lspconfig.tsserver.setup({
            on_attach = function(client, bufnr)
              client.server_capabilities.documentFormattingProvider = false
              client.server_capabilities.documentRangeFormattingProvider = false
            end,
          })
        end,
      })
    end,
  },
```

## 終わりに
原因に気づくまでに時間がかかったので同じように困っている人の助けになれば幸いです
reactでsetintervalを使用する方法

Reactで setInterval を使用するには、いくつかの方法があります。

## 方法1：useEffect フックを使う

useEffect フックを使って、setInterval を呼び出すことができます。

```React
const [count, setCount] = useState(0);

useEffect(() => {
  const interval = setInterval(() => {
    setCount(count => count + 1);
  }, 1000);

  return () => clearInterval(interval);
}, []);

return (
  <h1>{count}</h1>
);
```
コードは注意してご使用ください。
## 方法2：useInterval カスタムフックを使う

useInterval カスタムフックを使って、setInterval のロジックをカプセル化することができます。

```React
import { useInterval } from 'react-use';

const App = () => {
  const [count, setCount] = useState(0);
  const { interval, clearInterval } = useInterval(() => {
    setCount(count => count + 1);
  }, 1000);

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={clearInterval}>Stop</button>
    </div>
  );
};
```
コードは注意してご使用ください。
## 方法3：setInterval を直接呼び出す

useEffect フックや useInterval カスタムフックを使わずに、setInterval を直接呼び出すこともできます。

```React
const App = () => {
  const [count, setCount] = useState(0);

  const interval = setInterval(() => {
    setCount(count => count + 1);
  }, 1000);

  useEffect(() => {
    return () => clearInterval(interval);
  }, []);

  return (
    <h1>{count}</h1>
  );
};
```
コードは注意してご使用ください。
これらの方法は、それぞれ異なる利点と欠点があります。状況に応じて最適な方法を選択してください。

## その他

setInterval を使用するときは、以下の点に注意する必要があります。

- メモリリークを防ぐために、clearInterval を呼び出す
- コンポーネントがアンマウントされるときに、setInterval をクリアする
- パフォーマンスの問題を防ぐために、setInterval の間隔を適切に設定する
VSCodeでMarkdown書いていたら自動整形されて困った話

## はじめに
Qiitaの記事を書こうとVisual Studio Code（以下、VSCode）でMarkdownファイルを編集していたら、意図しない形に自動整形されてしまい困りました。
事象としてはこんな感じ。
```
before
ITエンジニア
↓
after
IT エンジニア
```
英語と日本語の間に半角スペースが入ってしまう。。。解決まで少し手間取ったので、備忘として試したことを残しておきます。

## 試したことその1：VSCodeの設定変更

とりあえず、フォーマット機能を無効にしようと思いVSCodeの設定を確認しました。
**手順1.** 「Ctrl + ,」で設定を開く。
**手順2.** 「Editor:Format On Type」と検索して、これのチェックを外す。
![EditorFormat On Type.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153171/556c9970-a88e-d7ae-0f60-4ef5a132c189.jpeg)

結果：なおらない

## 試したことその2：Prettierの対象ファイルから除外

VSCodeのフォーマット機能ではなく別に原因があるらしい、ということで調べてみると以下記事に辿り着きました。
https://qiita.com/the_red/items/e121cbb659c52a60bca6

どうやら原因は**Prettier**のようです。
JavaScriptなどフロントエンド系の言語を自動的に整形してくれる便利なコードフォーマッターなのですが、日本語との相性はよくなさそうです。
筆者の場合は、VSCodeのプラグインとしてPrettierを導入していました。

調べたところ解決方法はいくつかありそうでしたが、以下の2点より`.prettierignore`を作成して`.md`のみで無効化することにしました。

:::note info
- 使用しているPrettierはVSCodeプラグイン版
- 特定のプロジェクトの`.md`に対してPrettierを無効化したい
（英語・日本語のスペース問題だけではなく、フォーマット機能自体を無効にしたい）
:::

`.prettierignore`の作成方法は以下記事を参考にしました。
https://qiita.com/sugasaki/items/0ccb272b03b5ef3aeb86

**手順1.** ルートディレクトリに`.prettierignore`を作成。
**手順2.** `.prettierignore`に以下を記述。
```.prettierignore
*.md
```

結果：**解決**

## さいごに
ということで無事問題は解決しました。
今回はPrettierが原因でしたが、Markdownを書く際に便利な拡張機能もVSCodeには揃っているようです。仕事でMarkdownを使うことが多いので、これを機に編集しやすい環境を整えてみようと思いました。