OmniAICreator/Qiita-1.07M huggingface dataset:
因子分析における固有値の役割

因子分析におけるスクリー基準では、観測データの相関行列に対する固有値をもとに因子数を決定するが、なんのための固有値なのかを解説する. 

$p$次元観測変数$\boldsymbol{x}$の相関行列を$R^{p\times p}$とする.
$R$は(半正定値)対称行列より、直交行列$Q^{p\times p}$, 固有値を対角成分にもつ対角行列
$\Sigma^{p\times p}$を用いて$R = Q\Sigma Q^T$として対角化可能. 

また, 因子分析モデルでは$p$個の各変数の分散を1に標準化した観測変数$\boldsymbol{x}$ を,因子負荷行列$\Lambda$と共通因子$f$を用いて
$\boldsymbol{x} = \Lambda f + \boldsymbol{\varepsilon}$ ,
その相関行列(=共分散行列)を $R = \Lambda \Lambda^T$ と表現する（$f$の共分散行列は単位行列を仮定）. 
よって, $\Lambda = Q \Sigma^{1/2}$ とすれば$R$を表現できる. 

ここで、$R$のスペクトル分解より,固有値$\lambda_1, \lambda_2, \cdots, \lambda_p$ とそれに対応する固有ベクトル$q_1, q_2, \cdots, q_p$ を用いて，
$R = \lambda_1 q_1 q_1^T + \lambda_2 q_2 q_2^T + \cdots + \lambda_p q_p q_p^T$ と表現できる. 
上記では$Q$, $\Sigma$ をそれぞれ$p$次元正方行列としたが, 

```math
Q^{p\times 2} = [q_1, q_2],　
\Sigma^{2\times 2} = \begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix}
```

とすると, 
$\Lambda \Lambda^T$は$R$のうち$\lambda_1q_1q_1^T + \lambda_2q_2q_2^T$の部分を表せているということになり, 大きい$\lambda$とそれに対応する固有ベクトルを選ぶことで, 少ない次元で$R$を近似できることがわかる. 
カイザー基準では, 固有値が1以上のものを選ぶことで, 因子数を決定している.
ubuntu 22.04でlibc.hがコンパイルできない

## 今回の問題

```test.c
#include <libc.h>

int main()
{
        int eof = EOF;
        int fd = open("test.txt", O_RDONLY);
        char *str = (char *)malloc(11);
        int n = read(fd, str, 10);

        printf("EOF:%d\ntest.txt:%s\n", eof, str);
        close(fd);
        return (0);
}

```
``` test.txt
1234567890
```

上記のプログラムはmac環境でコンパイルすると、問題なく

```a.out
EOF:-1
test.txt:1234567890
```
と出力されますが、ubuntuでコンパイルした際、「libc.h」が参照できないという旨のエラーを吐き出してしまいました。

## 原因
そもそもlibc.hというヘッダファイルは本来存在していないようです。なので、ubuntu環境でlibc.hをインクルードしようとしても未定義なヘッダファイルを読み込もうとしていることになってしまいます。

## なぜmac環境でコンパイルできたのか
結論、Appleが独自でlibc.hというヘッダファイルを用意しているらしいです。
以下、公式からの引用。
> 
> ```libc.h
> #ifndef LIBC_H
> #define LIBC_H
>
> #include <stdio.h>
> #include <standards.h>
> #include <unistd.h>
> 
> #ifdef	__STRICT_BSD__
> #include <strings.h>
> #include <varargs.h>
> #else
> #include <string.h>
> #include <stdlib.h>
> #include <time.h>
> #include <stdarg.h>
> #endif
>
> #include <sys/param.h>
> #include <sys/mount.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> #include <sys/time.h>
> #include <sys/times.h>
> #include <sys/resource.h>
> #include <signal.h>
> #include <sys/time.h>
> #include <sys/stat.h>
> #include <sys/file.h>
> #include <sys/socket.h>
> #include <sys/ioctl.h>
> #include <netinet/in.h>
> #include <arpa/inet.h>
> #include <mach/machine/vm_types.h>
> #include <mach/boolean.h>
> #include <mach/kern_return.h>
> 
> #endif  /* _LIBC_H */
>
>```
これをインクルードしていたおかげでmac環境では先ほどのプログラムがコンパイルできていました。しかし、linux環境にはlibc.hのヘッダファイルが用意されていないので、使いたい関数やマクロが含まれるヘッダファイルを別でインクルードしなければならないようです。


```test.c
#include <stdio.h>
#include <sys/file.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
        int eof = EOF;
        int fd = open("test.txt", O_RDONLY);
        char *str = (char *)malloc(11);
        int n = read(fd, str, 10);

        printf("EOF:%d\ntest.txt:%s\n", eof, str);
        close(fd);
        return (0);
}

```
- `EOF`, `printf` ->  stdio.h
- `open` -> sys/file.h（libc.hにはありませんでしたが私はfcntl.hをよく使います）
- `malloc` -> stdlib.h
- `read`, `close` -> unistd.h
上記のようにそれぞれ対応するヘッダファイルをインクルードすることで解決。

### 参考にしたサイト
https://manpages.ubuntu.com/manpages/jammy/ja/man7/libc.7.html

https://opensource.apple.com/source/Libc/Libc-186/headers.subproj/libc.h.auto.html

https://man7.org/linux/man-pages/man3/eof.3const.html

各種manも参考にしました。
Perforceを構築 AlmaLinux編

# 開発環境
- AlmaLinux release 9.4
# Perforceのインストール
PerforceのパッケージキーをRPMキーリングに追加
```
rpm --import https://package.perforce.com/perforce.pubkey
```
PerforceのリポジトリをYUM構成に追加
```
touch　/etc/yum.repos.d/perforce.repo
vi /etc/yum.repos.d/perforce.repo
```
以下の内容を記述
```
[perforce]
name=Perforce
baseurl=http://package.perforce.com/yum/rhel/9/x86_64
enabled=1
gpgcheck=1
```
パッケージのインストール
```
yum install helix-p4d
```

# Perforceのサービスを作成
```
/opt/perforce/sbin/configure-helix-p4d.sh
```
### サービス名
```
Perforce Service name [master]: Hoge
```
### サーバルート(P4ROOT)
指定したいディレクトリがなければデフォルトでOK
```
Perforce Server root (P4ROOT) [/opt/perforce/servers/Hoge]:
Create directory? (y/n) [y]: y
```

### サーバのUnicodeモード
日本語コメントを残したいのでYにする

:::note warn
一度オンにするとオフに戻せないので注意
:::
```
Perforce Server unicode-mode (y/n) [n]: y
```

### サーバの大文字と小文字の区別
UEでは区別させたくないのでNにする

:::note warn
追記 : UEでは文字の大小を区別しない（FName型）
オフにしないとバグの原因になるらしいので、注意
:::
```
Perforce Server case-sensitive (y/n) [y]: n
```

### サーバアドレス(P4PORT)
通信をプレーンテキスト、またはSSLのどちらで行うかを指定
今回はデフォルトで進める
```
Perforce Server address (P4PORT) [ssl:1666]:
```

### スーパーユーザーの設定
パスワードは大文字小文字混合か、数字混合の上、8文字以上必須
```
Perforce super-user login [super]: hoge
Perforce super-user password: HogeHoge
```
### まとめ
```
Perforce Service name [master]: Hoge
Perforce Server root (P4ROOT) [/opt/perforce/servers/Hoge]:
Create directory? (y/n) [y]: y
Perforce Server unicode-mode (y/n) [n]: y
Perforce Server case-sensitive (y/n) [y]: n
Perforce Server address (P4PORT) [ssl:1666]:
Perforce super-user login [super]: hoge
Perforce super-user password: HogeHoge
```

# ポートの解放
今回はデフォルトの1666ポートを使用することにしたので、1666ポートを解放する
```
firewall-cmd --zone=public --add-port=1666/tcp --permanent
firewall-cmd --reload
```
NAT GatewayとNAT Instance

|特徴|NAT Gateway|NAT Instance|
|:-|:-|:-|
|管理|AWSによって完全に管理される|管理者が管理する必要がある|
|帯域幅|最大 45 Gbps まで拡張可能|インスタンスによって変わる|
|コスト|ゲートウェイの数、使用期間、データ転送に基づく|インスタンスタイプと使用量に基づく|
|Elastic IP アドレス|変更不可|変更可能|
|SGとACL|ACLで制御|SGで制御|

https://www.linkedin.com/pulse/aws-nat-gateway-instance-simple-guide-enthusiasts-pi%C3%B1ero-estrada-1zmce

一時的(15分程度)にインターネット接続したいだけだから、natgatewayでもいい気がしてきた
料金計算は、この後暇があれば追加しようと思います。多分
Nuxt3を用いてqiitaAPIを取得する

## Qiita APIを用いてポートフォリオ用のブログページを作る

#### Nuxt3 を用いてホームページを作成する
フレームワークは現状使用しない

