OmniAICreator/Qiita-1.07M huggingface dataset:
【WordPress】条件分岐タグ チートシート

WordPressのテーマやプラグインの開発に役立つ、テンプレートの範囲指定ができる条件分岐タグをまとめました。複数の固定ページや投稿タイプを指定する方法も含めて解説しています。このチートシートを使って、特定のページやコンテンツに応じた処理を柔軟に行いましょう。

## 基本ページ判定

### `is_front_page()`
フロントページ（ホームページ）かどうかを判定します。

### `is_home()`
ブログ投稿ページ（通常の投稿リストページ）かどうかを判定します。

### `is_page($page)`
特定の固定ページかどうかを判定します。  
`$page` にはページID、スラッグ、またはタイトルを指定可能。

#### 複数ページを指定する場合
```php
if (is_page(array(42, 'about', 'Contact Us'))) {
    // ページID 42、スラッグ 'about'、またはタイトル 'Contact Us' のページの場合
}
```

### `is_single($post)`
特定の投稿ページかどうかを判定します。  
`$post` には投稿ID、スラッグ、またはタイトルを指定可能。

#### 複数の投稿を指定する場合
```php
if (is_single(array(10, 'my-post-slug', 'Another Post'))) {
    // 投稿ID 10、スラッグ 'my-post-slug'、またはタイトル 'Another Post' の投稿の場合
}
```

## アーカイブページ関連

### `is_archive()`
任意のアーカイブページかどうかを判定します（カテゴリ、タグ、著者、日付などすべてのアーカイブページに適用）。

### `is_category($category)`
特定のカテゴリアーカイブページかどうかを判定します。  
`$category` にはカテゴリID、スラッグ、または名前を指定可能。

#### 複数カテゴリを指定する場合
```php
if (is_category(array(4, 'news', 'Updates'))) {
    // カテゴリID 4、スラッグ 'news'、または名前 'Updates' のカテゴリの場合
}
```

### `is_tag($tag)`
特定のタグアーカイブページかどうかを判定します。  
`$tag` にはタグID、スラッグ、または名前を指定可能。

#### 複数タグを指定する場合
```php
if (is_tag(array(3, 'featured', 'Special Tag'))) {
    // タグID 3、スラッグ 'featured'、または名前 'Special Tag' のタグの場合
}
```

### `is_author($author)`
特定の著者アーカイブページかどうかを判定します。  
`$author` には著者ID、スラッグ、または名前を指定可能。

#### 複数著者を指定する場合
```php
if (is_author(array(1, 'admin', 'John Doe'))) {
    // 著者ID 1、スラッグ 'admin'、または名前 'John Doe' の著者ページの場合
}
```

### `is_date()`
日付ベースのアーカイブページかどうかを判定します。

### `is_year()`
年アーカイブページかどうかを判定します。

### `is_month()`
月アーカイブページかどうかを判定します。

### `is_day()`
日アーカイブページかどうかを判定します。

### `is_post_type_archive($post_type)`
特定のカスタム投稿タイプのアーカイブページかどうかを判定します。  
`$post_type` には投稿タイプのスラッグを指定可能。

#### 複数の投稿タイプを指定する場合
```php
if (is_post_type_archive(array('product', 'portfolio'))) {
    // 'product' または 'portfolio' の投稿タイプアーカイブの場合
}
```

## 特殊ページ関連

### `is_search()`
検索結果ページかどうかを判定します。

### `is_404()`
404エラーページかどうかを判定します。

### `is_attachment()`
添付ファイルページかどうかを判定します。

### `is_singular($post_types)`
単一の投稿ページか固定ページかどうかを判定します。  
`$post_types` には投稿タイプのスラッグを指定可能。

#### 複数の投稿タイプを指定する場合
```php
if (is_singular(array('post', 'page', 'product'))) {
    // 'post'、'page'、または 'product' の単一ページの場合
}
```

## カスタム分類（タクソノミー）関連

### `is_tax($taxonomy, $term)`
特定のタクソノミーやタームに属するアーカイブページかどうかを判定します。  
`$taxonomy` にはタクソノミースラッグ、`$term` にはタームスラッグまたはIDを指定可能。

#### 複数のタームを指定する場合
```php
if (is_tax('genre', array('action', 'comedy'))) {
    // 'genre' タクソノミーの 'action' または 'comedy' タームの場合
}
```

## 投稿フォーマット関連

### `has_post_format($format)`
特定の投稿フォーマットかどうかを判定します。  
`$format` にはフォーマットスラッグを指定可能（例: `aside`, `gallery` など）。

#### 複数のフォーマットを指定する場合
```php
if (has_post_format(array('aside', 'gallery'))) {
    // 'aside' または 'gallery' フォーマットの場合
}
```

## ログイン・登録関連

### `is_user_logged_in()`
現在のユーザーがログインしているかどうかを判定します。

### `is_admin()`
管理画面のいずれかのページかどうかを判定します。

## デバイス関連

### `wp_is_mobile()`
現在のページがモバイルデバイスで表示されているかどうかを判定します。

---

このチートシートを使って、特定のページやコンテンツに対して適切なテンプレートやスタイルを柔軟に適用することができます。複数の条件を指定することで、より詳細な制御が可能になりますので、ぜひ活用してください。
[vue3-jp-admin]vxe-table の力で Vue 3 プロジェクトのテーブル機能を次のレベルへ

