OmniAICreator/Qiita-1.07M huggingface dataset:
ヒアドキュメントサンプルプログラム(PHP)

PHPでヒアドキュメントのサンプルプログラムをじっそうしました。

```html
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Heredocument1</title>
  <style>
    p {
      font-size:25px;
      color:pink;
    }
  </style>  
</head>
<body>
  <?php
    $name = "秋元真夏";

    $text  = <<< EOL
      $name は乃木坂46のキャプテンです <br>
      $name の必殺技は「ズッキュン」です <br>
      $name は乃木坂46最年長メンバーです <br>
    EOL;
    
    echo "<p>${text}</p>";
  ?>
```

PHP部分で
```PHP
<?php
    $name = "秋元真夏";

    $text  = <<< EOL
      $name は乃木坂46のキャプテンです <br>
      $name の必殺技は「ズッキュン」です <br>
      $name は乃木坂46最年長メンバーです <br>
    EOL;
    
    echo "<p>${text}</p>";
  ?>
```
変数をEOLを使って囲んでヒアドキュメントを作ります。
Application Gateway を 停止する・開始する・確認する

# Application Gateway を停止する・開始する・確認する

PowerShell で以下を実行することで、開始/停止 が可能です。
Azure Cloud Shell (ダイレクトリンク：<a herf="https://shell.azure.com">https://shell.azure.com</a> )から、サクッと。

なお、開始/停止のコマンドは完了まで数分（およそ開始3～4分、停止4～7分ほどでした）かかります。
また、稼働状況だけ確認したい場合などは、Get-AzApplicationGateway の OperationalState 欄を確認すれば稼働状況を判断できます。


#### Application Gateway を停止させる

```Powershell
# 停止させる
$AppGw = Get-AzApplicationGateway -Name "ApplicationGateway01" -ResourceGroupName "ResourceGroup01"
Stop-AzApplicationGateway -ApplicationGateway $AppGw
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/96c2aa6e-0dd8-bb21-f3a7-10c832916373.png)


#### Application Gateway を開始する
```powershell
# 開始する
$AppGw = Get-AzApplicationGateway -Name "ApplicationGateway01" -ResourceGroupName "ResourceGroup01"
Start-AzApplicationGateway -ApplicationGateway $AppGw
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/2efc9b76-6a6a-eefd-7780-00eaf58a61e3.png)

#### Application Gateway の開始/停止状況を確認する
```powershell
# 稼働状況を確認する
# OperationalState : Running / Stopped
#
$AppGw = Get-AzApplicationGateway -Name "ApplicationGateway01" -ResourceGroupName "ResourceGroup01"
($AppGw).OperationalState
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/952065aa-b742-355c-9b20-4fc8c13da9f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/4dee2b69-5921-ac59-a6b4-0b4b3c08c365.png)

# 参考リンク
https://learn.microsoft.com/ja-jp/powershell/module/az.network/get-azapplicationgateway?view=azps-9.1.0

https://learn.microsoft.com/en-us/powershell/module/az.network/stop-azapplicationgateway?view=azps-9.2.0

https://learn.microsoft.com/en-us/powershell/module/az.network/start-azapplicationgateway?view=azps-9.2.0
NetBSD 10まもなく

NetBSDのリリースプロセスは良く知りませんが10のリリース準備に入ったようです。

HEADをpullしたらバージョンが10.99.1になってました。

https://dmesgd.nycbug.org/index.cgi?do=view&id=6851

FreeBSDと違って日本の開発者が頑張ってるようです。
Androidアプリ開発がちょっと楽になる Android Studio Tips

この記事は[ディップ株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-dev) の17日目です🎄🎁
恐ろしいことに今年もあと2週間ですね〜
## はじめに
こんにちは、@beniii0817です。今年ディップに新卒入社し、Androidアプリエンジニアとしてバイトルアプリの開発をしています。

アプリチームに配属されるまでAndroid Studioすら触ったことがありませんでしたが、まわりの方々にサポートしていただきながら日々楽しく開発をしています（感謝感激🙏🏻）

今回はAndroidアプリ開発がちょっと楽になるAndroid StudioのTipsをご紹介します！
## ショートカット
よく使うショートカットです。特にアクション検索は大抵のことができるのでとても便利です。
- `⌘` + `Shift` + `A`　[アクション検索]
- `Shift`を2回押す　[全ファイル検索]
- `⌘` + `Option` + `l`　[コードの整形]
- `control` + `R`　[ビルド&実行]
- `⌘` + `Shift` + `@`　[タブ移動]

▶️ [**Keyboard shortcuts**](https://developer.android.com/studio/intro/keyboard-shortcuts)

## Select Opened File
ツールウィンドウ上部にある丸いアイコンをクリックすると現在編集中のファイルへ移動することができます。
処理を追ってるとよく迷子になるので重宝してます。
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953440/a4917c5e-86a1-a4e9-7be1-533f0220cd43.gif)


## Postfix Completion
入力しかけのコードに変数定義やfor文の構文などを自動的に後置補完してくれます。
たとえば、Listのインスタンスに`.for`を入力するとその後に続くfor文を自動的に作ってくれます。
![PostfixCompletion.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953440/b7f9aff7-12c0-b4d2-9e19-e57e74b72510.gif)

他にもいろいろあるのでぜひ見てみてください〜(`Preferences`→`Editor`→`General`→`Postfix Completion`で確認できます)
![スクリーンショット 2022-12-16 22.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953440/878b19f8-1d15-bda9-75dd-0af3277406eb.png)

▶️ [**Postfix Completion**](https://www.jetbrains.com/help/idea/settings-postfix-completion.html)

## コード行やコード範囲を指定してパーマリンクを作成
もともとGithubには[Permanent links to code](https://docs.github.com/ja/get-started/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet)という機能がありますが、Android Studio上でコード行やコード範囲を指定してパーマリンクを作成することができます。ほかの人にコードを共有するときにとても便利です。
![open-in.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953440/57839efb-477f-1809-a992-05be370acd50.gif)
![copy-permalink.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953440/a14e8036-cf4e-2c50-ce65-69c5ad6d9159.gif)

▶️ [**Creating a permanent link to a code snippet**](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet)
## おまけ：Eevee Progress Bar
Progress Barにイーブイを走らせることができるプラグインです。
ビルド待ちのお供によさそうです。
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953440/b039f37c-1d44-65cc-07b6-7fede285ea74.gif)
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953440/f4bbcfc6-24d5-477d-2537-4da7850f7d48.gif)

▶️ [**Eevee Progress Bar**](https://plugins.jetbrains.com/plugin/14604-eevee-progress-bar)

## おわりに
Android StudioはIntelliJベースなので、便利な機能がたくさんあり毎回発見が楽しいです！
少しづつ覚えて楽に楽しく開発ができるといいなと思います。

最後まで読んでくださってありがとうございました！
素敵なAndroidアプリ開発ライフを〜🧚‍♀️
AmazonLinux2設定用Ansibleサンプル

# 内容
Amazon Linux 2の初期設定サンプルのPlayBookです。Ansibleの学習用に。

# ディレクトリ構成

```shell
.
|-- inventory
|   |-- group_vars
|   |   `-- all.yml
|   `-- hosts
|-- roles
|   `-- setup
|       |-- files
|       |-- tasks
|       |   `-- main.yml
|       `-- templates
|           `-- snmpd.conf.j2
`-- site.yml
```

# ファイル説明

|フォルダ名|説明|
|:---|:---|
|site.yml|このファイルを最初に呼び出す。ここからrole配下が実行|
|inventory/group_vars/all.yml|変数を格納|
|inventory/hosts|実行対象を記載|
|roles/setup/tasks/main.yml|メインの処理を記述|
|roles/setup/templates/snmpd.conf.j2|snmpの設定、メインの処理の中でコピーされる|

# 実行している内容

* yum update
* モジュールのインストール
* モジュールのenable/didable
* TimeZone関連設定
* ホスト名設定
* IPv6無効化
* SELInux無効化
* ユーザー作成
* snmpd.confコピー（前にsnmpdを使用していたため）

```shell:roles/setup/tasks/main.yml
---

- name: yum update
  yum:
    name: "{{ item }}"
    state: latest
    update_cache: yes
  loop:
    - "*"

- name: install module
  yum: 
    name: "{{item}}"
    state: present
  loop: "{{ install_packages_list | default([], true) }}"

- name: systemd enable
  systemd:
    name: "{{item}}"
    enabled: yes
  loop: "{{enabled_packages_list | default([], true) }}"

- name: systemd disable
  systemd:
    name: "{{item}}"
    enabled: no
  loop: "{{disabled_packages_list | default([], true) }}"

- name: set timezone
  timezone:
    name: "{{ local_timezone }}"
  
- name: set locale
  command: "localectl set-locale LANG={{ local_locale }}"

- name: set keymap
  command: "localectl set-keymap {{ locale_keymap }}"

- name: set hostname
  hostname:
    name: "{{ linux_hostname }}"

- name: IPv6 disabled
  sysctl:
    state: present
    name: "{{ item }}"
    value: "1"
    sysctl_set: no
    reload: no
  with_items:
    - net.ipv6.conf.all.disable_ipv6
    - net.ipv6.conf.default.disable_ipv6
    - net.ipv6.conf.lo.disable_ipv6

- name: Disable SELinux
  selinux:
    state: disabled

- name: create operation users
  user: 
    name: "{{ item.key }}"
    password: "{{ item.value.password }}"
    groups: "{{ item.value.groups }}"
    shell: /bin/bash
    home: "/home/{{item.key}}"
    state: present
  loop: "{{ user_newusers|dict2items }}"

- name: snmpd.conf file copy
  template:
    src: "snmpd.conf.j2"
    dest: "/etc/snmp/snmpd.conf"
    owner: root
    group: root
    mode: 0600
```
その他ファイルはGitHub参照

