OmniAICreator/Qiita-1.07M huggingface dataset:
プログレッシブデリバリーを導入してスクラム開発を加速させる方法


## はじめに
スクラム開発を行っている皆さん、こんにちは！今回は、プログレッシブデリバリーを導入することで、どのようにスクラム開発を加速させるかについてお話しします。プログレッシブデリバリーは、リリースのリスクを最小限に抑えつつ、迅速に新機能を提供するための手法です。クラウドベンダーのサービスを活用することで、さらに効果的に実現できます。

## プログレッシブデリバリーとは？
プログレッシブデリバリーは、機能フラグやカナリアリリース、A/Bテストなどの技術を組み合わせて、段階的に新機能をリリースする手法です。これにより、リリースのリスクを分散し、問題が発生した場合でも迅速に対応できます。

### 主な技術
- **機能フラグ**: 特定の機能をオン/オフするフラグを用意し、ユーザーごとに異なる機能を提供。
- **カナリアリリース**: 新機能を一部のユーザーにのみ提供し、問題がないことを確認してから全ユーザーに展開。
- **A/Bテスト**: 複数のバージョンを同時に提供し、どちらがより効果的かを比較。

## クラウドベンダーのサービスを活用する
クラウドベンダーは、プログレッシブデリバリーをサポートする多くのサービスを提供しています。以下にいくつかの例を挙げます。

### AWS
- **AWS AppConfig**: 機能フラグの管理とカナリアリリースをサポート。
- **Amazon CloudWatch**: リリース後のモニタリングとアラート設定。

### Google Cloud
- **Google Cloud Deployment Manager**: インフラのコード化と段階的なデプロイをサポート。
- **Google Cloud Monitoring**: リリース後のパフォーマンス監視。

### Microsoft Azure
- **Azure App Configuration**: 機能フラグの管理。
- **Azure Monitor**: リリース後のモニタリングとアラート設定。

## スクラム開発との相性
プログレッシブデリバリーは、スクラム開発と非常に相性が良いです。スクラムのスプリントごとに新機能をリリースする際、プログレッシブデリバリーを導入することで、リリースのリスクを最小限に抑えつつ、迅速にフィードバックを得ることができます。

### メリット
- **リスクの分散**: 段階的にリリースすることで、問題が発生した場合でも影響を最小限に抑えられます。
- **迅速なフィードバック**: 一部のユーザーにのみ新機能を提供することで、早期にフィードバックを得ることができます。
- **継続的な改善**: フィードバックを元に迅速に改善を行い、次のスプリントに反映させることができます。

## 導入のステップ
1. **計画**: プログレッシブデリバリーを導入するための計画を立てます。どの機能を段階的にリリースするか、どのユーザーに提供するかを決定します。
2. **実装**: 機能フラグやカナリアリリースの設定を行います。クラウドベンダーのサービスを活用して、設定を簡単に行いましょう。
3. **モニタリング**: リリース後のパフォーマンスを監視し、問題が発生した場合に迅速に対応できるようにします。
4. **フィードバック**: ユーザーからのフィードバックを収集し、次のスプリントに反映させます。

## まとめ
プログレッシブデリバリーを導入することで、スクラム開発をさらに効果的に進めることができます。クラウドベンダーのサービスを活用することで、設定やモニタリングが簡単になり、リリースのリスクを最小限に抑えることができます。ぜひ、皆さんのプロジェクトでもプログレッシブデリバリーを導入してみてください！
HashCorp Valutでシークレット情報のバージョンを更新してみる

## はじめに
HashiCorp Vaultは、機密情報の安全な保存、アクセス制御、秘密管理を行うためのツールです。今回は、Vaultを使ってシークレット情報のバージョンを更新し、異なるバージョンのシークレットにアクセスする方法について説明します。

前回の記事:

https://qiita.com/tobita_yoshiki/items/54c9bd35350cec24e840

https://qiita.com/tobita_yoshiki/items/e07d34fc73cf9c6034fb

## バージョン更新

まず、新しいバージョンのシークレット情報をVaultに書き込みます。以下のコマンドを使用します。

```shell
vault kv put -mount=secret hello k=v
```

このコマンドにより、`hello`というパスに`k=v`というキーバリューのペアが保存されます。以下のようなメッセージが表示されます。

```
== Secret Path ==
secret/data/hello

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-09T08:18:52.472183Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            2
```

## 各バージョンにアクセス

次に、Vaultから保存したシークレット情報を読み取ります。最新バージョンのシークレット情報を取得するには、以下のコマンドを使用します。

```shell
vault kv get -mount=secret hello
```

このコマンドにより、`hello`というパスに保存されたデータが表示されます。

```
== Secret Path ==
secret/data/hello

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-09T08:18:52.472183Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            2

== Data ==
Key    Value
---    -----
k      v
```

特定のバージョンのシークレット情報を取得するには、`-version`オプションを使用します。以下に例を示します。

```shell
vault kv get -version=1 -mount=secret hello
```

このコマンドにより、バージョン1のデータが表示されます。

```
== Secret Path ==
secret/data/hello

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-09T08:01:44.354577Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1

=== Data ===
Key    Value
---    -----
foo    world
```

バージョン2のデータを取得する場合は以下のコマンドを使用します。

```shell
vault kv get -version=2 -mount=secret hello
```

```
== Secret Path ==
secret/data/hello

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-09T08:18:52.472183Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            2

== Data ==
Key    Value
---    -----
k      v
```

## バージョン履歴の確認

ブラウザで`http://127.0.0.1:8200/ui/vault/secrets/secret/kv/hello/details?version=1`にアクセスすると、バージョン1のシークレット情報が確認できます。また、バージョン履歴も確認することができます。

バージョン履歴:
![スクリーンショット 2024-07-09 17.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/e8ced2f0-c345-f2ee-0cc7-de8969fa6355.png)

バージョン1のシークレット:
![スクリーンショット 2024-07-09 17.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/ebd8df06-de17-3937-8c10-89ad24a0ad4d.png)

バージョン2のシークレット:
![スクリーンショット 2024-07-09 17.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/28116264-d9fe-a7c0-dd5c-70fe3f844796.png)

## まとめ

今回は、HashiCorp Vaultを使ってシークレット情報のバージョンを更新し、異なるバージョンのシークレットにアクセスする方法について説明しました。Vaultを使用することで、シークレット情報のバージョン管理を簡単に行うことができます。Vaultのバージョン管理機能を活用して、シークレット情報の安全な管理を行いましょう。
【備忘録】初めてのiOSアプリ開発 第3回 weakってなに？

## weak とは
・循環参照を防ぐために使用されるキーワード
主にメモリ管理のコンテキストで使われ、オブジェクト間の参照が弱い（non-owning）参照であることを示します。

## 循環参照とは
2つ以上のオブジェクトが互いに強い参照を持つことで、メモリから解放されなくなる問題。これによりメモリリークが発生する。weakはこの問題を解決するための手段の一つです。
循環参照などが発生すると、参照カウントがゼロにならず、オブジェクトの生存期間が終了しません。これにより、メモリリークが発生します。弱い参照（weak）や非所有参照（unowned）を使用して循環参照を防ぐことが重要です。

## 弱い（non-owning）参照
・オブジェクト間の参照が弱い（non-owning）参照とは、オブジェクトAがオブジェクトBを参照しているが、その参照によってオブジェクトBの生存期間を管理しないことを意味します。
・弱い参照（weak参照）は参照先オブジェクトの参照カウントを増やしません。そのため、参照先オブジェクトが他の強い参照を持たない場合、参照カウントが0になり、メモリから解放されることが可能です。

### weakの特徴
１.弱い参照（Non-owning reference）: weakによる参照はオブジェクトを所有しません。参照されているオブジェクトの参照カウントを増やしません。

2.自動的にnilに設定される: 参照されているオブジェクトが解放されると、weak参照は自動的にnilに設定されます。このため、weak参照はオプショナル型（Optional）である必要があります

### 参照カウント
・メモリ管理のための技術で、オブジェクトがメモリから解放される時期を管理する仕組み。
・あるオブジェクトに対する参照をカウントし、そのカウントがゼロになったときオブジェクトをメモリから解放します。

## 関連用語
|関連用語   |説明      　|    
|:--------------------------|:-------------------------|
|メモリリーク　|コンピュータで実行中のプログラムが確保したメモリ領域の解放を忘れたまま放置してしまい、利用可能な空き領域が失われる現象。動作の不具合を招く。|
|コンテキスト|利用者の意図や状況、環境などの総体を表したり、同じ処理や記述でも状況に応じて動作などが異なる場合に、その選択基準となる判断材料や条件などを指す|
|生存期間|オブジェクトが生成されてからメモリから解放されるまでの間を意味する。オブジェクトがメモリに存在し、アクセス可能な期間のことを指します。|


 ## 参考サイト
 https://qiita.com/dojyorin/items/0bd3ef167991cfc703b1
 
 https://e-words.jp/w/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF.html
HashiCorp Vaultでキーバリューの読み書きを試してみる

## はじめに
HashiCorp Vaultは、機密情報の安全な保存、アクセス制御、秘密管理を行うためのツールです。今回は、Vaultを使ってキーバリューの読み書きを試してみます。

前回の記事:

https://qiita.com/tobita_yoshiki/items/54c9bd35350cec24e840

## Vaultにログインする

まず、Vaultにログインします。以下のコマンドを使用します。

