OmniAICreator/Qiita-1.07M huggingface dataset:
excelのバージョンとDATEDIFの注意点

#EXCELのDATEDIFには罠がある

DATADIF関数は日付の差を計算するための関数です。DATEDIFの使い方の詳細は以下URL参照してください。
https://support.office.com/ja-jp/article/datedif-%E9%96%A2%E6%95%B0-25dba1a4-2812-480b-84dd-8b32a451b35c
上のURLには

”重要: 制限事項があるため、"MD" 引数の使用はお勧めしません。 以下の既知の問題のセクションを参照してください。”

と…書かれてはいるものの、まさか自分がハマるとは思わなかったです。
EXCEL365で　A1に2019/01/02、　A2に2020/01/01、　A3に=DATEDIF(A1,A2,"MD")
を記入すると、以下のように30（日）が戻り値として出てきます。
![excel365.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481632/1a0dce01-3a7c-e236-d6d1-7eef7729d028.jpeg)

しかし、EXCEL2007で同じ数値を入力すると…143が戻り値として出てきます。
![excel2007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481632/0490e90e-6a9f-d7f2-a68f-9e857e38bfdd.png)
エラーを回避するために以下URLでは
https://support.microsoft.com/ja-jp/help/2678753

=IF(AND(INFO("release")="12.0",MONTH(DATE(YEAR(A2),2,29))=2,MONTH(A2)=1,DAY(A1)>DAY(A2)),
         DATEDIF(A1,A2,"MD")-(DATEDIF(DATE(2011,1,2),DATE(2012,1,1),"MD")-30),
         DATEDIF(A1,A2,"MD"))

という長い関数で回避しろとのこと。早速やってみたら…できた！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481632/33335732-abcc-f263-7cd9-f07f0a1565fb.png)

けど、DATEDIFはエラーが起こるということを念頭に使わないといけないようです。色んなバージョンのExcelを使っている人がいる環境で共同作業するようなことがある場合は注意が必要です。
ngx-color-pickerで設定したカラーコードを取得する方法