https://github.com/Toru-Kubota/Ansible-AmazonLinux2-Setup

# 実行方法
* Amazon Linux作成
* ansible準備

```shell
sudo su -
amazon-linux-extras enable ansible2
yum install -y ansible
```

* 鍵の配置
```shell
vi /home/ec2-user/.ssh/key.pem # 使用しているKeyペアの内容を貼り付ける
chmod 400 /home/ec2-user/.ssh/key.pem
```

* Playbook実行
```shell
yum install -y git
git clone https://github.com/Toru-Kubota/Ansible-AmazonLinux2-Setup.git
cd Ansible-AmazonLinux2-Setup
ansible-playbook -i inventory/hosts site.yml
```
リバースプロキシサーバーがいるときのSpring BootのリダイレクトURL作成

# 概要
Spring Bootで動いているアプリケーションサーバー(以下APサーバー)が、Webページをリダイレクトするとき、リクエスト時のURLを元にリダイレクト先のURLを構築する。クライアントとAPサーバーの間にリバースプロキシサーバーがいる場合、APサーバーはリバースプロキシの作成したURLしか参照できないため、クライアントが必要とするリダイレクトURLを作成できない。この問題を解決するには、リバースプロキシがAPサーバーにリクエストを転送する際に、HTTPヘッダー「Forwarded」「X-Forwarded-」を付加し、クライアントからのリクエストURLで使われたスキーム(http or https)、ドメイン名、ポート番号などをAPサーバーに伝える。

# 課題
説明にあたり、まず、Spring Bootのリダイレクト処理について説明する。
## Spring Bootのリダイレクト処理
Spring BootのリダイレクトURL作成のプロセスは以下である。
1. Spring Boot内でリダイレクト処理があり、このときリダイレクト先として「/login」のようなルートからのパスが指定されたとする。
1. すると、Spring BootはリクエストURLを参照し、ルートより前の部分、以下の例なら、「 http://example.com 」を補完する形でリダイレクトURLを作成する。
1. 作成したリダイレクトURL「 http://example.com/login 」をクライアントに返却する。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10723/7b1d13d4-0451-d09d-b2fe-d5d5bbd4a2af.png)

## リバースプロキシサーバーがいる場合
リバースプロキシサーバーは、通信の軽量化のため、以下のように、（リバースプロキシ ⇔ APサーバー）間の通信をSSLなしのHTTP通信で行っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10723/dab48741-cb50-1c6a-969a-d176bd33c216.png)
ここでリダイレクト処理をしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10723/70756378-fddd-13c7-10fc-8910aabcc608.png)
Spring BootはリダイレクトURLの作成に当たり、直接参照できるURL、つまりリバースプロキシが作成したリクエストURLを参照する。リバースプロキシはHTTP通信でAPサーバーにアクセスするため、Spring BootはリダイレクトURLのスキームにSSLなしのHTTPプロトコルを指定する。すると、リダイレクト時に以下が起きる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10723/fd7973dc-340a-c065-f5d4-1eb04d052606.png)
リダイレクトURLにはHTTPプロトコルを指定しているので、意図しないSSLなしのHTTP通信がインターネット上で発生してしまう。
# 原因
この問題の原因は、APサーバーがリダイレクトURLを作成する際に、(クライアント ⇔ リバースプロキシ)間で使われたURLを参照できないことにある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10723/908edbd4-e5a6-f29d-dbb6-d70de99c648d.png)

# 解決策
この問題を解決するには、リバースプロキシがAPサーバーにリクエストを転送する際に、HTTPヘッダー「Forwarded」「X-Forwarded-〇〇」を付与し、APサーバーに（クライアント⇒リバースプロキシ）時のURL情報を伝える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10723/0291c195-e5d7-0920-9530-1a7f538513dc.png)

# 実装
## リバースプロキシサーバーの設定
NGINXでのHTTPヘッダー付加の設定については省略する。

## APサーバー「Spring Boot」の設定
以下のBeanを定義する。この設定により、Spring BootがリダイレクトURL作成時にリバースプロキシが送ってきたHTTPヘッダー「Forwarded」「X-Forwarded-〇〇」を参照するようになる。
```Java:
@Bean
public ForwardedHeaderFilter forwardedHeaderFilter() {
  return new ForwardedHeaderFilter();
}
```

### なぜSpring BootはデフォルトでHTTPヘッダーを参照してくれないのか？
これは、HTTPヘッダーの偽装が容易で、セキュリティホールになり得るからである。そのため、Spring Bootでは、明示的に「Forwarded」「X-Forwarded-〇〇」の読み取りを指定する必要がある。

# 参考
## リファレンス
- [mdn web docs - 開発者向けのウェブ技術 > HTTP > HTTP ヘッダー > Forwarded](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Forwarded)
- [SPRING FRAMEWORK - クラス ForwardedHeaderFilter](https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/ForwardedHeaderFilter.html)

## 技術記事
https://qiita.com/rubytomato@github/items/8d132dec042f695e50f6
ChatGPT について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。ChatGPT、既に素敵な記事がたくさんある。

