OmniAICreator/Qiita-1.07M huggingface dataset:
Twitterを通して大好きなあの人を温かく見守るアプリ（取り扱い注意） #Twitter #Bootstrap ＃CSS

##完成品##
<font color="Red">**まずは完成品をご覧ください。**</font>（そのあと弁明させてください。。）

https://okiniiritracekyoukinosata.netlify.app/

開くとこんな感じのちょっとヤバイページに飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2122173/846421c0-50ab-9b33-2cdf-fd2a3d1ccdc4.png)

<font color="Red">**そう！みんなのTLをひとまとめに表示してニヤニヤするやつ！**</font>


##企画（と弁明）##
はじめに、<font color="Red">**ネットに落ちている「お気に入り」の最新情報を集約して（できれば１ページで）表示できるアプリを作りたい**</font>と考えました。

みんな好きな芸能人、ゲーム、漫画、アニメ、色々あると思うのですが、そういった<font color="Red">**「お気に入り」の情報を、あちこちに取りに行かなくても、勝手に手元に流れ込んでくるアプリ**</font>が最終的な目標です。

とはいえ、いきなりそんな素敵なものは作れないので、今回は比較的難易度の低いTwitterの情報取得から着手しました。

どうせなら今役立つものになればと思って仕様を改造しているうちに、知人をストーキングするアプリになってた。そういう話です。:poop:

##ベース##

今回はこちらのcodepenをベースに使用させていただきました。リスペクト:pray:

https://codepen.io/finbyz/pen/qgRrdv

##修正手順##
①タブの名称を変更
②タブの画像を変更
③文章の部分を特定IDのTimeLineを表示するよう変更
　こちらを使用➡https://publish.twitter.com/#
④4名分のTimeLineを並列で表示するので列のClassはcol-sm-2を指定
　(3だとうまく入らない。画像があるから。)
⑤上部にこのサイトのQRコードを埋め込む
 （URLは決め打ちしてしまい、Netlifyで上げる際にURLの名称を変更して一致させました）

##ソース##

