OmniAICreator/Qiita-1.07M huggingface dataset:
連休の谷間にサクッとまとめ読み！ 『ソフトウェア・ファースト あらゆるビジネスを一変させる最強戦略』著者 「及川卓也」さん記事まとめ

こんにちは！
エンジニアtype編集部です。

GWの中日、いかがお過ごしでしょうか。
日々の仕事やキャリアに役立つ記事をご紹介します！

今回は、『ソフトウェア・ファースト あらゆるビジネスを一変させる最強戦略』
著者「及川卓也」さんの関連記事です！

https://type.jp/et/feature/25572/

https://type.jp/et/feature/25576/

【及川さん記事一覧】

https://type.jp/et/feature/tag/oikawatakuya/
連休の谷間にサクッとまとめ読み！ 『プロダクトマネジメントのすべて』共著者 「小城 久美子」さん記事まとめ

こんにちは！
エンジニアtype編集部です。

GWの中日、いかがお過ごしでしょうか。
日々の仕事やキャリアに役立つ記事をご紹介します！

今回は、『プロダクトマネジメントのすべて』共著者
「小城 久美子」さんの関連記事です！

https://type.jp/et/feature/23593/

https://type.jp/et/feature/23086/

【小城さん記事一覧】

https://type.jp/et/feature/tag/koshirokumiko/
Meta Interaction SDKのセットアップ

# 手順
1. Unityで3Dプロジェクトを生成する
1. MetaXR All-in-One SDKの追加
1. Unityでの設定

## Unityで3Dプロジェクトを生成する
名前などいろいろ適当につけて，プロジェクトを作成する．

![3DProject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/ca32c6a1-5b09-f95e-caab-e48f006bc796.png)

## MetaXR All-in-One SDKの追加

こちらのurlからUnityアセットストアに飛び，マイアセットに追加する(Add to My Assets)をクリックして追加する．
そして，Unityで開く.

https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657?locale=ja-JP

![AssetStore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/31d2586a-e1cd-9f33-ff12-97eabaca266f.png)

## Unityでの設定
Unity.app でPackageManagerが開かれているので，以下のような画面になる．そこで，installを押す．

![PackageMana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/3441d701-d9e5-e545-a96f-e6185d2702c9.png)

PackageManager内の上部にある＋の横Packagesの選択からInProjectを選択をすると，どんなPackageが入ったかわかる．（以後この画面をProject画面と呼ぶ）

 :::note info
 エディターが再起動することがあるけど，大丈夫です．
:::


Editから，ProjectSettingを開き，MetaXRを押す．すると，Outstanding IssuesとRecommended Itemsがあるので，それぞれFix All Apply Allする.

![projectsetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/55c21432-3b0f-2b69-fe43-175fabd186c0.png)
![fix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/44405ff9-157b-8849-cd72-9e3792489b7b.png)

Androidでも行い，この綺麗な画面になったらOK．

![androidFix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/8d49d3ef-6ead-8c8a-4aec-5c91d3e35151.png)

File → Build SettingからAndroidを押し，switch Platformする．

![スクリーンショット 2024-04-30 16.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/bb919f18-ad8f-2da5-6f83-e1a0cf905a39.png)

これでセットアップは終了です！

お疲れ様でした．

## 次回  
Sceneを追加する．
Apple Silicon M3はM2シリーズとCPU命令セットは同じ

`sysctl hw`を実行するとサポートされているCPU命令セットなどが出ますが，Apple Silicon M3はM2シリーズとCPU命令セットが同じであることがわかりました．

```txt:sysctl hw 相違点(M2→M3)
hw.cpufamily: -634136515 → 1912690738
hw.cpusubfamily: 2 → 5
hw.targettype: J413 → J516c
```

```txt:sysctl hw 出力結果(M3)
hw.ncpu: 16
hw.byteorder: 1234
hw.memsize: 137438953472
hw.activecpu: 16
hw.features.allows_security_research: 0
hw.optional.arm.FEAT_FlagM: 1
hw.optional.arm.FEAT_FlagM2: 1
hw.optional.arm.FEAT_FHM: 1
hw.optional.arm.FEAT_DotProd: 1
hw.optional.arm.FEAT_SHA3: 1
hw.optional.arm.FEAT_RDM: 1
hw.optional.arm.FEAT_LSE: 1
hw.optional.arm.FEAT_SHA256: 1
hw.optional.arm.FEAT_SHA512: 1
hw.optional.arm.FEAT_SHA1: 1
hw.optional.arm.FEAT_AES: 1
hw.optional.arm.FEAT_PMULL: 1
hw.optional.arm.FEAT_SPECRES: 0
hw.optional.arm.FEAT_SB: 1
hw.optional.arm.FEAT_FRINTTS: 1
hw.optional.arm.FEAT_LRCPC: 1
hw.optional.arm.FEAT_LRCPC2: 1
hw.optional.arm.FEAT_FCMA: 1
hw.optional.arm.FEAT_JSCVT: 1
hw.optional.arm.FEAT_PAuth: 1
hw.optional.arm.FEAT_PAuth2: 1
hw.optional.arm.FEAT_FPAC: 1
hw.optional.arm.FEAT_DPB: 1
hw.optional.arm.FEAT_DPB2: 1
hw.optional.arm.FEAT_BF16: 1
hw.optional.arm.FEAT_I8MM: 1
hw.optional.arm.FEAT_ECV: 1
hw.optional.arm.FEAT_LSE2: 1
hw.optional.arm.FEAT_CSV2: 1
hw.optional.arm.FEAT_CSV3: 1
hw.optional.arm.FEAT_DIT: 1
hw.optional.arm.FEAT_FP16: 1
hw.optional.arm.FEAT_SSBS: 1
hw.optional.arm.FEAT_BTI: 1
hw.optional.arm.FP_SyncExceptions: 1
hw.optional.floatingpoint: 1
hw.optional.neon: 1
hw.optional.neon_hpfp: 1
hw.optional.neon_fp16: 1
hw.optional.armv8_1_atomics: 1
hw.optional.armv8_2_fhm: 1
hw.optional.armv8_2_sha512: 1
hw.optional.armv8_2_sha3: 1
hw.optional.armv8_3_compnum: 1
hw.optional.watchpoint: 4
hw.optional.breakpoint: 6
hw.optional.armv8_crc32: 1
hw.optional.armv8_gpi: 1
hw.optional.AdvSIMD: 1
hw.optional.AdvSIMD_HPFPCvt: 1
hw.optional.ucnormal_mem: 1
hw.optional.arm64: 1
hw.perflevel1.physicalcpu: 4
hw.perflevel1.physicalcpu_max: 4
hw.perflevel1.logicalcpu: 4
hw.perflevel1.logicalcpu_max: 4
hw.perflevel1.l1icachesize: 131072
hw.perflevel1.l1dcachesize: 65536
hw.perflevel1.l2cachesize: 4194304
hw.perflevel1.cpusperl2: 4
hw.perflevel1.name: Efficiency
hw.perflevel0.physicalcpu: 12
hw.perflevel0.physicalcpu_max: 12
hw.perflevel0.logicalcpu: 12
hw.perflevel0.logicalcpu_max: 12
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 16777216
hw.perflevel0.cpusperl2: 6
hw.perflevel0.name: Performance
hw.physicalcpu: 16
hw.physicalcpu_max: 16
hw.logicalcpu: 16
hw.logicalcpu_max: 16
hw.cputype: 16777228
hw.cpusubtype: 2
hw.cpu64bit_capable: 1
hw.cpufamily: 1912690738
hw.cpusubfamily: 5
hw.cacheconfig: 16 1 4 0 0 0 0 0 0 0
hw.cachesize: 3358556160 65536 4194304 0 0 0 0 0 0 0
hw.pagesize: 16384
hw.pagesize32: 16384
hw.cachelinesize: 128
hw.l1icachesize: 131072
hw.l1dcachesize: 65536
hw.l2cachesize: 4194304
hw.tbfrequency: 24000000
hw.memsize_usable: 136502542336
hw.packages: 1
hw.osenvironment: 
hw.ephemeral_storage: 0
hw.use_recovery_securityd: 0
hw.use_kernelmanagerd: 1
hw.serialdebugmode: 0
hw.nperflevels: 2
hw.targettype: J516c
```
cssのサイズ

# はじめに
cssのプロパティサイズをざっくり紹介

# px
pxは固定された単位
デバイスの種類によって長さが異なる

# em
親要素の相対値として定義

例
・親要素　18px
・子要素 0.5rem
つまり9pxの大きさとなる

親要素の大きさが指定されていなかった場合
ブラウザの16pxが基準値となる

# rem
font-sizeのプロパティの値を基準として相対値とし定義
根のノードでfont-sizeを設定していない場合、ブラウザのデフォルト値16pxが基準となる

emと違って、予期せぬ複合効果を避けることができる

