OmniAICreator/Qiita-1.07M huggingface dataset:
Create Global Quick Actions

[Trailhead関係　個別の課題別に戻る](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)

# ステージのデフォルト値を資格に変更できる場所を見つけるのに苦労しています。

+ [Set the predefined value of the Stage field to Qualification](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000MgEdv)

:::note
Please check both the image for creating predefined value of the Stage field to Qualification
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bd61042f-4613-cd52-33f0-10e0e9ca3b31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/79f6562c-3a83-d8e5-7b6d-adf36be8ffc9.png)

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


# 解答を聞いても良くわかりませんでした。

[I am unable to complete Global Quick Actions Challenge](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000CgQKhSAN)

# グローバル クイック アクション モジュール (モバイル) の作成、変更がモバイル アプリに表示されない

+ [Create Global Quick Actions Module (mobile), changes not showing up on mobile app](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Elm7p)
* [モバイル アプリがデスクトップの変更を同期しない -- グローバル クイック アクションを作成する](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JeRem)

こっちにも記載しています --> [Salesforce mobile appのまとめ](https://qiita.com/Keiji_otsubo/items/ccd439e5ad523abba252)


# 未分類

+ [クイックミートを任意のオブジェクトで表示できるようにするために、定義済みを作成しました。すべての手順を実行しましたが、それでも表示されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cm96MSAQ)

:::note
こちらの記事をご確認ください。


https://help.salesforce.com/s/articleView?id=000388023&type=1
:::
QA主導でプロダクトを巻き込んで品質課題を解決した話

# 1.はじめに
みなさま、こんにちは。
昨年は以下の記事で、開発チームの作業遅延や連携漏れを改善するために、QAとして私が行った立ち回りについてご紹介しました。

https://qiita.com/20K/items/de21146c58389ceb9d44

今回も開発チームの課題解決についてご紹介しますが、前回はリリース後の運用タイトルだったのに対して、今回はリリース前の新規開発中タイトルでの開発課題を取り上げたいと思います。特にプロダクトメンバーの巻き込み方の工夫を事例をもとにご紹介します。

- 担当タイトルの課題が上流工程にあって、QAだけでは改善できなそう
- 現状分析→課題特定→対策検討まではできるが、対策を実行する際にどうやってプロダクトのメンバーを巻き込んでいけば良いかわからない

といった方の参考になれば幸いです。

# 2.リリース前タイトルでの課題例
過去私が実際に担当したタイトルでは以下のような状況に陥っていました。

- プロダクトの人員が足りず、実装が終わらない状態が続き、テストが進行できない
- 品質を担保してリリースするには、プロダクト体制強化 / リリース日延期を行う必要がある

このような状況の中で、QAとして私が実際に行ったことを簡単にご紹介します。

# 3.QAからのアクションと効果
「開発ボリュームに対してプロジェクトマネージャー・ゲームプランナー・ゲームエンジニアのリソースが足りていない」という課題に対して、以下の3つの情報を私の方で可視化＆資料化し、QA責任者（QAチームのマネージャー）からプロダクト責任者（事業部部長）へ開発状況をエスカレーションしていただきました。

- 現状のペースのままだとリリース予定日時点で障害（市場不具合）が重大度別に何件出るか
- 現状のペースのままだと不具合の収束にいつまでかかるのか
- リリース予定日までにQA完了させるためには実装・不具合解決ペースをどれだけ上げる必要があるか

加えて、デイリーで上記の見込みを更新し、私（QA担当者）からプロダクト責任者（事業部部長）へ報告しました。

その結果
- QA情報を可視化、共有したことで適切な品質状況の判断が可能になった
- 適切な開発期間の確保
- 開発体制の強化

に繋がりました。

# 4.QAから提示した情報のサンプル
プロダクト責任者へエスカレーションを行う際に、特に以下2点の可視化を行いました。
## 4-1.残テストケース数の推移と、着手済みテストケースのうち不具合によりテスト実行できない割合
テストケースの消化状況を可視化し、テストが進行していない状況と、その要因がプロダクトマター（不具合対応や実装待ち）であることを伝えました。
![スクリーンショット 2022-11-30 16.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553255/c4f4f757-8154-2a0b-d359-9e2e81e4c302.png)
![スクリーンショット 2022-11-30 16.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553255/a0f083b6-35ee-0898-1ac8-afa521a76a52.png)

## 4-2.不具合チケットのOPEN vs CLOSE推移予測
現状の実績値から、現状のペースのままだとリリース予定日時点でどれだけ不具合が残存する形になるのか、不具合の収束にいつまでかかるのかを伝えました。
合わせて、その予測を実現するための「実装完了時期」「初期品質（1項目あたりの不具合遭遇率）」「1日あたりの不具合チケット解決数」という条件もセットで提示しました。

![スクリーンショット 2022-11-30 16.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553255/72b7fc3c-29b6-0c7b-b443-1856cd3b36ac.png)

各予測値の具体的な算出方法は以下となります。

- 【予測残存不具合数（グラフの黄色）】＝【予測不具合起票総数（グラフの青色）】ー【予測不具合総解決数（グラフの赤色）】
- 【予測不具合総起票数（グラフの青色）】＝【その日に消化されるであろう項目数（予測値）】×【1項目あたりの不具合遭遇率（直近の実績平均）】＋【項目消化総数（実績値）】
- 【その日に消化されるであろう項目数（予測値）】＝【テスター1人日あたりの項目消化数（直近の実績平均）】×【アサイン予定しているテスター稼働人数】
- 【予測不具合解決数（グラフの赤色）】＝【その日に解決されるであろう不具合数（直近の実績平均）】＋【不具合解決総数（実績値）】

# 5.QA主導でプロダクトを巻き込むためのポイント
上記のアクションを実行して実際にプロダクトに動いてもらった結果を振り返ると、QAから提案する際に大きく2つポイントがあったと考えてます。
1つ目は「提案先と順番」です。
プロダクトに動いてもらうには、現場メンバーよりもプロダクトの責任者を先に巻き込むことが重要です。そのために、まずはQA責任者と対策内容を握り、QA責任者主催のMTGでプロダクト責任者へ提案を行う形を取ったことが有効でした。
2つ目は「提示する情報」です。
プロダクト責任者へ提案を行う際には、プロダクト責任者が気にする情報を伝えることが重要です。現状の課題を伝えるだけでなく「このままだと今後どうなってしまうのか」というリスクを定量的に提示したことが効果的でした。合わせて、「これからどうして欲しいのか」という具体的な改善要望もセットで伝えられるとより改善がスムーズに進むと思います。
![スクリーンショット 2022-11-30 17.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553255/4b308eb6-51de-7efb-d2b8-d12816e720e5.png)
少しでも、同じような課題に直面されている方の参考になりましたら幸いです。
Microsoft Defender for Cloud サービスの停止(無料化)方法

過去に有料版にしてしまったものの無料版への変更方法が分からなかったので記載します。

# 変更方法
Microsoft Defender for Cloudは、全てのリソースに表示されません。
そのため、無料版への変更方法が難解です。
私は以下の手順で変更できました。


- 有料版に設定していると、請求書の明細に掲載されます。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/c60237c7-7d02-ec37-f195-0e402bed8a9d.png)


- リソースに登録している App Serviceを選択します。
- リソースのメニューにある、Microsoft Defender for Cloudをクリック
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/0470b18d-d0ab-854e-e334-c4f8d793a8d9.png)

- 次をご覧ください Microsoft Defender for Cloud のリンクをクリック
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/6d6662e6-56c4-39ff-871f-bb3e967e328c.png)


- Microsoft Defender for Cloudのメニュで[環境設定]をクリック
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/881a421c-769c-8b0a-f938-14c1d160a192.png)

- サブスクリプションをクリック
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/3c757ca1-33c1-bb18-e28e-65acf4398c48.png)

- 無料サービス(赤枠)を有効化
- 有料サービス(黄枠)を無効化
- 保存する。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/e2df15c0-ead5-c20c-1615-26d781546590.png)
Mac版　Flyでデプロイ（まとめ）

色々知見が溜まってきたので、改めてMacでのデプロイ方法をまとめる。

# 手順
今回は以下の流れで進める。

