OmniAICreator/Qiita-1.07M huggingface dataset:
「ActiveModel::ForbiddenAttributesErrorの対処方法

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#なぜエラーが発生したか？
このエラーが起きた状況は、Active Adminで作成したユーザー管理画面において編集機能を追加するために
actionsに:editを追加した所、[Routing Error No route matches [PATCH] "/admin/users/1"が発生](https://qiita.com/hirokik-0076/items/84123e00432087cf15ba/)
して、それを解決した後、編集したデータを更新した際に発生いたしました。

```ruby

ActiveModel::ForbiddenAttributesError in Admin::UsersController#update
ActiveModel::ForbiddenAttributesError
```

##なんのエラーか？

A（アンサー）:Strong Parameters(ストロングパラメータ）関連のエラー

[ActiveAdmin リソースの扱い](https://qiita.com/maangie/items/51348ec584dd3e750f99#strong-parameters-%E3%81%AE%E8%A8%AD%E5%AE%9A/)

>Rails 4 では attr_accessible の代わりに Strong Parameters が導入されました。これはホワイトリスト化されたアトリビュートをモデルからコントローラへ渡します。
どのパラメータが変化するかを定義する permit_params メソッドを用います。

[Action Controller の概要 - Railsガイド](https://qiita.com/hirokik-0076/items/84123e00432087cf15ba/)
>例えば、ブログを投稿するフォームを考えると公開日時や更新日時をユーザからのリクエストに基づいて設定できるというよりは、サーバ側でのレコード作成・更新の時間を記録するという場合が考えられます。
この例のようにクライアント側にどういったパラメータでのモデルの作成・更新を許可するか？というのを設定するのがストロングパラメータです。このストロングパラメータを介さずにモデルを作成・更新を行おうとすると冒頭で説明したActiveModel::ForbiddenAttributesErrorが発生します。


今回の場合、ユーザー情報の値を編集し、新しい値を更新しようとした場合どのパラメータの更新を許可するかを設定していないことが原因でした。

#解決方法

####参考記事

・[Strong Parameters について調べてみた（ActiveAdminの対応も含む）](https://qiita.com/yusabana/items/78e8d1ed64ead5fe9e29/)

>ActiveAdmin Controllerの場合
冒頭にactive_admin:installで自動生成されたadmin_user.rbの controller do ブロックの中を書き換えます。

僕の場合は、admin/user.rbだったので

```admin/user.rb

ActiveAdmin.register User do
…省略
  controller do
    def permitted_params
       {user: params.require(:user).permit(:email, :password, :password_confirmation)}
    end
  end
…省略
end
```

また、こちらの方法でもできました！

```admin/user.rb

ActiveAdmin.register User do
…省略
  permit_params :email, :password, :password_confirmation
```

こんな感じに自分の環境用に変更が必要な値を設置したら無事解決いたしました。

##参考にした記事
・[【Rails】パラメータからcreateするときにはまったところメモ](https://qiita.com/s-mori/items/d1b90d35fac26190c695/)
・[I got ActiveModel::ForbiddenAttributesError, can't fix it. Please help.](https://github.com/activeadmin/activeadmin/issues/2569/)
・[リクエストパラメータの検証を行うStrongParameter(ストロングパラメータ）](https://web-nari.net/2018/10/13/about-strong-parameter//)
・[ネストするStrong Parametersの書きかた](https://qiita.com/kymmt90/items/4ce8618ca8f537b2ef7e/)
・[how to permit an array with strong parameters](https://stackoverflow.com/questions/16549382/how-to-permit-an-array-with-strong-parameters/30285592#30285592/)
Markdown テーブル セル内で改行を行う方法

# 目的

- Markdown内のテーブル内のセルで改行を行う方法をまとめる

# 結論

- 改行したい箇所に`<br>`を入れることで改行を行うことが可能である。
- `<br><br>`とする事によりセル内に空の行を挿入することも可能である。

# 書き方の例

- 下記にMarkdownで記載したテーブルのセル内で改行を行う方法をまとめる

    ```markdown
    |  | 見出しA | 見出しB |
    |---|---|---|
    | 情報1 | A<br>B<br>C<br>D | A<br>B<br>C<br>D<br>E |
    ```

- 下記に先に記載したテーブルのサンプルコードのプレビューを記載する。

    |  | 見出しA | 見出しB |
    |---|---|---|
    | 情報1 | A<br>B<br>C<br>D | A<br>B<br>C<br>D<br>E |
Visual Studio Codeのインストールと設定

#Visual Studio Codeのインストール
[こちら](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)から取得

#拡張機能のインストール
拡張機能は左メニューのこのボタンからインストールします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/30792e59-8eef-297c-2bc5-0fba93e6edc9.png)

#Nord Themeのインストール
北欧風のテーマ。妙にカラフルな見た目になってしまうダークテーマが多い中見やすいので気に入っています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/7d818e5b-541c-71f7-606b-009b4da4011d.png)

テーマの変更はcommand+shift+pを押して、テーマの変更コマンドを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/8322ba1b-8ad8-ba14-b5c9-b0db2906dc6a.png)


#便利な拡張機能

##Japanese Language Pack for Visual Studio Code
はじめは気合で英語のまま使ってもいいかもしれません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/a72d73be-863e-434c-b914-2771214de9f6.png)

##indent-rainbow
インデントの深さに応じて色を変えてくれます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/c2c2abed-3b2d-b194-022b-a518da847f08.png)

##Bracket Pair Colorizer
括弧のペアに色をつけてくれます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/b7f0a41c-24a8-1f77-2442-7dc8c76b7ce4.png)

#Bookmarks
ブックマークしたりリストにしたりできます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/e4e40295-d145-e6fe-cb2f-b39906be25c2.png)

#GitLens
コミットの差分を見たり、`git blame`の代わりに使えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/de0334dd-ee75-e3dd-2ed7-d07ef5db5062.png)

#Kanban
かんばんボードでタスク管理ができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/8b2c51ab-619d-e1f4-499f-d3716ece848c.png)

##その他
自分がよく使う言語で検索して、インストール数上位の拡張機能をインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/6b890302-904b-524f-1eb3-49102eb344e3.png)


#設定の変更

##ファイルを新規タブで開くようにする
設定から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/fcd0c46e-9db4-370e-2e1b-a86a152267cb.png)

`workbench.editor.enable`と検索して

`Workbench › Editor: Enable Preview`
`Workbench › Editor: Enable Preview From Quick Open`
両方のチェックをOFFにします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562849/cc56dc74-68a8-0dad-f813-771855bf2252.png)
俺でもわかるterraformでRDS MySQLにAuroraをReplication Slaveとして従えさせるアレ

俺です。
AuroraだからReder追加もハナホジだぜって思ってよく見たらRDS MySQLだった。
なんてことがたまにありますよね。

ちょいちょいとAuroraをSlaveとして追加してRDS MySQLを捨てればいいんですがterraformで書くときはaws_rds_clusterのreplication_source_identifierを使うと良いですという話です。

production環境におけるMasterのRDS MySQLを捨てるタイミングは
メンテをいれよう。な！

```
resource "aws_rds_cluster_instance" "aurora" {
  identifier_prefix                   = "unko"
  cluster_identifier           = "${aws_rds_cluster.aurora.id}"
  instance_class               = "db.t3.small"
  engine                       = "aurora-mysql"
  engine_version               = "5.7.mysql_aurora.2.07.0"
  count                        = 2
  auto_minor_version_upgrade   = "true"
  preferred_maintenance_window = "Mon:00:00-Mon:01:00"
}

resource "aws_rds_cluster" "aurora" {
  cluster_identifier              = "unko"
  replication_source_identifier   = "${aws_db_instance.db.arn}"
  engine                          = "aurora-mysql"
  engine_version                  = "5.7.mysql_aurora.2.07.0"
  db_subnet_group_name            = "unko"
  db_cluster_parameter_group_name = "unko"
  database_name                   = "unko"
  master_username                 = "unko"
  master_password                 = "unkoUnk0"
  backup_retention_period         = 5
  preferred_backup_window         = "09:00-10:00"
  vpc_security_group_ids          = ["sg-123456789abcde"]
}
```

おわり
RSAの仕組みを極限まで簡単に説明してみる

# きっかけ
現在使われている暗号の中で、一番処理の流れを紹介しやすいのはRSAだと思っています。
特に数学が嫌いな人に暗号化/復号の説明をするとごちゃごちゃしてしまうので、頭の整理がてらアウトプットします。

# 検証環境
python3.7.2

# 実際に計算してみる
何はともあれ、まずは計算してみましょう。
鍵情報は下記を例にやってみます。

+ p = 8 # 平文
+ public_key = 3 # 公開鍵
+ private_key = 7 # 秘密鍵
+ number = 33 # 共有情報(公開してOK) ※公開鍵を(3, 33)のペア、秘密鍵を(7, 33)のペアと書くことも多いです。

Pythonでも定義しておきましょう。

```python
>>> text = 8
>>> public_key = 3
>>> private_key = 7
>>> number = 33
```