# まとめ
pxとかemとかを使うと
親要素とか、画面時での大きさを気にしないといけなくなるため、remを使った方がいいのかも
SQL学習備忘録　SQLチートシート④SELECT文に関する修飾語３

　以下の Qiita の続きです。以前からお世話になっているProgakuという共助学習エンジニアコミニティのモブプロを通して、SQL の直書きの必要にせまられ、全然分かってなかったなと感じ、個人用に作っています。もう完全にQiitaが最近はプログラミングに関する学習のノート（※主教科書は下記の①）代わり…（Qiita 考えた人ホンマ偉いな…(･∀･)）
　以下の①の本を読み進めて、ようやくそれっぽいのがでてきたなという感じです。（※モブプロの成果物のたたき台ができたらGithubの自分のbranchをコピーしてひっつけようと思います。）

https://qiita.com/thinking-weed/items/67a2920d53a4a99c456b

___

<h3>〇主な学習参考資料・実験材料</h3>
①『スッキリわかるSQL入門　中山 清喬/飯田 理恵子 共著, 株式会社フレアリンク 監修』

<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/4295013390/ref=sr_1_4?crid=R3S0R02A45NW&dib=eyJ2IjoiMSJ9.xInwby6L9meVu-DcOzcsfGzSfA1TV5kHAI58d3yqbfFMpcMhpEpLBh7sv0MjU3gQ8Cz4yhNI5lfvqxmBbR5ERANf8Ob7iqbXgRIgkXGa1KjltvTOtjuOEQhBXmA6K6aQSFy7XZ4Y2UJkRiJ83FoDD3vxUmLTCz_4w2ckeBvzahtYwvMksPr6AgUr0vvgUNjaEwA28iHoEfC94ajVHRmEZE4vpywXnK28LzpJJGIVtiq9FHTnU8IxU6cWgjD2bfmyVYidrxQbXOB_ltcz4kbyaJ0kaJqEaWZ_yU1iRh1NOqk.2UDSmegUKoH6wU_5N866HOyVH34SBolZlXACu53ocsI&dib_tag=se&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E5%88%86%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80&qid=1714370070&sprefix=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E5%88%86%E3%81%8B%E3%82%8BSQL%2Caps%2C212&sr=8-4
</details>

②転職活動時のポートフォリオ（Laravel 10を）に付けた意見投稿フォームのCRUDに紐付けた MySQLWorkbench

<h3> ①条件を指定して取得するデータに重複するものがある場合、重複するデータをまとめて返すSELECT文</h3>

```sql
SELECT DISTINCT column_name1
           FROM table_name1
          WHERE 条件式
```

<h3> ②条件式を指定してレコード（またはデータ）を取得した後、指定したカラムを基準として（レコード単位で）昇順（小⇒大、古⇒新）に並び替えた値を返すSELECT文</h3>

```sql
  SELECT * FROM table_name1
   WHERE 条件式(column_name = 'value1' 等)
ORDER BY column_name1

/*データを取り出す場合、１行目の「*」を該当のカラム名に差し替える*/
```

<h3> ③条件式を指定してレコード（またはデータ）を取得した後、指定したカラムを基準として（レコード単位で）降順（大⇒小、新⇒古）に並び替えた値を返すSELECT文</h3>

```sql
  SELECT * FROM table_name1
   WHERE 条件式(column_name = 'value1' 等)
ORDER BY column_name1 DESC

/*データを取り出す場合、１行目の「*」を該当のカラム名に差し替える*/
```

※DBへの登録日時などのtimestampに対しても適用できる。

<h3> ④条件式を指定してレコード（またはデータ）を取得した後、指定した複数のカラムを基準として（レコード単位で）昇順または降順に並び替えた値を返すSELECT文</h3>

```sql
  SELECT * FROM table_name1
   WHERE 条件式(column_name = 'value1' 等)
ORDER BY column_name1 ASC or DESC, column_name2 ASC or DESC, … 

/*データを取り出す場合、１行目の「*」を該当のカラム名に差し替える*/
/*「ASC」は昇順であることを明示する修飾語*/
```

<h3> ⑤条件式を指定してレコード（またはデータ）を取得した後、指定したカラムを基準として（レコード単位で）昇順または降順に並び替えた後、行数を限定して値を返すSELECT文</h3>

```sql
  SELECT * FROM table_name1
   WHERE 条件式(column_name = 'value1' 等)
ORDER BY column_name1 ASC or DESC (, column_name2 ASC or DESC, …)
  OFFSET 先頭から除外する行数 ROWS
   FETCH NEXT 取得したい行数 ROWS ONLY

/*FETCH句には、取得したい行数を指定する。FETCH句を省略すると、該当するすべての行が抽出される*/
```

**MySQL、MariaDB(10.6未満)、PostgreSQL、SQLiteでは使えない……**
GoF（Gang of Four）デザインパターン

## はじめに

GoF（Gang of Four）デザインパターンは、エリック・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディースの4人の著者によって1994年に出版された「Design Patterns: Elements of Reusable Object-Oriented Software」で紹介された23のデザインパターンを指す。パターン化された設計方法、セオリーみたいなもの。

## GoFデザインパターンの分類

GoFデザインパターンは、以下の3つのカテゴリに分類される