[1. gemfile, database.yml の編集 ](#gemfileとdatabaseymlの編集)
[2. node のバージョン変更](#nodeのバージョン変更)
[3. Fly の準備 ](#Flyの準備)
[4. ビルドとデプロイ ](#ビルドとデプロイ)

# gemfileとdatabase.ymlの編集
Flyの準備の前にこちらを行う。

## 1. gemfile の編集
`gemfile`を以下のように書き換える。

```diff_ruby:Gemfile
- gem 'sqlite3' ~> 1.4
+ #gem 'sqlite3' ~> 1.4

# 割愛

group :development, :test do
  gem 'sqlite3' #追記
  #  割愛
end

#一番下にまるごと追記
group :production do
  gem 'pg'
end
```

書き換えて保存したら、ターミナルで以下を実行。
```sh:ターミナル
$ bundle install --without production
```

## 2. database.yml の編集
次に `config/datebase.yml` の一番下を以下のように書き換える。

```diff_ruby:datebase.yml
#変更前
 production:
  <<: *default
  database: db/test.sqlite3

#変更後
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5

#インデントは必ず半角スペース2つ
```
ここからはnodeをいじる。


# nodeのバージョン変更
まず `node -v` を実行。バージョンが18以上でなければこの章は飛ばして構わない。

## nodebrewでnodeをインストールするための下準備

homebrewで管理されていたnodeを抜く。
nodeが存在しないなどとエラーが出る場合はそのまま進む。

```sh:ターミナル
$ brew uninstall --force node
```

homebrew で nodebrew をインストール。

```sh:ターミナル
$ brew install nodebrew
```

node のバージョンを切り替える前に以下3つの入力で、 path を通していく

```sh:ターミナル
$ mkdir -p ~/.nodebrew/src

$ export PATH=$HOME/.nodebrew/current/bin:$PATH

$ source ~/.bash_profile または ~/.zshrc
```

## nodebrew でダウングレード
次に、node を実際にインストールし、バージョンを切り替える。
切り替える先は18. 未満ならおそらく平気。 まずはインストール。
```sh:ターミナル
$ nodebrew install-binary v16.13.1
```
M1 Macだと15.以下がインストールできないらしいので、16.がいいだろう。
次にバージョンを切り替える。
```sh:ターミナル
$ nodebrew use v16.13.1
```

長かった準備も終わり、ようやく fly の作業に取り掛かる。

# Flyの準備

まずFlyのCLIをインストールする。

```sh:ターミナル
$ brew install flyctl
```

次にアカウントを作成する。

```sh:ターミナル
$ flyctl auth signup
```

以降ログインをしたい場合は、

```sh:ターミナル
$ flyctl auth login
```

サインアップできたらクレカの情報を入力する。（現状登録しないとデプロイできない）
また認証メールが来ているはずなので、そちらもやっておこう。

`fly launch` に行く前に念のため Docker ファイルを確認しよう。

```ruby:Dockerfile
ARG NODE_VERSION=16.13.1
ARG YARN_VERSION=1.22.18
```

ここが指定したものになっていればOK 

# ビルドとデプロイ
ここからターミナルの操作はアプリの階層に移動しておこなうこと。まずはビルド。

## ビルド

```sh:ターミナル
fly launch
```

このあと色々聞かれるが、アプリの名前以外はそのまま Enter か y　押して Enter で。

非常に省いたので詳しくは参考記事で。

## デプロイ

```sh:ターミナル
fly deploy
```
後は祈る。次のがでればOK
```
Monitoring Deployment

1 desired, 1 placed, 1 healthy, 0 unhealthy [health checks: 1 total, 1 passing]
--> v0 deployed successfully
```

```sh:ターミナル
fly open
```
でデプロイしたアプリを開ける。
再デプロイの時には`fly deploy`　だけでOK。

# 参考記事
色々な記事を参考にした。先人達に誠感謝である。
### deploy手順
https://qiita.com/yuuki-h/items/ec23de152368d36672ea

### node関係 

https://penpen-dev.com/blog/error-error0308010cdigital-envelope-routinesunsupported%E3%81%AA%E3%82%A8%E3%83%A9%E3%83%BC/

https://qiita.com/k3ntar0/items/322e668468716641aa5c

https://qiita.com/RyuseiSanada/items/f82ea1eba8f113c4e319
簡単Elixirシリーズ ~ カスタムmixコマンドを作ろう ~

# 簡単Elixirシリーズ 
## ~ カスタムmixコマンドを作ろう ~

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」20日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、とあるフォルダ配下にあるファイルやフォルダ名を取得してリスト化したい。という小ネタ（そう、この記事はサクッとがコンセプトW）

## まずは下準備

まずはプロジェクトを作成する
```zsh
$ mix new dockerex
```
生成されたプロジェクトの```dockerex.ex```にまずはdockerfileを生成する関数を作ります。
今回は簡単なものにしたいので、固定の値をただ出力する関数として作りました。

```lib/dockerex.ex
defmodule Dockerex do
  @moduledoc """
  Documentation for `Dockerex`.
  """

  @doc """
  Create a dockerfile for the Phoenixframework.

    ```
    FROM elixir:1.12.3

    RUN apt-get update && apt-get install -y \
      inotify-tools git npm && \
      apt-get clean && \
      rm -rf /var/lib/apt/lists/*

    WORKDIR /app

    RUN mix do \
      local.hex --force, \
      local.reber --force, \
      archive.install --force hex phx.new 1.6.6
    ```

    ## Examples

      iex> Dockerex.create
      :ok

  """

  def create do
    write(build())
  end

  defp build() do
    """
    FROM elixir:1.12.3

    RUN apt-get update && apt-get install -y \\
      inotify-tools git npm && \\
      apt-get clean && \\
      rm -rf /var/lib/apt/lists/*

    WORKDIR /app

    RUN mix do \\
      local.hex --force, \\
      local.reber --force, \\
      archive.install --force hex phx.new 1.6.6
    """
  end

  defp write(contents) do
    path = case File.cwd do
      {:ok, path}  -> path
      _  -> "Error"
    end
    Path.join([path, "Dockerfile"])
    |> File.write(contents,[:append])
  end
end
```

## カスタム mix コマンドの作成

mix カスタムコマンドの作成は実は超絶簡単です。今回は、```mix dockerex```と言うコマンドを叩くと```Dockerfile```が生成されるイメージして作成します。

下準備として、```lib/```配下に新しいフォルダを作ります。
```lib/mix/tasks/```そして、このフォルダ配下に mix コマンド名 となるモジュールを作成します。
今回は、dockerexとコマンド打ちたいので、```lib/mix/tasks/dockerex.ex```を作ります。

```lib/mix/tasks/dockerex.ex
defmodule Mix.Tasks.Dockerex do
  @moduledoc "The Dockerfile Create mix task: `mix help dokcerex`"
  use Mix.Task

  @shortdoc "Simply calls the Dockerex.create/0 function."
  def run(_) do
    Dockerex.create()
  end
end
```
@moduledoc に記載した内容は、```mix help dockerex```で内容が表示されるようになります。

@shortdocを記述することで、mix helpをした際に内容が表示されるようになります。
```@shortdoc "Simply calls the Dockerex.create/0 function."```

```zsh
$ mix help dockerex
mix help dockerex

                                  mix dockerex                                  

The Dockerfile Create mix task: mix help dokcerex
$ mix help
mix dockerex          # Simply calls the Dockerex.create/0 function.
```

また、Mix Taskコマンドにするために```use Mix.Task```を利用します。
そして、今回は簡単にするために、全ての引数を無視するrun関数を作成します。 
この関数の中では、 Dockerex モジュールの create 関数を呼び出しています。

これで、準備は完了です。
早速、実行してみましょう。

```zsh
$ mix dockerex
```
プロジェクトディレクトリである、```dockerex```直下に```Dockerfile```が生成されていたら成功です。

簡単ですね。皆さんもオレオレ mix taskコマンドつくって遊んでみてください。
【Pythonで可視化グラフ】散布図行列

:::note info

メーカー研究開発に携わるプログラミング初心者が学んだことを必要最小限にまとめた記事です。
:::

# 散布図行列
直観的に相関関係がわかるが、見慣れないと難解。
他分野の方への説明には適さないかも。
同分野の方と生データを共有して考察するのには良さそう。

## 何を表現できるか
複数の変数間の相関関係を表現。

## Pythonコード
まずはcsvファイルをインスタンス化する。
今回は日本酒の官能評価データで
日本語が含まれるため、読み込み時に文字コード指定する。

```python
#データ読み込み
#encodingで文字コードを指定すると日本語でもエラー起きない
import pandas as pd
sake = pd.read_csv('/content/drive/MyDrive/data/sake.csv', encoding='shift_jis')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/0db7b49b-3a1e-8d26-76c6-c2707ef19cf4.png)

文字化けを避けるために、日本語データを英名へ置き換える。
```python
#matplotlibは日本語で文字化けするので列名を英名へ変更
sake = sake.rename(columns={'銘柄':'Name', '香の品質':'Aroma', '華やかさ':'Splendor', '味の品質':'Flavor', '濃淡':'Tint', '軽快さ':'Lightness'})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/48fff27c-d09b-32f1-ff02-aa7acf6c13f0.png)

データを整えた後、散布図を作成する。
```python
#散布図作成
import matplotlib.pyplot as plt

x = sake['Aroma']
y = sake['Splendor']

plt.scatter(x, y)
plt.title("scatter")
plt.xlabel("Aroma")
plt.ylabel("Splendor")
plt.grid(True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/713f6346-c4f4-8654-1071-1b3090f8b360.png)

近似直線を入れる。
まずは近似式y=ax+bのa,bの値を求める。
```python
#近似直線、1次式y=ax+bのa,bを求める
import numpy as np
a, b = np.polyfit(x, y, 1)

#近似直線の式によって求められるy2に格納
y2 = a * x + b
```

得られたa,bを使い、近似式を散布図に挿入する。
```python
#散布図に近似直線を追加

fig = plt.figure()
sns.set_style('darkgrid')

ax=fig.add_subplot(111)
ax.scatter(x,y)

#近似式の表示
ax.plot(x, y2, color = 'black')

plt.xlabel('Aroma')
plt.ylabel('Splendor')
plt.title("scatter")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/76ca5aaa-2f90-6dd1-a5a3-483fba1a0bc0.png)

グラフのプロットの色分けをおこなう。
カラーパレットは無数にあるので、好きな色を選ぶ（以下、カラー参考サイト）。
https://medium.com/@morganjonesartist/color-guide-to-seaborn-palettes-da849406d44f
```python
#散布図プロットの色分け

#スタイルのセット
sns.set_style('darkgrid')

#散布図の作成
sns.scatterplot(data = sake, x ='Aroma', y = 'Splendor', hue='Flavor',
                palette = 'bright')

#凡例を追加
plt.legend(loc='upper right')
plt.xlabel('Aroma')
plt.ylabel('Splendor')
plt.title("scatter")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/36b2004f-2b75-4273-ebdc-73f1478b3532.png)

散布図行列はsns.pairplot()の1行で作成できる。
```python
#スタイルのセット
sns.set_style('darkgrid')

#散布図行列
sns.pairplot(sake, #グラフにするデータの指定 
             hue='Aroma',  #色分けする属性
             palette = 'bright', #グラフの色
             height=2 #各図の大きさ
             )
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/71039a30-a2da-dad4-d74f-4aaa803838ec.png)


# こんなデータに使いたい
複数の属性のうち、相関関係がありそうなデータ。
Amazon Linux 2 にZabbixエージェントインストール

### エージェントのダウンロード
`sudo rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm`

##### Amazon Linux(旧バージョン） の場合
`sudo rpm -ivh http://repo.zabbix.com/zabbix/2.0/rhel/6/x86_64/zabbix-release-2.0-1.el6.noarch.rpm`

#### エージェントを6.2にアップデート
`sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.2/rhel/7/x86_64/zabbix-release-6.2-3.el7.noarch.rpm`
`sudo yum clean all`
`sudo yum install zabbix-agent`
`sudo systemctl restart zabbix-agent`
`sudo systemctl enable zabbix-agent`

#### バージョンアップ後、rootで動かす設定
`sudo vi /usr/lib/systemd/system/zabbix-agent.service`
以下をコメントアウト
`#User=zabbix `
`#Group=zabbix`

サービス再起動
`sudo systemctl daemon-reload`
`sudo systemctl restart zabbix-agent`

### エージェントのインストール
`sudo yum -y install zabbix-agent`

### 設定ファイルの編集
`cd /etc/zabbix/`
`sudo vi zabbix_agentd.conf`

##### 以下の箇所をZabbixサーバーのIPアドレスへ変更
`Server={ZabbixサーバーのIPアドレス}`
`ServerActive={ZabbixサーバーのIPアドレス}`

### エージェントの起動
`sudo systemctl start zabbix-agent`
##### Amazon Linux(旧バージョン） の場合
`sudo service zabbix-agent start`

### エージェントの自動起動設定
`sudo systemctl enable zabbix-agent`
##### Amazon Linux(旧バージョン） の場合
`sudo chkconfig zabbix-agent on`

### エージェントの状態確認
`sudo systemctl status zabbix-agent`
##### Amazon Linux(旧バージョン） の場合
`sudo service zabbix-agent status`

### AWS セキュリティグループの変更
セキュリティグループにデフォルトのままならTCPポート10050を適切に開ける

以上
ModelViewController

![14.ModelViewController.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/15627937-7182-3a36-b4a5-187a2cd2aa9b.png)

https://bliki-ja.github.io/pofeaa/ModelViewController/

ここまではビジネスロジックのモデルの中身に関するパターンでしたが、ここからはその外側のコントロールに着目するパターンです。まずは「Webプレゼンテーションパターン」が説明されています。

Model View Controller は、今となっては名前を紹介するまでもないぐらい有名な、いわゆる MVC です。Web 開発者で MVC を聞いたこともない人はまずいないでしょう。

が、MVC が Web 以前から存在することを意識してして言及している人はまれです。この用語が誕生したのは 1979 年のことです。コンピューターがようやくグラフィカルなユーザーインターフェースを一般的に備えるようになりだして間もなくの頃に、もう一般的な指針として言われているのです。

モデルはビジネスロジックなど、ゲームプログラミングで例えて言えば、ゲームのルールです。ビューはモデルの視覚化です。ゲームソフトは、計算モデルを画面に表示しなければ、人が遊べるものになりません。いくらゲームのルールが単純でも、視覚化がたいへんなのはよくあります。コントロールは、ユーザーの操作を含んだモデルとビューの連携制御です。

MVC においてもっとも重要なのは、モデルとビューの分離です。モデルとビューはともに重要ですが、依存関係の上位は必ずモデルです。プログラミングで言う依存関係以外に、セマンティックな依存もすべて含んで、モデルはビューから独立でなければなりません。HTML 表示するためのスタイル情報が欲しいからと、モデル領域にコードを書き足すのは MVC の鉄則を破ることになります。

モデルを固定してビューを交換するのは可能ですが、ビューを固定してモデルを交換するのは不可能です。Web ページのスマートフォンアプリ版は作れても、同じ Web ページを流用して会計システムを在庫システムにすることはできません。より安定していて抽象度が高いものを依存関係の上位に置くのは、モジュール設計の原則です。もしモデルに HTML 表示のためだけの属性を入れてしまったら、スマートフォンアプリに移行したとき、その属性が不要になるだけでなく、同じ考え方をしているかぎり、ビュー用のプラットフォームごとにモデルに追加変更が必要になってきます。

PoEAA が書かれた当時、Web の UI はリクエストごとに、決まった HTML ページを出力するしかありませんでした。どうしても作りが間接的になります。モデルはサーバーサイドにしかなく、ビューはクライアントサイドに出し切ってしまい、その間にはとても遅いインターネットがありました。現在の Web はフロントエンド技術が発達し、当時とは説明が食い違う点が多々あります。

現在では、Web の古い MVC の印象が強すぎるのを気にして、わざわざ MVVM などの新語が生み出されました。MVVM は明らかに、Web UI 以前の MVC と同じものです。ビューそのものをマウスで操作できるのが一般化すると、操作と表示が分かれていた頃と違って、ビューコンポーネントがコントローラーの役目を兼ねるのが自然になってきます。かつての MVC は、ビューはモデルの操作を持つもの、また、モデルの変化はオブザーバーによって暗黙的にビューに反映されるものになりました。現在この MVC は、ブラウザの中で JavaScript によって実現されています。

時代が違いすぎるという側面はあるものの、PoEAA に書かれたプレゼンテーションパターンは、古い Web MVC だけでなく、新しい時代のヒントとしても有用です。なぜなら、パターンの発見に携わった人たちはみな、2002 年の Web 以前からプログラミングをしていたベテランだからです。
【備忘録】traceroute/traceroute6コマンドについて

# 1.tracerouteコマンドについて
tracerouteコマンドは、指定されたホスト(ホスト名もしくはIPアドレス)までパケットが伝わる経路を表示します。
***pingコマンドでは、宛先からの反応がなかった場合、ホスト自身にもないがあるのか、ホストに到達するまでのネットワーク経路に問題があるのかは判別できません***が、tracerouteコマンドでは、宛先までのルータやホストが順に表示されるため、ネットワーク経路上に障害があった場合はその位置を特定できる可能性があります。

***なお、tracerouteに応答を返さないルータは少なからずあります。それらはルータの管理者がセキュリティ上の理由などからそうした設定をしたものであり、第三者にはどうしようもありません。***

なお、IPv6環境ではtraceroute6コマンドを使います。使い方はtracerouteコマンドと同じです。

# 2.tracerouteコマンド結果の読み方
以下はmacでの実行結果
```
% traceroute 8.8.8.8       
traceroute to 8.8.8.8 (8.8.8.8), 64 hops max, 52 byte packets
 1  aterm.me (192.168.10.1)  2.246 ms  1.108 ms  1.167 ms
 2  ne-ote301.kddnet.ad.jp (118.155.198.251)  18.328 ms  6.110 ms  41.033 ms
 3  142.250.160.73 (142.250.160.73)  8.711 ms  5.898 ms  5.306 ms
 4  * * *
 5  dns.google (8.8.8.8)  6.417 ms  6.225 ms  5.763 ms
```
上記の1〜3は、経由するルータのホスト名やIPアドレス、レスポンス時間がリストとなって表示されます。
4は、このルータはtracerouteに反応しないように設定されていると思われる。
5を見ると、目的とするIPアドレスの機器から返事が返ってきたことがわかる。
プロジェクトマネジメントにおけるサーバントリーダーシップの実践

bitFlyer システム開発部 プロジェクトマネジメント(PM)チーム 山内と申します。
お客様に日々ご利用いただくシステム、社内向けシステムやインフラ関連など
様々なシステムを対象として、プロジェクトが円滑に進むよう業務にあたっています。

我々がチームとして大切にしているのは「サーバントリーダーシップ」という考え方です。
(Wantedly)https://www.wantedly.com/companies/company_7215089/post_articles/305921#_=_

一般的な管理業務においてはトップダウン的なリーダーシップが適用され、また多くの職場でそのような体制が取られていると思います。

こういった体制における各個人の行動原理は、組織に対する義務感や与えられた役職、リーダーの指示により形成されていきます。
必要十分な人員で構成された組織と安定成長を続ける営業基盤があれば、こういった管理体制は力を発揮すると想像に難くありません。
ある意味、目指すべきゴールが明らかになっていて、その道程もある程度決まっているような
市場におけるリーダーシップはある種の強権性を持っているほうが望ましいとも言えます。

一方、当社は取り巻く環境も含め確固たるゴールが存在せず、未だ手探りでビジネスを作り上げようとしている部分があります。
また、これまでのやり方に固執せず、改善できるところを常に見つけていこうというカルチャーが醸成されています。
システム開発のメンバーに限らず、一緒に働くメンバーは皆各分野のプロフェッショナルとして十分な実力を持っている一方、まだまだ人数が足りないという状況です。
	
現状として我々PMチームはエンジニア組織に所属してはいますが、様々部署との連携をスムーズにすることが重要な役割です。
プロジェクトのゴールは誰か一人が決められることでもなく、議論を重ねる中でより良いものが見えてくることがあります。また、開発体制が概ね社内で完結していることもあり、実際に対話を重視するほうが問題の解決も早かったりします。

こういった点から、関わるメンバーの能力を最大限に生かしてプロジェクト全体の成果を最大化できるようなマネジメントスタイルを志向しています。

サーバントリーダーシップで公式に定義されていることに正確に沿っているか、という点はこの記事では論じませんが、当チームで関係者に動きやすい環境を作るために意識していることは、以下2点です。

●ステークホルダー間の意思統一
・ステークホルダーはそれぞれの目標、ゴールを持っている
・会社としての良い着地がその目標やゴールと合致するとは限らない
・合致しない目線を議論を通してすり合わせる
・できる限りそれぞれの利害が均衡すること
・技術的フィージビリティはしっかり意識する

我々はシステム開発部に所属しているので、技術的目線での仕様確認や横展開は特に大事になります。いくら優れたサービスを構想しても、実現できなければ意味がありません。
また、特定の部署の運用負担が増えてしまうケースもよくある話です。
我々は社内の多くのプロジェクトを担当しているため、他のシステムや部署にどのような影響が出るのかをある程度想定することができます。
プロジェクトはどうしても不確実な要素を含んだまま動き出すので、立ち上げ時期に想定される影響を洗い出しておくことは重要です。
理想的な形は、各ステークホルダーの想定する便益を最大化しつつ、俯瞰的もしくは横串的に全体最適の解を導き出せることだと考えています。
現実的に全てをそのような形に帰結させることは難しいですが、そこに近づけるようにPMとして取り組み続けています。

●社内プロセス対応や調整ごとの対応
・誰もが面倒と思うことを率先して処理する
・この姿勢がステークホルダーからの信頼につながる
・社内外問わず様々なルールを把握、アップデートする
・プロセスそのものの改善も考える(先々のPJへの投資)

我々の業界は厳格な法規制のもとに営業が許可されています。それは社内の規程や社外との遣り取りにおいても例外ではなく、多くのプロセスは定められたルールに従う必要があります。
そういった規程やルールも、改善の積み重ねにより成長するものです。
制定時の背景や運用の勘所などは、有識者に直接聞いてみるしかありません。
また、有識者が誰なのかという点も確認の時間を要することが多々あります。
規程に従って書面を残したり、手続きを進めることもかなりエネルギーを要する仕事です。
ただ、しっかりと規程やルールに則ってプロジェクトを進めることは必須の要件であり、この部分をPMがサポートすることで関係者が自身の専門領域の作業に集中することをサポートしています。
こういった姿勢は、各プロセスの重要性を関係者に認識してもらう良い機会にもなります。
PM自らそのプロセスの意義や背景を理解し、自分の言葉で説明することで協力を得られるようになります。

サーバントリーダーシップの実践ということで、裏方としての役割にフォーカスする形になりましたが、もちろんプロジェクトを推進する役割やリリース対応などでもPMは活躍しています。
関係者と対話を重ね、良い関係を築きながら一丸となってプロジェクトを進めていく、難しい局面を経験することもありますが、こうやってリリースを迎えた時の達成感はかなりのものです。

末筆ながら、当チームについてインタビュー動画がありますので、興味がある方はこちらをご覧ください。
(WASABIT)https://youtu.be/kjnUY2Ya3uM
git addする前の変更を取り消す

 - 変更を加えたものの、元に戻したい場合は下記コマンドを適宜実行して下さい。
 ただし、addもcommitもしていないファイルのみが対象です。
```
// 特定のファイルの変更を取り消す
git checkout <ファイル名>

// 特定のディレクトリ以下の変更を再帰的に取り消す
git checkout <ディレクトリ名>

// 全てを元に戻す
git checkout .
```

正常に作動しているかどうかはgit status -sで確認して下さい。
当たり判定のテストをする意味、なぜバグが起きるのか？をざっくり解説

## はじめに
初めまして！
AIQVE ONE Advent Calender 16日目を担当します@bluekumaと申します。
この記事では、当たり判定のテストの必要性について簡単な仕組みを元にざっくり解説していきたいと思います。

## 当たり判定と見た目は関係性がない
当たり判定のテストと言われると、
壁や建物などに向かって走る！
全てのボタンとその周囲をタップする！
など沢山あります、だけどそのほとんどは目で見れば　そこに壁がある、建物がある、ボタンがある
などそこが判定のある範囲だとわかるのに、わざわざ操作してテストすることに意味があるのか？といった疑問を持つ声も少なからずあるようです。

しかし、実際に「**必要なテスト**」です！
その理由は、「**当たり判定と見た目は関係性がない**」からです。

## 当たり判定の仕組み
どうして関係が無いのかをゲームエディターの「Unity」で作成するゲームを元に見てみます。
下に当たり判定のバグが発生した状態のボタンを用意しました。
![Animation01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286461/b6fc609f-cd1c-655e-d8cf-7de4cec785b3.gif)
バグ内容は「タップ操作に対して、見た目より明らかにボタンの反応する範囲(当たり判定)が広い」ことです


では、このButtonオブジェクトの情報をUnityで見てみます。
![スクリーンショット 2022-12-14 111850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286461/9920a533-e92e-5df8-f425-ad8374647de0.png)

右上の赤枠内が**見た目の設定**を行える場所
右下の赤枠内が**当たり判定の設定**を行える場所
になっておりそれぞれ**設定できる内容が別になっています**。
これが、見た目と当たり判定は関係性が無い理由です。
この右下の設定値次第で、見た目より大きくすることも小さくすることもできます。
また、バージョンなど環境によりますがUnity上でも当たり判定の範囲は数値でしか確認できず、見た目ではわかりません
ゲーム上でも通常、当たり判定は見えないので、実際に操作を行って当たり判定を確かめるというテストが必要になります。


他にも、当たり判定の範囲だけでなく
そもそもの当たり判定のあるなしもUnityでは、クリック1回で切り替えることができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286461/2cd07c0a-fe3b-bf57-4672-d41d2fd47e78.png)
右下のチェックボックスがそれにあたり、この何気ない場所にある小さなチェックのあるなしで当たり判定を簡単につけたり消したりできます。
開発者の誤操作でこのチェックボックスが外れてしまうとボタンはタップしても反応しなくなってしまいます、、、
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286461/93616cbc-3372-c328-718b-958fb6c0b799.gif)

そして、これらの設定はボタンや建物など一つ一つに設定がされており、
一つが大丈夫だから、他も大丈夫とは限らないので、あらゆるボタンや建物など個々のテストが必要です。

## 開発者は自分で確認をしていないのか？
では、バグがあった際は、開発者は自分で確認(テスト)していないのか？
といわれると**そうではありません！**
Unityの場合、Unityプレイヤーというすぐに動作をチェックできる機能があり、
開発者はそこで確認を行っていて、実装した・バグを修正した、と判断しているケースが多いです。
![123.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286461/ff228e79-b665-a13b-79aa-106a2eabaf82.gif)
しかし、あくまで**PC端末のUnityプレイヤーという環境上での動作**であり、実機(スマホやゲーム機)で実行している訳ではないため、バグによっては確認しきれず残ってしまうことがあります。
PCディスプレイの大きさとマウスで操作する場合、違和感はないが
スマホだと画面が小さく正確なタップも難しいので違和感が大きくなるなどです。
こういったUnityプレイヤーとスマホでの動作の違いが開発者の時点でバグに気づけない理由でもあります。
他にもバグ(エラー)によっては、Unityでは発生しても処理が続行されるが、スマホだと処理が続行されずに止まってしまい進行不能になるといったものがあったりと、、、
バグの原因はとても複雑で数えきれないほどあり、今回の例はかなり初歩的なものですが、テストを行う理由としては充分だと思っています。

なので、
このバグはプレイすればすぐにわかるのになぜ？
バグを修正したと言われたのに治っていない！
と思うことがあるかもしれませんが、**開発者は嘘をついているわけではないですし、全く確認をしていない事もありません**のでごく普通にバグがあったよと教えてあげてください！
【FileMaker】ルックアップで空白がコピーされない

慌てずに、テーブルのフィールド定義を確認しましょう。

# 確認する場所
確認するところは、フィールドのルックアップ設定にある、「内容が空欄の場合コピーしない」というチェックボックスです。
![スクリーンショット 2022-12-14 11.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/15b46853-427c-2433-c4f6-975766cd91ac.png)
ここに、チェックが入っていませんか？
デフォルトだと、チェックが入ってます。
空白をコピーしたいときは、ここのチェックを外します。

:::note info
ルックアップの定義と更新については、公式のこちらを参考にしてください。
https://help.claris.com/ja/pro-help/content/lookups.html
:::

# 動作確認
では、このルックアップの、「内容が空欄の場合コピーしない」チェックボックスのオンオフの違いをみていきましょう。

テスト的に、見積書と請求書のリレーションシップとルックアップを作りました。
![スクリーンショット 2022-12-14 10.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/94d97d05-e8d8-6486-deb0-f81f8412b380.png)

このリレーションシップで、見積書にある見積種類に入力されていたら請求書に反映したい、と思っています。
でも、請求書では見積書をルックアップする前は「未処理」であることを明示的に残しておきたいので初期値データとして「未処理」を設定しています。
![スクリーンショット 2022-12-14 11.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a41ec2b6-5c14-0df2-b224-8ba95f4d870a.png)


## オンの場合
この場合は、空白がコピー「 <font color="red">されない</font> 」ことを見ていきます。
![スクリーンショット 2022-12-14 11.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a594a76e-5ec1-88d1-e2a0-9d396d3dcb0a.png)

### 見積種類が設定されているとき
(1)見積種類に「試算見積」が入力されています。
(2)請求書レコードを新規作成した時点では、見積種類に初期値の「未処理」が設定されています。
(3)請求書で、見積テーブルの主キーをキーにルックアップします。
見積種類がコピーされました。
![スクリーンショット 2022-12-14 11.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/e811c15b-b732-5508-fd49-85ea29c0e6e2.png)

### 見積種類が設定されていないとき
(1)見積種類に何も入力されていません。
(2)請求書レコードを新規作成した時点では、見積種類に初期値の「未処理」が設定されています。
(3)請求書で、見積テーブルの主キーをキーにルックアップします。
見積種類が 「<font color="red">未処理</font>」 のままです。
![スクリーンショット 2022-12-14 11.49.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/f3db98dd-2d48-821e-3e0d-0322e7549d75.png)

残念な結果になってしましました。

では次に、「内容が空欄の場合コピーしない」チェックボックスがオフになっている時を見ていきます。

## オフの場合
この場合は、空白がコピー「 <font color="red">される</font> 」ことを見ていきます。
![スクリーンショット 2022-12-14 11.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/99a036d9-5d46-c089-b606-031e5758cdcd.png)

### 見積種類が設定されているとき
こちらは、「内容が空欄の場合コピーしない」チェックボックスがオンになっている時と同様、見積種類が正しくコピーされています。
(1)見積種類に「詳細見積」が入力されています。
(2)請求書レコードを新規作成した時点では、見積種類に初期値の「未処理」が設定されています。
(3)請求書で、見積テーブルの主キーをキーにルックアップします。
見積種類がコピーされました。
![スクリーンショット 2022-12-14 11.54.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9856ecb9-14f7-9f4c-75e5-ca0e6ead81d2.png)

### 見積種類が設定されていないとき
(1)見積種類に何も入力されていません。
(2)請求書レコードを新規作成した時点では、見積種類に初期値の「未処理」が設定されています。
(3)請求書で、見積テーブルの主キーをキーにルックアップします。
<font color="red">空白がコピー</font> されていますね！
![スクリーンショット 2022-12-14 11.57.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/5985229d-a23e-128f-866b-c1aa6ba6b71b.png)

# 意外と見落としがち
この設定、意外と見落としがちだったりしませんか？
大抵の場合、空欄の時はコピーしなくてもいいだろうという思い込みもあったりで、今回のように初期値があった場合に結果が違うことになります。
その他、再ルックアップしたときにも同じようなことが言えますので、この「内容が空欄の場合コピーしない」チェックボックスもしっかり詳細仕様に組み込んでいきましょう。

:::note info
再ルックアップについては、先に紹介したページの「ルックアップを更新するには」に解説があります。
参考にしてください。
https://help.claris.com/ja/pro-help/content/lookups.html
:::
dockerで起動したmysqlコンテナにターミナル上で日本語が入力できなかった話

# 事象
ターミナル上でmysqlコンテナにログインし日本語を打ってもエンターを押すと消える・・・
ネット上に当該事象に対する記事はたくさんあるが、いずれも上手くいかなかった。

# 解決策
自分の場合は以下で上手くいった。
docker-compose.ymlしかなかったので、Dockerfileを作成
Dockerfileでサーバーに対してにUTF8の設定を走らせるようにする
このとき、イメージにはmysql8-debianとして、指定しないとOracleのサーバーが立ち上がってしまい、apt-getが使えないので注意。
```Dockerfile
FROM mysql:8-debian
RUN apt-get update
RUN apt-get -y install locales-all
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
```

docker-compose.ymlに、Dockerfileでbuildするように追記
```docker-compose.yml
  mysql:
    build:
      context: .
      dockerfile: ./Dockerfile
```

# 参考記事
https://tech.adseed.co.jp/m1-docker-japanese
https://syoukinkubi.com/?p=941
SlackのステータスをGoogleカレンダーの予定に合わせて自動更新してみる

今回はGoogleカレンダーの予定をSlackステータスに反映させる処理を自動化しました。

社内のコミュニケーションツールにSlackを使っているので、Slackでメッセージを送る前にその人のステータスをチェックすれば、勤務時間内か、出社しているか、確認できて便利ですよね。

ただ、手動だと変え忘れることも多いので自動化できたらイイな！と思ってWarp使ってみたら簡単にできたので紹介します～。

## SlackのGoogleカレンダーアプリを使えば？
SlackにはGoogleカレンダーアプリがあるので、そちらを使ってスケジュールを反映させることができます。
https://slack.com/apps/ADZ494LHY-google-calendar

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/9566a298-30a2-8305-d09f-b7c748fef742.png)


ただ、標準アプリだとステータスが「In a meeting • Google Calendar」で固定になってしまいます。休暇予定もカレンダーに登録しているから、休みなのか仕事中なのか判断できない。。

もっと予定に合わせてステータス内容を変えたい！！

## ASTERIA Warpで理想のSlack-Googleカレンダー連携を実現！
ということでASTERIA Warpを使って、Googleカレンダーから予定を取得して、その内容をもとに勤務時間や休暇情報をSlackステータスに表示される処理をつくります！


### 処理の流れ
処理の流れは大きく分けて2つ。
①Googleカレンダーから予定を取得
②Slackステータスを変更

### Googleカレンダー連携の事前設定
Googleカレンダーからの予定取得はASTERIA WarpのGoogle Calenderアダプターを利用すれば簡単に取得ができます！詳しい手順は [Google カレンダーアダプターの紹介](https://support.asteria.com/hc/ja/articles/360003140273 "Google カレンダーアダプターの紹介") を見て設定しました。

### Slack連携の事前設定
Slackステータスは、Slack APIを使うとできそうです。
＞ [User presence and status](https://api.slack.com/docs/presence-and-status)
今回は手軽に連携できそうなトークンを利用したステータス変更を行ってみます。
まずは、Slack APIを使うためにSlackアプリを作成します。
作成されたアプリ > 「Create New App」をクリックして、必要な情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/b38bb13e-738e-4479-c959-ea62385116c3.png)

アプリの詳細ページから「OAuth & Permissions」＞「Scope」でUser Token Scopesに”users.profile:write”を追加。
その後、「OAuth & Permissions」＞「OAuth Tokens & Redirect URLs」で”Install to Workspace”をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/4da2b9ac-6db4-c33d-19ed-53e34c7bd8cc.png)


取得した「User OAuth Token」をコピーして保存しておきます。
これでSlack側の設定は完了です。
## 処理の作成
それではフローの作成です！
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/8d570488-dd54-7290-a6d0-84a9cfc86fac.png)

こんな感じでシンプルなフローになりました。

「スケジュール取得」のGoogleCalendarGetコンポーネントでは、取得したいカレンダー項目を選択するだけで簡単にスケジュールの取得ができます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/01304e4e-2d1d-d3af-20d8-272fcc3efda5.png)


「ステータス変更」のRESTコンポーネントでは以下のように設定しています。
URL：https://slack.com/api/users.profile.set
HTTPメソッド：POST
URLパラメータ：token, profile
URLパラメータのtokenではSlackアプリ設定で取得した「User OAuth Token」を指定します。

「JSON作成」のMapperコンポーネントでは、カレンダーの予定ごとにJSON形式のテキストを出力しています。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/cca01938-988d-368b-035f-448e503c32b8.png)

ステータステキストをカレンダーのタイトル、ステータス絵文字は状況に合わせて変えていて、例えばテレワークならお家の絵文字になるようにしました。
このJSONデータをURLパラメータのprofileにマッピングします。

### 結果を確認
実行すると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48286/cd883fd9-1f96-ed7b-abd1-ec066d508505.png)

無事にステータスが変更されました～。これを毎朝更新するように実行設定すれば自動で変更されます。
便利になりました:v:
【Athena】nullだったらこの値、を繰り返したい【COALESCE】

## nullだったらこの値を入れる

外部結合などにより、値があれば、なかったらという条件をつけたいとします。if文を使うと以下のようになります。
```sql
SELECT
    IF((hoge IS NULL), foo, hoge) as column_name
FROM
... 
```

これが一つなら特にややこしくないんですが、hoge, foo, bar, piyo と値があった場合if文をnestしていく事となり、書くのも読むのもかなりしんどくなります。実際に例をあげたいのですが、面倒なので書きません…。

## COALESCEを使う
そういう場合はCOALESCEを使うと簡単に記述できます。

https://prestodb.io/docs/current/functions/conditional.html#coalesce

```sql
SELECT
    COALESCE(hoge, foo, bar, piyo)
FROM
```

このように記述します。左から評価していくのでhoge, foo, bar, piyoの順に最初にnull出なかった値が入ります。
知っていると簡単にかけるのですが、しらないとifを何度も書いたりcase文を記述することになるので注意です
編集可能な共有リンク（Editable Shared Link：ESL）って何よ？

# 編集可能な共有リンク（Editable Shared Link：ESL）とは？

編集可能な共有リンクとは、共有リンクを送付するだけで対象のファイルを編集してもらうことが可能な機能になります。

今までのBoxの共有リンクは、対象ファイルを「表示のみ」、「表示およびダウンロード可能」の2つのみ選択が可能でした。

今回の新機能は3つ目の選択肢として「編集可能」が登場し、これを利用することで共有リンクから対象ファイルを編集することが可能になります。

共有リンク発行時の画面イメージは下記になります。
![スクリーンショット 2022-12-14 11.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988179/2b4e49ca-f65a-1470-f3e7-e51c9acee103.png)

編集可能な共有リンクを利用するためには、Boxアカウントへのログインが必要になりますので注意してください。Boxアカウントにログインしていない場合は、「表示およびダウンロード可能」が利用可能です。

編集可能な共有リンクを受け取った人でBoxアカウントにログインしている人は、下記のような画面が表示されます。Box Edit、Office Onlineを利用してファイルの編集が可能です。
![スクリーンショット 2022-12-14 11.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988179/09ff9c2c-08d8-bf21-ea0f-72df32ac67e6.png)



# 編集可能な共有リンクは何ができるの？
主な機能なファイルを編集ですが、下記の細かい機能も利用できるようになります。
+ メタデータの表示/編集、カスタムメタデータの表示/作成
+ コメントの表示/追加
+ 注釈の作成
+ 自分が作成した注釈の削除
+ 推奨アプリ
+ アクティビティストリーム
+ @メンション（ファイルの所有者、フォルダまたはファイルに対象ユーザーがコラボレーションされている場合）

# 編集可能な共有リンクは何が嬉しいの？

今までは1つのファイルだけを編集して欲しい場合、対象ファイルにコラボレーションを実施するか、フォルダを作成してそこに対象者をコラボレーションしていました。

このやり方でも問題はないのですが、下記のような課題がありました。
+ 1つのファイルのコラボレーションばかりしていると、トップ画面に単品ファイルばかりが表示されてしまい、Boxの利用が長いユーザーほど使わないファイルがずっとトップ画面に表示されてしまう。
+ 短期間で終了する場合でもフォルダを作成してコラボレーションするので、たくさんのコラボレーションフォルダができて、視認性が下がってしまう。そもそも、フォルダ作成して、コラボレーション招待をしてという作業が手間。

上記の課題を解決するために編集可能な共有リンクがリリースされました。
編集可能な共有リンクを利用すれば、下記のようになります。
+ 編集してほしいファイルのみ共有リンクを相手から受け取れば良いので、トップ画面にファイルが乱立することがない。
+ 短期間に資料を編集して欲しいだけであれば、たくさんのコラボレーションフォルダを作成することなく、編集可能な共有リンクだけ相手に送れば良い。

# まとめ
ここでは詳細は記載できませんが、今後も編集可能な共有リンクには様々な機能がリリースされる予定です。
共有リンクというとてもシンプルな機能ですが、細かいところに手が届く機能に進化予定です。
お楽しみに！
COEIRONKのエンジンをUbuntuで動かす

##### IPFactory Advent Calender 2022 19日目の記事です。
https://qiita.com/advent-calendar/2022/ipfactory

## COEIROINKとは
[COEIROINK](https://coeiroink.com/)は[シロワニさん](https://twitter.com/shirowanisan)が開発しており、[VOICEVOX](https://voicevox.hiroshiba.jp/)派生のテキスト読み上げソフトです。
公式での対応環境はWindows(CPU,GPU)とMac(CPU)です。

## きっかけ
Discord用の読み上げBOT([0kqBee](https://net0kq.fanbox.cc/posts/3803483))を開発していてCOEIROINKにも対応させたいと思っていました。
しかし、上記の通り公式での対応はWindowsとMacのみでありCOEIROINKのためだけにわざわざWindows環境を用意するのも面倒でした。

## 使用した環境
OS: `Ubuntu 20.04 LTS`
GPU: `RTX3060 12GB`
Python `3.8.10`

## 手順
今回はGPU版を動かします。
CUDA 11.3以上に対応したGPUが必要です。
CPUのみの場合も基本的には同じ手順で動きます。
VOICEVOXと構造が似ているのでVOICEVOXをソースから動かしたことがある人であればおそらく簡単です。
### 1. リポジトリのクローン
COEIROINKのソースはGitHubで公開されています。
https://github.com/shirowanisan/voicevox_engine

```shell
$ git clone https://github.com/shirowanisan/voicevox_engine.git
```
ブランチを`c-1.6.0+v-0.12.3+gpu`に切り替え
```shell
$ cd voicevox_engine
$ git checkout c-1.6.0+v-0.12.3+gpu
```

### 2. 必要なパッケージのインストール
`requirements.txt`だけでは`espnet`が不足していると怒られるためインストール
```shell
$ pip install -r requirements.txt
$ pip install typing-extensions>=4.1.0
$ pip install espnet
```

### 3. 音声ライブラリの追加
このまま起動しようとするとspeaker_infoがないためエラーが出てしまいます。
[ここ](https://coeiroink.com/download)から好きな音声ライブラリをダウンロードして導入してください。
今回は[つくよみちゃん](https://tyc.rei-yumesaki.net/)を使っています。
```shell
$ mkdir speaker_info
$ wget -O tsukuyomi_chan.zip https://www.dropbox.com/s/lvxit2svbi1dvdf/3c37646f-3881-5374-2a83-149267990abc.zip?dl=1
$ unzip tsukuyomi_chan.zip -d speaker_info
```

### 4. 起動
`--host 0.0.0.0`でlocalhost以外からのアクセスを許可
`--use_gpu`でGPU処理を指定
```shell
$ python run.py --host 0.0.0.0 --use_gpu
```

## 感想
VOICEVOXと構造が似ているせいか普通に動きます。
試したらGoogle Colabでも動きました。
そしてVOICEVOXよりもVRAM消費が少ないのがGood
読み上げBOTでも問題なく使えてます。

## 課題
MYCOE対応による弊害なのか、前回のリクエストと違うspeaker_idのリクエストが飛んでくると数秒ほど処理が遅れます。(おそらくモデルの読み込みが入る)

##
18日目の記事
[futabato](https://qiita.com/futabato)さん
https://01futabato10.hateblo.jp/entry/2022/12/18/204929

20日目の記事
[n01e0](https://qiita.com/n01e0)さん
https://feneshi.co/chromoly/
実装してわかったNext.jsのnext/linkとCDNキャッシュの注意点

Next.js + CDN、でSEOサイト構築を行った際に`next/link`の挙動に苦しめられたのでその共有をしたいと思います。

## 実装構成
今回のケースは以下の構成で発生した件となります。
- CDN: Cloudflare
- Next.js: CloudRun

----
はじめに前提知識として`next/link`とCDNキャッシュについて触れておきます。
## Next.jsの`next/link`について
Next.jsではサイト内ページ遷移に`<a />`タグではなく、[next/link](https://nextjs.org/docs/api-reference/next/link) の利用が推奨されています。
具体的な利用はリンク先の詳細を見ていただければと思いますが、基本的には`<a />`と同じような使い方となります。

### `next/link`の動作イメージ
`next/link`と`<a />`ではページ遷移の挙動が異なってきます。
具体的にはそれぞれ以下のような違いがあります。

#### `<a />`の挙動
`<a />`タグでのページ遷移はリンク先ページを全て読み込んで最初からレンダリングを行います。
![スクリーンショット 2022-12-14 11.10.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316898/10a05af9-f98c-76e6-e7b4-fca540583010.png)


#### `next/link`の挙動
`next/link`でのページ遷移はリンク先ページの一部分をjsonファイルとしてapi経由で取得し、共通レイアウト以外の箇所をSPA的に差し替える処理を行います。
![スクリーンショット 2022-12-14 11.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316898/9e171ca9-0f70-469f-6c70-4ad0adff321f.png)


### `next/link`のメリット
上記で説明した違いの影響で`next/link`では以下のメリットがあります。

- **ページ遷移が高速**
共通以外の遷移先ページの必要最低限な情報のみを取得して部分的にレンダリングされるため無駄が少なく高速にページ移動が可能となります。

- **共通コンポーネントのstateが保持される**
レイアウト側に共通コンポーネントを配置しておくと、そのコンポーネントはページ遷移時も前の状態を保持し続けます。
ドロワーメニューの開閉状態や、ユーザーログイン状態などが保持されるのでSPA的なUIが実現できます。

## CDNキャッシュについて
それほど更新が少ないページであればキャッシュを作成し、ユーザーリクエスト時にキャッシュより返すことで高速かつサーバー負荷を下げられるメリットがあります。
キャッシュの作成をCDNと呼ばれるエッジサーバーに配置することで更に高速なレスポンスが可能となります。

## CDNキャッシュ利用時の`next/link`の問題点
SEOサイトにはわりと必須になるCDNキャッシュですが、`next/link`との併用する場合に以下のような問題点が出てきます。

### キャッシュが2系統で作成される
ページ流入形式に応じてデータ取得方法が異なるためキャッシュがそれぞれ経路別に作成される事象が発生します。

- **直接ページにランディングするケース**
この場合はページURLをキーにしてキャッシュが作成されます。

- **`next/link`でページ遷移するケース**
この場合は遷移先ページ情報apiで取得するjsonデータに対してキャッシュが作成されます。

このように経路別にそれぞれキャッシュが作成されてしまうためキャッシュのパージ処理が複雑化するのと、キャッシュのライフサイクルのズレから経路によって更新前のキャッシュが表示されるなどの問題が発生します。

SEO記事のように更新頻度が少ない場合はそれほど影響は出にくいのですが、コンテンツ更新の整合性を求める場合は取り扱いが難しくなるので注意が必要です。

### CDNリダレクトが効かなくなる
CDNサービスにはCDN側でリダレクトを行ってくれる機能があります。
この機能はエッジ側でリダレクト処理を行うのでアプリケーションサーバーに負荷をかけずに高速にリダレクトできて便利なので積極的に採用していきたいものになっています。

しかし、`next/link`を使うとこのCDNリダレクトが使えなくなってしまいます。
CDNリダレクトはページURLパスをkeyとしてリダレクト処理を行いますが、`next/link`の場合api経由でjsonデータを取得し、SPA的にブラウザ側でURL historyを変更するのでCDNリダレクトが反応しなくなってしまいます。

対策としてはCDNリダレクトをやめてアプリケーション側でリダレクトを行う必要が出てきます。

## まとめ
Next.jsとCDNの併用はよくある組み合わせかと思いますが実際運用してみると思わぬ落とし穴にハマりました。
今回は結果としてサイトの運用上の都合より`next/link`の利用を諦めましたが、`next/link`にはそれなりにメリットがあるので上記の問題が別の方法で解消するのであれば再度利用したいとは思います。
HTMLでアコーディオンを作成する方法

webサイトでよく使用されるアコーディオンですが、JavaScriptを使わずに簡単に実装することができます。
cssなどでスタイリングすればUIも自由に変えることが可能です。

●基本的なHTML
```HTML
<details>
  <summary>ここをクリックでアコーディオンが開きます</summary>
  アコーディオンの中身のコンテンツ
</details>
```
●実装プレビュー
<details>
  <summary>ここをクリックでアコーディオンが開きます</summary>
  アコーディオンの中身のコンテンツ
</details>

### 参考URL
https://ics.media/entry/220901/
【ログ】Atcoder Beginner Contest 068 B - Break numbers

# 問題文
> 正整数 N が与えられるので、1 以上 N 以下の整数のうち、最も 2 で割れる回数が多いものを求めてください。答えは必ず 1 つに定まります。

# 入力と出力
> N

>問題の答えを出力する

https://atcoder.jp/contests/abc068/tasks/abc068_b

# ACコード
```
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
    int n;
    cin >> n;
    int ans = -1;
    int maxcnt = -1;


    for (int i=1; i<n+1; i++) {
        int counter = 0;
        int y = i;
        while (y % 2 == 0) {
            counter++;
            y /= 2;
        }
    if (maxcnt < counter) {
        maxcnt = counter;
        ans = i;
    }

    }    
    cout << ans << endl;
}

```

# 失敗したこと/学んだこと
- 失敗コード
```
for (int i=1; i<n+1; i++) {
        int counter = 0;
        while (i % 2 == 0) {
            counter++;
            i /= 2;
        }
    if (maxcnt < counter) {
        maxcnt = counter;
        ans = i;
    }
```
while内でforで宣言したiを直接操作してしまっている。なのでforと同じレイヤーにあるif内でiが書き換えられてしまった。

- for文内でカウンタ変数を使って操作をしたい場合は一度コピーを作ってから行う。
技術力以外に大事なこと。高い価値を生み出すエンジニアになるには？

:::note info
この記事は[『LITALICO Advent Calendar 2022』](https://qiita.com/advent-calendar/2022/litalico)15日目の記事です
:::

## はじめに
発達障害・学習障害のお子様向けの施設運営をする際のシステムを運用・開発している福嶋です。
私はこんな人です。↓
- エンジニア経験はまだまだひよこ🐤(2年目)
- 今年の7月に社内異動をしまして、初めて自社のプロダクト開発のポジションに携わり現在に至ります

## この記事は何？
初めて、社内のプロダクト開発のポジションにジョインした時に、技術以外に学ぶべき大事なことをお伝えします。(完全個人的な意見です。)

## ジョインした当初の誤解
開発経験はちょびっとありましたが、実際に自社のプロダクト開発に携わることは初めて。
エンジニア経験が浅かった私は、「技術力が全て」だと考えていました。(もちろんエンジニアなので技術力は大事である。)

そんな私は、異動した当初
- リポジトリのソースコードを片っ端から読む
- 使われている技術スタックの勉強をする
- 仕様(設計書まわり)をとにかく見る

ということをやっていました。
間違いではなかったと思いますが、何かが足りない。。。。
と思っていたある時、気づきを得たので自戒の念を込めて記事を書いていきたいと思います。

## 結論:ドメイン知識向上に心臓を捧げよ
### そもそも、ドメイン知識とは何なのか？

>ドメイン知識（domain knowledge）とは、特定の専門分野や業界についての知識、知見のこと。専門家やその領域に詳しい人が持つような体型的な専門知識のことである。

https://makitani.net/shimauma/domain-knowledge

ドメイン知識は大きく2つに分けられる。
* 現場の方が実際に行われる業務の知識
* 関連する法令等の知識


### ドメイン知識が必要不可欠であると思ったきっかけ
上期の評価面談で上長から、「タスクとして物事を捉える傾向があるので、問題解決の意識付けをした方が良い。」と指摘を頂きました。日々の業務や開発に意識が集中しすぎていてこの点に気づかなかったのは反省点です。

技術や機能の実装はあくまでも問題解決の手段の1つでしかないことを改めて痛感しました。プロジェクトが発生するということは、下記のように、何かしら解決したい問題があるからです。

* KPIとしてこういう数値が管理できていない(問題)　⇨ だから〇〇の機能が必要(解決)
* 〇〇の作成漏れがある(問題)　⇨ だから〇〇のデータを定期出力する必要がある(解決)

とは言いつつ、「なぜ問題解決の意識がなかったのか？」を考えたときに、本質的な「問題」を特定できていなかったのではないかという仮説を立てました。では、そもそも「問題」とは何なのでしょうか？調べたところ下記のような意味合いで使われるようです。

>「問題」とは“あるべき姿”と“現状”の差のことをいいます。

https://mngmnt.jp/2017/02/03/problem-issue/

<img width=50% alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2276310/75175d67-3466-2e5e-7aff-00144d38913f.png">

※個人的には、「ありたい姿」という言葉の方がしっくりきますので、以降「ありたい姿」というワードを用います。

### なぜドメイン知識が必要なのか？
自分を例に考えてみます。
例えばですが、私自身の課題の一つとして、社内からの要望に対しての提案ができていないことがあります。「社内からの要望(=ありたい姿)」を認識したとしても、「ドメイン知識(=現状)」への理解が甘ければそもそも本質的な問題を特定できないことに気づきました。

「〇〇したいから△△という機能を作ってほしい」という要望が上がってきたとしても、本質の問題解決方法としてズレが生じているのは多々あります。

私のケースの場合、下記のような「ドメイン知識(=現状)」がないと適切に問題(=差分)を認識できないことを痛感しました。
* 現場でのオペレーションの理解
    * 誰がいつその業務を行うのか？
    * なぜその業務を行うのか？
    * 対象の業務のタイムラインは？
* 業務リスクについて
    * 請求周りなど遅延やミスが決して起きてはならないクリティカルな業務は何か？
* 業務負荷について
    * 現状、誰にどれくらいの業務負荷がかかっているのか？


適切に問題(=差分)を認識することが大前提としてあって、「技術でどうアプローチするのか？」というエンジニアならではの良い提案ができるのではないかと考えております。

![Untitled (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2276310/d32f86d4-dc5b-3151-6072-e8274d57569e.png)

という気づきでした。

### 自戒と来年の目標
- エンジニアがシステムを運用・開発をする理由の1つとして、「問題解決」をするためにある
    - ⇨ **ただ実装する or 要求を満たすだけではなく技術で課題を解決できるエンジニアになる**
- 問題を特定するためには、まずドメイン知識をつけなければならない
    - ⇨ ドメインエキスパートに依存するのではなく、自ら業務や法令の知識をつけ難易度の高い開発をリードできるようになる

### 自分のアクション
さらに、下記を自分のアクションとして残しておきます。

- 複雑な社内の問い合わせに対応ができる状態になる
    - 過去の問い合わせを毎日少しでも目を通す
    - 問い合わせが生じた理由まで考える。わからなければ聞くor議論する
- 社内からの要望に対しての提案ができる状態になる
    - 請求周りの深い知識をつける
    - 業務リスクを知る
    - 現状の現場でどれくらいの業務負荷があるのかを知る
    - 要望に対しての理由と背景を知る
    - 現場の業務フローを把握する(何の業務をいつまでに誰がするべきなのか？)
- 関連する法令等の理解を進める
    - 2024年法の資料が出でいるので、読み込む
    - 愛でる用の福祉業界の本を買い、継続的に学習の機会を作る

## 後書き
今回内容を迷っている中で、下記の記事に出会いました。

https://qiita.com/jnchito/items/5c3eb3640ad57b3edc6c

「２ヶ月前の自分が泣いて喜ぶ記事」という言葉が自分の中でピンときまして、今の自分にしか書けない等身大の記事を書くことができました。ありがとうございますm(_ _)m
プログラミングで副業を始める方法と注意点

Qiita初記事です。

今回は、私がプログラミングで副業を始めた方法と注意点について書いていきたいと思います。

## どんな人が書いているのか？
社会人歴5年目ですが、副業歴も4年ほどあるエンジニアです。
個人ブログやプログラミングでお小遣い稼ぎをしてきました。

## 記事の概要
- 前提
- 副業の始め方
- 注意点

## 記事の目的
- プログラミングで副業を始める方法がわかる
- 初めての副業における注意点がわかる


## 前提
前提として、副業を始める場合には当然会社が副業を認めているか確認する必要があります。
会社の規定を確認したり、人事の方に聞いたりして副業可能かどうか確認しましょう。

最近は副業を許可している企業も増えている印象です。

## 副業の始め方
副業を始めるには大きく分けて2つの方法があると思います。

1. 友人・知人の紹介で始める
1. クラウドソーシングのマッチングサイトで探す

どちらも経験があるので、私の体験に基づいてお話しできればと思います。


## 友人・知人の紹介で始める
私の場合、友人の友人が起業を考えているタイミングで会話する機会があり、

　「起業メンバーとして参画→後に副業として業務委託契約で開発」

といった流れで副業を始めることになりました。

友人といえど、会社を作ってから改めて開発の依頼をされたので、業務委任契約書にてしっかり契約を結びました。

### メリット
友人や知人の紹介で始めるメリットとしては、
- コミュニケーションがとりやすい
- 始めるまでのハードルが低い

等が挙げられます。


### デメリット
逆にデメリットとしては、
- 開発範囲があいまいになりがち
- 期間や規模は小さくなりがち
などがあります。

## クラウドソーシングのマッチングサイトで探す

2つ目はよりメジャーなアウトソーシングサービスの利用です。

有名どころでは、クラウドワークスやランサーズがあります。

- クラウドワークス(https://crowdworks.jp/)
- ランサーズ（https://www.lancers.jp/）

自分のスキルを登録して待つ方法もありますし、募集を見て自分から応募することも可能です。
（初めての方は後者の方がハードルは低いかと思います。）

### メリット
クラウドソーシングのメリットとしては、
- 案件が豊富
- 能動的に開始できる

等が挙げられます。

### デメリット
逆にデメリットとしては、
- 競争倍率が高い
- ある程度の実績も必要

などがあります。

私は開発経験があったAngularで検索をかけて片っ端から応募しました。

## 副業を始める際の注意点
続いて、副業を始める際の注意点についてです。

実際に副業してみて感じた注意点は下記の通りです。
- 実績はやはり必要
- 単価の交渉は非常に重要


### 実績はやはり必要
当然ですが、実績は当然必要になってきます。

実績を見せる方法としてはWebサイトでプロフィールや成果物をまとめ、ポートフォリオとして公開する方が多いようです。

あまり公開できる実績がなければ、下記を参考に副業として始めたいスキルで成果物を作ってみるのもありです。

参考） Qiita_ポートフォリオ(https://qiita.com/tags/%e3%83%9d%e3%83%bc%e3%83%88%e3%83%95%e3%82%a9%e3%83%aa%e3%82%aa)

また、ポートフォリオに載せるような実績がない方は、ポートフォリオの提出が不要な案件に片っ端から募集をかけて実績を積むのもありです。

あくまで個人的な意見ですが、募集されているスキル全てを持っていなくても、とりあえず応募して作業しながら技術を身につけていくのが良いと思います。

## 単価の交渉は非常に重要
続いて単価の交渉についてです。

クラウドソーシングで「単価は契約後に交渉」等と書かれている場合は、低すぎる単価で受けることのないよう注意しましょう。
最初は低い単価で実績を積むのもありですが、価格交渉で安請負をしてしまうと損するのは自分です。

## まとめ
最後にまとめですが、副業を始めるにはいきなり完璧な作業をしようと思わず、案件をこなしながらスキルアップしていくイメージで良いと思います。

また、単価については実績を作るために最初は低くても良いですが、ある程度経験を積んできたら安請負いしないよう注意しましょう。

副業を始めるのは思ったよりもハードルは低いです。
まずは行動あるのみ！気になった方は取り急ぎクラウドソーシングサービスを覗いてみてください。

- クラウドワークス(https://crowdworks.jp/)
- ランサーズ（https://www.lancers.jp/）
イーサリアム Goerli テストネットのテスト ETH 入手する方法 2022 版

イーサリアム 2.0 の The Merge 実施できて PoS に切り替えたので、テストネット Ropsten / Rinkeby / Kiln がシャットダウンして、今後は、テストネットは Goerli と Sepolia が稼働するためこちらを使いましょうと発表されました。

https://blog.ethereum.org/2022/06/21/testnet-deprecation

本記事では、Goerli テストネットの ETH 入手方法を紹介します。

## SNS 共有リンクでもらう
https://goerli-faucet.mudit.blog/

Twitter または Facebook でイーサリアムのアドレスをポストして、その発言のリンクを入力することで ETH もらえます。

## alchemy 運営の faucnet サイト

https://goerlifaucet.com/

アドレス入力するだけでよいが、一日１回の制限で 0.2 Goerli ETH もらえます

## PoW マイニングでもらう
https://goerli-faucet.pk910.de/

PoS のバリデーターの動作検証は 32 ETH 必要なので、もともと discord でボットにコマンド投げれば 32 ETH もらえましたが、悪用を防止するため、こちらに切り替えたようです。
アドレスを入力すればよいが、本当にマイニング処理実行されるので、それなりに CPU の負荷がかかります。

いくつ注意点があります

- CPU でマイニングする処理実行するので、それなりに負荷がかかります
    - マシンのスペックによって最大数が異なりますが、実行するワーカー数は調整できます
- １回開始すると、最大５時間までマイニングできます
    - 途中で停止するのもできます
    - そこまでの ETH を自分のアドレスに送金できます
- マイニング終わってから、手動操作で自分のアドレスに送金する必要があります
    - さらに、期限が設けられて、期限すぎると、送金できなくなるので、忘れずに送金しましょう
- もらう ETH 数ですが、**マイニング** なので、競争ゲームであり、参加している全員の計算力と自分が使っている計算力次第です
    - 画面上に予想最大値を表示してくれるので、参考できます
    - 余談ですが、原因分からないですが、平日は添付画像のように 1.5 ぐらいですが、週末の場合、5 ぐらいだったりします

![Screen Shot 2022-12-14 at 11.03.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4777/2e04269f-91c8-b6b4-4768-cf705c47d2fe.png)

## まとめ
PoS のバリデーターの検証をやりたいなら、PoW のマイニングのほうが良さそうですね。
GitHub Actions で刺さったので fail するようにした

# チェックして fail するようにした

謎に止まってしまう → `canceled`(timeout) 状態になるので，
一定時間ログが増えなくなったら，fail することにした．
とりあえず雑に解決した

```yaml
run: |
  touch command.log
  run_command | tee command.log &
  prev_count=-1
  for i in 1 2 3 4 5 6 7 8 9 10; do
    jobs
    jobs_count=`jobs | wc -l | awk '{print $1}'`
    echo "jobs count = ${jobs_count}"
    if [ $jobs_count -le 0 ]; then
      echo 'success'
      break
    fi
    wc -l command.log
    count=`wc -l command.log | awk '{print $1}'`
    echo "waiting $i / 10 ... $prev_count -> $count"
    if [ $count = $prev_count ]; then
      echo 'kill process...'
      kill %1
      killed=1
      break
    fi
    prev_count=$count
    sleep 60
  done
  rm -f command.log
  if [ ! -z $killed ]; then
    exit 1
  fi
```
【Pythonで可視化グラフ】平行座標プロット

:::note info

メーカー研究開発に携わるプログラミング初心者が学んだことを必要最小限にまとめた記事です。
:::

# 平行座標プロット
派手で見栄えするので使えたらかっこいい。

## 何を表現できるか
多変量間の関係性を表現できる。正の相関が見られる場合は線の交差が少なく、負の相関が見られる場合は線の交差が多くなる。また、グループごとの傾向を表現することにも適する。

## Pythonコード
まずはseabornよりアヤメ（iris）データセットをインポートする。
```python
#seabornのirisデータセットをインポート
import seaborn as sns
iris = sns.load_dataset('iris')
iris.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/ac1f204e-ecf7-f53a-2a42-cbe1178baaf5.png)

アヤメデータをplotlyで平行座標プロットする。
```python
#グラフライブラリplotlyの平行座標プロット
import plotly.express as px
fig = px.parallel_coordinates(data_frame=iris, dimensions = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
fig.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/aa5fd29d-1acb-3962-d132-2355b5e4114c.png)

アヤメの品種ごとに色分けする。
まず、品種（カテゴリ変数）を0, 1, 2に置き換える。
```python
#speciesごとにラベルエンコーディング（カテゴリ変数に数値を割り振る）
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
iris['species'] = le.fit_transform(iris['species'])
```

その後、plotlyで品種ごとに色分けを指定する。
```python
#アヤメの品種ごとに平行座標プロットの色分け
#colorの引数は数値データしか対応しないため、事前にカテゴリ変数をラベルエンコーディングした
fig = px.parallel_coordinates(data_frame=iris, color = 'species',
                              dimensions = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
fig.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/d2f33167-50f4-3eda-5db2-7bb77a0126d5.png)

タイトルは.update_layoutで追加できる。
```python
#タイトルをつける
fig.update_layout(title_text = 'Iris', 
                title_x=0.5,
                title_y=1          
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603818/9929ccbf-76a1-0b7a-907c-b981d064ca7f.png)

# こんなデータに使いたい
クラスター解析でわかったグループごとの変動パターンを可視化