OmniAICreator/Qiita-1.07M huggingface dataset:
edge based template matching 

## 1.はじめに

ROS,OpenCV,Qtを使ってエッジベースのテンプレートマッチソフトウェアを作成しました

https://github.com/hoshianaaa/geometric_match_ros

カメラを使った、工業部品の位置認識などに使用できればなと考えています

このリポジトリの使い方を記載します

## 2.環境

```
Ubuntu 20.04 x86_64
ros noetic
```

## 3.install

```
cd ~/
git clone https://github.com/hoshianaaa/geometric_match_ros.git
cd geometric_match_ros
mkdir build 
cd build
cmake ..
make
```

## 4.実行

別ターミナルで

```
roscore
```

先程ビルドしたバイナリを実行します

```
cd ~/geometric_match_ros/build
./geometric_match_ros
```

実行すると以下のようなguiが表示されます.

![Screenshot from 2022-05-17 21-09-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/3eaf7f52-c20d-51f0-988a-828c6105215b.png)

ここにトピック名`/usb_cam/image_raw
(sensor_msgs/Image)`で画像を流し込みます.

```
cd ~/geometric_match_ros/script
python3 img_pub.py search2.jpg 
```

guiに画像が表示されたら, 認識したいテンプレートの設定を行います.

テンプレート画像の設定

1.`update image`をクリックし、現在のフレームを取得
2. bounding boxでテンプレートを囲む
3.`crop`ボタンクリック

![Screenshot from 2022-05-17 21-36-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/dfc07422-15ef-1af4-69c3-676559fa1a84.png)


テンプレートが切り取れたら,テンプレート画像の好きな位置をクリックし把持点を設定をします

![Screenshot from 2022-05-17 21-36-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/8a93bf27-de5e-1ef4-7f02-784f4fe6876b.png)

テンプレートの設定が終わったら,入力画像からテンプレートにマッチする位置を検出し,対応する把持位置が`/result [geometry_msgs/Pose2D]`のトピックで出力されます

![Screenshot from 2022-05-17 21-36-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/20e8cff6-5c33-0cab-f059-d9ef5dc3f95d.png)

# 最後に

今後、このソフトウェアを使用して部品を認識し、ロボットでピッキングできればなと考えています
UXでビジネスはどう変わる？

# はじめに
IT×ビジネスという視点で週1本記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# UXとは
UXとはUser Experience（ユーザーエクスペリエンス）の略で、日本語に訳すと __「顧客体験」__ です。UXはユーザーが __商品やサービスを通して得られる体験__ を指します。「わかりやすい操作性」や「アプリの読み込み速度が速い」といったシステムを操作するときに直接的に関係することだけでなく「おしゃれなデザイン」「窓口の対応」というような、正に __サービスを通して得られる体験全て__ を指します。

※UI(User Interface)とUXが同義で使用されることがありますが、UIはサービスや商品とユーザーの接点を表す言葉です。つまり、UIはUXを構成する要素のうちの1つと言えます。

# UXでビジネスはどう変わる？

### ■モノ消費からコト消費へ
市場が成熟化してきている昨今、所謂生活必需品と呼ばれるようなものはほとんどの家庭に既に行き渡っています。そんな中消費者の __モノに対する購買意欲は低下し、逆にコトに対する購買意欲は増加__ しています。
※ここでいうモノとは実際に商品のことを指し、コトとは商品やサービスを通して得られる体験を指します。

では、どういった"コト"が消費者から好まれるのでしょうか？
amazonを例に見てみましょう。amazonではレビュー欄で商品に対する感想を共有できたり、おすすめ商品として購入傾向から購入可能性がある商品が提示されたり、スムーズに購入までの手続きを行えたり消費者が商品を購入する上での欲求を満たせるUIになっています。

### ■iPhoneはUXの塊??
ガラケー世代の方はわかると思いますが、ケータイを購入すると何十ページもある説明書が付属されるのが一般的でした。しかし、スティーブ・ジョブズ氏はiPhoneにぺら1枚の説明書さえ付属しませんでした。そのためには初めて使う人でも直感的に操作できる必要があります。ではどのようにしてそれだけの操作性を担保したのでしょうか？
例えば、iPhoneのホーム画面は上下にめくることはできず、左右にしかめくれません。本のめくり方と同じ左右の動きのみにすることで操作性を向上させました。また、アプリのアイコンをタップするとそのアイコンが拡大するように起動することや、逆にアプリを閉じるときはアイコンが縮小するような動作をします。こうすることで操作に対しての反応性や、どのアプリを使用していたのかがわかりやすくなっています。
他にもiPhoneにはUXを高めるための工夫が多くあるので、興味のある方は調べてみてください。

# 終わりに
モノ消費からコト消費に変わってきていると記述しましたが、モノでの差別化が難しくなってきた昨今、ソフトではなくハードによりここまで成長してきた日本にとってはより厳しい時代になっていくと言われています。上等なUXを持つ商品やサービスの重要性はますます高くなっていくでしょう。

最後までお付き合いくださりありがとうございました。
二次漏洩ってどんなこと？

## 勉強前イメージ

セキュリティ系のことだとおもうけどいい例が思い浮かばない

## 調査

### 二次漏洩 とは

企業などによる情報漏洩についてで
情報が初めて社外に流出してしまう `一時漏洩` と
流出した内容がSNSなどで拡散されてしまうこと、または企業間とのやり取りで機密扱いの情報が取引先から流出してしまう `二次漏洩` があります。

一時漏洩については企業の管理下で情報セキュリティの対策である程度コントロールは出来ますが、
二次漏洩は取引先やインターネットの上での拡散なのでほとんどがコントロール範囲外でのことになります。

### 二次漏洩の対策

二次漏洩の防止については、以下のような対策があります。

- ドキュメントの暗号
- 閲覧のたびにサーバと通信を行いアクセス権限の確認を行う

まず暗号化することで平文では見えません。
また、開くたびにアクセス権限の確認をすることで万が一第三者にドキュメントが渡ってしまった場合でも権限がないため閲覧が不可能。
そのため二次漏洩の対策になります。

## 勉強後イメージ

結構セキュリティって今持ってる情報をどうやって守るか・出さないようにするかって感じだけど
相手に渡ってからもどうなるかわからないからそれもあるのか・・・・

## 参考

