OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS認定】IT未経験からのAWS CLF, SAA, SAP合格体験記

# はじめに
はじめまして、かわむと申します。

私は今年度、SIerに入社し約半年間でAWSのCLF（クラウドプラクティショナー）、SAA（ソリューションアーキテクト アソシエイト）、SAP（ソリューションアーキテクト プロフェッショナル）に合格することができました。

入社するまで、AWSがクラウドサービスであることすら知らない状態でしたが、コツコツと学習を進めることで少しずつ理解が深まり、無事に合格をつかみ取ることができました。

本記事では、私の合格までの道のりをお伝えしながら、これから挑戦される方へ向けた学習のヒントやコツを紹介できればと思います。

# 筆者の経歴
- 高等専門学校を卒業し、その後、国立の理系学部（機械系）に編入学。
- 大学院では自動車の安全予防技術の研究に従事。在学中に基本情報技術者試験に合格。
- SIerに入社し、入社直後の4月に応用情報技術者試験に合格。
- 入社2か月後、研修を通じてAWSの存在を知り、学習を開始。

AWSの学習を始めた当初は、ITの基礎知識こそあったものの、実務経験は全くない状態です。AWS認定試験は、AWS独自のサービスや考え方を問うものが多く、まさにゼロからのスタートでした。

# 合格までのスケジュール
CLFの学習を開始してからSAPまでの学習期間と勉強時間は、ざっくり以下のようになります。

![スケジュール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944793/9dcef8a9-cdae-4a33-9f94-5d1a500c39e5.png)


|試験名  |試験日  |点数  |勉強時間|
|---|---|---|---|
|CLF-C02  |2024/7/15  |864  |約60h|
|SAA-C03  |2024/10/27  |748  |約30h|
|SAP-C02 |2025/1/14 |791  |約50h|

今振り返ると、資格取得後にダウンタイムが発生していますね...
特にSAAからSAPへの移行はスムーズに進めた方が効率的です。もし今から受験を考えている方がいれば、SAAの学習を終えた勢いのままSAPに取り組むことを強くおすすめします。

