OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidでKoinを使ってDI

Koinは使ったことあるが、Androidプロジェクトに初期導入したことがなかったので、やってみる。

## KOINとは

公式より日本語化して引用
> Kotlin開発者向けの実用的な軽量の依存関係注入フレームワーク。
>
>純粋なKotlinで記述され、機能解決のみを使用します。プロキシなし、コード生成なし、リフレクションなし。

https://start.insert-koin.io

## 導入

まずはbuild.gradleに追加

```groovy:build.gradle
buildscript {
    ext.koin_version = '2.1.5'
    ...
    dependencies {
        classpath "org.koin:koin-gradle-plugin:$koin_version"
```

```app/build.gradle
    // Koin for Kotlin
    implementation "org.koin:koin-core:$koin_version"
    // Koin for Android
    implementation "org.koin:koin-android:$koin_version"
    // Koin AndroidX Scope features
    implementation "org.koin:koin-androidx-scope:$koin_version"
    // Koin AndroidX ViewModel features
    implementation "org.koin:koin-androidx-viewmodel:$koin_version"
    // Koin AndroidX Experimental features
    implementation "org.koin:koin-androidx-ext:$koin_version"
```

## 準備

`startKoin`でKoinを準備

```kotlin

class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        startKoin {
            androidContext(this@MainApplication)
            modules(appModule)
        }
    }
}
```

moduleを用意する

```kotlin
val appModule = module {
    // リポジトリコンポーネントを宣言
    single<ISampleRepository> { SampleRepository() }
    // MainViewModelを宣言 （SampleRepositoryが渡される）
    viewModel { MainViewModel(get<ISampleRepository>()) }
}
```

## 実装

Fragment

```kotlin
class MainFragment : Fragment() {
    // koinのviewModel()を使う
    private val viewModel: MainViewModel by viewModel()
    ...
```

ViewModel

```kotlin
class MainViewModel(val repository: ISampleRepository) : ViewModel() {
    // repository変数に SampleRepository がKoinで渡される
    ...
```

## 感想
導入も簡単、実装もすごくシンプル！

難しいことをしなければDaggerよりも便利だなー

## 使用したコード

https://github.com/ikemura23/Android-Kotlin-Lab/tree/koin/app/src/main/java/com/ikemura/android_kotlin_lab
aws-sdk-goでFargateタスクを実行する

# 背景
GolangのSDKからFargate起動タイプのECSタスクを起動したかったが、意外と情報が無かったのでまとめます。

# 検証環境
- goバージョン
    - go version go1.14.2 darwin/amd64
- OS
    - macOS Catalina バージョン 10.15.1

# コード
```golang
package main

import (
    "fmt"
    "github.com/aws/aws-sdk-go/service/ecs"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/awserr"
    "github.com/aws/aws-sdk-go/aws/session"
)

func main() {
  svc := ecs.New(session.New(aws.NewConfig().WithRegion("ap-northeast-1")))
  input := &ecs.RunTaskInput{
    Cluster:        aws.String("ClusterName"),        // クラスター名
    TaskDefinition: aws.String("TaskDefinitionName"), // バージョン指定しない場合はLATESTが選択される
  }

  input.NetworkConfiguration = &ecs.NetworkConfiguration{
    AwsvpcConfiguration: &ecs.AwsVpcConfiguration{
      Subnets: aws.StringSlice([]string{"subnetId"}), // サブネットID
      AssignPublicIp: aws.String("DISABLED"), // 必要に応じて
    },
  }

  input.LaunchType = aws.String("FARGATE")

  result, err := svc.RunTask(input)
  if err != nil {
    if aerr, ok := err.(awserr.Error); ok {
      fmt.Println(aerr.Error())
    }
    fmt.Println(err.Error())

    return
  }

  fmt.Println(result)
}
```

- 下記項目は各自の環境に読み替えてください
    - Cluster
    - TaskDefinition
    - Subnets
    - AssignPublicIp


