OmniAICreator/Qiita-1.07M huggingface dataset:
[Docker] RaspberryPi OS Full 64bit arm64のDockerイメージ作成

# きっかけ

なんとなくです、と言うとアレなので強いて言うのであれば、出先でもラズパイなあれこれの開発をしたいと感じたから、です。持ち歩くのもアレなのでDockerで頑張ることにしました。

# 作業環境

- ThinkPad X13 Gen2i
- Ubuntu 22.04
- `Docker version 20.10.17, build 100c701`

# 作業

主にこちらの記事を参考にしました。
[RaspberryPi OS 32bit armhf / armv7l の Docker Image 作成と起動](https://zenn.dev/pinto0309/articles/2e6483a2452c8f)

## 公式のRootファイルシステムのダウンロード

```sh
wget https://downloads.raspberrypi.org/raspios_full_arm64/root.tar.xz
```

ついでにハッシュ確認をしたかったのですが[ここ](https://downloads.raspberrypi.org/raspios_full_arm64/)の中では見つけられませんでした。ちなみにこうなりました。
```
$ sha256sum root.tar.xz
e8fd091305558e1f8c1ff44c905e28618cac159afbaa9513420427fe98362256  root.tar.xz
```

## Dockerにインポート & イメージ作成

リポジトリ名とタグ名に注意してセットします。
```
$ docker image import root.tar.xz {リポジトリ名}/raspios_full_arm64:2022-04-04_bullseye
sha256:06a8e8313fea7b441c6084ce7ee3aa24991c56b97cd3e60c6ca8446246177b13
```

作成されたイメージの確認をします。
```
$ docker images
REPOSITORY                                               TAG                   IMAGE ID       CREATED          SIZE
na2na/raspios_full_arm64                                 2022-04-04_bullseye   9524f8db1176   20 seconds ago   4.64GB
```

## 作成されたイメージからコンテナの作成と起動確認

QEMUのStaticモジュールを使用して起動します。
```
$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
$ docker run -it --rm \
    -v `pwd`:/workspace \
    na2na/raspios_full_arm64:2022-04-04_bullseye bash
```
確認ができたらexitで抜けます。

## パッケージのアップグレードをしたイメージの作成

そのままDockerHubにPushするのもなんだか嫌だったので...。ここからはなんとな〜くやってるので間違っているところがあるかもしれません。200以上更新あってまあまあかかりました。
```
$ docker run -it na2na/raspios_full_arm64:2022-04-04_bullseye bash
```
してコンテナ作成をします。

```:コンテナ内
# apt update && apt upgrade -y
```
して終わったら`ctl+p ctl+q`抜けます。次にコンテナIDの確認をします。
```
$ docker ps
CONTAINER ID   IMAGE                                          COMMAND                  CREATED         STATUS                          PORTS     NAMES
2c49f015a44c   na2na/raspios_full_arm64:2022-04-04_bullseye   "bash"                   3 minutes ago   Up 3 minutes                              nervous_turing
```

最後に`docker commit`します。

```
$ docker commit 2c49f015a44c na2na/raspios_full_arm64:2022-09-07_bullseye
```

一応起動確認します
```
$ docker run -it na2na/raspios_full_arm64:2022-09-07_bullseye
```

## DockerHubにPushする

```sh
$ docker login # DockerDesktopがあるならそっちでも良さそう
$ docker images # イメージの確認
REPOSITORY                                               TAG                   IMAGE ID       CREATED          SIZE
na2na/raspios_full_arm64                                 2022-09-07_bullseye   920f69ea5844   2 minutes ago    6.32GB
$ docker push na2na/raspios_full_arm64:2022-09-07_bullseye
```


# 終わりに

特に作業で引っかかる箇所はありませんでした。安心してラズパイ関係の開発ができますね。
~~なおliteで良かったんじゃないかという声も(私の中では)ありますが、それは同じ手順で作ればいいだけなんじゃないですかねというのでひとつ~~
JavaSilver学習方法

## 概要
大まかな手順としては以下のようになります。
1. プログラミング言語の学習方法についてまとめる
1. 資格勉強の方法についてまとめる
1. 工夫を考える
1. 実践する

## そのプログラミング言語で作りたいもの決める
プログラミング言語の学習のために何を作りたいかを決めます

参考↓

https://www.yukisako.xyz/entry/howtoprogramming

#### 例 :
簡単なゲームアプリを作りたい。
Androidアプリを作りたい

## 資格勉強のための情報を集める
まず、良い学習方法を調べます。
この時点で、必要な書籍や動画などが決まります。

参考にした学習方法 : 

https://qiita.com/key_sharp/items/932563d73c7ebed479db

## 工夫
#### 1.習慣を利用する
細かいスケジュールを立てるよりも、習慣的に学習することが結果的に楽でした。

#### 2.自分の好きな分野に関連させる
上記の ｢作りたいものを決める｣ にも関連するのですが、
Javaで作れるもので、自分の好きな分野に関連するものがないか調べました。

その結果、 当時アプリ開発とゲーム開発に興味を持ったので、
時間を設けて以下のことをやっていました。
- Swingを用いたゲーム開発
- Androidアプリ開発

#### 3.スケジュールを短縮していく過程をモチベーションにする
あらかじめ余裕を持ってスケジュールを立てます。
そして、1日1日の課題量を少なめに決めます。

その上で次の日の課題を前日にこなすことを毎日目標にしていきました。
結果、予定が日に日に早まっていくので
モチベーションを高めることができ、当初の予定よりも短縮できました。

#### 4.暗記
暗記は、まっさらな脳内に何かしらの足がかりを作る、
初期の工程と考えています。

私が実際に行ったことは以下のとおりです。
1. 知らないことを見つける
1. Anki(※アプリ)に記入する

※ Ankiは、フラッシュカードで暗記をするアプリです。
下記サイトでも紹介されています。

https://n-igaku.com/anki_app/


[ 注意 ]
ビギナーの時期は暗記が有効ですが、
中級以上のシーンでは意味の理解も欠かせません。

#### 5.状況に関わらず早めにテストを受ける
本番を先送りにしがちですが、テストを受けなければ
テストに落ちることもありませんが、テストに受かることもありません。

## 具体的手順
①STEP1
模擬テストである12,13章を除く全ページを7日で分割し、スケジュール化。
毎回でてきた新しい用語や知識をAnkiへ(工夫4を参照)。
翌朝、昨日といた問題を再度解く。

②STEP2
12,13章を解く

③STEP3
すべて2周終わったら本番を受ける

## まとめ
この方法で厳密に言うと23日で合格することができましたが、
単に資格を取得したとしても技術のレベルは上がっていないと思ったほうがよいと考えていました。
実際に自分で設計して書いたコードの行数がエンジニアとしての技量に比例していると思うからです。

とはいえ、資格の取得は、学習力を示したり、未経験の方の就職活動の上では有効な手段になりえます。
どなたかのご参考になれば幸いです。
105.配列とループ分

# for関係
1.for(length)...:配列の要素数を,配列.lengthを用いて取得し、番号をキーとして要素の数だけループを行い、要素を取得する方法
2.for..in...配列の要素数をfor...inを用いて取得し、番号をキーとして要素の数だけループを行い、要素を取得する方法
3.for..of...配列の要素そのものを取得する方法
## 1-3をそのまま取得してみる
```javascript
const arry =["a","b","c"]
// 1.for(length)...:
for(var i=0;i<=arry.length;i++){
	console.log(i)
}
// 2.for..in..
for(let v in arry){
 console.log(v)
}
// 3.for..of...
for(let v of arry){
 console.log(v)
}
```
## 出力結果
#### 1.for(length)...:
![スクリーンショット 2022-09-07 9.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/da771087-2d28-529b-fe82-9cd26cbd595b.png)
<point>数値で、要素番号が取得されます
#### 2.for..in...
![スクリーンショット 2022-09-07 9.05.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/244dd704-438b-03bc-e752-21ed2b72afb9.png)
<point>"文字列"で、要素番号が取得されます
#### 3.for..of...
![スクリーンショット 2022-09-07 9.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/43d2278b-42f9-cbd5-4720-7c8e009e418f.png)
<point>要素そのものが取得されます
### 実際に要素を取得する手順

1.for(length)...: 
```javascript
// 1.配列をスコープ外に生成
const arry = [0,1,2,3,4]
// 2.for文を作成する。arry.lengthを使うと要素数が取得できる
for(let i = 0;i < arry.length;i++){
// 3.iを要素番号に指定する
	console.log(arry[i])
}
```
2.for..in...
```javascript
// 1.左辺に変数を生成する。（これが出力される数値となる）
// 2.右辺に配列を格納する。
for(let v in arry){
// 3.vを要素番号として取得する。
 console.log(arry[v])
}
// 3の部分だが、数値が”文字列”として取得されるので
// console.log(arry[Number(v)])と型変換してあげるのが本来は正しいやり方
```
#### 3.for..of...
```javascript
// 1.左辺に変数を生成する。（これが要素そのものになる）
// 2.右辺に配列を格納する。
// 3.ただただ要素を取得
for(let v of arry){
 console.log(v)
}
```


# while
#### 手順

![スクリーンショット 2022-09-06 18.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/3deb34cd-77d7-3c41-afba-5a4bc1d74609.png)
# while
1.変数を2つ用意する→スコープ外にて宣言
2.配列[i++]を順番に繰り返しVに代入し続ける
3.代入し続けたものを表示する
4.存在しない配列番号になった時に返却されるのはundefind
  つまり(undefind)はfalseと判定される（truethとfalsyの学習がここで生きる）
5.falseになってから終了
```javascript
const arry = [0, 1, 2, 3, 4];
let i = 0;
while (i < arry.length) {
    console.log(arry[i++]);
}
```
thisキーワードは難しい

# 概要
オブジェクトを定義して、その中のメソッドでthisを使うと、想定外(と思ってしまう。勉強不足で)の動き方をしている。
しかし、よく勉強してみると、当然かと思うこともある。
オブジェクトの中のプロパティやメソッドを参照しているつもりが、もっと上のwindowオブジェクトで、ブラウザーのjavascriptエンジンがそれらのプロパティやメソッドを探していたためで、その時はundefinedエラーになる。例えば、メソッドが見つからないとか。なぜ、windowでなく、定義したオブジェクトに探しに行かないのか。この原因について、勉強を重ねた。

# サンプル
以下は、そのサンプルです。
まず、TubeListオブジェクトを定義しています。いくつかのpropertyと、メソッドがあります。

```
//抜粋 
let TubeList = {
//プロパティ定義
    site_name: "",
    aaa:"",
    youtube_timer: null,
    ・・・
    //メソッドの中で、thisを使っています。
    content_ready (){
        ・・・
        //(注1)抜粋
        this.countdown(this.aaa);
        ・・・

        //(注2)抜粋
        //再帰コール
        this.youtube_timer = setTimeout(this.content_ready.bind(TubeList), 1000);
        return;
    
    },
    countdown (aaa){
        ・・・
    }

};

//(注3)抜粋
//TubeListオブジェクトの外側で、bind()しています。
//1秒毎にリストを取得
TubeList.youtube_timer = setTimeout(TubeList.content_ready.bind(TubeList), 1000);
・・・
```
このサンプルは、「なつかしの曲(ポータル)」サイトで使用しているプラグインでyoutubeサーチをするスクリプトの抜粋です。一秒毎にスクロールして動画タグを収集しています。
問題は、このサンプルで、TubeListオブジェクト内でthisを使っているところでundefinedエラーが発生しました。(注3)で対策前は、bind()していませんでした。そのため、setTimeoutでcontent_readyメソッドを呼び出した時のcontent_readyメソッド内で使用しているthisはwindowオブジェクトになっていたためです。
thisはTubeListオブジェクトを参照させるため、.bind(TibeList)を使用しました。そうすると、content_readyメソッド内のthisは想定通り、TubeListオブジェクトを参照してくれました。

# 参照するスコープが想定外だった。
thisの参照先が定義したオブジェクトでなく、windowオブジェクトだったとわかった時はがっかりする。なぜだろうかと、理解不足の時は困惑していた。様々な記述方法で試してみたが、一向に解決しなかった。
試行錯誤を重ねているうちにある時、何とか動作した。
.bind()を書く書き方である書き方にたどり着き、うまく動作した。
構文の書き方を熟知してなく、手あたり次第に試していて時間がかかった。
仕様を呼んでもすぐには動かない。やはり、泥臭い作業が必要か。

# メソッドの親指定は、オブジェクト名かthisか
サンプルで、メソッドを参照する場合、そのオブジェクト名を直接指定しても動作した。TubeList.content_ready()とか、一方、thisを使う方が
なんかスマートな感じがしていたので、何とかthisで動作させようと四苦八苦していた。
どちらが、いいのか。
ソースコードの可読性からはthisはわかりにくい。直接、オブジェクト名を記述した方が可読性はよい。
二つの参照先があると、うっかりすると、windowオブジェクト内に、定義したオブジェクトのプロパティデータを入っていたりする。
以後、そのwindowオブジェクトのプロパティデータで処理が続行していたりする。定義したプロパテイは空データのままだったりする。
バグの温床になりかねないが。どうしたらいいのか、思案中。strictを指定すべきか。

# あとがき
オブジェクトのメソッド内でthisを使用するには注意が必要と感じました。setTimeoutやalert,console.logなどのwindowオブジェクト
を使用するときはこの対策が必要になります。他にも、.call()や.apply()メソッドなどあるようですが、まだ試していません。
追記
call() apply()メソッドは、以下のサイトで勉強させていただきました。
このサイトはわかりやすいです。
参考サイト
https://tcd-theme.com/2021/12/javascript-call-apply.html
識別子を見つける能力が重要だと思った話

# はじめに

私がIT業界で仕事を始めて20年近く経ちました。主にWebアプリケーションとそれに関連するバッチアプリケーションの構築を行ってきました。要件定義、アーキテクチャの検討、設計、実装基盤の作成、テスト、保守、等様々な業務を経験させてもらいました(特に実装基盤の作成が多かったと思います)。

そういった経験を踏まえて、情報技術者にとって一番重要な能力は何だろう？と考えてみたところ、**識別子を見つける能力**だと思いました。

ここでは、その理由を書いてみます。

# 用語の定義

`識別子`とは、ある情報を**特定の条件**下で**唯一**に識別するための要素(1つ or 複数)、としておきます。

# 識別子の重要性

情報システムは情報と情報を繋げることによって利便性の高いシステムを構築しています。よって繋げるルールが重要になります。

その中核となるのが識別子です。

識別子が曖昧だとどんなことになってしまうのか、例を挙げてみます。

# 例:大学生の識別子

ある大学で、学生を管理するシステムが構築されているとします。入学した際にシステムが発行する連番を各学生に割り当てています。この連番が識別子になります。この時点では学生の識別子は明確です。


|学生の識別子|所属大学|名前[^1]|
|-|-|-|
|**1**|ホゲタ大学|田中 亮|
|**2**|ホゲタ大学|高橋 志保|


別の大学でも同様のシステムが構築されているとします。識別子も同様のルールで割り当てられています。

|学生の識別子|所属大学|名前[^1]|
|-|-|-|
|**1**|タコガミ大学|森 真弓|
|**2**|タコガミ大学|山口 浩|

では、日本全体で大学生を管理するシステムを構築しようとした場合、学生の識別子は何になるのでしょうか?
とりあえず、先に挙げた連番を識別子としてみましょう。

|学生の識別子|所属大学|名前|
|-|-|-|
|**1**|ホゲタ大学|田中 亮|
|**2**|ホゲタ大学|高橋 志保|
|**1**|タコガミ大学|森 真弓|
|**2**|タコガミ大学|山口 浩|

同じ識別子の人が被ってしまっています。これでは大学生を**唯一**に識別することができません。😫

例えば、田中 亮さんがTOEICの試験を受けて、その結果をこのシステムに登録した場合、森 真弓さんにもその結果が紐づいてしまいます。

|学生の識別子|TOEICの結果ID|
|-|-|
|**1**|T00001|

ではどうすべきでしょうか?

# 識別子を見つける

日本における大学の識別子と組み合わせることで識別子を実現できます。尚、大学の識別子は日本のどこかで管理されているものとします。

|大学の識別子|学生の識別子|所属大学|名前|
|-|-|-|-|
|**A01**|**1**|ホゲタ大学|田中 亮|
|**A01**|**2**|ホゲタ大学|高橋 志保|
|**B98**|**1**|タコガミ大学|森 真弓|
|**B98**|**2**|タコガミ大学|山口 浩|

TOEICの結果もこのように管理できます。

|大学の識別子|学生の識別子|TOEICの結果ID|
|-|-|-|
|**A01**|**1**|T00001|

よって、日本の大学生の識別子は `大学の識別子` と `学生の識別子` の2つとなります。😊

# 原因

先の例の場合、**特定の条件**が変更されたことが原因となり、識別子が成立しなくなってしまいました。

<dl>
  <dt>元の条件</dt>
  <dd>ホゲタ大学において (もしくは、タコガミ大学において)、大学生を唯一に識別できる。</dd>
</dl>
<dl>
  <dt>変更後の条件</dt>
  <dd>日本全国において、大学生を唯一に識別できる。</dd>
</dl>

このように、**特定の条件**が変わることで識別子が成立しなくなります。ということはシステムが機能しなくなります。

**特定の条件**の重要性が分かるかと思います。

# 開発業務への適用

ここまで簡単な例で説明してきましたが、要は、

:::note
識別子を見つける能力 = 識別子が成り立つ特定の条件を見つける能力
:::

を主張したかったのです。

なんちゃらIDが存在すればそれが識別子の様に見えてしまいますが、安易に飛びつかずに**特定の条件**を考察するのが良い選択だと思います。

たまに、複雑な条件のもとに成り立っている識別子に遭遇することがあります。この場合、ちょっとしたことで識別子が成り立たなくなってしまう可能性が高くなるので注意が必要です。

# まとめ

情報技術者にとって識別子は心のよりどころです。識別子を見つける能力(=識別子が成り立つ特定の条件を見つける能力)を身に着けることは安心してシステムを開発するための必須スキルだと思います。😀


[^1]:[すごい名前生成器](https://namegen.jp/) で名前を作成しました
【過去トラ】kintoneのカスタマイズビューが一覧に表示されない

kintoneのカスタマイズビューの過去トラ記事です。

https://jp.cybozu.help/k/ja/id/040612.html#view_set_view_2030

カスタマイズビューを作成しても一覧に表示されないことがあります。
カスタマイズビューは、JSによるカスタマイズが前提となるので、アプリの設定画面の「JavaScript / CSSでカスタマイズ」メニューにて適用範囲が下記のようになっていることが必要です。

![スクリーンショット 2022-09-07 9.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/10b03a84-5519-f377-1380-334ea374da89.png)

ここが「適用しない」や「アプリ管理者だけに適用」となっていると、通常利用するユーザーの一覧にカスタマイズビューが表示されないので注意してください。

JSを使わない場合でも、カスタマイズビューが前提のプラグインを利用する場合などは、ここの設定が「適用しない」となっていると、一覧にカスタマイズビューが表示されません。
プログラミングの原理原則

**SRP (単一責務の原則)**
参考：https://qiita.com/riekure/items/904f56713c3e213920fa

**OCP (オープンクローズドの原則)**
参考：https://qiita.com/riekure/items/41c891c50a868cfd5939

**LSP (リスコフの置換原則)**
参考：https://qiita.com/riekure/items/cfc6f8e160ec975153ba

**ISP (インターフェイス分離の原則)**
参考：https://qiita.com/riekure/items/8b6b8adf641285e22113

**DIP (依存関係逆転の原則)**
参考：https://qiita.com/riekure/items/ab6b5deb391399944a15

**CQS (コマンド/クエリ分離の原則）**
参考：https://rakusui.org/cqs/

**DRY (Don't Repeat Your Self 原則)**

同じコードを重複して書かないこと

- コードを読む作業が難しくなる
- コードを修正する箇所が多くなる
- テストがない可能性が高い
【WordPress】Lazy Blocksでget_lzb_metaに入れた画像が表示できなくて困った

## Lazy Blocksについて

https://lazyblocks.com/

Gutenbergのカスタムブロックを追加できるプラグインです。
自由にclass名を定義することができるので、すごく便利です。
詳しい使用方法は、他の記事をご参照ください。

https://olein-design.com/blog/wordpress-lazy-blocks

## 問題点
Lazy Blocksで`get_lzb_meta`を使用した画像を埋め込むフィールドを作成しましたが、管理者以外の権限で画像埋め込みフィールドを使用しようとしたところ、画像のプレビューが表示されなくなってしまいました。
`get_lzb_meta`を使用しないフィールドは普通に表示されていました。

## 原因
新しい権限を作成した際に、デフォルトの投稿(post)の権限を付与し忘れていたためでした。

::: note
デフォルトの投稿(の権限を付与してあげないと`get_lzb_meta`に設定した画像が表示されないです。
:::


そのため、デフォルトの投稿に関する権限

```
read_private_posts
edit_posts
delete_others_posts
delete_posts
edit_others_posts
```

を設定すればmeta情報が読み取れます。

## 結論
Lazy Blocksプラグインを使用&新規の権限を作成する場合は、デフォルトの投稿に関する権限を追加することを忘れないようにしてください。
WordPress管理外のファイルからWordPressの記事一覧を表示させる方法

## WordPress開発時の悩み

静的ファイルとWordPressを共存させるサイトを作ることが最近多いです。

その時に、
**WordPress管理外のファイルからWordPressの記事一覧を表示させたい**
ということが頻繁に起こります。

- トップページのみ特定のカスタム投稿の最新5件を表示させたい
- あるページにだけ特定のカテゴリを表示させたい

という場合にどう対応すべきか検討した結果を記載します。


## ①WP_Filesystemのput_contentsを使用して静的ファイルを吐き出す
### 実装方法
「記事ステータスが変更された際に静的ファイルを吐き出して、SSIでインクルードファイルを生成しようぜ！」
というノリです。

WordPressのファイル操作用オブジェクトであるWP_FileSystemを使用して行います。

https://qiita.com/awesam86/items/671d03dce21c74164ed3


::: note
記事ステータスが変わるのを検知するフックはwp_after_insert_post（WordPress5.6に実装されたフック）を使用します。
以下のフックだと、アイキャッチ画像やタグが読み込まれないです。
『pre_post_update』 『edit_post』 『post_updated』 『save_post』 『wp_insert_post』
:::
### メリット
- 記事投稿で静的ファイルを好きな場所に生成できる
### デメリット
- 予約投稿では起動しない（代替cron なら可能）
※代替 cron だとリダイレクトの仕組みを使用しているため、アナリティクスで変な数値が出てしまう。（WordPressの公式も本番では使わないようとのこと。）

https://ja.wordpress.org/support/article/editing-wp-config-php/

## ②file_put_contents（php の機能）を使用して静的ファイルを吐き出す
### 実装方法

WP_Filesystemを使用せずfile_put_contentsを使用するだけなのでほぼ記述は①と同じ

### メリット
- ① と同じ
### デメリット
- ① と同じ+WordPress から非推奨とされる

## ③ サーバーの cron を使用する

### 実装方法

すいません、、、これはわからなかったので書けません。。。

### メリット

- 定期的に処理ができるので漏れが少ない

### デメリット

- 障害が起きたときに対応しずらく、管理ができない可能性（サーバーに関する知識があれば別）
- ローカルのファイルで管理することができない

## ④WordPress エンジンを起動させる

### 実装方法

以下のコードを使用したいファイルに記述する
```php 
// /hoge/wp-load.php←/hoge/はWordPressがインストールされている場所
require_once($_SERVER['DOCUMENT_ROOT'] . '/hoge/wp-load.php');
```
上記の記述をすることで、WordPressのエンジンが起動するので、WordPressで定義した変数だったりショートコードなども自由に使用することができます。
※`.htaccess`でhtmlでもphpを動かせるようにしておくと便利です。

:::note warn
WP-optimizeというプラグインのキャッシュ機能を使うと、謎の大量エラーを吐きます。キャッシュ機能がうまく動かなくなるせいです。
キャッシュ機能のみ停止するか、キャッシュ対象から外すようにしてください。
:::

::: note warn
`require_once`の記述は、`<!DOCTYPE html>`宣言の前に書いてください。
初回読み込み時にエラーが起こるのを防ぐためです。
:::

### メリット
- 仕組みが単純なので実装が簡単
- ローカルのファイルだけで対応できるので、管理がしやすい
### デメリット
- 静的ファイルと比べて0.9秒程度表示速度が遅くなる（WordPress 管理下のページと同じくらい）

## ⑤WP REST API を使用する。

### 実装方法

https://100webdesign.jp/services/wordpress/wp_result/wp_result-1026/

### メリット
- 他サイトの REST API を呼び込むことができるのでカスタム性が高い
### デメリット
- スライダーなどの JS を使用するとなるとREST APIの通信を待ってから起動させる必要があるため、なにも対応しないとJavaScriptエラーがおこる
- 表示速度が遅い（通信している間はコンテンツが空になる）
- 表示されなかったときや通信中のローディングアイコンなどの設定をする必要がある。

## どれがおすすめか
④の**WordPressエンジンを起動させる**が一番簡単で、かつ速度もあまり遅くなりません。
また、REST APIを使用しないため、JavaScriptの修正などをしなくて済むので一番おすすめです。

予約投稿を使わないのであれば①**WP_Filesystemのput_contentsを使用して静的ファイルを吐き出す**が表示速度も遅くならないで管理もしやすいためこちらもおすすめです。
WordPress6.0がリリースされたので、フルサイト編集、Gutenbergと向き合う （zennの追記）

## 元記事
https://zenn.dev/shin50/articles/2ac52ff7363f93

↑こちらが元記事になります。事情があり、zennからQiitaに乗り換えました。

## 追記

### Gutenberg、フルサイト編集についての今までとこれから【メリット】

#### アーカイブ一覧や投稿日一覧などがエディタで操作可能

フルサイト編集では、すべてのページをエディタ上でコントロールすることができます。
例えば特定の文字をループの上に差し込んだり、画像を入れ込んだりすることもエディタ上で操作可能です。

クライアント :speech_balloon:「記事一覧に●●●というテキストを入れたいんですが、、、」

今まで:expressionless:
archive.phpを編集してテキストを挿入、CSSを編集して空白や文字サイズなどを調整する。
→それらのファイルを本番環境にアップロードする。

これから:laughing:
フルサイト編集の操作方法を理解していれば、クライアント側で対応できる！

#### クエリーループが便利
記事の途中に関連記事を出したいときに、Gutenbergのブロックを使用すれば、クエリーループを使用して吐き出すことができます。（もちろん、限界はある。）

今まで:expressionless:
この文章の下に、関連の投稿一覧を表示させたいんだけど、できないからとりあえずリンク張っておくしかないか、、、

これから:laughing:
クエリーループを使用すれば好きな投稿タイプ、カテゴリーの一覧を出すことができる！

#### ループの概念が理解できていれば、独自テーマのようなカスタマイズができる。【メリット】
ループとGutenbergのブロックの使用方法がわかっていれば、フルサイト編集で独自テーマのようなものも開発できてしまう。
しかも、WordPress6.0からエクスポートができるようになった。

今まで:expressionless:
PHPの知識が十分にないとテーマのカスタマイズが難しい、、、

これから:laughing:
フルサイト編集で、これまでよりもテーマに依存せずにカスタマイズすることができる。
（Gutenbergに依存します。カスタム投稿を追加するなどのことはできません。）

### Gutenberg、フルサイト編集についての今までとこれから【デメリット】

#### CSSについて
WordPressは、独自のCSSを追加してスタイルを調整するという従来の方法から、theme.jsonだけでCSSを管理する方法に変えることを目標にしている。すべてはGutenbergにコントロールされている。

今まで:laughing:
Gutenbergの機能を制限すれば、CSSは開発者の自由に決めることができる。

これから:expressionless:
Gutenbergのブロックをほとんど使用することになるので、CSSで調整することが難しくなっていきそう。

::: note
GutenbergのCSSは、WordPressのアップデートの度に微妙に調整されることが多いので、アップデートをされた際に、サイトの表示が崩れる可能性がある。そのため、Gutenbergを中心としたサイト構築を進めた際は、アップデートの時に、どの部分のCSSが変更されたかを確認して、該当のブロックが使用されている記事の確認をする必要がある。
::: 

#### デザインの表現が難しい。
Gutenbergが吐き出すブロックに合わせてパーツを作成する必要があるので、CSSで調整するには普段の3倍くらいの時間がかかる。

今まで:laughing:
テンプレートで好きな場所にループを使えば良くて、class名も自分で調整できるから、デザイン通りに表現するのはそんなに難しくない！

これから:expressionless:
すべてがGutenbergに支配されているので、Gutenbergが吐き出すCSSを元にスタイリングをする必要があるから、今まで通りには難しそうだ。

### 自由度を高くするためには
GutenbergのブロックをReactを使用して自分で組み立ててそれを使ってテーマを作るのが一番自由度が高く作れる（ですが、メンテナンスがめちゃくちゃ大変、、、）

https://www.webdesignleaves.com/pr/wp/wp_block_basic_jsx.html

## 提案
フルサイト編集ができるテーマをクライアントに提案する場合、以下のような事項を検討すべきです。
- フルサイト編集でクライアントが誤って操作をした際に、サイトが崩れた時の対応
- フルサイト編集の説明（クライアントで頑張って覚えてもらうしかない）
- WordPressのバージョンアップ時のCSS崩れ調査
- テスト環境と本番環境の同期をどうするか
（むしろ、テスト環境というものがないことが前提となっていそう。。。WP STAGINGなどのプラグインを使用したテスト環境で運用していくのがいいのかもしれません。）

## 結論
フルサイト編集に関しては、もう少し様子を見ようと思います。
React使用してブロック開発も面白そうなのですが、工数がかなりかかりそうです。
※Advanced Custom Fields Proを使用したブロック開発が一番手軽でなおかつ自由度があるので、そちらの記事も後ほど掲載します。
GitHubとは何かと、使い方

# Gitとは？
一言で言うとバージョン管理システム。
ファイルの更新履歴も管理できるので、編集前の状態に戻したり、差分が確認できて便利。
CUIのツール。

# GitHubとは
Gitで管理しているファイルを、世界中の人々が公開できるウェブサービス。「Git」の「Hub」。
自分以外の人にGitで管理しているプログラムを公開したり、自分以外の人も編集できるようにできる。
GUIのツールなのでわかりやすい。

# リモートリポジトリ
専用のサーバーに配置して、みんなで共有/管理するためのリポジトリ

# ローカルリポジトリ
自分のPCでに配置するリポジトリ。

# コミット
ファイル/ディレクトリの追加や編集の履歴を記録するためにコミットをする。
これによって変更履歴が作成される。
この時、自分が何をしたのか、誰がみても理解できるコミットメッセージを入力する。

# プッシュ
リモートリポジトリにローカルリポジトリの編集履歴共有する時ことを指す。

# ブランチ
現在リリースしているバージョンをメンテナンスしながら、新機能の開発やバグ修正を行う。
みたいな時に、並行して複数のバージョン管理をするための機能。
分岐した履歴の流れを記録する。

# プルリクエスト
自分が行った作業をオリジナルのリポジトリに反映したい時に使う。
オリジナルのオーナーにプルリクエストの通知が届く。

# マージ
プルリクが届いたオーナーは、その変更を自分のリポジトリに合体できる。
量子ビットとは？

$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$
私達が普段使っているようなコンピュータは量子コンピュータと区別して、古典コンピューターと呼ばれます。

古典コンピュータでは、情報は0と1の組み合わせで表現され、この0や1を「bit」と呼びます。
これを8つ合わせてbyte、さらにたくさん集めると、GB（ギガバイト）やTB（テラバイト）になるわけです。

このbit、量子コンピュータでは区別のため、Quantum（量子） bit と呼び、
さらに省略して「Qubit」や「q-bit」と呼ばれることが多いです。

さて、この「q-bit」、単純な0,1で記載すると都合が悪いため、

```math
(古典コンピュータでの0)=
\begin{pmatrix}
1 \\
0
\end{pmatrix}
、
(古典コンピュータでの1)=
\begin{pmatrix}
0 \\
1
\end{pmatrix}
```

と表記します。
と、いきなり行列で書きましたが、
これまで、0と1で済んでいたものが毎回行列で書かないといけない。
これは面倒すぎてやってられません
そこで、ケットと呼ばれる見慣れないカッコで囲うことで楽をしましょう。
```math
\begin{pmatrix}
1 \\
0
\end{pmatrix} = \ket{0},
\begin{pmatrix}
0 \\
1
\end{pmatrix} = \ket{1}
```
さて、q-bit上での「0」と「1」の表記をすることができるようになりました。
あるq-bitを
```math
\ket{\psi}
```
と仮に記載するとすると、古典コンピュータ的な考え方では、
このq-bitは$\ket{0}$,$\ket{1}$のどちらかの状態をとるはずです。
ところが、量子コンピュータでの考え方では、
q-bitでは2つの状態の重ね合わせの状態が許されているので、
どちらの状態をとるか観測するまでわかりません。
ですので便宜上どちらになってもいいよう
```math
\ket{\psi} = \begin{pmatrix}
\alpha \\
\beta
\end{pmatrix}
```
と表すことにしましょう。
これを$\ket{0}$,$\ket{1}$を使って表してみると、
```math
\ket{\psi}= \begin{pmatrix}
\alpha \\
\beta
\end{pmatrix} = \alpha\begin{pmatrix}
1 \\
0
\end{pmatrix} + \beta\begin{pmatrix}
0 \\
1
\end{pmatrix}
=\alpha\ket{0}+\beta\ket{1}
```

と記述することができます。この最後の式

```math
\ket{\psi} = \alpha\ket{0} + \beta\ket{1}
```
これこそが量子コンピュータで扱う量子ビットの表現になります。

$\alpha$, $\beta$ はそれぞれ、$\ket{0}$, $\ket{1}$にかかる重みで「複素確率振幅」と呼ばれ、それぞれになる確率の平方根の値を取ります。[^1]
複素？確率？振幅？もう嫌な予感のワードのオンパレードですが、ここの物理的な意味を考え出すのは沼の入り口なのでひとまず、「ふむ量子ビットはこうやって表現するきまりなのか」位に思っておいたほうがいいです。

ここで、$\alpha$, $\beta$は下記の式を満たします。絶対値を取っているのは複素数まで拡張するため[^2]なのですが、まぁ難しいことはさておき、$\ket{0}$, $\ket{1}$のどちらかにはなるので、両方とも0になることはないんだなぐらいの理解でいいかと思います。

```math
|\alpha|^2 + |\beta|^2=1
```

さて、量子ビットを定義したところで、少し余談にはなりますが、この量子ビットで遊んでみましょう。古典ビットでは、0か1のどちらかしか取れませんでしたが、量子ビットでは、50％の確率で$\ket{0}$, $\ket{1}$のどちらかになる状態というものを取ることができます。

$\alpha$, $\beta$はそれぞれ、二乗した絶対値が確率でしたので、

```math
|\alpha|^2 =\frac{1}{2}, |\beta|^2=\frac{1}{2}
```

量子ビットは下記のように書き表せます。

```math
\ket{\psi} = \sqrt{\frac{1}{2}}\ket{0} + \sqrt{\frac{1}{2}}\ket{1}
```
この量子ビットでは、$\ket{0}$, $\ket{1}$のどちらの状態になるのかが、測定するまでわかりません。どちらになりやすいといった傾向もなくランダムです。古典コンピュータでは実現できていない真性乱数が量子コンピュータでは理論上可能なのです！と、まぁ理論上は可能なのですが、実際にはハードの精度や、信頼性の担保など問題は多かったりと、実現への努力がなされています。

[^1]:$\alpha$, $\beta$は確率の平方根で表されるのですが、実験的には一度規格化というものをする必要があります。
[^2]:複素数というと、拒絶反応が出る方も多いかと思いますが、「ブロッホ球」でぐぐってみると、視覚的に理解しやすいかもです。
AmprifyでAuth.signOutをしているのにページ遷移しないので一時対応する

# はじめに

以下の書籍をやっていてつまづいた箇所があったのでまとめます

https://www.amazon.co.jp/AWS-Amplify-Studio%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89-%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%E7%B5%B1%E5%90%88%E9%96%8B%E7%99%BA-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/489977530X/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3UOTRC2M34VRF&keywords=aws+amplify&qid=1662507988&sprefix=aws+ampli%2Caps%2C665&sr=8-7


# 問題

`Auth.signOut`を実行するとログイン画面に遷移すると書いてありました

```jsx:App.jsx

        <h2>
          <a className="App-link" href="." onClick={Auth.signOut}>
            Sign Out
          </a>
        </h2>
```

しかしクリックをしてもログイン画面に遷移しませんでした。
また、ローカル環境でも遷移しませんでした

# 解決方法

一度リロードをかけることで遷移するようになりました

```jsx:App.jsx
import { Amplify, Auth } from "aws-amplify";
import { withAuthenticator } from "@aws-amplify/ui-react";
import "@aws-amplify/ui-react/styles.css";
import aws_exports from "./aws-exports";

Amplify.configure(aws_exports);

const click = () => {
  Auth.signOut();
  window.location.reload();
};

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <h1>Sample React app</h1>
        <h2>
          <a className="App-link" href="." onClick={click}>
            Sign Out
          </a>
        </h2>
      </header>
    </div>
  );
}

export default withAuthenticator(App);
```

リロードはReactを利用するうえではベストな対応ではないので暫定的に行っています
今回は書籍のハンズオンをやる目的なのでこのまま進めました

# おわりに

この問題は起こって悩む人がいそうですが、あまりネットに情報がなくハンズオンにいきなりつまづきました
Linux syslog、rsyslogについて（自分用メモ

●syslog
ログメッセージを送受信する規格。クライアント・サーバ型で、サーバ内部で利用されるだけではなく、ネットワーク越しに他の機器（ルータなどのネットワーク機器、外部のサーバなど）からのログメッセージを受信することもできるが暗号化機能がない。また、UDP（ポート512番）を使用しているため、サーバにログメッセージが届いていることが保証できない（TCPのように確認応答がない）

これらの問題点を克服した次世代のsyslog-ngやrsyslog

rsyslogはrsyslogdというデーモンによって制御。設定ファイルは「/etc/rsyslog.conf」

モジュール設定、グローバル設定、ルール設定（どのログをどこに出力するか）に分かれ、「/etc/rsyslog.d」ディレクトリに拡張子.confのファイルを追加して設定を読み込むこともできる。
設定を変更した場合は、rsyslog.serviceを再起動する必要がある。

 systemctl restart rsyslog

●rsyslogで扱うログメッセージの分類

■主なファシリティ（ログの送信元）
・auth,authpriv 認証サービス
・daemon デーモン各種
・kern カーネル
・lpr 印刷サービス
・mail メールサービス
・syslog syslogdサービス
・user ユーザアプリケーション
・local0~7 独自に使用化

■プライオリティ（監視レベル）
・emerg 非常に危険
・alert 緊急対応が必要な状態
・crit 危険な状態
・err 一般的なエラーメッセージ
・warning　警告メッセージ
・notice 通知メッセージ
・info 情報メッセージ
・debug デバッグ時に有益な情報
・none メッセージを送らない

ファシリティとプライオリティを組み合わせてログを特定し、指定した宛先に出力
ファシリティとプライオリティをあわせて「セレクタ」

ファシリティ.プライオリティ アクション

※
・全てのファシリティや全てのプライオリティを指定するには「*」を使う
・プライオリティは、指定したレベル以上のログを出力。特定のレベルのログだけを指定するには、「=プライオリティ」とする。
・アクションには、出力先を指定。出力先は、ファイルであれば絶対パス、外部のsyslogサーバであれば「@サーバアドレス」。全ユーザーのコンソールに送信したい場合は「*」を指定。
・アクションの先頭に「-」を付けるとログを非同期で書き込む（デフォルトは同期書き込み）。負荷を軽減できるが、急な停電時にディスクに書き込まれていない分のログが消失する可能性がある。
・「;」でつなぐことで、1つのアクションに対して複数のセレクタが指定できる
【VBA】ステータスバーに処理の進捗状況を表示するモジュール

処理が多くて画面表示を停めている場合に、フリーズしていないか不安になったので入れてみました。



'’ステータスバー表示’あたま
  Dim i As Integer
  Dim S As String

  S = "Sub名" 'Sub名

  For i = 1 To 10
  Application.StatusBar = S & "_" & "実行中" & String(i, "■") & String(10 - i, "□")
  Application.Wait [Now()+"00:00:00.2"]
'’以下、動作



''ここに操作内容を入れる。



 
'’以上、動作
'’ステータス表示’お尻
Next i
Application.StatusBar = False 'ステータスバーを非表示
[pandas] read_csv の備忘録

pandasのread_csvについて。
いい例はないものかと思い、せっかくなので太陽黒点数使ってみた。


# 公式のdocumentation
- [User Guide -- pandas 1.4.4 documentation](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html)

# 目次
- 動作環境
- 今回使用しているcsvデータ
- read_csvの使用例

# 動作環境
|種類             |バージョン       |
|:---------------|:--------------|
|MacBook Air     |Monterey12.5.1  |
|python          |3.8.9          |
|jupyter notebook|6.4.10         |
|pandas          |1.4.3          |

まずはパッケージのインポートから
```python:
import pandas as pd
```
pandasを扱うときはpdが慣例だそう。

# 今回使用しているcsvデータ
せっかくなので太陽黒点の1日の個数の年平均データを使ってみた。
[Sunspot Number | SILSO](https://www.sidc.be/silso/datafiles#)
このHP中のTotal Sunspot Number->Yearly mean total sunspot number [1700 - now]からcsvの箇所をクリックしてDLできる。
テキストで一例を示すと
```python:
2021.5;  29.6;  7.9; 15233;1
```
で、上記のcsvと同じ行にあるINFOから確認をすると左から順に
1. 年(平均を取っているので.5)
2. 黒点の全球平均個数
3. 各観測所の観測個数の標準偏差の年平均
4. 観測値点数
5. 確定=1, 暫定=0
という値を示している。

# read_csvの使用例
```python:
df_SN = pd.read_csv('SN_y_tot_V2.0.csv'
                    , sep=';'
                    , dtype={0:float, 1:float, 2:float, 3:int, 4:int}
                    , names=('年', '個数', '標準偏差', '観測値点数', '確定or暫定'))
```
順に、
csvファイル名: 相対パス
sep= :csvファイル内の値の分割基準を指示(今回は';'、デフォルトは',')
dtype= :各columnのデータ型を辞書型で指定。数字はcolumnの名称でもOK
names= :各columnの名称を指定できる。
となる。実際にデータ型をみてみると、
```python:
print(df_SN.dtypes)
# 年         float64
# 個数        float64
# 標準偏差      float64
# 観測値点数       int64
# 確定or暫定      int64
# dtype: object
```
となり、うまくいっている。

# 上記以外の利用法
今回のデータは元々ヘッダーが存在していない。このときに何も指定せずに読み込むと...
```python:
df_SN = pd.read_csv('SN_y_tot_V2.0.csv', sep=';')
df_SN.head()
#   1700.5	8.3	    -1.0	-1	1
# 0	1701.5	18.3	-1.0	-1	1
# 1	1702.5	26.7	-1.0	-1	1
# 2	1703.5	38.3	-1.0	-1	1
# 3	1704.5	60.0	-1.0	-1	1
# 4	1705.5	96.7	-1.0	-1	1
```
となりヘッダーとして自動的に最上段の行が出ている。
header=Noneとして読み込むと、
```python:
df_SN = pd.read_csv('SN_y_tot_V2.0.csv', sep=';', header=None)
df_SN.head()
#        0	   1	   2	 3	4
# 0	1700.5	 8.3	-1.0	-1	1
# 1	1701.5	18.3	-1.0	-1	1
# 2	1702.5	26.7	-1.0	-1	1
# 3	1703.5	38.3	-1.0	-1	1
# 4	1704.5	60.0	-1.0	-1	1
```
のようにcolumnに自動で数字を割り当てるようになる。

# 参考にしたURL
- [pandasでcsv/tsvファイル読み込み（read_csv, read_table）](https://note.nkmk.me/python-pandas-read-csv-tsv/)
【Linux】ファイル・ディレクトリ数のカウント/行数の確認を行う方法

# ファイル・ディレクトリ数のカウント/行数のカウントはwcコマンドを使う
簡単に数えるなら、wcコマンドがいいと思います。サクッと出来ます。
後輩から、「どうやって数えてるんですか？」と聞かれて、wcコマンドでやっているとお伝えしました。
今後もコマンド慣れてない人と仕事するかもしれないので、文面として残しておこうと思いました。

## 実際にやってみた
ファイル・ディレクトリ数のカウントについては、以下で行えます。
lsコマンドの結果を、|(パイプ)でwcコマンドに渡します。
wcコマンドでは、-lオプションを使用します。行数を表示するオプションです。

試しにやってみます。
3ファイル/3ディレクトリを作成します。

```:ファイル作成
[root@localhost tmp]# touch file_{01..03}.txt
[root@localhost tmp]# mkdir Dir_{01..03}
[root@localhost tmp]# ls
Dir_01  Dir_02  Dir_03  file_01.txt  file_02.txt  file_03.txt
```

そしたら、ファイル・ディレクトリ数をカウントします。
カウントされてますね。

```:ファイル・ディレクトリ数カウント
[root@localhost tmp]# ls | wc -l
6
```

お次に、ファイル内の行数を確認します。
file_01.txtに書き込みします。書き込んだら、一応中身を確認してます。

```:ファイルに書き込み
[root@localhost tmp]# ls > file_01.txt
[root@localhost tmp]# cat -n file_01.txt
     1  Dir_01
     2  Dir_02
     3  Dir_03
     4  file_01.txt
     5  file_02.txt
     6  file_03.txt
```

wcコマンドで行数の確認をします。
カウントされてます。

```:行数カウント
[root@localhost tmp]# wc -l file_01.txt
6 file_01.txt
```

## 終わり
何かの参考になれば幸いです。
終わりです。
Python,Ruby,PHP,Java,JavaScript,Perlの文法・構文の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの文法・構文の比較

# Python

https://qiita.com/Fendo181/items/a934e4f94021115efb2e

# Ruby

https://qiita.com/Fendo181/items/eb2cb17f32d99aa01f59

# PHP

https://qiita.com/7968/items/d739e926189e219273bd

# Java

https://qiita.com/tomonori_hioki/items/cec47a366208d43d7339

# JavaScript

https://qiita.com/Fendo181/items/cca476da99e8f09b6b97

# Perl

https://perlzemi.com/blog/20161022147731.html
【Docker, EC2, Node.js】The engine "node" is incompatible with this module. 

# 状況
・railsアプリの環境構築をDockerで行い、ローカルで動くことを確認し、EC2にデプロイしようとした。
・githubにコードを上げて、EC2にSSHログインしてgit cloneした。
・デプロイに際して、アセットプリコンパイルをしようとして、以下のコマンドを実行した。
```
docker-compose run app rails assets:precompile RAILS_ENV=production
```
・すると、以下のようなエラーが跳ね返ってきた。
```
error http-proxy-middleware@2.0.1: The engine "node" is incompatible with this module. Expected version ">=12.0.0". Got "10.24.0"
error Found incompatible module.
```
# 対処法
DockerfileのNode.jsのインストールのくだりを記述している部分がいけてなかったみたい。

・修正後のDockerfile
```dockerfile:Dockerfile
FROM ruby:3.0.0

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get -y install imagemagick

# Node.jsをインストール　今回はこのコード↓を修正
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - && apt-get install -y nodejs

WORKDIR /riskbuster

COPY Gemfile /riskbuster/Gemfile
COPY Gemfile.lock /riskbuster/Gemfile.lock

RUN gem install bundler
RUN bundle install
```
インストールするNode.jsのバージョンを指定する部分（```/setup_16.x```)が古いと発生することのあるエラーのようだ。

# 参考
https://qiita.com/guri_tech/items/f870ff52dce3a39e2d23
Rails7においてページをリロードしないとjavascriptが動かない


# はじめに
現在Rails7でアプリケーションを開発している。
javascriptでタブと画像プレビューを実装したが、ページをリロードしないとjavascriptが動かない問題に直面した。
いろいろ検索しているとturbolinksが原因であるということは分かった。
解決方法はいくつか見つかるがどれを試してもなかなか解決しなかったため、備忘録として投稿。

## Qiitaの記事などでよく見られた解決策
### 1.link_to ごとにturbolinksを無効にする
```html.erb
<%= link_to "hoge", root_path, data: {"turbolinks" => false} %>
```

###  2.jsファイルに"turbolinks:load"を記述する
``` .js
document.addEventListener("turbolinks:load", function() {
  //略
})
```
この二つの解決方法が多く見つかった。
実際に試してみるがどちらも解決に至らず、2に至ってはリロードしても動作しなくなってしまった。

## 実際の解決方法
application.jsの内容を書き換える
```application.js
import "@hotwired/turbo-rails"
//以下略
```
上記の一文を
```application.js
import { Turbo } from "@hotwired/turbo-rails"
Turbo.session.drive = false
//以下略
```
このように書き換える。

# 終わりに
turbolinksについてはまだまだ理解が不十分であり、解決策も対処療法的になってしまっている。
これを機にturbolinksについて理解を深めたいと思う。
Windows の更新には空き容量が必要です。

# 概要
asus e200haの空き容量を増やした手順です。

# 環境
ASUS E200HA
windows 10 home バージョン2004

# microsdを購入。
16GBのmicroSdカードを購入。スロットに入れる。

# フォーマットする。
DドライブをNTFSでフォーマットする。

# フォルダーを移動する。

C:\Windows\SoftwareDistribution\Download　を　Dドライブに移動。

# リンクを作成。

mklink /D C:\Windows\SoftwareDistribution\Download d:\Download

# updateを実行。

Windows 10、バージョン 21H2 の機能更新プログラム

# 再起動。

# ストレージを確認。

![disk0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/164b86e7-cc3c-5274-6ebc-9b6f1bfd71ea.png)


# 一時ファイルを削除。

以前のwindowsのインストール

![disk1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/405cc871-ef62-571e-863c-bf4d8c663e2e.png)


# 確認。

![disk3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/56f1265a-5a98-e32a-d415-53e44d3cfc32.png)


以上。
DNSSECの基礎とRoute53での運用

# 内容
<font color="Red">DNSSECのレコード検証</font>、<font color="Red">公開鍵検証の仕組み</font>と<font color="Red">Route53での運用方法</font>について記載します。手順通りにやれば導入は簡単に出来るものの、導入時のDSレコードの登録、運用時のキーローテションなど仕組みを理解しないと何をやっているか分からない箇所もあると思うので図解化しました。

# DNSSECの仕組み（レコード検証の仕組み）
![スクリーンショット 2022-09-07 6.23.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/6b44ca94-0582-e446-b905-f21803108959.png)
上記図は```PC（クライアント）```から```www.example.com```というレコードを```キャッシュDNSサーバ```に問い合わせ。```キャッシュDNSサーバ```から```権威DNSサーバ```にレコードを問い合わせて得られたレコードを```PC（クライアント）```に返す流れの図です。

## ①レコードに電子署名
Aレコード```A=1.1.1.1```に電子署名を追加して返すのがDNSSECです。下記を権威DNSサーバ側で実施します。まず、公開鍵```DNSSECKEY```、秘密鍵```ZSK```のキーペアを作成します。次にハッシュ関数を使用してAレコード```A=1.1.1.1```のハッシュ値```123456```を取得した後、秘密鍵```ZSK```で暗号化して電子署名```PRSIG=XXX```を作成します。クライアントからレコードの問い合わせがあった際は、```A=1.1.1.1```に電子署名```PRSIG=XXX```、公開鍵```DNSSECKEY```を付与してクライアントに応答として返します。

## ②レコードの電子署名の検証
クライアントは①のレコードを受け取り後、下記２つの値を取得して、値が一致していればレコードが改竄されておらず正しい相手から届いたデータであることを確認出来ます。
* ```A=1.1.1.1```に電子署名①と同様のハッシュ関数を使用してハッシュ値```123456```を取得をする
* 電子署名```PRSIG=XXX```を公開鍵```DNSSECKEY```で復号してハッシュ値```123456```を取得する

# DNSSECの仕組み（公開鍵の検証）
![スクリーンショット 2022-09-07 6.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/642f6055-ebe8-ba23-77fd-43ca107a8f7e.png)

```DNSSECの仕組み（レコード検証の仕組み）```の箇所で公開鍵が出てきましたが、この公開鍵の正当性を保証する必要があります。署名に使用する鍵は2階層になっていて、上記で出てきた```ZSK```の他にZSKに署名する```KSK```という秘密鍵が出てきます。このKSKに対する公開鍵```DNSSEK(KSK）```の正当性が保証できれば```KSK```に対する公開鍵```DNSSEK(ZSK）```の正当性も保証できるような流れになります。手順としてはまずハッシュ関数で```DNSSEK(KSK）```のハッシュ値を取得して```DSレコード```を作成します。この```DSレコード```を上位ドメイン側に登録してもらうことによって上位ドメインによって公開鍵の正当性が保証される仕組みになります。

# Route53でのDNNSEC運用
![スクリーンショット 2022-09-07 6.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5c1a3bac-bee4-daf0-f597-7bf5e09624cb.png)


## DNSSECの導入
詳しい手順は割愛させて頂きますが、導入については```KMSを使用してキーペアを作成```、```DNS署名の有効化```、```DSレコードの登録```といった流れです。DSレコード登録についてはレジストラーによって対応状況や方法は異なります。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-configuring-dnssec.html

## DNSSECの運用
定期的に鍵の更新をする場合、ZSK側のキーローテションはAWS側で実施してくれますが、KSK側のキーローテションについてはユーザ側で実施する必要があります。KSKのキーローテションの際はDSレコードの更新などあるため、普通にやると更新のタイムラグが発生して使用出来ない時間が発生してしまいます。double-signature法というタイムラグなしでキーローテションする方法があり、下記AWSブログでも紹介されています。

https://aws.amazon.com/jp/blogs/networking-and-content-delivery/configuring-dnssec-signing-and-validation-with-amazon-route-53/
【夏休み企画】#IT用語一問一答【毎朝投稿18日目】Hypervisor

# この記事を読むと、、
- 「関連用語」を使って「hypervisor」を説明できるようになる
- 「hypervisor」がもっと好きになる(多分)

# 関連用語
host machine / guest machine / bare-metal hypervisor

[**復習用**] 記事の内容を見る前に上記の言葉で「hypervisor」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/aa7c56e6280e8424e21a

# hypervisorとは
hypervisor = VMM = Virtual Machine Monitor = VMを作成・実行するソフトウェア

- hypervisorが動いているマシンを**host machine**, hypervisor上で起動しているVMを**guest machine**と呼ぶ
    - host machineのOSをhost OS, guest machineのOSをguest OSと呼ぶ

- 異なるguest OSを持つVMを同一のハードウェア上で起動できる
    - 各コンテナがカーネルを共有しているOSレベルの仮想化ではできない

- Type-1, Type-2に分類でき、狭義にはType1のみをhypervisorと呼ぶ
    - Type-1, Type-2は常にはっきりと分類できるわけではない

- Type-1 hypervisor = **bare-metal hypervisor** = native hypervisor = ハードウェア上で直接動作するhypervisor
    - host OSが存在しない
    - ex. Hyper-V
- Type-2 hypervisor = host hypervisor = host OS上で動作するhypervisor
    - ex. VirtualBox

# 参考資料
〇PowerAppsでGrupBy して表結合して合計する方法



表結合を行うには
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/7a5e2dca-968d-f0ea-c67d-0d293547d91b.png)


以下のようにすればよい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/b97f2d75-f0a4-1902-b900-8670ac8f1ab8.png)


```
/// table_2をcollection_of_table_2に挿入
ClearCollect(collection_of_table_2,ForAll(table_2,{id:ThisRecord.id,product:ThisRecord.product,price:ThisRecord.price}));
//idごとにGrupBy
ClearCollect(collection_of_table_2_groupby,GroupBy(collection_of_table_2,"id","product"));
//productごとにこう合計
ClearCollect( collection_of_table_2_groupby_sum, AddColumns(collection_of_table_2_groupby, "Sum of price", Sum(product,price)));
// table_1と結合
ClearCollect(
    collection_of_table_join,
    AddColumns(
        collection_of_table_2_groupby_sum,
        "group",LookUp(table_1,id=collection_of_table_2_groupby_sum[@id],group)
    )
);
```
【Live2D】絵素材(PSDファイル)の差し替え

絵素材を後から差し替える

フォルダ構成は元と同じ（またはLive2Dで作業している構成と同じ？）にする。
そして初回と同じくPSDファイルをLive2Dのウィンドウにドロップ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/f12a4d84-6646-ec66-4476-0d640d8f21c3.png)
現在作業中のモデルを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/7ab604e2-b077-552f-e166-a9e49104cc6c.png)
再インストールするファイルを選択。
（画像は一度試した直後に撮影したので選択不可になっている。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704221/00c96e32-4a52-91c8-a61b-a2bd76dea615.png)
対応するフォルダ構成やファイル名が一致するものは問題なく差し替えられ、一致しない物は「（対応無し）」というフォルダに取り置かれる。
【Python】scikit-learnのToy datasetsの紹介

## 背景
- pythonで機械学習や簡単なデータを操作をする時にscikit-learn（以下 sk-learn）のdatasetsはよく使用する。
- Iris（植物のアヤメ）のデータセットが一番有名な気がするが他にもsk-learnのデータセットがある。
- ちょっとしたデータを使いたい時の備忘録として、データを紹介する。

## 目標
- scikit-learnのToy datasetsを紹介する

## sk-learnのデータ構成
- sk-learnのdatasetsは大分類として4種類ある。

|項目  |説明  |
|---|---|
|Toy datasets | sk-learnに内包されている簡単なデータセット　|
|Real world datasets | DLが必要な容量が大きいデータセット　|
|Generated datasets | 人工的に生成されたデータセット　|
|Loading other datasets | その他のデータセット　|

## sk-learnのToy datasets
- sk-learnに内包されている、Toy datasetsについて軽く紹介する。

|項目  |説明  |
|---|---|
|Boston house prices dataset | ボストンの住宅価格データセット　|
|Iris plants dataset | 植物のアヤメのデータセット　|
|Diabetes dataset | 糖尿病のデータセット　|
|Optical recognition of handwritten digits dataset | 手書き数字のデータセット　|
|Linnerrud dataset | 運動と生理学的データセット　|
|Wine recognition dataset | ワインの品質データセット |
|Breast cancer wisconsin (diagnostic) dataset | 乳がんデータセット　|

## 補足
- 今後、他のデータセットについても紹介を追加したい。
- 各データセットを簡単に可視化分析した記事を書きたい

## 参考資料

https://scikit-learn.org/stable/datasets.html

https://note.nkmk.me/python-sklearn-datasets-load-fetch/

## 個人ブログ

https://takuma-tech.com/2023/01/06/355/
NewsPicksっぽい遷移アニメーションの実装方法

このモーダル遷移アニメーションを実装してみました。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662300/db256da5-343f-91f9-a624-b9b029f24737.gif)


作ったのがこれです。（ごちゃごちゃしてる方が動きが見えやすかったのでwebViewで表示してます。）
![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662300/996ce2d5-e9a7-8ec2-3607-503642224150.gif)



中身としてはCATransitonを使用して、
```swift
   func transitonAnimation() {
        let transition = CATransition()
        transition.duration = 0.4
        transition.type = .fade
        self.view.window?.layer.add(transition, forKey: kCATransition)
    }
```

遷移時に↑の関数を挟みます。
presentのanimationはfalseにしておきます。
trueだと下から画面が出てくる動きが見えるので
```swift
   let vc = UIStoryboard(name: "HogeVC", bundle: nil).instantiateViewController(withIdentifier: "HogeVC") as! HogeVC
   vc.modalPresentationStyle = .overFullScreen
   transitonAnimation()
   self.present(vc, animated: false)
```

そして遷移先の画面のviewDidLoad内で↓のようにtransformアニメーションをするようにしています。

```swift
   self.view.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
   UIView.animate(withDuration: 0.3) {
      self.view.transform = CGAffineTransform(scaleX: 1, y: 1)
   }
```

画面を戻るときも同様でボタン閉じて戻る時に↓のような感じで処理を書いてます。
```swift
  @IBAction func tappedCloseButton(_ sender: Any) {
        transitonAnimation()
        UIView.animate(withDuration: 0.1) {
            self.view.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
        } completion: { _ in
            self.dismiss(animated: false)
        }
    }
```

もうちょっと調整したらまだ近づけるとは思ってますが、まぁ割とそれっぽく出来たのではと自負しています。
僕のQuita記事を書くときのフォーマット

## 背景
- quita記事などを書く際に、「何から書き始めよう、、、」「構成をどうしよう、、、」と思ってしまうことはみんな経験してそう。
- 手前味噌ながら、僕が使っている記載フォーマットを紹介しようと思った。
- また、記事を書く際に僕なりに意識していることもシェアしてみたいと思った。

## 目標
- 僕がQuita記事を書くときに使用しているフォーマットを紹介する。
- 記事執筆をしているときに意識・工夫していることをシェアする。

## 僕が使用しているquita記事の構成フォーマット
- この記事そのままだが、僕の記事の構成は基本的には下記の５項目をベースに書いている。

|項目  |説明  |
|---|---|
|背景 | 記事を書こうと思ったきっかけなど記載　|
|目標 | 記事を読んだらできるようになることを具体的に記載　|
|前提環境 | 使用している環境情報を記載　|
|更新記録 | 日付と簡単な変更内容を記載　|
|参考資料 | お世話になった資料の皆様を記載　|

## 記事執筆が億劫にならないようにしている工夫
- この5つの項目が記載されたmdファイルをローカルに置いている。
- 記事を書くときはローカルファイルのmdを開いて、フォーマットをコピーしてから記事執筆をしている。
- いちいちフォーマットを手動で記載するよりは項目の設問に答えるイメージで書き始められるので記事執筆へのハードルが下がる。

## 記事の構成について考えていることなど
- 上記の5つの項目を構成のベースとして、この記事のように必要に応じて新しい見出しを入れている。
- 記事を書く時には自分が読み手であることを想定して、できるだけ文章は少なくするよう意識している。
- 僕的には、何か技術に詰まっている時にquitaを見ることが多いので、必要な情報さえあれば3行の記事でも価値を感じている。
- 逆を言えば、他のエンジニアもそうだと思っているので、スクール系の導入が多い解説とかはあまり書かないように意識している。
- 構成に、背景と目標を入れているのも、この記事を読めば何ができるようになるのか最初にわかるようになっていた方が技術的に困っている時は助かると考えているから。

- 一方で教科書的な体系的な知識を身につけたい時には、詳細に記述されたquita記事にお世話になっている。
- 上記のような詳細な情報を記述した記事にもチャレンジして行きたい。

- また、quitaのクスッと笑えるような話が入った記事も個人的には嫌いではない。
- ただ、余談が多くなりすぎると話が脱線してしまいそうなので、今のところては出せていない。

## 前提環境
- macOS 11.4 (20F71)
- arm64(M1)

## 参考資料

## 個人ブログ

https://takuma-tech.com/2022/09/27/172/
【Rails】フロントから渡ってきたパラメータをバックエンド側で編集できない

以下のような感じのバックエンド側に渡したストロングパラメータをgsubでちょこっと手を加えようとしたらできなかったので備忘録も兼ねてメモ。。。
 ```ruby
def permit_params
  params.require(:form_params).permit(:param1,
                                      :param2,
                                      :param3)
end
```

挙動としては以下のような感じ、、、
 ```ruby
permit_params[:param1].gsub("hoge","fuga") #←これをログ出力したらきちんとgsubが効いているが、、、
permit_params[:param1] = permit_params[:param1].gsub("hoge","fuga") #←こんな感じで値を更新しようとしても書き換えができない。エラーとかも出ない。。。
```

対応
ストロングパラメータを他の変数に一旦、移してそっちを編集する。
 ```ruby
params = permit_params
params[:param1] = params[:param1].gsub("hoge","fuga")
```
bootstrap-datepickerでCDNを使わない。。


https://bootstrap-datepicker.readthedocs.io/en/latest/

日付の入力にbootstrapのdatepickerを使用するため、
backend.blade.phpへCDNを記述していた。
```
<script src="https://cdn.jsdelivr.net/npm/bootstrap-datepicker@1.9.0/dist/js/bootstrap-datepicker.min.js"
        integrity="sha256-bqVeqGdJ7h/lYPq6xrPv/YGzMEb6dNxlfiTUHSgRCp8=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-datepicker@1.9.0/dist/css/bootstrap-datepicker3.css"
      integrity="sha256-AghQEDQh6JXTN1iI/BatwbIHpJRKQcg2lay7DE5U/RQ=" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap-datepicker@1.9.0/dist/locales/bootstrap-datepicker.ja.min.js"
        integrity="sha256-IX182a23hiQE65+kYOND1ZIX2Vpl0cHb96g9nJqqqW0=" crossorigin="anonymous"></script>

```

# 本題 : CDNなしでdatepickerを使えるようにしよう！
参考資料↓


https://nanbu.marune205.net/2021/12/bootstrap-datepicker_0143736326.html?m=1

## 1. bootstrap-datepickerをダウンロードする
下記サイトから「Download x.x.x」ボタンを押してダウンロードを実行する


http://eternicode.github.io/bootstrap-datepicker
## 2. 各ファイルを設置する

各ファイルを対応するフォルダ内へ設置します。
（下記の設置場所は、それぞれご自分の環境に合うように設置してください。）

###### ```bootstrap-datepicker.min.js``` (jsフォルダの中にある本体)
###### ```bootstrap-datepicker.ja.min.js``` (localesフォルダにある日本語化ファイル)
###### ```bootstrap-datepicker3.css``` (cssフォルダの中にあるcss)

## ３．仕上げ
コマンドを入力し反映させます
```
$ npm run dev
```

## 蛇足 : 私の場合
resource/jsへ```bootstrap-datepicker.min.js```と```bootstrap-datepicker.ja.min.js```を設置。
resource/ja/app.jsへ下記コードを追加し、ファイルを読み込ませる。
```
require('./bootstrap-datepicker.min');
require('./bootstrap-datepicker.ja.min');
```
resource/scssへ```bootstrap-datepicker3.css```を設置。
resource/scss/app.scssへ下記コードを追加し、ファイルを読み込ませる。
```
@import 'bootstrap-datepicker3';
```
【読書会】UNIXという考え方

社内で読書会をやってみたので、ちょっとした感想を書いてみます。

# UNIXという考え方
今回取り上げた本です。

https://www.amazon.co.jp/UNIX%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9%E2%80%95%E3%81%9D%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3%E3%81%A8%E5%93%B2%E5%AD%A6-Mike-Gancarz/dp/4274064069

# 読書会やってみた
「緩い感じの読書会をやりたいなぁー」と思い立ち上げてみました。
参加者がいないと**一人もくもく会参加者0人**になるなーと内心ドキドキしていましたが、参加者がいて良かったです。
参加してくれた方々ありがとうございました。

# 内容を語ってみる
そもそもUNIXを語る前に普段親しんでいるLinuxとの違いは？ということから軽く説明をしました。
* UNIXは、もっとも古いOSの一つでいろいろなOSの土台になったOS
* LinuxはUNIXを参考にして作られ親戚のようなもの
* リーナス・トーバルズというフィンランドの人が発明した。この方はGitの発明者でもあるすごい人
* ~~リナックスチョットデキルの人、作った人なのに「ﾁｮｯﾄﾃﾞｷﾙ」Tシャツを着て話題になった(ネタを説明するの忘れてたああ残念）~~

作った資料![UNIXという考え方.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819639/cc2e39ac-1150-5e1f-6c31-ea6469a7f596.jpeg)

Miroのマインドマップにまとめて解説をしました。

https://miro.com/ja/

とっっってもオススメのツールです。これがないと発表とかできない身体になってしまいました()

## UNIX哲学
本書では基本的な9つの定理が紹介されていますが、個人的に「これは是非とも読書会の成果として、持ち帰って貰いたい」と思う4つの哲学について解説をしました。

## スモール・イズ・ビューティフル
小さいものは美しいという考え方です。(そのままの意)

小さいプログラムのメリット
* 小さいからコードがわかりやすい
* 小さいから保守しやすい
* システムにやさしい: 少ないリソースですむ
* 組み合わせがしやすい：柔軟性に富んだプログラムを作ることができる。(マイクロサービスに通ずる考え方では？)

## 一つのプログラムには1つのことをうまくやらせる
* 一つのことに集中させることで小さなプログラムを作ろうという試み
* オブジェクト指向での単一責任原則に似てますね

## できるだけ早く試作する。
試作をしなければいけない理由
* 学ぶことができる（何がうまくいき、何がうまくいかないかに気付ける）
* 変化にたいして早く舵取りをできる
* 90%なら早くできる(試作をして90%を目指す)　※さらなるUNIXの考え方の一つですが、超訳しました。
## 効率より移植性
* 最も効率の良い方法は移植性がかける(それ独自のプログラムになってしまう)
* プログラムは進化して拡張していくもの移植性が高くないとプログラムとして生き残れない
* 階層的な考え方はオブジェクト指向にも通ずるものがある ※さらなるUNIXの考え方の一つですが、超訳しました。

# まとめ
最後にこの本で個人的に一番グッときたポイントを紹介します。
>覚えておいてほしい。ソフトウェアは、実は作るものではなく、成長していくものなのだ。成長したソフトウェアを新しいハードウェアにも移植できればそのソフトウェアの価値は上がる。新しいハードウェアは頻繁に現れる。移植性の高いソフトウェアは、すぐにその新しいアーキテクチャの長所を利用できる。そこで、試作では効率より移植性を優先させる。この結果、移植できるものは生き残る。それ以外のものは、やがて時代に取り残されてしまうだろう。<第八章　132ページ抜粋>


「実は作るものではなく、成長していくもの」この言葉にはハッとしました。
視座を高く持った時、確かに成長していくものですね、なるほど！
本書は2001年発行と少し古い本で現在ではそぐわないような点もあるのではないかとは思いますが、それ故に原理原則のような哲学的な本だなと感じました。
とても薄い本(一般的な技術書に比べて)なのでサクッと読めると思います。
是非とも本書を手に取って読んでみてください。おしまい。
【C#】Pathの階層を配列に


・.NetFramework2.0 ~可能

#### やりたいこと
"C:\Windows\System32\notepad.exe"みたいなPath文字列を
["C:\"|"Windows"|"System32"|"notepad.exe"]みたいな配列にする

#### やること
```C#
var filePath = @"C:\Windows\System32\notepad.exe";
var result = filePath.Split(Path.DirectorySeparatorChar);
```

#### できた。✌
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376391/ce287cc2-b255-4d96-138b-91c6af73fffe.png)
metaって何なの？

# meta知ってる？
初心者コーダや学生は知らなかったり、とりあえずスルーするmeta要素。（ちゃんと理解してコーディングされてる方々すみませんmm）ページ上で見えないmeta要素は軽視されがちです。
私も毎回meta要素まで書かれているテンプレートを使用して制作を行なっているので、ちゃんと理解できていません。ってことでまとめていきます〜

# metaって何？
タイトルにも書きましたが、metaってなんなんでしょう。
```「META」とは「META-information」の略で、文書のメタ情報を指定し、ブラウザや検索ロボットにホームページの情報を知らせるためのタグです。メタ情報は、Googleやgooなどのスパイダーと呼ばれるロボット型検索エンジンがネットワーク上を巡回した際に拾われ、検索ページに反映されます。```らしいです…
&lt;head&gt;タグ内に記述するので画面上には表示されません。
ページを見る人のための記述ではなく、コンピュータに向けた記述なのですね。

meta要素はmeta情報、メタデータとも呼ばれ、サイトの制作者や文書の説明・キーワードなどの情報や文字コードの指定、キャッシュの制御と有効期限の指定などを記載するのが一般的らしいです。
それでは、基本的なmeta要素を紹介していきます。

# 基本的なmeta要素一覧
## meta情報の記述方法
name属性ではメタデータ名を定義、content属性ではその内容を指定します。
```
<meta name="メタデータ名" content="内容を指定">
```
## 基本的なmeta要素
### description
文書の説明を短文で指定します。
```
<meta name="description" content="">
```
### keyword
HTML文書がどのような内容を示したものかキーワードで指定します。
```
<meta name="keywords" content="">
```
### viewport
PCやモバイル（スマホ、タブレット）といったデバイスごとにコンテンツの表示領域を設定します。
```
<meta name="viewport" content="">
```
### robots
検索エンジンのクローラ（ロボット）に対して URLをインデックスしないように（noindex）、 文書内のリンクをたどらないように（nofollow）知らせるための指定します。
```
<meta name="robots" content="">
```
### OGP(Open Graph Protocol)
FacebookやTwitterなどのソーシャルメディアで共有(シェア)された際に、ページのイメージ画像やタイトル、ディスクリプション(概要文)、URLなどを設定します。
```
<meta property="og:url" content=" ページの URL" />
<meta property="og:type" content=" ページの種類" />
<meta property="og:title" content=" ページの タイトル" />
<meta property="og:description" content=" ページの説明文" />
<meta property="og:site_name" content="サイト名" />
<meta property="og:image" content=" サムネイル画像の URL" />
```
### charset
文書の文字エンコーディングを指定する際に使用します。
```
<meta charset=”utf-8″>
```
### refresh
別のURLへのリダイレクトや現在ページの再読み込みを指定します。
```
<meta http-equiv=”refresh” content=”秒数;URL=URL“>
```

# まとめ
今回meta要素についてや、基本的なmeta要素について知り、meta要素を上手く記述することで、ページの情報を検索エンジンのクローラーに認識させSEO対策できたり、機能を追加できることが分かりました。
これまでmeta要素を重要視出来ていなかった方は是非さらに詳しく調べて活用し、ページのクオリティを高めていきましょう！


# 参考記事
[metaタグとは｜コーディングのプロが作るHTMLタグ辞典](https://html-coding.co.jp/annex/dictionary/html/meta/#:~:text=%E3%80%8CMETA%E3%80%8D%E3%81%A8%E3%81%AF%E3%80%8CMETA,%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)
[&lt;meta&gt;－HTML5タグリファレンス](http://www.htmq.com/html5/meta.shtml)
【VBA】条件付き書式ガントチャート進捗変化


![スクリーンショット 2022-09-08 0.22.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506079/8d178f00-f799-2b4f-ff45-64c168acfb60.png)

```
=CONCATENATE("=AND($",F9,F10,"-WEEKDAY($",F9,F10,",3)<=",C9,"$",C10,",",C9,"$",C10,"<=($",F9,F10,"-WEEKDAY($",F9,F10,",3)-7)+ROUNDDOWN((($",E9,E10,"-WEEKDAY($",E9,E10,",3)+6)-($",F9,F10,"-WEEKDAY($",F9,F10,",","3))+1)*$",G9,G10,",0))")
```

```:確認用
'=AND($B5-WEEKDAY($B5,3)<=B$2,B$2<=($B5-WEEKDAY($B5,3)-7)+ROUNDDOWN((($C5-WEEKDAY($C5,3)+6)-($B5-WEEKDAY($B5,3))+1)*$D5,0))
```
WSL2 Docker 環境構築

# WSL2 インストール手順

管理者権限で Powershell を起動する。

```powershell
start -verb runas powershell
```

WSL インストールコマンドを実行する。

```powershell
wsl --install
```

バックアップを残しておきたい場合は ``export`` オプションを使用する。

```powershell
wsl --export Ubuntu ubuntu_backup.tar
```

リストアしたい場合は ``import`` オプションを使用する。

```powershell
# 現在登録されている仮想マシンを削除する。
wsl --unregister Ubuntu
# 仮想マシンの VHD が置かれているデフォルトパス
$ubuntu_vhd_path="${env:LOCALAPPDATA}\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState";
# 仮想マシンを復元する。
wsl --import Ubuntu $ubuntu_vhd_path ubuntu_backup.tar
```

復元後、仮想マシンのデフォルトユーザが root になっている為、 ``/etc/wsl.conf`` を作成する。

```bash:/etc/wsl.conf
[user]
default=user_name
```

仮想マシンを再起動して ``wsl.conf`` を適用する。

```powershell
wsl -t Ubuntu
```

## 参考資料

* [WSL のインストール](https://docs.microsoft.com/ja-jp/windows/wsl/install#manual-installation-steps)
* [WSL の基本的なコマンド](https://docs.microsoft.com/ja-jp/windows/wsl/basic-commands)
* [WSL2 で --import を使った場合にやるべき設定](https://scrapbox.io/sno2wman/WSL2%E3%81%A7--import%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E3%82%84%E3%82%8B%E3%81%B9%E3%81%8D%E8%A8%AD%E5%AE%9A)

# WSL 仮想マシンへの Docker インストール手順

公式に配布されているインストールスクリプトを取得し、実行する。

```bash
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```

``dockerd`` , ``docker`` , ``docker compose`` がインストールされる。

## 参考資料

* [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)

# WSL ホストマシンへの Docker インストール手順

[Rancher Desktop](https://rancherdesktop.io/) のインストーラを取得し、実行する。

## 参考資料

* [Docker Desktopの代わりにRancher Desktopを使用しています。](https://qiita.com/juno_rmks/items/a7a156883a2ef747848b)