OmniAICreator/Qiita-1.07M huggingface dataset:
M1MacでマイクラMOD開発環境を作ったときにはまった

ブログで解説記事などを書いています⬇️

https://www.chickensblog.com/


<h1>環境構築にかなり手間取った。。</h1>
<p>とにかく環境構築につまづいて、ビルドエラーばっかでてたので、簡潔にまとめていきます。詳しいことは後で追記していくつもりです。
</p>
<h2>JAVA_HOME（環境変数）の設定をしっかりする</h2>
<p>結局のところちゃんと設定できたのか怪しいですが、環境変数をしっかり設定しておきましょう。(自分のやり方は間違っている可能性があります。ご了承ください)</p>
<p>bash_profileについて</p>
https://qiita.com/s_hino/items/a185deb4f9fc31c0f5e2
この記事の1. .bash_profileを開くを参考にしてください。自分の場合、open ~/.bash_profileとコマンドを実行しても何も開きませんでしたので、この記事を参考にbash_profilを作って見てください。
<p>環境変数の設定</p>
https://chibicat.hatenablog.jp/entry/2019/04/11/005813
この記事の環境変数の設定という部分から、JAVA_HOMEという変数を設定してください。自分の場合、「export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)」をコマンドラインで実行してもパスが変わらなかったので「export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk
(自分がダウンロードしたファイル名)/Contents/Home"」のように変数に直接パスを入れました。
<br>
（推奨はできないかもしれません。どうしても無理な場合やってみてください）
<h2>いらないバージョンのJDKはアンインストール(※やらなくてもいいかも)</h2>
https://note.com/azila/n/ne34015408a2c
<p>/usr/libexec/java_home -VでJDK一覧表示の際のポイント</p>
<p>これがひっかかりましたが、JDKのインストール状況一覧をコマンドで開き、一番したにあるJDKのバージョンから指定して削除コマンドを使っていってください。自分の場合、上のファイルを選択して削除コマンドを使っても削除できませんでした。</p>
<h2>./gradlew eclipseが使えない→IntelliJ IDEAを使う</h2>
<p>https://qiita.com/niwasawa/items/ca565091468abce48f53

コマンドラインで./gradlew eclipseのエラーが出た場合は、IntelliJ IDEAに取り込んで一回ビルドしてもらう。開くとopenファイルみたいな選択ボタンがあるので、それにダウンロードしてきたforgeを洗濯します。（確か勝手にビルドが始まったような気が。。数分かかります。結構長めです。）./gradlew genIntellijRunsならIntelliJ IDEAで使用可能。
<h2>再現性の高いバージョン
<p>forgeバージョン
・1.15.2-31.1.0-md
マイクラ
・1.15.2
JDK
・1.8.0_201

<strong>現在この環境でしかやっていないため、他のバージョンの場合も後々追記していきます。</strong>
<h2>ビルド後、IntelliJ IDEAでの起動の仕方</h2>
<p>IntelliJ IDEAを使って、マイクラを立ち上げます。この時、IntelliJ IDEAな内のターミナルで「./gradlew runClient」と入力してもエラーが出たので、GradleタブからTasks/fg_runs/runClientをダブルクリックすると起動できました。</p>
<h2>マイクラランチャーでバージョンの構成を追加する必要なし</h2>
<p>後々構成追加はいると思いますが、最初にIntelliJ IDEAを使ってRUNすれば、勝手にマイクラが立ち上がってくれます。（ランチャー起動しておいた方が良いかもしれません。）</p>
<h2>IntelliJ IDEAでnewを選択してもパッケージがでない時</h2>
![スクリーンショット 2021-03-31 10.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964269/6915aa17-4d3b-730f-3b0b-e11b5e5bdd9e.png)
そのファイルの上で右クリックでmark directory asからsources Rootをクリックするとパッケージが表示されるようになります。
Railsでcreated_atやupdated_atなどの日時をフォーマットで表示するにする方法

#はじめに
Viewの部分でテーブルからcreated_atやupdated_atを呼び出し表示させると、以下のようになってしまいます。

```index.html.erb
  # 省略
  <td><%= user.id %></td>
  <td><%= user.name %></td>
  <td><%= user.email %></td>
  <td><%= user.age %></td>
  <td><%= user.introduction %></td>

  #updated_at
  <td><%= user.updated_at %></td>

  #created_at
  <td><%= user.created_at %></td>
  #省略

```

