OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドプロンプト タイトル設定

# はじめに
一つのPCで複数のプログラムが実行されている場合、
プロンプトが多数表示され、
一目見て何が実行されているかわかるようタイトルを変更する


# コマンドプロンプトのタイトル設定
デフォルトでは「コマンド プロンプト」
![スクリーンショット 2024-06-22 062057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/03030585-fef4-fa32-853e-e2d268c8c948.png)
|
|
|

下記コマンドを実行
```
title タイトルにしたい文字列
```

![スクリーンショット 2024-06-22 063321.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/e0b91ad8-f31a-137e-5658-a3da3ed6f874.png)

batファイルを作成する際も、上記コマンドを記述しておくと
とてもわかりやすくるので便利 ♪

# 参考サイト
ｎRF52840に書き込み出来なくなったときの対処

## nRF52840でCOMが未接続状態なったときの対処
nRF52840を使った秋月のマイコンボードを使っていたのですが、1回目の書き込みの後にCOMポートが未接続状態になりました。

１回目のサンプルプログラムは、正常に動作していてLチカもできていたのですが…。
どうしたものかと**nRF52840**と**書き込みできなくなった**で検索してみたところ、以下の投稿記事を見つけました。

https://404background.com/circuit/nrf52840-sense/

記事は秋月のものではなくSeeed Studio XIAO nRF52840でしたが、やはり１回目の書き込みの後COMポートが認識しなくなったとのこと。
で、リセットボタンを2回押すと認識したとのことで、同じようにリセットボタンを2回押したところCOMポートが認識されるようになりました！

## 参考
ちなみに秋月のリセットボタンは赤枠で囲んだところにあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/69d73565-8fdb-d417-da78-81591c618bc1.png)
Turmuxで日本語入力をする方法

![Screenshot_20240622-062935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3728037/f22f0aa6-079f-be65-df07-965f093c5ad0.png)
画像のESCやCTRLなんかのある辺りを左にスワイプしてやると簡易的なメモ帳が出て、標準搭載されているキーボードが開かれる様です。
今まで別アプリで打ってコピペしてたのがアホらしい。
接続がすぐ切れちゃうので、そのボードにはすぐにSSH接続できるように貼り付けてたんだから、気がつくべきでした。
[Godot]画面遷移時のトランジションアニメーション実装

Godotで画面遷移する際にトランジション演出のアニメーションを追加したので、その手順を備忘録として残しておく。
参考：https://2dgames.jp/godot-transition/
参考：https://scrapbox.io/kidaaam-92022284/Godot_%E3%81%A7_Transition_%E3%82%92%E8%87%AA%E4%BD%9C%E3%81%99%E3%82%8B

## 手順
手順は下記の通り。
1.トランジション演出用のパネルノード追加
2.追加したパネルノードでシェーダーマテリアル追加
3.シェーダーコード記述
4.マスク用画像を読み込む
5.AnimationPlayerで作成したシェーダーのトラックを追加

## トランジション演出用のパネルノード追加
シェーダーを実装するためのPanelノードを追加。今回はTransitionPanelとした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/2f741f75-a949-51e3-1d91-854f6688666f.png)

シーンの中にButtonなど、操作に必要なノードがある場合、そのノードより下のレイヤー（GodotUI上だと上）にないと操作できないので注意。

## パネルノードにシェーダーマテリアルを追加
インスペクターの「Canvas Item」の「Material」を押下、「Material」に「新規ShaderMaterial」を追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/4c0166f3-f119-9e8b-8d37-81b4f68fc595.png)

## シェーダースクリプトの記述
「Shader」に「New Shader」を追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/79b82876-abe5-c0ba-ce69-b18f4e779cb8.png)

Shader作成ダイアログが出るので、デフォルトの設定のまま作成をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/a947a84a-e0f2-d2dc-5fb8-1e40b544ce2f.png)

シェーダーエディターがウィンドウの下部に出るので、そちらに下記のコードを記述。

```シェーダーコード
shader_type canvas_item;
render_mode unshaded;

uniform float SoftRange = 0.2;              // 境目を半透明にする幅
uniform float Value : hint_range(0.0, 1.0); // フェード値
uniform sampler2D Mask;                     // ルール画像

void vertex() {
	// Called for every vertex the material is visible on.
}

void fragment() {
	// 基準値を計算
    float rangedValue = Value * (SoftRange * 2.0 + 1.0) - SoftRange;
    // 最小値と最大値を決める
    float minValue = rangedValue - SoftRange;
    float maxValue = rangedValue + SoftRange;
    // ルール画像の濃度を取得
    float maskValue = texture(Mask, UV).r;
    // smoothstep(エルミート補完)で透過値を決定
    float alpha = smoothstep(minValue, maxValue, maskValue);

    // 黒フェードするよう色を設定
    COLOR = vec4(vec3(0.0), alpha);

}

```

上記のコードを記述すると、UIにパラメータが出てくるので、Mask用の画像を読み込む。
※ちなみにコードとMaskの設定前にアニメーションのトラックを作成すると、あとからコードとMaskを設定しても反映されない。

Mask用画像はこちらからお借りしました→https://4you.bz/rule1080p

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/809e141d-4447-9158-54a2-5219b91490d7.png)

## AnimationPlayerで作成したシェーダーのトラックを追加
アニメーションウィンドウから「トラックを追加」をクリックし、「Property Track」からシェーダー用パネルを選択しシェーダー値（今回でいうValue）を選択するか、インスペクターの同プロパティの右にある鍵マークをクリック（こちらの方が断然ラク）しトラックを追加。追加したトラックで右クリックし「Insert Key」でkeyを追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800965/90ddba6e-ad54-52aa-07f9-f27abc0a8b2b.png)


これでトランジション演出のアニメが追加できた。
SwiftでVoidを返す

```
% swift -v
Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-darwin23.5.0
```

Swiftでは、Void型は空のタプルのタイプエイリアスとして定義されています（[Void | Apple Developer Documentation](https://developer.apple.com/documentation/swift/void)）。

```swift
typealias Void = ()
```

明示的にVoidを返したい時ってありますよね。自分はありました。このような場合は、直接空のタプルを返すことができます。

```swift
func v1() -> Void {
  return Void()
}
```

```swift
func v2() -> Void {
  return () // 空のタプル
}
```

具体的には、`Result<Void, Error>`を返したい場合に役立ちます。

```swift
return .success(Void())
```

```swift
return .success(()) // .successの引数に空のタプルを渡す
```
Python PEP8 ~その弐 無駄な空白は削除~

### 行末にいらん空白がある！！


# はじめに
コードレビューで指摘いただいた部分、自分では気づけず
設定で無駄もミスもなくす

また、PEP8にも記載されていたので、重要性を再認識
>行末に余計な空白文字を残さないようにしましょう。

https://peps.python.org/pep-0008/

# 例
下記のコードのように行末に無駄な空白が存在してる
※「␣」記号打ってますが空白の認識でお願いします。
```python
import datetime

now = datetime.datetime.now()␣
```

気にしながら打つとか面倒くさい...
ので、調べてたらちゃんとありました！
設定できるものは設定して無駄もミスもなくしていこ！




# VScodeで行末の空白を省く設定
1.  「Ctrl + , 」で設定ページを開く(Windows)
2.  検索枠に「trim」と入力
3.  チェックを入れる
    - [x] Trim Trailing Whitespace In Regex And Strings
    - [x] Trim Auto Whitespace
    - [x] Trim Trailing Whitespace
 
![スクリーンショット 2024-06-22 054206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/edd25f26-9ef5-7ce8-82a8-1bada92bd0bc.png)



# 参考サイト
https://qiita.com/n_oshiumi/items/1ad3f55d58f2d9d48d1e
【メモ】2024年度地図XML変換済データ（GeoJSON・SHP）の利用上の注意（ファイル名重複、文字化け等）

# はじめに
2024年度の地図XMLデータは4月に公開されましたが、6月19日に変換済みデータも公開されました。関係の皆様のご尽力に感謝します。

便利な変換済みフォーマットですが、利用の注意点に気がついたのでここでメモしておきます。

# 注意すること
## その１：同一のファイル名
変換済みのデータは2024年度は1945（GeoJSON）あると思いますが、APIでダウンロードしたところフォルダに1932件しか残っていませんでした。調べてみたところ、同一市区町村で法務局が複数ある場合（そして双方の座標系が一致する場合）には、同じ名前のファイルになってしまうようです。これは2024年度からの設定です。

下図は東松山市の例ですが、2024年度はシェープファイル形式、GeoJSON形式ともに２つのファイルがあることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/c7243346-31ae-b8df-791c-1b6c99243858.png)

ブラウザでダウンロードすると二つとも保存してくれますが、curl等で直接ダウンロードするときは上書きしてしまわないように注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b2c8f574-04b7-ed5d-b9a2-95a73bc37113.png)

このようなケースは、東松島市のように、複数の法務局があるところであります。ほかにも、新潟市の北区とか松山市とかあります。全国で13市区町村くらいあるのではないかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b1767ccb-5253-2625-f5fa-ad0c3d369de0.png)