# クラウドプラクティショナー（CLF）の学習
### 使用教材と学習時間
- [『AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 改訂第3版』](https://amzn.asia/d/0J2IVhu)
学習時間：35時間（3回通読）
- [Udemy 『【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）』](https://www.udemy.com/course/aws-4260/)
学習時間：25時間（390問を2周）

### 学習のポイント
最初の試験ということもあり、AWS認定試験の勘所がわからず、後述のSAAよりも学習しました。しかし、ここで基礎を叩き込んだことが、後のSAAやSAPの学習に大いに役立ったと感じています。

特に、AWSの主要サービス（EC2、S3、RDS、Lambda）やWell-Architected Frameworkなど、クラウドを活用する上で欠かせない知識を押さえておくことが重要です。「サービスの名前だけ知っている」状態ではなく、実際にどのように使われるのかを意識しながら学習すると、より理解が深まります。

# ソリューションアーキテクト アソシエイト（SAA）の学習
### 使用教材と学習時間
- [(模擬問題付き)徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書 第3版［SAA-C03］](https://amzn.asia/d/dlD5nLV)
学習時間：20h（２回通読）

- [【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
学習時間：10h(模擬試験①、②のみ二週)）

### 学習のポイント
勉強時間が少なく、ギリギリの点数での合格となりました。問題の文章量が増え、単純な暗記では通用しない問題が多くなるため、難易度がグッと上がったように感じました。

このレベルでは、各サービスの特徴を深く理解することがカギになります。「何ができるのか」だけでなく「何ができないのか」も整理しながら学習を進めると、試験本番で選択肢を消去しやすくなります。

また、問題集のすべてを解く時間が取れなかったため、最初の2回分をじっくり解く方法を取りました。結果として、一つの問いを深く理解することができ、効率的に学習できたと思います。

# ソリューションアーキテクト プロフェッショナル（SAP）の学習
### 使用教材と学習時間
- [『AWS認定資格試験テキスト＆問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版』](https://amzn.asia/d/g71n6RN)
学習時間：8h（1回さらっと通読）

- [【SAP-C02】AWS認定 ソリューションアーキテクト プロフェッショナル 模擬問題集【4回+α 計360問】](https://www.udemy.com/course/sap-c02-2024aws/)
学習時間：10h(模擬試験①、②、③を二週)

### 学習のポイント
SAAまでしっかり学習していると、資格テキストには目新しい情報はあまりないかと思いますので、サラッと一周だけ読みます。巻末問題は一回解いて、間違えた問題のみ再度解きなおしました。

問題集を解くときは、SAAと同様に丸暗記しないことが重要です。特に、間違えた問題だけでなく、正解した問題についても「なぜ他の選択肢が間違いなのか」を調べながら学習を進めました。

また、問題文を読みながら典型的なアーキテクチャ図（ネットワーク図やサーバレス構成など）が頭の中で浮かぶようになると、回答が非常に楽になりました。
最初のころは何が何だかわからなかったので、解説に出てくるアーキテクチャを実際に紙に書きながら学習していきました。

数をこなしていると、ある程度典型的なパターンがあることに気が付きます。回答の丸暗記ではなく、問題の背景や設計の意図を理解することが合格への近道だと筆者は考えています。

# まとめ
AWSを学習し始めたときは、「SAP取得までにどのくらいかかるのだろう…」と不安でした。しかし、焦らずコツコツと学習を積み重ねることで、約半年の期間で取得することができました。

「AWSに興味があるけれど、難しそうで一歩踏み出せない…」という方も、まずはCLFから挑戦してみてください。この記事が、AWS学習の一助になれば幸いです。
日常業務に活かすキャッシュの考え方

# キャッシュとは
システムの技術用語に「キャッシュ」というものがあります。みなさんも「ブラウザのキャッシュが残っていた」とか、話したり聞いたりしたことがあるんじゃないでしょうか。

キャッシュとは、処理に時間がかかるデータを一時的に保存し、同じ処理が必要となったときに再利用する仕組みです。例えば、ブラウザは一度読み込んだファイルをパソコンに保存し、次回アクセス時に更新がなければそのファイルを再利用します。これにより、毎回ダウンロードする手間が省け、表示速度が向上します。

同じように、サーバーやデータベースでも頻繁に使われるデータをキャッシュし、アクセスのたびに処理を繰り返すのではなく、保存しておいたデータを返すことでパフォーマンスを向上させています。例えば、検索エンジンでは、検索結果をキャッシュしておくことで、同じキーワードの検索に対して素早く結果を表示する仕組みを取り入れています。

# CPU のキャッシュメモリ
キャッシュは、ストレージやネットワークのデータだけでなく、コンピュータのメモリ (RAM) にも活用されています。メモリのキャッシュとは、 CPU が処理するデータを高速にやり取りするための仕組みで、特に「L1キャッシュ」「L2キャッシュ」「L3キャッシュ」といった階層構造を持っています。

例えば、プログラムを実行するとき、 CPU は必要なデータを一番速くアクセスできる L1キャッシュに格納します。しかし、 L1キャッシュは容量が小さいため、入りきらないデータは L2キャッシュや L3キャッシュ、さらにはメインメモリ (RAM) へと格納されます。このように、データの利用頻度に応じてキャッシュを適切に配置することで、 CPU の処理速度を大幅に向上させています。

具体的な事例として、動画編集ソフトや 3Dモデリングソフトでは、多くのデータを扱うため、キャッシュを活用して頻繁にアクセスするデータをメモリ上に保持することで作業をスムーズにしています。もしキャッシュがなければ、データの読み込みに時間がかかり、作業の効率が大幅に低下してしまうでしょう。

# キャッシュ管理のポイント
キャッシュの管理で重要なのは「更新のタイミング」と「保存するデータ量」です。キャッシュが適切に更新されないと、実際には変更されている情報が古いまま表示されることがあります。例えば、ECサイトで商品の在庫情報がキャッシュされていると、実際には売り切れているのに「在庫あり」と表示されてしまうケースが考えられます。このような問題を防ぐために、一定の時間が経過したらキャッシュを削除し、新しいデータを取得する仕組みが導入されています。このキャッシュを削除するまでの時間を TTL (Time To Live) と呼んでいます。

また、キャッシュを無制限に保存すると、データ量が膨れ上がり、逆に検索や処理の負荷が高まる可能性もあります。そのため、適切なキャッシュ容量を設定し、不要なキャッシュを定期的に削除することが重要です。

# 仕事におけるキャッシュの考え方
このキャッシュの考え方は、システムだけでなく日常業務にも応用できます。例えば、よく使う資料を手元に置くのはキャッシュと同じ発想です。頻繁に参照するデータやテンプレートはすぐに取り出せる場所に保存しておくと、業務効率が向上します。しかし、古い資料を整理しないと必要な情報が埋もれたり、誤って古いデータを使ってしまったりすることがあります。また、あまりにも多くの資料をデスク周りに置いておくと、必要なものを探すのにかえって時間がかかることもあります。これは、キャッシュを溜めすぎた結果、検索に時間がかかるのと同じ問題です。

業務の効率を上げるためには、適切な情報整理が欠かせません。例えば、定期的に古い資料を見直して不要なものを削除し、新しい情報を整理することで、必要なデータを素早く活用できる環境を整えられます。システムでも業務でも、キャッシュの管理には「すぐに使える利便性」と「最新の状態を保つバランス」が重要です。適切に整理し、必要なときにすぐ取り出せる環境を作ることが、業務効率の向上につながります。

また、よく行く客先へのルートを覚えておくことも、キャッシュの考え方と似ています。初めて訪問する際には地図を確認し、経路を調べる必要がありますが、一度行き方を覚えれば、次回以降はスムーズに移動できます。しかし、道路工事や新しい交通規制が導入された場合、以前のルートでは遠回りになったり、渋滞に巻き込まれたりする可能性があります。そのため、定期的に最新の情報を確認し、最適なルートを選ぶことが重要です。これは、キャッシュされたデータを適切に更新することと同じ考え方です。

# まとめ
このように、キャッシュの概念はITの世界にとどまらず、仕事や日常生活のさまざまな場面で活用できます。
適切にキャッシュを管理し、効率的に情報を活用することで、より快適でスムーズな作業が可能になるでしょう。システム以外の業務にも、キャッシュ的な効率改善が取り入れられないか、検討してみてはいかがでしょうか。
データ構造とは？

データ構造は、データを効率よく保存、検索、修正、削除（CRUD）する目的でデータを構造化する方法です。

同じデータの群であってもどのように構造化するかによって問題を解決する時間やコストが変わります。効率よく問題を解決するためには適したデータ構造を使ってデータを扱う必要があります。

# ADT（抽象データ型）
データをどんな形でどんな操作をして片付けるのかルールだけを意味する言葉です。”理論的な概念”みたいな感じです。

実際メモリー（記憶装置）の中でどんな動きをするかはADTの概念には含まれていません。ここではどうやってデータをCRUDするかだけが重要です。

代表的なADTはこれです。
- List：順番に並べているデータ
- Set：重複しないデータの集まり
- Map：キーと値の一対に形成されているデータ
- Stack：データを後入れ先出し (LIFO: Last In First Out) の構造で扱う
- Queue：データを先入れ先出し (FIFO: First In First Out) の構造で扱う
- Tree：データを段層的で親子関係を用いて扱う
- Graph：ノードとエッジによって構成され、複雑な接続関係を表現します

# 具体データ型
ADT具現したものです。ADTの概念を物理的だメモリー（記憶装置）と演算アルゴリズムでどうやってデータを保存するのかの概念が含まれています。

- List：ArrayList, LinkedList
- Set：HashSet、TreeSet
- Map：HashMap, TreeMap
- Stack：配列ベースStack、LinkedListベースStack
- Queue：配列ベースQueue、LinkedListベースQueue
- Tree：ポインタ（リンク）ベースの木、配列ベースのヒープ (Heap)
- Graph：隣接リスト
VSCodeが重い時の対処法

皆さん、VSCodeを使っている際に動作が重いと感じたことがないですか？
特に、VSCodeの拡張機能のremote-sshを使ってssh接続すると、すぐに接続が切れて再接続した経験はありませんか？

## VSCodeを軽くするための方法
VSCode自身が多くのリソースを消費するため、ssh接続先のサーバがメモリの限界を迎え、接続を解除される。

## 拡張機能を見直そう
まずは、下記の記事を参考に、watcher Excludeを適切に設定し、監視ファイルを限定する。この設定では例えば、Gitがどのファイルの変更を追跡するかである。この設定を何もしない場合は、すべてのファイルを監視するため、ファイルの変更をした際にVSCodeのソース管理のところに変更が反映される。しかし、すべてのファイルを管理する場合は、大きいプロジェクトになるとそれだけでリソースを消費する。そのため、追跡する必要がない```node_modules```や```vender```などのファイルを設定すればよい。
もしそれでもremote-sshが切断される場合は、```**```を追加することで、すべてのファイルを追跡しないように設定できる。この場合、Gitのソース管理は変更を検知しないので、リロードボタン（下の画像の赤で囲んだボタン）を押さないとファイルの変更を反映できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904571/d3d8f2a5-9e0a-4bd8-9534-22a3aa59275a.png)

次に、拡張機能の必要性を考える。拡張機能の中には、リソースの消費が、多いものがある。そのため、ssh接続がすぐ切断されてしまう場合には、これらの拡張機能を無効にして試してみよう。

https://blog.future.ad.jp/vscode%E3%81%AEssh%E6%8E%A5%E7%B6%9A%E3%81%A7%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E8%B2%A0%E8%8D%B7%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%A8%E5%AF%BE%E7%AD%96

## Typescriptを用いた開発の設定
Typescriptには、ビルドインでもともとインストールされている「TypeScript と JavaScript の言語機能」という拡張機能がある。どうやらこの拡張機能が多くのリソースを消費するようだ。そのため、setting.jsonに次の設定を行うことでTypescriptを用いた開発の動作を改善することができるかもしれない。

```
"typescript.tsserver.experimental.enableProjectDiagnostics": false,
"typescript.tsserver.log": "off",
"typescript.disableAutomaticTypeAcquisition": true,
  ```
こちらの記事参照

https://note.com/modern_ferret431/n/n1ca3eb79b66e

## 現在のメモリ使用量を確認しよう
ここまでの設定を行っても、改善しない場合は、ssh接続先のサーバのメモリ使用状況を確認しよう。
もしかすると、想定外のプロセスが走っていてメモリを無駄に食っている可能性がある。
Linuxの場合は次のコマンドで確認することができる。


まずは、```free```により、メモリの使用量を確認する。
```shell
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi        6Gi        3Gi        1Gi        6Gi        8Gi
Swap:          2Gi        0Gi        2Gi
```
- total：システムに搭載されているメモリの合計量
- used：現在使用中のメモリ量
- free：完全に未使用のメモリ量
- shared：複数のプロセス間で共有されているメモリ量
- buff/cache：バッファやキャッシュとして確保されているメモリ量
- available：新しいプロセスが使用可能なメモリ量（free + buff/cache とは異なり、すぐに利用できる分を計算）

つまり、availableを見ることで、今後利用できるメモリを確認することができる。

次に、```ps aux```により、現在走っているプロセスが割り当てられているメモリを確認することができる。
```shell
$ ps aux --sort=-$mem | head -n 5
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       1234  5.0 10.5 8000000 4200000 ?      Ssl  10:00   2:30 /usr/lib/firefox/firefox
root       5678  3.2  8.3 6000000 3200000 ?      Ssl  09:50   1:45 /opt/google/chrome/chrome
user      11223  2.1  6.7 5000000 2700000 ?      Sl   11:30   1:15 /usr/bin/gnome-shell
mysql      9876  1.5  5.8 4000000 2300000 ?      S    08:15   0:55 /usr/sbin/mysqld
```
これを実行することで、メモリ使用量が多いプロセスの上位5個を表示することができる。
ここから、必要のないプロセスを終了(kill)することでメモリを開放することができる。

ちなみに、特定のプロセスを終了(kill)する方法は以下の通りである。
```shell
$ kill <プロセスID>
```
プロセスIDは、先ほどプロセスを検索した（```ps aux ~~~```）際に出てきたPIDの値を入力する。もしこれでプロセスを終了することができない場合は、-9を指定することで、強制終了することができる。しかし、強制終了すると次に同じプロセスを走らせるときにエラーを生じる可能性があるのでお勧めはできない。
```shell
kill -9 <プロセスID>
```

ここまでが、私が知っている限りのVScodeを軽くする方法である。もし、自分のパソコンのメモリが少ない場合やssh接続先のサーバのメモリが少ない場合には試してみてほしい。

:::note warn
私自身、まだまだ勉強中のため、誤っている部分があるかもしれません。
もし間違いがありましたら、修正のリクエストやコメントで教えていただけると嬉しいです。
:::
Tailwind CSS v4 で導入された、CSS First Configurationsについて

# はじめに
何の気なしにインストールしてしまった、Tailwind CSS v4。
`tailwind.config.js` がなくなっていることに気がつきました。
どうやらアップデートがあったようなのでシェアします！

# CSS First Configurations とは？
今まで、テーマなどの設定は `tailwind.config.js` で行っていましたが、Tailwind CSS V4からは、CSSファイル内で直接行えるようになったようです。

例えば、こんな感じで設定していた　`tailwind.config.js` は、
```tsx
export default {
  theme: {
    extend: {
      colors: {
        daidai: "#ee7800",
        azuki: "#96514d",
      },
    },
  },
}
```

v4からは、`globals.css` に、こんな感じで書けるようです。

```css
@import "tailwindcss";
 
@theme {
  --color-daidai: #ee7800;
  --color-azuki: #96514d;
}
```

そして、このような形で呼び出すことができます。
```js
<p className="bg-azuki text-daidai">Discover and deploy boilerplate example Next.js projects.</p>
```

# さいごに
シンプルになっていいなと思う反面、昔の方法で実装されたデザインを参考にさせていただく際など、読み替えるのが少し手間かなと感じました。

ただ、慣れかなとも思うので、これを機に活用していこうかなと思います！

もしお気づきの点があれば、ぜひぜひコメントいただけましたら幸いです！
アロー関数(Arrow function)と巻き上げだけを簡単に説明

javascript初学者の為，関数の巻き上げに対して，なんでこんな気持ち悪い機能がついてんだと思っていたが，アロー関数を使用すれば巻き上げを回避できる事を知った．また，他にもアロー関数を用いる利点があるので，それも含めて以下に記述する

### 要点
アロー関数は，function の代わりとなるが，巻き上げやthisの挙動が異なる．
javascript特有の巻き上げや，thisのコストを避けたい場合には，出来る限りアロー関数を用いるべき．
また，functionを用いるのであれば，"use strict" を用いる事で，制限されたモードを使用する事が推奨される．

## アロー関数（Arrow Function）とは
アロー関数は、ES6（ECMAScript 2015）で導入された新記法  
`=>`（矢印）を使うことで、より簡潔に関数を定義できる  
また， **this の扱いが異なる** という特徴がある


### 基本的な構文
```
const 関数名 = (引数1, 引数2, ...) => {
  処理;
  return 戻り値;
};


```


### 巻き上げ（Hoisting）について
巻き上げ (Hoisting) は変数や関数の宣言がスコープの先頭に移動する(様に見える)仕様
但し，実際のコードが移動する事は無く，実行コンテキストの中で変数や関数の宣言が事前に処理される事で生じる．
~~要は，Javascriptにおけるレガシーな機能である~~



</details>


具体例
```
// 巻き上げが生じる

sayHelloWorld(); // "HelloWorld!"

function sayHelloWorld() {
  console.log("HelloWorld!");
}

```

```
// 内部的な処理
function sayHelloWorld() {  // 関数の定義全体が巻き上げられる
  console.log("HelloWorld!");
}

sayHelloWorld(); // "HelloWorld!"

```





### なぜアロー関数では巻き上げが回避できるのか
アロー関数は**関数式**，functionは**関数宣言**である為．

関数宣言はスクリプトの解析時にメモリに登録されるため，事前に呼び出し可能となる．
言葉を返すと，巻き上げが**勝手に**される．

#### 巻き上げの影響を受ける or 受けない
影響を受ける
 - var, function

影響を受けない
 - let, const, 関数式, アロー関数



### 巻き上げが現存する理由と対策
Javascriptにおける，歴史的な経緯が強い．

初期のJavascriptは，スクリプトの実行速度を高める為，**事前解析**を行う仕様だった．
従って，Javascriptエンジンは，コードの**実行前に関数の宣言を登録**して，後で実行可能とする仕様となった．
結果として，自然発生として，巻き上げ(関数の事前登録)が生じた．


その後，Javascriptはバージョンアップがされてきたが，依然として巻き上げは残っている．
少なくとも，巻き上げという処理自体は，理解して利用すれば便利であると考える人もいる．
"use strict"モードや，アロー関数により，thisの巻き上げの影響を制限している．





### 参考文献
MDN Web Docs - Hoisting
https://developer.mozilla.org/en-US/docs/Glossary/Hoisting

TC39 Proposal - Let and Const
https://tc39.es/ecma262/#sec-let-and-const-declarations

Brendan Eich's blog - JavaScript History
https://brendaneich.com/
JWTとは

# JWT(Json Web Token)とは
ユーザーがログイン状態を維持するために、サーバーがクライアントに対して発行するトークンを指す。
# JWTの基本構造
JWTは、3つの部分から構成され、ドット（.）で区切られた1つの文字列として表現されます。

**ヘッダー（Header）**

- 使用するアルゴリズム（例：HS256、RS256）とトークンのタイプ（通常は"JWT"）を定義

**ペイロード（Payload）**

- ユーザー情報（例：ユーザーID、権限）や、有効期限などが含まれる


**署名（Signature）**

- ヘッダーとペイロードを秘密鍵または公開鍵で署名し、改ざんを防ぐ

```javascript
const jwt = require('jsonwebtoken');

const payload = {
  userId: 123,
  email: "user@example.com",
  role: "user",
  exp: Math.floor(Date.now() / 1000) + 60 * 60 // 1時間有効
};

// 下記はペイロード、秘密鍵、ヘッダーを元にJWTを作成
const token = jwt.sign(payload, "SECRET_KEY", { algorithm: "HS256" });

// 
// token(ヘッダー.ペイロード.署名　がエンコードされた形で1つの文字列になっている) 
//   => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

```

秘密鍵に関してセキュリティ上の観点で、ベタ書きせずに.envなどに記述し、その値を読み込むのが一般的。

## JWT発行までの大まかな流れ
1.ログイン画面にて、ユーザーがメールアドレスとパスワードを入力
2.ログインボタン押下
3.バックエンドで認証処理
4.認証OKでログインが成功したら、JWTを発行
5.発行した、JWTをクライアントに返却
6.クライアントはJWTをCookieに保管

→以降のAPIリクエスト時に、JWTをヘッダーに含めることで、 サーバーはJWTを検証し、認証済みのリクエストかどうかを判断する。

**具体的な検証手順**
1.ヘッダーのJWTを「.」で分割してデコードし、ヘッダー、ペイロード、署名を取得
2. 1.のヘッダー、ペイロード、秘密鍵で、署名を作成
3. 1.で取得した署名と一致するか検証

# 実装上の注意点
- JWTの有効期限を設定する
    - 永久にログイン状態が維持されないように、サービスの特性を考えて設定
- JWTをLocal Storageに保管しない
    - XSS攻撃のリスク
    - データがブラウザが閉じられても消えない
SIGNATEのタイタニック練習問題に挑戦

# 初コンペ参加
SIGNATEのタイタニック生存予測に参加してみました。

```
# trainとtestの連結
data = pd.concat([train, test], sort=False)
```

```
# 欠損値の確認
data.isnull().sum()
```

```
# データ前処理
# sex
data['sex'].replace(['male','female'], [0, 1], inplace=True)

# embarked
data['embarked'].fillna(('S'), inplace=True)
data['embarked'] = data['embarked'].map( {'S': 0, 'C': 1, 'Q': 2} ).astype(int)

# age
data['age'].fillna(data['age'].median(), inplace=True)
```

```
# 学習データとテストデータの抽出
train = data[:len(train)]
test = data[len(train):]

y_train = train['survived']
X_train = train.drop('survived', axis = 1)
X_test = test.drop('survived', axis = 1)
```

```
# 機械学習
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

clf = make_pipeline(StandardScaler(), SVC())
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
clf.score(X_train, y_train)
```

投稿した暫定評価は0.8005918でした
（この評価の見方もよく分かっていません）

# 初めて挑戦した感想
ChatGPTや書籍などを参考に挑戦したので、まだ完全に理解出来ていませんがこの問題をもう少し深掘りして理解を深めていきたいです。
atcoder_水色精進記録8_ABC119c

# Atcoder水色精進記録
ABC119
C - Synthetic Kadomatsu
https://atcoder.jp/contests/abc119/tasks/abc119_c

# アルゴリズム・データ構造
全探索(DFS)

# 考察
延長、短縮、合成\*竹の選択=3*8=24なので、選択肢が多い。順番固定で絞ることをできないかを検討
延長、短縮の後に合成と合成した後に延長、短縮はどちらもコスト、結果が同じである。
先に合成をした場合に計算が楽になりそう。
合成する竹はどうやって選ぶか?
→最終的な行き先が3本の竹のどれかor使わないかの4択
→全探索は4\*\*Nのため可能

各竹がA,B,C,未使用のどこに割り振られるかが分かれば、
割り振られた竹の本数-1回合成＋(割り振られた竹の長さの合計-目的の長さ)の絶対値
で簡単に計算が可能

# 提出
https://atcoder.jp/contests/abc119/submissions/63156108

# 感想
現在なら緑色中間くらい?
新卒入社までに読みたい本、サイト

新卒入社までに読んだ方がいい本、サイトをキャッチアップする中で、読んだ方がいいと思ったものを纏めたいと思います。

データ構造とアルゴリズム、オブジェクト指向、クリーンアーキテクチャやDDD等のデザイン周り、システム設計は学習した方が良いという結論です！

リーダブルコード
https://www.oreilly.co.jp/books/9784873115658/

NeetCode 
https://neetcode.io/practice

現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法
https://amzn.to/4gfx9lB

ドメイン駆動設計入門 
https://amzn.to/3CscFrN

Clean Architecture 達人に学ぶソフトウェアの構造と設計
https://amzn.to/4gd295p

Hello Interview 
https://www.hellointerview.com/learn/system-design/in-a-hurry/introduction
atcoder_水色精進記録7_ABC119d

# Atcoder水色精進記録
ABC119
D - Lazy Faith
https://atcoder.jp/contests/abc119/tasks/abc119_d

# アルゴリズム・データ構造
二分探索

# 考察
典型的な二分探索で解けそう。
神社についてxからの近傍を2分探索で求め左に行く場合、右に行く場合を考える
神社に行ったのち、最も近い寺にいった場合の最小値を計算
寺に行って神社にいったほうが移動距離が短い場合もあるので、S,Tを入れ替えて同じことを実施

# 提出
https://atcoder.jp/contests/abc119/submissions/63155696

# 感想
水色diffだったが現在なら茶色くらい?
SESSIONよ君はCOOKIEとLocalStorageな関係なんだ?

検索の絞り込みをした状態で、そのAに対して新規登録を行った後、一覧ページに戻る時に、その絞り込み状態のままにしてください。

という機能が今日のお題だった。
GETで送り返そうと思っていたのだが、

補足事項に**sessionで保持させると良いかも。**
と記載されていた。

sessionって一度設定するとリセットしないといけないことは知っていたけどいまいち分かっていなかったので調べてみた。

## セッションとは
ユーザーがwebサイトにアクセスしている間の「状態」や「情報」を保持する仕組み。
ユーザーのログイン状態、ショッピングカートの内容を情報を維持できる。

初めてサーバーにアクセスするとサーバーはセッションIDを作成。
そのセッションIDはクッキーで保存されてリクエストでサーバーに送信される。

サーバーはこのIDを元に保存されたセッションデータを呼び出しユーザーの状態を管理する。

サーバー側に保存されるので改ざんリスクが低いのが特徴。


## セッション操作の基本

### 保存

    $_SESSION['username'] = 'taro';


### 取得

    $username = $_SESSION['username'];

### 削除

    unset($_SESSION['username']);
    session_destroy(); 


セッションの他にもクッキー、あるいは昔、ローカルストレージを利用してくじ引きを作成したことがある。

ローカルストレージもデータを保存する仕組みだと覚えている。

どれもデータを保存するものだと思っているがこれを機に違いについても調べてみた。


## 3つの違い
### クッキー
保存場所: ブラウザ（クライアント側）。

管理主体: ユーザーのブラウザが管理。

特徴: 小さいデータ（通常は4KB程度まで）の保存

保存期間:有効期限を設定できる。永続も可能。


### ローカルストレージ

保存場所: ブラウザ内に保存されるクライアント側のストレージ。

管理主体: ユーザーのブラウザが管理。

特徴:
セッションストレージよりも容量が大きい。
数MB程度のデータを保存可能。
データは永続的に保存されるため、ブラウザを閉じても残る。

保存期間:明示的に削除されない限り無期限。ブラウザのキャッシュに残る。

### セッション
保存場所: サーバー側でデータを保持。

管理主体: サーバーがデータを管理。ユーザーの識別はクッキーに保存されたセッションIDを利用。

特徴: サーバー側でデータが管理されるため、ユーザーがデータを直接改ざんするリスクが低い。

保存期間:ユーザー操作が続いている間は維持。一定時間操作がないとタイムアウト。時間設定可能。

# 利用シーン
## セッションが適している場合:

例: ユーザー認証（ログイン状態の管理）、一時的なユーザー情報の保存。

理由: セキュリティ面で優位、サーバー側で管理するためユーザーが直接データにアクセスできない。

    
## クッキーが適している場合:
例: ユーザーの設定情報、トラッキング情報、言語設定など、サーバー側でなくても良い小さな情報。

理由: サーバーとのやり取りで自動的に送受信され、ユーザーごとのカスタマイズが可能。

    
## ローカルストレージが適している場合:
例: ユーザーの一時保存情報、オフライン時のデータキャッシュ、大量のクライアントサイドデータ。

理由: ブラウザに大容量のデータを保持でき、ページをまたいで情報を長期間保存することが可能。



ローカルストレージは長いフォームなどで途中でページを閉じてしまったときでも情報が保存される。

らしい。

昔、長いこと入力しているとログアウトされるので小まめに保存してくださいね。

と言われたことがあったが、これかが正体か。

## cookieはお菓子の欠片が由来？

だと思っていたが全然違った。
Magic cookieという用語があるらしい。
プログラム間でやり取りされる小さなデータ片を表す技術用語。
ここから取られたらしい。
【サーバーレス】Cloud Run + GitHubでNext.jsをCI/CDする

# はじめに
サーバーレス×コンテナ の組み合わせが注目される中、GCPの Cloud Run を使えば、Dockerコンテナを爆速デプロイできます！

インフラ管理不要、リクエスト時のみ起動、スケールも自動。さらに使った分だけ課金でコストも最適！

本記事では、Cloud Runを使って、Dockerコンテナをサーバーレスで爆速デプロイする方法を説明します。

では、始めましょう！

# アプリケーションとリポジトリの準備
## Next.js アプリケーションの作成
サンプルアプリからサクッと作ってしまいます！
```
npx create-next-app --example with-docker nextjs-on-cloudrun
```

## リポジトリの作成
GitHubのUI上で、今回使うリポジトリを作成します！

1. リポジトリタブを選択して、「New」を押下！
![スクリーンショット 2025-02-24 23.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/85b24845-5823-46fd-9563-63236804a389.png)

2. リポジトリ名を決めて、非公開設定をして、CreateRepository
![スクリーンショット 2025-02-24 23.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/3e00fb0a-bfe4-4835-8c1a-ba10716cc003.png)

## リソースをGitへPush
UI上の指示に従って、GitHubへリソースをPushします！
![スクリーンショット 2025-02-24 23.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/ff2a55bd-5cf3-48ba-8eb8-737b4eca8fcb.png)

# Cloud Runでの設定
1. Cloud Runの管理画面を開きます！
https://console.cloud.google.com/run

2. リポジトリを接続を押下
![スクリーンショット 2025-02-24 23.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/ddeb60b0-3def-4c35-aac5-0a2a5b1a70a0.png)

3. サービスはGitHubを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/4c0e1ab0-1963-495c-beea-8998a3b9bda3.png)

4. CLOUD BUILDの設定　を押下します。
![スクリーンショット 2025-02-24 23.53.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/61f86abd-fc50-49ba-bd60-e168c1e25e10.png)

5. リポジトリを選択して次へを押下
![スクリーンショット 2025-02-24 23.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/94d0e10c-673b-4cc9-9e96-9755b6ddc0e9.png)

6. 対象リポジトリを選択。ビルドタイプは Dockerfileを選択、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/e1968f6d-a979-42a6-b59a-a6927b522170.png)

7. サービス名、リージョン、認証方法を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/d50f7f35-349b-46d1-bba0-d7502d835dd0.png)
※ ここでは外部からアクセスできるように、「未認証の呼び出しを許可」しています。

7. Cloud Buildトリガーは、Next.jsのデフォルトポート番号に合わせて、3000を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/c8ed5cf3-60ad-451e-9c39-ed3427ed53e3.png)

8. 画面下部の「作成」を押下

# 動作確認
しばらく待つと、ビルド・デプロイが完了します。
画面上部のURLに接続してみると...。

![スクリーンショット 2025-02-25 0.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/fb9a6971-9110-4aa4-907e-896d259aec4b.png)

このような形で、初期画面が表示されるはずです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/d22da39e-3f58-4dd0-b3c3-063d1ddf60a1.png)