![日時がおかしい](https://i.gyazo.com/6c5eabc2572f29d936b78b013a2ad487.png)

日時が書かれている右側に「UTC」という文字が表示されてしまっています。
実は、何も設定しないと、日本時間ではなく、世界標準時間（UTC）が表示されてしまうからです。
今回は世界標準時間から日本時間に変更する方法を紹介します。

#時間を日本時間にする
日本時間にするには、```config/application.rb```を編集する必要があります。このファイルに、
```config.time_zone = 'Tokyo```
を加えます。

```config/application.rb
require_relative "boot"

require "rails/all"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Myapp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.1

    # Configuration for the application, engines, and railties goes here.
    #
    # These settings can be overridden in specific environments using the files
    # in config/environments, which are processed later.
    #
    # config.time_zone = "Central Time (US & Canada)"
    # config.eager_load_paths << Rails.root.join("extras")

    #以下のコードを加える
    config.time_zone = 'Tokyo'
  end
end
```

すると、以下のようになります。

![時間が日本時間になった](https://i.gyazo.com/53b1d8376cbea421c559fed260fab324.png)

日本時間に変更はされました!
が、今度は「+0900」と表示されています。これは、世界標準時間との時差を表しています。
これも表示させてくありません。さらに、「2021-03-23」のような表示より、「2021年03月30日」と表示させた方が、日本人にはみやすいのでフォーマットを使って表示を変更させていきます。

#フォーマットを指定して見やすくする
フォーマットを指定するには新たにファイルを作成する必要があります。```config/initialize```に```time_formats.rb```ファイルを作成し、以下のフォーマットを記入します。

```config/initialize/time_formats.rb
Time::DATE_FORMATS[:datetime_jp] = '%Y年 %m月 %d日 %H時 %M分'

```

コードを記入したら、最後にviewを以下のように変更します。

```index.html.erb
  #省略
  <td><%= user.id %></td>
  <td><%= user.name %></td>
  <td><%= user.email %></td>
  <td><%= user.age %></td>
  <td><%= user.introduction %></td>

  #to_s(:dateTime_jp)を加える
  <td><%= user.updated_at.to_s(:datetime_jp) %></td>
  <td><%= user.created_at.to_s(:datetime_jp) %></td>
　 #省略
```

viewを変更して再起動すると、

![フォーマットが適応された！](https://i.gyazo.com/6ca9dfdfed8832c8ac62d8e2531fb144.png)

しっかりフォーマットが適応されています。
各種スイッチの違い


## はじめに

L1、L2、L3、L4、L7スイッチの違いについて、まとめています

### スイッチとは

- ネットワークにおける交通誘導員のこと
- データの中身を見て、行き先を案内してくれる

L=レイヤの略で、OSI参照モデルの各レイヤに応じて、データの振り分けを行うスイッチが存在します

## 各スイッチについて

## L1スイッチ

物理層に対応するスイッチを指します

- あまり一般的ではない
- ケーブルのinput、outputを中継するためのポートが並んでいる「パッチパネル」がこれに当たる
- 大規模な環境において、例えば機器を一台増やす際などの配線の管理がしやすくなる

## L2スイッチ

データリンク層に対応するスイッチを指します

- 主な中継情報はMACアドレス
- 宛先となるMACアドレスを見て、適切なポートにフレームを転送する
- ネットワークの中継機器であるスイッチングハブがこれにあたる
  - 各ポートに接続されている端末のMACアドレスを、フレーム送信時にMACアドレステーブルに記憶し、当該の通信とは関係のないポートへ信号が流れるのを防止する
  - ただし、L2スイッチ内のMACアドレステーブルに、該当するMACアドレスが存在しない場合はブロードキャスト（一斉通信）する

:::note info
小規模拠点や一般家庭では、L2スイッチで構成されるケースがほとんどです
:::

:::note info
また、仮想スイッチとして構築される場合もあります
1台の物理サーバ上で複数の仮想マシン(VM)を動作させる際に、仮想スイッチとして構築され、各VMの仮想NICが接続されます
:::

## L3スイッチ

ネットワーク層に対応するスイッチを指します

- 主な中継情報はIPアドレス
- L2スイッチとの違いは、IPによるルーティングを行うかどうか
- 宛先となるIPアドレスを見て、適切なポートにパケットを転送する
- デフォルトルートを設定することで、L3スイッチのルーティングテーブルに書かれているIPアドレスが存在しない場合、デフォルトルートに繋がるポートへと転送する

## ルータとL3スイッチの違い

LANを超えて通信するという点は同じだが、以下の点が異なる

- ルータはLANとWANの境界に設置するのに対し、L3スイッチはLAN内に設置する
- ルータの場合はNAT/NAPTの機能を備えている
  - プライベートIPアドレスを使うLANとグローバルIPアドレスを使うWANの間でパケットのやり取りを行う必要がある為
- ルータの場合はVPNや外部からの通信を制限する機能がついていることもある

:::note info
ルータの場合はWANやインターネット接続に特化した機能がついています
:::

## L4スイッチ

トランスポート層に対応するスイッチを指します

- 主な中継情報はTCP／UDPのポート番号
- 複数サーバーへの負荷分散や、セッションの最適化を行える
- 宛先となるTCP/UDPポートを見て、適切なサーバーにパケットを転送する

## L7スイッチ

アプリケーション層に対応するスイッチを指します

- 主な中継情報はパケットの中身
- クライアントから見たときの接続先IPアドレスはLBのIPアドレスとなる
- Cookieを利用したスティッキーセッションを行うことも可能

:::note info
スティッキーセッションとは、Cookieに割り振り先を指定する事で、ロードバランサがリクエストを振り分ける際に、特定のクライアントからのリクエストを特定のサーバに紐付けることが出来る機能です
:::

- 他にも、クライアントのアクセス先のURLに応じて処理するWebサーバーを振り分ける処理が可能

## L4、L7スイッチの共通点

- ロードバランサはL4スイッチ、L7スイッチのことを指す
  - 負荷分散する際にサーバーの死活監視を行っている点が特徴

:::note info
L4スイッチの場合、特定サーバーのIPやTCPポートの組み合わせを監視し、応答が無くなると当該ポートの機能停止を判断し、一時的に負荷分散の対象から外したりします

※L7スイッチも同様に、特定URLを監視しています
:::

## （おまけ）L5、L6スイッチはないの？という話

セッション層、プレゼンテーション層に対応するL5,L6スイッチは調べた限りでは存在しませんでした

## 参考文献

[インフラエンジニアの教科書](https://www.c-r.com/book/detail/935)  
[ネットワーク超入門講座 第5版](https://www.sbcr.jp/product/4815616199/)
Cypressでフォーム入力前後の要素の有無をチェックしたい

Vueをつかったアプリを開発しているときにページ内要素をリアクティブに切り替える実装をよく目にします。
たとえば問い合わせフォームで、**送信後に「ありがとうございました」という文面を表示させようとしたけど、`v-else`の外に出てしまって送信前の画面に表示されちゃった！** というミスは、cypressに助けてもらいたいですね。


```ContactForm.vue
<template>
  <div class="contact-form">
    <h1>お問い合わせ</h1>
    <div v-if='!sent'>
      <input type='text' class='user-name' v-model='userName'>
      <input type='email' class='user-email' v-model='userEmail'>
      <button @click='sent = true' :disabled='!isValidForm'>送信する</button>
    </div>
    <div v-else>
      <p>{{userName}}</p>
      <p>{{userEmail}}</p>
    </div>
    <p>ありがとうございました</p>
    <!-- ↑ v-elseの外に出てしまった。うっかりミス！！ -->
  </div>
</template>

<script>
export default {
  name: 'ContactForm',
  data() {
    return {
      userName: '',
      userEmail: '',
      sent: false
    }
  },
  computed: {
     isValidForm: function() {
      return this.userName.length> 0 && this.userEmail.length> 0
    }
  }
}
</script>
```

送信前の状態と、送信後の状態をテストで記述しておけば、cypressさんがきっちり叱ってくれました！

```contact_spec.js
describe('お問い合わせフォーム Test', () => {
  it('問い合わせを送信できる', () => {
    cy.visit('http://localhost:8080')
    cy.contains('お問い合わせ')

    cy.contains('送信する').should('be.disabled')
    cy.contains('ありがとうございました').should('not.exist')

    cy.get('.user-name')
      .type('歳府れす')
      .should('have.value', '歳府れす')

    cy.get('.user-email')
      .type('fake@email.com')
      .should('have.value', 'fake@email.com')

    cy.contains('送信する').click()
    cy.contains('ありがとうございました')
    cy.contains('送信する').should('not.exist');
  })
})
```

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/61f75c85-6b38-a3d4-9ff8-d12253dfd754.png)

ケアレスミスはいくら注意していても起こるときは起こる（特に起こしやすい人ｗ）
なので、こういった仕組みでカバーできるようにしておくとケアレスミスが多い日も安心ですね！
【VBA】セルの値の取得

# ◆セルの値の取得

Range.Valueは変数のように読み書きできる。

```vb:セルの値の取得
Sub sample()
    'A1に100を代入
    Range("A1").Value = 100
    'A1の値（100）を取得してxに代入
    x = Range("A1").Value
    'xの値を表示
    MsgBox (x)
End Sub
```
debian10 に gradleをインストールする

##前提 Java SE8以降がインストールされている
https://qiita.com/witchcraze/items/91a38f7e9a4cb0505949

## gradleをダウンロード
```
$ wget https://services.gradle.org/distributions/gradle-6.3-bin.zip -P /tmp
```

## 解凍する
```
$ sudo unzip -d /opt/gradle /tmp/gradle-*.zip
```

## 中身を確認
```
$ ls /opt/gradle/gradle-*

bin  init.d  lib  LICENSE  NOTICE  README
```

## PATH環境変数の構成

```
$ touch /etc/profile.d/gradle.sh
$ vi /etc/profile.d/gradle.sh
```

## 作成したgradle.shに追記

```gradle.sh
export GRADLE_HOME=/opt/gradle/gradle-6.3
export PATH=${GRADLE_HOME}/bin:${PATH}
```

## 実行可能にする
```
$ sudo chmod +x /etc/profile.d/gradle.sh
```

## 環境変数を読み込み&インストール確認

下のようなメッセージが出れば完了

```
$ source /etc/profile.d/gradle.sh
$ gradle -v

Welcome to Gradle 6.3!

Here are the highlights of this release:
 - Java 14 support
 - Improved error messages for unexpected failures

For more details see https://docs.gradle.org/6.3/release-notes.html


------------------------------------------------------------
Gradle 6.3
------------------------------------------------------------

Build time:   2020-03-24 19:52:07 UTC
Revision:     bacd40b727b0130eeac8855ae3f9fd9a0b207c60

Kotlin:       1.3.70
Groovy:       2.5.10
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.9.1 (Debian 11.0.9.1+1-post-Debian-1deb10u2)
OS:           Linux 5.4.72-microsoft-standard-WSL2 amd64
```

## 参考
https://linuxize.com/post/how-to-install-gradle-on-debian-10/
【github】remote: Invalid username or password.の解決方法

commitしようとした時にエラーになったのでメモとして残しておきます。


## エラー発生までの流れ

#### ①下記画像のようにリポジトリを新しく作成

![スクリーンショット 2021-04-19 15.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/3c3251c7-4a99-a918-73e9-39e76b067d37.png)

#### ②作成できると下記画像のような画面になる

![スクリーンショット 2021-04-19 15.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/fdb315dc-41c9-1cdc-41b4-aafabd7221cb.png)

先に伝えておくと、ここで赤枠の部分を見ていただきたいのですが`HTTPS`を選択しています。
これがそもそもの間違いで、今回の場合は`SSH`を選択するべきだったのです。
`SSH`を押下して選択すると下記画像のようになります。

![スクリーンショット 2021-04-19 15.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/fcbd2fc3-11bb-c358-b426-95c9048ca31b.png)

何が変わったかというと認証方式が違うのです。
リモートリポジトリの名前の部分も変わっています。

```
HTTPS->https://github.com/×××/test.git

SSH->git@github.com:×××/test.git
```

詳細は後述しますので一旦流れを進めます。

#### ③最初のcommitをしようと試みた

```ターミナル
git init

git add .

git commit -m "first commit"

git branch -M main

git remote add origin https://github.com/×××/test.git

git push -u origin main
```

#### ④エラー発生

```
remote: Invalid username or password.
```

上記のようにユーザー名もしくはパスワードが違うとメッセージが出ました。
そんなはずはないので困りました。

## 解決までの流れ

#### ①まず下記の記事で記載されている通り設定を確認しました。
[GitHub へのアクセスで remote: Invalid username or password と言われたので、git remote set-url でリポジトリを指定した。](https://qiita.com/pugiemonn/items/a804682db9ce9316756e)

```ターミナル
git remote -v

origin https://github.com/×××/test.git(fetch)
origin https://github.com/×××/test.git(push)
```

httpsで設定してはいけなかったことにここで気づきました。(あくまで今回の場合です)

なので、変更を実施しました。

```ターミナル
git remote set-url origin git@github.com/×××/test.git
```

上記のコマンドを実行すると下記のようにSSHでの認証方式に変更されます。

```ターミナル
git remote -v

origin git@github.com:×××/test.git(fetch)
origin git@github.com:×××/test.git(push)
```

この状態で再度`git push -u origin main`を実施。
しかしエラー...

#### ②SSH鍵の認証ができているかを確認

下記コマンドで確認しました。

```ターミナル
ssh -T git@github.com
```

そうすると以下のようなメッセージが出ました。

```
Hi <username!> You’ve successfully authenticated, but GitHub does not provide shell access.
```

SSH認証はできているようです。

## 解決方法

SSH認証はできている、設定もSSH認証にした、ということで以下の方法で解決することができました。

該当のディレクトリで下記のコマンドを実行します。

```ターミナル
rm -r ./.git
```

そのあと、再度以下のコマンドでcommitをします。

```
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:×××/test.git
git push -u origin main
```

できました！


`rm -r ./.git`
このコマンドは.gitというgitの設定？などのファイルを一旦削除するというコマンドのようなので実行するディレクトリは気をつけなければいけません。
それから、今回はまだcommitしていないからこのコマンドを使えましたが、毎回使ってはいけないそうです。


先輩たちに感謝！
UIPickerView swift

#■UIPickerViewとは
縦にスクロールして項目を選ぶやつ

![スクリーンショット 2021-04-19 23.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099804/36f27962-5f86-5785-2dd2-754599888aeb.png)


#■基本的に2つのprotocolを記載しデリゲートメソッドを使う。
まずはUIPickerViewDatasource

``` swift
extension ViewController: UIPickerViewDataSource {
    //縦の列の数を決める。
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    //行の数を決める。 基本配列の中身の数を指定
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return weatherManager.prefecturesArray.count
    }
}
```

次にUIPickerViewDelegate

``` swift
extension ViewController: UIPickerViewDelegate {
    //配列の中身をUipickerに表示　Array[row] rowは配列の中身の数ぶん,数字が入る。配列の中身が10個なら0~9のインデックス番号
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return weatherManager.prefecturesArray[row]
    }
    
　　//スクロールして選択 didSelectRowのrowは選択した配列の中身のインデックス番号になる。
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let selectPrefecture = weatherManager.prefecturesArray[row]
        weatherManager.getprefecture(for: selectPrefecture)
    }
}

```

基本はこんな感じ
debianで環境変数JAVA_HOMEを設定する

##インストール後
https://qiita.com/witchcraze/items/91a38f7e9a4cb0505949

##パスを通す
```
$ cat >> ~/.bashrc <<'EOF'
# set JAVA_HOME adn append PATH

JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH
EOF
```

##適用
```
source ~/.bashrc
```

##確認
```
echo $JAVA_HOME
```
【Workato】PubSubコネクター

##PubSubモデルとは???
Publisher/Subscriberモデルの短縮で、Publisherはキューにメッセージを投げる、Subscriberはキューに入ったメッセージを抜き取る、というアーキテクチャを示します。
![Untitled presentation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/47fc81a6-338a-4d5b-ac21-b32bbd2eeadf.jpeg)
Publisherは誰がSubscriberなのかを全く意識せず、ただただキューにメッセージを投げ込みます。
Subscriberも誰がPublishしたメッセージなのかを考えず、ただただキューに入ったメッセージを抜き取ります。
こうすることでPublisherやSubscriberを容易にスケールできたり、依存関係の無い処理をそれぞれSubscriberにすることで並列処理を実現できます。

概念を理解するにはこちらの動画がわかりやすかったです。
https://www.youtube.com/watch?v=cvu53CnZmGI

##Pub/Subコネクター
Workatoにも「Pub/Sub」コネクターが用意されており、このモデルをレシピで表現できる様になっているます。
想定としては、新規/更新された従業員情報があったときに発生する様々な業務（総務的な業務、ITアプリのプロビジョニング、マネージャー・本人への連絡等）をSubscriberとしてサービス化することで依存関係を極力なくし、かつスケーラビリティを向上させる、といったシナリオでレシピを作成してみたいと思います。
まずはUI上でトピックを作っていきます。
![スクリーンショット 2021-04-18 13.00.11（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/1db259d1-87dc-6885-2a40-5eef26c07c99.png)

とりあえずサンプルとして「New Employee」というトピックを作成します。
こんな感じでポチポチフィールドを追加していきます。
![スクリーンショット 2021-04-18 12.59.36（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/0b2b5728-2b98-adc5-e61f-936ae84d02c0.png)

##Publish messageアクション
では、レシピで実際にこのトピックにメッセージをPublishしていきます。
トリガーはWorkday等のHRアプリを設定します。
![スクリーンショット 2021-04-18 13.03.30（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/c954c60f-fb6b-deea-2155-094acf5acabc.png)

Pub/Subコネクターの「Publish message」アクションでPublishするメッセージを作成します。
![スクリーンショット 2021-04-19 23.14.06（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/eae88579-631c-72c0-debd-0e8d4da7763f.png)

##Subscribeトリガー
次にSubscriberを作成していきます。
一つ目はアプリのプロビジョニング - つまりOktaでユーザを作成するサービスです。
![スクリーンショット 2021-04-19 23.19.45（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/aaa51480-7ffc-6ec9-712d-b802c6216c71.png)

二つ目はこんな感じでServicenowで総務的な調整をするためのチケットを作成したりするサービス。
![スクリーンショット 2021-04-19 23.20.50（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/c0fbf646-0733-ba74-652a-a8b5b52c153c.png)

最後にマネージャーやその従業員にSlack通知・メール通知を行うサービス。
![スクリーンショット 2021-04-19 23.22.09（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/353c9413-7e96-7425-f31c-c3287b4c50ad.png)

そしてこれらのレシピをスタートさせると、WorkdayにWorkerが追加されるたびにこれらの処理が全部一気に実行されます！
最終的なDependencyグラフはこんな感じです。
![スクリーンショット 2021-04-19 23.24.33（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/f9c5ffc6-5b0e-8422-28a2-985339d12f4a.png)

PublisherやSubscriberは必要に応じて増やすことができます。
使ってるうちにこんなことも自動化したい、というアイディアがあれば随時アジャイル的にどんどん自動化をスケールさせることができます。

Pub/Subのアーキテクチャ自体頻繁に必要になるものではありませんが、特定のエリアの自動化をする上では大活躍あるいは必須になる機能です。
こういった柔軟性の高さ、痒い所に手が届く機能を持っているのがWorkatoの売りの一つと言えます。
【超初心者必見】gitの使い方をマスターする①

【超初心者必見】gitの使い方をマスターする②はこちらへ
https://qiita.com/ryu110/items/9db9d95a260971ab3e41


準備：コマンドラインやターミナルを開いて下記のコマンドを入力していく。

①config設定をしていく。
ここで自分の名前を設定。今回はTAROにします。

```
git config --global user.name "TARO"
```
次に自分のemailの設定。今回はtarosan@gmail.comにします。

```
git config --global user.email "tarosan@gmail.com"
```

次はカラーをつけたい人のみ実行してください。

```
git config --global color.ui true
```

今の設定ができたかどうかを確認します。

```
git config -l
```
②様々なコマンドを確認したい場合は下記を入力すればでます。

```
git config --help
```
か

```
git help config
```

③ディレクトリを作成する時

今回のディレクトリ名はpracticeにします。

```
mkdir practice
```
次に作成したディレクトリを開きます。

```
cd practice
```

次に作成したpracticeのディレクトリにgitを使うという命令をしていきます。

```
git init
```

④ファイルを作成していきます。
③の続きからやっていきます。
ここでは作成したいファイルを入力します。
ここではindex.htmlにしています。

```
vim index.html
```
vimが使えない人は
下記を参照してください。
https://www.shangtian.tokyo/entry/2019/01/12/213343

使えた場合は、

画面が切り替わるのでそこに何でもいいので文字を入力してください。

```
hellooooooowwwww
```
書き終えたら下記のコマンドを入力して保存と終了をします。
まずは、Escを押す。その後に下記のコマンドを入力する。

```
:wq
```
保存されたか確認をします。

```
cat index.html
```
上記を入力すると先ほど保存した内容がでてきます。
windowsではcatが使えないかもしれません。
その場合の参照方法は下記のように入力すれば、先程入力した内容がみれます。

```
type index.html
```

⑥ステージングエリアに移動して、リポジトリに移動する。

次に先程までは作業エリアだったのでこれをステージングエリアに移動します。

```
git add index.html
```

ステージングエリアに移動したので、次にリポジトリエリアに移動する。""の中はコメントです。コミットする度に分かりやすいように書いています。

```
git commit -m "I moved it first time"
```

最後にコミットできたかどうか履歴を確認します。

```
git log
```
これで先ほどの内容がでてきます。

git logで下記のようなものが出てくると思います。
これはcommitの度に一意のIDが付与されています。
他には存在しない一つだけのIDです。

```
commit 19cad1ebf6bc3058b18104ca8bd80517a38c8eb7 (HEAD -> master)
```

もしgit add とgit commitを一括でやりたい場合
I added commentはコメント部分です。自分で変更できます。

```
git commit -am "I added comment"
```
seed_fu使ってシードデータを作ったのにrspecのテストを回すとシードデータが消えている


https://wally-ngm.hatenablog.com/entry/2021/04/19/233223

rspec使ったテストを書き始めたので，github actionsでのCI環境でもテストを回るようにしたところ...

rspecを実行するとシードデータが消えていることがわかりました．




## 原因

`spec/rails_helper.rb` にある以下の記述が原因みたいです．

これはテストが始まる時にmigrationがちゃんとできてるかどうか確認してデータベースのスキーマをschema.rbに合わせるみたいです．
もしmigrationを行う場合，DBを綺麗に消しちゃうみたいで，それによってseed作っても消えちゃってた様です．


```
begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
```


## 解決策1: seedをrspec実行時に作るようにする

`spec/spec_helper.rb` に以下を追記するとよいです．
`config.before(:suite)` はrspecを実行する前に1回だけ行う処理をかけるみたいです．

```
RSpec.configure do |config|
  ...
  config.before(:suite) do
      SeedFu.seed
  end
  ...
end
```


## 解決策2: Seedを作っても消えないようにする

`ActiveRecord::Migration.maintain_test_schema!` を無効にします．

`config/environment/test.rb` に以下の1行を追加します．


```
config.active_record.maintain_test_schema = false

```

この場合，migrationを`RAILS_ENV=test` と指定して回す必要もあります．
CIなどの一連の流れはこのような感じに（github actionsなどではもっと楽に`env` を指定するだけでOKです）
```
RAILS_ENV=test rails db:setup
RAILS_ENV=test  rails db:seed_fu
RAILS_ENV=test  bundle exec rspec
```


## 参考


[http://katsuyukikun.hatenablog.com/entry/2018/07/24/224251:embed:cite]


[https://qiita.com/syunk38/items/e6cc1282c5479555f748#suite:embed:cite]
【VBA】セルの塗りつぶしと解除

# ◆セルの塗りつぶし

セルの塗りつぶしはinterior.Colorプロパティを変更することで行う。
色は「色定数」若しくは「RGB値」で指定する。

```vb:セルの塗りつぶし
Sub sample1()
    '色定数での指定
    Range("A1").interior.Color = vbWhite ' 白
    Range("A2").interior.Color = vbBlack ' 黒
    Range("A3").interior.Color = vbRed ' 赤
    Range("A4").interior.Color = vbBlue ' 青
    Range("A5").interior.Color = vbGreen ' 緑
    Range("A6").interior.Color = vbMagenta ' マゼンタ
    Range("A7").interior.Color = vbCyan ' シアン
    Range("A8").interior.Color = vbYellow ' 黄

    'RGB値での指定（サンプルは色相環12分割）
    Range("C1").interior.Color = RGB(255,0,0)
    Range("C2").interior.Color = RGB(255,127,0)
    Range("C3").interior.Color = RGB(255,255,0)
    Range("C4").interior.Color = RGB(127,255,0)
    Range("C5").interior.Color = RGB(0,255,0)
    Range("C6").interior.Color = RGB(0,255,127)
    Range("C7").interior.Color = RGB(0,255,255)
    Range("C8").interior.Color = RGB(0,127,255)
    Range("C9").interior.Color = RGB(0,0,255)
    Range("C10").interior.Color = RGB(127,0,255)
    Range("C11").interior.Color = RGB(255,0,255)
    Range("C12").interior.Color = RGB(255,0,127)
End Sub
```

# ◆セルの塗りつぶしの解除

塗りつぶしの解除は次のように記述する。
interior.ColorIndexの値を変更することに注意。

```vb:セルの塗りつぶし
Sub sample2()
    Range("E1:G3").interior.Color = vbRed  

    '塗りつぶし解除
    Range("F2").interior.ColorIndex = xlNone
end Sub
```
Vue.js v-on:clickでonceとpreventを使う。

##はじめに
Vue.jsでv-onディレクティブで遊んでみた。
使い方のイメージをしながらコードを書く。

##今回使ったイベント修飾子
- .once
- .prevent

## .once 
１回だけハンドラを呼び出す。その後は反応しなくなる


## .prevent
意図しない画面遷移、画面更新を避けるために使う。

<br>
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="rm5912" data-slug-hash="VwPGdVo" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Vue.js v-on:click2">
  <span>See the Pen <a href="https://codepen.io/rm5912/pen/VwPGdVo">
  Vue.js v-on:click2</a> by morioka (<a href="https://codepen.io/rm5912">@rm5912</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
左のボタンはずっと反転しますが、右のボタンは一度反転すると反応しなくなります。
下のリンクは左も右もGoole.comにリンクを貼っていますが、
右は押しても機能しません。左はCodepenから飛べないのでエラーになりますが。。。。


<br>
####最後に
v-on:clickは省略して@clickでも、アプリケーションの中では揃えましょう。

```
<button @click="reverseMessage">メッセージ反転</button>
<button @click.once="reverseMessage">一度だけ反転</button>
```
<br>
>参考サイト
>[[メモ]Vue.jsイベント修飾子一覧(Qiita)](https://qiita.com/Yorinton/items/f7eb54f05609750da7f5)
【プログラミングコンテスト】JAVA



AtCoderに初参加してボロボロだったので次回に向けて必要そうな知識をまとめてみた
適宜追加していく

## 標準入力の取得
これがないと何も出来ない

```
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
　　　　//標準出力の1行目取得
        String first_row = sc.next();
　　　　//標準出力の2行目取得
        String second_row = sc.next();
    }
}
```

## 文字型＝＞数値型に変換
標準出力を数値として使用したい場合等に使用

```
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
　　　　//標準出力の1行目取得
        String first_row = sc.next();
　　　　//整数に変換
        Integer num = Integer.parseInt(first_row);
    }
}
```

## 文字のn番目の文字を取得
これについてはcharAtの方が良さそうだが、エラーが出て使えなかったのでsubstringで代用した。
(charAtの使い方教えて欲しい。。。)

```
String test = "ABCDEFGHIJKLMNOPQRST";
//substring(k,n)で文字のk+1からn+1番目までの文字を取得できる。
//substring(k-1,k)でk番目の文字を取得できる。
String val = test.substring(2,3);
```

## 反省点
プログラミングコンテスト初参加の結果は0点だった。。。
原因としては問題を見て解けそうだと感じた問題に挑戦していたが、作ったプログラムが実行時間超過となってしまい点数にならなかった。

反省点としては、
・参加前にトレーニング問題を解いとくべきだった。
・事前にエディター環境を用意しとくべきだった。

## 分かったこと
・ネストでfor文やWhileが2回以上入ると実行時間を超過する恐れがある
・複雑な問題でも最初は小さい数字から考えるのが良い
・簡単そうな問題でも実行時間超過にさせない為に規則性を見つけなければいけない場合がある

##参考記事
[Java]n番目の文字を取得する
https://hacknote.jp/archives/17781/
socket通信とmultiprocessingのpipeを比較する

並行処理できて、なおかつ情報をまとめて受信したい時にパッと思いついたのがsocket通信でしたが、試行錯誤した結果、`multiprocessing`の`Pipe`で実装を行いました。今回はsocketとPipeの比較をメモ程度に。
結論から言うと、送信内容をすぐに受信するのであれば両方とも変わりありませんが、受信内容をまとめて受け取る処理の場合はpipeの方が扱いやすかったです。
#socket通信のテストコード
ローカル通信を利用して、パソコン内のpyファイル同士で文字列の送受信を行います。
具体的にはサーバ側から文字列を送信し、クライアント側はまとめて受信するために受信処理を遅延させます。

```server.py
# -*- coding:utf-8 -*-
#!/usr/bin/python
import numpy as np
import socket  
import sys

#環境に応じて変更
HOST = '127.0.0.1'
PORT = 50900

socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket1.bind((HOST, PORT))
socket1.listen(1)

# コネクションとアドレスを取得
connection, address = socket1.accept()

# 文字列を3回送る
for i in range(3):
    txt = "abcd".encode('utf-8')# 
    connection.send(txt)

# サーバの処理終了防止
x = input()
```

```client.py
# -*- coding:utf-8 -*-
#!/usr/bin/python
import socket  
import time
import sys

#IPアドレスとポート番号は環境に応じて変更
HOST = "127.0.0.1"
PORT = 50900
sock1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  

#タイムアウト防止
while True:
    try:
        sock1.connect((HOST,PORT))
    except ConnectionRefusedError:
        continue
    break

# 受信処理を遅延
time.sleep(5)

# server.pyからの受信と表示
txt = sock1.recv(1024).decode()
print(txt)
```
###結果
クライアント→サーバの順に起動。

```
abcdabcdabcd
```

文字列が連なってしまって、扱うのが少々面倒くさいです。
#Pipeのテストコード
処理条件はほぼ変わらず。

```pipe.py
# -*- coding:utf-8 -*-
#!/usr/bin/python
from multiprocessing import Pipe
import time

a, b = Pipe()

# 文字列を3回送る
for i in range(3):
    a.send("abcd")

# 受信処理を遅延
time.sleep(5)

# pipeの受信と表示
print(b.recv())
```

###結果

```
abcd
```

送信した文字列をそのまま受け取ることができましたが、実際は`abcd`の文字列が後ろに待機している状態となっています。そこで、受信内容を全て受け取れるよう、以下のように変更します。

```pipe.py
# -*- coding:utf-8 -*-
#!/usr/bin/python
from multiprocessing import Pipe
import time

a, b = Pipe()
mai_list = []

# 文字列を3回送る
for i in range(3):
    a.send("abcd")

# 受信処理を遅延
time.sleep(5)

# pipeの受信と表示(ない場合はpass)
if b.poll() is True:
    while b.poll() is True:
        mai_list.append(b.recv())
print(mai_list)
```

すると、受信内容が以下のようにlist型となって返ってきます。

```
['abcd', 'abcd', 'abcd']
```

これで受信内容が扱いやすくなりました。

因みに`Pipe`における並行処理については、`multiprocessing`モジュールの`Process`を利用することで実装ができます。

```pipe.py
# -*- coding:utf-8 -*-
#!/usr/bin/python
from multiprocessing import Pipe
from multiprocessing import Process
import time

a, b = Pipe()
mai_list = []

def send(a):
    # 文字列を3回送る
    for i in range(3):
        a.send("abcd")

if __name__ == "__main__":
    sends = Process(target=send, args=(a,))
    sends.start()

    # 受信処理を遅延
    time.sleep(5)

    # pipeの受信と表示(ない場合はpass)
    if b.poll() is True:
        while b.poll() is True:
            mai_list.append(b.recv())
    print(mai_list)
```
MacのFinderを使ってRaspberry piにVNC接続する

他の記事が

- RaspiのGUI設定を利用している
- TightVNCである
- Windowsを使用している
- GUIのRealVNCクライアントソフトを新たに入れている

ばかりで，なかなかヒットしなかったので書きました


VNCとは，raspiにディスプレイを繋いでいない状態でも，Macの画面を使って仮想の画面を表示し，GUI操作できるようにするためものです．

raspiは，標準の設定でVNCをオンにすると，RealVNCが使用されるようです．しかしRealVNCを使用しようとすると，設定に一手間加えないとMacのFinderから接続できないそうです．本記事ではRealVNCを頑張って使います．

# できるようになること
- MacのFinderを使ってRaspberry piにVNC接続する
- Macに追加ソフトをインストールしない
- Raspiをできる限り標準状態に保つ(RealVNCを使う)
- Raspiはヘッドレス設定(マウスもキーボードも繋がない)である

# 環境
- Raspberry Pi 3 Model B Rev 1.2
    - Linux remocon 5.10.11-v7+ #1399 SMP Thu Jan 28 12:06:05 GMT 2021 armv7l GNU/Linux
    - $ cat /etc/debian_version  
      10.9
- Macbook Pro 16" l2019
    - macOS BigSur 11.2.3

Mac→raspiのsshはできる前提

# 設定方法

## Raspiの設定

### VNCをオンにする

設定を開く

```
$ sudo raspi-config
```

上下キーとReturnで選択してください

3 Interface Optionsを選択
![スクリーンショット 2021-04-19 22.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/2fbb2af8-2527-6cf3-2bec-312673e75a8e.png)

P3 VNCを選択
![スクリーンショット 2021-04-19 22.56.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/390e71d8-8e8e-548b-1197-0eb35ebc3452.png)

はいを選択
![スクリーンショット 2021-04-19 23.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/0b98c179-8295-bd3f-7464-2afa4beb0f7d.png)

なんか色々インストールされます
![スクリーンショット 2021-04-19 23.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/ab7b8ae5-b04e-d59e-628b-fa48f3607e5a.png)

これを聞かれたら y を押してReturn

```
続行しますか? [Y/n] y
```

### VNCの認証方法の設定

`/etc/vnc/config.d/common.custom`を編集する

```
$ sudo nano /etc/vnc/config.d/common.custom
```

```/etc/vnc/config.d/common.custom
Authentication=VncAuth
```

Ctrl+Xで離脱

### VNCのパスワードを設定

```
$ sudo vncpasswd -service
```

### VNCをrestart

```
$ sudo systemctl status vncserver-x11-serviced.service 
```

## Macから接続

フォルダへ移動 を選択
![スクリーンショット 2021-04-19 23.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/69c6cce1-b624-f742-cc34-91fbe64ba630.png)

vnc://IPアドレス:5900 に接続
![スクリーンショット 2021-04-19 23.12.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/749452b0-e355-cdce-ec35-5078100541e2.png)

パスワードを打つ
![スクリーンショット 2021-04-19 23.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/e0e7c0f8-8fb5-4186-e0df-ecffd31bbd8b.png)


以上！
　

補足
もし `Cannot currently show the desktop` エラーが出た場合は以下記事で対応可能．
https://blog.ko31.com/202004/respond-to-cannot-currently-show-the-desktop-error-for-vnc-connection-in-lazzie/
検索しやすいエラーメッセージが出てくれるので，ここに書くまでもない

# 参考サイト
公式
https://help.realvnc.com/hc/en-us/articles/360002251297-VNC-Server-Parameter-Reference-

後から調べたら同じこと書いてくれてる人いたけど，RealVNCって書いてないもんやから見つからんかった
https://www.laddy.info/2020/05/29415/
【初心者】PHP interface

#はじめに
phpでオブジェクト指向プログラミングを学んでいる初学者です。interfaceについてまとめてみました。（備忘録）

#interface基本ルール
・インターフェイスをimplements(実装)したクラスは、`class <クラス名> implements <インターフェイス名> `となる。
・インターフェイスで定義されたメソッドは必ず書かなくてはならない。
・インターフェイス内に処理は書けない。
・インターフェイスを複数implements(実装)することができる。
・インターフェイスはクラスではないため、インスタンス化ができない。

```.php
interface RockPaperScissors
{
    //インターフェイスでは、実装を伴うメソッドやプロパティの宣言はできない
    public function rock();
    public function paper();
    public function scissors();
}

class Battle implements RockPaperScissors
{
    public function rock()
    {
        echo 'グー';
    }

    public function  paper()
    {
        echo 'パー';
    }

    public function scissors()
    {
        echo 'チョキ';
    }
}

$battle = new Battle();
$battle->rock();        //グー
$battle->paper();       //パー
$battle->scissors();    //チョキ
```

##インターフェイスをimplements(実装)したクラスに、インターフェイスで宣言したメソッドを書かなかった場合

`public function scissors()`をコメントアウトすると、

```.php
interface RockPaperScissors
{
    public function rock();
    public function paper();
    public function scissors();
}

class Battle implements RockPaperScissors
{
    public function rock()
    {
        echo 'グー';
    }

    public function  paper()
    {
        echo 'パー';
    }

    //public function scissors()
    //{
    //    echo 'チョキ';
    //}
}

$battle = new Battle();
$battle->rock();        //グー
$battle->paper();       //パー
$battle->scissors();    //エラー！！！
```


`Fatal error: Class Product contains 1 abstract method and must therefore be declared abstract or implement the remaining methods ...`
インターフェイスで宣言したメソッドを書かなかったため（コメントアウト）、エラーが発生。。


##extendsとimplementsでクラスとインターフェイスの併用もできる
例えば、`class <クラス名> extends <親クラス名> implements <インターフェイス名>`のような記述が可能。

```.php
interface RockPaperScissors
{
    public function rock();
}

class Fake
{
    public function fakeAction()
    {
        echo '出さない';
    }
}

class Battle extends Fake implements RockPaperScissors
{
    public function rock()
    {
        echo 'グー';
    }
}

$battle = new Battle();
$battle->rock();        //グー
$battle->fakeAction();  //出さない
```
初心者でもDockerでWordPressの環境構築ができた！

##はじめに
この記事はDockerを軽く勉強しただけの駆け出しエンジニアが、
Docker、WordPressの勉強のために環境構築をする過程・反省を記した備忘録です。

ちなみにローカルで勉強用にWordPressを使うだけなら環境構築は Local by Flywheel と検索するとやり方が出てくると思いますが、ソフトウェアをインストールして軽く設定をしてもらうだけですぐにできます。

あくまで私はDockerの勉強も兼ねてやってみようと思った次第です。

##経緯
新たにWordPressを学び始めるにあたって、Dockerも絶賛勉強中だったため
せっかくならと得た知識をアウトプットする意味でも環境構築をDockerでやってみようと考えました。

ちなみに、何をもとにDockerを学んでいるかというと、
Udemyの「ゼロからはじめる Dockerによるアプリケーション実行環境構築」というコースです。これを現在40％ほど終わらせたところです。

https://www.udemy.com/course/docker-k/

一応リンクも貼っておきます。


##まずは自力で頑張ってみる（失敗例）
まずは作業用のディレクトリを作る（名前はなんでもよい）

```
$ mkdir WordPress/WordPress-lecture
```

次に、nginxでサーバーを立ち上げるレッスンで使った、バインドマウントを設定してWordPressイメージのコンテナを立ち上げるコードを実行しようとした（macの場合のコード）

```
WordPress-lecture $ docker run --name wordpress-lecture:ver1 \
-v /Users/（PCのユーザー名）/WordPress/WordPress-lecture:/usr/share/wordpress/html:ro -d -p 8081:80 wordpress
```
Dockerコンテナのタグの指定はここではできないためエラー。`:ver1`の部分を消して再度実行

するとエラーは起きずコンテナは立ち上がったが肝心のサーバーがないため、もちろんブラウザで localhost:8081 にアクセスしてもページは表示されず…

コンテナにnginxのイメージを追加すればいいのか？それともnginxのサーバーを立ち上げてそこにWordPressのイメージを追加したほうがいいのか？Apacheじゃなきゃダメなのか？と考えて参考になるものがないかネットを漁ってみたが、学んだことをもう一度調べ直すのにもここまでそれなりの時間を要していたため、早くWordPressの勉強に取り掛かりたかったので…

#完成されたコードを使いWordPressの環境を整える
Qiitaで探すと何人かの方々が既に試していらっしゃったのでそのコードを拝借することに

参考にさせていただいた記事
① https://qiita.com/qpSHiNqp/items/48815ed90bd474064708
② https://qiita.com/t20190127/items/3abb7c17acdc8543c8ad
③ https://qiita.com/engineer_ikuzou/items/07ff7bd7c9eabf0b3d6b

・①の記事のdocker-compose.ymlの内容を丸パクリさせてもらい、自身のWordPress-lectureディレクトリ内にdocker-compose.ymlファイルを作成

・自身の現在のディレクトリをコンテナにバインドマウントするための記述 `-.:/app` をvolumes欄に追加

・ポート番号8080は別のレッスンで使用していたので8081に変更

最終的なファイルの内容がこちら

```dockerfile:docker-compose.yml
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8081:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - .:/app
      - wordpress:/var/www/html
      - ./wp-content/themes:/var/www/html/wp-content/themes
      - ./wp-content/plugins:/var/www/html/wp-content/plugins

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

```


docker-compose.ymlファイルを置いているWordPress-lectureディレクトリからコマンドを実行

```
WordPress-lecture $ docker-compose up -d
```
（-dオプションはバックグラウンドで処理を実行させるためのもの）

doneの文字が表示され無事に成功
localhost:8081にアクセスするとWordPressのデフォルト画面が表示された！


以上
システムアーキテクト試験を受けてきました

####はじめに
* 2021年4月18日に情報処理技術者試験の中のシステムアーキテクト試験を受けてきました。
* あんまりやる気が起こらなかったので、ちゃんと勉強できなかったのですが、せっかくなので備忘録を書きます。
* 二か月後に結果を更新予定です。
<br>

###かけた時間
* 全部で25時間くらい
    * 午前Ⅱ：10時間
    * 午後Ⅰ：10時間
    * 午後Ⅱ：5時間
 <br>

####使った本   
* 情報処理教科書 システムアーキテクト 2020年度
    * 過去問集
        * 午前Ⅱは5周した
        * 午後Ⅰは1周した
        * 午後Ⅱは問3の過去問2年分を写経した
    * システムアーキテクト 午後Ⅱ 最速の論述対策
        * 午後Ⅱの論述のテクニックについての本
        * 一通り読んだ
        * 一時間くらいで読める
<br>

###勉強してみての所感
* 午前Ⅱ
    * 範囲が広すぎてまともに勉強する気が起きなかった
    * 合格ラインの6割を取るためなら、過去問だけやれば十分
    * 自分がやったのは100問（上記の本に載ってる分）だが、安心したければ150～200問位の過去問に触れておいたほうがよさそう
* 午後Ⅰ
    * 問題を解くのに技術知識はそこまで必要なく、応用情報に受かるくらいの知識があれば充分
    * 考察を必要とする問題は少なく、基本的には設問の答えに対応する箇所を問題文から抜き出す作業になる
    * たまに考察をさせてくる問題があり、解きにくく厄介
    * 問題文の構成や、解答の書き方には慣れておいたほうがよい。
        * 5年分くらい（合計20題）やれば感覚はつかめそう
* 午後Ⅱ
    * 2500文字を手書きで書かなければならない
        * 手がどのくらい疲れるか一度試しておいたほうがよい
            * 自分は二回解答を写経した
    * 設問にて求められている解答に（過）不足なく解答することが重要っぽい
        * 設問をよく読んで箇条書きで文章を作っていけばよい。
        * 解答例を眺めれば構成のイメージはつく
    * 題材を事前に決めておくほうが良いらしい
        * 題材を事前にいくつか用意しておいて、試験の場でその内容を適切に変えながら記述すると、考えるのも楽だし時間の節約になるらしい
        * 自分はやる気が起きなかったので、その場で考えることにした
<br>

###試験当日の所感
* 当日集中するのが一番大事なので、朝はよく寝た。
* 午前Ⅰ
    * 2020年秋に応用情報を取得していたので免除
* 午前Ⅱ
    * 全25問中、7問くらいは過去問で見た内容だった
        * もっと広めに過去問見といたほうが良かったかなと思った
        * 見たことないやつは、今までの知識と想像力で頑張って考えた
            * 完全に暗記ゲーのやつは無理なので諦めた
* 午後Ⅰ
    * 選択問題は、問2と問4を選択
        * 問4は、仕事が組み込みソフト分野なので無条件で選択
        * 問2は、解答欄を見たときに、「文章中から解答を抜き出す」系の問題が多く簡単そうだったので選択
        * 問4は、考察を求めてくる問題が一部あったので他にもっと良い問題の選択があったかもしれない
        * 問2は、考察を求めてくる問題がなかったので、選択してよかった。
* 午後Ⅱ
    * 仕事が組み込みソフトなので、無条件で問3を選択
    * ネットワーク化やデータ活用の話題だったため、比較的取っつきやすい題材だったと思う
    * その場で思いついた話題があったのでそれについて記述
        * 書いた文字数は、それぞれ700、1200、1000くらい
        * 一通り書き終えたら、やることなくなったので、15分くらい前に退出
    * どの科目も可もなく不可もなくなので、受かるにしても落ちるにしてもボーダーあたりになると予想
<br>

###さいごに
* ネスペみたいに知識ガチガチじゃないので、ちょっと知識があって日本語の読み書きが得意な人ならそんなに対策いらないかもしれない
* 教室が寒かった
* 手書きの試験じゃなくなってほしい
「良い質問ですね」と言われたことありますか？

最近、ありがたいことに案件の規模の拡大とともに新人のテスターさんの参画も一気に増えてきまして、立場上いろんな人から様々な「質問」をいただく機会が増えてきました。

今日はその中で気になったこととして

質問の仕方でよいテスト、悪いテストが決まる

というお話をさせていただこうと思いますので、お付き合いください。



#■ソフトウェアテストにおける「質問」とは？

そもそも「質問をする」とはどういう行動であるか。

>しつ‐もん【質問】 の解説
>［名］(スル)わからないところや疑わしい点について問いただすこと。
>また、その内容。「質問に答える」「先生に質問する」
>
>-goo辞書

辞書ではこのように定義されております。

また、弊社のように主にソフトウェアに対してのQA／検証作業を行う際の「質問」としては
例えばお客様よりご提供いただいた仕様書からテストを作り出す際、資料を拝見しただけでは情報として不十分になる場合があり、そのために行う作業が仕様確認（質問）です。

弊社ではこの仕様確認（質問）がQA作業における重要な要素として認識をしており、良いテストを行うためには良い質問を投げかけることを念頭においております。




#■2つの質問タイプ

次に質問の種類について、お話させてください。
質問には大きく2つのタイプがあります。


##1.オープンクエスチョン

オープンクエスチョンとは、「答えが明確に決まっていない質問」のことを指します。
この質問は自分が明確な回答を見出だせない場合や、相手の意見を聞いて参考としたい場合などに使われることが多く、QAの業務ではこのオープンクエスチョンを自在に使いこなすことで、テスト設計にも応用することが可能です。

##2.クローズクエスチョン

クローズクエスチョンとは、「Yes or No や確定した答えがあり、はっきりと答えを示せる質問」のことを指します。QA業務におけるクローズクエスチョンは仕様書からは読み取れない箇所について、その答えを求める際に頻繁に用いられていると思います。




**2つの質問タイプの特徴とメリット・デメリット**

![質問キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710015/83d9270e-1804-659a-4211-2f09816b7c38.png)


良いテストを考えようとした場合、オープンだけでもクローズだけでも作成することはできません。
オープンクエスチョンをたくさん考えつくことで、プロジェクトリーダーや開発者が思いつくことができなかった仕様上の問題点や再検討しなければならない運用上の考慮不足などが浮き彫りとなることが多く、結果的に品質向上のきっかけとなることがありますし、また反面でクローズクエスションで仕様の確定を進めていくことで初めてテストができるようになる箇所もあります。

必要なのはオープンクエスチョンとクローズクエスチョンの上手な使い分けと思います。




#■質問する力をつける

最後に良い質問をして、良いQAエンジニアになるための「質問する力をつける」方法を3つご紹介致します




##1.知らないことは質問する

とても当たり前のことを書いてますが、とても大事です。

- 初歩的な質問なので聞くのが怖くて質問できない
- "わからないこと”がわからなくて質問できない
- 聞いていいのかわからないので質問ができない

とてもよく聞く、質問をしない理由です。

わからないことを素直に質問するのは難しいですが、恥ずかしいことではありません。




##2.常に疑問を持つ

日常生活においてもQAにおける作業でも常に疑問を持つ、物事に対しての疑念を持つということはその後に生じる質問を生み出します。
日頃から「なぜ」「どうして」を考えていないと質問をするときにも、いざというときに

何から聞いたらいいんだろう
どこから話を切り出せばいいんだろう

と、すること自体のハードルがあがってしまうので、疑問→質問のクセを付けておくと良いかと思います。




##3.質問の上手な人をまねる

周りにいる質問をたくさんする人、質問の仕方がうまい人がする質問内容を観察して
「この人は質問が上手だな、質問をしたあとの相手からの情報の引き出し方もうまいし、話をつなげていく手法も上手」
と思える相手がいたら、どのように質問をしているかをよく観察し、自分でもその方法を取り入れてみると良いかと思います。




#■まとめ

質問が多い　＝　わからないことが多い　＝　仕事ができない

ではなく、そもそも質問をすることで理解度を深め、新たな解釈や新しい発想を導き出すことができるのです。

質問が多い人は分からないことが多いのではなくて、分からなかったことが出てきたらきちんと理解できるようになるまでその事項を処理するという事です。結果、分からないまま放置することがないので質問が多くなりますが、最終的な到達具合でいくと質問をしない人よりも質問をたくさんした人の方が習熟度が上がっていたり、より重要な仕事を任せられたりしていることが多く見受けられます。

要するに、質問は怖がらずにいっぱいすることが正解ということです。


<br>
# We are recruiting !
株式会社GENZでは現在キャリア採用を行っております。
ご興味がある方は以下をご確認ください！
[株式会社GENZ - 採用情報]
 (https://www.genz.jp/recruit/?qirecruit=20210419)
[株式会社GENZ - Software QA]
 (https://www.genz.jp/test-service-menu/?qi=20210419)
デフォルト画像を設定する方法

#はじめに
画像が登録されてない場合のデフォルト画像を設置する方法についてまとめていきます。
今回は、CarrierWave、asset pipelineを使用したやり方になります。

後半では、The asset "" is not present in the asset pipelineのエラーについて少し触れていきます。

##CarrierWaveでデフォルト画像を定義
[app/uploaders/image_uploder.rb]
このように前もってデフォルト画像を設置するためのメソッドがコメントアウトして用意されているので、必要な部分を解除する。

```
# def default_url(*args)
  #   # For Rails 3.1+ asset pipeline compatibility:
    # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.jpeg"].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end
```
解除する場所。

```
 def default_url(*args)
    ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.jpeg"].compact.join('_'))
  end
```
 "default.jpeg"の部分が、デフォルト画像のパスになります。
なので、デフォルトの画像のパスを統一してあげる作業が必要になります。

##デフォルト画像の用意
実際に使用するデフォルトの画像をapp/assets/images/の配下に保存します。
先ほどもいったように保存するときは、"default.jpeg"の名前、形式を統一する必要があります。

##ビューで呼び出し

```
 <%= image_tag '/assets/default.jpeg',:alt => 'ユーザーアイコン' %>
```

'default.jpeg'でもok
注意点としては、
・/assets/images/...とimagesを指定しないこと。
imagesを使用すると以下のような表示になる。
また、logではエラーが吐かれている。

```
ActionController::RoutingError (No route matches [GET] "/assets/images/default.jpeg"):
```
![スクリーンショット 2021-04-19 22.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613784/fec354e5-fa34-a616-3c96-accac08b63f0.png)

#まとめ
簡単ではありますが、デフォルト画像の設置方法についてまとめてみました。
少しでも参考になれば嬉しいです。

#補足（The asset "" is not present in the asset pipelineエラーについて）
アセットパイプラインが存在しないと出てしまう原因。
結論
config/envitonments/production.rbファイルの

```
  config.assets.compile = true
```
falseをtrueにしてあげる
アセットアイプラインへのアクセスを許可するみたいなイメージだと思います。

#参考資料
[CarrierWaveでデフォルト画像の設定](https://qiita.com/soehina/items/fa1893fff53fd9baaf60)
アセットパイプライン、img_tagの使い方について記載されています。
[Railsガイド](https://railsguides.jp/asset_pipeline.html)
[The asset "" is not present in the asset pipeline](https://qiita.com/masashiiwasaki/items/c4360437094177ba042d)
[GitHub/carrierwave](https://github.com/carrierwaveuploader/carrierwave)
アセット使用しない方法も記載されています。
CSSのセレクタ適用条件（AND,ORなど）

Bootstarpを使っていて

```test.html
          <ul class="nav nav-pills style-dblock">
            <li class="nav-item">
              <a class="nav-link" href="#">Active</a>
            </li>
            <li class="nav-item">
              <a class="nav-link active" href="#">Link</a>
              <a class="active" href="#">Link</a>
            </li>
         </ul>
```
のactive単体ではCSS上何も記載がないのになぜ該当の箇所の背景色が染まるのかわからなくてしれべた結果

```bootstrap.css
.nav-pills .nav-link.active,
.nav-pills
.show>.nav-link
{color:#fff;background-color:#007bff}
```
の「.nav-pills .nav-link.active」によって染まっていると知って、私の知らないCSSの使い方があると感じ調べてみました。

こちらの様式で試してみました。

```test.html
  <div class="divcss">
    <p>テスト①</p>
  </div>
  <div class="divcss">
    <p class="pcss">テスト②</p>
  </div>
  <div>
    <p class="pcss ppcss">テスト③</p>
  </div>
```

○複数のセレクタのどれかに該当する（OR条件）

```test.css
.divcss,.pcss{
  background-color: red;
}
```

![スクリーンショット 2021-04-19 22.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/0d509b4f-e6f0-aed3-bf38-74f160bad982.png)


○子のセレクタで絞り込む

```test.css
.divcss .pcss{
  background-color: red;
}
```

![スクリーンショット 2021-04-19 22.42.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/e1c3d1d3-bbd5-657c-b5db-2334f00cf966.png)


○複数のセレクタで対象を絞り込む（AND条件）※子の空白がない形

```test.css
.pcss.ppcss{
  background-color: red;
}
```

![スクリーンショット 2021-04-19 22.44.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/776874b3-e555-c8b9-438a-3ccf61fa9781.png)


調べてみるとその他にも色々あるようです。

```test.css
/*直下の子*/
.pcss > .ppcss{
  background-color: red;
}

/*隣あう子*/
.pcss + .ppcss{
  background-color: red;
}

/*以降の子*/
.pcss ~ .ppcss{
  background-color: red;
}
```

覚えるのは大変だけど、しっかり使っていきたいです。
Laravel8 Migration 無名クラスの書き方をサポート

Laravel8.37から新しく無名マイグレーションの書き方がサポートされるようになりました。
Laravel9以降はこの書き方がデフォルトになると思われます。

## 対応Laravelバージョン

- [8.37.0](https://github.com/laravel/framework/releases/tag/v8.37.0) 以降
- 9.x

## 通常のマイグレーションの書き方

```php:database/migrations/2021_04_20_000000_create_tasks_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTasksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tasks');
    }
}
```

## 無名クラスのマイグレーションの書き方

```php:database/migrations/2021_04_20_000000_create_tasks_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tasks');
    }
};
```

## 変更箇所

変わる部分はここだけです。

```
// old
class CreateTasksTable extends Migration

// new
return new class extends Migration
```

現時点では新旧どちらの書き方もサポートされているのでご安心ください。

## メリット

- クラス名の部分が無名クラスになることで、クラス名の競合問題を気にしなくて良くなります。
  - マイグレーションファイルさえ一意であればok
- マイグレーションファイル名を変更したいときにクラス名を修正する手間がなくなります。

(同じ名前のマイグレーションファイル書くんか...ってのはありますが...)

## make:migration

```shell-session
$ php artisan make:migration create_tasks_table
```

執筆時点(2021/4/20)では古い書き方のコードが生成されます。
今後新しいテンプレートになると思われます。

## スタブのカスタマイズ

新しい書き方に合わせたい場合は、スタブを変更できます。

```
$ php artisan stub:publish
```

`stub` ディレクトリが生成されます。

```
stubs/migration.create.stub
stubs/migration.stub
stubs/migration.update.stub
```

この3ファイルのクラス名の定義部分を下記のコードに書き換えればokです！

```
return new class extends Migration
```

末尾のクラスの閉じ括弧に `;` を付ける。

```
};
```

## 参考

- https://laravel-news.com/laravel-anonymous-migrations
- https://github.com/laravel/framework/pull/36906
- https://github.com/laravel/laravel/pull/5585
- https://github.com/laravel/laravel/pull/5590
とある人間の長い一日（発熱について）

# 検査当日までの経緯

- １７日（土曜日）
    - AM 7時頃　36.9℃　体に違和感有り。寒気を感じる。（妻に発熱を伝えるが信じてもらえず。正常性バイアス？）
    - PM18時頃　37.3℃

- １８日（日曜日）
    - AM 7時頃　37.3℃　
    - PM18時頃　38.0℃（妻がようやく私の発熱の現状を認めはじめる。正常性バイアス）
   
- １９日　AM 7時頃　37.7℃

# 前提

- 複数人での会食：無し（そもそも、1年以上家族以外と会食してない）

- A駅、B駅、C駅を３日間往復した。

# 検査当日の記録

- 19日朝7時現在。
  - 有り：頭痛少しあり。首の痛さあり。
  - 無し：味覚異常（コーヒー、カレーパン）無し、嗅覚異常無し、倦怠感無し、息苦しさ無し、鼻水無し、喉の痛さ無し。

- 10時53分現在　体温36.4℃（非接触型体温計）→平熱

- 10時48分　抗原検査開始　（15分かかる）

医師から次のような判断となる旨あり

```C++
if(抗原検査：陽性)
{
  PCR検査の申し込み();
}
else //抗原検査：陰性
{
  胸部レントゲン();
　血液検査();
}
```
抗原と抗体は別物のようだ。。。

**抗原検査結果** :**`陰性`**

- レントゲン撮影済
- 血液検査済（11時40分）

---

- 11時53分
    - レントゲンで炎症を認めない。異常なし。
    - `白血球数　H131`→細菌によるもの
    - `CRP　H5.02`→炎症が起きている
        - 細菌による炎症
        - 抗生物質を処方するわ（かかりつけ医師）

内臓のどこで炎症が起きているか調べるために、もう一度、採取した血液で詳細な血液検査をする。（かかりつけ医師）

- 13時34分
    - 家の予測型体温計で計ると、37.3℃だった。

- 21時45分
    - 体温：36.7℃→ほぼほぼ平熱に戻った。（抗生物質と解熱鎮痛薬を飲んだからか？）

# 反省と考察

- 人間、だれしも自分は大丈夫だろう家族は大丈夫だろう、と思うようだ。（正常性バイアス）
    - 妻に熱症状を訴えるも、発熱自体を2日目の昼すぎまで信じてもらえなかった（体温計の数字を信じなかった）。
        - 結局、私の思い込みだったのだが。
- 設計やプログラミングやデバックやシステムテストでもおなじだとおもう。思い込みは禁物である。客観的な事実（数字）を元に行動するべきだ。
- いくら、手洗い・うがい・アルコールによる手の消毒を習慣的に行っていても、熱が出る時は出る。慌てないこと。
    - まず、町の発熱外来があるクリニック・診療所に電話すること。
    - 体制の整っていない診療所は外来を断られることもあるよ（経験済み）。
        - それは自分の課題ではなく、診療所の課題である。気分を悪くしないように。。
- 周囲の人間の正常性バイアスに影響されないように、自分が決めて行動すること。
- 今日の経験から、より一層、コロナウイルス感染症対策をおこなうように、心を引き締めることができた。
    - これ以上、なにをすればいいのかは置いといて。。
    - 在宅勤務はMustだよね。。

（了）

---

2021-04-19　22:28
【試験合格記】AWS 認定ソリューションアーキテクト – プロフェッショナル(SAP-C01)

お疲れさまです。
表題の試験に合格したため記録として残したいと思います。

# 結果
合格(895点)

|分野|名称|割合|
|:-----------------|:-------------------|:-------------------|
|1|組織の複雑さに対応する設計| 12.5%|
|2|新しいソリューションの設計| 31%|
|3|移行の計画| 15%|
|4|コスト管理| 12.5%|
|5|既存のソリューションの継続的な改善| 29%|14%|

# 所有資格

| 資格名       |取得年月日 |
|:-----------------|:-------------------|
|AWS Certified Solutions Architect - Associate (SAA)|2018-06-14|
|AWS Certified SysOps Administrator - Associate (SOA)|2018-06-22|
|AWS Certified Developer - Associate (DVA)|2018-06-25|
|AWS Certified DevOps Engineer - Professional (DOP)| 2020-02-19| 
|AWS Certified Big Data - Speciality (BDS)| 2020-03-23| 
|AWS Certified Security - Speciality (SCS)| 2020-04-01| 
|AWS Certified Machine Learning - Speciality (MLS)| 2020-04-13| 
|AWS Certified Advanced Networking - Speciality (ANS)| 2020-04-27| 
|AWS Certified Cloud Practitioner (CLF)| 2020-04-27| 
|AWS Certified Database - Specialty (DBS)| 2020-09-22|
|AWS Certified Alexa Skill Builder (AXS)| 2020-12-06| 
|AWS Certified Solutions Architect - Professional (SAP)|2021-04-18|

# 所感
2018年に受験したときと比べて今時のAWSサービスがいくらか追加されてるなーと感じました。
全体的にはハイブリッドクラウドやAWSへの移行、Organizationレベルの適切な管理などがおおよそを占めており、幅広い出題範囲への対処が要求されるところは変わらないと思います。

# 受験者に向けたアドバイス
- AWS Organizationのマスターアカウントと配下アカウントの関係性を理解する
- SCPやアクセス権限の境界で出来ることを把握する
- 災害復旧(DR)を計画するにあたって起点となるリソースや設定の違いを理解する
- RDSやDynamoDBの特性を正しく理解する
- DirectConnect、VPN、VPC Peering、Transit Gatewayなどネットワークリソースの特徴およびユースケースを学ぶ
- セキュリティの最適化にNACL、Security Group、WAFなどをどのレイヤーに設置すべきか判断できるようにする
- EC2、Elastic Beanstalk、Lambda、ECSなどコンピュートリソースの特徴と応用的な使い方を理解する

# おわりに
SAPはまだ大きな改定はされておらず、マイナーアップデートされ続けている試験という印象があります。
今の時点でもSAPの試験範囲に含まれる対象のAWSサービスは非常に多く存在しているため、初取得を目指す方は改定されないうちに頑張るとよいのではないでしょうか。

再学習して久しぶりに気付いたのですが、やはりAWS試験の最難関は間違いなくこのSAPだと思います。
学習範囲と予測の難しさは脳死で学習支援サイトの問題を解いても身につかないのは間違いないでしょう。
地道に日々AWSと戯れて各サービスのベストプラクティスを理解するように心がけていく必要があると再認識しました。
【VBA】Withでコードをまとめる

# ◆Withの使い方

Withを使うとコードの共通部分をまとめることができる。
オブジェクトのプロパティを一括で設定する際に便利。

```vb:Withの使い方
Sub withSample()
    '太字、20pt、赤で塗りつぶし
    Range("A1").Value = "sample"
    Range("A1").Font.Bold = True
    Range("A1").Font.Size = 20
    Range("A1").Interior.Color = vbRed
End Sub

Sub withSample2()
    '上記はWithを用いてまとめることができる
    With Range("A1")
        .Value = "sample"
        .Font.Bold = True
        .Font.Size = 20
        .Interior.Color = vbRed
    End With
End Sub
```
dotenvはダブルクォーテーションで囲まないと改行がエスケープされる

# .env ファイルに「\」を含む文字列を記載する場合注意が必要

シェル変数にセットする時と同様に、クォーテーションの有無でエスケープの有無が変わります。
⇒改行を含む文字列(証明書など)を.envファイルにセットする場合は「ダブルクォーテーション」で囲いましょう。

> 証明書(.PEM)ファイルをシングルクォーテーションで囲うと、改行がなくなり検証で落ちます。
> Error: error:0909006C:PEM routines:get_name:no start line

```bash
# クォーテーションなし ⇒ 改行を含まない文字列(エスケープされる)
value1=abc\ndef  #abc\\ndef
# シングルクォーテーション ⇒ 改行を含まない文字列(エスケープされる)
value2='abc\ndef'  #abc\\ndef
# ダブルクォーテーション ⇒ 改行を含む文字列
value3="abc\ndef"  #abc\ndef
```