[ChatGPT使い方総まとめ - Qiita](https://qiita.com/sakasegawa/items/82069c97a1ee011c2d1e)
[ChatGPTによるプログラム生成の可能性と限界（前編） - Qiita](https://qiita.com/autotaker1984/items/5b5ac8c01d11fbbbc4a7)
[ChatGPTによるプログラム生成の可能性と限界（後編） - Qiita](https://qiita.com/autotaker1984/items/c6769f9ea7f2df1fdeb5)

ので、私は [Azure Logic Apps でバッチ処理しよう - Qiita](https://qiita.com/e99h2121/items/a69e40d016f5df01b061) のとおり Logic Apps に関して ChatGPT さんに頼んでみたことだけ書きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/6860d52b-56d2-1aa3-67e0-7ee80e51b176.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/3c8cb1b1-e415-e4b3-34e6-53533c2c88eb.png)

ソースも中途半端目に出してくれますね...。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/9b1ccbc8-d478-f5e4-ffc7-003ceb378cc8.png)

ついでにこういうことも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/de2ec2a0-6544-ade9-8b04-f471780e15a8.png)

雑な関西弁のしゃべりかたなんて知らなかった。今年私が知らなかったことでした。 :santa:
GitHub ActionsでHardhatのCI/CDを構築する

## 目的
Hardhatでコントラクトを開発する中で、テスト・コンパイル・デプロイの操作が度々あります。そのような処理をGitHub Actionsを使ってCI・CDを構築したら良いと思い実装に至りました。

## 対象者
- GitHub Actionsを入門したい方
- CI/CDの基礎を学びたい方
- HardhatのCI/CDを構築したい方


## 基礎

### CI/CDとは

**CI(継続的インテグレーション)**
コードのテスト・ビルドを繰り返す行うことで問題の早期発見し、開発効率をあげる手法

**CD(継続的デリバリー)**
検証済みのコードのリリースを自動化し、開発効率をあげる手法


```mermaid
graph LR;
   a[CI  継続的インテグレーション]--> b[CD 継続的デリバリー];
```
詳しくは下記記事を参考にしてください

https://qiita.com/masato930/items/6ca4863eea7505f5d39d

### GitHub Actionsとは
GitHubが提供するCI/CDプラットフォームでワークフローに書かれた処理を実行します。
特徴としては既存のCI・CDツールではないissueの追加された時にもワークフローを実行することができます。

### Hardhatとは
Hardhatは Ethereum ソフトウェアをコンパイル、デプロイ、テスト、およびデバッグするための開発環境です。この他だとTruffle Suiteなどがあります。
これを使用することにより、EVM互換性をもつチェーンを扱うことができます。

https://hardhat.org/


## 実装

#### 環境構築
```shell
# npmの初期化
$ npm init -y

# hardhatのinstall
# Create a basic sample projectを選択
# 残りは推奨されている方を選択
$ npx hardhat install

# ワークフローのファイル作成
$ mkdir .github
$ mkdir .github/workflows
$ touch .github/workflows/deploy.yml

```

#### コーディング

**npmスクリプトの修正**
```diff:package.json
  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "deploy": "hardhat run scripts/sample-script.js",
+    "compile": "hardhat compile",
+    "test": "hardhat test"
  }

```

**ワークフローの作成**
```.github/workflows/deploy.yml
name: deploy
on:
  push:
    branches:
      - master #ここはお好きなブランチにしてください
jobs: 
  unit-test:
    name: Unit Test
    runs-on: ubuntu-latest
    steps: 
      - uses: actions/checkout@master
      - name: Set Node.js 12.x
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Install dependencies
        run: npm ci
      - name: Test
        run: npm test
  deploy:
    name: Deploy
    needs: unit-test
    runs-on: ubuntu-latest
    steps: 
      - uses: actions/checkout@master
      - name: Set Node.js 12.x
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Install dependencies
        run: npm ci
      - name: compile
        run: npm run compile 
      - name: deploy
        run: npm run deploy
```

**大まかに解説**
**on** 
onの部分では何を条件にワークフローを動こすを指定できます。今回だとmasterブランチにpush・mergeされた時に動きます。
**jobs**
jobsでは具体的なワークフローの定義をしていきます。今回はUnit Test・Deployというjobがあります。


## 動かしてみよう
ここまで準備ができましたら、あとはpushして動かすだけです。
YMLファイルで指定したブランチにPushしてみてください！

Actionsのページで動作は確認することができます。。。。
![スクリーンショット 2022-12-17 5.09.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636494/5465be0d-f824-d8e8-1cfe-ae2d4ef93587.png)
**無事うまくいった模様！！**

ここにうまくいったリポジトリも公開していますのでよかったら参考にしてください！

https://github.com/yhoi/hardhat_github_actions

#### 今後行うこと
マルチチェーンに対応できるようにして、ブランチごとに各チェーン上でスマートコントラクトをデプロイできるようにする！

## 最後に
今回はHardhatに入っているサンプルを使ってGitHub Actionsを使ってみましたが、本来はEthereum・Polygonなどでデプロイするときは秘密鍵が必要になると思います。なので、GitHubの環境変数に秘密鍵を置くなどの処理は慎重に行ってください。くれぐれも資産が入っているWalletは開発に使わないようにしてください🙇　

## 参考記事
https://docs.github.com/ja/actions
夜間作業で本番環境にログインできない！＋SES事業者としての受入体制

やらかしちゃった人カレンダー初参加です。

やらかしとしては未遂ですが、個人と会社（SES事業者）として品質を疑われたのでやらかし判定。
技術よりは文化・ポエム寄りです。


# 事象

本番環境のシステム切替で、夜間作業。
作業内容としてはサーバへログインし、設定ファイルを１行変更するだけですが、サーバへのログイン時に以下で躓く。

- 端末へのログイン
  - 普段利用している業務端末ログイン用のWindows アカウント（アカウントA）
- リモートデスクトップで踏み台端末へのログイン
  - 踏み台端末&踏み台端末不要な本番Windows Server ログイン用のWindows アカウント（アカウントB）
- 踏み台端末から利用するセキュリティ製品へのログイン
  - 踏み台端末上のセキュリティ製品ログイン用の**Windows アカウント**（アカウントC）

**アカウントCへのログインが出来ない！**

ログイン3回失敗でロックアウトされる仕様。
アカウントCは事前にセキュリティ製品経由で利用申請が必要。
夜間にやらなければならないような作業なのでステークホルダー調整済み。

本作業のリスケ、しかもこんなしょぼい理由でのリスケは相当なインパクトがあるわけで、めっちゃ焦る。
※システム的な理由はもちろん、個人と会社的の信用的な理由で。


# 暫定対処

以下の対処をしたので無事ログイン＆作業が終わり、やらかし**未遂**で終わりました。
なお、３回失敗するとロックアウトされ、詰みます。

- 1度目失敗。
  - 通常ログイン試行
- 2度目失敗。
  - パスワード入力後、パスワード表示（パスワード入力欄の右側に表示されるアイコンを長押し）して入力値確認して試行
- 3度目成功。
  - セキュリティ製品の3回目入力前に、Windows OSでパスワード変更（Ctl＋Alt＋Delから）実施したところ、パスワード有効期限が切れていたので、新しいパスワードに変更後に試行

# 原因（惨劇はなぜおこってしまったのか）
## 直接原因

定期的・直前のパスワード確認・パスワード再設定をしなかった。
なお、作業は月曜日～火曜日にかけて実施なので、直前営業日の金曜日に確認（作業対象サーバへのログインまで）を実施済み。


## 根本原因

アカウントA、B、CどれもWindows アカウントとして、ADで管理されている。
ADのGPOでパスワードポリシーが設定されていて、定期的に変更が必要となる。

アカウントA、BはWindows OSのログインに利用するため、OSログイン時にパスワード変更が要求されるor有効期限間際の警告メッセージが表示されるが、
アカウントCについてはAD上で管理されているがOSへログインに利用されないので、パスワード有効期限に気が付けない。

# 恒久対処（惨劇を起こさないためにできること）
## 個人として
根本原因の解決はシステム的に変更できるものでもないので、直接原因を改善するしかないかな…
パスワードポリシー有の複数アカウントを管理するのであれば、定期的に一律変更するのが、パスワード運用あるあるかなと。


## SES事業者として
自身がSES事業者であり、客先常駐という働き方。
なので、個人として文化・慣習に順応するだけでなく、自社の要員を受入体制作り・システム化が必要。

前の現場では在任期間がとても長く（１０年近く）、自身の慣れも強く、受入体制作りに力をいれていた。
※エントリーレベルも受け入れる体制を構築し、単価と給与のギャップ＋OJTにおける教育をバリューとしていた。

ここ数年で前の現場から新しい現場に配属となったが、新しい現場は単価・要求スキルが高く、それゆえに受け入れ体制作りが必要ない。
そのため自身でも仕組化せず、現場としても制度・文化となっていなかった。

前の現場では自身で作った仕組みで長年拾っていた部分であるが、在任期間が長くなりその点を意識することなくなっていた。
また、新規環境にて文化・慣習を学習する機会が損なわれていた。



# まとめ
個人として意識できることは多くありますが、同じ環境で仕事を続けることが保証されない、前提としないSES事業において、
ジョブローテーション（環境の変化）というのはとても大切と感じました。

定期的にジョブローテーションを行うことで、新規環境への順応・受入の仕組み構築を促していくのが結果的にSES事業者としての品質向上につながるかもしれません。
openbsd と　windows 10 pro と　winscp

linux との間では

```
nec# ./comment-out.bat /etc/rc.conf.local                                      
xenodm_flags=
portmap_flags=""
mountd_flags=""
nfsd_flags="-tun 4"



nec# ./comment-out.bat /etc/exports                                            
/NFS---	-maproot=bin: -network=192.168.10 -mask=255.255.255.0


nec# ./comment-out.bat /etc/pf.conf                                            
wired = "bge0"
table <martians> { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16     \
  172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \
  192.168.0.0/16 198.18.0.0/15 198.51.100.0/24        \
  203.0.113.0/24 }
set block-policy drop
set loginterface $wired
set skip on lo0
match in all scrub (no-df random-id max-mss 1440)
antispoof quick for $wired
block in quick proto tcp to any port { telnet, 445, 1433, mysql, rdp, 137, 138, 139, 445 }
pass in   quick on $wired from 192.168.10.0/24 to 192.168.10.0/24
pass out  quick on $wired from 192.168.10.0/24 to 192.168.10.0/24
block in  quick on $wired from <martians> to any
block out quick on $wired from any to <martians>
block in  quick on $wired from <spammers> to any
block out quick on $wired from any to <spammers>
block all
pass out quick inet
pass in on $wired inet

```


にて


```
linux で
# mount.nfs 192.168.10.52:/NFS--- /NFS-nec---
をして

# df
ファイルシス          1K-ブロック     使用    使用可 使用% マウント位置
dev                       5061056        0   5061056    0% /dev
run                       5091748     1512   5090236    1% /run
/dev/sda1               428203516 76660560 350882848   18% /
tmpfs                     5091748        0   5091748    0% /dev/shm
/dev/sda1               428203516 76660560 350882848   18% /var/tmp
/dev/sda1               428203516 76660560 350882848   18% /home
/dev/sda1               428203516 76660560 350882848   18% /var/cache
/dev/sda1               428203516 76660560 350882848   18% /root
/dev/sda1               428203516 76660560 350882848   18% /srv
tmpfs                     5091748        8   5091740    1% /tmp
/dev/sda1               428203516 76660560 350882848   18% /var/log
tmpfs                     1018348       80   1018268    1% /run/user/1000
192.168.10.52:/NFS---   264458752  8271296 242964544    4% /NFS-nec---
```

うまく　マウントできてます



------------
------------
------------
しかし　openbsd と　windows との間ですが

１）
https://4thsight.xyz/42511
で　先人がいますので　後を追いますが

openbsd では　NFSが　virsin 4　のようで
そのため　最後の最後で接続できません



２）かといって　sambaは　面倒ですので

２）windowsで　winscp をつかうとできはします


```
./comment-out.bat ssh-txt.bat                                            
cp /etc/ssh/sshd_config-txt /etc/ssh/sshd_config
/etc/rc.d/sshd restart

して　
TEXTパスワードを許可し

```

windows 10 からの　winscpを許可したら　ずっと接続できますので
その直後に

```
./comment-out.bat ssh-ango.bat                                           
cp /etc/ssh/sshd_config-ango /etc/ssh/sshd_config
/etc/rc.d/sshd restart

TEXTパスワードの許可を取り消して　やってます
```
（初心者的）この /usr/bin/python3 はだれが？

小型マイコン遊び以外でも，ちょっとしたテキストデータの処理等で標準のPythonを使う場面が増えてきた。とても便利。

ふと，自分のMacを見たら，`/usr/bin/python3`があることに気づいた。おかしいな。このMacにはインストールした記憶ないのに...

(Catalina 10.15.7)

```bash
$ which python
/usr/bin/python
$ python --version
Python 2.7.16
$ which python3
/usr/bin/python3
$ python3 --version 
Python 3.8.2
$ 
```

参考URL

- https://geniusium.hatenablog.com/entry/2020/05/07/004816
- https://ottan.jp/posts/2020/04/macos-catalina-python3-default/

このままこの python で pip していいのだろうか？ 疑問に思い，更に調べてみると，`venv`で仮想環境を作る，という手法が一般的だそうだ。なるほど。勉強になる。

- https://www.python.jp/install/macos/virtualenv.html

やってみた。私は `fish` シェルを使っているので，`.venv/bin/activate.fish` を使うようだ。

```bash
numeru55@numeru55-MacBook-Pro-13 ~> mkdir venv_test
numeru55@numeru55-MacBook-Pro-13 ~> cd venv_test/
numeru55@numeru55-MacBook-Pro-13 ~/venv_test> which python3
/usr/bin/python3
numeru55@numeru55-MacBook-Pro-13 ~/venv_test> python3 -m venv .venv
numeru55@numeru55-MacBook-Pro-13 ~/venv_test> source .venv/bin/activate.fish 
(.venv) numeru55@numeru55-MacBook-Pro-13 ~/venv_test> which python3
/Users/numeru55/venv_test/.venv/bin/python3
(.venv) numeru55@numeru55-MacBook-Pro-13 ~/venv_test> deactivate
numeru55@numeru55-MacBook-Pro-13 ~/venv_test> 
```
これで安心してpipできる。もちろんスクリプトをシェルから直接実行する場合に

```
#!/usr/bin/env python3
```

としないと，仮想環境のpython3を使わないので注意が必要だ。

で，肝心の `/usr/bin/python3`だが，homebrewを使うときにXcodeとともにインストールされたもの，と断定した。

homebrewを導入していないmacにも`/usr/bin/python3`（らしきもの）があり，terminalで実行してみると，Xcodeの導入をうながされるからだ。なるほど。これで納得。

（補足）

小型マイコンで遊んでいると，標準のPython（CPythonとも言うらしい）がいろいろ動いていることを体験していた。これらはいわばpythonの仮想環境を使っているようだった。

- Thonny は自前で local python という名前で持っている。GUIでpipして，thonnyからterminalを呼び出すことで，ライブラリーをインストールされた環境を使うことができる。
- esp32のバイナリーを書き込むとき，Arduinoなどでは裏で（堂々と？）`esptool.py`が動いている。
- Visual Studio Code を使っているときも見たことがある
小中高生へのプログラミングスクールを通して気が付いたこと・感じたこと

## はじめに
こんにちは。開発部サーバーサイドエンジニアチームの林です。
こちらはトラストバンク [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/trustbank) 18日目の記事です。
普段は業務委託によりトラストバンクで開発業務を行っていますが、土日に自社のプログラミングスクール事業を行なっています。
今回はプログラミングスクールを通して気が付いたこと・感じたことについて書いていきたいと思います。

## 講義の内容
いつもどのような内容を教えているかというと、ざっくり以下の内容です。
実はもう少し色々やっていますが、自分は対応したことがないので割愛します。
* Scratchを利用した小学生向け講座
* ichigojamを利用した小学生、中学生向け講座
* Swiftを利用した中学生、高校生向け講座
* Unityを利用した高校生向け講座

## 事前準備
普段はLaravelやFuel PHPなどの開発を行っているため、基本的に門外漢です。
そのため、講座の担当になったら社内で作成したカリキュラムを一度通しで行って確認します。
ここはサラッと流されているけど、本当に全くやったことがない生徒さんはわからないんじゃないかな…と感じるところにはメモを残していきます。
``` 例：変数の定義、そもそものソフトのボタン位置・使い方など ```
実際に教えていて感じたことですが、手元に印刷したカリキュラムがあると教えやすさが段違いです。（タブレットがあれば話は別かもしれません）
個人的には教えている最中もあとどれくらいだなーというのがわかりやすいので、アナログではありますが毎回紙です。

## 講義中
<dl>
<dt>小学生</dt>
<dd>基本的には中学年〜高学年向けに講座を行なっています。</dd>
<dd>小学生にはまだ1人で教えたことがありませんが、低学年の生徒さんがいるかいないかでかなり変わります。</dd>
<dd>配布した備品のキーボードが破壊されてしまって経理の方に怒られたり、予想だにしない事件が発生するのでかなり気を張ります。</dd>
<dd>中学年の生徒さんは楽しくなってしまって1人大きな声を出すと共鳴してしまうので、楽しい雰囲気を壊さない程度にこちらの話に気を向けてもらう必要があります。</dd>
<dd>高学年の生徒さんばかりだと真面目に話を聞いてくれる印象があります。</dd>
<dd>ただ、全学年を通してわからない時、困った時も素直に声をかけてくれることが多いのでかなりやりやすいなと感じています。</dd>
</dl>
<dl>
<dt>中学生</dt>
<dd>カリキュラムが少し難しくなることもあり、家庭にパソコンがあるかないかで進度にばらつきが出ます。</dd>
<dd>難しい年頃ということもあるのか普段真面目なのだろうなという子が上手く進められずに嫌になってしまう…ということもあり、あまり声をかけるとプライドを傷つけてしまうこともあるのでかなり気を遣います。</dd>
<dd>なるべく口頭で詳細に丁寧に、パソコンの使い方も含めて説明すると良いのかなと思っています。</dd>
<dd>中学生になってくるとだんだん素直にわからないと声をかけられなくなってしまうので、手が止まっていないか、考えているだけなのか固まってしまっているのかをよく注意して観察しています。</dd>
</dl>
<dl>
<dt>高校生</dt>
<dd>カリキュラムを配布すると全然こちらの話を聞かずに進めてしまう生徒さんが増えます。</dd>
<dd>事前確認をして絶対に聞いて進めてほしいところを把握しておかないと、躓いて全員上手く出来ず大混乱を招くことがあります。</dd>
<dd>自信がなさそうに話すと完全に舐められてしまうこともあるので、小学生中学生とは違った難しさを感じます。</dd>
</dl>

## 事後対応
連続して講義を対応することはあまりないので、進捗や状況を次の担当者に共有します。
また、カリキュラムの誤字などがあれば事前確認の際にメモしているのでついでに作成者に共有しています。
備品が壊れていることに気がつかないと怒られてしまうので確認しますが、大抵見逃して怒られています…。
パソコンの操作に慣れていなさそうな子、おそらく普段から個人的に触ったことがあり進みが早い子といった情報を共有してもらえるとやりやすいので、なるべく次回担当者に伝えるようにしています。

## 終わりに
小中高生に教える中で、新入社員が入った際もきっとわからないだろうな、と思うことがたくさんあります。
 **「ローマ字がわからない」** と言われて **そうか…普段フリック入力だから…** とジェネレーションギャップを感じたり、普段子供と会話しないので新鮮な気持ちになり、とても楽しく思います。
これはわかるだろうという先入観がそもそも良くない、１から１０まで丁寧に伝えることが何より大切なのだなとも毎回実感しています。
今後も先入観を持たず次世代の人材を育てられるよう、頑張っていきたいと思います。

* * *
トラストバンクでは共に働くエンジニアを募集しています！

https://www.wantedly.com/companies/trustbank/projects
新卒エンジニアがコードレビューを受けて学んだ読みやすいコーディング

本記事は[QualiArts Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qualiarts) 17日目の記事です。

22新卒Unityエンジニアのmapleです。
現在所属している[IDOLY PRIDE](https://idolypride.jp/)のチームでは、1つのプルリクエストに対して最低２人のコードレビューを受けてApproveをもらう必要があります。
そんな環境で私が約半年間、コードレビューで指摘されて重要だと思った読みやすいコーディングについてまとめてみました。

# 命名
命名を考える上で大事なことは、**役割がハッキリ分かる名前をつける**ことです。
十分に意味が伝わらない命名、複数の意味合いが取れるような曖昧な命名は避けることが好ましいです。

## 変数、プロパティ
変数やプロパティの命名は、どんな目的で使用するものなのかを意識すると良いです。
どのような場面で用いられるのかをすぐにイメージできる命名が適切と言えます。

### 必要な情報を含める
例えば、`Data`、`Info`、`Item`、`File`などは、どんな情報が含まれているのか分からず、どんな使い方をしたいのか想像しにくいと思います。

「**修飾語＋名詞**」の形式で命名すると伝わりやすくなります。
例：
`CharacterName`
→ キャラクターの名前であることが分かる
→ 名前だからString型だと想像できる

`StageClearRewards`
→ ステージをクリアした際にもらえる報酬であることがわかる
→ 複数形だから配列やList系だと想像できる


## メソッド
メソッドは「何かをする」という動作がある処理なので、基本的に**動詞を先頭**に付けます。
何をどうする処理なのか、どんな値を返すのかを意識すると良いと思います。

#### よく使う動詞
データの反映系のメソッドによく使う動詞の使い分けを紹介します。
- Get
    - 何かを取得して返す場合に使う
    - 万能に使えそうだけど、取得の意味が広い単語なので使用する場面で要検討
- Initialize
    - 最初の１回だけ処理を行う場合に使う 
- Set
    - データを入れたい場合に使う
    - 最初の１回だけの場合はInitialize、何回か使いたい場合はSetで使い分ける
- Show
    - 表示・非表示を切り替える場合に使う
    - 引数にboolを指定して、切り替えるイメージ
- Save、Remove、Clear 
    - データを保存、削除、リセットする場合に使う
- Update、SetUp
    - 何かしら更新、設定する場合に使う
    - 上記のGet、Set、Show、Save...や、他の処理を複数まとめて入れたい時に使うといい

## 英単語選びに困ったら
上記の内容でどんなシチュエーションでも対応できるわけではないため、
どんな英単語だと伝わるのか迷ったらcodicというサイトが便利です。

https://codic.jp/

# 条件式
### 早期リターン
複雑な条件式は冗長なコードになりがちで、読み解くことが難しくなる場合があります。
そんな時に、可読性・保守性を高めるテクニックのひとつとして**早期リターン**があります。
early return、ガード節、Guardなどとも呼ばれています。

処理の先頭の方にreturnを置くことで、if文などのネストを浅くすることができます。
特に、**例外的な処理を先に判定してreturn**しておくと、処理を追いやすいし、無駄な処理を省くことにも繋がります。
```cs
if (/*例外判定*/)
{ 
    // 例外処理を書く
    return;
}
// 想定した処理を書く
```
### if else をあまり使わない
上記の早期リターンを意識する上で、**処理の本流を追えるようになることが重要**です。
したがって、処理が真っ二つに割れる`else`は読み難い書き方になるため、あまり使われません。

しかし、本流が２つの処理を分けるとなったら話は別です。
処理の流れを真っ二つに分けたいのなら、`else`を使った方が「これは逆の処理だぞ」といったメッセージ性が生まれて読みやすくなります。

# メソッドを分ける
１つのメソッドでは、１つの目的の処理をすることが好ましいです。
この目的の処理を小さく分割できれば、１メソッドの処理がシンプルになっていき、一気に理解しやすくなります。
そして、処理を一言で表せるくらいに分けることで、メソッドの命名も分かりやすくなると思います。

大きな処理の流れをおおまかに把握する際に、メソッド名を順番に見ていくだけで流れを追うことができる状態になるととてもGOODです！


# 一時変数を使う
### 説明変数
欲しい変数を取得、参照する時に、コードが複雑だったり冗長になったりしてしまう場合に使います。

例：ユーザーのレベルによってプレイ可能なステージ情報が欲しい場合
```cs
var playableStages = StagesData.Where(stage => stage.requiredLevel <= UserData.Level);
```

### 要約変数
if文の条件式が複雑で何を判定しているものなのか分かり難い場合に使います。

例：スタミナを消費して何かしらプレイする場合
```cs
// プレイ可能か　：　現在のスタミナが必要スタミナより多いか
bool canPlay = requiredStamina <= currentStamina;

if (canPlay)
{
    // スタミナ消費してプレイする処理
}
```
# 最後に
本記事では、新卒エンジニアがコードレビューを受けて学んだ読みやすいコーディングについてご紹介しました。
本記事の内容は、リーダブルコードにも含まれている内容が多くなっています。
私自身、入社前にリーダブルコードを読んでいて、ある程度可読性のあるコードについて理解していたつもりだったのですが、実際に現場でコードを書いてレビューをもらうと、意識できていなかった部分が浮き彫りになりました。
そこで今回、身をもって学んで意識できるようになった要素をまとめるに至りました。

可読性に関する指摘をもらった際に、その前提知識があったことによって、レビュー内容をすんなり受け入れることができた思います。
コードの可読性・保守性について考えてたくなった方は、まずリーダブルコードを一読することをオススメします！

https://www.oreilly.co.jp/books/9784873115658/

この記事が少しでもご参考になれば幸いです。ありがとうございました。
【Laravel】Undefined class 'Log'【PhpStorm】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/a3293944-7aa7-8c4b-f113-7177dd446d3e.png)
Warningが出る場合、Laravel IDE Helperをインストールしよう

```bash
composer require --dev barryvdh/laravel-ide-helper
```

```php:config/app.php
    'providers' => [
        /*
         * Package Service Providers...
         */
        Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
```

```php:app/Providers/AppServiceProvider.php
    public function register()
    {
        if ($this->app->isLocal()) {
            $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
        }
    }
```

```bash
php artisan ide-helper:generate
```


_ide_helper.php をダウンロードだけでも大丈夫です
https://gist.github.com/barryvdh/5227822

# Undefined class 'App'
# Undefined class 'Arr'
# Undefined class 'Artisan'
# Undefined class 'Auth'
# Undefined class 'Blade'
# Undefined class 'Broadcast'
# Undefined class 'Bus'
# Undefined class 'Cache'
# Undefined class 'Config'
# Undefined class 'Cookie'
# Undefined class 'Crypt'
# Undefined class 'Date'
# Undefined class 'DB'
# Undefined class 'Eloquent'
# Undefined class 'Event'
# Undefined class 'File'
# Undefined class 'Gate'
# Undefined class 'Hash'
# Undefined class 'Http'
# Undefined class 'Js'
# Undefined class 'Lang'
# Undefined class 'Log'
# Undefined class 'Mail'
# Undefined class 'Notification'
# Undefined class 'Password'
# Undefined class 'Queue'
# Undefined class 'RateLimiter'
# Undefined class 'Redirect'
# Undefined class 'Request'
# Undefined class 'Response'
# Undefined class 'Route'
# Undefined class 'Schema'
# Undefined class 'Session'
# Undefined class 'Storage'
# Undefined class 'Str'
# Undefined class 'URL'
# Undefined class 'Validator'
# Undefined class 'View'
# Undefined class 'Vite'

# 参考

https://github.com/barryvdh/laravel-ide-helper

https://qiita.com/kadoyau/items/eae99ebe8d60182425f8

https://stackoverflow.com/questions/66282236/how-to-make-phpstorm-recognize-laravel-aliases

https://qiita.com/ngmy/items/1a8ef21c76d74c1d4dfe#ファサードのエラーの対応
CloudRunのdeploy時にResource readiness deadline exceeded.エラーが出るときの対処

# 今北産業
1. CloudRunでContainerRegistryのイメージを読み込む際に Resource readiness deadline exceeded. エラーが出る問題
1. 原因はGCSのバケットから過去にデプロイしたimageが削除されていた(コスト削減のために自分で削除してたのを忘れていた)ことだった
1. 改めてDockerイメージをContainerRegistryにデプロイし直したら、無事にCloudRunでリビジョン作成を行うことができた


# ダラダラと書く

私は最近、趣味で競馬のAIを作っています。

レース直前に自動的に予測を行うためにCloudRunを使用しているのですが、

これまで問題なくデプロイ新しいリビジョンの作成ができていたのに、急に `Resource readiness deadline exceeded.` とエラーが出るようになった。

ググってもIAMロールの話だとかはヒットするものの、権限は適切そう。

30minほど悩んでいたのですが、原因はContainerRegistryのビルドイメージがGCSのバケットから削除されていたからだったようです。

インフラエンジニアではないので詳しいことは分からないのですが、DockerイメージをContainerRegistryにデプロイすると、

GCSのバケットにビルドされたイメージが保存される？ぽい。

で、いつの間にやら容量を圧迫して課金されてしまうので、先週ころにGCSのバケットの中身をすべて削除したんでした。

それを忘れていて、CloudRunのデプロイができないと悩んでいたのでした。

改めてDockerイメージをContainerRegistryにデプロイし直し、新しいイメージでCloudRunのリビジョンを作成したら問題なく通りました。
[Laravel]ランクでソートをする方法＋子テーブルでソートする方法


# はじめに
子テーブルにあるS,A,Bのようなランクでソートをかける時に苦戦をしたので、その方法を解説します。

以下のテーブルがある前提で、このテーブルのソートについて解説していきます。
usersとuser_detailsは１対１の関係です
| users |
| ---- |
| id |
| name |

| user_details |
| ---- |
| id |
| user_id |
| rank |

# ランクでソートする方法
ランクでソートをするにはLaravelのorderbyRawを使用します。
ランクはS,A,Bという値があり、昇順でソートする場合は以下のようになります。
```php
UserDetail::orderByRaw("CASE rank
 WHEN 'S' THEN 1 WHEN 'A' THEN 2 WHEN 'B' THEN 3 END ASC");
")->get()
```

# 子テーブル＋ランクでソートする方法
以下のようにselectで子テーブルの項目を抽出してから、その値でソートをかければできます。(selectを使用すれば、リレーションの使用ができます)

```php
User::select('users.*', DB::raw('(SELECT rank FROM user_details WHERE users.id = user_details.appointment_id ) as sort_rank'))
->orderByRaw("CASE sort_rank
 WHEN 'S' THEN 1 WHEN 'A' THEN 2 WHEN 'B' THEN 3 END ASC");
")->get()
```

# 終わりに
今回、子テーブルのソートの時にjoin()を使用してもよかったのですが、リレーションが使用できなくなってしまうため、selectを使用しました。
また、with()も使用する方法が考えられましたが、with（）は最後にget()を呼び出した時にリレーション先のテーブルを結合するので、クエリビルダーのみで書くことができず、get()の後にコレクションメソッドを駆使しながらソートする羽目になりそうなので使用しませんでした。

他にいい方法などありましたら教えていただけると幸いです。
【UiPath】セレクターに動的変数を入れる方法

RPAはセレクターが重要かと思いますが、セレクターを確認し、動的変数を入れたセレクターを作成する方法を紹介します。

セレクターに変数を入れるということは、共通部品化が可能ということになり、ソースコードもシンプルになり、保守性もグーンとアップすると思います。

例えば、入力処理など、同じような入力枠が並んでいる場合です。
そういうときは、動的変数を入れたセレクターにできることが多いです。

変数を入れる場合は、まず複数のセレクターを確認します。
下記は Uipath の DEMOサイト のセレクターを取得したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/c55ae9d4-be63-733e-889e-4ba77f8841d4.png)
なんと、黄色い部分以外は全く一緒でした。
・・・ということは、黄色い部分を変数にしてしまえば、「タイトル」「金額」を入れることにより、セレクターが変化することになります。

以下のセレクターの確認の仕方を紹介します。

## セレクターの確認

TypeInto アクティビティを使って確認します。
選択オプションの UI Explorer をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/81e225f1-f964-3deb-4856-9ef469c18c13.png)
「要素を選択」をクリックし、対象の入力欄を選択するとそれぞれのセレクターが確認できます。
その際、右側の aaname は使えそうなので、レ点を入れておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/b1f089e4-784a-0772-a8d9-62c4e7473830.png)
UI Explorer の画面で、
こうして調べていくと、セレクターの違いが確認できます。
再びですが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/1d7d8e0e-9671-4f35-940a-fe429abd0894.png)
黄色い部分以外は全く一緒なので、黄色い部分（aaname）を変えてみたら、いいのではないかと気づくと思います。
UI Explorer で aaname の項目名を「タイトル」→「金額」に変更し、「検証」、「強調表示」と押してみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/5d8d0f66-b8e6-6e71-0cf2-3a84c741a778.png)
強調部分が変わったことが分かります。
このコードが動的変数に置き換えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/a487bb26-75c8-ffa6-7842-af074ea82289.png)
aaname が追加されたセレクターを「保存」します。

