OmniAICreator/Qiita-1.07M huggingface dataset:
Python3: Yahoo 郵便番号検索API の使い方

参考ページ
[郵便番号検索API](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/zipcodesearch.html)

```py:get_address.py
#! /usr/bin/python
#
#	get_address.py
#
#				 	Jul/31/2022
#
# ------------------------------------------------------------------
import  sys
import  os
import  json
import  requests
from dotenv import load_dotenv
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
dotenv_path = '.env'
load_dotenv(dotenv_path)
APPID = os.environ.get("APPID")
#
code_zip = sys.argv[1];
sys.stderr.write("code_zip = %s\n" % code_zip)

url_base="https://map.yahooapis.jp/search/zip/V1/zipCodeSearch"
url = url_base + "?query=" + code_zip + "&output=json"
#
headers = { "Content-Type": "application/json",
	"User-Agent": "Yahoo AppID: " + APPID }
#
rr=requests.get(url,headers=headers)
dict_data = json.loads(rr.text)
#
#print(dict_data)
#
print(dict_data['Feature'][0]['Property']['Address'])
#
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

```text:.env
APPID = 'dj0zaiZpPW9NN3F****'
```

実行例

```text
$ ./get_address.py 131-8634
*** 開始 ***
code_zip = 131-8634
東京都墨田区押上１－１－２東京スカイツリーイーストタワー１１Ｆ
*** 終了 ***
```
「それ1メソッドでできますよ」

## まえがき

皆さん`.map()`と`.reduce()`に頼り過ぎてませんか？少なくとも私は頼りまくってます。

値にそれぞれ処理をしたいなら`.map()`、全体をまとめたりしたいときは`.reduce()`を使えばおそらくすべての場合に方が付くのではないかと思いますが、往々にして冗長になりがちです。

これはそんな人に送りたい**JavaScriptのプロトタイプメソッドって結構いっぱいありますよ**というお話です。

## `.every()`

```js
const arr = [10, 20, 30, 40, 50];

// .reduce()を使った方法
arr.reduce((pre, cur) => pre && cur > 0, true)

// .every()を使った方法
arr.every((item) => item > 0)
```

全ての要素が条件を満たしているなら`true`、でなければ`false`を返すような関数です。`.reduce()`よりもスッキリしていていいですね！

気になったのでパフォーマンスも測ってみました。ちなみに環境はNode.jsです。

長さ10000の配列に対して1000000回処理する時間を計測した結果です。

|メソッド|時間|
|---|---|
|`.reduce()`|6784ms|
|`.every()`|5ms|

1000倍ほどパフォーマンスに差が出てますね。

<details><summary>検証用に使ったコードはこちら</summary>

```js
const arr = new Array(10000).fill(0).map((_, i) => i);

const sleep = async (ms) =>
  new Promise((resolve) => setTimeout(() => resolve(), ms));

const measure = async (f, count) => {
  let sum = 0;
  for (let j = 0; j < 100; j++) {
    const start = performance.now();
    for (let i = 0; i < count; i++) {
      f();
    }
    sum += time = performance.now() - start;

    await sleep(100);
  }
  return sum / 100;
};

// ここに検証用するものを入れる
const f = () => arr.reduce((pre, cur) => pre && cur > 0, true);

measure(f, 1000000).then((time) => console.log(time));
```

※`sleep(100)`を入れてるのは実行した時々で値が結構ブレるのでそれを吸収するためです。

</details>

## `.some()`

```js
const arr = [10, 20, 30, 40, 50];

// .reduce()を使った方法
arr.reduce((pre, cur) => pre || cur > 100, false)

// .find()を使った方法
arr.find((item) => item > 100) !== undefined

// .some()を使った方法
arr.some((item) => item > 100)
```

少なくとも1つの要素が条件を満たしているなら`true`、でなければ`false`を返すような関数です。同じことは`.find()`や`.reduce()`を使ってもできますが、少し冗長になってしまいますね。

長さ10000の配列に対して1000000回処理する時間を計測した結果です。

|メソッド|時間|
|---|---|
|`.reduce()`|6381ms|
|`.find()`|89ms|
|`.some()`|77ms|

`.find()`はそこそこ早いですが、`.some()`の方が見やすいですし良いでしょう。

## `.flatMap()`

```js
const arr = [1, 2, 3, 4, 5];

// .map()と.reduce()を使った方法
arr.map((item) => [item, item * 10]).reduce((pre, cur) => [...pre, ...cur], [])

// .map()と.flat()を使った方法
arr.map((item) => [item, item * 10]).flat()

// .reduce()と.concat()を使った方法
arr.reduce((acc, item) => acc.concat([item, item * 10]), [])

// .flatMap()を使った方法
arr.flatMap((item) => [item, item * 10])
```

`.map()`した後に配列を深さ1で平坦化するような関数です。色々なやり方がありますが、`.flatMap()`が一番シンプルでわかりやすいですね。

長さ1000の配列に対して1000回処理する時間を計測した結果です。（ここだけ処理が少ないのは時間がかかり過ぎたからです）

|メソッド|時間|
|---|---|
|`.map()`+`.reduce()`|2308ms|
|`.map()`+`.flat()`|590ms|
|`.reduce()`+`.concat()`|1230ms|
|`.flatMap()`|651ms|

`.reduce()`を使ってるやつらは遅いですがそれ以外もそれなりに遅いですね。配列の平坦化は負荷が大きいんでしょうか...？

`.map()`+`.flat()`と`.flatMap()`はあまり差がありませんが、[これらは内部処理がほとんど同じらしい](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap#description)ので、それが理由なのかなと思います。

## まとめ

パフォーマンス的にも可読性的にも`.every()`・`.some()`・`.flatMap()`を使おう！！！

もし他のネタがあったらコメントなりで教えてください。
googleドライブの候補リストを非表示にする

マイドライブをみるときに画面上にある候補リストが邪魔なので、表示設定にしてみた。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/a2bd07a1-cfcb-779d-7251-328e32a97ba2.png)


手順1
　ドライバ画面の上にある歯車アイコンから設定をクリックする。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/2e31bff8-1527-1016-694e-898035d48a7f.png)


手順2
　設定ウィンドウの【全般】の領域をスクロールダウンすると、候補グループにある任意のチェックボックスのチェックを外す。
手順3
　チェックを外したら、「完了」ボタンをクリックする。

![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/94bf37ff-7d84-af0a-ff76-7a0a1f7a79f1.png)

候補の領域が非表示になったら、完了！
sshの設定ファイル .ssh/config について

## 概要

sshの設定ファイルである .ssh/config の備忘録
詳しくは調べていないので不要な設定があるかもしれない


## コード
~/.ssh/config に以下のコードを貼っつける
```
Host *
    HostKeyAlgorithms +ssh-dss
    PubkeyAcceptedKeyTypes=+ssh-dss
    ForwardAgent yes
    protocol 2
    IdentityFile ~/.ssh/id_rsa
    TCPKeepAlive yes
    AddKeysToAgent yes
    UseKeychain yes

Host direct
    HostName direct.domain.co.jp

Host step
    HostName step.domain.co.jp
    User osaosa
    ForwardAgent yes

Host hoge-service
    HostName hoge.domain.co.jp
    ProxyCommand ssh step nc %h %p  // ここのstepは上で設定したホスト
    // ProxyCommand ssh step.domain.co.jp nc %h %p

Host *.domain.co.jp *.domain.com *.domain.edu
    ProxyCommand ssh step.domain.co.jp nc %h %p