## Vue 3 プロジェクトでの vxe-table の活用
このプロジェクトでは、[vxe-table](https://vxetable.cn/#/start/install) を使用して、Vue 3 アプリケーションのテーブル機能を強化しました。vxe-table を導入することで、データ表示や操作の機能が大幅に向上しました。

## GitHub アドレス:
https://github.com/yangrongwe/vue3-jp-admin

## デモリンク
https://wxcorer.com/components/table

## vxe-table の利点

- **高パフォーマンス**：大量のデータを扱ってもスムーズに動作します。
- **豊富な機能**：ソート、フィルタリング、ページネーションなど、多くの機能をサポートしています。
- **カスタマイズ性**：テーブルの外観や機能を高度にカスタマイズできます。
- **柔軟性**：さまざまなテーブル設定や操作に対応しています。 

## 豊富な全局配置
```javascript
import VxeTable from 'vxe-table';

import 'vxe-table/lib/style.css';

import VxeUI from 'vxe-pc-ui';
import 'vxe-pc-ui/lib/style.css';

import zhCN from 'vxe-table/lib/locale/lang/zh-CN';
import enUS from 'vxe-table/lib/locale/lang/en-US';
import jaJP from 'vxe-table/lib/locale/lang/ja-JP';

VxeTable.setConfig({
  table: {},
  grid: {
    pagerConfig: {
      pageSize: 10,
      layouts: ['PrevJump', 'Number', 'NextJump', 'Sizes', 'Total'],
    },
  },
});

const language = localStorage.getItem('app-lang') || 'ja';
switch (language) {
  case 'en':
    VxeTable.setI18n('en-US', enUS);
    VxeTable.setLanguage('en-US');
    break;
  case 'zh':
    VxeTable.setI18n('zh-CN', zhCN);
    VxeTable.setLanguage('zh-CN');
    break;
  case 'ja':
    VxeTable.setI18n('ja-JP', jaJP);
    VxeTable.setLanguage('ja-JP');
    break;
  default:
    VxeTable.setI18n('ja-JP', jaJP);
    VxeTable.setLanguage('ja-JP');
    break;
}

export { VxeTable, VxeUI };
```

## 結論

vxe-table は Vue 3 プロジェクトでのデータ表示や操作において非常に効果的なツールです。高性能で柔軟な機能を持ち、プロジェクトの品質向上に貢献しています。
kali linux 環境構築等

## 1.環境構築
https://qiita.com/gadagizi/items/5b8a9141bcfd365c5264

## 2.Error
**Unable to locate package Unable to locate package**
https://zenn.dev/sho00/articles/0172ba82d237fb

## 3.gobuster
**Usage**
gobuster モード https://example.com -w 使用するワードリスト
gobuster vhost -u https://example.com -w /path/to/wordlist.txt

**タイムアウト**
--timeout 60s

**モードの違い**
dir: サーバーのファイルやディレクトリの探索。
dns: ドメインのサブドメインの列挙。
vhost: 同じIPでの異なるホスト名の列挙。

**ワードリストの一例**
SecLists/Discovery/Web-Content/big.txt
SecLists/Discovery/Web-Content/common.txt
【AWS】Lambdaレイヤーの作成とアップロード手順

AWS Lambdaで`mysqldump`コマンドを使用するために、Lambdaレイヤーを作成し、ローカルのWindows端末にダウンロードしてからAWSコンソールでアップロードする手順を解説します。

## EC2インスタンスでのLambdaレイヤーの作成

まず、必要なライブラリを含むLambdaレイヤーをEC2インスタンス上で作成します。

### 必要なディレクトリの作成

```bash
mkdir -p lambda-layer/lib
```
### 依存ファイルの調査
mysqldumpコマンドが依存しているライブラリを調べるためには、lddコマンドを使用します。以下のように実行します。

```bash
ldd /usr/bin/mysqldump
```

実行結果には、mysqldumpが依存しているライブラリが一覧表示されます。例えば、以下のような出力が得られます。

```bash
linux-vdso.so.1 (0x00007ffe347fb000)
libssl.so.3 => /lib64/libssl.so.3 (0x00007f025a2b1000)
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007f0259e00000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f025a29d000)
libm.so.6 => /lib64/libm.so.6 (0x00007f0259d25000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f0259a00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f025a283000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0259600000)
libz.so.1 => /lib64/libz.so.1 (0x00007f025a267000)
```

### 依存ライブラリのコピー
調べた依存ライブラリをlambda-layer/lib/ディレクトリにコピーします。以下のコマンドを実行します。

```bash
cp /lib64/libssl.so.3 lambda-layer/lib/
cp /lib64/libcrypto.so.3 lambda-layer/lib/
cp /lib64/libresolv.so.2 lambda-layer/lib/
cp /lib64/libm.so.6 lambda-layer/lib/
cp /lib64/libstdc++.so.6 lambda-layer/lib/
cp /lib64/libgcc_s.so.1 lambda-layer/lib/
cp /lib64/libc.so.6 lambda-layer/lib/
cp /lib64/libz.so.1 lambda-layer/lib/
cp /lib64/ld-linux-x86-64.so.2 lambda-layer/lib/
```

### LambdaレイヤーのZIPファイルを作成
依存ファイルを含むディレクトリの準備ができたら、以下のコマンドでZIPファイルを作成します。

```bash
cd lambda-layer
zip -r ../mysqldump-layer.zip .
```

## Lambdaレイヤーのダウンロード
次に、作成したZIPファイルをローカルのWindows端末にダウンロードします。以下のscpコマンドを使用します。
※windows端末です

```
scp -i C:\\Users\\user\\Documents\\aws\\XXX.pem ec2-user@xxx.xxx.xxx.xxx:/home/ec2-user/mysqldump-layer.zip C:\\Users\\user\\Documents\\aws
```

コマンドの各部分の説明：

- -i オプションは、SSH接続に使用する秘密鍵のファイルパスを指定します。
- ec2-user@xxx.xxx.xxx.xxx は、EC2インスタンスのユーザー名とIPアドレスです。
- /home/ec2-user/mysqldump-layer.zip は、EC2インスタンス上のファイルのパスです。
- C:\\Users\\user\\Documents\\aws は、ローカル端末上のダウンロード先のパスです。

## AWSコンソールでのレイヤーのアップロード
ダウンロードしたZIPファイルをAWSコンソールにアップロードしてLambdaレイヤーとして使用します。

### アップロード手順
1. AWS Management Consoleにログインします。
2. 「Lambda」サービスに移動します。
3. 左側のメニューから「レイヤー」を選択し、「レイヤーを作成」をクリックします。
4. 「名前」フィールドにレイヤー名を入力し、「アップロード」オプションを選択して、ダウンロードしたZIPファイルを選択します。
5. 「作成」をクリックしてレイヤーを作成します。

## 結論
これで、Lambda関数でmysqldumpを使用できるようになります。
【AWS】[instance value (\"AUTO\") not found in enum] エラーの対応方法

## 概要
AWSコンソールでIAMロールを作成しようとしたところ以下のようなエラーメッセージが表示される

```
[instance value ("AUTO") not found in enum (possible values: ["DE","EN","ES","FR","IT","JA","KO","PT_BR","ZH_CN","ZH_TW"])]
```

## 原因
エラーメッセージは言語コードが予期しない値（"AUTO"）になっている際に発生します。

## 解決方法

### ソース言語とターゲット言語を正しく指定する

1. AWSコンソールのログアウト
2. ブラウザのキャッシュクリア
3. AWSコンソールに再度ログイン
4. 右上のアカウント名をクリックし、「言語設定」を選択
5. ドロップダウンメニューから明示的に言語を選択（例：「English (US)」や「日本語」）
6. 変更を保存し、ページをリロード

### プライベートブラウジングモードでAWSコンソールにアクセス

## 最後に
私の場合、恐らくChromeの翻訳プラグインが作動していたことが原因
翻訳に関連する機能をオフにするだけでも解決する可能性はあります
レッドチーム戦略で強化するサイバーセキュリティ


### 目次

1. [はじめに](#section1)
2. [レッドチームとは](#section2)
3. [レッドチーム戦略のメリット、デメリット](#section3)
4. [レッドチーム演習の実施例](#section4)
5. [レッドチーム演習後の対策](#section5)
6. [まとめ](#section6)

---

### 1. はじめに <a name="section1"></a>
皆さんはレッドチーム演習についてご存知でしょうか？
この記事では私がエンジニアとしてサイバーセキュリティを意識するきっかけとなったレッドチーム演習について、まとめてみました。

サイバーセキュリティの脅威は、年々高度化し、複雑化しています。2024年も多くのサイバー攻撃によるシステム障害が発生し多くの企業やサービスを利用する人々に影響を及ぼしました。

企業や組織にとって、サイバー攻撃への対応力を高めることは必要不可欠です。ただ、実際にどんな敵がどんな手法で、どこから攻撃を仕掛けてくるかを理解し対策することはなかなか難しいことだと思います。そこで注目されているのが「レッドチーム戦略」です。

### 2. レッドチームとは <a name="section2"></a>
レッドチームとは、サイバー攻撃者の視点に立って、組織のセキュリティ体制をテストする専門チームのことを指します。彼らは意図的にシステムの脆弱性を発見し、これを攻撃することで、防御策の実効性を評価します。この手法は、組織のセキュリティ体制を現実的かつ実践的に見直すための重要な手段となっています。
レッドチームの活動は、シミュレーションされた攻撃を通じて行われ、組織がどのように攻撃に対処できるかを検証します。

レッドチーム演習を提供するベンダーにより戦略も手法も様々です。

https://www.secureworks.jp/services/adversary-exercises

https://gmo-cybersecurity.com/service/assessment/redteam/


### 3. レッドチーム戦略のメリット、デメリット <a name="section3"></a>

レッドチーム戦略には、多くの利点がありますが、同時に考慮すべき欠点も存在します。

#### メリット

- **リアルな脅威のシミュレーション**
レッドチームは、実際の攻撃者の視点から組織のセキュリティを評価するため、理論上の対策ではなく、実際の脅威に対する防御力を測定できます。

- **防御策の強化**
発見された脆弱性に対する対策を行うことで、組織のセキュリティが強化され、将来的な攻撃に対する耐性が向上します。

- **セキュリティ意識の向上**
 レッドチームの活動を通じて、従業員のセキュリティ意識が高まり、日常的な業務におけるリスク対応能力が向上します。

#### デメリット

- **コストとリソースの負担**
レッドチームの実施には、専門的な知識や技術が必要となり、また時間とコストがかかります。特に小規模な組織にとっては、これが大きな負担となる可能性があります。

- **誤った優先順位設定のリスク**
レッドチームによって発見された脆弱性が、実際のリスクと比べて過剰に評価されることで、対策が偏る可能性があります。

- **業務への影響**
レッドチームの攻撃がリアルに行われると、業務に一時的な混乱を招く可能性があり、それが組織にとっての負担になることがあります。

### 4. レッドチーム演習の実施例 <a name="section4"></a>

ここでは、実際のレッドチーム演習の一例を紹介します。

#### A社におけるレッドチーム演習
A社では、2020年東京オリンピック開催に向けてサイバーテロ攻撃を想定したセキュリティ対策を評価するためにレッドチーム演習が実施されました。

- **演習のゴールについて**
まず最初にレッドチーム演習におけるゴールを設定します。
（マルウェア感染、管理者権限の取得、情報資産の持ち出し、物理的侵入など）

- **実施期間**
そして実施期間については、いつからいつまでの間に実施するというかたちで伝えられます。いつ起きるかは誰にも分かりません。こちらの企業では情報システム担当の職員以外の一般職員には事前通知もありませんでした。

- **結果①**
そして演習の結果、いくつかの重要な脆弱性が明らかになりました。
そのうちの一つは、職員が普段から利用するメールに添付されたデータやURLを開いたことによるマルウェア感染でした。こちらは職員へのセキュリティ教育と運用の見直しが必要となりました。

- **結果②**
そしてもう一つ、システム担当者のみ入室できる部屋への物理的侵入です。こちらは入室台帳の記入とカードキーの受け渡しまでされていたそうですが間一髪のところで職員が違和感に気づき侵入を阻止できたそうです。
相手が身近に見える分、恐怖も感じますね。

### 5. レッドチーム演習後の対策 <a name="section5"></a>

レッドチーム演習が終了した後には、以下のような対策が必要です。

#### 1. **演習結果の評価と報告**
演習後は、結果を詳細に分析し、発見された脆弱性や攻撃が成功した理由について報告書を作成します。この報告書は、経営陣やセキュリティチームに対して、今後の対策を決定するための重要な資料となります。

#### 2. **脆弱性の修正**
演習で明らかになった脆弱性に対しては、迅速に修正を行います。これは、システム設定の変更、パッチの適用、または新たなセキュリティ対策の導入などを含みます。

#### 3. **フォローアップテスト**
修正が行われた後、再度テストを実施し、脆弱性が確実に修正されたことを確認します。また、新たな脆弱性が生じていないかどうかもチェックします。

#### 4. **セキュリティ教育の強化**
演習結果を基に、社員向けのセキュリティ教育を見直し、強化します。特に、フィッシング攻撃やソーシャルエンジニアリングに対する防御策を徹底します。

### 6. まとめ <a name="section6"></a>

レッドチーム戦略は組織のサイバーセキュリティを強化するための強力な手法です。攻撃者の視点から自社のセキュリティを評価することで、現実的な脅威に対する対応力を高めることができます。特に、現代の高度化するサイバー攻撃に対しては、理論的な防御策だけではなく、実践的な防御策を確立することが求められます。
色々と書いてきましたが、この記事を通して「**守るために攻め方を知ること**」とその方法の一つにこんな演習もあるということを伝えられたら嬉しく思います。
S3をWindows エクスプローラーで使いたくてWSLでMountPoint for S3 で間接的にマウントした話


# 前提条件

- WSL2が有効で、Ubuntu ディストリビューションがインストールされていること
- AWSアカウントを持っていること
- S3バケットが作成済みであること
- AWS CLIがインストールおよび設定済みであること

# 手順
Start メニューからUbuntuを起動
IDとかパスワードを忘れたらCMDやPowerShellから
```
wsl -u root
```
# WSL Ubuntuを起動する
1. 必要なパッケージをインストールする
   ```
   sudo apt update
   sudo apt install -y fuse libfuse2
   ```
2. Mountpoint for S3をダウンロードしインストールする
   ```
   curl -O https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.deb
   sudo dpkg -i mount-s3.deb
   ```
   
3. マウントポイントディレクトリを作成する
   ```
   sudo mkdir /mnt/s3
   ```

4. S3バケットをマウントする
   ```
   sudo mount-s3 your-bucket-name /mnt/s3
   ```
   your-bucket-nameを実際のS3バケット名に置き換えてください。
   マウントが成功したか確認する
   ```
   ls /mnt/s3
   ```
   こける場合は認証情報が登録されていないので登録
   ```
   sudo aws configure
   ```
   複数のプロファイルを使い分けたい場合は
   ```
   aws configure --profile your-profile-name
   ```
   プロファイルを別名で作った場合はマウントする際もプロファイルを指定する。
   ```
   sudo mount-s3 your-bucket-name /mnt/s3 --profile your-profile-name
   ```
（オプション）自動マウントの設定
/etc/fstabに対応していないので、サービスを作る。
参考：[mountpoint-s3/doc/CONFIGURATION.md]( https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#aws-credentials "mountpoint-s3/doc
/CONFIGURATION.md")
```
[Unit]
Description=Mountpoint for Amazon S3 mount
Wants=network.target
AssertPathIsDirectory=/home/ec2-user/s3-bucket-mount

[Service]
Type=forking
User=ec2-user
Group=ec2-user
ExecStart=/usr/bin/mount-s3 DOC-EXAMPLE-BUCKET /home/ec2-user/s3-bucket-mount
ExecStop=/usr/bin/fusermount -u /home/ec2-user/s3-bucket-mount

[Install]
WantedBy=remote-fs.target
```

これでWindows側からエクスプローラーで確認操作が可能になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2193969/ee904a6c-54a5-41f7-902f-3f0a3f0ea3cb.png)

awsやmount-s3がローカルPC側の環境に引っ張られる場合はPATHからWindowsの環境を外しましょう。
参考記事：[WSL2でWindowsのPATH設定が引き継がれるのを解除する](https://zenn.dev/o2z/articles/zenn-20210524-01)
FlutterとFirebaseの紐付け

## コンソールでFlutterプロジェクトの作成
```
flutter create --org com.your.orgname my_app_name
```

ディレクトリができるので、Android StudioでOPENする。
Android Studioでコンソールを開き
```
flutterfire configure
```
を実行。


Which Android application id (or package name) do you want to use for this configuration, e.g. 'com.example.app'?

と出た場合は下記の投稿を参考に確認し
パッケージ名を追記して再度実行するとできました。

https://qiita.com/osamu1203/items/6adfab47e562f5e7d03b

Android Studioの右側libに
Firebase_options.dartが追加されました！！


## Firebase を初期化する

firebase_coreがない場合追加
```
flutter pub add firebase_core
```
Flutter アプリの Firebase 構成を最新にします。
```
flutterfire configure
```


## 初期化処理　
1.mian.Dartを編集
```
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
```
WidgetsFlutterBinding.ensureInitialized();
runApp()の前にプラグインの初期化を行う場合初めに行う処理。最初に初期化することを保証することをFlutterに通知する。

2.マークが出るのでクリックして、Firebasecoreをインポート

3.再度ビルド
```
flutter run
```

## 参考記事

https://firebase.google.com/docs/flutter/setup?hl=ja&platform=ios

https://qiita.com/mamoru_takami/items/87a20d861806a70db29d
AWS CloudWatch Logs Insights（ログのインサイト）の料金について

## 概要

AWSのCloudWatchのログのインサイトの料金について簡単にまとめておく。

## 公式ドキュメントと情報

料金についてはこちらに記載されている↓

https://aws.amazon.com/jp/cloudwatch/pricing/

![CleanShot 2024-08-15 at 17.12.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c67be9a9-1180-de31-dac6-868943824871.jpeg)

2024年8月15日現在「スキャンしたデータ 1 GB あたり USD 0.0076」らしい。

おそらくログのインサイトのクエリ対象範囲が大きければ大きいほど料金が上がる。なのである程度範囲を絞ってクエリを走らせたほうが良さそう。
さらに、「クエリ範囲」は期間ではなくデータ容量なので「1日に1件しか出力されないログ」なら1ヶ月とかの期間でも全然大丈夫だが、「1時間に1万件出力されるログ」だと厳密に範囲を指定しないと意図しない料金が発生する可能性がある。

だが「スキャンしたデータ 1 GB あたり USD 0.0076」なので、料金にビクビクしながら使う必要はなく「何をしたらお金がかかるのか」を念頭においておけば良いと思う。
パフォーマンステスト【JMeterでの負荷がけ & Seleniumでのレスポンスタイム計測】

パフォーマンステスト及び負荷テストにおける【同時アクセス再現（=負荷がけ） & レスポンスタイム計測】について、筆者がシステム開発において構築した仕組みをご紹介させていただきます。

# 概要
筆者が参画したプロジェクトでは、業務上の重要機能を対象に、以下2つの状態でレスポンスタイムを計測しました。
1. 無風状態(システムへのアクセスが無い状態)
2. 業務上想定される最大の同時アクセスが発生した状態

上記を計測するため以下の図のような構成でパフォーマンステストを実施しました。
実際にはバッチ処理(日中・夜間)の計測なども実施していますが、今回は画面からのオンライン処理計測についてご紹介させていただきます。
![JMeter&Python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793724/d40cd15a-767b-b065-0482-3527423b271f.png)

ポイントは大きく2つ。
1. JMeterを利用した同時アクセスによる負荷がけの再現
2. Seleniumを利用した画面操作のレスポンスタイム取得
です。

# JMeterでの負荷がけ
JMeterで再現したシナリオを図で示します。
システムが主に管理するデータを対象に、CRUD処理を繰り返すシナリオを定義しました。
※CRUD = Create,Read,Update,Deleteの基本処理

![JMeterで再現したシナリオ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793724/7b2274a0-ccb5-4f5d-7491-affa59386917.png)

JMeterの詳細な定義方法については別の記事でご紹介できればと思いますので、今回はポイントを絞って記載します。
1. システム利用ユーザの定番操作（頻度の高い操作パターン）を再現すること
  ・システムのユースケースを把握した上で、利用ユーザのメインフローを再現することが重要です。
  本番運用後のリアルな負荷を再現することで、より有効なシステム品質向上に繋がります。
  ・（極端な話、めったに使われない機能を対象に負荷がけしても意味のある品質向上にはならないと思います。）
2. UIからの操作をリアルに再現すること。
  ・例：JMeterには"定数タイマ"という機能があり、各リクエストの間に一定時間設けることができます。
  ・実際のユーザ操作では画面表示されてから次の操作に移るまで一定時間がかかる（画面を見たり、考え事をしたり）ので、設定が必要な項目だと思います。
  ・※詳しくは、JMeterのユーザマニュアルを参照してみてください。
    https://jmeter.apache.org/usermanual/component_reference.html#Constant_Timer
3. 同時アクセス処理の起動間隔を空ける
  ・上図の各操作のことをJMeterでは"Thread"と言います。
  ・Threadの数で同時アクセスユーザ数を再現するのですが、"Ramp-Up期間"という値を一緒に指定することで、その期間内で指定のThread数を立ち上げることになります。
  ・以下の設定では300秒で100 Thread、つまり3秒毎に新しいThreadを立ち上げることになります。
![JMeterの設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793724/a39dd6ab-fd67-1a0b-3379-a8f6ce5cb7dc.png)


# Seleniumでのレスポンスタイム計測
Seleniumはブラウザ操作を自動化するためのツールです。
ボタン押下、入力欄へのデータ投入、ブラウザ更新など画面上で可能な操作は一通り再現可能です。
本記事では、オンライン処理のレスポンスタイム計測に絞って定義内容を紹介させていただきます。
以下、対象機能計測するために記載したPythonのコードです。
```responseTimeCheck.py
# 検索画面を表示
driver.find_element(By.ID,"StoreVolume").click()
# 検索ボタンを押下
driver.find_element(By.ID,"searchAll").click()
# 検索処理のレスポンスを変数に代入
StoreSearchResponseTime = driver.execute_script( 
   "return (window.performance.timing.loadEventEnd - window.performance.timing.requestStart) / 1000" 
    ); 
# 検索レスポンスをログファイルに書き出し
filename = 'searchResponseLog.txt'
with open(filename, 'a') as f:
    print("time for searching store ：", file=f)
    print(StoreSearchResponseTime, file=f)
```

コメントを含む最初の4行は、計測対象の機能を再現するための記述です。
5行目で処理のレスポンスタイムを計測しています。
※参考：以下サイトにて"execute_script"で検索してみてください。
https://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions

Seleniumでは「execute_script(script, *args)」を利用してJavaScriptを実行することができます。
上記コードでは、JavaScriptを利用して【リクエスト日時 & 画面ロード完了日時】を取得し、【画面ロード完了日時 ー リクエスト日時】で処理時間を算出しています。

※参考：【リクエスト日時 & 画面ロード完了日時】の取得については以下を参考にしてみてください。
+ window.performance.timing.loadEventEnd
https://developer.mozilla.org/ja/docs/Web/API/PerformanceNavigationTiming/loadEventEnd
+ window.performance.timing.requestStart
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceTiming/requestStart
Paiza×Qiitaキャンペーン Javaで解説してみた【D 足し算 編】

# はじめに
学習する為に使用したJavaの教科書によっては難易度が変わるかもしれません。

# 問題へのリンク

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/addition

# 解答コード
<details>

~~~

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		final int A = scanner.nextInt();
		final int B = scanner.nextInt();

		System.out.println(A + B);
		scanner.close();
	}
}

~~~

</details>

# 解説

<details>

1行空白区切りで入力値を受け取るので、scanner.nextLine()しか知らない場合には少し難易度が上がります。
文字列を分割する方向で考えるのではなく、scanner.nextInt()を覚えましょう。
nextInt()は改行だけではなく、空白も入力値の区切りとして認識します。
nextLine()だと"1 1"(入力例1の場合)という文字列を取得してしまいますが、nextInt()だと1つずつintで取得できます。nextLine()は改行文字のみを区切りとして認識します。他の問題で文字列を取得する際も、空白文字も区切り文字として認識できるnext()を使った方がいいかもしれません。

### おまけ
nextLine()とnextInt()を混用するのはなるべく避けましょう。nextInt()は仕様上、intの取得後改行文字を残すため、nextInt()の後にnextLine()を使用すると空文字のみを取得してしまう可能性があります。
nextLine()を使う場合、全てをnextLine()に統一することをお勧めします。
もしくは、paizaで文字列を取得する際は、空白文字を取得する必要がある場合を除いてnext()を使用しましょう。
どうしても混用させたい場合は、改行文字が残っている場所でnextLine()を二回使用し、後者の値のみを使用すると良いでしょう。

</details>
Reactでアプリを作ってみた

## はじめに
今回は【React】を使って学習記録アプリを作成してみたので、その感想を共有します！

![React_学習記録アプリ_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3851095/a84875a2-c6cb-49b2-a946-e8166a208110.png)

## 開発環境

⚫︎OS
　・Mac

⚫︎エディター
　・VSCode

⚫︎使用技術
　・フロントエンドフレームワーク: React
　・ビルドツール: Vite

## つまずいたところ
今回の開発で、特に苦労した点が２点ありました。

1\. State内の配列を更新する方法。
　今までは、単一のテキストボックスを使ったシンプルな一覧表示の方法しか学習していませんでした。
しかし、今回は「学習内容」と「学習時間」という２つの要素を１つの配列として扱い、登録ボタンを押した時に一覧表示する必要がありました。

複数のプロパティを持つオブジェクトの設定方法や、配列の更新方法にかなり苦労しました。
 
![React_学習記録アプリ_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3851095/8d353641-493f-fde9-898b-ba433993ccf5.png)

2\. 未入力項目がある状態で、登録しようとした時のエラーメッセージ表示

　「学習内容」と「学習時間」の両方に値が入力されていないと登録できないようにし、「入力されていない項目があります」というエラーメッセージを表示する処理に苦労しました。
 
![React_学習記録アプリ_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3851095/b06a697b-e447-e023-bed0-6d57fffc5bc7.png)


## 解決方法
1\. 複数のプロパティ設定方法と、配列の更新

　「学習内容」のプロパティ名をtitle、「学習時間」のプロパティ名をtimeとして、それぞれ以下の方法で解決することができました。

```react
// 学習内容
const [inputLearningContext, setInputLearningContext] = useState('');
// 学習時間
const [inputTime, setInputTime] = useState('');

// 登録ボタン押下時の処理
const onClickAdd = () => {
  // 新しいレコードを作成（複数プロパティの設定）
  const newRecord = { title: inputLearningContext, time: parseInt(inputTime) };
  // 配列の更新
  setRecords([...records, newRecord]);
  ...
};
```
2\. エラーメッセージの出力制御

　こちらは文字数をカウントして制御する方法を思いつきました。
 
```react
const onClickAdd = () => {
  // 入力が不足している場合
  if (inputLearningContext.length < 1 || inputTime <= 0) {
    // エラーメッセージを表示
    setError(true);  
    return;
  }
  ...
};

return (
  <>
    ...
    {error && <p style={{ color: 'red' }}>入力されていない項目があります</p>}
    ...
  </>
)
```
 しかし、こちらの記述方法の方がスマートでした。
```react
// 入力が不足している場合
if (!inputLearningContext || !inputTime) {
  setError(true);
  return;
}
```
上記の方法でエラーメッセージを簡潔に制御できました！

## 最後に
　まだ見た目はシンプルなアプリですが、Stateの理解が浅いため、思ったより時間がかかりました。
これからもインプットだけで終わらせず、実際に手を動かすことで理解を深め、より高度なアプリケーション開発に挑戦していきたいです！
 
# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからお願いします👇

https://projisou.jp
クエリパラメータを取得した後、URL上から消す方法

# 概要
JavaScriptにて、クエリパラメータを取得した後に、URL上（アドレスバー上）から見えなくする方法になります。

# 方法
**1.クエリパラメータを取得**
```js:qiita.js
const urlParams = new URLSearchParams(window.location.search);
const param = urlParams.get('<クエリパラメータのキー>');
```
:::note infoURL
ただ取得しただけでは、ページ更新した際に消えてしまいます。
保存したいならセッションに入れるなどしてください。
:::
　　
**2.履歴を置き換える**
```js:qiita.js
history.replaceState(null, null, '<クエリパラメータがついていないURL>');
```


# 実際の動作
以下のコードを動かしてみます。
```js:qiita.js
const urlParams = new URLSearchParams(window.location.search);
const param = urlParams.get('key');
history.replaceState(null, null, 'file:///C:/test/test.html');

console.log(param);
```
まず最初に開いた段階ではparamはnullになっています。
![スクリーンショット 2024-08-15 172233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/0d9602c7-96d5-764a-236c-15324b4b1433.png)

URLにクエリパラメータをつけてみると、
![スクリーンショット 2024-08-15 172857.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/c8432e66-d760-f60c-8081-6ad3d077481a.png)


このように、パラメータの取得はできていますが、URL上では消えます。
![スクリーンショット 2024-08-15 172310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/e01965af-75ce-f927-c01f-02bba4a436f2.png)


以上になります。
今年中に求人に応募することを目安に

徐々に就職への道が見えてきました。
アカウント登録、ログイン、ブログ機能を一通り実装したら会社へ応募してみようと思います。

いままでCSSでデザインするのが楽しくてLaravelを構うことを怠けていたので、ここでまた気合を入れてLaravel勉強です。
現在、以前学んでいた教材と再び睨めっこしながらのアカウント登録機能をつくっています。
今度は教材通りに進めば良いわけではなく、自分のサイトに沿った作りにしなくてはいけないためちょっと混乱しています。

ただ現在これらの機能より最も実装したい機能がひとつありまして、「ログインページを運営のみアクセスできるようにする機能」です。
IPを照らし合わせて許可されたIPと完全一致ならアクセス、不一致ならホーム画面にリダイレクトされます。
（俺だけ登録してログインできたらそれで良いので、念の為ログインページリンクを公開したくない）

これ、ローカルでは単純なIPで正常に実装できたのですが、ロードバランサーやらセキュリティグループが絡んでくるAWSとなると単純にIP許可配列へIPを追加するだけではダメなようです。
そこらへんのプログラムがいまいちわからず、とりあえず一旦放置…。
アカウント登録とログイン機能が実装できたら再度挑戦してみようと思います。

ちなみにブログ機能が完成したらQiitaをどうしようか悩み中…。
現在Qiitaはブログとしても、プログラミング共有としても使っていますが、きっとブログは自分のサイトのブログに移行してプログラミング共有はQiitaのままにすると思います。

そろそろ終わらないと筋トレの時間がなくなります。ノシ
Databricksのダッシュボードでクロスフィルタリングがサポートされました

見逃してました。

https://docs.databricks.com/ja/dashboards/index.html#cross-filtering

**クロスフィルタリング**
> クロスフィルタリングにより、ユーザーは複数の視覚化にわたる関係性とパターンをインタラクティブに探索し、1 つのメトリックが他のメトリックにどのように影響するかを理解できます。 ダッシュボード閲覧者が 1 つのグラフ内の要素をクリックすると、同じデータセットに基づく他のすべてのグラフがその値で自動的にフィルタリングされます。

ダッシュボードのビジュアライゼーションである要素を選択すると、それと連動して他のビジュアライゼーションもフィルタリングされる機能です。

![](https://docs.databricks.com/ja/_images/cross-filter.gif)

対象は以下のビジュアライゼーションです。作成するだけで特に設定は不要です。

- 棒
- ヒートマップ
- 円グラフ
- 散布図

以下のように作成してみます。そして、どれかの都道府県をクリックすると…。
![Screenshot 2024-08-15 at 17.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a0a49d3b-6908-4589-af58-50a0569ec734.png)

クリックした都道府県のみのデータが表示されます。
![Screenshot 2024-08-15 at 17.32.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f1842dd1-7900-d71f-e98d-52a27729ff35.png)
![Screenshot 2024-08-15 at 17.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d2c6b36b-d99d-6100-5cbe-1184883ac88a.png)

特定のデータにのみフォーカスしたい際に便利な機能です。是非ご活用ください。

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
AWS ファイルストレージサービスまとめ（SAA-C03）

# AWS ファイルストレージサービスまとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950120/b7ffee27-994a-936e-923a-30796810c6e5.png)


# プロトコルの基本
引用：https://aws.amazon.com/jp/blogs/news/choose-filestorageservice/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950120/0f564154-1db1-2f4b-06f7-0283bbf3da31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950120/8c4fc278-fc36-170a-619c-6aea8e62b1f7.png)



# プロトコル
ファイル転送プロトコルとしては
NFS,SMB（Windowsファイルサーバー用）に対応

他プロトコルとしては
iSCSI,Lustreの独自プロトコルに対応

|プロトコル|EFS|FSx for<br/>Open ZFS|FSx for<br/>Windows File Server|FSx for<br/>NetApp ONTAP|FSx for<br/>Lustre|
|---|---|---|---|---|---|
|NFS|◯|◯||◯||
|SMB|||◯|◯||
|iSCSI||||◯||
|独自|||||◯|

※SFTP,FTPS,FTPなどのプロトコルを用いたレガシーアプリケーションについてはオンプレミスからAWS Transfer Familyを使用して、S3,EFSを使用できる

https://qiita.com/ouerika/items/fe1296b6830379463a8b#aws-transfer-family

## Amazon Elastic File System（EFS）
NFSプロトコルを使用
LinuxインスタンスおよびLinuxベースのApp用に高い拡張性、復元力の分散ストレージが必要な時に使用


- ライフサイクルポリシーにより使用頻度の低いファイルを低コストストレージに移動可能
- データはAZで分散して冗長的（1 ゾーンストレージクラスの場合は1 AZ内）に保存
- S3と同じイレブン９の耐久性
- 数万の同時NFS接続をサポート可能
- ペタバイトまで拡張可能
- 読み取り後書き込みの一貫性

## Amazon FSx for OpenZFS
NFSプロトコルを使用
オープンソースで人気の高い高性能な OpenZFS をフルマネージドで提供

## Amazon FSx for Windows File Server

SMBプロトコルを使用
Windows Server(OS)上に構築されたファイルシステムを提供
SharePoint、Microsoft SQL Server、ワークスペース、IIS Web サーバー、またはその他のネイティブMicrosoft アプリケーションなどの<font color=Peru>Windowsベースのアプリケーション用に一元化されたストレージ</font>が必要な場合に使用

- EC2 Windowsインスタンスや、オンプレミスのWindows系OSがインストールされたクライアントなどからマウント
- オンプレミスのAD（Active Directory）サーバーと連携可能
    - 既存のADにおけるユーザーやアクセス権の管理を踏襲して同等のアクセス制御を実現できる

![スクリーンショット 2024-08-15 17.09.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950120/078fc29e-0843-6d4b-0ef6-6515e11db8e2.png)


引用：https://aws.amazon.com/jp/blogs/news/choose-filestorageservice/

## Amazon FSx for NetApp ONTAP
NFS、SMBまたはiSCSIプロトコルを使用
NetAppの人気のあるONTAPファイルシステム上に構築されたファイルストレージをフルマネージドで提供

ファイル共有、アプリケーションストレージ、データ保護とレプリケーション、データ移行などの<font color=Peru>異なるプロトコルを使用するアプリケーションが同一ファイルシステムのデータへアクセスする</font>必要がある場合に使用

- SMBでアクセスする場合、FSx for NetApp ONTAP側とAindowsインスタンス側いずれもADに参加する必要がある
- 同じデータに対するマルチプロトコルアクセス（NFSとSMBの同時アクセス）が可能
- NetApp ONTAP が持つ様々な機能（Snapshot や SnapMirror、SnapVault、FlexCache、FlexClone、重複排除など）を利用可能


## Amazon FSx for Lustre
独自のプロトコルを使用
高速、大容量の分散ストレージで、ハイパフォーマンスコンピューティング (HPC)、財務モデリングなどを行うアプリケーション向け

- データを S3 に直接保存できる
Workato：Workbot for Microsoft Teamsで、外部URLを参照することなくアダプティブカードに画像を添付してMicrosoft Teamsへメッセージ送信する方法

# はじめに

Workbot for Microsoft Teamsでは、アダプティブカードに画像を添付した状態で、Teamsの特定のチャネルやユーザーへメッセージを送信することができます。

※画像は[いらすとや](https://www.irasutoya.com/2021/04/blog-post_24.html)より拝借

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/86ddf05a-ece7-d4f5-8828-207c5ba43269.png)


これに対応するWorkatoのレシピ側のインターフェースは次の通りとなっており、Image URLに画像のURLをセットすることで、指定されたURLの画像を表示することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d44b3bec-a8cd-93e3-ff2d-ef5ead8f01f7.png)

なお、Image URLには画像のリンクだけでなく、Base64エンコードされた値をセットすることも可能です。Base64エンコードされた値をセットすることで、画像を管理するサーバ（公開サーバ）を用意することなくアダプティブカードへ画像を添付することが可能です。

# 手順

次のようなレシピの作成を進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0cd8d5ca-b950-2459-cffc-7b25bf37ecde.png)


## Step1

運用に合わせたトリガーを指定します。

## Step2

お使いのオンラインストレージに対応したコネクタならびにアクションを選択のうえ、Teamsに添付したい画像ファイルを指定します。

サンプルではFile tools by Workatoを利用してパブリックなURLからファイルをダウンロードを行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/64d258ee-f3fe-a0f0-8244-09d480e8674c.png)

なお、Lookup Tablesをストレージとして利用したい場合は、以下の記事を参考としてください。

https://qiita.com/tabimoba/items/2bcfd4716dcd3fcd33ec

## Step 3

`encode_base64` 関数を用いて、Step2でダウンロードしたファイルをBase64エンコードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/fb4277cc-481f-78e9-e9dc-10b733886897.png)

## Step 4

Image URLの先頭に `data:image/png;base64,` を追加のうえ、後続にStep3のBase64エンコードした結果（データピル）を、前の値に連結する形で追加します。

なお、`image/png`は、表示する画像の種類（[MIMEタイプ](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)）に合わせて、適宜変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d70b65c6-bae6-af1e-de62-00581e20eb8c.png)
カラーマップ数値化

##本の内容

'''
cm_name = 'jet'
cm = plt.get_cmap(cm_name)
print(type(cm))

print(cm.N) # 256
print(cm(0))

for i in range(256):
    print(cm(i))

temp_cm = np.array(cm)

X, Y = np.meshgrid(np.linspace(0, 1, 100), np.linspace(0, 1, 100))
z = np.sin(2 * np.pi * X) * np.cos(2 * np.pi * Y)

# カラーマップを選択
cmap = plt.get_cmap('jet')

# 正規化
norm = plt.Normalize(vmin=z.min(), vmax=z.max())

# 逆マッピング
color_value = cmap(norm(0.7))  # 0.7に対応する色を取得

print(f"色から取り出した値: {norm.inverse(color_value)}")


'''
Paiza×Qiitaキャンペーン Javaで解説してみた【D 一番小さい値編】

# はじめに
D Rankの問題をただ解くだけだと初心者専用記事になってしまうので、通常の解法とは別に、Stream APIも使って解いてみました。

# 問題へのリンク
https://paiza.jp/works/mondai/d_rank_skillcheck_sample/min_num

# 解答コード

<details><summary>通常</summary>

~~~
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		final int NUMBER_OF_INPUTS = 5;
		int min = Integer.MAX_VALUE;

		for (int i = 0; i < NUMBER_OF_INPUTS; i++) {
			int input = scanner.nextInt();
			min = Math.min(min, input);
		}

		System.out.println(min);
		scanner.close();
	}
}

~~~

</details>

<details><summary>Stream API使用</summary>

~~~

import java.util.Scanner;
import java.util.stream.IntStream;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
        int min = IntStream.range(0, 5)
                                .map(i -> scanner.nextInt())
                                .min()
                                .orElseThrow();

		System.out.println(min);
		scanner.close();
	}
}

