OmniAICreator/Qiita-1.07M huggingface dataset:
新卒エンジニアの情報処理安全確保支援士勉強方法と合格記【令和5年度秋季】

## はじめに
令和5年度(2023年)秋季の情報処理安全確保支援士(以下、SC)の試験に合格したので、学習方法と所感を記録しておく。

## 受験時の筆者のプロフィール
- セキュリティ系のエンジニア 新卒1年目
- 大学・大学院：情報工学
- 保持資格：特になし

## 受験した所感
### 受験結果
午前1 : 91点 (27/30)
午前2 : 72点 (18/25)
午後  : 80点 

### 受験直後の手応え
#### 午前1,2
自己採点をした点数と同じでした。

午前2が72点と低めの点数になってしまったのは、法規制などのテクノロジー以外の分野の勉強を怠っていたせいです。

#### 午後
午後問題は大問が4つあるうちの2,3を選択しました。公開されている回答と自分の回答を照らし合わせたところ、記述でちょうど4問間違えていたので、記述は1問5点なのかな。

試験直後に自己採点したときは60点前後で怪しいかも、と思っていたのですが全然余裕でした。自己採点とこんなに差が出た理由は後述します。

## 勉強方法
### 総勉強時間
150時間程だと思います。
午前1の学習時間を除くと120時間くらい。

### 教材
情報処理教科書 情報処理安全確保支援士 2023年版 (通称"上原本")
![uehara.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196804/5fcf4d9a-5859-09e1-d51c-49c71df4329e.jpeg "情報処理教科書 情報処理安全確保支援士 2023年版")

https://www.ap-siken.com/apkakomon.php

https://www.sc-siken.com/sckakomon.php

### 勉強手順
1.細かい部分まで読み込む必要はないので、上原本を1周目を通す。<br>
2.支援士の過去問道場を9割以上正答できるまで解く。
<strong>※ 正解の選択肢以外でも知らない単語が出てきたら調べる(ネットと上原本)</strong>
3.午後1試験の過去問を直近5年分程(10試験)解く。<br>
　<strong>※ 題材にされた技術を調べる</strong> <br>
4.午後2試験の過去問を直近3年分程解く。<br>
　<strong>※ 間違えた原因を分析する</strong>

5.最新の試験で時間を図りながら解く。<br>

EX.試験1か月前になったら、応用情報の過去問道場を並行して実施。8割くらい取れるようにしておく。

### 学習のコツ
- とにかく知らないモノをなくす
    - なんだかんだ知識があればゴリ押しできます。
    - 午前2試験と午後1試験で必要な知識は定着できます。
- 一つ一つの技術を理解する
    - 午後試験の難しいところはそれぞれの技術について、<strong>「仕組み・脆弱性・攻撃方法・対策方法」</strong>をしっかり知る必要があるところです。
    - 午後1試験で取り上げられた技術について、上記の部分をまとめると良いです。
- 間違えた原因を抑えておく
    - SCの午後試験で誤回答をする理由は大体以下の3種類だと思います。
        - そもそも知らなかった
        - 文中から読み取れなかった
        - 答えはわかっているけど、記述できなかった
    - 間違えた原因によって、対策も変わってくるので<strong><font color="red">超重要</strong>です。


## 自己採点の仕方
多くの方が学習するうえで悩みになるのが、午後試験の自己採点だと思います。
年度によって変わるのかもしれないのであくまで私の所感ですが、配点は選択肢・単語記述が2点、記述が5点と考えて採点するのがよいと思います。
<br>
それぞれの記述問題については、<strong>一意に読み取ることができて内容があっていれば</strong>正解とみなしてよいと思います。
　例）
 　　不正解：FWでIPアドレスを許可する
　　 正解　：FWで<font color="red">送信元の</font>IPアドレスを許可する

### 自己採点と実際の結果の差について
私は解答速報などで自己採点した際には、60点前後だと考えていました。しかし、実際に蓋を開けてみると80点でした。
ここで一つ感じたのは、部分的な追加点はあるかもしれませんが、<strong>部分的な減点はあまりないのではないか、</strong>ということです。
自己採点の際には厳しめにつけるために、記述問題で少しでも怪しい部分があれば減点していました。
ただ、実際の点数を見てみると明らかに間違えたのが記述4問で、その他の記述問題については内容的には概ねあっていたので、こんなことを思った次第です。(あくまで個人的な所感です。)

## まとめ
SC試験に限らずですが、問題を解くのではなく、中身をしっかり理解することは大切だと感じます。
間違いに関しても何が原因で間違えたのでアプローチは変わってくるのでそこを分析できると良いと思いました。

少しでも、今後SC試験を受ける方の参考になれば幸いです。
最後までお読みいただきありがとうございました。
Date型のmonthはmonthIndexなので注意

# このページは？
javascriptの`new Date(2024, 1)`と`new Date('2024-1')`の違いについて説明することができますか？
あまり直感的な仕様じゃなく、混乱したのでまとめます。開発者ツールのconsoleで気軽に確かめられることなので、是非自分でも動かしながら読んでください。
# 内容
## monthにはmonthIndexが格納されている
前提として、Date型のmonth要素には月(1月-12月)ではなく、 monthIndex(0-11)が格納されています。
つまり、単純に`getMonth()`するとずれた値が返ってくる。
```javascript
// date: 2024年1月
date.getMonth()
// 結果: 0
```
なので、現実世界の月として扱う際は+1する必要がある。
```javascript
console.log(`${date.getFullYear()}年${date.getMonth()+1}月`)
// 結果: 2024年1月
```
## new Date()するときの注意
ここからが本題です。上述の仕様に関連し、new Date()する際に、intを与えるかstringを与えるかで得られる結果が変わってきます。
```javascript
// monthIndexに1が格納されるので2024年2月が返ってくる
new Date(2024, 1)
// 結果: Thu Feb 01 2024 00:00:00

// stringを与えると、そのまま2024年1月が返ってくる
new Date('2024-1')
// 結果: Mon Jan 01 2024 00:00:00
```
この仕様に惑わされて、画面上に実際とはズレた月が表示されるインシデントを起こしてしまいました。。
# まとめ
month変数に現実世界の月の値が格納されているのかmonthIndexの値が格納されているのかコードから読み取るのは辛いので、その辺りの取り扱いについてチーム内で認識を合わせておくことが大切だと思います。自分としては、monthには現実世界の月の値を格納しておき、`new Date()`する際に`monthIndex`に変換する方針が丸いのではないかなと考えています。
`monthIndex`を扱う為に `+1` `-1`するのはマジックナンバーになってしまいますが、Date周りで扱っていればまあ察することができるだろうという。
```javascript
// dateを生成する時
const year = 2024
const month = 1
new Date(year, month - 1)
// 結果: Mon Jan 01 2024 00:00:00

// monthを取得する時
const date = new Date('2024-1')
const month = date.getMonth() + 1
console.log(month)
// 結果: 1
```
# 参考
* https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth
Go環境構築

golangの環境構築方法をメモに残します。

## Goコンテナ作成
goenvを使ってバージョンを指定します。
バージョンは1.16.4です。

```terminal
goenv install 1.16.4
```

```terminal
goenv local 1.16.4
```

## DBコンテナ作成
golangのコンテナを作成します。
またdocker-compose up時にmain.goが実行されるようにします。

```yaml
version: '3'
services:
  app:
    image: golang:latest
    volumes:
      - ./app:/app
    working_dir: /app
    ports:
      - "8081:8080"
    command: go run main.go
```

## db container
次にDBのコンテナを作成します。
DBにはmysqlを使いました。

```yaml
db:
    image: mysql:latest
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
      MYSQL_DATABASE: MYSQL_DATABASE
      MYSQL_USER: MYSQL_USER
      MYSQL_PASSWORD: MYSQL_PASSWORD
    ports:
      - "3306:3306"
```

## DB接続
golangからmysqlへ接続できるようにします。

```go:app/main.go
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	dataSourceName := "MYSQL_USSER:MYSQL_PASSWORD@tcp(mysql:3306)/MYSQL_DATABASE"

	db, err := sql.Open("mysql", dataSourceName)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("connected")
	defer db.Close()
}

```
REST4つの原則とは?

# REST4つの原則の話
「RESTfulなWebサービスの構築」って、ぱっと聞いて理解できる頭じゃなかったので、まとめることにしました。
他の記事を参考にしたり、ChatGPTを使ったりしているので、誤情報もあったりなかったりするかもしれませんが、ご参考までに

# アドレス可能性 (Addressability)
Webサービスが提供している情報に対して、一意の識別子を通してアクセスできることを言います。
ここではURIが「一意の識別子」に当たります。
### URIとは
「URL」と「URN」の総称で、識別子の種類によって、URLかURNに変わります。

#### URL
インターネット上のリソースの場所(Location)を示すためのURIの一種。
よく見る「http」や「https」を含む形式で、具体的な場所を示している事が多い
```
https://www.example.com
```
#### URN
リソースに永久的な固有の名前(Name)を提供するURIの一種
永久的な名前を提供するので、場所に依存しない
```
urn:isbn:0451450523
```