```

これで以下の様にして ssh 接続できる
```
ssh direct
ssh hoge-service
ssh fuga.domain.co.jp
```
【AWS】新卒フロントエンジニアがAWS CLFに１ヶ月で合格した方法

# はじめに
2022年4月、新卒で自社開発企業に入社し、フロントエンドエンジニアとして毎日Vue.jsを書いている新卒エンジニアです。
新卒フロントエンジニアながら、AWS CLF（クラウドプラクティショナー）を１ヶ月で取得することができました。
なので取得までに何をしたのかをまとめてみたいと思います。

ちなみにAWSの経験は「AWS Jumpstart for NewGrads」という新卒向けのAWS研修にて３日間アーキテクチャを構築したくらいです。
そのためエンジニアなら誰でもサクッと合格できるレベルの資格かと思います。

# なぜAWS CLFを取得しようと思ったのか
- インフラやバックエンドの仕事をしているわけではないが、個人開発では少しインフラやバックエンドを少し経験したり、もともとAWSに興味があり、改めて体系的に学習しようと思ったため
- 今後のキャリアの選択肢を広げるため
- **会社から報奨金が出るため**

やっぱ報奨金が出るだけで一気にやる気は高まりますよね。（笑）
また、直近のキャリアではあまりAWSに触れることは少ないかもしれないですが、AWSの知識があることで今後のキャリアの幅を広げられる可能性を高めておきたいというのも理由の１つです。

# 学習方法
今回学習に使った教材は次の２つです。

1. [一夜漬け AWS認定クラウドプラクティショナー 直前対策テキスト](https://www.amazon.co.jp/%E4%B8%80%E5%A4%9C%E6%BC%AC%E3%81%91-AWS%E8%AA%8D%E5%AE%9A%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E7%9B%B4%E5%89%8D%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E5%86%85-%E8%B2%B4%E5%BC%98/dp/4798062952/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=)
2. [Udemy 【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/)

まずは、[一夜漬け AWS認定クラウドプラクティショナー 直前対策テキスト](https://www.amazon.co.jp/%E4%B8%80%E5%A4%9C%E6%BC%AC%E3%81%91-AWS%E8%AA%8D%E5%AE%9A%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E7%9B%B4%E5%89%8D%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E5%86%85-%E8%B2%B4%E5%BC%98/dp/4798062952/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=)を一通り読んでみて、AWSの各サービスについてインプットしました。
また、Udemyの問題を解いていてわからないサービスなどがあれば、辞書的に本書を使ったりもしていました。

AWSのサービスだけでなく、クラウドについてやAWSの料金について、AWS　Well-Architectedなどについても書かれてあり、学習の入り口と、試験前最後の確認に打ってつけの１冊でした。

そのあとはひたすら[Udemy 【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/)を解いていきました。

具体的には、全６回分の模擬試験のうち、初めの２回分（基礎レベル）は **正解率９０％以上** になるまで繰り返し解き、続く３回分（応用レベル）は **正解率７０％** くらいになるまで繰り返し解きました。
また、最後の１回分（アソシエイト試験レベル）は１回も取り組みませんでした。

模擬試験を行うときは、不正解だった問題の解説をしっかりと読み込み、自分の選んだ選択肢が
**「なぜ不正解だったのか」** を **理解**し説明できるようになることを意識して取り組みました。
このおかげでその問題以外の知識も効率よくインプットすることに繋がりました。


「理解」について非常にタメになる記事があったので興味があれば是非
https://learn-tern.com/understanding-6aspects/

# AWS CLFに合格してみて
AWS CLFを取得してみて、AWSにどういったサービスがあるのかを学べたのは非常に良かったと思います。
自分は現在フロントエンジニアですが、 **実際にサービスが動いているのはAWS上** なので、その仕組みを少なからず **知っていることは重要 **だと感じています。

とはいえまだまだ知識も経験も乏しいので、引き続きAWSの学習は継続し、業務の中でもAWSに関われそうな機会があれば積極的に関わっていきたいなと思います。

また、できれば今年中にAWSの次の資格も何か取得できるように挑戦してみようかな〜と考えています。
会社の報奨金狙い8割。（笑）

最後まで読んでくださりありがとうございました。
少しでもこの記事が参考になれば幸いです。

[こっち](https://blogdsuke.com/how-to-study-aws-certified-cloud-practitioner/)でも解説してるので気になる方はどうぞ〜
Salesforceのデータインポートの考え方～データインポート時に入力規則に注意しよう～

Salesforceには
「データローダ」など使用して一括でデータのインポートが可能です。
https://help.salesforce.com/s/articleView?id=sf.importing.htm&language=ja&r=https%3A%2F%2Fwww.google.com%2F&type=5

例えば
・今までエクセルでデータ管理していたんだけどこれからSalesforceでデータ管理をしたい。今までのエクセルデータが○千件あるから手動でデータ作成するのは大変だ！

という特にデータローダが便利です。

さて、一方でSalesforceには入力規則というものがあります
入力規則の使い方の１つとして「特定の値が入っている場合にレコード作成ができない」という設定が可能です。
https://help.salesforce.com/s/articleView?id=sf.fields_about_field_validation.htm&language=ja&r=https%3A%2F%2Fwww.google.com%2F&type=5

システム管理者はこの入力規則を使用してデータの入力を徹底させることが可能です。

さて、もしもこのような場合、Salesforceではどのような動きになるでしょうか？

・カスタムオブジェクトＡにデータインポートしたい。インポートするデータは７件あるが３番目と６番目のデータには
ステータス（Status__c）項目が空欄である
・Salesforce環境ではカスタムオブジェクトAに入力規則が有効になっています。ステータス（Status__c）項目が空欄の場合、レコード作成はできない入力規則です

![データ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/94fd5c3a-8829-22ea-d34e-637ce6605e8d.png)

つまり↑のデータをインポートする場合、どうなるか？という話です。

これを読んでいる皆さんは、おそらく「入力規則があるので全レコード作成は難しいだろうな」と直感で分かるはずです。
では、どのようなデータの入り方になるでしょうか。
皆さんの直感では以下の２パターンのどれかだと思うはずです

### パターン１ 入力規則に引っかかるレコードだけ作成されない
今回の場合、３番目の「本橋」と６番目の「吉田」がステータス（Status__c）項目が空欄なので入力規則に引っかかります。
なので、
成功（Success）　田中、佐藤、山田、鈴木
失敗（Error) 本橋、吉田
となるパターンです

つまり以下のような画像のパターンです
![失敗１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/465215fc-3c40-7cf5-10c3-0fb7888781a5.png)

### パターン１ 入力規則に引っかかたレコード以降すべてが作成されない

今回の場合、最初に入力規則に引っかかるのは３番目の「本橋」です。
引っかかってからもうデータのインポートはされなくなる？ので、

成功（Success）　田中、佐藤
失敗（Error) 本橋、山田、吉田、鈴木

となるパターンです。
つまり以下のような画像のパターンです
![失敗２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/59c1593b-a8c3-45e2-94d2-e0b14dc69b6e.png)

みなさん結果はどのようになると思いますか？

実際にデータローダで同条件でインポートすれば分かると思いますが、

### 実際に動作するパターンはパターン１です

![失敗１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7d51e0ea-ec4b-d3a0-a2dd-9bd3984dc90e.png)

あくまでも入力規則に引っかかったレコードだけが作成に失敗し、入力規則に引っかからないレコードは新規作成されます
SwiftUI チュートリアルをやっていく

# SwiftUIチュートリアルについて
Appleの提供するSwiftUIの初心者向けチュートリアルです。いまだに触れていなかったので挑戦していこうと思います。
SwiftUI Essentialsの最初の項目を実施しました。
リンクはこちら
https://developer.apple.com/tutorials/swiftui/creating-and-combining-views

# 実行環境
Xcode14 beta4
iOS16 beta4

# 取り組み方
英語で記載されているのでSafariで日本語に翻訳してから進めるとよかったです。
完成したプロジェクトがダウンロードできるので、そちらを確認しながらチュートリアルを読み進めました。
SwiftUIはプレビューで確認ができるので、この処理を消すとどうなるかな？と試すと理解が深まりました。

# 改変して遊ぶ
カルフォルニアの名所がサンプルになっているので、地元の与野本町の名所に変更しました。
- 画像を新規に追加
    - 画像はさいたま市のHPのものを使いました。
    - https://www.city.saitama.jp/006/014/009/006/p063402.html
- 地図の緯度経度を変更
    - 緯度経度は世界測地系の度数表記でした。値を得るには、「いつもNAVIラボ」の「地図から住所検索」の機能が便利です。
    - https://lab.its-mo.com/glid-addr/index.html
- 地図の縮尺を変更
- タイトルなどの文言を変更

# 完成品
地図を操作できるのは面白いですね。

![IMG_BADC3D4263AA-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570572/31cb43b2-7163-7ac6-cbe4-55e9a9afaff6.jpeg)

# 所感
SwiftUIのプレビューがしっかり表示されて快適だった。M1 Macの力か。
楽しめたので、継続して次のチュートリアルもやっていけそうです。
HTML5での script タグの書き方

たまに script タグを書く時にこの書き方を見るけど
```
<script type="text/javascript"></script>
```

HTML5 からはこの書き方で OK
```
<script></script>
```

外部ファイルを読み込むには、src 属性をつける
```
<script src="sample.js"></script>
```
Python Beautiful Soupでパースで文字化けしたときに読む記事

# 結論

:::note
BeatutifulSoupの第一引数に、requests.getのレスポンスをresponse.text、response.encodingでエンコーディングして文字列型で指定すると文字化けになることがある。文字化けを回避するには、response.contextとしbytes型を指定する。
:::

理由は、レスポンスHTMLに問題がある。原因は、Content-Typeのエンコーディング(charset)がおかしかったり、指定されてなかったりするからだ。

:::note warn
BeautifulSoupはstr型かbyte型で指定できる。
:::


#### requests側でエンコーディング(文字列型で指定)
- **response.encoding** : Content-Typeのエンコーディング
- **response.text** : response.encodingでデコードされたstr型のレスポンスボディ

#### BeautifulSoup側でエンコーディング(bytes型で指定)
-  **response.content**: bytes型のレスポンスボディ



# NGな書き方

```python3
import requests
from bs4 import BeautifulSoup

response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
```

# OKな書き方

```python3
import requests
from bs4 import BeautifulSoup