~~~

</details>

# 解説

<details><summary>通常</summary>

最小値を求める場合、**min**の初期値をどうすればいいかがポイントです。
**Integer.MAX_VALUE**はintで表現できる最大値を呼び出します。ただ、入力の範囲が1以上100以下の為、100以上であればどんな値でも構いません。A Rank以上だと、入力範囲を見落とすと失敗することがあるので、早めに入力範囲を見る癖をつけておくことをお勧めします。
100未満の値を初期値として設定してしまうと入力値が全て100の場合**min**が更新されずに失敗します。
値の更新はMath.minメソッドを使うと可読性も上がりますのでお勧めです。引数のうち、小さい値を返してくれます。なるべくライブラリに登録されているメソッドを使う癖をつけておくと、今後Python等のライブラリが最適化されている言語を学ぶ際に少し有利です。

</details>

<details><summary>Stream API使用</summary>

Stream APIはJava Goldで頻出です。
動きを簡単に説明すると
0 ~ 4の範囲でIntStreamを生成
⇒各要素をscanner.nextInt()で更新
⇒最小値を取得(戻り値がOptionalIntなので注意)
⇒OptionalIntからintを取り出す。(検索結果無しの場合例外)

OptionalIntはintの値、もしくは**検索結果無し**という結果を内包するコンテナクラスです。
ですのでOptional<Integer>と全く異なる為、Optionalと継承関係ではありません。
intはnullがあり得ない型ですので認識を間違えないようにしましょう。