# ステートレス性 (Stateless)
システムがクライアントの前回の状態を覚えておらず、各リクエストが独立している状態を指します。つまり、直前になにをしていても、各々が独立していて自己完結しているので、何度同じリクエストをしても同じ結果が返ってきます。また、「独立している=依存していない」ので、拡張もしやすいのも特徴の一つです

# 接続性 (Connectability)
情報内部に、他のリソースへのリンクを含めることができることです。
QiitaやYoutubeの概要欄など、関連性を持った別のページに飛ぶことができるリンクを保有できるということがまさに持続性を持っているということになります。

# 統一インターフェース (Uniform Interface)
情報の操作(取得、作成、更新、削除)が統一されているということです。
リソース側とクライアント側が統一されたインターフェースを持っているので、一貫した操作、アクセスが可能になります
代表的なのはHTTPメソッドのGET, POST, PUT, DELETEになります
RESTfulなサービスで、HTTPメソッドを採用しているなら、どのサービスでもGET,POST,PUT,DELETEをクライアント側での操作で可能ということです
(サービス提供側でDELETEができないようにするなどの制限をかけることはできますが...)

# まとめ
 RESTfulなサービスとは、REST４つの原則である「アドレス可能性 (Addressability)」、「ステートレス性 (Stateless)」、「接続性 (Connectability)」、「統一インターフェース (Uniform Interface)」で、サービスが提供する情報を一位の識別子を通してアクセスできて、それぞれの処理が独立していて、他のリソースにアクセスできるリンクを保有できて、統一されたインターフェースによって操作ができるサービスのこと！
Docker + MySQL + Rails5環境でRailsコンテナが起動できない問題

# 環境
Ruby:2.4.6
Rails:5.2.8
MySQL:5.7

# 対処法
タイトルの通り、以下のコマンドを実行後にRailsコンテナが起動しない(Exit1)事態に陥りました。