- 生成に関するパターン（Creational Patterns）
  - [シングルトン（Singleton）](https://qiita.com/gts/items/b059d5e937ec816947f0)
  - [プロトタイプ（Prototype）](https://qiita.com/gts/items/13d90648b821e21adcf4)
  - ファクトリメソッド（Factory Method）
  - 抽象ファクトリ（Abstract Factory）
  - ビルダ（Builder）
　
- 構造に関するパターン（Structural Patterns）
  - アダプタ（Adapter）
  - ブリッジ（Bridge）
  - コンポジット（Composite）
  - デコレータ（Decorator）
  - ファサード（Facade）
  - フライウェイト（Flyweight）
  - プロキシ（Proxy）
　
- 振る舞いに関するパターン（Behavioral Patterns）
  - チェインオブレスポンシビリティ（Chain of Responsibility）
  - コマンド（Command）
  - インタプリタ（Interpreter）
  - イテレータ（Iterator）
  - メディエータ（Mediator）
  - メメント（Memento）
  - オブザーバ（Observer）
  - ステート（State）
  - ストラテジ（Strategy）
  - テンプレートメソッド（Template Method）
  - ビジター（Visitor）

## GoFデザインパターンの利点

GoFデザインパターンを適切に使用することで、以下のような利点が得られる

- コードの再利用性が向上
- コードの可読性と保守性が向上
- 開発者間のコミュニケーションの円滑化
- 設計の柔軟性が向上
- 開発時間を短縮

## GoFデザインパターンの適用

GoFデザインパターンを適用する際は、以下の点に注意が必要

- パターンを適用する前に、問題領域を十分に理解
- パターンを鵜呑みにせず、状況に応じて適切にカスタマイズ
- パターンを過剰に使用しない。シンプルな解決策が適切な場合もある
- パターンを学ぶことで、設計の原則や考え方を身につける

## まとめ

GoF（Gang of Four）デザインパターンは、オブジェクト指向プログラミングにおける再利用可能なソリューションを提供します。生成、構造、振る舞いの3つのカテゴリに分類された23のパターンは、コードの品質と保守性を向上させるための強力なツールです。適切な状況で適用することで、開発の効率化と設計の改善が期待できます。ただし、パターンを鵜呑みにせず、問題領域を十分に理解した上で、状況に応じて適切にカスタマイズすることが重要です。
実DOMをトリガにレンダリングはできる？

reactでtsファイルから実DOMをもらってきてその要素がhoverされた時、などのイベント部分をreactで書くことはできるのか？

→ 実DOMと仮想DOMでは持っているプロパティが異なるのでTypeScriptでエラーが出る。

対処として下記を試せる？

①そもそもの要素取得をuseEffect内で行なう。
②実DOMをuseStateで管理する。
③tsファイル側で実DOMをhoverした時、と言う処理まで書き、レンダリングのタイミングをtsファイルで司る。


結果はまた今度書く。今回はメモ。
集約の範囲の決め方

## はじめに
プロジェクトでモデリングをする際に集約の範囲をどうするか迷うことが多々あったので、メモ程度で記事にします。

## 結論
- 集約の範囲は基本的にルートエンティティとその他最小限の値オブジェクトのみで構成する
- 強い整合性（トランザクション整合性）を維持する必要がある場合のみ、1つの集約内に複数のエンティティを保持する
- 集約の範囲が大きくなり過ぎた場合は、結果整合性を検討する

## 調査メモ
### 集約とは
> 必ずひとまとまりで永続化する、強い整合性を持ったエンティティ/値オブジェクトの単位です。（ドメイン駆動設計 サンプルコード&FAQ p.57）

### 不変条件とは
> 不変条件とは、 データが変更される時は常に維持されなければならない一貫性のルールで、集約のメンバ間の関係も含んでいる。（実践ドメイン駆動設計 P.126）

つまり、不変条件を守るために必要なのが、集約（強い整合性を持ったエンティティ/値オブジェクトの単位）であり、集約の範囲を決めるためには不変条件の理解が必要。

> 不変条件とは、常に整合性を保っている必要のあるビジネスルールのこと。（実践ドメイン駆動設計 P.340）

整合性にはトランザクション整合性と、結果整合性があるが、不変条件について議論する際の整合性は、トランザクション整合性のことを指します。

また、トランザクション整合性は「強い整合性（strong consistency）」とも呼ばれ、結果整合性は「弱い整合性（weak consistency）」の部分集合です。

### 集約の範囲の決め方

> 集約の構造を、ルートエンティティとその他最小限の属性(そして値型のプロパティ)だけにするという意味だ。必要最小限に抑えるのが正解で、それ以外の何者でもない。
　必要な要素とは、いったいどれのことだろう? この聞いに対するシンプルな答えは、「他の要素との 整合性を保つ必要があるもの」である。ドメインエキスパートがルールとして明示するか否かにはかかわらない。」（実践ドメイン駆動設計 P.343）

> Qi4j[Oberg] を使った金融派生商品関連のプロジェクトについて、NiclasHedhmanの報告によると、彼らチームは、すべての集約の約7割を、ルートエンティティに値型のプロパティを数個持たせるだけにできた。残りの3割も、たかだか二つか三つ程度のエンティティしかなかった。（実践ドメイン駆動設計 P.343）

> 集約のサイズを抑えておくのはごく自然なことだ。整合性に関するルールが新たに見つかったら、必要に応じてエンティティやコレクションを追加する。（実践ドメイン駆動設計 P.344）

### 注意点
> そのユースケースのゴールが、複数の永続トランザクションにまたがるものなのか、それともひとつのトランザクションで完結するものなのかを考えよう。もし後者なら、そのユースケースは疑ってかかるに値する。いくらきれいに書かれていようが、そのようなユースケースが私たちのモデルの真の集約を正確に反映しているとは限らない。（実践ドメイン駆動設計 P.344）

このように複数の集約の整合性を保たなければいけない場合、不変条件を見落としている可能性が高い。この場合、ドメインモデルを見直し、2つの集約を1つにまとめることを検討する。もし結果的に集約の範囲が大きくなった場合は、アトミックな整合性ではなく、結果整合性を使用する。

## 参考資料 
https://amzn.asia/d/4V1LuDI

https://booth.pm/ja/items/3363104
@OFFSETをSQLプッシュバックさせる（Db2 LAG関数版）

SPSS Modelerで@OFFSETはSQLプッシュバックが行えない関数として代表的なものです。
以前[ナンバリングをする方法でプッシュバックを行いました](https://qiita.com/kawada2017/items/991619a452ae20298f75)。今回はDBウインドウ関数のLAGをつかってSQLプッシュバックさせる方法を考えてみます。パフォーマンスはナンバリングする方が速いと思いますが、LAGを使うと１ノードで実現できるというメリットがあります。

* テスト環境
    * Modeler 18.5
    * Db2 warehouse on cloud

* サンプルストリーム

https://github.com/hkwd/spsssample/raw/master/221115OFFSETpushback/LAG.str

* サンプルデータ

https://raw.githubusercontent.com/hkwd/spsssample/master/221115OFFSETpushback/INDIV_DAILY_SALES.csv

用意したデータは以下のように顧客ごと日付ごとに購入金額と購入点数が記録されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ba8fa530-67c0-17a4-9916-2f0734236a43.png)

ここから1回前のトランザクションの購入金額と購入点数の列を＠OFFSETで追加します。


# 1. @OFFSETでの実現

まず、＠OFFSETでの実現方法を確認しておきます。
CUSTID（顧客ID）とDATE（購入日）でソートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9d1cf733-d9f8-c994-dd6d-6d59c71e73a0.png)



「フィールド作成」ノードで同じCUSTID（顧客ID）の1回前のAMOUNT（購入額）、NUMPURCHASE（購入点数）の値を取得しています。
```
@OFFSET(@FIELD,1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/28955e89-df3c-810b-7da7-6081b178013b.png)

以下のようにひとつ前トランザクションの値を取得できます。これで前回からの購入金額の差などを計算することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0ccd58b1-ba1d-c754-7f13-3972962ed324.png)


しかし、@OFFSETがSQLプッシュバックしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c0a3b1ec-6e50-433d-6b76-adf8517a893b.png)

# 2. SQLプッシュバックの実現

「フィールド作成」ノードでデータベースウィンドウ関数の[SYSIBM.LAG](https://www.ibm.com/docs/ja/db2/11.5?topic=expressions-olap-specification#sdx-synid_lag-function)を選びます。。そしてCUSTIDでパーティション化して、DATEでソートして１つまえのLAGをとります。
```sql
SYSIBM.LAG(@FIELD,1,to_integer(undef)  ,'IGNORE NULLS',CUSTID, DATE,'ASC',undef,undef,undef)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ac881032-bd94-a4bb-1f8c-5a43cfd715e9.png)


内部的には以下のSQLがプッシュバックされています。

```sql
SELECT T0.CUSTID AS CUSTID,T0."DATE" AS "DATE",T0.AMOUNT AS AMOUNT,T0.NUMPURCHASE AS NUMPURCHASE,
SYSIBM.LAG(T0.AMOUNT,1,CAST(NULL AS BIGINT),'IGNORE NULLS') OVER( PARTITION BY T0.CUSTID ORDER BY T0."DATE" ASC) AS "AMOUNT_LAG1",
SYSIBM.LAG(T0.NUMPURCHASE,1,CAST(NULL AS BIGINT),'IGNORE NULLS') OVER( PARTITION BY T0.CUSTID ORDER BY T0."DATE" ASC) AS "NUMPURCHASE_LAG1"
FROM "INDIV_DAILY_SALES" T0
```


@OFFSETで得られた結果と同じ結果が得られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1fa78c9e-bfa7-ee23-381b-5848adee198d.png)


これならSQLプッシュバックが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f2b51729-177d-6085-36cc-915bb8d79112.png)


なお、後方の値を取得する@OFFSET(@FIELD,-1)を行うにはLEAD関数を使います。

