OmniAICreator/Qiita-1.07M huggingface dataset:
ホスティングサービスについてgptに聞いた

以下は、KoyebやVercelのようにフロントエンドとバックエンドの両方をホスティングできるクラウドプラットフォームの一覧です。それぞれのプラットフォームは、サーバーレス機能やフルスタックアプリケーションのサポートを提供しています。

1. Koyeb

	•	特徴: サーバーレスアーキテクチャ、複数のランタイムサポート（Node.js, Python, Goなど）、GitHub連携、無料プランあり。
	•	利用ケース: フロントエンドとバックエンドのマイクロサービスやAPIのデプロイ。

2. Vercel

	•	特徴: フロントエンドに特化、Next.jsと深い統合、サーバーレス関数のサポート、グローバルエッジネットワーク。
	•	利用ケース: 静的サイトとサーバーレスバックエンドを同じプロジェクトでデプロイ。

3. Netlify

	•	特徴: フロントエンドデプロイ、サーバーレス関数、フォーム処理、デプロイプレビュー。
	•	利用ケース: ジャムスタックサイトのホスティング、静的サイトのデプロイ。

4. Heroku

	•	特徴: PaaS（Platform as a Service）、多言語サポート（Python, Node.js, Ruby, Javaなど）、データベース統合、簡単なデプロイ。
	•	利用ケース: フルスタックアプリケーションのホスティング、データベース連携が必要なアプリケーション。

5. AWS (Amazon Web Services)

	•	特徴: 高度なクラウドインフラ、S3で静的サイトホスティング、EC2やLambdaでバックエンド実行、RDSなどのデータベースサービス。
	•	利用ケース: 大規模なフルスタックアプリケーション、高度なカスタマイズとスケーラビリティが必要なプロジェクト。

6. Google Cloud Platform (GCP)

	•	特徴: Firebase Hostingで静的サイト、Cloud FunctionsやApp Engineでバックエンド、FirestoreやCloud SQLのデータベース。
	•	利用ケース: サーバーレスアプリケーション、モバイルアプリのバックエンド、リアルタイムデータベース。

7. Microsoft Azure

	•	特徴: Azure App Serviceでフロントエンドとバックエンド、Azure Functionsでサーバーレス、Azure SQL Databaseなどのデータベース。
	•	利用ケース: エンタープライズアプリケーション、DevOps統合、複雑なクラウドソリューション。

8. DigitalOcean

	•	特徴: Droplets（仮想マシン）、App Platform（PaaS）、Managed Databases、スケーラブルなアプリケーションホスティング。
	•	利用ケース: シンプルなホスティング環境、中小規模のフルスタックアプリケーション。

9. Render

	•	特徴: 自動デプロイ、サーバーレス関数、静的サイトホスティング、データベースサービス。
	•	利用ケース: モダンなWebアプリケーションのホスティング、サーバーレス機能を利用したバックエンド。

10. Railway

	•	特徴: プロジェクト自動デプロイ、データベース統合、サーバーレスアーキテクチャ。
	•	利用ケース: フロントエンドとバックエンドの迅速なデプロイ、開発・テスト環境の統合。

まとめ

これらのプラットフォームは、フロントエンドとバックエンドの両方をホスティングするための優れた選択肢です。プロジェクトの規模や要件に応じて、最適なプラットフォームを選択することが重要です。例えば、簡単なデプロイとサーバーレス機能を求める場合はVercelやNetlifyが適しており、高度なカスタマイズやスケーラビリティが必要な場合はAWSやGCPが良い選択です。
(しくみ)8x8のフォントから任意の1Dot(ドット)を求める(SSD1306等)(座標)


目的
文字フォントパターンから任意の
x,yでDot(ドット)を求める

フォントサイズは、8ドット　×　8ドット
1バイトは、8ビット
1ピクセル当たりのドットは1ドット
x は、ビット取り出し
yは、8倍した値


●座標系　yは、ミラー

![o_coq205.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6dc12793-7291-e7a2-11db-69c6a27579b0.jpeg)


●取り出し方法


(1)　  yからバイトを示すポインターを求める

a = *(point + (y * 8))


(2)　  バイトからxのドット シフト　例として座標(2,0)を求める場合

x が　0 から　数えて　2の場合は、

２回シフトをする

a = a << 2

(3) 　マスクして該当の1ドットのみを取り出す

1バイト8ビットの時は、取り出したバイトに80H(16進)をアンドする

a = a & 0x80


![o_coq204.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cb2b29d3-1a7d-5713-750d-b24e7c6810f9.jpeg)
LeetCode挑戦日記：Day35

# はじめに

最近、業務で実装する時間よりも資料作成やレビューをする時間が多くなってきました。
このままでは自身のコーディング能力が落ちそうで怖いので、LeetCodeを始めてみました。

自身の学習の記録 & LeetCodeに興味のある人が挑戦しやすいように、記事に残していきます。
このような競技プログラミングをした経験がないので、ひよってEasyからやっていきます...

# [Medium] 1448. Count Good Nodes in Binary Tree

二分木の根`root`が与えられたとき、木の中のノード`X`は、`root`から`X`への経路に`X`より大きい値を持つノードが存在しない場合に良いノードと呼ばれます。
二分木内の良いノードの数を返します。

## 素直に解いてみる

### 考え方

1. 経路の最大値を含めて渡すことでそのノード以下に良いノードが何個あるのかを数える再帰関数を作成する

### コーディング

```typescript
function goodNodes(root: TreeNode | null): number {
    const checkGoodNodes = (root: TreeNode | null, max: number): number => {
        if (!root) { return 0; }

        let add = 0;
        if (max <= root.val) {
            max = root.val;
            add++;
        }
        return checkGoodNodes(root.left, max) + checkGoodNodes(root.right, max) + add;
    }
    return checkGoodNodes(root, -1 * Infinity);
};
```

### 結果

Runtime：122ms
Beats 80.62%

Memory：71.19MB
Beats 18.35%
システム権限セクションで「__MISSING LABEL__ PropertyFile - val ManageAccessPolicies がセクション UserPermissions に見つかりません」


+ [Can't assign permission set Sales User to user first name last name. The user license doesn't allow the permission: __MISSING LABEL__ PropertyFile - val ManageAccessPolicies not found in section UserPermissions](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmKpB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7bb3ab8c-e9af-a45e-a758-68f30e302eb0.png)



:::note
Thanks for provided the org access. I have reviewed the issue in your org and found that "__MISSING LABEL__ PropertyFile - val ManageAccessPolicies not found in section UserPermissions" is enabled in System permissions section in Account Access permission set which causes the error.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/08ec0add-14b4-d480-43f7-dcffe77fda63.png)

I have unchecked this and now you would be able to assign the permission set group to the test user created for this challenge requirement.

Please activate the "first name last name" user and assign the permission set group to this user to complete the challenge requirement.

組織の問題を確認したところ、アカウント アクセス権限セットのシステム権限セクションで「__MISSING LABEL__ PropertyFile - val ManageAccessPolicies がセクション UserPermissions に見つかりません」が有効になっており、これがエラーの原因となっていることがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/08ec0add-14b4-d480-43f7-dcffe77fda63.png)


これをチェック解除すると、このチャレンジ要件用に作成されたテスト ユーザーに権限セット グループを割り当てることができるようになります。

チャレンジ要件を完了するには、「名 姓」ユーザーをアクティブ化し、このユーザーに権限セット グループを割り当ててください。
:::

