OmniAICreator/Qiita-1.07M huggingface dataset:
ネットワーク通信量をできるだけ減らす（ブラウザ編）

## はじめに
我が家のネットワーク回線は、実はいまだに光ではなくADSL を使っています。低速な回線でもネットを楽しめるように工夫してきました。[前回の Windows 10編](https://qiita.com/strysd/items/7cac883a1a18fa71b739)は、自宅の Windows 10 で実際に設定した例をもとに紹介いたしました。
今回は、ブラウザでアドオンを追加する例を紹介します。
(4月29日に Facebook と Twitter のWeb サイトでの設定項目も追記)

自分は自宅では Firefox をメインに使用していますが、2つのアドオンを入れています。ちなみにこの2つのアドオンは、Google Chrome および Edge にもインストールできることを確認しています。

## アドオン
### uBlock Origin
以前は、画像をブロックするために別のアドオンを使用していました。そのアドオンでは、画像サイズが設定値を超えた場合にブロックしていました。広告のブロックは別のアドオンをインストールする必要がありました。

この uBlock Origin アドオンは広告などをブロックできますが、画像サイズを条件にしたブロックも可能です。そのため、現在はこの uBlock Origin に乗り換えています。
設定は非常に簡単です。

アドオンのオプションにていくつか表示されるタブのうち、設定タブを選んで一番下の「デフォルトの動作」で設定できます。
ブロックする画像サイズの条件はお好みで決めてください。値を小さくしすぎると、画像の解像度が下がって表示されたり、表示枠だけになったりするページばかりになってストレスになります[^1]。このアドオンの影響で Facebook や Twitter のタイムラインで表示される画像の解像度が下がる場合があります[^2]。
![brw_ublock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/7e951736-47d5-8f0f-2d0f-9d2f454d1945.png)
ちなみに、リモートフォントもブロックできるのでオンにして使っています。

[^1]: 私は、250 から 300 KB 程度をめどに画像ブロックの条件を設定しています。
[^2]: Firefox 75 では、該当の画像の上に黒字に白抜きの文字で「画像を読み込む」ボタンが表示されます。そのボタンを押すと、ブロックされたデータ部分も読み込み、くっきりした画像が表示されます。

### Enhancer for Youtube
ネットワーク回線の都合で、Youtube の動画を高画質で再生しようとすると、途中でデータの読み込みで待たされてしまうことがあります。
途中で途切れずにそこそこの画質で再生できるような画質にデフォルト値を設定する方法を探していた時に見つけたアドオンです。これも使い方は非常に簡単です。

オプションのページの中央付近に「画質を自動的に選択する」というチェックボックスと画質の選択肢があるので、チェックをつけて第一希望から第4希望までを選択します。
![brw_gazo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/15ec644d-9fc9-e8ad-da24-c91dd0fec733.png)

1024 × 768 の解像度に設定した液晶ディスプレイで Firefox で Youtube の動画を再生する場合ですが、いろいろな話題について Youtuber の人が顔出し登場して解説している動画の場合[^3]、144p だと画質が粗いことが気になりやすくなります。240p であればさほど気になりません。

一方で、液晶ディスプレイ全画面で動画を再生する場合や、観光地などの自然の景色の動画を見る場合は 240p よりは 360p が良いかもしれません。

動画の途中から画質を良くして視聴したい場合は、Youtube 動画上の歯車のメニューを操作して画質を変えることができます[^4]。
ネットワークのトラフィックをモニタリングしてみると、画質 240p の Youtube 動画の読み込み中は、約 80kbytes/sec の帯域が消費されているようです。

もし高画質でなくてもかまわない、という場合は試してみてください。

[^3]: 全画面での表示ではなく、デフォルトの状態です。
[^4]: データの追加読み込みが必要になるため、動画再生の再開まで少し待たされることがあります。

## Web サイトごと
(4月29日追記) Web サイトごとに設定できる場合もあります。
### Facebook 
PC のブラウザでは、動画の自動再生をオフにしたり、画質を HD(ハイビジョン画質) ではなく、SD (標準画質)に固定することができます。
![facebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/7763ccce-7744-0190-b616-55fd19764e91.png)

### Twitter
PC のブラウザでは、「データの通信量」設定の「データセーバー」にチェックをつけるだけです。
![twitter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/3f85c229-ec10-5452-0152-c1bbe25554eb.png)
thymeleaf 〇文字目～　省略表示方法

#thymeleafでDBから取得した文字列を指定文字数まで表示

今回業務で、ある範囲内に指定文字数を表示し、それ以降は「...」って表示することがあったので、
メモとして記載します。
まだまだ未熟ですので、間違っている箇所等あれば、指摘して頂けると嬉しいです。


##・文字列の長さ
```Java
"${#strings.length(hoge.str)}" //hoge.strの文字列を取得できる。
```

##・実際の使い方
```Java
//10文字以上の場合、9文字目まで表示させて、それ以降は「...」と表示
<span th:if="${10 <= #strings.length(hoge.str)}" th:text="|${#strings.substring(hoge.str,0,9)}...|"></span>
//それ以外は普通に表示
<span th:text="|${#strings.substring(0,9)}...|"></span>

``` 

###・その他
#### isEmpty
```Java
<th:block th:unless="${#strings.isEmpty(hoge.str)}">
  <span th:if="${10 <= #strings.length(hoge.str)}" th:text="|${#strings.substring(hoge.str,0,9)}...|">/span>
  <span th:text="|${#strings.substring(0,9)}...|"></span>
</th:block>
    hoge.strが空、nullでない場合に中の処理を表示
```

・参考文献
[Thymeleafのユーティリティメソッド活用サンプルコード](https://qiita.com/55beagle/items/2208cea678dc948b715c)
M5Atomの開発環境を整えてATOM Liteのサンプルを動かす


　ATOM MatrixとATOM Liteが発売されましたね！私はチェックが遅く購入できたのではATOM Liteだけでした。

　で早速使ってみようと思いArduino IDEの開発環境セットアップを行いました。

　最終的には次のようにLチカのサンプルコードを書き込んでみます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">よし！ATOMの開発環境構築できたぞ！サンプルのＬチカが動きました！ <a href="https://t.co/SMlKWZYaCs">pic.twitter.com/SMlKWZYaCs</a></p>&mdash; まえぷー@出窓菜園 BWG (@kmaepu) <a href="https://twitter.com/kmaepu/status/1250794330505138177?ref_src=twsrc%5Etfw">April 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

　基本的には[こちら](https://docs.m5stack.com/#/en/arduino/arduino_development)の手順で進めます。

##ボードマネージャからesp32をインストール
 Arduinoを起動し、
　スケッチ -> ボード -> ボードマネージャ
を開きます。

開いたら、esp32を検索します。2020年4月16日時点ではv1.0.4でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/f10c426e-f413-bcaa-c63e-af5d452023ef.png)

##ボードを選択
　ボード選択で次の名前を見つけて指定します。

```
ESP32 Pico kit**
```

##ライブラリをインストール
M5ATtomのライブラリをインストールします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/7d996ac2-4815-3b6c-2a1f-a65177966bf7.png)

##サンプルコードを開く
今回はATOM Lite用のサンプルコードを開きます。

ファイル -> スケッチ例 -> M5Atom -> Basic -> Button

##USBドライバが入っていなかった場合、インストールする
　ツールを開いたときに、シリアルポート欄が灰色だとUSBドライバが入っていません。
[こちら](http://localhost:8080/)からCP2104ドライバをダウンロードできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/1f2461c1-1725-2e7b-2f43-2cabe98e4677.png)

##実行！...エラーだ
　このまま実行したら次のようなエラーが出ました。「FastLED.h」ライブラリが足りていないようです。LEDがこのライブラリを使用しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/d2bed2a3-c083-669b-e0d5-13537ad8b3ec.png)

FastLED.hは、
　スケッチ ->ライブラリをインクルード -> ライブラリの管理
からFastLEDを検索してインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/0bb552f3-4e24-2961-1ee3-e8b414abf137.png)