```shell
export VAULT_ADDR='http://127.0.0.1:8200'
vault login
```

ログイン時には、トークンを入力する必要があります。以下のメッセージが表示されればログイン成功です。

```
Token (will be hidden):
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                  Value
---                  -----
token                hvs.cUc2WCAxO9JrYScSzJc2wbwo
token_accessor       YGSJU6WSEXgPnU6T3pMj7tms
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]
```

## キーバリューの書き込み

次に、Vaultにキーバリューのペアを保存します。以下のコマンドを使用します。

```shell
vault kv put -mount=secret hello foo=world
```

このコマンドにより、`hello`というパスに`foo=world`というキーバリューのペアが保存されます。以下のようなメッセージが表示されます。

```
== Secret Path ==
secret/data/hello

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-09T08:01:44.354577Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1
```

また、ブラウザで`http://127.0.0.1:8200/ui/vault/secrets/secret/kv/list`にアクセスすると、以下のように保存されたデータを確認できます。

![スクリーンショット 2024-07-09 17.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/c0fb430e-7028-ae52-19c5-6d89404e3d37.png)

![スクリーンショット 2024-07-09 17.03.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/665ac2c9-ad2c-b474-c11a-0e64ac2dc1f4.png)

## キーバリューの読み取り

最後に、Vaultから保存したキーバリューのペアを読み取ります。以下のコマンドを使用します。

```shell
vault kv get -mount=secret hello
```

このコマンドにより、`hello`というパスに保存されたデータが表示されます。

```
== Secret Path ==
secret/data/hello

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-09T08:01:44.354577Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1

=== Data ===
Key    Value
---    -----
foo    world
```

## まとめ

今回は、HashiCorp Vaultを使ってキーバリューの読み書きを行う方法を紹介しました。Vaultを使用することで、機密情報を安全に管理することができます。詳細な手順については、[HashiCorp Vaultの公式ドキュメント](https://developer.hashicorp.com/vault/tutorials/getting-started/getting-started-dev-server)も参照してください。
HashCorpValutをローカルで立ち上げてみる

## はじめに
HashiCorp Vaultは、機密情報の安全な保存、アクセス制御、秘密管理を行うためのツールです。今回は、Vaultをローカル環境で立ち上げる方法について説明します。

## インストール

まず、Vaultをインストールします。以下のコマンドをターミナルに入力します。

```shell
brew tap hashicorp/tap
brew install hashicorp/tap/vault
```

このコマンドにより、HashiCorpのリポジトリがHomebrewに追加され、Vaultがインストールされます。

## 起動

インストールが完了したら、Vaultを開発モードで起動します。以下のコマンドを実行します。

```shell
vault server -dev
```

開発モードでの起動に成功すると、以下のようなメッセージが表示されます。

```
You may need to set the following environment variables:

    $ export VAULT_ADDR='http://127.0.0.1:8200'

The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.

Unseal Key: AjmBF604U9UH/6fFXVvNLQTCDev7ck6CSdfDZxcTT8I=
Root Token: hvs.cUc2WCAxO9JrYScSzJc2wbwo

Development mode should NOT be used in production installations!
```

このメッセージに記載されている通り、以下の環境変数を設定する必要があります。

```shell
export VAULT_ADDR='http://127.0.0.1:8200'
```

この設定により、Vault CLIがローカルで起動しているVaultサーバーと通信できるようになります。

## Vault UIへのアクセス

Vaultの開発モードを使用すると、ウェブUIを使ってVaultにアクセスすることもできます。ブラウザで`http://127.0.0.1:8200`にアクセスすると、以下のようなログイン画面が表示されます。

![スクリーンショット 2024-07-09 16.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/e1be6dc6-6eb5-7167-2aed-921b6449b604.png)

Root Tokenを入力してログインします。Root Tokenは起動時のメッセージに表示されています。

ログインに成功すると、以下のようなVaultのダッシュボードが表示されます。

![スクリーンショット 2024-07-09 16.53.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/79108a35-a9f4-4cb2-47b9-da91987f08e6.png)

## まとめ

今回は、HashiCorp Vaultをローカル環境で立ち上げる方法について説明しました。
開発モードは本番環境には適していませんが、Vaultの基本的な操作を学ぶ環境として有益と考えています。

詳細な手順については、[HashiCorp Vaultの公式ドキュメント](https://developer.hashicorp.com/vault/tutorials/getting-started/getting-started-dev-server)も参照してください。
システムの可観測性を向上させるためのベストプラクティス


## はじめに
システムの可観測性（Observability）は、現代のソフトウェア開発において非常に重要な要素です。可観測性が高いシステムは、問題の早期発見と迅速な解決を可能にし、結果としてシステムの信頼性とパフォーマンスを向上させます。この記事では、クラウドベンダーのサービスを活用しながら、システムの可観測性を向上させるためのベストプラクティスについて解説します。

## 可観測性の基本要素
可観測性は主に以下の3つの要素から成り立っています。

1. **ログ**: システムの動作を記録するためのテキストデータ。
2. **メトリクス**: システムのパフォーマンスや状態を数値で表すデータ。
3. **トレース**: システム内のリクエストの流れを追跡するためのデータ。

これらの要素を適切に収集・分析することで、システムの状態を正確に把握することができます。

## クラウドベンダーのサービスを活用する
クラウドベンダーは、可観測性を向上させるための多くのサービスを提供しています。以下に代表的なサービスとその活用方法を紹介します。

### AWS CloudWatch
AWS CloudWatchは、AWSのリソースとアプリケーションの監視サービスです。ログ、メトリクス、アラームを一元管理できるため、システムの可観測性を大幅に向上させることができます。

- **ログの収集**: CloudWatch Logsを使用して、アプリケーションやシステムのログを収集・保存します。
- **メトリクスの監視**: CloudWatch Metricsを使用して、CPU使用率やメモリ使用量などのメトリクスを監視します。
- **アラームの設定**: CloudWatch Alarmsを使用して、特定の条件が満たされたときに通知を受け取ることができます。

### Google Cloud Operations Suite
Google Cloud Operations Suite（旧Stackdriver）は、Google Cloud Platform（GCP）の監視・管理ツールです。ログ、メトリクス、トレースを統合的に管理できます。

- **ログの収集**: Cloud Loggingを使用して、GCPリソースやアプリケーションのログを収集します。
- **メトリクスの監視**: Cloud Monitoringを使用して、システムのパフォーマンスをリアルタイムで監視します。
- **トレースの分析**: Cloud Traceを使用して、リクエストの遅延やエラーの原因を特定します。

### Azure Monitor
Azure Monitorは、Microsoft Azureの監視サービスです。ログ、メトリクス、アラートを統合的に管理できます。

- **ログの収集**: Azure Monitor Logsを使用して、Azureリソースやアプリケーションのログを収集します。
- **メトリクスの監視**: Azure Monitor Metricsを使用して、システムのパフォーマンスを監視します。
- **アラートの設定**: Azure Monitor Alertsを使用して、特定の条件が満たされたときに通知を受け取ることができます。

## ベストプラクティス
システムの可観測性を向上させるための具体的なベストプラクティスを以下にまとめます。

### 1. ログの一元管理
ログはシステムの動作を記録する重要なデータです。ログを一元管理することで、問題の原因を迅速に特定できます。クラウドベンダーのログ管理サービスを活用し、ログの収集・保存・分析を行いましょう。

### 2. メトリクスのリアルタイム監視
メトリクスはシステムのパフォーマンスや状態を数値で表すデータです。リアルタイムでメトリクスを監視することで、異常を早期に検知できます。クラウドベンダーのメトリクス監視サービスを活用し、重要なメトリクスを監視しましょう。

### 3. トレースの活用
トレースはシステム内のリクエストの流れを追跡するためのデータです。トレースを活用することで、リクエストの遅延やエラーの原因を特定できます。クラウドベンダーのトレースサービスを活用し、リクエストの流れを可視化しましょう。

### 4. アラートの設定
アラートは特定の条件が満たされたときに通知を受け取るための仕組みです。アラートを適切に設定することで、問題が発生した際に迅速に対応できます。クラウドベンダーのアラートサービスを活用し、重要なイベントに対するアラートを設定しましょう。

## まとめ
システムの可観測性を向上させることは、現代のソフトウェア開発において非常に重要です。クラウドベンダーのサービスを活用し、ログ、メトリクス、トレースを適切に収集・分析することで、システムの状態を正確に把握し、問題の早期発見と迅速な解決を実現しましょう。この記事で紹介したベストプラクティスを参考に、システムの可観測性を向上させてください。
MapとWeakMapとガベージコレクションと

## Map の型
### Map
`Map`はキーとそれに対応する値を保持する機能を持つ組み込みオブジェクトです。
キーとして任意の値を用いることができ、オブジェクトをキーとすることも可能です。

また、`Map`の型は`Map<K, V>`のように表されます（Kはキーの型、Vは値の型です）。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map

### Map の操作
`Map`にキーと値を追加するには`set`メソッドを利用します。

`Map`に格納された値を取得する`get`メソッドや、引数として渡したキーが`Map`に保持されているかを判定できる`has`メソッドなどもあります。

```ts
type KeyObj = { key: string }
const map: Map<string | KeyObj, number> = new Map()

const keyObj: KeyObj = { key: 'value' }

map.set(keyObj, 210)

console.log(map)
// Map (1) {{ "key": "value" } => 210} 

console.log(map.has(keyObj))
// true

console.log(map.has({ key: 'value' }))
// false
```
`{ key: 'value' }`というオブジェクトをキーとしてMap に渡すことができています。

取り出すときには、`set`で登録したオブジェクトと同じ参照をもつオブジェクトを渡す必要があります。
同じ構造のオブジェクトを渡しただけでは、別のキーとしてみなされてしまうわけですね。

### Mapの値を列挙する
`Map`には`keys`、`values`、`entries`といった、保持している値を列挙するためのメソッドも備わっています。
これらのメソッドの返り値はイテレータと呼ばれるもので、ループ処理での使用頻度が高いです。
```ts
const map: Map<string|KeyObj,number> = new Map()
type KeyObj = {key: string}
const keyObj: KeyObj = {key: 'value'}
map.set('key1',1234)
map.set(keyObj,210)

for(const key of map.keys()){
console.log(key)
}
//"key1" 
//{"key": "value"} 

for(const value of map.values()){
console.log(value)
}
//1234
//210

for(const[key, value] of map.entries()){
    console.log(key)
    console.log(value)
}
//"key1" 
//1234 
//{"key": "value"} 
//210 
```

## WeakMap
`Map`に似た組み込みオブジェクトに`WeakMap`というものがあります。
`Map`と違って列挙を行うためのメソッド（`keys`、`values`、`entries`）を持たず、キーとしてはオブジェクト（もしくはnon-registered なシンボル）のみを設定することができ、数値や文字列を設定することはできません。
```ts
const weakMap = new WeakMap()
//Argument of type 'string' is not assignable to parameter of type 'object'.ts(2345)
weakMap.set('str','test')
//実行時エラーが発生（Invalid value used as weak map key）
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/WeakMap

### ガベージコレクション
ガベージコレクションとは、使用しなくなったメモリを自動で解放する仕組みのことです。
`WeakMap`はこのガベージコレクションを目的として採用されることがあります。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Memory_management#%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3


`WeakMap`が`Map`と異なる点として、キーへの参照が弱参照である点があります。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_management#garbage_collection

このことは、キーとして設定できる値がオブジェクトかnon-registered なシンボルしか許されていない理由の一端となっています。
registered なシンボルはガベージコレクションの対象とならないため、`WeakMap`のキーとしての使用が許可されていないようです。
>Because registered symbols can be arbitrarily created anywhere, they behave almost exactly like the strings they wrap. Therefore, they are not guaranteed to be unique and are not garbage collectable. Therefore, registered symbols are disallowed in WeakMap, WeakSet, WeakRef, and FinalizationRegistry objects.


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#shared_symbols_in_the_global_symbol_registry

`Map`でキーとして使用されているオブジェクトは、`Map`自体がガベージコレクトされない限りはガベージコレクションの対象とならず、メモリ上に保持され続けます。
これは、`Map`がキーを列挙するメソッドを持っているため、キーとして登録されたオブジェクトが不要になったと判断できないためです。
焦げ付いたプロジェクトとはかくもあらん

初めてのSESで焦げ付いた案件にjoinし、無事に◯亡しました。

簡単に状況をシェア。

# 状況

## 【1】プロジェクトリリース1ヶ月前に全てを握る前々PMがロクな引き継ぎなしに転職

しかもお客様には「テストリリース1日前倒せますよ」などという履歴を見て、僕は戦慄しました。

心の声ぼく
『こいつ退職するの分かってようこんな無責任なことできるな...』
『この暴挙をPdMは何故に許してんのや...』
『せめて後に任せても問題ないように引き継ぎ徹底しとけよ』

## 【2】前PMがいきなりリタイア

僕がjoinして2日後、彼の霊圧は消えました。

彼が持っていた、ほんの僅かな引き継ぎ資料にもアクセス不能な状態に。

## 【3】PM経験ゼロわい、PMに大抜擢（絶望

もうむちゃくちゃ／(^o^)＼

後で先輩エンジニアに聞いても、やはりひどすぎる状況だったようです。

## 【4】その後

僕も体調崩しそうになり、業務遂行がうまくできない状態に。

仕方ないので退職して、今は転職活動中です。

おしごとください...（泣

# 得られた教訓

- 転職活動に手を抜くのはとても良くない
- ひどいSESは本当に存在する
- 想像できないようなひどい現場も本当に存在する
- 思ったよりも簡単に人は壊れる（少なくとも僕は）

正直、もっと頑張れると思っていましたが無理でした。

肉体面では色々と対策して以前よりもタフになったのですが、精神面は全く別のケアが必要でした。

状況は良くないですが、今はやるべきことをコツコツと積み上げます。
【Next.js】styled-componentsの導入方法

## 00. styled-componentsとは
styled-componentsはReact向けに作られたCSS in JSライブラリの一つです。スタイルをJavaScript内で定義し、コンポーネントごとにスタイルを管理できるため、スタイルの重複や競合を防ぎやすくなります。
本記事ではNext.jsでstyled-componentsを使用するための初期設定の方法を記します。

## 01. styled-componentsのインストール
まずは対象のプロジェクト内で以下コマンドを実行し、パッケージをインストールします。
```bash
$ npm install --save styled-components
```
今回はTypeScriptを使用するため型定義の`@types/styled-components`もインストールします。
```bash
$ npm install --save-dev @types/styled-components
```

## 02. next.config.mjsの設定
next.config.mjsのファイルに以下の設定を追加し、compilerオプションのstyled-componentsを有効化します。
```js
/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  //以下を追加
  compiler: {
    styledComponents: true,
  },
};

export default nextConfig;
```

## 03. サーバーサイドレンダリングのサポート設定
SSRやSSGを使用する際に、サーバーサイドでスタイルを適用させるための設定が必要です。これにより、ページの初回読み込み時に正しくスタイルが適用されるようになります。pages/_document.tsxファイルを作成し、以下の設定を追加します。

```tsx
import Document, { DocumentContext } from 'next/document';
import { ServerStyleSheet } from 'styled-components';

// デフォルトのDocumentクラスを拡張してカスタムDocumentクラスを作成
export default class MyDocument extends Document {
  static async getInitialProps(ctx: DocumentContext) {
    const sheet = new ServerStyleSheet();
    const originalRenderPage = ctx.renderPage;

    try {
      // Appコンポーネントをラップし、スタイルを収集
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: (App) => (props) => sheet.collectStyles(<App {...props} />),
        });

      // 初期プロパティを取得
      const initialProps = await Document.getInitialProps(ctx);

      // initialPropsにスタイルを追加して返す
      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        ),
      };
    } finally {
      sheet.seal();
    }
  }
}
```
準備はこれで完了です。

## 04. 実際に書いてみる
試しにpages/index.tsxでstyled-componentsを使ってみます。
```tsx
//書式
styled.要素名`スタイル`
```
`styled.要素名`で要素を指定し、直後のテンプレート文字列の中でスタイルを定義します。
以下でh1要素にスタイルを適用したTitleコンポーネントを定義します。
```tsx
import type { NextPage } from 'next';
import styled from 'styled-components';