GeoJSONの名前で調べると以下のファイルは同一のファイルがあります。
* 04213_栗原市_公共座標10系_筆R_2024.geojson
* 04214_東松島市_公共座標10系_筆R_2024.geojson
* 09201_宇都宮市_公共座標9系_筆R_2024.geojson
* 12211_成田市_公共座標9系_筆R_2024.geojson
* 15101_新潟市北区_公共座標8系_筆R_2024.geojson
* 15213_燕市_公共座標8系_筆R_2024.geojson
* 21220_下呂市_公共座標7系_筆R_2024.geojson
* 33101_岡山市北区_公共座標5系_筆R_2024.geojson
* 33103_岡山市東区_公共座標5系_筆R_2024.geojson
* 33201_岡山市_公共座標5系_筆R_2024.geojson
* 33214_真庭市_公共座標5系_筆R_2024.geojson
* 33681_加賀郡吉備中央町_公共座標5系_筆R_2024.geojson
* 38201_松山市_公共座標4系_筆R_2024.geojson

APIを使ってデータを入力する方は、上記13市区町村はウェブブラウザからダウンロードしてファイルをリネームすることで対応できると思います。

## その２：シェープファイルの文字コード（ArcGISで使う場合のみの注意点）

2024年のシェープファイルはZIP圧縮されていますが、Windowsのデフォルトの解凍機能やWindowsPowerShellで解凍するとファイル名が文字化けすることがあります（これは7zipなどで解凍すると避けられます）。

さらに、シェープファイルはShift JISにてデータを格納しているようですが（注：地図XML自体はUTF8）、シェープファイルをArcGIS などで読むと属性テーブルも文字化けすることがあります。

その場合、ダウンロードしてきたSHPデータ中のcpgファイルを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/7f03dbd4-d5f5-be29-6f8e-a28433470240.png)

左が2023年のもの、右が2024年のものです。私の場合、2024年のファイルのshift-jisを**SJIS**に修正することでArcGIS上での文字化けを回避できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/027587b7-8e84-83e2-877b-4ae943692096.png)

ポイント
* 解凍の際は７ZIPなど文字化けしないものを使う。
* ArcGISで文字化けする場合はcpgファイルを調整してみる。

# まとめ
2024年度の地図XML、変換済みデータを使うときの注意点をまとめました。上記の「その１」については2024年度からの課題です。上記その２は前年からあったのかは確認していません。
とても便利なデータですので、利用の際の細かいコツを踏まえたうえで活用をしていきたいと考えています。

# 謝辞
データ変換をしてくださった関係の皆様に感謝します。
Claude 3.5 Sonnetでエージェンティックコーディング：VSCodeとの連携がもたらす未来

最近、Claude 3.5 Sonnetという新しいAIモデルが発表されました。このモデルは、ソフトウェアエンジニアが直面する最も時間のかかるタスクであるテストの作成やコードの修正を自動化することを目指しています。この記事では、YouTubeで公開されたデモ動画の流れを基に、Claude 3.5 Sonnetがどのようにしてエージェンティックコーディングを実現するのかを紹介します。

## Claude 3.5 Sonnetのデモ

<iframe width="560" height="315" src="https://www.youtube.com/embed/A598ESCoC70?si=fvXI63yiMUsw-N2W" 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>

### 問題の特定と修正の流れ

1. **現状の問題**
   - 画像を円形にリサイズ・クロップする関数にバグがあり、クロップ後の画像が四角のままで白い背景が残っています。

2. **Claudeへの指示**
   - Claudeにバグの詳細、関数ファイルのパス、修正の指示を提供します。

3. **ファイルの解析**
   - Claudeは関数ファイルを開き、現在の実装を理解して潜在的な問題を特定します。

4. **テストスイートの作成**
   - Claudeはテストスイートを作成し、指定されたファイルに追加します。

5. **テストの実行**
   - Claudeはテストを実行し、バグのためにテストが失敗することを確認します。

6. **バグの修正**
   - Claudeは関数のバグを修正します。

7. **再テストの実行**
   - Claudeは再度テストを実行し、すべてのテストが合格します。

### 結果の確認

修正後、関数を再度実行すると、画像にはもはや白い背景がなくなり、期待通りの動作を実現します。

## VSCodeとの連携がもたらす未来

このデモから、Claude 3.5 SonnetがVSCodeのようなエディタと連携して、エージェンティックコーディングの機能を提供することが期待されます。私自身はまだこのモデルを試していませんが、動画での紹介を見る限り、その可能性に大いに期待しています。今後、Claude 3.5 Sonnetがどのように進化し、エンジニアの生産性を向上させるのか、非常に楽しみです。

---

Claude 3.5 Sonnetの進化に注目しつつ、今後も関連情報を追っていきたいと思います。試せる機会があれば、ぜひ試してみて、その実力を体感してみてください。
AuroraのDataAPIってなに？

## はじめに
たまに、RDS AuroraのDataAPIについてよく聞きます。
なんとなく、RDSに接続するためのAPIなんだろうな程度に思っていました。
今回は、DataAPIについて詳しく調べてみたいと思います。

## DataAPIとは
DataAPIとはAmazon Auroraのみで使用できるAPIです。
DataAPIを使用することによって、lambdaやAppSync、Cloud9等にAPIから接続することができます。
DataAPIを使用し、Auroraのデータを取得することが可能です。
また、DataAPIはライターインスタンス（書き込み、読み込み可能なインスタンス）でしか実行できません。
(レスポンスのサイズの上限は1 MiB です。1 MiB を超えるレスポンスデータが返されると、その呼び出しは終了します。)
DataAPIを使用するにはAurora作成時に、「RDS Data API を有効にする」にチェックをいれないといけません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/0e4a6f98-4ec5-e0be-de9e-b1fb0abf4294.png)

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/data-api.html#data-api.enabling

## まとめ
以下に、主な要点をまとめます。
- DataAPIはAuroraのみ使用可能
- lambda,AppSync,Cloud9等で利用可能
- ライターインスタンスでAuroraのSQLを実行可能
- レスポンス上限は1MiB
- Aurora作成時に「RDS Data API を有効にする」にチェックを入れる

DataAPIについてあいまいだった部分を理解できたので良かったです。
Claude 3.5 SonnetのArtifactsを有効にしてPlantUMLで作図させてみた

## はじめに
こんにちは！今回は、最新AIモデル「Claude 3.5 Sonnet」とその新機能「Artifacts」を使って、PlantUMLで作図を行ってみました。Anthropicが提供するこの新機能は、生成AIの新しい可能性を示しており、特にコード生成やドキュメント作成において大きな力を発揮します。

以下の記事でやってみたことを、Claude 3.5 Sonnetでやってみました。

https://qiita.com/Tadataka_Takahashi/items/f20a472d1dea3abffa99

## Artifactsとは？
「Artifacts」は、Claudeとの対話を通じてコンテンツを作成し、管理できる新機能です。特に長いコンテンツや修正が必要なコンテンツ、会話の文脈外で使用されるコンテンツ（例：スライド、マインドマップ、コード）に適しています。

現時点で無料版でも時間あたりの実行数に限りがありますが、試してみました。実行スピードが速く、少ないプロンプトの指示で精度の高いコンテンツを作成できる体験ができました。また、左側にプロンプトの画面が表示され、右側に出力結果が表示されるため、作業効率が非常に高いと感じました。

## PlantUMLでの作図

### Step 1: Artifactsの有効化
まずは、「Artifacts」を有効にする必要があります。Feature PreviewからArtifactsをオンにします。これで、Claudeとの会話の中でArtifactsを利用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b9aff3f3-e877-a3e7-56da-c2ac4ec17013.png)
プロンプトの画面の次のアイコンをクリックする(2024年6月22日時点)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/f0bc0bc6-7155-103e-3c9a-f6cddd01c705.png)
またはFeature Previewをクリックする(2024年6月22日時点)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a2410ca7-b7b2-2442-ce69-f3bd2e07be2c.png)

### Step 2: プロンプトを入力
次に、Claudeに対してPlantUMLを使った作図の指示を出します。具体的には、以下のようなプロンプトを入力します。

### プロンプト例

```
以下のシステム設計を基に、シーケンス図をPlantUML形式で出力してください。

システム名：ユーザー管理システム

処理の流れ：

ユーザーがログイン画面で名前とパスワードを入力します。
認証システムがユーザー情報を検証します。
認証システムがデータベースにユーザー情報の確認をリクエストします。
データベースが認証システムにユーザー情報を返します。
認証システムがログイン結果をユーザーに返します。
管理者がユーザー管理画面でユーザー情報を編集します。
認証システムがデータベースにユーザー情報の更新をリクエストします。
データベースが認証システムに更新結果を返します。
認証システムが管理者に更新結果を返します。
以下のシーケンス図をPlantUML形式で生成してください。
```
### Step 3: ダウンロード
最終的に完成した図は、ワークスペースの右下にあるダウンロードアイコンをクリックすることでダウンロードできます。これにより、生成されたPlantUMLの図をローカルに保存し、他のドキュメントやプレゼンテーションに利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c0466974-00ed-3810-3421-3f86710897c9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a65e68d9-1a3d-04b2-0114-07ff265da803.png)

### Step 4: 次のプロンプトの入力

### プロンプト例