#### Blog PageをQiitaに投稿した記事を取得して表示させていく
useFetch()を使用して、Qiita APIを取得する
Qiitaの設定ぺージからbearer tokenを取得する
```vue
const { data, error } = (await useFetch(
  "https://qiita.com/api/v2/authenticated_user/items",
  {
    method: "get",
    headers: {
      Authorization: "Bearer //ここに取得したBearer Token",
    },
  }
)) as any;

```
アプリケーションに適切なリソースを設定しよう

### メモリ、CPUについて
## コンテナのリソース使用量を求める:Resource requests
確保したいリソースの最低使用量を指定。これを満たすNodeを調べてスケジュールするが、どのNodeも満たさない場合、Podはスケジュールされない。
マニフェスト例
```
    resource:
        requests:
            memory: "64Mi"
            cpu: "10m"
```
## コンテナのリソース使用量を制限する:Resource limits
コンテナの使えるリソースの上限を指定。
もしメモリが使用量を超えると　OOM > podがkillされてしまう
もしCPUが超えると　アプリが止まることはないが、スロットリングが発生しアプリの動作が低下する。
マニフェスト例
```
    resource:
        limits:
            memory: "64Mi"
            cpu: "10m"
```
###  リソースの単位
**メモリ**
指定しない場合、１は１Byteを意味する. K,Mはそれぞれキロ、メガ。
Kiっていうのもあってこれは２^10=1024。他の単位も調べてみてね。
**CPU**
単位を指定しない場合、１はCPUの１コアを意味する。1m=0.001コアなので、通常整数もしくはミリコアで指定する。

## QoSっていう考え
これ天才。
Nodeのメモリが完全に枯渇するとその上のコンテナが動かなくなってアプリが停止してしまう。それを防ぐためにQoS（Quality of Service)に応じてOOM Killerが働いて優先度の低い順にPodを◯していくという仕組み。
**Qos class を簡単に紹介**
**Guaranteed:**　Pod内のコンテナ全てのリソースにrequests,limitsが設定されている。さらにreq=limの値となっている（メモリ、CPUともに）
**Burstable:**　Pod内のコンテナの内少なくとも一つにメモリかCPUのリソースのreq/limが設定されている。
**BestEffort:**　上のどちらでもないもの。
上から順に優先順位が高いぞ。軽く覚えておいて損はないでしょう。

終わり
OMCB024B

https://onlinemathcontest.com/contests/omcb024/tasks/11973

最近メンタルの不調でDifficultyが2桁の問題が解けなくなってしまった。
脳が考えることを拒否している。

まずこちらの問題、解説では解と係数の関係を使って解いている。
解と係数の関係は知ってはいるが、正直な所、自力では思いつかない。

なので、力技でなんとかする。(ただし、コンテスト中はこの方法でも解けなかった。)

$x^2-2345x+10000=0$
$(x-\frac{2345}{2})^2=(\frac{2345}{2})^2-10000$
$x=\frac{2345}{2}±\sqrt{(\frac{2345}{2})^2-10000}$

$\frac{2345}{2}=1172.5$
$\sqrt{(\frac{2345}{2})^2-10000}≒1168.22$

$\alpha<\beta$とすると、
$\sqrt{\alpha}≒\sqrt{1172.5-1168.22}=\sqrt{4.28}≒2.07$
$\sqrt{\beta}≒\sqrt{1172.5+1168.22}=\sqrt{2340.72}≒48.38$
$\sqrt{\alpha}+\sqrt{\beta}≒50.45$
$50≦\sqrt{\alpha}+\sqrt{\beta}<51$

$\sqrt{\alpha}+\sqrt{\beta}$以下の最大の整数は$50$
【ROS2 colcon buildトラブルシューティング】AttributeError: module 'importlib_metadata' has no attribute 'EntryPoints'の対処方法

# はじめに
　CIで実施していたROS2のcolcon buildにエラーが出るようになったため対策を紹介する。

# 動作確認環境

* Ubuntu 20.04 x64
* ROS2 Foxy

# エラー原因

　importlib_metadataに```EntryPoints```が含まれていないのが原因。

```bash
AttributeError: module 'importlib_metadata' has no attribute 'EntryPoints'
```

setuptoolsのバージョンが上がったため、構成が変更されたため。詳細は下記参照。

https://github.com/pypa/setuptools/issues/4490


# 対策

　エラーが発生しないsetuptoolsにダウングレードする。CIを利用している場合は、最初にダウングレードしておく。ver 68.2.2では問題なく動作したので以下のコマンドを実行してダウングレードする。

```bash
pip install 'setuptools<=68.2.2'
```

# まとめ

　ROS2のcolcon buildで、```AttributeError: module 'importlib_metadata' has no attribute 'EntryPoints'```が発生した場合の対策を紹介した。CIなどで最新版をsetuptoolsを利用している場合に有用となる。


# 参考

https://github.com/pypa/setuptools/issues/4490

https://github.com/pypa/setuptools/issues/4478
新入社員がJavaSilverとJavaGoldを取るまで

# １.はじめに
はじめまして、社会人半年の新卒エンジニアです。
私は専門学校に2年在学し、卒業後ITの企業に就職しました。

今回は、私が入社後にJava Silver,Java Goldの取得に向けて行った勉強方と、取得するに至った経緯についてお伝えしていきたいと思います。

この記事を読んだ方が、これらの資格に対しての効率的な学習方法を知っていただき、プログラミングの学習に対する不安が少しでも無くなれば幸いです。

#### 対象者
・学習方法や合格のコツを知りたい人

#### 解説しないこと
・具体的な出題場所や試験の説明
・問題の解説

# ２.取得目的
私は専門学校でJavaの学習はしていましたが、Javaが得意と言える程の知識がありませんでした。というか学んだ内容を結構忘れていました笑

これから会社で働くのにこれはまずいと思い、学習を決意したのがきっかけです。

ただ学習をするのはモチベーションがなかった為、資格の取得という目標を立てようと思い、まずはJava Silverの取得のための学習を始めました。

取得目的としては、基礎から学び直したいと考えたからです。

# ３.勉強の流れ、期間
#### 学習期間としては

2024年4月 入社
2024年5月 Java Silver合格に向けて学習開始
2024年6月 Java Silver合格,Java Gold合格に向けて学習開始
2024年7月 Java Gold合格

どちらも1ヶ月半ほどの学習期間になります。

5,6,7月は研修期間中で自習時間などが多くあったので想定より早く取得することが出来たという体感です。

#### 勉強の流れとしては

・[徹底攻略Java SE 11 Silver問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625)
・[徹底攻略Java SE 11 Gold問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Gold%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-816/dp/4295012564)

これらの「黒本」と呼ばれる問題集をひたすら解いて、解説を読んでいきました。一冊だけで大丈夫？と思う人もいるかもしれませんが、資格の取得が目標であれば一冊で十分だと思います。

初めて問題を解く時は、分からない問題だらけでしたが、繰り返し解いて頭にねじ込みました。解説が文字だらけで読む気がおきない時などは、黒本の著者の方の動画を見ていました。黒本とリンクした解説が多く私的にはかなりお勧めです。

