OmniAICreator/Qiita-1.07M huggingface dataset:
MarkDown 忘れっぽいので

#まずはQiita の基礎

```
# 見出し 1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/f1769ad3-80f2-8722-28f0-537321121135.png)

```
## 見出し 2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/68270ec6-16a3-9b16-cb63-c9267a9cc5ef.png)

```
### 見出し 3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/8ac66182-f453-f956-430f-ea98cc77e2b4.png)

```
**強調**
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/06f137e8-a226-fdf1-0c80-73148f94ceb1.png)


```
[リンク](http://...)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/481d51ef-18d4-cdc3-71c6-1cd01b959cf7.png)

~~~
(空行)
```ruby:filename.rb
コード
こーど
```　
(空行)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/5539db7c-872d-401c-6990-c8a08b6ba813.png)

~~~
(空行)
```　
コード
```　
(空行)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/5392297e-0683-0a27-e5a6-8db6a46ce34e.png)

```
- リスト 1
- リスト 2
    - リスト 2-1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/44c8f3f4-32c5-2360-dcb0-8c86a4e391f0.png)

```
1. 番号付きリスト 1
1. 番号付きリスト 2
1. 番号付きリスト 3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/beb6b18b-cdd7-8cc5-886c-b09d034ae9cc.png)

```
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [x] チェックボックス 3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/c63f2d00-211c-8e30-3b44-7c5083897226.png)

# なんだかんだで使う

```
~~取り消し線~~
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/00851d26-5096-93b8-a1f2-3cb90a112c68.png)

```
<font color="red">赤の文字</font>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/aabc2478-a98e-bbcc-2a05-c762b2d2f383.png)

```
改行（空白）（空白）  
改行
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/260b36dd-1205-8838-763d-55a4e359ab1d.png)

```
> 引用1
> 引用2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/39bccbf8-05fb-8168-e2b7-22efd22bf3ec.png)

```
*** 
---
___
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/5f8e1873-9940-4419-2503-eb6136644b67.png)

```
<details>
<summary>折り畳みタイトル</summary>詳細１
詳細２
詳細３
詳細４
</details>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/72f372a8-3dae-ebca-ecaf-04ba7c7c0cdf.png)

```
![Alt属性=画像うめこみ](https://cdn.qiita.com/assets/qiita-fb-2887e7b4aad86fd8c25cea84846f2236.png "title=画像のタイトル")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263207/fca6f9a9-e0fb-312a-b0f6-ac5208c75ebd.png)
PHPのアロー演算子がわかんなかったのでまとめてみた

#アロー演算子とは
言ってしまえばこれのことです。

```sample.php
$hoge -> hoge;
```
この矢印なんやねん！って正直思っているあなた、安心してください私もわかりません。（いいのか？）
ということで、かんたんにまとめておきます。

アロー演算子は**クラスのメソッドやプロパティ（変数）にアクセスするための演算子**です。
どういうことか、ソースを見たほうが早いでしょう。
そこでオブジェクト指向にありがちな人間というオブジェクトを想定します。

```sample.php
<?php

class Human{
    protected $name;
    protected $age;

//説明１
    function __construct($name, $age) {
        $this   ->name  = $name;
        $this   ->age   = $age;
    }

//説明２
    function intro(){
        echo 'My name is '.$this->name.'. My age is '.$this->age.' years old.';
    }
}

$tom = new Human('Tom', '17');

//説明３
$tom->intro();

?>
```
これを実行すると以下が出力されます。

>my name is Tom. My age is 17 years old.

なんで英語やねん、とつっこみたいですがそこはスルー。PHPはおしゃれな言語ですからね（偏見）

##説明１
コンストラクタを作っています。見ればわかりますね。
ここで```$this->hoge = $hoge```が出現します。
これは「ここのhogeは$hogeですよ」といっているわけです。
しかし、**$this**ってなんやねんという疑問が発生すると思います。これは自分自身だと思ってください。つまりコンストラクタ自身なんです。
**コンストラクタ自身のhogeを$hogeとします**という認識で結構だと思います。違ったらご指摘ください。
ここではクラスに```$name```と```$age```というプロパティ（変数）がありますね。それにアクセスしているのです。

##説明２
これは説明１を読んでいただければわかると思います。
クラス自身、つまり```$this```の中にある```name```というプロパティ（変数）や```age```というプロパティ（変数）を呼び出しているだけです。

##説明３
もうここまで来るとわかると思います。
```$tom```というインスタンスが生成されました、そのインスタンスはHumanクラスから作られたものです。なのでHumanクラスから生成された```$tom```の中にある```intro```というメソッドを呼び出しているだけです。



#まとめ
**->ってなんやねん**と思いましたが、要は左の中にある右のものを取り出しているだけなんですね。私含め、この記事を読んでいる方が少しでも理解していただければ幸いです。
【備忘録】未経験から半年で学習してきたこと（Java）（１）

※駆け出しのエンジニアです。将来開発の仕事をし、東京・大阪勤務を希望します。
指摘・助言などよろしくお願いします。

#Java

##１．特徴
Javaの特徴としては２つあります。

###１）オブジェクト指向型言語
　１つのプログラムを「オブジェクト」として作成する考え方です。
考え方なので多くの学習者たちが悩まされます。
　オブジェクト指向には３つの特徴があります。

・継承
・カプセル化
・ポリモーフィズム

　上記３つの特徴を簡単に書きます。
　「継承」とは特徴・性質を引き継ぐことです。「カプセル化」はデータや値を守ることです。「ポリモーフィズム」は１つの枠組みをもとに、ほかの人が少しずつ変えられるようにできる方法です。

###２）マルチプラットフォーム
　Javaのプログラムでは「.java」というソースファイルから文法などをチェックしてくれる「コンパイル」作業を通してできる「.class」というクラスファイルがあります。このクラスファイルはJavaVM（Java仮想マシン）があればどこでも実行することができます。
　なぜJavaVMがあればどこでも動けるのか？
　理由は２つあって、１つめは「JavaVMがクラスファイルを実行するから」です。２つめは「OSが違っていてもJavaVMが違いを吸収する」からです。

##２．変数
「変数」とはデータをいれる箱のようなものです。
　変数で学習してきたことは３つあります。

###１）static変数
　static変数とは１つの~~メソッド~~インスタンスと別の~~メソッド~~インスタンスで共有して使える変数です。
method AとBがあったとします。それぞれ共有のstatic変数があったとします。
片方の変数の値を変えると、別の変数の値もかえないとコンパイルがとおりません。

###２）メンバ変数
　メンバ変数とはクラスに定義される変数です。
　class A{
    int b = 10;
      ・・・
   }
　上記のint型の変数bのようなものです。
  メンバ変数はクラス内に定義されていればどこのメソッドでも使えます。


###３）ローカル変数
　　ローカル変数とはメソッド内に定義される変数です。

　class A {
    int b = 10; //メンバ変数
　　public void methodc(){
     int d = 20;  //ローカル変数
　 }
   public void methode(){
      int f = 30;  //ローカル変数
　 System.out.println(f); //表示される
   }
}

メンバ変数、ローカル変数で出力できるかできないかアクセスの範囲が異なります。このような範囲のことを「スコープ」といいます。

次回「配列」など書いていきます。
楽天市場系APIからPythonでCSVデータを取得

<h2>概要</h2>
<p>
楽天市場系API（<a href="https://webservice.rakuten.co.jp/api/ichibaitemsearch/">https://webservice.rakuten.co.jp/api/ichibaitemsearch/</a>）からPython3を活用して、商品検索結果をCSVファイルで保存するためのコードです。
</p>
<p>
30件☓100ページ分取得ができるので、最大3000件のデータが取得可能です。
</p>


<h2>開発環境</h2>
<ul>
<li>Mac OS Mojave 10.14.4</li>
<li>Python 3.7.3</li>
<li>requests 2.21.0</li>
</ul>

<h2>事前準備</h2>
<p>
事前に楽天APIキーを取得しておく必要があります。
</p>


<h2>参考サイト</h2>
<p>
PythonでのAPI使用方法を参考にさせてもらったサイトがあるのですけど、見失ってしまいました…ゴメンナサイ。見つけ次第掲載します。
</p>


<h2>コード</h2>
<p>ファイル名:rakuten_api.py</p>
```python
import requests
import time

class rakuten_api:

    # -- コンストラクタ --
    def __init__(self, url):
        self.url = url

    # -- データ取得 --
    # serarch_criteriaは、検索用のパラメータを指定
    # output_parameterは、出力する項目のパラメータを指定
    # 返り値はリスト型
    def dataInport(self, serarch_criteria, output_parameter):

        # ページ番号の取得
        r = requests.get(self.url, params=serarch_criteria)
        response = r.json()
        pages = response['pageCount']

        # 取得データを蓄積するリスト
        pageList = []
        pageListAll = []

        # ページ番号１〜最終ページまでループ
        for p in range(1, pages + 1):

            # パロメータ［page］を上書きする
            parameter = {
                'page': p,
            }
            serarch_criteria.update(parameter)

            # 楽天APIへパラメータ送信
            r = requests.get(self.url, params=serarch_criteria)
            # 取得したJOINデータをリストとして配列に挿入
            response = r.json()

            # 連続に実行するとエラーが出るので１秒停止
            time.sleep(1)

            # リストの[Items]→[Item]の中から、
            # output_parameterで指定した項目を配列に挿入する。
            for r in response['Items']:
                item = r['Item']
                for o in output_parameter:
                    pageList.append(item[o])

                pageListAll.append(pageList)
                pageList = []
            
        return pageListAll