const Title = styled.h1`
  color: red;
`;
const Home: NextPage = () => {
  return (
    <div>
      <Title>Hello World</Title>
    </div>
  );
}

export default Home;
```

サーバーを起動し、ブラウザで確認するとスタイルの適用が確認できます。
![スクリーンショット 2024-07-08 121644.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153171/998e2aa6-5036-af0d-6401-ad0ab0566321.jpeg)

以上でNext.jsでのstyled-componentsの導入設定は完了です。

**参考記事一覧**
- [styled-componentsドキュメント](https://styled-components.com/)
- [styled-componentsの使い方について解説！Next.jsでの導入方法](https://dev-harry-next.com/frontend/styled-components-in-nextjs)
スマホで簡易的に実績を知りたい～Googleフォーム・Googleスプレッドシート・LINEBOTを使って件数リマインダーを作成してみた

はじめましてTOMと申します。
現在、仕事でどのようにしてデジタルを結び付けることが出来るかを模索している三十路越えです。
まず手始めにLINEBOTを作成してみました。

※自己紹介記事はこちら

https://note.com/tom678174/n/n2f9e6067c4ba

# 1. 使用ツール
**●Make**
**●LINEBot**
**●Googleスプレッドシート**
**●Googleフォーム**

# 2. やりたかったこと
仕事柄「昨日の実績は？」と聞かれることが多いですが、うっかり出てこないこともしばしば。
保管しているデータから実績を引っ張り出そうとも、「ノートPC立ち上げなきゃ、、、」とか「回線悪くてデータ開かねぇ、、、」というシチュエーションも。
そこで、日々の業務終わりに数値を入力しておくことで、LINEに日付を打ち込んだらすぐに件数が出るBOTを作成しました。

# 3.BOTの流れ
**①Googleフォームに実績を入れる**
<br>

![Googleフォーム見本](https://media.discordapp.net/attachments/1260563547952250936/1260564481939869818/Google_0710.png?ex=66965f28&is=66950da8&hm=bb922249884a3cd31e36594589327ad0bfae9b855457d03c58f906867e72a040&=&format=webp&quality=lossless&width=1164&height=1357)


**②スプレッドシートとリンク。日付を〇月〇日表記に変換**
<br>
![スプレッドシート見本](https://media.discordapp.net/attachments/1260563547952250936/1260564483135377529/BOT_0710.png?ex=66965f28&is=66950da8&hm=787ce05a600060175de8c0c4c67e440568ff70325a821564020b79d127536353&=&format=webp&quality=lossless&width=693&height=1357)

**③LINEに〇月〇日と入力すると実績が返ってくる（完成系はこちら）**


https://x.com/tom678174/status/1811008073961505189

Make全体シナリオ
<br>
![Make全体シナリオ](https://media.discordapp.net/attachments/1260563547952250936/1260564483437494314/0710.png?ex=66965f29&is=66950da9&hm=29acad31301556418117e3b12b505068f7823ebfdc9fe0e6c2dbb13d678a1367&=&format=webp&quality=lossless&width=2128&height=916)


# 4. 改良するならば
想定したシチュエーションとしては、
**現場スタッフがGoogleフォームを入力→私含む営業社員がLINEで確認**
なので、実用性を求めるならば店舗別で呼び出せるようにする必要がある（今回は1店舗運営を想定）

**また、例えば天気とか繫忙期とか実績分析するための外的要因をAPI連携とかできると分析が捗りそうである**

# 5.最後に
せっかくスプレッドシートを利用するならば、Googleフォームも使おうと思い、今回は簡易的な実績確認BOTを作成しました。
他のアイデアとして、例えば予算表を予めスプレッドシートで作成する、「今日の予算何件だっけ？」BOTとかは実用性がありそうでした。

~~あとは、個人情報は入れられないなど運用面で制約は発生するので、その辺りの調整含めて実用化するにはまだまだだなぁ、、、笑~~
【Java】開発未経験者が10日間でJava Gold SE11に合格した話

# ■はじめに
運よくまとまった時間が取れて10日間でJava Gold SE11に合格出来たので、その時の勉強方法をまとめてみました。
受験時の自分のレベルとしては以下のような感じです。

**・現場での開発は未経験**
**・Spring Bootを使用して簡単なサービスを作ったり個人的にJavaの学習はしていた。**

# ■この記事の対象者
・Java Goldの資格取得を考えている方

※Java Goldを受験するにはJava Silverに合格している必要があります。
　よろしければJava Silverに合格したときの記事もご参照ください。

https://qiita.com/kiiiiiinusu/items/256bd648312536683a24

# ■もくじ
**1.使用教材&試験日までのスケジュール**
**2.学習ロードマップ**
**3.まとめ**

# 1.使用教材&試験日までのスケジュール
**使用教材：**
黒本のみ
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810401/af5d4bb2-4a84-0be1-2d7b-7fb5f8af1954.jpeg">

**試験日までのスケジュール：**

:::note info
学習期間：10日間
学習時間：45時間
1日の勉強時間：4〜5時間
:::

・0日目
リサーチ

・1日目～４日目
黒本1周目

・5日目～7日目
黒本2周目

・8日目〜10日目
黒本3周目

# 2.学習ロードマップ
※スケジュールの詳細

**・0日目：リサーチ**
学習のための教材だったり、期間の目安だったりを空き時間にサクッと調べました。
調べるとJava Silverの時と同様、黒本だけでも合格出来そうだったので黒本だけで学習することにしました。

**・1日目～4日目：黒本1周目**
1周目は理解するというよりかは、試しに一通り解いてみて解説をザッと読む程度にしました。

**・5日目～7日目：黒本2周目**
１周目で概要は掴めていたので問題をきちんと考えて解いて、なんでその答えになるのか理解できるように丁寧に解説を読み込みました。
リサーチ時に「第2章　関数型インタフェースとラムダ式」と「第4章　ストリームAPI」が重要であることは把握していたので、特に丁寧に読み込みました。
※実際にこの2つの章がベースになることが圧倒的に多かったので非常に重要です。

**・8日目～10日目：黒本3周目**
一通り解いて間違えた問題を中心に最終確認を行いました。

:::note info
なお、それぞれの正答率は以下のとおりです。

**1周目・・・正答率 2.6割**
**2周目・・・正答率 6.6割**
**3周目・・・正答率 8.3割**

※正答率は総仕上げ問題の第13章のものですが、各章の正答率も似たような感じです。
:::

# 3.まとめ
結果合格ライン「63％」のところ、「**82％**」で合格出来ました！
![スクリーンショット 2024-07-23 21.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810401/ad02be01-cbb0-b89b-d613-1e8b4905c5d0.png)


もちろんほぼ初見の問題もありましたが、黒本だけでもJava Goldの合格は可能です！

:::note warn
※注意
自分が受験したとき（2024年6月時点）はまだ日本で公開されていませんでしたが、新しくJava Gold SE17の認定試験が近々開始されると思います。
開始直後だと黒本も未出版だと思いますので、受験時はお気をつけください。
:::

この記事が皆様の合格の一助になれば幸いです。
それでは、良い学習ライフを！！！
サードパーティの依存関係を定期的に見直す重要性とその方法


## はじめに

ソフトウェア開発において、サードパーティのライブラリやサービスを利用することは一般的です。これらの依存関係は、開発の効率を大幅に向上させる一方で、定期的な見直しが必要です。この記事では、サードパーティの依存関係を定期的に見直す重要性とその方法について解説します。

## サードパーティの依存関係とは？

サードパーティの依存関係とは、外部のライブラリやサービスを指します。これらは自分たちで開発するのではなく、他の開発者や企業が提供するものを利用します。例えば、データベース接続ライブラリ、認証サービス、クラウドストレージなどが該当します。

## なぜ見直しが必要なのか？

### セキュリティリスクの軽減

サードパーティのライブラリやサービスは、セキュリティホールが発見されることがあります。定期的に見直すことで、最新のセキュリティパッチを適用し、リスクを軽減することができます。

### パフォーマンスの向上

新しいバージョンのライブラリやサービスは、パフォーマンスの改善が行われていることが多いです。定期的に見直すことで、アプリケーションのパフォーマンスを向上させることができます。

### 互換性の維持

依存関係が古くなると、他のライブラリやフレームワークとの互換性が失われることがあります。定期的に見直すことで、互換性を維持し、開発のスムーズさを保つことができます。

## 見直しの方法

### 1. 依存関係のリストアップ

まずは、現在使用しているサードパーティの依存関係をリストアップします。これには、ライブラリのバージョンや使用しているサービスの詳細も含めます。

### 2. 最新情報の確認

次に、各依存関係の最新バージョンやリリースノートを確認します。これにより、どのような変更が行われたのかを把握できます。

### 3. テスト環境での検証

最新バージョンにアップデートする前に、テスト環境で動作確認を行います。これにより、問題が発生しないかを事前に確認できます。

### 4. 本番環境への適用

テスト環境で問題がなければ、本番環境に適用します。この際、バックアップを取ることを忘れずに行いましょう。

### 5. 定期的なスケジュールの設定

見直しを定期的に行うためのスケジュールを設定します。例えば、月に一度や四半期に一度など、チームの状況に合わせて設定します。

## まとめ

サードパーティの依存関係を定期的に見直すことは、セキュリティリスクの軽減、パフォーマンスの向上、互換性の維持など、多くのメリットがあります。この記事で紹介した方法を参考に、定期的な見直しを実施してみてください。

## 関連記事

- [依存関係管理のベストプラクティス](https://qiita.com/your_username/items/xxxxxx)
- [セキュリティリスクを軽減するためのチェックリスト](https://qiita.com/your_username/items/yyyyyy)
- [パフォーマンス向上のための最適化手法](https://qiita.com/your_username/items/zzzzzz)

## おわりに

この記事が、サードパーティの依存関係を見直す際の参考になれば幸いです。定期的な見直しを行い、より安全で効率的な開発を目指しましょう。
フリーランスエンジニアとなって経済的自由を得る方法（5.投資）

こんにちは、5つ目は投資に関する記事です。
投資に関してはネットでも情報が溢れていますが、本当に罠が多いので「如何に手を出さないか」が経済的自由を目指す上で必要になります。

# 目次
　　　[1.貧すれば鈍する 一攫千金を狙わない](#1貧すれば鈍する-一攫千金を狙わない)
　　　[2.例え一攫千金が実現できても破綻する](#2例え一攫千金が実現できても破綻する)
　　　[3.スタンダードな投資から始めるのが一番](#3スタンダードな投資から始めるのが一番)
　　　[4.ポジポジ病を避ける](#4ポジポジ病を避ける)


# 1.貧すれば鈍する 一攫千金を狙わない

色んな研究でもお金がないと判断力が鈍る結果が出ています。

思ったよりお金が溜まらない→仕事でストレスが溜まる→自由が欲しいと一攫千金を狙う→貯金がなくなる、というループが良くあるパターンです。

このループから外れることが大事です。
コツコツ1,000万円程度貯めると「守り」の力が手に入り、折角貯めたお金を守りたいという意識が働きます。

## 2.例え一攫千金が実現できても破綻する

資産が急激に増えるとその投資方法に依存します。
例えばFXや仮想通貨で一気に資産を増やせたとしても、逃げ切るのは難しく、無限にお金を求めてしまい、結局残らないという話です。
さらに、鉄の意志で途中で辞めたとしても、急激に消費が増えてそのうち生活が破綻するリスクもあります。

興味がある方は
・パーキンソンの法則
・ラチェット効果
などで検索してみてください。

## 3.スタンダードな投資から始めるのが一番

結局何の投資をしたらよいのかという話ですが、NISAとiDeCoでオルカン or S&P500の積立が一番という話になります。

昔はMT4でMQL書いたり、ZAIFでAPI呼び出しとか書いてましたが、結局S&P500積立＆放置でいいじゃんという結論になりました。

「コツコツ続ける」ということが大事で、一番難しいです。他の投資を一切せずに、生活防衛資金を貯めた後は金融資産額500万を超えるまでインデックス投資の積立をやってみてください。

人によって違うと思いますが、コツコツ資産を増やしていくと、どこかのタイミングで急に投資に対して冷静に対応できることができます。貧すれば鈍する、から抜け出す瞬間ですね。

ある程度資産形成が進むまではインデックス一本で投資は完結させ、余った時間を自分の使うべき時間に使うのが一番資産形成が早いと思います。色々なことに手を出して失敗するのが典型パターンです。

<b>十分ベースができてきたら</b>、高配当株や債券なども考えてよいと思いますが、基本的にインデックスに比べ上級者向けの投資手法だと思います。

## 4.ポジポジ病を避ける

インデックス投資一本をオススメしている理由ですが、レバレッジを掛けたり、値動きの激しいFXや仮想通貨に手を出すと、値動きが気になって何度も口座の画面を見たり、取引を繰り返してしまうことがあります。

これが取引依存症(ポジポジ病)です。お金と時間がごっそり持っていかれ、経済的自由どころか生活に大きな支障が出ます。インデックス投資は更新頻度が一日一回以下なので、何度も口座を見ても意味がないので、この点も安心です。

---
投資については他のブログやYoutubeのチャンネルも解説されている通り、オルカンとS&P500をコツコツ積み立てるのが基本かつ王道です。

余り投資については書くことはないのですが、私たちはエンジニアなのでそもそも投資に時間を掛けず、自分の技術を伸ばすことに時間を使うべきです。

さて、お待たせしました次は売上に関する記事になります！
LeetCode挑戦日記：Day33

# はじめに

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

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

# [Easy] 104. Maximum Depth of Binary Tree

二分木の根が与えられたとき、その最大深度を返します。
二分木の最大深度は、根ノードから最も遠い葉ノードまでの最長経路に沿ったノードの数です。

## 素直に解いてみる

### 考え方

1. 再帰関数を使ってノードの数を加算していく
1. 各ノード毎にその葉ノードの最大数を比較していく

### コーディング

```typescript
function maxDepth(root: TreeNode | null): number {
    if (!root) {
        return 0;
    }
    return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
};
```

### 結果

Runtime：53ms
Beats 95.74%

Memory：53.53MB
Beats 70.06%
運用コストを定期的に評価する: スクラム開発でのベストプラクティス


## はじめに

クラウドサービスを活用したプロダクト開発が一般的になり、運用コストの管理がますます重要になっています。特にスクラム開発では、スプリントごとに運用コストを評価し、最適化することが成功の鍵となります。この記事では、運用コストを定期的に評価するためのベストプラクティスについて解説します。

## 運用コストの評価が重要な理由

### 1. コストの透明性を確保する

クラウドサービスは利用した分だけ料金が発生するため、予期せぬコストが発生することがあります。定期的にコストを評価することで、どのサービスがどれだけのコストを生んでいるかを明確にし、無駄な支出を防ぐことができます。

### 2. 予算管理の精度を向上させる

プロジェクトの予算を正確に管理するためには、運用コストの予測が欠かせません。定期的な評価を行うことで、予算オーバーを防ぎ、計画通りにプロジェクトを進めることができます。

### 3. パフォーマンスの最適化

運用コストを評価することで、どのリソースが過剰に使用されているか、どの部分がボトルネックになっているかを特定できます。これにより、リソースの最適化を図り、パフォーマンスを向上させることができます。

## スクラム開発における運用コスト評価の方法

### 1. スプリントレビューでのコスト評価

スプリントレビューの際に、運用コストの評価を行うことを習慣化しましょう。チーム全体でコストの状況を共有し、次のスプリントでの改善点を議論します。

### 2. 自動化ツールの活用

クラウドベンダーが提供するコスト管理ツールを活用することで、運用コストの評価を自動化できます。例えば、AWSのCost ExplorerやAzureのCost Managementなどを利用すると、詳細なコスト分析が可能です。

### 3. コストアラートの設定

予算を超えそうな場合や、異常なコストが発生した場合にアラートを設定しておくことで、迅速に対応できます。これにより、予期せぬコストの増加を防ぐことができます。

## 実際の事例

### 事例1: サーバーレスアーキテクチャのコスト最適化

あるプロジェクトでは、AWS Lambdaを利用したサーバーレスアーキテクチャを採用していました。スプリントごとにLambdaの実行時間とコストを評価し、不要な関数の削除やメモリ設定の最適化を行うことで、運用コストを30%削減することができました。

### 事例2: データストレージのコスト管理

別のプロジェクトでは、Azure Blob Storageを利用して大量のデータを管理していました。定期的にストレージの使用状況を評価し、古いデータのアーカイブや削除を行うことで、ストレージコストを20%削減することができました。

## まとめ

運用コストを定期的に評価することは、スクラム開発において非常に重要です。コストの透明性を確保し、予算管理の精度を向上させ、パフォーマンスを最適化するために、スプリントごとにコスト評価を行いましょう。自動化ツールやコストアラートを活用することで、効率的にコスト管理を行うことができます。

運用コストの評価を習慣化することで、プロジェクトの成功に一歩近づくことができるでしょう。
LeetCode挑戦日記：Day32

# はじめに

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

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

# [Medium] 2130. Maximum Twin Sum of a Linked List

サイズが`n`であるリンクリストにおいて、`n`が偶数の場合、リンクリストの`i`番目のノード（0インデックス）は、`0 <= i <= (n / 2) - 1`の場合に`(n-1-i)`番目のノードの双子と見なされます。

例えば、`n = 4`の場合、ノード`0`はノード`3`の双子であり、ノード`1`はノード`2`の双子です。
`n = 4`の場合、双子を持つノードはこれらのみです。
双子の和は、ノードとその双子の和として定義されます。

偶数長のリンクリストの先頭が与えられたとき、リンクリストの最大双子和を返します。

## 素直に解いてみる

### 考え方

1. `val`を全て取得する
1. 双子の和を比較し、最大双子和を探す

### コーディング

```typescript
function pairSum(head: ListNode | null): number {
    const values: number[] = [];

    let node = head;
    while (node) {
        values.push(node.val);
        node = node.next;
    }

    let max = 0;
    for (let i = 0; i < (values.length / 2); i++) {
        let sum = values[i] + values[values.length - i - 1];
        if (max < sum) {
            max = sum;
        }
    }

    return max;
};
```

### 結果

Runtime：160ms
Beats 44.89%

Memory：81.13MB
Beats 48.17%

## 他の方の解法

### 考え方

1. 連結リストの前半を逆順にする
1. 連結リストの後半の最初のnodeを見つける
1. 双子和を比較していく

### コーディング

```typescript
function pairSum(head: ListNode | null): number {
    let slow = head
    let fast = head
    let prev = null

    

    while (fast && fast.next) {
        fast = fast.next.next

        const tmp = slow.next
        slow.next = prev
        prev = slow
        slow = tmp
    }

    let max = 0

    while (slow) {
        max = Math.max(slow.val + prev.val, max)
        slow = slow.next
        prev = prev.next
    }

    return max
};
```
【CentOS】yum installするときに、リポジトリを指定してインストールする

## はじめに
業務で古いCentOSを触ることがあり、yum installでリポジトリを指定してインストールする作業がありました。
役に立つかわかりませんが、記録として書いておきます。

## コマンド
```zsh
yum install -y --enablerepo=<リポジトリ名>,<リポジトリ名> <インストールしたいライブラリ名>
```
GitHub Actionsでプルリクエストのタイトルなどの情報を取る方法

GitHub Actionsでは、プルリクエストをトリガーに実行される場合、対象となるプルリクエストの情報を取得することができます。

# プルリクエスト情報の取得方法

Github Actionsでは、`${{ github.event.pull_request }}`で渡される変数の中に、workflowがトリガーされた際の情報が入っています。

```yaml
on:
  pull_request:
    types:
      - opened

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - タイトルを出力
        run: echo ${{ github.event.pull_request.title }}
