OmniAICreator/Qiita-1.07M huggingface dataset:
CとC++とJavaの違い

ごくごく簡単なまとめですが、CとC++とJava比較してみました。

|項目|C|C++|Java|
|:-----------|:----------- |:-----------  |:-----------  |
| 誕生年 | 1972 | 1983 | 1995 |
| 分類 | 手続き型言語 | オブジェクト指向型言語 | オブジェクト指向型言語 |
| 変数宣言時の型指定    | 必要（静的型付け）     | 必要（静的型付け） |　必要（静的型付け）|
| クラスの概念    | なし    |  あり  | あり |
| ファイル名とクラス名     | クラスの概念なし      | 一致させる必要なし       | 一致していなければならない（内部クラス除く） |
| 変数宣言時の初期値設定     | （※3）      |   （※3）     |　（※3） |
| 複数戻り値       | 不可       |     不可   | 不可　|
| アクセス修飾子    | なし     | あり（※1）※正確にはアクセス指定子と呼ばれる     | あり（※1） |
| 文字列型 |  なし | あり | あり |
| 文字列の比較 |  strcmp関数 | strcmp関数 | equalsメソッド |
| 文字列の結合 |  strcat関数 | strcat関数 | +演算子 |
| 定数の宣言 | const | const  | final |
| do-while文 | あり | あり  | あり |
| 仮引数のない関数（メソッド） | voidまたは何も書かない | voidまたは何も書かない  | 何も書かない | 
| アドレス演算子 | & | &  | なし |
| 拡張for文 | なし | あり（範囲for文と呼ばれる） | あり|
| 関数プロトタイプ宣言 | あり | あり | なし|
| 構造体 | あり（※2） | あり（※2） | なし|
| クラスの継承構文     | クラスの概念なし      | :       | extends |
| 多重継承| クラスの概念なし| 可         |　不可 |
| switch構文     | あり（値は整数型でないといけない）      | あり（値は整数型でないといけない）       | あり |
| ヘッダファイル     | あり      | あり       | なし |
| コンストラクタ     | なし      | あり       | あり |
| デストラクタ     |   なし    | あり（※オーバーロードはできない）       | なし |
| 論理型     | bool (stdbool.hをinclude)     | bool       | boolean |
| 例外処理構文     |   なし    | try-catch（finallyはない）       | try-catch-finally |
| ポインタ渡し     |   可    | 可       | 不可 |
| 参照渡し     |   不可    | 可       | 不可 |

## （※1）アクセス修飾子の違い

Javaの場合、アクセス修飾子はメンバだけでなく、クラス自体にも付与できる。
C++の場合、アクセス修飾子ではなくアクセス指定子と呼ばれる。
C++の場合、クラス、構造体自体にアクセス指定子を付与することはできない。
またC++の場合、構造体のメンバのデフォルトはpublic、クラスのメンバのデフォルトはprivateになる。

## （※2）CとC++の構造体の違い

```c
struct StructA {
	int n;
	double d;
};
```
という構造体があるとする。

Cの場合はstructを省略することはできない。
```c
struct StructA sa;
```

C++では、typedefを使わずともstructを省略できる。
```C++
StructA sa;
```

## （※3）変数の初期化をしない場合の値

■C/C++の場合
ローカル変数の場合：不特定の値になる。
グローバル変数およびstatic変数の場合：決まった値（デフォルト値）になる。

■Javaの場合
ローカル変数の場合：初期化せずに参照しようとするとコンパイルエラーになる。
クラスのメンバ変数の場合：決まった値（デフォルト値）になる。
Macでアプリごとに全角半角を切り替える

環境：　macOS 14.4 Sonoma 

アクティブなアプリが変わった時に、そのアプリで使用していた入力ソース（半/全）に切り替える

## 設定方法

### 1. 設定 → キーボード → 入力ソースの「編集」
![スクリーンショット 2024-04-08 21.49.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507376/610f7b91-d9c0-06de-e84b-69a28c7f0a1e.png)

### 2. 「全ての入力ソース」の「書類ごとに入力ソースを切り替える」を選択
このオプションがないときは、右下の「＋」から入力ソースを追加する。
![スクリーンショット 2024-04-08 21.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507376/308825bd-8e8b-6ff7-1e74-fcb5c0883b30.png)

本当は、ターミナルなら絶対に半角に戻る！とかにしたかった。

## 参考
- https://support.apple.com/ja-jp/guide/mac-help/mchl84525d76/mac
pytorchのregister_forward_hook()の設定はモデルをdeepcopyしても引き継がれないぞという話

## pytorchのregister_forward_hook()の設定はモデルをdeepcopyしても引き継がれない
気づくのに丸1日費やしたため，躓く人を減らすために書く．

### 何をしていたか
とある深層学習モデルの研究のために，一度学習し終わったモデルをcopyライブラリのdeepcopy関数を使って複製し，モデルを再び学習させようとしていた（ファインチューニング）．しかしモデルの一回目の学習に問題は起きないものの，モデル複製後の学習は損失関数が発散して学習ができなかった．

### 原因
どうやらモデル複製前に設定していたregister_forward_hookが解除されているらしい．register_forward_hookとはモデルの中間層の入出力を引数にした任意の関数を設定できるというものである．私のプログラムではこれを利用してモデルの中間層の出力を抽出し，損失関数の計算に使っていた．

しかし，モデルをdeepcopyするとregister_forward_hookの設定が消えるようで，保存されるはずの中間層の出力が保存されず，誤差逆伝搬によって下手な勾配が入ってしまい損失関数が発散したのだと思われる．

### 対処法
deepcopy後にregister_forward_hookを再び設定した．deepcopyではなくcloneならこの問題は起きなかったりするのかも．試してないので分からない．

### 結論
deepcopyを闇雲に信頼してはいけない．とりあえずdeepcopyしときゃ大体いい感じにコピーされるやろ，という考えが甘かった．
SharePoint Onlineのライブラリに3000万個のアイテムを入れるとどうなるのか

[SharePoint の制限](https://learn.microsoft.com/ja-jp/office365/servicedescriptions/sharepoint-online-service-description/sharepoint-online-limits)のページでは、リストやライブラリには最大3000万個のアイテムを含めることができる旨の記載があります。
> リストには最大 3,000 万個のアイテムを含めることができ、ライブラリには最大 3,000 万個のファイルとフォルダーを含めることができます。

単一リスト/ライブラリに3000万近くのファイルを入れる要件は(恐らく)無いため事実上無視することが多いと思います。
そのためか、検証した結果や実際に発生した場合にどういった挙動を示すのか、といった情報は(軽く確認した限りでは)見当たりませんでした。
…というわけで、実際にライブラリに30000000個のアイテムを入れて、30000001個目のアイテムを入れるとどういったエラーが出るのか、というのを確かめてみました。

## 調査
29999999個のファイルが入ったライブラリを用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428995/7623f1e7-0229-e8b4-74d7-ff86f86224f6.png)

1個ファイルを置いて30000000個にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428995/f6b25934-8934-f69c-bf5d-d36a60d63c1a.png)

最大30000000個なので、想定ではここから1ファイル置くと何かしらのエラーが起きる想定ですが… 
<br>
<br>
<br>
30000001個目のファイルが置けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428995/66387732-387c-b096-7215-fc86f3650516.png)

なんと31000001個もファイルが置けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428995/52a40f7f-e82a-9901-33e0-cc99928b208d.png)

## 結論
3000万個置いても直ちに影響はなさそう。
無料で実務経験を積みたがる若者たち

# はじめに

おはようございます。Watanabe Jin(@Sicut_study)です。
今回は巷で話題の「実務経験を無料で積める」という話とそれに関わるもっとすごい話をまとめていきます。

# 毎朝5分で読める

朝5分で読めるシリーズは平日7時にエンジニアの方に気づきが与えられるような記事を投稿しています。

よければ@Sicut_studyのフォローを宜しくおねがいします！

また**スタエフ**でも毎朝6時58分にお話をしているので、耳で学習したい方はこちらもお願いします！

https://stand.fm/channels/65db27e353b400abe28ec29a

# 実務経験を無料で積む若者たち

最近以下のツイートがタイムラインに流れてきました

>React/TypeScript/Node.jsの簡単な改修案件が結構ありまして
・業務未経験でもある程度コーディングできればOK
・お金もらえなくても実務経験得られればOK
・コードレビューを現場のエンジニアからバチバチにやってもらえる
気になる方、連絡してください！
#駆け出しエンジニアと繋がりたい

**実務経験を無料でやれ？？誰もやらないでしょ**

そう思ったのですが、リプライには多くの希望者がいました
覗いてみると「駆け出しで本当に学習を始めたばかり」「ある程度経験のある学生」などがいました。

思ったよりも世の中的に需要があるようでした。
しかし、**実務経験は無料でなく、お金をもらって積んで**と思ってしまいました

# なぜ無料ではだめなのか

まず**実務経験**という言葉の定義が人それぞれ違いますが、私はこんなイメージです

「実務経験ということは、お金をもらって仕事として経験することである」

無料では実務経験になりません。

もし仮に、何か世の中に価値を与えるようなサービスを作って経験を学べるとした場合、私のコーチングサービスの中で作る課題は「無料」「実際にリリースして使う」という点で実務経験に該当します。