```
ログの出力機能を追加してシーケンス図を更新して
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/30b3dcda-1ee7-a0e3-2932-702b54236cab.png)

新しいプロンプトを指定して図を更新していけました。

## 実際に試してみた感想
無料版で時間あたりの実行数に限りがありますが、試してみました。実行スピードが速く、少ないプロンプトの指示で精度の高いコンテンツを作成できる体験ができました。また、左側にプロンプトの画面が表示され、右側に出力結果が表示、更新されるため、作業効率が非常に高いと感じました。

## まとめ
Claude 3.5 Sonnetの新機能「Artifacts」を使うことで、簡単にPlantUMLを用いた作図が可能となりました。生成AIの進化により、コード生成やドキュメント作成の効率が大幅に向上することが期待されます。是非、皆さんもこの機能を試してみてください！

## 参考

興味を持った方は、ぜひAnthropicの公式紹介動画をご覧ください。1分30秒ほどの短い動画で、その素晴らしさを実感できると思います。
<iframe width="560" height="315" src="https://www.youtube.com/embed/rHqk0ZGb6qo?si=kzqkVAcEqXdps2VC" 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>

https://www.anthropic.com/news/claude-3-5-sonnet
SPACE フレームワーク

SPACE は 開発者の生産性のためのフレームワークです。
開発生産性に関する最新の研究の多くを 1 つのフレームワークに統合しています。

DORAチームのメンバーであり、書籍『 Accelerate』の共著者でもあるNicole Forsgren が、SPACE フレームワークの研究を主導しました。
SPACE は、DORA に含まれる特定の指標を超えて、開発者の生産性についてより完全かつ詳細な情報を提供します。

SPACE は、開発者の生産性の最も重要な 5 つの側面 (満足度と幸福、パフォーマンス、アクティビティ、コミュニケーションとコラボレーション、効率とフロー) を 3 つの異なる組織レベル (個人、チーム、システム) でリストします。

SPACE フレームワークを使用する理由は何ですか?
-
SPACE フレームワークは、開発者の生産性を測定するこれまでの試みの欠陥を克服することを目的としています。これらの「開発者の生産性に関する神話と誤解」には次のものが含まれます。

- 生産性は開発者の活動にかかっています。
- 生産性は個人のパフォーマンスのみに関係します。
- 1つの生産性指標ですべてがわかります。
- 生産性の測定は管理者にとってのみ有用です。
- 生産性はエンジニアリング システムと開発者ツールにのみ関係します。

こうした誤解に対抗するために、SPACE フレームワークは、開発者の生産性に関する幅広い研究に基づいて、「はるかに大きな空間で生産性について合理的に考える方法を提供します」。

開発者の生産性に関する SPACE フレームワークの次元
-
# 満足感と幸福感
「満足度とは、開発者が仕事、チーム、ツール、文化にどれだけ充実感を感じているのかということです。幸福とは、開発者がどれだけ健康で幸せであるか、そして仕事がそれにどれだけ影響を与えているかということです。」

研究によると、生産性と満足度は相関関係にあることがわかっています。満足度と幸福度を測定すると、生産性を理解するのに役立ち、燃え尽き症候群や生産性の低下を示す先行指標として機能する可能性があります。

満足度と幸福感は、多くの場合、調査によって最もよく測定できます。
## メトリックの例:
- 従業員満足度（eNPSとチームヘルスチェック）
- 投資残高（KTLO額）
- 燃え尽き症候群とエンゲージメント

#パフォーマンス
「パフォーマンスはシステムまたはプロセスの結果です。」

ソフトウェア エンジニアリングのパフォーマンスを定量化するのは難しい場合があります。個々の作業をビジネス成果に結び付けるのは、多くの場合困難です。より多くのコードをより速く作成しても、より高品質のコードが作成されるとは限りません。高品質のコードが顧客に価値をもたらすとは限りません。顧客が好む機能が必ずしも良いビジネス成果を生み出すとは限りません。

これらの課題のため、ソフトウェア エンジニアリングのパフォーマンスは、出力ではなく成果として評価するのが最適です。

## メトリックの例:

- 変更失敗率（DORA）
- 投資残高（新しいものを建設する金額）
- 顧客満足度（NPS）
- 信頼性

# 活動
「アクティビティとは 、作業の実行中に完了したアクションまたは出力の数です。」これには、設計ドキュメントなどの出力や、インシデント緩和などのアクションが含まれます。

開発者のアクティビティは、正しく測定されれば、開発者の生産性に関する貴重な洞察を提供できますが、得られる情報は限られています。実際には、開発者のアクティビティの多くは扱いにくいため (チーム会議への出席や他のチーム メンバーの支援など)、開発者のアクティビティを包括的に測定することは不可能です。

したがって、アクティビティ メトリックを単独で使用することは絶対にせず、常に他のディメンションのメトリックとバランスをとる必要があります。

## メトリックの例:

- 完了した問題
- プルリクエストがレビューされ、マージされました
- 展開頻度 ( DORA )

# コミュニケーションとコラボレーション
「コミュニケーションとコラボレーションとは、人々やチームがどのようにコミュニケーションし、協力し合うかを表します。」

ソフトウェア開発には、個人とチーム間の広範かつ効果的なコミュニケーションとコラボレーションが必要です。効果的なチームは、他の人の作業に対する高い透明性と認識に依存し、全員が必要な情報にアクセスできるようにします。

良好なコミュニケーションとコラボレーションはチームレベルおよびシステムレベルの生産性を向上させますが、個人の生産性と矛盾することがよくあります。他の人を助けると、個々の開発者がフロー状態に入る能力が制限され、モチベーションと満足度が低下する可能性があります。

コミュニケーションとコラボレーションを直接測定することは、多くの目に見えない作業が含まれるため複雑です。以下のメトリックの例は、コミュニケーションとコラボレーションを測定するためのプロキシとして使用できます。

## メトリックの例:

- 同じ機能に取り組んでいる人の数
- チームの健康診断（サイロとコミュニケーション）
- プルリクエストのレビュー時間

# 効率と流れ

「効率性と フローとは、個人またはシステムを通じて、中断や遅延を最小限に抑えて作業を完了したり、作業を進めたりする能力を指します。」

個々の開発者にとって、生産性のこの側面は、「流れに乗る」という話に反映されます。チームレベルおよびシステムレベルでは、効率性はアイデアを最初から最終顧客に届けるために必要な手順に関係します。

効率とフローの改善による体系的な効果は、多くの場合、エンジニアリングの生産性に大きな影響を与えます。SPACE 以外では、この側面は Donald G. Reinertsen 著の画期的な書籍「  Principles of Product Development Flow」で詳しく説明されています。

ソフトウェア開発フローから収集されたメトリック (例: DORA 変更リードタイム) と調査データの組み合わせにより、効率とフローを測定できます。

## メトリックの例:

- チームの健康診断（サイロとコミュニケーション）
- 流れを維持し、仕事を完了する能力があると思われる
- 投資残高（生産性関連作業量）
- リードタイムと回復時間の変更（DORA）
- ストーリー/発行サイクル時間

SPACEフレームワークの組織レベル
組織内で何が起こっているかをより完全に把握するために、SPACE フレームワークでは、次の 3 つの組織レベルごとに個別の指標を選択することを推奨しています。

- 個人
- チームまたはグループ: 一緒に働く人々。
- システム: 設計から生産までの組織の開発パイプラインなど、システムを介したエンドツーエンドの作業。
Azure DevOps Service REST APIでWikiの更新を試してみたメモ

## 概要
公式ドキュメントは割としっかり書いてある。
ただ、実例があまり見つからなかったので備忘録として残しておく。

## トークン取得
[Azure DevOps REST API を使ってみよう][*1]を参考にトークンを取得する。
記事では Fiddler を使っているが、導入していないのでBashでトークンを使える形にした。
```
echo -n "hoge:fugaToken" | base64
```

`dGVzdDpwYXNzd29yZA==`

## APIからページのデータを取得。
[Pages - Get Page By Id](https://learn.microsoft.com/en-us/rest/api/azure/devops/wiki/pages/get-page-by-id?view=azure-devops-rest-7.1&tabs=HTTP)を参考にしてRESTAPIを作成する。

`GET https://dev.azure.com/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}/pages/{id}?api-version=7.1-preview.1`のパスがドキュメントから確認できる。


たとえば、`/pullrequest/mermaid`のパスに存在する、`https://dev.azure.com/hogehoge/てすと/_wiki/wikis/ほげ/952/mermaid` のページの情報を取得する場合を下記に示す。
日本語や/が混じるとエラーとなるため、URLエンコードを行う。

```
GET https://dev.azure.com/hogehoge/%E3%81%A6%E3%81%99%E3%81%A8/_apis/wiki/wikis/%E3%81%BB%E3%81%92/pages/952?api-version=7.1-preview.1
Authorization: Basic dGVzdDpwYXNzd29yZA==
Content-Type: application/json
```


```
echo -n "てすと" | perl -MURI::Escape -ne 'print uri_escape($_)'
echo -n "ほげ" | perl -MURI::Escape -ne 'print uri_escape($_)'
```

