OmniAICreator/Qiita-1.07M huggingface dataset:
CSS 辞書２

# 問題
HTMLやCSSの記述は、プログラミング初心者にとって最初の難関であり、乗り越えても使わなければ忘れてしまうことが多いと思います。私自身もその一人です。今回は、あるサイトを模写してCSSを学習した内容を、自分用の辞書的な参考資料としてまとめてみました。参考になれば幸いです。
なお、この記事はパート２です。パート１はこちら↓

https://qiita.com/f-nari/items/291c08e4dc1f486008bd

# font-awesomeによるiタグ
本来`<i>`タグは、字体を斜体にすることができるタグだが、font-awesomeを使用するとき、`<i>`タグを使用することとなる。
```css:css
<a href="" class=""><i class="fab fa-airbnb"></i></a>
```
このようにaタグで囲むと`<i>`タグもクリックできる

# ブロック要素を自由に動かす
縦に並ぶもの（ブロック要素）を横に並ばせたいとき（例えば、divを数個並べるときとか）
親要素を以下のようにする。そうすることで、親要素の中身を自由に動かすことができる。
この時点で、横並びとなる
```css:css
display: flex;
```

![スクリーンショット 2024-10-31 10.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893783/dfbf4afb-e971-0096-a5e3-7b6d53538461.png)

## justify-content
```css:css
display: flex;
justify-content: center;
```
`justify-content: center ; `をつけることで横の並び方を変えることができる。
`center`だと、中心に寄る。他には`space between`や`space-around`等がある。

## align-items
```css:css
display: flex;
aline-items:center;
```
`align-items`をつけることで、縦方向の並び方を変えることができる。
`center`だと中心に寄る。他には`flex-end`や`flex-start`等がある。

## flex-grow
`flex-grow`は、flex-growを与えられた要素が、そのflex内でどれくらいの幅を決めるものである。以下のようにすると、flex内で各要素が同じ大きさの割合になる。
```css:css
.header-bottom-items1,
.header-bottom-items2,
.header-bottom-items3,
.header-bottom-items4 {
    flex-grow: 1;   
}
```

# border
要素の外枠を変えることができる
```css:css
border-radius:20px; /* 丸くできる */
border: 1px solid; /* 外枠を1pxの大きさの線（solid）を引くことができる */
```

# 感想
今回はflexについて学んだ。flexはcssの大事な要素なので使いこなせるようにしていきたい。
dbt runでエラーが出た（Compilation Error dbt found two macros named "〇〇"）編

# 発生したエラー
dbt run実行時に以下のようなエラーが発生した。

```
15:12:24  Encountered an error:
Compilation Error
  dbt found two macros named "materialization_materialized_view_default" in the
  project "dbt".
   To fix this error, rename or remove one of the following macros:
      - macros/materializations/models/materialized_view/materialized_view.sql
      - macros/materializations/models/materialized_view.sql
```
# エラーメッセージを頼りに確認

以下の２つのファイルに注目してみる
- macros/materializations/models/materialized_view/materialized_view.sql
- macros/materializations/models/materialized_view.sql

```
$ cd macros
$ tree -L 1
.
```
該当するファイルは無さそう。

エラーのことは忘れて、新しいディレクトリにdbtプロジェクトを作成して「dbt run」を実行したが同じエラーが出た。

# dbtのバージョンを調べてみる
```
$ dbt --version
(一部抜粋)
Core:
  - installed: 1.6.3
  
Plugins:
  - snowflake: 1.6.2
```
バージョンを変えてみた。
```shell-session
$ python3 -m pip install dbt-core==1.8.6 dbt-snowflake==1.8.3
```
バージョンは変わっているか確認しよう、、、できなかった
```shell-session
$ dbt --version
(一部抜粋)
ModuleNotFoundError: No module named 'dbt.adapters.factory'
```
dbt-adaptersをアンインストール後、インストールした。
dbt-adaptersのバージョンはとりあえず最新にした。
```shell-session
$ python3 -m pip uninstall dbt-adapters
$ python3 -m pip install dbt-adapters==1.8.0
$ dbt --version
(一部抜粋)
Core:
  - installed: 1.8.6
Plugins:
  - snowflake: 1.8.3
```

## dbt runを実行してみる
```
$ dbt run
(一部抜粋)
Completed successfully
```
解決したっぽい

# エラーとなる状況を再現しよう
```shell-session
$ python3 -m pip install dbt-core==1.6.3 dbt-snowflake==1.6.2
(一部抜粋)
Successfully uninstalled mashumaro-3.9
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
dbt-common 1.11.0 requires mashumaro[msgpack]<4.0,>=3.9, but you have mashumaro 3.8.1 which is incompatible.
Successfully installed mashumaro-3.8.1
```
dbt-common 1.11.0は、mashumaroのバージョンが3.9以上かつ4.0未満であること求めているっぽい。
mashumaroのバージョン3.9をインストールする。
```shell-session
$ python3 -m pip install mashumaro==3.9
(一部抜粋)
 Successfully uninstalled mashumaro-3.8.1
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
dbt-core 1.6.3 requires mashumaro[msgpack]~=3.8.1, but you have mashumaro 3.9 which is incompatible.
Successfully installed mashumaro-3.9
```
dbt-core 1.6.3は、mashumaroのバージョン3.9では互換性がないっぽい。
この辺りが原因で「dbt run」が実行できなかった？
Vulkan日記その1: HomebrewでVulkanをインストール

今年のQiita Advent Calendar 2024での連載記事の1つは，Vulkanにしようかなと思いました．行き当たりばったりでつらつらと書きます．

まずは，Homebrewでインストールを試みてみます．

```zsh
brew update
brew search vulkan
```

とすると，次のFormulaeがあるようです．

* `vulkan-extensionlayer`
* `vulkan-headers`
* `vulkan-loader`
* `vulkan-profiles`
* `vulkan-tools`
* `vulkan-utility-libraries`
* `vulkan-validationlayers`
* `vulkan-volk`

全部入れてみました．

```zsh
brew install vulkan-extensionlayer vulkan-headers vulkan-loader vulkan-profiles vulkan-tools vulkan-utility-libraries vulkan-validationlayers vulkan-volk
```

それぞれインストールされたディレクトリを確認します．

```zsh
brew --prefix vulkan-extensionlayer vulkan-headers vulkan-loader vulkan-profiles vulkan-tools vulkan-utility-libraries vulkan-validationlayers vulkan-volk
```

インストールされた全てのファイルの確認方法は次のとおりです．

```zsh
brew --prefix vulkan-extensionlayer vulkan-headers vulkan-loader vulkan-profiles vulkan-tools vulkan-utility-libraries vulkan-validationlayers vulkan-volk | xargs -I {} find {}/
```

下記のドキュメントの Verify the SDK Installation に沿ってコマンドがインストールされているかを確認します．

https://vulkan.lunarg.com/doc/sdk/1.3.296.0/windows/getting_started.html

まず `vkvia`

```zsh
brew --prefix vulkan-extensionlayer vulkan-headers vulkan-loader vulkan-profiles vulkan-tools vulkan-utility-libraries vulkan-validationlayers vulkan-volk | xargs -I {} find {}/ | grep vkvia
```

あれ，無い．

探してみると，下記レポジトリをビルドするっぽい．必要になったらビルドするか．

https://github.com/KhronosGroup/VulkanTools-ForSC


次に，`vulkaninfo`

```zsh
brew --prefix vulkan-extensionlayer vulkan-headers vulkan-loader vulkan-profiles vulkan-tools vulkan-utility-libraries vulkan-validationlayers vulkan-volk | xargs -I {} find {}/ | grep vulkaninfo
```

ありそう．

最後に `vkcube`

```zsh
brew --prefix vulkan-extensionlayer vulkan-headers vulkan-loader vulkan-profiles vulkan-tools vulkan-utility-libraries vulkan-validationlayers vulkan-volk | xargs -I {} find {}/ | grep vkcube
```

あるっぽい．

[つづく](https://qiita.com/zacky1972/items/65ac97e850441958a7ea)
S3のライフサイクルルールの設定


今回はS3に設定したCloudTrailのログが溜まり続けてしまうのでライフサイクルルールを設定して、期限の切れたログを自動で削除していきたいと思います。
ほぼ自分のための備忘録用です。

## 設定したいS3バケットで設定

・管理タブからライフサイクルルールを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/59065b0d-03fb-b12e-940a-3587f48ff22a.png)

・任意のルール名を設定。今回はバケット内のオブジェクト全てに適用します。

![ライフサイクルルールの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/10f10fc9-8e43-b26a-cdc4-8a9ab057b9ce.png)

・今回は溜まり続けるログを一定期間で削除するようにしたいので下記3つをチェックする

![ライフサイクルルールのアクション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/9f74bd9a-f790-3a4a-6974-e633a69f23e3.png)

・今回は期限が切れる日数を7日。非現行バージョンになってからはすぐに削除したいので1日で設定。

![オブジェクトの現行バージョンの有効期限が切れる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/ce51b0c6-0812-c41c-ed1e-48dcf32f7e89.png)


