OmniAICreator/Qiita-1.07M huggingface dataset:
Golang入門.1 -http.HandleでHello World!-

## はじめに
　他の言語でweb開発の経験がある人 (筆者) がgolangに入門する際に勉強したことを一連の記事でまとめていきます。

## やること
　記事においてはweb開発において必要な機能をはじめとした、ある程度実践的な範囲を対象とします。基本的には対象とする機能を実装したコードを記載します。またコードだけではなく、ドキュメントを踏まえた概念的な説明を挟んでいきます。

## やらないこと
　開発環境の構築方法や基本文法の説明は省略します。


## 今回のテーマ
　http.Handleを用いてHello World!を表示させるまでの流れを説明します。

## 概念編
　以下は[net/httpのdocument] (https://godoc.org/net/http)から抜粋しています。
golangでは他の言語と同様にHTTP requestに応じてresponseを生成します。ざっくりとした流れは以下の通りです (簡単のため、今回はURLにのみ注目します) 。

1. HTTP requestの中身を確認する
2. URLをparseし、事前に登録しておいたpatternとmatchするものを探す
3. matchするpatternがあれば、そのpatternに応じたhandlerを元にresponseを生成 (なければerror処理)
4. 
　上記の流れで必要なpatternとのmatchを行なったり、patternとhandlerの対応を登録したりするものをマルチプレクサと言います。net/httpにおいては[func Handle](https://godoc.org/net/http#Handle)を呼び出した際に、引数として渡したhandlerが[type ServeMux] (https://godoc.org/net/http#ServeMux)に登録されています。そして、2や3においてServeMuxの情報を用いて処理が実行されます。


## コード編
[github] (https://github.com/ryuji0123/go-samples/blob/master/mux.go)

```go:mux.go
package main
import (
        "fmt"
        "net/http"
)

type HelloHandler struct{}

func (h *HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World!")
}

func main() {
        hello := HelloHandler{}
        server := http.Server{
                Addr: "127.0.0.1:8080",
        }
        http.Handle("/", &hello)
        server.ListenAndServe()
}
```

## コードの実行・確認
　ターミナルから実行できます。

```
go run mux.go
```

　ブラウザ上でlocalohost:8080と入力すれば結果が見れます。また、

```
curl localhost:8080/
```

としても確認できます。
## コードの解説
　上記のコードのうち、以下の部分がやや奇妙な挙動をしているように感じます。

```go
func (h *HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World!")
}
```

fmt.Fprintfという部分からprint関数を呼び出していることがわかります。print関数といえば、ターミナルに出力を返すものとして使用することが多いと思います。例えばお馴染みのpython3では以下のように書きます。

```python
print('Hello World!')
```

両者の違いは何でしょうか？ポイントはFprintf関数の第１引数として指定されているhttp.ResponseWriterです。
　[fmt.Fprintfのdocument](https://golang.org/pkg/fmt/#example_Fprintf)によると以下のように説明がなされています。

> func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
> Fprintf formats according to a format specifier and writes to w. It returns the number of bytes written and any write error encountered.

　第１引数で指定したinput/output writerに出力先を指定していることが分かります。また、[実際のコード] (https://golang.org/src/fmt/print.go?s=5516:5593#L192)では以下のように記述されています。

```go
// Fprintf formats according to a format specifier and writes to w.
// It returns the number of bytes written and any write error encountered.
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
	p := newPrinter()
	p.doPrintf(format, a)
	n, err = w.Write(p.buf)
	p.free()
	return
}
```
　全てのコードを掲載するのは冗長なので流れを説明します。Fprintfで行なっている操作は以下の通りです。

1. printer (p) の生成
2. doPrintfを実行し、printerのbufferに情報を格納。この時、入力されたformatの型がstringからbyteに変換される。
3. printerのbufferから情報を読み取りi/o writerが示す出力先に出力
4. printerの解放

　このように、i/oなどにおいて一時的に情報を格納する領域をbufferと言います。fmtにおいてはprinterをtype pp structという構造体で定義した上で上記のようなbufferを用いた出力を可能にしています。なお、golangと対比させる形で紹介したpythonでも省略されている第３引数fileに明示的に出力先を指定することができます。これにより、stdoutつまりターミナルから別の場所へと出力先を変更できます。

## 最後に
　今後もライブラリのソースコードやdocumentの記載を用いる形で解説を行なっていきたいと思います。
AtCoder ABC155 問題D Pairs 検討メモ1

#概要

[AtCoder ABC155 問題D Pairs](https://atcoder.jp/contests/abc155/tasks/abc155_d)に関してメモ。

#経緯

2020/02/16に開催された[AtCoder ABC155](https://atcoder.jp/contests/abc155)は仕事が忙しくて参加できなかったのだが、精進の為[問題D](https://atcoder.jp/contests/abc155/tasks/abc155_d)を見てみてみたところ解法思いつかず。解説記事をみて、二分法で数えて行けばよいのかと理解。自分なりにPythonでコーディングしてみたが茶色の自力ではTLEから抜け出せなった。

[以前の比較](https://qiita.com/MyOden/items/aeccb035f8a0442036fe)からC++でやれば多分行けるんだろうなとは推測したが、

- Pythonで通すことはできないか、
- 通せるすると自分のコードのどこが甘いのか

などが気になったので調べてみた。

# 調査検討結果
## Pythonで通すことはできないか？
結論：通せる（けどちょっと難しい？）

Python3でACとっている方を検索したところこんな結果に。
![ABC155D-python-AC-01m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/9d4328bb-2b25-697c-530f-6ab31227dfb8.png)
コンテスト時間内に通している片は僅か2名でmaspyさんは黄色、nohtarayさんは青でも黄色よりの方でした（色は2020年3月20日現在）。実行時間は1100msec程度。

時間内に２人しか通せてないこと、通しているお二人が黄色、青色の方であることを考えると私の実力で通すのは厳しかった問題と思われる。

あと[以前の比較](https://qiita.com/MyOden/items/aeccb035f8a0442036fe)では著しい改善がみられたPyPyでも試してみた（[提出#10928876](https://atcoder.jp/contests/abc155/submissions/10928876)）が今回はあまり効果がなくTLEは解消できなかった。

## 通せるすると自分のコードのどこが甘いのか?

### 実行速度比較
まず実行時間を比較してみた。
maspyさんの[提出#10152895](https://atcoder.jp/contests/abc155/submissions/10152895)
nohtarayさんの[提出#10155744](https://atcoder.jp/contests/abc155/submissions/10155744)
を自分のサーバにダウンロードしてきて、自分で書いた
プログラム[提出#11068460](https://atcoder.jp/contests/abc155/submissions/11068460)
と併せて、それぞれのプログラムをテストケース4つに対して実行させたときの実行時間を比較した。
以下結果（経過時間をtimeコマンド計測。単位は秒）。実行結果自体は一致しているのでプログラム自体は正しく動いている様子。

| プログラム       | test01 | test02 | test03 | test04 |
|:-----------------------------|-------:|-------:|-------:|-------:|
| 自分のプログラム[提出#11068460] |  0.045 |  0.039 |  9.576 |  9.576 |
| nohtarayさんの[提出#10155744] |  0.303 |  0.288 |  1.140 |  1.119 |
| maspyさんの[提出#10152895]    |  0.275 |  0.312 |  1.097 |  1.045 |

テストケースはのサイズ以下の通り。Aiは乱数で発生させた。

| プログラム       | test01 | test02 | test03 | test04 |
|:-----------------------------|-------:|-------:|-------:|-------:|
| N |  20 |  20 |  200000 | 200000 |
| 正の数の数    | 10  |  10 | 100000 | 10000 |
| 零の数    | 1 |  1 | 1 | 1 |
| 負の数の数    | 9 |  9 |  99999 |  99999 |
| K | 150 |  50 | 1500000000 | 500000000 |

結果からわかるのはNが小さいときは私のプログラムのほうが速いがNが大きくなってくると
maspyさん、nohtarayさんのプログラムの方が10倍程度早い。。。

### コード比較
ではなにが違うのか。。。を探るためにmaspyさん、nohtarayさんのプログラムをのぞいていみる。
お二人のコードに共通して[numpyのsearchsorted](https://docs.scipy.org/doc/numpy/reference/generated/numpy.searchsorted.html) という機能を使用されていることが判明。第二引数にも配列使っている。これが多分私の手ぐみの関数などよりずっと速いのだと予想された。こんな関数があるのか。。。。これ使っているおかげもありコードも短い。

# 最後に
numpyのsearchsortedの利用が「味噌」と分かったところまででメモ1はおしまいにする。

Pythonで競プロするにはnumpyとかいろいろ知識が足りないのだなという事は分かった。numpy searchsortedについてとか、C++ならもっと簡単にTLEしないコードが書けたのかとは気が向いたら調べて整理しようと思う。
[ターミナル入門] ディレクトリ/ファイル操作

##はじめに
[用語]
- ディレクトリ：フォルダのこと
- ホームディレクトリ：Finderを立ち上げた時始めに表示されるフォルダ
- カレントディレクトリ：今開いているフォルダの場所

[便利な小技]
- 上矢印キー（↑）でコマンドのヒストリーをさかのぼれる
- tabキーでディレクトリ・ファイル名の入力保管をしてくれる

##ディレクトリパスの表示と移動
```
#カレントディレクトリを表示
pwd

#ホームディレクトリに移動
cd

#１つ上の階層に戻る
cd ..

#２つ上の階層に戻る
cd ../..

#指定ディレクトリに移動する
cd 移動先ディレクトリのパス
```
##ディレクトリ/ファイルを表示
```
#カレントディレクトリ内のディレクトリ/ファイルを表示
ls

#カレントディレクトリ内の、隠しファイルを含むディレクトリ/ファイルを表示
ls -a
```
##ディレクトリ/ファイルの作成と名前変更

```
#新規ディレクトリ作成
mkdir sample  // => sampleフォルダができる

#新規ファイル作成
touch sample.html  // => sample.htmlファイルができる
```
##既存ディレクトリ/ファイルの移動と複製
```
#ファイル名を変更
mv sample.html sample2.html  // => sample.htmlをsample2.htmlにファイル名を変更

#ファイルを別のディレクトリに移動
mv sample.html dev/  // => sample.htmlをdevフォルダに移動

#ファイルを複製
cp sample.html dev/  // => sample.htmlをdevフォルダ内で複製
cp sample.html sample2.html  // => sample.htmlをsample2.htmlという名前で複製

##ディレクトリを複製
cp -r dir1/ dir2  // => dir1をdir2という名前で複製
```
##Finderを開く
```
##Finderを開く
open .　// => カレントディレクトリでFinderを開く
open ~/  // => ホームディレクトリをFinderで開く
```
Reactコーディングを爆速でぶち上げるプラグイン

![React_emmet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573011/22cdacb1-de4b-9b60-c424-cc0941e340aa.gif)

#前置き
Reactコーディングをする時に、便利だなと感じる機能、ツールをまとめました。
コーディングスピードを爆速でぶち上げたい方向けです。（言いたいだけ）


#仕様ツール
- Visula Stadio Code
- Simple React Snippets(拡張機能)


##①VS Codeのショートカット

Reactのファイルを開いたら...

- `command` ＋ `K` を押してから `M`

これめちゃ便利です。Reactのファイルは、デフォルトだとJavaScriptのファイルと認識されてしまいますので、Reactで使いたいSnippetsやEmmetが使えなかったりします。

##②Simple React Snippets(拡張機能）
<img width="709" alt="スクリーンショット 2020-03-22 9.43.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573011/496ea7be-b098-7823-1a17-9513a572c629.png">


|  Snippet  |  Renders  |
| ---- | ---- |
|  imr  |  Import React  |
|  cc  |  Class Component  |
|  ccc  |  Class Component with Constructor |

クラスコンポーネントなんて、打つと長過ぎるので100億秒くらい節約できます。
タブストップもいい感じに設定されているので、上手に使いこなしましょう。

##③VS CodeのEmmet
JSXを記述する時
`.container` → `<div className="container"></div>`

classNameって長すぎやねん...
HTMLのコーディングでも使えますよー


##まとめ

新しいコンポーネントを作った時とかに、是非使ってみてください！
おすすめの拡張機能、コーディング方法あればコメントいただけると大変喜びます。
ReactNativeでエラー If you intended to use a system font, make sure 

ReactNativeでmacでシミュレーション使おうとしてエラー 

```
If you intended to use a system font, make sure 
```

## 直った

```
% npm install -g @expo/vector-icons
```

## 参考

https://github.com/aws-amplify/amplify-js/issues/2345
【Kotlin】複数の条件でオブジェクトを大小比較する

例えば、次のようなクラスがあり、そのインスタンスを生年月日でソートしたい場合。

```Kotlin
data class Person(
    val name: String,
    val birthYear: Int,
    val birthMonth: Int,
    val birthDayOfMonth: Int
)
```

次のように `Comparator` を生成すればよい。

```Kotlin
val birthDateComparator: Comparator<Person> =
    compareBy<Person> { it.birthYear }
        .thenBy { it.birthMonth }
        .thenBy { it.birthDayOfMonth }
```

使用例：

```Kotlin
fun main() {
    listOf(
        Person("Alice", 2000, 1, 1),
        Person("Bob", 2000, 1, 2),
        Person("Carol", 2001, 1, 1)
    )
        .shuffled()
        .sortedWith(birthDateComparator)
        .map { it.name }
        .also {
            println(it) // > [Alice, Bob, Carol]
        }
}
```

別の書き方：

```Kotlin
val birthDateComparator: Comparator<Person> =
    Comparator<Person> { a, b -> a.birthYear.compareTo(b.birthYear) }
        .thenComparator { a, b -> a.birthMonth.compareTo(b.birthMonth) }
        .thenComparator { a, b -> a.birthDayOfMonth.compareTo(b.birthDayOfMonth) }
```
Python と R の確率分布のmethod名と引数の扱いをいつも忘れる1か月後の自分へ

## この記事の目的

- Python と R の分布関数の操作の対応について基本部分をまとめる
- 年に3回くらい忘れる自分のための知識を誰かのために

## summary という名の個人的感想

- Python の method 名は直接的でわかりやすい
- R は 分布パラメータの引数名が直感的だが、Python の `a=, b=` と `loc=, scale=` の使い分けの指定は数式から変換する時に脳に負担がかかる。
- どちらも慣れれば問題なし

## Official Documents
- Python: [Statistical functions (scipy.stats)](https://docs.scipy.org/doc/scipy/reference/stats.html)
- R: [Distributions in the stats package
](https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Distributions.html)

## 主な methods

正規分布での例

事前準備 for Python: `from scipy import stats`

| python | r | return value | meanings  |
| :-- | :-- | :-- | :-- |
| stats.norm.pdf(0) | dnorm(x = 0) | 0.3989423 | y-axis height of distribution at x = 0; probability density function |
| stats.norm.ppf(0.99) | qnorm(p = 0.99) | 2.326348 | x position that satisfy integral distribution from -Inf to x = 0.99; percent point function |
| stats.norm.cdf(2.326348) | pnorm(q = 2.326348) | 0.99 | inverse of ppf; cumlative distribution function |
| stats.norm.rvs(size=5) | rnorm(n = 5) | 10 values | make random variables |


## 分布のパラメータについて

公式を読むべし
https://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#shifting-and-scaling

pythonは全distributionで以下が共通

- loc: 分布の平行移動
- scale: 倍率

```python
# python
>>> stats.norm.rvs(size=5, loc=100, scale=10)
array([ 87.94461629, 101.62097735, 114.57610849, 109.68581233,
        92.61449913])
```

```R
# R
rnorm(5, mean=100, sd=10)
# [1]  88.97331 116.73641  87.71554  97.24457  95.40161
```


以上
話題沸騰ポットに対して Property based testing を試してみる (3)沸騰/保温 - 状態遷移を考える

#はじめに
[話題沸騰ポットに対して Property based testing を試してみる (2)給湯(水)させる](https://qiita.com/freddiefujiwara/items/c7158c87b82061bff396)に引き続き
[fast-check](https://github.com/dubzzz/fast-check)を使ってProperty based testingを試しています。
題材として
[テスト設計コンテストU-30クラス](http://aster.or.jp/business/contest/rulebooku30.html)でテストベースに指定されている
[「話題沸騰ポット要求仕様書 (GOMA‐1015型) 第７版](http://www.sessame.jp/workinggroup/WorkingGroup2/POT_Specification.htm)にすることにしました.
fast-checkは状態をランダムウォークさせて失敗するテストケースを見つける方法も[実装されてる](https://github.com/dubzzz/fast-check/tree/master/example/004-stateMachine/musicPlayer)みたいですのでそろそろ状態遷移を考えつつこの機能を試していきたいと思います

#準備
状態遷移を表すのに良いツールは無いかと探していたところ
JavaScript製の[state-machine-cat](https://github.com/sverweij/state-machine-cat)というライブラリを見つけました。
こちらを使って描画しながら状態遷移を考えていきましょう

#状態遷移
## [以前](https://qiita.com/freddiefujiwara/items/c7158c87b82061bff396)までの状態
[state-machine-cat形式のソースコード](https://raw.githubusercontent.com/freddiefujiwara/goma-1015/feature/pour/state.smc)

- initialize => offの状態遷移はconstructor()の動きと考える
    -  _water = 0 にする
-  電源on(plugIn())/off(plugOff())は蓋の状態に応じて下記と状態を行き来する
    -  蓋が閉じている場合 off <-> idle
    -  蓋が開いている場合 open/off <-> open/on
-  同様に蓋の状態は電源on(plugIn())/off(plugOff())に応じて下記と状態を行き来する
    -  電源onの場合 idle <-> open/on
    -  電源offの場合 off <-> open/off
- 蓋を開ける行為(open())に関して
    - 電源onの状態で蓋が開いている場合と電源offの状態で蓋が開いている場合状態を分ける
- アイドル状態は電源が入っていて蓋が閉じている状態
- 給湯(水)(dispense())機能は電源オンかつ蓋が閉じている場合のみ起動する
    - なおその際 中に入っている水は 10 ml / secのスピードで減少する
- 注水(fill())は電源on/offに関わらず蓋が開いていれば(open/off or open/on)行える
    - その際は 中に入っている水に任意の量(water)追加できる
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/755e34d5-73a9-63df-a3f1-6e342ca5871c.png)

##沸騰/保温状態を追加したバージョン
[state-machine-cat形式のソースコード](https://raw.githubusercontent.com/freddiefujiwara/goma-1015/feature/boil/state.smc)
以前との差分はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/9971d7c5-691e-e472-b7e4-1f0952186991.png)

- offの場合 水温(_temperature)を室温25℃に初期化する
- アイドル(idle)状態でもし水が10ml以上になると自動的に沸騰中(boil)に遷移する
- 電源on中に蓋を開くと(open/on)水温(_temperature)は室温25℃にまで下がる
- 沸騰(boil)/保温(keep)状態をまとめてactiveと表現し、電源off(plugOff)するとoffの状態に遷移する
- active中に蓋を開くと(open/on)水温(_temperature)は室温25℃にまで下がる
- active状態は沸騰中(boil)と保温(keep)の2つの状態がある
    - boil状態は_startを現在時刻に初期化する そして毎秒1.25℃水温( _temperature) を上昇させる
    - keep状態は常に水温(_temperature)を100℃に保つ
    - keep状態で再沸騰(reboil())ボタンを押下するとboil状態に遷移
    - keep状態で給湯(dispense())ボタンを押下すると給湯される
        - 中に入っているお湯は 10 ml / secのスピードで減少する
    - keep状態でお湯が10ml以下になった場合はidle状態に遷移する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/47b6988f-4aa9-8e05-21bd-4d0d0e12ef82.png)

#最後に
次はテストではなく[実装を状態遷移に合わせたい](https://qiita.com/freddiefujiwara/items/bc9ae3dd8970cd595c14)と思います。
また、コードにもし間違いありましたら[Pull request](https://github.com/freddiefujiwara/goma-1015)は大歓迎です。
長くなってしまいましたが　最後まで読んでいただきありがとうございました。
【UE4】UnrealEngine起動時にデフォルトで開くレベルを変更する方法【UnrealEngine】


解説いらないシリーズです。
UnrealEngine起動時、ゲーム開始時のレベルの設定は
プロジェクト設定のプロジェクト->マップ&モードの中で設定できます。

![デフォルト開くシーン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/10225bd6-0f3e-6dfb-0020-6462c4bd3051.png)
unityでノンコーディングでオブジェクトを動かしたいとき

Animationコンポーネントを使います。
Animationコンポーネントがハジメマシテの方は、初回は大変ですが、一度試して、いくつかオブジェクトを動かせば慣れるのではないかと!!

---

動かしたいオブジェクトに、インスペクターウィンドウでAnimationを検索してAddする。
<img width="272" alt="a01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/a249e070-e2b7-a8bd-dc63-3cf6de43019e.png">

Animationウィンドウを開く。
<img width="441" alt="a02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/1c7ec541-2908-1595-48ce-6217b8368d4c.png">

ウィンドウ右側に[create]というボタンがあるので、それを押下する。
<img width="441" alt="a02a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/56c4e384-5215-b5cc-b1b2-787dc058d167.png">

保存ダイアログが出てくるので、適当な名前を入力する。
<img width="332" alt="a03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/86a76b83-16cb-091f-4982-693c173fa9b3.png">

アセット内にこういうのができる
<img width="83" alt="a04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/ab870f61-f6bd-d083-9f7b-7dd11fdbd489.png">

録画ボタンを押す。
<img width="430" alt="a05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/cd94c515-69a5-764f-900e-896944f7ba60.png">

最初のpositionを入力する。(これが0秒目。初期位置)
<img width="1049" alt="a06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/2489a2de-cd29-fcc0-15ed-82ccef010ac6.png">

フレームを移動する。
移動後のpositionを入力する。(下図スクショだと1秒目。移動後の位置)
<img width="1088" alt="a07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f9a39743-d009-7c82-4287-2d397e4d7b16.png">

録画ボタンを再度押下して、停止する。
0秒目に戻す。
アセット内のanimationコンポーネントを、インスペクターウィンドウのAnimationにドラッグアンドドロップする。
<img width="1129" alt="a08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/2ccb86b9-34b8-6bbd-1cdf-1aefacea04e9.png">
リトライ手法「エクスポネンシャルバックオフ」（すべてのリクエストを同じ間隔でリトライしていいの？）

例えば、所持しているサーバから、とあるAPIにリクエストを投げるとします。
そのAPIはアカウント単位で秒間リクエスト数が制限されています。

その条件で、API使用中にリクエスト制限にひっかかりました。
その場合に、どういうリトライをすれば、リクエスト制限をかいくぐることができるのか？

その回答の１つが、「エクスポネンシャルバックオフ」となります。
→リトライ間隔を指数関数的に調整するです。

・リクエストが失敗した場合、1 + random_number_milliseconds 秒待ってから、リクエストを再試行。
・リクエストが失敗した場合、2 + random_number_milliseconds 秒待ってから、リクエストを再試行。
・リクエストが失敗した場合、4 + random_number_milliseconds 秒待ってから、リクエストを再試行。

例えば、リトライ間隔を３秒に固定すると、
３秒後に必ずはじかれたリクエストのアクセスがAPIに集中します。
そうなると、また、制限にひっかかってしまう可能性は高くなります。

それを回避するために、ランダム値を使い指数的にリトライに間隔を分散させます。

例えば、
Aさんのリクエストの場合
　１回目のリトライ　２秒後
　２回目のリトライ　５秒後
Bさんのリクエストの場合
　１回目のリトライ　２秒後
　２回目のリトライ　７秒後
　３回目のリトライ　１０秒後

みたいな感じです。
・ランダム値で、アクセスを分散させる
・指数的な間隔でリトライすることで、負荷がかかっている時間から遠ざけていく
それをすることで、リトライの成功確率を上げるという考え方です。

秒間のリクエスト制限があるサービスに対しては、
このような手法を取り入れることもありかもしれません。

>参考
https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html

以上です。
距離センサを使ってみた

# 概要
距離センサを購入したので試してみました。

# 部品
**距離センサ:**[HC-SR04](https://ja.aliexpress.com/item/1980983785.html?spm=a2g0s.9042311.0.0.27424c4d6EcPXD)
83円
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/4ef0ce5e-1245-e46f-2507-e7e22a040f58.png">
※参考にした[SwitchScience](https://www.switch-science.com/catalog/1606/)によるとこれには一部欠陥があるようで、そちらのほうが良いかもしれません。

**表示機:**[TM1637が組み込まれた7セグLED](https://ja.aliexpress.com/item/4000174141889.html?spm=a2g0s.9042311.0.0.27424c4dboG22l)
73円
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/4ce296b8-61c4-8857-770e-6173b76eb6bc.png">

**コンピュータ:**[Arduino UNO互換機](https://www.amazon.co.jp/FC-%E5%B7%A5%E5%A0%B4-R3%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89-%E3%83%90%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-ATmega328P-Arduino%E3%81%A8%E4%BA%92%E6%8F%9B%E6%80%A7/dp/B07H4KTVK5/ref=sxbs_sxwds-stvp?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2S335VL3VWB52&cv_ct_cx=arduino+uno&keywords=arduino+uno&pd_rd_i=B07H4KTVK5&pd_rd_r=d31aaf3a-0258-4866-b883-ee3cb37525ae&pd_rd_w=II02q&pd_rd_wg=kzB7i&pf_rd_p=e29507e3-7937-4495-82f4-55b5d5ca8047&pf_rd_r=SN5PWYGF5TQS3EX5XFVB&psc=1&qid=1584128141&s=diy&sprefix=Ard%2Cdiy%2C251)
699円
<img width="400" alt="img.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/47f88a1f-c4ae-cc1d-84cc-12b8cc736b9b.png">


#配線
<img width="400" alt="スクリーンショット 2020-03-22 7.46.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/b42e8fa2-a5ab-3665-ef17-3733e64b7489.png">

`Trigger`を10マイクロ秒以上 UPさせると、40kHzで８回距離を測り、その結果を`Echo`に周波数で返す仕様らしいです。

#ソースコード

```c++

#include <Arduino.h>
#include <TM1637Display.h>
#include <Wire.h>

#define SERIAL_BAUD 115200
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
int Trig = 5;
int Echo = 4;

void setup() {
  Serial.begin(SERIAL_BAUD);
  while(!Serial) {}
   pinMode(Trig,OUTPUT);
   pinMode(Echo,INPUT);

  Wire.begin();
  uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
  display.setBrightness(0x0f);
  display.setSegments(data);
  delay(1000);
}

void loop() {
  int Duration;
  float Distance;
    digitalWrite(Trig,LOW);
    delayMicroseconds(1);
    digitalWrite(Trig,HIGH);
    delayMicroseconds(11);
    digitalWrite(Trig,LOW);
    Duration = pulseIn(Echo,HIGH);
    if (Duration>0) {
      Distance = Duration/2;
      Distance = Distance*340*100/1000000; // 340m/s = 34000cm/s = 0.034cm/us 
      Serial.print(Distance);
      Serial.println(" cm");
      display.showNumberDec((unsigned int)(Distance*100), false);
//      analogWrite(11, (unsigned int)(100-Distance));//ビープ音
    }
  delay(100);
}
```
[github](https://github.com/hashito/arduino_startup/tree/master/temp2led7)


# 動作確認
gif動画で上げても分かりにくかったので、Youtubeにて確認いただけると幸いです。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ldNOMMeGAis/0.jpg)](http://www.youtube.com/watch?v=ldNOMMeGAis)
ibmcom/db2のcontainer構築～ddl実行/データimportまでをbatファイルで自動化した

# 概要
db2(旧dashdb）のcontainerを構築してddlを実行し、データをimportするようなbatファイルを作ろうとしたところ、主にユーザー切り替え周りでつまづいたのでメモ

# やりたいこと
以下を自動化したい！
１. [dockerhubのibmcom/db2](https://hub.docker.com/r/ibmcom/db2)のcontainerを構築
２. 以下のようなddlを実行

```sql:ddl.sql
 CREATE TABLE
	TBL_A ( 
	HOGE VARCHAR(50) NOT NULL,
	FUGA VARCHAR(50) NOT NULL UNIQUE );
```
３. 以下のようなcsvファイルをimport

```sh:import.csv
hoge1,fuga1
hoge2,fuga2
```

# やったこと①：batファイルの中身
以下、batファイルの中身を順番に説明
### configファイルの読み込み
configファイルに外出しできていた方が色々と便利なので外出し

```sh
set CONFFILE=.\batconfig.ini
if not exist %CONFFILE% (
    echo ERROR: Not found %CONFFILE%
    exit /b 1
)
for /f "usebackq tokens=1,* delims==" %%a in ("%CONFFILE%") do (
    set %%a=%%b
)
```

### 古いcontainerがいたら削除して新規作成
`docker run` のコマンドはここ（→ https://hub.docker.com/r/ibmcom/db2 ）のQuickStartに書いてある。
background実行させたいので、 `-it` オプションを削除して `-d` オプションを追加。

```sh
docker stop db2inst1
docker rm db2inst1
docker run -d --name db2inst1 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=xxxxx ibmcom/db2
powershell sleep 60
```

以下ログが出るまで待機させたいので、 `powershell sleep 60` で待機している。（本当は `docker logs -f db2inst1` で監視すべきなのだろうが、そこまではやっていない。。。）

```sh
(*) All databases are now active.
(*) Setup has completed.
```

ちなみに、ここで待たずに後続の処理をすると `db2: command not found` というエラーが出る。

### ddl/csvファイルをコピー
ファイルをcontainerの中にコピー

```sh
docker cp .\ddl.sql db2inst1:/mnt
docker cp .\insert.csv db2inst1:/mnt
```

### shell scriptをコピー
ddl実行用のshell scriptをcontainerにコピーして、権限を付与。
Windows環境化でshell scriptを編集していたので `sed` コマンドを使って改行コードを修正。

```sh
docker cp .\doddl.sh db2inst1:/mnt
docker exec -it db2inst1 bash -c "chmod a+x /mnt/doddl.sh"
docker exec -it db2inst1 bash -c "sed -i 's/\r//' /mnt/doddl.sh"
```

### db2start/db2stopに権限を付与（ここ大事！！）

```sh
docker exec -it db2inst1 bash -c "chown db2inst1:db2iadm1 /database/config/db2inst1/sqllib/adm/db2start"
docker exec -it db2inst1 bash -c "chown db2inst1:db2iadm1 /database/config/db2inst1/sqllib/adm/db2stop"
```

この処理を実施しないと以下エラーが発生してしまっていたため、`db2start` `db2stop` に権限を付与。

```sh
-bash: /database/config/db2inst1/sqllib/adm/db2start: Permission denied
-bash: /database/config/db2inst1/sqllib/adm/db2stop: Permission denied
```

### shell script実行
container内でshell scriptを実行

```sh
docker exec -it db2inst1 bash -c "/mnt/ddl.sh"
```

# やったこと②：shell scriptの中身

### root権限で実施したい処理
例えば、バックアップの保存とか

```sh
#!/bin/bash
mkdir /mnt/ddl.bk
cp /mnt/ddl.sql /mnt/ddl.bk/
```

### switch userして、処理実行
こんな感じでEOFで処理を渡す。

```sh
su - db2inst1 << EOF
set -x
db2 create db testdb
db2 connect to testdb
db2 -tvf /mnt/ddl.sql
db2 import from /mnt/import.csv of del insert into TBL_A
set +x
EOF
```
kusanagiがSSLを自動更新してくれないときの対処法とは？

# KUSANAGIのSSL証明書が更新されない

GCPにてKUSANAGIで構築したブログのSSL証明書が更新できていませんでした。
更新設定はしてあるにもかかわらず、ブラウザでは証明書エラーが出ます。

# KUSANAGIの自動更新設定はONなはず

完了しましたって言われるので、できているはずです。

```bash
[root@kusanagi-1-vm ???]# kusanagi ssl --auto on <profile_name>

証明書の自動更新は既に有効です。何もしません。
完了しました。
```

※`<profile_name>`とは`kusanagi status`コマンドを実行したときに表示される、
最初の行の`Profile: ****`の****です。

# とりあえず更新

ひとまず更新をかけてみました。

```bash
[root@kusanagi-1-vm ???]# yum update

完了しました。
[root@kusanagi-1-vm ???]# kusanagi restart

完了しました。
```

すると、ブラウザでの証明書エラーはなくなりました。


# 仕方がないのでCRONに設定

kusanagiの自動更新設定は効果がないようです。
しかし、`yum`の`update`と`kusanagi`の`restart`を行えば問題が解決するようです。
この部分を自動化すればよいと仮定します。

もともと、CRON設定には`/usr/bin/kusanagi update cert`が入っていました。
`kusanagi ssl --auto`で設定しているのはここのコマンドなようです。
しかし、これが失敗してうまくいかない様子です。

毎週日曜日に更新しているのにできていないとは？
私の頭の中にはハテナがいっぱいです。
考えても分からなかったので、暫定対応を行います。
今回行った`yum update`と`kusanagi restart`が定期実行されるようにします。

```bash
[root@kusanagi-1-vm ???]# crontab -l

07 03 * * 0 /usr/bin/kusanagi update cert
[root@kusanagi-1-vm ???]# crontab -l > crontab-data.txt

[root@kusanagi-1-vm ???]# crontab -l > crontab-data.txt

crontab-data.txt
[root@kusanagi-1-vm ???]# nano crontab-data.txt

[root@kusanagi-1-vm ???]# nano crontab-data.txt

[root@kusanagi-1-vm ???]# nano crontab-data.txt
```

```text
07 03 * * 0 yum update
07 04 * * 0 /usr/bin/kusanagi restart
07 05 * * 0 /usr/bin/kusanagi update cert
```

cronのデータを一度テキストファイルに書き出して、
nanoエディターで編集してから再度読み込ませています。

これで、しばらくは安心です。

# 参考ページ

https://totonote.com/2018/03/25/kusanagi-ssl-auto-update-error/

# 原典

KUSANAGI コマンド一覧
https://kusanagi.tokyo/document/command/


**Excelsior!**
Docker で zeit nowのデプロイ環境とNext.jsの開発環境を作ったメモ

## 概要
* zeit nowのデフォルトのnext.jsを修正
* [2020 年初頭における Next.js をベースとしたフロントエンドの環境構築][*1] を参考にTypeScriptの環境構築
* dockerを利用して環境を作っている
* storybookはできてない

## now

### zeit now へのデプロイを確認

- 事前に、zeit へ github 連携を行っている。
- コンテナに bin/bash.sh でログイン。以下のコマンドを実行してデプロイしてみる。

```bash
now login # メールを確認する。メールは https://zeit.co/account の画面から確認可能
now init # nextjsのデフォルトプロジェクトを作成
cd nextjs # initで作ったディレクトリに移動する
now # デプロイを行う。とりあえず、初期の状態でデプロイできることを確認
```

- このとき、/root/.local/share/now/ディレクトリに、config.json と auth.json が出来ているので、コンテナ外に保存しておく。認証用の情報
- nextjs フォルダに最初のファイルが出来ているので、コンテナ外に保存しておく。
- コンテナ作成時に、/root/.local/share/now/ディレクトリに先ほど保存したファイルを取り込むように Dockerfile を修正。
  - 毎回、now login しなくてもよいようになる。

[整理前のソース](https://github.com/hibohiboo/develop/tree/11d6d6ee33cdaac6687fc32217ad40386dceb9e8/tutorial/lesson/react-my-examples/next/)

### フォルダ構造変更

- src ファイル整理
- `now dev`でローカルで確認できるように docker-compose.yml を修正

[この時点のソース](https://github.com/hibohiboo/develop/tree/fa5d3cce8b733e7ee3ec89a48c3a265f712c4881/tutorial/lesson/react-my-examples/next/)

## react ts
### 環境構築

[2020 年初頭における Next.js をベースとしたフロントエンドの環境構築][*1] を参考に環境を作っていく。

[この時点のソース](https://github.com/hibohiboo/develop/tree/69a7bd62e8ccfc9827c6a515f32a83f876f34616/tutorial/lesson/react-my-examples/next/)



## 参考

### now

[dist now](https://zeit.co/onboarding)
[設定なしでデプロイできる Zeit Now](https://dev.classmethod.jp/server-side/serverless/zero-configuration-zeit-now/)
[Now でクラウドの複雑さから解放されよう、今すぐに](https://qiita.com/aggre/items/f0cb9f8b8e8c54768e50)
[example](https://github.com/zeit/now/tree/master/examples/nextjs)
[now deploy](https://zeit.co/docs/v2/platform/deployments#now-cli)

### next

[2020 年初頭における Next.js をベースとしたフロントエンドの環境構築][*1]

[*1]: https://qiita.com/syuji-higa/items/931e44046c17f53b432b
jQueryでFlash, error_messageを閉じる方法(Bootstrap xボタンが反応しない場合)。

##はじめに

**（*注意：この記事は学習の一環として実装した物の一部を記事にしています。本記事には正しくない情報、方法を含んでいる可能性があります。）**

Bootstrapの`flash`,`error_messages`などに使われる
`<div class= "alert alert-○○">`
が閉じない場合の対処法です。
私の環境が悪く閉じるアクションができないのか定かではありませんが
`jQuery`を使って閉じるアクションを可能にする方法を書いておきます。

<b>私の場合、xマークのボタンは表示できましたがクリックをしても一切反応しませんでした。<b>

##開発環境
- bootstrap-sass (3.3.7)
- devise (4.7.1)
- jquery-rails (4.3.1)
- rails (5.2.4.1)

##Flashやerror_messagesにxボタンをつける
[こちら](https://www.w3schools.com/bootstrap4/bootstrap_alerts.asp) Bootstrap4版
[こちら](https://www.w3schools.com/bootstrap/bootstrap_alerts.asp) Bootstrap3版
上記のサイトのサンプルを確認すると

```html
<div class="alert alert-success alert-dismissible">
  <button type="button" class="close" data-dismiss="alert">&times;</button>
  <strong>Success!</strong> Indicates a successful or positive action.
</div>
```
サイトでは、↓
>To close the alert message, add a .alert-dismissible class to the alert container. Then add class="close" and data-dismiss="alert" to a link or a button element (when you click on this the alert box will disappear).

簡単に要約するとalertなどを閉じる時は
`class=alert-dismissible `を`alertコンテナ`に
`<button>`タグに`class="close"`,`data-dismiss="alert"`
を記入すればxボタンクリック時に消えますよと。

<b>(私の環境で何か導入し忘れのものがある、もしくは、Javascript,jQueryで閉じるアクションする前提なのかもしれません。わかる方宜しければコメントなどで教えてください。)<b>

##jQueryで閉じるイベント
```applivation.js
$(function() {
  $(".close").click(function() {
    $(".alert").hide();
  });
});
```

#参考サイト
w3schools.com
(https://www.w3schools.com/bootstrap/bootstrap_alerts.asp)
(https://www.w3schools.com/bootstrap4/bootstrap_alerts.asp)

##終わりに
xボタンを押した際にBootstrapを適用したクラスのFlashやエラーメッセージを閉じることができると思います。
jQuery、Javascriptの重要性を再確認できました。
#Ruby の pry で コマンド履歴を検索して戻る/進むショートカット ( reverse-i-search / i-search ) ( Mac )

# reverse-i-search

- Ctrl + R で pryのコマンド履歴を検索できる
- 検索中にもういちど Ctrl + R を押すと、検索結果をひとつずつ過去に戻れる
- だがしかし、いちど戻ると、そこから逆に進む方法が分からない
- 戻ってから進む方法が分からずに、たまに調べては諦め、そして5年が過ぎた

![image](https://user-images.githubusercontent.com/13635059/77210737-0d672380-6b45-11ea-90e8-0afd262b70ff.png)
![image](https://user-images.githubusercontent.com/13635059/77210738-0e985080-6b45-11ea-85c7-3bd06a161044.png)

# 解決は .inputrc

`~/.inputrc` に以下を設定する

```
"\C-t": forward-search-history
```

- pryの設定ではなく、実行するシェルの設定
- .bash_profile とか .bashrc とか .zshrc とかと同じ扱い
- 設定したらpryを終了、再起動する 

# 動作確認

履歴を戻りすぎた場合に Ctrl+T で進めるようになったぞ！

![image](https://user-images.githubusercontent.com/13635059/77211844-874cdc00-6b48-11ea-912e-172666ef0755.png)
![image](https://user-images.githubusercontent.com/13635059/77211845-87e57280-6b48-11ea-942d-03f3f5d10fdc.png)
![image](https://user-images.githubusercontent.com/13635059/77211846-887e0900-6b48-11ea-99fc-8fb6199b1d5c.png)



#  原因

readline のデフォルトのキーバインドか何かと干渉していたのかもしれない。

![image](https://user-images.githubusercontent.com/13635059/77211235-afd3d680-6b46-11ea-90a5-c7a03f21d79f.png)

[command line - readline reverse-search-history C-r repeatedly finds next cmd, how to go back to previous? - Super User](https://superuser.com/questions/610980/readline-reverse-search-history-c-r-repeatedly-finds-next-cmd-how-to-go-back-to)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3042








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Day34】積み上げ日記

##予定
■Bootstrapの習得
−グリッドシステム
−種類の把握

##完了
■Bootstrapの習得
−グリッドシステム
−種類の把握

■サイト公開までの流れ

##学習時間
２h

##学習ポイント
■table
table…テーブルの１番外側
thead…見出し部分
tbody…データがある部分
tr…行
th…表のヘッダー
td…表の中身

■ホームページ公開までの手順
①ドメインを取得する
−ムームードメイン
②サーバーを借りる
−さくらインターネット
③作成したホームページをサーバーにアップロードする
−FTPクライアントソフト
　−FFFTP
④ホームページを作成する

■案件獲得する術
クライアントが欲しいと思うサイトをあらかじめ作る。

##疑問点
○Bootstrapは現場で使うのか否か。ポートフォリオに用いてOKか。

##計画通り進んだか？
進んでいない。途中から「Bootstrap」の必要性に疑問を抱く。いつでも利用できるようにしておくくらいに留める。そうでないと、Bootstrapを使わないとサイト制作できない人になってしまうため、根本的なCSSを継続的に学習することにする。
また、そのような疑問をもってしまい、あらゆる選択肢が多く出てきてしまった。結果的に集中力をかき、手付かず状態になる。自分のレールをしっかり決めて、日々の行動を選定していく。

##参考サイト
■HP公開するために
https://liskul.com/hp-releas
InAppBrowserのmessageイベントを使ってみる

[cordova-plugin-inappbrowser](https://github.com/apache/cordova-plugin-inappbrowser) v3.1.0から、`message` イベントが追加されています。詳しくは、[InAppBrowser.addEventListener](https://github.com/apache/cordova-plugin-inappbrowser#inappbrowseraddeventlistener) を参照してください。

このmessageイベントは、targetを `_blank` で実行した `InAppBrowser` で使用することができます。InAppBrowserで開いた外部サイトからメッセージを送信し、アプリ側がメッセージを受信すると、アプリ側に設定されているmessageイベントのコールバック関数が実行されます。

このmessageイベントを使用すると、外部サイトから送信されたメッセージ内容によって、アプリ側の処理を変更するということもできます。


# messageイベントの使用例

アプリ側にInAppBrowserのmessageイベントを設定し、InAppBrowserで表示している外部サイトからメッセージを送信すると、アプリ側に設定されているmessageイベントのコールバック関数（messageCallBack）が実行される流れになります。

## アプリ側の設定例

```html
<body>
  <input type="button" value="openInAppBrowser" onclick="openInAppBrowser()" />
</body>
```

```html
<script>
  function openInAppBrowser() {
    var url = "外部サイトのURL";
    var target = "_blank";
    var options = "location=yes";

    var inAppBrowserRef;
    inAppBrowserRef = cordova.InAppBrowser.open(url, target, options);
    inAppBrowserRef.addEventListener('message', messageCallBack);
  }

  function messageCallBack(params){
    // メッセージ受信後にアプリ側で実行する処理
    alert("message received (type): " + params.type);
    alert("message received (data): " + params.data.my_message);
  }
</script>
```

## 外部サイト側の設定例

```html
<body>
  <input type="button" value="sendMessage" onclick="sendMessage()" />
</body>
```

```html
<script>
  function sendMessage() {
    var message = 'message event test';
    var messageObj = { my_message: message };
    var stringifiedMessageObj = JSON.stringify(messageObj);
    webkit.messageHandlers.cordova_iab.postMessage(stringifiedMessageObj);
  }
</script>
```


## 解説

送信するデータは、オブジェクトをJSON文字列に変換した値になります。上の例で言うと `JSON.stringify(messageObj)` になります。

アプリ側がコールバック関数で取得したデータ（params）は、JSON形式のオブジェクトになります。オブジェクトには、`type` と `data` の値が含まれています。

メッセージを受信した際のtypeの値は、`message` になります。送信されたデータは、dataに含まれています。`params.data.my_message` で、送信されたデータを取得することができます。


# おわりに

InAppBrowserで表示している外部サイトから直接cordovaの機能を呼び出す事はできませんが、このmessageイベントを使用する事で、メッセージ受信後にアプリ側でCordovaプラグイン等のCordovaの機能を呼び出すことができます。

このmessageイベントは、InAppBrowserで表示している外部サイトとアプリを繋ぐ便利なイベントです。一度、messageイベントを利用してみてください。
VScode上でRailsのステップデバックする方法

## 初めに

今までbinding.pryでデバックしていたのですが、下記の手順を踏むのでデバックに時間がかかる。
> 
1. 処理を止めたい所にbinding.pryを打ち込む
2. 処理を止める。
3. 確認後binding.pryを消す。
4. 次の処理を見たい時はこれを繰り返す。

VScodeでデバックすると
>
1. 止めたい処理の所にブレイクポイントを貼る（複数貼る事が出来る。）
2. デバックの開始ボタンを押す。
3.処理を止める。

となり、binding.pryを書かない事、複数箇所ブレイクポイントを貼る事が出来るので、効率化を測れる。


## インストール
下記を記述してインストール
- ruby-debug-ide
- debase


```ruby:Gemfile
group :development do
  gem 'ruby-debug-ide'
  gem 'debase'
end
```
```ruby:ターミナル
bundle install
```

## VScode上で設定
1. VScodeの左にあるてんとう虫みたいなアイコンをクリック。
2. 右下にcreata alaunch.json file.


[![Image from Gyazo](https://i.gyazo.com/b4b4e8b6c7f7a950b407616ecdebc5bb.png)](https://gyazo.com/b4b4e8b6c7f7a950b407616ecdebc5bb)



3.下記の画面になるのでRubyを選択
[![Image from Gyazo](https://i.gyazo.com/a6fe1f96292b803d185e7e6b717993ae.png)](https://gyazo.com/a6fe1f96292b803d185e7e6b717993ae)

4.選択したら.vscodeディレクトリが現れる。
[![Image from Gyazo](https://i.gyazo.com/0171c8214ceb2db7ad4fcbc0a662c575.png)](https://gyazo.com/0171c8214ceb2db7ad4fcbc0a662c575)

5  .vscode/launch.jsonに下記を記述

```ruby:.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Rails server",
      "type": "Ruby",
      "request": "launch",
      "program": "${workspaceRoot}/bin/rails",
      "args": [
        "server"
      ],
      "useBundler": true,
    }
  ]
}
```


## 使い方

1.  見たい処理の所にブレイクポイントを貼る
[![Image from Gyazo](https://i.gyazo.com/05059173a5f9a924f2e7f2a47c503ebf.png)](https://gyazo.com/05059173a5f9a924f2e7f2a47c503ebf)

2. 実行をクリックするとデバックコンソールが立ち上がる
[![Image from Gyazo](https://i.gyazo.com/671ee64a961431b18aa3c12222275374.png)](https://gyazo.com/671ee64a961431b18aa3c12222275374)

3.処理を止めて値を確認。
左に飛んできている値を見る事が出来て、右上のスッテプオーバーをクリックすると次の処理の値を確認出来る。
[![Image from Gyazo](https://i.gyazo.com/241790a4f4322ff6989f47ab8224616a.png)](https://gyazo.com/241790a4f4322ff6989f47ab8224616a)

[![Image from Gyazo](https://i.gyazo.com/0031f608bb59e82030af6b55998fc213.gif)](https://gyazo.com/0031f608bb59e82030af6b55998fc213)



### 参考記事
[Visual Studio Code の デバッガ で Rails のデバッグをする](https://obel.hatenablog.jp/entry/20190714/1563055200)
CentOS7 でのディスク拡張方法 再起動なし

毎回ググりながらになってるのでメモ
CentOS Linux release 7.7.1908 (Core)
インストーラーそのままでインストールして、LVM、XFSは利用している前提。
コマンドの意図はググってください。あくまで自分がやったログを書いているのみです。
起動中の環境から認識さえしてくれれば再起動する必要ないはずです。


growpartコマンドは初期で入ってないのでインストール

```
yum -y install cloud-utils-growpart
```

まず何もしていない状態。元ストレージを16GB->512GBまで拡張した。(今回はESXiゲストだった)

```
# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  512G  0 disk
  sda1            8:1    0    1G  0 part /boot
  sda2            8:2    0   15G  0 part
    centos-root 253:0    0 13.4G  0 lvm  /
    centos-swap 253:1    0  1.6G  0 lvm  [SWAP]
sr0              11:0    1  942M  0 rom
```

まずパーテーションを拡張。

```
# growpart /dev/sda 2
CHANGED: partition=2 start=2099200 old: size=31455232 end=33554432 new: size=1071642591 end=1073741791
# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  512G  0 disk
  sda1            8:1    0    1G  0 part /boot
  sda2            8:2    0  511G  0 part            # <--  変わった
    centos-root 253:0    0 13.4G  0 lvm  /
    centos-swap 253:1    0  1.6G  0 lvm  [SWAP]
sr0              11:0    1  942M  0 rom
```
LVMの拡張
pvresizeでLVMが認識するディスク領域を拡張
lvextend で空いてる領域を全て```/dev/centos/root```へ割当。環境によって名前違うので、lsで先に見ておくこと
LVM使ってなければこのあたりは飛ばす(type がpartのみの場合)

```
# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
# lvextend -l +100%FREE /dev/centos/root
  Size of logical volume centos/root changed from 13.39 GiB (3429 extents) to 509.39 GiB (130405 extents).
  Logical volume centos/root successfully resized.
# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   512G  0 disk
  sda1            8:1    0     1G  0 part /boot
  sda2            8:2    0   511G  0 part
    centos-root 253:0    0 509.4G  0 lvm  /           # <--  変わった
    centos-swap 253:1    0   1.6G  0 lvm  [SWAP]
sr0              11:0    1   942M  0 rom
```

最後にXFSの拡張
LVM使ってる場合は/dev/mapperあたりに当てられてるはず。
なければ/dev/sda3 等に直接xfs_growfs投入

```
# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=877824 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=3511296, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 3511296 to 133534720
```

XFSの拡張は書き込み速度とサイズ次第で少し時間がかかる時がある。
16GB->512GBの拡張した際は10秒ほどかかった。
geom_logoによる配列ロゴの表示

#目的
アライメントした塩基配列を得た時に、配列のどの部位にどんな塩基が保存されているかを`geom_logo`を使って`r`上で視覚的に表示させる。今回は、アライメントされた`fasta`形式のファイルを使う。下は結果の一例、位置4-6においてCAT配列が保存されているのが分かる。こういうのを配列ロゴ(Sequence logo)と呼ぶらしいのだが何でlogo?。
![test_bits.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564846/76266c29-464b-4a75-24c7-04e0535cc99e.png)
#準備
必要なパッケージをインストール。今回は、fasta形式のファイルを読み込む`read.fasta`も使うので`seqinr`もインストール。

```{r}
install.package("ggplot2");install.package("ggseqlogo");install.package("seqinr")
```

Alignmentされたfasta形式のファイルを適当に用意

```{}
>seq1
-GTCGA
>seq2
GGACG-
```

#サンプルプログラム
```{r}
require(ggplot2)
require(ggseqlogo)
require(seqinr)

setwd("C:/Users/hogehoge/") #適当な位置を指定
data <- read.fasta("test_align.fas", seqtype = "DNA", as.string = TRUE)#自分で用意したfastaファイル名を入力
data_m <- list(toupper(c(data[1:length(data)])))

#plot
ggplot() + 

##graphic parameter
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black")) +

geom_logo(data_m, seq_type = "dna", method = "probability")
```

#表示方法
`geom_logo`は表示形式を、`bits`形式と`probability`形式の二つから選べる。
###`bits`形式
`bits`形式では、配列の偏りを表示の高さで示してくれるため、どの位置で配列が偏っているか、つまりは保存されているかが一目で分かる。各位置での高さは、エントロピーの最大値から各位置でのエントロピーを引いた値となる。エントロピーの最大値は、DNAやRNA配列などの塩基4種類であれば$log_2 (4)$、タンパク質などでアミノ酸20種類の場合は$log_2 (20)$となる。各位置でのエントロピー$H_i$は、$H_i=-\sum_{i=a,t,g,c}P_ilog_2 Pi$で表される。$P_i (0\leqq P_i\leqq1)$は、各位置での各塩基の出現頻度。
![test_bits.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564846/690592bf-b955-9087-9b49-84df15dd7afc.png)


###`probability`形式
`probability`形式は、各位置での各塩基の出現確立に応じた表示をしてくれる。なので、bit形式で表示させると文字が潰れてしまうような位置10などにおいてどんな塩基が使われているのかも分かる。
![test_prop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564846/36c3d389-a9c4-4ca8-cbe7-78c43c6d30f8.png)
13日の金曜日(3桁) (paizaランク C 相当)

[問題文](https://paiza.jp/works/mondai/dateset/friday_13_3?language_uid=c-sharp&t=e81f237465cfbbc0e5984cb9035edcb9)
[YouTubeのYouTubeの解説動画を視て書いたコード](https://www.youtube.com/watch?v=e6aLkR7QDCc)

```c#
static void Main(string[] args)
        {
            int all = 0;
            int friday = 0;
            Random random = new Random(123456);
            for (int i = 0; i < 1000000; i++)
            {
                int year = random.Next(DateTime.MinValue.Year,DateTime.MaxValue.Year + 1); //無作為に選ぶ
                int month = random.Next(1, 13); //無作為に選ぶ
                //year年month月13日が金曜日ですか？
                DateTime date = new DateTime(year, month, 13);
                if(date.DayOfWeek.Equals(DayOfWeek.Friday) )
                {
                    friday++;
                }
                all++;
            }
            double result = (int)(((double)friday / all) * 1000) / 1000.0;
            Console.WriteLine(result);
            
        }
````
PDFを印刷したらフォントが変

最近OSをCatalinaにアップデートしました。Sidecarがとても便利ですね！

OSを変更してから初めてPDFを印刷しようとしたところ，以下の2つの問題が起こりました。（使用プリンタ：OKI の MC843）
1. プリンタジョブ画面で "Stopped Filter Failed" というエラーが出て，印刷できない
2. 印刷物のフォントが変（以下の画像）
![Screen Shot 2020-03-22 at 4.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514026/60e3259c-6c74-9b83-391f-31dbe09609ec.png)

## 1. 「エラー "Stopped Filter Failed"」の解決方法
プリンタを一旦削除，追加し直して再起動で解決。
　参考：[Solved: Printing Pdf - error "Stopped Filter Failed" or Stopped - Unable to convert PostScript file](https://h30434.www3.hp.com/t5/Printers-Archive-Read-Only/Printing-Pdf-error-quot-Stopped-Filter-Failed-quot-or/td-p/5933094)

## 2. 「フォントが変」の解決方法（？）
[OKI の Webサイト](https://www.oki.com/jp/printing/support/drivers-and-utilities/colormfp/MC843DNW/)からドライバをインストールして解決しました。
解決したのに，サブタイトルを「解決方法(？)」としたのは，次のような気になることがあるからです。
###気になること
1つ気になるのが，macOS ユーザーガイドの[Macでプリンタを追加する-Apple サポート](https://support.apple.com/ja-jp/guide/mac-help/mh14004/mac)によると，
>"プリンタに付属のソフトウェアや、製造元のWebサイトからのソフトウェアをインストールしないでください。"

とあるんですよね。理由が書いていないのですが，セキュリティの問題でしょうか...？ご存知の方はコメントいただけると嬉しいです。

なお，このユーザーガイドの通りにプリンタを追加すると，自動でドライバが AirPrint に選択されます。AirPrint でもうまく印刷できるファイルもありますが，ファイルによってはフォントを埋め込んでも，ビュワーを変えても上の画像のようなフォントになってしまうのです。

私自身，やらないでくださいと言われていること(製造元のWebサイトからのソフトウェアをインストール)をやっていいと思える根拠もなくやりたくないのですが，フォントが変すぎて読めたもんじゃないので試しました。なので試すか試さないかは自己責任でお願いします╰(╰.ω.)╯

##おわりに
「フォントが変！」の他の解決方法や，"製造元のWebサイトからのソフトウェアをインストールしないでください"の理由をご存知の方，コメント等いただけますと嬉しいです！
メモ: Playwright

## 起動まで

```sh
apt install -y npm

npm i playwright
```

* https://github.com/microsoft/playwright/blob/master/docs/examples/README.md

```a.ts
# firefoxの起動・終了
const { firefox } = require('playwright');
(async () => {
  const browser = await firefox.launch();
  await browser.close();
})();
```

```sh:実行方法
nodejs a.ts
```

## 例

* https://github.com/microsoft/playwright/blob/master/docs/api.md

### URLを指定し画面キャプチャ

```ts
const { firefox } = require('playwright');
(async () => {
  const browser = await firefox.launch();

  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://www.google.com/');
  await page.screenshot({ path: '1.png' });

  await browser.close();
})();
```


### formに入力しEnter

* https://stackoverflow.com/questions/60376488/logging-in-to-google-with-playwright-in-a-ci-environment

```ts
const { firefox } = require('playwright');
(async () => {
  const browser = await firefox.launch();
  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://www.google.com/');

  await page.type("input[name='q']", "日本語");
  await page.keyboard.press("Enter");
  // ページ読み込みを待つ
  await page.waitForNavigation();

  await page.screenshot({ path: '1.png' });
  await browser.close();
})();
```
【編集中】TFSをREST APIで操作したい！！

# TODO
- [ ]  PAT作成
- [ ]  PowerShellでビルド実行
- [ ]  PowerShellでビルド定義一括取得＆一覧作成

# はじめに
今までは、Chromeでサイトにアクセスして手動で操作していたのですが、そろそろ面倒になってきたので、設定や操作等は自動化していきたいということで...
当初はTFSのコマンドで操作しようと思っていたのですが、調べてみたらREST APIによる操作があるということで、勉強も兼ねて

## ビルド定義
```powershell:GetBuildDefinitions.ps1
# Get Build Definitions (api-version = 2.0)
#   https://docs.microsoft.com/ja-jp/azure/devops/integrate/previous-apis/build/definitions?view=tfs-2015#get-a-list-of-build-definitions
$getRequestUrl = "http://192.168.119.217:8080/tfs/Development/AtHomeDev/_apis/build/definitions?api-version=2.0"
 
# Call the REST API using Invoke-RestMethod. -UseDefaultCredentials for using windows authentication
#   ※TFS 2015 doesn't support Personal Access Tokens, this feature was introduced with TFS 2017
$json = Invoke-RestMethod -UseDefaultCredentials -uri $getRequestUrl
ConvertTo-Json $json
```
```powershell:TFS_DeleteBuildList.ps1
Param(
   [string]$collectionurl = "http://172.27.194.176:8080/tfs/Development",
   [string]$projectName = "ScrumProject",
   [string]$builddefinitionID = "1",
   [string]$keepForever = "true",
   [string]$user = "username",
   [string]$token = "password"
)


#Get builds list which completed in the year 2017
$buildsUrl = "$($collectionurl)/$projectName/_apis/build/builds?definitions=$builddefinitionID&statusFilter=completed&api-version=2.0"   
#$builds = (Invoke-RestMethod -UseDefaultCredentials -Uri $buildsUrl -Method Get) | where({$_.finishTime -like '*2023*'})

$builds = (Invoke-RestMethod -UseDefaultCredentials -Uri $buildsUrl -Method Get)
#$builds.values.properties.finishTime[2]
#ConvertTo-Json $builds

#Write-Host "Builds deleted with the ID" : $builds.value

#Delete the builds 
foreach ($build in $builds.value.id)
{
    Write-Host $build
    $deleteurl = "$($collectionurl)/$projectName/_apis/build/builds/$build"+"?api-version=2.0"

    $result = (Invoke-RestMethod -UseDefaultCredentials -Uri $deleteurl -Method Delete)

    Write-Host "Builds deleted with the ID" : $build 
}
```

# 参考サイト
◆Azure DevOps Services REST API Reference
　https://docs.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-5.1&viewFallbackFrom=vsts-rest-2.3
　　※最初に見るサイト

◆REST API Overview for TFS 2015, 2017, and 2018 (RTW and Update 1)
　https://docs.microsoft.com/ja-jp/azure/devops/integrate/previous-apis/build/builds?view=tfs-2015#update-a-build
　　※公開されているAPIを見る限りは、自分がやりたいことは全部できるはず。。。

◆Visual Studio Team Services CI/CDアドベントカレンダー：PowerShellでビルド実行(8日目)
　https://kkamegawa.hatenablog.jp/entry/2017/12/08/232655
　　※第一弾として、これをやってみたい！！
◆invoke-vstsbuild.ps1
　https://gist.github.com/kkamegawa/fed4b31082f53dac70f2d0f069651e40
　　※参考となるPowerShellコード

◆Authenticate access with personal access tokens
　https://docs.microsoft.com/ja-jp/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=preview-page&viewFallbackFrom=tfs-2015
　　※やるにしても、認証どうするんだ!?と思って調べた結果、このPATを利用するということで

◆Modifying TFS2015 build definitions using Powershell
　https://blogs.infosupport.com/modifying-tfs2015-build-definitions-using-powershell/
　　※これができれば、最終的には自動化も見えてくる
初心者によるプログラミング学習ログ 269日目

#100日チャレンジの269日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
269日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>269日目<br>・webサイト模写<br>・下層ページ　4ページ目作成<br><br>CSSの設計手法ってなにがいいんだろ？<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1241461715771904000?ref_src=twsrc%5Etfw">March 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Unity ECSで自前Worldを複数動かす

【Unity2019.1】Entity Comonent Systemで自前Worldを作成する方法【ECS】
https://qiita.com/pCYSl5EDgo/items/fd08d54422b232b92e28

現在のUnity ECSで複数の自前Worldを動かせるようになっていたので、こちらの記事を参考にしつつ方法をまとめます。

# 環境
- Unity 2019.3.5f1
- DOTS Editor 0.4.0-preview
  - Entities 0.8.0-preview.8

# デフォルトのWorld生成を無効にする
`Project Setting`>`Player`>`Scripting Define Symbols`に
`UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP`を追記してください。
セミコロンでシンボルを複数指定できます。

# 自前Worldを動かす
```C#
var world = new World("MyWorld");

var systemTypes = new List<Type>();
systemTypes.Add(typeof(HogeSystem));
systemTypes.Add(typeof(FugaSystem));
systemTypes.Add(typeof(AwesomeSystem));
// ルートの3つのComponentSystemGroupにSystemを登録してくれる便利なメソッド
DefaultWorldInitialization.AddSystemsToRootLevelSystemGroups(world, systemTypes);

ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world);
```
UpdatePlayerLoopを呼ぶことで自前Worldを動かすことができます。
AddSystemsToRootLevelSystemGroupsはデフォルトWorldにSystemを登録する際に使用されていますが自前Worldでも使えます。

# 自前Worldを追加する
```C#
var worldA = new World("MyWorldA");
var worldB = new World("MyWorldB");
var worldC = new World("MyWorldC");

// Systemなど登録

ScriptBehaviourUpdateOrder.SetPlayerLoop(PlayerLoop.GetDefaultPlayerLoop());
foreach(var world in World.All)
    ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world, ScriptBehaviourUpdateOrder.CurrentPlayerLoop);
```
UpdatePlayerLoopには、既存のPlayerLoopにWorldの更新処理を挿入するためのパラメータがあるので、CurrentPlayerLoopを指定してあげましょう。
https://docs.unity3d.com/Packages/com.unity.entities@0.8/api/Unity.Entities.ScriptBehaviourUpdateOrder.html#Unity_Entities_ScriptBehaviourUpdateOrder_UpdatePlayerLoop_Unity_Entities_World_System_Nullable_PlayerLoopSystem__

# まとめ
APIが大幅に変わってたりしてわからん。日本語の情報がまだまだ少なくてわからん。なんもわからん。
(デフォルトでCurrentPlayerLoop.subSystemListがnullなのはバグですか…？)