OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング言語の名前の由来を分類してみた

# はじめに
プログラミング言語の歴史の動画を観ているうちに、プログラミング言語の名前の由来に興味を持ったので分類する記事を書いてみました。
[youtube: プログラミング言語の歴史【訂正版作成予定】](https://www.youtube.com/watch?v=jBksc8SdUF8)

# 分類結果
プログラミング言語の名前の由来を分類しました。複数の項目にまたがっている由来もあります。

| 分類　| 該当言語の例 |
|:-:|:-:|
| 既存技術  | C, C++, C#, JavaScript, TypeScript,  |
| 開発者の趣味や嗜好  | Python, Ruby  |
| 目的や特徴 | TypeScript, Swift, Go, PHP, HTML, CSS  |
| トレンドを意識  | JavaScript, COBOL  |
| 開発者や数学者への敬意 | Haskell, Pascal  |
| 比喩や象徴的な意味  | Perl, Lisp, Rust  |

# 分類1. 既存技術
C言語やJavaScriptなどは既存の技術や言語を改良・発展させたことを表現する名前が付けられています。

- C言語: 前身である「B言語」から進化したことを表し、アルファベット順で「C」と命名されました
- JavaScript: Javaの人気にあやかり、名前を借用

# 分類2. 開発者の趣味や嗜好
開発者の個人的な好みや文化的な背景から命名されています。親しみやすさやユーモアがありますね。

- Python: 開発者が好きだったコメディグループ「Monty Python」から命名
- Ruby: 6月の誕生石「真珠(Pearl)」に続く宝石の名前として7月の誕生石「ルビー(Ruby)」を採用

# 分類3: 目的や特徴
言語の設計意図や目的を名前に込めることで、特徴をストレートに表現しています。

- TypeScript: JavaScriptに型付け（Type）を導入したことを強調
- Swift: アマツバメをモチーフに「迅速な（Swift）」という意味で、パフォーマンスや簡便さをアピール
- PHP: 元々は「Personal Home Page Tools」の略でしたが、後に「PHP: Hypertext Preprocessor」と再帰的に命名されました。ウェブ開発への特化を反映
HTML: 「HyperText Markup Language」の略で、ハイパーテキストを記述するための言語であることをそのまま表現
CSS: 「Cascading Style Sheets」の略で、層構造（カスケード）を持つスタイル設定を強調

# 分類4: トレンドを意識
時代のトレンドやマーケティングを意識した戦略的な命名もあります。

- JavaScript: 当初は「LiveScript」でしたが、当時人気だったJavaにあやかり、「JavaScript」に改名されたそうです。
- COBOL: 「Common Business-Oriented Language」の略で、ビジネス用途向けであることを明確に

# 分類5: 開発者や数学者への敬意
技術や理論に貢献した人物や哲学者の名前が使われることもあります。
- Haskell: 数学者Haskell Curryに由来し、関数型言語への敬意を表明
- Pascal: 数学者で哲学者のブレーズ・パスカルにちなむ

# 分類6: 比喩や象徴的な意味
比喩や象徴的な概念を反映した名前もあります。

- Perl: 本来は「Pearl（真珠）」と名付けられる予定でしたが、すでに同名の言語があったため、「Perl」と変更
- Lisp: 「List Processing（リスト処理）」の略で、言語の特徴を象徴

# おわりに
色々な名前の由来があっておもしろいですね。
もし自分が新しいプログラミング言語をつけるとした、どんな名前にしますか？
2024年にSpring BootアプリケーションをAzure Database for MySQLで開発運用してみた奮闘記を振り返る

# ご挨拶
みなさまこんにちは。今年は一ミリもMySQLに仕事で触れないまま終わりますので、過去の[Spring BootアプリケーションをAzure Database for MySQLで開発運用してみた奮闘記
](https://qiita.com/zoosm3/items/4bcceefbd228bbecacc4) (以下奮闘記)を振り返ります。

こちらのサービスは2024年に良い知らせを受け取れましたし、MySQL 8.4も出たのでこちらを振り返り、事情が違う箇所だけ補足します。

## アプリケーションの仕様・方式を決める

### 2020年
MySQLは5.7を利用しました。

データ移行の都合上、データ移行が必要なため他システム(AWS RDS for MySQLでMySQL5.6)と統一したいが、MySQL 5.6は新規構築できない理由があったので5.7を使っていました。

### 2024年の課題と対処

MySQL 8.4がリリースされています。認証や文字コードなど考慮事項はありますが、もうできるだけMySQL 8.4を利用したほうが良いでしょう。どこかで勇気を出さないとMySQL 5.7からバージョンアップできなくなるでしょう。

奮闘記の時はデータ移行上の関係で絵文字をサポートしませんでしたが、今なら絵文字サポートもできます。UXや運営を鑑みて今後も絵文字サポートは不要という考え方もできますが、アプリケーションや文字入力の仕様調整と操作説明も必要です。

## プロキシ経由でMySQLに接続できるようにする

プロキシでMySQLやSSHが遮断され、開発者、運用者のPCから直接MySQLに接続できないため対応しました。

### 2020年
- 開発環境はPHPMyAdmin経由で接続
    - トラブル防止のため、本番環境ではPHPMyAdminは利用しないポリシーにしました
- 大規模な開発環境での作業、本番作業は踏み台のMySQL Workbenchから実施

としていました

### 2024年の課題
- PHPMyAdminはPHPアプリケーションなのでセキュリティ上配慮が必要です。基本的には使わないほうが良いと思いました
- MySQL Workbenchの8.4 LTS Releaseがない

### 2024年に考えられる対処

#### MySQL Shell for VS Codeを使う
ローカル開発であれば、MySQL Shell for VS Codeやその他のSQLクライアントを使えると思います。プロキシを通す場合は、踏み台経由でポートフォワーディングするなど考慮が必要かもしれません。

本番操作時にはミスを起こさないよう、GUIの利用は避けたほうが良いかもしれません。

#### クラウドの機能を使う
クラウドシェルや踏み台サービスを利用するの良いと思います。
開発チームもクラウドのアカウントやロールが必要になりますが、安全ではない踏み台を独自構築するよりは安全を取りましょう。

- AWS
    - Session Manager、EC2で踏み台を構築する
    - CloudShellを利用する
- Azure
    - Azure Linux仮想マシンで踏み台を構築する
    - Azure CLIを利用する


実は奮闘記当時も、Azure CLIを使ってAzure上でMySQLを操作しているチームがいました。シェルの得意なメンバーが多数いたからです。
https://learn.microsoft.com/ja-jp/azure/mysql/flexible-server/connect-azure-cli

一方で開発チームはプロダクトオーナーにSQLを打ってでも受け入れしてほしい場合があり、PHPMyAdminが便利という事情もありました。

いずれにしろ安全な方法で誰でもデータアクセスをしたいものです。

## 環境によって動かないSQLがあった

### 2020年
事情がありMySQLのインストールがチームによって統一できなくなり、sql_modeの不統一でSQLが動作しないなど混乱を生みました。

### 2024年の課題
MySQLに限らず、アプリケーション開発のバックエンドはDockerで用意するとローカル環境の構築方法のブレをなくせます。

Spring Boot 3を利用すると、Testcontainersと連携してバックエンドの構築が簡単になります。バックエンド以外にモックサーバなど必要なサービスを簡単にDockerで動かせます。構築方法を統一できるので採用したほうが良かったです。

# まとめ
奮闘記作成当初からは
- MySQL 8.4リリースに伴う変更
- ローカル開発環境構築方法の課題

がありました。
それ以外はMySQLバージョン依存しない課題解決なので、奮闘記の内容は今でも作者は違和感ありませんでした。

最後まで読んでいただきありがとうございました。
良い冬をお過ごしくださいませ🐬
roo-clineで Pluralith のセットアップをやってみた

## はじめに

Terraformのインフラストラクチャを可視化するツールPluralithのセットアップを、roo-clineのサポートを受けながら行ってみました。公式サイトの手順だけでは発生するエラーへの対応も含めて、実際のセットアップ過程を共有します。

## 生成画像

https://github.com/Sunwood-ai-labs/AMATERASU/tree/develop/spellbook/base-infrastructure

## 公式手順の概要

Pluralithの公式サイトでは、以下の手順が案内されています：

1. CLIのダウンロードとインストール
   - バイナリをダウンロード
   - パスを通す
   - 実行権限を付与

2. ログイン設定
   ```bash
   pluralith login --api-key $PLURALITH_API_KEY
   ```

3. ダイアグラム生成
   ```bash
   pluralith graph
   ```

## 実際のセットアップと発生したエラー

ダウンロードしたバイナリを以下のパスに配置しました：
```
/home/maki/prj/AMATERASU/pluralith_cli_graphing_linux_amd64_0.2.1
```

しかし、`pluralith graph`コマンドを実行すると以下のエラーが発生：
```bash
generating diagram failed -> GenerateGraph: running CLI command failed -> 
GenerateDiagram: fork/exec /home/maki/Pluralith/bin/pluralith-cli-graphing: no such file or directory
```

## roo-clineによる自動化対応

### 1. エラー分析とソリューション提案

roo-clineは以下の問題を特定しました：
- バイナリの配置パスが不適切
- 期待されるパス: `/home/maki/Pluralith/bin/pluralith-cli-graphing`
- 実際のパス: `/home/maki/prj/AMATERASU/pluralith_cli_graphing_linux_amd64_0.2.1`

### 2. 自動実行されたコマンド

```bash
# ディレクトリ作成、ファイル移動、権限付与を一括実行
mkdir -p ~/Pluralith/bin && \
cp pluralith_cli_graphing_linux_amd64_0.2.1 ~/Pluralith/bin/pluralith-cli-graphing && \
chmod +x ~/Pluralith/bin/pluralith-cli-graphing
```

### 3. 動作確認

```bash
cd spellbook/base-infrastructure && pluralith graph
```

## セットアップ完了と確認

roo-clineの支援により、以下の項目が正常に完了：

✅ 認証成功
✅ ローカルプラン生成
✅ ダイアグラム生成
✅ Pluralithダッシュボードへのアップロード

生成されたダイアグラムは以下のURLで確認可能：
https://github.com/Sunwood-ai-labs/AMATERASU/tree/develop/spellbook/base-infrastructure

## まとめ

公式ドキュメントだけでは対応が難しいエラーも、roo-clineのサポートにより効率的に解決できました。具体的には：

1. バイナリの適切な配置
2. 実行権限の付与
3. 正しいディレクトリ構造の作成

が自動的に実行され、スムーズなセットアップが完了しました。
Roo-Clineの会話履歴の保存場所をRoo-Clineで探ってみた！

## はじめに

Roo-Clineを使用していると、過去の会話を振り返りたい場合があります。今回は、Roo-Clineに会話履歴の保存場所を直接尋ねてみました。その結果、Roo-Clineがどのように自動で探索を行い、答えを導き出したのか、その詳細なプロセスを解説します。

## プロンプトとRoo-Clineの自動処理内容

### 入力したプロンプト
```bash
roo-cline の会話履歴はどこにあるの？？
```

### Roo-Clineの自動処理ステップ

1. 初期アプローチ - historyディレクトリの探索
```bash
ls -la /home/maki/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/history
```
- 結果：`No such file or directory`
- 自動判断：直接的なhistoryディレクトリは存在しないと判断し、次のステップへ

2. ベースディレクトリの確認
```bash
ls -la /home/maki/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/
```
- 結果：`total 20`と基本情報を取得
- 自動判断：ディレクトリは存在するが、詳細な内容の確認が必要と判断

3. ディレクトリ内容の詳細確認
```bash
ls -la /home/maki/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/*
```
- 結果：cacheディレクトリの存在を確認
- 自動判断：さらなる探索が必要と判断

4. キャッシュディレクトリの確認
```bash
ls -la /home/maki/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/cache/
```
- 結果：`total 136`
- 自動判断：他のディレクトリも確認する必要があると判断

5. settingsディレクトリの確認
```bash
ls -la /home/maki/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/settings/
```
- 自動判断：設定ファイルの存在を確認するも、履歴情報は見つからず

6. 完全なファイル探索の実行
```bash
find /home/maki/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/ -type f
```
- 結果：以下のファイル構造を発見
```bash
cache/openrouter_models.json
settings/cline_mcp_settings.json
tasks/[タイムスタンプ]/ui_messages.json
tasks/[タイムスタンプ]/api_conversation_history.json
```
- 自動判断：会話履歴の保存場所を特定

7. 最新の会話履歴の確認
履歴ファイルの内容を確認して、正しく会話が記録されていることを検証

## 発見された結果

Roo-Clineは会話履歴を以下のように管理していることが判明：

1. 保存場所:
```bash
/home/maki/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/tasks/
```

2. ファイル構造:
- `api_conversation_history.json`: API通信の詳細な履歴
- `ui_messages.json`: ユーザーインターフェースでの表示履歴

3. 保存形式:
- タイムスタンプ付きのフォルダで各会話を分類
- JSONフォーマットで構造化されたデータとして保存

## Roo-Clineの特徴的な動作

1. 段階的探索アプローチ
   - 最も可能性の高い場所から探索を開始
   - 見つからない場合は範囲を広げて探索
   - 最終的に網羅的な検索を実行

2. 自動エラーハンドリング
   - 存在しないディレクトリへのアクセス時も適切に対応
   - 次の探索ステップを自動的に判断

3. 効率的な情報収集
   - 必要最小限のコマンドで情報を収集
   - 結果を論理的に解析して次のアクションを決定

## まとめ

たった1行のシンプルなプロンプトから、Roo-Clineは:
- 6つの異なるコマンドを自動実行
- 階層的な探索を実施
- 正確な情報を特定

という処理を自動的に行い、会話履歴の保存場所を特定しました。この例は、Roo-Clineが人間のような論理的な探索プロセスを自動化できることを示しています。
Roo-ClineでAWS Session Managerのセットアップをしてみた！

## はじめに

Roo-Clineは、AIによるコーディング支援を自動化するツールです。今回は、AWS CLIのSession Managerプラグインのインストールをプロンプト1つで自動化する方法を紹介します。

## 実行環境

- OS: Ubuntu
- Roo-Cline: 最新版

## プロンプトと実行結果

### 入力したプロンプト
```bash
aws の セッションマネージャーもインストールして
```

### Roo-Clineの応答と実行プロセス

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">Roo-ClineでAWS Session Managerのセットアップをしてみた！<br>これならAWS系の設定系マジで楽！！ <a href="https://t.co/5KY2cPj5Wt">pic.twitter.com/5KY2cPj5Wt</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1870807802857591237?ref_src=twsrc%5Etfw">December 22, 2024</a></blockquote> 

1. まず、Roo-Clineはタスクを分析：
```bash
AWSのSession Managerをインストールするタスクを実行します。
Session Managerはシステム管理者がAWSのEC2インスタンスに安全にアクセスするためのツールです。
```

2. Session Managerプラグインのダウンロード実行：
```bash
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
```

3. ダウンロード完了後、インストール実行：
```bash
sudo dpkg -i session-manager-plugin.deb
```

インストール出力:
```bash
Selecting previously unselected package session-manager-plugin.
Preparing to unpack session-manager-plugin.deb ...
Preparing for install
Unpacking session-manager-plugin (1.2.694.0-1) ...
Setting up session-manager-plugin (1.2.694.0-1) ...
Creating symbolic link for session-manager-plugin
```

4. インストール確認のためのバージョンチェック：
```bash
session-manager-plugin --version
```

5. .gitignoreの更新：
- `.deb`ファイルと`.zip`ファイルを除外リストに追加
- コミットメッセージ: "📝 docs: .gitignoreにsession-manager-plugin.debを追加"

## Roo-Clineの優れた点

1. **自動タスク分析**
   - タスクの内容を理解し、必要なステップを自動で特定
   - インストール前の環境チェック実施

2. **エラーハンドリング**
   - インストール後の動作確認を自動実行
   - バージョン確認によるインストール検証

3. **バージョン管理への対応**
   - .gitignoreの自動更新
   - 適切なコミットメッセージの生成

## まとめ

たった1行のプロンプトで、Roo-Clineは：
- Session Managerのダウンロードとインストール
- インストール確認
- バージョン管理の設定
を自動で実行しました。

この例が示すように、Roo-Clineを使用することで、開発環境のセットアップやツールのインストールを効率的に自動化できます。

## 参考リンク

- [AWS Session Manager Documentation](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)
- [Roo-Clineのドキュメント](https://github.com/RooVetGit/Roo-Cline)

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
動体検知カメラで行った終夜テストのMQTTデータを可視化する


# 終夜テスト
アナログ電波時計の針が夜更けに勝手にくるくる回る怪現象が起こっているとの報告。
原因を探る前にまずは現象を把握するためのデータを揃えたいのですが夜中は寝てる。ESP32-CAMのカメラで動体検知してMQTTデータを送信。可視化ツールでグラフ化して何時ごろに動きがあるのか／動く条件はあるのか探る仕組みを作ります。
![aaaaaaaaaaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/47c9d2c2-525f-c9d4-dbbf-ebfc8e238d35.jpeg)
![IMG_8049.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/dcff02cd-a523-b101-19a3-0c330737eb98.jpeg)

## システム構成
・動体検知カメラ  ・・・ ESP32-CAM
・データ可視化用 MQTTクライアントアプリ　・・・　MQTT Explorer
・MQTT ブローカーサービス ・・・ mqtt.eclipseprojects.io または test.mosquitto.org

## 動体検知カメラ
まずは、以下の記事に従ってデバイスを準備した後、MQTT送信の設定を追加します
【デバイス準備】

https://qiita.com/nfukuoka/items/bc01b1ffddf00cb14f8e

【MQTT送信の設定】
ESP32-CAM内のWebサーバに入ります。ここで設定していきます
![motionsens03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/6e022f4b-3bed-a042-4efe-5c30ff4aadd8.png)

configuration -> MQTT で、 MQTT parametersに以下の項目を設定してSaveします
・Host ・・・　MQTTブローカーを指定  例: mqtt.eclipseprojects.io
・Topic ・・・ 可視化ツールで絞込むための文字列　例: motionsens_%06X
![mqtt_param.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/15af6109-7537-eca5-e319-50d742d471f1.png)

以上でMQTT送信の設定は完了です。
動体検知しMQTT送信すると以下のようなMQTログが出ます。
```
02:25:50.837 MQT: Attempting connection...
02:25:51.278 MQT: Connected
    :
02:25:55.882 MQT: tele/motionsens_A9A038/SENSOR = {"Time":"2024-12-22T02:25:55","CamMotion":{"Detect":0}}
02:30:00.090 MQT: tele/motionsens_A9A038/SENSOR2 = {"Time":"2024-12-22T02:30:00","CamMotion":{"Detect":0}}
02:40:00.090 MQT: tele/motionsens_A9A038/SENSOR2 = {"Time":"2024-12-22T02:40:00","CamMotion":{"Detect":25}}
```
## MQTTクライアントアプリ
可視化するためのアプリは MQTT Explorerを使います。以下のサイトからダウンロードしてインストールしMQTTブローカーを指定すれば完了です

https://mqtt-explorer.com/

・Host ・・・　MQTTブローカーを指定  例: mqtt.eclipseprojects.io
![mqttex01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/f67e2a7a-d7ec-41a3-661b-e357c35b323f.png)

自分のMQTTデータを検索
![mqttex02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/41912bf0-42cb-8505-64e9-68134013c7f0.png)
topicはSENSOR2を選んで、Valueに表示されているデータ名: Detect の ～マーク を押せばグラフが出ます
![mqttex03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/74f9b03c-bc6b-1c11-dc3e-1ec7b17015ae.png)

## 動作確認
ESP32-CAMは、2秒間隔でカメラの画像をチェックして動くものを検出します。検出データは10分毎に集計してMQTTでpublishします。

　http://＜ESP32-CAMのipアドレス＞:81/diff.mjpeg で画像の変化点を確認できます。
【時計の長針が動くものとして検出されている例】
![bbbbb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/ac5e3d3f-24cf-3857-5702-dba79177e383.png)

時計がぐるぐる回っている時間帯はグラフのDetectが0ではなくなる。日中電波が途切れている／いない等、いろいろバリエーションを試して電波受信時間帯の絞り込みや動作の把握をしようと思う。
![zzzzzzz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/44a684a2-9eec-efc0-e31c-28ca91d564c0.png)
23:00、1:00に受信。大きく針が動くのは時計を戻す場合です
![2h-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6824/8a201529-8ffe-6aa6-9fd1-695468e5151a.png)
昼夜問わず2時間毎に電波受信し時刻補正する模様です

終了
## 参考
【WEBCAM_V2】 = https://github.com/btsimonh/TasmotaBerryPLay/blob/master/tasdocs/esp32cam.md
【Tasmota】 = https://tasmota.github.io/docs/
内部結合、外部結合について

# はじめに
みなさん、初めまして。DevToxicClubに所属している@72_mikanです。
普段はJavaエンジニア1年目として自身の無能さを痛感しながら働いております。

今回は、働いていてSQLを良く扱うのですが、働き始める前は簡単なことしかやってこず、外部結合と内部結合で頭が混乱したのでそちらについて自身の学習目的でまとめようかと考えています。(かなりしょぼい内容になります)

# 結合データ
```
EMPLOYYテーブル
EMPLOYEE_ID  | NAME     | POSITION_ID
-------------------------------------------------
          1  | TARO     | 1
          2  | JIRO     | 3
          3  | SAORO    | 4
```

```
POSITIONテーブル
POSITION_ID     | NAME
-------------------------------------------------
1               | 営業部
2               | 開発部
3               | 経理部
```

# 内部結合
内部結合は結合する二つのテーブルで結合条件が一致したレコードのみを結合してくれます。
例えば、上記のテーブルで役所についている社員だけ情報を取り出したいときに使います。
SQL文は以下
```
SELECT * FROM EMPLOYEE AS emp
INNER JOIN POSITION AS pos
ON emp.POSITION_ID = pos.POSITION_ID
```
これで、出力される結果が以下
```
EMPLOYEE_ID  | emp.NAME     | POSITION_ID  |pos.NAME
-------------------------------------------------
          1  | TARO         | 1            | 営業部
          2  | JIRO         | 3            | 経理部
```
# 左外部結合
左外部結合は内部結合とは異なり、結合条件で一致しないレコードに対しては
SQL文は以下
```
SELECT * FROM EMPLOYEE AS emp
LEFT OUTER JOIN POSITION AS pos
ON emp.POSITION_ID = pos.POSITION_ID
```
これで、出力される結果が以下
```
EMPLOYEE_ID  | emp.NAME     | POSITION_ID  | pos.NAME
-------------------------------------------------
          1  | TARO         | 1            | 営業部
          2  | JIRO         | 3            | 経理部
          3  | SAORO        | 4            | null
```

# 右外部結合
SQL文は以下
```
SELECT * FROM EMPLOYEE AS emp
RIGHT OUTER JOIN POSITION AS pos
ON emp.POSITION_ID = pos.POSITION_ID
```
これで、出力される結果が以下
```
POSITION_ID     | NAME      | 
-------------------------------------------------
1               | 営業部  　 | 
2               | 開発部  　 | 
3               | 経理部  　 | 
```

# まとめ
実際、新人が実務でよく使うのは左外部結合、次に内部結合になるかと思います。
そのため、まずは、左外部結合と内部結合の違いを理解しておけばとりあえずは業務では困らないかと思います。
他にも完全会部結合、交差結合があるが現状実務で使ったことがないので今回まとめてません。(そのうちまとめるかも、、、)
Roo-Clineで簡単AWS CLIセットアップ！たった1行のプロンプトで自動化 🚀

## はじめに

AWS CLIのセットアップ、手順書を見ながら1つ1つコマンドを実行するのは面倒ですよね。今回は、Roo-Clineを使って、たった1行のプロンプトでAWS CLIを自動セットアップする方法をご紹介します！

## プロンプトと実行結果

### 入力したプロンプト
```plaintext
aws cli をインストールして
```

### Roo-Clineの応答と実行プロセス

1. まず、Roo-Clineはタスクを分析し、以下のような計画を立てました：
```plaintext
AWS CLIのインストールを行うために、以下のステップを実行する必要があります：

1. まずcurlコマンドでAWS CLIのインストーラーをダウンロード
2. ダウンロードしたzipファイルを解凍
3. インストールスクリプトを実行
4. インストールの確認
```

2. 自動的に必要なコマンドを実行：
```bash
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && unzip awscliv2.zip && sudo ./aws/install
```

3. インストール確認のために自動的にバージョン確認を実行：
```bash
aws --version
```

4. クリーンアップ処理の実行：
```bash
rm -rf aws awscliv2.zip
```

## Roo-Clineの優れた点

1. **インテリジェントなタスク分析**
   - 必要な手順を自動的に特定
   - 最適な実行順序を決定
   - 依存関係の自動解決

2. **効率的なコマンド実行**
   - 複数コマンドの連結実行
   - インストール確認の自動実施
   - クリーンアップの自動化

3. **エラーハンドリング**
   - インストール失敗時の自動検知
   - 適切なエラーメッセージの表示
   - 中間状態のクリーンアップ

## プロンプトのポイント

このプロンプトが効果的だった理由：

1. **シンプルな指示**
   - 「aws cli をインストールして」という簡潔な指示
   - 余計な説明を省略
   - 自然な日本語で記述

2. **必要十分な情報**
   - インストールしたいツールを明確に指定
   - 実行環境は自動認識
   - オプションは必要に応じて追加可能

## 実行結果の解説

Roo-Clineは以下の作業を自動的に完了しました：

1. **インストーラーのダウンロードと解凍**
   - curlコマンドでインストーラーを取得
   - zipファイルの自動解凍

2. **インストールの実行**
   - sudo権限での適切なインストール
   - システム全体での利用設定

3. **インストール確認**
   - バージョン確認による動作テスト
   - 正常インストールの確認

4. **後処理**
   - 不要ファイルの自動削除
   - 作業ディレクトリのクリーンアップ

## まとめ

たった1行のプロンプトで、Roo-Clineは：
- AWS CLIのダウンロード
- インストール実行
- 動作確認
- クリーンアップ
という一連の作業を自動的に完了しました。

これにより：
- セットアップ時間の大幅短縮
- 人的ミスの防止
- 一貫性のある環境構築
が実現できました。

## 参考リンク

- [Roo-Cline公式リポジトリ](https://github.com/RooVetGit/Roo-Cline)
- [AWS CLI公式ドキュメント](https://aws.amazon.com/cli/)

次回は「Roo-Clineで実践！AWSリソース作成の自動化」をお届けする予定です。お楽しみに！
Neovimのpyrightに仮想環境を認識させる3つの方法


NeovimでPython開発を行う際、LSPとしてpyrightを使用している方も多いと思います。
しかし、プロジェクトごとに仮想環境を設定している場合、pyrightがその仮想環境を正しく認識しないことがあります。

本記事では、その問題を解決するための3つの方法を紹介します。

### 前提

私は普段[uv](https://github.com/astral-sh/uv)を使ってプロジェクトを管理しています。
uvではvenvを使用して仮想環境が作られるので、venvを使用しているなら、本記事で紹介する方法が使えると思います。

また、Neovimの設定は[kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim)を参考しており、luaで記述しています。
LSPに関連するプラグインとして、以下のものを使用しています。

- neovim/nvim-lspconfig
- williamboman/mason.nvim
- williamboman/mason-lspconfig.nvim
- WhoIsSethDaniel/mason-tool-installer.nvim

Neovimの設定ファイルが、この環境を前提として書いている点にご注意ください。

# 1. 仮想環境に入ってからNeovimを起動する

仮想環境をアクティブにした後でNeovimを起動します。
特に設定をしていない状態のpyrightは、Neovim起動時に現在の```python```コマンドで呼び出す環境を認識します。
これだけで正常に仮想環境を認識します。

Ubuntuの場合

```sh
source .venv/bin/activate
```

Windowsの場合

```sh
.venv/Scripts/activate
```

その後、以下のコマンドでNeovimを起動します。

```sh
nvim
```

# 2. pyright用の設定ファイルを用意する

pyrightのドキュメント[(Configuration)](https://microsoft.github.io/pyright/#/configuration)によると、pyrightが読み込む設定ファイルとして以下の2種類があります。

- pyrightconfig.json
- pyproject.toml

どちらかのファイルをプロジェクトのルートフォルダに作成してください。
それぞれの記述例を以下に示します。ちなみに例はプロジェクトルートから見た相対パスを記述しています。(nvim-lspconfigがプロジェクトルートを探してくれる)

### pyrightconfig.json

設定項目として、venvPathに仮想環境のディレクトリがあるパス、venvに仮想環境のディレクトリ名を記述します。

```json
{
  "venvPath": ".",
  "venv": ".venv"
}
```

### pyproject.toml

pyrightconfig.jsonと同様の内容を記述します。uvでプロジェクト管理している場合、すでにpyproject.tomlが存在しているため、以下を追記するだけで済みます。

```toml
[tool.pyright]
venvPath = "."
venv = ".venv"
```

ついでに型チェックの設定なども含めれば、再利用性が高まります。

# 3. nvim-lspconfigの設定でpythonPathを指定する

サーバーのセッティングで```pythonPath```を指定するという方法もあります。ドキュメントの[Language Server Settings](https://microsoft.github.io/pyright/#/settings)に設定項目があります。
こちらはNeovimの設定ファイル内のnvim-lspconfigの設定で直接指定できます。

以下はUbuntuを例にした記述例です。

```lua
require"lspconfig".pyright.setup{
  settings = {
    python = {
      pythonPath = '.venv/bin/python', -- Windowsなら .venv/Scripts/python.exe
    }
  }
}
```

私は[kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim)を参考にしているため、init.lua内のservers変数に以下のように追記しています。

```lua
local servers = {
  pyright = {
    settings = {
      python = { pythonPath = '.venv/bin/python' },
    },
  },
  -- 以下はその他のサーバーの設定
}
```

# 終わりに

私はプロジェクト毎にファイルを用意するのが面倒なので、3の方法を採用しています。LSPによる補完がスムーズに動作し、すごく便利です。

あまり情報がまとまったサイトが見つからなくて困ったので、同じような方の助けになれば幸いです。
フェルマーのクリスマス定理

こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz :frog: です。

## はじめに
クリスマスシーズンで街が煌めいていますので、本稿はクリスマスにちなんだエントリーにしたいと思います。


## フェルマーのクリスマス定理
1640年12月25日にフェルマーがメルセンヌに対して送った手紙に証明できたと書かれていたと言われ『フェルマーのクリスマス定理』という別名を持つ定理について取り上げてみます。この定理もフェルマーらしく（？）証明は公開されずに、後にレオンハルト・オイラーが最初に証明を与えたというものです。最近では、2011年にドイツの数学者ドン・ベルナルト・ザギエによって “One-Sentence Proof” として証明を与えたというのもこの定理が奥深い定理なんだと思います。（“One-Sentence Proof” の詳細は脚注のブログが詳しい[^one-sentence]）

:::note info
<dl><dt>
フェルマーのクリスマス定理（二平方和定理）
</dt><dd>
4で割って1余る素数は必ず2つの平方数の和で一意的に表すことができる。
</dd></dl>
:::

詳しい証明は、[マスオ](https://manabitimes.jp/supervisors/1)さんらが運営している『高校数学の美しい物語』に掲載されております。

https://manabitimes.jp/math/844

4で割って1余る素数は、この性質があるため『ピタゴラス素数』と呼ばれております。（:frog:の過去記事[^Pythagorean-prime]を参照ください）


## ランダウ・ラマヌジャンの定数
ピタゴラス素数は、必ず2つの平方数の和で表せますが、自然数 $n$ が2つの平方数の和で表されるかを知るのにもこの定理が役立ちます。自然数 $n$ を素因数分解して、$p\equiv 3 \pmod 4$の形の素因数を平方以外の形で持つ場合は、二個の平方数の和で表されることはない、ということが示せます。（Wikipediaを参照[^wiki]）。
これに関連して、ランダウとラマヌジャンが次の事実を独立して発見しました。

:::note info
十分に大きい $x$ に対して、$x$ 以下の自然数のうち、2つの平方数の和で表されるものの割合は漸近的に次のように比例する。
$\displaystyle \frac{bx}{\sqrt{\log{x}}}$
この比例定数 $b$ を『ランダウ・ラマヌジャンの定数』といいます。
:::

このランダウ・ラマヌジャンの定数の小数点以下の数は、オンライン整数列大辞典の[A064533](https://oeis.org/A064533)に記載があります。以下に書き写しておきます。

$
b \approx 0.
7642236535892206629906987312500923281167
9054139340951472168667374961464165873285
8838401505013131233721937269120792592634
1874206467808432306331543462938053160517
1169636177508819961243824994277683469051
62351392187196205690532956446704 \dots
$

このことから、2つの平方数の和で表されない数が存在しますが、それでは全ての自然数は幾つの平方数の和で表されるのかという問いに興味が湧きます。勿論、その問いについても次のような定理が知られています。

### 三個の平方数の和
Wikipediaにも[三個の平方数の和](https://ja.wikipedia.org/wiki/%E4%B8%89%E5%80%8B%E3%81%AE%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%AE%E5%92%8C)の項があります。Wikipediaによると、

:::note info
自然数 $N$ が三個の平方数の和で表されるための必要十分条件は、$ n \ge 0, k \ge 0, a \in \\{1,2,3,5,6\\} $ として、$ N=4^{n}(8k+a) $ で表される。
:::

この逆に、$ N=4^{n}(8k+7) $ で表される自然数は三個の平方数の和で表されません。

### ラグランジュの四平方定理
そこで次の定理が成り立ちます。証明はWikipediaの『[四平方定理](https://ja.wikipedia.org/wiki/%E5%9B%9B%E5%B9%B3%E6%96%B9%E5%AE%9A%E7%90%86)』に記述がありますのでご確認ください。

:::note info
全ての自然数は、高々四個の平方数の和で表される
:::

そしてこの平方数の和で表す方法の個数に対する定理が『[ヤコビの四平方定理](https://ja.wikipedia.org/wiki/%E3%83%A4%E3%82%B3%E3%83%93%E3%81%AE%E5%9B%9B%E5%B9%B3%E6%96%B9%E5%AE%9A%E7%90%86)』として知られています。この定理は、ヤコビにより楕円関数論で証明されたそうです。整数論から楕円関数論に論理が展開するのは、数学の面白いところだと思います。

## おわりに
いかがでしたでしょうか。本稿では、プログラムの紹介もなく [mathlog](https://mathlog.info/) に寄稿するべき内容なのかもしれません。

できれば、ランダウ・ラマヌジャンの定数を求めるプログラムを紹介したかったですが、論文を当たる必要もあって難易度が高く、 :frog: は俄かに挫折しました。[PARI/GPのプログラム例が紹介されたサイト](https://www.dei.unipd.it/~languasco/CLM.html)もあります。PARI/GPに興味があり、試せる環境がある方はお試しください。

**ご一読いただきまして有り難うございます。**

（●）（●） Happy Hacking!
/""　＿＿""＼

May all your Christmas wishes come true!

[^one-sentence]: [4で割って1余る素数が2つの平方数で表されることの“一文証明”](https://note.com/math_wakara/n/n9616eb3e8a6d)
[^Pythagorean-prime]: [ピタゴラス素数とチェビシェフの偏り](https://qiita.com/kyamaz/items/7c07ae7a995a6d42d025)
[^wiki]: [Wikipedia：二個の平方数の和](https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%80%8B%E3%81%AE%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%AE%E5%92%8C)
2.7inch e-Paper V2用の制御プログラムをGo言語で書くには

# 概要
以前2.7 inch e-PaperのプログラムGo言語で作る方法を記載したがこれは、2.7 inch e-Paper(b) V1用である可能性がある
https://qiita.com/karosuwindam/items/dd5a781ce49d9473c7e7

そのために、一応作成方法について記載する

# ベース資料について
以下URLの情報が非常に参考になった。
* 公式サイト
    * https://www.waveshare.com/wiki/2.7inch_e-Paper_HAT_Manual#Resources
* 公式プログラムのGitリポジトリ
    * https://github.com/waveshareteam/e-Paper
* 2,13 V2用のGo言語driver
    * https://github.com/bestbug456/epaper
* 2.7用のGo言語driver
    * https://github.com/otaviokr/go-epaper-lib


# 実際の作業について
2.13 V2用のプログラムをベースに作成したがまずリポジトリが現時点では参照できないので以下の通りにv3に置きかえる必要がある。

```golang
import (
	"periph.io/x/conn/v3/gpio"
	"periph.io/x/conn/v3/gpio/gpioreg"
	"periph.io/x/conn/v3/physic"
	"periph.io/x/conn/v3/spi"
	"periph.io/x/conn/v3/spi/spireg"
	"periph.io/x/host/v3"
)
```
他には、2.7inchの場合は、176x264のためサイズを変更させる必要がある

初期化実行時の処理は、公式プログラムのpythonの書き方を参考に以下の順番を実行する
1. ハードウェアリセット
1. ソフトウェアリセット
1. Y-RAMの開始と終わりのポジションを0と264に設定
1. Y-RAMのカウント数を0に設定
1. data entry modeを設定

実際にコードを変更する場合は以下の通りにする。
```golang
func (e *Epd) Init() {
	//EPD hardware init start
	e.reset()
	e.readBusy()

	//SWRESET
	e.executeCommandAndLog(0x12, "SOFT_RESET", nil)
	e.readBusy()

	// set Ram-Y address start/end position s=0 e=264
	e.executeCommandAndLog(0x45, "SET_Y-RAM_START_END_POSITION", []byte{0x00, 0x00, 0x07, 0x01})

	// set RAM y address count to 0
	e.executeCommandAndLog(0x4F, "SET Y-RAM COUNT TO", []byte{0x00, 0x00})

	//data entry mode
	e.executeCommandAndLog(0x11, "DATA_ENTRY_MODE", []byte{0x03})

	slog.Debug("INIT DONE")
	time.Sleep(100 * time.Millisecond)
}
```

ディスプレイターンONの処理は以下の通り0xF7を書き込むように変更
```golang
// TurnDisplayOn turn the epd on
func (e *Epd) TurnDisplayOn() {
	e.sendCommand(0x22)
	e.sendData(0xF7)
	e.sendCommand(0x20)
	e.readBusy()
}
```

ディプレイを白く塗りつぶすクリア処理は以下の通りoffからonに変更する。
```golang
func (e *Epd) Clear() {
	lineWidth := e.Width / 8
	if e.Width%8 != 0 {
		lineWidth++
	}
	e.sendCommand(0x24)
	for i := 0; i < e.Height; i++ {
		for j := 0; j < lineWidth; j++ {
			e.sendData(0xFF)
		}
	}
	e.TurnDisplayOn()
}
```

もし、全て黒にする処理は以下の通り書けば実行できる。
```golang
func (e *Epd) Black() {
	lineWidth := e.Width / 8
	if e.Width%8 != 0 {
		lineWidth++
	}
	e.sendCommand(e.StartTransmission)
	for i := 0; i < e.Height; i++ {
		for j := 0; j < lineWidth; j++ {
			e.sendData(0x00)
		}
	}
	e.TurnDisplayOn()

}
```

あとの注意点として、TurnDisplayOnを実行したあとは、3秒ぐらい待つと次の書き込みは失敗しない


## プログラムのテスト
自分は、以下の通りのテストコードを書いて動作テストを実施した
```golang
func TestEPaper(t *testing.T) {
	e := CreateEpd()
	if err := e.Open(); err != nil {
		t.Fatalf("open error %v", err.Error())
	}
	defer e.Close()
	defer e.Clear()
	e.Init()
	e.Clear()
	time.Sleep(3 * time.Second)
 	fmt.Printf("Display\n")
	e.Black()
	fmt.Printf("sleeping\n")
	time.Sleep(3 * time.Second)
```
MarkdownAI--日常的に使いそうな単語帳--


# 単語帳の罠
学生の時、本屋さんで絶対単語覚えるぞ！と思い単語帳を買ったことある方。
その本、最後までやり遂げましたか？
その単語帳の文章、日常的に使いますか？


```
あなたも日本人です　　　你也是日本人

あなたはKENさんです　　　你的名字是 KEN　　
```
初期の時よく出てくるこの文章、今後使います？
日常で使ったら知ってるわってなります😂


## MarkdownAI で単語帳作りました

※Youtube動画です。　音量に注意してください
[![YouTube動画](https://img.youtube.com/vi/UdhLW5GdJzo/hqdefault.jpg)](https://youtube.com/shorts/UdhLW5GdJzo?feature=share)



https://mdown.ai/content/cbaf95e7-c7ca-4782-9694-f3676b2c9d88


気になるシチュエーションを検索したら、それに関する日常的な単語が出てくる単語帳を作成しました！！

![スクリーンショット 2024-12-14 14.52.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/d60221db-1bb7-02a7-7477-132cdedfad0a.png)


▼ChatGPTに与えるプロンプト
```

「次の条件に従って中国語の短文を生成してください。出力はタブ区切りで行い、各行に以下の情報を含めること：**

中国語: 3語から4語の短文。句読点（「。」「？」「！」など）は含めないこと。
ピン音: 上記中国語短文の発音を横に書くこと。
日本語訳: 中国語短文の日本語訳を横に書くこと。
出力形式例：

你好	ni hao	こんにちは
我喜欢学习	wo xi huan xue xi	私は勉強が好きです
この形式でキーワードが入力されるのでそれに適した30個の短文を生成してください。」


```

:::note warn
・たまに、生成されない箇所があり
・30問でない可能性あり
・検索結果が出てくるまでの速度は遅い
:::

## おしゃれポイント

クリックすると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/d17f9bd5-3453-9cf4-4288-b86293660a41.png" width=30%>

↓
ちゃんと沈む
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/1883a407-ab21-5112-7117-c0ae76b0ad15.png" width=30%>


## 最後に
今回、初めて使ったのですがとても勉強になりました
無料でいろいろなAIを使えるとはいいところですね〜
もし、好評だったら全体コードを共有しようと思っています。
今回MarkdownAIを個人で行いましたが、本番のWEBアプリ作成する前に、チームの全体イメージを統一するのに使えそうです✨
PlaywrightとF#でブラウザ自動化

# 意図

- PlaywrightとF#の組み合わせは便利なのにあまり見かけないのでサンプルとして
  - 静的型、VerUp時に楽(JS/TSが大変と言うべきかも)、VSCode+Ionideが強力
  - JS/TS、Pythonのコードを忘れたころに直そうとすると大変だが、F#だと少しマシな気がする
- query式、ClosedXML(Excel)、PdfSharpCore(PDF)と組み合わせるとある種の事務作業を楽できる


# コード 

- 実行方法
  - `dotnet fsi sample.fsx`
- 実行するとEdgeが(表で)起動してGoogleで"playwright dotnet"を検索してPDFに保存する


```fsharp: sample.fsx
#r "nuget: Microsoft.Playwright"

open Microsoft.Playwright
open System.Threading.Tasks


let createBrowser () =
    let option = BrowserTypeLaunchOptions(Headless = false, Channel = "msedge")

    task {
        let! web = Playwright.CreateAsync()
        let! browser = web.Chromium.LaunchAsync option
        let! context = browser.NewContextAsync()
        context.SetDefaultTimeout(1f * 1000f)
        let! page = context.NewPageAsync()

        return
            {| web = web
               browser = browser
               context = context
               page = page |}
    }

let waitAnySelector (page: IPage) (selectors: string seq) =
    let locators =
        seq {
            for sel in selectors do
                page.Locator(sel)
        }
        |> Seq.toArray

    let waitingTasks =
        seq {
            for loc in locators do
                loc.WaitForAsync()
        }
        |> Seq.toArray

    task {
        try
            let! _ = Task.WhenAny(waitingTasks)
            let pred (task: Task) = task.IsCompletedSuccessfully
            let index = Seq.findIndex (pred) waitingTasks
            return Ok <| locators[index]
        with _ as ex ->
            return Error ex
    }



let main () =
    let tsk =
        task {
            let! br = createBrowser ()
            let _web = br.web
            let page = br.page
            let url = "https://google.com"
            let! _ = page.GotoAsync url

            try
                printfn "□タイムアウト例外捕捉"
                let! _loc = page.WaitForSelectorAsync("マッチせずタイムアウトするようなパターン")
                printfn "unreachable"
            with
            | :? System.TimeoutException -> printfn "try-with: Timeout"
            | _ as ex -> printfn "try-with: %A" ex.Message

            printfn "□フォームの入力"
            let selectors = [ "textarea[aria-label=\"検索\"]"; "textarea[aria-label=\"search\"]" ]
            let! loc = waitAnySelector page selectors

            match loc with
            | Ok(locator) ->
                do! locator.FillAsync("playwright dotnet")
                do! page.ClickAsync("input[type=\"submit\"][aria-label=\"Google 検索\"]")
            | Error(err) -> failwith $"検索欄が見つかりません: {err}"

            // 検索結果を待つ
            let! _loc = page.WaitForSelectorAsync("h3")

            let! _pdfBytes =
                printfn "□スクリーンショット"
                page.PdfAsync(PagePdfOptions(Path = "screenshot.pdf"))


            return ()
        }

    tsk.Result

main ()

```
『伝えることの難しさと楽しさ』私が心がけていること

## 答えを直接与えてしまう

> ### 解き方も教えたし、答えもちゃんと説明したからOKOK
>「この問題はね、こうやって解くんだよ。だから、こういう式を使えば答えがこれになる。」と説明を一気に行ってそのまま話が終わる。相手が納得したかどうか、理解したかどうかを確認せず、「これで分かったよね？」と次へ進んでしまう。  

### → 考えるプロセスを尊重する

質問を使って相手の考えを引き出し、サポートをしながら答えにたどり着けるように促します。例えば、「この問題に似た過去のケースがあったとしたら、どう解決する？」や「何が足りないと思う？」といった **問いかけベース** で相手の頭で考える時間をつくることを重視します。


## 一方的に話して理解度を確認せずに終わる

> ### 説明したから伝わったと思い込んでしまう
> 複雑なシステムの概要を一方的に説明した後、「これで分かったと思うけど」と言い、相手の反応を気にせずに説明を終わらせる。後日、誤解や認識のズレがあったことが判明する。
極端な例ですが、白くてふわふわした動物の例で、話し手はウサギを指していたが、聞き手はシロクマをイメージしていた。みたいなことが起こる。


### → 双方向のコミュニケーションを意識する
**一呼吸おく**ことが効果的です。「ここまでで何かわからないことはある？」や「これをどう解釈した？」と尋ねて、相手の理解を確認します。視覚的な例や実践的な演習を取り入れると、より深く理解してもらえます。コードならエディタを画面共有したり、ER図ならサクッと図形を書いて見せたりするとズレている部分が見えやすいです。


## プロセスに目を向けない

> ### 正しい答えが出たならそれでいいでしょ？  
> プログラミングの課題で「結果が合っていればいいよね」と、コードの書き方やプロセスを振り返らずに済ませてしまう。実は非効率なアルゴリズムや危険な書き方が隠れているが、そのままにしてしまい、修正するきっかけがなくなる。

### → 結果だけでなく過程を共有する
良い結果が出た場合でも、プロセスをふりかえり、一緒に学べるポイントを探ります。例えば、「このステップで特に工夫した部分はどこ？」と聞くことで、成功体験や失敗体験を共有しやすくなります。時間をかけすぎてしまったときなどは、どこにボトルネックがあったかも共有してもらうチャンスになります。


## モヤッとしたところを持ち帰る空気をつくる

> ### 何かあったら聞いてねと言ったのに、誰も聞いてこない  
> 「何でも質問してね」と口では言うものの、相談しにくい雰囲気や上下関係のある空気感を無意識に作ってしまう。例えば、質問をした人に対し「そんなのも分からないの？」と感じさせる態度を取ったり、忙しそうな様子を見せることで、相手が遠慮してしまう。  

### → 信頼関係を築き、気軽に相談できる環境を整える

相手との雑談や相談をちいさく積み重ねて醸成していきます。また、過去に受けた質問なども共有しながら、「こういう質問なんかでもいいよ」とバリエーションを提示していくといいかもしれません。ざっくり「いま困ってることあるー？」と投げかけたりもします（**語尾の「あるー？」という感じが大事**だと思っている）。

## さいごに

と、いろいろ書きつつも「あれはこう言ったほうが良かったな」とか、「これは言うべきじゃなかったかもな」というふりかえりポイントもまだまだたくさんあります。
そして、伝える相手はAIではなく、人間。なので、伝え方のニュアンスや解像度などはグラデーションがあって難しいなあと感じるし、だからこそ楽しいところかなと感じます。
おすすめメモアプリBearについて語る

# はじめに
私が仕事時によく使っているメモアプリBearを使っている人があまり周りにいないので、語っていきたいと思います。

https://bear.app/

# メモアプリ遍歴
Notes (1年くらい)
↓
Bear (1年?)
↓
Notion (3日くらい。 同僚におすすめされたので使ってみたけど戻った)
↓
Bear (~今まで)

職場のドキュメント管理はConfluence

# Bearのおすすめポイント
### タグ
まず、メモアプリをタグで管理できるところ。ここまでだと他のメモアプリでもあるので、もうちょっと細かいところまで言及していきます。
##### 階層で管理できる
タグをネストでつけられるので、分類がしやすいです。例えばこんな2つのプロジェクトのタグを作りたいなと思ったとき
```
projects
    ├ bugix
    └ new-function-addition
```
こんな感じに簡単に書けちゃいます
```
#projects/bugfix
#projects/new-function-addition
```

https://bear.app/faq/how-to-use-tags-in-bear/

##### タグアイコンを変えることができる
タグの編集からタグのアイコンを変更することができます。メモ自体のタグは `#pin`になりますが、タグ一覧部分では⭐️にしました。結構たくさんのアイコンが用意されているので、タグからメモを探す時結構便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919187/65423407-587a-5a1f-fa16-18ca63c77c08.png)

### 検索機能
私がBearを使っている理由第一位です。
Bearの検索機能では、記事のタイトルだけでなく内容からも一致するものを検索してくれます。例えばコマンドは覚えてるけどプロジェクト名は覚えてない、記事のタイトルは覚えてる、などいろんなケースに対応してくれるので本当に助かっています。

#### 検索が早い
職場のドキュメント管理で利用しているシステムはちょっと検索に時間がかかってしまうのですが、Bearは本当に検索が早くて嬉しいです。一回の検索で時間がかかると、ちょっとストレスですよね...。

#### 写真を表示できる
ダウンロードしたイメージなど、貼り付けると自動でイメージをメモ内で表示してくれます。また、画像の大きさも簡単に調整できるのでスクショ撮る時のサイズを気にしなくて良いのも助かります。
GIFも入れることができるみたいです。

https://bear.app/faq/working-with-photos-gifs-pdfs-and-other-attachments/

### メモ
#### markdown
markdownで書くので、スムーズに移行しやすいかなと思っています。styleBarから選ぶこともできるので、markdownの記法がよくわからなくても扱えるところも気に入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919187/8a7de1b3-ca8d-0ec4-6939-e6f8230fed0f.png)

### デザインがシンプル&かわいい
最初、かわいいと思ったので使い始めました笑
アイコンもシンプルですし、真新しいノートにクマの絵があったりと所々のデザインが可愛らしくて気に入っています。
とはいえそこまでイラストなど多くないので、ずっと使い続けたいなと思っています。

# Bearのちょっと困ってるところ

#### コマンドをコピペすると実行できない時がある
コードをcode boxに保存しておくのですが、たまにコピペしたコマンドがterminalで実行できない時があります... 
他のアプリにペーストしてからコピーして実行すると動くので、何からの文字コードが変わってしまう時があるようです。

#### Windowsユーザは使えない
Windowsにはサービスを提供してないようなので、windoes, androidユーザにはおすすめできないところがちょっと悲しいです。


# 最後に
個人的おすすめアプリのBearについて良いところと困っているところをまとめてみました。
有料だとデータの共有ができるそうなので、ぜひ活用してみてください。

参考になれば幸いです🍎
Exchange OnlineのメールエイリアスをWindowsを使えない環境から有効にする方法

# はじめに

この記事は、Qiita Advent Calendar 20日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

今回の記事はExchange Online上でどのようにしてメールエイリアス機能を有効にするかです。ちなみに、今回参考にした記事は下の記事です。

https://www.softbanktech.co.jp/special/blog/cloud_blog/2021/0078/

この記事を見ても分かる通り、サブドメインを追加するところまではWebのGUI上からできるのですが、その後の実際にエイリアスのドメインからメールを送れるようにするにはPowerShellからの操作が必要でした。ここでは、Macしか持ってない人向けにどのようにしてエイリアス機能を有効化するかについてを書き残しておきたいと思います。

## MacにインストールしたPowerShellからする方法

最初は自分のMacにインストールしているPowerShellから有効化させようとしました。この前やった時はできなかったのですがなぜか今試してみたらでいました。

とりあえずHomebrewでPowerShellをインストールして`sudo`でPowerShellを起動します。

```zsh
brew install powershell/tap/powershell

sudo pwsh
```

あとは記載されていることをやるまでです。まずは、ExchangeOnlineのモジュールが使えるようにしましょう。

```powershell
Install-Module -Name PSWSMan

Install-WSMan

Install-Module -Name ExchangeOnlineManagement
```

ここまでできたらあとは接続してパラメーターをひっくり返すだけです。

```powershell
Connect-ExchangeOnline

Set-ExecutionPolicy RemoteSigned

Set-OrganizationConfig -SendFromAliasEnabled $True

Get-OrganizationConfig | Out-String -Stream | Select-String “SendFromAliasEnabled”
```

## AzureのPowerShell Onlineからする方法

僕は当時なぜか自分のMacのPowerShellからはできなかったのでこの方法を利用しました。Azure上のPowerShellからオンにする方法です。個人的にはこっちの方が楽かなと思います。なぜなら、Macより作業が半分ぐらい減るからですね。とりあえず、Azureを開いて右上からPowerShellを起動していきましょう。

![Screenshot 2024-12-22 at 20.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/52095627-8d26-a2a1-d83f-d56c5016b801.png)

これができたら、あとはほぼほぼMacの行程の半分ぐらいをやれば終わりです。

```powershell
Connect-ExchangeOnline

Set-ExecutionPolicy RemoteSigned

Set-OrganizationConfig -SendFromAliasEnabled $True

Get-OrganizationConfig | Out-String -Stream | Select-String “SendFromAliasEnabled”
```

# 最後に

Macが用意されていない環境でもこれをやればいいだけだと考えるとMicrosoft、さすがって感じですね！とは思うけど、Google Workspaceとかもっと楽にできるしなぁ‥。
データベースのSELECTクエリを最適化する方法


みなさまこんにちは！エアークローゼットのPandaです。この記事はエアークローゼットの[アドベントカレンダー2024](https://qiita.com/advent-calendar/2024/air-closet)の5日目の記事となってます。


データベースのSELECTクエリは、アプリケーションのパフォーマンスに大きな影響を与えます。不適切なクエリは、処理速度の低下やシステム全体のリソース不足につながる可能性があります。以下では、SELECTクエリを効率的に最適化する具体的な方法とその理由について詳しく説明します。

## 1. 必要なデータだけを取得する
データベースから必要以上のデータを取得すると、ネットワークやメモリに負荷をかけます。`SELECT *`を避け、使用するカラムのみを指定しましょう。

### ❌ 悪い例
```sql
SELECT * FROM users;
```
上記のクエリは、usersテーブルの全てのカラムを取得します。しかし、アプリケーションで実際に必要なカラムは一部だけである場合がほとんどです。不要なカラムを取得することは、データの転送量を増加させ、メモリ使用量を不必要に高める可能性があります。
### ✅ 良い例
```
SELECT name, age FROM users;
```
このクエリでは、必要なカラム（`name`と`age`）のみを指定して取得します。このようにすることで、データベースから必要な情報だけを効率的に取得でき、パフォーマンスが向上します。
## 2. インデックスを活用する
インデックスを適切に活用することで、`SELECT`クエリの検索速度を大幅に向上させることができます。特に、WHERE句で頻繁に使用されるカラムにはインデックスを作成しましょう。
### ❌ 悪い例
```sql
SELECT * FROM orders WHERE user_id = 123;
```
上記のクエリでは、`user_id`カラムにインデックスが存在しない場合、データベースは全件スキャンを行う必要があります。これにより、大量のデータがあるテーブルでの検索が非常に遅くなります。
### ✅ 良い例
まず、`user_id`にインデックスを作成します。
```sql
CREATE INDEX idx_user_id ON orders(user_id);
```
その後、インデックスを活用したクエリに変更します。
```sql
SELECT * FROM orders WHERE user_id = 123;
```
インデックスを使用することで、検索のパフォーマンスが大幅に向上します。
## 3. LIMITを活用する
大量のデータを一度に取得する必要がない場合、`LIMIT`句を活用して、クエリで取得するデータ量を制限することが重要です。これにより、ネットワーク帯域やメモリ使用量を節約できます。
### ❌ 悪い例
```sql
SELECT * FROM comments;
```
コメントが膨大な数ある場合、このクエリでは全てのコメントを一度に取得し、パフォーマンスが大きく低下します。
### ✅ 良い例
```sql
SELECT * FROM comments LIMIT 100;
```
`LIMIT`を使用することで、取得するデータを制限し、アプリケーションのパフォーマンスを保つことができます。また、`OFFSET`を併用すればページング処理も可能です。
## 4. JOINを適切に使用する
複数のテーブルを結合する場合、`JOIN`句を適切に使用することが重要です。不要な結合や誤った結合条件を避けることで、クエリのパフォーマンスを向上させることができます。
### ❌ 悪い例
```sql
SELECT * FROM orders, users WHERE orders.user_id = users.id;
```
上記のクエリでは、`orders`と`users`テーブルを結合していますが、`JOIN`句を明示的に使用していないため、読みやすさやパフォーマンスが低下します。
### ✅ 良い例
```sql
SELECT * FROM orders JOIN users ON orders.user_id = users.id;
```
`JOIN`句を明示的に使用することで、結合条件が明確になり、パフォーマンスが向上します。また、必要に応じてインデックスを使用することで、さらに高速化できます。
## 5. サブクエリの使用を避ける
サブクエリは便利ですが、複雑な処理を行う場合、パフォーマンスに悪影響を与えることがあります。できるだけサブクエリを使用せず、`JOIN`や`UNION`を活用することが推奨されます。
### ❌ 悪い例
```sql
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
```
上記のクエリはサブクエリを使用していますが、大量のデータを扱う場合、サブクエリのパフォーマンスが低下する可能性があります。
### ✅ 良い例
```sql
SELECT users.* 
FROM users 
JOIN orders ON users.id = orders.user_id 
WHERE orders.amount > 100;
```
`JOIN`を使うことで、サブクエリよりも効率的にデータを取得できます。

## 6. まとめ
`SELECT`クエリを最適化することは、アプリケーションのパフォーマンス向上に大きく貢献します。必要なデータのみを取得し、インデックスを活用し、`LIMIT`や`JOIN`の適切な使用を意識することで、データベースのリソース消費を抑え、効率的なデータ取得が可能になります。パフォーマンスの最適化は、アプリケーションのスケーラビリティを保つために非常に重要です。是非、これらのポイントを実践し、より良いシステムを構築してください。





また、エアークローゼットはエンジニア採用活動も行っておりますので、興味のある方はぜひご覧ください！

https://corp.air-closet.com/recruiting/developers/

https://www.wantedly.com/companies/airCloset/projects
DBFlute Examples有志募集中

# この記事の目的
こんにちは。2024年を振り返ってみると、DBFluteへのコントリビューションが諸事情でだいぶ少ない年でした。

他にもお手伝い頂ける有志の方がいたら良いなあと思い、アドベントカレンダーに参加いたします。

# DBFluteとは

jfluteさんが開発された、データベースのORマッパ&開発支援ツールです。

https://dbflute.seasar.org/ja/introduction/index.html#about

# なぜ作者がDBFluteコントリビュータなのか

関わりはもう10年になります。

2014年に前職の後輩とDBFluteフェスというコンファレンスに参加して、デモをするOSSに衝撃を受けました。

2018年後半の仕事でベンダーの技術検証を引き継いだのをきっかけに、DBFluteをSpringで使うようになりました。その後は個人でexampleを作成したり、SNSで発信された質問に回答したり、コントリビュートを個人で細々としています。

# DBFlute Examples

DBFluteには使い方を理解するためのサンプルが複数あります。

https://dbflute.seasar.org/ja/manual/reference/example/index.html

ここではJavaでできた2つのexampleを作りたい方を募集しています。

## dbflute-example-on-springboot

Spring BootでORマッパにDBFlute、データにDBFluteのmaihamadbを利用したサンプルWebアプリケーションです。プロジェクト全体、ソースコードの構成やコードスタイルなど、とにかくDBFluteスタイルにしています。

2014年に初期パイロット版が作成されました。2019年に現在の形に近い形で整備し、exampleの整備を本格的に再開しています。

整備した時
https://github.com/dbflute-example/dbflute-example-on-springboot/pull/18

Spring Boot 3 とJDK17へのメジャーバージョンアップも経て
https://github.com/dbflute-example/dbflute-example-on-springboot/pull/70
Jakarta EE対応ができていない部分の暫定対応も済みです。
https://github.com/dbflute-example/dbflute-example-on-springboot/pull/71

jfluteさんの記事の通りです。
https://jflute.hatenadiary.jp/entry/20171123/pullreqreqsboot

有志で地道なコントリビューションをしてきたので、2024年時点では数機能を除いて実装済みできました。

未実装の機能がまだいくつかありますし、実装済みの点も改善点はいくらでも考えられます。
lidoiseと言われるSingle Page applicationは、フロントエンドにコミュニティOSSを使いたいこと以外方針未定です。

Githubはこちらです。
https://github.com/dbflute-example/dbflute-example-on-springboot

## dbflute-example-with-gradle

2024年11月に作成されたGradleプロジェクトです。
環境構築を便利にするためSpring Initializrを使ってSpring Bootプロジェクトにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45710/43619d35-e2de-6c35-2f8f-55532484baf3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45710/c741c203-929d-8ed8-ddfa-72ded45dbcea.png)

まだ開発機能やアーキテクチャは未検討です。このプロジェクトは初期化しましたが、DBFluteすらインストールされていません。
ゼロからのスタートですので皆様の参加をお待ちしております。

# 問い合わせ先
冬休みで時間がある方もいらしたら、下記記載の連絡先から参加をお待ちしています。このページの作者はDBFlute Slackに常時います。

https://dbflute.seasar.org/ja/manual/topic/office/feedback.html

それでは、happy holidays!
Japan IT Studyを活用したマイクロソフト認定試験の準備体験

マイクロソフト認定試験を受けるにあたり、以下のサイトを活用しました
https://japanitstudy.com/examlist/

このサイトを学習資料として使用した経験を共有したいと思います。

## 理解しやすい解説

このサイトの最大の特徴は、解説が笹指でわかりやすい点です。他の試験対策サイトは英文で説明が記載されていることが多く、読解するのに時間がかかることもあります。一方、Japan IT Studyは日本語で構築されているため、日本人にとって非常に使いやすいリソースでした。

## 出題率の高さ

私は2024年12月22日に試験を受けました。その結果、全体の38問中15問がこのサイトで学習した問題から出題されました。サイト内の問題数は約120問ですが、この出題率は全体の12%に直接します。

試験の問題はランダムで出題されるため、これは比較的高い引き得だと感じました。この種のデータは気持ちを振り立たせるので、勉強を続ける励みになります。

## 効果的な利用方法

問題を解くだけではなく、解説の中で提示されているリンクから、マイクロソフトの公式サイトも読むようにしました。実際のサービスの目的や設定作業を想像しながら読み込むことで、システムの構造や性能をより深く理解できました。

試験の構成を理解するだけでなく、実際の工作環境での導入にも役立つ知識の構築につながったと感じています。
CSSだけで簡単なスクロールヒントを実装する

## この記事の概要

こちらの記事を見ていて、簡易的なスクロールヒントならCSSだけでできるのでは？と思い立ち、記事にしてみました。

https://css-tip.com/overflow-detection/

あまり実用的でもない気がしますが、スクロール可能なことを多少は示唆できると思います。

## 完成形

動作に関係のあるコードだけ抜き出すと次のようになります。

```css
.section {
  animation: scrolling forwards;
  animation-timeline: scroll(self);
  background-color: #fff;
  max-height: 480px;
  overflow: auto;
}

@property --gradient-color {
  syntax: '<color>';
  inherits: false;
  initial-value: rgb(0 0 0 / 0.5);
}

@keyframes scrolling {
  from {
    --gradient-color: rgb(0 0 0 / 0.5);
    background-image: linear-gradient(transparent 80%, var(--gradient-color));
  }
  20%, to {
    --gradient-color: rgb(255 255 255 / 1);
  }
}
```

## 解説

### animation-timeline: scroll(self);の使用

元記事にもあるように`animation-timeline: scroll(self);`を使用すると、その要素自体がスクロール可能かどうかでスタイルを切り替えることができます。

これによって、スタイルを次のように分岐させています。

1. デフォルト状態
    1. スクロールがなければただの白い背景
1. `from`
    1. スクロールがある場合、スクロールが始まる前はグラデーションをかけて「この先もコンテンツがありますよ」と示唆する
1. `20%, to`
    1. `20%`は任意の値
    1. 少しスクロールするとグラデーションが消える

### `@property`の使用

本筋ではありませんが、`@property`の使用も必要です。

通常のカスタムプロパティは補完方法が定められていないので、例えば次のコードはうまく動きません。

```css
@keyframes scrolling {
  from {
    background-image: linear-gradient(transparent 80%, rgb(0 0 0 / 0.5));
  }
  20%, to {
    background-image: linear-gradient(transparent 80%, rgb(255 255 255 / 1));
  }
}
```

しかし、はじめに`@property`で指定することで、RGBやアルファ値の各成分を個別に補間できるようになっています。
SC-300 受験日記：1回目の不合格から学んだことと合格への道

こんにちは、今日は私がSC-300の試験に挑戦した経験を共有したいと思います。勉強方法や試験対策に悩んでいる方にとって、少しでも参考になれば幸いです。


## 初回の挑戦：無料教材での手応えと不合格
最初に受験した際、私は「examtopics」の無料版を活用して過去問の演習を行いました。約60問ほど解いて自信をつけ、試験当日を迎えましたが、実際には試験で見覚えのある問題は全体の1割程度にとどまりました。

結果は685点（1000点満点中700点が合格点）で、不合格。あと15点（約2問分）足りませんでした。この経験から、無料教材だけでは網羅性が不十分であることを痛感しました。

## 2回目の挑戦：有料版での学習強化
次回に向けて、私は新たな戦略を試しました。思い切ってexamtopicsの有料版（65ドル＝約9900円）を購入し、約200問を学習しました。1回あたりの受験料が12000円（会社が半額負担）であることを考えると、最初から有料版を使っていれば、労力も抑えられて効果的だったと反省しています。教材の質は受験対策の成果に直結します。

※examtopicsの有用性については、以下サイトでわかりやすく紹介しています。参考までに！
[examtopics](https://806log.com/sikaku)

## 合格の結果
有料版での準備を終えて再挑戦し、結果は734点。無事に合格を果たすことができました。この経験から、有料の教材がもたらす価値を身をもって感じました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113382/bf1b57dc-6202-34a5-6a68-2cd83ce22956.png)


コストと学習の選択肢
一見高額に思える教材も、試験の合否や労力を考慮すれば、十分に価値のある投資です。時間の制約や効率を考えたとき、初めから有料版を選択するのが賢明な判断だったと、今では思います。

まとめとアドバイス
SC-300の試験は決して簡単ではありませんが、適切な学習ツールと準備方法を選ぶことで合格は十分に手の届くものです。これから挑戦する皆さんには、「最初から良質な教材を選ぶこと」をお勧めします。また、決して諦めず、学び続けることで道は開けるということを信じてください。

次の受験者の皆さんが、最短で目標を達成できるよう願っています。頑張ってください！
"にょろぼん" のコンテスト作品🖼️制作日記2024①

みなさんこんばんわ！”にょろぼん”です٩( 'ω' )و
アドベントカレンダー🎄なんか埋めたいなと思って！
時節柄。。。先週の授業でも告知ありましたね『動くWebページコンテスト！』開催のお知らせ！
みなさん。正直にお答えください…
**『ぶっちゃけ、超プレッシャー！！』** ですよね。。
そりゃ〜ね。分かってるんですよ。。意義はね。。
◎今まで学んできた事を試す良いチャンスで！
◎拙いアイデアでも良いから、自分で書くのが大事で！
◎自分で設計して書く過程！この事自体が超絶経験値になる！
んでしょ。先生の言うと〜り！んなこた〜重々分かってるんです。

ただね。いきなり作品を作れ！と言われても。**どうしていいか分からない。最初の一歩をどう進めたらいいかが分からない。** 困ってしまって一歩が踏み出せずモヤモヤだけが膨らむ。。そういうもんじゃない？　だって、”にょろぼん”もまさにそうだったから。

だから、この夏”にょろぼん” が実際に一歩一歩作品を描き進めた日々を、制作日記、体験談として晒しage⤴︎⤴︎してみようかと思い立ちました。やっぱ、こーゆうのは、実際にどうだったか？を知るのが参考になるよね。
赤裸々な体験談に一定の需要があることを信じて！！とりま、思い出した日々を１連載で２エピソードくらいづつ。空いてるアドベントカレンダーに投稿してみようかと思っています！お暇な時に読んでちょ！

どうか！これから冬の『動くWebページコンテスト』にみなさんが挑戦したくなった時のみちしるべになりますように！🪄✨
そして、今回作のコアアイデアを頂けた事への。時節の感謝も込めて。
**Have yourself a merry little christmas🎄 and make your season bright✨**

## Day⓪『アイデアが生まれた日』
それは。。忘れもしない8月ある日。”にょろぼん” は色々ありまして。。運転免許証が使えないピンチnのど真ん中にいたのでありました😱ぴえん。。
免許再取得の為うだるような暑さの中、埼玉県某所の運転免許教習所で次の授業コマを汗だくで待っていた。。その時ふと耳にした、指導教官同士が交わす雑談！↓
教官A『今、コンビニで、三ツ矢サイダーゼロ買うと、もう一本無料のチケットもらえるよ！』
教官B『クソ暑いし☀️。。サイダーいいっすね〜！でも、コンビニの無料チケット、引き換え開始日が次週とかでしょ！だいたいもらい忘れちゃうんすよね〜・・・』
教習まじだるい。とやさぐれてた ”にょろぼん” には、コンテスト作品の種🌱
『こ、これなんじゃね？💡』と⚡️啓示のようにおもわれ。。
携帯メモに『コンビニチケットのアプリを作る』と書き書きなぐったのでした📝

## Day①『コア・ロジックはこれでど〜だ！』
自宅に戻ってゴロゴロ。。『ようは、コンビニ”無料チケットが使えるまでの期日を判定”したいんだよな…』と。。頭に浮かんできたのは、『JavaScriptで論理を扱う』の回で使った関数でした！そう！あの、🎄クリスマスまであと何日？コードを書いた時の。
https://www.nnn.ed.nico/courses/2140/chapters/27057/guide/7438
`[function.js]`
`let nextChritsmas = ホニャララ`でクリスマス日時定義したあとの
**`let now = new Date();`** で！今日の日付が取得できるんじゃね？？

んでもって。チケットの有効期限に入っているか判定は。。
『JavaScriptのオブジェクト』の回で、10秒当てゲームで使った条件式が、ポン付けで動くんじゃね？？？
```js:object.js
function stop() {
  **if (9.5 <= seconds && seconds <= 10.5)** {
```
https://www.nnn.ed.nico/courses/2140/chapters/27058/guide/7439
`引換開始日(9.5秒...) =< 今日の日付 =< 引換終了日(10.5秒...)`

ああ。。今振り返ってみても。”にょろぼん”の作品のコードは、
上記のテキストの該当部分とバチでクリソツ！笑っちゃう位。
（まるパ⚪️リ！と言いたくなる位のッ！真似というかオマージュ）
https://github.com/nyeoro-bong/cvsTicket

コアとなる条件式は、N予備テキストでバッチリ動いているコードでいける！
あとは、必要になる日付取得とかカレンダーの部品を、google先生に尋ね探してこよう！！
あえて言おう！これで勝つる！と。ジークジオン🙌
（web上での部品探しの手順など。。。実際みたサイト等。。次回連載へつづく）
趣味はゲームです、は社会人的には幸せにならないという話

# はじめに
趣味がゲームの中島と申します。
最近はHearts of Iron IVでルーマニアを担当してどうにかベッサラビアを防衛できないかを
試行錯誤しています。

今回は、「社会人として」「雑談で」「趣味はゲームです」は誰も幸せにならないという理由について書き連ねたいと思います。
技術者論ではなく社会人論になるかと思いますが、お付き合いいただけると幸いです。

結論から申し上げますと
**ゲームが趣味ですは悪ではないがサブプランは用意した方が良いよ**
となります。

ゲームを批判しているわけではないのでゲーマー各位は怒らないでね。

## 理由1.オジサンにはゲームの受けが悪い
はい、タイトルそのままです。
上司やその上の方々はゲームに否定的な方が多いです。
どんなゲーム？と聞かれて説明したとしても伝わらないことの方が多く、
そこで試合終了となります。
同じゲームでも麻雀や将棋などであれば会話が続く場合もありますが…その時は、趣味はゲームですとは言っていないでしょう。
昨今はなんちゃらハラスメントのためあからさまに否定されることはありませんが、そのオジサン達の評価がお賃金に反映されるのをお忘れなく。

## 理由2. ソフトウェア業界は思ったよりゲーマーが少ない
私は別業種からン年前に転職したのですが、転職前は暗闇の中でキーボードを叩く謎イメージな方ばかりと思っていました。
しかし実際に働いてみると、PCを触るのは業務だけで家では見たくもないという方も割と居たり、仕事は仕事で割り切っている普通の社会人の方が大多数な感じです。

## 理由3. ゲーマー同士でも話が通じないことがある
話す相手がゲーマーだと同好の士来たりと言わんばかりに色々質問されたりしますが、最近はゲームと言ってもプラットフォームからジャンル、タイトルまで多種多様なので話がお互い通じないことが良くあります。
はじめに、で記述した内容もそのゲームのプレイヤーであれば伝わる話ですが、知らない人からするとさっぱりだと思いますし。

# そうだ、職場向けの趣味を作ろう
上記理由から、職場で趣味を聞かれた場合の対策用に別の趣味を作ったほうが楽です。
アウトドアな趣味をひとつで良いのででっち上げましょう。インドアでも筋トレは良いと思います。

運動が嫌な場合は散歩でも良いです。散歩中に見かける野良ちゃんは癒しになります。
餌はやっちゃダメですよ。
お金はかかりますが旅行もアリだと思います。

私はクロスバイクで温泉巡りを趣味としました。
福岡県内でお勧めの温泉があればぜひ教えてください。

# 雑談はデッキ構築型対戦ゲームだ
プライベートに干渉するなと思われる方もいらっしゃるとは思いますが、雑談も業務の一環と捉えたほうが良いと思います。成果物をちゃんと出していても、俺に関わるなオーラを出していては評価は上がりづらいでしょう。
オンラインで仕事をしていてもミーティングやチャットで雑談をする場面はありますし。

なので、雑談も対戦ゲームの一環として対策しましょう。
Slay the Spireではデッキは圧縮した方が良いですが、雑談ではデッキ（話すネタ）は分厚い方が良いです。
趣味の話もデッキに入るので、なんでも良いのでネタを拾って分厚いデッキを作り手札（話題）が無くならないようにしましょう。

相手が興味を示さなかった場合はデッキを再構築する必要がありますが、相手の手札も参考にしながら次はこの俺の自慢のデッキでぶちのめしてやるぜと無理やりにでもテンションを上げましょう。
あくまで雑談であって論破するとかではないのでそこは勘違いしないようにお願いします。

# さいごに
技術者とは技術があって当たり前で、その上で人としての振る舞いが
問われるのではないかと思います。
まぁ思っていなくてもそのように評価されると考えておいた方が良いでしょう。

振る舞いの一部としても「雑談」は割と大切な要素だと思いますので、趣味はゲームだとしても＋αを付け加えることで楽しく付き合っていきたいものです。
共通鍵暗号方式と公開鍵暗号方式をイメージしやすくする！

## 前置き
本記事は通信で使用する鍵方式の違いについて、解説します。
イメージできることをゴールにします。

## 鍵かける必要性とは？

そもそも鍵をかける必要性はなぜか？
答えは、**データの漏洩や改ざん** を防ぐことが目的です。
悪意の第三者からデータを盗まれて悪用されることを防止するために鍵掛をしています。

その鍵をかけるやり方が2種類あるよ！といった話です。
(厳密には2種類以外にもありますが、気になる方は調べてみてください！(/・ω・)/)

## 共通鍵暗号方式

言葉の通りです。
データを送信・受信する際に、共通の鍵を使用します。

イメージはこんな感じです。
送信者が箱にデータを入れて送ろうとしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/46f43bc1-1116-863f-60b5-ea0bc2e95b7a.png)

送信者はデータを置くる際に鍵を用意します。
この鍵でデータを保護することを **暗号化**といいます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/7aa6badc-8b72-0957-6b05-f779d9deb717.png)

送信者が持つ鍵を受信者にも渡します。
結果ロックした同じ鍵を持つ状態になるため暗号化したデータの確認ができる仕組みです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/c2cc4324-adc4-7977-ddb5-1372e3f8386c.png)

::: note warn
**懸念**
この方式には懸念点があります。
①受信者が複数にいる場合、送信者が送る人数分鍵を用意する必要がある
➡受信者が不特定多数に渡す場合、鍵の管理が困難です。
②鍵を受信者に渡す際に鍵情報が漏洩するおそれがある。
➡この問題を解決するために、現在は公開鍵・共通鍵方式を組み合わせたハイブリット方式が取られることが多いです！
➡ハイブリットについての解説は別記事予定です。興味のある方は調べてみてださい！(/・ω・)/
:::


## 公開鍵暗号方式

受信者がデータを保護する鍵を送信者へ渡し、送信者は貰った鍵でデータをロックします。
その後受信者へデータを送り返し、受信者は手元の鍵でロックを解除してデータを確認できる方式です！

イメージはこんな感じです！」

先ず受信者が鍵の開いた南京錠を送信者へ渡します。
この南京錠が俗に言われる **公開鍵**のイメージです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/85d54edd-a85f-fd48-616c-10c920f38d01.png)

南京錠が届いた送信者は南京錠を取り出し、受信者へ渡すデータを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/17201259-a411-b1d5-e378-2f151291a385.png)

用意が出来たら受信者からもらった南京錠でデータをロック(**暗号化**)します！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/ac41ad51-0809-eb80-563b-072409650b6b.png)

ロックしたデータを受信者へ送り返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/1b462a2f-4af6-fe26-eebe-926f2737717a.png)

受信者のもとへロックされたデータが届きます。
南京錠はもともと受信者が用意したものです。
当然、南京錠を開けるための解除鍵(**秘密鍵**)は手元にあります。
よって、受信者は送信者から送付されたデータが確認できるわけです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/bbe64502-b225-3c80-934f-5993c077ee25.png)

:::note warn
**懸念**
①暗号化されたデータの計算が複雑のため処理速度が遅い！
②秘密鍵が漏洩すると、誰でも公開鍵と紐づけてデータを盗むことができます
③中間者攻撃を受ける恐れがあります。中間者攻撃とは、公開鍵が送らてくる途中ですり替えや割り込みをやられてしまい、間違った南京錠にデータを入れて送ってしまうことで、データを盗まれることです。
:::



ざっくりですが、共通鍵暗号方式と公開鍵暗号方式を解説してみました。
この記事で暗号化・複合化における方式のイメージができたら幸いです(*‘ω‘ *)/