![スクリーンショット 2024-10-31 6.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/da6e7099-e158-23d5-19be-99d0814231f1.png)

・ライフサイクルルール作成。ルール通り不要なデータが削除されているか翌日に確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/daa1e125-88b6-0507-2e60-323efc324213.png)

・作成したルールが間違っていないか念の為、設定内容を確認しておく

・下記、上の画像はルール適用前の状態、下はルールが適用されて期限切れデータが削除された状態。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/78126b26-0148-5988-06d6-8989ca15a687.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3902743/63ea6f25-e018-a5fc-1618-2fb646f0c567.png)

こんな感じで今後も設定などアップできたらなと思います。
Power Automate のフロー全体を画面キャプチャする方法

## 概要

**Power Automate クラウドフローの全体像を 1枚の画像にする方法**を解説します。

https://rksoftware.hatenablog.com/entry/2022/08/13/010000

上記サイトでその方法が記載されていたのですが、2024年10月時点ではうまくいかなかったため、試行錯誤してみました。

## 前提

* **フローを Webブラウザで開く**
Teams ではなく、https://make.powerautomate.com から開く必要があります。
Webブラウザは、本記事では Microsoft Edge を利用します。
* **クラシック デザイナーで開く**
新しいデザイナーでのやり方は不明。

## 手順

1. 対象フローの編集画面を**クラシック デザイナーで表示**する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/ef79debd-0e43-fbc1-b99e-431670c47c7c.png)

2. 横方向のスクロールバーが表示されなくなるように、**画面の表示倍率を小さく**する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/150eaf8e-0dcc-2546-1f57-4b049a17d3ee.png)

3. **F12キー** を押して、開発者ツールを表示する

4. **manage-flow-section** の class にて、`height: calc(100vh - 48px);`のチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/5297886c-d958-2b26-1c0c-7858e0a2f5d6.png)

5. **O365_NavHeader** の class にて、継承元 ms-Fabric fl-ApplicationRoot～ **.root-271** の `height: 100%;` のチェックを外す
(271は可変かも？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/55e59b1e-a3c4-4757-d922-f9febb6a367b.png)

6. 3. **F12キー** を押して、開発者ツールを閉じる

7. **Ctrl + Shift + Sキー** を押して、ページ全体をキャプチャをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/e0b5e655-eaf5-d31d-2168-149b42cd1b04.png)

8. やったぜ
![pau3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/6292bb7e-18d5-eed2-78c3-a2e62573a244.jpeg)

## 補足1

手順4.と 5.でチェックを外したことで、画面右の上下スクロールバーが、フロー編集エリアではなく、ページ全体にまたがっていれば OK なようです。

* 初期状態：フロー編集エリア内で上下スクロール
![pau2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/d742339f-fd70-8bae-4b74-c6df2ad88fc3.png)
* 手順実施後：ページ全体で上下スクロール
![pau1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/3a44dea8-4b32-3ba5-e5c6-8ea0d2b603ee.png)

## 補足2

フロー一覧に戻って他のフローを表示しても、この設定は維持されていました。
設定を再変更することなく、他のフローの画面キャプチャも撮りに行けます。

ページ更新(F5)・ブラウザ再起動などで設定はリセットされます。

## 簡略版

* **manage-flow-section** で `height: calc(100vh - 48px);` のチェック外す
* **O365_NavHeader** で **.root-271** の `height: 100%;` のチェック外す
読書感想「データモデル大全」

# 情報
著：渡辺幸三
日本実業出版社



# 読もうと思った動機
・業務で関わったDBのデータ構造の理解を深めたいため。
・積本だったが、知りあいが読んでいたので勢いで

# 印象に残った部分

## はじめに（ページ数無し）
・データモデリングとは、データの複雑な形を捉えて図面化する技術
・現状DB設計できるITの技術者が足りない
・描かれた的確なデータモデルを理解することは難しくない
・データモデリングの考え方は、複雑な形をとるデータに係るすべての職業人が身につけておきたい現代的な教養。

## p90 91 データ指向とオブジェクト指向
・データストア技術としてRDBの完成度が高い
・RDBとオブジェクト指向との齟齬はある。インピーダンスミスマッチと呼ばれる。
・ORM(データベースとオブジェクト指向プログラミング言語の間でデータを変換するプログラミング技法)は、すべてのテーブルを「ID」の単独主キーに統一している。
　関数従属性や、更新不可制約が見落とされるようになった。

## p148
・簿記三級は簡単で社会常識といっていいほど重要なので、資格をとれるかどうかに関係なく学ぶ意義があります。
・仕分け～決算までプロセス指向だと手順が７個必要なのに対して、データ指向だと手順は２個で済みます。（解法が違うから手順数が変化する？？？）




# 実践できること or 感想

## 感想
・ざっと読みました。手を動かして進める読み方は今回はしなかったです。

・勉強方法の筋道がわかったです。データ構造の設計の入門者向けの本だと思います。

・SQLはDDLあたりの知識があれば読むのに問題なさそうです。

・プログラム側の担当者としてもデータモデルを読み解く力は必要だと感じました。
　そうでないと、仮に適切なデータモデルに対して意図を汲むことができず活用できなくなる問題が発生すると思います。

・著者の渡辺 幸三さんが2001年に出した本「業務別データベース設計のためのデータモデリング入門」と見比べた所、興味深いと思いました。
　大まかな構成、主張はこの２０年間で大きく変化していないように感じました。
　データモデルの技術は成熟しており、経年劣化しにくい領域分野なのかなと思いました。



## 実践できること
・X-TEA Modelerを試してみる。
http://dbc.in.coocan.jp/
・X-TEA Modelerを使って８章のシステム構成管理、工程を実際に検証してみる。
　　理由：前職は製造業だったので業務が想像しやすい

・X-TEA Modelerを使って８章の売掛残高と請求、回収を実際に検証してみる。
　　理由：関わったことが有る業務システムのため

・簿記三級をとる（なるべく早く）
[AmazonQ Developer]Amazon Q for command lineも体験してみた。

## はじめに

学んだことはアプトプット！

JAWS-UG札幌にて、Amazon Q Developerのワークショップを開催して頂いたので、早速いくつか試してみます！...の２本目の記事です！

今回はAmazon Q for command lineについて記事にしてみます。

https://jawsug-sapporo.connpass.com/event/330317/

１本目の記事はこちら。

https://qiita.com/s_moriyama/items/e50d8211ca6b010d00fd

## Amazon Q for command lineとは？

AWSの公式ドキュメントの日本語翻訳精度低いなぁと思うので、今回は英語版を引用。

>This chapter explains how you can use Amazon Q Developer to enable IDE-style completions for hundreds of popular CLIs like git, npm, docker, and aws. Start typing, and Amazon Q populates contextually relevant subcommands, options and arguments.

https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line.html

`git`、`npm`、`docker`、`aws`のような何百もの一般的なCLIのIDEスタイルの補完ができるよ！って機能。

## やってみる！

### CloudShellから。

CloudShellを起動すると、こんなアナウンスがでるので、記載の通り、`zsh`でZ shellに切り替えるだけです。

![スクリーンショット 2024-11-02 4.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/dac3c308-0a2e-e6bf-0035-79fc092b2b38.png)

`aws s`まで入力した時点で、S3のコマンドの補完ができるようなってました！
コマンドをGoogle検索しなくて済みそう！！

![スクリーンショット 2024-11-02 4.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/1ee7ec14-c505-b3f3-deac-16dcbcede2e2.png)

## MacOSのターミナルでも利用できる！

MacOSのみの対応となりますが、自分の端末上でも利用が可能です。

ツールのインストール方法は以下のページの通り。

https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-getting-started-installing.html

ここからインストール。

AmazonQ関連は現時点（2024/11）では、一律日本語対応していないのが辛い。
（英語覚えないと。。ですね。）

![スクリーンショット 2024-11-02 4.15.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/bcaf04c3-7c4e-d3b0-c224-b33689d864d8.png)

インストールの過程で、一部OS側の設定も必要になります。

![スクリーンショット 2024-11-02 4.16.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/e6f58771-4b68-65fc-56ae-49395ee76e16.png)

アカウントの連携はBuilders IDか、IAM Identity Centerのどちらかで連携可能。

![スクリーンショット 2024-11-02 4.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/596426cf-6ec9-fc80-9eaf-acabeb287f3a.png)

この画面まで遷移できたら完了です！

![スクリーンショット 2024-11-02 4.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/642cc1b3-ab03-64c1-bac0-d678336f14cf.png)

CloudShellよりわかりやすく補完されている！

![スクリーンショット 2024-11-02 4.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/61deb935-d064-a964-2a7e-49085d048ecb.png)

## さいごに

生成AIも良いですが、このツールみたく、普段の作業を手伝ってくれる、アシスタント的なAI機能も良いですね。

エンジニアが普段コーディングに充当できる時間はわずかで、大半は煩雑な繰り返し作業をしているといった調査結果があるみたいです。