+ [【未解決】Failure : Can't assign permission set Account Access to user ravindra bohra. The user license doesn't allow the permission: __MISSING LABEL__ PropertyFile - val ManageAccessPolicies not found in section UserPermissions](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007er3aD)
+ [ 【未解決】The user license doesn't allow the permission: __MISSING LABEL__ PropertyFile - val ManageAccessPolicies not found in section UserPermissions](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007er3aD)


# 資料

+ [__MISSING LABEL__ PropertyFile - val HasUnlimitedErbScoringRequests がセクション UserPermissions に見つかりません。ユーザーは無制限の Erb モデル スコアリングを持っています](https://issues.salesforce.com/issue/a028c00000gAyp4AAC/__missing-label__-propertyfile--val-hasunlimitederbscoringrequests-not-found-in-section-userpermissions-user-has-unlimited-erb-model-scoring)
Printfで同じ引数を複数個とる

# はじめに

海外で少しバズってたので書きました。
初歩的なPrintfの小ネタなので、知っていたいたらごめんなさい。

# 問題のPrintf

熱狂的な太郎くん信者がいます。これだと

```go
func main() {
	name := "Taro"
	fmt.Printf("I love %s! %s! %s! %s! %s! %s! %s!!!!\n", name, name, name, name, name, name, name) 
}
```

# 解決法

インデックスを指定することで解決できます。

```go
func main() {
	name := "Taro"
	fmt.Printf("I love %[1]s! %[1]s! %[1]s! %[1]s! %[1]s! %[1]s! %[1]s!!!!\n", name)
     // I love Taro! Taro! Taro! Taro! Taro! Taro! Taro!!!!
}
```

n進数の出力時などに使うと便利です。

```go
func main() {
	num := 100
	fmt.Printf("10進数: %[1]d, 2進数: %[1]b, 8進数: %[1]o, 16進数: %[1]x\n", num)
    // 10進数: 100, 2進数: 1100100, 8進数: 144, 16進数: 64
}
```
Playground Name: Agile_accelerator というよくわからないTrailhead ?


トレイルヘッドのURLを教えてくれませんね。何故か以下の２つの投稿でも自分のプレイグランドのURLしか教えてくれません。

+ [Not able to create team name "Sample"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007RHWmR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5aa7d7f2-39a7-a753-4556-252a06a77cae.png)

:::note
For anyone else facing this issue - I came across this issue as well. I did not add a Product tag and attempted to create the new team - "Sample". So, i believe it was a partial transaction and it did not rollback at the back-end, so I was not able to create the team "Sample" again. But later you can go into the Agile Accelerator > Teams tab and select List Views - All, and this would also list the partial team "Sample" that was created and then this can be deleted.! 

この問題に直面している他の人のために - 私もこの問題に遭遇しました。 Product タグを追加せず、新しいチーム「Sample」を作成しようとしました。したがって、これは部分的なトランザクションであり、バックエンドでロールバックされなかったため、チーム「サンプル」を再度作成できなかったと思います。ただし、後で [Agile Accelerator] > [チーム] タブに移動し、[リスト ビュー - すべて] を選択すると、作成された部分的なチーム「サンプル」もリストされ、これは削除できます。
:::

+ [https://org62.my.trailhead.com/content/employee/modules/gus_work/gus_see_big_picture?trail_id=gus_trail](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eq4oj)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b703dfe4-4846-c111-99eb-b2f79303faef.png)
Apache Cassandra テーブル数上限覚え書き

## はじめに

### この記事は何？

Apache Cassandraのテーブル数の上限に関する「覚書」

## DataStax社による解説

はじめに、以下の記事から、傍線を引きながら自由に翻訳します。

https://docs.datastax.com/en/dseplanning/docs/data-model.html#number-of-tables


Cassandra 内の多数のテーブルは、クラスターのパフォーマンスに直接影響を与える可能性があります。**通常、クラスター内でアクティブに使用されるテーブルは 200 個以下**にする必要があります。**アクティブに使用されているテーブルが 500 個ある場合は、非効率性や障害が発生する可能性が高い**ため、クラスターが機能していても障害レベルとみなされます。

この問題は、すべてのテーブルが**メタデータにほぼ1 MBメモリを使用**するために発生します。動作するテーブルごとに、memtable 表現が割り当てられます。大量のデータを含むテーブルでは、ブルーム フィルターやその他の補助データ構造により多くのデータが保存されるため、メモリへの負荷も増大します。また、各キースペースにより、JVM メモリに追加のオーバーヘッドが発生します。これらすべての要因が Cassandra のパフォーマンスに影響を与えます。次のベンチマークは、テーブル数の増加に伴ってスループットが大幅に低下することを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/1410d3f3-d94e-2283-2c53-dbed48992d4b.png)

## 関連する設定

### `cassandra.yaml`

SLAを担保するための仕組みとして Guardrails があり、テーブル数上限の設定も可能になっています。

#### `guardrails` [Default: disabled]

テーブル数上限の設定（設定しないと上限はなし）

https://docs.datastax.com/en/dse/6.8/dse-dev/datastax_enterprise/config/configCassandra_yaml.html#configCassandra_yaml__guardrailsYaml

#### `tables_warn_threshold` [Default: -1 (disabled)]


警告が出る閾値の設定

https://docs.datastax.com/en/dse/6.8/dse-dev/datastax_enterprise/config/configCassandra_yaml.html#configCassandra_yaml__tables_warn_threshold

#### `tables_failure_threshold` [Default: -1 (disabled)]

テーブルの CREATE を失敗させる閾値の設定

https://docs.datastax.com/en/dse/6.8/dse-dev/datastax_enterprise/config/configCassandra_yaml.html#configCassandra_yaml__tables_failure_threshold

## テーブル数上限の存在することが正当化されるべき背景に関する理解

以下は、Cassandraに限った話ではなく、一般的な考え方として。

分散データベースにおいては、複数のノード間でメタデータを共有する必要があります。
このメタデータは「常に」更新状況が監視される必要があります。
「常に」ネットワーク上を流れ続けるデータの制御を考えた場合、その単純増加要因となる管理対象（テーブル）の数に上限が存在するのは自然なことであり、そのことを意識した管理が必要になることになります。
Reports & Dashboards for Lightning Experience

+ [レポートの Logic Filter](https://qiita.com/Keiji_otsubo/items/12e8d53fe0a9e15cbe15)

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

+ [Filter Your Report : trailhead](https://qiita.com/Keiji_otsubo/items/8eb54e0bb98d4126570e)

https://trailhead.salesforce.com/content/learn/modules/lex_implementation_reports_dashboards

こちらはCaseオブジェクト


# Format Your Report

+ [Reports & Dashboards for Lightning Experience > Format Your Report](https://qiita.com/Keiji_otsubo/items/31dae9209b1e68d3fad3)


# Filter Your Report

まずは、言語設定が英語でないとクリアーできないようです。

+ [日本語バージョン　Filter Your Report](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007JiE5Z)

:::note
まずは、組織/個人の言語設定を英語に変えてみてください。
それからこのれはアメリカドルでないと合格できません。通貨もアメリカドルに変更してみてください。
:::

+ [[ケース状況] レポートに、[Industry (業種)] が Energy (エネルギー) と一致するという検索条件が見つかりません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eq53L)

:::note
当方も同様の状況でしたが下記の設定を変更したところクリアできました。

+ Playgroundの設定ページにて、Languageを英語にし、Localeをアメリカ合衆国に設定
+ ハンズオンページも一時的に英語に変更

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

+ [[ケース状況] レポートに、[Industry (業種)] が Energy (エネルギー) と一致するという検索条件が見つかりません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J6i4U)

:::note
当方も同様の状況でしたが下記の設定を変更したところクリアできました。

Playgroundの設定ページにて、Languageを英語にし、Localeをアメリカ合衆国に設定
ハンズオンページも一時的に英語に変更
PlaygroundのLanguage/Localeだけでなく、ハンズオンページを英語に変更したところ、無事クリアできました！

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


# We can't find the filter for 'Industry' equals Energy in the 'Case Status' report.

+ [We can't find the filter for 'Industry' equals Energy in the 'Case Status' report.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmHOG)

:::note
余分な　,""を削除してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f4fa4c43-0bfa-8574-55d1-f520f442d717.png)
:::

:::note
I think one filter is missing.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3149ffc0-4bd3-a70d-41a3-6d9cbe208bc9.png)
:::

+ [Report Builder not accepting 4 as valid filter](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Tkhxc)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5d112ed9-5130-477d-b338-1f6d1381c3f8.png)

:::note
I think one filter is missing. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a9129e50-9a61-428f-a226-b6e308e31aa3.png)
:::



+ [During Filter your reports I can't find my error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmJnRSAU)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6f64ca06-91ff-a346-4467-6695ace928d3.png)


# Não foi possível encontrar o filtro para 'Setor' igual a Energia no relatório 'Status do caso'.

+ [Não foi possível encontrar o filtro para 'Setor' igual a Energia no relatório 'Status do caso'.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PXO6g)
iTermをoh-my-zshでいい感じにする

コマンドラインを操作してる時にどこのディレクトリにいるか、gitでどのブランチにいるか常に把握できるようにしたい。コマンド入力時にサジェストを表示したい。ていうか、普通にデザインをカッコよくしてデキるエンジニアを気取りたい私のような人に向けて。

## 1. oh-my-zshのインストール
zshがインストールされているか確認。
```
$ which zsh
/usr/local/bin/zsh

$ /usr/local/bin/zsh --version
zsh 5.9 (x86_64-apple-darwin20.6.0)
```
zshがなかればインストール。
```
$ brew install zsh
```

oh-my-zshをインストール。
```
$ curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
```

## 2. テーマを変更
.zshrcに下記を設定。テーマ一覧は[ここ](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes)。
```
ZSH_THEME=candy
```

## 3. 入力履歴からコマンド補完をする
```
$ cd .oh-my-zsh/plugins
```
zsh-autosuggestionsをクローン。
```
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
```
.zshrcに下記を記載。
```
plugins=(
    git
    zsh-autosuggestions
)
```
```
$ source ~/.zshrc
```
## 参考
- [oh my zsh 導入手順メモ (Mac)](https://qiita.com/NaokiIshimura/items/249bb1a101b626a59387)
- [イケてるターミナルをコマンド1つで作れるoh-my-zsh!gitのブランチ名だって表示できる!](https://nishinatoshiharu.com/install-ohmyzsh/#oh-my-zsh-2)
- [oh-my-zshで入力履歴を表示して、補完する](https://qiita.com/mochizuki-pg/items/3f5e25ccc2db3bc26e08)

iTermウィンドウを、キーをダブルクリックするだけで上からカッコよく登場させたり、画面にオーバーレイ表示させたりて、イケてるやつを気取りたい人はこちらも。

https://qiita.com/mz_mz_mz/items/92e788d6bdcf805bfdb0
【markdownAI】簡単にウェブサイトが作れるツール

記事投稿キャンペーンで、気になっていたツール「markdown AI」試してみました。

https://mdown.ai/

## どんなサービスなの？
> markdown AIとはQiitaでも採用されているMarkdownの記述をするだけで簡単にWebサイトを作成することができるwebアプリケーションです。
> 
> 今後AIを用いてMarkdown方式での出力ができるようになるので、さまざまな表現が可能です。

- 簡単にWebサイトを作成できる
- AI機能は開発中？

って感じですね。

## 利用方法
- 全ての機能を無料で使用することが可能
- ログイン認証はGoogleアカウントを使える

※ 2024/7月時確認

## 操作方法について
結構多くの方が、操作方法を紹介されていますので本記事では省かせていただきます。

https://qiita.com/tags/markdownai

## 向いてそうな場面・向いてなさそうな場面
どんな場面で活躍するのか、逆にどんな場面では向かないのか、個人的な意見をまとめてみました。

### 向いてそうな場面
#### 001. 勉強仲間とのドキュメント共有
学生の時このサービスあったら便利だったなと思いました。

- 試験範囲を網羅した、外部サイトへのリンクをドキュメントとしてまとめたインデックスページ
- ノートの共有場

など、活躍の場面は多そうです。Googleアカウントさえあれば誰でもコンテンツをかけるっていうのも活きますよね。

試験をみんなで乗り越えるための武器になりそう。

#### 002. プロジェクトのドキュメント
オープンなプロジェクトであれば、一般向けにドキュメントを公開できる場になるかと思います。

#### 003. 個人ブログ
Qiitaのようなサービスは、「コメント」「いいね」「ブックマーク」といった機能がありコミュニティとして確立しています。
でもひっそりと個人ブログをしたい。って人も結構多いはず。

そんな人に向いている気がします。

↓ 手間もかかりませんよね。↓
- ウェブサイトの構築
- サーバーどうするか
- ドメインどうするか

### 向いてなさそうな場面
#### 001. 実務
当たり前ですが、機密情報の扱いには向かないです。

#### 002. ウェブサイトのカスタマイズ
ドキュメント共有という意味では強いですが、カスタマイズしたい方には向かないかと。

こういったことはできないです。
- 独自でスタイルを当てたい
- サイトに動きをつけたい
- 外部連携したい

## 所感
ドキュメント共有には結構便利かも。
AI機能がどんな感じなのか気になりますね。

https://mdown.ai/
URL書くだけ、OGP取得テスト_その２：：：歌唱合成 関連：：：

# URL書くだけ、OGP取得テスト_その２：：：歌唱合成 関連：：：
<!--＠2024/07/12、公開に際しコメントアウトしたセクション
：：下記から分離＆下書き状態化＠2024/02/12：：
[QiitaにおいてURL書くだけ =リンクカード風表示 = メタ情報(OPG / Open Graph](https://qiita.com/Reng/items/7c0caacefc2130d5ba9b)

：：デジタル楽譜：：
[デジタル楽譜を分離 from『QiitaにおいてURL書くだけでの表示check=リンクカード風...』](https://qiita.com/Reng/items/94aa70ca41834b478c2b)

：：音声合成ソフト(TTS)・音声認識 関連：：
[音声合成(TTS)や音声認識関連を分離 from『QiitaにおいてURL書くだけでの表示check=リンクカード風...』](https://qiita.com/Reng/items/00e902766d834cd60a16)
-->

## (参考用)Qiitaへの記事はこういう感じ：

https://qiita.com/Reng/items/43ebf923fef3d929dd4b

このように“リンクカード的バナー”として表示される、
これは…、これはQiita記事以外のページでは(htmlの)OGP取得テストに使える。

__OGPとは__
概要：htmlにちゃんと設定していたら、タイトル、紹介文、画像が取得できる、というやつ。
<details><summary>詳細</summary>
・ogpを使いますよ！という宣言が必要、htmlタグにprefix値(下線部分)
```html:html
<html lang="ja" prefix="og: http://ogp.me/ns#">
```

・metaタグとして以下のように書く
```html:html
<meta property="og:title" content="タイトル">
<meta property="og:type" content="website　または　blog　または　article">
<meta property="og:description" content="ページの簡単な説明">
<meta property="og:url" content="ページのURL">
<meta property="og:site_name" content="サイトのタイトル">	
<meta property="og:image" content="サムネイル画像のURL">
```

-----//開/閉ここまで
</details>



## ↓歌唱合成
上から、NEUTRINO・VoiSonia・SynthweizerV・PIAPRO STUDIO・Synsy・夢の結晶(SynthweizerV版/CeVIO AI版)・EmVoice、narasu

:::note
歌唱合成や音声合成関連は意外と、商用サイトや公式サイトであっても、OPG設定してなくて画像提示のないページがまぁまぁ多い...
:::

■NEUTRINO

https://n3utrino.work/

■VoiSona
<font color=darkgray>※おっと、比較的最近 2021年頃から〜 のサイトなのに OPG未対応...</font>

https://voisona.com/<!-----VoiSona---->

VoiSona用音源、｢ボイスライブラリ｣は 13種 (＠2024.01.31現在)

:::note
初期梱包の｢ボイスライブラリ｣は１つ、日本語ソング
知声 (Chis-A)
契約期限: なし
:::
※Chis-A [tʃíːseɪ] １つが英語ソングで、残りは全て日本語ソング
※CeVIOやVocaloidでお馴染みのキャラ≒｢ボイスライブラリ｣が多数：さとうささら、結月ゆかり、すずきつづみ、IA などなど。あと変わったところで "ペッパーくん"がラインナップされてる


:::note
- ３種が｜料金: 月額880円、年額6600円、買い切り13200円（税込）
  - さとうささら (Sato Sasara)、機流音 (Kirune) 、AiSuu
- 残りが｜料金: 月額880円、年額6600円
:::



■SynthweizerV

https://dreamtonics.com/synthesizerv/

https://dreamtonics.com/synthesizerv-gen1/jp/

:::note
※CeVIOやVocaloidでお馴染みのキャラ≒｢ボイスライブラリ｣が多数：さとうささら、結月ゆかり、すずきつづみ、IA などなど。
:::

■PIAPRO STUDIO
>直感的な操作性と歌唱スタイル機能を搭載、表現力豊かな進化型ボーカルエディター

https://piaprostudio.com/

> Piapro Studioには、NT歌声ライブラリに同梱の「Piapro Studio for NT」と
VOCALOID歌声ライブラリに同梱の通常版がある

:::note
- 「Piapro Studio for NT」
  - ｢初音ミク NT｣に同梱
- 「通常版 Piapro Studio」は
  - ｢初音ミク V4X｣・｢初音ミク V4Xバンドル版｣、｢鏡音レン・リン V4X｣・｢鏡音レン・リン V4Xバンドル版｣、 ｢巡音ルカ V4X｣、＆more...
:::




■Sinsy

http://www.sinsy.jp/

:::note
Synsy：webサービス、online、ブラウザ完結
歌唱データ(Vo楽譜データ,Voメロ)にXMLファイルを使用
:::

■夢の結晶

https://yumenokessho.bang-dream.com/

:::note
夢の結晶：SynthweizerV版 / CeVIO AI版
BanG Dream! AI Singing Synthesizer
:::

■EmVoice

https://emvoiceapp.com/

:::note
EmVoice：英語ページ、英語歌唱
:::

■naras

https://narasu.jp/<!--narasu - 楽曲配信代行サービス-->

:::note
naras：ボカロその他声合成ソフトを使った楽曲対応、になったそう
:::
Ubuntuコマンドの文字数を調べてみた

昨日の誰得記事の続きです！

https://qiita.com/joule/items/e74011c279e6c7ac566f


`compgen`では実行できるコマンドを確認できます。
まずは、1文字のコマンドを調べてみました。

```bash
$ compgen -abck | awk 'length($0)==1{printf("%s ", $0)} END{printf("\n")}'
l . : [ { } ! l { } ! . : [ [ X w [ X w 
```

また、コマンドの文字数の平均は9.8文字程度でした。

```bash
$ compgen -abck | awk '{c=c+1;lc=lc+length($0)} END{ print lc/c }'
9.75687
```

その内訳を"文字数　個数"で出してみました。

```bash
$ compgen -abck | awk 'BEGIN{split(0,ar)} {p=length($0);ar[p]+=1} END{for(i=1;i<=37;i++){printf("%02d, %d\n", i, ar[i])}}'
01, 20
02, 110
03, 177
04, 356
05, 363
06, 445
07, 494
08, 414
09, 258
10, 243
11, 224
12, 157
13, 142
14, 122
15, 110
16, 110
17, 94
18, 80
19, 71
20, 78
21, 63
22, 37
23, 57
24, 49
25, 11
26, 29
27, 9
28, 10
29, 14
30, 11
31, 0
32, 2
33, 0
34, 2
35, 0
36, 0
37, 2
```

![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490241/a5f1134e-fb98-dfea-4001-bdc5ac2c7de9.png)

4~8文字くらいが多いようです。
ClaudeのArtifactsと技術ブログを組み合わせると便利

# はじめに
こんにちは！
ClaudeのArtifacts、凄いですね。

自分が作ったものを共有できて、Remixできて、とても便利です。

こういうサービスと技術ブログを融合させるといいな、と思い、Reactをテーマにやってみます。
そのうち、Qiitaでもコードを動かせるようになるかもしれませんね。

# 今回のテーマ
Reactの学習を兼ねて、サンプル（ClaudeのArtifacts）を使って、React Hooksの説明にチャレンジします。

技術ブログを読む → 動かす → Remixする → ちゃんと動くコードを見ながら学習できる
という流れができて、非常に効率がいいのでは、と思います。

それでは、やってみましょう。

# React Hooksとは
React Hooksは、関数コンポーネントでステート管理やライフサイクルメソッドなどの機能を使用できるようにする機能です。クラスコンポーネントを使わずに、これらの機能を実現できます。

# 主要なHooksとそのユースケース
### 1. useState
useStateは、関数コンポーネント内でステート（状態）を管理するためのHookです。

**ユースケース：**
- フォームの入力値の管理
- トグルスイッチの状態管理
- カウンターの実装

**サンプル：**
このサンプルでは、useStateを使ってカウンターの値を管理しています。ボタンをクリックするとカウントが増減します。
[useState Hook Example](https://claude.site/artifacts/65fd8eee-51e0-4d7f-9561-7f3e64b08eba)

### 2. useEffect
useEffectは、コンポーネントのレンダリング後に副作用を実行するためのHookです。

**ユースケース：**
- APIからのデータフェッチ
- DOMの直接操作
- イベントリスナーの設定と解除

**サンプルコード：**
このサンプルでは、useEffectを使ってコンポーネントのマウント時にデータを取得しています。データ取得中はローディング表示を行い、取得後にデータを表示します。
[useEffect Hook Example](https://claude.site/artifacts/b78e286f-7191-4e30-b2e8-83321a92330c)

### 3. useContext
useContextは、Reactのコンテキストを使用してコンポーネント間でデータを共有するためのHookです。

**ユースケース：**
- テーマの切り替え
- 認証状態の管理
- 多言語対応

**サンプルコード：**
このサンプルでは、useContextを使ってテーマの状態を管理し、子コンポーネントでその状態を利用しています。ボタンをクリックするとテーマが切り替わります。
[useContext Hook Example](https://claude.site/artifacts/69b920a5-f91e-4cd0-8265-6b967520e967)

# まとめ
今回は、ClaudeのArtifactsを利用して、動くサンプルを使ったReactの説明にチャレンジしました。

Artifactsのメリットは、動かせて、コードが見れて、Remix（編集や改善）できることです。
学習効率は格段にアップするので、研修にも活用できそうですね。

注意点としては、外部依存となるので、リンク切れになる可能性があること。

でも、これだけ便利なら、そのうちQiitaにも実装されるかもしれません。
（マジで実装されて欲しい）

さらに、開発環境（OSバージョンとか）を入力または選択すると
環境構築方法が自動で出力されたりしたら、もうスクールとかいらなくなるな、、

Qiitaさんなら、やってくれるはず。
楽しみにしながら、AIもQiitaも、どんどん活用しましょう！
Javaで「文字列全体が正規表現パターンとマッチするか調べる」の動作を確認してみた

# 概要

Javaで「文字列全体が正規表現パターンとマッチするか調べる」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/string/index19.html

# 実装

以下のファイルを作成しました。
```JSample19_1.java
class JSample19_1{
  public static void main(String[] args){
    String str1 = "airplane.png";
    String str2 = "lemon.png";
    String str3 = "apple.jpeg";
    String regex = "a.+png$";

    System.out.println(str1.matches(regex));
    System.out.println(str2.matches(regex));
    System.out.println(str3.matches(regex));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample19_1.java 
$ java JSample19_1 
true
false
false
```

# まとめ

何かの役に立てばと。
ラズパイ5にKubernetes(k3s)環境を構築する

https://docs.k3s.io/installation/requirements?os=pi

こちらも参考にさせていただきました。

https://qiita.com/to-fmak/items/696eb97a454111435337

# 事前準備
「Raspberry Pi OS は Debian ベースであり、既知の iptables バグの影響を受ける可能性があります。[既知の問題](https://docs.k3s.io/known-issues#iptables)を参照してください。」とありますが、対象のバージョン(Iptables バージョン 1.8.0 ～ 1.8.4)ではありませんでした。
```
$ sudo iptables -V
iptables v1.8.9 (nf_tables)
```

### cgroupsサービスを開始
```
$ sudo cat /boot/cmdline.txt 
DO NOT EDIT THIS FILE

The file you are looking for has moved to /boot/firmware/cmdline.txt
$ sudo nano /boot/firmware/cmdline.txt
cgroup_memory=1 cgroup_enable=memory を追記
$ sudo reboot now
```
とりあえず有効になってるっぽい?
https://blog.sakashita.dev/2020/07/cgroupsmd.html
```
$ cat /proc/cgroups
#subsys_name    hierarchy       num_cgroups     enabled
cpuset  0       112     1
cpu     0       112     1
cpuacct 0       112     1
blkio   0       112     1
memory  0       112     1
devices 0       112     1
freezer 0       112     1
net_cls 0       112     1
perf_event      0       112     1
net_prio        0       112     1
pids    0       112     1
```

### linux-modules-extra-raspi
これはRaspbianではいらないということでいいのかな?
「Ubuntu 21.10 以降、Raspberry Pi 上の vxlan サポートは別のカーネル モジュールに移動されました。
sudo apt install linux-modules-extra-raspi」
ということでスキップ

### swap無効化
```
$ sudo swapoff --all
$ sudo systemctl stop dphys-swapfile.service
$ sudo systemctl disable dphys-swapfile.service
```

# インストール
```
$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
$ kubectl get nodes
NAME        STATUS   ROLES                  AGE   VERSION
raspberrypi   Ready    control-plane,master   7s    v1.29.6+k3s2
```
SageMakerドメイン削除時に「ドメインを削除」が非活性になる時の対処法

## 概要
SageMakerを使っていて、最後にリソース削除をする際にSageMakerドメインが削除できず詰まったのでメモ。


![IMG_2132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/07b2c96a-2699-4459-951e-3836e203b90b.png)

上記のように、ドメインを削除ボタンが非活性になっており、どうすればいいのか？という状況で詰まっていました。

# 原因
原因はSageMakerドメインに関連付けられているユーザープロファイル（UserProfile）が存在していたこと。

「ドメインの削除」の部分に原因はちゃんと書いてありました。
>ドメインを削除するには、いかなるユーザープロファイルまたはスペースもドメインに含まれていてはなりません。ユーザープロファイルまたはスペースを削除するには、失敗していないいかなるアプリケーションもそのプロファイルまたはスペースに含まれていてはなりません。

そして、SageMakerの開発者ガイドの記事（[参照](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/gs-studio-delete-domain.html)）にもしっかりとドメイン削除時の注意点の記載がありました。




今回は<strong>ユーザープロファイルが存在していたため</strong>ドメイン削除ボタンが非活性になっていました。

## SageMakerドメインとはそもそも何か
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/a8e9c2ec-388d-a903-b7d4-cc80faa2e603.png)
（AWS公式より引用）

SageMakerドメインはユーザープロファイル（各ユーザーの個別の設定や環境を管理するもの）・共有スペース（ユーザー間共有で使用できる開発環境）・パーソナルアプリ（各ユーザーが独自に使用する開発ツールや環境設定）からなるようです。

SageMakerドメイン=SageMakerで開発を進める際、基盤となる存在ということが分かりました。

## 対処法
ポイントは、「SageMakerドメインに紐づくユーザープロファイルを先に削除すること」
これだけです。

### 対処法1. AWS CLIを使って削除
①CLIでユーザープロファイルを削除
同じ事象にハマっているケースがないかググってみたところ、AWS CLIを使って削除するとうまくいくという記事があり試したところ、うまくいきました。

ターミナル上で下記コマンドを実行
```
aws --region <region名> sagemaker delete-user-profile \
    --domain-id <削除したいドメインのID> \
    --user-profile-name <削除したいユーザープロファイル>
```

②ドメインを削除
```
aws --region <region名> sagemaker delete-domain \
    --domain-id <削除したいドメインのID> 
```

### 対処法2. コンソールから削除
上記のCLIから削除、の方法を調べている際に、普通にコンソール上から削除できることに気がつきました。
ただ単に、ユーザープロファイルの削除への導線に気付けていなかっただけでした。

ドメイン→ユーザーの詳細のページ>アプリケーション設定のタブから、削除ボタンを押下
![IMG_2133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/8e503f8f-bdb9-610d-f1b4-fb91e1588d74.png)

↓
「削除」と入力→削除ボタンを押下
![IMG_2134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/92e99de9-c598-df5f-725a-94c484d6db85.png)
↓
ユーザープロファイルの削除がされる
![IMG_2135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/3eabffef-f4ea-de95-4907-e8ca470745b7.png)
↓
ユーザープロファイル削除完了
![IMG_2136.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/d83487fb-d306-f398-a270-1f7ebab3a0d2.png)
↓
SageMakerドメインのページに移動、「ドメインを削除」ボタンが活性化していることを確認
![IMG_2137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/76300c18-c890-577a-8b9f-bfd3627f158f.png)
↓
削除確認ポップアップで「削除」と入力
![IMG_2138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/c6489ae1-a38e-4f76-c11c-1ddc6cae983d.png)


無事SageMakerドメイン削除完了。
![IMG_2139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/d598fe2b-2961-aa3d-8370-58091fc914c1.png)


削除の方法は2種類ありますが、CLIで削除した方が削除は楽かなと感じました。

## 学び、教訓
今回、かなり初歩的な部分で時間を使ってしまいました。
当たり前のことですが、全体像を理解した上で使わないと思わぬミスにハマるな、ということを改めて思い知りました。あとはしっかりと公式ドキュメントに書いてあることをしっかり読むこと、改めて大事だなと思いました。
クラウド環境でのデータ転送を最適化する方法


## はじめに

クラウド環境でのデータ転送は、プロダクトのパフォーマンスやコストに大きな影響を与える重要な要素です。この記事では、クラウドベンダーの様々なサービスを活用しながら、データ転送の最適化を行う方法について解説します。

## データ転送の課題

クラウド環境でのデータ転送には以下のような課題があります。

1. **コスト**: データ転送にはコストがかかります。特に大量のデータを転送する場合、そのコストは無視できません。
2. **パフォーマンス**: データ転送の速度が遅いと、アプリケーションのパフォーマンスに悪影響を与えます。
3. **セキュリティ**: データ転送中のセキュリティも重要です。データが盗まれたり改ざんされたりするリスクを最小限に抑える必要があります。

## 最適化の方法

### 1. データ圧縮

データを圧縮することで、転送するデータ量を減らすことができます。これにより、転送コストと時間を削減できます。例えば、AWSのS3では、データを圧縮して保存することができます。

### 2. CDNの活用

コンテンツデリバリーネットワーク（CDN）を利用することで、データをユーザーに近いサーバーから配信することができます。これにより、データ転送の速度が向上し、ユーザーエクスペリエンスが向上します。AWSのCloudFrontやAzureのCDNなどが代表的なサービスです。

### 3. データ転送のスケジューリング

データ転送をオフピーク時間にスケジューリングすることで、ネットワークの混雑を避け、転送速度を向上させることができます。AWSのDataSyncやAzureのData Factoryなどのサービスを利用すると、スケジューリングが容易になります。

### 4. マルチパートアップロード

大きなファイルを複数の小さなパートに分割してアップロードすることで、転送速度を向上させることができます。AWSのS3やAzureのBlob Storageでは、マルチパートアップロードがサポートされています。

### 5. データ転送のモニタリング

データ転送のパフォーマンスをモニタリングすることで、問題が発生した場合に迅速に対応することができます。AWSのCloudWatchやAzureのMonitorなどのサービスを利用すると、モニタリングが容易になります。

## まとめ

クラウド環境でのデータ転送を最適化するためには、様々な方法があります。データ圧縮、CDNの活用、データ転送のスケジューリング、マルチパートアップロード、データ転送のモニタリングなどを組み合わせることで、コストを削減し、パフォーマンスを向上させることができます。これらの方法を活用して、クラウド環境でのデータ転送を最適化しましょう。

## 参考リンク

- [AWS S3](https://aws.amazon.com/s3/)
- [Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/)
- [AWS CloudFront](https://aws.amazon.com/cloudfront/)
- [Azure CDN](https://azure.microsoft.com/en-us/services/cdn/)
- [AWS DataSync](https://aws.amazon.com/datasync/)
- [Azure Data Factory](https://azure.microsoft.com/en-us/services/data-factory/)
- [AWS CloudWatch](https://aws.amazon.com/cloudwatch/)
- [Azure Monitor](https://azure.microsoft.com/en-us/services/monitor/)
Laravel Eloquentのupdateの挙動がどうもうまくいかない

# 概要
Laravel Eloquentにおいて、updateの結果をレスポンスとして返すような状況も想定される（特にAPI）と思われるが、
**どうもうまくいかなかった**ので備忘録的に残してる記事である。

# 前提知識
## whereとfindでのupdateにおける返り値の違い

https://kannokanno.hatenablog.com/entry/2017/06/02/202129

※ こちらの記事大変参考になりました。ありがとうございます！

# 起こった事
- `find($id)->update($values)`
    - 更新成否が不明
        - 更新失敗でもつねに返り値trueが返る
- `where(['id' => $id])->update($values)`
    - 不正なカラムでupdateすると、find()だとtrueを返すのに対し、where()はしっかりエラーを返す。
    - しかし、**更新前と同じデータや空の情報で更新処理を行った場合**、実際のデータは更新されないが、更新成功判定（return 1）は出てしまう。


# 暫定策
```php
public function update(int $id, Request $request): JsonResponse
{
    $player = Player::where(['id' => $id]);
    $updateResult = $player->update($request->except('id')) ? 'success' : 'failure';
    return response()->json(['result' => $updateResult]);
}
```
一旦、エラー時は拾えるため、`where(['id' => $id])->update($values)`を利用しているが、実際のデータは更新されなくても、更新成功判定が出てしまうので、より良い実装方法がないかを模索中です。
Android: ビルド時にktlintFormatが実行されるようにする

n番煎じではありますが2024年時点のAndroidプロジェクト向けの記録を残しておきます。

:white_check_mark: Kotlin
:white_check_mark: Jetpack Compose
:white_check_mark: Gradle バージョン カタログ (libs.versions.toml)
:white_check_mark: Kotlin DSL (buid.gradle.kts)

### Dependenciesの追加と設定
ktlint gradle pluginを導入します。
ついでにcompose向けのlint checkも入れておきます。
ライブラリやプラグインのバージョンは公式サイトで最新を調べて設定します。

```libs.versions.toml
[libraries]
compose-lint-checks = { module = "com.slack.lint.compose:compose-lint-checks", version = "1.3.1" }

[plugins]
gradle-ktlint = { id = "org.jlleitschuh.gradle.ktlint", version = "12.1.1" }
```

```build.gradle.kts
plugins {
    ...
    alias(libs.plugins.gradle.ktlint) apply false
}
```

```app/build.grdle.kts
plugins {
    ...
    alias(libs.plugins.gradle.ktlint)
}


android {
    // ktlint configuration
    // see: https://github.com/JLLeitschuh/ktlint-gradle?tab=readme-ov-file#configuration
    ktlint {
        android.set(true)
    }
}
```

ktlintの設定ファイルをプロジェクトルートに作成します。

Compose名が小文字で始まっていると怒られるので`@Composable`アノテーションがついているfunctionの名前チェックをスキップする設定を入れておきます。
```.editorconfig
root=true
[*.{kt,kts}]
ktlint_function_naming_ignore_when_annotated_with=Composable
```

gradle syncするとktlintFormatを含む[ktlintのgradleタスク](https://github.com/JLLeitschuh/ktlint-gradle?tab=readme-ov-file#main-tasks)が追加されます。
ktlintFormatを実行する準備が整いました。

コマンドラインから実行
```
$ ./gradlew ktlintFormat
```

AndroidStudioのgradleパネルから実行
![スクリーンショット 2024-07-12 0.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177405/9a00a3ea-dd4d-d9a1-d0e5-1bd74ffaf460.png)


### gradle タスクにktlintFormatを追加

次にpreBuildにktlintFormatタスクを登録します。

```app/build.gradle.kts
import com.android.build.gradle.internal.tasks.factory.dependsOn

android {
    ...
    project.tasks.preBuild.dependsOn("ktlintFormat")
}
```

これでビルド時にktlintFormatが実行されるようになりました :tada:
反 AI 派 ← 何これ？

# 注意
　この記事には以下の要素がたくさん含まれています
 - ポジショントーク
 - 強い言葉
 - 深夜テンションで書かれた怪しい日本語

# まず最初に
- この記事内ではいわゆる「反 AI 派」の方々を彼らと呼びます
- 筆者の立場は推進派です

 # 反 AI ← AI ってなんのこと？
 　筆者はまず，反 AI と聞いたらその AI という言葉が指すものについて気になります．AI と大雑把に言えば，その言葉が指している概念が多すぎて何が何だかわからないし，AI を利用した成果物を使用しない生活を送りたい場合，ユナボマーのような暮らしをおすすめする他ない．（例: [これも頑張れば AI と言えるだろう](https://www.google.com/search?q=PID%E5%88%B6%E5%BE%A1)）
　彼らが一体何について批判しているのか...まあ，大抵の場合生成 AI のことを指しているらしい．この時点で手が出そうになるぐらいの嫌悪感を抱いてしまうが，一旦冷静になるとしよう．

# 少し脱線して，読者に聞いておいてほしい話がある
　まずは [文化庁が出しているこの資料群 (2018 年)](https://www.bunka.go.jp/seisaku/chosakuken/hokaisei/h30_hokaisei/) を見てほしい．全てを見ろとまでは言わないので，[概要](https://www.bunka.go.jp/seisaku/chosakuken/hokaisei/h30_hokaisei/pdf/r1406693_01.pdf) と [その説明資料](https://www.bunka.go.jp/seisaku/chosakuken/hokaisei/h30_hokaisei/pdf/r1406693_02.pdf) は読んでほしい．もし彼らが「生成 AI の違法な学習」と言っているのであれば，ぜひ読んでほしい．
　筆者の勝手な解釈になるが，日本国は自国の法改正に遅れ，ビックテックとの競争に敗北して反省したのかもしれない．著作権法を改正し業界の萎縮を解こうとする動きをしたと読み取っている．
　そしてもう一つ，[文化庁が出した資料 (2023 年)](https://www.bunka.go.jp/seisaku/chosakuken/pdf/93903601_01.pdf) も絶対に読んでほしい．この資料はいわゆる生成 AI が急速に発達した近頃に出てきたものだ．創作者全員が読むべきものだと思う．

# 上記を踏まえて自称情報系のオタクが雑に語る
　筆者は一人のオタクとして，AI という言葉を濫用すること自体が許し難いし，批判（持ち上げることについてもそうだが！）の際に周辺情報を参照しようとしない姿勢を持った人間が苦手である．機械学習ライブラリの中で一番有名と言っても過言ではない Torch のビルドを通したことがあるのかと言いたくなるが，興味のない人々にこれを押し付けるのは良くない．けれど批判・賞賛する際には少しでも知識をつけておいてほしい．

 # 生成 AI の学習対策は意味ないよ〜
 　結局のところ人間が作った対策はそのうち人間によって突破されます．画像のスクレイピング対策自体にも，右クリック禁止というかわいいものから，Canvas の prototype 汚染をしてデータの取得を不可能にするという [面白いアプローチ](https://blog.potproject.net/2023/05/26/never-scrape-image/) まであり，極め付けには DRM という技術もあります．ところがどっこい，その DRM でさえ突破してくるような人間がこの世には存在します．

# 最後に
　無法者だと思われたくないので明文化しますが，筆者は法を犯す気はありませんし，法に触れそうな事象があるときは必ず調べるようにしています．
　一応この記事はこれで終わりです．暇な時に新しい話題について言及するかも．
PythonのLinterであるRuffの使い方を雑にメモしていく。

### インストール

```sh
pip install ruff
```

### 設定方法
https://docs.astral.sh/ruff/linter/

自分はryeを使っているのでpyproject.tomlで以下のように書き込んでいく。
上のリンクにもあるようにruff.tomlも使える。
```toml
[tool.ruff.lint]
select = [
    # pycodestyle
    "E",
    # Pyflakes
    "F",
    # pyupgrade
    "UP",
    # flake8-bugbear
    "B",
    # flake8-simplify
    "SIM",
    # isort
    "I",
]

```

### 使えるルール
https://docs.astral.sh/ruff/rules/

以上のとおり。

### VSCodeでの設定方法


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555216/504f43c4-18a3-3b75-69b0-e131deb01c12.png)

拡張機能の設定で以下の箇所を設定するだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555216/868febf9-31f4-1543-4b0f-3e8fd9a32b0f.png)

### チェック

```sh
ruff check hogehoge.py
```
【Java】double型での数値計算で気をつけること

### 前提
ご存知の方も多いかと思いますが、javaに限らずコンピュータではfloatやdoubleでの数値計算において浮動小数点数を用いているため、以下のように意図する正確な計算結果が得られない場合があります。
これは、計算効率を上げるためコンピュータが10進数から2進数に変換して計算していることが原因です。
小数を2進数に変換すると有限桁では表せないため、結果的に近似計算になるということです。

ref : https://seiai.ed.jp/sys/text/csc/ch12/c12a300.html

```java
double x = 1.21;
double y = 0.1;
double z = x - y;
System.out.println(z); // 1.1099999999999999
```
### 問題
計算機シミュレーションなど大規模な計算を行う場合は便利ですが、金額計算など正確な値が必要となる状況においては上のような誤差はできるだけ避けたいです。
例えば異なる通貨を介した計算などで遭遇しがちな問題でしょうか。

### 1. BigDecimalを使う
doubleの代わりにBigDecimal型を使用することで、正確な結果を出すことができます。
BigDecimalでは浮動小数点数を使わず、整数値と小数点以下を別々で管理することで丸め込みを回避しているそうです。
add, subtract, multiply, divideを使って四則演算が可能です。
```java
BigDecimal x = new BigDecimal("1.21");
BigDecimal y = new BigDecimal("0.1");
BigDecimal z = x.subtract(y);
System.out.println(z); // 1.11
```
ただ、計算の規模が大きくなったりや変数が増えて複雑化すると可読性もパフォーマンスも下がることは想像できます。

### 2. 整数計算に持ち込む
事前に小数点以下の桁数が分かっているかつ桁数が大きくなりすぎない場合は整数で計算を行うのが便利です。
具体的には-2147483648 ~ 2147483647に収まるならint, -9223372036854775808 ~ 9223372036854775807に収まるならlongといった感じです。

**計算で出現する最大の小数点以下桁数がnの時、全てに$10^n$をかけて計算し最後に$10^n$で割る**
以下はn=2の例(`1.21 - 0.1`)
```java
int x = 121;
int y = 10;
int z = x - y;
System.out.println((double) z / 100); // 1.11
```

## 補足
計算内で割り算がある場合は整数の状態で分母と分子を計算し、できるだけ最後に一回だけ割り算を行うようにすると計算精度が高くなります。割り切れなかった場合の丸め込みの影響を次の計算に及ぼさないためです。当然のように聞こえますが、計算の文脈が長くなってくると途中で割ってしまいがち。

ちょっと強引な例として半径7の球の体積をできるだけ正確に求めたいとします。
```math
V = {\frac{4}{3}}{\pi}r^3 , ({\pi} = {\frac{22}{7}} \fallingdotseq 3.1415929203539825)
```
1. 前から順番に計算
$$1.3333333333333333 \times 3.1415929203539825 \times 7^3 = 1436.755162241888$$
2. 割り算を最後に
$$\frac{4 \times 22 \times 7^3}{3 \times 7} = \frac{4312}{3} = 1437.3333333333333$$
Javaのプロパティファイルのエスケープを使用したい

## Javaのプロパティファイルのエスケープが欲しい
仕事でいくつかの顧客のためのデプロイをする際に設定ファイルを文字列置換ツールを自分で作って使っているのですが、propertiesファイルの値に日本語を入れる必要が生じたときに通常の文字列変換だけやってテキストファイル書き込みをやってしまうと例の
```
日本語 -> \u65E5\u672C\u8A9E
```
にならなくてなにか面倒になるかもしれないと思って使えそうなものを色々と調べました。
Apache Commons の **org.apache.commons.text.StringEscapeUtils** クラスの以下のメソッドが
```java
static String escapeJava​(String input)
static String unescapeJava​(String input)
```
多バイト文字の問題は解決してくれるのですが、java propertiesファイルはシングルバイトの特殊文字もいくつかエスケープしますし、どの特殊文字がエスケープされるのかを調べるのも面倒だし間違えそうなので、**java.util.Properties** クラスを使って文字列エスケープをすれば間違いないと思い以下のコードを書きました。

###### Javaソースコード
```java:PropertiesEscaping.java
package com.example.properties;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesEscaping {

	private static final String KEY = "__key__";
	private static final String KEY_AND_EQ = KEY + "=";

	// エスケープメソッド
	public static String escape(String input) {
		String value = null;
		try {
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			Properties prop = new Properties();
			prop.setProperty(KEY, input);	// propertiesに値をセット
			prop.store(bos, null);	// ストリームに書き出して
			byte[] bytes = bos.toByteArray();	// バイト列を取得
			String content = new String(bytes);	// バイト列を文字列に
			String[] lines = content.split("\n");	// propertiesファイルそのものなので...
			for (String line : lines) {
				if (line.startsWith(KEY_AND_EQ)) {
    				// 目的の行が見つかったのでキーとイコールを省く
					value = line.substring(KEY_AND_EQ.length());
					break;	// 目的の文字列をゲット
				}
			}

			bos.close();	// 閉じておきましょう
		}
		catch (IOException ex) {
			ex.printStackTrace(System.err);
			value = null;	// エラーなので念の為...
		}

		return value;
	}

	// アンエスケープメソッド
	public static String unescape(String input) {
		String value = null;
		String content = KEY_AND_EQ + input;	// キー&バリューの一行
		try {
			// バイト変換してストリームにセット
			ByteArrayInputStream bis = new ByteArrayInputStream(content.getBytes());
			Properties prop = new Properties();
			prop.load(bis);	// バイトストリームをPropertiesに読み込ませ
			value = prop.getProperty(KEY);	// 目的の文字列をゲット

			bis.close();	// 閉じておきましょう
		}
		catch (Exception ex) {
			ex.printStackTrace(System.err);
			value = null;	// エラーなので念の為...
		}
		return value;
	}

	// メイン
	public static void main(String[] args) {
		String val1 = "~!@#$%^&*()_+`-=|[{}]\\:\";'<>?,./ 日本語 Qiita";
		String val2 = escape(val1);
		String val3 = unescape(val2);
		System.out.println("val1: " + val1);
		System.out.println("val2: " + val2);
		System.out.println("val3: " + val3);
	}
}
```

コードで書くと上記のような簡単なものになります。
説明はコメントの通りです。

###### コンパイルと実行
```
$ javac com/example/properties/PropertiesEscaping.java
$ java -cp . com.example.properties.PropertiesEscaping
val1: ~!@#$%^&*()_+`-=|[{}]\:";'<>?,./ 日本語 Qiita
val2: ~\!@\#$%^&*()_+`-\=|[{}]\\\:";'<>?,./ \u65E5\u672C\u8A9E Qiita
val3: ~!@#$%^&*()_+`-=|[{}]\:";'<>?,./ 日本語 Qiita
```

必要だったのはescapeメソッドだけでしたが、unescapeメソッドも作ってみました。
unescapeメソッドは必要なシーンがちょっと思い浮かびませんね。
スクラム開発でリソースの使用状況を最適化する方法


## はじめに
スクラム開発において、リソースの使用状況を最適化することは非常に重要です。クラウドベンダーの多様なサービスを活用することで、効率的なプロダクト開発が可能になります。この記事では、リソースの使用状況を最適化するための具体的な方法について解説します。

## 1. クラウドサービスの選定
まずは、プロジェクトに最適なクラウドサービスを選定することが重要です。AWS、Azure、GCPなど、各クラウドベンダーには多様なサービスが提供されています。以下のポイントを考慮して選定しましょう。

- **コスト**: サービスの料金体系を比較し、予算に合ったものを選びます。
- **スケーラビリティ**: 将来的な拡張性を考慮し、スケーラブルなサービスを選びます。
- **サポート**: ベンダーのサポート体制やコミュニティの活発さも重要です。

## 2. インフラの自動化
インフラの自動化は、リソースの使用状況を最適化するための鍵です。TerraformやCloudFormationなどのIaC（Infrastructure as Code）ツールを活用することで、インフラの構築・管理を自動化できます。

### 例: Terraformを使ったインフラの自動化
```hcl
provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}
```

## 3. モニタリングとアラート
リソースの使用状況をリアルタイムで把握するために、モニタリングツールを導入しましょう。CloudWatch（AWS）、Azure Monitor、Stackdriver（GCP）などのツールを活用することで、リソースの使用状況を可視化し、異常が発生した際にアラートを受け取ることができます。

### 例: CloudWatchを使ったモニタリング
```yaml
resources:
  - name: my-instance
    type: AWS::EC2::Instance
    properties:
      InstanceType: t2.micro
      ImageId: ami-0c55b159cbfafe1f0
      Monitoring: true
```

## 4. コスト管理
クラウドリソースのコスト管理も重要なポイントです。各クラウドベンダーはコスト管理ツールを提供しており、これらを活用することでコストの最適化が可能です。例えば、AWSのCost ExplorerやAzureのCost Management + Billingを使用することで、リソースの使用状況に基づいたコスト分析ができます。

### 例: AWS Cost Explorerの活用
- **コストアラートの設定**: 予算を超えた場合にアラートを受け取るように設定します。
- **リソースの無駄遣いを削減**: 使用されていないリソースを特定し、削除または停止します。

## 5. 継続的な改善
リソースの使用状況を最適化するためには、継続的な改善が必要です。定期的にリソースの使用状況をレビューし、必要に応じて設定を見直しましょう。スクラムのスプリントレビューやレトロスペクティブを活用して、チーム全体で改善点を共有することが重要です。

## まとめ
スクラム開発におけるリソースの使用状況を最適化するためには、クラウドサービスの選定、インフラの自動化、モニタリングとアラート、コスト管理、そして継続的な改善が必要です。これらのポイントを押さえることで、効率的なプロダクト開発が可能になります。ぜひ、この記事を参考にして、リソースの最適化を実践してみてください。
BYOD許可されてない私物端末からGoogle Workspaceのカレンダーを無料で操作する泥臭い方法

うちの会社ではGoogle Workspaceを契約しています。

突発的な遅刻や休みの連絡も、Googleカレンダーに予定入れればOKってことになってます。便利！

で、当然ながら、そんなん突発的な連絡は私物PCかスマホから行うことになるのですが、
諸般の事情でBYOD申請をだしていません・・・（不便）

電車事故で止まっちゃったとき、遅刻しますーとか連絡をさくっとやっちゃいたいわけです。
（極度のコミュ症なので会社に電話かけるのもまあまあしんどかったりするのです）

Webアプリとかでわりと簡単に作れそうでも有りますが、
社員の情報をコントロールできる口を常設しちゃうとセキュリティとかランコスの関係で会社に無断でたてられません。
会社にお願いしたらBYOD申請してって言われます。


とまあホントニッチな困りごとが有りました。

---
# 解決案

すでにネットワーク的にpublicに常設されている唯一の経路が1つだけ有ります。

そうメールですね。

なのでこのメールをトリガーにして、Googleのカレンダーを操作しようと考えました。
これで特に会社のリソースを何も追加で使わないし、コストも今のままです。

単純にメールをトリガーにすると言っても、普段から多種多様なメールが飛んでくるのでうっかり誤動作しないような
他とかぶらない特殊な条件で引っ掛ける必要が有ります。

ここでは、サブアドレスを使うことにしました。

### 仕様

* 自分の会社のサブアドレスにメールを送ると
* メールタイトルを判断して　
* Googleカレンダーに予定を入れる

こんなシステムを作ろうと思います。
メールもカレンダーもGoogle Workspace上に有りますので、
これらにアクセスしやすいGASで実装します

---

# 実装

```actionscript
// カレンダーイベント作成関数
function createEvents(title, desc, year, month, day, startHour, endHour) {
  const calendar  = CalendarApp.getDefaultCalendar();
  const startTime = new Date(year, month, day, startHour, 0, 0);
  const endTime   = new Date(year, month, day, endHour,   0, 0);
  const options   = { description: desc };
  
  let events = calendar.getEvents( startTime, endTime );

  // 重複チェック
  if (events.length > 0) {
    for ( let i = 0; i < events.length; ++i ) {
      if (events[i].getTitle() == title) {
        return;
      }
    }
  } 
  calendar.createEvent(title, startTime, endTime, options);
}

// 対象メールを見つけたら、カレンダーにイベント登録
function SearchMail(){
  const start = 0;
  const max = 100;
  
  // searchのフィルター条件はGmailで検索する時と一緒
  // 自分のアドレスに+Specialのついたサブアドレスを検索する
  const query   = 'from:(@gmail.com) to:(自分のアドレス+Special@gmail.com) newer_than:1h'
  const threads = GmailApp.search(query, start, max);

  // 件数取得
  const count = threads.length;

  // メッセージの中身を取得
  for (let i = 0; i < count; i++ ){

    // メッセージの詳細を取得する
    const message = threads[i].getMessages()[0].getBody();
    const subject = threads[i].getFirstMessageSubject();
    
    // 休暇種別の決定
    const isFlex = subject.toUpperCase().match(/FLEX/);
    const isAMQ  = subject.toUpperCase().match(/AM/);
    const isPMQ  = subject.toUpperCase().match(/PM/);   
    const req_index = (isFlex ? 0 : isAMQ ? 1 : isPMQ ? 2: 3);

    // Flex出社 -> 9〜10時の予定を作成
    // AM休み -> 9〜12時の予定を作成
    // PM休み -> 12〜23時の予定を作成
    // 全休 -> 9〜23時の予定を作成
    const title_table = [ 'FLEX出社', 'AM休み', 'PM休み', '全休' ];
    const start_table = [  9,  9, 12, 9 ];
    const end_table   = [ 10, 12, 23, 23];
    
    // 日にちの決定
    let target_date = new Date();
    if (target_date.getHours() >= 11) {
      target_date.setDate(target_date.getDate() + 1);
    }
    
    let year  = target_date.getFullYear();
    let month = target_date.getMonth();
    let date  = target_date.getDate()
    
    createEvents(
        title_table[req_index],
        subject +' '+ message, 
        year,
        month,
        date,
        start_table[req_index],
        end_table[req_index]
    );
  }
}
```

---

あとはこれをGASの時間起動イベントとして、
1時間に1回とか定期実行させれば完成です

### 効果

このシステムを作って１年以上たちましたが、めちゃめちゃ重宝してますｗ

この休暇連絡メールを、テンプレ登録しているので、
わずか10秒でメール送って、あとはほっとけばカレンダーに予定が登録されます。
電話かけるよりも手早く休暇や遅刻の連絡ができるようになりました！
Laravel×Docker挙動を軽くする方法_完成版

## 作成背景
- まだ遅かったので、インストールのストレスを低減するテンプレートを作成したい

## 以前の記事
https://qiita.com/koinunopochi/items/d63d961dcabf2ebd2a6e

https://qiita.com/koinunopochi/items/8f749b29973a9d46bacc

## 変更点

```yaml:compose.yaml
  # PHPサーバー
  php:
    # コンテナ名
    container_name: "php"
    # コンテナの作成に使用するDockerfileのパス
    build:
      dockerfile: "./container/php/Dockerfile"
    # srcディレクトリ内のファイルをコンテナ内の~/var/www/html配下にマウント
    volumes:
      - ./src:/var/www/html
      - storage-volumes:/var/www/html/storage/framework
      - vendor-volumes:/var/www/html/vendor

```

以前は一度コメントアウトしていたが、compose.yamlのボリュームの設定はあらかじめ行ってしまう

今回の方法は、

::: note info
起動時にvendorなどのディレクトリが作成されてしまうためLaravelがインストールできなかったが、別のディレクトリでやればインストールもできるし、ローカルに反映されないから馬鹿早いのでは、、、、？
:::

といった感じです

```sh
root@25655c88d187:/var/www/html# history
    1  cd /var/www
    2  mkdir new-laravel-project
    3  cd new-laravel-project
    4  composer create-project --prefer-dist laravel/laravel .
    5  cp -r * /var/www/html/
    6  cd /var/www/html
    7  chown -R www-data:www-data /var/www/html
    8  chmod -R 755 /var/www/html/storage
    9  chmod -R 755 /var/www/html/bootstrap/cache
   10  history
```

## まとめ
とりあえず、インストールに5分ぐらいかかっていたのを10秒レベルまでできたので、ひとまずLaravelの環境構築は終了かなと思っています！
Eclipseの作業効率化のためのショートカット一覧

# 投稿経緯
Eclipseを業務で利用しているのでアウトプットとして投稿します。
ショートカットについては随時更新していく予定です。

## ショートカット

### `Ctrl + /` 複数行コメントアウト
複数行をまとめてコメントアウトできる。
コメントアウトした箇所で`Ctrl + /`を押すとコメントアウトを解除できる。

![Eclipse 一斉コメントアウト.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614835/bef6c534-862d-417d-7b47-3d6b155b632b.gif)


### `Ctrl + Shift + R` リソースファイルを開く
検索文字に合致したファイルを選択するとリソースファイルを開ける。

![Eclipse リソースファイル開く.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614835/a101250a-8ca0-bfaf-63b9-6a48521ef417.gif)


### `F3` 宣言元を開く
呼び出されているメソッドや変数名にフォーカスインして`F3`を押すと宣言元に開ける。

![Eclipse 宣言元を開く.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614835/b8fb2513-7cd7-9624-3f87-19693d0ece69.gif)

### `Ctrl + Alt + H` 呼び出し階層を開く
ネストして階層で呼び出し場所を把握できる。

![Eclipse 呼び出し階層を開く.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614835/9a1c476c-5d9e-6260-cf83-267f3a1e9ce7.gif)

### `Ctrl + S` 編集中のファイルを保存する
ファイルを編集後に`Ctrl + S`で当該ファイルの変更を保存できる。

![Eclipse ファイル編集保存.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614835/e13fcf91-6cee-ddbe-7ff3-d83e73da8cde.gif)

### `Ctrl + W` 閲覧中のファイルを閉じる

![Eclipse 閲覧中のファイルを閉じる.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614835/81d44827-4c2a-433a-355d-e0895a2101d4.gif)

### `Ctrl + Z` ファイルを1つ前の状態に戻す
誤って編集した場合に1つ前の状態に戻せる。

![Eclipse 1つ前の状態に戻す.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614835/decf827d-85a8-f0d9-ff32-e75e53043e38.gif)

### `Ctrl + Y` ファイルの編集を元の状態に戻す
1つ前の状態を元の状態に戻したい場合に使用する。

![Eclipse 1つ先の状態に進める.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614835/5773b5d7-fb59-5ea5-a6b4-d51ea3e066e1.gif)
（1冊ですべて身につく）カラーピッカーを作成する　カラーコードを表示する

お疲れ様です。

昨日の続きから進めていきます。
昨日の時点では、カラーピッカーで適当に色を選択してもカラーコードは変化しませんでしたが、今日はカラーコードが表示されるようにしました。

![107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/21e023ce-4f04-750b-44c0-ac80dcedf03e.png)

![108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/fa487847-3827-ca6e-9c21-5c461b9fd20c.png)

id名 ColorPicker から値(value)を取得し、それを表示。(2枚目の画像)
ただ、毎回 document.querySelector.....と書いていては、最終的にコードが長くなっていって、タイプミスもするし、大変になってくるので、値を取得したコード達をそれぞれ定数宣言し、コンパクトにまとめる。とのことです。

![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/ca1cc6c5-4c46-6201-bb23-f8c44b3fa349.png)

![112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/7f2d20ac-62ef-0a3a-61c4-607488b4965f.png)

**addEventlistener**　という、ユーザーの操作（クリック、マウス移動など）に応じて特定の関数を実行するメソッドを用いて、カラーピッカーで色が選択されたら、 **colorBg** （#ColorPickerの値を取得する）を実行するようにコードを書くと、最後の画像のように適当に選んだ色の、カラーコードが表示されました！

今後は背景色も、カラーピッカーで選ばれた色が反映されるように設定していく予定です。
基本的な内容が多いところかと思いますが、こういったところをちゃんと分かっていないと後々大変だと思うので、何度でも読み返してしっかり理解していきたいところです:writing_hand:
Who moved my cheese🧀『チーズはどこへ消えた』

<img width="210" src="https://m.media-amazon.com/images/I/81n0J1Opi7L._SY522_.jpg">

## 「チーズ」は古くなり消える
長年ベストセラーになっている「チーズはどこへ消えた」という本を読み、
私自身のチーズに気付くための良き視座を得た。

ここ数年において、「頑張る自分」や「勉強して成果を上げる、評価される自分」になることへ夢中になっていた。
しかし、息子が生まれたり、予期せぬ家庭内の問題が起きたり、、と
いままでのように努力にリソースを裂けない状態になり、私は大きな不安とフラストレーションを抱えるようになった。

幸いにも、私はこの本を読んだ。

それ（努力し認められる自分になること）が当時の私にとっての唯一のチーズ🧀だったと気づかされた。かつての理想も大事なことだったが、それは古くなりすでに手元から無くなったチーズだ。
だからこそ、新しい環境で、新しいステージに立ったならば、新しいチーズ🧀を探す旅にでる必要があった（まぁ、ただの散歩です）

はじめは足取りが重かったが、感じている事を外に吐き出すようによく踏み込んで歩いた。徐々に思いが整理されていき、ふと視界に入ってくる様々なことから気づくことがあった。それは私の生活をとり囲む「なくてはならない仕事」たちだった（タクシーやバス、道路整備、運送業、風呂屋、介護施設、飲食店＿＿＿）
私の周りには、ひとが誠実にこなす仕事による安心にあふれていたのだ。

私というシステムエンジニアは、部屋に籠って「楽にそこそこ稼げるからやる仕事」になりやすいポジションだった。

そうではなく、多くの人たちがそうであるように、私も「われわれの生活にとって、なくてはならない仕事」をするひとでありたいと強く感じた。またそういういい仕事（役割）を助けたいと思った。
足取りはすでに軽かるワクワクしていた。また、既になくてはならない存在だった家族に大きな感謝の想いが湧いてきた。

１冊の本により、多くの気づきに恵まれた１日となった。
明日はとある採用媒体の取材です＿＿＿

本日もお疲れ様でした


### 参考

https://amzn.asia/d/0iGcAt5o