## 暗号化
RSAの計算方法はとてもシンプルです。

1. 平文の数字を公開鍵の回数だけ掛けます
2. 1の計算結果を共有情報で割り、その余りを暗号文とします

簡単ですね。Pythonでは1行で書けます。

```python
>>> encrypt = ( text ** public_key ) % number
>>> print(encrypt)
17
```

## 復号
RSAの凄いところは、復号の手順も暗号化と同じというところです。
使う鍵だけ変わります。

1. 暗号文の数字を秘密鍵の回数だけ掛けます
2. 1の計算結果を共有情報で割り、その余りを復号文とします(平文と一致します)

```python
>>> decrypt = ( encrypt ** private_key ) % number
>>> print(decrypt)
8
>>> text == decrypt
True
```

## 電子署名への応用
RSAのさらに凄いところは、このアルゴリズムを電子署名にも活用できることです。
つまり、秘密鍵で暗号化して公開鍵で復号できる、ということですね。
※今回は動きだけ紹介するので、平文データでまるっと署名しています

```python
>>> fingerprint = ( text ** private_key ) % number # 署名
>>> print(fingerprint)
2
>>> verification = ( fingerprint ** public_key ) % number # 署名検証
>>> print(verification)
8
>>> verification == text
True
```

# 解説
## 数学的背景(を少しだけ)
今回は**数をある数字で割った余り**という世界でのお話です。
今回は、number = 33 で割った余りの世界で話を進めました。

コンピュータの世界で登場する数字は日常生活と同じく無限に続くものですが、
これを「ある数で割った余り」という視点で見ることで、登場する数字は有限になります。
今回もどんな計算を行っても33で割った余りは必ず、「0 ~ 32」の33種類になります。

無限に続く数を有限個で表現しなくてはいけないので、当然計算結果には「被り」が出てきます。
10で割った余りを考えるとわかりやすいですね。1も11も21も1111もすべて、10で割った余りの世界では「1」です。

RSAでは下記のような数学的性質を利用しています(実際はもっと色々な前提条件があります)。
「**mで割った余りの世界において、ある数nを何度か掛けるとn自身になる**」
今回の例では、平文8を**21回かけて33で割った余り**は8自身になります。平文の値を変えても同様です。

```python
>>> ( 8 ** 21 ) % 33
8
>>> ( 5 ** 21 ) % 33
5
>>> ( 19 ** 21 ) % 33
19
```

また掛け算のルールとして、下記実行結果のように21 = 3 × 7と**分割して計算することもできます**。
この場合、8を3回掛けた結果を7回掛けても、8を7回掛けた結果を3回掛けても結果は同じです。
※周りくどい言い方になっていますが、高校でやる指数計算のルールです。

```python
>>> ( 8 ** 21 ) % 33 # 元の式
8
>>> (( 8 ** 3 ) ** 7 ) % 33 # 元の式を変形したもの
8
>>> (( 8 ** 7 ) ** 3 ) % 33 # 元の式を変形したもの
8
```

今回は、3と7をそれぞれ公開鍵、秘密鍵としたことによって、平文"8"とは全く異なる"17"や"2"という暗号文を作ることができ、
またそれを"8"に戻すことができたということになります。
勿論、33や21というキーナンバーは適当に作ったわけではなく、様々な数学的性質のお膳立てがあるわけなのですが、次のトピックで。

## 暗号の強度について
今回出てきたnumberで指定した値33は、「3 × 11」という2つの数の積から作られています。
実はこの2数がとても重要で、21回掛けるという回数もこの2数から計算で導かれたものです。
さらに言うと、鍵の3や7といった数字もこの2数から始まり計算で求まりました。
裏を返すと、numberの値が何の数の積であるかがバレると、公開鍵の情報と計算で秘密鍵が特定されます。

この2数は、**素数**と呼ばれる特別な整数を使用します。
素数の性質により、numberは**ただ1つの組み合わせ**からしか存在しない数となります。
暗号強度の問題からnumberはとてつもなく大きな数をとるため、その中からたった一組のペアを探し出すのは至難の業です。
ちなみにwikipedia先生によると、現在知られている素数は[(10進数で)24桁の中に約184垓個存在するみたいです](https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0%E3%81%AE%E4%B8%80%E8%A6%A7)。
ちなみに、このペア探しは数学的に効率のいい探し方が見つかっておらず、素数リスト184垓個の総当たりと大きく変わりません。
逆に、効率の良いペア探しの方法が見つかった瞬間、RSAアルゴリズムの安全性は破綻します。