<font color="red">**無料でやるくらいなら、アルバイトを見つけるか、自分でサービスを作ってマネタイズするほうがいいと思います**</font>

実務経験の定義があやふやですが、個人的には自分でサービスを作って大きくマネタイズしていればそれも実務経験に入るのでは？とも考えています。

実務経験の定義が曖昧の中で無料で受けることは何もメリットがないと思いました

# そもそもなぜ実務経験を求めるのか

以下のような理由があると推測しました

- コーディングをレビューしてもらえる
- 実務経験が転職で有利
- 新しい技術を学べる

これらは無料の実務経験でやる必要はないと思いました
ただ、もし相当初心者で自分1人では何も学習できない状態で、会社の人につきっきりで教えてもらいたいならありなのかもとは思ってしまいました

おそらくそんな人は募集していないとは思います。

# お金を払って積むパターンもある

私はプログラミングコーチングを運営しているので競合チェックをしています。

<font color="red">**世の中にはプログラミングスクールでお金を払って実務経験が積めるとアピールしているところもあります**</font>

これはぜひ調べてほしいところですが、お金を払ってでも積むことに価値はあるのか？とは思っています。

プログラミングで成長するのはとにかくアウトプットで、それは実務経験じゃなくてもやろうと思えば誰でもできます。一歩を踏み出すだけです。

そもそもここができないようでは、エンジニアになってからのキャリアアップが難しいとは思っています。

# おわりに
今回は話題のツイートに対して私なりの意見を書いてみました
ここは人それぞれ意見があると思いますが、その選択を取らなくてもよい行動をしていただけるといいのかなとは思っています。

ここまで読んでいただけた方は**いいね**と**ストック**よろしくお願いします。
@Sicut_study を**フォロー**いただけるととてもうれしく思います。

https://qiita.com/Sicut_study

また明日の記事でお会いしましょう！

![jisou-lp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/bfeb082c-62aa-0ad5-92d1-d940ed4d5873.png)


# おすすめ記事

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

https://qiita.com/Sicut_study/items/2318952ecfdddefd384c

https://qiita.com/Sicut_study/items/96c5f6eb794dbf808750

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp

# About Me

Webエンジニア転身して1年間本気で勉強
転職ドラフトで高額オファーを複数獲得
そこでの経験からアウトプットやマインドセットの発信に強みがある
エンジニアをやりながら、起業に挑戦中
アイデア作りやパブリックスピーキングを得意としてる

■ Twitter
https://twitter.com/Sicut_study
■ stand.fm
https://stand.fm/channels/65db27e353b400abe28ec29a
■ Youtube
https://www.youtube.com/channel/UCBFrGAJhPuuaoLwUIHBILsA

■ プログラミングコーチングJISOU
https://projisou.jp
■ 体験で学ぶ！JISOU
https://experience-learn.connpass.com/
■ 登壇依頼などご依頼はこちらから
himaria.jin.watanabe@gmail.com
for文　繰り返し中断　無限ループ

○回繰り返したい時などに使用