```sql
SYSIBM.LEAD(@FIELD,1,to_integer(undef)  ,'IGNORE NULLS',CUSTID, DATE,'ASC',undef,undef,undef)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/154578ac-9d5f-55e8-75a5-cb98d33ecff4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/24df017e-ee7c-81cf-765b-90f5c226972f.png)


#### 参考：DB2 OLAP 指定 - IBM Documentation 

https://www.ibm.com/docs/ja/db2/11.5?topic=expressions-olap-specification
Singularityことはじめ

# Singularity

[Admin Guide &mdash; SingularityCE Admin Guide 4.1 documentation](https://docs.sylabs.io/guides/4.1/admin-guide/): スーパーコンピューターで使えるコンテナ。

Singularityを始めるにあたって行った作業リスト。(簡単な使いかたもいずれ書くかも)

## Ubuntu22.04へのインストール
公式のInstall from Provided RPM / Deb Packagesの箇所[Installing SingularityCE &mdash; SingularityCE Admin Guide main documentation](https://docs.sylabs.io/guides/main/admin-guide/installation.html#install-from-provided-rpm-deb-packages)を見ると、Github (https://github.com/sylabs/singularity/releases) に`*.deb`があるのでUbuntuはそこから入れられる と案内があるので、その通りに進める。(ちなみにUbuntu 24.04だと`apt install singularity`でインストールできる)

`cat /etc/lsb-relase`で
```console:出力
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"
```
で、入れるディストリビューションはUbuntu 22.04。

上記githubから`singularity-ce_4.1.2-jammy_amd64.deb`をダウンロードして
```bash
sudo apt install ./singularity-ce_4.1.2-jammy_amd64.deb 
```

この出力の最後に
```console:出力
N: Download is performed unsandboxed as root as file '/home/hogehoge/Downloads_admin/singularity-ce_4.1.2-jammy_amd64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
```
が得られたが、インストールはされている模様。
Quiztime-Writeup(Apr 30, 2024): Where is it?

## 前置き
OSINTトレーニングの一環で、X(旧Twitter)で開催されているVerif!cation Quiz Botに取り組んでいます。備忘録も兼ね、調査の過程をWriteupという形で整理してみました。

https://twitter.com/quiztime

## 課題

Q1. これはどこ？
Q2. (Bonus) いつからある？

https://twitter.com/bayer_julia/status/1785045534601859212

## Q1: 調査

例によって逆画像検索を行ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/77457019-5032-79f9-8b87-601d0468ecd7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/582095ae-08d2-f82b-d170-b669a7f2679e.png)

ここに情報がありました。
Victor Ashという方の作品のようです。
https://governance-blog.com/2020/05/the-big-jump-victor-ash/

作品名とアーティストでググってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/b1013828-b266-18a6-8737-d4f8f183f9aa.png)

ご親切に、作品の情報がまとめられています。
https://streetartcities.com/cities/berlin/markers/19144

記載された住所、 **Oderberger Straße 57, Berlin, Deutschland** をgoogle mapで検索してみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/ae5fff14-6cd1-32f3-7730-7b0b9f7501b3.png)

視点の問題でオブジェクトを確認することはできませんでしたが、周囲の建物や落書きのデザインから、この位置で間違いなさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/53c8ee45-891d-307a-e44f-f6ac6ac59c88.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/e22da09b-71f0-947c-085c-ba9f10ca1d77.png)

## Q2: 調査

作品の紹介ページに **Created on February 25, 2019**と記載がありました。
(これが出題者の意図した回答かははっきりしませんが。)

## 終わりに

他のアプローチ、または回答に誤りなどがあれば、コメント欄でご指摘いただけますと幸いです。
コードレビューを1年やってきて、知ってよかったGitコマンド集＋α

# はじめに

最近、コードレビューを実施して承認する立場に変わりました。  
開発しているときには使っていなかったコマンドやオプションを使うことで、コードレビューがスムーズになったので、記事にまとめます。

## コードレビューの仕方

私のコードレビューのやり方が特殊かもしれないので、先にコードレビューのやり方を記載します。  

コードレビューは、CodeCommitのプルリクエストを使用しています。
検索をしながら確認作業をしたいことが多いので、ローカルにチェックアウトしてきてVSCodeを使って差分を確認しています。  
コードレビュー用のワークスペースを作成しています。  

コードレビューは大きく以下の流れで進めています。（`feature`ブランチを`master`ブランチにマージするプルリクエストの場合）

0. `master`ブランチの最新を取得する
0. `feature`ブランチをスカッシュマージする
    * 競合がでないかも確認する
    * ビルドエラーや単体テストエラー（カバレッジ確認も含む）がないかも確認する
0. 差分を確認する
    * ステージングされている差分を確認していき、確認が終わったらアンステージングする
0. 確認が終わったら、差分を全て削除する

# Gitコマンド

## `git fetch --prune`

リモートリポジトリの最新の状態をローカルリポジトリに反映する際、`git fetch`コマンドを使用します。  
`--prune`オプションを付けることで、リモートリポジトリで削除されたブランチをローカルリポジトリから削除することができます。

レビューをしていて、ローカルリポジトリにチェックアウトしているブランチが多くなってきたときに使用します。  
特に、同じよう名前で作業ブランチが切られている場合は、頻繁に実施しています。

## `git branch | grep -v "$(git branch --show-current)" | xargs git branch -D`

ローカルリポジトリにチェックアウトしているブランチを削除するときに使用します。  
少し解説をします。

0. `git branch`：現在チェックアウトされているブランチ名を出力する
0. `grep -v "$(git branch --show-current)"`：`git branch --show-current`で現在のブランチ名を取得し、`grep -v`でそれ以外のブランチ名を出力する
0. `git branch -D`で出力されたブランチを強制的に削除する
    ※`-d`にすると、マージ済のブランチのみ削除できます

`git fetch --prune`の後に、流れで実施することが多いです。

## `git diff <commit A> <commit B> -- <file-path>`

指定したファイル（パス：`file-path`）の`commit A`と`commit B`間の差分のみを出力する。
ブランチだけでなく、コミット番号でも利用可能です。
`commit A`をベースに`commit B`の差分を出力するので、`+`となっているものは`commit B`で追加されたもの、`-`となっているものは`commit B`で削除されたものを表しています。

1度コードレビューしてコメントを入れたものに対して、再度コードレビューする際によく利用しています。  
`commit A`に1度目のコードレビューをしたコミット番号を指定し、`commit B`に修正後のコミット番号を指定しています。  
※`commit B`を指定しなくても同じ差分が出力されますが、後から`history`コマンドで確認することがあるので、指定するようにしています。

## `git diff <branch A> <branch B> --diff-filter=<filter>`

`branch A`と`branch B`間の差分をフィルタリングして出力します。  
`filter`に指定できるのは以下の通りです。  
小文字を指定するとフィルタリング内容を反転させれるのは便利ですね。

| `filter` | フィルタリング内容 |
| :---: | :---: |
| A | 追加されたファイルを除外 |
| a | 追加されたファイルのみを出力 |
| M | 変更されたファイルを除外 |
| m | 変更されたファイルのみを出力 |
| R | リネームされたファイルを除外 |
| r | リネームされたファイルのみを出力 |
| D | 削除されたファイルを除外 |
| d | 削除されたファイルのみを出力 |

特にビッグバン的なプルリクエストのコードレビューをするときに使用します。  
`m`を指定することが多いです。

## `git show <branch>:<file-path>`

指定したブランチ（`branch`）の指定したファイル（パス：`file-path`）の内容を出力する。

あまり使うことがないですが、他のブランチの作業内容を手動でコピーしているときに使用します。

## `rm -rf !(.git) && git pull origin`

gitコマンドではないですが、このコマンドでワークスペースをきれいにしています。
少し解説をします。

0. `rm -rf !(.git)`：`.git`ディレクトリ以外を全て削除する
0. `git pull origin`：リモートリポジトリから現在のブランチの最新を取得する

パッケージを追加するようなコードレビューをすると、ビルド後のディレクトリやファイルが残るので、そのようなファイルを削除するために使用します。  

# さいごに

皆さんが使っている「知ってよかったGitコマンド」もコメントで教えていただけると嬉しいです。
未経験でエンジニアにジョブチェンジして1ヶ月経ったので振り返りしてみた。

# はじめに
未経験ながらバックエンドエンジニアとしてジョブチェンジしてから1ヶ月経過したので、節目として学んだこと/感じたことの振り返りをしてみました。

・未経験でこれからエンジニアを目指そうとしている方
・実際に働いている同じような境遇の方
・新卒の方

上記のような方向けかつポエム的な記事なので悪しからず。

# 軽く自己紹介
文系学部卒→2021年度に営業職（カスタマーサクセス）として新卒入社
→1年目の冬頃、ひょんなことからエンジニア領域に興味を持ち始め、独学で勉強進める
→2023年6月から本格的に学習を始め、社内試験など諸々なんとか通過（ギリギリ）
→2024年4月からバックエンドエンジニアとして社内ジョブチェンジ:runner:
※ [学習記録用のTwitter(X)はこちら](https://twitter.com/hirokiii_m21)

# できたこと
- 簡単なタスクを中心に2スプリントでPR作成/マージを9個ほど着手
    - 個人のストーリーptは合計10pt
- 障害対応時に時系列まとめを担当

>（自己総評）：
まずは簡単なタスク（使用されてないプロパティを削除する/メソッドの共通化などのリファクタリングなど）を中心に手を動かしながらコードに触れることができた反面、ドメイン知識はありながらも、そもそもの各コードの処理の流れ/内容が理解できていないことを痛感。障害対応についてはやや重めの障害が発生し、技術的な観点でのバリューは出せないと割り切り、過去のポストモーテム資料を参考にリアルタイムでの時系列/対応まとめを率先して実施できた。


# できなかったこと（課題）
- コードリーディング
    - かなり抽象的ですが要は「ここのメソッドに引数で〇〇を渡していて、こういう処理が書かれていて、結果的にreturnで▲▲をどこどこに返すってことだな」というように、コードを見て処理内容をイメージすることがまだまだできていない
- ドメイン駆動設計（DDD）に基づくオニオンアーキテクチャの理解
    - 上記と類似してますが、依存性逆転の原則などの理解も含めまだイメージできてない部分が多く、各ファイルを追うだけでも精一杯

>（自己総評）：
率直に基礎的な言語理解の部分がまだまだ足りてないと痛感。もちろん一字一句全てを理解する必要はなく、経験が解決する部分もあるだろうが、現状のままだと課題解決の手札すら思いつかない状態になりそう。


# これからやること
### 基礎的な技術力の向上
>技術力が上がるとどうなるのか
    1. 適切に問題を特定できる（例：設計、アンチパターンとか）
    2. 課題に対して解決するために必要な知識、手段や手札を引き出すことができる


- まずは時間がかかっても丁寧にコードを読み解いていくのを愚直にやり続ける。
    - （書籍：「世界一流エンジニアの思考法」でも同じようなことが書かれていたはず）
- 他の人のプルリクエストも参考にしつつ、「自分ならどう書くか？」の観点でも参考にして目を通してみる

※上長との1on1時に[おすすめされた「技術力」に対するPodcast](https://podcasters.spotify.com/pod/show/em-fm/episodes/Re-33-e2hubi2)



###  エビングハウスの忘却曲線に基づく振り返り習慣
>エビングハウスの忘却曲線とは、ドイツの心理学者であるヘルマン・エビングハウスが、人間の長期記憶について研究した結果、提唱された考え方で、この研究では意味のないアルファベットを記憶させた後、どれだけ記憶を保持できているかを実験したもので、20分後には42％を忘れている（58％を記憶している）という結果が出ています。
- Notionで分からない/新出単語を日/週/月ごとに振り返りを実施して血肉にしていく
- 組織ルール/手順や単語以外のメモなども同様
    - 自分の場合は下記のようにまとめて管理し振り返りを実施してます:hugging:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757410/d1ffee78-87e5-9338-47c0-197c69e9091b.png)



# 終わりに
障害対応も発生するなどまさに怒涛の1ヶ月でしたが、心理的安全性が高いチームの中で楽しみながら業務ができるので、とても環境に恵まれていると思う反面、いち早くチームに貢献したいという想いが日々強まるので、目的意識を持ちつつ日進月歩で精進します！
※5月はリリース作業やPRレビューなどを担えるようになりたい:runner:

# 参考 / 引用
https://qiita.com/ToruIwashita/items/9c44ae22d531d5d4978c

https://podcasters.spotify.com/pod/show/em-fm/episodes/Re-33-e2hubi2

https://www.kinokuniya.co.jp/f/dsg-01-9784163917689
WPFのメモリリークをようやく発見した話

アニメーションで画像を点滅させるロジックを下記のように書いていた。
まさにこの```<Border.Style>```から```</Border.Style>```までが駄目だったようでちまちまメモリリークしてた。
```C#:C#
<Border BorderBrush="Black" CornerRadius="5" BorderThickness="1" Width="64" Height="64">
    <Border.Background>
        <ImageBrush Stretch="Fill" ImageSource="{StaticResource HogePiyo}"/>
    </Border.Background>
    <Border.Style>
        <Style>
            <Style.Triggers>
                <EventTrigger RoutedEvent="Image.Loaded">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation
                                Storyboard.TargetProperty="Opacity"
                                From="1" To="0.3" Duration="0:0:3"
                                RepeatBehavior="Forever" AutoReverse="true" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>
