OmniAICreator/Qiita-1.07M huggingface dataset:
【Oracle】表領域とはなんなの？

表領域とは？
表領域とはテーブルが格納されるファイルのことを言います。
テーブルとはデータを格納する場所です。
つまり、表領域とはデータが格納される場所ということになります。

表領域の種類

・永続表領域
表や索引などのオブジェクトを格納するための表領域。
一般的に「表領域」と呼ぶ際、永続表領域を指し示すことが多いらしい。

・UNDO表領域
UNDOデータ（ロールバック用のデータ）を格納するための領域。
トランザクションが実行されると、UNDOデータが生成され、UNDO表領域内のセグメントに格納される。
表や索引を格納はできない。


・一時表領域
一時的なデータ（ソート処理などの作業用データ）を格納する表領域。
一時表領域は一つ以上の一時ファイルで構成される。
表やデータを格納できない。


・SYSTEM表領域（永続表領域）
データディクショナリ（DBの管理情報）を格納する領域。データベース作成時に自動作成される。
必須の表領域で、常にオンラインの状態である必要がある。（破損した場合はインスタンスが異常終了するらしい）

・SYSAUX表領域（永続表領域
SYSTEM表領域の補助の役割を持つ。データベースの管理情報を格納するための領域。
必須の表領域。

表領域のブロックサイズについて
表領域を構成するデータファイルは標準ブロックサイズと非標準ブロックサイズに分類されるみたいなので
それらの違いを下記に示す。

・標準ブロックサイズの表領域
データベースのデフォルトのブロックサイズを使用する。
デフォルトの値はデータベース作成時に指定する。
表領域作成後は変更不可。

・非標準ブロックサイズの表領域
デフォルトのブロックサイズ以外のブロックサイズを使用する表領域
初期化パラメータの DB_ｎK＿CACHE＿SIZE（ｎ=2,4,8,16,32)を設定する。
たとえば、32kバイトのブロックサイズで表領域を作成したい場合は、
DB_32K_CACHE_SIZEを設定し、32kバイトのブロックサイズ用のデータベースバッファキャッシュを構成する。
native compile 対応の Emacs を Mac へ install する

# 目的
- 掲題通り
- 以下の emacs では native compile に対応していない
    - https://emacsformacosx.com/





# native compile とは
https://ayatakesi.github.io/lispref/28.1/html/Native-Compilation.html

- elisp を gcc を用いてコンパイルし, 最適化したバイナリを生成する
- このバイナリを用いると2.5 ~ 5倍ほど高速になる
- native compile を使用するには, 
    - Emacs ビルド時に libgccjit などと共に build する必要がある
    - また, gcc ginutils などが install されている必要がある





# 環境
- m1 及び intel mac





# how to install
## dependencies
```bash
brew install gcc glib libgccjit gnutls jansson librsvg tree-sitter
```
// 環境が汚れていたので不要なものもあるかもしれない




## install
```bash
brew tap d12frosted/emacs-plus
brew install emacs-plus \
    --with-ctags \
    --with-native-comp \
    --with-poll \
    --with-imagemagick
```

// option は末尾の参考サイトからお好みで
// --with-debug は指定すると重くなる.




## copy app to Application dir
```
cp -r /usr/local/opt/emacs-plus\@29/Emacs.app /Applications/
```

// 環境によって install 先が異なる可能性があるため場所を確認されたし




# native compile の確認と実行
## emacs 起動
Application dir から通常の app と同様に起動




## native compile が有効か確認
`lisp-interaction-mode` にて以下を実行.
NATIVE_COMP が含まれていれば有効.
```
(describe-variable 'system-configuration-features)
```

```
#("system-configuration-features is a variable defined in ‘C source code’.

Its value is
\"ACL GIF GLIB GMP GNUTLS IMAGEMAGICK JPEG JSON LCMS2 LIBXML2 MODULES NATIVE_COMP NOTIFY KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM ZLIB\"
```




## native compile for elpa packages
通常は必要な package が読み込まれた際に, 非同期で compile される模様.
意図的に一括で compile する場合は以下.
directory 指定で dir再帰でまとめて compile される
```
(native-compile-async "~/.emacs.d/elpa/" t t)
```

// spec によってはだいぶ時間を要する
// 通常は, cpu の半数を使用し並列処理する模様




## compile 後
以下 dir などに eln file として保存される
```
~/.emacs.d/eln-cache/[each version dir]
```




## 補足
eln と elc は不可分な様子.


> native-compile関数により単一の関数やマクロ、あるいはLispコードのファイル全体をネイティブコンパイルできます。ファイルをネイティブコンパイルすると、それに対応するバイトコードの.elcファイルと、ネイティブコードの.elnファイルの両方が生成されます。 