##ボーレートを変える
　ライブラリも入ってコンパイル！と思うとまたしもエラーが出ます。[こちら](https://qiita.com/jksoft/items/fa92281f90bcbc32929c)の記事を参考にボーレートを115200に下げてみたら書き込みできました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/3ca40790-98c0-3489-882f-a21c43a9949f.png)

↓実際の様子
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">よし！ATOMの開発環境構築できたぞ！サンプルのＬチカが動きました！ <a href="https://t.co/SMlKWZYaCs">pic.twitter.com/SMlKWZYaCs</a></p>&mdash; まえぷー@出窓菜園 BWG (@kmaepu) <a href="https://twitter.com/kmaepu/status/1250794330505138177?ref_src=twsrc%5Etfw">April 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#おわりに
　いや～このサイズと価格はプロトタイピング界隈で衝撃をもたらしていますね。
趣味で菜園しているのでそれに使ったり、在宅ワークを楽しくするものを作っていきたいなと模索しています。安いからとにかく作って使ってみるという流れがとりやすいですね。
WindowsでHaskellを使う(VSCode+WSL+stack +Haskell IDE Engine)

# この記事は何？
WSL1 (Windows Subsystem for Linux) + VSCode + stack  +Haskell IDE EngineでHaskellの開発をする際の環境構築の手順を書き残します。仮想環境でVSCodeを使うとかなり重いので、VSCodeの本体はWindows上で、HIEやstack などのHaskell環境はWSL上で動かすことを目指します。
ただの忘備録なので、WSLが何か、HIEとは何か等は説明しません。

# 手順

1.  WindowsにVSCodeをインストール

2. コントロールパネルから「Windowsの機能の有効化または無効化」を表示し、「Windows Subsystem for Linux」のチェックボックスを「オン」にして再起動する

3. Microsoft StoreでUbuntu(WSL)を入れる

4. Ubuntuを起動し，初期設定をする
ユーザ名やパスワードを設定します

5. 以下をUbuntuで実行する (emacsはただの好み)

    ```:bash
    sudo apt update
    sudo apt upgrade
    sudo apt install -y emacs
    ```

6. Ubuntuにstackをインストールする

    ```:bash
    wget -qO- https://get.haskellstack.org/ | sh
    ```

7. Ubuntuの設定(~/.bashrc)ファイルに以下を追記
Usernameは適宜読み替えてください

    ```:~/.bashrc
    export PATH="/home/Username/.local/bin:$PATH"
    ```

8. stackの初期設定
emacs等で、Ubuntu側の ~/.stack/global-project/stack.yaml を以下のように編集します。resolverは適当なものを[stackage](https://www.stackage.org/)から選んでください。ここでは、lts-12.26 (ghc-8.4.4)にします。

    ```:~/.stack/global-project/stack.yaml
    packages: []
    resolver: lts-12.26
    ```

9. GHCのインストール
   Ubuntuで以下を実行します。

    ```:bash
    stack setup
    ```

10. Haskell IDE Engineのインストール
   Ubuntuで以下を実行します。詳細は[HIEのGitHub](https://github.com/haskell/haskell-ide-engine#installation)を参照してください。ビルドにはとても時間がかかります。
なお、HIEはビルドしたバージョンにしか対応しないので、他のバージョンのGHCを使った開発をしたい場合はその都度ビルドしなおす必要があるそうです。

    ```:bash
    sudo apt install libicu-dev libtinfo-dev libgmp-dev
    git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
    cd haskell-ide-engine
    stack ./install.hs hie-8.4.4
    stack ./install.hs data
    ```

11. WindowsでVSCodeを起動し、日本語化のパッケージを入れる
「Japanese Language Pack for Visual Studio Code」です。

12. VSCodeとUbuntuを繋ぐパッケージ 「Remote - WSL」 をVScodeに入れる

13. VSCodeでF1キーを押し、「Remote-WSL: New Window」を実行する
新しいウインドウが立ち上がるので、前のwindowは消す。このウインドウはWSLと通信しているため、例えば「ファイル」を開くとUbuntu内のファイルを選択できるようになっている。

14. 先ほどの新しいウインドウで、VSCodeに「Haskell Language Server」というパッケージを入れる

15. VSCodeのsettings.jsonに、以下を追記する
    
    ```settings.json
    "languageServerHaskell.hieExecutablePath": "~/.local/bin/hie"

    ```

# 最後に
以上で設定は終わりです。
WindowsのVSCodeを通して、HIEの機能を使いながらWSL(Ubuntu)上でHaskellの開発ができるようになったと思います。仮想環境を使うよりもだいぶ軽くて快適な開発環境になります。
まもなくWSL2が出るらしいので、更に快適になりそうですね。

ウインドウを閉じるたびに13.の手順が必要なことに注意してください。
ポータルサイト創作記：２日目

昨日はリモートリポジトリを作成したので、ローカルにクローン。
<img width="482" alt="スクリーンショット 2020-04-16 22.56.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/c4cef01e-47dc-d7c9-0c6a-4cc6fce47993.png">
<img width="1146" alt="スクリーンショット 2020-04-16 22.58.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/abfed868-dd96-c568-ca46-0dd8ec76bdc5.png">
そして、ターミナルを立ち上げて、Rails new！
<img width="1440" alt="スクリーンショット 2020-04-16 23.09.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/595f2a30-611b-87ff-35ea-96fc2970c28c.png">
すると…一気にフォルダが作成される…
<img width="1440" alt="スクリーンショット 2020-04-16 23.10.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/f7985c4e-9656-e82f-b9c1-bc2b1423b0ec.png">
テクノロジーってすごいなぁ…
<img width="357" alt="スクリーンショット 2020-04-16 23.10.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/b92350ab-9523-a43f-a88d-e3b1cc516cd5.png">
さぁ、作成していきますか！
Jupyter上で複数のカーネルを選択可能にする方法

悪戦苦闘したのでメモがわりに。

# 概要
Jupyter上で複数のカーネルを使用したい。
例えば
- python2.7と3.6
- Anacondaの仮想環境1と仮想環境2
のような状況を想定しています。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212428/37e30e6e-b4a7-5855-efe2-b753249fd5f9.gif)

このような感じでカーネルを変更できるようになります。

# 手順
- Anacondaで仮想環境を構築
- IPythonのカーネルに追加

という方法で問題を解決します。

ここではpython2.7と3.6のカーネルを追加する例を用いて、順番に説明していきます。なお、Jupyterについては既にAnacondaをインストールした際に導入されているものとします。

## 仮想環境を作る
まずそれぞれの仮想環境を作成、その際に```ipykernel```もインストールします。

- 仮想環境1

```python2.7
conda create -n py2 python=2.7 ipykernel 
```

- 仮想環境2

```python3.6
conda create -n py3 python=3.6 ipykernel 
```

完了後に```conda info -e```で仮想環境が作れているか確認、できていれば次のステップに進みます。

## カーネルの追加
まず、**ぞれぞれの環境に入ります**

```
conda activate 仮想環境名
```


そして以下を実行

```
python -m ipykernel install --user --name 仮想環境名 --display-name="表示名"
```

ここで```--name```は仮想環境名、```--display_name```はJupyter上のカーネルの表示名になります。
ここでは仮想環境名が```py2```、```py3```及び、表示名は```Python2.7```、```Python3.6```としました。

実行後Jupyter labを立ち上げると以下のようにカーネルが追加されていることがわかります(ここでPython 3はデフォルトの環境です)
![Screen Shot 2020-04-16 at 21.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212428/5cad2db6-2cd9-8ed4-8d71-02f9fde47cfb.png)

またそれぞれのConsoleを開いてみると
![Screen Shot 2020-04-16 at 21.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212428/84f65132-4bca-cf4e-fe35-b103248cdd30.png)
![Screen Shot 2020-04-16 at 21.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212428/59270a83-91e9-a0a1-da9f-3e58563aa2e4.png)
このようにそれぞれのカーネルを使用できていることが確認できます。

この状態でJupyter Notebookを立ち上げると、冒頭のGIFのようにカーネルが選択可能にななっています。

# おわりに
これでJupyter上でカーネルを切り替えることができるようになりました。

[ブログ](https://black-thunder.hatenablog.com/)でもその他、ちょっとした内容を公開しています。
よければご覧になってください。

# 参考資料
- https://medium.com/@jeremy.from.earth/multiple-python-kernels-for-jupyter-lab-with-conda-c67e50de3aa3
- https://qiita.com/tomochiii/items/8b937f15c79a0c3eae0e
PHPのビルトインWebサーバを使ってみる。

[ターミナルでPHPコードを実行する
](https://qiita.com/yuskesuzki@github/items/040adc6e74af6bbec705) を使って、PHPのコードをざっくりと動かせるようにはなります。

だけど、やっぱりネットに強いプログラミング言語・PHPですから、HTTPのGETとかPOSTで渡されたパラメータとか処理してみたくなるじゃないですか。

ターミナル起動のPHPではコードは動くけど、HTTPの通信をあれこれ処理することはできません。

そんな時、Apacheやnginx、mod_phpとかphp-fpmなどインストールしなくとも、ターミナルから

```bash
$ php -S localhost:8000
```

と入力して実行すれば、PHPのビルトインWebサーバが起動します。

```bash
Document root is /Users/hogehoge/projects/php_test
Press Ctrl-C to quit.
```

起動したディレクトリがドキュメントルートになるので、ここに `index.php` を置いて

```php:index.php
<?php
echo "Hello! PHP";
```

ブラウザで `http://localhost:8000` にアクセス。

![スクリーンショット 2020-04-16 22.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18599/cf4fa06c-d825-e995-0f11-ab9031e0eb68.png)

なにやら画面が出てきました。

こんな感じで、ビルトインのWebサーバを用いて、ブラウザから極々簡単なPHPコードを試すことができるようになりました。

やめたくなったら、ターミナルに戻って Ctrl+C を押して、サーバを止めちゃいましょう。
SpringBootの初歩の初歩で詰まった話（解決済）

どーも、ふぎとです。

今回は初歩的なエラーの備忘録です。
具体的には「SpringBootとThymeleafを使って、
http://localhost:8080 に"Hello World"と
表示するMVCアプリケーション試作時に出会った
whitelabel error pageへの対処」の記録です。

##まずはプロジェクトの作成

[こちら](https://qiita.com/gevanni/items/c1748f32d5045f63e149)の記事通りに作成しました。
そのまま記事に従ってサーバ起動、localhostのページへ……。

##エラーページがどーん

スクショ忘れましたが、早速エラーページに遭遇。
よくよく見てみると
"This application has no explicit mapping for /error"
とのこと。ふむ？

##とりあえずエラーメッセージで検索
<img width="900" alt="2020-04-16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536013/5c2471a3-1f69-cc6f-f24c-1dfae937bda2.png">

どうやらハマりがちなエラーのよう。
でも「依存関係にThymeleafを追加してみて」など
もうしてることに対する指摘おおめ…汗
これは自分で質問するしかないか……ん？

##おや？？

自分で作成したHelloController.javaと
[この記事](https://teratail.com/questions/50850)に載ってるControllerのソースと見比べていて違いを発見。

~~~ruby:記事のController
package com.example.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@RequestMapping("")
@Controller
public class PortalController {

    @RequestMapping("")
    public String index() {
    System.out.println("aaa");
    return "home";
    }
} 
~~~
~~~ruby:ふぎとのHelloController.java
package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;


@Controller 
public class HelloController {
    @RequestMapping("/")
    public ModelAndView index(){
        ModelAndView model = new ModelAndView();
        model.setViewName("index"); 
        return model;
    }
}
~~~
**Controllerアノテーションの前にRequestMappingアノテーション
付けてへん。**

ひょっとしてこれか……？

半信半疑でRequestMappingを追加。すると……

##いけた
<img width="900" alt="2020-04-16 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536013/611164b6-9c0f-e81d-1730-1f47346a3e95.png">
よくわからんけどちゃんと表示されました。ほんまになんでやろ。
また勉強します。ほな今日はこの辺で。
addEventListener() メソッドの引数 listener に設定するコールバック関数で、引数 (event)を省略した場合でも動作する理由

`addEventListener()` メソッドの引数 `listener` に設定するコールバック関数は、引数 (event) を省略した場合でも動作する。具体的には、次の通り「引数を省略しない場合」と「引数を省略した場合」が同様に動作する。

```JavaScript:sample1.js
// 引数を省略しない場合（'event'を引数として設定）
document.getElementById('sampleElement').addEventListener('click', (event) => {
  event.target.style.backgroundColor = 'red';
});

// 引数を省略する場合
document.getElementById('sampleElement').addEventListener('click', () => {
  event.target.style.backgroundColor = 'red';
});
```

## Q. なぜ引数を省略しても動作するのか

A. 引数を省略する場合の `event` は、`window.event`を指し、現在サイトのコードが処理している Event を返すため。

### 解説

`addEventListener()` メソッドの引数 `listener` に設定するコールバック関数は、`handleEvent()` メソッドを有する。`handleEvent()` の構文は次の通り **event オブジェクトを引数に取る。**

```:handleEvent()
eventListener.handleEvent(event);
```

そのため、前述「引数を省略する場合」のように記述することは、動作はするがそもそも望ましくないと考えられる。動作する理由は、引数を省略した場合でも（引数を省略しない場合の）`event` に相当するデータを `window.event` にて取得できているため。したがって、"結果的に"同様に動作する。

引数を省略した場合をより正確に記述すると次の通りになる。

```JavaScript:sample2.js
// 引数を省略する場合
document.getElementById('sampleElement').addEventListener('click', () => {
  window.event.target.style.backgroundColor = 'red';
});
```

つまり、引数を省略しない場合の `event.target` と 引数を省略しない場合の `event.target` は一見して同じ記述であるようにも見受けられるが、実は引数を省略する場合の `event.target` は `window.event.target` であり、（結果的に動作は同様となるものの）別物である。

最後に `window.event` は MDN にて次の通り使用を避けるよう記述がある点を伝え、解説を終える。

> *新しいコードではこのプロパティの使用を避けるべきであり、代わりにイベントハンドラー関数になる Event を使用してください。このプロパティは広くサポートされておらず、またサポートされていてもコードが壊れやすくなるおそれがあります。*
引用元: [Window.event - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Window/event)

以上。

To JavaScript 有識者の方。もし内容に誤りがあればぜひご指摘願いたい。

[参考] [EventTarget.addEventListener() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener)
Arduino M0pro をAtmelStudio からプログラミング

## 問題
プログラムを書き込もうとするとエラーになる。

```

Verifying Flash...Failed! address=0x0000 expected=0xa8 actual=0xff

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26413/b1a0fdb2-0618-7f19-da25-2c10f5d5d3f9.png)


## 解決
NVMCTRL_BOOTPLOTを0Bytesに設定しProgramするとVerifyがOKになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26413/41ede7ed-0bda-a5ff-a554-b503d171c7f4.png)

### 参考
[https://www.avrfreaks.net/forum/samd21-verifying-flashfailed](https://www.avrfreaks.net/forum/samd21-verifying-flashfailed)
同様の現象で困ってるとの質問があった。

[AtmelStudio で Arduino M0 PRO を動かしてみよう](https://flogics.com/wp/ja/2017/05/atmelstudio-%E3%81%A7-arduino-m0-pro-%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/)
Pythonで毎日AtCoder #38

### はじめに
[前回](https://qiita.com/taxfree_python/items/1d13ec564581a927a87f)
今日のよるかつの問題を解きます。

### A問題
[問題](https://atcoder.jp/contests/abc089/tasks/abc089_b)

**考えたこと**
setに入れてlenするだけ

```python
n = int(input())
s = set(input().split())

if len(s) == 4:
    print('Four')
else:
    print('Three')
```

### B問題
[問題](https://atcoder.jp/contests/abc075/tasks/abc075_b)

**考えたこと**
ちょっと前にやりました。全てのマスに隣接している全てのマスを調べる

```python
h, w = map(int,input().split())
s = [input() for _ in range(h)]

g = [[]*w for _ in range(h)]

for i in range(h):
    for j in range(w):
        c = 0
        if s[i][j] == '#':
            g[i].append('#')
            continue
        for n, m in ([-1,1],[-1,0],[-1,-1],[0,1],[0,-1],[1,1],[1,0],[1,-1]):
            new_h, new_w = i + n, j + m
            if new_h < 0 or new_h >= h or new_w < 0 or new_w >= w:
                continue
            if s[new_h][new_w] == '#':
                c += 1
        g[i].append(str(c))

ans = ''
for i in range(h): #このへんの書き方が汚ない
    c = ''.join(g[i])
    ans += c
    if i != h-1:
        ans += '\n'

print(ans)
```

### C問題
[問題](https://atcoder.jp/contests/arc059/tasks/arc059_a)

**考えたこと**
前にコメントで二乗の総和は各要素の平均値を取ったときに最小になることを教えてもらったので、実装。平均はstatisticsを使った。lenとsumを使っても実装できます。**PyPyにstatisticsは無いので注意**

```python
import statistics
n = int(input())
a = list(map(int,input().split()))

mean = round(statistics.mean(a))

ans = 0
for i in range(n):
    ans += (a[i]-mean)**2

print(ans)
```

### D問題
[問題](https://atcoder.jp/contests/abc051/tasks/abc051_c)

**考えたこと**
最初の一往復目は普通の最小距離。二往復目は一周外を周ればいい。

```python
sx, sy, tx, ty = map(int,input().split())

n = tx - sx #x座標の距離
m = ty - sy #y座標の距離

ans = 'R' * n + 'U' * m + 'L' * n + 'D' * m + 'L' + 'U' * (m+1) + 'R' * (n+1) + 'D' + 'R' + 'D' * (m+1) + 'L' * (n+1) + 'U'
print(ans)
```

### まとめ
Eは問題の意味が理解できなかったのでリタイア。40分で4完でした。簡単な問題だったので集中して解けばもっと早く解けた気がする。ではまた、おやすみなさい
CloudFormationでECSへSSMから機密情報の受け渡しをする

# Infomation Source
ちょっと前のリリースですが1年経ってないので一応どういうアップデートか書いておきます

[CloudFormationリリース一覧 2019/6/13 リリースの機能](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/ReleaseHistory.html)

> AWS::ECS::TaskDefinition
ContainerDefinition プロパティタイプでは、次のプロパティを使用できます。
- Secrets プロパティを使用して、コンテナに渡すシークレットを指定します。
Tags プロパティを使用して、メタデータを分類して整理しやすくするために、タスク定義に適用します。

# What's new?

ECSのタスク定義で、機密情報をSecrets Manager secretやSSM Parameter Storeから取得する方法のアップデート

## Before

JSONやWebコンソールからのみ設定可能だった

## After

CloudFormationでも設定可能となった

↓つまり

クラスターやサービスの定義だけでなく、タスク定義含めてCloudFormationで完結する

＼うれしい／

# How

該当箇所だけ抜き出すとこんなかんじ

```sample1.yml
Resources:
  taskDefinition:
    Properties:
      ContainerDefinitions:
          Secrets:
            - Name: HOGE
              ValueFrom: hoge

```

タスク定義全体だとこんなかんじ

```sample2.yml
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  略

Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      RequiresCompatibilities:
        - FARGATE
      Cpu: 256
      Memory: 512
      ExecutionRoleArn: ecsTaskExecutionRole
      Family: !Ref TaskFamilyName
      NetworkMode: awsvpc
      ContainerDefinitions:
        - Name: !Ref TaskFamilyName
          Image: !Sub ${AWS::AccountId}.dkr.ecr.ap-northeast-1.amazonaws.com/hoge
          Command: !Ref TaskCommand
          MemoryReservation: 128
          ReadonlyRootFilesystem: true
          Secrets:
            - Name: SECURE_TEST_STRING
              ValueFrom: secure_test_string
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: !Ref TaskLogsGroup
              awslogs-region: ap-northeast-1
              awslogs-stream-prefix: ecs
```

# Try

SSMパラメータストアに `secure_test_string` とその値を登録しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/0ba78309-a4d7-b05d-496e-a9d524cdebbf.png)

そして例えばECS上で実行するpythonコードとかにこんなかんじで書いておけば値が受け取れます。

```sample3.py
from logging import getLogger
from os import environ as env

logger = getLogger(__name__)

logger.info('hoge / ' + env['SECURE_TEST_STRING'])
```

デプロイして実行した結果↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/e6e6806e-32a0-0d0f-4ecb-3da44d934fc9.png)

とれてますね :tada:

# FYI
https://aws.amazon.com/jp/blogs/news/securing-credentials-using-aws-secrets-manager-with-aws-fargate/
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-secret.html
猫でもわかるプログラミング教室 第2回 -プログラミングとは-

プログラミングのイメージは、「コンピュータを思いどおりに動作させるためのプログラムを作成する」といったところだろうか。

 

 

では、プログラムとは何だろうか。

 

 

広い意味でのプログラムとは、「イベントの計画（手順書）」である（第1回でも記載のとおり）。

 

 

なじみが深いものだと、「遠足のしおり」や「新聞の番組表」などがプログラムにあたる。

 

 

遠足のしおりは、学生（人）が
イベント1：目的地に向かったり、
イベント2：お昼を食べたり
する。

 

 

プログラムは、コンピュータが
イベント1：朝アラームを鳴らしたり、
イベント2：写真を検索したり
する。

 

 

しおりとコンピュータのプログラムを対応づけると、どちらも対象（学生、コンピュータ）がイベントを円滑に行えるように計画を立てるものである。

 

 

ただ、コンピュータの場合、もし目的地が休業していたり、お昼のお弁当を忘れたりすると、イベントが計画どおりに行かずに止まってしまう。

 

 

そのため、そのような例外でも、コンピュータの処理が止まらないように、さらに深く、イベントの計画をつめる必要がある（そこにプログラミングの難しさがある）。

 

 

 

　また、プログラミングは、「言語（言葉）」である。

　

 

プログラミング言語というからには、もたらす効果は、日常的に使っている言葉（日本語）とまったく同じである。

 

 

会話や手紙も何か目的があり、相手に何かしてもらいたいことを伝える（たわいもない会話も返答してほしい。話を聞いてほしいという目的がある）。

 

 

外国人とコミュニケーションをとるために英会話が必要なように、コンピュータとコミュニケーションをとるためには、プログラミングが必要である。

 

 

プログラミングにも、コンピュータを動作させるという目的がある。

 

 

プログラミングとは、コンピュータと人がコミュニケーションをとるための唯一の方法である。

 

 

だから、コンピュータを知るためには、プログラミングを学ぶ必要があるのである。

 

 



 

第2回の要点をまとめると、

* プログラミングとは、「イベントの計画」を描くこと
* プログラミングも言語のうちの一つ
* プログラミングは、コンピュータと人がコミュニケーションをとるための手段
猫でもわかるプログラミング教室 第1回 -教室の目的-

　僕自身、プログラミング教育はあまり必要ないと感じている。

それより、コンピューターやAIの仕組み、免疫力、依存症について教育することの方がよっぽど重要だと思う（理由は、ここでは割愛させていただく）。

 

 

プログラミングを習うことのメリットは、コンピューターを動かすためのプログラムを作成できるようになることよりも、論理的思考（ロジカルシンキング）を身につけることにある。

 

 

現在（2018年10月）、コンピュータープログラムを動かすための言語がたくさんあるが、どれも根本的な原理は同じである。

 

 

そのため、根っことなる原理を理解していれば、どの言語でもプログラミングするのがそれほど大変ではなくなる。

 

 

プログラミングを容易に行えるようになるためには、まずは、論理的思考が必要である。

 

 

論理的な思考は、ものづくりの世界では、なくてはならない最もベースとなるスキルである。
 

 

　冒頭でああは言ったものの、0と1のシビアなコンピュータの世界だからこそ、プログラミングは、ロジカルな考え方を身につけるにはうってつけである。

 

 

本ブログ（教室）では、あくまで、論理的な思考を身につけるための基礎的な知識の説明を行う。

 

 

そのため、広い意味でのプログラミング（特定のプログラミング言語ではなく、コンピュータや人やイベントを円滑に動かすための方法や手順）について主述する。

 

 

なお、タイトルのとおり、内容は猫（小学生くらい）にもわかるレベルで記載する。

 

第1回の要点をまとめると、

* プログラミングを習うことの意義は、「論理的思考（ロジカルシンキング）」が身につくこと
* ものづくりでは、「論理的思考」が必要不可欠
* 本教室は、どのプログラミング言語にも対応できるように抽象的なプログラミングの説明
第06回　独自開発した「ニューロ型データベースモデリング Ver.2.0」がやっと完成したので公開する

###
はじめに
---
【 ニューロ型データベースモデリング Ver.2.0 】を公開する

「脳を構成する神経細胞（neuron）が繋がり合って情報を司る」
という仕組み（ネイチャーテクノロジー）に着目し
私が独自で研究・開発 してきた「データベースモデリング」です。
使用する静的テーブルは「２個(２種類)だけ」なのでシンプルな構造となり結果的に基本メンテナンスフリー の 汎用データベースモデリング が出来上がりました。

詳しくは【 [開発の歴史](https://kuhen.org/ndb/?page_id=77)：2016-03-04～05　総務省「異能vation」協力・協賛企業マッチングイベントに「ニューロ型データベースモデリング」が選定される 】をご覧下さい。

###
独自開発した「ニューロ型データベースモデリング Ver.2.0」がやっと完成したのでGithubで公開する
---
 [【公開先】https://github.com/kuhen-org/ndb](https://github.com/kuhen-org/ndb)

・各レコードに「識別名ID(識別名)」を持たせた（検索時、Left Outer Join連結を不要にしたかった）
![30.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567414/0b493de0-86de-c7aa-abb0-6e96c0ae71a8.jpeg)

・「入力項目名（F_ID_AES）」「入力データ(D_ID_AES)」をAESで暗号化した列を持たせた（データを暗号化しセキュアにしたかった）
![31.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567414/12c6f6a2-7112-b9ec-c5da-843029c86906.jpeg)


・【root_tbl】を複製し同じ構造のテーブルを１２個使い「各テーブルの役割」を決めた
![29.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567414/66053774-8fc1-649e-1367-99751a06bb43.jpeg)


###
まとめ
---
今使っている技術に満足しているなら「異能vation」は起こせない。
２０年間独自で研究してきた「汎用データベーステーブルモデリング」をここに公開する。
By skojima@kuhen.org

###
関連投稿記事
---
第05回　[独自開発した「ニューロ型データベースモデリング Ver.1」　全てのデータが簡単に【リンク先】を持てる](https://qiita.com/kuhen-org/items/5d81a5e8aafe94040812)
GameBoy風のImageEffectシェーダコード

twitterにアップしたGameBoy風に見えるようなImageEffectのシェーダコードを貼っておきます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Qiitaに貼り付ける用に、<br>GameBoy風ImageEffect用シェーダ修正版の動画撮り直した。<br><br>twitterに貼るとボヤケてドット感薄れるので、<br>前回よりもドット幅広げたけどどうだろう。 <a href="https://t.co/GG56FclUwX">pic.twitter.com/GG56FclUwX</a></p>&mdash; MIYAKE (@ScreenPocket) <a href="https://twitter.com/ScreenPocket/status/1250769145664159746?ref_src=twsrc%5Etfw">April 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
さて、昨日と今日にかけて4つの記事(3つ+α)を投稿しました。

- [シンプルなImageEffectその１。モザイク。](https://qiita.com/ScreenPocket/items/c311e22e250df7451fab)
- [シンプルなImageEffectその２。モノクロ。](https://qiita.com/ScreenPocket/items/4e33b8f4a2925f109e97)
- [モノクロImageEffectをベースに、スクリーン合成の話。　〜月曜日のたわわのようなトーンを目指して〜](https://qiita.com/ScreenPocket/items/e739afb03bc0a6230dae)
- [シンプルなImageEffectその３。Posterization](https://qiita.com/ScreenPocket/items/1e8247e272d6e120bc21)

ここで全部の集大成としてGameBoy風の見た目になるようなImageEffect用シェーダを作ります。

正直に３つ(モザイク、モノクロ(スクリーン合成)、Posterization)のImageEffectをかけても良いのですが、
3回もGraphic.Blit()を行うのは処理がもったいないので、計算部分を一つにまとめたOldMobileGame.shaderを用意しました。

```glsl:OldMobileGame.shader
Shader "ScreenPocket/ImageEffect/OldMobileGame"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _UvDivideNum ( "UV Divide Num", Float ) = 128
        _ColorDivideNum ( "Color Divide Num", Float ) = 4
        _Color ("Main Color", Color ) = (0.025,0.35,0,1)
    }
    
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            float _UvDivideNum;
            float _ColorDivideNum;
            fixed4 _Color;

            fixed4 frag (v2f i) : SV_Target
            {
                //モザイク状にサンプリングする
                float2 uv = floor(i.uv * _UvDivideNum) / _UvDivideNum;
                half4 col = tex2D( _MainTex, uv );
                //モノクロ化
                col.rgb = Luminance(col.rgb);
                //ポスタリゼーションで色数を刻ませる
                col.rgb = floor(col.rgb * _ColorDivideNum) / _ColorDivideNum;
                //スクリーン合成で色を乗せる
                col.rgb = 1 - (1 - col.rgb) * (1 - _Color.rgb);
                return col;
            }
            ENDCG
        }
    }
}
```
![スクリーンショット 2020-04-15 21.30.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/0d0de98d-3061-0707-7529-44bd40719ff4.png)
それっぽい感じが出せたかな？
そのまま使うのも良いですが、元の色（tex2D( _MainTex, i.uv )）をキープしておいてシームレスに切り替えてみるとか、
ドット絵が急にリアルになるような世界観の切り替わり演出にも応用できそうですね。
本番作業をするエンジニアが海外ドラマのチェルノブイリを見るべき理由

昨年、アメリカのHBOで放映されたチェルノブイリというドラマがあります。（YouTubeとGooglePlayで有料配信で見えます）
https://www.hbo.com/chernobyl


内容としては、チェルノブイリ原発事故を史実に基づいて描いた作品なのですが、
本番作業をするエンジニアにぜひ見てほしい内容でした。
※史実に正確にするためにかなりグロテスクな映像が多い映画ですので苦手な方はご注意ください。
※ネタバレを以下の記事は多少含みます。（史実に基づいてるので調べれば結末は周知の事実かもしれませんが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257241/93211acb-218b-6cb1-4b98-c4044bb91b99.png)

#見どころ（最終話に凝縮されていますが）
・当日、かなり大きな作業を引き継ぎも碌になしにやれと言われるよ！
・と思いきや手順書がデグレしまっくていて本番手順書なのに過去の手順が二重線で消しただけで存在するよ！
・上司にそれを報告しても作業を実行しろとしか言われないよ！
・実験を開始する基準値を満たしてないのに作業を実行しろという指示を言われるよ！
・初めての作業＆ほぼ新人の作業員（ベテランと組んでるとは言え）なのに作業が遅いとどやされるよ！
・手順書通りに作業進めたのに、想定と違う結果が出て上司にどやされるよ！
・その上司は重要な作業にも関わらず、たびたび煙草を吸いに行くよ！
・最終的に切り戻し作業でも正常性が回復できないのに、正規の手順とは逸脱した方法で正常性を回復させようとするよ！！
・正常性が戻せなくなって最終的にシステム停止しようとするよ
・事故発生

ちなみに人為的な原因の他に、原子炉（システム）に重大な欠点がありました。
ただそれを前提としてもヒューマンエラーの原因の宝庫でした。
（こんな上司のもとでは絶対に働きたくないですね）

#実際の本番作業において
本番作業をした方なら思い当たる節があるかと思いますが、
本番作業にもままあてはまりそうな部分があります、、、。
手順書のデグレや引き継ぎが碌になく作業をする場合もあるかと思いますが、
結局自分を守れるのは自分だけです。
迷ったら実行しないという意識を持って作業をするように心がけたいものです。

全般的に胃が痛くなりそうな場面ばっかりですが、、、ぜひ本番作業をする前に見ていただきたいです。


#最後に
ドラマですので脚色されている部分も多々あるかと思いますが、緊張感とリアルな演出で最後まで飽きないドラマなので
ぜひリモートワークしながらみて頂きたいです。

あと、事件収束を図る科学者と政治家の二人組が出てくるのですが、そこもPMと営業にSIerの場合当てはまりそうでした。
お腹が痛くなりそうですね。こんな事故の収束とか。偉い人はみんな責任の押し付け合いで忙しいとか、、、
~~インシデントの真実を言ってももみ消されるとかも多々ありそうですね~~
Genericsでテンプレートの特殊化みたいなことをする

# 結論

https://stackoverflow.com/a/29379250 に載ってる方法で、1回分の仮想関数の呼び出しコストが増えるけどGenericsの特殊化みたいなことができる。

# どういうことか

↓のようなコードを書くと、 `Hoge` の型引数 `T` が `int` か `double` のときは `Hoge<T>.P.Func` はなんらかの値を返してくれるけど、それ以外の場合は `NotSupportedException` を投げるようになる。

`Hoge.P` は `IHoge<int>` か `IHoge<double>` にしかキャストできないので、

- `T` が `int` か `double` のとき、 `Hoge<T>.P` は `Hoge.P` で初期化される
- `T` がそれ以外の場合は `Hoge.P as IHoge<T>` は `null` になるので、 `Hoge<T>.P` は `new Hoge<T>()` で初期化される

というように、`T` が `int` か `double` のときだけ `Hoge<T>.P` がGenericじゃない方の `Hoge` で初期化されるのでこうなる。

```cs
public interface IHoge<T>
{
    T Func(T value);
}

public class Hoge<T> : IHoge<T>
{
    public static readonly IHoge<T> P = Hoge.P as IHoge<T> ?? new Hoge<T>();

    public T Func(T value)
    {
        throw new NotSupportedException();
    }
}

public class Hoge : IHoge<int>, IHoge<double>
{
    public static readonly Hoge P = new Hoge();

    public int Func(int value)
    {
        return value;
    }
    public double Func(double value)
    {
        return value;
    }
}
```
AtCoder 生活　28日目

[前回](https://qiita.com/flandrescarlet237/items/f4675fece8645db2e139)

#28日目
今回は、B問題とC問題を2問ずつ解きました

|問題番号|難易度|自力で解けた|かかった時間|
|---|:-:|:-:|---|---|
|ABC068|B|◯|23分5秒|
|ABC069|B|◯|11分52秒|
|ABC138|C|◯|100分44秒|
|ABC139|C|◯|32分38秒|

## ABC068_B

問題:[Break Number]
(https://atcoder.jp/contests/abc068/tasks/abc068_b)


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int n;
    cin >> n;
    int s = 2;
    int res = 0;
    rep(i,10){
        if(s*2 > n) break;
        else {
            s *= 2;
            res++;
        }
    }
    cout << pow(2,res) << endl;
}

```

解くのにかかった時間：23分5秒


## ABC069_B

問題:[i18n]
(https://atcoder.jp/contests/abc069/tasks/abc069_b)


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    string s;
    cin >> s;
    cout << s[0] << s.size() - 2 << s[s.size()-1] << endl;
}

```

解くのにかかった時間：11分52秒


## ABC138_C

問題:[Alchemist]
(https://atcoder.jp/contests/abc138/tasks/abc138_c)


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    double n;
    cin >> n;
    vector<double> v(n);
    rep(i,n){
        cin >> v[i];
    }
    sort(v.begin(),v.end());
    double res = v[0];
    for(int i = 1;i<n;i++){
        res = (res + v[i])/2;
    }
    cout << res << endl;
}

```

解くのにかかった時間：100分44秒
感想：間違っているところにしばらく気が付かなかった。



## ABC139_C

問題:[Lower]
(https://atcoder.jp/contests/abc139/tasks/abc139_c)


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int n;
    cin >> n;
    vector<int> h(n);
    rep(i,n) cin >> h[i];
    int res = 0;
    int m = 0;
    rep(i,n-1){
        if(h[i] >= h[i+1])res++;
        else{
            res = 0;
        }
      	m = max(m,res);
    }
    cout << m << endl;
}
```

解くのにかかった時間：32分38秒


###最後に
計算量を減らすことが1番大事


|難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|B|17分28秒|2問中2問|
|C|66分42秒|2問中2問|
Laravel5.8でログイン失敗時にセッションにのせてデータを返す

例えば、ログインフォームをモーダルで実装していた時とかに、何もしていないとログイン失敗でリダイレクト時にモーダルが隠れている状態になるので `return back()->with('login_modal', 'active')` でセッションにのせて返す。
blade側で `{{ session('login_modal') }}` で `active` が取れるのでclassとかにブチ込んでモーダルを表示させたいというやつです。
ログイン失敗時のLaravelの処理がググっても日本語の結果があまり出てこなかったので、誰かのためになれば。。

ログイン機能はみなさんお馴染みの `make:auth`で作っているので、そこで生成されたものを追っていく。
ログイン処理は `LoginController`で処理されているが、 `LoginController`は `AuthenticatesUsers` をUseしているので、それを見にいく。


```php:vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php

~~
protected function sendFailedLoginResponse(Request $request)
    {
        throw ValidationException::withMessages([
            $this->username() => [trans('auth.failed')],
        ]);
    }

~~

```

で処理されているっぽい。
ここでは単純にバリデーションをthrowしているだけ。なのでここをよしなに修正する。
流石に `vendor`内をいじるのは良くないので、 `LoginController`でオーバーライドする。

```php:LoginController.php
    protected function sendFailedLoginResponse(Request $request)
    {
      // throw ValidationException::withMessages([
      //     $this->username() => [trans('auth.failed')],
      // ]);
      // ↑が元々の記述
      return back()->with('login_modal', 'active')->withErrors([
          $this->username() => [trans('auth.failed')],
      ]);

    }
```

以上！


モーダルは `class="active"`で表示状態になるとして、

``` php:modal
<div id="modal" class="{{ session('login_modal') }}">
~~ 
</div>
```
としておくと、 `sendFailedLoginResponse()`で帰ってきたときにモーダルがactiveになる。


以上！
Ruby 　n番目の素数を探せるアルゴリズム

```ruby
@count = 1

def prime(n)
  num = 2
  count = 1
  catch(:break_loop) do  
    while n > num do
      if (n % num) == 0 
        # puts "#{n} は素数ではありません。"
        throw :break_loop
      end      
      num += 1
    end
      puts "#{n} は...  #{@count}番目の素数です"
      @count += 1
  end
end

def loop1
  2.step do |i|
    prime(i)
    # break if i == 100
  end
end



def prime2(n, t)
  num = 2
  count = 1
  catch(:break_loop) do  
    while n > num do
      if (n % num) == 0 
        # puts "#{n} は素数ではありません。"
        throw :break_loop
      end      
      num += 1
    end
      if t == @count 
        puts "#{@count}番目の素数は... #{n} です！"
      end
      @count += 1
  end
end

def loop2(target)
  2.step do |i|
    prime2(i, target)
    break if @count == target + 1
  end
end

p "終わりなき素数の旅にでる　→　1　　　n番目の素数を探す →　2"
imput = gets.to_i 
if imput == 1
  loop1
elsif imput == 2
  p "何番目の素数を探しますか？　数字を入力してください"
  a = gets.to_i
  loop2(a)
else
  p "「1」か「2」を入力してください"
end
```

↑コピペして実行してみてください。
コードが汚くて申し訳ないですが、任意の素数を探せます！

ご覧いただきありがとうございます〜
HerokuにLaradockをデプロイ

##HerokuにLaradockをデプロイする流れ

###ファイル構造
laravel_app
   |--laradock
   |--laravel
わかりづらいですが、Laravel_appディレクトリにlaradockとlaravelがあります。
（laravelディレクトリにlaravelが入っています）

###手順
laravelのアプリケーションは既に作ってあると想定しています。


```
$pwd
laravel_app

$heroku login  //herokuにログイン

$git init 
$git add .
$git commit -m "first commit"  //とりあえずコミット。

$heroku create アプリ名  //herokuにアプリ作成
Creating ⬢ アプリ名... done
https://アプリ名.herokuapp.com/ | https://git.heroku.com/任意のアプリ名.git

$git remote -v
heroku  https://git.heroku.com/アプリ名.git (fetch)
heroku  https://git.heroku.com/アプリ名.git (push)

$cd laravel
$pwd 
laravel_app/laravel //laravelディレクトリの中に作成。結構重要

$echo "web: bendor/vin/heroku-php-apache2 public/" > Procfile

$cd ..
$pwd
laravel_app

$git add .
$git commit -m "add porcfile"  //ここまでコミット

$cd laradock
$docker-compose exec workspace bash
#cd laravel

#php artisan --no-ansi key:generate --show  //APP_KEYを生成
base64:××××××××××××××

#exit

$cd ..
$pwd
laravel_app

$heroku config:set APP_KEY=base64:××××××××××××××   //herokuにAPP_KEYを設定

$git subtree push --prefix laravel/ heroku master  //laravelディレクト以下をherokuにpush

//herokuにデータベース作成
$heroku addons:add heroku-postgresql  //herokuにPostgresqlを作成

$heroku config
=== [アプリケーション名] Config Vars
APP_KEY:      base64:××××××××××××××
DATABASE_URL: postgres://[ユーザ名]:[パスワード]@[ホスト名]:[ポート]/[データベース名]

$ heroku config:set DB_CONNECTION=pgsql
$ heroku config:set DB_USERNAME=ユーザ名
$ heroku config:set DB_PASSWORD=パスワード
$ heroku config:set DB_HOST=ホスト名
$ heroku config:set DB_DATABASE=データベース名

$ heroku config
=== [アプリケーション名] Config Vars
APP_KEY:      base64:××××××××××××××
DATABASE_URL: postgres://[ユーザ名]:[パスワード]@[ホスト名]:[ポート]/[データベース名]
DB_CONNECTION: pgsql
DB_USERNAME:   ユーザ名
DB_PASSWORD:   パスワード
DB_HOST:       ホスト名
DB_DATABASE:   データベース名

$heroku php artisan migrate 
//マイグレーションの途中でyes/noで聞かれたらyes
//実行できたら成功

$heroku open
//ブラウザに表示
```

###気をつけるところ
・Procfileを追加する時、laravelの入っているディレクトリで行う。

・その他
herokuはgithubと連携できるので、連携してpushとかbuidとかしても良い。
AWS 認定ソリューションアーキテクト – プロフェッショナル 合格への道#1

#はじめに
昨日シスオプ試験で引っかかった問題があったので調べ直しをして、pro試験のサンプルの直しやります。
#学習
##AWS organization
https://engineer.crowdworks.jp/entry/2018/07/17/103453
以下の機能がある

* 新規アカウント作成
    * 新規アカウント作成で、なんとAWSアカウントをAPIで作成することが可能
* アカウントの階層的なグループ化
    * OU（Organizational Unit）という単位でAWSアカウントをグループ化
* 各アカウントのAPIへのアクセス制御（root含む）
    * OUもしくはAWSアカウントに対して、ポリシーを定義し、APIへのアクセス制御
* 一括請求

##AWS PlivateLink
https://dev.classmethod.jp/articles/ec2-elb-kinesis-service-catalogsystems-manager-vpc-endpoint-support/

###VPCエンドポイントの方式
* ゲートウェイVPCエンドポイント
    * ゲートウェイVPCエンドポイントではAWSのAPIへはパブリックIPへ向いており、アクセス制御はゲートウェイのアクセスポリシーで行います。
* インターフェイスVPCエンドポイント
    * 今回追加されたものは、下図のようにサービスのエンドポイントとENIをPrivateLinkと呼ばれるものでリンクされます。DNSを使ってENIのプライベートIPに<サービス名>.<リージョン>.amazonaws.comのようなAレコードが設定されます。この方式をインターフェイスVPCエンドポイントと呼びます。インターフェイスVPCエンドポイントではENIに対してアクセスするため、アクセス制御はセキュリティグループで行います。

https://dev.classmethod.jp/articles/aws-reinvent-vpc-privatelink-endpoint/

> 今回このPrivateLinkのエンドポイントを自分で作れるようになりました。つまり、PrivateLinkのエンドポイントを作って公開することで、独自アプリケーションを特定のVPCへ公開することができます。このアーキテクチャは例えばVPCを数百作成し、マイクロサービスを提供するということが実現できるようになります。

> 現在PrivateLinkで指定できるエンドポイントはNLB(Network Loadbalancer)になります。公開するアプリケーションはNLBを介して、PrivateLinkのエンドポイントとして提供されます。

###ケース
* PrivateLinkを利用すると、特定のNLBのみ公開できるのでアクセスを限定できる。逆にVPCピアリングだとセグメントレベルでの共有になるので、アクセス制限を意識する必要がある
* 相手側ネットワークのセグメントを意識する必要がない。VPCピアリングだと、ネットワークセグメントがかぶるとそもそもピアリングができない
* マーケットプレイスが用意されます。2018に公開されるとのことです。APIのエンドポイントをサブスクリプション形式で買って利用することができるようになります

###これよめばいいと思う
https://qiita.com/mksamba/items/20903940b8b256ef2487

#まとめ
目標の三冠を達成したので今日は休み。
明日から本気出す。
faviconは難しい

![image](https://images.unsplash.com/photo-1489850846882-35ef10a4b480?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2553&q=80)


svg アイコンが safari で読み込めない問題に直面した。
調べたところ、svg アイコンは safari では partial support しかされていないらしかった。

https://caniuse.com/#feat=link-icon-svg

基本的に、favicon.ico を置いておけば、幅広くいろいろなブラウザで表示できるわけだが、この `.ico` は deprecated ならしい。

https://css-tricks.com/favicon-quiz/

favicon のベストプラクティスはこの stackoverflow の回答が詳しいので参照されたい。
https://stackoverflow.com/questions/48956465/favicon-standard-2020-svg-ico-png-and-dimensions

現代は目まぐるしく新しいデバイスが出現し、消えていく時代なので、あらゆるデバイスサイズに対応するのは人類には難しい。
そのため、favicon の生成ツールを使うのが良いかと思われる。

https://realfavicongenerator.net/

favicon をアップロードすれば、いろいろなサイズの favicon とそれに対応するタグとアイコンを生成してくれるサイトみたいだ。なんて頼もしいんだろう。
C言語での順列生成プログラムの実装例と説明

C言語での**順列生成プログラムの実装例**と自分なりの**わかりやすい解説**をまとめました。
順列生成とはつまり`N!`通りの順列を全て表示させるプログラムです。

AtCoderの過去問を解いているときに、C言語における順列の生成法が分からなかったので調べたのですが、それでもわかりにくかったので自分で書きました。


## C言語での再帰の順列生成プログラムの実装例

```c
#include <stdio.h>
#include <stdlib.h>

void	permutations(int *P, int *used, int total, int N)
{
	int		i;
	int		n;

	i = 1; //as permutation does not contain 0
	while (i <= total)
	{
		if (!used[i]) //if i is unused in the current permutation
		{
			used[i] = 1; //mark i as "used"
			P[N] = i;
			if (N == 1) //print when one permutation is complete 
			{
				n = total;
				while (n)
				{
					printf("%d ", P[n]);
					n--;
				}
				printf("\n");
			}
			else // set num for P[N - 1]
				permutations(P, used, total, N - 1);
			used[i] = 0; //set i as "unused"
		}
		i++;
	}
}

int		main()
{
	int		N;
	int		*P;
	int		*used;

	printf("total num : ");
	scanf("%d\n", &N);

	P = (int *)malloc(sizeof(int) * (N + 1));
	used = (int *)calloc((N + 1), sizeof(int));

	permutations(P, used, N, N);

	free(P);
	free(used);
	return (0);
}
```

以下で簡単にコードの説明をしています。

#### 　main関数の挙動

1. 標準入力から生成する順列`N!`の値Nを読み取る
2. 順列をストックするための配列`P`を`malloc`で動的確保する
3. 一つの順列の中で、既に使われた数をトラックするための配列`used`を`malloc`で動的確保する
   
4. 配列を生成する関数`permutations`に先ほど確保した配列の`P`と`used`、そして配列の合計の`N`と現在の配列の番地を指し示す`N`を引数として渡す
5. 動的確保した`P`と`used`を`free`関数で開放する

(注意）2と3の時`N + 1`分の配列を確保しているのは、参照している値をわかりやすくするために、順列に含まれない0を飛ばしてそれぞれ`P[1]`、`used[1]`から配列を使用しているためです。

(追記）
`used`の配列が０で初期化されていなかったので、`malloc`の代わりに`calloc`を使用してはとのアドバイスをいただきました。ありがとうございます！`used`の配列は`calloc`を使って確保するように書き換えました。

#### permutations関数の挙動

この関数は再起的に呼び出されることによって順列を生成しています

イメージとしては以下の画像のようになります。
<img width="917" alt="Screen Shot 2020-04-16 at 21.37.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590589/c79f3c0e-2111-cc3b-7ea5-4bed05a6dd7b.png">

全体の流れとしては、
1. まず再帰の最下層である`N = 1`まで進み、その時点で完成された`P`が表示される
2. 使用されていた`i`が解放され、`N = 2`の層に戻る(`N = 1`では`i = total`のため`while`ループから抜けるから）
3. この時点で、`i = total`になるまで`while`ループに入っているので、まず`P[2]`と`P[1]`の値が入れ替わったものが次に表示される。
4. 使用されていた`i`が解放され、`N = 3`の層に戻る(`N = 1`と`N = 2`では`i = total`のため`while`ループから抜けるから）
5. この時点で`while`ループが終わるまで`i`の値の異なる順列を表示

という流れとして再帰されて順列が生成されます。
ArchLinuxでMcomixをダウングレード

ArchLinuxでMcomixをダウングレード
===========================

最近ArchLinuxでMcomixが1.3.0-devにアップデートされた．
従来のgtk2から変わってもうちょっとお洒落になった変わりに，劇的に使い難くなってしまった．

何が不便かというと

- コマンドラインからファイルを指定しても前回開いたファイルが開く
- ショートカットから削除が消えた

こんなゴミは使えない．かといってYACReaderやzathuraで代替できるかというと，
YACReaderはファイルの展開が遅いし，zathuraは設定が上手く反映できないし，2ページ表示の仕方が分からなかった．

というわけで，古いmcomixである1.2.1を手動で入れることにした．

しかし，いくつか嵌りそうなポイントがあったので誰かの助けになるかもしれないと考え，ここに残しておく．

ソースの準備
==========================

McomixはSourceForgeからダウンロードできる．

(Mcomix)[https://sourceforge.net/projects/mcomix/]

すると`mcomix-1.2.1.tar.bz2`というファイルがダウンロードされるため`tar`で解凍する．

```bash
tar zf mcomixx-1.2.1.tar.bz2
```

依存関係の準備
===================


mcomix-1.2.1は`python2`という時代遅れの言語を使用している．

私の気がついた範囲では`pygtk`を必要がある．(多分`gtk2`も必要のはずう)


```
sudo powerpill -S python2 python2-pillow gtk2
yay -S pygtk
```

あと`PIL`を使っているので`python2-pillow`か`pip2 install pillow`も忘れずに．



READMEを熟読
=====================

言うまでもないが，`README`を熟読する．

インストール
==========================

私の場合は`prefix`の設定もしないので以下でインストールした．

```
sudo python2 setup.py install
```



起動しない場合
====================

私の場合は昔からそうなのだが以下のようなエラーがでる．

```python
‘Traceback (most recent call last):
  File "/usr/bin/mcomix", line 11, in <module>
    load_entry_point('mcomix==1.2.1', 'console_scripts', 'mcomix')()
  File "/usr/lib/python2.7/site-packages/mcomix-1.2.1-py2.7.egg/mcomix/run.py", line 206, in run
    assert PIL.Image.VERSION >= '1.1.5'
AttributeError: 'module' object has no attribute 'VERSION'
```

読めば分かるが，`PIL.Image.VERSION`が存在しないということらしい．

普通`python`でバージョンを見るのであれば以下のようにするため，`VERSION`???

```python
from PIL import Image
Image.__version__
```


エラーに書かれている通りに
`"/usr/lib/python2.7/site-packages/mcomix-1.2.1-py2.7.egg/mcomix/run.py", line 206`
を見に行って.

```
sudo vim /usr/lib/python2.7/site-packages/mcomix-1.2.1-py2.7.egg/mcomix/run.py
```

ちゃんとバージョンチェックするように書き換えてもいいが，面倒なのでコメントアウトだ！

```
    try:
        import PIL.Image
		# assert PIL.Image.VERSION >= '1.1.5'
```

設定画面が開かない場合
=================================

mcomix-1.3.0で設定をちょこちょこ変更していると，設定ファイルが1.2.1に対応しなくなるのか，設定が画面が開けなくなった．

こういうのは大概設定ファイルを初期化すればよい．
mcomixの場合は設定ファイルを消せば自動でデフォルト設定ファイルをコピペしてくれる．
なので再設定がよほど面倒でない限り，おとなしく一回設定ファイルを消すのがいいだろう．
(気になる人は`cp`とか`mv`でバックアップを作っておく)

最近のLinuxであれば大概以下にある．

```
$XDG_CONFIG_HOME/mcomix
```

`$XDG_CONFIG_HOME`は代替`$HOME/.config`に設定されていると思う．

```
$HOME/.config/mcomix
```

これを全部削除しちゃう．

```
rm -rf $XDG_CONFIG_HOME/mcomix
```

そしてmcomix再起動してやれば初期設定がコピペされ，設定できるようになっているだろう．
シンプルなImageEffectその３。Posterization

twitterでアップしたImageEffect用シェーダ。Posterization（ポスタリゼーション）のコードを貼っておきます
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ImageEffect基礎その３。Posterization。<br>モザイクでやったテクスチャ座標の階段化を、色の方に実行することでトーンを粗階調化できる。 <a href="https://t.co/gAVCryzDIP">pic.twitter.com/gAVCryzDIP</a></p>&mdash; MIYAKE (@ScreenPocket) <a href="https://twitter.com/ScreenPocket/status/1250078497390743553?ref_src=twsrc%5Etfw">April 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

少し前の記事
[シンプルなImageEffectその１。モザイク。](https://qiita.com/ScreenPocket/items/c311e22e250df7451fab)
で書いたとおり、

```
floor(パラメータ * _DivideNum ) / _DivideNum
```
とすることで、パラメータのカーブを階段状に粗く（粗階調化）する事ができます。
モザイクはuvに対して上記の変換を行うことで一定間隔でサンプリング位置を固定していたのですが、
ソレを色のパラメータに行うことで、色調のカーブを粗階調化してポスタリゼーションを実装することが出来ます。

```glsl:Posterization.shader
Shader "ScreenPocket/ImageEffect/Posterization"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _DivideNum ( "Divide Num", Float ) = 1
    }
    
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            float _DivideNum;

            fixed4 frag (v2f i) : SV_Target
            {
                return floor(tex2D( _MainTex, i.uv ) * _DivideNum) / _DivideNum;
            }
            ENDCG
        }
    }
}
```
ゲームをレトロに見せたり、ホラー的な演出を作るときにも使えたりします。
python image processing

https://docs.python.org/ko/3/library/glob.html

glob unix shellの中に


pythonの長所はさすがに大容量で計算できること

import glob

filename_list = glob.glob("*")



from matplotlib import import as plt 

figure, axes _ plt.suplogts(nrows = 2, ncols =4)
figure.set_size_inches(18, 6)

for width in range(2): 
 for height in range(4):
   index = width *4 + height 
     image = image_list[index]


     ax = axes[width][height]

     ax.imshow(image)

      image_resized_list = []


     for image in image_list






//////
修了証明書一括作成

template = image.open("certification.jpg");
// ロゴ追加
logo = image.open("logo.jpg")
(paste 는 매번 불러와 코딩한다고 하는듯 아니 여러개할때는 temp를 만드는게 낫다는 거였다.)

temp = template.copy()
temp.paste(logo, (x. y))

course_name = "start_computer_sc)
logo 
//名前・。
tempate
ReactNativeでTextInputがmultilineの時paddingVerticalが効かない

## はじめに
割とピンポイントな内容ですが備忘録替わりに残そうと思います

## 起こった問題
タイトル通りですが`ReactNative`でmultilineの`TextInput`を使っている際に、縦に中央寄せしたい機会があり、`paddingVertical`を使い、上下に同じだけpaddingを取る方法で実装しようとしたところ上手く動きませんでした。

## 解決法

原因はわからないのですが(わかり次第更新します)単純にpaddintTopとpaddingBottomで上下に同じだけpaddingを取ると思った通りに縦の中央寄せを実現できます。

```js:style
paddingTop: 10
paddingBottom: 10
```
10秒で止めるやつを最速で止める

#概要
[@totoraj930](https://twitter.com/totoraj930)さんが作った[10秒で止めるやつ](https://totoraj930.github.io/10sec/)をできるだけ早く止めてみようと思います。

##多分これが一番早いと思います

###Step1
Webインスペクタを開きます


###Step2
コンソールに

```javascript
$button.click();$button.click()
```
と入力し実行

###Step3
やったあ！！！！
<img width="940" alt="スクリーンショット 2020-04-16 21.13.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/347df351-89b8-d193-7666-e6362f29e47f.png">

##あとがき
アホちゃう
ユーザー管理機能の実装（２）

今回も、引き続き**ユーザー管理機能の実装**を行なっていきたいと思います！
1~7の手順で進めていきます
（２）では**3.viewファイルの追加**を行います
＊（１）はこちらhttps://qiita.com/yni_se/items/482b992c748e134b3b03

#目次
1. deviseのインストール
2. Userモデルの作成
3. deviseのviewファイルの追加 **←いまココ！**
4. サインアップ機能の追加 **←いまココ！**
5. ユーザー情報編集機能の追加
6. ログアウト機能の追加
7. フラッシュメッセージの表示機能の実装

#3.deviseのviewファイルの追加
まず初めに、deviseのviewファイルを追加するためのディレクトリと作成しましょう！
作成するディレクトリは**２つ**です
・`devise`
・`users`
さらに、`devise`ディレクトリには、以下の**3つ**のディレクトリを作成しましょう！
・`registrations`
・`sessions`
・`shared`
ディレクトリが作成できたら、viewファイルを追加し、内容を記述していきましょう！
**devise/registrations**
・`new.html.haml`
　→新規アカウント作成ページ
**devise/sessions**
・`new.html.haml`
　→ログインページ
**devise/shared**
・`_links.html.haml`
　→LoginとSign upへのリンク
**users**
・`edit.html.haml`
　→アカウント編集ページ

#4.サインアップ機能の追加
続いて、サインアップ機能を追加していきます！

deviseのデフォルト機能では、**メールアドレス**と**パスワード**を入力してユーザー登録を行うようになっています
ここに`名前`も合わせてサインアップする仕様を実装するには、**ビューファイルの作成**と**ユーザー情報の保存に必要な機能**の実装が必要になります
ビューファイルは、"shared/link"に作成しておきます
次に、ユーザー情報を保存するために`application_controller.rb`の編集を行います

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_user!
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
```
`before_action`を使用することにより、すべてのアクションが実行される前に、2つのアクションが実行されます
`protected`以下で`configure_permitted_parameters`メソッドが定義されていて、ここでは`devise_parameter_sanitizer`メソッドが使用できるようになっています
これは、**ストロングパラメーター**に当たる機能です！
サインアップを行う時に、入力された`nameキー`の内容の**保存**を許可しています

ここまでできたら、サインアップのURLパターンを使ってビューが表示されることを確認してみましょう
今日はここまで！
次回（３）は、**"ユーザー情報編集機能の追加"**について解説していきます
お疲れさまでした！