ここから、変数を入れていきますが、先に変数を作成しておかなければなりませんので、
一旦保存して
### 変数（String）
を作成してください
また、セレクターを開いて、対象の項目名をドラックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/833a70e0-da59-9cdd-932b-435b7ffe020f.png)
その上で右クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/4b7e88a5-8de5-cf05-77e1-f12a6d911e08.png)
▼ プルダウンメニューから、対象の変数を選択します。
その後、「確認」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/4eb944fb-4a67-2185-aa02-80f31a4c8354.png)
「確認」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046355/68525ee8-31f7-c28e-4752-3e9e6cd686f0.png)

これで、完了です。
このアクティビティの変数に項目名を代入すれば、セレクターとして機能します。


### 感　想
初めて、Qiitaに投稿しました。
書き方慣れなくて、はじめ「投稿する」を押してみたら、全部消えてしまいましたー！！
また、頑張ります。
Docker build時のpnpm installで名前解決ができない

 # request to https://registry.npmjs.org/pnpm failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org への対処
詰まったのでメモ

# 概要

docker build時に以下のようなエラーが出た。筆者はDockerをUbuntuのsystemdで動かしている。

### pnpm の場合
```
 > [builder 4/4] RUN corepack enable pnpm && pnpm install && pnpm build:
#0 5.617 Internal Error: Error when performing the request
#0 5.617     at ClientRequest.<anonymous> (/usr/local/lib/node_modules/corepack/dist/corepack.js:16064:20)
#0 5.617     at ClientRequest.emit (node:events:513:28)
#0 5.617     at TLSSocket.socketErrorListener (node:_http_client:494:9)
#0 5.617     at TLSSocket.emit (node:events:513:28)
#0 5.617     at emitErrorNT (node:internal/streams/destroy:151:8)
#0 5.617     at emitErrorCloseNT (node:internal/streams/destroy:116:3)
#0 5.617     at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
```