・[黒本の著者の方のYoutubeチャンネル](https://www.youtube.com/@java9521/featured)
　
詳しく学習方法を説明すると
##### 1.1章ずつ理解していく
・まばらに学習するのではなく章毎に理解出来たと感じたら次の章に進む
・理解できない場所は実行環境などを駆使してコードを実際に書いてみる(paizaの実行環境が一番楽)
・答えを暗記するだけでも最初はOK

##### 2.2週、3週と問題を解いていく
・時間あけたら案外忘れてしまっているので繰り返し解く
・間違えた問題はマークしておく

##### 3.1週通して間違いが0になるようにする
・解く時に頭の中で解説の言葉も思い出せるようになれば完璧
・ここまで来たらもう合格できると思います！


# ４.難易度、感想
感想としてはJavaSilverの学習は楽しかったですが、JavaGoldの学習は苦痛でした笑
JavaGoldは問題より解説が多く、文字を読むのがあまり好きではない私からしたらかなりしんどかったです。

難易度は黒本の問題を全て解ける状態であれば、Silver、Gold共にそこまで難しくはないと感じました。黒本と類似する問題や、まったく同じ問題が7～8割ほどを占めていたので、しっかりと熟読出来ていれば安心して受験出来ると思います。ぶっちゃけ問題の答えを暗記するだけでも合格は狙えると思います。

結果としては、学習を通してJavaの基礎やコードの動きを理解できるようになったと感じることが出来ました。基礎を作りたいという人はJavaSilverの学習はかなりお勧め出来ます。JavaGoldの学習は余力があれば挑戦しても良いと思いますが、身になるか不安になる問題も多いので余力があれば挑戦するという考えでいいと思います。
学習後は、paizaの問題集などを通して腕試しをしてみると、成長を実感することができるかもしれません。

# ５.最後に
ここまでお読みいただきありがとうございました！

勉強方法は人それぞれだと思いますが、皆さんの合格の力になれば幸いです。資格勉強はめんどくさいものですが、一生の財産になるので頑張ってください！！

合格を祈っています！
安全なステートレスアプリケーションを作るために使えるkubernetesのリソース

## ステートレスなアプリケーションを作る
アプリケーションで大切なのはただ動くことでなく可用性を上げる（動きやすくする）ことが大切。そのために使えるkubernetesのリソースを紹介していく

## Readiness Probe
第一に、コンテナが起動することとトラフィックが受けられるようになることは必ずしも一致しないんだなも。例えばコンテナが二つあって**片方が起動しても、もう片方が死んでたらトラフィックは受けられない**んだなも。
readinessprobeはコンテナがreadyになるまでの時間やエンドポイントを制御できます。
マニフェスト例
```
readinessProbe:
    httpGet:
        path:/healthz
        port:8080
    initialDelaySecond: 5
    periodSecond: 5
```    
上の例だとhealthzというヘルスチェック用エンドポイントまで5秒に一回ヘルスチェックが入る。失敗するとserviceリソースの対象から外れ、トラフィックを受けなくなる。
## Liveness Probe
ReadinessとProbeが失敗した時の挙動が変わる。
どうなる？　> **Podが再起動する**
これはPodがハングした時に、再起動したら直りそうだなってときに使うといいと思うよ。けど安易に使うべきではないんだなも。**無限にPodを再起動する**恐れがあります。
マニフェスト例（Readinessとほぼ同じ）
```
livenessProbe:
    httpGet:
        path:/healthz
        port:8080
    initialDelaySecond: 5
    periodSecond: 5
```    
LivenessとReadinessは一緒に使えるけど、LivenessはReadinessのProbeを待つなんてことはしないから、一緒に使うならReadinessが先になるように実装することが推奨されている。らしい
## Startup Probe
Podの初回起動時のみ動く。起動が遅いアプリなどに使用する想定。
マニフェスト例
```
startupProbe:
    httpGet:
        path:/healthz
        port:liveness-port
    failureThershold: 30
    periodSeconds: 10
```    
上記の例では最大30秒*10回＝300秒コンテナの起動を待つ設定になる。
【VSCode】Call Graphを自動生成する方法

Call Graphの拡張機能を使用することで以下のような関数呼び出しのグラフを生成できます。

![call_graph_outgoing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/394a742d-67ca-1530-14d2-f90f5af65a79.png)

https://marketplace.visualstudio.com/items?itemName=LuoZhihao.call-graph

## 生成方法

### 右クリックから生成

関数名を右クリックして「CallGraph: Show incomming call graph」または「CallGraph: Show outgoing call graph」をクリックするとグラフが生成されます。

![スクリーンショット 2024-10-14 23.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b5d4c54a-12f6-ea48-beb1-0707e79843da.png)

### コマンドパレットから生成

カーソルを関数名に置き、コマンドパレットで「CallGraph: Show incoming call graph」または「CallGraph: Show outgoing call graph」を実行するとグラフが生成されます。

![スクリーンショット 2024-10-14 23.53.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/234cc5bf-866f-5d00-d2c0-0eab58e64610.png)
メモ

エンドポイント(複数)
s3バージョンニング
DynamoDb削除保護
VPCアクセスログ
cloudfront waf HTTPSオンリー
APIgateway edge最適化
EBS暗号化
Autoscalling追跡cpu50%
rdsシークレットマネージャー
 ローテーション・マルチAZ
 rdsログ出力
 ec2詳細メトリクス
 Autoscallingのグループメトリクス
 config・trustAdviser・inspector・patchmanager・guardduty
AccessのVBAでオブジェクト内の関数一覧を取得

# 概要

Accessはバージョン管理しにくいこともあり、下記のような ~~くそコード~~ デッドコードが大量にフォームや標準モジュールに残っていることがあります。

```vb:デッドコードの例
Function データ変換_20241001bk()
    '何十行にもおよぶコードがあるけどこの関数は使われてない…。
End Function

Function データ変換_サンプル用()
    '何十行にもおよぶコードがあるけどこの関数は使われてない…。
End Function
```

これを一つ一つ『削除してOK？』と確認することがあります…。

その際 **オブジェクト内の関数一覧** が取得できると、

* 使用範囲確認のためのGrep検索
* 削除前と削除後の差分チェック

などがかなりはかどります。

# サンプルコード

参照設定で『Microsoft Visual Basic for Applications Extensibility 5.3』を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bed7f796-dd46-e8ea-d65f-df509025fe20.png)

```vb:『unko_god_module』という名前のオブジェクト内の関数一覧取得
'フォームに『コマンド0』という名前のボタンがあって、それをクリックした時というサンプル。
Private Sub コマンド0_Click()

    Dim vb_components_ As VBComponents
    Set vb_components_ = Application.VBE.ActiveVBProject.VBComponents
    
    Dim code_module_ As CodeModule
    Set code_module_ = vb_components_("unko_god_module").CodeModule

    Dim i_ As Long
    For i_ = 1 To code_module_.CountOfLines
    
        Dim buf_ As String
        If buf_ <> code_module_.ProcOfLine(i_, 0) Then
            buf_ = code_module_.ProcOfLine(i_, 0)
            Debug.Print buf_
        End If

    Next
    
End Sub
```

下記オブジェクトに対して関数一覧を取得できます。

* フォーム
* 標準モジュール
* クラス
* レポート

# 動作確認

例えばunko_god_moduleが下記なら…

```vb:unko_god_module
Option Compare Database
Option Explicit


Function アクセス修飾子無しfunction()
End Function

Sub アクセス修飾子無しsub()
End Sub

Private Function アクセス修飾子ありfunction()
End Function

Private Sub アクセス修飾子ありsub()
End Sub

Private Function アクセス修飾子あり引数ありfunction(ByVal tes As String)
End Function

Private Sub アクセス修飾子あり引数ありsub(ByVal tes As String)
End Sub

Private _
Function _
アクセス修飾子あり引数あり変な改行ありfunction( _
ByVal tes As _
String)
End Function

Private _
Sub _
アクセス修飾子あり引数あり変な改行ありsub( _
ByVal tes As _
String)
End Sub

           Private _
    Function _
            アクセス修飾子あり引数あり変な改行あり先頭に変なスペースありfunction( _
    ByVal tes As _
    String)
End Function

           Private _
    Sub _
            アクセス修飾子あり引数あり変な改行あり変なスペースありsub( _
    ByVal tes As _
    String)
End Sub

Private Function アクセス修飾子あり引数あり変な1行混入function(ByVal tes As String): Dim tes2 As String
End Function

Private Sub アクセス修飾子あり引数あり変な1行混入sub(ByVal tes As String): Dim tes2 As String
End Sub
```

サンプルコードの実行結果は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/98d11075-2c51-5829-cccd-7bfbecec1d38.png)

# 参考サイトさん

https://qiita.com/Q11Q/items/548c44a9b4c8b80629b1

https://learn.microsoft.com/ja-jp/office/vba/api/word.document.vbproject

https://excel-ubara.com/excelvba5/EXCELVBA269.html

https://qiita.com/Mikoshiba_Kyu/items/46b7243eb576848b3e55

# バージョン

Microsoft Windows [Version 10.0.22631.4317]
Microsoft Access for Microsoft 365 MSO (バージョン 2409 ビルド 16.0.18025.20030) 32 ビット
スタースキーマを理解する

## 記事執筆の動機
PowerBIを使用する際に、「なんとなくリレーションを組んでいたら、スタースキーマっぽくなった」から脱却するために、スタースキーマについて適切に言語化ができるようになりたくて執筆しました。

## ファクトテーブルとは
Microsoftではファクトテーブルを以下の通り記載しています。

> ファクト テーブルには観測値やイベントが格納されます。ファクト テーブルには、販売注文、在庫量、為替レート、気温などがあります。ファクト テーブルには、ディメンション テーブルに関連するディメンション キー列と、数値メジャー列が含まれています。 