```

### 環境
.NET3.5
VisualStudio2015（2010、2022でもメモリリークしてた）
Cursorを使って、VSCodeの拡張機能を1日で作ったお話 

# はじめに
Webアプリ開発の風景は、ここ1年で徐々に変わりつつあります。
Java開発者たちの間で、昔ながらのEclipseから、生成AIが利用できる新しい開発環境（CursorやGitHub Copilot、CodeWhispererなど）への移行が進んでいます。
この変化がもたらす影響と新たなチャレンジについて、レポートします。

# 問題点
開発環境をCursorに切り替えてみたものの、Eclipseで日常的に使用していた機能やプラグインが使えません。
特に今回はEclipseで使っていた [Doma Tools](https://github.com/domaframework/doma-tools) というプラグインがVSCodeには無いため、手作業でSQLファイルや保管先フォルダを作成する必要があり、作業効率が低下していました。

# 解決策の試み
そこで、不便を解消するために、自分でVSCodeの拡張機能を作ってみることにしました。
VSCodeの柔軟なAPIを利用すれば、必要な機能を自分で作り出すことができるのでは？と考えました。

# AIの活用
拡張機能の開発では、CursorのAI機能を試してみたところ、信じられないほど短時間でコードが完成しました。
このAIのおかげで、簡単なプロンプトから複雑なコーディング作業を自動で作成でき、手間と時間を節約できました。
- 作成した拡張機能：[Doma SQL Jumper](https://marketplace.visualstudio.com/items?itemName=daisuke-yamanaka.domasqljumper&ssr=false#overview) 
- [package.json の修正用プロンプト](https://github.com/daisuke-yamanaka/domasqljumper/blob/master/doc/package_json_prompt.txt)
- [extension.ts の修正用プロンプト](https://github.com/daisuke-yamanaka/domasqljumper/blob/master/doc/extension_ts_prompt.txt)
- [開発作業メモ](https://github.com/daisuke-yamanaka/domasqljumper/blob/master/doc/VSCode_Extensions_make_memo.txt)

# 実装と調整
AIが生成したコードはほとんど問題なかったものの、完璧ではありませんでした。
一部の機能の調整や微調整が必要でした。
しかし、その調整（コード修正）でもAIを使って、追加のプロンプトを与えるだけでコードが出来上がりました。

# AIの利便性
Cursorのもう一つの利点は、エラーハンドリングが驚くほど簡単になることです。
開発中にエラーが出たとき、Cursorではエラーメッセージをクリックするだけで、解決策をすぐに提案してくれます。

# 結論
CursorとそのAI機能のおかげで、開発プロセスが劇的に改善しました。
この技術は、コーディングの効率を向上させるだけでなく、問題解決も速くなるため、非常に価値があります。
これからも技術の進化に目を光らせ、新しいツールを積極的に取り入れていきたいと考えています。
[WSL] Ubuntu 24.04でdocker環境を整える

# はじめに

以前、自身でUbuntu18.04の記事を書いたのですが、かなり古くなっているので記事を書き替えます。

https://qiita.com/hkusaba/items/5b44248d758214f99e97

ついでに、Ubuntu24.04を使いましょう！

# 手順

```bash:cmd
# WSLをインストールしていない場合は、インストールしてください
wsl --install

# WSLのバージョンが古い場合は、systemctlが動かない場合があるので確認してください
wsl --version
# --versionが通らない場合は、WSLのバージョンが古いので、アップデートしましょう
wsl --update

# インストール可能なWSLのディストリビューションを確認
# => 「Ubuntu-24.04」がリストにない場合は、Microsoft Storeで、「Ubuntu 20.04.6 LTS」等をインストールしてもらう必要があるかもです
wsl -l --online

wsl --install -d Ubuntu-24.04
wsl --set-default Ubuntu-24.04

```

公式を参考に、dockerを入れていきます。

https://docs.docker.com/engine/install/ubuntu/

```bash:Ubuntu24.04
# rootのパスワード設定があるので、進めましょう

# もし古いdockerを入れていた場合は、removeします
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# GPGキーを追加
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# repo追加
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# インストール
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker --version
# Docker version 26.1.0, build 9714adc
# composeプラグインを入れたので、docker composeも確認
docker compose version
# Docker Compose version v2.26.1