```

取得できる情報は、例えば以下のようなものです。

- URL：`${{ github.event.pull_request.html_url }}`
- タイトル：`${{ github.event.pull_request.title }}`
- 本文：`${{ github.event.pull_request.body }}`
- PR番号：`${{ github.event.pull_request.number }}`
- openかclosedか：`${{ github.event.pull_request.state }}`
- 作成日時：`${{ github.event.pull_request.created_at }}`
- プルリクを開いているブランチ：`${{ github.event.pull_request.head.ref }}`
- プルリクのマージ先：`${{ github.event.pull_request.base.ref }}`
- ドラフトかどうか：`${{ github.event.pull_request.draft }}`
- マージされたかどうか：`${{ github.event.pull_request.merged }}`

上記のような情報を使うと、

- プルリクエストが開かれたら自動でslackへ通知する
- プルリクエストが開かれたら自動で開発環境にデプロイする
- stagingブランチにマージされたらmainブランチへのプルリクエストを自動で開く

のようなworkflowを実現することができます。


こちらに記載した変数はほんの一部で、[公式ドキュメント](https://docs.github.com/ja/webhooks/webhook-events-and-payloads?actionType=opened#pull_request)によると他にも様々な情報も取得することができるようです。
こちらのサイトの「Properties of pull_request」をクリックすると、取得できるプロパティの一覧を見ることができます。

https://docs.github.com/ja/webhooks/webhook-events-and-payloads?actionType=opened#pull_request

プルリクエスト以外のイベントについても、こちらのページから`github.event`からどのような変数が渡されるかを確認できます。

以上、GitHub Actionsからどのようなプルリクエスト情報が取れるかの紹介でした。
スクラム開発におけるテスト駆動開発（TDD）の導入方法とその効果


## はじめに

こんにちは、皆さん。今回はスクラム開発におけるテスト駆動開発（TDD）の導入方法とその効果についてお話ししたいと思います。TDDは、コードの品質を高め、バグを減らすための強力な手法です。特にクラウドベースのプロダクト開発において、その効果は絶大です。

## TDDとは？

まず、TDD（Test-Driven Development）とは何かを簡単に説明します。TDDは、テストを先に書き、そのテストをパスするためのコードを書くという開発手法です。この手法により、コードの品質が向上し、バグが減少します。

### TDDの基本的な流れ

1. **テストを書く**: まず、失敗するテストケースを作成します。
2. **コードを書く**: テストをパスするための最小限のコードを書きます。
3. **リファクタリング**: コードをリファクタリングして、クリーンで効率的なものにします。

## スクラム開発とTDDの相性

スクラム開発は、短期間での反復的な開発を重視するアジャイル手法の一つです。TDDはこのスクラム開発と非常に相性が良いです。なぜなら、TDDは短いサイクルでの開発を前提としており、スクラムのスプリントと自然にマッチするからです。

### スクラムのスプリントとTDD

スクラムのスプリントは通常2〜4週間の短期間で行われます。この短期間での開発において、TDDは以下のようなメリットをもたらします。

- **迅速なフィードバック**: テストが先にあるため、コードの問題点を早期に発見できます。
- **高いコード品質**: テストを通じてコードの品質が保証されます。
- **効率的なリファクタリング**: テストがあるため、安心してコードをリファクタリングできます。

## クラウドベースのプロダクト開発におけるTDDの利点

クラウドベースのプロダクト開発においても、TDDは非常に有効です。クラウド環境はスケーラビリティや可用性が求められるため、コードの品質が非常に重要です。

### クラウドサービスとの統合テスト

クラウドベンダーが提供する様々なサービス（例: AWS Lambda、Azure Functions、Google Cloud Functionsなど）を利用する場合、これらのサービスとの統合テストが必要です。TDDを導入することで、これらの統合テストも効率的に行うことができます。

### CI/CDパイプラインとの連携

クラウド環境では、CI/CD（継続的インテグレーション/継続的デリバリー）が一般的です。TDDを導入することで、CI/CDパイプラインにおける自動テストが強化され、デプロイの信頼性が向上します。

## TDD導入のステップ

では、具体的にTDDをスクラム開発に導入するためのステップを見ていきましょう。

### 1. チームの教育

まず、チーム全体でTDDの基本を理解することが重要です。TDDのトレーニングやワークショップを開催し、全員が同じ理解を持つようにしましょう。

### 2. テストツールの選定

次に、使用するテストツールを選定します。例えば、JUnit（Java）、RSpec（Ruby）、pytest（Python）など、言語に応じたテストフレームワークを選びます。

### 3. 小さなステップから始める

いきなり全てのコードにTDDを適用するのは難しいので、まずは小さな機能やモジュールから始めます。成功体験を積み重ねることで、チーム全体にTDDのメリットを実感させることができます。

### 4. 継続的な改善

TDDを導入した後も、継続的に改善を行います。定期的に振り返りを行い、TDDのプロセスを見直すことで、より効果的な開発が可能になります。

## まとめ

TDDは、スクラム開発において非常に有効な手法です。特にクラウドベースのプロダクト開発において、その効果は絶大です。チーム全体でTDDを理解し、小さなステップから始めることで、コードの品質を高め、バグを減らすことができます。ぜひ、皆さんのプロジェクトでもTDDを導入してみてください。
【PowerShell 5.1】バッチから実行する方法（実行ポリシーを一時的に変更）

# はじめに
## 前提
下記環境での動作を前提としている。
PowerShell 5.1
## 本記事について
実行ポリシーを一時的に変更することで、PowerShellスクリプト（.ps1）を、バッチから実行する方法を示す。
※ 実行ポリシーは、PowerShellスクリプトの実行終了とともに、元に戻る。
# バッチから実行する方法
1. PowerShellの「ExecutionPolicy」オプションに「Unrestricted」を指定する。
1. PowerShellスクリプトのパスを指定する。
1. バッチとして保存する。
``` PowerShell:Hoge.ps1
Write-Host "はろーわーるど"
```
``` bat:実行バッチ.bat
PowerShell -ExecutionPolicy Unrestricted Hoge.ps1
```
# TIPS
## 起動引数を取得したい時
起動引数を取得したい時は、実行バッチの起動引数として、任意の文字列を指定する。
``` PowerShell:Fuga.ps1
Write-Host $args[0]
```
``` bat:実行バッチ引数つき.bat
PowerShell -ExecutionPolicy Unrestricted Fuga.ps1 %1
```
``` bat
呼び出しバッチ引数つき.bat "Huga"
```
## 終了コードを取りたい時
終了コードを指定した場合は、PowerShellスクリプト側で、終了コードを指定するだけでよい。
※ PowerShellスクリプト側で終了コードを指定していない場合は、「%ERRORLEVEL%」が「0」になる。
``` PowerShell:Piyo.ps1
exit 1
```
``` bat:StartPiyo.bat
PowerShell -ExecutionPolicy Unrestricted Piyo.ps1
echo %ERRORLEVEL%
REM %ERRORLEVEL%は、1である。
```
# さいごに
本記事では、実行ポリシーを一時的に変更し、バッチからPowerShellスクリプトを実行する方法を示した。
※ 本記事は、実行ポリシーの一時的な変更を推奨するものではない。
## 参考文献
https://www.vwnet.jp/Windows/PowerShell/2020072901/SetExecutionPolicy.htm

https://qiita.com/cd01/items/82829ba0ec0f59e1b04d

https://qiita.com/tomoko523/items/df8e384d32a377381ef9

https://microsoftou.com/ps-arguments/

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-5.1
SQLをmruby、mruby/c、Arduinoのソースコードに変換

# はじめに
SQLをmruby、mruby/c、Arduinoのソースコードに変換するツールを作りました。
オリジナルは2015年に作成したツールでそのときはSQLにArduinoのソースコードに変換するだけでした。
基本的な考え方は[sql2arduinoコンパイラを作った話](https://qiita.com/arthur87/items/8a01812802a68053fbc4)に書いてます。

# ガイド
今回はRubyで実装しました。
最終的なソースコードは[GitHub](https://github.com/arthur87/rossoc)にあります。

このツールは[RubyGems](https://rubygems.org/gems/rossoc)に公開しています。
以下のコマンドでインストールできます。

```
gem install rossoc
```


例えば、`SELECT din11 FROM mruby WHERE ((din1 = 0 AND din2 <= 1) OR din3 <> 9)` のようなSQLは、次のようなmrubyのソースコードに変換されます。
mruby、mruby/cのCommon I/O APIに対応しています。

```
GPIO.setmode(11, GPIO::IN)
GPIO.setmode(1, GPIO::IN)
GPIO.setmode(2, GPIO::IN)
GPIO.setmode(3, GPIO::IN)