- [二次漏えい](https://www.nec-solutioninnovators.co.jp/ss/insider/security-words/08.html#:~:text=%E6%83%85%E5%A0%B1%E6%BC%8F%E3%81%88%E3%81%84%E3%81%AF%E3%80%81%E6%83%85%E5%A0%B1%E3%81%8C,%E6%BC%8F%E3%81%88%E3%81%84%E3%81%A8%E3%81%84%E3%81%86%E5%A0%B4%E5%90%88%E3%82%82%E3%81%82%E3%82%8B%E3%80%82)
- [二次漏洩](https://appswingby.com/security-glossary/secondary-leak/)
date関数の使い方 現在日時の表現方法

1 date関数の使い方調査
---
公式マニュアルで調べると、説明がstringとか$formatで記されていて、使い方が理解できなかった。自分の知識経験不足が原因であり、このように記述する必要があることはすぐに理解した。理解を深めていくため、まずいろいろ動かし結果がどのようになるかを試した。
[公式マニュアルdate関数](https://www.php.net/manual/ja/function.date.php)

2 date関数について
---
dateは日本語では日付だが、date関数は日付と時刻、更に曜日を表示できる。
現在日時と曜日も表現方法がいろいろ存在する。
今回はもっとも簡単な現在日時でまとめておく。

3-1 コード 年月日　曜日　時分秒のアルファベット記号
---

年月日　曜日　時分秒の順番で、年月日の間に'-'、時分秒の間に':'をつける場合のコードを代表例として記す。

~~~PHP: date1.php
<?php
$d1 = date('Y-m-d l H:i:s');  
$d2 = date('y-n-j D G:i:s'); 
$d3 = date('Y-F-d w h:i:sa'); 
$d4 = date('Y-M-d l g:i:sA');  
echo 'Y-m-d l H:i:s  '.$d1.'<br>'; //2022-05-15 Sunday 20:08:51
echo 'y-n-j D G:i:s  '.$d2.'<br>'; //22-5-15 Sun 20:08:51
echo 'Y-F-d w h:i:sa '.$d3.'<br>'; //2022-May-15 0 08:08:51pm
echo 'Y-M-d l g:i:sA '.$d4.'<br>'; //2022-May-15 Sunday 8:08:51PM
?>
~~~
アルファベットの記号にはそれぞれ意味がある。
年は
Y: 西暦4桁
y: 西暦2桁
月は
m: 必ず2桁
n: 1桁の月は1桁
F: フル英語表記
M: 英語表記3桁 
日は
d: 必ず2桁
j: 1桁の日は1桁
曜日は
l(Lの小文字): 英語表記フル
D: 英語表記3桁
w: 0~6。日曜を0、土曜を6
時は
H: 24時間必ず2桁
G: 24時間1桁の時刻は1桁
h: 12時間必ず2桁
g: 12時間1桁の時刻は1桁
a: 小文字でam,pm
A: 大文字でAM,PM
分は
i: 必ず2桁
秒は
s: 必ず2桁
他にも記号が使われているので、必要になったら公式マニュアルで確認したりWEBで調べることにする。

3-2 コード　現在日時の表現方法
---

年月日だけ、時分秒だけ、年月日をハイフン無やハイフンの代わりに'/'で表現することもdate関数で自由にできる。
~~~PHP:date2.php
<?php
$d1 = date('Y-m-d');  
$d2 = date('H:i:s'); 
$d3 = date('Ymd');  
$d4 = date('Y/m/d');  
echo 'Y-m-d  '.$d1.'<br>'; //2022-05-15
echo 'H:i:s  '.$d2.'<br>'; //21:18:47
echo 'Ymd    '.$d3.'<br>'; //20220515
echo 'Y/m/d  '.$d4.'<br>'; //2022/05/15
?>
~~~
他にも、月日年の順に表現することもできる。date関数は日時をいろいろな形で表現できることが分かった。
【インフラ女子に聞く】未経験からインフラエンジニアになるメリット・デメリット

## はじめに
こんにちは、日本リック エンジニア採用チームです。

今回は新卒で日本リックに入社して4年目の女性インフラエンジニアのYさんに記事をお願いしました。

Yさんの現在の仕事内容や、インフラエンジニアとして働く上でのメリット・デメリットなど、女性目線での働きやすさなどを語ってもらいました。

インフラエンジニアを目指している女性の方はもちろん、男性の方にも参考にしてもらえたら嬉しいです。



## 自己紹介（20代後半 女子）
初めまして、日本リックのYと申します。
新卒で入社し、今年で4年目になります。

現在は、NW運用業務を主に行っております。
IPやNW機器の管理、システム情報の管理などを中心に業務をしております。

学生時代は舞踊の大学で、ダンスを学んでいました。
技術向上はもちろん、創作活動や舞台運営についても積極的に活動していました。
現在も、仕事と並行してダンス活動を行っています。

## 私が思う女性がインフラエンジニアになるメリット
### 評価は男女平等な職場が多い
インフラエンジニアに限らず、IT業界の仕事は「知識・経験」が評価に繋がるところがメリットだと感じています。

得た知識、業務等で実際に経験したことをしっかりと生かすことができるので、評価もおのずとついてくるのではないかと思います。

「男性だから」「歳上だから」など表面上の評価ではなく、それぞれが持っている技術・知識が評価に繋がりやすい職種なのではないかなと思います。

### 仕事重視、ワークライフバランス重視など働き方を選びやすい
多種多様な働き方が増えてきている中で、比較的働き方を選べる環境が多いところもメリットではないかと思います。

私は、就活の際にワークライフバランスを重視した働き方ができることを条件の一つに挙げていました。
現在の現場は、仕事とプライベートの切り替えがしやすい環境だなと感じていますし、仕事を頑張りたい方はとことん頑張っている印象です。

また、テレワークもしやすい環境が整っている会社も多いので、働き方は選びやすいのではないのかなと思います。

## 私が思う女性がインフラエンジニアになるデメリット
### 夜勤が発生する可能性がある
作業内容によっては、日中帯で作業できないものについては夜間（システム利用時間外）で作業を実施することも多くあります。

私自身夜勤を経験したことはまだありませんが、他チームで夜勤での作業が予定されているのも度々見るので、頻度は多い印象です。
生活リズムが変わるので、家族との時間を合わせたりするのは少し大変になる面もあると思いますが、皆さん上手く調整しているようです。

### 職場は男性が多い
最近は女性のエンジニアの方も増えてきている印象ですが、まだまだ男性の活躍する職種という印象は強いと感じています。
実際に業務をしている現場でも、男性のほうが比率は多いです。

そういった中でも、女性のエンジニアさんが活躍しているので、デメリットにあげましたが、これから女性がどんどん活躍できる職種になっていく希望はとても大きいと感じます。

## これからインフラ女子を目指す方へ！
インフラに興味を持って、やってみたいと思えたその気持ちがとても素敵だなと思います。

目指している方の中には、まったくの未経験だけど頑張ってみたいと思っている方もいるはずです。

私自身、未経験からのスタートでした。
まずは、業種に興味を持つところからスタートして、少しずつ知識を増やしていけるように今も頑張っています。

知識やスキルが必要とされる業種なので、分からないことやできないことに焦りを感じることもありますが、とにかく焦らず、自分にできることから少しずつ挑戦していってほしいです。

応援しています。
JWTとは何か、そしてこの技術がどのようにドキュメントを保護するのか

暗号化、透かし、アクセス権の制限など、ファイルを積極的に保護する方法があります。しかし、ドキュメントのセキュリティはそれだけでは終わりません。JWTは、常にバックグラウンドで動作し、許可されたユーザーだけがファイルを編集できるようにする重要なアクセス保護エージェントです。

**JWTとは**
[JSON Web Token](https://jwt.io/introduction)（JWT、発音は/dʒɒt/）は、主に認証とデータ転送の2つの目的で使用される安全なオンライン情報交換のオープン標準です。
コンパクトなJSONオブジェクトには認証情報が含まれていて、ウェブアプリケーションに適用すると、サービスの正当なユーザーを確認する機能が提供されます。一言で言えば、情報の送り手が本人であることをアプリケーションが確認するのに役立ちます。
JWTは、ヘッダー、ペイロード、署名の3つの部分からなる、文字列形式の自己完結型のオブジェクトです。ヘッダーにはトークンに関する情報と署名の生成方法、ペイロードにはアクセスの許可を与えるために必要なユーザーに関する主張、そして署名はユーザーの妥当性を検証する。
トークンは、転送されたデータの出所を検証するのに役立つ秘密鍵で署名することができる。

**ONLYOFFICEのセキュリティトークン利用方法**
ONLYOFFICEでは、JWTは編集者とユーザー間のデータストリームを保護します。これは、Docsの編集セッションに入り、ドキュメントで特定のアクションを実行しようとするユーザーを確認するのに役立ちます。
ONLYOFFICE DocumentサーバとのHTTPリクエストごとに、トークンが生成され、パラメータに追加されます。
ここでは、ユーザーアクションごとに異なるJWTが生成されます。トークンはそれぞれ同じシークレットで署名されていますが、入力を認証するための情報は異なります。たとえば、エディターを開くとき、ファイルに画像を挿入するとき、文書のバージョン履歴を開くときなどには、別のトークンが作成されます。
例えば、www.example.com でホストされているファイルに PNG 画像を追加する場合、次のようなパラメータがトークンに含まれることになります。
```
{
    "fileType": "png",
    "url": "https://example.com/url-to-example-image.png"
}
```
そして、サンプルトークンはこのような形になります:
`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmaWxlVHlwZSI6InBuZyIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vdXJsLXRvLWV4YW1wbGUtaW1hZ2UucG5nIn0.FXuC3GUvPq3japwyzo4i-utUe3g1rfSDt1ytuK_VyCc`

JWTに署名するために、ONLYOFFICE Docsが統合されている各共有サービスでは、カスタムシークレットが使用されます。

**シークレットキーを取得する場所**
ONLYOFFICE Docsの以前のバージョンでは、デフォルトで含まれるJWTシークレットはありませんでした。ホストサービス（Nextcloudなど）の管理者が生成し、設定によってONLYOFFICE Document Serverへ手動で提出する必要がありました。
[バージョン7.1](https://www.onlyoffice.com/blog/ja/2022/05/onlyoffice-docs-v7-1-arm-pdf-xps-djvu-pdf-docx/)からは、ランダムなシークレットが自動生成され、ホストアプリケーション側で追加するだけでよくなりました。 

**JWTはどこで利用できる？**
JWTはONLYOFFICE公式の連携アプリのほぼ全てに対応しています：
·	Nextcloud
·	ownCloud
·	Alfresco
·	Moodle
·	Mattermost
·	Chamilo
·	HumHub
·	Confluence
·	Plone
·	Strapi
·	Liferay
·	Jira
·	Nuxeo
·	Redmine

[公式サイト](https://www.onlyoffice.com/ja/all-connectors.aspx)で利用可能なすべての統合を閲覧し、対応する[GitHub](https://github.com/ONLYOFFICE)ページでトークン設定ガイドを見つけることができます。
もし自分のアプリのためにONLYOFFICE統合アプリを作りたいなら、この[APIガイドライン](https://api.onlyoffice.com/editors/signature/)を使用してセキュリティトークンのサポートを追加することが可能です。

**お役立ちリンク**
統合アプリでJWTサポートを追加するため [APIガイドライン](https://api.onlyoffice.com/editors/signature/)をご覧ください。
利用可能な[統合リスト](https://www.onlyoffice.com/ja/all-connectors.aspx)をご覧ください。
ONLYOFFICEの[セキュリティ](https://www.onlyoffice.com/ja/security.aspx)について詳しくはこちら。
WebClientのすべての例外を無視してそのまま返す


<code>WebClient</code>素人です。

以前の```RestTemplate```では以下ですべての```HttpStatus```に対して例外をスローしなくなる。

```java
    RestTemplate client = builder.errorHandler(new ResponseErrorHandler() {
      @Override
      public boolean hasError(ClientHttpResponse response) throws IOException {
        return false;
      }

      @Override
      public void handleError(ClientHttpResponse response) throws IOException {
      }
    }).build();
```

これと同じ事を```WebClient```をしたい……が、パっと見では```RestTemplate```と同じやり方では出来ない、ように見えた。そこで https://gist.github.com/abhi2495/4607f2c827b2130ab6e08320f4ca5079 によると、```@ExceptionHandler```を使うやり方が紹介されている。


```gradle
	id 'org.springframework.boot' version '2.6.7'
```

以下は、status code, header, bodyをそのまま返している。

```java
  @ExceptionHandler(value = WebClientResponseException.class)
  public ResponseEntity<String> handleWebClientException(WebClientResponseException ex) {
    return ResponseEntity
        .status(ex.getStatusCode())
        .headers(ex.getHeaders())
        .body(ex.getResponseBodyAsString());
  }
```
美しい量子回路の描き方

IBM qiskit を使えば、量子回路を描くことができることはよく知られています。
しかし、ソースコードに縛られて自由な図を描けない、数式を含んだ図を描けない等の不都合があります。

そこで、美しい量子回路を描く作業を試行錯誤してみました。  
Web ページや PowerPoint スライドに綺麗に貼り付けることができる SVG 形式を作成することを目指しました。

## 使用するツール一覧
- LaTeX, dvipdfm, LaTeX の qcircuit パッケージ
  Debian 系列の Linux であれば、texlive-full パッケージをインストールするだけですべて揃います。
- [Inkscape](https://inkscape.org/)

## 回路を記述
[qcircuit](https://github.com/CQuIC/qcircuit/) という TeX パッケージを使って記述します。
サンプルとして、以下のような図だけの文書を作成しました。

```latex:sample.tex
\documentclass[12pt,border={25pt 5pt 5pt 5pt}]{standalone}

\usepackage[T1]{fontenc}
\usepackage[cmex10]{amsmath}
\usepackage{qcircuit}
\usepackage{braket}

\begin{document}

\Qcircuit @C=1em @R=.7em {
  \lstick{x_0} & \gate{H} & \gate{X} & \ctrl{1} & \gate{X} & \gate{H} & \qw & \meter \\
  \lstick{x_1} & \gate{H} & \gate{X} & \ctrl{1} & \gate{X} & \gate{H} & \qw & \meter \\
  \lstick{x_2} & \gate{H} & \gate{X} & \ctrl{1} & \gate{X} & \gate{H} & \qw & \meter \\
  \lstick{x_3} & \gate{H} & \gate{X} & \ctrl{1} & \gate{X} & \gate{H} & \qw & \meter \\
  \lstick{z}   & \qw      & \qw      & \targ    & \qw      & \qw      & \qw & \qw
}
\end{document}
```

## LaTeX で pdf ファイルを作成

説明するまでもありませんが、
TeX ファイルから pdf ファイルを生成することができます。

```
$ platex sample.tex
$ dvipdfm sample.dvi
```

## svg に変換

1. pdf を Inkscape にドラッグアンドドロップして開きます。
インポートダイアログで「Poppler/Cairo をインポート」を選択します。
![import.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603676/dc2a9638-2675-1efc-38bd-9bfb3773015d.jpeg)

1. インポート出来たら図を選択した状態で、ドキュメントのプロパティを開きます。
![inkscape.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603676/4b7c896e-f622-a68a-12f4-ed9c921819f6.jpeg)



1. ページサイズを描画全体または選択オブジェクトに合わせるボタンを押します。
![docproperty.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603676/236cd75d-da5e-0227-45d4-32fbc8a77198.jpeg)


1. そのまま、ファイルメニューから名前を付けて保存で、svg 形式で保存します。

1. 最後に svg をブラウザ等で開いて確認します。

## 完成

最終的にこのような SVG 画像が出来ます。
（ここに貼り付けている画像はPNGですが、実際には美しいSVG画像です。）
　
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603676/b541d02d-15ec-f47c-2130-7a52b7d6ccbc.png)


## （参考）NGだった方法

- PowerPoint を使う方法  
  Mac の PowerPoint を使えば、pdf を図として貼り付けることができます。PowerPoint だけで使うのならばこれで十分です。その図を今度は Windows の PowerPoint を使って svg 形式でエクスポートすることができます。しかし、図がビットマップ画像に変換されてしまうようです。

- Inkscape の pdf インポート画面で内部インポートを行う方法  
  フォントが Inkscape で置き換えられて、図が崩れてしまいました。dvipdfm を使ってフォントが埋め込まれた pdf を作成することができればよいかと考えましたが、やり方が分かりませんでした。
指数移動平均（実効湿度やロードアベレージの算法の名前）

# 実効湿度

気象では実効湿度 Effective Humidity というものがあります。火災予防のため、木材の実効的水分含有量を模するものだそうで、次のように計算されます。

$H_e(t) = \left(1-r \right) \left[ H(t) + r H(t-1) + r^2 H(t-2) + ... \right]$

ここで $H(t)$ は日付 $t$ の平均湿度、計数は通例 $r = 0.7$ が用いられます（出典：たとえば https://doi.org/10.2480/agrmet.25.123 ）。

この関数形は、過去の乾燥も次第に弱まる重みをつけて評価すべき、という発想によるのでしょうが、数値的利点もあります。

まず、次のように変形できて、過去の履歴を保存していなくても、前日の実効湿度と今日の平均湿度だけあれば計算できます。コンピュータでいうとメモリ・ストレージ・入出力帯域が大変節約できるアルゴリズムです。

$H_e(t) = (1-r)\left[ H(t) + r H_e(t-1) \right] $

もうひとつの長所として、立ち上げが早く障害にも強いのですよね。なんらかの事情で観測が中断したとき、復帰翌日には $H_e(t-1) \approx H(t-1)$ と近似してしまえば、次の日から実効湿度算出が復帰できます。これって2日前の未知の値を適当に推測したことになるわけですが、相対湿度の variability （テキトーな値で代替した誤差）がたとえば 30％ としたら、2日前に推測したことによる誤差は $a^2\cdot 30 ％ = 14％$ に留まり、数日のうちに実用的に問題ない誤差に縮小していきます。

# ロードアベレージも同じ算法

同じ算法がロードアベレージの計算にも使われています。これは特に、省メモリ・省エネというところで選ばれているのだと考えます。

Load Average はどうやって算出されているのか - TechScore Blog
https://www.techscore.com/blog/2017/12/08/how_is_load_average_calculated/ 

ロードアベレージは通例「1分、5分、15分間の平均」と説明されるのですが、それは係数を累乗していって $1/e$ になる期間、上の $r$ を使っていうと $-1/\log(r)$ であることがわかります。

同じ要領でいうと、実効湿度は $-1/\log(0.7) = 2.80367$ 日平均であるわけです。

# 指数移動平均というらしい

さてこの算法を一般に何と言うかわからないので長年不便に思っていたのですが、指数移動平均というようです。

下添、工学ですから省メモリは当然挙げてあるとともに、単なる移動平均とくらべて、遅延が小さい（例としてインディシャル応答の立ち上がりが早い）ことを評価しているように見えます。

https://www.ei.fukui-nct.ac.jp/tag/%E6%8C%87%E6%95%B0%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87/

# 引用文献

Masao KUSAKABE, Effective Humidity at Fukuoka, Journal of Agricultural Meteorology, 1969-1970, Volume 25, Issue 2, Pages 123-126, Released on J-STAGE February 25, 2010, Online ISSN 1881-0136, Print ISSN 0021-8588, , https://www.jstage.jst.go.jp/article/agrmet1943/25/2/25_2_123/_article/-char/en
【VS code】Mac辞書アプリをVS code内で1クリックで起動



## 目次
[I.  機能拡張「Mac Dictionary」](##-機能拡張「Mac-Dictionary」)
[II. BetterTouchTool（有償アプリ）](##-BetterTouchTool（有償アプリ）)

---

　Macでブラウザでちょっと分からない英単語があった時に、3本指で1クリックすると、内蔵の`辞書.app`が起動しすることができます。これはMac標準の機能設定で可能です。
　VS code内では`辞書.app`が起動しないようになっています。一から作るのは面倒かな...と思っていたところ、同じようなことを思いつく方はいらっしゃるようで、`Kohki Makimoto`様がVS code用のプラグインをご用意してくれていました。今回はこれを利用させていただき、3本指タップで`辞書.app`が起動するようにしてみました。

## 機能拡張「Mac Dictionary」
　まずは、VS codeで、機能拡張「Mac Dictionary」をインストールします。

![スクリーンショット 2022-05-17 20.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359421/b8fbe283-d50b-6588-67b4-424cebd85aac.png)

<b>`Mac Dictionary`</b>では、<b>_'ctrl + command + k'_</b>がMac内蔵の`辞書.app`の起動ショートカットになっています。
<b>_'ctrl + command + k'_</b>で、`辞書.app`が起動するか確認してみてください。

## BetterTouchTool（有償アプリ）
　Mac使いの人はインストール済みの方も多いと思われますが、今回のためだけに購入するのは微妙です。しかし、いろいろ使えますので、この際持っておいても良いかもしれません。

### BetterTouchToolのインストール
こちらからダウンロードしてください。
45日間はトライアル期間のようです。
- https://folivora.ai/

|![スクリーンショット 2022-05-17 20.11.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359421/e2900722-3ffa-74b7-6863-da06f1b40344.png)
|:-:|

### BetterTouchToolの設定

1. 「構成」を開く
2. 左下の「＋」ボタンから、「VS code」のアプリを選択する
　＞ すると、左側のカラムにアプリのアイコンが並ぶ
3. 「グループとトップレベルのトリガー」にある「＋」アイコンをクリック
4. 「3本指のジェスチャー」から、「3本指でタップ」を選ぶ
5. 「選択したトリガーに最初の操作を割り当てる」で、「アクション設定」>「キーボードショートカットを送信する」を選ぶ
6. ショートカットに <b>_'ctrl + command + k'_</b>を設定する

|![スクリーンショット 2022-05-17 20.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359421/f2c18a35-7872-e50a-8af3-aa3b5f1b09d8.png)
|:-:|

---

# まとめ

以上、出来るだろうけど、めんどくさかったことをやってみたので、記事にしてみました。

|![スクリーンショット 2022-05-17 20.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359421/443a3a71-1433-b1f9-16b0-91fe536a4668.png)
|:-:|

_上図は辞書.appを開いたところ_
テスト64

```vb

Public d1 As Date
Public d2 As Date

Private Sub CommandButton1_Click()

Unload Me

End Sub

Private Sub CommandButton2_Click()


If ComboBox1.Value = "" Then

    MsgBox "値を選択してください"
    Exit Sub

End If

MsgBox ComboBox1.Value

End Sub

Private Sub UserForm_Initialize()
'-------
'Font：メイリオ　文字サイズ：12...φ(･ω･´*)メモメモ♪　

d1 = Date
d2 = DateAdd("m", -1, d1)

With ComboBox1
    '直接入力禁止
    .Style = fmStyleDropDownList
    .AddItem Format(d1, "YYYY年MM月")
    .AddItem Format(d2, "YYYY年MM月")
        
 End With

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'×ボタンで閉じられないようにする
If CloseMode = vbFormControlMenu Then

    Cancel = True
    
End If
    
End Sub
TwitterのOAuth2.0認可をSocialiteで実装しようとしたら401が返ってきた

## {"code":32,"message":"Could not authenticate you."}

Twitter の OAuth2.0 を用いた認可を Laravel の Socialite で実装しようとしたところ、出てきたエラーメッセージです。あなたが誰だか分からないって言われてますね。つまり、 Client ID などはちゃんと渡っているのにそれが符合しないというエラーだと思われます。
直感ではありましたが、これは OAuth1.0a で認可しようとしていて出ているエラーなのではと思いました。
じゃあ、ちゃんと OAuth2.0 を使うように指定しなければならないけれど、その方法が [Laravel 公式](https://laravel.com/docs/9.x/socialite)をみてもいまいち分からない。
なので、ソースコードを読みに行きました。具体的には[この辺](https://github.com/laravel/socialite/blob/5.x/src/SocialiteManager.php#L125)。

```php:SocialiteManager.php
protected function createTwitterDriver()
{
    $config = $this->config->get('services.twitter');

    if (($config['oauth'] ?? null) === 2) {
        return $this->createTwitterOAuth2Driver();
    }

    return new TwitterProvider(
        $this->container->make('request'), new TwitterServer($this->formatConfig($config))
    );
}
```

fmfm、 config に `services.twitter` ってあって、その中に `oauth` って項目があってそれが `2` のときに `createTwitterOAuth2Driver()` という関数が呼び出されると。
じゃあ、こうすればいいんだな。

## `config/services.php` に以下を追記

```php:config/services.php
'twitter' => [
        'client_id' => env('TWITTER_CLIENT_ID'),
        'client_secret' => env('TWITTER_CLIENT_SECRET'),
        'redirect' => env('TWITTER_CALLBACK_URI'),
        'oauth' => 2,
]
```

ポイントはもちろん `'oauth' => 2` です。
これで無事 OAuth2.0 で認可ができるようになりました。

ちなみに権限設定は
https://github.com/laravel/socialite/blob/5.x/src/Two/TwitterProvider.php#L15
と
https://developer.twitter.com/en/docs/authentication/oauth-2-0/authorization-code
の Scopes を付き合わせれば多分大丈夫。
Capybara で select2 項目を選択する

[select2](https://select2.org/) のテストについて
Capybara で、ある項目を選択したい時のメモ

普通の select と同じようにやると上手くいかない

```ruby
select([option 名], from: [label 名])
=>
Capybara::ElementNotFound:
  Unable to find select box [label 名] that is not disabled and Unable to find input box with datalist completion [label 名] that is not disabled
```

タグ構造が変わっているから :thinking: ？

[同じように質問している人がいる](https://stackoverflow.com/questions/41257506/how-to-use-capybara-to-select-a-select2-drop-down-field)
へー、[Gem](https://github.com/Hirurg103/capybara_select2) もあるのか（割と最近も更新されている）

手軽にやるなら、とりあえず愚直にやれば OK（他にも方法あるみたいだけど）

```ruby
find("option[value=[対象の option 値]]").select_option
```
Watson Assistant Tips - Web Chatのロケール

# ロケール？それって必要なの？

「別にWeb Chatのロケールなんて意識した事ないし、ちゃんと日本語が表示されるので困ったことないんだけど？」という方が多いと思います。
実際その通りなんですが、チャットボットを作り込んでいくと、ふと、意図しない箇所に英語文字列が表示されることがあります。
Watson Assistantでは、ユーザからのレスポンスを選択肢の中から選んでもらうように構成することが可能です。その際、その選択肢が5個以上になると、選択肢がボタン形式からドロップダウンリスト形式に自動変換されます。チャットの小さな画面では表示スペースを節約する意味で非常に有効な機能ですが、ドロップダウンリストの説明文が、デフォルトでは英文になってしまいます。
![local-en.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/b2033583-4648-6f6f-73ec-cda58843c545.png)

# え！日本語にできるんですか？

「日本語表記に変える方法はWebChat設定画面にないけど、日本語表記に変えられるの？」
はい、可能です。
Web Chatのロケールは日本語に対応しています。また、日本語だけではなく、[34種類](https://web-chat.global.assistant.watson.cloud.ibm.com/docs.html?to=api-instance-methods#languages)のロケールに対応しています。

# 日本語表記にするには

WebChatスニペットの一部を変更することで日本語表記にすることが可能です。
オリジナルスニペットの
```
onLoad: function(instance) { instance.render(); }
```
を
```javascript
onLoad: async (instance) => {
  await instance.updateLocale('ja');
  instance.render();
}
```
に変更するだけです。

:::note info
日本語以外に変更したい場合は、
'ja'のところを[変更](https://web-chat.global.assistant.watson.cloud.ibm.com/docs.html?to=api-instance-methods#languages)してください。
:::

:::note info
この辺りの事情をもっと詳しく知りたい方は、
オンラインマニュアルの[こっち](https://web-chat.global.assistant.watson.cloud.ibm.com/docs.html?to=api-instance-methods#updatelocale)を参照してください。
:::


### オリジナルのスニペット
```html
<script>
  window.watsonAssistantChatOptions = {
      integrationID: "xxx", // The ID of this integration.
      region: "xxx", // The region your integration is hosted in.
      serviceInstanceID: "xxx", // The ID of your service instance.
      onLoad: function(instance) { instance.render(); }
    };
  setTimeout(function(){
    const t=document.createElement('script');
    t.src="https://web-chat.global.assistant.watson.appdomain.cloud/versions/" + (window.watsonAssistantChatOptions.clientVersion || 'latest') + "/WatsonAssistantChatEntry.js"
    document.head.appendChild(t);
  });
</script>
```

### 日本語表記に変えるためのスニペット
```html
<script>
  window.watsonAssistantChatOptions = {
      integrationID: "xxx", // The ID of this integration.
      region: "xxx", // The region your integration is hosted in.
      serviceInstanceID: "xxx", // The ID of your service instance.
      onLoad: async (instance) => {
         await instance.updateLocale('ja');
         instance.render();
      }
    };
  setTimeout(function(){
    const t=document.createElement('script');
    t.src="https://web-chat.global.assistant.watson.appdomain.cloud/versions/" + (window.watsonAssistantChatOptions.clientVersion || 'latest') + "/WatsonAssistantChatEntry.js"
    document.head.appendChild(t);
  });
</script>
```
このように、日本語表記になりました！
![local-ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/731ca897-12c0-81b9-59af-fbf164ebe804.png)

# いかがでしたでしょうか
また、Watson Assistantがちょっぴり好きになりました :blush:
AWS CodeBuild Laravel 9 をビルドしたいので、dockerイメージを作る

# AWS CodeBuild Laravel 9 をビルドしたいので、dockerイメージを作る

## 動機
AWS CodeBuildで使える公式イメージでは、Laravel 9が求めるPHPのバージョンに合うものがない

Laravel 9では、8.0.2以上が必要なので、自力でdockerイメージを用意した。

## Dockerfile
```./Laravel9CodeBuildDockerImage/Dockerfile
# ベースイメージは、AmazonLinux2
FROM amazonlinux:2

# remiがepelを求めるのでインストール
RUN amazon-linux-extras install epel

# remiリポジトリをインストール
RUN yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm

# nodejsのインストール作業に必要なコマンドをインストール
RUN yum install -y curl sudo

# nodejsのセットアップファイルをダウンロードして実行（nodejsのリポジトリを追加）
RUN curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -

# nodejsをインストール
RUN yum install -y --enablerepo=nodesource nodejs

# インストール済みのPHPを全て削除
RUN yum remove php*

# PHP80と拡張モジュールをインストール
RUN yum install -y --enablerepo=epel,remi,remi-php80 php80 php80-php-mbstring php80-php-mysqlnd php80-php-gd php80-php-xml php80-php-fpm php80-php-pecl-zip

# php80にパスを通す
RUN alternatives --install /usr/bin/php php /usr/bin/php80 1

# composerをインストール
# https://getcomposer.org/download/を確認して適宜変更する
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

# composerにパスを通す
RUN echo "export PATH=~/.config/composer/vendor/bin:$PATH" >> ~/.bash_profile
```

## あとはECRにプッシュして、CodeBildから利用すれば良い
単体テスト用に ActionView::Helpers::FormBuilder オブジェクトを生成する

# 方法

```rb
class DummyFormBuilder < ActionView::Helpers::FormBuilder
  # 引数に Active Record を渡す前提。
  def initialize(model_object)
    object_name = model_object.model_name.param_key
    template = ActionView::Base.empty
    options = {}

    super(object_name, model_object, template, options)
  end
end
```
```rb
# user #=> #<User id: 1, ..., updated_at: "2022-01-01 00:00:00.000000000 +0900">
# user.model_name.param_key #=> "user"
let!(:f) { DummyFormBuilder.new(user) }
```

# バージョン情報

- Ruby 2.7.6
- Rails 6.1.6

# 参考

## Rails

- https://github.com/rails/rails/blob/53410537594be0c0a528cff53dce433dd386cb6a/actionview/lib/action_view/base.rb#L216-L218
  - ActionView::Base オブジェクトを生成するには ActionView::Base.empty が一番手っ取り早そうだと分かった。
- https://github.com/rails/rails/blob/53410537594be0c0a528cff53dce433dd386cb6a/actionview/lib/action_view/helpers/form_helper.rb#L1668-L1686
  - ActionView::Helpers::FormBuilder#initialize の実装を確認した。
- https://github.com/rails/rails/blob/147557dc16a5bd8bab96f999f359a570232e1873/actionview/lib/action_view/helpers/form_helper.rb#L745
  - ActionView::Helpers::FormHelper#form_for や ActionView::Helpers::FormHelper#form_with では `object_name` を ActiveModel::Name#param_key で生成していることを確認した。
AWSで難しいことを考えずにSSMでBastionサーバを作成 

# 概要
セッションマネージャでAWS接続サーバを作る。
細かいことは気にしてないので、適宜環境に合わせてください。

# 手順

1. ポリシーの追加とロールの作成
2. セキュリティグループの作成
3. キーペアを作成する
4. EC2の作成
5. SessionManagerを確認
6. 接続

※ VPCとかsubnetは割愛

# ポリシーの追加とロールの作成

## 概要

****AmazonEC2RoleforSSM****のポリシーがアタッチされているロールを作成する。
また、EC2に接続する際にキーペアが不要になるようなポリシーを追加する。

## 方法

個別ポリシーの作成から以下のjsonを貼り付ける。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": [
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ssm:*:*:document/AWS-StartSSHSession"
            ],
            "Condition": {
                "BoolIfExists": {
                    "ssm:SessionDocumentAccessCheck": "true"
                }
            }
        }
    ]
}
```

IAMのロールからロールの作成する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668866/d47b7560-cfce-2b25-affe-bef11d9ef31d.png)


EC2 Role for AWS Systems Managerを選択。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668866/84329b7f-2122-e02f-e2ad-1e8f137f0332.png)


**先ほど作成したポリシーを追加**して、あとは適宜にすすめる。

# セキュリティグループの作成

## 概要

22番ポートが空いていないセキュリティグループを作成する。
inbound(外から発の通信)をすべて許可しないようにする。
outbound(中から発の通信)はすべて許可する。

## 方法

VPCのセキュリティグループから作成。


# EC2の作成

## 概要

先に作成したIAMとセキュリティーグループをアタッチしたEC2を作成する。

## 方法

EC2の作成を選択してAmazonLinuxとする。
特にOSの指定がない場合は、AmazonLinuxとするほうが色々入っててやりやすい。


セキュリティグループの設定から先に作成したセキュリティーグループを選択する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668866/b2605562-96cb-d903-4249-28c3712daadd.png)


キーペアを選択する。
特に必要としないのだが、何故か選択に迫られる。
なので適当なキーを選択。
ただ、キーペアの変更はインスタンスの作り直しになるので自身のキーを作って選択しておいたほうが安全。![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668866/7da408bd-3206-12c7-a61a-bc624a84ee5b.png)


高度な詳細のIAMインスタンスプロフィールから先に作成したIAMロールを選択する。

インスタンスを起動する。

# SessionManagerを確認

AWS Sysmtes Managerのセッションマネージャからセッション開始を選択して、インスタンスが登録されていることを確認する。

![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5a1edcd6-5fbd-4e5f-9e7b-c5130993dd5e/Untitled.png)

# 接続

## 概要

sshの設定をしてsshコマンド接続する

## 方法

sshの設定が必要なので以下を~/.ssh/configに追記する

```bash
# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

ssh config イメージ

![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e82bc7bd-0c9e-447c-861a-305c4c9851d3/Untitled.png)

接続する。

```bash
$ aws ssm start-session --target [インスタンスID] --profile [AWSに接続するプロファイル名]
```
なぜ微分するとシグマが消える場合があるのか

# はじめに
基本的にタイトル通り。分かっている人にとっては簡単なことだと思うが、過去の自分みたいに分からない人の助けになれば幸いである。
**以下、厳密じゃない表現もあるかと思うが、ご容赦いただきたい。** 間違っていることがあったらコメントで教えてください。

# 結論（というか内容）
$f(x) = x^2$のとき、$\frac{d}{dx_i}\sum^n_{j=1}f(x_j)$は以下のようになる。
$$\frac{d}{dx_i}\sum^n_{j=1}x_j^2 = \frac{d}{dx_i}(x_1^2 + x_2^2 + ...+ x_i^2 +...+ x_n^2)$$
ここで、$\sum^n_{j=1}x_j^2$を$x_i$で微分すると、$x_i$が含まれる項以外はすべて定数なので0になる（例えば、$j=3$のときは$x_1^2$、$x_2^2$、$x_4^2$、$x_5^2$、$...$はすべて定数なので0になる）。
$$\therefore \frac{d}{dx_i}\sum^n_{j=1}x_j^2 =0 + 0 + ... + \frac{d}{dx_i}x_i^2 + ... + 0 = \frac{dx_i^2}{dx_i} = 2x_i$$

以上
情報セキュリティと情報セキュリティ管理

## 情報セキュリティ
<b>目的は、「情報の機密性・完全性・可用性を維持すること」(情報セキュリティの3要素)
情報セキュリティマネジメントの国際規格である<font color = blue>ISO/IEC27000シリーズ</font>において、定義されている。

![88767a5c22c767460cfd4225476d62eb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/eab3be9a-258d-05b3-871f-7d117c79c3bb.png)
<b>これに加え、<font color = blue>真正性・信頼性・責任追求性・否認防止</font>が求められる。
![4855_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/0097be33-22a6-788c-3ccc-7bf94abb53b1.gif)

## 情報資産と脅威・脆弱性
<b>資産として価値のある情報のことを<font color = blue>情報資産</font>という。
情報資産に対して攻撃や危害を加えて、業務遂行に好ましくない影響を与える原因となるものが<font color = blue>脅威</font>という。
脅威は、情報資産や管理策に内在している弱点である、<font color = blue>脆弱性</font>を突いてくる。
## リスクマネジメント
<b><font color = blue>リスク</font>とは、組織の情報資産の脆弱性を突く脅威によって、組織が損失を被る可能性のこと。
リスクを組織的に管理していくことを<font color = blue>リスクマネジメント</font>という。
### リスクアセスメント
<b>情報資産に対するリスクを分析・評価して、リスク受容基準に照らして対応が必要か判断していくこと。
①<font color = blue>リスク特定</font> - 保護対象において、組織に存在するリスクを洗い出す
②<font color = blue>リスク分析</font> - リスクの大きさ(<font color = blue>リスクレベル</font>)を算定する。資産価値・脅威・脆弱性の大きさによって決まる。
③<font color = blue>リスク評価</font> - 対策が必要か判断する。大きさによって優先順位をつける。
### リスク対応
<b>実際にどのような対応をするのかを決定するのが<font color = blue>リスク対応</font>。
リスク対応は、リスクの発生確率や大きさを小さくする方法(<font color = blue>リスクコントロール</font>)と、損失を補塡するために金銭的な手当てをする方法(<font color = blue>リスクファイナンシング</font>)
・<font color = blue>リスクコントロール</font>
-<font color = blue>リスク軽減</font> - 損失額、発生確率を低く抑える。
-<font color = blue>リスク回避</font> - リスクの原因を除去
-<font color = blue>リスク移転</font> - リスクを第三者へ移転・転嫁(共有)する

<b>・<font color = blue>リスクファイナンシング</font>
-<font color = blue>リスク保有</font> - 影響度が小さいのは、許容する。
-<font color = blue>リスク移転</font> - リスクを第三者へ移転・転嫁(共有)する

### ビズネスインパクト分析
<b>災害などの予期せぬ事態によって、特定の業務が停止・中断した場合に、事業全体に与える影響度を分析・評価すること。
## 情報セキュリティポリシ
<b><font color = blue>情報セキュリティポリシ</font>とは、組織内の情報セキュリティを確保するための方針や体制、対策等を包括的に定めた文書のこと。

![16-01_clip_image002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/2a93a7f3-1d11-6470-fc3b-929ee7d95651.png)
### 情報セキュリティ基本方針
<b><font color = blue>情報セキュリティ基本方針</font>は、組織のトップが、情報セキュリティに対する考え方や取り組む姿勢を組織内外に宣言するもの。 
これを策定する上で参考にできるのが、経済産業省が策定した<font color = blue>情報セキュリティ管理基準</font>がある。
また、情報セキュリティー基本方針の他に、<font color = blue>プライバシポリシ</font>を定めることもある。

### CSIRT
<b>企業や官公庁などに設けるセキュリティ対策チームのこと。
## ISMS適合評価制度
<b>組織における情報セキュリティに対する取り組みに対して、ISMS認定基準の評価事項に適合していることを特定の第三者が審査して認定する制度のこと。
<font color = blue>ISMS</font>とは情報セキュリティマネジメントシステムと訳す。
また、ISMS適合評価制度の認定を受けた組織は、改善と活動を継続するPCDAサイクルを実施していく。
国内では、<font color = blue>JIS Q 27000</font>シリーズがISMSの規格となっている。
## セキュリティバイデザイン
<b>システムの企画・設計段階から、セキュリティ対策を組み込んでおく考え方。
上流工程から個人情報保護の仕組みを組み込んでおく考え方を<font color = blue>プライバシーバイデザイン</font>という。
STM32G031でシリアルにバイナリを受信してサーボ信号を出力(9600bps)


x 確認済み　2022/5/17 19:40 約40分くらいかかった　遅いな


目的
Arduino UNO等のソフトシリアル9600bpsをアナログサーボ信号に変換する


仕様

1 9600bps RX
2 VDD
3 GND
4 リセットオンリー

8 9600bps TX
7 
6 デバッグ出力　9600bpsソフトウェアシリアル
5 アナログサーボ信号(PWM)





元ねた




https://qiita.com/caa45040/items/66bae6f9c9459c0d5be5



https://qiita.com/caa45040/items/8c9b4ccbd59bd8f82d70



https://qiita.com/caa45040/items/c6ab29b730141ad8a139




いろいろ
アイス食わないと集中力が続かない2022/5/17 19:00





プログラム



```c++



//SER_to_PWM_031_1

#include <Arduino.h>

#define DD PA11    // potentiometer connected to analog pin x


//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)


#define DW   digitalWrite
#define TX1        PA12   // 6pin
#define UART_DELAY 106  // 002-110 9600bps ok 031

//仮想シリアルへの一文字出力 9600bps
void pc_putc(char ch)
{
  DW(TX1, HIGH);

  DW(TX1, LOW);//START
  delayMicroseconds(UART_DELAY); //START BIT WAIT

  for (int ii = 0; ii < 8; ii++) {
    DW(TX1, (ch >> ii) & 1  );
    delayMicroseconds(UART_DELAY); //DATA 1-8BIT WAIT
  }//for

  DW(TX1, HIGH);//Stop
  delayMicroseconds(UART_DELAY); //StOP BIT WAIT

}//pc_putc


//文字列の表示
int pc_printf(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    pc_putc(*str1 ++);

  } //while

  //戻り値
  return (0);
}//pc_printf


int u_key;      // 受信データを格納するchar型の変数
int ch_in_key() {

  // 受信データがあった時だけ、処理を行う
  while (!Serial.available()) {}      // 受信データがあるか？
  u_key = Serial.read();            // 1文字だけ読み込む

  return (u_key);
}


//初期化
void setup() {

  delay(3000); //not Delete

  Serial.begin(9600);

  //PWMの初期化
  pinMode(DD, OUTPUT);   // sets the LED pin as output
  analogWriteFrequency(50);
  analogWriteResolution(16);

  //TXポートの初期化
  pinMode(TX1, OUTPUT);
  DW(TX1, HIGH);

  pc_printf("<ST>\r\n");

} //setup


//メインループ
void loop()
{

  //シリアルの受信
  int ii = (char)ch_in_key();

  //表示 debug
  //int ii = 200; //debug
  char out_buff[8];
  out_buff[3] = 0;
  out_buff[2] = '0' + (  ii - (DIV10(ii) * 10)  );  // '0'+(b%10)
  ii = DIV10(ii);
  out_buff[1] = '0' + (  ii - (DIV10(ii) * 10)  );  // '0'+(b%10)
  out_buff[0] = '0' +  DIV10(ii);                  // '0'+(s/10)

  //送信処理
  //send 8 byte
  pc_printf(out_buff);
  pc_printf("\r\n");

    analogWrite(DD, 1310 + (26 * ii) );   // analogRead values go from 0
                                          // to 4095, pwmWrite values
                                          // from 0 to 65535, so scale roughly

  //0.1秒の待ち
  //delay(100);    //debug

} //loop



```
visual studioでのクロスプラットフォーム開発の設定

Visual Studioとubuntuを使ってクロスプラットフォーム開発を行っていたときのメモ
pthreadを使ってコードを書いていたらコンパイルできなかった。

手動でコンパイルするときは-pthreadオプションをつけるためそこの問題の模様。
解決方法は簡単だった。

# 環境
Windows10
Visual Studio2019 or 2022
C言語

リモートアクセス先:ubuntu20.04

# プロパティから設定
ソリューションエクスプローラから現在のプロジェクトを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668438/880b8d8e-45de-6d12-a533-8d5868d22505.png)
プロパティを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668438/6b217961-c881-a2d4-d463-e937b50472eb.png)
構成プロパティ＞リンカー＞コマンドラインを開く
追加のオプションに"-pthread"を追加して適用するだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668438/c35e6a72-5750-b0a8-3073-96a7b02e8235.png)


# ちなみに……
初めて記事を書きました。
書き方がわからん……
CloudFront Behavior の後方一致パスパターンにおける挙動確認

# はじめに

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesPathPattern

CloudFront の Behavior でパスパターン文字のワイルドカードとして以下が使える。


- `*` は、0 個以上の文字に一致します。
- `?` は、正確に 1 個の文字に一致します。

一般的な利用では、先頭固定でパスを取る (例: `/static/` 以下に静的リソースを配置する。 `/docs/` 以下に記事コンテンツを配置する) と思うが、アプリケーションの作り上、途中に特定パスが入るようなケース (例: 途中にディレクトリ `css` を含む全てのパスを対象にしたい時など) を CloudFront のパスパターンとして利用可能かを調査した。

# 実験内容と結果

## Behavior の登録は可能か？

1. パスパターンとして `/*/css/*` を CloudFront の Behavior に登録する (1)
1. パスパターンとして `/*/*/css/*` を CloudFront の Behavior に登録する (2)

**結果: 共に登録可能** 。 独自の挙動を設定できる。

## どの Behavior にマッチするか？

CloudFront の Behavior の設定は以下の通りとする。
`/*/css/*` は `/*/*/css/*` を含むルールなので、優先度はこのような順として設定している。

| No. | 優先度 | パスパターン | 
|----|-------|-------------|
| 1 | 0 | `/*/*/css/*` |
| 2 | 1 | `/*/css/*` |
| 3 | 2 | `*` (デフォルト) |

準備したファイル構造は以下の通り。 この時、アクセスによってどのようなパターンにマッチするかを確認する。

```bash:準備したファイル構造
$ tree
.
├── css
│   ├── dir3
│   │   └── ok.txt
│   └── ok.txt
├── dir1
│   ├── css
│   │   ├── dir3
│   │   │   └── ok.txt
│   │   └── ok.txt
│   ├── dir2
│   │   ├── css
│   │   │   ├── dir3
│   │   │   │   └── ok.txt
│   │   │   └── ok.txt
│   │   ├── dir3
│   │   │   ├── css
│   │   │   │   └── ok.txt
│   │   │   └── ok.txt
│   │   └── ok.txt
│   └── ok.txt
└── ok.txt

```

検証結果は以下の通り。

| URI | 一致した Behavior No. |
|-----|-----------------------|
| `/ok.txt` | 3 (Default)   |
| `/css/ok.txt` | 3 (Default)   |
| `/css/dir3/ok.txt` | 3 (Default)   |
| `/dir1/ok.txt` | 3 (Default)   |
| `/dir1/css/ok.txt` | 2 ( `/*/css/*` )   |
| `/dir1/css/dir3/ok.txt` | 2 ( `/*/css/*` )   |
| `/dir1/dir2/ok.txt` | 3 (Default)  |
| `/dir1/dir2/dir3/ok.txt` |  3 (Default)  |
| `/dir1/dir2/css/ok.txt` |  1 ( `/*/*/css/*` )  |
| `/dir1/dir2/css/dir3/ok.txt` | 1 ( `/*/*/css/*` )   |
| `/dir1/dir2/dir3/css/ok.txt` | 1 ( `/*/*/css/*` )   |


最初に提示したワイルドカードルールに従った Behavior が選ばれていることが分かる（複数にマッチする場合は、最初にマッチした優先度のもの)。

ほとんど直感的な動作になっているが `/` による層を期待しているような場合（例えば表の最後のケース）にだけ直感的な動きになっていない点に注意。
`*` が単に0文字以上の文字、なので、区切りとして想定されている `/` を含むため、このような挙動になっている。
ECSのコンテナ内作業で環境を分かりやすくするメモ

# 概要
- ECSのコンテナ内で作業する時にstg/prodをわかりやすくしたいので、プロンプトの色と表示を変更する
    - motdだとログイン時のみの表示、イメージの変更が（多分）必要で手間なのでやらない


# 手順
`タスク定義の新しいリビジョンの作成` で環境変数 `PS1` を設定するだけ。

ECS > タスク定義 > コンテナの編集 > 環境変数に以下を追加。

| Key | Value/ValueFrom | Value |
|:-----------|:-----------:|-------------:|
| PS1 | Value | \[\e[104m\]\u@\h staging\e[0m \[\e[33m\]\w\[\e[0m\] $  |

サービスの更新 > 新しいデプロイの強制をオンにして更新。

`aws ecs run-task` `aws ecs execute-command` などで起動コンテナに入ると以下の画像のような表示になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514463/aca0b1aa-86c9-2126-59ed-9c01c538fb4f.png)


## メモ
- DockerfileのENVでPS1をセットするやり方もある


# 参考
- ANSI color codes
    - https://gist.github.com/Prakasaka/219fe5695beeb4d6311583e79933a009
Cloud functions で POST した際に、req.body のデータ が undefined になる場合

備忘録。

## Cloud Functions に POST したい場合

Cloud Function 側
```javascript
exports.test = (req, res) => {

  const cors_domain = ["http://your-domain.com", "http://your-domain2.com"]
  const origin = req.headers.origin
  if (cors_domain.indexOf(origin) >= 0) {
    res.set('Access-Control-Allow-Origin', origin)
  }
  res.set('Access-Control-Allow-Credentials', true)

  const test_params = req.body.params1

  res.status(200).send({params: test_params})
```

これに、フロントから fetch すると、

```javascript
const your_data = {params1: "hoge"}

fetch("your-cloud-functions-path.com/",
  { method: "POST",
    body: JSON.stringify(your_data)}
)
.then((response) => {
  return response.json()
})
.then((result) => {
  console.log(result)
})
```

```
{params: undefined}
```

と undefined が、返ってくる。

## 結論

fetch 側 の header に `'Content-Type': 'application/json; charset=utf-8'` を追加し、cloud functions 側 の res に headers の Content-Type を許可するようにする。

Cloud Functions

```javascript
// cors などを設定している部分に、下のプログラムを入れる。
res.set('Access-Control-Allow-Headers', 'Content-Type')
```

fetch 側

```javascript
// headers を追加する
const headers = {
  'Accept': 'application/json',
  'Content-Type': 'application/json; charset=utf-8'
}

const your_data = {params1: "hoge"}
fetch("your-cloud-functions-path.com/",
  { method: "POST",
    headers,
    body: your_data}
)
```

これで、POST で データ渡し ができるようになります。
Next.js: 簡単な多言語化

簡単な多言語化の方法です。
次のようなページを作成します。

http://localhost:3000/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/75f6ccd6-927a-f298-e4f7-dd66a407a3b3.png)

http://localhost:3000/en
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/25cf236d-2357-7050-44b7-675d3a7f5959.png)

## プロジェクトの作成 ##

```bash
npx create-next-app@latest proj01
```

サーバーの起動の確認

```bash
cd proj01
yarn dev
```

## ページの改造 ##

```js:next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  i18n: {
	locales: ['en', 'ja'],
	defaultLocale: 'ja',
	},
}

module.exports = nextConfig
```

```js:pages/index.js
import { useRouter } from "next/router";
import en from "../locales/en";
import ja from "../locales/ja";

export default function Home() {
   const { locale } = useRouter()

   const t = locale === "en" ? en : ja;

   return (
      <div>
         ...
         <p>{t.GREETING}</p>
         <h2>{t.SUBTITLE}</h2>
         <button>{t.TO_DASHBOARD}</button>
         <p>{t.DATE}</p>
      </div>
   )
}
```

ロケールの作成

```js:locales/ja.js
export default {
  SUBTITLE: "「満足」を可視化しよう",
  TO_DASHBOARD: "ダッシュボードへ",
  DATE: "2022年5月17日 午後5時30分",
  GREETING: "下野市（しもつけし）は、栃木県南部に位置する人口約6万人の市。宇都宮市への通勤率は13.3%、小山市への通勤率は11.1%（いずれも平成22年国勢調査）。関東大都市圏に属する。",
  // ...
}
```

```js:locales/en.js
// en.js
export default {
  SUBTITLE: "Visualize your customer happiness.",
  TO_DASHBOARD: "Go to dashboard",
  DATE: "May/17/2022 PM 17:30",
  GREETING: "Shimotsuke (下野市, Shimotsuke-shi) is a city located in Tochigi Prefecture, Japan. As of 1 August 2020, the city had an estimated population of 60,274 in 24,654 households, and a population density of 810 persons per km². The total area of the city is 74.59 square kilometres (28.80 sq mi).",
  // ...
}
```

## サーバーの起動 ##

```bash
yarn dev
```

日本語のページ
http://localhost:3000/

英語のページ
http://localhost:3000/en

## vercel にデプロイ ##
GitLab 経由で、vercel にデプロイした様子です。
日本語のページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/523f9bb5-1fd4-c199-e6f7-5719a0edf857.png)

英語のページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4ad9469a-e0bb-e46b-e2eb-43a99846bf59.png)
Today I Leaned - ServiceNow 開発で今日ググったあれこれ（Link）

本当は開発で見知ったことをリライトするほうがいいのだろうけれど、状況ごとにソリューションを探して、みつけたTips的なことのリンクを置いておきます。どこかの状況でお使いください。
Scheduled job よりもメールでリスト作成ジョブの時はFlow Designer

How to do scheduled job to run twice in a month?
https://community.servicenow.com/community?id=community_question&sys_id=d28e5884dbd397002be0a851ca9619ba

how to query multiple state in gliderecord query
https://community.servicenow.com/community?id=community_question&sys_id=23cf7b7ddb858dd0fd63250913961923


multiple ticket in one mail
https://servicenow.org.in/notifications/send-email-notifications-with-multiple-ticket-links-in-servicenow/

email on transform script
https://community.servicenow.com/community?id=community_question&sys_id=9851932ddbdcdbc01dcaf3231f9619ed
M5Stack Core2でBluetooth接続

今日はBluetoothを使って文字のやりとりをしたい
テンキー代わりに使えるかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660324/1f4c1596-66b7-168c-e5be-74846581d2b0.png)
Bluetoothは `BLT UART` ブロック

Init ble uart name でデバイス名を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660324/dfdefd5f-47db-923e-e65c-dc064b9bacef.png)

ふぁーーーん
表示されました

通信確認方法が見つけられないので、pythonで作ってみる
ライブラリを探すのに一苦労で今日はここまで。。
メッセージヘッダー ヘッダーフィールドに含まれる詳細情報

# メッセージヘッダー
HTTPメッセージの2段目に当たる。
これは```ヘッダーフィールド```と呼ばれる行から成り立っている。
フィールド名、コロン```:```、1文字分の空白、フィールド値で構成されている。
ヘッダーフィールドは４つの種類に分けられる。

```
 GET /test/request_test.html HTTP/1.1
> Host: programmer-life.work
> User-Agent: curl/7.79.1
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx
< Date: Sat, 30 Apr 2022 02:18:09 GMT
< Content-Type: text/html
< Content-Length: 453
< Connection: keep-alive
< Last-Modified: Sat, 28 Dec 2019 12:06:25 GMT
< Cache-Control: max-age=1
< Expires: Sat, 30 Apr 2022 02:18:10 GMT
< Vary: Accept-Encoding
< Access-Control-Allow-Origin: https://programmer-life.work/*
< Accept-Ranges: bytes
< 
<!DOCTYPE html>
<html class="js" lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes">
<meta name=”robots” content=”noindex,nofollow“>
<title>HTTPリクエストテスト</title>
<body>
<header>
<h1>test</h1>
</header>
<main id="main">
<article>
<p>HTTPリクエストテスト</p>
</article>
</main>
</body>
* Connection #0 to host programmer-life.work left intact
</html>%                    
```
出典　https://programmer-life.work/html_css/html-request
## ヘッダーフィールドの種類
### 一般ヘッダーフィールド
HTTPリクエスト、レスポンスの両方に含まれるヘッダーフィールド
HTTPメッセージ全体に対しての付加情報
```
< Date: Sat, 30 Apr 2022 02:18:09 GMT
```
HTTPメッセージが作成された日付
```
< Connection: keep-alive
```
リクエストごはTCPコネクションを切断など接続状態に関する通知

### リクエストヘッダーフィールド
HTTPリクエストのみに含まれるヘッダーフィールド
主なもので```User-Agent```がある。
Webブラウザといったクライアント情報を示す。
```
> Host: programmer-life.work
```
リクエスト先のサーバー名
この場合programmer-life.workが名前
```
> User-Agent: curl/7.79.1
```
Webブラウザの固有の情報（プロダクト名、バージョンなど）
### レスポンスヘッダーフィールド
HTTPレスポンスにのみに含まれるヘッダーフィールド
主な情報で```Server```がある。
Webサーバー機能を提供するプロダクト情報を示す。
プロダクト情報がわかってしまうと攻撃の対象となるので情報には制限がある。
```
< Server: nginx
```
Webサーバーの固有情報（プロダクト名、バージョンなど）
### エンティティヘッダーフィールド
メッセージボディに含まれるデータの付加情報を示す。
主な情報で```Content-Type```がある。
```
< Content-Type: text/html
```
コンテンツの種類　
この場合　HTML
```
< Content-Length: 453
```
コンテンツのサイズ
この場合　４５３バイト
```
< Last-Modified: Sat, 28 Dec 2019 12:06:25 GMT
```
コンテンツの最終更新時刻
この場合　2019年12月28日土曜日12時6分25秒
```
< Expires: Sat, 30 Apr 2022 02:18:10 GMT
```
コンテンツの有効期限
この場合　２０２２年４月３０日土曜日2時18分10秒

# 思ったこと
これもたくさん経験してようやく使えそうだな。
よく知っておかなければならない。
Argo Workflow で実行日パラメータを渡してジョブを実行する

# 前提
ArgoWorkflowのWorkflowTemplateのSubmit時にパラメータに実行日日付を渡して実行させたい。これにより、パラメータに過去日付を指定することが可能になり、バックフィル実行ができるようになる。

# 前置き

### ジョブにパラメータを渡す方法

`parameters` を利用してジョブに変数を渡すことができる

https://argoproj.github.io/argo-workflows/variables/

- `inputs.parameters.name` と `inputs.parameters.value` に値を渡すことで、templateの実行時にそれを利用できる
- 今回の実装では環境変数としてパラメータの値を渡すようにした

### Argo Workflowではsprigが使える

`sprig` を利用して、configファイルにプログラマブルな値を準備することが可能 

http://masterminds.github.io/sprig/date.html

- 今回はデフォルトで実行日の日付をパラメータに渡したい
- sprig.dateInZoneを利用した
- goのformtのお作法で `20060102` の書き方をすることを初めて知った
  - [Goの日付フォーマット 〜＜2006年1月2日＞の謎〜](https://blog.toshimaru.net/go-time-format/)

# 実装

今回は `inputs.parameters` で設定した `execute_date_jst` を　環境変数 `EXECUTE_DATE_JST` に代入し、ジョブ内から読み込めるようにしました

```yaml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: job-name
  namespace: namespace
spec:
  templates:
    - name: temp-name
      inputs:
        parameters:
          - name: execute_date_jst
            value: '{{=sprig.dateInZone("20060102", sprig.now(), "Asia/Tokyo") }}'
      container:
        image: some_image
        command: ["/bin/sh", "-c"]
        args:
        - >
          python main.py execute --job_name some_job
        env:
          - name: EXECUTE_DATE_JST
            value: "{{ inputs.parameters.execute_date_jst }}"
```



# 参考
https://qiita.com/madogiwa/items/f0aa07d5f6062cf3dd8a
Athenaで異なるS3ストレージクラスのオブジェクトをクエリする

# AthenaのS3ストレージクラスに関する仕様

Athenaでは異なるストレージクラスのオブジェクトで構成されるテーブルについても問題なくクエリすることができます。
例えば、以下のようにテーブルに対応するフォルダ配下に複数のストレージクラスのオブジェクトがあったとしても問題ありません。

![スクリーンショット 2022-05-17 16.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/346c8659-e2db-4bfe-14f9-00ef57403e5c.png)

# AthenaのGlacierに関する考慮事項

Athenaでは `Amazon S3 Glacier Flexible Retrieval`と`Amazon S3 Glacier Deep Archive`ストレージクラスのオブジェクトに関してはクエリされません。
例えば以下のように`Amazon S3 Glacier Flexible Retrieval`と`Amazon S3 Glacier Deep Archive`のオブジェクトが含まれるテーブルに対して、`SELECT * FROM table`のようなクエリを実行した場合、クエリの実行はエラーにならないものの、これらのオブジェクトに含まれるデータは参照されません。

![スクリーンショット 2022-05-17 16.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/56fd1cdf-4c1a-8c82-ac0b-cc54eb174813.png)

また、[マニュアル](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/other-notable-limitations.html)にあるように、`Amazon S3 Glacier Flexible Retrieval`と`Amazon S3 Glacier Deep Archive`ストレージクラスのオブジェクトを復元したとしてもデータの参照は行われません。
そのため、`Amazon S3 Glacier Instant Retrieval`ストレージクラスであればAthenaでの参照ができるので、Athenaで参照を行いたい場合は`Amazon S3 Glacier Instant Retrieval`ストレージクラスの利用が推奨されます。
Spring MVC 

Web アプリケーションを MVC アーキテクチャーで開発する際に使用するフレームワークです。
フロントコントローラーパターンを採用しています。

Spring MVC の特徴
Controller や Model などのクラスは POJO として実装する
Servlet API 、フレームワーク独自のインターフェースを排除でき、ユニットテストがしやすい
Spring の DI や AOP の仕組みを活用でき、効率的に Web アプリケーションを開発できる
View の実装技術を抽象化できる。Controller では View 名だけ意識すればよく、View の実装 (JSP 、Tymeleaf など) を意識する必要がない
💡 POJO (Plain Old Java Object)
ごく普通の Java オブジェクトを指します。
継承や依存関係がないクラスとして作成します。
この名称が提唱される以前よりある Java Beans では Bean に次の条件があったため、それよりシンプルな設計となります。

public で引数なしのコンストラクタを作成する
メソッドはアクセサメソッドの命名規則 (getXXX / setXXX) に従う
シリアライズ可能にする (implements java.io.Serializable)
💡Thymeleaf(タイムリーフ)
HTML に可変データを埋め込む仕組みを持つ テンプレートエンジン です。
埋め込みを行えるものとして JSP がありますが、JSP ではブラウザーが認識できない式やタグライブラリーなどが含まれるため、開発中にブラウザーで表示を確認することが難しく、デザイナーとの分業が難しいというデメリットがありました。
一方、Thymeleaf は HTML5 に準拠した HTML であるため、ブラウザーで表示でき、分業することができます。
AOP

AOP (アスペクト指向プログラミング Aspect Oriented Programming)
プログラミングをしていると、ログ出力や例外ハンドリングなどといった 複数の箇所にまたがって存在する処理 が出てきますが、これらの処理のことを 横断的関心事 (Cross-Cutting Concern) と呼んでいます。

また、プログラムからこの 横断的関心事 を分離することを 横断的関心事の分離 (Separation Of Cross-Cutting Concerns) と呼び、これを実現する手法は アスペクト指向プログラミング AOP と呼ばれています。

AOP を利用すれば、Java のソースコードから共通的な機能を分離することができます。

Spring Framework では AOP を実現するためのサブプロジェクトとして Spring AOP が用意されています。

Spring AOP では、広く使われている AOP フレームワークである AspectJ を利用しています
Bean

Java のソースコード内で定義する
Bean 定義を行う コンフィグレーションクラス を用意します。
メソッドに @Bean アノテーションを付与し、Bean 定義を行います。
メソッド名が Bean 名、戻り値がその Bean のインスタンスとなります。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    UserService userService() {
        return new UserServiceImpl();
    }
}
コンポーネントスキャン

Bean 定義用のアノテーションが付与されたクラスをスキャンし、DI コンテナーに登録します。
この DI コンテナーによるスキャンを コンポーネントスキャン といいます。

@Autowired アノテーションを付けることで、オートワイヤリング (autowiring) という、DI コンテナーから型の一致する Bean を探し、見つかった場合に自動注入を行います。

🖊️ 構文

@Autowired
Bean 定義

当初は Java ソースコードから分離した XML に定義する方法しかありませんでした。
複雑な設定を行う場合、XML の記述が大きく複雑になることが問題視されるようになりました。
後続で登場した Bean 定義は Java ソースコードのコンパイルが必要ですが、採用されるケースが増えてきました。
利用するコードに設定が近い方が管理しやすいと認識されたのが理由です。
Bean 定義の記述方法は次のようになります。

XML ファイルを使って定義する
🖊️ 構文

<beans>
  <bean id="[Bean 名]" class="[Bean の完全修飾クラス名]" scope="[スコープ]" />
</beans>