# enableしましょう
sudo systemctl enable docker
sudo systemctl status docker
```

## systemctl が動かない場合

- `/etc/wsl.conf` を確認してみてください。

```
[boot]
systemd=true
```

`systemd=true` が書いてあればOKです。
(Ubuntu24.04なら、デフォルトで書いてある気もする)

- WSLのバージョンが古いと、systemctl の実行時に下記のエラーが出ます。

```
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```

先述の通り、WSLをアップデートしてください。

```bash:cmd
wsl --update
```

---

以上です。
たのしいWSLライフを！
SWI-Prologのrecorded databaseについて

## 概要

SWI-Prologのマニュアルを漁っていたら[The recorded database](https://www.swi-prolog.org/pldoc/man?section=recdb)なる項目があったので調べました。

Prologの基本的な使い方は、事実の定義 → 事実に対するクエリが基本ですが、この機能を利用すると構造化されたデータ(Term)をそのまま保存して取り出せるようになるようです。

## Termについて

Termとは以下のような値のことを言う

- アトム
    - name や 'Name' のようなアトム(文字列)
- 数値
    - 整数や実数
- 変数
    - 未バインドも可能
- 複合項
    - person(1, 'name') のような複合項

Termの概要は以下の記事がわかりやすい

- https://www.az-prolog.com/manual/manuals/manual_program.html

## 使い方

### データの登録

データの登録は以下の述語で行う。
同一キーで登録した場合、上書きされるのではなく内部で保持しているTermのリストに追加される。
下記の述語はほとんど同じ動作であるが、Termリストへの追加の挙動がことなる。

- `recorda/2`, `recorda/3`
- `recordz/2`, `recordz/3`

`recorda`は内部のTermのリストの先頭に積む

```prolog
recorda(1, '1-before'),
recorda(1, '1-after'),
recorded(1, Value), % 先頭レコードの読み取り
writeln(Value)      % 1-after
```

`recordz`は内部のTermのリストの末尾に積む

```prolog
recordz(1, '1-before'),
recordz(1, '1-after'),
recorded(1, Value), % 先頭レコードの読み取り
writeln(Value)      % 1-before
```

### データの読み取り

以下の述語でデータの読み取りを行う。
内部で保持しているTermリストの先頭から値を取ってくるようである。
サンプルコードは「データの登録」の項目を参照

- `recorded/2`, `recorded/3`

### 最新キーの取得

新規にTermを登録する際に、レコードのキーをどこまで利用したかわからなくなることがある。
その場合は、以下の述語で最大キーを取得して、+1 すればよい。

- `current_key/1`

```prolog
% 最大キーの値を取得する
recorda(1, 1),
current_key(Key), % レコード内
recorded(Key, Value),
writeln(Value) % 1
```

### データの削除

登録したTermを削除したい場合は、以下の述語を呼ぶ
ただし、同一の述語の中では削除処理が完了せず、再度読み取りできてしまう点に注意

- `erase/1`

以下のように記述すると削除したはずのデータが読み取れてしまう

```prolog
recordz(1, '1-before'),
recordz(1, '1-after'),
recorded(1, Value1, Ref1),
writeln(Value1), % 1-before
erase(Ref1),
recorded(1, Value),
writeln(Value).  % 1-before
```

これを解決するには `transaction/1` を利用する

```prolog
% databaseに追加
transaction((
  recordz(2, '1-before'),
  recordz(2, '1-after'),
  recorded(2, Value1, Ref1),
  writeln(Value1) % 1-before
)),
% databaseから削除
transaction((
  recorded(2, _, Ref1),
  erase(Ref1)
)),
recorded(2, Value),
writeln(Value).  % 1-after
```

## 感想

SWI-Prologのマニュアルを漁っていたら面白い機能を見つけたのでまとめてみました。
Prologは基本的に静的な事実を定義して、それに対してクエリを発行して検索するというような感じで利用することが多いので、動的にデータを登録できる機能がデフォルトで備わっているのはいいですね。
利用するにあたって１つだけ注意しなければならないのは、「データの削除」の項目にもあるように、トランザクションを定義しておかないと、想定外の動作になることがあるという点です。
この点に注意さえすれば、簡単に構造を保存できるので、NoSQLライクに利用できるのではないかと思いました。
SQL学習備忘録　SQLチートシート③SELECT文に関する修飾語２

　以下の Qiita の続きです。以前からお世話になっている共助学習コミニティのモブプロを通して、SQL の直書きの必要にせまられ（？もしかしたら使わない？）、全然分かってないな（or忘れてるな）と感じ、個人用に作っています。もう完全にQiitaが最近はプログラミングに関する学習のノート代わり…（Qiita 考えた人ホンマ偉いな…(･∀･)）

https://qiita.com/thinking-weed/items/b3d47b72a0015a5deef9

<h3>〇主な学習参考資料・実験材料</h3>
①『スッキリわかるSQL入門　中山 清喬/飯田 理恵子 共著, 株式会社フレアリンク 監修』

<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/4295013390/ref=sr_1_4?crid=R3S0R02A45NW&dib=eyJ2IjoiMSJ9.xInwby6L9meVu-DcOzcsfGzSfA1TV5kHAI58d3yqbfFMpcMhpEpLBh7sv0MjU3gQ8Cz4yhNI5lfvqxmBbR5ERANf8Ob7iqbXgRIgkXGa1KjltvTOtjuOEQhBXmA6K6aQSFy7XZ4Y2UJkRiJ83FoDD3vxUmLTCz_4w2ckeBvzahtYwvMksPr6AgUr0vvgUNjaEwA28iHoEfC94ajVHRmEZE4vpywXnK28LzpJJGIVtiq9FHTnU8IxU6cWgjD2bfmyVYidrxQbXOB_ltcz4kbyaJ0kaJqEaWZ_yU1iRh1NOqk.2UDSmegUKoH6wU_5N866HOyVH34SBolZlXACu53ocsI&dib_tag=se&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E5%88%86%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80&qid=1714370070&sprefix=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E5%88%86%E3%81%8B%E3%82%8BSQL%2Caps%2C212&sr=8-4
</details>

②転職活動時のポートフォリオ（Laravel 10を）に付けた意見投稿フォームのCRUDに紐付けた MySQLWorkbench

<h3>①あるカラムにおいて複数の値が一致しているか一気に調べ、一致しているレコードをすべて取得するSELECT文（※論理演算的には「IN」は「or（または）」に相当する）</h3>

```sql
SELECT *
  FROM table_name1
 WHERE column_name1 IN ('value1', 'value2', …)
 /*value～がInteger型などで数値を扱う場合、シングルクォーテーションは除く*/
```

<h3>②あるカラムにおいて複数の値いずれにも一致していないレコードを調べ、それらをすべて取得するSELECT文</h3>

```sql
SELECT *
  FROM table_name1
 WHERE column_name1 IN ('value1', 'value2', …)
 /*value～がInteger型などで数値を扱う場合、シングルクォーテーションは除く*/
```

<h3>③OR演算子で結ばれた２つの条件式をともに満たすレコードをすべて取得するSELECT文</h3>

```sql
SELECT * 
  FROM tabel_name1
 WHERE ( column_name1 = 'value1'
    OR column_name1 = 'value2' )
   AND ( column_name2 = 'valueX'
    OR column_name2 = 'valueY' )
 /*value～がInteger型などで数値を扱う場合、シングルクォーテーションは除く*/    
```

**※数学における論理演算とは微妙に異なり、()がない場合だと複数の論理演算子が使われているときは「NOT　⇒　AND　⇒　OR」の優先順位に従って、条件式を満たすかどうかDBMSに評価される。そのため、③の文に従うようにするのであれば、()を付けて優先順位を引き上げて矯正する。**
[UiPath]Action Centerを待機する際に例外が発生（Windows Project）

## 背景
Document Understandingのフレームワークから主要な箇所だけ抜粋したWFを作っていたが、実行時にエラーになってしまう。
具体的には以下のアクティビティでエラーが発生
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707463/06d1c19a-ec99-9393-ae43-98deaa43008e.png)

エラーの内容は以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707463/cd117d1f-372d-21e9-f0a4-98b6176f5ec2.png)

https://forum.uipath.com/t/system-io-fileinfo-cannot-be-serialized-wait-for-form-task-and-resume/576338

グローバールでも類似の事象が発生している。
ポイントは特定のインスタンス・Windows Project・プロセスの中断

## メカニズム
UiPathでAction Centerを使って待機アクティビティーを利用する際に、プロセスが一時的に中断される。
どうやらそのタイミングで利用している変数の内容を一時的に退避させるようだ。

UiPathのWindows Legacyプロジェクトと、Windows Projectではご存じの通り、利用している.Netフレームワークの違いがる。

どうやら.Net CoreシリーズではSerializeインターフェースが実装されていないクラスがあるようで、FileInfoはそのうちの一つ
https://github.com/JamesNK/Newtonsoft.Json/issues/2208#issuecomment-549487948

## 対処法
あまりスマートではないが、退避をする時点での変数にFileinfoを含めないようにする。
以下の例だと、FileInfoのインスタンスのスコープを小さくするなど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707463/cf4f17f9-b7b9-7904-6bd3-ea40a7b8f7e5.png)

.Net側の影響をUiPathが受けているため私の所感だと根本的な対策は難しいかもしれない。
FileInfoに限らず、他にも影響するClassがあると想定している。
Docker ComposeでDjango + MySQLが動作しない問題【healthcheck】

# はじめに
最近，研究の一環でWebアプリを作ることになりました．ところが経験不足が故にかなり詰まった箇所があったので，この記事が同じようにこれから頑張ろうという方の参考になれば幸いです．


# TL; DR
- Djangoのエラー
    - `django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'mysql:3306' (111)")`
    - MySQLは正常に起動
- 対処方法
    - `healthcheck`の導入


# 環境
今回，Webアプリのために使用したフレームワークは`Django` + `Vue.js`で，DBに`MySQL`を使用しています．また，この実行のために，Docker Composeを使用しています．

```docker: failed_docker_compose
version: '3'

services:
  vuejs:
    ~~~
    depends_on:
      - mysql 
    networks:
      - app_net

  django:
    container_name: django
    build:
      context: ./django
      dockerfile: Dockerfile.django
    ports:
      - 127.0.0.1:18000:8000
    tty: true
    volumes:
      - ./django/src:/app
    command: python manage.py runserver 0.0.0.0:8000
    depends_on:
      - mysql
    networks:
      - app_net

  mysql:
    image: mysql:8.3
    ~~~
    networks:
      - app_net

networks:
  app_net:
    name: app_net
    driver: bridge
```


# 症状
今回遭遇した症状を箇条書きで示します．

- `docker compose up`を実行しても，Djangoが無事に動作する時としない時がある
    - エラーメッセージは`django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'mysql:3306' (111)")`
- 上記のエラーメッセージで検索すると以下の２点に異常があるらしい
    - DjangoのDB設定
    - MySQLの起動

DjangoのDB設定にも，MySQLの起動・設定にも異常がないことを確認したものの改善せず……


# 結論
色々と試したのですが，それらは他の記事様にお任せするとして，今回の症状への対処法は，Docker Composeの`healthcheck`を使用する，というものでした．

今回の症状は，直接的には，MySQLが立ち上がる前にDjangoが起動してしまったことが原因のようです．浅薄な理解で`depends_on`を使えば良いと考えていたために，かなり時間を取られてしまいました．
あくまで`depends_on`は「コンテナ」の起動順序を指定するのみで，コンテナ内の「プロセス」までは管理してくれないようです．