uart1 = UART.new(1)

while 1 do
  din11 = GPIO.read(11)
  din1 = GPIO.read(1)
  din2 = GPIO.read(2)
  din3 = GPIO.read(3)

  if ((din1 == 0 && din2 <= 1) || din3 != 9)
    uart1.puts("din11=#{din11}")
  end

end
```

`sleep`関数を実現するために`RSLEEP`というキーワードを追加しました。
例えば、`SELECT din11 FROM mruby WHERE ((din1 = 0 AND din2 <= 1) OR din3 <> 9) RSLEEP 100`のようなSQLは、次のようなmrubyのソースコードに変換されます。

```
GPIO.setmode(11, GPIO::IN)
GPIO.setmode(1, GPIO::IN)
GPIO.setmode(2, GPIO::IN)
GPIO.setmode(3, GPIO::IN)

uart1 = UART.new(1)

while 1 do
  din11 = GPIO.read(11)
  din1 = GPIO.read(1)
  din2 = GPIO.read(2)
  din3 = GPIO.read(3)

  if ((din1 == 0 && din2 <= 1) || din3 != 9)
    uart1.puts("din11=#{din11}")
  end

  sleep(100)

end
```

生成されたソースコードをみると`sleep(100)`とうコードが追加されています。

SELECT文だけをサポートしています。
列名に指定できる値は、din1 ～ din20、ain1 ～ ain20 です。din はデジタルピン、ain はアナログピンに対応します。
テーブル名に指定できる値は、mruby または arduino です。
テーブル名に指定したソースコードが生成されます。
実験的なツールのため予告なしに仕様変更することがあります。
スクラム開発で非機能要件を満たすためのクラウド活用術


## はじめに

スクラム開発において、非機能要件を満たすことはプロダクトの成功に欠かせません。非機能要件とは、性能、可用性、セキュリティ、スケーラビリティなど、システムの品質に関わる要件のことです。これらを適切に満たすためには、クラウドベンダーの提供する様々なサービスを効果的に活用することが重要です。

## 非機能要件とは？

非機能要件は、システムの動作や品質に関する要件です。具体的には以下のようなものがあります。

- **性能（Performance）**: システムがどれだけ速く動作するか。
- **可用性（Availability）**: システムがどれだけの時間稼働しているか。
- **セキュリティ（Security）**: システムがどれだけ安全か。
- **スケーラビリティ（Scalability）**: システムがどれだけ拡張可能か。

これらの要件を満たすためには、適切な設計と実装が必要です。

## クラウドサービスの活用

クラウドベンダーは、非機能要件を満たすための多くのサービスを提供しています。以下に、主要なクラウドベンダーのサービスをいくつか紹介します。

### AWS（Amazon Web Services）

- **Amazon EC2**: 高性能な仮想サーバーを提供し、スケーラビリティと可用性を確保。
- **Amazon RDS**: マネージドデータベースサービスで、データベースの可用性とスケーラビリティを向上。
- **AWS Lambda**: サーバーレスアーキテクチャを実現し、コスト効率とスケーラビリティを向上。
- **Amazon CloudWatch**: システムの監視とログ管理を行い、性能と可用性を確保。

### Google Cloud Platform（GCP）

- **Compute Engine**: 高性能な仮想マシンを提供し、スケーラビリティと可用性を確保。
- **Cloud SQL**: マネージドデータベースサービスで、データベースの可用性とスケーラビリティを向上。
- **Cloud Functions**: サーバーレスアーキテクチャを実現し、コスト効率とスケーラビリティを向上。
- **Stackdriver**: システムの監視とログ管理を行い、性能と可用性を確保。

### Microsoft Azure

- **Azure Virtual Machines**: 高性能な仮想マシンを提供し、スケーラビリティと可用性を確保。
- **Azure SQL Database**: マネージドデータベースサービスで、データベースの可用性とスケーラビリティを向上。
- **Azure Functions**: サーバーレスアーキテクチャを実現し、コスト効率とスケーラビリティを向上。
- **Azure Monitor**: システムの監視とログ管理を行い、性能と可用性を確保。

## スクラム開発における非機能要件の取り扱い

スクラム開発では、非機能要件をプロダクトバックログに含めることが重要です。これにより、開発チームは非機能要件を意識しながら開発を進めることができます。

### スプリントプランニング

スプリントプランニングでは、非機能要件を考慮したタスクを計画に組み込みます。例えば、性能テストやセキュリティレビューなどのタスクをスプリントバックログに追加します。

### デイリースクラム

デイリースクラムでは、非機能要件に関連する進捗状況を共有します。これにより、チーム全体が非機能要件を意識し続けることができます。

### スプリントレビュー

スプリントレビューでは、非機能要件が満たされているかを確認します。例えば、性能テストの結果やセキュリティレビューの結果を共有し、必要な改善点を洗い出します。

### スプリントレトロスペクティブ

スプリントレトロスペクティブでは、非機能要件に関する振り返りを行います。これにより、次のスプリントでの改善点を見つけ、継続的な改善を図ります。

## まとめ

非機能要件を満たすことは、プロダクトの品質を高めるために非常に重要です。クラウドベンダーの提供するサービスを効果的に活用し、スクラム開発のプロセスに非機能要件を組み込むことで、より高品質なプロダクトを開発することができます。皆さんもぜひ、クラウドサービスを活用して非機能要件を満たすための工夫を取り入れてみてください。
スクラム開発でシステムの異常を早期に検出する方法


## はじめに

スクラム開発において、システムの異常を早期に検出することは非常に重要です。異常を早期に発見することで、問題が大きくなる前に対処でき、プロジェクトの進行をスムーズに保つことができます。この記事では、クラウドベンダーの様々なサービスを活用しながら、システムの異常を早期に検出する方法について解説します。

## 1. モニタリングの重要性

まず、システムの異常を早期に検出するためには、モニタリングが欠かせません。モニタリングは、システムの状態をリアルタイムで監視し、異常が発生した際にアラートを発する仕組みです。これにより、異常が発生した瞬間に対応することが可能になります。

### 1.1 クラウドベンダーのモニタリングサービス

クラウドベンダーは、様々なモニタリングサービスを提供しています。例えば、AWSのCloudWatch、Google CloudのStackdriver、AzureのMonitorなどがあります。これらのサービスを活用することで、システムのパフォーマンスやエラーログをリアルタイムで監視することができます。

## 2. ログ管理の徹底

次に、ログ管理も重要な要素です。システムの異常を検出するためには、エラーログやアクセスログを適切に管理し、分析する必要があります。ログ管理を徹底することで、異常の原因を迅速に特定し、対策を講じることができます。

### 2.1 ログ管理ツールの活用

クラウドベンダーは、ログ管理ツールも提供しています。例えば、AWSのCloudTrail、Google CloudのLogging、AzureのLog Analyticsなどがあります。これらのツールを活用することで、ログの収集、保存、分析を効率的に行うことができます。

## 3. アラート設定の最適化

モニタリングやログ管理を行うだけでなく、アラート設定も重要です。適切なアラートを設定することで、異常が発生した際に即座に通知を受け取ることができます。

### 3.1 アラート設定のベストプラクティス

アラート設定の際には、以下のポイントに注意しましょう：

- **閾値の設定**: 異常と判断する閾値を適切に設定します。過剰なアラートはノイズとなり、重要なアラートを見逃す原因となります。
- **通知先の設定**: アラートの通知先を明確にし、担当者が迅速に対応できるようにします。
- **アラートの種類**: 異常の種類に応じて、適切なアラートを設定します。例えば、システムダウン、パフォーマンス低下、エラーログの増加などです。

## 4. 自動化の導入

最後に、自動化の導入も検討しましょう。自動化を導入することで、異常検出から対応までのプロセスを効率化し、人的ミスを減らすことができます。

### 4.1 自動化ツールの活用

クラウドベンダーは、自動化ツールも提供しています。例えば、AWSのLambda、Google CloudのCloud Functions、AzureのLogic Appsなどがあります。これらのツールを活用することで、異常検出後の対応を自動化し、迅速に問題を解決することができます。

## まとめ

スクラム開発において、システムの異常を早期に検出することは非常に重要です。モニタリング、ログ管理、アラート設定、自動化を組み合わせることで、異常を早期に発見し、迅速に対応することが可能になります。クラウドベンダーのサービスを活用し、効果的な異常検出体制を構築しましょう。
【GiHub Action】CIで全てのテストを通してしまった話

# はじめに

GitHub Actionのワークフローの改修をしたのですが、全てのテストを通るようになってしまっていました。ちなみに、幸いすぐ気付いたので影響はなかったですが、今後気をつけるように残しておきます。

# 問題のワークフロー

ワークフローは以下のようになってます。

1. `make test`でPyhonのテストを動かす
2. PRにカバレッジのコメントをつける (参考 :[MishaKav/pytest-coverage-comment](https://github.com/MishaKav/pytest-coverage-comment)

```yaml:.gihub/workflows/test.yml
  - name: Run tests
    run: make test
  - name: Create coverage report
    uses: MishaKav/pytest-coverage-comment@main
    with:
      pytest-coverage-path: ./pytest-coverage.txt
      junitxml-path: ./pytest.xml
      badge-title: Coverage
