OmniAICreator/Qiita-1.07M huggingface dataset:
【jQuery】HTMLにJSONファイルの内容を適用させる方法【XMLHttpRequest()】

## JSONファイルの内容をHTML上に表示させたい
**ソースコードは全て外部から引用したものです。**

[リンク]　(https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/JSON)

```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/jquery-3.4.1.min.js"></script>
  <script src="jsonData.js"></script>
</head>
<body>
  <header>
  </header>
  <section>
  </section>
</body>
</html>
```

```js:jsonData.js
var header = document.querySelector('header');
    var section = document.querySelector('section');

    var requestURL = 'https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json';

    var request = new XMLHttpRequest();
    request.open('GET', requestURL);

    request.responseType = 'json';
    request.send();

    request.onload = function() {
      var superHeroes = request.response;
      populateHeader(superHeroes);
      showHeroes(superHeroes);
    }

    function populateHeader(jsonObj) {
      var myH1 = document.createElement('h1');
      myH1.textContent = jsonObj['squadName'];
      header.appendChild(myH1);

      var myPara = document.createElement('p');
      myPara.textContent = 'Hometown: ' + jsonObj['homeTown'] + ' // Formed: ' + jsonObj['formed'];
      header.appendChild(myPara);
    }

    function showHeroes(jsonObj) {
      var heroes = jsonObj['members'];
          
      for (var i = 0; i < heroes.length; i++) {
        var myArticle = document.createElement('article');
        var myH2 = document.createElement('h2');
        var myPara1 = document.createElement('p');
        var myPara2 = document.createElement('p');
        var myPara3 = document.createElement('p');
        var myList = document.createElement('ul');

        myH2.textContent = heroes[i].name;
        myPara1.textContent = 'Secret identity: ' + heroes[i].secretIdentity;
        myPara2.textContent = 'Age: ' + heroes[i].age;
        myPara3.textContent = 'Superpowers:';
            
        var superPowers = heroes[i].powers;
        for (var j = 0; j < superPowers.length; j++) {
          var listItem = document.createElement('li');
          listItem.textContent = superPowers[j];
          myList.appendChild(listItem);
        }

        myArticle.appendChild(myH2);
        myArticle.appendChild(myPara1);
        myArticle.appendChild(myPara2);
        myArticle.appendChild(myPara3);
        myArticle.appendChild(myList);

        section.appendChild(myArticle);
      }
    }
```
while文とfor文

## 複数の繰り返し処理

アプリケーション内で良く使われる繰り返し処理の種類

### while文

```ruby
num = 0
while num < 50 do
  puts num
  num += 1
end
```
数字を0から49まで出力するコードです
1行目で変数numを定義
2行目のwhileにてnumの値が50になるまでdo~endの動作を繰り返します
3行目で変数numの値を出力
4行目でnumに+1します
5行目はwhile文の終わりを示すendです
出力すると

```:ターミナル
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
```
とnumが50になるまで出力しています。

### for文
```ruby
for num in 0..50 do
    puts num
end
```
変数numに0~50まで数を入れては2行目で出力するように定義しています
出力すると

```:ターミナル
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
```

while文でもfor文でも同じ出力を得ることができます。
[Python]カウントだけじゃない collections.Counter

