OmniAICreator/Qiita-1.07M huggingface dataset:
【Figma Plugins】FigJamのPluginで出来ること・出来ないこと

## はじめに
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/531a7820-c0fd-e119-5dff-ce88a5665687.png)
みなさんは、Figmaのプラグイン・FigJamのプラグインを作ったことはあるでしょうか？

作ったことがない方にとって、あまり違いが分かりずらいかなと思います。
そのため、この記事では、FigJamのプラグインの出来ること・出来ないことを中心に、FigmaとFigJamのプラグインの違いを紹介しようと思います。


## FigJamのPluginで出来ること・出来ないこと

### コンポーネント
FigJamでは、専用のステッカーがあるため、Plugin APIを使用して、有効なライブラリのコンポーネントやFigmaのデザインファイルからFigJamのファイルに貼り付けられたデザインにはアクセスすることができます。

また、Plugin APIを使用して、FigJamのファイル内にあるローカルスタイルやインスタンスにもアクセスできます。

ただ、Plugin APIを使用してFigJamのファイル内に新しいコンポーネントを作成したり、既存のコンポーネントをバリアントに組み合わせたりすることはできません。そのため、以下の関数も使用できません

- `createComponent()`：コンポーネントを作成するための関数
- `combineAsVariants()`：依存コンポーネントを組み合わせて、バリアントを作成するための関数

※ FigJamのファイルにある ComponentNode のインスタンスは作成することができます。

### スタイル
FigJamのファイルでPlugin APIを使用する場合、既存のノードに適用されたスタイルにのみアクセスできます。

ただ、以下の関数を使用してローカル・スタイルを作成したり、管理したりすることはできません。

- `createPaintStyle()`：ペイントスタイルを作成する
- `createTextStyle()`：テキストスタイルを作成する
- `createEffectStyle()`：エフェクトスタイルを作成する
- `createGridStyle()`：ガイドを作成する
- `moveLocalPaintStyleAfter()`：指定したペイントスタイルを並べ替える
- `moveLocalTextStyleAfter()`：指定したテキストスタイルを並べ替える
- `moveLocalEffectStyleAfter()`：指定したエフェクトスタイルを並べ替える
- `moveLocalGridStyleAfter()`：指定したガイドを並べ替える
- `moveLocalPaintFolderAfter()`：ペイントスタイルを含むフォルダの順序を並べ替える
- `moveLocalTextFolderAfter()`：テキストスタイルを含むフォルダの順序を並べ替える
- `moveLocalGridFolderAfter()`：グリッドを含むフォルダの順序を並べ替える


### FigJam 固有のノード
FigJamのファイルには、固有のノード・タイプがいくつかあります。
FigJam のプラグイン API を使用すると、以下のようなノード・タイプを作成および変更できます。

`StickyNode`・`ShapeWithTextNode`・`ConnectorNode`・`CodeBlockNode`・`MediaNode`・`TableNode`

Figmaのファイル内にでこれらのノードを作成することはできませんが、Figmaファイル内のこれらのタイプの既存のノードを読み込んで変更することができます。

また、`manifest.json` に `"editorType": ["figjam"]` が含まれていない場合は、これらのノードに関連する以下の関数にはアクセスできません

- `figma.createSticky()`：stickyを生成する
- `figma.createShapeWithText()`：図形を生成する
- `figma.createConnector()`：コネクタを生成する
- `figma.createCodeBlock()`：コードブロックを生成する
- `figma.createGif()`：Gif画像を生成する
- `figma.createTable(numRows, numColumns)`：テーブルを生成する

### Timer

FigJamのファイルはTimerをサポートしており、ファイル内のユーザが自分の活動に制限時間を設定し、カウントダウンを見ることができ、FigJamのファイルにアクセスすることができれば、誰でも見ることができます。

詳しくはこちらの記事をご覧ください

https://qiita.com/degudegu2510/items/ced77fd76ba79107245c

## まとめ
この記事では、FigJamのプラグインの出来ること・出来ないことを中心に、FigmaとFigJamのプラグインの違いを紹介しました。
この記事を参考にFigJamのプラグインを作成してみてください。

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
ソリューションアーキテクトに求められる視点(1/14) Route53のエイリアスとCNAMEの違い

## はじめに
ソリューションアーキテクト、ネットワークスペシャリストのための視点を整理してみました。

今回は、**Route53のエイリアスとCNAMEの違いです。**
問いを用意することで、理解を深めて頂けるように工夫してみました。実務でも試験でも、ご参考にして頂けましたら、幸いです。

:::note warn
**理解を深めるための問い**

**Zone apexにCNAMEレコードを設定することが、出来るのか出来ないのか、説明が出来るか？**
:::

Zone Apexはサブドメインを含まない、ドメイン範囲（当該DNSサーバーの頂点にあたる）

https://blog.serverworks.co.jp/route53-zone-apex-cname-alias-record#Zone-Apex

そもそも、用語がわからない人が多いのではないでしょうか？


Zone apexにCNAMEレコードを設定することは、DNSの仕様上できません。CNAMEレコードは、他のレコード（A、MX、TXTなど）と共存できないため、ApexドメインにCNAMEレコードを設定すると、他の重要なDNSレコードが機能しなくなります。

:::note alert
www.example.com を CNAME レコードで登録し、かつ同じレコード名　www.example.com を A レコードとして登録するのは RFC 1912 の規約違反となります。
:::

:::note info
**ソリューションアーキテクトのための視点**
アプリケーションを Apex ドメインを通じて利用できるようにしたい。
マルチリージョン展開したい。
CNAME レコードを使用できるかどうか考え、使用できないならば、代替手段で、ソリューションを提示して欲しい。

**ソリューション 例**
 AWS リージョンのエンドポイントをターゲットとする複数のエンドポイントグループを持つGlobal Accelerator アクセラレータの静的 IP アドレスを使用して、Apex ドメインのパブリック DNS にエイリアスレコードを作成する。

**解説**
 Apex ドメインは AWS の CNAME レコードを使用できません。これは、DNS 解決の仕組みによるものです。CNAME レコードはドメイン名のエイリアスを指定し、別のドメインの正規名を指します。ただし、DNS 標準では、Apex ドメインには A または AAAA レコードのみが必要であるため、CNAME レコードは許可されていません。AWS Route 53 で Apex ドメインの CNAME レコードを作成しようとすると、レコードセットタイプが Apex ドメインに対して有効ではないことを示すエラー メッセージが表示されます。この制限を回避するには、代わりにエイリアス レコードを使用できます。
:::

 Apexドメインを特定のホスト名にリダイレクトする必要がある場合、いくつかの代替手段があります。ApexドメインにCNAMEレコードを設定できない理由と、その代替手段について説明します。

ApexドメインにCNAMEレコードを設定することはできませんが、ALIASレコード、ANAMEレコード、Amazon Route 53のエイリアスレコード、HTTPリダイレクトなどの代替手段を使用することで、Apexドメインを特定のホスト名にリダイレクトすることができます。これらの方法を使用して、DNSの仕様に準拠しながら、Apexドメインのリダイレクトを実現できます。

## CNAMEレコードの制限

CNAMEレコードは、あるドメイン名を別のドメイン名にエイリアスとして設定するためのDNSレコードです。しかし、CNAMEレコードには制限があります。

1. **他のレコードと共存できない**
CNAMEレコードは、同じドメイン名に対して他のDNSレコード（A、MX、TXTなど）と共存できません。これにより、ApexドメインにCNAMEレコードを設定すると、他の重要なDNSレコードが機能しなくなります。

2. **Apexドメインに設定できない**
Apexドメイン（例：example.com）にCNAMEレコードを設定すると、DNSの仕様に違反します。Apexドメインには通常、AレコードやAAAAレコードが設定されます。

## 代替手段

Apexドメインを特定のホスト名にリダイレクトするための代替手段

#### 1. ALIASレコードまたはANAMEレコード

一部のDNSプロバイダーは、Apexドメインに対してCNAMEのように機能するALIASレコードやANAMEレコードを提供しています。これらのレコードは、Apexドメインを他のドメイン名にエイリアスとして設定するための特別なレコードです。

- **ALIASレコード**
DNSプロバイダーが内部的にAレコードに変換して処理します。Apexドメインに対して使用できます。
- **ANAMEレコード**
ALIASレコードと同様に機能し、Apexドメインに対して使用できます。

#### 2. Amazon Route 53のエイリアスレコード

Amazon Route 53は、Apexドメインに対してエイリアスレコードを提供しています。エイリアスレコードは、特定のAWSリソース（例：CloudFrontディストリビューション、Elastic Load Balancer、S3バケットなど）に対してApexドメインをエイリアスとして設定するためのレコードです。