getAsInt()でもintを取り出せます。orElseThrow()よりも検索結果が**必ず存在している**というニュアンスが濃くなりますので、今回のケースだとこちらのメソッドでもいいでしょう。
OptionalIntの通常の運用だと、**検索結果無し**という状況が起こりうるのでorElseThrow()を使用して、より例外を意識させます。

</details>
Amazon Route 53について勉強してみた

## 前提
- [SAA-C03](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)の資格取得勉強中
- 普段の業務ではLambdaを使ってサーバーレスアプリケーションを開発
- SAA受験に向けて、Route 53について勉強したのでまとめてみる
- 前回のVPCについての学習記事は[こちら](https://qiita.com/ryotabaske13/items/6162945346d534d9b2ce)

## Route 53とは
> Amazon Route 53 は、可用性が高くスケーラブルなドメインネームシステム (DNS) ウェブサービスです。
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/Welcome.html
### そもそもDNSサービス(DNSサーバー)とは？
> DNSサーバーとは、ドメイン名とIPアドレスを変換する仕組みを提供するサーバーです。
https://www.ntt.com/bizon/glossary/e-d/dns-server.html

- つまり、Route 53とは **「インターネット上のドメイン名とIPアドレスを変換したり、管理したりするAWSのサービス」** ということになる。

## Route 53でできること
### 1. ドメイン名の登録
- 作成するウェブサイトに対して、`hogehoge.com`のようなドメイン名を登録することができる。
- つまり、ウェブサイトに独自の名前をつけることができるイメージ。

### 2. インターネットトラフィックのルーティング
- 1で作成したドメイン名にアクセスした際に、どのWebサイトを開くか、ウェブアプリケーションを開くかなどトラフィックを制御できる。

### 3. ヘルスチェック
- 2でルーティングしたウェブサーバーやアプリケーションなどのリソースが正常かどうかをチェックすることができる。
- 異常なリソースにアクセスしないように、トラフィックを制御することが可能になる。
- CloudWatchやSNSといった他のAWSサービスと組み合わせることで、異常な場合に通知を送信するなどの設定が可能。

## 関連する機能
### DNSレコード
- 特定のドメインのトラフィックをどのようにルーティングするかの情報を保持している。
- Route 53では複数のレコードをサポートしている。詳細は、[こちら](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/ResourceRecordTypes.html)を確認。

### ホストゾーン
- レコードを管理するコンテナ。
#### パブリックホストゾーン
- インターネットでトラフィックをどのようにルーティングするかを指定するレコードが含まれる。
#### プライベートホストゾーン
- Amazon VPCでトラフィックをどのようにルーティングするかを指定するレコードが含まれる。
### DNSルーティング
- あるドメインに対して、どのIPアドレスにアクセスするかのルーティングを設定する。
- ルーティングポリシーが複数存在する(詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-policy.html))
#### シンプルルーティング
- デフォルトで設定されているルーティング
- あるドメインで特定の機能を実行する単一のリソースがある場合に使用する(例えば、`hogehoge.com`を構成する1つのwebサーバーなど)
- プライベートホストゾーンにレコードを作成するために使用する