プレビューで見る場合は大きいので0.25倍設定でお願いします。
https://codepen.io/taka_xedge/pen/ExvLzVZ
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExvLzVZ" data-user="taka_xedge" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/taka_xedge/pen/ExvLzVZ">
  Twitterお気に入りトレース</a> by TAKA (<a href="https://codepen.io/taka_xedge">@taka_xedge</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

以下の●●●●●●の部分を任意のIDに変更すれば「大好きなあの人を温かく見守るアプリ」の出来上がりです。。

```html
<a class="twitter-timeline" href="https://twitter.com/●●●●●●?ref_src=twsrc%5Etfw"width="5px">Tweets by ●●●●●●</a>
```


##反省点##
スマホだと究極に見づらいので、レベルアップする際はスマホでの見え方も注意しようと思います。
あと、犯罪には気を付けたいと思います。

##<font color="blue">2021/11/11更新　改良版できました</font>##
別記事にしておりますので、よろしければこちらもご覧ください！

https://qiita.com/TAKA_xedge/items/9d40f84d993614ec904f
Laravel6｜画像アップロード

## シンボリックリンクを貼る

画像はstrageフォルダに入るが、ここはWEBからは通常では参照は不可能。
なので、publicからstarageの中へシンボリックリンクを貼るため以下を実行する。


```
php artisan storage:link
```



## 1.画像ファイルの指定

```blade.php
        <form method='POST' action="..." enctype="multipart/form-data"><!-①-->

        <input name='image' type="file" class="form-control-file" id="image" ><!-②-->

```

①enctype="multipart/form-data"必須
②type="file"



## 2.画像アップロード

2パターンある

```
1.通常のアップロード
2.Strageファサードを使ったアップロード
```



### 1.通常のアップロード

```php:controller.php
        if($request->hasFile('image')){//①
            if($request->file('image')->isValid()){//② 
                $image_path = $request->file('image')->store('public/images/');//③
                $image_path=basename($image_path);//④
            }
        }
```

①hasFile('image')はファイルがちゃんと送信されたかチェックする。
②isValid()はファイルがアップロードされたかチェックする。
③strageフォルダに「public/images/」を掘ってここに画像を保存する。
④basenameでファイルパスからファイル名だけを取る→DBに保存





### 2.Strageファサードを使ったアップロード

```php:controller.php

use Illuminate\Support\Facades\Storage;//ファサード


        if($request->hasFile('image')){//①
            if($request->file('image')->isValid()){//② 
                $image_path = Storage::put('/public/images/', $request->file('image'));//③
                $image_path=basename($image_path);//④
            }
        }
```


**ファサード：Storageファサードの宣言**


①hasFile('image')はファイルがちゃんと送信されたかチェックする。
②isValid()はファイルがアップロードされたかチェックする。
**③strageフォルダに「public/images/」を掘ってここに画像を保存する。**
④basenameでファイルパスからファイル名だけを取る→DBに保存



## 3.表示

```blade.php
<img class="rounded mx-auto d-block" style="" src="{{ asset('storage/images/'.$memo['image']) }}">
```

asset：現在のリクエストのスキーマ(HTTPかHTTPS)を使い、アセットへのURLを生成
publicにstrageへのシンボリックリンクがある。
そこからimagesの中の該当画像を表示する。
AfterEffects 画面の淵を暗く　ビネット

■ビネット
画面の淵を暗くして立体的にし動画をいい感じにする。

大袈裟に言うとこんな感じ
![スクリーンショット 2021-11-09 16.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/6e5bef9b-ed9c-e86a-b470-afc8a3f8b92a.png)

①調整レイヤーを作り
②楕円形シェイプを作成
③トーンカーブをつける。(エフェクト)
④トーンカーブを下の画像のように調整(大袈裟にすればこれぐらい!)幅を細くするとナチュラルに!
![スクリーンショット 2021-11-09 16.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/e02aa451-2161-ac11-9c71-12b8579f3347.png)
⑤マスクの反転
で初めの画像のような状態

###■調整
後は元画像との境界線をナチュラルにする。

マスクを選択したままFキーを押し
フェザーを出す。
200ぐらいにするとナチュラルに画像と繋がる。
GitHubのデフォルトブランチを改名する手順

:::note warn
この記事では

- 改名したブランチを古いブランチから複製する
- 古いブランチを削除する

という手順を紹介しています。

ブランチを直接GitHub上で改名する場合は、以下の記事を参照してください。
:::


https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch

## はじめに

この記事は、GitHubリポジトリのデフォルトブランチを改名する手順を共有するためのものです。

必要となる情報はすべてインターネット上にありますが、分散しているため作業手順を1つの記事にまとめました。

### 前提とする環境

この記事は、以下の環境を前提に書かれています。

- git version 2.30.1

GitHubのUIは、2021/11/09時点のものを前提としています。GitHubのバージョンアップによりUIは変わりますのでご注意ください。

### 前提とするリポジトリ構成

この記事では、改名前のブランチ名を`master`、改名後のブランチ名を`main`としています。ブランチ名はお手元の環境に合わせて読み替えてください。また、リモートリポジトリの名前は`origin`とします。

## 改名の手順

### ローカルで、ブランチ名を変更する

```shell
git branch -m master main
```

このコマンドで、ローカルの`master`ブランチが`main`ブランチに改名されます。`-m`オプションは`--move`の短縮表記です。

### 変更したブランチをリモートにpushする

```shell
git push -u origin main
```

改名したブランチをリモートにpushします。この時点で、リモートには改名前の`master`ブランチと`main`ブランチが共存しています。

### GitHub上で、デフォルトブランチを変更する

`Settings`→`Branches`→`Default branch`の左右矢印ボタンを押すと、デフォルトブランチが切り替わります。

![](https://www.evernote.com/l/AAlBIh3p35NJvo3_gfVGe8BNyIQjTDISqlcB/image.png)

矢印ボタンが表示されない場合は、リモートに`main`ブランチがpushできていません。再度pushしてください。

### 古いブランチを削除する

```shell
git push origin :master
```

リモートの`master`ブランチを削除します。`:`は本来`<ローカルのブランチ名>:<リモートのブランチ名>`という書式でブランチ名を指定するものです。今回は`<空>:<リモートのmaster>`を指定し、リモートのブランチ削除コマンドとして利用しています。

### リモートのHEADを再設定する

```shell
git remote set-head origin --auto
```

デフォルトブランチが削除されたため、`origin/HEAD`が未指定になります。`set-head`コマンドでHEADを再指定します。

## コマンドのショートカット

複数回のリネーム作業用にコマンドを連結します。この処理は[GitHub CLI](https://cli.github.com/)がインストールされていることを前提にします。

```shell
git checkout master && git pull && git branch -m master main && git push -u origin main && gh browse --settings
```

ブラウザーでデフォルトブランチを変更してから、リモートのmasterブランチを削除します。

```shell
git push origin :master && git remote set-head origin --auto
```



以上、ありがとうございました。

## 参考記事

https://qiita.com/e_chan1007/items/ad3e849b7e04fcf42fad

https://qiita.com/tsuyoshi_cho/items/8bca5ee3576da82cbba6

https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa

https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-Git%E3%81%AE%E5%8F%82%E7%85%A7
HTMLスーパー初心者、CodepenでBootstrapを使う

# HTMLスーパー初心者、すぐに手順を忘れる。
Bootstrap[（公式）](https://getbootstrap.jp/docs/4.3/getting-started/introduction/)を使うときの設定方法を記載する。
都度設定が必要なので、注意。


# Codepenの「&#x2699;Settings」で設定

### CSS設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2122226/0ab59731-e000-bbe9-f876-8051250247f5.png)
「Setting」から、「CSS」でbootstrapがあるか確認。
追加方法は、赤枠上の「&#x1f50d; Search for resources」欄で「bootstrap」を検索して追加する。

### JS設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2122226/3c11b24d-847a-dee1-1c5f-79d37f159e4e.png)
bootstrap.jsのほかに、jQueryも追加すること。
追加方法は、赤枠上の「&#x1f50d; Search for resources」欄で「bootstrap」「jquery」を検索して追加する。

### 保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2122226/b5db4a56-295d-84b4-c140-8ebda3f42715.png)
各設定をしたら、「Save＆Close」を押下して保存する。
Apacheインストールチートシート for Windows

## こちらは、zennに公開したもののコピーとなります。

[Apacheインストールチートシート for Windows](https://zenn.dev/sakots/articles/30c5544b22e6b6)

## XAMPPのアップデートがクソめんどい

いやそもそもコンパネのアップデートなのかphpのアップデートなのか。
phpのアップデートだけだったらphpだけ入れ替えれば済むんですよね。
んでもってXAMPPは差分の上書きインストールができないので、一旦アンインストールしてから再インストールすることになるが、これがまた時間かかる。
あとphpのバージョンも7.3系、7.4系、8.0系、そしてきたるべき8.1系と複数管理したい。
よって、俺はapacheとphpとDBを別々にインストールすることにした。ん、perl？ 知らない子ですね…

## 思考

### XAMPPのapacheは便利

まず素のapacheでphpを動くようにだけして、比較してみた。

![phpinfo_su.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/7c050017-2647-4aa7-3842-c5479b6f2d74.png)

で、こちらがXAMPPのもの

![phpinfo_xampp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/42edabfe-8a26-8487-6a9c-45a04bb8072e.png)


さすがにいろいろカスタマイズされてるっぽく、便利機能が多い。FastCGIとかはない。
ssl関係なんかも最初から入ってる。この設定を、素のapacheに適用するのはいささか面倒だ。

### そうだ、怠惰、しよう

apacheのバージョンが同じなのが確認できたので、**設定やらモジュールやらをXAMPPのほうからまるごと持ってくればいい**のである。
いろんなpathなんかはあとから変えれば良い。たぶんxamppってCtrl+Fすればでてくるやろ。

## 実行

### XAMPPのapacheフォルダをまるごとコピペ

apacheが停止しているのを確認して、binもconfも何もかも全部XAMPPのもので上書きする。
バッチファイルも中身は便利なのでコレもコピペだ（apacheのサービス登録や解除ができる）

あとその1階層上にあるanonymousとかwebdavとかsendmailとかcontribなんかも入れとこう

### confフォルダ内のconfフィアルどもを書き換える

ServerRootとかそのへんで目立つxamppの文字部分を探せばだいたい良い。
いろんな.confファイルに片っ端からあるので根絶やしにしよう。

```httpd.conf
# XAMPP settings
Include "conf/extra/httpd-xampp.conf"
```

ここはコメントアウトしたほうが良さそうだ。

で、XAMPPをアンインストールする。pathとかが残るし。

## とりあえずphpをいれて動かす

![スクリーンショット 2021-11-09 151218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/1b311829-3610-7862-1a57-7e13762f8240.png)

動いた。

![phpinfo_kekka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/47929a65-a2b5-f0f4-06cb-6e8316b07085.png)

こちらがphpをとりあえず動かしたもの。

このあと、phpのバージョンを変更できるようにしたり、sslの設定をしたりする。
src2absでNullPointExceptionが返ってくる

# 結論
src2absのファイルパスは相対パスで書きましょうという。例：./sample.java


# 困ったこと
[src2abs](https://github.com/micheletufano/src2abs)というプログラミング解析ツールをpythonのsubprocessから実行したがエラーが返ってくる。

コード

```python
import subprocess
input_file_path = "0a880965_e08adf83_0_after.java"

cp = subprocess.run(["java", "-jar","src2abs-0.1-jar-with-dependencies.jar", "single","method",input_file_path,"test.java","idioms.csv"])
```

結果

```console
Exception in thread "main" java.lang.NullPointerException
	at java.nio.file.Files.provider(Files.java:97)
	at java.nio.file.Files.readAttributes(Files.java:1737)
	at java.nio.file.Files.isDirectory(Files.java:2192)
	at edu.wm.cs.src2abs.AbstractorManager.checkParentFolderExists(AbstractorManager.java:121)
	at edu.wm.cs.src2abs.AbstractorManager.checkInputs(AbstractorManager.java:117)
	at edu.wm.cs.src2abs.AbstractorManager.abstractCode(AbstractorManager.java:20)
	at edu.wm.cs.src2abs.main.AbstractorMain.abstractCode(AbstractorMain.java:48)
	at edu.wm.cs.src2abs.main.AbstractorMain.main(AbstractorMain.java:25)
```

# 解決策
相対パスで書きましょう。

```python
import subprocess
import sys
input_file_path = "./0a880965_e08adf83_0_after.java"

cp = subprocess.run(["java", "-jar","src2abs-0.1-jar-with-dependencies.jar", "single","method",input_file_path,"./test.java","./idioms.csv"])
```

そうするとうまく実行できました。

```console
Source Code Abstracted successfully!
Abstracted Code: ./test.java
Mapping: ./test.java.map
```

#終わりに
かなりニッチなケースですが情報がなかったので書きました。
After Effects けむりのエフェクト

#■フラクタルノイズを使う。
![スクリーンショット 2021-11-09 16.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/39789252-db8c-a3f1-1d78-16e32a2d348e.png)

新規コンポジションで煙ようのプリコンポジションをつくる。


展開をいじると動く
始めを0でキーフレーム
終わりを展開の数値をいじる。

#■スクリーン
作った煙のプリコンポジションを
メインコンポジションにいれ
モードをスクリーンにする。
黒が透けて見える。

![スクリーンショット 2021-11-09 16.07.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/39d4c76f-b1a5-3355-a1e2-818b2a45c85e.png)

###■あとは透明化で薄くする。
5~10ぐらい。

![スクリーンショット 2021-11-09 16.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/0d3a8b1e-c9fa-1481-0867-88a8dbe74d77.png)


#■奥行きを出すには
メインのアイテムを挟むようにけむりを作る。
煙を複製しアイテムを挟み
3Dレイヤーにし
Z位置を変更し挟む。
フラッシュリカバリ領域の拡張手順

##はじめに
オラクルデータベースのフラッシュリカバリ領域が100%となり拡張が必要になったのでここに手順を残します。
ALTER SYSTEM コマンドで動的に変更します。データベースの再起動は不要です。

##対象バージョン
Oracle database 19c

##フラッシュリカバリとは
バックアップの自動化を実現するためにOracle10g R1から新機能（フラッシュバックリカバリ機能）として用意された格納領域です。

フラッシュリカバリ領域には、アーカイブログファイル、RMAN（Recovery Manager）を使用して取得したバックアップファイル、フラッシュバックデータベース機能（データベース全体を指定された時点の状態に戻す機能）で使うフラッシュリカバリログが格納され、1カ所で管理が可能となり、指定されたサイズ内で自動的に管理がなされます。

##変更手順
###フラッシュリカバリ領域の使用率確認
フラッシュリカバリ領域の使用率はV$RECOVERY_FILE_DESTビューから確認します。
以下の値は参考例です。SPACE_LIMITとSPACE_USEDが同じ値になっているため、
使用率が100%であることが分かります。

★印について
######SPACE_LIMIT＝DB_RECOVERY_FILE_DEST_SIZEで設定しているサイズ
######SPACE_USED＝現在使用済みのサイズ

```
SQL>select * from v$recovery_file_dest;

NAME               SPACE_LIMIT★ SPACE_USED★ SPACE_RECLAIMABLE NUMBER_OF_FILES
------------------ ----------- ----------    -------------- ---------------
/home/oracle/flash  10737418240  10737418240                 0               6
```


###フラッシュリカバリ領域のサイズ変更
xxxの部分に変更したいサイズを入力。

```
SQL>alter system set db_recovery_file_dest_size = xxxG;
```
簡単ですね。


###確認コマンド
★印の部分の値が変更されます。

```
SQL> show parameter db_recovery_file_dest_size

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
db_recovery_file_dest_size           big integer                      10G★
```

##まとめ
フラッシュリカバリ領域は保存方針がきちんと設定してあれば、不要になったファイルは削除されるため、
拡張や手動削除の対応はしなくてもよいはずです。
今回は、なぜ自動で削除されるべきフラッシュリカバリ領域が100%になったのかは原因は残念ながら分かっていません。。
復旧優先させたかったため、今回は暫定的にサイズ拡張で逃げ切りました。
恒久対策としては、原因を突き止めて対策をしたいと思います。

##参考情報
https://atmarkit.itmedia.co.jp/ait/articles/0811/27/news141.html
https://docs.oracle.com/cd/E16338_01/server.112/b56311/dynviews_2125.htm
https://docs.oracle.com/cd/E16338_01/server.112/b56311/initparams066.htm
ウォーターフォールモデルとは

# ウォーターフォールモデルとは
***ウォーターフォールモデル***とは、ソフトウェア開発に用いられる開発手法の1つ。
名前の通り、上から下へ水が流れる滝のように上流工程から下流工程へ移行し、原則的には前の工程に戻らない。計画の立てやすさや開発の進捗管理がしやすいなどのメリットがある一方で、仕様変更や利用者の意見を途中で反映しにくいなどのデメリットもある。

# 開発工程
***①要件定義***
ユーザーと打ち合わせを行い、開発するシステムの性能や機能、運用方法などの要件を決める。
【成果物: 要件定義書】

***②機能設計***
要件定義をもとに、システムの機能ごとに仕様を決める。
【成果物: 機能仕様書】

***③基本設計（外部設計）***
要件定義書をもとに、ユーザーから見えるインターフェース部分の設計を行う。
【成果物: 基本設計仕様書】

***④詳細設計（内部設計）***
ユーザーからは見えないシステム内部の動作や機能、データ部分などの設計を行う。
【成果物: 詳細設計仕様書】

***⑤開発（コーディング）***
設計書に基づいて実装を行う。
【成果物: プログラム】

***⑥単体テスト***
プログラムの最小単位であるモジュールごとに正しく動作するかテストを行う。
【成果物: 単体テスト仕様書】

***⑦結合テスト***
複数のモジュール同士を結合して正しく動作するかテストを行う。
【成果物: 結合テスト仕様書】

***⑧機能テスト***
要件定義通りにシステムが動作するかテストを行う
【成果物: 機能テスト仕様書】
rubyで文章のサイズ変更 

今回実装したアルゴリズムの備忘録として！！

##お題
ウィンドウのサイズを変更すると文章表示部分の大きさも同様に変更され、文章表示部分の幅に合わせて自然に改行されるという機能を現在の文章表示部分の高さと幅、及び変更後の幅を元に、新しく表示される文章を表示するプログラムを作成してください。

入力例の場合、以下の図のように高さが 6 行、幅が 8 文字の文章が与えられています。
##入力/出力例
```
//入力例
6 8 6
My#name#
is#AVIOT
.#I#love
#program
ming#ver
y#much.#
```
```
//出力例
My#nam
e#is#A
VIOT.#
I#love
#progr
amming
#very#
much.#
```

#実際に記述したコード
```ruby
info = gets.chomp.split.map(&:to_i)
str = info[0].times.map{gets.chomp.split.map(&:to_s)}
array = str.flatten.join
ans = array.chars.each_slice(info[2]).map(&:join)
puts ans
```
### 解説付き
```
info = gets.chomp.split.map(&:to_i)  #最初の３つの数字を受け取り空白を取る
str = info[0].times.map{gets.chomp.split.map(&:to_s)}#[0]の回数分配列を受け取る
array = str.flatten.join　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#二次元配列を１つに繋げる
ans = array.chars.each_slice(info[2]).map(&:join)　　　　　　　　#お題の文字数[2]に併せてeach_sliceする
puts ans
```
##今回学んだメソッド
・each_slice(n)  引数ｎの指定した数の要素を取り出し配列にしてくれる
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/each_slice.html

・flatten　　　　多次元配列を１次元配列にしてくれる
https://docs.ruby-lang.org/ja/latest/method/Array/i/flatten.html
vue.js disabled ボタン

指定した箇所(hakensaki)が未入力だったら
ボタンを押せなくする

```hoge.vue

<el-form>

    <el-form-item label="派遣先を入力して下さい" prop="hakensaki">
        <el-input
                v-model="hakensaki">
        </el-input>
    </el-form-item>

<el-button type="primary" @click="hoge" :disabled="!hakensaki">予約する</el-button>


</el-form>

//略

data() {
    return {
        hakensaki:'',

```


':disabled="!hakensaki"'

haknesaki が無けりゃ disabled をオンにしろ
ってことで。
AWS SAA試験対策 ややこしいポイント

AWS認定ソリューションアーキテクトアソシエイト対策で、ややこしいポイントがいくつかあったので確認していく。

#上限
それぞれデフォルトで1つのリージョンで利用できる上限。
Elastic IP の上限 : 5
VPCの上限 : 5
サブネットの上限 : 200

各リソースは最大50個のユーザー作成タグを適用できる。


#よく似たサービス
##構築ツール
**CodeDeploy**
EC2, Fargate, Lambda, オンプレサーバにアプリケーションのデプロイを自動で実行するフルマネージドサービス。
テンプレートに無いアプリケーションの導入、OSやミドルウェアの設定も行える。

**Elastic Beanstalk**
運用管理をAWSに任せ、アプリをデプロイだけで動かすことができる。

**CloudFormation**
テキストでAWSリソースを管理できるサービス、自由度が高い。

**OpsWorks**
アプリケーション周りのリソースを管理するためのツール。

**Data Pipeline**
AWSリソース間のデータの処理や、移動を自動化。

まとめると...
**アプリケーションのデプロイ**に使えるCodeDeployとElastic Beanstalk。
CodeDeployの方が細かいカスタマイズが行える、BeanstalkはAWS任せ。

**リソース管理**が行えるCloudFormationとOpsWorks。
AWSリソースのほとんどを管理できるCloudFormation、アプリケーション周りのリソースを管理できるOpsWorks。

AWSリソース間の**データの移動**や、処理を自動化するPipeline。

##データ分析ツール
**Athena**
S3にあるデータファイルに対してクエリを実行することのできるサービス。
S3にデータを配置するだけでデータ分析を開始できる。

**EMR**
ビッグデータの分析が可能なサービス。
膨大なデータ、形態のさまざまなデータに対応。

**Redshift**
フルマネージドのペタバイトスケールのデータウェアハウスサービス。


#リードレプリカの使えるデータベース
Amazon RDS for MySQL、MariaDB、PostgreSQL、Oracle、SQL Server、Amazon Aurora
RDS関連のサービスで利用可能。

#正解択になりがちなサービス
IAM, DynamoDBはよく正解になりがちだと思っている。
AWSがプッシュしたいサービスが割と答えになることは多い。

#参考資料
https://dev.classmethod.jp/articles/cm-advent-calendar-2015-aws-re-entering-codedeploy/

https://qiita.com/miyuki_samitani/items/dbd1737c74d29d839175

https://www.ctc-g.co.jp/solutions/cloud/column/article/07.html

https://recipe.kc-cloud.jp/archives/16855

https://aws.amazon.com/jp/opsworks/stacks/faqs/

https://aws.amazon.com/jp/rds/features/read-replicas/

https://qiita.com/yoshiyama_hana/items/9b2f26b214de92a0f36c

https://www.skyarch.net/column/amazon-emr/

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/welcome.html
create a sftp server on linux (with laravel connection example)

## Creating an SFTP Group and User
```
apt update
addgroup sftp_fosslinux
useradd -m sftpfossuser -g sftp_fosslinux
passwd sftpfossuser
chmod 700 /home/sftpfossuser/
```

## Installing SSH Daemon
```
apt install -y ssh
echo "Match group sftp_fosslinux 
ChrootDirectory /home 
X11Forwarding no 
AllowTcpForwarding no 
ForceCommand internal-sftp" >> /etc/ssh/sshd_config
systemctl restart ssh
```

## OpenSSHをインストール
```
apt install -y openssh-server
service ssh start
```

## 試し
```
sftp sftpfossuser@127.0.0.1
```

# Laravel
```
# config/filesystems.php

'sftp-test' => [
            'driver' => 'sftp',
            'host'   => '127.0.0.1',
            'username' => 'sftpfossuser',
            'password' => 'sftpfossuser',
            'visibility' => 'public',
            'permPublic' => 0766,
            'root' => '/sftpfossuser'
        ],
```
LinuxでPDFを編集するためのツール

# この記事について

Linux (Ubuntu22.04)上でPDFファイルを編集するソフト・コマンドの私的な健忘録です。
他の方々にも役立つ情報があれば幸いです。

# PDF閲覧

`evince`ですね。

# PDFのページ順序を入れ替える、回転、削除、マージなど

## pdfarranger

GUIでやりたいときは、`pdfarranger`。
パッケージ名もpdfarranger。

インストール方法:

```
sudo apt install pdfarranger
```

使い方はGUIなので迷わないだろう。

使用上の注意点としては、ver.1.4.2のpdfarrangerで編集すると、しおり(bookmark, outline)がきれいさっぱり消去されてしまった。しおりを使っているPDFには使用禁止。

## pdftk

CUI(コマンドライン)でやりたいときは、`pdftk`。
パッケージ名はpdftkなので、下記のようにインストールすれば良い。ただし細かいことを言うと、これはtransitional packageであり、本体はpdftk-javaらしい。

```
sudo apt install pdftk
```

なお、上記のパッケージでインストールされるpdftkは、下記のPDFLabsのものとは異なるみたい。

PDFLabs版pdftk:
https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

使い方については他の人の記事を参照されたい。
pdftkは、しおりを編集することもできる。
参考URL:
https://reject.tokyo/pdf-index/

使用例のメモ:

shuffle: 2つのPDF(infile1.pdfとinfile2.pdf)を交互に結合する。

```
pdftk A=infile1.pdf B=infile2.pdf shuffle A B output outfile.pdf
```

shuffle: 2つのPDF(infile1.pdfとinfile2.pdf)を交互に結合する。ただし、infile2.pdfの方だけ逆順にする。
両面書類を片面ずつ2回に分けてスキャンした後に結合するときに便利。

```
pdftk A=infile1.pdf B=infile2.pdf shuffle A Bend-1 output outfile.pdf
```

Bについている`end-1`が逆順の指定。
両面書類を片面ずつ2回に分けてスキャンするさい、奇数ページは正順でスキャンされるが、その後に書類を裏返して、偶数ページをスキャンすると、偶数ページは逆順でスキャンされる。そのようなとき、上記のコマンドで結合すると、本来のページ順になる。

PDFを1ページごとにばらばらのPDFファイルに分割する。

```
pdftk input.pdf burst output page-%02d.pdf
```

`%02d`は、1桁の数には0をつけて2桁の数字にする指定。`%03d`なら3桁の数字になる。


# PDFの一部を切り出す(トリミングする)

## krop

GUIでやりたいときは、`krop`。
パッケージ名もkrop。

インストール方法:

```
sudo apt install krop
```

使い方はGUIなので迷わないだろう。

## pdfcrop, pdfjam

CUI(コマンドライン)でやりたいときは、`pdfcrop`や`pdfjam`。
これらは、texlive-extra-utilsパッケージをインストールするとその中に入っている。
TeXLive一式をインストールしてある人は、すでに入っていると思う。
シェルスクリプトなどでバッチ処理をするときに役立つかもしれない。

`pdfjam`はトリミングに加えて、ページの結合・分割・割付もできる。

# PDF中の注釈(コメント)をflattenする

注釈(コメント)の付いたPDFをLaTeXの図に取り込んだ(includegraphics)とき、その注釈(コメント)が表示されない。PDF中の注釈を表示するかしないかはアプリによるので、おそらくこれはLaTeXの仕様なのだろう。
解決策としては、注釈(コメント)という属性をなくして、ベタ書きに変換してしまえばよい。flatten(フラット化)するというらしい。qpdfコマンドでやるのが簡単。
パッケージ名もqpdf。

インストール方法:

```
sudo apt install qpdf
```

コマンド記述例: 脚注付きのinput.pdfをflattenして、output-flattened.pdfを生成する。

```
qpdf --flatten-annotations=all input.pdf output-flattened.pdf
```

注: pdftkにもflattenの機能があるが、これは別物。PDF中の注釈ではなく、PDF中の入力フォームをflattenするための機能らしい。
qpdfでも入力フォームのflattenはできるので、pdftkでやる必要はないが、参考までにコマンド記述を下記に示す。

コマンド記述例: 入力フォーム付きのinput.pdfをflattenして、output-flattened.pdfを生成する。

```
pdftk input.pdf output output-flattened.pdf flatten
```


# PDFとSVGの相互変換

PDFの図をMicrosoft PowerPointで使いたいときがある。
PowerPointはPDF形式のファイルを図として扱えないが、SVGに変換すれば扱える。
PNGやJPGなどのイメージグラフィックスに変換するという手もあるが、元のPDFがベクタグラフィックスの場合は、SVGの方が比較的小さいファイルサイズで高品位の図になるので、お勧め。

## PDF→SVGへ変換

`pdf2svg`というコマンドで変換できる。
パッケージ名もpdf2svg。

インストール方法:

```
sudo apt install pdf2svg
```

使用例: foo.pdfを変換してfoo.svgにしたいとき

```
pdf2svg foo.pdf foo.svg
```

## SVG→PDFへ変換

inkscapeをコマンドラインで使って変換できる。
インストール方法は、拙作の記事を参照:
https://qiita.com/j0306043/items/5666e67bcbfd099be7d5#inkscape

下記はVer.1.1のinkscapeの場合で説明する。
(古いバージョンのinkscapeとはオプションの指定が異なるので注意)

使用例: foo.svgを変換してfoo.pdfにしたいとき

```
inkscape -p foo.svg -o foo.pdf
```

`convert`で変換するよりも、フォント絡みの再現性が良い感じ。
Pythonista3:iPhone版GoogleMapAppからコピペした住所の郵便番号部分を抜き取る

# はじめに
本コードはiOS版アプリPythonista3を用いて、iPhone版GoogleMapAppの住所の部分をコピペしたものから、郵便番号を抜き取るものです。

1. GoogleMapの住所部分をクリップボードにコピー
1. Pythonista3を起動
1. 本コードを実行
1. Pythonista3のコンソールに変換後住所を吐き出す

という趣旨です。
# きっかけ
GoogleMapの住所をiPhoneApp「乗換案内」にコピペするときに、郵便番号が邪魔かつ削除するときにいちいちカーソルを先頭に持っていかなければならず、非常に面倒なので手間を省くために作りました。
# 前準備
Pythonista3は有料です。別途お買い求めください。
# ソースコード
下記のコードを作成します。

```python:google_address.py　(1)
#For Pythonista3
#Delete ZIP from a text copied from GoogleMap
# -*- coding: utf-8 -*-
import sys
import clipboard

#----------------
#機能定義ここから
class Import_URL:  #クリップボードを取得
	global in_text  #クリップボードの中身をglobal化
	in_text = clipboard.get()

class Case_address():  #住所判定
	if '〒' in in_text[:2]:
		url = in_text[:9]
		text = in_text.replace(url, '')
		address = text.translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))
		address = address.replace('−','-')
		address = address.lstrip()
		url = url.replace('〒','')
		clipboard.set(address)
		address = address.replace(' ','\n')
		print(url)
		print( address)
```

# 終わりに
クリップボードに貼付後、変換後の文章がコンソールに表示されます。
Pythonista3:行末空白の削除

# はじめに
本コードはiOS版アプリPythonista3を用いて、クリップボードにコピーされた複数行文字列の行末の空白を削除するだけのものです。

1. 文章をクリップボードにコピー
1. Pythonista3を起動
1. 本コードを実行
1. Pythonista3のコンソールに変換後文章を吐き出す

という趣旨です。
# きっかけ
ブラウザの文字列の内容をiPhoneでコピペするときに、行末空白が邪魔だったので取りたかっただけです。
# 前準備
Pythonista3は有料です。別途お買い求めください。
# ソースコード
下記のコードを作成します。

```python:cut_spaces.py　(1)
#For Pythonista3
#Delete charactors including ' \n'
# -*- coding: utf-8 -*-
import sys
import clipboard

#----------------
#機能定義ここから
class Import_URL:  #クリップボードを取得
	global in_text  #クリップボードの中身をglobal化
	in_text = clipboard.get()

class Case_address():
		text = in_text.replace(' \n', '\n')
		text = text.rstrip()
		cutsps = text.translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))
		cutsps = cutsps.replace('−','-')
		clipboard.set(cutsps)
		print(text)
```

# 終わりに
クリップボードに貼付後、変換後の文章がコンソールに表示されます。
昔作ったツールたちを Salesforce CLI のプラグインとして書き直す

# はじめに

みなさん、こんにちは。こちらは [Salesforce Advent Calendar 2021](https://qiita.com/advent-calendar/2021/salesforce) の 21 日目のエントリになります。

気づいたらこれが今年はじめての Qiita 投稿です。自分でもびっくりするぐらい、あっという間の 2021 年でした。仕事と CTA 受験を優先してしまったことが反省ですね。

---

### [PR] 認定テクニカルアーキテクト (CTA) 試験に合格しました。

https://www.salesforce.com/jp/campaign/salesforce-certification-success-stories/article-5/

https://medium.com/takahitomiyamoto/after-a-long-journey-to-cta-what-should-i-do-next-719c49403b05

---

本エントリでは、今年の数少ない私の GitHub 活動をご紹介します。

# 昔作ったツールたちを sfdx plugin として書き直す

過去にいくつか Salesforce 開発者向けツールを Java や Gulp タスクで作っていたのですが、初期セットアップが少々面倒だったこともあり、一番簡単なのは何かなーと考えていたところ、Salesforce CLI のプラグインにすることを思いつきました。

### 旧 package.xml 生成ツール

Java で作ったツールです。初めてのアドベントカレンダーでした。懐かしいですが、いまだにぼちぼち問い合わせがあるので、根強い人気を感じます。

#### Qiita

https://qiita.com/takahito0508/items/f5dac3ac214bc75142cf

#### GitHub: salesforce-manifest-generator

https://github.com/takahitomiyamoto/salesforce-manifest-generator

<br><br>

また、ほぼ同じ仕様ですが、JavaScript で書き直し、Gulp タスクとして実行できるようにもしていました。これも Node.js に慣れてないとセットアップに手間取るかもしれないですね。

#### GitHub: sfdx-gulp-manifest

https://github.com/takahitomiyamoto/sfdx-gulp-manifest

<br><br>

### 旧 Apex 仕様書生成ツール

昔から [ApexDoc](https://github.com/SalesforceFoundation/ApexDoc) というツールに強いあこがれを持っていたこともあり、また [Tooling API](https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/intro_api_tooling.htm) の可能性に惹かれていたこともあり、勉強がてらどこまでやれるかに挑戦していました。結果、かなりの情報を自動で取得できることがわかりました。これも Gulp タスクとして実行できます。

#### GitHub: apex-specs-generator

https://github.com/takahitomiyamoto/apex-specs-generator

https://twitter.com/takahito0508/status/1311323790853509128?s=20

<br><br>

### 新しく作ったプラグイン

お待たせしました。上記のツールたちを簡単にセットアップ＆実行できるようになりました。

#### GitHub: heat-sfdx-cli

https://github.com/takahitomiyamoto/heat-sfdx-cli

#### 初期設定

インストールはコマンド一発です。便利ですね。

```sh
sfdx plugins:install heat-sfdx-cli
```

#### package.xml 生成コマンド

```sh
sfdx heat:manifest:build --apiversion 53.0 -u myOrg@example.com --recommended
```

:::note info
コマンドを実行する前に、Salesforce CLI 経由での Salesforce 組織への認証は済ませておいてください。
:::

:::note info
Metadata API の WSDL ファイルをローカルに配置する必要がありますので、 Salesforce 組織からダウンロードしておきましょう。デフォルトではプロジェクト内の config 配下に「metadata.wsdl」という名前で配置してください。

1. Salesforce にログインします。
2. 設定から、クイック検索ボックスに "API" と入力し、「API」を選択します。
3. 「メタデータ WSDL の生成」を右クリックして、WSDL ファイルを保存します。

:::

#### Apex 仕様書生成コマンド

```sh
sfdx heat:spec:apex:build --apiversion 53.0 -u myOrg@example.com -o docs
```

:::note info
コマンドを実行する前に、Salesforce CLI 経由での Salesforce 組織への認証は済ませておいてください。
:::

# さいごに

正式リリースを発表できればよかったのですが、執筆時点では残念ながらベータ公開とさせていただきます。

- sfdx heat:manifest:build
  - 一部のメタデータ名が取得できていないので取得できるようにする → `StandardValueSet` を取得できるようになりました :tada: 
 `config/environment.json` で微調整してください。
- sfdx heat:spec:apex:build
  - ApexDoc コメントを取得する機能が実装できていないので実装する

ぜひ使ってみて感想を教えてください。2022 年も引き続き更新し続けていきます！ **Happy Coding!!**
jQueryを使わずにBootstrapのモーダルを動的に表示させる

### 結論
こんな感じで書いてください。

```HTML:sample.html
<script>
    window.addEventListener('load', function() {
        const modal = new bootstrap.Modal(document.getElementById('{modalのid}')) // Modalのインスタンスを作成
        modal.show() // show()メソッドを実行
    });
</script>
```

### おまけ
Bootstrapの動的な操作を書いている記事がjQueryを使っているものばかりだったので記事を書きました。
最近BootstrapはjQueryへの依存がなくなり、ネイティブのJavaScriptでほとんどの動作ができるようになったみたいですね。

### 参考
https://getbootstrap.jp/docs/5.0/components/modal/#via-javascript
React 初期インストール手順

①下記のURLをクリックし、node.jsをダウンロードしてくる。
→LTS安定板をインストールする。
https://nodejs.org/ja/
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/5d7893f5-df0b-4581-98f6-de416f5ff5ce.png)

②インストーラを実行し、インストールしていく。
→基本的には何も変更せず、Nextを選択していく。

③コマンドプロンプトでnode -v を実行し、バージョンが表示されるか確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/582acf72-4986-eb9b-801a-37317f1e7b92.png)


④コマンドプロンプトでnpm install --global yarn を実行する。
→npmよりyarnのほうが高速で信頼度が高いので、yarnをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/f36ee1af-03e7-06c1-db98-93d2f7307a37.png)


⑤コマンドプロンプトでyarn -v でバージョンが表示されるか確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/1d574094-fa96-1fd4-ccb6-1bc55f1311b2.png)

⑥yarn global add create-react-app で必要なパッケージをインストールしてくれるcreate-react-appというツールをインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/18badc53-4a9b-7f93-9261-3a9f1d9f1e1e.png)


※これにて初期インストールは完了です。
iOS15.1をXcodeでビルドしたい時にUnsupprted OS versionになってしまうのを回避するやり方

#事象
iOS15.1にアップデートしちゃったけど、Xcode上で「Unsupprted OS version」と表示されビルド出来ない。
前回と同じようなネタだけど再現したため投稿。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90301/a9154dd6-69e0-e00c-62e8-742c40d6820f.png)

#対処策
Device Supportのフォルダの"15.0"を複製し、"15.1"にリネームする。
"15.0"が無い場合は、Xcode 13.1をダウンロードしてから抽出する。

#手順
1. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/　配下で15.0を複製する
![スクリーンショット 2021-11-09 13.51.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90301/e53d2486-2eac-e11d-92f6-1acfd5b28022.png)
![スクリーンショット 2021-11-09 13.51.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90301/81dfbe75-3f0d-c0e9-a59e-60b2632cf6da.png)


2. Xcodeを再起動すると警告が消えている
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90301/93084743-b816-edf2-0674-49005736987a.png)


#参考記事
https://stackoverflow.com/questions/67863355/xcode-12-4-unsupported-os-version-after-iphone-ios-update-14-6

#所感
やり方が毎回裏技すぎて草。
JWT アクセストークンからの個人情報漏洩

内包型アクセストークン、典型例としては JWT アクセストークンは、関連するデータを自身の内部に持っています。下記の条件が成り立つと、論理的な帰結として、そのようなアクセストークンから直接個人情報が漏洩します。

1. 個人情報が含まれている
1. 暗号化されていない
1. ステートレス
1. 意図しない者に盗まれる

ここで「ステートレス」とは、「個人情報を保存するためのデータベースレコードを認可サーバー側に持たない」ことを意味しています。

もしもアクセストークンの実装が「内包型／暗号化されていない／ステートレス」であり、また、システムがクライアントアプリケーションに個人情報を提供する必要があるなら、当該システムは、アクセストークンに情報を埋め込むことを避け、個人情報を問い合わせるための Web API を提供すべきです。

ユーザー情報エンドポイント (OIDC Core [Section 5.3](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo)) はそのような API ですが、認可サーバーが `claims` リクエストパラメーター (OIDC Core [Section 5.5](https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter)) をサポートしたければ内包型ステートレスアクセストークンは「ユーザー情報エンドポイントでどのクレーム（ユーザー属性）が要求されているか」に関する情報を含む必要があること、および、医療記録関連のクレームなどクレームによってはクレーム名の存在そのものが個人情報になりうること、について頭にとどめておいてください。

![claims-from-userinfo.ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/865b1bbf-9dc9-27f8-eca2-01d86deec415.png)

もう一つの比較的新しい懸念事項はアクセストークン内の `authorization_details` です。

[OAuth 2.0 Rich Authorization Requests](https://datatracker.ietf.org/doc/draft-ietf-oauth-rar/) (RAR) は `authorization_details` パラメーターを定義しています。このパラメーターは、認可リクエスト、トークンレスポンス、イントロスペクションレスポンス、JWT アクセストークンなど、さまざまな場所で使うことができます。

しかし、暗号化されていない JWT アクセストークンに埋め込むには、`authorization_details` の内容はあまりに詳細過ぎます。下記は RAR 仕様書から抜粋した JWT アクセストークンのペイロードの例です。この例内の `authorization_details` は購入履歴レコードの詳細情報を含んでいます。

![authorization_details-in-jwt-access-token.ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/d406400e-83d6-c17e-497d-7bb7ede9de9b.png)

**プライバシーの観点から言えば、内包型アクセストークンよりもハンドル型アクセストークンの方がはるかに良いです。**しかし、なんらかの理由により、あなたのシステムでは内包型アクセストークンを使わざるをえないかもしれません。そのような場合、**(a) アクセストークンを暗号化する、(b) 個人情報をアクセストークンに埋め込まない、のどちらか、もしくは両方を実施することが強く推奨されます。**

アクセストークンの暗号化は想像するほど単純ではありません。詳細な議論に興味があれば『[OAuth アクセストークンの実装に関する考察](https://qiita.com/TakahikoKawasaki/items/970548727761f9e02bcd)』をご覧ください。

---

本記事の英語版はこちらです→ [Leakage of Personal Information via JWT Access Token](https://darutk.medium.com/leakage-of-personal-information-via-jwt-access-token-c222a3293898)
【ITパスポート】個人的によく間違える用語まとめ

<h4>ハッカンソン</h4>
ハック&マラソン
与えられた期間内にテーマにそったアプリケーションやサービスを開発しその成果を競いあうイベント。

<h4>インターネットVPNと比較したときのIP-VPNの特徴</h4>
回線の稼働率や通信速度についてのSLAが用意され通信品質が保証される

<h4>ERPとは</h4>
Enterprise Resource Plannning
資源最適化計画

<h4>ISO9000</h4>
品質マネジメント
<h4>ISO14000</h4>
環境マネジメント
<h4>ISO27000</h4>
情報セキュリティマネジメントシステム

<h6>SQLインジェクションの対策などで用いられ，処理の誤動作を招かないように，利用者がWebサイトに入力した内容に含まれる有害な文字列を無害な文字列に置き換えることを何と呼ぶか。</h6>
サニタイジング

<h4>デュアルシステムとデュプレックスシステムのそれぞれの説明</h4>
デュアル：同じ処理を行うシステムを二重に用意し、処理結果を照合することで処理の正しさを確認する。一方に故障があれば、故障した方を切り離して処理を実行する。

デュプレックス：現用系と待機系の2つ用意しておき、現用系に障害があれば、待機系に切り替える。

<h4>デジタル署名の付与をする鍵</h4>
送信者の秘密鍵
<h4>デジタル署名の検証をする鍵</h4>
送信者の公開鍵

<h4>EDIとは</h4>
Electronic Date Interchange 電子データ交換

<h4>スケールアップとスケールアウト　それぞれの説明</h4>
スケールアップ：サーバーを構成する処理をより性能の高い（アップ！）ものに交換し、処理能力をアップさせる。
スケールアウト：サーバーの台数を増やす

<h4>CMSとは</h4>
Content Management System
HTMLやCSSの技術的な知識がなくても、テキストや画像等のコンテンツを用意できれば、Webによる情報発信を行えるように工夫されています。

<h4>TCOとは</h4>
Total Cost of Ownership
TCOは、初期投資額であるイニシャルコストと、維持管理費用であるランニングコストに大別できます。

<h4>メモリ：キャッシュメモリによく使われるのは？</h4>
SRAM. 電源供給が無くなると記憶情報も失われる揮発性メモリ
<h4>主記憶によく使われるのは？</h4>
DRAM 電源供給が無くなると記憶情報も失われる揮発性メモリ
<h4>電気的にその内容を書き換えできる不揮発性メモリは？</h4>
フラッシュメモリ

<h4>エッジコンピューティングとは？</h4>
利用者や端末と物理的に近い場所に処理装置を分散配置して、ネットワークの端点でデータ処理を行う技術の総称

<h4>プロキシサーバとは</h4>
内部ネットワーク内の端末からの要求に応じてインターネットへのアクセスを中継する装置

<h4>アクティベーション</h4>
正当な手続きを経ることによってアカウントまたはソフトウェア／ハードウェアを使用可能な(アクティブ)状態にすること

<h4>DBMSにおいて，あるサーバのデータを他のサーバに複製し，同期をとることで，可用性や性能の向上を図る手法のことを何というか</h4>
レプリケーション

<h4>Cさんの生産性は，Aさんの1.5倍，Bさんの3倍とする。AさんとBさんの2人で作業すると20日掛かるソフトウェア開発の仕事がある。これをAさんとCさんで担当した場合の作業日数は何日か。</h4>
Aさんの生産性をxとする。Bさんの生産性をyとする
C=1.5x
C=3y
1.5x=3y→x=2y
AさんとBさんの2人で作業すると20日掛かるので、
(2y+y)*20=60y
AさんとCさんで担当した場合
60y=(2y+3y)*n
60y=5Ny
60=5N
N=12

<h4>300×600ドットで構成され，1画素の情報を記録するのに24ビットを使用する画像データがある。これを150×300ドットで構成され，1画素の情報を記録するのに8ビットを使用する画像データに変換した。必要な記憶容量は何倍になるか。</h4>
データ量：180000*3=540000
データ量：45000*1=45000

<h6>IoT機器やPCに保管されているデータを暗号化するためのセキュリティチップであり，暗号化に利用する鍵などの情報をチップの内部に記憶しており，外部から内部の情報の取出しが困難な構造をもつものはどれか。</h6>
TPM(Trusted Platform Module)

<h4>RATとは何か</h4>
Remote Access Tool コンピューターを外部から遠隔操作する（されてしまう）

<h4>ICANNって何？</h4>
IPアドレス、DNSの管理など。最後のNNはnameとnubmerを指す
<h4>IEC</h4>
国際電気標準会議　International Electronic????
<h4>IEEE</h4>
Institute of Electrical and Electronics Engineers
電気工学・電子工学技術分野における国際的な標準化を行っている専門家組織
ITパスポートだと無線LAN規格である"IEEE802.11"が馴染み深い
<h4>ITU</h4>
International Telecommunication Union
国際電気通信連合

<h4>公開鍵暗号方式についての説明</h4>
送信者A、受信者Bとする。
Aさんは、Bさんの公開鍵で暗号し、受信者Bは自身の秘密鍵で復号。

<h4>デジタル署名の付与</h4>
Aさんが送る文書へのデジタル署名の付与はAさんの秘密鍵を使用して行う。
Bさんは、デジタル署名の復号をAさんの公開鍵で行う。

<h4>FTTHとは</h4>
Fiber to the home

<h6>複数の異なる周波数帯の電波を束ねることによって，無線通信の高速化や安定化を図る手法</h6>
キャリアアグリゲーション

<h4>レジスタとは</h4>
CPUが内部にもつ記憶装置。
極少量でありながら非常に高速に動作します。演算用のデータを一時的に保持したりする

<h4>BLEとは</h4>
BLE(Bluetooth Low Energy)

<h6>インターネット接続機能を有し、サーバと情報をやりとりできる自動車</h6>
コネクテッドカー
MRTK AppBarのRemoveボタンについて

# はじめに
MRTK AppBarのRemoveボタンについて、よく見てみると。。

# 導入

AppBar.csを開きます

~~~AppBar.cs
        public void OnButtonPressed(AppBarButton button)
        {
            if (Time.time < lastTimeTapped + coolDownTime)
                return;

            lastTimeTapped = Time.time;

            switch (button.ButtonType)
            {
                case ButtonTypeEnum.Remove:
                    OnClickRemove();
                    break;

                case ButtonTypeEnum.Adjust:
                    State = AppBarStateEnum.Manipulation;
                    break;

                case ButtonTypeEnum.Hide:
                    State = AppBarStateEnum.Hidden;
                    break;

                case ButtonTypeEnum.Show:
                    State = AppBarStateEnum.Default;
                    break;

                case ButtonTypeEnum.Done:
                    State = AppBarStateEnum.Default;
                    break;

                default:
                    break;
            }
        }
~~~

OnClickRemove()関数では、SetActive(false);するだけで削除されていません。

~~~AppBar.cs
        protected virtual void OnClickRemove()
        {
            // Set the app bar and bounding box to inactive
            if (Target is IBoundsTargetProvider boundsProvider && !boundsProvider.IsNull())
            {
                boundsProvider.Target.SetActive(false);
            }
            Target.gameObject.SetActive(false);
            gameObject.SetActive(false);
        }

~~~

Destroyで完全に消すといいです。
OktaのAPITokenについての覚書

# APIの権限を絞りたい場合

様々な理由によって、OktaのAPIを利用したいパターンはあると思う。
その際に問題となるのはAPITokenそのものの権限についてである。
例えば、AppAdmin権限だけのAPIToken発行をしようとすると通常は出来ない。
これはそもそもAppAdminだけだとToken発行そのものが出来ないからである。

https://help.okta.com/en/prod/Content/Topics/Security/administrators-admin-comparison.htm

# OktaのTokenとはどのようなものか。
但し、OktaのTokenは発行したユーザに紐づくため、通常は

> AさんをAdminにする
> AさんにログインしてもらいTokenを作ってもらう
> Tokenを使用してAさんの権限内のAPIを利用してもらう

という流れになる。つまり発行後に権限設定するわけではなく、発行したユーザの権限がそのまま委譲されることになるのである。

これを応用すると、AppAdmin自体は、API権限としてはアプリ関連の権限しか持たないため、ユーザー関連のAPIは利用できないが、App Adminを持つユーザにアプリに関わるGroup Adminを付加して、（SuperAdmin以外は複数のAdmin権限を一人のユーザが持つことが可能である）
APITokenを払い出せば、AppAdmin権限を持つAPITokenを払い出すことが可能である。

この場合、本当にAppAdmin権限だけが必要な場合は、Token発行後に、GroupAdmin権限をはく奪すればよい。

https://developer.okta.com/docs/guides/create-an-api-token/main/

尚、上記にも記載されているが、APITokenの有効期限はデフォルト一か月後で期限変更も不可であるが、利用する度に自動的に延伸される。
なので、全く利用しなくなったAPITokenは自動的に無効化されるためセキュリティ的にも安全である。

https://support.okta.com/help/s/article/How-an-API-Token-is-expired-and-get-deactivated?language=en_US
続TPLINK ARCHER について

毎日特定の時間に接続が切断される
--
私が使用しているIPv6はOCNの回線のものであるためか、接続から24時間すると一旦切断される仕様（？）のようで、必ず毎日接続を開始した時間に切断されるという状況がシスログにも現れている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831262/ada4eea8-493c-2a79-3030-73db83b65ecb.png)
C++で配列を文字列リテラルで初期化するときの挙動

# はじめに

当たり前のように配列を文字列リテラルで初期化するコードを皆さん書けると思います。

```cpp
char str[] = "arikitari";
```

配列の要素数を省略して書きますよね。

では明示して要素数を書いたらどうなるのでしょうか？

# 配列の要素数が文字列リテラルの要素数より小さい場合

> [[dcl.init.string]/2](https://timsong-cpp.github.io/cppwp/n3337/dcl.init.string#2)
>
> There shall not be more initializers than there are array elements. [ Example:
>
> ```cpp
> char cv[4] = "asdf";            // error
> ```
>
> is ill-formed since there is no space for the implied trailing '\0'.  — end example ]

もちろん不適格です。規格書の例では文字列リテラルの要素数はNULL終端文字を含むので5ですが初期化しようとしている配列が4ですので溢れてしまいます。

# 配列の要素数が文字列リテラルの要素数より大きい場合

文字列リテラルの要素数を超えた部分が未初期化なのか実装定義なのか明示されているのか気になりますよね？

> [[dcl.init.string]/3](https://timsong-cpp.github.io/cppwp/n3337/dcl.init.string#3)
>
> If there are fewer initializers than there are array elements, each element not explicitly initialized shall be zero-initialized ([dcl.init]).

はい。超えた部分は0初期化されるとあります。安心して使えますね。
Windows11でプロキシ設定を全ユーザに適用させる

# Windows11でプロキシ設定を全ユーザに適用させる

## はじめに

複数のローカルユーザに同一のプロキシ設定を適用する方法です。
通常はProxy.pacで自動構成されるか、ADで何とかするため、
殆どの場合、この手順が必要になることはありません。
ただ、環境要因でProxy.pacを正しく読み込めないWG環境の端末
(共有PCで複数のローカルユーザーを使い分けている)があったため、
下記手順にて解決しました。

## 条件

* Windows 11 Proであること
* 設定者は管理者権限を有していること

## ローカルグループポリシーを編集する。

### ローカルグループポリシーエディタの起動

検索窓に「gpedit」と入力し、ローカルグループポリシーエディタを起動する

### 設定を変更する

1. 「コンピュータの構成>管理用テンプレート>Windowsコンポーネント>Internet Explorer」を開く。
2. 「コンピュータ別にプロキシを設定する(ユーザ別ではなく)」の項目を開いて有効にする。

これでユーザ権限ではプロキシが変更できなくなりました。
※ この時点でユーザ権限で設定していたプロキシ設定は一度リセットされます。

以前はIEを管理者権限で開いてプロキシ設定を行うことで、
全ユーザーに対してプロキシ設定が適用されていました。

しかし、IE廃止後は上記の手順が使えなくなりましたので、次の手順を踏みます。

### IEのインターネットオプションを直接開く

IEは消えましたが、インターネットオプションは、「ファイル名を指定して実行」で
「inetcpl.cpl」を指定すれば開くことができます。

なお、普通に開くとユーザ権限で開いてしまうため、
[Ctrl]+[Shift]+[Enter]で開いてあげましょう。
エクスプローラで "C:\Windows\System32\inetcpl.cpl" にアクセスし、
右クリック→管理者権限で実行でもいいですが……。

### プロキシを設定する。

開いたインターネットオプションのウィンドウから「接続」タブを開き、「LANの設定」をクリックします。
あとはそれぞれの環境に応じたプロキシ設定を行えば完了です。

### まとめ

Windows10までのIEを使ってプロキシ設定を全ユーザに適用させる方法は多く出てきましたが、
IE廃止後はこれで対応できます。

### 参考文献

[WindowsのProxy設定を全ユーザ共通化する](https://qiita.com/ktyubeshi/items/b9c9274dd027ffdbb931)(@ktyubeshi さま)
【エラー】Invalid char `\x08' in expression

##環境
Ruby 3.0.2
Rails 6.1.4.1


##状況

見たことないエラー

```
Invalid char `\x08' in expression
```

##原因
キーボードの全角半角切り替えの際に全角のスペースが入ってしまってた。
Vscodeに「zenkaku」を入れて、もし全角スペースが入ったら可視化するようにしていたのに
このエラーが出たときは全角スペースが見えなかった！

##解決法
見えない全角スペースを削除



https://tattaka-s.hatenablog.com/entry/2019/07/06/153703
IBM Cloud Pak for Data as a Serviceで実行ランタイムを追加してNotebookと関連づける

## はじめに
IBM Cloud Pak for Data as a Service(以下CP4DaaS)のNotebookにパッケージを導入したい場合、Notebook上でpipインストールするのではなく、パッケージの導入が定義された実行ランタイムをテンプレートとして作成しておき、Notebookに関連づけておくことで、Notebookを常にパッケージが導入された状態で使うことができます。

本記事ではCP4DaaSで実行ランタイムを使う基本的な方法と、使う上で便利なTipsをご紹介します。

*****
### 環境定義の例
使い方の参考として、設定例を記載します。
CP4DaaSのGUIからプロジェクトを開き、「環境」タブで以下の操作をします。

「環境定義」セクションの右端に「新規環境定義」リンクがありますので、クリックします。
![記事4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139220/8aeb40e9-ac5e-4a9b-dc06-16dcff31fa54.png)

*****
開いた「新規環境」画面で実行ランタイムの名前を入力し、「構成の定義」に適当な設定をして「作成」をクリックします。
作成された実行ランタイムの内容が画面に表示されます。ここに、以下のように実行ランタイムに必要な定義を記入します。

「カスタマイズ」から「作成」のリンクをクリックします。
![記事4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139220/3bb1920c-eadb-8d2f-db19-bfad2e6e89ec.png)

*****
デフォルトで表示される文言に必要なpipインストールに関する追記をして、「適用」をクリックします（以下の画面赤枠の個所）。

参考まで、左側の「ソフトウェア構成の詳細」はデフォルトで導入済みのパッケージ一覧です。
![記事4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139220/4fae8724-6169-99f4-201c-b81bd7a27acf.png)

ここでは、パッケージ"ibm-watson-studio-pipelines"をpipインストールしています。
"ibm-watson-studio-pipelines"は、CP4DaaSでMLOpsのパイプラインを実現するWatson Studio PipelineのSDKです。

*****
これによって、Notebookから以下の指定をすることに相当する内容（pipインストールのアップデート）を実行ランタイムで定義していることになります。

```py
!pip install -U ibm-watson-studio-pipelines
```

*****
### Notebookからの関連づけの例
プロジェクトの「資産」タブを開きます。
Notebookセクションで実行ランタイムと関連づけをするNotebookを選び、右端のドットが３つ縦に並んだアイコンをクリックします（カーソルをあてると表示されます）。
リストから「環境の変更」を選択します。

![記事4-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139220/7ef7cd5a-1ce7-6e41-23e5-4eb237aa2a79.png)


「Notebookを実行するランタイムを選択してください」で関連付けをするランタイムを選択して「関連付け」をクリックします。

*****
### 環境起動時のログ確認方法
最後にTipsとして、実行ランタイムの実行ログを確認する方法を記載します。
Notebookから以下コマンドを実行します。

```py
! ls /var/ibm/logs/
```

ログ・ファイルとして、以下のような名前のファイルがリストされます。
customization-YYYYMMDD_HHMMSS.log

該当するファイルを以下のようにcatで表示します。

```py
! cat /var/ibm/logs/customization-20211108_073709.log
```

ログの内容を確認します。


*****
## おわりに
本記事ではCP4DaaSでNotebookを実行する際の実行ンタイムの設定について記載しました。機械学習を実装するNotebookでは前提のパッケージを実行ランタイムに導入することで、Notebook側でパッケージの導入を記述する必要がなくなるため、冗長性を排除でき、また環境構築の操作をNotebookに記述するデータ分析に関する操作と分離することができるため、管理を分かり易くする面でもおすすめです。
部分テンプレートのlocalオプションで変数指定

##環境
Ruby 3.0.2
Rails 6.1.4.1

##
form_with以下を部分テンプレートにしたいため、
localオプションで変数fを指定する。
ここではlocalオプションで変数```form```と```f```の2つ指定してることになる。

```new.html.slim
= form_with model: @user_form, url: manage_user_path, local: true do |f|
  = render 'form', form: @user_form, f: f
```

```edit.html.slim
= form_with model: @user_form, url: manage_users_path, local: true do |f|
  = render 'form', form: @user_form, f: f
```

```_form.html.slim
= f.label :number, 'No.'
  = f.number_field :number
  
= f.label :name, '名前'
  = f.text_field :name

= f.submit '保存する'
```

##参考

https://pikawaka.com/rails/partial_template#locals%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3

https://qiita.com/tanayasu1228/items/bbaca454f3cf72a22c29
R言語とExcelを用いた重回帰分析の方法3(重回帰式導出編)

重回帰分析とは、多変量解析のうち複数の説明変数と一つの目的変数が量的なデータの場合に用いることができる解析手法です。

#前回のおさらいと今回すること
無相関検定から座高、体重、足の大きさと身長は相関関係があり、説明変数として適していることがわかりました。
今回は実際に重回帰分析を行い、重回帰式の導出を行います。

#重回帰式の導出
重回帰式は下の数式のとおりで、身長を座高、体重、足の大きさから予測できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/be5943ac-0f92-ca34-7fad-8b3f3d6c6e9c.png)

重回帰式はExcelから重回帰分析することで、導出可能です。
元データは下図のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/458bb27a-d3f3-9b15-a433-a8880ed478ef.png)


Excelでの操作は以下の通りです。
1.　データ分析から「回帰分析」を選択し、「OK」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/ad302e6e-0bb3-1ec9-80f3-58867bf69490.png)

2.　入力Y範囲に身長のセルを、入力X範囲に座高、体重、足の大きさのセルを選択し、「OK」
    　　このとき身長や座高などのセルも選択し、ラベルにチェックをいれましょう。
　　実際の画面は下のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/1f939e8f-cb41-725f-e65e-44b3815efc0b.png)

すると、下のような解析結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/b6e04358-6c5a-c58f-667c-09923d85dd16.png)
赤丸で示しているところが偏回帰係数と定数項(切片)です。
重回帰分析の結果から重回帰式を導出すると下の数式になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/7510d9ef-f98b-0bca-42bd-a2a70a74dde7.png)
しかし、得られた重回帰式が信頼できるか検定を行う必要があります。