☆基本的なfor文☆
 for ( int　i= 0;　i < 10;　i++) {
           　　　　  ①　　②　　③
①初期化処理
i = 0;
最初に1回だけ実行される

②繰り返し条件
i < 10
<= ではない！繰り返す回数を記述。100回の場合は　i < 100 とする

③繰り返し時処理
i++
++　は　1だけ増やす

ループ変数を1から10まで増やす
　for (int i = 1; i < 10； i++)
ループ変数を2ずつ増やす
  for (int i = 0; i < 10; i += 2) 
ループ変数を10から1ずつ1まで減らしていく
  for (int 1 = 10; i > 0; i--)
ループ変数を初期化しない
  for(; i < 10; i++)
繰り返し時の処理を行わない
  for(int i = 0; i <10;)


☆繰り返し中断☆

◎break文　
ループを抜けて中断したいときに使用
for (条件式) {
 if (条件式）｛
 　break;
 　}
}


例）
1から数え100を超えると終了
for (int i = 1; i <= 100; i++) {
 System.out.println("現在の数値: " + i);
  if (i > 100) 
   System.out.println("i");
    break; 
   }


◎continme文　ある条件の時はループ内の処理をスキップしたいときに使用
for (条件式) {
 if (条件式）｛
 　continme;
 }
}

例）
1から数え55のみスキップ
for (int i = 1; i <= 100; i++) {
　if (i == 50) {
 　continue;
　}
　System.out.println("現在の数値: " + i);}




☆無限ループ☆
①while(true) {処理}
②for　(;;) {処理｝
obsidian vimrcのgt/gTでタブ移動

20240821追記
本記事の書き方でReadmeにプルリクエストを送ったら通りました👏

下記obsidian vimrcのReadmeをご覧ください。

https://github.com/esm7/obsidian-vimrc-support/pull/219



---

## TL;DR

[obsidian-vimrc-supportのドキュメント](https://github.com/esm7/obsidian-vimrc-support)でgt/gTのタブ移動がうまくいかなかった。
以下のように修正して解決した

```vim:.obsidian.vimrc
exmap tabnext obcommand workspace:next-tab
nmap gt :tabnext
exmap tabprev obcommand workspace:previous-tab
nmap gT :tabprev
```

# 解決方法

[obsidian-vimrc-supportのドキュメント](https://github.com/esm7/obsidian-vimrc-support)は、タブ移動をプラグインを用いて実現している。しかし、この通りに書いても動かない。（pluginをインストールして有効化済）

```vim:.obsidian.vimrc
exmap tabnext obcommand cycle-through-panes:cycle-through-panes
nmap gt :tabnext
exmap tabprev obcommand cycle-through-panes:cycle-through-panes-reverse
nmap gT :tabprev
```

なお、`:obcommand cycle-through-panes:cycle-through-panes-reverse`は動かないのに、`Ctrl+tab`では普通にタブの切り替えができた。

## デベロッパーツールの表示
以下で原因特定を行った
1.デベロッパーツール確認: `ctrl-shift-i`
2.編集中のファイルに戻って、`:obcommand`押下
3.以下のようにコマンド一覧が出てくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/0cf6efec-3a0e-7431-1198-5028f36ccb93.png)


## コマンドの動作確認
1. 編集中のファイルで`:obcommand cycle-through-panes:focus-right-sidebar`を試す。普通に動くことを確認し、obcommand全体のエラーではないことを確認

2. `:obcommand cycle-through-panes:cycle-through-panes-reverse`と`:obcommand cycle-through-panes:cycle-through-panes`は打っても何も表示されないことを確認し、このコマンドだけが動かないことを確認

3. `obcommand workspace:next-tab`と`workspace:previous-tab`が同じ動作をすることを確認したので、これをキーに割り当てた

4. `.obsidian.vimrc`に以下のように記述して解決

```vim:.obsidian.vimrc
exmap tabnext obcommand workspace:next-tab
nmap gt :tabnext
exmap tabprev obcommand workspace:previous-tab
nmap gT :tabprev
```
create.xyz を2時間さわった感想(2024-04-08時点)

# create.xyz とは
- AIを内蔵した、ホームページ作成ツールです
- ホームページは [create.xyz](https://create.xyz) です

# 概要
- 日本語で指示すると、ページを作ってくれる
- ダウンロードできるコードはHTMLではなくReact
- GAタグも指示すると入れてくれる(が、発火するかは未検証)
- 右上の「Add-ons」で、外部のサービスを埋め込み、それを日本語で呼び出せる。（例：都市名を入れると天気情報を表示してくれる）
- 右上の「Add-ons」から「Create a database」を選ぶと、データベース（のテーブル）を作ってくれる。テーブル名は指定できるが、列名は自動作成。
- 「XXテーブルに入れて」「XXテーブルを一覧表示して」といった指示はできる

# 感想
- プロンプトを日本語でうまく指示するのにコツがいる
- 細かいレイアウトを汲み取ってくれないのが不便
- エクスポートがjs, jsx, css の入ったzipファイルなので、別ツールに入れて整えるのは無理ぽい


(2024-04-08時点では) まだまだ発展途上で、実用にはちょっと遠そうです💦
配列関数・４回目

## はじめに

配列関数の整理。４回目。

### array_map

要素を取得・加工し新たな配列を生成する。

```php:array_map.php
$data = [1, 2, 3];
$result = array_map(function ($v) { return $v * $v; }, $data);
print_r($result); // Array ( [0] => 1 [1] => 4 [2] => 9 )
```

### array_filter

配列の内容をコールバック関数で判定し、その中でtrueと判定された要素だけを取得する。

```php:array_filter.php
$data = ['フレンチブルドッグ', 'ヨークシャーテリア', 'ダックスフント', 'ポメラニアン', 'コーギー'];
$result = array_filter($data, function($v) {
    return mb_strlen($v) < 8;
});
print_r($result); // Array ( [2] => ダックスフント [3] => ポメラニアン [4] => コーギー )
```

### array_reduce

配列内の要素を順に処理して一つにまとめる。

```php:array_reduce.php
$data = [2, 4, 6, 8];
$multi = array_reduce($data, function($result, $v) {
    return $result + $v;
}, 1);
print_r($multi); // 384
```
とりあえず始める.obsidian.vimrc

vimが使えるということで、obsidianを始めました。
私の、シンプルで最小限のvimrcを備忘録として貼ります。

## TL;DR
### .obsidian.vimrc

```vim:.obsidian.vimrc
imap jk <Esc>
set clipboard=unnamed
exmap tabnext obcommand workspace:next-tab
nmap gt :tabnext
exmap tabprev obcommand workspace:previous-tab
nmap gT :tabprev
```

## 手順
obsidianをインストールします。

### vimモードの有効化
obsidianの左下歯車->Editor->vim key bindingsオンにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/b53a52e7-a324-b0c4-0d41-3cc17366b597.png)

そして、こんなメッセージが来ます。
「vimは癖があります。vimは使えますか？、ここでクイズです、vimの強制終了は何？(要約)」が出てくるので、
`:q!`を入力します。

### プラグイン

community plugins->Browseを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/afedce15-4abc-e010-b3de-1a4f8f59faca.png)

vimrcを検索して有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/258d31d5-0446-1f13-6bd8-8dd95553db0d.png)

### .obsidian.vimrc

obsidianが入っているディレクトリを`ls -a`して`.obsidian.vimrc`を見つけます。そして以下を記入

```vim:.obsidian.vimrc
imap jk <Esc>
set clipboard=unnamed
exmap tabnext obcommand workspace:next-tab
nmap gt :tabnext
exmap tabprev obcommand workspace:previous-tab
nmap gT :tabprev
```

補足
- Escをjkに
- gt: 次のタブ
- gT: 前のタブ
- clipboard=unnamedで、クリップボード連携

終わりに
obsidian最高!
Elixirで言語処理100本ノックやってみた！vol.3

こんにちは！
3ヶ月で、Elixir言語で開発できるようになるため、奮闘中のこーへーです！

まだまだ先は長いですが、3つ目の課題に挑戦していきたいと思います。
まだ、初めて2週間ほどですが、やはり少しずつどうプログラムを実現したらいいか、順番を考えられるようになってきましたね。

特に、早く続きがやりたいというような感覚になってきたので、精神的な成長を感じています(*^ω^*)

はい、ということで、今日もElixirで100本ノックやっていきましょう。
[100本ノックの記事はこちら](https://nlp100.github.io/ja/ch01.html)

言語処理100本ノックの記事を上から順にやっていく。今日は０3番。

### 03. 円周率 “Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.”という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

少し問題文を読解する必要があるのんで、要約します。
各単語、例えば、「Now」の文字数を取得して、一つのリストにしてねということです。先に、実現したい状態をお見せすると「3.14159265359・・・」となり、円周率の形になることがわかるかと思います。

では、順を追ってやってみたいと思います。

まずは、「Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.」をリストにしたいと思います。

```
iex(1)> String.split("Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.")
["Now", "I", "need", "a", "drink,", "alcoholic", "of", "course,", "after",
 "the", "heavy", "lectures", "involving", "quantum", "mechanics."]
 ```

 各要素をカンマ区切りにした、リストにすることができました。
 次に、リスト内要素への操作をEnum.mapで行います。Enum.map内で各要素の長さを取得する関数を使いたいと思います。
 
```
 iex(2)> String.split("Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.") |> Enum.map(fn x -> String.length(x) end) 
[3, 1, 4, 1, 6, 9, 2, 7, 5, 3, 5, 8, 9, 7, 10]
```

これでリスト内の各要素（文字列)の長さを取得することができました。
しかし、ここで問題があります。

求められている解答は、円周率で、ここまでの操作で取得できた数値を見てみると**3,1,4,1,6,9,2,7,5,3,5,8,9,7,10**となっていて、ところどころ数字が違います。

本来は、3,1,4,1,5,9,2,6,5,3,5,9となり、先頭から6つ目と8つ目の数値が違うんです。

原因は、元の文字列「"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."」のdrink,とcourse,にカンマ(,)が含まれているからなんです。

つまりカンマ(,)を削除しないといけないということです。

では、やっていきたいと思います。僕の方法は、先頭にカンマ(,)を削除する関数を入れました。

```
iex(3)> String.replace("Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.", ",", "")
"Now I need a drink alcoholic of course after the heavy lectures involving quantum mechanics."
```

無事にカンマを削除できたので、全ての関数をパイプ(|>)で繋げていきたいと思います。

```
iex(5)> String.replace("Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.", ",", "") |> String.split |> Enum.map(fn x -> String.length(x) end)  
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 10]
```

これで無事に完成しました。では、実際に、円周率と先ほど算出したリストの数値を並べて同じか確認していきます。
実際の円周率　->  ３,１,４,１,５,９,２,６,５,３,５,８,９,７,９
算出した円周率　-> ３,１,４,１,５,９,２,６,５,３,５,８,７,１０

...あれ？最後の数値が９と１０で違いますね。これで完成かと思っていましたが、まだなにかあるようですね〜

もとの文字列の最後の単語を見ると、

「Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.」ピリオド(.)がいましたね。
では、これを削除する関数を組み込めば解決しそうですね。先ほど、カンマ(,)を削除した時に使った関数、String.replaceが使えそうなのでやっていきたいと思います。

```
iex(6)> String.replace("Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.", ",", "") |> String.replace(".", "") |> String.split |> Enum.map(fn x -> String.l
ength(x) end)
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
```
最後の一文字が９になり、これで実際の円周率と同じになりました。

## まとめ
プログラムの基本中の基本ですが、次にどんな処理を実現したいのかを考えられることが重要だなと常々感じます。
100本ノック全クリはまだまだ先ですが、１日１ノックしっかりやっていきたいと思います。
VirtualBoxのLinux MintにTeratermでホストPCから接続する

## はじめに
[前回の記事](https://qiita.com/cnysntry/items/d05342dd0d884624033c)でVirtualBox上でLinux Mintを起動できるようになりました。ホストOSからLinux Mintに接続してみたい欲求が芽生えたので、少し調べてみました。

## ホストOSからの接続
VirtualBoxの設定でポートフォワーディングを設定してホストOSからTeratermでSSH接続することができるようです。
![virtualbox_setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/5dfe1fd7-909f-1a37-61f1-9653efb2f4cf.png)

この **[設定]** ボタンを押下し、**[ネットワーク]** タブの **アダプター1 --> 高度(D)** からポートフォワーディングボタンを押下します。
表示された画面で右端の **[新規ポートフォワーディング ルールを追加します]** ボタンを押下して、以下のように入力しOKします。
　名前：任意の名前
　ホストポート：10022（他のポート番号と重複しなければ何でもよい）
　ゲストポート：22
　※プロトコルはTCPのまま
![portforwarding.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/a642447b-7293-2c1a-f159-e3cfb62ce8dc.png)

この設定によりホストOSの10022番ポートへのパケットがゲストOSの22番ポートに送信されます。

次にゲストOS側のセットアップが必要です。
ゲストOSのLinux MintにSSH接続するためにはSSHサーバをインストールする必要があります。
```$ sudo apt install openssh-server```

SSHサーバをインストール後、TeratermのTCP/IPで **ホスト(T)** に「localhost:10022」と入力しSSH接続すると
![teraterm_localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/b68ec4a8-31b2-eda7-0f41-3f7812e068f7.png)

ログインするためのユーザ名とパスフレーズを要求されるので、それを入力します。
![ssh_auth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/ba55dc5d-ad13-a529-57de-4da44cda56aa.png)

**[OK]** ボタンを押下することにより無事、ホストOS側からTeratermでLinux Mintに接続できるようになります。
marginとpaddingの使い分けまとめ（HTML編）

## 概要
普段自分が行っている。marginとpaddingの使い分けの方法をまとめます。
記事は「HTML編」と「[CSS編](https://qiita.com/moyashi_san_tarou/items/0124dacda22f9b916d4f)」と「[演習編](https://qiita.com/moyashi_san_tarou/items/879738303935b74660ad)」の3つから構成しています。

## 今回作成したいデザイン
今回作成したいデザインは以下になります。
![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753383/c82ac553-4c93-1927-208c-4b86ff90350d.png)

## HTMLの作成方法
### 完成図から必要な枠を割り出す
HTMLを書く前にデザインから要素に必要な枠を割り出します。
必要な枠がどの枠の中にあるかどうかに注意しながら枠を割り出します。

1\. 今回のデザインだとまず、"水色の大枠"の中に"タイトル", "概要", "カードプランの大枠"が入っています。
![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753383/463d2fdf-1f67-7086-0df0-e961748a65ad.png)

2\. さらに"カードプランの大枠"に注目すると、"カードプランの大枠"の中に"茶色の枠"があり、その中に"カード名"と"カード詳細"が入っています。
![image_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753383/1ee79fc4-c575-edb7-275f-5f252a5bb01d.png)

### 枠を元にHTMLを記載する
designから割り出した枠を元にHTMLを書いていきます。
1\. "水色の大枠"の中に"タイトル", "概要", "カードプランの大枠"が入っている情報からHTMLを書きだします。
```index.html
<body>
  <div data-wrap="水色の大枠">
    <div data-wrap="タイトル">提供可能な各クレジットカードについて</div>
    <div data-wrap="概要">各クレジットカードによって提供されるサービスが異なります。以下のそれらをまとめました。</div>
    <div data-wrap="カードプランの大枠">
      // この中は後で追記します。
    </div>
  </div>
</body>
```
2\. "カードプランの大枠"の中に"茶色の枠"があり、その中に"カード名"と"カード詳細"が入っている情報からHTMLを書きだします。
```index.html
<body>
  <div data-wrap="水色の大枠">
    <div data-wrap="タイトル">提供可能な各クレジットカードについて</div>
    <div data-wrap="概要">各クレジットカードによって提供されるサービスが異なります。以下のそれらをまとめました。</div>
    <div data-wrap="カードプランの大枠">
      <div data-wrap="茶色の枠">
        <div data-wrap="カード名">スタンダードカード</div>
        <div data-wrap="カード詳細">スタンダードカードは年会費無料でご利用いただけます。ご利用金額の0.5％がポイントとしてたまっていきます。</div>
      </div>
      <div data-wrap="茶色の枠">
        <div data-wrap="カード名">プレミアムカード</div>
        <div data-wrap="カード詳細">プレミアムカードは年会費10000円でご利用いただけます。ご利用金額の2.0％がポイントとしてたまっていきます。</div>
      </div>
    </div>
  </div>
</body>
```
取り返しのつかない要素（Google Cloud編）

# はじめに
何事にも「取り返しのつかない要素」はあるもので、Google Cloudにおいても存在します。
手戻りや代替策での妥協により苦しむ人を少しでも減らせるよう、書き残しておきます。
制約のため仕方ありませんが、これらの悩みがいつか軽減されることを楽しみにしたいと思います。
実際、少しずつ取り返しがつくように機能改善が続けられており、嬉しい限りです。
※あくまで筆者の体験範囲で、かつ覚えているもののみ記載しています。

# プロジェクト、プロジェクトID関連
## プロジェクトIDの変更、再利用
（公式ドキュメントより抜粋）
> プロジェクト ID は、プロジェクトを Google Cloud の他のすべてのプロジェクトと区別するために使用する一意の文字列です。 

このプロジェクトIDは、CloudコンソールやAPI呼び出し時のURL、gcloudコマンドでプロジェクトを指定する文字列としても使用します。

プロジェクトを作成する際、プロジェクトIDは自動で生成されますが、自分で指定することも可能です。 
**これはあとから変更できません。また、以前に使用されたIDも指定できません。**

様々な理由により、プロジェクトIDを変更・再利用したくなる場面があります。例えば以下のとおりです。
- typoした
- 先行してプロジェクトを作成したため、後日定めた命名規則に適合しない
- 他人に知られたくない情報をIDに含めた
- 付けようとしていたプロジェクトIDを、他者が既に使っていた
- 他者に使われないよう名前を自分の検証環境で予約しておき、時が来たので削除して本物を作成しようとした

様々な制約がありますので、公式ドキュメントを確認したうえで命名規則を定め、計画的にプロジェクトを作成しましょう。
https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja#before_you_begin

### 代替策
新たに希望するプロジェクトIDでプロジェクトを作成し、クラウドリソースとデータを移行します。
IaCで管理済みなら、少しだけショックと手間が軽減されるでしょう。

## プロジェクトの組織間移動（2021/05 GA）、組織なしに変更（カスタマーケアに依頼）

以前は、プロジェクトの組織間移動をするためにはGoogleへサポートケースを上げて「組織なし」に変更する対応をしてもらう必要があり、リスクもあるし時間もかかるという話がありました（筆者は未体験）。
そのため、Google Cloudの環境を他者へ引き渡す予定がある場合、最初からプロジェクトを「組織なし」で作成する慣習を見かけます。
「組織なし」から組織下に加えるのは自分で容易にできますし、既存の組織の要素（組織ポリシーやIAM継承など）の影響を受けずに済むので影響範囲が分かりやすいためです。

2021年5月に組織間移動がGAとなり、入念な移行計画は必要ですが、「組織なし」を経由しなくて済むようになりました。
https://cloud.google.com/resource-manager/docs/project-migration?hl=ja
https://cloud.google.com/resource-manager/docs/release-notes#May_26_2021

# Public IP Address関連
## Public IP Addressを同じアドレスで取り直す
一度開放すると、同じアドレスを取り直せる保証はありません。
検証環境の費用を最適化する目的で、安易に開放するのは危険です。後述の手間を踏まえても開放したいか、よく検討してください。
DNSにアドレスを登録していた場合、再取得によりアドレスが変わるとDNSの設定変更も必要になります。
DNSの設定変更を他部署や他法人に依頼する必要がある場合は、手間・費用・リードタイムを気にかけてください。

## Public IP Addressの名前、プレミアム/スタンダード、グローバル/リージョンの変更
後から名前、プレミアム/スタンダード、グローバル/リージョンを変更できません。開放＆再予約になります。
安易にリージョンを指定して予約し、グローバル外部アプリケーション ロードバランサで使えなかったというミスに注意してください。予約したアドレスが、使いたいリソースで選択できることをコンソールで確認しておきましょう。

## Public IP Addressのプロジェクト間移行（2023/07 GA）
単にプロジェクトの引っ越し時にも使えますし、検証環境のみ構築した状態で検証環境と本番環境のためのPublic IP Addressを予約し、本番環境を構築した後に移すというユースケースにも対応できるようになりました。
https://cloud.google.com/vpc/docs/move-ip-address-different-project?hl=ja
https://cloud.google.com/vpc/docs/release-notes#July_05_2023

トラブルシューティングによると「外部 IPv4 アドレスの移動に失敗する」パターンもあるようなので、事前に確認しましょう。
https://cloud.google.com/vpc/docs/move-ip-address-different-project?hl=ja#troubleshooting

# Compute Engineのインスタンス名を変更（2023/12 GA）
インスタンスを作成後、インスタンスを停止すればインスタンス名を変更できるようになりました。
https://cloud.google.com/compute/docs/instances/rename-instance?hl=ja
https://cloud.google.com/compute/docs/release-notes#December_20_2023

# FirestoreでネイティブモードとDatastoreモードを自由に選択する（2024/01 GA）
プロジェクト単位で、Firestoreのモードを一つしか選択できない時期がありましたが、
現在では複数のデータベースを作成でき、データベース作成時にモードを選択できるようになりました。
https://cloud.google.com/firestore/docs/manage-databases?hl=ja
https://cloud.google.com/firestore/docs/release-notes#January_10_2024

# Cloud SQLのインスタンス名の再利用（2022/09 GA）
インスタンスを削除された直後に、猶予期間無くインスタンス名を再利用できるようになりました。
https://cloud.google.com/sql/docs/mysql/faq?hl=ja#reuse
https://cloud.google.com/sql/docs/release-notes#September_21_2022
Google検索のコツ

## ググる力を身につけよう
ググるときに使っているテクってだいたいスペースをあけてのAND検索やダブルクォーテーションによる完全一致検索ではないでしょうか？

自分も今までそうでした。

しかし、Google検索で使える検索条件って実は便利がものがもっとあります！

そこで今回はGoogle検索で使えるテクを紹介します！

## 日付指定

```
[検索キーワード] before:2020
[検索キーワード] after:2022
```
beforeとafterを使うことで、日付に条件をつけて検索することができます。
技術系の場合はできるだけ最新のほうが良いので、afterをよく使うことになると思います。

## サイト指定

```
[検索キーワード]  site:qiita.com
```
site:[ドメイン名]の形で検索することで、指定したサイトのみが検索結果に表示されます。
上記の場合は、Qiitaの記事だけを表示します。

## サイトの除外

```
[検索キーワード]  -site:qiita.com
```
逆に先頭に「-」をつけるとそのサイト除外して検索します。

## キーワードの除外

```
[検索キーワード]  -[除外するキーワード]
```
除外したいキーワードの場合も先頭に「-」をつけます。

## ワイルドカード検索

```
Uncaught ReferenceError: * is not defined
```
例えば、「Uncaught ReferenceError: SampleData is not defined」というエラーについて検索したい場合、SampleDataは自分が定義した名前なので検索には引っ掛かりません。

そういうときに、「*」をつかえば任意の文字として扱われて検索ヒットしやすくなります。

## 完全一致検索

```
[検索キーワード] "[検索キーワード]"
```

このキーワードは絶対に含めたいというものは「"」で括ります。
【Laravel Sail】ルートにアクセスするとapache2のページが開かれる場合の対処法

Laravel Sailでバージョン指定をしてプロジェクトを作成した。
`http://localhost`にアクセスすると、apache2のサイトが表示された。
LaravelのWelcomeページが表示されると思っていたので、おかしいと思い解決策を調べるもなかなか解決しなかったのでメモ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/ea229725-6220-39fd-0061-44b4aef8e741.png)

## 結論
apache2が自動で動いていたことが原因だった。

## 対処法
1.apache2が動いているか確認する
``` linux
# apache2が動いているか確認するコマンド
sudo service apache2 status
```
↓activeになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/671aba20-89ad-3bab-8575-5a9684bc65d8.png)

2.apache2を停止する
``` linux
# apache2を停止するコマンド
sudo service apache2 stop
```

3.apache2が自動で起動しないようにする
``` linux
# apache2が自動で起動しないようにするコマンド
sudo update-rc.d apache2 disable
```

再度、`http://localhost`にアクセスすると、LaravelのWelcomeページが表示された！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/1054af73-d201-1a66-1d02-b4c5d5aaf834.png)


