OmniAICreator/Qiita-1.07M huggingface dataset:
BluetoothとWi-Fiの違い

こんにちは、齋藤です。
今回は、普段よく耳にするBluetoothとWi-Fiの違いについて気になったので調べてみたことを記載したいと思います。

## 1. 基本的な概要

### Bluetoothとは？
Bluetoothは、近距離無線通信技術の一つで、短距離でのデータ転送やデバイスの接続を目的としています。特に、以下のようなシーンで活用されます：

- ワイヤレスイヤホンやヘッドセット
- スマートウォッチ
- キーボードやマウス

主に低電力かつ短距離のデータ通信に特化しています。

### Wi-Fiとは？
Wi-Fiは、無線LAN技術を指し、インターネット接続をワイヤレスで提供するために使用されます。以下のシーンで使われることが多いです：

- 家庭やオフィスでのインターネット接続
- スマート家電のネットワーク化
- パブリックWi-Fiスポット

Bluetoothと比べ、広範囲かつ高速の通信が可能です。


## 2. 技術的な違い

| 項目               | Bluetooth                         | Wi-Fi                              |
|--------------------|-----------------------------------|------------------------------------|
| **通信範囲**       | 約10～100m                       | 数十～数百m                       |
| **通信速度**       | 最大3 Mbps (Bluetooth 5.0基準)  | 数百Mbps～数Gbps                  |
| **消費電力**       | 非常に低い                       | 比較的高い                         |
| **接続対象**       | デバイス同士の直接接続に最適     | ネットワークを介した接続に最適     |
| **用途**           | 周辺機器の接続                  | インターネットやLANの通信          |


## 3. 主な利用シーン

### Bluetoothの利用例
- スマートフォンとイヤホンの接続
- 車載オーディオとのペアリング
- ヘルスケアデバイス（心拍計など）の接続

### Wi-Fiの利用例
- パソコンやスマホのインターネット接続
- 家庭内のスマート家電の連携
- オンラインゲームやストリーミング


## 4. メリット・デメリット

### Bluetoothのメリット・デメリット
**メリット**
- 消費電力が非常に低い
- デバイス間の直接通信が可能（インターネット不要）

**デメリット**
- 通信速度が遅い
- 通信範囲が短い

### Wi-Fiのメリット・デメリット
**メリット**
- 高速で広範囲の通信が可能
- 複数のデバイスを同時に接続可能

**デメリット**
- 消費電力が高い
- セキュリティ設定が複雑な場合がある


## 5. 結論

BluetoothとWi-Fiは、用途によって適切な選択が異なります。  
- **Bluetooth**は、低電力・短距離での接続が必要な場合に最適です。  
- **Wi-Fi**は、インターネット接続や広範囲・高速通信が必要な場合に適切です。

## 参考リンク
- [Bluetooth公式サイト](https://www.bluetooth.com/ja-jp/)
- [Wi-Fi Alliance公式サイト](https://www.wi-fi.org/ja/)
【ABC解説】 ABC382 解説 (B~D)【Python】

AtCoder プログラミングコンテスト2024（AtCoder Beginner Contest 382） のB問題〜D問題をPythonで解説します。

https://atcoder.jp/contests/abc382

# 提出コード

https://github.com/Syogo-Suganoya/AlgoArena/tree/main/atcoder/ABC/ABC382

# B問題
https://atcoder.jp/contests/abc382/tasks/abc382_b

## 問題
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/d5fc9611-3cb5-86a3-22f5-88a89cf9b4af.jpeg)

<details><summary>画像の文字起こし</summary>

＠と、で構成される文字列が与えられます。
＠がクッキーが入った、・が空箱です。
1日1枚ずつ最も右のクッキーを食べる時、D日後の箱の状況を出力してください。

</details>

## アプローチ
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/4be9e47a-e668-9f83-2210-88a6eb335869.jpeg)

<details><summary>画像の文字起こし</summary>

単純にD日後までを1日ずつシミュレートしていきます。

</details>

# C問題
https://atcoder.jp/contests/abc382/tasks/abc382_c

## 問題
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e766616a-59e6-b33e-edeb-5846cc0b0be3.jpeg)

<details><summary>画像の文字起こし</summary>

回転寿司にN人の客とM貫の寿司があります。
寿司にはそれぞれ美味しさの数値が設定されていて、客はその美味しさ以上の寿司しか食べない美食度が設定されています。
寿司は左から流れてきます。
それぞれの寿司はどの客に食べられるかを求めなさい。
誰にも食べられない寿司もあります。

</details>

## アプローチ
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/2bf110d7-5dc9-5926-13ad-fc39c4369ce7.jpeg)
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/5c919391-15c9-fc4d-c957-9bbdf7061db0.jpeg)

<details><summary>画像の文字起こし</summary>

どの美味しさの寿司までをどの人が食べるかの配列を最初に作り、その後、実際にどの客が食べるかを求めます。
人を順番に見ていき、その人の美食度までをその人のインデックスの値で埋めます。
配列は美味しさの最大値の2*10**5を用意します。初期値は-1で埋めておきます。
配列の右側から見ていき、その人の美食度までをその人のインデックスの値で埋めます。
1人目の客が美食度3の場合、以下のようになります

配列の右側から見る理由
美味しい寿司ほど左側の人が食べるため、配列は右から埋めていきます。
1人目が美食度3だと、2人目以降は美味しさ2以下の寿司しか食べられません

2人目の客が美食度8の場合、何も食べられません。
先客がいなければ美味しさ8以上の寿司が食べられますが、
1人目の美味しさ3以上の寿司を食べてしまうため、何も食べられません。

つまり、先客の最低値をさらに下回る美食度の場合のみに、寿司が食べられる可能性が出てきます。

3人目の客が美食度2の場合、以下のようになります。

あとは、流れてくる寿司の美味しさの値を
作成した配列のインデックスに当てはめることで、どの客が食べるかを求められます。

</details>

# D問題
https://atcoder.jp/contests/abc382/tasks/abc382_d

## 問題
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/724b3b40-4d4a-1a2d-4f04-13d58308f63f.jpeg)

<details><summary>画像の文字起こし</summary>

文字列Sがあります。この文字列に以下の操作をQ回行った際の、
K番目の文字列を求めてください。

</details>

## アプローチ
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/84ac16dc-23cd-e1de-f8c0-ab985ced2df7.jpeg)

<details><summary>画像の文字起こし</summary>

全探索の再帰で解けます。
荷形だとわかりやすいです

1-11-21の次は1-11-22というように出力するので、DFSが有効です。
DFS
・階層がNになったら値を出力して終了
・そうでなければ1階層下にいく
・その層内でループを組む
・開始値は直前の値と＋10した値、終了値はM - （N- 現在の階層を引いた数）*10

N=3の時
1階層目：Mから-20した値が終了値
2階層目：Mから-10した値が終了値
3階層目：Mが終了値

</details>

## シミュレーション
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/2a5f59d5-7e76-e9ee-0d26-5a0c904e89ba.jpeg)
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/7a72d77d-ae3e-1dca-c3a0-ca6f1486cf1a.jpeg)

<details><summary>画像の文字起こし</summary>

最初は1から始まります。

同じ階層に2から3を作成し、スタックします

1つ下の階層に行き、11から13を作成し、スタックします。

11を処理します。1つ下の階層に行き、21から23を作成し、スタックします。

21を処理します。階層がnに達したので、この処理を終了し、次の処理に移行します。

同様に22と23を処理します。

同様に12と13、2と3を処理します。図は省略します。

</details>
DevContainer立ち上げた時のdocker containerの動きを追った件

※追った件とか書いていますが、そんな壮大な話ではありません。小さな気づきをメモ程度に書いたものになります。
## きっかけ
最近業務でdocker×VSCode DevContainer環境での開発がスタートしたのですが、いまいちDevContainerの動きが分かりにくいな...と気持ち悪さを感じていたので、サクッと検証してみようと思ったことがきっかけでした。

## やってみた
**手順**
VSCode上でWSLからDevContainerを起動し、その後同じWSLを別途立ち上げ、```docker ps -a```でコンテナがどうなっているかを確認。
※下記```docker-compose.yml```と```.devcontainer.json```を用いて検証
```docker-compose.yml
version: '3'
services:
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    volumes:
      - .:/projroot
      - node_modules:/projroot/frontend/src/node_modules
    ports:
      - "3000:3000"
    tty: true
    environment:
      - WATCHPACK_POLLING=true
    network_mode: "host"

  az-functions:
    build:
      context: ./functions
      dockerfile: Dockerfile
    network_mode: "host"
    volumes:
      - ./:/projroot
    tty: true
    working_dir: /projroot/functions
    environment:
      - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
    ports:
      - '7014:7014'

  db:
    build:
      context: ./db
      dockerfile: Dockerfile
    container_name: postgres-data
    restart: always
    ports:
      - "5555:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
      - PGDATA=/var/lib/postgresql/data/pgdata

volumes:
  postgres-data:
  node_modules:
```

```.devcontainer.json
{
    "service": "frontend",
    "name": "device-manager-front",
    "dockerComposeFile": [
        "../docker-compose.yml"
    ],
    "shutdownAction": "none",
    "workspaceFolder": "/projroot/frontend/devicemanager",
    "remoteEnv": {
        "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}"
    }
}
```
### DevContainer起動後
```docker ps -a```で一覧表示。docker-compose.ymlで定義されたコンテナが全て動いていました。
```bash
CONTAINER ID   IMAGE                                   COMMAND              CREATED        STATUS                        PORTS                                         NAMES
1d85ac29f222   hoge-db             "docker-entrypoint.s…"   10 hours ago   Up 7 seconds                  0.0.0.0:5555->5432/tcp, [::]:5555->5432/tcp   postgres-data
4b25b15c443b   hoge-frontend       "docker-entrypoint.s…"   10 hours ago   Up 7 seconds                                                                hoge-frontend-1
2df969fe69ab   hoge-az-functions   "bash"                   10 hours ago   Up 7 seconds                                                                hoge-az-functions-1
815c3655a083   projroot-az-functions"bash"                  10 hours ago   Up 7 seconds                                              
```
どうやらDevContainerが起動すると、docker-compose.ymlに記載された内容のコンテナが```docker compose up```と同様の挙動で作成される模様です。
AWS Certified Solutions Architect - Professional　備忘録①