このAPIのレスポンスヘッダに記載されている`ETag`のIDは、更新に使うため控えておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/2a4e1556-aaed-884c-ce6e-523200882149.png)


### APIを通じてページの更新を行う。
[Pages - Create Or Update](https://learn.microsoft.com/en-us/rest/api/azure/devops/wiki/pages/create-or-update?view=azure-devops-rest-7.1&tabs=HTTP)


ブランチをazureブランチとしてwikiの管理をしているとする。
`path=`にURLエンコードしたパス（`/`の変換）を指定する。( `echo -n "pullrequest/mermaid" | perl -MURI::Escape -ne 'print uri_escape($_)'` )
`If-Match`には先ほどGETした戻りのヘッダのETagを取得する。



```
PUT https://dev.azure.com/hogehoge/%E3%81%A6%E3%81%99%E3%81%A8/_apis/wiki/wikis/%E3%81%BB%E3%81%92/pages?path=pullrequest%2Fmermaid&versionDescriptor.version=azure&api-version=7.1-preview.1
Authorization: Basic dGVzdDpwYXNzd29yZA==
Content-Type: application/json
If-Match: "30d74d258442c7c65512eafab474568dd706c430"


{
  "content": "piyopiyo"
}

```


## 参考

[Azure DevOps REST API を使ってみよう][*1]
[AzureDevOpsPipelineからRESTAPIをたたく](https://qiita.com/YokoKen/items/a0aa96dea26e8f7f4b03)

[*1]:https://tafuji.hatenablog.com/entry/2019/12/23/000001
登録セキスペ オンライン講習 2023 参考資料備忘録 #3

この記事は、#1, #2に引き続き、登録セキスペ オンライン講習で取り上げられている資料の中で、後日時間を取って再度目を通したいと思う物のリンクを忘れないようにまとめておくことを目的としています。

https://qiita.com/y-vectorfield/items/92e22ee6a09c66c0c96d

https://qiita.com/y-vectorfield/items/5bb912fac06faa631a1c

# 実際に発生したセキュリティ事故報告書

## 徳島県つるぎ町立半田病院でのコンピュータウイルス感染事例
https://www.handa-hospital.jp/topics/2022/0616/report_01.pdf

## 株式会社ヴィアックスの勤怠管理システムでの事例
https://www.viax.co.jp/pdf/20220601.pdf

## コロニアル・パイプラインにおけるランサムウェアの事例
https://active.nikkeibp.co.jp/atcl/act/19/00324/100800001/

## 宇陀市立病院におけるコンピュータウイルス感染事例
https://udacity-hospital.jp/wp-content/uploads/2024/05/houkokusyo.pdf

## 尼崎市におけるUSBメモリ紛失事例
https://www.city.amagasaki.hyogo.jp/_res/projects/default_project/_page_/001/030/947/20230609.pdf

# 対策編
## サイバー攻撃を受けた組織における対策事例
https://www.nisc.go.jp/pdf/policy/inquiry/kokai_jireishu.pdf

## ランサムウェアの脅威と対策
https://www.ipa.go.jp/security/anshin/measures/ug65p9000000njuc-att/000057314.pdf

## バックアップの3-2-1ルール
https://active.nikkeibp.co.jp/atcl/act/19/00282/041900001/

# 各種ツール
## 複合ツール(ランサムウェア対策)
https://www.nomoreransom.org/ja/index.html

## セキュリティ関連費用可視化ツール
https://www.ipa.go.jp/jinzai/ics/core_human_resource/final_project/2022/visualization-costs.html

## ベンダー選択チェックシート
https://digitalforensic.jp/home/act/products/higai-checksheet/
Zenn・Qiita-CLIでのコマンドまとめ

## １．はじめに
最近ZennとQiitaのCLIを導入しました！
また、両記事をGithubと連携し、ひとつのリポジトリで管理できる環境構築にも成功しました！
構築にあたっては[Zenn公式の記事](https://zenn.dev/zenn/articles/zenn-cli-guide)及び以下の記事に大変お世話になりました。

https://zenn.dev/ot07/articles/zenn-qiita-article-centralized

おかげさまでGit・Githubについても勉強することができました！フォロー必須です！！！

https://zenn.dev/ot07

環境構築できたはいいが、CLIコマンドについてうろ覚えなので備忘録的な感じで記事にしようと思います。

## ２．Zenn-CLIコマンド
#### ◯CLIの起動
```
npx zenn init
```
任意のディレクトリでコマンドを実行することで、`article`と`books`ディレクトリが作成される。
#### ◯記事新規作成
```
npx zenn new:article
```
これでランダムな`マークダウンファイル（.md）`が作成されますが、ファイル名はわかりやすくしたいので自分は以下を多用
```
npx zenn new:article --slug <ファイル名>
```
これで＜ファイル名＞のマークダウンファイルが生成されます！

#### ◯プレビュー
```
npx zenn preview
```
`http://localhost:8000`にブラウザからアクセスしてプレビューが確認

とりあえずはこれらをおさせておけば一時は大丈夫かな？

細部は以下に頼ろう。。。

https://zenn.dev/zenn/articles/zenn-cli-guide

## ３．Qiita-CLIコマンド
#### ◯CLIの起動
```
npx qiita init
```
Zenn同様に関係ファイルが作成される。
-.gitignore
-GitHub Actions のワークフローファイル
-ユーザー設定ファイル（qiita.config.json）

#### ◯ログイン
発行したトークンで以下の要領でログイン
```
npx qiita login
```
```
発行したトークンを入力: トークンを入力しEnterキーを押す
Hi ユーザー名!
```
Zennのときログインしたっけ？？？（した記憶なし。。。）

#### ◯プレビュー
```
npx qiita preview
```
`http://localhost:8888`にブラウザからアクセスしてプレビュー

#### ◯記事新規作成
先ほども紹介しました[**神記事**](https://zenn.dev/ot07/articles/zenn-qiita-article-centralized)のおかげでQiitaはCLIからの新規作成は行いません！
これが非常に助かります！！！
【2024マラソン06】immersedでできること

# 何の記事？
バーチャルデスクトップができるアプリ「immersed」の使い心地がとてもよかったので、どんなことができるのかをまとめました。

https://immersed.com/

# 誰向け？ どんな役にたつ？
- VRヘッドセットを使ったバーチャルデスクトップが気になっている人
- バーチャルデスクトップに向いている作業が気になる人
- immersedでできないことが知りたい人


# 私の環境
- ゲーミングではない一般スペックのPC
- Meta quest2
- iPad Pro
- iPhone


# 接続準備
## 初期設定
1. immersedを接続機器にそれぞれインストール
1. quest2のチュートリアルにそって設定を進める

quest2のimmersedを立ち上げると初期設定という名のチュートリアルがはじまり、終えるとあとはバーチャルデスクトップを楽しむことができます。
なお、iPhoneやiPadもimmersed上に召喚することができます。

## 2回目以降
次回以降はPC->quest2の順にアプリを立ち上げると自動で接続されます。
iPhoneやiPadはquest2のアプリを立ち上げた後、それぞれ機器を選択することで接続します。

# ここがいい
- 好きなVR空間を選んで作業ができるので**没頭できる**
- **デスクトップを最大5枚出せる**のでコードの比較などに便利
- **物理モニターのサイズに左右されず**大きい画面で作業できる
- **BGM付カフェ**や**暖炉**がある雪山など、その時の気分に合った空間が選べる
- **全くの他人がいるスペース**で集中することもできる
- youtubeなどPCから**流したBGMに反応して空間にエフェクトがかかるスペースも**ある
- **iPhoneやiPadも接続できる**ので連絡や通知にも気付ける
# ここがネック
- **questコントローラでデスクトップの操作はできない**
    - immersedはあくまでも**PC画面を投影**でき、仮想デスクトップをふやせるだけ
- questを**長時間つけていると疲れる**
- 無線で使用する場合quest2は**1時間弱しか充電が持たない**
- steam VRなど、**PC VRはできない**

# 課金プランは継続利用で解禁する
課金してproプランにすることで、デスクトップ画面を最大5枚まで増やすことができます。
ただし、proプランは直近10日間のうち3日間の使用で解禁され、以後も継続して使うことで解禁された状態を保てます。
## 継続利用の条件
- **直近10日間のうち、3日間使用していること**
**immersed上の画面ではなぜか継続状況が確認できない**ため、pro解禁のメールがきたら使えるし、proじゃなくなったメールがきたら3/10日間の利用が途切れたと判断するのが手っ取り早いです。

## 課金プランでできること
- デスクトップを5枚生やす
- proプランを使っている人専用の部屋に入れる

# こんな作業にオススメ
- タイピング練習
- コーディング
- 動画や音楽をききつつの作業
- 人の眼がないとさぼりがちな時の共有スペースの利用

# 最後にひとこと
文章だけだとなかなかよさが伝えきれませんが、集中して作業したい時に重宝しています。
カフェに出かけなくても家にいながらして、人の眼があるカフェ空間で作業することもできますし、360度画像の海の上や一面暗闇の中で作業することもできます。
VR機器をお持ちの価値はぜひ試してみてください。
ProxmoxのLXCでArchlinuxを動作させたときのメモ

いくつかエラーが出たので対処方法のメモ

* network InterfaceがDOWNになってる / IP振れない / `reboot` できない
    * Option -> Features -> nesting=1 (有効化,ただし非推奨とのこと)  
      ※ 訂正: `--unprivileged` オプションの有無は関係なし

      ```bash:CLIでの作例
      $ pct create 999 local:vztmpl/archlinux-base_20230608-1_amd64.tar.zst \
           --storage local-lvm --hostname cthostname01 --timezone Asia/Tokyo \
           --nameserver=192.168.xx.1 \
           --net0 name=eth0,bridge=vmbr0,gw=192.168.xx.1,ip=192.168.xx.yy/24 \
           --ssh-public-keys /path/to/.ssh/authorized_keys \
           --features nesting=1
      ```
    * 上記で意図的にrootにパスワードを設けていないので、このコンテナの端末操作にはホストのshellで `pct exec 999 /bin/bash` を使う

* pacman実行で keyringのエラーがいっぱい  
  ```
  error: keyring is not writable
  error: required key missing from keyring
  error: failed to commit transaction (unexpected error)
  Errors occurred, no packages were upgraded.
  ```
    * 以下で対処
      ```bash
      $ pacman-key --init
      $ pacman-key --populate archlinux
      $ pacman -Sy archlinux-keyring
      ```

* `pacman -Syu` 実行でめっちゃ遅い
    * `/etc/pacman.d/mirrorlist` をJapanのみ有効化
波紋を作ってみた

物理の授業で2点の水面に振動を加えると波紋ができると習いましたが実際どんな感じなのかPythonでやってみました
```Python3
import matplotlib.pyplot as plt
import numpy as np

arr = np.linspace(-4, 4, 1000)
x, y = np.meshgrid(arr, arr)
z1 = np.sin((y**2 + (x - 2)**2))
z2 = np.sin((y**2 + (x + 2)**2))
plt.contourf(z1 + z2, cmap="gray")
plt.colorbar()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/994456c4-7f81-ab48-06a2-8059d9d234e6.png)

次に4点でやってみようと思います
```Python3
import matplotlib.pyplot as plt
import numpy as np

arr = np.linspace(-4, 4, 1000)
x, y = np.meshgrid(arr, arr)
z1 = np.sin((y**2 + (x - 2)**2))
z2 = np.sin((y**2 + (x + 2)**2))
z3 = np.sin(((y - 2)**2 + x**2))
z4 = np.sin(((y + 2)**2 + x**2))
plt.contourf(z1 + z2 + z3 + z4, cmap="gray")
plt.colorbar()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/ef145244-232f-44fe-c844-83688558a507.png)

# まとめ
こういうの授業で見せてくれると想像しやすいんですけどね
monorepoでもhusky+lint-stagedを使う

# はじめに

フロントエンドをNextで、バックエンドをGoでWebアプリを作ろうとしています。
monorepoで管理する場合、どうやってlint-staedを実行すれば良いか知らなかったので備忘録としてまとめてみます。

# ディレクトリ構造

```
Project
 |-frontend(Next)
 └-backend(Go)
```

# 前提条件
- lintやprettierの実行が可能な状態になっていること

# やったこと

1. Projectディレクトリ内でhusky+lint-stagedをインストール
    frontend、backendと同じ階層で以下を実行します。
    
    ```bash
    yarn add -D husky lint-staged
    ```

    次に.huskyフォルダの作成とpre-commitファイルを編集します。
    ```bash
    npx husky init
    ```

    ```.husky/pre-commit
    yarn lint-staged
    ```
    
1. `.lintstagedrc.js`を作成
    frontend、backendの配下にそれぞれ以下のファイルを作成します。

    ```/frontend/.lintstagedrc.js
    const path = require("path");
    
    module.exports = {
      "src/**/*.{ts,tsx}": (absolutePaths) => {
        const cwd = process.cwd();
        const relativePaths = absolutePaths.map((file) => path.relative(`${cwd}/frontend`, file)).join(" ");
        return [`eslint ${relativePaths}`, `prettier --write --log-level=warn ${relativePaths}`];
      },
    };
    ```

    ```/backend/.lintstagedrc.js
    module.exports = {
      "*.go": "go fmt",
    };
    ```

以上でcommit時にlint-stagedがはたらくはずです。
あとは各々のプロジェクトに合わせて、編集してみてください。
はじめてのLaravel 〜 Laravel Bootcampで遊ぶ #1

# はじめに
みなさんこんにちはハッサクと申します。
普段仕事ではPHP（バニラ）でWeb開発とPythonでのAI開発、個人開発ではFlutterとSupabaseを使用して趣味のライブイベント運営で使用するチケットアプリの制作なんかを行なっております。

最近PHPのフレームワークを導入して、VueとかReactとか触ってみたいなと思い、片手間でコツコツ触ってみることにしたので開発日記のようにLaravel Bootcampの学習をまとめていこうと思います

# Laravel Bootcampとは

https://bootcamp.laravel.com/

Laravel Bootcampは無料のコースでモダンなアプリケーションを構築する方法を学べるサイトです。
3種類のコースによって「Chirper」という小規模のブログプラットフォームを構築するチュートリアルのようです。

## コース一覧
1. Blade
Laravelの標準テンプレートエンジンのBladeを使用するコース
2. Livewire
JavaScriptを使用せず、BladeとPHPによって動的な機能を作成するライブラリを使用するコース
3. Inertia
サーバーサイドのルーティングとコントローラを使用して、モダンなSPA（Single Page Application）として、VueやReactアプリケーションを構築するコース

https://qiita.com/Hassaku_hako/items/60cee7bc9871cb80e89c

# はじめてのLaravelコースの進め方
はじめてのLaravelコースとしてチャプターを進めながら、Laravel Bootcampを進めつつ、付随して調べた内容や詰まったエラーなどを追記していこうと思います。
Laravelに関しては完全ど素人ですので、バカな過ちを犯していたら叱咤激励をいただければ幸いです。
LambdaのFunction URLsを試してみた!

こんにちは、プログラミングが好きなブタさんです。
API Gatewayを使わずに Lambda のみで HTTPエンドポイントを作れるようになったので解説します。

<iframe width="560" height="315" src="https://www.youtube.com/embed/bUYkp9KdhsE?si=E_tPLEpJuZBE_Ob_" 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>

マネジメントコンソールから Lambda関数を作成します。
言語は Python に設定します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684907/536e5d1a-039d-a150-0884-a40938e54c18.png)

設定タブを選択し、関数URLを選択します。
関数URLの作成ボタンを押します。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684907/2bb217c4-f4e2-1261-0c84-df29f25392cf.png)

今回は認証をつけないので、認証タイプにNONEを入れて関数URLを作成します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684907/de9a0285-cec3-af5a-48b6-54fb517034a2.png)