#まとめと次回の予定
・座高、体重、足の大きさから身長を予測する重回帰式を導出しました。
・次回は導出した重回帰式が信頼できるか重回帰式の検定を行います。

#あとがき
前回は記事の量が多かったので、今回は減らしました。
今後は今回くらいの量で書いていきたいと思います。

ここまでお読みいただきありがとうございます。
Linuxで正確にファイルサイズを確認する

```
find ./ -type f -printf "%s\n" |awk '{ sum += $1; }; END { print sum }'
```

###背景
大量のファイルをFTPでコピーし、差分が無いか確認する必要がありました。
そこでファイル数、ファイルサイズが合致していればOKと見なす方針で作業していましたが、FTPの失敗が無いにもかかわらずファイルサイズが合致せず苦戦。

###理由
「duコマンドはファイルに使用されているブロックサイズを表示する」ため、
```du -b ./```
だとバイト数で表示はできていても、使用しているブロックサイズをバイト単位で表示していることになるので、厳密ではありません。

そのため、記事最上部のコマンドの方が正確なファイルサイズを確認できるようです。

※初投稿です！
***
###参考
https://zuntan02.hateblo.jp/entry/2018/02/22/195151
【Swift】UIButtonに画像を表示させる方法

SwiftでUIButtonに画像を表示させる方法。