#### フェイルオーバールーティング
- 利用可能なリソースに対してルーティングする
- ヘルスチェックで異常なリソースが検知された場合、別の利用可能なリソースにルーティングする。
- これにより、フェイルオーバーを構成でき、耐障害性を考慮した構成にできる。

#### 位置情報ルーティング
- ユーザーの位置に基づいてルーティングする
- 例えば、日本からのアクセスはこのルーティング、イギリスからのアクセスはこのルーティングというように設定できる。

#### 地理的近接性ルーティング
- リソースの場所に基づいてルーティングする。ユーザーに最も近いリソースにルーティングする。
- 位置情報ルーティング→ルーティングするリソースを指定する
- 地理的近接性ルーティング→最も近いリソースにルーティングする

#### レイテンシールーティング
- 最もレイテンシーが低いリソースにルーティングする

#### IPベースのルーティング
- 送信元のIPアドレスがわかっている場合に、そのアドレスに基づいてルーティングするリソースを決定する。

#### 複数値回答ルーティング
- ランダムに選ばれた最大8つの正常なレコードを使用して、複数のリソースに対してルーティングする。
- ロードバランシングを向上させることができる
- つまり、ELBと同じような機能を発揮する（正確には代替はできない)

#### 加重ルーティング
- 指定した比率でリソースに対してルーティングする
- 例えば、Aというリソースは70%, Bというリソースは30%の重みを設定したらその比率に従ってルーティングする。