こういった煩雑な作業を支援してくれるのが、AmazonQ Developerなんだなぁと実感しました！
[CSS] `:has()` 疑似クラスを入れ子にする

**TL;DR** 仕様的に許可されていません

> `:has()` 疑似クラスは他の `:has()` の中に入れ子にすることはできません。
> — https://developer.mozilla.org/ja/docs/Web/CSS/:has#構文

ただ、`:has()` 内の `has` を削除するだけで凡そ簡単に解消できると思います。

## 背景と問題例

Web アプリの利用時に、普段は見えなくしておきたい要素が有り、
特定の要素をホバーしたりフォーカスしたりすると見えるようにする、ちょっとトリッキーなユーザースタイルを書いていました。

_e.g._ `.my-header` 内の hover、focus 時以外は `.target` を非表示にする
```scss:css
body:has(.my-header:not(:hover)) {
    &:has(.my-header:not(:has(:focus))) { /* has の入れ子あり */
        .target {
            &:not(:hover, :focus, :has(:focus)) { display: none }
        }
    }
}
```

hover だけだと .target の操作が出来なくなるので、.my-header 内のリンクやボタンなどインタラクティブな要素をドラッグ（focus）した状態でも消えない様にするハックを入れてます。

ただ上記のコードでは残念ながら、仕様のとおり意図したスタイルが適用されません。


## 解決策

`:has()` を入れ子しない書き方に修正します。  
例の場合では `body:has(.my-header:not(:has(:focus)))` を `body:not(:has(.my-header :focus))` とする事で解消できました。

```scss:css
body:has(.my-header:not(:hover)) {
    &:not(:has(.my-header :focus)) { /* Fixed */
        .target {
            &:not(:hover, :focus, :has(:focus)) { display: none }
        }
    }
}
```

結果として CSS も多少シンプルになって読みやすくなりました。  
仕様としてもその辺を見越しての物なのかなと思いました。

```css
/* Before */
body:has(.my-header:not(:has(:focus))) {}

/* After */
body:not(:has(.my-header :focus)) {}
```

挙動の例は以下の JSFiddle で確認できます。  

~~https://jsfiddle.net/4cj7xmo9/~~
https://jsfiddle.net/5yj1sa07/ (下記に関連する不要な行・コメント削除版)

<script async src="//jsfiddle.net/5yj1sa07/embed/"></script>

~~`:has()` を入れ子にしてしまうと後続のスタイルに悪影響が出てしまう様なので、
利用の際はその点だけご注意ください。~~
2024年11月26日時点でバグ？は解消している様です。
何にしても has の入れ子は無効な書き方なのでご注意ください。
Byobu で 2x2 のパネルを一気に立ち上げる方法