試しにindex.jsの中身をこんな少し変えてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/71aeb420-e9f5-4422-8711-207cc3d4bedb.png)

mainにmergeすると、このような感じで問題なく変更できていることが確認できます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722068/d0773150-3182-4302-a73c-30632c66fd44.png)

# 最後に
いかがでしたでしょうか？
私は、CI/CDを含めた環境構築を爆速でできてしまうことに、目から鱗でした！
もしよろしければ、ご活用いただけましたら幸いです！
Windowsバッチファイルの基本と便利な使い方

# Windowsバッチファイルの基本と便利な使い方
Windowsバッチファイル（.bat）は、Windows環境でコマンドを自動化するためのシンプルなスクリプトです。本記事では、バッチファイルの基本構文と便利な使い方を紹介します。

## 1. バッチファイルとは？
バッチファイル（Batch file）は、Windowsのコマンドプロンプトで実行できるコマンドをまとめて記述したテキストファイルです。拡張子は `.bat` または `.cmd` になります。

## 2. 基本的な書き方
バッチファイルは、メモ帳などのエディタで作成し、`.bat` 拡張子で保存するだけで実行できます。

### 2.1. 簡単なバッチファイルの例
```bat
@echo off
echo Hello, Windows Batch!
pause
```

説明：

@echo off : コマンドの表示を抑制
echo : 文字列を表示
pause : ユーザーのキー入力を待機