### npmの場合
```
 > [builder 3/5] RUN npm install -g pnpm:
#0 85.86 npm ERR! code EAI_AGAIN
#0 85.86 npm ERR! syscall getaddrinfo
#0 85.86 npm ERR! errno EAI_AGAIN
#0 85.86 npm ERR! request to https://registry.npmjs.org/pnpm failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org
#0 85.86 
#0 85.86 npm ERR! A complete log of this run can be found in:
#0 85.86 npm ERR!     /root/.npm/_logs/2022-12-16T16_03_50_258Z-debug-0.log
```

# 解決策

以下の記事に詳しく書かれていた。

https://robinwinslow.uk/fix-docker-networking-dns

daemon.jsonを作成して
```sh
$ sudo vim /etc/docker/daemon.json

{
    "dns": ["10.0.0.2", "8.8.8.8"]
}
```
再起動するだけ
```
sudo service docker restart
```

# まとめ

筆者はpnpmを利用しており、エラー内容でピッタリ探せる記事を見つけられす解決に時間がかかってしまった。
LovyanGFX for PC で Arduino スケッチを動かすために

LovyanGFX for PC では、setup()  や loop() などで構成される Arduino 形式のスケッチがビルドでき、PCで実行できます。

しかしながら、
@pokibon さんの LovyanGFX Advent Calendar 2022 の 1 日目や 9日目の記事では、


