OmniAICreator/Qiita-1.07M huggingface dataset:
IAMユーザーを作成する

## AWSでのユーザー
AWSではユーザーは２種類あります。
・ルートユーザー
・IAMユーザー

一番最初に作ったAWSアカウントは「ルートユーザー」になります。
普段の作業はIAM(アイアム)ユーザーでログインしてから作業します。
これはセキュリティを強固にするためです。
詳しくは「IAM ベストプラクティス」で検索してください。

## IAMユーザーの作成手順
今回は一番最初のIAMユーザーの作成をメモしていますので、ルートユーザーでログインしています。

山田さん用のIAMを作る場合は、
・システムA用の山田さん
・システムA用の鈴木さん
・システムB用の山田さん
というイメージで作成するといいようです。

### IAMのダッシュボードへ移動
|![1D1CB2FD-B1B5-43B5-987C-D283286241D3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/5204ff6f-09a8-eddb-1fc6-a486a0d1456b.png)|
|:--|

ユーザー＞ユーザーを追加

|![20DDCFAF-9E46-443C-9AF2-834E38CDFBCC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/2f895613-7cf6-2c9f-de40-666fe63aa6ce.png)|
|:--|

### 詳細設定を入力
|![87706353-1113-45F4-9A26-8B38E7C15AE3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/e65c51e2-6e77-c90e-ce66-f5c454cc6ce1.png)|
|:--|
**プログラムによるアクセス**
プログラムからアクセスするのに使ったりする場合にチェック入れる
**AWS マネジメントコンソールへのアクセス**
AWS マネジメントコンソール へのログイン、つまり人間が操作する場合にチェックを入れる
**カスタムパスワード**
好きなパスワードを設定できる
**パスワードのリセットが必要**
チェックを入れると最初にサインインした人がパスワードを再設定するようにできる。
管理者とユーザーが違う場合に使うと便利。

### アクセス許可の設定
|![4365AB05-22F5-4567-AC08-F12B3BF60F55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/fc5737c1-bf0a-2fb4-6fb8-fdf9016d1ae3.png)|
|:--|
ここでは簡単に設定するため
AWSが用意している管理者権限(基本機能が全て使える)ポリシーを選択しました。

### タグの追加
|![23A68FBA-FC43-481C-8F35-26769C30E3E6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/4823f9da-40bc-ebed-cacd-8fa0aec8853a.png)|
|:--|
タグをつけることで絞り込みができたりします。

システム名や状態(status : terminated)、権限とかロールとか？良い方法がわかったら追記します…
一応以下の記事が参考になるかも…