これだけで関数URLを作ることができました。
もちろんブラウザから開くと Lambda が実行されていることがわかります。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684907/dfc00eb3-1b58-0f9e-d966-77dfd1a076da.png)

次に curl コマンドでレスポンスヘッダーを確認します。
コードに記載されているステータスコードが反映されています。

ちなみにHTTPメソッドの制御をするには API Gateway との連携が必要そうです。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684907/41e29926-7282-ee4d-8c85-2f336199ca2e.png)

今回は Lambdaの関数URL機能を使い、HTTPエンドポイントを作ってみました。
Lambdaを使ったアプリが作りやすくなりましたね。
【VSCode】ホットキーでパネルを最大化する方法

パネルの最大化にホットキーを設定するには以下の手順を行います。

まず、`cmd + k cmd + s`を押下するか、コマンドパレットを使用してキーボードショートカットの設定画面を開きます。

`workbench.action.toggleMaximizedPanel`を検索します。

![スクリーンショット 2024-06-21 23.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c460efb7-7bb7-01ed-563e-b424289dbe74.png)

表示されたコマンドをダブルクリックし、任意のホットキーを押下します。
すると以下のように設定されます。

![スクリーンショット 2024-06-21 23.55.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/99577b8e-5830-afab-122f-61986b0edeec.png)

以後、設定したホットキーを押下するとパネルが最大化されるようになります。
よく使う関数型インターフェース(入門レベル)

# 導入

Java SE 8から、関数型インターフェースが導入され、Javaでの関数型プログラミングがより簡単になりました。関数型インターフェースは、1つの抽象メソッドを持つインターフェースです。

**「1つの抽象メソッドを持つインターフェース」**　というワードですぐに`ラムダ式`が思いついた人はさすがです。
この関数型インターフェースは、ラムダ式を利用したものになります。

本記事では、特によく使われる関数型インターフェースについて説明し、その利用方法を紹介します。

# 使用頻度の高い関数型インターフェース

## Function\<T, R>

`Function<T, R>`は、引数を1つ取り、結果を返す関数です。
`T`は引数の型、`R`は戻り値の型です。
抽象メソッドは`R apply(T)`になります。

### 使用例

```java
Function<Integer, String> ageFunction = (age) -> { return age + "歳"; };
String ageString = ageFunction.apply(30);
System.out.println(ageString);
// [30歳]
```

上記のようにapplyメソッドを使用することで、`R`で指定した型、今回ならString型の戻り値を取得することができます。

### BiFunction\<T, U, R>