response = requests.get(url)
soup = BeautifulSoup(response.content, 'lxml')
```
【Google App Script】現在日時（システム日時）の取得方法

GoogleAppScriptに限らず、現在のシステム日時を取得したい時って結構ありますよね。
でも、言語ごとにそれぞれ書き方覚えてられない。。。（一つの言語でも覚えられないですが笑）

なので、自分向けの備忘として、この記事に残しておきます。
取得する形式として、日付のみ、時刻のみ等を指定する方法も併せて紹介します。

# 【共通】dateオブジェクトの取得
取得したい形式に関わらず、まずはDate型のオブジェクトとして生成します。
~~~
// Dateオブジェクトの生成
var date = new Date(); 
~~~

# 形式の設定方法
上記で取得したDateオブジェクトに対して、目的の日付形式で出力します。
例として、スプレッドシートの最終行に出力する場合、以下のような記載になります。

~~~
//　スプレッドシートの指定
var id = "[スプレッドシートのid]";
var ss = SpreadsheetApp.openById(id);
var sheet = ss.getSheets()[0];

// Dateオブジェクトの生成
var date = new Date();

// 現在日時を年月日形式、日本時間で出力
// スプレッドシートの最終行に出力
sheet.appendRow(Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd'));
~~~

# Utilities.formatDateについて詳しく
Utilities.formatDateを使って、さらにいろいろな形式で出力することができます。
| 年 | 月 | 日 | 時 | 分 | 秒 |
|:-:|:-:|:-:|:-:|:-:|:-:|
|yyyy|MM(0表示有)|dd(0表示有)|HH(24h表記/0表示有)|mm(0表示有)|ss(0表示有)|
|   |M(0表示無)|d(0表示無)|H(24h表記/0表示無)|m(0表示無)|s(0表示無)|
|   |||hh(12h表記/0表示有)||   |
|   |||h(12h表記/0表示無)|   |   |

# 参考記事
https://monoblog.jp/archives/6856
Googleが発表した新言語、CarbonでHello, World!

# Carbonとは
Googleが発表した新しいプログラミング言語。C++の後継を目指しているそうです。

https://github.com/carbon-language/carbon-lang

# 環境構築
今回はUbuntu(WSL2)でCarbonを動かしてみます。公式の手順にはHomebrewで必要ツール群を導入する手順が書かれているため、まずはHomebrewを導入します。以下のリンク先にあるインストールコマンドを実行して、Homebrewをインストールしておきましょう。

https://brew.sh/index_ja

インストール後、brewコマンドが使えるようにパスを追加しておく必要があります。以下のコードを`~/.bash_profile`にでも追記しておきます。

```bash:~/.bash_profile
# Homebrew
export PATH=/home/linuxbrew/.linuxbrew/bin:$PATH
```

```bash
# ~/.bash_profileの再読み込み
$ source ~/.bash_profile
```

ここまで行えば、brewコマンドが使えるようになっているはずです。brewコマンドで必要なツールをインストールします。

```
$ brew install bazelisk
$ brew install llvm
```

ここまでできればツールの準備は完了。最後にCarbon言語を実行できるように、リポジトリをクローンしておきましょう。

```
$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbon-lang
```

# Hello, World!
以下のコードを、`hello.carbon`とでも名前を付けて用意します。
（今回は例としてホームディレクトリに`hello.carbon`を作成しています。）

```rust:~/hello.carbon
package hello api;