## 参考
- https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/Welcome.html
シンボリックリンクを利用してBoxフォルダのパスを変更する方法

## はじめに

Box Driveを使用していると、特定のフォルダパスを短くしたい、あるいはより簡単な場所に移動したいと感じることがあります。特に、他のアプリケーションからのアクセスがしやすくなるように、フォルダのパスをカスタマイズしたい場合に便利です。今回は、Windowsでシンボリックリンクを利用して、Boxフォルダのパスをカスタマイズする方法をご紹介します。

## 手順

### 1. コマンドプロンプトを管理者として開く

まず、コマンドプロンプトを管理者権限で開きます。以下の手順で行います。

- スタートメニューで「cmd」と検索
- 「コマンドプロンプト」を右クリックし、「管理者として実行」を選択

### 2. シンボリックリンクを作成する

次に、以下のコマンドを入力して、シンボリックリンクを作成します。このシンボリックリンクを使うと、元のフォルダと新しいフォルダの間で同じ場所にアクセスできます。

```bash
mklink /D C:\Box C:\Users\元のBoxフォルダのパス\Box
```

- `C:\Box` は新しいフォルダパスです。
- `C:\Users\元のBoxフォルダのパス\Box` は元のBoxフォルダのパスです。

このコマンドを実行することで、`C:\Box` にアクセスすると、自動的に `C:\Users\元のBoxフォルダのパス\Box` の内容が表示されるようになります。


## 終わりに

この方法を使えば、Box Driveのフォルダパスを柔軟に管理でき、作業効率が向上します。ぜひ、試してみてください。
NewRelicの画面を共有するときのURLの使い分け

　New Relicを使っているとよく確認する画面や今見ている画面をメンバーに共有したいとケースが多いと思います。今回はURLを使って今見ている New Relic の画面を共有する2つの方法と取得したURLの動作の違いを紹介します。

# 今回のポイント
この記事で紹介しているポイントは、次の２つです。
1. **URLを取得・共有する方法を知る**
 画面を共有するためのURLを取得する2つの方法を紹介します。
2. **2つの方法で取得したURLの動作の違いがわかる**
 動作の違いを知ってどういうケースで利用すると良いかを紹介します。

:::note info
最新のアップデートの詳細はこちら
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