参考 : [スタースキーマとPower BIでの重要性を理解する](https://learn.microsoft.com/ja-jp/power-bi/guidance/star-schema)

何度読んでもイメージしにくいですが、私は「メインで分析したいデータ」と理解しました。
具体的には、明細データやトランザクションデータなどが該当するかと思います。基本的には、日付(or時間)の列が含まれることが多いように感じます。

#### ファクトテーブルの具体例
| OrderID | Date | ProductID | Units |
| -- | -- | -- | -- |
| 0001 | 2024-01-01 | AAA | 10 |
| 0002 | 2024-01-01 | BBB | 7 |
| 0003 | 2024-01-02 | CCC | 32 |
| 0004 | 2024-01-10 | DDD | 9 |
| 0005 | 2024-02-01 | AAA | 16 |
| 0006 | 2024-03-31 | DDD | 2 |


#### ファクトテーブルの特徴
またファクトテーブルは以下の特徴を持ちます。

- ファクトテーブルは別のファクトテーブルを参照することはなく、ディメンジョンテーブルのみを参照する
- ファクトテーブルのエントリは更新されず、追記しかされない

## ディメンジョンテーブルとは
Microsoftではファクトテーブルを以下の通り記載しています。
> ディメンション テーブルでは、ビジネス エンティティ (モデル化の "対象") について説明します。 エンティティには、時間自体を含め、製品、人、場所および概念を含めることができます。 スター スキーマに存在する最も一貫性のあるテーブルは、日付ディメンション テーブルです。 ディメンション テーブルには、一意の識別子として機能する 1 つのキー列 (または複数の列) と説明列が含まれています。

参考 : [スタースキーマとPower BIでの重要性を理解する](https://learn.microsoft.com/ja-jp/power-bi/guidance/star-schema)

いやわからん。笑
何度読んでもわからなかったです笑

ディメンジョンテーブルは基本的にはマスタデータと理解して問題ないと思います。
特徴として、ファクトテーブルと比較して、列が多く行が少ないデータ形式になっていることが多いです。

スタースキーマに存在する最も一貫性のあるテーブルは、日付ディメンションテーブルであるとのことですので、日付のディメンジョンテーブルの例を見てみましょう。

#### ディメンジョンテーブルの例

| Date | Year | Month | Day | Quarter | Day-of-Week |
| -- | -- | -- | -- | -- | -- |
| 2024-01-01 | 2024 | 1 | 1 | 1 | 月 |
| 2024-01-02 | 2024 | 1 | 2 | 1 | 火 |
| 2024-01-03 | 2024 | 1 | 3 | 1 | 水 |
| 2024-01-04 | 2024 | 1 | 4 | 1 | 木 |
| 2024-01-05 | 2024 | 1 | 5 | 1 | 金 |
| 2024-01-06 | 2024 | 1 | 6 | 1 | 土 |

このように、日付に対して、さまざまな情報を付加してくれるマスタデータのようなイメージです。

## スタースキーマとは
Microsoftではスタースキーマを以下の通り記載しています。
> スター スキーマは、リレーショナル データ ウェアハウスで広く採用されている成熟したモデリング手法です。 モデラーは、モデル テーブルを "ディメンション" または "ファクト" として分類する必要があります。

参考 : [スタースキーマとPower BIでの重要性を理解する](https://learn.microsoft.com/ja-jp/power-bi/guidance/star-schema)

イメージできるでしょうか？
スタースキーマとは、ファクトテーブルとディメンジョンテーブルを統合したものです。
私が提示したファクトテーブルとディメンジョンテーブルの例では、「Date」列をキーとして、データを統合することができます。PowerBIを使用する際には、「Date」列をキーとしてリレーションを組むことによって、統合することができます。以下の図が今回のリレーションを可視化したものになります。
![スクリーンショット 2024-10-14 23.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2763253/8ae9a657-9946-f3d0-4156-ac77905ba7ff.png)

#### スタースキーマの特徴
- 1つのスタースキーマにつき、1つのファクトテーブルしか持てない
- ディメンジョンの数は可能な限り減らすようにする

## まとめ
- スタースキーマとは、ファクトテーブルとディメンジョンテーブルを統合したもの
- 1つのスタースキーマにつき、ファクトテーブルは1つまで
- ファクトテーブルはメインデータ、ディメンジョンテーブルはマスタデータのイメージ

## 参考

- [データエンジニアリングの基礎](https://www.oreilly.co.jp/books/9784814400652/)
より良い睡眠を得るためのTips

# 前書き
「睡眠」に関する書籍をいくつか読んだ。それらの書籍で共通して書かれていた、**より良い睡眠を得るためのTips** を覚え書きとして書いておく。

https://www.diamond.co.jp/book/9784478101629.html

https://www.sunmark.co.jp/detail.php?csid=3601-5

# 日光を浴びる
睡眠に関係のあるホルモンに、「メラトニン」と「コルチゾール」がある。

- メラトニン：体内リズムを整え眠りを推進させるホルモン
- コルチゾール：起き上がって動くためのエネルギーややる気をもたらすホルモン

コルチゾールとメラトニンの分泌量は反比例の関係にある。つまり、どちらか一方のホルモンが適切なタイミングで生成されるようになれば自然ともう一方も正常に生成される。
体内時計がもっとも敏感に反応する時間帯に太陽光を浴びることで、これらのホルモンが適切なタイミングで生成されるようになる。

したがって、朝日を浴びることで体内リズムを整えて睡眠と覚醒の正しいサイクルが推進される。

# 夕方以降のカフェイン接種は控える
カフェインの覚醒作用はいわずと知れている。

コーヒーやお茶でカフェインを接種した後、血中カフェイン濃度が半減するのに **4～8 時間程度**要す。したがって、眠りに付く 4～8 時間前を目安にカフェイン接種を控えるとよい。

# 深部体温と皮膚温度の差を縮める
睡眠の質を上げる体温のスイッチは、次の流れによって成り立つ。

1. 覚醒時は体温を上げてパフォーマンスを上げる
2. 皮膚温度を上げて熱放射すると深部体温は下がり入眠する
3. 朝が近づくにつれて体温が上昇し覚醒していく

1と3は自律神経の働きによるもの、2は生活のなかで意識工夫することにより成り立たせることができる。それは、**就寝する 90～120 分前に入浴する**というもの。入浴により皮膚温度が上がることで熱放射が促され、就寝のタイミングで最も皮膚温度との差が縮まることでスムーズに入眠できるようになる。
なお、手足からの熱放射を妨げないようにすること、室温も適切に保つことも大切である。

# 寝室でスマートフォンを利用しない
ブルーライトによる体内時計の乱れは、いまや社会的な問題の一つになっている。
加えて、スマートフォンを利用することで交感神経が優位になることが多い。したがって、スマートフォンの利用はすべきではない。
R markdownのWordのテンプレートが日本語環境でうまく機能しない場合の対策

## Introduction

https://gedevan-aleksizde.github.io/rmarkdown-cookbook/word-template.html

R markdownでWordファイル（.docx）を作成したい場合、上記のR markdownクックブックに従ってテンプレートファイル（.dotxファイル）を作成して希望の形式に合わせて修正する、というのが基本的な手法です。でも何故か、R markdownから出力した.docxファイルに修正したフォーマットが一部（タイトルや日付の中央寄せなど）正しく反映されず、試行錯誤の結果解決したので方法を共有します。

## Conclusion

やり方は簡単です。
Wordを英語環境に変更して立ち上げなおし、英語環境のWordでテンプレートファイル（.dotxファイル）を保存しなおして読み取り専用に変更するだけです。そのあとはWordを日本語環境に戻しても大丈夫です。

## 実際の手順

日本語環境のWordで.dotxファイルを保存すると、スタイル名の一部（おそらくデフォルト的なスタイル）が日本語になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358221/46b49369-84ed-86ca-363e-01171fb9f0bd.png)

これが正しく機能しない理由と思いました（小並感）。なので、英語環境に変更して保存しなおしてみます。

「ファイル」メニューから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358221/453e6c78-d0cf-34ae-d554-5e3b279f8540.png)

「オプション」を選んで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358221/6c054fa7-0480-7d90-e342-deff905e8f70.png)

「言語」を選んで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358221/c261c384-ef36-0102-1f77-372135b88145.png)

「英語」を選択した状態で「上に移動」を押して「OK」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358221/21d71b78-60a0-eea9-6617-206d785572c7.png)

生意気にも命令しやがるので服従します。（Officeを閉じます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358221/234661df-d5a2-a02c-13d4-89084751606f.png)

Officeを立ち上げ直して
.dotxファイルを開くと、この通りスタイル名も英語です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358221/92446d9d-5b6d-4c00-4f12-9498a6bcd2b2.png)

この状態で保存し、ファイルを右クリックしてプロパティを選択し、
読み取り専用にチェックを入れて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358221/66be6321-ee1b-0598-4a64-ea9293ad768f.png)

再度knitすれば、.dotxファイルの形式が反映されています。
（読み取り専用にするのはこの後間違えて日本語環境で開いて自動保存されないようにするためです。）
状況に応じて透明ActivityなThemeにOverrideする方法

## はじめに
ここで会ったが5年目、チャレンジは3回目。
掲題の、透明Activityへの動的変更というお代に対してやっと解決したので記事として残します。

## 透明Activityが動的指定で必要な理由
画面A(HogeActivity)から画面B(FugaActivity)へ遷移した状態で下スワイプ時、背景に画面Aが出てほしいという仕様を満たすために透明Activityが必要となりました。
ただ、ActivityのXMLは大体共通のものを使っているため、画面によってThemeを変えられないと無駄にXMLが増えてしまうことからOSバージョンを見て透明ActivityなThemeにOverride可能なことが必須でした。

## 実装方法と詳細
色々サイトにあるように、Activity#onCreateでsetContentViewする前に変更する必要があります。
以下で動作しています。

```kotlin
override fun getTheme(): Resources.Theme {
    val theme: Resources.Theme = super.getTheme();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        theme.applyStyle(R.style.TranslucentTheme, true)

        lifecycleScope.launch(Dispatchers.IO) {
            // setTranslucentはメインスレッドで呼ぶとANRになるので注意!!
            setTranslucent(true)
        }
    } else {
        theme.applyStyle(R.style.Theme_AppCompat_DayNight_NoActionBar, true)
    }
    return theme
}
```