- [Tagging Best Practices(pdf)](https://d1.awsstatic.com/whitepapers/aws-tagging-best-practices.pdf)
- [IAM リソースタグを使用した IAM ユーザーおよびロールへのアクセスとそのユーザーおよびロールのアクセスの制御 - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_iam-tags.html)

### 確認画面
|![9F1619D3-34B1-4634-9987-2DC7A2A11597.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/308a3449-ba38-d48f-eeab-a7173afad88f.png)|
|:--|

|![CDBC7DC3-7AC7-4A10-AFA5-5238C8513D4C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/8a9dee43-603f-a72e-58d9-60b66355e8cb.png)|
|:--|
閉じると、

|![E1B8151F-745D-4271-BB00-EF3F5764DE09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/a81f1456-3b55-4e64-7e4b-ce9dddbea710.png)|
|:--|
IAMユーザーが追加されたのを確認できます。

## IAMユーザーでサインインしなおす
ルートからサインアウトして、

|![A0696AC4-C3F2-4306-A093-E465F9B65A18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/ca845034-8d72-2d06-293a-d98e177fad0f.png)|
|:--|

IAMユーザーとしてサインインしなおします。

|![08BB9FF4-A14E-45F7-A7E2-178270617D5B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/bfe9087c-2d29-3183-f28d-38015bcc7dfa.png)|
|:--|

これでIAMユーザーでサインインしました。

## 参考
- [AWS アカウントでの IAM ユーザーの作成 - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html)
ゼロから始めるLeetCode Day93 「49. Group Anagrams」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day92 「4. Median of Two Sorted Arrays」](https://qiita.com/KueharX/items/71ab93587eab703caab1)

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！


## お知らせ
Day 100でQiitaでの投稿はひとまず区切りを付けようかと思います。
タグの記事が僕の記事ばかりになってしまうのもいかがなものかと思いましたし、他に有益な情報を提供している方の邪魔になってしまうこともあると考えたので、こうすることにしました。
至らない部分は多々ありましたが、今までお付き合い頂きありがとうございました。

問題を解いて記事を書く、というのは上記の個人ブログで続けるつもりですし、興味ある方はたまにそちらを覗いていただけると嬉しいです。
Twitterの方のアカウントはほとんど更新通知用と化しているので、Leetcodeを解く記事について気になる方はそちらも合わせてフォローいただくと良いかもしれません。

# 問題
[49. Group Anagrams](https://leetcode.com/problems/group-anagrams/)
難易度はMedium。
[コーディング面接対策のために解きたいLeetCode 60問](https://1kohei1.com/leetcode/)からの抜粋です。

問題としてはアナグラムである文字列の入った配列が与えられます。

>Example:

>Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]


# 解法

```python
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        ans = collections.defaultdict(list)
        for s in strs:
            sorted_word = ''.join(sorted(s))
            ans[sorted_word].append(s)
        return ans.values()
# Runtime: 92 ms, faster than 98.06% of Python3 online submissions for Group Anagrams.
# Memory Usage: 16.8 MB, less than 71.89% of Python3 online submissions for Group Anagrams.
```

アナグラムというとハッシュマップを使うと解きやすいと思います。
2つの文字列を比較した時に、文字列を構成する要素が同じ数で揃っていれば良いので、例えば

`"abc"`と`"cab"`の場合であればどちらも

`a`が1回、`b`が1回、`c`が1回出現しているので、

`a:0,b:0,c:0....`といった風に`a~z`まで全ての個数をハッシュマップで管理すれば特定の文字列がアナグラムであるかを判別することができます。

今回の回答は前から舐めていく過程で一旦ソートすることで、例の配列を以下のように変換しています。

```
aet
aet
ant
aet
ant
abt
```

そして、それぞれの要素をソートしていない元の文字列のまま`ans`に追加し、そしてvalueのみを返すことできちんと分類されています。
なお、なぜきちんと分類されているか、という点についてですが、最初の`defaultdict`で引数に`list`を与えているため、`[aet],[ant],[abt]`という風にリスト化されているためです。

では今回はここまで。
お疲れ様でした。
EC2上のnginxとPHP7.4を連携

EC2にインストールされたnginx上で、PHP7.4を動かす方法のメモです。
Appacheと違って、少し設定が必要だったので、手順をまとめておこうと思います。
(`Amazon Linux 2`での設定方法です。）

* php7.4のインストールは、[こちら] (https://qiita.com/Hide-Zaemon/items/08a0fe398a81f1bce656)を参考にしてください。


# nginxの設定
`/etc/nginx/nginx.conf`にphpの設定を行います。

```common_lisp
$sudo vi /etc/nginx/nginx.conf

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

        location ~ \.php$ {
           fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME
           $document_root$fastcgi_script_name;
           include        fastcgi_params;
        }
    }

```

# php-fpmの設定 #1
`/etc/opt/remi/php74/php-fpm.d/www.conf`にnginxと連携するための設定を行います(5箇所、設定を行います)。

```common_lisp
$sudo vi /etc/opt/remi/php74/php-fpm.d/www.conf
user = nginx
group = nginx

listen = /var/run/php-fpm/php-fpm.sock

listen.owner = nginx
listen.group = nginx
```

# php-fpmの設定 #2
`/etc/nginx/conf.d/php-fpm.conf`に設定を行います。

```common_lisp
$sudo vi /etc/nginx/conf.d/php-fpm.conf
upstream php-fpm {
        server unix:/var/run/php-fpm/php-fpm.sock;
}
```


# sockファイル用の設定
php-fpmでは、上記の`/var/run/php-fpm/php-fpm.sock`ファイルを起動時に作成します。
`Amazon Linux 2`では、再起動すると`/var/run`ディレクトリがリセットされてしますので、起動時に`/var/run/php-fpm`を自動生成するスクリプトを設定します。

```common-lisp
$sudo vi /etc/tmpfiles.d/php-fpm-run.conf
d /var/run/php-fpm 0755 root root
```

# php-fpmの起動
以下のコマンドで、php-fpmを起動します。

```common_lisp
$sudo systemctl start php74-php-fpm.service
```


# php-fpmの確認
以下のコマンドで、php-fpmの状態を確認します。
`active(running)`となっていれば、正常に起動しています。

```common_lisp
$sudo systemctl status php74-php-fpm.service
● php74-php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php74-php-fpm.service; disabled; vendor preset: disabled)
   Active: active (running) since Mo 2020-07-20 21:13:23 UTC; 36min ago
 Main PID: 24651 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 1, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php74-php-fpm.service
           ├─24651 php-fpm: master process (/etc/opt/remi/php74/php-fpm.conf)
           ├─24652 php-fpm: pool www
           ├─24653 php-fpm: pool www
           ├─24654 php-fpm: pool www
           ├─24655 php-fpm: pool www
           └─24656 php-fpm: pool www

```

# phpinfo()で、phpが動いているかを確認
phpinfoを呼び出すファイルを作成し、nginxのホームディレクトリ(`/usr/share/nginx/html`)に配置します。

```common_lisp
$sudo vi info.php
<?php phpinfo(); ?>
```

ブラウザからアクセスし、以下の画面が表示されれば、nginx上で、phpが正常に稼働しています。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/68d95332-3677-684f-c1be-2ed6795904a8.png">

以上で、nginxとPHP7.4の連携設定は完了です。

<br>
<br>
Python学習サイト備忘録

##Python学習サイトこれをやる

###▼めんどうなことはPythonにやらせよう
本で買うと2000円くらい。web英語版なら無料。
https://automatetheboringstuff.com/#toc

###▼東京大学Pythonプログラミング入門
すごい丁寧に書いてあるありがたい。
https://utokyo-ipp.github.io
EC2にPHP7.4をセットアップする

EC2にPHP7.4をインストールする方法のメモです。
EC2のインスタンスを立ち上げてからの手順をまとめておこうと思います。
(`Amazon Linux 2` へのインストール方法です。）

# インスタンスのアップデート
`yum update`を実行し、インスタンスをアップデートします。

```common_lisp
$ sudo yum update
```

# リポジトリのアップデート
Amazon Linux 2は、デフォルトで`PHP5.4`がインストールされてしまうため、
`PHP7.4`がインストールされるように、リポジトリをアップデートします。

```common_lisp
$sudo amazon-linux-extras install epel
$sudo yum install epel-release
$sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

# PHP7.4のインストール
`yum` コマンドでPHP7.4をインストールします。

```common_lisp
$ sudo yum install -y php74 php74-php php74-php-fpm
```

# PHP7.4のリンク設定
PHP7.4が動作するように、シンボリックリンクを設定します。

```common_lisp
$ sudo ln -s /usr/bin/php74 /usr/bin/php
```

# インストールの確認
以下のコマンドで、インストールされたバージョンを確認します。

```common-lisp
$ php -v
 PHP 7.4.8 (cli) (built: Jul  9 2020 08:57:23) ( NTS )
 Copyright (c) The PHP Group
 Zend Engine v3.4.0, Copyright (c) Zend Technologies
```

以上で、PHP7.4のセットアップは完了です。

<br>
<br>
pythonで英語の音声処理をするときに使うライブラリ

# 英語の音声処理について

音声処理の分野の日本語用はmecabやjanomeなど数多くの有用なライブラリがpythonには存在します。その一方で英語の音声処理のライブラリもたくさんある一方でまとまってライブラリの使い方などを説明した文献はあまり多くないように感じます。
ここでは英語の音声処理をpythonで行うときに役立つライブラリをそれぞれの特徴と共に解説していきます。

## 音声認識

### GoogleSpeechRecognition

https://pypi.org/project/SpeechRecognition/

こちらはgoogleが提供する音声認識のライブラリです。googleが提供してるだけあって認識精度はかなり高いです。ただオンラインで用いること前提なので、オフラインで用いると認識精度が下がります。


### pocketsphinx

https://pypi.org/project/SpeechRecognition/

こちらはgooglespeechrecognitionと比べると精度は落ちるもののオフラインでも安定した精度を発揮します。文法辞書、単語辞書と併用することで認識精度を上げることができます。

### julius

https://julius.osdn.jp

こちらは京大をはじめとする大学の開発チームが開発した音声認識エンジンです。googlespeechrecognitionやpocketsphinxと違いjuliusはこれ単体では動きません。音響モデル、単語辞書、言語モデルをこちらで用意する必要があります。標準では日本語で認識されますが、英語のモデルを使えば英語の認識もできます。


## 自然言語処理

### NLTK 

http://www.nltk.org

シンプルで使いやすい割に機能が多いライブラリなのが特徴です。ただ公式が英語のドキュメントしかないので、英語が読めない人には厳しいかもしれません。

### Polyglot

https://polyglot.readthedocs.io/en/latest/

こちらはNLTKほど機能はないものの形態素解析、分かち書き、分散表現など、自然言語処理の基本的な機能が網羅されていて使いやすいのが特徴です。

### word2vec

https://pathmind.com/wiki/word2vec

word2vecは単語間の類似度比較に用いられます。単語をベクトルで表すことによって単語間の引き算ができたり中々使ってみると面白いです。ただ機械学習分野の知識が必要とされるので他のライブラリと比べるとハードルが高いかもしれません。

## 音声ファイル生成

### gtts

https://pypi.org/project/gTTS/

gttsはGoogle Text-to-Speechの略でテキスト音声ファイルに変換できます。テスト用の音声ファイルや読み上げるのがめんどくさい時に音声ファイルをこれで作ります。



## 音声ファイル処理

### pydub

https://pydub.com

pydubは音声ファイル処理用のライブラリです。音量を上げたり、音声ファイルの長さを変えたり色々な処理をすることができます。
SpringBoot 2.x系+actuatorでHTTP経由でログレベルを動的に切り替える

# 概要

このエントリでは、Spring Boot 2.x系を使っているときに、[Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html)で、ログレベルを動的に変更する方法を確認します。

# 準備

## Actuatorを使う

build.gradle

```groovy
dependencies {
(中略)
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
```

## Actuatorの設定

application.yaml

```
management:
  endpoints.web.exposure.include: loggers
  endpoint.loggers.enabled: true
```

# 確認

ここでは、Spring Frameowrk全体のログレベルを変更します。
開発時や動作確認時などに、一時的にログを出したい場合などを想定しています。

## 起動直後

Actuatorが公開しているURLにアクセスすることで、現在の状態を確認できます。

http://localhost:8080/actuator/loggers

下図は、別エントリ「[SpringBootとH2 DBとJPA RESTで、郵便番号をREST APIで検索してみる～作るクラスは3つだけ～](https://qiita.com/hrkt/items/7a70f4c4379ad0e6f795)」で作ったものに、上記の設定を加えて起動した直後、http://localhost:8080/actuator/loggers にアクセスしたものです。（ブラウザの機能で、JSONをきれいに表示されています）

![loglevel-before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/4b3960e5-26af-7e0f-5b3b-73951b73f794.png)

このエンドポイントに、POSTで異なるログレベルを送信します。下記では、curlコマンドを使っています。

```console
curl -i -X POST -H 'Content-Type: application/json'\
 -d '{"configuredLevel": "TRACE"}'\
 http://localhost:8080/actuator/loggers/org.springframework
```

![loglevel-after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/f011dc8b-7c9d-870d-e876-dae21a74e2ec.png)


コンソールで確認すると、ログレベル変更後、TRACEレベルのログが出力されています。下図は、IntelliJ IDEAでgradle bootRunしているコンソールの様子です。

![look-at-loglevel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/e0051a39-70a7-e79e-9224-2e75fd12875c.png)

# おわりに

本エントリでは、タイトルに示した内容を確認しました。
開発時など、ログを一時的に沢山出力したくなる時に便利だと思います。

ログレベルを切り替える方法は、本エントリのほかにもあり、例えばlogbackの設定ファイル変更のウォッチ機能を使っても実現できます。
本エントリの方法は、POST一発で変更できるという点でお手軽だと思います。

今回のエントリに関係するコードは、[このPRで確認できます](https://github.com/hrkt/boot-h2-jpa-demo/pull/2/files)。
YUV(YCbCr)のCVPixelBufferをBGRAに高速に変換する

ARKitのcapturedImageをmediapipeで利用する時など、CVPixelBufferのpixelFormatを変換する必要があることがあります。

以前の記事ではvImageを利用しましたが、vImageはCPUでの計算に最適化されており映像処理などには向かないものでした。
https://qiita.com/noppefoxwolf/items/b12d56e052664a21d8b6

そこで、GPUを利用してYCbCrをBGRAに変換するライブラリを作りました。Xcode12のSwiftPMで簡単に導入することができます。
https://github.com/noppefoxwolf/BlueDress

# 使い方

簡単に使うことができます。

```swift

import BlueDress

let converter = YCbCrImageBufferConverter()
let bgraBuffer = try converter.convertToBGRA(imageBuffer: imageBuffer)

```

# 変換の流れ

実際は変換ではなく、新規に新しいBGRAのPixelBufferを作ってそこにYCbCrを焼いています。

YCbCrのPixelBufferは、内部に２枚の画像を持っておりそれぞれ

- Y: 輝度
- CbCr 青と赤の色差

をサイズ違いでもっています。
YCbCrは以下の計算式で変換することが出来るので、Metalシェーダを使ってこの計算を行うというわけです。

```
R = 1.164(Y-16)                 + 1.596(Cr-128)
G = 1.164(Y-16) - 0.391(Cb-128) - 0.813(Cr-128)
B = 1.164(Y-16) + 2.018(Cb-128)
```

# 実装で詰まりがちなところ

## 各PlaneのPixelFormat

YCbCrから２枚のPlaneを取り出す際に、最初はそれぞれをBGRAとして取り出していたのですがこれは間違いでそれぞれ

- Y: r8Unorm
- CbCr: rg8Unorm

で取り出す必要があります。
よく考えれば当然なのですが、ARKitのMetalテンプレートを読んで気がつきました。

## CVPixelBufferとMTLTextureの関係

MTLTextureはあくまでCVPixelBufferの参照を持つ概念なので、MTLTextureに対して行った描画処理は特に取り出す必要はなく、MTLTextureのソースとして渡したCVPixelBufferに適用されます。

## MTLTextureが-6660エラーで作れない

最終描画先の空のMTLTextureを作りたくて、そのソースとなる空のCVPixelBufferを自前で作っていたのですがどうもエラーでMTLTextureが作れませんでした。
MTLTextureを作る場合は、CVPixelBufferを生成する時に`kCVPixelBufferMetalCompatibilityKey:true`を与えるのを忘れないようにしましょう。
UbuntuでOpenVPNのCLIからVPN接続

UbuntuのGUIのOpenVPNクライアントからVPN接続できなくなった。
そこで、OpenVPNのCLIからVPN接続を試みて、無事に接続できたので、メモっておく。

## OpenVPNのCLIからVPN接続


```bash
sudo openvpn --config ./vpn/VPNConfig.ovpn
```

`VPNConfig.ovpn` は、OpenVPNの設定ファイルで、各自取得しておく。
sudoが無いとパーミッションエラーになる。
コマンド実行後にユーザー名とパスワードを聞かれるので入力して、VPN接続完了。

## VPN経由でインターネットを利用する場合

`VPNConfig.ovpn`に下記の記載が無い場合は、追記しておく。

```
redirect-gateway def1 bypass-dhcp
route 10.8.0.0 255.255.255.0
dhcp-option DNS 8.8.8.8
```

## 参考

* [Ubuntu 18.04でOpenVPNサーバーをセットアップする方法](https://www.codeflow.site/ja/article/how-to-set-up-an-openvpn-server-on-ubuntu-18-04)
* [Ubuntu クライアントから OpenVPN サーバに接続する方法 - Qiita](https://qiita.com/noraworld/items/05658055446c41482cce)
CinemachineでBlendの開始終了を検知する

#概要
CinemachineでPriority切り替え時のBlendAnimationの開始終了を検知する方法を探ってて
完成したので備忘録として投稿。
もっと簡単な方法があれば教えてください！

#バージョン
Unity2019.3.7f1
Cinemachine v2.6.0

#Blend開始の検知
`CinemachineExtension`の`OnTransitionFromCamera`メソッドがTransition元のVirtualCameraも取得できるので
Extensionを拡張するアプローチを行った。

```
public class CinemachineTransitionNotify : CinemachineExtension {

    public override bool OnTransitionFromCamera(ICinemachineCamera fromCam, Vector3 worldUp, float deltaTime) {
        // ここでTransitionの開始を検知できる
        // fromCamがTransition元のVirtualCamera
    }

}
```

#Blend終了の検知
`OnTransitionFromCamera`の中で自身を管理するBrainを取得し、`ActiveBlend`を見ることで判定できる。

```
// 自身を管理しているBrainを取得
CinemachineBrain brain = CinemachineCore.Instance.FindPotentialTargetBrain(VirtualCamera);
// 現在動いているActiveBlendを取得
var blend = brain.ActiveBlend;
// blend.BlendWeightが1.0になれば終了なので、AsyncやCoroutineで待機してあげる。
```
【CentOS 8 版】ConoHaVPSで初期設定からLAMP環境構築&独自ドメイン&SSLまで

CentOS8用にリライトしました

**不備やできなかった等ありましたらお手数ですがこちらにコメントください！**

全２編でSSLまで。
勉強レベル（LinuxやLAMPになれるのが目的）なのでご了承ください

 - [初期設定編](https://blog.collapse-natsu.com/post/centos8-conoha-lamp-p1)
 - [LAMP構築〜SSLまで編](https://blog.collapse-natsu.com/post/centos8-conoha-lamp-p2)

上記に加えてfail2banを入れると良いと思います
ブルートフォースアタックという、パスワードを総当りで解きに来るものや
ポートスキャンというどのポートが空いているか調べて攻撃する場所決めるためのものを防げます。

CentOS8からCokpitというWeb上からCentOSのホストを管理できるのが出ているそうなので、試してみると面白いかと思います

#ちなみに

勉強じゃなくて、LAMPとSSLのサイトがすぐ欲しい！というときは、オプションを表示からスタートアップスクリプトを選択すればすぐかと(使ったことないですが)

![スクリーンショット 2020-07-21 2.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/85f53382-ddfd-cbe9-5cc4-7710269c3f0c.png)


![スクリーンショット 2020-07-21 2.50.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/8cc63499-8265-6e7b-94ce-8a561d1547b1.png)
Hasura がやばい - v1.3.0 リリースしてRelayに対応した

# Hasuraとは

[Hasura](https://hasura.io) は一言で言うと、「Postgres から GraphQLをはやせるやつ」です。
SaaSにもなっていますが、中核となる [graphql-engine](https://github.com/hasura/graphql-engine) はオープンソースです。
[docker](https://hub.docker.com/r/hasura/graphql-engine) イメージで公開されてるので k8s とか cloudrun で一瞬でデプロイできます。

# 用途

APIサーバの開発を超高速化できます。APIサーバの共通の機能として上げられるのは

1. リソースの取得・作成・更新・削除 (CRUD)
2. 認証（セッションやAPIKeyからユーザを特定する）
3. 認可（ユーザがあるリソースに対してアクションを行うことを認めるかどうか）

だと思いますが、この３つのうち 1と3は Hasura が解決してくれます。認証はしませんが、認可は非常に細かく設定できます。
なので少し認可のロジックを変えたいってなった時、ローカルでぽちぽち変えて HasuraCLIから 本番サーバに向けてapplyすればいいです。
バックエンドの知識はある程度必要かと思いますが、コンソールからぽちぽちでGraphQL をはやしてくれるので、非常に楽チンです。
認証は JWTでできます。 なのでFirebaseと連携すればユーザ登録関連のメール機能を持ってるので、ほとんどのことはコードレスでできます。　（JWTのCustomTokenはCloudFunctionでやらなきゃです。）

他にもよく使う機能でメール送ったり画像を処理したりとかはありますがそのあたりの追加機能は、Actions とよばれる HasuraのGraphQLを通して外部APIにとばす機能か Events よばれる何かのリソースを操作した時にフックして外部APIにとばすかのどちらかでできます。


# v1.3.0 リリースノート

https://github.com/hasura/graphql-engine/releases/tag/v1.3.0

## Remote Joins
※ あんまりよくわかっていないです。

Hasura には Relationship とよばれるリソースとリソースをつなげる機能があって、その機能がinsertするときにネストしてinsertしたり、取得する時もネストが可能になります。
Remote Schema というのもあって、別のGraphQLサーバのスキーマをもってきてHasuraを通してそのGraphQLサーバへアクセスできます。Actionsとの違いは、GraphQL スキーマをどっちがもつかというところでしょうか。 Remote Schemaであれば、外部でもてるので、その外部の開発効率を挙げられます。ビジネスロジックが認可に止まらず複雑かつ重要場合は、ビジネスロジックがHasuraの開発に依存するのはいただけないので依存関係を逆転させてるということですね。

Remote Joins　はその外部スキーマをリレーションに追加できるみたいです。認証は別でもたないとだめで、DBが別な場合もおおいかとおもいますので、Userがリモートスキーマで、User.IDとTodoList.UserIDでリレーション貼るみたいな感じで使えるんですかね。

## Relay

/v1beta1/relay でRelayのページネーションが使えるみたいです。私が実装したときしんどすぎて維持できずに断念したので Relay に対応したのは、もう頭が上がらないですね。。
カーソルは、 `cursor: [1, "pwlic", "artist", 1]`なんかこんな感じみたいです。


## Scheduled Triggers

イベントがクーロンに対応したってやつですね！
べつにHasura使わなくてもいいかもですが、すばらしいです！

## Allow access to session variables in computed fields

Hasuraでは computed fields というカラムを作れるのですが、そこにセッションバリュー（JWTの値）を含めるようになったみたいですね！ 分析で使う用とかで少し複雑なクエリなんかはこの computed fields でよさそうです。

## Manage seed migrations as SQL files

CLIでシードを管理できるようになりました！
これは、とても嬉しいです！マイグレーション周りはまだなんか少し機能足りてない感あったので、シードはいって開発環境を整えやすくなったと思います。

# まとめ

バックエンドエンジニア不要説は流石に嘘だと思いますが、このようなバックエンドの効率を飛躍的に上げてくれるツールは今後も増えてくるはずですし、それを使えるかどうかで圧倒的な開発速度の差が生まれるかと思います。

APIサーバ作る時日本でも評価されつつあるのは Go かと思いますが、時代は Hasura です。
それでできないことがあって、はじめて自分で実装すればよいです。
EC2にMySQL8.Xをセットアップする

EC2にMySQL 8.X をインストールする方法のメモです。
EC2のインスタンスを立ち上げてからの手順をまとめておこうと思います。
(`Amazon Linux 2` へのインストール方法です。）

# インスタンスのアップデート
`yum update`を実行し、インスタンスをアップデートします。

```common_lisp
sudo yum update
```

# インスタンスからMariaDB用パッケージを削除
`yum` コマンドで、MariaDBのパッケージを削除します。

```common_lisp
sudo yum remove mariadb-libs
```

# MySQLのリポジトリを追加し、有効化
`yum` コマンドで、MySQLのリポジトリを追加し、有効化します。

```common_lisp
sudo yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
sudo yum-config-manager –enable mysql80-community
```

# yumリポジトリの確認
MySQL8.Xのリポジトリが、”enabled=1”になっているかを確認します。

```common_lisp
sudo cat /etc/yum.repos.d/mysql-community.repo

[mysql55-community]
name=MySQL 5.5 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=1
gpgcheck=1
```

# MySQLのインストール
`yum` コマンドで、MySQLをインストールします。

```common_lisp
sudo yum install mysql-community-server
```

インストールを実行した際に"The GPG keys listed for the «MySQL 8.0 Community Server» repository are already installed but they are not correct for this package"というエラーが出た場合は、以下のコマンドを実行します。

```common_lisp
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
```

# インストールされたMySQLのバージョン確認
MySQLバージョンを確認します。

```common_lisp
mysqld --version
　/usr/sbin/mysqld  Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL)
```

# MySQLの起動と自動起動の設定
MySQLを起動し、インスタンス起動時に自動で起動するように設定します。

```common_lisp
sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service
```

# MySQLの状態確認
MySQLの状態を確認する。

```common-lisp
sudo systemctl status mysqld.service

● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Mo 2020-07-20 13:32:14 UTC; 3h 47min ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 21998 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─21998 /usr/sbin/mysqld
```

以上で、MySQL8.Xのセットアップは完了です。

<br>
<br>
.gitignoreに記載したのにnode_modulesがいつまでもpushされてしまう。

はじめまして、[Yui](https://twitter.com/yui_active)です。

私は現在Vue.jsを使って受託開発を行っているのですが、そこで詰まったことを紹介します。

#何が起こったか
Vueで書いたコードをBitbucketにpushした際、node_modulesが.gitignoreに書かれてあるにも関わらず、まとめてpushされていた。

.gitignoreを見直してもきちんとnode_modulesの記載があり、しばらく原因がわからなかった。

#原因
~~どうやらキャッシュが原因だった。~~

7/22追記　kmdkukさんよりコメントを頂き、原因がキャッシュではないことがわかりました。すでにgitの追跡対象になっているファイルはどんだけignoreしようとしても追跡対象から外さないとコミット履歴が残ってしまうようです。私はその部分をまとめてキャッシュと呼んでいました・・・・。すみません！

#試したこと
とりあえず、いかなる条件でもignoreするように .gitignoreに

```.gitignore
*node_modules/
```
と記載した。

そしてその後

```ターミナル
$ git add .gitignore
$ git commit -m "comment"
$ git push origin hoge_branch
```
これで解決！
と思いきやまだ残ったままだった・・・。

#解決法

```ターミナル
$ git rm -r --cached node_modules
```


ここにたどり着くまでの経緯は以下

```.gitignore
*node_modules/
```
~~こう書いても消えないということは、キャッシュの可能性が高いと思い、キャッシュを全削除してみた。~~

7/22追記　kmdkukさんのコメントより引用
>すでにgitの追跡対象になっているファイルはどんだけignoreしようとしても追跡対象から外さないと変更履歴を永遠と追跡してコミット履歴に残ってしまいます．
その追跡対象から外すコマンドがgit rmコマンドです．
これにrオプションを付けることで再帰的にフォルダ以下のファイルを対象から外してくれます．
cachedオプションは，追跡対象から外したときに，ファイルをそのまま残してくれるようにしてくれるオプションです．

つまり、下記のように消すと今まで追跡するべくして追跡してたファイル郡までaddし直す羽目になるそうなので、きちんとファイル名を明示する必要があるらしいです。
（この辺もざっくりとは認識していたのですが、もう一回addすればよいかと思い、あまり重要視していませんでした。）

ですので、

```ターミナル
$ git rm -r --cached .
```
ではなく、

```ターミナル
$ git rm -r --cached node_modules
```
とファイル名を明示的に指定する方が良いです。


#感想
~~なにか挙動がおかしいときはキャッシュをチェックするということを忘れないようにしたい。~~
kmdkukさん、本当にありがとうございました。
【Laravel】ロリポップでComposer requireをするとPHP Fatal error:  Out of memoryが出る場合にやったこと

# 原因

文字通りメモリ不足です。

つまりメモリがあれば良いわけなのですが、ロリポップではメモリを上限に設定してもPHP Fatal error:  Out of memoryが出ます。

また、そもそもロリポップではphp.iniが変更できなかったりと制限があります。

```
$ composer require intervention/image
```
とかが普通にできないです。
そういえばcomposerでlaravelをインストールしようとした時もエラーが出たような・・・

# 対処(正解かどうかはわからない)

個人的にやったことをまとめます。

僕はこのやり方で一応なんとかなったのですが、責任は追いません。

というか、もっと良い方法ありませんか...？

### scpコマンドを使用して1回ローカルに落とす

```
$ scp -r -P[ポート番号] ドメイン名@ssh.lolipop.jp:web [ダウンロード先]
```

scpコマンドは[こちらの記事](https://qiita.com/katsukii/items/225cd3de6d3d06a9abcb)でわかりやすく解説してくださってます。

例えばこんな感じです。（macのデスクトップのhogeフォルダにコピーする場合）
$ scp -r -P1234 ×××@ssh.lolipop.jp:web ~/Desktop/hoge


ポート番号・パスワードが必要なので、そこはロリポップのメニューの「SSH」から見てみてください。
あと結構時間がかかります。

### ローカルでcomposerを使う

```
$ cd [ダウンロードしたフォルダのパス]
$ composer require [パッケージ名]
```

composerがcommand not foundの場合はインストールしましょう。
僕は[こちら](https://qiita.com/n_oshiumi/items/59ae65219e2ab664eb3f)の記事を参考にしました。


### 再びサーバーにコピー
```
$ scp -r -P[ポート番号] [ダウンロードしたいローカルのディレクトリパス] ドメイン名@ssh.lolipop.jp:up
```

これでwebディレクトリと同じ階層に、cpディレクトリが配置されました。

あとはwebディレクトリを削除し、cpディレクトリをwebにリネームすれば完了です。

```
$ mv web web2 (一応web2というディレクトリを作って今までのプロジェクトを保存しておく)
$ rm web
$ mv up web
```

これで一応完了なのですが、**このあと画像をアップロードしたら画像がnot found(404)になるという事例が発生**しました。

めちゃくちゃ焦りませした。。。

調べてみると、どうやらシンボリックを再作成する必要がありそうです。
ということで、

 - 一旦public/storageを削除
 - 再びシンボリックを作成

という処理をします。

```
# sshでログイン後・・・
$ cd web
$ cd public
$ rm storage
$ cd ../
$ php artisan storage:link
```

これで再びシンボリックが作成され、全ての工程が完了しました。。。

# 最後に・・・

きっともっと良い方法があるとは思うのですが(例えば手動でcomposer.jsonに追記して・・・とか)、僕の知識ではこれが一番安全でした。

そもそもレンタルサーバーでcomposerを使うのがいけないのかもしれませんね。

以上、Web初心者の苦労でした。

**もっと良い方法あったらコメントお願いします！！！**
Unity 3D入門 #6 [宝探しゲーム作成]

今回は宝探しゲームを作ってみようと思います。

空間上に配置された5つのCubeを全て触るまでの時間を競うゲームを作ります。

ゲームとしての体裁を整えるため、することを箇条書します。
・Cubeを集める処理
・Cubeを集めた時間の測定
・再スタートボタンの追加
・キャラクターの動きの修正(現在は上下左右に動かした時、まっすぐ走ってくれない)

[Cubeを集める処理]

他のスクリプトの変数を使用する参考URL：https://qiita.com/tsukasa_wear_parker/items/09d4bcc5af3556b9bb3a
他のオブジェクトの関数を使用する参考URL：https://htsuda.net/archives/1702
関数の実行のタイミングを決める参考URL：https://nopitech.com/2018/07/02/post-700/

```
GameObject player;  // プレイヤーのゲームオブジェクト
private int get_item_num = 0;  // 現在取得したCubeの数
GameObject NoticePanel;  // Cube取得の通知パネル
public GameObject Dis;  // 残りCubeの数の表示パネル
display dis;

void Start(){
    Dis = GameObject.Find("display");
    dis = Dis.GetComponent<display>();
    player = GameObject.FindWithTag ("Player");
    NoticePanel = GameObject.Find("NoticePanel");
}

void Update(){
    Vector3 pos = player.transform.position;
    pos.y += 0.5f;  // Rayの発射場所をプレイヤーの腰あたりに調整
    Ray ray = new Ray(pos, player.transform.forward);
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit, 2.0f)){
            // Itemオブジェクトに触れた時
            if (Input.GetKeyDown(KeyCode.Return) && hit.collider.gameObject.tag == "Item"){
                // まだ触っていないオブジェクトの時
                if(hit.collider.gameObject.GetComponent<Renderer>().material.color != Color.red){
                    hit.collider.gameObject.GetComponent<Renderer>().material.color = Color.red;
                    get_item_num++;  // 触ったCubeの数を上げる
                    NoticePanel.SetActive(true);  // Cube取得の通知を表示
                    Invoke("disactive", 0.5f);  // Cube取得の通知を0.5秒後に非表示
                    dis.message = "Touch Cube and press enter\nFind Cubes["+get_item_num+"/5]";  // 残りのCubeの数を修正
                }
            }
	    }
    }

    void disactive(){
        NoticePanel.SetActive(false);
    }
```

[Cubeを集めた時間の測定]

```
if(get_item_num >= 5){
    dis.message = "Finish! Time:"+dis.countTime+"\npress [r] to restart";
}
```

Cubeを集める処理のコードのdis.messageの後に上のコードを挿入することで実装。



[再スタートボタンの追加]

シーンの再スタートの参考URL：http://negi-lab.blog.jp/archives/12908675.html

```
using UnityEngine.SceneManagement; 
if(get_item_num >= 5 && Input.GetKeyDown(KeyCode.R)){
    SceneManager.LoadScene (0);
}
```

URLを参考にして、上のコードをそれぞれ適切な場所に配置することで実装した。

[キャラクターの動きの修正]

unity-chanのUnityChanControlScriptWithRgidBody.csを修正する。

```
anim.SetFloat ("Speed", Mathf.Max(Mathf.Abs(h),Mathf.Abs(v)));
//anim.SetFloat ("Direction", h); 
```

上のようにコードを変更することで、上下左右に走ることができるようになった。
詳しくはわからないため、ここでは割愛する。

これで、ゲームらしきものが完成した。以下、今回の進捗GIF


![ezgif-7-2d1ab99b47d5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/f31833cb-bc4f-0250-fde9-49b0c8c0a8e3.gif)

長すぎたので4倍速をかけてGIFのFPSも落としました。

追記：せっかくなのでunityroomにゲームをアップロードしました。
unityroomアップロード参考URL：https://qiita.com/Junichi0227/items/3498421c65b4162bed0f
ゲームURL：https://unityroom.com/games/findtreasure0720
XenServerはこれからXCP-ngがいいんじゃねえかと

機能制限されちゃった Citrix Hypervisor Express より、こっちの方が使い勝手よかった。
https://xcp-ng.org/

>XCP-ng is a Xen Project incubation project
>
>XCP-ng virtualization platform is a Xen Project incubation project hosted in the Linux Foundation.XCP-ng aims to be the bridge between the users community and the developers and is the default entry point for any user.


WebUI の XOA も インストールしたホストに http://{xcpng-host} にアクセスすれば、勝手にインストールもしてくれるし、結構いい感じです。
Ruby on Railsの画像の保存場所(assets?public?)

#プログラミングの勉強日記
2020年7月21日　Progate Lv.213
Ruby on RailsⅧ

#assets配下とpublic配下
　Railsではアプリケーション内で使用される設置場所に2つの場所が存在する。それが`public`ディレクトリと、`app/assets/images`ディレクトリである。どちらでも画像を読み込むことができるが、どう違うのか気になったので調べてみた。

#画像を読み込むパス

##assets
app/assets/image配下に画像ファイルを置く場合は、パスから始める必要はなく、画像ファイル名だけでよい。

```erb
<%= image_tag "sample.jpg" %>
```

##public
　publicディレクトリに置く場合は、パス`/`から始める必要がある。


```erb
<%= image_tag "/sample.jpg" %>
```

#CSSの適応
　CSSの書き方が異なる。

##assets

```css
background: image-url("画像のパス")
background-image: image-url("画像のパス")
```


##public

```css
background: url("画像のパス")
background: image-url("画像のパス")
background-image: url("画像のパス")
background-image: image-url("画像のパス")
```


#assets配下とpublic配下の違い
　assets配下に置く場合、アセットパイプラインの対象となる。アセットパイプラインはWebアプリケーションフレームワークの1つである。スペースや改行を詰める、コメントを削除するなどJavaScriptやCSSのアセットを最小化または圧縮して1つのファイルに連結することができる。また、アセットがブラウザでキャッシュされることで早くなる。

　app/assets/images ディレクトリに設置した画像は、同じ名前で画像をアップデートしても、画像ファイルの中身からフィンガープリントを自動で更新して、画像ファイル名に挿入するので、ブラウザでキャッシュされた古い画像が表示される心配がない。(/config/environments/のファイルに下記の記述を追記する場合)

```ruby
config.assets.digest = true
```

　<font color=blue>同じアプリケーション内で JavaScript を利用しており、JavaScript 内で画像を使う場合ｈpublic配下に置く。</font>
　

#参考文献
https://techblog.kyamanak.com/entry/2017/10/13/003818
https://kurose.me/rails-image-assets-public/
https://www.transnet.ne.jp/2016/02/28/rails%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8Dcolnr%E3%80%8C%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3/
PRML 演習問題 6.14 解答

##問題
>平均$\mathbf{\mu}$と共分散$\mathbf{S}$を持つガウス分布$\mathcal{p}\mathrm{(x|\mu)=}\mathcal{N}\mathrm{(x|\mu,S)}$に対して(6.33)で定義されるフィッシャーカーネルの具体的な形式を導け.

```math
\begin{align*}
\mathcal{k}\mathrm{(x,x')=g(\theta,x)^TF^{-1}g(\theta,x)}
\tag{6.33}
\end{align*}
```

なお$\mathbf{F}$はフィッシャー情報量行列と呼ばれ以下の(6.34)で定義される.


```math
\begin{align*}
\mathbf{F}\mathrm{=}\mathbf{E_x}\mathrm{[g(\theta,x)g(\theta,x)^T]}
\tag{6.34}
\end{align*}
```

##方針
(6.33)はフィッシャースコアと呼ばれる$\mathrm{\theta}$についての勾配
$$
\mathrm{g(\theta,x)=\nabla_{\theta}ln}\mathcal{p}\mathrm{(x|\theta)}
\tag{6.32}
$$
によって$\mathrm{\theta}$と同じ次元の特徴空間におけるベクトルを考えて定義されている.

したがって本問ではまずガウス分布に関して$\mathrm{\mu}$の勾配を考えることでフィッシャースコアを導出し, さらにフィッシャー情報量行列を得ることで目的とするフィッシャーカーネルを書き下す.

##解答

まずガウス分布に関して$\mathrm{\mu}$の勾配を考えることでフィッシャースコアを導出していく

```math
\begin{align*}
\mathcal{p}\mathrm{(x|\mu)=}\mathcal{N}\mathrm{(x|\mu,S)}\mathrm{=\frac{1}{\sqrt{2{\pi}S}}exp\bigr(-\frac{(x-\mu)^2}{2S}\Bigr)}\\
\end{align*}
```

よって$\mathrm{g(\mu,x)}$は

```math
\begin{align*}
\mathrm{g(\mu,x)=\nabla_{\mu}ln}\mathcal{N}\mathrm{(x|\mu,S)=S^{-1}(x-\mu)}
\end{align*}
```

つぎにフィッシャー情報量行列を得る. (6.34)より

```math
\begin{align*}
\mathbf{F}\mathrm{=}\mathbf{E_x}\mathrm{[g(\mu,x)g(\mu,x)^T]=S^{-1}}\mathbf{E_x}\mathrm{[(x-\mu)(x-\mu)^T]S^{-1}}
\end{align*}
```

$\mathbf{E_x}\mathrm{[(x-\mu)(x^\mu)^T]=S}$よりフィッシャー情報量行列は

```math
\mathbf{F}\mathrm{=}\mathbf{S}
```

したがってガウス分布のフィッシャーカーネルは以下のように書き下せる.

```math
\begin{align*}
\mathcal{k}\mathrm{(x,x')=g(\mu,x)^TS^{-1}g(\mu,x)}
\end{align*}
```

よって題意は示された
AWS-SDK for Javaのライブラリ全体をインクルードしていたので個別にインクルードする

# 背景

あるWebアプリケーションでは、AWSサービス(S3、SES、API-Gateway、Lambda等)を利用しています。
開発言語はJavaなのでJava用のAWS-SDK(1.11.560)を使用しています。

# 問題点
アプリケーションにSDK「全体」をリンクしてしまっていました。
jarファイルの数でいうとなんと171個(version560の場合)

```conf
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.11.560</version>
</dependency>
```

# 対策と効果

JavaのAWS-SDKは1.9.0以降は、機能ごとにライブラリを取り込みできるので必要なものだけ利用します。

本アプリケーションでは、`API-Gateway`と`Lambda`は間接的(ファイルアップロードやHttpRequestをトリガ)に起動するので、それらのAPIは不要です。したがって必要なライブラリは`S3`と`SES`だけです。
個別に指定するには、`aws-java-sdk`の次にサービス名を付与すればOKです。(★で囲んで部分。もちろん★は不要)

```conf
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk★-s3★</artifactId>
    <version>1.11.560</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk★-ses★</artifactId>
    <version>1.11.560</version>
</dependency>
```

個別に取り込むことで、依存ライブラリを大幅に削減できました(jarファイル数でいうと171ファイルから5ファイル)
これで、開発時(サービスの起動時間短縮やコード補完が高速に？)や使用メモリ削減が期待できます。

```
com.amazonaws.aws-java-sdk-core-1.11.560.jar
com.amazonaws.aws-java-sdk-kms-1.11.560.jar
com.amazonaws.jmespath-java-1.11.560.jar
com.amazonaws.aws-java-sdk-s3-1.11.560.jar
com.amazonaws.aws-java-sdk-ses-1.11.560.jar
```


# 関連URL

- [AWS SDK for Java | AWS](https://aws.amazon.com/jp/sdk-for-java/)
- [Maven Repository: com.amazonaws » aws-java-sdk](https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk) ・・・過去から最新までのバージョン参照
- [Apache Maven での SDK の使用 - AWS SDK for Java](https://docs.aws.amazon.com/ja_jp/sdk-for-java/v1/developer-guide/setup-project-maven.html)
大学生が1週間でFlutterアプリを学んでリリースした過程(4日目)

こんにちはシオンです。


きてしまいましたか、これを書く時間が。。
今日、目が覚めて布団で寝返りを打った時からずっとこれを書く時間が来るのが憂鬱でした。
なぜデザインを終わらせなかったんだ、昨日の自分。
ツケはこのチャレンジが終わった時にしっかりと払ってもらうからな。（焼肉いきます。）

#■目次
#####■今日こそデザインを決める
#####■いよいよプログラミング
#####■プログラミングを学ぶ
#####■まとめ

#■今日こそデザインを決める

今日こそデザインを決めるというか、さっさと決めてコードを書き始めないと終わりません。
だってデザインが終わったらコードを書くための勉強をしてそれからコードを書かなきゃいけないんだから。


昨日の進捗はこれです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/5ce29a9b-996f-15a1-0440-b973fa445b6c.png)


全然進んでいませんね。
うんうん悩んでいてもあまり進まないことがわかったので、一旦３画面作ってみたいと思います。


ということで作ってみました。（すみません、記事書きながらやってるの忘れていました。。）
こちらです！
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/81f9d8ef-28b0-40b1-6169-b02894bed867.png)



どうでしょうか？
なんとなく形にはなってますかね。画面増えてんじゃん！っていうツッコミはやめてください。

まあ赤点は回避できてるのではないかなと思います。
というか、何より時間がないのでこのまま行くしかないです。もしコード書きながら変更点出てきたら都度変えていきましょう。頑張れ明日の自分。


では、いよいよ目的だったFlutterに入っていきます！！
やっときました！（長かった。本当に。）
早速やっていきましょう！



#■いよいよプログラミング

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/887a2e81-3f99-d603-a174-9063a6b50da0.png)



**「Welcome to Android Studio」**




ありがとうございます。やっっっときました。この画面に。どうぞ盛大に出迎えてください。

これが初期画面です。一度環境構築した時にここまではきていました。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/a43ee4e0-8908-1620-08be-6fd787efdefb.png)



では早速コードを書いていきましょう。
と言いたいところですが、コードを書くための知識が全くないため、何がなんだかわかりません。一から学んでいきましょう。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/c7f9c3fd-4ec2-c35b-aec8-10f68688fa27.png)

ということで参考書をキンドルで買いました。

これで一通り勉強していきたいと思います。


ただ、時間があまりにもなさすぎるので機能にしぼって学びます。
今回のアプリを作るために必要なコードとしては
**・配置の仕方**
**・画面遷移**
**・テキスト入力**
**・画像表示**
この辺を中心に学んでいきたいと思います。


#■プログラミングを学ぶ

今更ながら、アプリ制作の工程に「プログラミングを学ぶ」という工程が組み込まれていることに驚きを隠せないですが。
マックでハンバーガー注文したら「ハンバーガーですね！わかりました、では作り方を学んできます！」と言われるみたいなことですかね。やばいですね。



とりあえず学んでいきます。
今回はFlutterの概要を学んで終わりにしたいと思います。
学びながらすごく簡単に言語化していくので、もしも間違っていたらすみません。その時は教えていただけると嬉しいです。


コードの書き方をみていきます。開発の背景とかはすっ飛ばします。


なるほど、どうやらFlutterでプログラミングをしていく上で大事になってくるのはwidget（ウィジェット）というものらしい。
widget自体はandroidスマホを使っている人は結構身近なものらしいですね。ホーム画面上に常に表示されるアプリのショートカット機能のことも、「ウィジェット」というらしいですね。


Flutterでのプログラミングでは、widgetとは「UI情報が入った箱」だと考えると良さそうです。この箱を自分の好みのデザインに積んでいくようなイメージ。
でこの箱には種類が2つあって、「中身の情報が変わらない箱」と「中身の情報が変化する箱」
前者をStatelessWidget、後者をStatefulWidgetという。この箱を画面の中で配置していくのが大体の流れになっているようですね。


だからこのwidgetの置き方・配置の仕方、2種類のWidgetの使い分けの仕方を学べばとりあえず画面を表示することはできそうです。
では、この参考書に従っておなじみのHelloWorldを書いて今日は終わりにしたいと思います。


このプログラミングの細かいところは飛ばしていきます。
ちなみに、やったこととしてはKaishoukunという一番大きな箱を用意。その中にStatelessWidgetをおく。そしてその真ん中にTextのUI情報を持った箱を用意。そのTextにHelloWorldと入力しました。



期限まで3日「HelloWorld」してから3日でアプリをリリースしたら割とすごいんじゃないか？と思ってワクワクしましたが、今のところ想像するに完成していない未来しか見えていないので、逆に絶望しています。
明日明後日の土日でなんとかしていきます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676265/ce36b42d-7b92-54bc-ef93-5c587441be93.png)

明日もよろしくお願いいたします。


#■まとめ

やっとプログラミングのスタートに立ちました。プログラミングの過程を公開するというテーマなのに、ここまで全くコードがなくてごめんなさい笑
ここからは学びながら、できるだけ早くコードを書いていきます。
リリースまで考えるとこの土日の２日間でコードを書き切る必要がありますが、果たしてどうなるのか。。

明日の自分がどこまで頑張るのか楽しみですね。頑張れ！
UIKitのレイアウトをコードで組んだ時の備忘録

UIをコードで組んだ時に

```swift
translatesAutoresizingMaskIntoConstraints = false
```

を入れてあげないと、自分が組んだUIレイアウトが優先されない。

## 自分の場合
レイアウトを組む際は、関数を定義してあげて使ってます。

```swift
func anchor(top: NSLayoutYAxisAnchor? = nil,
                left: NSLayoutXAxisAnchor? = nil,
                bottom: NSLayoutYAxisAnchor? = nil,
                right: NSLayoutXAxisAnchor? = nil,
                paddingTop: CGFloat = 0,
                paddingLeft: CGFloat = 0,
                paddingBottom: CGFloat = 0,
                paddingRight: CGFloat = 0,
                width: CGFloat? = nil,
                height: CGFloat? = nil) {
        translatesAutoresizingMaskIntoConstraints = false
```

こんな風に、書いてます。

これで`anchor()`を呼び出して使ってます。

## 使用例

```swift
let titleLabel : UILabel = {
	let label = UILabel()
	label.text = "hoge"
	label.font = UIFont.boldSystemFont(ofSize: 14)
	return label
}()

override func viewDidLoad() {
	super.viewDidLoad()
	view.addSubview(titleLabel)
  titleLabel.anchor(top: view.safeAreaLayoutGuide.topAnchor,
            right: view.safeAreaLayoutGuide.rightAnchor,
            paddingTop: 50, paddingRight: 147, width: 100, height: 56)
  titleLabel.layer.cornerRadius = 56/2
}
```

みたいな感じで書いてあげればおそらくかけるのかなと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335005/a4f13e15-6f55-562c-a82d-93afc4af3508.png)


こんな感じにできます。

レイアウトのコードは

[https://github.com/tiking76/chatapp/blob/master/chatApp/Utiles/Extentions.swift](https://github.com/tiking76/chatapp/blob/master/chatApp/Utiles/Extentions.swift)

に置いてあります。

## もっと詳しく知りたいよ！！ってひと
↓のスライドをみてね！

[LTで登壇した時のスライド](https://docs.google.com/presentation/d/e/2PACX-1vQbYhcrH9qP-9TKDcVt9ftIqgAL1rT9Z-WnZ4ALpV7FPb4aJf1VTiWJ2ApAO6hY043YYAyPzhOON_0r/pub?start=false&loop=false&delayms=3000)

##レイアウトをコードで書いた時にアンカーのサイズ属性をよしなにやってくれるやつ(追記）
### constraint(lessThanOrEqualToConstant:)
### 定義
```swift
func constraint(lessThanOrEqualToConstant c: CGFloat) -> NSLayoutConstraint
```
### 引数に入れるもの
このディメンションアンカーに関連付けられている属性の最大サイズを表す定数。

#### レイアウトの比較
##### 変更前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335005/6f4fd8c4-d866-5c29-0516-6a9b607991a8.png)
##### 変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335005/d0bbe5d3-f93a-b9c4-981b-40c271087517.png)
### 使い方
```swift
//変更前
bubbleContainer.widthAnchor.constraint(equalToConstant: 250).isActive = true
//変更後
hogeContainer.widthAnchor.constraint(lessThanOrEqualToConstant: 250).isActive = true
```
【Python】データサイエンス100本ノック（構造化データ加工編） 008 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/muicnnHKiPQ)もしています。

##問題
P-008: レシート明細のデータフレーム（df_receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の条件を満たすデータを抽出せよ。
- 顧客ID（customer_id）が"CS018205000001"
- 商品コード（product_cd）が"P071401019"以外

##解答
```:コード
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] \
.query('customer_id == "CS018205000001" & product_cd != "P071401019"')
```

##出力
|  | sales_ymd | customer_id | product_cd | amount |
|--:|--:|:--|:--|--:|
| 36 | 20180911 | CS018205000001 | P071401012 | 2200 |
| 9843 | 20180414 | CS018205000001 | P060104007 | 600 |
| 21110 | 20170614 | CS018205000001 | P050206001 | 990 |
| 27673 | 20170614 | CS018205000001 | P060702015 | 108 |
| 27840 | 20190216 | CS018205000001 | P071005024 | 102 |
| 28757 | 20180414 | CS018205000001 | P071101002 | 278 |
| 39256 | 20190226 | CS018205000001 | P070902035 | 168 |
| 58121 | 20190924 | CS018205000001 | P060805001 | 495 |
| 68117 | 20190226 | CS018205000001 | P071401020 | 2200 |
| 72254 | 20180911 | CS018205000001 | P071401005 | 1100 |
| 88508 | 20190216 | CS018205000001 | P040101002 | 218 |
| 91525 | 20190924 | CS018205000001 | P091503001 | 280 |

##解説
・PandasのDataFrame/Seriesにて、列を指定しつつ、指定した行のうち、条件に当てはまる行を確認する方法です。
・列情報を絞り、かつ、行を指定して、かつ、条件に当てはまる情報を確認したい時に使用します。 
・**'<データ名>[['<列名A>','<列名B>','<列名C>']].guery('<列名A> == "<行情報A>" & <列名B> != <行情報B>')'**で、指定した列(列名A,列名B,列名C)のうち、列名A が指定した 行情報A に該当する行で、かつ、列名B 指定した 行情報B に該当する行を表示します。

※以下のコードのように「!=」を「<>」にしてしまうと、エラーになります。「<>」は、過去に「!=」と同じ意味で使用されていましたが、現在は使われていません。

```:コード
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] \
.query('customer_id == "CS018205000001" & product_cd <> "P071401019"')
```

※比較演算子については、[こちら](https://www.atmarkit.co.jp/ait/articles/1907/23/news010.html)の記事が参考になります
【Git】過去の状態に戻すときのコマンド

# 概要
最近Gitの勉強をしています．過去のコミットした状態に戻したいときの選択肢として，`git reset --hard <commit_id>`と`git checkout <commit_id>`があります．これらの違いがいまいちよく分からなかったので調査中です．

# `git reset --hard <commit_id>`
これは基本通りの型です．

# `git checkout <commit_id>`
これは少し特殊な方法だと思います．そもそもcheckoutというのはブランチを切り替えるためのコマンドです．参考(1)でもcheckoutの応用編としてこちらの使い方を紹介しています．

# 参考
(1) [【 git checkout 】コマンド（応用編）――ワークツリーを特定のブランチやコミットに切り替える](https://www.atmarkit.co.jp/ait/articles/2004/30/news017.html)
この記事自体は無料会員にならないとみれないかもです．
(2)[Git の 'detached HEAD' 状態とその注意点](https://yu8mada.com/2018/05/31/detached-head-state-and-its-caution-in-git/)
(3)[git reset & git checkout 使い分けまとめ](https://dev.classmethod.jp/articles/git-reset-and-git-checkout/)
(4)[「git checkout <commit id>」はブランチを「ブランチなし」に変更しています](https://www.it-swarm-ja.tech/ja/git/「git-checkout-ltcommit-idgt」はブランチを「ブランチなし」に変更しています/1040723653/)
(5)[7.7 Git のさまざまなツール - リセットコマンド詳説](https://git-scm.com/book/ja/v2/Git-のさまざまなツール-リセットコマンド詳説)
(6)[[git] 戻したい時よく使っているコマンドまとめ](https://qiita.com/rch1223/items/9377446c3d010d91399b)
scssでの折り返しについて

#最初に
出品機能を実装中、プレビュー画像をlabel-boxと横並びにしたかった。
<img width="679" alt="57eb6db53b4f420228aa7e8d2a956573.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677058/a78bafce-9317-c744-ce10-fda90def8df0.png">


#原因
```flex-wrap: wrap;```で折り返されていた...
```flex-wrap: nowrap;```に変更。単一行に押し込むという形で横並びにすることが出来ました。
<img width="687" alt="330fc64d44bf614fb469022224960558.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677058/d20c1254-7cc7-a716-0b81-ea6f6eca9c7a.png">


#flex-wrapプロパティについて
フレックスアイテムを単一行に押し込むか、あるいは複数行に折り返してもよいかを指定するプロパティ。
横並び!横並び!と考え方が凝り固まっていました。
横並びの方法はfloatやinline-blockしか思い当たらず参考アプリの検証ツールで原因に気づくことが出来ました。
思いがけない自分の記述で手間取ってしまったので、コードを修正するときは広い視野を意識していきます。

#参考サイト
https://developer.mozilla.org/ja/docs/Web/CSS/flex-wrap
Udemyのswiftコース（英語のやつ）でiOSアプリ開発を学ぶ　その２

勉強するコースはこれです:point_down:
https://www.udemy.com/course/ios-13-app-development-bootcamp/

##進捗
セクション2まで終了（全部で36セクション）
Xcodeの使い方など開発環境についてのお話がメインだった
##最初の感想
＜Udemyのコースについて＞
- 本当に手取り足取り教えてくれるので、知識ゼロからでも学べそうなレベル
- 英語のレベルは、アメリカの小学校高学年～中学校くらいのレベルな気がする（小難しい単語は出ない）
- 先生（Dr. Angela Yu）の英語は、少しイギリス英語アクセントっぽいが非常に聞き取りやすい（アジア人にとって分かりやすい英語だと思う）
- やや説明するスピードが速いが、英語字幕があるので大丈夫そう
- 先生の英語はとても勉強になるし、ちゃんとした授業形式になっているので学びにつながる
~~- これやっとけばセブ島留学とか行く必要ないんじゃないかとすら思う。。~~

＜iOS開発について＞
- レイヤーになっているところとかPhotoshopっぽい
- やはりwindowsとは違うので、操作には慣れが必要になる
- windowsよりも開発環境が全体的にデザインがポップな印象、ちょっとテンション上がる

##今後の予定

特に問題ないので、この調子で進めていく。
NITIC_CTFに参加した

NITIC CTFに参加しました。
楽しかった！！
高専生が主催している大会とのことでした。すごいなあ...!!
初心者向けなので、取り組みやすくて助かりました、ありがとうございます！:baby:

覚書程度に書き留めます。
## anim
flagファイルが、PKで始まっていたのでなんらかの圧縮ファイル。
復号化も一通り試したが、特に見えなかった。
flagファイルの中身が一部読め、pptxっぽい拡張子が見えた。
pngで添付画像があるようにも見えた。
なので、.pptxをつけると開けて、スライドショーにすると、最背面にいったflagが書かれた画像が浮かび上がってきた。
勝ち。

##fortran
同じディレクトリ内に沢山ツールをインストールしまくったらできた。
ツールが少ない段階で、まずはfakeのflagがでてきた。
これは、デバッガを使ってみていた時に確かに、複数回書き込みを行っている挙動があったので、合点がいった。
exeを実行しようとしたときに、ツールが足りないと怒られたので、順次入れていって、cat コマンドで中身を見たら、flagが書き換わっていた。
勝ち。

##web
ダウンロードしたテキストファイルの中身をペタッとブラウザに張り付けると、flagが書かれた画像が出てくる。
[参考](https://edge.sincar.jp/web/base64-inline-image/)

##recon
dangerous Twitter
色々単語検索をかけたが、パスワードらしきものは見つからず。
ひたすらこの方のアカウントを遡り、この方への理解を深めていったが、ダメだった。
PCではTwitterにログインしていないので、メディア一覧が見れない。
もしやと思い、普段Twitterに使用しているタブレットから、メディアを漁ろうとすると、、一枚目にありました。
これはゲームかな:smile:

##PPC
与えられた整数を素因数分解して、それをa1^t1*a2^t2*a3^t3...としていく。
これを指定されたflagの形式にすると、flagになる。
素因数分解のコードを書きます、と解説にあったが、素因数分解ソフトを提供するwebページを使いました(小声)

ここから先、友人の力を借りて検証したものです！
## Crypt
これは、平文のflagが書かれたファイルと、暗号文を生成するpythonファイルが添付されていた。
このファイルにflagの平文を渡し、再帰で暗号化のための関数を呼び出していたので、そのためのfor文が十分回るように今回の場合は適当な長さの配列を用意した。
すると、シフト演算によって暗号化が複数回行われ、複数回目にflagが現れた。

解説をよんでいると、生成されたflagの一文字目が今回のflagの文字になるまで再帰する、という処理をしていて、適当な長さに到達するまで回す方法として、覚えておこうと思った。

##Misc
拡張子がbatの、Windows用処理スクリプトが書かれたバッチファイルと、拡張子がshのUNIX系での処理スクリプトが書かれたシェルファイルが複数ありました。

```
set STR=%STR:()=h%
```
この手の代入文が複数行書いてあって、a=b,c=aという感じの代入文が見つかりました。
左辺と右辺が同じものをつなげていくと、複数ファイルがすべて一列に繋がりました。
繋がっている順番に複数ファイルの中身を書いて、一気に実行すると、元の暗号文に置き換えが効いて、flagが出てきました。
[setコマンド参考](https://qiita.com/plcherrim/items/9cba5a42273e10915c8f)
mod_sslで使用するSSLCipherSuiteの設定を詰めてみる '20

# SSLCipherSuiteの見直しの必要性
7月7日付で「[TLS設定ガイドライン](https://www.ipa.go.jp/about/press/20200707.html)」が改訂されたことから、[以前に記載した](https://qiita.com/papillon/items/f56a6f278609270a392c)設定からの見直しを行ってみる。

# 前提
CentOS 7.8で利用されているOpenSSL 1.0.2kではTLS 1.3をサポートしていないため、TLS 1.2のみを利用し、「推奨セキュリティ型」設定程度を目指すものとする。

# 設定を確認
## 以前の設定を確認
まずは以前の設定でどうなるかを確認してみる。

```apache:ssl.conf
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite SSL!3DES:!aNULL:EDH+HIGH:ECDH+HIGH:-AES128:-DSS
```

SSL Server Testで確認すると、一年前はAだった評価がBになってしまっていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63695/ebfb7404-5e21-a2a0-3740-c36b6e27ac11.png)

Cipher Suiteの評価も**WEAK**と表示されているものがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63695/73832776-90b5-5e87-f424-019274c6b42c.png)

## 厳しめに設定
「高セキュリティ型での利用推奨暗号アルゴリズム一覧」では**PFS(Perfect Forward Secrecy)が必須**で**GCM推奨**、ハッシュ関数は**SHA256（以上）必須**のようなので、シンプルに下記の設定を試してみる。
ECDHEがDHEより望ましいようなので、その部分も一応反映させる。

```bash
$ openssl ciphers -v '!SSLv3:!DSS:AESGCM+ECDHE:AESGCM+EDH'
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
```

画像は省略するが、**評価A**となり、ブラウザの互換性もおよそ問題ないように感じる。ということで設定は完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63695/e58978e4-7e92-6afc-2c26-8572683ccf6b.png)


## 対応ブラウザを増やす
一応、古いiOS、macOSのサポートのため、設定を緩和してみる。**WEAK**と評価されるが、ガイドライン上は問題ない。

```bash
$ openssl ciphers -v '!SSLv3:!DSS:AESGCM+ECDHE:AESGCM+EDH:EDH+AES256+SHA256'
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63695/092a6703-7f2f-e8a0-1bbe-c3876cf2482a.png)


# 設定する内容
という訳で、以下のような設定にすることとした。

```apache:ssl.conf
SSLProtocol -all TLSv1.2
SSLCipherSuite !SSLv3:!DSS:AESGCM+ECDHE:AESGCM+EDH:EDH+AES256+SHA256
```
Vue.js Rails ページ遷移

#前提
Rails 5.2
Ruby 2.5.1

```package.json
{
  "name": "app",
  "private": true,
  "dependencies": {
    "@rails/webpacker": "5.1.1",
    "vue": "^2.6.11",
    "vue-loader": "^15.9.3",
    "vue-template-compiler": "^2.6.11"
  },
  "devDependencies": {
    "webpack-dev-server": "^3.11.0"
  }
}
```

ファイル構成

```
app
|--javascript
   |--packs
      |--hello_vue.js
   |--app.vue
```

#本題
かなり初歩的ですが、とても躓いたため記述しました。

・VueRouterを導入

```
$ npm install vue-router
```

・app.vueに<RouterView>を追記

```app.vue
<template>
  <div id="app">
    <!-- 追記 -->
    <RouterView />
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data: function() {
    return {
      message: "Hello Vue!",
    };
  }
};
</script>
```


・app/javascript/packsの中にpagesフォルダー作成
・作成したpagesフォルダーのなかに、ファイルを２つ作成。

```pages/Hoge.vue
<template>
  <div>
    <router-link to="/">Test</router-link>
  </div>
</template>
```

```pages/test.vue
<template>
  <div>
    <router-link to="/hoge">Hoge</router-link>
    <p>login</p>
  </div>
</template>
```

・packsフォルダーにrouter.jsを作成

```router.js
import Vue from "vue";
import VueRouter from "vue-router";

import Test from "./pages/Test.vue";
import Hoge from "./pages/Hoge.vue";

Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    component: Test,
  },
  {
    path: "/Hoge",
    component: Hoge,
  },
];

const router = new VueRouter({
  mode: "history",
  routes,
});

export default router;
```

・hello_vue.jsにvue-routerを追記

```hello_vue.js
import Vue from "vue";
import router from "./router";
import App from "../app.vue";

document.addEventListener("DOMContentLoaded", () => {
  const app = new Vue({
    router,
    components: { App },
    template: "<App />",
    render: (h) => h(App),
  }).$mount();
  document.body.appendChild(app.$el);
});
```

ビルド後にページリロードして動作確認。

```
# bin/webpack-dev-server
```