> ArduinoのAPIは使用できませんので、ソースコードはそのまま共通化はできません。
> 例えば、delay()関数はSleep()関数に置き換えるなどの修正が必要になります。


> Arduino固有のソースをWindowsAPIに修正
> delay() → sleep()
> StringクラスをC++のstringクラスに変更

などとあり、ちょこまかと変更をしないといけません。

また、8日目の僕の記事では

> Serial 関数はコメントアウト、またファイル入出力は元々のものをコメントアウトして、Cのスタンダードファイル入出力関数のものを別に足しています。

とあります。

Arduino/ESP32 のスケッチでは、I2C / SPI などのハードウェアに依存するようなものはさすがに実機でないといけませんが、delay とか String クラスなどは単純に変換すればいいので簡単なライブラリを作ると便利になりそうです。

# pc.hpp

以下のインクルードファイルを作りました。

```
#define millis(num) SDL_GetTicks()
#define String(num) to_string(num)
#define delay(msec) SDL_Delay(msec)
#include <stdint.h>
#include <stdlib.h>
#include <string>
using namespace std;
class SerialDummy
{
  public:
    void begin(int speed){
    }
    void print(string contents){
            printf("%s",contents.c_str());
    }
    void print(int contents){
            printf("%d",contents);
    }
    void println(void){
            printf("\n");
    }
    void println(int contents){
            printf("%d\n",contents);
    }
    void println(string contents){
            printf("%s\n",contents.c_str());
    }
};
SerialDummy Serial;


```
(2022/12/18 println(void) の記述にバグが合ったのを修正しました)

hpp ワンファイルだけで済ますように、cpp の内容も含ませていますww

これを、ユーザープログラムのソースファイルと同じ場所に置いて、ソースファイルの冒頭で

```
#include "pc.hpp"
```

を書き足せば使えます。

# 対応

とりあえず、ぱっと必要だった以下の処理を作りました。

- millis()
- String(num)
- delay(msec)
- Serial.begin(speed)
- Serial.print(...)
- Serial.println(...)

# やっていること

- Serial 関係は標準出力に出せばいいかな・・・
- 時間関係の delay とか millis は OS 依存命令ではなく、SDL 命令を使うようにしました(なので SDL ビルドのみの対応)。

ファイル読み込みに使う open とか read とかは結構違いがあるのでそれは書き換えでやってもらうことにします。

# 今後の対応

まだまだ増やしたい機能はありますが、ぱっと書けそうなので必要に応じて足してくださいww


:::note info
 2022/12/24追記
  この記事よりも、更に改良したものを、こちらで公開しましたのでお使いください。
「library for to run arduino sketch on pc」
https://github.com/nanbuwks/arduinolib_for_PC
解説はこちら
「Arduino スケッチを PC で動かすために」
https://qiita.com/nanbuwks/items/dc252066ff4cabf85573
:::
一本のトピックにまとめられなかった小ネタ集

## 事の発端
**アドカレに書くには記事が薄すぎた。**

タグに困りました。
それ以上に、各コンテンツが薄過ぎるのが悩みでした。

せっかくアドベントカレンダー用に考えたネタ達なので、本稿で供養したいと思います。

---

## 1. Nox Playerなど仮想スマートデバイスの端末情報を調べてみた
仮想スマートデバイスのgoogleアカウントを普段使いのアカウントを指定しており、googleの「スマートフォンを探す」で出てきた正体不明のデバイスを何だコレ？と言っていたんですね。
調査に4時間かかったんですが、原因が分かった＆自分だったので実害もなく良かった（ただただ自分で恥ずかしくなっただけ）んですが、

