OmniAICreator/Qiita-1.07M huggingface dataset:
railsのマイグレーションでスキーマを作る

# 目標
railsのマイグレーションでスキームを作れるようになる。

# マイグレーションのファイルの位置
マイグレーションはdb/migrateディレクトリに保存されます。1つのマイグレーションファイルが1つのマイグレーションクラスに対応します。

# マイグレーションの名前の形式
マイグレーションファイル名は```YYYYMMDDHHMMSS_create_products.rb```のような形式になります。
ファイル名の日時はマイグレーションを識別するUTCタイムスタンプであり、アンダースコアに続いてマイグレーション名が記述されます。
## マイグレーションのファイルの名前とファイル名の後半は一致する必要がある
```マイグレーションのクラス名（CamelCase）```は、```ファイル名の後半（snake_case）```と一致する必要があります。たとえば、
20080906120000_```create_products```.rbでは```CreateProducts```というクラスを定義し、20080906120001_```add_details_to_products```.rbでは```AddDetailsToProducts```というクラスを定義する必要があります。

## 実行順の注意（まだ理解していない。）
Railsはマイグレーションの実行順序をファイル名のタイムスタンプで決定するので、マイグレーションを他のアプリケーションからコピーする場合や、```自分でマイグレーションを生成する場合は、実行順に注意する必要```があります。

タイムスタンプを算出する作業は退屈です。Active Recordにはタイムスタンプを自動生成するジェネレータが用意されています。

## 生成をするマイグレーションのコマンド
```
$ bin/rails generate migration AddPartNumberToProducts
```
### 実行結果
```rb
class AddPartNumberToProducts < ActiveRecord::Migration[7.0]
  def change
  end
end
```
### 　カラムやデータ型の設定を追加
マイグレーション名が"AddColumnToTable"や"RemoveColumnFromTable"で、かつ```その後ろにカラム名や型が続く形式```になっていれば、```適切なadd_column文やremove_column文を含むマイグレーション```が作成されます。

#### 気づき
追加するだけで```add_column```や```remove_column```の文が含まれているのか。

### カラムやデータ型の設定加えてコマンドを送る。
```
$ bin/rails generate migration AddPartNumberToProducts part_number:string
```
### 実行結果
```rb
class AddPartNumberToProducts < ActiveRecord::Migration[7.0]
  def change
    add_column :products, :part_number, :string
  end
end
```

### 削除をするマイグレーションを行う。
```
$ bin/rails generate migration RemovePartNumberFromProducts part_number:string
```
#### 気づき
```string型```の```part_number```カラムを削除するのか。

#### 実行結果
```rb
class RemovePartNumberFromProducts < ActiveRecord::Migration[7.0]
  def change
    remove_column :products, :part_number, :string
  end
end
```

### テーブルを生成する
マイグレーション名が```"CreateXXX"```のような形式で、その後にカラム名と型が続く場合、```XXXという名前のテーブルが作成```され、```指定の型のカラム名がその中に生成```されます。たとえば次のようになります。

```
$ bin/rails generate migration CreateProducts name:string part_number:string
```
#### 実行結果
```rb
class CreateProducts < ActiveRecord::Migration[7.0]
  def change
    create_table :products do |t|
      t.string :name
      t.string :part_number

      t.timestamps
    end
  end
end
```
# マイグレーションの編集
（勉強の際また今度）

# 感想
手を動かしてかそうかと思ったが、やるべきことを思い出しそれが終わってからやることにする。
失敗した。
計画的に勉強しなければ、急かしてしまった。
Terraform(DynamoDB作成)

### やってみたコード
```ruby:
resource "aws_dynamodb_table" "sequence-table" {
  name           = "sequence-table"
  billing_mode   = "PROVISIONED"
  read_capacity  = 20
  write_capacity = 20
  hash_key       = "tablename"

  attribute {
    name = "tablename"
    type = "S"
  }
  
  tags = {
    Name    = "${var.project}-${var.environment}-sequence-table"
    Project = var.project
    Env     = var.environment
    }
}

resource "aws_dynamodb_table_item" "sequence-table-item" {
  table_name = aws_dynamodb_table.sequence-table.name
  hash_key   = aws_dynamodb_table.sequence-table.hash_key

  item = <<ITEM
{
  "tablename": {"S": "user"},
  "seq": {"N": "0"}
}
ITEM
}
```
### 間違えたところ
DynamoDBをTerraformで作成するときには、「テーブル作成」「テーブル内で定義するアイテム」の2つがいる作りの
テーブルを作成する想定でした。
アイテムを作成する上で、「table_name」「hash_key」にテーブルの名前を入れていた
下記のような感じ(間違った書き方)
```ruby:
resource "aws_dynamodb_table_item" "sequence-table-item" {
  table_name = aws_dynamodb_table.sequence-table.sequence-table
  hash_key   = aws_dynamodb_table.sequence-table.sequence-table.hash_key

  item = <<ITEM
{
  "tablename": {"S": "user"},
  "seq": {"N": "0"}
}
ITEM
}
```

でも実際は一番上のコードの書き方が正しく、「name」「hash_key」だけでいい
これはTerraform内で判別してくれる。
下記コマンドを打つことで、指定されたアドレスに一致するファイル内のリソース属性を表示できます。
このときに、Terraform内で「table_name」「hash_key」には値が入っているので一番上のようなコードの書き方になります。
```
terraform state show [options] ADDRESS
```
【Docker】Alpine でデフォルト・シェルを Bash に【ユーザー追加とシェルの指定】

> Alpine ベースの Docker イメージは、デフォルトのシェルが `ash` なので、`apk add --no-cache bash` で `bash` をインストールしたものの、**デフォルトを `bash` にしたい**。

インストールしたライブラリが `bash` を前提にしているため、Alpine にユーザーを追加し、デフォルトのシェルを `bash` にしたいのですが、毎回ググっているので、自分のググラビリティとして。

## TL; DR <sub><sup>（今北産業）</sup></sub>

```dockerfile:Dockerfile
FROM alpine

# Install bash
RUN apk add --no-cache bash

# For non-interactive execution, use the system-wide bash profile.
ENV BASH_ENV="/etc/profile"

# Create a user and group for the application to avoid: Dockle CIS-DI-0001
RUN \
    addgroup -S mygroup && \
    adduser -g "myuser" -s /bin/bash -D -S myuser -G mygroup

# change default shell from ash to bash for other users
#RUN sed -i -e "s/bin\/ash/bin\/bash/" /etc/passwd

USER myuser

# Use bash by default
ENTRYPOINT ["/bin/bash"]
```

