OmniAICreator/Qiita-1.07M huggingface dataset:
プロジェクトマネージャーからプロダクトオーナーにジョブチェンジした話

この記事は [クラウドワークス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/crowdworks)の11日目の記事です。

# 概要
はじめまして、 @e-takazawa です。
株式会社クラウドワークスで[crowdworks.jp](https://crowdworks.jp/) のプロダクトオーナーを担当しております。

私はもともとWeb/Androidエンジニアとしてのバックボーンを持つプロジェクトマネージャーとして開発マネジメントを行なってきましたが、クラウドワークスにはプロダクトオーナーとしてジョインしました。
以前書いた[記事](https://qiita.com/e-takazawa/items/869b6edd3a915b98590e)でプロジェクトマネージャーとしての考えは書いたのですが、新しいキャリアへの挑戦をしている中で視座が変わったように感じています。
その感じたことをお伝えすることで、同じキャリアを歩んでいる方、これから歩もうとしている方への参考になればと思っております。

# プロダクトオーナーとプロジェクトマネージャーの違いは？
改めて、二つの職域がどれくらい違うかを確認したいと思います。

まずはプロダクトオーナーです。
`プロダクトオーナーは、スクラムチームから⽣み出されるプロダクトの価値を最⼤化することの結果に責任を持つ。`
と、 [スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)には書いてあります。
クラウドワークスでもこの定義は同じです。

では、プロジェクトマネージャーはどうでしょうか。
[IPAのプロジェクトマネージャ試験が求める人物像](https://www.jitec.ipa.go.jp/1_11seido/pm.html)には
`高度IT人材として確立した専門分野をもち、組織の戦略の実現に寄与することを目的とするシステム開発プロジェクトにおいて、プロジェクトの目的の実現に向けて責任をもってプロジェクトマネジメント業務を単独で又はチームの一員として担う者`
とあります。
確かに、今まで行ってきた業務も似たようなものかなと思います。

ここからは両方の職種を経験した主観的な意見ですが、

プロダクトオーナー：**プロダクトの価値の最大化**に責任を持ち、そのために行動する者
プロジェクトマネージャー：**システム開発プロジェクトの成功**に責任を持ち、そのために行動する者

という違いがあると思います。
（異論は認めます。）

# プロダクトオーナーになって自分が変わったなと思うこと
では、実際プロジェクトマネージャーがプロダクトオーナーになると、どう変わるのでしょうか。
私にとっては、もともと開発マネジメントを行なっていたときは、【この機能をどう実装するか】を推し進めていく面が強かったのですが、これがプロダクトオーナーになると、
- ユーザが抱えている現在の課題は何か。
- 理想としている状態は何か。
- 理想と現実のギャップをどう埋めるか。
- そのためにどういう機能を提供するのか。

で考えることが多くなりました。

プロジェクトマネージャーとして開発業務を進めるときはある程度課題も整理された状態で開発することが多かったのですが、プロダクトオーナーになると、どこに課題があるのかを自分の足で探すことになります。
ユーザーインタビューでもこれが欲しいという意見もあれば、使いにくい！という意見まで様々です。
また、[顧客が本当に必要だったもの](https://www.casleyconsulting.co.jp/blog/engineer/4334/)が表す通り、表層に見えている問題がそのまま解決策になるのではないので、意見を集約し、分析し、仮説を立て、バックログに落とし込んでいくことが必要です。

プロジェクトマネージャーとしての経験は全く活かせないかというとそうではなく、考える幅が広くなったように感じます。

# プロジェクトマネージャーとしての経験が活きること
では、プロジェクトマネージャーとしての経験が活きることとはなんでしょうか。

一つは、エンジニアと同じ言葉でコミュニケーションが取れる、ということが（エンジニアとしての経験を経て）プロジェクトマネージャーからプロダクトオーナーになった場合のアドバンテージだと思います。
スクラム開発においては、プロダクトオーナーがIT知識に精通している必要はないと思いますが、同じ言葉で会話できる方がコミュニケーションはしやすいと思います。

もう一つは、具体的な施策を考えるときに、ある程度実装難易度を考慮しながら検討ができることかと思います。
ただし、これは場合によっては足を引っ張ります。
なぜならプロダクトオーナーはユーザーやプロダクトにとってベストな施策を提案すべきで、そこから現実的な方法に落とし込むのはエンジニアとの協働で行うべきだからです。
プロダクトオーナーが自身の検討段階でベストな可能性を潰してしまっているとも見れるので、ここは自分でも注意しているところです。

# プロダクトオーナーになって単純に面白いと思うこと
プロダクト開発に正解はない、という言葉を今までも聞いてきたし、皆さんも聞いたことがあると思います。
それを実感することができます。

私の場合ですが、自分の立てた仮説とは異なる結果が得られることです。

ユーザーインタビューの結果をもとに仮説を立てたり、自分自身でクラウドワークスのサービスを利用して得た経験から仮説を立てて施策を実施していきます。
そしてその結果を定量的、定性的に検証するのですが、**思ったよりも仮説は当たらない**ことに気づきます。

それも、
大当たりでもなく、
大外れでもなく、
あれ？なんで？と思うものです。

それを注意深く様々な切り口で分析し、やっと
「ああ、ここが考慮できてなかったのか。」
「なるほど。そういう使い方もあるのか。」
といった、仮説を立てたときにはわからなかった新しい発見があるのです。

昨日までわからなかったことが、仮説検証、実施、効果分析のサイクルを回すことで徐々に確実にわかるようになっていくことがプロダクトオーナーとしてのやりがいなのかもしれません。

# おわりに
いかがだったでしょうか。
プロダクトオーナーになってまだ日が浅いですが、今までの活動を振り返る良い機会になりました。
プロダクト開発は不確実性が多い事ばかりですが、楽しんでこれからもやっていきたいと思います。
【Microsoft】PowerPageseでの画面の各部品の設定方法について

Power Pagesとは、2022年10月12日にローコード・ノーコードでビジネス向けWebサイトが作成できるツールとしてMicrosoftからリリースされたアプリです。今回は、このサービスを約1か月使ってみた私が大まかな画面制作の流れをまとめました。

まだ、Power Pagesを扱ったことのない人やこれから利用しようか考えている方は是非参考にしてみてください。

# 出来ること
Power Pagesの画面編集で出来る内容としては主に下記の**4種類**です。
これらは**コンポーネント**と呼ばれています。
* テキスト
* ボタン（遷移先を設定するのみ）
* 入力フォーム
* データベースの内容を出力

以下に、各コンポーネントの設定方法などを説明します。



編集画面の初期表示です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/59f6b8b0-6412-8a5b-a10b-0b9dde9ebafc.png)

**①メニュー**
ページ編集画面、スタイル設定画面やデータベース設定画面に切り替えることができます。
**②メインナビゲーション**
サイト上のページが一覧することが出来ます。
**③ページ追加**
新しくページを追加することが出来ます。
**④ページ編集画面**
各ページを編集することが出来ます。ページ上のボタンやテキスト（コンポーネント）の内容と配置を決めることが出来ます。

新しいページを追加するために左上の**＋ページ**をクリックすると、画面レイアウトを選択する**ページの追加**ウインドウが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/1696d0df-6dee-2a6b-d79f-686adebbe73a.png)


**空白から開始**を選択すると、テキストやボタンなどの**コンポーネント**を選択することが出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/61c18218-bc6e-7073-b917-f97868c40257.png)

### テキストを挿入する場合
任意のテキストを入力することができて、書体や文字間隔、幅寄せなどが可能。
CSSやスタイル設定などからさらに細かいスタイルを設定することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/ec567122-f8af-0edf-062b-962c57a07855.png)

### ボタンを挿入する場合
URLまたはページのリンクを指定することが出来て、ボタン押下時に画面を遷移させることが出来る。
また、ボタンのスタイルや配置方法なども指定できる。

**編集**ボタン押下時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/e458a74f-9e4e-0456-b688-fb7615ffe407.png)
**スタイル**ボタン押下時
ボタンやテキストの色や形を指定できる。
詳細は**メニュー**の**スタイル設定**から設定することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/ee8b5278-8172-3041-7c4b-ee545e7bcf4f.png)
**段落**ボタン押下時
ボタンやテキストを右寄せ、左寄せ、中央配置することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/840e4893-42c3-d4c8-9d25-6d4d412cbe1b.png)



### 入力フォームを挿入する場合
既存のフォームか新規のフォームを作成して挿入することが出来る。
**または既存のフォームを選択する**の場所には現在編集しているサイト（プロジェクト）以外のサイトで作成したフォームも表示されている。今回は、テンプレートを使用しているため既存のフォームがいくつか表示されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/60dee14d-dffd-516d-164f-65d99661aeda.png)

**[注意]**
フォームに関しては、赤枠の「アクセス許可」でロールにアクセス許可の設定行わないとデフォルトではプレビュー（実際にユーザーが操作する画面）に表示されないため必ずアクセス許可の設定を行っておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/2e75424e-a80e-f1c5-91d8-d3f52e2df003.png)

### データベースのデータを挿入する場合
コンポーネント選択画面の**リスト**を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/feff3127-88ea-44c0-0d02-08236b819973.png)

こちらも、入力フォームの時と同様に、現在編集しているサイト（プロジェクト）以外のサイトで作成したリストも表示されている。今回は、テンプレートを使用しているため既存のリストがいくつか表示されている。