AWSの認定試験のSAPを取得しようと思っているので
学んだことを書き留めていこうと思います
個人的に資格勉強している内容や参加したクラスルームで学んだことを書きます
受講クラスルーム：Advanced Architecting on AWS

### 受講時の状況
新卒エンジニア　SAA取得済み
業務で一年弱AWSは触っている
調べながら使えはするもののちゃんと理解があるかと言われると微妙。
勢いでAdvancedのクラスを受けてしまったが大丈夫か...と思っていました。
→講師の方に丁寧に解説して頂いて、思ったより理解できて、非常にタメになりました。

## 備忘録/各リソースの機能
<details>
<summary>覚えておきたいこと</summary>

・VPCは複数リージョンに跨ることはできない
・パブリックサブネットとは、IGWが配置されているサブネットのこと
・NATを用いることでプライベートサブネットが内から外の接続のみできるようになる
・ALBはデータキャッシュとして機能しない。
・RDP,セッションマネージャ　AWS Systems Manager,
　セキュアShell(SSH)はEC2に直接アクセスできる
・DynamoDBはEFSにアクセスできない
・GWエンドポイントはS3とDynamoDBのみサポートされている
</details>

#### NAT GWの機能
・プライベートサブネットのインスタンスから送信されるトラフィックを許可する
・プライベートからネットや他のサービスに接続することができる
・逆にインターネットからプライベートサブネットへの接続を拒否できる

#### ALB の機能
・ターゲットグループというリソースにトラフィック分散を行う
・ターゲットはコンピューティングインスタンスが主(EC2/lambda/IPなど)
・リクエストを登録済みターゲットにルーティングする
・各リスナーのルールを作成し、ターゲットグループと条件を指定することができる

#### Auto Scaling
・起動テンプレートを作成してAuto Scalingグループを設定する
・上記の利点として、インスタンス起動時にEC2の全ての機能を活用できる
・EC2の起動に必要なパラメータを指定する

#### Auroraの冗長性
・クラスター内のライターに障害が起きるとリーダーを自動で昇格させてライターにする
・クラスターはリージョン内で複数AZに跨って各AZにデータのコピーが保持される

#### S3
・ライフサイクル機能を用いてストレージクラスを自動設定できる

#### VPC
・GWエンドポイントやIFエンドポイントを使うとインターネットを介さずに
　プライベートサブネットからリソースにアクセスできる
・PrivateLink For S3を用いるとオンプレ→S3間のプライベート接続を実現できる

### まとめ
主要なリソースの押さえておくべき所をリストアップしました。
まだまだ細かい部分がたくさんあるので詳しく書いていけたらなと思います！
LINEAPIの紹介

# はじめに
皆様はLINEAPIということは知っていて連携しますか？LINEAPIは、LINEというアプリケーションと他のアプリケーションをさせるための仕組みになっています。LINEAPIを使えば、情報や機能をアプリケーションで利用できます。また、チャットボットの開発やIOTの開発などさまざまな種類があります。

# LINEAPIの設定
LINEAPIの使い方について紹介していきます。
1.LINE Developersコンソールログインを行う （LINE Developersコンソールは、Webサイトになる）
2.プロバイダーの作成（プロバイダーは、サービスとアプリを提供するための組織です。
3. チャネルを作成する （チャネルは、プラットフォームの機能やサービスを連携するためのもの。）
4. チャネルの設定 （チャネルの種類に応じます）
5. チャネルの情報を利用して開発 （アクセスネットワークやWebhook URLのこれらを使って機能を呼び出す）

# まとめ
LINEAPIの紹介と使うための簡単な手順方法で今回の手順のLINEAPIを使ったプロジェクトを実際に進めて紹介しました。その中で、LINEAPIを使うことで幅広くAPIに触れ、可能性を広げていけると考えます。LINEAPIを活用した新しいアイデアやプロジェクトに挑戦したら未来が見えると考えます。

# 実際に行った画面
こちらが実際に設定を行った画面になります。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/7191d1b7-87e5-6850-c3df-ceb9292c609c.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/e3b02cc9-2244-0159-2952-789158e7686d.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/35e41d83-246f-737a-9d2e-79cb0749ea1f.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/fbd97fe5-0e6a-d0db-6e65-395638c0c0c3.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/966be735-e8b0-fbcf-b0ba-1f8d5e6df284.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/f9eda84f-924f-5daa-f10c-b42703414e5c.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/3d013ac4-382f-474c-05c6-fc0a6bdc6954.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/1a1d3ab7-d93a-96e3-b935-4b015812734e.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949362/63a5717d-31ce-15a3-64c1-4caa708a3bb9.png)

参考文献 
https://f-code.co.jp/blog/line/line_api_do/#index_id3
最新の JavaScript / TypeScript フロントエンドフレームワーク 5 選


## はじめに

近年、JavaScript および TypeScript を活用したフロントエンド開発の技術は急速に進化を遂げています  
ここでは、2024 年冬時点で注目すべき 5 つのフロントエンドフレームワークをご紹介します  
それぞれの特徴を理解し、プロジェクトに最適なものを選びましょう

### 1. React

Meta（旧 Facebook）によって開発された React は、コンポーネントベースのライブラリとして広く知られています  
シングルページアプリケーション（SPA）の構築に適しており、豊富なエコシステムを持つことが特徴です  
また、TypeScript との組み合わせが一般的で、モダンな開発に最適な選択肢と言えるでしょう

- **主な特徴**
  - コンポーネントベースで再利用可能なコード
  - 仮想 DOM を使用した高速なレンダリング
  - 広範なサードパーティライブラリ

### 2. Vue.js

Vue.js は、軽量で学習コストが低く、初心者から上級者まで幅広い層に支持されています  
日本国内での人気も高く、TypeScript のサポートが充実しているため、迅速な開発を求めるプロジェクトに適しています

- **主な特徴**
  - 柔軟な設計と直感的な API
  - コンポーネントベースの構造
  - エコシステムが豊富

### 3. Angular

Google が開発した Angular は、TypeScript を標準で採用していることが大きな特徴です  
大規模なエンタープライズ向けアプリケーションの開発に適しており、包括的な機能と強力なツールセットを提供します

- **主な特徴**
  - モジュール化されたアーキテクチャ
  - 双方向データバインディング
  - テスト機能が充実

### 4. Svelte

Svelte は、コンパイル時に不要なコードを削除し、軽量で高速なアプリケーションを生成する新興のフレームワークです
直感的な文法と高いパフォーマンスを備え、TypeScript との統合も進んでいます

- **主な特徴**
  - 仮想 DOM を使用しない設計
  - 簡潔な構文
  - 高速なパフォーマンス

### 5. SolidJS

SolidJS は、React に似た構文を持ちながら仮想 DOM を使用せず、直接 DOM を操作することで高速なパフォーマンスを実現しています  
軽量なアプリケーション開発に適しており、TypeScript との相性も良いです

- **主な特徴**
  - 宣言型 UI ライブラリ
  - 高速なレンダリング
  - コンポーネントベースの設計

## フレームワークの選び方

これらのフレームワークは、それぞれ独自の特徴を持っています  
選択する際には、以下のポイントを考慮すると良いでしょう

1. **プロジェクトの規模と目的**

   - 小規模プロジェクトには軽量な Vue.js や Svelte が適しています
   - 大規模なエンタープライズ向けには Angular が最適です

2. **開発者のスキルセット**

   - チームが TypeScript に精通している場合は React がおすすめです

3. **エコシステムとコミュニティ**

   - 豊富なライブラリやドキュメントが必要な場合は、React や Vue.js を選ぶと良いでしょう

4. **パフォーマンス重視**
   - 高速なレンダリングを求める場合は、Svelte や SolidJS が優れています

## まとめ

JavaScript および TypeScript を活用した最新のフロントエンドフレームワークには、それぞれの特性と強みがあります  
プロジェクトの要件やチームのスキルセットに合わせて、最適なフレームワークを選択することで、効率的で効果的な開発が可能になるでしょう
F検定を分かりやすく解説！中学生でも理解できるばらつきの比較方法

統計学の中には「ばらつき」を比べる方法として**F検定**というものがあります。この記事では、F検定の考え方や計算方法を中学生でも分かるように説明します。さらに具体的な数値を使った例も紹介します！
※この記事は、ChatGPTの出力を基に作成しています。

---

## F検定とは？
F検定は、「**2つのグループのデータのばらつきが同じかどうかを比べる方法**」です。

### ばらつきとは？
データのばらつきとは、データがどれくらい散らばっているかを指します。
- ばらつきが小さい：データが平均値に近い値ばかり。
- ばらつきが大きい：データが平均値から離れた値が多い。

例えば、クラスAとクラスBのテスト点数を比べたとき、F検定を使うと「2つのクラスの点数の広がり方が似ているかどうか」が分かります。

---

## F検定のステップ
F検定を行うためには、以下の手順を踏みます。

### 1. 分散を計算する
ばらつきを数値で表す「分散」を計算します。分散の公式は次の通りです：

$\
\text{分散} = \frac{\sum_{i=1}^n (x_i - \bar{x})^2}{n-1}
\$

ここで、
- $\ x_i \$：データの各値
- $\ \bar{x} \$：データの平均
- $\ n \$：データの個数

### 2. F値を計算する
分散が大きい方を分子、小さい方を分母にして割り算します。

$\
F = \frac{\text{大きい方の分散}}{\text{小さい方の分散}}
\$

