OmniAICreator/Qiita-1.07M huggingface dataset:
分割統治法と動的計算法（divide-and-conquer & dynamic-programming）

#分割統治法と動的計算法

個人用メモです。

##分割統治法

###分割統治法とは？
大きく難しい問題を細かく区切り、個々の解を求めたあとで、全体の答えを求める方法。

英語だと、divide-and-conquer method。

プログラミングでは**再帰法を用いた処理**が分割統治法にあたる。

自身の関数を処理の中に使うことで、処理を小分け(divide)し、それらを足し合わせるなどして答えを求め（conquer）ている。

**▼n!を求める処理**
1 * 2 * 3 * 4 *,,,,

```python:.py
def factorial(n):
  if n==1:
    return 1
  return n*factorial(n-1)
```

問題をnとf(n-1)に分割し、個々の答えを求めたあとで全体の答えを求めている。


<br>
**▼フィボナッチ数列を求める処理**
1, 1, 2, 3, 5, 8, 13, 21, 34, 55,,,


```python:.py
def fib(n):
  if n==1 or n==2:
    return 1
  return fib(n-1) + fib(n-2)
```

問題をf(n-1)とf(n-2)に分割している。個々の答えを求めたあとで全体の答えを求めている。

```python:処理の確認
n=40
for i in range(1, n):
  print(fib(i))
```

これを実行すると比較的時間がかかる。
これは、fib(n-1)とfib(n-2)の中でそれぞれ**同じ計算を個別に計算している**ためである。

fib(n-2)の方が一足先に計算をしてるのだから、その**解をfib(n-1)にも応用**すれば、計算時間をグッと減らすことができる。

この画期的な方法を**動的計画法**という。




<br>
##動的計画法

###動的計画法とは？
一度計算した結果をメモリに保存し再利用することで計算時間を短縮する手法。

分割統治法は個々の問題を上から順に計算していく。トップダウン型。

これに対し、動的計算方は端々の計算結果を先に求め、その結果を用いて計算していく。ボトムアップ型。


>関連用語
・dynamic programming：　英語名
・メモ化：　計算処理をメモリに保存すること。


###実際の方法

・計算結果メモリ保存用の配列を用意する。
　　┗ 初期値は必要な要素数だけ空（None）要素を持った状態にする 
　　┗ グローバル変数にならないよう、関数内に入れる
・指定した要素がNoneなら、計算して代入。


```python:
#変数のみだとmemoがグローバル変数になるため、defで囲みローカル変数にする
def fib_memo(n):
  #関数処理が終わっても値が残るようfib(n)の外に出す
  memo = [None]*(n+1)  #n+1個の空要素が入った配列を用意

  def _fib(n):
    if n==0 or n==1:
      return 1
    if memo[n] != None:  #指定した値の要素がNone以外なら、その値を利用（※初期値は全てNone）
      return memo[n]
    memo[n] = _fib(n-1) + _fib(n-2) #Noneの場合は足し合わせた数値を代入
    return memo[n]
  
  return _fib(n)
```

```python:確認
n=40
for i in range(0, n):
  print(fib_memo(i))
```

・None：空であることを明示（noneオブジェクト）
・_関数名: ローカルでのみ使用する関数を示唆

計算処理はかなり早くなる。



##動的計画法（再帰法を使わない）
再帰法を使わずに、メモリ保存用の配列を使って求めることも可能。

```python:
def fib_dp(n):
  memo = [None]*n
  memo[0] = 1
  memo[1] = 1
  for i in range(2, n):
    memo[i] = memo[i-1] + memo[i-2]
  return memo
```


<br>
##分割統治法と動的計画法まとめ

<分割統治法>

- divide-and-conquer
- 大きな問題を小さく小分けする
- トップダウンで処理する
- 同じ処理を個別に実行する可能性がある（×）


＜動的計画法＞

- dynamic-programming
- 計算結果をメモリ記憶用の配列に保存する
- ボトムアップの処理
- 同じ処理が複数回生じる場合に、大幅な効率化ができる
RubyでのTSVファイルとCSVファイルの取り扱い方

#はじめに

この記事では、Rubyにおいて、TSVファイルやCSVファイルを扱う上での基礎知識を、myメモ的な感じでまとめました。TSV,CSV以前に、Fileクラスについても一緒に確認できればと思います。

###TSVファイルとは
タブ区切りでデータが格納されたファイル

###CSVファイルとは
コンマ( , )区切りでデータが格納されたファイル

###本記事では以下のTSVファイルを例にあつかいます
~~~
# meibo.txt
john	m	18
paul	m	20
alice	f	15
dabid	m	17
jasmin	f	17
~~~

#Fileクラスについて
##ファイルを開く

~~~ruby
#書き方１
File.open("meibo.txt") do |file|
  処理
end

#書き方２
file = File.open("meibo.txt")
  処理
file.close
~~~
書き方１はファイルを開いても勝手に閉じてくれますが、書き方２では`close`メソッドをしないとファイル開きっぱなしです。なので、書き方１の方が個人的には好きです。

~~~ruby
File.open("meibo.txt") do |file|
  puts.file
end
~~~

例えば、上記のようにすると、以下のようなFileオブジェクトの標準出力を得ます。

~~~
#<File:0x00007fba4497ea68>
~~~
##ファイルを読み込む
開いたファイルは、読み込んだりします。

~~~ruby
File.open("meibo.txt") do |file|
  p file.read
end
~~~

すると、以下のような標準出力になります。

~~~ruby
"john\tm\t18\npaul\tm\t20\nalice\tf\t15\ndabid\tm\t17\njasmin\tf\t17\n"
~~~

いきなり読み込んでも大丈夫です。

~~~ruby
file = File.read("meibo.txt")
p file

#=>
"john\tm\t18\npaul\tm\t20\nalice\tf\t15\ndabid\tm\t17\njasmin\tf\t17\n"
~~~

一行ずつ読みたい場合、以下のように、一度ファイルを開いて、その処理の部分で、一行ずつ読ませて、好きな処理を入れます。

~~~ruby
File.open("meibo.txt") do |file|
  file.each do |line|
    処理
  end
end

#例えば

File.open("meibo.txt") do |file|
  file.each do |line|
    p "#{line.chomp}\tfoo"
  end
end

#=>
"john\tm\t18\tfoo"
"paul\tm\t20\tfoo"
"alice\tf\t15\tfoo"
"dabid\tm\t17\tfoo"
"jasmin\tf\t17\tfoo"
~~~

以上がFileクラスでの扱い方ですが、出力が数珠つなぎの文字列になっているので、少々扱いづらいかと思います。そこで、CSVクラスを使用することで、データを扱いやすくすることができます。

#CSVクラスについて
本来CSVファイルを扱うためのクラスだと思いますが、`col_sep`オプション（指定した文字列で区切ってくれる）を使うとTSVファイルもCVSクラスで扱えます。CSVクラスを使用するときは行頭に`require "csv"`を付けます。

~~~ruby
require "csv"

#openメソッドを使うなら
CSV.open("meibo.txt", col_sep: "\t") do |tsv|
  p tsv.read
end

#openメソッドを使わないなら
tsv = CSV.read("meibo.txt", col_sep: "\t")
p tsv

#=>
[["john", "m", "18"], ["paul", "m", "20"], ["alice", "f", "15"], ["dabid", "m", "17"], ["jasmin", "f", "17"]]
~~~

CSVメソッドを用いて読み込むと、出力結果は配列に入れて返されます。
こうすることで、データとして扱いやすくなります。
一行ずつ読ませたいなら以下の`foreach`メソッドを使います。

~~~ruby
require "csv"

CSV.foreach("meibo.txt", col_sep: "\t") do |line|
  処理
end

#例えば
CSV.foreach("meibo.txt", col_sep: "\t") do |line|
  p line
end

#=>
["john", "m", "18"]
["paul", "m", "20"]
["alice", "f", "15"]
["dabid", "m", "17"]
["jasmin", "f", "17"]
~~~
こうすることで、各行ごとに配列に対して処理を行うことができます。

ちなみに、もちろんですが、新たにCSVファイルを開いて、そこに書き込むこともできます。

~~~ruby
require "csv"

CSV.open("meibo.csv","w") do |line| #"w"は書き込みモード
 line << ["michel","m",16]
end

# meibo.csv
michel,m,16
~~~

#TSVをCSVに変換
最後に、これまでにご紹介した構文を使って、TSVファイルをCSVファイルに変換できます。
いきなり結論ですが、以下です。

~~~ruby
require "csv"

CSV.open('meibo.csv', 'w') do |csv|
  CSV.foreach("meibo.txt", col_sep: "\t") do |line|
   csv << line
 end
end
~~~

まず、書き込みモードでCSVファイルを用意します。そのCSVファイルに、`foreach`でTSVファイルの各行を一行ずつCSVに格納して行くという、流れです。
CSVからTSVについてもこの逆を行えばOKです。

#さいごに
Fileクラスは最初はちょっとよくわからなかったんですが、この記事書きながら頭の中整理できたので、これからもどんどん使っていこうと思います。
【python】フィボナッチ数列を求めるプログラム（再帰関数、分割統治法、動的計画法）

##フィボナッチ数列を求めるプログラム
フィボナッチ数列のn項目を求めるプログラムを複数の記述で書いてみる。

###フィボナッチ数列とは？
２つ前の項と１つ前の項を足し合わせていくことでできる数列。


```
1,1,2,3,5,8,13,21,34,55,,,,,,
```