# 概要
iterable の要素数を取得する [collections.Counter](https://docs.python.org/ja/3/library/collections.html#collections.Counter) の性質についてまとめた。
カウント以外にも dict にはない便利な性質が備わっているので、積極的に使っていきたい。

# 演算
加減算と集合の演算ができる。値がゼロ以下になったキーは自動的に削除される。

```python
from collections import Counter

A = Counter('ab') # Counter({'a': 1, 'b': 1})
B = Counter('bc') # Counter({'c': 1, 'b': 1})
A + B # Counter({'b': 2, 'a': 1, 'c': 1})
A - B # Counter({'a': 1})
A & B # Counter({'b': 1})
A | B # Counter({'a': 1, 'b': 1, 'c': 1})
```

# メソッド
演算子とは違い、ゼロ以下の値のキーも保持される。`elements` は値が正のキーのみを返す。

```python
from collections import Counter

A = Counter('ab')
B = Counter('bc')
C = Counter('ac')
C.update(A) # Counter({'a': 2, 'c': 1, 'b': 1})
A.subtract(B) # Counter({'a': 1, 'b': 0, 'c': -1})
A.most_common() # [('a', 1), ('b', 0), ('c', -1)]
sorted(C.elements()) # ['a', 'a', 'b', 'c']
sorted(A.elements()) # ['a']
```

# 参照
要素を直接変更すると、メソッドと同じくゼロ以下の値が許容される。
存在しない要素を参照すると例外にならず 0 が返る。

```python
from collections import Counter

A = Counter('ab')
A['a'] += 2 # Counter({'a': 3, 'b': 1})
a['b'] -= 2 # Counter({'a': 3, 'b': -1})
A['c'] # 0
```

なお、単項演算子は空の `Counter()` に対する演算のショートカットになっている。
各要素ごとの演算後に、正または負の値だけを抽出できる。

```python
A # Counter({'a': 3, 'b': -1})
+A # Counter({'a': 3})
-A # Counter({'b': 1})
```
【Java】文字列の比較と&& と ||

# 文字列の比較
```例.java
number == 0
```

上記のようなコードがあったとします。
意味としては変数 number に 0 が代入され、右側の 0 と等しい という意味になります。

では文字の場合は・・・？:thinking: 

```例.java
fruit == "りんご"
```  

になるんじゃないの？？:thinking: と思ってしまいます。
じつは間違いです。
Java の場合は、文字列は == では比較できないということになっています。
ではどうするのかというと・・・

```文字列の比較.
文字列型の変数.equals(比較相手の文字列)
```

となります:smile:
なのでさっきのコードは

```例.java
fruit.equals("りんご")
```

となります:smile:

余談ですが、文字列に == を使ってもコンパイルエラーは起きません:sweat_smile: 
ただ実行できるけど動きが変になるというタチの悪い不具合が起こります:sweat_smile: 
コンパイルエラーが起きないだけにエラーをみつけるのが厄介になります:sweat_smile: 

# && と ||
:sunny: && は 「女性かつ東京生まれ」など 2 つ以上の全ての条件を一致させたいときに使います。
:sunny: || は「女性または東京生まれ」など 条件のどれかにあてはまるものに一致させたいときに使います。

（例）20 歳以上 かつ 5 月生まれ

```例.java
age >= 20 && month == 5
```

20 歳以上 かつ 5 月生まれ で条件が全て一致すれば true になり、それ以外だと false になります。

（例）20 歳以上 または 5 月生まれ

```例.java
age >= 20 || month == 5
```

20 歳以上 または 5 月生まれ でどれにもあてはまらない場合は false となり、それ以外はすべて true になります。
【Java】初心者用基礎命令文

# System.out.print(表示したい文字や数字など)
:sunny: 改行することなく画面に文字を表示する

普段よく使う System.out.println で作成すると・・・

```例.java
public class Main {
	public static void main(String[] args) {
	    String animal = "いるか";
		System.out.println("私の好きな動物は");
		System.out.println(animal);
		System.out.println("です");
	}
}
```

```コンソール.
私の好きな動物は
いるか
です

```

このように改行されて出力されます。
System.out.println → System.out.print に変更して出力してみると・・・

```例.java
public class Main {
	public static void main(String[] args) {
	    String animal = "いるか";
		System.out.print("私の好きな動物は");
		System.out.print(animal);
		System.out.print("です");
	}
}
```

```コンソール.
私の好きな動物はいるかです
```

１行で表示されました:laughing: 

# int 変数 Math.max(①,②);
:sunny: ①と②を比較して大きい方を呼び出す

```例.java
public class Main {
	public static void main(String[] args) {
	    int numberA = 3;
	    int numberB = 8;
	    int numberC = Math.max(numberA,numberB);
		System.out.println(numberC);
	}
}
```

3行目で、変数 numberA に 3 を代入します。
４行目で、変数 numberB に 8 を代入します。
5行目で、変数 numberC に Math.max(numberA,numberB); を代入します。
Math.max は比較して大きい方を代入するということなので、numberA の 3 と numberB の 8 を比較して大きいほうが numberC に代入されます。

```コンソール.
8
```

# int 変数 = Integer.parseInt(数字に変換したい文字列);
:sunny: 文字を数字に変換する

```例.java
public class Main {
	public static void main(String[] args) {
	    String number = "１";
	    int money = Integer.parseInt(number);
		System.out.println(money + "億円ほしい");
	}
}
```

3行目で文字列 １ を変数 number に代入します。
4行目で文字列から数字に変換した 1 を変数 money に代入します。

```コンソール.
1億円ほしい
```

# int 変数 = new java.util.Random().nextInt(乱数の上限値);
:sunny: 乱数を発生させる（毎回ランダムに違う値を取り出す）
:sunny: 乱数の上限値には指定値は含まない

```例.java
public class Main {
	public static void main(String[] args) {
	    int number = new java.util.Random().nextInt(6);
		System.out.println(Number);
	}
}
```

3行目に乱数を発生させる命令文を記入。
ここで少し気をつけてほしいのが
nextInt(6); の部分です。
【乱数の上限値には指定値は含まない】と記入しましたがここのことです。

カッコのなかには数字の 6 を入力しています。
これは 0〜5 までの数値をランダムで表示するということです。
指定値を含まないというのは 6 を含まないということです。

他の方法で１から５までの数字をランダム表示させたいのであれば

```例.java
int number = new java.util.Random().nextInt(5) + 1;
```

とするか

```例.java
int number = new java.util.Random().nextInt(5);
number++;
```

で 1〜5 の数字がランダム表示されます:smile: 

# String 変数 = new java.util.Scanner(System.in).nextLine();
:sunny: キーボードから文字を入力できる

```例.java
public class Main {
	public static void main(String[] args) {
	    System.out.println("名前を入力してください");
	    String name = new java.util.Scanner(System.in).nextLine();
		System.out.println("こんにちは" + name + "さん");
	}
}
```

3行目で 名前を入力してください と表示されます。
４行目で文字を打ち込めるようになるので好きな名前を入力します。
入力した名前を変数 name に代入します。

```コンソール.
名前を入力してください
みき
こんにちはみきさん
```

# int 変数 = new java.util.Scanner(System.in).nextInt();
:sunny: キーボードから整数を入力できる

```例.java
public class Main {
	public static void main(String[] args) {
	    System.out.println("今日は何日ですか？");
	    int day = new java.util.Scanner(System.in).nextInt();
		System.out.println("今日は" + day + "日なんですね");
	}
}
```

3行目で 今日は何日ですか？ と表示されます。
４行目で整数を打ち込めるようになるので好きな整数を入力します。
４行目で入力した日付を変数 day に代入します。

```コンソール.
今日は何日ですか？
２9
今日は29日なんですね
```
LINE Imagemap「Unable to load image」の罠

LINEのMessaging APIにてimagemapをいじっていたら表題の罠にハマったので備忘録として共有。

# baseUrlの末尾に/をつけるな
上記に尽きるのですが、何が罠かって環境によっては<b>baseUrlの末尾に/があっても画像にアクセスできてしまう</b>。


|環境|末尾に/あり|末尾に/なし|
|---|---|---|
|iOS版|×(unable)|○|
|android版|○|○|

PCやiPadでの挙動は未確認ですし、LINEのバージョンまでは確認しておりませんが、同様の事象でお困りの方もいると思うのでとりあえず共有だけしておくことにします。
というわけで、<strong>imagemapのbaseUrl末尾に/をつけるな。</strong>
【Excel】XMLからタグ名と値を取り出す

未だXMLは使われ続けています。

「データのやりとりはJSONでやれ」「XMLなど悪魔に拐われろ」ですって？　きっとそうなのでしょう。ですがXMLを使ったシステムをメンテナンスする機会があるかもしれません。出力したXMLのデータが正しいか、つまり、電話番号がハイフン区切りか、IDが8桁かどうか、そういったことのチェックをしなければならぬ日もあることでしょう。その仕様書はおそらくExcelでしょう。

ExcelでXMLが捌けたら！
タグの中のデータだけ取り出せたら！

そんな夢を、Excelの関数だけで実現します。

## 完成品
* XML
![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244351/78c01125-5a0f-df1d-4b88-2b6fb094dad3.jpeg)


* タグ名

```Excel
=MID(LEFT(A3,FIND(">",A3)),2,LEN(LEFT(A3,FIND(">",A3)))-2)
```

* 値

```Excel
=MID(A3,FIND(">",A3)+1,FIND("<",A3,2)-FIND(">",A3)-1)
```


## 完成に至るまで
※お暇な方だけお付き合いくださいませ。

### タグ名
1. まずはタグ（例として`<id>`）を抜き出そう。`<id>`が4文字だから、先頭から4文字抜き出そう。

	```Excel
	=LEFT(A3,4)
	```

2. でも`<Name>`だと6文字になる。開始タグの文字数を調べよう。

	```Excel
	=FIND(">",A3)
	```

3. これで開始タグは取り出せた。

	```Excel
	=LEFT(A3,FIND(">",A3))
	```

4. `<>`を除去したい。2文字目 (`I`)から2文字抜き出そう。

	```Excel
	=MID(A3,2,2)
	```

5. でも`<Name>`だと4文字抜きださないと。タグの文字数-2（`<>`の2文字分）でいいはず。

	```Excel
	=LEN(LEFT(A3,FIND(">",A3)))-2
	```

6. 完成

	```Excel
	=MID(LEFT(A3,FIND(">",A3)),2,LEN(LEFT(A3,FIND(">",A3)))-2)
	```

### 値
1. `Mid`関数が使えそう。

	```Excel
	=MID(A3,5,7)
	```

2. `Mid()`の開始位置は開始タグの文字数＋１でよさそう。

	```Excel
	=FIND(">",A3)+1
	```

3. データ部の文字数は、閉じタグの`<`の位置 －（開始タグの文字数－１）
	※`Mid`関数の開始位置に1（先頭）を指定すると開始タグの`<`がヒットするので、2以降を。

	```Excel
	=FIND("<",A3,2)-FIND(">",A3)-1
	```

4. 完成

	```Excel
	=MID(A3,FIND(">",A3)+1,FIND("<",A3,2)-FIND(">",A3)-1)
	```
AtCoder ARC099 C - Minimization

https://atcoder.jp/contests/arc099/tasks/arc099_a

# 概要
- $[1,2,..,N]$を並び替えた数列$a$がある。(例えば$[3,2,4,1]$)
- あるkが与えており、あなたは任意の連続したk個の数値をその区間の最小値で置き換える。
- この数列すべてが最小の値となるのに、何回置き換えが必要か？その最小数を述べよ。

# アプローチ
まず、`最小の値`とは題意から1であることは分かる。つまり、1を区間`k`ずつ伝搬させていくイメージになる。例えば、以下に$N=7, k=3$の例を示す。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/2964e232-7b4b-2638-99bc-5406caeb7964.png" width=50%>

一番上を例にとると、図のように1を伝搬させられ、4回ですべての要素が1となる。しかし、これは最小の階数ではない。例えば、中段のように取ることで3回で目的を達成できる。

これをよく見ると、以下のことがわかる。
- なるべく重ね合わせがないようにする(すでに1にした場所を1にしても意味がない
- 順番を入れ替えて考えても問題はない(中段と下段を比較)

このため、以下のように考える、
- 左端からすべてのマスを1マスは重ねて舐める。基本的に重ねるのでk-1マスずつ塗れる
- ただし、最初の塗りは左端を重ねる必要がないので、kマス塗れる

# コード
```Python
import math
n, k = map(int,input().split())
dat = list(map(int, input().split()))
 
i = dat.index(1) + 1 # 1 origin で i 個目に 1 がある
 
reached = k # 最初の1歩はkマス塗れる
# a: 残りはk-1マス塗れるので、残っている分を塗る(k<nなのでマイナスは考えない)
a = math.ceil((n - reached) / (k - 1))
print(1 + a)
```
https://atcoder.jp/contests/arc099/submissions/10403471
TeamsのファイルをPower BIで表示しよう

Microsoft Teamsのチーム等にあるファイルをPower BIデスクトップで開く方法を記します。

~ [本投稿には続編があります。](https://qiita.com/ishiayaya/items/72e80318ed4de17e09ef?fbclid=IwAR0DI4X72fp88l58cF1AHvRkoNzC2mQaTyyi6xJaKzv0rxfHhdySUBxLxlY)是非どうぞ。

## はじめに（全体像）
概要を図示すると以下になります。
![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/376faeac-f91b-3c46-682e-8aa8b8d74c3c.jpeg)


## 参考

Docsでの同様の説明は以下になります。(@yugoes1021 教えていただきありがとうございます。)
[Power BI Desktop で OneDrive for Business リンクを使用する - Power BI | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-bi/desktop-use-onedrive-business-links)

## TeamsにあるExcelファイルのアクセス先（パス）を取得する

該当ファイルの・・・（アクションの表示）から開く>Excelで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/d8718cfc-e469-b80a-75a0-4e058521042e.png)
画面はWEBブラウザ版のTeamsです。アプリでも同様。

Excelで[ファイル]>[情報]の上部からパスをクリップボードに保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/a0bb7714-2b5b-c56c-2c81-b151f61b337b.png)
* Excelのバージョン等によって画面と多少メニューが異なる場合があります。

## Power BI Desktopから接続

[ホーム]/[データを取得]/[Web]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/fc8b27ed-3a1e-cc8d-6cb6-e6441901ad35.png)