## 何故RSA暗号は暗号処理に時間がかかるのか？
またまたwikipedia先生によると、現在見つかっている最大の素数は(10進数で)[24,862,048 桁あるそうです](https://ja.wikipedia.org/wiki/%E5%B7%A8%E5%A4%A7%E3%81%AA%E7%B4%A0%E6%95%B0%E3%81%AE%E4%B8%80%E8%A6%A7)。
極端な話、これを使ってnumberを求めると単純計算49724096桁。さすがのコンピュータも時間がかかりますｗ

暗号強度の話とも関わりますが、この計算に時間がかかることと効率のよい探索方法が見つからないことがRSAの強みでもあるのです。

# おわりに
数学用語は極力使わないようにしました。余計見づらくなった気がしなくもない。。。
前提条件の補足が足りないところも多いのですが、これでざっくりと暗号/復号の流れをイメージできたら幸いです。
2020年プルリクテンプレート

## 概要

* なぜこの変更をするのか、

## 該当タスク
[タイトル](URL)

## DB変更内容
```sql
db内容を記載
```
## 動作確認方法_担当者

#### 確認1

- [ ] 確認したいことなど

```

・リクエストURL
[POST] /api/
[GET] /api/
[PUT] /api/
[DELETE] /api/

・リクエストjson

・レスポンスjson

```

#### 確認2


- [ ] 確認したいことなど

```
・リクエストURL
[POST] /api/
[GET] /api/
[PUT] /api/
[DELETE] /api/

・リクエストjson

・レスポンスjson

```
apache-ログ分析ワンライナー

最近よく使ってるやつ

一応ログフォーマットはデフォルト用。
環境に応じてawkの引数を変えることで独自フォーマットなどにも対応可能(な、はず)。

``` bash
# アクセス元 IP の一覧
$ cat /var/log/httpd/access_log | cut -d ” ” -f 1 | sort | uniq

# ユーザエージェントの一覧
$ cat /var/log/httpd/access_log | awk -F ‘”‘ ‘{ print $6 }’ | sort | uniq

# リファラ別
$ cat /var/log/apache/access.log|awk '{print $11}'|sort|uniq -c|sort -n

# ブラウザ毎のアクセス数
$ for UA in MSIE Firefox Chrome; do COUNT=`grep “$UA” /var/log/httpd/access_log | wc -l`; echo “$UA : $COUNT”; done

# 特定ファイルへのアクセス数を抽出
$ cat /var/log/httpd/access.log | grep favicon.ico | wc -l
```

awkを使ったログの時間範囲指定
時間フォーマットはシスログならシスログ、apacheならapacheの時間フォーマットを指定できる。

``` bash
$ cat file | awk -F - '"開始時間" < $1 && $1 <= "終了時間"'
```

grepのバッファを無くしてリアルタイムでtail -f

``` bash
$ tail -f file | grep --line-buffered "word"
```
ROSでRealSenseを真面目に動かしてみる３

#ROSでラジコンのモータを動かす前に
開発環境が整ってないうえに、作ったものを保存することもできません。
本格的に行う前にgithubには成果物を保存できるようにしておきたいです。
githubはpullしたことないので、ちゃんと設定してみます。

##VSCodeを入れよう
ソースコード書くことも増えてきたし、PC立ち上げてリモートするのが面倒になってきたのでVSCodeを入れたくなりましたが、ビルドとか超めんどくさそうです。

こちらでビルド済みのバイナリが配布されています。
[Getting Started with IoT Edge Development on Nvidia Jetson Devices](https://dev.to/azure/getting-started-with-iot-edge-development-on-nvidia-jetson-devices-2dfl)

```
curl -L https://github.com/toolboc/vscode/releases/download/1.32.3/code-oss_1.32.3-arm64.deb -o code-oss_1.32.3-arm64.deb
sudo dpkg -i code-oss_1.32.3-arm64.deb
```

あっさりインストールできます。感謝。

```
code-oss
```

これで実行して、画面を開くことができます。

##gitの設定もしよう
ここを参考にgitの設定。

[VSCodeでのGitの基本操作まとめ](https://qiita.com/y-tsutsu/items/2ba96b16b220fb5913be)

```
git config --global user.name 'username'
git config --global user.email 'username@example.com'
git config --global core.editor 'code-oss --wait'
git config --global merge.tool 'code-oss --wait "$MERGED"'
git config --global push.default simple
```

日本語化もしておきます。
[Visual Studio Codeを日本語化する方法](https://qiita.com/HiroCh/items/481adfa969dbe689f566)

##githubにもつないでおこう

[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)

公開鍵とか設定してgithubと連動します。
SSHのキーを出力してcatで出力。コピーしてペースト。
※やらなくてもアクセスできるけど、いちいちパスワード入力を求められるので超面倒です。

```
cd ~/.ssh
ssh-keygen -t rsa
#enter key x 3 で飛ばしてOK
cat id_rsa.pub 
#catで出てきたテキストをコピーしてgithubに張り付け
```

Windows10からもアクセスできるように設定

```
ssh-keygen
clip < id_rsa.pub
#クリップボードに入るのでgithubにコピー
```

アクセスできるか確認します。

```
ssh -T git@github.com
```
と入力して、下のようなフレーズが返ってこればOK。

```
Hi xxxxxx! You've successfully authenticated, but GitHub does not provide shell access.
```

クローンしてみます。

```
git clone git@github.com:xxxx/ros_xxxxx.git
```
これでros_xxxxxディレクトリが作られて、ローカルにgithubのファイルがコピーされました。
作ったディレクトリをVSCodeで開いて、githubにpushすることもできました。
これで安心です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/3fb8f5b2-516f-6d06-689f-95062301acac.png)


SDカードのバックアップも取っておきたい。
環境が壊れたら泣けますので、バックアップを作っておきたいところ。

[続き](https://qiita.com/t_kumazawa/items/70a7583c49d2f3d7231e)
GASスプレッドシート　複数シート検索

[Question](https://teratail.com/questions/233937) deletion requested.

```javascript
function myFunction(needle) {
    const range = SpreadsheetApp.getActive().createTextFinder(needle).findNext();
    if (range === null) return [];
    return [range.getSheet().getName(), range.getRow];
}
```
FuzeDriveを使ってみる

データドライブは大容量を確保したいけどHDDは遅いし… と、以前からAMDの[StoreMI](https://www.amd.com/ja/technologies/store-mi)をうらやましく思っていたのですが、同じ機能のFuzeDriveがIntel CPUに対応したとのことなので導入してみました。
**※ただしStoreMIと違いFuzeDriveは有料**
FuzeDriveは最近のバージョンの紹介記事、インストール説明等の記事がなかなか無かったので、最新バージョンのインストール、設定時に気づいたこととかをメモっておきます。

# 環境
- Windows10
- CPU Intel i7-7700
- FuzeDrive 1.5.3
    - Fast Tier: Crucial MX500 240GB
    - Slow Tier: Seagate Barracuda ST3000 3TB

**※ブートドライブではなくデータドライブを高速化しています**

# FuzeDriveとは
https://www.enmotus.com/fuzedrive
高速のストレージ(Fast Tier:主にSSD)と低速大容量のストレージ(Slow Tier:HDD)を組み合わせて1つのドライブに統合し、使用頻度の高いデータをSSDに格納するようにして、HDDの大容量とSSDの速度を両立するストレージ高速化技術。
同じコンセプトのIntel Optane Memoryと比較すると導入の敷居が格段に低い。

- Optane Memoryは16GB, 32GBしかないが、FuzeDriveは市販のSSDを使用できるので、Fast Tierの容量がでかい
- Optane MemoryはBIOSの設定がどうとか導入の敷居が高そうだが、FuzeDriveは**(データドライブの高速化なら)**アプリをインストールするだけでよい

# ダウンロードとインストール
[公式サイト](https://www.enmotus.com/fuzedrive)のShopから購入してダウンロードするだけ。

- 価格の違いはFastTierに設定できる最大容量と、RAMキャッシュの最大容量のみ。お好みで
- 購入ページにパッケージっぽい画像があり、かつ購入時に住所の入力を求められるので「まさかパッケージソフト!?」と少し不安になるが、無論ダウンロード販売で、ライセンスキーはすぐにメールで届く

## インストール
- ダウンロードしたインストーラを実行するだけ
- 過去バージョンのインストール記事に「JREのインストールが必須」「インストールしとかないと大変」といった記事が散見されるが、FuzeDriveのインストーラが勝手にOpenJDKをインストールするので特に意識する必要は無い

# 実行
- 起動したら左下の`License`から、メールで届いたライセンスキーを入力してアクティベートする
- 旧バージョンはBOOTドライブの高速化/既存のデータドライブの高速化/新規FuzeDrive作成等のメニューがあったが、Ver1.5は`Create Tier`とRAM Cacheの設定`Enable RAM Cache`しかない。BOOTドライブの高速化/データドライブの高速化はいずれも`Create Tier`から行う
- `Create Tier`を選択すると`Creating Tier with Boot Drive?`と聞かれる。ブートドライブを高速化したいならYES。データドライブを高速化したいの場合はNo
- 次の画面でFast Tier, Slow Tierにするドライブを選択する
 - ただしこの時、**選択するドライブの両方にパーティションが存在しない、または片方にのみパーティションが存在する状態でなければならない**
  - Fast, Slowの両方のドライブにパーティションが存在すると"only one drive may have a partition"エラーが出て先に進めない
  - 要は既存のデータドライブを、データをそのままに高速化したいときは、Fast Tierには未フォーマットの(SSD)ドライブを指定するのが確実
- 設定に問題が無ければ"Yes"だの"Next"だので先に進むだけ。既存ドライブの高速化は、2TBのドライブでも数分で終わった

これで終了。既存のドライブはFast Tier+Slow Tierの容量の、高速化されたドライブになります。

# メモ
- タスクバーのアイコンのマウスオーバーで表示される`Promoted`は「Fast Tierに入っている容量」、`In Queue`は「Slow Tierに入っているけど、これからFast Tierに入る容量」
【STS】プロジェクトのオーバーラップでエラー

<h2 class = "">結論</h2>
問題解決に参考になった記事

https://qiita.com/yaju/items/225054aa252ed8325df0

<h2 class = "">問題</h2>
<p>/pom.xmlがインポートできなかった。</p>

<h2 class = "">原因</h2>
<p>プロジェクト作成時にデフォルトのロケーションが「USERS/NAME/Downloads/hajiboot」 になっていた。</p>

<h2 class = "">解決方法</h2>
<p>ファイル→ワークスペースの切り替え→「USERS/NAME/Documents/Workspace-spring-tool-suite-4-4.4.1.RELEASE」 に変更。</p>
SQLのチョット便利な記述方法 IN句

## 通常の使い方
`WHERE a IN(1,2,3)` など

## チョット便利な使い方
**条件の羅列にテーブルのカラムや関数を指定することが出来ます。**

いずれかの列に1が設定されているか判定したい時
`WHERE 1 IN(列1,列2,列3)`

列1～列5のうち、いずれかの値が等しいカラムが存在するか判定したい時

```sql 
WHERE 列1 IN(列2,列3,列4,列5)
   OR 列2 IN(    列3,列4,列5)
   OR 列3 IN(        列4,列5)
   OR 列4 IN(            列5)
```


いずれかの列に0以外の数値(正数)が設定されているか判定したい時
`WHERE 1 IN(SGN(列1),SGN(列2),SGN(列3))`
※SGN()関数：プラスの数値の時は1を返す(DBMSによってはSIGN）

こんなことも可能
`WHERE TRUE IN(a=x,b=y,c=z)`
※ACCESSで確認済み

2023.6.13追記
列1～列5のうち、すべてのカラムの値が等しいか判定したい時

```sql 
WHERE (列1,列1,列1,列1) IN((列2,列3,列4,列5))
--DBMSによっては
--WHERE (列1,列1,列1,列1) = (列2,列3,列4,列5)
```



## どんな時に使うのか
判定条件にANDとORが混在するとき、ORの部分をIN句にすれば、可読性があがります。

## BETWEEN句も同様
IN句と同様にテーブルのカラムを指定することが出来ます。
`WHERE 50 BETWEEN 列1 AND 列2`
AWS Lambda における Python 2.7 ランタイムのサポート(2021.3更新)


## 2021/3/25 追記
AWS Compute Blog にて AWS Lambda における Python 2.7 ランタイムのサポート終了が発表されました。

https://aws.amazon.com/jp/blogs/compute/announcing-end-of-support-for-python-2-7-in-aws-lambda/

2021/7/15 以降、Python 2.7 ランタイムが非推奨となり、セキュリティパッチやその他の更新が適用されなくなります。また新規作成が不可になります。
2021/9/30 以降、既存の関数の更新ができなくなります。

コンテナイメージでデプロイしている場合は引き続き作成と更新が可能ですが、AWS 提供のベースイメージはアップデートされなくなるため、セキュリティアップデートを行う責任はユーザーにあります。

---
以下は 2020年1月 記載内容

## Python 2.7 のサポート終了
2020年1月1日に Python 2.7 のサポートが終了しました。（[PEP 373](https://www.python.org/dev/peps/pep-0373/)）
2系の最終リリースである python 2.7.18 のリリースは2020年4月に予定されています。

## AWS Lambda における Python 2.7 ランタイムのサポート
AWS LambdaにおけるPython2.7ランタイムについては、2020年1月時点では廃止予定は
アナウンスされておらず、引き続き作成、更新、実行が可能です。

> Python 2.7 reached end-of-life on January 1st, 2020. However, the Python 2.7 runtime is still
> supported and is not scheduled to be deprecated at this time.

https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html

また1月2日のAWS Compute Blogで少なくとも2020年12月31日まで重要なセキュリティパッチが
提供されるとアナウンスされています。

> To allow you additional time to prepare, AWS Lambda will continue to provide critical security
> patches for the Python 2.7 runtime until at least December 31, 2020. 


https://aws.amazon.com/jp/blogs/compute/continued-support-for-python-2-7-on-aws-lambda/

ただしこれらの対応はPythonインタプリタや標準ライブラリに対するもので
サードパーティのライブラリを使用している場合、その部分については対象外です。

2020年1月現在、AWS Lambdaのランタイムとしては継続的にサポートされますが
これらの状況を考慮すると、Python 2.7のLambda関数が稼働中の場合は
Python3系への移行を進める必要があります。

以上です。
参考になれば幸いです。
Android HCE 調査メモ（その２）

# 目的
Android HSEに対し、PC(PC/SC)からの接続を確認します。


# 環境
今回は以下の機種で動作確認しました。
#### Android側
- ビルド環境
  - Android Studio 3.5.3
- 端末
  - Sony SO-3L
  - Android 9.0 (API level 28)

#### PC側
- NFCリーダ
 - ACR1251CL-NTTCom
   (PC/SCモードで使用)
- OS
  - Windows 10 64bit
- 言語
  - Python 3.8.0


# Android側

前回の記事を参照ください。
[Android HCE 調査メモ（その１）](https://qiita.com/tkhr68000/items/66de411d5eb007fea3ca)

AIDは「F222222222」となっています。



# HSE通信確認アプリ

簡単に確認するため、pythonを使って試してみます。


## モジュール追加
pythonからPC/SCを操作するため、モジュール追加します。
pyscardには、SWINGが必要なため、事前にインストールしておきます。
[SWIG](http://www.swig.org/)
※コピーする際には、Libディレクトリもコピーすることを忘れないように。ハマりました…。

SWIGをインストールしたら、続けて以下のコマンドでモジュール追加します。
`pip install pyscard`

## pyscardドキュメント

pyscardドキュメントは以下のURLにあります。

https://pyscard.sourceforge.io/#documentation


## HCE接続 pythonスクリプト作成
pythonスクリプトを作成します。

``` python:HCE_connect.py
from smartcard.CardType import AnyCardType
from smartcard.CardConnection import CardConnection
from smartcard.CardRequest import CardRequest
from smartcard.util import toHexString

# カード接続
cardtype = AnyCardType()
cardrequest = CardRequest( timeout=1, cardType=cardtype )
cardservice = cardrequest.waitforcard()
cardservice.connection.connect( CardConnection.T1_protocol )
print ("ATR:", toHexString( cardservice.connection.getATR() ))

# AID指定で選択
SELECT = [0x00, 0xA4, 0x04, 0x00]
CARD_AID = [0xF2, 0x22, 0x22, 0x22, 0x22 ]
LEN = [len(CARD_AID)]
# APDUの組み立て
apdu = SELECT + LEN + CARD_AID
print("send apdu:", toHexString(apdu))
# 送受信
data, sw1, sw2 = cardservice.connection.transmit(apdu)
print("SW1SW2: %x %x" % (sw1, sw2))
print("received:", toHexString(data))

# 切断
cardservice.connection.disconnect()
print("...disconnected.")
```

## pythonスクリプト実行

Androidでandroid-CardEmulationアプリを起動します。
カードリーダ上にAndroidをのせて、認識させます。

HCEが認識したのを確認したら、スクリプトを実行します。
`python HCE_connect.py`

``` :結果出力
ATR: 3B 88 80 01 00 00 00 00 80 81 71 00 79
send apdu: 00 A4 04 00 05 F2 22 22 22 22
SW1SW2: 90 0
received: 30 30 30 30 30 30 30 30
...disconnected.
```
正常に読み出せました。

# 次回

C#でもアクセスできることを確認します。
[Android HCE 調査メモ（その３）](https://qiita.com/tkhr68000/items/35efc41e39331f736fed)
npm install で har-validator-5.1.2.tgz が Not Found と言われた

ちょっと前に表題の現象が発生してたので、手元のメモを元に記事にしておく。

以下の記事の方が解説されている方法が正攻法だと思われるが、なんらか事情でうまくいかなかった記憶。（うろ覚え）

[yarnコマンドで 404 Not Found に遭遇したときの対処法 - Qiita](https://qiita.com/yoskeoka/items/3d015fb1dc43f73fe4d8)

そこで、[Github の Issue のコメント欄](https://github.com/ahmadnassri/node-har-validator/issues/113) を参考に `package-lock.json` の `har-validator` の登録内容を自分で `5.1.3` のものに書き換えて `npm install` する方法で対応した。

```json:package-lock.json
    "har-validator": {
     "version": "5.1.3",
     "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
     "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
     "requires": {
       "ajv": "^6.5.5",
       "har-schema": "^2.0.0"
     }
   }
```
Riderで自動挿入される名前空間をうまいこと調整する

#Riderはいいぞ
　いきなり回し者みたいな書き出しですが、ムッチャ書きやすいです。usingとか自動で挿入してくれますし。

#名前空間の自動挿入
　新しくcsファイルを作ったら勝手に名前空間も挿入してくれます。便利です。名前空間はデフォルトではプロジェクト名とディレクトリで決めてくれます。例えばNameSpaceプロジェクトでDomainディレクトリを作り、MainというClassを作った時、以下のようなファイルが生成されます。

```Main.cs
namespace NameSpace.Domain
{
    public class Main
    {
        
    }
}
```

#自動は便利だけど。。。
　NameSpaceプロジェクトとは別に、関連するプロジェクトを作るとしましょう。ゲームだったらマップファイル作成ツールとかそんな感じのやつです。そのプロジェクトで使うコードを本プロジェクトで流用することもあり得るわけです。関連プロジェクトの名前を仮にNameSpaceTestとかにするとルートの名前空間名もそうなってしまいますが、コードを流用する点ではまずいわけです。

```Main.cs
namespace NameSpaceTest.Domain
{
    public class Main
    {
        //NameSpaceTest名前空間内にある
    }
}
```

無理やり書き換えてもいいですが、こんな感じで波線がつきます。
![スクリーンショット 2020-01-08 22.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/dcfe69b8-4ff7-55bd-6e00-5e9a3f32017e.png)
![スクリーンショット 2020-01-08 22.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/a7f9cad5-c66e-ec2e-ca16-614872ccc30b.png)

この波線をどうにかします。自動で挿入してくれたりAlt+Enterでリファクタリングできると楽ですし。ValueObjectの方はSubという名前空間も無視するようにします。

#やり方
##ルート名前空間の方
プロジェクトプロパティにRoot namespaceがあるのでそれを書き換えます。
![スクリーンショット 2020-01-08 22.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/f93fd60b-c833-debd-9d95-c563f0a46676.png)
![スクリーンショット 2020-01-08 22.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/2b1ae9b6-6103-e422-0603-cf37922a28c5.png)

##ディレクトリの無視
ディレクトリのプロパティにNamespace providerというチェックが付いてるはずなのでこれを外します。
![スクリーンショット 2020-01-08 22.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/17c3e354-0bc4-d805-d790-d4f1bd666f15.png)
![スクリーンショット 2020-01-08 22.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/00bcada1-8590-5d9a-a7db-2b673643e034.png)

##結果
![スクリーンショット 2020-01-08 22.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/82e752d0-fea0-7ec0-c68f-9af9344a4c0e.png)
![スクリーンショット 2020-01-08 22.37.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439286/cb230825-8f1b-1148-9277-cc35b4504699.png)
きれいになりました。

#参考
名前空間を調整する - 公式ヘルプ | JetBrains Rider
https://pleiades.io/help/rider/Refactorings__Adjust_Namespaces.html
基本情報技術者　テクノロジ系　第3章 ソフトウェア

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより

今日は第3章について
書こうと思います。

# 基本ソフトウェア

## リアルタイムOS
定められた時間内に終わらせる機構を持つOS

## CUI
キーボードでの操作

## GUI
ウィンドウやメニューでの操作

## OSの3大機能
タスク管理
記憶管理・・・メモリ管理
ジョブ管理

## タスク
PCの仕事の単位

## ジョブ
複数のタスクから構成

## カーネル
OSの中核

## シェル
カーネルに伝える

# タスク管理1

## タスクの3状態

### 1,実行状態
2,とCPUの割当を行う

### 2,実行可能状態
1,よりCPUの開放を行う

### 3,待ち 
1.→2.の中間処理

### スケジューラ
実行可能状態のタスクを一つ選ぶ機能

### ディスパッチ
実行状態に写すこと、CPUを割り当てる

# タスク管理2

## スケジューリングアルゴリズム

### ラウンドロビン
タスクに待ち時間を設定して
経過すると次に回す方法

### 優先度順

### 到着順

## コンテキスト切替
実行状態のタスクを切り替える

### プリエンティブ方式

時間などの設定を満たしたら
OSの強制介入で別のタスクに切り替える
これが一般の基本で
暴走の危険少ない

### ノンプリエンティブ方式

タスクが自らCPUを手ばなして、切り替える方式

## 実記憶管理

### 固定区画方式

一定サイズでの管理
そのため、フラグメンテーションが発生しやすい

### 可変区画方式

データに合わせる方式
ただし出入りが多いとどうしても
多くのフラグメンテーションができる

#### メモリコンバクション
可変より、データを整理してまとめる方式

### メモリオーバーレイ
主記憶が足りない時

プログラムを機能単位でセグメントに分割して
必要なだけメモリに読み込んで使用する。

## 仮装記憶管理

pcを騙して、主記憶要領以上の領域を使えるようにすること

### ページング方式

各記憶空間をページという形で区切って管理する

#### ページフォルト
実記憶にないこと

#### ページイン
実記憶にページをいれること

#### ページアウト
ページをHD装置に退避


### ページ置き換えアルゴリズム
ページ操作で最も不要なのを選ぶ処理

#### LRU
最後にアクセスしてから最も長い時間が経過

#### FIFO
最初にページインされたページを選ぶ

### スラッシング
HDのアクセスしすぎで
システム性能が低下すること

# ファイル管理

## レコード
一人、一件分のデータ

## ファイル編成法
ファイルへのレコードの格納の仕方

###順編成
先頭から順番に

###直接編成
ハッシュ値をデータの格納アドレスとする

###索引編成
索引域、基本域、あふれ域で構成

基本とあふれは
定期的に再編成が必要

###区分編成

## ファイルシステム

### ディレクトリ

### パス

# ソフトウェア開発に用いるツール

## プログラミング言語


## プログラム実行までの流れ

### 1,原始プログラム
言語で記述されている
ソースとも呼ぶ

### 2,目的プログラム
機械語に変換されている
オブジェクトとも

### 3,ロードモジュール(ライブラリが追加されている)
必要プログラムがリンクされた
実行形式のプログラム

## 言語プロセッサ

アセンブラ・・・アセンブリ言語用
コンパイラ・・・まとめて
インタプリタ・・・一行ずつ

## エラー検出ツール

スナップショットダンプ・・・特定部分ごとに内容書き出し
トレーサ・・・実行過程を記録
インスペクタ・・・内容を表示
アサーションチェッカ・・・プログラムの途中経過成立確認

## テストツール

テストケースジェネレータ・・・テストデータ作成
シミュレータ・・・擬似環境作成

## CASEツール
開発環境効率化ツール

仕様書などの作成も効率化する
１日10時間株価予測AIを作り続ける　2か月目第2週

[前回の記事](https://qiita.com/Lulu_die_Zweite/items/8e5cb713073982353ac3)
##プラン

簡単にできることはだいたいやりました。
ここからモデルの実用的な性能を向上させるには何をすればいいでしょうか。
現在２つのアイデアがあります。
1.データセットの画像になんらかの情報を追加する。例えば長期的なトレンドや取引量など。
2.いくつかのレイヤーで自動的に学ばせ、一番良い結果だけを保存することで寝てる間などに性能の向上を図る。

1番はやってみましたが、2番は明日からやります。

####問題1.
データセットの画像のうち63.77%が"up"としてラベル付けされていて、このモデルは"up"を連発することを過学習してしまうかもしれない。
実際にはこのモデル及び一般的な深層学習などの目的は損失関数の最小化であって、精度は学習においてはあまり関係ないのでこれは問題にならないように思えます。

参考. 実験として"up"とラベル付けした画像を適当に取り除くことでデータセットの中の"up"と"down"の比率を1:1にして学習をさせてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/9660bfab-accd-439a-3d7a-6bd8541bfa97.png)
75 epochsの後この結果が得られました。

これでデータセットの不均衡が与えるモデルの予測精度への影響がわかるわけではありませんが、少なくともこの結果はこのモデルがコイントスで決めるBotよりはずっと性能がいいことがわかります。

####問題2.
データセットやモデルが極端に単純化されているため、このモデルの唯一の機能はちょうど２カ月後の価格が上がっているか下がっているかを判断するだけになっていて、その期間の価格変動は考慮されていません。故に現実的な運用は危険かもしれません。


##実用性を考える。

モデルに金融市場について最大限の情報を教え込むためにデータセットの画像に取引量を追加しました、悪いアイデアではなさそうですが、問題は取引量のスケールが画像毎に違うことがあることです。 Pyplotについてもう少し学ぶ必要がありそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/79365cc4-a0a9-aa7d-5652-aafff2054c8b.png)
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/bbb3d66d-8087-551d-3d32-54786db364e5.png)


2010年からの2203個の画像をPythonに学ばせます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/fa5a0b65-3623-b9c1-936a-8aa8e915226f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/321ff00c-99d1-2e2f-daf5-e81e0d1b9040.png)

 
60 epochsくらいがいい感じに見えるので Epochs = 60に設定してもう一回やってみます。
 
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/42adfdf0-5dc4-f84d-c6e4-96d95ca63376.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/2b762e92-a8af-c40a-5702-56b78087179b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/37ef5900-a023-65dd-106b-7299cdf95c3f.png)


良い感じに見えます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/41ba370e-9732-ce31-c67c-98eebacc225a.png)


このモデルがテストデータを使って予測を行う時、 74.64%の確率で”up”と答えており、また全てのテストデータセットのうち66.4%は”up”のラベルを付けられています。
モデルが完全にランダムに74.64%の確率で”up”を出力する場合、このテストデータでテストした際の精度の期待値は58.07%ですので63.7%の精度を持つこのモデルは少なくともあてずっぽうよりは高性能だと言えます。

##結論
このモデルは相場がほぼ常に上がると思っているいわゆるロンガー脳になってしまっており、実用性があまりないように感じられます。しかしながら一方でこのモデルが景気後退の兆候を察知するために使える可能性があるように思えます。できる限り”up”を出力しようとするモデルが”down”を答えとして出力するとき、その判断の背後に何かがあってもおかしくないからです。これからこのモデルの結果と予測を調査してそれが可能かどうか試してみます。

現在このモデルやデータセットは多くの問題をかかえています、一つひとつ問題解決していきいつかは実用的なAIを作りたいです。
余談ですが、自分のパソコンに学習をさせていると処理にかかる時間に驚かされます。量子コンピューターの記事をニュートンで読んだことがありますが、この処理にかかる時間が革新的に短くなるとすればAIと量子コンピューターの相性は抜群ですね。
##今後の方針
1.取引量の追加の仕方があまりにもひどいのでpyplotについて学ぶ
2.リーマンショックのデータも学ばせる
3.実際の市場で試してみる
4.データ量を10倍以上にする。
　　現在はアメリカの代表的な企業40と日本の企業からトヨタのデータを使っていますがこれをS&P500の企業と日経平均225の企業全部までに広げたいと思います。それとも二つのETFのみデータとして使うのがいいのでしょうか。とにかくこれを試した後も使うデータについては色々試行錯誤したいと思います。 次からはどのデータを学習したかについても明記したいと思います。

また来週。
初心者エンジニアが今日使ったLinuxコマンドまとめてみた～その１～

これが2回目の投稿となります。
私の投稿ではその日学んだことをアウトプットすることをメインとしております。
表現が適切でない場合や、間違いがあればコメントにてご指摘いただけると嬉しいです。
よろしくお願いいたします。

<h1>今日使ったLinuxコマンドまとめ

<P>hostname
→ユーザーのホストネームを確認するときに使用するコマンド

name -m
→ビット数を確認するときに使用するコマンド

less [ファイル名]
→ファイルの中身を確認

id ユーザー名
→ユーザーをスイッチさせずに、id・主グループを確認できるコマンド

ss -ant
→ポートが上がってるかを確認したいときに使うコマンド。
※出力されたポートナンバーが現在上がってるポート

cd [ディレクトリ]
→ディレクトリを移動するときに使うコマンド

ls
→ディレクトリ内を確認するときに使用するコマンド
画像修復(inpaint)を使ってオブジェクト消去したった(OpenCV:Python)

# Motive
[OpenCVを使って長い動画を一部だけ保存する方法](https://qiita.com/satsukiya/items/9647e20c4e27b3d0362a)から政見放送の動画をデータセットとして画像処理してきたが、今回は `inpaint`(画像修復)を使ってオブジェクト消去してみる。理由としては背景が単調で時刻のテロップと政党名のプラカード以外何も写っていないので修復が容易でないかと思ったためです。

# Dataset
ここでは動画ではなく下記の一枚のキャプチャを使います。
![capture_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/af9dbe87-4f0f-2b41-1ab9-ecde81b2abff.png)

# Method
マスク画像をあらかじめ作成し、修復(オブジェクト消去)したい箇所を白に塗り潰します。

<table>
<tr>
<td>
<img width="95%" alt="mask1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/23fc218c-8479-903d-5c28-c8953c57b1ce.png">
</td>
<td>
<img width="95%" alt="mask2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/2b3b6e77-dbee-ec65-0681-9a8aec549f8a.png">
</td>
</tr>
</table>

そのあとに、
`cv2.inpaint(src,mask,1,cv2.INPAINT_TELEA)`
を使って処理します。

# Development

```Python
import cv2
import os
import numpy as np

def inpaint(src,top,bottom):
	mask = np.zeros((*src.shape[:-1],1), dtype=np.uint8)
	mask = cv2.rectangle(mask, 
						top, 
						bottom, 
						color=(255,255,255), 
						thickness=cv2.FILLED
						)
	dst = cv2.inpaint(src,mask,1,cv2.INPAINT_TELEA)
	return dst


if __name__ == '__main__':
	
	window_name = "Drop Out NHK"

	mat = cv2.imread("capture_1.png")
	mat = cv2.resize(mat, None, fx = 0.5, fy = 0.5)

	dst = inpaint(mat,(200,40),(440,110))
	dst = inpaint(dst,(40,25),(115,65))

	cv2.imshow(window_name, dst)
	cv2.waitKey(0)
	cv2.destroyWindow(window_name)	
```

# Result

![output_inpaint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/6095c0f5-3f22-f970-8207-ee57ea51eff7.png)

思った以上に処理ができました。:sweat_smile:
時刻や政党名が表示されていたとは思えないくらいです。

# Future
[開発メモ その69 OpenCV 3.2 with ContribモジュールでInpaintを使用する](https://taktak.jp/2017/05/16/2291)
を見るとC++に`cv2.inpaint`よりも精度が高いfunctionがあるっぽいです。
もしかするとC++を使えば字幕がいい感じで消去できるかもしれません。

# Reference

- [画像のInpainting - opencv-python](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_photo/py_inpainting/py_inpainting.html#inpainting)
- [開発メモ その69 OpenCV 3.2 with ContribモジュールでInpaintを使用する](https://taktak.jp/2017/05/16/2291)
- [OpenCV 3.4 + Python3 画像を単色で塗りつぶす](https://symfoware.blog.fc2.com/blog-entry-2127.html)
オブジェクト指向ｃ＃

# あらゆる型の継承元クラスをたどっていくと最終的には、System.Objectクラスにたどり着く。
つまりクラス階層の頂点に位置するクラスがobjectクラスになります。
定義の際に、継承元を指定しなかった場合はその継承元であるobjectクラスになります。
以下のコードは同じ意味を持ちます。
 class Person
    {
        static void Main(string[] args)
        {
        }
    }


 class Person:Object
    {
        static void Main(string[] args)
        {
        }
    }
AppMakerの特徴

AppMaker+CloudSQLでミニ業務アプリを作成したので特徴をまとめます。

###大前提

+ AppMakerはGSuite組織内ユーザのみ利用可能
  + GSuiteを組織で使ってないとAppMakerを使うメリットはありません
  + CloudなのでユーザIDがあれば世界中だれでも使えます

###Cool

+ GSuiteユーザ前提のため認証系構築不要、権限もGSuiteの組織・ユーザで管理
+ クライアントもサーバもJavaScriptで記載可能。利用可能なクラスは異なる
  + クライアントスクリプトだけでかなりのデータ操作が可能
  + ちょっとしたことをするにもスクリプトが必要だが、SEにはそっちがありがたい
+ DBのCRUD画面が簡単に組める。テーブル作成もSQLを使わずに可能
+ 先にTableやViewを作っておくと、それにあうデータモデル作成可能（カスタムDB利用時）
+ TableやViewを修正したらデータモデルも自動修正できる
+ 自動更新型画面（デフォルト）と手動更新型画面を作成できる。それぞれできることに制約がある
+ フィルタ（検索条件）は便利

###Lame

+ SQLデータソースはフィルタやソート不可
+ Viewは使えるがAppMakerからは作れない
+ 複雑な業務アプリは組めない（テーブル数20程度まで）
+ 「レポート」機能がない。工夫すれば画面を印刷可能だが１ページしか印刷できない。
+ プライマリキーは１カラムのみ。デフォルト自動採番数値になる。
+ ソートは１カラムのみ
+ 「表」で細かくレイアウト調整しようとするとかなり面倒
+ マテリアルデザインにするのは面倒（挫折しました）
+ 日付の操作がしょぼい
  + DBの型はDate、DateTime、Time型があるが、AppMakerではDate、DateTime型のみ扱える
  + 入力ウイジェットはDateだが内部的にDateTimeに相当するため、タイムゾーンを固定にしないとDBとずれることがある
  + 表示ウイジェットはクライアントタイムゾーン固定のため、Viewで文字列として取得するか、入力ウイジェットを編集不可で使う必要あり
  + Timeは文字列として扱うしかない

詳細やノウハウはぼちぼち書きます。

###2020.2.5追記###
AppMakerのサービス終了をGoogleが発表。書く気がなくなりました。
2019年に取得した資格試験についてまとめてみた

明けましておめでとう御座います。
:mouse:本年もQiitaへの記事投稿を通して情報発信が出来ればと思っています。:mouse:
この記事はお正月休みが明けた1月8日に執筆した記事です。では何故Fujitsu Advent Calendar 22日目の記事となっているか？実は私は昨年23日目の執筆を担当しました。そして、22日目別の方が担当になっていました。ところが、担当の方が諸事情で投稿出来なくなってしまった様で、22日目だけが空席となっていました。故に12月22日から2週間以上経っていますが、穴を埋めるべく急遽執筆した記事が本記事です。

## 取得した資格一覧
先ずは、2019年に取得した資格と受験した時期を一覧表にまとめました。

|資格名|受験時期|
|:---|:---:|
|統計検定2級 CBT|3月|
|応用情報技術者試験|4月|
|電気主任技術者第三種|9月|
|Python 3 エンジニア認定 データ分析ベータ試験|9月|
|富士通セキュリティアーキテクト(社内認定)|12月|

## 各試験の簡単な紹介と勉強に利用した教材のメモ

### [統計検定2級 CBT](http://www.toukei-kentei.jp/cbt/)
* 第三次AIブームの影響からAI人材に取得して欲しい資格として名前がよく挙がる資格
* 筆者はCBT(Computer Based Testing)という試験会場でPCを使って受験する方式で受験
* 学生時代に確率統計学を履修していたが、かなり知識が不足していることを思い知らされた資格となった。
* 思わぬ苦戦を強いられ、過去問が有る紙版試験を受験すべきだったと少し後悔した。

#### 勉強で用いた教材
* [日本統計学会公式認定 統計検定 2級 公式問題集[2015〜2017年]](https://amzn.to/33hipPm)  
所謂過去問題集。過去3年6回分の問題と解説を収録
* [統計学入門](https://amzn.to/3kfoT8C)  
東大出版の所謂赤本と呼ばれる統計学の入門書。用語解説なども詳しく非常に重宝した。
* [統計検定2級　模擬問題集1~3](https://amzn.to/2RjS6Cy)  
1冊500円という破格の値段で販売されていたので1~3まで全て購入。執筆元は[統計WEB](https://bellcurve.jp/statistics/)というサイトを運営している。

### [応用情報技術者試験](https://www.jitec.ipa.go.jp/1_11seido/ap.html)
* 情報処理技術者試験の1つ。ITパスポート、基本情報技術者試験の上位に位置。
* 社内のソフト部門では入社3年目の春までに取得することと言われている。ただ、遵守率は部門によってまちまちと聞く。
* 過去数回受験をして毎回午前は合格するのに午後に苦戦。思わぬ足踏みをさせられた資格となった。

#### 勉強で用いた教材
* 午前は基本情報とレベル的にあまり変わらないと筆者は思う。基本情報合格レベルの方は過去問を数多く熟すという勉強法で(午前は)乗り切れると思われる。
* [情報処理教科書 出るとこだけ！応用情報技術者［午後］](https://amzn.to/35rgkTU)  
応用情報の午後に特化した問題集。頻出テーマに関連した過去問を頻出度順、点数を取りやすい順に配置した問題集。大変重宝した。
* [2018 応用情報技術者 午後問題の重点対策 (午後問題対策シリーズ)](https://amzn.to/33r6uhY)  
上述の問題集を2周した後、数を熟すために取り組んだ問題集。過去数回挫折したが、今回は本番で選択する予定のテーマ全てについて問題を解く。解説の詳しさは非常に丁寧。丁寧過ぎて途中で読むのを辞めようかと悩んだ物も有った。
* [iTec主催全国統一公開模試](https://www.itec.co.jp/store/products/list.php?category_id=215)  
情報処理技術者試験通信教育大手のiTec主催の模擬試験。上述の重点対策の出版元でもある。問題は実際の試験より難易度が高めで、採点も辛い。(あくまで筆者個人の感想)

### [電気主任技術者第三種](https://www.shiken.or.jp/examination/e-chief03.html)
* 情報系企業に勤務しながら電力系の資格？を取得と奇妙に思えるかもしれないが、筆者は実は電気系出身。
* 理論・電力・機械・法規の4科目全てに合格しなければ合格とならない。
* 科目合格が有るため、合格後は2年間合格科目の受験は免除される。
* 電験三種については別記事に詳細を後日まとめようと思う。

#### 勉強で用いた教材
* [電験三種　合格への厳選１００問(第２版)](https://amzn.to/3bTv2V1)
* [翔泳社の通信教育(法規のみ)](https://www.denken3.com/?utm_source=google&utm_medium=cpc&utm_campaign=denken3&gclid=CjwKCAiAmNbwBRBOEiwAqcwwpehqYKgZwg5kpGlJuL2-l_vygHAXGM-MJCOG-pwaKKuIzv7M_KHO5BoCbTcQAvD_BwE)
* [電験三種これだけシリーズ](https://www.denkishoin.co.jp/products/detail.php?product_id=1120)
* 長期戦だったため、詳細は別記事に記載予定

### Python 3 エンジニア認定 データ分析ベータ試験
以前Qiitaに投稿した以下の記事に詳細をまとめています。

* [Python 3 エンジニア認定データ分析ベータ試験に合格したので色々まとめてみた](https://qiita.com/y-vectorfield/items/36fc6d773f01ae33cd2c)

### 富士通セキュリティアーキテクト(社内認定)
* 富士通ソフト部門独自の認定制度。製品の脆弱性監査等を行うエンジニア育成が目的。
* 中堅社員が取得することが多いそうだが、情報処理安全確保支援士の足掛かりにと取得。
* 富士通独自の社内認定のため、詳細は割愛。

## まとめ
2019年は仕事の合間を縫って5つの資格を取得することが出来ました。2020年も新たな資格が取得出来る様に引き続き頑張りたいと思います。

## 今後取得したい資格
今後取得したい資格を列挙します。(順不同)

* 情報処理安全確保支援士試験
* 統計検定準1級
* TOEIC 800点
* AI実装検定 A級 (2020/3/29合格) [第1回 AI実装検定【A級】に合格したので色々まとめてみた](https://qiita.com/y-vectorfield/items/437ae52feb531ab5e69c)
* 第二種電気工事士
* 他多数...
USDM(要求の仕様化技法)をドメインモデルで表現する

#USDMとは何か

USDMとは故清水吉男氏が仕様の矛盾、抜け漏れを検出するために編み出した要求仕様の記述方法で以下の特徴を持つ。
 
- 要求と仕様を分けて、仕様の元となる要求を明確化する。
- 要求に理由をつけて根拠を明確にする。
- ざっくりした要求を明確な分割基準に基づいて分割して漏れをなくす。
- 要求階層の最下層に仕様をつける事を徹底して、要求〜下位要求〜仕様の関係を明確にする。

詳しくは参考文献を参照の事。

#USDMのクラス図とオブジェクト図

クラス図とオブジェクト図を示す。言うまでもなくオブジェクト図は人間が認知できるメンタルモデルと等価である。
要求仕様は階層化された要求と最下層の要求に紐づいた仕様で構成されている事がわかる。これからある仕様が提示されると大元の要求を手繰り寄せれることが理解できる(そもそも、やりたい事とその理由はなんだっけ問題)。

#####クラス図
![Class Diagram0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39706/ee74c961-ece3-bf98-16fd-2e326c4f95d6.png)

#####オブジェクト図
![Class Diagram1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39706/4f2ae63b-d5d5-b163-c4d6-a7b2d653973c.png)

#まとめ
USDMのモデリングする事によって、要求仕様がどのような概念で構築されているか？を理解できた。
自然言語解析技術と組み合わせれば、強力な仕様作成/検証ツールが構築できる可能性を秘めている事を実感できる。
そこまでしなくても日々の開発業務で、ある仕様が提示されれば大元の要求はなんだったのか考える癖がつくかも？しれない。

#参考文献
[USDM 小冊子基礎編] (https://affordd.jp/tech_documents/affordd-t2-usdmtext-basic_1.3.pdf)
[[改訂第2版] [入門+実践]要求を仕様化する技術・表現する技術 -仕様が書けていますか?] (https://www.amazon.co.jp/dp/4774142573)
[「派生開発」を成功させるプロセス改善の技術と極意] (https://www.amazon.co.jp/dp/4774132497)
[プロセスデザインアプローチ　誰も教えてくれない「プロジェクトマネジメント」]  (https://www.amazon.co.jp/dp/B076X1N99V)
[オブジェクト指向方法序説基盤編 - ジェームズ-マーチン] (https://www.amazon.co.jp/dp/4810185923/)
[モデルとプロセスをめぐる冒険 - 橋本 隆成]  (https://www.amazon.co.jp/dp/4798110558/)
【SwiftUI】@Stateとか@Bindingて何


##全体のコード
```swift
import SwiftUI

struct ContentView: View {
    @State private var isPresented = false
    var body: some View {
        Button("Present") {
            self.isPresented.toggle()
        }
        .sheet(isPresented: $isPresented) {
            DismissView(isPresented: self.$isPresented)
        }
    }
}

struct DismissView: View {
    @Binding var isPresented: Bool
    var body: some View {
        Button("Dismiss") {
            self.isPresented.toggle()
        }
    }
}
```
動きとしては`Present`をタップするとModalが表示されて`Dismiss`をタップすると閉じるというものになります。

##解説
###`@State`
```swift
@State private var isPresented = false
```

なんで頭に`@State`ついてんのって感じですよね
でもつけないと
<img width="528" alt="スクリーンショット 2020-01-07 22.42.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178509/7bc60f9d-3a3a-ec54-a702-c812b88bc89b.png">
こんな感じで怒られます。
そういえばstructは自身に定義したプロパティを変更できませんでした。
しかし`@State`を宣言することでSwiftUIが管理しているメモリ領域に値を格納してくれて

```swift
@State private var isPresented = false
var body: some View {
    Button("Present") {
        self.isPresented.toggle()
    }
}
```
こんな感じにbodyの中で`isPresented`の値を変更しても怒られなくなる。
その上、値の更新時には関連するViewを自動で再構築してくれるらしい。

##`$`
```swift
.sheet(isPresented: $isPresented) {
    DismissView(isPresented: self.$isPresented)
}
```
引数を渡す際に頭に`$`をつけてやると`isPresented`の参照が渡せるそうな

##`@Binding`

```swift
@Binding var isPresented: Bool
//先ほど引数で渡された`$isPresented`の値が初期値になるので初期化しなくて良い。
```
`@Binding`をつけてやるとView間での双方向のデータ共有が可能になります。
`@Binding`で定義した`isPresented`の値を変更すると
`@State`で定義した`isPresented`の値も変更され、関連するViewが全て更新されます。
AWSマネジメントコンソールの色をアカウントによって変更するChrome拡張機能「AWS COLOR CHANGER」を少し改良した

# はじめに
半年以上前にAWSマネジメントコンソールの色をアカウントによって変更するChrome拡張機能を作成してリリースしました。
https://chrome.google.com/webstore/detail/aws-color-changer/kmkpghoahklaglhoeljgnhdijhpainph?hl=ja

[AWSマネジメントコンソールの色をアカウントによって変更するChrome拡張機能「AWS COLOR CHANGER」を作った](https://qiita.com/Shi-nakaya/items/a9b20f85ab2de7b94a40)

思いの外、身の回りに使ってくれる人が多かったので
画面周りを改修しました。

# 改修箇所
- Bootstrapを使用して画面のレイアウトを整えました。
- 登録できるアカウントエイリアスの数を8から１０に増やしました。
- すぐにコピペできるように画面右にサンプルのカラーコードを表示しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265300/9666f6f2-819f-edc2-cb1f-da74b666a1f1.png)


少しの改修ですが、使いやすくなったかと思います。
AWSを業務で使用されている方は是非ともご利用いただければと思います。
【備忘録】Azure ADで特定のIP以外からのアクセスはMFAを要求する、でやられたお話

社内IPからならパスワードだけで認証許可、社外IPからならMFAを要求する、というのはよくある話。

インターネットアクセス用のIPが変更になるので、Azure ADに信頼できるIPを追加しようと思ったら自分で設定したにも構成がみつけられず、やられてしまったので備忘録を兼ねてまとめてみた。

#条件付きアクセス

- Azure ADではの条件付きアクセスは、最近のSaaS関係の相談も多いのでよく触ってる。特定のIPを「場所」として登録しておき、場所ごとに「信頼できる場所としてマーク」できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/26897d5b-82cf-8535-786b-9e9d9a9a8e6a.png)


- その上で、条件付きアクセスで「MFAを要求する、ただし信頼できる場所を除く」という設定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/b59bc621-154d-5405-59b6-2a16f4f6e0c6.png)


- あとは、対象のアプリやらユーザーを設定すれば適用できる。


ここにあるはず・・・と、既存の構成の「信頼できる場所」に登録しているはずと思ってたら見つからなくて一人パニックに。どこで設定したんだ、俺。


#Azure Multi-Factor Authentication

- 方々調べてみて、教えてもらったのがこっちの設定。
Azure Active Directry - セキュリティ - MFA にある、追加のクラウドベースのMFA設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/c383e606-edab-6c0e-cbf6-fd88445c3ad6.png)

- 少々古めかしいデザインの画面。ここでIP追加して、
https://account.activedirectory.windowsazure.com/usermanagement/mfasettings.aspx
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/e40cf364-e7c7-c965-1469-ba94ab5a9456.png)

- あとは、ユーザーごとに有効あるいは強制を適用すればOK。365管理センター - ユーザー - アクティブなユーザーの編集 で「多要素認証の管理」から以下の画面を表示できる。
https://account.activedirectory.windowsazure.com/UserManagement/MultifactorVerification.aspx
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/b0077bcb-a090-2339-8595-b2cb917f927f.png)




#感想

同じような機能なら、まとめてよね・・・。

なんとなく、だけどAzure AD MFA はすべてのアプリに一律強制っぽい。一か所設定すれば適用できるし、あとはユーザーさえ追加すればいいので管理はラク。

しかし、細かい制御ができたり、複数の条件を組めるという点では、条件付きアクセスのほうが自由度が高い。漏れているケースを考えなきゃいけないので慣れが必要ではあるけど、構成の自由度を求めるなら条件付きアクセス。

ザックリまとめると、こんな感じ。間違ってたらご指摘ください。

| 条件付きアクセス |Azure AD MFA |
|:----|:----|
|IPベースで設定可   |IPベースで設定可   |
|ユーザーあるいはグループ単位で設定 |ユーザー単位で設定   |
|アプリごとに設定可   |AADで認証するすべてのアプリに一律で設定   |
|IP以外の様々な条件で設定可 |IPのみ   |


#けっきょくどうした？

Azure AD MFA での構成をすべて条件付きアクセスに作り直しして、Azure AD　MFA の設定はすべて削除しました。

もともと、複数の条件付きアクセス設定を使ってたし、ゲストユーザーのアクセス制御にも使ってたから、1箇所に集めるほうが管理も分散しないし。これですっきりしました。


#参考

Azure Multi-Factor Authentication の設定を構成する - 信頼できるIP
https://docs.microsoft.com/ja-jp/azure/active-directory/authentication/howto-mfa-mfasettings#trusted-ips

Azure Active Directory 条件付きアクセスの場所の条件の概要 - 信頼できるIP
https://docs.microsoft.com/ja-jp/azure/active-directory/conditional-access/location-condition#trusted-ips
Who delivers WordPress website design and development services?

WordPress is one of the most versatile platforms and can be used in various ways such as to launch blogs, eCommerce stores, Membership sites, Book stores, etc. To build a WordPress website that generates revenues, then you need to hire a certified WordPress developer who has got ample knowledge and delivers positive results from <a href="https://www.sparxitsolutions.com/wordpress-development-services.shtml">Top-notch WordPress development company</a>. As they would be dedicated in taking your ideas and concepts right from conceptualization to deployment with dexterity.
![WordPress-website-design-and-development-services.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133595/b0d7cd0f-3854-0136-2075-9c4e88b22240.png)


If you are seeking for professional WordPress developer then you should hire Sparx IT Solutions. They deliver the best WordPress website design and development services. They are proficient in developing enriching and engaging WordPress websites with cutting-edge performance. They have immense experience in serving customers from fortune enterprise to start-ups. Their portfolio speaks everything about them.

<b>Benefits of hiring WordPress developers from Sparx IT Solutions:-</b>

1. Save Your Time

2. Dedicated Workers

3. Protection of Privacy

4. Competitive Workers

5. Rights to Your Work

6. Better infrastructure

7. Get Access Anytime

8. Decide Your Resource Type

9. Professional Services

<b>Their team has expertise in:-</b>

<b>WordPress Blog development:</b> The most popular platform for CMS is WordPress. Their talented developers will help you to publish visually attractive blogs that can be navigated easily and user-friendly.

<b>CMS development:</b> They will provide robust CMS services to increase the overall functionality and performance of your website.

<b>WordPress Web Development:</b> Their proficient WordPress developers are trained in all types of frameworks. Be it adding video gallery or handling Facebook fan page, they can do it all.

<b>WordPress Custom Plug-in development:</b> Their WordPress developers have developed a unique custom plug-in to add new features for their esteemed clients.

<b>WordPress Module/Extension development:</b> Many agencies are revolutionizing their stores online by implementing the use of modules or extensions. Their think-tankers have got immense experience in module/extension development.

<b>Responsive theme development:</b> They will help you to develop a powerful as well as an interactive site through which you can expand your mobile device using the customer base.

<b>Support and Maintenance:</b> the developers of Sparx IT Solutions make sure that your website remains safe from malware and virus attacks and also remains upgraded to the latest version of WordPress.
virt-install実行時のエラーと対処


# 何が起きたか

Linuxマシン(CentOS7)上で[これ](https://qiita.com/kure/items/8645c28cba67aae49519)をやりたかったので、下ごしらえとしてKVM+QEMUで仮想環境を構築していました。
yumから諸々インストールしていざ仮想マシンを立ち上げようとしてvirt-installを実行したところで、以下のようなエラーが吐かれて実行できませんでした。

```
# virt-install --name hogehoge ...
　ERROR Host does not support any virtualization options
```

ちなみに日本語だと「ホストがすべての仮想化オプションをサポートしません」と怒られます。


# エラーログを読む
とりあえずlibvirtdのエラーログを参照してみた。

```
# systemctl status libvirtd -l
~
 2020-01-08 12:00:28.719+0000: 1461: error : virQEMUCapsNewForBinaryInternal:4578 : Internal error: Failed to probe QEMU binary with QMP: /usr/libexec/qemu-kvm: relocation error: /lib64/libspice-server.so.1: symbol SSL_CONF_CTX_set_ssl_ctx, version libssl.so.10 not defined in file libssl.so.10 with link time reference
 2020-01-08 12:00:28.719+0000: 1461: warning : virQEMUCapsLogProbeFailure:4525 : Failed to probe capabilities for /usr/libexec/qemu-kvm: Internal error: Failed to probe QEMU binary with QMP: /usr/libexec/qemu-kvm: relocation error: /lib64/libspice-server.so.1: symbol SSL_CONF_CTX_set_ssl_ctx, version libssl.so.10 not defined in file libssl.so.10 with link time reference
~
```

QEMUのバイナリをうまく参照できていないようです。


# 解決策

[この記事](https://tutorialmore.com/questions-151327.htm)によると、OpenSSLのバージョンを上げると解消されたとの報告がありました。
自分の環境で確認してみるとOpenSSL 1.0.1eだったので、試しに`yum update`で1.0.2kにアップデートするとlibvirtdのエラーは無くなり、`virt-install`は問題なく実行可能となりました。
ドメインモデルから見るAV Foundationの設計思想と概念

### はじめに

AV Foundationについてどういう設計思想/概念で成り立っているか調査した。

### オブジェクト図から明らかになるドメインモデル

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/objectiveworker/20140923/20140923124147.png" alt="f:id:objectiveworker:20140923124147p:plain" title="f:id:objectiveworker:20140923124147p:plain" class="hatena-fotolife" itemprop="image"></span></p>

オブジェクト図である。関係が複雑であみの目の様になっているが、以下の通りに分類するとAV Foundationの設計思想が分かる。

* 紫：再生制御
    *  AVPlayer
    *  AVPlayerItem
* 黄：レンダリング前のポストエフェクト
    * AVVideoCompositing
    * MTAudioProcessingTapRef
* 緑：特殊効果
    * AVMutableAudioMixInputParameters
    * AVMutableVideoCompositionLayerInstruction
    * AVMutableAudioMix
    * AVMutableVideoCompositionInstruction
    * AVMutableVideoComposition
    * AVVideoCompositing
* 水：編集中のメディアファイル
    * AVMutableComposition
    * AVMutableCompositionTrack
* 赤：元のメディアファイル、素材
    * AVAsset
    * AVAssetTrack

つまり、５つのレイヤーに関心毎を分離して自由に組み合わせれる様になっているのである。

これは動画アプリの事を考えれば当たり前で、元ファイルからいろいろ試行錯誤しながら編集してそれぞれを比較したいし、いろいろ特殊効果を検討したい、という要件を考えればこういうモデルに行き着くだろう。

### オブジェクト図から明らかになるドメインモデル　その２

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/objectiveworker/20140923/20140923124310.png" alt="f:id:objectiveworker:20140923124310p:plain" title="f:id:objectiveworker:20140923124310p:plain" class="hatena-fotolife" itemprop="image"></span></p>

順序は逆になるが普通の再生中のオブジェクト図を示す。
AVPlayerクラスはクロックの更新をしているだけで、現在再生位置はAVPlayerItemが保持している。