# 画面のリンクを共有する方法
New Relic で今見ている画面のリンクを共有する方法を紹介します。
## アドレスバーに表示されたURLを共有する
　1つ目は、単純にアドレスバーに表示されたURLをそのまま共有するという方法です。この方法は説明する必要がないほど一般的な方法なので誰でもできるというメリットがあります。一方で取得したURLが長すぎるというデメリットもあります。
　New Relic の画面もこの方法で取得したURLから画面を再表示することが可能です。なのでよく使う画面をブックマークしておくと目的の画面に最短ルートでアクセスすることができます。
## パーマリンクを共有する
　2つ目は、New Relic が提供しているパーマリンクの機能で短縮URLを取得する方法です。この機能は画面右上にある鎖のアイコンをクリックするだけで今見ているまさにその画面の短縮URLをコピーすることができます。このリンクをチーム内で共有するだけで同じ画面を参照できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/d4a6e374-9d0f-2567-4235-ef1598528cb6.png)


パーマリンクの活用については下記のブログでも紹介されています。

https://newrelic.com/jp/blog/how-to-relic/using-permalinks

# 取得したURLの動作の違い
　URLを取得する方法を2つ紹介しましたが、実はこの2つには動作に違いがあります。それは、タイムピッカーに設定された時間の範囲です。
 
### アドレスバーに表示されたURL:
タイムピッカーで設定された表示時刻からの相対時間も引き継ぐ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/5c529127-3f8d-e9b8-e2f7-3099a0e4556c.png)

### パーマリンクで取得したURL:
パーマリンクを取得した際に表示していた絶対時間を引き継ぐ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/653eb772-6fef-e4f4-134b-36fe8de34225.png)

　この違いがあるため、**定期的に確認する画面**のリンクは**アドレスバーに表示されたURL**を使用して、障害発生時に**同じ画面を共有する必要がある**時は**パーマリンクで取得したURL**を使用するという使い分けが必要になります。

# 終わりに
　New Relicの画面を共有する際には、状況に応じて適切なURL取得方法を選ぶことが重要です。定期的な監視に適したリンクをブックマークすることで効率的に作業が進められ、また障害対応時には確実に同じ画面を共有できることで、チーム全体の対応力が向上します。これらの方法を活用して、よりスムーズなチームコラボレーションを実現しましょう。

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
VSCode で Git リポジトリが表示されない場合の対処


## リポジトリが表示されない

VSCode で Git 管理されているフォルダやファイルを開いているのに、ソース管理タブでリポジトリが表示されず時間を使ってしまったのでメモを残します。

以下の例では `qiita-contents` フォルダを開いているのに、ソース管理タブに表示されていません。

![explorer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/d29dd7cd-f7c3-5583-c176-18bca8e2539d.png)
![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/a1b28796-d13f-9e9d-41f1-eb3b702661a6.png)

## 対処方法

`Ctrl + Shift + P` でコマンドパレットを呼び出し、`Reopen Closed Repositories` を選択すれば OK です。

![reopen1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/bac38d00-56b6-ce43-87ec-d7e1f26b9116.png)
![reopen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/6fbc2e4d-5a51-a869-40d1-ed3740f1c252.png)

## コメント

VSCode が Git のリポジトリを認識しないと思っていましたが、どうやら邪魔になったとき「リポジトリを閉じる」をクリックしてしまったようです。
Apexの同期と非同期処理2：データの整合性

非同期処理がデータの整合性に与える影響は、使用する非同期メカニズムや設計によって異なります。適切に実装すれば、非同期処理でもデータの整合性を保つことができますが、特定のケースでは注意が必要です。

### 非同期処理によるデータの整合性への影響

##　1. **レコードの競合と整合性**
    - **説明**: 非同期処理では、複数の非同期ジョブが同時に同じデータにアクセスしたり、更新を試みたりする場合があります。これにより、競合が発生し、データの整合性が損なわれる可能性があります。
    - **対策**: 
        - **楽観的ロック**: Salesforceの`System.LockException`を活用し、競合が発生した場合にリトライを行う。
        - **外部トランザクション管理**: 競合しやすい操作をキューに入れて順番に処理するなどの管理方法を導入する。
        - **重複防止の設計**: 一意のキーやデータ検証ルールを使用して、意図しない重複データの作成を防ぐ。

2. **処理の順序**
    - **説明**: 非同期処理では、処理が完了する順序が予測できないため、依存する処理がある場合、後続の処理が正しく動作しないことがあります。
    - **対策**: 
        - **キューアブルApexのチェーン**: キューアブルApexを使うと、非同期処理をチェーンで実行できるため、処理の順序を制御できます。
        - **状態管理**: 各処理の状態を追跡し、前提条件が満たされるまで次のステップを遅らせる。

3. **トランザクションの分割**
    - **説明**: 非同期処理は別のトランザクションとして実行されるため、前のトランザクションが成功しても、非同期処理が失敗する可能性があります。これにより、データが部分的にしか更新されない状況が発生することがあります。
    - **対策**: 
        - **非同期処理のリトライ**: 非同期処理の失敗を検出し、リトライの仕組みを実装する。
        - **エラーロギングと通知**: 非同期処理でエラーが発生した場合、そのエラーをロギングし、適切な通知を行うことで、データ不整合を検出しやすくする。

4. **データの参照整合性**
    - **説明**: 非同期処理が異なるsObjectを同時に更新しようとする場合、参照整合性が保たれないことがあります。例えば、親レコードの削除と子レコードの更新が競合するケースです。
    - **対策**: 
        - **トランザクションの順序を管理**: 子レコードの処理が完了した後に親レコードを削除するなど、処理の順序を慎重に設計する。
        - **依存関係の整理**: データモデルの設計時に依存関係を整理し、非同期処理によって不整合が生じないようにする。

### まとめ

非同期処理自体はデータの整合性に影響を与える可能性がありますが、適切に設計と実装を行うことで、その影響を最小限に抑えることが可能です。非同期処理を導入する際には、競合や処理順序、トランザクション管理に注意を払い、データの整合性が保たれるように設計することが重要です。
PythonでWordをTXTに、またはTXTをWordに変換する