fn Main() -> i32 {
    Print("Hello, World!");
    return 0;
}
```

用意ができたら、先ほどクローンしたCarbonのディレクトリで以下のコマンドを実行してみましょう。

```bash
$ bazel run //explorer -- ~/hello.carbon
～（省略）～
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
Hello, World!
result: 0
```

`Hello, World!`と表示されていれば成功です。

# 最後に
C++の後継と言われるとRustをイメージされる方が多いと思いますが、C++からRustへの移行は実際のところ容易なものではありません。C++の後継を意識して作られているCarbon言語、今はまだマイナーかもしれませんが、10年後にはC++の後継言語としてメジャーな言語となっているかもしれません。今後の動向が楽しみです。
JavaDoc生成の際、Lombokの@Builderを使うと「エラー：シンボルを見つけられません」が発生する

## 事象

gradleによるJavaDoc生成の際、Lombokの`@Builder`を使ったクラスに対して、「エラー：シンボルを見つけられません」が発生しました。

```
Foo.java:30: エラー: シンボルを見つけられません
       FooBuilder bar() {

  シンボル: クラス FooBuilder
  場所: クラス Foo
```

## 条件
Lombokの`@Builder`で自動生成されたクラスを戻り値とするメソッドを定義した状態で、JavaDoc生成タスクを実行したところ、上記エラーが発生しました。

```java
@Builder
class Foo {
  FooBuilder bar() { // FooBuilderはLombokが自動生成するクラス
    // 略
  }
}
```

## 解決策
Lombokが自動生成するビルダクラスと同名のクラスを置いておくことで、エラーを回避できました。
クラスの中身は空でOKです。

```java
@Builder
class Foo {
  staic class FooBuilder {} // ← Lombokが自動生成するビルダクラスと同名のクラスを置いておく（中身は空でOK）
  FooBuilder bar() {
    // 略
  }
}
```

## 原因
深追いできていませんが、JavaDoc生成ランナーの不具合でしょうか。

## 参考
https://stackoverflow.com/questions/51947791/javadoc-cannot-find-symbol-error-when-using-lomboks-builder-annotation

### Lombokの拡張
上記記事の回答内にSide Noteとして記載がありますが、Lombokが自動生成するクラスと同名のクラスにメソッド等追加すると、うまくマージして貰えるようです。
これにより、Lombokで生成されるBuilderの機能拡張を行うことが可能です。

```java
@Builder
class Foo {
  staic class FooBuilder {
    FooBuilder hoge() { // Lombokが自動生成するビルダクラスにカスタムメソッドを追加可能
      // 略
    }
  }
  FooBuilder bar() {
    return Foo.builder().hoge(); // カスタムメソッド呼び出し
  }
}
```
HerokuのPostgresにCLI接続

```
heroku pg:psql -a {アプリ名}
```
これでDBを直接いじることができる


---
## heroku pg --help
```
  pg:backups             list database backups
  pg:bloat               show table and index bloat in your database ordered by most wasteful
  pg:blocking            display queries holding locks other queries are waiting to be released
  pg:connection-pooling  add an attachment to a database using connection pooling
  pg:copy                copy all data from source db to target
  pg:credentials         show information on credentials in the database
  pg:diagnose            run or view diagnostics report
  pg:info                show database information
  pg:kill                kill a query
  pg:killall             terminates all connections for all credentials
  pg:links               lists all databases and information on link
  pg:locks               display queries with active locks
  pg:maintenance         show current maintenance information
  pg:outliers            show 10 queries that have longest execution time in aggregate
  pg:promote             sets DATABASE as your DATABASE_URL
  pg:ps                  view active queries with execution time
  pg:psql                open a psql shell to the database
  pg:pull                pull Heroku database into local or remote database
  pg:push                push local or remote into Heroku database
  pg:reset               delete all data in DATABASE
  pg:settings            show your current database settings
  pg:unfollow            stop a replica from following and make it a writeable database
  pg:upgrade             unfollow a database and upgrade it to the latest stable PostgreSQL version
  pg:vacuum-stats        show dead rows and whether an automatic vacuum is expected to be triggered
  pg:wait                blocks until database is available
```


```
\dt;
```
使用可能なテーブル一覧を取得

```
\d [テーブル名];
```
テーブル構造を取得

[PostgreSQLの基本的なコマンド](https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb)
ネットワーク構築 #4(SSH接続)

# 今回の内容
･異なるセグメントのルーターにSSH接続出来るように設定をする。
･実施日:2022/07/29～2022/08/

# 状態

ルーターの配置は以下の画像の通りです。
R1はSSH接続出来ているので、R2とR3も同様にSSH接続出来るように設定をします。
(現在はconfigを設定したり、確認するために都度コンソールケーブルを繋げ直して実施しています。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516251/95ea2b75-55e4-5395-2bbb-be6e151cd1a1.png)

teratermからR2(192.168.2.253)、R3(192.168.3.253)にアクセスしようとすると、拒絶もなく黒い画面が表示されるのみです。
各ルーターのSSH設定はR1と同じように設定しています。

R1からR2へのSSH接続が出来ることは確認出来ました。
```
ssh -l username 接続先ルーターのIPアドレス
```
ということはteratermに問題あり?

# 検証1
R1のFa6のポートにVLANとDHCPで自動取得(192.168.0.0/24)のポートを作成しました。
①セキュリティソフトを稼働した状態(Firewallはセキュリティソフトにて管理)でteratermからR2とR3へSSH接続。⇒失敗
②セキュリティソフトを不稼働した状態(Firewallはセキュリティソフトにて管理)でteratermからR2とR3へSSH接続。⇒成功
③再度、セキュリティソフトを稼働した状態(Firewallはセキュリティソフトにて管理)でteratermからR2とR3へSSH接続。⇒成功

結果:Firewallで弾かれても、Firewallを一度オフにした状態で接続が成功するとその後オンにしても接続が可能?

# 検証2
検証1でSSH接続が出来たことを確認できたため、192.168.1.0/24のセグメントから無線でSSHに接続が出来るか確認。
①セキュリティソフトを稼働した状態(Firewallはセキュリティソフトにて管理)でteratermからR2とR3へSSH接続。⇒失敗
②セキュリティソフトを不稼働した状態(Firewallはセキュリティソフトにて管理)でteratermからR2とR3へSSH接続。⇒失敗

結果:R0の設定上でSSH接続を拒否する設定の可能性あり?

# 検証3
上記の検証を踏まえて、R0の設定値を確認しました。
LAN⇒WANとWAN⇒LANからのTCP接続が拒否されている設定となっていました。
現在の設定ではssh接続を暗号化したパスワード設定のみとなっていますので、セキュリティを向上させてから接続出来るようにします。

今回はここまで。
Route 53 Resolver DNS Firewall とは

## 勉強前イメージ

Route 53 Resolver って昨日やったやつじゃなかったっけ？

## 調査

### Route 53 Resolver DNS Firewall とは

VPCから [Route 53 Resolver](https://qiita.com/miyuki_samitani/items/59e9c9ff432a750d728e) に対するアウトバウンドのDNSのクエリを見て
特定のドメイン名に対するクエリをブロックすることができます。
VPCから悪意のあるドメインに対するDNSのクエリをブロックして、信頼できるDNDのクエリのみ許可するfirewallになります。
[DNSトンネリング](https://qiita.com/miyuki_samitani/items/dd5d81cf539467578fd2) の対策になります。

### Route 53 Resolver DNS Firewallで防ぐもの

[Route 53 Resolver](https://qiita.com/miyuki_samitani/items/59e9c9ff432a750d728e) に対するDNSのトラフィックになります。
DNS以外のhttpやsshのトラフィックに関しては関係ないです。

### ブロックに対して

> 特定のドメイン名に対するクエリをブロックすることができます。
と記載していますが、ブロックするドメインは以下の方法で決定します。

- AWSが提供するリスト
	- AWSManagedDomainsMalwareDomainList
		- 既知のマルウェアの通信先ドメインのリスト
	- AWSManagedDomainsBotnetCommandandControl
		- 既知のボットネットの Command & Control サーバのドメインのリスト
- 自分でリストを作成
	- 新規にドメインリストを作成する

また、ブロックすべきドメイン名に対してのDNSクエリが来た際にどうアクションするかも決められます。

- ALLOW : 許可
- BLOCK : 許可しない
	- NODATA : DNSクエリは成功するが利用可能な応答がないことを示す
	- NXDOMAIN : DNSクエリのドメインがないことを示す
	- OVERRIDE : 応答をカスタムする
- ALERT : アラートを出す

## 勉強後イメージ

DNSトンネリングは検知が難しいっていわれてるから
事前に防ぐ必要がある・・・

## 参考

- [AWSの基礎を学ぼう 特別編 最新サービスをみんなで触ってみる 〜Amazon Route 53 Resolver DNS Firewall〜 ハンズオン手順 #awsbasics](https://dev.classmethod.jp/articles/awsbasics_route53_dns_firewall_handson/)
- [Amazon Route 53 Resolver DNS Firewallを分かりやすく解説してみる](https://blog.serverworks.co.jp/route-53-resolver-dns-firewall)
- [[アップデート] VPC からのアウトバウンド DNS クエリをフィルタリング。Amazon Route 53 Resolver DNS Firewall がリリースされました。](https://dev.classmethod.jp/articles/amazon-route-53-resolver-dns-firewall/)
【git】cherry-pickはやっぱり美味かった🍒


## やりたいこと
ブランチをそのままマージしたくはないけど、特定のコミットだけを取り込みたい。
cherry-pickを使ってみる。
![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/2f516d9e-1b63-48d3-0fc1-8417573847c2.png)
## 結論
◆他ブランチから指定したコミットを取り込んだ後に、そのまま自ブランチにコミットしてよいとき
```
git cherry-pick [コミットID]
```
◆他ブランチから指定したコミットを取り込んだ後に、そのまま自ブランチにコミットしないとき
```
git cherry-pick -n [コミットID]
```
## 検証

### 検証の流れ
1. featureAブランチとfeatureBブランチをを作成
2. featureAブランチにのみコミットを繰り返して、ファイルの中身を変更
3. fearuteBブランチに追加したいコミット履歴のみfeatureAからcherry-pickする


####  1. file1とfile2を作成する。(初期状態)

◆file1
```
aaa
```
◆file2
```
bbb
```

#### 2.featureAブランチにコミットを追加して、下記のようなファイル状態にする(最終)

◆file1
```
aaa
AAA
あああ
```
◆file2
```
bbb
BBB
びーびーびー
```

#### featureAブランチのコミット履歴
```
$ git log
commit 2b8d2984ba754b780f469ab32755df9bffd27c02 (HEAD -> fearureA)
Author: tatsuya1995
Date:   Sat Jul 30 18:08:29 2022 +0900

file2にBBBとびーびーびー追加

commit 0b253dd91db81953cf8d52eda0aa8f87442a51ec
Author: tatsuya1995
Date:   Sat Jul 30 18:06:53 2022 +0900

file1にAAAとあああ追加

commit 8eba7ea1f224dff44551cd85b478198b246437e2
Author: tatsuya1995
Date:   Sat Jul 30 18:03:26 2022 +0900

file1とfile2作成
```


※featureBブランチは初期状態の`commit 8eba7ea1f224dff44551cd85b478198b246437e2`から派生したままにしているため、file2の中身は変更なしのまま。

#### 3. cherry-pick実行
cherry-pickを行ない、featureBブランチに`commit 2b8d2984ba754b780f469ab32755df9bffd27c02`のfile2に対する変更だけを取り込む。

```
$ git cherry-pick 2b8d2984ba754b780f469ab32755df9bffd27c02
[featureB ade1b86] file2にBBBとびーびーびー追加
Date: Sat Jul 30 18:08:29 2022 +0900
1 file changed, 3 insertions(+), 1 deletion(-)
```
◆featureBブランチのログ
```
$ git log
commit ade1b86f9258b8da8b80dc9cce86bc9627f87b8a (HEAD -> featureB)
Author: tatsuya1995
Date:   Sat Jul 30 18:08:29 2022 +0900

file2にBBBとびーびーびー追加

commit 8eba7ea1f224dff44551cd85b478198b246437e2
Author: tatsuya1995 [tatsuyawada1995@gmail.com](mailto:tatsuyawada1995@gmail.com)
Date:   Sat Jul 30 18:03:26 2022 +0900

file1とfile2作成
```

featureBの中身
◆file1
```
aaa
```
◆file2
```
bbb
BBB
びーびーびー
```
file2に対する変更したコミットのみ取り込まれた！
流れとしては下記のようになる。
![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/8b1c54b7-92b6-d285-dbfe-65aee88cfac5.png)



## git cherry-pick nオプション
ちなみに`git cherry-pick [コミットID]`ではコミットもセットで行われるので、変更を取り込むだけにしたいときはnオプションをつければよい。

```
$ git cherry-pick -n 0b253dd91db81953cf8d52eda0aa8f87442a51ec
$ git status
On branch featureB
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified:   file1
```
git addされた状態で取り込まれる。
Azure Container Registry (ACR) に Docker Hub からコンテナイメージを直接インポートしてみた

## 背景と目的

docker build を何回もしてると Docker Hub のダウンロード率制限により `429 Too Many Requests` エラーが発生して困ったことが何度かあります。そんな時は自前で立てたコンテナレジストリに手動でダウンロードしたコンテナイメージをプッシュしてから使う、という選択を皆さんもされるのではないかと思います。今回はわざわざコンテナイメージをダウンロードしなくても Azure Container Registry (ACR) に Docker Hub から直接インポートする方法があるので試してみました。

## ACR の検証環境を作る

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnracrdev

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# ACR を作成します
az acr create \
  --resource-group ${prefix}-rg \
  --name ${prefix} \
  --sku Basic
```

## Docker Hub の公式イメージをインポート

```bash:bash
# 公式イメージには docker.io/library/ をつけます
az acr import \
  --name ${prefix} \
  --source docker.io/library/hello-world:latest \
  --image hello-world:latest

# hello-world が登録されたか確認します
az acr repository list \
  --name ${prefix}

# hello-world のタグを確認します
az acr repository show-tags \
  --name ${prefix} \
  --repository hello-world
```

めちゃくちゃ便利で簡単ですね！

## (参考)イメージのインポートを禁止するカスタムロール

自分の PC にコンテナイメージのダウンロードが必要ないということは、例えばインターネットとの境界にファイアウォールやプロキシなどで制限のある社内の開発環境でも ACR にアクセスして何かしらのデータを外部から持ち込んだりできそうです。そこで参考までに ACR のカスタムロールでインポートを禁止するサンプルも用意しておきたいと思います。

```json:json
{
   "assignableScopes": [
     "/subscriptions/12345678-1234-1234-1234-123456789012"
   ],
   "description": "Custom ACR Role",
   "Name": "CustomAcrUser",
   "permissions": [
     {
       "actions": [
         "Microsoft.ContainerRegistry/registries/push/write",
         "Microsoft.ContainerRegistry/registries/pull/read",
         "Microsoft.ContainerRegistry/registries/read"
       ],
       "dataActions": [],
       "notActions": [
         "Microsoft.ContainerRegistry/registries/importImage/action"
       ],
       "notDataActions": []
     }
   ],
   "roleType": "CustomRole"
 }
```

## 検証環境を削除

```bash:bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg \
  --yes
```

## 参考

https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/download-rate-limit/

https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-import-images?tabs=azure-cli

https://hub.docker.com/_/hello-world?tab=tags

https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-roles?tabs=azure-cli
y√x の 計算方法(Python)


今回は[hmath](https://caleb7023.hmath.pro/)で使用されている$\sqrt[y]{x}$の計算方法をご紹介します。
## 計算式
[hmath](https://caleb7023.hmath.pro/)は次の数式で$\sqrt[y]{x}$を定義しています。
```math
\sqrt[y]{x}=x^\frac{1}{y}
```
なぜこのような式になるかというと、$xy=x\frac{1}{y}$
みたいに$\sqrt[y]{x}$も$x^\frac{1}{y}$という$y$の逆数乗で計算できます。
## プログラム
[hmath](https://caleb7023.hmath.pro/)内では次のプログラムで計算しています。
```ruby:radical.py
def radical(x, y):
    return y ** (1 / x)
```
順番は$\sqrt[x]{y}$
逆数を使って計算することで逆の計算ができる。

最後まで見ていだきありがとうございました。
ぜひ活用してみてください。
ちょっとした Pythonでの知識 (enumerate 型)

Python には enumerate というデータ型が備わってます。
いったい何に使うデータ型でしょうか?
簡単に説明すると**リストの要素とインデックス**をfor文で同時に取得します。
↓↓↓サンプルプルプログラムです↓↓↓
```ruby:sample.py
risuto =[
 "poteto",
 "ninnzinn",
 "玉葱",
 "kome",
]
for indekkusu, youso in enumerate(risuto):
    print(youso, indekkusu)
```
出力
```ruby
poteto 0
ninnzinn 1
玉葱 2
kome 3
```
私の中ではすごい役に立っています。
使えるときは使えるので、是非、活用してください。
最後まで見ていただきありがとうございました。
Terraform × Azure : Microsoft Defender for Cloud の ON / OFF を設定する

Azureでリソース保護のために利用するMicrosft Defender for Cloudですが、Terraformから設定する場合、リソース `azurerm_security_center_subscription_pricing` を使用します。
リソース名に `Defender...`の文字列が含まれないため、ご留意ください。

Azure ポータルから以下の手順で確認できる内容です。
Microsoft Defender for CloudのメニューEnvironment settings → サブスクリプションを選択　→ Defender plans

* tier

| Terraform | Azure |
| --- | --- |
| Free | OFF |
| Standard | ON |

* resource_type と Azure `Microsoft Defender for ...` の対応

| Terraform `resource_type` | Azure |
| --- | --- |
| VirtualMachines | Servers |
| AppServices | App Service |
| Databases | OpenSourceRelationalDatabases |
| StorageAccounts | Storage |
| Containers | Containers |
| KeyVaults | Key Vault |
| Arm | Resource Manager |
| Dns | DNS |

Microsoft Defender for Cloud は、2021年11月までは Security Center という名前だったそうです。  
Terraform のリソース名にはこの名残があるようです。

## 参考

- [azurerm_security_center_subscription_pricing](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/security_center_subscription_pricing)
- [Azure Security product name changes – Microsoft Ignite November 2021](https://techcommunity.microsoft.com/t5/itops-talk-blog/azure-security-product-name-changes-microsoft-ignite-november/ba-p/3004418)
【VSCode】MarkdownをPDFに変換する方法


## `.md`を`.pdf`に変換する方法
Markdown PDFという拡張機能を使用することでMarkdownをPDFに変換できます。

https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf

## 基本的な使用方法
Markdown PDFをインストールします。
`.md`ファイルを開き、右クリックします。
![E1930970-712A-4E0F-92AD-6843DB29C2B4のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/7e4d2aac-3349-cecb-9804-d5c9ba647f4b.png)

`Markdown PDF:Export(pdf)`を選択します。

すると`.pdf`が作成されます。
![スクリーンショット 2022-07-31 午前6.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/2d42158e-2ad2-223a-e7c8-863112e656ac.png)

`pdf`以外にも`html`, `png`, `jpeg`に変換できます。

## 主な設定
* `markdown-pdf.convertOnSave`  
ファイル保存時にpdfなどを出力します。

* `markdown-pdf.type`  
ファイル保存時に出力されるファイルを選択できます。
```setting.json
    "markdown-pdf.type": [
      "pdf",
      "html"
    ],
```
上記のように設定すると`pdf`と`html`が出力されます。

* `markdown-pdf.styles`  
cssファイルのパスを指定することでstyleを変更できます。
htmlファイルを出力する際にはオンラインCSSを指定しないと適用されません。
ただしオンラインCSSを指定するとPDFで問題が発生するようです。

* `markdown-pdf.outputDirectory`  
ファイルの出力先を指定できます。

* `markdown-pdf.displayHeaderFooter`
PDFのヘッダーとフッターの表示・非表示を切り替えます。
AtCoder B,C問題をKotlinで解こう - ABC261

当記事ではAtCoder、ABCのB問題ならびにC問題（時々D問題も）のKotlinでの解法を超初心者向けに詳細に解説します。

https://atcoder.jp/contests/abc261/tasks

## B - [Tournament Result](https://atcoder.jp/contests/abc261/tasks/abc261_b)
#### やりたいこと
表の全ての要素について以下の処理を行おう。
i行目j列目の要素(Aij)値によってj行目i列目の要素（Aji)の値が以下のようになっているかどうかをチェックしよう。（ただしj==iの場合は処理対象外）
| Aijの値 | Ajiの値 |
|:-:|:-:|
| 'W' | 'L' |
| 'L' | 'W' |
| 'D' | 'D' |

#### 入力値の取得
```kotlin
    // 入力値の取得
    val n = readLine()!!.toInt()
    val result = (1..n).map { readLine()!! }
```

#### サンプルコード
```kotlin:main.kt
fun main(args: Array<String>) {
    // 答えの出力
    println(if (getAns()) "correct" else "incorrect")
}

fun getAns(): Boolean {
    // 入力値の取得
    val n = readLine()!!.toInt()
    val result = (1..n).map { readLine()!! }

    for (i in (result.indices)) {
        for (j in (result[i].indices)) {
            // i == j は処理の対象外
            if (i == j) {
                continue
            }

            // 場合分け
            when (result[i][j]) {
                'D' -> {
                    if (result[j][i] != 'D') {
                        return false
                    }
                }
                'W' -> {
                    if (result[j][i] != 'L') {
                        return false
                    }
                }
                'L' -> {
                    if (result[j][i] != 'W') {
                        return false
                    }
                }
            }
        }
    }
    return true
}
```
## C - [NewFolder(1)](https://atcoder.jp/contests/abc261/tasks/abc261_c)
#### やりたいこと
文字列をキー、整数を値とするMutableMapを作成し、文字列を受け取るたびに以下の処理を行おう。
最終的な出力は最大2万行になるため、StringBuilderに出力値を入れて、最終的にまとめて出力しよう。

+ MutableMapに入力された文字列をキーとする要素がない場合
  + 文字列をStringBuilderに追加
  + MutableMapに文字列をキーとし、値1を追加
+ MutableMapに入力された文字列をキーとする要素がある場合
  + 文字列 + "(" + 要素の値 + ")" をStringBuilderに追加
  + MutableMapの文字列をキーとした値を、要素数+1に更新

#### 入力値の取得
```kotlin
    val n = readLine()!!.toInt()
    repeat(n) {
        val s = readLine()!!
    }
```

#### サンプルコード
```kotlin:main.kt
fun main(args: Array<String>) {
    // 入力値の取得
    val n = readLine()!!.toInt()
    // 文字列が何個入力されたかを保持するMap
    val cnt = mutableMapOf<String, Int>()
    // 最終的に答えを出力するStringBuilder
    val ans = java.lang.StringBuilder()

    repeat(n) {
        // 入力された文字列を取得
        val s = readLine()!!
        cnt[s]?.also {
            ans.appendln("$s($it)")
        } ?: run {
            ans.appendln(s)
        }
        // Mapの更新
        cnt[s] = (cnt[s] ?: 0) + 1
    }
    // 答えの出力
    print(ans.toString())
}
```
2022/7/31主にITとかセキュリティの記事

今だからこそ問い直すSIEMの必要性とセキュリティジャーニー ～セキュリティ運用における現在地と目指す先～(8/31開催)
https://japan.zdnet.com/event_info/30011883/

「IL-CSIRTによるセキュリティインシデントに関する解説」を更新
～当社IL-CSIRTの知見をもとに推測されるサイバーセキュリティ上の問題点と対策を解説。セキュリティ対策やインシデント発生時の対応に活用可能～(7/29)
https://www.intellilink.co.jp/topics/notification/2022/072900.aspx

サイバー攻撃が驚異的な増加、24社中1社が毎週ランサムウェア攻撃受ける(7/29)
https://news.mynavi.jp/techplus/article/20220729-2409288/

フィッシング詐欺の報告 4～6月は26万件余りで過去最高(7/29)
https://www3.nhk.or.jp/news/html/20220729/k10013741071000.html

サイバー政策動向を知ろう Watch! Cyber World vol.3 | 中国の法整備(7/29)
https://blogs.jpcert.or.jp/ja/2022/07/cyberworld3.html

最新フィッシングメール動向: 従業員が最も引っかかりやすい件名は人事部門やIT部門からのメールを装う通達やお知らせ(7/29)
https://www.jiji.com/jc/article?k=000000103.000053624&g=prt

患者2名の電子カルテを不正閲覧しLINEで流出、徳島県(7/29)
https://cybersecurity-jp.com/news/69905

個人情報保護法改正施行！ 労務・法務担当の対策ポイントを弁護士が解説(7/29)
https://mag.smarthr.jp/labor/detail/kojinjouhouhogohou_kaisei/

違法な医薬品を販売するWebサイトが多数検出―2022年6月 サイバーセキュリティニュース(7/29)
https://news.mynavi.jp/techplus/kikaku/20220729-security_frontline_v169/

DiscordやTelegramに注意、サイバー犯罪者が窃取データ保存先として悪用(7/29)
https://news.mynavi.jp/techplus/article/20220729-2409422/

セキュリティのトレンド：なぜLog4Shellの脆弱（ぜいじゃく）性は攻撃され続けるのか(7/29)
https://atmarkit.itmedia.co.jp/ait/articles/2207/29/news009.html

EDRは巨大市場になる(7/29)
https://www.weeklybcn.com/journal/column/detail/20220729_192777.html

金融機関のセキュリティ人材は平均年齢高く 他業界に比べハイスペック、業界内で教育の仕組みも(7/29)
https://scan.netsecurity.ne.jp/article/2022/07/29/47972.html

「自動車サイバーセキュリティに関する法的留意点」と題して、ＴＭＩ総合法律事務所　パートナー弁護士　岩田　幸剛氏／弁護士　白井　紀充氏によるセミナーを2022年8月31日（水）に開催!!
https://prtimes.jp/main/html/rd/p/000002103.000032407.html

【伊藤が解説します】三井住友海上、国内初のNFT盗難保険を開発(7/29)
https://coin-otaku.com/topic/68854?utm_source=rss&utm_medium=rss&utm_campaign=post-67620-3-3-18-2-3-8-4-3-2

ICT集積地アイルランドにおけるIoT事情--後編(7/29)
https://japan.zdnet.com/article/35190964/

シフトレフト実現を左右する「静的アプリケーション診断ツール」、3つの誤解とは(7/29)
https://atmarkit.itmedia.co.jp/ait/articles/2207/29/news123.html

その仕様、できません　システム開発途中で気づくためには(7/29)
https://www.orangeitems.com/entry/2022/07/29/075556

米議員がAppleに質問状〜詐欺目的の仮想通貨アプリをストアに放置と主張(7/29)
https://iphone-mania.jp/news-472504/

Git初心者のためのGitのあいまいさ完全に理解するガイド(7/30)
https://qiita.com/yoshiichn/items/5d9c9105b980921f2809

当センターにおける外部機関等との間のファイル授受方式変更に関するお知らせ(7/29)
https://www.fisc.or.jp/topics/005411.php

頓挫しかけているビッグテック規制、11月までの決着なるか?(7/29)
https://news.mynavi.jp/techplus/article/svalley-928/

Google Playの開発者ポリシー更新　不快な広告禁止やプライバシー保護強化など(7/29)
https://www.itmedia.co.jp/mobile/articles/2207/29/news154.html

トレンドマイクロが「感謝」しすぎなメールを誤配信、ネット「ヤンデレかな？」(7/29)
https://news.mynavi.jp/article/20220729-2411504/

故人のTwitterアカウントの正しい消し方、残し方(7/29)
https://internet.watch.impress.co.jp/docs/column/tengoku/1428020.html

「マイナポイント」のこと 《ひょうたんの眼》51(7/29)
https://newstsukuba.jp/39814/29/07/

ロシアがトラフィック妨害でAppleサーバーの乗っ取り試みる？(7/29)
https://gunosy.com/articles/anZwh

中国当局がIT企業に押し付ける「監視機能」...板挟みの企業が見せたギリギリの抵抗(7/29)
https://www.newsweekjapan.jp/stories/world/2022/07/it-23.php

Web3.0世界の「トークン」8種類を徹底解説！定義や歴史、暗号資産との違いもご紹介(7/29)
https://seleck.cc/token
AtCoder B,C問題をKotlinで解こう - ABC260

当記事ではAtCoder、ABCのB問題ならびにC問題（時々D問題も）のKotlinでの解法を超初心者向けに詳細に解説します。

https://atcoder.jp/contests/abc260/tasks

## [B - Better Students Are Needed!](https://atcoder.jp/contests/abc260/tasks/abc260_b)
#### やりたいこと
受験生を3種類のソート条件でソートし、上位から(x,y,z)人を取り出してSetに格納しよう。
同じ受験生を重複して合格者としないよう気をつけよう。
#### 入力値の取得
```kotlin
    // 入力値の取得
    val (n, x, y, z) = readLine()!!.split(" ").map { it.toInt() }
    // 数学のスコア
    val a = readLine()!!.split(" ").map { it.toInt() }
    // 英語のスコア
    val b = readLine()!!.split(" ").map { it.toInt() }
```
#### Comparator の作成
合格基準となるスコアの配列を渡して、渡されたスコアによってソートできるようComparatorを作成しよう。
```kotlin
class Comp(private val target: List<Int>) : Comparator<Int> {
    override fun compare(o1: Int?, o2: Int?): Int {
        if (target[o1!!] == target[o2!!]) {
            return o1!!.compareTo(o2!!)
        }
        return target[o1!!].compareTo(target[o2!!]) * -1
    }
}
```
#### サンプルコード
```kotlin:main.kt
fun main(args: Array<String>) {
    // 入力値の取得
    val (n, x, y, z) = readLine()!!.split(" ").map { it.toInt() }
    // 数学のスコア
    val a = readLine()!!.split(" ").map { it.toInt() }
    // 英語のスコア
    val b = readLine()!!.split(" ").map { it.toInt() }

    // 合格済みの受験生
    val passed = mutableSetOf<Int>()
    passed.addAll((0 until n).sortedWith(Comp(a)).take(x))
    passed.addAll((0 until n).filter { it !in passed }.sortedWith(Comp(b)).take(y))
    passed.addAll((0 until n).filter { it !in passed }.sortedWith(Comp(a.indices.map { a[it] + b[it] })).take(z))
    passed.sorted().map { it + 1 }.forEach { println(it) }
}

class Comp(private val target: List<Int>) : Comparator<Int> {
    override fun compare(o1: Int?, o2: Int?): Int {
        if (target[o1!!] == target[o2!!]) {
            return o1!!.compareTo(o2!!)
        }
        return target[o1!!].compareTo(target[o2!!]) * -1
    }
}
```
## [C - Changing Jewels](https://atcoder.jp/contests/abc260/tasks/abc260_c)
#### やりたいこと
レベルの最大値は10と少ない。順番に処理していこう
+ レベルNの赤い宝石を変換（レベルNの青い宝石の数が確定する）
+ レベルNの青い宝石を変換（レベルN-1の赤い宝石の数が確定する）
+ レベルN-1の赤い宝石を変換（レベルN-1の青い宝石の数が確定する）
+ レベルN-1の青い宝石を変換（レベルN-2の赤い宝石の数が確定する）
+ レベルN-2の赤い宝石を変換（レベルN-2の青い宝石の数が確定する）
 ：

という順でレベル1まで処理していこう

#### 入力値の取得
```kotlin
    // 入力値の取得
    val (n, x, y) = readLine()!!.split(" ").map { it.toInt() }
```
#### サンプルコード
```kotlin:main.kt
fun main(args: Array<String>) {
    // 入力値の取得
    val (n, x, y) = readLine()!!.split(" ").map { it.toInt() }

    // 赤い宝石の数を格納する配列
    val red = LongArray(n + 1)
    // 青い宝石の数を格納する配列
    val blue = LongArray(n + 1)

    // 最初はレベルnの赤い宝石が1個
    red[n] = 1
    for (i in (n downTo 2)) {
        // 赤い宝石の変換処理
        red[i - 1] += red[i]
        blue[i] += red[i] * x

        // 青い宝石の変換処理
        red[i - 1] += blue[i]
        blue[i - 1] += blue[i] * y
    }
    println(blue[1])
}
```
Next.js 12で開発中のHMRがうまくいかない場合の対処


Next.js 12で開発中のHMRがうまくいかない場合の対処方法です。

## TL;DR

以下の、Next.js 12以降へのUpgrade時の移行ガイドを参照してよしなに設定してください。

- [Upgrading: Version 12 | Next.js](https://nextjs.org/docs/pages/building-your-application/upgrading/version-12#hmr-connection-now-uses-a-websocket)


## 環境

- Next.js 12以上
- nginxやApacheなどをReverse-Proxyとして、Next.js開発サーバーの前段に配置している場合


## 解説

Next.js 12では、devモードでのコード編集時のホットリロード (HMR) はWebSocketを介してクライント側に通知されるようになりました。
- 上記環境のように、ReverseProxyとしてWebサーバーを立てて開発している場合、nginxやApacheの設定がされていないとWebSocketのコネクション確率ができずにHMRがうごかなくなる場合があります。
- この場合、ブラウザ側のconsoleログに `WebSocket connection to 'wss://xxxxxx/_next/webpack-hmr' failed` などがでる。


## 対応方法

Next.js公式のアップグレードガイドを参考に、ブラウザ -> Reverse-Proxy -> Next.js 間のWebSocketのコネクション確立時のやりとりができるように設定してあげればOK

nginxの場合
```nginx
location /_next/webpack-hmr {
    proxy_pass http://localhost:3000/_next/webpack-hmr;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
```
- refs : [Upgrade Guide | Next.js](https://nextjs.org/docs/upgrading#nextjs-hmr-connection-now-uses-a-websocket)


apacheの場合
```apache
# (mod_rewriteなどは適宜設定)
 <Location /_next/webpack-hmr>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} transport=websocket [NC]
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule /(.*) ws://localhost:3000/_next/webpack-hmr/$1 [P,L]
    ProxyPass ws://localhost:3000/_next/webpack-hmr retry=0 timeout=30
    ProxyPassReverse ws://localhost:3000/_next/webpack-hmr
 </Location>
```

- refs : ["Websocket connection failed" when proxying requests to Next.js app via Apache server - Stack Overflow](https://stackoverflow.com/questions/70753484/websocket-connection-failed-when-proxying-requests-to-next-js-app-via-apache-s)


以上。Apaecheの場合もっと簡潔な書き方があるかも。

余談。これにぶつかるまで、HMRが[server-sent events](https://developer.mozilla.org/ja/docs/Web/API/Server-sent_events/Using_server-sent_events) を使ってるのに気づいてなかったのでびっくりした。


## 参考

- [WebSocket connection failed errors after upgrade to Next.js 12 · Issue #30491 · vercel/next.js](https://github.com/vercel/next.js/issues/30491)
- [Hot Module Replacementの設定と仕組みを理解する - Qiita](https://qiita.com/haradakunihiko/items/40486ec2b6b9aea119bb)
- [WebSocketが生まれるまでの変遷 - Qiita](https://qiita.com/h_tyokinuhata/items/809bdb66f8da6dd53bb6)
- [WebSocketについて調べてみた。 - Qiita](https://qiita.com/south37/items/6f92d4268fe676347160)
[React]useRef() が使えない

*hooks以降のreact

# Error内容
useRefを使ったときに
型 'MutableRefObject<HTMLElement | undefined>' を型 'LegacyRef<HTMLElement> | undefined' に割り当てることはできません
と出る。

```react
const ref = useRef<HTMLElement>()
...

return (
    <>
        <div ref={ref}>
            ...
        </div>
    </>
)
```

# 解決法
useRefはnullで初期化する。また、型は詳しく書く！

```
const ref = useRef<HTMLDivElement>(null)
```

nullで初期化することによりMutableRefObjectになる。
MutableRefObjectはReactが管理するobjectであり、勝手にref.currentが変えられることを防ぐことができるとのこと！
Github Actionsで並列でjobを実行したときの課金を調べてみた

# 動機
Github Actionsの高速化のためにjobを直列ではなく並列で実行するようにしたが、そういえば課金ってどうなるんだっけというのが気になったので調べてみた。

具体的には5分掛かるjobを3つ実行した際に課金としては5分になるのか15分になるのかが気になった。

普通に考えると後者だけれどもドキュメントに明確な記述がなかったので実験してみた。

# 結果
結果としては、至極当たり前だが述べ実行時間が課金対象になった。

**結果**
![スクリーンショット 2022-07-31 1.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215694/e69704f7-ac1d-2cdb-cc41-ba7eeb58268a.png)

**ymlファイル**
```yml
name: test
on:
  push:
    branches: [ "main" ]

jobs:
  one:
    runs-on: ubuntu-latest
    steps:
      - name: sleep
        shell: bash
        run: sleep 60
  two:
    runs-on: ubuntu-latest
    steps:
      - name: sleep
        shell: bash
        run: sleep 60
  three:
    runs-on: ubuntu-latest
    steps:
      - name: sleep
        shell: bash
        run: sleep 60
```

## 補足
Run Timeが1m1sなのに対してBillable Timeが2mなのは切り上げられているからですね。
この仕様があるので必要以上にタスク並列化による最適化に拘るのも考えものかもしれないですね。

> GitHub rounds the minutes each job uses up to the nearest minute.

https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions
★備忘録 Laravel Guardを使用しての認証カスタム

Laravel8 でのマルチ認証機能（toC toB）作成にあたり、
Guardを用いての開発が簡単だった

```php:
Auth::guard();
```

上記メソッドを呼び出すだけで、通常のusersテーブルを使用しての
認証処理が実装可能で

```php:
Auth::guard('admin');
```

上記の様に引数を与えると
config/auth.phpの'guards'オブジェクトに追記した
値を読んで自動的にテーブルを切り替えてくれる
Linux,VSCode環境下でFlutterのデバイスリストにChromeが表示されない問題の対処法

# 問題  
VisualStudio CodeのFlutter拡張機能において、ターゲットデバイスの選択時にGoogle Chromeが表示されない(Linuxしかデバイスが表示されない)。
  
# 環境
- Arch Linux
- VisualStudio Code  (visual-studio-code-bin 1.69.2-1)
- Google Chrome (google-chrome 103.0.5060.53-1)
- 環境変数は~/.zshrcに記述
  
# 原因
[このサイト](https://pyteyon.hatenablog.com/entry/2021/04/28/200000)に原因が記載されていた。  
VSCodeの起動の仕方によってはターミナルの環境変数が引き継がれないのが問題。 
自分の環境ではDockからVSCodeを起動していた。
  
# 解決法
とりあえず問題が解決すればいいのならターミナルからVSCodeを起動すれば良い。
~~~console 
code 開きたいフォルダ
~~~
しかし毎回これをやるのは面倒なので、~/.zshrcではなく/etc/environmentで環境変数を設定する。  
こうすればシェルを問わず環境変数が通る。
他のLinuxディストリビューションでは/etc/environmentに相当するものを編集する。
~~~console 
sudo nano /etc/environment
#以下を追記
PATH=$PATH:[flutter-SDKのパス]
CHROME_EXECUTABLE=[Google Chromeのパス] #任意
~~~
GitOps Principles とは

# はじめに

[GitOps Principles v1.0.0](https://opengitops.dev/#principles) についてまとめた。

# GitOps Principles 

## 1. Declarative 宣言的であること

> A system managed by GitOps must have its desired state expressed declaratively.

GitOps で管理されるシステムは、その望ましい状態（目標状態）を宣言的に表現しなければならない。

## 2. Versioned and Immutable バージョン管理され不変的であること

> Desired state is stored in a way that enforces immutability, versioning and retains a complete version history.

目標状態は、不変性とバージョン管理を強制し、完全なバージョン履歴を保持する方法で保存される。

## 3. Pulled Automatically 自動的にプルされること

> Software agents automatically pull the desired state declarations from the source.

ソフトウェア・エージェントは、自動的にソースから目標状態の宣言をプルする。


## 4. Continuously Reconciled 継続的に調整されること

> Software agents continuously observe actual system state and attempt to apply the desired state.

ソフトウエア・エージェントは、実際のシステムの状態を継続的に観察し、目標状態を適用しようとする。

<!--

Akuity

Argo

AWS CodePipeline

Azure Pipelines

Bamboo

Brigade

Buildkite

Bunnyshell

Cartographer

CircleCI

Cloudbees Codeship

Codefresh

Concourse

D2iQ Dispatch

DolphinScheduler

Drone

Flagger

Flux

GitHub Actions

GitLab

Google Cloud Build

Harness.io

Jenkins

JenkinsX

Keptn

Octopus Deploy

OpenGitOps

OpenKruise

Ortelius

Spacelift

Spinnaker

TeamCity

Tekton Pipelines

Travis CI

Woodpecker CI

XL Deploy
-->
独学に悩む駆け出しに向けて5つの考え方を書いてみた


### 独学が辛くなった時に

読んでみると元気が出る（かもしれない）私の考え方を共有します。

私自身も駆け出しですが、今年は既に約400時間仕事とは別で独学することができました。

プログラムを嫌いになりそうになってしまったら読んでみてください。


「私は辛い時にこんなふうに考えている！」という情報があれば是非コメントに書いてください！

共感が多いコメントや、私が共感したコメントは記事の中で紹介させていただきます。

* * *

#### 1年間で勉強できる時間はせいぜい1000時間

あなたが毎日3時間勉強するとします。

1年は365日なので1095時間勉強することができます。

ここで自分が学ぼうとしているものを振り返ってみましょう。

Java、JavaScript、Ruby、Rust、C、DNS、ネットワークルーティング、AWS、GCP、HTTP、TCP/IP、BGP・・・。

1095時間で足りそうですか？

1095時間に収まらない「学びたい事」で悩んじゃってませんか？

だとしたら1度整理して手放して楽になりましょう。

1095時間で足りないのはあなたのせいではないのです。

**20冊以上の積ん読本に囲まれながら・・・NMR**

* * *

#### できないはつまらない、だからできることをやるのが大事

できないこと、理解できないことをやり続けることはできません。

無理に続けるとどんどんプログラムだけでなくできない自分が嫌いになってしまいます。

そんな時はそっと（本を読んでいるなら）ページを閉じて、同じジャンルの別の本を買ってみたり、別のUdemyの講座を覗いてみたり、いっそのこと別の概念を勉強し始めましょう。

できないから諦めるのではなく、できるようになるまで置いておくだけ。

だからAmazonで星5の書籍や最高評価のUdemyの講座が理解できない自分を責めるのはもうやめましょう。
最初は読めなくてもいつか読めるようになる名著があるのです。

**Java Bronzeの内容すら理解できなくてITパスポートの勉強を始めた頃を思い出しながら・・・NMR**

* * *

#### 成長を実感できなくなったら資格の勉強を始めよう

夢のITエンジニアになった！

だけど全然コードを書かせてもらえない。そんな時もあります。

負けじと自宅学習を始め色々な物に手を出して100時間くらい経つとふと思います。

「これって本当に意味あるのかな？」

「ちゃんと身についてるのか不安だな」

そう思ったら学んだことに関連する資格を取りましょう。

学んだ概念をしっかり理解できていれば資格が取れます。

勉強した結果資格が取れたならそれは間違いなく成長です。

**Pythonチュートリアルをやりながら考えたこと・・・NMR**

* * *

#### 〇〇なんて意味ないという考えからの卒業

ちょっとだけ遠回りをする自分を肯定しよう。

最短距離でプログラムやコンピュータの概念を学べたら、それは幸せだろうけど、大抵はそんなにうまくいかないものです。

ずっと遠回りをするのは効率が悪いけれども、学び始めの時期にちょっとの間効率が悪いのを気にして嫌な気持ちになる必要はないのです。

仮に意味がないと感じたとしても、意味がないことが実感できるレベルで分かったことに価値があると思いますよ。

**シェルでう○ちの絵文字のピラミッドのスクリプトを考えながら・・・NMR**

* * *

#### できないから才能がないではない

イタリアンのシェフが18歳のから働いていると言っていた。

1日に50食カルボナーラを作るとする。そして年間200日働くとする。

そうなると年間10000食のカルボナーラをそのシェフは作っていることになる。

今そのシェフは48歳だから、きっと300000食は今まで作っただろう。

ここでいうカルボナーラは私たちでいうプログラムにあたる。

さて、私たちは何個のプログラムを書いて「才能がない」と嘆いているか数えてみよう。

才能がないと考えるのはちょっと早いかもしれない。

**すぐに諦めたくなる自分を自省しつつ・・・NMR**

* * *

さあ、元気が出たらみんなもたくさん勉強してつよつよになろう！！
Pythonチュートリアルで学ぶ：文字列

Pythonの基礎的な勉強をしています。
文字列操作について学んだことを備忘録代わりに書きます。

「\」(バックスラッシュ)でエスケープ処理ができます。

```
strPrint = '"Isn\'t," they said.'

print(strPrint)
```
実行結果はこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/7b8e7125-bc70-b764-a173-54af396c594c.png)

また、「\n」で改行ができます。

```
s = 'One \nTwo'
print(s)
```
実行結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/cc159fdd-0c35-dcbc-3df1-8e540696f1e1.png)

最後に、文字列の前に「r」をつけると「\n」が文字列とみなされます。

```
print('D:\python\namefile')

print(r'D:\python\namefile')
```
実行結果は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/552967b5-ff9a-42ce-db05-3891af916506.png)
MacOS最初に設定しておきたい設定メモ

# MacOSで最初に設定しておきたい設定
大学入学時に購入して何もわからず環境構築したMacBook Pro。
何かがおかしいと気づきつつ無理矢理使ってきましたが本当に限界を感じたので一旦出荷状態まで戻して全てを最初からやり直します。
**この記事では個人的に好きな設定に初期設定していきたいと思います。**
一連の投稿のハブになる記事は[こちら](https://qiita.com/TakayoshiK/items/ae53424b788c8fcb645b)

## 環境
MacBook Pro (13-inch, 2018)
macOS　Monterey Version 12.5
メモリ intel Core i5
zsh 5.8.1 (x86_64-apple-darwin21.0)
27インチ4Kディスプレイ(DELL P2721Q)

## 前提知識(何も知らない人向け)

システム環境設定：歯車みたいなマークのアプリ。
困った時はComand+spaceで検索してください。

## トラックパッド感度の調整
まず最初に気になるのがトラックパッドの感度。
デフォルト設定だと遅すぎてお話にならないので最大まで上げます。
最初は動きすぎなように感じますがすぐ慣れます。

`システム環境設定>トラックパッド>ポイントとクリック`と進み軌跡の速さを**速い**に変更
ついでに`クッリク`を弱いに設定
![スクリーンショット 2022-07-30 23.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756391/ced4dede-d731-fe83-9127-df00810b1ebe.png)

## Finder環境設定
よく使うfinderの環境設定をいじります。
とりあえずこの4点をいじります。

- 表示する項目の設定
- 最初に開くディレクトリを設定
- rootディレクトリの表示
- 表示項目
- 拡張子の表示
- 拡張子変更時の警告を無くす
- ゴミ箱の中身の自動消去
- 検索範囲の指定

まずは環境設定を開きましょう。
Finderを開いて`ディスプレイ左上のFinder>環境設定`と進みます。
次にタブごとに設定を書いていきましょう。
それぞれそのままなので詳しい説明は省略します。

**一般**
`ディスクトップに表示する項目`を任意に選びます
`新規Finderウィンドウで次を表示`をuserディレクトリに設定します。

**サイドバー**
その名の通りサイドバーに表示する項目を選ぶことができます。

**詳細**
`すべてのファイル各拡張子を表示`にチェックを付けます。
`拡張子を変更する前に警告を表示`のチェックを外します。
`30日後にゴミ箱から項目を削除`にチェックを入れます。
`検索実行時`のプルダウンを`現在のフォルダ内を検索`に変更。

## メニューバーの設定
右上にあるメニューバーに表示する項目を変更します。
今回追加する項目はサウンドとbluetooth、バッテリー、時計の秒数です。(何個か入らなそうなの消したけど何を消したかわかりません。もうそこにはいないので)

`システム環境設定>Dockとメニューバー>サウンド`と移動してメニューバーに表示をチェック、プルダウンを**常に**に変更。
![スクリーンショット 2022-07-30 23.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756391/cab7d7a6-0902-0b4a-7473-850401553377.png)
同様にして`システム環境設定>Dockとメニューバー>bluetooth`、`システム環境設定>Dockとメニューバー>バッテリー`からそれぞれ表示に切り替える。
ついでにバッテリーは割合をみれた方が便利なので`割合（%）を表示`にもチェックを入れます。
時計の秒数は`システム環境設定>Dockとメニューバー>時計`から`秒を表示`にチェックを入れます。
最後にメニューバーを見ながら自分が使わなそうなやつを消します。
私の場合は最終的にこんな感じになりました。
![スクリーンショット 2022-07-31 0.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756391/06a88219-9237-c238-c0c6-adfbbd2b0765.png)

## ディスプレイの表示サイズの変更
`システム環境設定>ディスプレイ`と進んで解像度をサイズを調整にチェック。任意の解像度を選択。個人的には左から2番目くらいがちょうどよかった。

## Dockの項目
アプリ開いてアイコンを右クリックして`オプション>Dockに追加`から追加可能。同様の方法で消去可能。
(なんかもっといい方法ありそうだけど頻繁にやる作業でも無いので探索してない)

## 画面分割アプリのインストール
これはおすすめアプリに入れるか迷ったが個人的に必須な環境なので初期設定の方に入れ込みます。
個人的なおすすめは[Magnet](https://apps.apple.com/jp/app/magnet-%E3%83%9E%E3%82%B0%E3%83%8D%E3%83%83%E3%83%88/id441258766?mt=12)。
アプリをAppStoreからダウンドード(有料)して指示に従ってセットアップ

## スクリーンショットの保存先指定
スクリーンショットがデフォルトだとデスクトップに保存されるのでとても煩わしいです。
そこでscreenshotsというフォルダを作ってその中に入れるように変更します。
まず、任意の場所にscreenshotsというフォルダを作成しましょう。
次に`command+Shift+5`でスクリーンショットの画面を開き`オプション>保存先>その他`を選択して先ほど作成したscreenshotsフォルダを選択しましょう。

## 終わりに
とりあえず最初にやった初期設定を書き出しました。
他にいい設定があれば教えてください。