本記事では、[Byobu](https://www.byobu.org/documentation) を使って 2x2 にパネルを区切りながら、4つのスクリプトを個別のパネルで実行する startup スクリプトの書き方を紹介します。

# 本記事のゴール

![byobu_2x2_fps30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512479/7e1420af-286d-a6d6-e042-2878189ce829.gif)

上の gif を実現する startup スクリプト：
```bash:run_all_2x2.sh
#!/bin/bash
# ----------
#   1 | 3
#   -----
#   2 | 4
# ----------
export SUB="${HOME}/startup_scripts/subscripts"

# Pane 1: top left
byobu new-window -n startup -- bash -c "${SUB}/sc01.sh;bash"
sleep 1

# Pane 2: bottom left
byobu split-window -v "bash ${SUB}/sc02.sh;bash"
sleep 1

# Pane 3: top right
byobu select-pane -t 0
byobu split-window -h "bash ${SUB}/sc03.sh;bash"
sleep 1

# Pane 4: bottom right
byobu select-pane -t 2
byobu split-window -h "bash ${SUB}/sc04.sh;bash"
```

# 手順
## 1. Byobu のインストール
```bash
sudo apt install byobu
```
Byobu の操作方法については、[こちら](https://demura.net/misc/20629.html)が優れているので参照してください。

## 2. ディレクトリの作成
```bash
mkdir -p ~/startup_scripts/subscripts
cd ~/startup_scripts/subscripts
```

## 3. 個別パネルで実行するスクリプトの作成
作り方は自由です。以下は一例です。
```bash
cat << 'EOF' > sc01.sh
#!/bin/bash
echo "Hello from Script 1"
EOF
```
実行権限の付与もお忘れなく。
```bash
chmod +x sc01.sh
```
他の3つのスクリプトも同様の手順で作成します。

## 4. startup script の作成
冒頭のスクリプト (run_all_2x2.sh) を作成し、以下のように配置します。
```bash
startup_scripts/
├── run_all_2x2.sh   <- ここ
└── subscripts
    ├── sc01.sh
    ├── sc02.sh
    ├── sc03.sh
    └── sc04.sh
```
実行権限の付与もお忘れなく。
```bash
chmod +x run_all_2x2.sh
```

## 5. startup script の実行
startup script の場所に移動します。
```bash
cd ~/startup_scripts
```
Byobu を起動します。
```bash
byobu
```
startup script を実行します。
```bash
./run_all_2x2.sh
```
これで gif が再現できると思います。
Sayodevice Script プログラム実行を登録する。

# Sayodeviceで、プログラム実行。
Script機能を使用して、ファイル名を指定して実行する を実現するには、
そのままだと登録できないので、色々と回避するようにする。
設定アプリが？？なので(日本語キーボードが..とかでもなく）
設定アプリはｖ3を使用しています。
アプリは各自で探してください。
Scriptの登録は、1行毎に入れる/Record機能もありますが、現実的では無い為使用しない。
光らせたい人は、頑張って覚える。プログラムを起動するだけなので省略。

## Scriptの作成
登録用のスクリプト作成は2通りあります。
お好みでどちらかを使用してください
その後、登録したスクリプトを修正します。

- その1 template-> Run による作成
   既存のバッチ等を呼び出すバッチを作成。
  コマンドラインをバッチにする等
  confirmを押して、スクリプトを登録してください。
  _
    
- その2 tool-> convert(略) による作成
  起動したいバッチ、ショートカット等を登録。
  'C:\hoge\hoge.bat' を登録したいならば
  'C1/hoge/hoge.bat' にして下さい。 
  バッチ、ショートカット名は英数字のみです(記号不可）
  excuteprogramはマークする  durationは5程度で
  confirmを押して、スクリプトを登録してください。

<img width="600" alt="Script" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615816/ad370454-1c74-b346-d343-d337112e53d9.jpeg">  

(1ページの行数を大きくして、見やすく。 右下 ページを送る）

## Scriptの編集
登録したスクリプトを動くように編集します。
要は、日本語キーボードで動く形式に。
(キーは押す/離す動作がセットになっておりそれを修正削除する）

1. CapsLockの削除(押すと全角半角とかになるから）
   4か所 none 設定
2. 日本語キーボードに対応する ":" コロンに修正。
その1 で作成したスクリプトでは、"Shift"+";:"という動作が入っており
"Shift" は  none
";:" は ":"  相当に修正
_  
  その2 で作成したスクリプトでは、"1" を ":" 相当に修正
  歯車アイコンを押して、キーボードの画面を表示。
  
  none 設定 CapsLock Shift
<img width="600" alt="Script" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615816/1afd3723-81a2-9c73-0c76-937192ffda72.png">

  ":"  相当に設定。 歯車を押すとこの画面に。
<img width="600" alt="Script" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615816/47a9feb3-626a-d5a3-a39b-df4f2a527467.jpeg">)

その1修正箇所
<img width="600" alt="Script" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615816/5b221815-e4f7-9e9f-3a1a-7064996e4761.jpeg">

### 修正したScriptを、Keybordに登録すれば、そのキーでプログラムが起動されます。

問題になりそうなこと。
何かの拍子で、日本語入力モードになり、ファイルを指定して実行が出来なくなることが考えられます。
ファイルを指定して実行に、日本語名ファイルで実行した後などに。
スクリプトにEnterを入れる前に CTRL+A F10を押す 動作を入れれば回避できると思います。
設定アプリが考慮していれば、問題にならないのですが...
今後設定アプリが変更になった場合、再度同じことをしても、動かないこともあります。
（文字コードに対応すれば）

書いている人がやっていることは、
":" コロンを入れたくないので、環境変数を利用して、スクリプトを作成しています。
SayoLink=C:¥Sayolink¥ で登録しており
(pathの設定だとコマンドプロンプト画面で setx SayoLink "C:¥Sayolink¥¥”)
その2 を %SayoLink%piyopiyo.bat などで登録しています。
CapsLockだけをnoneの修正で済みます。
(パスが通っているところに、バッチを直接置けば、CapsLockだけなんですが...)


以上
Ubuntu 24.04にアップグレードした後、Docker Desktopが起動しなくなった話

# Ubuntu 24.04へのアップグレード

自宅サーバーとしてUbuntuを使っているのですが、Ubuntu 24.04へのアップグレード通知が来たので、次のコマンドで23.10から24.04にアップグレードしました。
```bash
$ sudo do-release-upgrade -d
```

# Docker Desktopが起動しない

ところが、アップグレード後にDocker Desktopが起動しないトラブルに遭遇しました。アプリランチャーからDocker Desktopのアイコンをクリックしても無反応。システムアップグレードが原因かもしれないと考え、Docker Desktopをアンインストール後、同じバージョンを再インストールしてみましたが、状況は変わらず起動しませんでした。

# 背景で動作するDockerエンジン
興味深いのは、Dockerエンジン自体はバックグラウンドで正常に動作していた点です。管理者権限でDockerコマンドを使うことはできたものの、Docker DesktopのUIが表示されないのは不便でした。

# 原因を調査：ElectronとChromiumの不具合

原因を調べたところ、ElectronとChromiumの不具合が影響していることがわかりました。関連する情報はこちらです。

https://github.com/docker/desktop-linux/issues/209#issuecomment-2083540338

https://github.com/electron/electron/issues/41066

# 解決方法：コマンドでDocker Desktopを再起動

この問題を解決するため、以下のコマンドを実行するだけでDocker Desktopが正常に起動するようになりました。
```bash
$ sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
$ systemctl --user restart docker-desktop
```

# まとめ
以上のコマンドを実行後、無事にDocker Desktopが動作するようになりました。Ubuntuのアップグレード後にDocker Desktopが起動しなくなった場合は、ぜひ試してみてください。
Capistrano 3で多段SSHを行う方法

Capistrano 3で多段SSHを使用してデプロイするには、`.ssh/config`の設定をするとスッキリ書けます。

以下、設定例

**deploy.rb**

```ruby
server 'test-server', user: 'ec2-user', roles: %w{app db web}

set :ssh_options, {
  keys: %w(~/.ssh/test-key.pem),
  forward_agent: true,
  auth_methods: %w(publickey)
}
```

**.ssh/config**

```bash
# 踏み台サーバー
Host fumidai-server
 HostName xxx.xxx.xxx.xxx
 User ec2-user
 IdentityFile ~/.ssh/fumidai.pem

# デプロイ先のサーバー
Host test-server
 HostName yyy.yyy.yyy.yyy
 User ec2-user
 IdentityFile ~/.ssh/test-key.pem
 ProxyCommand ssh fumidai-server -W %h:%p
```

### 注意点

`.ssh/config`ファイルでは、コメントはコード行の末尾に記載しないようにしてください。例えば、以下のようにするとCapistranoでエラーが発生します。

```bash
Host test-server # デプロイ先のサーバー
 HostName yyy.yyy.yyy.yyy
 User ec2-user
 IdentityFile ~/.ssh/test-key.pem
 ProxyCommand ssh fumidai-server -W %h:%p
```

通常のSSH接続では問題ありませんが、Capistranoではこの形式が原因でエラーが起こります。

CapistranoはSSH設定情報をパースしてリモート接続を行おうとするため、行末にコメントがあると構文解析が失敗するためです。逆にSSHのconfigが柔軟なフォーマットを持っているってことですね。
Node.js+Playwrightのセットアップ：LTSとCurrentに気をつけよう

## 要約
テスト自動化の学習として、Node.jsとPlaywrightを使ったテスト環境を構築した際、安定性重視のLTSバージョンの重要性を実感した失敗談をお伝えします。

---
## 初めに
この記事では、Playwrightのセットアップ方法とNode.jsのバージョンによるトラブルを経験した備忘録を紹介します。

Playwrightを試してみたい方や、Node.jsのバージョン管理に興味のある方の参考になれば幸いです。

## 作業環境

| OS | Node.js | npm | nvm | 
|:-:|:-:|:-:|:-:|
| Windows10  |  v20.15.1 | v10.8.2 | v1.1.12 |

:::note warn
OS, Node.js, npmは開発していたとき(2024年8月)のものです。nvm(nvm for windows)は後日実装しました。
:::

## 環境構築
### 1. ディレクトリの作成
任意の場所に新しいフォルダを作成します。

### 2. Node.jsのインストール
[公式サイト](https://nodejs.org/en/download/package-manager)からLTS版をダウンロードしてください。

nvmを使ったバージョン管理もおすすめですが、Windowsでは少し工夫が必要です。こちらも別の機会に詳しく触れたいと思います。

### 3. CLIの起動
PowerShellやGit Bash（要インストール）を使用。

### 4. Playwrightのセットアップ

以下のコマンドを実行してPlaywrightをインストールします。
``` shell
npm init playwright@latest
```
必要に応じて、dotenvなどのライブラリも追加しましょう。

### プロジェクト構成の確認
正常に作成されていれば、1のディレクトリ下に、以下のディレクトリ・ファイルを確認できます：

- `node_modules`
- `tests/example.spec.ts`
- `package.json`
- `package-lock.json`
- `playwright.config.ts`
など

ここまで完了すれば、example.spec.tsをそのまま実行する準備が整います。

### Playwright設定ファイルの基本
playwright.config.tsでテストに関する各種オプションを指定できます。以下が主要な設定項目です：

- testDir：テストファイル保存ディレクトリ
- retries：テスト失敗時の再試行回数
- workers：並列実行の最大スレッド数
- timeout：テスト全体や個別のタイムアウト時間

より詳細な設定については、[公式ドキュメント](https://playwright.dev/docs/test-configuration)を参照してください。

## トラブル
最新(Current)のNode.js（当時はバージョン22.11.0）でPlaywrightを使おうとした際にエラーが発生しました。

PlaywrightはLTS版（長期サポート版）での動作を前提としているようで、最新版では動作しないこともあるようです。が、この原因特定にかなりの時間を浪費してしまいました。過去に別のPC環境で成功していたことも原因でしょう。

LTS版（Node.js 20.15.1）に戻したところエラーが解消され、無事動作しました。

## 学んだこと
1. Node.jsにはLTS版とCurrent版があり、特にテストツールを利用する際は安定性のあるLTS版を使用することが推奨されるようだ

2.nvmを使ってNode.jsのバージョンを切り替えると、バージョンごとの柔軟な対応が可能となるので導入しておく。

## まとめ
PlaywrightとNode.jsを使ったテスト環境の構築には、LTS版を利用したり、nvmでバージョン管理することで安定した開発を始められます。

安定性と効率を両立するために、特に制約のない場合はLTS版を使用しましょう、というお話でした。

ご意見、ご指摘お待ちしております。

## 最後に

以下は、最初に作成したGmailログイン用のサンプルコードです（2段階認証は無効）。
```typescript
import { test, page } from '@playwright/test';
import dotenv from 'dotenv';

dotenv.config();
const user = process.env.GMAIL_USER ?? '';
const password = process.env.GMAIL_PASS ?? '';

test('Gmailログインする @demo', async() =>{
    await page.goto('https://accounts.google.com/signin/v2/identifier');
    await page.fill('#identifierId', user);
    await page.click('button:has-text("Next")');
    await page.fill('#password > div.aCsJod.oJeWuf > div > div.Xb9hP > input', password);
    await page.click('button:has-text("Next")');
    await page.waitForTimeout(2000);
    await expect(page.locator('#gs_lc50 > input:nth-child(1)').toBeVisible(); 
});

```

### 参考にしたサイト(公式ページ)
> https://playwright.dev/docs/api/class-testoptions
https://playwright.dev/docs/input
https://playwright.dev/docs/api/class-locatorassertions
https://playwright.dev/docs/api/class-page
https://playwright.dev/docs/intro
GCP認定資格Professional Data Engineer の最新受験対策 (2024年10月版)

# はじめに
先日、Google Cloud 認定資格 Professional Data Engineerを更新した際に問題で問われる内容がアップデートされていたので、最新の対策として改めてまとめました。

前回受験した時の受験対策は以下です。

https://qiita.com/yutakon/items/ed17e51586a1796f4bbf

上の内容が古くなったというより、ここ2年で新しく出てきたサービスも問われるようになった感じなので、上の記事+αで本記事を参考にすると良いです。
前回の記事を見るとわかりますが、昨年のこの時期にはベータ版出ており、そこで出題された問題が本試験にも適用された感じです。

# アップデート内容
今回更新した際に知識が必要と思ったGoogle Cloudサービスを以下にまとめました。
キーワードベースでまとめていますので、サービスの詳細については添付の公式ドキュメントを参照ください。

## AlloyDB
PostgreSQL 互換のあるフルマネージドなデータベースサービスです。Cloud SQL と比較して高価なサービスではありますが、継続バックアップを利用すると RPO が0になったり、分析クエリは Cloud SQL より高速化できたりといったメリットがあります。

https://cloud.google.com/alloydb/docs/overview

AlloyDB Omni ではオンプレミスや他のクラウドの VM、Kubernetes などに AlloyDB をインストールして利用することができます。

https://cloud.google.com/alloydb/docs/omni

## Dataplex
Dataplex は、分散されたデータを統合し、そのデータのマネジメントとガバナンスを自動化できるフルマネージドサービスです。
本サービスを使うと主に以下のことができます。
- 複数の Google Cloud プロジェクトに保存されているデータに対して、データを移動せずにデータメッシュを構築可能
- 単一の権限セットによる一貫したデータ管理、モニタリング（データの一元管理）
- カタログ機能を使用したデータの抽出
- データ品質やデータのライフサイクルを管理

https://cloud.google.com/dataplex?hl=ja

## Dataform
Dataform は Bigquery におけるデータパイプラインの管理ができるフルマネージドサービスです。
Dataform を使用すると、データ統合の ELT（抽出、読み込み、変換）プロセスにおけるデータ変換を管理できます。試験的には Bigquery で使いたいデータの ELT をしたい = Dataform と短絡的に覚えても OK です。

https://cloud.google.com/dataform?hl=ja

## Datastream
Datastream は、データベースの CDC (変更データ キャプチャ）およびレプリケーションができるサーバレスサービスです。本サービスを利用すると、他のデータベースから BigQuery や Cloud SQL、Cloud Spanner といった Google Cloud のデータベースサービスにデータをストリーミングできます。

https://cloud.google.com/datastream?hl=ja

## Analytics Hub
Analytics Hub は組織間でデータアセットを効率よく安全に交換できるデータ交換サービスです。
本サービスを利用すると、サードパーティーと Google のデータアセットを使用した分析が可能となります。
特徴として以下のことが挙げられます。
- コストを削減し、効率的にデータを共有して交換
- データアセットと分析アセットの一元管理
- ガバナンスによるプライバシーに配慮した安全なデータ共有

https://cloud.google.com/analytics-hub?hl=ja

## BigLake
こちらは Google Cloud サービスというより、BigQuery の外部に保存されたデータに対してクエリを実行する際に必要な外部テーブルのことを指しています。
この BigLake を利用すると、アクセス権の委任を使用して外部データストアの構造化データをクエリでき、以下のようなことが可能となります。
- 行レベルや列レベルのアクセスなどのきめ細かいセキュリティ管理
- マルチコンピューティング分析
- Amazon S3 や Azure Blob Storage などを利用したマルチクラウドガバナンス (これらを用いた分析ソリューションについては次項を参照)

https://cloud.google.com/biglake?hl=ja

## BigQuery Omni
BigQuery Omni を使用すると、BigLake テーブルを使用して、Amazon S3 や Azure Blob Storage に保存されたデータに対して BigQuery 分析を実行できるようになります。
この機能を使ったマルチクラウドな分析ソリューションはサイロ化を防ぎ、低コストで高速な分散型データガバナンスを可能にしています。
また、クラウド間でデータを移動してクロスクラウド転送でデータを結合できる他、クロスクラウド結合を使用してクラウド間でデータのクエリも実行することができます。
認定試験的には、BigQuery で他クラウド上に保存されたデータを分析したい = BigQuery Omni、BigQuery で分析できるようなデータを (アクセス管理も含めて) 用意したい = BigLake と覚えておけばよいでしょう。

https://cloud.google.com/bigquery/docs/omni-introduction?hl=ja

# おわりに
資格の更新のタイミングで改めて Google Cloud のデータ関連サービスについて勉強しなおしました。
はじめは「更新めんどくさいな」と思っていました (Google Cloud さんすみません) が、実際に更新のために勉強してみると前回のアップデート分が加算されたことで復習+知識強化につながる良い機会だと実感しました。
年末まで怒涛の更新ラッシュが来ているので、他の資格も更新があればまとめようと思います。
pythonでxmlファイルから特定のタグを抽出する

### やったこと
5万行くらいのxmlから特定のタグの値を抽出したかったので、スクリプトを書きました。

```python
import xml.etree.ElementTree as ET

# 処理するXMLファイルのパス
file_path = 'Library.xml'
# 出力先のテキストファイルのパス
output_file = 'output.txt'

# タグ名と名前空間URIを定義
namespace_uri = 'http://www.hogehoge.com'
get_tag_first = 'xxx'  
get_tag_second = 'yyy'  
get_tag_three = 'zzz'  

# 出力ファイルを開く
with open(output_file, 'w', encoding='utf-8') as f_out:
    # イテレータパーサを使用してXMLを逐次的にパース
    context = ET.iterparse(file_path, events=('end',))
    for event, elem in context:
        # タグ名を直接指定して比較
        if elem.tag == f'{{{namespace_uri}}}abctag':
            factorone = elem.get(get_tag_first,"").strip()
            factortwo = elem.get(get_tag_second,"").strip()
            factorthree = elem.get(get_tag_three,"").strip()
            f_out.write(f"{factorone}     {factortwo}     {factorthree}\n")
            elem.clear()

```

xmlファイルのサンプルがあれば良かったのですが、
ひとまず記録のためこんな感じで作成しました。

xxx、yyy、zzz　が取得したかった値が入っているタグ名です。
【2024年】今、Discord 開発言語は何がいいのか？

https://note.com/gamecast/n/ne5f69c208646

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13172054268

AIに相談したところ

```
Discord Bot開発において、PythonとJavaScriptは特に人気のある選択肢です。
Pythonはそのシンプルな文法と豊富なライブラリにより、
初心者でも扱いやすい言語として広く認識されています。特に、Discord用のライブラリであるdiscord.pyを使用することで、簡単にBotを作成することが可能です。
これにより、プログラミングの経験が少ないユーザーでも、
迅速にBotを開発し、運用することができます。 6 7

Pythonのもう一つの大きな利点は、豊富な情報源とコミュニティのサポートです。
多くのチュートリアルやサンプルコードがオンラインで入手可能であり、
これにより学習がスムーズに進むでしょう。
特に、Botの開発に関するリソースは充実しており、
初心者が直面する可能性のある問題に対する解決策も多く提供されています。
これにより、開発者は自信を持ってプロジェクトに取り組むことができます。
```

pythonで
Spring Security（認可設定）の備忘録

# はじめに
解体新書という書籍にて11章のSpring セキュリティの内容について学習中に
画面表示の認可（権限による画面表示の切り替え）が実現不能でした。
一般ユーザでも管理者限定にしているボタンが出現。。
ソースとしてはHTMLに記載を追加するのみでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041138/6aa665e6-1aad-288a-cdca-3336cff82dfb.png)

# ■menu.html
```java
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  layout:decorate="~{layout/layout}"
  xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
</head>
<body>
  <div layout:fragment="menu" class="bg-light">
    <ul class="nav nav-pills nav-stacked">
      <li role="presentation">
        <a class="nav-link" th:href="@{'/user/list'}">ユーザ一覧</a>
      </li>
      <li role="presentation" sec:authorize="hasRole('ADMIN')">
        <a class="nav-link" th:href="@{'/admin'}">アドミン専用</a>
      </li>
    </ul>
  </div>
</body>
</html>

```

# 問題点
サンプルソースと相違もなく原因が判明しなかった所、Qiitaで回答いただきました。

# 解決策
①ブラウザのデベロッパーツールでhtmlのソースを表示し、`sec:authorize="hasRole('ADMIN')"`という記述がそのまま残ってしまっているか確認。
②残っていることを書く確認したので次にpom.xmlにて指定している`thymeleaf-extras-springsecurity`周辺の依存関係を確認。
③`thymeleaf-extras-springsecurity5`から`thymeleaf-extras-springsecurity6`に変更
⇒この対応にて改善しました。（画面表示の認可（権限による画面表示の切り替え）が実現）

# 根本原因
`thymeleaf-extras-springsecurity5はSpring Security5`系統をターゲットとしているのに対し、[実際に依存関係に含まれているバージョンは6.3](https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/3.3.4/spring-boot-dependencies-3.3.4.pom)であったためでした。
ロードバランサー基礎の基礎[概要 + AWS]

最近、AWSを使ったインフラタスクを簡単なものから対応することが増えてきており、
その中で調べた内容などをまとめていこうと思います。
今回はロードバランサーについての基本概要についてまとめました。


# ⭐️ロードバランサーの一般的な概念

### 前提
複数のアプリケーションサーバーがあること。
（ロードバランサーから振り分けるので。）


### ロードバランサーは何をするの？
アクセスに対して、前提に書いた複数のアプリケーションサーバーへの振り分けを行います。
それによりサーバーの負荷を分散させ、高可用性を提供します。
ロードバランサーには仮想IPアドレスが割り当てられており、そこにアクセスがあると、そこから各アプリケーションサーバの状態（今ちょっと忙しいとか、負荷が低いとか）を考慮して、調子が良さそうなサーバーに振り分けます。

### ロードバランサーがもつ機能

* ロードバランサー自体を冗長化する
* パーシステンス(persistence)
    * 持続性。IPやクッキーで判定し、同じユーザーからのアクセスは同じサーバに振り分ける。
    * ユーザー側からすると、きちんとログイン情報などを維持することができる。
* ヘルスチェック
    * 振り分け先のアプリケーションサーバーが正常な状態かを確認し、問題のないサーバーのIPをリクエスト先に返します。


### DNSラウンドロビンとは？
ロードバランサーについて調べると、DNSラウンドロビンとの違いを説明している情報が多くありました。そのDNSラウンドロビンとは・・・

・ロードバランサーは使わず
・DNSサーバーが順にアプリケーションサーバーのIPアドレスを返し
・アクセスを分配する

というものです。
ヘルスチェックはせずに順番に対象のIPアドレスを返すので、たとえば障害の落ちているサーバーにも振り分けたり、セッションも管理しない異なるサーバーに振り分けることもあります。とにかく無心に振り分ける。


# ⭐️AWSにおけるロードバランサーとは？

EC2で設定可能です。左サイドのメニューから「ロードバランサー」を選び、右上の「ロードバランサーの作成」から確認できます。![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/d6fd7880-7be8-3bfd-86df-d842686dc229.png)
作成できるロードバランサーを選択します。ここで4種類のロードバランサーがあることを確認できます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/47314a00-7f5f-0029-e1cb-d4e05a2dc7a1.png)

### ✅ロードバランサーの種類

◼️Application Load Balancer（ALB）
◼️Network Load Balancer（NLB）
◼️Gateway Load Balancer（GWLB）
◼️Classic Load Balancer（CLB）

これらを総称してELB（Elastic Load Balancing）と呼びます。
それぞれの特性、詳細はこちら。
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/autoscaling-load-balancer.html

### それぞれのロードバランサーは、ざっくりとどんな時に使うものなのか？
以下のような認識でいるとよさそうです。

◼️ALB：HTTP/HTTPS トラフィックやルーティングが必要な場合。
Webアプリケーション（L7レベルのルーティングが必要な場合）の場合。

◼️NLB：低レイテンシ、非HTTP/HTTPSトラフィック、または固定IPが必要な場合。
高パフォーマンスかつL4レベルのトラフィック分散が必要な場合。

◼️GWLB：セキュリティ・トラフィック管理をしたい場合

◼️CLB：レガシーな設定での互換性が必要な場合。
ただし、基本的には新しいインフラには推奨されません。

### ◼️（もう少し噛み砕く）どのケースで、どのロードバランサーを選ぶべきか？

- **Webアプリケーション（L7レベルのルーティングが必要な場合）** → **ALB**（Application Load Balancer）を使用。
- **高パフォーマンスかつL4レベルのトラフィック分散が必要な場合** → **NLB**（Network Load Balancer）を使用。
- **古いシステムやシンプルな負荷分散が必要な場合** → **CLB**（Classic Load Balancer）を使用。新しいインフラには推奨されません。

| 特徴 | ALB（Application Load Balancer） | NLB（Network Load Balancer） | CLB（Classic Load Balancer） |
| --- | --- | --- | --- |
| OSIモデル層 | L7（アプリケーション層） | L4（トランスポート層） | L4/L7 |
| 対応プロトコル | HTTP、HTTPS、WebSocket | TCP、UDP、TLS | HTTP、HTTPS、TCP |
| ルーティング | 高度なルーティング（パス、ヘッダー） | シンプルなポートベースのルーティング | 基本的なラウンドロビン |
| WebSocket対応 | あり | なし | なし |
| コンテナ対応 | あり | あり | なし |
| 高スループット | 中程度 | 高い | 中程度 |
| 固定IPアドレス | なし（ALBはDNSベース） | あり（Elastic IPが使用可能） | なし |


 -------
 
今までの認識としては「サーバーアクセスを平均的に振り分けて負荷を平均化する」くらいものでしたが、概念をまとめてみて、少しだけ理解ができたと思います。


# ◼️参考記事

https://aws.amazon.com/jp/elasticloadbalancing/getting-started/?pg=ln&sec=hs

https://www.softbank.jp/biz/blog/cloud-technology/articles/202207/aws-loadbalancer/

https://it-trend.jp/server_application_management/article/114-0008
日本語テキスト埋め込みベンチマークJMTEBのpoetry installでInstalling torch (2.3.1): Failed

# はじめに
日本語テキスト埋め込みベンチマーク[JMTEB](https://github.com/sbintuitions/JMTEB)のクイックスタートで発生したエラーとその解決方法のメモです。

# 対象
- python3.13をインストールしているシステム
# エラーと解決方法
クイックスタートに沿ってpoetry installを実行すると、以下のエラーが出ました。

```
Installing torch (2.3.1): Failed
```

poetryが使用するpythonのバージョンを確認すると3.13でした。

```
poetry run python -V
# output: Python 3.13.0
```

torchはpython3.13に対応していないらしいので、pythonを3.12にして、torchのバージョンを2.2に落とすことで、poetry installが通るようになりました。

```
git clone git@github.com:sbintuitions/JMTEB
cd JMTEB
pyenv install 3.12 #3.12がシステムにインストールされていない場合のみ行う
poetry env use 3.12 # pythonを3.12
poetry add torch@~2.2
poetry install
```

# 補足
## 環境
- M1 macOS
- python3.13をシステムにインストール済み

## エラー
githubのQuickStartのコマンドを実行すると、poetry installでエラーになります。
```
git clone git@github.com:sbintuitions/JMTEB
cd JMTEB
poetry install
```

エラー全体は長いので省略しますがtorch==2.3.1のインストールに失敗している記述があります。

```
Installing torch (2.3.1): Failed
```

## なぜ最初にpython3.13が使われたのか
pyproject.tomlにて、pythonのバージョンは3.10以上4未満であることが指定されており、poetryはこの条件を満たし、かつ、システムにインストールされたなかで最新のpythonを使用するためです。

```toml:pyproject.toml
[tool.poetry.dependencies]
python = ">=3.10,<4.0"
torch = "^2.3"
```

## なぜpython3.12にしてもtorch 2.3.1だとうまくいかないのか
よくわかりません。
ただ、torchがインストールできない場合にtorchのバージョンを下げるとうまくいくという[事例](https://qiita.com/toku-kou8/items/196a5ef0ded4ea1b46e3)があったので、試しに2.2にしてみたところうまくいきました。
評価は2.2でもできているので、これでもよさそうです。
何重にも条件分岐する話

条件は3つ。
１，未ログインユーザーは編集、更新、削除ページに入るとログインページにリダイレクトされて
２，編集、更新、削除ページにいくとトップページに遷移されて
３，ログイン済みであっても商品出品者(@item.user)ではない場合はトップページにリダイレクトされる


```
Class ItemsController < ApplicationController
  before_action :authenticate_user!, only: [:edit, :update, :destroy] # 未ログインユーザーはログインページにリダイレクト
  before_action :move_to_index, only: {:edit :update, :destroy]　3アクションはmove_to_index実行

中略

def move_to_index
    return unless current_user == @item.user　# ログイン済みでも出品者でない場合はトップページにリダイレクト
    redirect_to root_path
end  
  ```
  実際はこれにもう一つ条件分岐がさらに重なったものでした。
  こんがらがってしまいました。
uvでプロジェクト管理して、ReflexでPlotlyグラフアプリをつくる

最近、個人的に大注目のuvとReflexを紹介します。

## uv

[uv](https://github.com/astral-sh/uv)はPythonのプロジェクトを管理するツールです。これまで似たようなツールで、pipenv、venvを使ってきましたが、uvは一番使い心地がよく気に入っています。

Pythonのバージョン管理もできるし、ライブラリのインストールは早いし、アプリの実行のために仮想環境に入らなくてもいいしで、いいことづくめです。

## Reflex

[Reflex](https://reflex.dev/)はwebアプリをPythonだけで作れる、React(JavaScript)のようなライブラリです。(実際にReactコードに変換しています)
webアプリのパーツとその状態をモジュール化できます。Pythonistのみなさんも、Pythonの関数を作るようにパーツを作って、パーツを組み合わせることでwebアプリを簡単に作れるのではないでしょうか。

今のところホットリロードが少し遅かったり、Windowsでは謎フリーズが起こったりと、フラストレーションがたまることもありますが、コンセプトは非常に面白いので今後流行っていくんじゃないかなと思っています。

# グラフアプリ製作

今回はuvを使ってReflexプロジェクトを作成し、簡単なグラフアプリを作ってみたいと思います。
作るものは以下のような、ボタンを押すとYの値がランダムに変わるだけのアプリです。

![Screen recording 2024-11-01 23.34.48.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591762/35460479-6420-21b8-c8ae-d7dd23b626de.gif)

あらかじめuvだけは公式サイトを見てインストールしておいてください。

まずはuvでプロジェクトを作って、プロジェクトのディレクトリに入ります。ついでに不要なhello.pyも削除しておきましょう。

```bash
uv init my-awesome-app
cd my-awesome-app/
rm hello.py
```

次にReflexをプロジェクトにインストールします。uvのおかげで、インストールがすごく早いです。

```bash
uv add reflex
```

インストールしたReflexのコマンドラインツールを使って、プロジェクトを初期化します。仮想環境をアクティブにしなくても、uvコマンドを使えばプロジェクト内にインストールされたツールを直接実行できます。

```bash
uv run reflex init
```

使用するテンプレートを聞かれるので、とりあえず今回は0(blank)を選んで実行しましょう。
この時点ですでにwebアプリができているので、一度動作確認をします。

```bash
uv run reflex run
```

すると、初回は必要なパッケージなどがインストールされるため少し時間がかかりますが、webアプリが起動します。
手元のパソコンで実行しているなら、http://localhost:3000 にアクセスするとアプリが確認できるはずです。

これだけで十分にuvとReflexの魅力は伝わったかもしれませんが、最後にPlotlyを使ったグラフアプリを作ります。
Reflexはデフォルト状態でPlotlyの描画パーツを使えますが、plotlyの関数は使えないので、uvでplotlyをインストールします。

```bash
uv add plotly
```

そして、my_awesome_app/my_awesome_app.pyを以下のように修正します。

```python
import random

import reflex as rx
import plotly.graph_objects as go


class State(rx.State):
    """The app state."""
    x: list[int] = [1, 2, 3, 4, 5]
    y: list[float] = [random.random() for _ in range(5)]
    fig: go.Figure = go.Figure(
            data=go.Scatter(
                x=x,
                y=y,
                mode='markers',
                )
            )

    def change_y(self) -> None:
        self.y = [random.random() for _ in range(5)]
        self.fig = go.Figure(
                data=go.Scatter(
                    x=self.x,
                    y=self.y,
                    mode='markers',
                    )
                )


def index() -> rx.Component:
    return rx.container(
        rx.vstack(
            rx.plotly(data=State.fig),
            rx.button(
                "Change Values",
                on_click=State.change_y,
                ),
            justify="center",
            align='center',
            min_height="85vh",
        ),
    )


app = rx.App()
app.add_page(index)
```

注意点としては、ライブラリをつかった複雑な計算などは、rx.Stateを継承したクラス内のメソッド(今回はchange_y)に書くこと。計算した結果は、クラス変数 State.figに入れて、グラフ描画用のパーツ(rx.plotly)の引数dataに渡すことで、ユーザーが見えるような状態になります。

あとはReactのように、パーツ内の引数でレイアウトを整えて完了です。

ホットリロードがうまくいかないようでしたら、ctrl-Cで一度停止して、再度

```bash
uv run reflex run
```

を実行しましょう。Reflexが必要なツールを自動でインストールして、サーバーが起動します。

---

いかがでしたか。興味がわいた方がいらっしゃったら嬉しいです。
RUBYのアクセサメソッドについて

![スクリーンショット 2024-11-01 231941.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921010/9f5ba6e3-9c20-c475-b868-e60cb35ee14a.png)
RUBYではsetterメソッドとgetterメソッドを上記のように書くことができる。
![スクリーンショット 2024-11-01 232517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921010/ebdd5b2b-11e7-10e9-4146-97ba6b045efb.png)
上記のようにattr_accessorメソッドを使うことによりsetterメソッドとgetterメソッドを使うと長くなってしまうコードを同じ意味で上記のようなスマートなコードで書くことができます。
![スクリーンショット 2024-11-01 233120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921010/a00f54a5-a533-5756-42f4-18e0cf2bc7e1.png)
また、インスタンス変数の内容を読み取りにしたい場合はattar_accessorの代わりにattar_readerメソッドを使うことにより実現できます。
![スクリーンショット 2024-11-01 233525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921010/65bb2b92-040f-4c7a-fbc4-bd388d6ae23f.png)
書き込み専用にしたい場合はattar_writerメソッドを使い上記のように書くことができます。
![スクリーンショット 2024-11-01 233849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921010/2c02603e-1880-dbc8-4fe2-70bd8e61fbe1.png)
カンマで複数の引数を渡すことにより複数のインスタンス変数に対するアクセサメソッドを定義することができます。
AWS CLI 初心者向け コマンド一覧

# すべての登録済みEC2インスタンスを取得（us-east-1リージョンの場合）:
```
aws ec2 describe-instances --query "Reservations[*].Instances[*].InstanceId" --region us-east-1
```

# 起動中（running）のEC2インスタンスのみ取得（us-east-1リージョンの場合）:
```
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].InstanceId" --region us-east-1
```
ZipArchive使用時のclose()エラーを解消「ZipArchive::close(): Failure to create temporary file: Permission denied」

## 概要
LaraveでWebApp作成時、Zip化する際にZipArchiveというライブラリを使ったのですが、
タイトルのエラーで詰まったので原因・対策を記載してます。

## ZipArchiveの使用準備
ZipArichiveを使用する際は、phpでzipを扱うライブラリを取り込んでおく必要があります
私の場合は、以下コマンドでphp-zipをインストールしましたが、他ライブラリもあるみたい
```
sudo yum install php-zip
```

## Zip化ソース
以下のようにzip化のコーディングを行った

同階層の"compress.zip"に対して、"test.csv"をaddする
流れとしてはopen->addFile->closeといった感じ

zip化したファイルがブラウザから取得できるようレスポンスで返した
```
// インスタンス
$zip = new ZipArchive();

// zipファイルをオープンする
$zipPath = './compress.zip';
$result = $zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE);

if ($result == true) {
    // zipオープン成功時、csvファイルをzipに格納
    $compressFile = 'test.csv';
    $zip->addFile($compressFile);
    $zip->close();
} else {
    // エラーレスポンスを返す
    return response()->json(['error' => 'File not found.'], 404);
}

// 作成したzipをレスポンスで返す
$headers = [
    'Content-Type' => 'application/zip',
    'Content-Disposition' => 'attachment'
];
return response()
    ->download($file, 'test.zip', $headers)
    ->deleteFileAfterSend(true);
```

## エラー発生
この処理をブラウザで実行した際に以下エラーが出た
```
ZipArchive::close(): Failure to create temporary file: Permission denied
```
どうやらファイルを作るのに、パーミッションではじかれてるみたい...
ただ不思議なことにzip化処理をphpファイルに書いてサーバー上で実行した場合はうまくいってる

エラー文で調べるもなかなか解決にいたらず、海外のQAを漁ると以下の文章が目に入る

https://stackoverflow.com/questions/42739599/ziparchiveclose-renaming-temporary-file-failed-permission-denied
>As the error tells you, this is a permission problem. Make sure the apache user (www-data) has the write permission on the directory where the zip archive is.

apache userが書き込み権限を持ってないディレクトリを扱う際、このエラーがおきるらしい
あー、確かにWebサーバのuser権限とか全然いじってない...
phpでうまくいってたのはそういうわけかとやっと納得


というわけで'test.zip'があるディレクトリの権限を変更した
僕の環境の場合apache userは`www-data`でなく、`apache`だった
```
chown -R apache:apache [path-to-test.zip]
```
ブラウザからのzip化処理も無事成功
ただしwebユーザしか該当ディレクトリが編集できなくなるので注意

## まとめ
ブラウザからのZipArchive処理でPermission deniedが出た場合は、対象のディレクトリが
Webサーバのユーザ権限が付与されてるか確認すること
Python Pandas入門：データフレームの基本的な作成方法

PythonのPandasライブラリはデータの操作や解析に非常に便利なツールで、特にデータフレームを使ったデータ管理は非常に直感的です。

### Pandasのインストール

PandasはPythonのパッケージ管理ツールであるpipを使ってインストールできます。

```bash
pip install pandas
```

### Pandasのインポート
まず、Pandasをインポートします。Pandasはデータ操作に必要な関数が多く含まれているため、データ分析には欠かせません。

```python
import pandas as pd
```

### データフレームの基本的な作成方法
データフレームを作成するには、まずPythonの辞書やリストを使ってデータを構造化します。以下のように、各列のデータを辞書で定義し、pd.DataFrame()を使ってデータフレームに変換できます。

```python
import pandas as pd

# サンプルデータを辞書で定義
data = {
    '名前': ['田中', '佐藤', '鈴木', '高橋'],
    '年齢': [28, 22, 35, 40],
    '職業': ['エンジニア', 'デザイナー', 'データサイエンティスト', 'マネージャー']
}

# データフレームの作成
df = pd.DataFrame(data)
print(df)
```

```text
   名前  年齢       職業
0  田中  28   エンジニア
1  佐藤  22   デザイナー
2  鈴木  35 データサイエンティスト
3  高橋  40   マネージャー
```

### 別のデータ構造からデータフレームを作成する
Pandasでは、辞書以外のデータ構造（リストやNumPy配列など）からもデータフレームを作成できます。例えば、リストのリストを使ってデータフレームを作る方法を紹介します。

```python
import pandas as pd
# リストのリストからデータフレームを作成
data = [
    ['田中', 28, 'エンジニア'],
    ['佐藤', 22, 'デザイナー'],
    ['鈴木', 35, 'データサイエンティスト'],
    ['高橋', 40, 'マネージャー']
]

# 列名を指定してデータフレームに変換
df = pd.DataFrame(data, columns=['名前', '年齢', '職業'])
print(df)
```

```text
   名前  年齢           職業
0  田中  28        エンジニア
1  佐藤  22        デザイナー
2  鈴木  35  データサイエンティスト
3  高橋  40       マネージャー
```

### データフレームの初期設定を指定する
データフレームの作成時に、行や列にラベルを追加するなどの初期設定も可能です。以下は、行インデックスをカスタマイズしてデータフレームを作成する例です。

```python
import pandas as pd

# リストのリストからデータフレームを作成
data = [
    ['田中', 28, 'エンジニア'],
    ['佐藤', 22, 'デザイナー'],
    ['鈴木', 35, 'データサイエンティスト'],
    ['高橋', 40, 'マネージャー']
]

# 行インデックスを指定してデータフレームを作成
df = pd.DataFrame(data, columns=['名前', '年齢', '職業'], index=['A', 'B', 'C', 'D'])
print(df)
```

```text
    名前  年齢       職業
A   田中  28   エンジニア
B   佐藤  22   デザイナー
C   鈴木  35 データサイエンティスト
D   高橋  40   マネージャー
```

### まとめ
Pandasを使ったデータフレームの作成方法について基本を解説しました。データフレームはさまざまな形式のデータを統一的に扱うことができ、データ分析の基礎的な操作をスムーズに進められます。


https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html
視差を可視化するモジュールを作ってみた

ステレオ計測結果を利用しようとすると、実行結果の可視化が重要になる。

そこで、ライブラリを作ってみたので紹介する。

![](https://github.com/katsunori-waragai/disparity-view/raw/main/test/test-imgs/normal/normal_left_motorcycle.png)
利点：面の向きがわかるので、同程度の深度の領域での微細な構造がわかる。シェーディングを強調したようなもの

![](https://github.com/katsunori-waragai/disparity-view/raw/main/test/test-imgs/gif/reproject_left_motorcycle.gif)
利点：
視点位置が連続的に変わることで、空間の認識がしやすくなる。点群としての位置がおかしいときには、違和感を感じやすくなる。

使用例

この記事の中では、なぜこのような表示用のライブラリを作ったのかを述べます。


# 作った理由
## 表示をなんとかしたい
- 最新のステレオ計測のアルゴリズムを使いたい。
- ステレオ計測で算出した結果を表示するいい方法がほしい。
- グレースケール画像：
 よくわからない
- colormap　画像：
![](https://github.com/katsunori-waragai/disparity-view/raw/main/test/test-imgs/disparity-IGEV/left_motorcycle.png)
 他の実装と比較で必要になる。
 でも、精度が出ているのかどうかわからない。
  物体の輪郭は視認しやすい。ケーブルのように細い領域でも視認しやすい。しかし、ほぼ同じ色に見えてしまっている領域での変化に気づきにくい。エンジン付近の凹凸も、シートの曲面も、タイヤの曲面も視認することができない。
- 点群データを保存して、あとでじっくり見たい
- 再投影画像で確認したい。
- 少しづつ視点を動かして、見え方の変化で確認したい。    

## アルゴリズムが変わっても同じ表示方法で表示したい。
- アルゴリズムごとに、表示部分をメンテナンスするのは避けたい。
- もっと楽をしたいよ！

## きっと、みんな困っているよね。
- 少なくとも、私は困っている。

## もくろみ
視差計算の結果を、どのようなステレオ計測ライブラリでも表示に使える。
- Ubuntu PC、Jetson AGX Orinの両方で同様に動作する。
- pip でインストールできるようにする。（作業中）

## 公開するインタフェースは最低限に
- このモジュールの開発の中で、実装を大きく変化させてきた。
- それでも、公開するインタフェースをごくわずかにとどめたので、利用する側のコードをほとんど変えなくて済むようにしている。
- モジュール内の`__init__.py` ファイルに記述するのを最小限にすることで、公開する範囲を最小限にしている。

#### 開発の初期にありがちなこと
- 利用するライブラリの使い方がわかっていない。
- そのため、試行錯誤を必要とする。
- 作り上げたライブラリの使い方が、どういう使い方をしたいのかがわかっていない。
- 自由度を最大限に設定すべきなのか、特定の使い方だけを確実にこなせるようにするのがいいのか
- 間違えた入力が入ってきたときに、どう対応するのか。
- 無理やりつじつまを合わせるのか、異常終了させるのか


## 公開先
https://github.com/katsunori-waragai/disparity-view
実装言語： python3
### 達成したこと
- 視差データを元に可視化する。
- npyファイルで保存してある視差データを読み込める。
- Open3Dを使って投影画像を作成する。


# 最後に
自分がほしいものが、公開されている実装に見つからなければ、作るしかないでしょ。
使ってなかったAWSが無料枠超過アラートを出して焦った話

# 事象
少しの間AWS使っていなかったのですが、無料枠終わるよ！というアラートメールが来ました。
内訳を見たところVPCとEC2の利用時間が無料枠を超える勢いでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194659/d43f28ba-1a6e-70d4-b2aa-f871b783f6f4.png)


ここ最近忙しいので、さっさと解決しようとEC2を除いてみるも何もいない…。
理由は単純だったのですが、焦っていた自分は少し解決に時間がかかってしまいました。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194659/1b84e769-3478-5d84-c888-34a20ec8f0f7.png)

# 原因
見てるリージョン間違えてる！というのが原因でした。
リージョンを東京に変更してEC2を除くと何かいました。

かるーくですが調べてみたところ、どうやらAWSの無料枠について変更があったみたいですね。
同じ事象で困っている方など参考になれば幸いです。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194659/d6fc77eb-d6bb-e8f4-0e56-db9e63b81103.png)
CSSを学びたい Step5

## はじめに
CSSを学びたいStep5です！今回はmediaクエリでレスポンシブな対応を実施します！
スマホやタブレット、デスクトップに応じてレイアウトの段組みを変えるのに便利です！

## 成果物

![step5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/374048eb-42f7-39dc-76bd-3b16015c5e84.gif)

## ソースコード
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Grid Layout Example</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="card-container">
        <div class="card">カード1</div>
        <div class="card">カード2</div>
        <div class="card">カード3</div>
        <div class="card">カード4</div>
        <div class="card">カード5</div>
        <div class="card">カード6</div>
    </div>
</body>
</html>
```

```css:styles.css
body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    background-color: #e0f7fa;
  }
  
  .card-container {
    display: grid;
    gap: 16px;
    padding: 16px;
    width: 100%;
    max-width: 1000px;
  }
  
  /* デフォルト（モバイルサイズ）では1列 */
  .card-container {
    grid-template-columns: 1fr;
  }
  
  /* タブレットサイズ（600px以上）では2列 */
  @media (min-width: 600px) {
    .card-container {
      grid-template-columns: repeat(2, 1fr);
    }
  }
  
  /* デスクトップサイズ（900px以上）では3列 */
  @media (min-width: 900px) {
    .card-container {
      grid-template-columns: repeat(3, 1fr);
    }
  }
  
  .card {
    background-color: #fff;
    border: 1px solid #ddd;
    border-radius: 8px;
    padding: 20px;
    text-align: center;
  }
```
ベストなバスルームデザインのアイデア

プロが語る！理想的なバスルームデザインの秘訣
ここを訪れてください:https://fhatexasinfo.com/

バスルームは、一日の始まりと終わりを過ごす場所です。リラックスし、リフレッシュするための空間として、快適で機能的なデザインが求められます。フリーランサーとしてバスルームデザインに携わる私が、お客様の要望に応じた理想の空間を実現するために大切にしているポイントをお伝えします。

![interior-bathroom_932514-56430.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890671/f2a94423-e0ff-9f27-03b0-f7a3cc6fe01f.jpeg)


1. スペースの有効活用
 
狭いスペースを最大限に活用することは、バスルームデザインの醍醐味です。小さなスペースでも、収納と機能性を兼ね備えた設計を心がけています。例えば、キャビネットの上部を棚として活用したり、壁面に取り付ける収納を導入することで、清潔感を保ちつつ必要なものを手に取りやすくします。

2. 光と色の活用

バスルームの印象は、照明や色使いによって大きく変わります。明るいライトや温かみのある色を取り入れることで、リラックスできる空間を作り出します。さらに、鏡やガラスを活用することで空間を広く見せるテクニックも効果的です。

3. 防水と耐久性
 
水に触れる場所だからこそ、防水性と耐久性は欠かせません。素材選びには特に気を配り、タイルや防水性の高い壁材を使用します。また、湿気対策として換気システムの設置も重要です。長く使えるバスルームをデザインするために、素材と設備の品質にはこだわりましょう。

4. お客様のライフスタイルに合わせたデザイン
 
デザインの美しさも大切ですが、最も重要なのはお客様のライフスタイルに合った使いやすさです。例えば、小さなお子様がいるご家庭には、安全性を考慮した設計が求められますし、高齢者向けには手すりの設置や滑りにくい床材を提案します。細かなニーズに応じたカスタマイズが、快適なバスルームを実現する鍵です。

まとめ

バスルームデザインは、見た目だけでなく機能性と耐久性、そして居心地の良さを兼ね備えた総合的なアプローチが必要です。プロフェッショナルとしての視点を活かし、お客様が一日の疲れを癒せる理想的な空間を提供することを目指しています。