# ポイント
```golang
   input.NetworkConfiguration = &ecs.NetworkConfiguration{
    AwsvpcConfiguration: &ecs.AwsVpcConfiguration{
      Subnets: aws.StringSlice([]string{"subnetId"}), // サブネットID
      AssignPublicIp: aws.String("DISABLED"), // 必要に応じて
    },
  }
  input.LaunchType = aws.String("FARGATE") // Fargateで起動する為に必須
```
Fargateはawsvpcで動くのでネットワーク構成の指定が必要なようです。
他にパラメータを足したい時は`&ecs` に[Request Syntax](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html#API_RunTask_RequestSyntax)のキー名を参考に必要な[type](https://docs.aws.amazon.com/sdk-for-go/api/service/ecs)を足すといいようです。




# 参考記事
[example_ECS_RunTask_shared00](https://docs.aws.amazon.com/sdk-for-go/api/service/ecs/#example_ECS_RunTask_shared00)
[Types](https://docs.aws.amazon.com/sdk-for-go/api/service/ecs)(直リンクに出来なかったのでTypesの項目を参照ください)
[Request Syntax](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html#API_RunTask_RequestSyntax)
【初心者】ざっくりわかるGoogle Colaboratoryを使ったPythonのWebスクレイピング

以下の方の説明がわかりやすかったです。
参考：[Pythonによるスクレイピング①入門編｜スクレイピング を用いて、データを自動抽出してみよう](https://code.dividable.net/tutorials/python-scraping-blog/)

ざっくりWebスクレイピングするときの流れがわかりました。
次は複数サイトから情報取得出来るようコードを改変したいと思います。


# サイトのHTML取得
``` python
import requests
from bs4 import BeautifulSoup
html_doc = requests.get("https://www.yahoo.co.jp/").text # yahooサイトのHTML取得
soup = BeautifulSoup(html_doc, 'html.parser') # BeautifulSoupの初期化
print(soup.prettify())  # HTMLをインデントして見やすくする。
```

# 取得したHTMLの加工
``` python
# Titleの取得
title = soup.title.text
print(title)

# 参考） 
# Python, Requestsの使い方
# https://note.nkmk.me/python-requests-usage/
# 
# Responseオブジェクト
# url: url属性
# ステータスコード: status_code属性
# エンコーディング: encoding属性
# レスポンスヘッダ: headers属性
# テキスト: text属性
# バイナリデータ: content属性


# Descriptionの取得
meta_description = soup.find('meta', {'name' : 'description'})
description = meta_description['content']
print(description)

# 複数のタグを取得する場合
tags = soup.find_all("a")
print(tags)
## 結果
[<a class="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt" data-ylk="slk:help;pos:0" href="https://www.yahoo-help.jp/">ヘルプ</a>,
 <a class="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt" data-ylk="rsec:header;slk:logo;pos:0" href="https://www.yahoo.co.jp">Yahoo! JAPAN</a>,
 <a aria-label="プレミアムへ遷移する" class="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt" data-ylk="rsec:header;slk:premium;pos:0" href="https://premium.yahoo.co.jp/"><p class="oLvk9L5Yk-9JOuzi-OHW5"><span class="t_jb9bKlgIcajcRS2hZAP">プレミアム</span><span class="_2Uq6Pw5lfFfxr_OD36xHp6 _3JuM5k4sY_MJiSvJYtVLd_ Y8gFtzzcdGMdFngRO9qFV" style="width:36px;height:38px"></span></p></a>,
 <a aria-label="カードへ遷移する" class="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt" data-ylk="rsec:header;slk:card;pos:0" href="https://card.yahoo.co.jp/service/redirect/top/"><p class="oLvk9L5Yk-9JOuzi-OHW5"><span class="t_jb9bKlgIcajcRS2hZAP">カード</span><span class="_2Uq6Pw5lfFfxr_OD36xHp6 _3JuM5k4sY_MJiSvJYtVLd_ _1MaEI7rEHB4FpQ1MwfWxIK" style="width:36px;height:38px"></span></p></a>,
 <a aria-label="メールへ遷移する" class="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt" data-ylk="rsec:header;slk:mail;pos:0" href="https://mail.yahoo.co.jp/"><p class="oLvk9L5Yk-9JOuzi-OHW5"><span class="t_jb9bKlgIcajcRS2hZAP">メール</span><span class="_2Uq6Pw5lfFfxr_OD36xHp6 _3JuM5k4sY_MJiSvJYtVLd_ _3Qi5P0lTFbNkWishPzz8tb" style="width:36px;height:38px"></span></p></a>,
...]

# 取得したaタグのテキストとリンクを取得する
for tag in tags:
 print (tag.string)
 print (tag.get("href"))
## 結果
ヘルプ
https://www.yahoo-help.jp/
Yahoo! JAPAN
https://www.yahoo.co.jp
None
https://premium.yahoo.co.jp/
...

```



# CSVデータに保存
``` python
import pandas as pd
from google.colab import files

columns = ["name", "url"]
df = pd.DataFrame(columns=columns)
# 記事名と記事URLをデータフレームに追加
for tag in tags:
 name = tag.string
 url = tag.get("href")
 se = pd.Series([name, url], columns)
 print(se)
 df = df.append(se, columns)
# result.csvという名前でCSVに出力
filename = "result.csv"
df.to_csv(filename, encoding = 'utf-8-sig', index=False)
files.download(filename)

# 参考）
# pandasでcsvファイルの書き出し・追記（to_csv）
# https://note.nkmk.me/python-pandas-to-csv/

```
【swift】xcode11 スクレイピングの仕方

スクレイピングを使った富士急ハイランドの待ち時間のアプリ
<img width="724" alt="スクリーンショット 2020-05-07 22.58.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627010/bb7cc920-d253-5fa9-2a06-76752bb3d696.png">

<a href="https://www.youtube.com/watch?v=cIgRXfr74vQ&t=180s">参考動画</a>

【学んだ点】
・スクレイピングの仕方

雑談
上記の写真はコロナで富士急ハイランドが臨時休業のため全てのアトラクションが受付終了になっています。
参考動画のユーチューバーの方の動画は本当にわかりやすくて、為になる動画ばかりです。
おかげでできることが増え本当に感謝しています。
【django】アップロード画像を表示できない原因

djangoでアップロード画像の表示に苦戦したので、表示できない原因を残しておきます。
# 開発環境
- Windows 10(WSL Ubuntu18.04)
- django 3.0.5

# 前提条件
- FileField、ImageFieldなどを利用して画像アップロードができていること

# 画像を表示できない原因
## 1. settings.pyのMEDIA_ROOTとMEDIA_URLの設定が間違っている
MEDIA_ROOT→アップロードファイルを保存する場所を指定<br>
アップロードした画像はMEDIA_ROOTで指定したディレクトリ内のupload_atで指定したフォルダ内に保存される。

MEDIA_URL→メディアディレクトリの公開用URLを指定<br>
例えば、

MEDIA_URL='/media/'とした場合、<br>
<span style="color: #5ed361">http://127.0.0.1:8000/media/{画像名}</span>が画像を表示するための公開用URLになる。

## 2. {アプリ名}/urls.pyにstatic()文を追加
urls.pyに<span style="color: #ff0000">**static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)**</span>を入れることで<br>
MEDIA_ROOTのディレクトリ内のファイルをMEDIA_URL起点のurlでアクセスできるようになる。

これがないと一致するURLパターンがないため、エラーとなると思う。

追加方法は以下の通り。

```python:urls.py
urlpattern = [
・・・
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```

## 3. htmlのimgやaタグのリンクに画像までのパスを指定する（私はこれが原因でした）
最後にhtmlファイルでimgやaタグを利用して画像を表示する。<br>
imgのsrcやaのhrefには、<span style="color: #ff0000">**アプリ名+MEDIA_ROOTを起点とした画像までのパス**</span>を指定する。

```html:tmp.html
<img src="/{appname}/{画像ファイルへのパス}">
```

```html:tmp.html
<a href="/{appname}/{画像ファイルへのパス}" download="output">
```

# 参考サイト
- [Django公式ドキュメント](https://docs.djangoproject.com/ja/3.0/faq/usage/)
- [はじめてのDjango (7) 画像データの管理やページへの表示，アップロードの方法などについて知ろう](https://qiita.com/j54854/items/1f0560142e39d888251c:embed:cite)
人のTwitterアカウントを見つめるやつ

# 経緯
昔の知人X氏が何かの弾みで道を踏み外し、別の知人A氏やB氏に対して脅迫行為（結局本物の警察沙汰になりました）を始めたので、特定のTwitterアカウントの言動を監視するBOTを作りました。
技術的に特に難しいものではないのですが、せっかくなので公開します。

https://github.com/netebakari/twitter-serverless-watchdog

# やること
監視BOTのようなものは動かしていることを忘れてしまうぐらいがちょうどいいのでサーバーレスで実装します。

設定はDynamoDBに登録しておきます。
AWS Lambdaが定期的に対象アカウントのツイートを取得して、指定されたキーワードを検知したら次のようなツイートでお知らせします。

> 1000000000000000000以降のチェックを行い、N件の監視対象ツイートが見つかりました。 @null宛で引用RTします。
> 現在の監視アカウント: @kiken_na_hito, @abunai_hito, @kowai_hito
> 現在の監視キーワード: https://YOUR-BUCKET-NAME.s3-ap-northeast-1.amazonaws.com/path/to/object/keywords.txt

# 注意点
トークンは用意していないので https://developer.twitter.com で登録して自前で準備する必要があります。またOAuth認証は自分で行ってください。

# なぜなに
(Q) なぜ`@null`宛へのメンション+引用RTで通知するのか？
(A) いきなりこわいツイートがTLに出てきたらびっくりするので
(Q) 監視キーワードがなんでS3へのリンクになっているの？
(A) キーワードが増えると140文字を軽くオーバーしてしまうから
(Q) いったいX氏に何が？
(A) 知りません……
Firefox mac版でページの拡大縮小メモ（雑）

##とりあえず`about:config`
アドレスバーにこれを打つ

```
about:config
```

##pinchで検索
<img width="790" alt="スクリーンショット 2020-05-07 22.21.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241331/7cdaa3ac-7ff2-5d1d-9b3b-6259c524d1cc.png">

###変えたやつ
`browser.gesture.pinch.in`　縮めたとき
`browser.gesture.pinch.latched`　これfalseにしたらスムーズになった
`browser.gesture.pinch.out`　広げたとき
`browser.gesture.pinch.threshold`　小さくするとちょっとの動きでギュンギュンなる

###入れた値
`cmd_fullZoomReduce` たぶん縮小
`cmd_fullZoomEnlarge` たぶん拡大


##ピンチイン・ピンチアウトで拡大縮小できるようになった
でもカクカクする
まぁ刻み幅が結構広いし
そうだ刻み幅toolkit.zoomManager.zoomValues・・・・
眠いのでまた今度
AWS 基礎

#前提
AWSについて復習したことを書いていきます

#本題

#システムをインフラから構築
インフラができるようになるメリット
どのようにインフラを構築するのか

##メリット
・自分でサービスを作れる
自分自身でインフラを構築し、サービスをリリースできるようになる
開発する際のテスト環境を自分で作れるようになる
・システム全体で対応できる
障害があった時にどこに問題があるか、切り分けされるようになる

##どのようにインフラを構築する？
###１サーバーの構成
どのようなサーバーが必要か考える
サーバーの設置
サーバーのOSをインストール各種設定
必要なソフトウェアをインストールし、設定する

###２ネットワークの構成
ネットワークで使用するIPアドレスの範囲を決める
サーバーにIPアドレスを割り当てる
ドメイン名をIPアドレスの対応を割り当てる


##AWSってなに？
アマゾン社が提供するクラウドサービス、世界最大規模

##AWSの特徴
###１サービスが豊富
EC２やRDSなど、100以上のサービスが存在している
高負荷に耐えられる信頼性の高いシステムを少ない手間で運用できる

###２リソースが柔軟
リソースを必要な時に必要な分だけ調達できる
例えば、、、
キャンペーンを行いたいとき、アクセスが増えることが想定されるためキャンペーンを行うときだけサーバーを増やして対応する
キャンペーンが終わったら戻すことができる

###３従量課金
使った分だけ支払う従量課金モデル
不必要な時は使う必要がなく、費用対効果に優れている

#インフラって何？
・インフラとは
サーバーやネットワークのこと

##サーバーとは
クライアントに対してサービスを提供するコンピューターのこと

##ネットワークとは？
複数のコンピューターを繋いで、データを送受信できるようにするもの

##クラウドとは？
ネットワークを利用してコンピューターリソースを利用する形態のこと

###オンプレミス
インフラを自前で用意して、自社で所有・管理すること
利点は設定の自由度が高いこと
欠点は、初期コストがかかり、調達期間が必要でサーバーの増減がしにくいこと

###クラウド（AWS）
インフラネットワーク経由で使用・管理すること
利点は、初期コストが少なく、すぐに始めることができ、サーバーの増減が自由にできること
欠点は、費用の予測が付きづらいこと、クラウド全体で障害が起こると対応のしようがないこと

#作業用ユーザーを作成する
AWSアカウントを作成するとルートユーザーが作成される。
ルートユーザーは普段は使用せず。作業用のIAMユーザーを使用するのがAWSのベストプラクティス！

#リージョン
AWSの各サービスが提供されている地域のこと
リージョンによって使えるサービスが違う

#アベイラビリティゾーン
独立したデータセンターのこと
どのリージョンにもアベイラビリティゾーンは最低でも2つある
なぜなら災害などで一つのアベイラビリティゾーンがダメになっても他のサーバーで対応できるため

#VPC
AWS上に仮想ネットワークを作成できるサービス

#サブネット
VPCを細かく区切ったネットワーク
アベイラビリティゾーンに作る
一つをインターネットから見れるように、もう一つはネットから見れないように区切ることができる
冗長性を高める

#IPアドレスとは
ネットワーク上の機器を識別するためのインターネット上の住所
・ネットワーク上で重複しない番号
・32ビットの整数値で構成される
・読みにくいので32ビットのIPアドレスと8ビットずつの4つの組みに分け、ピリオドを入れて10進数で表現する
・0.0.0.0〜255.255.255.255まで

#ビット・バイト・2進数・10進数
・2進数
各桁を0か1を使って数値を表す
・ビット
2進数の1桁（0か1）
コンピュータのデータの最小単位
・バイト
8ビットを１バイトと呼ぶ
・10進数
0〜9の10種類の数値を使って数値を表す
普段使用している数値表現

#パブリックIPアドレスとプライベートIPアドレス
・パブリックIP
インターネットに接続する際に使用するIPアドレス
重複すると正しく通信できなくなるため、ICANNという団体が管理している
プロパイダーやサーバー事業者から貸し出される

・プライベートIPアドレス
インターネットで使用されないIPアドレス
社内LANの構築やネットワークの実験時はプライベートIPアドレスを使用する

#IPアドレスの範囲
ネットワークを構築する際は、そのネットワークで使うIPアドレスの範囲を決める
IPアドレスはネットワーク部とホスト部に区分けすることで範囲を表記する

##CIDR表記
IPアドレスの後ろに「/」を書き、その後ろにネットワーク部から先頭から何ビット目までなのかを記載する

##サブネットマスク表記
IPアドレスの後ろに「/」を書き、ネットワーク部を表すビットと同じ部分を１に、ホスト部を表すビットと同じ部分を０にする

#IPアドレスとルーティング
インターネットでは、ルーターがIPアドレスの行き先を管理しているので、ネットワークとネットワークがIPアドレスがアドレスを通じて接続することができる（ルーティング）

##ルートテーブル
宛先のIPアドレスと次のルーター（AWSではターゲット）という書式で設定する
ルートテーブルは各サブネットに対して設定できる
サブネットやインターネットゲートウェイ間にはルーターが動いている
【初心者向け】ラズベリーパイ（Rapberry pi）開発　#1

#【超初心者向け】Rasberry-pi（ラズベリーパイ）ハードウェア組み立て
##1. はじめに 
皆さんこんにちは。
今回、Raspberry-pi（ラズベリーパイ）を初めて購入してみました（ワクワク）
これで監視カメラやアレクサみたいなものを早く作りたい。。。

というわけで

- ラズベリーパイ開発をこれから始めたい人
- 始めたはいいけどやり方がわからない人

を対象に、自身でラズベリーパイ開発をしながら紹介していきたいと思います。
初心者同士、一緒に楽しんでいきましょう！
##2. 開発内容
今回の記事では、

- 購入した開発キットの紹介
- ラズベリーパイの組み立て
- ラズベリーパイ起動

といった、ハードウェア部分の組み立て部分について紹介していきます。

##3. 開発環境
今回はAmazonでこちらの開発キットを購入しました。
理由はシンプル、楽そうだから！（性能的にもいろいろできそう）

また、NOOBSというOSインストール用のソフトがプリインストール（事前にインストール）されているため、
OSのインストール作業が必要なく、ささっと開発したい人にはお勧めです。





- LABISTS Raspberry4 4B-32GB（技適マーク入）
 - MicroSDHCカード32G/NOOBSシステムプリインストール/カードリーダ /5.1V/3A Type-C スイッチ付電源/MicroHDMI-to-HDMIケーブルライン/三つヒートシンク/簡単に取り付けケース/日本語取扱説明書/２４ヶ月保証
![開発キット写真.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632671/917aead1-22a9-39b9-e69f-37ff5400a078.jpeg)
https://www.amazon.co.jp/gp/product/B082VVJCPT/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1

また、監視カメラを作ろうと思い、ラズベリーパイ用のカメラも購入しました。

 - Raspberry Pi Camera Module V2 :
    - ラズベリーパイ カメラモジュール ソニーIMX219PQ CMOS画像センサ 8メガピクセル Raspberry Pi 4、3B+、3B、Zero/Zero W及び殆どのシングルコンピューターに対応可能
![ラズパイ用カメラ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632671/4c55fb6f-5080-1676-1048-ced29dcc6d62.jpeg)
https://www.amazon.co.jp/gp/product/B07W6NK7TW/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1


そして最後に、
- HDMIが接続可能なディスプレイ

を準備すればOKです。

##4. 手順
今回は、
①ヒートシンク取り付け
②ファンの取り付け
③カメラ取り付け
④マイクロSDカード取り付け
⑤ラズベリーパイの起動

①~③の手順はLABISTSが提供している動画がわかりやすいので、
以下のリンクの動画（0:00~2:00あたり）を参考にするとよいです。

個人的にはカメラの取り付けが固くて苦戦しました...( ´∀｀ )
https://labists.com/blogs/video-guide/labists-raspberry-pi-4-starter-kit-guide-de-demarrage-rapide-1

###④MicroSD取り付け
MicroSDの向きは下の画像を参考にしてください。
取り出すときは、凸部分に爪をひっかけると取れます。
<img width="768" alt="IMG_5880.JPEG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632671/930a24ae-c8bb-e0f5-7657-e691c7ee3efb.jpeg">
MicroSDの取り付ける向き↑
###⑤ラズベリーパイの起動
最後に、ラズベリーパイとディスプレイをHDMIで接続して起動しましょう。
開発キット付属のMicroSDには、OSインストール用のソフトウェアNOOBSがインストールされており、MicroSDをラズベリーパイに挿入してから起動するだけでOSのインストールが完了します。
![IMG_5883.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632671/0e73357c-59f2-8a50-3853-3a1d452aef03.jpeg)

起動時↑
![IMG_5884.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632671/99a0295c-68a7-e1cb-fe1b-eb2b2def118e.jpeg)
起動後のデスクトップ画面↑（ssh接続のパスワードを変更しろと怒られていますね...）


以上で、開発キットを使ったラズベリーパイのハードウェアセットアップは完了です。
USBのマウスやキーボードをラズベリーパイの接続すればすぐに操作可能です。

お疲れさまでした！
Forkしたリポジトリに本家の変更を反映させる

githubでfork元の変更を自分のリポジトリに反映させるので迷ったのでメモ

#手順
1.masterブランチを選択しておく
2.ターミナルで下記を実行

```
git remote add upstream （ここにclone元のurlを貼る)
```
upstreamの部分は書き換えることも可能だが、よく分からない場合は書き換えないのが無難。

3.ターミナルで下記を実行

```
git remote -v
```
うまく手順２ができていた場合は
<img width="477" alt="スクリーンショット 2020-05-07 22.48.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629396/38a02a94-8433-687d-14b3-fc7f840f93aa.png">
このように表示される。originの消してある部分には自分のgithubのユーザー名、upstreamの消した部分にはfork元の名前が表示される

4.ターミナルで下記を実行

```
git pull upstream master
```
これをすればfork元の変更を自分のmasterブランチに反映できる

##masterブランチの変更を他ブランチにも反映させる手順

チームで開発などしていると新しい機能を追加する際に新たにブランチを切って行うが、その場合本家の内容を上記のやり方だとmasterブランチにしか反映することができない。ただこうすれば反映することができる。**上記のものができていること前提で書いています**

5.ターミナルで下記を実行

```
git checkout 開発用ブランチ
```
開発用ブランチとは例えば新規登録機能を追加するために*sign_up*というブランチを作っていた場合は、開発用ブランチの部分に*sign_up*と記載する。

6.ターミナルで下記を実行

```
git merge origin master
```
これでmasterブランチに反映された本家リポジトリの内容を開発用ブランチに反映させることができる。

###うまくいかない場合
上記を実行してうまくいかない場合は

```
git push origin master
```
手順4を終えた後にこのコードをターミナルで実行してみてください。
このコードは一度自分のアカウントのリポジトリに変更内容を反映させることができます。
**このコードは手順４以降でうまくいかない場合のみ行ってください**
toio準備3

#メモ
★　公式サンプル
yarn example:keyboard-control:キーボードでtoio操作
yarn example:id-reader　：　例）クラフトファイター用のシートの上に乗せると、IDとY軸角度を返す。精度かなりよい。
yarn example:chase :下にバリューパックの土俵をひくと動く。２台のtoioの追いかけっこ。

★[キューブがぐるぐる回るデモ解説](https://note.toio.io/n/n615e5ed8552b)

◆　基本機能の確認
[toio.js で傾き検知と姿勢検出（2019/12/17）](https://qiita.com/youtoy/items/b25b22bb2d82ebc0dda7)

#◆　アドベントカレンダー
[アドベントカレンダーあるのでこれを見る](https://qiita.com/advent-calendar/2019/toiotomo)

[TOIOサッカーは面白そう](https://qiita.com/tomotomospot/items/2dc9b7d0337dcc1a368a)

#◆toioをパワーポイントのコントローラーにする。
yarn example:keyboard-controlでキーボードからtoioを制御できるけど、接続はできない。
[toioをWindows PCとBluetoothでペアリングする](https://qiita.com/akichika/items/aa00a9b209f42292f0d5) 
↑　window10 とペアリングできない。bluetoothのドライバ更新しているからと思うけど、元に戻しても認識できない。

デスクトップＰＣにbluetooth4ドングルを指すと認識された。距離は近くに置いた方が良いみたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/2478d735-039c-3c6c-a3db-419090052709.png)

ただ、上記のcubekey.exeは動かない。保留。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/78155904-8dfc-9f1a-3e95-b1a2acf4f016.png)

繋がったけどパワポは操作できない。断念。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/e433602e-9a53-325e-bdb5-c6ff60a95bd9.png)

パワポは動かせなかったがコントローラーとして使うのはありと思う。

#☆[Unityとtoioの連携](https://qiita.com/ito_ur_right/items/85062db988cfce14c4d7)
↑これを試したが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/e35c30bd-37bc-9fa4-ff0e-b76dbe63bd4d.png)
エラーになる。ABIのバージョン差異が原因らしい。Node.js何もわからないので再ビルドや指定方法も不明でしらべる。つらい。

追記：[node -v v11.15.0にしたら動きました。]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/c85cc853-cb5c-ad07-1757-1c5ff0522753.png)

接続失敗するケースも多々あるので、サンプルのキーボード操作が動く事を確認した方がよさそう。after: wait cube .. のコメントは動作確認のためにいれてます。

(https://nodejs.org/ja/download/releases/)
【JavaScript】例外処理try～catch文の使い方

#【JavaScript】例外処理try～catch文の使い方
try～catch文はエラー発生箇所に仕掛け、エラーを出す条件が整ったら別の処理を実行するための構文。
if～else文と似ている。

```js

        let arr = ["1, 2, 3, 4, 5"];
        console.log(aar.includes(1,0));//arrを呼び出すべきところをarrに指定
        console.log("end");
```

この場合、Uncaught ReferenceError: aar is not defined　が表示され、
3行目のconsole.log("end");は実行されない。

##try～catch文を使ったエラー回避例
1.try{}でエラーが出る範囲を囲む
2.catch (e)を間に入れる
　"e"は引数、どの文字列でも良い
　慣習的にcatch (e) とされることが多い

```js

        let arr = ["1, 2, 3, 4, 5"];
        try{
            console.log(aar.includes(1,0));
        } catch (e) {
            console.log(e);//エラー内容を表示。
        }
        console.log("end");
```

Uncaught ReferenceError: aar is not defined　が表示されつつも、最終処理console.log("end");のおかげで
"end"が表示される。

##RPGツクールの例

RPGツクールMVではセーブやロード実行時にtry~catch文が確認できる。
rpg_manager.js 337行目の箇所

```js

    DataManager.saveGame = function(savefileId) {
        try {
            StorageManager.backup(savefileId);
            return this.saveGameWithoutRescue(savefileId);
        } catch (e) {
            console.error(e);
            try {
                StorageManager.remove(savefileId);
                StorageManager.restoreBackup(savefileId);
            } catch (e2) {
            }
            return false;
        }
    };
```

これは
・セーブに成功したら、セーブファイルのIDと共にsaveGameWithoutRescue（＝救済処理を必要としないセーブ処理に遷移
・セーブに失敗したら、StorageManager.remove、StorageManager.restoreBackupといった別処理に遷移ということなのでしょう。
CloudBuildでCloudKMSのsecretEnvを使おうとして少しハマった

### 前提
`CloudBuild`で`docker build`をするにあたって、gitにはコミットしたくないが`build`時に`--build-arg`で渡したいAPI KEYがあった
そのため、API KEYを`CloudKMS`に登録し、step内で`$$API_KEY`で取得して使おうとしていた

`CloudKMS`については以下を参照
https://cloud.google.com/cloud-build/docs/securing-builds/use-encrypted-secrets-credentials?hl=ja

### ハマった点
```
- name: 'gcr.io/cloud-builders/docker'
  id: 'build-docker-image'
  args: ['build', '-t', 'asia.gcr.io/$PROJECT_ID/SERVICE_NAME', '--build-arg', API_KEY=$$API_KEY', '.']
  secretEnv: ['API_KEY']
```
上記のような感じで`$$API_KEY`を使おうとしても、`docker`側に渡されずに困った

### 解決策
```
- name: 'gcr.io/cloud-builders/docker'
  id: 'build-docker-image'
  entrypoint: 'bash'
  args: ['-c', "docker build -t asia.gcr.io/$PROJECT_ID/SERVICE_NAME --build-arg API_KEY=$$API_KEY ."]
  secretEnv: ['API_KEY']
```
上記のように`entrypoint`を`bash`にしてやることで、`docker build`の引数として渡すことができた
確かに`CloudKMS`を`CloudBuild`で使っている`example`を見ると、`bash`を介していた気がする
修正前は`shell`を介しておらず、`docker build`しているのは`shell`とは別プロセスになっているため取得できなかったと考えている

### 最後に
`CloudRun`で`Nuxt`を使う場合など、環境変数周りでハマりそうなので誰かの参考になれば。
【Chrome開発者コンソール】ネットワークが悪い状況を再現してテストする方法

#Chromeの開発者コンソールで設定

Chrome開発者コンソールをのネットワークタブにて、「Slow 3G」を設定すれば、ネットワークが悪い状況を再現できます。
この設定にした後、テストすればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/28c4d102-5bd4-7fa0-25d5-889f7d2f3428.png)
iOSアプリのビルド番号にビルド日時を設定する

# 背景
- これを実施するまでは1ずつインクリメントしていたため、ビルド番号は意味のない数字だった
- 数字で何か意味のあるものでパッと浮かんだのが日時であった
- ビルド番号が日付だとTestFlightにいつアップロードしたものなのか、TestFlightアプリ上のファーストビューで見れる

![300x0w.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122255/55e03f54-0540-1b75-e9a5-510b225ede92.png)


# 実装
1.[Target]->[Edit Scheme...]->[Build]を展開->[Pre-actions]に下記を記述
 
```shell
#!/bin/sh

date "+%Y.%m%d.%H%M" >${PROJECT_DIR}/build_number.txt
```
2.プロジェクトファイルの[TARGETS]からターゲットを選択
3.[Build Phases]タブを選択
4.[+]をクリックし、[New Run Script Phase]を選択
5.下記を記述
 
```shell
#!/bin/sh

plistBuddy="/usr/libexec/PlistBuddy"
infoPlist="${TEMP_DIR}/Preprocessed-Info.plist"
buildNumber=$(cat "${PROJECT_DIR}/build_number.txt")
$plistBuddy -c "Set :CFBundleVersion $buildNumber" $infoPlist
```
6.`.gitignore`に`build_number.txt`を追記

# 説明
## なぜPre-actionを使用するのか
**最初はすべてのスクリプトをBuild Phaseに記載していたがWatchアプリのビルドが失敗する問題が発生。**
アプリ本体とWatchアプリのビルド番号は同じである必要があるように見える。
（TodayExtensionやNotificationServiceExtensionはアプリ本体のビルド番号と同じになっていなくともビルドは通る。）
各ターゲットのビルドが並列で動いているので、アプリ本体のターゲットが先にビルドされた時しかビルドが通らない。
Pre-actionはどのビルド時よりも早いタイミングで任意の処理を動かせるので、そのタイミングでtxtファイルにビルド番号を保存しておくようにした。

# 参考
- https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102364 （Apple公式ドキュメント）

[DeepL翻訳](https://www.deepl.com/translator)で翻訳。
>ビルドバージョン番号は、最初の整数をゼロよりも大きい値にして、3 つの非負の周期で区切られた整数で構成された文字列にする必要があります。文字列には、数字 (0-9) とピリオド (.) のみを含める必要があります。先頭のゼロは各整数から切り捨てられ、無視されます（つまり、1.02.3は1.2.3と同じです）。各要素の意味は以下の通りです。

>最初の数字は最新のメジャーリリースを表し、最大4桁の長さに制限されています。
2 番目の数字は最新の重要なリビジョンを表し、最大 2 桁の長さに制限されています。
3番目の数字は最新のマイナーバグフィックスを表し、最大2桁の長さに制限されています。
3 番目の数字の値が 0 の場合、それと 2 番目のピリオドを省略できます。
SQL学習

転職の面接でも聞かれることが多いであろうSQLについて勉強していきます。

#SQLとは
SQLとは、Structured Query Languageの略で、リレーショナルデータベース管理システム（RDBMS）と対話するための言語です。RDBMSにquery（問い合わせ）を投げることでデータベースのあらゆる操作を行うことができます。

# リレーションデータベースとは
データを表形式で表したデータベースで、表（テーブル）はExcelの様に列（カラム）と行（レコード）で構成されている。

#SQLで具体的にどのようなことができるのか
データベースやテーブルの作成/更新/削除やデータの登録/更新/削除/検索、またデータを特定するための条件を指定することができます。


## データベースの作成
```sql

CREATE DATABASE データベース名;
```
## データベースの選択

```sql
USE データベース名;
```

##テーブルの作成
```sql
CREATE TABLE テーブル名 (カラム名 カラム名の型,カラム名 カラム名の型, ...);
```

##データの登録

<b>・全てのカラムにデータを登録する場合</b>
　レコードの左から順番に登録される。

```sql
INSERT INTO テーブル名 VALUES(値1, 値2, 値3);
```
<b>・特定のカラムにデータを登録する場合</b>

```sql
INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);
```

##データの取り出し
<b>・テーブルにある全てのデータを取り出す場合</b>

```sql

SELECT * FROM テーブル名;
```

<b>・テーブルにある列（カラム）のデータを取り出す場合</b>

```sql

SELECT カラム名 FROM テーブル名;
```

<b>・テーブルにある列（カラム）のデータを複数取り出す場合</b>

```sql

SELECT カラム名,カラム名,... FROM テーブル名;
```

<b>・条件にあったレコードの値を取得する場合</b>
 　条件の中では"="や"<="のような比較演算子を使用できる。
　SELECT...FROMに続くことが多い。

```sql

WHERE 条件
```

##データの並び替え

降順

```sql

SELECT * FROM テーブル名 ORDER BY カラム名 DESC;
```
昇順

```sql

SELECT * FROM テーブル名 ORDER BY カラム名 ASC;
```

##データの更新
```sql

UPDATE テーブル名 SET 変更内容 WHERE 条件;
```

##データの削除
```sql
DELETE FROM テーブル名 WHERE 条件;
```

##テーブル構造の変更

<b>・カラムの追加</b>

```sql

ALTER TABLE テーブル名 ADD カラム名 カラムの型;
```
<b>・カラムの修正</b>

```sql

ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
```

<b>・カラムの削除</b>

```sql

 ALTER TABLE テーブル名 DROP カラム名;
```

##最後に
主な操作方法の中から基本的なものを紹介しました。
Railsだとrake db:createやdb:migrateで作るので直接触ることの少なかったSQLですが、これからどんな言語やデータベースを使うかわからないので、対応していきたいです。

##参考
https://www.techscore.com/tech/sql/index.html/
https://qiita.com/nishiy-k/items/49b3b658fb90d3e8fed3
【JavaScript】タイマー機能setInterval,setTimeoutの使い方

#【JavaScript】タイマー機能setInterval,setTimeoutの使い方

setIntervalは間隔を設定、setTimeoutは指定時間後に終了する
両者とも書き方次第で、Nミリ秒後まで実行とタイマー操作ができる。

##setInterval

・setInterval(実行する関数名, 実行間隔ミリ秒)：タイマーの間隔(interval)をセット(set)する
・clearInterval(setIntervalを渡した定数、変数)：setIntervalの処理を停止する

```js

    {
        let i = 0;//カウンタ用の変数i

        function showTime(){//現在時刻を取得・表示するshowTime関数
            console.log(new Date());//現在時刻を表示
            i++;
            if(i>2){//2＝2000ミリ秒後に停止
                clearInterval(intervalId);
            }
        }
        const intervalId = setInterval(showTime, 1000); //showTime関数を1000ミリ秒ごとに実行
    }
```

##setTimeout

・setTimeout(実行する関数名,ミリ秒後に実行)：指定した時間の後に1回だけ実行する
・clearTimeout(setTimeoutを渡した定数、変数)：setTimeoutの処理を停止する
functionの外にshowTime()を実行することでsetIntervalの例と同様に循環処理をしている

```js

    {
        let i = 0;//カウンタ用の変数i

        function showTime(){//現在時刻を取得するshowTime関数
            console.log(new Date());//現在時刻を表示
            const timeoutId = setTimeout(showTime,1000);//1000ミリ秒後にshowTime関数を停止する
            i++;
            if(i > 2){
                clearTimeout(timeoutId);
                }
            }

        showTime();//showTimeを実行する（繰り返す）
    }
```

##setIntervalとsetTimeoutを使った循環処理の違い

A.setIntervalは間隔を指定して実行
B.setTimeoutは終了タイミングから実行

Aの場合だと処理内容に時間がかかった場合でも間隔で実行するため、前の処理を実行中でも等間隔で次の処理を行ってしまう。
Bの場合だと終了を起点に次の処理を実行しているため、前の処理と重なることがない。
react + formik で useFormik を使ってみた

react 初心者がいろいろ学んだことやハマったことの記録。
formik 編。（typescript使って実装してます）

## react + formik + Yup を使って動的なバリデーション実装するのにuseFormikというフックを使ってみた

通常は、Formikコンポーネントを用いて実装しますが、諸事情でreact要素以外でformikを使いたいケースがあったため、useFormik使ってみることにしました。
ところが、FormikのErrorMessageコンポーネントでバリデーションエラーが出せないどころか、formikがundefinedだというエラーが発生してしまいました。

```tsx


import React, {useState} from 'react';
import {useFormik, ErrorMessage} from 'formik';
import {FormikValuesProps} from './types';
import {createValidationSchema} from './validation-schema';

const HogeComponent: React.FC = () => {
  const formik = useFormik<FormikValuesProps>({
    initialValues: {
      firstName: '',
      lastName: '',
    },
    // 動的なValidationShema生成(詳細は割愛..)
    validationSchema: createValidationSchema(...),
    onSubmit: () => {},
  });
  return (
    <>
      <label htmlFor="firstName">First Name</label>
      <input
        type="text"
        name="firstName"
        value={formik.values.firstName} 
      />
      {/** ここでエラーになる */}
      <ErrorMessage name="firstName" />
      ......
    </>
  );
};

export default HogeComponent;
```
## 原因は

ErrorMessageはReact Contextを介してformikにアクセスする。
useFormikが返すformikはContextに存在しない。（FormikContextは生成されない）

[Formik公式サイト](https://jaredpalmer.com/formik/docs/api/useFormik)を改めて眺めるとそのようなことが書かれています。英文のドキュメントがいまいち頭に入ってこないため、[Formikコンポーネントのソース](https://github.com/jaredpalmer/formik/blob/master/packages/formik/src/Formik.tsx)ものぞいみたところ、useFormikで取得したformikをContextに引き渡してコンポーネント生成していました。

ErrorMessageコンポーネントを使ってバリデーションエラーを表示したいのであれば、FormikContextにuseFormik が返すformikを渡せばいいのだな、ということはわかりました。

## どうしたか

[チュートリアル](https://jaredpalmer.com/formik/docs/tutorial#leveraging-react-context)に、プロバイダを使用してFormikContextにformikに引き渡しているコードがあったのでそちらを参照しつつ、コードを修正してみます。

```tsx

import React, {useState} from 'react';
import {useFormik, ErrorMessage, FormikContext} from 'formik';
...

const HogeComponent: React.FC = () => {
  // 省略
  return (
    {/** こちらを追加 */}
    <FormikContext.Provider value={formik}>
      <input
        type="text"
        name="firstName"
        value={formik.values.firstName} 
      />
      <ErrorMessage name="firstName" />
      ......
    </FormikContext.Provider>
  );
};
```

これで、無事ErrorMessageコンポーネントを使ってバリデーションエラーを表示させることができました。


## 参照サイト
Formik公式サイト - https://jaredpalmer.com/formik
React公式サイトのContext - https://ja.reactjs.org/docs/context.html
Rubyで文字列を同じ文字で一気に置換したいと思う

##はじめに
お久しぶりです。本日は久しぶりに解いたAtCoder問題で、
自分の回答と、他の人の回答を見ていいなと思った回答を振り返っていきます。

##解いた問題
私が解いた問題は、
「**与えられた文字列をある文字で全て置換してください**」というものでした。

##私の回答
置換と聞いて一番最初に思いつくのは,,,そうですね**replace**ですね。
しかし、今回はどんな文字でも、指定の文字に入れ替えなければいけません。
なので、replaceではうまく行かない？と思い、諦めました。

そして、正規表現でやったらいけるのではないか？と思いましたが、
普段から正規表現になれていない+検索力のない自分に深く反省です。

結局持てる英知を結集して書いた回答がこちら

```sample.rb
s = gets.chomp.to_s
r = ""
s.length.times do |time|
    r += "x"
end
puts r
```
与えられた文字列の長さだけxを継ぎ足していくという、
なんとも原始的な方法になってしまいました。

##さらに推敲
このままでは満足行かない、ということで
他の人の回答も参考にさせていただき、
別回答を作成しました。

###別解1

```sample.rb
puts 'x'*gets.chomp.size
```

たった一行で回答できてしまうのか,,,とビビりました。
文字を演算子で繰り返し出力できるということが頭の中から完全に消去されてました。
普段こうした表現をすることが少ないからかもしれませんが、
柔軟な発想は常に持ち合わせて置きたいな、と思わされました。

###別解2
```sample.rb
s = gets.to_s
puts s.gsub!(/./,'x')
```

こちらは大本命正規表現で書かれた回答です。

/./でよかったのか...
/a-z*/(適当に書いてるので違うかもしれません。。)みたいな正規表現を書いたら、
どんな文字列でも'x'だけを返してしまうので、どうして良いかわかりませんでした。
正規表現が使われてるソース見ても、「うっ」と拒否反応がでないくらいには、
正規表現への理解を深めたいものです。

##終わりに
かなり簡単な内容で、記事にするまでもないだろと呆れられてしまいそうですが、
自分の学びの定着にはなると思うので、
簡単なつまずきでも書き留めていきたいです。

日々精進ですね。それではまた。
コロナに負けずBronze DBA 12c合格！

#Bronze DBA 12c取得
お疲れ様です。
2020年4月30日にOracle Database 12c Bronze DBA 12cに合格しました。
今回はBronze DBA 12cの資格取得を目指す方向けに勉強方法について共有させてください。

##1.私について
2018年新卒でIT企業に入社しWebアプリケーションエンジニアとして3年目となります。 就職前は農学を学ぶ教育機関にいたためどちらかといえばITはよくわからない業界でした。

入社以来の主な取得資格は下記です。 
2019年 
・**AWS 認定ソリューションアーキテクト – アソシエイト** 
・**Oracle認定JavaプログラマSE 8 Silver**
・**Webクリエイター能力認定試験-エキスパート **
・**情報処理技術者（基本情報技術者） **
2020年 
・**AWS 認定デベロッパー – アソシエイト**
・**Oracle Database 12c Bronze DBA 12c**

DBはアプリケーションの実装の単体テストや結合テストをする時に触る程度でした。しかし、それだけでは開発プロジェクトのDB管理の考え方を理解できませんでした。やはり、自分でも適切なDBの運用をできるようになりたい。プロジェクトで無駄の多いDB管理手法を改善するために可能な範囲で提案してより開発しやすい環境を整えたいと思いました。

##2.結果
正答率：70%（**合格ライン：70%**）
![試験結果レポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403146/566e8a97-8945-64ba-be71-b6c95c95b5e9.png)


##3.勉強方法
####総勉強時間
・約105時間（**平均2時間30分/日**）
####スケジュール
・3月半ばから4月30日までの約1ヶ月半（4月は3週目からリモート）
・オンサイト：通勤時間（1時間）と昼休み（30分）
・リモート：業務後（3時間30分）と昼休み（30分）
####教材
・[徹底攻略ORACLE MASTER Bronze DBA 12c 問題集](https://book.impress.co.jp/books/1114101088)
####勉強方法
- DBAの世界を知る：問題を**間違えることを恐れず**全ての練習問題（1~11章まで）をひたすら解く。
・
- １周目：**定着しなかった問題をあぶり出す。**間違えた問題の**解説を分析し理解し覚える。**他の知識とつなげる。
- ２週目：1~11章＋12章および13章（模擬問題）を解き定着しなかった問題をあぶり出す。間違えた問題の解説を分析し理解し覚える。**他の知識とつなげる。**
- 間違えた部分の解き直し＆復習：**一度でも間違えた問題のみ**２〜３周ほど解き直してみる。わかっている解説は飛ばしても良い。なかなか定着しない考え方を定着させる。

※コツ：間違えることを恐れないで**スピード感を持つ。****忘れそうなタイミングで記憶を救い上げる感覚**で何度も復習する。**途中で疲れて挫折しても大丈夫です。また向き合えれば。**
![スクリーンショット 2020-05-07 午後8.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403146/8b5d2517-b165-f36e-907b-f6d130f16efd.png)


##4.コロナの影響
多くの方がコロナの影響を受けてリモートワークをされているかと思います。私もそのうちの一人でした。これにより、多くの通勤時間を勉強時間に還元できました。そのため1ヶ月半で資格を取得するだけの十分な時間を得る事ができました。皆さんもコロナに負けず、何か将来の自分やチームのために投資できたらそれはとても素敵な時期になると私は思います。

##5.終わりに
5月から新しい会社に転職しました。その会社は品質保証で事業を行う会社です。私はそこにテスターとして参画するのではなく、一人の開発者としてプロジェクトに貢献しにいきます。これまで取得した知識は見せ物ではなく貢献できる生きた技術として全力でぶつかっていきます。
この記事が少しでも多くの方の背中を押すことができれば幸いです。
私は次はIPAのプロジェクトマネージャ試験の勉強を進めていきます。
今後とも応援宜しくお願い致します。
累積和を用いてABC154 D問題を解く

競技プログラミングの備忘録用
累積和を用いてABC154 D問題を解く．
[D - Dice in Line](https://atcoder.jp/contests/abc154/tasks/abc154_d)

###問題
$N$個のサイコロが左から右に一列に並べてあります。左から$i$番目のサイコロは$1$から$p_i$までの$p_i$種類の目がそれぞれ等確率で出ます。隣接する$K$個のサイコロを選んでそれぞれ独立に振ったとき、出る目の合計の期待値の最大値を求めてください。

###制約
- $1≤K≤N≤200000$
- $1≤p_i≤1000$
- 入力で与えられる値は全て整数

###入力
入力は以下の形式で標準入力から与えられる。

```
N K
p1 ... pN
```
###出力
隣接する$K$個のサイコロを選んで振ったときに出る目の合計の期待値の最大値を出力せよ。なお、想定解答との絶対誤差または相対誤差が$10^{-6}$以下であれば正解として扱われる。

###方針
まず，全てのダイスに対する期待値を求める．その後，累積和を用いて連続したK個の整数からなる部分列の和の最大値を求める．

###累積和の雛型

```c++
for(int i=0; i<N; i++){
    s[i+1]=s[i]+a[i];
}
```
$a_0,a_1,....,a_{n-2},a_{n-1}$のような数列の累積和を求めるときは上記のコードでOK.
$S_0,S_1,...,S_{n-1},S_{n}$のような累積和が得られる．

###累積和から部分和を求める
$a_0,a_1,....,a_{n-2},a_{n-1}$のような数列の累積和が$S_0,S_1,...,S_{n-1},S_{n}$で表されるとき，$a_i$から$a_j$までの部分和を求めたいときは$S_j-S_{i-1}$で求めることができる．

###解法コード

```c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PLL;
typedef vector<int> VI;
typedef vector<char> VC;
typedef vector<double> VD;
typedef vector<double> VL;
typedef vector<string> VS;
typedef vector<PLL> VP;
typedef vector<ll> VLL;
#define rep(i,n) for (ll i=0; i<(ll)(n); i++)
#define repd(i,n) for (ll i=n-1; i>=0; i--)
#define rept(i,m,n) for(ll i=m; i<n; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second
#define PF push_front
#define PB push_back
#define SORT(V) sort((V).begin(), (V).end())
#define RVERSE(V) reverse((V).begin(), (V).end())
#define paired make_pair
#define PRINT(V) for(auto v : (V)) cout << v << " "
int ctoi(char c) { if (c >= '0' && c <= '9') { return c - '0'; } return 0; } //charを整数に
//空白文字も入力 getline(cin, S);

int main()
{
    int N, K;
    cin >> N >> K;
    VD p(N);
    map<int, int> A;
    double mx=0;
    VD kitai(N);
    rep(i,N){
        cin >> p[i];
        mx=max(mx,p[i]);
    }
    rep(i,mx+1){
        for(int j=1; j<=i; j++){
            A[i]+=j;
        }
    }
    rep(i,N){
        kitai[i]=A[p.at(i)]/p[i];
    }
    VD s(N+1, 0);
    rep(i,N){
        s[i+1]=s[i]+kitai[i];
    }
    double ans=0.0;
    for(int i=0; i<=N-K; i++){
        ans=max(ans,s.at(i+K)-s.at(i));
    }
    printf("%.10f\n",ans);
}
```

###参考にした記事
[累積和を何も考えずに書けるようにする！](https://qiita.com/drken/items/56a6b68edef8fc605821)
HTML,CSSを振り返って

初心者の私がHTML,CSSを一通り勉強し振り返って気づいたことなどメモ感覚で書いていきます。

#HTML,CSSとは
**HTMLとは**
Hyper Text Markup Languageの略でマークアップ言語の一つ。普段目にするwebのほとんどはHTMLで作られていたりする。
**CSSとは**
Cascading Style Sheetsの略でウェブページのスタイルを指定するための言語である。HTMLと組み合わせて使うことができる。
HTMLだけでもウェブページのスタイルは作れるがそれだと使用用途が違うためにコードがぐちゃぐちゃになってしまう。そのためにHTMLは情報構造を指定、CSSはスタイルを指定と使い分けることになる。

##HTML決まり文句
決まり文句とはコードを書いていく上で絶対に必要になる部分のこと、足りない部分があればコメントで指摘して欲しい。

```
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>タイトル</title>
  </head>
  <body>
    
  </body>
</html>
```
ものすごく簡単に書いたものになる。webサイトを作っていくとさらに書く要素が増えていくが最低限必要なものを書いた。
それぞれ説明していくと*!DOCTYPE html*はこれから書くものはHTMLですよ〜と指定してあります。
*html lang="ja"*はこれから書いていくHTMLは日本語ですよ〜と指定してます。
*head*の部分にはwebページに表示はさせないけどこの情報は書いておかないといけない！ってものを書いていきます。
*meta charset="utf-8"*は文字コードを指定していてこの記載がないと文字化けが発生してしまう可能性を防いでいる。utf-8以外にもあるので細かい部分は検索して欲しい。
*title*はウェブページを開いた際にタブに表示される名前のこと。

### 便利なコード
ここからは自分がこれを使うと便利になると思ったもののメモをしていく

```
<ol>
  <li>すごい</li>
  <li>つよい</li>
  <li>はやい</li>
</ol>
```
**olタグ**
　1. すごい
　2. つよい
　3. はやい

```
<ul>
  <li>すごい</li>
  <li>つよい</li>
  <li>はやい</li>
</ul>
```
**ulタグ**
　・　すごい
　・　つよい
　・　はやい

```
<dl>
  <dt>質問A</dt>
  <dd>回答A</dd>
  <dt>質問B</dt>
  <dd>回答B</dd>
</dl>
```
**dlタグ**
質問A
　　回答A
質問B
　　回答B

```
<ul>
  <li><a href="#about">このサービスについて</a></li>
</ul>

<h1 id="about">このサービスについて</h1>
```
**ページ内リンク**
これはとても便利です。例を上げるならば目次などです。
ページの上の方に書く目次にaタグをつけてhrefをこのようにつけてあげます、そしてその目次が表している部分にidを書いてあげます。そうすると*このサービスについて*という文字をクリックしてあげるとページ内で指定した部分まで自動でスクロールしてくれます。注意点としてはこの方法でスクロールした際にurlにこの場合だとaboutと追記されてしまいそのままページリンクを他の人に共有した場合に自動スクロールした後のビューが表示されてしまいます。
OPatchエラーの対処法: OUI-67073 Util Sessionが失敗しました: Prerequisite check"CheckActiveFilesAndExecutables" failed.

# Oracle DB 18c にOPatchを適用しようとしたところ、以下エラーが出現した際の対処法
```
Prerequisite check "CheckActiveFilesAndExecutables" failed.
The details are:

Following active executables are not used by opatch process :
/home/oracle/dbhome/product/bin/oracle

Following active executables are used by opatch process :

OUI-67073:UtilSessionが失敗しました: Prerequisite check CheckActiveFilesAndExecutables" failed.
Log file location: /home/oracle/dbhome/product/cfgtoollogs/opatch/opatch2020-05-07_21-11-00午後_1.log

```

##環境

Oracle Linux 6.10
Oracle Database 18c
適用したいパッチ: p30872794_180000_Linux-x86-64

##結果
opatchを利用して、patchをapplyする際は、ORACLE_HOMEを利用するプロセスはすべて終了している必要がある。もし、他のプロセスがORACLE_HOMEを利用している場合は73エラーがでてしまう。
そのため、ORACLE_HOMEを利用しているプロセスをkillすることで解決ができる。

##対処方法
###まず初めに使用しているプロセスを確認した
```
$ ps -ef | grep _orcl
oracle   10127   1 0 20:19 ?    00:00:00 ora_w004_orcl
oracle   9794   1 0 20:19 ?    00:00:00 ora_pmon_orcl
...
```

pmonなどのプロセスがずっと動いていることを確認。
合計で50個くらいのプロセスがあった。
それらをpid指定してそれぞれkillするのはとても時間と労力がかかるため、
まとめてkillできるよう以下を実行した。

```
$ for oud in $(ps -ef | awk '/_orcl/ {print $2}'); do kill -9 $pid; done
```

###もう一度プロセスを確認
```
$ ps -ef | grep _orcl

```
orclプロセスはすべてkillできたようだ。
そこでもう一度patch applyをしてみたところ、問題なく適用することができた！

###（補足）以下のようなエラーが出た場合

```
Following executables are active :
/oracle/app/oracle/product/12.1.0/dbtest/lib/libsqlplus.so
UtilSession failed: Prerequisite check "CheckActiveFilesAndExecutables" failed.Prerequisite check "CheckActiveFilesAndExecutables" failed.
Log file location: /oracle/app/oracle/product/12.1.0/dbtest/cfgtoollogs/opatch/opatch2017-02-16_15-30-33PM_1.log
 
OPatch failed with error code 73
```

エラーログに記載されているactiveになってしまっている
/oracle/app/oracle/product/12.1.0/dbtest/lib/libsqlplus.so
のプロセスをkillする必要がある。
以下コマンドでPIDを特定

```
$ /sbin/fuser /oracle/app/oracle/product/12.1.0/dbtest/lib/libsqlplus.so
/oracle/app/oracle/product/12.1.0/dbtest/lib/libclntsh.so.12.1: 29275m

$ ps -ef | grep 29275
oracle 29275 29255 0 15:02:33 pts/2 0:00 sqlplus / as sysdba
oracle 13802 27442 0 15:33:16 pts/1 0:00 grep 29275
```

プロセスをkillする（複数ある場合はすべてkillする必要あり）

```
$ kill -9 29275
```

これでもう一度patch applyをしてみると、解決できるはずだ。


参考サイト
https://dbaclass.com/article/prerequisite-check-checkactivefilesandexecutables-failed/
https://ittutorial.org/opatch-failed-with-error-code-73-prerequisite-check-checkactivefilesandexecutables-failed-during-opatch-apply-30698487/
DevTools failed to load SourceMap: Could not load content for http://127.0.0.1:8080/js/popper.js.map: HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE の解決例

## 原因

- モデルの指定し忘れ
- 外部キーカラムの設定のミス


## 解決方法
laravel5.8を使っている場合なのですが、postsのマイグレーションに外部キーを追加する所の

`database/migrations/2017_05_22_041557_create_posts_table.php
$table->integer('user_id')->unsigned()->default(1);`

ここの部分ですが、

`$table->bigInteger('user_id')->unsigned()->default(1);`

のようにすることで動きました。

#### ※2024/12/02追記

laravel11なら外部キーのカラムは

`$table->foreignId('user_id');`

の様によりスマートに書けるので、こちらの書き方をお勧めします。

## 参考 
[Laravel 5.8 にて["SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint"]エラー](https://qiita.com/kitakrazy/items/6a3e1936da727dbd92b3)
初心者が月10万稼ぐ為の記録３

#本日の学習
・掲示板を作成

#学習報告
一通り基礎を勉強してきました。
とあるサイトで掲示板の作り方が掲載してましたので
写経を作成中です。
丁寧なサイトで、解説してくれていますが、正直まったくわかりません。

とりあえず、このまま写経をすすめていきます。

#今後の予定
・写経での掲示板完成
・ログインページを作成
Javascriptを使って独自のダイアログボックスを作成する

【開発環境】
macOS Catalina
バージョン 10.15.3
visual studio code

#Javascriptを使ってダイアログボックスを作成する
[![Image from Gyazo](https://i.gyazo.com/989777ab5c0e478af1a9f95c52772734.gif)](https://gyazo.com/989777ab5c0e478af1a9f95c52772734)

ダイアログボックスは一般的にalert()やprompt()などで作ります。しかし、これらで作るとカスタマイズができません。
今回は自作で、自由にカスタマイズできるダイアログボックスを作っていきます。
##骨組みとなるhtmlとcssを作っていきます
まず、html.cssを作っていきます。

```index.html
<body>
    <form id="dialog" name="dialog">
      <p>ボタンをクリックしてください</p>
      <input type="button" name="yes" value="はい" />
      <input type="button" name="no" value="いいえ" />
      <input type="button" name="cancel" value="キャンセル" />
    </form>
    
    <script>

    </script>
</body>
```
次にcssを付与していきます。今回は、head要素内にstyleタグを追加してCSSを記述します。

```index.html
<head>
  <style>
    #dialog {
      width: 250px;
      padding: 30px 20px;
      text-align: center;
      border: 1px solid #aaa;
      box-shadow: 2px 2px 4px #888;
    }
  </style>
</head>
```
これで骨組みが完成しました。これからjsを記述していきます。
##Javascriptの記述
form要素で作成しているので、name属性を利用すればJavaScriptから簡単にアクセスすることができます。

```index.html
<script>
    //form要素を取得する
    const form = document.forms.dialog;

    form.yes.addEventListener("click", () => {
      console.log("「はい」がクリックされました");
    });

    form.no.addEventListener("click", () => {
      console.log("「いいえ」がクリックされました");
    });

    form.cancel.addEventListener("click", () => {
      console.log("「キャンセル」がクリックされました");
    });
</script>
```
各ボタンに対してクリックイベント処理を実装しています。
addEventListenerメソッドを用いてclickされた時に文字が表示されるようにします。
以上でダイアログボックスの作成は完了です。

##おわりに
今回は簡単な自作ダイアログボックスの作成手順を紹介しました。
間違いなどがありましたらご指摘いただければ幸いです。
最後までご覧いただきありがとうございました。
機械学習 線形回帰

○この記事の要点
線形回帰を学習したのでメモ

線形回帰：
・回帰問題の予測を行うアルゴリズム
・y = b + axの直線で表現する
・各データと予測で出す直線の誤差（損失）を最小にするパラメータを求める。
・誤差の測定には、平均二乗誤差を利用（直線と各データの距離の2乗の平均）
・説明変数が大きくなるに連れて、目的変数も大きく（小さく）なる関係性をモデル化できる。
・教師あり学習

#○ソースコード(Python)
```ruby:線形回帰モデル
# 線形回帰
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline

# 学習データ
X = [[10.0], [8.0], [13.0], [9.0], [11.0], [14.0], [6.0], [4.0], [12.0], [7.0], [5.0]]
y = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]

# モデルの生成と学習、評価
model = LinearRegression()
model.fit(X, y) # 学習
print(model.coef_) # 回帰直線の傾き
print(model.intercept_) # 回帰直線の切片
print('y = 0.5x + 3')
y_pred = model.predict(X) #予測

# グラフ表示
fig, ax = plt.subplots()
plt.xlabel("X")
plt.ylabel("y")
ax.scatter(X, y, color='blue', marker='s', label='data')
plt.plot(X, y_pred, "r-")
```

結果
[0.50009091]
3.0000909090909094
y = 0.5x + 3
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628917/538e231d-1497-ad80-b6a4-510a643e9bbb.png)


・データ数が少ないが、それなりにデータを表現していると思う
・回帰問題の予測を行うアルゴリズムには、サポートベクトルマシン、正則化、ニューラルネットワークなどがあるが、このアルゴリズムが一番理解しやすい
・理解しやすいのは、学生のころ1次関数で学んでいるからだと思う。必須教育にもっとこういったアルゴリズムの勉強を追加してほしいと思う
【Laravel】インストールから導入まで（XAMPP環境下）

##`やりたいこと`##
- WEBサーバーはxamppを使う
- laravelで開発する

##`前提`##
- xampp導入済み

##`進めかた`##
- composerのインストール
- laravelのインストール＆プロジェクト作成

composerをインストールする
-
laravelはcomposerというPHPの管理プログラムを利用してインストールする
なのでまずはcomposerをインストールする
[composer](https://getcomposer.org/)
<img width="400" alt="スクリーンショット (21)_LI.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/a6ebc857-aff4-92d0-28f1-2cd54ae58259.jpeg">

コマンドプロンプトで下記を入力しインストールできたか確認する

```php
$ composer -v
```
<img width="400"alt="スクリーンショット (23)_LI.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/4f512f61-5df8-2be9-c652-fc8dc91cb324.jpeg">

このようにバージョンが表示されればOK

Laravelをインストールする（同時にプロジェクトも作成）
-
コマンドプロンプトで下記を入力しインストールする（半角スペースに注意）
プロジェクト名と書かれた場所に好きなプロジェクト名を入れる

```php
$ composer create-project laravel/laravel --prefer-dist プロジェクト名
```
XAMPPにデプロイする
-
xamppフォルダ内のhtdocsフォルダ内に上記で作成したlaravelプロジェクトのフォルダを全て入れる
htdocsフォルダはxamppの公開ディレクトリなので、htdocsフォルダ内にプロジェクトを設置すればWEBサーバーで公開される
ブラウザで確認
-
ブラウザで
```http://localhost/プロジェクト名/public/```
と入力し、laravelのトップ画面が表示されたらOK
<img width="400" alt="la_inst_w_9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/2d3c1ffb-009a-66a5-594f-3a48eeb6fab9.png">

※xamppのApacheをスタートするのを忘れずに
<img width="400" alt="スクリーンショット (27).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/41183768-6fa3-93c0-4d2f-649546fb5f32.png">

以上です
Blender2.8で作ったシェイプキーがUnityにインポートした際に表示されない時の対処法

**モディファイアーを適用のチェックを外してエクスポートすることで
Unityでシェイプキーが表示された**
![dsadasdsadwadasda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/4a399a63-edc5-b46b-1501-e8a694ac0491.png)
Windows10: すぐできる！結構イケてる！Git Bashターミナル環境

###Windowsで結構イケてるターミナル環境を簡単に構築しよう！
***やること***
・テーマの変更
・フォントの変更
・SSHの設定

[git for windowsのインストール。](https://gitforwindows.org/)
インストールはほぼデフォで。
自分はGit GUI Hereだけチェック外します。

###monokaiテーマ。見やすくキレイに。
[ここ](https://gist.github.com/inkychris/2916fa69364d1e8556b265e8d42a6fac)から.minttyrcファイルのダウンロード。
C:\Users\{ユーザー名}\.minttyrcファイルを保存。

###FontをOsakaー等幅に変更。
[ここ](http://ifs.nog.cc/osakattf.hp.infoseek.co.jp/converted/Osaka.zip)からフォントのダウンロード。
インストールしてください。
git bashの画面右クリック -> Options -> Text -> フォントの設定画面

###open sshの設定。

```sh:ssh_config
#下記を追加
#< Gitのインストールパス >/Git/etc/ssh/ssh_config
Host {name} #自分でつけるサーバー名
    HostName {ドメイン名若しくはipアドレス}
    User {username}
    Port {num}
```

###日本語文字化け
```shell
#git status/ git log/ git diff
$ git config --global core.quotepath false
```

####終了
TeraTermのように全部入りじゃないけど簡単にセットアップできるのが売り。
見た目もプログラマブルで美麗・・だよね？
[C#メモ] 動的に登録

```C#
using UnityEngine;
using System;

namespace Core
{
    public class GameEntity : MonoBehaviour
    {
        private string TypeName => $"Core.GameDataStore`1[{GetType()}]";
        private Type Type => Type.GetType(TypeName);
        private object Store => Activator.CreateInstance(Type);

        private void Awake()
        {
            RegistToStore();
        }

        private void OnDestroy()
        {
            UnRegistFromStore();
        }

        private void RegistToStore()
        {
            ExecuteStoreMethod("Regist");
        }

        private void UnRegistFromStore()
        {
            ExecuteStoreMethod("UnRegist");
        }

        private void ExecuteStoreMethod(string methodName)
        {
            var method = Type.GetMethod(methodName, new Type[] { GetType() });
            method.Invoke(Store, new object[] { this });
        }
    }
}

```

```C#
using System.Collections.Generic;

namespace Core
{
    public class GameDataStore<T>
    {
        private static readonly List<T> items = new List<T>();
        public IReadOnlyList<T> Items => items;

        public void Regist(T item)
        {
            items.Add(item);
        }

        public void UnRegist(T item)
        {
            items.Remove(item);
        }
    }
}

```

気をつけること。
typeNameは本来namespaceも必要。
~~GetType().NameSpaceで取得できる。~~
動的に呼び出すメソッドはpublicでなければならない。

目的。
GameEntityを継承したクラスが自動で自クラスをGameDataStoreに登録するようにしたかった。
macOS リリース


|Name|Release|Version|Release|
|---|---|---|---|
|macOS Catalina|2020|10.15.4|2020-03-24|
|macOS Mojave（モハベ）|2018-09-25|10.14.6|2019-10-29|
|macOS High Sierra（ハイシエラ）|2017-09-26|10.13.6|2019-12-10|
|macOS Sierra（シエラ）|2016-09-20|10.12.6|2017-07-19|
|OS X El Capitan（エルキャピタン）|2015-09-30|10.11.6|2016-07-18|
|OS X Yosemite（ヨセミテ）|2014-10-16|10.10.5|2015-08-13|
|OS X Mavericks（マーベリックス）|2013-10-22|10.9.5|2014-09-17|
|OS X Mountain Lion（マウンテンライオン）|2012-07-25|10.8.5|2013-09-13|
|Mac OS X Lion（ライオン）|2011-07-20|10.7.5|2012-10-04|


|Model|10.15|10.14|10.13|
|---|---|---|---|
|MacBook|Early2015|2015|Late2009|
|MacBookPro|Mid2012|Mid2012|Mid2010|
|MacBookAir|Mid2012|Mid2012|Late2010|
|Mac mini|Late2012|Late2012|Mid2010|
|iMac|Late2012|Late2012|Late2009|
|iMacPro|2017|2017||
|Mac Pro|Late2013|Late2013|Mid2010|
Bootstrapのブレイクポイントについて


##Bootstrap4では４つのブレイクポイントがある
[Bootstrap](https://getbootstrap.com/)には**576px、768px、992px、1200px**の４つのブレイクポイントがあります:blush:


| ブレイクポイント |      -      |    576px    |    768px    |    992px    |      1200px      |
|:----------------:|:-----------:|:-----------:|:-----------:|:-----------:|:----------------:|
|    画面幅(px)    |     ~575    |   576~767   |   768~991   |   992~1199  |       1200~      |
| 主な対象デバイス |      -      |    スマホ   |  タブレット |      PC     | 大型ディスプレイ |
|       名称       | Extra Small |    Small    |    Medium   |    Large    |    Extra Large   |
|   クラス接頭辞   |   col-数字  | col-sm-数字 | col-md-数字 | col-lg-数字 |    col-xl-数字   |


##例)PCでは横表示、スマホでは縦表示にしたいとき
この場合、Medium以上は横表示に切り替わるようにします:blush:

```html
<div class="row">
  <div class="col-md-2">block A</div>
  <div class="col-md-8">block B</div>
  <div class="col-md-2">block C</div>
</div>
```

**col-md-数字**とすることで、767以下の画面で見た場合は縦に積み重なって表示され、768px以上の画面で見たときに2:8:2で横表示されます。
【JavaScript】includesメソッドとindexOfメソッドの違い

#【JavaScript】includesメソッドとindexOfメソッドの違い
includesもindexOfも部分一致を判定するために使えるメソッド。

・includesは直感的にtrue/falseで返す
・indexOfは存在する場合は配列の位置を、存在しない場合は-1を返す

##includes
includes(検索対象の値)
または
includes(検索対象の値,配列の開始位置)
で調査し、結果をtrue または falseで返す。

```js

    let arr = [1, 2, 3, 4, 5];
    console.log(arr.includes(1));//true
    console.log(arr.includes(6));//false
```

includes(検索対象の値,配列の開始位置)の場合

```js

    console.log(arr.includes(1,0));//true
    console.log(arr.includes(2,2));//false
```

文字列の場合

```js

    let arr = ["a","ab","abc"];
    console.log(arr.includes("a"));//true
    console.log(arr.includes("abc"));//true
    console.log(arr.includes("abcd"));//false
```

##indexOf
indexOf(検索対象の文字列)で調査し、存在する場合は要素の位置を返す。
存在しない場合は-1を返す。

```js

    let arr = [1, 2, 3, 4, 5];
    console.log(arr.indexOf(1));//0
    console.log(arr.indexOf(2));//1
    console.log(arr.indexOf(6));//-1

```

文字列の場合

```js

    let arr = ["a","ab","abc"];
    console.log(arr.indexOf("a"));//0
    console.log(arr.indexOf("abc"));//2
    console.log(arr.indexOf("abcd"));//-1

```

##RPGツクールMVの応用
変数の中に文字列を格納している場合、文字列が含まれるかを判定できる。

```js

    $gameVariables.value(変数番号).includes("検索対象の文字列")
```

変数1番にテストが含まれているか確認する場合
条件分岐-スクリプトに入れてあげる

```js

    $gameVariables.value(1).include("テスト")
```

![20200507_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372612/90146402-a0ba-18f4-8aff-0007577fbbc3.jpeg)