OmniAICreator/Qiita-1.07M huggingface dataset:
paiza.ioでelixir その95

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
api叩いて、郵便番号から、住所を求めよ。


# サンプルコード

```

:inets.start
:ssl.start


defmodule Main do
	require Record
	Record.defrecord :xmlElement, Record.extract(:xmlElement, from_lib: "xmerl/include/xmerl.hrl")
	Record.defrecord :xmlAttribute, Record.extract(:xmlAttribute, from_lib: "xmerl/include/xmerl.hrl")
	@targets [:state, :city, :address, :state_kana, :city_kana, :address_kana]
	def is_target?(attribute) do
		xmlAttribute(attribute, :name) in @targets
	end
	def parse_address(address_node) do
		attributes = :xmerl_xpath.string('//value', address_node)
			|> Enum.map(&(xmlElement(&1, :attributes)))
			|> Enum.map(fn elems ->
				elems
				|> Enum.filter(&is_target?/1)
			end)
			|> List.flatten
		keys = attributes
			|> Enum.map(&(xmlAttribute(&1, :name)))
		values = attributes
			|> Enum.map(&(to_string xmlAttribute(&1, :value)))
		Enum.into(List.zip([keys, values]), %{})
	end
	def parse_xml(body) do
		{document, _} = body
			|> :binary.bin_to_list
			|> :xmerl_scan.string
		parsed = :xmerl_xpath.string('//ADDRESS_value', document)
			|> Enum.map(&parse_address/1)
	end
    def main() do
        {:ok, {_status, _headers, body}} = :httpc.request('http://zip.cgis.biz/xml/zip.php?zn=9980001')
        body
        body = IO.iodata_to_binary(body)
        parse_xml(body)
        |> IO.inspect
    end
end
Main.main



```

# 実行結果

```
[
  %{
    address: "穂積（その他）",
    address_kana: "ホヅミ(ソノタ)",
    city: "酒田市",
    city_kana: "サカタシ",
    state: "山形県",
    state_kana: "ヤマガタケン"
  }
]
```

# 成果物

https://paiza.io/projects/ylR-J7wGzFp7j-nhz4uaCA?language=elixir


以上。
Lamda＠EdgeのトリガーにCloudFrontを設定する際の注意点

## はじめに
CloudFront＋Lambdaの構築で何点か注意しないといけないなと思うことがあったので、こちらで共有します！
**◎やりたいこと**
WAF→CloudFront→S3の処理でCloudFrontのイベントをトリガーにLambdaを起動させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953579/2976ecd2-bba7-22bf-1564-16e175f31eae.png)

## 概要
**Lambda@Edge**とは、
CloudFront が配信するコンテンツをカスタマイズする関数を実行できるコンピューティングサービスである AWS Lambda の拡張機能。
CloudFront ディストリビューションを Lambda@Edge 関数に関連付けると、CloudFront イベントの発生時にLamda関数を実行できます。

## 注意するポイント
Lambda@Edgeを利用する際に抑えておくべきポイントがいくつかあります。

__①米国東部 (バージニア北部) リージョンでLambda関数を作成する必要がある。__

__②Lambda関数が実行されるのはビューワー最も近いAWSロケーション。__
例えば、日本のユーザーがアクセスした場合
Lambda自体はバージニア北部で構築するが、東京リージョンで実行されるため、CloudWatchLogsのログは東京リージョンに残る。

__③現時点（2022年12月）で対応しているのはNode.js、Python 関数のみ。__

__④バージョニングを有効にしておく必要がある。__
番号付きバージョンにトリガー設定されるため、マネジメントコンソール上で確認する場合でバージョンを指定しないと、トリガー設定が表示されません。
また、関数を変更する場合は米国東部 (バージニア北部) リージョンで関数の $LATEST バージョンを編集する必要がある。

__⑤イベントタイプによって指定できる関数のメモリサイズやタイムアウトの値が異なる。__
この点については後述します。

## イベントタイプとは？
Lambda＠Edgeのトリガーに設定できるCloudFrontのイベントは４種類あります。
①ビューワーリクエスト　：CloudFront がビューワーからリクエストを受信したとき 
②オリジンリクエスト　　：CloudFront がリクエストをオリジンに転送する前
③オリジンレスポンス　　：CloudFront がオリジンからレスポンスを受信したとき
④ビューワーレスポンス　：CloudFront がビューワーにレスポンスを返す前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953579/06e95cb9-aeaa-3d1e-e896-e2e0af6b7833.png)
（引用）AWS公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-add-triggers.html

__◎イベントタイプの使い分け__
①ビューワーリクエスト
・すべてのリクエストに対して関数を実行する場合
・関数でキャッシュキーを変更する場合
（例）キャッシュ条件として使用しているURLを関数で変更する。
・Cookieまたはリクエストヘッダーをキャッシュ条件として使用している場合

②オリジンリクエスト
・Lambda 関数によって変更されたオブジェクトを CloudFront でキャッシュする場合
・関数がオリジンからのレスポンスに影響する場合
:warning:オリジンリクエストでは、
リクエストされたオブジェクトが CloudFront キャッシュ内にある場合、関数は実行される。CloudFront がリクエストをオリジンに転送したときにのみ、関数が実行される。

③オリジンレスポンス　
・Lambda 関数によって変更されたオブジェクトを CloudFront でキャッシュする場合
（例）オリジンから返されたオブジェクトのヘッダーを追加、削除、または変更する場合に、その結果を CloudFront でキャッシュする。
:warning:オリジンレスポンスでは、
オリジンからエラーが返された場合でも関数は実行される。

④ビューワーレスポンス
・すべてのリクエストに対して関数を実行する場合

## イベントタイプによって異なるクォータ
| エンティティ | ビューワーリクエストイベント / ビューワーレスポンスイベント | オリジンリクエストイベント / オリジンレスポンスイベント |
|:-----------|:------------|:------------|
| 関数のメモリサイズ   | 128 MB       | 128 MB から 10,240 MB まで、1 MB 単位で増加。       |
| 関数タイムアウト   | 5秒      | 3秒     |
| ヘッダーと本文を含む、Lambda 関数によって生成されたレスポンスのサイズ    | 40 KB    | 1 MB  |
|Lambda 関数および組み込みライブラリの最大圧縮サイズ | 1 MB   |  50 MB     |

CloudFrontのどのイベントを選択するかによって、指定できるメモリサイズ等が異なるので、ちゅういが必要です！

## 参考資料
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-cloudfront-trigger-events.html

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-how-to-choose-event.html

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html#limits-lambda-at-edge
散布図/散布図行列を表示する(SPSS Modeler データ加工逆引き10-7)

# 散布図/散布図行列を表示する（新グラフ）

![スクリーンショット 2022-11-15 11.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c6c58386-e217-6027-efd1-5c0731c7d400.png)

## 1.想定される利用目的

・データの分布の確認
・ばらつきのあるグループの比較


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/scatter_plot.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-15 11.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f9002ad5-ed38-8cc2-c484-c0f5cb4f8329.png)

入力するデータを確認するため[テーブル]を実行します。
![スクリーンショット 2022-11-15 11.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/82c8976a-605c-13c3-82f6-39722d50dcaa.png)

[散布図]ノードで従来の散布図を[グラフボード]ノードで従来の散布図行列を表示します。

![スクリーンショット 2022-11-15 11.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/593980e5-cd01-4413-7384-eddaac051e38.png)

![スクリーンショット 2022-11-15 11.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ae89edba-aa83-fb31-8f33-d67e067d3ccb.png)

[シミュレーション生成]ノードを右クリックして[データの表示]を選択します。
![スクリーンショット 2022-11-11 14.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ef9f2d0-77cb-20ba-4894-df147b7e4b05.png)

散布図と散布図行列をそれぞれ選択します。
![スクリーンショット 2022-11-15 11.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5a8d5409-3770-958e-c8d6-761469419e31.png)

以下の画面左の設定に従いセットします。

![スクリーンショット 2022-11-15 11.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/32652581-0264-692a-d1cf-081e7064b51b.png)

＊画面下のスライダーで表示領域を、画面右の判例のオン・オフで表示を切り替えられます。

![スクリーンショット 2022-11-15 11.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/27718494-f88d-9fe0-4195-1191ec148f7e.png)

#### 注意事項

新グラフ機能はバージョン18.1以降で装備されました。

## 4.参考情報

#### 散布図を説明した記事

https://qiita.com/kawada2017/items/40accfdba85e00eb164e

#### 新グラフを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Azure Administrator(AZ-104)：Azure管理者向けの前提条件「Azure CLIの使用」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azure CLIの使用」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure 管理者向けの前提条件](https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/)
◇対応するモジュール
[Azure CLI の使用](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-resources-tools/5-use-azure-cli)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure管理者向けの前提条件「PowerShellの概要」](https://qiita.com/fsd-jume/items/c8c97fe44d67017f5377)

## Azure CLIの使用
**◆Azure CLIのコマンド：「グループ」と「サブグループ」で構成されている**
・グループ：Azureによって提供されるサービスを表す
・サブグループ：そのサービスのコマンドが論理グループに分かれる
例)「storage」グループには「account」,「blob」,「queue」などのサブグループが含まれる