```

Makefileでは、pytestを動かして、カバレッジレポートを作成するのに必要なため、pipeを使用して、`pytest-coverage.txt`を作成しております。

```make:makefile
.PHONY: test
test:
	pytest --cov=./ --junitxml=pytest.xml --cov-config=.coveragerc --cov-report=term-missing | tee pytest-coverage.txt
```

# Pipeの罠

上記のmakefileでpipeを使ってしまっているので、前半の`pytest --cov=./ --junitxml=pytest.xml --cov-config=.coveragerc --cov-report=term-missing`の部分が落ちても、pipeで渡しているので、正常終了してしまいます。

試しに、以下のコードをローカルで実行してみます。

```shell-session
$ exit 1 | exit 0
$ echo $?
0
```

`$?`が **0** となっているので、正常終了していることがわかります。

```shell-session
$ set -o pipefail
$ exit 1 | exit 0
$ echo $?
1
```

`$?`が1となっているので、異常終了します。

また、オプション`-e`をつけることで、失敗した時点で異常終了させることが可能なので、`set -eo pipefail`のようにします。

# makefileの罠

`set -eo pipefail`をつけることで、解決できたと思ったのですが、これだけだとGitHub Actionでのtestは期待通りに動作しませんでした。

例として、以下のmakefileを作ってみます。

```makefile:makefile
SHELL=/bin/bash