### 3. 基準値と比べる
計算したF値を基準値（F分布表を使って得られる値）と比較します。この基準値よりF値が大きいと「ばらつきが違う」、小さいと「ばらつきが同じ」と判断します。

---

## 具体例でF検定をやってみよう！

### 問題
クラスAとクラスBのテスト点数が以下のようだったとします。
- **クラスA**: \( 70, 75, 80, 85, 90 \)
- **クラスB**: \( 60, 70, 80, 90, 100 \)

この2つのクラスの点数のばらつきが同じかどうかを調べます。

---

### ステップ1: 分散を計算する
#### クラスAの分散
1. 平均 $\( \bar{x}_A \)$ を計算：
   $\
   \bar{x}_A = \frac{70 + 75 + 80 + 85 + 90}{5} = 80
   $

2. 各値との差の二乗を計算：
   $\
   (70 - 80)^2 = 100, \quad (75 - 80)^2 = 25, \quad (80 - 80)^2 = 0, \quad (85 - 80)^2 = 25, \quad (90 - 80)^2 = 100
   \$

3. 分散を計算：
   $\
   \text{分散}_A = \frac{100 + 25 + 0 + 25 + 100}{5 - 1} = \frac{250}{4} = 62.5
   \$

#### クラスBの分散
1. 平均 $\( \bar{x}_B \)$ を計算：
   $\
   \bar{x}_B = \frac{60 + 70 + 80 + 90 + 100}{5} = 80
   \$

2. 各値との差の二乗を計算：
   $\
   (60 - 80)^2 = 400, \quad (70 - 80)^2 = 100, \quad (80 - 80)^2 = 0, \quad (90 - 80)^2 = 100, \quad (100 - 80)^2 = 400
   \$

3. 分散を計算：
   $\
   \text{分散}_B = \frac{400 + 100 + 0 + 100 + 400}{5 - 1} = \frac{1000}{4} = 250
   \$

---

### ステップ2: F値を計算する
分散が大きい方（クラスB）を分子、小さい方（クラスA）を分母にします：

$\
F = \frac{\text{分散}_B}{\text{分散}_A} = \frac{250}{62.5} = 4
\$

---

### ステップ3: 基準値と比較する
F分布表を使い、自由度$\ (4, 4) \$ の場合の基準値（有意水準5%）は約**6.39**です。

- $ F = 4 \$ は基準値$\ 6.39 \$ より小さいので、**ばらつきは「同じ」とみなせます**。

---

## 結論
クラスAとクラスBのテスト点数のばらつきに統計的な差はありません。つまり、どちらも「同じくらいのばらつき」と考えられます。

---

## F検定を使うときのポイント
- 分散を計算するのが基本！
- F値は「大きい分散 ÷ 小さい分散」で計算。
- 基準値（F分布表）と比較して判断。

---

### まとめ
F検定はデータのばらつきを比較するための便利な方法です。今回の例のように、クラスやチームの成績などを比べるときに役立ちます。統計の知識が増えると、データの見方がぐっと広がりますよ！

ぜひ試してみてください！
enumがなにかわからなかったから調べた話

私が最初に触れたプログラミング言語はNode.jsでした
御存知の通りNode.jsにはenumに相当する機能がないんです
なのでenumについて知らずに、必要性も感じずに生きてきました
実はTypeScriptの方針に反するものなのですが、TypeScriptの中にenumが存在します

ふとした時に疑問に持ち、色々と調べたので自分なりに、特にNode.js、TypeScriptについて書き残しておきます

# enumとは
enumとは列挙型のことで英語だと`enumerated type`と呼ぶようです
おそらく英語の頭をとってenumと読んでいるのでしょう

これは定数のリストをコンパクトに纏めるためのものみたいです
宣言時に明示的に指定しなければ0から順番に連番が当てられるようです
また宣言時に変数を用いて指定することもできDATEを現在時刻のUnix時間になるようにしています
他にも、他言語では明示的なキャストなしにはできないものもあるようですが、TypeScriptではenumを算術計算に直接使えるようです

それと最後`//@ts-expect-error`でエラーが出ることを許容しています
後で説明していますがこれによってenumの定数を扱うという特性が破壊されています

```TypeScript:TypeScript
const date = new Date().getTime();

enum testEnum {
  AAAAA,      // 0
  BBBBB,      // 1
  CCCCC,      // 2
  EEEEE = 5,  // 明示的に5になる
  DATE = date // Unix時間になる
}

/* 
  という形で宣言し
  以下のように使用する
*/

console.log(testEnum.AAAAA)      // 0

const testVar1 = testEnum.BBBBB
console.log(testVar1)             // 1

let testVar2 = testEnum.CCCCC
testVar2 += 10
console.log(testVar2)            // 12

console.log(testEnum.EEEEE)      // 5

console.log(testEnum.DATE)       // new Date()時点でのunix時間

testEnum.AAAAA = 10 //これはエラー

//@ts-expect-error
testEnum.AAAAA = 10               //型チェックを無視すると代入できてしまう
console.log(testEnum.AAAAA)      // 10
```


## トランスパイル後

トランスパイル後コードはこの様になっています
少し見やすいように整形を入れています

```javascript:Node.js
const date = new Date().getTime();

// ここから
var testEnum;
(function (testEnum) {
    testEnum[testEnum["AAAAA"] = 0] = "AAAAA";
    testEnum[testEnum["BBBBB"] = 1] = "BBBBB";
    testEnum[testEnum["CCCCC"] = 2] = "CCCCC";
    testEnum[testEnum["EEEEE"] = 5] = "EEEEE";
    testEnum[testEnum["DATE"] = date] = "DATE"; // Unix時間になる
})(testEnum || (testEnum = {}));
// ここまで

console.log(testEnum.AAAAA); // 0

const testVar1 = testEnum.BBBBB;
console.log(testVar1); // 1

let testVar2 = testEnum.CCCCC;
testVar2 += 10;
console.log(testVar2); // 12

console.log(testEnum.EEEEE); // 5

console.log(testEnum.DATE); // new Date()時点でのunix時間

//testEnum.AAAAA = 10 // これはエラー

//@ts-expect-error
testEnum.AAAAA = 10; // 型チェックを無視すると代入できてしまう
console.log(testEnum.AAAAA); // 10
```

enumがなにか違う構造に変換されているのがわかりますね
これに関しては正直何してるかわかりません
// ~~TODO またいつか勉強する~~ const enumの記事で触れています

それと`//@ts-expect-error`を指定して`testEnum.AAAAA = 10`の型のエラーを無視しています
トランスパイル後にもコードが残ってしまっていますね

## 実行

```console:console
0
1
12
5
1734527678178
10
```

実行結果でも上の結果が出ていることがわかります
特に最後の10、型安全性を破壊した結果enumの定数を扱うという性質を破壊できてしまいました
やはりAnyは敵ですね

普通に使う分には`//@ts-expect-error`なんて使わないと思うのでAnyなどに気をつけていれば問題ないと思います
それ以外にもいくつかコンパイラを騙して型安全性を破壊できてしまうアンチパターンが存在しているので、気を付けてコーディングしていきましょう

今日も ~~ご安全に~~ 型安全に

# まとめ
- 名前付き定数をまとめて宣言
- enum.<定数名>の形で使用
- 値はnumber型として使用できる == 算術計算に使える
- 生JSには存在せず同等の機能にトランスパイルされる
- TypeScriptの型安全性に守られているだけであり、型チェックを無効化すると改変できてしまう
【UiPath】「トランザクションを呼び出し」はトランザクションコードしか使えない【SAP】

UiPathではSAP専用のアクティビティがいくつか用意されており、「トランザクションを呼び出し」もその一つである。

>UiPath.Core.Activities.SAP.CallTransaction
現在の SAP GUI ウィンドウで実行されるトランザクション コードまたはプログラムを入力します。

https://docs.uipath.com/ja/ACTIVITIES/other/latest/ui-automation/call-transaction

SAPのトランザクションコードとは、処理画面やプログラムを呼び出す文字列や数列で表現された処理コードのことで、SAP画面左上のコマンド項目欄に入力して使用する。
「トランザクションを呼び出し」はこの操作を自動化してくれ、「コマンド項目欄にコードを入力」→「エンターを押して実行」が一つのアクティビティで済むようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/600ef8d4-161c-7d2e-8572-5077b5ca7c98.png)

一方で、このアクティビティでは出来ないこともある。
SAPにはトランザクションコード以外にも操作を省略できる特殊コードが用意されており、これらもトランザクションコード同様に左上のコマンド項目欄に入力して使用する。
しかし、「トランザクションを呼び出し」で特殊コードを呼び出そうとすると、「トランザクション〇〇は未登録です。」とエラーになってしまう。このアクティビティで呼び出されるのは、あくまでトランザクションコードに限られるようだ。

### 具体的には

以下がトランザクションコードの一例。これらのコードは「トランザクションを呼び出し」で実行できる。

| コマンド | 説明 |
|:-:|:-:|
| SE11 |オブジェクトナビゲーターにアクセスする。  |
| VA01  | 受注伝票を新規作成する。  |
| FB50  | 仕訳入力を実行する。  |

以下が特殊コードの一例。これらのコードは「トランザクションを呼び出し」で**実行できない**。

| コマンド | 説明 |
|:-:|:-:|
| /n |現在の画面を終了してトップ画面に戻る。  |
| /nex  | 確認メッセージ無しで全ての画面を終了する。  |
| /i  | 現在開いている画面を閉じる。 |


## 動作環境
UiPath.UIAutomation.Activities 23.10.7

## 参考
https://it-biz.online/sap/transaction/#toc8

https://www.uipath.com/ja/community-blog/tutorials/sap-wingui-activities
【UiPath】「繰り返しを終了」を配置すると引数「BreakTriggerScopeInArgument」が作られる