**◆コマンドの見つけ方**
・目的のコマンドの名前が分からない場合：「az find」を使用
⇒指定した内容の最も人気のあるコマンドを表示
例)BLOBの単語に関連する最も人気のあるコマンドを表示→「az find blob」
例)「az vm」など、コマンドグループで最も人気のあるコマンドを表示→「az find “az vm”」
例)指定のコマンドで最も人気のあるパラメータとサブコマンドを表示→「az find “az vm create”」
　　
・目的のコマンドの名前が分かっている場合：「--help」引数を使用
⇒コマンドの完全な一覧を取得可能
例)BLOBストレージを管理するためのコマンド一覧を表示→「az storage blob --help」

## 次の学習内容
**◆リソースの管理方法**

https://qiita.com/fsd-jume/items/c750b8bce5fb63fcdff5

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
systemdでdenonの起動

``` bash:インストール(root)
useradd deno -m -s /bin/bash
su - deno
curl -fsSL https://deno.land/x/install/install.sh | sh
cat <<'EOL' >> ~/.bashrc
export DENO_INSTALL="/home/deno/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"
EOL
source ~/.bashrc
deno install -qAf --unstable https://deno.land/x/denon/denon.ts
mkdir ~/example
cat <<'EOL' > ~/example/main.ts
import { serve } from 'https://deno.land/std@0.165.0/http/server.ts';
function handler() {
  console.log('log test');
  console.error('error log test');
  return new Response('Hello, World!');
}
serve(handler);
EOL
exit
cat <<'EOL' > /etc/systemd/system/example.service
[Service]
User=deno
WorkingDirectory=/home/deno/example
ExecStart=/bin/bash -c 'PATH=/home/deno/.deno/bin && denon run --allow-net main.ts'
[Install]
WantedBy=multi-user.target
EOL
systemctl enable example
reboot
```

``` bash:アンインストール(root)
systemctl stop example
systemctl disable example
rm /etc/systemd/system/example.service
rm -rf /home/deno
userdel deno

```
We created a contract and expected the 'Days_Remaining__c' field to show the number of days remaining until the contract end date, but it didn't. Make sure your formula subtracts today's date from the contract end date.


+ [Formulas and Validations > Use Formula Fields](https://trailhead.salesforce.com/content/learn/modules/point_click_business_logic/formula_fields)

# 使っているフィールドが違う

+ [Cannot continue with exercise 1 of the Admin. intermediate. Formulas](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000KgVC3)

:::note
I have reviewed the issue in your org and see that you have created a custom field(End Day). But you have to use the standard field (EndDate) in formula which will validate the challenge successfully.

組織の問題を確認したところ、カスタム項目 (終了日) が作成されていることがわかりました。ただし、チャレンジを正常に検証するには、数式で標準フィールド (EndDate) を使用する必要があります。
:::

# new playground 特に数式が正しい時

+ [Create a formula field that calculates the number of days remaining before a contract expires.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FXdSo)
+ [Unable to complete Hands On Challenge of create formula](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgU1P)
+ [Please tell me what to do.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KWHj4)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/870e627a-f49b-4213-a406-530fa017c69e.png)



:::note
I think the formula is correct.
Have you set the Field Level Security correctly?
Are you connected to the correct playground?

If you've checked the above and it still doesn't work, we recommend trying it in a new playground.
https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FR45HSAT
:::

+ [We created a contract and expected the 'Days_Remaining__c' field to show the number of days remaining until the contract end date, but it didn't. Make sure your formula subtracts today's date from the contract end date.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PhGOj)

:::note
Can confirm making a new playground and submitting the exact same formula allowed me to pass it.

https://developer.salesforce.com/forums/?id=9060G0000005hpSQAQ
:::

+ [In the formula and validations in the simple formula in insert filed iam not able find the contract end date ?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X6nCI)

The label is the Contract End Date
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2b551833-3b01-afb7-6d06-e2817d8bbef6.png)

```
EndDate-TODAY()
```

:::note
None of the suggestions helped me. Most of them I have already try it and mentioned also in my post. I decided to create a new playground and that was the solution. Nothing else worked and I did not change a thing when I used the new playground.
:::
memcached 奮闘記

# memcached 奮闘記

# はじめに
そこそこな規模のゲームを運営しているサーバーエンジニアです。
サーバーはLAMP環境で、I社のクラウドサーバーを利用しています。
キャッシュ機構はmemcachedとPHPのapcuを併用しており、その中で苦労した問題が起こったので自分の備忘録的に。

# 事の発端
apcuキャッシュにDBデータと、yamlデータを大量にキャッシュしている機構で、データ変更の際は、キャッシュ全クリアの為にhttp reloadをしていました。
ただ、運営期間も長くなり、データが肥大化され、http reloadをすると
大量のキャッシュ生成の影響によりスパイクが発生し、マシンが耐えきれずCPUが100%に・・・。
10分ぐらい経つと復旧する場合もありますが、その間はロード時間が長くなったり、通信障害起こってしまうので
もうオンメンテでデータ更新できないじゃん！？となり何とか解決しようと走り出しました。

# 解決案
色々な解決案をエンジニア内で協議し、結局「apcuをやめて、memcachedに移管する」
ってな事になりました。
（redisを使ってもよかったのですが、既にmemcachedを利用しており既存ロジックの流用で移管するのもスムーズなので）


apcuキャッシュしている箇所のほとんどをmemcachedに載せ替えるように内部ロジックを書き換え
いざ本番反映！

しかし問題が・・・

# 本番反映後
本番反映し問題なくキャッシュが溜まっている事は確認しつつ、支障もなさそうに見えましたが・・・
反映後30分後から画面のロードにかなり時間がかかるようになってしまい、お問い合わせも急増することに。

# 原因究明へあれこれ
監視ツールで見ても特にアラートも出ておらず、一番怪しかったDB周りも特にスロークエリも出ていない。。。
CPU、メモリも正常で、DBの遅延も検知していない。
となると、memcached側の設定でチューニング出来ていない？

チューニングはリリース初期にしていたはずだが・・・
改めてコネクション数のあたりを見直してみました

```sysctl net.core.somaxconn や etc/sysconfig/memcachedのMAXCONNECTIONの設定値
net.core.somaxconn = 65535
```

```etc/sysconfig/memcachedのMAXCONNECTION
MAXCONN="262144"
```

うーーーん、、、十分に設定されてるし、実際の測定値を比べても捌けているはず。


じゃ、ポートレンジの範囲が足りていない？？
```net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768    60999
```
ここもしっかり範囲あるし、別途行ったテストでも問題はなさそう・・・。

他にもmemcachedの設定だけでなく、linuxのカーネルパラメータも色々見直して試しましたが、
一向に改善せず・・・。

# 結局原因は
結論からいうと、単純な話でクラウドマシンの1台あたりの転送量の上限に引っかかってました。
（そんなん初めから気づけよ！ってな話ですが、言い訳すると、一番最初にここが怪しいとクラウドサービスに確認を投げていましたが、その時は上限に言ってないって誤回答されてて・・・）

調査に1週間ぐらい時間かけてちゃったのでなんじゃそりゃという結論でしたが、何かしら上限に行ってたら通知する仕組みがほしかったですね。

# 解決策
つまり、apcuキャッシュをやめてmemcachedに変更したことで、memcachedサーバーへの転送量が極端に増えたということなので、単純にmemcachedサーバーの台数を増やして解決。

これからは、ちゃんとクラウドサービス側の設定や上限も視野に入れて対応していかないといけない・・・。
クラウドサービスの料金見積ツール

パブリッククラウドサービスの料金見積ツールへのリンクです。

仕事で利用することのあるクラウドサービスの料金見積ツールに始まり、興味で見つけた料金見積ツールのリンクを貼り付けています。

## Amazon Web Services (AWS)
https://calculator.aws/#/

## Oracle Cloud Infrastructure (OCI)
https://www.oracle.com/jp/cloud/costestimator.html


TCO試算ツールというのもある。企業全体をクラウド化する場合のコスト規模をつかむことを想定されている。

https://www.oracle.com/jp/cloud/infrastructure/tco-calculator/

## Microsoft Azure
https://azure.microsoft.com/ja-jp/pricing/calculator/

## Google Cloud Platform (GCP)
https://cloud.google.com/products/calculator

## IBM Cloud
https://www.ibm.com/jp-ja/cloud/cloud-calculator

## Alibaba Cloud
https://www.alibabacloud.com/ja/pricing-calculator#/