## 3. 便利なバッチ処理

### 3.1. ファイルのコピー
```bat
@echo off
copy C:\source\file.txt D:\backup\
echo ファイルをコピーしました。
pause
```

### 3.2. フォルダ内のファイル一覧を取得
```bat
@echo off
dir C:\Users > filelist.txt
echo ファイル一覧をfilelist.txtに出力しました。
pause
```

### 3.3. 繰り返し処理（forループ）
```bat
@echo off
for %%f in (*.txt) do echo %%f
pause

```
このスクリプトは、カレントフォルダ内の .txt ファイルの名前を一覧表示します。

## 4. まとめ
Windowsバッチファイルは、簡単な自動化スクリプトを作成するのに便利なツールです。基本的なコマンドを理解し、作業の効率化に活用してみましょう！
ネットワーク通信の流れとデータのカプセル化

## 1. TCP接続の確立とデータの流れ
## TCP接続の確立(3ウェイハンドシェイク)
・クライアントは**SYNパケット**を送信し、サーバに接続要求を行う。
・サーバは **SYN-ACKパケット**を返し、接続を承認する。
・クライアントは**ACKパケット**を送り、接続が確立される。
・TCPセグメントが作成され、送信準備が整う。

## IPアドレスの取得 (DNS)
・接続先のIPアドレスを知らない場合、最初に**DNSクエリ**を行い、宛先のIPアドレスを取得する。
・取得したIPアドレスを使ってTCP接続を確立する。



## 2.データのカプセル化と送信の流れ
## 各層でのデータの処理
1.**アプリケーション層**：HTTPリクエストなどのデータを生成
2.**トランスポート層**：データを**TCPセグメント**にカプセル化（ポート番号を付与）
3.**ネットワーク層**：TCPセグメントを**IPパケット**にカプセル化（IPアドレスを付与）
4.**データリンク層**：IPパケットを**フレーム**にカプセル化（MACアドレスを付与）
5.**物理層**：フレームを電気信号や電波に変換して送信

## IPパケットの扱い
・TCPセグメントの時点で宛先IPアドレスは決まっているが、TCPヘッダーには含まれない。
・ネットワーク層でIPパケットにカプセル化されるとき、宛先IPアドレスが付加される。

## 3.ルーターとARPの役割
## 異なるネットワークへの通信
・宛先が別ネットワークにある場合、データは**ルーター（ゲートウェイ）を経由**する。
・ルーターは**新しいフレームを作成**し、次のネットワークに転送する。
・宛先IPアドレスは変わらないが、**送信元と宛先のMACアドレスはルーターごとに更新される。**

## ARP (Address Resolution Protocol)
・ルーターが次のホップのMACアドレスを知るために**ARPを使ってMACアドレスを解決**する。
・同一ネットワーク内では宛先PCのMACアドレスを取得するが、異なるネットワークの場合はルーターのMACアドレスを取得する。

## 4.まとめ
・TCPセグメントが完成した時点で、宛先のポート番号やIPアドレスは確定している。
・IPパケットが作られると、そのままデータリンク層に送られ、接続確認なしで送信される。
・異なるネットワークへはルーターがパケットを転送し、その際に新しいフレームを作成する。
・ARPはMACアドレスを解決するために使用され、ルーターを経由するたびに送信元・宛先のMACアドレスが変わる。
円種率 勿論三角関数を使わないよ

円周率を求める。
演習で求める。
ソースは↓に。