なお、[公式](https://wiki.alpinelinux.org/wiki/Change_default_shell)には [/etc/login.defs](https://linuxjm.osdn.jp/html/shadow/man5/login.defs.5.html) や [/etc/default/useradd](https://pkgs.alpinelinux.org/contents?file=useradd&path=&name=&branch=v3.6&arch=x86_64) の作成が記載されていますが、これはユーザー切り替えや [Shadow パスワード](https://ja.wikipedia.org/wiki/Passwd)を使う場合などに必要なものです。しかし、それらは通常の OS 利用、つまり複数ユーザーがログインして作業したりといった場合に必要なものです。

そもそも Docker は「コンテナを起動したらユーザーの切り替えはしない」ものなので、ここでは作成しません。それらが必要な場合は、素直に仮想マシンで Alpine Linux を動かした方が良いと思います。

また、`RUN` <ruby>ディレクティブ<rt>指示子</rt></ruby>で `bash` を明示的に使いたい場合は、スクリプト実行前に `/bin/bash` を指定する。特に、**`bash` を前提としているのに、[shebang](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_(Unix)) が `#!/bin/sh` になっているスクリプトで有効**です。

```dockerfile
COPY myScript.sh /tmp/myScript.sh

RUN /bin/bash /tmp/myScript.sh
```

## 所感

「なーんか、動かないな」と、しばらく葛藤したもののスクリプトを覗いてみたら、`#!/bin/sh` になっているのに `function` を使って関数定義しているなど、`bash` を前提としたスクリプトなのでした。とほほほ。

## 参考文献

- [Change default shell](https://wiki.alpinelinux.org/wiki/Change_default_shell) | Wiki @ alpinelinux.org
- [How to add users to Docker container?](https://stackoverflow.com/questions/27701930/how-to-add-users-to-docker-container) @ StackOverflow
- [How to determine the current interactive shell that I'm in (command-line)](https://stackoverflow.com/questions/3327013/how-to-determine-the-current-interactive-shell-that-im-in-command-line) @ StackOverflow
- [How to install bash shell in Alpine Linux](https://www.cyberciti.biz/faq/alpine-linux-install-bash-using-apk-command/) @ cyberciti.biz
- [bash の初期化ファイル .profile, .bashrc, .bash_profile の使い分けと管理方針](https://blog1.mammb.com/entry/2019/12/01/090000) @ はてなブログ
logをshellで解析したら人生観が変わった


logの出力がちょっと厄介だったのでシェル芸で何とかしてみた。
text形式で吐き出せるものlogすべてに応用は効くと思います。

# 目次
1.使いどころ
2.準備
3.解析に使うコマンド
4.シェルを使うメリット


# 使いどころ
「何かトラブルが起きたようです！ログを解析してください！」
network engineerの皆さんならこんなオンコールがよく飛んでくるでしょう。

筐体からlogを出力して~、Windowsのclientに落として~、Excelやスプレットで~…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956141/2b596e62-953d-44de-c1f7-91715c29c5e4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956141/00b85e2d-db4e-e905-3177-1001b9b3c7af.png)
frieze… 
ひどいときはメモ帳でもfriezeしちゃいますよね

不要なログを削ってどうにか開くようになった～…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956141/4ca5771a-75eb-2adb-67d1-31cdf0953f08.png)
改行…、連続するスペース…、紛れ込む「"」

固まるピボットやフィルタ

network engineerだからアプリとかbuildしないから低スぺでいいよね！
ざこざこPCを支給されている…

いやになっちゃいますよね…
# まずは準備
まずはUNIXの環境にログデータを放りこみます。
僕はWindows10のWSLで「Ubuntu 20.04.5 LTS」を動かしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956141/dac70128-334a-a626-7e1f-b2441d6891b3.png)
```
cat 20221101.log |sed -e 's/"/ /g' | sed -e 's/ \+/ /g'  | awk -F'[ ]' ' {print  $0 }'
```
sed:文字列を全置換したり、削除したりしてくれる　
```
#「"」を消す
sed -e 's/"/ /g'

#連続した空白を消す
sed -e 's/ \+/ /g'
```
awk:読み込んだデータを配列に格納して整理してくれる
```
#「 」を区切りにして配列に格納する $0はすべて出力
awk -F'[ ]' ' {print  $0 }'
```

データの読み込み完了、データが配列に格納された状態になったで解析フェーズへ
# 解析フェーズ
配列に格納されたデータを検索
```
#配列 $19に格納されいるデータで「」に一致したものをすべて出力
cat 20221101.log |sed -e 's/"/ /g' | sed -e 's/ \+/ /g'  | | awk -F'[ ]' ' {if ($19 == "dstip=1.1.1.1" ){print  $0 }}'

#結果をソートして集計
cat 20221101.log |sed -e 's/"/ /g' | sed -e 's/ \+/ /g'  |  awk -F'[ ]' ' {print $1" "$3" "$7" "$8 }' | sort | uniq -c　
```
こんな感じでawkのifでフィルタを作るイメージでデータ集計をしています。
正規表現をもっといい感じでやるとシュッとしたシェルになると思いますが、まずは動いて結果がでればいいのです。

# シェルを使うメリット
1.Windosのアプリに比べて大きなデータを高速に処理できる
かなり大きめのデータの検索と調査も安定して行うことができる
10GBを越えるお化けみたいなログファイルもさくさくノーストレスで解析できる。

2.Unixコマンドを絡めて使えるので、自由度は無限大
今回利用したコマンドはunixで使ったコマンドのほんの一部、たくさんのコマンドがあります。
Excelのフィルタやピボットに比べて詳細に解析が可能です。

3.ある程度のスペックPCでも安定動く
Intel(R) i5-8265U,メモリ8Gとちょっと頼りないスペック
Windowsの他に、Ubuntuも立ち上がっている状態ではありますが
friezeなどは起きない

# あとがき
今回はnetwork engineerがunixでログ解析してみました。

fortigateならfortianalyzer買えよという声が聞こえてきそうですが…

緊急度が高いときはありもので何とかしないといけないことが多し、network以外にも調べないといけない。

自分のスキルでやりたいことができると大きな武器になると思います。

# 環境
Fortigate 200E 
Windows10 
Ubuntu 20.04.5 LTS

# 参考文献
[「1日1問、半年以内に習得　シェル・ワンライナー160本ノック」を読んでみて解析スピードが段違いに!?](https://honto.jp/ebook/pd_31241649.html)

WSLのやり方については別途解説しようかな…？
#
Goの環境構築

## 前提
M1 Macbook

この記事で示す手法は2通りです。
HomeBrewを用いた環境構築
Dockerを用いた環境構築

HomeBrewもしくはDockerの環境構築が済んでいることを前提とします。
参考記事が山のようにあると思うので検索してみたください

## Home Brew
`brew i go`
以上です。

`Goenv`の利用や`GOPATH`の設定は必要ないです。
`Go`は後方互換性が確保されているので、Versionはガンガン上げて良いです。
`GOPATH`に関して昔はいろいろやる必要があったみたいですが、現在（`go  1.19`）では必要無くなったらしい
シンプルで良いですね。むしろシンプルすぎ。

*余談ですが、Goの実行は下記コマンドです*
`go run main.go`

## Docker
`docker-compose.yml`を使います。 
`Dockerfile`だけを使う方法もありますが、`servise`が1つでも`yml`使った方が色々便利ですよね。

*構成は下記*
```
backend
    - Dockerfile
    - main.go
docker-compose.yml
```

*Dockerfile*
```Dockerfile
# ベースイメージをDockerHubを見て決める alpineがお気に入り軽くて良い
FROM golang:1.19.3-alpine

# alpineはapkを使う goはgitが必要なので入れておく
RUN apk updata && apk add git

# 作業ディレクトリを作成 & 設定 (execの実行場所)
WORKDIR /app

# Build時に既存のコードをコピーする
COPY ./backend /app
```

*docker-compose.yml*
```yml
version: "3"
services:
  web:
    build:
      context: ./backend
      dockerfile: ./backend/Dockerfile
    container_name: "web"
    tty: true
    volumes:
      - ./backend:/app
```

*main.go*
```go
package main

import "fmt"

func main() {
    fmt.Println("コンテナ起動してるよ!!")
}
```

ファイルが準備できたら下記でコンテナを立ち上げましょう。
1. `docker compose build`
2. `docker compose up -d`

この時点でコンテナが立ち上がったので`main.go`を実行してみましょう
`docker compose exec web go run main.go`


## APIサーバーを作る時は？？
*Dockerfile*の最後に `CMD ["go", "run", "main.go"]`を加えてください。
*yml*にポートを指定してください
*コンテナ立ち上げ時に`-d`* オプションをつけないでください

## 終わりに
最近Goに興味があってちょっと触ってみたんですが、自分は結構気に入りました。
なんと言ってもシンプルですね。 API開発時もFWやライブラリありきで開発する言語がある中Goはそんなこともないですし
勉強していたら総合的な力が上がっていきそう

**Dockerに関して**
`WORDKR`の前に `RUN mkdir /app`をしていませんが、なかったら自動で作成してくれるので必要ないです。
`context`ってなんだろ？と悩んだ時に下記記事が解決してくれました。 ありがとうございます。

https://qiita.com/sam8helloworld/items/e7fffa9afc82aea68a7a
仮面ライダーWが好きで現場で話題にしたいから、ふりかえりに活用してみる

# 目的
タイトルの通りなんだけど風都探偵の話をする人が職場に欲しいな。・・・と
アニメもあるし、元は特撮だし、漫画もあるし、小説感もあるよね。オールジャンルいけるよね。


# いろいろ雑談で発信はしてみたのよ
とりあえず、チェックインをしつつ、ゆるーく雑談をするタイミイングでさ。
テーマに「好きなアニメ」とか「好きなテレビ」とかを挙げてさ。
ジュウレンジャーとか、ゴーゴーファイブとか、仮面ライダークウガの話とか・・・。

刺さらなかったなぁ。
世代が違うもんなぁ。
でも、風都探偵とかなら、今連載してるし。
そこからWをみてもらえれば。。。。。。って思ってた時期が自分にもありました。

刺さらなかったなぁ。
マンガの話はBLEACHとかNARUTOは盛り上がってたなぁ。
途中から入っていけなくなったけれどもさ・・。
ま、それはそれでいいんだ、みんな楽しそうだったし。

・・・いや、本編いく前置きが長すぎるな。。

# さて、じゃあ。ふりかえりに(無理やり)組み込んでやるぜ

と、言っても基本的には、この辺ができればokだと思っているので
- チームの状況・状態がわかる
- 次のアクションがチームで検討できる

ここを軸にするとして。
やっぱり、次のアクションの話をするときには、エクストリームが良いかな。
メモリの特性とかで何か考えてみる？、できれば決め台詞をどっかで使いたいなぁ。

とすると、使いたい要素は、この辺かな。
- サイクロン
- ジョーカー
- エクストリーム
- さぁ、お前の罪を数えろ!
- 検索を始めよう

お前の罪を数えろ!が難しいな。でもまぁ、基本KPTに当てはめれば、いける気がするな
(いや、普通にKPTやれば。って言われそうだ。違うんだ。このセリフとかメモリとかを
タイトルにすることが目的なんだ。)

# KPT風にしてみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870907/63af1d66-e233-e639-f0b9-75af7972ee51.png)

- サイクロン
    - Y(やったこと)やL(学んだこと)を混ぜた感じ。Keepっぽさは、あんまりなかったな。
- ジョーカー
    - 罪って、なんか重たくなりそうだから。できなかった。って言葉を避けてしまった。
    - チームでも、あるいはチーム外の人でも、一緒に活動できるチャンスを考えられるようにしてみた。
    - ・・・ぶっちゃけ、ジョーカー感はあんまりないけど、仲間を増やしていこう。ってイメージが翔太郎っぽいかなぁって
- エクストリーム
    - ほぼTryのままのはず。
    - でも、本編的には究極、いや、進化してる様子が漫画では見れ、(・・おっと、ネタバレは避けておこう。)

# まとめ
こういうのを考えるのも楽しくて好きです。
個人的には、どんなフレームでやっても、ふりかえりってこんな感じなら良いのかな。って思ってます。
> どの手法をやるにしても、「楽しむ」というマインドがとても大事です。楽しみ、前向きに、対話する。
(引用元 : https://qiita.com/viva_tweet_x/items/bab769c190508c4808be)
【エラー解決方法】...is not in the sudoers file. This incident will be reported.

# 概要
環境構築中のサーバー(Ubuntu)で新しく作ったユーザーでsudoコマンドを使用したら怒られました、、。

### エラー内容
```
daichi@160-251-98-255:/$ sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +%Y%m%d-%H%M%S`
daichi is not in the sudoers file.  This incident will be reported.
```

# 解決方法
### 解決手順
1.ログアウト
``` 
daichi@160-251-xx-xxx::/$ logout
```
2.ルートユーザーでログインし直す
```
160-251-xx-xxx login: root
Password:
```
3./etc/sudoers ファイルにユーザーdaichiを追加
```
root@160-251-xx-xxx:~# usermod -G sudo daichi
```
4.確認
```
root@160-251-xx-xxx:~# cat /etc/group | grep daichi
sudo:x:27:daichi
daichi:x:1000:
```
5.再度ユーザーdaichiでログインし直し、sudoコマンド実行
```
daichi@160-251-xx-xxx:~$ sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +%Y%m%d-%H%M%S`
```
完了

### 参考記事
https://webkaru.net/linux/sudo-user-add/
マイコンのプログラミングの勉強方法

# Armマイコンのプログラミングの勉強方法
私が考える最良の勉強方法を説明します。

1. C言語でのプログラミングを経験する
逆説的だが、下地としてC言語の理解が必要。0からC言語を理解することはそれほど難しくないが0からマイコンの仕組みを理解することはだいぶ難しい。
下記の「プログラムはなぜ動くのか」の内容を理解するために必要。

1. 課題（from 会社or学校)の受領
自分で課題を設定するより、他から与えられたものを消化する方が楽。
必要に迫られていない状態で勉強を継続するのは難しい。
1. 「プログラムはなぜ動くのか」を読む
下記の「ARMマイコンCortex-M教科書」に出てくる用語を理解するために必要。
1. 「ARMマイコンCortex-M教科書」を読む
ここまで来ればデータシート（マイコンの仕様書）に書かれている内容を理解できるようになる。

https://www.amazon.co.jp/プログラムはなぜ動くのか-第3版-知っておきたいプログラミングの基礎知識-矢沢-久雄/dp/4296000195/ref=sr_1_1?crid=1IWE4U4KSMIJE&keywords=プログラムはなぜ動くのか&qid=1667699432&qu=eyJxc2MiOiIyLjU2IiwicXNhIjoiMS45MyIsInFzcCI6IjEuNzMifQ%3D%3D&sprefix=プログラム%2Caps%2C161&sr=8-1

https://www.amazon.co.jp/ARMマイコンCortex-M教科書-ARM教科書-桑野-雅彦-共著/dp/4789859916/ref=sr_1_1?__mk_ja_JP=カタカナ&crid=3V14PULAGQQOY&keywords=Armマイコン&qid=1667700694&qu=eyJxc2MiOiI0LjI4IiwicXNhIjoiMy4zOSIsInFzcCI6IjMuMDkifQ%3D%3D&sprefix=armマイコン%2Caps%2C161&sr=8-1
拡張ドメインを有効にした時の不具合


+ [拡張ドメインに変更するとAPI call 400になる](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000IRkUe)
+ [サンドボックスの1つで新しい拡張ドメインを有効にしましたが、SSOが機能していません。](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000IS3ku)
+ [URL の変更の強化 - URL が変更されていない場合の SSO の影響](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JeEoR)
 拡張ドメインを有効にしても、本番環境では私のドメインのログイン URLは変更されません。Experience Cloud サイトの URL など、その他の URL が変更されます。

# トレイルヘッドのPostmanに影響している？

トレイルヘッドのURLが違うと思う。
```
https://MyDomainName.my.salesforce.com/services/Soap/c/49.0/
```

+ [I put everything on right place , no spaces , correct username/ password+securityToken Its not working !/I tried using POSTMAN to authenticate Salesforce with https://login.salesforce.com/Services/Soap/c/49.0](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000KftNi)

**Availability and Enforcement**  
Enhanced domains are available in all orgs. All qualifying orgs created in Summer ’22 or later get enhanced domains by default.

Enhanced domains were required for sandboxes and non-production orgs in Winter ’23 unless you enabled an org-level setting that postponed their enforcement until Spring ’23. Non-production orgs include demo orgs, Developer Edition orgs, free orgs, patch orgs, Trailhead Playgrounds, and trial orgs. Enhanced domains are also enabled by default in new, refreshed, and cloned sandboxes. To disable that behavior, see Enable Enhanced Domains in New and Refreshed Sandboxes.

**可用性と施行**
拡張ドメインはすべての組織で利用できます。Summer '22 以降で作成されたすべての適格な組織は、デフォルトで拡張ドメインを取得します。

Spring '23 まで適用を延期する組織レベルの設定を有効にした場合を除き、Winter '23 の Sandbox および非本番組織には拡張ドメインが必要でした。非本番組織には、デモ組織、Developer Edition 組織、無料組織、パッチ組織、Trailhead Playgrounds、トライアル組織が含まれます。拡張ドメインは、新規、更新、および複製されたサンドボックスでもデフォルトで有効になっています。この動作を無効にするには、「新しいサンドボックスおよび更新されたサンドボックスで拡張ドメインを有効にする」を参照してください。

[Considerations for Enhanced Domains](https://help.salesforce.com/s/articleView?id=sf.domain_name_enhanced_considerations.htm&type=5)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/77882a9e-2d94-7552-902d-2211a31319fb.png)

**類似の質問**

+ [Postman: Cloud Agent Error: Couldn't resolve host. Make sure the domain is publicly accessible or select a different agent.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Kh2HYSAZ)
AWSにおけるセキュリティ、コスト、インシデント対応の際に見るべきもののまとめ

# はじめに
AWSで、ログやセキュリティ関連のサービスがいっぱいあって、いざというときに何を見たら良いのか？
普段は何を見たら良いのか迷うという声があったので、まとめておこうと思います。
今回ご紹介するサービスは、Trusted Advisor、GuardDuty、Detective、CostExplorer、CloudTrail、Config、SecurityHub、IAM Access Analyzer、Macieです。

# 各種サービスと確認タイミング
| No | サービス | 概要 | 　確認するタイミング　 | 　備考　 |
| :---: | :---: | :--- | :--- | :--- |
| 1 | Trusted Advisor | コスト、パフォーマンス、セキュリティ、耐障害性、サービスクォータに関して分析を行い、ベストプラクティスに基づいて推奨事項を提案するサービス。 | 定常的に見ることがおすすめ | https://aws.amazon.com/jp/premiumsupport/technology/trusted-advisor/ |
| 2 | GuardDuty | AWS アカウント、インスタンス、コンテナワークロード、ユーザー、ストレージを継続的にモニタリングし、潜在的な脅威を検出することが可能。最近ではEC2のマルウェア検知も可能に。 | 通知を設定しておき検知したタイミングで確認する。 | https://aws.amazon.com/jp/guardduty/ |
| 3 | Detective | セキュリティイベントに対してドリルダウンして調査、分析することが可能。 | 何らかのセキュリティイベントが発生したタイミングで利用する。 | https://aws.amazon.com/jp/detective/ |
| 4 | CostExplorer | AWSの利用料を確認可能。CostAnomalyDetectionを設定しておくことがおすすめ。Budgetとともに利用すると良い。 | 定常的にみることがおすすめ | https://aws.amazon.com/jp/aws-cost-management/aws-cost-explorer/ |
| 5 | CloudTrail | AWS上での操作ログを確認可能。 | インシデント発生時等調査を行う際、もしくは監査目的で利用することがおすすめ | https://aws.amazon.com/jp/cloudtrail/ |
| 6 | Config | リソースの変更履歴をタイムラインで確認可能。また、ルールを設定し、ルールから逸脱した設定がないか確認も可能。 | インシデント発生時等調査を行う際、ルール違反があった場合に確認することがおすすめ | https://aws.amazon.com/jp/config/ |
| ７ | SecurityHuｂ | ベストプラクティスのチェックならびにセキュリティアラートの集約が可能。 | 定常的ならびにインシデント発生時に確認をすることがおすすめ | https://aws.amazon.com/jp/security-hub/ |
| 8 | IAM Access Analyzer | リソースのポリシーをチェックし、意図せぬ公開設定がされていないかなどを確認可能。 | 定常的に見ることをおすすめ | https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/what-is-access-analyzer.html |
| ９ | Macie | S3に保存されている機密データの検知を行うサービス。対象のバケットが公開されていないかなどのチェックを行うことが可能。 | 定常的に見ることをおすすめ | https://aws.amazon.com/jp/macie/ |

# まとめ
基本的に上記を有効化することをおすすめします。基本必須のサービスかなと思います。
上記サービスを設定可能なテンプレートもAWSから公開されていますので、以下を利用してみてもよいかと思います。
次回、上記サービスをどのようなフローで確認するか書いて見たいと思います。

https://aws.amazon.com/jp/blogs/news/announcing-baseline-environment-on-aws/
VSCODEを使ってFlaskを使えるように環境を作った方が確実

先日GitHubで公開したプログラムに、GUIを付けようとWeb開発環境を作っていました。
virtualboxにインストールしているUbuntu22.04を使って、python開発環境を作りました。

既にUbuntuにpython3が、インストールされている状態です。
その後、Jupiternotebookをインストールしていました。
でも、ネットで見つけた記事のように、インストールができた確認ができずネット検索を続けていました。
その様子をまとめていますので、こちらの記事も併せて読んで頂けましたら幸いです。

https://zenn.dev/masaru21/articles/285ff4c3e0d123

今回は、下記の記事を見つけました。
この記事に従って、勉強しました。

https://atmarkit.itmedia.co.jp/ait/articles/1807/24/news024.html

そして、この画像のように、同じ内容を実行できました。
![スクリーンショット_20221106_102826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/077cfa61-979f-36b1-d3ff-234bb54db152.png)

## VOCOEを使うとパスが通る
今回知ったことは、VSCCODEでpythonの開発環境を作ると、パスが通るので安心だということです。
今回は、仮想環境を作った後に、VSCODEで仮想環境のフォルダを開いて設定しました。
VSCODEのコマンドパレットで、Python:create terminalを選択すると、パスを通してターミナルを開くことができることを知りました。

仮想環境のフォルダにJupiternotebookが無いのでインストールしますか？とVSCDEが聞いてきたので、便利だと思いました。
この事から、仮想環境を作ってから、Jupiternotebookをインストールした方が良いと分かりました。
Flaskについても、仮想環境を作ってからインストールした方が良いと思います。
Salesforce初期設定03～カスタムアプリケーションの作成～


今回の内容は動画でも解説しています

https://www.youtube.com/watch?v=hQXG8PXktvw

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

標準アプリケーションを一通り非公開にしたらカスタムアプリケーションを作成しましょう

アプリケーションを作成すればブランド画像やブランドの色を決められますので会社独自のSalesforceの設定の感じがでてきますね

今回はカスタムアプリケーションの作成の方法をご紹介します

設定方法はアプリケーションマネージャーから新規Lightninng
アプリケーションのボタンをクリックします


こちらで
・どのような画像を表示するか
・どのタブを表示しますか
・どのプロファイルに表示するか

の設定を決めれば設定完了です
Typoraで画像アップロードの設定をする


# 1. はじめに

* Markdown専用テキストエディタ「Typora」の画像アップロード設定をしたい
* Typoraで書いた内容をQiitaへそのままコピー＆ペーストしたい
  （通常画像はローカルに保存されるためリンク切れになってしまうため）
  
  

# 2. 開発環境

* Typora
* Windows10



# 3. Typoraの設定

* 「ファイル」 > 「設定」を開く
  ![image-20221106101808425](https://s2.loli.net/2022/11/06/Lt3qDRyV6EIo42w.png)

* 「画像」タブの設定を変更する

  * When Insertを「Upload image」を選択する
  * Image Upload SettingのImage Uploaderに「PicGo-core (command line)」を選択する
  * 「Download or Upgrade」ボタンをクリックして完了

  ![image-20221106101927532](https://s2.loli.net/2022/11/06/HRhSkgNvpfP4xJQ.png)



# 4.  画像アップロード先の設定

# 4.1. SM.MSに会員登録をする

* 画像アップロードサービス「SM.MS」を使用する
* https://sm.ms/ より会員登録(Sign Up)をする
  ![image-20221106102936573](https://s2.loli.net/2022/11/06/NIZPrci1SkxEsOM.png)



# 4.2. APIトークンを発行する

* ログインして、ダッシュボードよりAPIトークンを発行する
  ![image-20221106103317704](https://s2.loli.net/2022/11/06/RPzqLwD4vHn1fZ3.png)



# 5. 画像アップローダーの設定

# 5.1. NPM環境を準備する

* 「Node.js」をインストールする
* https://nodejs.org/ja/download/ よりダウンロードしてインストールする



# 5.2. 画像アップローダーを設定する

* コマンドプロンプトを管理者で開く

  * 管理者権限がないと途中でエラーが発生するため要注意

  ![image-20221106103926891](https://s2.loli.net/2022/11/06/GaYECoild8HxT1V.png)



* 以下、コマンドを実行する

  ```
  npm install picgo -g
  picgo install smms-user
  picgo set uploader smms-user
  ```

  ![image-20221106104450833](https://s2.loli.net/2022/11/06/qSZwPJjvIsLxGCV.png)

  ![image-20221106104549242](https://s2.loli.net/2022/11/06/JDdFRBmZzv8r5cw.png)

* AuthにAPIトークンを入力する

  

* 以下、コマンドを実行する

  ```
  picgo use uploader
  ```

* Use an Uploaderに「smms-user」を選択する

  ![image-20221106104639594](https://s2.loli.net/2022/11/06/omH5bERIJk9NrXW.png)

  

# 6. 動作確認

* Typoraに画像を張り付けると「Uploading」が表示され、外部サイトへ画像が保存さてることを確認

  ![image-20221106104822273](https://s2.loli.net/2022/11/06/63WxeyKQlEDzhkg.png)

  ![image-20221106104907258](https://s2.loli.net/2022/11/06/zMUib2h6xBXJfHs.png)

  # 7. 参考文献
https://0115765.com/archives/1916#outline__2
LaravelでWeb APIを開発するときの話

LaravelでWeb APIを開発する時ってどうしていますか？
routeをapi.phpに入れると…
api/ほげほげになりますよね
これってWeb API開発をする時ってメンドくさくなりますよね

`http://localhost/hogeservice/v1/fuge`

とバージョン(v1)以下にプロジェクトを差し込んで運用を考えるとapi.phpに入れると変になります

`http://localhost/hogeservice/v1/api/fuge`

になってします
これを対策にweb.phpに入れると解決しますが…

ダサいです。

ちゃんとapiなのでapi.phpに入れて開発したいのでその対策を考えてみます

# 開発環境
はじめに開発環境を確認します

```bash
$ php -v
PHP 8.1.11 (cli) (built: Sep 29 2022 20:02:53) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.11, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.11, Copyright (c), by Zend Technologies
$ composer -V
Composer version 2.4.2 2022-09-14 16:11:15
$ php artisan -V
Laravel Framework 9.38.0
```

# 変更箇所
変更箇所はシンプルです。

```app/Providers/RouteServiceProvider.php
$this->routes(function () {
    Route::middleware('api')
        ->prefix('api')
        ->group(base_path('routes/api.php'));
```
を

```app/Providers/RouteServiceProvider.php
Route::middleware('api')
    ->group(base_path('routes/api.php'));
```
と prefixを削ればOKです

これで
変更前が

```bash
$ curl http://localhost:8000/api/bird
"hello!"
```
だったものが

```bash
$ curl http://localhost:8000/api/bird
 
404エラー
 
$ curl http://localhost:8000/bird
"hello!"
```
と/apiなしでアクセスできます

# 終いに
今回はlaravelのweb api開発でapi.phpを使った方法を書いてみました。
web.phpに書いたらちょっと違うかななんて思ったので記事にしてみました
そうすると、web.phpとapi.php両方に書いたらどうなるのか？と思うでしょうが確認するとweb.phpが採用されました。なんででしょうねw

# メモ
動作検証用のプロジェクトの作成とかはこんな感じで

```bash
$ composer create-project laravel/laravel laravel-api-sample
 
$ php artisan create:controller BirdController
```

```php
class BirdController extends Controller
{
    public function index(){
        $message = 'hello!';
 
        return response()->json($message);
    }
    public function index2(){
        $message = 'hello!2';
 
        return response()->json($message);
    }
}
```
```routes/api.php
Route::get('/bird' , [BirdController::class,'index']);
```
動作検証用 : web.phpとapi.phpの優先順位調査
```routes/web.php
Route::get('/bird' , [BirdController::class,'index2']);
```
api.phpとweb.phpに同じpathを入れると

```bash
$ curl http://localhost:8000/bird
"hello!2"
```
web.phpが採用される
Azure サブスクリプションの「現在のコスト」を Azure CLI で取得できるかやってみた

## 背景と目的

クラウド時代のインフラ構築ってオンプレ時代には比べ物にならなくらい便利になりましたよね。作っては消してを何度も繰り返したり、REST API があるおかげで GUI をポチポチしなくても Azure CLI をはじめとする色んなツールで操作ミスのない構築ができるのは嬉しい限りです。ところが、何事にもメリットがあればデメリットも存在するわけで、クラウド時代のインフラは利用料金を気にしないでいるとクラウド破産する可能性があります。私の場合は、予算設定をしておき Azure アプリとメールで予算を超えたら通知が来るように設定していたり、その日初めて Azure ポータルに入った時に日別のコストを表示して直近で思わぬコストになっていないか確認していたりします。そこで今回は、日次で自動化することも視野に入れて、Azure サブスクリプションの「現在のコスト」を Azure CLI で取得できるかやってみました。

## 「現在のコスト」の表示例

![azure-cost-cli-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/5fed12ea-289d-7da5-a6f5-2cb192759820.png)

![azure-cost-cli-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/c30e84ca-45d1-7b42-7888-fbaf3e20dc08.png)

## 「現在のコスト」を Azure CLI で取得

```bash:bash
# mac 環境の場合は下記コマンドで numsum をインストールします
brew install num-utils

# 対象のサブスクリプションであることを確認します
az account show \
  --query name \
  --output tsv

mnrsdev

# 各リソースごとの利用料金が日本円であることを確認します
az consumption usage list \
  --query [0].currency \
  --output tsv

JPY

# 各リソースごとの利用料金のみを表示してみます
az consumption usage list \
  --query [].pretaxCost \
  --output tsv

0.00017919999999999999189086163919881755646201781928539276123046875
2.1329615999999997910663296352140605449676513671875
0.000588672000000000045054349140372096371720544993877410888671875
0.6159938400000000147116452353657223284244537353515625
0.000274175999999999998706090575950611309963278472423553466796875
2.353612800000000060407501223380677402019500732421875
0.003180800000000000120337073639120717416517436504364013671875
4.65373440000000027083615350420586764812469482421875
0.00027720000000000001583178033115473226644098758697509765625
0.9032258064516209827843340463005006313323974609375
1.8064516129032399671672237673192285001277923583984375
32.855961600000000544241629540920257568359375
71.685734400000001187436282634735107421875
0.000089599999999999995945430819599408778231008909642696380615234375
0.00663039999999999983548715221104430384002625942230224609375
0.000604799999999999955690999087210002471692860126495361328125
0.9806719999999999881623580222367309033870697021484375
1.3439865600000000522840082339826039969921112060546875

# 最後に numsum で全ての利用料金の合計を表示してみます
az consumption usage list \
  --query [].pretaxCost \
  --output tsv \
  | numsum

119.344159467355
```

## 参考

https://learn.microsoft.com/ja-jp/cli/azure/consumption/usage?view=azure-cli-latest#az-consumption-usage-list
Android ステータスバーの色を変更する

今回はステータスバーの色を変更して行こうと思います。

ステータスバーとはこの矢印の場所です。画面の上部です。
![Screenshot_20221026_174805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/f051ef0f-8038-2270-25b9-17a84668cd9d.png)


こちらの色を変更していきます！

※Android 10（API レベル 29）以降の Android 対象です。

公式

https://developer.android.com/training/gestures/gesturenav?hl=ja#edge-to-edge

# ステータスバーの背景色変更方法

```　values-v29/themes.xml
<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="android:statusBarColor">@android:color/white</item>
</style>
```

themeに設定するとアプリ内で全ての色が変更されます。

```AndroidManifest.xml
    <application
        android:theme="@style/Theme.MyApplication">
    </application>
```
themeはマニフェストで設定します。

コードで変更もできるみたいです。


```MainActivity.kt
window.statusBarColor = Color.WHITE
```

windowのsetStatusBarColorを使用します。

https://developer.android.com/reference/android/view/Window?hl=ja#setStatusBarColor(int)

こちらが変更した画面です。

![Screenshot_20221026_175811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/3862be99-e6bf-0e04-ea38-01b1d084fc9a.png)


以上です
デイトラ「Web制作コース」　受講内容をアウトプット 4日目

学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①デイトラ「Web制作コース初級編」
②環境構築
③今日得た新しい知識
　・Live Serverの仕組みと使い方
　・Chromeの検証機能の取り消し線はそのCSSが適用されていないということを表す。
　　主に「同じプロパティについての指定が複数あり、優先順位が低い場合」にこうなる。
　・Emmetの使い方
ABC276回答メモ

0.はじめに
　昼間にやっていた東京工業大学のもちらっとやってみましたが
　ちょっと無理でした・・。
　気を取り直してABCに挑戦しましたが
　実装にてこずった感じになりました。
　３問正解もレートは下がってしまいました。

1.A - Rightmost
　最初一番左かと思って作り始めてから右側ということに気づきました。
　A問題らしい簡単な問題でした。

　https://atcoder.jp/contests/abc276/submissions/36223973


2.B - Adjacency List
　難易度急上昇。
　絶対TLEとはおもいつつ
　最初は10000×10000の枠を作って
　道路のある組には1をセットして
　枠をもとにアウトプット。
　としたらやっぱりTLEでした。

　素直に、表L[出発都市][到着都市配列]を作り
　道路情報をもとに到着都市配列に追加していき
　最後に都市数と到着都市配列を順に表示。
　で、できました。
　今となっては最初なぜ枠を作る方式にしたのかが謎なくらい
　後者の方が楽でした・・。

　https://atcoder.jp/contests/abc276/submissions/36237269

3.C - Previous Permutation
　最初は全く分からなかったのですが、例題２や自分でExcelに
　4桁のケースを列挙して書いたりしてやっと以下にたどり着きました。
　（解説等にはちゃんとした考え方や説明があるかもしれませんが見ていないので
　　独自の解釈となります・・・）
　考え方
　　・辞書順昇順の順列の変遷
　　1)辞書順最小順列は、1～Nが昇順に並んでいる状態
　　　最大順列はN～1と降順に並んでいる状態
　　　例(4桁)辞書順1番目(最小)：1234
　　2)辞書順2番目の順列は、N番目の数字とN+1番目を
　　　入れ替えた状態。
　　　→下2桁で降順
　　　例(4桁)辞書順2番目：1243
　　3)辞書順3番目の順列は、下3桁内でで2番目に大きい数字を
　　　下3桁の先頭にもっていき、それ以外の数字を昇順にする
　　　→下2桁での入れ替えが終わったので3桁目を巻き込んで入れ替えする
　　　例(4桁)辞書順3番目：1324
　　4)辞書順4番目の順列は、N番目の数字とN+1番目を
　　　入れ替えた状態。
　　　→下2桁で降順
　　　例(4桁)辞書順2番目：1342

　　と、下の桁から順序を入れ替えて下の桁の入れ替えが終わったら
　　１つ上の桁を巻き込んでまた順序を入れ替えていく。

　　これを踏まえると、与えられた順列Pの辞書順1個前の求め方
　　（もしかしたら条件分けしなくてもいけるかもしれませんが実装の都合上
　　　分けました）
　　条件１）N番目の数字よりN+1番目数字が大きい(下2桁が降順)の場合
　　　　→N番目の数字とN+1番目数字を入れ替える(下2桁を昇順にする)
　　条件２）条件1以外の場合
　　　　(1)順列Pを先頭からチェックし、一番右側にある昇順の組(chg)と
　　　　　 その直前の数値(PREA)を探す
　　　　例題２の場合）
　　　　9 8 6 5 10 3 1 2 4 7
　　　　→chg：1 2 4 7　PREA：3
　　　　　→順列9 8 6 5 10 3の先頭でこの後の順列は下4桁を入れ替えていく状態
　　　　(2)chgの中でPREAの次に小さい数字(2)で
　　　　　 順列PのPREAを置き換えchgの2を3に入れ替え昇順に並べて(7 4 3 1)
　　　　9 8 6 5 10 2 7 4 3 1
　　　　　→(1)で順列9 8 6 5 10 3の先頭だったので、9 8 6 5 10 2の最後の
　　　　　　順列を求める
　　　　　 
　　考え方がまとまってからの実装にてこずったけど
　　ACだった時の達成感は半端なかったです。
　　　　
　　　https://atcoder.jp/contests/abc276/submissions/36256844


4.D - Divide by 2 or 3
　C問題解けた時点であと15分くらいしか残っていなかったので
　時間内には解けませんでした。
　与えられた数列の一番小さい数字に合わせていく感じかなーと
　解説を見たところ、最大公約数に合わせて考えるようでした・・。
　
　考え方
　1)数列aの最小公倍数を求める
　　Python3.8の関数だと２個ずつしかできないのでこんな感じで。
　　(TLEになるかと思いましたが意外と高速で計算してくれるようでした。)
```
import math
N=int(input())
A=list(map(int,input().split()))
g=0
for i in range(N):
    g=math.gcd(g,A[i])
```
　2)数列aの各数値を、g(最大公約数)で割った後
　　 ２と３で割れるだけわりつつ割った回数をカウントしておく。
　　 割ったあとの数字が最終的に1であればＯＫ
　　 1以外＝2と3で割っていってもgにならない時には
　　 回答を満たせないとして、”-1”を表示して終了

　3)2)でカウントした割った数を表示して終了

　せめて30分位ないとD問題に取り掛かる気力がわかないなと思いました。
　（30分あれば解けるとは言っていない）

　https://atcoder.jp/contests/abc276/submissions/36264708
Pythonで複数のclassごとにIDを振る方法

# やりたいこと
製品A,Bのオブジェクトがそれぞれいくつかあって、A,BごとにIDを1から振りたいという場合の方法です。クラス変数を置いて、インスタンスを作るごとにクラス変数に1を足す方法はいろんな方が書かれていたのですが、それを継承させる方法が見つからなかったので、備忘として書いておきます。

# やり方
まず、元となるクラス(BaseProduct)を作り、それをA,Bの各クラスに継承させます。元クラスにはクラス変数（class_count）を作り、クラスごとのID（class_id）にそれを入れて、入れ終わったら1を足す、というメソッドをクラスメソッドとして定義します。
その後、インスタンス変数としてのidにclass_idを入れてやるという処理です。見ていただいが方が早いですね。

```python
class BaseProduct:
    class_count = 1
    @classmethod
    def id_counter(cls):
        cls.class_id = cls.class_count
        cls.class_count += 1
        
    def __init__(self):
        self.id_counter()
        self.id = self.class_id


class ProductA(BaseProduct):
    def __init__(self):
        super().__init__()

class ProductB(BaseProduct):
    def __init__(self):
        super().__init__()

```

## 参考サイト
クラス変数の付け方、呼び出し方はこちらのサイトを参考にさせていただきました。ありがとうございました。

https://atmarkit.itmedia.co.jp/ait/articles/2001/28/news013.html
スプレッドシート関数まとめ (組合せ)

便利な関数載っけております！
(▶︎▷[基礎編](https://qiita.com/drafts/99716b3be07f5d339572/edit))
(▶︎▷[発展編](https://qiita.com/sakuran_ran/items/a6c97b99a6e29f0865fc))
スプレッドシート関数まとめ (発展)

便利な関数載っけております！
(▶︎▷[基礎編](https://qiita.com/sakuran_ran/private/99716b3be07f5d339572))
(▶︎▷[組合せ編](https://qiita.com/sakuran_ran/items/3ae03921ff65f6213afd))


| No | ページ内リンク |
|:----:|:-------------|
| 1 | [indirect](#indirect) |
| 2 | [arrayformula](#arrayformula) |
| 3 | [googletranslate](#googletranslate) |
| 4 | [unique](#unique) |
| 5 | [filter](#filter) |
| 6 | [transpose](#transpose) |
| 7 | [join](#join) |

# indirect
他のシートからデータを取り込む

```ruby:importrange
=importrange（“スプレッドシートキー”,“シート名!範囲の文字列”）
```
- [参考記事](https://roboma.io/blog/marketing/importrange-function-of-google-spreadsheet/)
<br>
二つの記事の合併で成功するか、失敗するか

二つの記事を合併することが時々ある。　

下書きのこともあれば、Reserchmapなどに書いた記事の場合もある。

成功するか、失敗するか場合による。　

 <この項は書きかけです。順次追記します。>


# 成功例　

ある記事を書いて、イマイチだなと思っていた場合。　

読者が不特定多数で、焦点が絞りきれていない場合。　

別の記事を書き始めて、ある特定の人を対象にして書き始めて、　
そういえば、その話題どっかに書いたっけってなって、　
書き始めた記事の後ろにくっつけたら、うまく収まった場合。　

# 失敗例　

こっちはたくさんある。　

二つの記事をくっつけると、話題が広がりすぎて
読む人が混乱する場合。　

## 対策

一人の読者を想定して、切り貼りをやりなおすしかない。　

場合によっては記事を分割する。　



# 文書履歴(document history)
ver. 0.01 初稿 　20221106
API設計: gRPC、OpenAPI、REST 

# はじめに
こんにちは、[rendaman0215](https://twitter.com/rendaman0215)です。

APIの設計のフェーズでGoogleの記事で以下のような記事を読みました。
とてもわかりやすかったので、良い機会のためまとめてみようと思います。

https://cloud.google.com/blog/ja/products/api-management/understanding-grpc-openapi-and-rest-and-when-to-use-them

# HTTP通信3つの主要な方法
記事内では、以下の3つが主要な方法として紹介されています。
- REST
- gRPC
- OpenAPI

これが主題になるのですが、gRPCはさておき、そもそもOpenAPIはRESTを記述するフォーマットなので比較対象にならないのでは？？と思いました。
よくよく読み進めてみると、記事内でOpenAPIと言われているものは、RESTに関わらずRPCのような使い方を指しているように見受けられました。
# REST
RESTと呼ばれる以下の4つの定義に合致するもの
- 状態管理を行わず、やり取りされる情報のそれ自体で完結して解釈することができる
- 情報を操作する命令の体系があらかじめ定義・共有されている
- すべての情報の汎用的な構文で一意に識別される
- 情報の一部として、別の情報へのリンクを含む

ただし以下のようなシンプルなWebインターフェースとしての意味で使われることも多いです。
RESTはLV3まで定義が存在しており、上記の定義でいうところの`情報の一部として、別の情報へのリンクを含む`が満たされていないケースが多いです。
- ステートレスであり
- GET、POSTといったHTTPメソッドを利用し
- URL/URIで全てのリソースを一意に識別する

# gRPC
gRPCは`Protocol Buffers`を用いてスキーマを記述しシリアライズします。
シンプルな直感的な方法でリモートプロシージャを定義できます。
そのため、スキーマから自動的にコードを生成してくれるためHTTPを意識せずに開発ができます。

一方でRPC形式では、プロシージャの名前だけでその後どういった動作があるか推測できないことがあるため、API仕様を共有するためにドキュメント化は必須です。

gRPCは、内部でHTTP/2を使用しているため、パフォーマンスに優れています。
しかし、クライアントにHTTP/2の使用を強制できないため外部（ユーザのブラウザや外部サービス）とのやりとりは向いていないこともあります。

# OpenAPI
一番慣れ親しんでいる人が多そうですね。
こちらも、エンドポイント名だけでその後どういった動作があるか推測できないことがあるため、API仕様を共有するためにドキュメント化は必須です。

# まとめ
どの方法にもメリットデメリットがあるため、用途によって使い分けるのがいいですね。
具体的には以下のポイントでしょうか？
- システム全体が構造化されているか？（REST化するなら必要）
- メンバーのHTTPに関する習熟度が高いか？
- 爆速が求められるか？（速さ重視ならgRPC）
- ブラウザからのアクセスがあるか？（gRPCは不向き）
- サービス間通信か？（早いためgRPC有利）
Mac[M1] Node.js環境構築

# はじめに
この記事は、こちら動画を参考にしています。
動画の書き置きメモのような記事になります。

https://youtu.be/wtb0V6a4FXQ

# 目次
1. Nodebrewインストール
1. パスを通す
1. 使い方

# 1. Nodebrewインストール
Node.jsのバージョンを管理するものです。
様々なバージョンを利用するらしいので、

https://github.com/hokaccha/nodebrew

上記のサイトから以下のような手順でインストールしていきます。
```zsh:ターミナル(zsh)
curl -L git.io/nodebrew | perl - setup # インストール
#...
#========================================
#Export a path to nodebrew:
#
#export PATH=$HOME/.nodebrew/current/bin:$PATH
#========================================
export PATH=$HOME/.nodebrew/current/bin:$PATH #パスを通す
nodebrew install-binary stable #安定バーションをダウンロード
#...
#Installed successfully
nodebrew ls #ダウンロードしたバージョンを確認
#v18.12.1
nodebrew use <バージョン(例:v18.12.1)> #バージョン指定
#use v18.12.1
node -v #Node.jsバージョン確認
#v18.12.1
```

# 2. パスを通す
ちなみに、これだとターミナルのデフォルトでパスが通っていません。なのでパスを通していくんですが、ややこしいので以下の動画を見てみてください。

https://youtu.be/lhfNe6xmlLg
LPC812MAXで時間関数と繰り返しタイマー割込みで遊ぶ(1秒)


目的
簡易な時間づくり
例題をほぼそのまま使用


![o_cop233.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8e5b4994-6200-1977-47d9-35898f54d705.jpeg)




https://os.mbed.com/users/okini3939/notebook/time_jp/


https://os.mbed.com/users/okini3939/notebook/ticker_jp/




```c++



// SER_time_test1_812_1


#include "mbed.h"

//LEDのポートの定義
DigitalOut myled(LED_RED);   //red


//        TX      RX
Serial pc(USBTX, USBRX); //812 Serial2
//Serial pc(D1, D0);       //812 Serial1


//繰り返しタイマー割込みの定義
Ticker flipper;

//累積時間
time_t seconds = 0 + (60 * 60 * 9); // JST

//繰り返しタイマー割込み
void flip()
{

    myled = !myled;
    seconds++;

}//flip


//メイン関数
int main()
{

    flipper.attach(&flip, 1.0); // the address of the function to be attached (flip) and the interval (1 seconds)


    pc.printf("\r\n<START>\r\n"); //debug


    struct tm *t;

    //無限ループ
    while(1) {

        t = localtime(&seconds);

        pc.printf("%04d/%02d/%02d %02d:%02d:%02d",
                  t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);

        pc.printf("\r\n");

        wait_ms(1000); //1秒待つ

    }//while

}//main




```
WSL上からCドライブの中身を飛ばしかけた話

# はじめに
Windows Subsystem for Linux、通称WSLなどと呼ばれ、Linuxを気軽に扱いたいときに非常に便利なシステムです。

その反面、システムの内部構造を理解して使用しないと大事故に繋がりかねず、最悪の場合Windows諸共お釈迦になる可能性が潜在しています。

今回は、私と同じようなWSL初心者に向けてのアドバイスも兼ねて、「__過去に私が犯した大きなやらかし__」について、自戒の意を込めて筆をしたためようと思います。


# この記事の主な対象者
- これからWSLを触ろうとしている方
- WSLを触ってまだ日が浅い初心者の方
- 好奇心旺盛で、よくOSなどを破壊しかけている方

## 自己 ~~(事故)~~ 紹介
Qiitaに記事を上げることから初めてなので、軽く状況解説も兼ねて自己紹介から。

#### 筆者紹介
瀬長と申します。

南の島で高専生をやっているしがない情報系の人間です。
とはいっても専門的な知識はほとんどなく、ロボコンで使う制御技術と、趣味と好奇心で触った技術が少々ある程度。

よわよわ技術者見習いですが、この記事をきっかけにどこかの誰かのPCを救えればと思います。
浅はかな知識で記事を書くので、そうはならんやろって感じの発言をしたり、かなり嘘をついたりしてるかもしれません。悪しからず。

#### 状況解説
今回の案件は、OSの授業において「実際にLinuxを触ってみよう」というテーマのもと、WSL2を使用することから始まります。
私自身LinuxはLinux Mintを入れた実機を少しだけ触った事がある程度で、あの辺りに関する知識はほぼ皆無に等しい状況です。


# 本題
授業中にWSL2を触っただけで飽きなかった私は、知的好奇心ってやつから色々遊び始めました。
そして、非常に良くない思い付きをするわけです

***「WSLって仮想環境みたいなものだし、Linux禁断の破壊コマンド打ってもWSL入れ直すだけで良いんじゃね？」***

今考えてみると発想があまりに浅はか過ぎました。


### Linux禁断の破壊コマンド
Linuxを触った事がある人ならご存知かもしれませんが、Linuxには **「禁断の破壊コマンド」** と呼ばれるものが存在します。
それがこちら。

    $ sudo rm -rf /*

知らない方のために何をしているか解説しますと、
「ルートディレクトリの下にぶら下がってる階層構造を全て諸共吹き飛ばすよ」
って感じです。


WSLってWindows上でLinuxが動いてる、つまり仮想環境じゃね？と考えた私は、危険な好奇心を原動力に脳死でコマンドを打ちました。
Windowsから切り離された仮想環境上なら、たとえ壊れたとしても、また入れ直せばいい。**そう思っていた時代が私にもありました。**

### WSLの特性
一般的な仮想環境では主にハイパーバイザーの上にOSが乗っかってて、それぞれが独立して動くような形態をとっているのがほとんどだと思います。
実際、WSL2ではHyper-V上に完全なLinuxカーネルが乗っており、ほぼ独立したLinuxを使用することができるわけです。


これだけ見ると問題はなさそうな気もしますが、WSLは**ほぼ**独立した環境なのです。
WSLはWindows Subsystem for Linuxです。直訳するとLinux 用 Windows サブシステムです。~~あくまでWindows主体のサブシステムに過ぎないのです。~~ 
**22/11/07追記：WSLはサブシステム、WSL2は仮想マシン(※ただし、Windowsのドライブが/mnt直下にデフォルトでマウントしてあるもの)と考えた方が良いようです。**(コメントでのご指摘ありがとうございました。)

LinuxのユーザーモードとWin32のユーザーモードは相互的にリンクしており、**「Windows上のファイルにアクセスしてLinuxの環境から動かすことができるよ」** ってのがWSLの売りなわけです。
（詳しくはこちらの記事を参照：[WSLとwindows間のファイル連携](https://qiita.com/quzq/items/1096c638c0d86795be13)）

具体例で言うと、WSLのディレクトリ上に存在する`/mnt/c`から、実質的にCドライブにアクセスできる感じです。

では話を戻してみましょう。
"Linux禁断の破壊コマンド"は、ルートディレクトリの下にぶら下がってる階層構造を全て吹き飛ばすのです。mntディレクトリも例外なく**全て諸共**です。

### 破壊、そして終焉ー。
ディレクトリが繋がっていることを認識していなかった私は、何の躊躇いもなくは破壊コマンドを実行しました。
「WSL上はそこまでファイル量も無いはずだし、すぐ終わるだろ」と考え、恐ろしいほどに静かなコンソール画面を見ながら、コマンドの終了を待っていました。

10秒程経ち、ぽつぽつと出てくるCドライブ上の一部ファイルへのアクセス拒否メッセージ。何かがおかしい事に気付き始めたころには時すでに遅し。
慌てて強制終了を掛けましたが、その時には既にCドライブ直下10%まで魔の手が及んでいました。
趣味で作ったMIDIデータとかがかなりの数飛んじゃいましたとさ。あーあ。

![DSC_2332.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/6336af6d-6240-8a2a-9e87-6186fa7b665e.jpeg)


# まとめ
ただのやらかし報告みたいになってしまいましたが、言いたいことがおおよそ伝われば良いかなって感じです。
軽く要約すると以下のような感じです
- WSLはWindowsとかなり密にリンクしてる
- Linux破壊コマンドは実機環境で安易に打ってはいけない
- **好奇心は猫を殺す(戒め)**

「別に環境壊しても良いよ」って人は、一度試して挙動観察する価値ぐらいはあるんじゃないかと思います。

ということで、皆様も良いWSLライフを！


※破壊されたデータの半分ぐらいはTestDiskを使って救出されました。
詳細は以下の記事からどうぞ。

https://qiita.com/Seyanaga/items/6716acc3f4b584867f6f

---
##### 22/11/07 追記
皆様、コメントでの多くのご指摘ありがとうございます。
間違った知識を流布しないように、また、私自身の勉強にもなりますので非常に感謝しております。
それにしても本当に無知で申し訳ないです……もっとちゃんと勉強します……

##### 24/11/19 追記
２年越しにようやくTestDiskによるデータ復元の話を書きました。
本当に今更ながら。大変お待たせいたしました。
[python]テキストファイルの作成、書き込み

## 環境

||環境|
|:-|-:|
|pc|windows10|
|言語|python3.11|

## ファイルの作成、書き込み

### open-closeの場合
```Python:Python3.11
import os
os.getcdir()  # カレントディレクトリを確認（オプション）

c = "C:/Users/~/codenote.txt"  # 指定のパスを用意

s = 'start'  # 書き込む内容

f = open(c, 'w')  # wで書き込み可能にする
    f.write(s)  # startと書き込む
f.close()
```
:::note info
open-closeのセットで書き込まなければならないことが手間
withを使うとclose省略可能
:::

### withの場合
```Python
with open(c, 'w') as f:
    f.write(s)

with open(c) as f:
    print(f.read())  # 書き込んだ内容確認
```

参照：https://note.nkmk.me/python-file-io-open-with/
Get Started with Picklists / Share Values with Global Value Sets

# We can't find the correct formula to set the Default Value for the Macaron Flavor picklist.

+ [間違ったオブジェクトにマカロンフレーバーの選択リストを作成しました。](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000FwyBj)

:::note
I created the Macaron Flavor picklist on the incorrect object.
:::

+ [Issue defining default picklist value](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JffGU)

:::note
Create a global picklist value Flavors and with the values as required. 

Mark 'Gingerbread' value as default.

Now create a new picklist field 'Macaron Flavor'  in Product standard object.

Use the global picklist value that was created previously. 

In the default field use the formula

CASE(MONTH(TODAY()),1, "Gingerbread",2, "Strawberry",4, "Chocolate",7, "Raspberry",11, "Pumpkin",12, "Mint", "Vanilla")

Set the 'Restrict picklist to the values defined in the value set' checkbox to true.

The above should ensure your task completion.

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

# We can't find a picklist field with the label Macaron Flavor in the  product object

+ [Working on completing the challenge for "Get Started with Picklists" and I keeping getting an error message when I check the challenge.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000KgnfiSAB)


# We couldn’t find a global value set named 'Flavors'.

**Couldn’t find global value set named 'Flavors'.**

+ [Share Values with Global Value Sets](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QMMHj)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d351e301-ae0e-7618-3f4b-0b23503b6a02.png)

:::note
Make sure that you have followed below steps.

Create a Picklist Macaron Flavor, add your values and save.

Go back and edit this Picklist, you will notice Promote to Global Value Set on the edit page.

Click on it, New Global Value Set screen will appear. GIve it the name Flavors and click on Promote to Global Value Set. Now this is available under Global Value Sets.

Click a new field under product as Shirt and assign this Global value set Flavors to complete the challenge.

Also refer below links.

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

https://developer.salesforce.com/forums/?id=9060G0000005VntQAE
:::
Socket.IO サーバーのパスをドメインのサブディレクトリにした場合の Socket.IO Admin UI の接続方法

## 前提
自分で建てたSocket.IOサーバーのURLが
`https://hoge.com/fuga/socket.io`
だったとする

## サーバー側設定
```js
instrument(io, {
  namespaceName: "/fuga/admin",
  auth: {
    type: "basic",
    username: {任意},
    password: {任意},
  },
});
```
※ `username` は完全任意だが、basic認証にした場合の `password` 設定方法は公式ドキュメントを参照
https://socket.io/docs/v4/admin-ui/#auth

## Socket.IO Admin UI の接続設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265114/97ac9999-a6cf-6a9f-2bb9-c0d3f933bed3.png)
| 設定項目         | 値                   | 
| :--------------- | -------------------- | 
| Server URL       | https://hoge.com     | 
| Username         | サーバー側設定と同じ | 
| Password         | サーバー側設定と同じ | 
| Advanced options | チェックを入れる     | 
| WebSocket only?  | チェックを入れる     | 
| Admin namespace  | /fuga/admin          | 
| Path             | /fuga/socket.io      | 
| Parser           | Built-in parser      | 

`WebSocket only?` 以下の項目は `Advanced options` にチェックを入れると出現する
ASUS の無線 LAN ルータで透過プロキシサーバを動かした時のメモ

ASUS RT-AX56U (Asuswrt-Merlin 導入済) で透過プロキシサーバ (go-transproxy) を動かしました．

ルータ下の IP アドレスは 192.168.50.0/24 で
プロキシサーバは 172.16.0.1 の 8080 番で Listen している前提です．

go-transproxy の本体は /jffs 下に配置しました．実機でビルドしてもいいですが，環境構築の手間がかかることと，それなりに時間がかかるので下の注意事項に気を付けながらクロスコンパイルすることを推奨します．

## iptables 設定
```bash
ipset -N localnet iphash
ipset -A localnet 192.168.50.0/24
ipset -A localnet 172.16.0.0/24
ipset -A localnet 172.16.10.0/24
ipset -A localnet 172.16.20.0/24
ipset -A localnet 172.16.30.0/24
ipset -A localnet 172.16.40.0/24
ipset -A localnet 172.16.50.0/24
ipset -A localnet 172.16.60.0/24

iptables -A PREROUTING -t nat -m set ! --match-set localnet dst -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 7080
iptables -A PREROUTING -t nat -m set ! --match-set localnet dst -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 7443

iptables -t nat -A OUTPUT -m set ! --match-set localnet dst -p tcp -o br0 --dport 80 -j DNAT --to 127.0.0.1:7080
iptables -t nat -A OUTPUT -m set ! --match-set localnet dst -p tcp -o br0 --dport 443 -j DNAT --to 127.0.0.1:7443
iptables -t nat -A OUTPUT -m set ! --match-set localnet dst -p tcp -o eth0 --dport 80 -j DNAT --to 127.0.0.1:7080
iptables -t nat -A OUTPUT -m set ! --match-set localnet dst -p tcp -o eth0 --dport 443 -j DNAT --to 127.0.0.1:7443
```

## transproxy
```bash
no_proxy='127.0.0.1,localhost' http_proxy=http://172.16.0.1:8080 /jffs/transproxy  -tcp-proxy-dports 0 -disable-iptables -http-proxy-listen :7080 -https-proxy-listen :7443 -loglevel info
```

### ビルド時に気をつけること
```bash
GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=0 go build  -o bin/transproxy cmd/transproxy/main.go
```
CGO_ENABLED=0 を付けないと not found になる．(ライブラリが足りてない？)

## 起動時のスクリプト
Web GUI の管理→システムから "Enable JFFS custom scripts and configs" を有効にする
スクリプトは `/jffs/scripts/services-start` に書く

こんなイメージ
```sh
#!/bin/sh
hoge & \
fuga & \
exec piyo
```


## 参考文献
go-transproxy
https://github.com/wadahiro/go-transproxy

Asuswrt-Merlin
https://www.asuswrt-merlin.net/

ipset 関係
https://serverfault.com/questions/6989/iptables-multiple-source-ips-in-single-rule

go のバイナリ
https://stackoverflow.com/questions/34729748/installed-go-binary-not-found-in-path-on-alpine-linux-docker
HTML/CSSのチュートリアル

HTML/CSSを学習するにあたって、YouTubeの動画を2本ほど参考にした。いずれも約７時間程度と激重なので、今後学習する方々が参考にできるよう総括的な感想を残そうと思う。

HTML & CSS Full Course - Beginner to Pro (2022) (https://youtu.be/G3e-cpL7ofc)：
とても優しいチュートリアル。スムーズに理解することを優先し、htmlのテンプレートの書き方に触れるのも動画の後半からとなっている。継承やidといった概念が触れられない点が、「わかりやすい」の犠牲になってしまっている印象。コードはGitHubから参照可能。

HTML & CSS for Beginners | FREE MEGA COURSE (7+ Hours!) (https://www.youtube.com/watch?v=iG2jotQo9NI)：
標準的なチュートリアル。理解より本質的な部分を優先し、触れる属性の数も多いので一本目がこれなら折れていたかもしれない。軽い事前知識がある方向け。

多少２番目に批判的とも取れる感想を述べているが、そんなことはない。筆者は1本目である程度の基礎知識を獲得した上での視聴だったので、内容が重複している部分の知識がさらに補強され、強いシナジーを感じた。０から始める方は二本とも視聴されることを勧めたい。
日本の祝日を判定する

```bat:jpholiday.bat
@echo off

set SELF=%~n0
set FILE=%TEMP%\%SELF%.csv
set HELP=Usage: %SELF% [YYYY/mm/dd]

setlocal enabledelayedexpansion
  if "%~1" == "" (
    set v=%DATE%
  ) else (
    set v=%~1
  )
  
  (echo %v%) | findstr /r "[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]" > NUL || (
    echo %HELP% >&2
    exit /b -1
  )
  
  set y=%v:~0,4%
  set m=%v:~5,2%
  set d=%v:~8,2%
  
  for %%i in (1231 0101 0102 0103) do (
    if "%m%%d%" == "%%i" (exit /b 0)
  )
  
  if not exist "%FILE%" (
    copy NUL "%FILE%" > NUL
    for /f "tokens=1,2 delims=," %%a in ('curl -s "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"') do (
      for /f "tokens=1-3 delims=/" %%i in ("%%a") do (
        set y4=%%i
        set mm=0%%j
        set dd=0%%k
        (echo !y4!/!mm:~-2!/!dd:~-2!,%%b) >> "%FILE%"
      )
    )
  )
  
  call :Z %y% %m% %d% w
  if %w% equ 0 (exit /b 0)
  if %w% equ 6 (exit /b 0)
  
  find "%y%/%m%/%d%" "%FILE%" > NUL && (exit /b 0)
  
  exit /b 1
endlocal
goto :EOF

:Z
setlocal
  set y=%1
  set m=%2
  set w=0
  
  if %m% leq 2 (
    set /a y-=1
    set /a m+=12
  )
  
  set /a w=(5*%y%/4-%y%/100+%y%/400+(26*%m%+16)/10+%3)%%7
endlocal & set %4=%w%
goto :EOF
```

実行結果は以下のとおりです。
![jpholiday.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29814/03e31439-4d35-9221-2fa7-71bcfdfcf30a.png)
CMake Presets のメモ(CMake 3.24 以降利用推奨)

## 背景

CMake の configure(bootstrap) めんどくさい...

CMake 3.20 から(正確には 3.19) configure の設定を json で記述できるようになっていました! :tada:

## 使い方

https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html

相変わらず公式のドキュメントは見ずらいです...

とりあえず CMakePresets.json 用意して,

```
$ cmake --preset <preset_name>
```

で configure してくれます! ディレクトリは勝手に作ってくれました.

### 3.24 で `--fresh` 対応

いままでは configure やり直したい場合, キャッシュなど消すためディレクトリを消して作り直しなどが必要でしたが,
3.24 からは `--fresh` で自動で CMakeCache.txt 消して reconfigure してくれるようになりました.

https://cmake.org/cmake/help/latest/manual/cmake.1.html#cmdoption-cmake-fresh

したがって 3.24 以降では

```
$ cmake --preset <preset_name> --fresh
```

が推奨ですかね.

あとは普通に今まで通りですが, cmake で preset を参照してビルドすることもできます.

https://cmake.org/cmake/help/latest/manual/cmake.1.html#build-tool-mode

```
$ cmake --build --preset <preset_name>
```

preset にそれぞれのタスク(build, test, package)に対応する処理の記述が必要です.

強制的にリビルドさせたい場合は `--clean-first` をつけておきます.

```
$ cmake --build --preset <preset_name> --clean-first
```

### Workflow preset

あんまり情報がないですが, configure, build や test を一括して行えるようにする感じです.
CI ビルドとかで処理の記述がやりやすくなります.

ただあんまり複雑なことはできません.

https://gitlab.kitware.com/cmake/cmake/-/issues/23118

いくつか改善は議論されているようです.
AzureのロールとAzure ADのロール

●AzureのロールとAzure ADのロール
最も大きな違いはロールの目的。
AzureのロールはAzureの仮想マシンやストレージなどのリソースを管理するためのアクセス制御を行うのに対して、
Azure ADのロールはAzure ADのユーザーやグループなどのリソース（オブジェクト）を管理するためのアクセス制御を行う。そのため、Azureのロールだけを持っていてもAzure ADのテナント内にユーザーを作成することはできない。逆も同様。

●アクセスの昇格
２つのロールのアクセス制御の目的は異なり、それぞれのスコープは重なっていない。そのため、特定のユーザーがAzureリソースとAzure ADのリソースを管理するには、AzureのロールとAzure ADのロールを割り当てる必要がある。
Azure ADのグローバル管理者ロールだけを持つユーザーは、既定でAZuire ADリソースを管理できるが、Azureのサブスクリプションやリソースは管理できない。

ただし、例外としてAzyre ADのグローバル管理者のロールを持つユーザーは自身のアクセス許可を昇格することができる。
アクセス書架の昇格はグローバル管理者のユーザーのみが使用できるオプションであり、昇格によってグローバル管理者にはテナントが所有する全てのサブスクリプションのユーザーアクセス管理者ロール(Azureのロール)が割り当てられる。

ユーザーアクセス管理者ロールは、Azureのサブスクリプションやリソースへのアクセスが管理できるロールであり、自身や他のユーザーにアクセス権を付与できる。
つまり、昇格によってテナントが所有する全てのサブスクリプションを管理できる様にあんる。