- **設定方法**:
  1. Route 53コンソールにアクセスし、対象のホストゾーンを選択します。
  2. 「Create Record Set」をクリックし、レコードタイプとして「A - IPv4 address」を選択します。
  3. 「Alias」にチェックを入れ、エイリアス先のAWSリソースを選択します。

#### 3. HTTPリダイレクト

Apexドメインを特定のホスト名にリダイレクトするために、HTTPリダイレクトを使用することもできます。これは、ウェブサーバーやCDNを使用して、Apexドメインへのリクエストを特定のホスト名にリダイレクトする方法です。

- **設定方法**:
  1. ウェブサーバー（例：Apache、Nginx）を設定し、Apexドメインへのリクエストを特定のホスト名にリダイレクトします。
  2. CDN（例：CloudFront）を使用して、Apexドメインへのリクエストを特定のホスト名にリダイレクトします。

#### 改めて、整理した所、私自身勉強になりました。ご参考になりましたら、幸いです。

Route53のエイリアスとCNAMEの違いが分かりにくいので、整理してみた(1/2)

https://qiita.com/kimuni-i/items/36d8bb1ef6bde2fe219e
type-challenges 初級編 Pick Readonly Tuple to Object

# type-challenges 初級編 Pick Readonly Tuple to Object

## はじめに type-challengesとは

https://github.com/type-challenges
> このプロジェクトは、TypeScript型システムがどのように動作するのかを理解したり、独自の型ユーティリティを書いたり、課題へのチャレンジを楽しむことをサポートします。また、実際の業務で直面した問題を質問したり、その答えを得られるコミュニティを作りたいと考えています。

とリポジトリのReadMeに書いてある通りTypescriptの型クイズ問題集みたいなものです。

:::note info
高品質な型は潜在的なバグを回避しつつ、プロジェクトの保守性を向上させるのに役立つと思っています。
:::

問題集を解いて型力を高めます！
今回は3問解いてみます。

### 1. Pick

初めの問題は以下の通りです。

```typescript
interface Todo {
  title: string
  description: string
  completed: boolean
}

interface Expected1 {
  title: string
}
```

`Expected1` と `MyPick<Todo, 'title'>` を同じ型として `MyPick` 型を実装するという問題です。

#### 私の回答

```typescript
type MyPick<T, K> = {
  [k in keyof T & K]: T[k]
}
```

#### 解き方

基本的な型生成の文法として、以下のように書くとオブジェクトの型をコピーできます。

```typescript
type MyType<T> = {
  [k in keyof T]: T[k]
}
```

ここで `& K` を使うことで、Kのプロパティのみを取り出します。他の回答としては以下のようなものもあります。

```typescript
type MyPick<T, K extends keyof T> = {
  [key in K]: T[key]
}
```

こちらの方がKのみを取り出す点でシンプルです。

### 2. ReadOnly

組み込みの型ユーティリティ `Readonly<T>` を使用せず、`T` のすべてのプロパティを読み取り専用にする型を実装します。実装された型のプロパティは再割り当てできません。

#### 私の回答

```typescript
type MyReadonly<T> = {
  readonly [k in keyof T]: T[k]
}
```

これは先ほどのものを応用して `readonly` をつけただけです。簡単ですね。他の人の回答も同じでした。

### 3. Tuple to Object

タプルを受け取り、その各値のkey/valueを持つオブジェクトの型に変換する型を実装します。

```typescript
const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const

type result = TupleToObject<typeof tuple> // expected { 'tesla': 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}
```

#### 私の回答

```typescript
type TupleToObject<T extends readonly any[]> = {
  [V in T[number]]: V
}
```

先ほどの記法を少し改造して、配列の要素を取り出し、`要素: 要素` のペアにしました。他の人の実装も同じようなものでした。

```typescript
type TupleToObject<T extends ReadonlyArray<string | number>> = {
  [k in T[number]]: k
}
```

## まとめ

このように、TypeScriptの型システムを理解し、実際に型を実装することで、より安全で保守性の高いコードを書くことができます。ぜひこれらの課題を解いて、型力UPしてみてください。

## 参考記事

- [TypeScript公式ドキュメント](https://www.typescriptlang.org/docs/)
- [type-challenges GitHubリポジトリ](https://github.com/type-challenges/type-challenges)
【PostgreSQL】メタコマンド〜\dC〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \dCとは

> 型キャストの一覧を表示します。 `pattern`が指定された場合、そのパターンに元データ型または変換先データ型がマッチするキャストのみが表示されます。 コマンド名に`+`を付与すると、各オブジェクトに関連する説明を付けて表示します。
> 

[\dCについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%5CdC%5B%2B%5D%20%5B%20pattern%20%5D,-%E5%9E%8B%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%81%AE)

## 試してみた

```sql
postgres=# \dC
                                          キャスト一覧
         変換元の型          |         変換先の型          |        関数        | 暗黙的に適用 ? 
-----------------------------+-----------------------------+--------------------+----------------
 "char"                      | character                   | bpchar             | 代入時のみ
 "char"                      | character varying           | text               | 代入時のみ
 "char"                      | integer                     | int4               | いいえ
 "char"                      | text                        | text               | はい
 bigint                      | bit                         | bit                | いいえ
 ~~~~ 省略 ~~~~
```

```sql
postgres=# \dC integer
                               キャスト一覧
    変換元の型    |    変換先の型    |        関数        | 暗黙的に適用 ? 
------------------+------------------+--------------------+----------------
 "char"           | integer          | int4               | いいえ
 bigint           | integer          | int4               | 代入時のみ
 bit              | integer          | int4               | いいえ
 boolean          | integer          | int4               | いいえ
 double precision | integer          | int4               | 代入時のみ
 integer          | "char"           | char               | いいえ
 integer          | bigint           | int8               | はい
 integer          | bit              | bit                | いいえ
 integer          | boolean          | bool               | いいえ
```

## まとめ

キャストの一覧が確認できるのは知らなかった。
【PostgreSQL】メタコマンド〜\?〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。

他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \?とは

> ヘルプ情報を表示します。 オプションの`topic`パラメータ（デフォルトは`commands`）はpsqlのどの部分を説明するかを選択します。 `commands`はpsqlのバックスラッシュコマンドについて、`options`はpsqlに渡すことができるコマンド行オプションについて、`variables`はpsqlの設定変数についてのヘルプを表示します。
> 

[\?について](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%5C%3F%20%5B%20topic%20%5D,-%E3%83%98%E3%83%AB%E3%83%97%E6%83%85%E5%A0%B1%E3%82%92)

## 試してみた

```sql
postgres=# \?
一般
  \copyright             PostgreSQL の使い方と配布条件を表示
  \crosstabview [列リスト] 問い合わせを実行し、結果をクロス表形式で出力
  \errverbose            最後のエラーメッセージを最大の冗長性で表示
  \g [(OPTIONS)] [FILE]  問い合わせ実行 (結果はファイルまたは |パイプへ出力);
                         引数なしの\gはセミコロンと同義
  \gdesc                 問い合わせを実行せずに結果の説明を行う
  \gexec                 問い合わせを実行し、結果の中の個々の値を実行
  \gset [PREFIX]         問い合わせを実行して結果を psql 変数に格納
  \gx [ファイル名]       \g と同じ、ただし拡張出力モードを強制
  \q                     psql を終了する
  \watch [秒数]          指定した秒数ごとに問い合わせを実行

ヘルプ
  \? [コマンド]          バックスラッシュコマンドのヘルプを表示
  \? オプション          psql のコマンドライン・オプションのヘルプを表示
  \? 変数名              特殊変数のヘルプを表示
  \h [名前]              SQLコマンドの文法ヘルプの表示。* で全コマンドを表示
  
~~~~ 省略 ~~~~
```

```sql
postgres=# \? variables
特別に扱われる変数の一覧

psql変数:
使い方:
  psql --set=名前=値
  またはpsql内で \set 名前 値

  AUTOCOMMIT
    セットされている場合、SQLコマンドが成功した際に自動的にコミット
~~~~ 省略 ~~~~
```

```sql
postgres=# \? options
psql は PostgreSQL の対話型ターミナルです。

使い方:
  psql [オプション]... [データベース名 [ユーザー名]]

一般的なオプション:
  -c, --command=コマンド   単一の(SQLまたは内部)コマンドを一つだけ実行して終了
  -d, --dbname=DB名        接続するデータベース名(デフォルト: "daichi-ito")
  -f, --file=FILENAME      ファイルからコマンドを読み込んで実行した後に終了
  -l(エル), --list         使用可能なデータベース一覧を表示して終了
  -v, --set=, --variable=名前=値
~~~~ 省略 ~~~~
```

## まとめ

便利なメタコマンドは多くあるので、忘れた時の確認に利用していこう。
GitHub Organization にアクセスする fine-grained personal access token を管理する

## はじめに

GitHub の Personal Access Token (PAT) は個人のリポジトリ操作等に使用できますが、Organization のリポジトリ等に対する権限を与えることもできます。

GitHub の PAT には従来の Personal access token (classic) とは別に fine-grained personal access token (fine-grained PAT) があり、後者は様々な管理の仕組みを提供しています。

※ 本記事作成時点では fine-grained PAT はベータ版なので、仕様変更される可能性があることにご注意ください。

## Organization に対して PAT の使用を許可/拒否する

https://docs.github.com/ja/organizations/managing-programmatic-access-to-your-organization/setting-a-personal-access-token-policy-for-your-organization#fine-grained-personal-access-token-%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AE%E5%88%B6%E9%99%90

Organization が PAT によるアクセスを許可するかどうかを設定できます。

PAT (classic) と fine-grained PAT のそれぞれで許可と拒否の指定が可能です。

Organization の Settings から、 `Third-party Access` -> `Personal access tokens` -> `Settings` で確認、設定が可能です。

#### PAT(classic) のアクセス許可/拒否の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/5756e4ed-719d-6179-4eb9-bb666989eebb.png)

#### fine-grained PAT のアクセス許可/拒否

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/320ac3a7-19ad-1e29-47a1-1d981e80244c.png)

## Organization にアクセスできる fine-grained PAT ごとに承認を要求する

https://docs.github.com/ja/organizations/managing-programmatic-access-to-your-organization/setting-a-personal-access-token-policy-for-your-organization#fine-grained-personal-access-token-%E3%81%AE%E6%89%BF%E8%AA%8D%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B

PAT の作成は Organization に所属するメンバーが実施できますが、管理者が把握していない PAT によるアクセスを制限したい場合があります。
fine-grained PAT の場合、Organization の所有者が承認しない限りリソースへのアクセスを制限できます。
こちらも Organization の Settings から、 `Third-party Access` -> `Personal access tokens` -> `Settings` で確認、設定が可能です。
PAT (classic) にはこのような制限をかけられないため注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/6106fa9b-031d-7b51-17ea-eb38e401a180.png)