なお、設定についてはググれば出てくるので取り上げません。
ここで言いたいのは「仮想デバイスに自分のアカウントを登録した時は、他のgoogleサービスにも表示されるよ」という事です。
仮想端末名は、仮想端末だとわかりやすい名前にしておきましょう。ハード名だけにするとマジで混乱します。

---

## 2. 【研修資料増刊版】新人教育のgit研修では教えない、gitの履歴の消し方
なんで教えないのか、という話ですがgit経験者なら分かりますが、初心者がいきなりgit履歴を消せると取り返しが付かない事になります。
履歴改ざんで有名なforce pushも取り返しがつかない操作ですが、gitの履歴操作コマンドは名前の通り、過去にも干渉ができる激ヤバコマンドです。

`git filter-branch --index-filter 'git rm --cached --ignore-unmatch (消したいファイル)' HEAD`

私も頻繁に使わないので、いつもググるんですが、その度にオプションの意味なんだっけ？と勉強しなおしています。
これは`git filter-branch`と`git rm`の２つのコマンドが実行されており、前者はインデックスを書き換える時に、どんなgitコマンドを適用するか引数として与える必要があります。
後者で消し込みをするんですが、ガチャガチャやって既にファイル自体を削除（履歴は残っている）した場合でも`--ignore-unmatch`でエラーにしないようにしているとイメージ（理解）しています。
オプションは他にもありますが、基本的には上記で解決できるため、使った事はありません。

---

## 3. ソートアルゴリズムをノーコードでやってみた
見せて面白いものではありませんが、テキストに書いてある内容をコードで書く事って研修だとあまりないんですよね。
これは時間の都合上もありますが、プログラミングは後の方にやって、アルゴリズムの時にコードで書くケースが少ないからです。
言い換えると、難しい単元をやる前にステップアップしながら教えていくので、プログラミング入門の前に出てくる単元はコード化されない事が多いです。
良し悪しの話ではないですが、過去に学んだテキストの内容を研修で学び直した知識を使って読み直すと、更に理解に深さが出てくる事でしょう。