Word文書（.docまたは.docx）とテキストファイル（.txt）は、よく使われる2つのファイル形式です。Word文書は複雑な文書処理やレイアウトによく使われ、TXTファイルはプレーンテキスト情報の保存や送信に使われます。この2つの形式の変換方法を理解することで、作業効率を向上させ、ファイル管理を容易にすることができます。
今回は、Word形式とTXT形式の変換をPythonで実装する方法を紹介します。
* [PythonでWord（Doc/Docx）をTXTに変換する](#pythonでworddocdocxをtxtに変換する)
* [PythonでTXTをWord（Doc/Docx）に変換する](#pythonでtxtをworddocdocxに変換する)

## Python Word変換ライブラリ
[**Spire.Doc for Python**](https://www.e-iceblue.com/Introduce/doc-for-python.html)は、様々なWord文書変換・操作機能をサポートするプロフェッショナルなライブラリです。pip経由で直接インストールできます：
> pip install Spire.Doc

 
## PythonでWord（Doc/Docx）をTXTに変換する
**ステップ：**
1.	必要なモジュールをインポートする；
2.	`Document` クラスのオブジェクトを作成します；
3.	`LoadFromFile()` メソッドを使用して、.doc または .docx ドキュメントをロードします；
4.	**`SaveToFile(fileName, FileFormat.Txt)`** メソッドを使用して、Word文書をtxt形式で保存します；
5.	ドキュメントを閉じます。

```python
from spire.doc import *
from spire.doc.common import *

# .docまたは.docx文書の読み込み
document = Document()
document.LoadFromFile("AI日.docx")

# TXTファイルとして保存する
document.SaveToFile("Word2Txt.txt", FileFormat.Txt)
document.Close()
```

**結果：**
![Word-TXT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/50616c0c-8a95-deb9-3bf4-517c9b191bdc.png)


## PythonでTXTをWord（Doc/Docx）に変換する
**ステップ：**
1.	必要なモジュールをインポートする；
2.	`Document`クラスのオブジェクトを作成する；
3.	`LoadFromFile()` メソッドを使用して TXT ドキュメントを読み込みます；
4.	**`SaveToFile()`** メソッドを使用して、TXT ドキュメントを Word Doc または Docx 形式で保存します；
5.	ドキュメントを閉じる。

```python
from spire.doc import *
from spire.doc.common import *

# txtファイルを読み込む
document = Document()
document.LoadFromFile("Word2Txt.txt")

# DocまたはDocx形式で保存する
document.SaveToFile("Txt2Doc.doc", FileFormat.Doc)
document.SaveToFile("Txt2Docx.docx", FileFormat.Docx2016)
document.Close()
```

**結果：**
![TXT-Word.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/42b8d50a-8eff-2be6-7262-423e89752665.png)


## 結論 
[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/doc-for-python.html)ライブラリを使えば、簡単なコードでWordからTXT、TXTからWordへの変換を実現できます。Wordから他のフォーマットへの変換が必要な場合は、例を参照してください：

https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Spire.Doc-for-Python-Program-Guide-Content.html
【Next.js】状態管理はReduxかRecoilか


Next.jsで状態管理を行う際に、ReduxとRecoilのどちらが適しているか。
## Reduxの特徴

- **安定性とエコシステム**: Reduxはめちゃくちゃ使われていて、ドキュメントやサードパーティ製のライブラリも充実している。
コミュニティも大きいので、困ったときに助けを借りやすい。
- **スケーラビリティ**: 大規模なアプリにも対応できるし、複雑な状態管理をしやすい。
状態を一箇所にまとめて管理できるので、予測しやすい開発ができる。
- **Middleware**: Redux ThunkやRedux Sagaといったミドルウェアを使えば、非同期処理やサイドエフェクトの管理が楽になる。
- **設定が多い**: 初めて使うときは設定が多くて大変。

## Recoilの特徴

- **シンプルさ**: RecoilはReactに馴染みやすく、ReactのフックAPIみたいに使えるので、学習コストが低い。
- **グローバルとローカルの混在**: 状態をグローバルにもローカルにも管理できるので、必要に応じて軽量に作れる。
- **依存関係の管理**: Recoilでは状態の依存関係を簡単に管理できて、状態が変わったときに必要な部分だけ再レンダリングするので、パフォーマンスも良い。
- **小規模プロジェクト向け**: 小〜中規模のアプリに向いています。ただし、エコシステムはまだ発展途上なので、Reduxほどサードパーティのサポートは少ない。

## どっちを選ぶ？

### Reduxが向いている場合

- プロジェクトが大規模で、複雑な状態管理が必要な場合
- 状態管理に対してしっかりしたツールやミドルウェアを使いたい場合
- チームにReduxの経験者がいる場合

### Recoilが向いている場合

- シンプルで軽量な状態管理がしたい場合
- 小〜中規模のアプリを開発している場合
- ReactのフックAPIに慣れている場合


大規模なアプリや、既にReduxに慣れているならReduxが良い。一方、シンプルでReactにフィットした状態管理が欲しいならRecoilもあり。

プロジェクトの規模や要件に合わせて、最適な状態管理ツールを選ぶのがよき。
プログラミング言語を車に例えてみた

# はじめに

普段は記述的な記事ばかり書くのですが、今回はちょっと面白みのある記事を書いてみたいなと思い

「そーだ！プログラミング言語を僕の好きな車に例えてみよう！」

とさっき思いついてこの記事を投稿しました。笑

僕もそこまで車に詳しくないのですが、あまり車に詳しくない方達にも伝わるように例えていこうと思います。

※100%偏見と独断で例えているのでその辺はご了承ください。

# それではさっそく

## Python

![スクリーンショット 2024-08-15 14.53.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/f8c9d57d-3256-ced8-5738-1ee3e593989a.png)

**ランボルギーニ**

これはあくまで私の偏見なのですが

Q. 「何のプログラミング言語が好きですか？」

A. 「Pythonです！」

と答える雰囲気と

Q. 「何の車が好きですか？」

A. 「ランボルギーニです！」

と答える雰囲気が似ているなと思ったからです笑

なんかどちらの答えも在り来たりだなーと思ってしまう私がどこかにいます。

(※大事なことなので何度も言いますが決してpythonを得意とするエンジニアを侮辱したいとこではなく、あくまで私個人の超偏見です)

## Java

![スクリーンショット 2024-08-15 14.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/587ad857-186d-80aa-aabf-5fdd9e776fb1.png)

**クラウン**

可もなく不可もなく、Javaとクラウンどちらも古き良きを重んじて安定しているイメージがあるからです。

## JavaScript

![スクリーンショット 2024-08-15 15.06.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/2eb77c50-f03e-746d-1853-c8fe8d23005d.png)

**ロードスター**

スマートで変幻自在、今風な流行り物というようなイメージがどちらにもありますので、JavaScriptにはロードスターを選びました。

## HTML

![スクリーンショット 2024-08-15 15.11.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/768a561d-e809-b699-3177-ab277c1338f2.png)

**NBOX**

HTMLには、軽自動車の中でも人気なこれ買っとけば間違いない。みたいな軽自動車を選びました。

## CSS

![スクリーンショット 2024-08-15 15.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/0ed6906f-3c2b-3ac8-3afc-9f575ce8f272.png)

**ムーブキャンバス**

軽自動車は軽自動車でも、おしゃれで可愛げのある車がCSSには雰囲気が合うなと思い、ムーブキャンバスを選びました。笑

## PHP

![スクリーンショット 2024-08-15 15.14.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/6ad0f80b-e8e5-17b7-a16d-6bb812f42dfc.png)

**アクア**

一般的でかつ、ラフかタイトで分けると少しお堅いイメージがあるので、PHPにはアクアを選びました。

## C系(C##やC++など)

![スクリーンショット 2024-08-15 15.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/40b885e8-4cfe-b4bd-690d-91eea10ff4cc.png)

**アルファード**

C言語は賢く、数学的で落ち着いているイメージがあります。ですのでアルファードを選びました。

## Ruby

![スクリーンショット 2024-08-15 15.29.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/e37fd2c6-cb9a-aba0-1e92-a9c00791c585.png)

**BMW**

軽やかでスポーティなイメージのあるBMWを選びました。正直私がRubyに持つ印象はどことなくJavaScriptに持つ印象と似ているのですが、RubyにはロードスターではなくあえてBMWを選びました。

# 番外編

## GO

![スクリーンショット 2024-08-15 15.23.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/e489b6b2-c368-47b4-bb77-43bcec294e73.png)

**テスラ**

最新のイメージがあるので、これからの期待を込めてテスラを選びました笑

## COBOLO

![スクリーンショット 2024-08-15 15.34.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/128caa98-fd08-4ac7-6720-fd588eb867b9.png)

**セルシオ**

マイナーで古いですが、現在も利用者はいるイメージがあるのでセルシオを選びました。

# さいごに

いかがだったでしょうか。車に興味のないエンジニアの方達にも伝わるように、できるだけ認知度の高い車を意識しました。

誰かの業務や勉強の息抜きになれば嬉しいです。

最後までお読みいただき、ありがとうございました！
【Android Studio】辞書ファイルを設定してうるさいタイポ指摘にサヨナラする

## 概要

オリジナルのアプリを作っていたりすると、コード中にオリジナルの言葉が登場することは多々あると思います。
ですがAndroid Studioは親切なので、そういった言葉も~~余計なことに~~ご丁寧にタイポ指摘してくれます。

アプリ自体に影響があるわけではないのでそのままでも全然問題ないのですが、何か気持ち悪い！となるのでこれが出ないようにします。

## 対処法

### 1. Android Studioの設定で対処

以下の画像のように、設定のSpellingで指摘しないでほしいワードを追加します。
個人で進めているプロジェクトならこれで必要十分だと思います。

![スクリーンショット 2024-08-15 15.07.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724617/41a81fab-c872-ee74-5812-3dafa8f475e4.png)

### 2. spellチェック自体外してしまう

設定 -> Inspections -> Typoの部分のチェックを外すことで、そもそもタイポチェックをしないようにもできます。
ただこれをやってしまうと本当に間違っているワードも指摘してくれなくなってしまうので、この方法を取るという選択肢はまずありえないかなと思います。

![スクリーンショット 2024-08-15 15.11.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724617/2526fbbd-970d-375a-0e0d-f82716c97078.png)

### 3. 辞書ファイルを設定する

まず、dicファイルを作って中にタイポ指摘して欲しくないワードを羅列します。
アプリレベルのbuild.gradleと同じレベルに置くのが良いと思います。

```whiteList.dic
falconflat
qiita
...
```

※whiteListはアクセスや使用が許可されている安全なものを定義したリストという意味です。

作成したら、1の方法で見た設定のSpellingを開きます。
Custom dictionariesという項目があると思うので、ここの+を押して上記のdicファイルを追加しましょう。
dicファイルに載せた文字がタイポ指摘されなくなります。
もしかしたら保存かIDEの再起動が必要になるかもしれません。

![スクリーンショット 2024-08-15 15.07.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724617/06aeef1c-5250-1754-e77f-125f5fee452b.png)

複数人のプロジェクトとして作っているならこれがベストかと思います。
IntelliJなどJetBrains製のIDEは同じようにできるかと思います。
それぞれのIDEで最初にこれを設定しておけば、新しいワードが追加されたら適宜dicファイルに反映するだけでうるさいタイポ指摘にサヨナラできます。

## 追記

上記の3の方法の場合、個々人で設定する手間がかかってしまいます（初回だけなので大した手間ではないですが）
それを避けたいならば、1の方法を取って、`.idea/dictionaries`以下に設定される`ユーザー名.xml`のファイルを任意の名前に変更します。
以下のようなファイルです。

```white_list.xml
<component name="ProjectDictionaryState">
  <dictionary name="white_list">
    <words>
      <w>falconflat</w>
    </words>
  </dictionary>
</component>
```

そして`.gitignore`から`.idea/dictionaries`を削除してGitにプッシュします。
これによりチーム全員で設定なしに同じ辞書を共有することができます。
3の方法とお好きな方を選択すると良いと思います。

### 参考

https://qiita.com/beyondseeker/items/7e63e6a22d6ba3f9f2bd