## 参考サイト
https://laracasts.com/discuss/channels/servers/laravel-sail-artisan-serve-apache
Goの超最小構成を試す

# やること

`docker init`という便利なコマンドを作って環境をDockerで構築、チュートリアルを適当にやっていく

# やっていく

前提：

以下よりgoを環境に入れておく

https://go.dev/dl/

参考：

https://build.yoku.co.jp/articles/8y06pehjpy#section_1_subsection_1

![スクリーンショット 2024-04-08 19.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3504047/c8d8b474-5f10-f9aa-0807-484a2ba46026.png)

![スクリーンショット 2024-04-08 19.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3504047/9f8ca454-7db9-1da7-2a1f-9b2eb3de6ab1.png)

聞かれたのはこんな感じ

- なんの言語を使うか？
- バージョンは？
- 相対ディレクトリは？
- リッスンポート

これに応えるだけでdocker-composeに必要なものが全て揃う、まじで神

上の写真では3000にポートを指定しているけど、8080がいいです（多分）

go mod initでGoモジュールを初期化

```
$ go mod init helloworld
```

ginを入れる

```
$ go get -u github.com/gin-gonic/gin
```

main.goを配置して、以下をコピペ

```
package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/helloworld", func(ctx *gin.Context) {
		ctx.JSON(http.StatusOK, gin.H{
			"message": "Hello World!",
		})
	})
	r.Run()
}
```