結果
---
```result.log
---START---     22:23:56
r弱=2305843009213693952.000000

正解↓
3.141592653589793115997963
3.132264619271114547416346,1022:23:56
3.141592652478686797934415,41101022:28:56
3.141592652926463724583073,58129022:33:56
3.141592653100025778201143,71164022:38:56
```

15分で
3.141592653
まで正解。
ちょっと放置しとく。

↓放置した結果
---
```
結果が入る予定
```

code
---
```pai21.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <float.h>


void now(void)
{
	time_t t = time(NULL);
	struct tm *local = localtime(&t);
/*
	printf("%04d/", local->tm_year + 1900);
	printf("%02d/", local->tm_mon + 1);
	printf("%02d", local->tm_mday);

	printf(" ");
*/
	printf("%02d:", local->tm_hour);
	printf("%02d:", local->tm_min);
	printf("%02d\n", local->tm_sec);
	fflush(stdout);
}

int main(int argc,char *argv[])
{
	printf("---START---     ");	now();//時刻表示
	//--- --- --- ---
	const double r= sqrtl(sqrtl(sqrtl(sqrtl(DBL_MAX))))/4.0d /2.0d;
	printf("r弱=%lf\n\n",r);
	printf("正解↓\n%1.24lf\n",M_PI );

	unsigned long waris = 10 ,m=100 ,o=0,nnn;

	double x,y ,xx,yy;
	double oy ,ox,een;
	do{
		y=0.0d;
		oy=0.0d;
		ox=r;
		een=0.0d;
		char ff = 0 ;
		while( !ff )
		{
			y += r/waris ;
			ff = y > r;
			if(ff ) y = r ;
			
			x = sqrtl( r*r - y*y);
			xx = ox - x;
			yy = y -oy ;
			ox = x ;
			oy = y ;
			een += sqrtl(yy*yy +xx*xx);
//			printf("y=%lf %lf\n",y,een);
		}

		nnn = time(NULL);
		if ( nnn >= o)
		{
			o = nnn + 60*5  ;
			printf("%1.24lf,%d",een/r*2.0d,waris );
			now();
		}
		waris += 10 ;
		m--;
		m=1;
	}while(m);


	return 0;
}
```
ip route コマンドの見方

```bash
ip route show
# default via 10.194.185.1 dev ens3 proto dhcp src 10.194.185.50 metric 100
# 10.194.185.0/24 dev ens3 proto kernel scope link src 10.194.185.50
# 10.194.185.1 dev ens3 proto dhcp scope link src 10.194.185.50 metric 100
```

- **宛先IP**
宛先IPに該当するルートが選択される。
`default` はどの宛先にも該当しない場合に使われる宛先。(デフォルトルート)
- **via xxx.xxx.xxx.xxx**
ネクストホップ(ネクストホップとはパケットを次に渡す相手(ルーター)のこと)
宛先が同一セグメントではない場合、直接通信できないので、次にパケットを渡すルーターを指定しなければなりません。
※ 逆に宛先がホストのIPと同一セグメントであればネクストホップの指定は必要ありません。
- **dev xxxxx**
パケットを送信するデバイス
- **proto**
    - proto kernel: カーネルが自動生成した経路
    - proto dhcp: DHCPが自動生成した経路
- **scope**
    - scope link: 直接 unicast/broadcastにて送信する経路。(自身が所属するネットワークなどが該当)
    - scope host: 自分自身への経路
    - scope global: ルーターを経由した他のネットワークへの経路。 (scopeオプションがない場合もこれに該当)
- **src xxx.xxx.xxx.xxx**
送信元
- **metric xxx**
ルーティングの優先順位を決定するために使用される値で、小さい値ほど優先されるルートになります
【Laravelメモ】Eloquent , DBファサードによるJOINの違いについて

# LaravelのEloquentとDBファサードでJOINを実現する方法

LaravelフレームワークでSQLのJOIN句を実装する方法をメモします。

各JOINの種類ごとに、Laravelのモデル操作機能であるEloquentとDBファサード両方のパターンをそれぞれ記載していきます。

## **1. 基本のINNER JOIN**

以下のSQLクエリをEloquentとDBファサードで書き換えます。

```sql
SELECT orders.id, customers.name 
FROM orders 
JOIN customers ON orders.customer_id = customers.id 
WHERE orders.status = :status;
````

Eloquentでの実装：

```php
$orders = Order::join('customers', 'orders.customer_id', '=', 'customers.id')
    ->select('orders.id', 'customers.name')
    ->where('orders.status', $status)
    ->get();
```

DBファサードを用いた実装：

```php
use Illuminate\Support\Facades\DB;

$orders = DB::table('orders')
    ->join('customers', 'orders.customer_id', '=', 'customers.id')
    ->select('orders.id', 'customers.name')
    ->where('orders.status', $status)
    ->get();
```

## **2. LEFT JOIN（左外部結合）**

Eloquent:

```php
$orders = Order::leftJoin('customers', 'orders.customer_id', '=', 'customers.id')
    ->select('orders.id', 'customers.name')
    ->get();
```

DBファサード:

```php
$orders = DB::table('orders')
    ->leftJoin('customers', 'orders.customer_id', '=', 'customers.id')
    ->select('orders.id', 'customers.name')
    ->get();
```

## **3. RIGHT JOIN（右外部結合）**

Eloquent:

```php
$orders = Order::rightJoin('customers', 'orders.customer_id', '=', 'customers.id')
    ->select('orders.id', 'customers.name')
    ->get();
```

DBファサード:

```php
$orders = DB::table('orders')
    ->rightJoin('customers', 'orders.customer_id', '=', 'customers.id')
    ->select('orders.id', 'customers.name')
    ->get();
```

## **4. CROSS JOIN（交差結合）**

Eloquent:

```php
$orders = Order::crossJoin('customers')->get();
```

DBファサード:

```php
$orders = DB::table('orders')
    ->crossJoin('customers')
    ->get();
```

## **5. 複数のJOINを組み合わせる**

Eloquent:

```php
$orders = Order::join('customers', 'orders.customer_id', '=', 'customers.id')
    ->join('products', 'orders.product_id', '=', 'products.id')
    ->select('orders.id', 'customers.name', 'products.product_name')
    ->get();
```

DBファサード:

```php
$orders = DB::table('orders')
    ->join('customers', 'orders.customer_id', '=', 'customers.id')
    ->join('products', 'orders.product_id', '=', 'products.id')
    ->select('orders.id', 'customers.name', 'products.product_name')
    ->get();
```

## **まとめ**

- LaravelのEloquentでは、`join()` メソッドを使うことでSQLの`JOIN`を実装できます。
- `leftJoin()`、`rightJoin()`、`crossJoin()` などを使用することで様々なJOINを実現可能です。
- DBファサードを使用すると、より柔軟にSQLライクなクエリを書くことができます。

今後もLaravelでのアプリケーション開発業務で覚えた知識をシェアしていきたいと思います。
【Fish】パスを削除する方法

## パスを確認する
以下のようにパスの一覧を確認できます。

```terminal
$ echo $fish_user_paths | tr " " "\n" | nl
     1  /usr/local
     2  /usr/sbin
     3  /usr/local/bin
     4  /home/username/.nodebrew/current/bin
     5  /home/username/.pyenv/shims
     6  /home/username/.pyenv/bin
     7  /home/username/.yarn/bin
```

## パスを削除する
`set -e`, `set --erase`を使用してパスを削除できます。
インデックスを指定して特定のパスを削除します。
インデックスは`0`からではなく`1`からです。

```terminal
set -e fish_user_paths[1]
```

複数のパスを削除する場合には指定するべきインデックスが変更されるため、`echo $fish_user_paths | tr " " "\n" | nl`で確認する必要があります。
WSLの開始ディレクトリをエクスプローラの`ターミナルで開く`メニューから指定できない問題

## 問題

エクスプローラの右クリックメニュー`ターミナルで開く`を使ってWindowsTerminalを起動した際，
既定のプロファイルがWSLの条件下において，
開始ディレクトリがエクスプローラからWSLに引き継がれない問題 

## 解決

コントロールパネルで以下が有効になってるか確認する．

- プログラムと機能
    - Windowsの機能の有効化または無効化
        - Linux 用 Windows サブシステム(Windows Subsystem for Linux)
        - 仮装マシンプラットフォーム
        - Hype-V

再起動および，Linuxイメージの再インストールをしたら直った．

## 感想

Hyper-V，仮装マシンプラットフォームが無効の状態でWSLをインストールできるのが原因な気がする．

https://qiita.com/omu_kato/items/f9a6b5a02e25f5f2a487

https://qiita.com/matarillo/items/ca1eecf8f9a3cd76f9ce

なお，

https://learn.microsoft.com/ja-jp/windows/wsl/compare-versions

> WSL 2 は Hyper-V 仮想マシンとして実行されています

って言ってるのに無効でインストールできるのかよって気持ち．

https://learn.microsoft.com/ja-jp/windows/wsl/install

https://learn.microsoft.com/ja-jp/windows/wsl/setup/environment

あまり言及されてないとこみると，WSLでWindows上のディレクトリで作業する人は少数派のようだ(そりゃそう)．
WSL1のままでいいっちゃいいんだよなぁ．

## ひとこと

WindowsTerminalのペンギンマークのWSLとディストリビューションのアイコンのWSLとの違いって何？

Win11の右クリックメニューに`Codeで開く`が復活してほしい．
【備忘録】Pythonでログを出力する

## はじめに
今までは主にNodeで開発しており、各アプリの既存ログ機能を利用していましたが、Pythonで開発するにあたり自分で実装することになりました。
調べた結果、標準モジュールのloggingが便利だと感じたので、記事に残しておきたいと思います。

## 仕様
仕様については公式ドキュメントをご覧ください。リンク先はPython3.13用です。

https://docs.python.org/ja/3.13/library/logging.html

## 実装例
loggingはターミナルやファイルに出力できます。

まずはターミナルに出力してみましょう。

```py
import logging