## Organization にアクセスできる fine-grained PAT を取り消す
https://docs.github.com/ja/organizations/managing-programmatic-access-to-your-organization/reviewing-and-revoking-personal-access-tokens-in-your-organization#fine-grained-personal-access-token-%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%A8%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%97

何らかの問題が発生した際に、Organization のアクセスを許可された fine-grained PAT を取り消すことができます。

Organization の Settings から、 `Third-party Access` -> `Personal access tokens` -> `Active tokens` で確認、取り消しが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/8ab6c1bb-8290-7195-1c90-f28e7fc1d3d4.png)

## API を用いて fine-grained PAT を確認する
https://docs.github.com/ja/rest/orgs/personal-access-tokens?apiVersion=2022-11-28

REST API を用いて fine-grained PAT の一覧表示や承認、取り消しを実施することができます。これにより、自動化を検討することも可能です。

注意点として、API の認証時に渡すトークンの生成に GitHub App を使用しないと API の利用が許可されないようです。ドキュメントに記載された権限を割り当てた GitHub App を用意して対応しましょう。
【PostgreSQL】メタコマンド〜\dg〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \dgとは

> データベースロールを一覧表示します。 (「ユーザ」と「グループ」という概念は「ロール」に統合されましたので、このコマンドは`\du`と同じものになりました。) デフォルトでは、ユーザによって作成されたロールのみが表示されます。 システムロールを含めるには`S`修飾子を付与してください。 `pattern`が指定されている場合は、そのパターンに名前がマッチするロールのみが表示されます。 `\dg+`構文が使用された場合、ロールそれぞれについて更なる情報が表示されます。 現時点では各ロールのコメントが追加されます。
> 

[\dgについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%5Cdg%5BS%2B%5D%20%5B%20pattern%20%5D,-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92)

## 試してみた

```sql
postgres=# \dg
                                                ロール一覧
  ロール名    |                                     属性                                     | 所属グループ 
------------+------------------------------------------------------------------------------+--------------
 daichi     | スーパーユーザー, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス               | {}
```

## まとめ

\duを普段使いしているからあまり使うことはなさそう。
【PostgreSQL】メタコマンド〜\dconfig〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \dconfigとは

> サーバ構成パラメータとその値の一覧を表示します。 `pattern`が指定されている場合は、そのパターンに名前がマッチするパラメータのみが一覧表示されます。 `pattern`が指定されていない場合は、デフォルト以外の値に設定されているパラメータのみが一覧表示されます。 (すべてのパラメータを表示するには`\dconfig *`を使用してください。) コマンド名に`+`が追加されている場合は、各パラメータが、そのデータ型、パラメータを設定できるコンテキスト、および(デフォルト以外のアクセス権限が付与されている場合)アクセス権限とともに一覧表示されます。
> 

[\dconfigについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%5Cdconfig%5B%2B%5D%20%5B%20pattern%20%5D)

## 試してみた

```sql
postgres=# \dconfig
                      非デフォルトの設定パラメータの一覧
         パラメータ         |                       値                        
----------------------------+-------------------------------------------------
 TimeZone                   | Asia/Tokyo
 application_name           | psql
 client_encoding            | UTF8
 config_file                | /opt/homebrew/var/postgresql@15/postgresql.conf
 data_directory             | /opt/homebrew/var/postgresql@15
 default_text_search_config | pg_catalog.english
 hba_file                   | /opt/homebrew/var/postgresql@15/pg_hba.conf
 ident_file                 | /opt/homebrew/var/postgresql@15/pg_ident.conf
 lc_messages                | C
 log_timezone               | Asia/Tokyo
(10 行)
```

## まとめ

postgresql.confを開いて確認していたからこれは便利。
Springフレームワークで曲解的アジャイル開発を考えてみる#1　準備編

#  1.曲解的アジャイルとは
造語です。機能を絞って早く機能が使える段階にあればいいよね？という、深みがあるアジャイルを馬鹿にしたような考え方なので曲解と言ってみました。
新人研修4か月目の朝の時間で一つ記事を書いてみようと思います。

# 2.開発環境 
    ・Eclipse IDE(pleiades2023-12)
    ・jdk：1.7
    ・tomcat：9.
    ・mysql：8.

### eclipseでダウンロードするもの
　下記のものはeclipse→ヘルプ→マーケットプレイスからダウンロード
    ・Spring4
    ・Spring Tools 3 Add-On for Spring Tools 4

# 3.プロジェクト準備
　https://start.spring.io/ にアクセスしてMaven,Java,3.3.1,Artifactの名前をアプリ名に、ADD DEPENDENICE S...から以下のライブラリを設定。
 Spring Boot DevTools
・Lombok
・Spring Web
・Thymeleaf 
・MyBatis Framework
・MySQL Driver
・Validation

ダウンロード後解凍して、Eclipseから「プロジェクトを開く」で選択。


時間なので、続きはまた明日～。
【PostgreSQL】メタコマンド〜\unset〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。

他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \unsetとは

> psql変数`name`を未設定状態にします（削除します）。
> 
> 
> psqlの動作を制御するほとんどの変数は未設定にすることができず、`\unset`はそれをデフォルト値に設定するものとして解釈されます。 以下の[変数](https://www.postgresql.jp/docs/15/app-psql.html#APP-PSQL-VARIABLES)を参照してください。
> 

[\unsetについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%5Cunset%20name,-psql%E5%A4%89%E6%95%B0name)

## 試してみた

```sql
postgres=# select * from employees where name = :'myvar';
 id | name  | department | salary 
----+-------+------------+--------
  1 | Alice | HR         |  60000
(1 行)

postgres=# \unset myvar
postgres=# select * from employees where name = :'myvar';
ERROR:  syntax error at or near ":"
行 1: select * from employees where name = :'myvar';
```

## まとめ

\setは頻繁に使うが、\unsetは使ったことない。間違って変数を設定したら使うかも。
FastAPIとGASを使用してコマンド履歴を集める．

# 1. はじめに
本記事は，研究室で研究のためにコマンド履歴を集めるために作成しました．
モニタリングシステムのようにすべてのデータを確実に収集することは保証しません．
あくまでも簡単に集める方法としてご使用ください．
使用しているコードはGithubに上げてありますので，コピーする場合は以下からどうぞ．
https://github.com/cdsl-research/command_log/tree/main


# 2. やり方
## 2.1. Apps Scriptの作成
初めにシートを作成し，Apps Scriptを開きます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/d461f50b-9f6c-7d64-f527-4c594f692ba8.png)