`override fun getTheme()` を使いたくない場合は以下でもOKです(getThemeはActivity起動時複数回呼ばれる)

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // 以下は透明なActivityにするための処理(OS11以上)
        window.setBackgroundDrawableResource(android.R.color.transparent)
        lifecycleScope.launch(Dispatchers.IO) {
            // setTranslucentはメインスレッドで呼ぶとANRになるので注意!!
            setTranslucent(true)
        }
    }
}
```

透明なTheme(TranslucentTheme)は以下
```xml
<style name="TranslucentTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>
```

ポイントは以下3点です
1. getThemeをoverrideし、所定のStyleを読み込むようにします(動的にThemeを変更するだけならこれのみでOK)
1. 透明Activityにしたい場合はsetTranslucent(true)が必須ですがOS11以上でないと使えません
1. 透明Activity使用時はOSバージョンに気をつける必要があります(OS8だと[クラッシュの恐れ](https://tech.studyplus.co.jp/entry/2018/12/10/125101)があります)

以上。
PVEのCTテンプレート一覧の更新


## TL;DL

- `PVEノード-ストレージ-CTテンプレート-テンプレート`から表示できるCTテンプレートの一覧の更新方法
- 日時で更新される
- インストール直後にLXCを使いたい場合など、手動更新も可能

## 概要
評価でPVEを新規構築し、とりあえずの評価にTurnkey Linuxを使おうと思うと以下画面のようにない場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/ca191745-b9f9-69ab-f3be-a9f5f6283f41.png)



既に構築済みのPVEは特に何かしたわけでもないのにTurnkey Linux使えるようになっているし…と思ったので調べてみました。

というか、Wikiに一通り書いてありました…


https://pve.proxmox.com/wiki/Linux_Container

## 自動更新

日時更新されるようです。
そのため、インストール直後は最新のリストが利用できません。

日時更新を待たずに利用したい場合は手動更新の必要があります。

ちなみにこのリスト、Turnkey Linuxにおいては以下のリストを利用しているようです。

https://releases.turnkeylinux.org/pve/
https://www.turnkeylinux.org/forum/general/20131203/template-listing-proxmox

## 手動更新

`pveam update `で手動更新することが可能です。
以下ログです。

```
root@pve1014:~# pveam available 
unable to open file '/var/lib/pve-manager/apl-info/releases.turnkeylinux.org' - No such file or directory
mail            proxmox-mailgateway-7.3-standard_7.3-1_amd64.tar.zst
mail            proxmox-mailgateway-8.0-standard_8.0-1_amd64.tar.zst
system          almalinux-9-default_20221108_amd64.tar.xz
（中略）
system          ubuntu-23.10-standard_23.10-1_amd64.tar.zst
root@pve1014:~# 
root@pve1014:~# 
root@pve1014:~# pveam update 
update successful
root@pve1014:~# 
root@pve1014:~# 
root@pve1014:~# pveam update availabl
mail            proxmox-mail-gateway-8.1-standard_8.1-1_amd64.tar.zst
mail            proxmox-mailgateway-7.3-standard_7.3-1_amd64.tar.zst
system          almalinux-9-default_20240911_amd64.tar.xz
（中略）
turnkeylinux    debian-12-turnkey-zoneminder_18.0-1_amd64.tar.gz
root@pve1014:~# 
```

## リストの手動修正（できませんでした）

最新のリストは `/var/lib/pve-manager/apl-info` に格納されていました。
このリストを手動で修正し、反映できるかと思いましたができませんでした。
ですが、このリストを直接修正してテンプレートをダウンロードするよりも、ダウンロードURLを直接入力する方が早いので追いません。

ちなみに、`/usr/share/pve-manager/`にもリストが保存されていますが、こちらはインストール直後に利用されるもののようで最新化されていませんでした。


## リストにないテンプレートを使いたい時は

以下が候補かと思います。

- URLを調べて`URLからダウンロード`を利用する
- 別途入手して`/usr/share/doc/pve-manager/`に格納する

## まとめ

このリストをあえて更新するケースは限定的ですが、日時で自動更新されてしまう仕様については認識しておくといいと思いました。
※こっそりリストが更新され、利用したいテンプレートのバージョンが上がってしまい、差異が発生するなど。
初めての OpenAPI 体験：API と Webhook 仕様書作成の備忘録

# 初めて OpenAPI で API と Webhook の仕様書を書いてみた

最近、初めて OpenAPI を使って API と Webhook の仕様書を書いてみました。初めての経験だったので、調べながら進めましたが、その際の学びや気づきを備忘録としてまとめておきます。同じように OpenAPI に挑戦する人の参考になれば幸いです。

### 使用ツール：Swagger Editor

仕様書を作成する際に使用したのは [Swagger Editor](https://editor-next.swagger.io/) です。このツールは、リアルタイムで変更が反映される上に、エラー箇所もハイライトしてくれるので、とても便利でした。

ただし、いくつか問題もありました。特に「改行」がそのまま反映されず、HTML の `<br/>` タグを使わないと改行ができない点です。これは Swagger Editor の仕様なのか、他のツールでも共通なのかは分かりませんが、少し不便に感じました。その一方で、リストやテーブルは HTML で記述できたので、結果的には良かったと思います。

### tags の扱いについて

API (`paths`) では `tags` を利用してエンドポイントをまとめられるのですが、Webhook には `tags` が反映されませんでした。Webhooks にも `tags` が使えるのかもっと調べる余地がありそうですが、今回は特に必要性を感じなかったので、一旦保留としました。

### Webhooks と OpenAPI バージョンの関係

Webhooks を OpenAPI で表現するには、バージョン 3.1 以降が必要です。最初は OpenAPI 3.0 で書き始めましたが、Webhooks がサポートされていないことに気づき、急遽 OpenAPI 3.1 に切り替えることにしました。

### GET パラメータでの連想配列の扱い

GET パラメータで連想配列を指定する方法が分からず、少し悩みました。PHP では `param[key][]=value` のように記述すると、`key` が確定していない配列でも自動でパースしてくれますが、これを OpenAPI で表現するのが難しかったです。

とりあえず `type: array` で `param[key][]` としてパラメータを定義してみましたが、UI 上で `key` を変更できないため、もっと良い方法があるかもしれません。引き続き調査が必要です。

### allOf と enum の関係

`allOf` を使って `enum` を指定する際、元の値が上書きされず、追加されるということが分かりました。`enum` 以外の要素を先に定義し、その後 `allOf` で `enum` を追加すると、よりきれいに整理された仕様書を作成できることが分かりました。例えば以下のような形です：

```yaml
Status:
  type: string
  description: ステータス
StatusSuccess:
  allOf:
    - $ref: '#/components/schemas/Status'
    - enum:
      - updated
      - created
StatusError:
  allOf:
    - $ref: '#/components/schemas/Status'
    - enum:
      - not found
      - validation error
```

### 認証ヘッダーの指定

`Authorization` ヘッダーは `securitySchemes` で指定することができます。例えば、Basic 認証の場合は以下のように記述します：

```yaml
type: http
scheme: basic
```

また、独自の認証ヘッダーを設定したい場合は、次のように記述します：

```yaml
type: apiKey
name: original-header
in: header
```

### 複数のタイプの指定

`string | null` のように複数の型を許可する場合、`oneOf` を使用します。例えば：

```yaml
oneOf:
  - type: string
  - type: 'null'