足していくと大きな長方形ができていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/94e4fa7f-390b-77f8-1b2a-dc064246f4c1.png)

アンモナイトの渦巻や宇宙などだんだん大きくなる渦巻がフィボナッチ数列。

スティール・ボール・ランの黄金の長方形もフィボナッチ数列。



<br>
##【方法１】メソッドの活用

```python:
def fib(n):
  arr = [1,1]
  for j in range(n-1):
    val = arr[j] + arr[j+1] 
    arr.append(val) 

  return (arr[len(arr)-1])
```

```:確認
n=35
for i in range(1, n):
  print(fib(i))
```




<br>
##【方法２】再帰処理を使う
関数の中で自身の関数を呼び出す、再帰処理(recrusive process)を使う。

forで指定条件を満たすまで繰り返すのと似ていて、return条件に該当するまで、同じ処理を繰り返す。


```python:
def fib(n):
  if n==1 or n==2:
    return 1
  return fib(n-1) + fib(n-2)
```

```python:
#確認
n=35
for i in range(1, n):
  print(fib(i))
```

この処理は比較的時間がかかる。
これは、fib(n-1)とfib(n-2)の中でそれぞれ**同じ計算を個別に計算している**ためである。

fib(n-2)の方が一足先に計算をしてるのだから、その解をfib(n-1)にも応用すれば、計算時間をグッと減らすことができる。

この画期的な方法を**動的計画法**という。


<br>
##【方法３】動的計画法を使う（再帰法）

```python:
#変数のみだとmemoがグローバル変数になるため、defで囲みローカル変数にする
def fib_memo(n):
  #関数処理が終わっても値が残るようfib(n)の外に出す
  memo = [None]*(n+1)  #n+1個の空要素が入った配列を用意

  def _fib(n):
    if n==0 or n==1:
      return 1
    if memo[n] != None:  #指定した値の要素がNone以外なら、その値を利用（※初期値は全てNone）
      return memo[n]
    memo[n] = _fib(n-1) + _fib(n-2) #Noneの場合は足し合わせた数値を代入
    return memo[n]
  
  return _fib(n)
```

```python:確認
n=40
for i in range(0, n):
  print(fib_memo(i))
```

・None：空であることを明示（noneオブジェクト）
・_関数名: ローカルでのみ使用する関数を示唆

計算処理はかなり早くなる。



<br>
##【方法４】動的計画法（for文）

再帰法ではなく、メモ法で小さい数値から一つづつ計算していくパターンも可能。

```python:
def fib_dp(n):
  memo = [None]*n
  memo[0] = 1
  memo[1] = 1
  for i in range(2, n):
    memo[i] = memo[i-1] + memo[i-2]
  return memo
```
bigqueryで日付の加減算が算術演算子でできるようになった！


タイトルの通りですが、以下のようなコードで未来や過去の日付を指定できるようになったようです。
これはまじありがたい！良アップデート！