「繰り返しを終了」アクティビティを配置するとそのワークフローに引数「BreakTriggerScopeInArgument」が突如として追加される現象。
「繰り返しを終了」を置いているワークフローの引数パネルには表示されないが、別のワークフローから呼び出そうすると引数「BreakTriggerScopeInArgument」が現れる。一度作成されてしまうと、「繰り返しを終了」を消してもこの引数が消えることはない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/b307f5c6-46d8-5e2f-50ee-5ec77205ea33.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/3d33499b-3b58-dbc3-9d81-6f6b3acd0c39.png)

公式フォーラムによるとUiPath Studio側の不具合らしく、バージョン：2023.4で発生するとのこと。筆者が確認したところ2023.10.4でも発生しており、2025.0.157では解消されていた。

https://forum.uipath.com/t/breaktriggerscopeinargument/703209

そのままでも害はないらしいが、削除したい場合はデータマネージャーから削除できる。ただし、「繰り返しを終了」を配置する度に再作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/eadcb0e0-7e35-07e4-d6bc-312011b1ab4a.png)

ちなみにStudio 2025.0.157でも近い現象は再現でき、「BreakTriggerScopeInArgument」という名前の引数を作るとそのワークフローからは姿を消すのが確認できる。うっかり作ってしまった場合はデータマネージャーから削除しよう。

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/e794159a-6c53-204b-87a3-bbc0c1751f62.gif)

## 動作環境
UiPath Studio 2023.10.4
UiPath Studio 2025.0.157
Django　バッチファイル作成

## 今回作成したもの
自作したアプリケーションのバッチファイル

## 作成理由
いちいち作成フォルダーに移動してコマンドを実行するのが、面倒だったから

## 使用技術
Django：5.1.4

## 作成手順
### １：バッチファイルの作成
バッチファイルは以下のように書きます。
```batch:app.bat
@echo off
cd 実行ファイルがあるフォルダーのパス
source venv/Scripts/activate
python manage.py runserver
```
それぞれについて
* ```@echo off```はコマンドプロンプトに技術されたコマンドが表示されないようにするものです。
* ```source venv/Scripts/activate```は仮想環境を起動するための記述です。今回はPythonのDjagnoフレームワークを使用しているため、このような記述になります。
* ```python manage.py runserver```はDjangoのアプリ起動コマンドです。

## ショートカットの作成
1\.ショートカットを作りたい場所に右クリックする
2\.新規作成⇒ショートカットとクリックする
3\.アプリケーションのフォルダーパスを参照する
4\.次へ⇒完了を押す

## ショートカットのアイコン編集
1\.作ったショートアイコンを右クリックし、プロパティをクリック
2\.ショートカットタグをクリックし、アイコン変更をクリック
3\.使いたい画像をクリックして適用
*ただし、画像はicoファイルの必要がある

## 終わりに
アイコンがあるとアプリ開いている感があってよかったです。

## 参考文献
バッチファイル(BATファイル)とは？作り方や書き方を初心者向けに解説！
https://it-trend.jp/development_tools/article/32-0040
挫折0で1人アドカレを2年連続完走した3つのコツ


# はじめに

2024年も一人アドベントカレンダーを無事に完走することができました。見守ってくださった皆様、本当にありがとうございました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/18f69993-c02a-4070-60fd-3072097f1732.png)



この記事では、挫折することなく一人アドカレをやり遂げるために私が実践した方法を紹介します。

インプットとアウトプットのバランス、記事アイデアの整理術、モチベーション維持方法など、学び手であり創り手である全ての人が参考にできるエッセンスをまとめました。


# 昨年と今年の方針の違い

## 昨年の戦略

- **11月中旬まで**: 記事のアイデアメモ、勉強して知識を拡充
- **11月末まで**: 1日約2記事ずつのペースで80%クオリティの下書き記事を作成
- **12月中**: 日々ブラッシュアップと投稿に専念

完璧主義を目指さず、早目に着手して完成させることを意識していました！
おかげで比較的余裕を持って完走出来ました。
記事を書く事を念頭に置くと、学習効率がとても良かったです。

**一人アドカレの準備記事**

https://qiita.com/Isaka-code/items/0f709f671a7a7ad1445d

**完走した感想の記事**

https://qiita.com/Isaka-code/items/d5eff037f2c7d3cdbbf6

**昨年の一人アドカレ**

https://qiita.com/advent-calendar/2023/nebosuke-ai

## 今年の改善点

今年は昨年と同様の基本方針を踏襲しつつ、以下の点を改善しました。
- 一つのカレンダーに25記事投稿するのではなく、複数のカレンダーに投稿することでテーマの偏りや飽きを防止
- GitHub Issueで記事を管理（昨年はDiscordのスレッドで管理）
- 日々の執筆進捗状況をTwitterに投稿し自分自身にプレッシャーをかける（一人アドカレ仲間と交流できました！）

9月の時点で今年も一人アドカレに挑戦することを宣言しました！（Qiita公式アカウントにリポストされたので逃げられない状況に👼）

https://x.com/AInebosuke/status/1833059888567844867

# 挫折しないで記事を書く3つのコツ

## 1. インプット優先、溢れたらアウトプット

まずは圧倒的なインプットに集中することが重要です。頭に知識を詰め込み、溢れた段階でアウトプットへ移行します。自然な流れで記事を書くため、ストレスが軽減され、「誰かの役に立ちそう」と思える内容をすぐ記事にできます。

モチベーションの源泉は「誰かのためになること」と「自分が強くなること」です。
学んだ知識を記事にすることで理解が深まり、思考が整理されます。
完璧を求めず、まずは80%完成度を目指し、徐々に改善しましょう。

インプットとアウトプットの周期を意識して交互に取り組むと、ネタ切れを防げます。
アイデアは思いついた瞬間がモチベーションのピークなので、即メモし、記事に落とし込んでいくと効率的です。



## 2. 1記事の目安はA4用紙1枚

執筆前は日々アイデアを蓄積します。記事にしたい主題を思いついたら、A4用紙1枚に構成をラフスケッチします（キーワードや短いフレーズで十分です！）。あとはそのメモをもとに記事をブラッシュアップして完成させます。

もし、A4用紙1枚に収まらない場合は、無理に1記事に詰め込まず「疎結合な記事」を意識して記事を分割します。関連する記事をリンクで繋ぐことで、読みやすくなります。また、記事数が増えるメリットもあります（一人アドカレ勢には重要）。

また、文章術を学ぶことも有用です。上手な人の技法を参考にしましょう。

https://speakerdeck.com/minorun365/ji-shu-buroguyadeng-tan-zi-liao-womiao-dezuo-rukotuchuan-shou-simasu

https://zenn.dev/tmknom/articles/readable-github-cicd-book

https://note.com/hanahanayaman/n/nd2fe3cdddc43?sub_rt=share_b


## 3. 早めに着手し、手を動かす

昨年は11月中旬までに記事アイデアを集め、11月末までに80％品質の記事を大量生産し、12月中は微修正と公開に集中しました。  
今年も同様の戦略で、「早めに着手することで」余裕を持って取り組めました。  
記事を書くことを通して、単なるインプットを実践知へと転換することができます。

モチベーションは、行動を先に起こすことで後から高まる「作業興奮」という心理現象があります。
手を動かせば勢いがつき、アウトプットへの抵抗が減ります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/JV3KOJ_Z4Vs?si=21WpMGk9jiyTuYuU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

>断言しますが、自らを鍛えるのは、あるいは成功に近づくのは、圧倒的に手数です。アウトプット少なくして成功なし。意味などは後で考えれば良いから、とにかく手を動かすということをおすすめします。
（出典：桜井政博のゲーム作るには）

## おわりに

2年連続で一人アドカレを完走できた秘訣は、インプット重視、アイデアの整理、余裕のある計画、そして「誰かの役に立ちたい」という純粋な思いでした。
挫折を防ぐには、完璧主義を捨ててスモールスタートで着手し、徐々に改善していくことが有効です。

私自身、今後もデータサイエンス、ソフトウェア開発、AI技術など多彩なテーマでインプットとアウトプットを繰り返します。
Kaggleに参加することもアウトプットの一環として注力したいです。

本記事は以上です。執筆した25記事は、下記の記事でクラスタリングしたので、よろしければご覧ください！

https://qiita.com/Isaka-code/items/f37e35573dc28969f567
Delta Live Tablesのイベントフックによるカスタムモニタリング

このような新機能ができているとは。

https://docs.databricks.com/ja/delta-live-tables/event-hooks.html