今回の環境のログファイルを確認すると以下の順序になっていました．

```mermaid
flowchart TB
    mysql_con[MySQLコンテナの起動]
    mysql_ps[MySQLコンテナ内のMySQLの起動]
    django_con[Djangoコンテナの起動]
    django_ps[Djangoコンテナ内のDjangoの起動]
    mysql_con --> django_con --> django_ps ~~~ mysql_ps
    mysql_con --> mysql_ps
```

上記の図のように，Djangoが起動してMySQLとの接続を求めたときにはMySQLが立ち上がっておらず，これが原因でした．

そこで，コンテナ内のプロセスが起動したことを確認してから次のコンテナを起動するようにしたいのですが，これを提供する機能が`healthcheck`というものです．実際に`healthcheck`を追加した`docker-compose.yml`ファイルを以下に示しておきます．

```docker: docker-compose_with_healthcheck
version: '3'

services:
  vuejs:
    ~~~
    depends_on:
      mysql: 
        condition: service_healthy
    networks:
      - app_net

  django:
    container_name: django
    build:
      context: ./django
      dockerfile: Dockerfile.django
    ports:
      - 127.0.0.1:18000:8000
    tty: true
    volumes:
      - ./django/src:/app
    command: python manage.py runserver 0.0.0.0:8000
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - app_net

  mysql:
    image: mysql:8.3
    ~~~
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 1s
      timeout: 3s
      retries: 30
    networks:
      - app_net

networks:
  app_net:
    name: app_net
    driver: bridge
```

以上のように設定を行うことで，無事に起動が確認できました．


# 最後に
調べ方が悪かったのか，あるいは，Webアプリ開発者のコミュニティの中では当たり前のことなのか，先述のエラーメッセージに対して確認すべきと指定されている項目の中に，本記事のような記述は見当たらなかったため紹介しました．
初学者の助けになれば幸いです．


# 参考

https://docs.docker.com/compose/compose-file/05-services/#healthcheck
複数のEBSボリュームをEC2にアタッチした結果、消し忘れで7ドル課金されました

### はじめに
本記事は、AWSでEBSを消し忘れて無料枠を超えてしまい、7ドルも課金されてしまった失敗談です。
EBSの消し忘れで課金させるのは、AWS初心者あるあるだと思いますが、今回はEC2に複数のEBSをアタッチしたパターンなので、記事にします。


![AWSを学ぶ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/e27f1c64-c69f-3468-34b8-2e01de28b4ce.png)


### よくある失敗
まずは、AWSのEBSの課金体系とそれにまつわる失敗について簡単に解説しておきます。EBSは、EC2のストレージです。EC2起動時にEBSをアタッチすると思いますが、EBSにも課金されます。また、EC2を停止しているとき、EC2には課金されませんが、EBSは課金対象となります（EBSは削除するまで、課金されます）
詳しくは、AWSの公式ドキュメントを参照してください。
https://repost.aws/ja/knowledge-center/ebs-volume-charges

### 私の失敗談
デフォルトのEBSをアタッチした状態で、EC2インスタンスを起動しました。さらに追加で、別のEBSをアタッチしました。この時、EC2インスタンスを削除しても、デフォルトのEBSしか自動的に削除されません。
この仕様に気がつかず、1日ほど高額なEBSを動かし続けてしまい、7ドルも課金されてしまいました。（後述しますが、EC2削除時に、きちんと警告してくれていました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/d26a4f35-7fd5-6e12-5252-19dde103cd52.png)


### 課金までの流れ

1. EC2インスタンスを起動
![スクリーンショット 2024-04-30 160236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/ef37e326-bebc-3551-79d9-138449b768f3.png)

2. EBSをデフォルトで設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/ab4ad941-e8f4-a755-0776-26fffe648fdd.png)

3. EBSがデフォルトでアタッチされている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/5bb2b922-ac6c-e9fb-f17e-32bb1663700a.png)

4. 新しくEBSを作成して、アタッチする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/eb4f983e-8a34-67c0-aa66-ab997c7fee20.png)

5. EC2に二つのEBSがアタッチされている状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/46201ae5-32c0-4341-b56b-85ac2fb2f25c.png)

6. EC2を終了しようとすると、以下のような画面が表示されます。この時、「EBSボリュームを削除」の欄に、きちんと注意文がありますね（私は見逃していました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/efd7d296-a2b8-3360-35f5-342edb9b42b2.png)


### 対策
結論として、EC2インスタンスを削除後に、別途EBSを削除すれば課金は止まります。
また、EC2を終了したときにEBSを削除するようにCLIを用いて設定することもできるようです。
【Amazon S3】ライフサイクルルールの更新タイミングには注意しよう

## きっかけ
ライフサイクルルールの動作確認をしていた際、あれれと思ったことがあったので後学のために書き残します。


## ライフサイクルルールとは
Amazon S3 がオブジェクトのグループに適用するアクションを定義するルールのセットです。具体的には、次の 2 種類のアクションがあります。
* <font color="Red">移行アクション</font>
 別のストレージクラスにオブジェクトを移行するタイミングを定義します。
>ex.作成から30 日後に S3 標準 – IA ストレージクラスにオブジェクトを移行し、作成から 1 年後に S3 Glacier Deep Archiveストレージクラスにオブジェクトをアーカイブする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/bebb60bf-b890-7058-87d8-363b24b33a97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/35c0b2b0-2c9a-771a-76b1-5dc09d2641e9.png)


* <font color="Red">失効アクション </font>
このアクションではオブジェクトの有効期限を定義します。Amazon S3 はユーザーに代わって有効期限切れのオブジェクトを削除します。
>ex.作成から5日後に、オブジェクトを有効期限切れにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/596729b9-3091-47cd-e17f-8469796b4d3c.png)

これらの日付ベースでの更新は、時間経過判定の単位は「日」で、毎日世界標準時0時(日本時間午前9時)に更新されます。

ライフサイクルルールの詳細な内容に関しては、以下を記事が非常によくまとまっていますので、参考にしてください。

https://dev.classmethod.jp/articles/3minutes-s3-versioning-lifecycle/

## よくある試験ケース
例えば、以下のライフサイクルルールを設定したS3バケットがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/a86845ea-a8d9-f155-2214-e426f0f4dff6.png)

このS3バケットの動作確認のテストケースとして、5/1(水)の14:00に以下の順番で2つのファイルをアップロードしたとします。

>■テストケース例
※先にアップロードされたデータAが非現行バージョンになる
>1\. データAを該当のS3にアップロード
>2\. データBを該当のS3にアップロード

データAの削除確認をしたい場合、いつS3バケットを確認すればよいでしょうか？
5/1(水)の5日後は5/6(月)なので、その日になればデータAが削除されていることを確認できるでしょうか？
■データAの状態遷移の考え方①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/d296f7c5-c2c7-aaaf-2264-0047e3603013.png)

答えは<font color="Red">***No***</font>です。

## 考え方
以下に筆者の考え方を示します。間違っていたらご指摘ください。

ヒントは、上記でも記載している更新タイミングです。
再掲します。

:::note info
***更新タイミングについて***
毎日世界標準時0時(日本時間午前9時)に更新
:::

この考え方にのっとれば、テストを実施した5/1(水)の14:00時点では、データAはまだ<font color="Red">非現行バージョンのライフサイクルルールによる管理外にあります。</font>5/2(木)のAM9:00の更新タイミングで非現行バージョンと認識されます。
表に直すと以下の通りになります。

■データAの状態遷移の考え方②
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/b4e51f5c-1491-77c0-37ae-61c40dab3b82.png)

では、5/7(火)にデータAが消えていることを確認できるのでしょうか。
答えは<font color="Red">***No***</font>です。

ライフサイクルルールの更新日は<font color="Red">0日目の状態</font>が存在します。（0日目状態というのは、筆者の造語です。）
なので、そのことも考慮すると以下の通りになります。

■データAの状態遷移の考え方③
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/31977454-5ad1-366c-9598-3f6b29762bfa.png)

なので、ライフサイクルルールで設定した2日後（5/8のAM9:00以降）にデータAの削除確認ができるというわけです。

## 考慮点
ライフサイクルルールの動作には以下2点注意する点があることがわかりました。
* 更新日(日本時間AM9:00)にならないと、ライフサイクルルールのサイクルが回らない
* ライフサイクルルールの更新日には、0も考慮する必要がある？（別の言い方の方が良いかも）

以上
SharePoint Online - Excel ファイルがユーザーによってロックされています



Excelファイルが更新されたらPowerAutomate を使ってListにアイテムを追加しているんですが、テーブルが無いって404エラーになりますね。　どうもロックされている感じです。