```

`nullable` を指定する際には、型を `'null'` と文字列として定義する必要があることも覚えておくと良いです。

---

以上、初めての OpenAPI での仕様書作成を通じて学んだポイントをまとめました。最初は戸惑う部分もありましたが、次回以降はもっとスムーズに書けるのではないかと思います。
ChromebookのLinux環境が容量不足等で起動しなくなった際の対処法

:::note warn
正常に起動できる保証はありません。ご了承ください。
:::

# 経緯
ChromebookなどのChromeOSにはLinuxの開発環境をインストールできます。先程EasyOCRをインストールしていたところ、おそらく容量不足でターミナルが起動しなくなりました。その対処法をメモしておきます。

# 発生したエラー
```shell
ERROR vsh: [vsh.cc(173)] Failed to launch vshd for termina: penguin: requested container does no
t exist: penguin
```
# 実行したコマンド①
まず、Ctrl+Alt+Tでcroshを開いてください。
そして以下のコマンドを実行します。

```:croshで
vmc start termina
```
すると、`chroneos@localhost`の下でLinux環境のコンテナが開きます。
次にこのコマンドで普段のユーザーとして操作できるようにします。(lxcコマンドはよく理解できていません。すみません。)
```shell:chroneos@localhost
lxc start penguin
lxc exec penguin -- sudo --user <ユーザー名> --login
```
(penguinはホスト名)

ここで起動するかと思いましたが、termialのアプリでは未だ同様のエラーが出ていました。

# 実行したコマンド②
ただの再起動です
```shell:(username)@penguin
vmc stop termina
vmc start termina
```

これで無事起動することができました。容量不足には気をつけましょう。

# 参考
https://support.google.com/chromebook/thread/243441071/penguin-not-opening
https://issuetracker.google.com/issues/291148932
投稿 106 fgets() 2024/10/14

本日の勉強時間　3H

file get stringの略。
ファイルポインタから一行を読み込むための関数。
標準入力や、ファイルからデータを読み込む際に使用する。


そもそも、標準入力とはプログラムが外部からデータを受け取るための
デフォルトの入力ストリームのこと。
WSL2でDockerを使用するときに発生するパーミッションエラーの回避方法

## はじめに
WSL2環境下でDockerを使い始めたのですが、パーミッションエラーがとにかくたくさん出たので対処方法を残しておきます。

### 開発環境
- Windows11マシン
- WSL2
- Ubuntu
- Rails
- Docker

※バージョン等詳細は今回は大事ではなさそうなので省きます

## 問題
`rails new` `rails g`などで作成したファイルでパーミッションエラーがでる。
具体的にはVSCODEで編集しようとすると保存できない。

### 前提
- Dockerでrails環境を構築
- `docker compose exec rails /bin/bash`　でシェルを起動し`rails new`などを行った

### 原因
- `rails new`などで作成したファイルのオーナーはデフォルトだとrootユーザーになる
- VSCODEで編集・保存をするのはWSL2ユーザーになる
- デフォルトでは所有者でもグループでもないファイルに書き込み権限は付与されない

## 解決方法
WSL2のデフォルトユーザーをrootにする。

### 方法
- Ubuntuターミナルを起動
  ```bash
    # rootユーザーに切り替える
  $ sudo su -
    # Passwordを設定する
  $ passwd
    # このコマンドのあとにパスワード入力画面が表示
  ```

- PowerShellを起動
    ```bash
    # デフォルトユーザーをrootに変更
    ubuntu config --default-user root
    ```
### 注意点
- rootは権限が強いので、万が一Windows側の重要なファイルを削除してしまうと大変なことになる
- 対応策：WSL2からWindows側のファイルへの書き込み権限をなくす
    - ubuntuターミナルを起動
    ```bash
    # wsl.confを編集する
    $ cd  /etc
    $ nano wsl.conf
    ```
    - 以下を追記
    ```bash
    [automount]
    options="metadata,umask=22,fmask=11,ro"
    ```
    - windowsを再起動

### 微妙に詰まったところ
- デフォルトがrootになるとルートディレクトリでlsをしても何も表示されない
- `cd /home/今まで使ってたusername`で今まで使っていたディレクトリをそのまま使える

### 他の方法
#### Dockerfileを書き換える
- USERを変えるように設定する
- 具体的には　`USER $USERNAME`のような記述をDockerfileの最後の方で行うと、`rails g`などのコマンドをrootではなく任意のusernameのユーザーにできる
- 所有者が任意のユーザーになるので編集も可能

#### linuxのファイル作成時のデフォルト権限を変更する
- .bashrcに`umask 000`を記述する

## おわりに
これで都度`chmod`をする必要がなくなりました

## 参考
[【Docker】 WSL 2 を利用したコンテナー内開発で権限をどう設定するべきか](https://futureys.tokyo/how-permission-should-be-set-for-developing-inside-a-container-using-wsl-2/)

[WSL2でDockerを使用する際に発生するパーミッション問題の解決方法](https://dev.startialab.blog/docker/a221)

[WSL2でDockerを使用する際の権限問題を解決するシンプルな方法（docker-compose.yml使用）](https://qiita.com/twu_go/items/a449e3006bd74fc7d10d)
初学者でもawkの使い方が知りたい！

# はじめに
LinuxやC言語を中心に学習中の42tokyoの生徒です。
Linuxコマンドを学習している際にawkの使い方がいまいち理解できなかったので、改めて調べてみました。

# 前提
awkについて、網羅的に理解できる内容にはなっていないこと最初にお断りをしておきます。私のような初学者が、少しでもawkについて理解を深めるための参考になればと思い調べたことを記載しております。

# awkの基本形
<説明>
コマンドラインもしくは入力のファイルパスからテキストを受け取り、行ごとに処理される。パターンにマッチした行はアクションに記載の処理が実行される。
```
awk 'パターン { アクション }' [入力のファイルパス]
```
よく上記のように書かれていますが、これをみてもよく分かりませんよね。(私がそうでした。)以下に例を載せて記載しておりますので、徐々に分かるようになると思います。

### パターン
awkの”パターン”には4種類あります。それぞれの使い方例について以下に記載いたします。
①評価式
②正規表現
③BEGIN
④END

### 事前準備① sample.txtを用意
以下、説明しやすいように、「sample.txt」を用意しました。
sample.txt
```
apple 1
banana 2
grape 3
```

### 事前準備② $1、$2、$0
$1は各行の1列目、$2は各行の2列目、$0は全ての列を表します。

例1
```
awk '{print $1}
-出力結果- 
apple
banana
grape
```

例2
```
awk '{print $2}
-出力結果- 
1
2
3
```

例3
```
awk '{print $0}
-出力結果- 
apple 1
banana 2
grape 3
```


### パターン①：評価式
条件に合致した行が処理されます。
```
awk '$1 == "apple" {print $2}' sample.txt
-出力結果- 
1
```
### パターン②：正規表現
正規表現に合致した行が処理されます。
```
awk '$1 ~ /apple/ {print $0}' sample.txt
-出力結果- 
apple 1
```

<補足>
~: 正規表現でマッチするかどうかを判定する演算子
/正規表現/: 正規表現をスラッシュで囲む

### パターン③：BEGIN
awkの処理が開始される前に一度だけ実行されます。
```
awk 'BEGIN { count = 0 } { count++ } END { print "行数:", count }' sample.txt
-出力結果- 
4
```

### パターン④：END
awkの処理が終わる際に一度だけ実行されます。
```
awk '{print $0} END { print "完了" }' sample.txt
-出力結果-
apple 1
banana 2
grape 3
完了
```

# awkの組み込み変数
awkと一緒に利用できる変数が用意されています。

### レコード関連の変数
| 変数 | 意味 |
| ---- | ---- |
| NR | 処理中の現在のレコード番号（行番号）。1から始まる |
| FNR | ファイルごとのレコード番号。複数のファイルを処理する際に、各ファイルの先頭からカウントが再開される。|
| NF | 現在のレコードのフィールド数（列数） |

### ファイル関連の変数
| 変数 | 意味 |
| ---- | ---- |
| FILENAME | 現在処理しているファイルの名前 |
| ARGC | コマンドライン引数の個数 |
| ARGV | コマンドライン引数の配列 |

### 区切り文字関連の変数
| 変数 | 意味 |
| ---- | ---- |
| FS | フィールドの区切り文字（デフォルトはスペースやタブ） |
| OFS | 出力時のフィールド区切り文字 |
| RS | レコードの区切り文字（デフォルトは改行） |
| ORS | 出力時のレコード区切り文字 |

### その他変数
| 変数 | 意味 |
| ---- | ---- |
| CONVFMT | 数値を文字列に変換する際のフォーマット（デフォルトは %.6g）|
| ENVIRON | 環境変数を配列として格納したもの。ENVIRON["PATH"] のようにアクセス可能 |
| OFMT | 数値を出力する際のフォーマット（デフォルトは %.6g） |
| IGNORECASE | 大文字小文字を区別しない場合は1を設定する（デフォルトは0で、区別あり） |

# awkのオプション

### -F '文字列'
フィールド区切り文字を指定するオプション。デフォルトはスペースやタブだが、カンマやコロンなど任意の文字列に変更可能。

使用例
```
awk -F ',' '{print $1, $2}' file.txt  # カンマ区切りのCSVファイルを読み取る
```

### -v 変数名=値
スクリプト内で使う変数を外部から設定するオプション。awk のスクリプト内で使用する変数を直接渡せます。

使用例
```
awk -v threshold=10 '{if ($1 > threshold) print $1}' file.txt
```

### -f ファイル名
実行する awk のスクリプトを別ファイルに保存して、ファイルを指定して実行するオプション。長いスクリプトや再利用可能なスクリプトを書く際に便利です！

使用例
```
awk -f script.awk sample.txt
```
※通常 .awk 拡張子を付けるのが一般的。拡張子自体は必須ではないので、script.txt でも動作はしますが、.awk を使うことが推奨とのことです。

# 終わりに
少しでも参考になれば嬉しいです。今後もLinux、C言語の学習に邁進いたします。
【SAA】Route53

# 目的
SAAの勉強用にRoute53を学んだらとっても面白かったので
備忘録レベルで私の理解を残しておく。
SAA資格取得を志すどこかの誰かの参考になってくれたら幸い。

# Route53について
Route53とはAWSが提供するフルマネージド型のDNS運用サービスである。今回はシンプルにクライアントがAWS内のEC2インスタンスで稼働しているWebコンテンツにアクセスする例を考える。このケースでRoute53の最も多いのが、ELBのエンドポイントにルーティングするという使われ方だ。システムの規模やリソースの稼働状況、地理的な要因などさまざまな状況に合わせて適切なルーティングを実現できる。
次から大きく3つに分けて解説していく
- ルーティングポリシー(7つ）
    - シンプルルーティング
    - 荷重ルーティング
    - フェイルオーバールーティング
    - 位置情報ルーティング
    - 地理的近接ルーティング
    - 複数回答ルーティング
    - レイテンシールーティング
- レコード
- ホストゾーン

## ルーティングポリシー
### シンプルルーティング
これは最も標準的なDNSとしての使われ方である。
クライアントがアクセスしたいURLのドメイン名に対してELBのエンドポイントを返してあげるという構成だ。
<img>

### 荷重ルーティング
こちらは異なる性能のEC2インスタンスが3つ稼働している場合、ルーティングに重みを付けをすることで最も性能の高いEC2インスタンスへアクセスさせるといった使い方ができたりする。

<img>

### フェイルオーバールーティング
稼働中のEC2インスタンスが3つとも障害により停止してしまった場合、Route53側でリソースのヘルスチェックの結果からクライアントへ「現在サービスの障害復旧中です」といったページへルーティングできる機能。sorryページなんて言ったりする。sorryページは通常、S3の静的Webコンテンツに配置されていたりする。primaryにELBをセットし、SecondaryにS3のWebコンテンツエンドポイントに向ける。
<img>

### 位置情報ルーティング
クライアントの位置情報を元に最適なリソースを提供するようにルーティングできる機能。例えば日本に住んでいるクライアントからのアクセスに対して日本語のWebコンテンツにルーティングさせたりなど。
<img>

### 地理的近接ルーティング
位置情報ルーティングと少し混同するが、こちらはクライアントがアクセスしてきた地点から最も近いリソースへルーティングさせてできるだけ低遅延で返すことを目的としている。
<img>

### 複数回答ルーティング
3つのEC2インスタンスが稼働しているとする、ランダムでヘルスチェックを行い、問題なければルーティングする。問題あれば別のリソースのヘルスチェックをして問題なければルーティングする。といった使われ方を実現する機能である。
<img>

### レイテンシールーティング
最も遅延がないリソースへルーティングする機能である。

## レコード
DNSサーバにはさまざまなレコードを登録することができるがRoute53にはAliaceレコードという特別なレコードがある。こちらはドメイン名(Zone Apex)とELBエンドポイントなどのAWSリソース名を紐付けしておくことができる。CNAMEレコードも同様な設定が可能だが以下の点で優れている。
- 可用性：
AWSエンドポイントは予告なく変更されたりするらしいが、Aliaceの場合は変わってもAWSが変更後のエンドポイントに再登録してくれる。これにより予期せぬアクセスエラーや手動による変更作業の負荷軽減を実現できる。最高である。
- レイテンシー：
CNAMEレコードに登録した場合、クライアントからのドメイン要求に対して一度エンドポイント名を返し、再度エンドポイントに紐づくIPアドレスを返却しなくてはならない。しかし、Aliaceの場合は一回のアクセスでエンドポイントに紐づくIPアドレスを返却することが可能なのである。素晴らしい。どちらの場合もエンドポイントとIPアドレスを紐づけるAレコードの登録は必須であるが。

<img>

## ホストゾーン

- パブリックホストゾーン：インターネット上で公開され、グローバルにアクセス可能。こちらが普通のDNSサーバとしての機能。
- プライベートホストゾーン：指定されたVPC内のみで利用され、インターネットからはアクセス不可。こちらはVPC内で名前解決する時の使われ方。

# 終わりに
のちのちちゃんと図を入れます。
サクラエディタで『マクロ実行中』ダイアログを出さないようにして誤キャンセル防止

# 概要

サクラエディタでマクロを実行していると、時々下記ダイアログが **マクロを実行しているウィンドウより前に** 出てきてしまうことがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0f93e23f-e40d-ffa1-9949-3434e0f40195.png)

『実行結果を確認してエンター』を繰り返すようなマクロの場合、誤ってキャンセルしてしまうことがあります。
それを防止したい。

# 設定方法

『設定』 ⇒ 『共通設定』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bd7253fe-c877-b259-774d-6afabd47a643.png)

『マクロ』 ⇒ 『キャンセル確認待ち時間』を0秒に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7139477d-3475-5d66-769b-894004d4b1b6.png)

# 参考サイトさん

https://sakura-editor.github.io/bbslog/sf/macro/570.html

# バージョン

Microsoft Windows [Version 10.0.22631.4317]
サクラエディタ32bit Ver. 2.4.2.6048
Opensearchをローカル環境で軽く使用する方法（ダッシュボードなし）

# ローカル環境でOpenSearchを簡単に実行する方法（ダッシュボードなし）

OpenSearchは強力な検索エンジンで、ログ分析、検索エンジン、データ分析などに広く使用されています。時には、ダッシュボードを使わず、軽量にOpenSearchサーバーのみをローカル環境で実行し、データをテストしたり、開発環境で活用することが求められます。今回は、Docker Composeを使用してOpenSearchを軽量に実行する方法を紹介します。

## 必要なもの

1. **Docker**と**Docker Compose**がインストールされたローカル環境
2. 最低4GB以上のメモリ

## Docker Compose設定ファイルの作成

以下は、OpenSearchをローカル環境で実行するための`docker-compose.yml`ファイルです。このファイルはダッシュボードを使用せず、OpenSearchサーバーのみをシンプルに実行するための設定です。

```yaml
version: '3'
services:
  opensearch:
    image: opensearchproject/opensearch:latest
    container_name: opensearch-node1
    environment:
      - cluster.name=opensearch-cluster
      - node.name=opensearch-node1
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - opensearch-data:/usr/share/opensearch/data
    ports:
      - 9200:9200
      - 9600:9600
    networks:
      - opensearch-net

