OmniAICreator/Qiita-1.07M huggingface dataset:
YahooジオコーディングAPIを叩く

```
#202401018 国土地理院データを緯度経度にする
#東京大学ジオコーディングサービス後にYahooAPIで補填する

library(httr)

tempDF1 <- read.csv("ADDR_1 (1).csv")
tempDF2 <- read.csv("ADDR_2 (1).csv")
tempDF3 <- read.csv("ADDR_3 (1).csv")

names(tempDF2) <- names(tempDF1)
names(tempDF3) <- names(tempDF1)

tempDF <- rbind(tempDF1,tempDF2)
tempDF <- rbind(tempDF,tempDF3)
tempDF$CODE <- as.character(tempDF$CODE)

targetData <- tempDF[tempDF$iLvl<5,]
tempDF <- tempDF[tempDF$iLvl>=5,]

targetData$CODE <- as.character(targetData$CODE)


#YahooジオコーディングAPIのエンドポイント
api_endpoint <- "https://map.yahooapis.jp/geocode/V1/geoCoder"

# YahooジオコーディングAPIのアプリケーションID（ご自身のIDに置き換えてください）
app_id <- "YahooAPIを記入"

geocordingDF <- data.frame()
for (i in 1:nrow(targetData)) {
  address <- targetData[i,]$ADDR
  code <- targetData[i,]$CODE
  
  # APIリクエストのパラメーターを構築
  query_params <- list(
    appid = app_id,
    output = "json",  # 出力形式をJSONに指定
    query = address
  )
  
  # APIリクエストを送信
  response <- GET(api_endpoint, query = query_params)
  
  # レスポンスの内容を取得
  response_content <- content(response, "text", encoding = "UTF-8")
  
  # JSONをデコード
  result <- jsonlite::fromJSON(response_content)
  
  if (!is.null( result$Feature)){
    # 緯度経度の取得
    latitude <- strsplit(result$Feature$Geometry$Coordinates[1],",")[[1]][2]
    longitude <- strsplit(result$Feature$Geometry$Coordinates[1],",")[[1]][1]
    
    geocordingDF <- rbind(geocordingDF,cbind(code,address,latitude,longitude))
  }else{
    nameDF <- data.frame(cbind(code,address,"",""))
    names(nameDF) <- c("code","address","latitude","longitude")
    geocordingDF <- rbind(geocordingDF,nameDF)
  }
  print(i)
}


write.csv(geocordingDF,"result_20240119_03.csv")
write.csv(tempDF[,c("CODE","ADDR","fY","fX")],"result_20240119_04.csv")

```
Python 3 エンジニア認定基礎試験対策3 - 形式ばらないPythonの紹介

# はじめに
Python3エンジニア認定基礎試験の対策として自分用に執筆しています。

:::note warn
この記事はPython・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

# 形式ばらないPythonの紹介

## 計算

```Python
>>> 2 + 2 # 加算
4
>>> 4 - 1 # 減算
3
>>> 2 * 3 # 乗算
6
>>> 3 / 1  # 除算
1.0
>>> 6 // 2 # 整数除算
3
>>> 3 ** 3 # べき乗
27
>>> 5 % 3 # 剰余算
2
```

`=`は変数に値を代入する際に利用
変数を定義していないのに利用しようとするとエラー

```Python
ans = 10 + n # nが定義されていないのでエラー
NameError:name 'n' is not defined
```

対話モード（cmdでの入力など）で実行する場合は、`_`に最後の実行結果が代入される

```Python
>>> 2 + 3
5
>>> _ + 5 # _には2+3の結果が代入されている
10
```