# 参考サイト
- [emacs-plus github](https://github.com/d12frosted/homebrew-emacs-plus)
- [emacs-plus build option](https://github.com/d12frosted/homebrew-emacs-plus?tab=readme-ov-file#options)
- [compile function document](https://ayatakesi.github.io/lispref/28.2/html/Native_002dCompilation-Functions.html
)
- [compile varibles document](https://ayatakesi.github.io/lispref/28.2/html/Native_002dCompilation-Variables.html)
【AWS】おすすめWEBサイト3選！

## はじめに
　AWSの認定資格をいくつか取得しましたが、参考書や問題集の文字ベースでの学習がメインとなっており、ハンズオンなどの実際に動かしたりする学習ができておりませんでした。また、AWSのサービス数は200を超え、それらのサービスを組み合わせるため、認定資格を取得したとしても、現場で必要になってくる知識はさらに増えるかと思います。

本記事は、私がAWSを学習するうえでよく使っているAWS公式のおすすめサイトを紹介します。

注意点として、紹介するサイトが認定資格に直結するわけではないですが、AWSを学習するうえでサービスを調べたりなど利用できるかと思います。



## おすすめWEBサイト
### 1.サービス別の公式の動画・資料を閲覧可能なサイト
 本サイトで閲覧できるものはAWS公式のものとなっており、
 視覚的にも理解しやすい資料やAWSの方がその資料をもとに解説している動画もございます。

すべてのサービスの資料があるわけではなく、また動画がないものもありますが、定期的に更新されているため、待っていれば資料が増えてきます。

資料や動画は内容によっては閲覧するのに時間がかかるかもしれませんが、サービスの概要を知りたいだけであれば冒頭や前半部分のみを見るだけでも十分かと思います。サービスの理解を深めたい方は最後まで閲覧いただくのが良いと思います。

個人的には、文字だけだと理解できないサービスが図の閲覧や人の解説を聞くことが可能なためよく使用しています。


https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all


### 2.初心者向けハンズオンサイト
　こちらのサイトは、AWS公式の初心者向けのハンズオンが掲載されています。IAMユーザー作成から、セキュリティや監視、コンテナのサービスまで現時点で25個のハンズオンがあります。

動画でハンズオンの内容や実施方法について解説しており、わかりやすいかつ安心してハンズオンを実施できるサイトかと思います。

申し込みを行う必要がありますが、申し込み自体は無料で申し込みメール宛てにハンズオンのURLが届くので自分の好きな時間に実施できます。
 
実際にコンソール画面を動かすことで理解できることや動かさないとわからないこともあると思うので、ぜひ利用してみてください！

https://aws.amazon.com/jp/events/aws-event-resource/hands-on/


 ### 3.サービスの構成例が閲覧可能なサイト
　こちらのサイトは、代表的なクラウド構成図やユースケースごとの構成図が閲覧できます。

どのような構成でサービスが利用されているかを参考程度ですが確認しています。

ビジネスでAWSを利用する場合は必ずと言って構成図が用意されていると思うので、今のうちに構成図は見慣れていた方がいいかと思います。

 https://aws.amazon.com/jp/cdp/


 
## おわりに
　今回はAWSの学習する際に利用するサイトを紹介しました。公式のサイトのため安心感のようなものもありますし、更新もされていくのもおすすめの理由です。
【HoloLens2】【Unity】Selected Visual studio is missing required components and may be not be able to build generate project

# はじめに
Unityを用いてHoloLens2向けのアプリを作成中詰まった箇所のメモです。
記憶が曖昧なので記事も曖昧ですごめんなさい。参考程度にどうぞ。

 # エラー内容
 エラーではなく警告ですがBuild Settingsの画面で「Selected Visual Studio is missing required compnents and may not be able to build the generated project.」と出ることがあります。この状態だとビルドが通らないと思います。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077175/05f3a47c-94b7-d223-8c16-75ca5215360d.png)

# 解決策
Visual Stduio Installerを開き、「.NET デスクトップ開発」「C++ によるデスクトップ開発」「ユニバーサル Windows プラットフォーム (UWP) の開発」「Unity によるゲーム開発」にチェックが入っているか確認してください。チェックが入っていない場合まずこれが原因の可能性があります。

自分の場合、それでも警告は消えませんでした。その場合は画像で示しているインストールの詳細の部分を変更してみてください(「ユニバーサルWindowsプラットフォーム開発」に限らず)。このインストールの詳細まで正しくないと最初の警告は消えません。
[公式サイト](https://learn.microsoft.com/ja-jp/windows/mixed-reality/develop/install-the-tools)にこのインストールの詳細について記述されています。参考にしてみてください。
![memo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077175/1ebf3e33-f538-49a1-23a1-d3cffbcdb031.png)

# 備考
ちなみに「The local machine does not support running projects compiled for the ARM64 architecture. Project will be built, but will not run.」は残ったままで問題なく実機にビルドでき、動作しました。なんでやねん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077175/125e300c-8b9a-dbd6-14c4-0df700d35979.png)
読みやすいコードのガイドライン（レビューア編）

目次

- はじめに
1. レビューアの注意点1：レビュー実施時の基本原則
    
    1.1 レビュー依頼を放置しない
    
    1.2 問題のあるプルリクエストを拒否する
    
    1.3 締切を意識しすぎない
    
    1.4 「提案」以外のコメントを考慮する
    
2. レビューアの注意点2: コメントの内容
- 感想

# はじめに

「読みやすいコードのガイドライン」を読んでチームに共有したい内容をまとめた。

なお本記事は[前回](https://qiita.com/atjjnnn/items/0dccd93050986f74bc17)の続きで今回はコードレビューにおけるレビューア側が意識するべき点について記載する。

# 1. レビューアの注意点1：レビュー実施時の基本原則

- レビューによるコードの改善はレビューア・レビューイの共同作業であり、互いを尊重することが大前提
- レビューの指摘はコード・仕様・プロセスといった、レビューア・レビューイの人格とは分離されたものを対象とするべき
- レビューの重要な目的はコードベースの可読性を高く保ち、一定の生産性を維持することであり、逆にコードレビューに過剰な時間をかけることで生産効率を下げてしまっては本末転倒
- 重要な4つのポイント
    - レビューを放置しない
    - 問題のあるプルリクエストを拒否する
    - 締切を意識しすぎない
    - 「提案」以外のコメントを考慮する

## 1.1 レビューを放置しない

- レビュー依頼を受けた時、いつまでに最初の**返信**をするかという期限を、チームのルールとして決めておく
    - 例：勤務日において24時間以内に返答する
        - より優先度の高いタスクを抱えている場合は「すぐにはレビューできない」と返信する
        - 実際にはレビューできないにも関わらず、「レビューできる」と返信するのは避けるべき

## 1.2 問題のあるプルリクエストを拒否する

- プルリクエストが大きすぎる場合や基本的な設計が間違えている場合、プルリクエストが根本的な問題を抱えていることもある。そのような状況でレビューを継続すると
    - 効率的な改善ができなくなる
    - 指摘の漏れも多くなる
    - 結果として、レビューア、レビューイ双方の時間を浪費する
    - 品質の低いコードがマージされる
    
    このような事態を防ぐためにも、大きい問題のあるプルリクエストは一旦クローズしてもらい、新たに作り直してもらうことも必要。
    
- プルリクエストを作り直してもらう場合、必ずフォローすること。
    - どのように分割するか示す
    - 設計に問題がある場合はスケルトンクラスを作ってもらい、改めて構造のみを対象にレビューをする
    - 作り直しの前に設計について議論をしたり、デザインドキュメントを協力して作成する

## 1.3 締切を意識しすぎない

- 「忙しいから」や「締切が近いから」という理由で、レビューの品質を下げることは好ましくない
    - そのような特例を繰り返すことで、低品質なレビューが常態化する
    - 本当に忙しくなった時に更なる品質低下を招く
- レビューのプロセスを急ぐ必要がある場合、最低限のこととして、急がなくてはならない理由を説明する
    - 場合によっては仕様の変更などで対象できる
    - 場合によっては仕様次回のリリースに延期できる
- 「絶対に期限までにマージしなくてはならない」という先入観にとらわれない
    - レビューアが広い視野を持てるように気を付ける
- どうしてもその場しのぎのコードを使ってでもマージを急ぐべき状況では？
    - 後でどのようにコードを改善するか、大まかな方針の合意をとっておく
    - その場しのぎのコードに対するコメントとテストを残しておく
    - イシュー管理システム上で「将来のコード改善」のチケットを作成しておく

## 1.4 「提案」以外のコメントを考慮する

- 改善の提案を行う場合、具体的かつ明確な内容を書くことが好ましい
    - 曖昧なコメントを書いてしまうと、レビューイはそのコメントをどう扱えばよいかわからず、精神的に負担がかかる可能性がある
    - 明確な提案は、レビューイの取るべき行動が明確になり、レビューとコード更新の反復を減らすことができる
- ただし、具体的な提案が必ずしも最善とは限らない
    - 詳細を詰めようとするとレビューアの負担が大きくなる
    - レビューイを教育するという観点では、あえて選択の幅を残すことも有効
    - 具体的な提案のステップ
        - 問題点がないか確認を促す
        - 問題点を指摘する
        - 問題点とその再現方法や理由を提示する
        - 問題を解消するための手法をいくつか提示する
        - 問題を解消するための最適な手法を提示する
        - 問題を解消するためのコードを提案する
- 問題点の発見以前に、コードで不明な点がある場合は、レビューイに質問をする方が効率的
    - 他の開発者も同様の疑問を持つ可能性が高いため、あらかじめその点を洗い出すという意味でも有用
- 対面の議論やチャットでのやり取りも選択肢としてはあるが、その場合は議論した内容や結論を要約してレビューコメントとして残しておく

# レビューアの注意点2: コメントの内容

- レビューで指摘する点は多岐にわたる
    - 例
        - プログラミング原則、命名、コメント、状態、関数、依存関係
        - コーディングスタイル
        - テストコードや動作の確認手段
        - プルリクエストやコミットの大きさ・構造
        - タスクそのものの目的・範囲
        - コードの複雑性と達成したいことのバランス
        - バグやセキュリティ上の欠陥
        - パフォーマンスやフットプリントの変化
- これらの中で静的解析ツールによって自動的に指摘できるものは可能な限りツールに任せるべき
- 「気がつかないうちにコードベースの可読性が悪化していた」という状況を避けるために、コードレビューを行う際は変更があったコードそのものだけでなく、その周辺コードや依存関係のあるコードも確認する必要がある！

# 感想

本記事で触れた4つのポイントはどれもコードレビューにおいて基本的なことだがとても重要なことだと思った。特に、レビューイ側の立場の場合、締切間近になると焦ってミスが増えるしまともな判断ができなくなることがあるため、レビューアは常に冷静に広い視野を持つべきである。これらの考え方をチーム全員が再認識することで、コードレビューの質が今までと違うものになるはずだ。まずはチーム内に共有する場を設けようと思う。
nablarch: nablarch-example-restをdockerコンテナにする方法

## はじめに：nablarch-example-restの課題

nablarch-example-restは、nablarchフレームワークのRESTアプリケーション実装例である。

ただし、nablarch-example-restはdocker用のexampleを提供していない。
かわりに[waitt(Web Application Integration Test Tool)](https://github.com/kawasima/waitt)ツールによるexampleが提供されているが、
waittは複数アプリの結合などを行うことが難しい上にメンテナンスされていないため、tomcatバージョンも変更困難である点が難点。

このページでは、より人気が高く機能も豊富であるdockerコンテナでnablarch-example-restを動かす方法を説明する。

## 前提条件

- docker(インストール手順は[こちら](https://qiita.com/KO_YAmajun/items/41ea85d30f143b25135c)を参照)
- jdk(8または17) 
- maven(ただし、maven wrapperがある場合は不要)

# アクセス例

`target\nablarch-example-rest-5u24.war` は、手順に従って事前生成されている前提とする。
手順はhttps://github.com/nablarch/nablarch-example-restを参照。

```compose.yml
services:
  backend:
      build: .
      tty: true
      ports:
        - 8080:8080
```

```dockerfile:Dockerfile
# syntax=docker.io/docker/dockerfile:1
FROM tomcat:9.0-jre8-temurin

# ----------------ここから、tomcat managerを有効にする場合のみ使用。----------------
# tomcat managerのリソースを配置する(デフォルトでは、そもそもManagerページ自体が無い)。
# かわりに、mvコマンドを実行する手もある。
COPY --from=tomcat:9.0-jre8-temurin /usr/local/tomcat/webapps.dist/manager/ /usr/local/tomcat/webapps/manager/

# manager-guiロールを有効化する。
COPY tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml
# ローカルホスト以外からアクセスできない制限を解除する。
COPY context.xml /usr/local/tomcat/webapps/manager/META-INF/context.xml
# ----------------ここまで、tomcat managerを有効にする場合のみ使用。----------------

# h2の仕様では、相対パスのみが使用される場合現在の作業ディレクトリが開始点として使用されます。
# tomcatコンテナイメージでは、デフォルトの作業ディレクトリは/usr/local/tomcatです。
# env.properties で nablarch.db.url=jdbc:h2:./h2/db/rest_example を設定する場合、/usr/local/tomcat/h2/db/が正しい配置場所です。
COPY ./h2/db/rest_example.mv.db /usr/local/tomcat/h2/db/
# /usr/local/tomcat/webapps/配下に、任意の名前でwarを配置する。この名前が後でアクセスする際のURLパスとなる。
# 例： http://localhost:8082/manager/html
COPY ./target/nablarch-example-rest-5u25.war /usr/local/tomcat/webapps/nablarch-example-rest.war

EXPOSE 8080
```

### docker composeコマンドの実行

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

## tomcatはどういう状態になっているのか

`http://localhost:8080/manager/html`にアクセスし、tomcat管理画面を表示して確認する。

:::note
`/nablarch-example-rest`のコンテキストパスに、アプリが配置されている。
この時、APIのURLは`http://localhost:8080/nablarch-example-rest/projects`となる。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/9aa5f969-033f-0869-9633-ac304e29146c.png)

## 実際の画面表示

:::note
上手くいけば、`http://localhost:8080/nablarch-example-rest/projects`へアクセスしたときに以下のように表示される。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/75b428d9-8911-780e-e73f-c5856638b25e.png)

### オプション：tomcat管理画面を利用したい場合の詳細

このDockerfileの場合、tomcat管理画面が利用できない。
tomcat管理画面を利用したい場合は別記事を用意しているので、そちらを参照。

https://qiita.com/KO_YAmajun/items/2b7a08b2a922a8120a54
DB48Xのインストール(DM42)

# はじめに

広く知られているHP電卓の多くは伝統的にRPN方式による入力方法を採用していますが、多段スタックへの拡張、各種ソルバーの充実やCAS機能の追加、RPLをユーザーにも使用できる形で実装したHP28・48シリーズは、1980年代のリリースから30年以上経過した今でも根強い人気を誇っています。

しかし、その後のPCの台頭に加え、TIやCASIOなどによる安価で高機能な電卓が市場を席巻するようになり、HP自体による電卓事業の見直しも相まって、HP電卓は金融業界向けの機種を除いて、その殆どが世間から忘れられた存在になってしまいました。

一部では、WP-34SのようなHPのビジネス電卓の中身を強力な関数電卓に書き換えてしまうプロジェクトが続いています。また、近年においてはHP15CやHP16CのようなHP電卓のクローンを実機でリリースしているSwissMicrosから、Free42をベースとするDM42、HP32sIIをシミュレーションするDM32のような高機能モデルもリリースされており、それらはRPN方式の計算機を求めているユーザーの需要に訴求しています。

ただ、いずれもRPN方式を主眼に置いたもので、RPLを実行するためにはPCやスマホのシミュレータに頼らざるえませんでした。

このような「RPL冬の時代」が続いていた中、「DB48X」という名称のとても興味深いプロジェクトを紹介するプレゼンテーション動画が昨年夏ごろに公開されました。RPLをDM42・DM32上に実装する試みです。

ということで、バージョンアップを積み重ねるにつれて実用性を十分兼ね備え始めたDB48Xのインストール手順を、あっさり目にまとめておきます。

なお、最新情報はSwissMicrosのフォーラム

https://forum.swissmicros.com/

またはHP museumのフォーラム

https://www.hpmuseum.org/forum/

にて入手可能です。

DB48Xの使用方法やバージョンアップに伴う変更点は、開発者の方が公開されている動画

https://www.youtube.com/@christophe3d

にて確認できます。

# ダウンロード・インストール

上記掲示板に投稿されているリンクから、実行ファイルを取得します。現在の最新版、Ver 0.7.5の場合は以下のリンクになります。

https://github.com/c3d/db48x/releases/tag/v0.7.5

DM42へインストールする場合はDB48X、DM32の場合はDB50Xを選択します。今回はDB42へインストールするので"db48x-v0.7.5.tgz"をダウンロード後、解凍すると、以下のファイルがローカル上に現れます。

```
db48X.pgm
DB48X_qspi.bin
help/DB48X.md
STATE/test.48S
```

DM42と上記のファイルを保存しているPCをUSBケーブルでつなぎ、DM42を起動、セットアップメニュからUSBディスクモードにします。DM42がPCへマウントされるので、各ファイルを保存します(古いファイルは削除のこと)。

DM42のマウントを解除後、セットアップメニュにて"Reset to DMCP menu"を実行(書き込んだファイルを認識しないことがあったので)、それから"Load QSPI From FAT"を実行し、QSPIイメージをフラッシュメモリへ書き込みます。保存してある"DB48X_qspi.bin"を勝手に認識して書き込みを開始します。十数秒で終了するので、DM42を再起動します。その際、"DB48X_qspi.bin"は勝手に消去されます。

続けて、"Load Program"から"DB48X.pgm"を選択して実行、再起動します。

DB48Xの起動画面が表示されます。セットアップメニュの"About"からシステムのバージョン情報を確認できます。

# 最後に

現在入手可能な最新の実機でRPL環境を実行できることが最高です、とても素晴らしいです。HP48シリーズのROMを使ったiOS向けのエミュレータも、Meta Kernel環境を手軽に試すことが出来たりして中々いい感じなのですが、DB48Xは計算精度やその他の拡張に目を見張るものがあります。

これからの進展がとても楽しみです。
PhpModbus を使う

[PhpModbus](https://code.google.com/archive/p/phpmodbus/)

https://code.google.com/archive/p/phpmodbus/

PHPからModbusをアクセスする場合に便利なPhpModbusですが、2013年7月以後、エンハンスがされていない様子。まあ枯れた分野なので、ユーザ・サイドからしてもエンハンスしていただく必要はありません。
ただし、最終リリース版 0.8.r106 でも、そのままでは現在のPHPバージョンでは動きません。クラス ModbusMaster だけを使う限りでは、1ステップだけ修正する必要があります。他のクラスを使ったことはないので、他のクラスではどうなるのかは知りません。
1ステップだけの修正なので、エラーになっても臆せずに修正して使用してみてください。

## なにが問題なのか
最終リリース版 0.8.r106 しか使用したことがありませんが、コンストラクタ名称に起因するエラーが発生します。
PHP4までは当然であった「コンストラクタの名称はクラスの名称と同じ」は、現在のPHPでは許されません。
>[PHP 7.0.x で推奨されなくなる機能](https://www.php.net/manual/ja/migration70.deprecated.php)

PhpModbus のコンストラクタ名称は、PHP4時代の記法にもとづいているらしく「クラスの名称と同じ」なのです。エラーの原因はこれです。

## 修正
diffを見てもらえばわかると思います。
```
c:\Phpmodbus_0.8.r106\Phpmodbus>diff ModbusMaster.php.bak ModbusMaster.php
--- ModbusMaster.php.bak
+++ ModbusMaster.php
@@ -58,7 +58,8 @@
    * @param String $host An IP address of a Modbus TCP device. E.g. "192.168.1.1"
    * @param String $protocol Socket protocol (TCP, UDP)
    */
-  function ModbusMaster($host, $protocol){
+  function __construct($host, $protocol){
+  // function ModbusMaster($host, $protocol){
     $this->socket_protocol = $protocol;
     $this->host = $host;
   }
```
## ところでなぜにPHPからModbusなのか
なんでもかんでもPLCで、てのはおかしいと思いませんか？
WEBからModbusを含むFAのインタフェースをアクセスする、なんてのは、とっくの昔に常識になっていてもよいと思うんですよ。なぜなら、FAの進歩に比べれば、WEBを含むIT技術の進歩は音速級ですからね。
アプ サーバとDNSサーバー：ネットワークの基盤

この記事では、アプ サーバとDNSサーバーの役割と重要性に焦点を当て、なぜこれらが現代の情報技術において欠かせない要素であるかを解説します。
アプ サーバの役割と重要性
[Ap サーバ](https://newwave-solutions.co.jp/ap-server/)、またはアプリケーションサーバーは、クライアントからのリクエストを受け取り、それに応じてアプリケーションを実行し、結果を返す役割を担います。これは、Webアプリケーションや企業向けソフトウェアなどのアプリケーションをホストし、その実行環境を提供するものです。アプ サーバは、リクエストの処理、データベースへのアクセス、セッション管理など、アプリケーションの正常な動作を支える機能を提供し、現代の情報技術において不可欠な要素となっています。
DNSサーバーの役割と機能
[DNSサーバー](https://newwave-solutions.co.jp/dns-server/)は、Domain Name Systemの略であり、インターネット上のドメイン名とIPアドレスの対応関係を管理します。ユーザーがウェブサイトにアクセスする際、ブラウザーは最初にDNSサーバーにドメイン名を問い合わせ、対応するIPアドレスを取得します。その後、ブラウザーは取得したIPアドレスにリクエストを送信し、ウェブサイトのコンテンツを取得します。DNSサーバーは、インターネット上のリソースにアクセスするための基盤を提供し、ネットワークの正常な動作を支える重要な役割を果たしています。
アプ サーバとDNSサーバーの連携
アプ サーバとDNSサーバーは、ネットワークの基盤を構成する重要な要素です。アプ サーバがアプリケーションを実行し、ユーザーにサービスを提供する一方で、DNSサーバーはユーザーがアクセスするリソースの場所を特定し、通信を円滑に行うための基盤を提供します。両者の連携により、ユーザーはスムーズにインターネット上のリソースにアクセスでき、情報技術の進化を支える基盤となっています。
tomcat: docker環境下で管理画面にアクセスするためのDockerfileは？

## はじめに：Tomcatとは

Apache Tomcat は、Java用のWebコンテナである。
war(Web Application Archive)ファイルを用いてWebページやRESTAPIを公開することができる。

## この記事でできること

dockerのTomcatイメージはデフォルトでは管理画面を提供しないので、利用にはひと手間が必要。
この記事では、docker環境下でtomcatの管理画面の利用方法を説明する。

:::note
- docker環境下で、`http://localhost:8080/manager/html` から tomcatの管理画面にアクセスできる
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/51afaf81-5384-b9cd-ee38-905953b91df6.png)

### 前置き

このページではdockerはセットアップできている前提とする。dockerのセットアップ方法はこちら

https://qiita.com/KO_YAmajun/items/41ea85d30f143b25135c

### 結局、どうやったらできるのか

以下の通り。

```compose.yml
services:
  backend:
      build: .
      tty: true
      ports:
        - 8080:8080
```

```dockerfile:Dockerfile
# syntax=docker.io/docker/dockerfile:1
FROM tomcat:9.0-jre8-temurin

# tomcat managerのリソースを配置する(デフォルトでは、そもそもManagerページ自体が無い)。
# かわりに、mvコマンドを実行する手もある。
COPY --from=tomcat:9.0-jre8-temurin /usr/local/tomcat/webapps.dist/manager/ /usr/local/tomcat/webapps/manager/

# manager-guiロールを有効化する。
COPY tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml
# ローカルホスト以外からアクセスできない制限を解除する。
COPY context.xml /usr/local/tomcat/webapps/manager/META-INF/context.xml
```

Dockerfile内のxmlは、以下のように定義する。

この例では、管理画面にアクセスする時のユーザー/passwordは`tomcat/tomcat`である。

```tomcat-users.xml
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
  <role rolename="manager-gui"/>
  <user username="tomcat" password="tomcat" roles="manager-gui"/>
</tomcat-users>
```

```context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
  <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
                   sameSiteCookies="strict" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
```

## アクセスするには：localhost:8080/manager/html

`docker compose`でコンテナを起動する。

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

例の場合、コンテナを起動に下記URLへアクセスすると、管理画面が表示される。

```
http://localhost:8080/manager/html
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/df964c2f-38a3-a2c8-5a7c-83fdc6d1704c.png)


## 公式docs

### HTML User-friendly Interface

https://tomcat.apache.org/tomcat-8.5-doc/manager-howto.html#HTML_User-friendly_Interface

### Configuring Manager Application Access

https://tomcat.apache.org/tomcat-8.5-doc/manager-howto.html#Configuring_Manager_Application_Access

### 参考資料

https://blog.enjoyxstudy.com/entry/2016/10/30/000000
アプリプログラミングの基礎: アプリ作り方のステップバイステップ

アプリプログラミングは、現代のテクノロジーにおいて重要な役割を果たしています。多くの人々がアプリを作りたいと思っていますが、アプリの作り方に関する知識が不足している場合もあります。そこで、今回はアプリプログラミングの基本とアプリ作り方のステップバイステップを紹介します。
1. アプリプログラミングの基礎
[アプリプログラミング](https://newwave-solutions.co.jp/app-programming/)は、アプリケーションソフトウェアを開発するプロセスです。これには、プログラミング言語の知識やコーディング能力が必要です。代表的なプログラミング言語には、Java、Swift、Kotlinなどがあります。また、アプリの開発には、開発環境のセットアップやデバッグのスキルも必要です。
2. アプリの作り方  
[アプリの作り方](https://newwave-solutions.co.jp/web-development-flow/)は、以下のステップに従うことが一般的です。
ステップ 1: アイデアの構築
まずは、どんなアプリを作りたいのか、そのアプリにはどんな機能が必要なのかを考えます。ユーザーがどのような問題を抱えているのかを理解し、それに対する解決策を考えます。
ステップ 2: デザイン
次に、アプリのデザインを考えます。ユーザーが使いやすいインターフェースを作ることが重要です。ワイヤフレームやプロトタイプを作成し、デザインの方向性を決定します。
ステップ 3: コーディング
デザインが決まったら、実際にコーディングを始めます。適切なプログラミング言語やフレームワークを選択し、アプリの機能を実装していきます。この段階で、テストも行い、バグを修正します。
ステップ 4: テストとデバッグ
アプリの完成後は、テストとデバッグを行います。さまざまなデバイスやプラットフォームでテストし、問題がないか確認します。バグやエラーがあれば修正し、品質を確保します。
ステップ 5: リリースとフィードバック
最後に、アプリをリリースし、ユーザーからフィードバックを収集します。ユーザーの意見を元に改善を行い、継続的にアップデートを行います。
3.アプリ ruby
アプリプログラミングの基本とステップバイステップのガイドは素晴らしいですね。さらに、Ruby言語もアプリ開発に利用されています。[Rubyは](https://newwave-solutions.co.jp/ruby-application-development/)、シンプルで読みやすい構文を持ち、Webアプリケーションの開発に特に適しています。Railsと呼ばれるRuby on Railsフレームワークは、効率的な開発と堅牢なアプリケーション構築を可能にします。特に、プロトタイピングから本格的なアプリケーションの構築まで、RubyとRailsは多くの開発者に支持されています。これにより、アプリの開発とデプロイメントが迅速に行われ、ビジネスの成果を加速させることができます。
まとめ: Newwave Solutions Japanのサポート
アプリの作り方に関する詳細なガイドラインを提供するのは、Newwave Solutions Japanの得意とするところです。私たちの専門家チームは、お客様のニーズに合わせてカスタマイズされたアプリケーションを開発し、最新のテクノロジーとベストプラクティスを活用して、高品質なソリューションを提供します。アプリの開発からテスト、デプロイメント、そして継続的なサポートまで、全体的なサービスを提供しています。お客様のビジネスニーズに合わせた最適なアプリを開発するために、Newwave Solutions Japanをぜひご利用ください。
ソフトウェアテスト手法の比較

ソフトウェアの品質を向上させ、バグやエラーを発見するためには、効果的なテスト手法が必要です。本記事では、ソフトウェアテストの主要な手法であるブラックボックステスト、単体テスト、結合テスト、機能テスト、モンキーテスト、そしてホワイトボックステストに焦点を当て、それぞれの特徴と違いを探ります。
1. ブラックボックステストの基本原則と効果的な実施方法
[ブラックボックステスト](https://newwave-solutions.co.jp/black-box-test/)は、ソフトウェアの内部構造やコードを無視し、機能や仕様に基づいてテストを行う手法です。このテストでは、ユーザーの視点からソフトウェアを評価し、期待通りの機能性や品質を確保します。効果的なブラックボックステストの実施方法について学びましょう。
2. 単体テストと結合テストの違い：ソフトウェア開発プロセスにおける役割と重要性
[単体テスト](https://newwave-solutions.co.jp/combined-test/)は、個々のコンポーネントやモジュールを個別にテストすることで、各部分が正しく機能するかを検証します。一方、結合テストは、複数のモジュールやコンポーネントが連携して正しく動作するかを確認します。これら2つのテスト方法の違いと、ソフトウェア開発プロセスにおける役割と重要性について考察します。
3. 機能テストの重要性と成功に向けたベストプラクティス
[機能テスト](https://newwave-solutions.co.jp/functional-testing/)は、ソフトウェアの特定の機能や要件に焦点を当ててテストを行う手法です。ソフトウェアがユーザーのニーズや要求を満たしているかを確認するために欠かせないテスト手法です。機能テストの重要性と成功に向けたベストプラクティスについて考察します。
4. モンキーテストの本質と利点：ランダム性がもたらす価値と効果
[モンキーテスト](https://newwave-solutions.co.jp/monkey-test/)は、ランダムな操作やデータを使用してソフトウェアをテストする手法です。このテストにより、予期せぬバグやエラーを発見し、ソフトウェアの品質と安定性を向上させることができます。モンキーテストの本質と利点、そしてランダム性がもたらす価値と効果について考察します。
5. ホワイトボックステストの役割と適切な活用法: ソフトウェアの内部構造を理解するための手法
[ホワイトボックステスト](https://newwave-solutions.co.jp/white-box-test/)は、ソフトウェアの内部構造やコードを詳細に分析し、テストを行う手法です。このテストにより、ソフトウェアの内部の処理や仕組みを理解し、品質を向上させることができます。ホワイトボックステストの役割と適切な活用法について学びましょう。
ソフトウェア開発におけるテスト手法は多岐にわたりますが、それぞれの特徴と適用方法を理解することで、効果的なテスト戦略を構築することができます。これらのテスト手法を組み合わせて使用することで、ソフトウェアの品質と信頼性を向上させることができます。
まとめ: Newwave Solutions Japanのテストサポート
Newwave Solutions Japanは、ブラックボックステスト、単体テスト、結合テスト、機能テスト、モンキーテスト、そしてホワイトボックステストなど、さまざまなテスト手法に対応しています。専門家チームは、お客様のニーズに合わせた最適なアプローチを提供し、高品質なソフトウェアソリューションを開発します。Newwave Solutions Japanをご利用いただければ、確かなテストサポートを受けることができます。
Github Actionsで平日定期実行しているワークフローを祝日は停止するようにする

GitHub Actionsのスケジュール実行を活用して、平日に定期実行させることはありませんか？
例えば下記のように設定すると、平日13:30に実行されます。

```
on:
  schedule:
    - cron: '30 04 * * 1-5' # 平日13:30 (JST)
```

ただし、上記スケジュールの場合、祝日は考慮されていないので、祝日に動かしたくない場合は祝日前に手動でワークフローを無効化する必要があります。

連休前に手動で無効化することで、もうすぐ祝日だなーと感じられることもあり、手動で無効化することを受け入れていたのですが、さすがに面倒になってきたので、このたび祝日には実行されないstepを挟み、手動運用をなくすことにしました。

## 祝日判定step

今回作成した祝日判定stepは下記の通りです。
調べたところ、様々な言語のライブラリに祝日判定はあるようなので、好きな言語のライブラリを利用すると良いと思います。
下記ではnodeを利用しました。`actions/github-script`で手軽にnodeが実行できるので便利です。
バージョンなどは執筆時点(2024/05/06)の最新版です。

```
      - uses: actions/setup-node@v4.0.2
        with:
          node-version: 20
      - run: npm install @holiday-jp/holiday_jp
      - uses: actions/github-script@v7.0.1
        with:
          script: |
            const holidayJp = require('@holiday-jp/holiday_jp');
            const today = new Date();
            console.log(today);
            if (holidayJp.isHoliday(today)) {
              throw new Error('祝日はSKIP');
            }
```

上記コードではstep内で例外を発生させてワークフローを異常終了させています。
もし異常終了ではなく、準正常のように扱いたいのであれば、stepsコンテキストなどを活用することで後続stepをSKIPさせることができると思います。

https://docs.github.com/ja/actions/learn-github-actions/contexts#steps-context
`Remix`の`Route`ファイルの定義方法について命名規則、各ファイルの役割、定義されるルーティングの一部を理解する

# 書くこと

`Remix`は命名規則に乗っ取る事で柔軟に`Route`定義できますが、その分複雑なのでキャッチアップが難しく感じる場面もあります。
この記事では以下のポイントに絞り解説する事で、命名規則、各ファイルの役割、定義されるルーティングの一部を理解していきます。

1. `.`で連結する事でネストするURLを表現する
1. パスパラメーターの指定は`$`フレフィックスで定義する
1. `{リソース名}.tsx`と`{リソース名}._index.tsx`を両方配置することによりレイアウトファイルとリソースの`Route`ファイルを分離することができる
1. `Routes`の命名規則に従でフォルダを作成し配下に`route.tsx`または`index.tsx`を持つことで`Route`定義をフォルダで行うことができる

## 1. `.`で連結する事でネストするURLを表現する

URL`/pets/family`にマッチさせる`Route`を定義する場合は`app/routes/pets.family.tsx`というファイルを作成します

```text
app/routes/
└── pets.family.tsx
```

https://remix.run/docs/en/main/file-conventions/routes#dot-delimiters

## 2. パスパラメーターの指定は`$`フレフィックスで定義する

URL`/pets/123`にマッチさせる`Route`を定義する場合は`app/routes/pets.$id.tsx`というファイルを作成します

```text
app/routes/
└── pets.$id.tsx
```

https://remix.run/docs/en/main/file-conventions/routes#dynamic-segments

## 3. `{リソース名}.tsx`と`{リソース名}._index.tsx`を両方配置することによりレイアウトファイルとリソースの`Route`ファイルを分離することができる

```text
 app/
├── routes/
│   ├── pets._index.tsx
│   ├── pets.$id.tsx
│   └── pets.tsx
└── root.tsx
```

上記のファイル構成の場合はルーティングは次のようになります。

- URL `/pets`にアクセスすると`pets._index.tsx`が描画される
- URL `/pets/123`にアクセスすると`pets.$id.tsx`が描画される
- `pets.tsx`は`pets._index.tsx`と`pets.$id.tsx`両方のレイアウトファイルになる

:::note info
`pets.tsx`が存在しない場合は`pets._index.tsx`と`pets.$id.tsx`にはルートのレイアウトファイルである`root.tsx`が適応されます
:::

https://remix.run/docs/en/main/file-conventions/routes#nested-routes

## 4. `Routes`の命名規則に従でフォルダを作成し配下に`route.tsx`または`index.tsx`を持つことで`Route`定義をフォルダで行うことができる

以下のように`pets.$id`と`pets._index2つのディレクトリを作成し、それぞれのディレクトリの配下に`index.tsx`を配置することで、ディレクトリの名称で`Route`定義が可能です。

:::note info
これにより、`pets._index`ディレクトリの中でのみ使用する`pet-create-form.tsx`を`index.tsx`と同じディレクトリに配置し管理するコンポーネントのコロケーションを実現します。
:::

```text
app/routes/
├── pets.$id
│   ├── index.tsx
│   └── pet.tsx
├── pets._index
│   ├── index.tsx
│   ├── pet-create-form.tsx
│   └── pets-table.tsx
└── pets.tsx
```


https://remix.run/docs/en/main/file-conventions/routes#folders-for-organization

:::note info
**`Routes`をディレクトリで管理する方法は、リファレンスの`Scaling`セクションでも推奨されています**
:::

https://remix.run/docs/en/main/file-conventions/routes#scaling

# まとめ

これらを踏まえると、以下のファイル構成を例にそれぞれのファイルの役割が把握できると思います。

```text
app/routes/
├── pets.$id                // `/pets/123`にマッチ
│   ├── index.tsx           // `/pets/123`の`route`ファイル
│   └── pet.tsx             // `index.tsx`から使用されるコンポーネント
├── pets._index             // `/pets`にマッチ
│   ├── index.tsx           // `/pets`の`route`ファイル
│   ├── pet-create-form.tsx // `index.tsx`から使用されるコンポーネント
│   └── pets-table.tsx      // `index.tsx`から使用されるコンポーネント
└── pets.tsx                // `pets.$id`と`pets._index`のレイアウトファイル
```

# リファレンス

他にも命名規則によるルーティングの定義方法がたくさんあります

https://remix.run/docs/en/main/file-conventions/routes

# バージョン

```bash
remix -v
2.9.1
```
DatabricksノートブックにおけるAIサポート

先日こちらに触れました。

https://qiita.com/taka_yayoi/items/a529500dfca2660cb0c0

が、それ以上にAIサポート機能が増えてきています。

# ノートブックタイトルの自動生成

ノートブックタイトルを編集状態にするとタイトルの右に星マークが表示されます。
![Screenshot 2024-05-06 at 12.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1925ef1b-9160-4e48-5bdc-92ac5ce22be9.png)

こちらをクリックすると、ノートブックの内容に適したノートブックのタイトルを生成します。

:::note warn
**注意！**
ノートブックがジョブなどに指定されている場合、ノートブック名をむやみに変更してしまうとジョブの実行に失敗します。この機能は、仮の名称でノートブックを作成してロジックを固めた後に使用することをお勧めします。ジョブなどで使用されているノートブックでは使用しないようにしてください。
:::


<iframe width="560" height="315" src="https://www.youtube.com/embed/CEToeUzXJ-M?si=K4PcTg02pUSAY5aY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# ノートブックセルのタイトルの自動生成

こちらは、セルのタイトルの自動生成です。セルのタイトルを編集状態にすると、上と同じように星マークが表示されるので、これをクリックすることでセルの内容に応じたタイトルが生成されます。
![Screenshot 2024-05-06 at 12.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6f7731b7-384d-b7fa-5c5d-076ef512abec.png)

<iframe width="560" height="315" src="https://www.youtube.com/embed/slhfkSae1pQ?si=Yf_0jCB0jwSrhpcr" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

(設定言語で生成して欲しいところではありますが)ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
JSPの基礎 #1

今回客先でSpringとJSPを使用した開発を担当することになったため、JSPの基礎について自分用の備忘録をまとめる。

学習のため参考にしたページは下記（読んだ順を昇順に記載）

基本的には下記ページで学習し、
このページのメモは、下記ページで学習の際に記載されていなかったことや、追加で調べたことを記載し、まとめる
#### 参考ページ
[JSPって何？〜JSPの基礎を知ろう!!〜](https://qiita.com/Yuriko-Y/items/06a16dde3d85ec83342b)	
[Spring BootでThymeleafとJSPを併用する](https://qiita.com/KoSunOQ/items/754ebdab15f7a308edf0)
[Servlet&JSPコンテナとしてのTomcat,Spring MVC,Springbootの関係。](https://qiita.com/naiveprince0507/items/a35193d5bd219846367d)
[【Java】Spring BootでThymeleafとJSPを共存させる方法](https://qiita.com/yaju/items/9306784cbf1dfb16f26b)
[[Spring] JSPの実装 (簡易まとめ)](https://qiita.com/omiso/items/a14d506fd9de9f159aa1)

### JSPファイルの設定
1.ディレクティブとは
ディレクティブとはコンテナに対して、JSPページをどのように処理するか指示をするものです。
書き方
```
<%@ (ディレクティブ名) ... %>
```
以下でも可
```
<jsp:directive.(ディレクティブ名) ... />
```
種類が多いので以降はURL先を参照
#### pageディレクティブ
なお下記pageタグはJSPファイル生成時に自動で挿入される
```
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
```
https://www.techscore.com/tech/Java/JavaEE/JSP/4/#jsp4-2
#### taglibディレクティブ
```
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
```
https://www.techscore.com/tech/Java/JavaEE/JSP/4-2/
#### includeディレクティブ
https://www.techscore.com/tech/Java/JavaEE/JSP/4-2/#jsp4-4

実際の記載方法は別途まとめる
【備忘】回復パーティションを削除してドライブCを拡張する

### 0.はじめに
業務で扱っている仮想環境の構築段階で詰まった、回復パーティションがある影響でドライブCが拡張できない問題について調べたので備忘録として残しておく。

### 1.回復パーティションについて
回復パーティションは簡単にいえばリカバリー領域のこと。
パソコンを出荷時の状態に戻すことができる。
削除してしまっても動作には問題はない。

### 2.回復パーティションの削除方法
以下の手順を行うことで回復パーティションを削除することができる。

- ディスクの管理を開く
回復パーティションがどの領域にあるのかを調べるためにディスクの管理を開いて、回復パーティションの位置を確認する必要がある。
![Qiita回復パーティション１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775039/99156e61-99ea-30bc-3dcf-6ce7714e849e.png)
今回の例では **ディスク0**に回復パーティションがあることがわかる。


- コマンドプロンプトを用いて回復パーティションを削除
コマンドを用い回復パーティションを削除していく。
以下手順で回復パーティションを削除する。
１．コマンドプロンプトを管理者で起動する。

２． コマンドプロンプトで```select disk 0```と打ち込む。
　　 "0"は回復パーティションが存在するディスクを選択する。 
   
３．コマンドプロンプトで``` list partition```と打ち込む。
　　表示されたリストのType欄が**回復**となっているものが回復パーティションになる。
  ![Qiita回復パーティション2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775039/1f81efec-86c7-1b73-4497-02fd04cab8c4.png)
今回の例でいえば**Partition 4**が回復パーティションとなる。

４．コマンドプロンプトで```select partition 4```と打ち込む。

５．コマンドプロンプトで```delete partition override```と打ち込む。
コマンドプロンプトに**「DiskPart は選択されたパーティションを正常に削除しました。」**と表示されれば削除成功。

６．もう一度コマンドプロンプトで``` list partition```と打ち込む。
　　回復パーティションが表示されないことを確認する。

  以上の手順で回復パーティションを削除することができる。

  ### 3.まとめ
  無事回復パーティションを削除してドライブCを拡張することができた。
  回復パーティション自体はバックアップがとれていれば消してしまっても問題はないが、そうでなければ回復パーティションを再構築することもできるので合わせて覚えておいてもいいだろう。

### 4.参考
- [Windows10のCドライブを拡張するために回復パーティションを再作成する](https://zokibayashi.hatenablog.com/entry/2022/02/13/231335)
- [Windows 10回復パーティションを総合的な理解](https://www.partitionwizard.jp/partitionmagic/windows-10-recovery-partition.html)
PowerShellでssh_configを取り扱えるManageSshConfig.psm1について

PowerShellでssh_configを取り扱うPowerShellモジュールを見かけたのでこちらを使ってみます。

## ドキュメント

- [Manage SSH config entries with a PowerShell module](https://community.ops.io/kaiwalter/manage-ssh-config-entries-with-a-powershell-module-40ia)
- [gist - KaiWalter/ManageSshConfig.psm1](https://gist.github.com/KaiWalter/b5dc222b1ff67f618b9ff076ca3d6a21)

## 試している環境

- Windows 11 23H2
- PowerShell 7.5.0-preview.2

## インストール

- [gist - KaiWalter/ManageSshConfig.psm1](https://gist.github.com/KaiWalter/b5dc222b1ff67f618b9ff076ca3d6a21)

gist上にManageSshConfig.psm1が置いてあるので、こちらをローカルにコピーして`Import-Module .\ManageSshConfig.psm1`で読み込み

```powershell
# カレントディレクトリにクローン
git clone https://gist.github.com/b5dc222b1ff67f618b9ff076ca3d6a21.git ./ManageSshConfig

# インポート
Import-Module .\ManageSshConfig\ManageSshConfig.psm1

# インポートしたコマンドを確認
Get-Command -Module ManageSshConfig
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a286f481-f00e-c62c-9e83-b1842e5b0019.png)


上記のコマンドを実行すると、下記のコマンドレットが読み込まれました。

Name
----
Add-ConfigHostToList
Get-ConfigHostFromList
Get-ConfigHostList
Remove-ConfigHostFromList
Set-ConfigHostList
Update-ConfigHostInList

## 各コマンドレットを実行してみる

サンプルだと`Add-ConfigHostInList`と記載されていますが、読み込まれるコマンド名は`Add-ConfigHostToList`となっているため読み替えて実行します。

なお、記事中にも記載がありますがssh_configを編集してしまうため、実行前にバックアップを取得してから実行してください。

## 設定を取得する（Get-ConfigHostList）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/b49f5ae7-9368-80e6-1562-47412239b0ac.png)

Get-ConfigHostListでssh_configを読み込んでオブジェクトとして返してくれました。

## 設定を更新する（Add-ConfigHostToList　と　Set-ConfigHostList）

```powershell
# 元の設定を変数 $hostList に取得
$hostList = Get-ConfigHostList

# 変数HostListを変数
$hostList = Add-ConfigHostToList -HostList $hostList -HostName "dummy" -HostValues @{
    identityfile = "~/.ssh/myprivatekey"
    hostname     = "dummy.somecloud.com"
    user         = "johndoe"
}

# 変数HostListの内容で設定ファイルssh_configを更新
Set-ConfigHostList $hostList
```

上記コマンド実行でssh_configに下記画像のように指定した情報が登録された事を確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/43a6dbc0-321b-9e66-3b52-8b0969f48859.png)

## 総評

以前、PowerShellプロンプト上でssh_configの設定を読み込んで入力補完する記事を書き、その中でssh_configのHostとHostnameとUserを取得してツールチップに出力するといった機能を作成しました。

[PowerShellでsshコマンドにssh_configの内容で入力補完できるようにする](https://qiita.com/SAITO_Keita/items/3f9fa4cfb873d6795779)

自分の方の実装だけでなく、他の人がPowerShellでssh_configをパースする実装例をみるとそうやるんだと学びがあります。
シンボリックリンクに悩まされた

Laravelで画像を表示させるところで詰まったのでシンボリックリンクの学習も兼ねて忘備録

と

シンボリックリンクにハマる人は多いみたいでたくさんの方が記事をあげてくれていて、本当にありがたい。
その足しにでもなれば。





Laravelでは画像を表示させる際に必要なシンボリックリンクというものがある。
[【Laravel】画像を保存して表示する方法](https://inouelog.com/laravel-image-display/)<br></br>
[【Laravel】"storage/app/public"に配置した画像へアクセスしてみる](https://tektektech.com/laravel-storage-app-public/#google_vignette)

<br></br>
# シンボリックリンクとは
>オペレーティングシステム（OS）のファイルシステムの機能の一つで、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組み。
[シンボリックリンク 【symbolic link】 ](https://e-words.jp/w/%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF.html#:~:text=%E6%A6%82%E8%A6%81,%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%80%82)

![シンボリックリンク.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/0eb6ffbc-3c93-b0bb-185a-f6e399a4c939.jpeg)
本体まで行かなくても必要なものを中継を使って呼び出せる
&emsp;&emsp;→「ショートカット」と呼ばれる

PCのデスクトップに貼ってあるアイコンも同じ

# 本題
シンボリックリンク作成問題なく出来たにも関わらず、画像の表示が出来なかった。
ブラウザのコンソール確認するも404 (Not Found)


```php:index.blade.php
1.storage/app/public/imagesに格納した画像
<img src="{{ asset('storage/images/cat.png') }}" />

2.public/imagesに格納した画像
<img src="{{ asset('images/cat.png') }}" />
```

# 試してみたこと
-__シンボリックリンクやり直し__
```
unlink storage
```
```
php artisan storage:link
```
<br></br>
-__記事を参考に行う__
記事の手順確認後、storageパスが赤色で表示されていたので
```php artisan storage:link```行った
[シンボリックリンクをしたけど、画像が表示されなくて詰まったところ](https://zenn.dev/tamae/articles/574cb557cd3369)  
<br></br>
-__権限__
```
プロジェクトファイル名/public/storage$ ls -l
```
```drwx----- 2```となっていたので
```
chmod 755 images
```
上記コマンドで権限付与
(imagesの部分は画像保存先ファイル名)
<br></br>
<br></br>


-__Docker関連__
>Dockerコンテナを使用している時は/var/www/htmlがルートディレクトリになる。

コンテナ内に入って今の状態を確認してみると、
```storage -> /home/missy/TEST/personal/storage/app/public```
これを /var/www/html に変更。
```
rm storage
ln -nfs /var/www/html/storage/app/public storage
```
```
ls -ls
storage -> /var/www/html/storage/app/public
```


# 解決
いろいろ試してみたが自分では解決に至らず、先輩エンジニアに相談し下記手順で画像表示ができたとのことで自分でも試した結果解決

```
sail up -d
sail artisan storage:link
sail down
sail up -d
```
画面確認をしたところきちんと表示できていた。
何故か2は404 (Not Found)

# 原因
恐らく、
```
storage -> /var/www/html/storage/app/public
```
赤で表示されている上記の状態で
```php artisan storage:link```を行うと
青色に変わり、storage先も変わってしまった。
```
 storage -> /home/missy/TEST/personal/storage/app/public
```
赤だと問題ありという誤認識:frowning2:
これ色つけれないと分かりづらい....
# 課題
-エラーが出た際の対処の仕方。
-index.blde.phpの2のコードのエラー解決

# 最後に
最後まで読んでいただきありがとうございます。
間違っている点あればご指摘お願いします。
【ChatGPT＋DALL-E3】は風呂敷が苦手w　PromptShare


　どうも、カーブミラーです。

　今回は、風呂敷でものを包もうと思います。タイトルどおり、DALL-E3は、風呂敷包みが苦手ですw

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　ニュース、ねぇですw

　ということで、本題に入ります。

　タイトルに書いたとおり、
　　DALL-E3に風呂敷包みをさせると
　　　包めはしますが、
　　　　ちょっと変。
![Furoshiki_Wrapped_Cube.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/23168183-025c-e09d-2acf-03015035c3c8.jpeg)

　包んだあとに
　　帯を十字に掛けてきます。
　　　どう足掻いても同じでした。

　なので
　　諦めていたわけですが
　　　このたび、見事解決しました😭

　いやぁ、
　　風呂敷、
　　　使いたかったんですよぉ。

　だって、
　　よく使うキャラが
　　　和服姿の女性なんで。

　和服に
　　紙袋とか
　　　ラッピングされた贈り物とか
　　　　似合わないですからね。

　それよりも
　　風呂敷包みを
　　　抱え持つ方が
　　　　色艶が良いわけです。

　さて、
　　どうやって解決したのか
　　　というと、とても簡単でした。

　“風呂敷”を
　　“正方形の布”と表現したのです。

　“えっ？　それだけ？”
　　と思われることでしょう。

　本当にそれだけなんです。

　ChatGPT（GPT-4）に
　　“風呂敷”について尋ねると
>風呂敷（ふろしき）は、日本の伝統的な布製の包み物で、様々な形の品物を包んだり、運んだりするのに使われます。正方形の布で、素材は綿、絹、合成繊維など様々です。色や柄も豊富で、美しいデザインのものが多く、日常的な使用の他、特別な贈り物を包む際にも使用されます。
>
>風呂敷の使い方は非常に多様で、包む物の大きさや形に応じて、畳み方を変えることができます。また、ハンドルを作って持ち運びやすくする工夫もされています。使用後は畳んで再利用できるため、環境に優しい選択肢としても注目されています。
>
>風呂敷は日本の生活文化に根ざしており、その実用性と美しさから、現代でも親しまれている伝統的なアイテムの一つです。

　確かに、
　　“風呂敷”は、“正方形の布”です。

　しかし、
　　“風呂敷”は、
　　　“日本の伝統的なアイテム”と
　　　　DALL-E3に解釈されてしまう、
　　　　　と考えられます。
　　　　　　そのため、おかしくなる。

　みなさんも
　　ご存知のとおり、
　　　日本の物品を
　　　　DALL-E3に依頼すると
　　　　　似て非なるものが
　　　　　　出てきます。

　サムライは鎧武者になり
　　十二単衣は花魁的な感じになり
　　　日本刀は鍔がふたつあったり。

　日本のものは、DALL-E3に
　　正しく理解されていないわけです。

　だから
　　“風呂敷”も
　　　日本のものとして認識されて
　　　　変に描画されてしまう。

　そこで、
　　西洋でもある（似た）ものを
　　　指定すればいいわけです。

　それで
　　“正方形の布”としたのです。
***
　解決編が
　　終わったところで
　　　PromptShareに
　　　　まいりましょう。

```Text:風呂敷包みPrompt
[OBJECT: 包む物体]
[PATTERN: 布の柄]
[COLORS: 柄の色]

A [OBJECT] wrapped in a square cloth with a [PATTERN] print, tied at the top. The fabric is draped over the [OBJECT], with its edges neatly folded and gathered at the top, where it is tied in a knot. The fabric features a vibrant array of [COLORS] against a light background. The setting is a simple tabletop, highlighting the elegantly wrapped [OBJECT] with the beautifully patterned cloth.
```

　最初の三行が
　　変数となります。

　[OBJECT: 包む物体]
　[PATTERN: 布の柄]
　[COLORS: 柄の色]

　この日本語になっている部分を
　　変えて楽しんでください。

　ただし、
　　箱型はうまく
　　　できたりできなかったりで
　　　　安定しません。
　　　　　最初の画像みたいに
　　　　　　なります。

　　また、フタ付きの容器だと
　　　分割して描かれる場合が
　　　　多く見受けられます。

　　このへんは
　　　やってみてください。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Webアプリケーションの仕組み

# Webアプリケーションとは
**高度な機能**を持ったWEBサイトのことを指す。
→ 双方向のやり取り
WEBアプリケーションを開発するにはHTMLだけではなくWEBプログラムを利用するためフレームワークを利用する。
(例)ECサイト,Youtube,Excel,ZOOM

## 基本的な仕組み
基本構成は**クライアント**と**サーバ**の2つで成り立っている。
クライアント：サービスを要求する側（ユーザ）
サーバ：サービスを提供する側

### クライアントサイド(フロントエンド)
#### 構成
+ Webブラウザ(Webサイト)
+ Webサーバ

##### Webブラウザ
インターネットを介してWebサイトを閲覧するためのソフトウェア
Chrome、safari、Microsoft Edgeなど

##### Webサーバ
+ ユーザーからリクエストを受信し、結果を返す
+ HTML/CSS,画像を格納
+ Webサービスを提供する時に使用されるプロトコルはHTTP
+ どのWEBサイトにも存在するサーバ
+ 静的コンテンツ


例）Nginx（エンジンエックス）、Apache HTTP Server（アパッチ）、IIS（アイアイエス）

:::note warn
WebサーバはOSとの対応に注意する必要がある。
:::


### サーバサイド(バックエンド)
#### 構成
+ アプリケーションサーバ（APサーバ）
+ データベースサーバ（DBサーバ）

### APサーバ
Webサーバからリクエストを受信し、プログラムを実行する。そして、動的コンテンツを生成する。ここでJavaやPHPなどの言語を使用してプログラミングする。

::: note warn
必ずしもAPサーバが必要な訳ではない。WebサーバがAPサーバを兼任することも可能。詳しくは続きの層構造で解説します。
:::

#### 役割
1. ### コネクト機能
    データベースへの接続をする機能
    
2. ### トランザクション機能
    データの整合性を保つ処理を行う機能
3. ### ビジネスロジックの実装
    認証、メッセージ機能など


例）Apache Tomcat(Java),Apache(PHP),Unicorn(Ruby)

::: note warn
言語によって扱うAPサーバは違うので注意
:::

### DBサーバ

データベース管理システムによって管理されている。**APサーバからのリクエストに応じたデータ管理の実行。**
データベースの種類は「Oracle」、「SQL Server」、「MySQL」、「PostgreSQL」などがある。


## ３層構造
Webアプリケーションを3つの層に分けて構成する。
#### 3つの層とは？
+ **プレゼンテーション層**
+ **アプリケーション層**
+ **データ層**


#### なぜ分けるのか？
サーバの負荷分散（分散処理）ができる。それに伴い、セキュリティが強固になり、メンテナンス性が上がる。
ただ、物理サーバの数を増やさなければならない。

### 構造

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359890/7793acc5-1fd1-0222-90f9-6e9a1962633b.png" width="700">


#### 2層構造
プレゼンテーション層とデータ層で構成されており、アプリケーション層が存在しない構成である。
なので、２層構造ではAPサーバが不要になり、WebサーバがAPサーバを兼任する。したがって、Webサーバの負荷が大きくなり、プレゼンテーション層からデータ層へアクセスが可能のため、セキュリティ面でも問題があります。これらの理由により、現在では３層構造を推奨しております。

::: note info
小規模の開発などでは２層構造でも問題ありません。

:::

***


## 参考
https://qiita.com/yohattor/items/7c56fa57e850c33ea47d

https://qiita.com/yCroma/items/e46476e2ac7c372bb2a3

https://qiita.com/yohattor/items/7c56fa57e850c33ea47d

https://ja.stackoverflow.com/questions/18417/web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8ap%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E5%88%86%E9%9B%A2%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
ESLintで不要なimport文を自動で削除したい

# 背景
ESLintで不要なimport文は検知されますが、`--fix`で自動で削除してもらえないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/3b2369a0-7d14-b57c-a6cf-0965646c21f3.png)

自動で削除するプラグインがあるのか調べてみます。

# [eslint-plugin-unused-imports](https://github.com/sweepline/eslint-plugin-unused-imports)

https://github.com/sweepline/eslint-plugin-unused-imports

「未使用のimportを検索して削除する」と書かれています。

# eslint-plugin-unused-importsの導入方法

:::note
eslintをinstallしているものとします
:::

### eslint-plugin-unused-importsのinstall
```terminal
npm install eslint-plugin-unused-imports --save-dev
```

### eslintrcの修正
```.eslintrc
{
	"plugins": [~, "unused-imports"]
}
```

```.eslintrc
{
    "rules": {
        "unused-imports/no-unused-imports": "error",
    },
}
```

# eslint-plugin-unused-importsを実際に使ってみる

```func.ts
export const func = () => {}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/ec400b54-07d2-0296-828b-7af993be9fcb.png)

これを`--fix`で消えるか確認します。

確認したら消えていました！

## 問題点
問題点としては`'func' is defined but never used`が重複しています。

そこで今回は"unused-imports/no-unused-vars":"off"にしました。

```.eslintrc
rules: {
    "unused-imports/no-unused-imports": "error",
    "unused-imports/no-unused-vars":"off",
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/b749d2b6-3bfe-b661-a5fc-4022503f470b.png)

:::note


公式documentでは`no-unused-vars`をoffにして、`unused-imports/no-unused-vars`をonにしています。
こちらは未使用の変数定義を自動で削除してくれるそうです！

```.eslintrc
{
    "rules": {
        "no-unused-vars": "off", // or "@typescript-eslint/no-unused-vars": "off",
        "unused-imports/no-unused-imports": "error",
        "unused-imports/no-unused-vars": [
            "warn",
            {
                "vars": "all",
                "varsIgnorePattern": "^_",
                "args": "after-used",
                "argsIgnorePattern": "^_",
            },
        ],
    },
}
```
:::

# 参考
- [eslint発火時に不要なimportを削除する](https://zenn.dev/taizo_pro/articles/d849b0da8e9b53)
- [ESLintで不使用のimport自動削除](https://sakublog.tech/tips/eslint-plugin-unused-imports/)
- [eslint の設定で import をきれいにする](https://qiita.com/dhythm/items/b69c335b6d62b2eab2ab)
- [よく導入する eslint ルールについてまとめてみる](https://k2ss.info/archives/3514/)

# 最後に
便利なプラグインを生かして少しずつ開発生産性を高めたいです
AWS IoT Core の Device Shadow を触ってみた

## はじめに
約 2 年ぶりの Qiita 投稿となります。
今回は AWS IoT Core にある Device Shadow を触ってみたのでそこで自分が気になったところをまとめたいと思います。

## Device Shadow とは
Device Shadow どのようなサービスかは @MCYamamoto さんの記事が大変参考になるのでこちらを読んでいただくのがいいかと思います。僕も最初にこの記事を読んで機能を理解しました。
https://qiita.com/MCYamamoto/items/b133a819650db386c132

## メリット
エッジは電源が入っていなかったり、設置先のネットワークが悪かったりすることが往々にしてあります。
エッジの設定ファイルを手動で ssh や MQTT などで変更しようとすると上記の理由でできなかったりすることがあり、運用上厳しかったりします。
そこでシャドウを使うと IoT Core に対して設定値（desired）を変更するようにすればよく、エッジの状況を考慮する必要がなくなるため、とても便利です。

## フィールドの変更
[ShadowTopicPrefix/update](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/device-shadow-mqtt.html#update-pub-sub-topic) トピックを publish することで変更可能です。
Shadow を追加した時のデフォルトが `"welcome": "aws-iot"` なので desired を `"welcome": "aws-iot2"` としてみます。

```
{
  "state": {
    "desired": {
      "welcome": "aws-iot2"
    }
  }
}
```

delta　も変更されていることが確認できるかと思います。

## フィールドの追加
僕がドキュメント読んだだけだとよくわからなかったところです。
機能追加等で既存のエッジに新たな設定値を追加したいケースはあるかと思います。
[ShadowTopicPrefix/update/delta](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/device-shadow-mqtt.html#update-pub-sub-topic) ドキュメントの方には

> 属性が desired セクションにあるが、reported セクションに同じ属性がない場合、その属性は含まれません。

とあり、フィールドを追加した時には delta に反映されないと思ってました。

ただ、[delta に関するドキュメント](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/device-shadow-document.html#delta-state) のほうには

> delta 状態は、desired 状態と reported 状態の違いを含む virtual 型の状態です。desired セクションに含まれるが、reported セクションに含まれないフィールドは、差分に含まれます。

とあり、フィールドを追加した際も delta に反映されるとありました。
実際に desired へ追加したところ、確かに delta は更新されており、フィールドの追加にも対応しているようでした。

実際に動かした後もう一度ドキュメントを読み直し、

> 属性が desired セクションにあるが、reported セクションに同じ属性がない場合、その属性は含まれません。

の `属性` が [IoT thing のほうの属性](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/thing-registry.html) のことを言っているのだろうと無理矢理納得しました。（）

## フィールドの削除
残っていても邪魔なので、仕様変更で今まで使ってた設定値を削除したいケースはあるかと思います。
ただ、desired の更新を行うことでエッジのフィールドを削除する方法はなさそうでした。
なので、使っていないことを明示的にするために `"welcome": "not used"` 等のチームで決めた値にしておくのがいいかもしれません。

## さいごに
今回はドキュメントと AWS コンソールでポチポチしただけで終わったので、今後はラズパイとかに導入して使ってみたいと思います。
useEffectは実行されずuseLayoutEffectのみ実行されて困った話

# useEffectとuseLayoutEffectの今ままでの認識ついて
useEffectとuseLayoutEffectの詳しい説明は省きますが、ざっくり以下のように考えていて
実行タイミングが違うだけで片方のみ実行されるタイミングがあるとは思っていませんでした。
`useEffect：ブラウザが画面を描画した後に実行される`
`useLayoutEffect：ブラウザが画面を描画する前に実行される`

## 詳しい説明用URL
[useEffect公式記事](https://ja.react.dev/reference/react/useEffect)
[useLayoutEffect公式記事](https://ja.react.dev/reference/react/useEffect)
[ReactCompleteGuide(useEffect)](https://overreacted.io/a-complete-guide-to-useeffect/)
[ReactLifecycle](https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/)

# 調査結果
調べてみたところ**Suspence時にはuseEffectは実行されず、useLayoutEffectは実行される**ようでした。


```react:App.tsx
import { Suspense, useState } from "react";
import { TestComponent } from "./TestComponet";
import { Footer } from "./Footer";

function App() {
  const [isSuspence, SetIsSuspence] = useState(false);
  return (
    <>
      <Suspense fallback="loading...">
        <TestComponent isSuspence={isSuspence} />
      </Suspense>
      <br />
      <Footer isSuspence={isSuspence} setIsSuspence={SetIsSuspence} />
    </>
  );
}

export default App;
```

```react:TestComponent.tsx
import { useEffect, useLayoutEffect } from "react";

function sleep(ms: number): Promise<void> {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

export function TestComponent({ isSuspence }: { isSuspence: boolean }) {
  useEffect(() => {
    console.log("useEffect:callback");
    return () => {
      console.log("useEffect:clean up");
    };
  }, []);

  useLayoutEffect(() => {
    console.log("useLayoutEffect:callback");
    return () => {
      console.log("useLayoutEffect:clean up");
    };
  }, []);

  if (isSuspence) {
    throw sleep(3000);
  } else {
    return <button>button</button>;
  }
}
```

```react:Footer.tsx
import { Dispatch, SetStateAction } from "react";

export function Footer({
  isSuspence,
  setIsSuspence,
}: {
  isSuspence: boolean;
  setIsSuspence: Dispatch<SetStateAction<boolean>>;
}) {
  const handleClick = () => {
    setIsSuspence(!isSuspence);
  };
  return (
    <button onClick={handleClick}>
      {'Suspenceを' + (!isSuspence) + 'へ'}
    </button>
  );
}
```

![React-App-Effect-Test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780089/fc10ce37-327b-5f01-5cf2-753e3ec577ce.gif)


# よく調べてみると公式サイトに記載があった
useEffectとuseLayoutEffectの記事では見つけられませんでしたが、
Suspenceの記事に記載がありました。

[Suspense公式記事](https://ja.react.dev/reference/react/Suspense#caveats)

# 最後に
同じ現象に陥った人の助けになればと思います。
ここまで読んでいただきありがとうございました。
【書評】プロを目指す人のためのTypeScript入門

# 読んだ本

https://gihyo.jp/book/2022/978-4-297-12747-3

# 概要

TypeScriptの入門として読みました。通称ブルーベリー本で有名ですが、評判に違わぬ分かりやすさで、安心して一通りの項目が学べました。
注意点として、出版が2022年のため少し古い情報が混じっています。そういった面では最近出版された『現場で使えるTypeScript 詳解実践ガイド』の方がおすすめかも知れません（未読）。

目次は下記になっています。

第1章　イントロダクション
第2章　基本的な文法・基本的な型
第3章　オブジェクトの基本とオブジェクトの型
第4章　TypeScriptの関数
第5章　TypeScriptのクラス
第6章　高度な型
第7章　TypeScriptのモジュールシステム
第8章　非同期処理
第9章　TypeScriptのコンパイラオプション

# おすすめの人

- これからTypeScriptをやっていく初学者
- 手探りでTypeScriptを初めて少したった人

# 次に読むなら

TypeScriptはそれ自体で何かを提供できるわけではないため、これ自体が目的にはなり得ないはずです。
私はNest.jsの開発をするために読んだため、Node.jsの本を読む予定です。

# 感想

TypeScriptはあくまでも開発の補助で、後付であることが（改めてですが）重要な点だと認識しました。
下記抑えておきたい箇所メモ。

- numberはdouble型
- `===`を使う
- `for in`はクセがあるので注意
- Temporal ... JavaScriptの日付を扱う標準API
- `"string".length`などは疑似オブジェクトに変換して実行される（関数はクラス外定義の方が言語的に得意）
- booleanもユニオン型で表現される
- ユーティリティ型結構使うので覚えておく
インターフェイス

## はじめに

インターフェイスについてまとめる

### インターフェイスとは

配下のメソッドが全て実装を期待/強制するメソッドであるクラスのこと。
中身を持つメソッドやプロパティを定義できず、アクセス修飾子の指定もできない。


#### インターフェイスと抽象クラスとの違い

インターフェイスでは多重継承ができる。
抽象クラスでは多重継承はできない。

多重継承が可能なことで、メソッドを目的に応じて様々なインターフェイスに振り分け、サブクラス側では必要なメソッドを含むインターフェイスだけを選択的に継承(正しくは実装)する、ということができる。

#### インターフェイスの役割

インターフェイスの利用者に契約内容を約束し、裏側の実装を隠す。
そして、実装者にはその契約を守ることを求める。


#### 参考コード

`Triangle`クラスで`IFigure`インターフェイスを実装している。

```php:IFigure.php
interface IFigure
{
    function getArea(): float;
}
```

```php:Triangle.php
require_once 'Figure.php';

class Triangle implements IFigure
{
    protected float $width;
    protected float $height;

    public function __construct(float $width, float $height)
    {
        $this->width = $width;
        $this->height = $height;
    }

    public function getArea(): float
    {
        return $this->width * $this->height / 2;
    }
}
```