# ログの基本設定
logging.basicConfig(
    level=logging.INFO,  # ログレベルをINFOに設定
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'  # ログフォーマット
)

# ロガーの作成
logger = logging.getLogger(__name__)

# ログメッセージの出力
logger.info("これは情報メッセージです")
logger.warning("これは警告メッセージです")
logger.error("これはエラーメッセージです")
```

VSCodeのターミナルで実行します。
![log1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949751/acbc4c5a-ca85-444e-9d0c-dfd7e569d6f9.png)

![log2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949751/041ea882-e3d3-489a-9770-83b9d0fea669.png)
ターミナルに出力できました！

今度はログファイルに出力します。

```py
import logging
import os

# ログファイルの設定
LOG_DIR = "."
LOG_FILE = os.path.join(LOG_DIR, "app.log")

# ログの基本設定
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[logging.FileHandler(LOG_FILE, encoding='utf-8')]  # ファイルハンドラを追加
)

logger = logging.getLogger(__name__)

# ログメッセージの出力
logger.info("これは情報メッセージです")
logger.warning("これは警告メッセージです")
logger.error("これはエラーメッセージです")
logger.critical("これは重大なエラーメッセージです")
```
こちらもVSCodeで実行します。
![log7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949751/f5294a6f-164b-4ef3-8322-56f81e43196c.png)
![log8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949751/40c9e14a-dd77-4a32-89dc-8cf5f70bc75c.png)
ログファイルを開くと、きちんと記録されていました！
フォーマットはカスタムできるので、見やすいように調整すると良さそうです。
（今回のコードは最も標準的なもののようです。）

## 終わりに
初めて実装したloggingは現在時刻をdatetimeモジュールで取得していましたが、記事執筆をする中で時刻取得機能があることを知りました∑(ﾟДﾟ)
（生成AIの [felo](https://felo.ai/ja/search) に教えてもらいました）
つい生成AIに頼ってしまいますが、自分でアウトプットするためにもインプット大事！と感じました。

開発段階ではprint()を使うことも多いですが、ファイル出力ができ、機能やフォーマットも共通化できる点で、運用時のメリットがありそうだと感じました。

最後までご覧いただき、ありがとうございました！
【電脳少女プログラミング2088 ─壊レタ君を再構築─】Python初心者がやってみた（廃マンションの一室編）

## はじめに

前回の記事で「自然の残る公園」をクリアして、今回は「廃マンションの一室」をクリアしたので書こうと思います。

難しくてまだクリアできてない方などに参考にしてもらえると嬉しいです。

https://paiza.jp/entry/denno2088_qiita

## 【問題】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526750/01cc7973-73c5-463b-8181-c116b640093d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526750/a7aa4e43-9500-48f4-be76-976d3f439392.png)

## 解答

今回もPython3を選択して書いてみました。

```python:解答
# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ！！

N = int(input()) # 整数として受け取る

digits = [] # リストをリセット

while N != 0:
    remainder = N % 3  # 余りを取得
    N = N // 3  # 商を更
    
    # 余りが2の場合は-1とし、次の桁に+1を繰り上げる
    if remainder == 2:
        digits.append(2)
        N += 1  # 繰り上げ
    else:
        digits.append(remainder)

print("".join(map(str, digits[::-1]))) # リストの順番を逆にして、文字列に変換
```

## コード解説

上のコードの解説をすると

```python:
N = int(input())

digits = []
```

`N`に受け取った値を整数として代入。
`digits`リストをリセット

***

```python:
while N != 0:
    remainder = N % 3
    N = N // 3

    if remainder == 2:
        digits.append(2)
        N += 1
    else:
        digits.append(remainder)
```

while文で`N`が0になるまで下を繰り返す。
1. `remainder`に`N`を3で割ったあまりを代入
1. `N`に`N`を3で割った商を代入
1. もし`remainder`が2だった場合、リスト`digits`に2を追加して、`N`に1足す
    `remainder`が2ではない場合はリスト`digits`に`remainder`を代入

***

```python:６行目
print("".join(map(str, digits[::-1])))
```

リスト`digits`を逆順（`[::-1]`）にしてから、文字列に変換（`map(str, ...)`）し、最後に`join()`を使って一つの文字列に結合して出力


***

こんな感じのコードで問題を解くことができました。

## 最後に

記事を最後までお読みいただきありがとうございます！
今回はわからなすぎてAIの力も借りて解きました。今後解けるか怪しくなってきた( ˘•ω•˘ )

ではまた他の記事で会いましょう！またねーヾ(*´∀｀*)ﾉ

## 参考にさせていただいたサイト

> https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kind_basic_theory/decimal-and-binary-numbers/

https://qiita.com/anonymously115/items/0236c22972c630cca43e
Oracle NetSuite リリース2025.1主要なアップデート

NetSuite 2025.1リリースの主なポイントを「機能の追加/改善」「お客様への依頼事項」「リスク」という視点で簡潔にまとめました。すべての内容は、NetSuite 日本語コミュニティにて2025年2月20日に公開した資料 ([「NetSuite 2025.1 リリース内容のご紹介_20250221.pdf」](https://us.v-cdn.net/6032262/uploads/N32V7NZ0GG5D/netsuite-2025-1-e3-83-aa-e3-83-aa-e3-83-bc-e3-82-b9-e5-86-85-e5-ae-b9-e3-81-ae-e3-81-94-e7-b4-b9-e4-bb-8b-20250310-28japan-localization-e8-bf-bd-e5-8a-a0-29.pdf)) をもとにしています。その解説動画も随時追加して参りますので、([NetSuite日本語コミュニティのリリース2025.1主要なアップデート](https://community.oracle.com/netsuite/japanese/discussion/4504569/%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B92025-1%E4%B8%BB%E8%A6%81%E3%81%AA%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88)) もぜひご確認下さい。

※3月4日追記：[Qiitaの記事](https://qiita.com/fujitak/items/90ba19655d90aa1d34dd)にて、コミュニティのアカウントをお持ちの無い方でも動画を視聴頂けますが、ぜひコミュニティのアカウントを作成下さい。

■ 機能の追加/改善
1. **ユーザー体験・UIの向上**
    - 「レッドウッド・エクスペリエンス・テーマ」の強化により、操作画面の洗練やロールごとの色分けが可能になり、可読性と操作性が改善されます。
    - AIプリファレンスの一元化やテキストエンハンス機能の拡張など、文章作成作業の効率化が期待できます。
    <br>
2. **業務効率の向上（会計・生産管理・サプライチェーンなど）**
    - **収益管理**：収益要素の結合（マージ・レベニュー・アレンジメント）の厳格化や、収益認識フィールドマップの拡充により、収益計上業務の一貫性と正確性が強化されます。（アドバンスト収益管理を使用中のお客様に限られます。）
    - **供給計画の強化**：サプライヤーフィルタなど計画範囲を絞った更新が可能になり、共有計画作成のパフォーマンス向上が見込まれます。
    - **製造ルーティングの柔軟化**：Start-to-StartやFinish-to-Startの設定など、より細かくオペレーションを制御できるため、生産計画を最適化しやすくなります。
    - **CSVインポート拡充**：アイテムフルフィルメント（配送）と受領がCSVインポート対象に加わり、外部データの取り込み・更新が迅速化します。
    <br>
3. **セキュリティとガバナンスの強化**
    - **外部ケースの応答ページ**に有効期限付きリンクを導入し、不正アクセスや情報漏洩リスクを低減。
    - **OAuth 2.0/RSA-PSS対応**やSuiteSignOnのサポート終了などにより、認証方式が強化されます。
    - **Ext JSライブラリの削除**など、古い方式からの移行を促進し安全性を高めるアップデートが行われます。
    <br>
■ お客様への依頼事項
1. **リリースプレビュー環境での事前検証**
    - 2025.1リリース前に「リリースプレビュー環境」を申請・利用し、カスタムスクリプトや運用フローが問題なく動作するか確認をお願いします。
    <br>
2. **認証方式やデータソースの移行準備**
    - **SuiteSignOn(アウトバウンドSSO)→OIDCプロバイダー**の早期切り替え
    - **RSA-PKCSv1.5のサポート終了**に伴い、RSA-PSSやEC鍵への移行
    - **NetSuite.comデータソース→NetSuite2.com**への移行
    <br>
3. **カスタムスクリプト・アプリケーションの改修**
    - Ext JSライブラリ削除への対応（外部ライブラリ導入やコード修正）
    - シングルページアプリケーション(SPA)の開発申請プロセスの廃止やオーディエンス設定の変更について、管理者の方は内容を確認して下さい（16、17ページ）。
    <br>
4. **オーディエンス設定の再確認**
    - スクリプトデプロイメント、SPA、CSVインポートなどの「ロール指定」「すべて選択」の挙動が変わります。管理者の方は内容を確認して下さい（17、32ページ）。※オーディエンスとは「閲覧/実行許可者」であり、CSVインポートやスクリプトの実行またはアクセスが許可されたユーザー群を指します

<br>
■ リスク

1. **機能停止・不具合リスク**
    - 非推奨機能のまま放置すると、アップグレード後にシステムが正常に動作しない可能性があります。
        - 例：SuiteSignOn（アウトバウンド・シングル・サインオン）廃止、RSA-PKCSv1.5/NetSuite.comデータソース終了、Ext JS削除など。
    <br>
2. **移行や検証が不足した場合の運用トラブル**
    - プレビュー環境を活用しないまま新リリースに移行すると、予期しないエラーやにつながるリスクが高まります。
    <br>

上記内容をご確認いただき、必要な準備や検証を早めに進めていただくことで、NetSuite 2025.1リリースのメリットを最大限に享受いただけます。
    <br>

※2025年3月11日追記
解説動画へのリンクを以下に追加致しました。

**0. アップデートスケジュールおよびリリースプレビュー環境**

https://videohub.oracle.com/id/1_50hy11by?width=400&height=285&playerId=54927922

**1.1 将来廃止継続利用不可となる機能・設定**


https://videohub.oracle.com/id/1_el7hb221?width=400&height=285&playerId=54927922

**1.2-4 共通_管理、会計、プロダクト業務に関わる新機能**

https://videohub.oracle.com/id/1_uyqetdjy?width=400&height=285&playerId=54927922

**2.1 売掛金調整トランザクションの戻入対応 ＆ 2.2 将来廃止/継続利用不可となる機能・設定**

https://videohub.oracle.com/id/1_y5mn91ib?width=400&height=285&playerId=54927922
空文字も0もFalse？プログラミング初学者のbool型入門記録 

プログラミング初学者の発見と成長の記録です。
**受け取った文字列を操作するコード**を書いた過程で学んだことをメモします。


取り組んだ課題はこちらです。
```
ユーザーから入力された文字列を受け取り、以下を実行するプログラムを書いてください。