volumes:
  opensearch-data:

networks:
  opensearch-net:
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824062/5b83a84f-bc5e-419d-d9a9-d23267a13412.png)


### 主要設定

- `image`: OpenSearchの最新バージョンイメージを使用します。
- `discovery.type=single-node`: クラスタ構成なしで単一ノードモードで実行されるように設定します。
- `OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m`: OpenSearchが使用するメモリ量を設定します。デフォルトで512MBを割り当てます。
- `ports`: OpenSearchは9200ポートで動作し、9600ポートはステータスチェック用のポートです。
- `volumes`: OpenSearchのデータは`opensearch-data`ボリュームに保存されます。

## OpenSearchの起動

1. `docker-compose.yml`ファイルを作成したら、ターミナルでそのファイルがあるディレクトリに移動します。
2. 次のコマンドでOpenSearchを起動します：

```bash
docker-compose up -d
```

このコマンドを実行すると、OpenSearchがバックグラウンドで実行されます。

## OpenSearchの状態確認

OpenSearchが正常に起動しているかどうかは、次のコマンドでDockerコンテナの状態を確認することができます。

```bash
docker ps
```

正常に実行されている場合、`opensearch-node1`コンテナが一覧に表示されます。

## OpenSearch APIでデータをテストする

OpenSearchが起動したので、`curl`コマンドを使用してデータの保存や取得をテストできます。

### クラスター状態の確認

```bash
curl -X GET "http://localhost:9200"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824062/77552ab2-71dd-0646-a5c4-38df4a0d1538.png)




正常に動作していれば、クラスターの状態情報がJSON形式で返されます。

### データインデックスの作成

```bash
curl -X PUT "http://localhost:9200/my-index?pretty"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824062/763fb075-fae8-6714-583e-64619c3a671a.png)


このコマンドは`my-index`という名前のインデックスを作成します。

### ドキュメントの追加

```bash
curl -X POST "http://localhost:9200/my-index/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
  "name": "Jane Doe",
  "age": 29,
  "occupation": "Developer"
}'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824062/e552268f-02cf-b1c6-bad3-8106f92a0a54.png)


このコマンドはインデックスにドキュメントを追加します。

### ドキュメントの取得

```bash
curl -X GET "http://localhost:9200/my-index/_doc/1?pretty"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824062/bf9526f8-55fc-7ff3-64ab-0c4a9547d658.png)


このコマンドは、IDが1のドキュメントを取得します。

## まとめ

このようにして、OpenSearchをローカル環境でシンプルに実行し、ダッシュボードを使用せずにデータを操作する方法を紹介しました。必要に応じてOpenSearch Dashboardsを追加し、視覚化も可能ですが、今回のガイドでは軽量にOpenSearchを使用することに焦点を当てました。
ECS Fargateにてcronが実行できない事象を解消する

## この記事の対象とする方
コンテナにてcronサービスを起動しており、ECS on EC2では起動していたがFargateにすると起動しなくなる事象に遭遇している方。

## エラー内容
AWS-SDK等でIAM ロール（タスクロール）の認証情報を取得しようとしたタイミングで以下のようなエラーが出力される。(Cloudwatch Logsに出力されるように設定していればそこを見に行く)

```
Error retrieving credentials from the instance profile metadata service. 
(cURL error 7: Failed to connect to 169.254.169.254 port 80 after 0 ms: Couldn't connect to server (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
for http://169.254.169.254/latest/meta-data/iam/security-credentials/
```