> イベント フックを使用して、 イベント が Delta Live Tables パイプラインの [イベント ログ](https://docs.databricks.com/ja/delta-live-tables/observability.html#event-log)に永続化されるときに実行されるカスタム Python コールバック関数を追加できます。 イベントフックを使用して、カスタムのモニタリングとアラートのソリューションを実装できます。 たとえば、イベント フックを使用して、特定のイベントが発生したときに電子メールを送信したり、ログに書き込んだり、サードパーティのソリューションと統合してパイプライン イベントを監視したりできます。

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

マニュアルのサンプルを動かしてみます。

その前に、SlackのワークスペースとSlackアプリ(適切なスコープ`channels:join`と`chat:write`を設定)して、アプリをチャンネルに追加しておきます。で、Bot User OAuth Tokenをコピーします。ここで結構手間取りました...。

DLT動かす前に、APIを叩いて動作確認します。

```sh
curl -X POST 'https://slack.com/api/chat.postMessage' \
-d 'token=<Slack AppのBot User OAuth Token>' \
-d 'channel=#slack-integration-test' \
-d 'text=*テキスト*'
```

動きました。

```json
{"ok":true,"channel":"C085QCA8UKF","ts":"1734597464.623469","message":{"user":"U085CRB91AB","type":"message","ts":"1734597464.623469","bot_id":"B085VSKG4R2","app_id":"A086G3WSRG8","text":"*\u30c6\u30ad\u30b9\u30c8*","team":"T085T4VJSP5","bot_profile":{"id":"B085VSKG4R2","app_id":"A086G3WSRG8","name":"Demo App","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"deleted":false,"updated":1734596342,"team_id":"T085T4VJSP5"},"blocks":[{"type":"rich_text","block_id":"D2s","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"\u30c6\u30ad\u30b9\u30c8","style":{"bold":true}}]}]}]}}
```

DLTのノートブックを実装します。

```py
from dlt import table, on_event_hook, read
import requests
import json
import time

API_TOKEN = "<Slack AppのBot User OAuth Token>"
SLACK_POST_MESSAGE_URL = 'https://slack.com/api/chat.postMessage'
DEV_CHANNEL = '#slack-integration-test'
SLACK_HTTPS_HEADER_COMMON = {
 'Content-Type': 'application/json',
 'Authorization': 'Bearer ' + API_TOKEN
}


# 単一のデータセットを作成します。
@table
def test_dataset():
 return spark.range(5)


# イベントフックの定義。
@on_event_hook
def write_events_to_slack(event):
  res = requests.post(url=SLACK_POST_MESSAGE_URL, headers=SLACK_HTTPS_HEADER_COMMON, json = {
    'channel': DEV_CHANNEL,
    'text': 'Event hook triggered by event: ' + event['event_type'] + ' event.'
  })
```

このノートブックを指定してDLTパイプラインを作成して実行します。

パイプラインを実行すると画面下にイベントログが表示されますが、上の実装ではイベントをSlackチャンネルに投稿しています。パイプライン動かしている時点でSlackに通知が来ていました。

Slackチャンネルを見てみると、DLTイベントをフックしてメッセージが書き込まれています！面白い。

![Screenshot 2024-12-19 at 17.43.43.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/78e071d9-6533-3834-42dc-2745aa01be66.jpeg)

他のシステムとも連携できるので、データパイプラインの監視の幅が広がります。ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
俺のGit操作が遅すぎる！

# はじめに
こんにちは、FJ2123です。
今日はGit周りのことについて、記事を書こうと思います。

# 本題
普段のiOSアプリ開発で、ソースコードをGitを使って管理しています。
(ちなみにターミナルは[Warp](https://www.warp.dev/)を使用しています、使いやすいのでみなさんぜひ。)
ちょっと前までは、快適だったのですが、最近操作がもたつく(というか1操作に何分もかかってしまうようになりました)


とりあえず以下の画像を見てください

![遅い！！！.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/6d45d8ed-f1ba-7ed9-f140-512094cd8c36.png)


### 遅い！！！！！

```git
git push --set-upstream origin main
```



これだけの操作になんと**5分4秒**もかかっています。
**どういうことなの・・・?**


# どのように解決したか

いろいろ調べて、以下のようなコマンドを打てば解決できそうとのことでした

```
git gc
git fsck
```

それぞれ軽く解説します

### git gc

> git gc コマンドは、リポジトリ上で “ガベージコレクション” を実行し、データベース上の不要なファイルを削除するとともに、残ったファイルをより効率的なフォーマットへ詰め込み直します。


Gitのコマンド - システム管理 (https://git-scm.com) より

リポジトリ内の不要なファイルを削除して、残ったファイルを綺麗に整頓し直してくれているコマンドということですね


### git fsck

> git fsckコマンドは、リポジトリの整合性をチェックをするツールです。「fsck」とは「file system consistency check」の略で、Gitリポジトリ内のオブジェクト、コミット、ツリー、ブロブ、タグが適切なフォーマットで正しくリンクされているかを検証します。


Gitコマンド「git fsck」とは？リポジトリの安定を保つサポート エンベーダー (https://envader.plus/article/400) より

こちらは、Gitリポジトリの構造と内容のチェック、点検を行ってくれているコマンドのようですね


# 試してみる

![実際にやってみた.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/331b0cce-e9dd-1c19-067a-241c9be750ed.jpeg)



半ばすがるように
コマンドを打ち込んでいきます、、、、、


![コマンド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/9c1791ac-5c18-acc7-81fe-4e32bf2b2e97.png)


### すると…！！


![早くなった.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/763e43bb-454e-3c71-eeee-0de18f60ea06.png)


4秒！？

めちゃ早くなってる！！

これ以降、重さに悩まされることは無くなりました

本当に良かったー


# 最後に
あくまで今回のは、いち環境で発生していた問題を解消した程度のお話です

ですが、Git操作が重く・遅くなってしまった時に試す価値は十分にあると思いました！

ご参考になれば幸いです！
【ABC解説】 ABC380 解説 (B~D)【Python】

AtCoder Beginner Contest 380 のB問題〜D問題をPythonで解説します。

https://atcoder.jp/contests/abc380

# 提出コード

https://github.com/Syogo-Suganoya/AlgoArena/tree/main/atcoder/ABC/ABC380

# B問題
https://atcoder.jp/contests/abc380/tasks/abc380_b

## 問題
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/264a3975-4cab-b1a9-1677-973122f97ebc.jpeg)

<details><summary>画像の文字起こし</summary>

1区切りに-入った文字列が与えられます。
区切りごとの1の個数を求めてください。

</details>

## アプローチ
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/f36ba9cd-10c8-35d4-2218-f37859e3c91f.jpeg)

<details><summary>画像の文字起こし</summary>

文字列を」ごとに区切ります。
区切りごとの文字数を出力します。

</details>

# C問題
https://atcoder.jp/contests/abc380/tasks/abc380_c

## 問題
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/af48fe59-1e00-a0f4-2ee8-905afbd2d95b.jpeg)

<details><summary>画像の文字起こし</summary>

0と1からなる文字列があります。
K番目の1の文字列の塊をその直前の0の塊と入れ替えた文字列を出力してください。

</details>

## アプローチ
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/a8b050ff-e3e0-b563-e73f-fd71970dad00.jpeg)

<details><summary>画像の文字起こし</summary>

0または1ごとに区切ります。
K番目に出てくる1とその直前の要素を交換します。

</details>

# D問題
https://atcoder.jp/contests/abc380/tasks/abc3_d

## 問題
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/78a7626c-75e3-7cdb-f8cf-6ebf1f562a3d.jpeg)

<details><summary>画像の文字起こし</summary>

文字列Sがあります。この文字列に以下の操作をQ回行った際の、
K番目の文字列を求めてください。
操作
・まず、Sの大文字を小文字に、小文字を大文字に書き換えた文字列をTとする。
・その後、SとTとをこの順に連結した文字列を新たなSとする。

最初の2文字目までは、操作前の文字列です。
3~4文字目は1~2文字目の大文字小文字を反転した文字列です。

最初の4文字目までは、操作前の文字列です。
5~8文字目は1~4文字目の大文字小文字を反転した文字列です。

</details>

## アプローチ
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/36959175-9077-dedc-4bf5-1fee07243b05.jpeg)
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/26447576-7448-878c-9d30-a4ecdf0349fa.jpeg)

<details><summary>画像の文字起こし</summary>

次の2段階で解きます。
・対象の文字を取得
・大文字小文字が反転されているかを算出
対象の文字を取得
Kを元の文字列数で割った時の余りから対象の文字を特定できます。

大文字小文字が反転されているかを算出
Kを元の文字列数で割った時の商（軽数切捨て）から算出できます。
商を2進数にした時の1の個数が偶数なら元の文字列のまま、奇数なら反転です。

反転を2進数で判定できる理由
1の個数を反転の回数としてみなせます。なので、奇によって反転かを判定できます。
5~6文字目は1~2文字目を反転した文字列が来ています。

7~8文字目は3~4文字目を反転した文字列が来ています。
つまり、元の文字列から反転が2回されているので、元の文字列が来ます。

</details>
Ubuntu でプロキシサーバを作るメモ

定期的に「プロキシ環境での通信の検証をしたいな〜」となって毎回調べながら適当な VM に Squid を立てるということやっているので、いい加減手順をまとめておこうというやつ。

## 作るもの
Ubuntu 24.04 上で、すげー簡易的に Squid サーバを動かす。

認証や ACL などの細かい設定はしない。

ちょっとした動作確認に使う用途でしかなく、本番運用はまったく想定していない。

## 手順

### Squid をインストール
``` console
$ sudo apt install squid
```

Systemd で自動起動するように設定したほうがいいのかと思ったが、インストールしただけで勝手に `enabled` になっていた。

### Squid を設定
設定ファイルの冒頭に以下を追記。

※ Squid の設定ファイルは上から評価されていくっぽく、`allow all` を末尾に追記するとそれ以前にデフォルトで書かれている `deny all` が先に評価されて通らない)

``` :/etc/squid/squid.conf
acl all src 0.0.0.0/0
http_access allow all
```

もちろんこの設定はガバなので、何らか別の方法 (Amazon EC2 であればセキュリティグループ) でアクセス制限はしておく。


### Squid の設定変更を反映
``` console
$ sudo systemctl reload squid
```

## 動作確認
事前に、テストしたいクライアントから TCP 3128 ポートへ接続できるようにしておく。

``` console
$ curl --proxy http://{proxy_ip}:3128 globalip.me
```

curl コマンドでプロキシ設定をしつつ http://globalip.me/ に接続することで動作確認する。この Web サイトはクライアントのグローバル IP アドレスを返してくれるので、今回構築したプロキシサーバのグローバル IP アドレスが返ってくれば成功といえる。(他にも類似サービスはあった気がする)
Docker でpostgresql サーバを立てたが FATAL: password authentication failed for user "XXX"

### 問題
DockerでPostgreSQLのサーバを立てたもののホストマシン側からpsqlによる接続ができない。
コンテナ内部でパスワードを変えたりしても認証が通らない。

### 原因
5432 portの競合が起きていた。

### 対応
netstat -naoを実行して、5432のportを使用しているPIDを特定。
PID指定してプロセスを終了する。
再度コンテナを起動すると接続できた。