- 文字数を表示する
- 大文字に変換して表示する
- 小文字に変換して表示する
- 文字列が空だった場合は「何も入力されていません」と表示する
```

# 💡今回学べたこと

1. 異なるデータ型は比較できない
2. Pythonの真偽値判定の挙動が思っていたのと違った
3. 組み込み関数 `len()`  は、要素のサイズ（要素数や文字数）を取得できる
4. 組み込み型 `str` のメソッド、`upper`と`lower`で大文字小文字を変換できる
5. 組み込み関数 `input()` は、ユーザからの入力を受け取る対話型インターフェースを提供する。戻り値は「文字列」として返ってくる

今回の記事では、タイトルにもある通り、Pythonの真偽値判定を中心に扱います。

# 文字列型(str)と数値型(int)は直接比較できない

```python
# ユーザーからの入力を文字列として受け取る
user_input = input("任意の文字列を入力してください")
# エラー発生箇所: 文字列と整数を比較している
if user_input > 0:
    print(f"{user_input}は、{len(user_input)}文字です") # 文字数をカウント
    print(user_input.upper()) # 大文字に変換
    print(user_input.lower()) # 小文字に変換
# 入力が空の場合は「何も入力されていません」と表示する
else:
    print("何も入力されていません")
```

上記コードでTypeErrorが発生

```python
# TypeError: '>' not supported between instances of 'str' and 'int'
```
if文ヘッダーの箇所で、文字列と整数を比較演算してしまっていることが原因

「異なるデータ型の比較はできない」
冷静に考えれば分かるし、座学で学んで頭でわかったつもりでも、いざコードを書くとやってしまった。

解決していきます。

# シンプルに真偽値で判定する方法

```python
# 改善案1: 真偽値判定を利用
if user_input: #　入力があればTrue、空文字ならFalseを返す
    print(f"{user_input}は、{len(user_input)}文字です")
else:
    print("何も入力されていません")
```

これはシンプルで驚きました。
後述する方法よりも、**Pythonicな書き方**となります。

# 文字列の長さで空文字をチェックする方法

```python
# 改善案2: 文字列の長さを使って判定
if len(user_input) > 0: # 0より大きければTrue、0ならFalse
    print(f"{user_input}は、{len(user_input)}文字です")
else:
    print("何も入力されていません")
```
数字同士に揃えたのでエラーが解消されています。

# **Pythonの真偽値判定**

Pythonでは、**変数やリストが空か否か**で自動的に真偽を判定します。

- 何かが入っている →True
- 空っぽ →False
    例:
    - 空の文字列、リスト、辞書、など
    - 数値の0
    - None


# **確認してみる**

以下の条件がどう評価されるか確認し、理由を添えました。
```python
print(bool(""))   # False <--文字列が空なので
print(bool("a"))  # True <--文字列に値があるので
print(bool(0))    # False <--0なので
print(bool([]))   # False <--空のリストなので
print(bool(["a"])) # True <--リストに値があるので

```


# おわりに

『独習Python』では論理型について下記の説明がなされています。


> 論理型は、組み込み型の中でも最も単純な型で、
> 真(正しい)か偽(間違い)か、いずれかの状態しか持ちません。

この説明を読んで「単純=わかりやすい」ではないんだなと思いました。
しかし、一度わかってしまうと下記コードをすっきりスマートに読めるようになりました。

```python
if my_list:
    print("リストに要素が入っていますよ！")
```

# 今後のためのメモ

- データ型を意識してコードを書く(比較演算だけでなく、算術演算子の場合も振る舞いが変わるため。)
- 値が空かどうか判定するときは、今回学んだbool型のしくみを理解してコードを書く

# 参考資料

https://note.nkmk.me/python-len-usage/

https://note.nkmk.me/python-capitalize-lower-upper-title/

[『独習Python』](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92Python-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4798163643/ref=asc_df_4798163643?mcid=5665e8b2213c3478a31a497f21893a30&th=1&psc=1&tag=jpgo-22&linkCode=df0&hvadid=707442440829&hvpos=&hvnetw=g&hvrand=13980381887061450922&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9199201&hvtargid=pla-917627209173&psc=1&gad_source=1)
Haskell初心者は絶対に意識したい【文字列とリスト】 ( ' ) と ( " ) の違い

## Haskellの基本の基本　注意したいところ

Haskell における文字列の正体は**リスト**です。
この事実に注意すると、**一重引用符と二重引用符の違い**というテーマがとても重要です。
しかし、Haskell初心者にとってはこの重要性を実感できず、あまり注目できない可能性があります。

この記事では、
* 一重引用符と二重引用符の違い
* コンス（`:` 演算子）
* 文字 (`Char`)と文字列 (`String`)
* 糖衣構文（シンタックスシュガー）

という観点から、Haskell の文字列とリストについて初心者向けに解説します。

---

## **1. 一重引用符 (`'`) と二重引用符 (`"`) の違い**
Haskell では、 **一重引用符 (`'`) は `Char` を表し、二重引用符 (`"`) は `String` を表します。**

### **例:**
```haskell
c :: Char
c = 'a'  -- 一重引用符で囲まれた単一の文字

s :: String
s = "hello"  -- 二重引用符で囲まれた文字列（リスト型）
```

**ポイント:**
- `'a'` は **`Char` 型**（単一の文字）
- `"hello"` は **`String` 型**（`[Char]`、つまり `Char` のリスト）

文字列は **`[Char]`（文字のリスト）** であるため、リストとしての操作が可能です。

```haskell
head "hello"   -- 'h'
tail "hello"   -- "ello"
```

---

## **2. コンス `:` 演算子**

Haskell では、リストの **先頭に要素を追加する演算子として `:`（コンス）を使用** します。これは、文字列（`[Char]`）にも適用できます。

### **例:**
```haskell
s1 = 'h' : "ello"  -- "hello"
s2 = 'H' : "askell"  -- "Haskell"
```

**リストとしての解釈:**
```haskell
'h' : ('e' : ('l' : ('l' : ('o' : []))))  -- "hello"
```
つまり、
- `:` は **リストの先頭に要素を追加する演算子**
- `"hello"` は実際には **`'h' : 'e' : 'l' : 'l' : 'o' : []`** というリスト構造

---

## **3. `Char`（文字）と `String`（文字列）**

`Char` は **単一の文字** を表し、`String` は **`Char` のリスト（`[Char]`）** です。

```haskell
c :: Char
c = 'A'  -- 単一の文字

s :: String
s = "Hello"  -- 文字のリスト
```

**文字と文字列の区別に注意！**
```haskell
notChar = "A"  -- エラー！ `"A"` は `Char` ではなく `String`
```

- `"A"` は `String`（`[Char]`）なので、`Char` 型の変数には代入できません。
- `String` は実際には `['A']` という **リスト** です。

### **リスト操作の適用例**
```haskell
length "Haskell"  -- 7  （リストの要素数を取得）
reverse "abc"  -- "cba"  （リストの逆順）
"Hello" ++ " World"  -- "Hello World"  （リストの結合）
```

---

## **4. 糖衣構文（シンタックスシュガー）**

Haskell では、**`String` に対して便利な書き方（糖衣構文）が提供されています。**

### **`String` のリスト表現**
実際には、`"hello"` は以下のようにリストとして表現されます。

```haskell
"hello" == ['h', 'e', 'l', 'l', 'o']
```

このように、`String` は `Char` のリスト `[Char]` の糖衣構文（簡略記法）です。

### **リスト内包表記と `String`**
Haskell ではリスト内包表記を使って、文字列を生成できます。

```haskell
alphabet = [c | c <- ['a'..'z']]  -- "abcdefghijklmnopqrstuvwxyz"
```

これは `['a'..'z']` をそのまま `String` として扱う例です。

---

## **5. まとめ**

| 観点 | 説明 | 例 |
|------|------|------|
| **一重引用符 (`'`)** | `Char`（単一の文字）を表す | `'a'` |
| **二重引用符 (`"`)** | `String`（文字のリスト `[Char]`）を表す | `"hello"` |
| **コンス (`:`) 演算子** | `Char` を `String` に追加できる | `'H' : "askell"` → `"Haskell"` |
| **`Char` と `String` の違い** | `Char` は単一の文字、`String` は `[Char]` | `'A'` と `"A"`（`['A']`）は異なる |
| **糖衣構文** | `"hello"` は `[Char]` の省略形 | `"hello" == ['h','e','l','l','o']` |

Haskell では **文字列はリストである** という点を理解すると、リスト操作をそのまま `String` に適用できるようになります。