.PHONY: foo
foo:
	set -eo pipefail
	exit 1 | exit 0
```

これを実行してみます。

```shell-session
$ make foo
$ echo $?
0
```

`set -eo pipefail`をしたのにも関わらず、makeコマンドだと正常終了してしまうことがわかります。

この問題の解決策は2通りあるのですが、まず1つ目は以下のように一行に書いてみると改善されます。

```make:makefile
SHELL=/bin/bash

.PHONY: foo
foo:
	set -eo pipefail; exit 1 | exit 0
```


```shell-session
$ make foo
$ echo $?
2
```

2つ目は`.SHELLFLAGS`を設定することで解決できます。

```make:makefile
SHELL=/bin/bash
.SHELLFLAGS := -eu -o pipefail -c

.PHONY: foo
foo:
	exit 1 | exit 0
```

`.SHELLFLAGS := -eu -o pipefail -c`のように設定しています。

* -e : bashで実行したコマンドが失敗した場合に終了させる
* -o pipefail : パイプの最初や途中で処理が失敗した場合、全体を失敗させる
* -u : bashで変数未定義の場合にエラーで止める
* -c : オプションを設定する時には必須のオプション(`bash -c "echo 'Hello'"`として動かす)

これを実行すると、無事エラーとなってくれました。

```shell-session:shell
$ make foo
exit 1 | exit 0
make: *** [makefile:6: foo] Error 1
```

# 参考文献

* [Makefile覚書: Goアプリ開発に役立ちそうな基礎知識 | フューチャー技術ブログ](https://future-architect.github.io/articles/20231012a/)
vscode拡張機能によるgit GUIでcommitができなかった話

vscodeって便利ですよね。ソース管理にお世話になっている人も多いことかと思います。
最近そのgit関連で発狂したので記録しておきます。

ふたを開ければ至極単純なミスなんですよねえ…なんで気づけないんだろう。

# 症状
0. vscodeのソース管理からcommitしようとする
0. エラーがでる
0. git configを叩く
0. また出る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420671/4a1f2150-a3aa-973c-2eee-78a6d06ee800.png)

最初にgit使おうとすると`user.name`と`user.email`を設定しろって言われるじゃないですか。あれを設定した後にこうなるんですよ。
いやー困りました。`git config --list`で確認してみるもよくわからん。
コマンドライン上からcommitしようとするとなんか~~警告が出るだけ~~なんですよね。

ローカルに設定してやると上書きされるみたいでいけるんですが毎回毎回設定してやるのはつらい。

# 原因
いろいろ試したんですが…

`cat ~/.gitconfig`
```.gitconfig
[user]
    name = hogetarou
    emai = example@mail.com