```

<p>ファイル名:任意</p>
```python
import rakuten_api
import pandas as pd

# 入力パラメーター(公式ホームページを参照)
serarch_criteria = {
        'applicationId': ['APIキー'],
        'keyword': '検索キーワードを自由に',
        'hits': 30,
        'sort': '+itemPrice',
    }

# 出力パラメーター(公式ホームページを参照)
output_parameter = ['itemName', 'itemPrice', 'postageFlag']

#上記記載のクラスを読み出す
rakutenApi = rakuten_api.rakuten_api('https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706')
result = rakutenApi.dataInport(serarch_criteria, output_parameter)

#pandasでCSV出力
df = pd.DataFrame(result, columns=output_parameter)
df.to_csv('result.csv', index=False)
```

<h2>補足</h2>
<p>
無駄にクラスで書いてます。検索結果件数を表示するためのメソッドを拡張しようかなと考えています。
</p>
<p>
入力パラメータと出力パラメータは公式HPにしたがって設定すればうまくいきます。
</p>
Go言語 - 開発環境構築

開発環境

- MacOS
- Visual Studio Code
- Github

達成目標

- Golangのバージョン管理
- Language Server
- プロジェクト毎にパッケージ管理

## gvmのインストール

**Golangのバージョン管理ツール**

**メリット**

- Golangに必要なものを一箇所で管理してくれる ($HOME/.gvm内)
- 複数のバージョンを `gvm use`コマンドで切り替えられる


``` bash:gvmの設定手順
$ brew install mercurial

$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

# 下のコマンドを.bashrcに設定する
$ source $HOME/.gvm/scripts/gvm

# .bashrc実行
$ source ~/.bashrc
```

## Golangのインストール

**この記事ではGolangのv1.12.7をインストールする手順を記す**

```bash:Golangのインストール手順
# ダウンロードできる Golang のバージョンリスト
$ gvm listall

# v1.12.7をダウンロード
$ gvm install go1.12.7 -B

# v1.12.7をデフォルトで使う設定
$ gvm use go1.12.7 --default
```


## ワークスペースの設定

**Goを使った開発を行うディレクトリの事で、環境変数のGOPATHで指定する**
この記事では、$HOME/goに設定する

```bash
# .bashrcに書く
export GOPATH=$HOME/go

# 設定できたか確認
$ source ~/.bashrc
$ go env | grep GOPATH
```

##ワークスペースの階層構造

ワークスペースには３つのサブディレクトリが必要

- bin: Goアプリのコンパイル後の実行ファイルを保管
- pkg: 実行ファイルを作るための外部パッケージを保管
- src: アプリ開発のソースコードを保管

```
$GOPATH ┬ bin
        ├ pkg
        └ src ─ github.com ─ {github_id} - {repository_name} ┬ .git
                                                             └ main.go
```

- {github_id}はGithubのアカウント名
- {repository_name}はリポジトリの名前


## Language Serverの設定

**公式でオススメされているLanguage Serverは[gopls](https://github.com/saibing/tools)**

その設定手順を記す。

１. GolangのVSCodeの拡張機能である[Go](https://marketplace.visualstudio.com/items?itemName=ms-vscode.Go)を入れる

２. goplsをインストールする

```bash
$ git clone -b bingo https://github.com/saibing/tools.git $GOPATH/tools
$ cd $GOPATH/tools/gopls
$ go install
```

３. VSCodeのsettings.jsonに下の内容を追加後、VSCodeを再起動

```settings.json
    "go.useLanguageServer": true,
    "go.languageServerExperimentalFeatures": {
        "format": true,
        "autoComplete": true,
        "rename": true,
        "goToDefinition": true,
        "hover": true,
        "signatureHelp": true,
        "goToTypeDefinition": true,
        "goToImplementation": true,
        "documentSymbols": true,
        "workspaceSymbols": true,
        "findReferences": true,
        "diagnostics": true
    },
    "[go]": {
        "editor.snippetSuggestions": "none",
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.organizeImports": true
        },
    },
    "go.toolsEnvVars": {
        "GO111MODULE": "on"
    },
    "files.eol": "\n",
```

## パッケージ管理ツール

**Golangのv1.11以降で採用されているgo modules(vgo)を用いる**

``` bash:vgoを使う宣言
# .bashrcに書く
export GO111MODULE=on

# 設定できたか確認
$ source ~/.bashrc
$ go env | grep GO111MODULE
```

go.modというパッケージ管理ファイルを作っておけば、`go build`を実行したときに、自動的に依存関係を理解してインストールして実行し、go.modに記録してくれる。

[上で説明した階層構造](#ワークスペースの階層構造)の場合は以下の手順でgo.modを作成する。

```bash
$ cd $GOPATH/src/github.com/{github_id}/{repositoty_name}
$ go mod init github.com/{github_id}/{repository_name}
```

# 参考文献

- [gvmのインストールと使い方](https://github.com/moovweb/gvm)
- [GOPATHとワーキングディレクトリ](https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/01.2.md)
- [goplsの設定](https://github.com/saibing/tools)
- [go modules(vgo)](https://github.com/golang/go/wiki/Modules)
SwiftでAES暗号化/復号化

# 環境

- Xcode 10.3
- Swift 5.0.1

# AES/CBC/PKCS7Padding してみる

[IDZSwiftCommonCrypto](https://github.com/iosdevzone/IDZSwiftCommonCrypto) というフレームワークを利用する。 `CommonCrypto` の Swift ラッパー。

CocoaPods または Carthage が利用できる。　CocoaPods の場合、自分の環境ではREADMEに記載されているようにバージョン番号を併記するとうまくいかず、バージョン番号ははずした。

```Podfile
platform :ios, '9.0'

target 'HogeApp' do
  use_frameworks!

  pod 'IDZSwiftCommonCrypto'
end
```

```swift
import IDZSwiftCommonCrypto

class CryptUtil {
    // 暗号化
    class func encrypt(plainText: String, key: String, iv: String) -> [UInt8] {
        let cryptor = Cryptor(operation: .encrypt, algorithm: .aes, options: .PKCS7Padding, key: key, iv: iv)
        if let cipheredText = cryptor.update(plainText)?.final() {
            return cipheredText
        }
        return []
    }
    