### 学び
portの競合が起きている場合でもコンテナって起動することがあるんだ。

### 参考
https://github.com/sameersbn/docker-postgresql/issues/112
起業するならElixirシリーズSTEP20.人材マネジメント

https://qiita.com/Yoosuke/items/9a96f059ce84c239559a

こちらの続きです。

## 人材マネジメント

コーポレートガバナンスの次は、人材マネジメントです。
人材マネジメントは、企業の持続的な成長を支える重要な要素です。というか、まず現状はお願いしたい仕事ができる人の人手不足です。単に人数が不足してるのではなくお願いしたいスキルセットを持った人材が足りてないイメージです。

私が思うに、そもそも市場のルールが変わっているのに対して、変わる以前の認識で過ごしている人が多いように思います。

そんな中で、適切な人材の確保、育成、定着は経営の最重要課題の一つです。

### なぜ人材マネジメントが重要か

1. 組織の成長と人材の関係
- 事業の成長速度と人材の成長速度の整合性
- 組織規模の拡大に伴う管理体制の必要性
- 企業文化・価値観の維持と発展

2. 起業初期段階で急激に成長する際の特有の課題
- 限られたリソースでの人材確保
- 急速な成長に対応できる人材育成
- 変化の激しい環境での適応力
- 優秀な人材の定着

### 人材マネジメントの主要な要素

#### 1. 採用戦略
- 必要な人材の定義
  * 求める能力・スキル
  * 文化適合性
  * 成長ポテンシャル
- 採用チャネルの確立
  * 直接採用
  * 人材紹介会社の活用
  * 副業・フリーランス活用
- 採用プロセスの設計
  * 選考基準の明確化
  * 面接プロセスの標準化
  * オンボーディング計画

#### 2. 育成体制
- 教育研修制度
  * OJTプログラム
  * 技術研修
  * マネジメント研修
- キャリア開発支援
  * キャリアパスの明確化
  * スキル開発機会の提供
  * メンター制度

#### 3. 評価・報酬制度
- 公平な評価システム
  * 評価基準の明確化
  * 定期的な評価面談
  * フィードバックの仕組み
- 適切な報酬設計
  * 基本給の設計
  * インセンティブ制度
  * ストックオプション等の制度
- 福利厚生
  * 各種保険・手当
  * 働き方の柔軟性
  * 健康管理支援

#### 4. 組織文化・風土づくり
- コミュニケーションの活性化
  * 定期的な1on1
  * 全体ミーティング
  * 部門間交流
- チームビルディング
  * 共通の目標設定
  * 協働の機会創出
  * 成功体験の共有
- 働きやすい環境整備
  * オフィス環境
  * リモートワーク対応
  * ワークライフバランス

### 実践的なアプローチ

1. 短期的な施策（3ヶ月以内）
- 基本的な人事制度の整備
- 採用プロセスの確立
- 評価基準の明確化

2. 中期的な施策（6-12ヶ月）
- 教育研修プログラムの開発
- 報酬制度の体系化
- キャリアパスの設計

3. 長期的な施策（1年以上）
- 人材育成の体系化
- 組織文化の醸成
- グローバル人材戦略の検討

### 人材マネジメントにおける重要なポイント

1. 一貫性の確保
- 経営理念との整合性
- 長期的な視点での制度設計
- 公平性・透明性の担保

2. 柔軟性の維持
- 環境変化への対応
- 個人の多様性への配慮
- 制度の継続的な改善

3. エンゲージメントの向上
- 帰属意識の醸成
- モチベーション管理・成長機会の提供

このように、人材マネジメントは単なる制度づくりではなく、人と組織の持続的な成長を支える総合的な取り組みとして捉える必要があります。特に起業して急成長する企業では、限られたリソースの中で最大限の効果を生み出すための戦略的なアプローチを持っておきたいです。
【Rails】例外処理について

## エラーには2種類ある✌️
### ①業務エラー
**→ ユーザーに不備がある際のエラー**
- ユーザー登録時にパスワードの文字数が少ない
- 権限のないページにアクセスした
- すでに登録済みのメアドでユーザー登録をしようとした

【画面設計】
- バリデーションエラー

【内部処理】
- saveメソッドなどでtrue/falseを返し、分岐処理をさせる必要がある
- モデルのバリデーションで検証し、エラー内容はモデルのerrorsに格納する

### ②システムエラー
**→ システム運用者、開発者に不備がある**
- データベースがダウンしている
- マイページ画面の実装にバグがある
- データ異常やデータの不整合がある
- API連携の失敗

【画面設計】
- 500エラー

【内部処理】
- ログへのエラー出力と、500エラー画面の表示はRailsが自動でやってくれる
- データを保存するとき、「普通に考えると業務エラーが起こらない場合」や「万一エラーが起きたら処理を中止したい場合」はsaveじゃなくsave!メソッドを使用

## 例外を捕捉して処理を続行する🚶
例外が発生したときに例外処理を書いておかないと、例外が発生した時点でプログラムが停止してしまい、それ以降に記述してあるコードが読み込まれない
### 基本的な方法

```begin```
- 何かエラーが起きた場所で例外処理という方法でエラーを通知する
- 例外処理では、エラーが起きた場所で例外オブジェクトを生成し、呼び出し元に返す
- 処理しない場合は、順番に上の呼び出し元に返されていき、最終的にはプログラムが異常終了する

```rescue```
- 例外が発生した際に、この部分以下の処理を実行する

:::note
プログラムの実行をストップさせないために、```begin```〜```rescue```〜```end```のブロックを作成して、例外オブジェクトを「捕捉」して適切な処理を行わないといけない
:::

```ruby
begin
  # 通常の処理
rescue
  # エラー発生時の処理
end
```


### 例外オブジェクトから情報を取得する方法
- Rubyで発生した例外自身もオブジェクト
- 例外オブジェクトのメソッドを呼び出すことで、情報を取得することができる

　↓↓Exceptionクラス（全ての例外の祖先のクラス）

https://docs.ruby-lang.org/ja/latest/class/Exception.html

```ruby
begin
  # 通常の処理
rescue => e         # 例外オブジェクトを格納する変数
  puts e.class      # エラークラス
  puts e.message    # エラーメッセージ
  puts e.backtrace  # バックトレース(メソッドの呼び出し状況を表したデータ)
end
```
>バックトレースとは・・・大雑把にいうと「メソッドの呼び出し状況を表したデータ」です。バックトレースを使うと、以下のようなことができます。
・メソッドがどこから呼び出されたかを調べる
・例外が発生された場所を偽装する
引用：https://magazine.rubyist.net/articles/0031/0031-BackTrace.html

### 例外クラスを指定して捕捉する例外を限定する方法
- rescue には、捕捉する例外の種類を書くことが出来る
- 複数のresucueを指定することも可能
- 注意点としては、指定した例外クラス以外は捕捉されないのでプログラムは異常終了する
```ruby
begin
  # 通常の処理
rescue ArgumentError # 捕捉したい例外クラス
  # エラー発生時の処理
rescue StandardError # 捕捉したい例外クラス
  # エラー発生時の処理
end
```

## 参考記事
https://qiita.com/jnchito/items/3ef95ea144ed15df3637#%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%A6%E7%90%86%E3%81%A8%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%96%A2%E4%BF%82

https://speakerdeck.com/jnchito/number-rubykansai-2018-01-13

https://www.youtube.com/watch?v=jFBvEQhApKQ
【Rails】トランザクションについて


## データベーストランザクション
- 大雑把に言うと複数レコードに対する更新を一括で保存する（コミット）
- もしくは一括でキャンセルする（ロールバック）
- データベースの重要な機能
- トランザクションを適切に扱えば、致命的なデータの不整合を防ぐことができる

### transaction

- saveメソッドを複数呼び出す場合は、transactionブロックの使用を検討する
- after_createなどのActive Recordコールバック機能は、自動でトランザクションになっている
- transactionブロックは「全件成功」か「全件失敗」の処理となる
- データベース内の情報の整合性を保つための手段
- 複数のデータベースにまたがる分散トランザクションはサポートしていない
- 使用するにはデータベースがトランザクションをサポートしていることが必要

https://railsdoc.com/page/transaction


## 参考記事
https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
iOSアプリ開発をキャッチアップしている話

## 前書き
私は普段Androidアプリエンジニアとして働いています。これまでiOSエンジニアが不足している状況で一時的に画面の実装や改修を手伝った経験はありました。しかしアーキテクチャやライブラリの選定といった部分に関わる機会はここ数年あまりありませんでした。

Androidアプリ開発がJetpack ComposeやKotlin Coroutinesの登場で大きく変化したように、iOSアプリ開発の世界でもSwiftUIやCombine、Swift Concurrencyなどが広く使われ始めています。

そこで最近、個人的な興味としてiOSアプリ開発を改めてキャッチアップしています。今回はその学習内容をアドベントカレンダーの記事としてまとめました。
Androidエンジニア視点での比較も交えながら記載するので、同じようにiOSアプリ開発をキャッチアップする方の参考になれば幸いです。

## 1. UI (SwiftUI)
### 1-1. SwiftUI とは
- **iOS13** から登場した **宣言的UIフレームワーク**
- Androidで言う **Jetpack Compose** と似た思想で、Viewをコードベースで宣言し、データや状態が変化すると画面が自動的に再構築される

### 1-2. UIKit（従来のUI実装）との違い
- **UIKit**: `UIViewController` や `UIView` を継承し、Auto Layout・Storyboardなどで Imperative（命令的）にUIを記述していた。  
- **学習コスト**: UIKitに慣れたエンジニアには新しい概念だが、Android の Jetpack Compose に触れたことがあれば比較的スムーズに理解できる。  
- **互換性**: 既存プロジェクトに SwiftUI を少しずつ導入するハイブリッド構成も可能（UIKit 上に SwiftUI を埋め込む、またはその逆）