先程のクリップボードのパスを貼り付けて、URLの最後「?」以下のパラメータを削除して、OKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/9c61812f-a15b-429a-be6c-e999da5c4ae9.png)

あとは通常の動作で、データが読み込まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/21a6e642-8280-e357-6ef4-e3ae39fdffdb.png)

## Teams上のExcelが更新された場合

Excelの内容が更新された場合の確認で、Teams上のExcelを更新しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/7db0d8f1-bf2c-7ea7-a6bc-a629c6342e74.png)

Power BIの更新をすることでデータが更新されました!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/5f9e5eca-cbe5-64fa-9330-0c2323ebe03d.png)

## （さらに）Power BI Serviceに発行した場合

検証用に簡単なVizを作ってから、Power BIサービスに発行し、その後Teamsでファイルが更新された場合、Power BI Serviceでも更新されるか確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/f40235b0-35b0-1417-f6db-e63708ec5138.png)

元データを1行追加して更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/3b237e4c-d904-01cc-1e27-c1c9ac6c9e39.png)

Power BI Serviceのデータセットの更新をしてもうまく反映されません。
そこでデータセットの設定の[データソースの資格情報]がエラーになり、うまく接続できていないことがわかりました。Office365上の資格情報を利用するので、以下のように設定し、Office365の認証（サインイン）を行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/a11fbab5-60a5-3501-bd4a-bef0116dadb8.png)

その後、データセットの更新、レポートの更新を行い、更新データを確認することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/bc4850a2-d204-f886-ff74-69c7e9f68714.png)


## おわりに
 
 2020/2/29にオンライン開催された[Power BI 勉強会 @ 東京 #16 - connpass](https://powerbi.connpass.com/event/165258/)で、 @PowerBIxyz さん、 @yugoes1021 さんに教えていただきました。他にもTeams（実際のファイルはSharePoint Online）のファイルにPower BIからアクセスする方法はあるかと思いますが、このやり方が一番わかりやすいです。教えていただき誠にありがとうございます!

~ [本投稿には続編があります。](https://qiita.com/ishiayaya/items/72e80318ed4de17e09ef?fbclid=IwAR0DI4X72fp88l58cF1AHvRkoNzC2mQaTyyi6xJaKzv0rxfHhdySUBxLxlY)是非どうぞ。
PHPだけでWordpressのDBダンプ

#概要
プレーンなphpファイル1本だけでDBダンプやってみました。
Wordpress用ですがwp-config.phpの代わりにdefineを設定すればほかのCMSにも応用可能です。

#注意事項
ローカル環境で興味本位に試した方法なのでレストア・セキュリティ考慮まったく無しです。
実際のサーバー環境での使用は激しくお勧めしません。
**もしこのプログラムをコピペして使用する際は何が起きても全て自己責任でお願いします。**


#実装
```php:wp/dump/Terminator.php
<?php
//wp-config.php を読み込む
include dirname(dirname(__FILE__)).'/wp-config.php';

//プログラムの配置ディレクトリに移動
//※この場所にDBダンプファイルを作る
$outputDir = dirname(__FILE__);
exec('cd '.$outputDir);

//出力ファイル名
$outputName = DB_NAME.'.dump.sql';

//DBダンプコマンド組み立て
$cmd = [];
$cmd[] = 'mysqldump --add-drop-table';
$cmd[] = '--databases '.DB_NAME;//MySQLデータベース名
$cmd[] = '-h '.DB_HOST;//MySQLサーバー名
$cmd[] = '-u '.DB_USER;//MySQLユーザー名
$cmd[] = '-p'.DB_PASSWORD;//パスワード

$cmd[] = '>'.$outputName;//ファイル名

//コマンド実行
exec(join($cmd, ' '), $output);

//おしまい
echo "dump! I'll be back!";
unlink(__FILE__);
?>
```
rustでAM変調、復調

#概要

rustでAM変調、復調やって見た。
復調は、IQ変換使ってます。SDRです。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4baae58d-a07c-8a12-2064-6c2ac0f4d98f.png)

#サンプルコード


```
use std::f32::consts::PI;

fn lpf(input: [f32; 300], samplerate: f32, freq: f32) -> [f32; 300] {
    let q = 1.0;
    let omega = 2.0 * PI * freq / samplerate;
    let alpha = (omega).sin() / (2.0 * q);
    let a0 = 1.0 + alpha;
    let a1 = -2.0 * (omega).cos();
    let a2 = 1.0 - alpha;
    let b0 = (1.0 - (omega).cos()) / 2.0;
    let b1 = 1.0 - (omega).cos();
    let b2 = (1.0 - (omega).cos()) / 2.0;
    let mut output = [0.0; 300];
    let mut in1 = 0.0;
    let mut in2 = 0.0;
    let mut out1 = 0.0;
    let mut out2 = 0.0;
    for i in 0..300
    {
        output[i] = b0 / a0 * input[i] + b1 / a0 * in1 + b2 / a0 * in2 - a1 / a0 * out1 - a2 / a0 * out2;
        in2 = in1;
        in1 = input[i];
        out2 = out1;
        out1 = output[i];
    }
    return output;
}
fn main() {
    let mut src = [0.0; 300];
    let mut am = [0.0; 300];
    let mut I = [0.0; 300];
    let mut Q = [0.0; 300];
    let mut I2 = [0.0; 300];
    let mut Q2 = [0.0; 300];
    let mut o = [0.0; 300];
    for t in 0..300
    {
        src[t] = (t as f32 / 8000.0 * 2.0 * PI * 220.0).sin() * 2.0 - 1.0;
    }
    for t in 0..300
    {
        am[t] = (0.6 * (t as f32 / 8000.0 * 2.0 * PI * 220.0) + 1.0).sin() * (t as f32 / 8000.0 * 2.0 * PI * 3000.0).sin() * 2.0 - 1.0;
    }
    for t in 0..300
    {
        I[t] = am[t] * (t as f32 / 8000.0 * 2.0 * PI * 2800.0).cos();
        Q[t] = am[t] * (t as f32/ 8000.0 * 2.0 * PI * 2800.0).sin();
    }
    I2 = lpf(I, 8000.0, 300.0);
    Q2 = lpf(Q, 8000.0, 300.0);
    for t in 0..300
    {
        o[t] = (I2[t] * I2[t] + Q2[t] * Q2[t]).sqrt() * 4.0 - 6.0;
    }
    println!("<html><head></head><body>");
    println!("<canvas id=\"canvas\" width=\"300\" height=\"500\"></canvas>");
    println!("<script type=\"text/javascript\">");
    println!("var canvas = document.getElementById(\"canvas\");");
    println!("var ctx = canvas.getContext(\"2d\");");
    println!("function draw(data, h) {}", "{");
    println!("ctx.strokeStyle = \"#f0f\";");
    println!("ctx.lineWidth = 2;");
    println!("ctx.moveTo(0, h * 130 + 50);");
    println!("for (var i = 1; i < canvas.width; i++) ");
    println!("{}", "{");
    println!("ctx.lineTo(i, h * 130 + 50 - data[i] * 30);");
    println!("{}", "}");
    println!("ctx.stroke();");
    println!("{}", "}");
    println!("var src = [");
    for i in 0..300 
    {
        print!("{}, ", src[i]);
    }
    println!("];");
    println!("draw(src, 0);");
    println!("var am = [");
    for i in 0..300 
    {
        print!("{}, ", am[i]);
    }
    println!("];");
    println!("draw(am, 1);");
    println!("var o = [");
    for i in 0..300 
    {
        print!("{}, ", o[i]);
    }
    println!("];");
    println!("draw(o, 2);");
    println!("</script></body></html>");
} 



```


#成果物

https://paiza.io/projects/wpptVytcktoBetkSraAEqg

以上。
[paiza レベルアップ問題集] 日付セット　曜日　（paizaランクB相当)　youtubeの解説動画を視て修正