+ [The dynamic operation request to API 'sharepointonline' operation 'GetTable' failed with status code 'Unauthorized'. This may indicate invalid input parameters](https://powerusers.microsoft.com/t5/Building-Flows/The-dynamic-operation-request-to-API-sharepointonline-operation/td-p/2164179)

+ [SharePoint Online - Excel File locked by User](https://learn.microsoft.com/en-us/answers/questions/164280/sharepoint-online-excel-file-locked-by-user)

+ [Power Automate の Excel ファイルがロックされているエラーに対する 4 つの解決策](https://www.matthewdevaney.com/4-solutions-for-excel-file-is-locked-error-in-power-automate/)

+ [SharePoint Online - Excel File locked by User](https://sharepoint.stackexchange.com/questions/278407/sharepoint-online-excel-file-locked-by-user)

+ [Someone has this workbook locked](https://answers.microsoft.com/en-us/msoffice/forum/all/someone-has-this-workbook-locked/f55d335c-f61f-44f4-bca6-23592bdaf1ad)

+ [Forcing SharePoint to unlock a file](https://powerusers.microsoft.com/t5/General-Power-Automate/Forcing-SharePoint-to-unlock-a-file/td-p/2138145)

全然使い物になりませんね。
基幹システムとして使うには... 品質が低い。
【JavaScript】現在のウェブページのURLを取得する（window.location.href）

現在のウェブページのURLを取得する（window.location.href）
JavaScriptで現在のウェブページのURLを取得するには、window.location.hrefプロパティを使用します。

このプロパティは、ブラウザのアドレスバーに表示されているURLを文字列として返します。以下はその使用例です。

var currentUrl = window.location.href; 

console.log(currentUrl);
このコードをウェブページのスクリプト内に記述すると、コンソールに現在のページのURLが表示されます。


var currentUrl = window.location.href; // この行は、Webページの現在のURLを取得します。
console.log(currentUrl); // この行は、取得したURLをブラウザのコンソールに出力します。
window.location.href プロパティは、現在のページの完全なURLを返します。このコードがWebブラウザ内のJavaScript環境で実行されると、ページの完全なURLが currentUrl 変数に割り当てられます。

その後、console.log(currentUrl); は、デバッグ目的や現在のページのURLが必要な機能に役立つよう、コンソールにURLを出力します。

まとめ
JavaScriptのwindow.location.hrefは、ブラウザで開かれている現在のWebページのURLを取得したり、新しいURLにブラウザをリダイレクトさせたりするために使用されます。このプロパティからURLを取得することで、現在のページのアドレスを確認することができます。

ご参考ください。

https://eguweb.jp/javascript/72046/
【TypeScript】型ガードと型アサーションについて知ろう 【初心者向け】

# はじめに
この記事では、TypeScriptにおける「型ガード」と「型アサーション」のそれぞれの特徴と違いを備忘録として簡単にまとめました。これらはTypeScriptの型システムを理解し、安全に利用するための重要な概念です。型の不確実性を管理し、より堅牢なアプリケーションを開発しましょう。



# 型ガードとは

型ガードは、特定のスコープ内で変数の型を確定させる式や構文です。これにより、コンパイラはそのスコープ内での型の安全性を保証し、型エラーを防ぎます。型ガードは、`typeof`, `instanceof`などがあります。

### typeofを使用した例
```
typeof 変数 === 型名
```

```typescript
const inputData = (data: string | number) => {
  if (typeof data === "string") {
    return `入力された文字列は "${data}" です。`;
  } else {
    return `入力された数値は ${data} です。`;
  }
};

console.log(inputData("Hello, World"));  // "入力された文字列は "Hello, World" です。"
console.log(inputData(12345));                 // "入力された数値は 12345 です。"
```

### instanceofを使用した例
instanceofはオブジェクトが特定のクラスのインスタンスであるかどうかをチェックするのに使用されます。
以下はinstanceofを使用した型ガードの例です

```
変数名 instanceof 型名
```

```typescript
class Bird {
  fly() {
    console.log("Flying");
  }
}

class Fish {
  swim() {
    console.log("Swimming");
  }
}

const move = (animal: Bird | Fish) => {
  if (animal instanceof Bird) {
    animal.fly();
  } else {
    animal.swim();
  }
};

const myBird = new Bird();
const myFish = new Fish();
move(myBird); // Flying
move(myFish); // Swimming

```

この例では、animalがBirdのインスタンスかどうかをinstanceofでチェックしています。Birdの場合はflyメソッドを呼び出し、そうでない場合（この場合Fish）はswimメソッドを呼び出します。

### メリット
- 実行時に型チェックを行うことで、型安全性が向上する
- 不正な型の使用を早期に発見でき、バグの発生を防ぐことができる

### デメリット
- 実行時の型チェックがパフォーマンスに影響を与える可能性がある
- 型を確認するための追加コードが必要になり、冗長になる場合がある

### 用途
- APIからのレスポンスやユーザー入力など、型が不確かなデータを扱う際に有効、型の不確実性がある場合など

# 型アサーションとは

型アサーションは、開発者がコンパイラに対して「この変数はこの型だ」と明示的に指示する手法です。この機能は、主にコンパイラが推論できない型情報を補完する場面で使用されます。型アサーションには `as` キーワードやアングルブラケットの記法がありますが、`as` がより一般的です。

```
変数名 as 型名
```

### 型アサーションの使用例

```typescript
let someValue: any = "これは文字列です";
let strLength: number = (someValue as string).length;
console.log(strLength);  // 出力: 11
```

### メリット
- コンパイラが推論できない型情報を開発者が補完可能
- 必要な型情報を短いコードで指定でき、可読性が向上する

### デメリット
- 誤った型アサーションはランタイムエラーを引き起こす可能性がある
- 開発者の判断ミスが型エラーを引き起こすこと場合がある

### 用途
- 型定義がない外部ライブラリを扱う際や、動的にプロパティが追加されるオブジェクトに対して有効


# おわりに
TypeScriptを使っていると、型ガードと型アサーションのどちらを使うべきか場面に応じて選択する必要があります。基本的には型ガードを使用して、型の安全性を確保するのが一般的だと考えています。
型ガードは実行時に型チェックを行い、予期せぬエラーを防ぐことができるため、多くの場合に適しています。しかし、外部からのライブラリを利用するなどして、型情報が不完全な場合やJavaScriptからの移行期には、型アサーションが非常に役立ちます。型アサーションを用いることで、コンパイラに型情報を強制的に伝え、コードをスムーズに動作させることが可能です。最終的なアプローチとしては、基本は型ガードを使用しつつも、状況に応じて型アサーションを適切に使用することができると良いと思います。
VPSがよくわからないのでまとめてみた

# 背景

世の中には様々なサービスがあるが、VPS？レンタルサーバー？クラウド？
今までなんとなくAWS使ってたけどよくわからん。

ということで今回はVPSに注目して調べてみた。
# VPSとは？

>「VPS」は、「Virtual Private Server（バーチャルプライベートサーバー）」の略で、日本語では「仮想専用サーバー」と呼びます。具体的には、仮想化技術により1台の物理サーバー上に複数台の仮想的なサーバーを構築し、それぞれをユーザーが専有して使用できる専用サーバーとしてレンタルするサービスを指します。
1台の物理サーバーを複数人で借り受ける共用サーバー（レンタルサーバー）と、1台の物理サーバーを丸ごと借り受ける専用サーバーとのちょうど中間に位置づけられるとも言えるサービスで、双方のメリットを享受できるものとして注目されています。(*1)

# レンタルサーバーとの違い

>レンタルサーバーはCPUもメモリも共用するので自分以外の誰かが重い処理をした時に自分にも影響が出る。(*2)

つまりこういうことか

![スクリーンショット 2024-04-30 15.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775488/ce5eaa13-b1bd-4467-b8d5-bc0569f0b439.png)
# クラウドと何が違うの？

AWSやAzureとかと何が違うんだ？

>クラウドサーバーも月額料金制でサーバーを借りて運用する方式に変わりはありませんが、VPSとの大きな違いがサーバーの性能や構成を柔軟に拡張できる点です。VPSや共有サーバーでは、あらかじめ用意されたプランから選択しますが、クラウドサーバーではサーバーを運用しながら状況に応じて性能を強化したり、新しい機能を追加したりすることができます(*3)

つまりこういうことか
![スクリーンショット 2024-04-30 15.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775488/9f78eee3-b1e2-44ff-8e48-d840829812e7.png)
![スクリーンショット 2024-04-30 15.43.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775488/a5fa647c-0548-7868-764e-d129960f243b.png)

# 代表的なVPS

このサイトにまとめられていた

https://www.rbbtoday.com/media/rentalserver/vps-comparison/#Xserver

# 参考

(*1)

https://www.nttpc.co.jp/column/network/whats_vps.html#:~:text=「VPS」は、「Virtual,するサービスを指します。

(*2)

https://www.nttpc.co.jp/column/network/whats_vps.html#:~:text=「VPS」は、「Virtual,するサービスを指します。

(*3)

https://www.onamae.com/column/domain/40/