## 関連記事
OCI 2024 Architect Associate 試験勉強メモ

# 自分用メモです

Oracle Cloud Infrastructure (OCI) の2024 Architect Associate (1Z0-1072-24-JPN) 試験に関連する用語のうち、なかなか覚えられないものをいくつかピックアップして記事にします。
アウトプットの形にすることで記憶定着を図る目的ですので、ご了承ください。

- OCI機密コンピューティング
- FSSのアクセス制御の4つのレイヤー
- サイト間VPNとVCNピアリングの違い
- インスタンス・プリンシパル

## 1. OCI機密コンピューティング

### 概要
OCI機密コンピューティングは、データの暗号化と隔離を強化する技術です。特に機密インスタンス（Confidential Instance）として提供され、仮想マシン（VM）やベアメタル・インスタンス上で動作します。この仕組みにより、データは処理中も暗号化された状態を維持し、不正アクセスや改ざんから保護されます。
データがメモリ内でも暗号化された状態で処理されることを可能にします。そのため、ハイパーバイザーやホストOSからもデータを覗き見ることはできません。

### ユースケース
機密性の高いワークロード（例: 金融データ処理）では、データの安全性を保証するために機密コンピューティングが活用されます。特に、クラウド環境におけるデータ漏洩リスクを抑えたい場合に有効です。

---

## 2. FSSのアクセス制御の4つのレイヤー

OCIのFile Storage Service（FSS）では、アクセス制御が4つのレイヤーに分かれています。これにより、異なるレベルでセキュリティを強化できます。

### ① NFS v3 UNIXセキュリティ
- ユーザーID（UID）とグループID（GID）を用いた従来のUNIX型アクセス制御。
- `chmod` や `chown` を使用して、アクセス権限を設定可能。

### ② OCI IAMポリシー
- OCIのIAMを活用し、FSSへのアクセス権限を管理。
- 例: `allow group Developers to read file-systems in tenancy` により、特定のグループに読み取り権限を付与。

### ③ NFSエクスポート・オプション
- 指定したIPアドレス範囲のホストに対し、読み取り専用（ro）または読み書き（rw）権限を付与可能。

### ④ ネットワーク・セキュリティ
- VCNのセキュリティリストやネットワークセキュリティグループ（NSG）を利用し、特定のサブネットやポート（例: TCP 2049）へのアクセスを制御。

この4層のセキュリティを組み合わせることで、セキュリティの冗長性を確保し、安全なファイルストレージ環境を実現できます。

---

## 3. サイト間VPNとVCNピアリングの違い

「サイト間VPN」と「VCNピアリング」の違いを整理します。

### サイト間VPN
- **用途**: オンプレミスネットワークとOCIを接続するために利用。
- **技術**: IPSec VPN（IKEv1/v2）。
- **パフォーマンス**: 帯域幅はインターネット経由のため、数百Mbps程度が一般的。

### VCNピアリング
- **用途**: OCI内の2つのVCNをプライベート接続するために利用。
- **技術**: OCI内部のプライベートIP通信を使用。
- **パフォーマンス**: 同一リージョン内ではGbps級の通信が可能。

### どちらを選ぶべきか？
- **オンプレミス ⇔ OCI の接続が必要** → サイト間VPN
- **OCI内のVCN同士を安全に接続** → VCNピアリング

※このほかにfastconnectもある（高速、低レイテンシ、専用線でオンプレ環境と接続）

---

## 4. インスタンス・プリンシパル

### 概要
OCIのインスタンス・プリンシパルは、コンピュート・インスタンスにIAMのアイデンティティを付与し、OCIの他のリソース（Object Storageなど）へセキュアにアクセスできる仕組みです。

### 実装方法
1. **動的グループを作成**（例: `instance-group`）
2. **IAMポリシーを設定**（例: `allow dynamic-group instance-group to read object-family in tenancy`）
3. **インスタンスから認証トークンを取得し、APIを実行**

### 利点
- **セキュリティ向上**: APIキーをインスタンスに保存せずに済む。
- **運用の効率化**: 各インスタンスのアクセス管理が簡単になる。

特に、オートスケーリング環境でのストレージアクセスに適しており、安全かつ柔軟な認証方式として活用できます。

---
#0058（2024/02/25）継承と委譲の違いについて。

# 継承と委譲の違い

継承と委譲は、オブジェクト指向プログラミングにおいてコードの再利用や責務分担を実現するための手法ですが、アプローチが異なります。  
以下に、Pythonの具体例を交えてそれぞれの概念と違いを解説します。


## 継承 (Inheritance)

**継承**は、あるクラス（サブクラス）が別のクラス（スーパークラス）の属性やメソッドを引き継ぐ仕組みです。  
これにより、共通の機能をまとめて定義でき、サブクラスは必要に応じてその振る舞いを拡張・変更（オーバーライド）できます。

### Pythonでの継承の例

```python
# スーパークラス
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        return "音が出る"

# サブクラス（継承によってAnimalの機能を引き継ぐ）
class Dog(Animal):
    def speak(self):
        return "ワンワン"

class Cat(Animal):
    def speak(self):
        return "ニャー"

# 使用例
dog = Dog("ポチ")
cat = Cat("タマ")

print(f"{dog.name}は {dog.speak()} と鳴く。")  # 出力: ポチは ワンワン と鳴く。
print(f"{cat.name}は {cat.speak()} と鳴く。")  # 出力: タマは ニャー と鳴く。
```

この例では、Dog と Cat クラスが Animal クラスを継承しているため、name の管理や共通の処理は Animal に任せ、各サブクラスは独自の speak() を実装しています。

## 委譲 (Delegation)

委譲は、オブジェクトが自分自身で直接機能を実装するのではなく、その機能を別のオブジェクトに委ねるパターンです。
これにより、クラス間の結合度を低くし、柔軟な設計を実現します。

``` python 
# 委譲先のクラス
class Engine:
    def start(self):
        return "エンジンが始動しました。"

# 委譲元のクラス
class Car:
    def __init__(self):
        # CarはEngineオブジェクトを内包している（コンポジション）
        self.engine = Engine()

    def start(self):
        # 自身でstartの実装をせず、エンジンのstart()に処理を委譲
        return self.engine.start()

# 使用例
car = Car()
print(car.start())  # 出力: エンジンが始動しました。
```

この例では、Car クラスが直接エンジンの起動処理を実装するのではなく、Engine オブジェクトに処理を任せています。
これにより、Car クラスはエンジンの詳細な実装に依存せず、柔軟に設計できます。

## まとめ
- 継承は、サブクラスがスーパークラスの属性やメソッドを受け継ぎ、必要に応じて拡張または変更する方法です。
    - 例: Dog や Cat は Animal を継承して、共通の機能を再利用しながら独自の speak() を実装。
- 委譲は、あるオブジェクトが特定の機能を別のオブジェクトに任せる設計パターンです。
    - 例: Car は Engine に start() の処理を委譲し、自身はエンジンの詳細を知らなくても動作する。

両者ともにコードの再利用や設計の柔軟性を高める手法ですが、継承はクラス間の強い結合を生むのに対し、委譲はより緩い結合を実現できるため、用途や設計思想に応じて適切に選択することが重要です。
【React】CSR・SSR・SSGの違いについて

# はじめに
`SSR`、`CSR`、`SSG`などのレンダリング手法についての認識を整理するために、本記事を作成しました。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# CSR (Client Side Rendering)
クライアントからのリクエストに対して、サーバーは空の`HTML`と`JavaScript`を返します。その後、ブラウザ上で`JavaScript`が実行され、動的に`HTML`を生成・レンダリングすることで画面が表示されます。

`CSR`の説明でよく「***`JavaScript`が`HTML`をレンダリングしている***」と言われるのは、最初に受け取る`HTML`が空の状態であり、その後`JavaScript`が実行されて画面が描画されるためです。
## メリット
+ 初回読み込み時にすべてのデータを一括取得するため、***2回目以降の動作が高速になる***
## デメリット
+ 初回読み込み時にすべてのデータを取得・処理する必要があるため、***ページが表示されるまでの時間が長くなる***
+ 空の`HTML`が返されるため、Webクローラーがページの内容を認識できず、SEOに不利

# SSR (Server Side Rendering)
クライアントからのリクエストに対して、サーバー側で`HTML`を生成し、レンダリング済みの状態で返します。

## メリット
+ サーバー側でレンダリングを行うため、***初回のページ表示が速い***
+ クライアント側で`JavaScript`を実行する必要がないため、デバイスのマシンスペックに依存しにくい
+ サーバーで`HTML`を生成するため、Web クローラーがページ内容を認識しやすく、***`SEO`に有利***
## デメリット
+ ページ遷移のたびにサーバーへリクエストを送り、`HTML`をレンダリングするため、2回目以降の動作が`CSR`より遅くなる

# SSG (Static Site Generation)
ビルド時にサーバーで`HTML`を生成し、静的ファイルとして提供します。

## メリット
+ 事前に`HTML`が生成されているため、高速なレンダリングが可能
+ `SSR`と同様にクライアントのマシンスペックに依存しない
## デメリット
+ ビルド時に`HTML`を生成するため、リアルタイムで更新されたデータをすぐに反映できない

# 終わりに
`CSR`、`SSR`、`SSG`にはそれぞれメリット・デメリットがあり、用途によって適切なレンダリング手法を選択することが重要です。今後も最新情報をキャッチアップしながら適切に活用していきたいと思います。

# 参考

『【Next.js14】CSR・SSR・SSG・ISRの違いと実装方法』Qiita

https://qiita.com/whopper1962/items/1d1a7179845b3e1d3084

『CSR,SSR,SSG,ISRについて理解する』Zen

https://zenn.dev/rh820/articles/6234843d726ed3