[init]
    defaultBranch = main
```

emailの**l**が抜けてます。これを修正してやると…いけました。こんだけです。

# あとがき
タイポごときにこれだけ時間をかけてしまうとは…（1敗）
しかしこれでもエラー出ないんですね。「こんな識別子は定義されてねえよ」的な奴。
まあとにかく直ってよかった。それでは。
乗法定理 「24年 中央大 経済 1(3)」をChatGPTとsympyでやってみたい。

・確率の勉強をはじめました。

# オリジナル
・数学入試問題 様

https://kamelink.com/blog/2024/07/09/16-4-24-chuodai-keizai-1-3/

・大学入試数学問題集成 様＞ 
　未登録

# ChatGPT-3.5先生へ。
・pdfの文字をコピーしました。
```
ある Web サイトにログインするには 4 桁の暗証番号を入力しなければならないが，
それを忘れてしまった．覚えているのは，各桁の数は 5 以上ですべて異なる数であり，
末尾の 2 桁は 78 か 87 のどちらかということだけである．この Web サイトでは暗証
番号は 3 回まで入力することができるが，記憶にあてはまる範囲内で手当たり次第に
入力して無事にログインできる確率を求めよ．
```
??? ChatGPT
結論
条件に一致する4桁の暗証番号は6つあり、3回の試行で無事にログインできる確率は **50%** です。

User
```
sympyで
```
ChatGPT
...
したがって、記憶に基づいてランダムに3回入力した場合、無事にログインできる**確率は25%** です。 ​​
```
結果が異なったのは、どうしてですか
```
ChatGPT
おそらく、最初の手計算で条件の組み合わせを完全に網羅していなかった可能性があります。
```
sympyのソースコードだけ
```
```
sympyのソースコードのコメントを日本語で
```

・(抜粋)　sympyのソースコードがでました。
・私がprint文を追加しています。
```python
import sympy as sp

# 各桁に使用する数字のセットを定義（5, 6, 7, 8, 9）
digits = {5, 6, 7, 8, 9}

# 可能な4桁の組み合わせを格納するリストを初期化
combinations = []

# 末尾が78である組み合わせを確認
for d1 in digits:
    for d2 in digits - {d1}:
        if d1 != 7 and d1 != 8 and d2 != 7 and d2 != 8:
            combinations.append((d1, d2, 7, 8))

# 末尾が87である組み合わせを確認
for d1 in digits:
    for d2 in digits - {d1}:
        if d1 != 8 and d1 != 7 and d2 != 8 and d2 != 7:
            combinations.append((d1, d2, 8, 7))

# 組み合わせの総数を計算
total_combinations = len(combinations)

# 3回の試行でログインできる確率を計算
probability = 3 / total_combinations

total_combinations, probability


print("#",total_combinations, probability)
# 12 0.25
```

# sympyで(オリジナル 様の方法で)
???勉強中です。???


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

・以下ができたら、助かります。指定と全部です

https://qiita.com/mrrclb48z/items/555d85face87552c34fb

https://qiita.com/mrrclb48z/items/5f57eac92aaca30e85c0

# いつもと違うおすすめです。

https://en.wikipedia.org/wiki/Multiplication_theorem

https://ja.wikipedia.org/wiki/乗法定理
未経験からみたエンジニア

## はじめに
最高のエンジニアになるため、スクール受講しはや数か月。現在の業界職種はいろんな面で限界を感じています。
そんな未経験の私からみた、最高のエンジニア（妄想）の姿を紹介します。

## 仕事内容
今でさえエンジニアがどんな仕事をするのか、不透明度が高いのですがなんとなく。
- システムの設計・開発
- リリース後の運用保守
- 自社or受託？

## 働き方
- フレックスタイム制が多そう
- フリーランスは時間を問わない
- 服装が自由
- 土日もありそう
- 残業が多そう
- 建設業とかと同じで多重下請けありそう

## 人について
- 眼鏡率たかそう
- 男性の方が多そう
- 隠れ筋トレしてる人いそう
- 割とアットホームか？
- コミュニケーション能力高そう
- いろんなツールを使いこなし、そんなことも知ってるの？というような人沢山いそう
- 資格沢山持つ学習意欲高い人多そう

## さいごに
未経験の私から見た想像の中のエンジニア像。もっと解像度を上げて「この人のような素晴らしいエンジニアになるんだ」と気持ちを高めて転職活動に向けて準備をしていきたいです。
資格取得も目指す
Markdown AIを使ってみた

# はじめに
Markdown AIの機能をテストしたいという理由で使ってみました。

## Markdown AIのリンク先
https://mdown.ai/content?id=335b81b2-bcb0-4dbb-83d0-531aa132181f

## 使い方
> ①Googleアカウントでログインする。
> ①Markdown記法に従ってプロンプトを記載する。

## 使った結果の保存
以下のリンク先です
https://mdown.ai/content/4256097c-01ac-4004-b3cd-af697dda6ab0

# 最後に
まだベータ版ということなので、正式版に期待したいです。
DB-GPTとOllamaでexcelファイルのRAGを試す

# はじめに

前回紹介した[DB-GPT](https://dbgpt.site/)はExcelファイルを読み込んで、DBに対してと同様の操作ができます。

# 実行

下記に従ってセットアップを行います。

https://qiita.com/orca13/items/ca956c7d33e9eb72afe0

セットアップが完了したら、`http://localhost:5670/` にアクセスし、`Chat Excel` を選択します。

![dbgpt-excel_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/7802f156-f240-76d2-3e51-6e19a9c0c4ad.png)

上部の `Select File` でファイルを選択し `Upload` を実行します。
![dbgpt-excel_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/1a757f80-99ef-0e81-812c-2ed3f9280027.png)

今回使用した Excel ファイルは Microsoft にある財務のサンプルです。

https://learn.microsoft.com/ja-jp/power-bi/create-reports/sample-financial-download


読み込みが完了すると、まずデータの要旨や構造を説明してくれます。

![dbgpt-excel_03](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/72c5119b-4624-aaa4-02a8-d8dabeda22ef.png)

合わせて、データ解析の案を提示してくれるので、それに従って質問してみると、
データベースに対する場合と同様に解析結果を表示してくれます。

![dbgpt-excel_04](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/964279f3-098f-0f5b-caee-94ad49af7104.png)

内部でデータベースに変換されている様で使用したSQLコマンドも確認できます。

![dbgpt-excel_05](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/dce36188-afc2-4ecb-b2a8-f98653b3601b.png)

# まとめ

DB-GPTでExcelファイルのRAGを試しました。データベースの場合と同様、簡単に解析することができました。最初にどのようなファイルなのかを説明してくれるのも便利です。
【F#】忘備録、F#のソースのコンパイル方法

# はじめに
C#を勉強していく中で、F#にも興味を持ったので、F#のソースコンパイル方法の忘備録を記事にしました

## 作ったソースコード
作ったソースコードを(**test2.fsx**)として以下のソースを実装しました

```
let msg = "test1"
System.Console.WriteLine($"{msg}")
```

## コンパイル方法
dotnetコマンドを使って以下のように実行しました

```
$ dotnet fsi test2.fsx
```

## 結果
![test1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/7aa3203d-f3ec-c8c0-a48d-ed76a4c9d751.jpeg)


# 最後に
忘備録として投稿しました。