OmniAICreator/Qiita-1.07M huggingface dataset:
Createやv0で使える「日本語コーディングプロンプト」

自然言語でWebサイトが作れるサービスは便利な反面、ブレやすいのがネックです。そのネックを解消するため、HTMLのようなプロンプトを考案しました。「（川合式）日本語コーディングプロンプト」と呼んでいます。例はCreateを使っていますが、v0でも同じような出力になると思います。

# Createの出力結果
コードのようにプロンプトを書くことで、出力結果のブレが最小限におさえることができます。
![GYsuUjRacAAoJjR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667780/29b565fe-e75f-06da-5644-56cd58cb9df5.jpeg)

# Cursorでプロンプトを作成
補完やテキスト生成・修正をしてくれるので、プロンプトを書くならCursorが便利です。
![GYsuUjVaAAAaJKt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667780/55b5d222-6a8b-f0b9-8e56-40716dd4a5ff.jpeg)




# プロンプト
下記をコピペして試してみてください。
```
---html---
<container>
<box>
<maincopy-containar>
<maincopy>
あなたは<br/>AIで救えるか？
</maincopy>
</maincopy-containar>
<subcopy>
明日のプレゼン資料、<br/>まだ何もできてない...
</subcopy>
<footer>
<date>2024/10/25</date>
<cta>結末はSHIFT AI会員限定ウェビナーをチェック！</cta>
</footer>
</box>
</container>

---css---
#container =
##レイアウト：センター
##幅：100%
##高さ：100%

#maincopy-containar =
##背景：上から下に透けていく黒いグラデーション
##配置：上から0px
##幅：800px
##高さ：320px

#maincopy =
##色：白
##フォント：セリフ体
##フォントサイズ：80px
##行間：96px
##配置：上から40px、左右センター
##文字組：センター揃え

#subcopy =
##フォント：セリフ体
##レイアウト：上から304px、右から64px
##色：白
##フォントサイズ：24px

#box =
##背景画像： image_fx_ (2).jpg
##画像サイズ：ボックスに合わせる
##画像のアスペクト比は固定
##幅：800px
##高さ：800px

#footer =
##幅：800px
##背景：黒からモスグリーンのグラデーション
##高さ：80px
##配置：下部
##パディング：24px

#date =
##枠：白、線幅2px
##色：白
##フォントサイズ：32px
##パディング上下：-2px
##パディング左右：8px

#cta =
##色：白
##ウエイト：ボールド
##フォントサイズ：24px
```

# チャットで進めたい方向け
チャットで雑に対話しながら作りたい人向け。Webサイトが完成したら、議事録を残すように、「日本語コーディングプロンプト」にまとめましょう。チャットで下記をペーストするだけでプロンプトにしてくれます。

### チャットでWebサイトを作り始める
![GYpXyj2asAAQXK7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667780/99c645d1-9346-df09-ebcd-dc1135f9c838.jpeg)

### 「日本語コーディングプロンプト」にまとめる
![GYpYKuLbQAAi3ae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667780/92949da4-2d60-2d35-c913-f6416f082c7a.png)

### ↓コピー用
```
このサイトを完全に生成するためのプロンプトを作成してください。
下記の形式に沿ってください。文字情報も、デザインも全て再現できるようにしてください。

---html---
<container>
    <section>
    </section>
</container>

---css---
#section = 
    ##色：白
    ##フォント：セリフ体
    ##フォントサイズ：80px
    ##行間：96px
    ##配置：上から40px、左右センター
    ##文字組：センター揃え
    ##フォントスタイル：通常
    ##フォントウェイト：通常
    ##テキストアライン：センター
    ##テキストシャドウ：なし
    ##マージン：0
    ##パディング：0
    ##テキストトランスフォーム：なし
    ##ホワイトスペース：ノーマル
    ##オーバーフロー：隠す
    ##ディスプレイ：ブロック
    ##ボーダー：なし
    ##背景色：透明
```
詳細は以下のポストで紹介しています。
https://x.com/kawai_design/status/1840382024856785075
ChatGPTを使用してWeb埋め込みのゲーム(ブロック崩し)を作ろうとした話

## 初めに
ポートフォリオサイトを作成したものの、制作物がまだなく寂しい状態でした。
そこで、ChatGPTを使用して一度制作物を仕上げ、その過程やレビューを行うことにしました。
これを通じて、自分のスキルを向上させるとともに、ポートフォリオサイトにコンテンツを追加していきたいと考えています。

## 目的
プログラミングの知識がほとんどない状態から、ゼロからの制作や模倣サイト・アプリの作成、YouTubeを参考にした制作方法も考えました。
しかし、具体的に作りたいアイデアがあったため、それを形にした後にその過程を紐解いていく方法を選ぶことにしました。

作成したものについては探せばありふれたものかもしれません。その点についてはご了承ください。


## 作ってみた感想
CodeCopilotが良いという情報を見つけたため、そちらを使用しました。
また、無課金プランでは機能に制限があることが分かったため、今後も使用することを考慮し、ChatGPTに課金することにしました。

## 制作物
ポートフォリオサイトの下記ページに作成しました。

https://ivory880547.studio.site/2

デスクトップでゲームを作成し、投稿サイトにアップロードした後、そのリンクを貼る形でも良かったのですが、ポートフォリオサイトとしてStudioを使用していました。
そのため、ファイルを1つにまとめたいという意思をGPTに伝えたところ、HTML内で完結する形にできました。その結果、そのままこちらに載せることにしました。
このやり方が正しいかはわかりませんが・・・

## 難しかったところと今後の勉強に生かしたいところ
* **画面サイズの設定**
大/中/小の画面でプレイできるようにしたかったが、HOMEに戻るボタンが押せなくなったため、画面を1つにまとめた。
→コードが読めるようになれば何が原因でどう修正すればいいか分かる様になるはず。
* **リトライボタンの問題**
リトライボタンが押せず、画面が進まない状態になった。
→上と同じ
* **玉の速度リセットの不具合**
操作板に玉が当たるごとに加速する条件を設定したが、リトライ時に玉の速度がリセットされない問題が発生した。
→上)(ry
* **難易度緩和の情報リセット**
クリア後に難易度緩和（操作板の幅）の情報がリセットされない問題があった。
→(


## 終わりに
出力されたコードが何を示しているのか分からないと、結局は一切理解できていないということに気づきました。
当たり前ですね。完全にブラックボックスで作業している状態でした。

ただ、このブロック崩しゲームを0から手書きで模索しながら作成していたとしたら、1か月、いやもっと時間がかかっていたと思います。

手打ちでの作成が経験的には良さそうなので、やはりGPTに生成したもらったコードのコピペではなく、自分でコードを見て理解した上で作業を進めていこうと考えています。

また、SNSでは自分は見る専でしたが、自身の振り返りにもなるため、発信することの重要性を身に染みて感じています。

この経験を通じて、まずはステップバイステップで進むこと、そしてとりあえず1歩踏み出すことが大事だと改めて痛感しました。
できないことを恥じない姿勢を持つことで、わからなくてもチャレンジする勇気が生まれ、新たな学びや成長につながると実感しています。これからも、自分の限界を広げるために積極的に挑戦していきたいと思います。

いずれはUnityを用いて作品を作成し、アップロードしたサイトのリンクを載せられればと思っています。
また、この経験が誰かの後押しになればいいなとも思っています。

## 現状として
結局今のところは作られたものの中身なんもわからん。
1日でサクッと作れるこの時代に感謝。

今回のと関係ありませんが、記事を書いていればマークダウンも徐々に覚えきますね。必要なものだけですがｗ
ちなみに、文章力に自信がないため、この記事を含めてずっとAIに添削してもらっています。
それでも変な文章になっていたら、ご了承ください。

## 参考
今回はChatGPTに全て投げて作成したため参考にしたものはございません。
C言語　静的ライブラリと動的ライブラリの違い、作り方

# はじめに
初めまして、42TokyoでC言語を学んでいる学生です。静的ライブラリと動的ライブラリってどういう違いがあるの？それぞれどんなメリットがあるの？という質問に答えられなかったので、調べました。

# 静的ライブラリと動的ライブラリの違い
### 静的ライブラリ
・コンパイル時に実行ファイルに組み込まれるライブラリ
・実行ファイルが単体で動作可能
・通常lib*.aという形式で命名される。

#### メリット:
・実行時に外部のライブラリを必要としないため、環境に依存しにくい。
・実行速度が速い傾向

#### デメリット:
・実行ファイルのサイズが大きくなる。
・ライブラリを更新したい場合、実行ファイル自体を再コンパイルしなければならない。
・複数のプログラムで同じライブラリを使用する場合、各実行ファイルに同じコードが重複して含まれてしまう。

### 動的ライブラリ
・実行時にOSによってロードされるライブラリ
・実行ファイルは、動的ライブラリへの参照を含んだ状態
・lib*.so (Linux) や lib*.dylib (macOS) といった形式で命名される。

#### メリット:
・実行ファイルのサイズが小さい。
・ライブラリを更新する場合、実行ファイルを再コンパイルせずに、動的ライブラリファイルを置き換えるだけで済む。
・複数のプログラムで同じ動的ライブラリを共有できるため、ディスク容量を節約できる。

#### デメリット:
・実行時に動的ライブラリが見つからないと、プログラムが正常に動作しない。
・静的ライブラリに比べて、実行時にわずかにオーバーヘッドが発生する可能性がある。

# 静的ライブラリと動的ライブラリのどちらを選ぶべきか

### 静的ライブラリを選ぶ場合:
・特定の環境でしか動作しないプログラム
・実行速度を優先したいプログラム
・ライブラリを頻繁に更新しないプログラム

### 動的ライブラリを選ぶ場合:
・複数のプログラムで共有したいライブラリ
・ライブラリを頻繁に更新する可能性があるプログラム
・実行ファイルのサイズを小さくしたいプログラム

# 静的ライブラリと動的ライブラリの作り方

## 静的ライブラリの作成
### 1.オブジェクトのファイル作成
my_function.cというソースファイルをコンパイルし、オブジェクトファイルmy_function.oを作成します。
```
gcc -c my_function.c -o my_function.o
```
### 2.オブジェクトのファイル作成
my_function.oをアーカイブし、静的ライブラリlibmylib.aを作成する。arはアーカイブを作成するコマンドで、rcsオプションは、ライブラリを作成し、既存のメンバーを置き換えることを意味する。
```
ar rcs libmylib.a my_function.o
```

### 3.プログラムへのリンク
main.cをコンパイルし、libmylib.aをリンクして実行ファイルmainを作成する。-L.オプションは、カレントディレクトリをライブラリ検索パスに追加し、-lmylibオプションは、libmylib.aをリンクすることを意味する。
```
gcc main.c -L. -lmylib -o main
```

## 動的ライブラリの作成
### 1.オブジェクトのファイル作成
my_function.cというソースファイルをコンパイルし、オブジェクトファイルmy_function.oを作成します。
```
gcc -c my_function.c -o my_function.o
```

### 2.動的ライブラリの作成
my_function.oを共有ライブラリlibmylib.soとして作成する。-sharedオプションは、共有ライブラリを作成することを指定し、-fPICオプションは、位置非依存コードを生成するためのオプションとなる。
```
gcc -shared -fPIC my_function.o -o libmylib.so
```

### 3.プログラムへのリンク
```
gcc main.c -L. -lmylib -o main
```
~~# 余談~~
~~C言語でprintf関数を使う時に記述する~~
~~#include \<stdio.h>~~
~~動的ライブラリ？が読み込まれている？それとも静的ライブラリ？が読み込まれている？と疑問に思い、調べてみたら、通常動的ライブラリが読み込まれているみたいですね。~~
解釈が間違っていたので、削除いたしました。2024/10/11 21:30
AWS CloudTrailのJSON確認とEventBridgeを活用した詳細なイベントキャプチャ手法

# CloudTrailのJSON確認方法とEventBridgeでのイベントキャプチャ手法
EventBridgeは、AWSサービスやカスタムアプリケーションからのイベントを受け取り、指定したターゲットにルーティングするサービスです。CloudTrailと組み合わせることで、特定のイベントが発生した際に自動的に処理を行えます。
AWSリソースの変更やAPIコールをトリガーとしてEventBridgeで検出する場合、CloudTrailのJSONイベントを使用します。しかし、CloudTrailのコンソール画面での確認だけでは十分でないことがあります。
そこで、より詳細な条件でのイベントキャプチャ方法について解説します

### 使用するリソース
1. CloudTrail
1. Eventbridge
1. Lambda
1. CloudWatch Logs

## Lambdaの作成
Lambda関数内でイベントデータをログに出力することで、どのようなイベントがキャプチャされているかを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/3c9b61a3-ae55-5181-e565-98d357f34aca.png)

```python
import json

def lambda_handler(event, context):
    print(json.dumps(event))
    return {
        'statusCode': 200,
        'body': json.dumps('Event received')
    }
```
## EventBridgeのイベントパターンを作成する
下記の例は「AWS コンソールへのログイン（ConsoleLogin イベント）が発生したとき」にトリガーするイベントパターンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/4f78890d-0d7f-a293-e177-d7342ff82c59.png)