```
docker-compose up -d
```
ログは次のようになります。
```
web_1  | /usr/local/bundle/gems/loofah-2.21.1/lib/loofah/html4/document.rb:10:in `<module:HTML4>': uninitialized constant Nokogiri::HTML4 (NameError)
web_1  | Did you mean?  Nokogiri::HTML
web_1  |        from /usr/local/bundle/gems/loofah-2.21.1/lib/loofah/html4/document.rb:4:in `<module:Loofah>'
web_1  |        from /usr/local/bundle/gems/loofah-2.21.1/lib/loofah/html4/document.rb:3:in `<main>'
web_1  |        from /usr/local/bundle/gems/loofah-2.21.1/lib/loofah.rb:36:in `require_relative'
web_1  |        from /usr/local/bundle/gems/loofah-2.21.1/lib/loofah.rb:36:in `<main>'
web_1  |        from /usr/local/bundle/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
web_1  |        from /usr/local/bundle/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
web_1  |        from /usr/local/bundle/gems/rails-html-sanitizer-1.5.0/lib/rails-html-sanitizer.rb:2:in `<main>'
web_1  |        from /usr/local/bundle/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
web_1  |        from /usr/local/bundle/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
web_1  |        from /usr/local/bundle/gems/actionview-5.2.8.1/lib/action_view/helpers/sanitize_helper.rb:4:in `<main>'
web_1  |        from /usr/local/bundle/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
web_1  |        from /usr/local/bundle/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
web_1  |        from /usr/local/bundle/gems/actionview-5.2.8.1/lib/action_view/helpers/text_helper.rb:34:in `<module:TextHelper>'
web_1  |        from /usr/local/bundle/gems/actionview-5.2.8.1/lib/action_view/helpers/text_helper.rb:31:in `<module:Helpers>'
web_1  |        from /usr/local/bundle/gems/actionview-5.2.8.1/lib/action_view/helpers/text_helper.rb:8:in `<module:ActionView>'
web_1  |        from /usr/local/bundle/gems/actionview-5.2.8.1/lib/action_view/helpers/text_helper.rb:6:in `<main>'
web_1  |        from /usr/local/bundle/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
web_1  |        from /usr/local/bundle/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
web_1  |        from /usr/local/bundle/gems/actionview-5.2.8.1
```

対処法としては次のようになります。
- Gemfileに ``gem 'loofah', '~> 2.19.0'`` を追加する
- 以下のコマンドを実行してGemfile.lock上のloofahのバージョン指定を修正
```
docker-compose run web bundle update loofah
```
- ビルドを実行してgemをインストール。
```
docker-compose build
```

再度コンテナを起動するとステータスはUpになっており、無事解決しました。
超音波センサの使い方について調査中

画像系のセンシングでは、ガラスや鏡がある環境での計測は得意としていない。
また画像系のセンシングでは、遅延時間が大きくなりやすい。
動画のフレームレートを 30 fps より大にしていることは稀でである。
データの取得だけで30msかかっている上に、画像の絵作りのための処理（auto white balance, High Danamic Rangeなど）の処理の分だけ遅れた画像が、ISPから取得される。この後に、画像計測処理、画像認識処理が入れば、遅延はもっと増える。
そのため、ぶつからないことを目標に入れると、超音波センサの利用を視野に入れたい。

## 超音波センサ
- 画像センサに比べ格段に速い。処理が軽い。


>超音波センサは、送波器にから超音波を対象物に向け発信し、その反射波を受波器で受信することにより、対象物の有無や対象物までの距離を検出する機器です。ミリ波センサとも原理は似ています。
超音波はその名の通り、音を使ったセンサのため、超音波の発信から受信までに要した時間と音速との関係を演算することでセンサから対象物までの距離を算出しています。
>音波は周波数帯20kHz～とミリ波レーダに対して低いため、直進性が低く計測距離も～10mとなっています。
> 車両では車のバックソナーや前方のソナーセンサーとして搭載されており、自動駐車など低速域における周辺の距離センサとして活用されています。

[引用元](https://www.zmp.co.jp/knowledge/ad_top/dev/sensor)

## Murata [空中超音波センサ アプリケーションガイド-利用方法・用途](https://www.murata.com/ja-jp/products/sensor/ultrasonic/overview/apps)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/44be25e1-f144-2180-d04f-93e045b7f21a.png)
[引用元](https://www.murata.com/ja-jp/products/sensor/ultrasonic/overview/apps)


[ぶつからないロボットに欠かせない！ 超音波センシングのススメ](https://edn.itmedia.co.jp/edn/articles/1903/18/news001.html)

[ロボット技術の整理/超音波センサー](https://study-robot.jp/sensor/ultrasonic/)

## 超音波センサとドップラー効果
- 対象物から反射して返ってくる超音波は、対象物の速度に応じて波長が変わってくる。対象物が近づいていれば、波長が短くなる。
- 超音波センサの種類によっては、受信波の波長のシフトを測定することで、対象物の速度を測定できるものも市販されている。
- ドップラー効果での速度の計測の利点：
    - 異なる時刻での計測を必要としない。その時刻の計測だけから速度が算出できる。
    - （異なる時刻での計測を必要としないので、速度の誤差の要因が少ない。）
    - 速度を算出するまでの計算量が少なく、計測した時刻から結果が得られるまでの遅延が少ない。
- 他の距離センサで速度を推定する場合の難しさ：
    - 距離の算出は誤差要因がたくさんありすぎる。
    - 例：ステレオ計測は、遠方ほど誤差が大きくなりやすい。２つの時刻間の距離の差を算出する際に、誤差が大きくなりやすい。
    - 例：それぞれの計測(画像計測)した時刻が、正しく算出できていないと、速度=距離の差/時刻の差 として、誤差を大きくしてしまう。
    - 例：２D画像での物体検出枠を、路面上の距離と対応付けてしまうと、物体検出枠の不安定さが、路面上の距離の不安定さになって、速度としてはますます不安定な値になってしまう。
    - ２Dの物体検出枠を利用した速度の推定は、最新の画像の取得から、その画像で物体検出を行い、さらに前の時刻での物体検出結果との対応付けを行うまでの時間が遅延として発生してしまう。このため、少ない遅延での応答を期待する用途に物体検出を用いるのは得策ではない。

### 超音波センサでの距離の算出手順
- 超音波センサでは、送信時刻と受信時刻との時間差を計測するのが基本です。
- そのため、音速を用いて距離に換算します。
- 音速は常圧時でも空気の温度で変わります。
そういったことが、これらの使い方の記事に書いてあります。

## ASIMO
> 視覚センサーでは捉えられないガラスなどを含め、音波で3m先の障害物を検出します。
https://www.honda.co.jp/factbook/asimo/201111/ASIMO2011-11_ja.pdf

![Screenshot from 2023-12-25 11-58-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/037b1ca5-6c2e-7fef-c2f7-87c728a4a911.png)

---
USBインタフェースで利用可能な超音波センサもある。
[超音波方式 USB 汎用距離センサ・距離計](https://tokyodevices.com/items/175)


Arduino Uno での記事[電子工作 その14（超音波センサー：HC-SR04の使い方）](https://zenn.dev/suzuky/articles/8df938c6f56fec)

[超音波距離センサの使い方](https://zenn.dev/megeton/articles/73ccb4bee963af)

## 製品の検索サイト
https://www.monotaro.com/k/store/%E8%B6%85%E9%9F%B3%E6%B3%A2%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC/

## 3D超音波センサ

超音波距離センサは、最近接の距離を知るためのもので、それが超音波を送受信する範囲のどの角度からきたものかを知ることまではしないものが大半です。

3D超音波センサという製品が存在します。
これは、超音波が戻ってきた方位をも返すセンサです。
そのため、対象物のある方位を知ることができます。
次世代型の衝突防止センサとして利用可能です。
製品の例　TOPOSENS
https://cornestech.co.jp/product/products_toposens
NPS + WiFi + 802.1x 認証 (MS-CHAPv2) クライアント側の設定

# はじめに
802.1x認証 - PEAP (MS-CHAPv2) の WiFi アクセスポイントに接続する際に必要な Windows クライアント 側 の設定です。

サーバーや WiFi-AP 側 の設定については、以下の記事を参照してください。

https://qiita.com/carol0226/items/05d8ef17a6d25018cd4e

本記事の内容とは別に、Intune で クライアント側の構成を配布する方法もあります。
ルート証明書や WiFi プロファイルの構成などを すべてまとめて構成して 配布できます。
以下の記事にまとめてありますので、参照ください。

https://qiita.com/carol0226/items/99e1674ce6be6e24f53c

# 手順の開始前に

なお、1～3 章 の構成を全く行わなくても、OS 既定の設定で WiFi-AP への接続は可能なはずです。
接続できるかどうか、確認してみましょう。
しかし、1～3 章 の対応 を行わないと、ID + Pass を入力したあとに、以下の画面が表示されます。

「接続を続けますか？」で、「接続」ボタンを押す必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/dc4da93f-b2db-f534-ae7e-1de67dca0271.png)

クライアント が ドメインに参加していれば、1～3 章 のすべての対処を行うことで、「接続を続けますか？」の画面の表示を抑制することができます。

なお、2 章 と 3 章 の設定おこなって、1 章 だけ未構成だと接続できないなど、動作要件が厳しいです。注意して対応してください。

中途半端に行わず、1～3 章 は すべてセットで実装する必要があると考えて下さい。

:::note warn
1～3 章 の作業は、PC 毎に いちいちやっていられませんよね？
なので、PC 単体で 接続テスト が成功したら、2章 , 3 章 の設定は GPO を使って配布するのが ベストプラクティス です。
そうすれば、ユーザーの手を煩わすことなく、「接続を続けますか？」のメッセージを抑制できます。
:::

# 1. NT Auth ストア に ルート証明書 を インポート する
ドメインコントローラー にて、以下の記事に記載された対処を行ってください。
ドメイン に参加した PC にも反映されます。
WORKGROUP の PC の場合は、各マシンごとに対応が必要です。その場合の手順も、以下の記事に記載してあります。

https://qiita.com/carol0226/items/5dde4fe77220f4388945

# 2. クライアント の 信頼されたルート証明機関 へ ルート証明書 を インポート する
### 2-1. ルート証明書 の 単体 PC 用手順（接続テスト用）
NPS 用 サーバー証明書 と ペア となった ルート証明書 が、クライアント の「信頼されたルート証明機関」にインポートされている必要があります。

以下の記事を参照し、クライアント の 信頼されたルート証明機関 へ ルート証明書 をインポートしてください。

https://qiita.com/carol0226/items/33042c5c639c79832aeb

:::note info
AD CS で、HTTP のファイアウォールが許可されて、クライアントPC がドメイン参加 されていれば、クライアント の ブラウザ で 直接　AD CS の IP に接続して クライアント証明書 を ダウンロードすることもできます。
:::

### 2-2. ルート証明書 の GPO 配布方法（運用向け）
（公開情報：グループポリシー を使用してクライアントコンピューターに証明書を配布する）

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-fs/deployment/distribute-certificates-to-client-computers-by-using-group-policy

## 3. WiFi プロファイルの設定
### 3-1. WiFi プロファイル の 単体 PC 用手順（接続テスト用）
以下の記事を参考に、WiFi プロファイルを作成します。

https://qiita.com/carol0226/items/0aa29d3a3004f5241012

:::note warn
（重要）
WiFi プロファイルは、一度 WiFi-AP に接続されると そのまま PC 内に保存されて、以後 同じ SSID に接続する際に転用されます。
接続しなおす テスト等 を行う場合は、毎回 WiFi プロファイル を 削除してください。
- netsh wlan show profile で、プロファイル を一覧表示
- netsh wlan delete profile = [プロファイル名] で、プロファイル を削除

※ GUI でも 接続中の WiFi 名 を、右クリックして "削除" できます。

コマンドの実行例は、以下のリンク先で確認してください。
https://qiita.com/carol0226/items/0aa29d3a3004f5241012#コマンドでの確認方法
:::

### 3-2. WiFi プロファイル の GPO 配布方法（運用向け）
（公開情報：Windows で EAP プロファイルを構成する）
グループ ポリシー エディター (デスクトップとサーバー)
→　この章の手順で WiFi プロファイル を GPO で配布します。

https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/extensible-authentication-protocol/configure-eap-profiles?tabs=netsh-wifi%2Cpowershell-vpn%2Csettings-wifi%2Cgroup-policy-wifi#group-policy-editor-desktop-and-server
ネットワーク状態確認ツール Trippyインストール備忘録

# 目的
TrippyというツールでICMPなどのネットワーク状態確認できるとのことなので、インストールした際の備忘録

# インストール
RPMが配布されているので、RPMを使用するか、cargoでインストールを行う。
今回はcargoでインストールを行った。
```
# cargo install trippy
```

# 実行
```
# trip 対象のIPアドレス
```
:::note warn
TeraTerm4系だとトラフィック等の部分が?で表示されるが、Teraterm5では正常に表示される。

TeraTerm5で表示が崩れる場合はTeraTermの「その他の設定」→「coding」で「Ambiguous Characters width」を「2 Cell」から「1 Cell」に変更する。
:::

# 参考
https://github.com/fujiapple852/trippy
【React】ChatGPTを使っておみくじサイトを作ってみた

# はじめに

あけましておめでとうございます。KDDIアジャイル開発センター所属のtakateinです。
大晦日の日に「今年はAIが本当に流行ったけど、chatGPT使って開発してないなぁ」と、ふと思い作ることにしました。

# なぜ、chatGPTを使うのか
"おみくじを引くだけ" のアプリだと面白くなくて、一言メッセージを添えるとユーザーも楽しそう。
この一言メッセージを人間が考えてDBとかに保存してランダムで使用するよりかは対話型AIに考えてもらった方が面白そうだから。

# 完成品
こちら
http://agorophius.com/game/2024_AgoMikuji/index.html

個人でバンド活動をしており、SNSを観てくれる方が年始から気軽に楽しめるコンテンツが提供出来たらいいなー と思い作りました。
chatGPTには、「ユーザー名を読み込み、ランダムにおみくじの結果を返す。その結果からバンド名にあった面白い曲名」を考えてもらうようにしました。

↓↓↓こんな感じで返ってきます↓↓↓
_________
「ふん、たかてぃ～んさんへのおみくじね。せーのっ！中吉！2024年はにやけ充実！さて、バンドAgorophiusのオススメ曲は『キラキラ☆デストラクション』！元気が湧いてくるようなカラフルな曲よ。楽しんでね♪」
_________


# 実現したいこと(ユーザーストーリー)
- おみくじを引き、結果が出る
- 名前などを記入し、結果に影響
- アドバイス等のメッセージを出す
- ハッシュタグを使いSNSに投稿

# 参考にした記事たち

Reactで書きました。中身は非公開にしますが、参考にした記事たちです。
やっぱりreactはパッケージが優秀すぎ…

- chatGPTのAPIを実行するのに参考にした記事
https://digipress.info/tech/sample-code-with-chatgpt-api-in-react/

- 金色のボタンの参考記事
https://jajaaan.co.jp/css/button/

- twitterシェア機能/ボタンの参考記事
https://blog.killinsun.com/posts/2021/08/28/using-react-share-for-my-blog

- お借りした素材
龍とおみくじセット https://www.ac-illust.com/main/detail.php?id=24547661&word=%E9%BE%8D%E3%81%A8%E3%81%8A%E3%81%BF%E3%81%8F%E3%81%98%E3%82%BB%E3%83%83%E3%83%88&searchId=

# 公開方法
AWSとかは使わず使用しているドメインにファイル1式をアップロードしてます。

# 最後に
12月31日23時にやる気が出てテレビ見ながら4時間ぐらいで作ったので異常系考慮やローディング画面未実装です。気が向いたらやります。

今年もよろしくお願いします！！！

# おまけ

Bingに「おみくじアプリを使ってみたい人のユーザーストーリーを考えてみて」と質問してみたら以下の答えが返ってきました。
割と良いものができた気がします。

-----------------------

おみくじアプリを使ってみたい人のユーザーストーリーを考えてみました。

例えば、新年を迎えたばかりのあなたは、おみくじアプリを使って、今年の運勢を占ってみたいと思っています。あなたは、アプリストアでおみくじアプリを検索し、ランキング上位のアプリをダウンロードします。アプリを開くと、アプリ内で自分の名前や生年月日を入力するように促されます。あなたは、自分の情報を入力し、おみくじを引くことができます。アプリは、あなたの運勢を表示し、吉凶の結果に応じて、アドバイスやメッセージを表示します。あなたは、毎日の運勢をチェックすることもでき、アプリ内で運勢の履歴を確認することもできます。

おみくじアプリを使うことで、あなたは、自分の運勢を知ることができ、吉凶の結果に応じて、自分自身を振り返ることができます。また、アプリ内で表示されるアドバイスやメッセージを参考に、自分自身を成長させることもできます。

以上のようなユーザーストーリーが考えられます。おみくじアプリを使って、あなたも自分自身を振り返ってみませんか？🎉
Laravel Eloquent　不要なデータは取得しないようにしよう！

現在、Laravelの使用経験が半年を越えた学生エンジニアです。

Laraelには非常に便利な「Eloquent ORM」という非常に便利な概念が存在します。
主に以下のような解釈ができると思います。

 1. SQLの簡略化
 1. データベースへのインターフェース

 ざっくりとご説明したいと思います。

 ## 「Eloquent ORM」と「Model」
 LaravelはMVCモデルと呼ばれています。

 **Model View Controller**の略です。
 1. Modelを用いてテーブルからデータ取得
 1. Controllerを用いてデータを処理
 1. Viewで処理されたデータを表示

上記の流れで運用されるためです。（厳密にはもっとたくさんありますが！）

上記の1の工程がModelですが、
**Eloquent ORM と　Modelはほぼ同義と考えて構いません**

では実際に効率的に書いていきましょう！

## なるべく不要な値を取得しない

```
 $attendances = Attendance::all();