```swift
let imageButton = UIButton()

imageButton.setImage(UIImage(named:"sample")!, for: .normal)

self.view.addSubview(imageButton)
```
UIbuttonに`setImage`関数を割り当てるだけ。

https://developer.apple.com/documentation/uikit/uibutton/1623997-setimage

リファレンスによるとsetImageでは以下の宣言がなされる。

```swift
func setImage(_ image: UIImage?, 
          for state: UIControl.State)
//image
//The image to use for the specified state.

//state
//The state that uses the specified image. The values are described in UIControl.State.
```

## 参考

http://iphone-ipad-app-developer.com/2019/05/25/post-137/

https://qiita.com/_asa08_/items/c94bb1a8746f07e8933a

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
今さら聞けないGit

##まずはじめに
プログラミングを始めて恥ずかしながら、Gitに関しては毎回コマンドを調べながらで頭の中で整理されていなかったので記事投稿を機会にアウトプットしていきたいと思います。
git等のバージョン管理は何かプロジェクトをチームで作業する場合に非常に大事なことなのでこの記事をリマインドにご利用ください。

今回は[サル先生のGit入門](https://backlog.com/ja/git-tutorial/)というサイトを参考に記述しました。
[サル先生のGit入門](https://backlog.com/ja/git-tutorial/)

##Gitとは
分散型バージョン管理システムです。
ファイルの状態を好きなときに更新履歴として保存しておくことが可能。
編集したファイルを過去の状態にしたり、編集箇所の差分を見ることが可能。

```
Gitとは？
バージョン管理システム
```

また、チームで共有しているファイルがどのように編集されたかわからなくなったり、2人同時に編集してしまったために先に編集した内容が消えてしまったなどを防ぐことが可能です。

##リポジトリとは
youtubeのプログラミング広告でもよく聞くワードですね。
リポジトリとはファイルやディレクトリ(フォルダ)を保存する場所です。(箱のようなものですね)
gitのリポジトリはリモートリポジトリとローカルリポジトリと2種類に分けられます。

```
リモートリポジトリとローカルリポジトリ
```
####リモートリポジトリ
専用のサーバに配置して複数人で共有するためのリポジトリ
####ローカルリポジトリ
ユーザーの手元のマシン(PC)に配置するリポジトリ

##コミットとは
リポジトリにファイルやディレクトリの追加、変更を実行する操作。

```
コミットとは？
リポジトリにファイルやディレクトリの追加、変更を実行。
```


コミットを実行すると前回コミットした時の状態から現在の状態までの差分を記録したコミット(リビジョン)が作成されます。


```
リビジョンとは？
前回コミットした時の状態から現在の状態までの差分。
```

コミット実行時にはコミットメッセージの入力が必須です。
コミットメッセージはチームメンバーや自身があとで履歴を見直す情報となるためわかりやすく丁寧に書くよう心がけましょう。


````
//標準的なコミットメッセージ
1行目：コミットの変更内容の要約
2行目：空行
3行目：変更した理由
````

##ワークツリーとインデックス
####ワークツリーとは
Git管理下で実際に作業されているディレクトリをワークツリーと呼びます。
###インデックスとは
リポジトリとワークツリーの間のコミットを準備するためのフォルダをインデックスと呼びます。
・インデックスを間に挟むことでワークツリー内の不必要なファイルを含めずにコミットを行ったり、ファイルの一部の変更だけをインデックスに登録してコミットが可能。

```
ワークツリーとは?
実際に作業されているディレクトリ

インデックスとは?
リポジトリとワークツリーの間のコミットを準備するためのフォルダ
```

##まとめ
Gitについての基本的な概念を解説しました。
ご参考にして下さい。

##参考文献サイト
この記事は以下の情報を参考にして執筆しました。

[サル先生のGit入門](https://backlog.com/ja/git-tutorial/)
【ITパスポート】ディジタル署名・公開鍵暗号方式の使用する鍵を整理する

<h1>初めに</h1>
ITパスポートでも基本情報でも出てくるのが、
「公開鍵暗号方式」「共通鍵暗号方式」「ディジタル署名の付与」ですが、
誰の何の鍵を使うのかが、いっっつもごちゃごちゃになるので、まとめました。

<h6>「ディジタル署名」→「公開鍵暗号方式」→「共通鍵暗号方式」
→理解のための演習問題</h6>という順番でまとめます。

<h1>①ディジタル署名</h1>

<h4>ディジタル署名とは</h4>
「公開鍵暗号方式」を使って、データに電子的に署名をし、
データが改ざんされてないことを明らかにする。
鍵を使って署名を行いますが、どの鍵を使うのでしょうか。

<h4>ディジタル署名の流れ</h4>

![スクリーンショット 2021-11-09 11.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/eb704867-ad47-9b8c-0d7a-00d9e9e8483a.png)


<h4>「どの鍵を使うのか」</h4>
企業では請求書等を送る際に使用されるそうです。
「どの鍵を使うのか」覚えるためには
<h6>ディジタル署名の目的</h6>を思えれば簡単です！！


<h4>データが改ざんされてないことを明らかにするのが目的</h4>
データが改ざんされてないことを明らかにするのが目的なので、
```「特定の人が暗号化できて誰でも復号できる」```のが特徴です。

見積書の作成で言うと、この見積書の出所（誰が責任持って作成したわけ？？）というところは
はっきりさせたいので「特定の人が暗号化」というところが重要です。

「特定の人が暗号化」となると、暗号化に使うのは、
```「送信者の秘密鍵」```
復号は複数の人ができるので、復号に使うのは、
```「送信者の公開鍵」```

:point_up:「受信者の公開鍵」と間違えそうなのですが、送信者は見積もり書を暗号化して送る際に、
公開鍵と秘密鍵のペアを作成しています。
なので、そこで作成した「送信者の公開鍵」を使用して復号します。

```:ディジタル署名のまとめ
ディジタル署名の目的は「改ざん、なりすましの防止」
「特定の人が暗号化できて、復号は複数人ができる」ところが特徴。

そのため、暗号化には「送信者」の「秘密鍵」。
復号化にはそのペアである「送信者」の「公開鍵」を使用する
```

<h1>②公開鍵暗号方式</h1>
続いて公開鍵暗号方式です。
ディジタル署名の逆で```「暗号は誰でもできるけど、復号は特定の人しかできない」```のが特徴です。

<h4>公開鍵暗号方式の流れ</h4>

![スクリーンショット 2021-11-09 12.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/b7f0209f-ad4a-ceb3-a38a-667f50ac2ecd.png)


<h4>どの鍵を使用するのか</h4>
ディジタル署名の逆です。
受信者側の鍵を使います。

暗号化は誰でもできるので、
```「受信者の公開鍵」```を使用し暗号化し、
復号は特定の人のみなので、
```「受信者の秘密鍵」```を使用します。

```:公開鍵暗号方式のまとめ
「複数の人が暗号化できて、特定の人のみ復号できる」ところが特徴。
→ディジタル署名の逆！！！

そのため、暗号化には「受信者」の「公開鍵」。
復号化にはそのペアである「受信者」の「秘密鍵」を使用する
→鍵の持ち主も、ディジタル署名の逆！！！
→使う鍵も、ディジタル署名の逆！！！
```

<h1>③共通鍵暗号方式</h1>
これが一番簡単です。
暗号も復号も同じ鍵（共通鍵）で行います。
家の鍵と同じですね。

<h1>④演習問題</h1>
ITパスポートの問題を使用して理解を深めます。


①AさんはBさんの公開鍵をもっている。Bさんの公開鍵を使ってAさんができることはどれか。
ア：Aさんのディジタル署名を作成でき，Bさんへの通信に付与する。
イ：Bさんが確実に受け取ったという通知を自動返信させることができる電子メールを送信する。
ウ：Bさんだけが復号できる暗号文を作成する。
エ：Bさんへの通信の内容が改ざんされた場合に，Aさんが検知できる。

②文書をAさんからBさんに送るとき，公開鍵暗号方式を用いた暗号化とディジタル署名によって，セキュリティを確保したい。このとき，Aさんの公開鍵が使われる場面はどれか。
ア：Aさんが送る文書の暗号化
イ：Aさんが送る文書へのディジタル署名の付与
ウ：Bさんが受け取った文書に付与されたディジタル署名の検証
エ：Bさんが受け取った文書の復号

回答
①ウ
②ウ



終わりです。
【FormObject】バリデーションpresenceとuniquenessをどこに書くか

##環境
Ruby 3.0.2
Rails 6.1.4.1


##FormObject
バリデーションの記述はModelではなくFormObjectに切り出したほうがよいという内容の記事を見つけた。

ActiveModel::ModelをincludeしてればModel同様にバリデーションを書ける。
バリデーションpresenceはFormObjectに切り出す。

```app/forms/employee_form.rb
class EmployeeForm
  include ActiveModel::Model

  with_options presence: true do
    validates :firstname
    validates :lastname
  end
end
```

バリデーションuniquenessはDBとやり取りして判定するバリデーションのため、Modelの方に書く。

```app/models/employee.rb
class Employee < ApplicationRecord
  validates :number, presence: true, uniqueness: true
  validates :email, presence: true, uniqueness: true
end
```

https://qiita.com/shxun6934/items/4b1c788a5af6a8a08dec