```JSON
{
  "source": ["aws.signin"],
  "detail-type": ["AWS Console Sign In via CloudTrail"],
  "detail": {
    "eventName": ["ConsoleLogin"]
  }
}
```

## EventbridgeとLambdaを連携させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/a646d3c7-08ff-e988-c88d-d64103227b5b.png)


上記のEventbridgeの条件のイベントをトリガーにして、LambdaにJSONが出力されます。
その確認方法としてCloudWatch LogsでLambda関数のログを確認しにいくと、イベントの内容のJSONを詳細に把握できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/f1943ed3-2c0e-40e0-8b76-a064b3a47556.png)

## 詳細な設定を行う場合のイベントパターンの例
出力されるJSONが確認できたら、特定のイベントが出た場合にEventbridgeのイベントパターンに引っ掛けることも可能になります
下記は、アカウントID、IPアドレスなどのを指定した場合の例
```JSON
{
  "source": ["aws.signin"],
  "detail-type": ["AWS Console Sign In via CloudTrail"],
  "detail": {
    "eventName": ["ConsoleLogin"],
    "userIdentity": {
      "type": ["AssumedRole"],
      "accountId": ["123456789012"],
      "arn": ["arn:aws:iam::123456789012:role/SpecificRole"]
    },
    "sourceIPAddress": ["203.0.113.0/24"]
  }
}
```

## まとめ

CloudTrailとEventBridgeを組み合わせることで、AWS環境内のさまざまなイベントを効果的に監視・処理することができます。CloudTrailのJSONイベントを確認し、EventBridgeで広範なイベントをキャプチャする方法から、詳細な条件で特定のイベントのみをキャプチャする方法までを解説しました。これらの手法を活用して、AWSリソースの監視や自動化ができます。
複雑化するiOS・macOSの画像処理フローを理解し、開発効率を上げる方法

OSやmacOSの開発では、画像処理において複数のフレームワーク（SwiftUI、UIKit、AppKit）を使いこなす必要があります。

しかし、これらのフレームワークがそれぞれ異なる画像形式やAPIを提供しているため、変換や互換性の確保が煩雑になることがあります。

この記事では、画像処理の煩わしさを解消するためのヒントを紹介します。

# 1. フレームワーク間の画像変換方法
UIKitの```UIImage```とAppKitの```NSImage```は異なる画像形式ですが、これらを相互に変換する方法が用意されています。

たとえば、```UIImage```を```CGImage```に変換し、それを```NSImage```に渡すことで互換性を持たせることが可能です。

```swift
if let cgImage = uiImage.cgImage {
    let nsImage = NSImage(cgImage: cgImage, size: .zero)
}
```
このように、Core Graphicsの```CGImage```を介して変換することで、画像形式間の問題を解消できます。

# 2. SwiftUIでの画像処理の効率化
SwiftUIでは、UIKitやAppKitの画像型をそのまま使うことができるように```Image(uiImage:)```や```Image(nsImage:)```が用意されています。

また、```ImageRenderer```を使うことで、UI要素から簡単に```UIImage```や```NSImage```を作成することも可能です。

これは、複雑な画像処理を避け、効率的に画像を操作するための便利な方法です。

# 3. 画像データの簡単なフォーマット変換
画像データを保存したり送信したりする際に使われるData型は、```UIImage```や```NSImage```から簡単に生成できます。

```UIImage```の```pngData()```や、```NSBitmapImageRep```の```representation```を使うことで、画像をPNGやJPEG形式に変換できます。

これにより、ネットワークやファイル保存の際の処理をシンプルに行えます。

```swift
let pngData = uiImage.pngData()
```

# 4. クロスプラットフォーム開発をスムーズにするベストプラクティス
iOSとmacOSの両方で動作するアプリを開発する場合、UIKitとAppKit間での画像処理の互換性に注意する必要があります。

共通のコードベースを使う場合は、```CGImage```などの中間形式を活用して、両方のフレームワークで同じ処理を実現できるように工夫するのがポイントです。

これにより、コードの重複や複雑な処理を回避できます。

# 5. 最新のAPIを活用して煩雑さを軽減
Appleは毎年新しいAPIを提供し、開発の効率化を図っています。

たとえば、iOS 16以降では ```ImageRenderer```など、画像をレンダリングするための新しいツールが導入され、従来の複雑な変換処理を簡素化できるようになりました。

常に最新のAPIを活用することで、コードのシンプル化と効率向上を目指しましょう。

# 🤔 参考詳細

https://android.benigumo.com/20241010/swiftui-uikit-appkit/
Qiitaはじめたぞ！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！

# よろしく！
jsを主にしています。
jsf*\*kが好きです！
(あんな滅茶苦茶なものに意味があるっていうのが好き)

小学4年生からgoogleのgasを学校でやっていました！
brainf*\*kの最適化が好きです
(brainf*\*kを使ってる時点で最適化できてないって思ったやつ正直に手をあげなさい)

C++は苦手だけどちょくちょくやってる感じです。
中１です。　よろしくお願いします！
DockerコンテナでONLYOFFICEドキュメントエディタをセットアップする方法

[ONLYOFFICEドキュメントエディタ]()は、文書、スプレッドシート、プレゼンテーションの編集を行える強力なツールです。Dockerはアプリケーションを効率的にホストするための仮想環境を提供しており、ONLYOFFICEのホスティングにも最適です。この記事では、Dockerコンテナ内にONLYOFFICEを簡単にセットアップする手順を解説します。

## インストールの準備

