OmniAICreator/Qiita-1.07M huggingface dataset:
【機械学習】色々な勾配法

# はじめに
機械学習において、ある任意の[評価関数](https://qiita.com/shuva/items/6cc6c70a3327a7172bf1)の値が最も良い値になるように、パラメターやモデルを調整することを**最適化**といいます。このページでは、最適化手法の中でも、機械学習(特にニューラルネットワーク)で最もよく使われる「**勾配法**」について紹介します。


# Batch Gradient Descent (最急勾配法)

勾配法は一般的に下の式で表すことができます。$\theta$を最適化したいパラメター、Jを損失関数、μ を学習率とします。

```math
\theta:=\theta-\theta \frac{\delta}{\delta \theta} J(\theta)
```

**最急勾配法**では、損失 J を以下の式で計算します。m 個のサンプル全ての損失を合計しているのが特徴です。パラメターをアップデートする度に、全サンプルの損失を計算しなくてはならないので、計算時間が大きく、メモリの使用量も相対的に大きいです。

```math
J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}
```


# Stochastic Gradient Descent(確率的勾配降下法)

 **確率的勾配降下法 SGD**では、ランダムに選ばれたサンプルを使って勾配を計算し、パラメター $\theta$をアップデートしていきます。SGDは最急勾配法に比べて、計算量とメモリの使用量も少ないですが、下のグラフを見ていただくとわかるように、最適値に収束するまでに上下の振れが見られます。

```math
\theta=\theta-\eta \cdot \frac{\delta}{\delta \theta} J\left(\theta ; x^{(i)} ; y^{(i)}\right)
```

<img width="703" alt="Screenshot 2020-03-28 at 22.45.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407366/8cc13f7b-7f55-e5e0-7a1f-71fd52fc73cc.png">
(左: 最急勾配法、右: SGD)


# Momentum SGD 
シンプルなSGDだと、上下の振りが大きい場合、中々収束してくれないという問題が発生します。それを解決するのに、**Momentum term (慣性項)**  を足した SGD が生み出されました。
$\theta_t$ を時点tでのパラメターとした時、$v_t$ は t-1の時のパラメターの変化、
$\gamma$ は予め設定された値で、一般的に0.9ぐらいに設定されます。

```math
\theta_{t}=\theta_{t}-\eta \nabla J\left(\theta_{t}\right)+\gamma v_{t}
```

```math
v_{t}=\gamma v_{t-1}+\eta \nabla_{\theta} J(\theta)
```

このmomentum項は、vt-1, vt-2, ... というように、過去の時点でのmomentumの情報を蓄積しています。これにより、アップデートを進めるにつれて、最適値への方向に押していく力が強くなっていき、収束までの時間を短くします。

# Nesterov accelerated gradient
Momentum SGDの問題は、収束方向へ速く進みすぎた場合、最適値を通り過ぎてしまう可能性がある点です。
それを防ぐために、**Nesterov accelerated gradient** では、先に次の傾きを計算することで、最適値を通り過ぎる前に、ブレーキをかけることができます。下の２つ目の式を見ていただくとわかるよう、 $\theta-\gamma v_{t-1}$ つまりアップデート後のパラメターの推定値を使って Jの傾きを計算しています。

```math
\theta_{t}=\theta_{t}-\eta \nabla J\left(\theta_{t}\right)+\gamma v_{t}
```
```math
v_{t}=\gamma v_{t-1}+\eta \nabla_{\theta} J\left(\theta-\gamma v_{t-1}\right)

```


# Adam
これまで見てきた勾配法では、学習率が常に一定の値でパラメターのアップデートが行われていました。
**Adaptive Moment Estimation (Adam)** では、学習率が最初は大きい値をとり、アップデートを進めるにつれ段々と小さくなっていく仕組みになっています。$m_{t}, v_{t}$ が Adamの Momentum項となります。mtとvtは両方とも、アップデートが進につれて指数的に小さくなっていきます。二つの違いは、 mtは平均の勾配、vtは勾配の分散を表したmomentumである点です。この２つの初期値は0ベクトルとなります。
$g=\nabla J\left(\theta_{t, i}\right)$, $\beta_{1}, \beta_{2}$ は momentum の補正値であり、γと同じ役割をします。一般的に $\beta_{1}: 0.999, \beta_{2}: 10^{-8}$ に設定されます。
$\epsilon$ は0で割るのを防ぐ為の値です。



```math

\theta_{t+1}=\theta_{t}-\frac{\eta \cdot \hat{m}_{t}}{\sqrt{\hat{v}_{t}}+\epsilon}
```

```math
\hat{m}_{t}=\frac{m_{t}}{1-\beta_{1}^{t}}
```

```math
\hat{v}_{t}=\frac{v_{t}}{1-\beta_{2}^{t}}
```

```math
m_{t}=\left(1-\beta_{1}\right) g_{t}+\beta_{1} m_{t-1}
```

```math
v_{t}=\left(1-\beta_{2}\right) g_{t}^{2}+\beta_{2} v_{t-1}
```


## 参考

- [Sebastian Ruder, "An overview of gradient descent optimization algorithms", 15 Sep 2016](https://arxiv.org/pdf/1609.04747.pdf)

- [CASPER HANSEN, "Optimizers Explained - Adam, Momentum and Stochastic Gradient Descent"](https://mlfromscratch.com/optimizers-explained/#/)
Mac Nodebrewを用いてNode.jsをインストールした時にエラーが出た話

# 目的

- Nodebrewを用いたNode.jsインストール時に出たエラーを解決した話をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 | 備考 | 
| --- | --- | --- |
| OS | macOS Catalina(10.15.3) ||
| ハードウェア | MacBook  Air (11-inch ,2012) ||
| プロセッサ | 1.7 GHz デュアルコアIntel Core i5 ||
| メモリ | 8 GB 1600 MHz DDR3 ||
| グラフィックス | Intel HD Graphics 4000 1536 MB ||

# エラー内容

- Nodebrewを使用してNode.jsの最新の安定バージョンをインストールしようとした時に下記のエラーが発生した。
- 実行コマンドをとエラー内容を下記に記載する。

    ```terminal
    $ nodebrew install-binary stable
    Fetching: https://nodejs.org/dist/v12.16.1/node-v12.16.1-darwin-x64.tar.gz
    Warning: Failed to create the file                                                                                          
    Warning: /Users/ユーザ名/.nodebrew/src/v12.16.1/node-v12.16.1-darwin-x64.tar.gz: 
    Warning: No such file or directory

    curl: (23) Failed writing body (0 != 1016)
    download failed: https://nodejs.org/dist/v12.16.1/node-v12.16.1-darwin-x64.tar.gz
    ```

# エラー原因

- 原因は単純でインストール先のディレクトリがみなさんのPCに存在しないためインストールできないと言われている。

# 解決方法

1. 下記コマンドを実行してインストール用のディレクトリを作成する。

    ```terminal
    $ mkdir ~/.nodebrew/src
    ```
1. もう一度問題のコマンドを実行する。

    ```terminal
    $ nodebrew install-binary stable
    Fetching: https://nodejs.org/dist/v12.16.1/node-v12.16.1-darwin-x64.tar.gz ###################################################################################################################### 100.0%
    Installed successfully
    ```
1. 正常に実行された。
LaravelでDBのカラム（mysql）のコメントの作成・確認方法

# はじめに
当記事は、Laravelのマイグレーションファイルでカラムにコメントをつける方法、およびmysqlでそのカラムにつけられているコメントを確認する方法を書いています。
#経緯
先日、業務内でデータベースのカラムにコメントがつけられていないために、間違った設計を行ってしまったことがありました（自己責任です）。
やはり、テーブル名、カラム名から推測しにくかったり、外部にも同名のカラムがあって、且つ意味するものが違う場合などはカラムにコメントを付けたほうが良いと思います。



## マイグレーションファイルの記述
二行目の`comment()`でカラムにつけるコメントを記述する。

```migration.php
Schema::create('users', function (Blueprint $table) {
    $table->string('name')->comment('名前');
});
```
##MySQLでの確認方法
```
show full columns from users;
```

右端のcommentのところに`名前`と出てますね。

```
+-------------------+---------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field             | Type                | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+-------------------+---------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| name              | varchar(255)        | utf8mb4_unicode_ci | NO   |     | NULL    |                | select,insert,update,references | 名前   　|
```
#終わりに
カラムにコメントがあった方が、後々プロジェクトに参加してくるエンジニアさんにも親切ですね。
SQLとNoSQL（Amazon DynamoDB）

# 概要
* Amazon DynamoDBの入門として、まずNoSQLとSQLの違いは何か、またDynamoDBでの仕組みはどうなっているかについてまとめました
* 対象読者は、RDBは経験があるけどNoSQLとかはちょっとよくわかっていなくて気になっている方です。

# SQLとNoSQL（Amazon DynamoDB）の比較
## SQLとNoSQL概要
Oracle、DB2、SQL Server、MySQL、PostgreSQLなどのリレーショナルデータベースで使用するリレーショナルデータモデルへのアクセスにSQLが用いられてきた。2000年代半から後半にかけて他のデータモデルが採用され始め、これらの新しいクラスのデータベースとデータモデルを区別し、分類するためにNoSQL（Not only SQL）ができた。

以下では、SQLデータベース（リレーショナルデータベース）とNoSQLデータベース（とAmazon DynamoDB）の違いを示した。


## 最適なワークロード
### リレーショナルデータベース
トランザクショなるで強固な一貫性をもつオンライントランザクション処理（OLTP）アプリケーション用に設計されている。オンライン分析処理（OLAP）やアドホッククエリやデータウェアハウスに適している。
### NoSQLデータベース
低レイテンシーアプリケーションを含む多数のデータアクセスパターン用に設計されている。
### Amazon DynamoDB
Amazon DynamoDBでは、ソーシャルネットワーク、ゲーム、メディア共有、IoTなどの、ウェブスケールアプリケーションに適している。

## データモデル
### リレーショナルデータベース
データを行と列で構成したテーブルに正規化する。テーブル、行、列、インデックス、テーブル間の関係などのデータベース要素は、スキーマによって厳密に定義される。テーブル間の関係によってデータベースの参照整合性が維持されている。
### NoSQLデータベース
キー値、ドキュメント、グラフなどの様々なデータモデルを利用できる。これらのデータモデルはパフォーマンスと規模に応じて最適化されている。
### Amazon DynamoDB
Amazon DynamoDBでは、全てのテーブルに、各データ項目を一意に識別するプライマリキーが必要だが、他の非キー属性のような制約はなくスキーマレスである。また、JSONドキュメントを含む構造化データまたは半構造化データを管理できる。

## ACID特性
### リレーショナルデータベース
* 原子性(Atomicity)
    * トランザクションは必ず完全に実行されるか、全く実行されないかのどちらかになる
* 一貫性(Consistency)
    * 一度トランザクションが実行されると、データが必ずデータベーススキーマに従う
* 分離性(Isolation)
    * 同時発生したトランザクションが相互に独立して実行される
* 耐久性(Durability)
    * 異常事態発生時に、異常時大発生前の最後の状態まで復旧できる

上記4つのACIDの特性がある。
### NoSQLデータベース
ACID特性の一部を緩和することと引き換えに、水平方向に拡張（より多くのマシンを用いて拡張）できる柔軟なデータモデルを実現している。これにより、単一インスタンスの制限を超えて水平方向に拡張する必要のある、高スループット、低レイテンシーユースケースの優れた選択肢になっている

## データアクセス
### リレーショナルデータベース
データベース駆動型アプリケーションの開発を簡素化するためのツールが豊富だが、これらのツールは全て、データを保存および取得するための基準となるSQLを使用する。
### Amazon DynamoDB
DynamoDBでは、AWSマネジメントコンソールやAWS CLIを使用してDynamoDBを操作し、アドホックタスクを実行できる。アプリケーションでは、AWS SDKを活用してDynamoDBを操作できる。

## パフォーマンス
### リレーショナルデータベース
ストレージに最適化されているので、通常はディスクサブシステムによって異なる。最善のパフォーマンスを実現するには、多くの場合は、クエリ、インデックス、テーブル構造の最適化が必要。
### NoSQLデータベース
基盤となるハードウェアクラスターのサイズ、ネットワークレイテンシー、呼び出すアプリケーションに依存する。
### Amazon DynamoDB
DynamoDBは、これらの実装の詳細からアプリケーションを隔離し、堅牢で高パフォーマンスなアプリケーションの設計と構築に集中できるようにされている。

## 拡張性
### リレーショナルデータベース
ハードウェアの演算機能を増強してスケールアップするか、読み取り専用ワークロードのレプリカを追加してスケールアウトする。データベーステーブルが分散システムの複数のホストにまたがることは可能だが、この場合は追加の投資が必要になる。スケーラビリティに上限を課すファイル数とサイズが最大サイズになる。
### NoSQLデータベース
分散型アーキテクチャを使用したアクセスパターンのスケールアウトに基づくパーティション化が可能で、これにより、ほぼ無限の規模でスループットを高め、一貫したパフォーマンスを維持することができる。
### Amazon DynamoDB
DynamoDBでは、レイテンシーの増加なしでスループットの強化ができ、スループット要件を指定すると、その要件に対応するためな十分なリソースが割り当てられる。テーブル単位の項目数、およびそのテーブルの合計サイズに上限はない。

## API
### リレーショナルデータベース
データの保存および取得のリクエストは構造化クエリ言語（SQL）準拠のクエリを使用して伝えられる。これらのクエリはリレーショナルデータベースによって解析されて実行される。
### NoSQLデータベース
アプリケーション開発者は、オブジェクトベースのAPIを使用して、データ構造の保存および取得を簡単に行うことができる。アプリケーションはパーティションキーによって、キーと値のペア、列セット、またはアプリケーションのシリアライズされたオブジェクトや属性を含む半構造化ドキュメントを調べる。
golang でコマンドライン引数を使う

2種類のやり方があります

- [os](https://golang.org/pkg/os/) パッケージの Args を使う
- [flag](https://golang.org/pkg/flag/) パッケージを使う

## tl; dr
- flag を使うのが良さそう
    - 型指定やオプショナル引数、デフォルト値の設定等、色々できるから

## flag
使い方

```main.go
package main

import (
    "flag"
    "fmt"
)

func main() {
    flag.Parse()
    fmt.Println(flag.Args())
}
```

```
$ go run main.go foo bar baz
[foo bar baz]
```
- 解析には flag.Parse() を呼び出します
    - flag.Parse の内部では os.Args[1:] が渡されて解析される
        - os.Args[0:] には実行コマンドが格納されている
- Parse は全ての flag が定義された後かつ、いづれかの flag にアクセスする前にコールする必要がある
    - これを守らないと `flag provided but not defined: -hogehoge` みたいなエラーが出る

```https://github.com/golang/go/blob/master/src/flag/flag.go#L963-L966
// Parse parses flag definitions from the argument list, which should not
// include the command name. Must be called after all flags in the FlagSet
// are defined and before flags are accessed by the program.
// The return value will be ErrHelp if -help or -h were set but not defined.
```

### オプショナルな引数を使う
```go:こんな感じ
package main

import (
        "fmt"
        "flag"
        "os"
)

func main(){
        f := flag.String("flag1", "hoge", "flag 1")
        flag.Parse()

        fmt.Println("Hello %s", *f)
}
```
```console
$ go run sample.go -flag1=fuga
Hello fuga
$ go run sample.go
Hello hoge
```
- オプションを定義するには以下の二つの方法がある
    - var str = flag.String("オプション名", "初期値", "説明")
    -  flag.StringVar(&str, "オプション名", "初期値", "説明")
        - string や int 以外にもいろんな型がサポートされている(詳しくはhttps://golang.org/pkg/flag/)
- 戻り値がポインタなので、使うときは実体参照する
- オプションの指定方法
    - -flag
    - -flag=x
    - -flag x  // non-boolean flags only
    - (※ハイフンは二つでも認識されるらしい)

## os.Args
[この辺](https://blog.y-yuki.net/entry/2017/04/30/000000)を読む

## go test で flag を使う
- 普通に `go test` コマンドにフラグを渡してやれば良い
- Go1.13からテスト実行時のフラグの処理順序が変更されたっぽく、init 関数でフラグの定義をしている場合、parse する前に `testing.Init()` しないとテストが落ちるようになったらしいので注意  
https://budougumi0617.github.io/2019/10/30/go-testing2019/#testing-init-%E9%96%A2%E6%95%B0%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F

### VSCode の拡張で使いたい
- 以下のような設定を setting.json に記述する
- VSCode のエディタ上のテスト関数の上に表示される `run test` ボタンでテスト実行した際に、自動でフラグが付加される

```js
"go.testFlags": [
    "-flag1=hoge",
    "-flag2=fuga"
  ]
```
【Vue.js】XserverにVue CLIで作った超簡易ページをデプロイしてみた。

<h2>はじめに</h2>
Vue CLIを使ったポートフォリオの制作は初めてだったので、とりあえず制作に取り掛かる前にデプロイができるのかどうか試してみました。

(せっかく作ったのにデプロイできないなんてなったら悲しすぎるので。。。笑)

結論、割と簡単にできました◎
<h2>制作アプリに関して</h2>
猫本を参考に、Vue CLIでVue Routerを用いた簡易ページをとりあえず作りました(本当に簡易的です。)

ナビバーにHomeとお問い合わせボタンがあり、そこでビューを切り替えるだけです。<del>(もはやjQueryでやれ。。。)</del>

<img class="alignnone size-full wp-image-714" src="https://chobimusic.com/wp-content/uploads/2020/03/vue.jpg" alt="" width="997" height="185" />

Vue CLIで制作したアプリのリリースには、npm run buildでまずビルドする必要があるみたいです。

<img class="alignnone wp-image-715" src="https://chobimusic.com/wp-content/uploads/2020/03/vue1.jpg" alt="" width="553" height="329" />

distディレクトリが作成され、その中にビルドされたファイルがあります。

ところがアクセスしたところ表示されない。。。

どうやら<code>config/index.js</code>を以下のように書き換える必要があるとのこと。
<div>
<pre>// assetsPublicPath: '/',
assetsPublicPath: '',</pre>
</div>
あとはdistフォルダをじぶんの好きな名前(URLに反映される)に変えてFTPでアップロード。

僕の場合はXserver(WordPressに利用しているドメイン)を使っているのでpublic_htmlにhomeというフォルダ名でアップロードしました。

<img class="alignnone size-full wp-image-716" src="https://chobimusic.com/wp-content/uploads/2020/03/home.jpg" alt="" width="565" height="470" />

(ドメイン名)/home(アップロードしたフォルダ名)でアクセス。

<img class="alignnone wp-image-717" src="https://chobimusic.com/wp-content/uploads/2020/03/up-1024x211.jpg" alt="" width="782" height="161" />

無事表示されました◎
<h3>参考サイト</h3>
<a href="https://qiita.com/tiwu_official/items/43dc554ec43dd951812a">vue-cliでwebアプリケーションを作って、GitHubPagesで無料で爆速でリリースした話</a>
RubyエンジニアがArduinoで電子工作やってみた~超音波距離センサ編~

# はじめに
皆様、こんにちは！
Toretaのサーバサイドエンジニア兼佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです！
最近、ひょろんなことから電子工作を始めたので、作成したものを整理・紹介したく、記事を書きました。

「今更、IoTかよ…」や「ショボすぎ…」とまさかりを投げないで頂けると嬉しいです。___(; _ _)ﾉ`
逆に、もっとこうした方が良いよ！というコメントは大歓迎です。

# 自己紹介
- [株式会社トレタ](https://corp.toreta.in/)のサーバサイドエンジニア。
- 普段はRuby on Railsでプログラミングしている。
- 電子工作は初めて。(はんだ付けの経験もなし。)

# 機器選定
電子工作の取っ掛かりは大きく[Arduino](https://www.arduino.cc/)か[Raspberry Pi](https://www.raspberrypi.org/)の2つありますが、2つとも小さなコンピュータという意味では同じです。

## Arduinoの特徴
- 元々のコンセプトは安い小型マイコン。
- OSを持たない。
- Arduino IDEという専用の統合開発環境があり、利用言語はProcessing固定。
- Arduino専用のセンサが多数存在し、利用言語もProcessingのみなのでサンプルコードも豊富。
- デバイスがオープンソースであるため、ハードウェア設計がCreative Commonsで公開されている。そのため、互換機が豊富にある。
- OSを持たないマイコンのため、処理できるタスクは一度に一つ。

⇒複雑な処理を行うのに向いていないが、サンプルコードが豊富で対応センサが多く初心者向け

## Raspberry Piの特徴
- 元々のコンセプトは教育用コンピュータ。
- OSはLinuxベースのRasbianなど。
- 利用言語に制限なし。(C・PythonやmRubyなどが主。)
- 対応するセンサは多数存在するが、利用言語に制限がないため、サンプルコードがあるかは言語によってまちまち。
- 非OSSであり、互換機は多くない。(安価なOrange Pi Oneや産業用のREVOLUTION PIなど)
- LinuxOSがあるため、複数のタスクを同時にこなせる。そのため、複雑な処理に向いている。

⇒複雑な処理を行うのに向いている、中級者以上向け。

今回は初めての電子工作なので、初心者向けのArduinoを選択しました！

# Processingとは
Arduino向けのプログラムを作成する言語は[Processing](https://github.com/processing/processing)という言語に限定されます。

### 言語の由来
- 言語の設計思想はプログラミングによる視覚的な表現(イメージの生成やアニメーション・インタラクティブな画面表現)の技法を優しくするために生まれた。
- 2001年に誕生したため、2020年現在では19歳。
- Javaに似た言語なので、コンパイルや静的型付けを持つ。

### 言語の特徴
- OSS( https://github.com/processing/processing )
- 言語の設計思想から非プログラマ(アーティストやデザイナ)での扱いやすく出来ている。
- 視覚的な表現に強いので、近年だと統計解析のモデリングに使われることもある。
- 主な使い所は、プログラミング教育の一歩目教材やアニメーション・デザイン系の会社で使用。
- JavaScriptに移植された[Processing.js](http://processingjs.org/)を用いれば、デスクトップ・タブレット・モバイルと端末の種類を問わずにブラウザで動作させる事ができる。

# Arduinoを購入
早速、AmazonでArduino UNO(の互換機)を購入しました！
互換機と言っても純正品のArduinoと出来ることは同じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105636/e9556ae5-4703-db07-93c2-9813ec14c26c.png)

# 作ったもの
## 実物
[超音波距離センサ](http://akizukidenshi.com/catalog/g/gM-11009/)とアクティブブザー・黄色LEDを組み合わせて、超音波距離センサから10cm以内にモノがないとブザーがなり、黄色信号が灯るという装置を作りました。
使い道としては、ドアや冷蔵庫の扉などの開けっ放し防止に使えるかなと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105636/a147b3a0-6e02-c359-3d82-82bfbce4cab6.png)

## ソースコード
```processing
const int TrigPin = 2;
const int EchoPin = 3;
float cm;
int buzzer = 5;
int led = 6;

void setup(){
  Serial.begin(9600);
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(led, OUTPUT);
}

void loop(){
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);

  cm = pulseIn(EchoPin, HIGH) / 58.0;
  cm = (int(cm * 100.0)) / 100.0;

  Serial.print("Distance\t=\t");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  delay(1000);

  if(cm > 10){
    digitalWrite(buzzer,HIGH);
    digitalWrite(led,HIGH);
  } else{
    digitalWrite(buzzer,LOW);
    digitalWrite(led,LOW);
  }
  
}
```

## 超音波距離センサの弱点
超音波距離センサは超音波の反射を受けて距離判定を行うため、衣類や人体といった反射しにくいもの距離はあまり正確には測定出来ません。。。
但し、表面がつるつるしているモノ(箱や扉など)は非常に正確な距離を算出することができます。

# 終わりに
より様々なセンサを使用して、実生活で使用できるハードウェアを作成したいです！
次回は水位センサの使用記事を書こうと思います。
Pythonで多変量正規分布を使わずに楕円っぽい散布図を作る

#はじめに
　機械学習のサイトでは点を楕円形にプロットした図をよく見かけます。その作り方が分からなかったので、Numpyをいじって作ってみました。

#コード

```python:ellipseLike.py
import numpy as np
import matplotlib.pyplot as plt

#出力件数
n = 1000

#乱数を発生
x = np.random.uniform(-4, 4, n)
y = np.random.uniform(-1, 1, n)

#フィルタリング
coordinates = np.array([((x[i])**2 + (y[i])**2)**(1/2) < 1 for i in range(n)])
index = np.where(coordinates==True)

#座標を操作
x_points = x[index] *4
y_points = y[index]

#座標を回転移動(30度)
x_points2 = x_points * (3**(1/2)) - y_points * (1/2)
y_points2 = x_points * (1/2) + y_points * (3**(1/2))

#プロット
plt.scatter(x_points2, y_points2)
plt.show()
```

#結果
![ellipse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/763dd177-9563-e834-d195-e8b7f44be008.png)


#おわりに
　作り終わってから多変量正規分布を知りました。勉強不足でした...

　ご覧いただきありがとうございました。コメント・ご指摘等ありましたらよろしくお願いいたします。
yukicoder contest 241 参戦記

# yukicoder contest 241 参戦記

## [A 1009 面積の求め方](https://yukicoder.me/problems/no/1009)

8分半で突破. ヒント通り区分求積法でスパッと解いてみた. 区間をどれくらいの数で割ればいいのかに悩んだが、適当にえいやで4096でやったら一発目で良さげな精度が出たので、提出してみたら無事 AC.

```python
a, b = map(int, input().split())

x = a
result = 0
t = 1 / 4096
while x < b:
    result += abs((x - a) * (x - b) * t)
    x += t
print(result)
```

## [B 1010 折って重ねて](https://yukicoder.me/problems/no/1010)

41分で突破. 整数で処理するコードを書いて、なんで AC しないんだと延々と悩んでいた. アホすぎる. 縦と横で短い方を限界まで折ってから、長い方を限界まで折ればいい.

```python
x, y, h = map(int, input().split())

if x < y:
    x, y = y, x

x *= 1000
y *= 1000

result = 0

while y > h:
    y /= 2
    h *= 2
    result += 1

while x > h:
    x /= 2
    h *= 2
    result += 1

print(result)
```

整数で処理することもできる. 相対的に数字が正しく変わればいいのだ.

```python
x, y, h = map(int, input().split())

if x < y:
    x, y = y, x

x *= 1000
y *= 1000

result = 0

while y > h:
    x *= 2
    h *= 4
    result += 1

while x > h:
    y *= 2
    h *= 4
    result += 1

print(result)
```

## [C 1011 Infinite Stairs](https://yukicoder.me/problems/no/1011)

敗退. 素直に DP すると *O*(*N*<sup>2</sup>d) なので TLE する. よくよく考えると、i 段目にたどり着くのは i-d .. i-1 段目、i + 1 段目にたどり着くのは i - d + 1 .. i と端の2箇所以外は同じである. であれば、*O*(*d*) ではなく *O*(1) で処理できるので *O*(*N*<sup>2</sup>) になり解けた.

```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	N := readInt()
	d := readInt()
	K := readInt()

	buf0 := make([]int, d*N+K+1)
	buf1 := make([]int, d*N+K+1)
	buf0[0] = 1
	for i := 0; i < N; i++ {
		t := 0
		for j := 0; j < d; j++ {
			t += buf0[j]
			t %= 1000000007
			buf1[j] = t
		}
		for j := d; j < (i+1)*d; j++ {
			t -= buf0[j-d]
			if t < 0 {
				t += 1000000007
			}
			t += buf0[j]
			t %= 1000000007
			buf1[j] = t
		}
		buf0, buf1 = buf1, buf0
	}
	fmt.Println(buf0[K-N])
}

const (
	ioBufferSize = 1 * 1024 * 1024 // 1 MB
)

var stdinScanner = func() *bufio.Scanner {
	result := bufio.NewScanner(os.Stdin)
	result.Buffer(make([]byte, ioBufferSize), ioBufferSize)
	result.Split(bufio.ScanWords)
	return result
}()

func readString() string {
	stdinScanner.Scan()
	return stdinScanner.Text()
}

func readInt() int {
	result, err := strconv.Atoi(readString())
	if err != nil {
		panic(err)
	}
	return result
}
```

```python
# PyPy なら AC
N, d, K = map(int, input().split())

buf0 = [0] * (d * N + K + 1)
buf1 = [0] * (d * N + K + 1)
buf0[0] = 1

for i in range(N):
    t = 0
    for j in range(d):
        t += buf0[j]
        t %= 1000000007
        buf1[j] = t
    for j in range(d, (i + 1) * d):
        t -= buf0[j - d]
        t += buf0[j]
        t %= 1000000007
        buf1[j] = t
    buf0, buf1 = buf1, buf0

print(buf0[K - N])
```
javascript int変換/キャスト/切り上げ/切り捨て/四捨五入-注意点

# はじめに
あれ？javascriptにキャスト演算子てなかったけ？四捨五入てどうやってやるんや？てなった人向けの備忘録てきな記事です。intに変換する際の注意点、例もあわせてどうぞ！

#parseInt($hoge, 10)
これがほかの言語でいう `(int)`的なキャストのメソッドですね。
実数値を持つ変数`$hoge`に対して`parseInt($hoge, 10)`のように使います。
ここで第2引数は第1引数の基数(10進数や2進数の10や2のこと)で省略可能ですがデフォルトが10ではなく入力値によって勝手にその基数は判断されるので第2引数まで与えるのが無難です。

```javascript:parseInt()
parseInt(2.5, 10)
parseInt(2.5)
parseInt("2.5")
parseInt(10, 2)

parseInt(-2.5)
```
上の例では最初の4つがすべて2を返し、最後の1つは-2を返します。

#Number($hoge)
はい、これが僕がずっと勘違いしていたものでこれがいわゆる`(int)`的なキャストをする関数だと思ってました。javascriptにはこういうキャスト演算子はないんだーってなって一番名前的に近そうなこれがintへのキャストだと皆さん勘違いすると思います。僕だけですかね。はい全く違いました。結論から言えばこれは**Stringなどの方から数値(小数含む)型への型変換のメソッド**でした。

~~これはそもそも関数ではなく**`Number`オブジェクトを生成するコンストラクタ**で、このコンストラクタの引数に値を与えることでその値が`Number`オブジェクトになります。基本的にjavascriptではこの`Number`型で算術演算を行うためこのコンストラクタが結局キャストのようになるわけです。~~

これはNumberプリミティブ値(String, boolなどのメソッドを持たない基本のデータ型)を生成する関数でした。従ってこの関数は**文字列などから数値への変換**を行う型変換の関数でした。単純に`Number`オブジェクトを生成したい場合はnew Number($hoge)で初期化する必要がありますね。また上で記した`parseInt()`もこの`Number`オブジェクトのメソッドです。

以下に例を示します。

```javascript:Number()
Number('123')     // 123
Number('12.3')    // 12.3
Number('123e-1')  // 12.3
Number('')        // 0
Number(null)      // 0
Number('0x11')    // 17
Number('foo')     // NaN
```

また `+` 演算子でも `number` への変換が簡単に行えるようです。


```javascript:+
+'123'     // 123
+'12.3'    // 12.3
+'123e-1'  // 12.3
+''        // 0
+null      // 0
+'0x11'    // 17
+'foo'     // NaN
```






#Math.floor($hoge)
与えられた数値の**切り捨て**(与えられた数値と等しい整数、もしくは与えられた数値より小さい最大の整数を返す)を行う関数です。

これも注意が必要で、一瞬、`parseInt($hoge)=Math.floor($hoge)`と思いませんか？ぼくは思いました。
でも違いますね。上のparseInt()の例と下の例を見比べて貰えばわかりますが、細かい精度の違いは置いておくと

`parseInt($hoge) = $hoge >= 0 ? Math.floor($hoge) : Math.ceil($hoge)`

となるわけです。Math.floor()などの関数を使う場合は与えられた数値が負の場合もしっかり考慮して関数を選ぶ必要がありますね。
ちなみに正確にMath.floor()はparseInt()に比べて引数にStringをとらない、parseInt()は**とても大きい引数や小さい引数にたして予期しない結果を生む可能性があるのでMath.floorの代替としてはつかうべきでない**、などの違いがあります。

```javascript:Math.floor()
Math.floor( 2.5); //  2
Math.floor(-2.5); // -3
```

#Math.ceil($hoge)
与えられた数値の**切り上げ**(与えられた数値と等しい整数、もしくは与えられた数値より大きい最小の整数を返す)の関数です。
これについての注意点などはMath.floorと同様なので割愛。

```javascript:Math.ceil()
Math.ceil(.95);    // 1
Math.ceil(4);      // 4
Math.ceil(7.004);  // 8
Math.ceil(-0.95);  // -0
```

#Math.round($hoge)
皆さんお待ちかね、**四捨五入**の関数ですね。

```javascript:Math.round()
Math.round( 20.49); //  20
Math.round( 20.5 ); //  21
Math.round( 42   ); //  42
Math.round(-20.5 ); // -20
```

#おわりに
以上業務システムの開発を行っている際によく用いる数値計算の関数などでした。
金銭の計算など値の誤差が許されない状況でこれらの関数の使い分けは非常に重要になってきます。
日頃からそれぞれの関数のポイントを頭に入れて実装をしておくと良いですね！
GitHubの草をMacのメニューバーやiOSのウィジェットで確認できるアプリをリリースした際の審査のやりとり

# はじめに

GitHubの草（コントリビューション）を簡易的に確認できるようにするために，MacのメニューバーやiOSのウィジェットで確認できるアプリを作りました（それぞれに関する記事は下にリンクを貼っておきます）．これらはどちらもオープンソースとしてGitHubリポジトリを公開してあり，現在App Storeからも無料でダウンロードが可能となっていますので興味がある方はダウンロードしてみてください．

今回はこれらのアプリをApp Storeに配信するにあたって審査で少し面倒ごとがあったのでそれに関してまとめます．

# macOS版 GitGrass

mac版はメニューバーに常駐するタイプのアプリとなっており，ユーザが指定した間隔にて最新のコントリビューションを取得して草をレンダリングし直すものとなっています．

## リジェクト 2.1 App Completeness

これはパフォーマンスに関するリジェクトで，単にわかりやすいバグがあったのでダメというやつです．下に書いてあるMinimum Functionalityを恐れていたのですが肩透かしを食らいました．内容としては，ユーザ名が入力されていない状態の初回起動時にエラーのアラートが出るのはおかしいのでは？という指摘でした．もっともです．ユーザ名を入力できている状態でデバッグを続けていたのが敗因ですね．

# iOS版 GitGrass

iOS版は環境設定用の母機アプリとToday Extensionのセットとなっており，基本的にはTodayウィジェットをユーザが表示するたびに最新のコントリビューション情報を取得して草をレンダリングし直すものとなっています．

## リジェクト 4.2 Minimum Functionality

開発者が恐れおののくリジェクト理由，Minimum Functionalityが出ました．そりゃTodayウィジェットに草を生やすだけのアプリなのですから，機能がミニマムに決まっていますが，そんなんじゃApp Storeには並べてくれないようです．

審査員にアプリのアイデアが嫌われていない限り，機能を増やせばなんとかなるかもしれないと思い，今回は草の色と模様を変更できる仕様にしたところ審査が進みました．

![スクリーンショット 2020-03-28 22.49.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/03a8588a-6b0f-1f8f-6ae6-85b69403ac7c.png)

## リジェクト 2.1 Information Needed

「審査を円滑にするために情報が足りません」とのことで以下を追加で求められました．

> -What is the purpose of the app?
-Who is the target audience?
-What are the main features of the app?
-Does the app content change daily?
-Is this an existing service? If yes, where is it available?

アプリの目的やターゲットユーザは何であるかを説明してくれとのことです．アプリ概要欄の説明不十分さが原因のようです．これは，問題解決センターにて回答を返信するだけで審査を引き続き進めてくれました．

## リジェクト 5.2.5 Intellectual Property

「Apple純正アイコンなどを使用するな」とのことですが，今回はiPad版のAppプレビューとして添付していた画像の背景やDockにアプリのアイコンが入っていたことがダメだったみたいです．背景のブラーを少し濃くしてなるべくアイコンが写り込まないようにした結果審査通りました．（ちなみに，macOS版の方はメニューバーにApple純正のアプリのアイコンが並んでいてもリジェクトされませんでした．）

![jp_today.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/accbf5bd-07a8-17be-a3ee-208d6a1ce613.png)

#  所感

macOSアプリの審査とiOSアプリの審査を比べると，iOSの方が厳しいような感じがします．macOSアプリはそもそも数が少ないので，若干機能が弱くてもOKということでしょうかね．

# 関連記事

- [GitHubの草をMacのメニューバーで確認できるようにしてみた
GitHub](https://qiita.com/Kyome/items/39fcd379e3ee98eb0d3c)
- [GitHubの草をiPhoneの通知センターでも確認できるようにしてみた](https://qiita.com/Kyome/items/b70321842b2940c449c3)
- [デベロッパーが最も怖れる最恐のリジェクト「4.2 Minimum Functionality」とは](https://kanasys.com/tech/669)
VFX Graph ホログラム

覚えるためのメモです。
demoを見て学んだことを忘れないように書くだけなのでほんとにメモです。

https://media.giphy.com/media/Q7FbEVMiRW935UqrTn/giphy.gif

##　カメラからレンダーテクスチャを出力する
まず最初にホログラムを移すためレンダーテクスチャを　アセット　＞　作成　＞　レンダーテクスチャ　から作成し任意に名前を付けます。
そして次に　カメラを作成します。　そして出力に先ほど作成したレンダーテクスチャを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433236/9ea6894f-a6e7-2a9a-d139-5d93b395c470.png)

あとはそのカメラでホログラムにしたいものを移してあげればいいです。特定のものだけ移したりしたい場合はレイヤーを作ってカメラのカリングマスクで指定してあげればいいと思います。
試していないのですがここでシネマシーンを使ってみたら面白そう。

##　VFX 中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433236/6911d12f-ceb8-c14f-f600-46acec2ccdce.png)

ほぼなんもいじってないのですごくシンプル。
ただカメラのレンダーテクスチャを受け取ってpositionにしているだけであとはちょっと設定を変えただけです。
個々の設定は自身の作りたいものに合わせて変えていく。

## VFX Binder
ここで先ほど作ったカメラのプロパティに実際のカメラをバインドしていきます。
まずゲームオブジェクトにスクリプトを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433236/ff6e1d8f-5961-8828-0afd-4a0d175553b9.png)

追加するときに見つけにくかったので　検索で　VFX　と調べるとすぐ出てきて楽だった。

あとはリストの＋を押して　HDRP　＞　HDRPカメラを追加します。
その後追加したものをクリックすると詳細が開くのでそこでカメラを指定してあげます。

そしたら完成です。
AtCoder ABC150 D - Line++

https://atcoder.jp/contests/abc160/tasks/abc160_d

# 概要
- $N$個のノードがあり、線形につながっている
- ある$a$と$b$が1か所のみ接続されている(以下、これを使うことをワープと呼ぶ)
- $k = 1...n-1$について、ノード間の最短距離が$k$であるようなものの数を出力せよ

# こう考えた
すべてのノードのペア$i,j$について事前に距離を計算する。この際の距離は以下の図のように考える。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/0e7f73d6-7202-7b7f-4b76-64c9062a8dd7.png" width=50%>

- あるペア$i,j$に対してすべて以下の2つのminが最短距離である。
- ワープを使わない場合、距離は$j-i$である。
- ワープを使う場合、距離はワープの入り口までの距離$a-i$とワープの出口からの距離$b-j$のそれぞれの絶対値とワープのコスト1の和である。(尚、ワープの入り口は出口より左にあることは制約より保証されている)

、これをカウントして最後に出力すればよい。

# コード
```Python
n, l, r = map(int, input().split())
l -= 1 # 0 origin
r -= 1 # 0 origin
dist = [0] * 10000000
for a in range(n):
    for b in range(a+1, n):
        c = 9999999999
        c = min(c, b - a)
        c = min(c, abs( abs(l - a) + abs(r - b) ) + 1 )
        dist[c] += 1
for k in range(1, n):
    print(dist[k])
```
https://atcoder.jp/contests/abc160/submissions/11295938
【DB】CONVERT_TZ 関数

引数に指定した日時を表す値を別のタイムゾーンに変更した値を取得します。

#CONVERT_TZ 関数の使用方法

```
CONVERT_TZ(dt,from_tz,to_tz)
```
上記コマンドでは引数に対象となる日時（`dt`）の現在のタイムゾーン（`from_tz`）から別のタイムゾーン（`to_tz`）に変更した場合の日時取得を行なっています。

タイムゾーンは`名前付きタイムゾーン`や`UTC（協定世界時）との差`などで指定することができます。

```
#名前付きタイムゾーン
Asia/Tokyo
America/New_York

#UTC（協定世界時）
+09:00
-05:00 
```
##動かしてみる
`select convert_tz('2019-05-14 08:35:14', 'Asia/Tokyo', 'America/New_York');`
実際にこのようなコマンドを打っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/04727df5-ce81-ba81-1a0f-00818bbb4a45.png)
上記のような結果になりました。

`select convert_tz('2019-05-14 08:35:14', '+00:00','+09:00');`
またこのような別のコマンドを打っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/feea12e4-8360-9196-1ff1-130aa403094c.png)

上記の結果のように引数である日時のタイムゾーンを変更した日時を取得することができます。
javaでAtCoder Beginner Contest 160を解く

AtCoder Beginner Contest 160お疲れ様でした！
[公式ページ](https://atcoder.jp/contests/abc160)

今回の自分の書いたコードは[こちら](https://github.com/ko-flavor/atcoder-java/tree/master/atcoder/src/abc/abc160)
結果はA-EまでACできました。久しぶりの5問ACでテンション上がります^^

以下簡単に解説します。

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

引数にStringで6文字のものが渡されてくるので、
`String.charAt()`
で指定文字のcharacterを取り出して、比較すればOKです。

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

金額が与えられて、それを適切に500円硬貨と5円硬貨に両替する問題です。
答えの出力が「嬉しさ」になっていて、500円硬貨をもっていると1000の嬉しさが手に入るので、与えられた金額を2倍しないように注意。
また、5円硬貨についても5の嬉しさが入るからといって、単に余った金額を足せばよいってもんではないので注意です。

```java
long happy = (x / 500) * 1000;
x = x % 500;
happy = happy + (x / 5) * 5;
```

みたいな感じでACできました。

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

池の周りに家が建っていて、とある地点からの距離が与えられます。
全ての家をまわるのに最小の距離を求める問題です。

今回の家は池の周りに建っているので、実際に通る経路としては視力検査のアイツのような形になるはずです。
円を少し切り取ったような形。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/3f6e5c89-f681-4b24-b33d-3b74b41dde79.png" width=20%>
なので、家と家の間が一番遠い距離を求めることができれば、池の外周からその距離を引くことで最小距離が算出できます。

基本的には前の家の距離を覚えておいて、入力のたびに計算でOKです。
最初の家と最後の家も隣り合っているので、忘れずに比較しましょう。

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

N個の頂点を持つ無向グラフで、距離がkのものはいくつあるかを出力する問題です。
無向グラフとか難しい言葉でてきてびびりますが、今回のグラフは単純です。

せいぜい直接向かうか、X-Yの間の道を通るかの2通りしかありません。

TLE起こしそうだなぁ・・・と思っても、以下を見て安心します。

```math
3 ≤ N ≤ 2 × 10^3
```

コードで表現すると以下のようになります。
二重forループで、直接行くのとX-Yの間通るのとどちらが近いかを計算して、答えの配列に追加しています。

```java
for (int i = 1; i <= n; i++) {
	for (int j = i; j <= n; j++) {
		int direct = j - i;
		int shortCut = dist(i, x) + 1 + dist(j, y);
		int dist = Math.min(direct, shortCut);
		answer[dist]++;
	}
}
```

distっていうメソッド以下のような感じです。

```java
public static int dist(int p, int q) {
	return Math.max(q - p, p - q);
}
```

##[問題E](https://atcoder.jp/contests/abc160/tasks/abc160_e)

X個の赤いリンゴとY個の緑色のリンゴを食べます。
赤いリンゴのおいしさと緑色のリンゴのおいしさを与えられて、おいしさが最大になるように食べます。
無色のリンゴもあり、こいつは着色できます。

自分は以下のようなアルゴリズムで解きました。

 - 赤いリンゴと緑色のリンゴをおいしい順に並べる
 - 赤いリンゴをおいしい順にX個、緑色のリンゴをおいしい順にY個取得して配列APPLEに加える
 - 配列APPLEに無色のリンゴを全て加える
 - 配列APPLEをおいしい順に並べる
 - 配列APPLEからX+Y個所得して足し算していく

で、無事ACできました。
無色のリンゴも配列APPLEに足す発想ができたのが勝因ですかね、、よかったぁ。

個人的にはE問題の中では難易度は低めかな・・・？

##[問題F](https://atcoder.jp/contests/abc160/tasks/abc160_f)

5分考えて、無理だなってなったので残りの20分はぼーっとしていました笑

----

### 感想

久しぶりの水パフォ(1411)出せまして、
レーティングは936→1003と初めての1000突破です！！:blush:

E問題がちょっと簡単めなのもありましたが、なんとか解けてよかった・・・
A-EのACにはこだわりをもって安定させていきたい。これできてればそのうち水ネームなれるはず！:raised_hands:


最後まで読んでくださり、ありがとうございます！
UbuntuのPythonでSplunkの実行結果を受け取る

今回はUbuntu18.04のPython3.6.9から、Splunkのクエリを実行して結果をJSONで受け取るプログラムを作ります。なおFree版では動作しませんので、ご了承ください。

#原理

SplunkにはGUIだけでなく、外部からのクエリを受け取り実行する機能があるので、この機能を利用します。この機能の利用方法は簡単で、下のURLにユーザ名、パスワード、クエリ（SPL）、出力形式を入れてPOSTするだけです。

```
https://localhost:8089/services/search/jobs/export
```

#プログラムの作成

下のようなプログラムをPython3で作成しました。

```python:splunkpost.py
import requests
import urllib

requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)
postdata = urllib.parse.urlencode({"search":"search host=sample.csv earliest=01/01/2020:00:00:00","output_mode":"json"})
response = requests.post("https://localhost:8089/services/search/jobs/export",auth=("username","password"),data=postdata,verify=False)
print(response.text)
```

4行目は、POSTを実行した時に出力されるWarningを消すために書かれています。
5行目はPOSTするデータ（URLエンコード）を作成しています。`search`にはクエリが入っており、`output`には出力形式が書かれています。**クエリは`search`を省略できません**ので気をつけてください。また、検索期間を指定したい時は`earliest`や`latest`で範囲を記載する必要があります。
6行目の`auth`にSplunkのユーザ名（例では`username`）とパスワード（例では`password`）を入れてPOSTを実行しています。

#プログラムの実行

今回のクエリで出力されるデータを下に記載します。

```:/dummy/sample.csv
"time","number","value"
"2020/01/01 12:00:00","1","a"
"2020/01/01 12:00:00","2","b"
"2020/01/01 12:00:00","3","c"
```
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/68fe44a9-761b-813a-b2ed-c44e61ec86ee.png)
それでは、プログラム`splunkpost.py`を実行します。

```
# python3 splunkpost.py
{"preview":false,"offset":0,"result":{"_bkt":"main~0~38327377-7FDC-4E8B-B00E-61AA849FBF3E","_cd":"0:15","_indextime":"1585398968","_raw":"\"2020/01/01 12:00:00\",\"3\",\"c\"","_serial":"0","_si":["dummy","main"],"_sourcetype":"csv","_time":"2020-01-01 12:00:00.000 JST","host":"sample.csv","index":"main","linecount":"1","source":"/dummy/sample.csv","sourcetype":"csv","splunk_server":"dummy"}}
{"preview":false,"offset":1,"result":{"_bkt":"main~0~38327377-7FDC-4E8B-B00E-61AA849FBF3E","_cd":"0:12","_indextime":"1585398968","_raw":"\"2020/01/01 12:00:00\",\"2\",\"b\"","_serial":"1","_si":["dummy","main"],"_sourcetype":"csv","_time":"2020-01-01 12:00:00.000 JST","host":"sample.csv","index":"main","linecount":"1","source":"/dummy/sample.csv","sourcetype":"csv","splunk_server":"dummy"}}
{"preview":false,"offset":2,"lastrow":true,"result":{"_bkt":"main~0~38327377-7FDC-4E8B-B00E-61AA849FBF3E","_cd":"0:9","_indextime":"1585398968","_raw":"\"2020/01/01 12:00:00\",\"1\",\"a\"","_serial":"2","_si":["dummy","main"],"_sourcetype":"csv","_time":"2020-01-01 12:00:00.000 JST","host":"sample.csv","index":"main","linecount":"1","source":"/dummy/sample.csv","sourcetype":"csv","splunk_server":"dummy"}}
```

JSON形式で結果を受け取ったので、このような出力になりました。

#おわりに

結構簡単にSplunkからクエリの結果を受け取ることができました。Splunkが更に便利になりましたね。

---

動作環境
Ubuntu 18.04.4 LTS
Splunk 8.0.2.1
Python3.6.9
ガチ初心者がAtcoder Beginner Contest160に参加して悩んだ記録。プログラミング学習記録２日目

昨日からいろいろ勉強しはじめたおじさんがatcoderに参加です。

良かった点
・なんかでかいイベントを待ってる感じが良かった。
・紙で整理したりグーグルなどで調べてソースコードに触れれた。
　（グーグルいいのか？）

反省点
・C++がまだHello Worldぐらいのレベルなのに無茶しすぎた
・ネットのコードをいじっただけじゃ仕様を満足する物がつくれなかった。
・時間内で飽きた。

<h2>問題1</h2>
ある長さ 
英小文字からなる文字列がcoffeeに似ているとは、
3文字目と4文字目が等しく、
5文字目と 6文字目も等しいことを言います。
与えられる文字列 
Sがcoffeeに似ているか判定してください。

初心者があたま抱えながら書いたコード
（見る人いないと思いますが間違いだらけです）

```ruby:qiita.rb
#include<string>
#include<iostream>
using namespace std;

int main()
{    
   std::string str1 = "coffee";
   std::string str2 = "coffee";
  
   int result = str1.compare(3,4,str2,3,4);
  
  std::cout << "compare result：" << result << std::endl;
   return 0;
}
```
ううーん、文字列の比較するところまでは行けたっぽい。
特定の文字の比べ方や判定の方法などよくわからない。

<h2>問題２</h2>
高橋君が500円硬貨 1枚につき 1000、5円硬貨 1枚につき 5の嬉しさを得ます。
X円を持っています。これを高橋君の嬉しさが最大になるように両替したとき、
高橋君の嬉しさはいくらになりますか？

```ruby:qiita.rb
/*
数学的には理解できた。
X/500 = A...B
A*1000 = C
B/5 = D...E　 おつりEは切り捨て
D*1 = F
G = C+F
*/

#include <iostream.h>

int main()
{
    cout << "X/500 = " << X / 500 << endl; =A
    cout << "A*1000 = " << A*1000 << endl; =C
    cout << "B/5 = " << B/5 << endl; =D...E　/* おつりEは切り捨て */
    cout << "D*1 = " << D*1 << endl; =F
    cout << "G = " << C+F << endl;
    return 0;
}
```
わかってほしい。それなりにがんばってみた。算数の式は立てれたんだ。
中学のテストとかだと、考え方はあってるとかで5点ぐらいはくれそうですが。
プログラマー、厳しい世界だぜ。

あとはドットインストールのはじめてのHTMLをやった。
環境作り、ポートフォリオサイト作成。
![スクリーンショット 2020-03-28 23.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609807/fa19f009-3940-306c-2182-e6ab0cc6d285.png)

それっぽく出来てるからすごい。
PythonでABC160を解きたかった

### はじめに
A,Bしか解けませんでした。簡単だったのに。

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

**考えたこと**
index指定してif

```python
s = str(input())
if s[2] == s[3]:
    if s[4] == s[5]:
        print('Yes')
        quit()
print('No')
```

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

**考えたこと**
500でXを割れるだけ割って余りを5で同様にしています。

```python
x = int(input())
a = x // 500
b = (x % 500) // 5
ans = (1000*a+5*b)
print(ans)
```
### C問題
[問題](https://atcoder.jp/contests/abc160/tasks/abc160_c)

**考えたこと**
K - Aの隣の要素の差が最小になるような距離を取ればいいはず。これに気付くのに1時間以上かかりましたし、十分に時間あったのに実装できませんでした。

### まとめ
色々とおつかれ様でした。疲れている時に無理してコンテストは参加しないほうがいいです。
おやすみなさい。
Github上のメンションをSlackメンションに変換するGithub Actionsを作った

これです。

https://github.com/marketplace/actions/github-mention-to-slack

使い方などはREADMEなどをご参照ください。

## できること

基本的には[Pull Reminder](https://pullreminders.com/)の下位互換的な機能を提供しています

- github上のissue, pull requestなどでメンションされた場合にslackに通知する
- pull requestのレビューリクエストを受けた場合にslackに通知する


## Pull Reminderを使いたいけど使えない人へ

Pull Reminderを既に使っている方にとっては、このActionsは基本的には不要だと思います。

https://pullreminders.com/

Pull Reminderは非常に便利で私も愛用しているのですが、現在は新規アカウント発行を停止しており、これから新しく使おうと思っても使えない状態になっています。

https://pullpanda.com/github

> **Can new users and organizations still sign up?**
> Pull Panda is no longer accepting new sign ups.

Pull PandaはGithubに買収されており、今後はGithubの標準機能として組み込まれていくようです。
しかし、その機能がリリースされるまでの間はPull Reminderが使えないという状態になっています。

これは「今！おれは！Pull Reminderみたいなやつを使いたいんだ！」という人のためのActionです。


## Pull Reminderに比べて良い点

- admin権限が不要
    - pull reminderは連携アプリとして提供されているため、slack, githubそれぞれのadmin権限が必要になります
    - github-actionsならリポジトリへのpush権限さえあれば良いので、いち開発者でも導入しやすいです
- 通知を強制できる (悪い点でもあります...)
    - pull reminderは各個人がgithub連携することで通知が飛ぶようになります(たぶん)
    - このactionsではymlにアカウント情報を書けば通知が飛びます

## 工夫ポイント

- javascriptを使って早く処理完了するように
    - github actionsは **Docker Image** or **javascript** として提供する必要があります
    - Dockerだとactionsの起動に時間がかかってしまう傾向があります
    - このactionsはissueコメント, pull requestコメントなどの度に起動するので起動回数が多そう
    - 課金ポイントでもあるので、極力早く完了したい :money_with_wings: 

## 感想

github公式からPull Reminder機能がリリースされるのが待ち遠しいですね！ :octocat: 
それまではこういった自作のツールなどで凌ぐことになりそうです。

過去に似たようなものをAWS lambdaとかGoogle Apps Script上で作ってたりしましたが、github-actionsとして作ると他の方にも提供しやすく、とても相性良いなと思いました。

機能的にはもっとやれることもあると思うので、このActionsを使ってみて要望があればissue, pull requestなどを送って頂ければと思います！
Pythonで毎日AtCoder #19

### はじめに
[前回](https://qiita.com/taxfree_python/items/094f96e9348ab8d80148)
ABC160ができなくてつらかったので諦めてこっち書きます。
疲れているのでとっても雑に書きます。すみません
### #19
[問題](https://atcoder.jp/contests/abc136/tasks/abc136_c)

**考えたこと**
h[i]とh[i-1]の関係を比較したときに単調非減少になるにはh[i]の方が大きいか同じでなければならない。今回はマスの高さを-1することができるのでもし-1した場合にはcheckerの真偽を変更して対応している

```python
n = int(input())
h = list(map(int,input().split()))

seed = h[0]
checker = True

for i in range(1,n):
    if h[i] == h[i-1]:
        continue
    d = h[i] - h[i-1] + 1
    if d > 0:
        checker = True
        pass
    elif d == 0:
        if checker:
            checker = False
        else:
            print('No')
            quit()
    else:
        print('No')
        quit()


print('Yes')
```

### まとめ
疲れているときと眠いときは絶対にコンテストにでるな!!。では、また
Cookieとブラウザとプライバシーのこれから

ブラウザ上で取り扱う情報の倫理性を問う動きが最近世界的に見受けられており、個人的に今後の動き等を考察してみたので記すことにしました。

※当記事で紹介する内容は決して実施の助長を行う目的で表しているものではありません

## Cookie

ブラウザ上でのCookieの取り扱いと言えば、

- Safari
    - ITP
- Google Chrome
    - Same-Site Cookie
- Firefox
    - ETP

をまず第一に思い浮かぶ。

上記は目まぐるしく仕様が制限されつつあるが、
比較的最新の動き方は[リンク先](https://speakerdeck.com/yosuke_furukawa/zui-xin-falseburauzadebian-warucookiefalsequ-rixi-iyaprivacyfalsekao-efang)で確認出来る。

そして、つい先日のiOSとMacOSのアップデートによって[最新のITP仕様](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/)が実装された。

これは、

- 完全な3rd Party Cookieの排除
- JavaScriptよりアクセス可能なストレージの保持期間は最大7日間

というものであり、
JavaScriptよりアクセス可能なストレージとして、

- Indexed DB
- LocalStorage
- Media keys
- SessionStorage
- Service Worker registrations

が記されている。

### 影響

当該項目の実施により、例として下記のような環境下において影響を及す。

- 3rd Party Cookieを用いたトラッキング・パフォーマンス測定ツール
- LocalStorageを用いたログイン保持（Remember Me）期間が7日に

※Google Analyticsは1st Party Cookieとして動作する

### これから

#### Google Chrome

- [Building a more private web: A path towards making third party cookies obsolete](https://blog.chromium.org/2020/01/building-more-private-web-path-towards.html)

3rd Party Cookieの排除を2年以内に行うことを表明している

#### Firefox

- [Today’s Firefox Blocks Third-Party Tracking Cookies and Cryptomining by Default](https://blog.mozilla.org/blog/2019/09/03/todays-firefox-blocks-third-party-tracking-cookies-and-cryptomining-by-default/)

標準モードで追跡・トラッキングを行う3rd Party Cookieをブロックするように

### 考察

情報を取り扱うためのいたちごっこが少しずつ落ち着いてくるのではないかと感じている。

しかし実際にはCookieを利用せずとも、下記のように手が打ててしまうのが現状。

- クロスドメイン間で非同期通信
- トラッキングを目的としたクロスドメイン間の非同期通信が禁止されれば、同一オリジン間の自サーバー経由でクロスドメインと非同期通信

また、本来は3rd Party CookieなるものをDNSのCNAMEレコードの書き換えにより、1st Party Cookieとして扱えてしまう導入アナウンスをAD EBiSが行っている

- [アドエビス、3rd party Cookieを使わない新計測法「CNAMEトラッキング」が提供開始から3ヶ月で導入企業300社突破！](https://www.yrglm.co.jp/release/8720/)

DNSレコード内のクロスドメインは無視して3rd Party Cookieとして除外されるような動きが今後あるのでは無いかと個人的に予測している。

## ブラウザ

大きな括りとしてユーザーエージェントではないか。

これは、Google Chromeが今後ユーザーエージェントの扱いに対して、廃止・非推奨といった声明を記していることによる。

- [ユーザーエージェント（UA）文字列は時代遅れ？ ～「Google Chrome」で凍結・非推奨に](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1229968.html)

ユーザーエージェントはFingerPrintの一環としても利用されてしまっている現状がある。

まず第一にそのことからではないか。

しかし、ユーザーエージェントを廃止したとしても次のような手により近しい情報を取得できてしまう。

- ブラウザとJavascript間でドライバー的な役割を果たすApiの利用可能可否

場合によっては、上記のみで

- 〇〇ブラウザのバージョンxx以降

と把握できてしまう。

- [Can I Use](https://caniuse.com/)

影響は然りであるため、放ってはおけないと感じる

また、他ブラウザも同様の動きをしないことは無いと念を押している

## さいごに

GDRPの策定以降、世界的にプライバシー保護に対する動きが準拠しつつ在る。

生活のあらゆるモノがIT化（IoT化）していく上でデジタルは切り離すことが出来ない。

そしてプライバシーとなると、
ユーザーがそれぞれに持つ興味・関心などの情報を利用して、
ビジネスを行う情報銀行も増えないはずはないと感じる。

しかし、ユーザーのプライバシー情報も、
利益を生む上では欠かせないものとなってきており、
完全にこういった情報を切り離すことは出来ないと感じるが、

- ユーザーに情報収集の有無を伝える
- ユーザーに情報収集の可否を確認する
- 一般的な倫理に基づいた情報の取り扱いを行う
- 代替手段を探す

このような形で、人と人とがストレスを感じることのないITになってほしいと願うばかりである。
Qiitaの自分の全ての投稿をダウンロードするRubyスクリプト

Qiitaの自分の投稿をダウンロードするスクリプトを書くのが流行っているみたいだったので、僕も流行りに乗ってRubyで書いてみました。
限定共有記事も含めて自分の全ての投稿をダウンロードできます。
標準ライブラリのみを使用しているので、gemのインストール等は必要ありません。

# サンプルコード

`QIITA_ACCESS_TOKEN`は`read_qiita`権限がついてるアクセストークンに書き換えてください。
アクセストークンの発行はこちらから → [アクセストークンの発行 - Qiita](https://qiita.com/settings/tokens/new)

`OUT_DIR`は出力先ディレクトリパスにご自由に書き換えてください。

```ruby:download_qiita_items.rb
require 'open-uri'
require 'fileutils'
require 'json'
require 'date'

# アクセストークン
QIITA_ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# 出力先ディレクトリ
OUT_DIR = File.expand_path('./qiita_items', __dir__)

# =====================================================================

# 出力先ディレクトリを作成
FileUtils.mkdir_p(OUT_DIR)

1.upto(100) do |i|
  # 記事一覧を取得
  response = URI.open(
    "https://qiita.com/api/v2/authenticated_user/items?page=#{i}&per_page=100",
    'Authorization' => "Bearer #{QIITA_ACCESS_TOKEN}"
  )
  items = JSON.parse(response.read)

  # 記事が見つからなかった場合は終了する
  break if items.empty?

  # 記事を書き出す
  items.each do |item|
    filename = "#{item['title']}.md"
    File.write(File.join(OUT_DIR, filename), item['body'])
  end
end
```

# 実行例

```
$ ruby download_qiita_items.rb
```

```
$ ls qiita_items
Docker Imageのタグ一覧を確認できるCLIツール`docker-tags`を作りました.md
GitHub Markdown APIの使い方.md
Gitコミット件数を確認するコマンド.md
JavaScriptで元の配列を変更せずに並び替えした配列を作る.md
Qiita APIを使って記事一覧を取得する.md
React+material-uiでコピーボタン付きのテキストボックスを作る.md
Slack APIを使用してメッセージを送信する.md
TerraformでVPC・EC2インスタンスを構築してssh接続する.md
【AWS】Qiita 週間いいね数ランキング【自動更新】.md
【Docker】Qiita 週間いいね数ランキング【自動更新】.md
【Git】自分が今いるブランチを確認するコマンド.md
【Go】AWS SSMパラメータストアの値を取得する.md
...
...
```
Webページの画像ファイルを一括取得してGoogleDriveに格納(GoogleAppsScript)

# はじめに
妻がlivedoorblogに掲載していたブログをWordpressのサーバに移行しようとしてたのだが、livedoorblogには画像ファイルの一括エクスポート機能がない（それも問題な気がするが）とのことで、一肌脱ぐことに。

なお、一括取得するシェアソフトは存在するものほぼwindows用であり、私のメインPCがchromebookだったので、ため、GoogleAppScriptで一括取得する機能を作成しました。

## 作成した機能
ブログ記事のURLの一覧はlivedoorblogのエクスポートで取得可能だったので、その各ブログ記事に貼り付けている画像ファイルをGoogleDriveに一括格納する機能となっています。

画像ファイルのURLのみ判断して、かつ切り出す処理には、正規表現を使っています。（今回の機能を作る中で、正規表現の使い方がすごく勉強になりました）

また、htmlファイルに記載されている画像ファイルのURLには、自分で添付した画像ファイル以外の、他の記事のサムネイルや、livedoor自体のロゴ画像が含まれているので、URLの命名規則から不要なものは除外するようにしています。

## 実際のコード

GoogleスプレッドシートのA列にブログ記事のURLを貼り付けた上で、以下のスクリプトを実行

```
//スプレッドシートに記載したブログページのURLから画像を取得
function downloadImages() {
  
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("A1:A");
  var row = sheet.getLastRow();

  
  for (i=1; i<row+1; i++){
    //  シートから１行ずつブログ記事のURLを取得
    url = range.getCell(i, 1).getValue();
    
    var response = UrlFetchApp.fetch(url);
    var html = response.getContentText('UTF-8');
    
    //    取得したHTMLから正規表現でimgタグのsrc属性を取得
    //    img src=""内の画像URLを、()指定で切り出す
    var reg = /<img.*?src=\"(.*?)\".*?>/g;

    while (　m = reg.exec(html)){
      //　 正規表現にマッチして、かつ()指定で切り出した画像URLはm[1]に格納されている
      var image_url = m [1];
      //　 取得したい画像のURLは"https://livedoor.blogimg.jp〜”なので
      if (image_url.slice(0,27) === "https://livedoor.blogimg.jp"){
        var res = UrlFetchApp.fetch(image_url);
        var image = res.getBlob();
        
        //  取得したimageをGoogle Driveにアップロード
        var file = DriveApp.createFile(image);
      }
    }
  }
}

```

# 参考にしたサイト
[.exec() | JavaScript 日本語リファレンス | js STUDIO](http://js.studio-kingdom.com/javascript/regexp/exec)
製薬企業研究者ゆきやのPython記事まとめ

# はじめに

私がQiitaに投稿したPythonに関連する記事のまとめです。
今後もPythonに関する記事を追加していくごとに、こちらのまとめも更新していきます。


# 初級編

## 環境構築

- [PythonとAnacondaのインストール方法](https://qiita.com/yukiya285/items/6bc3bcef00f7d13c94f1)
- [データサイエンスで用いるPythonライブラリのインストール方法](https://qiita.com/yukiya285/items/8b80879ecf13cd3f8d5d)

## 基本的な文法・構文

- [Pythonというプログラミング言語の基本的な記述ルール](https://qiita.com/yukiya285/items/109e2d26234d80566299)
- [変数とデータ型](https://qiita.com/yukiya285/items/d63d5071ca32254b2735)
- [演算子](https://qiita.com/yukiya285/items/ac774efe216ecb97def9)
- [データ構造](https://qiita.com/yukiya285/items/207b0096b01dc8cc81a9)
- [制御文](https://qiita.com/yukiya285/items/207b0096b01dc8cc81a9)
- [関数](https://qiita.com/yukiya285/items/5120a3492326bb9ae759)
- [クラス](https://qiita.com/yukiya285/items/44292f850bc4f4dd24f1)

## ライブラリ

- [NumPy](https://qiita.com/yukiya285/items/c664756b48cb1902530f)
- [Pandas](https://qiita.com/yukiya285/items/9cb322b13d6fe0d3bf3e)
- [Matplotlib](https://qiita.com/yukiya285/items/dc2993072506f7db9e0a)
- [scikit-learn](https://qiita.com/yukiya285/items/75dd6fc539b8c1231404)


# 中級編

## 基本的な文法・構文

- [変数とデータ型](https://qiita.com/yukiya285/items/2e800179fcf06aab0fb9)
- [データ構造](https://qiita.com/yukiya285/items/874c9119a9bcf93afbfa)
- [条件分岐](https://qiita.com/yukiya285/items/498f15061b80159ecf2e)
- [反復処理](https://qiita.com/yukiya285/items/498f15061b80159ecf2e)
- [関数](https://qiita.com/yukiya285/items/e3ea92fe0fc74a546325)
- [クラス](https://qiita.com/yukiya285/items/7d4dc98b4a4b4cc410e5)


## ライブラリの利用方法

- [NumPy](https://qiita.com/yukiya285/items/ce8677ac6ac0f4842a02)
- [Pandas](https://qiita.com/yukiya285/items/49511d736aa87f2d27cd)
- [Matplotlib](https://qiita.com/yukiya285/items/96be7a07122fa63d2713)
- [scikit-learn](https://qiita.com/yukiya285/items/5e61e3cb91c7db25c48b)


# まとめ

私が今まで投稿したPython関連の記事について、「初級編」、「中級編」に分けてまとめてみました。
今後、「上級編」の記事も投稿予定です。


# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)
linuxプログラミング開発(C/C++言語)の世界に異世界転生するためのガイドライン

今までWindowsでよくわからないままプログラミングをかじってきたあなたへ贈る。
と、言いつつ基礎を踏まえてVSCodeを使用した開発環境への誘い。

# 対象読者
- WindowsでVisualStudio(とかArduioみたいななんかそういうソフト)でプログラミングみたいなことをやってきたよ！という人
- CとかC++はちょっとわかる人
- GUI(デスクトップの)環境がないオフラインのLinuxを用意されてしまう人

# linuxでVisualStudioみたいなのあるの？
GUIがあるlinuxの場合はEclipseなどいろいろあります。
しかし、CUIの場合あまり選択肢はないです。プログラミング開発を行う前提知識みたいなものがあなたには必要なようです。

# VisualStudioは何をしているソフトであったのか
VisualStudioはIDE(統合開発環境)と呼ばれる種類のソフトで、以下の機能を含んでいます。

- テキストエディタ (コードを編集する)
    - linter (コードを解析し、コンパイル前に警告する(よく助けられていますね!)機能)
- コンパイラ (実行前に何やら処理をしていますね)
- デバッガ (実行中にブレークポイントを設定できますね)

# IDEの各機能に対応するlinuxのツール群
CUI環境では以下ツールを組み合わせて開発を進める筈です。

- テキストエディタ
    - vim
    - nano
- コンパイラ
    - gcc
- デバッガ
    - gdb
- その他
    - make周りのツール

# 覚えることはたくさんあるぞ！
とりあえずググりましょう。歴史が長いツールなので使い方は出ます。
場合によってはさらにMakefileを書いたりします。
特に大変なことは以下。

- コマンドラインのテキストエディタに慣れなきゃいけない。
- ブレークポイントの指定もコマンドで。

# いや待ってくれよ！こんなのやってらんねえ！
そうですね。それぞれのツールの使い方のチュートリアルをこなした貴方。
まずはお疲れ様です。でもこんなのじゃいくら時間があっても大変ですよね。

# そこでVSCode Remote Developmentじゃ。
VSCode Remote Developmentという素晴らしいツールがあります。
sshさえ繋がればエディタもデバッガもGUIからssh経由で操作ができます。

# VSCodeを使いましょう。
そういう話でした。オンライン環境であれば導入は容易です。
オフライン環境の方は以下の記事を参考に構築しましょう。

オフライン環境へVSCodeとRemote Developmentを導入してlinux開発を快適にする
https://qiita.com/ihatomorio/items/af61a2593f4ed1d4085c
Bootstrapの画面分割

Bootstrapの基本

```html.

<html>
<div class="container">
  <div class="row">
    <div class="col-サイズ-割合">
  </div>
</div>
</html>

```

containerの中にrow、rowの中にcolを入れていく。
div class="col-サイズ-割合"
サイズ表：

|  xs  |    sm   |    md    |   lg  |
|:----:|:-------:|:--------:|:-----:|
|~767px|768~911px|912~1119px|1120px~|
|スマホ |タブレット   |   PC    |PC大画面|

割合：
画面を12分割し、割合を決めることで画面を分けることが簡単にできる。

例1：
col-lg-4
col-lg-4
col-lg-4
これらは横並びに３列均等に分割できる。