```
まず、Attendanceモデルですが、私が勤怠管理のwebアプリケーションを作成した際のモデル名です。
attendancesテーブルにある全ての値を取得するという処理です。

:::note warn
全てが必要ならば問題ありませんが、「全部取得しておけば、問題ないだろう」という理由ならば、このような記述はやめましょう！
:::

1. パフォーマンスが悪い
1. イケてないコードになる

どうせならイケてるコード書きましょうよ！

## イケてるEloquentに便利なメソッド
### withメソッド+カラム指定

:::note warn
withメソッドはリレーションが組まれた別テーブルから紐づいているフィールドを取得するためのメソッドです。紐づいているフィールド全体を取得しますが、不要なカラムを取得していることが多くあると思います。
:::
そのような時にカラムを指定する方法が以下の書き方です。

```
$reserves = Reserve::where('user_id',Auth::id())->with('gourmets:id,name')->get();
```
以前制作した飲食店一覧のwebアプリケーションでreservesテーブルという予約に関するデータを保存するテーブルから必要なデータを取得する処理です。

where句　：「user_idカラムがログイン中のユーザと一致するフィールド」
with ：Reserve.phpにgourmetsというリレーションを定義、nameというカラムのみを取得

:::note alert
with('gourmets:name')
nameカラムのみを取得したいのであれば、nameのみ書けばいいじゃんと思いますが、必ずidカラムの取得は必要なようです。
:::

### whereInメソッド
```
whereIn(検索対象のカラム,配列)
```
配列内と一致する値があれば、自動的にそのフィールドを取得してくれます。
複数フィールドを取得されるので、非常に便利です。


私はなるべくイケてるコードを書きたいので、賢そうなコードを書くように心がけています（笑）

## 終わり
やはり、書くプログラムをより効率的でイケてるものにしたいでしょう。
Pull Requestがアホそうに見られるのは嫌なものです。

パフォーマンスを向上させてかつ、難しそうに見えるプログラムを書いていきましょう。
競プロで使えるSwiftのコードたち。

## はじめに
やはりエンジニアであれば基本的なアルゴリズムへの理解を深めておきたいなということで、競プロを始めました。
普段はiOSのエンジニアをしているので、言語にはSwiftをチョイスしています。

C++がメジャーで、処理性能もいいみたいですが、競プロの世界で頂点を目指してやろう！みたいな野望はなく、教養として身につけたいというくらいなので、一番慣れているSwiftを選択しました。

使用サイトについてはいくつか候補がありましたが、AtCoderにしました。

勉強していく過程で知ったメソッドなど競プロに役立つコードの書き方を、ほぼ自分用の学習記録として残していきます。

## この記事に書いてあること
- 問題を解いていく中で便利だなと思った関数について、使い所とともに残していきます。
- 始め方については本記事には書いていないので、「今から始めるよ」という方は、以下の記事を参考にしてみてください


https://qiita.com/kntkymt/items/4f02c6b90462f354de6d

## 競プロで役立ったコードたち
### ①各桁の数字を足すコード

```Swift
let num = 1234

let digitSum = String(num).compactMap { $0.wholeNumberValue }.reduce(0, +)

print("合計: ", digitSum) // 合計: 10
```
`wholeNumberValue`を使用すことでCharacter型の数字を`Int?`型で扱えます。
Intに変換できない文字(a,-など)は`nil`になります。
今回のコードでは数字に変換できたもののみを使用して、`reduce`で足したいので、`compactMap`を使用しています。

一応以下のようにも書けます。
```Swift
var nums = 1234
var sum = 0

while nums > 0 {
    sum += nums % 10
    nums /= 10
}

print("合計: ", sum)
```

このコードは以下の問題で使用しました

https://atcoder.jp/contests/abc083/tasks/abc083_b

### ②同じ数字でできる数字の配列(小さい順)を作成する

`1,11,111,1111...`や`2,22,222,2222...`のような数字の配列を作るということです。
以下のように作成できます。

```Swift
let repunits = (1...12).map { Int(String(repeating: "1", count: $0))! }
```

このコードでは`[1, 11, 111.....111111111111]`という配列を作成しています。

#### 以下の問題で使用しました

https://atcoder.jp/contests/abc333/tasks/abc333_c


便利だなと思ったメソッド等があれば随時更新していきます。
まずはAtCoderで茶コーダーを目指すぞ〜。
二分探索-leetcode Guess Number Higher or Lower

## 二分探索
検索対象と探索範囲の真ん中の値を比較して，探索範囲をだんだん半分に狭め、見つけるアルゴリズムです。

## 問題文
私たちは推測ゲームをしています。ゲームは次のとおりです。

1 から n までの数字を選択します。私が選んだ数字を当ててください。

あなたが間違った推測をするたびに、私が選んだ数字があなたの推測より高いか低いかを教えます。

事前定義された API intgues(int num) を呼び出すと、次の 3 つの可能な結果が返されます。

-1: あなたの推測は私が選んだ数字よりも大きいです (つまり、num > pick)。
1: あなたの推測は私が選んだ数字よりも小さいです (つまり、num < pick)。
0: あなたの推測は私が選んだ数字と同じです (つまり、num == pick)。
私が選んだ番号を返します。

## コード java
```java
/** 
 * Forward declaration of guess API.
 * @param  num   your guess
 * @return 	     -1 if num is higher than the picked number
 *			      1 if num is lower than the picked number
 *               otherwise return 0
 * int guess(int num);
 */

public class Solution extends GuessGame {
    public int guessNumber(int n) {
        int start=1;
        int mid = 0;
      while(start <= n){
      //探索範囲の真ん中の値①を取得
          mid =start + (n-start)/2;
     //①が検索対象と一致しているか確認
          int ans = guess(mid);
    //一致していた場合、①を返す
          if(ans ==0) return mid;
    //①が検索対象より小さい場合、start地点を右にずらす
          else if(ans==1) start = mid + 1;
    //①が検索対象より大きい場合、n地点を左にずらす
          else n = mid-1;
      }
      return -1;
    }
}
```
実行時間:0ms
メモリー:40.2MB
【3日目】フロントエンジニアがRailsを習得するまで

# 3章 ほぼ静的なページの作成

---

## railsの省略コマンド

```
rails server -> rails s
rails console -> rails c
rails generate -> rails g
rails test -> rails t
bundle install -> bundle
```

---

## `rails g` で作成したものをまとめて削除

`rails g` でmodelやcontrollerの命名を変更したい。
でも `rails g` は複数のファイルに変更を加えるので、修正が面倒。。

そういう時に使うのが `rails destroy` 。
このコマンドによって `rails g` で作成した各種変更を取り消してくれる。

### 1. Controllerを取り消す場合
`rails destroy` コントローラー名`

### 2. Modelを取り消す場合
`rails destroy モデル名` 

### 3. migrateしたDBを戻す場合
`rails db:rollback`

#### ~ 最初のバージョン ~
`rails db:rollback VERSION=0`

#### ~ 特定のバージョン ~
`rails db:rollback VERSION=20220407092210`

---

## URLでアクセスした時のrailsの流れ