[詳細はこちら](https://cloud.google.com/bigquery/docs/reference/standard-sql/operators#date_arithmetics_operators)


## 未来日付を求める場合（DATA_ADDの代替）

```sql

SELECT '2020-10-15' + 1 AS next_date
```

実行結果
![スクリーンショット 2020-10-15 13.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/bda13fee-1d62-3ba1-1774-76def67ba18b.png)

アップデート前のコードはこんな感じ。

```sql

SELECT DATE_ADD(DATE "2020-10-15", INTERVAL 1 DAY) as next_date
```


## 過去日付を求める場合（DATA_SUBの代替）

過去日付の場合は、

```sql

SELECT '2020-10-15' - 365 AS last_year
```

実行結果
![スクリーンショット 2020-10-15 13.34.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/efdedbc1-64a9-8836-f54e-94e99fdd2076.png)

アップデート前のコードはこんな感じ。

```sql

SELECT DATE_SUB(DATE "2020-10-15", INTERVAL 1 YEAR) as last_year;
```

この場合、閏年を挟む場合(2月が29日になる)は1日考慮がずれちゃって、結果は以下のようになりました。
この点は注意必要なところ。
![スクリーンショット 2020-10-15 13.40.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/50070ffa-8a91-6ade-8350-9c266fd95d82.png)


### まとめ

関数を使うのって、その環境で一定以上の慣れが必要なので、たまーに触る。ぐらいだとすぐ忘れちゃうので、使うときにググるか、コードをメモっておいてコピペする。というパターンが多いのではと思いますが、今回のアップデートのおかげで感覚的に日付の加減算できるので、まじありがたい限りです！

ただし、過去日付のところで触れましたが、**INTERVALでYEARを指定した場合で、閏年を挟む場合の考慮**は考える必要がありました。結果的に、日数指定したら1日ずれてしまう事件とかの罠もあるため、テストコードで使う場合は、算術演算子で利用。本番で稼働させる場合は、DATA_ADDやDATE_SUBなどの関数を利用する方が良いのかなとも思いました。
Spacemacs on Ubuntu on WSL2でcljstyleを使う


cf. [Clojure開発環境でのフォーマッターcljstyle設定まとめ: Spacemacs, IntelliJ IDEA (Cursive), VS Code (Calva)](https://qiita.com/lagenorhynque/items/a5d83b4a36a1cf1cacbe)


なおSpacemacs on Ubuntu18.04LTS on WSL2はMacのようにbrewからインストールできない
( `Installing casks is supported only on macOS`だった :innocent: )

[cljstyleのリリース一覧](https://github.com/greglook/cljstyle/releases)から実行可能ファイルをダウンロードして使う

```bash
# ダウンロードして解凍 (たとえばv0.13.0)
$ wget https://github.com/greglook/cljstyle/releases/download/0.13.0/cljstyle_0.13.0_linux.tar.gz
$ tar -xvzf cljstyle_0.13.0_linux.tar.gz
# もし~/.binディレクトリを使ってるならそこに移動すれば良さそう
$ mv cljstyle ~/.bin/
```
1コマンドでReact+Redux+TypeScriptアプリを作る

[Create React App](https://create-react-app.dev/)を利用すればReactアプリケーションの開発環境を1コマンドで作成できます。
また、Create React Appには様々なカスタムテンプレートが作成されており、Redux+TypeScriptなテンプレートも存在します。
それを利用することで、React+Redux+TypeScriptなアプリケーションをすぐに作成できます。

# 環境

以下のものをインストールしてください。

- Node.js（LTS推奨）
- yarn（利用するなら）

# create-react-app

`create-react-app` コマンドでReactアプリケーションを作成します。
その際、`--template redux-typescript` を付け加えて、React+Redux+TypeScriptなテンプレートを利用します。

``` :yarn未インストールの場合
npx create-react-app my-app --template redux-typescript
```

もしくは

``` :yarnインストール済みの場合
yarn create react-app my-app --template redux-typescript
```

コマンドを実行します。
以上でReact+Redux+TypeScriptアプリが作成できました。

ちなみに、カスタムテンプレートのリポジトリはこちら。
[GitHub - reduxjs/cra-template-redux-typescript: The official Redux+TS template for Create React App](https://github.com/reduxjs/cra-template-redux-typescript)
Redux公式のカスタムテンプレートなので安心ですね。

# 実行

試しに実行してみましょう。

```
cd my-app
```

作成したアプリのディレクトリに移動し、

``` :yarn未インストールの場合
npm start
```

もしくは

``` :yarnインストール済みの場合
yarn start
```

コマンドを実行します。
画像のようなページが表示されていれば成功です。

![react.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275137/4657ac16-e489-c7d5-12f2-c301ccf11df1.png)

# 構成

このコマンドで作成されたアプリの構成について説明しておきます。
以下の内容は全て、作成した開発環境に含まれています。

## React

Reactとは、ユーザーインターフェースのためのJavaScriptフレームワークです。
[Reactの公式ページ](https://ja.reactjs.org/)は日本語化されており、読みやすく最新の情報が得られるので、学習にオススメです。

## react-scripts

`create-react-app` コマンドで作成されたアプリは、デバッグ実行やビルドなど、全て[react-scripts](https://www.npmjs.com/package/react-scripts)というパッケージが管理しています。
[Create React Appの公式ページ](https://create-react-app.dev/)には、この開発環境が持つ機能や設定について記載されています。
本格的に開発を始める前に環境や設定を整備しておくことをオススメします。

## Redux

Reduxとは、JavaScriptが扱う状態フレームワークです。
[Reduxの公式ページ](https://redux.js.org/)ではReduxの基本概念が詳しく説明されており、FAQなども充実しています。

## Redux Toolkit

Redux Toolkitは、Redux公式のツールセットです。
これを利用することで、Reduxに関わる開発がかなり楽になります。
[Redux Toolkitの公式ページ](https://redux-toolkit.js.org/)で使い方を学んでください。

## React Redux

ReactとReduxをうまく連携して利用するための機能がまとめられているライブラリです。
[React Reduxの公式ページ](https://react-redux.js.org/)に書かれている内容は**古いものが多い**です。（2020年10月現在）
今から開発を始めるなら、関数コンポーネントで`useSelector()`と`useDispatch()`のフックを使うのが基本になります。

## TypeScript

JavaScriptに静的型付け機能を付け加えたプログラミング言語です。

**2020年10月現在、TypeScript4.0がリリースされていますが、react-scriptsはTypeScript3.8までしか対応していません。
`create-react-app` コマンドでインストールされたTypeScriptのバージョンを上げてしまうと、ビルドに失敗するなどの不具合が発生します。（経験済み）**

TypeScriptについては、以下のようなページが参考になります。

* [TypeScript公式ページ](https://www.typescriptlang.org/)
* [TypeScript Deep Dive 日本語版](https://typescript-jp.gitbook.io/deep-dive/)
* [React TypeScript Cheatsheets](https://react-typescript-cheatsheet.netlify.app/)
Web Speech APIを使って、早口言葉ゲームをつくった

# 滑舌を改善するトレーニングの仕組み化を目指す

**「リモートワークが増えて、気づいたら最近全然人と話してなかった！」ってことはないでしょうか？**

私の場合、コロナによって、働き方も生活様式も大きく変わり、対面で人と話すことが劇的に減りました。もちろん、その分、オンラインで人と話すことは圧倒的に増えています。

でも、トータルすると、人と話す頻度って減ってないでしょうか？

それで、ふと思ったのが、

「話す機会が減ると、表情筋が固まる」
「表情筋が固まると、滑舌が悪くなる」
「滑舌が悪くなる、仕事のパフォーマンスが下がる」

ということです。

もちろん「滑舌が悪くなったって全く問題ない」という人はいいのですが、私の場合は、講師業をしているので、滑舌が悪くなると、仕事のパフォーマンスが確実に落ちます。

なので、定期的に滑舌トレーニングをする仕組みが欲しいなと思い、今年中につくることにしました。

以前、滑舌トレーニングのスクールに通っていたので、その時のトレーニングメニューをAI使って、自宅でもできるようにしたいと思っています。また、習慣化を楽しむという意味でも、ゲーミフィケーションを取り入れるつもりです。

今回も少し意識しました。


# その一歩目としてのプロダクト

今回作ったのがこちら。

[早口言葉ゲーム](https://nervous-sammet-2c14a7.netlify.app/)

こんな感じで使います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ようやくできたー！！早口言葉を言えたかどうか、音声認識が判定してくれます。<br><br>しかし、噛んで、収録をなんどもやり直したことは、内緒です。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98?src=hash&amp;ref_src=twsrc%5Etfw">#音声認識</a>　<a href="https://twitter.com/hashtag/WebSpeechAPI?src=hash&amp;ref_src=twsrc%5Etfw">#WebSpeechAPI</a> <a href="https://t.co/hLLDkjrfLD">pic.twitter.com/hLLDkjrfLD</a></p>&mdash; 柳瀬浩之@LX（Learning experience）デザイン (@btap_hiro) <a href="https://twitter.com/btap_hiro/status/1316586434371883008?ref_src=twsrc%5Etfw">October 15, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

あ、よく見たら、2秒ジャストじゃなく、1.99秒になってる。。
止める時間は調整が必要ですね。

これが結構難しいです。


# つくりかた

## Web Speech API

これを使うと、簡単に音声認識機能をWEBに追加することができます。

```javascript

window.SpeechRecognition = window.SpeechRecognition || webkitSpeechRecognition;
var recognition = new webkitSpeechRecognition();
recognition.lang = 'ja';

recognition.onresult = function (event) {
            //フォームに音声から値を入力
     let results = event.results;
     for (var i = event.resultIndex; i < results.length; i++){
     let mes = results[i][0].transcript;
     document.getElementById('resultText').innerHTML = mes;
     console.log(mes);
     }
}

```

上記に加えて、音声認識の正誤によって、反応が異なるようにするために、以下のif文を加えました。

```javascript
if (mes === "生麦生米生卵") {
   let img = document.getElementById("image_place");
   img.src = "image03.png";
   console.log("Yes");
} else {
   let img = document.getElementById("image_place");
   img.src = "image04.png";
   console.log("いいえ");
                }
```

これで、正誤によって、違う画像が表示されるようになりました。


## ストップウォッチ機能の作り方

こちらの記事を参考にさせていただき、実装しました。

[JavaScript：正確なストップウォッチを作る](https://torisky.com/javascript%EF%BC%9A%E6%AD%A3%E7%A2%BA%E3%81%AA%E3%82%B9%E3%83%88%E3%83%83%E3%83%97%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81%E3%82%92%E4%BD%9C%E3%82%8B/)

上記の参考サイトからコードを拝借した後、**２秒ジャストでストップウォッチを止め、止まると赤で表示される**ようにしました。

function startStop()の中に、

```javascript
setTimeout("startStop();colorChange()", 2006);
```
を追加した後、以下の、文字の色を変える関数を作りました。

```javascript
function colorChange(){
	document.getElementById("time").style.color = "red";
}
```

# 今後の滑舌トレーニングAIの開発について

今回のようなミニゲームをいくつか作っていきますが、face-api.jsなどの表情認識機能も使って、音声だけでなく、表情から表情筋が動いているかどうかの判定もできるようにしていこうと思います。

表情認識と音声認識を使って、自宅や職場で簡単に滑舌トレーニングができ、かつ、いまの生活の中にトレーニングを組み込んでいける仕組みを作っていこうと思います。

## もし気に入っていただければ、LGTMお願いします！！
セレクションバイアスを簡単に解説 

最初の投稿です。
統計や機械学習関連の記事を書いていく予定です。図を使い、初心者にもわかりやすい表現を心がけています。

今回は「効果検証入門　安井翔太　著　＋　株式会社ホクソエム　監修」という本の3~19ページまでの内容のダイジェストで、セレクションバイアスの理解を目的としています。

## セレクションバイアスとは

ビジネスでメール配信しようとすると、効率良く儲けることが頭にあるので、効果がありそうな人が選ばれてしまいます。このような偏った選択によって発生するバイアスがセレクションバイアスです。メールの本当の効果は、最初から実験と割り切りランダムに配信しないとわかりません。

下の例は、メール配信された人とメール配信されなかった人の購入額です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642427/da1e79fe-5363-08a3-4ef1-7f86c9c3c73f.png)

白いセルの金額は実際のメール配信の有無と逆の場合の金額なので観測できません。水色のセルの金額しか観測されないので、メールの効果は300円⇒600円と過大評価されてしまうかもしれません。ビジネス上の理由で「売上倍増！」と報告されてしまうかもしれません。
本当の効果は400円⇒500円です。これに気付かなければ（ランダムにメール配信をしなければ）サンプルを増やしてもメールの効果検証の精度は出ないのです。

以下はおまけです。式変形の自分用メモです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642427/db143820-d2af-d053-1253-65b8d2245e3a.png)
量子コンピュータ？5G通信網？ 世界を変える先進的AWSサービス5選

# はじめに
今回はAWSの先進的なサービスについて、5つほど紹介します！

[【YouTube動画】 意外と知らない！ AWS の世界を変える可能性をもつ5つのサービス！！](https://youtu.be/07AJ3NvoWdM)
[![意外と知らない！ AWS の世界を変える可能性をもつ5つのサービス！！](https://img.youtube.com/vi/07AJ3NvoWdM/0.jpg)](https://www.youtube.com/watch?v=07AJ3NvoWdM)

# AWS Ground Station
これは、人工衛星と通信する基地局をクラウド化したサービスです。
ただ登録するには、人工衛星のカタログ番号やアマチュア無線のライセンスが必要です。

人工衛星を使って、災害状況の確認をしたり、正確な地理情報を取得したりが簡単にできそうですね。

デモ動画はこちらです。
https://www.youtube.com/watch?v=KRWZA00skXo

# AWS RoboMaker
ROS用アプリケーションの開発環境やシュミレートができるサービスです。
C++やPythonでプログラムできるそうです。
AWS IoT Greengrassと連携すると、実機へのデプロイもできます。

もし始めるなら、以下のQiita記事とかわかりやすかったです！
https://qiita.com/nmatsui/items/6721c820000cf5115bdc

# Amazon Braket
Braketはbra-ket記法のBraketです。
予約制ですが、D-Wave, IonQ, Rigettiの3種の量子コンピュータを利用できるようです。
ローカルで実験する際は、Amazon Braket Python SDKなどが使えます。

# Amazon Connect
これはクラウド上にコールセンターを構築できるサービスです。
電話番号の取得やコールフローもGUIで簡単にできます。


# Amazon Wavelength
ボストン、サンフランシスコなどの一部地域でしか利用できませんが、5Gを利用できるサービスです。
リアルタイム性の高いコンテンツと相性が良いです。

# まとめ
今回はAWSの先進的なサービスについて紹介しました！
他にも面白いサービスがあるので、ぜひ遊んでみてください！

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
よく使うLinuxコマンド（初学者向け）

# はじめに
Linuxは世界中で使われているOSです。MacでもLinuxコマンドは使われますので、よく使うコマンドを一度まとめたいと思います。

# 今回紹介する　Linuxコマンド
* cd
* pwd
* mkdir
* touch
* ls
* rm
* rm -r

# 詳細
### cd
ディレクトリを移動する。(current directory)

```terminal:ターミナル
% cd /
=> /(ルートディレクトリ)へ移動
% cd
=> ~(ホームディレクトリ)へ移動
% cd appfolder
=> カレントディレクトリ内にappfolderというディレクトリがある場合はappfolderへ移動
% cd ..
=> 親ディレクトリ(カレントディレクトリの一段上のディレクトリ)へ移動
```

### pwd
今いるディレクトリを表示する。(pringt working directory)

```terminal:ターミナル
例) Desktopにいる時

% pwd
=> /Users/ユーザー名/Desktop
```

### mkdir
ディレクトリを作成する。(make directory)

```terminal:ターミナル
例)Desktopにいる時

% mkdir newfolder
=> Desktopにnewfolderというディレクトリが作成される
```

### touch
新しいファイルを作成する。

```terminal:ターミナル
例)Desktopにいる時

%  touch newfile
=> Desktopにnewfileというファイルが作成される
```

### ls
カレントディレクトリ内のファイルやディレクトリを一覧表示する

```terminal:ターミナル
例)ルートディレクトリにいる時

%  ls
=> Applications Systems Volumes cores...以下省略
```

### rm
カレントディレクトリ内のファイルを削除する

```terminal:ターミナル
例)Desktopにいて、Desktopにnewfileというファイルが存在する時

%  rm newfile
=> Desktop上のnewfileが削除される
```

### rm -r
カレントディレクトリ内のディレクトリを削除する。

```terminal:ターミナル
例)Desktopにいて、Desktopにnewfolderというディレクトリが存在する時

%  rm -r newfolder
=> Desktop上のnewfolderが削除される
```

# 最後に
本投稿が初学者の復習の一助となればと幸いです。
AndroidのListViewに文字が表示されないとお怒りのあなたへ　続編（もう私は焦らない）＝＝＞SimpleAdapterの使い方

#１．きっかけ
　斎藤新三著『Androidアプリ開発の教書(Kotlin版)初版第２刷』のp150の「２行のリストとSimpleAdapter]を写経していた際、ListViewに文字が表示されない（正確には、表示されているが、バックグラウンドと(ほぼ)同色で見えない）事象を発見したので報告します。この事象は先にご紹介した[ArrayAdapterの使い方](https://qiita.com/guijiu/items/bcdf296e7f792a618287)の場合と同様の原因と考えます。
　下の写真は、エミュレータAPIレベル19で動作させた状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/fc613f3e-07c3-4670-74f6-d70484faf1e9.png)

#２．対策
対策は本書のリスト7.3のSimpleAdapterの第１引数をapplicationContextからthisに変更します。

```kotlin
//リスト7.3抜粋
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ～省略～
        //SimpleAdapterを生成
        //　（元）val adapter = SimpleAdapter(applicationContext, menuList, android.R.layout.simple_list_item_2, from, to)
        val adapter = SimpleAdapter(this, menuList, android.R.layout.simple_list_item_2, from, to)
        //applicationContextからthisに変更

        //アダプタの登録
        lvMenu.adapter = adapter

    }
        ～省略～
}
```

#３．結果
見事に思い通り、可読できる表示になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/399ec05f-8074-31cc-4213-5faeb15d4679.png)

#４．動作環境
Android Studio 4.1
Build #AI-201.8743.12.41.6858069, built on September 24, 2020
Runtime version: 1.8.0_242-release-1644-b01 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 1237M
Cores: 8
Registry: ide.new.welcome.screen.force=true
Non-Bundled Plugins: com.thoughtworks.gauge
【python】ray.init での多重呼出しエラー対処

#環境
python

#発生したエラー

`(ignore_reinit_error=True), RuntimeError: Maybe you called ray.init twice by accident? This error can be suppressed by passing in 'ignore_reinit_error=True' or by calling 'ray.shutdown()' prior to 'ray.init()'.`

#ignore_reinit_errorについて
__ignore_reinit_error__は__ray.init()__が__複数_回実行__されたときに__エラー__を出すか出さないかを決めることができる。

__デフォルト__では__False__になっている。

#例
例として以下のプログラミングを見てみる。

例1 : __ignore_reinit_error__を__<font color='red'>False</font>__にした例。
つまり、ray.init(num_cpus=1)のまま。

```python:
import time
import ray


if __name__ == "__main__":
    
    for i in range(2):
        ray.init(num_cpus=1)

        @ray.remote
        def time_function(num):
            time.sleep(1)
            return num

        time.sleep(2)

        start_time = time.time()

        numbers = ray.get([time_function.remote(i) for i in range(5)])

        end_time = time.time()
        duration = end_time-start_time

        print('numbers = {}, duration = {}'.format(numbers, duration))

#RuntimeError: Maybe you called ray.init twice by accident? This error can be suppressed by passing in 'ignore_reinit_error=True' or by calling 'ray.shutdown()' prior to 'ray.init()'.                      
```

上の例1では__ray.init__が__2回実行__されているので__エラー__が起きている。

例2 : __ignore_reinit_error__を__<font color='red'>True</font>__にした例。
つまり、ray.init(num_cpus=1, ignore_reinit_error=True)。
 
```python:
import time
import ray


if __name__ == "__main__":
    
    for i in range(2):
        ray.init(num_cpus=1, ignore_reinit_error=True)

        @ray.remote
        def time_function(num):
            time.sleep(1)
            return num

        time.sleep(2)

        start_time = time.time()

        numbers = ray.get([time_function.remote(i) for i in range(5)])

        end_time = time.time()
        duration = end_time-start_time

        print('numbers = {}, duration = {}'.format(numbers, duration))

#numbers = [0, 1, 2, 3, 4], duration = 5.047511100769043
Calling ray.init() again after it has already been called.
numbers = [0, 1, 2, 3, 4], duration = 5.015073537826538                    
```
例2では__ray.init__が__2回実行__されていても__エラーが起きていない__。

以上がignore_reinit_errorの動作である。
なぜテキストエディタを使いこなす必要があるのか

なぜ私たちはプログラミングをするのにテキストエディタにこだわる必要があるのでしょうか。その理由は明白です。
## テキストエディタと向き合う時間が長い

プログラムを書くコーディングのときはほとんどの時間をテキストエディタと共に過ごしています。
その中でテキストエディタで切り取りをしたりカーソル移動したり、それらの作業を少しでも効率化できれば少しずつ効率化できるはずです。
タイピング速度ももちろん重要ですが、それ以上にエディタを使いこなすことができるかも重要だと思います。

どのテキストエディタでも使いこなせることが一つの要因になっていると思います。Vim/ 
Emacs
/ VScode、何でもいいので一つちゃんと使えるようになってください。

ここでは、エディタ初心者に向けて、効率化するための基本ポイントをいくつかあげたいと思います。

## カーソル移動
カーソル移動にはいくつかあります。例えば行の末端に行ったり、行の先頭に移ったり、単語単位で移動したり、空行を区切りにして一気にジャンプしたり、いろいろとあります。
例えば、一文字ずつの移動しかできない人は、カーソルを移動するだけで時間を捨てることになります。
ここで高速にカーソル移動をして絶えず効率的なカーソル移動が可能であれば、カーソル移動に使える時間も増えるはずです。

## 非効率的なマウスをなるべく使うな
マウスを使うとき、キーボードにある手を、
1. マウスに手を伸ばして、2. マウスカーソルを探して3. 目的の場所に運んで4. クリックしてカーソルをセットする作業は果てしなく非効率です。

いくつかのカーソルのセットのテクニックがあります。

#### 目的の場所が目でわかったら、そこの場所のキーワードを検索してカーソルをセット

ここでの検索は、カーソルから前に検索するか、後に向かって検索するかを使い分けられると目的の場所に早く飛ぶことができます。

#### 範囲選択もなるべくマウスを使わない

範囲選択は大体の場合はShift-矢印キーで行うことができます。
マウスのみで選択すると、時間の無駄なのでなるべくキーボードで行えるようになりましょう。

## エディタの様々なショートカットを知る
エディタには様々な機能がついていることが多いです。
一度にたくさん覚えるのは大変ですが、少しずつ使えるようになりましょう。
ほんの少しだけ紹介します。

#### ファイル操作
ファイル操作のオープンやクローズ、別名で保存、その他のバッファの切り替えなどは大体ショートカットが用意されています。

#### マクロ
マクロの機能を使えば繰り返し作業が一気に高速化できます。

#### Undo/Redo
元に戻したりやり直すことも画面のボタンではなくキーボードで行えるようにしましょう。
また、範囲を選択してからUndo/Redoすると、選択した領域の部分でUndoバッファを検索できる
emacsみたいな
エディタも存在します。

#### 一行切り取り
行ごと切り取りができると結構便利です。

#### コメントアウト/ アンコメント
コメントアウトやその解除は手動ではなくエディタの機能を使いましょう。
これは効率化につながるのみではありません。特にC言語で`/*このタイプのコメント*/`を使っている場合は、コメントアウトはエディタの機能で行わなければ、思わぬバグの温床に、、、後はわかりますね。

## 自分好みのカスタマイズをする
エディタの使い方に慣れてきたら、それをカスタマイズして自分色に染めましょう。
私はカスタマイズは控えめですが、よく使うものは簡単にアクセスできるようにまとめています。
ビルドとシェルを簡単にアクセスできるようにしています。

その他にもインテリジェントに補完してくれる機能など、様々な機能があるので使ってみるといいと思います。

## 最後に：エディタの世界は広い
エディタには多くの種類があり、いろいろとつかわれています。
Vimでもいいだろうし、
emacsでもいいだろうし、
流行りのVscodeでもいい。
何でもいいので一つのエディタをちゃんと使えるようになってください。
生産性が大きく上がるはず。

エディタの沼へようこそ！
vistaでquartus その46

#概要

vistaでquartusやってみた。
cpuを書いてみた。
命令を拡張してみた。

#写真

間接アドレシング

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/562f1285-f577-f78a-8520-a41c5fa8eaaa.jpeg)


#サンプルコード



```
mem[12'h000] = 16'h1055;//       push  85
mem[12'h001] = 16'h1008;//       push  8
mem[12'h002] = 16'h9000;//       st
mem[12'h003] = 16'he000;//       out
mem[12'h004] = 16'h1008;//       push  8
mem[12'h005] = 16'h8000;//       ld
mem[12'h006] = 16'he000;//       out
mem[12'h007] = 16'h4007;//bye:  jmp  bye
mem[12'h008] = 16'h0048;//a:  0x0048
mem[12'h009] = 16'h0049;//b:  0x0049
mem[12'h00a] = 16'h0050;//c:  0x0050
```
#写真

サブルーチンコール

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8ca75600-7c48-923e-1fee-08df8dd5e22f.jpeg)

#サンプルコード

```
mem[12'h000] = 16'h1030;//       push  48
mem[12'h001] = 16'h3010;//       set  a
mem[12'h002] = 16'h1005;//       push  5
mem[12'h003] = 16'h3011;//       set  b
mem[12'h004] = 16'ha000;//       call
mem[12'h005] = 16'h4009;//       jmp  add
mem[12'h006] = 16'h2012;//       get  c
mem[12'h007] = 16'he000;//       out
mem[12'h008] = 16'h4008;//bye:  jmp  bye
mem[12'h009] = 16'h1001;//add:  push  1
mem[12'h00a] = 16'hf000;//       +
mem[12'h00b] = 16'h2010;//       get  a
mem[12'h00c] = 16'h2011;//       get  b
mem[12'h00d] = 16'hf000;//       +
mem[12'h00e] = 16'h3012;//       set  c
mem[12'h00f] = 16'hb000;//       ret
mem[12'h010] = 16'h0000;//a:  0x0000
mem[12'h011] = 16'h0000;//b:  0x0000
mem[12'h012] = 16'h0000;//c:  0x0000
```

以上。
The Biostar Handbook が面白すぎる件

これはbiostars とは全く関係のない人が The Biostar Handbook というネットで販売されている本を紹介するページです。
IT技術に関係する記事ですので、問題はないと思いますが、もしもなにかありましたらご一報ください。

## Biostars をご存知ですか？

[biostars](https://www.biostars.org/)は、バイオインフォマティックス領域のstackoverflowとでも言うべきQ&Aサイトです。バイオインフォマティックスでは、初心者向けの日本語の資料があまり多くはありません。そのような状況で、biostarsを検索すると親切な回答が掲載されていることが多く、非常に参考になりますね。実際に自分で質問してみたこともありますが、丁寧で良質な回答がつくことが多いのでとても便利です。

そんな biostars が handbook を販売しているということで、購入してみました。

https://biostar.myshopify.com/

価格は非常に安くて、2500円とか、3500円とか、そのぐらいの値段です。学術書の値段を考えると、本当にお買い得の価格だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/90e76be1-4c33-781a-227e-e95b0a6e8728.png)

（バイオインフォの本としては驚きの価格だ！）

私はPaypalで支払いをしましたが、日本からでも全く問題なく購入できます。

## Biostar handbook は英語が読めなくても大丈夫！

さて、biostar handbook を買ったはいいのですが、私は英語が苦手です。でも、biostars はログインしてウェブサイトで読むことが可能なんです！　ということは当然chromiumによるGoogle翻訳が活用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/7ef60cd7-de62-4937-7f6e-a9cd823b1e95.png)

(日本語で読める、読めるぞ！）

もちろん原文を確認しなければならない箇所もあるでしょうが、通読する分にはこれで十分だろうというかなり高いレベルの日本語で読み進めることができます。そして、質量ともに、これほどまとまったバイオインフォマティックスの初心者向け日本語の資料は地球上に存在しないと言い切ってよいでしょう。

## Biostar Handbook のおもしろすぎるところ！

### 時間を無駄にしない方法が面白すぎる

さて、biostarハンドブックを買って一番おもしろかったのが、「時間を無駄にしない方法」という項目です。あまりにも面白かったので、どっかーの方面からお叱りが入るかも知れませんが引用したいと思います。

Dockerに対する言及

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/c3f3c7a5-1aee-d2b5-4bb3-0303183d9b4b.png)

どうですか？最高じゃないですか？次に、AWSに対する言及を見てみましょう

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/e90cd4f9-3618-a20f-47db-9a027855bf42.png)

解析プラットフォームに対する言及を見てみましょう

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/9b488354-a199-061b-8d96-660480a2ddff.png)

CWLに対する言及を見てみましょう

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/6c3a72dc-8d4a-5165-58eb-20f5c51579ce.png)

この面白さは、なにもCloud業者やDockerに対してだけではありません。
GATKについての言及を見てみましょう

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/ca8b96ee-e72b-2b57-1e69-65cafb07ca2a.png)

いやあもう最高だと思います。（気分を悪くされましたか？）日本でこんなことを書かれた本を販売したら、クレームが来るかも知れません。

しかし、全てのツールは誰かの手によって作られたものです。単に盲信するのではなく、どこがダメなのかを知る。愛のある健全な批判的な精神でながめるというのは必要でしょう。

これで興味がわいたらぜひBiostar Handbookを手にとってみてください。

https://www.biostarhandbook.com/

上はあえておもしろい記述をあげましたが、全体的にはとてもわかりやすく書かれた初心者向けの充実した教科書っていう感じです。

バイオインフォマティックス初心者のために、このぐらいわかりやすい初心者向けの日本語の教科書があったらなぁと思います。学力もなく英語もできないので勉強するのが大変です！

最後に、私はbiostarsのお世話になってるユーザーですが、biostarsとは何らの利害関係はありません。Biostar Handbookを宣伝しても私の手元には1円も入りません。でもこの魅力的なハンドブックを見てると宣伝したくなってしまいました。

この記事は以上です。
IEのウェブフォントで<br>が豆腐（トーフ、TOFU）になるバグを治す

# 結論
```css
br {
  font-family: sans-serif !important;
}
```

以上です。

# そもそもトーフバグとは
コンピューターで表示できない文字がある場合、文字の代わりに小さい四角(□：通称"豆腐")が表示されること。
ちなみに GoogleFonts の NotoFont は No Tofu（"豆腐"が現れることがなくなるように）という意味を込めて名付けらたそうです。

# 現象
私の環境では既存のウェブフォントをサブセット化して軽量にしたものを読み込んでいるのですが
なぜかWindows の IE11 上で改行コード（brの部分）にトーフが出現してしまいました。
MacとWindowsでは改行コードが違うため（ `\n` と `/r/n` ）、サブセット化の際にWindowsの改行コードも含めればいいのかなと思ったのですが、その方法がわかりませんでした。
そして色々悩んだ末、結論上記の方法で取り急ぎ解決しました。

ただ、元々のウェブフォント適応部分のスタイルも

```css

.webfont {
  font-family: "webfont", sans-serif;
}
```

としているので、 `"webfont"` にない文字は `sans-serif` にフォールバックされる想定だったのですが
なぜかうまくいかず、 `br` への直接指定（念の為important）で解決しました。

サブセット化段階で解決する方法があればコメントいただけますと幸いです。
【Ruby】クラスとインスタンス

<h1>はじめに</h1>
Rubyでは予め定義されている値とは別に、自分で新しい種類の値を作成することができます。

その際「どんな特性を持つのか？」、「どんな動作をするのか？」などの設計図を用意して、作成できます。

新しい種類の値を作成するために必要な概念が、<b>「クラス」</b>と<b>「インスタンス」</b>です。

<h1>クラスとは</h1>

値の元となるもの。値の共通のルールを定義することができます。
ここで定義するルールとは、共通の<b>「属性」と「処理(メソッド)」</b>です。

クラスを使用する利点は、共通の情報をまとめ、個別の情報は各データごとに分けることで、開発・管理・保守が容易になるといったことが挙げられます。

クラスは例えるならば、車の製造における設計図であり、そこから生み出される値が車といえます。
クラスはあくまで設計図ですので、<b>実体がなくそれ単体ではデータとして扱うことができません。</b>

クラスの定義は以下のように行います。

```
class クラス名
  # 変数やメソッドの定義
end
```
<b>クラス名は半角英大文字から始めるのがルールです。</b>
(例)User,Groupなど

<h1>インスタンスとは</h1>
クラスを元にして作られるデータのことです。
インスタンスはクラスとは異なり、<b>実体を持つのでデータとして使用することができます。</b>
クラスが車の設計図であるならば、インスタンスはそこから生成される車といえます。

インスタンスは、クラスが使用できる<b>newメソッド</b>を実行することにより生成します。

<h2>newメソッドとは</h2>
クラスが予め持っているメソッドです。
使用したクラスのインスタンスを生成して返します。

使い方は以下のような形です。

```
#ここではインスタンスを生成し、変数に代入している
変数名 = クラス名.new
```

基本的には上記のように、生成したインスタンスは変数へ代入し、再利用します。
これは、インスタンスを生成したあとからデータを追加したり、メソッドを実行できるようにするためです。

以下で実際にクラス名を指定して、インスタンスを生成します

```
class Car

end

fire_truck = Car.new
```
これで「Car」というクラスからインスタンスを生成し、「fire_truck」という変数に代入することができました。
ゲーム開発で使える数学　三角法編

##三角法の前準備
三角関数に入る前に角の説明をするとともに、
変換や回転などににもよく使われるのでしっかり押さえましょう。

###角とは
角は頂点と呼ばれ点で交わる２本の半直線から作られます。
２本の半直線の一方始辺と言い、
もう一方を終辺と言います。
（一般的に角はギリシャ語でα,β,θで表します。）
<img width="300" alt="度とラジアン.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712841/235235d3-2bff-e988-ef1f-e94382afa824.png">
###度とラジアン
X軸の正の向きは減点のまわりを反時計回り。
時計回りが負の向きとなります。
<img width="300" alt="正の角.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712841/66f5d009-0b2d-4888-86d3-13610e3655bf.png"><img width="300" alt="負の角.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712841/9495bcae-7043-1a4f-11be-b989386d75ae.png">


####度からラジアンの変換
度 × (円周率 ÷ 180)で求まる。
※#define PI 3.14159265359とする

```
    float Rad = 0.f;
    const float Degrees = 60.f;
    Rad = Degrees * (PI / 180);
```
####ラジアンから度への変換
ラジアン × (180 ÷ 円周率)で求まる。

```
    const float Rad = 1.0472f;
    float Degrees = 0.f;
    Degrees = Rad * (180 / PI);
```
※PI = 3.14159265359
##三角関数

<img width="500" alt="負の角.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712841/3873df12-2a8e-8e0b-0c6c-38d4f1fbc52a.png">

###ピタゴラスの定理
まず初めにcの長さを知りたい場合はピタゴラスの定理を使うと計算できます。
証明済みってことなのですが直角三角形なんかは３つの内角の和は180°（３つのうち１つの90°もう２つの角度の和は90°）というのも証明済みだと言える。
したがってピタゴラスの定理があれば３つのうち２つの長さがわかれば残りの辺の長さも求めることができる。
公式
c²=a²+b²

b=5,a=12だった場合の図のcの長さを求める。

$c=\sqrt{12²+5²} = \sqrt{144+25} =\sqrt{169} =13$
c=13なことがわかる。

```
float A, B, C;
A = 12.f;
B = 5.f;
C = sqrt(pow(12.f,2.f) + pow(5.f,2.f));
```
※sqrt(平方根) pow(べき乗)

### サイン（sine）コサイン（cosine）タンジェント（tangent）の定義
ここでは角度と角度に接する１辺の長さがわかっていればもう一つの辺がの長さがわかる。
よく使われる角の三角関数の値

| α (度) | α(ラジアン)  | sinα | cosα | tanα |
|--------|-------------|------|------|------ |
|0       |0            |0     |1     |0      |
|30      |π/6          |0.5   |0.8660|0.5774 |
|45      |π/4          |0.7071|0.7071|1      |
|60      |π/3          |0.8660|0.5   |1.7321 |
|90      |π/2          |1     |0     |一     |
|120     |2π/3         |0.8660|-0.5  |-1.7321|
|180     |π            |3     |-1    |0      |
|270     |3π/2         |-1    |0     |一     |
|360     |0            |3     |1     |0      |
表を覚えていると計算がスムーズにできると思うので覚えておきましょう。
それでは表をもとに計算していきましょう。
例
α＝60°,c=50だった場合のa=長さはいくつでしょうか。
$cos60° = \frac{a}{50}$
$50(cos60°) = a$
$50×0.5 = a$
$25 = a$
となります。

```
float a, Degrees;
Degrees = 60.f * (PI / 180);
a = cos(Degrees)*50;
```

### 逆三角関数
アークサイン（asine）アークコサイン（acosine）アークタンジェント（atangent）
を使って計算していきます。
ここでは３辺のうち２辺の長さがわっていれば内角αの角度が求められる。
<img width="400" alt="負の角.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712841/2b679da4-30e2-c1fe-5371-9f22b532d4a2.png">

早速計算していきましょう。
a=1,b=4のときαは何度になるでしょう。
$tanα = \frac{4}{1}$
$tanα = 4$
$a =  tan⁻¹(4)$
$a = 76°$

```
float Red = atan(4.f);
float a = Red * (180.f / PI);
```
旧バージョンのInkscapeファイルをInkscape 1.0 に変換したら、Display unitsが変更できない問題とその対処法


# 症状

これまで旧バージョンのInkscapeを使ってきたが、このたびInkscape 1.0に乗り換えた。
旧バージョンのファイルをInkscape 1.0で読み込むと、変換するように促されるので、「OK」を押して変換する。
と、ここまではよいのだが、変換したファイルに困った症状が発生する。
Display unitsがデフォルトで「px」なのを「mm」に変更して保存しても、再度読み込むとまた「px」に戻ってしまう。
私は、製図の都合で「mm」が使いたいのに。

なお、これは旧バージョンから変換したファイルで発生する症状であり、最初からInkscape 1.0で作成したファイルにはこの症状は出ない。
ここでいう旧バージョンとは、解像度が90dpi仕様のInkscapeのこと。
Inkscape 1.0は仕様変更により96dpiとなっている。

# 原因

旧バージョンから変換したファイルの中に`viewBox`の行がないため。
(最初からInkscape 1.0で作成したファイルには`viewBox`の行がある)

参考URL:
https://bugs.launchpad.net/inkscape/+bug/1671691

# 対処法

ファイルの中に`viewBox`の行が記録されるような操作をすればよい。

1. Inkscape 1.0を起動して、旧バージョンから変換したファイルを読み込む。Shift+Ctrl+Dして、「ドキュメントのプロパティ」の設定画面を出す。
`inkscape --with-gui --verb=DialogDocumentProperties filename.svg`
のようにオプションを指定すると、「ドキュメントのプロパティ」が開いた状態で起動する。
1. 「拡大縮小」の「Scale x」の値をいじってから、また元の値に戻す(値を更新したふりをする)。
1. 上部のDisplay unitsを「mm」に変更する。
1. 当該ファイルを保存する。

当該ファイルを再度inkscapeで読み込んだとき、「Scale x」の値が奇妙な値に変わっていることがあるが、変換によるものなので、気にしない。

![docproperty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210549/c95372a7-3483-4e6d-6216-d19fe5339537.png)

以上の操作により、ファイルの中に`viewBox`の行が記録され、症状が解決する。
hit and blowというゲームをjavascriptで作ってみた

# hit and blowとは

---

hit and blowとはa-zの文字を使用して
出題者が用意した答えを当てるゲームです。

---

回答者がa-zの文字を入力し、
答えと同じ順番にあればhit
答えと違う順番だけど、答えに含まれていればblow
というゲームです。

---

## コード

---

### html

---

```.html
    <div class="c-inputBlock">
      <input class="u-mR6 js-input" type="text">
      <button class="u-mR6 js-submit">判定</button>
      <button class="js-submit-clear">クリア</button>
    </div>
    
    <p><span class="js-result">入力した文字: </span></p>
    <p><span class="js-result-hit">HIT: </span></p>
    <p><span class="js-result-blow">BLOW: </span></p>

```

---

### javascript

---

```.js
const input = document.querySelector('.js-input');
const submit = document.querySelector('.js-submit');
const submitClear = document.querySelector('.js-submit-clear');
const result = document.querySelector('.js-result');
const resultHit = document.querySelector('.js-result-hit');
const resultBlow = document.querySelector('.js-result-blow');
let flag = false; // 一回判定済みかどうかのフラグ

const answer = "aabb"; // 回答をセット
const answerStrings = answer.split(''); // 回答の文字列を1文字ずつ分割

function clearResult() { // hit数、blow数,入力した文字をクリア
  const resultText = document.querySelectorAll('.js-result-text');
  if (resultText) {
    for (let i = 0; i < resultText.length; i++) {
      resultText[i].innerHTML = "";
    }
  }
}

function clearInput() { // inputの値をクリア
  input.value = "";
}

submitClear.addEventListener('click', () => {
  clearInput();
  clearResult();
});
submit.addEventListener('click', () => {
  const strings = input.value.split(''); // 文字列を1文字ずつ分割
  let hitCount = 0;
  let blowCount = 0;
  
  if (flag) {
    clearResult();
  }

  for (let i = 0; i < strings.length; i++) {
    if (strings[i] === answerStrings[i]) {
      hitCount++;
    }
    if (answerStrings.includes(strings[i])) {
      blowCount++;
    }
  }

  
  const setResultText = `<span class="js-result-text">${input.value}</span>`;
  const setResultHitText = `<span class="js-result-text">${hitCount}</span>`;
  const setResultBlowText = `<span class="js-result-text">${blowCount}</span>`;

	result.insertAdjacentHTML("afterend",  setResultText);
	resultHit.insertAdjacentHTML("afterend", setResultHitText);
  resultBlow.insertAdjacentHTML("afterend", setResultBlowText);
  
  clearInput();
  flag = true;
});

```

---

こんな感じで実装しました。
for文の部分は最初、

---

```.js
strings.filter((item, i) => { 
  if (item === answerStrings[i]) {
    hitCount++;
  }
});
```

---

とかで実装しようと思ってたましたが配列から新しい配列を生成するメソッドなので
カウントするためだけに使っていいのか悩んでforで実装しました。
Pythonで文字、数字の前に半角スペースを入れる方法。

こんにちは、rickyです。
文字列の前に半角スペースを書く書き方がわからなかったので調べて備忘録としておきます。
format()は使い慣れていなかったのでいい練習になりました。

#今回やりたいこと
　数字を半角スペースを1つおいて表示をしたい。

書き方

```python:sample.py
num = 1
width = 2

print("{num:>{width}}".format(num=num, width=width))
```
出力: 1
ちゃんと半角スペースをおけました。

こんなものも書ける。

```python:another_sample.py
num = "a"
width = 2

print("{num:*>{width}}".format(num=num, width=width))
```
出力:*a
文字に変えたり、半角スペースを*に変えることもできる。

解説
formatの第二引数にwidthを書いて表現する。
このwidthは数字込みの長さになるので桁数より多い2をwidthに宣言している。
どうやら数値込みで半角スペースの長さを表示しているようです。

公式ドキュメント抜粋
>
str.format(*args, **kwargs)
文字列の書式化操作を行います。このメソッドを呼び出す文字列は通常の文字、または、 {} で区切られた置換フィールドを含みます。それぞれの置換フィールドは位置引数のインデックスナンバー、または、キーワード引数の名前を含みます。返り値は、それぞれの置換フィールドが対応する引数の文字列値で置換された文字列のコピーです。

公式ドキュメント用語集より抜粋
>
parameter
(仮引数) 名前付の実体で 関数 (や メソッド ) の定義において関数が受ける 実引数 を指定します。仮引数には5種類あります:
位置またはキーワード: 位置 でまたは キーワード引数 として渡すことができる引数を指定します。これはたとえば以下の foo や bar のように、デフォルトの仮引数の種類です:
def func(foo, bar=None): ...

#追記
@shiracamus様より別の書き方を教えていただいたので追記します。

```python:postscript.py
num = 1
width = 2

print(f"{num:>{width}}")
```

こちらの方が見やすいです。
fはformatのfだということに気を付けておけばよさそうです。

@shiracamus様教えていただきありがとうございます。

参考資料としてPEP8の[url](https://www.python.org/dev/peps/pep-0498/#format-specifiers)のformatの箇所を引用します。
>Format specifiers
Format specifiers may also contain evaluated expressions. This allows code such as:

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result:      12.35'
Once expressions in a format specifier are evaluated (if necessary), format specifiers are not interpreted by the f-string evaluator. Just as in str.format(), they are merely passed in to the __format__() method of the object being formatted.
***

まとめ
ドキュメントにキーワード引数としか書いていなかったので、自分で調査することになった。
キーワード引数についての理解が浅かったので無駄な時間を取られてしまった。
今後はうまくスペースを作ることができそう。
Rでfor文を用いて複数のdbfファイルを読み込む

Rで複数のdbfファイルを読み込むためにfor文を用いました。
for文を使う場合、pasteと文字型に気を付けます。

dbfファイル名は
t0.dbf
t1.dbf
t2.dbf
を想定しています。
出力時にfor文などで作成することができます。

```read.r
for( i in 0:2){
  data <- read.dbf(paste("path/t",as,character(i),".dbf",sep=""),as.is = TRUE)
}
```
今すぐ使えるGitコマンド

# Git
Gitでよく使うコマンドまとめ

## 前提
GitHubやGitLabなどにリモートで接続されていること
> 参考：[GitHubにssh接続できるようにする - Qiita](https://qiita.com/0ta2/items/25c27d447378b13a1ac3#config%E8%A8%AD%E5%AE%9A)

## GitHubなどのリモートのリポジトリにローカルgitを同期
```shell=
git remote add origin [リモートリポジトリ情報]
```
> 参考：[Githubに新規リポジトリを追加 - Qiita](https://qiita.com/sodaihirai/items/caf8d39d314fa53db4db)

## 設定
```shell=
$ git config --global user.name "Your Name"
$ git config --global user.email your.email@example.com
```

## セットアップ
```shell=
$ git init
```

## 状態確認
```shell=
$ git status
```

## コミット
```shell=
$ git commit -am "Commit name"
```
`-a`:ワークツリーで変更済みのファイルをコミットする（「git add」コマンドによる操作を省略  
ただし、初回のみ管理対象を決めるために`git add`コマンド操作が必要  
`-m`：""内の文字列をメッセージとして設定可能

## プッシュ
```shell=
$ git push
```

## ログ
```shell=
$ git log
```
ログがある程度以上長い場合は，qキーを押して終了

## ブランチ
### ブランチ作成
```shell=
$ git checkout -b branch_name
```

`-b`:新しいブランチ作成
### ブランチ一覧
```shell=
$ git branch
master
* branch_name
```
「*」は現在使用中のブランチ

### ブランチ移動
```shell=
$ git checkout branch_name
```

## ローカルのブランチをリモートにも追加
```shell=
$ git push --set-upstream origin branch_name
```
リモートに既にブランチが存在している場合は必要ないはず

## マージ
```shell=
$ git checkout master
Switched to branch 'master'

$ git merge branch_name
```
branchNameをmasterにマージ

## マージの取り消し
### マージ後、まだコミットしていない場合
```shell=
$ git reset --hard HEAD
```
### マージ後、既にコミットした場合
```shell=
$ git reset --hard ORIG_HEAD
```

## pull
リモートの変更をローカルにも反映

```shell=
$ git pull
```

## rebase
fast-forward（変更履歴を一本化）  
**rebase前**  
1-2ー3-4-5-6-master  
　　l-7-8-9-branch_name  
===>  
**rebase後**  
master-7-8-9-branch_name  

### 1. rebaseしたいブランチに移動しrebase
```shell=
$ git checkout branch_name
$ git rebase master
```
### 2. Conflict（競合）したファイルを手動で変更
### 3. 全て完了したら、addで追加してcontinue
```shell=
$ git add <Conflictした/path/to/ファイル名>
$ git rebase --continue
```
### 4. 再びConflict（競合）が起こったら2.に戻る
### 5. 全てのrebaseが完了したら，以下でpull・もしくは強制push
```shell=
$ git pull

### 以下の強制pushの場合は上記のpullと6.の工程はスキップ可能
$ git push -f
```
### 6. 最後に、いつものリモートにpush
```shell=
$ git add .
$ git commit
$ git push
```

## tag
tag付けることで、バージョン指定した状態をzipダウンロード可能となる  

```shell=
$ git tag 1.0
$ git push --tag origin master

Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:{GitHubアカウント名}/{プロジェクト名}.git
* [new tag]         1.0 -> 1.0
```

###### tags: `development`,`開発`,`git`
データ分析基盤（概念モデル）におけるスピードレイヤー（ホットパス）

## 概要
データ分析基盤（概念モデル）におけるスピードレイヤー（ホットパス）に関する整理を実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/55dc0fa4-ed5d-45c2-b9d0-be4b725d6c2c.png)

本記事にて、下記の記事におけるスピードレイヤー（ホットパス）の詳細を記載します。

- [最強のデータ分析基盤を目指して～汎用的なデータ分析基盤の選定方法の提案～](https://qiita.com/manabian/private/e689daf5cc006eced737)


## 定義
### スピードレイヤー（ホットパス）の定義
バッチ処理にてデータ処理を行い、永続的に大量のデータを保持する層。

### コンポーネント詳細
| 番号 | データ基盤におけるレイヤー                    | コンポーネント名                                             | 説明                                                         | サービス例                                                   |
| ---- | --------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 13   | スピードレイヤー                              | ストリーム処理サービス                                       | リアルタイムインジェストから連続したデータを取得し、処理を行ったうえでデータの提供を低遅延で行うサービス。 | Amazon  Kinesis、Azure Stream Analytics                      |


## 要求要件
### ストリーム処理サービス
| 番号 | 要否 | 分類           | 主要要件                   | 説明                                                         |
| ---- | ---- | -------------- | -------------------------- | ------------------------------------------------------------ |
| 1    | 必須 | データ抽出     | リアルタイムデータ抽出     | リアルタイムインジェストサービスからデータを抽出する機能。   |
| 2    | 任意 | データ変換     | データ変換                 | 抽出したデータを変換する機能。                               |
| 3    | 必須 | プログラミング | 外部REST APIの利用         | 抽出したデータに基づき外部APIを実行する機能。                |
| 4    | 必須 | データ取込     | リアルタイムデータ取込     | ターゲットにデータを取り込む機能。                           |
| 5    | 任意 | 拡張性         | クラスターのスケールアウト | 同一のエンドポイントを利用可能な状態で、クラスターの数を増減する機能。 |
| 6    | 必須 | 可用性         | フォールトトレランス       | システムの一部に障害が発生しても正常に動作する機能。         |

## 参考情報
### ストリーム処理サービス
特になし

## 参考資料
- [DAMA-DMBOK: Data Management Body of Knowledge: 2nd Edition](https://www.amazon.co.jp/DAMA-DMBOK-Data-Management-Body-Knowledge/dp/1634622340)
- [データマネジメント知識体系ガイド 第二版](https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E7%9F%A5%E8%AD%98%E4%BD%93%E7%B3%BB%E3%82%AC%E3%82%A4%E3%83%89-%E7%AC%AC%E4%BA%8C%E7%89%88-DAMA-International/dp/4296100491/ref=pd_lpo_14_t_0/355-0270959-3880927?_encoding=UTF8&pd_rd_i=4296100491&pd_rd_r=6532e6ec-4ebf-491f-8bc4-e1ea0ff00bd6&pd_rd_w=1rgNg&pd_rd_wg=XtJYk&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=EQJ9BB6JE81405JYZVM7&psc=1&refRID=EQJ9BB6JE81405JYZVM7)
- [The DAMA Dictionary of Data Management, 2nd Edition: Over 2,000 Terms Defined for IT and Business Professionals (English Edition)](https://www.amazon.co.jp/DAMA-Dictionary-Data-Management-Professionals-ebook/dp/B01BT0BUCG/ref=sr_1_2?dchild=1&qid=1602683933&refinements=p_27%3ADAMA+International&s=english-books&sr=1-2&text=DAMA+International)
- [Gartner Glossary](https://www.gartner.com/en/information-technology/glossary/business-intelligence-bi)
セキュリティ管理の自動化は出来るのか？

# はじめに
<!-- 発端や概要を記載 -->
　昨今、やれ自動化だ、やれAIだなんだと騒がれていますが、IT技術の発展に伴い、要求されるものはどんどん増えてますよね。私は以前から、Firewall等の"セキュリティ管理を自動化"出来たら便利だな・・・と考えていました。

　本記事は、そんな折にふと見つけた、アメリカのカリフォルニア州サンノゼにある『Skybox Security』が開発しているサイバーセキュリティ管理ソフト(同名)に関しての備忘録の一端です。
　


<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 1. 概要
　Skybox Securityとは、『IT資産やIT Networkのリスクマネジメントや、セキュリティコントロール評価の自動化を支援するセキュリティツール』らしいです。
実際に触ってみないと何とも言えないですが、セキュリティ管理をある程度自動化出来るようにしてくれるソフトということでしょう。
会社としてはネットワークモデリングの自動化や攻撃シミュレーションが売りのようですね。

　ホームページにも書いてありますが、140以上の企業とパートナー関係を確立していて、API統合をすることによりデータを収集・分析出来るそうです。
　


<a id="#Chapter2"></a>
# 2. 主な機能
　Skybox Securityには主に3つ(5つ？)の機能があります。
・<font color = red>Fire Assurance</font color>・・・(品質管理)(変更管理)
・<font color = blue>Network Assurance</font color>・・・(品質管理)
・<font color = green>Vulnerability Control</font color>・・・(リスク管理)(統合脅威管理)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790465/6a250fee-a505-c46b-bf79-e2258489fe1d.png)

下記のURLからDEMO版をリクエストして実際に使ってみたので、参考までに機能を幾つか紹介します。
https://www.skyboxsecurity.com/request-demo/

30日利用可能なDEMO版をダウンロードし、VMware ESXにサーバーを立ち上げたり諸々の設定をして、専用のUIを起動し、実際に使用してみます。

UIはこんな感じです。
全部英語ですが、特に困らないかなという印象です。
問題は操作感と機能面ですが、思っていたより機能が多く、覚えるのに時間がかかりそうです。
![Home.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790465/d0d3c633-dd38-18e2-3ffe-8cae84a60bf4.png)


まずは、場所(Location)毎にIPやGatewayを振り分けていきましょう(Demo版なので既に設定済でした)。
![Locations.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790465/0ec7f5a5-0742-ac3b-3ea0-42890d8a0a06.png)


これが売りのネットワークマップです。各ノードがどう繋がっているか一目で分かるのは良いですね。自動でマッピングされますが、手動でも動かせるので好きなようにNetworkMapを作成することが出来ます。
![NetworkMap.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790465/c662dae0-f971-63c8-c4d9-b2e4da58c206.png)



予め設定したMapGroup毎(Location等)に、ハイライトを付けてより分かりやすくすることも出来ます。
![NM Highlighted.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790465/92d93f46-c2c5-6df6-e393-59c879e88c47.png)


Firewallなども自動で読み込んで、Ruleの設定を見直したり、Policyの管理が出来るみたいです。
![FIrewall.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790465/4c1bcbc0-d709-695c-09fa-315dc0775b2d.png)


如何でしょうか？他にも機能がありますが、特に分かりやすく、使えそうな機能を紹介させていただきました。


<a id="#Chapter3"></a>
# 3. 現在の活用事例
　導入実績としては金融業界、政府、エネルギー業界、製造業、テクノロジー業界、販売業界など多岐に渡り、国内だと官公庁や某大手企業に導入されたようです。
ただ、国内での実績はまだまだ無いみたいですね。
　
　IT技術の自動化が発展する事に伴い、ITセキュリティの自動化の発展も同時に望まれる事でしょう。会社のセキュリティ管理を任されている方などは導入を検討してみては如何でしょうか。

<a id="#Chapter4"></a>
# 4. 終わりに
　これで概要と導入については以上になります。
　Firewallのルールやポリシー管理、Network機器の相関図(トポロジーマップ)の可視化やアクセス分析、脆弱性の管理や攻撃シミュレーションなど、セキュリティ管理に必要な要素や欲しい要素は一通りあるようです。

　まだ私も浅い部分までしか触れてはいませんが、セキュリティ管理という観点では、非常に良いソフトだと思いました。
個人的には、UIが見やすく割と好みです。
Firewallのアクセス分析やNetworkMapの可視化は、実際に見えない部分を分かりやすく理解できる機能で、画期的だと思いました。

次は他社製品との比較がしたいですね。


<a id="#Chapter5"></a>
# 5. 参考文献
- [<title>Skybox Security - Wikipedia</title>](https://en.wikipedia.org/wiki/Skybox_Security)
- [<title>Skybox Security | Complete and Contextual Visibility</title>](https://www.skyboxsecurity.com/)
Safariでサブドメイン間でCookieが保存できない原因はドメイン名だった

# 環境
Safari 13.1.1
macOS Catalina

# 背景

ITPの仕様により、Safariでは、JavaScriptで生成するCookieが7日間しか保存されなくなりました。

私が参加しているプロジェクトでは、JavaScriptで生成しているCookieの保存期間を伸ばすために、サーバーサイドでCookieを発行することになりました。

実装としては、Nuxtのクライアント（`hoge.co.jp`）から、LaravelのAPIサーバー（`api.hoge.co.jp`）を叩いて、setcookieします（`domain`の指定は`hoge.co.jp`）。

開発環境では、クライアント（`hoge.development`）とAPIサーバー（`api.hoge.development`）のホスト名を設定して、サブドメインが異なる環境を再現しました（本番環境と全く同じにすると、本番環境に保存されていたcookieが共有されて不具合が生じたため）。

# 問題

上記の開発環境で試してみると、ChromeやFirefoxでは正常にCookieが保存されましたが、何故かSafariでだけ保存されませんでした。

（クライアントとAPIサーバーのドメインをどちらも `hoge.development` に合わせると、正常に保存されます。）

調べてみると、同じようにSafariでだけ、サブドメインから、ベースドメインに対してCookieを保存できないという問題が発生しているようでした。

# 解決法

この問題の発生例は、いずれも `.test` のような、開発用のドメインで起きているようでした。

そこで、開発環境のドメインを、 `hoge.development` ではなく `hoge.co.jp` に変えたところ、Safariでも正常にCookieが保存されるようになりました。

試しに色々なドメインに変えてみると、 `.xyz` や `.monster` などマイナーなドメインでも保存できたので、Safariはトップレベルドメインが実在する場合だけ、サブドメイン間のCookieの保存を許可するのではないかと思われます。

# 学び

本番環境を再現する時は、細かい部分まで出来る限り再現しなければいけないという教訓が得られました。
デイリースクラム

## デイリースクラム [^1]

- 15分のタイムボックス
- 3つの話すこと
- 開発チーム全員が話す
- 必要に応じて個別に話す

---

## 3つの話すこと

- 昨日やったこと
- 今日やること
- 障害となっていること

---

## やったこと/やること
- 必要に応じてカンバン
- ZenHub、Issue

---

# よろしくお願いします

---


デイリースクラム

```
デイリースクラムとは、開発チームのための 15 分間のタイムボックスのイベントである。スプリントで
は、毎日デイリースクラムを開催する。開発チームは、次の 24 時間の作業を計画する。前回のデ
イリースクラムから行なった作業の検査と今後のスプリント作業の予想をすることで、チームのコラ
ボレーションやパフォーマンスを最適化するのである。デイリースクラムは毎日、同じ時間・場所で
開催し、複雑にならないようにする。
```

```
開発チームはデイリースクラムを使って、スプリントゴールとスプリントバックログの進捗を検査する。
デイリースクラムは、開発チームがスプリントゴールを達成する可能性を最適化する。開発チーム
は、自己組織化チームとしてスプリントゴールを達成し、スプリント終了までに期待されるインクリメ
ントを作成できるかを毎日把握しなければいけない。
```

```
デイリースクラムの構成は、開発チームが設定する。スプリントゴールを目指している限り、他のや
り方で行なっても構わない。質問を使うチームもあれば、議論ベースで進めるチームもある。たとえ
ば、以下のような例を使用するといいだろう。
```

```
• 開発チームがスプリントゴールを達成するために、私が昨日やったことは何か？
• 開発チームがスプリントゴールを達成するために、私が今日やることは何か？
• 私や開発チームがスプリントゴールを達成する上で、障害となる物を目撃したか？
```

```
開発チームやチームメンバーは、デイリースクラムの終了直後に集まり、スプリントの残作業につい
て、詳細な議論・適応・再計画を行うこともある。
スクラムマスターは、開発チームにデイリースクラムを開催してもらうようにする。ただし、デイリース
クラムを開催する責任は開発チームにある。スクラムマスターは、デイリースクラムを 15 分間のタイ
ムボックスで終わらせるように開発チームに伝える。
```

```
デイリースクラムは開発チームのためのミーティングである。それ以外の人たちが参加する場合、
開発チームの邪魔にならないようにスクラムマスターが配慮する。
デイリースクラムは、コミュニケーションを改善し、その他のミーティングを取り除き、開発の障害物
を特定・排除し、迅速な意思決定を強調・助長して、開発チームのプロジェクト知識のレベルを向
上させるものである。これは、検査と適応の重要なイベントである。
```

The Scrum Guide 2017:  https://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf

[^1]: https://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf


---

## デイリースクラム関連の考え方の背景がわかる変遷

下記の内容を読んだ上で、その上で今はスクラムマスターがデイリーを主導し、報告を主体としたものとして定め、チームが成熟するにつれ自主的なもの（デイリーの形式を変える必要かを自分たちで考える）に変えていくように考えています。

https://www.ryuzee.com/contents/blog/7130

---