    // 復号化
    class func decrypt(encryptedData: [UInt8], key: String, iv: String) -> String? {
        let cryptor = Cryptor(operation: .decrypt, algorithm: .aes, options: .PKCS7Padding, key: key, iv: iv)
        if let decryptedBytes = cryptor.update(encryptedData)?.final() {
            return String(bytes: decryptedBytes, encoding: .utf8)
        }
        return nil
    }
}
```

検索すると [CryptoSwift](https://github.com/krzyzanowskim/CryptoSwift) がよくかかるが、こちらはちょっと細工しないとパフォーマンスが出ないのと、もともと開発者自身の学習用だったという事もあって、 `IDZSwiftCommonCrypto` のほうを利用してみた。

ちなみに PKCS5Padding と PKCS7Padding は互換性があるという事で、 PKCS5Padding したデータも問題なく扱う事ができた。

# SHA256 してみる

これも `IDZSwiftCommonCrypto` でできる。

```swift
extension String {
    func sha256() -> [UInt8] {
        return Digest(algorithm: .sha256).update(self)?.final() ?? []
    }
}
```

# [UInt8] を hex string に変換する

ダンプする時によく使うので。

```swift
extension Collection where Element == UInt8 {
    var hexa: String {
        return map{ String(format: "%02X", $0) }.joined()
    }
}
```

# 参考

- [iosdevzone/IDZSwiftCommonCrypto: A wrapper for Apple's Common Crypto library written in Swift.](https://github.com/iosdevzone/IDZSwiftCommonCrypto)
- [krzyzanowskim/CryptoSwift: CryptoSwift is a growing collection of standard and secure cryptographic algorithms implemented in Swift](https://github.com/krzyzanowskim/CryptoSwift)
- [CommonCryptoのSwift製ラッパー IDZSwiftCommonCrypto を使ってみる - タコさんブログ](http://tiny-wing.hatenablog.com/entry/2015/12/17/163845)
- [CryptoSwiftでAES暗号 (AES-256-CBC) - タコさんブログ](http://tiny-wing.hatenablog.com/entry/2015/11/19/110115)
- [CryptoSwift: Cryptography You Can Do](http://tiny-wing.hatenablog.com/entry/2015/11/19/110115)
windows xpのrdp修正パッチ (CVE-2019-0708)

見つけるの大変だったので以下にメモ

## 公式

* https://support.microsoft.com/ja-jp/help/4500705/customer-guidance-for-cve-2019-0708
    * Windows XP SP3 x86 のものをクリック。

## ダウンロードページ

* https://www.catalog.update.microsoft.com/Search.aspx?q=KB4500331
Thymeleaf Layoutでgroovyの警告が出る場合の対処法

### 概要
JDK9から仕様が変わったリフレクション関係の警告
groovyは3.0から対応するようです。[参考](https://issues.apache.org/jira/browse/GROOVY-8339)
β版が出ているので、暫定的に対象ライブラリのgroovyのjarを入れ替えれば警告は出なくなります。

### 環境
- OpenJDK 11
- Spring Boot 2.1.4
- Thymeleaf Layout Dialect 2.3.0

### 警告
```[console]
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7$1 (file:.m2/repository/org/codehaus/groovy/groovy/2.5.6/groovy-2.5.6.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v7.Java7$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
```

### 対策
対象ライブラリのgroovyを入れ替える

```xml:[pom.xml]
		<dependency>
		  <groupId>nz.net.ultraq.thymeleaf</groupId>
		  <artifactId>thymeleaf-layout-dialect</artifactId>
		  <exclusions>
		  	<exclusion>
		  		<groupId>org.codehaus.groovy</groupId>
		  	    <artifactId>groovy</artifactId>
		  	</exclusion>
		  </exclusions>
		</dependency>

		<!-- TODO 正式リリース待ち -->
		<dependency>
		    <groupId>org.codehaus.groovy</groupId>
		    <artifactId>groovy</artifactId>
		    <version>3.0.0-beta-1</version>
		</dependency>

```

警告だけなんで、単純に警告を出さないようにするのも手みたいですね。
[Java 10でSpring Boot 2.0 アプリケーションを開発するときの初歩的な注意点](https://qiita.com/rubytomato@github/items/3d9f657196c1e941699a)


まだβ版なんで本番環境へは正式リリースを待ちましょう！



### 参考
https://issues.apache.org/jira/browse/GROOVY-8339
https://qiita.com/rubytomato@github/items/3d9f657196c1e941699a
VirtualDOMのメリット

ReactやVueで採用されている仮想DOM(Virtual DOM)の何が良いの？って話。

# そもそもDOMとは？
DOMはXML形式の文書をツリー構造で表現したものです。このDOMを参照することで、各要素にアクセスすることができ、見た目やコンテンツを変更することができます。

とりあえず、「WEBページを表示するのに必要な設計書みたいなもの」と思ってもらえると良いと思います。

# 仮想DOMの説明の前に、ブラウザのレンダリングの流れについて
仮想DOMのメリットを知るためには、ブラウザのレンダリングの流れを知る必要があります。

ブラウザはページを描画するまでに以下の処理を行っています。

- **Parse** HTML/CSSを解析
- **DOM, CSSOM**　DOMツリーとCSSOMツリーを組み合わせて、**レンダーツリー作成**
- **Layout** 描画する位置、サイズの決定
- **Paint** 描画処理
- **Composite** 各レイヤーを重ねる

DOM操作を行うと、レンダーツリーの更新が発生し、再度レイアウトとペイント処理が走ります。
これら「レイアウト」と「ペイント」処理が負荷が高い処理と言われています。
そのため、描画速度を上げるためには、一般的に不要なDOM操作を減らすという手段が取られています。

レンダリングの流れについて、より詳しく知りたい方は、以下の記事を参考にしてください。
- [ブラウザの仕組み: 最新ウェブブラウザの内部構造](https://www.html5rocks.com/ja/tutorials/internals/howbrowserswork/)
- [ブラウザレンダリング入門〜知ることで見える世界〜](https://qiita.com/Leapin_JP/items/caed57ec30d638e40728)

# 仮想DOMとは？
実際のDOMと対となる、構造体。

先程書いたように、DOM操作を行うたびにレンダーツリーの更新が発生し、再度レイアウトとペイント処理が走ります。

**この描画時の負荷を抑えてくれる仕組みが、仮想DOMです。**

# 【本題】仮想DOMのメリット

仮想DOMを使うことで、以下のようにDOM操作を最小限に抑えることができます。

- DOMと対になる仮想DOMを定義し、ページが変化するときには、まず仮想DOMを変更
- 仮想DOMはブラウザレンダリングとは切り離されているため、変更しても影響はない
- 仮想DOMの差分をチェックし、変更部分のDOMのみを変更
- 最小限のDOM操作でページを変化させることができる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104274/afcc0613-4dbc-4cf1-c60a-ffd2ed79ef85.png)

# まとめ
仮想DOMとは、DOMと対になる構造体で、ReactやVueは、仮想DOMの差分をチェックし、DOMの再構築を最小限に抑えてくれる！
django-markdownx テキストエリアとプレビューを横並びにする方法

## 初めに

本記事では、django, markdownxを使った場合に、
デフォルトでテキストエリアの下にプレビューが表示されるのを、横並びに修正する方法を紹介します。
また、デザインはBootstrap4を使います。


## バージョン

* python: 3.7.3
* Django: 2.2.3
* django-markdownx: 2.0.28


## 準備

既にDjangoのプロジェクトやアプリは作られていて、
markdownxを使って記事などの作成画面ができている前提で進めます。


## やること

以下の2つファイルを修正すれば実現します。

1. TEMPLATES_DIRS/markdownx/widget2.htmlの作成
2. settings.pyに上記を読み込ませるように修正


以下が詳細になります。

#### 1. TEMPLATES_DIRS/markdownx/widget2.htmlの作成

まずは作成しなかった場合にどんなwidgetが読み込まれるか、
githubの実際のソースコードを見てみます。

```python
# widgets.py

# For backward compatiblity methods.
is_post_10 = DJANGO_VERSION[:2] > (1, 10)

class MarkdownxWidget(forms.Textarea):
    """
    MarkdownX TextArea widget for forms. Markdown enabled version of
    Django "TextArea" widget.
    """

    template_name = 'markdownx/widget{}.html'.format('2' if is_post_10 else str())

    def get_context(self, name, value, attrs=None):
	# 省略
```

template_nameを見ると、Djangoのバージョンが1.10より大きかったら、<br>markdownx/widget2.htmlを指定しています。<br>

見に行くと

```html
<!-- widget2.html -->

<div class="markdownx">
    {% include 'django/forms/widgets/textarea.html' %}
    <div class="markdownx-preview"></div>
</div>
```

includeの下にpreviewがあります。
ここを修正していきます。
今回はプロジェクト直下にtemplatesディレクトリがある場合を説明します。

自分のプロジェクトに以下を作成します。

```html
<!-- templates/markdownx/widget2.html -->

<div class="markdownx row">
    <div class="col-md-6 col-lg-6">
        {% include 'django/forms/widgets/textarea.html' %}
    </div>
    <div class="col-md-6 col-lg-6">
        <div class="markdownx-preview"></div>
    </div>
</div>
```

Bootstrapのグリッドデザインに合わせるように、
テキストエリアとプレビューを横に表示するよう修正しました。


#### 2. settings.pyに上記を読み込ませるように修正

1で作成したwidget2.htmlを読み込ませるように
settings.pyの以下を修正します。

```python
# settings.py

INSTALLED_APPS = [
	# 省略

	'django.forms',  # 追加
]

# 追加
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

```
これで読み込むようになりました。
また、django.formsはdjango.contrib.staticfilesよりも下に配置するように、注意が必要です。


## 終わりに

これでwidget2.htmlを編集することで、割と自由にスタイルを適用できるようになりました。
また、Djangoのformのwidgetで例えばcheckboxのスタイルを変えたいとしたい時は、
templates/django/forms/widgets/
配下にcheckbox.htmlを作成し、修正することで読み込まれます。
Windows 10でBD

Windows 10でBD

VLCを使用してWindows10でBlu-rayを再生する方法（2019年）
https://www.leawo.org/jp/tutorial/vlcでbdを再生する方法-1354.html


VLCでブルーレイムービーを再生する方法
https://www.videosolo.jp/tutorials/play-blu-ray-with-vlc.html


VLCのBlu-ray再生方法とVLC Blu-ray再生できない問題の解決策
https://blu-ray.software/use-vlc-media-player-to-play-blu-ray/

 # 参考資料

CD/DVD/BDドライブをイジェクト

https://qiita.com/jTakasuRyuji/items/58550654a74d00373591


わずか3つのステップでBDコピーを完了する方法

https://qiita.com/lovesoooooo1988/items/2bb308ed07961d09ba02

【自作PC】4K UHD BDをPCで楽しみたい→苦戦の連続でしたorz

https://qiita.com/NahaFujii/items/8967d087c140aa969985


# 文書履歴(document history)
ver. 0.01 初稿 20190828
ver. 0.04 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
不特定多数の顔分類問題にチャレンジ

# 前提
最近機械学習の勉強を始めた超初心者による記事なので、間違った認識をしていることがあるかもしれません。
そしてもっといい分類方法があるかもしれません。

# 問題
- 顔の写った写真が複数枚ある(今回は1枚につき顔は1つの写真を想定するが、複数写っていても問題ない)
- 同じ顔が別の写真に映っている
- 同じ顔が写っている写真をグループ化したい
- ユニークな顔がいくつかは知らない(ここが難しそうなポイント)

# どうやって解くか

とりあえず流れとしては、

- 顔を検出

簡単に顔認識ができるライブラリであるface_recognitionを用いる

- 顔をテンソル化

face_recognitionの128次元テンソルを用いる

- テンソルを2次元に圧縮

PCAで圧縮する。t-SNEを用いてみたがうまく行かなかった。

- クラスタリング

顔がいくつあるかわかっていれば、k-meansなどが使えるが、今回は不明なのでDBSCANを用いる

という感じで良さそう。

# コード
予めpipでface_recognition、scikit-learn、matplotlibをインストールしておくこと

```python:main.py
import face_recognition
from sklearn.decomposition import PCA
from sklearn.cluster import DBSCAN
import glob
from matplotlib import pyplot as plt
import numpy as np

filelist = glob.glob('./faces/*[jpg|JPG|png]')  # とりあえずfacesディレクトリの中にある画像を対象に読み込む(適宜書き換えてください)
images = [face_recognition.load_image_file(i) for  i in filelist]

faces = []  # 顔の128次元テンソルを格納
for i in images:
    faces += face_recognition.face_encodings(i)  # テンソルを取得

faces = np.array(faces)
# PCAで128次元→2次元に圧縮
compressed = PCA(n_components=2).fit_transform(faces)

# DBSCANでクラスタリング
db = DBSCAN().fit(faces)
labels = db.labels_  # 各顔がどのグループに属するのかというラベル情報

#  グループごと点をプロット & print
cluster_max = np.max(labels)
for i in range(0, cluster_max+1):
    points = compressed[labels == i]
    plt.scatter(points[:, 0], points[:, 1])


# ファイル名をプロット
for i, xy in enumerate(compressed):
    # 今回は1画像1顔なのでこれができる
    plt.annotate(filelist[i], xy)

# labelsが-1のものは分類に失敗したノイズなのでグレーでプロット
points = compressed[labels == -1]
plt.scatter(points[:, 0], points[:, 1], color="gray")
print('\nNoise')
for i, v in enumerate(labels == -1):
    if v == True:
        print(filelist[i])

plt.show()

```


# 結果
facesフォルダの中に、適当にネット上から引っ張ってきたオバマ、トランプ、ヒラリー・クリントンが写った写真を5枚づつ突っ込んでおいた。
黒人、白人、男性、女性ということでかなり分類しやすいはずだ。

<img width="937" alt="スクリーンショット 2019-07-28 21.25.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132881/176b3f56-7744-b8ea-a5f3-70633f4cc31b.png">
完全に分類できています。めでたしめでたし。
Field has incomplete type 'クラス名'とAllocation of incomplete type 'クラス名'について

#事の起こり
C++って、hppファイルやらcppファイルやらを沢山作るせいでエラーが起こった時の対処が大変ですよね。特に大変なのが、クラスが定義されている箇所とそのクラスが宣言や利用されている箇所の関係性の把握です。今回はこのクラスの定義位置関係のエラー2つとその対処を紹介します。

#問題のコード
今回の問題となったコードはこちらです(hppファイルである事に注意してください)。本当に簡単なコードですよね。クラスBを持つクラスAが定義されています。

```cpp:myClass.hpp
//クラスの前方宣言してもエラーは消えない
class A;
class B;

class A{
public:
    B b;//①Field has incomplete type 'B'
    B* createBclass(void){//関数定義だけ行う
        B *p = new B;//②Allocation of incomplete type 'B'
        return p;
    }
};

class B{
public:
    int num;
};

```

しかし、この程度のコードで①エラー:Field has incomplete type 'B'と②エラー:Allocation of incomplete type 'B'エラーが2つも出てしまいました!! 最初、私は**「要はクラスAを定義する前にクラスBが定義されていないのが問題でしょ、だったら前方宣言でクラスBの存在を教えてあげれば治るだろ」**と思い、前方宣言を書いたものの全く効果なし。原因は全く別のところにありました。

#Field has incomplete typeについて
まずは、Field has incomplete typeについてです。このエラーの原因は、定義が完了されておらず(imcomplete typeですね)、サイズが分からないクラスBを宣言していた事が原因でした。....?????何のことか意味不明ですよね。
順を追って解説します。

①まず、前方宣言によりBという名前のクラスが存在することはhppファイル全体で分かるようになっている
②しかし、クラスBが存在していることは分かっていても、**クラスBはクラスAよりも前に定義されていない**ので、クラスAで宣言した時にクラスBのサイズは定まっていない(クラスBを構築しようにもできない)
③実は、**コンパイラはサイズが定まっていないクラスBをどのように配置すればいいのか分からない**。
④結果としてエラー発生。

という流れになっています。**クラスBのサイズが分からないので構築できない、だから、クラスBをメンバに持つクラスAの構築もできないよということをコンパイラは言っているわけ**ですね。

これを、解消するには次のようにクラスAを修正します。

```cpp
class A{
public:
    B *b;//ポインタにすればOK スマートポインタにすればなお良い
    B* createBclass(void){
        B* p = new B; //②Allocation of incomplete type 'B
        return p;
    }
    
    ~A(){delete b}//デストラクタでbを解体、これは必須
};
```

やったことは、**クラスB自体をメンバにするのではなく、そのポインタをメンバに変更しただけです**。クラスB自体のサイズは未定義なので分かりませんが、メンバbはクラスBを指し示すアドレスです。**あくまで1つのアドレスなのでコンパイラから見てもサイズは明白です。**だから、メンバのサイズが分かればクラスAの構築をコンパイラが理解できるのでエラーが消えたわけです。**本当はこれ以外にもクラスAとクラスBを別のhppファイルで定義して、そのhppファイルをお互いにincludeし合うことでも解決可能です。(というよりもそっちが一般的な解決策)**
**(メンバにクラスのポインタがあるとデストラクタを明示的に書いて、そのポインタが指し示すオブジェクト(B)を解体しないといけません。忘れたらメモリリークです。なので、今回のField has incomplete typeの解決策はあくまでエラーを解消できるだけで得策ではありません.)**


#Allocation of incomplete typeについて
Allocation of incomplete typeについても、理屈はField has incomplete typeと同じです。Bのサイズ(構成)が分からないから、インスタンス生成なんてできないということですね。この対処としては、**クラスのメンバ関数の定義だけをhppファイルでして、実装は別ファイル(cpp)でするという方法を取ります(下記コード)**

```cpp:myclass.hpp
//クラスの前方宣言
class A;
class B;

class A{
public:
    B *b;
    B* createBclass(void);//関数定義だけ行う
    ~A(){delete b}//デストラクタでbを解体、これは必須
};

class B{
public:
    int num;
};
```

```cpp:myclass.cpp

#include "myclass.hpp"//①これが大事

B* A::createBclass(void){
    B* p = new B;//
    return p;
}

```

**myclass.cppでは最初にクラスA,Bの構成が書かれたmyclass.hppがincludeされているので、クラスA、Bのサイズはmy class.cpp全体で既知なものとなります。**なので、その後のcreateBclass関数で、クラスBのインスタンスを生成できるわけですね。

#まとめ
C++では定義完了していないクラス生成はコンパイラができないのでエラーが発生します。このエラーに対応する方法としてクラスのポインタをメンバにする方法を紹介しましたが、やはり、本質的に改善するには、**hppとcppにファイルを分ける方法が得策でしょう。hppでクラスの定義は全て済ませておき、そのクラスを使用するファイルでincludeしてやれば、今回のエラーはほとんど防げます。**
'jQuery' is not defined を解決する。

# エラー
```terminal
Module Warning (from ./node_modules/eslint-loader/index.js):
error: 'jQuery' is not defined
```

# 原因
jqueryを定義していない。

# 解決
main.jsにjqueryを定義する。
以下コードを追加。

```vue:main.js
import jquery from 'jquery'

```

# 参考
https://github.com/SimulatedGREG/electron-vue/issues/259
AWS認定SysOpsアドミニストレーター アソシエイトにギリギリ合格した話

# 概要
AWSのベンダー資格である、SysOpsアドミニストレータを受験し738点でギリギリ合格できたので、勉強方法を共有します。

# 受験前のAWSの経験・知識
- 2週間前に[AWSアソシを受験し合格した](https://qiita.com/ttr_tkmkb/items/cfd5cb369dcfdca68bad)
- LPIC level1、IPAの応用情報・DBスペシャリストを保有している
- 業務・趣味を合わせたAWS経験は半年ほど
    - Gitlabサーバの構築・運用
    - 開発環境・CICDパイプライン構築
- AWSで使用したことのあるサービス
    - EC2,VPC,Route53,Cognito,Lamda,S3,RDS,DynamoDB,CodeBuild,CodeCommit,CodeDeploy,CodePipeline,IAM

# 勉強方法
2週間前にソーリュションアーキテクトアソシに合格しており、知識がまだ定着している状態から勉強を開始しました。
SysOps用の勉強は模試受験＋WEB問題集(350問)1周です。
総勉強時間は10時間程度でしょうか。

## 模試受験
最初に公式の模擬試験を受けて自分のレベルを確認しました。
ソリューションアーキテクト アソシだけの知識でも7割程度の正解率でした。今思うと上振れだったと思います。
一方でIAMの細かい話や請求レポートなどのソーリュションアーキテクトで学習しなかった分野についてはサッパリ分かりませんでした。
SysOpsアドミニストレーター固有の部分を抑えれば行けそうな感触を持ちました。

## WEB問題集
[ソリューションアーキテクト受験時](https://qiita.com/ttr_tkmkb/items/cfd5cb369dcfdca68bad)に、[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)というAWS試験のWEB問題集サイトのダイヤモンドプランに登録していました。

この問題集は6000円程しますが、ソリューションアーキテクトのアソシとプロに両対応していて、かつ今回のSysOpsアドミニストレーターも対応しています。

SysOpsの問題は350問程用意されていたので、2日で1周しました。ソーリュションアーキテクトの範囲外の知らないサービス・使い方については解説を読み理解していきました。

理解したつもりになれたので、勢いで1周目完了時点で受験申込しました。

# 結果
738点でギリギリ合格しました。
720点が合格ラインなため、おそらく後1，2問間違えていれば不合格のはずです。

WEB問題集をこなしていましたが、試験問題の6,7割ほどは初見の感覚を持ちました。
試験中に大雑把に自己採点した結果も７割ギリ程度だったので、落ちたかなと思いながら試験終了ボタンを押しましたが、合格していて良かったです。。

どうすればより高い合格点を取れたかを振り返ってみると、
ソーリュションアーキテクトレベルの知識を持っているのであれば、ソーリュションアーキテクトの範囲外かつSysOpsアドミニストレーターの試験範囲の各サービスのホワイトペーパーや、運用者目線での各サービスの事例などのドキュメントがあればそれらを最初に読み込むと良かったと思いました。
SysOpsのWeb問題集を周回するのも大事ですが、ソーリュションアーキテクトと重複している部分も多いので効率的では無かったように思います。


# 今後
まずはアソシ3冠を目指したいと思います。
そして、[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)にはソリューションアーキテクトプロフェッショナル向けの問題も用意されているので、記憶が定着しているうちにプロフェッショナル向けの勉強を進めます。
Spring boot メモ書き(2)

# 目的
業務効率化

# DI(Dependency injection)コンテナとは
**ひとことでいうと、「プログラムではなく外部よりインスタンスを注入すること」** = 「依存性の注入」として訳されます。

>> **new演算子**を使ってプログラム内でインスタンスを作るのではなく、外部機能でインスタンスを作成して使用することができる

> SpringBootではDI(依存性注入)を用いた設計が採用されており、**コードの依存性**を少なくすることができます。

> クラスのインスタンスであるBeanは、DIコンテナに保存されます。

> SpringBootのクラス間の呼び出し等は、DIコンテナに登録されたBeanを取得することで実行されます。

> 標準的なBeanの登録方法は、以下方法があります。

1. ```@Bean```をメソッドに付与する。メソッドの返り値に指定したクラスのシングルトンが、DIコンテナに登録される
2. Bean登録したいクラスに、```@Component```をクラスに付与する。そのクラスのシングルトンがDIコンテナに登録される
3. API宣言である```@RestController``` や 環境クラス宣言である```@Configurationt```等、付与するだけでそのクラスのBean登録がされる。

> SpringBootの起動時に、@ComponentScanで指定したパッケージ以下をDIコンテナの読み込み対象にします。

```java
@SpringBootApplication
/* demo.serviceとdemo.domain以下のうち、@componentやDI登録用アノテーションが
付与されているクラス/メソッドをDIコンテナにBean登録する。 */
@ComponentScan(
		scopedProxy = ScopedProxyMode.TARGET_CLASS,
		basePackages = {"demo.service","demo.domain"}
		)
public class SBDataBaseDemoApplication {
 
	public static void main(String[] args) {
		SpringApplication.run(SBDataBaseDemoApplication.class, args);
	}
}
```

# DI対象となる主なアノテーション
```@Controller```	コントローラー層のクラスに使用する。
```@RestController```	WebAPIのコントローラー層のクラスに使用する。```@Controller```と```@ResponseBody```を組み合わせたものです。
```@Service```	サービス層のクラスに使用する。主にビジネスロジックを実行するクラスに使用する。
```@Repository```	データ層のクラスに使用する。主にDBアクセスするクラスに使用する。
```@Component```	上記の他にDI対象とするクラスに使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/3c39b294-f7c7-456b-45a8-4e11a8e97d0a.png)

# 参考

> Spring 主要ポイント

[https://atuweb.net/201509_spring_framework_good_points/](https://atuweb.net/201509_spring_framework_good_points/)

> Spring Bootで作るRESTful Web Service

[https://www.slideshare.net/WataruOhno/spring-fest-2018-spring-bootrestful-web-service](https://www.slideshare.net/WataruOhno/spring-fest-2018-spring-bootrestful-web-service)
[https://terasolunaorg.github.io/guideline/5.0.1.RELEASE/ja/ArchitectureInDetail/REST.html](https://terasolunaorg.github.io/guideline/5.0.1.RELEASE/ja/ArchitectureInDetail/REST.html)
Scrapyでformを送信する際にJavaScriptを回避する

# 問題
- Scpapy は JavaScript で生成されたコンテンツにアクセスできないため、例えば、確認のために表示されるアラートウィンドウの「OK」をクリックして先に進む、などができないことがある。

# 根本的な解決策
- JavaScriptを制御できるSeleniumなどを併用する。
    - （参考記事）[StackOverflow](https://stackoverflow.com/questions/6682503/click-a-button-in-scrapy) 
        - ScrapyとSeleniumを併用するサンプルコードもある

# 簡単な解決策（条件付き）
- **場合によっては** もっと簡単に解決できる。
- 以下のform送信ボタンのように、`onclick` 処理でJavaScriptのイベントが発動している場合には、scrapyの機能で回避できる。

```html
<input type="submit" onclick="return confirm('確定していいですか？')" name="submit" value="確定" class="button">
```

- クラスオブジェクト `scrapy.FormRequest.from_response` のパラメータ `dont_click` を `True` に指定することで、送信ボタンのクリックを省略して form を送信できる。これを利用すれば、`onclick` によって発動するイベントを回避して form が送信される。

```python
    def submit_form(self, response):
        yield scrapy.FormRequest.from_response(
            response,
            formcss = 'table#table1 > tr:nth-child(1) > td.value > form',
            formdata = dict( decision = '1' ),
            dont_click = True
        )
```

**〜おしまい〜**
php-master-changes 2019-07-27

今日は BOM 付 UTF-8 から BOM を削除する修正があった！

# 2019-07-27
## zebastian: file encoding cleanup: remove bom in win32 files
- https://github.com/php/php-src/commit/a2b2aaa67a834d014d2f800cc65c86cb557cac61
- [7.4~]
- BOM 付 UTF-8 という不条理なファイルが 2 つあったので BOM を削除
- ソースコード全体に dos2unix して出たのがこの 2 ファイルだったらしい
Ubuntu 18.04にLAMP環境を構築する

ubuntu18.04にLAMP環境を構築したので備忘録。

# VirtualBoxのインストール
* [こちら](https://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html)から環境にあったものをインストールする

# Ubuntuのインストール
* [こちら](https://ubuntu.com/download/desktop)からインストールする

# VirtualBoxにUbuntuをインストールする
* VirtualBoxの画面の新規ボタンを押す
* 任意の名前をつける
* メモリを設定する(4GB)
    * （2023/2 追記）メモリはGUIにする場合は４GB、そうでない場合は1GBでも問題ないです
* 仮装ハードディスクを作成する
* VDIを選択
* 可変サイズ(100 GB)
* okを押す

### ネットワークの設定
* ネットワークの設定
* 設定→ネットワーク押下
* アダプター1をホストオンリーアダプターに変更
* アダプター2をNATに変更
* ok押下

# LAMP環境を構築する
* ubuntuのターミナルを起動

### MySQL インストール
* mysqlをインストールする

```
 $ sudo apt-get install mysql-server mysql-client
```
* バージョンの確認

```
$ mysql --version
```
* 接続できるか確認する

```
$ sudo mysql -u root
```

### Apache インストール
* Apacheをインストールする

```
$ sudo apt install apache2
```

* 設定ファイルの確認

```
$ sudo apache2ctl configtest
```
* 上記実行後、```AH00558```　と書かれたエラーが発生した場合、設定ファイルとシンボリックリンクを同数にしなければならないため、ファイルを作成する（シンボリックリンクの作成）

```
$ sudo nano /etc/apache2/conf-available/fqdn.conf
```
* 作ったファイルの中に、

```
ServerName exampleserver
```
と記載

* 有効にする

```
$ sudo a2enconf fqdn
```
* 再起動

```
$ sudo service apache2 restart
```
* ブラウザで ```localhost```と入力し、動作の確認をする
* ```Ubuntu default page```と表示されればOK

### PHP インストール
* PHPをインストールする

```
$ sudo apt install php7.2 libapache2-mod-php7.2
```

* ドキュメントルートに```phpinfo()```を記載し、ブラウザから動作確認をする

```
$ sudo nano /var/www/html/info.php
```
```
<?php
  phpinfo();
?>
```

# 参考記事
[MacにVirtualBoxでUbuntuを立てる方法【画像での解説つき】](https://qiita.com/komakomako/items/1f1fa0e2279895006598)
[【Ubuntu 18.04 LTS Server】Apache2とPHP7.2を動かす](https://www.yokoweb.net/2018/05/12/ubuntu-18_04-apache2-php72/#toc3)
[Swift エラー備忘録] No such module ‘RealmSwift’

 RealmSwiftのインポート時に出てくるこのエラーに２日も泣かされましたのでその対処法を残しておきたいと思います。

もうQiitaにもクリーン→ビルドという対処法は載っているのですが、私の場合それでも一向に解決しませんでしたが、英語の記事を探していたら一発で解決しました。

## バージョン
Xcode 10.2.1
Swift version 5.0.1 
Realm 3.17.1

***
RealmSwiftのインストールはCocoaPodsで行いました。今回その過程は省略します。

Podファイルをインストール後→Product→Schme→New Schme
<img width="702" alt="スクリーンショット 2019-07-28 20.32.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441566/a9dbe84a-ce02-6b5e-579e-3d0056693e0f.png">

TargetをPods-プロジェクト名→RealmSwiftに変更
<img width="513" alt="スクリーンショット 2019-07-28 20.32.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441566/b6207f5f-fdc7-5d54-2deb-f42bad572f09.png">

<img width="558" alt="スクリーンショット 2019-07-28 20.33.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441566/a6f45b1a-5985-149b-62af-219dc23a6a32.png">

あとはクリーンしてビルドするだけです。

# まとめ
英語は勉強しよう。します。
[vue-router] BeforeRouteLeaveが2度発火する

# TL;DR

-   `Vue-Router` の`BeforeRouteLeave`等ナビゲーションガードが二回発火する場合がある。
-   遷移先のコンポーネントに何らかのリダイレクトがあるときに発生する。
-   `to`を調べることで回避可能。

同じ問題を扱ったissue
=> <https://github.com/vuejs/vue-router/issues/2102>

本件は仕様として扱われるようなので、今後しばらく対応される見込みはなさそう。

# 再現環境

-   Chrome バージョン: 75.0.3770.142
-   Nuxt 2.6
-   vue-router 3.0

# リポジトリと検証動画

<https://github.com/IKKO-Ohta/invoke_brl_twice>
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187851/5dcf17db-ad64-df34-a2f1-0eeb7b43581f.gif)

トップページ - ページ１ - ページ2という構成で、

-   ページ２のバックボタンを押すと、`window.confirm()`を表示する。「OK」を押すとページ１に遷移する。
-   ページ１では、ページ2からの遷移をキャッチするとトップページに飛ばす

想定としては、例えば商品販売サイトにおいて、ページ２が注文完了画面で、ページ１が決済確認ページ、くらいのとき。
しかしこのとき、ページ２の`BeforeRouteLeave` が2度発火する。`window.confirm()`のOKを1度押しても再度ダイアログが表示される。

# どうして起こるか？

## 予想

![ex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187851/8afc4c36-21aa-3ec1-4ac1-5ba32f875edb.png)


2 =>  1, 1 => top のような遷移をしそうな気がする。

## 実際

![rec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187851/85c0135c-afb0-1156-1791-bd292ebcc467.png)
実際のページ２の`beforeRouteLeave`はこのように挙動する。

`beforeRouteLeave`が 2=>1 と 2 => top の2回分呼ばれる。引数の`from.name`と`to.name`の中身を調べると確かにそうなっている。1=>top へのリダイレクトがこの2回目の遷移を誘発させる。**このとき1=>topの遷移でもない！ あくまで from="2", to="top"の`beforeRouteLeave`が走る！**

# 解決策

`ページ2`の`beforeRouteLeave`の`to`を検査し、一回目の遷移についてガードしないようにすれば良い。

## before

```js
  beforeRouteLeave(to, from, next) {
    window.confirm("このページを離れますか？") ? next() : next(false);
  }
```

## after

```js
  beforeRouteLeave(to, from, next) {
    if (to.name === "first") {
      next();
      return;
    }

    window.confirm("このページを離れますか？") ? next() : next(false);
  }
```

なお、afterは可読性の低いコードなので（一見「戻る」のときにはガードしない、というコードに見える）公式issueなどを引用して適宜コメントに追記することを推奨する。
アウトプットの良い悪いとは？

学習報告フォームは、いわばみなさんの**学習diary**です
今日なにを学んだのか？なににぶつかったのか？どう乗り越えたのか？書いていきましょう！

##良いアウトプットとは？:thinking:
ずばり、**自分の学習のためになるアウトプット**です。
それを満たしていればどんな内容でも構いません。
学習報告フォームは、学習のために利用していきましょう〜
なかでも「本日学習した内容を端的にまとめてください」のところを
対象に解説していきますね。

実際に先輩の報告を例に伝えていきます。

##やりがちで、もったいないアウトプット例:scream:
###１つめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412634/d2e90fad-c35d-968b-cd30-7e044871b273.png)
んん・・！シンプルすぎる！！
これだとただ提出しているだけになってしまっていますね。


###２つめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412634/597d71e5-9f44-463c-8189-24e4c878b16d.png)
これはおしいアウトプットですね。
何を学んだのか具体的に書かれているのはとってもいいですね！
なにが足りないでしょうか？いい例をみていきましょう。


##いいアウトプット例:heart_eyes:
###１つめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412634/1f86c48f-d7b9-364e-ba78-a9370dd0832c.png)
日記風でいいですね。
さっきのアウトプットに比べて、
このアウトプットのいいところは、
**自分の言葉で書いていること**ですね。
###２つめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412634/87674fb7-74c3-26a3-4e50-57706f65c668.png)
これもいいですね〜
何を覚えたのか、何を学んだのか、**具体的にかいてあること**
だけじゃなく、
**自分の言葉で書いている**ということです。

これだと自身の定着にも貢献し、
具体的だと、チームメンバーがみても、良い学習になりますよね

###３つめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412634/6e0cd333-a5d0-aebf-efc5-5008a7320a61.png)
記事風ですね。
自分がぶち当たった１つのエラーをどう乗り越えたのかストーリー形式で書いています。
こうすることで、自分がなにをわかってなくて、どうしたらよかったのか
改めて理解することができますね。
なにより、わかったつもりを防げていいですね。

記事風でやっていくなら、マークダウン記法ができるQiitaで記事を書いていくのもおすすめです

```ruby:expert.rb
puts 'output is best study method' #これがマークダウン記法です。
```
##アウトプットのメリットまとめ
前提、身になる学習において重要なのが、「想起」と「再言語化」です。
想起は、**思い出すこと**
再言語化は、**自分の言葉にすること**

アウトプットでこういうこと書こう〜
とおもっても書いていると思い出せない部分があります。
それを補完していくことで**想起**につながります。

自分の言葉に言い直して書くということは、理解度が上がり、
それをチームへ共有することで、定着を促進させます。

学習の理解度も定着率も上がる
同時にできるのが、アウトプットであり学習diaryです。

多く、賢く、きれいに、正しくはどれも必要ありません。
くだけてても、ラフでも、感情たくさんをこめても全然OKです！むしろそっちのほうがおもしろい！
自分らしい言葉で綴っていきましょう:relaxed:
MacのみでWindows10をUSBメモリブートする方法

# 概要
BootCampでWindows10をインストール出来ますがSSDを領域を分ける必要があり、容量が圧迫しますので、外付けUSBメモリへWindows10をインストールして、OSを起動する方法です。
USBメモリからブートすれば内臓SSDを使わないでOSを切り替えることが可能になります。

# 必要なもの
- USBメモリ　16GB（インストラー用）
- USBメモリ　128GB（Windows 10ブートラブルUSB）
- macOS Mojave 10.14.4（動作確認）
- Windows 10のディクスイメージ（ISOファイル）
- Windowsライセンス

# 免責
*ディスクを直接操作するコマンドがあるので、データが消える恐れがあり、自己責任でお願いします。*

# BootCampで作成したインストラーUSBにてWindowsを起動する
- インストラー用USBメモリだけを差した状態でoptionキーを押しながら起動する。
- オレンジ色のEFI Bootを矢印キーで選択してEnterキーを押してインストラー用Windowsを起動する。
- しばらくすると、Windowsセットアップのダイアログが表示されるまで待ち、Shift+F10キーを押す。
- 起動したコマンドプロンプトで下記のコマンドをタイプする。
select disk <number> でディスクを選択します。私の環境では2番でした。

```
x:¥Sources¥ diskpart
DISKPART> list disk
DISKPART> select disk 2
DISKPART> list disk

DISKPART> clean
DISKPART> create parttition primary size=350
DISKPART> create parttition primary

DISKPART> list partition
DISKPART> select partition 1
DISKPART> format fs=fat32 quick
DISKPART> active
DISKPART> assign letter=b

DISKPART> select partition 2
DISKPART> format fs=ntfs quick
DISKPART> assign letter=o

DISKPART> exit

x:¥Sources¥ wmic logicaldisk get caption

Caption
B:
C:
O:
X:

x:¥Sources¥ dir C:¥Sources¥
dism /Apply-Image /ImageFile:C:¥Sources¥install.wim /Index=4 /ApplyDir:o:¥
```
# 参考
https://kawasin73.hatenablog.com/entry/2018/12/20/084850
AngularのSSRとcreateCustomElementによるエラー

##サーバーサイドレンダリングとCustomElementのエラー
CustomElementは本来、ブラウザ側で機能するものです。
Angularでサーバーサイドレンダリングをする場合、サーバー側でcreateCustomElementの処理が定義されることで、以下のようなエラーが発生してしまいます。
Element(DOMによって定義されるもの)がサーバー側で定義されていないことが問題です。

```
var elProto = Element.prototype;
              ^

ReferenceError: Element is not defined
    at Object.<anonymous> (/user/apps/tests/universal-starter/dist/server.js:126911:15)
    at __webpack_require__ (/user/apps/tests/universal-starter/dist/server.js:20:30)
    at Object.@angular/elements (/user/apps/tests/universal-starter/dist/server.js:126796:18)
    at __webpack_require__ (/user/apps/tests/universal-starter/dist/server.js:126326:30)
    at Object../src/app/app.module.ts (/user/apps/tests/universal-starter/dist/server.js:126453:18)
    at __webpack_require__ (/user/apps/tests/universal-starter/dist/server.js:126326:30)
    at Object../src/app/app.server.module.ngfactory.js (/user/apps/tests/universal-starter/dist/server.js:126504:11)
    at __webpack_require__ (/user/apps/tests/universal-starter/dist/server.js:126326:30)
    at Object../src/main.server.ts (/user/apps/tests/universal-starter/dist/server.js:126712:37)
    at __webpack_require__ (/user/apps/tests/universal-starter/dist/server.js:126326:30)
```

##解決方法
以下のように、クライアント側でのみcreateCustomElementが動作するようにすればエラーは避けられます。

```
constructor(private injector: Injector, @Inject(PLATFORM_ID) platformId: Object) {
    if (isPlatformBrowser(platformId)) {
      const { createCustomElement } = require('@angular/elements');

      // register the custom element with the browser.
      customElements.define(
        'app-calendar-breadcrumb',
        createCustomElement(CalendarBreadcrumbComponent, {injector: this.injector})
      );
    }
  }
```
TIMESTAMP型のカラムから年・月別の集計をする

## 目的
- TIMESTAMP型で扱っている売上やユーザー登録のデータを、一度のSQL文の実行で年・月別の集計をしたい時のために。

## ケース
- テーブル：`sales`に、カラム：`amount`（売上）および`created_at`が存在する場合。

## 対応
- 演算子や*BETWEEN*で抽出してもいいが、`EXTRACT`を使うとスッキリする。

### 例
```SQL
select
    extract(year from created_at) as yyyy,
    extract(month from created_at) as mm,
    sum(amount) as total_amount
from
    sales
group by
    yyyy,
    mm
order by
    total_amount desc
;
```

- いい感じに"YYYY", "MM"別で"total_amount"が表示される。
Rails5×Bootstrap4


#概要
Rails5にてBootstrapを適用する。

#バージョン
- Rails: 5.2.2
- Bootstrap: 4.3.1

#Bootstrap3 → Bootstrap4に移行
https://cccabinet.jpn.org/bootstrap4/

#修正ファイル
##Gemfile
```
gem 'jquery-rails'
```

##application.js
```
@import "bootstrap";
```

##application.scss
```
//= require jquery3
//= require popper
//= require bootstrap-sprockets
```

#参考資料
[Bootstrap Ruby Gem](https://github.com/twbs/bootstrap-rubygem)
[Bootstrap Download](https://v4-alpha.getbootstrap.com/getting-started/download/#package-managers)
【備忘録】Macの起動音を消す方法

# Macの起動音について
[公式サイト](https://support.apple.com/ja-jp/HT202768)によると、
Macの起動音には意味を表しているようです。

## 環境を汚したくない
アプリケーションをインストールして起動音を消すことができますが、
環境を汚したくないと思い、CLIから設定しました。

## Macの環境音を設定
```
# 起動音を消す                                                                                                                        
sudo nvram SystemAudioVolume=%80
<パスワードを入力>

# 起動音をつける
sudo nvram -d SystemAudioVolume
<パスワードを入力>

# 起動音の音量を確認する
nvram -p | grep SystemAudioVolume
マイグレーションファイルの記述を間違えてしまった

本日の学習のハマってしまったエラー内容の備忘録です。

マイグレーションファイルの記述を間違えてしまった時の対処法

本日の学習中に
```bundle exec rake db:seed```を実行したいのにエラーが出てしまい
原因を探していたらマイグレーションファイルの記述ミスでした。
書き直して上書き保存してもエラーになっていましたので
ターミナルから変更するのだろうかと考え、調べていました。

今日作っていたのは下記のコード

```
class CreateItems < ActiveRecord::Migration[5.2]
  def change
    create_table :items do |t|
      t.string :items　<= nameに変更
      t.integer :price
      t.integer :user_id
      t.timestamps
    end
  end
end
```
上記のコードの```items```を```name```に変更した後に

```
bundle exec rake db:migrate:reset
```

マイグレーションファイルをリセットして再度マイグレーションを実行します。
※自分は実行しましたが、必要ないかも？

```
bundle exec rake db:migrate
```

このやり方で一応は成功しました。

調べていたら
```rake db:rollback```
などもあるとの事なので今度テスト環境で試してみたいです。

参考：http://railsdoc.com/references/rake%20db:migrate
プログラミング未経験者はRailsチュートリア１周目をじっくりやってはいけない

#想定読者
・プログラミン初心者
・実務未経験者
<font color="red">・これからRailsチュートリアをやろうとしている方</font>

#著者情報と記事の概要
### 著者情報
・HTML, CSS, JavaScriptを少しかじった程度の初心者
・ProgateでRubyおよびRialsを１周やっている
・Railsで転職活動用のWebアプリを作りたい人

### 記事の概要
Ruby on Railsを学習すると決めたからには、誰もがやるであろうRailsチュートリアです。Twitterで検索すると多くのプログラミン初学者が挑戦しているのを見かけます（私もその一人）。
では、プログラミング初心者の私がRailsチュートリアをやることで、どのレベルにまで到達できたのか、紹介したいと思います。

# 理解度３０％
このQiitaは、実はRailsチュートリア走破後すぐに書いているのですが、率直な感想として、Railsチュートリアの30%程しか理解できなかったと感じています。ここでいう「理解」は、どれだけ再現できるかだと思ってください。とくにテストの書き方については理解度はかなり低めです。ちなみに私は、Railsチュートリアを２５日間でやりました。時間でいうと、100時間ほどです。割とじっくりやっと方ではないかと思います。

# 各章ごとの理解度
|章|内容|理解度|コメント|
|---|---|---|---|
|1章|環境設定|100%|
|2章|MVCモデル概要|100%|
|3章|ルーティング|100%|
|4章|Ruby文法|100%|Progateをやっていれば大丈夫|
|5章|Viewを書く|100%|
|6章|モデルを書く|50%|バリデーション等の流れをフォロー難|
|7章|ユーザー登録機能|60%|
|8章|ログイン機構|50%|
|9章|ログインしたまま機構|3%|脳内がトークンで埋め尽くされる|
|10章|ユーザーのREST|50%|細かな機能が多くなってくる|
|11章|ユーザー有効化|50%|メール関係のテストが複雑|
|12章|パスワード再設定|30%|似たような機構が多く、混同してくる|
|13章|マイクロポスト機構|20%|まったく全体像が見えない|
|14章|フォロー機構|20%|relationshipモデルが難しい|

ちなみに、最も難しい9章はスキップしてもいいと本書でも明言されています。

# 身についたとは口が裂けても言えない
Railsチュートリアル１週目を終えて、さくさくWebアプリを作れるようになったかというと、まったくそんなことはありません。一部のブログ等では、「Railsチュートリアルを１周すればWebアプリをさくさく作れる一歩手前のレベルになります」と書いてた気がしますが、私の場合は全然そんなことありませんでした。

# 1周目は概念の習得に専念
正直、Railsチュートリアルで紹介のあった細かい技術はすでに大方覚えていません（笑） 「プログラミンは暗記ではない！」というありがたい言葉もありますが、流石に「こんなメソッドあったな〜」と後からググり治せるくらいの記憶の残滓は必要なはずですが、残ってません。一方で、MVCモデルや、Railsの大方の挙動、フォルダ構成はかなり理解できました。ただ、<font color="red">概念を習得するのに25日間、100時間の投入が必要だったか？と問われると、まったく必要なかったと思います。</font>

# 結論：１周目はスピーディーに。現場Rails等を併用して。
結論として、Railsチュートリアルの１周目は、理解度よりもスピードを意識したほうが得策であると考えます。（じっくりやっても結局覚えれません）。結局のところ自分の頭で１から考えるしか大きな成長は望めませんので、Railsチュートリアルはそこそこに、とっとと自作のWebアプリを作り始めるのが得策だと感じました。
あと、もう一点。10章をやっている時に、これまたRails学習の決定版である<a href="https://www.amazon.co.jp/gp/product/4839962227/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4839962227&linkCode=as2&tag=fmn4910-22&linkId=378f735c3d1b1953e60de554e817ae0f">『現場で使える Ruby on Rails 5速習実践ガイド』</a>、通称『現場Rails』をパラパラとやっていたのですが、日本人著者の利点といいましょうか。併用すると、Railsチュートリアルのもやもやが晴れるところもあり、並行してすすめるのは結構おすすめです！
Node.jsにて為替情報を取得

## 中華人民元を日本円で換算したらいくらになっているのかをスクレイピングで取得する

```js:scraping.js
import * as request from 'request';
import * as client from 'cheerio-httpcli'

export function getNowGenValue():number {
	const url = 'https://jp.investing.com/currencies/cny-jpy';
	let urlRes = client.fetchSync(url) // 受け取った値をカスタマイズしてresposeとして返すために同期処理にする
	return parseInt(urlRes.$("#last_last").text());
}
```

質は有料のものよりも劣るかもだけど、割と爆速で取得できる。
非同期処理にしてもいいかもだけど取得できてなかったらだるいので同期処理にした。
jqueryでHTTP通信をしないページ遷移

# タイトル通り
HTTP通信を行わずに、webページを遷移する方法を身につけたので共有します。
htmlはhamlで記入しているのでよろしくお願いします。

##結論としてはまだ表示させたくないページには大元のclassにdisplay:noneを当てる
まずは、必要なwebページのhtmlコードを一つのhtmlファイルに全て書き出します。そして、最初に表示されないページの大元のクラスにdisplay:noneが当たるクラスを与えます。下のコードでは.yabaiがそのクラスになります
以下のコードと画像を見てください
<font color="Red">*コピペする時はコード中のコメントアウトを消してください</font>

```haml:haml
.zyuuhati
  .keikoku-box
    %P.top-keikoku
      = fa_icon 'venus-mars'
      %span 警告！
    %p.keikoku-bunsyo 当サイトは18歳以下の利用を固く禁じます。あなたは18歳以上ですか?
    %a.ryoukai はい //このボタンを押すとページが切り替わります
    %a.nigeru いいえ
 
.waller.yabai　//.yabaiにはdisplay:noneがかかっているので最初は見えません
  %P.yabababa まじ卍字
```

```css:css
.zyuuhati{
 background-color: gray;
 height: 100%
 padding :15% 15%;

}
.keikoku-box{
  background-color: #fba933;
  height: 100%;
  width: 100%;
  padding: 20% 10% 10% 10%;
}

.top-keikoku{
  text-align: center;
  font-size: 30px;
  font-weight: 200;
  color: red;
}

.keikoku-bunsyo{
  margin-top: 70px;
  font-size:25px;
  color: black;
}

.ryoukai{
  display: block;
  text-align: center;
  border-radius: 20%;
  line-height: 40px;
  width: 200px;
  height: 40px;
  background-color: aqua;
  font-size: 20px;
  margin: 20px auto;
  color: white;
}

.nigeru{
  display: block;
  text-align: center;
  border-radius: 20%;
  line-height: 40px;
  width: 200px;
  height: 40px;
  background-color: red;
  font-size: 20px;
  margin: 20px auto;
  color: white;
}
.yabai{
  display: none;
}

.waller{
  background-color: #ef5185;
  height: 700px;
 
}

.yabababa{
  color: white;
  font-size: 50px;
}
```  
![qiita.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465210/c32224e0-6d9a-de2e-3614-39c72c7e918e.gif)


<br>



`「はい」`のリンクをクリックした瞬間、一つ目のページが消え、二つ目のページが現れましたね。
このからくりは、`「はい」`のクリックを発火点にして、1枚目のページのクラスに`yabaiクラス`を与え、
2枚目のページから`yabaiクラス`を取り除くという方法で実装しています。
具体的なコードは以下の通りです。

```javascript:jquery
$(function(){
  $('.ryoukai').on('click', function(e){
    e.preventDefault();
    $('.zyuuhati').addClass('yabai'); //最初の画面をdisplay:noneにします。
    $('.waller').removeClass('yabai'); //次のページを表示させます
  });
});
```
<br>
この方法で一つのURL上でページ遷移することができます！

### 続き
[jqueryでHTTP通信をしないページ遷移　複数ページ版](https://qiita.com/sui625/items/2751950c0ff5d97f32a5)
夏ぼっちカレンダー（仮）

#はじめに
ぼっちでカレンダーします。
本当は冬にしようと思ってたのですが、
夏でも冬でも変わらないので
早いうちにしてしまいます。

31日はきついので、
どこかで切れると思います。

#テーマ
フリーです。
浅く広く色々書くと思います。

#カレンダー
徐々に増やしていきます。

| 日付 | テーマ | リンク |
|---|---|---|
| 8/1 | 主キーとIndexについて整理する | [主キーとIndexについて整理する](https://qiita.com/pirorirori_n712/items/b47ade3fdaf8b4a109ba) |
| 8/2 | AレコードとCNAMEレコードを整理する | [AレコードとCNAMEレコードを整理する](https://qiita.com/pirorirori_n712/items/9f9f1e7c3ee7e6850645) |
| 8/18 | List.Sort((a,b)=>(a-b))について | [List.Sort((a,b)=>(a-b))について](https://qiita.com/pirorirori_n712/items/92412fc8e7f0c3b7fc8d) |
ロボアドバイザーの業者一覧

#ロボアドバイザー 大和証券 「ダイワファンド オンライン」
大手証券会社の大和証券がリリースしたロボアドバイザーがダイワファンド オンラインで投資信託を扱っています。
「ライフプランニング」「資産運用プランニング」「リスク許容度診断」の診断メニューがあり、最適な運用スタイルが提案されます。
最低投資資金が50万円からとなっていますが、大手の安心感を求める人にはおすすめのようです。
#ロボアドバイザー ウェルスナビ「Wealth Navi」
「Wealth Navi」を運営しているのは、株式会社ウェルスナビです。
投資の対象が米国上場のETFで、自動積立投資が可能で、自動税金最適化のようなサービスが備わっているのが特徴です。
特徴の対象銘柄は7銘柄で、アメリカに上場されているETFのすべての中かはピックアップをして、銘柄の選定基準も公開しています。
三菱東京UFJ銀行、三井住友銀行、みずほ銀行から入金が可能です。
SBI証券向けには、Wealth Navi for SBI証券もリリースされ、最低投資金額が100万円だったものが30万円へとなりました。
#ロボアドバイザー エイト証券「クロエ」
「クロエ」を提供しているのは、エイト証券株式会社です。
クロエのメリットは、最低投資金額が一万円からということです。
また、特徴としてはスマートフォン専用のサービスというところです。
さらには、運用について他と異なるところは運用について質問がされません。
通常、ロボアドバイザーはいくつか質問をしてから結果に基づいたポートフォリオが提案されますが、クロエは運用の目標と積極型にするのか、安定型にするか、保守型にするかを決めることでポートフォリオの提案がされます。
#ロボアドバイザー 楽天証券 「楽ラップ」
大手のネット証券会社である楽天証券株式会社が提供しているのが「楽ラップ」です。
特徴としては、投資の対象がETFではなく投資信託であることです。
また、手数料が固定報酬型と成功報酬型かを選ぶことができます。
楽天証券は、同じグループの楽天銀行や楽天カードと連携しているので、キャンペーンや楽天ポイントが整っていて、楽天のユーザーには選択肢の一つです。
#ロボアドバイザー マネックス・セゾン・バンガード投資顧問 「マネラップ(MSV LIFE)」
「マネラップ(MSV LIFE)」を提供しているのは、ロボアドバイザー マネックス・セゾン・バンガード投資顧問株式会社です。
投資の対象は、国内や海外のETFで口座の開設はマネックス証券からできます。
特徴としては、積み立てだけではなく取り崩しにも対応しています。
学資保険の加入の代わりに、積み立て運用していくなどもおすすめのようです。
#ロボアドバイザーについてさらに情報収集するなら
ロボアドバイザーに関して追加の情報収集を行う場合、専門情報サイトがおすすめです。
[ロボアドバイザー・ラボ](https://robot-adviser.org/)等の専門サイト等が参考になるでしょう。