docker-compose up —buildする

```
$ docker compose up --build
```

このようにListening and serving HTTP on :8080とでたら成功

![スクリーンショット 2024-04-08 20.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3504047/93cb3d59-4dbe-2276-bd87-76fe466dbd46.png)

試しにGETしてみると、Hello worldが帰ってきました！！

お疲れ様でした。

![スクリーンショット 2024-04-08 20.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3504047/85d65e35-b975-0159-3f05-e9b7d9ba3c0b.png)
arXivに投稿するか、自動車技術会(3) に投稿するか, 英語(80)

AUTOSAR Glossaryを改良するのに、AUTOSARに提案できる資格がないとなんともならないらしい。

Glossary自体は公開されている。そこで、arXivか自動車技術会に投稿することを前提に資料をまとめてみる。

# arXiv
titleにAUTOSARがある文書をまず眺める。

SimSched: A tool for Simulating Autosar Implementaion in Simulink
https://arxiv.org/abs/2308.14974

SimSched: A tool for Simulating Autosar Implementaion in Simulink」
https://qiita.com/kaizen_nagoya/items/7b6be868719eee245a25

CINNAMON: A Module for AUTOSAR Secure Onboard Communication
https://arxiv.org/abs/2111.12026

CINNAMON: A Module for AUTOSAR Secure Onboard Communication
https://qiita.com/kaizen_nagoya/items/d58783c00c26bc7dc942

Comparison between autosar platforms with functional safety for automotive software architectures
https://arxiv.org/abs/2109.00099

Comparison between autosar platforms with functional safety for automotive software architecture
https://qiita.com/kaizen_nagoya/items/20a5d87bb9b8898b37db

Achieving Determinism in Adaptive AUTOSAR
https://arxiv.org/abs/1912.01367

Achieving Determinism in Adaptive AUTOSAR
https://qiita.com/kaizen_nagoya/items/b96b540b82a8a1375d4f

Modelling of Autosar Libraries for Large Scale Testing
https://arxiv.org/abs/1703.06574

# Reference
AUTOSAR 文書番号
https://qiita.com/kaizen_nagoya/items/8b894228a0b76c2265c7

AUTOSAR R23-11 記憶の記録
https://qiita.com/kaizen_nagoya/items/701bc800b5f137e51a36

AUTOSAR Countdown Calendar 2023
https://qiita.com/advent-calendar/2023/autosar

AUTOSAR Abstract Platformへの道 R22-11
https://qiita.com/kaizen_nagoya/items/8ac2826635a8c536c7ec

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>
https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1

JAXA/IPA クリティカルソフトウェアワークショップ WOCS言語関連発表(改定版)
https://qiita.com/kaizen_nagoya/items/4789832baf494cb74626

# 自己参照
英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
### 文書履歴(document history)
ver. 0.01 初稿 　20240308
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
NeoVimの設定ファイル（init.lua）を環境ごとに切り替える方法

## 概要
この記事では，neovimの設定ファイル`init.lua`内で，windows環境やwsl環境，linux環境などで設定を切り替える方法を紹介する．

## 方法
以下のように，`vim.fn.has`を使用することで，環境ごとに切り替わる分岐を作成することができる．

```init.lua
if vim.fn.has("win32")==1 then
  -- windows用の設定
elseif vim.fn.has("wsl")==1 then
  -- wsl2用の設定
else
  -- その他（linuxやmacOS）用の設定
end
```

私は，この分岐を利用して，環境ごとにnormalモード移行時の入力モードの切り替えを[spzenhan](https://zenn.dev/kaz399/articles/50b5f2fdc2afcf)と[fcitx5](https://wiki.archlinux.org/title/Fcitx5#:~:text=Automatically%20switch%20input%20methods%20in%20vim)でスイッチしている．
whileとdo-while条件式の違い

while文
ブロックを実行する前に条件式を評価する
ブロックが実行されないことがある

do-whilse文
ループの最低回数
ブロックを実行した後に条件式を評価する
ブロックが最低1回は実行される

do {
　　繰り返す処理
  　} while (条件式);
【2024年度】新入社員が入れておきたい開発ツールまとめ

## 新年度がはじまって
新年度が始まって新入社員が入ってくる季節だと思います。

今回は開発者として入れておいてもらいたいツールをまとめました。
これらのツールは使い方はネット上にいくらでもあるので、自分で使い方を覚えておきましょう。

## ツールリスト
- VSCode（IDE）
- DBeaver（DBクライアント）
- Docker DeskTop（コンテナ仮想化）
- Notion（メモツール）
- Postman（APIツール）
- Git（バージョン管理）
- ChatGPT/Claude（生成AI）

## VSCode
定番のIDE。JavaであればIntelliJ、RubyであればRubyMineを使ったりするかもしれませんが、とりあえず入れておいて損はない高機能なIDEです。

https://code.visualstudio.com/

※VSCodeで入れておくべきプラグインは以下を参照してください。

https://qiita.com/pike3/items/6c25cb8460e6eb34963b

## DBeaver
データベースを操作するためのDBクライアントツール。
コマンド操作でも問題ないですがハードルが高いので、まずはGUI操作からで問題ないと思います。

https://dbeaver.io/

## Docker Desktop
ローカルで環境を立てるなら入れておきたいコンテナ仮想化ツール。
アプリケーションやデータベースなどのサーバー系を用意するのに使用します。
ローカルに直接インストールするよりもDockerで入れたほうが環境を汚さないのでオススメです。

https://www.docker.com/ja-jp/products/docker-desktop/

## Notion
メモやタスク管理、Wiki、データベースなど様々な機能を持つ便利ツール。
備忘録を書いたり、開発上のメモや個人的なタスク管理として使ってください。

https://www.notion.so/ja-jp

## Postman
Web APIの開発に使用するAPIツール。
バックエンドを開発する人はよく使うツールです。

https://www.postman.com/

## Git
ソースコードのバージョン管理ツール。
Macを使っている人は最初から入っていますが、Windowsを使っている方は入っていない場合があるのでインストールしておいてください。

https://git-scm.com/

## ChatGPT/Claude
生成AI系。
入れておくというよりブクマしていつでも開けるようしてください。
わからないことはいきなり聞くのではなく、まずがググったり、AIに聞いてみて自己解決できないか探ってみましょう。

https://chat.openai.com/

https://claude.ai/

## さいごに
たくさん紹介しても使い方を覚えるのが大変だと思ったので、今回は最低限入れてほしいものに絞りました。

ぜひこれらのツールを使いこなして、活躍していってもらえたらと思います！
証明書で遊んでみた（Let's Encrypt）

# 概要
信頼した証明書以外が正しく無効化されることを確認するために、信頼済みの証明書を無効化してみる話。

# 詳細

ブラウザのURLバーにある鍵マークからルート認証局が分かる。
今回はLet's Encryptで遊ぶので、その公式サイトからルート認証局を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181686/6208b01f-2e7a-e16f-5343-564074fb0d67.png)

ここで、Let's Encryptのルート認証局はISRG Root X1と分かる。
証明書はマシンに紐づくのでWindowsの管理する場所から証明書が確認できる。
操作は単純で、Windows + Rで出現するポップアップ画面にて「certmgr.msc」を入力し、Enter。
これで証明書の確認が出来る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181686/c250f993-22ce-9539-6c1b-54c985e99906.png)

実は、DSTとISRGがLet's Encryptの認証局、見て分かるようにDSTは期限が切れているのでLet's Encryptを使って商用環境を動かしている会社ではちょっとした事件だったらしい。対応も面倒で信頼された認証局でも親の認証局が信頼されてないと駄目、的な事象があった。