- [scratch](https://scratch.mit.edu/)
- [(Nintendo Switch)　ナビつき！ つくってわかる はじめてゲームプログラミング](https://amzn.to/3FFKNhg)
- [NodeRED](https://nodered.org/#get-started)

---

## 4. [考察]WSLの定期処理はどうやって書くべきか？
WSLの定期処理について、２通りの方法を見ていきます。

- cronから実行する場合
  - wslを実行するプロセスは落とさない（必ず１つは実行されている）
- Windowsのタスクスケジューラ機能を使う
  - `wsl`コマンドで実行されるディストリビューションは、今回定期処理で動かしたいディストリビューション
    - 違うディストリビューションを使いたい場合は、wslコマンドに引数で指定できます

使いやすい方を選択すれば良いですが、WSLを使う場合はWindowsの機能から使った方が安定しやすいので、タスクスケジューラで設定するのがおすすめです。
今回はWSLを想定しましたが、DockerであろうとHyper-Vなどであろうと同じです。

---

## 総括
小ネタ集としてまとめたら、書いていた内容の半分以上も削ってようやっとスリムになったなぁ、と思いました。
書きたい量や書きたい事だけ書き捨てる、というのにQiitaは向いてないかもしれませんね。
特にアドカレに載せる記事にしようと考えると、それなりのクオリティである必要を感じるので、そういう意味ではこの記事の各コンテンツは記事になりきれなかった（うまく記事に出来なかった）私の力不足を感じる内容と言い換える事もできます。
（テーマ的に、本当に書く事ないぞ？みたいなのもありますが）

今にして思えば、各項目に扉絵（アイキャッチ）を貼って目を引くぐらいはやっても良かったかもしれません。
アフィリエイト感が出てあまり好きなやり方ではないですが、本稿についてはテーマが大きく異なるので、読者目線でどこが区切りになるのか分かりにくかったです。

今年はもうこういったまとめ・供養記事を書く事はないですが、来年や他の記事でまとめを書く時に活かせると思いました。

## 次の記事
- [(20日目) ](#)
- [カレンダーページ](https://qiita.com/advent-calendar/2022/oreno_nomurasan2022)
# vPro対応PCを検証用仮想プラットフォームにする話(6)〜VMware vSphere Hypervior(ESXi) インストール編〜

# vPro対応PCを検証用仮想プラットフォームにする話(6)〜VMware vSphere Hypervior(ESXi) インストール編〜
## [前回](https://qiita.com/JUNKER_TOMATO/items/97d11c53bd10fdd9df80)まで
meshcommander経由で AMTの `IDE Redirect`機能を使ってVMware vSphere Hypervior インストーラISOイメージのbootまでご紹介しました。

今回は VMware vSphere Hypervior 8.0 のインストール完了までをご紹介します。<br>

実際のところ、インストーラーが起動した以降は通常のDVD-ROMメディアを使ってインストールを開始した場合と大きく変わりありません。<br>
AMTのKVMで操作した時の注意点をご紹介致します。

## VMware HyperVisor インストール 
bootメディアからのロードが終了すると、以下のような画面になります。
![6-7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/0def2795-57ce-c9f0-d692-41ef41c31789.jpeg)

`[Enter]`押下でインストールを開始します。

VMware vSphere Hypervior のインストールは基本的にキーボードで操作するTUIベースで、その流れは Version 8.0 でも変わりありません。<br>
選択項目は限られているため迷う部分はほとんどないと思います。

### MeshcommanderのAMT経由でインストールする時の注意点
MeshCommander のキーボード入力は101/104 US ASCII配列キーボードを前提としているようで、106/109日本語キーボードの一部のキー入力を認識しないようです。
![6-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/8520b456-3280-8936-d3ad-f7f5c1e56743.png)
記号の位置がズレる事象もおきます。（104/106日本語キーボードを101/104 US ASCIIキーボード配列で使った場合とは異なる奇妙なズレになります。）
予測可能なずれで対応できるよう、キーボードの言語を設定する場面では `Japanese` を選択しないことをお勧めします。
記号入力のズレはVMware vSphere Hypervior の `root`ユーザのパスワード設定時に問題になります。

Meshcommander での回避策は用意されています。KVM画面の下部バーにある`Type`を押下するとテキスト入力ボックスが表示されます。
![6-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/b62da663-c21a-77c1-644e-df728d1f5bcd.png)
入力した文字列がキー入力としてリモートに送信されます。パスワード入力時にはこの機能を使ってください。

## インストール完了
VMware vSphere Hypervior が最後までインストール完了すると、以下のような画面が表示されます。
![6-8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/fd0233a5-3782-7163-c5f7-bc4585ff4285.jpeg)

`Remove the installation media before rebooting.` を選んでも IDEリダイレクトされたISOファイルは解除されないので、再起動が始まったら、KVM画面右上の'Stop IDE-R Session'を押下してIDEリダイレクトを止めてください。

## 再起動後
VMware vSphere Hyperviorが起動してくると次のような画面になります。
![6-9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/a26d634f-31af-6421-fcf0-28fe3cc3837e.jpeg)
機種名、CPU名、メモリ容量、設定したIPアドレスが正しく表示されればAMT側でできるインストール作業は終了となります。

表示された URLにWebブラウザで Host ClientのWebUIにアクセスして、以降の操作を行なってください。

## まとめ
今回は Meshcommander経由のVMware vSphere Hypervisor インストール時の注意点をご紹介しました。

## 次回予告
MeshCommander には ファームウェア版というものがあり、vPro対応PC上のフラッシュメモリ(BIOS領域?)にインストールすることで、AMT標準Webを置き換えられるようです。検証次第、ご紹介する予定です。
Terraformで管理するAWSリソースへタグ情報を付与する際の小ネタ紹介

<!-- omit in toc -->
# はじめに

みなさん、こんにちは。AWSを利用するにあたってタグの付与は、運用管理を容易にするなどの観点から一般的に行われている設定かと思います。今回はTerraform入門としてそんなAWSタグをTerraformで付与する際の小ネタのご紹介です。

# 基本的なタグの設定方法

基本的な設定方法としてはAWSプロバイダーの定義にて、デフォルトで付与するタグを設定することです。これにより、すべてのAWSリソースへ漏れることなく付与することが可能なのでこちらを活用するのがオススメです。

```tf
provider "aws" {
  region = var.aws_region
  default_tags {
    tags = {
      owner     = "matt"
      terraform = "true"
    }
  }
}
```

# 複数パターンのタグ設定方法

「[基本的なタグの設定方法](#基本的なタグの設定方法)」では1つのパターンのみでしたが、たとえば環境を表すタグ情報などをちょっと変えたものをいくつかグルーピングしたい、といったケースもあるかと思います。そのような場合はグループごとにプロバイダー定義を用意して、各リソース定義にてプロバイダーを指定することによって期待通りの動作をさせることができます。

```tf
provider "aws" {
  alias  = "dev"
  region = var.aws_region
  default_tags {
    tags = {
      owner       = "matt"
      environment = "dev"
      terraform   = "true"
    }
  }
}

provider "aws" {
  alias  = "prod"
  region = var.aws_region
  default_tags {
    tags = {
      owner       = "matt"
      environmemt = "prod"
      terraform   = "true"
    }
  }
}

resource "aws_xxxx_xxxx" "dev" {
  provider = aws.dev
  # 以下、省略
}

resource "aws_xxxx_xxxx" "prod" {
  provider = aws.prod
  # 以下、省略
}
```

# リソース個別タグの設定方法

リソースの名前タグなどのリソースごとに異なる値となるタグについては、各リソース定義のtagsブロック内で定義します。なお、プロバイダー設定で行ったタグ設定と同じキーのタグを、各リソース定義のtagsブロックにて指定することによって値を上書きすることも可能です。

```tf
resource "aws_xxxx_xxxx" "sample" {
  name = var.resource_name
  # 途中、省略
  tags = {
    name = var.resource_name
  }
}
```

# モジュールへのタグ設定の継承方法

モジュールへタグ設定を継承する場合は、providersブロックを用いて継承したいタグ設定を行ったプロバイダーを指定することで可能です。なお、インターネット上にはモジュール側に空のプロバイダーブロックを継承したプロバイダーの分定義するといったサンプルもありますが、そちらは古いフォーマットなのでご注意ください。

```tf:メイン定義
provider "aws" {
  region = var.aws_region
  default_tags {
    tags = {
      owner      = "matt"
      workload   = "common"
      terraform  = "true"
    }
  }
}

provider "aws" {
  alias  = "web"
  region = var.aws_region
  default_tags {
    tags = {
      owner      = "matt"
      workload   = "web"
      terraform  = "true"
    }
  }
}

module "sample" {
  source "../../modules/sample"
  providers = {
    aws     = aws
    aws.web = aws.web
  }
  # 以下、省略
}
```

```tf:モジュール定義
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      configuration_aliases = [
        aws,
        aws.web,
      ]
    }
  }
}

resource "aws_xxxx_xxxx" "default" {
  # 以下、省略
}

resource "aws_xxxx_xxxx" "web" {
  provider = aws.web
  # 以下、省略
}
```

<!-- omit in toc -->
# 終わりに

普段からTerraformを触っている人からすると「なにをいまさら…」といった情報かもしれませんが、こんな記事でもだれかの助けになれれば幸いです。以上、Terraformで管理するAWSリソースへタグ情報を付与する際の小ネタの紹介でした。

---

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- Terraform は、HashiCorp, Inc. の米国およびその他の国における商標または登録商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
【俺のエディタ年表】現役エンジニア講師のエディタ変遷〜なぜそのエディタを選んだのか〜

どこに価値があるか分からないので、ちょいちょい質問がくる掲題について、理由や時代背景も含めて語っていきます。

## 一番良いエディタとは
1. 開発環境にあったものを使ってください。
1. 指定がなければ好きなものを使えばよく、
1. 好きなものがなければVSCodeをおすすめします。

上記の優先度でどうぞ。

## 言い訳
この記事を初めて書いたのがいつだったか分からないぐらい昔です、たぶん5年とかそれぐらいでしょうか。
ずっと下書きで寝かせっぱなしだったので、2022年仕様に変えてお届けします。
なお、未公開（ずっと下書き）なのでリファクタリング記事ではないです、たぶんきっと。

## 愛着があったNotepad++
カスタマイズの手軽さ、というかプラグインマネージャーですよね。タブも使えるし、ウィンドウ分割もできるし軽い！
Atomだとちょっとした事をやるだけにしては大げさだったので、敢えて使うまでもないかな、と思っていたのですが…
あとは余計な勉強コストを積みたくなかったのはあります。

### 捨てる決心をした出来事
**プラグインマネージャーを使おうとするとプラグインリストのダウンロードに失敗してNotepad++ごと落ちます。**

https://github.com/bruderstein/nppPluginManager/issues/57

私もこれにやられました。
さすがにもう解消していると思ったんですが、当時色々調べても私の環境では解決できなかったので諦めました。

### 元々やりたかったこと

* プラグイン拡張
* タブ
* ウィンドウ分割
* 比較
* 言語ごとのスタイル変更
  * 似たような内容のスクリプトを組む時[^1]
  * python, perl, rubyなどが共存している
  * 逆に統合しようとして、特定の言語へ移植する必要がある場合
[^1]: スタイル変更・似たような内容のスクリプトを組む時：たとえばshellと他の何かをさわる時

### あればいいなと思っていたこと

* 公正
* Lintっぽいもの。Rubocopとか

Atom(今はVSCodeですね。当時はAtomの方が強い時代でした)だと全部できそうですよね。
まだ調べきれてないので、分かり次第都度追加していきます。

### 導入手順
だいたいは<a href="https://eng-entrance.com/atom-editor">こちら</a>の手順通りです。
エンジニア向けのブログと違ってすごく読みやすく、分かりやすいのでこういうデザイン志向のブログは好きなんですが、いかんせん広告をチラつかされるのがたまらない人なので、そこさえなければ……。

（当時のメモはここまで下書き中でした。Atomいじってた頃だと思います）

## 2022年追記: 時代はVSCode一強に
もうNotepad++もAtomも使ってないですね…
当時はなんだかんだNotepad++は軽量でタブが使えるエディタ、AtomがLinterとか入れて使っていた全部盛り（ただし起動が遅い）IDEとして使っていたのですが、どちらもVSCodeで両立できます。はじめてVSCodeを使った当時の私がVSCodeマジかすげぇな！ってなりました。
分かる人向けですが、Java開発はEclipseだけではなく、VSCodeでも開発できますよ、と言われた時並のショックです。

今更VSCodeの解説はしません。
ただし、ここで上がらなかったエディタで操作を覚えておいたほうが良いものがあります。
EmacsとかVim、Nanoなどターミナルに標準装備しているエディタです。
つまり、GUIエディタとCUIエディタの2種類は使えるようにしておきましょう、というお話です。

ただし、チームで開発環境が決まっている場合はチームに合わせましょう。
開発環境レベルで管理されているので、過去にそれぞれのエディタを使おうとして失敗した可能性があります。

ちなみに、環境を統一したい場合にVSCodeを使う場合はsettings syncの設定を普段使いのものと異なるものを使うようにする必要があります。
実際に運用する前にバックアップをかならず手元に持っておくようにしましょう。

## 次の記事
- [(18日目) 勉強会で「LT会」というと参入敷居を感じさせるので「ポエム会」って呼ぼうぜ](https://qiita.com/nomurasan/items/9e4e67c588d3dfde4ead)
- [カレンダーページ](https://qiita.com/advent-calendar/2022/oreno_nomurasan2022)
Terraformでcountやfor_eachを使って定義したリソースをimportする方法

# はじめに

みなさん、こんにちは。今回は既存のリソースを`terraform import`コマンドを使ってTerraform管理下へインポートする際の小ネタの紹介です。

Terraformで実装する際、たとえば複数のリージョンやアベイラビリティゾーンに同様のリソースを配置する際などのユースケースにおいてcountやfor_eachを活用されている方も多いかと思います。このcountやfor_eachを活用して定義したリソースに対して、既存環境を素直にTerraform管理下へインポートしようとすると次のようにコマンドがエラーになってしまいます。今回はそんなときの解決方法を紹介したいと思います。

```txt:エラー時の出力例
$ terraform import google_compute_subnetwork.private["tokyo"] \
    ${GOOGLE_PROJECT}/asia-northeast1/matt-private-snet-tokyo
╷
│ Error: Index value required
│ 
│   on <import-address> line 1:
│    1: google_compute_subnetwork.private[tokyo]
│ 
│ Index brackets must contain either a literal number or a literal string.
╵

For information on valid syntax, see:
https://www.terraform.io/docs/cli/state/resource-addressing.html
```

# countやfor_eachで定義したリソースをimportする方法

結論から言いますと **「'(シングルクォーテーション)で定義したリソース名を囲む」** が1つの解となります。  
出力例のように、Terraformリソース名を'(シングルクォーテーション)で囲んであげると期待通りに既存のリソースがインポートされる動きとなります。めでたしめでたし。

```txt:成功時の出力例
$ terraform import 'google_compute_subnetwork.private["tokyo"]' \
    ${GOOGLE_PROJECT}/asia-northeast1/matt-private-snet-tokyo
Acquiring state lock. This may take a few moments...

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

Releasing state lock. This may take a few moments...
```

# 余談、ウッカリ違うリソースへimportしてしまった時は

そんなときは一旦ウッカリimportしてしまったリソースをTerraform管理下から外し、正しいリソースへimportしなおしてください。Terraform管理下から外す際の手順は、次の記事を参照していただければと思います。

https://qiita.com/chacco38/private/d731a86fcb0626cb958b

# 終わりに

いまさらの情報でしたがいかがだったでしょうか。グーグル先生に聞けば一発かも知れませんが、わが身にも起きた事象だったので一応記事にしてみた次第でした。こんな記事でも誰かの手助けになれば幸いです。

以上、既存環境を`terraform import`コマンドを使ってTerraform管理下へインポートする際の小ネタの紹介でした。

---

- Terraform は、HashiCorp, Inc. の米国およびその他の国における商標または登録商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。