以上
地図にプロットするカスタムコンポーネントをつくる




+ [AuraコンポーネントでMapを表示する](https://qiita.com/Keiji_otsubo/items/36cbd2192cb7f9fec463)
+ [国土地理院APIを使って住所からLatitude、Longitudeに変換する](https://qiita.com/Keiji_otsubo/items/11ab8355fca5be3c50e3)

# 会社の営業所の住所をマークアップしてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9b4b0d5b-d431-3fa3-faf3-774f4de4a230.png)
The 'Central and Eastern Target Accounts' does not appear to contain the 'Annual Revenue' column.


+ [Create Reports and Dashboards for Sales and Marketing Managers >Filter Your Reports](https://trailhead.salesforce.com/content/learn/projects/create-reports-and-dashboards-for-sales-and-marketing-managers/filter-your-reports)

このエラーメッセージもよく目にしますが、正直なにが悪いのかはよく分からないです。本当の問題とエラーメッセージが正しく対応していないと思いますね。

# 言語設定を英語モードにする

+ [error message : The 'Central and Eastern Target Accounts' does not appear to contain the 'Annual Revenue' column.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HktnM)
+ [We couldn't find a report named 'Central and Eastern Target Accounts' in the 'Marketing Reports' folder.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8Twj)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e581e7a6-c383-3c99-cd0f-2a4374359d33.png)


:::note
 I tried that, but it didn't work, so I posted here. The issue really was the playground being in French. 
:::

+ [未解決:We couldn't find a report named 'Central and Eastern Target Accounts' in the 'Marketing Reports' folder. I'm staring at it. see photo](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077D4j5)

# 削除して再作成した

+ [The 'Central and Eastern Target Accounts' does not appear to contain the 'Annual Revenue' column.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Jf9ZDSAZ)

レポートのフォーマットがが正しくないよと指摘したけど、理解されてない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c3458fa1-1379-f679-b550-23eb23c2d238.png)

:::note
I deleted and created the reports and it worked. Thank you for response. 
:::

+ [hi, what should be done to sort this out and pass the trailhead?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007TsIRf)

# 障害：　The 'Central and Eastern Target Accounts' does not appear to contain the 'Annual Revenue' column.

+ [【ヘルプ預かり】unable to complete challenge, due to "The 'Central and Eastern Target Accounts' does not appear to contain the 'Annual Revenue' column" error](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jeqrd)


# We couldn't find a report named 'Central and Eastern Target Accounts' in the 'Marketing Reports' folder.

+ [We couldn't find a report named 'Central and Eastern Target Accounts' in the 'Marketing Reports' folder.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8TwjSAF)

:::note
Please confirm if there exists 2 reports with Same name, if it is so then delete unnecessary report and check challenge again
 
If it doesnt work then try again in new trailhead playground
:::
キャプテン制度でさらに1歩先へ-モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の12日目の記事です

今回は「キャプテン制度」について紹介します。
ペアペアプロでは2並列で作業を進めることができるようになりました、その次の段階としてキャプテン制度を用いることでモブプログラミングのメリットが必要なときに適切にモブプログラミングを行うことができるようになるメリットがあります。

# 前回

https://qiita.com/Sicut_study/items/86f431b99b09696a5f27

# Chapter#11 もっと先へ

ペアペアプロを始めたメンバー一同は開発スピードがさらに上がりはじめた
そして、4カ月がたったある日、、

じん「ペアペアプロにだいぶ慣れてきましたね」
アール「そうですね、ペアペアに変えたおかげでより自分でコードを書くという実感がわいたのでよかったです」
ミュート「いままで割と答えを聞いて、その場では理解しているつもりだったことが割とあったことがわかりました。より実力が付いた気がします」
ベープ「Reactめっちゃ楽しいです！」
じん「では、ペアペアにも慣れたということで今回からは最後のモブプログラミングの派生である**キャプテン制度**に挑戦していきたいと思います」
ミュート「また新しいのがでてきたな。。」

そしてじんはあるテック記事のリンクを送った

じん「この記事はサイバーエージェントが出していた2022年6月ごろの記事です。この中にはスウォーミングという方法をうまく取り入れたモブプログラミングが紹介されています。その名もキャプテン制度！これをみんなでやっていこうと思います！」

# キャプテン制度について

今回はキャプテン制度について紹介していきます。
といっても、詳しくは元の記事を読んでいただくのが良いかと思います！

https://blog.cybozu.io/entry/2022/06/08/141944

ざっくり概要を説明していきます

開発は基本的にモブプログラミングではなくソロプログラミングで行います
スクラムのプランニングイベントでバックログを個人に振り分ける際にそのバックログに優先度をつけていきます。

もし優先度が一番高い人がスプリントで終わらないと判断した際にモブプログラミングの招集がかけられます (まさにキャプテン)
キャプテンの召集は絶対なので、他の人は作業を止めてモブプログラミングに参加します。

キャプテンのタスクが終わったら、次に優先度が高い人がキャプテンになり、終わらないと判断したら招集できる権限が与えられます。

キャプテン制度を行うことで、モブプログラミングから徐々にソロプログラミングに移行ができるようになります
チームのメンバーがある程度成長して同じようなレベル感で仕事ができるようになっていればその効果はかなり大きくなります。

実際にやったところ
- 個別で開発するのも楽しい
- キャプテン制度にするとタスクの粒度が同じくらいになってよい
- しっかりとタスクに完了の定義を書くようになった
- モブをやるほど出ない小さなタスクが早く終えられる
- キャプテンのPRを早くみんなでみる習慣ができた
- キャプテンがPRを出したときにみんなに連絡するの楽しい
- キャプテンが召集したら集まるのもできるようになってきた

など、かなりポジティブな意見が多く上がりました。

実際にやってみて小さいタスクをモブでやらなくてよかったり、資料作成など開発以外の業務が手軽にできるようになったりと想定していなかったメリットも多くありました
デメリットはレビューを見ないといけなかったり、キャプテンの指示で作業を中断しないといけないなどがありました。


キャプテン制度がうまくいくようにするのは、先を常に見据えて自力でスプリント内に終わらないと判断したらすぐキャプテンがモブに切り替えることです
これ自分で数時間調べれば行けそう、まだ自分で試行錯誤したいなど考えて、数日使った挙句終わらないというのが問題となりました
ここまでモブプログラミングをしてきたメンバーなのでそういったことは少なかったですが、新しく新人が入ってきてモブプログラミングやチームに慣れておらずわからないことを聞けずにいるという状況をつくらないようにする必要がありそうです

# 次回

https://qiita.com/Sicut_study/items/f3a8d8330cfce0a90d39

# おわりに

今回は「キャプテン制度」について紹介しました
元の記事がとても分かりやすいのでぜひともそちらを読んでいただきたいため、本記事では軽く紹介程度にさせていただきました
ここまでいけばチームとして効率的な開発ができているはずです

モブプログラミング→ペアペアプロ→キャプテン制度の順番でぜひ開発チームを成長させてみてください！
被害者のいない事件。犯人はシステム？それとも運用？

# 初めに
先日いつものように某アパレルサイトで買い物をしました。購入時は荷物の受け取り方法を【コンビニ受け取り】に指定していたのですが、先方の手違いがあったため、【住所配送】に無料で変更してもらえる事になりました。
不満はありませんでしたが、よくよく考えてみるとそこに至るまでの経緯にいくつか疑問点が湧いてきたので、ミステリー作品っぽく記事をまとめてみました。

# 登場人物
Aさん：筆者のことですが、ミステリーっぽいのでこの呼び方で統一します。

# 背景
Aさんは某大手アパレルサイトで**冬服**を大量に購入しました。いつものように受け取り方法について【コンビニ受け取り】を選択し、最寄りのコンビニを受け取り場所に指定しました。
**【コンビニ受け取り】を指定した場合、通常購入日から2〜8日の配送予定日内**に商品がコンビニ店で受け取りが可能になります。

しかし、Aさんが購入してから2日ほど経ってカスタマーセンターから以下のメールが届きました。

```
A様

この度、ご注文いただきました商品について【コンビニ受け取り】のご希望を承っておりますが、
梱包サイズのご利用条件を満たしていなかったため【コンビニ受け取り】の対象外となっております。

＜ご利用条件＞
・梱包サイズが130㎝以下の箱に入るご注文

お客様のご要望に沿えず、誠に申し訳ございません。
大変恐縮ではございますが、上記ご注文に関しましては、
【住所配送】にてお届けの手配を致します。

【配送について】
・お届け予定日は本日より2〜3日内を予定しております。
　物量や交通状況等によりましては、通常より、お時間をいただく場合があります。
```

自宅で待機しなくてはいけなくなったものの、Aさんは予定よりも早く商品を受け取る事ができて大喜びでした。
2日後、無事に商品も届きサービスには満足していたのですが、なぜ【住所配送】に変更になったのかよくよく考えてみると、おかしな点が幾つかあったことに気がつきました。

# 不可解な点① システムの問題？
某アパレルサイトでは、ユーザーは梱包サイズを指定することはありません。どの商品をどれだけ買おうがコンビニ受け取りは常に選択できてしまいます。
そのため例えば「**同じ数量の服を買ったけれど、前回は夏服だったから小さい梱包サイズで済んだけど、今回は冬服だったから大きい梱包サイズが必要になった**」というケースは十分考えられます。
ですので**購入した服の種類と数によってそもそも【コンビニ受け取り】は指定できないようにするのがシステムとしてあるべき姿になります**。
今回Aさんが【コンビニ受け取り】できなかったのは、システム上の問題ではないか？という謎です。

# 不可解な点② 運用の問題？「＜ご利用条件＞」について。
メールに書かれている「＜ご利用条件＞」についてですが、Aさんがサイトを調べても「・梱包サイズが130㎝以下の箱に入るご注文」は見つかりませんでした。
そのため「**顧客が購入した商品をどういった箱にいくつ詰めるかは従業員の判断**」になります。
仮にも大手企業なのでしっかりしたマニュアルがあるはずだし、今回のような間違えやすいケースに対して「箱のサイズを間違えたら会社負担で【住所配送】に変更する」なんて運用をしているとは考えにくいのです。

# 不可解な点③ 運用の問題？なぜ詰め直さなかったのか？
最大の謎がこれです。**今回の事件、メールを送る前に違うサイズの箱に詰め直せば全て解決していたのです**。
箱のサイズを間違えるといったヒューマンエラーは予想できる範囲なので、運用上何かしらの対策はあってもおかしくはないのです。

# 不可解な点④ 運用の問題？もう一回送り直せば間に合ったのではないか？
Aさんの商品の受け取予定日は【コンビニ受け取り】の場合は購入日から2〜8日内でした。今回【住所配送】になったので受け取り予定日は購入日から4〜5日内になりました。
つまり、**もう一回箱に詰め直して送り直したとしても、本来の予定日内に間に合ったのではないか**？という謎です。

# 結論
今回の事件では被害者は存在しません。繰り返しになりますが、Aさんは某アパレルサイトのサービスに満足しています。
ただ、どうやったら今回の事件を未然に防ぐことができたのかを考えた時に、システム上の問題なのかそれとも運用上の問題なのか想像がつかない点がいくつかありました。
今回の事件は解決される事は無いでしょう。ですが自分で解決案をいくつか想定しておくことは、エンジニアとして有意義なのではないかと思うのです。

## おまけ
【コンビニ受け取り】の場合、配送予定日の情報と出荷準備完了のメールは貰えるのですが、「コンビニに商品が届いた」というメールはもらえません。
また、コンビニでは通常決められた時間に運送会社が来て荷物の受け渡しが行われます（一日最後の受け渡しは17時、等）。
そのため「**メールが送られても実際に商品を受け取れるのはだいたい翌日**」というのが現状です。
こっちの事件は解決して欲しいところです。。。
【Github】SSH、HTTPSプロトコルの違いとOAuth、Basic認証の違い

SSH
秘密鍵を使った認証で、パスフレーズ無しで安全に接続可能

HTTPS
ユーザ名とパスワードを使った認証



OAuth認証
あるWebサービスに別の外部サービスを利用して認証する

Basic認証
あるWebサービスにユーザーIDとパスワードを　設定して認証する


GithubはHTTPS接続で、リモートパスワード認証を2021年8月13日に廃止されている。
その為、現在はパーソナルアクセストークンを使用する必要がある。
シニアエンジニア必見：マネージメント力（人間力）の鍛え方

認知能力とは、IQの様な数値化できる能力を指す様ですが、非認知能力とは、内面的な**人間力**を指す能力。

非認知能力には、協調性、自己管理能力、主体性、自己肯定感、リーダー性、創造性、etc。
いわゆるSPECというよりもTYPEを指します。

[採用のコツ：先ずは面談！](https://qiita.com/k1morikawa@github/items/f98b842bd300ef2ef926)

にも書きましたが、非認知能力：Type：**人間力**というのは、数値化出来ない場合が多い。

# EQ（心の知能指数）という言葉もある
IQに対して、EQという用語もある。EQは、心の知能指数を指す指数であり、この非認知能力やTypeや人間力と近い部分がある。
しかし、EQ測定というテストもあるが、完璧ではないだろう。何故なら我慢できるか、コントロール力があるかは、テストでは測りきれない。
基本、EQも非認知能力やTypeや人間力も同じことをさすが、数値化することは難しそうに思います。

# 鍛えて伸ばす
EQは、IQと違って後天的な部分が大きく、鍛えて伸ばせる部分が大いにあるらしい。非認知能力やTypeも同様だと思う。
協調性は、仲間と過ごして仲良く過ごすことに加えて、柔軟なコミュニケーションを行いながら共通のゴールに向かって全体を導く力だと思う。
これを鍛えるには、
・話す
・聴く
・考える
この３つの能力が必要となる。
話すと聴くについては、１vs1のコミュニケーションは、相手のことをしっかり考えながら動く必要があるし、1vsNのコミュニケーションの場合は、パワポ等のツールを上手く使いながらわかり易く情報を見せる必要がある。
考えるについては、ロジカルシンキングが中心になると思うが、多重人格化も必要だ。
自分の意思、考えを相手に押し付けるだけでは上手く行きません。
その場でやり込めても、スグにやる気がなくなってしまうし、エンジニアの場合は特に気持ちが分かってないと心を閉ざされる場合も多い。
ガンガン働きたい人の気持ち、皆と仲良く仕事してプライベートも重視したい人の気持ち、気持ちは前向きだがプレッシャーは欲しくない人の気持ち。
色々な人の立場になって、多重人格化して考えてみることで新たな部分が見つかると思います。

# どうやって伸ばすのか？
僕の価値は、エンジニアでありながら非認知能力が他のエンジニアよりも高いことだと思ってる。もちろんエンジニア以外の社長系や営業系の方々と比べれば、低いと思うがエンジニアの中での相対性の話。
若い頃は誰の話も聞かなく、自分の意見を押し通そうとするし、相手の気持ちなどはあまり考えなかった。
僕の場合は、２０代後半で創業CTOになってから、修行が始まった。
基本的には、量が質を作ります。千本ノックです。精度悪くても何度も繰り返すことにより、質が高くなります。
ただ、これ不幸なのが、精度の悪い時期に関わったメンバーは、非認知能力の低いCTOと対峙するためストレス溜まるし、辞めていきます。これは本当に不幸です。

宣伝：この辺りは、下記講座でもお手伝いします。是非、無料説明会にご参加下さい！
[エンジニア年収アップ講座　誰でもCTOになれる！](https://cto-can-be.hp.peraichi.com/)
VSCode+Dev Container+Docker+docker-composeの複数コンテナ開発環境構築

## 目的
- 複数のコンテナを使うシステム開発をする際、docker-composeを使いたい
- VSCode+DevContainerでdocker-composeを使う方法があるらしいが、一番開発しやすい方法で環境構築したい

## 環境構築の方向性選定
まず、VSCode+DevContainerでdocker-composeを使う方法を3種類試した。
1. 空のワークスペースに、docker-compose.ymlとdevcontainer.jsonを含む.devcontainerディレクトリを作成
1. 既存のdocker-composeで動く環境に、docker-compose.ymlとdevcontainer.jsonを含む.devcontainerディレクトリを作成
1. 既存のdocker-composeで動く環境を、各コンテナに対応するディレクトリが存在するようにしておき、それぞれのディレクトリに.devcontainer.jsonを作成

これらのうち、開発環境がVSCodeに依存しすぎず、複数のサービス開発が同時にやりやすい点で、3. が開発に最適と判断した。
以降、3. の構築手順を記載。

## 構築手順
（環境構築のみを検証したため、何のサービスも動きません）

- 下記のようなディレクトリ、ファイルを作成
```
📁 project-root
    📁 container1-src
        📄 .devcontainer.json
        📄 Dockerfile
    📁 container2-src
        📄 .devcontainer.json
    📄 docker-compose.yml
```
   
- 各ファイルの内容は下記の通り
    ```docker-compose.yml
    version: '3'
    services:
      container-1:
        build:
          context: ./container1-src
          dockerfile: Dockerfile
        volumes:
          # Mount the root folder that contains .git
          - .:/workspace:cached
        command: /bin/sh -c "while sleep 1000; do :; done"
        links:
          - container-2
      container-2:
        image: ubuntu:bionic
        volumes:
          # Mount the root folder that contains .git
          - .:/workspace:cached
        command: /bin/sh -c "while sleep 1000; do :; done"
    ```
    ```container1-src/.devcontainer.json
    {
        "name": "Container 1",
        "dockerComposeFile": ["../docker-compose.yml"],
        "service": "container-1",
        "shutdownAction": "none",
        "workspaceFolder": "/workspace/container1-src"
      }
    ```

    ```container1-src/Dockerfile
    FROM fnndsc/python
    ```

    ```container2-src/.devcontainer.json
    {
        "name": "Container 2",
        "dockerComposeFile": ["../docker-compose.yml"],
        "service": "container-2",
        "shutdownAction": "none",
        "extensions": ["dbaeumer.vscode-eslint"],
        "workspaceFolder": "/workspace/container2-src"
      }
    ```

- VSCodeでコンテナを起動
    - project-rootフォルダをVS Codeで開く
    - 左下の「><」ボタンをクリックし、「Open Folder in Container」を選択
    - container1-srcまたはcontainer2-srcを選択
        - 選択したコンテナの新しいウィンドウが開く
        - 片方のコンテナのウインドウを開いている場合でも、docker-compose.ymlのすべてのサービスが動いている状態になる
```
$ docker-compose ps
Name Command State Ports
docker-compose-vscode-test_container-1_1 /bin/sh -c echo Container … Up
docker-compose-vscode-test_container-2_1 /bin/sh -c while sleep 100 … Up
```

- 手順・.devcontainer.jsonの設定等、より詳細は[**こちら**](https://lethediana.sakura.ne.jp/tech/archives/steps-ja/1511/)を参照

## 参考
- https://code.visualstudio.com/docs/devcontainers/containers
- https://code.visualstudio.com/remote/advancedcontainers/connect-multiple-containers
PowerShell で（.bashrc 的に）コマンドレットのエイリアスや独自のコマンド（関数）を追加する

# 🫣TL;DR
「`pwd`コマンドを使うとき、大体その結果をクリップボードにコピーしてるなぁ🤔」と思ったのがきっかけ。
Bash でいうところの `.bashrc`（bash が起動したときに最初に実行される設定ファイル）みたいなもので設定できるだろうと思い、調べました。

# 方法
方法は以下の公式ドキュメントに書いています。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.2

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/set-alias?view=powershell-7.2

ちなみに、クリップボードにコピーするコマンドは bash では `clip` がありますが、PowerShell では `Set-Clipboard` があります。（長い。これはなおさら関数化しておきたい）

ざっくり手順を説明すると、以下のコマンドで `Microsoft.PowerShell_profile.ps1` が開くので
```
# プロファイルを開く
notepad $PROFILE
```
中に以下のようなエイリアスや関数定義、他にも起動時に実行しておきたい初期化コマンドなどを記述できます。
```
# エイリアスを作成
Set-Alias -Name {エイリアス} -Value {実行する中身}

# 例）pwd を p で実行
Set-Alias -Name p -Value pwd

# --------------------------
# 関数を追加
function {関数名} {
  # 関数の内容
}

# 例）カレントディレクトリのパスをクリップボードにコピー
function pwdc() {
  pwd | Set-Clipboard
  echo "*** Copied to Clipboard ***"
  pwd
}

```

# まとめ
これでより一層 PowerShell が快適に✨
Db2 on Cloud Liteプラン 再アクティブ化

IBM Cloud上にあるDb2はLiteプランを選択することで、無料で使用できます。学習用などに使用が可能です。

作成方法は[「Db2 on CloudをLiteプラン(無料)で作成」](https://qiita.com/nishikyon/items/0219a81673f0b84980da)を参照ください。

Liteプランを継続して使用するには期間ごとに再アクティブ化が必要です。
なおソースによってreactivateの訳が「再アクティブ化」、「再延長」、「再活動化」といろいろありますが、全て同じ意味です。ちなみに当記事は「再アクティブ化」にしてみました。


[Db2 on Cloudのドキュメント](https://cloud.ibm.com/docs/Db2onCloud?topic=Db2onCloud-free_plan)には以下のように書かれています:

> 30 日ごとに再アクティブ化が必要。 再アクティブ化されない場合、Lite プラン・サービスは 60 日後に削除されます。


[IBM Cloudのカタログ](https://cloud.ibm.com/catalog/services/db2)上だと以下のように書かれています:
> 無料プランは必要な期間継続して使用できますが、ユーザーに 90 日ごとに無料アカウントの再延長を求める電子メールが送られます。 再延長しない場合、無料アカウントはその後 90 日間で消滅します。 

そして今回送付された再アクティブ化についてのメール抜粋：
> To keep your systems running, we ask you to reactivate every 45 days. It has been 42 days since your last reactivation.
(日本語訳: システムの稼働を維持するため、45日ごとに再アクティブ化をお願いしています。前回の再アクティブ化から42日経過しています。)
>  If a user chooses not to reactivate, we pause their systems for another 60 days, before decommissioning. 
(日本語訳: ユーザーが再アクティブ化しない場合、さらに60日間システムを一時停止し、その後破棄されます。)

まとめると：
- 30日か45日か90日で再アクティブ化が必要
- 再アクティブ化しない場合は60日か90日後に使えなくなる

いったい何日が正しいかのかよくわからないのですが、とくにかく継続使用したい場合は、メールが送付されたら「再アクティブ化」の処理をしましょう。

# 1. 再アクティブ化の依頼メール
以下のようなメールが`Brett from Db2 on Cloud <no-reply@us.ibm.com>`から送付されてきました。今後フォーマットは変わるかもしれません。2022年11月23日現在の情報です。

このメールが来た時点で最後の再アクティブ化から42日経っているとのこと。あと3日以内に再アクティブ化しないと60日で使えなくなるようです(結構急な話で・・・)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/1b261aa4-e3fd-1d45-9a3b-79b349264191.png)

# 2. メールの中の「reactive」のリンクをクリック

IBM Db2 on Cloudのサインイン画面になります。
私はいつもIBMidでサインインしてるので、IBMidでサインインをクリックして、そこからサインインしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0f4b6567-e86b-7fef-43f3-8a63b9f82d84.png)

# 4. 「無料枠の再活動化」をクリック
サインインすると以下のような画面になるので、「無料枠の再活動化」　をクリックすればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0916f340-427d-9923-b1fd-839656bdadb1.png)


「無料枠の再活動化」をクリックすると、以下のような画面になるので少々待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/bb41b433-6c3f-fd8f-afbd-f1bb2c4fe7cc.png)

完了すると、ダッシュボード画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4612ae0b-c09f-e0e7-7a06-2b6f5f4b49a3.png)

作業はこれだけです！


# 5. まとめ
普段コンソールにアクセスしていれば、「無料枠の再活動化」の画面で気がつきますが、そうそうタイミングよくアクセスしませんよね。ずっとDBを無料でキープしたいけどアクセスしてない場合は、メールを気をつけてチェックするようにしましょう。

以上です。
Google UXデザイン：UXリサーチ・スタディ

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/66d514dc-1996-9cf3-5acb-014309ebb027.png" width="800">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d326d1e3-3b70-ffc3-eabf-1ac6a7fcaec7.jpeg" width="500">

</details>

# リサーチ・スタディ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1413ef25-e3e8-d521-6c87-43f393cce3fd.png" width="７00">

リサーチ・スタディと呼ばれるUXリサーチを実施するためのプロセスについて学びます。UXリサーチ・スタディには、4つのステップがあります。

## Step１：リサーチを計画する

まずは計画を立てます。

1. プロジェクトの背景を概説する。
1. リサーチの目標を設定し、答えを出したい質問を書き出す。
1. リサーチを実施するための手順を決め、リサーチに参加する人を選ぶ。

このステップは、リサーチの他のすべての部分に影響するため、非常に重要です。

## Step２：リサーチを実施する

実際にデータを収集します。ユーザビリティ・リサーチはその方法の一つです。

### ユーザビリティ・リサーチ

ユーザビリティ・リサーチでは、あるデザインにおいて、ユーザーがどれだけ簡単に主要なタスクをこなせるかを評価します。

ユーザビリティ・リサーチの目的は、ユーザーがあなたのデザインで経験する<font color="MediumVioletRed">ペインポイントを特定</font>し、最終製品の発売前にその問題を修正できるようにすることです。

ユーザビリティ・リサーチでは、ユーザーが新製品や新機能をどのように操作しているかを確認することができます。また、ユーザーにインタビューして、彼らの経験についてより詳しく知ることができます。

# Step3: 結果を分析し、統合する

これは、データの中に実際の意味を見出そうとするものです。データがなぜそのようなものであるのか、その理由を解明したいのです。

- <font color="MediumVioletRed">定量的データのパターン</font>を探す。
- インタビューに対する参加者の回答から<font color="MediumVioletRed">定性的データ</font>の傾向を探る。

# Step4: 洞察を共有し、促進する

最後のステップは、プロジェクトのステークホルダーと考察を共有し、推進することです。ステークホルダーは、あなたのリサーチ結果を必要とし、プロジェクトの方向性に同意する必要があります。

そのためには、あなたの洞察を共有し、促進するために、あなたは<font color="MediumVioletRed">プレゼンテーションを作成する</font>必要があります。プレゼンテーションには、研究の方法、収集したデータ、そのデータに基づいて得た結論、そしてその結論に基づいて行動するための推奨事項を含める必要があります。

リサーチの結論と提言の結びつきが強ければ強いほど、ステークホルダーがあなたの提案した行動を取る可能性が高くなります。

# さいごに

UXリサーチの目的は、 ***<font color="MediumVioletRed">ユーザーを優先する</font>*** ことです。

### Benefits
- ユーザーの問題を解決するために、ユーザーの問題を理解するのに役立つ。
- 高価で時間のかかる製品を作る前に、ビジネスが考えるユーザーのニーズと、実際のユーザーのニーズとのギャップを埋めるのにも役立つ。
スペシウム133を発射したいですよね？　『スペシウム133を発射せよ！』アプリ作りました。

## スペシウム133とは

https://shin-ultraman.jp/news/

https://ja.wikipedia.org/w/index.php?title=%E3%82%B9%E3%83%9A%E3%82%B7%E3%82%A6%E3%83%A0&oldid=91210573

映画『シン・ウルトラマン』でウルトラマンが放つスペシウム光線の素の物質です。
うちは娘なので映画館に行く理由が見つからず、DVDの発売を待っていたら何と配信が始まってしまいました。DVDは無くなっていくのかもしれませんね。

## 『スペシウム133を発射せよ！』アプリのご紹介
容易に想像がつくとは思いますが、こんな感じです。

<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/xJAgV0uj2sk?start=1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Teachable Machine にポーズを学習させたモデルを ml5.js に組み込んで、正しいポーズをとったらアプリ画面上で光線が発射されます。

```:☆使い方☆
1. 画面の向かって右半分側に直立、左足を少し引いて体は斜め45度ぐらいに。
2. 画面中央の十字のガイドラインが出ますので、これにあわせて例のポーズをとってください。
3. スペシウム光線発射！
```
【使ったもの】
・HTML、CSS、JavaScript
・CodePen、jQuery、Netlify
・Teachable Machine、ml5.js 
・p5.js

## Netlifyで公開中
https://jazzy-cobbler-66c475.netlify.app

## 解説
#### ソースコード
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="OJEzYWa" data-user="Xedge748hagi" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Xedge748hagi/pen/OJEzYWa">
  スペシウム133を発射せよ！</a> by Xedge748hagi (<a href="https://codepen.io/Xedge748hagi">@Xedge748hagi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#### 学習モデル
![スペシウム学習.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/10722efb-3507-e6a8-db2c-78c5a8b5c168.jpeg)
当初は「直立」「スペシウム」以外に「片手」というクラスがありました。右腕だけ前に垂直に上げた姿勢で、この時は右手にスペシウム133が充填されて（水色のグラデーションの楕円が大きくなっていく）、左手が前でクロスしたら「スペシウム」クラスで光線発射、となっていました。いい感じの画像だったのですが、困ったことに「片手」の判定が難しく、左手を下げているのに「スペシウム」の誤認が多発し、泣く泣く断念しました。本来はポーズプロジェクトで両腕の位置判定を行えばよいのかもしれませんが、ml5.js との連携がうまくいきませんでした。

#### 画面の重ね合わせ
今回の最大の難関は、カメラで撮った動画とガイドラインの十字やスペシウム光線の画像を重ね合わせることでした。ネットで検索したやり方を順次試しましたが、両者が縦に並ぶか画像（canvas）が表示されないかで、全滅でした。私の書き方は試行錯誤の結果偶然できたもので、正しいのかはよくわかりません。
```:HTML
<html>
  <body>
    <h1>スペシウム133を発射せよ！</h1>
    <button onclick="start()">開始</button><br>
    <video id="webcam" width="640" height="480" muted autoplay playsinline></video>
    <canvas id="canvas" width="640" height="480"></canvas>
  </body>
</html>
```
```:CSS
body {
      background-color: red;
}

h1 {
    font-size: 3em;
    margin: 3px auto;
    color: white;  
}

#webcam {
         position: absolute;
         z-index: -1;
         transform: scaleX(1);
}

canvas {
        position: absolute;
}
```
## 使ってみて思ったこと
☆思ったより誤動作します。画像プロジェクトで両腕の位置・形を見極めるのは難しいかもしれません。Teachable Machine のポーズプロジェクトと ml5.js の連携について良い見本が見当たらなかったのが残念です。
☆ p5.js は使ってよかったです。調べれば日本語の解説もありますし、簡単に使えて表現が豊かになります。
Rubyにおける3つの変数とは

## ローカル変数とは
- 使用できる範囲が、他のインスタンス変数やクラス変数と比較すると限られている
- メソッドやブロック（クラス内）で変数を定義した場合は、そのメソッドやブロック内のみで有効になる
- 定義自体はメソッドやブロックの外でもできる
## インスタンス変数とは
- 同じオブジェクト内で共有可能な変数のこと
## クラス変数とは
- 同じクラス内のすべてのインスタンスメソッド内や継承されたクラス内で使用できる変数のこと
- 変数名に@@をつけると使える

## 参考記事
https://qiita.com/mary_new_programmer/items/4c4353c3d1df7242f515
Leetcode 一問目 Two Sum

### LeetCode解いた問題をアップ
https://leetcode.com/problems/two-sum

一問目のTwo Sumですが多分HashMapを使えってことなんですけど
とりあえず通ったのでヨシ(多分よくない
```C++
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ans(2);
        set<int> memo;
        for(auto i : nums){memo.insert(i);}
        for(int i = 0; i < nums.size(); ++i)
        {
            for(int j = i+1; j < nums.size(); ++j)
            {
                if(nums[i] + nums[j] == target)
                {
                    ans[0] = i;
                    ans[1] = j;
                }
            }
        }

        return ans;

    }
};
```
「逃げ癖」のある人へ・・・

# 目次
[はじめに](#はじめに)
[大前提](#大前提)
[準備](#準備)
[戦闘開始](#戦闘開始)
[まとめ](#まとめ)
# はじめに
研究や論文執筆など大変なタスクを抱えていると、ついつい逃げ出したくなります。そして、逃げ出すと後からどんどん締め切りという名の沼にはまっていって鬱になってしまいます。
今回は、途中で逃げ出さないために何をすれば良いか書けたらなと思います。

# 大前提
まず大前提として、**別に逃げ出してもいい**
え？ダメじゃん。と思う人がいるかも知れないですが、別に逃げることは悪いことでは無いと思っています。
頑張りすぎた結果、潰れてしまったら意味が無いです。
本当に辛いときは迷わず逃げましょう。
その時は後から頑張れば良いんです。潰れてしまうより何倍も良いです。

# 準備
まず、スマホや漫画、ゲームなどの思考が引っ張られる物は封印しましょう。段ボールに突っ込んで目に入らない所へ置くなどしましょう。作業場所をカフェなどに変更するのも効果的です。
よく机の上を綺麗にしましょう。というのを見ますが、綺麗にしたところでやらない人はやらないですし綺麗にした事で満足してしまうので危険です。
次に、外界の音を遮断するために作業用BGMを選びましょう。選ぶBGMは何でも良いですが、全く知らない曲だと聞き流せるのでおすすめです。
あと、エナジードリンクを買いましょう。これからやるぞ！という気持ちになります。

# 戦闘開始
準備が終われば、いざ戦闘開始です。
ここからは、自分との勝負です。


頑張ってください。

# まとめ
・・・なんか偉そうに書き始めましたが、結局は自分との戦いです。「逃げ癖」は治りません。
いかに自分を知って上手く付き合っていくしか無いんです。
だってどれだけ逃げても結局はやらなきゃいけないんですから。。。
何をやってても頭のどこかではタスクが付きまとい「やらなきゃ・・・」となって負の連鎖が始まるのでやる気になっている時に一気に消化してしまいましょう。
その方が後の事を考えると精神衛生上、吉です。

頑張ってタスクの沼から抜け出しましょう！

以上、一生タスクの沼から抜けられない限界大学性でした。
【TailwindCSS】これが一番簡単だと思います…フッターを固定する

# 0.初めに
「フッター固定してえなぁ…」って思う事ないでしょうか？
ありますよね！！
一般的なWebサイトはヘッダー、フッターがあって当たり前ですから。

今回は2パターンのフッター固定法を解説していきます！

# 1.サンプルコード
サンプルコードはReactで書いてます
（1つのコードで両方のパターンを表現してます）

CSSクラスをカキカキしていくだけなので
「React分かんねぇ」って方でも分かりやすく解説していきます！
（具体的な解説はHTMLで説明していきます）

**サンプル：ヘッダー固定2パターン（時間経過で切り替え）**
(Resultは0.5倍にして動作をみてください)

<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="OJEzZPg" data-user="DoNotPrayDebug" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/DoNotPrayDebug/pen/OJEzZPg">
  ヘッダー,フッター,センタリング</a> by DoNotPrayDebug (<a href="https://codepen.io/DoNotPrayDebug">@DoNotPrayDebug</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 2.それぞれの固定法の解説
1. コンテンツ上段配置版
1. コンテンツ中央配置版

それぞれのパターンを解説していきます！
## 2-1.コンテンツ上段配置版
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/42e9b421-ef31-9997-4ed3-0119c83eac87.png)
※大事なとこだけ抽出して書いてます
```.html
<div class="flex flex-col h-screen">
    <header class="text-2xl font-bold bg-green-500 text-white text-center p-2">
        <h1>ヘッダー</h1>
    </header>
    <div class="mx-auto my-3 w-9/12 bg-white border border-green-600 border-2 text-center p-2">
        <!--コンテンツが並ぶ-->
    </div>
    <foooter class="bg-green-500 text-white text-center p-2 mt-auto">
        フッター
    </foooter>
</div>
```

TailwindCSSはCSSクラスが、ずらーと並ぶので
ちょっと見にくいですよね…
ってことで配置関係のクラスのみ抽出したモノがこちらなります。

```.html
<div class="flex flex-col h-screen">
    <header>
        <h1>ヘッダー</h1>
    </header>
    <div class="mx-auto my-3 w-9/12">
        <!--コンテンツが並ぶ-->
    </div>
    <foooter class="mt-auto">
        フッター
    </foooter>
</div>
```

ポイントは3つ
1. 大本のdivでflexの縦並びと表示範囲（縦）を指定
1. コンテンツが入るdivでwidthと横幅の中央揃えを指定
1. フッターはTopだけマージンをかける

## 2-2.コンテンツ中央配置版
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/b86054bb-3fff-d48d-dd4d-17f5015174e9.png)
```.html
<div class="flex flex-col h-screen">
    <header>
        <h1>ヘッダー</h1>
    </header>
    <div class="m-auto my-3 w-9/12">
        <!--コンテンツが並ぶ-->
    </div>
    <foooter>
        フッター
    </foooter>
</div>
```
ポイントは2つ
1. 大本のdivでflexの縦並びと表示範囲（縦）を指定
1. コンテンツが入るdivでwidthと中央揃えを指定

# 3.まとめ
今回はフッターの固定法について解説しました。
1. 大本にはflex flex-col h-screenを指定する
1. コンテンツのマージンによってフッターのマージンを指定する
    1. コンテンツがm-autoでない場合 → フッターにmt-autoを指定
    1. コンテンツがm-autoの場合 → フッターに何も指定しなくていい

ココまでお付き合いいただきありがとうございました。
※何か連絡や依頼がありましたらDMをお願いします。
[Twitter: Don't Pray Debug](https://twitter.com/DebugDon)
JavaScriptのforEach文

paizaの問題集でforEach文を利用しました

```JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ！！
var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  //入力した文字列をsplitメソッドを使って分割
  const array1 = lines[0].split(' ');
  // forEach文を使用して各要素をそれぞれ標準出力する
  array1.forEach(function(element){
      console.log(element);
  });
});
```

forEach文は
 ```JavaScript
[配列名].forEach(function(変数) {
      //処理文
});
```

で記述します。
いくつかの言語での全角スペースの挙動

## 最初に

言語によって、全角スペースが混入したときの挙動が違います。

各言語によって、どのような違いがあるのだろうかと思い、簡単に調べてみました。

### Python・Javaは、検知してエラー

全角スペースが混じってるだけで、それを検知しエラーとして教えてくれました。

- Python(3.8.2)は、`SyntaxError: invalid character in identifier`と表示。
- Java(openjdk 15)は、`error: illegal character: '\u3000'`と表示。

Javaは文字コードまで教えてくれるので、親切ですね。

### Rubyは、変数名に扱えてしまう

Rubyでは、日本語も変数名に使うことができ、全角スペースも変数名に使えてしまいます。

```fullwidth_space.ruby
　 = "Hello, world!"
p 　 # "Hello, world!"
```

上記のコードは、全角スペースに文字列を代入して出力してます。

そういうわけで、もし全角スペースが混じってもそれを検知し直接的なエラーをださず、
構文エラー(あるいは実行時エラー)となるので、デバッグ難易度が高い。
全角スペースの挙動にかんしては初心者泣かせですね。

### HTML/CSSも、変数名に扱えてしまう。

いわゆるプログラミング言語ではないでしょうが、紹介します。

HTML/CSSもクラス名などに日本語を使うことができ全角スペースなども使えるようでした。

Rubyと同じく、全角が混じってしまうと初心者泣かせだと思います。

### JavaScript

JavaScriptにおいて、全角スペースは半角スペースと同じ空白文字という括りです。
JS関連の派生言語もだいたい同じようです。

まぁ、全角スペースなんて半角スペースの幅が2倍になってるだけですから、
半角スペースと同じような挙動をして欲しいです。

### C/C++は、コンパイラ依存

C/C++はコンパイラによって、全角スペースの扱いが異なるようです。

#### gcc

gcc(10.1.0)は、全角スペースを検知し、構文エラーになりました。

```
error: stray ‘\343’ in program
error: stray ‘\200’ in program
error: stray ‘\200’ in program
```

エラーが何を言ってるのか全然わからないです……。



#### clang

一方で、clang(10.0.0)では、次のように警告がでるのみで動きました。

```
warning: treating Unicode character as whitespace [-Wunicode-whitespace]
```

環境によっては、警告さえ出ないかもしれません。

### 最後に

けっこう言語によって、挙動・親切さが異なりますね。

何か参考になれば、幸いです。

他のプログラミングでの挙動についても書きたい方は、どしどしコメントお願いします。

### 参考

【参考】
[全角スペースを許すプログラミング言語まとめ – プログラミング生放送](https://pronama.jp/2015/09/06/allows-ideographic-space-programming-languages/)(2015)
UIの説明をする際のマークアップにkbdとsampをセットで使うかと思いきやkbdだけでも大丈夫らしい

## この記事の概要

ヘルプページなどには、画面上のメニューや入力要素を示して説明することがあります。
例えば以下のようなイメージです。

> メニューから「ファイル→新規作成」を選択すると、新たにファイルが作成されます。

「こういった説明をする際には`kbd`と`samp`を使って表す」ものだと思っていたのですが、実は`kbd`だけでも大丈夫とのことでした。
忘れそうだったので記事にしています。

## 厳密な書き方

記事冒頭にあげたテキストを厳密にマークアップするなら次のようになります。
（こんなにネストする必要はありませんが、`kbd`が続いて見づらかったので調整しました。）

```html
<p>
  メニューから
  <kbd>
    <kbd><samp>ファイル</samp></kbd>
    →
    <kbd><samp>新規作成</samp><kbd>
  </kbd>
  を選択すると、新たにファイルが作成されます。
</p>
```

## 厳密ではないけど別に大丈夫な書き方

厳密な書き方が直感に反するのでやたら覚えていたのですが、次のマークアップでも問題無いそうです。

```html
<p>
  メニューから
  <kbd>ファイル→新規作成</kbd>
  を選択すると、新たにファイルが作成されます。
</p>
```

## 参照元

[HTML Living Standard](https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-kbd-element)には、以下のような例と説明があります。

> In this second example, the user is told to pick a particular menu item. The outer `kbd` element marks up a block of input, with the inner `kbd` elements representing each individual step of the input, and the `samp` elements inside them indicating that the steps are input based on something being displayed by the system, in this case menu labels:
>
> ```html
> <p>To make George eat an apple, select
>   <kbd><kbd><samp>File</samp></kbd>|<kbd><samp>Eat Apple...</samp></kbd></kbd>
> </p>
> ```
>
> Such precision isn't necessary; the following is equally fine:
>
> ```html
> <p>To make George eat an apple, select <kbd>File | Eat Apple...</kbd></p>
> ```

DeepLにかけました。

> この2番目の例では、ユーザーは特定のメニュー項目を選ぶように言われています。外側の `kbd` 要素は入力のブロックをマークアップし、内側の `kbd` 要素は入力の各ステップを表し、その内側の `samp` 要素はそのステップがシステムによって表示されているもの、この場合はメニューラベルに基づいて入力されていることを表します。

> このような正確さは必要なく、次のようなものでも結構です。

## 最後に

読みやすいので[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd)だけ読んで終わりにしていた気がするのですが、こちらには「省略してOK」の旨は記載されていなさそうです。

やっぱり原典にあたるのが大事だなと思わされました。

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox

Devトークでのお話してくださる方も募集中です！

https://jobs.qiita.com/employers/qiita-inc/dev_talks/489
2022/11/24主にITとかセキュリティの記事

ランサムウェアの被害は金銭だけではない(11/22)
https://japan.zdnet.com/article/35196223/

Windows版「Zoom」にDLLインジェクションの欠陥(11/22)
https://forest.watch.impress.co.jp/docs/news/1457889.html

Twitter、DMにE2E暗号化を導入へ(11/22)
https://www.zaikei.co.jp/article/20221122/698517.html

就活「替え玉」、Webテストの弱点露呈　不正対策に悩み
警視庁が関電社員を逮捕(11/22)
https://www.nikkei.com/article/DGXZQOUE1748V0X11C22A1000000/

ネット風評リスクへの警戒--二重脅迫型ランサムウェアの影響も(11/21)
https://japan.zdnet.com/article/35196160/

「BlackBerry Security Summit 2022 Japan」開催のお知らせ(11/24,11/25開催)
https://ascii.jp/elem/000/004/114/4114107/

クラウドネイティブセキュリティ知らんけど、という人必見！コンテナ/Kubernetesセキュリティツールカタログ(11/22)
https://atmarkit.itmedia.co.jp/ait/articles/2211/22/news009.html

【Deno】Deno1.28「npm完全に理解した」(11/21)
https://qiita.com/rana_kualu/items/ac5471ecc45eed510446

マイクロソフト、「Royal」ランサムウェアのさまざまな配布手段について警告(11/22)
https://japan.zdnet.com/article/35196408/

ウクライナ戦争で「サイバー犯罪」増加か　被害拡大も国が動かない事情(11/21)
https://forbesjapan.com/articles/detail/52064

Googleが語る4つの予測、サイバーセキュリティはこうなる(11/22)
https://kn.itmedia.co.jp/kn/articles/2211/22/news014.html

狙われる物流業者！ 7～9月のサイバー攻撃リポート発表、総数は1億5000万件超 サイバーセキュリティクラウド(11/22)
https://merkmal-biz.jp/post/25853

ワールドカップ ネットライブ配信の偽サイトに注意を(11/22)
https://www3.nhk.or.jp/news/html/20221122/k10013900741000.html

テレワークやハイブリッドワークに求められるセキュリティ対策(11/21)
https://www.trendmicro.com/ja_jp/jp-security/22/k/expertview-20221124-01.html

「非対称パスワード認証」の実証に成功、パスワード漏えいの脅威を一掃(11/22)
https://scan.netsecurity.ne.jp/article/2022/11/22/48527.html

物流委託先の情報セキュリティ対策は万全ですか？(11/21)
https://ecnomikata.com/blog/37211/

実録 社内向けに事業部門が考えるべきセキュリティトレーニングをやってみた【第3回】教育プロジェクトのレビュー(11/21)
https://www.trendmicro.com/ja_jp/jp-security/22/k/securitytrend-20221121-01.html

業務委託とは？　会社側のメリット、デメリット、契約書作成時の注意点などを解説(11/22)
https://the-owner.jp/archives/4487

中国、ロシア情報戦に「便乗」　ウクライナ侵攻で影響力拡大―欧州研究所(11/22)
https://www.jiji.com/jc/article?k=2022112100579&g=int

中国、ロシア情報戦に「便乗」＝ウクライナ侵攻で影響力拡大―欧州研究所(11/21)
https://news.livedoor.com/article/detail/23241711/
Ruby 3.0 に含まれる非互換「位置引数とキーワード引数の分離」の乗り越え方

## 0.　はじめに

```text
おはよう、Ruby エンジニアの皆さん。２０２２ 年も年の瀬となりましたが、元気にしていますか？

実を言うと Ruby 2.7.x はもうだめです。突然こんなこと言ってごめんね。

でも本当です。今年の 4/12 に Ruby 2.7.6 がリリースされました。

それが終わりの合図です。程なく始まるセキュリティメンテナンスフェーズは 1 年しかないので気をつけて。

それがやんだら、少しだけ間をおいて終わりがきます。
```

**参考：** [「実を言うと、地球はもうだめです。」](https://alu.jp/series/%E6%9C%80%E7%B5%82%E5%85%B5%E5%99%A8%E5%BD%BC%E5%A5%B3/article/V6fWmBCTyJYu3xZwTCCi)

## 1. 要するに、来年の 4 月で Ruby 2.7.x のサポートが終了します

そんなわけで、見て見ぬ振りをしてきた、あなたのプロジェクトの Ruby バージョンの更新も、ついには年貢の納め時というわけです。まだ時間は残されていますので、年内から調査と検討を開始しましょう :rolling_eyes: 

さて、`Ruby 2.7.x` 以下からバージョンを上げる場合、次のメジャーバージョンは少し飛んで `3.0.x` になるのですが、ここには大きな非互換が潜んでいます。そう、Ruby　本体を始め、Rails やほとんどの Gem が修正対応を余儀なくされた、

##### 位置引数とキーワード引数の分離 （Separation of positional and keyword arguments）

への対応が必要になるのです。

## 2. 「位置引数とキーワード引数の分離」とは

詳細な説明については、以下の公式ガイドに譲るとして、この非互換な変更は、`Ruby 2.7.0` の段階で既に含まれておりました。ただ、あまりに影響が大きいことが予想されたため、`2.7.0` の時点では、修正が必要なコードがあってもエラーとはならず、deprecation warning が出力されるだけの対応でした。これが、`3.0.0` 以降の Ruby バージョンになると、しっかりエラーを起こすようになります。

**参考：** [Ruby 3.0における位置引数とキーワード引数の分離について](https://www.ruby-lang.org/ja/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/)

## 3. 修正箇所を静的コードチェックで検出できないの？

Ruby 自らが warning を出してくれるということで、チェックツールぐらいどこかに存在してそうに思えますが、私が探してみた限り、そんなものはありませんでした。「Rubocop で対応を検討していたが、誤検出が多かったのでマージが見送られた」というような話しもどこかで聞いた気がするのですが、記憶が定かでないです。この辺のお話しに詳しい方がいらっしゃいましたら、ぜひコメントで教えてください :pray:

ともかく、要修正箇所を洗い出すところから、自分たちの手でなんとかする必要があります :dizzy_face: 

## 4. Ruby 2.7.2 以降は deprecation warning がデフォルト非表示になっている件

実はそうなんです。`Ruby 2.7.0` で「位置引数とキーワード引数の分離」に関する deprecation warning を出力する対応が入ったものの、`Ruby 2.7.2` からは、上記を含む deprecation warning 出力自体がデフォルト非表示になってしまっています。なので、大抵の環境では、コマンドラインオプションを使うなどして、deprecation warning の出力を ON にするところから始める必要があります。

**参考：** [Ruby 2.7.2 リリース](https://www.ruby-lang.org/ja/news/2020/10/02/ruby-2-7-2-released/)

## 5. 組み込みライブラリ `module Warning` を使おう

とは言え、希望はあります。`Ruby 2.5.0` 以降であれば、Ruby の warning 出力を制御できる、Warning という組み込みライブラリが利用できます。`Warning.warn` をオーバーライドするだけで、メッセージのフィルタリングや、出力先の変更が可能です。これを利用して、要修正箇所を収集するコードを書いてみました。とりあえず Rails 向けに書いたのですが、Rails 以外でもちょっと改変すれば使えると思います。

**参考：** [module Warning](https://docs.ruby-lang.org/ja/2.5.0/class/Warning.html)
**参考：** [Ruby 2.5のカスタマイズ可能なWarningモジュール（翻訳）](https://techracho.bpsinc.jp/hachi8833/2018_06_22/58067)

## 6. 次の記事に続く...

で、そのコードなのですが、この記事が長くなっちゃったので、次の記事に分けます :sweat_smile: 以下のクソダサいタイトルの記事へどうぞ

##### [「位置引数とキーワード引数の分離」の要修正箇所収集するマン](https://qiita.com/m-kubo/private/b1aedc3b369480d8f306)
paizaラーニング「任意の数で何回割れる? Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__div_m
私の回答
```Python
N,M = map(int,input().split())

div_count = 0
while True:
    if N % M == 0:
        N //= M
        div_count += 1
    else:
        break

print(div_count)
```
模範解答
```Python
N, M = map(int, input().split())

div_count = 0
while True:
    if N % M == 0:
        N //= M
        div_count += 1
    else:
        break

print(div_count)
```
2で何回割れるの模範解答を基に、今回の回答を作ったので、ほぼ同じ回答になりました。
paizaラーニング「2 で何回割れる？ Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__div_two
私の回答
```Python
n = int(input())
ans = 0
while n % 2 == 0:
    n = n / 2
    ans += 1
print(ans)
```
模範解答
```Python
N = int(input())

div_count = 0
while True:
    if N % 2 == 0:
        N //= 2
        div_count += 1
    else:
        break

print(div_count)
```
模範解答はwhileの中でTrueとかbreakを使っていました。