OmniAICreator/Qiita-1.07M huggingface dataset:
【#Max-MSP】ifオブジェクトの使い方

過去に投稿したMax/MSP関連の記事は以下です。　
→ [【#Max-MSP】line~オブジェクトの使い方](https://qiita.com/hiwasawa/items/38026e6fcc4445aec812) 

#左インレットと右インレットを比較するifオブジェクト

+ 左インレットから入力される値:f1
+ 右インレットから入力される値:f2

```
If($f1 < -140.0 & $f2 > 10.0) then $f2 else 0.0
```

f1 < -140.0 且 つf2 > 10.0の場合は
f2を出力 
それ以外の場合は0.0を出力する
という意味です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631693/31ac1665-0c86-86ce-36c6-0c5142e2ac9f.png)

テキストと図だと解りにくいので以下動画もアップしました。
[![](https://img.youtube.com/vi/d8_7doaLTD4/0.jpg)](https://www.youtube.com/watch?v=d8_7doaLTD4)
【Rails】Railsコマンド一覧（備忘録）

# 【Rails】Railsコマンド一覧（備忘録）

## サンドバック
```:terminal
rails console -s
```
このコマンドを打ったのちに実行されるものはその後すぐにrollbackされる

## ミスで作ってしまったControllerを削除するコマンド
```:terminal
rails destroy  controller コントローラー名 アクション名
```

## ミスで作ってしまったModelを削除するコマンド
```:terminal
rails destroy  model モデル名
```

## testの実行
```:terminal
rails test
```
Poetryで、サクッとPython開発環境を手に入れる

## 背景

昨年末2019/12/12に、Poetryが1.0.0を迎えていたので、試してみた。

## 概要

Poetryとは、Python用パッケージング・依存関係管理ツール。

類似したツールとして、
setuptoolsやPipenvがありますが、Poetryこれ１つで両方の機能をまかなえる。

**「tomlファイル１つあればいい」**というところに惹かれる。というか**素晴らしい**と思った。

## バージョン

poetry v1.0.5　（2020/05/11現在最新）

## プロジェクトの作成

https://python-poetry.org/docs/basic-usage/
https://python-poetry.org/docs/cli/#new

```shell
$ poetry new <project名>
```

実行後には、次のようなフォルダが作られる。

```
<project名>
├── pyproject.toml
├── README.rst
├── poetry_demo
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_poetry_demo.py
```

作られたフォルダに含まれる`pyproject.toml`が、poetryの設定ファイルである。
`setup.py`/`setup.cfg`/`Pipfile`に置き換わるファイルであり、各ファイルに書いていた内容は`pyproject.toml`に記載する事できる。
調べれば、だいたい置き換えられるので、気になった人は公式ページのリンクを見てもらいたい。
https://python-poetry.org/docs/pyproject/

```toml:pyproject.tml
[tool.poetry]
name = "<project名>"
version = "0.1.0"
description = ""
authors = ["Sébastien Eustace <sebastien@eustace.io>"]

[tool.poetry.dependencies]
python = "*"

[tool.poetry.dev-dependencies]
pytest = "^3.4"
```

## ライブラリの追加

https://python-poetry.org/docs/cli/#add

```shell
# 依存ライブラリ追加
$ poetry add requests
# 開発用の依存ライブラリ追加
$ poetry add --dev requests
```

バージョンももちろん指定できる。`requirements.txt`/`setup.py`/`Pipfile`と大差ないようだ。
https://python-poetry.org/docs/dependency-specification/


## 仮想環境の作成、開発モードでのインストール

https://python-poetry.org/docs/cli/#install

```shell
$ poetry install
```

## 仮想環境でのコマンド実行

https://python-poetry.org/docs/cli/#run
https://python-poetry.org/docs/cli/#shell

```shell
# 単発で実行
$ poetry run python -m pip list
# shellで実行
$ poetry shell
```

`pyproject.toml`に、実行したいPythonモジュールを指定することで、npm-scriptsのようなこともできるようだ。

```toml:pyproject.tml
[tool.poetry.scripts]
my-script = "my_module:main"
```

```shell
$ poetry run my-script
```

## パッケージング

https://python-poetry.org/docs/cli/#build

```shell
$ poetry build
```

デフォルトでは、sdist/wheel両方が作成される。
`--format`オプションでどちらか一方だけにすることもできる。


## requirements.txtへの出力

https://python-poetry.org/docs/cli/#export

```shell
$ poetry export -f requirements.txt > requirements.txt
```

v1.0.2では、requirements.txtの形式しかサポートしてないそうだ。

## PyCharmとの連携

PyCharm（2019.03）なら、`pyproject.toml`を認識して、仮想環境を検出してくれた。


## Vitual Studio Codeとの連携

Visual Studio Codeなら、自動では認識してくれない。

手間だが、次のどちらかの作業が必要になる。
1. 仮想環境を保存しているパスを`settings.json`に指定する
2. 自動で認識してくれる`.venv`フォルダにpoetryの仮想環境を作る（※個人的にはこちらのほうが好き）

https://github.com/microsoft/vscode-python/issues/8372#issuecomment-549924849

### `settings.json`に設定を行う場合

これはMacでの例。

```:settings.json
{
    "python.venvPath": "~/Library/Caches/pypoetry/virtualenvs"
}
```

### `.venv`フォルダに仮想環境を作る場合

```shell
# 一度作っていたPython環境を削除
$ poetry env list
$ poetry env remove <環境名>
# .venvに保存するように、設定値変更 --> poetry.tomlに出力される。
$ poetry config virutalenv.local true --local
# 仮想環境作成 --> .venvフォルダに出力される。
$ poetry install
```

その後Visual Studio CodeのPython Interpreter設定を読み込み直して見ると、`.venv`フォルダを選択できるようになっている。
社会人エンジニアがatcoderで茶色を目指す#6

##先人達が残してくれた資料
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067#5-%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-10-%E5%95%8F)

「ここまで解いたら」から挑戦していきます。

##[B - Choose Integers](https://atcoder.jp/contests/abc060/tasks/abc060_b)
問題文はAtcoderを参照してください。

- 無限ループの終了条件を何にするか
- どんな整数にも余りが0になるタイミングが存在する
- 余りが0になるまで処理を行う

```python
A,B,C = map(int, input().split())

sum=A
while sum % B != 0:
    sum = sum + A

    if sum%B==C:
        print("Yes")
        break
else:
    print("No")
```

本回答
x,y に関する二元一次不定方程式 ax+by=c が整数解を持つ　⟺ c はgcd(a,b) の倍数

```python
def gcd(x, y):
    if x<y: gcd(y, x)
    while y:
        x, y = y, x%y
    return x

A, B, C = map(int, input().split())

if  C % gcd(A, B) == 0:
    print('YES')
else:
    print('NO')
```

数学Aを勉強し直してきなさい！

##[B - Trained?](https://atcoder.jp/contests/abc065/tasks/abc065_b)
問題文はAtcoderを参照してください。

```python
N = int(input())
A=[int(input()) for i in range(N)]

now=1
c=0

while c<N:
    now=A[now-1]
    c+=1
    if(now==2):
        print(c)
        break
else:
    print("-1")
```

N回までに目的地にたどり着けば大丈夫です。

##[C - Candies](https://atcoder.jp/contests/abc087/tasks/arc090_a)
問題文はAtcoderを参照してください。

- 2行しかない
- 下方向には１度しか移動しない
- 累積和を使用して、1行目は左から右へ総和を求める。
- 2行目は右から左へ総和を求める
- 各列の和の最大値が回答 

```python
N = int(input())
A=[list(map(int, input().split())) for i in range(2)]

for i in range(1, N):
    A[0][i]=A[0][i]+A[0][i-1]

for i in range(N-1, 0, -1):
    A[1][i-1]=A[1][i-1]+A[1][i]

max=0
for i in range(0, N):
    if max<A[0][i]+A[1][i]:
        max=A[0][i]+A[1][i]

print(max)
```

##[C - Attention](https://atcoder.jp/contests/abc098/tasks/arc098_a)
問題文はAtcoderを参照してください。

- 2重ループで累積和の配列を作る
- 最小の値が回答

```python
N = int(input())
S = str(input())
A=[0] * N
 
for i in range(0, N):
    for j in range(0, N):
        if i != j:
            if j<i:
                if S[j] == "W":
                    A[i]+=1
                
            if j>i:
                if S[j] == "E":
                    A[i]+=1
 
tmp=A[0]
for i in range(1, N):
    if tmp > A[i]:
        tmp = A[i]
 
print(tmp)
```
どう見てもTLEです。
「2重ループで累積和の配列を作る」、累積和は何の為にするのか考え直して欲しいです。
考え直しましょう。

- 左から右へ、右から左へ振り向く人を計測。
- 各要素を加算し、最小値が回答。

O(N^2+N)がO(3N)になりました。
O(N^2)がO(N)と表記。

```python
N = int(input())
S = str(input())
W=[0] * N
E=[0] * N

for i in range(1, N):
    if S[i-1] == "W":
        W[i]=W[i-1]+1
    else:
        W[i]=W[i-1]
for i in range(N-2, -1, -1):
    if S[i+1] == "E":
        E[i]=E[i+1]+1
    else:
        E[i]=E[i+1]

tmp=W[0]+E[0]
for i in range(1, N):
    if tmp > W[i]+E[i]:
        tmp = W[i]+E[i]

print(tmp)
```

解説を見ずにACになった時は、累積和を使いこなした感じがするので嬉しかったです。
Rails devise validationに引っかからない方法

どうもチャンクノです！
deviseを使用するとUserモデルを更新したりする場合必ずパスワードのparamsを送らなければいけません。
ですが、deviseのメソッドをオーバーライドすることでパスワードをparamsから省くことができます。
この方法はググればすぐに出てきますが、もしUserモデルにパスワードのバリデーションをかけていた場合paramsから省いていたとしても一生登録できません。
自分は原因に気付くまで二日かかりました。まさかvalidationだなんて思わんて、、、。
同じ問題に直面している泣きそうな人たちの救いになればと思い、今回validationに引っかからずに登録する方法を記事にします。

paramsから省く記事はこちらを参考にしました。
https://easyramble.com/user-account-update-without-password-on-devise.html

本題の内容はUser.rbに以下を記述するだけです。

```
  def update_without_current_password(params)
    params.delete(:current_password)

    self.attributes = params
    result = self.save(validate: false) <- 具体的にはここ。
    clean_up_passwords
    result
  end
```

一応説明しておくとここでいうselfっていうのはUserのことです
attributesっていうのはnewとかbuildとかと同じ感じのものらしいです。
なので、self.attributes == User.new と同じことになると思います。
で、saveする時にvalidationを効かなくすると。
これでOKです。

自分はdeviseのパスワードを省く方法すら知らなかったのでお勉強になりました。
validate: falseに関しては使用できる場面が決まっているので知らなかった人は調べてみるといいと思います。
それでは今日はこの辺で！

皆様よきプログラミングライフを🙏
【Swift】Table View Controller メモ

１. 右上の + ボタン(Library)から、 「Table View Controller」 を選択し、画面を追加する。
最初の画面にする場合、矢印を追加した  「Table View Controller」の左に持ってくる。
<img width="682" alt="スクリーンショット 2020-04-27 20.19.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585418/165e1783-1d48-6e1f-bea7-a808bc33a8f4.png">

２. Identifier を設定

３. TableViewController での処理を書く。
　　クラスを作る。
　　File → New → File → Cocoa Touch Classを選択

４. クラス名を作る。
　　「subclass of」 のところは "UITableViewController" になっているのを確認。

５. ファイルを作ったら、このクラスを 「TableViewController」 に紐付ける。

６. 「story board」 で紐付けたい 「TableViewController」 を選択し、
　 「show the identity inspector」 から先ほど作ったクラス名を指定。
Unity 2019.2 はAndroidでは使い物にならないのでとっとと投げ捨てろ

# tl; dr(最近流行ってない気がするこの言い回し)
Unity 2019.2 で Android の CallStatic やって親クラスの static メソッドを呼ぶと死ぬ → Unity Mobile Notifications 使うとこれが原因で死ぬ → 公式も直すつもりがないので Unity 2019.2 は使ってはいけない


## 発端

- https://forum.unity.com/threads/2019-2-14f1-or-above-androidjavaexception-java-lang-nullpointerexception.791952/

`2019.2.8f1` では問題がない、少なくとも `2019.2.14f1` `2019.2.15f1` で問題が起きる。

### 原因

　子クラスのクラスオブジェクト、あるいはクラスインスタンスオブジェクトで親(基底)クラスの static メソッドを呼ぶと、子クラスにその static メソッドが生えてない場合、親に向かって探しに行かずに死ぬようになった。

### そもそもおすすめの解法

　static メソッドを呼ぶ場合、それを定義してるクラスを対象に呼ぶべきで、派生クラスから呼ばないべき。

#### 余談(やっぱり Interface 大事)

　特に派生クラスを返しうる実装においては、基底クラスを返すのではなく、それに必要な interface を定義して、それを返す方が設計として正しいのではないかと思う。

　自分の記憶では interface は static であってもメソッド生やせなかったと思うし……生やせたとしても、その interface クラス名で呼ばないとコンパイルエラーになったと思うし……。

### 一方その頃 Unity Mobile Notifications では

- https://docs.unity3d.com/Packages/com.unity.mobile.notifications@1.0/manual/index.html

　こいつの Android 実装において `UnityNotificationManagerOreo` クラスは `UnityNotificationManagerNougat` クラスを派生して `UnityNotificationManagerNougat` クラスは `UnityNotificationManager` クラスを派生している。

　これは Oreo, Nougat, さらにそれより前の Android において、それぞれローカル通知の実装が異なり、それを吸収するためのクラス構造となっている。OOPだ。

　これは `UnityNotificationManager.getNotificationManagerImpl` を呼ぶと、その Android SDK バージョンにおいて3種類の中から適切なクラスインスタンスを返してくれる作りで利用されている。

### そしてふたりが出会う

　ここで `UnityNotificationManager` に定義されている static メソッドは `UnityNotificationManager` クラスオブジェクトから CallStatic してくれればいいのだけど Unity の実装では `UnityNotificationManager.getNotificationManagerImpl` で返されたクラスインスタンスオブジェクトから CallStatic がされる。よってこれによって子クラスが返されると死ぬ。

## Fixed in 2019.2.22f1(直ったとは言ってない)

　2019.2.22f1 で直る予定らしい

- https://issuetracker.unity3d.com/issues/android-androidjavaclass-fails-to-load-classes-from-aars-with-androidjavaexception

> Fixed in 2019.2.22f1

　とある。それじゃバージョンアップすっかー……

- https://unity3d.com/jp/get-unity/download/archive

> Unity 2019.2.19: 22 Jan, 2020
> Unity 2019.2.20: 4 Feb, 2020
> Unity 2019.2.21: 10 Feb, 2020

　**Unity 2019.2.22 は少なくとも約3ヶ月間リリースされていない。** つまり見捨てる訳ね。

　あるいは `2019.2.8f1` まで戻ればいいんだけど _(何のためのバージョンアップなんだろう……)_

　SpriteAtlas を使っている場合、戻ることもできない地獄が待っている。

## SpriteAtlas は 2019.2.19f1 まで使い物にならない

　SpriteAtlas がリビルドされるたびに .meta の中身が書き換わるのでソース管理すると無駄にバージョンが上がっていく不具合がある。 `2019.2.19f1` で直った。

- https://unity3d.com/jp/unity/whats-new/2019.2.19
- https://issuetracker.unity3d.com/issues/sprite-atlases-are-modified-after-building
- https://forum.unity.com/threads/spriteatlases-keep-changing-their-hash-without-sprites-changing-polluting-source-control.754739/

　つまり **SpriteAtlasを誤魔化し誤魔化し使っていく事でAndroidの不具合を回避する** もしくは **Unity Mobile Notifications を使わない** あるいは **Unity 2019.2 を諦める** から選ぶことになる。

## 個人的におすすめするベストプラクティス

　できる限り Unity Technologies によるネイティブ実装を求めないようにしていく。自前で作るのが多分一番いい。Unity Technologies というのは Unity Ads やら、あるいは儲かってる会社からお金を取るビジネスモデルなので、お金に関わるところの実装であればおそらくテストやサポートが厚そうだという期待は持てるが、通知だとかそのほか変化の激しいモバイル側の実装までは品質を維持する期待が持てないので、そのあたりは全部自己責任でやるのが有事の際に対応しやすいと考えられる。
入れ子Logic Appsのトリガー部分をまとめようとしたけれど


# はじめに
複数あるLogic Appsを一つにまとめる案件にあたり、「 **共通処理** の部分を **複数のトリガー(Logic App呼び出し処理)** から叩かせればいいじゃん！」と思い立った。

そこまではよかったのだが、「せや！ **トリガーもわざわざ分けんで並列処理にしたらもっとまとめられるやん!! 天才か！** 」と思い立ちまとめてみたら、予想通りにはまとまらなかった。

反省も兼ねて本記事にナレッジを残しておくものとする。

# 目次
1. [状況詳細](#detail)
1. [何がしたかったのか？](#trigger)
1. [何がダメだったというのか？](#failure)
1. [解決策（暫定）](#solution)
1. [別案求む](#help)

<a id="#detail"></a>
# 状況詳細
下図のように、複数のLogic Appsがあった。
それぞれのLogic Appsは取り扱うパラメータのみ異なる、共通化可能な処理を有していた。

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/d26697eb-7d23-34f0-3419-68f6508b1636.png)

これを、[Logic Appsを入れ子にする方法](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-http-endpoint)を参考に、下図のように共通部分をまとめるものとした。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/afc5b147-c7f6-3cbb-d4d1-86e76f18fab8.png)

ここまでは文句なく良かった。別の開発現場に入っても応用可能な使える設計パターンだったと自負している。



<a id="#trigger"></a>
# 何がしたかったのか？

問題は、この後、 **トリガー** に当たる部分を共通化した時、一長一短のトレードオフが発生してしまうことだった。

この複数のトリガーは、同一の種類のトリガー(例えば[スケジューラ](https://docs.microsoft.com/ja-jp/azure/logic-apps/concepts-schedule-automated-recurring-tasks-workflows)など)を利用していた。
よって、下図のようにトリガー部分も共通化してしまい、Logic Appsの呼び出し部分を並列処理にしようと考えた。

![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/e1de214e-5cfd-0326-5ea2-92a4679f782b.png)


<a id="#failure"></a>
# 何がダメだったというのか？
一見、下記のようなメリットがあり、良さそうに見える。

- Logic Apps 呼び出し処理ごとにLogic Appsを作成しなくてよくなる
- 一か所に呼び出し処理がまとまるため、パラメータ管理が楽になる


正常に動くパターンのみを考えれば悪くないかもしれないが、 **並列処理のどれか一つが実行に失敗して再実行する場合、単純にデザイナーから実行するともう処理が成功している処理まで実行されてしまうのである！！** 

![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/d5746d05-2773-5a51-82f1-2a78ade4948a.png)

![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/e096243a-64c3-6b24-51da-8f3474881f6a.png)


一定期間に重複して実行しても構わない処理ならばこれでも問題ないが、例えばどのLogic Appsの呼び出し処理も、1日1回だけにしたいなどという要件があった場合、脆くもこの企てはまほろばの夢に朽ちることとなるのである。

<a id="#solution"></a>
# 解決策（暫定）

## 案1：共通処理のLogic Appsを直接叩く
結局のところ、呼び出し側に設定してあるトリガーは、HTTPリクエストトリガーである。
そのため、リクエストツールで直接叩いてしまえば、ピンポイントで再実行できんこともない。

![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/73433768-a214-2774-fc72-278a5a8e3222.png)


## 案2：実行時にトリガーファイルを出力
共通処理で実行時に「実行済み」を示すトリガーファイルを出力しておく。
このトリガーファイルを、共通処理の最初のアクションで確認し、出力されていたら実行を中断する。

![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/70bb5ddf-0dfd-7966-39d3-bd4ea33c3257.png)

![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/f6b07f6b-087b-cf69-da0c-531c20675af4.png)

![スライド9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/757d924b-3be6-af65-b5b5-8c826919d31a.png)



## 案3：あきらめてLogic Apps呼び出し処理を分ける
あくまでデザイナーから手軽にたたきたければ、トリガーまでまとめるのはあきらめて、別個に呼び出し処理を作ってしまえばいい。

![スライド10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/1a22744d-5531-64cb-54eb-c5860d02036d.png)

![スライド11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336360/efa9be5e-b534-3e6e-8a84-704f30b549a3.png)


<a id="#help"></a>
# 別案求む

あくまで、解決策は暫定案である。
さらにベターな解決方法を発見されている先達がいらっしゃれば、コメントなどでご指摘いただけると大変助かります。
【PowerAutomate】承認フローに期限を設ける、ついでにタイムアウト処理も実施する！！

#・はじめに#
Power Automateを利用して承認フローを作成することって多いのではないでしょうか？
しかし、申請者から承認依頼の通知を送っても応答がない、なんてこともあると思います。

承認待ちが長く続くことを避けるために、承認待ちのアクションには期限を設けましょう。

**※本記事は、はてなブログに移行しました。
　記事は最新化して情報も追加しています。よろしければそちらをご覧ください。**

**[【PowerAutomate】承認フローに期限を設けて、タイムアウト処理も実施する！！](https://kurattyodiary.hatenablog.com/entry/flowsetlimited)**
【初心者】GoogleAppsScriptでGoogleスプレッドシートを操作する基本コード ベスト3

GASからGoogleスプレッドシートを操作するときに使う基本的なコード

### 1. シート取得
```javascript

// 操作するスプレッドシート
var sheet = SpreadsheetApp.getActive().getSheetByName('シート名');
```


### 2. セルのデータ取得
```javascript

// 単一セルの値を取得
var cellData = sheet.getRange(row, column).getValue();
// たとえば、C2セルの値を取得したい場合は以下の通り
// sheet.getRange(2, 3).getValue();


// 複数セルの値を取得
var cellData = sheet.getRange(row, column, numRows, numColumns).getValues();
// たとえば、
// var row = 1; // 開始行
// var column = 1; // 開始列
// var lastRow = sheet.getDataRange().getLastRow(); // 最終行
// var lastCol = sheet.getDataRange().getLastColumn(); // 最終列
// var numRows = lastRow - row + 1; // データ範囲の行数
// var numColumns = lastCol -column + 1; // データ範囲の列数
// var cellData = sheet.getRange(row, column, numRows, numColumns).getValues();
```


### 3. セルにデータ入力
```javascript
// 単一セルに値を入力
sheet.getRange(2, 3).setValue('セットする値');
// セル名を指定してもOK
// sheet.getRange('C2').setValue('セットする値');

// 複数セルに値を入力
sheet.getRange('C2:D3').setValues(values);
// var values = [
//    [ 'test1', 'test2' ],
//    [ 'data1', 'data2' ]
// ];
// sheet.getRange('C2:D3').setValues(values);
```



### 参考
[GASのgetRangeメソッドで、セル範囲(単一・複数セル)を指定する方法](https://tanuhack.com/gas-getrange/)
[【GoogleAppsScript】スプレッドシート操作(セルへのデータ書き込み偏)](https://qiita.com/chihiro/items/20a54865c15966e807ee)
basic HTML5/git

https://softwareengineering.stackexchange.com/questions/129141/is-css-a-programming-language

#Are HTML and CSS a programming language?
Nope
HTMLは　Hyper Text Markup Language の略語で、マックアップ
→何かマックするテンプレートのものです。内部(技術)的には確かにプログラミングで組み立てているが
実際プログラマがHTMLを書いたら単純解釈になるので、プログラミング言語ではありません。
HTML is a markup language and CSS is a style sheet language. HTML is designed to store content hierarchically and CSS is designed to customize how the content is displayed.
→CSSも同様

#git
・Repository 
git上で見える(管理できる) ファイルが入っているフォルダ
→それでgit Desktopでcreate new repositoryをすれば空のフォルダが出来上がる
・Commit
更新事項を履歴として記録する
・Branch
枝。Defaultのものの丸コピーしたその自体
それで、基本枝は触らなくてコピペーした新しい枝Branchで作業することが可能
終わったらそれをDefault つまり、master branchにmerge統合することが可能


※git Desktopインストール時にエラーが出て確認したら
ffmpegというencoder/decoderが必要らしい。
https://fukatsu.tech/windows-ffmpeg これ参照してダウンロードしたけど、
あららら　twitchでも使われるプログラム？音楽の？？？ほう
WordPressにログインできない。リダイレクト(自動更新) になる。my.cnf？どこだよ／(^o^)＼-初心者向け-

#筆者の環境
OS:MAC　10.15.4
ローカル環境:MAMP 5.7
ワードプレス 

#起きた問題
・localhostは繋がる
・WordPressで作ったサイトも表示される
・管理画面に行けない
・ログイン画面でユーザー名、パスワードの間違いらしきエラーも出ない
・リダイレクトしかされない

#出てきたエラー
mysql
1881 - Operation not allowed when innodb_forced_recovery > 0.
WordPress
何も出ない

#解決した方法

1.
MAMPを起動していたら、
起動終了します。
アプリを閉じてください。

2.
アプリケーション内にあるMAMPフォルダの中で
my.cnf
を検索

3.
my.cnfファイルをVScode(ソースコードエディタなら、なんでもOK)で開く
ドラック＆ドロップで開きます。

4.
innodb_force_recovery = 1
を
innodb_force_recovery = 0
に上書きする。

<img width="455" alt="スクリーンショット 2020-05-11 22.21.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524190/6cfa6222-24a7-5c36-b75f-5b31773ff4d3.png">
↓こっちに変更
<img width="467" alt="スクリーンショット 2020-05-11 22.21.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524190/b0952e64-4c30-8b4b-b1d0-c70eec45cafd.png">


5.
MAMPを起動します。
StartServersをクリックして、ApacheServer,MySqlServerを起動します。
自動で下記が立ち上がります。
http://localhost:8888/MAMP/?language=English

6.
中段くらいにある
phpMyAdmin
をクリックしてデータベースを開く

7.
7-1.データベース、wordpressを選択(デフォルトを変更してなければwordpressて名前になってます)
7-2.テーブル、wp_usersを選択(これも変更してなければwp_usersです。変更していたらwpの部分を自身で設定します)
7-3.「構造」タブが選択されていると思います。「表示」タブを選択
7-4.管理ユーザーを編集(恐らく先頭のID 1のユーザー)
7-5.カラムuser_passの関数を「MD5」。値を消して任意のパスワードを設定。右下の実行をクリック
<img width="986" alt="スクリーンショット 2020-05-11 22.45.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524190/9b7a4be3-ec70-3943-ad06-f73c2976c24b.png">


ログインできる！！
7のパートはyoutubeにありました。
https://www.youtube.com/watch?time_continue=9&v=_1Rtvvjlelc&feature=emb_logo


6時間かかった。
【Python】経過時間を時分秒(00:00:00)で表示する

Pythonのプログラムにおいて、timeモジュールを利用した経過時間の測定の方法の記事は既にたくさんあり非常に勉強になったのですが、
 「03:14:15」のように時：分：秒で表示する方法が出てこなかったため書き残しておきます。

といっても、timeモジュールを利用して秒で経過時間を計算し、それを泥臭く変換しているだけです。

```Python
import time

# get time when the program stated
start_time = time.time()
    
"""
Your program here
""" 
    
# calculate elapsed time
elapsed_time = int(time.time() - start_time)
    
# convert second to hour, minute and seconds
elapsed_hour = elapsed_time // 3600
elapsed_minute = (elapsed_time % 3600) // 60
elapsed_second = (elapsed_time % 3600 % 60)
    
# print as 00:00:00
print(str(elapsed_hour).zfill(2) + ":" + str(elapsed_minute).zfill(2) + ":" + str(elapsed_second).zfill(2))
```

####■経過時間の測定
`time.time()` で現在時刻を取得します。
これをプログラムの開始前と終了後に行い、差分を計算します。
ミリ秒などの細かい数字は不要なのでint型に変換しています。

####■秒→時分秒 の変換
秒を3600で割った商を時、
その余りを60で割った商を分、
その余りを秒、
としています。

####■00:00:00で表示する
`.zfill()` を使って、それぞれの数字が1桁だった場合、頭に0をつけるようにしています。
`.zfill()` はstr型に使えるようです。
今回の場合、2桁としたいので `.zfill(2)` としています。

#####※参考記事
[Python Tips：Python でゼロパディングしたい](https://www.lifewithpython.com/2015/10/python-zero-padding.html)
【Safari】width 未指定の inline-block 要素に2回もハマったときの備忘録

## おことわり
 「width 未指定の inline-block 要素に」というタイトルにしたものの、BootstrapVue を使ったプロダクトでハマったので、フレームワーク固有の問題かもしれないし、そうじゃないかもしれない備忘録。

## ❶ 意図せず改行されてハマる
### 問題点
Safari (iOS/macOS) において、`width` を指定してない `inline-block` 要素で、テキストが意図せず改行されてしまう。
Chrome (Android/macOS) では問題なく表示される。

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240213/207db893-dfa0-3d60-98d9-2749dc07995b.png)

### 解決策
シンプルに改行を抑制すれば解決した。

```diff
  .btn {
    display: inline-block;
+   white-space: wrap;
  }
```

## ❷ text-overflow: ellipsis でハマる
### 問題点
Safari (iOS/macOS) において、`width` を指定してない、かつ、`text-overflow: ellipsis` たちを指定した `inline-block` 要素で、テキストが意図せず truncate されてしまう。
やはり、Chrome (Android/macOS) では問題なく表示される。

`width` 未指定で `text-overflow: ellipsis` したいことなんてある？ と思っていたけど、`max-width` だけ指定しておいて `width` は指定したくない感じになった。

![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240213/bad270b0-e5f7-3b3b-dd4b-1738e1ea1059.png)

### 解決策
疑似要素を使って無理やり大きくする。

```diff
  .badge {
    display: inline-block;
    max-width: 50%;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  
+ .badge:before, .badge:after {
+   content: '';
+   display: inline-block;
+   width: 0;
+ }
```

`width: 0;` とはいえ、ちょびっと左右に空白が入ってしまうので、気になる場合は `padding` を調整するとよさそう。

「もっと良い解決策を知ってるよ」という方がいれば、ぜひコメントにて教えてください。

## 参考記事
- [Text overflow hides text when it shouldn't in Safari (Stack Overflow)](https://stackoverflow.com/questions/35012943/text-overflow-hides-text-when-it-shouldnt-in-safari/38744914#38744914)
devise-token-authでaccess-tokenをresponseで取得できない

###今回発生した問題 
ページ内で`request.headers`にアクセスしても認証に必要な`access-token`や`client`が見当たらない。(apiをpostmanで叩いたら見れるのに...)



以下は**postman**に表示されたレスポンスヘッダ
<img width="1026" alt="スクリーンショット 2020-05-11 21.42.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619510/058d9a96-2627-2e16-3d4b-d8c649feab66.png">



###原因
APIとクライアントが異なるドメイン上にある場合に、RailsAPIに`cross origin request`を許可する必要があり、`expose`に関する記述が抜けていた。


###参考にしたサイト
[devise-token-authの公式ドキュメント(英語)](https://devise-token-auth.gitbook.io/devise-token-auth/)
内容は同じですが、これを翻訳してくれているサイト
[devise-token-authの公式ドキュメント(和訳)](https://sainu.hatenablog.jp/entry/2018/08/11/194319)

###修正したところ
ファイルの場所はプロジェクトによるが、`CORS`について書かれているconfigファイルを書き換えた。今回は以下のファイルを修正する。

```ruby:/back/config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:8080'

    resource '*',
      headers: :any,
      expose: ['access-token', 'uid', 'client'], #この行を新たに追加
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end
```

###最後に
この問題を解決するに当たり、様々な記事を行き来したが、最終的には公式ドキュメントであっさり解決してしまった。
生年月日の入力フォームを整えたい！


画像のようなフォームを表示したい場合の
コードと、その解説です。

![d06c1c4afde5e66f56ffe129f6251696.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635167/74446dde-8c61-2f9b-291c-30f5fda475dc.png)


```haml:new.html.haml
.sign-up-content__main__form__group
= f.label :birthday,"生年月日"
%span.sign-up-content__main__form__group__require 必須
%br/           
= raw sprintf(f.date_select(:birthday, autofocus: true, prompt:"--",use_month_numbers: true, start_year:Time.now.year,end_year:(1900),date_separator:'%s'), '年 ', '月 ') + '日' 
= icon 'fas', 'chevron-down',class:"sign-up-content__main__form__group__icon1"
= icon 'fas', 'chevron-down',class:"sign-up-content__main__form__group__icon2"
= icon 'fas', 'chevron-down',class:"sign-up-content__main__form__group__icon3"
```
緑とclass""で囲んでいるのが「クラス名」になります。


日付データのため、このフォームを選択

```:haml
= f.date_select
```

データを入れたいカラム名

```:haml  
:birthday
```

ページ表示した際に、カーソルが自動的にフォームへとフォーカスされます。

```:haml  
autofocus: true
```

フォームの最初の表示を--にしてくれます。

```:haml  
prompt:"--"
```

月を数字で表示してくれます。

```:haml  
use_month_numbers: true
```

選択する年の始めと最後を指定出来ます。

```:haml  
start_year:Time.now.year
end_year:(1900)
```

フォームの横に「年」や「月」を表示してくれます。
()を整理するのが一番大変でした。。。

```:haml  
date_separator:'%s'), '年 ', '月 ') + '日' 
```

また、デザイン面では
▼と「--」の位置調整に苦労しました。

```scss:scss

&__icon1{
          position: absolute;
          top: 40px;
          left: 237px;
          color: #888888;
          }

```

アイコンの表示はhtmlでできましたので
cssでは、absoluteで位置を固定して強制的に
動かしました。
chart-js-railsでグラフを表示させたかったが上手くいかなった件（結論タイポ）

rails6で、gemの`chart-js-rails`を使用してグラフを作成しようとしたが上手くいかなかった。
原因が単なるタイポなのか、それともパスの関係などで上手く呼び出せていないのか判断できなかったので、`application.js`や`chart.js`が何なのか調べてみた。

##application.jsは何をしているのか
　マニフェストファイルというもので、ビューの`erb`ファイルが`application.js`だけを読み込めば済むように、読み込みたいjsファイルを`require`している。
　このファイルに読み込みたいjsファイルを`require`する。

##chart.js関係

　今回はちゃんと`chart.js`を読み込んでいる。

```ruby:application.js

require("chart.js")
```

　しかし、ビューには反映されていない。
　ここで二つの、そもそも疑問が出てきた。

①`applicatin.js`と同じ階層に`chart.js`が**ない**が、ちゃんと反映されているのか。よく見ると、他のrequireしているものも、同じ階層にない。どこのディレクトリを読み込んでいるのか。

→この呼び出しは、`node_module`ディレクトリ内にある、該当のディレクトリを呼び出している。
`node_module/chart.js`ディレクトリはあるので、問題ない。
そのほかに呼び出しているものも同様。
ただし、他のものは`.start()`を付けているが、理由は分からない。

②`chart.js`とは何か。`chart-js-rails`があればいいのではないか。

`chart.js`は、グラフを簡単に書くことができるjavascriptのライブラリ。
`chart-js-rails`は、`chart.js`をrailsのアセットパイプラインに統合するもの。
そのため、`chart-js-rails`は、`chart.js`があること前提となっている（ということ？）。

##グラフが表示されない原因
`rails s`のログを見ると、コンパイルは上手くいっているので呼び出しは問題ない。

では`chart.js`を呼び出せているのに、グラフが表示されないのはなぜ？
推測①　ビューの記載が間違っている。
試しにネットで上手くいっているソースをコピペしてみる。
→成功。
単に途中の`:`のうち忘れ。
エラーが表示されないとは……。

##蛇足
解決したが、一点気になることが。
gemの`chart-js-rails`が全然出てこないが、`chart.js`を`yarn add chart.js`でインストールしていれば、gemは必要ないのか？
新たに`rails new`して試してみた。
……普通にグラフが表示された。
gemがどのような動作をしているか分からないが、グラフが表示できるなら今回は`chart-js-rails`は使わない方向で。


##参考
Railsのマニフェストファイルを使ったJsとStylesheetの呼び出し
https://qiita.com/samurai_runner/items/da22eddb64e867b4e145

Ruby on Rails で sprockets から Webpacker へ移行し、移行できないものは共存させる方法
https://qiita.com/tatsurou313/items/645cbf0a3af4c673b5df#%E8%87%AA%E8%BA%AB%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99-1

chart-js-railsのGithub
https://github.com/coderbydesign/chart-js-rails
WordPressをローカル環境で構築した後の自分的メモ

# 前提
初投稿です。
この記事では以下の環境でWordPressをローカルで構築しました。

- Ubuntu 18.04
- Docker
  - image: wordpress, mysql 5.7

WordPressは`wordpress/`にインストール

# トラブルシューティング
## プラグインがインストールできない
### エラー文
```
要求されたアクションを実行するには、WordPress が Web サーバーにアクセスする必要があります。
```

### 解決策
`$ chown -R apache:apache wordpress/`

#### または

wp-config.phpに以下の記述を追加
`define('FS_METHOD','direct');`


## パーマリンクを設定できない

調べると`.htaccess`が不足していることが判明
新しく作成し、下記のコードを記述。

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress
```
**設定してもエラー文が**
`.htaccessファイルを更新してください`

→パーミッションの問題
下記でパーミッションを変更


## 記事のプレビュー・投稿ができない
### エラー文
```
返答が正しい JSON レスポンスではありません
```

### 原因
パーミッションエラー
下記のコマンドでパーミッションを変更
`$ chmod 775 -R wordpress/`

→なぜか解決せず

とりあえず下記で「読み込み・書き込み・実行」をすべて許可
`$ chmod 777 -R wordpress/`

グループの設定がうまくいってないっぽい？
パーミッションを777にしておくのは不安なので後で対処する

**以上！**

# 参考
https://www.sandalot.com/wordpress%E6%9B%B4%E6%96%B0%E3%81%A7ftp%E5%85%A5%E5%8A%9B%E7%94%BB%E9%9D%A2%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/

https://fox-wp.com/how-to-find-wordpress-htaccess-file/
Mac MySQL8.0 ERROR! MySQL server PID file could not be found!

[Mac MySQL 8.0 再インストールする](https://qiita.com/ucan-lab/items/d02ec1de31613b2add0e) からエラー部分だけ切り出してエラーの対策方法をご紹介します。

## 環境

- macOS Catalina 10.15.4
- Homebrew 2.2.14
- MySQL 8.0.19

## エラー

```shell-session
$ mysql.server start
 ERROR! MySQL server PID file could not be found!
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/[PC名].local.pid).
```

## エラー内容の確認

MySQLの起動に失敗した場合は下記のエラーログファイルを確認します。

```shell-session
$ less /usr/local/var/mysql/$(uname -n).err

2020-05-02T11:56:47.171263Z 0 [ERROR] [MY-010262] [Server] Can't start server: Bind on TCP/IP port: Address already in use
2020-05-02T11:56:47.171446Z 0 [ERROR] [MY-010257] [Server] Do you already have another mysqld server running on port: 3306 ?
2020-05-02T11:56:47.171788Z 0 [ERROR] [MY-010119] [Server] Aborting
```

このエラーはすでに 3306 ポートが使われているというエラーです。

```shell-session
$ lsof -i:3306
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mysqld  36074 ucan   27u  IPv4 0xbab6ad8ffa0d4ac3      0t0  TCP localhost:mysql (LISTEN)
```

MySQLのプロセスが残っていることを確認しました。
kill コマンドでプロセスを削除します。

```shell-session
$ kill `lsof -ti:3306`
```

MySQLが起動できればokです。

```shell-session
$ mysql.server start
Starting MySQL
. SUCCESS!
```
[メモ]Docker for mac 高速に by docker-sync

Railsの開発環境をdocker-composeで動かしていたが、めちゃくちゃ遅いなと思いながら２ヶ月そのまま過ごしていた僕に、光が差し込んだ。

https://qiita.com/pocari/items/0340049742927f3a94b7

## docker-syncをつかう。

準備

```ruby
gem install docker-sync
brew install fswatch
brew install unison
```
インストールしたらdocker-syncの設定

```docker-sync.yml
version: '2'

syncs:
  sync-volume:
    src: '.'
```

```docker-compose.yml
version: '3'

services:
  app:
    build: .
    tty: true
    stdin_open: true
    volumes:
      - sync-volume:/sample-app:cached # キャッシュオプションもつけとくと早くなる
      - bundle:/bundle
    environment:
      TZ: 'Asia/Tokyo'

volumes:
  sync-volume:
    external: true
```
いざ、立ち上げ。

```ruby
docker-sync start  # 先にrsyncをスタート
docker-compose up -d
```

## rsync取り入れ前後でのファイル生成速度の比較

100MBのテストデータを作成。

```
% docker-compose exec app bash

# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB) copied, 62.1419 s, 1.7 MB/s

real    1m2.107s  ６２秒(病)も時間かかってる。
user    0m0.425s
sys     0m5.966s
```

syncを起動させた後

```
% docker-compose exec app bash

# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB) copied, 2.50668 s, 41.8 MB/s

real    0m2.613s　２秒に短縮
user    0m0.114s
sys     0m1.164s
```

しぬほど早い。。
ページ遷移もフォーム送信もめちゃくちゃ早くなってました。
whereメソッドで生SQLを書く時の注意

文字列で生SQLを用意してwhereメソッドに渡す際
""を渡すと、少々極端な例だが下記のようになる。

```ruby
sql = "id = 1"
User.where(sql)
# 発行されるSQL
# SELECT  `users`.* FROM `users` WHERE (id = 1)

sql = ""
User.where(sql)
# 発行されるSQL
# SELECT  `users`.* FROM `users`
```

エラーが出ず、不要なデータを取得するため注意。
USB直結のESP-32 Gatewayを作ったよ

ESP-32を使ったWiFi-BLEゲートウェイを企画していました。
今回ハードウェアが完成しました。

モノとしては非常に簡単なものです。
ESP-32にFTDIのUSBシリアル、SI7020の温湿度センサーが付いています。
特徴は、USBコネクタがついている事です。
（MicroBがついているのは、Aをさせない場合に対応する為）
USBのACアダプターに指す事で、Ambientなどへ温湿度センサーのデータを送る事も可能です。
もちろん、BLEゲートウェイのファームウェアを入れることで、ゲートウェイとして使用することも可能です。

拡張用にGPIO、UART,SPIがあります。

では見ていきましょう
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/46746ff8-ca67-a71c-7353-48fea7bf2448.png" alt="サンプル" width="400" ><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/52ce30fa-b856-607c-9000-de2b05a4bb7a.jpeg" alt="サンプル" width="300" >
![ESP-32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ce3c793e-78ec-ca13-b568-d4f44dfea743.jpeg)
3Dプリンターでケースも作りました。
![DSC_0436 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4a463398-85f3-eb84-cb84-b315373e5843.jpeg)
完成状態です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/76c20e4e-0156-7c6a-3003-b18723540221.jpeg" alt="サンプル" width="300" >

Ambientへデータを送っている状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f3548eca-0081-99d9-63c3-e2fa91566ead.png)

Ambientのプログラムと資料一式です。
https://github.com/taisirou/ESP-32-Gateway-Si7020
プログラムはAmbientのサンプルプログラムを基にSi7020用に変更しています。
SSHでログインされたらSlackに投げる

# 準備
「[ゼロからSlack POST API](https://qiita.com/cabbage_lettuce/items/5841c02ec7cad8fa6a8f)」の[Webhook登録](https://qiita.com/cabbage_lettuce/items/5841c02ec7cad8fa6a8f#webhook%E7%99%BB%E9%8C%B2)までやります。（雑ですいません）

# sshrcを編集
`/etc/ssh/sshrc`を以下のように編集します。
APIのURLは適宜変えてください

```bash
SOURCE_IP=${SSH_CLIENT%% *}
TRUST_IP_LIST="127.0.0.1 0.0.0.0"

for HOST in $TRUST_IP_LIST; do
  if [ $HOST = $SOURCE_IP ]; then
    exit 0
  fi
done

TEXT="[SSH LoginAlert] \\\"$USER\\\" has logged in from $SOURCE_IP at `date +"%Y/%m/%d %H:%M:%S"`."
curl -X POST -H "Content-type: application/json" --data '{"text":"'"$TEXT"'"}' \
  "https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX" \
  -kLso /dev/null
```

# 除外リスト
自宅のIPなどを信用し通知を出さない場合、上記の`TRUST_IP_LIST="127.0.0.1 0.0.0.0"`の末尾に空白区切りでIPを追加します。
（自宅のグローバルIPは[ここ](https://www.cman.jp/network/support/go_access.cgi)から確認できます。）
GASで法人番号APIを扱う方法

国税庁の法人番号システム Web-APIをGASで実装したのでメモ。
事前にアプリケーションIDの申請が必要なので、使いたい人は下記から調べて申請ください。

[法人番号システム Web-API](https://www.houjin-bangou.nta.go.jp/webapi/#web-api)


基本的な使い方は[ここ](https://www.houjin-bangou.nta.go.jp/documents/k-web-api-kinou-gaiyo.pdf)に記載があるのですが、
法人名から法人版棒を取得するときは法人名をUTF-8にエンコードしないといけないので注意。

エンコードするのに[encodeURIメソッド](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURI)を使っていきます。
ただし、これだとローマ字はエンコードできないので注意。


<img width="600" alt="2020-05-11_21h38_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/5bf1a2b7-15a8-1f40-09e5-771d1d3921ed.png">


```javascript
function getCorporatenumber() {

  let crop = 'グーグル(合)(テスト用)';

  // 余計な文字列の排除
  crop = dataCleansing_(crop);

  // 企業名から法人番号取得
  const corporatenumber = getCorporatenumber_(crop);
  console.log(corporatenumber); // [ 'グーグル・クラウド・ジャパン合同会社', '6010003022051', '東京都' ]
}

/**
* エンコードできない文字や余計な文字を削除する
*
* @param {string} 法人名
* @return {string} 法人名を正規表現でキレイにしたデータ
*/
function dataCleansing_(crop) {

  const replaceStr = ['株式会社', '(株)', '（株）', '有限会社', '(有)', '（有）', '合同会社', '(合)', '（合）', '㈱'];

  //正規表現の作成
  let replaceRegExp1 = '';
  for(var i=0; i<replaceStr.length; i++){
    replaceRegExp1 += `(${replaceStr[i]})`;
    if(i !== replaceStr.length - 1) replaceRegExp1 += '|';
  }

  // 空白、改行削除 + 「(」、「（」以降削除
  let replaceRegExp2 = '(\\s+)|(\\n)|(\\(.*)|(（.*)';

  replaceRegExp1 = new RegExp(replaceRegExp1,'g');
  replaceRegExp2 = new RegExp(replaceRegExp2,'g');

  return crop.replace(replaceRegExp1, "").replace(replaceRegExp2, "");
}

/**
* APIで法人番号を取得
*
* @param {string} 企業名の二次元配列
* @return {Object[]} 法人名、法人番号、都道府県の配列
*/
function getCorporatenumber_(crop) {

  const appId = 'アプリケーションID';

  const utf = convToUtf8_(crop);
  const url = `https://api.houjin-bangou.nta.go.jp/4/name?id=${appId}&name=${utf}&type=12`;

  const result = UrlFetchApp.fetch(url).getContentText("UTF-8");

  // 戻ってきた結果が0でなかったら実行
  if(!result.match('<count>0')) {
    const name = result.match(/(?<=<name>)(.{1,30})(?=<\/name>)/g)[0];
    const corporatenumber = result.match(/(?<=<corporateNumber>)(.{1,30})(?=<\/corporateNumber>)/g)[0];
    const prefecture = result.match(/(?<=<prefectureName>)(.{1,30})(?=<\/prefectureName>)/g)[0];
    return [name, corporatenumber, prefecture];
  }
}

/**
* 法人名をUTF-8へ変換
*
* @param {string} 法人名
* @return {string} UTF-8に変換した法人名
*/
function convToUtf8_(str) {
  let utf = '';

  for (const char of str) {
    utf += encodeURI(char);
  }

  return utf;
}

```
IaC関連ツールまとめ

# 背景
広い意味でのIaC(Infrastructure as Code)って本当に色々ある。

Ansible/Terraform/Cloudformation/Helm/Kubernetesなど、
横並びにするにはレベル感もごちゃごちゃだし、どういう使い分けするの？

というふとした疑問からIaC関連ツールの全体像と関係性まとめてみた。

# 3つのレイヤに分けてみる
コンテナの隆盛がIaCの定義を広げたのと、CI/CDも、Jenkins2.0からJenkinsfileが出来てIaCの仲間入りした感がある。

1. IaaSレイヤ（狭義のIaC)
1. コンテナレイヤ
1. CI/CDレイヤ


# 1つ目のレイヤ： IaaSレイヤ（狭義のIaC)

## 歴史と概要
ChefとPuppetの2つを覚えておけばOK。と思っていたら、時代が随分と進んできて、Ansibleではエージェントレスになったり、随分と便利になったなと。

Puppet(2005) -> Chef(2009) -> Ansible(2012) -> Terraform(2014)
https://employment.en-japan.com/engineerhub/entry/2019/04/12/103000


## 代表例１：Ansible
エージェントレスのIaCツール

### [漫画でわかるRed Hat Ansible Automation](https://www.devsamurai.com/ja/manga-red-hat-ansible-automation/)

## 代表例２：Terraform

### [10分で理解するTerraform](https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73)

> インフラストラクチャ定義ツール に分類されるツールで、クラウド上のリソースを定義ファイルの状態になるように生成・操作してくれます

### [Infrastructure as Codeに疲れたので、僕たちが本来やりたかったことを整理する](https://jawsdays2019.jaws-ug.jp/session/1119/)

Terraform Registry
> 誰かが作ったmoduleを再利用できる

## 代表例３：AWSやOpenStack用のツール
個別ツール専用のIaCもかなり流行ってきている。
* CloudFormation：AWSの構築自動化
* OpensStack Heat: OpenStackの構築自動化


# 2つ目のレイヤ: コンテナレイヤ

このレイヤは更に3層に分けます。やっぱりオーケストレーションのオーケストレーションが出て来たのがポイントかなと。

## 2-1 コンテナ/仮想
* Docker
* VMWare

## 2-2 コンテナオーケストレーション(仮想含む)
* Docker Compose
* Kubernetes(EKS/IKS/GKE)
* ECS
* Vagrant

## 2-3 コンテナオーケストレーションのオーケストレーション

* Helm

## Helm
Kubernetes上のアプリケーションを一括管理する仕組み。yumやaptなどのパッケージ管理ツールのようなもの

## [helmを使ってKubernetesを楽にする](https://qiita.com/Hiroyuki_OSAKI/items/8965ceb6c90bae3bea76)

> KubernetesでつらいYAML地獄を脱却するYAML生成ツール

# 3つ目のレイヤ: CI/CDレイヤ
Jenkinsを覚えておけばOKという時代は終わったなと。まずはビルドフローをYAMLで書くっていうイメージを持っておく感じ。

## Kubernetes系

Kubernetes前提のCI/CDフレームワーク


### 代表例1：Tekton

https://news.mynavi.jp/techplus/article/techp5218/


> 「Tekton」は、KubernetesネイティブなCI/CDツールです。KubernetesのCRD（Custom Resource Definitions）やControllerとして動作し、Kuberentes環境にデプロイするアプリケーションとの相性が良いのが特徴です。元々サーバレスツールである「Knative」のbuild-pipelineとして開発されていましたが、その後Cloud Delivery Foundation(CDF)のツールの一つとなっています。

### 代表例2：ArgoCD

https://atmarkit.itmedia.co.jp/ait/articles/2107/30/news018.html

> 「Kubernetes Native」なGitOpsベースのCDツール
> 1. Kubernetesに気軽にインストールして使える
> 2. Gitリポジトリをサポート
> 3. WebのUIとコマンドライン（CLI）を提供
> 4. YAMLでデプロイを記述でき、Gitリポジトリで管理できる
> 5. KustomizeやHelmと連携可能
> 6. 変更検出によるデプロイではなく差分検出によるデプロイ

### 代表例3：JenkinsX

https://jenkins-x.io


## Not Kubernetes?系
### Spinnaker

マルチクラウドCDツール
 * [「継続的デリバリ」（CD）を実現できるコンテナクラスタ管理ツール「Spinnaker」](https://knowledge.sakura.ad.jp/14382/)
 * [Immutable Infrastructureを強制する](https://tech.mercari.com/entry/2017/08/21/092743)


## ビルドパイプライン
### StepFunctions

# その他

* SCCM
  * クライアント系ツールの配布

# まとめ（ここまで書いておきながら逆のことを言う、、、）

というか、所感だけど、この手のツールってレイヤ分けしたとしても、相互のレイヤに機能追加で染み出してきている。
レイヤ分けはあくまで源流や得意レイヤがどこかという程度にすぎない。

なので、どれ使えばいいの？っていうのは個別具体の事例を参考に、自分に合っていると思うものを選ぶべきかなと。
あとは、自分が使ってみたい！って思えるツールと心中するのがいいかな。
ツールがいけてなくても、ツールへの愛情があれば努力と根性で何とかなる（はず）。
【おっちゃんがエンジニアになるまで】@5,6ヶ月目(完)

#はじめに
**こんにちは！ばーんです。**

30歳、独学、業界未経験、既婚者、働きながら
のおっちゃんが具体的にどうやってエンジニアになれるのか？
を（ほぼ）リアルタイムで振り返り共有させてもらいます。

自身の思考整理がメインですが、これから目指す方の指標に少しでもなれれば幸いです。

4ヶ月目(前月)は[こちら](https://qiita.com/baan_nasebanaru/items/06449b001eec53fb9566)
最初から見て頂ける方は[こちら](https://qiita.com/baan_nasebanaru/items/5ad5c49782c0f23a508b)


##数字振り返り

1ヶ月目　Total  76h(1日平均2.5h)
2ヶ月目　Total  91h(1日平均3.0h)
3ヶ月目　Total 102h(1日平均3.3h)
4ヶ月目　Total  83h(1日平均2.7h)
**5ヶ月目　Total  98h(1日平均3.2h)
6ヶ月目　Total 110h(1日平均3.6h)**

- 5ヶ月目
Day 121-130　33h
Day 131-140　37h
Day 141-150　28h

- 6ヶ月目
Day 151-160　30h
Day 161-170　37h
Day 171-180　43h

##学習内容

###Day 121-130: Git,ITパスポート,開業届提出,AtCoder

- 1番の収穫と感じたのはメンターからのコードレビュー＆GitFlowでの運用
 - Gitの使い方はこう言った場面やチーム開発をしないと経験しにくいのでとても貴重な体験でした！あとは検索しても出てこない指摘が多くコードレビューも大変参考になりました(別記事にまとめる予定)
- ITパスポートは試験申し込みをしていたのが良かったです。忙しいで先延ばしにできないので、強制的に学べました
- 開業届はこの時はメンターからの勧めで出しました。効果は現在になって実感しています
 - 税制面でというより「開業して案件を受注している」というワードのインパクトがとても大きかったです。自分自身では感じませんが、周りに与える印象は違うなと体感しています。
- アルゴリズム組み立てるのは今でも大好きなのですが、時間が取れなくなったのでこの週あたりでしなくなってしまいました…無念ToT

###Day 131-140: 打ち合わせ,ITパスポート,基本情報

- ここで受託のシステム開発案件のお話を頂きます
 - 現在も継続してる案件ですが、他業種の方との打ち合わせは大変楽しいですね＾＾
- 基本情報も今年の秋に受ける予定だったので開始。ITパスポートと被っており、同時期に始めるのはGoodでした!!

###Day 141-150: 基本情報(動画),CMSコーディング

- 初めて動画学習をしましたが、無茶苦茶分かり易いですね…特に概念の理解に向いていると感じました。
- ここで、2月にもらった初案件の納品が完了＆別でCMSコーディングを開始

###Day 151-160: ITパスポート試験,CS学習開始,システム開発開始!!

- ITパスポート試験は無事合格しました！基本情報の学習してなければ危なかったと思います。
- 基本情報に向けては少し時間が開くので、ゆっくり進めてます(CS=コンピュータサイエンスの略です)
- システム開発。現在も絶賛格闘中ですがw学びが多く楽しくできています＾＾
 - 納期が緩い＆できて使ってみてよければ買い取ってという形です。お互いが顔見知りで信用があるのでさせて頂きました。

###Day 161-170: システム開発(以後継続),CS学習(以後継続)

- **実務とCS学習はとても親和性が高い**
 - 今回1番お伝えしたい内容です。CS学習から入ってもしんどいと思う人が多いと思いますし、ずっと実務で基礎的な内容を学習していないと躓くと思います。
 - この時は、DBの作成やWebの通信の仕組みを学びました(そして、とても理解できた)。

###Day 171-180: 勉強会参加

- システム開発に追われている時、[xhack](https://x-hack.connpass.com/)さん主催のJS勉強会に参加させて頂きました！
 - 基礎を学ぶ為に参加。無茶苦茶参加して良かったです＾＾(正直余裕があればxhackさんのスクールにも行きたかった…)

##学習まとめ

**1. CS学習は実務と絡めてやるととても良い
2. 動画学習は最初に見るととても良い。概念の理解などに向いている
3. Gitはお願いして学んでいった方がいい。とても便利**

##今後のお話

皆さんご存知の通り現在はコロナの影響が色濃く出ています。
1. その為転職にリソースを裂くより学習などに時間をあてようと考えた
2. 安定して仕事のお話を頂けるようになり副業としては確立しつつある
といった理由から今回でこのシリーズを締めようと考えました。

今後は案件をこなしつつ秋の基本情報やLPICといったCS学習を進めるつもりです。
転職についてはコロナの様子を伺いながら考えたいと思います。

##さいごに(本当に最後＆宣伝あります)

**わくわく会という初学者応援のコミュニティがメンバーを募集しています(勿論無償です)**

僕自身も入っておりお世話になっているコミュニティです。興味ある方はご連絡下さい＾＾



今回も最後まで見ていただきありがとうございましたm_ _m
僕自身は今後もQiita記事更新続けますし、Twitterにも居座り続けるのでどんどん絡んであげて下さい＾＾

ばーん。
k8sのcronjobなどのyamlでexpected alphabetic or numeric character, but found ' 'が発生する時

結論から言うと、cronの指定はダブルクォートで囲んで、文字列だと明記しましょう。

NG

```yaml
spec:
  schedule: */5 * * * *
```

OK

```yaml
spec:
  schedule: "*/5 * * * *"
```

ただ、これはOKなので紛らわしい

```yaml
spec:
  schedule: 0 * * * *
```

## 何が起きているか

*から始まる値は[エイリアス](https://circleci.com/docs/ja/2.0/writing-yaml/#%E3%82%A2%E3%83%B3%E3%82%AB%E3%83%BC%E3%81%A8%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)とみなされるので、 

```
* * * * *
```
は

```
" * * * *"
```
という名前のエイリアスだとみなされます。しかしエイリアスは空白文字を許さないので、表題の"expected alphabetic or numeric character, but found ' '"となってしまいます。


## どうして気づかなかったか

yamlを直接書いてればIDEがエラー吐いてくれるので気づくんですが、

```yaml
spec:
  schedule: ${SCHEDULE}
```
という感じでこのcron行は外部から注入できるようにしてデプロイしてたので気づきませんでした。

gitlabでも同様なバグが有ったらしい https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/2284

## エイリアスに使えない文字について

実は実装依存のよう。libyamlでは.や/も使えるようだけど(https://github.com/yaml/libyaml/pull/170/files) pyyamlでは使えない。
Composerをローカルに落とす方法

Composerを使いたいディレクトリに移動して以下を実行します。

```
# binファイルを作成
mkdir bin

# composer-setup.phpをインストール
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

# binディレクトリの中に、composerファイルを作成
php composer-setup.php --install-dir=bin --filename=composer

# composer-setup.phpを消す
php -r "unlink('composer-setup.php');"
```

<!--
# binディレクトリの中に、composer.pharファイルを作成
php composer-setup.php --install-dir=bin
-->





グローバルにcomposerをインストールした場合は、以下のようにコマンドとしてcomposerを使うことはできません。

```
composer self-update
```

composerをインストールしたディレクトリに移動して、以下のようにphp bin/composer <コマンド>という形で実行します。
※composerコマンドをphpを使って実行しています。

```
php bin/composer self-update
```


mac内にいろんなライブラリが入ってしまうのが嫌なので、こういうやり方を使っています。
また、このやり方を使えば、環境構築するときに、移行先でcomposerをインストールしなくて済みます。

インストールコマンドはアップデートとともに変更される可能性もあるので、以下の公式サイトを参照するようにしてください。

##参考
[Introduction - Composer](https://getcomposer.org/doc/00-intro.md)

[各ディレクトリの役割を知ろう（ルートディレクトリ編） (1/2)：Windowsユーザーに教えるLinuxの常識（2） - ＠IT](https://www.atmarkit.co.jp/ait/articles/0108/07/news002.html)
NuxtでgraphQLを用いてgithubからデータを取得してみた

Nuxt（v2.12.2）で作成したプロジェクトでGitHub GraphQL APIを叩いて自分のgithubアカウントが作成したリポジトリの情報を取得してみました。

#できること
- @nuxt/apolloでgraphqlでgithubのアカウント情報を取得



#1.プロジェクトを作成
本件ではNuxt-v2.12.2を使用した。

```terminal:terminal
npx create-nuxt-app プロジェクト名
```
nuxtプロジェクトを作成し初期設定をする。(省略)


#2.モジュールをインストール
- @nuxtjs/apollo

```terminal:terminal
yarn add @nuxtjs/apollo
```
`yarn dev`してみるとエラー。
使用しているnuxtのバージョンによってはcore-jsの対応するバージョンをインストールしないといけないみたい。

- core.js

```terminal
yarn add core-js@2.6.11
```


#3.nuxt.config.jsの設定
ファイル内に以下を追記

```js:nuxt.config.js
modules: ["@nuxtjs/apollo"],
  apollo: {
    clientConfigs: {
      default: "~/plugins/apollo-auth.js"
    }
  }
```

#4.pluginsの設定
アクセストークンの取得の仕方はページ下を参照。

```js:plugins/apollo-auth.js
export default function(context) {
  const accessToken = アクセストークン;

  return {
    httpEndpoint: "https://api.github.com/graphql",
    getAuth: () => `Bearer ${accessToken}`
  };
}
```

#5.queryを作成
apollo/queries/getRepositories.graphqlを作成

```graphql:apollo/queries/getRepositories.graphql
{
  viewer {
    login
    repositories(first: 5) {
      edges {
        node {
          name
          id
        }
      }
    }
  }
}
```

#6.データを取得して出力
```vuejs:pages/index.vue
<template>
  <div>
    <h3>Github repositories</h3>
    <ul>
      <li v-for="edge in viewer.repositories.edges" :key="edge.node.id">
        {{ edge.node.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import getRepositories from "~/apollo/queries/getRepositories.graphql";

export default {
  data() {
    return {
      viewer: []
    };
  },

  apollo: {
    viewer: {
      query: getRepositories
    }
  }
};
</script>
```

#参考
##githubAPIのアクセストークン取得の仕方

https://github.com/settings/tokens
↓
左のリストのPersonal sccess tokens
↓
右上のGenerate new token
↓
キーの名前を入力
↓
repoにチェック
↓
Generate token

アクセストークンは一度しか表示されないのでメモしておく。
params・ストロングパラメータ

#paramsとは



railsのアプリケーション利用者がサーバーに対して送ってきた値を格納する箱です

例えば以下のようなform（form_tagを使用）から送られてきたデータの場合

```new.html.erb
<input type="text" name="content">
```

params[:content]としてコントローラーに送られます。

この時、nameに指定するのはキーの名前です。paramsはハッシュオブジェクトのようなものなので、キー(カラム名）に対して入力された値が格納されています

そして送られたコントローラー先で、テーブルにレコードを追加するcreateメソッドを記述しますが、セキュリティの問題上、ストロングパラメーターという技術を用いてデータの保存を行います


#ストロングパラメーター

```hoge.controller.rb

def create
 Hoge.create(hoge_params)  ←プライベートメソッドの呼び出し
end

private

def　hoge_params
 params.permit(:content) ←特定のキー（カラム）
end
```

ストロングパラメーターを記述したメソッドはプライベート以下に記載し、プライベートメソッドとして扱います。

またその中でpermitメソッド以下に受け取るキーを指定します今回の場合はcontentです

先ほどセキュリティの問題上、このような記述方法を行うと言いましたが、具体的には任意外のデータの登録・更新を防いでくれる働きがあります。

大型サービスなど不特定多数のユーザーが存在する場合以外では特に恩恵を感じることはないそうですが、Railsの慣例としてこのように記述します。
機械学習 サポートベクトルマシン

○この記事の要点
サポートベクトルマシンを学習したのでメモ

サポートベクトルマシン：
・分類問題、回帰問題のどちらでも利用できるアルゴリズム
・ロジスティック回帰を利用するよりも、良い結果が得られる場合がある
・マージン（学習データのうち、最も決定境界に近いものと、決定境界との距離）を大きくすることで、より良い境界を得ようとする手法
・ハードマージンとソフトマージンの手法がある。ハイパーパラメータで設定する
ハードマージン：マージンの内側にデータが入り込むのを許容しない手法。厳密に線を引きすぎるので、過学習につながる可能性がある。
ソフトマージン：マージンの内側にデータが入り込むのを許容する手法。柔軟。
・教師あり学習

#○ソースコード(Python) 二値分類問題への適用
```ruby:サポートベクトルマシン
from sklearn.svm import LinearSVC
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
%matplotlib inline

# データ生成
centers = [(-1, -0.125), (0.5, 0.5)]
X, y = make_blobs(n_samples=50, n_features=2, centers=centers, cluster_std=0.3)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# モデルの作成と学習及び評価
model = LinearSVC() 
model.fit(X_train, y_train) # 学習
y_pred = model.predict(X_test) 
accuracy_score(y_pred, y_test) # 評価

print(y_test) # テストデータの正解ラベル
print(y_pred) # 予測データの正解ラベル
print(accuracy_score(y_pred, y_test)) # 正解率

# テストデータの散布図
fig, ax = plt.subplots()
ax.scatter(X_test[:, [0]], y_test[:], c='blue', label='test data')
ax.legend()
```

結果
[1 0 0 1 0 0 0 1 1 0 0 1 1 1 0]
[1 0 0 1 0 0 0 1 1 0 0 1 1 1 0]
1.0

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628917/2c3dd460-3d9a-b8ae-b2bf-3e51d532b09f.png)

・テストデータと予測データが完全に一致しており、正解率が100%となっている。
・ただし、上記はデータが少ないことから、良いモデルになっているとは言い切れない。あくまでテストコード。
【python3】pandas で平均と共分散行列をjson に保存

### 前書き

いつもエイや！でコードを書いていて平均と共分散を出力するのも何度も行っているのですが、メモしておきます。本当に中身は単純です。ひねりはありません。すみません。

状況：pandas データがあり、特定のデータX,Y,Z についての平均と共分散を求めたい

### 方針

1. x,y,z のみを含むDataFrame を作成する
2. 作成したDataFrame の平均と共分散を求める。
3. json ファイルに出力する。

### 実装

ポイントは、
- DataFrame でデータ名を指定して抽出するには、```.loc```を使います。
- DataFrame には mean() も cov() も corr() もあり、出力はDataFrame だったりするので、values でndarray を参照します。
- 辞書にlist として登録するには、ndarray　のtolist() を利用できます。

```python
from pandas import DataFrame
from numpy import random
import json

df = DataFrame(random.randint(0,100,size=(252, 4)), columns=list('XYZW'))
output_data = dict()

# 1. extract XYZ
df_xyz = df.loc[:,list("XYZ")]

# 2-1 mean vector
u = df_xyz.mean()
output_data["mean"] = u.values.tolist()

# 2-2 covariance
s = df_xyz.cov()
output_data["covariance"] = s.values.tolist()

# 3
with open("out.json", 'w') as f:
    json.dump(output_data, f, indent=2)
```

出力したjson ファイルは

```
{
  "mean": [
    48.34126984126984,
    50.52777777777778,
    51.492063492063494
  ],
  "covariance": [
    [
      877.6360589388478,
      -44.88202744577245,
      -71.94548788971099
    ],
    [
      -44.88202744577245,
      876.4733289065962,
      -32.312527667109336
    ],
    [
      -71.94548788971099,
      -32.312527667109336,
      784.7768291911716
    ]
  ]
}
```

です。

### おわりに

この実装にたどり着くまで、意外と調べました。（汗）
DataFrame のCovariance はAPI document ([ここ](https://pandas.pydata.org/pandas-docs/stable/user_guide/computation.html?highlight=covariance))に書いてあります。

(2020/05/11)

## その後

- NaN (not a number)の処理を書きたいとき、if文をこういう感じにして確認できる。

```python
   from numpy import isnan
   if isnan(x).any():
       x = zeros(3)
   if isnan(S).any():
       S = zeros( (3,3) )
```
Integromat で Choose where to start を再設定する

モジュールを右クリック。

[公式ヘルプ](https://support.integromat.com/hc/en-us/articles/360001986493)にも載っている。

> You can also display the panel at any time by right-clicking on the trigger icon in the Scenario editor.
https://support.integromat.com/hc/en-us/articles/360001986493

![スクリーンショット 2020-05-11 21.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339/54d34ea2-b3aa-d1cc-90c7-529923eb9634.png)
![スクリーンショット 2020-05-11 21.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339/85268dd3-713f-efbb-3e63-82137f16a419.png)