OmniAICreator/Qiita-1.07M huggingface dataset:
超初心者がherokuにPHPアプリを公開してみた！～アカウント作成編～

ちまちまアプリを作成してきましたが、勉強も兼ねて思い切ってサーバーに上げて公開してみることにしました。
いくつか考えましたが、無料ながら様々な機能が備わっているherokuを選びました。
今回はアカウント登録の手順をまとめました。

#herokuとは
herokuはコンテナベースのクラウド型Paas(Platform as a Service)であり、RubyやPHPなど複数の言語に対応しています。
Heroku はフルマネージドのプラットフォームであるため、開発者がサーバーやハードウェア、インフラストラクチャの管理に煩わされることなく、製品開発に没頭できます。サービスやツール、ワークフロー、多言語対応など、あらゆる面が開発者の生産性を高めることを目指した設計になっています。（公式HP 概要より）
アプリケーション公開に必要なインフラ部分の構築を開発者の代わりに行ってくれる、ということです。
herokuはその中でも拡張機能が豊富なのが大きな特徴です。

#アカウントを登録
![heroku 新規登録1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/1470bc1c-0563-ab53-1bb9-4ea6a8429486.png)
公式HPの右上にアカウントの新規登録ボタンがあるので、そこをクリック。
下図の画面に移動するので、名前など必須事項を入力していきます。

![heroku 新規登録2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/76a0ebc2-9fd8-6c5f-0225-47a0e2b16315.png)
今回は業務ではなく個人学習で使用するので、会社名は空欄で、役職は「趣味でのご利用」を選択します。

![heroku 新規登録3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/418a9125-8005-c305-2522-5f0a52190a8b.png)
入力を完了し登録ボタンを押すと、このようなメッセージが現れます。
![heroku 新規登録4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/934f29ec-b7a9-9889-77ca-90b46aca7c46.png)
現れたURLを叩き、パスワードを設定するとアカウントの登録が完了となります。
![heroku 新規登録.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/44ee633b-6e38-7d33-2721-559cd5f9a52e.png)

#アプリケーションの作成
アカウントを登録した後は、herokuにアプリケーションを作成します。
ここでいう「アプリケーション」とはコーディングして作るというものではなく、作ったアプリケーションをherokuに入れるための「箱」のようなものに近いです。

上記で作成したアカウントでログインし、「Create a new app」の「Create new app」をクリックします。
![heroku 新規登録6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/a87b04e2-32e8-3056-c873-544838bac9fb.png)

アプリケーションの登録画面に移り、アプリケーションの名前と領域を登録します。
初期ではアメリカかヨーロッパしか選択出来ませんが、機能を拡張すると、東京も使うことが出来るようです。（現在調査と勉強中）

![heroku 新規登録7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/fdf9e8d8-8404-d54d-db45-2e22fa10ffcb.png)
ここで注意しておきたいのは、アプリケーション名は以下二つの命名規則があることです。
1.名前は半角英数かダッシュしか使えないこと。
図のようにアンダーバーを含んだ名前は登録できません。

2.名前は他と被っておらず、オリジナルのものであること。
herokuにアプリケーションを公開すると、```https://git.heroku.com/アプリケーション名～```とURLが割り振られる為、ここに入るアプリケーション名は他のherokuのアプリケーションの名前と被ってはいけない、ということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/db9caf33-4aa4-dba3-2bd2-8abb1d5e03cf.png)

アプリ名が上図のように緑色に光るとOKなので、名前の登録と領域の選択が完了です。
「Create app」を押すと、アプリケーションがherokuに作成されます。

herokuでのアプリケーションを作成後は次の記事に寄稿します。