セットアップを始める前に、以下の要件を確認してください。
* システム要件：RAM 4GB以上、CPU 2コア、ストレージ 40GB以上
* ソフトウェア要件：Dockerがインストールされていること。Dockerがまだインストールされていない場合は、[Docker公式サイト](https://docs.docker.jp/get-docker.html)の手順に従ってインストールしてください。

## ONLYOFFICE DocsのDockerイメージをダウンロード

DockerでONLYOFFICEをインストールするには、まず公式Dockerイメージをダウンロードする必要があります。このイメージには、ONLYOFFICEドキュメントサーバーの実行に必要なすべてが含まれています。

ターミナルを開いて次のコマンドを実行してください。
```
docker pull onlyoffice/documentserver
```
このコマンドは、最新バージョンのONLYOFFICEドキュメントサーバーを取得し、必要なファイルや設定を揃えます。

## DockerコンテナでONLYOFFICEを実行

イメージがダウンロードされたら、コンテナを実行します。次のコマンドを使用して、ポート80でONLYOFFICEを開始します。
```
docker run -i -t -d -p 80:80 onlyoffice/documentserver
```
* `-i -t`：コンテナとターミナルを接続します。
* `-d`：バックグラウンドでコンテナを実行します。
* `-p 80:80`：コンテナのポート80をローカルマシンのポート80にマッピングし、ブラウザ経由でONLYOFFICEにアクセスできるようにします。

コマンド実行後、ブラウザで `http://localhost`（またはサーバーのIPアドレス）にアクセスすると、ONLYOFFICEのインターフェースが表示されます。

## 設定とカスタマイズ

ONLYOFFICEコンテナは、以下の方法でさらに設定やカスタマイズが可能です。
* データの永続化：Dockerボリュームを使用して、コンテナ外にデータを保存し、コンテナを再起動してもデータが保持されるようにします。
* SSLサポート：HTTPSでアクセスを保護するためには、SSL証明書を取得してコンテナにリンクする必要があります。

高度なユーザーは、メモリ制限やプロキシ設定など、さらにスケーラブルな展開を目指した設定にも挑戦できます。

## お使いのプラットフォームに接続

ONLYOFFICE Docsのインストールと設定が完了したら、お使いのプラットフォームに接続する必要があります。その際は、[Nextcloud](https://www.onlyoffice.com/ja/office-for-nextcloud.aspx)、[box](https://www.onlyoffice.com/ja/office-for-box.aspx)、[Dropbox](https://www.onlyoffice.com/ja/office-for-dropbox.aspx)、[odoo](https://www.onlyoffice.com/ja/office-for-odoo.aspx)のようなすぐに利用できる[コネクタ](https://www.onlyoffice.com/ja/all-connectors.aspx)を使うか、[ONLYOFFICE API](https://api.onlyoffice.com/)を使ってご自身で接続することができます。ニーズに応じて、最適な方法を選びましょう。

## まとめ

DockerコンテナでONLYOFFICEドキュメントエディタをセットアップする方法は非常に簡単で、効率的にフル機能のオフィススイートをホストできます。Dockerイメージをプルして1つのコマンドを実行するだけで、すぐにドキュメント編集環境を整えることができます。Dockerの柔軟性を活かして、自分好みにカスタマイズして使用しましょう。
より詳細な設定や最新情報については、[公式のONLYOFFICEインストールガイド](https://helpcenter.onlyoffice.com/installation/docs-community-install-docker.aspx)を参照してください。
【初心者向け】カーディナリティについて

　ER図の書き方やカーディナリティについての記事が少なく、私自身困った経験があります。
　私がER図を作成する際にカーディナリティについてどのように紐解いているのか共有できればと思います。

図書館の貸し出し管理を行うアプリを例に挙げて説明していきます。
以下のテーブルがあります。
- 図書マスタテーブル
- 利用者マスタ
- 貸出テーブル

 ## テーブル間で外部キー（同じカラム）を探す。
図書マスタ（BOOK）
| book_id | title |
|:-:|:-:|
|  1 | 桃太郎 |
|  2 | 金太郎 |
|  3 | 一寸法師 |
|  4 | かぐや姫 |

::: note warn
本当であれば、もっとカラムがあると思いますが、割愛いたします。（以降のテーブルも同様です。）
:::
利用者マスタ(USER)
| user_id | name |
|:-:|:-:|
| 1 | 近本 |
| 2 | 中野 |
| 3 | 森下 |
| 4 | 大山 |

貸出テーブル（LEND）
| lend_id | user_id | book_id | lend_date |
|:-:|:-:|:-:|:-:|
| 1  |  1 | 1  | 第1月曜日  |
| 2  |  2 |  3 |  第1木曜日 |
| 3  |  4 | 2  |  第2水曜日 |
| 4  |  3 | 4  |  第2火曜日 |
| 5  |  3 | 1 |  第2火曜日 |

以上のテーブルのカラムから外部キー（同じ名前のカラム）として、
- 図書マスタのbook_idと貸出テーブルのbook_id
- 利用者テーブルのuser_idと貸出テーブルのuser_id

を見つけられます。

::: note alert
アプリケーションが複雑になれば、外部キーが同じ名前でない場合や、複数あることもあります。
:::

さぁ本題のカーディナリティの考え方なのですが、私は *SQL* を用いております。

```sql:book.sql
SELECT * FROM BOOK WHERE book_id = 1;
```
　以上のようにリレーションがある(外部キー、すなわち同じ名前のカラムを持っているテーブル)テーブルで同じ名前のカラムをwhere句に入れてレコードを取得したと仮定しましょう。
 　今回の場合、レコードは1件だけとれるはずです。（主キーなので一件だけとれるのは当たり前ですが,,,）
```sql:lend.sql
SELECT * FROM LEND WHERE book_id = 1;
```
 今回は貸出テーブルで同じ名前のカラムをwhere句に入れてレコードを取得します。
 今回は2件取得できます。このように外部キー、すなわち同じ名前のカラム（テーブル結合する際の結合点）をwhere句に入れた際に必ず1件だけとれるテーブルが1。複数レコードが取得できるテーブルが多なのです！
【Go】3. 変数宣言

## 変数宣言

基本的には以下の形で変数の宣言が可能

```Go
var a int = 1  //-- ①

b := "Hello" //-- ②
```

## Goにおける前提

Goではprivateとpublicのような接頭語がなく、大文字から始まるものをpublic、小文字で始まるものをprivateとしている。

この規則は変数だけでなく、関数、構造体のフィールドなどにも適用される。

```Go
var a int = 1  // private
var A int = 100  // public
```

privateの変数は他のパッケージから参照ができないので注意すること。

利用していない変数が存在するとエラーになる。

```Go
var Hoge string = "HOGE"
var Fuga string = "FUGA"  // Fugaを宣言して利用していないのでエラーになる
fmt.Println(Hoge)
```

Goのメモリを無駄に消費しないという思想からきているらしい。(不要なimport文があるとエラーになるのも同じ理由っぽいです)

## 1. 基本的な宣言方法

Goでの変数宣言は以下のように

```Go
var [変数名] [型] = [値]
// var a int = 1 
```

となり、Javaと順番が異なるので注意。

```Java
// 比較用 Java
private int a = 1
```

複数の同型の変数であれば、まとめて宣言することができる。

```Go
var a, b, c int = 1, 2, 3
```

宣言した変数と代入している数が異なるのでエラー

```Go
var a, b, c int = 1, 2, 3, 4  // Error 4
```

異なる型の変数を同時に宣言することはできない。

```Go
var a, b, c int = 1, 2, "Hoge"  // Error Hoge
```

異なる方の変数を同時に宣言したい場合には、変数後に宣言した型を記述しない方法もある。この場合、異なる型の変数をまとめて宣言することができる。

```Go
var a, b, c = 1, true, "Hello" //--③
```

```
// go run main.go
1
true
Hello
```

## 2. 省略した宣言方法

Goでは基本的に以下のように省略した形の宣言方法ができる。

```Go
b := "Hello" //-- ②
```
この宣言の場合、Goが自動的に型を予測してくれる。

<img width="155" alt="スクリーンショット 2024-10-10 20 51 28" src="https://github.com/user-attachments/assets/d23de513-1787-4735-bbce-c26977a938a3">

`:=` を使った変数の短縮宣言は、関数内部でのみ有効。関数外では使えないため、グローバル変数を宣言する場合は`var`を使用する必要があります。

```Go
package main

// func外では var のみ
var var1 = "global"

func main() {
    var2 := "local"
    fmt.Println(var1, var2)
}
```

## 3. 複数の変数をブロックで宣言できる

複数の変数をまとめて宣言する方法として、ブロックスタイルの宣言も可能。複数の変数をまとめてわかりやすく宣言できるが個人的にあまり見たことはない。

```Go
var (
    a int = 1
    b string = "Hello"
    c bool = true
)
```

## 4. 未初期化変数のデフォルト値

初期化していない場合、Goでは以下のように変数が初期化される。

```Go
var i int       // 0
var s string    // ""
var b bool      // false
```

## 5. 変数のシャドウイング

Goでは、同じ名前の変数をブロック内で再定義することができ、これを「シャドウイング」と呼ぶ。外側のスコープで定義された変数を、内側のスコープで上書きする形になる。

```Go
package main

import "fmt"

var x = "global"

func main() {
    fmt.Println(x)  // "global"
    
    x := "local"
    fmt.Println(x)  // "local"
}
```
【Go】2. import

## import

```Go
package main

import (
	"encoding/json"
	"net/http"

	"github.com/gorilla/mux"
)

```

import文はコード内で利用する依存関係を記述する。基本的にエディタであれば保管が効くので意識する必要はない。

goの成型が走ると、１番上のブロックにgo内部に存在する依存関係を、２番目のブロックにサードパーティー的な依存関係を記述してくれる。不要なimportが存在するとエラーになる。ここはJavaなんかと違うので注意。

## 1. 単一行でのインポート
複数のパッケージをインポートする際、通常は括弧 () を使ってまとめるが、1行でインポートすることもできる。

```Go
import "fmt"
import "os"
```

## 2. エイリアスを使ったインポート
import文では、パッケージにエイリアスを付けることができる。これにより、パッケージ名を短くしたり、名前の衝突を避けたりすることが可能。

```Go
import (
    f "fmt" // fmt を f として使用
)

func main() {
    f.Println("Hello, World!")  // f で fmt を参照
}
```

## 3. ドットインポート
import . を使うと、そのパッケージ内の識別子を直接呼び出せるようになる。この方法を使うと、パッケージ名なしで関数を使うことができるが、可読性が落ちるため注意。

```Go
import . "fmt"

func main() {
    Println("Hello without fmt!")  // fmt.Print は不要
}
```

## 4. 空白インポート
インポートしたパッケージを直接使わない場合でも、そのパッケージの副作用を利用するために「空白インポート」を行うことがある。

```
import _ "github.com/lib/pq"  // データベースドライバをインポート (直接は使用しない)
```
Windows 10 Pro + Python3 + xlrd を使ってみる

# 目的

Python3 + xlrd で ワークシート上のデータを取り込む
このコードをなぜ書いたのか覚えていないのだけど
python 3.13 にアップしたのでついでに試してみた
※パッケージのメンテはされていないようなので
※積極的に使う理由は無い気がする
ここで作成したファイルを取り込んでいる
[Windows 10 Pro + Python3 + OpenPyXL で CSVファイルを書き込んでみる](https://qiita.com/tabizou/items/3bc827eda11f58db42e6)

## パッケージの追加

<pre>
PS C:\> pip install xlrd==1.2.0
</pre>

## サンプルコード

```python

# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode
# coding:utf-8

# pip install xlrd
# xlrd-2.0.1 を install する -> 動作不可
# https://xlrd.readthedocs.io/en/latest/index.html
# 
# pip install xlrd==1.2.0
# https://xlrd.readthedocs.io/en/stable/index.html

import xlrd
import os.path

xlfile = os.path.abspath(".") + '/' + "samp.xlsx"
wksheet = "KENCODE"

# print(xlfile)
if os.path.exists(xlfile):
    xls = xlrd.open_workbook(xlfile)
    print(xls.sheet_names()) # ['Sheet1', 'KENCODE']
    # sheet1 = xls.sheet_by_index(0) 今回の仕様には合わない
    sheet1 = xls.sheet_by_name(wksheet)
    nrows = sheet1.nrows-1
    ncols = sheet1.ncols 
    for r in range(1, nrows+1):
        print(sheet1.cell(r, 1).value, sheet1.cell(r, 8).value)
```

# 参考にしたのは以下のサイト
[xlrd - xlrd 2.0.1 documentation](https://xlrd.readthedocs.io/en/latest/index.html)
[xlrd - xlrd documentation](https://xlrd.readthedocs.io/en/stable/index.html) ※タイトル名は xlrd - xlrd 2.0.1 documentation
MATLABで音楽作成　ドレミファソラシド

[MATLAB Shorts Mini Hack](https://jp.mathworks.com/matlabcentral/contests/2024-matlab-mini-hack.html)というコンテストに参加しています．
その一作品として，簡単な音楽を作成してみました．[mp4](https://mlc-contest-prod.s3.amazonaws.com/contests/8/videos/0ddb9840-631f-4502-b043-7a10f894638b.mp4)

https://jp.mathworks.com/matlabcentral/communitycontests/contests/8/entries/16168

<iframe width="315" height="315" src="https://www.youtube.com/embed/mSbrI1wSywE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

この記事では，ドレミファソラシドが流れる音の作り方を紹介します．

# プログラムと解説
プログラムは，以下の通りです．言語はMATLABです．
```MATLAB:createAudio.m
function createAudio()
    Fs = 44100;              % サンプリング周波数 (44.1 kHz)
    duration = 0.49;         % 各音の持続時間 (秒)
    t = 0 : 1/Fs : duration; % 時間ベクトル
    
    frequencies = [ 
        261.626     % C4 ド
        293.665     % D4 レ
        329.628     % E4 ミ
        349.228     % F4 ファ
        391.995     % G4 ソ
        440.000     % A4 ラ
        493.883     % B4 シ
        523.251     % C4 ド
    ];
    
    d = Fs * 0.01; % フェードおよび休止の持続時間 (秒)
    fade = linspace(1, 0, d);

    sounds = [];
    for fr = frequencies'
        sound = 0.5 * sin(2 * pi * fr * t);              % 音量0.5
        sound(1:d) = sound(1:d) .* flip(fade);           % フェードイン
        sound(end-d+1:end) = sound(end-d+1:end) .* fade; % フェードアウト
        sounds = [sounds, sound, zeros(1, d)];           % 音の結合
    end
    audiowrite('audio.wav', repmat(sounds, 1, 3), Fs);
end
```

サンプリング周波数は，一般的な設定である44.1kHzです．
各音を0.49秒流し，休止時間を0.01秒挟んだ後に次の音が鳴る設定です．
ドレミファソラシドを3週する，$0.5\times8\times3=12$秒の音を生成しています．

必要な音は，周波数で記述する必要があります．そして，sin波で音を表現します．
音の始まり／終わりの0.01秒は，徐々に音が大きくなる／小さくなるようにします．
音を徐々に変化させるフェードが無いと，「ブツ」というノイズ音が出てしまいます．

以下の音声を聞き比べると，フェードの必要性が良くわかります．


|<iframe width="315" height="315" src="https://www.youtube.com/embed/mSbrI1wSywE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>|<iframe width="315" height="315" src="https://www.youtube.com/embed/8yOs7YJGXNA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>|
|:-:|:-:|
|<iframe width="315" height="315" src="https://www.youtube.com/embed/80jR2SJxZFY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>|<iframe width="315" height="315" src="https://www.youtube.com/embed/aTX16d0Siyw" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>|

最後に，`audiowrite`関数を利用し，オーディオファイルを出力します．

# 終わりに
30行程度で簡単に音を作成できるのは，少し意外でした．
コンテスト期間中に，もう少し複雑な音にも挑戦してみたいと思います．

今回，記事中で簡単に音を再生できるようにするため，YouTubeを利用しました．
Qiitaに動画ファイル，音声ファイルを埋め込みできたら良いなと思いました．
Luaで簡単な日付と時間の処理

## テーブルを使った日付と時間の処理

``` lua
-- 現在の日付と時間をまとめたテーブルを取得
datetable = os.date("*t")

-- 年（4桁）
print(string.format("%d", datetable.year))
-- 年（2桁) ※テーブルには2桁の年がないため算出
print(string.format("%d", datetable.year % 100))
-- 月（1～12）
print(string.format("%d", datetable.month))
-- 日（1～31）
print(string.format("%d", datetable.day))
-- 時（0～23）
print(string.format("%d", datetable.hour))
-- 分（0～59）
print(string.format("%d", datetable.min))
-- 秒（0～59）
print(string.format("%d", datetable.sec))
-- 曜日（1：日曜～7：土曜）
print(string.format("%d", datetable.wday))
-- 年通算日（1～366）
print(string.format("%d", datetable.yday))
-- 夏時間（true/false）
print(datetable.isdst)
```
> **補足**
> - `datetable.year`は、`datetable["year"]`と書いても同じ
> 
> **補足：string.format()の書式一覧**
> - `%d`、`%i`：整数
> - `%f`：浮動小数点数
> - `%o`：8進数表示
> - `%x`：16進数表示（a～fが小文字）
> - `%X`：16進数表示（A～Fが大文字）
> - `%10d`：幅10の整数
> - `%05d`：5桁のゼロ埋め整数（例：整数の23を表示した場合は、`00023`）
> - `%s`：文字列
> - `%%`：%記号そのものを表す

## 書式を指定した日付と時間の処理

``` lua
-- 年（4桁）
print(os.date("%Y"))
-- 年（2桁）
print(os.date("%y"))
-- 月（01～12）
print(os.date("%m"))
-- 日（01～31）
print(os.date("%d"))
-- 時（00～23）
print(os.date("%H"))
-- 時（01～12）
print(os.date("%I"))
-- 分（00～59）
print(os.date("%M"))
-- 秒（00～59）
print(os.date("%S"))
-- 曜日（0：日曜～6：土曜）
print(os.date("%w"))
-- 年通算日（001～366）
print(os.date("%j"))
```

> **補足：年月日と時分をつなげた文字列を作成する**
> 
> ``` lua
> -- 文字列は「..」で連結します
> datetime = os.date("%y") .. os.date("%m") .. os.date("%d") .. "_" .. os.date("%H") .. os.date("%M")
> 
> print(datetime) -- 241012_0326（※2024年10月12日03時24分の場合）
> ```

## 余談：Luaにない構文

- `switch`文がない
- `++`、`--`演算子がない
- `goto`文が最近までなかった

## 参考

- [公式リファレンス](<https://www.lua.org/manual/>)
    - 最新のリファレンスは英語のみ
- [日本語のリファレンス](<https://inzkyk.xyz/lua_5_4/#gsc.tab=0>)
    - Lua 5.4のリファレンス（※現時点の最新リリースは5.4.6）
- [オンラインLuaコンパイラ（myCompiler）](<https://www.mycompiler.io/ja/online-lua-compiler>)
    - オンラインで動作確認したい場合に
[備忘録] SwiftのButton Stylesまとめ - 各Buttonスタイルの違いと使い方

## はじめに

SwiftUIにはさまざまな`ButtonStyle`が用意されており、ボタンの見た目や動作を簡単にカスタマイズすることができます。本記事では、それぞれの`ButtonStyle`の使い方と、その違いを解説し、コード例とともに紹介します。

## Buttonスタイルの種類まとめ
- **DefaultButtonStyle**: デフォルトのボタンスタイル。プラットフォームやコンテキストに応じて外観が決まります。
- **PlainButtonStyle**: シンプルなスタイルで、ボタンのデフォルト装飾を取り除きます。
- **BorderedButtonStyle**: ボタンに枠線を追加するスタイル。
- **LinkButtonStyle**: リンクのように見えるボタンスタイル（iOSでは使用不可）。

この記事は、[公式ドキュメント](https://developer.apple.com/documentation/swiftui/buttonstyle)を参考にしながら作成しました。ただし、この記事はChatGPTとの対話を通じて執筆しています。そのため、一部に正確でない情報が含まれる可能性がありますが、できる限り正確に記載するよう努めました。ご理解いただけますと幸いです。


## 各ボタンの違い
![スクリーンショット 2024-10-09 19.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788759/12b6ba95-918c-3e51-9eed-bf0f89b36a3e.png)

## DefaultButtonStyle

`DefaultButtonStyle`は、プラットフォームやボタンの使用されるコンテキストに応じて、自動的に適切な外観を設定します。これにより、システムの一貫性を保ちながら、最適なボタンスタイルを使用することができます。

```swift
Button("Default Button") {
    print("Button pressed")
}
.buttonStyle(DefaultButtonStyle())
```

- **特徴**: プラットフォームの標準的なボタンスタイルが自動的に適用されます。

## PlainButtonStyle

`PlainButtonStyle`は、ボタンの標準的な装飾を取り除き、シンプルでフラットな外観にします。このスタイルは、ボタンを他の要素と見た目で目立たせたくない場合に便利です。

```swift
Button("Plain Button") {
    print("Button pressed")
}
.buttonStyle(PlainButtonStyle())
```

- **特徴**: 装飾がなく、シンプルなボタン。リスト内のボタンや、他のUI要素と馴染ませたい場合に使用されます。

## BorderedButtonStyle

`BorderedButtonStyle`は、ボタンに枠線を追加するスタイルです。視覚的に強調したい場合や、複数のボタンの中で選択肢を明確に示したい場合に使います。

```swift
Button("Bordered Button") {
    print("Button pressed")
}
.buttonStyle(BorderedButtonStyle())
```

- **特徴**: ボタンに枠線を追加し、選択肢を強調する効果があります。

## LinkButtonStyle

`LinkButtonStyle`は、ボタンをリンクのように見せるスタイルですが、iOSではサポートされていないため、macOSなど他のプラットフォームでのみ使用可能です。ボタンをリンクとして扱いたい場合に便利です。

```swift
Button("Link Button") {
    print("Button pressed")
}
.buttonStyle(LinkButtonStyle())
```

- **特徴**: リンクのように見せるボタン。iOSでは使用できませんが、macOSなどでリンクのように見せたいときに便利です。

## 結論

SwiftUIの`ButtonStyle`を使うことで、アプリのボタンの外観やユーザー体験を簡単にカスタマイズすることができます。それぞれの`ButtonStyle`には特定の使用シーンがあり、目的に応じて使い分けることが重要です。

- **DefaultButtonStyle**: 標準的なボタン外観が必要なときに。
- **PlainButtonStyle**: 他の要素と馴染ませたい場合や、ボタンの装飾をなくしたいときに。
- **BorderedButtonStyle**: ボタンを強調したいときに。
- **LinkButtonStyle**: ボタンをリンクのように見せたい場合（macOSなどでのみ使用可能）。

これらのスタイルを使いこなし、ユーザーにとって魅力的で直感的なUIを構築しましょう。

:::note info
Chat GPTを利用しています。
一部に正確でない情報が含まれている可能性もありますがご了承ください。
:::
ModuleNotFoundError  python(41) error(138)

```python
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-1599bc6e80ec> in <cell line: 4>()
      2 import codecs
      3 from pprint import pprint
----> 4 from datasets import load_dataset
      5 
      6 # サンプルデータが保存されているパス

ModuleNotFoundError: No module named 'datasets'

---------------------------------------------------------------------------
NOTE: If your import is failing due to a missing package, you can
manually install dependencies using either !pip or !apt.

To view examples of installing some common dependencies, click the
"Open Examples" button below.
---------------------------------------------------------------------------


---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-3-df8f1ea99b0d> in <cell line: 4>()
      2 
      3 import torch
----> 4 from datasets import load_dataset
      5 from torch.utils.data import Dataset
      6 from tqdm import tqdm

ModuleNotFoundError: No module named 'datasets'

---------------------------------------------------------------------------
NOTE: If your import is failing due to a missing package, you can
manually install dependencies using either !pip or !apt.

To view examples of installing some common dependencies, click the
"Open Examples" button below.
---------------------------------------------------------------------------




---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-4-8d1b9ad2b097> in <cell line: 2>()
      1 # データセットペア取得
----> 2 pairs = create_comparison_dataset_ls(data_path)
      3 pprint(pairs[0])

NameError: name 'create_comparison_dataset_ls' is not defined


```
「..」以外のレンジ

```kotlin
for (i in 10..1) println(i)
```
決まった回数回ループ処理をするときは「..」を使用するがそれ以外の書き方もあるので、メモする。

```kotlin
for (i in 1.rangeTo(10)) println(i)

for (i in 10 downTo 1) println(i)
```

rangeToは「..」と同じ意味を持つ。downToはrangeToと逆で大きい順にループさせる。

```kotlin
for (i in 0..10 step 3) println(i)
// 0 3 6 9

for(i in 0 until 3) println(i)
// 0 1 2
```

`step n`はnの回数だけ飛ばすことができる。untilは最後の値を含めない場合に使用する。

#### 参考
https://qiita.com/Daitoryo/items/5752f9e50e8799e8dcd0#until

https://www.tohoho-web.com/ex/kotlin.html#range
Python:辞書型のget()メソッド第2引数(default)は常に評価される

何を言っているかわからないタイトルになってしまっていますので説明します。

## 辞書型のget()メソッド

```python
>>> data = {'lastname': 'suzuki'}
>>> print(data.get('lastname', 'nanashi'))
suzuki
>>> print(data.get('firstname', 'nanashi'))
nanashi
```
上記のように、辞書型(dict)の get() メソッドを使うと存在するキーであればその値、存在しなければ第2引数のデフォルト値を返却する動作が記述できます。
（第2引数を省略した場合は None が返ります。）
KeyErrorが発生せず横着できるので好んで使っています。

## 第2引数の評価タイミング

この第2引数、どうやら常に評価されているようです。
第1引数のキーが存在した場合、第2引数部分の評価が不要であることは明らかで、処理しないだろうと勝手に思い込んでいたのですが、そうではないようだ、ということが本ポストの内容です。

## 確認

確認してみます。

```python
>>> def default_name():
...     print('default works!!')
...     return 'nanashi'
...
>>> data = {'lastname': 'suzuki'}
>>> print(data.get('lastname', default_name()))
default works!!
suzuki
```

`data.get()` で `lastname` キーの値は取得できていますが、第2引数の `default_name()` 関数が動作していることがわかります。

多くの場合は問題にならないと思いますが、第2引数に関数を記述する場合はちょっと気にしたほうが良さそうです。



## リンク

[https://docs.python.org/3.12/library/stdtypes.html#dict.get](https://docs.python.org/3.12/library/stdtypes.html#dict.get)
Azure VMをセキュアにテナント間コピーする

Azure VMを他のサブスクリプションへ複製する場合、同一テナントへのコピーか別テナントへのコピーかで手順が変わってきます。
Japan Azure IaaS Core Support Blogブログに [Azure VM の複製 / 移動方法ついてのまとめ](https://jpaztech.github.io/blog/vm/vm-copy-move-scenario/) という素晴らしい記事が公開されています。
こちらの「別のテナントへのVMの複製」手順で実現可能なのですが、以下のタイミングで一時的にどこからでもアクセスできる状態になります。
  * マネージドディスクをエクスポートしたとき
  * 転送先ストレージアカウントでSAS発行したとき

ここにネットワーク制限を加えることができないか検証したので手順を残します。

# 全体像
* こちらが全体像です
* ポイントは2つあり、赤枠で囲っている「クロステナントプライベートエンドポイント」と「Managed Diskネットワーク制御」です。これらを実装することで特定のvNet内に閉じた通信を可能としています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b0db49aa-9647-33a4-6e11-63317f622c01.png)

# クロステナントプライベートエンドポイント
* 異なるテナント、異なるサブスクリプション間でプライベートエンドポイントを実装する方式です
* こちらは以前記事にまとめていますので参考ください
[クロステナントのAzure Private Endpoint経由でBlob Storageに接続する](https://qiita.com/shingo_kawahara/items/3fb70196a8165cbf9cf1)

# Managed Diskネットワーク制御
* Managed Diskをエクスポートするとエンドポイントが発行されますが、このエンドポイントにプライベートエンドポイントを実装する方式です
* こちらも以下の記事にまとめていますので参考ください
[Azure Managed Diskのネットワーク設定を検討する](https://qiita.com/shingo_kawahara/items/641afec5688c2a7cdefd)

# VHDファイル転送からVM起動まで
* 上記2つの設定を行うことで、特定のvNet内からのみのアクセスに絞ることができます
* vNet内にAzCopy用のVMを作って、プライベートエンドポイント経由でManaged Diskエンドポイントから別テナントのストレージアカウントSASエンドポイントにVHDファイルをコピーします
* 以降の手順はJapan Azure IaaS Core Support Blogブログの [Azure VM からエクスポートした VHD ファイルを用いた複製 VM の作成方法](https://jpaztech.github.io/blog/vm/create-vm-using-vhd/) で実現できましたのでリンクさせて頂きます

以上です
Entra ID(旧: Azure AD) で IAM Identity Center(旧:AWS SSO) にユーザ/グループをプロビジョニングする時にメンバーが同期されない事がある

なんか不思議な現象を目にしたのでメモがてらです


## 問題の再現

- Entra ID
    - グループ A を作る
    - ユーザ B をグループ A のメンバーに割り当てる
    - エンタープライズアプリの IAM Identity Center でグループ A を割り当てる
    - プロビジョニングをする

これで IAM Identity Center 側にユーザ B とグループ A とそのメンバーが作成される。ここまでは正常。

その後、色々なトラブルがあったので IAM Identity Center 側を操作をしていたら問題が発生した。

- IAM Identity Center
    - ユーザ B を削除する
        - この時点でグループ A のメンバーではなくなる
- Entra ID
    - グループ A のメンバーのユーザ B をプロビジョニングして、復活させようとする
    - ユーザ B は再作成されるが、何故かグループ A のメンバーの同期が `RedundantExport` としてスキップされる
> The state of the entry in both the source and target systems already match. No change to the User 'foo@example.' currently needs to be made.

## 意味のなかったリカバリ策

Entra ID のプロビジョニング先は色々あるだろうが、一般的にはグループ A を消して再同期したらメンバーも同期されるようになった、という報告が散見されたので試す

- IAM Identity Center
    - グループ A を削除する
- Entra ID
    - グループ A とメンバーのユーザ B をプロビジョニングする
    - グループ A は作成されるが、そのメンバーの同期が `RedundantExport` としてスキップされる :thinking:  :thinking: 

- IAM Identity Center
    - グループ A とユーザ B を削除する
- Entra ID
    - ユーザ B をプロビジョニングする
    - グループ A とメンバーのユーザ B をプロビジョニングする
    - ユーザ B とグループ A は作成されるが、そのメンバーの同期 `RedundantExport` としてスキップされる :thinking:  :thinking:  :thinking: 

どうやらグループやユーザを削除しても、グループメンバーの割当だけキャッシュされているような気配があり、無意味だった。

## 有効だったリカバリ策

- IAM Identity Center
    - グループ A をグループ A-backup にリネームする
    - グループ A を新しく作り、ユーザ B をメンバーにする
    - エンタープライズアプリの IAM Identity Center でグループ A を割り当てる
    - プロビジョニングをする

これで IAM Identity Center 側にユーザ B とグループ A とそのメンバーが作成される。
グループは別物なので、他の用途で使っていたりすると地獄です

### 後片付け
- IAM Identity Center
    - エンタープライズアプリの IAM Identity Center でグループ A-backup の割当を削除する
    - プロビジョニングし、グループ A-backup を IAM Identity Center 側から削除する
    - グループ A-backup を削除する
    - おしまい

## 感想
冪等ではない同期やめてね
Ruby :html内で＜％＝　%＞で囲む理由

railsの勉強をしています。
わからないところがあっても一旦はスルーして、後から意味を考えるようにしています。

このたび、一度スルーしたけど無視できない位気になったので改めて調べたことがあります。

それがrubyの<%=  %>で囲む意味。
rubyではこのようにタグをつけます、のようなことを習って
「なるほどね~」とそのときは思って何も気にせず使っていました。

しかし、なんで%が出てくるの？と疑問に思ってしまいました。
おそらくその理由は演算子の余りで使う「%」が頭の片隅にあったから。
なんで演算子の「%」が急に出てくるんだー！？と脳のどこかが混乱していたんだと思います。

プログラミングに慣れると、「最初に%がつくんだから演算子なわけないじゃん」と、
そんなことを気にすることもないのかもしれません。
しかし超初心者の私は記号が出てくるだけで頭が大混乱します。
早く慣れて気にならなくなりたい。

「ruby % タグ」等といくつか検索しても私の求める結果は出てきませんでした。
私の調べ方が悪かっただけかもしれません。
そこでChatGPT先生に「Rubyの<%= %>って何ですか？」と尋ねたところ、
「ERB（Embedded Ruby）テンプレート内で使われる構文だよ」、
「RailsなどでRubyのコードをHTMLに埋め込むための方法だよ」と教えてくれました。

なるほどー！だからhtmlファイルの中で登場してたのか、ということがやっとわかりました。

そして続けて以下のように重要なことが書いてありました。
<%= %>: Rubyのコードを実行して、その結果を表示。
<% %>: Rubyのコードを実行するが、表示しない。

これはテキストにも書いてあったけど、%マークで混乱していた私の頭には全く入ってきていませんでしたが、「％という記号を使った構文で、HTMLの中に埋めこまれる」ということがわかったので、
ようやく構文の意味も理解できました。

その後、「ERB ruby %」で検索をするといくつか求めていた記事がヒットしたので、
キーワードは「ERB」だったのかもしれません。
ちなみにChatGPTに聞いて初めて「ERB」という言葉を知ったかもしれません。
（混乱してる私の頭の中を素通りしていただけで、もしかしたらテキストに書いてあったかも。）


テキストに出てきた例ももう一度見直してさらに理解を深めていきたいと思います。
新たな疑問点が浮かんでくるかもしれませんが。
WordPress 6.6.2のtheme.jsonの初期値について

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21117/9f7ba287-1a5a-9284-8f93-2f255aabac3d.jpeg" width="200" alt="WordPressのtheme.jsonをカスタマイズした例">

WordPressのブロックテーマを作る際に、theme.jsonに何も指定しなかったら初期値がどうなるのかを調べました。

## theme.jsonのリファレンス

WordPressの公式ドキュメントには、theme.jsonの最新の仕様についてまとめられているページがあります。

https://ja.wordpress.org/team/handbook/block-editor/reference-guides/theme-json-reference/theme-json-living/

ですがここに記載されているのは、あくまで「テーマ側で何も指定していなかったらWordPress側はどのように解釈するのか」らしく、特に余白（`styles.spacing`）等は、具体的にどのような値になるのか特定できませんでした。

## Create Block Themeプラグインの初期値

WordPressは、ブロックテーマを簡単に作成できる公式のプラグインがあります。

https://ja.wordpress.org/plugins/create-block-theme/

このプラグインで「空のテーマ」から作成した場合、以下のパスにあるボイラープレート（ひな型）が参照されるようです。

`/wp-content/plugins/create-block-theme/assets/boilerplate/theme.json`

コードは公開されており、下記URLで最新のJSONを見ることができます。テーマを作成するための最低限の設定しか記述されていないことがわかります。

https://plugins.trac.wordpress.org/browser/create-block-theme/trunk/assets/boilerplate/theme.json

## 何も指定しなかった場合の初期値

さて、肝心の初期値ですが、以下のパスにある `theme.json` の内容が反映されるようです。

`/wp-includes/theme.json`

こちらもコードは公開されています。先ほどのボイラープレートとは異なり、膨大な設定が書かれているのがわかります。

https://core.trac.wordpress.org/browser/trunk/src/wp-includes/theme.json

特に調べたかった余白（`styles.spacing`）については、6.6.2時点では `spacingScale` での自動設定となっていました。spacingScaleについての説明は割愛しますが、 `1.5rem` を中央値とし、大小3段階にそれぞれ150%ずつ増減した7段階が初期値ということになります。

```
		"spacing": {
			"blockGap": null,
			"margin": false,
			"padding": false,
			"customSpacingSize": true,
			"defaultSpacingSizes": true,
			"units": [ "px", "em", "rem", "vh", "vw", "%" ],
			"spacingScale": {
				"operator": "*",
				"increment": 1.5,
				"steps": 7,
				"mediumStep": 1.5,
				"unit": "rem"
			}
		},
```

## 補足

使用中のテーマのtheme.jsonを一旦空にして、このファイルの内容を編集したら反映された、という雑な検証なので確定ではありません。公式ドキュメントに記載があればご指摘いただけるとありがたいです。
MobaXtermのススメ

https://www.katori.dev/posts/0002_recomend_mobaxterm/

# はじめに
皆さま、SSHしてますか？
SSHクライアント、使ってますか？
Tera Termはセッションの複数保存ができないし、Puttyはちょっと古臭い。
RLoginはどっちも満たしているけどファイル転送ウィンドウが使いにくい......

今使っているクライアントにちょびっと不満があって、なおかつイイカンジのSSHクライアントをお探しのそこのあなた、おすすめがございます。

## MobaXterm
https://mobaxterm.mobatek.net/

SSHクライアントのようであり、VNCクライアントのようであり、WSLのコンソールのようであり、FTPクライアントのような不思議なWindows用ソフトです。
基本的に私はSSHクライアントとして使っています。
PuttyよろしくKeyGen機能もついています。


# 導入
上記の公式ページからダウンロードしてきてインストーラー起動するだけです。
簡単。

# 設定
いろいろと便利な機能やら設定やらがあります。
## セッション設定
起動したらまず左上のセッションボタンからセッション設定を開きましょう。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3533323032352f61636435333731362d333533622d326661372d363731372d6638663238333365343639302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/6b2c4254-24ca-5875-2612-e851c0d121c7.png)


セッション設定が開くとなにやらSSHやらVNCやらS3やらと見え、わくわくしてきますがおとなしくSSHを押します。
私は無料版のセッション保存数いっちゃってるので怒られてますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/52d8cd98-4503-9e46-0a8e-b14a02df20eb.png)

### マスターパスワード設定
`Remote Host`を設定するその前に、`Specify username`のチェックボックスにチェックをつけ、その右にあるユーザーアイコンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/675da6b3-24fc-d951-cb7b-6e86d348c075.png)

ユーザーアイコンを押すとパスワードマネージャーが開くので、まずは`Master Password Settings`でマスターパスワードを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/4d2be7c2-d7ec-fb83-ebda-d64c223a229b.png)
マスターパスワードを入力したら、OKを押しましょう。
このマスターパスワードは、パスワードマネージャーのユーザー名とパスワードを復号するときに使うので忘れるとまあまあ困ります。

### ユーザー名&パスワード保存
パスワードマネージャーに戻ってきたら、`New`ボタンを押して資格名、ユーザー名、パスワードを設定してあげましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/8ad0c16a-9adc-3e64-975e-6237dd7f5747.png)

### セッション設定へ反映
ユーザー名とパスワードを保存出来たらセッション設定ウィンドウまで戻り、`Remote Host`やら`Advanced SSH Settings`やらを埋めてあげましょう。
ちなみに`Network Settings`から踏み台ログインの設定もできますが、踏み台を使っているときはSFTPのペインは表示されません。
公開鍵認証をしたい場合は`Use Private Key`にチェックを入れて秘密鍵を選んであげればOKです。
OPEN SSH形式でないと使えないのであしからず。

最後に、`Specify username`の隣にあるドロップダウンメニューを開き、先ほど保存してあげた資格名を選んであげましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/c2e3a558-37c1-966f-94a5-0ec29fb18337.png)

ここまで設定が終わったらOKを押して保存しましょう。

# 接続
セッション設定ウィンドウが閉じたら左側のペインに保存したセッションがあると思うので、ダブルクリックで接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/aa8ab623-795e-3fe6-77d0-65656c04a032.png)

接続すると、左ペインにSFTPウィンドウが、右ペインにコンソールが開きます。
もしサーバー側でX11が動いていればX転送が使えます。
SFTPウィンドウ下の`Remote Monitoring`を押すと、画像下のほうに映っているような監視ウィンドウがポップします。
SSHに関しては基本的にはこれで以上です。

# その他
ほかにはシリアル接続だったりシェルエミュレーターだったりが使えます。
残念ながら日本語非対応ですが、Puttyからセッションをインポートできたり、再インストール時用にパスワードやらセッション設定やらをエクスポートできます。
エクスポートされたファイルはマスターパスワードで暗号化されているのでインポート先で復号すれば元通りです。

それでは、よしなに。
SocketDebuggerから周期的にデータを送信するスクリプト

## やりたいこと

SocketDebuggerから周期的に（定期的に）にデータを送信したい。

> ※わざわざ記事にする程でもないですが、

## スクリプト

- 接続完了したら、周期的にデータを送信する
    - 今回は周期を、3分（＝30,000ミリ秒）とした
- 周期的にデータを受信すると`OnReceive()`関数が呼び出される
    - 引数`id`はタイマー番号（0 or 1）
- `FileRead()`関数はファイル読み込み
    - 引数`recv`はテーブル
    - `filename`は、ファイルのフルパスを指定する
    - bin形式のデータは、SocketDebuggerの「送信データエディタ」などで、あらかじめ用意しておく必要がある
    - 戻り値は、読み込んだデータ（※エラー時は`null`が返る）
- 切断したら、タイマーを停止する（周期的なデータの送信を停止する）

``` lua
---------------------------------------------
-- 接続完了通知
---------------------------------------------
function OnConnected()
    timernumber = 0 -- 0：タイマー1指定 / 1：タイマー2指定
    cycle = 30000 -- イベントを発生する周期をミリ秒で指定（※30000ミリ秒＝3分）
    _1time = 0 -- 0：通常タイマー（※デフォルト） / 1：ワンタイムタイマー
    SetTimer(timernumber, cycle, _1time)
    
    return 0
end
---------------------------------------------
-- タイマー通知
---------------------------------------------
function OnTimer(id)
    filename = "C:\\SocketDebugger\\送信データ\\Send_01.bin"
    binfile = FileRead(filename)
    
    option = 0 -- 0：現在の制御中の接続ポートで送信する（※デフォルト） / 1：ポート1 / 2：ポート2
    SendData(binfile, option)
    
    return 0
end
---------------------------------------------
-- 切断通知
---------------------------------------------
function OnDisConnected()
    timernumber = 0 -- 0：タイマー1指定 / 1：タイマー2指定
    KillTimer(timernumber)
    
    return 0
end
```

## 参考

- [SocketDebugger](<https://www.udom.co.jp/sdg/index.html>)
    - 高機能通信試験支援ツール
- [Lua 5.1 リファレンスマニュアル](<http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html>)
    - SocketDebuggerの取扱説明書（Ver. 2.00）によると、Luaのリファレンスは5.1を参照するらしい
    - Wikipediaによると、Lua 5.1.4のリリースが2008年。最新は2020年のLua 5.4.0。
Render.comでのデプロイを行うためのGitHub Actions構築方法

# なぜ、Render.comへのデプロイを行う事になったのか?
#### HerokuなどのクラウドベースのSaaSが無料サービスを終了したため、代替サービスを探しました。
#### Render.comは無料でWebサービスをホスティングでき、以下のような特徴があります
- 月間使用時間： 最大750時間
- リソースの制限： 1つのインスタンスに対して512MBのメモリと0.5vCPUが提供される
#### 無料で使用できる範囲としては非常に良心的なサービスだと感じました。また、将来的に数百～数千の同時接続が発生する可能性はありますが、今回使用するPythonのFlaskアプリケーションはメモリ消費が少ないため、Render.comを選びました。

# 自作ワークフローの作成と既存Actionsの組み合わせ
#### 今回は、Githubでのマーケットプレイス検索で「Render Deploy」としました。先人たちが作ってくれたActionがあったのですが何かと機能が満足するようなものがなかったので、色々調べていると...
https://github.com/ttskch/render-deploy
#### この方が作成した、シンプルかつオプション設定が出来るのを見つけたので使用する事にしました。

# Render.comへのデプロイを行うActionのワークフローについて
```
name: Render Deploy

on:
  push:
  pull_request:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # コードのチェックアウト
      - name: Checkout code
        uses: actions/checkout@v3

      # Dockerイメージのビルド
      - name: Build Docker image
        run: |
          docker build -t inoue/my_flask_hp:latest .

      # Renderへのデプロイ
      - uses: ttskch/render-deploy@v1.0.0
        with:
          api-key: ${{ secrets.RENDER_API_KEY }}
          service-id: ${{ secrets.RENDER_SERVICE_ID }}
          interval: 20
          timeout: 300 
```
このようなワークフローにしました。
- `on`: pushおよびpull requestでトリガーされます
- `jobs`: 最新のUbuntuを使用してコードのチェックアウトを行い、Dockerイメージをビルドし、Renderへデプロイします
- `uses`: 先述したttskch/render-deploy Actionを使用しています
#### `api-key`と`service-id`には、GitHubリポジトリ内のActions secrets and variablesに設定したシークレット変数を使用しています。これらのシークレット変数は、コード上で直接参照されないようにしつつ、同じ名前でリポジトリに設定する必要があります。
#### 必須パラメーターは、
- api-key Render.comのAPIキー
- service-id デプロイ対象のサービスのサービスID
#### これらは、Render.comのAPIを使用してデプロイを実行するために必須となります。

# 最後に
今回は、Render.comでのデプロイを行うためにGitHub Actionsを構築する方法を紹介しました。シンプルかつ機能的なActionを利用して、効率的なデプロイ環境を実現できたと感じています。
dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)の対処法

## はじめに
cudnnとかcuda周りのパッケージをインストールするときにタイトル通りのエラーが出たので対処法を書いておきます。
何か間違いやアドバイスがあったらコメントをお願いします。

## 筆者の環境
Windows11
WSL2
Ubuntu20.04
## 対処法
~~~
dpkg: error processing archive /var/cache/apt/hoge.deb (--unpack):
 trying to overwrite '/lib/udev/rules.d/hoge', which is also in package hoge
dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)
Errors were encountered while processing:
 /var/cache/apt/archives/hoge.deb
~~~

とエラーの最後のほうに出ると思います。これの Errors were encountered while processingの後の
`/var/cache/apt/archives/hoge.deb`
をインストールしてあげます


~~~
sudo dpkg -i /var/cache/apt/archives/hoge.deb
~~~
このコマンドの後
~~~
sudo apt -f install
~~~

をするとうまくいくと思います。
PythonでHTMLをExcelファイルに変換する方法

データ処理や分析の過程で、ウェブページから情報を取得し、より操作しやすい形式に変換する必要がよくあります。HTMLテーブルは、一般的なデータ表示形式として、オンラインレポートや統計資料などのシーンで広く使用されていますが、その構造化レベルが低く、データのクリーンアップや分析には適していません。**HTMLテーブルをExcelワークシートに変換**することで、Excelの強力なデータ処理機能を利用して、並べ替え、フィルタリング、計算などが簡単に行えるだけでなく、他者と共有したり、長期的に保存したりすることが可能になります。Pythonを使用すれば、この変換プロセスを効率的に実行し、データ移行を迅速に達成できます。
本記事では、**Pythonを使用してHTMLをExcelファイルに変換**する方法を紹介します。

- **[PythonでHTMLをExcelワークシートに変換](#pythonでhtmlをexcelワークシートに変換)**
- **[PythonでHTMLテキストをExcelのセルに書き込む](#pythonでhtmlテキストをexcelのセルに書き込む)**

本記事で使用する方法では、[Spire.XLS for Python](https://jp.e-iceblue.com/introduce/spire-xls-for-python.html)が必要です。PyPIコマンド: `pip install spire.xls`

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## PythonでHTMLをExcelワークシートに変換
`Workbook.LoadFromHTML()`メソッドを使用してHTMLファイルを直接読み込み、`Workbook.SaveToFile()`メソッドで指定されたExcelファイル形式に保存することができます。以下に詳しい操作手順を示します。
- 必要なモジュールをインポートします。
- `Workbook`オブジェクトを作成します。
- `Workbook.LoadFromHTML()`メソッドを使用してHTMLファイルを読み込みます。
- 単純なHTMLテーブルでは、いくつかのフォーマット情報が不足している場合があるため、変換前に列幅の自動調整などのフォーマット設定を行うことができます。
- `Workbook.SaveToFile()`メソッドを使用してExcelファイルに変換し、保存します。
- リソースを解放します。

**コード例**
```python
from spire.xls import Workbook

# Workbookのインスタンスを作成
workbook = Workbook()

# HTMLファイルを読み込む
workbook.LoadFromHtml("Sample.html")

# 列の自動調整
for i in range(workbook.Worksheets.Count):
    worksheet = workbook.Worksheets.get_Item(i)
    for j in range(1, worksheet.Columns.Count + 1):
        worksheet.AutoFitColumn(j)

# Excelファイルに変換
workbook.SaveToFile("output/HTMLをExcelに変換.xlsx")
workbook.Dispose()
```

結果
![PythonでHTMLをExcelに変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0b7e9384-4d29-9097-225d-e98bde938a02.png)

## PythonでHTMLテキストをExcelのセルに書き込む
`Workbook.Worksheets.get_Item()`メソッドを使用して指定のワークシートを取得し、`Worksheet.Range[]`プロパティを使用して指定のセルまたはセル範囲を取得することができます。その後、`CellRange.HtmlString`プロパティを使用してHTMLテキストをセルに挿入し、対応するテキストとフォーマットを表示できます。以下に操作手順の例を示します。
- 必要なモジュールをインポートします。
- `Workbook`オブジェクトを作成します。
- `Workbook.Worksheets.get_Item()`メソッドを使用してワークシートを取得します。
- `Worksheet.Range[]`プロパティを使用してセルを取得します。
- HTMLコードを指定します。
- `CellRange.HtmlString`プロパティを使用してHTMLコードに対応するテキストをセルに挿入します。
- `Workbook.SaveToFile()`メソッドを使用してExcelブックを保存します。
- リソースを解放します。

**コード例**
```python
from spire.xls import Workbook, FileFormat

# Workbookのインスタンスを作成
workbook = Workbook()

# 最初のワークシートを取得
sheet = workbook.Worksheets.get_Item(0)

# HTML文字列を指定
htmlString = "<span style='font-size: 20px; color: blue;'><strong><u>Employee Data Table</u></strong></span>"

# HTML文字列をワークシートに挿入
sheet.Range[1, 1].HtmlString = htmlString

# 列の幅を自動調整
sheet.AutoFitColumn(1)

# ワークブックを保存
workbook.SaveToFile("output/HTMLテキストをExcelに挿入.xlsx", FileFormat.Version2016)
workbook.Dispose()
```

結果
![PythonでHTMLテキストをExcelのセルに書き込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/5cc2a69a-770a-b01f-afa9-0f63c01e9b83.png)

この記事では、Pythonを使用してHTMLをExcelファイルに変換する方法を紹介しました。
Name項目と参照関係先のName項目が同一か確認する数式項目

本橋孝昭です。

Salesforceで
Name項目と参照関係先のName項目が同一か確認する数式項目を作成しました

今回は商談のNameと商談に紐づく取引先のNameが同一の場合チェックあり、同一ではない場合チェックなしを表示させる数式項目です

数式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/beb2628e-b572-add5-f75d-23f42d4db16e.png)


Name  =  Account.Name


数式項目の項目型はチェックボックスです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fda8fb62-f584-236d-72e4-98c060bc0450.png)



もしも商談名とその商談の取引先名が同じ場合チェックがオンになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fd12d3b1-ac5e-4da0-8afe-5419533e8e6a.png)


もしも商談名とその商談の取引先名が同じではない場合チェックがオフになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/072a228b-3829-89ec-75c3-e06fe88030e9.png)
183日目 SAA勉強用サイトを比べてみた社畜M

## ♠はじめに
こんにちは、社畜Mだぜ。
今回は俺が今やっているSAA（AWS Certified Solutions Architect - Associate）の勉強に使っているサイトとほかにもあるSAA勉強に使えるサイトを紹介していくぜ！

気を取り直して、さぁ、行くぜ！！！

**デュエル！**
## ♠SAAとは
まずはSAAについて軽く説明するぜ、ほかのところでやってた気もするが気にせず行くぜ。
上述しているがSAAってのはAWS Certified Solutions Architect - Associateの略で、AWSが提供する認定資格だぜ。クラウド上で安全で高性能なアプリケーションを設計・構築する能力を証明する。この資格は、AWSの主要サービスやベストプラクティスに関する知識を評価し、1年程度の実務経験を持つ人を対象としていて、SAAはクラウド技術者にとって重要なステップであり、キャリアアップに役立つ価値ある認定として広く認識されているぜ。

いよいよ次は俺が使っているのも含めてSAA勉強に使えるサイトを挙げていくぜ！俺のターン！！
## ♠社畜Mが利用している勉強サイト
### ♥1.Cloudlicense
俺が勉強に使っているのはコイツだぜ、「**Cloudlicense**」。
CloudLicenseは、AWS認定資格の取得を目指す人々に広く利用されているオンラインの学習プラットフォームだぜ。AWSの各種認定試験に特化した問題集と学習ツールを提供していて、効率的な試験対策を可能にしているぜ。
特徴として…
- **2つの学習モード**
CloudLicenseには「学習モード」と「AWS認定本試験モード」の2つが用意されているぜ。この学習モードは1問1答形式で基礎的な問題も含まれ、本試験モードは実践的な65問が出題され本番の試験環境を再現するぜ。
- **豊富な問題数と質の高さ**
CloudLicenseで勉強できる対象はSAAだけじゃいぜ！
一つの資格につき500〜1000問程度の豊富な問題が用意されていて、特に本試験モードでピックアップされる問題は、実際のAWS認定試験と同レベルの質の高い内容となっているぜ。
- **効率的な復習機能**
間違えた問題のみを表示する機能や、問題をお気に入り登録して3つのカテゴリに分類できる機能がある。これにより、効率的に弱点を克服し、重要な問題を繰り返し学習することができるぜ！個人的にこれがかなり助かるぜ！

CloudLicenseには二つの料金プラン、4,080円のベーシックと4,580円のプロフェッショナルの二つがあるがSAAを受けるということに視点を置くならベーシックをお勧めするぜ。
今挙げた金額で90日使えるからな、ただお支払いはクレジットカード等だから気をつけろよ！

**CloudLicenseのURL**
https://cloud-license.com/

## ♠社畜Mが紹介する勉強サイト
こっからは俺が知っているCloudLicense以外の勉強サイトを無料と有料を混ぜて3つ挙げていくぜ！
見やすく手短に行くぜ！

|名称|特徴|
|-|-|
| [AWS認定資格 無料WEB問題集](https://aws-exam.net/clf/)| SAAの試験対策に特化した無料の問題集を提供<br>・完全無料で利用可能 <br>・170問以上の問題を提供<br>・難易度別に問題を選択可能<br>**CloudLicenseとの違い：**<br>無料で利用できる点が最大の違いだな。問題数は少ないが、コストをかけずに学習を始められるぜ。|
| [Ping-t](https://mondai.ping-t.com/g) | 大規模なIT試験学習プラットフォームで、SAAの試験対策に豊富なリソースを提供<br> ・600問以上の無料問題を提供<br>・ユーザー同士の助け合いフォーラムあり<br>・学習進捗の管理機能<br>**CloudLicenseとの違い：**<br>問題数が多く、コミュニティ機能が充実している点が特徴だぜ。無料で利用できる範囲が広いのも魅力だな。|
| [CloudTech](https://kws-cloud-tech.com/) | 動画コンテンツを中心としたAWS学習プラットフォーム <br>・280本以上の解説動画を提供<br>・AWS認定試験の全12科目をカバー<br>・体系的な学習カリキュラム「AWSエンジニアロードマップ」<br>**CloudLicenseとの違い：**<br>動画コンテンツが充実していて、体系的な学習が可能だぜ。問題集だけでじゃなく、総合的なAWS学習プラットフォームとして機能しているのが特徴だな。|

あくまで今回はこの3つを挙げたが他にもあるからな、そこは探してみてくれ。
CloudLicenseとの違いを使ったのは違いがあった方がわかりやすいと思ったからだぜ。


## ♠まとめ
今回はSAAの勉強に使えるサイトを挙げてきたが、どれを使うかは人それぞれだからな自分で決めてくれよな！俺も今SAAの勉強はしているがSとLは先に合格してるからな、頑張って追い付かねぇとな。今回上げたやつはSAAだけじゃなくてほかのAWSの資格試験の勉強にも使えるやつだから、覚えといてくれよな！

## ♠おまけ
今回の社会人が知っておいた方がいいビジネスマナーはこいつだ！
「**ビジネス文書は書き方を使い分けろ**」だぜ。

今でも使うときがあるビジネス文書だが社内文書と社外文書の二つがあるぜ。両方とも「横書き」であることと「口語体（話し言葉）を避けて文体は統一」この二つは絶対厳守だぜ！次に社内文書と社外文書の違いだな。

**社内文書**
業務上の指示や連絡、報告などに使用。内容と効率を重視するため前文を省略し、要点がすぐに伝わる文書を作成するのがコツだぜ。

**社外文書**
コミュニケーションよりも内容記録の意味合いが強く、感情的なやり取りを避けて客観的に事実を述べることがポイントになるぜ。

例を挙げると
社内文書が…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/c7ce3ad9-ef4f-15ba-a0e5-506111382203.png)
こんな感じで

社外文書が…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/5d8e713b-8a60-32f3-2448-1697e4c41ad2.png)
こんな感じだぜ

書き方の違いって正直俺もわからないことが多いがこれを知っておいても損はないと思うぜ！

今回はここまでだぜ！！！
**俺はこれでターンエンド**