こちらはFunctionに似ていますが、少し異なります。
`BiFunction<T, U, R>`は、引数を2つ取り、結果を返す関数です。
`T`と`U`は引数の型、`R`は戻り値の型です。

```java
BiFunction<Integer, Integer, String> taxFunction = (price, taxRatio) -> { return (price * (0.01 * tax + 1)) +  "円"; };
String taxIncludedPrice = taxFunction.apply(10000, 10);
System.out.println(taxIncludedPrice);
// [10100円]
```

使い方としてはFunctionと同様ですが、引数を2つ取れるので、計算等に向いています。

## Consumer\<T>

`Consumer<T>`は、引数を1つ取ります。
戻り値はvoidです。
抽象メソッドは`void accept(T)`です。

### 使用例

```java
Consumer<String> getConsumer = (item) -> { System.out.println(item + "を手に入れた!"); };
getConsumer.accept("伝説の剣");
// [伝説の剣を手に入れた!]
```

## Predicate\<T>

`Predicate<T>`は、引数を1つ取り、booleanを返します。
抽象メソッドは`boolean test(T)`です。

### 使用例

```java
Predicate<Integer> positiveNum = (inputNum) -> { return inputNum > 0; };
boolean input1 = positiveNum.test(-10);
System.out.println(input1);
// false
boolean input2 = positiveNum.test(100);
System.out.println(input2);
// true
```

こちらは最近のドメイン駆動設計において、人気が高まっています。
これまでのAND/OR/NOT条件をPredicate型を利用することで、よりシンプルで明確なコードにすることができるためです。

```java
Predicate<Integer> positiveNum = (inputNum) -> { return inputNum > 0; };
Predicate<Integer> lessThan10 = (inputNum) -> { return inputNum < 0; };

// 複合条件を作成
Predicate<Integer> posiAndLess10 = positiveNum.and(lessThan10);

boolean input3 = posiAndLess10.test(-10);
System.out.println(input3);
// false
boolean input4 = posiAndLess10.test(100);
System.out.println(input4);
// false
boolean input5 = posiAndLess10.test(5);
System.out.println(input5);
// true
```

## Supplier\<T>

`Supplier<T>`は、引数を取りませんが、結果を返す関数です。
抽象メソッドは`T get()`です。

### 使用例

```java
Supplier<String> helloSupplier = () -> "Hello World!";
String helloMessage = helloSupplier.get();
System.out.println(helloMessage);
// Hello World!
```

# メソッド参照

メソッド参照は、ラムダ式の代わりに使用できる、関数型インターフェースを実装する手段の1つです。例えば、`System.out.println()`を`System.out::println`と表現できます。

### 使用例

```java
Consumer<String> println = System.out::println;
println.accept("Hello World!");

// 参考：ラムダ式
Consumer<String> println2 = (str) -> { System.out.println(str); };
println2.accept("Hello World!");
```

## 最後に
Java SE 8で導入された関数型インターフェースは、ラムダ式やメソッド参照を使った簡潔なコード記述を可能にし、より直感的でモダンなJavaプログラミングを実現します。これらのインターフェースと使い方に慣れることで、日常的なコードの簡素化や保守性の向上に役立つでしょう。
Rubyでデザインパターン (4) FactoryMethodパターン

## この記事は何
デザインパターンについて、Rubyでどのような使い方ができるかをまとめた記事です。
デザインパターン自体の解説は詳しく行いません。

## FactoryMethodパターンとは
FactoryMethodパターンとは、スーパークラスで特定のインスタンスに対しての処理のステップを実装し、サブクラスでどのインスタンスに対して処理を行うのかを指定するデザインパターンです。

詳しくはこちらをご覧ください。

https://qiita.com/shoheiyokoyama/items/d752834a6a2e208b90ca

## Rubyでのコード例
スーパークラスで手続きの流れを実装し、サブクラスで手続きの処理で呼び出しているメソッドの定義と、インスタンスの定義を行います。

```rb
class SuperClass
  def factory_method
    instance = build_instance
    method1(instance)
    method2(instance)
    method3(instance)
  end

  private

  def build_instance
    fail NotImprementedError
  end

  def method1(instance)
    puts "method1: #{instance.hoge}"
  end

  def method2(instance)
    puts "method2: #{instance.hoge}"
  end

  def method3(instance)
    puts "method3: #{instance.hoge}"
  end
end

class SubClass < SuperClass
  private

  def build_instance
    SomeClass.new
  end
end

module Buildable
  def hoge
    fail NotImprementedError
  end
end

class SomeClass
  include Buildable

  def hoge
    'hoge'
  end
end

SubClass.new.factory_method
```

```:出力結果
method1: hoge
method2: hoge
method3: hoge
```

## どのような時に使えるか
インスタンス生成→インスタンスに対して処理を行う流れを定式化したい時に有効です。
例えばデータベースクライアントの生成処理などはFactoryMethodパターンを利用することでインスタンスの生成処理を共通化することができます。

```rb
class DatabaseConnector
  def connect
    connection = create_connection
    authenticate(connection)
    setup(connection)
    connection
  end

  private

  def create_connection
    fail NotImprementedError
  end

  def authenticate(connection)
    puts "Authenticating with #{connection.credentials}"
  end

  def setup(connection)
    puts "Setting up connection for #{connection.database}"
  end
end

class MySQLConnector < DatabaseConnector
  private

  def create_connection
    MySQLConnection.new('mysql_database')
  end
end

class PostgreSQLConnector < DatabaseConnector
  private

  def create_connection
    PostgreSQLConnection.new('postgres_database')
  end
end

class MySQLConnection
  attr_reader :database, :credentials
  def initialize(database)
    @database = database
    @credentials = "MySQL Credentials"
  end
end

class PostgreSQLConnection
  attr_reader :database, :credentials
  def initialize(database)
    @database = database
    @credentials = "PostgreSQL Credentials"
  end
end

MySQLConnector.new.connect
PostgreSQLConnector.new.connect
```

```:出力結果
Authenticating with MySQL Credentials
Setting up connection for mysql_database
Authenticating with PostgreSQL Credentials
Setting up connection for postgres_database
```
【Rails6.1】本番環境で発生したMysqlのサブクエリに関するエラーを解消

# はじめに
デプロイを行った際にSQLでエラーが発生しました。