#参考文献
[heroku公式HP](https://jp.heroku.com/about)

[（株）テラスカイ herokuとは](https://www.terrasky.co.jp/heroku/)
IBMCloudのCloudantをレプリケーションする方法


#TL;DR
仕事で使ったIBMCloudで、Cloudantを定期的にデータ移行する処理を書いたときに、ハマった話。
バックアップ用テーブルやデータ保存タイミングなど、一定のタイミングでデータ移行をしたい場合に行う。

#実施環境
 Windows 10
 node 12

#前提
IBMCloudのアカウントを持っていること。
 
## 手順
1.　Cloudantに「_replicator」テーブルを作成する。
　私はここで移行元、移行元DBがあるのに、ずっと「database not exists」とエラーが出力されて、ハマっていました。

2.　移行先のdbを作成する。
　以降先のテーブルを作成する。
![create_db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/9a5aaa6c-e1a7-323d-ba86-7ee40779bc15.png)

　この手順なら、同一cloudantサービス内でも、違うCludantサービスへもデータを移行できます。
(別のアカウントへのDBレプリケートはやったことないので、誰かお試しを。。。)

3.　以下のrequestを投げる。

```
const request = require('request');
...

const body = {
url:`https://XXXXXX.bluemix.cloudantnosqldb.appdomain.cloud/_replicator`,
  json:{
    source:`https://XXXXXX.bluemix.cloudantnosqldb.appdomain.cloud/from_db`,
    target:`https://XXXXXX.bluemix.cloudantnosqldb.appdomain.cloud/to_db`,
    create_target:true
  }
}

request.post(body,() => {
  resolve("success");
})
```

4.　「_replicator」テーブルにデータが入っていることを確認する。
こんなデータが入っていれば、レプリケーション処理は実施されています。

一覧のStateが「Complated」になっていれば、DBの複製は完了しています。
![replicate_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317288/5115fc31-f1cd-3204-ca12-9e0afbfe2183.png)

## 補足
このプログラムが書ければ、IBMCloud のfunctionsとtriggerを組み合わせれば、
定期実行も可能です。
（定期実行させる方法に関しては、いつか書きたい。。。）

## 終わりに
この手順は、userとpasswordの古い認証形式で、移行を行いました。
新しいIAM認証形式でのデータ移行について、後日調べてみたいと思っております。
[CSS]ぷよぷよするお寿司（）のセレクターを的確に選び出す[ぷよぷよ前編]

#目的
- 実務的なHTMLを使う時の感情を、複雑で混乱する嫌な気持ち→簡単な気持ちに変化させる。
- CSSでセレクタを適切に選び出せる。

#今日やること

ぷよぷよ寿司ゲーム
https://flukeout.github.io
※正確には寿司ではありませんwww

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/d6a60408-520d-4830-c9d4-11b507f9a9ba.gif)


#学び

##A.className level 7 of 32

Aタグのクラス名に一致する要素を選択する。

<img width="1055" alt="Screen Shot 2020-07-05 at 18.39.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/e9f4f3e6-6ac0-4514-0b10-0c7878ca0d87.png">

**小さいオレンジのみ選択しろ**

```
orange.small
```

###注意
親子で指定するのか、子のクラスだけで指定するのかを間違えやすい。
たとえば、"弁当のオレンジ"を指定したい場合は、下記記述

```
bento .small
```


##A * level 11 of 32

Aの中にある要素を選択する。

<img width="1054" alt="Screen Shot 2020-07-05 at 18.48.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/a10492c0-b565-0a06-e44b-7d4c177dcf04.png">



**plateに乗っている要素を選択しろ**

```
plate *
```

###注意

```
plate
```

だと、中の要素ではなくplate自身が選択される。

##A + B level 12 of 32

Aの直後にあるBを選択する。


<img width="1045" alt="Screen Shot 2020-07-05 at 18.53.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/a54e9e21-851e-d3af-c4e7-16c5523606af.png">

**plateの直後のりんごを選択しろ

```
plate + apple
```

##A > B level 14 of 32

Aの中にある要素Bを選択する。

<img width="1040" alt="Screen Shot 2020-07-05 at 18.56.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/2a2c38ff-0460-8b2b-df0e-ea1e0bb504b0.png">

**皿の上にあるリンゴを選択しろ**

```
plate > apple
```

##:first-child level 15 of 32
最初の子要素を選択する。

<img width="1060" alt="Screen Shot 2020-07-05 at 18.57.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/c0b48793-33b6-099f-ebbb-8c381b7a9785.png">

**皿の一番上のオレンジを選択しろ**

```
plate :first-child
```

***注意

これはなぜ一番下がfirstchildではないのか（HTML上は確かに一番上がfirstchild)が理解できていない。


##:only-child level 16 of 32
兄弟要素がない子要素を選択する。

<img width="1047" alt="Screen Shot 2020-07-05 at 19.01.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/85dd8424-3aa1-cfed-4c64-f278b3eaf2d5.png">

**皿の上のリンゴときゅうりを選択しろ**

```
plate :only-child
```

##:nth-child(A)　level 18 of 32
A番目の子要素を選択する。

<img width="1034" alt="Screen Shot 2020-07-05 at 19.04.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/fb753b82-4b6f-11ff-7792-d28c8cb75b64.png">

**３番目の皿を選択しろ**

```
plate:nth-child(3)
```

##:nth-last-child(A) level 19 of 32

??

<img width="1050" alt="Screen Shot 2020-07-05 at 19.06.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665832/5be30dc8-3c55-ced5-a069-2b95d3f493e5.png">


これはうまくできませんでした。
明日もまたやろう。
【エラー文】LoadErrorを解決するには

#LoadErrorを解決するには
新しいルート、コントローラー、ビューを作った所にLoadError発生。
初めてみるエラーに遭遇しました。

<img width="1044" alt="a9eba52c9101e535dad59a0d0388ef15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665703/b03ff106-c549-8948-084f-fcd0be8c1948.png">


##解決法
調べるとコントローラー名が違うと指摘されていたことがわかりました
<img width="501" alt="あああ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665703/62cce889-7a68-c4ea-ccb3-55737b0c22c9.png">

Profileのsが抜けていました
class ProfileControllerから
class ProfilesControllerに正しく直してあげるとエラー解決しました！
imageViewをタップする

#profileでイメージ変更をしたい時など使用する、imageViewにtapアクションを持たせる
<img width="681" alt="スクリーンショット 2020-07-05 18.35.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562721/dedba31d-09df-24b9-1d39-b32af4f40226.png">

xcodeの右上の「＋」から　TapGesture Recognizer　を選択し、imageViewの上にドロップ

次にInteractionのUser Interacton Enabledにチェックを入れる
（僕はこれを忘れてて少しの間頭を抱えていました。。）

<img width="274" alt="スクリーンショット 2020-07-05 18.32.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562721/abdad64f-50a2-2f94-1e92-f55c95973be4.png">

以上でimageViewをタップできるようになりました！

ここからカメラやアルバムに飛んで写真を表示させます！
【Rails】ログインしていないユーザーのリクエストURLを一時保存して、ログイン後にそのURLに戻す方法

タイトルが長い。フレンドリーフォワーディングについてまとめます。
# フレンドリーフォワーディングとは
「Youがリクエストしたページ、ログイン後のページなんだけど、まだログインしてないじゃん。ログインしてから行きたかったページに案内してあげるね」という類の処理です。よくお見かけする親切設計。きめ細かいです。
# どうやって作るの？
大まかな流れとしては次のようになります。

＊ ログインしていないユーザーがきたとき
　1. リクエストされたURLを一時保存する
　2. ログイン画面に飛ばしてログイン確認
　3. リクエストされていたURLに戻す

## メソッド定義
リクエストを一時保存するためのメソッド（1）と一時保存したURLに戻すためのメソッド(3)を用意します。今回は`sessions_helper.rb`内に、以下のように書きます。

```helpers/sessions_helper.rb

# 1. リクエストされたURLを一時保存する
def store_location
  session[:forwarding_url] = request.original_url if request.get?
end

# 3. リクエストされていたURLに戻す
def redirect_back_or(default)
  redirect_to(session[:forwarding_url] || default)
  session.delete(:forwarding_url)
end

```

1で`session[:forwarding_url]`として、リクエストされたURL（request.original_url）を保存します。 `if request.get?` でリクエストの種類をGETアクションにのみ限定してあります。

3は一時保存したURLに戻す、あるいはデフォルトとして指定するURLに戻すための処理です。URLが存在しない場合も考慮して`||`以降でdefaultで設定したURLを入れられるようにしています。
また、セッション情報を保持したままにしておくと、次のログインの時もこれを読み込んでおかしなことになるので、メソッド内２行目の`session.delete(:forwarding_url)`で一時保存したURLを削除します。
## リクエストされたURLを一時保存 + ログイン確認
アクセスしようとしたURLを一時的に保存するために`store_location`を呼び出ていきます。
ここでは`users_controller.rb`のprivate以下、ログインしているユーザーがどうかを確認する記述とあわせて書いていきます。

```users_controller.rb

class UsersController < ApplicationController
  before_action :user_login_required

・
・
・

private

def user_login_required
  unless logged_in? # ログインしていないとき
    store_location # ここでURLを一時保存！
    flash[:danger] = "ログインしてください" # フラッシュメッセージを表示
    redirect_to login_url # ログインページに強制的に送る
  end
end
```

## リクエストされていたURLに戻す
ログイン後の遷移先を`redirect_back_or(default)`を使って指定していきます。ログイン処理を行なっている箇所に次のように書けばOKです。

```controllers/sessions_controller.rb

def create
  user = User.find_by(email: params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    log_in user
    params[:session][:remember_me] == '1' ? remember(user) : forget(user)
    flash[:success] = "ログインしました"
    # 以下でリダイレクト先を指定。defaultは、ここではuserを使いまわしているが user_url のように書くことができる
    redirect_back_or user 
  else
    flash.now[:danger] = 'ログインに失敗しました'
    render 'new'
  end
end

```
以上で実装完了です！
存在するURLからあえて強制送還をくらった後にログインしてみると、そのURLに飛ぶようになっていると思います。おつかれさまでした。

# さいごに
以上、それぞれの役割が一目でわかりやすいように、自分なりにまとめ直してみました。少しでも参考になればうれしいです。

実装にあたり以下を参考にさせていただきました。ありがとうございました。

- [10.2.3 フレンドリーフォワーディング（Railsチュートリアル）](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-friendly_forwarding)
- [世界一適当な技術ブログ - フレンドリーフォワーディング](https://lhiroki1205.hatenablog.com/entry/2019/02/02/213720)
Unity_スクリプトがVisualStudioじゃない。

スクリプトを開くとVisualStudioにならない。おや？
<img width="616" alt="VisualStudio01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/8fd1b58c-3c87-b12c-17e3-faec427d6589.png">
そんな時は、環境設定を開いて。
<img width="287" alt="visualstudio2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/afbb73e6-771f-ec3f-e129-bfebd4b97854.png">
外部ツールで「外部のスクリプトエディター」で
VisualStudio を選ぶ。
<img width="641" alt="visualstudio3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/ab630f44-ef9c-71b2-2305-2b5a165bd6d5.png">
途中でアップデートしますかと出たのでアップデート。
再び開くとVisualStudio。
<img width="833" alt="visualstudio4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/9dfb8b1e-edbd-b5c2-2ded-a1a5e14bf817.png">
ゼロから始めるLeetCode Day77「1502. Can Make Arithmetic Progression From Sequence」

# 概要

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

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

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

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

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

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

Python3で解いています。

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

前回
[ゼロから始めるLeetCode Day76「3. Longest Substring Without Repeating Characters」A](https://qiita.com/KueharX/items/a54c6d9dd30bb63f631b)

今はTop 100 Liked QuestionsのMediumを優先的に解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

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

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


#問題
[1502. Can Make Arithmetic Progression From Sequence](https://leetcode.com/problems/can-make-arithmetic-progression-from-sequence/)
難易度はEasy。

最近追加された新しめの問題です。
Easyっぽくない問題なので是非解いてみてください。

問題としては、数の配列`arr`が与えられた時、連続する2つの要素間の差が同じであれば，数列は算術進行と呼ばれます。

配列を再編成して算術進行を形成できる場合は`true`を返し,そうでない場合は`false`を返してください。

>Example 1:

>Input: arr = [3,5,1]
Output: true
Explanation: We can reorder the elements as [1,3,5] or [5,3,1] with differences 2 and -2 respectively, between each consecutive elements.

>Example 2:

>Input: arr = [1,2,4]
Output: false
Explanation: There is no way to reorder the elements to obtain an arithmetic progression.


#解法

```python
class Solution:
    def canMakeArithmeticProgression(self, arr: List[int]) -> bool:
        arr.sort()
        length = len(arr)
        if length==2:
            return True
        difference = arr[1] - arr[0]
        for i in range(1, length):
            if arr[i] - arr[i - 1] != difference:
                return False
        return True
# Runtime: 32 ms, faster than 100.00% of Python3 online submissions for Can Make Arithmetic Progression From Sequence.
# Memory Usage: 13.9 MB, less than 100.00% of Python3 online submissions for Can Make Arithmetic Progression From Sequence.
```

新しい問題でかつEasyなので両方100%の解答が出来ました。

最初に配列をソートします。
配列の長さが2の時のみ除外し、それ以外の場合は値の差をとった`difference`とそれぞれのfor文で回した時の内容が異なる場合には`False`を、それ以外の場合は`True`を返します。

今回はここまで。お疲れ様でした。
mnistをロードしようとした時に出たエラーの対処法

#　初めに
先日、Tensorflow2に初めて触れまして、パターン認識のチュートリアル的立ち位置にあるmnistのデータセットで学習しようとしたのですが、その際にあったトラブルの解決法を書いていきます。

## 実行コード
```python:f.py
import tensorflow as tf
mnist = tf.keras.datasets.mnist
m_data=mnist.load_data()
```
## エラ〜コード
 Exception: URL fetch failure on https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz: None -- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)

##　問題
sslに問題があってmnistのデータを取得できていないようです。
##解決法

どうやらmacの標準のsslが対応していないために上記のエラーが起こっているようです。
私のMacの標準sslはLibreでしたのでopensslに変更してやります。
ターミナルで brew install openssl　と入力してやればいいです。
しかし、これではまだsslはLibreのままです。
opensslに変更してやるには、opensslをインストールした際に
If you need to have openssl@1.1 first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc
と表示されますので、いう通りに
echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc
のコードをコピペして実行します。
そしてその後、ターミナルを再起動し、　openssl versionと入力し、OpenSSL 1.1.1g  21 Apr 2020
のように表示されればOKです。
さらにこの後Pythonのフォルダにある
Install Certificates.command　というファイルをクリックしてやると、無事にmnistがロードできるようになりました！
## 参考記事
https://qiita.com/orangain/items/0a641d980019fd7e0c52
pwnagotchi GPS 連携


# GPS 連携
pwnagotchi の作り方はこちら( https://qiita.com/k0uj1k/items/f91a3b7e3a4b9209774f )

## GPS モジュール
VK-172 VK172 GMOUSE USB GPS Receiver が実績があってよさそうだったので、こちらを購入しました。500円程度でした。
https://www.aliexpress.com/item/32866315335.html?spm=a2g0s.9042311.0.0.799f4c4dL8a2gy
こちらから購入しました。

![P_20200705_121555.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587146/b9bc26ae-1f9e-9acd-2688-159088f80f95.jpeg)

これをUSB OTG ケーブルで、raspberry pi zero の srial 側につなぎます。

## 大事なこと
<b> 「ハンドシェイクをした時の位置を表示します」
現在地を表示するわけではありません。</b>

# 表示するまでの動作確認

terminal で確認します。

```
# dmesg | grep tty | grep -i usb
[    8.298862] cdc_acm 1-1:1.0: ttyACM0: USB ACM device
```
から GPS モジュールが `ttyACM0` だとわかります。
VK-172 VK172 GMOUSE USB GPS Receiver は　9600bps なので、設定します。
config.toml を編集します。

```config.toml 
main.plugins.gps.enabled = true
main.plugins.gps.speed = 9600
main.plugins.gps.device = "/dev/ttyACM0"
```

通信状況を確認します。
ここが参考になりました。
https://community.pwnagotchi.ai/t/mini-guide-debugging-gps/230

```
# grep "GPSGSA" --line-bufferd < /dev/ttyACM0
```
受信できていない時はこうなります。

```
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
```

こんな感じだと受信しています。
![Screenshot_20200705-120119.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587146/4ecd9985-0e1c-76b5-6e3f-dddcb610ae42.jpeg)

<b> 受信感度が弱いので室内では受信しないと思います</b>
GPSモジュールの青色LEDの点滅も目安になります。

## ハンドシェイク時の位置が表示されました。

![P_20200705_120003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587146/d553c56c-81e6-130b-bfca-602d0763869c.jpeg)

緯度、経度が小数点以下4桁で表示されます。
その座標を google 検索すると、かなり正確に特定できます。
ちょっとビビりました。

----

# ハックザプラネット！
<Rails> BootstrapのCard全体をリンクにする

ブログアプリを作成した際、投稿一覧を表示するためにBootstrapのcardを利用しました。
Card全体を詳細表示へのリンクにする方法をまとめます！

BootstrapのCardを実装する前の一覧表示はこんな感じです。



```erb
 <p><%= l post.created_at, format: :short %></p>
 <h5 class="card-title"><%= post.title %></h5>
 <p class="card-text"><%= post.content %></p>
 <%= link_to "詳細", post %>
```

![スクリーンショット 2020-07-05 16.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665145/42e51bff-14f9-8b02-5bc3-5f00853b6b11.png)


それぞれ投稿日時とタイトル、本文を1行だけ表示させています。



# 1. 投稿一覧をCardで表示

Bootstrapに用意されているクラスを利用します。

Cardについてはこちらを参照。
https://getbootstrap.jp/docs/4.5/components/card/


```erb
<div class="card border-dark mb-3" style="max-width: 18rem;">
  <div class="card-body text-dark">
    <p><%= l post.created_at, format: :short %></p>
    <h5 class="card-title"><%= post.title %></h5>
    <p class="card-text"><%= post.content %></p>
　　 <%= link_to "詳細", post %>
  </div>
</div>
```


<実装結果>
![スクリーンショット 2020-07-05 16.16.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665145/78c21e6c-03aa-3520-3456-2adc3f016fa6.png)



ひとまずいい感じになりましたー！！

今回headerとfooterは必要なかったので省いています。



# 2. Card全体をリンクに

今のままではCardの中に詳細ページへのリンクがそのまま表示されてしまっているので、このリンクをCard全体に適用させたい…。

実装方法を調べたところ、`<div class="card-body text-dark">`ではなく `<a href="#" class="card-body text-dark">`のような感じで、全体を囲むと良いらしい！

```erb
<div class="card border-dark mb-3" style="max-width: 18rem;">
  <a href="/posts/<%= post.id %>" class="card-body text-dark">
    <p><%= l post.created_at, format: :short %></p>
    <h5 class="card-title"><%= post.title %></h5>
    <p class="card-text"><%= post.content %></p>
  </a>
</div>
```


一つ一つの投稿を取り出すために`post.id`が必要になりますが、その際にイコールを忘れてしまうとidが取れなくなるので、必ず`<%= post.id %>`と記述します。

私はこれで何度かはまりました。。

<実行結果>

![スクリーンショット 2020-07-05 17.04.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665145/69d9703d-bc6e-7cd4-95f6-91c48393f8c8.png)

これでCard全体を詳細ページへのリンクにすることができました！


もう一つ、aタグではなくlinkタグの方法で実装するやり方も。

結果としては、Card全体を`<%= link_to ~ do %>`と `<% end %>`で囲みます！

```erb
<div class="card border-dark mb-3" style="max-width: 18rem;">
  <%= link_to post, class: "card-body text-dark" do %>
    <p><%= l post.created_at, format: :short %></p>
    <h5 class="card-title"><%= post.title %></h5>
    <p class="card-text"><%= post.content %></p>
  <% end %>
 </div>
```

aタグで記載していたBootstrapのclass `"card-body text-dark"` はlinkタグの中にrailsの記述方法で書き直します。


普段 `<%= link_to ~ %>`のように1行でしか記述したことがなかったので、do~endで囲むやり方は初めて知りました！

備忘録として残しておきます。
【R】タイムスタンプ処理

#全体の流れ
①季節性反映
②予測値検討
③走行時間
④ブレーキ連動

オリジナルfileを時間ごとに読み込む
→ On / Offで抽出
→ 時間ごとにfile出力
On/off fileを時間ごとに読み込む
→ IDを抽出→ リスト化
→ IDごとに繰り返し
　 →  On抽出　/ Off 抽出
      On テーブル / Offテーブル作成
      timestampでソート(Onテーブル/Offテーブル)
      ID<-data.table(ID)
      On<-data.table(length(Onテーブル) 
      Off<-data.table(length(Offテーブル)
      check table<-cbind(ID,On,Off)

   → 【分岐】on スタート or off スタート
      On テーブルのtimestamp :1行目とOffテーブルtimestamp の確認

※ on/offの時間で分類できる。
※ IDごとに変化があったか見える。

#対応①：時間ごとにデータを読み込む
time <- read.csv(z:/~
for(time in time$date){
 data<-read.csv(
#対応②：読み込んだIDをリスト化
Laravelを用いた開発環境の構築手順

Laravelを用いたプロジェクトの開発手順です。

## Laravelのインストール

Composerを使用して、グローバル環境にLaravelをインストールします。

```terminal
$ composer global require laravel/installer
```

laravel実行ファイルがどこに設置されても動作するように、composerシステム全体のvendor/binディレクトリに$PATHを登録します。
MACの場合は、下記をターミナルで記述します。

```terminal
$ export PATH=$HOME/.composer/vendor/bin:$PATH
```

## プロジェクトの作成

`cd`でプロジェクトを作成するディレクトリに移動して、`laravel new プロジェクト名`を実行します。

```terminal
$ cd htdocs
$ laravel new quick_laravel
```

## インストールされたアプリの確認

インストールが完了すると、このようにディレクトリにファイルが作成されます。

![Screen Shot 0032-07-05 at 18.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/efc51350-6413-aa66-f875-585a6558634b.png)
メインとなるアプリやディレクトリは、下記のようにそれぞれの役割があります。
.
├── app … アプリ本体コード
│   ├── Console  … コンソールアプリ
│   ├── Exception  … 例外処理関連
│   ├── Http  … webアプリ
│   │   ├── Controllers  … コントローラー（リクエストを受け取り、モデルを呼んだりビューに表示をさせる）
│   │   ├── Middleware
│   │   └── Kernel.php
│   ├── Prociders … プロバイダー関連
│   └── User.php
├── bootstrap … アプリ起動時に実行されるコード
├── cofig … アプリの共通設定
├── database … データベース関連
├── public … 公開するディレクトリ（Js、CSS）
├── resources … アプリのリソース関連（Viewファイルなど）
├── routes … ルーティング関連（ルーター：リクエストURLに応じて受け渡し先を決める）
├── storage … アプリが操作するファイルの保存先
├── tests … テストコード関連
├── vendor … Laravel本体とライブラリコード
├── artisan … artisanコマンドの設定
├── composer.json … composerの設定
├── package.json … npmの設定
├── phpunit.xml … テストツールの設定
└── server.php … サーバー起動時に実行するコード



## サーバーの起動

`php artisan serve`でサーバーが立ち上がります。

```
$ php artisan serve
```

この画面が出たら、OKです。

![Screen Shot 0032-07-05 at 18.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/c86d2110-a809-993a-6ef7-208ec0bf1477.png)

サーバーは、`ctr + c`で終了できます。
【AzureAD】SSOの属性値を変えて検証してみた

salesforceとのSSO構築が完了したので、少し仕組みをのぞいてみることにしました。
Azureから連携する属性を変えて、検証してみたいと思います。

SSOの設定は、デフォルトではUPN属性がサードアプリに連携されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/acb795ec-7074-0364-7cdd-d06690326f3d.png)

サードアプリではデフォルトで連携する属性値が決まっているようです。

workplaceならメールアドレス
salesforceならユーザー名
servicenowならEmail
って感じですね。

サードアプリのどこかの属性にUPNが入っていたら、勝手に連携してくれるわけではないみたいなので注意が必要です。（できると思ってた自分・・・・笑）

それとサードアプリ側がどういった情報を受けとれるかも、確認しておく必要があります。
例えば jobTitleで連携する場合、本当にその属性値が受け取れるかを確認しておかないといけません。

Saleforceでは【ユーザー名】がデフォルト属性値がとして設定されていますが、ユーザー名に"account1"と入力しても登録できませんでした。エラー画面に、メールアドレスと同じ形式にしてくださいと書いてあるので、メールアドレス形式でしか設定できないようですね！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/cf286eab-0650-b10c-e646-908fe3c46668.png)

メールアドレス形式なら登録できました。ここではaccount1@ドメイン名で登録してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/08fb5698-10a9-3798-6e1a-69feccfb8cf6.png)

単純に同じ文字列を連携しても面白くないので、
少し設定をいじってみようと思います。

testアカウントの役職を"account1"にしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/fc89a187-ceac-9c34-7258-3b64b7a4e002.png)

このまま連携しても、Saleforce側のユーザー名が違っているので、SSOは失敗するはずです。
ですのでシングルサインオンの要求と管理からメールアドレスの形に変更してみます。
ソースから"変換"を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/7b91319f-cc8d-d239-c4c1-716ba1922a31.png)

変換の管理画面で"join(連結）"を以下のように設定します。
ドメイン名はAzureに登録されているドメイン名を選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/8aaa3b14-42ab-432c-d18f-54369d2fda48.png)

これでaccount1@ドメイン名　の情報が連携されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/8fa97a26-02f1-953f-56b1-1121c8c70d35.png)


実際にテストしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/257807e1-aea2-680d-d826-0d1c3cc5b17e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/aedac9b1-d66e-b5e2-a1bc-5085e847317d.png)

無事ログインできました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/a4fbc9d4-3eb9-0f15-8e35-af70306210ad.png)

本当に設定した属性値が連携しているのか、fiddlerを使って確認してみます
値はAzureADにからレスポンスされる　SAMLresponseに格納されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/0d7db836-cfca-764b-10c9-d019ce5fe5b7.png)

中身は暗号化されているのでデコードしてみると
ちゃんとaccount1@ドメイン名　が連携されているようです。良かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/4ee1423d-8cac-85dd-ee85-9f7b56fb5171.png)

属性値の連携について少し理解が深まりました。
属性値の連携は色々カスタマイズ出来るようですね。

”文字列”　＠　ドメイン名　の連携は顧客要件によって利用する場合も
あるので備忘録として残しておきます。

参考になれば幸いです。(＾＾）
Clean Architecture 第1章, 第2章のまとめ

# これはなに

[Clean Architecture - アスキードワンゴ](https://asciidwango.jp/post/176293765750/clean-architecture) を読んで、自分なりにまとめたものです。

---

# 第I部 イントロダクション

- プログラムを「1度だけ」動かすのであれば、膨大な知識やスキルは必要ない
    - 設計・アーキテクチャが正しいかどうかは別の問題
    - 正しくするのが難しい
- 設計・アーキテクチャを正しくするとどうなるのか
    - 開発や保守に必要な人材が少なくてよい
    - 変更をするのが簡単・迅速
    - 機能性・柔軟性が最大になる
- 正しい設計をしないと...
    - 逆にその設計に苦しめられる

---

## 第1章 設計とアーキテクチャ

---

### 設計とアーキテクチャって何？

設計 = アーキテクチャ

- 一般的だと、
    - アーキテクチャ → 上位レベル
        - 建築で言うと、
        - 家の形、外観、正面図、空間や部屋のレイアウト
    - 設計 → 下位レベル
        - 建築で言うと、
        - どのスイッチがどのライトを制御しているか
- 上位レベル + 下位レベル → 家の設計になる

---

- ソフトウェアも同じ
    - 上位レベル + 下位レベル → システム

両者を区別することはできない

---

### 優れた設計をする目的は？

- システムを構築・保守するために必要な人材を最小限に抑えるため
    - リリースごとに労力が増えているなら、その設計は優れていない

---

### ケーススタディ

- リリースをするたびに開発に必要な人材は増えている
- リリースをするたびにコード1行あたりのコストは増えている
- リリースをするたびに生産性が下がっている
- リリースをするたびに開発者にかかる費用は増えている

---

### なぜこうなっているのか？

- 崩壊したコードはスピードが早い
    - あとからきれいにすればいい
- 再設計をしなおせば解決できる
    - 今ならきれいに設計できる

---

> 崩壊したコードはスピードが早い

- クリーンなコードのほうが早い
    - 速く進む唯一の方法は、うまく進むことである

> 再設計をしなおせば解決できる

- それほどうまくいかない
    - 自信過剰による再設計は、元のプロジェクトと同じように崩壊する

---

### まとめ

- 自信過剰を回避して、ソフトウェアアーキテクチャの品質と真剣に向き合うのが最善
    - 優れたソフトウェアアーキテクチャを知る必要がある

---

## 第2章 2つの価値のお話

---

- すべてのソフトウェアシステムはステークホルダーに2つの価値を提供する
    - 振る舞い
        - ソフトウェアの動作
        - 機能
    - 構造
        - アーキテクチャ
- 重要視するべきなのは"構造"
    - 変更のコストが大きくなると、変更をすることが事実上できなくなってしまう

---

### アイゼンハワーのマトリックス

|重要 & 緊急|重要 & 緊急ではない|
|---|---|
|重要ではない & 緊急|重要ではない & 緊急ではない|

- 振る舞い
    -  緊急だが、常に重要ではない
- アーキテクチャ
    - 重要だが、常に緊急ではない

---

優先順位をつけると、

1. 重要 & 緊急
2. 重要 & 緊急ではない
3. 重要ではない & 緊急
4. 重要ではない & 緊急ではない

- よくある間違いは、3を1に昇格させること
- エンジニアはビジネスサイドが評価できない"アーキテクチャ"を評価するために雇われている
    - ソフトウェアを保護するために、他のステークホルダーと戦わなければならない

---

### まとめ

- 重要なのは"振る舞い"よりも"アーキテクチャ"
- エンジニアが優れたアーキテクチャにするための行動をしなければならない

---

おわり
MITRE ATT&CK 参考サイト

# MITRE ATT&CK

最近、サイバーセキュリティに関する記事を見てるいると、ATT&CKという用語を目にすることが本当に多くなりました。
そこでこの記事では、MITRE ATT&CKを理解するために参考となるサイト、ブログ、Twitterをまとめて紹介します。

## 本家サイト

本家ということでまずは、MITRE社のアーティクルです。

### MITRE社

#### ATT&CK
https://attack.mitre.org/

#### ATT&CKトレーニング  YouTube動画
[ATT&CK for Cyber Threat Intelligence Training - Module 1: Introduction & Understanding ATT&CK](https://www.youtube.com/watch?v=mm4j4g3NL-Q&list=PLkTApXQou_8IlkPDzY8vroxBLLhbZbqqC&index=2&t=0s)
[ATT&CK for Cyber Threat Intelligence Training - Module 2: Mapping to ATT&CK from finished reporting](https://www.youtube.com/watch?v=VUqdytInxRg&list=PLkTApXQou_8IlkPDzY8vroxBLLhbZbqqC&index=3&t=0s)
[ATT&CK for Cyber Threat Intelligence Training - Module 3: Mapping to ATT&CK from raw data](https://www.youtube.com/watch?v=0p1UFnBWgj8&list=PLkTApXQou_8IlkPDzY8vroxBLLhbZbqqC&index=3)
[ATT&CK for Cyber Threat Intelligence Training - Module 4: Storing and analyzing ATT&CK-mapped data](https://www.youtube.com/watch?v=8wLGeMPx7Qw&list=PLkTApXQou_8IlkPDzY8vroxBLLhbZbqqC&index=4)
[ATT&CK for Cyber Threat Intelligence Training - Module 5: Making ATT&CK-mapped data actionable](https://www.youtube.com/watch?v=RpCpKc4m3gI&list=PLkTApXQou_8IlkPDzY8vroxBLLhbZbqqC&index=5)






## セキュリティベンダーなど

### McAfee
[今知るべきATT＆CK｜攻撃者の行動に注目したフレームワーク徹底解説](https://blogs.mcafee.jp/mitre-attck)
### Trend Micro
[「APT29」の攻撃を巡るMITRE ATT&CKによる評価結果を読み解く](https://blog.trendmicro.co.jp/archives/24822)
### F-Secure
[エフセキュアが実践する、MITRE ATT＆CKフレームワークの活用方法](https://blog.f-secure.com/ja/why-should-you-care-about-mitre/)
### Rapid7
[MITRE ATT&CKフレームワークとは？](https://www.rapid7.com/ja/fundamentals/mitre-attack/)
### Cybereason
[最近よく耳にする「MITRE ATT&CK」って一体何？](https://www.cybereason.co.jp/blog/security/3743/)
### NTTデータ先端技術
[MITRE ATT&CK その1 ～概要～](http://www.intellilink.co.jp/article/column/attack-mitre-sec01.html)
[MITRE ATT&CK その2 ～攻撃手法と緩和策（スピアフィッシング攻撃の場合）～](http://www.intellilink.co.jp/article/column/attack-mitre-sec02.html)
[MITRE ATT&CK その3 ～攻撃手法と緩和策（認証情報のダンプの場合）～](http://www.intellilink.co.jp/article/column/attack-mitre-sec03.html)
[MITRE ATT&CK その4 ～ MITRE ATT&CK Navigatorの使い方と対策の例 ～]
(http://www.intellilink.co.jp/article/column/attack-mitre-sec04.html)
[MITRE ATT&CK その5 MITRE ATT&CK その5 ～ バージョン7へのバージョンアップの概要 ～]
(http://www.intellilink.co.jp/article/column/attack-mitre-sec05.html)


### NEC
[MITRE ATT&CKサブテクニックでみるサイバー攻撃の手口](https://jpn.nec.com/cybersecurity/blog/200508/index.html)
### NECフィールディング
[第１４回 ハッカーの攻撃や行動、目的を文書化する「ATT&CK™」フレームワーク](https://solution.fielding.co.jp/column/it/itcol01/201904_04/)
VPNとは？

#VPN（仮想プライベートネットワーク）

インターネット接続を暗号化または保護するために使用されるもの。
VPNを利用すれば、物理的に離れている拠点のネットワークを、自分の拠点と同一ネットワークのような利便性や安全性で利用できる。

#VPNがなければ
VPNなしで、世界中のコンピューターとつながったインターネットを利用して、データのやり取りをしたら？
→インターネットは基本的に世界中のコンピュータとつながっているので、めっちゃ便利だけど
**盗聴**（通信の内容を盗み見ること）や**改ざん**（通信の内容を他人が書き換えること）、**なりすまし**などの危険にさらされている。
→そのため、大切なデータをやりとりするには、安全とは言えない！！


#VPNの3つの特徴（認証、暗号化、トンネリング）
##認証
なりすましを防止するために、通信先が正しい相手であるかを確認する技術。
アカウント情報(名前、パスワード)などを照合して確認します。

##暗号化
データの盗聴や改ざんなどを防止するために、第三者が理解できないようにデータを複雑に変換する技術。

##トンネリング
インターネットなどを介したネットワーク同士を、あたかも同一のネットワークのようにつなげる技術。転送したいパケット(またはフレーム)を、新たなパケットで丸ごと包み込む(カプセル化)ことで実現します。


#参考
ヤマハネットワーク製品
https://network.yamaha.com/knowledge/vpn#:~:text=VPN(Virtual%20Private%20Network)%E3%81%A8%E3%81%AF%E3%80%81%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AA%E3%81%A9%E3%81%AB,%E6%80%A7%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
PHP クラスの使い方　勉強メモ

##クラスの使い方のmemo

```php:クラスの使い方
// クラス
class Post
{
  // プロパティ
  private $text;
  private $likes;
  
  // コンストラクタ
  public function __construct($text, $likes)
  {
    $this->text = $text;
    $this->likes = $likes;
  }

  // メソッド
  public function show()
  {
    printf('%s (%s)' . PHP_EOL, $this->text, $this->likes);
  }
}

//ここで値を渡す
$posts[0] = new Post('hello', 0);
$posts[1] = new Post('hello again', 1);

//Postクラスのshowメソッドを実行
$posts[0]->show();
$posts[1]->show();

```

```ruby:出力される値
hello (0)
hello again (0)
```


##コンストラクタ
・newしたときに実行される特殊なメソッド

##クラスを定義する理由
・修正を加えるときに影響範囲がわかりやすい。（コードの見通しがよくなる）

##アクセス修飾子
＊初期値や何も記載しない場合は、public
＊意図しない使われ方をしないために、privatがいいかも。

###public
クラスの中でも外でも使える

###private
クラス内でしか使えない変数に定義する。

###protected
親クラスと子クラスで使える


##継承
###final
メソッドをオーバーライドしてほしくないときに利用する
例：

```php
final public function test() {
   echo 'test';
}
```

参考
ドットインストール
https://dotinstall.com/lessons/basic_php_objects/54004
UIColorとIntの相互変換

n番煎じですが、Intとの相互変換についての日本語の記事が見当たらなかったため投稿します

**使い方**

```swift
let color = UIColor(hex: 0xff0000) // red
color.hex // 0xff0000
```

```swift
extension UIColor {
    convenience init(hex: Int) {
        let red = (hex & 0xff0000) >> 16
        let green = (hex & 0x00ff00) >> 8
        let blue = hex & 0x0000ff

        self.init(
            red: CGFloat(red) / 255,
            green: CGFloat(green) / 255,
            blue: CGFloat(blue) / 255,
            alpha: 1
        )
    }

    var hex: Int {
        var red = CGFloat(0)
        var green = CGFloat(0)
        var blue = CGFloat(0)
        getRed(&red, green: &green, blue: &blue, alpha: nil)

        return Int(red * 255) << 16
            + Int(green * 255) << 8
            + Int(blue * 255)
    }
}

```
pythonで競技プログラミング

#Pythondで競技プログラミング
pythonで競技プログラミングに挑戦中の筆者が使ったpythonのメソッドを備忘録的に記載していきます。
## 使用したメソッド
listの末尾に要素を追加 `append()`
listの重複を取り除いたlistを取得

```python
x = [1, 3, 5, 5,]
list(set(x))
# x = [1, 3, 5]
```
AWS SDK for JavaScriptでS3 のプライベートバケットから画像を取得する

## 前提
- [AWS SDK for JavaScript]([S3](https://www.notion.so/S3-9de887e1a20b444a9801046836683eac))がインストールされていること。

## 処理
`aws-sdk`を読み込む

```
const AWS = require('aws-sdk')
```

インスタンス化

```
const s3 = new AWS.S3({
  accessKeyId: 'xxxxxxxxxxxxxxxxx', //アクセスキー
  secretAccessKey: 'xxxxxxxxxxxxxxxxx', //シークレットアクセスキー
  region: '' //リージョン
})
```
[getObject](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property)のパラメーターを用意

```
const params = {
  Bucket: "buket", //バケット名
  Key: "test.jpg", //キー
};
```

`getObject`を実行

```
const s3Promise = s3.getObject(params).promise();
```

処理が成功したらbase64型に変換する

```
s3Promise.then(function(data) {
  console.log('data:image/jpg;base64' + data.Body.toString('base64'))
}).catch(function(err) {
  console.log(err);
});
```

## 全体
```
const AWS = require('aws-sdk')

const s3 = new AWS.S3({
  accessKeyId: '', //アクセスキー
  secretAccessKey: '', //シークレットアクセスキー
  region: '' //リージョン
})

const params = {
  Bucket: "", //バケット名
  Key: "", //キー
};

const s3Promise = s3.getObject(params).promise();
s3Promise.then(function(data) {
  console.log('data:image/jpg;base64' + data.Body.toString('base64'))
}).catch(function(err) {
  console.log(err);
});
```
SSM Session Manager で ログ取得ができない時に確認すること

# はじめに
AWS Systems Manager のSession Managerを利用してLinuxの操作ログを取得しようと思います。
うまくログが取れない場合に確認するべき点をメモしておきます。

## 利用サービス
以下のサービスを利用します

- AWS Systems Manager(以下SSMと表記)
    - Session Manager（以下セッションマネージャーと表記）
- EC2(Linux)
    - Windowsは検証していませんが、セッションマネージャーから利用できるPowerShellの結果も同様になることが想定されます
- S3
    - ログの保存先に利用します

# 本題
ログを保存するにはEC2側でS3にログを書き込むための権限が必要です。

## EC2に割り当てる権限
EC2には以下の権限を持つIAMロールを割り当てます

- セッションマネージャーを利用するための権限
    - AmazonSSMManagedInstanceCore（AWS 管理ポリシー）
        - 権限過剰ですがEC2の管理に必須の権限と認識しているのでこちらを設定しています（[権限を限定したい場合](https://qiita.com/drafts/2cefb80b1857a5c5f153#%E4%BB%8A%E5%9B%9E%E3%81%AE%E5%86%85%E5%AE%B9%E3%81%A8%E3%81%AF%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%8Caws%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E5%8F%82%E8%80%83%E3%81%AB%E3%81%99%E3%82%8C%E3%81%B0%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%81%9D%E3%81%86%E3%81%AA%E3%82%B1%E3%83%BC%E3%82%B9)）
- 独自で作成した以下のポリシー
    - json形式で記述します（今回は put-Session-Manager-log-to-S3.json という名前を使用します）
    - ＜S3バケット名＞ の部分をログ保存先のバケットに書き換えて使用します
 
```put-Session-Manager-log-to-S3.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::＜S3バケット名＞/*",
                "arn:aws:s3:::＜S3バケット名＞"
            ]
        }
    ]
}
```

## 今回の内容とは異なるがAWSのドキュメントを参考にすれば解決できそうなケース
以下のケースの場合は参考のリンク先をご確認下さい。

- 「AmazonSSMManagedInstanceCore」ではなくセッションマネージャーだけの権限に限定したい場合
- S3を暗号化している場合
- S3ではなくCloudWatch Logsにログを保存する場合




#参考
[Session Manager 用のカスタム IAM インスタンスプロファイルを作成する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-create-iam-instance-profile.html#create-iam-instance-profile-ssn-logging)
[Session Manager と Amazon S3 および CloudWatch Logs のアクセス許可を持つインスタンスプロファイルを作成する (上記ページ内の関連部分)](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-create-iam-instance-profile.html#create-iam-instance-profile-ssn-logging)
AtCoder緑になるまでにやったこと、感想

Atcoderで緑に到達することができたので、勉強した内容と感想についてまとめたいと思います。何番煎じの内容か分かりませんが少しでもこれからAtcoderを始める人の助けになれば幸いです。
<img width="782" alt="スクリーンショット 2020-07-05 16.11.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666603/542fc5e0-61a3-5bf3-8c4c-2934e86202c9.png">

## 自己紹介
・化学系の大学院出身で社会人２年目、情報工学についてきちんと学んだことはありません。
・数学は理系大学院出身としては普通くらいの能力です。
・使用言語はPythonで,C++もコードを読んだりA,B問題の実装程度ならできます。
・プログラミングは社会人になってから勉強を始めました。(簡単なコードなら大学院時代にも書いていました)

## やったこと
過去問を解いているとレートが上がった、結局はそれだけなのですが効率をあげるために意識した2点についてまとめました。

### 1. 適切な難易度の問題を解く
<img width="1316" alt="スクリーンショット 2020-07-05 16.35.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666603/332d4ef3-0c03-7f7f-0b2d-dcb97356989e.png">
これは私が解いた過去問の実績です、特徴としては<font color="Brown">茶色</font>問題の解いている比率が高い、<font color="Aqua">水色</font>問題の解いている比率が低い点かと考えています。<font color="Gray">灰色</font>問題もそこそこ解いているように見えますが、これはC++の学習のため解いた問題が3割ほどありレートを上げる目的では解いていません。
このような実績になった理由として、<font color="Green">緑レート</font>に到達のできない段階では<font color="Brown">茶色</font>問題に出るAtcoder頻出アルゴリズムについて正しく理解することがまず重要、<font color="Aqua">水色</font>問題は難しく学習の効率が悪い(その問題の本質を正しく理解できない)と考えたからです。<font color="Green">緑色</font>問題についてはレートが800近くなり<font color="Brown">茶色</font>問題に苦労せず解けるようになってから取り組んでいます。


### 2. 自分の学ぶべきアルゴリズムを理解する
他の方の緑到達記事にも書いてありますが、<font color="Green">緑レート</font>までに理解すべきアルゴリズムは数で言えば10個程度です。10もあれば得意なもの、苦手なものが出てくると思います。苦手なものを重点的に勉強しましょう。ちなみに私は二分探索とDPが苦手です。。
アルゴリズムの勉強法として私は一度解いたことのある問題について実装を繰り返すという方法で勉強しました、理解していることと実装は別の問題なので実装の勉強は新しい問題を解くのとは別の方法でやることがいいのかもしれません。


## 最後に
私はデータサイエンス分野に興味があり仕事でもそのような内容に携わっています。([kaggleへの取り組み](https://qiita.com/Occccn/items/15e5373cd618227c44e5)についても書いてあるのでよければ読んでみてください。)
そのためもともとはアルゴリズムといったものには興味もありませんでしたし、業務にも活きないだろうと考えていました。しかし実際にAtcoderを通して学んでみるとアルゴリズムを考えることは面白いし、業務にも活きているなと感じます。計算量を意識したプログラミング、コーディングのスピード、バグの発見までの速度と行ったもので特に感じています。ですのでアルゴリズムに興味がないな、という方にもAtcoderのような競技プログラミングに一度は取り組んでみていただきたいなと思っています。
ラズパイ3：RTL-SDRでFMラジオの再生ができない。

# 前提

- 対象端末：Raspberry Pi 3 Model B+
- OS：Raspbian
- チューナー：[Nooelec NESDR Mini 2+ 0.5PPM TCXO RTL-SDR＆ADS-B USB受信機セット](https://www.amazon.co.jp/NooElec-NESDR-Mini-USB%E5%8F%97%E4%BF%A1%E6%A9%9F%E3%82%BB%E3%83%83%E3%83%88%EF%BC%88%E3%82%A2%E3%83%B3%E3%83%86%E3%83%8A%E3%80%81%E3%82%B5%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%80%81%E3%83%A1%E3%82%B9SMA%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%EF%BC%86%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%80%81RTL2832U%EF%BC%86R820T2%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8A%E3%83%BC%E4%BB%98%EF%BC%89-%E4%BD%8E%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E7%84%A1%E7%B7%9A%E6%A9%9F%E3%80%82/dp/B00VZ1AWQA/ref=pd_day0_c_421_3/356-9963793-7368866?_encoding=UTF8&pd_rd_i=B00VZ1AWQA&pd_rd_r=655e07d0-770b-4da4-8166-375673ce227a&pd_rd_w=KzRXC&pd_rd_wg=bmENi&pf_rd_p=b478d726-4f7e-49d4-b59f-e7122f2154cf&pf_rd_r=G5NFE070AKDNTJW5A53D&psc=1&refRID=G5NFE070AKDNTJW5A53D)
- 「rtl-sdr」をapt-getでインストール済み。


# 現象

- 以下のFM復調、および、再生コマンドを実行してもすぐに処理が終了してしまう。

```sh
rtl_fm -f 86.6M -M wbfm -s 200000 -r 48000 - | aplay -r 48k -f S16_LE
```

- 以下、出力結果。

```sh
rtl_fm -f 86.6M -M wbfm -s 200000 -r 48000 - | aplay -r 48k -f S16_LE
aplay: main:612: invalid rate argument '48k'
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Detached kernel driver
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 86916000 Hz.
oversampling input by: 6x.
Oversampling output by: 1x.
Buffer size: 6.83ms
Create UDP thread
Created UDP thread
Main socket started! :-) Tuning enabled on UDP/6020
Sampling at 1200000 S/s.
Output at 200000 Hz.
Signal caught, exiting!

User cancel, exiting...
Reattached kernel driver
```

# 原因

- **<font color="red">「aplay: main:612: invalid rate argument '48k'」</font>**のログにある通り、aplayの引数がおかしい。

# 対応

- 「aplay」の「-r 48k」を「-r 48000」に修正。
-　これで再生できました。

```sh
rtl_fm -f 86.6M -M wbfm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE
```

- 出力結果

```sh
rtl_fm -f 86.6M -M wbfm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Detached kernel driver
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 86916000 Hz.
oversampling input by: 6x.
Oversampling output by: 1x.
Buffer size: 6.83ms
Create UDP thread
Created UDP thread
Main socket started! :-) Tuning enabled on UDP/6020
Sampling at 1200000 S/s.
Output at 200000 Hz.
再生中 raw データ 'stdin' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
```

以上。

# 備考

- ネットの情報を鵜呑みにせず、ログをよく確認しないと駄目ですね。改めて、実感。
rbenv install 2.7.1が「no acceptable C compiler found in $PATH」「cannot load such file」により失敗する

# 環境

- rbenv 1.1.2-30-gc879cb0
- ruby-build 20200520-12-g69ccbf4
- Ubuntu 20.04 LTS (Focal Fossa) [Windows Subsystem for Linux 2; WSL2]

# 前提

[rbenv](https://github.com/rbenv/rbenv)および[ruby-build](https://github.com/rbenv/ruby-build)の導入が完了し、`rbenv-doctor script`による検証がOKであること。

```
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /home/dev/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /home/dev/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20200520-12-g69ccbf4)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/home/dev/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```

# 問題

rbenv + ruby-build の導入完了後、`rbenv install -v 2.7.1`によって、Ruby2.7.1の導入を行ったが、以下のような原因により失敗した (エラー全文を掲載するとさすがに冗長なため、特徴的な部分を抜粋しています)

- configure: error: no acceptable C compiler found in $PATH
- cannot load such file -- openssl (LoadError)
- cannot load such file -- digest/sha2.so (LoadError)

# 原因と対策

__Rubyのビルドに必要なライブラリが不足していることが原因でした。__ruby-buildのwikiには[Rubyのビルドに必要なライブラリとそのインストール方法がOSごとにまとめられているページ](https://github.com/rbenv/ruby-build/wiki)があります。これを参考にして、自分の環境(Ubuntu)に不足しているライブラリのインストールを行ったあと、`rbenv install`を行うとRuby2.7.1を導入することができました。

```
sudo apt update 
sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev
```
大学生が競技プログラミングを初めて茶色になるまで

## はじめに

初めまして、この記事が初記事となります。
私はAtcoder茶色のぺーぺーですが、
灰色から茶色までやってきたことをまとめたいと思います。
もうｎ番煎じなネタなので他の方の記事も見た方がいいかもしれません。

## 記事の対象者
* 大学生でちょっとプログラミングやった人
* 灰色の手前から茶色までの人
* 1、2回コンテストに参加したことがある人

## 環境
* C++( Python使いは他の人の記事を見てね！ )
* VS code(環境構築は他の人のry)

## コンテストに挑む上で気を付けること
はい、ここからが本題です。
問題解いてる間になんかめっちゃ時間かかる...とか感じたことありませんか？
私がこのタイプで「何で周りの人こんな早いん？」ってなってました。
気を付けるべき点をさらっと見てみましょう。

#### 競プロ向きのC++を書こう
競プロはC++がいいって言ってたしC++で書こうってなりますよね？
しかし、学校で習うC++って全然競プロ向きじゃなかったりするんです。
(私はC++だと思っていた言語がC言語でした...)
いくつか例をあげます。

* 入出力まわり

```C++:C++
#include<iostream>
int main(void){
    int x;
    //入出力()
    scanf("%d",&x);
    printf("%d",x);
}
```
これでも全然大丈夫なんですが、下記のほうがもっと短く書けます。
私は特別な事情が無い限り下記のように書くようにしています。

```C++:C++

#include<stdio.h>
int main(void){
    int x;
    //入出力()
    std::cin >> x;
    std::cout >> x;
}
```

* 配列の取り方

動的配列を使っています。int[10000000]と書いてると0の数が分からなくなります。


```C++:C++
#include<iostream>
#include<vector>
int main(void)
{
    std::vector<int> x;
    int m;
    for(int a=0;a<100;a++){
        //入力
        std::cin >> m;
        x.push_back(m);
    }
    for(int a=0;a<100;a++){
        //出力
       std::cout << x[a];
    }
}
```

挙げたらキリがないのでこの辺にしておきます。

## 精進方法
* 解説の動画を見よう

この一点に尽きると思います。本当に丁寧に解説してくださっています。
この場を借りてお礼を申し上げます。
問題を解く→解説PDFを見る→動画を見る→解法に沿って解いてみる
この流れで十分に力はついていくと思います。


## 終わりに

ということでｎ番煎じの記事を書いてみました。
読みづらいこと、この上ないですね...精進します。
ガバガバ知識ですごく強い競プロerに殴られそうで怖いですが、
ツッコミどころ等ございましたらご連絡お願いします。

## 追記(2020/7/5)
DaikiSuyama 様 よりご指摘いただきました。ありがとうございます。

* ミスの修正

* vectorについて
 
Vectorは割り当てられたメモリが足りなければ自動でメモリを確保するため、
上記の例のようなコードでは、push_backされる度にメモリの確保を行う。
そのため、resizeや初期宣言時に前もってメモリを確保しておかなければ、静的配列より低速になるらしい...
ブックマークレット：Udemy講座の目次を作成する


# Udemy講座の目次を作成する

## やること

Udemy講座の目次をぱぱっと作成してしまおう

## できること

Udemy講座の目次がクリップボードにコピーされます。

## やりかた

ブックマークレットでサクッと

以下をブックマークレットとしてブラウザに登録してください。

```javascript
javascript:document.querySelectorAll(".section--section--BukKG").forEach(el=>{  if(el.getAttribute("aria-expanded") == "false" ){    el.querySelector("[role=button]").click();  }}); function execCopy(string) {  var tmp = document.createElement("div");  var pre = document.createElement("pre");  pre.style.webkitUserSelect = "auto";  pre.style.userSelect = "auto";  tmp.appendChild(pre).textContent = string;  var s = tmp.style;  s.position = "fixed";  s.right = "200%";  document.body.appendChild(tmp);  document.getSelection().selectAllChildren(tmp);  var result = document.execCommand("copy");  document.body.removeChild(tmp);  return result;} var ary = [];document.querySelectorAll(".curriculum-item-link--title--zI5QT").forEach(el=>{ary.push(el.innerText.split("\n").join(""));});console.log(ary.join("\r\n"));execCopy(ary.join("\r\n"));
```

## 使い方

Udemyの講座ページを開いて実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/912a80c2-fa94-d90d-2aba-634404090738.png)

あとは、エディタに貼り付けて加工！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/3a11ca31-60c0-dbd3-8009-76a20c9f5f28.png)


以上！

## 解説

```javascript:整形

// javascript: 
// ★（１）ここで右側のプルダウンをすべて展開します！
document.querySelectorAll(".section--section--BukKG").forEach(el => {
  if (el.getAttribute("aria-expanded") == "false") {
    el.querySelector("[role=button]").click();
  }
});

// ★（２）クリップボードにコピーするための関数を定義します！
function execCopy(string) {
  var tmp = document.createElement("div");
  var pre = document.createElement("pre");
  pre.style.webkitUserSelect = "auto";
  pre.style.userSelect = "auto";
  tmp.appendChild(pre).textContent = string;
  var s = tmp.style;
  s.position = "fixed";
  s.right = "200%";
  document.body.appendChild(tmp);
  document.getSelection().selectAllChildren(tmp);
  var result = document.execCommand("copy");
  document.body.removeChild(tmp);
  return result;
}
// ★（３）要素を取得して配列に詰め込みます！
var ary = [];
document.querySelectorAll(".curriculum-item-link--title--zI5QT").forEach(el => {
  ary.push(el.innerText.split("\n").join(""));
});
console.log(ary.join("\r\n"));
// ★（４）配列をくっつけて、クリップボードにコピーします！
execCopy(ary.join("\r\n"));
```

## あとがき

取得対象の要素名（クラス名など）が変わると動かなくなります。
2020/07/05現在動いているので目次を取りたい際は試してみて下さい。
機械学習の概要【3つの手法・基礎集計・前処理・特徴量エンジニアリング・評価】

# 機械学習の手法 3種類
## 教師あり学習 (supervised learning)
教師データを使って予測値を正解ラベルに近づけることを目標に学習する手法

- **回帰 (regression)** : 出力値の予測
    - 線形回帰 
        - 単回帰分析 : 1つの説明変数から目的変数を予測する 
        - 重回帰分析 : 複数の説明変数から目的変数を予測する
            - 多重共線性 (マルチコ) : 相関関係が強い組を同時に説明変数にすると予測が上手くいかなくなる
- **分類 (classification)** : あらかじめ設定したクラスにデータを割り振る
    - 線形分離可能 : パーセプトロン (AND, OR, NAND)
    - 線形分離不可能 : 多層パーセプトロン (XOR)
    - SVM (サポートベクターマシン)
        - 元々は「マージンの最大化」をコンセプトにした線形分離のアルゴリズム
        - スラック変数は誤分類を許容するための工夫
        - カーネル法によって、線形分離不可能なデータにも対応できる
        - カーネルトリックによって、計算量を現実的に抑える
    - 決定木 (decision tree)
        - 不純度が最も減少するように条件分岐を作りデータを振り分ける (繰り返す)
            - 情報利得の最大化
        - 不純度は「クラスの混じり具合」(ジニ係数、エントロピー)
        - 決定木 + バギング = ランダムフォレスト (過学習しにくくなる)
        - データのスケールを事前に整えなくてもいい
        - 分析結果の説明が容易
    - ロジスティクス回帰
        - 線形回帰を分類問題に応用したアルゴリズム
        - 対数オッズ(=log(pi/1-pi))を重回帰分析から求める
        - 対数オッズをロジスティクス関数 (シグモイド関数) で変換しクラスiに属する確率piの予測値を求める
        - 各クラスに属する確率を各々計算し、最大確率のクラスが所属クラスになる
        - このとき、目的関数としては尤度(ゆうど)関数を用いる
    - kNN法 (k Nearest Neighbor法) 
        - データから近い順にk個のデータを見て、それらの多数決で所属クラスを決定
        - データ数に偏りがあると判定結果が不正確

## 教師なし学習 (unsupervised learning)
教師データを使わずに、データの本質的な構造を浮かび上がらせる手法

- **クラスタリング** : 「クラスタ」はデータから自動的に導かれる
    - k-means法
        - クラスタの中心を重心の位置にずらしていくことを繰り返す
- **次元削減 (次元圧縮)** : データが失われないようにデータを低次元に圧縮する手法
    - 主成分分析
        - 線形な次元削減
            - 計算量の削減、次元の呪いの回避
            - 寄与率から各成分の重要度が分かる
            - 主成分から各成分の意味を推測できる

## 強化学習 (reinforcement learning)
収益を最大化する方策を獲得することを目的とした手法

- エージェントは収益を最大化するような行動を選択する (状態が変化する)
- 変化した状態で、収益が最大化するような行動を選択する (これを繰り返す)
- 価値関数 : 収益の期待値を表す関数
- 方策 : ある状態のときに、どの行動を取るかを示す関数
- Deep Q-Network (DQN) : 価値関数の計算を近似計算するDNN。DeepMind社が開発したDQNを利用した強化学習を深層強化学習という。

### 分類(教師あり学習)と回帰(教師あり学習)とクラスタリング(教師なし学習)

- 分類
    - あらかじめ設定したクラスに振り分ける
        - キノコの色、表面積、絵の長さから毒キノコかどうかを予測する
        - 年収、年齢、過去の転職回数から、借金返済可能かを予測する
        - 写真から男性か女性かを予測する
- 回帰
    - 数値を予測する
        - 間取り、築年数、駅からの距離からその物件の家賃を予測する
- クラスタリング
    - データの類似度を基にいくつかのグループに分ける
        - ECサイトの購買履歴で類似したデータ同士をいくつかのグループにまとめる

### アンサンブル学習
分類問題に関しては、単一の強識別機を用いるよりもほぼ確実にバギングの性能が高くなることが経験的に知られている。


# 基礎集計
**データの傾向**を事前に把握する

- 平均、分散、標準偏差を計算する
- 散布図行列をプロットして傾向を調べる
- 相関行列を表示して、傾向を調べる

# 前処理 (preprocessing)

データをモデルに正しく入力できるようにする
データの大きさをある程度均一にする

- 欠損値の処理、補完 : 空欄のあるデータを消去、補完する
- 名寄せ : アンケート結果などの表記揺れを統一する
- 正規化 : データを0から1にスケーリングする (正則化 : 過学習を抑制する手法)
- 標準化 : 平均を0、分散を1にする
- 時系列データの時間粒度の変更
- 画像データのサイズの統一化、グレースケール化
- テキストデータの分かち書き、不要文字の削除、半角全角の統一

# 特徴量エンジニアリング
モデルが認識しやすい特徴をデータからつくること

- カテゴリカル変数 : 何か種類を表す変数 (性別、国籍、出身地)
    - one-hot-encoding : 「カテゴリカル変数」を分かる形 = 特徴量に変換する

# 評価

- ホールドアウト法 : データを「訓練データ」と「テストデータ」に分けること
- クロスバリデーション (交差検証) : データを分割してテストデータに用いるブロックを順に移動しながらホールドアウト法による検証をい、その精度を平均する手法 (データ少ないときにも、ホールドアウト法と比較して信頼できる精度が得られる)

- 訓練データ : 機械学習モデル自体を学習
- 検証データ : 学習に使用していない　ある瞬間の学習の結果を評価 
- テストデータ : モデルの学習が完了した時点　訓練データにも検証データにも使っていないデータでモデルの最終的な予測結果を評価