### 1-3. Androidエンジニア目線でのポイント
- Jetpack Composeで宣言的UIのパラダイムに慣れていれば大まかなイメージは同じ
- **Preview 機能**などもComposeと同様に用意されており、画面の即時フィードバックが得られる
- Storyboardを使って実装していた頃よりかなり取っ付きやすくなった

## 2. 非同期処理(Combine/Swift Concurrency)
### 2-1. Combine
- Apple製の **リアクティブプログラミング用フレームワーク**
- `Publisher` と `Subscriber` という概念でイベントストリームを扱う  
- Androidの **Kotlin Coroutines Flow** や **RxJava/RxKotlin** に近い動作概念

### 2-2. RxSwift との比較
- **Combine** は Apple 公式フレームワークとして OS の各機能と親和性が高い
- **RxSwift** はサードパーティとして豊富なオペレータや実績があるが、Combine の登場以降、公式を優先する風潮が強まりつつある
Androidアプリ開発におけるRxからKotlin Coroutinesに移行する流れと近い。

### 2-3. Swift Concurrency
- iOS15 以降は **Swift Concurrency** も導入され、Combine と組み合わせるケースが増えている。  
- 特に `async/await` は Coroutines と似た感覚で直感的に書きやすい。  
- Combine と Swift Concurrency は共存可能だが、場面に応じて使い分けるプロジェクトが多い

## 3. パッケージ管理
### 3-1. Carthage / CocoaPods から Swift Package Manager (SPM) へ
- **CocoaPods**: 一時期は iOS開発のデファクトスタンダードだったが、`Podfile` や `Pod install` 等の煩雑な管理が必要
- **Carthage**: 観測範囲だとここ最近は使われなくなりつつある(?)
- **Swift Package Manager (SPM)**: Apple公式のパッケージ管理。Xcode上で直接ライブラリを追加・管理可能。設定が簡潔で、CocoaPodsよりも標準的に使われつつある

### 3-2. SPM のメリット
- **公式ツール** なので Xcode との統合がスムーズ。  
- `Package.swift` というSwiftベースのファイルで依存を記述。  
- Gitリポジトリさえあれば独自ライブラリとして管理もしやすい

## 4. DI
### DIのAndroidとiOSの違い
- **Android**  
  - Google 製の **Dagger / Hilt** がデファクトスタンダード
  - Kotlin では **Koin** など軽量なDIフレームワークも人気  
- **iOS**  
  - 公式の DI フレームワークは存在しない
  - サードパーティで **Swinject**, **Needle**, **Resolver** などが有名(?)
  - Androidよりも 自前DI（コンストラクタ注入） で完結する場面が多い

## その他トピック

以降はまだ学習中のトピック

### Swift
Swift5.9で所有権など多くの機能が追加された

### アーキテクチャ 

TCA (The Composable Architecture) をよく見聞きする機会が増えたが、まだ学習しきれていない。AndroidでいうとCompose + MVI が近い?

### データ永続化についてのトレンド
- **Realm**: iOS/Android 双方で使われるDBライブラリだったが、AndroidではRoomが定番化。iOSだと **Realm** を今でも使っているプロジェクトが多い印象

# まとめ

**SwiftUI**、**Combine、Swift Concurrency**、**Swift Package Manager**、**TCA** などが、ここ数年でモダンiOS開発の中心的存在になっている。
Androidエンジニアから見ると、**Jetpack Compose**・**Kotlin Coroutines**・**MVI** と類似した関係にあるため、全体像をつかむハードルはそこまで高くなさそう
ただし、DI周りやデータ永続化(Core Data)などは iOS特有の文化が残っているため、Androidエンジニアの感覚でそのまま移行すると違和感を覚えることもある
(途中)Combined loading L-shaped beam(1/2) はりのたわみと不静定はり 発展例題6.21 P172「材料力学演習(20221021)」をsympyでやってみたい。

・途中です。申し訳ありません。

:::note info
次　 [(2/2)AI先生に聞きました。](https://qiita.com/mrrclb48z/items/b4d0e8f6db3fdc926379)
:::


  # オリジナル
[発展例題6.21 P172 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=177)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
？？？タブレット等で、pdfを開く事ができないかも。？？？　

#### 参考文献
- 村上敬宜. (2023). *材料力学* (新装版). 森北出版.　
5.6 ... 組み合わせによるはりのたわみ 　　例題5.8　p100
5.7 はりの曲げにおけるひずみエネルギー 例題5.11 p105


# sympyで
・ver0.1
```python
# ver0.1
from sympy import *
var('EIz,GIp,P,l1,l2,φB,φC')
vC=P/(3*EIz)*l2**3
vB=P/(3*EIz)*l1**3
eq=Eq(φB-φC    ,P*l2*l1/GIp)
eq=Eq(eq.lhs*l2,eq.rhs*l2  )
print("#",str(vC)+"+"+str(vB)+"+"+str(eq.rhs))   
# P*l2**3/(3*EIz)+P*l1**3/(3*EIz)+P*l1*l2**2/GIp
```

・ver0.2
```python
# ver0.2
```


・ver0.3
```python
# ver0.2
```


# 申し訳ありません。作図は適当にしました。sympyのBeamで。
```python

```

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)　開発環境

# いつもと違うおすすめです。
・力Pが平面に垂直方向に作用

・力Pが平面上　　　　に作用。以前、YouTubeで教えてもらっていました。

https://qiita.com/mrrclb48z/items/762bca5fde074347d900
「わからないこと」について考える

業務をする上で必ず「わからないこと」が出てくると思います。
今回は、この「わからないこと」について、自分なりに考えていることなどをまとめました。

具体的には、「わからないこと」を質問したい時、どうすればいいか？ということと、
質問された時、どう答えてあげたらいいか？についてまとめました。

# 「わからない」とは？
作業進めていると、下記のようになってしまうことはありませんか？

「全体的にわからない」
「ここが動かなくなっちゃった、なんでだろう」
「資料読んだけどさっぱりわからない」

こうなると、調べたり考えたりしてもわからなくなってしまうから、上司や先輩に質問をしにいきますよね。
でも、この状態で質問してしまうと、受け取った側としては、

「全体的ってどこがわからないの？」
「変な処理があるんじゃない？そこ確認したらいいでしょ」
「資料を読んだらわからないことなんて無いと思うけど」

と答えざるを得なくなってしまうと思うんですよね。
そうなると、余計に自分の頭を悩ましてしまいます。

なので、まずは、どこがわからないのかを突き詰めることが大事になってきます。

# どこがわからないのか考える
「わからないこと」があると、ストレスを感じますよね。
どこから手をつけたらいいの？どうやって実装したらいいの？だとか、先へ進めなくて疲弊します。

そのストレスを解消するためにおすすめなのが、「どこがわからないのか」を紙に書き出していくことです。

例えば、「この用語がわからない」だとか、「この処理が動かなくてわからない」だとか。
そういうのを全部紙に書き出してみましょう。
そうすると、自ずと、「どこがわからないのか」が見えてくると思います。
出てきた疑問を調べ、考えることで、「わからないこと」が徐々に解消されていきます。
また、わからないままだとしても、「どうしてわからないのか？」に思考が変化しているはずです。

「わからないこと」を細分化することが、自分が知りたいこと・聞きたいことにつながってきます。

# 質問する時、考えること
もしあなたが質問される側だとして、「わからないんです！」と言われても、
「こっちも何を教えてあげたらいいかわからないよ！」となってしまいますよね。

なので、予め「どういった質問をすれば回答がもらえるのか」を考えるのが大事です。

「「わからない」とは？」で出した質問例を使って考えてみます。

「全体的にわからなくって…」
→「この部分の、この記述の意図わからないので教えていただきたいです」など、具体的にする

「ここが動かなくなっちゃって…」
→自分で作成した処理だとしたら、
「Aの処理は動いていますが、Bの処理から動かなくて、原因がわからないんです」など、どこまで動いているのか？を相手に伝える
または、「このURLのこの実装を参考に作成したんですけど、うまくいかなくて困っています」など、どのように対応してみたのか？を伝える

「資料読んだんですけど、わかんなくって…」
→「この用語を調べたんですが、どういう意味で使われているかがわからないです」と質問をしたり、
「資料の中の、この部分をどのように実装したらいいかから、理解できていなくて教えていただきたいです」と伝える

大事なことは、「自分が、どこがわからないのか？」を詳細に伝えることになってくると思います。

また、質問する際には、下記を意識するといいです。
・質問内容を予め紙にメモしておく
・いくつか質問がある場合は、質問する際に「◯点ほど質問があります」など、先に伝える
・何を参考にしたのか、どのような対応を行なったのかなど、自分がやってみたことを伝える

そうすることで、相手にも自分にも負担にならない質問ができるようになります。

# 質問された時、考えること
質問された時に気をつけることは、「すぐに回答を出さないこと」ではないでしょうか。
一旦、質問内容を受け止め確認をしてから回答するのが大事になってくると思います。

例えば、「ここのページの編集って、どうやってやったらいいですか？」と質問されたとします。
ノータイムで「え？自分で考えて編集したらいいよ」って答えちゃいそうですが、これではダメですよね。

まずは相手の質問内容を確認してから、回答をするようにしましょう。

質問者「このページの編集って、どうやったらいいですか？」
「このページの編集方法がわからないんですね？」
質問者「そうです。管理画面などがありますか？」
「そうですね、管理画面の中に〇〇というページがあるので、そこから編集してください。管理画面のURLなどの詳細は、先ほどチャットで送ったので確認してもらえますか？」
質問者「わかりました。」

こんな感じになるんじゃないかな？と。

質問された時、絶対に言っちゃいけないとのは、
「なんでわからないの？」とか、「自分で考えて」のような、相手を責めたり突き放してしまうことだと思います。
まず相手の質問を聞き確認して、考えてから回答してあげましょう。

また、質問があるということは、そもそも、自分のタスクの振り方に不備があったのでは？と考えるのも大事です。