[一度解いたpaizaの問題](https://qiita.com/4984208fkoak/items/bb54b725a7bba7ef69ad)を[youtubeの解説動画](https://www.youtube.com/watch?v=Qx5XMzSevrQ)を視て修正。

```c#
namespace DayOfWeek2
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Trim().Split(' ');
            int year = int.Parse(input[0]);
            int month = int.Parse(input[1]);
            int day = int.Parse(input[2]);
            int[] date = new int[] { 1800, 1, 1 };
            int count = 0;
            while(date[0] != year || date[1] != month || date[2] != day)
            {
                //一日進める
                date = nextDate(date[0], date[1], date[2]);
                count++;
            }
            string[] dayOfWeek = new string[] { "水", "木", "金", "土", "日", "月", "火" };
            
            Console.WriteLine(dayOfWeek[count % 7] + "曜日");
        }
        //うるう年か判断するメソッド
        static bool isLeap(int year)
        {
            return year % 400 == 0 || year % 100 != 0 && year % 4 == 0;
        }
        //ある年月の最終日を計算
        static int lastDay(int year, int month)
        {
            switch(month)
            {
                case 2:
                    if (isLeap(year))
                    {
                        return 29;
                    }
                    else
                    {
                        return 28;
                    }
                case 4:
                case 6:
                case 9:
                case 11:
                    return 30;
                default:
                    return 31;
            }
        }
        //翌日の年月日を返す
        static int[] nextDate(int year,int month, int day)
        {
            day++;
            if(day > lastDay(year, month))
            {
                day = 1;
                month++;
            }
            if(month > 12)
            {
                month = 1;
                year++;
            }
            return new int[] { year, month, day };
        }
    }
}

```
【RSpec】実行に時間がかかっているテストを抽出する方法

RSpecのテストケースが増えてくると実行時間も増えて、テスト全体の実行にすごく時間がかかる...なんてことありませんか？
profileオプションを使用するとexampleごとの実行時間がわかり、遅いテストを抽出することができます。

## 遅いテストを抽出する
```$ bundle exec rspec --profile```
デフォルトでは、遅いexample上位10個とその実行時間が出力されます。

```bundle exec rspec --profile > ファイル名```でファイルへの出力も可能です。

```
$ bundle exec rspec --profile
...
Top 10 slowest examples (84.27 seconds, 17.0% of total time):
  test example1...
    13.98 seconds ./spec/requests/example_spec.rb:230
  test example2...
    7.91 seconds ./spec/requests/example_spec.rb:232
  test example3...
    7.84 seconds ./spec/requests/example_spec.rb:109
...
 
Finished in 8 minutes 14 seconds
1252 examples, 1 failure
```

`--profile`の後ろに件数を指定することで、出力する件数を変えることができます。
`$ bundle exec rspec --profile 20`と指定すると、遅いexample上位20個が出力されます。

## すべてのテストの実行時間を調べる
`$ bundle exec rspec --profile 全example数`と指定すれば、すべてのexampleの実行時間がわかります。
テストケースが多くてexample数がわからないという場合は、以下のコマンドでテストを実行せずに調べられます。
`$ bundle exec rspec -f d --dry-run --order defined`

## 参考
- [RSpec の –profile オプションで時間のかかる遅いテストを調べる | EasyRamble](https://easyramble.com/list-slowest-examples-with-rspec.html)
- [RSpecで作ったexampleの一覧をテストの実行なしに出力する - Qiita](https://qiita.com/jnchito/items/855d9cffc1f3ca048af2)
【JavaScript】多分これが一番簡単なwait関数だと思います

#概要
タイトル通り、処理を待機する関数のコードを紹介します。ただし、関数内でしか使えません。

#ソースコード
##関数
```js
async function wait(second) {
	return new Promise(resolve => setTimeout(resolve, 1000 * second));
}
```

##使用例1
```js
async function log() {
	console.log("3秒後にログを表示します。");
	await wait(3);
	console.log("3秒経過しました。");
}

log();
```

##使用例2
```js
(async () => {
	console.log("3秒後にログを表示します。");
	await wait(3);
	console.log("3秒経過しました。");
}
)()
```
Struts2 iBasis DB連携ライブラリ関係のパス

##Spring設定ファイル
**・applicationContext.xml**
web.xml の中の\<context-param>タグの中で任意で指定する。
WEB/INF/classes/ 直下がデファクト？

##JDBC （DBアカウント等）設定ファイル
**・datasource.properties**
ファイル名は任意。datasource.propertiesやjdbc.propertiesなど。
applicationContext.xmlの中の\<context:property-placeholder>でパスを定義する。
applicationContext.xmlの中の\<bean id="dataSource">タグでこのプロパティファイルの中で指定したDB情報をDAOjavaBeanクラスとバインドする。

##iBasic連携設定
**・sqlMapConfig.xml**
applicationContext.xmlの中の\<bean id="splMapClient">タグで任意のパスを指定。
iBasisでのSQL文が書かれたxmlファイルパスを列挙する。
git resetでコミットを取り消す時のオプションをまとめてみた

# 要約
HEADの位置を変えるコマンド。
色々コード修正してコミットしたらうまく動かなくなってしまったので使ってみました。
調べてみたらひとくちにresetといっても3種類のオプション(--soft, --mixed, --hard)があり、オプションによってWorking treeやIndexへの影響が変わるみたいです。

以下の状態からgit resetを使うとどうなるのか、説明してみます。
今Dまでコミットされており、HEADとIndexとWorking treeは全てDの状態です。

```
A <--- B <--- C <--- D
-------------------(HEAD)
-------------------(Index)
-------------------(Working tree)
```

# git reset --soft
Working treeとIndexはそのままにHEADのみを指定のコミットに戻すコマンド。

```
構文
$ git reset --soft [コミットを指定]

例 (2世代前のコミットに戻す)
$ git reset --soft HEAD~2
```

**実行後**
コミット取り消されがHEADのみが2つ前のBに戻りました。

```
A <--- B <--- C <--- D
-----(HEAD)
-------------------(Index)
-------------------(Working tree)
```

**具体的な使用シーン** 
コミットした内容を修正したいが、修正量は少ないケース

# git reset --mixed
Working treeはそのままにIndexとHEADを指定のコミットに戻すコマンド。

```
構文
$ git reset --mixed [コミットを指定]

例 (2世代前のコミットに戻す)
$ git reset --mixed HEAD~2
```

**実行後**
コミット取り消されHEADとIndexが2つ前のBに戻りました。

```
A <--- B <--- C <--- D
-----(HEAD)
-----(Index)
-------------------(Working tree)
```

**具体的な使用シーン** 
複数ファイルに渡る変更をコミットしたが、addする対象、内容を見直したいケース。

# git reset --hard
Working tree、Index、HEADを指定のコミットに戻すコマンド。

```
構文
$ git reset --hard [コミットを指定]

例 (2世代前のコミットに戻る)
$ git reset --hard HEAD~2
```

**実行後**
コミット取り消されHEADとIndexとWorking treeが2つ前のBに戻りました。

```
A <--- B <--- C <--- D
-----(HEAD)
-----(Index)
-----(Working tree)
```

**具体的な使用シーン** 
変更点が多い場合や、何故か動かなくなったので動いていた時の状態に戻したいケース。

# 参考にさせて頂いた記事
[いまさらだけどGitを基本から分かりやすくまとめてみた](https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0#はじめに)
[git resetでどのオプション(hard, mixed, soft)を指定すべきか、シチュエーション別に分けてみる](https://qiita.com/kmagai/items/6b4bfe3fddb00769aec4)
Laravelでwhere検索する時、部分一致を用いても検索できない

# クエリビルダWHERE節で部分一致検索をする時
まず、ドキュメントは[こちら](https://readouble.com/laravel/5.7/ja/queries.html)

```php
$this->where('title', 'like', '%$word%')->get();

$this->where('title', 'like', "%$word%")->get();
```

このように記述すれば、`title`カラムで`$word`と部分一致するカラムだけを取得できる。

しかし、上の記述だと、第３引数が`''`で囲まれているため、変数`$word`が展開されず、そのまま`$word`として検索してしまう。これを`""`として囲ってあげることで、展開され、検索できる！

基本的なことだが、第１、２引数を`''`で囲んでいるため、流れで第３引数も`''`で囲ってしまい検索できないという結果になるので、`LIKE`を用いる際は、第３引数を`""`で囲む！
専門学校生がLaravelとjQueryで抽選機作ってみた（機能紹介編）

# はじめに
初投稿です！！
2019年の11月あたりから夏休み中に独学したLaravelで、成人式の交流会のために制作しておりました。
今回の記事は主に機能の説明をして、開発エピソードはまた今度にしていこうと思います。
[GitHubのリポジトリ]https://github.com/kbc18a11/Lottery
[実際に制作したもの]https://seizinshikilottery.herokuapp.com/
今回作ったもののトップページです。
![トップ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/8ee6649c-da34-6a65-3873-b9ed0bad955f.png)

#使用技術
* Laravel
* jQuery
* Bootstrap
* MySQL
* Heroku

#実装した機能
■ユーザー関係
ユーザー登録
ログイン・ログアウト

■大会関係
大会主催
大会検索
自ユーザー主催大会一覧表示

■当選関係
当選種類作成
当選種類編集
当選種類削除
当選番号当選
当選番号編集
当選番号削除
当選番号確認
当選番号一覧表示

#機能紹介
* **ユーザー関係**  
Laravelのartisanコマンドのもので実装しました。
* **大会主催**  
大会の主催はナビゲーションバーから行います。  
![ezgif-6-33a1f99b0a92.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/217b1d2a-f639-9ccc-1594-269c9168176d.gif)
* **大会の検索や自分が開いたものを見る**  
検索はナビゲーションバーで検索を行い、自分が開いたものはドロップダウンメニューから見ることができます。  
![ezgif-6-27526c20ef24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/05f684f3-1672-f641-f856-b01fe4839b2f.gif)
* **当選種類の追加**  
当選させる人数の設定も可能です。  
![ezgif-6-312e29e63278.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/5e47e98c-94ed-d46e-470d-ad6a4795a1fa.gif)
* **当選種類の追加**  
追加したものの一覧から、内容の更新や削除が可能です。
また、削除に関してはAjaxを利用しています。  
![ezgif-6-da56740e4e19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/c2752a11-4ab5-6e26-4bc0-1e14f6cba8cb.gif)
* **番号の当選**  
Ajaxのリクエスト後にLaravel側で番号を当選した後に、モーダルウインドウでの演出で番号が発表されます。  
![ezgif-6-4e6d54913caf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/dba6368b-8fd5-7119-b4b8-8637780dc9b9.gif)

演出はないのですが、番号の範囲も決めることができます。  
![ezgif-6-65c72f14a154.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/b3425a06-5ec0-1dd6-102a-3c17c4753503.gif)
* **番号の更新や削除**  
当選した番号に何か不都合があった場合に、下の一覧で番号の更新や削除を行えるようにしています。  
![ezgif-6-2fdcc6514479.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/19b5acc6-07dc-0167-acce-25a6a0708a9a.gif)
* **当選した番号の確認**  
当選した番号は、一覧で確認ができたり、番号の検索でも確認することができます。
また、大会を主催したユーザー以外でも確認をすることができます。  
![ezgif-6-6395c4ad8d04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/d18c11a4-d8c7-dc73-7356-aa81e8e10ac1.gif)

#さいごに
制作期間は、バイトや学校の勉強をしながらだったため、2ヵ月となりました。
今思えば、あまり直感的なUIでないと思います。
初投稿でしたが、録画作業を含めて、動画をgifに変換することが大変だったです。
今現在Vueを使ったSPAの勉強をしているため、また何かつくときにこの経験を生かしていこうと思います。
【Angular】ネストしたformGroupを初期化する方法

## この記事の概要

ネストしたフォームグループのバリデーションの設定はそのままに値を初期化したい時、フォームグループの項目が多い場合、一つ一つpatchValueしていくのは大変です。

そこで、ネストフォームグループの初期設定を外だしして、setControlを使って初期化します。

## 実装

```ts
  parentForm: FormGroup;

  get fCtrl(): { [key: string]: AbstractControl } {
    return this.parentForm.controls;
  }

  get fChildCtrl(): { [key: string]: AbstractControl } {
    return (this.parentForm.controls.childGroup as FormGroup).controls;
  }

  constructor(
    private fb: FormBuilder
  ) { }

  ngOnInit() {
    this.parentForm = this.fb.group({
      id: [null],
      parentName: [null, [Validators.required]],
      childGroup: this.getDefaultChildForm()
    }, {
      updateOn: 'submit'
    });
  }

  /**
   * 子フォームグループの初期値取得.
   */
  private getDefaultChildForm(): FormGroup {
    return this.fb.group({
      childName: [null, [Validators.required]],
      childCount: [null, [Validators.required]]
    });
  }

  /**
   * 子フォームグループを初期値する.
   */
  onInitChildForm(): void {
    this.parentForm.setControl('childGroup', this.getDefaultChildForm());
  }

  onSubmit(): void {
    if (this.parentForm.invalid) {
      alert('invalid!');
      return;
    }
    // submit処理
  }
```

```html
<mat-card>
  <form
    [formGroup]="parentForm"
    (ngSubmit)="onSubmit()">
    <mat-card-content>
      <mat-form-field class="form-element">
        <mat-label>parentName</mat-label>
        <input
          matInput
          formControlName="parentName">
        <mat-error *ngIf="!fCtrl.parentName.valid">必須項目です</mat-error>
      </mat-form-field>

      <div formGroupName="childGroup">
        <mat-form-field class="form-element">
          <mat-label>childName</mat-label>
          <input
            matInput
            formControlName="childName">
          <mat-error *ngIf="!fChildCtrl.childName.valid">必須項目です</mat-error>
        </mat-form-field>

        <mat-form-field class="form-element">
          <mat-label>childCount</mat-label>
          <input
            matInput
            formControlName="childCount">
          <mat-error *ngIf="!fChildCtrl.childCount.valid">必須項目です</mat-error>
        </mat-form-field>
      </div>

    </mat-card-content>

    <mat-card-actions>
      <button
        mat-raised-button
        type="submit"
        color="primary">
        登録
      </button>
      <button
        mat-raised-button
        type="button"
        (click)="onInitChildForm()"
        color="primary">
        子フォーム初期化
      </button>
    </mat-card-actions>
  </form>
</mat-card>
```

## 動作確認

### 入力
<img width="386" alt="スクリーンショット 2020-02-29 17.44.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566220/45dc02b9-832f-1e0a-38d8-568200490388.png">

### 初期化
<img width="396" alt="スクリーンショット 2020-02-29 17.43.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566220/db53cdf0-b678-40df-131e-025d5b92f183.png">

### 登録ボタン押下
<img width="395" alt="スクリーンショット 2020-02-29 17.48.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566220/b3b936d8-4593-d5a2-5bc2-25daaff5f151.png">
QAスキルセット

**「[QAエンジニア](https://qiita.com/jun2014/items/32ec77be1056f546aada#テスト担当でも名称がいろいろ)」** のページでご紹介した　**それぞれの「QAスキル」** を考えてみました。


「**QAテスター**」「**QAエンジニア**」「**QAリーダー（QAマネージャー）**」の**3つ**についてになります。

※あくまで　**目安**  になります。

また、初級レベルの場合は、**新人スキル:beginner:**、中級レベルの場合は、**初級レベル**、上級レベルの場合は、**中級レベル**の　**「スキル必須」** となります。

今後、**「QAコンサルタント」** や　**「QAディレクター」** や　**「SETエンジニア」** 等の役職スキルも追加:edit-request:する予定になります。

| スキル     |経験年数<br>（目安）  |    QAテスター:man_tone2: |   QAエンジニア:person_with_blond_hair_tone3:<br>（QAテスター経験有無）    |QAリーダー:person_with_blond_hair_tone4:<br>（QAマネージャー） |
|:-----------------:|:-----------------:|:------------------|:------------------|:------------------|
| :one:新人:beginner:            |本当の新人<br>:beginner: |:one:担当するサービスを理解している<br>:two:テスト仕様書に書かれている内容を理解でき、実行ができる<br>:three:判断に困る場合は、仕様書作成者に質問でき、解決できる           |  :one:企画仕様書を読んで理解ができる<br>:two:簡単なテスト設計ができる<br>:three:テスト仕様書の作成ができる <br>:four:QA実施、実施報告までできる |QAエンジニアの上級が必須であり、最初からリーダーになることもないだろうと。|
| :two:初級          |新人完了から:two:年|:one:テストデータ、利用アカウントの準備も含め、QA実施前何をやるべきか理解できる<br>:two:実施時は、チケットアサイン者にわかりやすい不具合チケットの作成ができる（必ず再現ができる内容）<br>:three:新人:beginner:に教えることができる<br>:four:何を持って実施完了かを理解している         | :one:テスト計画書の作成ができる<br>:two:テスト設計書の作成ができる<br>:three:テスト仕様書の質のこだわり<br>:four:リーダーの指示に従い作業ができ、指示以上の成果を出せるよう動いている<br>:five:新人:beginner:に教えることができる<br>:six:JSTQBのFoundation Levelを理解している           |:one:テストベンダーもしくは関係会社と外部折衝ができる<br>:two:上長へ対し作業提案ができる<br>:three:メンバーとの1on1の質と改善<br>:four:テストフロー（の改善案）を提示できる<br>:five:最新のQAのキャッチアップができる||
| :three:中級           |:three:年から:five:年|:one:テスト仕様書の内容だけでなく、サービスや機能から必要なテストを考えることができる<br>:two:仕様書作成者にテスト項目の改善や作りに対し提案できる  | :one:数値管理での作業（実施数値、進捗率、不具合検出率など）目標値を決める<br>:two:レビューアとして的確に指摘ができる<br>:three:開発やインフラ関係者を集めて作業提案ができる<br>:four:SETエンジニアの初級レベルは理解している          |:one:サービスごとに、どんなテストが必要なのか考察できる<br>:two:ブロックした場合のリスクヘッジなどを考えることができる<br>:three:PMBOKの内容を理解している<br>:four:PMO相当を目標に置ける||
| :four:上級           |:six:年以上|:one:仕様書がなくても、経験（探索的テスト）で不具合がありそうな箇所を察知できる<br>:two:テストツールを駆使し、実行ができる<br>:three:QAエンジニア新人レベルは理解している  |:one:テスト自動化の知見があり、チーム内に推進できる<br>:two:非機能（負荷テスト、セキュリティテスト）の知見があり、実行もできる<br>:three:バックエンドのテスト、様々なテストに対し取り組みことができる。<br>:four:SETエンジニアの中級レベルは理解している<br>:five:社内（社外）で成果発表会もしくはQA共有会を開催し、QAとはを植え付けることができる。  |:one:QAマネージャの代理ができる<br>:two:QAの組織計画や予算編成ができる<br>:three:採用業務（採用計画、求人内容、レジュメ確認、面接官）ができる<br>:four:オンボーディングの対応ができる<br>:five:PMと連携し作業改善や新規タスクに取り組める環境作り<br>:six:NDAや契約周りの対応ができる<br>:seven:JSTQBのAdvanced Levelレベルを理解できる||
MacにDocker環境構築してみる

勉強のためにおうちPC環境を充実させよう企画
※おうちPC環境
　iMac (Retina 4K, 21.5-inch, 2017)
　3.6 GHz クアッドコアIntel Core i7
　16 GB 2400 MHz DDR4
#Dockerって
会社で使っているのですが，これなしで環境構築はもう無理になってしまいました。
ローカルに環境ブチ立てるなど恐ろしくてできない，，，
私はこれでdockerなんぞやを学びました。素晴らしい記事
[https://qiita.com/gold-kou/items/44860fbda1a34a001fc1](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1) 

- ローカルPC環境汚したくない
- 1つのPC上にいろんな環境を同居させたい

という人には本当に心からお勧めしたいです。
pyenvとかやってる場合じゃない。ほんとに。
私はよく環境構築ミスるのでどんどこコンテナ作ってどんどこコンテナ消してる

#Docker for Macをインストールする
簡単も簡単。dockerアカウント作って，dockerをダウンロード，サインインするだけです。
dockerのアカウントはこちらから
[https://www.docker.com/](https://www.docker.com/)
docker for Macのダウンロードはこちらから
[https://hub.docker.com/editions/community/docker-ce-desktop-mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)

#以下を読む上で必要な用語

- コンテナ　：　dockerの仮想環境１単位のことを指す。この中に閉じた環境を作成することができる。
- docker image(ドッカーイメージ)　：　コンテナのもとになる環境が包含されたもの。docker hub上には公式（python開発元など）が配布しているイメージの他に個人が作成・公開しているイメージもある。

#使ってみる
コンテナを作ってみます,とりあえずはpython3の環境をば
ターミナルを立ち上げて，

```
docker run -it --name hogehoge python:latest bash
```
これでpythonの一番新しいバージョンがインストールされたhogehogeというコンテナにログインできるようになります。
イメージは自分のPCのローカルに同じイメージがあればローカルから，無ければdocker hubから探してダウンロードしてきてくれます。探す手間なし，非常にありがたい

- **docker run** ：dockerを起動させるためのコマンド
- **-it ~~ bash** ：ログインできるコンテナを作るためのコマンド
- **~~部分** ：コンテナ名，持ってくるdockerイメージなどを指定する

とりあえずは↑という認識で良いかと思います
~~部分のコマンドは以下URL参照
[http://docs.docker.jp/engine/reference/commandline/run.html] (http://docs.docker.jp/engine/reference/commandline/run.html)

よく使うのはディレクトリのマウント「-v」などかと
proxyの設定が必要な場合はまず設定するべし。
nvidiaのGPU使いたい時はちょっとまた独特な設定が必要。

#コンテナの出入り
いったんコンテナから抜けたい時は

>**⌘command+p+q**

で抜けられます
抜けた状態からまたコンテナに入りたい時は

```
docker attach hogehoge
```

コンテナを停止したい時は**コンテナ内**で

```
exit
```

もしくは**コンテナ外**で

```
docker stop hogehoge
```
一度停止したコンテナを立ち上げる時は

```
docker start hogehoge
docker exec -it hogehoge bash
```

の手順を踏むのがベター

#終わりに
機械学習でとっかえひっかえいろんな環境を使ってみたいときにはマストだと思います
これでおうち機械学習を心置きなくできるぞ！

おしまい
【Nuxt.js】非同期通信を含むサーバーサイドレンダリング

学んだことをアウトプットしていきます。
今回はNuxt.jsでシンプルなSSRを書いていきます。

Qiitaのアクセストークンを用いてQiitaに「Nuxt.js」タグを付けて投稿された記事を20件表示させる処理です。
アクセストークンはこのURLにアクセスして発行出来ます。
[Qiitaアクセストークン](https://qiita.com/settings/tokens/new)

####tempalte処理
早速書いていきましょう。
まずpagesフォルダ配下にindex.vueを作成してください。
変数itemsに取得したデータを挿入するので、v-forでそれぞれ取り出して表示させます。
記事のタイトル、ユーザーID、投稿記事、URLを表示してみました。
記事本文が130文字を超える部分は「...」として省略しています。

```js:pages/index.vue
<template>
  <section class="container">
    <div>
      <h3>Nuxt.jsのタグが付けられた投稿一覧</h3>
      <ul>
        <li v-for="item in items" :key="item.id" class="post-list">
          <h4>
            <span>{{ item.title }}</span>
            <small>ユーザーID： {{ item.user.id }}</small>
          </h4>
          <div>{{ item.body.slice(0, 130) }}...</div>
          <p><a :href="item.url">{{ item.url }}</a></p>
        </li>
      </ul>
    </div>
  </section>
</template>
```

####script処理
asyncData関数を利用しています。
非同期通信を実行し、結果としてサーバーサイドレンダリングするための処理です。
「nuxt.js」の箇所を他の文字列に書き換えると、そのタグがつく記事を取得出来ます。

```js:pages/index.vue
<script>
export default {
  async asyncData({ app }) {
    // 'nuxt.js'のタグがつく投稿を取得する
    const items = await app.$axios.$get('https://qiita.com/api/v2/items?query=tag:nuxt.js')
    return {
      items
    }
  }
}
</script>
```

####style処理
特に記述することはありません。

```js:pages/index.vue
<style>
.container {
  min-height: 100vh;
  padding: 16px;
}

h3 {
  margin: 16px 0;
  padding: 8px 0;
  border-bottom: 1px solid #ee5e5e;
}

.post-list {
  margin-top: 30px;
}
</style>
```
fastpagesを使ってJupyter Notebookを簡単にブログに変換する


ディープラーニングの無料オンラインコースで有名なfastaiから[fastpages](https://github.com/fastai/fastpages)というブログ作成ツールが公開されたので、早速使ってみました。

初期設定の部分で多少面倒だと感じる人もいるかもしれないので、手順を日本語でまとめました。
英語の説明で問題ない人は、公式のreadmeを見てください。

## 対象読者
- jupyter notebookをブログに変換するお手軽な方法を知りたい人
- ブログを公開する場所がgithub pagesで問題ない人

## 注意
記事内容は、2020年02月29日時点でのものです。

今後、fastpages導入手順がより簡単になるかもしれないとのことです。
コメント欄にて@peaceirisさんから指摘いただきました。

本記事の内容をお試しになる際には、プルリクエストの文面を念のために確認してください。


## fastpagesの特徴
fastpagesは、github pagesにて公開するブログをJupyter notebookから自動生成するためのツールです。
自動生成にはgithub actionsが使用されており、自分の手元のPCでnotebookからwebサイトをビルドする手間を省けます。

[公式](https://github.com/fastai/fastpages)の説明によると、次のような特徴があります：

- 記事の変更をgithubのmasterブランチにpushすると、自動でブログが生成される。
- Jupyter Notebookをそのまま記事として投稿できる。
- Jupyter Notebookのセルの表示・非表示の切り替えができる。
- 画像、ツイッターカード、youtube動画を埋め込める

## fastpagesを使うための初期設定
はじめにテンプレートを公式のリポジトリからコピーして使用します。
sshキーの設定が完了し、botからのプルリクエストをマージしたら、ブログの完成です。
以降は、記事を投稿・編集するたびに、masterブランチにpushしていきます。

### リポジトリをテンプレートから新規作成
![fastai/fastpages: An easy to use blogging platform, with enhanced support for Jupyter Notebooks. - Gyazo](https://gyazo.com/9b737cb1f170189655c71b2afb3623ef.png)

まず、fastpagesのリポジトリのテンプレートを使って、新規のリポジトリを作成します。
fastpagesのリポジトリにて、"Use this template"をクリックします。

適当に名前をつけてリポジトリを作ります。

![Create a New Repository from fastai/fastpages - Gyazo](https://gyazo.com/05c790e4892348fb7dfdfb3ea7f96ac4.png)

リポジトリを作成してから1分程度待つと、自動的にリポジトリへのプルリクエストが届きます。
このプルリクエストの指示にしたがって設定を進めます。

![Pull Requests · yuki-data/fastpages-sample - Gyazo](https://gyazo.com/3784772ba66887f65875a37a27b6b9a1.png)

### 秘密鍵と公開鍵を登録
プルリクエストの指示内容は以下のとおりです。

- ssh key-pairを作る。ここで生成した公開鍵と秘密鍵を次のステップで登録する。
- リポジトリのSecretsという設定項目で、SSH_DEPLOY_KEYという名前で秘密鍵を登録する。
- リポジトリのDeploy keysという設定項目で、公開鍵を登録する

これらを済ませれば、masterブランチに変更をpushするたびに、webサイトのビルドが実行されます。

具体的には、次のようにします。

プルリクエストで示されている説明によると、8gwifiというツールを使うように勧められますが、手元で作成しても問題ありません。8gwifiは、オンラインで無料で利用できるssh-key pair生成ツールだそうです。

`Select: RSA and 4096 and leave Passphrase blank`とあるので、

```bash
ssh-keygen -t rsa -b 4096
```

で秘密鍵と公開鍵を生成します。

```bash
$ ls /Users/your_name/.ssh/ | grep id_rsa
id_rsa
id_rsa.pub
```

秘密鍵（id_rsa）と公開鍵（id_rsa.pub）を、それぞれ、githubの設定項目にてコピー・アンド・ペーストします。

SSH_DEPLOY_KEYというNAMEは、この通りに入力します。

![Secrets - Gyazo](https://gyazo.com/cde8850c3ca4f0ee71edda971e855362.png)

公開鍵のTitleは適当に決めてもいいです。**Allow write access**にチェックを入れてください。

![Add deploy key - Gyazo](https://gyazo.com/2d1c5e49a0f15397af8318e8f971ae14.png)

これで完了です。

### プルリクエストをマージして、数分待つとgithub pagesにて初期状態のwebサイトにアクセスできる
ssh key-pairの登録が完了したら、最後にプルリクエストをマージします。

これでgithub pagesのurlにアクセスすると、webサイトを見ることができます。

ここまでの一連の流れをyoutube動画で確認できます。

[![How to create your Free Data Science Blog on Github with Fastpages from Fastai - YouTube](http://img.youtube.com/vi/L0boq3zqazI/0.jpg)](http://www.youtube.com/watch?v= L0boq3zqazI)
Windows 10 Home で Docker を使う (macOS でもおなじ！)


## TL;DR

### 前提

以下が Windows に install されている必要があります。

- VirtualBox
- Minikube
- Docker CLI

※ Docker Desktop は不要です！ (Home ならどうせ動きませんよね)

### 実行

PowerShell で以下のように実行します。

```powershell
minikube start --vm-driver=virtualbox --memory=2048 --cpus=2 --mount
minikube docker-env | Invoke-Expression
```
memory、cpus などはお好みで。--mount はつけておくと自動で C:\Users を mount してくれて便利です。
これで Windows で docker が使えるようになります。

```powershell
docker ps
```

以上です。Hyper-V なんていらなかった。WSL とは何だったのか。もっと早く教えてほしかった。

以下は補足の説明です。

## インストール

minikube と docker CLI の install は [Chocolatey](https://chocolatey.org/) を使うのが簡単ですが、他の方法でも構いません。[VirtualBox](https://www.virtualbox.org/) は公式サイトから取得して install すればよいです。特別気にする点はありません。

(例)

```powershell
choco install minikube
choco install docker-cli
```

## 気をつけること

手順のとおり、minikube を使いますので Kubernetes cluster が利用可能になります。必要ないかたにとっては無駄でしかありませんが、(今となっては) そこまでリソースを食うものではないので気にしなくてはよいのではと思っています。そのうち使うこともあるかもしれませんし。削除も可能かもしれませんが、調べていません。

minikube start により VM が起動してその上で Docker が動いています。PowerShell などから docker を実行しても、たとえば disk を mount するときなどは VM が参照されるということを意識する必要があります (C:\ とかは見えません)。VM の中を確認するときは、以下のようにして中に入ることができます。

```powershell
minikube ssh
```

## 発展的な使い方

VS Code で Remote extension や Cloud Code と組み合わせて使うことももちろんできます。そのまま VS Code を起動すると minikube の Docker につながらないため、上記で minikube docker-env から設定した環境変数を引き継いで VS Code を起動する必要があります。**おなじ** PowerShell から以下のように起動するとよいです。

```powershell
code.cmd
```

まだ大きな project の build は試していませんが、簡単なものならじゅうぶん使えそうな雰囲気です。ただ VS Code からの利用に関しては他にも注意する点があり、また別に書こうと思います。

## macOS でもおなじ！

そしてこの方法、macOS でもおなじです。virtualbox driver で minikube を起動し、同梱された Docker を使います。minikube start のしかたはまったくおなじで、環境変数の設定方法が以下のようにちょっと違うだけです。

```bash
eval $(minikube docker-env)
```

## 感想 (蛇足)

もともとは Docker を使う環境をつくりたいがために WSL2 を試したりしていたのですが、いっこうに通常の Windows Update に来る気配が無いどころか Insider の Slow ring にすら来ない。また WSL2 も万能ではない、なんなら WSL1 のほうが理想としては高かったようにも感じられ、これなら VirtualBox に Linux 入れればいいじゃないかとかやっぱり Windows では無理なんだろうかなんなら Linux に入れ替えか? とかいっそ Chromebook で Linux というのは現実的なのか? とか悩んでいたのですが、この方法を VS Code の devcontainer と組み合わせて使うことでしばらくの平穏が訪れそうな気がしています。個人的には Kubernetes に deploy するものを debug する環境としても一石二鳥ですし。ひどく回り道をしてしまった気分です。

## 確認した環境

Dell XPS 13 9343 (2015 年版?) Core i5 2.20GHz memory 8GB
Windows 10 Home Insider Preview Build 19569 (20200229 時点で Fast ring たぶん最新)
VirtualBox 6.0.18 r136238
docker-cli 19.03.3 (Chocolatey)
minikube 1.7.3 (Chocolatey)
Power BI Tips - Power BIサービスでマップにデータが表示されないときの対処法

#概要
Power BI Desktopで、マップにデータを表示するレポートを作成したんですが、
Power BIサービスに発行してみて見たら、データが全然表示されない現象が発生しました。
その対応策について。

#現象
元データはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/9f27d004-809d-53f7-ca13-0fa7b3161f97.png)


■Power BI Desktopでのマップでのデータ表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/561f9616-48e4-0e23-ec77-9f5ec61cc8c3.png)


■Power BIサービスでのマップでのデータ表示でおかしかった点
・マップにデータが3点ほどしかプロットされなかった・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f650c4fc-af67-6645-f1b7-c718d0bd7821.png)

・三重県のデータがなぜか台北に・・・
![三重.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8a693811-cbcc-fb43-2390-3dec1e07c487.png)


#やってみたこと
■言語設定の変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/4efaf201-b194-8716-dffb-5c6fde632d82.png)

■Power BI Desktop側で、モデリングタブにあるデータのカテゴリを「都道府県」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/b9834d04-a7e9-7cc5-27b3-df7b04f9adc2.png)

■県名の最後に都、府、県を追加した列を作成し、ビジュアルにはその列をセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/df641c17-330d-4794-5b0d-4870f4274365.png)

#結果
正しい表示になった模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/0befb2a3-c96f-8d2f-5420-d4322dbd8887.png)

マップビジュアルにセットした列から、上手く座標データへの変換ができなかったのかと推測しています。
対処療法として（汗）参考になれば幸いです。
JAVA（Map）

【Map】
キー(値につける名前)に対してキーに紐づく値を保持することができる。

Mapはインターフェースなので、インスタンスを生成するために実装クラスを使用する必要がある。
今回はよく使用されるHashMapクラスを使用。
初期化を以下のようにして行う。
Map<キーの型名, 値の型名> オブジェクト名 = new HashMap<>();

    Map<String, String> map1 = new HashMap<String, String>();

次に「put」を使用して値を追加する。

    map1.put("春", "サクラ");
    map1.put("夏", "ヒマワリ");
    map1.put("秋", "キンモクセイ");
    map1.put("冬", "シクラメン");

「get」を使用して値を出力すると以下のようになる。

    String name1 = map1.get("冬");
    System.out.println(name1);

    [シクラメン]
MySQL 8.0 Database Administrator を受験してきた

今月の頭にMySQL8.0の試験が出来たらしく、Oracle認定試験が再試験無料期間中だったこともあり試しに受験しました。

https://lefred.be/content/mysql-8-0-certification-is-available/

## 試験概要
 - 試験番号：1Z0-908
 - 試験時間：140分
 - 問題数：85
 - 合格ライン：62％(53問）

試験範囲とかは以下を参照
https://education.oracle.com/ja/mysql-80-database-administrator/pexam_1Z0-908

## 受験者のスペック
- 一応DBAって言われてる仕事をしている人
- 基本Oracle Database担当、MySQLをたまにやる時がある人
- MySQL 5.7 Database Administrator(1Z0-888)は取得済み
- MySQL 8.0 と InnoDB Clusterの経験少しあり
- MySQL Enterprise 機能は一部（MEBとかMonitor）経験あり
- 英語はTOIECだとおそらく400点いかないぐらいのレベル
- MySQLのマニュアルや海外記事を読む時はGoogle翻訳頼み

## 試験の申し込みについて
ピアゾンテストセンターのテスト予約画面が日本語表示だと1Z0-908が表示されず、英語表示にしたら出てきました。
試験場所を日本橋にして予約確認メールを見たら西日暮里になっているのを見て英語スキルに不安が増しました...。
注：今確認した所、日本語表示のまま申し込み出来るようになっていました。問題は当然英語のみです。

最初に書いた通り、英語試験であっても再試験のプロモーションコードを入力したらキチンと登録されました。

## 試験対策
5.7の時と試験範囲を比較して、出題されそうな以下の項目について休みの日におさらいしました。

- MySQL 8.0の新機能や仕様変更
- SYSスキーマに関する事
- Enterprise Editionで使える機能
- InnoDB Clusterの仕様、構築、運用に関する事

## 試験結果
想定通り？自身の英語力がボトルネックとなり残り10問ぐらいは早押し問題みたいに答えて最後は時間切れになりましたがギリギリ合格しました。

## 試験所感
5.7の時と比べて試験自体のレベル感はあまり変わらない(当然、出題内容は変わってますが)と思いますが、ある程度MySQL8.0の新機能、Enterprise版やInnoDB Clusterを触ってないと合格は難しいと思います。今回は実務経験に救われました。

## 試験勉強のオススメ情報
参考になるかわからないですが、イチから勉強するならと言う質問を受けたので纏めてみました。

### [やさしく学べるMySQL運用・管理入門【5.7対応】](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%B9%E3%82%8BMySQL%E9%81%8B%E7%94%A8%E3%83%BB%E7%AE%A1%E7%90%86%E5%85%A5%E9%96%80%E3%80%905-7%E5%AF%BE%E5%BF%9C%E3%80%91-%E6%A2%B6%E5%B1%B1-%E9%9A%86%E8%BC%94-ebook/dp/B01N0R2BL2/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=MySQL+5.7&qid=1582959312&sr=8-4)

5.7ですが、MySQLでDBAって何やるの？って人にオススメです。
Enterprise版の機能についても説明や使い方が参考になります。

### [MySQLのセミナー資料](https://www.mysql.com/jp/news-and-events/seminar/downloads.html)
以下の資料あたりが参考になるかと思います。

 - MySQLバージョンアップの基礎知識
 - MySQL 8.0での主要な仕様変更点
 - MySQL 8.0 入門(インストール編、アーキテクチャ基礎編） 
 - MySQL 8.0 入門(レプリケーション編）
 - MySQL 8.0 入門(チューニング基礎編、SQLチューニング編）
 - MySQL 8.0 入門(バックアップ編）
 - MySQL 5.7 入門セミナー講演資料 (セキュリティ基礎編)

### [マニュアル](https://dev.mysql.com/doc)
MySQL 8.0では頻繁に仕様変更やアップデータが多いですが、その分マニュアルも日々ブラッシュアップされています。
特にInnoDB Clusterについてはインストールや内部仕様、障害時の挙動（追放,離脱）についても丁寧に更新され続けている印象です。
もちろん英語ですが、Google翻訳で何とかなります！

### [MySQL High Availability](https://mysqlhighavailability.com/)
新しいバージョンの情報やこちらもInnoDB Clusterの記事が参考になります。
こちらもGoogle翻訳で何とかなります！
Automation Anywhereで文字列置換する際によく使う正規表現

RPAツール「Automation Anywhere」では、`String Operation`コマンドの`Replace`では正規表現が使える。
このコマンドを使えば１行で色々な操作ができる。

Regular Expressionのチェックボックスをオンにして使おう。

ちなみに、BotStoreにこの手の機能を実装したMetaBotもあるかもしれない。

検証バージョン：
Automation Anywhere Community Edition 11.0.0.0.0

やってみたらできたという話で、ベンダーが正式にサポートしているかというとよく分からんので、そこは自己責任でお願いします。

# ファイルパス関連

## ファイルのフルパスからファイル名を抽出

#### 例
1（ドライブ）
置換前：C:\AA Test\String Operation\test.txt
置換後：test.txt

2（ネットワークフォルダ）
置換前：\\\\10.1.11.111\share\My work\test.txt
置換後：test.txt

### コマンド設定

Find: `^.*\\`
Replace: （空文字）

## ファイルのフルパスからフォルダのパスを抽出

#### 例
置換前：C:\AA Test\String Operation\test.txt
置換後：C:\AA Test\String Operation

### コマンド設定

Find: `\\[^\\]+$`
Replace: （空文字）

## ファイルのパスまたはファイル名にタイムスタンプ等を追加

#### 例

タイムスタンプとして"_20190101_123456"を追加する

置換前：C:\AA Test\String Operation\test.txt
置換後：C:\AA Test\String Operation\test_20190101_123456.txt

### コマンド設定

Find: `\.(?=[^\.]+$)` #後方からみて最初に出現する`.`に一致
Replace: `vTimeStamp.` #`vTimeStamp`はタイムスタンプが格納された変数

## ファイルまたはフォルダのパスから親フォルダ名を抽出

#### 例
置換前：C:\AA Test\String Operation\test.txt
置換後：String Operation

置換前：C:\AA Test\String Operation
置換後：AA Test

### コマンド設定

Find: `.+\\(?=[^\\]+\\[^\\]+$)|\\[^\\]+$`
Replace: （空文字）

## ファイルのフルパスまたはファイル名から拡張子なしのファイル名を抽出

#### 例
1（フルパスから抽出）
置換前：C:\AA Test\String Operation\test-1.01.txt
置換後：test-1.01

2（ファイル名から抽出）
置換前：test-1.01.txt
置換後：test-1.01

### コマンド設定

Find: `^.*\\|\.[^\.]+$`
Replace: （空文字）

## フルパスまたはファイル名から拡張子のみを抽出

#### 例
1（フルパスから抽出）
置換前：C:\AA Test\String Operation\test-1.01.txt
置換後：txt

2（ファイル名から抽出）
置換前：test-1.01.txt
置換後：txt

### コマンド設定

Find: `^.*\.`
Replace: （空文字）

# 日付・時刻関連

## `yyyy/mm/dd HH:mm:ss`を`yyyymmdd_HHmmss`形式に変換

#### 例
置換前：2020/01/31 12:34:56
置換後：20200131_123456

### コマンド設定

Find: `(\d{4})/(\d\d)/(\d\d) (\d\d):(\d\d):(\d\d)`
Replace: `$1$2$3_$4$5$6`

## yyyy_m_d形式をyyyymmddに変換

Automation Anywhereのシステム変数のmonth、dayは頭にゼロが付かない。if分岐などを使う方法もあるが、行数が長くなる。

#### 例
置換前：2019_1_1
置換後：20190101

置換前：2019_12_31
置換後：20191231

### コマンド設定

1つのコマンドで実現する方法は思いつかなかった。
2回`Replace`が必要。

1つ目の`Replace`
Find: `_(?!\d\d)`
Replace: `_0`

2つ目の`Replace`
Find: `_`（アンダースコア）
Replace: （空文字）
Railsチュートリアル 第1章 mergeできないエラー回避

#概要

masterブランチに変更しようとしたら、commitしてませんみたいなエラーが出たため、
commitしようとしたらエラーが出てしまい、解決に時間がかかったため、備忘として記載してみます。

#結論：そもそもgit管理をルートディレクトリ配下に作成してしまった（アプリ配下ではなく）

git initでセットアップする際、hello_appディレクトリではなく、ルートディレクトリで行ってしまった。
ずっと、ルートディレクトリでmasterブランチに変更しようとして、何かhisotry logファイルみたいなものが更新状態でエラーが出ていました。

#解決策

単純なことですが、ちゃんとhello_app配下でgit initをしてやり直しました。