1. routes.rbを参照して、URLに対応するControllerのアクションを要求
1. defで定義されているアクションが実行される
1. Controllerに対応するViewがレンダーされる（ApplicationControllerを継承してる事によって自動で行われる）
2023年に見つけたあまり知られていない便利VSCode拡張4選

## はじめに
この記事では、2023年に見つけた、Visual Studio Codeで開発作業を効率化するための便利な拡張機能4つを紹介します。
これらの拡張機能は、共通してあまり有名ではないためあえて紹介しようと思います！！

:::note info
宣伝なのですが下記、個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！
:::

https://dokupro.dev/

## 実施内容
紹介するのは以下の4つの拡張機能です。

- Multi Cursor Case Preserve
- VSCode JS Console Utils
- Laravel Goto Config
- NPM Dependency Links

これらの拡張機能は、それぞれ異なるニーズに応えるものです。

## 準備
Visual Studio Codeをインストールしておく必要があります。
各拡張機能をVisual Studio Codeのマーケットプレイスからインストールします。

### 実装手順
- [Multi Cursor Case Preserve](https://marketplace.visualstudio.com/items?itemName=Cardinal90.multi-cursor-case-preserve)
    - VScodeを使って命名の変更があった場合、`Cmd + D`でそれぞれのケースごとに選択してそれぞれで一括変更しなきゃいけないかと思うのですが、これを使うとキャメルケース、パスカルケース、小文字ケースなど、変数の命名規則をそれぞれよしなに認識してくれて一括で変更できて神です！


- [VSCode JS Console Utils](https://marketplace.visualstudio.com/items?itemName=whtouche.vscode-js-console-utils)
    - JavaScript開発において、`console.log`の挿入や削除をショートカットを使って簡単に行うことができます。

- [Laravel Goto Config](https://marketplace.visualstudio.com/items?itemName=ctf0.laravel-goto-config)
    - Laravelフレームワークを使用する開発者向けに、configディレクトリ配下に切り出して、文字列をよく記述するかと思うのですが、そのときconfig()で呼び出している側からってジャンプできなくて、何が設定されているか確認するのめちゃくちゃ面倒ですよね、、、でもこれがあれば該当の設定ファイルへ`Cmd + Click`でジャンプできます。

- [NPM Dependency Links](https://marketplace.visualstudio.com/items?itemName=herrmannplatz.npm-dependency-links)
    - package.jsonファイル内の依存関係に直接リンクを作成し、NPMやGitHubでの詳細情報へ簡単にアクセスできるようにします。

## 参考
https://marketplace.visualstudio.com/items?itemName=Cardinal90.multi-cursor-case-preserve

https://marketplace.visualstudio.com/items?itemName=whtouche.vscode-js-console-utils

https://marketplace.visualstudio.com/items?itemName=ctf0.laravel-goto-config

https://marketplace.visualstudio.com/items?itemName=herrmannplatz.npm-dependency-links
従来のdiffより差分が分かりやすいDifftasticのインストール手順

# 目的
従来のdiffより差分が分かりやすいDifftasticをインストールしてみたので、備忘録的に記述する。

# 環境
|名称|バージョン|
|---|--:|
|RedHat Enterprize Linux|8.9|

# インストール
## Rustインストール
```
# dnf module install rust-toolset
```
:::note info
RHEL7の場合、~~`yum install rust-toolset-1.35-cargo`(未検証)~~
`yum install rust-toolset`
RedHatはRustコンパイラはrustcよりもcargoを推奨している。
https://access.redhat.com/documentation/ja-jp/red_hat_developer_tools/2019.3/html/using_rust_toolset/chap-cargo
:::

## Difftasticのインストール
```
# cargo install --locked difftastic
```
~/.cargo/bin/にインストールされるのでPATHを通す。

# 実行
```
# difft ファイル1 ファイル2
```
:::note warn
コマンドはdifftになるので注意
:::



# 参照
https://difftastic.wilfred.me.uk/installation.html
mbaのバッテリーを交換してみた

私物の[MacBook Air (11-inch, Early 2014)](https://support.apple.com/kb/sp699?locale=ja_JP)のバッテリーが消耗してきたので、新しいバッテリーに交換してみました。

# 現在の状況

システム情報でバッテリーの項目を見てみます。

```
バッテリー情報:

  機種情報:
  製造元:	DP
  デバイス名:	bq20z451
  Pack Lot Code:	0
  PCB Lot Code:	0
  ファームウェアのバージョン:	511
  ハードウェアのリビジョン:	000a
  セルのリビジョン:	1198
  充電量情報:
  フル充電済み:	はい
  充電中:	いいえ
  完全充電時の容量（mAh）:	3477
  バッテリーの状態（%）:	100
  状態情報:
  充放電回数:	362
  状態:	修理サービス推奨
```

（交換後の）基盤で確認したところ、公称値5100mAhだったので68%くらいに消耗していました。10年経っても3割くらいしか減らないんだーっていうのと、3割減ったら修理サービス推奨なんだーという感じなんですかね。

10年モノなので流石にAppleケアとかは無理なので、自前で修理します。Amazonでググると対応するバッテリーが売られていました。すごいですね。今回はこちらを購入しました。

https://www.amazon.co.jp/gp/product/B0BB1Z3HJ4

# 交換してみた

ドライバーも付属していて問題なく交換できました。ぶっ壊れて煙拭いてる画像貼った方がインプ稼げそうだったのに。

```
バッテリー情報:

  機種情報:
  製造元:	SMP
  デバイス名:	bq20z451
  Pack Lot Code:	3230
  PCB Lot Code:	3230
  ファームウェアのバージョン:	2d31
  ハードウェアのリビジョン:	322d
  セルのリビジョン:	3036
  充電量情報:
  フル充電済み:	いいえ
  充電中:	はい
  完全充電時の容量（mAh）:	4751
  バッテリーの状態（%）:	56
  状態情報:
  充放電回数:	1
  状態:	正常
```

公称値が5100mAhだったのに4751mAhしかありません。流石に低すぎやしませんかね...?でも交換前よりかはマシになったのは確かです。しばらく使って様子を見てみようと思います。
Raspberry Pi のUARTを使う場合の注意点

# はじめに
ラズベリーパイ(Raspberry Pi / Raspberry Pi Zero) のUARTをPythonで使う際、UARTのポートが出現せずハマったのでまとめる。

参考にしたサイト
https://www.ingenious.jp/articles/howto/raspberry-pi-howto/gpio-uart/

## UARTの設定
ラズベリーパイでUARTを使う場合はシリアルポートを有効にする。シリアルコンソールと共用しているのでUARTを使う場合はシリアルコンソールをOFFにする。
[設定]→[Raspberry Piの設定]→[インターフェース]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/5c6bc976-b25d-20d6-3af2-1f3315d59df6.png)

# ハマった点
　ポートとしては ```/dev/ttyAMA0``` がでてきたので選択したが動作しない。ラズベリーパイのUARTを使う場合は、miniUARTという機能が使われているようで、ポートは ```/dev/ttyS0``` で割ついてこちらを選択する必要がある。
　ただ /dev/ttyS0 がなぜか Pythonライブラリpyserialの ```serial.tools.list_ports.comports()```でリストとして出てこない。理由は不明だが、同じような投稿があったので私だけでは無いよう。(https://forums.raspberrypi.com/viewtopic.php?t=344916) 解決策がわからないので、仕方なく、直接/dev/ttyS0を直接呼び出すとうまく動作した。

 ## 強引だけど作ったPythonコード
 :::note info
RaspberryPiでUART制御する際、/dev/ttyS0を自動検出しないので、下記行を追加。
```python
if '/dev/ttyAMA0' in serial_ports.values():
    serial_ports[str(len(serial_ports))]='/dev/ttyS0'
```     
:::

元記事は下記。

https://qiita.com/tapitapi/items/1dd9c66c0dff061bcd82


```python:serial_test.py
import os
import serial
import serial.tools.list_ports
import threading

#----------------------
# データを送信
#----------------------
def serial_write():
    global Serial_Port
    
    while(1):
        if Serial_Port !='':
            data=input()+'\r\n'
            data=data.encode('utf-8')
            Serial_Port.write(data)

#----------------------
# データを受信
#----------------------
def serial_read():
    global Serial_Port
    while(1):
        if Serial_Port !='':
            #data=Serial_Port.read(1)
            data=Serial_Port.readline()
            data=data.strip()
            data=data.decode('utf-8')
            print(data)

#----------------------
# シリアルポートをOpen
#----------------------
def serial_open():
    global Serial_Port
    
    #portリストを取得
    serial_ports={}
    for i,port in enumerate(serial.tools.list_ports.comports()):
        serial_ports[str(i)]=port.device
    
    #RaspberryPiのminiUART検出できないので、/dev/ttyAMA0があれば自動的に/dev/ttyS0を追加
    if '/dev/ttyAMA0' in serial_ports.values():
        serial_ports[str(len(serial_ports))]='/dev/ttyS0'

    port_val = serial_ports[ input(f'ポート番号を選んでください。{serial_ports}:') ]
    boud_val = int(input('ボーレートbpsを数値で入力してください。:'))
    prty_val = input(f'パリティーを選んでください。[N:None, O:Odd, E:Even]:')
    
    Serial_Port=serial.Serial(port=port_val, baudrate=boud_val, parity= prty_val)
    print(f'open{port_val}/{boud_val}bps/parity:{prty_val}')


if __name__ == '__main__':

    Serial_Port=''
    
    #port open
    serial_open()
    
    thread_1 = threading.Thread(target=serial_write)
    thread_2 = threading.Thread(target=serial_read)

    thread_1.start()
    thread_2.start()
```

以上
DALL-Eで日本の歴史的衣装　第７戦 戦国時代　稲姫を描かせてみる

戦国時代の小袖が難しいのであれば鎧はどうか？　ということで稲姫（徳川家康の家臣で四天王の一人、本多忠勝の娘で真田信幸の妻、小松殿）が鎧を付けた姿を描かせてみました。小袖は無理だけれども鎧は細かい時代考証にこだわらなければ生成可能なようです。そして、ポイントは稲姫本人を描かせるのではなく、**変身写真館に来ている現代の観光客が稲姫を演じようとしている**という設定にすること。

後ろにスクリーンが見えていてフォトスタジオとわかるセッティング
![DALL·E 2024-01-02 13.41.21 - A modern-day tourist in a historical attire photo studio, dressed as a Sengoku period warrior princess, resembling Princess Ina (Lady Komatsu). She is.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/1e32d53e-7de0-17d0-a484-79c7f4d67fda.png)
**Prompt**
A modern-day tourist in a historical attire photo studio, dressed as a Sengoku period warrior princess, resembling Princess Ina (Lady Komatsu). She is wearing Sengoku era armor, but without a helmet, to showcase her long, straight black hair, simply tied at the back, reaching down to her waist. She holds a fake spear, emulating Princess Ina's signature weapon. The tourist does not wear makeup, maintaining a simple appearance. The background is a photo studio with subtle historical Japanese elements.

義父の真田昌幸の沼田城入城を断る小松殿の名シーンを演じる、変身写真を撮りにきた旅行者という設定。
![DALL·E 2024-01-02 13.44.03 - A modern-day tourist in a historical attire photo studio, dressed as a Sengoku period warrior princess, similar to Princess Ina (Lady Komatsu), standi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/9956f55a-6fea-96bd-ec6b-7266dcf623eb.png)
**Prompt**
A modern-day tourist in a historical attire photo studio, dressed as a Sengoku period warrior princess, similar to Princess Ina (Lady Komatsu), standing in front of a gate, as if defending her fort. This scene emulates a famous scene associated with Princess Ina. She is wearing Sengoku era armor, without a helmet. Her hair is long, straight, black, of one length, without bangs, and simply tied at the back. She is holding a fake spear, and there is no makeup on her face, emphasizing simplicity. The gate in the background resembles a traditional Japanese fort gate.
DALL-Eで日本の歴史的衣装　第６戦　戦国時代、女性の髪形と小袖

平安時代の垂髪が難しいということで、戦国時代のシンプルに束ねた垂髪も難しそうです。そしてもっと難関だったのが小袖。小袖の着方のデータは近世近代現代のデータでトレーニングされており、鎌倉時代や戦国時代の着方はDALL Eはデータがないのです。

現代人の髪型から始めてみましたが…
![DALL·E 2024-01-02 13.21.13 - A modern-day woman with her long hair tied with a hair tie just above the waist at the lower back, creating a casual and sleek look. The hair is secur.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/164d8733-24eb-9d6a-0bd3-13b4084675f3.png)
**Prompt**
A modern-day woman with her long hair tied with a hair tie just above the waist at the lower back, creating a casual and sleek look. The hair is secured neatly with a simple tie, emphasizing a laid-back and refined style. The background should be minimalistic, highlighting the precise placement of the hair tie as indicated.


着物になるとこの髪型を維持してくれないのです。色々試みましたが、必ずおだんごや簪が入ってしまうし。
![DALL·E 2024-01-02 13.23.02 - A woman from the Azuchi-Momoyama period wearing a Kosode with narrow sleeves. She has very long, straight hair, tied simply at the back in the same st.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/0dd79a1c-ba37-169c-80f9-5adb692da829.png)


何とかたどり着けたのがこちら。プロンプトもシェアします。但し再現性のほどは保証できません。やはり帯がどうしても現代の小袖の着方になってしまう。
![DALL·E 2024-01-02 13.25.42 - A woman wearing a traditional Kosode, indicative of the middle-class during the Azuchi-Momoyama period in Japan. She is viewed from the back, and her .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/995850fe-e0ff-6da6-04fc-2956f1c233bf.png)
**Prompt**
A woman wearing a traditional Kosode, indicative of the middle-class during the Azuchi-Momoyama period in Japan. She is viewed from the back, and her hair is styled in a simple and elegant manner. It is a long, straight, sleek ponytail, tied at the back into a low ponytail with a plain hair tie, without any additional adornments or accessories. The Kosode is simple, without any intricate patterns or embellishments, suitable for daily activities of the time.

髪型は何とか戦国時代の武家の女性に近づくことはできたでしょうか。帯が違いますが。（こちらの絵はイラストACからダウンロード）
![23381172.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/38654c6e-644d-14cc-6e1e-089a926d45e5.png)
ChatGPTの自動化


ChatGPTのプロンプディングを自動化するツール書きました。

> <iframe width="560" height="315" src="https://www.youtube.com/embed/lhWp6E0YNSI?si=77NPUvZRauFvP2hW" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
> 
> [ChatGPTを自動化するツールを作った。](https://devtheworld.jp/blog/chatgpt-automation?trk=qt-ab)

（参考）

- [ChatGPTのコア技術「GPT」をざっくり理解する #ChatGPT - Qiita](https://qiita.com/ksonoda/items/b767cbd283e379303178)
- [ChatGPT使い方総まとめ #ChatGPT - Qiita](https://qiita.com/sakasegawa/items/82069c97a1ee011c2d1e)
- [【完全保存版】OpenAIが教えるChatGPTからより良い結果を得るためのプロンプトのコツ #初心者 - Qiita](https://qiita.com/ot12/items/e3270c89a7368d96e4d5)
- [【ChatGPT】とベクトルデータベースによる企業内データの活用(いわゆるRAG構成) #ChatGPT - Qiita](https://qiita.com/ksonoda/items/ba6d7b913fc744db3d79)
List View: Quick Check > Customize a List View


https://trailhead.salesforce.com/content/learn/modules/list-view-quick-check/customize-a-list-view


:::note alert
Make sure you name your new list view 'Large and High Prob Open Opps'.
:::


:::note alert
The list view 'Large and High Prob Open Opps' is not shared with the Channel Sales Team.
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/df510fc3-4d51-60c6-1557-27099408b567.png)


:::note alert
Make sure to adjust the owner filter to include all opportunities.
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/435070f3-dc6d-efff-7f00-b1c36e906a23.png)


:::note alert
Looks like the amount filter of greater or equal to $100,000 has not been applied to the 'Large and High Prob Open Opps' list view.
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3dcd9cab-785f-87d5-d811-e5c763ab3fed.png)


:::note alert
Hint: You need to apply some filter logic to your list view.
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f8d6f2b9-2ab1-5a6f-22a6-a4dde7f4f918.png)


# これでもいいみたい

+ [need help please](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvYl7SAF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5fee85db-ca2a-b8ea-699f-e23162874147.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ef35469d-d569-149c-27c3-dd6511a94db4.png)

+ [How do I shared with the Channel Sales Team (hint: check the Roles or Roles & Subordinates categories)](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000lo2B)

:::note
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/83eaa738-3f10-42e5-ae76-de1a4a399c31.png)
:::
vscodeでDocker上のXdebug2を動かす

# 概要
VscodeでXDebug2を使うための設定を行いました。
Dockerを使っています。

※macでの確認はしていません。

githubのリポジトリは以下の通り。

https://github.com/RYA234/php-xdebug2-docker-vscode

# 開発環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/578a9062-15f0-1e2d-0be4-c0e0102bcfba.png)


名称|バージョン|説明
---|----|----
Docker|24.0.6|コンテナ型仮想環境
Windows|10|OS
XDEBUG|2.2.5|PHP用のデバッグ用の拡張機能
VSCODE|1.85.1|IDE
PHP Debug|1.34.0|VSCODEでXdebugを使えるエクステンション。

# dockerの起動方法

```bash
# dockerコンテナをビルドする
docker-compose build

# dockerコンテナを起動する
docker-compose up -d

```

# vscodeでデバッグを実行

## 操作
デバッグタブを開く。

デバッグを実行する

以下URLを開く。
http://localhost:8081/

breakpointが止まることを確認する。

以下gif動画で動かしたときの様子。

![Xdebug2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/475f1d81-bce4-5d6a-286f-217d82dd4d5c.gif)

## 詰まった点

### .vscode/launch.jsonの部分
PutMappingが難しかった

```diff_json:.vscode/launch.json
{
    // Xdebugの設定ファイル
    "version": "0.2.0",
    "configurations": [
        {
            "name": "XDebug on docker",
            "type": "php",
            "request": "launch",
            "port": 9001,//php.iniのxdebug.remote_portと同じ値にする
+            "pathMappings": {
+                "/var/www/html":"${workspaceRoot}/src"
            }
        }
    ]
}


```




# 参考

https://qiita.com/gigosa/items/90431be7a6a79db78480
レンダーパイプラインってなんだ。

# はじめに

Unity初学者です。
ゲーム開発の学習を進めていく中で、
よく出てくるレンダーパイプラインについて自分なりに調べてみました。


# レンダーパイプライン

>レンダーパイプラインは、シーンのコンテンツを取得し、画面に表示する一連の操作を行います。

コンテンツを画面に描画するための一連の処理を指すらしい。
処理の中身はパイプラインの種類によってどうやら変わるっぽい。

https://docs.unity3d.com/ja/2021.1/Manual/render-pipelines-overview.html


>簡単に説明すると、以下のような操作です。
>カリング
レンダリング
ポストプロセッシング

#### カリング

描画する必要のないオブジェクトを描画しないようにすることでメモリ負荷を軽減する設定のこと。プレイヤーの死角になっている部分のオブジェクトは描画しない等。

https://www.toaru-gamedesigner.com/entry/2021/09/04/%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E6%8F%8F%E7%94%BB%E5%87%A6%E7%90%86%E3%80%8C%E3%82%AB%E3%83%AA%E3%83%B3%E3%82%B0%E3%80%8D%E3%81%A8%E3%81%AF%E3%80%903%E7%A8%AE%E9%A1%9E%E3%81%AE%E8%A8%AD

#### レンダリング

3Dモデルのポリゴンやテクスチャのデータを処理し、画像や映像として画面に表示させること。

https://cgbox.jp/2023/08/31/unity-rendering/#index_id0

#### ポストプロセッシング

エフェクトやフィルターをカメラの映像に適用すること。
UPRやHDPRでは標準で利用できるっぽい。

https://docs.unity3d.com/ja/2019.4/Manual/PostProcessingOverview.html

https://styly.cc/ja/tips/unity_postprocessing_master/


# レンダーパイプラインの種類

#### Built-in Render Pipeline
Unityのデフォルトのレンダリングパイプライン。カスタマイズのオプションが限られている。

#### Universal Render Pipeline（URP）
素早く簡単にカスタマイズでき、幅広いプラットフォームで最適化されたグラフィックスを作成できる。

#### High Definition Render Pipeline（HDPR）
ハイエンドプラットフォームで最先端の忠実度の高いグラフィックスを作成できる。UnityのスクリプタブルレンダーパイプラインAPIを使って、独自のカスタムレンダーパイプラインを作成することができる。


※UPRとHDPRはScriptable Render Pipeline（SPR）と言って、C#スクリプトを使ってレンダリングを制御する機能らしい。

# ビルトインからURPへの変換

ビルトインからURPに移行させたという記事は調べたらたくさん出てくる。
ざっくりと移行のメリットとして挙げられているのは、
* 利用できる機能が増える
* 描画処理が最適化されており負荷が軽減される

というもの。

公式ドキュメントにも手順が記載されていた。

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@12.0/manual/features/rp-converter.html

Window > Rendering > Render Pipeline Converter > Built-in to URPから変換可能。
一度変換すると元に戻せなくなる可能性があるので、事前にバックアップをとっておいた方が良い。ただ、上記機能を使用する際は注意点もあり、いろいろと互換性が無いものもある。

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@14.0/manual/upgrading-your-shaders.html

* URPはカスタムシェーダーやサーフェスシェーダーをサポートしていない
* カスタムシェーダーをURPで動作させるためには、シェーダーを書き直すかShaderGraphで再作成する必要がある

古いアセットを使用する場合等は特に注意しないと面倒なことになりそう。


# 結局どれを使えばいいの？

古いアセットを使用する場合はURPに対応しているか、URPへの変換が可能かを事前に確認しておく必要がありそう。問題なければ小規模開発ではURPを使うのか一番良さそう。
DALL-Eで日本の歴史的衣装　第４戦 卑弥呼を描いてみる


中国文化を色濃く影響受けた時代であれば、中国の扮装から何とか奈良時代や飛鳥時代の服装は作り出せる。Alternateの活用ってプロンプトで画像生成させるのに役に立ちます。

しかしもっと古い時代ではどうなるか。ということで弥生時代を試してみました。

卑弥呼の絵を見せてこんな感じにと指示したら一発でそれっぽいのが生成できました。
![DALL·E 2024-01-02 12.33.02 - A full-body portrait of a Yayoi period woman, reflecting the cultural influence from ancient China and Korea. She stands with poise, draped in a flowi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/06bb13ec-9dd9-a1b9-3355-b29fad4ea71f.png)

プロンプトをシェアしますが再現性の保証はありませんのでご了承ください。
**Prompt**
> A full-body portrait of a Yayoi period woman, reflecting the cultural influence from ancient China and Korea. She stands with poise, draped in a flowing white robe with a long, wide red sash tied around her waist. Over her robe, she wears a shorter rust-colored tunic with wide sleeves. Her black hair is styled straight and hangs down her back, and she wears a simple headband. Around her neck hangs a blue pendant, indicative of status. Her attire suggests a blend of functionality and formality, indicative of the Yayoi period's cultural exchanges.

**しかし祈祷をする卑弥呼と指定したら滅茶苦茶に！**


日本髪の芸者さんから後光がさしている
![DALL·E 2024-01-02 12.37.14 - A full-body portrait of a woman reminiscent of the legendary queen Himiko from the Yayoi period of Japan. She stands in the foreground, with poise and.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/ffd52e48-087e-0d66-beb0-3054539622c3.png)


どう見ても現代の巫女さん
![DALL·E 2024-01-02 12.38.41 - A full-body portrait of a woman from the Yayoi period, emulating the attire seen in the provided reference image. She stands with grace in a rice fiel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/3daba9cd-1651-ec80-51fc-624a9bbd4cc3.png)


そして悲惨なのが男性。「みずら」に関するデータがDALL Eにないので、描けないらしい。（この絵はイラストACからダウンロードしたもの）
![2137132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/c288cd67-4479-96d4-857d-5c9c88007aae.png)


その結果、「みずら」がチャーミングなミッキーマウスになってしまう。
![DALL·E 2024-01-02 12.42.36 - Create an image of an ancient Japanese man with a traditional Mizura hairstyle, which is characterized by two rounded buns positioned at the sides of .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/079b9567-b972-074d-77fb-b41cc4f05df3.png)
【AWS】APIKeyを使用したAPIGatewayの設定備忘録

　顧客へのAPIをサービスとして提供するには、API Gateway 使用量プランを設定する。API Gateway 使用量プランは、API キーを設定し、キーを知っているユーザーのみ利用可能にし、API キーでリクエストユーザーを特定することで、定義した制限とクォータに基づいて、スロットリングすることができる。今回は、LambdaとAPIGatewayを用いた使用料プラン付きのAPI作成方法を紹介する。

## Lambda + APIGatewayでAPIkey作成

1. 適当にLambda関数を作成する
1. トリガーを追加で、APIGateway、API type = RestAPI、Security = APIKeyを選択する
1. 作成したAPIgatewayをコンソール画面で開く
1. ステージを開き、CORSを有効にして、デプロイする
    ![APIGateway12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/22918afd-2eb9-17ee-d651-4a05b2527f55.png)
1. APIKeyを確認する
![APIGateway11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/7f4f0185-c06a-f770-4954-a2618d318683.png)


### Curlで検証してみる
```
curl -X POST https://******************* --header "x-api-key:cLXRV9Enox6AJkzdCViKP52xdMGcA1Sj9QaLzjxR"
```

### React/axiosでリクエストしてみる
```React
  const handleGetSubmission = async () => {
    const users = await Auth.currentAuthenticatedUser()
    const username = users.username + '-' + countryCode
    const body = {
      user: username
    }
    try {
      await axios
        .post(
          'https://*********************',
          body,
          {
            headers: {
              'Content-type': 'text/plain',
              'x-api-key': 'mtpJPQpxRha1SbL2QpC3X5cT8ZygXzY65AQqLRXJ',
            },
          },
        )
        .then((res) => {
          console.log(res.data)
        })
    } catch (err) {
      console.error(err.message)
    }
  }
```

## 参考文献

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-usage-plans.html
Chakra UIでButtonのdisabledが効かない

## はじめに

Chakra UIでButtonの`disabled`が効いていなかったので、原因を調べました。

## 環境

- @chakra-ui/react: 2.8.2


## 修正前のコード

```react
<Button disabled={disabled}>
```

## 解決法

`disabled` の代わりに `isDisabled` を使います。

```react
<Button isDisabled={disabled}>
```

## 終わりに

旧バージョンでは`disabled={disabled}`だったのに、後方互換性が保たれていなくて残念です。

## 参考

https://chakra-ui.com/docs/components/button/props

https://stackoverflow.com/questions/75167380/how-to-disable-button-if-form-string-input-is-empty-react
GitHub PagesでCSSが反映されない

GitHub Pagesを使ってサイトを作成した際に、デプロイには成功したがCSSが読み込まれず、デザインが崩れてしまうという問題が発生しました。そのときの対処法をネットで調べると、GitHubに上がっているCSSファイルの絶対パスを指定するというものばかりで、こんなん絶対面倒だろ！と思ったので代わりの方法を書いておきます。

慣れている人にとってはなんてことない内容ですが、初心者の方が使用することも多い機能だと思ったのでこの記事を作成しました。

# 前提
以下のような簡単なファイル構成だとします。ファイル構成が違えばURLも異なってくるのでご注意ください。
```
└── portfolio
    ├── style.css
    └── index.html
```

# 面倒な例：絶対パスを使用

```html
<link rel="stylesheet" href="https://yudatchshouga.github.io/portfolio-repo/style.css"/>
```

:::note info
`https://[githubユーザーネーム].github.io/[リポジトリ名]/style.css`のように指定すると読み込めるようです。
:::

この例の面倒な点は、ローカル環境で設定するURLとGitHub上にアップロードする際のURLが異なるため、ローカルで開発するときに書き換えて、GitHubにあげるときにまた書き換えて・・・という手間が発生する点です。
全然スマートではないですし、このような手間が更新のたびに発生すると自分のようなズボラ人間は更新が億劫になってしまいます。

また、例えば半年ぶりの更新をしたらこの一手間が必要なことを忘れてしまっていて、なぜかCSSが反映されないぞ！？と狼狽えてしまうという状況も想定されます。

# 良い例：相対パスを使用

絶対パスの`https://[githubユーザーネーム].github.io/[リポジトリ名]`を`.`に変更します。

```html
<link rel="stylesheet" href="./style.css"/>
```

こちらの記法を使えば、ローカルでもGitHub上でもURLを変更する必要はありません。
もしかしたらこの記法が使えない状況が発生しうるのかもしれませんが、自分はこれで動きましたので、基本はこちらを使用するのがいいと思います。

# そもそも絶対パスと相対パスとは？
絶対パスと相対パスの違いを解説するページではないのでここでは省略しますが、こちらのページがわかりやすいかと思います。
https://and-engineer.com/articles/Y1fGpxAAAAt07ZlQ
なんでmodelで定義してるUserクラスをcontrollerで使えるの？


<h1>動機</h1>
 Railsチュートリアル７章まで進めて、ふとこの疑問が湧き上がりました。<br>
 Rubyの基本的な文法を学習した段階では、<br>
<ul>
<li>原則同じファイル内で定義したクラスしか使えない</li>
<li>外部のファイルのクラスを使う場合はrequireで読み込む必要がある</li>
<li>クラスの継承を使えば、親クラスのメソッドも使用できる</li>
</ul>   
という理解だったのですが、railsチュートリアルのsample_appのusers_controller.rbのコードを見ると
<ul>
<li>ファイル内にUserクラスの定義がない</li>
      <li>にもかかわらず@user = User.find(params[:id])みたいな感じでUserクラスを使ってる
      </li>
      <li>requireで外部ファイルを読み込んでる、もしくはクラスを継承している様子もない</li>
    </ul>
みたいな感じでなぜUserクラスが使えているのか理解できなかったので調べてみました。


<h2>Rails の自動読み込み（autoload）</h2>
    という機能が働いていたようです。<br>
    <a href="https://railsguides.jp/autoloading_and_reloading_constants.html">RailsガイドのRails の[自動読み込みと再読み込み]</a>
    に記載がありました。
    内容は初学者的には結構難しかったのですが、今の段階で理解できたことは、
<ul>
    <li>Zeitwerkというローダーのおかげで自動読み込みが実現できている。</li>
    <li>ファイル内で定義された定数（クラス名、モジュール名）と定義しているファイル名が一致していないと、Zeitwerkで読み込んでくれない（Userクラスを自動で読み込んで欲しいなら、user.rbってファイル名でファイル作ってそこでUserクラス定義しといてね）</li>
    <li>config.autoload_pathsに自動読み込みの対象となるディレクトリを指定してやる。</li>
    <li>デフォルトの読み込み対象はappディレクトリ以下のすべてのサブディレクトリ（assets、javascript、viewsは除く）</li>
</ul>
    ということみたいです、詳しくは<a href="https://railsguides.jp/autoloading_and_reloading_constants.html">Railsガイド</a>を参照くださいませ。
DALL-Eで日本の歴史的衣装　第３戦　奈良時代の男性は難しい！

奈良時代の女性をナンチャッテ唐代で描けたので、今度は男性で挑戦。これは惨敗でした。DALL Eの学習データで日本の男性の服装はどうやら江戸時代から現代にかけての着物になっていて、どんなに頑張っても江戸時代の袴になってしまうか、中国の変身写真館の衣装になってしまうのです。

![DALL·E 2024-01-02 12.01.40 - A noble man from the Nara period in Japan, wearing traditional clothing. He has a layered silk uwagi with wide sleeves, a hakama reaching his ankles, .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/e332155b-fb52-f267-b91d-f8374477fc79.png)

袴というかパンツで、その上に頭からかぶるような服って表現しても通じなかった。（このイラストはイラストACからダウンロードした奈良時代の装束絵）
![22524845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/d4837671-2c0f-3664-2cb8-370190d59b04.png)

中国の変身写真館で皇帝の衣装着ました系。
![DALL·E 2024-01-02 12.03.22 - A noble man from the Nara period in Japan, accurately representing the Tang Dynasty influence in his attire. He wears a brightly colored and patterned.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/f7ce402c-5492-2073-3284-daf2ac721345.png)

韓ドラの役人みたい。
![DALL·E 2024-01-02 12.03.49 - A noble man from the Nara period in Japan, wearing traditional clothing with specific Tang Dynasty influence as shown in the provided reference diagra.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/fcdbd787-5160-c59a-523e-89db36baa4c9.png)

これもう笑うしかない。奈良時代じゃないです！
![DALL·E 2024-01-02 12.05.47 - A noble man from the Nara period in Japan, dressed in authentic period clothing, which includes wide-legged trousers under a round-collar jacket, true.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/b75d439a-9067-d790-301f-58402fdbd260.png)

中国剣劇風のイケメン写真が出てきたところで諦めました。
![DALL·E 2024-01-02 12.06.35 - A noble man from the Nara period in Japan, accurately dressed based on the provided photo. He is wearing a green round-collar jacket over a long white.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/62b4f265-8467-69b1-8513-9940c1d4498f.png)
AWS S3 Athenaとは

### はじめに
クラウドサービスは全然知識がないのですが、AWSを使う機会があって調べてみましたので記事にします。
今までMicroSoft製品にどっぷり使ってきたので本当はAzureを勉強したかったのですが、AthenaでSQLを書いたりするのはAzureでも活用できるはず。そういった内容はアウトプットすべきと思い、投稿にします。

### Amazon S3とは
Amazon Simple Storage Serviceの略
大量のデータを安価にセキュアに高い耐久性で保存するサービスです。

最近はデータレイクというキーワードも聞いたことがあるのですが、
データレイクは構造化データだけでなく非構造化データもクラウドで保存し、必要に応じて加工するという仕組みでAWSではS3上にデータレイクを構築するらしいです。

#### バケットとは
S3ではアップロードするファイルのことをオブジェクトと言うそうですが
オブジェクトをクラウドストレージにアップロードする際、まずはバケットを作成し、
そのバケットの中にオブジェクトをアップロードします。

特徴としてはバケットを作成する際にリージョンを指定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/804ba508-ffb1-f30b-7c65-8181dd7583f6.png)

:::note info
Microsoftサービスでは
S3に似たサービスとしてMicrosoftではAzure Blob Storageが該当します。
:::

https://azure.microsoft.com/ja-jp/products/storage/blobs/


### Amazon Athenaとは
AWS上のストレージにあるCSV、JSON、Parquetファイルなどをまとめて１つのテーブルと見立てクエリを発行してデータを抽出します。
要はデータを分析するサービスです。主にSQLを使う。

特徴は下記のとおり

- Prestoというクエリエンジンで動く
- クエリの並列実行も可能
- パーティション（スキャンする対象を絞り込む）設定可能
- クエリ実行時間は30分でタイムアウト

テーブルの作成は、create table文の他、GUIベースでも作れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/fab1f586-06ad-ba12-fbac-e1bde5ed44f5.png)


https://azure.microsoft.com/ja-jp/products/synapse-analytics

### 用語集

- [x] 構造化データ
「列」と「行」の概念をもつデータ
- [x] 非構造化データ
構造定義されていないデータ。データベース化不可のデータ。
- [x] リージョン
クラウドサービスを利用する際のデータセンターの地理的な場所のこと。
データセンターの位置がサービス利用者に近い方が、ネットワークの通信速度も速いため、利用場所に近いリージョンを選択するのが良い。