## 文字列
文字列を記述する場合は`'(単引用符)`または`"(二重引用符)`を利用する。引用符は`\`でエスケープできる。
`\`の後の文字列を特殊文字として解釈しない場合は先頭に`r`をつける

```Python
>>>print('C:\some\name')
C:\some
ame
>>>print(r'C:\som\name')
C:\some\ame
```

文字を複数行にまたがって記述する場合は`"""(三連引用符)`を使用する。
文字列は`+`演算子で結合、`*`演算子で繰り返し出力することができる

```Python
>>> "hello" + "world"
helloworld
>>> "ABC"*3
ABCABCABC
```

文字列はインデックスを指定して文字を取得できる

```Python
>>> word = "Python"
>>> word[0] # 0文字目
P
>>> word[-1] # 後ろから1文字目
n
>>> word[0:2] # 0文字目から2文字目
Py
>>> word[2:5] # 2文字目から5文字目
tho
>>> word[:2] # 最初から2文字目
Py
>>> word[4:] # 4文字目から最後
on
>>> word[-2:] # 後ろから2文字目から最後
on
>>> word[4:42] # 範囲外でもindex out of rangeが出ない
on
>>>word[42:] # 空白が出力
```

文字列の一部を変更することはできない

```Python
word[0] = 'J'
TypeError:'str' object does not support item assigment
```

len()は文字列の長さを返す。length

```Python
>>> s = 'Python'
>>> len(s)
6
```

## リスト

複数の値をまとめる。

```Python
>>> num = [1, 2, 3, 4]
>>> num[0] # numの0番目に格納されている値
1
>>> num[-1]
4
>>> num[-3:]
[2, 3, 4]
>>> num[:] # すべて
[1, 2, 3, 4]
>>> num + [5, 6, 7, 8] # 連結
[1, 2, 3, 4, 5, 6, 7, 8]
```

リストは可変であり、変更することができる

```Python
>>> fib = [1, 1, 2, 4, 5]
>>> fib[3] = 3 # 要素の変更
[1, 1, 2, 3, 5]
>>> fib.append(8) # 値の追加
[1, 1, 2, 3, 5, 8]
>>> fib.append([5,8]) # リストの追加
[1, 1, 2, 3, 5, 8, [5, 8]]
>>> len(fib) # リストの長さ(要素数)
7
```

## プログラムの例

```Python
>>> a, b = 0, 1
>>> while a < 5:
...   print(a)
...   a, b = b, a+b
0
1
1
2
3
```

1行目：複数同時の代入
2行目：条件式（繰り返し）。a < 5の場合は繰り返し

# 参考文献
https://docs.python.org/ja/3.9/tutorial/introduction.html
Python 3 エンジニア認定基礎試験対策2 - インタプリタを使う

# はじめに
Python3エンジニア認定基礎試験の対策として自分用に執筆しています。

:::note warn
この記事はPython・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

# Python インタプリタを使う
python とコマンドを打つとPythonを利用できる
quit()とコマンドを打つとPythonを終了できる
-m はモジュールを利用する際に使う
PythonのソースコードはUTF-8でエンコードされたものとして扱う

# 参考文献
https://docs.python.org/ja/3.9/tutorial/interpreter.html
Python 3 エンジニア認定基礎試験対策1 - やる気を高めよう

# はじめに
Python3エンジニア認定基礎試験の対策として自分用に執筆しています。

:::note warn
この記事はPython・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

# やる気を高めよう
 - 簡単に利用できる
 - シェルスクリプトやバッチファイルよりも多くの機構がある
 - 大きなプログラムの開発にも適している
 - プログラムをモジュールに分割し再利用できる
 - インタプリタ言語
 - コンパクトで読みやすく記述できる
	 - 高レベルのデータ型
	 - 実行文のグループ化をインデントで行う
	 - 変数や引数の宣言が不要

# 参考文献
https://docs.python.org/ja/3.9/tutorial/appetite.html
Bitriseのキャッシュ機構（最新）

Bitriseにはキャッシュ機構が3種類存在します。今回は使用頻度の高い2つについてまとめました。

1. Branch-based caching ⭐️
1. Key-based caching ⭐️
3. Remote build caching

# Branch-based caching
従来から使われているキャッシュ機構。ブランチ毎にキャッシュが作成されます。
作成したキャッシュは同一のサーバー上のみで使用することができます。

### 使い方
キャッシュの作成には`Bitrise.io Cache:Push`を使います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/309bdee6-92d9-da05-94f7-62f0333567b0.png" width=50%>

このステップでは`Cache paths`にキャッシュ対象のパスを指定します。
例えば`CocoaPods`であればこうなります。
```
# CocoaPods
./Pods -> ./Podfile.lock
```

キャッシュの使用には`Bitrise.io Cache:Pull`を使います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/b7e6494f-dc09-4fdb-72d1-5b0aa3df491a.png" width=50%>

これは特に値を指定する必要はないので、ステップを追加するだけでいいです。


### キャッシュの期限
- 作成・更新から7日間
- 作成ブランチがビルドされたらそこから7日間にリセット

:::note info
ブランチにキャッシュがない場合
デフォルトブランチのキャッシュが使用されます。
:::


# Key-based caching
キャッシュをキーで管理し、そのキーで参照し使用します。ブランチベースキャッシュと異なり、ブランチやサーバーに関係なくキャッシュを共有できます。

### 使い方
依存関係マネージャは専用のステップが存在するのでそれを使用します。


現在用意されている専用ステップ
- CocoaPods
- Swift Package Manager
- nmp
- Gradle
- Carthage
- Dart

全ての専用ステップにキャッシュの保存と取得があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/b8a621b0-9958-eda4-9ec1-95fecdbddcdb.png" width=50%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/acba043e-81da-b7ef-7113-eec43e0672d9.png" width=50%>

専用ステップのないものは、汎用的なキーベースキャッシュのステップが存在します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/7f137415-6304-b435-99ba-0ef53260e0db.png" width=50%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/71a9ddf1-562a-d129-7e2d-e1b2573c4532.png" width=50%>

### キャッシュの期限
- 作成・更新から7日間

# 生成されたキャッシュの確認
`ワークスペース > App Settings > Builds`の`Manage build caches`に生成されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/fbffc316-d37a-caf8-69dd-a3cfae9f72b1.png" width=70%>
sendKey

    'SendKey
    Dim objWshShell
    Set objWshShell = WScript.CreateObject("WScript.Shell")

    Dim intCounter
    For intCounter = 1 To 2
        objWshShell.AppActivate "電卓" ,wait
    	WScript.Sleep 100
    	objWshShell.SendKeys "18782"
    	WScript.Sleep 100

        objWshShell.AppActivate "メモ帳"
    	WScript.Sleep 100
    	objWshShell.SendKeys "{ENTER}"
        WScript.Sleep 100
    Next
    
    MsgBox "チェックしてください"

    Set objShell = Nothing

{TAB}
{DOWN}
Ctrl 	^　など
BitriseのTriggersにてPullRequestを使用する際の注意点

ちょっとだけひっかかったのでメモを残しておきます

# Error: Both API Token and WebhookURL are empty 

SlackのAPI Tokenがうまく取得できない時に発生するエラーなのですが、BitriseのSecretsはdefaultでPullRequestのTrigger起動の場合は取得できなく設定されているために起こります。
対応方法は簡単で下記の画面の対応するフラグをONにすれば、PullRequest時も値を取得できるようになります。

![スクリーンショット 2024-01-22 16.50.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70276/43bacb04-bfea-c04c-cdea-f81825b6099b.png)


# Cashe Push がPullRequest時に実行されない

![スクリーンショット 2024-01-22 16.54.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70276/bab512a5-fc50-652a-ac5a-948fd3296cc6.png)

defaultの設定のままだとPRの際に実行しないように設定されているため、実行されません。

```
run_if: ".IsCI | and (not .IsPR)"
```

そのためこちらを変更して

```
run_if: ".IsCI"
```

このようにすれば実行されるようになります。

# そもそもなぜPullRequestの場合に追加で設定が必要なのか

https://discuss.bitrise.io/t/cache-push-is-not-working-since-run-if-expression-is-false-which-should-not-be-false/3731/3

こちらで軽く話されているので翻訳すると

```
特にリポジトリがパブリック リポジトリの場合は、他のビルドに影響を与える可能性のあるものを変更するプルリクエスト
(その場合は誰でも開くことができます) を決して許可してはなりません (定義上、キャッシュは間違いなく可能です)。
```

つまりパブリックなリポジトリの場合は危険なのでdefaultで制限をかけることで安全につかえるようになっているよとのことです。
今回の自分のケースの場合はprivateなリポジトリでの運用のため、上記に当てはまらないので各種設定を行いました。
【備忘録】YahooローカルサーチAPIを叩くソース

```
#キーワードから位置情報を取得するスクリプト
#2024/01/15 YahooローカルサーチAPIを利用

#install.packages("httr")
#install.packages("stringi")
library(httr)
library(XML)
library(stringi)
library(RCurl)
library(RJSONIO)

#ターゲットデータの読み込み
tranData <- read.csv("hogehoge.csv")

# Yahoo APIキー（自分のAPIキーを使用してください）
api_key <- "ここにAPIキーを入力"

#出力用データフレーム
writeDF <- data.frame()

for (i in 1:nrow(tranData)) {
  # 場所の名称
  location_code <- tranData[i,1]
  location_name <- tranData[i,2]  
  
  #ローカルサーチAPI 例：コンビニコード指定（抽出を絞るため）
  api_url <- sprintf(
    "https://map.yahooapis.jp/search/local/V1/localSearch?appid=%s&query=%s&ac=0205001",
    api_key, URLencode(location_code)
  )
  
  #APIの実行
  Encoding(api_url) <- "UTF-8"
  doc <- getURL(api_url) 
  
  #欲しいデータを文字列として強引に抜き取る
  #緯度経度の取得
  y <- strsplit(
  gsub("</Coordinates>.*","",gsub(".*<Coordinates>","",doc))
  ,",")[[1]][1]
  x <- strsplit(
    gsub("</Coordinates>.*","",gsub(".*<Coordinates>","",doc))
    ,",")[[1]][2]
  #店舗名称の取得
  storeName <- 
    gsub("</Name>.*","",gsub(".*<Name>hoge","hoge",doc))
  #住所の取得
  address <- 
    gsub("</Address>.*","",gsub(".*<Address>","",doc))
  #読み仮名の取得
  yomi <- 
    gsub("</Yomi>.*","",gsub(".*<Yomi>","",doc))
  
  writeDF <- rbind(writeDF,cbind(location_code,location_name,storeName,yomi,address,x,y))
  
  print(i)
}

#nrow(writeDF[is.na(writeDF$address),])$storeName <- NULL

#クレンジング
writeDF <- writeDF[!is.na(writeDF$address),]
writeDF$storeName <- gsub(".*<Name>","",writeDF$storeName)

#writeDF <- writeDF[is.na(writeDF$address),]
writeDF <- writeDF[is.na(writeDF$address),c("location_code","location_name")]
write.csv(writeDF,"geocording_result.csv",row.names = F)

```
Springに関してまとめ

## 経緯
* Springについての基礎知識をまとめておきたかったため。

## そもそも“フレームワーク”って？
* “フレーム”という名の通り、「型」や「枠組み」のこと。
* ITでいうフレームワーク → アプリ開発等をしやすくするためによく利用される機能をあらかじめ備えた「ひな形」や「枠組み」をひとまとめにしたもの。

> アプリ開発をする際に、開発の効率を上げるために便利な機能がたくさん詰まったツールです。
WEBアプリ開発に用いるフレームワークは、とくに「WEBフレームワーク」と呼ばれています。「Spring Framework」もこのWEBフレームワークの1つです。

[【5分でわかる】Javaフレームワーク「Spring Framework」とは - SAMURAI ENGINEER BLOG](https://www.sejuku.net/blog/10456)

#### メリット
* 開発業務を効率的かつ簡単に行える。
#### デメリット
* 言語それぞれに種類があるため習得に少々時間要する。
* 記述ルールがあるため開発の際に制限がかかる。

# Spring Framework
* 非常に柔軟性の高いフレームワーク。
* プロジェクトの集まりで、そのうちのどれを使うのかを選ぶ＆必要なライブラリを選ぶイメージ。
* WEBシステムやWEBサービス作成時に用いる。
* 変更に強く、テストが簡単。拡張性・保守性・再利用性が高い。
> Spring Framework（単にSpringとも呼ばれます）は、JavaのWEBフレームワークで、WEBアプリを作ることができます。
従来のWebアプリケーションにおける様々な問題を解決しており、非常に有力なフレームワークとして、長い間注目されてきています。

[【5分でわかる】Javaフレームワーク「Spring Framework」とは - SAMURAI ENGINEER BLOG](https://www.sejuku.net/blog/10456)
スッキリわかるSQL入門を読んだ

## はじめに
今回はSQLの[学習のためスッキリわかるSQL入門](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/4295013390)を読んだので
その感想についての記事になります。

## 良かったところ
まずSQLについてはprogateなどで以前から学習はしていたのですが
書籍を使った学習は今回が初めてでした。その上で読んで良かったことは
SQLについてどのような処理がなされているかなど深掘りできたことかと思います。
本書籍ではSQLがどのような流れで処理がなされているかをわかりやすい文章と
図を活用して教えてくれるのでSQLの入門書としては申し分のない
内容なのではないかと思います。

## 学んだこと
### 第2章　基本文法と４大命令
* 複数のSQL文を記載する際は一つのSQL文の最後に```;```をつけて文の区切りを明記する。
  ```
     SELECT ~
       FROM ~;
     DELETE FROM ~;
  ```
* ```SELECT```や```WHERE```などの予約後は大文字でも小文字でも問題ない。
* 文字列を格納するためのデータ型のVARCHARとCHARはそれぞれ可変長と固定長ので```VARCHAR(10)```とすると１０バイトまでの文字を格納できる。```CHAR(10)```とすると１０バイトぴったりの文字列のみ格納できる。
* UPDATEやDELETEを使う際はWHEREを使わなければデータが全件対象にされてしまうので注意が必要。
  
### 第3章 操作する行の絞り込み
* nullのデータを探すには```IS NULL```,```IS NOT NULL```を使う。```=```,```<>```では判定できない。
  ```
  SELECT ~
    FROM ~
   WHERE ~ IS NULL(IS NOT NULL)
  ```
* 論理演算子を複数使用した条件式の場合```NOT```,```AND```,```OR```の順に処理がされる。
* レコードを特定するための主キーは複数の列を一つの主キーとすることができ複合主キーと呼ぶ。

### 第4章　検索結果の加工
* ```ORDER BY```カンマ区切りで複数の列を指定可能。最初に指定した列から優先的に並べ替えが行われ、同じ値の列の行は次に指定した列の順に並べ替える。
  ```
  SELECT ~
    FROM ~
   ORDER BY ~ ASC（ASCは省略可能）, ~ DESC
  ```
* ```OFFSET```,```FETCH```で取得する行の件数を指定できる。また、DBMSによっては対応していないものもある。
  ```
  SELECT ~
    FROM ~
   ORDER BY ~
  OFFSET 先頭から除外する行数 ROWS
   FETCH NEXT 取得行数　ROWS ONLY
  ```
### 第5章 式と関数
* 関数は使用するDBMSによって使用できないものや名前や動作が違うものがあるためその都度調べて使う必要がある。

### 第6章 集計とグループ化
* ```COUNT```関数の引数に列名を指定した場合はNULL以外をカウントして件数を返す。
* 集計関数を使用する際の４つの注意点
  * SELECT,ORDER BY,HAVINGの中でしか使用できない。
  * 複数行取得する文とは一緒に実行できず表に表した際に長方形になるような結果にならなくてはいけない。
  * 関数の引数それぞれで使用できる列の型が異なる。
  * 関数によってNULLを無視してカウントするなど対応が異なる。
* 集計結果に対して絞り込みを行う際は処理の流れとしてまずWHEREでグループ化されていない元のテーブルに対して検索を行うためWHEREの中で集計関数は使えない。よってこういう時はHAVINGが必要。

### 第7章　副問い合わせ
* 副問い合わせのパターン
  * 結果が1行１列になるものを単一行副問い合わせという
  * 結果がn行１列になるものを複数行副問い合わせという
  * 結果がn行n列になるものも使用される
    
### 第8章　複数テーブルの結合
* データを複数のテーブルに分けた方が安全、確実にデータを管理しやすい
* テーブル結合する際に結合する１つの行に対して２つ以上の合致した行があった場合は合致した行数分コピーして結合する。

### 第9章　トランザクション
* １つ以上のSQL文をひとまとまりにしたものをトランザクションと言い、ある処理がなされてもセットになっていた他の処理がなされなければ全ての処理が巻き戻される。（ロールバック）
* トランザクションを実行する際に他トランザクションからの影響を受けないようにするために該当の行を他のトランザクションからは読み書きできないようにする。（ロック）

### 第10章　テーブルの作成
* 参照整合制の崩壊には以下の４つのパターンがあり外部キー制約で未然に防ぐ必要がある
  * 参照されている行を削除する
  * 参照されている行の主キーを違う値に変更する
  * 存在していない行を参照している行を追加する
  * 存在しない行を参照する行に変更してしまう

### 第11章　さまざまな支援機能
* インデックスに指定すると効果が得られやすい列
  * WHERE句に頻繁に登場する列
  * ORDER BY句に頻繁に登場する列
  * JOINの結合条件に頻繁に登場する列(外部キー)

## 難しかったこと
テーブル設計の部分に関して一番ボリュームがあったと思うのですが、
この分野は難しくそれはまた別のテーブル設計に特化した
書籍で学習した方が良いと思いました。

## 最後に
感想の中でも述べましたがSQLを学んでまだまもない人もしくは
全く知識がない人が最初に読む書籍としてはぴったりだと思います。
これからSQLを学習する人は読んでみることをお勧めします。
他のところでGithubのリポジトリにPUSHしたい場合

# 他のところのコードCloneします。例えばgitlab

```sh
git clone <URL_repository_GitLab>
```

# Githubリポジトリ追加
```sh
git remote add github <URL_repository_GitHub>
```

# 全部ブランチ、タグをgithubにPUSHします

```sh
git push --all github
git push --tags github
```

# 以上
longtblr 環境 (tabularray) を日本語化する

## longtblr, tabularray とは

tabularray パッケージは LaTeX3 により作られた比較的新しいパッケージで、今まで LaTeX で面倒事が多かった表の作成を楽にしてくれるパッケージです。このパッケージでは `tblr` 環境および `longtblr` 環境が定義されており、例えば指定した幅を超えないための自動折返しやセル結合の簡略化などが可能となっています。
`longtblr` 環境は `longtable` 環境に類似した複数ページにまたがる表を作成するために使用する環境です。ページ下部に到達すると自動で改ページをしてくれます。

## longtblr の改ページキャプションの日本語化

`longtblr` では改ページ前に "Continued on next page"、改ページ後のキャプションに "(Continued)" と自動で挿入されます。この文字列はテンプレートの編集により変更可能です。デフォルトのテンプレートを変更するにはプリアンブルに次のように記述します。

```latex
\DefTblrTemplate{contfoot-text}{default}{次ページに続く}
\DefTblrTemplate{conthead-text}{default}{(続き)}
```

参考: [Tabularray Typeset Tabulars and Arrays with LaTeX3](https://ctan.org/pkg/tabularray)
EC2のIAMロールを使ってlaravel9以降でS3アップロード用証明書付きURL取得

EC2のlaravelでアップロード用証明書付きURLを取得しようと思うと、例えば以下のようなものが蜜つかります。

IAMユーザでアクセスキーを発行して以下のようにする

```.env
AWS_ACCESS_KEY_ID=<<IAMユーザのアクセスー>>
AWS_SECRET_ACCESS_KEY=<<IAMユーザのシークレットキー>>
AWS_DEFAULT_REGION=<<リージョン>>
AWS_BUCKET=<<バケット>>
```

```php
$client = App::make('aws')->createClient('s3');

$cmd = $client->getCommand('PutObject', [
  'Bucket' => config('filesystems.disks.s3.bucket'),
  'Key' => <<保存先のパス>>
]);

$url = $client->createPresignedRequest($cmd, '+1 days');
```

ただし、昨今IAMユーザのアクセスキーを使ったアクセスはあまりおすすめされません。

その場合、
1. 必要な権限を付与したIAMロールを作成してEC2にアタッチ
1. .envのアクセスキー/シークレットキーを空欄にする
とすると、以下のようなコードでアクセスキーを使用したときと同じようにGet用の証明書付きURLは取得できます。

```php
$url = Storage::disk('s3')->temporaryUrl(<<パス>>, Carbon::now()->addDay());
```

しかし、アップロード用のURLはこの方法で取得したURLからアップロードすると、アクセスキーが必要な旨のエラー(403)になります。

どうしたものかと色々眺めていたら、Illuminate\Filesystem\FilesystemAdapter に　「temporaryUploadUrl」というメソッドが！！
どうやら、laravel9.xから追加されたようです。

以下のようなコードで無事IAMロールでアップロード用の証明書付きURLが取得できます。

```php
$ret = Storage::disk('s3')->temporaryUploadUrl(<<パス>>, Carbon::now()->addDay());
$url = $ret['url'];
```
クイズ形式で学ぶ DB インデックス

今までのインデックスについての自分の理解が、「インデックスを作ると検索スピードが上がる」くらいの理解でした。これではいけないと思い、ようやく真面目に勉強したのでそれをまとめるついでにクイズ形式にしてみました。

# インデックスとは
データベースにおけるインデックスは、データの検索速度を向上させるための機能です。一般的に、テーブル内のデータの特定の列に対して作成され、その列の値に基づいてデータにアクセスする際の効率を高めます。

よくある例でインデックスは本でいう索引に当たります。見たい項目を索引で探し、何ページかを確認してそのページを開けば一枚一枚ページをめくって探すより効率的に目当てのページに辿り着けますよね。
それをデータベースでも同じことをしているというイメージです。
##

### 第一問
以下 SQL 文でインデックスが使用される検索はいくつあるでしょうか？
```sql
1 /* 後方一致 */
SELECT * FROM companies WHERE name LIKE '%visionary';
```
```sql
2 /* 完全一致 */
SELECT * FROM companies WHERE name = 'visionary';
```
```sql
3 /* 前方一致 */
SELECT * FROM companies WHERE name LIKE 'visionary%';
```
```sql
4 /* 否定 */
SELECT * FROM companies WHERE name <> 'visionary';
```

<details><summary>解答・解説</summary>

<INS>答えは**完全一致(2)** と **前方一致(3)** の 2 つです！</INS>

インデックスが使用できる検索方法は以下 3 つです。
- 完全一致
- 前方一致
- 範囲検索

インデックスが使用できない検索方法は以下 4 つあります。
- 否定検索
- 後方一致
- 中間一致
- インデックスを張ったカラムに対しての演算

本の索引をイメージしてみてください。
後方一致について、最後の文字が y で終わるものを探す場合は索引から探すことはできず結局全てから探さないと分からないですよね。
否定検索についても、〜ではないものに関しては全てから探さないと分からないですね。

</details>

##

### 第二問

一般的にはどのカラムに対するインデックスが一番効果が高いでしょうか？
1. 性別
1. 名前
1. 都道府県

<details><summary>解答・解説</summary>

<INS>答えは **2 の名前** です！</INS>
これはカラム内に存在する異なる値の種類が関係してきます。
異なる値の種類を`カーディナリティ`と呼びます。
よりインデックスの効果を得ることができるのはカーディナリティが高いカラムになります！
| カラム名 | データの種類数 |
|:-----------|------------:|
| 性別       | 2        |
| 名前     | かなりの数      |
| 都道府県       | 47        |

効果がある順に並べると、名前 > 都道府県 > 性別 となります。
そのカラムで検索するとどのくらい絞れるかということです！
なのでインデックスを作成する際は`カーディナリティ`を意識してちゃんと効果がありそうなのかを考えて作成してみてください！

</details>

##

### 第三問
インデックスは検索が速くなる代わりに新規作成・更新削除が遅くなるでしょうか？
<details><summary>解答・解説</summary>

<INS>答えは **遅く** なります！</INS>
最初にインデックスは本でいう索引に当たると言いましたが、本の中身が一部変更されたら索引も変わりますよね。DB も一緒でレコードを新規作成・更新削除をした場合インデックスも更新しないといけません。
インデックスを作成すると更新系の処理にも影響を与えるのでとりあえずという感覚でインデックスを作成するのはやめましょう。


</details>

##

### 第四問
一つのテーブルに二つのインデックスが作成されて検索をした場合、二つのインデックスが同時に使用されるでしょうか？それとも一つしかインデックスは使用されないでしょうか？
<details><summary>解答・解説</summary>

<INS>答えは **一つのインデックス**しか使用されません！</INS>
そもそもインデックスは同時に二つ使うことができません。
ではどちらのインデックスが使用されるのでしょうか？
それは`カーディナリティが高いカラム`の方をよしなに使用してくれます。よしなにやって欲しくない場合は使用するインデックスをあらかじめ指定しておくことも出来ます。


</details>

##

### 第五問
以下のような二つの複合インデックスがあり、`都道府県 = '東京都' AND name = 'visionary'`のような検索条件だった場合、どちらのインデックス方が早いでしょうか？
1. 名前 - 都道府県インデックス
1. 都道府県 - 名前インデックス
<details><summary>解答・解説</summary>

<INS>答えは **1 の名前 - 都道府県インデックス** です！</INS>
複合インデックスの場合インデックスの順番がとても重要です。
`名前 - 都道府県インデックス`の場合は最初に名前で絞られます。
`都道府県 - 名前インデックス`の場合は最初に都道府県で絞られます。
先ほどの問題でも出てきましたが、名前と都道府県では名前の方がカーディナリティが高いです。なので先に名前で絞り込んだ方が検索結果が少なくなるので`名前 - 都道府県インデックス`の方が早いということになります。

</details>
Python で PDF の暗号化および復号化

## はじめに
データのセキュリティは、多くの組織や個人にとって非常に重要です。特に機密情報が関わる場合には、さらに重要性が増します。PDFファイルを暗号化することで、認可された人だけがその内容にアクセスできるようにすることができます。本記事では、Pythonを使用してPDFファイルを暗号化および復号化する方法について探ってみます。必要な場合には、Pythonコードを使用してドキュメントを復号化することもできます。以下に詳細な手順をご紹介します。
## ツール
* Python 3.12.0
* [Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)ライブラリ

このライブラリは購入する必要がありますが、[30 日間の無料試用版](https://www.e-iceblue.com/TemLicense.html)も提供されています。
もっと多いサンプルコードについて、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)をダウンロードして参照してください。
## 準備
まず、[Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)と plum-dispatch v1.7.4を VS Code にインポートします。
1.[Python](https://www.python.org/downloads/) をダウンロードしてインストールします。
2.VS Codeで「Extensions」をクリックし、「Python」を検索してインストールします。
3.「Explorer」-「NO FOLRDER OPENED」-「Open Folder」
4.	フォルダーを選択し、そこに「.py」ファイルを追加します。
5.「Terminal」-「New Terminal」
6.次のコマンドを入力します。
**pip install Spire.PDF**
## PDFの暗号化
以下のコードでは、PdfDocument.Security.Encrypt()メソッドが使用されます。このメソッドは、開放パスワードと権限パスワードを引数として受け取ります。また、パラメータ PdfPermessionsFlags は、ユーザーが文書を操作するための権限を指定するために使用されます。これらのパラメータを適切に設定することで、さまざまな暗号化オプションや権限を設定することができます。
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocument オブジェクトを作成する
doc = PdfDocument()

# サンプル PDF ファイルをロードする
doc.LoadFromFile("C:/Users/Administrator/Desktop/Sample.pdf")

# PDFファイルを開放パスワードと権限パスワードで暗号化する
doc.Security.Encrypt("openPsd", "permissionPsd", PdfPermissionsFlags.FillFields, PdfEncryptionKeySize.Key128Bit)

# 結果ファイルを保存する
doc.SaveToFile("C:/Users/Administrator/Desktop/Encrypted.pdf", FileFormat.PDF)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/8ed0bb2e-ad6a-4665-986b-4f2f3be3652b.png)
## PDF の復号化
PDFを復号化する際には、PdfDocument.Security.Encrypt()メソッドを呼び出し、開放パスワードと権限パスワードを両方とも空に設定することができます。
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocument オブジェクトを作成する
doc = PdfDocument()

# 暗号化された PDF ファイルをロードする
doc.LoadFromFile("C:/Users/Administrator/Desktop/Encrypted.pdf", "openPsd")

# 開放パスワードと権限パスワードを空に設定して PDF ファイルを復号化する
doc.Security.Encrypt(str(), str(), PdfPermissionsFlags.Default, PdfEncryptionKeySize.Key128Bit, "permissionPsd")

# 結果ファイルを保存する
doc.SaveToFile("C:/Users/Administrator/Desktop/RemovePassword.pdf", FileFormat.PDF)
```
矢印キーの代わりにVimライクなCtrl+Shift+[hjkl]でカーソル移動

PowerToysにて
この設定をすることで、矢印キーに手を移動しなくて済む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26413/7cdba07a-3d84-6270-3ef8-e5aa6aa5e341.png)


MS公式ツールでキーのリマップできるのうれしいですね。会社で入れやすい。
【MySQL】INSERT IGNOREの代わりとしてON DUPLICATE～を使うのはどうだろう？

あけましておめでとうございます。（22日遅れ）
## はじめに
こんな感じの単純なテーブルを想定。(MySQL 8.0)
```sql
CREATE TABLE `t_xxx` (
  `id` int NOT NULL AUTO_INCREMENT,
  `data` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
)
```
(MySQLは付け焼き刃程度の知識しかないので、内容が不正確な場合があります...)

## IGNORE句

MySQLの`INSERT`で
「既に同じキーのレコードが存在する場合はスキップ」
みたいな処理がやりたいときに、ネットで調べると
```sql
INSERT IGNORE INTO `t_xxx` (`id`, `data`) VALUES (10, "hoge");
```
と`IGNORE`句を付加するという方法がよく出てくる。

でも、さらに調べると `IGNORE` 句は重複エラーを無視するだけで、副作用として他のエラーも握り潰しちゃうことが分かる・・・（「IGNORE」だから当然といえば当然）
重複してたときにワーニングという形で返ってくるのも気持ち悪い。

しかし、さらにさらに調べても「じゃあどうすれば？」という解決策は見つけられない・・・

## `IGNORE`じゃなくて`ON DUPLICATE KEY UPDATE`でやるのはどうだろう？

本来は、存在しない場合は`INSERT`、既に存在する場合は`UPDATE`を行う機能（いわゆる`UPSERT`）だけど、この更新対象をPKにしちゃう。
```sql
INSERT INTO `t_xxx` (`id`, `data`) VALUES (10, "hoge") ON DUPLICATE KEY UPDATE `id` = `id`;
```
すると、既に存在したときは、DUPLICATEした（同じ値だった）要素を更新することになり、必然的にどの値も変化せずスキップしたのと同じことになる。

これなら重複してもワーニングが返ってこないし、重複以外のエラーは通常の`INSERT`句のまま返ってくるから、`IGNORE`句より良い気がする・・・どうだろう・・・

ちゃんとした理屈が分かっていないけど、重複していた場合に`AUTO_INCREMENT`が勝手に進んだりもしない。
（そもそもPKがオートインクリメントするテーブルで「なければ追加」みたいな処理をしたい場面はあまり無いような・・・）

## おわりに
このやり方とても単純な話なのに、なぜか探しても同様の方法が出てこなかったから、とりあえず記事にしてみたものの、なにか重大な見落としがあるのかも・・・
でも、問題点を何も書かずに`IGNORE`句のやり方を示す記事も何だかな。。

複雑なテーブルやクエリにまで使えるかは分からないけど、少なくとも今回のような単純なテーブルで重複スキップの`INSERT`をやるだけなら`IGNORE`より安全なはず。

ちなみにUPSERTをやりたくて`ON DUPLICATE KEY UPDATE`を試行錯誤してるときに間違ってPKを更新対象にしてしまい、
「追加はできるのに更新ができない・・・エラーも返ってこない・・・」
と少しハマってたときに、この動作に気づいたのは内緒・・・笑
<input type="search" />のキャンセルボタン

inputのtypeがsearchを設定されている場合、テキストを入力すると、右側に「x」が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617547/4ac3deea-810d-bfb0-31c3-78c3ab6c51da.png)
これはブラウザ自動的に設定した仕様です。削除したい場合、以下のコードを追加します。
```css
    input::-webkit-search-cancel-button {
      appearance: none;
    }
```
そうしたら、「x」がなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617547/c1b76b44-51c3-fc79-d8e1-4a510dbd49f0.png)

 ChromeとSafiraが同じ表現と同じ設定です。
社内ブログ記事の書き方

こんにちは。ぬのがわ公爵です。
（Qiita Advent Calendar 2023で賞をいただきましたので、公爵を僭称しています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/ed98f16b-15e0-9dd3-cfd5-4eefbd8c304f.png)

みなさんはアウトプットをしているでしょうか？
私はこのようにアウトプットすることもありますが、社内ブログに記事を寄稿しています。

社内記事を書きたい、けど書けない、という人のために、個人的に書き方をまとめました。

# 記事の書き方

社内記事には、書きやすいテーマと書きづらいテーマがあります。

### ○　書きやすい
- 研修の感想
- やってみた・つくってみた系
- 社内イベント情報
- 何らかの感想

やってみた・つくってみた系は、もしも電子工作などが得意な場合、おすすめです。

自分でラズパイ工作をしてみた、というような記事は非常に書きやすいです。
たとえ、やっていることがすでにあるものを組み合わせたものだとしても、手を動かして実際にやってみただけで内容のある記事になります。

また、研修の感想や、社内のできごとに関するものは書きやすいです。
個人でも発信している場合、すみわけができるので良い感じです。

### △　書きづらい
- ソフトウェア系のちょっとしたことを解決する記事
- 純粋な技術記事
- 個人的な主張の強い記事

個人発信のブログとは違い、「ちょっとしたことを解決」する記事、たとえば「ビルドが通らなかったけど××を○○したらなんとかなった」というような単発の記事は載せづらいです。
もちろんそういったものも可能なのですが、フィードバックが受けられないので「やってみたけどできませんでした」というようなやりとりができないです。
自社のライブラリの使い方ならいいのですが、「こうこうこうしてみてください！」というやり取りがしづらいので、あんまりおすすめしません。

また、概念を包括するような記事（例えば、通信プロトコルの階層モデルなど！）は、引用が多くなると思いますので、独自にバリューを出そうとするとたいへんです。

# クオリティについて
個人的な意見ですが、コンプライアンスさえ守っていればクオリティでどうこういわれることはありません。
（外から見て、良いなとか、悪いなとか思われることもあるかもしれませんが……）。
Qiita：文字の大きを変える方法


Qiita の記事を, はじめて書いたときに, 便利と思ったことを書いてみます (o'(ェ)')🌻
<br>


## 【ベテランさんの記事をマークダウン方式で拝見してみる】
<br>

　これが, １番はやいと思いました。例えば, ぼくの記事で, 恐縮ですが, 以下のように ｢マークダウン方式｣ で, 観てみますと,
 <br>

### ① 文字の大きさを変える

### ② <font color="#1e90ff">**色の付け方**</font>

### ③ 改行の仕方 (空白行の入れ方)
<br>
<br>

などが, ひとめで, わかります ✨
<br>
<br>

![スクリーンショット_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680561/8b94b175-ca07-3fee-17b8-b7a707dffa6d.png)
<br>
<br>

### ＊ マークダウン方式で見る方法
　マークダウン方式で観るには, 記事の左側にある ・・・ をクリックし ｢ Markdown で本文を見る｣ を選択すれば, 観ることができます。
<br>

![スクリーンショット_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680561/d712c21a-b40d-a73c-2ace-89e6cb407411.png)
<br>



　また ｢ブラウザ：ネットを見るアプリ｣ によっては ｢表示｣ ではなく ｢記事のダウンロード｣ に, なるようです。ぼくは Brave という ｢ブラウザ｣ を使用しています。Brave の場合は ｢表示｣ に, なります。
<br>
<br>
<br>



## 【文字の大きさを変える】
<br>

　｢文字の大きさ｣ は # (ハッシュ) の数で, 変えることができます。# の後には ｢スペース｣ も必要です。文章の１番最初に書きます。
<br>

#### ① # を１つ使用すると, 以下の大きさになります。

# こんにちわんこそば (o'(ェ)')
<br>
<br>

#### ② # を２つ使用すると, 以下の大きさになります。

## こんにちわんこそば (o'(ェ)')
<br>
<br>

#### ③ # を３つ使用すると, 以下の大きさになります。

### こんにちわんこそば (o'(ェ)')
<br>
<br>

#### ④ # を４つ使用すると, 以下の大きさになります。

#### こんにちわんこそば (o'(ェ)')
<br>
<br>
<br>

## 【色の付け方】

　色の付け方 (色の変更) は ｢ヘックス・コード：16進数カラーコード｣ を使用できます。書き方は, 以下のように書きます。 
<br>
```elm
<font color="ヘックス・コード">**"色を変えたい文字"**</font>
```
<br>

#### ① カラーの代表例

　カラーの種類は, 全部で 16,777,216色ありますので・・・その１部だけを紹介してみます。
<br>



<font color="#FF0000">**赤：#FF0000**</font>
<font color="#FF00FF">**マゼンタ(紫紅色)：#FF00FF**</font>
<font color="#FFFF00">**黄色：#FFFF00**</font>
<font color="#00FF00">**緑：#00FF00**</font>
<font color="#00FFFF">**シアン(青緑色)：#00FFFF**</font>
<font color="#0000FF">**青：#0000FF**</font>
<font color="#000080">**紺色：#000080**</font>
<font color="#800080">**紫色：#800080**</font>
<font color="008080">**ティール(鴨の羽色)：#008080**</font>
<font color="#808000">**オリーブ色：#808000**</font>
<font color="#808080">**灰色：#808080**</font>
<br>
<br>

　例えば ｢赤：#FF0000｣ で, 書くと, 以下のようになります。
<br>
<br>

<font color="#FF0000">**こんにちわんこそば (o'(ェ)')♪**</font>
<br>
<br>
<br>


## 【改行の仕方 (空白行の入れ方)】
　｢改行：空白行｣ の入れ方は, 以下のように書きます。
<br>

```elm
<br>
```
<br>

　例えば ｢改行｣ を 10個 書くと, 以下のように, めっちゃ下ぁーーーーの方に行きます。
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

<font color="#FF0000">**こんにちわんこそば (o'(ェ)')♪**</font>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

　本日の記事は, 以上になります。また, 便利なことや気付きなどが, あったときに記事を書いてみたいと思います。最後まで, 読んでいただき, ありがとうございます (o'(ェ)')♪
 <br>
 <br>
Dataverse VS Azure SQL DB(SQL Server)

よく同じMicrosoftのデータストアとしてMicrosoft Dataverse と Azure SQL DB(SQL Server)の2つの使い分けが聞かれますが、どちらにも長所と短所があり、さまざまな目的で使用されます。

この記事では、2つを比較し、それぞれの機能、長所、短所を述べます。
どちらがニーズに最も適しているかを判断するのに役立ててください。

# Dataverseとは？
Dataverseは従来のデータベースを進化させたもので、ローコードで本格的にデータベースの作成からモデリングがすぐに可能です。RDB（リレーショナルデータベース）をベースとしながら、非構造化データも統合管理できます。
ローコード開発ツールであるPower Platform共通のデータベースサービスです。
裏側にAzure SQL DBやAzure Cosmos DB、Azure Blob Storageを使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a1655747-d459-d214-2148-f464884dd5e8.png)

# Azure SQL DB(SQL Server)とは？
Azure SQL DBとSQL Serverはどちらも、RDBMS（リレーショナルデータベース管理システム）です。
データベース操作言語のSQLを使用して、操作を行います。

（Azure SQL DBとSQL Serverの違いは主にクラウド型であるかオンプレミスであるかです。）

# Dataverse と Azure SQL DB(SQL Server)の違いは？

Dataverse と Azure SQL DBの違いについて、以下の画像にまとめました。
まず使用する対象者が異なることが大きいです。Dataverseはプロの開発者ではない、市民開発者が使用できるようにローコード開発基盤となっています。...①

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/28a85da5-c8e6-bd2a-ff17-94ae814bb2e0.png)

では、機能の面ではどのように違うのか、気になると思います。
結論、Dataverseの裏側もAzure SQL DBであるため、開発視点での使えない機能は**ほとんどない**といえると思います。

JOINや複雑なクエリも、APIからFetch XML書けば基本は実行できますし、ストアドプロシージャのような関数的な処理もプラグインで実行可能です。

ただ、Dataverseでは、ローコードにするため、直接SQLのクエリを書くのはアプリやAPIからはできず、Fetch XMLやODataクエリ、Power Fxなどで操作できるようになっていて、意図的に隠されています。（APIで操作するときはJSON）...②

この点が利点となるか、欠点となるかはユースケースによります。ここをうまく使い分けてビジネスに取り込むことで、より効果的にアプリ構築やデータ活用が行えるようになるはずです。
（Power BIや、SQL Server Management StudioからはSQLを呼べる）

::: note warn
代用となるものがないクエリも一部ありますが、いずれにしても、APIでは代用可能なので、ここでは実質Dataverseで実装可能としています。
:::

それ以外だと、インフラやインデックス、バックアップなど、アプリレイヤーではないところの自由度が異なります。...③

アプリレイヤーではない、システム的なところ（インデックスどう張るか、バックアップの粒度、サーバーのスケーラビリティ、単体のマシンスペックなど）をサービスとして自動的にやってくれる変わりに、自由度としては下がってしまいます。

例) 
クラウド上にバックアップを取るため、ダンプ（データベースまるごと手元のサーバーにバックアップ）を取りたいときの方法はなく、この点で自由度はありません。

細かくここをカスタマイズしたい場合はDataverseを使わない方が良いです。

また、SaaSとしての様々な機能がついているため、Azure SQL DB(SQL Server)よりもコストの面で高くなります。...④

また扱うデータの種類は、以下のように「どちらかというと得意」なものがあります。...⑤
- ビジネスでより安全でスケーラブルなデータストレージと他の Microsoft サービスとの統合が必要な場合は、Dataverse の方がどちらかというと適している
- ビジネスで大量のデータやクエリを管理する必要がある場合（マスタデータなど）は、Azure SQL DB(SQL Server)の方がどちらかというと適している

# Azure SQL DB(SQL Server)と比較したDataverseの特徴
まとめると以下のような違いがあります。

①使用対象者が市民開発者
②SQLのクエリがローコードで扱えるようになっている
③アプリレイヤーではない、システム的なところが自動化されている
④コストの面で高くなる
⑤どちらかというと得意なデータの種類が異なる

# まとめ
Dataverse と Azure SQL DB(SQL Server)はどちらもデータを管理するための強力なツールですが、要件と目的によっては、一方が他方よりもニーズに適している場合もあります。
最終的には、どのツールがニーズに最も適しているかを考え、使い分けをしてみてください。

# 参考
https://softkeys.uk/blogs/blog/microsoft-dataverse-vs-sql-what-generator-fuel-is-best-in-2023
商品出品機能の単体テストコード

# 本日のエラー
[![Image from Gyazo](https://i.gyazo.com/129f3936afd6b8ddf0011a5a28165f53.png)](https://gyazo.com/129f3936afd6b8ddf0011a5a28165f53)
本日のエラーはモデルの単体テストコードでエラー文が一致しないよーというものでした。
includeは**含む**という意味ですから、expectedの中に含まれていなければエラーが出てしまいます。

ということで、今回はいらない"id"の文字があったので削除して解決です⭐︎
【Rails】動的にDBのテーブルにカラムを追加してみる

どうもこんにちは。

今回は、動的にDBのテーブルにカラムを追加する方法をメモしていきます。

# 動的にカラムを追加とは？

本来であれば、DBのテーブルにカラムを追加する場合には、以下のような手順を踏むと思います。

1. マイグレーションファイル生成

```sh
rails g migration AddNewColumnToSample
```

2. マイグレーションファイル編集

```ruby
class AddNewColumnToSample < ActiveRecord::Migration[7.0]
  def change
    # addcolumn :テーブル名, :カラム名, :データ型
    add_column :samples, :new_column, :string
  end
end
```

3. マイグレーション実行

```sh
rails db:migrate
```

しかし、「custom_itemsテーブルにデータが登録された場合に、登録されたデータの名前でsamplesテーブルにカラムを追加したい」ということが出てきます。（複雑なアプリケーションの場合はアリエル）

そんなときに使える方法を紹介します。

# 手順

## 1. custom_itemsテーブルにデータを登録するアクションを作成

```ruby
def create
    @custom_item = CustomItem.new(name: params[:name])

    if @custom_item.save
        redirect_to custom_items_path
    else
        render :new
    end
end
```

## 2. マイグレーションコードを追加

```ruby
def create
    @custom_item = CustomItem.new(name: params[:name])

    if @custom_item.save
        # ここを追加
        ActiveRecord::Migration.add_column :sample, @custom_item.name, :string
        # not nullにする場合には、ActiveRecord::Migration.add_column :sample, @custom_item.name, :string, null: false
        redirect_to custom_items_path
    else
        render :new
    end
end
```

## 3. Railsコンソールを起動してテーブルを確認する

```sh
rails c
```

```ruby
Sample
```

これでテーブルにカラムが追加されます。

# カラムを削除する場合の手順

## 1. custom_itemsテーブルからデータを削除アクションを作成

```ruby
def destroy
    @custom_item = CustomItem.find(params[:id])

    if @custom_item.destroy
        redirect_to custom_items_path
    else
        render :edit
    end
end
```

## 2. マイグレーションコードを追加

```ruby
def destroy
    custom_item_name = @custom_item.name
    @custom_item = CustomItem.find(params[:id])

    if @custom_item.destroy
        # ここを追加
        ActiveRecord::Migration.remove_column :sample, custom_item_name
        redirect_to custom_items_path
    else
        render :edit
    end
end
```

## 3. Railsコンソールを起動してテーブルを確認する

```sh
rails c
```

```ruby
Sample
```

これでテーブルにカラムからカラムが削除されます。

以上
【React】アロー関数内で波括弧の省略どころがわからずハマった

アロー関数で処理部分が複数行になる場合は必ず波括弧を使用するものと認識していたのだが、なぜ関数①が動作するのかわからず試行錯誤した。

まず関数2に関してはそもそも波括弧を使用する場合は`return`を記述するという、基礎的な部分が抜け落ちていたことが原因であった。

また関数①でなぜ波括弧を省略できるのかについては、アロー関数自体が**式**であるためであった。式内部での処理が何行でも単一の式であることに変わりはないので、波括弧を省略できた。

参考：[Reactにおける波括弧の省略に関して](https://teratail.com/questions/0yd3m9sogry0kj)

```App.js
// 関数①
setTodos((prevTodos) =>
  prevTodos.map((todo) =>
    todo.id === id ? { ...todo, completed: !todo.completed } : todo
  )
);

// 関数②
// エラー：Expected an assignment or function call and instead saw an expression
setTodos((prevTodos) => {
  prevTodos.map((todo) => {
    todo.id === id ? { ...todo, completed: !todo.completed } : todo;
  });
});

// こうしたらエラーは発生せず
setTodos((prevTodos) => {
  return prevTodos.map((todo) => {
    return todo.id === id ? { ...todo, completed: !todo.completed } : todo;
  });
});
```
VMWare Workstation16 Playerでローカル開発環境を作成時のメモ

1).NATで設定してlinuxインストール
2).vmnetnat.confでデフォルトGATEWAYのIPアドレスを確認
    "C:\ProgramData\VMware\vmnetnat.conf"
    
     [host]
    # NAT gateway address
    ip = 192.168.***.**/24
    hostMAC = **:**:**:**:**:**

3).仮想マシンの固定IPを決める
   
    例えば上記で確認したGATEWAYのIPが「192.168.144.2/24」だったら「192.168.144.*」で構成
    固定のIPアドレス：192.168.144.3などに。

4).ネットワークファイルに固定IPの指定を記載

    [prompt] # vim /etc/sysconfig/network-scripts/ifcfg-ens33  
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=192.168.144.3
    GATEWAY=192.168.144.2       ← vmnetnat.confから
    BROADCAST=192.168.144.255

5). DNSリゾルバに名前解決時参照Nameサーバ情報を

    [prompt] # vim /etc/resolv.conf
    nameserver 8.8.8.8
    nameserver 8.8.4.4

6). ネットワークインターフェイスを再起動

    [prompt] # ifdown ens33
    [prompt] # ifup ens33

これでブラウザから指定したIPアドレス(この例では192.168.144.3)にアクセスしてWebコンテンツの閲覧が可能となりました。
.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる4～実装3～

[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる4～実装2～](https://qiita.com/GOROGOROMOGUMOGU/items/566ad01665a6dd3f9d4e)の続き
# Interactorを実装する
フォルダ構成は[フォルダ構成を決める(MauiApp1.Domain)](https://qiita.com/GOROGOROMOGUMOGU/items/3803ca4a09c0800b1c86#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B)の通り
#### Createユースケースを実装する
```c#:HealthCreateInteractor.cs
    public class HealthCreateInteractor : IHealthCreateUseCase
    {
        private readonly IHealthRepository _healthRepository;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="healthRepository"></param>
        public HealthCreateInteractor(IHealthRepository healthRepository)
        {
            this._healthRepository = healthRepository;
        }

        /// <summary>
        /// 体調情報を作成する
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public HealthCreateResponse Handle(HealthCreateRequest request)
        {
            this._healthRepository.Save(new Health(request.Id, request.RecordDate.Date, request.HeartNumber));

            var health = this._healthRepository.Find(request.RecordDate.Date);

            if (health == null) throw new Exception("体調情報の作成に失敗しました");

            return new HealthCreateResponse(health.Id);
        }
    }
```
#### GetListユースケースを実装する
```c#:HealthGetListInteractor.cs
    public class HealthGetListInteractor : IHealthGetListUseCase
    {
        private readonly IHealthRepository _healthRepository;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="healthRepository"></param>
        public HealthGetListInteractor(IHealthRepository healthRepository)
        {
            this._healthRepository = healthRepository;
        }

        /// <summary>
        /// 体調情報リストを取得する
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public HealthGetListResponse Handle(HealthGetListRequest request)
        {
            var healths = this._healthRepository.Find(request.StartDate, request.EndDate);

            return new HealthGetListResponse(
                healths.Select(h => new HealthDto(h.Id, h.RecordDate, h.HeartNumber)).ToArray());
        }
    }
```
# 参考にしたURL
[実践クリーンアーキテクチャ](https://nrslib.com/clean-architecture/)
# まとめ
今回はInteractorを実装しました。
次はModel、ViewModel、Viewを実装します。
[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる4～実装4～](https://qiita.com/GOROGOROMOGUMOGU/items/fd5a28e2f634f0574728)
Laravelで　Vue.js, Inertia.js を使用してREST APIからデータを取得する方法

# Laravelで　Vue.js,  Inertia.js を使用してREST APIからデータを取得する方法

Laravelをバックエンドとして、Vue.js with Inertia.jsをフロントエンドに使用し、REST APIから情報を取得する方法を紹介する。

* **前提条件**
・laravelのプロジェクトが作られている
・Vue.js,  Inertia.jsがインストールされている
・APIキーをすでに持っている
・Guzzleがインストールされている

## 手順 1: envファイルの設定

まず、Laravelプロジェクトの.envファイルにAPIキーとAPIエンドポイントのベースURLを追加する。
```.env
API_KEY=あなたのAPIキー
API_BASE_URL=あなたのAPIエンドポイントのベースURL
```

##  手順 2: コントローラの作成

LaravelでAPIデータを取得するためのコントローラを作成する。

```php
php artisan make:controller ApiController
```

## 手順 3: コントローラの編集

作成したApiControllerにGuzzleを使用してAPIからデータを取得する処理を追加する。

```php
namespace App\Http\Controllers;

use GuzzleHttp\Client;
use Illuminate\Http\Request;

class ApiController extends Controller
{
    public function fetchData()
    {
        $client = new Client();
        $response = $client->request('GET', env('API_BASE_URL'), [
            'headers' => [
                'Authorization' => 'Bearer ' . env('API_KEY'),
            ],
            'verify' => false  // SSL認証を無視する設定（開発環境でのみ使用）
        ]);

        $data = json_decode($response->getBody(), true);
        return $data;
    }
}
```

## 手順 4: ルートの定義

APIデータ取得用のルートをroutes/web.phpに定義する。

```blade
use App\Http\Controllers\ApiController;

Route::get('/api/data', [ApiController::class, 'fetchData']);
```


## 手順 5: Vueコンポーネントの作成
Vue.js with Inertia.jsでAPIデータを表示するコンポーネントを作成する。

```javascript
// resources/js/Pages/ApiData.vue

<template>
  <div>
    <h1>API Data</h1>
    <div v-if="data">
      {{ data }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      data: null
    };
  },
  mounted() {
    this.fetchData();
  },
  methods: {
    fetchData() {
      axios.get('/api/data')
        .then(response => {
          this.data = response.data;
        })
        .catch(error => {
          console.error(error);
        });
    }
  }
};
</script>
```
## 手順 6: Vueコンポーネントのルート定義
Inertia.jsを使用してVueコンポーネントをレンダリングするためのルートを定義する。

```php
// routes/web.php

use Inertia\Inertia;

Route::get('/api-view', function () {
    return Inertia::render('ApiData');
});

```
## 手順 7: テスト
ブラウザで[http://your-laravel-app.test/api-view]にアクセスし、APIから取得したデータが表示されることを確認する。

※最初のルートはAPIデータの取得用であり、二番目のルートはそのデータを表示するフロントエンドページを提供するためのもの。フロントエンドとバックエンドの処理が分離されており、それぞれが独立した役割を持っている。



## 注意点
* 自己署名のサイトでセキュリティエラーを避けるためには、Guzzleのリクエスト時にverifyオプションをfalseに設定することができます。ただし、これはセキュリティリスクを伴うため、開発環境でのみ使用してください。
.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる3～設計～

[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる2～開発環境～](https://qiita.com/GOROGOROMOGUMOGU/items/a7a6263b0fdab8af8420)の続き

# 作成するアプリの仕様
シンプルな体調管理アプリをテーマにします。
要求は、以下の通りとします。
・毎日の体調を記録できること
・後からでも記録を変更できること
・体調の波をグラフ表示できること
・操作はなるべく簡単であること
# 設計
## アプリ構成図
.NET MAUIのコントロールを数種類試したいので、こんな感じにします。

![アプリ構成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/aeea7fb5-db87-32d0-3d62-862d720863cd.png)

・ハート数スライダーで体調の良し悪しを設定する
・スライダーを動かすと、右側に設定値分のハートを表示する
・OKボタンでローカルDB(SQLite)へ保存する
・選択した期間のグラフ(縦：ハート数、横：日付)を表示する
・日付を選択してGOボタンを押下すると、指定日のハート数を変更する画面に遷移する
## DB設計
テーブル一個だけのシンプルすぎるDBです。
![テーブル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/20854239-6695-899b-f100-5deb296b61d9.png)
id：ＩＤ　
record_date：記録日付
heart_number：ハートマークのチェック数
## クラス構成
ざっくりしていますが、下図の構成で考えました。
![クラス構成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/977fffc3-6b72-f950-6b74-aec98f08c8ac.png)

色分けの意味合いは、下図の色分け同様です。
![CleanArchitecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/ff228a61-43d7-8018-b0ba-7f04e401b342.jpeg)
引用元：https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
# まとめ
今回は作成するアプリの仕様をまとめて設計を行いました。ざっくりと。
次は実装に移ります。
[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる4～実装1～](https://qiita.com/GOROGOROMOGUMOGU/items/3803ca4a09c0800b1c86)
.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる2～開発環境～

[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる１～はじめに～](https://qiita.com/GOROGOROMOGUMOGU/items/f29b1bb823ed90286112)の続き

# 開発環境
Windows10 Home 64bit
Visual Studio2022、コミュニティエディション、.NET8
CommunityToolkit.Mvvm 8.2.0
Microsoft.Extensions.DependencyInjection 8.0.0
LiveChartsCore.SkiaSharpView.Maui 最新のプレリリース版 2.0.0-rc2
Microsoft.Data.Sqlite 8.0.1

# 開発環境をつくる
## .NET MAUI環境をつくる
以下の手順通りです。
[.NET MAUI チュートリアル](https://dotnet.microsoft.com/ja-jp/learn/maui/first-app-tutorial/intro)
## CommunityToolkit.Mvvmをインストールする
NuGetからインストールします。
「CommunityToolkit.Mvvm」を選択してインストールする
![CommunityToolkit.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/27330de5-0b2d-4956-23f9-bf2dadb34f0f.png)

## Microsoft.Extensions.DependencyInjectionをインストールする
NuGetからインストールします。
「Microsoft.Extensions.DependencyInjection」を選択してインストールする
![DependencyInjection.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/cac56801-010a-16f1-a188-973d5daa9756.png)

## LiveChartsCore.SkiaSharpView.Mauiをインストールする
NuGetからインストールします。
「LiveChartsCore.SkiaSharpView.Maui」を選択してインストールする
2024/01現在、プレリリース版となっています。「プレリリースを含める」をチェック
![LiveChartsCore.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/d377955e-6520-9152-4c08-38241444b3c6.png)

## Sqliteをインストールする
Infrastructureを実装する際に説明を記載します。
# 実行する
Android エミュレーターで実行する場合、Windows機能の「Hyper-V」をアクティブ化する必要があります。
が、私の個人PCはWindows10 Home 64bitなのです。
※「Hyper-V」を有効にするにはWindows Pro以上が必要

Homeエディションでも「Hyper-V」をインストールして有効化する方法はあるようなので、
「Home Hyper-Vを有効化する」で検索してみてください。

今回は、Android 実機で動作させることにします。
実機でのデバッグ実行方法は[こちら](https://dotnet.microsoft.com/ja-jp/learn/maui/first-app-tutorial/device-setup) 「Android デバイスの設定」の項を参照。
# まとめ
今回は開発環境を作成しました。
次は作成するアプリの仕様を決めて設計を行います。
[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる3～設計～](https://qiita.com/GOROGOROMOGUMOGU/items/6b79aa9b1c83261957c3)
【AWS】セキュリティグループのルール設定の自動化をしてみた

ごきげんいかがですか、

この度、AWSの大規模プロジェクトでセキュリティグループの設定をさせていただく機会があったので、
その時工夫した点などを共有したいと思います😉


## １．はじめに

現在のプロジェクトで、複数のセキュリティグループのルール設定を先輩から任せていただきました。

サーバによっては100近くもインバウンドルールがあり、それを複数のセキュリティグループで設定するというのは、とても骨の折れる作業でした、、


#### 1.1 当初の業務内容
タスクを振っていただいた当初は以下のように手動で設定していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/73b7ede3-f2ad-d301-e9be-4c956d89b36b.png)

サーバによっては100以上もインバウンドルールがあったのでとても大変でした、、、

#### 1.2 結果と課題

結果として、ルール設定に多大な時間がかかり、設定時に二人一組で確認したにも関わらず、単体テストでは設定ミスが発見されました。。🤣

そこで今後の**人的ミスを減らし、工数を効率化する必要性**を実感し、
自動化を進めることにしました。

## 2.自動化へ

#### 2.1　実現したいこと

まずは実現したいこととして、以下を掲げました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/adad20c8-cc9c-5cb0-ee9d-7f83e68b246f.png)

納品までの期間が近く、バッチファイルをつくりCLIに読み込ませる自動化は諦めました、、
（プロジェクトが終わったのでこれから作っていきます😎）

そこでAfterの図のようにコマンドをAWS CloudShellに読み込ませる手法を選択しました。

#### 2.2 自動化の詳細

以下では、どのように自動化を進めてきたのか順を追って説明いたします

もともとの設計書はこのようになっていました。
こちらを用いてコマンド作成シートを作成していきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/f0157414-adfa-0493-82af-5513e4d77ff3.png)


コマンド作成シートに次の要素を用意します。

:::note info
・インバウンドルールの設定を明示するコマンド（aws ec2 authorize-security-group-ingress)
・セキュリティグループID (--group-id 〇〇）
・プロトコル (--protocol 〇〇)
・ポート番号 (--port 〇〇)
・CIDRブロック (--cidr 〇〇）
:::
プロトコルとポート番号とCIDRブロックは設計書シートから関数で引っ張ってこれますね、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/b2812a69-43c1-ad7f-e7e3-98e19fa83063.png)

先ほどの５つの要素を＆関数を用いて、一文のコマンドにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/eb470440-9185-fd4f-33a6-b8f7e5650ede.png)

このコマンドを複数行コピーして、AWS CloudShellに貼り付ければ自動的にルールが設定されます！！

簡単ですね😊

## 3.さいごに

AWS CloudShellを用いることにより、1時間かかるタスクが**5分**でできるようになりました。

そして手動による**設定ミスがなくなり**、間違えるかもしれないという恐怖感がだいぶ減りました。

これからも比較的時間がある新人が業務を効率化し、チームに貢献していきたいと思います。
.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる１～はじめに～

# 概要
.NET MAUIとCleanArchitectureの学習備忘録です。
簡単なWindows、Androidのクロスプラットフォームアプリを作成します。

バリバリの専門家が書く記事ではないことをご了承ください。
間違いがありましたら、ご指摘いただけると嬉しいです。

# .NET MAUIとは
C#とXAMLでクロスプラットフォームアプリを作成できるフレームワークのことです。
[.NET MAUI とは](https://learn.microsoft.com/ja-jp/dotnet/maui/what-is-maui?view=net-maui-8.0)

# CleanArchitectureとは
ソフトウェアアーキテクチャの種類ではなく、いわば変更に強いアーキテクチャ設計思想のことです。

簡単にまとめると、
・レイヤーで分けて関心事を分離しましょう(関心事の分離)
・依存の流れは一方通行にしましょう
・依存関係を逆転させて依存を制御しましょう(依存性逆転の原則)
ということ

クリーンアーキテクチャといえば下図ですが、
しっかりと理解するのは難しかったので、上記を概ね実現できればOKとします。
![CleanArchitecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/ff228a61-43d7-8018-b0ba-7f04e401b342.jpeg)
引用元：https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

# レイヤーで分けて関心事を分離しましょう(関心事の分離)
なんでもかんでも一箇所で行うのではなく、異なる責務ごとに分けましょう、
他のコンポーネントへの影響を最小限にしましょう、ということです。
CleanArchitectureに限った話ではありません。

関心を分離することで、自然と疎結合になり、保守性、テスト容易性が高まります。
# 依存の流れは一方通行にしましょう
上図の円に描かれている矢印の向きにしか依存しません、ということ。
EntitiesがUse CasesやControllersに依存してはいけません。

# 依存関係を逆転させて依存を制御しましょう(依存性逆転の原則)
依存する側は、直接クラスや関数を呼び出すのではなく、抽象インタフェースを呼び出しましょう、ということです。

クラスAがクラスBを呼び出すには、
![A→B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/37e8ce0c-212b-3018-3a3a-6c4732cda489.png)
ではなく、
![B→A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674221/39a97690-0411-c797-fd0c-b170fa0cee28.png)
という流れになります。

# まとめ
今回は.NET MAUIとCleanArchitectureの基礎知識を学習しました。
次は開発環境を作成します。
[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる2～開発環境～](https://qiita.com/GOROGOROMOGUMOGU/items/a7a6263b0fdab8af8420)
第1回 ライトニングトーク !!

# はじめに
私の通っている学校内のイベントにてLTをやってみたので記録として残してみます。
また、初めてQiitaに記事を投稿します。お手柔らかに...
# 私について
::: note
+ 20歳
+ 情報系の専門学生
+ 情報セキュリティとネットワークを勉強中
:::
私はITの世界を勉強して2年目の学生です。
普段はわからないことを調べたり、試してみたりしてます。
最近の楽しいと感じているのは無線ネットワークについてです！
***
# 事の経緯
私の同級生が、セキュリティのサークルを立ち上げたいということなので、関わってみたいと思って計画を始めました。
具体的な方針が決まりつつ、話を聞いてみると、第1回目は下級生に向けたライトニングトークをすることになりました。
# さあ、大変だ
私は「ライトニングトーク？ なにそれ？？」と初めて聞く単語に首を傾げました。
どうやら、エンジニアの中では有名なようで、技術の紹介であったり、
マイブームなどを**面白く**、時には**真面目**に発表する短い時間で行うプレゼンのようなものでした。

ふーん。なんだか面白そうじゃん！？
### **「やってみたい！！ でも、どうやろう？？」** 
# ネタ探しと資料作り
幸いにも、私はプレゼンが好きな方なので、ワクワク感がありました。
問題は、どの層（聞き手）に対して題材を選ぶか。
自分の好きなことを紹介する？それともためになること？ 
うーん... 一週間くらい悩みました。
**「サイバーセキュリティについての集まりなので、セキュリティ寄りでいこう。」**
ここまでは決まりましたが、ITについて、まだ少ししか習っていない下級生に対し、専門単語を使わずに説明するのは、難しいしな...
結局、自分が発表したい内容と、基礎的なサイバーセキュリティである、 
**Basic認証** をテーマに決定します。
# なぜBasic認証なのか
正直わかりません。HTTP通信を授業で教えてもらい、その中でBasic認証について触れられたので気になったんだと思います。
ただ、調べていくうちに、具体的な流れや設定方法、脆弱性などがわかってきて、楽しかったです。
# 実際の資料を公開
<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/K38VG1/embed?key=2024-01-22-131132" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/s7fy/K38VG1-2024-01-22-131132">第1回LT Basic認証 by @s7fy</a></div>
持ち時間15分を想定し、資料は10ページにも満たなく味気ないですね...
発表中は、Wiresharkを使った実践をしました。
認証情報のパケットを覗くだけなのですが...
質疑応答含め、おおよそ15分でできたので、良かったです。
# おわりに
無事に終えたので、反省をしようと思います。
その前に、視聴してくださった下級生の方にアンケートをとりました。
半数の方が難しい内容とのことだったので、次回では易しい言葉選びを心がけたいです。
#### 以上、初めての記事投稿を終わります。
WSL2+DockerでUbuntu以外をバックエンドにする

# 前提・やりたいこと

WindowsにDocker環境を構築する際，バックエンドにWSLを指定できる．

このとき，Ubuntu以外のディストリビューション(当記事ではArchLinux)をバックエンドに指定したい．

# 環境

- Windows 11 Home
- Arch Linux (WSL2上)

# 結論

defaultのディストリビューションをUbuntuからArchLinuxにする．

```PowerShell
wsl.exe --set-default ArchLinux
```

`ArchLinux`の部分は，ご自身の環境でのディストリビューション名にしてください．
ディストリビューション名は，次のコマンドで確認できます．
```Powershell
wsl.exe -l -v
```

# 解説

[公式ドキュメント](https://docs.docker.com/desktop/wsl/#enabling-docker-support-in-wsl-2-distros)によると，
> The Docker-WSL integration is enabled on the default WSL distribution, which is Ubuntu. To change your default WSL distro, run:
> ```powershell
> wsl.exe --set-default <distro name>
> ```

とのことです．つまり，Dockerがバックエンドに使うWSLディストリビューションは，デフォルトに指定されているものだということらしいです．

よって，`wsl.exe`コマンドによってデフォルトディストリビューションを変更すればよいことがわかります．

# 参考

- [Docker Desktop WSL 2 backend on Windows | Docker Docs](https://docs.docker.com/desktop/wsl/#enabling-docker-support-in-wsl-2-distros)