[【Microsoft】PowerPagesでのDBの設定方法](https://qiita.com/ryoryo66/items/e3465a0d7caedec98847)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/c1d631be-cffe-8d99-f7e1-66afb27556e2.png)


# まとめ
以上、PowerPagesにおけるコンポーネントの挿入する方法や流れでした。
フォームやリストなどは、別画面で細かい設定方法などが必要なため初見ではやや扱いづらかったです。また、データ設定画面での設定方法も独特なUIをしており、一ヶ月使ってみただけでは完全に理解することは難しかったので、やはり[こちら](https://qiita.com/morieryo/private/a3a5e5b006f25d60f39d)の記事でも述べたように動的な少し複雑なサイト制作にはPowerPagesは向いてないのかもしれません。
InfluxDB v1.8: v2.0 互換の API の使い方

参考ページ
[/api/v2/query/ HTTP endpoint](https://docs.influxdata.com/influxdb/v1.8/tools/api/?t=Auth+Enabled#apiv2query-http-endpoint)

## サーバーのバージョンの確認

```bash:health.sh
URL="example.com:8086/health"
#
curl -XGET $URL | jq .
```

実行結果

```text
$ ./health.sh 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   107  100   107    0     0   1509      0 --:--:-- --:--:-- --:--:--  1528
{
  "checks": [],
  "message": "ready for queries and writes",
  "name": "influxdb",
  "status": "pass",
  "version": "1.8.10"
}
```

## データの書き込み

```bash:write.sh
URL="http://example.com:8086/api/v2/write?bucket=example&precision=s"
#
curl -i -XPOST $URL --data-raw 'Data,temperature=20.2 IDX=1'
sleep 1
#
curl -i -XPOST $URL --data-raw 'Data,temperature=21.2 IDX=1'
sleep 1
#
curl -i -XPOST $URL --data-raw 'Data,temperature=22.2 IDX=1'
sleep 1
#
curl -i -XPOST $URL --data-raw 'Data,temperature=23.2 IDX=1'
```

## データの読み取り

```bash:select.sh
URL='http://example.com:8086/api/v2/query'
#
curl -XPOST $URL  -sS  \
	-H 'Accept:application/csv' \
	-H 'Content-type:application/vnd.flux' \
	-d 'from(bucket:"example")
        |> range(start:-20m)
        |> filter(fn:(r) => r._measurement == "Data")'
```
MySQLWorkbenchにおいて、新規Connectionでパスワード設定しても接続できない時の対処法

##### 環境：MacOS Monterey

MySQLWorkbenchで新しいConnectionを作成する際に、UsernameとPasswordを共に"tester"にして接続しようとしたら、どうやら正しいパスワード入力してても接続できない模様だ。

<p align="center">
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630036/73d57876-ee21-fbbd-169f-c27780d55105.png" | width = 400>
</p>

そこで、Terminal開いて、Command Line上でも同じく接続できないかを試してみたら
```
% mysql -u tester -p
Enter password: 
ERROR 2061 (HY000): Authentication plugin 'sha256_password' reported error: Authentication requires SSL encryption
```
同じく失敗したようだ。

ここで、"root"ユーザに接続してスクリプトで以下のコマンドを実行してほしい:
```
 -- Drop user first if they exist
 DROP USER if exists 'tester'@'localhost' ;
 
 -- Now create user with proper privs
 CREATE USER 'tester'@'localhost' IDENTIFIED BY 'tester';
 GRANT ALL PRIVILEGES ON * . * TO 'tester'@'localhost';
 ALTER USER 'tester'@'localhost' IDENTIFIED WITH mysql_native_password BY 'tester';
```

試しに接続してみたら…
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630036/e39e1a4c-a2e7-cc5f-464b-f5f05ab8cb48.png" | width = 500>
</div>
奇跡的に入れた！!

また、root以外のユーザで実行する際、`CREATE DATABASE [DBname]`でエラー出ちゃう場合がある。それは恐らく、Mysqlがデータベースを格納するディレクトリの権限が足りないからかもしれない。
多くの場合作られたデータベースは/usr/local/mysql/dataに格納されているから
`chmod 777 /usr/local/mysql/data`
で読み取りと書き込みの権限を追加する。

もちろん手動で操作しても構わない。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630036/9cf40663-50ea-7d07-cbc9-e8b4da1ba933.png" | width=300>
Obbで0埋めファイルができてしまう時の備忘録

AndroidStudioにもあるjobb.exe

[JOBBツール](https://developer.android.com/studio/command-line/jobb?hl=ja)はAndroid SDKのインストールフォルダにあります。
<SDK-Root>\tools\bin\jobb.bat (Windowsの場合)

# これの問題ではまったので備忘録

Androidでobbをマウントしようとしたら処理が止まった

obbもあるし、ファイルもサイズがあるので、不審なところはないと思ったところ

obbの中身が全部0で埋まっている謎ファイルができていたのだった。


# 対応策

(a) obb生成後に先頭4バイトを見て0で埋まっていたらNGにする。
    なお、こういうファイルを生成していてもjobbは正常終了のコードを返してくる（ひどい）

(b) 適当なファイルを追加してサイズが変わるようにする。
SourceTreeでサブのアカウントからクローンができない時

# 今回の問題
メインとは別にサブのGithubのアカウントのssh接続をターミナルでテストも行い、いざSourceTreeでcloneしようとすると、接続先の公開鍵の権限が拒否されて、リモートリポジトリの読み取りのエラーが出ました。
![スクリーンショット 2022-12-07 17.10.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604036/09e84d2e-2e00-76b0-16db-06c32887e860.png)

# 原因
今回の原因はSourceTreeでは「**最初に接続したアカウントのSSHキーを、デフォルトで次に接続するアカウントも使用するようになってしまっている。**」ことにあります。なのでGitHubのアカウントに紐づいたSSHキーではないためエラーになっている状態です。
私がSourceTreeに最初に接続したアカウントはメインで使っていたアカウントなので、そのアカウントからサブのリポジトリにssh接続しようとしていたことが原因でした。

# 解決策

では、どのように複数のアカウントでcloneするのかですが、やるべきことが二つあります。

- **`/Users/ユーザー名/.ssh`の配下にあるconfigファイルに設定を追加**
- **リモート接続のパスの書き換え**

## /Users/ユーザー名/.sshの配下にあるconfigファイルに設定を追加
`/Users/ユーザー名/.ssh`配下にあるconfigファイルの接続したいアカウントに、「IdentitiesOnly yes」という記述を追加します。
```/Users/ユーザー名/.ssh/config
Host sample-GitHub-sub　 // Host名
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/sample-GitHub-sub
UseKeychain yes
AddKeysToAgent yes
IdentitiesOnly yes  // この記述を追加
```
これはGitHubのホストごとに、指定された秘密鍵のみを使用する設定になります。
## リモート接続のパスの書き換え
GitHubのリポジトリ画面に表示されるSSHのパスは、
`git@github.com:[GitHubユーザ名]/[リポジトリ名].git`このような形式になっています。
![スクリーンショット 2022-12-07 4.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604036/edb02a7a-400a-0917-5958-d6b41cc63c01.png)
しかしこれではローカルPCのHost名は「`sample-GitHub-sub`」になっているため、.sshのconfig設定の情報とは異なります。
なので`Host名:Githubユーザー名/リポジトリ名.git`の形式に変えてあげましょう。
今回だったら`sample-GitHub-sub:Githubユーザー名/sourcetree-test-sub.git`ですね。
この設定を行いようやくcloneすることができました。

# 最後に
独学中はSourceTreeの存在など知らなかったのですが、知った時は本当に感動しました。
記事の感想や意見、ご指摘等いただけると助かります。
最後までご覧いただき、ありがとうございました。
.NETでテンプレートを自分で作る


### 環境
.NET6
Rider 2022.2.3

```dotnet build```が終わっていて該当プロジェクトにエラーがないことが前提です。

### 本文
- テンプレート化したいプロジェクトと同じディレクトリにテンプレート作成用ディレクトリ作成（今回はTemplateという名前にしています）
- .template.comfigというディレクトリを作成しその中にtemplate.jsonを作成

```json:template.json
{
  "$schema": "http://json.schemastore.org/template",
  "author": "hoge",
  "classifications": ["Template", "server" ],
  "identity": "Qiita Project",
  "name": "Qiita project",
  "shortName": "qiita",
  "tags": {
    "language": "C#",
    "type": "project"
  }
}
```
こんな感じでテンプレートの定義を書いていきます。
その他オプション

https://github.com/dotnet/templating/wiki/Reference-for-template.json

- テンプレートにしたいプロジェクトをテンプレート作成ディレクトリにコピー

```
Solution
├───QiitaProject
└───Template
    └───.template.config
    └───QiitaProject ← コピーしてきた
```

build後の諸々はテンプレートにはいらないので以下のように削除しておく
```shell
rm -rf Template/QiitaProject/bin
rm -rf Template/QiitaProject/obj
```

- 以下のコマンドでテンプレートに追加
```shell
dotnet new --install Template
```

毎回書くのしんどいので自分はshellで一気に実行しています。
```shell
#!/bin/sh
mkdir Template/QiitaProject
cp -r QiitaProject Template
rm -rf Template/QiitaProject/bin/
rm -rf Template/QiitaProject/obj
dotnet new --install Template
# インストールできたか確認
dotnet new --list
```

以上

### その他

使用するときは```dotnet new {テンプレート名}```で作ったテンプレートをもとにプロジェクトを作れます。

```dotnet new --list``` でテンプレートの一覧を確認できます。

```
~ dotnet new --list
These templates matched your input: 

Template Name                                 Short Name           Language    Tags                                 
--------------------------------------------  -------------------  ----------  -------------------------------------          
Class Library                                 classlib             [C#],F#,VB  Common/Library                       
Console App                                   console              [C#],F#,VB  Common/Console                       
dotnet gitignore file                         gitignore                        Config                                                        
Qiita project                                qiita               [C#]        Template/server             
```

アンインストールするときは```--uninstall```で先程のTemplateディレクトリを指定してあげれば消せます。

```shell
dotnet new --uninstall Template
```

### 参考

https://learn.microsoft.com/ja-jp/dotnet/core/tutorials/cli-templates-create-item-template
Laravel9でIAMロール経由でのAWS CLI実行を試すときの対処

仕事の関係上、
AWS+EC2+S3+Laravel9という作業があり、
Laravel9上からS3を操作するのにハマったので備忘録として書いときます。
Qiita探してもstackoverflow検索してもうまいことでてこなかったので。

※公式の見解でも無く、勝手に調べたことなので参考になったら嬉しいですが、動かなくても一切責任はとりません。

# 結論(とりあえず)
* Laravel9 + EC2 + セキュリティ要件でAWS CLI経由でも多要素認証が入る場合、サービスロールにS3のアクセス権を割り当てる。
* Laravel9標準のFlysystem-aws-s3を使う場合、上の設定をした上で、.envの「AWS_ACCESS_KEY」と「AWS_SECRET_KEY」のエントリを行ごと(ここ重要)削除する。

# 経緯
* IAMユーザはコンソール入らないユーザでも多要素認証必須、という要件があり、少なくともIAMロールで逃がす必要があった。
* Laravel公式などでは、アクセスキーを使ったドキュメントくらいしかなく、ロール経由での説明がほとんど無かった。
* 以下サイトなどでENDPOINTは不要、などがあったが、ロールの場合のベストプラクティスは無かった。https://zenn.dev/nicopin/articles/e92eb4bc99cc4a

# はまりポイント
* Laravel8→Laravel9で内包するfly-systemがv1→v3になっており、ロジックなども変わったようである。
https://readouble.com/laravel/9.x/en/upgrade.html
* ただ、Flysystem-aws-s3の内部変更の詳細まではlaravel側に無く、 他の記事などを参考に、.envの設定値を何も付けないと、ログには何もでないがS3にはAPIが実行されない現象になっていた。
* laravel内部の挙動っぽいのでログにもうまく出せなかった。

# 調べたこと
* AWSアクセスキーを.envに設定する方法ではちゃんとS3への操作が通るので、基盤的な疎通の観点では問題が無いように見えた。

# 対処法
* IAM roleに必要なアクセス権を付ける。
* EC2インスタンスの設定で上記のIAMロールを割り当てる。
* Laravel9を動かす。
* Laravel9の.envファイルを以下のように編集する。

```
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=【任意のバケット名】
AWS_URL=【バケットURL】
AWS_USE_PATH_STYLE_ENDPOINT=false
```

下はうまく動きませんでした。
AWS credencialを優先してライブラリが見るらしく、認証が出来なくてこけるっぽい。
ログに出ないので苦労した。

```
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=【任意のバケット名】
AWS_URL=【バケットURL】
AWS_USE_PATH_STYLE_ENDPOINT=false
```



* あとは適当に動かす。


# 最後に
* アップグレードガイドはちゃんと読もうと思いました。
* フレームワーク内部のライブラリの仕様変更までいくと辛い。
* 多要素認証でCLIは他社がどうやってのセッションの維持をうまくやってるのか知りたい。
Workato：On-prem Agentでオンプレミスと接続する（概要）

# はじめに

Workatoは、クラウドで提供されるサービスですが、On-prem Agentを利用することで、オンプレミス等のプライベートネットワークとWorkatoをセキュアに接続し、Workatoからそれらの環境上のリソースやアプリケーションの操作が可能となります。

# On-prem Agentの仕組み

On-prem Agentは、プライベートネットワーク上にエージェントソフトウェアをインストールすることで、それらの環境の間でTLS WebSocketによるセキュアトンネルを確立します。

エージェントソフトウェアは、エージェントソフトウェアからインターネットへ直接接続可能（アウトバウンドポートが開いている）、あるいはWebプロキシ経由でインターネット接続可能な環境であれば、基本的にはファイアウォール等のネットワーク機器を設定変更することなく利用することが可能です。また、エージェントソフトウェアからWorkatoに対して接続を開始するため、エージェントプログラムのためにファイアウォール等でインバウンドポートを事前に開放する必要はありません。

エージェントソフトウェアからWorkatoに対して接続を開始するため、エージェントソフトウェアからインターネットへ直接接続可能（アウトバウンドポートが開いている）、あるいはWebプロキシ（フォワードプロキシ）経由でインターネットへ接続可能な環境であれば、ファイアウォールやネットワークアプライアンスの設定を行うことなく利用することが可能です。

※https://docs.workato.com/on-prem.html#on-prem-connectivity より引用

![on_prem_conceptual_model.be734508.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/308e2d90-4b2c-80ec-74db-645626d88c4f.png)

また、エージェントはHA構成にも対応しており、冗長化して運用することも可能です。

※https://docs.workato.com/on-prem.html#on-prem-connectivity より引用

![on_prem_group_conceptual_model.76d1d57f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0f889e53-c2f2-9aa6-7a84-3d1d44833794.png)

# On-prem Agentで実現できること（一例）

On-prem Agent を利用することで、次のことを実現することができます。

- プライベートネットワーク上のアプリケーション等に対するHTTPリクエスト（RESTやSOAP等のAPIリクエスト）
- プライベートネットワーク上のデータベースサーバへの接続
- On-prem Agentがインストールされたマシン（サーバ）上にあるファイル・フォルダの参照（当該環境にマウントされた共有フォルダを含む）
- On-prem Abentがインストールされたマシン（サーバ）上でのコマンド実行
- 自社のIPアドレス（自社DC,拠点等）を接続元とするインターネット上のアプリケーション等に対するHTTPリクエスト
- 自社のIPアドレス（自社DC,拠点等）を接続元とするインターネット上のデータベースサーバへの接続

On-prem Agentを利用することで、プライベートネットワーク上のアプリケーションとWorkatoのシームレスな連携が可能となります。

また、HTTPリクエストだけでなく、ファイルシステムの利用や、データベースサーバへの接続、コマンド実行にも対応していますので、これらを利用してレガシーシステム等のAPIを持たないシステムとの連携にも対応できます。

# システム要件
## OS
OSは次の通りです。
- Windows 7, 10 (64-bit)
- Windows Server2008以降
- Linux (64-bit)　
- macOS

## 最小ハードウェア要件
最小ハードウェア要件は次の通りです。
- メモリ： 8GB以上
- ストレージ：250MB以上
- CPU：800Mhz以上の64-bit CPU (Intel/AMD)


今回はOn-prem Agentの簡単な説明のみとなります。
On-prem Agentのインストール方法や利用方法について、次回以降に説明を行います。
OCI Container Instanceを試してみる

# はじめに
OCIの新しいサービスとしてContainer InstanceがGAになったので、早速試してみます。

https://docs.oracle.com/en-us/iaas/Content/container-instances/home.htm

# Instance のプロビジョニング
OCIコンソールから`開発者サービス` →　`コンテナ・インスタンス`を選択します。

![スクリーンショット 2022-12-07 11.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/b6d1e34f-5d55-bdfc-37d8-cd1cd35c1ac6.png)

`コンテナインスタンスの作成`をクリックします。

![スクリーンショット 2022-12-07 11.01.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/3d3d85e7-c8ad-c0b5-9830-5672a70099b2.png)

今回はこのように設定しました。`次`をクリックします。

![スクリーンショット 2022-12-07 11.03.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/4a2e2a46-3bbc-1c55-d1c3-139381eef158.png)

Build済みのコンテナイメージを指定します。
今回はパブリックのnginxを使用します。

`イメージの選択` →　`次`　をクリックします。

![スクリーンショット 2022-12-07 11.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/bbff49b9-9328-ad97-962e-b7d029fffbb8.png)

`作成`をクリックします。

![スクリーンショット 2022-12-07 11.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/8855cc2d-b669-1f3f-4fbb-4d90b7d8ea1b.png)

しばらく待つと、インスタンスとコンテナがプロビジョニングされます。

![スクリーンショット 2022-12-07 17.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/99bb8d81-f5eb-ef88-c374-e82c1c6d3d74.png)



# 動作確認

外部からコンテナ（nginx）にアクセスします。

```
curl http://132.145.xxx.xxx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```
PL-900：ビジネスルール

この投稿はMicrosoft PL-900の受験に向けた勉強資料をMS Learnページを参考にして作っています。
一発合格に向けて頑張りましょう！

[ビジネスルール][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/introduction-common-data-service/6-business-rules

# ビジネスルール
* Microsoft Dataverseでのビジネスルール定義
* アプリレイヤーではなくデータレイヤーで、ビジネスロジックを適用して管理することができる　→　どこでデータを操作するかに関係なく適用される
例）
    * キャンバスおよびModel-drivenアプリでテーブル内の１つまたは複数の列の値を設定またはクリア
    * 保存されているデータの検証、エラーメッセージ表示
    * 例の表示・非表示の切り替え
    * 例の有効・無効の切り替え
    * ビジネスインテリジェンスに基づいて推奨情報を作成

:::note info
ヒント
通常、ビジネスルールはテーブルに対して定義され、すべてのフォームに適用される
* 特定のModel-drivenのフォーム
    * ビジネスルールの定義可
* キャンバスアプリの特定のフォーム
    * ビジネスルールの適用不可
    * データとやり取りする時は強制的に適用可
:::

* キャンバスおよびModel-drivenアプリで使用するビジネスルールアクション
    * 列の値の設定
    * 列の値のクリア
    * データを検証
    * エラーメッセージを表示
* Model-drivenアプリで適用するビジネスルール
    * 列を表示・非表示状態にする
    * 列を有効・無効にする
    * ビジネスインテリジェンスに基づいてビジネスの推奨事項を作成する

* 以下はビジネスルールをシンプルだが強力に使用する例となる
    * 「CreditLimit」が1,000,000を超えるように設定されている場合、
        * 「CreditLimitVPApprover」フィールドを必須フィールドに変更するようにビジネスルールが設定される
        * クレジット制限が1,000,000未満の場合、このフィールドはオプションになる

<img src="https://learn.microsoft.com/en-us/training/modules/introduction-common-data-service/media/business-rule.png">

出典：[MS-Learn ビジネス ルール][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/introduction-common-data-service/6-business-rules

* アプリレベルではなく、データレベルでこのビジネスルールを適用することによってデータを制御しやすくなる。
上記によりPower AppsやPower Automateから直接アクセスしているか、またはAPI経由でアクセスしているかに関わらず、ビジネスロジックに従うようにすることができる　→　ルールはアプリではなくデータに紐づいていること
ゲーム制作における画像素材の大変さ

# はじめに
当たり前ですがゲームには画像素材が必須です！プレイヤーや背景画像、ほとんど気にすることのない小さなものまで様々です。そこで今回はゲーム制作を通しての画像素材に関する経験をお話していこうと思います。

## 1.フリー素材に頼りたい

楽に素材を用意するため、真っ先に思いつくのは「**フリー素材**」です。「描く手間を省ける」「思いつかないようなアイディアを得られる」などメリットだらけです。
しかしフリー素材にもデメリットがあります。それは、「**一貫性がなくなる**」ということです。フリー素材は量こそ多いですが、サイトによって絵柄はバラバラです。求める種類が多ければ一つのサイトに絞れなくなります。次のサイト、次のサイトと幅を広げていくにつれ画面がごちゃごちゃし、一貫性がなくなってしまうのです。

## 2.描くしかないけど難しい

フリー素材に頼れないとなったら残された道は一つ、**自分で描くしかない**のです！！... しかし絵が得意ならまだしも絵が苦手となると絶望的です。※お金があれば全てを解決できますが一旦忘れましょう
![スクリーンショット 2022-12-07 012534.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966635/57e7a907-6672-e011-b5b9-e7a03aa5298e.png)
なにせ絵は線画の時点で難易度が高いです。思いついた構図をミスなく描き写すのは至難の業です。おまけに膨大な数から適切な一色を選び、塗りきるなんて正気の沙汰ではありません。悩みに悩んだ結果、ある作戦を思いつきました。それは、ドット絵かつ配色をゲームボーイ風の4色に限定するというものです。
![スクリーンショット 2022-12-07 014024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966635/a68b7abd-e579-f6c1-96e5-1cbf77f7e89d.png)
その結果、従来の方法に比べかなり楽になりました。絵はドットなので違和感に気づきやすく直しやすい。配色は4色に限定することで色を選ぶ時間を大幅にカットできる。それだけでなく、「ドット・4色」を徹底することでフリー素材では得られなかった**一貫性**を実現できました。一石二鳥で作るのも簡単！いい事ばかりのようですが、現実はそんなに甘くありません。

## 3.デメリット

良い事があると悪い事があるもんです。デメリットを二つほど紹介します。

#### 1.色が被ると見えなくなる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966635/de3c59d3-1f8b-7ef7-2e30-5342b347c5c9.png" width="100%">
<br>
4色に限定したことにより、色が被り背景と同化するなんてことが何度もありました。「素材は完成してるのに背景と組み合わせたら見えなくなった」などです。

#### 2.細かい表現ができなくなる
![スクリーンショット 2022-12-07 015515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966635/fa698cec-19bd-6ee2-f4cb-b6e73b6762c3.png)
ドット感が欲しかったため荒いドットを使用していたのですが、ドットの荒さに比例して細かい表現が難しくなりました。タコに間違われるなんてことも笑笑

なんだかんだありましたが、これで素材作りは楽勝？... いいえ。本番はここからです。

## 4.バグといっしょ
素材を作っていると様々な問題に見舞われます。プログラミングにおける「バグ」のようなものです。どんなに完成度の高い素材であっても、ほかとの相性が悪ければ手直しが必要になります。実際どのようなミスがあるのでしょうか？

#### こんなのが多い
- ゲームに追加して気づくミス
- 周りと比較して大きさを変える
- ゲームの仕様変更で廃止
- アニメーションさせて気づく

ただでさえ描くのが大変な画像素材ですが、ミスに気付くたびに手直しが必要になります。気づけば一つの素材にかなりの時間を要し、**一日中素材作りをしていた**なんてことも。下の画像はそんな「描く→完成→ミスに気付く→手直し→完成」の流れを表したものです。

![スクリーンショット 2022-12-07 102121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966635/cfb98fca-9b7f-f293-e8c9-57ec39e07160.png)


このようなサイクルがゲーム完成まで延々と続きます。

## 5.地獄
素材一つにかかる労力を知ったうえで以前私が作ったゲームの素材数を見てみましょう。
![スクリーンショット 2022-12-07 104156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966635/5ffb82ef-a9f4-1815-4adc-226477d11a42.png)
137枚全てを使用しているわけではないのですが、それを踏まえた上でも130枚を超えます。これでも30分あればクリアできるボリュームです。ゲームの規模が大きくなったらいったい何枚になってしまうのでしょうか？何千？何万？考えたくもないです。

## まとめ
ゲーム制作に必須な「画像素材」の大変さを分かって頂けましたでしょうか？大変なゲーム制作ですが、それでも続けられるのは**楽しいから**です。自分の思い描くものを形にできる、やってもらった方に「楽しかった」といってもらえる。そんな経験は他には代えられないと思います。UnityやUnreal Engineに限らずPygameやScratchなどで簡単に始めることもできます。興味ありましたらやってみてはいかがでしょうか？？

この記事は IPFactory Advent Calendar 2022 の 7 日目の記事です。

https://qiita.com/advent-calendar/2022/ipfactory

昨日はK5h1n0くんでした！Atcoder入茶素晴らしすぎますね！羨ましいです。

https://qiita.com/K5h1n0/items/52230c4e551366015793
Sinatraを使うならshotgunは入れて変更自動反映できた方が幸せになりそう

## 概要
Sinatraを何度か使っているのですが当たり前のように変更して再起動して...を繰り返していたのですが、ある時これ変えられないのかな？と思って調査したのでその報告です。

【余談】
変更自動反映ってホットリロードではないしオートリロードという言葉もちょっと違う気もして...良いフレーズありますかね🤔


## 選択肢
変更自動反映の方法を調べると下記のような選択肢がありました
- Sinatra::Reloader
- shotgun


それぞれの動きの話と、なぜその上でshotgunが良いのかお話したいと思います

## Sinatra::Reloader

こちらは文字通りファイルを変更したら反映されるものになってます。

### 使い方
Gemfileに下記を追加
```
gem 'sinatra-contrib'
```

app.rbファイルに
```rb
require 'sinatra/reloader'
```
を追加する。

以上！！

これでapp.rbで変更を加えると再起動しなくてもリロードすると変更が反映されてます。
ただ、app.rbで外部のファイルをrequireで呼び出している場合、そちらのファイルを変更しても自動反映されません。

## shotgun

こちらも文字通りファイルを変更したら反映されるものになってます。

### 使い方
Gemfileに下記を追加
```
gem 'shotgun'
```

既存ファイルへの変更無し。

起動時に
`bundle exec ruby app.rb`
となっているところを、
`bundle exec shotgun app.rb`
というように起動する。
以上！！

これでapp.rbで変更を加えると再起動しなくてもリロードすると変更が反映されてます。
更に、app.rbで外部のファイルをrequireで呼び出している場合、そちらのファイルを変更しても自動反映されます！！！！

## なぜshotgun？？

上記で軽く記載したのですが、shotgunは読み込んでいるファイルを変更してもちゃんとそれが反映されるんですよね。
ほんとにこれがありがたい。
自分の場合クロールする処理を別ファイルでクラスとして用意してそれを呼び出す形にしているので、これがあるととてもありがたい...

## まとめ
ほんとに簡単なapp.rbにしかロジックを書かないのであればよいのですが、そうでない場合はshotgunを入れておいたほうが幸せなのではないでしょうか？
PG16:psql: Add command to use extended query protocol

# はじめに
にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 13日目の記事です。
今回はpsqlに追加されたメタコマンドについて書いてみます。

# 概要

|項目|内容|
|:--|:--|
|タイトル|[psql: Add command to use extended query protocol](https://commitfest.postgresql.org/40/3974/)|
|Topic|Clients|
|ステータス|commited|
|Last Modified|2022-11-15|
|概要|psqlユーティリティのメタコマンド``\bind``の追加|

# 変更内容
今回の改造は``psql``のメタコマンド``\g``に関連します。
が、この``\g``メタコマンド自体、使ったことがない人もいるかもしれないので、そこからまず説明します。

## \g コマンドって何？

``psql``ユーティリティには、いろいろなメタコマンド(psqlコマンドという言い方もする)があります。
``\g``コマンドは``psql``内で直前に実行したコマンドを再実行するというものです。

```sql
=# SELECT now();
              now
-------------------------------
 2022-12-07 16:23:46.909565+09
(1 row)

=# \g
              now
-------------------------------
 2022-12-07 16:23:49.628548+09
(1 row)

=#
```

似たような動作をするメタコマンドとして``\watch``というコマンドがあります。これは直前に実行したコマンドを繰り返し実行します。

```sql
=# \watch
Wed 07 Dec 2022 04:24:59 PM JST (every 2s)

             now
------------------------------
 2022-12-07 16:24:59.21176+09
(1 row)

Wed 07 Dec 2022 04:25:01 PM JST (every 2s)

              now
-------------------------------
 2022-12-07 16:25:01.211875+09
(1 row)

Wed 07 Dec 2022 04:25:03 PM JST (every 2s)

              now
-------------------------------
 2022-12-07 16:25:03.211945+09
(1 row)

^C
=#
```

ただ、これまで``\g``コマンドでは、引数を渡し、その引数に応じたコマンドを実行することはできませんでした。

## PostgreSQL 16での改善
PostgreSQL 16からは、``\g``メタコマンドに``\bind``というメタコマンドが追加され、引数を可変にして、直前のコマンドを実行できるようになりました。

最初に``\bind``メタコマンドを使って2つの引数を設定します。
そして、SQLコマンドに``$1``,``$2``といったバインド変数を書いて実行します。

```sql
# \bind 1 'ABC'
=# SELECT $1, now(), $2;
 ?column? |             now              | ?column?
----------+------------------------------+----------
 1        | 2022-12-07 16:55:20.27155+09 | ABC
(1 row)

=#
```

``$1``, ``$2``に``\bind``メタコマンドで指定したパラメータが設定されて実行されました。

この状態で同じように、``\bind``メタコマンドで新しい2つのパラメータを設定し、``\g``メタコマンドを実行します。
```sql
=# \bind 3 'XYZ'
=# \g
 ?column? |              now              | ?column?
----------+-------------------------------+----------
 3        | 2022-12-07 16:55:28.416598+09 | XYZ
(1 row)

=#
```
直前のパラメータ付きのSQL文が、新たに与えたパラメータで実行されました。

:::note warn
PostgreSQL 15では``\bind``メタコマンドが存在しないので``psql``エラーになります。
```sql
=# \bind 1 'ABC'
invalid command \bind
Try \? for help.
=#
```
:::


## 余談
このCommitfestのタイトルは、**psql: Add command to use extended query protocol** なんですが、拡張プロトコル云々の話ではなく、``\bind``メタコマンドの追加、という話になったようです。自分がきちんと議論を追えてない（というか追うのが面倒になった）ので、拡張プロトコルの話がどうなったのかは不明・・・。

# おわりに
今回は``psql``ユーティリティに追加された、メタコマンドについて書いてみました。
``psql``ユーティリティもバージョンアップ毎に地味に進化していますね。全機能を使いこなすのはなかなか難しいですが・・・。

----
さて、全部ぬこアドベントカレンダー、やっと折り返し地点に来ました。
しかし、この記事を書いている時点で、もうネタの弾切れ感があります。後半戦どうなるのか・・・。
【解決策】Pixel Buds A-Seriesを使用してline通話ができない場合

# 現象
lineをアプデしたところ、Pixel Buds A-Seriesを使用したline通話不可になりました。
取り急ぎ解決策を残します。
※アプデ前まではできてた。。。

# 解決策
「line」→「設定」→「通話」→「通話の詳細設定」→「オーディオモード」を
”コミュニケーションモード”(デフォ)から”通常モード”に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355686/1357d199-69dd-e511-538b-656add48cb18.png)

# ハードウェア環境
- Google Pixcel6
- Pixel Buds A-Series

# ソフトウェア環境
- AndroidOS：13
- line：12.20.2
PytestでMockを使う時の備忘録


# 環境構築
```
# Pythonのバージョンを確認
python --version
> Python 3.7.3

# pytestのインストール
> pip install pytest

# pytest-mockのインストール
> pip install pytest-mock
```

# ファイル構成
```
.
├── src
│   └── script.py
└── tests
    ├── __init__.py
    └── test_script.py
```

# テスト対象のコード
```python:script.py
import os

# Method being tested
def delete_file(file_path):
    try:
        if not os.path.isfile(file_path):
            return 'File does not exist'
        
        os.remove(file_path)

        return 'File deleted successfully'
    except:
        return 'An error has occurred'
```
# テストコード（`retrun_value`で戻り値を固定にする）
```python
from src.script import delete_file
import pytest

def test_file_not_exist(mocker):
    # os.path.isfile をモック化する(常にFalse)
    mocker.patch('os.path.isfile', return_value=False)

    # テスト対象を実行する
    message = delete_file('test_file_path')

    # 戻り値のメッセージを検証
    assert message == 'File does not exist'
```

# テストコード（`side_effect`で任意の処理に差し替える）
```python
from src.script import delete_file
import pytest

def test_file_not_exist(mocker):

    # os.path.isfile をモック化(isfile_mock_funcが呼ばれる)
    def isfile_mock_func(file_path):
        return False

    mocker.patch('os.path.isfile', side_effect=isfile_mock_func)

    # テスト対象の実行
    message = delete_file('test_file_path')

    # 戻り値のメッセージを検証
    assert message == 'File does not exist'
```
# テストコード（例外を強制的に送出する）
```python
from src.script import delete_file
import pytest

def test_file_not_exist(mocker):
    # 例外を送出するモック
    mocker.patch('os.path.isfile', side_effect=Exception)

    # テスト対象を実行する
    message = delete_file('test_file_path')

    # 戻り値のメッセージを検証
    assert message == 'File does not exist'
```
# テストコード（モック化した処理に対する操作内容を検証する）
mocker.patch でモック化したモックオブジェクトを使うと、処理が何回呼ばれたか、どのような引数で呼ばれたかなどを検証することもできる。
例えば引数の内容と呼び出し回数をテストしたい場合以下のように書ける。
```python
from src.script import delete_file
import pytest

def test_file_not_exist(mocker):
    # モック化
    isfile_mock = mocker.patch('os.path.isfile', return_value=True)
    remove_mock = mocker.patch('os.remove')

    # テスト対象の実行
    message = delete_file('test_file_path')

    # 戻り値のメッセージを検証
    assert message == 'File deleted successfully'

    # モック化した処理が1度だけ正しい引数で呼ばれたか検証
    isfile_mock.assert_called_once_with('test_file_path')
    remove_mock.assert_called_once_with('test_file_path')
```
利用者認証

# 問題１
### a~cにはいる言葉を選べ。

### シングルサインオンとは？
Single Sign-On: ```SSO```と略される。
```一度のサインオン（認証）で、複数のシステムを利用できる```ようにするための仕組み。
システムごと、サービスごとに個別で認証をしなければならない状況を改善した。
何度も何度も認証を行わなくても済むため、```利便性が向上```した。

#### 長所
認証情報を```管理するシステムを一元化```できる。これにより```管理性が向上```する。

#### 短所
```認証情報や認識システムのセキュリティの確保が通常のシステム以上に重要```になります。
セキュリティが不十分だと、```複数のシステムに不正アクセス```、```認証情報が漏洩```が起こる。

#### これを実現するための仕組み
標準化のための仕組みが整備されている。
企業などの利用を想定した
* 認証・認可のための```SAML(Security Assertion Markup Language)```
* 認証のための```OpenID```
* 認可のための```OAuth```
* SAMLは```OASIS```によって標準化されている。
* OpenIDとOAuthは```IETF```により標準化が行われている。

### デジタル署名
　本人の名前やメールアドレスと公開鍵をセットして```信用できる人がそれにデジタル署名(改ざん防止措置)を施したの```、```電子証明書```と呼びます。

#### 目的
何らかの手違いや悪意で```公開鍵は別人のものに差し替えられてしまう```と、それで暗号化したデータは受領者本人が複合できず、```別人が復号できる```ことになってしまう。

#### 効果
電子証明書を使うことで、```相手の正しい公開鍵を手に入れる```ことができます。

# 問題２
#### クラウドサービスとは？
従来は利用者が手元のコンピュータで利用していたデータやソフトウェアを、```ネットワーク経由で、サービスとして利用者に提供```するものです。
##### 出典
https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/service/13.html

### IdPとは？
IdPは```Identify Providerの略称```で、クラウドサービスなどにアクセスする```ユーザーの認証情報を保存・管理するサービス```のことを指します。
#### 出典
https://www.splashtop.co.jp/knowhow/28/

* IdP（Identity Provider）とは、```SAML認証での認証情報の提供者```のことです。IDP（Intruder Detection & Protection）など、他の用語との誤用を防ぐためか、「d」を小文字で表記するのが普通です。
最近のクラウドサービスでは、```SAML認証が使われる```ことが多くなっています。クラウドサービスの内部に個別に認証情報を持つこともできますが、ユーザーにとってサービス毎に別々のパスワードを設定し管理するのは煩雑です。そのため、SAMLのような共通の認証プロトコルを使うことが増えています。SAML認証をサポートするクラウドサービスでは、```利用者側でIdPを用意することで、様々なサービスの認証情報を一元管理```することができるようになります。IdPを```LDAPやActive Directoryなどの認証サーバと連携```することで、企業内で利用しているログインIDとパスワードを、クラウドサービスを利用する際にも使えるようになります。
#### 出典
https://www.designet.co.jp/faq/term/?id=SWRQ#:~:text=%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%B8%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88,%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

### 気づき
A社内のLANからの利用に限定されているため、そこで外部からの送信は失敗するのか。
### 感想
難しいなぁ。

# 出典
https://gihyo.jp/book/2022/978-4-297-12377-2
初心者でもわかるデバッガツールの原理

本記事は [Craft Egg Advent Calendar 2022](https://qiita.com/advent-calendar/2022/craftegg)の14日目の記事です。


## はじめに
株式会社Craft Eggでバックエンドエンジニアをしております高川です！

今回は、アプリケーションエンジニアが普段の業務で意識しない、いわゆるOSレベル・低レイヤに関することを書いていこうと思います。

「なぜプログラムが動くのか」という内容は調べればたくさん出てくるので、この記事では、**便利なデバッガツールがどのようにして動作中のプログラムを止めて、変数の値などを提示しているのか**について書きます。

全く知識がない人でも理解ができるように噛み砕いて説明していきたいと思うので、難しいから敬遠していたという方も読んでみていただけると嬉しいです。

※なお、本記事では、C言語で書かれコンパイルされた実行ファイルでの挙動をベースにして内容を書きますので、他の言語では異なる場合もあります(基本的な考え方は一緒です)が、ご了承ください。CPUによっても命令コードなどが変わりますので、その差分に関してもお手柔らかにお願いします。

## プログラムが動くってどういうこと？
冒頭で書かないと言いましたが、書かないとわからないと思うので、できるだけわかりやすく簡潔に書きます。

プログラムを動かす時の主役はバイナリ・メモリ・CPUの3つです。

- バイナリ
    - C言語など人が理解しやすいコードで書かれたものをビルドして、CPUが解釈できる状態になったファイル
        - ビルドでは、C言語がアセンブリ言語に変換され、アセンブリ言語がCPUが解釈できる機械語(0と1)に変換されます
    - 中身は0と1の羅列で、0と1の組み合わせで命令が表現されている
        - Windows10などで32ビット版や64ビット版がありますが、0と1の組み合わせを1セット32個で表現するか1セット64個で表現するかの違いです
- メモリ
    - よく作業台と比喩されます
    - バイナリのデータ(0と1の羅列)をメモリ上に広げて、CPUがそれを見れる状態にする
    - CPUが計算した結果をメモリ上に一時保存して後から参照できるようにする
    - バイナリのデータや計算結果を一時保存する位置が細かく管理されていて、その位置を**アドレス**と呼びます
- CPU
    - メモリ上に展開された0と1のデータを元に、命令を読み取って、それに従った演算を行う
    - 演算結果や処理状態を一時的に保持するためのレジスタがいくつも存在する
        - 次に実行する命令の位置(アドレス)を保存している「**プログラムカウンタレジスタ**」
        - 他にもありますが、基本的にはデータを一時的に保持するために扱われるので割愛

これらを踏まえると「プログラムが動く」＝「CPUがメモリ上に展開されたバイナリの命令を一つずつ実行していく」という風に言い換えることができます。

## デバッガツールが動作する原理
では、どのようにして、デバッガツールはプログラムを途中で止めたり、変数の状態を提示するのか説明します。

##### プログラムを止める
CPUがメモリ上に展開されたバイナリの命令を読んでいき、プログラムが徐々に実行されていきます。

プログラムの実行中にCPUが「**int3命令(0xCCCC)**」と呼ばれる命令を読み込んだとき、処理が一時的に停止します。これがいわゆるデバッガツールの**ブレイクポイント**です。OSの専門用語を使うなら「SIGTRAPの発生」です。

##### 変数の状態の提示
CPUの各種レジスタには、変数のアドレスや次に実行すべき命令のアドレス、算術結果、関数の戻りアドレスなどさまざまな値が格納されています。止まったタイミングのレジスタが保持している情報を使ってメモリを辿っていくことで、変数の値を取得することができ、デバッガツールではそれが目に見える形で表示されます。

##### プログラムを再度動かす
ブレイクポイントを仕込むということは、元々別の命令があったアドレスにint3命令を上書きするということです。そのまま上書きすると元々あった命令が消えてしまいます。また、int3を実行したことになるため、プログラムカウンタレジスタも次の命令を差してしまいます。

```例) 元々の命令.
命令A
命令B
命令C
```

```例) 上書き後の命令.
命令A
int3
命令C ←int3を読みこんで停止した時のプログラムカウンタレジスタは命令Cをみている
```

```例) 命令とレジスタを戻す.
命令A
命令B ←プログラムカウンタレジスタが命令Cを見るようにする
命令C
```

そのため、int3命令を上書きする前に元々の命令をメモリかレジスタにコピーして一時的に退避させたり、プログラムが一時的に停止した後にプログラムカウンタレジスタも元々の命令のアドレスを見るようにする必要があります。

##### 動きをまとめると
1. ブレイクポイントを設定したいアドレスからint3の命令サイズ分だけメモリかレジスタにコピーして退避させる
1. 対象のアドレスにint3を上書き
1. プログラムが実行され、CPUが命令を実行していく
1. int3を読み込み、処理が止まる
1. int3で上書きした部分の命令を元に戻す
1. int3で上書きした部分の命令を実行するために、プログラムカウンタレジスタの位置を命令サイズ分だけ戻す

「int3を設定→止まる→命令を戻す→プログラムカウンタレジスタも戻す→次の命令にint3を設定→止まる→...」という風に繰り返していくと、1命令ずつ実行する「ステップ実行」が実現できます。

コードベースで1行ずつステップ実行する場合は、行の始まりのアドレスをうまく取得して、int3をそのアドレスに設定すれば実現できるはずです。(すみません、ここはよく把握してないのですが多分あってるはず)

## まとめ
今回は、専門知識を持ってない人でも極力理解してもらえるように噛み砕きまくって書いてみました。
（本当は図も入れたり、具体的なコードなども載せられたらよかったのですが時間が…）

書くネタがなくて、学生時代の知識を掘り起こしてきましたが、低レイヤはやっぱり面白いですね。
1-3 始めてのコミットと、改行コードエラーの克服(warning: LF will be replaced by CRLF in)(スナガクのポートフォリオ作成日記)

1-3 始めてのコミット(スナガクのポートフォリオ作成日記)

python ポートフォリオ 初心者 Django Web 

こんにちは！
記事をご覧いただきありがとうございます。
スナガクと申します。
転職などのためにポートフォリオを制作させて頂いてます。
言語はPythonで、基本的な文法は、本などで学習した者です。
分からないことだらけで、悪戦苦闘中ですが、頑張ります！
同じ初心者の方の助けになれば、幸いです！

今日は、初めてのコミットを行いました。

.gitignoreなどで、環境変数など隠した後に、
Gitのコミットを行う、つもりだったのですが、

![Git エラー画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2963171/55b9749b-f4f3-938d-28d0-d1e00fa195a3.jpeg)

なぜか、Warningが大量に出てくる。
調べてみると、どうやら改行コードの修正が必要とのこと。
Google先生に助けを求めた所、下記のサイトを発見。
warning: LF will be replaced by CRLF inが出たときの対処法
https://penpen-dev.com/blog/warning-lf-willbe/
![Git 改行の設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2963171/52f410db-1f59-43d7-29c6-c677eb54d06a.jpeg)

これに従い、改行コードを変更した所、無事にエラーがなくなりました。
そのまま、コミットを行えました。

![Git コミット完了.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2963171/75b47992-2cda-371e-d709-5dbc11af3e40.jpeg)

次は、スクレイピングのpyファイルを作成し、
具体的な情報を習得していきます。

最後まで、ご覧頂き、ありがとうございました！
次回の記事も、よろしければご確認ください。

下記　作りたいポートフォリオの内容です！

制作するポートフォリオの内容は、
Djangoを使ったWebアプリケーションです！
Webアプリケーションの中身は、
It技術の最新情報・トレンドを確認できる、そんなサイトです。
時間がない、ご多忙なエンジニアの方でも、
意欲があれば、このサイトを見て勉強できる。
また、トレンドの情報を自ら投稿し、周りとも共有できる。
そんなサイトを作れば、周りの方に貢献できるかな？
と思っています！

具体的な方法は、
Webスクレイピング等を用いて、
最新技術や、気になるトピックを一目見て確認できる。
そんなサイトです！
また、機能は順次追加していければ、と思っています！

更新頻度は、1週間に1～2回になると思います！
（2022/11/12　現在）

見守って頂けると幸いです！
ご指導、ご鞭撻のほど、よろしくお願いいたします。
「ステップbyステップ」カスタムCSSでWordPressレイアウトを変更してみる！

「ステップbyステップ」紹介


1. WORDPRESSの/wp-adminにログイン後、「Dashboard」-> 「Appearance」-> 「Customize」をクリックする
![Screen Shot 2022-12-07 at 14.16.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031672/47d0f28e-b862-68c1-8997-c8a92ea056f2.png)

2. [Additional CSS]を選択

![Screen Shot 2022-12-07 at 14.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031672/3db9c965-21b2-9c06-fc4d-688f90ea947d.png)

3. EditorにCSSを追加、結果は右側の画面にすぐ反映し確認することができます。。。
![Screen Shot 2022-12-07 at 14.29.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031672/0736c0b1-73e3-b792-47c8-bf94434d62e4.png)


4. Publishボタン押下→追加・変更したCSSを反映します。
結果確認
![Screen Shot 2022-12-07 at 14.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031672/21d20053-9651-efc2-6b46-09c2641d3ce3.png)

実際結果を見てみる：https://eigo-bunpou.com/page/200/
連続確率分布　~ガウス分布~

# <font color = 'forestgreen'>1. はじめに</font>  
今回は、機械学習の分野において重要な役割を担う連続確率分布である「ガウス分布」に焦点を当てて話していきます。  
# <font color = 'forestgreen'>2. 一次元ガウス分布</font>    
<font color ='Royalblue'>ー次元ガウス分布</font>
：確率密度関数で表される$x&#x2208;\mathbb{R}$　を生成する確率分布であり、一次元ガウス分布の定義式は以下のようになります。
$$
N(x｜\mu,\sigma^2) = -\frac{1}{\sqrt{2\pi\sigma^2}}exp\Big\lbrace-\frac{(x-\mu)^2}{2\sigma^2} \Big\rbrace \\\\
[exp(a) = e^a, \mu&#x2208;\mathbb{R}:平均パラメータ, \sigma^2&#x2208;\mathbb{R}^+:分散パラメータ]
$$
#### [期待値]

$$
\mathbb{E}(x) = \mu
$$

#### [エントロピー]
$$
H[N(x｜\mu, \sigma^2)] = \frac{1}{2}(1+ln\sigma^2+ln2\pi)
$$


# <font color = 'forestgreen'>3. 多次元ガウス分布</font>    
<font color ='Royalblue'>多次元ガウス分布</font>
：一次元ガウス分布をより一般的な*D*次元に拡張したものです。　　
これはベクトル$x&#x2208;\mathbb{R}^D$を生成するための確率分布であり、定義式は以下のようになります。  
$$
N(x｜μ,&#x03A3;) = \frac{1}{\sqrt{(2\pi)^D|&#x03A3;|}}exp\Big\lbrace-\frac{1}{2}(x-\mu)^T&#x03A3;^{-1}(x-\mu) \Big\rbrace \\\\
[exp(a) = e^a, \mu&#x2208;\mathbb{R}^D:平均パラメータ, &#x03A3;:R×R共分散行列パラメータ,|&#x03A3;|:&#x03A3;の行列式を返す関数]
$$
#### [期待値]

$$
\mathbb{E}(x) = \mu \\\\
[\mu:&#x2208;\mathbb{R}^D]
$$

#### [エントロピー]
$$
H[N(x｜\mu, \sigma^2)] = \frac{1}{2}(ln|&#x03A3;|+D(ln2\pi+1))
$$
#### [注意点]
一般的に、*D*次元のガウス分布は、一次元のガウス分布を*D*個掛け合わせたものとは異なります。


# <font color = 'forestgreen'>4. まとめ</font>  
今回はエントロピーの導出をせず、結果だけ記入した形なので次で自分が初見で？となった導出部分などに触れながらエントロピーやKLダイバージェンスの導出に触れていきます。
### <font color = 'forestgreen'>5. 参考資料</font>  
◆ベイズの学習教材:[**機械学習スタートアップシリーズ ベイズ推論による機械学習入門**](https://bookclub.kodansha.co.jp/product?item=0000148222)
◆Markdownの参考資料: [**数学の景色**](https://mathlandscape.com/latex-bracket/)
Delphi / FireDAC　Microsoft SQL Server 2019 Expressで、画像の保存と取り出しのテストをしてみました。

# はじめに
## Delphi Advent Calendar 2022 12/05と12/07の記事のMicrosoft SQL Server 2019 Express版です。

### 1.　Ubuntu20.04 はローカルの機器にインストール

### 2.　Microsoft SQL Server 2019 Express に事前に　test_1　データベースを作成![00_ver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/eb943a26-4731-01d0-52d1-9e500f598e10.png)

### 3.　Microsoft SQL Server 2019 Expressでは、データ型は Image です

### 4.　Delphiで、uses JPEG, GIFImg, PNGImage ; //使用する画像を宣言
Delphi 10.2でテストしています。
![01_ide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/1fa53066-8949-7a78-9096-7c813cc94d4a.png)

***
#### 以下サンプルコード
### 画像データの追加のサンプルコード
```Delphi:FD_MSSQL2019_B_Unit.pas
procedure TForm1.SpeedButton6Click(Sender: TObject);
var
  SQLstmt:String;
begin
  with FDConnection1 do
  try
    SQLstmt :=' INSERT INTO '
             +' test_tbl ( ts_no  , tsblob ) '
             +'	VALUES ('
             +' :ts_no , :tsblob '
             + ')';
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text:= sqlstmt;
    FDQuery1.ParamByName('ts_no').AsInteger:=StrToInt( Edit_TS_NO.Text );
    FDQuery1.ParamByName('tsblob').LoadFromFile( Edit_Files.Text ,ftBlob);
    FDQuery1.ExecSQL();
    ShowMessage('登録しました');
  finally
    FDQuery1.Close;
  end;

end;
```

### 画像データの表示のサンプルコード
```Delphi:FD_MSSQL2019_B_Unit.pas
procedure TForm1.SpeedButton7Click(Sender: TObject);
var
  SQLstmt:String;
begin
  with FDConnection1 do
  try
    SQLstmt := 'SELECT * FROM test_tbl '
            +  'WHERE ts_no = :ts_no';
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text:= sqlstmt;
    FDQuery1.ParamByName('ts_no').AsInteger:=StrToInt(Edit_ts_no.Text);
    FDQuery1.Open();
    if not FDQuery1.Eof then
    begin
      Edit_ts_no.Text  :=IntToStr(FDQuery1.FieldByName('ts_no').AsInteger);
      Image1.Picture.Assign( TBLOBField(FDQuery1.FieldByName('tsblob') ) );
    end;
  finally
    FDQuery1.Close;
  end;
end;
```
### テーブルの作成のサンプルコード
```Delphi:FD_MSSQL2019_B_Unit.pas
procedure TForm1.SpeedButton2Click(Sender: TObject);
var
  sqlstmt:string;
begin
  sqlstmt:='CREATE TABLE TEST_TBL '+
  '('+
  'TS_NO      INTEGER  not null,'+
  'TS_NAME    VARChar(30) ,'+
  'TS_QTY     DECIMAL(14,2) Default 0 ,'+
  //'TS_BLOB    BLOB ,'+
  //'TS_BLOB    Binary ,'+
  //'TS_BLOB    VarBinary ,'+
  'TSBLOB     Image ,'+
  'TSBLOB1  VARBINARY(MAX)  '+　//こちらも使用できるようです
  'primary key(TS_NO)'+
  ')';
  if FDConnection1.Connected=true then
  begin
    try
      FDQuery1.SQL.Clear;
      FDQuery1.SQL.Add(sqlstmt);
      FDQuery1.ExecSQL();
      ShowMessage('CREATE TABLE');
    except
      on E: EFDDBEngineException do
      ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
    end;
  end
  else ShowMessage('Connected ERR');
end;
```

#### 今回使用した、　sqlncli11.dll　は　2014　のものですが、2019で、接続可能でした。
SQL Server 2022 Expressは、現時点で、手元にインストールできなかったので、2019でテストしました。

#### このソースのダウロードは、ここからできます
http://a23.sblo.jp/article/189974575.html
GraphQLを勉強する?しない?を悩んでいますか？

## 勘違いやすいこと

- ``GraphQL``が、`OracleDB`や`PosgreQL`などのRDBMSと勘違いやすいが、実は、Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つで、敢えて何かと比較したいであれば、RESTAPIと思います。
- `QL`の部分は、勘違い原因ですが、クエリ言語を指すこともできるからです。
  
## GraphQLを学習する価値があるか？

#### マクロの観点：
学習する内容は、時代に合わせてした方がいいという認識がありました。そして、時代に合わせたものほど、価値が高いという認識です。<br>
そこで、APIの管理方法も変化しつつであり今は、マイクロサービスや、サービスメッシュへ相性のいい言語やツールなどができました。GraphQLは、[前期の背景のなかで、新たにできたものと言われています](https://www.sbbit.jp/article/cont1/93872?page=1)。
#### ミクロの観点：
  2022年でGraphQLを携わったことがあったため、会社の財産として、今後営業してくれる方々が、GraphQLがまだ新しい技術であるうちに、「GraphQLでAPIを管理する実績」があるとアピールできる信じています。<br> 
Autodeskなどの企業のAPIは、RESTとGraphQL2通でAPI（のリクエスト・レスポンス）を管理することが多くなるだろう。<br>
[現状では、Autodesk Fusion 360がGraphQLを利用したと確認した。](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-1C665B4D-7BF7-4FDF-98B0-AA7EE12B5AC2)<br>[GraphQLを試してForgeを動かせるサンプルもありました。が、あくまでサンプルのようです。](https://aps.autodesk.com/ja/node/995)
<br>
#### 学習すれば、どのぐらいの価値がある？
上記の背景や、AutodeskAPIの動向などで、学習する価値が理解できると思いますが、実は学習しないと、損するのイメージが強いと感じます。

## そもそも、GraphQLは何？
ref: [GraphQL とは](https://www.redhat.com/ja/topics/api/what-is-graphql#GraphQL-%E3%81%A8%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9)

### 概要
- `GraphQL` は、API向けのクエリ言語とサーバーサイドランタイムの両方を指します。クライアントがリクエストしたデータだけを提供することを優先します。

- `GraphQL` は、API の速度、柔軟性、開発者にとっての使いやすさを向上させるために設計されました。GraphiQL と呼ばれる統合開発環境 (IDE) にデプロイすることもできます。`GraphQL` は REST の代わりに、データを複数のデータソースから取得するリクエストを 1 つの API 呼び出しで構成できます。

- さらに、`GraphQL` によって、既存のクエリに影響を与えずに、フィールドの追加または廃止を柔軟に保守できます。開発者は API をどんな方法で構築しても構いません。構築された API は `GraphQL` の仕様によって、クライアントに予測可能な方法で動作します。

#### Pros
- `GraphQL` スキーマは `GraphQL` アプリケーションに単一のソースを設定します。
- 組織には API 全体をフェデレーションする方法が提供されます。
- `GraphQL` 呼び出しは 1 回のラウンドトリップで処理されます。
- クライアントはリクエストしたものを取得し、余分なものは取得されません。
- データ型はしっかり定義されているので、クライアントとサーバー間の食い違いが減少します。
- `GraphQL` はイントロスペクションが可能で、クライアントは、利用できるデータ型のリストを- リクエストできます。これは自動生成文書に最適です。
- `GraphQL` では、既存のクエリを壊さずにアプリケーション API を進化させることができます。
- 多数のオープンソース `GraphQL` 拡張機能が利用可能で、REST API にはない機能を提供しています。
- `GraphQL` は特定のアプリケーション・アーキテクチャにとらわれません。
- 既存の REST API 上に導入して、既存の API 管理ツールと連携できます。

#### Cons
- REST API に慣れている開発者の場合、`GraphQL` を学習する期間が必要になります。
- `GraphQL` ではデータクエリ処理の多くがサーバーサイドに移行されるので、サーバー開発者の- 作業が複雑になります。
- 実装方法によっては、REST API とは異なる API 管理戦略が必要になります (特に、レート制- 限や価格設定を考慮する場合)。
- キャッシュが REST よりも複雑になります。
- API 保守担当者には、保守可能な `GraphQL` スキーマを作成する作業が付加されます。

## GraphQLを動かしてみたい方ためのサンプル

[ゼロからGraphQL (ゼロ知識からDBなし最小構成でサーバを動かしてみる)](https://qiita.com/Hiroyuki_OSAKI/items/e1fc16b973fa499c32e2)
Swift5 DragGesture ドラッグ開始時にタップしている地点に中心が移動してこないようにする

  ```swift
     @State var centerX: CGFloat = 100 //初期位置x
     @State var centerY: CGFloat = 100 //初期位置y
     @State var distanceFromCenter = CGPoint(x: 0, y: 0) //オブジェクトの中心とタッチ地点との距離

    var body: some View {
        Image(uiImage: image)
                .position(x: centerX, y: centerY)
                .gesture(DragGesture()
                    .onChanged { value in
                        if distanceFromCenter == CGPoint(x: 0, y: 0){
                            distanceFromCenter.x = value.startLocation.x - centerX
                            distanceFromCenter.y = value.startLocation.y - centerY
                        }else{
                            centerX = value.startLocation.x + value.translation.width - distanceFromCenter.x
                            centerY = value.startLocation.y + value.translation.height - distanceFromCenter.y
                        }
                    }
                    .onEnded{ _ in
                        distanceFromCenter = CGPoint(x: 0, y: 0)
                    })
```
VScode 後からタグで囲みたいときのショートカットmac


# [概要]
vscodeで下記のコードを後からタグとかで囲みたい時のショートカットです。
頻繁にあると思うので備忘録的に残しておきます
```
  <h1>toto</h1>
   <form id="form">
    <input type="text" id="input" placeholder="todoを入力" autocomplete="off">
   </form>
```


## やったこと
1.囲みたい範囲を選択
2.Shift + Command + P を押す
3.画像の検索バーが表示されたらラップ変換と入力し選択
![スクリーンショット 2022-12-07 15.57.35（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/b8556718-a58b-9680-1741-ef667a06da1c.png)

４.なんのタグで囲みたいかを入力(今回はdivで囲みたい)
![スクリーンショット 2022-12-07 16.03.54（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/6d706aae-2839-bcc4-e147-011200d7d3f1.png)



## 結果
divタグで囲むことができた
![スクリーンショット 2022-12-07 16.08.11（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/e15196ed-030f-baba-bb52-62345d11baf7.png)
HTMLを書き換える

# HTMLに書かれた要素をjavascriptで取得する
```特定のid属性持つ要素を取得```する
```html
.
.
.
<p class= content id="choice">ここに日時を表示します</p>
  <script>
    'use strict';
    console.log(document.getElementById('choice'));
  </script>
.
.
.
```
#### コンソール
```
<p class="content" id="choice">ここに日時を表示します</p>
```
```consoleオブジェクト```に対して```documentオブジェクト```のidがchoiceの要素を
表示するように命令している。

#### ```.getElementById```メソッド
（）内に```指定されたid名を持つ要素```を丸ごと取得します。

* このDocumentメソッドは、```プロパティが指定された文字列と一致する要素を表す```オブジェクトをgetElementById()返します。要素 ID を指定する場合は一意である必要があるため、特定の要素にすばやくアクセスするための便利な方法です。
##### 出典
https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById

# 取得した要素のコンテンツを書き換える
```html
<p class= content id="choice">ここに日時を表示します</p>
  
  <script>
    'use strict';
    document.getElementById('choice').textContent = new Date();
  </script>
```

#### documentオブジェクト
```Wed Dec 0１ 2022 12:31:39 GMT+0900 (日本標準時)```
と表示される。

#### 気づき
documentオブジェクトに対してidがchoiceの要素に対して文字列を取得させようとしているのか。
その要素のtextContentプロパティに対してnew Date()にするように命令しているのか。
多分new Date（）は今の時間を表示させるようにしているはず。

#### ```.textContent```メソッド
textContentプロパティは、特定のノードに対して、ノード内のテキストを文字列で取得します。

##### 出典
https://tcd-theme.com/2022/07/javascript-dom-textcontent.html#:~:text=textContent%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AF%E3%80%81%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%80%81%E3%83%8E%E3%83%BC%E3%83%89%E5%86%85%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

#### プロパティとは？
オブジェクトに記憶されているもののことを言う。メンバーともいう。
プロパティは```名前```と```値```からなっている。
プロパティの名前のことを```キー```とも言う。
値には任意のデータ型を使えます。
##### 出典
https://www.oreilly.co.jp/books/9784873117836/

p40

#### ```new```　演算子
```オブジェクトのインスタンス生成```をする
##### 出典
https://www.oreilly.co.jp/books/9784873117836/

p103

#### Date()
関数として呼び出されると、```現在の日付と時刻の文字列表現```を返します。すべての引数は無視されます。結果は、 を実行した場合と同じnew Date().toString()です。
##### 出典
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#:~:text=%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF-,Date(),-%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E5%91%BC

# 出典
https://www.sbcr.jp/product/4815601577/
markuplint を導入し~~ようとしてみ~~た

## markuplint とは

- https://markuplint.dev/

lint できる．
attr の必須チェックとかできる

## 課題

- レビューで足りないattr の指摘があって，無駄なやりとりが発生しているように感じた
    - レビュアーのチェックする工数
    - レビュイーの変更する工数

導入~~してみようと~~した．~~(まだ入ってないです~~

## ~~やってること~~ やった

- コマンドを動くようにする
    - 拡張している部分は通るように設定する
        - → これがイマイチよくわかってない
        - この行だけ無視するとかしたい……
- CI に組込む
- 既存のファイル (`.tsx` とか) に適応できるようにする
    - これはこれで大変．目処は付いてる

~~とはいえ，まだ終わってないので，できたら何か書くかも~~

ということで導入できた．
デザイナーの知見を借りれたのがありがたかった．
自分も少し知識が増えた．

まだ導入されてから，新規コードが少ないのだが，これからどういう価値が出たかを確認していきたい．
し，そもそも対応中に v3 が出てしまったので，移行を進めたい．