## エラー原因

https://dev.classmethod.jp/articles/tsnote-ecs-fargate-169-254-169-254/

上記に記載の通り、
`AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`
の環境変数がcronのサービス起動時に取得できていない。

この環境変数が取得できないためEC2用の

```
http://169.254.169.254/latest/meta-data/iam/security-credentials/
```
にリクエストを送ってしまっている。

## 対応方法
cronの環境変数に AWS_CONTAINER_CREDENTIALS_RELATIVE_URI を読み込ませる。

### コード例

export-env
というファイルを作成し、以下のように記述する。

```
# docker-entrypoint.sh にて sed で置換する。
export AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=aws_container_credentials_relative_uri
```

Dockerfile にて コンテナ内にコピーする。
```
COPY ./export-env /usr/local/etc/export-env
```

docker-entrypoint.sh など起動時に、 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI の環境変数に設定されている内容を export-env のファイルに書き込む。
```
# cronにて読み込ませるための環境変数をexport-envに設定
sed -i "s@aws_container_credentials_relative_uri@$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI@g" /usr/local/etc/export-env
```

crontab など cron設定ファイルにて source /usr/local/etc/export-env で AWS_CONTAINER_CREDENTIALS_RELATIVE_URI の環境変数を設定する。


```
# source /usr/local/etc/export-env で 環境変数を読み込んだ後にcron実行したいコマンドを記載する
* * * * * source /usr/local/etc/export-env && /usr/local/bin/php /var/www/html/artisan inspire > /tmp/stdout 2>&1
```


## 参考資料

https://qiita.com/showchan33/items/cedb8814b5ccce3b25b4 

https://blog.pinkumohikan.com/entry/could-not-retrieve-credential-when-using-aws-sdk-from-php-app-on-ecs 

https://dev.classmethod.jp/articles/tsnote-ecs-fargate-169-254-169-254/
サクラエディタで制御文字を入力・検索・置換する

# はじめに

サクラエディタで制御文字を入力・検索・置換する方法をそれぞれ示します。

# 制御文字を入力する

① 編集(E) > 挿入(I) > コントロールコード入力(C) を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/e7a0d73d-54d8-1aa4-6f68-f52faa62d30a.png)

② 任意の制御文字を選択し、OKボタンを押下すると、エディタ上のカーソル位置にNULL文字が挿入されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/575764b5-0cf2-cb33-b3d7-021b66dad0af.png)

# 制御文字を検索する

① 検索(S) > 検索(F)...を選択する。または Ctrl + Fを入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/c20ff10a-8a97-9b89-71cc-01d6ecabda31.png)

② 正規表現(E)にチェックをつけたあと、`\x{HHHH}`を条件(N)に入力。上検索(U)・下検索(D)を押下すると、対象の制御文字がエディタ上でハイライトされます (`\x{HHHH}`の`HHHH`の部分には、対象の制御文字の文字コードを16進数で指定する)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/f9b66163-9ad3-4c98-ff9d-1cca44bdd73e.png)

# 制御文字を置換する

① 検索(S) > 検索(R)...を選択する。または Ctrl + Rを入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/d31b3b3b-6de2-6514-90b0-d925ee33a436.png)

② 正規表現(E)にチェックをつけたあと、`\x{HHHH}`を置換前(N)に入力。置換(R)・すべて置換(A)を押下すると、対象の制御文字が置換後(P)の文字に置換されます (`\x{HHHH}`の`HHHH`の部分には、対象の制御文字の文字コードを16進数で指定する)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/9ad7db78-9573-a1b8-811c-3993838f7da0.png)

# 環境情報

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/22aaa0d8-0c23-b48c-2029-4f4d0232be40.png)
CI/CDってなに？

## はじめに
CICDについて言葉はしっているものの何のことかを知らなかったため、記事を通して理解を深めていければと思います。
間違い等ございましたらご指摘いただけますと幸いです。

#### 目次
1. CI/CDとは何か
1. 継続的インテグレーション（CI）
    2-1.役割
    2-2.メリット
1. 継続的デリバリー（CD）
    3-1.役割
    3-2.メリット
1. CI/CDのツール

## 1.CI/CDとは何か
CI/CDは「継続的インテグレーション（CI）」と「継続的デリバリー/デプロイ（CD）」の略であり、ソフトウェア開発プロセスを効率化し、品質を向上させるための手法です。
ソフトウェアの開発からリリースまでの一連のプロセスを自動化します。

**＜背景＞**
CI/CDの手法が取り入れられた背景には、従来のウォーターフォール開発が持つ長い開発サイクルがあります。この手法では、要件定義、設計、実装、テストの各フェーズを終えた後にリリースを行うため、問題が発生した場合の修正が非常に困難でした。
しかし、アジャイル開発が普及する中で、ユーザーのニーズに迅速に応える必要が高まり、CI/CDによって自動化されたテストを導入することで、頻繁なリリースが可能となりました。

## 2.継続的インテグレーション（CI)

**2-1.役割**
CIはソフトウェア開発において、開発者が新しく書いたコードを頻繁にプロジェクトのリポジトリに追加しこれを自動でテストやビルドするプロセスです。

**2-2.メリット**

＜早期のバグ発見と修正＞
コードが追加されるたびにテストが行われるため、問題を早期に見つけることができその分修正も迅速にできる

＜品質の向上＞
定期的なテストによりコードの品質が保証され、リリース前に重大な問題を回避できる

＜生産性の向上＞
手動で行っていたテストやビルドを自動化することで開発者のタスクを減らせる

## 3. 継続的デリバリー（CD）

**3-1.役割**
CDはソフトウェアのリリースプロセスを自動化し、テストに合格したコードをすぐに本番環境にデプロイ可能な状態に保ちます。
（自動でデプロイはされません。自動は継続的デプロイで行われる）

**3-2.メリット**

＜品質の向上＞
CDでも自動テストが導入されており、バグやエラーを早期に発見できるためリリース後に問題が発生するリスクが減少し、全体的な品質が向上する

＜迅速で安定性のあるリリース＞
コードが自動でテストされており、リリースの準備が整った状態に維持されるため、リリースまでの時間が大幅に短縮されリリース後のトラブルも最小限に抑えることができる

## 4.CI/CDのツール
Jenkins
https://codefresh.io/learn/jenkins/ci-cd-with-jenkins-in-3-steps/
GitHub Actions
https://docs.github.com/en/actions
Azure DevOps
https://learn.microsoft.com/ja-jp/azure/devops/pipelines/?view=azure-devops

などなど

## 5.まとめ
調べてみると、アジャイル開発をする中でとても便利な手法だと感じましたが初期設定などに時間がかかるというデメリットもありそうです。
ですが、１つ１つ手動でやるよりも間違いなく効率はいいと思うのでこれからCI/CDを取り入れて開発していこうと思います。
NGINX https index.html configuration

These instructions should work for a Debian GNU/Linux
NGINX is an http server listening by default on port 80 (http)
Would you like to setup your host to accept SSL/TSL calls on port 443 (https)
```bash
https://mywebsite.com
```

You should have "let's encrypt" certificate files:
```bash
/etc/letsencrypt/live/mywebsite.com/fullchain.pem
/etc/letsencrypt/live/mywebsite.com/privkey.pem
```
To install nginx with Linux bash command
```bash
sudo apt install nginx
```

to start and stop and verify http server
```bash
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl status nginx
```

check the server is running as www-data process.
You should find this line in `/etc/nginx/nginx.conf`
```bash
user www-data;
```

to verify your port 80 is binding with nginx
```bash
sudo netstat -plnt
```

your http index directory sohoud go into `/var/www/` 
```bash
sudo mkdir /var/www/mywebsite.com
sudo chown www-data /var/www/mywebsite.com
sudo chgrp www-data /var/www/mywebsite.com
sudo chmod 775 /var/www/mywebsite.com
```

create a new file for website configuration in `/etc/nginx/sites-available/`
```bash
sudo vi /etc/nginx/sites-available/mywebsite.com
```

copy this configuration as the content
```nginx
server {
  root /var/www/mywebsite.com;
  server_name *.mywebsite.com;
  keepalive_timeout 70;
  ssl_session_tickets on;

  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;

  index index.html;
}

server {
    return 301 https://$host$request_uri;

    listen 80;
    listen [::]:80;
    server_name *.mywebsite.com www.mywebsite.com mywebsite.com;
    return 404; # managed by Certbot
}
```

create a symbolic link in `/etc/nginx/sites-enabled`
```bash
  cd /etc/nginx/sites-enabled
  sudo ln -s /etc/nginx/sites-available/mywebsite.com mywebsite.com
```

include your username (i.e. bob) into `www-data` group 
```bash
  usermod -a -G www-data bob
```

create an index file
```
  echo "it works!" > /var/www/mywebsite.com/index.html
```


restart nginx http server
```bash
sudo systemctl restart nginx
```

make the test, open your browser and type your website url:
```bash
   https://mywebsite.com
```