長年一緒に仕事をしてきた相手だったら、詳細に伝えなくてもやってもらえるかもしれませんが、
新入社員や、初めて同じチームになったメンバーの場合、わからないことだらけなのが当たり前です。
なので、「私なら/〇〇さんなら、これでわかるのにな〜」ではなく、詳細までわかるように伝えてあげましょう。

# まとめ
長々と書きましたが、まとめると下記になります。

質問する時に気をつけること
・質問内容を予め紙にメモしておく
・いくつか質問がある場合は、質問する際に「◯点ほど質問があります」など、先に伝える
・何を参考にしたのか、どのような対応を行なったのかなど、自分がやってみたことを伝える

質問された時に気をつけること
・相手を否定しない、突き放さない
・質問された内容を復唱して、確認してから回答をする
・そもそも自分の伝え方に不備があったのでは？と考える
→タスクを詳細に伝え直す＋どこまでわかったか？を確認してあげる！


何年も働いていても、「わからないこと」はたくさん出てきます。
わからなかったらたくさん質問しましょう。
【基礎確認】pythonのdotenvモジュール

# はじめに
[LangChainとLangGraphによるRAG・AIエージェント［実践］入門](https://www.amazon.co.jp/dp/B0DK4YGYBL?tag=xpg-22&linkCode=ogi&th=1&psc=1)
を読んでいて、10章で躓いたので、初心に戻って、一つずつ紐解いて学習することにしました。
今回のテーマは「dotenv」モジュール

# 前回までの投稿
1. 必要なライブラリとモジュールをインポートする
[【基礎確認】pythonのoperatorモジュール](https://qiita.com/o_chan_t/items/4ad3cd5fc832f9be9d86)
[【基礎確認】pythonのtypingモジュール](https://qiita.com/o_chan_t/items/1f54806ad90c79904af2)

# 事前作業
python実行ディレクトリに`.env`というファイルを作成し
```
API_KEY=i0NT1K4m-ls5j0i4Q-ic1A6bMAbwNm5KY4
```
というキーを保存しておく。
（記載しているキーはダミー）

# サンプルコード

```sample.py
from dotenv import load_dotenv
import os

# .envファイルから環境変数を読み込む
load_dotenv()

# 環境変数を取得して表示
api_key = os.getenv("API_KEY")
print(f"API Key: {api_key}")
```

## 解説
dotenvモジュールを使用して.envファイルから環境変数を読み込み、その値を取得する。

1. `from dotenv import load_dotenv`で、dotenvモジュールからload_dotenv関数をインポート。
2. `import os`で、環境変数を取得するためのosモジュールをインポート。
3. `load_dotenv()`を呼び出して、.envファイルから環境変数を読み込む。
4. `os.getenv("API_KEY")`を使用して、"API_KEY"という名前の環境変数の値を取得。
5. 取得した値を表示。
Qiitaアドカレ完走賞を目指して毎日アウトプットするぞ！

こんにちは、ふるすです。
実は今、アドカレ完走賞を目指して毎日投稿中です。

7月にDevRelに異動してきてから悩んでいました。

技術広報として私には何ができるんだろう？開発経験のない私が出せる強みって…？
**うん、思いつかない！！！！！**

ないことはないと思うんです。
過去の経験を生かして、SNSの運用について考えてみるとか。
人前に出ることへの抵抗感が一切ないのは強みかなと思っているので、外部イベントに参加してみたりとか。

本を読んでみたり、技術広報職の方のブログを読んでみたりもしました。

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

技術広報のアドカレもありますよね。私も23日に投稿予定です。

https://qiita.com/advent-calendar/2024/tech_pr

でも、やっぱり圧倒的に開発に対しての知識と理解がないのがどうしても気になって。
なのに
「〇〇書きたい方募集！」
「外部登壇に興味のある方募集！」
はなんか違う気がする。自分の中で筋通ってない気がする。

![images (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827898/5ce9dfe4-f822-764d-0405-21f5ff5b0a22.jpeg)

**質のことを考えるのは次のフェーズだ！まずは数！一つのことをやりきろう！**
というわけで、ひとりアドカレをスタートしたのでした。

https://qiita.com/advent-calendar/2024/advent_hitori

思い立ったのが12月中旬頃だったので急いで記事を書き溜めて投稿しています(アドベントカレンダーとは…)。

書いてみたかったネタはたくさんあるので＋インプットのいい機会なので最後まで頑張ります:fire:
Javaで「パターンとマッチした部分文字列を置換する文字列の中で参照する」の動作を確認してみた

# 概要

Javaで「パターンとマッチした部分文字列を置換する文字列の中で参照する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index28.html

# 実装

以下のファイルを作成しました。

```JSample28_1.java
import java.util.regex.*;

class JSample28_1{
  public static void main(String[] args){
    String target = "BB AA CC BB";
    System.out.println(target);

    String regex = "\\b[^ ]+\\b";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher(target);
    System.out.println(m.replaceAll("[$0]"));
  }
}
```

以下のコマンドを実行しました。

```
$ java JSample28_1 
BB AA CC BB
[BB] [AA] [CC] [BB]
```

# まとめ

何かの役に立てばと。
【2024年版】VsCode + NVDAで上手にプログラミングする方法

これは[no plan inc.の Advent Calendar 2024](https://qiita.com/advent-calendar/2024/noplan_inc)の19日目の記事です。

この記事は、2022年末頃に書いた [NVDA+VsCode の記事
](https://qiita.com/oaisk1414/items/4bc765f20ec632a896ac) の追記です。  
ここ2年ほどで大きく変わったポイントとしては、**IndentNavのアップデート**が挙げられます。

## IndentNav のアップデート

以前はVsCodeでIndentNavを使う場合、VsCode用のIndentNavアドオンだけ入れておけばよかったのですが、アプデによって現在は「NVDA用のIndentNavアドオン」＋「VsCode用のヘルパーアドオン」を組み合わせる必要があります。

具体的には、NVDAのアドオンストアからIndentNavをインストールし、さらに下記のVsCode拡張を導入します。

- [NVDA Indent Nav Accessibility for VSCode
](https://marketplace.visualstudio.com/items?itemName=TonyMalykh.nvda-indent-nav-accessibility)

### 変わった点

1. ナビゲーション操作が、Home/Endキーではなくテンキー操作になった。  
   （個人的には「どっちでもいいかな」という感じ。別のアドオンとの衝突が減ったので嬉しいぐらい。）

2. スキップしたコード量をビープ音でフィードバックしてくれるようになった。  
   これは大きい改善で、コード全体をイメージしながら移動できるようになりました。
   
## 統合ターミナルのアクセシビリティ強化

VsCodeの統合ターミナルのアクセシビリティが大幅強化されました。  
以前は出力が読みにくかったり、上下キーでコマンド履歴に戻った際、文字読み上げがバグるなどの不具合があり、Windows Terminalなどを併用するケースも多かったと思います。

しかし現在地カーソルバグは改善され、今はスクリーンリーダーユーザー向けに専用コマンド **Alt+F2** が追加され、プレーンテキストで出力を閲覧できるようになりました。

## それでも出力を見るなら「ファイル経由」がおすすめ

とはいえ、超長い出力を扱う場合などは、Alt+F2経由では不便なこともあります。  
そこで、コマンドの結果をファイルにリダイレクトしてから読む方法を紹介します。

### 手順

1. `.bashrc`に以下の関数`ep`を定義します。

   ```bash
   ep(){
	"$@" &> $HOME/TerminalOutputs/firstLog.json
   }
   ```

   これで、`ep`コマンドを先頭につければ、結果が`$HOME/TerminalOutputs/firstLog.json`へ出力されます。  
   例：`ep git log`

2. VsCodeでは、この出力先ファイルを常に3番目のタブで開いておいて、`Ctrl+3`でパッと切り替えられるようにしておくと便利です。

### なぜファイル出力がおすすめ？

- 超長い出力でも問題なく読める  
- 例えば`git diff`がめっちゃ長くて、`git diff`をすると  pagerモード に以降してAlt+F2で読めないことがある。
- `git diff | cat` などでpagerを回避しても、Alt+F2だと超長い場合は見切れる
- Alt+F2は一度閉じると、また同じ出力に戻るのが面倒。  
- ファイル出力なら、別タブで他ファイルを見た後など、`Ctrl+3`ですぐ先程の出力に戻って確認できる。

### デメリット

- 常に3つ目のタブに結果ファイルを開いておく必要がある。  
  私はこのコマンドで開いています。
  
  ```bash
  code -r $HOME/TerminalOutputs/firstLog.json
  ```

- デフォルトでは、タブが空になると自動でグループが閉じてタブ番号がズレる問題があります。  
　例えばタブ2のファイルを閉じると、タブ3がタブ2になってしまいます。
  これが起きると面倒なのでsettings.jsonに以下を追加しておくとよいです。
  
  ```json
  "workbench.editor.closeEmptyGroups": false,
  ```

以上の方法を使うと、個人的にはAlt+F2を経由せずに、ファイル出力で結果を確認したほうがラクだったりします。

## まとめ

他にもコマンド実行の終了を音でアナウンスしてくれたり、
ファイル保存時のフォーマットをアナウンスしてくれたり、
copilot系の機能の通知音もあったりと、VsCodeはアクセシビリティ頑張ってくれてます！


### no plan株式会社について

* no plan株式会社は、ブロックチェーン技術、Webサイト開発、ネイティブアプリ開発、チーム育成、などWebサービス全般の開発から運用や教育、支援などを行っています。よくわからない、ふわふわしたノープラン状態でも大丈夫！ご一緒にプランを立てていきましょう！
* [no plan株式会社について](https://noplan-inc.com/)
* [no plan株式会社 | web3実績](https://noplan-inc.com/web3)
* [no plan株式会社 | ブログ一覧](https://noplan-inc.com/blog)