そんなこんなで話を戻す。
取り敢えず証明書を無効化して接続できないねを確認したい。

「右クリック＞プロパティ＞この証明書の目的を全て無効にする」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181686/9a8892a6-0c64-e836-8e19-7581a5303a1d.png)

ブラウザで確認する場合はPCを再起、面倒ならcurlをすればすぐ確認できる。以下は確認した後に設定を戻した結果。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181686/5f18bfba-9ae5-f24c-93e2-a4828151c3d8.png)

無効化した後は「信頼関係を確立できませんでした」で失敗。
戻した後は正常に接続できているので目的達成。

## 学び
変な認証局が勝手に入ってる！みたいなときに証明書を無効化する手段が分かった。
(多分セキュリティソフトとかが勝手にやってくれてるとは思うが…）

まあ気になったので仕方ない。
Java　switch文

if-else if-else が何重にもなる場合switch文ですっきりさせることができる！

☆switch文に書き換えルことができる条件☆
①すべての条件が　==　で左辺と右辺が一致するかを比較する式（それ以外の >, <, =! でない)
②比較する対象が整数(byte型,short型,int型)、文字列(String型)または文字(char型)の時（小数や真偽値ではない）

☆基本構文☆
switch (条件値) {
 case 値①　-> {
   処理①
 } 
 case 値② -> {
   処理②
 }  
    　　・
    　　・
    　　・
  default -> {
   処理X
  ｝

☆ default -> {処理内容}は条件に合致したいときの処理のため不要な場合は省略できる
☆caseの値が複数の場合　，を使用
　　例）　case　1,2 ->  (1または2）
java 複雑な条件式　while分

while文
条件式の評価結果がtrueならブロックを繰り返し実行する

![62a388464d56e891b3ebdf44bc9924d7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620446/85201fbd-b667-c754-c3ec-660e27912337.png)

&&の例
numが10より大きいかつ100より小さいとき
if ( num > 10 && num < 100)

||の例）
numが10より大きいまたは100より小さいとき
if ( num > 10 || num < 100)

☆if文やwhile文で使用する条件は、評価結果がtrueまたはfalseになる式でないとだめ！
　算術演算子や代入式などを条件式に利用することはできない
java 条件式とif文

☆条件式の書き方☆

  ![8a2c9b27375f4a946a97269c974a624b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620446/8a513889-d56e-1183-e7f4-64b31fc6805f.png)

 
☆if文☆
条件式の結果がtrueなら第一ブロック、falseなら第２ブロックを返す
if(分岐条件) {
 条件成立のときに実行する処理
} else {
 条件不成立のときに実行する処理
}

falseのとき、別の条件で分岐したいときは　else　if　使用

例）
System.out.println("年齢を入力してください");
int age = new java.util.Scanner(System.in).nextInt();
 if (age <= 3) {
  System.out.println("300円");
 } else if ( age <= 12 ) {
  System.out.println("500円");
 } else {
  System.out.println("1000円");
 }
EC2 のホスト鍵を確認して接続する

SSH で EC2 に接続する時の下記質問に、いままで脳死で yes とタイプしていました。

```console
$ ssh ec2-user@ec2-54-249-223-3.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-54-249-223-3.ap-northeast-1.compute.amazonaws.com (54.249.223.3)' can't be established.
ED25519 key fingerprint is SHA256:lISji9JlND8QcBs4aBHuo/JKmZe3ctYqMe/QTg96Rj0.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```

しかし冷静に考えると、経路上にどんな人がいるかわかりません。私が接続しようとしているのは本当に EC2 のサーバーでしょうか？ もしかすると攻撃を仕掛けている悪意ある人物のサーバーかもしれません。

きちんと確認して接続する方法を調べたところ、コンソールにフィンガープリントが出力されていることがわかりました。したがって、たとえば、マネジメント コンソールで EC2 を開き、アクション > モニタリングとトラブルシューティング > システムログを取得 で表示して確認することができます。マネジメント コンソールには SSL で接続しているので、正しい情報が表示されているはずです[^RCA]。

![ec2_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/fbc3bb02-ab8a-f9c8-5feb-df350cd5b422.png)

起動直後のログに、以下のようにフィンガープリントが記されています。

```
<14>Apr  6 08:09:41 cloud-init: #############################################################
<14>Apr  6 08:09:41 cloud-init: -----BEGIN SSH HOST KEY FINGERPRINTS-----
<14>Apr  6 08:09:41 cloud-init: 256 SHA256:eUYB7QLKvMP1FXzsLqJB1cCJ+8HRIYCn8PYxeKyjL+8 root@ip-172-31-31-43.ap-northeast-1.compute.internal (ECDSA)
<14>Apr  6 08:09:41 cloud-init: 256 SHA256:lISji9JlND8QcBs4aBHuo/JKmZe3ctYqMe/QTg96Rj0 root@ip-172-31-31-43.ap-northeast-1.compute.internal (ED25519)
<14>Apr  6 08:09:41 cloud-init: -----END SSH HOST KEY FINGERPRINTS-----
<14>Apr  6 08:09:41 cloud-init: #############################################################
```

先ほどの質問には yes と答えるのではなく、以下のようにログからフィンガープリントをコピペすることで、安全に known hosts に追加することができます。

```
Are you sure you want to continue connecting (yes/no/[fingerprint])? SHA256:lISji9JlND8QcBs4aBHuo/JKmZe3ctYqMe/QTg96Rj0
Warning: Permanently added 'ec2-54-249-223-3.ap-northeast-1.compute.amazonaws.com' (ED25519) to the list of known hosts.
```

これで安全に接続を確立することができました。

なお、この手順は[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)にオプションとして記載されているので、やらなくても安全性はほとんど損なわれないのかもしれません。

一方で、Windows インスタンスの場合は、自己署名証明書の拇印 (フィンガープリント) の確認はオプションとはなっていません。


## 参考

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-to-linux-instance.html

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html

[^RCA]: SSL でも不適切なルート証明書を導入してしまうと中間者攻撃に脆弱になります。職場では SSL インスペクションのために追加のルート証明書を導入していますが、こうした場合には証明書の発行元が信頼できるかよく吟味する必要があります。
Webpack入門：実務で理解するための第一歩

# はじめに
業務で`Rails`の`webpacker`を利用しています。
ただ、`webpacker`の使い方もそうですが、その前に`webpack`を学んだ方が理解できると思いました。

なので、今回は`webpackとは？`を中心に、学んだことをアウトプットしようと思います。


# webpackとは？
`webpack`とは、JavaScriptやCSSなどを一つまたは複数のバンドルにまとめるためのツールです。依存関係のあるモジュールを検出し、ブラウザで利用可能な形式に変換してパフォーマンスを向上させます。

https://webpack.js.org/

イメージとしては、以下になります。

```mermaid
stateDiagram-v2
    A.js --> webpackでモジュールをバンドル（プラグインを実行）
    .css --> B.js: ローダーで変換
    .png --> C.js: ローダーで変換
    B.js --> webpackでモジュールをバンドル（プラグインを実行）
    C.js --> webpackでモジュールをバンドル（プラグインを実行）
    webpackでモジュールをバンドル（プラグインを実行） --> bundle.js
```


# インストール方法

```shell
npm init -y
```

まず、上記のコマンドで`package.json`を作成します。
その後、以下のコマンドで、`webpack`をインストールします。

```shell
npm install --save-dev webpack@5.0.0 webpack-cli@5.0.0
```

:::note warn
@以降に指定しているバージョンは、開発環境に合わせて変更してください。
:::

他のライブラリをインストールする場合は、以下ようなコマンドを入力してください。

```shell
npm install --save bootstrap@5.0.0
```

## --saveと--save-devの違い
`--save`は、`package.json`の`dependencies`に追加され、`--save-dev`は`devDependencies`に追加される。

```json:package.json
{
  "name": "webpack-lesson",
  ...
  "devDependencies": {
    "webpack": "^5.0.0",
    "webpack-cli": "^5.0.0"
  },
  "dependencies": {
    "bootstrap": "^5.0.0"
  }
}
```

開発環境で使用するライブラリなのか、アプリケーションの動作に必要なのかの違いです。


## npm scripts とは
コマンドをショートカットで入力できる仕組みです。

```json:package.json
"scripts": {
  "build": "webpack"
},
```

上記のように、`scripts`内に記載することで、以下のようにコマンドを実行できます。

```shell
npm run build
```

今回はあくまで例なので、環境に沿った設定をしてみてください。


# 設定
## webpack.config.json とは
`webpack`における設定ファイルになります。
参考として、以下のような記載になります。

```js:webpack.config.js
const path = require('path')

module.exports = {
  mode: 'development',
  entry: './src/js/app.js',
  output: {
    path: path.resolve(__dirname, 'public'),
    filename: 'js/bundle.js',
  },
}
```

| 語句 | 説明 |
| --- | --- |
| mode | ビルドモードの指定（`development`, `production` または `none`） |
| entry | ビルドの起点となるファイルのパス |
| output | 出力されるファイルの設定 |

https://webpack.js.org/configuration/mode/

https://webpack.js.org/configuration/entry-context/#entry

https://webpack.js.org/configuration/output/

`watch`もあり、`true`に設定しておくと、最初のビルド後、ファイルの変更を監視してビルドをしてくれます。
開発環境であれば、設定しておくのが良いかなと思いました。

https://webpack.js.org/configuration/watch/#watch

## エントリーポイントを複数設定するには？
以下のように、`entry`を複数記載して、`output`で`[name]`とする。

```js:webpack.config,js
module.exports = {
  entry: {
    app: './src/js/app.js',
    another: './src/js/another.js'
  },
  output: {
    path: path.resolve(__dirname, 'pack'),
    filename: 'js/[name].bundle.js',
  },
```

`[name]`とすることで、`app`・`another`それぞれで出力されるようになります。


# 実行
実際に用意したjsをバンドルするには、以下のコマンドになります。

```shell
npm run build
```

:::note warn
上記のコマンドは、今回の記事で用意したscriptコマンドになります。
ご自身の環境に合わせて、バンドルを行なってください。
:::

`webpack.config.js`では、`pack/js`を指定していたので、そこにバンドルされたファイルが作成されます。
`filename`で指定していると、その命名で作成されます。（今回だと、`bundle.js`になります。）


# まとめ
今回で`webpack`がどういうものか、触りはわかったので、あとは業務でどのように落とし込めるか考えてみようと思いました。

今回学んだ以外にも、他にも学ぶことはあるかなと思います。

- 開発環境と本番環境を分けるベストプラクティス
- 画像とcssのバンドル
- 最適化 ...etc

また実務で学んだ際は、アウトプットしようと思います。
最後までご覧いただき、ありがとうございました。


## 参考文献
https://webpack.js.org/

https://www.udemy.com/course/practical-webpack/
Eclipseのコンソールの行を増やしたい

Eclipseでの開発中に、エラーの行数が多すぎてコンソールに表示しきれず、肝心のエラーの内容が読み取れない事象がありました。
その際に参考にした記事です！

ちゃんと設定できるんですねぇ。
エラー解消後は、コンソール行が多すぎても見ずらいので、設定値を戻しました。

https://specially198.com/how-to-increase-the-number-of-rows-in-the-console/
4K ディスプレイでも Tera Term 4 をきれいに表示したい

4K ディスプレイのような高 DPI 環境では Tera Term 4 はぼやけた表示になってしまいますが、解決方法を 2 通り見つけましたのでご紹介します。

2 つ目の方法は Tera Term 以外のアプリにも使えます。


## 1. TERATERM.INI の [Tera Term] セクションに "DPIAware=on" を追加する

1 つ目は Tera Term v4.103 以降で使える方法で、TERATERM.INI の [Tera Term] セクションに "DPIAware=on" を追加することです。

TERATERM.INI は、ttermpro.exe と同じフォルダーにあることが多いかと思います。メニューの Setup > Save setup... で表示されるものを編集すれば大丈夫だと思います。(読み込まれるファイルの仕様は[Tera Term 設定ファイル](https://teratermproject.github.io/manual/4/ja/setup/teraterm.html)でご確認ください。)

### 効果

Windows 11 でターミナルのフォントに Moralerspace Neon HWJPDOC を使った環境のスクリーンショットです。

#### 設定前 (New connection)

![default_new_connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/b4251beb-a7c3-10a4-d915-1c64cb5755a7.png)

#### 設定後 (New connection)

![dpiaware_new_connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/b1befaa9-c504-cc53-b7d3-79b1643f9ed0.png)

#### 設定前 (ターミナル)

![default_terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/70129806-2230-3f54-5989-202368db64d3.png)

#### 設定後 (ターミナル)

![dpiaware_terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/4cd9158f-ae1d-46a3-96a1-83d7624165d8.png)

### 参考記事

下記記事を参考にさせていただきました。

https://forest.watch.impress.co.jp/docs/news/1191177.html


## 2. ショートカットのプロパティで高 DPI 設定を行う

2 つ目の方法は、ショートカットのプロパティで高 DPI 設定を行うことです。

スタート メニューに登録されている場合、Tera Term を右クリックして、詳細 (Windows 10 では その他) > ファイルの場所を開く でエクスプローラーにショートカットを表示します。ポータブル版の場合は、exe ファイルを右ドラッグ & ドロップするなどして作成してください。

ショートカットを右クリックして、プロパティ > 互換性 > 高 DPI 設定の変更 > 「高い DPI スケールの動作を上書きします。」をチェックし、「システム (拡張)」を選択すると、"DPIAware=on" に近い見た目になります。

### 参考記事

下記記事を参考にさせていただきました。

https://qiita.com/HyunwookPark/items/b04a60daa838ac9b77a0
【ElastiCache】キャッシュ戦略について

# 概要
AWSが提供する代表的なキャッシュサービスである、ElastiCache。
効率的に使用するためのキャッシュ戦略について勉強したのでまとめてみます。

# ElastiCacheの概要・特徴
- フルマネージド型のインメモリデータサービス、インメモリキャッシュを提供するサービス
- アプリケーションのパフォーマンスが向上させ、マイクロ秒単位の応答時間を実現
- 自動スケーリング機能を提供し負荷の変号に対しても柔軟に対応できる。また、データの暗号化アクセスコントロールなどのセキュリティ機能も豊富

https://aws.amazon.com/jp/elasticache/features/

# キャッシュ戦略について
ElastiCacheを効率的に使用するための主な戦略として、以下の3つの方法が考えられる。
- 遅延読み込み
- 書き込みスルー
- TTLの追加

# 遅延読み込み
### 遅延読み込みの概要
必要な時にのみキャッシュにデータをロードするキャッシュ戦略。
例として、ElasticCacheがアプリケーションとデータベースの間にある場合を考える。

- アプリケーションがデータをリクエストする場合は、最初にElastiCacheキャッシュへリクエストを行う
- リクエストがキャッシュヒット(リクエストされたデータがキャッシュ内に存在し、かつ有効期限内である状態)である場合
  - ElastiCacheはアプリケーションにデータを返す
- リクエストがキャッシュミス（リクエストされたデータがキャッシュ内に存在しない、もしくはキャッシュ内に存在しているが有効期限が切れている状態）である場合
  - アプリケーションはデータベースからのデータをリクエストし、データベースはアプリケーションにデータを返す
  - 最後にアプリケーションはデータベースから取得したデータをキャッシュに書き込む
![遅延読み込み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/24dc2c30-e8c9-4446-cc3a-0c5968775472.png)

### 遅延読み込みのメリット・デメリット
- メリット
  - 要求されたデータのみがキャッシュされるので、リソースの無駄を省いて、キャッシュの容量を節約できる
- デメリット
  - キャッシュミスが発生した時のみキャッシュのデータが更新されるため、キャッシュのデータは古い可能性がある
  - キャッシュミスが発生した場合、データ読み取りに時間がかかる（以下の手順が発生するため）
    - キャッシュへデータのリクエスト
    - DBへデータのリクエスト
    - キャッシュのデータ更新

# 書き込みスルー
### 書き込みスルーの概要
データがデータベースへ書き込まれたり、更新されたりするたびに、キャッシュのデータも更新するキャッシュ戦略。
![書き込みスルー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1382306/32247fba-c798-da56-4833-197840dca587.png)

### 書き込みスルーのメリット・デメリット
- メリット
    - データベースへ書き込み処理が発生するたびにキャッシュ内のデータは更新されるため、キャッシュ内のデータは常に最新になる
- デメリット
    - 全てのデータをキャッシュするため、読み取られないデータもキャッシュし、リソースの無駄遣いになる

# TTLの追加
TTLを追加することでキャッシュの有効期限を設定する。
有効期限が切れたデータはキャッシュ内から削除されるため、古くなったデータがキャッシュを圧迫することがなくなる。有効期限を設定することで、遅延読み込み、書き込みスルーそれぞれのデメリットを解消することができる。

# まとめ
- 遅延読み込みはキャッシュミスの時にデータベースからのデータをリクエストし、アプリケーションがキャッシュを更新する。読み込まれるデータのみがキャッシュされるので、リソースを効果的に使えるが、キャッシュが古くなっている可能性あり
- データの書き込みが発生するたびに、キャッシュのデータも更新される。キャッシュデータは常に最新となっているが、すべてのデータをキャッシュするため、多くのリソースが必要となる
- TTLを設定することで、遅延読み込み、書き込みスルーのデメリットを軽減することができる

# 参考
https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Strategies.html
ESLintの設定を視覚化してくれるESLint Config Inspector

## はじめに
ESLintは2024年4月5日をもってバージョン9.0.0を迎え、ルール設定ファイルのデフォルト形式がFlat Configになりました。これにより、`eslintrc`で記述される旧形式が非推奨となりました([リリースブログ](https://eslint.org/blog/2024/04/eslint-v9.0.0-released/))。

Flat Configでは1つのファイルから中央集権的に設定を構築するので、どのファイルに対してどのルールが有効になっているかが把握しにくくなっています。
そのため、旧形式からの移行やルールの増減時に設定を確認する作業が困難になります。

このような時、ESLint Config Inspectorを利用することで、視覚的に有効なルールと対象ファイルを確認できます。

![スクリーンショット 2024-04-08 11.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/23e8f4e3-b488-b5df-45a5-8bddd50d31e9.png)

## 利用方法
ESLint Config Inspectorの利用方法は以下の通りです。

パッケージ内のESLintのバージョンが9.0.0以上の場合は
```sh
npx eslint --inspect-config
```
を実行し、パッケージのESLintを使わない場合は
```sh
npx @eslint/config-inspector
```
を実行します。実行すると`localhost:7007`に設定が視覚化されたページ表示されます。

![スクリーンショット 2024-04-08 11.40.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/0154f38a-a1cc-9f08-3597-7aa119b61ed4.png)

## 機能
ページには`Configs`、`Rules`、`Files`の3種類の機能があります。

### Configs
`Configs`は定義した配列の各要素に適応された内容が表示されます。同一配列要素内で記述されていても、`extends`に記述された内容などは異なる要素として表示されます。

表示される内容には、有効なファイル、プラグイン、ルール、その他の構成として`languageOptions`や`settings`などが含まれます。

![localhost_7777_configs (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/668f6dcf-333e-78c6-6e70-eb78822d06cc.png)

検索フィールドを使用して特定のファイルを指定することで、設定を絞り込めます。
![スクリーンショット 2024-04-08 15.10.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/981feaac-cc7d-27ad-bd61-f868590c8692.png)

`Merged Rules`にタブを切り替えると、統合された設定も確認できます。全ファイルと特定のファイルに適応される設定が2つの項目で表示されます。
![スクリーンショット 2024-04-08 15.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/286b16bd-2262-49f8-3333-2b98dfb397a7.png)

### Rules
`Rules`はパッケージにインストールされたESLintのプラグインのルールが表示されます。

![スクリーンショット 2024-04-08 15.34.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/c58c51bc-fb72-b3fd-f655-7408557850ce.png)

表示されるルールは、以下の3つの項目で絞り込めます。
- `Plugins`：特定のパッケージ
- `Usage`：利用しているルールや全てのルール等の使われ方
- `State`：ルールの推奨、廃止等の状況

### Files
`Files`はESLintが有効なファイルの一覧が表示されます(`experimental`なので、今後大きな変更のある可能性があります)。
![スクリーンショット 2024-04-08 15.48.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/1ede2d7e-942f-06e8-4b9c-8a23bec08913.png)
表示されたファイル名をクリックすると`Configs`に移って有効な設定が表示されます。

`File Groups`に変更すると、同じ設定が有効になっているファイルがグループごとに表示されます。

![localhost_7777_files (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/bfbdbea8-1f2f-df47-ed67-ecb2cf6ce51e.png)

## おわりに
ESLint Config Inspectorにより、設定を視覚的に把握し、適用されるルールやファイルを明確に理解しやすくなりました。
設定の確認作業が大幅に簡単になることで、より速くより確実にコードの品質を維持するルールを設定できるようになります。
Flat Configを利用してさえいればESLint Config Inspectorを利用するのも容易なので、積極的に利用していきたいです。
AWS 環境を超えてサブドメインを登録する

## 概要

AWSの環境をまたいでサブドメインを登録する方法をメモ的にまとめる。

## 前提

今回の説明の前提を簡単にまとめる。

- AのAWS環境のRoute53で`miriwo.work`というドメインがホストゾーン登録されているものとする
- BのAWS環境のRoute53で`www.miriwo.work`というサブドメインを使いたいとする
 
![work__Visual_Workspace_for_Innovation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/41fc26bc-f8a1-b595-15e7-b10c6d07cce6.png)

## 方法

1. BのAWS環境にて`www.miriwo.work`のホストゾーンを登録する
1. `www.miriwo.work`のホストゾーンを登録するとNSレコードが含まれ、4個のネームサーバーの値が設定されるのでメモする
1. AのAWS環境にて`miriwo.work`のホストゾーンに下記の設定でレコードを作成する（特記されていないものはデフォルト）
    - レコード名: `www`
    - レコードタイプ: NS
    - 値: 先にコピーした`www.miriwo.work`のホストゾーンのNSレコードの4個のネームサーバーの値

これで完了である。ここまで設定すればおそらくサブドメインにアクセスが気たときもDNSをたどって　名前解決をしてくれるはずである。
pypdfを使ったPDFのリサイズ方法

## 経緯

これまでkindleでのペーパーバック作成時の表紙作成には[AvePDF](https://avepdf.com/ja/resize-pdf)を使用して、figmaで作成したPDFを突っ込んでリサイズして作成していた。

しかし、この外部のwebサイトを使用することに対して **いかがなものかと** と言われてしまい、使用できなくなった。

なので、これまで行っていたPDFのリサイズを自前で出来るようにしたので備忘録として残しておく。

## スクリプト

以下のスクリプトはcolabで動かすことを想定しています。
入力ファイルとなる**input.pdf**は、colabのファイルの直下に存在する想定で記述しています。

```python
!pip install pypdf
```

```python
# import
from pypdf import PdfReader, PdfWriter

# 最終的な出力サイズを指定
x_cm = XXX.XX # 各自修正
y_cm = YYY.YY # 各自修正

# 出力に使う定数
inch_cm = 25.4
dpi = 72

# 出力サイズに合わせたピクセル数を計算
x_px = x_cm * dpi / inch_cm
y_px = y_cm * dpi / inch_cm

# pdfファイルを読み込み
reader = PdfReader("input.pdf")

# 出力先のpdfファイルを用意
writer = PdfWriter()

# 読み込んだpdfファイルのすべてのページのサイズを変更
for i in range(len(reader.pages)):
  page = reader.pages[i]
  page.scale_to(x_px, y_px)
  writer.add_page(page)

# pdfファイルとして書き出し
writer.write("output.pdf")
writer.close()
```

## あとがき

pythonでPDFを扱うライブラリはいくつもあって迷いましたが、(主観で)開発が活発に行われていそうな[pypdf](https://pypi.org/project/pypdf/)を選びました。

PDFのサイズ変更を行う[scale_to](https://pypdf.readthedocs.io/en/stable/modules/PageObject.html?highlight=inch#pypdf._page.PageObject.scale_to)関数に渡す引数の単位が公式ドキュメントに明記されていないので少し面倒でしたが、色々与えてみてピクセルだと分かったので、スクリプト上でcmからpxへの変換を行うようにしていました。
ちょこっとだけつまずいたgcloudのインストール

## はじめに
macにgcloud CLIをインストールしようとしましたが、簡単なことでつまずいてしまったので、その記録を残します。

## pyenvでpythonをインストールしている人向け
ということで、どこでつまずいたかというと上記の通りです。
[公式ドキュメント](https://cloud.google.com/sdk/docs/install-sdk?hl=ja)通りにすすめば対話式で簡単にgcloud CLIをインストールできるのですが、私の場合、pyenvでpythonをインストール使用しており、対話式で進むと勝手に作業日時点（2024年3月ころ）ではpython3.11をインストールしようとしてくるので、そこで困りました。

## まずはドキュメント通りに
- それぞれのプラットフォームにあったパッケージをダウンロードします
- ダウンロードしたパッケージをホームディレクトリに移動します(ホームディレクトリを推奨しているため)
- パッケージを展開します
- 展開したパッケージのインストールスクリプトを使用して対話式のインストールを開始します
```
./google-cloud-sdk/install.sh
```

## 対話式インストール
```
Do you want to help improve the Google Cloud CLI (y/N)?
(Google Cloud CLI の改善に協力したいと思いますか (y/N)?)
```
これはどちらでもいいです。

```
~~

Modify profile to update your $PATH and enable shell command completion?
(プロファイルを変更して $PATH を更新し、シェル コマンド補完を有効にしますか?)
Do you want to continue (Y/n)?
```
色々とインストールするものが表示されてPATHを更新するか聞かれるのでYES。

```
Enter a path to an rc file to update, or leave blank to use [zshのパス]:
```
zshを使う場合は空白のまま先へ進んでください。

```
Download and run Python 3.11 installer? (Y/n)?
```
ここが悩みどころでした。YESにするとダウンロードが始まってしまうし、NOにすると
```
For more information on how to get started, please visit:
  https://cloud.google.com/sdk/docs/quickstarts
```
詳細を見なさいと表示がでて、インストールが終了してしまいます。

## 解決
簡単な話でした。`zsh`を更新していないだけでした。

何回かインストールを試していて、`zsh`を上書きするか聞かれているところでblankのまま進むと返答が、
```
No changes necessary for [zshのパス].
```
となっているのに気づきました。

ということはもうgcloudのパスが通っているのでは無いかと思い、試しにzshを更新。
```
$ source ~/.zshrc
```
結果、普通にgcloudが使用できるようになっていました。

## 仕上げ
晴れてgcloudにパスが通ってコマンドが使用できるようになったので、使用するpythonを指定してあげましょう。
pythonの場所を確認して
```
$ which python
```

zshに追加
`~/.zshrc`
```
export CLOUDSDK_PYTHON=pythonの場所
```

忘れずに更新 
```
$ source ~/.zshrc
```

この後はドキュメント通りに初期化を行いましょう。