OmniAICreator/Qiita-1.07M huggingface dataset:
【ルール説明・shared】no-relative-paths

こちらの記事は[Ansible lint Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ansible-lint) 24日目の記事になります。

今回はルール [no-relative-paths](https://ansible-lint.readthedocs.io/rules/no-relative-paths/) について説明します。

### no-relative-paths

[no-relative-paths](https://ansible-lint.readthedocs.io/rules/no-relative-paths/) は [ansible.builtin.copy](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html) モジュールおよび  [ansible.builtin.template](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/template_module.html) モジュールにおいて`src`キーの要素に相対パスが含まれていないか検証します。

[ansible.builtin.copy](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html) モジュールおよび[ansible.builtin.template](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/template_module.html) モジュールでファイル操作を行う場合はファイルのパスの指定方法が決まっています。[ansible.builtin.copy](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html) モジュールを利用してファイルをコピーする場合、ファイルはプロジェクトの`files/`ディレクトリ以下に置かれている事が想定されます。`files/`ディレクトリ以下以外のパスへファイルを置く場合、パスは絶対パスで指定します。また [ansible.builtin.template](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/template_module.html) モジュールを利用してファイル操作を行う場合はプロジェクトの`templates/`ディレクトリ以下にテンプレートファイルが置かれている事が想定されます。`templates/`ディレクトリ以下以外のパスへファイルを置く場合はパスは絶対パスで指定します。

#### 問題のあるコードその１

`src`が相対パスで指定されている

```yaml
---
- name: Example playbook
  hosts: all
  tasks:
    - name: Template a file to /etc/file.conf
      ansible.builtin.template:
        src: ../my_templates/foo.j2 # <- 相対パスになっている
        dest: /etc/file.conf
        owner: bin
        group: wheel
        mode: "0644"
```

#### 修正されたコードその１

プロジェクトの`templates`ディレクトリ内のパスを指定する


```yaml
---
- name: Example playbook
  hosts: all
  tasks:
    - name: Template a file to /etc/file.conf
      ansible.builtin.template:
        src: foo.j2 # <- `templates`ディレクトリ内のパスを指定する
        dest: /etc/file.conf
        owner: bin
        group: wheel
        mode: "0644"
```

#### 問題のあるコードその２

```yaml
- name: Example playbook
  hosts: all
  vars:
    source_path: ../../my_templates/foo.j2 # <- 相対パスが指定されている
  tasks:
    - name: Copy a file to /etc/file.conf
      ansible.builtin.copy:
        src: "{{ source_path }}" # <- 変数が代入されている部分
        dest: /etc/foo.conf
        owner: foo
        group: foo
        mode: "0644"
```

#### 修正されたコードその２

```yaml
- name: Example playbook
  hosts: all
  vars:
    source_path: foo.j2 # <- filesディレクトリ内でのパスを指定する
  tasks:
    - name: Copy a file to /etc/file.conf
      ansible.builtin.copy:
        src: "{{ source_path }}" # <- 変数が代入されている部分
        dest: /etc/foo.conf
        owner: foo
        group: foo
        mode: "0644"
```

### 参考サイト

* [no-relative-paths — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/no-relative-paths/)
著書「プログラムはなぜ動くのか」を読んで。

## 駆け出しエンジニアが著書「プログラミングはなぜ動くのか」を読んだ感想

エンジニア二年目の私が最近読んで非常に勉強になった本がタイトルにもある「プログラミングはなぜ動くのか」です。

どのような内容が書いてあるかというと、プログラムが動作する根本的な仕組みについてCPUやメモリとハードディスの関係やOSとアプリケーションについて詳しく書いてあります。
技術の進歩で便利な世の中になり、ＰＣがどのような仕組みで出来ているか知らなくても簡単にアプリケーションを作成することが出来る時代です。

私もこの本を読むまでは全く理解していませんでした。この本に書いてある内容を理解していなくてもエンジニアとしては問題ないかもしれませんが、
より技術力の高いエンジニアになるためには必要な内容だと思うのでぜひ多くの人に読んでほしい内容でした。

※ちなみに第３版は高いので、第2版や第1版を中古で購入するとお安く購入できるので、お金がない方にはお勧めです。

https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC3%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2-%E4%B9%85%E9%9B%84/dp/4296000195
【CSS Battle】GiftBox 作ってみた

# はじめに
こちらは CSS Advent Calendar 2022 に参加した記事になります。

https://qiita.com/advent-calendar/2022/cascading_style_sheets

CSS Battle というサービスは知っていますか？
お題にあるデザインになるように CSS でスタイルを書くサービスになります。

https://cssbattle.dev/

今回、クリスマスにちなんで、[GiftBox](https://cssbattle.dev/play/99) に挑戦してみました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/54edf196-11b0-7228-583a-01ae76ce2815.png)

無事、100% 一致することができたので、大変満足です！
一致したコードを共有しますが、見る前にみなさんも挑戦してみることをおすすめします！

# GiftBox のコード

```html
<div id="ribbon1"></div>
<div id="ribbon2"></div>

<div class="items">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>

<style>
  body {
    background: #AC474B;
  }

  #ribbon1 {
    width: 40px;
    height: 40px;
    background: #FFFFFF;
    border-radius: 100% 100% 0% 100%;
    
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-87%, -250%);
  }

  #ribbon1::after {
    content: "";
    width: 20px;
    height: 20px;
    background: #AC474B;
    border-radius: 100% 100% 0% 100%;
    
    position: absolute;
    transform: translate(50%, 50%);
  }

  #ribbon2 {
    width: 40px;
    height: 40px;
    background: #FFFFFF;
    border-radius: 100% 100% 100% 0%;
    
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-13%, -250%);
  }

  #ribbon2::after {
    content: "";
    width: 20px;
    height: 20px;
    background: #AC474B;
    border-radius: 100% 100% 100% 0%;
    
    position: absolute;
    transform: translate(50%, 50%);
  }
  
  .items > div {
    width: 60px;
    height: 60px;
    background: #FFFFFF;
    
    position: absolute;
    top: 50%;
    left: 50%
  }

  .items > div:nth-child(1) {
    transform: translate(-117%, -67%);
  }

  .items > div:nth-child(2) {
    transform: translate(17%, -67%);
  }

  .items > div:nth-child(3) {
    transform: translate(-117%, 67%);
  }

  .items > div:nth-child(4) {
    transform: translate(17%, 67%);
  }
</style>
```

ここまで読んでいただき、ありがとうございました！
ERROR: 〇〇.whl is not a supported wheel on this platform. が出たときの調べ方

Python で `Wheel` ファイルをインストールしよとするときに、下記のようなエラーが出たときには、自分のマシーンが対応しているタグの調べ方を紹介します。

```bash
ERROR: 〇〇.whl is not a supported wheel on this platform.
```

インストールしようとしているマシンで
```python
from pip._internal.utils.compatibility_tags import get_supported
get_supported()
```
対応しているタグ名のリストを確認できます。

プラットフォームのタグ一覧は↓のページから確認できます。

https://packaging.python.org/en/latest/specifications/platform-compatibility-tags/
winsous11.Hyper-VでCentos7の仮想マシンの設定をする

・Hyper-Vのインストール

PowerShellを開き下記コマンドを実行する(PowerShellを管理者権限で起動)
```
Start-Process PowerShell.exe -Verb runas
```
Hyper-Vのインストールコマンドを実行
```
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
````

・CentOS7のISOファイルをダウンロード
(下記サイトを画面を参考にCenoOsをインストール)
![スクリーンショット_20221223_123627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/a38ac7c6-326e-9314-c101-7faa722b040a.png)


![スクリーンショット_20221223_123652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/a732c546-2459-b675-fdf5-a9a9463c5b1d.png)


・CentOSの起動準備
・Hyper-Vマネージャーを起動して仮想マシンを作成する準備
「スタート」→「Hyper-Vマネージャー」からHyper-Vを起動する。
![スクリーンショット_20221223_123736.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/6fae9da3-0969-a1ca-4835-64f4cce0edcc.png)

「仮想スイッチマネージャー」をクリック
![スクリーンショット_20221223_123757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/d5444901-0d6c-75e2-c662-c568d831ce5c.png)


「仮想スイッチの作成(S)」をクリック

![スクリーンショット_20221223_123819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/9c316e50-95d9-4f3d-b629-13f78e299345.png)


下記内容を記述
![スクリーンショット_20221223_123855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/2c965d32-5793-446b-b6a9-5c730ae16881.png)


Hyper-Vマネージャーの画面の「新規」→「仮想マシン(M)」をクリック
![スクリーンショット_20221223_123928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/6e23668b-0d90-4447-b9be-bc81db4e6da8.png)


下記の通り設定
![スクリーンショット_20221223_181614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/9d6d5740-9cd4-4d64-3cbd-933280792398.png)


![スクリーンショット_20221223_124028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/a71b7f8b-4530-f20e-5b91-5bb03ab6ac70.png)

![スクリーンショット_20221223_124047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/9a96aff6-f5c6-c51a-a5c2-a471548e6dd5.png)

![スクリーンショット_20221223_124100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/bef9a369-2aaa-d04c-4630-d614a21ab661.png)


![スクリーンショット_20221223_124433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/b4816829-2337-363c-a90d-f033d13d9cf0.png)

![スクリーンショット_20221223_124511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096726/7fdb913c-e54c-2747-f6eb-39b81cfc02a3.png)
CP4DのWatson Studioでプロジェクトの作成を禁止する

CP4DのWatson Studioで野良プロジェクトを作成させないために、ユーザーにプロジェクトの作成を禁止したいことがあります。その方法を紹介します。

* テスト環境
    * CP4D 4.5.3


# 1.ロール作成
まず、ロールを作成する必要があります。
ハンバーガーメニューから「管理」＿「アクセス制御」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a444ca05-304e-8e21-e3e5-5526bd79a863.png)

「ロール」タブで「新しいロール」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7aee9c58-d2a7-85e8-dab9-793e40f92b96.png)

適当な名前をつけて「次へ」で進みます。ここではカタログアクセスのみを許可したいので「CATALOGONLY」としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/21e31226-0d0a-6266-3619-1581cbb7b305.png)


「カタログ」＿「カタログへのアクセス」にチェックをつけ、「プロジェクト」＿「プロジェクトの作成」にチェックがついていないことを確認して、「次へ」で進みます。何か他にも別の権限が必要な場合はチェックを付けてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0b3c3a50-049d-9175-8c91-b74258316870.png)

作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f803e2b4-12e7-5791-7612-f2690e6c854c.png)

# 2.ロールの削除
「ユーザー」タブに移り、対象ユーザーをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/89a41026-42ad-de2a-9c19-eec1fe2a6f15.png)

ユーザーにすでに付与されている権限を確認し、「プロジェクトの作成」がついたロールがある場合にはこれをゴミ箱のボタンで削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5098400b-fa4f-51b9-5e8e-95a723e23bf5.png)

「ロールの割り当て」を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d85c616b-8bf8-c1a7-4366-bed9bc5ce958.png)

#1でつくった「CATALOGONLY」を選択し、「１個のロール割り当て」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/673e38a6-da1f-6635-7054-3683834bb221.png)

プロジェクト作成の権限のないロールが割り当てられました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f1696701-864c-f727-479a-05f158205ba5.png)

# 3.プロジェクトが作成できないことの確認
対象ユーザーでログインし、「新規プロジェクト」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3bfc42b4-f202-5087-d138-711f17754ef0.png)

以下のようなエラーになり、プロジェクトの作成の禁止が実現できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/949542e6-14de-589b-6908-283199ebe8bf.png)
Vim/Nvimで複数のモードのマッピングを一度に行うコマンド

CtrlもAltもFnも嫌いな私は近頃Vim/Nvimにハマっています。

手があまり大きくないのでコンパクトなiPad用キーボードを利用しているのですが、このキーボードは **ESCがない** 上に **Fnとoを同時押ししないと : が入力できない** などのVimを使うにはかなりやりにくいキー配置となっており、対策として私はいくつかの通常使わないキー（矢印キーなど）を **ほぼ完全に別のキーにマップ** しています。

このような状況ではvimrcもしくはinit.vimにマップコマンドが縦にズラーっと並ぶことになって見晴らしがよくありません。そろそろVim scriptにも慣れてきたので、ずっと気になっていたこの **「複数のモードで同じようなマッピングをするのに別々のコマンドが必要で面倒くさい！」** という問題に取り組んでみようと思います。

## 結論から言うと
vimrc内に次のようなコマンドを作りました。
```vimscript:vimrc
function s:noremaps(modes,lhs,rhs)
	for m in split(a:modes, '\zs')
		execute m.'noremap '.a:lhs.' '.a:rhs
	endfor
endfunction
command -nargs=+ Noremaps call s:noremaps(<f-args>)
```
第一引数にマップコマンドの接頭辞（`nvxsoilct`）をつなげた文字列を渡すこと以外は、だいたい通常のnoremapと同じように動作すると思います。
### 使用例
```vimscript
" 全てのモードで→キーを:キーとして扱う
Noremaps nxsoict <Right> :
```
:::note warn
マッピングでExコマンドを呼び出す場合、neovimでは`<Cmd>～<CR>`を使うことでほぼ全てのモードに対応したマッピングを行うことができます。
~~一方vimには`<Cmd>`がないためそれぞれのモードに対応したマッピングを行う必要があり、今回作成したコマンドは役に立ちません。~~ 
コメントによるとv8.2.1978から追加されていたそうです（少し古いビルドを使っていたため気づきませんでした…）。
:::
WebViewの動画広告をインライン再生させる時の注意点

WebView内の動画広告をインライン再生させようとしたが
思うようにいかない部分があったので注意点と共にご紹介します。

#### ■インライン再生させるには、これを追加するだけ
```swift
configuration.allowsInlineMediaPlayback = true // インライン再生を許可
configuration.mediaTypesRequiringUserActionForPlayback = [] // すべてのメディアについてユーザインタラクションなしの自動再生を許可
```
:::note warn
↓上記のコードを入れようと思ったが使えない:sweat:
:::
![スクリーンショット 2022-12-23 16.31.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370083/3dff6ba1-0c02-5db3-6836-cc30af35732e.png)

# ■使えなかった理由と注意点
1.インライン再生のコードを追加するには、WKWebViewConfigurationが必要だった。
2.WKWebViewConfigurationを使うには、StoryboardでWKWebViewを作ってはいけなかった。

#### 1.インライン再生のコードを追加するには、WKWebViewConfigurationが必要。
![スクリーンショット 2022-12-23 17.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370083/eb1d0207-0552-7c8e-c4c9-66c6f725028c.png)

#### 2.WKWebViewConfigurationを使うなら、WKWebViewをStoryboardで作ってはいけない。
理由：
StoryboardのWebViewにWKWebViewConfigurationを割り当てることが出来ないから。
![スクリーンショット 2022-12-23 16.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370083/f8e630a1-7726-46dc-782e-ca2641c8dd5a.png)

:::note info
ということでコードだけで作りましょう！！
:::

# ■全体のコード
```swift:WebViewController.swift
class WebViewController: UIViewController {
    var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let config = WKWebViewConfiguration()
        config.allowsInlineMediaPlayback = true // インライン再生を許可
        config.mediaTypesRequiringUserActionForPlayback = [] // すべてのメディアについてユーザインタラクションなしの自動再生を許可

        webView = WKWebView(frame: .zero, configuration: config)
    }
```
今までに試作したGitHub Actions一覧

## はじめに
今までに試作したGitHub Actionsの整理も兼ねてGitHubリポジトリにまとめてみました。

## リポジトリ

https://github.com/yus-sasaki/MyGithubActionsSample

## 一覧

リポジトリのReadmeと同じ内容です。

ソースコードは対象はC＃としており、buildなど一部のアクションは書き換えが必要となる場合があります。

- [IssuesAssignAuthor.yml](https://github.com/yus-sasaki/MyGithubActionsSample/blob/main/.github/workflows/IssuesAssignAuthor.yml)
  - Issue作成時に自動的に自身をアサインします。（確認のためassign-author@v1をそのまま使っているだけです）

- [autoassigneesandreviewers.yml](https://github.com/yus-sasaki/MyGithubActionsSample/blob/main/.github/workflows/autoassigneesandreviewers.yml)
  - プルリクエストのReviewersとAssigneesを自動で設定させます。詳しい説明は[こちら](https://qiita.com/yusuke-sasaki/items/94a8f64e837966266bfb)を参照ください。

- [build.yml](https://github.com/yus-sasaki/MyGithubActionsSample/blob/main/.github/workflows/build.yml)
  - dotnetのコードに対するBuildとTestを行います。

- [createIssueBranch.yml](https://github.com/yus-sasaki/MyGithubActionsSample/blob/main/.github/workflows/createIssueBranch.yml)
  - [こちら](https://qiita.com/yusuke-sasaki/items/d2947a95aefdfd5d0264)の記事にて確認したアクションです。

- [publish-nuget.yml](https://github.com/yus-sasaki/MyGithubActionsSample/blob/main/.github/workflows/publish-nuget.yml)
  - dotnetのコードをnugetパッケージ化してNugetに公開します。

- [sonarcloud.yml](https://github.com/yus-sasaki/MyGithubActionsSample/blob/main/.github/workflows/sonarcloud.yml)
  - [SonarCloud](https://www.sonarsource.com/products/sonarcloud/)を利用した静的解析とGitHubを連携させるアクションです。詳しい説明は[こちら](https://qiita.com/yusuke-sasaki/items/4016eb74fde053d60559)を参照ください。

- [workflowtotalization.yml](https://github.com/yus-sasaki/MyGithubActionsSample/blob/main/.github/workflows/workflowtotalization.yml)
  - [こちら](https://qiita.com/yusuke-sasaki/items/60cc128233a1b602c9e8)の記事にて作成したGitHubActionsの稼働実績を出力するアクションです。
先生、Netskope くんが邪魔してきます

Netskope とは[こやつ](https://www.netskope.com/)です。[CASB (Cloud Access Security Broker)](https://www.netskope.com/security-defined/what-is-casb) の一つです。お試しで Mac に入れてみました。

# 邪魔ってどういうことをされたの？

npm でパッケージをインストールしようとしたらすごく遅いんです。

## Netskope がいるとき

Netskope Client が有効なとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249782/2508f26a-d7c1-47d0-0ba4-7c3770a64a34.png)
このままでしばらくフリーズ。
```bash
% npm install typescript ts-node @types/node @octokit/rest @octokit/types --save-dev
(⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂) ⠏ idealTree:npm-netskope-enabled: sill idealTree buildDeps
```

npm のパッケージをインストールしている間に友情ほっこりの長尺コントができてしまいます。
```bash
% npm install typescript ts-node @types/node @octokit/rest @octokit/types --save-dev

added 41 packages, and audited 42 packages in 20m

found 0 vulnerabilities
```

## Netskope がいないとき

Netskope Client が無効なとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249782/715dcb5d-5e2b-3ad3-306c-c1b699b8be1b.png)
あっさり。
```bash
% npm install typescript ts-node @types/node @octokit/rest @octokit/types --save-dev

added 41 packages, and audited 42 packages in 6s

found 0 vulnerabilities
```

# どうして邪魔をするの？

[npm が自前の証明書バンドルを使っているからです](https://docs.netskope.com/en/configuring-cli-based-tools-and-development-frameworks-to-work-with-netskope-ssl-interception.html)。Netskope のルート CA がインストールされたシステムの証明書ストアを使わないからです。

# どうやったら仲良くできるの？

環境変数 `NODE_EXTRA_CA_CERTS` に Netskope のルート CA の証明書を指定すればいいです。

Netskope Client が有効なとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249782/2508f26a-d7c1-47d0-0ba4-7c3770a64a34.png)
あっさり。
```bash
% export NODE_EXTRA_CA_CERTS='/Library/Application Support/Netskope/STAgent/data/nscacert.pem'
% npm install typescript ts-node @types/node @octokit/rest @octokit/types --save-dev

added 41 packages, and audited 42 packages in 7s

found 0 vulnerabilities
```

めでたしめでたし。セキュリティは一日してならず。
Distributed Load Testing on AWSを使った負荷テストをやってみた

現在弊社では常に一定の高負荷にさらされることが予想されるSaaSサービスを構築しており、サービスローンチにあたって負荷テストを実施しておきたいので、今回このソリューションを試してみることにしました。
今回は`Distributed Load Testing on AWS`自体の検証が目的のため、テストする対象は弊社の環境に転がっていた適当な[MockAPI](https://qiita.com/kagome_39/items/eb260fb33004b075e742)にしました。(なのでテスト結果は面白くないです。)

## デプロイ方法
- AWSアカウントにログインしている状態で以下にアクセスして`AWSコンソールで起動する`をクリックします。
![スクリーンショット 2022-12-22 17.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/9ced7b92-b60a-72a0-7b08-8554d3eb8817.png)

https://aws.amazon.com/jp/solutions/implementations/distributed-load-testing-on-aws/

- スタックの作成画面が表示されますが、リージョンがus-east-1になってしまうので、デプロイ先を別のリージョンにしたい場合は、ここで切り替えてそのまま`次へ`をクリックします。
![スクリーンショット 2022-12-22 17.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/333c0674-24c9-b3ae-a70a-0ba06a404194.png)


- スタックの詳細を指定画面では`名前`と`メールアドレス`が必須項目なので入力して、デプロイ先のVPC等を変えたい場合は指定されている通り設定します。今回は任意項目はすべてデフォルトのままとしました。
![スクリーンショット 2022-12-22 17.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/1292df9b-3981-65f0-1630-7267d1bb6bbd.png)


- スタックオプションの指定ではタグやIAM Roleをお好みで設定します。今回はすべてデフォルトのまま次へ。

- レビュー画面では`AWS CloudFormationによってIAMリソースが作成される場合があることを承認します。`のチェック入れて`送信`をクリックします。
![スクリーンショット 2022-12-22 17.17.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/59b85d19-9a39-687a-9876-f056d4232009.png)


- 少し時間がかかりますが、これでデプロイは完了します。

## コンソールでの操作
- デプロイが完了したら設定したメールアドレスにコンソールのURLと初期パスワードが送られてくるので、パスワードをコピーしてURLをクリックします。
![スクリーンショット 2022-12-22 22.02.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/b979dc62-ac53-0444-4dfd-c57e4823a1a1.png)


- ログイン画面が開くので、ユーザー名と初期パスワードを入れてログインします(初回はパスワード変更が求められます。)
![スクリーンショット 2022-12-22 22.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/870cba47-a03a-17e5-bd09-6d7fe07b3b11.png)

- ログインできたら画面上部の`CREATE TEST`をクリックします。
![スクリーンショット 2022-12-22 22.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/3dab5c02-331c-ea51-85dc-63d80fc5e6e3.png)


- 各種設定を行っていきます。左側が実行に関する設定で、右側が対象の設定（シナリオ）です。公式のガイドには説明が無いですが、書いてある英文を要約すると、`TaskCount`(コンテナの数)、`Concurrency`(コンテナ内のバーチャルユーザーの数)を設定し、`RameUp`の時間をかけてその値に到達し、`Hold For`の時間その状態をキープするということらしいです。`Task Count`の最大値が1000で`Concurrency`の推奨が200なので、高負荷をかけたいときはそのくらいにとどめておくのが良さそうです。
![スクリーンショット 2022-12-22 22.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/484f4ffd-8df7-8f81-94d7-d723ad2b7e44.png)


- 結果は以下のように表示されます。グラフは1分刻みでしか表示できないようなので、短時間の実行では詳細なグラフは取れないようです。ただ、基本的な集計結果は表示されるので、これだけ簡単に負荷テストの環境を構築できるのであれば十分使えそうです :tada: 
![スクリーンショット 2022-12-22 22.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/30c7a6cc-afe1-7679-749d-890f04bf6a7f.png)


## 環境削除
デプロイされたCloudFormationのスタックを削除するとある程度消えますが、以下のリソースが残ってしまうので、手動で削除します。
- LogGroup
- S3 Bucket
- DynamoDB Table

以下のように対象スタックのリソースタブで`ステータス`でソートして`DELETE_SKIPPED`となっているリソースを片っ端から削除すれば漏れなく消せるかなと思います。
![スクリーンショット 2022-12-22 23.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/f327a632-7cf1-5a86-7909-486576180169.png)


## まとめ
かなり簡単に負荷テスト環境を構築することができました。実際の負荷テストに向けてもう少し設定をいじってみようと思います :muscle:
【超初心者向け】Excelマクロについて知っておくべきこと

#  はじめに
業務で行われるExcelの細かい繰り返し作業を何とか自動化させたく、独学でマクロの勉強を始める人は少なくありません。私もそうですが、まだ超初心者の段階にとどまっています。
この記事では、講座の先生から聞いた知識をピックアップして、知らないと損するいくつかのテクをまとめていきます。
それぞれのテクは関連性がないので、興味を持っているものだけ読んでいただいても問題ございません。



# テク①：マクロの改行
コードが長くて改行したいときは、「 _ 」のように`スペース`と`下線`をつけると、Enterで改行できる。
※Enterを押すだけでエラーになる

▼エラーになる改行▼
![間違っている改行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988536/aa63940e-6657-a4ae-b0cc-519e48b7d08b.png)
▼正しい改行▼
![正しい改行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988536/087a2dc5-ee24-8e07-3f9c-52992ef9b437.png)


# テク②：列番号を速く取得する方法
Excelでマクロでセルを指定する際に、「Cells(行番号,列番号)」で指定することが多いです。
行番号は、エクセルファイルを見ればすぐわかりますが、列はA, B, Cのようにアルファベットになっているため、数えるのが大変です。
そこで、ここでは列番号を早く取得できる方法を二通り紹介します。

- **関数COLUMNを使う**
    - 一行目に「=column()」と入力すると、素早くその列の番号を取得できる
![co.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988536/1223efa2-2664-58b7-7ea7-93b0e7969e34.png)

- **C1R1参照形式を使う**
    - 「ファイル」⇒「オプション」⇒「数式」⇒「数式の処理」⇒「C1R1参照形式を使用する」にチェックを入れる
    - 形式を変えると、下記のような列番号をすぐ確認できる画面に切り替わります。
![rici.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988536/ca743d88-8b74-da59-0a82-1419cdc4ec3c.png)

    - ただ、この形式を使うことで、通常のエクセルで行う簡単な計算でも複雑になるため、要注意
        - 下図のように、足し算でもわかりにくいため、不便と感じる際に通常の形式に戻すことがおすすめです。
![R1C1見にくい.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988536/4126e071-c884-84cd-85b4-f84106bac71e.png)


# テク③：ミスチェックのコツ
構文にミスが発生する際に、自動構文チェック機能が動作して、注意画面が立ち上がります。立ち上がるたびに閉じる必要があるため、面倒な時にこの機能を閉じることができます。
その代わりに、下記2つのコツでミスをチェックできるため、覚えておくと便利だと思います！

- **ミスがあると、その構文が赤くなる！**
![エラー赤い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988536/67577092-37d2-c83f-cc33-bb5072050729.png)
- **スペルミスがある場合は、スペルした英語の頭文字は大文字にならない**
![大文字ならない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988536/76890ee7-0c3b-83f7-4e9e-5bd6bf1e662d.png)


▼**おまけ：自動構文チェックを閉じる方法**
 `[ツール] → [オプション] → [自動構文チェック] をオフ`

# テク④：複雑なマクロのセルフチェック方法

- **F8キーで、一行ずつ実行して確認する**
- **ウォッチウィンドウ**を開き、変数の値の変化を確認する
    - [ 表示 ]→[ ウォッチウィンドウ ]
    - 変数を右クリックして、「ウォッチ式の追加」で変数をウィンドウに追加
    - これで、変数が一個一個変わるたびに、ウォッチウィンドウで確認できるようになる
![watch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988536/3aca89ce-688a-95e2-2f6c-6627868069d6.png)

#  おわりに
いずれも簡単なテクですが、マクロを書くうえで少しでも楽になる助けになればうれしいです。
以上、超初心者向けの4つのテクでした。
ちょっとした集計でめちゃお世話になるGoogleスプレッドシート関数8選

ちょっとした集計をお助けしてくれた関数たち。
なのになぜか毎回引数の入れ方調べたりしてるなと思ったので備忘録としてまとめます。
集計は全部クエリでやらずとも、スプレッドシートに貼って関数で成形、も小技として有効です。

   # ①VLOOKUP関数
:::note info
構文
VLOOKUP(検索キー, どの範囲から検索するか, 右何列目を返すか,完全一致ならFALSE)
:::

表から、特定のセルの値と一致するレコードの値を抜き出すための関数です。
関数て便利だな～って最初になるやつ。
TRUEかFALSEかこんがらがる人は、集計でTRUE使うことはほぼないのでFALSE固定で覚えておくとよいかなと。(玄人の方、TRUEの活用術あったら教えてください、、)
追記：TRUEの用途、活用の仕方について大変わかりやすくコメントいただきました！ありがとうございます！

   # ②INDIRECT関数
:::note info
構文
=INDIRECT（参照セルの文字列）  =INDIRECT（シート名!セル名）
=VLOOKUP($B3,INDIRECT("'"&D1&"'!"&"A:B"),2,FALSE)  ※セルD1に参照したいシートの名前を入れる
:::

セル名を指定して値を取ってこれる関数。
別シートを指定することも可能(別URLのシートを指定することもできる)
①のVLOOKUPと組み合わせると1シート目はスッキリ、2シート目(もしくは別URL)に集計用データを置いた集計データが作成できる。


   # ③COUNTIF関数
:::note info
構文
=COUNTIF(範囲,条件) 
=COUNTIF(B17:B,A3)  セルA3の値がB17:Bの範囲にいくつあるか
:::

範囲を指定して条件に当てはまる数を計上する

   # ④COUNTIFS関数
:::note info
構文
=COUNTIFS(範囲1, 検索条件1, 範囲2, 検索条件2, ...) 
:::

カンマで区切って複数条件指定できる

   # ⑤COUNTUNIQUE関数
:::note info
構文
=COUNTUNIQUE(範囲)
=COUNTUNIQUE(B4:B13)
:::
範囲内のユニークな値の数を計上
②INDIRECT関数と組み合わせることで別シートの表から重複削除して計上することができる
COUNTA(カウントエー)関数は重複削除せず引数の値の個数を計上する関数なのでCOUNTUNIQUEとはちょっと違いますね

   # ⑥COUNTUNIQUEIFS関数
:::note info
構文
=COUNTUNIQUEIFS関数(重複を省いて計上したい範囲,条件に使う範囲,条件)
:::

最終形態


   # ⑦SWITCH()

GoogleスプレッドシートでもSWITCHが使えるって皆さんご存じでしたか？
私は最近知って感動しました。
特定の値が入ることが分かっているセルの振り分けに便利です。
私は所在地をエリアに分けるときに活用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474845/16836069-deee-baab-1afc-cc81b4ff1910.png)

   # ⑧Arrayformula関数
:::note info
構文
=Arrayformula(適用させたい条件文)
:::

条件文の範囲を一つのセルではなく適用させたい範囲を指定することでオートフィルしなくても範囲内全てに反映できるすごい関数



   # Tips

意外と教わる機会がない

   ### ctrl + D オートフィル
太い十字をピーッてしなくてよくなります

   ### F4 「絶対参照」「相対参照」切替してくれるやつ
F4で絶対参照にしておけば、後は↑のオートフィルするだけ

   ### 検索条件で使える引数  \*   ?
\*	任意の文字列	"*県"  秋田県 和歌山県
?	任意の1文字	

   ### vlookupでなぜか一致が取れないときは
スプレッドシート上での文字列の形式があってないのかもしれません
書式なしテキストでそろえましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474845/035afa65-1fa6-513f-2ec2-9eb9f05a0a90.png)



おすすめの関数、小技、教えてください:relaxed:
CI/CD パイプラインを導入する上で考慮・工夫したところ

# はじめに
[LIGTHzアドベントカレンダー 2022](https://qiita.com/advent-calendar/2022/lightz)の24日目の記事です。
本日はクリスマス・イブ🎅ですね。

この記事では、これまで私がCI/CDパイプラインを構築する上で、考慮・工夫したところをお話ししたいと思います。
これから**パイプラインを導入したい**、**導入は終わって改善していきたい**、という人に参考になればと思います。

# 考慮・工夫点
## CI/CDツールをどれにするか決める
まだパイプライン導入していないという方はツールの選定から始める必要があると思います。
Azure Pipelines, GitHub Actions, CircleCI, AWS CodePipeline 等いろいろなツールがあります。
選択時には
- そのほかの開発ツール(ソースコード管理、チケット管理..etc)との連携のしやすさ
- プロダクトの動作環境(オンプレ、Azure ...etc)との連携のしやすさ
- 現在いるエンジニアのスキルセット
- スキルセットを保有するエンジニアの採用のしやすさ

あたりを検討するとよいと思います。

## 小さく始めてみる
導入初期段階で、CI/CDパイプラインをすべて整えられるとよいのですが、初めて導入しようとなった場合負荷が大きいように思います。
そのため個人的には、 
1. lintを実行する
1. unit testを実行する 
1. 開発環境へデプロイする

といったように、段階的に始めてみるのがおすすめです。

## ソースコードのレポジトリ管理方法・ブランチ戦略を決める
下記、2つの観点はパイプライン構築に影響するので方針を決めておくと手戻りを少なくできると思います。

- レポジトリ管理: マルチレポ or モノレポ
モノレポであれば実行トリガを工夫して、**frontendの変更のみの場合はbackendのCIは実行しない**等、制御すると実行時間を短縮できます。Azure Pipelinesでの設定は[公式](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/yaml-schema/trigger?view=azure-pipelines#trigger-batch-branches-paths-tags)を参照

- ブランチ戦略: Git Flow, GitHub Flow ...etc
[過去記事](https://qiita.com/Shin-27/items/ce71cbc5b947c4031648#%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%88%A6%E7%95%A5)でブランチ戦略について触れているので良かったら参考にしてください！

## 並列実行できるように課金を検討する
開発者が多い場合や複数のプロジェクトでCIツールを使っている場合、Pipelineの処理が実行待ちになり、開発スピードにも影響すると思います。

パイプラインの高速化に取り組めると良いですが、機能開発等を優先する際は課金をして並列実行数を増やすというのも検討すると良いです。
Azure Pipelinesの場合は、$40/月で並列実行数を1増やすことができます。

## cacheを用いて実行時間を短縮する
パイプラインの実行結果を早く受け取ることで、開発速度向上も見込めると思うので、パッケージ等のcacheを検討すると良いです。

azure pipelinesでのcache方法は[公式](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/release/caching?view=azure-devops)を参照

## 繰り返し実行される処理は再利用可能にしておく
例えば、デプロイ処理で複数環境(開発、ステージング、QA、本番...etc)が存在した場合、パラメータのみ異なり、ロジックは一緒ということがあると思います。このような場合はデプロイ処理のみ切り出しておけば、環境が増えた際にも少ない工数で対応が可能です。

Azure pipelinesだとtemplateを用いることで実現できます。詳しくは[公式](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/process/templates?view=azure-devops)を参照
[過去記事](https://qiita.com/Shin-27/items/f1b7fdad6ab77a708250)でも触れているのでよかったら見てください！

## パイプラインの実行失敗時などに通知がくるようにしておく
Pipelineの状態を常にウォッチしておくのも労力がいると思うので、実行失敗した場合等にTeamsやSlackといった普段使っているツールに通知を飛ばすことで、早めの対応が可能になると思います。

Azure pipelinesとTeamsの連携は[公式](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/integrations/microsoft-teams?view=azure-devops&viewFallbackFrom=azure-devops-2020)を参照

## さいごに
最後まで読んで頂きありがとうございました。
LIGHTzでは、一緒に働く仲間を募集しております。
https://www.wantedly.com/projects/1181162
Mutagen Extensionを使ったDockerの高速化（n番煎じ）

Mutagenはいいぞ！と言い続けていますが、Docker Extension化されて導入が超簡単になりました。
無料版では1つしかキャッシュディレクトリを選べない制限があるものの以前より大分楽になったはずです。

## 導入

https://mutagen.io/documentation/docker-desktop-extension
に全部書いてあります。

### インストール

Extensions Marketplaceにはないぽいのでコマンドからインストールします。

```bash
docker extension install mutagenio/docker-desktop-extension:latest
```

Mutagenを別にインストールする必要はありません。

### Create Cache

Docker Desktop → Dashboard → Extensions → MutagenからCreate Cacheを押します。
キャッシュはDockerにマウントするディレクトリを選んでおきます。
無料版は1つしかキャッシュを作れないのでリポジトリルートを選ぶなど少し広めに設定すると良いかもしれません。

しばらく待ちWaiting for filesystem changesと表示されたら使える状態になっています。

### dockerコマンド

普段のdockerコマンドにcontextをつけることでmutagen cacheが有効になります。
docker composeでも有効です。

```bash
docker --context=desktop-linux-mutagen compose up -d
docker compose down
```

以下のようにaliasを作っておくと `mc up -d` のようにコマンドが短くなるのでオススメです。

```
alias mc='docker --context=desktop-linux-mutagen compose'
```

## ハマったところ

- 複数のMutagen Cacheを作りたい
無料版Extensionは1つしか作れません。Cacheを消して1つをうまく使うか、従来のmutagen composeを使うか、お金を払いましょう。
- up時にmutagen関連のエラーが出た
Mutagen Extensionの画面を開いてみましょう。Extensionが動いていなかったり何かエラーが出ているかもしれません。

## 最後に

VirtioFSで早くなったみたいな話も見ますが直構築に比べると明らかに遅いです。
Mutagenなら違和感のないレベルで早くなるのでぜひ試してみてください。
AWS Well-Architected Frameworkの信頼性の柱にある『動作を継続的に行う』と『静的安定性を使用してバイモーダル動作を防止する』の記述がモヤモヤするのでオレオレ解釈してみた

Are you Well-Architected ?
こんにちは（もしくはこんばんは？）AWS Well-Architected Framework の普及に貢献したいマン 大竹 です。

本記事は[Japan AWS Ambassador Advent Calendar 2022](https://qiita.com/advent-calendar/2022/japan-aws-ambassador)の23日目の記事となります。

[2020年のネタ](https://qiita.com/ohtk79/items/43c78a64465e5e01d04d)、[2021年のネタ](https://qiita.com/ohtk79/items/fdc453ac5eb825334110)に引き続き今回もWell-Architectedなネタでいってみたいと思います。

# はじめに
AWS Well-Architected Frameworkの項目の中で個人的にしっくりこないものがいくつかあります。今回も前回に引き続き『う～ん』ってなったネタをピックアップしてみました。『動作を継続的に行う』と『静的安定性を使用してバイモーダル動作を防止する』についてオレオレ解釈を行いアーキテクチャレビューなでいい感じに活用できるようにオレオレ解釈をやってきたいと思います。

## 読者としては
AWS Well-Architected Frameworkを愛する方を対象にしています。前回と同じくだいぶ独りよがり(？)なブログになっていますが、なにとぞご容赦を m(_ _)m

# 動作を継続的に行うとは？
文言の意味から『Multi-AZ構成なんで大丈夫！』と判断してしまう人が多い印象ですが、フレームワークを読み込むと少し意味が違うことがわかります。

https://wa.aws.amazon.com/wat.question.REL_4.ja.html

読んでもしっくりこないので超訳すると『負荷が急激に変化しようとも影響を受けないような仕組みを実装しましょう』と書かれています。『監視対象が増えたのでレスポンスが悪くなりました』とか『アクセス急増による処理落ちでエラー率が上昇しました』などはよく聞く話ですが、こういった事象がそもそも発生しないような（＝外的要因に影響されないような）構造にしておきましょうというプラクティスになります。

各ベストプラクティスはそのベストプラクティスにつながる質問がセットになっており、『動作を継続的に行う』は『障害を防ぐために、分散システムの操作をどのように設計しますか？』という質問に対するベストプラクティスです。ベストプラクティスの解釈に困ったら必ず元の質問を確認するのがフレームワークを読み込むポイントです。で、質問がしっくり来なければシンプル化するのもオススメです。例えば『障害を防ぐために、分散システムの操作をどのように設計しますか？』は『障害を防ぐためにどのような設計にしますか？』と読み替えても支障はないと思います。

話を雑にまとめると『障害を防ぐために、外的要因に影響されないような構造や仕組みを設計しましょう』と言っているだけです。で、具体的にどう設計すべきか？については後半で扱いますので話を次に進めます。

# 静的安定性を使用してバイモーダル動作を防止するとは？
バイモーダル動作についてはフレームワーク解説があります。

https://wa.aws.amazon.com/wat.question.REL_11.ja.html

こちらも読んでもしっくりこないので超訳すると『状況に応じて複数の動作モードを使い分けるような実装はやめましょう』と書かれています。ワークロードの状況に応じて最適な動作モードに切り替える方がインテリジェントな感じがしますが、逆に複数の動作モードを実装することで設計が複雑になり安定性や品質が低下するものと考えられます。少々雑な解釈ですが『状況に左右されないシンプルな構造がいいよね』って話です。

このベストプラクティスに対する質問は『コンポーネントの障害に耐えるようにワークロードを設計するにはどうすればよいですか？』ですがもう少し言い回しをシンプルにすると『（コンポーネントの）障害に耐えるためにどのような設計にしますか？』となります。

またもや話を雑にまとめると『障害に耐えるために、シンプルな構造を設計しましょう』となります。
『動作を継続的に行う』と目指す方向はほぼ一緒なので具体的にどう設計すべきか？についてはまとめて考察してきましょう。

# 結局、どんな設計にすべき？
まずは外的要因に影響されないようスケーラビリティや耐障害性が求められるようなところは基本的にAWSのマネージドサービスにお任せしましょう。セキュリティの柱に『マネージドサービスを活用する』というプラクティスがありますが、同じ話かなと思います。（責任はどんどんAWS側に寄せましょう）

次はコンポーネントの障害などを考慮したシンプルな構造をどう実現するかになりますが、AWSではそれを簡単に実現できるサービスがあります。そう『AWS Lambda』です！（AWS Lambdaの解説は割愛します）

AWS Lambdaを使わなくても次のような条件でアプリケーションの設計を行えば構造はシンプルになると思います。
* 障害のあるコンポーネントはすぐに切り捨てることができる
* 処理単位が小さくリトライが容易
* 並列処理が可能

書いてあることがほぼ負荷分散クラスタになってしまいましたが、そういうことです。

個人的にはマネージドサービスを活用しつつ（スケーラビリティなどの責任はAWS側に押し付けつつ）、各コンポーネントがステートレスな設計になっていればいいんじゃないかなと思っています。ぶっちゃけ類似したベストプラクティスが他にいくつかあるので『動作を継続的に行う』と『静的安定性を使用してバイモーダル動作を防止する』に関してはシビアに捉えなくてもいいんじゃないか派です！

# おまけ
なんかアーキテクチャ設計のレビューをやりたくなってきたぞ！ってこちらをどうぞ！（宣伝）

https://jawsdays2022.jaws-ug.jp/sessions/C15/

# お次は？
明日(12/24)は[柴田パイセン](https://qiita.com/a-shibata)のターンです！
乞うご期待！
Basic認証有りProxy環境でDBeaverを使用する時にハマったのでメモ

# この記事で説明すること
DBeaverをProxy環境(Basic認証有り)で使用できるようにする方法

## DBeaverの説明
DBeaverとはJavaで開発されたマルチプラットフォーム(Mac,Windows,Linux全てで使える)のGUIデータベースクライアントアプリケーションです。
OS問わず使えるし、MySQL、PostgreSQL、SQLite、Oracle……等主要なDBMS製品は大体サポートしているのが素敵…☺️

https://dbeaver.io/

## 発生した問題
Proxy環境(Basic認証有り)にDBeaverをインストールして使用したところ、下記２つの機能が使えなくなっている
- 各DBMSのドライバダウンロード
- DBeaverのバージョン更新
エラーメッセージを確認すると
```
Proxy returns "HTTP/1.1 407 Proxy Authentication Required"
```
と、Proxyが407認証エラーを返していた

## 解消方法
dbeaver.exe をインストールしたフォルダに
dbeaver.ini があるので末尾に下記を追記する
```ini
 -Djdk.http.auth.tunneling.disabledSchemes=""
```

## なぜこれで解決するのか？
詳しくはこちらをご参照ください

https://qiita.com/kaakaa_hoe/items/d4fb11a3af035a287972

Java 8 Update 111 からjava.netパッケージの HTTPS 接続の際のトンネリングに Basic 認証を使用できない設定がデフォルトになった事が原因です
## 参考ページ

http://blog.tsuki-yomu-neko.jp/article/189509327.html

参考と言うより、この記事はほぼこちらのブログの記事の内容そのままです。
記事を投稿された方が、Qiitaへの転載歓迎と書かれていたので転載させていただきました。
出典である「つきよむねこのひとりごと」さま、ありがとうございました
[Zoom Japan] Zoom Phone x Salesforce 連携方法のご紹介

# はじめに
この記事は、弊社によくお問合せをいただいている Zoom Phone の通話を Salesforce の画面上から直接開始できるようにする方法についてご案内します。この記事では取り扱いませんが、単純に通話ができるようにするだけでなく通話記録や付帯するメモをリードのページに残したり、（契約がある場合）録音を Salesforce の画面上から確認したりすることも可能となります。

# ご注意
本記事は 2023-06-01 時点での Salesforce および Zoom Phone の連携方法について説明しています。今後のプロダクトアップデートや仕様変更等によって、**記事の内容と実際の画面が異なり、結果的に正しく連携設定ができない** 場合も考えられます。その点についてはあらかじめご了承ください。

# 前提条件
本資料の前提条件は以下となります。

- Zoom Phoneライセンスを所持するZoomユーザーが存在すること
- Zoom PhoneとSalesforceで同一のメールアドレスを利用したアカウントが存在すること
- Salesforce Lightningの環境をお持ちで、管理者権限でのログインが可能なこと
- AppExchangeが利用可能なSalesforceライセンスであること(Professional以上)
- 予めZoomの担当営業にSalesforceでのZoom Phoneの利用設定を依頼していること（社内での設定がございます）

# 設定手順

以下 Google Slide を埋め込んでいます。

<iframe src="https://docs.google.com/presentation/d/1plzDl3Nqa6jEOqyae2jTidaiNozCoVOoaAS2pJsQMxc/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

一部埋め込み動画が閲覧できないなどの場合、こちらから直接アクセスしてみてください。

https://docs.google.com/presentation/d/1plzDl3Nqa6jEOqyae2jTidaiNozCoVOoaAS2pJsQMxc/edit?usp=sharing

以上にて設定は完了です。
内容は適宜アップデートしていく所存ですが、抜けや漏れがある可能性もございます。その際はお気軽にご連絡ください。
Sony Neural Network Librariesを使ってハマったこと備忘録

Sony Neural Network Librariesを使ってハマったので憂さ晴らしの投稿
先に言うと問題は何も解決してません。

# なにはともあれ環境


>Windows10
>Python v3.10　on VScode
>nnabla             1.32.0
>nnabla-ext-cuda110 1.32.0

# 症状
Sony Neural Network Librariesを自前で構築したPython環境に`pip install nnabla`して使おうとしたが、次のようなことを言われ、にっちもさっちもいかなくなった。


~~~
(base) python.exe "nnabla_1.py"
2022-12-23 16:09:33,297 [nnabla][INFO]: Initializing CPU extension...
Traceback (most recent call last):
  File "nnabla_1.py", line 9, in <module>
    import nnabla as nn
  File "C:\Users\hoge\anaconda3\lib\site-packages\nnabla\__init__.py", line 34, in <module>
    from .parameter import (
  File "C:\Users\hoge\anaconda3\lib\site-packages\nnabla\parameter.py", line 29, in <module>
    import nnabla.utils.nnabla_pb2 as nnabla_pb2
  File "C:\Users\hoge\anaconda3\lib\site-packages\nnabla\utils\nnabla_pb2.py", line 5, in <module>
    from google.protobuf.internal import builder as _builder
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\hoge\anaconda3\lib\site-packages\nnabla\__init__.py", line 34, in <module>
    from .parameter import (
  File "C:\Users\hoge\anaconda3\lib\site-packages\nnabla\parameter.py", line 29, in <module>
    import nnabla.utils.nnabla_pb2 as nnabla_pb2
  File "C:\Users\hoge\anaconda3\lib\site-packages\nnabla\utils\nnabla_pb2.py", line 5, in <module>      
    from google.protobuf.internal import builder as _builder
ImportError: cannot import name 'builder' from 'google.protobuf.internal' (C:\Users\hoge\anaconda3\lib\site-packages\google\protobuf\internal\__inite-packages\google\protobuf\internal\__init__.py) 

~~~

pythonの`path`、`google.protobuf.internal`など一通り確認したがどうにも直らない。

# 解決(してないけど解消はした)

Sony Neural Network Consoleに付属しているPythonを指定して実行すると問題なく動く


私の4時間返せ

付属のPythonはv3.6。問題点はここだったのかもしれないが、私にそれを確かめる元気はない
極私的Lispの夢

# Lispは良き友人、教師
高校時代の私は学校で教わる勉強というものに全く興味が湧きませんでした。それどころが苦痛でした。例えば数学ですと公式を覚え類題をたくさん解き、短時間で正確に答えをだすというような訓練ばかりさせられていました。これは私には苦痛でした。早々とドロップアウトして創造的なロックミュージックに夢中でした。

しかし、Lispと出会うことによって劇的に変わりました。実は学校で教わる授業、学問として捉えるとこれがとても面白いのです。これを契機として独学し、さらに後年、大学理学部数学科に入れてもらって本格的に勉強をしました。そんな経験を通してLispが学校での勉強の役に立つのではないか？Lispを副教材としたら勉強は楽しいものになるはずだ、という信念を持つようになりました。2016年からISLisp処理系の実装に没頭しておりました。そんな経験も交えてLispと教育学習分野について極私的な意見を述べてみたいと思います。

# ウインストンの本より
昭和59年に買ったウインストンのLISP本には数学を題材にした例題が多く含まれていました。ニュートン法による平方根計算、電気回路のインピーダンス計算、代数方程式の根を求める、二値画像に関連して疎行列についても書かれていました。

# SICPの影響
複素数をリスト構造を利用して実装、複素数計算をSchemeで書いていくという題材が印象に残っています。このことが複素数に親しみを感じさせてくれました。後年、数学科で学んだ科目に複素関数論がありました。SICPの題材をより深く理解したかったのでした。


# Lispの栄枯盛衰
1958年にマッカーシー博士がLispを考案し、その後の古典的な人工知能研究はLispが使われました。人工知能の問題はアルゴリズムも判明していない定式化されていない題材です。人間の知性の仕組みについて仮説をたて検証、試行錯誤しつつ補正、追加を加えていくスタイルであったと思います。こういう分野においてLispは無類の強みを発揮します。リスト構造が柔軟であることに加え、プログラムの修正追加が容易なことが研究者に好まれたのだろうと思います。1980年代は日本の第五世代コンピューター計画の影響もあり、Lisp対Prologのような感じでそれぞれ発展を遂げました。しかし、日本の第五計画の終了とともにこうした古典的人工知能の分野は冬の時代を迎えます。

そんな冬の時代を迎えたLispでしたが、インターネット黎明期において再度ブレークします。ポール・グレアムさん率いるベンチャー企業がLispでWEBアプリケーションを開発したことにより大きな経済的成功を収めたことがきかっけでした。私が思うにLispの柔軟さが寄与したのだろうと思います。インターネット黎明期においてはその技術開発は混とんとしていたのだろうと思います。こうしたきちんと定式化されていない分野ではLispはその強さを発揮します。ライバル企業にLispを使って開発していることは極秘とされていました。Lispが競争力の源泉だったからです。

その後、Rubyなどが出現しWEB分野のライブラリも整備されるに至ってLispはその初期の役割を終えたように思います。現在でもClojureがWEB分野で利用されていますが、全体としてのシェアは僅かです。WEB分野は定式化されライブラリ化されその部分品を組み合わせることで容易にアプリケーションができるようになりました。Lispの役割はひとまず終わったといえるかもしれません。

# 学習、教育分野へ
さて、ここからが本題です。高校で教わる科目、学問は既に答えが見つかってるものばかりです。例えば高校程度の初等数学はもう解法パターンがわかっています。ですから、その解法、公式を暗記し、大量の類題をこなして短時間で正確に答えを出すことが受験で求められます。私がこれが苦痛で仕方がなかったのです。もしも、私の高校時代にLispが使えたなら、幾晩も徹夜をして計算実験をしていたことでしょう。そして理論に興味を持ち、徹底した証明を得たいという気持ちになっただろうと思います。こうしたことが深い理解につながり大きな知的な喜びを得たことでしょう。残念ながら私がその喜びを得たのは大学を卒業する間際になってからでした。


# 未知なるものへの挑戦
現在の日本は経済問題をはじめとしていろいろと問題を抱えています。それらは従来の手法、理論が通用しなくなってきています。科学技術分野においてもアメリカのやっていることを模倣すればいいという時代は終わったように思います。独自に研究開発をしていかなければ日本はどんどんと先進国から置いて行かれるような危惧を感じます。私が思うに今の政治、経済、技術の中枢部にいる人たちは独自にオリジナルに考えるという経験、能力に乏しいこともその停滞の一因ではないかと思っています。今後ますます答えのない問題に立ち向かわなければならないことが多いでしょう。受験勉強のように手法を記憶しておいて素早くそれを応用するだけでは通用しない世界に突入していると感じています。

そこでLispです。

学生にはいきなり答えを与えるのではなく、時間がかかってもいいので徹底的に試行錯誤、独自に考察させるという訓練が必要だと私は思います。日本人がアメリカ人に比べて劣っているのはその能力だと思います。それは遺伝的な問題ではなく、教育の手法によるところが大きいと思います。もはや明治維新ではないのです。わき目も降らずに英米の模倣をする時代はとっくに終わっています。

そんなわけで私のこの信念に基づいてISLisp規格準拠のEasy-ISLispというものを開発しています。2016年に着手していますのでかれこれ6年くらいです。インタプリタ・コンパイラは完成、協力者さんの力も得て安定性、ロバストネスも強化されました。教育学習目的のライブラリも整備しました。これを知的なおもちゃとして高校生の皆さんに使ってもらうことを願っております。この願いは少しづつではありますが着実に実を結んでいるように感じています。



https://github.com/sasagawa888/eisl
UiPath Process Miningフィルター種類の紹介

## 始めに

この記事は、UiPath アドベントカレンダー 2022の23日目の記事ですhttps://qiita.com/advent-calendar/2022/uipath

UiPathソリューション本部のマルチンです。この間まなさんの記事を見て UiPath Process Miningを気になった方いませんでしょうか？

業務フローの可視化ができますが、果たしてどんな情報が見えるのか？どのように使うのかまだイメージができない方もいらっしゃるかと思い、分析の例を紹介したいと思います！

## 今回の事例

今回の事例は代表的な請求書処理のプロセスとなります。請求書受領から処理・承認・支払いまでのフローとなります：

![キャプチャ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/7527bd32-7d87-96b2-3bfe-2fd3b83afd77.jpeg)

全てのケース（請求書）見ると2万程度のものがあります。全ての請求書に対してユーザーが行った操作（イベント）の数も確認ができます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/5cedaab0-560e-9cc2-89dc-a3d5b4617d37.png)

重要なKPIも設定できます。この業務の平均処理時間・関連の請求書総金額などは特に参考になるかと思います：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/76e3ce13-0b72-6e60-a98c-9b5aefd81822.png)

データさえあればユーザー・部署・サプライヤーなどの情報もテーブルで見ることができます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/24ea34cf-debb-93bc-46c8-995c5b7985d3.png)

ここまでProcess Miningと一般的なBIツールとほぼ同じ可視化になっているかと思います。さて、Process Miningが得意とされる分析フィルターを見ましょう！

## 本題：フィルターの紹介

#### UiPath Process Miningフィルターとは？
全て情報の分析は十分というケースも多いですが、業務分析行うと特定の部署や特定の状況絞って現状見ると分析の価値があがります。例えば一人の業務担当者を選択するとこの方が担当しているケース・KPI・プロセスグラフが見れます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/3d858b0f-65b9-aca5-a6a6-7320934c8978.png)

先ほど紹介した「ユーザー」や「部署」という単位の分析は直感的で分かりやすいのですが、UiPath Process Miningでは更に様々な観点からの分析ができます。いくつか代表的なものみてみましょう：
#### アクティビティが存在するか・しないか?
特定の業務の中には必須なアクティビティもあれば（例：請求書の処理）、望ましくないアクティビティもあります（例：規定外請求書の明確化）特定のアクティビティが存在するもしくは除外されているかどうか確認するためにはフィルターをかけて見ることができます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/a5d282b2-aee2-7ab3-3153-10b0f6f9a417.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/55ade689-4c4c-5d8f-aeea-67b48ef70c6a.png)

#### 繰り返しアクティビティが存在しているのか？
特定のアクティビティ2回以上発生するの非効率の可能性は高いです。UiPath Process Miningではアクティビティ発生した回数を選んでフィルターかけることができます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/b0562fae-0cd0-6679-c9ae-822438179bc3.png)

#### スループット時間の特定
特定の業務平均処理のKPIが存在しているケースが多いと思います。例えば2週間以上かかっているケースを選択して、どのようなフローになっているのか、どんな関係者はそのような状況と関係あるのかも見れます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/6ac516c6-57ec-3ca8-08d2-db23d3cf55c7.png)

#### 比較
特定のケースだけではなく、二つの状況を比較しながら分析もできます。例えば「日本」と「ドイツ」で発生している請求書業務見ると色分けで可視化されます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/bf14d795-ba8e-8158-3741-6efdd7f25959.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079243/dcd4e334-8705-8c11-0050-2a303888405d.png)

## 終わりに

UiPath Process Miningはいかがでしょうか？正直機能が沢山ありまして全てを紹介すると中々終わらないのですが、定期的みなさんと情報共有したいと思います！
Qiskit Textbook練習問題の解答解説の紹介

# 1. はじめに

2022年、1年間を通してコミュニティ活動（研究会）に参加しました。その研究会での成果物をご紹介したいと思います。
Qiskit Textbookを使って量子コンピュータの勉強をされている方、特に初学者の方にご活用いただければ幸いです。

# 2. 成果物

まずは、成果物の紹介です。
当研究グループでは、活動の成果物として、Qiskit Textbookの解答解説を作成しました。

成果物（JupyterNotebook）は、Githubで公開しています。

https://github.com/wg-quantum/qiskit_textbook_answers

コンテンツは以下のとおりとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78339/7d66319f-51f4-f515-ae7a-ff6fd3999bc8.png)

# 3. 成果物について

Qiskit Textbookには練習問題が提供されていますが、解答は用意されていません。
そこでないものは自分たちで作成しようということで解答解説を作成しました。

### 3.1 方針
- 研究会のメンバが初学者という利点を生かして、ビギナーフレンドリーな解答集を作成することに努めました。
- 数学的導出と量子プログラムの両方が問題になっているQiskit Textbookの解答としてはipynb形式がベストと判断しJupyter Notebook (.ipynb)形式で作成しました。

### 3.2 工夫点
- 初学者向けの内容にしました。
  - 答えに至る論理に飛躍が無いように説明
  - 量子ビットの状態などを細かく描写
  - 関数や回路などの使用例を多く用意
- 成果物の利用者の視点で作成しました。
  - 成果物ひとつで理解を完結できる親切な解説
  - 必要に応じて補助資料や参考文献を紹介
  - 作成ルールを設け、成果物の体裁を統一 
- Qiskit Textbookの理解を深める内容にしました。
  - Qiskit Textbook の内容を補足する +α の解説 

### 3.3 苦労した点
- 内容の難しさ
  - 物理・数学的な前提知識がそれなりに必要で、初学者はまずそのハードルを超える必要があります。
  - そもそも問題が非常に難しいものがあり（特に4章）、出題内容を理解するだけでも原論文に当たる必要があるなど、非常に大変でした。
- 正確性の担保
  - 単なる用語の説明や解答だけではなく、考え方などを含めた「解答解説」としての正確性を追求しました。
- 「分かりやすさ」への配慮
  - 物理・数学の知識が少ない人を対象に「分かりやすい」を念頭に置きました。


# 4. まとめ

Qiskit Textbookの(ほぼ)全ての練習問題に対する解答・解説の作成を完了し、gitHubにて公開しています。Qiskit Textbookを使った勉強の際にお役に立てれば幸いです。
SwiftUIの画面遷移のやり方

# 概要
- 画面遷移を最近知ったのでそれを紹介しようかなと思ってこの記事を書きました
- 使い所はたくさんあると思うのでこれを見て使い方をマスターしてくれると嬉しいです
### コード
ContentViewに書くコード↓
```
import SwiftUI
struct ContentView: View {
    var body: some View {
        NavigationView{
            VStack {
                NavigationLink(destination: SwiftUIView()){
                    Text("Hello, world!")
                }
                .padding()
            }
        }
    }
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
}
```
新規ファイル（これでいうSwiftUIView）に書くコード↓
```
import SwiftUI

struct SwiftUIView: View {
    var body: some View {
        Text("ハローワールド！")
    }
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }
}

```
## 解説
- 必要な工程は全部３つ
- File -> New -> File -> SwiftUI View の手順で作った新規ファイル
- NavigationViewをar body: some View の真下に書く
- NavigationLink(destination: 新規ファイル()){
                Text(画面遷移を行うボタンの名前)
                }
この手順の通りに書くと↓
![キータ１２.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916885/68f115a7-cb8a-73b1-775a-2fec433c3a36.gif)

こうなります！
もちろん移動した画面からさらに画面に移動させることも可能です。
### まとめ&感想
- 今回は画面遷移のやり方について書きました。正直、この方法は本当に知ったばっかなので間違っていたり他にもこっちの方が楽だよなどのこともあると思うのですがその場合は
- コメントなどで教えてください。
- この記事で１人でも役に立ってくれるなら光栄です。
JDBCドライババージョンアップでハマった話

ハマった話をつらつらと、、、

担当システムのミドルウェア全般のバージョンが古く（※一部サポート外など、、、）
ミドルウェア周りのバージョンアップを行おうとした話

＜現行システム＞
・Java：1.8.0_222
・Mysql：5.7.12（Amazon Aurora）
・Spring：4.3.16（2020年12月末で正式にEOL）
・JDBCドライバ：mysql-connector-java　5.1.34 (MySQL Connector/J)

＜背景＞
年中無休で稼働する社内システムで時々以下のエラーが発生
・Communications link failure
・No operations allowed after connection closed.
調査したところ、まず色々ミドルウェアのバージョンが古い、、、
これまで目を背けてしまっていたような、、、、

ということで
まず、現在のJDBCドライバがMysql5.7に対応していないことが発覚したので
※https://docs.oracle.com/cd/E17952_01/connector-j-5.1-relnotes-en/index.html
JDBCドライバのバージョンをあげることから開始する


１．アプリのpom.xmlのmysql-connector-javaのバージョンを変更
```
    	<!-- MySqlConnector -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.49</version>
		</dependency>
```

２．STG環境でテスト実施
３．本番リリース
　　、、、がエラー発生。。。。
　　ログを確認したところ、SELECT文の結果を取得できていない。。。
　　マスタデータの取得なので必ず取得できないといけないのだが、、、
　　※エラーが発生した原因はマスタデータの取得ができる前提で後続処理がつくられていたから、、

    SQLツールから同じSELECT文を発行し、SELECT結果が取得できることを確認。
　　ますます、？？？？？？？
　　その日は切り戻しをして、後日原因調査とした。。。

４．原因調査
　　本番環境のみでしか再現しない状態。
　　うかつに本番DBを見れないので、、、
　　※STG環境で再現させるのが最優先※

　　　　4-1．STG環境と本番環境のDBの差分を確認。
　　　　　　Mysqlのバージョン等々、、、
　　　　　　完全一致はしないが特に問題があるように見えない

　　　　4-2．JDBCドライバのバージョンに問題あり？
　　　　　　※https://docs.oracle.com/cd/E17952_01/connector-j-5.1-relnotes-en/index.html
　　　　　　骨が折れるし効率的でないので、、、別のアプローチ

　　　　4-3．SELECT文に問題がないかを確認。
　　　　　　まず、SELECT結果が Total:0 で取得できていないクエリを凝視！！！
　　　　　　条件設定が正常に機能しなかった疑いがあるかも、、、
　　　　　　判定不能な文字が含まれてしまっているとか、、、
            
　　　　　　Mapper.xmlに書かれたSQL文をサクラエディタなどで確認。
　　　　　　文字コードなど、、、
            
            結果的には、取得できないMapper.xmlと正常に取得できるMapper.xmlをWinMareにかけることで原因が分かった

　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348865/3efa3e53-09a0-7d07-e209-c3219a79d257.png)




調査に2日ぐらいかかった、、、
JDBCドライバのバージョンを変えてSQLを投げてみたり、、
ORマッパーを調べまくったり、JDBCドライバのバージョン変遷を追っかけたり、、、

Mapper.xml内だけ見てると、改行が統一されてるのでおかしいと思わなかった、、、



＜気になる点など＞
・javaのjreが入っており、jstat（Javaアプリのメモリ計測）が使用できない。。。
　※特別な要件がなければ基本的にJDKを入れる方がいいかも



＜参照したものなど＞
・meavenのセントラルリポジトリ（https://central.sonatype.dev/）
　⇒pomに設定できるバージョンが存在するかなどを確認できる
ほぼSalesforce系ネタのアドベントカレンダーを完走してみて社外へのアウトプットは大事だと感じた話

アドベントカレンダーを初めて1人で25記事を書いて完走をしましたので、得たものや完走した感想を書いていきます。
こういった記事を書くのは初めてなので拙いですがよろしくお願いします。

# 改めてお礼

購読してくださった方、記事を読んでくださった方ありがとうございました。
Twitter等で書いた記事に反応が多くついていたりするととても**嬉しくとても励みになってました！！**

https://twitter.com/SfdgTokyo/status/1603539638211252224?s=20&t=-bI5_17AfsUTERM-oxGIfQ

https://twitter.com/SfdgTokyo/status/1604990192351313920?s=20&t=-bI5_17AfsUTERM-oxGIfQ

https://twitter.com/SfdgTokyo/status/1603812390801489938?s=20&t=-bI5_17AfsUTERM-oxGIfQ

別のカレンダーですがこちらも！！

https://twitter.com/SfdgTokyo/status/1603086350730805260?s=20&t=-bI5_17AfsUTERM-oxGIfQ

# 自己紹介

自分は、2022年12月現在新卒3年目で
2020年4月にWebエンジニアとして入社をして
Salesforce系も触り始めて
Salesforceもできるエンジニアになるべく日々活動しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/ebebc83e-656c-4773-446d-7104ec9c9a12.png)


# なんのカレンダーを完走したの？

こちらです！

https://qiita.com/advent-calendar/2022/takahal

# なんでやろうとしたの？

- **Qiitanのぬいぐるみ**が欲しい
- Salesforceに関する実装系のアウトプットをしたかった

そうなんと今回のアドベントカレンダーは、1人でアドベントカレンダー25記事を投稿すると
Qiitanのぬいぐるみが貰えるのです！
会社系のグッズが好きな自分としては参加するしかない！ということで参加させていただきました。

>完走賞
∞名
1つのアドベントカレンダーに1人で25記事（Qiita記事のみ）投稿しきった方全員を表彰します！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/f79391b2-1237-99b6-c337-2be07bc86236.png)

https://qiita.com/advent-calendar/2022/present-calendar

# カレンダーの内容は？

基本Salesforceで他に書きたいものがあれば書く！ゆるいスタイル

# なんでSalesforceなの？

日本でコミュニティ外での具体的な実装に関する **記事がQiitaで少ない！** とSalesforceを始めてみて感じており、
自分のように始めたばかりの人がこうやってやるのか！と思える記事が少しでも増えるように！！
増えた結果他の人もQiitaに書いてみよう！となることに**少しでも貢献できるように**
今回アドベントカレンダーにネタとしてSalesforceを選びました。

# 得た習慣
大きく２つの習慣を獲得することができました！

:::note
- リリースノートを見る→新機能を試す習慣がついた
- インプットしたことをアウトプットして社内で共有する習慣がついた
:::

普段の業務でなかなかリリースノートを見る→自分で気になるものをピックアップして検証するということができていませんでしたが、
アドベントカレンダーで25記事書く際に 
**どうせなら新機能を検証してチームメンバーに共有しよう！**
**どうせなら知ってる知識をチーム外のメンバーに共有しよう！** 
ということを思ったので、ただインプット→社外にアウトプットするだけでなく
インプット→社外にアウトプット→**社内にアウトプット** ということを意識してやっていった結果習慣になりました。

# 社外向けにアウトプットすることでよかったこと

:::note
- 社内向けに積極アウトプットから社外向けに積極アウトプットへの変化
- 自分のスキルアップにつながる
- チームメンバーがインプットする量が増える
:::

今まで自分は**インプット→社内にアウトプット** を積極的に行ってきましたが、あくまでも社内向けなので
アウトプットの内容としては`社内で必要最低限の情報のみ + 前提としてある程度読み手がわかっている`アウトプットの量と質としては多少弱くなっていたり
社外に展開しようにも社内向けの内容を、社外向けに改変するのは多少コストはかかってしまったりするのでアウトプットが社外にまで及ぶことはなかなかありませんでしたが、今回アドベントカレンダーでアウトプットをし続けること社内向け中心の発信から社外向け中心の発信へ少しずつですが変化しました。

その結果

- 社外にアウトプットするために濃くインプット
- 社外にアウトプット
- 社内でアウトプットしたものを共有

このサイクルを行うことになり、
最初に濃くインプットして社外向けにいつもより丁寧にアウトプット！
アウトプットした内容をみたチームメンバーがインプットする量は以前より増え
インプットした内容をもとに、自分やチームメンバーが**〇〇できるんだーからやってみよう！！** というアクションをする回数が増えました。


# さいごに

**社外へのアウトプットはいいぞ！** 

:::note
- 自分のスキルアップ
- チームメンバーのスキルアップ
- 継続的にスキルアップをする習慣
:::

ができる

次のステップは、社外は社外でも記事ではなく自分の声で伝えれるように**イベント等の登壇**をやっていき
それが習慣化することで、より自分やチームのスキルアップにもつながり
さらに！**発表を聞いた人**が記事以上に刺激やインプットを受けれると思いますのでこれからも頑張っていきます。

SalesforceのSpring '23のプレリリース記事書いてますので
そちらももしよろしければよろしくお願いします。

https://twitter.com/SfdgTokyo/status/1606725328218591232?s=20&t=j73dJ8OaPNmta3QkbD9r-g

https://twitter.com/SfdgTokyo/status/1606604405020696578?s=20&t=j73dJ8OaPNmta3QkbD9r-g