次にコードを記入します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/fba26f1a-750c-1cc7-73ea-364119ebc639.png)

新しいデプロイを押してデプロイします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/d6f45978-0951-d9ef-b442-11419be14bff.png)

ウェブアプリを選択．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/c9eb0dcd-40af-ce94-b3f9-8eeaa3cd60ef.png)

次のユーザとして実行を自分に，アクセスできるユーザを全員にしてデプロイします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/b6497e7d-cf97-1679-1ea1-54faf1d78a33.png)

URLを必ずコピーしておいてください．

## 2.2. Shell Scriptの作成
対象のサーバにShell Scriptのファイルを作成してコードを記入します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/2a75e370-bc75-d1c0-f12a-0518cc5452e2.png)

URLはここに入れてください．
後は.bashrcなどに起動するように設定を行えば，スプレッドシートに記入されていくはずです．

## 3.実行結果
![スクリーンショット 2024-07-28 135030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/59a150fc-0197-0f91-c1e9-e256987d2a28.png)
コマンドの実行時刻，ユーザ名，アドレス，コマンドの内容が書きこまれていくと思います．(画像ではユーザ名の部分は隠してあります)
C++26 で使える(はずの) std::inplace_vector について

どうやら [P0843R13 inplace_vector](https://wg21.link/P0843R13) が C++26 入りするみたいなので、紹介します。

# 概要

`std::inplace_vector` はその容量がコンパイル時に決定される、メモリ上で要素が連続するコンテナ型です。
`std::vector` などよりは `std::array` に近く、要素はオブジェクトそのものに格納されます。

```cpp
template <class T, size_t N>
class inplace_vector;
```

基本的には `sizeof(size_t) + sizeof(T) * N` 程度のサイズになるようですが、特殊な場合として `N == 0` の時にはクラス全体のサイズが `0` になるよう定められています。

# メンバ

`std::inplace_vector` は `std::vector` の持つメンバ関数を全て利用できますが、それに加えていくつかのメンバ関数が存在するようです。

## try_emplace_back, try_push_back
```cpp
template <class... Args>
constexpr pointer try_emplace_back(Args&&... args);

constexpr pointer try_push_back(const T& x);
constexpr pointer try_push_back(T&& x);
```
これらの関数は既存の `emplace_back` や `push_back` に対して、要素を追加できない時に例外を投げずに `nullptr` を返します。

```cpp
#include <cassert>
#include <inplace_vector>

int main() {
  std::inplace_vector<int, 5> vec{3, 1, 4, 1};
  assert(*vec.try_push_back(5) == 5);
  assert(vec.try_push_back(9) == nullptr);
}
```

## try_append_range

```cpp
template <container-compatible-range<T> R>
constexpr ranges::borrowed_iterator_t<R> try_append_range(R&& rng);
```

C++23 で追加された `append_range` の `try_` 版です。
`append_range` も `push_back` などと同様に `void` を返しますが、 `try_append_range` は追加できた要素の範囲 [first, last) の last を返します。

```cpp
#include <algorithm>
#include <array>
#include <cassert>
#include <inplace_vector>
#include <ranges>

int main() {
  std::inplace_vector<int, 5> vec{3, 1};
  auto rng = std::views::iota(0, 5);
  auto it = vec.try_append_range(rng);
  assert(std::ranges::equal(vec, std::array{3, 1, 0, 1, 2}));
  assert(it == rng.begin() + 3);
}
```

## unchecked_emplace_back, unchecked_push_back

```cpp
template <class... Args>
constexpr reference unchecked_emplace_back(Args&&...);

constexpr reference unchecked_push_back(const T& x);
constexpr reference unchecked_push_back(T&& x);
```

上記の `try_` 版に対し無条件に参照を返す版です。

`unchecked_emplace_back(args...)` は `*try_emplace_back(args...)` と、 `unchecked_push_back(arg)` は `*try_push_back(arg)` と等価です

# 既存実装

`std::inplace_vector` のようなコンテナ型は、これまでにも `static_vector` のような名前で使われてきました。 Boost.Container にも `boost::container::static_vector` が実装されています。


# 参照

[P0843R13 inplace_vector](https://wg21.link/P0843R13)
https://eel.is/c++draft
https://github.com/cplusplus/papers/issues/114
PostgreSQL: Python3 で csv をインポート （位置）

こちらのプログラムを改造して、csv の位置で、データをインポートします。
[PostgreSQL: Python3 で csv をインポート](https://qiita.com/ekzemplaro/items/d1ea0588fc8df31def04)

## サンプルの csv

```text:cities_jp.csv
識別記号,都市名,人口,更新日
t1271,千葉,73561,2019-7-30
t1272,勝浦,24895,2019-8-10
t1273,市原,67294,2019-1-14
t1274,流山,73612,2019-5-9
t1275,八千代,63491,2019-8-4
t1276,我孫子,41827,2019-1-21
t1277,鴨川,12946,2019-7-23
t1278,銚子,79128,2019-11-26
t1279,市川,13572,2019-10-15
```

## プログラム

ポイントは、次です。

```py
row.iloc[index]
```

```py:csv_place_import.py
#! /usr/bin/python
#	csv_place_import.py
#
#						Jul/10/2024
# ------------------------------------------------------------------
import pandas as pd
import psycopg2
import sys
# ------------------------------------------------------------------
from prepare_sql import prepare_sql_proc
from prepare_sql import get_columns_order
# ------------------------------------------------------------------
csv_file = sys.argv[1]

dbname = "city"
user = "scott"
password = "tiger123"
host = "localhost"
port = "5432"

conn = psycopg2.connect(dbname=dbname, user=user, password=password, host=host, port=port)

df = pd.read_csv(csv_file)

table_name = 'cities'

cur = conn.cursor()

array_columns = get_columns_order(cur,table_name)
sql = prepare_sql_proc(table_name,array_columns)
print(sql)

try:
	for index, row in df.iterrows():
		data = ()
		index = 0
		for col in array_columns:
			data += (row.iloc[index],)
			index += 1
		print(data)
 
		cur.execute(sql, data)
	
	conn.commit()
	print("データのインポートが完了しました。")

except psycopg2.Error as e:
	print(f"データのインポート中にエラーが発生しました: {e}")

finally:
	cur.close()
	conn.close()
# ------------------------------------------------------------------
```

prepare_sql.py はこちら
[PostgreSQL: Python3 で csv をインポート](https://qiita.com/ekzemplaro/items/d1ea0588fc8df31def04)
リスト型と辞書型の計算量の違い~ハムスターのごはん探し~

# あれご飯どこに隠したっけ？
ある日，ケージから脱走し部屋へと探索に出るハムスター
ハム「おなかがすいた」
ハム「そういえば，別の隠し場所に，ご飯を貯めていたはず！」
ハム「，，，，，，，，，あれ？どの隠し場所にご飯貯めてたっけ？」
どこにご飯を隠したか，思い出せないハムスター，さてどこにあったかどのように探していくのだろう？
![ハムスター画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562111/c130786c-1843-877f-22a3-23a047a50d15.png)

# 隠し場所の候補
ハム「そういえば，ごはんはN個の隠し場所に隠したはず」
ハム「えーと，冷蔵庫の裏と，テレビ台の裏と，押し入れの隅と・・・エコバックの中と」
ハム「どこにご飯を隠したっけ？」

# あんまり賢くないハムスター(リスト型)
ハム「どこかに隠したことは覚えているけど，どこに隠したかは覚えてないな」
ハム「どこにあるか，わかんないから，全部回って確認しよう！」
そうして，ハムスターは覚えている隠し場所の候補を全て回ることにしたのであった．
ハム「1つ目の場所は違う，2つ目の場所も違う・・・N個目の場所にあった！」
ハムスターが，ご飯を発見するまでに最悪のケースでは，隠し場所の数(N)箇所を探しに行かなければなりません．

```python:List_sample.py
place_lis = [False, False,False，...,False, True] #N個
#True(ご飯がある場所)を検索
for place in place_to_hide_lis:
    if place == True:
        #最悪の場合の操作回数: N回
        print("ご飯見つけた！")
```
ハム「いっぱい回って疲れた，，，」


# ちょっと賢くなったハムスター(辞書型)
前回，家中を回って懲りたハムスター
ハム「今度は隠した場所の名前を，憶えておいた！」
ハム「そこだけ，確認しに行けばいいや！」
ハム「”サーバラックの下”に隠したはず」

```python:Dict_sample.py
place_dict = {'冷蔵庫の裏': 'False', 'テレビ台の裏': 'False',..., 'サーバラックの下': 'True'}
# キー''を検索
if place_dict['サーバラックの下'] == 'True':
    print("ご飯見つけた！")  # 平均的な操作回数: 1回
```
なんと，一か所探すだけでご飯が見つかりました．

# まとめ
どちらも便利ではあるけれど，基本一発で一意に定まるので，検索速度は速い辞書型方が速い．このあたりを理解しておくと，辞書型とリスト型の使い分けにそこそこ便利だと思う．
Azure CLIを使ってAzureVMにRDPする

# はじめに
仕事でAzureを使う機会が増えそうな感じなのでAzureCLIをインストールしようと思います。
最初はWSL2上のUbuntuで作業できるようにと考えたのですが、どうもRDPのタイミングでWindows出ないとできないことが分かったので、結局Windowsで実施しています。

最終的には、AzureVMにファイルを転送しようと思います。

# 前提
- AzureにVMがある
- Azure BastionのSKUをStandardまたはPremiumに設定し、ネイティブクライアントが有効になっている

# Azure Bastionとは

仮想ネットワーク（VNet）内の仮想マシン（VM）に対して、RDP（リモートデスクトッププロトコル）およびSSH（Secure Shell）を介して安全にアクセスするためのPaaS（Platform as a Service）ソリューションです。パブリックIPアドレスを仮想マシンに割り当てることなく、ブラウザベースのRDPおよびSSH接続を利用できます。これにより、VMのセキュリティが向上し、インターネット経由の攻撃リスクを低減できます。

# やってみる
## AzureCLIのインストール
Azureは公式のヘルプが充実しているので、進めやすいですね
[こちら](https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli)のサイトを参考にやってみようと思います。

インストら―があるので、環境にあったインストーラーを起動してください。

## ファイルの転送

### Azureアカウントにサインイン
以下コマンドを実行すると、ブラウザが起動して、Azureへのサインインが可能になります。
```powershell
az login
```

サブスクリプションが複数ある場合は、以下コマンドでBastionリソースを含んでいるサブスクリプションを選択してください。
```powershell
az account list
az account set --subscription "<subscription ID>"
```

### RDPでターゲットVMにサインイン

```powershell
az network bastion rdp --name "<BastionName>" --resource-group "<BastionResourceGroupName>" --target-resource-id "<VMResourceId>"
```

<VMResourceId>は、以下のような長いIDになります。Azure管理画面からVMを表示して、JSONを表示すれば参照可能です。

```powershell
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my_resource_group_2/providers/Microsoft.Compute/virtualMachines/myApp2
```

これで、リモートデスクトップが起動されるので、
ローカルでコピーして、リモデ側にペーストすればファイルを転送することができます。

# 終わりに
実際にやってみると、そこそこ簡単にはできました。
VMResourceIdの指定方法と、Bastionの設定がキモですね。
ITエンジニアのための転職ガイド：成功への道筋



## はじめに

ITエンジニアの転職は、キャリアアップの重要な手段として注目されています。本記事では、ITエンジニアの転職に関する様々な側面を探り、成功への道筋を示します。

## 1. 転職の目的を明確にする

転職を考える前に、自分の目的を明確にすることが重要です。キャリアアップ、給与アップ、ワークライフバランスの改善など、目的によって転職先の選び方が変わってきます。

## 2. 市場価値を把握する

ITエンジニアの年収は、スキルや経験、所属企業によって大きく異なります。自分の市場価値を正確に把握することで、適切な転職先を見つけやすくなります。

## 3. スキルアップの重要性

転職を成功させるためには、常にスキルアップを心がけることが大切です。新しい技術の習得や資格の取得は、転職市場での競争力を高めます。

## 4. 転職エージェントの活用

転職エージェントは、ITエンジニアの転職において重要な役割を果たします。ただし、エージェントの選定には注意が必要です。IT専門のエージェントを選び、複数のエージェントを比較検討することをおすすめします。

## 5. 企業研究の重要性

転職先の企業文化や働き方を事前に調査することで、入社後のギャップを減らすことができます。転職口コミサイトや企業の公式情報を活用しましょう。

## 6. 面接対策

ITエンジニアの面接では、技術力だけでなくコミュニケーション能力も重視されます。企業ごとに面接傾向が異なるため、個別の対策が必要です。

## 7. 転職後のキャリアパス

転職先でのキャリアパスを考えることも重要です。自社サービス開発、SES、コンサルティングなど、様々な選択肢があります。長期的なキャリア目標に合わせて転職先を選びましょう。

## おわりに

ITエンジニアの転職は、慎重に計画し実行することで大きな成果を得られます。自己分析、市場調査、スキルアップを怠らず、自分に合った転職先を見つけてください。

この記事が、あなたの転職成功の一助となれば幸いです。
Db2 for i : DDM 分散データ管理機能

[昨日の記事](https://qiita.com/gomAnomalocaris/items/95f706a5f8868335e6ff)で触れたDDMについてです。

## DDMとは

・DDMはRPG, COBOLなどの言語でリモートのデータベースをローカルデータベースのように操作する技術
・DB2間の汎用プロトコルであるDRDAを使用してDB2/400間を接続しリモートデータベースファイルを操作

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/51de2201-7b66-bfaf-e219-b98f56e7fbd1.png)

クラサバ・Java以降のアプリケーション構造はプログラムロジックとデータベースを分離可能（というか分離がデフォルト）でしたが、それ以前から存在するRPG, COBOL等のプログラム構造は基本的にはロジックとデータベースを同一OS内に持つことがデフォルトでした。
このため、リモートのデータベースを操作する方法のひとつとしてDDMが使用されます。

参考URL:https://www.ibm.com/docs/ja/i/7.5?topic=overview-ddm


## DDMの例

昨日の記事の例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/df1bf0eb-7a0a-c08f-e5c8-ebc63888e2d8.png)

### リモートシステム上のオブジェクト

リモートシステムに実際にCRUD操作するデータベースオブジェクト（テーブル）が存在します。
例ではスキーマ：DEMOLIB、テーブル名：TOKMSPです。

### ローカルシステム上のオブジェクト

ローカルシステム上にはリモートシステムのテーブルに対するポインターとして機能するDDMオブジェクトが存在します。
また、データベース操作をするアプリケーション、プログラムもローカルシステム上に存在します。例ではDFUというIBM i OSのDB操作ユーティリティを図示しました。

DDMオブジェクト（DDMファイル）の作成法コマンド例は下記です。

```
CRTDDMF FILE(GOMALIB/TOKMSP75) RMTFILE(DEMOLIB/TOKMSP) RMTLOCNAME(IBMI75 *IP)

```

スキーマ：GOMALIB に TOKMSP75という名前のDDMファイルを作成します。実際にCRUD操作するリモートのライブラリー名（スキーマ名）とテーブル名をDEMOLIB、TOKMSPと指定しています。
【仕事の進め方】目的と手段について

## はじめに
エンジニアをしている長谷川と申します。
普段の仕事で感じたことを自戒も込めて記載します。

# 手段の目的化に注意
システム開発において、試験は大事です。
様々なテストフレームワークも存在しており、
「試験が全部OKとなる」のは納品やリリースを行う前提と言っても良いと思います。

ここで気を付けたいのが「試験が全部OKとなる」ことは「目的」なのか？
ということです。

:::note warn
「試験が全部OKとなる」は目的ではなく、
品質を担保するための手段であり、正しい試験が出来ているかが重要！！
:::

どんなに試験が全部OKであっても、
正しい試験がされていなければ試験の意味はありません。

「何を当たり前のことを・・・」
と思われるかもしれませんが、結構な頻度で目にします・・・。
スケジュールが遅延していたり、目的を見失っていたり、といった要因もありますが、
「試験が全部OK」を目的としてしま人たちを・・・。

結果、試験のやり直しになってスケジュールが遅延したり、
誰も気づかないまま世に出て不具合報告を受けたり。。。

## 作業中は定期的に目的の確認を
例として試験を挙げましたが、資料作成やコーディングなど他のことでも同じようなことが言えます。

そんな不幸を招かないためにも、指示を受けた時や作業中に「ん？」と思ったときには、
作業に取り掛かる（作業を進める）前に一旦立ち止まり、
これからやる（今やっている）作業の目的はなんなのか、
改めて確認してから作業に入りましょう。

それだけで手戻りや不具合対応という不幸は減りますので・・・。

以上、長谷川でした。
Rails + I18n - バリデーションエラーの言語を強制指定する例

# 翻訳設定

てきように用意しておく

以下は英語翻訳で、

- 属性に対しての翻訳
- ひとつのモデルに対してのエラーの種類の翻訳

を指定した例

`api/config/locales/activerecord.en.yml`

```yml
---
en:
  activerecord:
    attributes:
      example:
        foo: localed foo
    errors:
      models:
        example:
          blank: IS BLANK!
```

# Rails Console で試す

英語指定の場合

```rb
I18n.locale = :en
```

```rb
example = Examole.new # 何か不正なデータ状態
example.validate
puts example.errors.full_messages
```

エラーメッセージの例

```
["localed foo IS BLANK!"]
```

# Controller で試す

英語指定の場合

```rb
class ExampleController <ApplicationController
  around_action :switch_locale

  def switch_locale(&)
    locale = :en
    I18n.with_locale(locale, &)
  end

  def index
    example = Examole.new # 何か不正なデータ状態
    example.validate
    puts example.errors.full_messages # ここでエラーメッセージが得られる。Railsサーバーのログなどで確認する
  end
end
```

# 公式


>I18n.locale=やI18n.with_localeを使わない場合、すべての訳文でデフォルトのロケールが使われます。
>
>I18n.localeの設定がすべてのコントローラで一貫していないと、同じスレッドやプロセスによって処理される今後のリクエストにI18n.localeが漏出する可能性があります。たとえば、あるPOSTリクエストでI18n.locale = :esを実行すると、ロケールを設定していないコントローラで以後のすべてのリクエストに効いてしまいます。
>こうした理由から、I18n.locale =の代わりに、漏出が発生しないI18n.with_localeを利用することもできます。
>
>ロケールはApplicationControllerのaround_actionで設定できます。

```rb
around_action :switch_locale

def switch_locale(&action)
  locale = params[:locale] || I18n.default_locale
  I18n.with_locale(locale, &action)
end
```

https://railsguides.jp/i18n.html


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
ソリューションアーキテクトに求められる視点(2/14) 　AWS Well-Architected Framework サステナビリティ（持続可能性）の柱

## はじめに
ソリューションアーキテクトのための視点を整理してみました。

今回は、**AWS Well-Architected Framework サステナビリティ（持続可能性）の柱です。具体的には、「インスタンスの終了を適切に処理するようにアプリケーションを設計する」** 観点にフォーカスしました。実務でも試験でも、ご参考にして頂けましたら、幸いです。

## **ソリューションアーキテクトのための視点**
Auto Scaling グループで Amazon EC2 インスタンスを使用して、AWS クラウドでコンテンツを処理しています。コンテンツの処理には 30 分かかります。SQSキュー内の処理数に応じて、複数の EC2 インスタンスがスケールインおよびスケールアウトします。処理が適切にされていないものがありました。しかし、ログにエラーが見つかりませんでした。考えられる理由を教えてください。

## **ソリューション 例**
インスタンスの終了を適切に処理するようにアプリケーションを設計する
**処理中にインスタンスのスケールイン保護を構成する**
これを設定していると、インスタンスの終了がデフォルトで拒否するようになる。インスタンスのスケールイン保護設定が無効になるまで、Auto Scaling グループは必要な数のインスタンスを終了できません。そのため、インスタンスが起動したままになるので、不具合が生じた際のエラー状況を確認出来るようになるものと考えられます。

## インスタンスの終了を適切に処理するための12の観点

1. **インスタンスのスケールイン保護**
処理中のインスタンスがスケールインイベントで終了されるのを防ぎます。
保護されているインスタンスは、スケールインイベントが発生しても終了されません。

2. **カスタム終了ポリシー**
Auto Scalingグループのカスタム終了ポリシーを設定し、どのインスタンスを最初に終了するかを決定します。
特定のインスタンスを優先的に終了することで、重要な処理を行っているインスタンスが終了されるのを防ぎます。

3. **終了ライフサイクルフック**
終了ライフサイクルフックを設定し、終了対象として選択されたインスタンスの有効期間を延長します。
インスタンスが終了される前にクリーンアップ処理を実行する時間を確保できます。

4. **CloudWatchアラームとイベント**
CloudWatchアラームとイベントを設定し、インスタンスの終了通知を受け取ります。
インスタンスが終了される前に通知を受け取り、適切なアクションを実行できます。

5. **Graceful Shutdown (優雅なシャットダウン)**
アプリケーションがSIGTERMシグナルを受け取ったときにクリーンアップ処理を実行するように設計します。
インスタンスが終了される前にデータの保存やリソースの解放を行うことができます。

6. **データの永続化**
アプリケーションの状態やデータを永続化するために、Amazon RDSやAmazon DynamoDBなどのデータベースを使用します。
インスタンスが終了してもデータが失われません。

7. **セッション管理**
ユーザーセッションを管理するために、Amazon ElastiCacheなどのインメモリデータストアを使用します。
セッションデータがインスタンスの終了によって失われることを防ぎます。

8. **ログの収集**
アプリケーションのログをCloudWatch Logsに送信します。
インスタンスが終了してもログデータが失われないようにします。

9. **メトリクスの収集**
アプリケーションのメトリクスをCloudWatchに送信します。
インスタンスのパフォーマンスや状態を監視できます。

10. **Auto Scalingグループの設定**
Auto Scalingグループの設定を最適化し、スケールインおよびスケールアウトのポリシーを調整します。
適切なタイミングでインスタンスがスケールインおよびスケールアウトされるようにします。

11. **SQSキューの設定**
SQSキューの設定を最適化し、メッセージの可視性タイムアウトを調整します。
処理中のメッセージが適切に再処理されるようにします。

12. **リトライロジックの実装**
アプリケーションにリトライロジックを実装し、失敗した処理を再試行します。
一時的なエラーやインスタンスの終了による処理の失敗を防ぎます。

## インスタンスの終了を処理するための3つの戦略

**その壱　シグナルハンドラーを使用する**
オペレーティングシステムは、インスタンスが終了する前に SIGTERM シグナルを送信します。このシグナルをキャッチして、アプリケーションをクリーンアップするコードを実行できます。これには、開いているファイルをクローズし、トランザクションをコミットし、キャッシュをフラッシュすることなどが含まれます。

**其の弐　終了フックを使用する** 
多くのランタイム環境とフレームワークには、終了フックと呼ばれるメカニズムが用意されています。これにより、インスタンスが終了する前に実行されるコードを登録できます。

**其の参　ライフサイクル管理ツールを使用する**
Kubernetes や Amazon ECS などのライフサイクル管理ツールを使用すると、インスタンスの終了プロセスを自動化できます。これらのツールを使用して、インスタンスが終了する前に実行されるカスタムスクリプトを定義できます。

## インスタンスの終了を適切に処理するようにアプリケーションを設計する3つの観点

### 其の壱　インスタンスのスケールイン保護
これを設定していると、
インスタンスの終了がデフォルトで拒否するようになる。
保護されている場合、スケールインイベントが発生すると、必要な容量が減ります。
インスタンスのスケールイン保護設定が無効になるまで、Auto Scaling グループは必要な数のインスタンスを終了できません。

### 其の弐　カスタム終了ポリシー
これを設定していると、
どのインスタンスを最初に終了するかを決定できる。

### 其の参　終了ライフサイクルフック
これを設定していると、
終了対象として既に選択されているインスタンスの有効期間を延長できる。

詳細は、こちらを参照ください。

インスタンスの終了を適切に処理できるようにアプリケーションを設計する

https://docs.aws.amazon.com/autoscaling/ec2/userguide/gracefully-handle-instance-termination.html

インスタンスのスケールイン保護を使用してインスタンスの終了を制御する

https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html
#### 改めて、整理した所、私自身勉強になりました。ご参考になりましたら、幸いです。
[備忘録]　IT用語について分かったことをまとめてみた ~ver.7

# はじめに
こんにちは，Umamusume22です．今回もIT用語について分かったことをまとめてアウトプットしていきます．

# 備忘録
#### 隠しコマンド[1]
- 説明書とかに載っていない知る人ぞ知るコマンドのこと
- 裏技扱い的なコマンド
- 安逸に使うものではない．作った人にとってはあまり使われたくない

#### BIOS[2]
- OSが動き出す前のお仕事をやってくれるプログラム
- パソコンの電源が入って最初に動く，主にハードウェアを制御するプログラム
- マザーボードと呼ばれる部品にBIOSがくっついている
- ハードディスクを動かしたりキーボードに仕事の準備をさせる
- パソコンの機械的な部分を管理する制御プログラム

# 最後に
今回も記事の内容が短くて申し訳ありません．
引き続きIT用語について分かったことをアウトプットしていきます
読んでいただきありがとございました!

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!

# 参考文献
[1] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word15203.html

[2] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word12418.html
非同期パスのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

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

+ [Slack フローで使う時は非同期パスを使う？](https://qiita.com/Keiji_otsubo/items/a43a58edc37460c047d8)
+ [Flow scheduled path](https://qiita.com/Keiji_otsubo/items/27cf4c26a271db1e2ce4)
+ [Spring 22 以降のレコードトリガーフローのベストプラクティス](https://qiita.com/Keiji_otsubo/items/a88b9989367634ce6d4b)
+ [Salesforce の非同期実行アプローチ - ローコード、プロコード、ハイブリッド](https://qiita.com/Keiji_otsubo/items/ed8dfe4e73cf58701501)

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

+ [Salesforce for Slackを使用してSlack通知をするフローで作成時に動作しない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmJiM)

:::note
非同期パスのトリガーについて同じような投稿を探してみると

開始要素のエントリー条件なくて、決定要素でLastModifiedDateが変更されたかをチェックするようなことが回答されています。

Don't set entry conditions in start element . Please add a decision element after start and then try checking {!$Record.LastModifiedDate} isChanged True.

This way worked for me . Hope that helps .Please try this and let me know if it solves your issue.

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

また、以下ではどう使うかは理解できませんでしたが、isChangedでなくてisNewを使うようなことも議論されています。

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

またエントリ条件を無しにしてしまうと添付画像のようなエラーが出て有効化できませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4b3a875a-8b29-51ff-999a-0791b5201a28.png)

実際に設定してみましたが、保存を押してもエラーはないみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c2d3a9cc-059d-0e80-554d-5f53dd3d5486.png)
:::
【Eclipse/Git】ローカルリポジトリのルートにプロジェクトのファイルを配置する

Eclipseでローカルリポジトリのルートディレクトリに、プロジェクトのファイルを直に配置する方法をまとめました。

# プロジェクトの共用からローカルリポジトリを作成した際のディレクトリ構成
Eclipseでプロジェクトを右クリックして、「チーム」→「プロジェクトの共用」からローカルリポジトリを作成すると、以下のようなディレクトリ構成になります（Javaプロジェクトの場合）。
```
. ローカルリポジトリのルートディレクトリ
├── README.md
└── プロジェクト名
    ├── .gitignore
    └── src
        └── パッケージ名
            └── Main.java
```

## 問題点
ローカルリポジトリのルートディレクトリとプロジェクトのディレクトリが分かれてしまう

.gitignoreファイルをローカルリポジトリのルートディレクトリに移動させる必要がある

# ローカルリポジトリを作成してからプロジェクトを新規作成する

それに対して、先にEclipseでローカルリポジトリを作成してから、ローカルリポジトリのルートディレクトリにプロジェクトを新規作成すると、以下のようなディレクトリ構成になります。
```
. ローカルリポジトリのルートディレクトリ
├── .gitignore
├── README.md
└── src
    └── パッケージ名
        └── Main.java
```
やり方としては、まずEclipseのパースペクティブを「Git」にして、Gitリポジトリーの「Gitリポジトリーを作成し、このビューに追加」からローカルリポジトリを作成してビューに追加します。

あとは、「ファイル」→「新規」→「プロジェクト」から作成したいプロジェクトを選択し、「デフォルト・ロケーションを使用」のチェックを外して、ロケーションにローカルリポジトリのルートディレクトリを指定して作成すればOKです。
Google benchmarkでマルチスレッド測定

## Google Benchmark

Googleのベンチマークライブラリを使ってみました。

https://github.com/google/benchmark/tree/main

- インストールは[README](https://github.com/google/benchmark/tree/main?tab=readme-ov-file#installation)のとおりに行いました。

```bash
# Check out the library.
$ git clone https://github.com/google/benchmark.git
# Go to the library root directory
$ cd benchmark
# Make a build directory to place the build output.
$ cmake -E make_directory "build"
# Generate build system files with cmake, and download any dependencies.
$ cmake -E chdir "build" cmake -DBENCHMARK_DOWNLOAD_DEPENDENCIES=on -DCMAKE_BUILD_TYPE=Release ../
# or, starting with CMake 3.13, use a simpler form:
# cmake -DCMAKE_BUILD_TYPE=Release -S . -B "build"
# Build the library.
$ cmake --build "build" --config Release
```

使い方は簡単で、任意のC++コードからライブラリをインクルードして使用できます。

```c++: mybenchmark.cc
#include <benchmark/benchmark.h>

static void BM_StringCopy(benchmark::State& state) {
  std::string x = "hello";
  for (auto _ : state)
    std::string copy(x);
}

// ベンチマークのインスタンスを初期化・登録する
BENCHMARK(BM_StringCopy);

BENCHMARK_MAIN();
```

コードはそのままコンパイルして実行できます。コンパイルではbenchmark/includeとビルドしたライブラリをリンクします。

```console
$ g++ mybenchmark.cc -std=c++11 -isystem benchmark/include \
  -Lbenchmark/build/src -lbenchmark -lpthread -o mybenchmark
```

これを実行すると実行時間とCPU時間、イテレーション数が表示されます。一応、シングルのときはコアを固定しておきます。

```console
$ taskset -c 0 ./mybenchmark 
:
Benchmark              Time             CPU   Iterations
--------------------------------------------------------
BM_StringCopy       8.43 ns         8.43 ns     82244798
```

また、`--benchmark_format`でcsv, json形式でも出力できます。

```console
$ taskset -c 0 ./mybenchmark --benchmark_format=csv
:
"BM_StringCopy",81924408,8.39236,8.39254,ns,,,,,
```

イテレーション数は測定回数で、実行時間は各測定の平均値が取られています。イテレーション数は以下のように指定もできるようです。

```c++
BENCHMARK(BM_StringCopy)->Iterations(100000000);
```

### マルチスレッド実行

マルチスレッドは`ThreadRange`を使うと測定できます。これは1~8まで、1, 2, 4, 8と並列数を増やして測定してくれます。

```c++
#include <benchmark/benchmark.h>

int total = 1 << 28;
static void BM_Loop(benchmark::State& state) {
  int sum = 0;
  for (auto _ : state) {
    int p = 0;
    for (int i = 0; i < total; ++i) {
      p++;
    }
    sum += p;
  }
}

BENCHMARK(BM_Loop)->ThreadRange(1, 8);

BENCHMARK_MAIN();
```

結果は以下のようになりました。

```console
Benchmark                  Time             CPU   Iterations
------------------------------------------------------------
BM_Loop/threads:1  422985199 ns    422978180 ns            2
BM_Loop/threads:2  215144377 ns    430289045 ns            2
BM_Loop/threads:4  109576930 ns    438312587 ns            4
BM_Loop/threads:8   55103040 ns    438397040 ns            8
```

内部(`BenchmarkRunner`)で自動的にスレッドを割り当てているようです。[ユーザーガイド](https://github.com/google/benchmark/blob/main/docs/user_guide.md#multithreaded-benchmarks)によると以下らしいです。（[このあたり](https://github.com/google/benchmark/blob/v1.8.4/src/benchmark_register.cc#L137)で排他制御している）

>すべてのスレッドがベンチマークループの開始点に到達するまで、どのスレッドも開始せず、どのスレッドもベンチマークループを抜ける前に終了することが保証されている。


#### 環境

8コアのCPUを使いました。スレッド数は計8スレッドです。

```txt
  Model name:           Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
    Thread(s) per core: 1
    Core(s) per socket: 8
    Socket(s):          1
```
レスポンシブデザインの実践

# レスポンシブデザインとは
レスポンシブデザインとは、ユーザーのデバイスに応じてWebサイトのレイアウトを動的に調整する設計手法です。これにより、どのデバイスでも最適なユーザー体験を提供することができます。
# メディアクエリの使用
メディアクエリは、CSSで特定の条件に基づいてスタイルを適用するための方法です。画面サイズに応じて異なるスタイルを適用するために使用されます。

以下は、基本的なメディアクエリの例です。
```css
/* デフォルトのスタイル */
body {
    font-size: 16px;
}

/* 画面幅が600px以下の場合のスタイル */
@media (max-width: 600px) {
    body {
        font-size: 14px;
    }
}
```
# フレキシブルグリッドレイアウトの作成
フレキシブルグリッドレイアウトは、レスポンシブデザインの中核となる概念です。フレックスボックスやグリッドレイアウトを使用して、要素が画面サイズに応じて適切に配置されるようにします。
```css
.container {
    display: flex;
    flex-wrap: wrap;
}

.item {
    flex: 1 1 200px; /* 各アイテムが最低200pxを占める */
    margin: 10px;
}
```
# 画像のレスポンシブ化
画像をレスポンシブにすることで、異なる画面サイズに対応できます。CSSのmax-widthプロパティを使用して、画像のサイズを調整します。
```css
img {
    max-width: 100%;
    height: auto;
}
```
# CSSフレームワークの活用
CSSフレームワークを使用すると、レスポンシブデザインの実装が簡単になります。代表的なフレームワークには、Bootstrap、Foundation、Tailwind CSSなどがあります。

例: Bootstrap
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Responsive Design with Bootstrap</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-md-4">Column 1</div>
            <div class="col-md-4">Column 2</div>
            <div class="col-md-4">Column 3</div>
        </div>
    </div>
</body>
</html>
```
# ベストプラクティス
* モバイルファースト: まずモバイル向けにデザインを作成し、その後デスクトップ向けに拡張します。
* フレキシブルなユニット: pxではなく、emやrem、%などのフレキシブルな単位を使用します。
* メディアクエリの統一: 同じ条件のメディアクエリをまとめて書くことで、コードの可読性を向上させます。
# 最後に
最近作ったアプリでレスポンシブデザインを適用して学んだことをまとめました。間違っているところがあると思いますので、ぜひ参考記事を読んでみてください。
# 参考

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_media_queries/Using_media_queries


https://getbootstrap.com/docs/5.3/getting-started/introduction/
【新入社員必見】【脱マウス】あなたのキーボードにはありますか？アプリケーションキーがないキーボードでのアプリケーションキーのショートカット

# 概要
あなたが使っているキーボードには「アプリケーションキー」は御座いますか？
そもそも「アプリケーションキー」というのは、以下のキーのことを言います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/5a724d17-dc83-cfcb-6cc7-ea5f60b197f8.png)

この「アプリケーションキー」はマウスの右クリックと同じ役割があります。
マウスと同じというと、エクスプローラーで押すと下のキャプチャーの様にコンテキストメニューを開いたりできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/dab38367-5380-c0f3-595d-df9b0baf39a0.png)


ですが、ノートパソコンのキーボードには、そのコンテキストメニューが無いことが多々あります。
こんな風に・・・
![20240706_225148.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/610bb798-77b9-4d49-151b-7ecac024e3e2.jpeg)

では、アプリケーションキーが無い場合、マウスを使わないでどうやってコンテキストメニューを開けばよいのでしょうか。

# アプリケーションキー代替のショートカットを使おう！
ということで、あまり知られていないかもしれませんが、「アプリケーションキー」と同じ効果を持つショートカットキーがあります。

それが
```
[Shift]キー + [F10]キー
```
です。
ほら、同じようにコンテキストメニューが出ましたね！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/3d0e725f-43ba-91e9-4503-b3cedc7f405a.png)

しかも、その後もコマンドで操作が出来るように、ナビゲーションも表示されております。

これで、ノートPCでもコンテキストメニューが使えますね！

# 最後に
はい、ということで今回の記事はいかがでしたでしょうか？
意外と知らない人が多いので、少しはお役に立てると幸いです。

最後になりますが、この記事が皆さんの成長の少しでも手助けになることを祈って、この記事を閉めたいと思います。
最後までお読みいただきありがとうございました。

※本記事はQmonus Value Streamの投稿キャンペーン記事です。
【新入社員必見】【Excel】マイナーな「カメラ」機能を使って、作業効率アップ！

# 概要
さて、今回は大変短くなること、間違いなしです！！
ということで、今回はExcelのカメラ機能についてです。

皆さん、Excelに「カメラ」という機能があるのはご存知ですか？
リボンにも表示されていないマイナー機能となるので、知らない方も多数ではないでしょうか・・・。
そんな「カメラ」機能を御紹介いたします。

# カメラ機能について
ちなみにこれが「カメラ」機能のアイコンです。
私は「カメラ」機能を愛しているので、クイックアクセスツールバーに設定しております笑笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/102b8d30-9cba-1ef8-79b8-79441c63295f.png)

ということで、昨日の説明ですが、以下の様にセルにデータがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/9acb317e-e33e-498a-b850-b1748cdf1ad3.png)

そのセルを選択して、「カメラ」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/2de5a6c2-1b2b-3d21-df38-b588492f32df.png)

そして、適当なセルをクリック。
すると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/741d7c96-4aa8-2123-706d-51f2e612dae0.png)

選択したセルの画像が現れました！！
しかも、C3セルを「修正」というデータに修正すると、
勝手に画像の方も修正されるんです！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/f7c2a37d-efcf-7adf-a4cc-8eb0d1023c75.png)

この機能があれば、レポートへ記載する結果とか修正漏れがなくなって非常に重宝してます！！

# 最後に
はい、本日は短いですが、以上です！

最後になりますが、この記事が皆さんの成長の少しでも手助けになることを祈って、この記事を閉めたいと思います。
最後までお読みいただきありがとうございました。
【新入社員必見】【サクラエディタ】正規表現置換を使って保守効率アップ

※本記事はQmonus Value Streamの投稿キャンペーン記事です。

# 概要
皆さんはテキストエディタといえば、何を使っておりますか？
私は「NoEditor」や「K2Editor」などのフリーのテキストエディタを使用したときもありましたが、やはり「サクラエディタ」が最良だと感じております。

# サクラエディタとは
サクラエディタは日本産のテキストエディタで、オープンソースとして公開されているので、基本無料のテキストエディタです。
しかも、複数エンコード・Grep・マクロ等の機能も完備しており、使い勝手は抜群です。

# ダウンロード・インストール
最新版は以下からダウンロードが出来ます。

https://sakura-editor.github.io/

以下のサイトに追加機能やその他の詳細情報の記載があります。

https://sakura-editor.github.io/old_download.html


# 正規表現
さて、本題ですが、「サクラエディタ」では正規表現を使って、簡単に文字列検索や文字列置換が可能です。
そもそも正規表現とは、文字列の中から見いだされるルール・表現のことで、
例えば「aaabbbccc」という文字列があった場合、これらはすべて文字列なので、文字列が9つというルールに置き換えられるので、「.........」とすることが出来ますし、そもそも文字列というルールもあるので「*」で表すことが出来ます。

# よく使う正規表現一覧

<table>
  <thead>
    <tr>
      <th>正規表現</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td>.</td> <td>任意の1文字</td>
  </tr>
  <tr>
    <td>\w</td> <td>記号以外の文字列</td>
  </tr>
  <tr>
    <td>\W</td> <td>記号の文字列</td>
  </tr>
  <tr>
    <td>\s</td> <td>空白・改行</td>
  </tr>
  <tr>
    <td>\S</td> <td>空白改行以外</td>
  </tr>
  <tr>
    <td>\d</td> <td>数値（十進数）</td>
  </tr>
  <tr>
    <td>\t</td> <td>Tabコード</td>
  </tr>
  <tr>
    <td>\n</td> <td>改行（Lf）</td>
  </tr>
  <tr>
    <td>\r</td> <td>改行（CR）</td>
  </tr>
  <tr>
    <td>\r\n</td> <td>改行（CR+LF）</td>
  </tr>
  <tr>
    <td>^</td> <td>行頭</td>
  </tr>
  <tr>
    <td>$</td> <td>行末</td>
  </tr>
</table>


# 使い方
さて、正規表現の使い方ですが、以下の様な使い方をよく用います。

## 使い方例➀（改行の除外）
ということで、最初は改行の除外になります。
まずは
```
[ctrl]キー + [R]キー
```
を押して、置換ダイアログを表示させます。
その後、下記のウインドウの様に入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/05268010-848a-351a-2455-ef32cf331299.png)
```
置換前：\r\n
置換後：
正規表現：on
```
そして、「すべて置換」をクリックします。
時々、文字コード違いで「\r\n」では置換できない場合があります。
その時は「\r」や「\n」を試してみましょう。


## 使い方例➁（日時の検索・置換）
さて、今回は日付を検索してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/e28f4381-5e19-0b6b-9a0b-225ff1001647.png)

上記の日付の内「12年」だけを置換したい場合を考えます。
あまり良い例ではないので「12年」と直接入力しても良いのですが、
今回は正規表現を使って検索していきましょう。

「使い方例➀（改行の除外）」と同じく置換ダイアログを表示し、以下の通り入力します。
その後以下の通り入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/b961adfb-f123-9047-d5d9-cf74504faba9.png)
その後「該当行マーク」をクリックすると・・・
想定通り、対象の所だけがマークされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/4b82891e-3c4b-7549-6c81-00461ab549d6.png)

# 最後に
良い例が思いつかなかったのが大変残念ではありましたが、
正規表現による検索や置換は大変良く使う手段となりますので、新人さんは覚えておきましょうね！！
最後になりますが、この記事が皆さんの成長の少しでも手助けになることを祈って、この記事を閉めたいと思います。
最後までお読みいただきありがとうございました。