:::note alert
ActionView::Template::Error (Mysql2::Error: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'):
:::

# エラーの内容
>Google翻訳より…
>このバージョンの MySQL はまだ「LIMIT & IN/ALL/ANY/SOME サブクエリ」をサポートしていません

LIMIT句が使用されている箇所の構文が、MySQLのバージョンで使用できない記述になっているようです。

さらにエラーメッセージを見ると、以下のビューを表示する際に引っかかっているようでした。
```html:ショップ（Shop）詳細（show）のビューページ
<%= image_tag @shop.get_shop_image(500,500), class: "w-100 p-1" %>
<%= render 'public/favorite_shops/btn', shop: @shop %>
<%= link_to review_path(@shop), class: "btn btn-outline-info d-grid mt-2" do %>
   ショップの口コミを見る (<%= @reviews.count %>)
<% end %>
<% if current_shop == @shop %>
  <% unless current_shop.guest_shop? %>
```
そもそもサブクエリって何だろう…？ということで検索…

>サブクエリ（副問い合わせ）とは、クエリの中で使用される別のクエリのことを指します。サブクエリを使用すると、複雑な条件を持つクエリを簡潔に表現でき、データの抽出や加工をより柔軟に行うことができます。

https://techplay.jp/column/1841

つまり、今回のエラーはINかALLかANYかSOMEのサブクエリが生成されているということ…？

## コントローラの確認
先ほどのビューを表示するためのアクション（show）を確認してみます。
```ruby:コントローラ
class Public::ShopsController < ApplicationController
  def show
    @member = current_member
    @shop = Shop.find(params[:id])
    @items = @shop.items.order(id: "DESC").page(params[:page])
    
    # ↓怪しいのはこれ
    shop_pre_orders = PreOrder.where(item_id: @items)
    @reviews = Review.where(pre_order_id: shop_pre_orders)
                     .where(is_active: 'true')
                     
    @tag_rank = Tag.tag_rank_item
  end
end
```

shop_pre_orders = PreOrder.where(item_id: @&#8203;items)を見ると、ここで必要なのは@&#8203;itemsのidのみなのに、@&#8203;items全てから参照しようとしてしまっています。

これによって、クエリの中にサブクエリが生成されてしまっているのでしょうか…？

確かにSQLの内容を見てもIN(...IN (...))みたいに書かれていたような…
この中のIN(...)がサブクエリということ…？

先ほどのエラーメッセージにも<b>「LIMIT & IN/ALL/ANY/SOME サブクエリ」をサポートしていません</b>とあったので、INになっている部分が怪しいような気もしてきました。

これを修正していきます。

```diff_ruby:コントローラ
class Public::ShopsController < ApplicationController
  def show
    @member = current_member
    @shop = Shop.find(params[:id])
    @items = @shop.items.order(id: "DESC").page(params[:page])
    
-   shop_pre_orders = PreOrder.where(item_id: @items)
-   @reviews = Review.where(pre_order_id: shop_pre_orders)
+   shop_pre_order_ids = PreOrder.where(item_id: @items.pluck(:id)).pluck(:id)
+   @reviews = Review.where(pre_order_id: shop_pre_order_ids)
                     .where(is_active: 'true')
                     
    @tag_rank = Tag.tag_rank_item
  end
end
```

pluckでidのみを呼び出しています。
これでビューを表示してみるとSQL文もさっきの形と変わっていました。
（SQL文を記録していなかったので曖昧な表現になっています。）

これを本番環境で実行してみると…エラーが表示されなくなりました！

# おわりに
ツールの違いによって開発環境ではエラーは出ないけど、デプロイ時にエラーが出るということもあるんだなと勉強になりました。

SQLのことも全然分からないまま学習を進めていたので、きちんと調べてみようと思います。
【AWS】関数delattr()を使って属性を削除する方法とサンプルコード

# 概要
指定したオブジェクトから指定した属性を削除する`delattr`関数を使ってみたので紹介します。

公式ドキュメントはこちらです。

https://docs.python.org/ja/3/library/functions.html#delattr

# サンプルコード

```py
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

john = Person("John", 30)

print(john.__dict__)  # {'name': 'John', 'age': 30}

delattr(john, 'age')

print(john.__dict__)  # {'name': 'John'}
```

`delattr(john, 'age')`を実行すると、`john`から`age`属性が削除されたことがわかります。

もちろん、ここで属性ではないもの(例：`gender`)を選択するとエラーになります。

```py
Traceback (most recent call last):
  File "xxxxxx", line 10, in <module>
    delattr(john, 'gender')
AttributeError: gender
```

この場合は`AttributeError`になるので例外処理の場合はこれを拾ってあげると良いでしょう。

`delattr`関数は、変数に消したい属性名が格納されている場合などで使うことができます。
似たような関数に`setattr`がありますが、以前記事にもしたのでご参考までに。

https://qiita.com/Ryo-0131/items/9b5e1022d0f2d56dbfb0
[UI/UX] バリデーションの発火タイミングとボタン制御について

# きっかけ

これまでエンジニアとして開発したり UIUX レビューする中で、バリデーションが発火するタイミングやボタン制御については、いろいろ意見が分かれる分野だと感じました。

こちらに関して、自分なりの考えを整理してみたいなと思い、言語化してまとめてみました。


## ■ ボタン押下時か、入力中か、フォーカスアウト時か

### 1. ボタン押下時

ボタンを押下すると、バリデーションに引っかかっている全ての入力フォームの直下に、赤いエラーメッセージが出現。

![validate2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/4ea9289b-c574-c45e-a18f-04f0649b8b50.gif)

#### メリット

- 実装が楽。

#### デメリット

- 全フォームを入力してボタンを押下したときしか、入力が間違っているということがユーザーに検知されないので、**ユーザーには優しくない。**

### 2. 入力中

入力中（1 文字 1 文字入力するたび）にバリデーションがかかるというもの。

![validate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/604e1f9f-b3da-63f6-5a1a-2c7e4237b452.gif)

#### メリット

- **ユーザーへの検知という意味では非常に強力。**
    - **複雑なバリデーションにおいては、入力中にバリデーションがかかると嬉しい。**
        - 例）ID やパスワードなどにおいて、使用できない ID や記号がある、英大文字が必要、～以上の文字数、等。

#### デメリット

- **簡単なバリデーションにおいては、常に警告が出続けると鬱陶しい。**
    - まだ入力中なのにずっと警告が出る、、
    - 例）10 文字以上チェックだと 10 文字以上入力するまで警告が出続ける、など。
- 処理が少し重くなりそう。

### 3. フォーカスアウト時

フォーカスアウト時にバリデーションがかかるというもの。

![validate3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/f648830f-90e4-2632-3086-a3f2d1f44fc6.gif)

#### メリット

- ボタン押下時と比べると、事前にユーザーに誤入力を検知してくれるのでユーザーに優しい。
- 簡単なバリデーションにおいては、**入力都度にエラーを検知させられ続けなくて済む。**

#### デメリット

- **複雑なバリデーションにおいては、都度フォーカスアウトしないと確認できない。**
    - この場合はユーザーに優しくない。

### まとめ、所感

- ボタン押下時のみバリデーション発火させるのはユーザーに優しくない。
  - そのため入力中またはフォーカスアウト時のユーザーへの検知があった方がユーザーに優しい。
- 複雑なバリデーションにおいては、入力中のバリデーションが適していそう。
- 簡単なバリデーションにおいては、フォーカスアウト時のバリデーション適していそう。

## ■ 正常に入力していない時は、ボタン押下時にバリデーション発火させるか、そもそもボタンを非活性にしておくか

### 1. ボタン押下時にバリデーション発火

#### メリット

- **どこが間違えたのか、すぐユーザーは検知できる。**
    - ユーザーが自己解決しやすい。
- 入力画面にスクロールが発生している場合、バリデーションエラー箇所に戻る実装をしていると、さらにユーザーに優しい。

#### デメリット

- 無さそう、、？

### 2. ボタンを非活性にする

#### メリット

- 絶対にボタンが押せない

#### デメリット

- 入力ミスがあってボタンが日活性の場合、なぜボタンが押せないのかユーザーが一瞬混乱しそう。
- スクロールがある場合、どこがエラーになっているのか確認する必要があり、スクロール戻りが発生してユーザー負荷が上がる。

### まとめ、所感

- 個人的には、ボタン押下時バリデーション発火の方が、**ユーザーが自己解決しやすそうで優しいと思うので**好きです。

## まとめ

個人的には、、

- 入力に誤りがある場合は、ボタン非活性ではなくボタン押下時にバリデーション発火して欲しい。
- ボタン押下時のみだけでなく、フォーカスアウトや入力中にもバリデーションは欲しい。
- フォーカスアウトか入力中どちらがいいかは、その入力フォームのバリデーションの複雑さによる。

# 最後に

バリデーションについて自分の考えを言語化してまとめてみました。
これが全くの正解とも思っていないので、何か意見があればコメントいただけると嬉しいです！
なんでエンジニアは初めに"おはよう世界"と言うのか？

# Hello World
初めてプログラミングをした時を覚えていますか？どんな言語を始めて触りましたか？この文を初めて書いた...なんて方多いのではないだろうか？
```
"Hello World"
```
立派なプログラミングである．もしくはノーコードやScratchで開発したことが初めてだという方もいるかもしれない．

> ぜひ初言語がなんだったかコメントに書いてほしい

![IMG_1271.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/85969e19-6718-44bd-a097-ff0641859987.jpeg)



この写真のような言語で書いた方，多いのではないか？
C言語では
```c
int main(void){
    printf("Hello world\n");
    return 0
}
```
Pythonでは
```py
def main():
    print("Hello World")
```
Rubyでは
```rb
def main
  puts "Hello World"
end
```
JavaScriptでは
```js
function main(){
    console.log("Hello World");
}
```
GoLangでは
```go
func main(){
    p("Hello World");
}
```

> ここにあがっていない言語もぜひコメントに！

誰しもが通る道`Hello world`は感慨深いなと思った．本記事ではなぜエンジニアが始めに`おはよう世界`と世界に挨拶しているかについて紹介する．

# HelloWorldの起源
テスト文言として “Hello World” を使う起源はブライアン・カーニハンとデニス・リッチーによる著書「プログラミング言語C」（1978年）の中にある．
> *Kernighan had recently seen “some cartoon of a chick coming out of an egg, and it says Hello, World,” as he told me when I called him up to ask about it. It tickled his fancy, so he used that.*
>> The C Programming Language(*Brian Kernighan, Dennis Ritchie*)(1978)

これを和訳すると
「Kernighanは，最近このように言っていた．"卵からヒヨコが出てくる漫画があるんだけど、それが Hello, World なんだよ．" その言葉に惹かれて，彼はそれを(テスト出力に)使うことにした．」

つまり，**初めてプログラミングの世界に踏み込むエンジニアは広い世界へあいさつするヒヨコに例えている**ということだろうか．実際，The C Programming Languageで書かれていたチュートリアルが`Hello, world!`だったことからさまざまな言語の初めての出力に使われるようになった．これが`Hello World`が**世界でいちばん有名なプログラミング**と呼ばれる所以なのだろう．

# どんなエンジニアも...
ゲーム，モバイルアプリ，Webアプリ，サーバー，XR，組み込み，ロボット...どんなエンジニアも初めは`Hello World`，この 1行から始まっているんですね．今話題のAIも最初は`Hello World`から始まっているのではないか．そう考えると私も頑張ろうかなというモチベーションになる．

# いろんな言語を触ってみよう
ぜひいろんな言語の`Hello World`を書いてみて新しい言語に出会ってほしい．色々な言語のくせや雰囲気，得意な点，使用例など調べてみると，その言語が自分の好きな言語になったり，今後使うフレームワークやライブラリを知ることができるかもしれない．また，一生お世話になる言語となるかもしれない．`Hello World`は奇跡のプログラムだと思う．
【固定リンク】商品詳細の右下にページ内リンクを設置する

# はじめに
商品ページを作成中、詳細ページが長くなったりスマホ表示にしたとき「この商品を予約するボタン」にスクロールして戻るのが大変になってしまいました。

そこで、一般的な商品ページなどでよく見る、「予約へボタン」を画面右下に固定して設置することにしました。
実装自体は簡単なのですが、ちょっと忘れそうだったので記録しておきます。

![2024-06-21トップへ戻る.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/45de9ff9-e804-0970-5aab-ed9b2c93968d.png)

# 実装内容
使うのはビューとCSSだけです。

## ビュー

```html:商品詳細ページ
<!--商品情報-->
  <div id="order" class="wide-item col-5 p-2 mt-3">
    <h2 class="h5 fw-bold"><%= @item.name %> <span class="text-black-50 h6">[ <%= @item.id %> ]</span></h2>
    <p class="py-3">
      価格: <span class="h3"><%= @item.price.to_s(:delimited, delimiter: ',') %></span> 円
     </p>
:
:
:
  <div>

  <!--予約に進むボタン-->
  <%= link_to '#order' do %>
    <div class="back-order px-3 py-1 rounded-pill border border-white border-2">
      <% if shop_signed_in? || admin_signed_in? %>
        <div class="d-flex justify-content-center fs-2 pt-1"><i class="fa-solid fa-file-pen"></i></div>
        <small>商品編集へ</small>
      <% else %>
        <div class="d-flex justify-content-center fs-2 pt-1"><i class="fa-solid fa-calendar-check"></i></div>
        <small>予約へ</small>
      <% end %>
    </div>
  <% end %>
```
※このサイトの場合は、ショップ管理者としてログインすると「予約ボタン」ではなく「商品編集ボタン」が表示される仕組みになっていたので、管理者がログインした場合の設定も記述してあります。

:::note info
仕組みは、
<b><&#8203;div id="order"><&#8203;/div></b> 「予約へボタン」のリンク先をidで指定して、
<b><%= link_to '#order' do %><% end %></b> 「予約へボタン」を押すと画面がidの位置に移動します。
:::

最初、あまり深く考えずに<&#8203;a href ='#order'>を使ってリンクを設定していたのですが、Railsの記述に合わせた方が良いかも…？と思い、<%= link_to '#order' do %>に書き直しました。

## CSS

```css:css
.back-order {
    position: fixed;
    right: 15px;
    bottom: 15px;
    background-color: #ACCBCF;
    opacity: 0.8;
    small {
        font-size: 13px;
    }
}
```
:::note info
<b>position: fixed;</b> 
その要素はビューポート（画面の表示領域）内の固定された位置に配置されます。
スクロールしても画面上の同じ位置に留まります。
これを利用して、
<b>right: 15px;</b>で画面の右からの位置
<b>bottom: 15px;</b>で画面の下からの位置
を設定して画面の右下に固定しています。
:::

なんとなく小さい文字には<&#8203;small>タグを使いがちなのですが、ここで使うのが適切なのかはよく分かっていません…。

# おわりに
ちょっとしたことですが、これがあるだけで圧倒的に使いやすさが変わります。

スマホ画面だと電話やLINEでの問い合わせボタンが出てきたりするページもあったり、ページ内リンクの仕様にも個性があるので、そういった面に注目しながら既存のサイトを巡るのも面白いです。
システム開発者のための認知負荷


# はじめに

システム開発は複雑なプロセスであり、我々は多くの情報を処理しながら問題を解決する必要があります。このとき、認知負荷という概念が重要になります。本記事では、認知負荷とは何か、なぜシステム開発時に認知負荷を意識する必要があるのか、そしてその軽減方法について私なり考え日頃意識してること書きます。

## 認知負荷とは

認知負荷とは、学習や問題解決の際に個人の認知システムにかかる負担を指します。具体的には、短期記憶や作業記憶に対する要求です。認知負荷には以下の 3 種類があります。

1. 内在的認知負荷：対象そのものの難易度や複雑さから生じる負荷。
2. 外在的認知負荷：環境や方法から生じる負荷。
3. 関連的認知負荷：既存の知識と新しい情報を関連付ける際に生じる負荷。

## システム開発時に認知負荷を意識する理由

システム開発において認知負荷を意識することは、以下の理由から重要です。

1. 効率向上
2. 学習促進
3. コミュニケーションの円滑化
4. ストレス軽減

## システム開発における認知負荷とは

システム開発における認知負荷には、以下のような要因があります。

1. 初期情報の整理：技術スタックの選定、要件定義、仕様書作成、不確定要素など。
2. 開発中のタスク管理：タスクの分割、バグ修正、デバッグ作業、コードレビューなど。
3. コミュニケーション：チーム内およびクライアントとのやり取り。
4. ツールと環境：IDE やバージョン管理ツールの使用、開発環境のセットアップとバージョン管理など。

## 認知負荷を軽減するための方法

認知負荷を軽減するための方法は以下の通りです。

1. タスクの適切な分割と管理：アジャイル手法の導入やカンバンボードの活用。
2. 効果的なコミュニケーション：定期的なミーティング、明確なドキュメントと情報共有。
3. ツールの最適化：適切な開発ツールの選定と自動化ツールの活用。
4. 教育とトレーニング：新しい技術やツールの学習支援、継続的なスキルアップのためのトレーニングプログラム。

## 参考文献

[Cognitive Load During Problem Solving:Effects on Learning](https://onlinelibrary.wiley.com/doi/epdf/10.1207/s15516709cog1202_4)
IBM i Services Directory : QSYS2.Display_Journal テーブル関数

## 概要
■テーブル関数名：QSYS2.DISPLAY_JOURNAL
■カテゴリ：ジャーナルサービス
■サポート：IBM i 7.4以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-display-journal-table-function

監査ジャーナルから指定したジャーナルタイプ（監査操作）を検索できます。監査の期間などを自由に指定できます。

## 使用例

```
SELECT journal_code, journal_entry_type, object, object_type, X.* 
FROM TABLE (
QSYS2.Display_Journal(
'QSYS', 'QAUDJRN',                               -- 監査するジャーナル名を指定
JOURNAL_ENTRY_TYPES => 'CO',                     -- 監査する処理を指定
STARTING_TIMESTAMP => CURRENT TIMESTAMP - 7 DAYS  -- 監査期間 DAYS HOURS等指定可
) ) AS x
ORDER BY entry_timestamp DESC;
```

上記の実行例です。
ジャーナルのエントリータイプ CO は　Create Object でオブジェクト作成を表します。
DAYS 7 で7日間を検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b76007dd-0a4b-ff47-c9b4-f48ed5c2bf4d.png)

上記でオブジェクトタイプ *FILEはPF、*STMFはIFSファイル、*DIRはIFSディレクトリです。
タイムスタンプが作成時刻

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f6fc5f53-dc88-057b-da84-25056697b18a.png)

ユーザー名は作成したユーザープロフィール、ジョブ名、ジョブ番号が記録されています。
されに実行したプログラムもわかります。


### これまでの5250 DSPJRNコマンドだと…

こんな感じです。

```
DSPJRN QSYS/QAUDJRN
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8d813215-b96d-b7ad-7a5f-4bfd29df1ec0.png)

監査レコードが表示されるので、詳細を確認したいレコードを選択して5番で、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ec5d35c6-8651-bb89-de5a-e4be53d3734c.png)

こんな感じに見えます。ジャーナル項目（実際のジャーナル内容）が分からないので、、更にF10キーを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ebbfcc0d-1ce7-02c9-8ec2-0108038a1056.png)

ようやく上のテーブル関数と同じレベルになりました。
これをすべての行で繰り返しますので大変です…（でした）
CapybaraとSeleniumを使用してRuby on Railsアプリケーションの統合テストを行う方法

お疲れ様です。

今日はCapybaraとSeleniumを使用してRuby on Railsアプリケーションの統合テストを行う方法を説明します。

# Gemfileに追加

まず、Gemfileにcapybaraとselenium-webdriverを追加します。

```ruby
group :test do
  gem 'capybara'
  gem 'selenium-webdriver'
end
```
# インストール
次に、Gemをインストールします。

```sh
bundle install
```

# テストのセットアップ

`spec/rails_helper.rb`ファイルにCapybaraを設定します。

```ruby
require 'capybara/rspec'
require 'selenium/webdriver'

Capybara.register_driver :selenium_chrome_headless do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: Selenium::WebDriver::Chrome::Options.new(args: %w[headless disable-gpu window-size=1920,1080]))
end

Capybara.javascript_driver = :selenium_chrome_headless

```

# 統合テストの作成

`spec/features`ディレクトリに統合テストを作成します。例えば、ユーザーがログインするシナリオをテストする場合は次のようにします。

```ruby
require 'rails_helper'

RSpec.feature 'User authentication', type: :feature do
  scenario 'User logs in successfully' do
    visit '/login'
    fill_in 'Email', with: 'user@example.com'
    fill_in 'Password', with: 'password'
    click_button 'Log in'

    expect(page).to have_text('Logged in successfully')
  end
end

```

# テスト実行
テストを実行します。

```sh
bundle exec rspec spec/features/user_authentication_spec.rb
```

これで、CapybaraとSeleniumを使用してRuby on Railsアプリケーションの統合テストを行う準備が整いました。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。