Angular用のColorPickerのライブラリとして有名なものに [ngx-color-picker](https://www.npmjs.com/package/ngx-color-picker) というものがあります。
個人的に設定したカラーコードの取り出しに時間がかかったのでメモがてらここに残しておきます。
内容的には薄いので、寂しさを紛らわせるために導入の部分も日本語訳という大義名分のもと書きます。

## 導入までの手順
### インストール
```
npm install ngx-color-picker --save
```

### モジュールの読み込み
```
import { ColorPickerModule } from 'ngx-color-picker';
 
@NgModule({
  ...
  imports: [
    ...
    ColorPickerModule
  ]
})
```

### HTMLに組み込む
```
<input [(colorPicker)]="color" [style.background]="color"/>
```

### 実際の表示はこんな感じ
<img width="433" alt="スクリーンショット 2020-04-01 21.13.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/14d6c529-7a74-0e8a-fdfb-c5d65ce1c88e.png">

めっちゃ便利ですね。

実際の利用方法としてtext入力欄の色がそのまま変化するのは少し寂しいので、こんな感じにカラーパレットのように利用するんじゃないかなと思います。

![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/a7bca5cd-bc2f-4c94-575f-10207eebdddd.gif)


コードは以下のような感じです。
CSSは特に解説も無いのではしょります。

```
<section>
   <label>
      <input type="radio">
      <p class="color-pallet-custom"
         #ignoredInput
         [style.color]="color"
         [cpIgnoredElements]="[ignoredButton, ignoredInput]"
         [(cpToggle)]="toggle"
         [(cpPosition)]="top-right"
         [(colorPicker)]="color"></p>
   </label>
   <button #ignoredButton (click)="toggle=!toggle" class="btn-primary" type="button" ngbButtonLabel>色選択</button>
  </section>
```

## 本題
ここまで設定できて『(*ﾟ∀ﾟ*)ｲｲ!!』 ってなってたんですけど、どうやって値取り出すんだって結構試行錯誤しました。実際はこんな感じで取り出せます。

コード

```
<input type="radio" [value]="this.color">
```

簡単ですね。
例えばreativeformを使って実装する際などはこのような形で値を渡してやることができます。
私がまだまだAngularに慣れていないからかわかりませんが、結構時間がかかってしまいました。
ngx-color-pickerは他にも便利なオプションがあるので、ぜひ参考にしてみてください。


#### 参考
[ngx-color-picker](https://www.npmjs.com/package/ngx-color-picker)
[examples](https://zefoy.github.io/ngx-color-picker/)
[How to Use Color Picker in Angular](http://www.eduforbetterment.com/how-to-use-color-picker-in-angular/)
Django3で管理者ページにログインできない

# 概要
タイトルの通り、http://localhost:8000/admin/ からsuper userでログインしようとするとrunserverが落ちて失敗する。
# ログインに失敗した環境
macOS Catalina 10.15.3
Django 3.0.5
Python 3.7.0

# pythonをアップグレードすることで解決
3.7.4と3.8.0で動作することを確認しました。一応referenceでは3.6から対応しているはずですが、なぜか3.7.0では正常に動作しませんでした。
Python＆機械学習 勉強メモ③：ニューラルネットワーク

[①](https://qiita.com/yohiro/items/04984927d0b455700cd1)
[②](https://qiita.com/yohiro/items/5aab5d28aef57ccbb19c)
の続き

#参考教材
[Udemy みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習](https://www.udemy.com/course/learning-ai/)

#課題設定
緯度・経度を与えると、東京・神奈川のどちらに属するかを判定するプログラムを作成する.

#判定方法
入力層2つ・中間層2つ・出力層1つのニューラルネットワークで判定する。

#ニューロンクラス
```python
class Neuron:
    input_sum = 0.0
    output = 0.0

    def setInput(self, inp):
        self.input_sum += inp

    def getOutput(self):
        self.output = sigmoid(self.input_sum)
        return self.output

    def reset(self):
        self.input_sum = 0
        self.output = 0
```
##`setInput`
入力を合計する。

##`getOutput`
入力値を活性化関数で変換した値を出力する。
ニューロンは入力値が閾値を超えると発火する特徴があるが、上記のように活性化関数にシグモイド関数を適用することでそれを模倣する。


##`reset`
入力値をリセットする。

#ニューラルネットワーク
```python
class NeuralNetwork:
    # 入力の重み
    w_im = [[0.496, 0.512], [-0.501, 0.990], [0.490, -0.502]] # [[i1-m1, i1-m2], [i2-m1, i2-m2], [bias1-m1, bias1-m2]]
    w_mo = [0.121, -0.4996, 0.200] # [m1-o, m2-o, bias2-0]
    # 各層の宣言
    input_layer = [0.0, 0.0, 1.0]
    middle_layer = [Neuron(), Neuron(), 1.0]
    ouput_layer = Neuron()
    ...
```
`input_layer`と`middle_layer`の3番目の要素はバイアス。

#入力形式とファイル読み込み
##入力ファイル
1行に 経度,緯度 を記載しているファイルを読み込む。

```
35.48,137.76
35.47,137.81
35.29,138.06
...
```

#得られる結果

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571638/307385c3-528b-29bc-02dd-042b6a28c178.png)

複雑な境界線に対して東京・神奈川を区別できている。
きちんと判定するには、各入力の重みづけや閾値を適切に設定する必要があるはず。
その設定方法は次回以降に学習。
Deep learningのOptimizer早見表

---
**Deep learningのOptimizerのまとめを読んだので早見表を作りました**

読んだやつ(記事中の図は当論文から引用しています)
- [An overview of gradient descent optimization algorithms (Ruder, 2016)](https://arxiv.org/abs/1609.04747)
- [On Empirical Comparisons of Optimizers for Deep Learning (Choi et al., 2019)](https://arxiv.org/abs/1910.05446)


---

**勾配降下法は大きく分けて3種類**

|区分  |1itrで使う<br>サンプル|良い所  |良くない所|
|---|---|---|---|
|Batch<br>Gradient Descent  |全部|･エポックを進めれば大域 or 局所最適解に収束|･激重<br>･大量のメモリ要|
|Stochastic<br>Gradient Descent  |1コ|･非凸関数でも大域解に行ける可能性|･エポックを進めると目的関数が大きく上下する|
|Mini-Batch<br>Gradient Descent  |バッチサイズNコ|･上2つのいいとこ取り|･バッチサイズNは自分で決める必要がある|

- バッチサイズは全体の1/10位のオーダーで、2の倍数にすることが多い
- 慣例ではMini-Batch Gradient DescentのこともSGD(Stochastic Gradient Descent)と呼ぶ
- 以下もそれに習います

---

**いろんなSGDを一言で紹介**

バニラSGD

|名前|一言で|良い所|良くない所|
|---|---|---|---|
|SGD|･上記の通り|･上記の通り|･スケールの大小によっては学習が進まない次元があるかも|


Momentum系(要するに「さっき進んだ方に進みやすい」)

|名前|一言で|良い所|良くない所|
|---|---|---|---|
|Momentum|･運動量項をもたせる|･次元のスケール差に左右されにくい|･鞍点から抜けられない|
|NAG|･未来の情報を与えたMomentum|･↑より効率良|･鞍点から抜けられない|


Adagrad系(要するに「めっちゃ動いた次元は学習率を下げる」)

|名前|一言で|良い所|良くない所|
|---|---|---|---|
|Adagrad|･勾配二乗和の累積が大きい次元は学習率を下げる|･スパースデータに向いてる<br>･学習率は初期値だけ決めればOK|･学習率が下がり続けるので学習が進まなくなる|
|Adadelta|･改良Adagrad<br>･勾配二乗和に時間ペナルティ|･学習率単調減少を抑える<br>･学習率の初期値を決めなくて良い|･ハイパラが多い|
|RMSprop|Adadeltaとほぼ同じ<br>(同じ時期に別の人が作った)|同上|同上|


Adam系(AdagradとMomentumのハイブリッド)

|名前|一言で|良い所|良くない所|
|---|---|---|---|
|Adam|･AdagradとMomentumのハイブリッド|･いいとこ取り|･ハイパラが多い|
|Adamax|･変形Adam<br>･L2の代わりにL∞ノルム|同上|同上|
|NAdam|･AdagradとNAGのハイブリッド|同上|同上|

---

ようするに
- Momentum系は目的関数の勾配に項を足し引きする手法
- Adagrad系は目的関数の学習率スケジューリングを自動化する手法
- だから両立可能(その代わりハイパラは多くなる)


実験の結果
- きちんとハイパラチューニングすればAdam系がつよい(NAdamが一番性能が良かった)
- テキトーにやったらバニラSGD+学習率スケジューリングにも負けることも
- **Optimizerを比較するなら、ハイパラの検索スペースも明記してね**

---
![Screenshot from 2020-04-01 21-53-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331449/750a850c-c6fb-cd48-8410-59096d349c40.png)
↑分散の違う二次元ガウス分布(バニラSGDだとダメだけどMomentumだとうまくいく例)

![saddle_point.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331449/cb8d5beb-c72e-646d-9801-d4b63ca5f515.jpeg)

↑鞍点(MomentumだとダメだけどAdagrad系・Adam系だとうまくいく例)

---

おまけ : 鞍点のプロットのコード

```python:saddle_point.ipynb

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')

x = np.arange(-1, 1, 0.05)
y = np.arange(-1, 1, 0.05)
x, y = np.meshgrid(x, y)

ax.scatter(x, y, x**2 - y**2, s=2, marker=".")
ax.scatter(0, 0, 0, color="red", s=10, marker="o")

ax.set_xticks([])
ax.set_yticks([])
ax.set_zticks([])

plt.savefig("./saddle_point.jpg")
plt.show()
```
🐘【PHP】逆順forループで文字列を読んでいく

## 環境
PHP 7.2.21

## やりたいこと
単純な文字列を後ろから一文字ずつ読んで色々判定したいので
後ろから一文字ずつのforループを実装してみる

## やったこと
forの開始位置をstrlen()で文字数取得し$i--で逆に回す
※マルチバイト文字に対応していないのでそこは別途なんとかしたい

```forLoop.php
        // 対象の文字列
        $tmpString = 'eltociear_hoge';

        for ($i = strlen($tmpString) -1; $i > -1; $i--) {
            // 一文字を表示
            var_dump($tmpString[$i]);
        }
```

### 出力結果
```
string(1) "e"
string(1) "g"
string(1) "o"
string(1) "h"
string(1) "_"
string(1) "r"
string(1) "a"
string(1) "e"
string(1) "i"
string(1) "c"
string(1) "o"
string(1) "t"
string(1) "l"
string(1) "e"
```
マインクラフト統合版のリソースパック作成 ~レコードのサウンドを変更する~

#初めに
[minecraft統合版でリソースパックを作り,minecraftに適応させる。](https://qiita.com/yuuki3/items/2d2795304f794c2be945)の続きになります。
##やり方
フォルダ構成はこのような感じになります。

```
任意のフォルダ名---manifest.json
               |__sounds
                 |__music
                   |__game
                     |__records
                       |__13.ogg
```
デスクトップにフォルダを作り、manifest.jsonを作成してください。manifest.jsonについての書き方は[minecraft統合版でリソースパックを作り,minecraftに適応させる。](https://qiita.com/yuuki3/items/2d2795304f794c2be945)に書いてあります。
soundsフォルダの中にmusicフォルダ、その中にgameフォルダを作りその中にrecordsフォルダ、そしてその中にサウンドファイルを入れてあげます。

###サウンドファイルの作り方
マインクラフトのサウンドファイルはfsbファイルが多いですが、fsbファイルの作り方が調べてもわからないので**oggファイル**というサウンドファイルを作ります。
まず変更したいレコードは13というレコードなので、サウンドファイルmp3の名前を13.mp3という名前に変えて下さい。変えたらファイルを[convertio](https://convertio.co/ja/ogg-mp3/)でoggファイルに変換してください。
13.oggが出てくるのでそれをrecordsフォルダの中に入れてください。
(なぜ最初に名前を13.mp3と変換したのかは、oggフォルダに変換後、名前を変換するとエクスプローラーがフリーズして強制終了するため。)

その後フォルダを圧縮して、拡張子　**.zip**　を　**.mcpack**  にすると自動でマイクラにインポートされます。
レコード13を聞いてみると変更した曲になります。

#終わりに
難しかった
チーム開発（商品情報編集）

https://gyazo.com/de291a4062b1fb3edae8cc3610a53691
MySQL conditionカラム削除で解決


https://gyazo.com/56f8b7d1527ade27b3df6ce2840b2c98
ターミナルでrails db: seedをしMySQLのcategoriesに項目を追加したら解決


https://gyazo.com/d3b6215906ec7d110b04d91b5f5f01b5
.persisted?を削除


https://gyazo.com/c240772887293d8b77dea15d3fecbe52
インスタンス変数@category_parent_arrayを
Category.where(ancestry: nil)に変更で解決
参考サイト
https://qiita.com/zorori777/items/07cca6b04de125b812a0
【初心者向け】PythonでWebスクレイピング 「ページ内のURLにアクセスして内容を取得する」

#はじめに
##前回のおさらい
[【初心者向け】PythonでWebスクレイピングをやってみる](https://qiita.com/koichi_hiphopdream/items/f4b006159cdbf5e4ee30)の記事の続きになります。
前回は、日経ビジネス電子版
https://business.nikkei.com/
から、新着記事の見出しとURLを取得しました。

しかし、これだけでは、実際にこのURLにアクセスすれば知る事ができます。

##今回の目的
ニュースサイトを閲覧した際に、気になったニュースがあればクリックをして、詳細な内容を閲覧すると思います。
日経ビジネスの記事には、全てのニュースでは無いのですが、内容の前に読みたいと思わせるような150文字程度の記事紹介文があります。
この内容も一緒に表示する事で、記事を読むか読まないかの判断材料にします。
いちいち全ての記事にアクセスして、記事の紹介文を読むのは大変です。
Webスクレイピングの良さを、引き出していきます。

##前回のコードのおさらい

```code.py
import requests
from bs4 import BeautifulSoup
import re

urlName = "https://business.nikkei.com"
url = requests.get(urlName)
soup = BeautifulSoup(url.content, "html.parser")

elems = soup.find_all("span")

for elem in elems: 
  try:
    string = elem.get("class").pop(0)
    if string in "category":
      print(elem.string)
      title = elem.find_next_sibling("h3")
      print(title.text.replace('\n',''))
      r = elem.find_previous('a')
      #記事のURLを取得している
      print(urlName + r.get('href'), '\n')

      #この部分にURL先の記事紹介文を取得するプログラムを書く

  except:
    pass
```
詳しくは、前回の記事を参照してください。
ニュースをクリックした際に、遷移するURLを表示して前回は終わりました。今回は、そのURLにアクセスして内容を取得します。

#プログラミング
まず初めに、今回はrequestsとBeautifulSoupの部分を関数にします。

```subFunc.py
import requests
from bs4 import BeautifulSoup

def setup(url):
  url = requests.get(url)
  soup = BeautifulSoup(url.content, "html.parser")
  return url, soup
```


```main.py
import re
import subFunc

urlName = "https://business.nikkei.com"
url, soup = subFunc.setup(urlName)

elems= soup.find_all("span")

for elem in elems: 
  try:
    string = elem.get("class").pop(0)
    if string in "category":
      print('\n', elem.string)

      title = elem.find_next_sibling("h3")
      print(title.text.replace('\n',''))

      r = elem.find_previous('a')
      nextPage = urlName + r.get('href')
      print(nextPage)
      
      #ここから新しく記述した部分
      nextUrl, nextSoup = subFunc.setup(nextPage)
      abst = nextSoup.find('p', class_="bplead")
      if len(abst) != 0:
        print(abst.get_text().replace('\n',''))
  except:
    pass
```

正直、やる事は変わりません。
遷移先のURLを、requestsとBeautifulSoupを使って情報を取得します。
記事の紹介文は、classがbpleadの要素にありました。しかし、紹介文が無い記事もあるので、あった場合に表示するようにしました。

実行結果は以下の通りです。(省略しています)

```
 共創／競争・スタートアップ
新型コロナは長期戦　xxxxxxxxxxx
https://business.nikkei.com/atcl/gen/19/00101/040100009/    
新型コロナウイルスの流行xxxxxxxxxxxxと訴えた。
```

#さいごに
調べてみると、他の方法もいくつか紹介されていますが、簡単な方法で遷移先の内容を取得してみました。
LLVM 10.0.0をソースコードからビルドする

LLVMもついに10まで来ましたGCCを追い越してしましましたね(?)。今回はLLVMをソースからビルドしてみたいと思います。今回はビルドツールに`make`ではなく`ninja`を使うのでインストールしてない場合はやっておいてください。

# 必要なもの

- CMake (>=3.4.3)
- GCC (>=5.1.0)
- python (>=2.7)
- zlib (>=1.2.3.4)
- make (3.79, 3.79.1) <- 今回は不要
- ninja <- 今回は必要 
  - [ninja-github][ninja-github] : リポジトリ
  - [ninja-org][ninja-org] : 公式サイト

- LLVMビルドに必要なソフトウェア一覧
  - https://llvm.org/docs/GettingStarted.html#software

筆者のマシン環境はコア数3, メモリ10GBのVM(ubuntu18.04.4 LTS)で4時間ほどでビルドできました。できるだけ高スペックマシンでやることをおすすめします。

[ninja-github]:https://github.com/ninja-build/ninja
[ninja-org]:https://ninja-build.org/

# ソースコードをダウンロード && 展開
LLVM 9.0.1まではプロジェクト別にソースコードをダウンロードして適切なディレクトリに移動させる必要がありました。しかし、LLVM 10.0.0から`llvm-project-10.0.0.tar.xz`という一つのファイルが全プロジェクトを含んでおり楽になりました。ビルド時に`-DLLVM_ENABLE_PROJECTS`でビルド対象プロジェクトを選択することができます。

```sh
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/llvm-project-10.0.0.tar.xz
tar xf llvm-project-10.0.0.tar.xz
```

# ビルド・インストールディレクトリを作成
`build` : ビルドに使用するディレクトリ
`install` : 現在ディレクトリ直下に`install`を作成し、そこにインストールする。他にインストール場合は任意のものに変える

```sh
mkdir build install
```

# ビルド
`make`の代わりに`ninja`を指定していることに注意してください。ビルドの並列数を指定する場合`make -j16`のように`-j`オプションで指定されますが、ninjaの場合はコア数を自動認識して並列ビルドされるようです。勝手に並列ビルドされてはメモリが心配なので`-DLLVM_PARALLEL_LINK_JOBS="1" `でリンク時のみ非並列で動作させるように指定します。

```sh
pushd ./build
cmake -G "Ninja"                             \
      -DCMAKE_INSTALL_PREFIX=./install       \
      -DCMAKE_C_COMPILER="gcc"               \
      -DCMAKE_CXX_COMPILER="g++"             \
      -DCMAKE_BUILD_TYPE="Release"           \
      -DLLVM_PARALLEL_LINK_JOBS="1"          \
      -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;openmp;parallel-libs;polly;pstl" \
      ../llvm-project-10.0.0/llvm
ninja
ninja install
popd
```

余談ですがビルドに`make`ではなく`ninja`を使用したのはドキュメントに「`ninja`のほうが早くビルドできるよ」と書いてあったためです。(恥ずかしながら今まで`ninja`を知らなかったのです。) LLVMのビルドは巷でも(?)高スペックが必要とされているらしいのでninjaをおすすめします。

# 参考

https://llvm.org/docs/CMake.html
https://llvm.org/docs/GettingStarted.html
CDKでAPI Gatewayにステージを追加してもLambdaのパーミッションは自動で追加されない

CDKでAPi Gateway+Lambdaの構成を作りました。
Gatewayのステージを2つ持たせて、ステージ毎に変数を持たせてLambdaを叩くという構成にしたかったのですが、追加したステージのパーミッションがLambdaに自動で追加されなかったので、`CfnPermission`を使って自分で追加する必要がありました。
このことにちょっとハマって時間を要したので、コードを残しておきます。

## 環境
CDK CLI: 1.27.0

## コード

```cdk-lambda-stack.ts
import * as cdk from '@aws-cdk/core'
import * as lambda from '@aws-cdk/aws-lambda'
import * as apigateway from '@aws-cdk/aws-apigateway'
import * as iam from '@aws-cdk/aws-iam'

export class CdkLambdaStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)
    // Lambdaの定義
    const lambdaFn = new lambda.Function(this, 'function', {
      runtime: lambda.Runtime.PYTHON_3_8,
      handler: 'lambda_function.lambda_handler',
      code: lambda.Code.asset('lambda_asset')
    })

    // API Gatewayの定義
    const api = new apigateway.RestApi(this, 'api', {
      deployOptions: {
        stageName: 'first stage name',
        variables: {foo: 'bar'}
      }
    })

    // ステージの追加
    const stage = new apigateway.Stage(this, 'stage', {
      deployment: new apigateway.Deployment(this, 'stage', {api: api}),
      stageName: 'second stage',
      variables: {foo: 'bar_bar'}
    })
    api.root.addResource(lambdaFn.functionName).addMethod('POST', new apigateway.LambdaIntegration(lambdaFn))

    // 追加したステージからのPermissionをlambdaに追加が必要
    new lambda.CfnPermission(this, 'secondStageInvoke', {
      action: 'lambda:InvokeFunction',
      functionName: lambdaFn.functionName,
      principal: 'apigateway.amazonaws.com',
      sourceArn: 'arn:aws:execute-api:' + this.region + ':' + this.account + ':' + api.restApiId + '/' + stage.stageName + '/POST/' + lambdaFn.functionName
    })
  }
}

```
JavaScript の配列の要素をすべて削除する

clear とか clearAll とか remove とか delete とか配列を空にするシンプルなメソッドがあるのかと思ったけどなかった。

もう少し高機能な splice メソッドを使うのが良さそう。

[Array\.prototype\.splice\(\) \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)

> splice() メソッドは、 (in place で) 既存の要素を取り除いたり、置き換えたり、新しい要素を追加したりすることで、配列の内容を変更します。

サンプルコード。

```js
let array = ['Tanis'] // 配列要素を指定して初期化
array.push('Sturm') // 要素を1つ追加
array.push('Flint', 'Tasslehoff') // 要素を複数追加
Array.prototype.push.apply(array, ['Caramon', 'Raistlin']); // 配列の要素を追加
console.log(`配列の要素数: ${array.length}`);
console.log(array);
console.log();

// 配列の要素を全削除する (インデックス0以降のすべての要素を削除)
array.splice(0)
console.log(`配列の要素数: ${array.length}`);
console.log(array);
```

実行結果 (Node.js 13.12.0 にて確認)

```
$ node array.js 
配列の要素数: 6
[ 'Tanis', 'Sturm', 'Flint', 'Tasslehoff', 'Caramon', 'Raistlin' ]

配列の要素数: 0
[]
```
spock のセットアップとかの実行順まとめ

まわり見てるとちょいちょいこれでハマっている人がいるので、躓かなくなると良いなと思ってまとめ

さっと

## spock
細かい説明は省きますが、setup cleanup がいくつかと、where というテストデータ定義をする箇所があります

結論をさっと
表と絵で

定義        | タイミング                         | 備考       
:--         | :--                                | :--        
setupSpec   | テスト [クラス] の最初で [一回] 動く   | static 相当
setup       | テスト [データ] [ごと] に最初に動く             |            
cleanup     | テスト [データ] [ごと] に最後に動く             |            
cleanupSpec | テスト [クラス] の最後で [一回] 動く   | static 相当
where       | テスト [メソッド] の最初で [データ分] 動く | static 相当

緑字が static で赤字がそれ以外です、左から読んでね

<img width="806" alt="スクリーンショット 2020-04-01 20.32.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113398/4c18e154-dc0f-9833-0484-340dcff7caee.png">

## で、何が問題になるの
大きく２つ

### static
static 相当なので、例えば`@Autowired`してる変数とかを使った初期化処理は`setupSpec/cleanupSpec`では呼べない

`where`からも使えない

やりがちなので注意

### 実行順
多いのがこっち

特に多いのが now とかを絡めたテストデータの作成において、思った通りのテストデータが作られなくてテストがこけるケース

例えば`setup`にシステムクロックの改ざんをするようなコードを書いておいて、`where`で now を含むテストデータを作ってパターンテストした場合、
テストデータを作ってからシステムクロックの改ざんという順番になるので、期待通りにならない

その場合はセットアップを`setupSpec`に移動しよう

セットアップが static 処理内で行えない場合は、例えば`where`側のデータを`{}`で囲って`expect`側で`()`をつけたりすると実行を遅延させられるけど、
テストコードでテクいことをやりたくなる場合は **大抵の場合プロダクトコード(= 設計)** がおかしいので、素直にリファクタしよう

さくっとおしまいﾉｼ

### おまけ　実行順のところで挙げた例のコードイメージ

これだと`mkData()` -> `setClock()`の順で動く

```groovy
def setup() {
    setClock()
}

def test() {
    expect:
    sut.f(data) == exp

    where:
    data     || exp
    mkData() || ...
}
```

こうするか、

```groovy
def setupSpec() {
    setClock()
}

def test() {
    expect:
    sut.f(data) == exp

    where:
    data     || exp
    mkData() || ...
}
```

こうすると`setClock()` -> `mkData()`の順で動く

```groovy
def setup() {
    setClock()
}

def test() {
    expect:
    sut.f(data()) == exp

    where:
    data         || exp
    { mkData() } || ...
}
```

ただ、例えば now に関しては`sut.f`内部で生成するより引数で渡して揚げる方がずっとテストしやすいので、既存の作りを見直すのに立ち戻った方が良い

```groovy
def test() {
    expect:
    sut.f(data, date(2020, 3, 1)) == exp

    where:
    data     || exp
    mkData() || ...
}
```
lhaplusを利用したパスワード付き圧縮

分割された大量のファイルをパスワード付きzipでそれぞれ圧縮する必要があるため、オプションや使用例などまとめてみました。

前提条件：
以下の点が連番となるため、エクセルの concat 関数とフィル機能を利用して実行コマンドの作成を自動化する。

|連番項目|ファイル名の例|エクセルの機能・関数など|
|:---|:---|:---|
|圧縮後のファイル名|test-01.tar.gz.zip|フィル機能|
|圧縮対象ファイル名|test.tar.gzaa|=CHAR(CODE(C1)+1)とフィル機能|
*※備考：*
アルファベットはオートフィル機能で連番することが出来ない模様

使用するオプション：

|オプション名|用途|使用例|
|:---|:---|:---|
|/c:|圧縮タイプ|/c:zip|
|/n:|圧縮後のファイル名(フルパス)|/n:C:\work\test-01.tar.gz.zip|
|/p:|パスワード|/p:password|

使用例：

```
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /n:C:\work\test-01.tar.gz.zip /p:password ./test.tar.gzaa
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /n:C:\work\test-02.tar.gz.zip /p:password ./test.tar.gzab
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /n:C:\work\test-03.tar.gz.zip /p:password ./test.tar.gzac
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /n:C:\work\test-04.tar.gz.zip /p:password ./test.tar.gzad
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /n:C:\work\test-05.tar.gz.zip /p:password ./test.tar.gzae
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /c:zip /n:C:\work\test-06.tar.gz.zip /p:password ./test.tar.gzaf
```

*※注意点：*
　圧縮対象ファイル名の前に ./ を入力していないとエラーで圧縮できない。
フィボナッチ数列 Ruby Perl JavaScript

# はじめに
フィボナッチ数列の記事ってフィボナッチ数列100番目より遅いところですが、勉強中の*[もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問](https://www.amazon.co.jp/dp/B078LMFXXC)* のアウトプットということでお許しください。

# Ruby
```rubymemo.rb
@memo = {0 => 1, 1 => 1}
def f(n)
  return @memo[n] if @memo[n]
  @memo[n] = f(n - 1) + f(n - 2)
end

puts f(10) # => 89
```
```rubyarray.rb
N = 10

f = Array.new()
f[0] = f[1] = 1
2.upto(N) do |i|
  f[i] = f[i - 1] + f[i - 2]
end

puts f[N] # => 89
```
*javascript* の様にハッシュではなく配列でも実装可能と思われます。
# Perl
```perlmemo.pl
my %memo = (0 => 1, 1 => 1);
sub f {
  my $n = shift;
  return $memo{$n} if defined $memo{$n};
  $memo{$n} = f($n - 1) + f($n - 2);
}
print f(10), "\n"; # => 89
```
```perlarray.pl
my $n = 10;

my @f;
$f[0] = $f[1] = 1;
for my $i (2..$n) {
  $f[$i] = $f[$i - 1] + $f[$i -2];
}

print $f[$n], "\n"; # => 89
```
```ruby_perl.pl
  return @memo[n] if @memo[n]            # ruby

  return $memo{$n} if defined $memo{$n}; # perl
  return $memo{$n} if exists $memo{$n};  # perl
```
*ruby* と異なり、*defined関数もしくは exists*関数を使用する必要があります。
# JavaScript
```javascriptmemo.js
var memo = [];
memo[0] = memo[1] = 1;
function f(n) {
    if (memo[n]) return memo[n];
    return memo[n] = f(n - 1) + f(n - 2);
}

console.log(f(10)); // => 89
```
```javascriptarray.js
N = 10;

var f = [];
f[0] = f[1] = 1;
for (var i = 2; i <= N; i++) {
    f[i] = f[i - 1] + f[i - 2];
}

console.log(f[N]); // => 89
```
*javascript* に詳しくないので、ハッシュ未使用で実装しています。
# まとめ
+ フィボナッチ数列を実装した
+ それぞれの言語に違いがあって面白かった

参照したサイト
*[フィボナッチ数列](https://qiita.com/pi-to/items/2e3f4311bc6e9d742658)*
*[メモ化から学ぶ早期リターン](https://qiita.com/Nedward/items/5175b81624d89e5ec29e)*
*[javascriptのハッシュライブラリを比較する](https://qiita.com/weal/items/c4d251cdfe637b7d8ae0)*
*[exists関数 - ハッシュのキーの存在確認](https://tutorial.perlzemi.com/blog/20080213120291.html)*
検証集合について (E資格対策)

では書きます。
本ソースはGoogle Colaboratoryで動かしています。


#学習データ、検証データ、テストデータ
機械学習を行うにあたってデータが必要です。データには3種類あり、学習データ、検証データ、テストデータがあります。
この3つがとても混乱するので整理すると

訓練データ：パラメータを学習
検証データ：モデル選択
テストデータ：性能の測定

の違いがあります。


#検証集合
モデルを作成した際、性能が良いか悪いか検証するデータの集まりを指します。いわゆるテストデータと呼ばれるものです。
テストデータを作るにあたって元のデータセットを学習データとテストデータに分ける必要があります。
分ける手法に、

・ホールドアウト法
・交差検証
・k-分割交差検証法

があります。以下に紹介します。




## ホールドアウト法
シンプルにデータをテスト用データと学習データに分ける手法。

<img width="569" alt="帆０ルドアウト法.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/80e63fb0-2598-c358-445c-4b71f091eb37.png">

sklearnのtrain_test_splitではデフォルトはテストデータ0.25、学習データ0.75の割合で分けます。
コードはこちら

```python

from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

#データセットの生成
X,y=make_blobs(random_state=0)
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0)#ここでデータを学習データとテストデータに分けている。
logreg=LogisticRegression().fit(X_train,y_train)
print("Test set score:{:.2f}".format(logreg.score(X_test,y_test)))
```

結果

```python
Test set score:0.88
```


## 交差検証(Cross Validation) 
交差検証は学習データを訓練セットとテストセットに分けて行う手法。
ホールドアウト法と違うのは

・すべてのデータが一度検証に使われる（＝結果に偏りがなくなる）
・検証に重複がない
・ホールドアウト法をk回繰り返すのでより信頼度アップ

とメリットが多いです。
図にするとこう。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/2d1f9101-8dd0-b3f7-1a07-c378e477e003.png)


コードはこちら(!pip install mglearnを忘れずに)


```python

import mglearn
mglearn.plots.plot_cross_validation()
```




実際に検証してみましょう。

```python

from sklearn.model_selection import cross_val_score
scores=cross_val_score(logreg,X,y)
print("Cross-validation scores:{}".format(scores))
print("Average cross-validation scores:{}".format(scores.mean()))
```

```python
Cross-validation scores:[0.9  0.9  0.9  0.8  0.95]
Average cross-validation scores:0.89
```

##k-分割交差検証法


交差検証法の分割数を指定する検証法です。
上では5だったので3でやってみましょう。

```python
scores=cross_val_score(logreg,X,y,cv=3)#cv:分割数
print("Cross-validation scores:{}".format(scores))
print("Average cross-validation scores:{}".format(scores.mean()))
```

```python
Cross-validation scores:[0.88235294 0.84848485 0.90909091]
Average cross-validation scores:0.8799762329174095
```



参考文献

http://nobunaga.hatenablog.jp/entry/2018/07/28/114927
Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
MonacaからCustom Schemeプラグインがリリースされてた

**2021/3/16追記**
Cordova 10からCustom Schemeプラグインは削除されました。
https://docs.monaca.io/ja/release_notes/20201119_cordova10/

Monacaより「Custom Schemeプラグイン」がリリースされていました。
https://ja.monaca.io/headline/#entry_5e835238e78885e357efb480

## これは何？
以下記事の通り、WKWebViewでは、file://スキームのローカルリソース（wwwディレクトリ配下のファイル）にXHRでアクセスすることができません。それを解決するためのプラグインの様です。
https://qiita.com/kishisuke/items/d201790aeae2129ff2e3#file%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%A0%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B920200323%E8%BF%BD%E8%A8%98

「このプラグインを利用することで、WKWebView上においても、ローカルに配置されているリソースへのAjaxアクセスが可能となります。」とあります。実際にインストールしてみると、確かにローカルリソース（wwwディレクトリ配下のファイル）にXHRでアクセスできました。

## 動きを見てみる

デバッグしてみたところ、[cordova-plugin-wkwebview-file-xhr](https://github.com/oracle/cordova-plugin-wkwebview-file-xhr)の様にXHRをフックしているわけではなく、wwwディレクトリ配下のファイル全体をカスタムスキームを通じてアクセスする手法を取っているようです。
例えば、index.htmlは以下の様なURLになっています。

```
monaca-app://monaca.io/www/index.html
```

カスタムスキームではXHRのアクセス制限がないためローカルリソースにアクセスできる様になるわけです。cordova-plugin-wkwebview-file-xhrと異なり、プラグインの初期化を待たずにローカルリソースにアクセスできるため、よりベターな手法です。

なお、カスタムスキームを使ってローカルリソースにアクセスしているということは、[WKURLSchemeHandler](https://developer.apple.com/documentation/webkit/wkurlschemehandler)を使っているはずです。このAPIはiOS11以降で追加されたため、このプラグインはiOS11以降でしか使用できないものと思われます。（実際に、iOS10ではアプリを起動することができませんでした）

~~なお、残念ながらこのプラグインはpublicなnpmレジストリで公開されていません。（2020/4/1時点）
[Monaca LocalKit](https://ja.monaca.io/localkit.html)や[Monaca CLI](https://docs.monaca.io/ja/products_guide/monaca_cli/)で開発を行っている場合は、ローカル環境で`npm install`を実行する際に一度package.jsonのdependenciesからmonaca-plugin-customschemeを削除する必要があります。~~

**2020/4/6追記**
publicなnpmレジストリで公開されていました！これで、ローカル環境で`npm install`を実行してもエラーになりません。（ただし、中身はpublishされていないようなので、ローカルのCordova環境ではビルドできません。Monacaでビルドしましょう！）
https://www.npmjs.com/package/monaca-plugin-customscheme

## 余談

ちなみに、Ionicが提供する[WKWebViewのEngine](https://github.com/ionic-team/cordova-plugin-ionic-webview)もカスタムスキームを使ってローカルリソースにアクセスできます。
MonacaのCustom Schemeプラグインはcordova-plugin-wkwebview-engineと併用できる点が良いですね。次のメジャーバージョンでCordova本体にWKWebViewが統合されるので、
MERNスタックをDockerでやっていく

### はじめに
３０代正社員経験のないクズ人間だけどSHUSHOKUできました！やったー！
うれC！！！！！！！！うれC！！！
MERNスタック使って、ポートフォリオ用にWebアプリ作ってみたけど、大変だった気がします。正直全部大変だし難しいし自分が何やってるかよくわからない感じになります。頭が悪いので整理ができない……(´・ω・｀)
DockerでMERNスタック環境構築したらDocker使っちゃう気持ちもｱｹﾞｱｹﾞでいけるのでは？などと考え、あとからECRやら楽なんじゃね？とか思っていた時期が自分にもありました。

MERNスタックでなんかDockerもつかって気軽に色々できればいいなあというわけで、今後忘れないように書いておこうと思います。

Dockerについては、「[何故Dockerなのか](https://www.docker.com/why-docker)」とか、なんか公式読めば良いとかいう風潮がある気がします。
公式は字が多すぎて読む気がおきないみたいなやつはあります。でも、読め！とインターネッツの中の人たちが言ってくるので読みました。読んでもよくわからないので、脳がやばい。
脳みそやわやわな状態でやっているので、やっていける気がしない。

チラシの裏にでも書いてろ！という記事です。でもQiitaに書いたろと思いました。承認欲求モンスターなので。謝罪しておきます。申し訳ございません。


### フォルダ構成
とりあえず、こんなん

```
.
├── README.md
├── backend
│   ├── Dockerfile-dev
│   ├── app.js
│   ├── config.env
│   ├── controllers
│   ├── middleware
│   ├── models
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── public
│   ├── routes
│   ├── uploads
│   └── utils
├── frontend
│   ├── Dockerfile-dev
│   ├── build
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── public
│   └── src
├── dev-docker-compose.yml
├── node_modules
├── package-lock.json
└── package.json

```
メインにフロントエンドとバックエンドそれぞれフォルダを作りその中にdev環境Dockerfileをそれぞれ置いておく。
メインフォルダにはdev環境Docker-compose.ymlをつくる。
とりあえず`sudo apt install docker-compose`やら色々はやってる状態。
他のフォルダなんかは、皆自由にやっていっていると思います。

基本的に↓

```
nanka_app_nandemo_yoi_example/
├── node-backend/
│   └── Dockerfile
├── react-frontend/
│   └── Dockerfile
└── docker-compose.yml
```
こういう構成で作っていきたい気持ち。


### バックエンド（MERNのN担当Node.js）
とりあえず動かしたいので、こんな感じに。

```docker:Dockerfile-dev
FROM node:10.18.0-alpine3.9

EXPOSE 3000

RUN apk add --update curl
WORKDIR /usr/src/app

COPY package.json package-lock.json* ./

RUN npm cache clean --force && npm install && npm install -g nodemon
COPY . .

CMD ["npm", "run", "dev"]

```
自分にはdev環境とproduction環境をしっかり構成したいという夢がありました
というわけで、devになっていますが、別にDockerfileとしていれば良い。


### フロントエンド（MERNのR担当React.js）
担当とか書くと、なんかMERNの中で誰推し？みたいな雰囲気になっていいですね。
皆JS界からきてるわけですし、でかいアイドルグループみたいなもんやろ。しらんけど。
自分は誰推しでもないです、皆むずかしい。もう誰も信じない。

とりあえずこんな感じ

```docker:Dockerfile-dev
FROM node:10.18.0-alpine3.9

EXPOSE 3000

RUN apk add --update curl
WORKDIR /usr/src/app

COPY package.json package-lock.json* ./

COPY . .

CMD [ "npm", "start" ]

```
ほぼバックエンド側と変わらない感じのやつ。少しでも、行数を減らしたい。行が増えると絶望感が増す。


### COMPOSEファイル（MERNのM担当Mongoあたりも登場）
コンポーズファイル作ります。
こいつがないと私にはなにもできない。

```docker:dev-docker-compose.yml
version: "2.2"

services:
  mongodb:
    image: "mongo"
    ports:
      - "27017:27017"
  backend:
    build:
      context: ./backend/
      dockerfile: Dockerfile-dev
    ports:
      - "6200:6200"
    volumes:
      - ./backend:/usr/src/app
    depends_on:
      - mongodb
  frontend:
    build:
      context: ./frontend/
      dockerfile: Dockerfile-dev
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/usr/src/app
    depends_on:
      - backend
```

### ビルドしたい
`docker-compose -f dev-docker-compose.yml build`これでビルドできる。
あとは毎回`docker-compose -f dev-docker-compose.yml up`とかすれば良い。

これで、なんか構築はされる感じになっている。
あとはCircleCIがどうとか、Node.js側でAPIがどうのとかReact側でSPAがどうとか、MongoDBでAtlasで某とか、そういうあれでなんかやっていきます。
エイプリルフールに作成したWebページ解説

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【衝撃】漢字「タピオカ」が使用可能に！？ - livedra NEWS <a href="https://t.co/c6KevDfjFU">https://t.co/c6KevDfjFU</a></p>&mdash; ライブドラニュース (@livedranews) <a href="https://twitter.com/livedranews/status/1245018516496900097?ref_src=twsrc%5Etfw">March 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こんなものを作りました。
アーカイブをGitHub Pagesに残してあります。Webページを見たい方は下のリンクから。
[【衝撃】漢字「タピオカ」が使用可能に！？ - livedra NEWS](https://ogadra.github.io/AprilFool2020/)

GitHubは[こちら](https://github.com/ogadra/AprilFool2020)

技術的に解説したいことは1つのみです。
#####どうやって「タピオカ」を文字として張り付けたか
そこまで難しいものでもないのですが。
一言で言ってしまえば
#####「その文字専用のフォントを用意する」
ことで解決しました。
実はタピオカという文字をどうやって表現するか？という問いに対してこの解に至ったわけではなく、そもそも「フォントの見え方と内部の文字コードが違ったら面白そうじゃね？」という考えが前々からあったのでそれを実現した形になります。
以下やり方解説です。
####フォントの作り方
[フォントを作るサイト](https://www.calligraphr.com/en/)があります。
このサイトでは一文字単位でフォントを作成することが出来ます！便利！
使い方は[このサイト](https://nelog.jp/paintfont-com)が分かりやすいです。
フォントは画像にしてアップロードするので、お好きな方法で作成するのが良いと思います。
####Webページでの埋め込み
CSSでこのようにフォントを指定してあげます。

```css
@font-face {
	font-family: 'Myfont';
	src:url("Myfont-Regular.otf");
	unicode-range: U+5618;
}
```
U+5618は「嘘」を指定してあげています。
つまり、一文字だけこのフォントを使ってね、と指示しています。（そもそも一文字しか作っていないので、ない分は自動補完されますが）
あとは各部分で「作ったフォント」と「基にしたフォント」を指定してあげれば良い感じになります。

####頑張った点
- ドメインも取得した（livedra.com）
- サーバーは借りた
- 実はタイトルと本文でフォントが違うので、「タピオカ」の字を2通り作っている
- Twitterでリンクに触れてもらうために、Twitterカードを設定した

####イマイチだった点
- PC版サイトがダサい（作成気力の無さ、表示するものがそもそも無い）（普通だったら別記事へのリンクや広告などを貼る）
- フォントが若干馴染んでいない
- 自作フォントと通常フォントのファイルサイズの差が大きすぎて、iOSとかだとタピオカだけ早く表示されたりする
- サーバーが落ちた（自分が作成していない方のフォントを直にサーバーに置いていたのだが、ファイルサイズが大きいらしい。）（GoogleFontsとかちゃんと使えば防げたミスだった。）
- 自作フォントのファイル名が適当すぎ
- 信じた人がいた（想定外）


そんな感じです。
Ardupilot のAP_Mathクラスにある関数

# はじめに
* 本記事は、Ardupilotに含まれている算術演算ライブラリ(__[AP_Math](https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_Math)__)に含まれている関数の作用についての覚書です。
* 関数の説明は随時更新したいと思います。


# rotate関数
* rotate関数は__ジャイロセンサーの取付方向__ を__機体のRoll,Pitch,Yaw方向__ に合わせるために使用しているようです。
* Vector3型のメンバ変数__X,Y,Zの３つの入れ替え__ 処理を行います。
* 引数である __enum Rotation__ により入れ替えのバリエーションを指定します。
* 関数は↓のように定義されています。

```C++
template <typename T>
void Vector3<T>::rotate(enum Rotation rotation){
   //処理記述(省略)
}
```

##ローテーションなし（引数が__ROTATION_NONE__）の場合

 * 機体ロール軸＝ジャイロセンサのX軸
 * 機体ピッチ軸＝ジャイロセンサのY軸
 * 機体ヨー軸＝ジャイロセンサのZ軸

となり、__"X,Y,Zの入れ替えは無し"__ となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/4e091bcf-48f7-3dc9-8dd8-f750613c2dde.png)

##ヨー方向に90°（引数がROTATION_YAW_90）の場合
図のようにジャイロセンサを ヨー方向に90度回転して取り付けた状態だとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/f813f288-8a96-6955-8584-7d8051a80127.png)
これを X=ロール、Y=ピッチ、Z=ヨー であるかのようにXYZを入れ変える処理が入ります。
**回転後X(機体ロール) ＝ ジャイロYの逆回転(符号が反転)
**回転後Y(機体ピッチ) ＝ ジャイロX
**回転後Z(機体ヨー  ) ＝ ジャイロZ
となります。

該当部分のソースコードは↓の様に記述されています。

```C++
    switch (rotation) {
    //--省略--
    case ROTATION_YAW_90: {
        tmp = x;
        x = -y;
        y = tmp;
        return;
    }
    //--省略--
```

##ロール90度回転後ピッチ90°度回転（引数がROTATION_ROLL_90_PITCH_90）の場合

先にソース参照します。 __先にロール90度回転したのちにピッチ90度回転するような記述になっています__
 
 * 回転後Z(機体ヨー)＝ジャイロY
 * 回転後Y(機体ピッチ)＝ジャイロZの逆回転

その後

 * 回転後Z(機体ヨー)＝回転前Xの逆回転
 * 回転後X(機体ロール)＝回転前Z

 となります

```C++
    case ROTATION_ROLL_90_PITCH_90: {
        tmp = z;
        z = y;
        y = -tmp;
        tmp = z;
        z = -x;
        x = tmp;
        return;
    }
```

図で書くとこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/ee268c2b-954f-9250-c4b4-d09079e26a20.png)

* その他の回転も同じ要領でコーディングされていますので、説明は割愛します。
laravel homestead でPHPのバージョンを指定してcomposer installする

詰まったのでメモがてらに。

# composer install したら、PHPのバージョンが違うとかでエラーになった
色々な理由から、Homestead.yaml内に複数の記述をして複数の仮想環境を立ち上げていました。
そのうちの一つで、composer installをしようとしたらエラーに…。

# エラー内容はphpのバージョンが違う
エラーの内容は、phpのバージョンが高すぎる。
7.3より下じゃないと危ないよ、と言われてました。
今のバージョンは7.4。
でも、Homestead.yaml内で、以下のように指定している・・・。

```
sites:
    - map: dev.hogege.test
      to: /home/vagrant/hogege/public
      php: "7.3"
```

# これはサイト側のPHPバージョンの設定
CLI（コマンドライン）には反映されない…。
じゃあどうすれば？

# コマンドラインのバージョンを変更する
[[Laravel] HomesteadでPHPのバージョンを切り替える](https://www.84kure.com/blog/2019/09/03/laravel-homestead%E3%81%A7php%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B/)
ここのサイトを参考に、以下を実行してみた。

```
php72
```
command not found.

なんてこった。

# そもそもphp72自体が効かない
バージョン情報自体も効かない…。
でも

```
php7.2
```
だと動く…。

# バージョンを指定してcomposer installを実行
実行した。

```
php7.2 /usr/local/bin/composer install
```

通った。

なぜphp72が通らないのかは要調査です……。
parcel v2を使ってTypeScriptで書いたAWS Lambdaをビルドする

<img width="590" alt="スクリーンショット 2020-04-01 19.42.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15319/69de05b2-7dd1-c231-1e90-92df8a44bd8a.png">


`parcel v2`はまだアルファ版なので今後このやり方が変わる可能性がありますが、一応やり方を載せておきます。
また、v1でも問題なくビルドでき、プラグインも揃っているので現状ではまだv1のやり方を推奨します。
以下の記事を参考にさせていただきました。

[parcelだけでAWS Lambda向けのTypeScriptをビルドする - Qiita](https://qiita.com/terrierscript/items/e3452704af812fa14fc0)

## 手順

`typescript`と`parcel`をインストール。v1ではzipプラグインが使えたが、v2では互換性がないため普通にzipします。

```sh
yarn add --dev typescript parcel@next
```

関数を作成。ここでは`index.ts`という名前にします(任意)。

```ts
export const handler = () => {
  console.log('Hello World!')
  return {}
}
```

`parcel` v1では、cliのオプションで渡したがv2では`package.json`に追記します。

```json
{
  "main": "dest/bundle.js",
  "targets": {
    "main": {
      "context": "node",
      "includeNodeModules": true
    }
  }
}
```

出力先が、`main` になります。ここは任意の名前にできますが、`main`はparcelで特別扱いなので楽です。
`targets`でさきほどの`main`を指定します。(別の名前を定義した場合はその名前をキーにしてください)
`context`で`node`環境を対象にし、`includeNodeModules`で`node_modules`のモジュールを含めてビルドします。

他のオプションや詳細については、以下の公式のドキュメントを見てください。

[parcel-bundler/parcel: 📦🚀 Blazing fast, zero configuration web application bundler](https://github.com/parcel-bundler/parcel#targets)

`package.json`のスクリプトも更新します。

```json
{
  "main": "dest/bundle.js",
  "targets": {
    "main": {
      "context": "node",
      "includeNodeModules": true
    }
  },
  "scripts": {
    "bundle": "parcel build index.ts",
    "zip": "zip -j ${npm_package_main}.zip ${npm_package_main}",
    "deploy:aws": "aws lambda update-function-code --function-name=my-func --zip-file fileb://./${npm_package_main}.zip --region=ap-northeast-1",
    "deploy": "yarn bundle && yarn zip && yarn deploy:aws",
  }
}
```

`aws` コマンドがインストールされていれば、`yarn deploy`でAWS Lambdaのデプロイまでいけます。

## 参考
[parcelだけでAWS Lambda向けのTypeScriptをビルドする - Qiita](https://qiita.com/terrierscript/items/e3452704af812fa14fc0)

---



<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">parcel v2、プラグインまわりが一新されて既存のプラグインすべて動作しないの笑ってしまうな</p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/1245268933315182601?ref_src=twsrc%5Etfw">April 1, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Qita&Dockerを入門してみた

# Dockerとは
コンテナ型のアプリケーション実行環境
アプリケーションにデプロイに特化しており、コンテナを中心とした開発・運用を可能とします。

## Dockerのメリット
- ####軽量な仮想環境
例えば、WEBアプリケーションを開発する上で、ApacheやNginxのようなwebサーバーをローカル環境に構築する作業
ローカル環境でdockerのセットアップが済んでいれば、コマンド一つ叩くだけで環境構築ができる。

- ####優れたポータビリティを持つ
ローカルのDocker環境で実行しているコンテナを、別のサーバーにあるDocker環境にデプロイする、あるいはその逆にサーバーのDockerの環境で動作するコンテナをローカルに持ってくることが可能です。

- ####軽い！
従来の仮想環境と比べて軽いのが特徴

## Dockerの基本動作

### dockerイメージとコンテナの関係性

## イメージ    
     Dockerコンテナを構成するファイルシステムや、実行するアプリケーションや設定をまとめたもので、コンテナを作成するための利用されるテンプレートとなるもの
## コンテナ
     Dockerイメージをもとに作成され具現化されたファイルシステムとアプリケーションが実行されている状態

## Dockerfile
###基本的なインストラクション

####FORM

FROMは作成するDockerイメージのベースとなるイメージを指定します。
Dockerfileで、イメージをビルドする際、まず最初にFROMdで指定されたイメージをダウンロードしてから実行される。
FROMはDocker Hubのレジストリを参照する。

#### RUN

RUNはDockerイメージビルド時に、Dockerコンテナ内で実行するコマンドを定義します。
RUNの引数にはDockerコンテナ内で実行するコマンドをそのまま指定します。

#### COPY

Dockerを動作させいているホストマシン上のファイルやディレクトリをDockerコンテナ内にコピーするためのインストラクションです。

#### CMD

CMDはDockerコンテナとして実行する際に、コンテナ内で実行するプロセスを指定します。
イメージをビルドするためのRUNに対して、CMDはコンテナ起動時に１度実行されます。
RUNでアプリケーションの更新や配置、CMDでアプリケーションそのものを動作させると考えてください。

##Docker-composeによるコンテナ実行
Docker compose とは、複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能です。
Docker compose では、compose ファイルを用意してコマンドを1 回実行することで、そのファイルから設定を読み込んですべてのコンテナサービスを起動することができます。

docker-compose.ymlが置かれているディクトリ内で以下のコマンドを実行する

##### コンテナの実行
     docker-compose up -d
##### コンテナの停止
     docker-compose down


## 詳細は他の方の記事へ!!!


投稿者は Docker初心者なので今回はざっくりの記事ですみません！
その他学びがあればこれから投稿していくのでよろしくお願いします！
slick.js dotsの表示/非表示を動的に変更する

# やりたいこと

写真が複数枚のときはdotsを表示したい。
写真が1枚のときはdotsを非表示にしたい。
以下のように。
<img width="200px" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/4698ab8e-140f-2e33-2d36-9f56e2ee8772.png">　　<img width="200px" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/319efab5-fcb1-c786-2d7f-9ce017647f3f.png">

## 方法

```js
$(function () {
  $('.slider').on('init', function (event, slick) {
    if (slick.slideCount <= 1) {
      // bootstrap使っているのでaddClass()で対応
      $(this).find('.slick-dots').addClass('d-none');
    }
    
  });
  $('.slider').slick({
    dots: true
  });
});
```

わりとシンプルなのに、たどり着くのに1時間以上かかってしまった。
精進します。
https-portalを使ってみて、個人的にぶつかりそうな壁の解決方法

# とても参考になったもの
https://qiita.com/kuboon/items/f424b84c718619460c6f

実際にやっていくと、「？、これ..どうすんだっけ」が何個かあったので

## STAGEがlocal、staging(default)、productionとある...

1. localはドメインも持っていないが、とりあえず一連の流れをやってみたい
2. stagingはドメインを持っていて、本番サーバーではないが、とりあえず一連の流れをやってみたい
3. productionはドメインを持っていて、本番サーバーで動かす場合

### 実際にlocalでやるには

hostsを書き換えて適当なドメイン名がローカルサーバーに行くように設定

```:hosts
192.168.1.100 domain.local # 実在しないのでも
192.168.1.100 qiita.com    # 実在するのでも
```

### stagingでやるには

ドメインはあってもなくても良いけど、stagingなんで、実際のドメインでやるけどサーバーが本番サーバーじゃない的な
*お名前とかのレジストラで、ドメインのAレコードをテスト用のサーバーに向けるとか
*自分1人でテストするならlocalのようにhostsで強制しても構わない

local、stagingは警告が出るがhttps通信のオレオレ


### productionでやってみた

let's encryptに証明書を取得して、実際にアクセス出来るまでに結構ラグがあった。
コーヒー一杯作る時間は待つと思う。



## FORCE_RENEW=true

基本的にはlocalやstagingで実行するので通常は必要ない。どうしても証明書にキャッシュが効いてて挙動がおかしいとかそういうときだけに使う。
`production`では基本使わない。[どうしてもおかしい場合][5]は、一回だけ`true`にしてdocker再起動させて、すぐにコメントアウトでもしておく。
そうじゃないとLet's Encryptにはrate limitがあるから最悪証明書が取れなくなる。

[About Rate Limits of Let's Encrypt][1]
> For most people the most important rate limits are:
> 
> 5 failed validation attempts per hour
> 50 certificates per registered domain per week
> 5 duplicated certificate per week (for renewal)


## [普通使いそうなオプション][3]

色々サイトを回ってみたけど、余り触れられてない。
けど、有用なオプションが結構ある。

CLIENT_MAX_BODY_SIZE
nginxはアップロード量の制限が[デフォルトで1MB][2]なんで、まずい。

```yaml:docker-compose.ymlの環境変数
environment:
#  CLIENT_MAX_BODY_SIZE: 0  # これだと無制限
  CLIENT_MAX_BODY_SIZE: 10M # とか
```

WEBSOCKET
websocketを使う時はこれを入れてないと動かない

```yaml:docker-compose.ymlの環境変数
environment:
  WEBSOCKET: "true"
```

HSTS_MAX_AGE
HTTPで来ても、強制HTTPS

```yaml:docker-compose.ymlの環境変数
environment:
  HSTS_MAX_AGE: 60 # 秒
```

いきなり1日分とかデカイ秒数設定すると、その時間HTTPには戻れないから[注意して][4]とある。

## [SSL Certificatesをdockerホスト上に保存][6]

```yaml
https-portal:
  # ...
  volumes:
    - /data/ssl_certs:/var/lib/https-portal
```

他のプログラムで同じ物を使う場合とからしいけど、こうしておけば多分コンテナを消しても再生成しなくてすむから、テスト中は時間短縮によさそう。

## 参考

ここの[3ファイル][7]は眺めておくと、挙動が分かりやすいと思う。


[1]: https://github.com/SteveLTN/https-portal#about-rate-limits-of-lets-encrypt
[2]: https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
[3]: https://github.com/SteveLTN/https-portal#configure-nginx-through-environment-variables
[4]: https://github.com/SteveLTN/https-portal#hsts-header
[5]: https://github.com/SteveLTN/https-portal#troubleshooting
[6]: https://github.com/SteveLTN/https-portal#share-certificates-with-other-apps
[7]: https://github.com/SteveLTN/https-portal/tree/master/fs_overlay/var/lib/nginx-conf
途中で戻したり進めたりできるイテレータ

構文解析する際に、文字列イテレート中に戻したりスキップしたりできるイテレータがあれば便利かと思い作ってみました。
参考： https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators

```js
function iter(pattern) {
    let index = 0
    return {
        [Symbol.iterator]: function() {
            return this
        },
        next: function() {
            if (index < pattern.length) {
                return { value: pattern[index++], done: false }
            } else {
                return { done: true }
            }
        },
        fetch: function() {
            return pattern[index]
        },
        back: function() {
            index > 0 && index--
        },
        skip: function() {
            index++
        },
    }
}
```

実際に利用したコードは長くなってしまったので、ちょっと無理矢理な使用例を示します。

```js:使用例
let it = iter("Helo!!!!!, world!")
for (let c of it) {
    console.log(c)                    // 'Hel'
    if (c === 'l') break
}
it.back()                             // back to 'l'
console.log(it.next().value)          // 'l'
console.log(it.next().value)          // 'o'
while (it.fetch() === '!') it.skip()  // skip '!'
for (let c of it) {
    console.log(c)                    // ', world!'
}
```

```text:実行結果
H
e
l
l
o
,

w
o
r
l
d
!
```
【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その６

※本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。

##環境
Ruby 2.5.1
MacOS Mojave Ver.10.14.6


[【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その５](https://qiita.com/TOMARU4400/items/ae9346041898da9b2bda)の続きです。ここでも少し難しくなります。



```irb:Tarminal
irb(main):019:0> def hi(name = "World")
irb(main):020:1> puts "Hello #{name.capitalize}!"
irb(main):021:1> end
=> :hi
irb(main):022:0> hi "chris"
Hello Chris!
=> nil
irb(main):023:0> hi
Hello World!
=> nil
```

## capitalizeメソッド

2行目のcapitalizeメソッドでnameの先頭の小文字を大文字に変換しています。（chris▶︎Chris）

８行目のカッコなしのメソッド呼び出しではデフォルト引数のWorldが呼び出されます。 これは、「もしnameが与えられなければ、nameのデフォルト値である"World"を 使う」という定義になります。

上記のように表示されていれば成功です。お疲れ様でした。
Ntrip補正情報が正常に配信されているかを見守る

Ntrip RTK-GNSSを利用し屋外の移動局をセットして、いざ使おうと思ったら基準局のトラブルで補正情報が受信できず慌てるということがあります。
原因はラズパイのSDカード不良だったり、ルーターの不良だったり、配信サーバー（NtripCaster）のト
ラブルだったり様々ですがそうなると外から修復することは難しいので非常に困ります。

そこで基準局として24時間稼働しているラズパイからNtripClientとして接続して
HTTPステータス「**ICY 200 OK**」が返ってきたら正常。
それ以外なら異常としてLINE Notifyで通知するシェルスクリプトを作ってみました

参考
https://github.com/liukai-tech/NtripClient-Tools
https://qiita.com/Kakimoty_Field/items/754df3a181187fbb517c
https://qiita.com/tbuchi888/items/f014f809a7e9f649d270

pythonで書かれたNtripClientツールがあったのでForkさせていただきました

```
git clone https://github.com/mnltake/NtripClient-Tools
cd /NtripClient-Tools
chmod 755 NtripClient.py
chmod 755 checkNtrip.sh
```


```sh:checkNtrip.sh
#!/bin/bash

HOST="Ntripcaster host"
PORT="2101"
MOUNTPOINT="MountPoint"
USER="guest"
PASS="guest"
ACCESS_TOKEN="LINEアクセストークン"
# 通知するかどうかフラグ
NOTIFY=0

## スクリプトへの引数を確認
if [ $1 = "-n" ];then
  NOTIFY=1;
elif [ $1 = "-e" ];then
  NOTIFY=0;
else
  echo "[-n]:正常通知　[-e]:異常通知"
  exit 1
fi

## NtripClientへのアクセスを試みる
message=`python3 /home/pi/NtripClient-Tools/NtripClient.py -u $USER -p $PASS -v -m 10 $HOST $PORT $MOUNTPOINT 2>&1| grep 'ICY 200 OK'`
echo $message
if [ $NOTIFY -eq 0 ] && [ -n "$message" ];then
  # 正常
  echo "good"
  exit 1
elif [ $NOTIFY -eq 1 ] && [ -n "$message" ];then
  #定期通知
  echo "running"
  MSG="Ntrip Caster 正常稼働中"
  curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=$MSG" https://notify-api.line.me/api/notify
  exit 0
else
  #異常通知
  echo "error"
  MSG="Ntrip Casterから補正情報が受信出来ません "
  #MSG="Ntrip Casterから補正情報が受信出来ません NtripSeverを再起動します"
  curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=$MSG" https://notify-api.line.me/api/notify
  #sudo reboot
  exit 0
fi

```

毎朝6時半に正常稼働を通知し、毎時0分に異常を監視

```
crontab -e
30 6 * * * /home/pi/NtripClient-Tools/checkNtrip.sh -n
0 * * * * /home/pi/NtripClient-Tools/checkNtrip.sh -e

```

試しに基準局のstr2strを止めてみると通知が飛んできました
通知に気づかず再起動を繰り返すとあまり良くないかもしれませんが、しばらく様子を見てみたいと思います。
Webサイトをわざと遅くするとどうなる？ ありえないA/Bテストの結果

こちらのブログ記事のダイジェストです。

Webの表示が速ければ収益が改善する。身をもって確かめた禁断のA/Bテスト大公開
https://blog.ideamans.com/2020/03/waiting-time-and-cvr.html

# 「Webの表示が1秒遅くなると売上が○○%下がる」は本当？

よく耳にするフレーズです。遅いサイトを見限ってしまうのは、みなさんもお持ちの感覚でしょう。

しかし表示の高速化は多くのサイトにとってなかなか骨の折れる問題です。

そのコストが見合う成果が得られるのか**やってみなければわからない、だから手をつけられない**のが実情ではないでしょうか。

逆に**データに基づく正確な予測があれば、とても決断しやすく**なるはずです。


# A/Bテストで一部のユーザーにはわざと遅くしてみた

サイトを速くするのは大変ですが、遅く(待ち時間を長く)するのは簡単です。

そこで、[ウェブサイト、A/B テスト、パーソナライズのソリューション \- Google オプティマイズ](https://marketingplatform.google.com/intl/ja/about/optimize/)を使って、弊社のブログ・サイトでユーザーによって表示までの待ち時間を変えるという、ありえないA/Bテストを行ってみました。

待ち時間最小
<img src="https://blog.ideamans.com/assets/original-4.gif" width="160">

待ち時間+4秒
<img src="https://blog.ideamans.com/assets/original.gif" width="160">

ユーザーを5つのセグメントに分け、ローディング画面の待ち時間を意図的に変更します。

1. 待ち時間+0秒
2. 待ち時間+1秒
3. 待ち時間+2秒
4. 待ち時間+3秒
5. 待ち時間+4秒

対象が技術情報ブログなので、**ユーザーが半分以上スクロールした割合**を`精読率`と定義して、セグメントごとの指標を比較しました。

約2週間、合計5,323セッション(各セグメント約1000セッションずつ)についてA/Bテストを実施した結果がこちらです。

# 1秒遅くなるごとに精読率-0.8%

驚くほどきれいな相関関係が現れました。待ち時間なしで99.36%だった精読率が、待ち時間+4秒で95.59%に下落します。

![1秒ごとに-0.8%下落](https://blog.ideamans.com/assets/wait-cvr-chart-2.png)

精読数はページごとに計測しますが、分母がセッション数のため、精読率がちょっとわかりにくくなってます。決して95%〜99%の人がページを半分以上スクロールしたのではなく、スクロールしなかった人もいたし、複数ページをスクロールした人もいた平均が95%〜99%という結果です。

# やっぱり速いは正義

弊社のブログはアクセス数が少なく、ほとんどのユーザーがPCからアクセスする技術情報ブログですが、表示速度はサイトの成果に直結することが実証されました。

気軽な目的のコンテンツや、スマホサイトでは、待ち時間はもっとシビアに離脱を招くと想像します。

この実験、ユーザーの時間を無駄に浪費する企業のモラルも問題ですし、実際に収益を下げる結果につながるので実施は難しいでしょう。しかし**憶測を脱して正確な計画**を立てるためには一考の価値があります。
1つ以上のProvisioning Profileがインストールできないとは


Provisioning Profileをインストールして、ダブルクリックしたら、

> Failed to install one or more provisioning profiles on the device.
> Please ensure the provisioning profile is configured for this device. If not, please try to generate a new profile.

というエラーが出たときの対処法について。

## 原因

最近Apple Developer上で登録Deviceの整理をしたりしませんでしたか。
あるいはProvisioning Profileの整理など。

登録情報がなにかしら変更されて、
Provisioning Profileの上書きができなくなってしまっている状態です。

## 対処法

すでにMacに保存しているProvisioning Profileを削除して、
再読み込みをしてあげれば良いです。

### 削除すべきProvisioning Profileを知る

Signing&CapabilitiesのProvisioning Profileの
インフォメーションアイコンをタップして表示される「PROV」画像のとこ、
実はdrop&dragできるProvisioning Profileのファイルになってます。

![](https://i.imgur.com/xLRI4GM.png)

これを一旦デスクトップにでもうつして、ファイル名をメモしておきます。
例: `1234ab45-abcd-1234-abcd-abcdef1234ghi.mobileprovision`

### Provisioning Profileを削除する

Terminalでroot directoryにて、対象ディレクトリに移動して、

```
$ cd Library/MobileDevice/Provisioning\ Profiles
```

対象の.moblieprovisionファイルがあるか確認し、

```
$ cat 1234ab45-abcd-1234-abcd-abcdef1234ghi.mobileprovision
```

削除します。

```
$ rm 1234ab45-abcd-1234-abcd-abcdef1234ghi.mobileprovision
```

### Provisioning Profileを更新

Apple Developerからインストールしたものをダブルクリックしてもいいですし、
Automatically auto signingを一旦OFF -> 再度ONにするだけで更新されます。

以上です。

## ちなみに

> Xcode encountered an error

というエラーが出る場合、Xcode11.2.1の既存バグなので、
Xcodeをアップデートしましょう。

https://stackoverflow.com/questions/59016207/xcode-encountered-an-error-in-xcode-11-2-1

## 参考

https://conocode.com/troubleshooting/provisioning-profile-reload/