OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeワークスペースのルート != PythonエントリーポイントのときのIntelliSense設定

# はじめに
Visual Studio Code (以降、VSCode）でPythonプログラムを書くのは便利ですよね。便利にするためにMicrosoftの `Python` 拡張機能を入れている方も多いと思います。

が、下図のように、**スクリプトはちゃんと動くのに**、自作のパッケージやモジュールに対して、IntelliSenseがおかしな警告をだしたり、コード補完が効かないことがありませんか？

![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257097/17ba15c8-71f5-9808-701a-e00482b57d61.png)
警告の例: `Import "XXXXXX" could not be resolved Pylance (reportMissingImports)`



ユーザーないしワークスペースで設定されている、警告だしやコード補完に使われる**Python言語サーバー**と呼ばれるものの種類によっては、**ワークスペースのルートフォルダーと動かしたいPythonスクリプトのエントリーポイントが異なる**ときに、このようなことが起こります。

このままではせっかくのVSCodeの魅力が半減してしまうので、設定を変更して、警告をなくしコード補完が効くようにします。

以下、上の画像のフォルダー構造を例に説明します。
（想定ケースとして、開発者とは別のユーザーにプログラムをワークスペースフォルダーごと配布するが、ユーザーには `RunThis.bat` バッチファイルをたたいてもらい、`DoNotTouchThisFolder` 以下のPythonスクリプトにはさわってほしくないという場合を考えました。）

## 先人の記事
- [VSCode・インテリセンスが効かない？を解消](https://qiita.com/kusanoiskuzuno/items/fc6a32ef32dd9500f746)
    - 基本的にはこちらをご覧いただければ解決しますが、以下では、Python言語サーバーが `Pylance` のときにも触れます。

# 環境
- Windows 10 1909 64ビット版
- Python 3.7.1 (Anaconda)
- Visual Studio Code 1.48.1
    - `Python` 拡張機能 v2020.8.103604
    - `Pylance` 拡張機能 v2020.8.2


# 設定
Python言語サーバーによって設定値が異なります。

## Python言語サーバーがMicrosoftのとき
**ユーザー** or ワークスペースの `settings.json` で、 `"python.languageServer": "Microsoft"` となっているときの話です。Microsoftの `Python` 拡張機能を入れてポチポチ押していたらこうなっている人もいるかと思います。
このときは、ワークスペースの `settings.json` に以下を書き加えます。

```json:settings.json
{
    (ほかの設定), 
    "python.autoComplete.extraPaths": [
        "DoNotTouchThisFolder"
    ], 
    (ほかの設定)
}
```

※ ユーザー or ワークスペースの `settings.json` で、
`"python.jediEnabled": false` も加える必要があるかもしれません。


## Python言語サーバーがPylanceのとき
**ユーザー** or ワークスペースの `settings.json` で、 `"python.languageServer": "Pylance"` となっているときの話です。`Python` 拡張機能に加えて、Microsoftが（本記事執筆時点で）最近リリースした拡張機能 `Pylance` を入れてポチポチ押していたらこうなっている人もいるかと思います。
このときは、ワークスペースの `settings.json` に以下を書き加えます。

```json:settings.json
{
    (ほかの設定), 
    "python.analysis.extraPaths": [
        "DoNotTouchThisFolder"
    ], 
    (ほかの設定)
}
```

※ ユーザー or ワークスペースの `settings.json` で、
`"python.jediEnabled": false` も加える必要があるかもしれません。



## Python言語サーバーがJediのときは、わかりません


# 結果
![bbb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257097/e2081592-17eb-a5cb-0298-78fcd716b9a9.png)
😉
セルに罫線を引く

    Option Explicit
    
    '外枠ノーマル線、内側細線の罫線を引く
    Sub DrawCellsLineThin()
        Call DrawCellsLine(a_aroundLine:=xlThin, a_innerLine:=xlHairline)
    End Sub
    
    '外枠太線、内側ノーマル線の罫線を引く
    Sub DrawCellsLineThick()
        Call DrawCellsLine(a_aroundLine:=xlMedium, a_innerLine:=xlThin)
    End Sub
    
    'セルに罫線を引く
    Sub DrawCellsLine(ByVal a_aroundLine As Long, ByVal a_innerLine As Long)
        Dim targetRange As Range: Set targetRange = Selection
        With targetRange
            .Borders.LineStyle = xlContinuous
            .Borders.Weight = a_innerLine '内枠の罫線
            .BorderAround Weight:=a_aroundLine '外枠の罫線
        End With
    End Sub
MVC、Broker、Layers、Pipes and Filters

応用情報技術者平成30年秋期 午前問47

ソフトウェアアーキテクチャパターンのうち，仕様の追加や変更による影響が及ぶ範囲を限定できるようにするために，機能を業務ロジック，画面出力，それらの制御という，三つのコンポーネントに分けるものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9ef72362-5209-8c79-fb48-48f129cada02.png)


１、MVC(model-view-control)は、対話型アプリケーションを、モデル、ビュー、コントローラという3つのコンポーネントに分割して設計・実装するアーキテクチャパターンです。
　・モデル層
　　そのアプリケーションが扱う領域のデータと手続きを表現する要素。多くのアプリケーションにおいてはデータベースの機能が、この層に該当する。
　・ビュー層
　　モデル層のデータを取り出してユーザが見るのに適した形で表示する要素。WebシステムではHTMLを生成して、動的にデータを表示するためのプログラムなどが、この層に該当する。
　・コントローラ層
　　ユーザの入力に対して応答し、それを処理する要素。受け取った入力に応じてモデル層やビュー層に処理を依頼する。

２、Brokerは、
分散環境において、互いに依存性を持たないコンポーネント群が、リモートサービスを起動することによって相互作用するという構造をもつアーキテクチャパターンです。

３、Layersは、
アプリケーションを特定の抽象レベルに属するサブタスクのグループ群に分割するアーキテクチャパターンです。

４、Pipes and Filtersは、
データストリームに対する一連の処理を、容易に追加又は削除できるように分割して個々にカプセル化し、段階的に実行することにより、柔軟な組み換えが可能なシステムを作成するアーキテクチャパターンです。

参照：
https://www.ap-siken.com/kakomon/30_aki/q47.html
【個人アプリ作業メモ】simple_calendarでカレンダーを作る


カレンダーの設置はできた。

![スクリーンショット 2020-08-23 午後6.35.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/01bebe48-d5a9-2843-0a59-aa8aabc5fd0b.png)


ここにpostsテーブルの情報を追加していきたい。

https://github.com/excid3/simple_calendar
公式ページを参考に進めていくか。

```ruby:app/views/calendars/index.html.haml
.calendar
  = month_calendar events: @posts do |date, meeting|
    = date
  - posts.each do |post|
    = post.calorie
```

```ruby:app/controllers/posts_controllers
class CalendarsController < ApplicationController
  def index
    @posts = Post.where(user_id: current_user.id)
  end
end
```

これで表示できなかった。

https://qiita.com/isaatsu0131/items/ad1d0a6130fe4fd339d0
この記事によれば、カレンダーに出力したいテーブルで
t.datetime :start_time
と設定する必要があるみたいだ。

## postsテーブルのデータを表示するためにどうすればいいか？
### 仮説
仮説1：postsテーブルにstart_timeカラムを用意する。
仮説2：posts_controllerのストロングパラメータのpermitでstart_timeカラムを許可する。
仮説3：start_timeカラムに何らかの値が入っている必要があるので、start_timeカラムにデフォルト値を入れておく。

↓

## これで解決した

```ruby:posts_controller.rb
@post = Post.new(post_params)
 # 今日の日付を取得(simple_calendarのため)
@post[:start_time] = Date.today.strftime('%Y-%m-%d')
```
これで今日の日付を取ってきて、posts_tableのstart_timeカラムに自動で入れるようにした。
ちなみに、投稿するときのフォームではstart_timeを入力するフォームは用意してない。

つまり、フォームで入力しなくても、
投稿すれば自動的にstart_timeカラムに投稿した日付が入るようにしたということ。
![スクリーンショット 2020-08-24 午後11.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/dea95f8b-aac9-ca5e-e8ff-aa935ac1644c.png)

この赤枠の部分に値が入ってないと
イベントとして表示されない。

これでstart_timeに日時の値が入ったことで、
無事simple_calendarにイベントを表示することができた。

![スクリーンショット 2020-08-24 午後11.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/a7a0672f-1b20-3134-723b-345dfed576a4.png)
Moment.jsで特定の月のすべての日の配列を生成

```ts
// 対象の年月（ここでは2020年8月）
const yearMonth = moment([2020, 7])

// 結果配列
const result = []

const startDayOfMonth = yearMonth.startOf('month').get('date')
const endDayOfMonth = yearMonth.endOf('month').get('date')
for (let d = start; d <= end; d++) {
  const m = moment([yearMonth.get('year'), yearMonth.get('month'), d])
  result.push(m)
}

console.log(result)

//  ["2020-08-01", "2020-08-02", "2020-08-03", "2020-08-04", "2020-08-05", "2020-08-06", "2020-08-07", "2020-08-08", "2020-08-09", "2020-08-10", "2020-08-11", "2020-08-12", "2020-08-13", "2020-08-14", "2020-08-15", "2020-08-16", "2020-08-17", "2020-08-18", "2020-08-19", "2020-08-20", "2020-08-21", "2020-08-22", "2020-08-23", "2020-08-24", "2020-08-25", "2020-08-26", "2020-08-27", "2020-08-28", "2020-08-29", "2020-08-30", "2020-08-31"]
```

# 参考
https://momentjs.com/docs/#/parsing/array/
https://momentjs.com/docs/#/manipulating/start-of/
GitKrakenでCodeCommitにSSHで繋ぐ方法

# はじめに

普段、GitLabを使っているんですが、この度デプロイ自動化しようぜって話になったので、CodeCommitにソースをpushすることになったんですよ。
ふつう、 `aws-cli` でやるのがいいのでしょうが、ゆくゆくはGitLabを廃してCodeCommitに一本化したい気持ちもあり、GitKrakenで簡単に操作できるといいなあと思った次第です。

#やり方

とりあえず、CodeCommitのリポジトリと、そこにつなげるIAMユーザーは作ってあるものとして話を進めます。
できてないときはここと見ながらやると良いでしょう。
[AWS CLI を使用していない SSH ユーザーの セットアップ](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-without-cli.html)

## 1. IAMユーザーにSSH公開鍵を登録する

IAMでユーザーを作ったらユーザーの概要の画面を出しましょう。そこの `認証情報` というタブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57811/4d88c161-dc4e-1346-8116-99a83f746ef9.png)
すると真ん中の方に `SSHパブリックキーのアップロード` というボタンが有るはずです。
ここをクリックするとポップアップが出てきて、そこに公開鍵をペーストしてあげて `SSHパブリックキーのアップロード` という青いボタンをクリックすると、 `SSHキーID` とか項目のついた表が出てくるはずです。
そこの `SSHキーID` がSSH接続するときのユーザー名になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57811/90e6eeaa-9a74-5858-0764-8e5bc8c74bc3.png)

## 2. GitKrakenにリモートリポジトリを登録する

まずは接続用のURLを取ってきましょう。CodeCommitのリポジトリのここから取れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57811/a4aa34ea-7d34-1303-52b8-7557db3ba52e.png)

GitKrakenの `Add Remote` ってところをクリックすると簡単にリモートリポジトリを登録することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57811/4fc29adf-3d8d-628d-5550-9c25102e286c.png)
でこのときに出てくるウィンドウに接続情報を入れてやるわけですが、 `Pull URL` と `Push URL` に入れるURLに一工夫が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57811/196d6fe7-1136-fc55-1e7d-b1662fb449c4.png)
CodeCommitはなぜか `ユーザー名@ホスト名:リポジトリパス` のいわゆる `SSH URL` が使えません。
なので `ssh://` から始まるURLを登録するわけですが、このままやるとこのあとGitKrakenからユーザー名を聞かれ、そこにさっきのSSHキーIDを入れてしまうと、GitKraken側で勝手に `SSH URL` に変換されてしまってFETCHもPUSHもできなくなってしまいます。なので、以下の感じのURLを登録してやればよいのです。

```
ssh://{SSHキーID}@{リポジトリのURL}
```

# おわりに

まさかここで謎にハマってしまうとは思いませんでした……CodeCommitがにくい……
AssetDatabase.LoadAssetAtPathの引数のassetPathを拡張子なしにしたいときの実装方法

# 本記事について
ResourcesもAssetBundleも拡張子ないのがデフォルトだが、AssetDatabase.LoadAssetAtPathでは拡張子あり。
interface切って疎結合にする際に拡張子なしで統一したほうが良いので、タイトルのような需要が生まれる。

# 実装

```BuiltinResources.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class BuiltinResources
{
    static readonly string ResourcesPath = "Assets/Sample/BuiltinResources/";

    public T Load<T>(string path) where T : UnityEngine.Object
    {
        T asset = null;

#if UNITY_EDITOR
        string dirPath = ResourcesPath + Path.GetDirectoryName(path);
        string fileName = Path.GetFileName(path);
        string[] names = Directory.GetFiles(dirPath, fileName + "*", SearchOption.TopDirectoryOnly);
        string assetPath = "";
		for (int i = 0; i < names.Length; i++)
		{
            string n = names[i];
            if (n.Contains(".meta"))
            {
                continue;
            }
            assetPath = n;
            break;
		}

        if (assetPath == "")
        {
            throw new Exception("asset not found path " + path);
        }

        asset = AssetDatabase.LoadAssetAtPath<T>(assetPath);
#endif
        return asset;
    }
}

```

使用する際はエディターなのでDirectory.GetFilesでファイルの情報が取ってこれる。
そこから拡張子を取得する。
C#(.NET Frameworks) - 0x80000000以上の値をもつIntPtrをuintにキャストするとuintに収まる値なのにOverflowExceptionが発生するので解析してみた

# 経緯

[Windows APIを使ってるとき](https://qiita.com/kob58im/items/0273632e96afceca7d0a)に、タイトルの現象に遭遇したので原因を探ってみた。


# 実験用コード

```csharp

using System;

class CastTest
{
    [STAThread]
    static void Main(string[] args)
    {
        IntPtr t1 = new IntPtr(0x7FFFFFFFu);
        IntPtr t2 = new IntPtr(0x80000000u);

        try{
            uint tmp = 0x80000000u;
            Console.WriteLine(tmp);
            uint t1Cast = (uint)t1;
            Console.WriteLine(t1Cast);
            uint t2Cast = (uint)t2; // ここで例外が発生する
            Console.WriteLine(t2Cast);
        }
        catch(OverflowException e){
            Console.WriteLine(e);
        }
    }
}
```

# 実行結果

```実行結果

2147483648
2147483647
System.OverflowException: 算術演算の結果オーバーフローが発生しました。
   場所 CastTest.Main(String[] args)

```

# 原因 - 内部的にはintにキャストしている

ildasmで `uint t2Cast = (uint)t2;` に該当する処理のコンパイル後コードを確認したところ、下記となっている。
<b>intにキャストしてらっしゃる。。</b>

```

call int32 [mscorlib]System.IntPtr::op_Explicit(native int)
```

ILSpyで上記のメソッドをみると、下記となっている。<b>ご丁寧にも`checked`が付いている。</b>ので、オーバーフロー例外を投げる。

```csharp

public unsafe static explicit operator int(IntPtr value)
{
	long num = (long)value.m_value;
	return checked((int)num);
}
```


# 回避方法（暫定）

とりあえずlong型へのキャストを経由する。
(checkedの有効な中から呼ばれた場合、63bit目が立ってると多分同じ目に遭う…)

ちなみに ILSpyでlongにキャストしているメソッドらしきものをみると、

```csharp

public unsafe static explicit operator long(IntPtr value)
{
	return (long)value.m_value;
}
```

となっている。
広義積分の数値計算

[前回の記事](https://qiita.com/Tukaene/items/70b6116ad1768d4a6388)の続きとして様々な広義積分を数値計算する。
ここでは

```math
y=\frac{2 \arctan(x)}{\pi}
```

と置くことによって

```math
\int_{-\infty}^{\infty}f(x)dx=\int_{-1}^{1}\frac{\pi}{2\cos^2(\frac{\pi y}{2})}f(\tan(\frac{\pi y}{2}))dy
```

と変形できることを用いる。

計算に用いるプログラムは以下の通り

```c
#include <stdio.h>
#include <math.h>

double f(double x){
double y;

y=/* ここに計算に使うf(x)の式を書く*/;

return y;
}

double g(double x){
double y;

y = M_PI*f(tan(M_PI*x/2.))/(2*pow(cos(M_PI*x/2.),2));

return y;
}

int main(void){
int i,N=50000;
double S,dx;

dx=1./(double)N;
S=0.;

/*積分範囲が-∞でなく0から始まるなら-Nではなく0から始める。*/
for(i=-N;i<=N-1;i++){
S += (g(i*dx)+g((i+1)*dx))/2.*dx;
}

printf("計算結果: %e 解析解: %e \n",S,/* 比較のためにここに解析解を書く*/);

return 0;
}
```

##計算できる例

###例1.
留数定理を使って計算できるような積分

```math
\int_{-\infty}^{\infty}\frac{1}{x^4+1}dx=\frac{\pi}{\sqrt{2}}=2.221441...
```

```
計算結果: 2.221441e+000 解析解: 2.221441e+000
```

被積分関数のプロット(<font color="Red">ここでいう被積分関数とは$f(x)$のことでなく、変数変換後の$\frac{\pi}{2\cos^2(\frac{\pi y}{2})}f(\tan(\frac{\pi y}{2}))$のことを指す。以下の例でも同様。</font>)
![qa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697232/31fe49cb-4b15-60c8-f287-7c759b92149f.png)

###例2.
不定積分が解析的に書けないような積分

```math
\int_{0}^{\infty}x^{-x}dx≒1.995456...~~(\rm WolframAlphaより)
```

```
計算結果: 1.995456e+000 解析解: 1.995456e+000
```

被積分関数のプロット
![sa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697232/9cd18888-b384-a065-db5d-0d68368d66ac.png)


このように不定積分が計算できるが、やはり**万能というわけではない**。上の2つの関数では[-1:1]で被積分関数が連続でなくなる、または発散するような点をもたないため数値計算ができる。

以下の例では被積分関数が[-1:1]で発散するためこのやり方では計算できない。

##計算できない例

###例3.

```math
\int_{0}^{\infty}\frac{\sin(x)}{x}dx=\frac{\pi}{2}=1.570796...~~~(ディリクレ積分)
```

```
計算結果: -1.#IND00e+000 解析解: 1.570796e+000
```

被積分関数のプロット
![wa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697232/f5a4b48d-a3c5-7802-a8f3-c7205b8fca9d.png)

###例4.

```math
\int_{-\infty}^{\infty}\sin(x^2)dx=\sqrt{\frac{\pi}{2}}=1.253314...~~~(フレネル積分)
```

```
計算結果: 7.994463e+027 解析解: 1.253314e+000
```

被積分関数のプロット
![ma.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697232/2e8c4124-954c-6ead-21d0-660e73e8136c.png)

この2つの例では被積分関数が積分区間内で発散するため解析解と数値解の結果のずれが大きくなる。もし、これらの積分を台形公式で計算したいなら$y=\frac{2\arctan(x)}{\pi}$と置換するのではなく別の関数で置換する必要がある。(※自分では思いつかないので、知っている方がいれば教えてください。)
each_with_indexメソッドを用いたトレーニング

each_with_indexメソッドを用いて配列から探したい要素を探し出し、
その要素が何番目の要素であるか調べるメソッドを作ってみます。

以下の配列から数を探して何番目に含まれているか結果を示すsearchメソッドを作成してみます。

```rb
input = [3, 5, 9, 12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
```

searchメソッドには
とある数値がこのinput配列内に含まれているかのチェック
含まれている場合　→　何番目の要素か出力する。
含まれていない場合　→　含まれていません。と出力する。
このような記述が必要になることが考えられます。

まず調べたい数値が含まれている場合に何番目の要素か知るために
each_with_indexメソッドを使う必要があります。

each_with_index
eachメソッドは配列の要素を取り出せるだけでその要素が何番目であるかは取り出すことはできません。
ところが、each_with_indexメソッドでは「配列の要素」と「何番目の要素なのか」の２つをブロック変数として取り出すことができます。

記述例

```rb
input.each_with_index do |item, i|
~
end
```

itemはinput配列に含まれる要素でinput配列でいうと、3,5,9,12・・・93の値そのものになります。
iは要素の番号（添字）でinput配列でいうと左から順に0,1,2,3,・・・15までの値をとります。
eachメソッドのため配列の要素の最後まで繰り返されるメソッドとなります。
例えば

```rb
example = [3, 5, 9, 12]
example.each_with_index do |item, i|
  puts "#{item}は#{i}番目の数字です。"
end
```

これで出力すると、

```
3は0番目の数字です。
5は1番目の数字です。
8は2番目の数字です。
12は3番目の数字です。
```

と出力されます。
each_with_indexメソッドでは配列に対して、最後の要素まで繰り返され、要素(item)と何番目の要素か(i)が一緒に取り出せることがわかりました。

それではeach_with_indexメソッドを用いて、探したい値とその値が何番目に含まれているか調べるメソッドを書いていきます。
手順としては
input.each_with_indexでブロック変数|item, i|を取り出します。
取り出した値が探したい値と一致するか条件式を書きます。
条件に合うとき　→　何番目の要素か表示する。
条件に合わない時　→　その数は含まれていないことを表示する。　

```rb
def search(target_num, input)
  input.each_with_index do |num, index|
    if num == target_num
      puts "#{num}は#{index + 1}番目の数字です。"
      return
    end
    puts "その数は含まれていません。"
　　 end
  end
end
```

```rb
input = [3, 5, 9, 12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(４２, input)
```

searchというメソッドに引数としてtarget_numとinputを指定します。
target_numは探したい数字で、inputは探す元となる配列です。
`input.each_with_index do |num, index|`
の部分でinput配列から要素numとその要素が何番目か(index)を配列の最後の値まで取り出しています。
```if num == target_num```
ここでは配列の要素（数字）と探したい数字（今回は最後に42を調べます）が一致するかの条件式を書いています。
一致した場合、putsメソッドで探したい数と何番目の要素かが表示されます。
完成！


作成中に疑問に思ったこと。
ifで含まれていたら表示する記述を、elseで含まれていなければ含まれていない表示をする記述を書けばいいのでは？
と思い以下の記述を行いました。

```rb
def search(target_num, input)
  input.each_with_index do |num, index|
    if num == target_num
      puts "#{num}は#{index + 1}番目の数字です。"
    else
    puts "その数は含まれていません。"
    end
  end
end
```

この場合の結果を表示してみましょう。

```rb
input = [3, 5, 9, 12]
```

と仮に置いてみると

```rb
search(9, input)
```

とした時に

```
その数は含まれていません。
その数は含まれていません。
9は3番目の数字です。
その数は含まれていません。
```

このような表示になってしまい、全ての結果が表示されてしまうことになってしまいます。
つまり配列内の要素が多くなればなるほど無駄な結果が増えてしまいます。
そこで含まれている場合の処理のみで完結させてあります。

```rb
   if num == target_num
      puts "#{num}は#{index + 1}番目の数字です。"
      return
   end
```

含まれていた場合でもreturnが記述されていることでそこで処理が終了するため"その数は含まれていません"の処理は読み込まれず出力することができます。
<ajaxでfailエラーを出す方法>

<ajaxでfailエラーを出す方法>
・ajaxの処理箇所に debuggerを挟む。
・Chromeでdebuggerで止まったら、developper toolの「Network」タブの上の方に「Online」となっているところを、「Offline」に切り替え。
・debuggerを解除して進める。
・通信エラーになって、無事failに入る
【備忘録】GCPでSSHを公開鍵認証にする

GCPのVMでSSHを公開鍵認証にする方法メモ
GCPの設定の方から行う方法もありますが、あえてこちらの方法で行っています。

環境
>
OS: Debian10
マシンタイプ: n1-standard-1（vCPU x 1、メモリ 3.75 GB）
>

#基本的な手順
###ユーザーの追加
ユーザの追加と、権限付与

```
sudo adduser USERNAME
sudo gpasswd -a USERNAME sudo
```

###鍵作成
作成ユーザーにログインし、そのユーザーで鍵を作成。

```
su USERNAME
ssh-keygen -t rsa
```
###パーミッション変更
＊サーバー、クライアント両方の.sshのパーミッションが`chmod 700`にであるか確認もしておくとよい。

```
cd ~/.ssh
chmod 600 id_rsa.pub
mv id_rsa.pub authorized_keys
```

###ローカル環境
GCPで生成した、`id_rsa` をcatでコピーしてローカル環境下の`~/.ssh`以下にコピー
ファイル名はなんでも良い。
例は、`ex.pem`とする。

```
# パーミッション変更
chmod 600 ex.pem

# 接続確認
ssh -i .ssh/ex.pem USERNAME@GCP_IPADDER
```

#エラーが出る場合の対処法

##### ssh -i .ssh/ex.pem USERNAME@GCP_IPADDERでエラー
クライアント、サーバーの.sshやid_rsa.pubのパーミッションは正しいか確認する。
.ssh: `chmod 700 `
id_rsa.pub: `chmod 600`
ex.pem: `chmod 600`

そのほかは、
`ssh-keygen`の段階で、パスワードを設定してしまっている。
 これは、`ssh-keygen`からやり直す。
docker+nginx+php-fpmでFastCGI sent in stderr

表題の通りで下記エラーが発生

```
[error] 8#8: *25 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
```

「Primary script unknown」で色々調べた所、nginx.confの設定で

```
fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
↓
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
```

という記事が多かったです、てかほとんどでしたが、原因が違いました。
もっと根本的な凡ミスでした。

### !!nginxのボリュームと、php-fpmのボリュームのパスが違った。!!

nginxでは
/var/www/app/{アプリの中身いっぱい}

php-fpmでは
/var/www/{アプリの中身いっぱい}

でappが抜けててエラーが出ているようでした。


単純ですが時間かかったので記事に残しておきます。
Azure Synapse Analytics SQLプール（旧：SQL Data Warehouse）とは

調べた事などを中心に記載します。

#Azure Synapse Analytics SQLプール（旧：SQL Data Warehouse）とは
Azure Synapseはデータウェアハウスとビックデータ分析がまとめられたサービスであり、Synapse SQL プールはデータウェアハウス機能の事を指す。（旧名称：SQL Data Warehouse）
特長は以下の通りです。

##エンジンの基盤はRDBMSで実績のあるSQL Server
Synapse SQLプールのエンジンの基盤はSQL Serverであり、RDBMSです。なので、扱うデータは、Hadoopのような非定型のデータではなく、定型データをリレーショナル管理により取り扱う事になります。
エンジンがSQL Serverと言う事は非常に重要で、SQL Serverのストアドやユーザ定義、パーティション分割、インデックス等に特殊性が少なく互換性が高い為、SQL Serverを扱った事のあるエンジニアはSynapse SQLプールを扱う為に新たな知識やスキルを身につける事は非常に少なく、ストレス少なく扱う事が可能です。
勿論SSMS（SQL Server Management Studio）から接続し、操作する事もできます。

##並列分散アーキテクチャ
SQL Serverと同じRDBMSであると説明しましたが、大量かつ大容量のデータを取り扱う為、様々なアーキテクチャや機能が実装されており、異なる点も多くあります。主な機能の一つが超並列分散処理（MPP）です。Synapse SQLプールは、データと処理機能を複数のノード（コンピュータ）に分散し、１つのデータベースとして扱います。ようするに非常に大量のデータであったとしても分割し、処理を行う事で、高速に処理が行えるようになると言う事です。例えば1億件のデータがあったとしても、10分割すれば、1000万件のデータが10個になり、この10個を並列で処理する事で高速化を測っています。今の例は10分割で説明しましたが、分割は多ければ多いほど、高速に処理が可能となり、理論上は線形にクエリ性能が向上します。

##３層構造のアーキテクチャ
Synapse SQLプール前述した通り超並列処理（MPP）分散データシステムです。この機能により単一のシステムよりもはるかに大量のデータ処理を可能にしていますが、このSynapse SQLプールはいわゆる３層構造のクラスタ―構成となっています。

###制御ノード（コントロールノード）
接続を受け付け、クエリを受け取るノード

###計算ノード（コンピュートノード）
コントロールノードから処理を受け取り、分散処理を行うノード

###ストレージ
処理対象となるデータを分散して格納。（60分割されている）

計算ノードはその台数を増やすことが可能で、最大６０台まで台数を増やすことができ、処理の並列数を高める事が出来ます。データを格納するストレージですが、これは最初から６０に分割されたストレージが用意されており、データは６０分割されて格納されることになります。計算ノードが最大６０台まで台数が増やすことが出来るのは、６０に分割されたストレージ領域に起因し、基本的には６の倍数しか計算ノードを増やすことが出来ません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/1f21086e-5f84-1a99-3365-fce88a8e6a35.png)


1台の制御ノード、複数台の計算ノード、60のストレージはそれぞれ分離されており、計算ノード、ストレージでそれぞれ別々に従量課金が発生します。（制御ノードは無料です。）

また、それぞれが分離されている事により以下の機能を可能にしています。

* データベースの停止
* 瞬時にスケールアウト、スケールインが可能__
スクレイピングとは？Webスクレイピングを簡単に解説

##Webスクレイピングとは？
[Webスクレイピング](https://jp.scrapestorm.com/)は、インターネット全体から情報を収集するために使用されるさまざまな方法の用語です。通常、これは、さまざまなWebサイトから特定の情報を収集するために人間のWebサーフィンをシミュレートするソフトウェアで行われます。

WikiでWebスクレイピングが[Webクローラ](https://jp.scrapestorm.com/)と呼ばれるのを記載します。実際に、両者にはちょっとだけ差別があります。スクレイピングとクローリングはどちらもインターネット上の情報を収集することですが、スクレイピングは取得した情報の加工ができます。より詳しくデータを抽出すると、より深いデータ分析を行います。
![carlos-muza-hpjSkU2UYSU-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/f228cefc-811c-9c0a-7b22-bf52585704c1.jpeg)
##スクレイピングを行う方法
Quoraに「アマゾンのアメリカ市場にはアマゾンのデータ収集ツールがたくさんあり、非常に優れたものがたくさんありますが、日本には日本市場のデータが取得できるつーつは少ない気がします。理由はありますか？」と言う質問があります。

確かに、日本にサポートする[Webスクレイピングツール](https://jp.scrapestorm.com/)が少ないです。データ取得に言えば、ほとんどにはPaython、Ruby、JavaScriptを利用します。でも、より膨大なデータ取得ニーズにとって、プログラミングができる人が少なく、全然満たさないでしょう。従って、WebスクレイピングツールScrapetormは日本業務を開始します。
![xps-2L-0vnCnzcU-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/b3d3c799-5007-6940-a3a2-92cfa4f2e630.jpeg)
##スクレイピングの活用方法は？
スクレイピングにより、価格の監視、商品詳細、商品レビューなどの収集はマーケティングに大変役に立ちます。

キーワードを[スクレイピング](https://jp.scrapestorm.com/)して、競争者サイトはどんなキーワードを持っていますか、世間のトレンドは何ですか、ユーザさんはよく検索するキーワードにも、スクレイピングされたデータから分析できます。

価格監視や研究用途、情報分析するといった際に必要なデータを収集するのにスクレイピングが活躍します。今回は、マーケティングなどの活用事例を紹介しますが、もちろん、以上の領域しかありません。
![donn-strain-pdJ67ZGJnSI-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/42d92149-8991-69a3-ce7a-5d169cf63f05.jpeg)

スクレイピングでデータを効率的に活用すれば、業務を効率化できたり、生産性を高めたりといった効果が期待できます。Webスクレイピングツールは必ずこのビッグデータ時代に活躍します。
【Nuxt.js】Google認証で、$auth.loginWith() が働いてくれない

Nuxt.js上で、Google認証を用いてのログイン機能を実装したい。

そんな最中、ある警告文と、エラー文が出て、認証できない事案に遭遇した。

###WARNING

```console
./.nuxt/auth/schemes/oauth2.js 
"export 'default' (imported as 'nanoid') was not found in 'nanoid'
```

###ERROR

```console
TypeError: Object(...) is not a function
```

#現状のファイルたち

###設定ファイル

```javascript:nuxt.config.js
  buildModules: [
    '@nuxtjs/vuetify'
  ],
  modules: [
    '@nuxtjs/axios',
    '@nuxtjs/auth',
  ],
// 省略 
  auth: {
    redirect: {
      login: '/sessions/new',
      logout: '/',
      callback: '/callback',
      home: '/home',
    },
    strategies: {
      google: {
        client_id: ''
      }
    }
  },
```

###Vueファイル

```javascript:login.vue
<template>
  <v-row justify="center">
    <v-col cols="12" sm="10" md="8" lg="6">
      <v-card>
        <v-card-actions>
          <v-btn color="primary" raised @click="googleAuthenticate">Googleでログイン</v-btn>
        </v-card-actions>
      </v-card>
    </v-col>
  </v-row>
</template>

<script>
export default {
  // 省略
  methods: {
    googleAuthenticate () {
      this.$auth.loginWith("google")
    },
  }
}
</script>
```

#解決法

[同じような現象が起きている人がいた](https://github.com/nuxt-community/auth-module/issues/750)ので、そちらを参考にすると、どうやらアプリが再構築されるたびにファイル内のnanoidのインポートを変更しなければならないという**バグ**のようなので、nanoidをインストールすると解消されるようです。

###バグを修正

```shell
npm i nanoid@2.1.11
```

意外と自分だけじゃなくて、ライブラリのバグが原因の時もあるようなので、
考えを巡らせるだけじゃなくて、調べることに徹することも大事ですね。
これにて、解決！
関数

# python 関数
様々な処理が機能として１つにまとまっているものを関数といいます。
Pythonではdefに続いて関数を宣言します。
def car()と書いた場合、carという関数が宣言されたことになります。defは「定義する」という意味。
そして()の中には、引数を入れることができます。引数とは、「このデータを使って処理してください」と関数にわたす値を指します。
関数の中の処理が引数を使って行われた後に返ってくる値を戻り値と言います。戻り値はreturn hogeという形でreturn文を用いて記載します。
引数は関数へ材料として与える値、そしてその結果として返ってくる値が戻り値です。

以下の記載方法でpython では関数を定義します。

def 関数名(引数):
    # この中に処理内容を書く
    # 処理１
    # 処理２
    # ...

関数名は自由につけることができますが、その関数がどんな処理をする関数なのかがわかるような関数名にすること

引数が無い関数
まずは引数のない関数。
1. def aisatu():
2.     print(‘こんにちは’)
3.  
4. aisatu()

結果
こんにちは

引数のある関数
1. def kakezan(a,b):
2.     print(a*b)
3.  
4. kakezan(5,4)
(a,b)という引数を付与しています。4行目でこの引数に(5,4)という実数を代入して呼び出しています。

結果
1. 20

以下のように定義されている関数はそのまま使用できる。

例
print()
文字列を画面に出力する関数、print関数は標準出力として用意されている
使用方法
print("出力したい文字列")

input()
ユーザーがキーボードに入力したデータを受け付けるための関数、input関数は標準入力として用意されている。
使用方法
 In = input("Please Enter Number: ")

str()
引数に指定したオブジェクトを文字列に変換して取得します。

int()
引数に指定したオブジェクトを数値に変換して取得します。

float()
浮動小数点を扱います。

list()
要素の挿入や削除などを行うことができます。

その他にも、使用出来る関数が多数存在します、
tuple()
set()
dict()
type()
range()
など
pug忘備録

## 基本
インデントで入れ子を表現するスタイルのテンプレートエンジン

```
// コメント 「//」
// ここはコメントです
// クラス指定 「.」
p.hoge
// ID指定 「#」
p#huga
```

## 変数宣言、展開/jsの実行
`- var 変数名` で変数の宣言ができる
`#{}` で囲まれた箇所で変数展開が行われる。また、jsの実行もできる

```
// 宣言
- var hoge = 'にゃあああ'

// 展開
p #{hoge}

// jsも使用可能
p #{hoge.split('あ')[0]}

// タグの中で変数展開した際に、変数にタグとして認識できる文字が入っていてもタグとして認識されない
- var huga = '一行目<br>二行目'
div #{huga}
```

## for/each
```
- var piyo = [1, 2, 3]
// for は頭に - が必要
- for (var i = 0; i < piyo.length; i++)
  p #{piyo[i]}
// each は頭に - が不要
each element in piyo
  p #{element}
```

## if/switch(case)
```
//if (unlessも使える)
if 条件
  p aaaaaa
else if 条件
  p bbbbb
else
  p ccccc

// switch(case)
case 比較対象
  when 条件
    p aaaaaaa
  when 条件
    p bbbbbbb
  when 条件
    p ccccccc
  default
    p ddddddd

```

## テンプレート継承
ページ共通で使う共通テンプレートをページ別のテンプレートが継承することができる

### 継承される側
```
// 継承される側は block キーワードを使う
// content block を継承された際に置換する
body
  block content
```

### 継承する側
```
// 継承する側は、extends キーワードでどのテンプレートを継承するのか宣言する
extends layout
// そしてどのブロックなのかを、継承される側同様 block キーワードを使って宣言する
block content
  h1 以下コンテンツ
```
OSの仕事、ジョブ管理

#OSとは
　オペレーティングシステム(Operating System)の略。
　コンピュータの基本動作を実現する「基本ソフトウェア」

#ソフトウェアの分類
ソフトウェアを大きく分けると以下の図の通りになる。
![図72.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/611ac93f-6fa0-6a9e-8751-9ed150a4426a.png)

#基本ソフトウェアは3種類のプログラム
　基本ソフトウェアは、さらに細かく3つのプログラムに分けることができる。
![図74.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/1e552dec-0a17-dc5a-c57f-162538c71cba.png)

#代表的なOS
 ・**Windows**
　**特徴**　
　現在もっとも広く使われているMicrosoft社製のOS
　GUI(グラフィックユーザインタフェース)といって、マウスなどの
　ポインティングデバイスを使って画面を操作することで、コンピュータに命令を伝える
　・**Mac OS**
　**特徴**
　グラフィックデザインなど、クリエイティブ方面でよく利用されているApple社製のOSです。
　GUIを実装したOSの先駆けとしても知られている
　・**MS-DOS**
　**特徴**
　Windowsの普及以前に広く使われていたMicrosoft社製のOS
　CUI(キャラクタユーザインタフェース)といって
　キーボードを使って文字ベースのコマンドを入力することでコンピュータに命令を伝える。
　・**UNIX**
　**特徴**
　サーバなどに使われるこの多いOS
　大勢のユーザが同じ利用できるよう考えられている。
　・**Linux**
　**特徴**
　UNIX互換のOS
　オープンソース(プログラムの元となるソースコードが公開されている）のソフトウェアで、無償で利用することができる
#ジョブ管理
　利用者から見た仕事の単位がジョブ。効率よく処理していけるように、OSは実効スケジュールを管理する
　**ジョブ管理の流れ**
　ジョブの流れは以下の通りです。
　　![図73.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/e08cb263-9d8b-04c4-666d-f9f005a03cff.png)
　**スプーリング**
　低速な装置とのデータのやり取りを高速な磁気ディスクを介して行うことで処理効率を高める方法

#以上
PostgreSQLのログに大量の"unsupported frontend protocol 1234.5680: server supports 1.0 to 3.0"

環境変数で、`PGGSSENCMODE=disable`とすれば止まります。
libpqのバグみたいで、PostgreSQL 12.2で直る予定だったのが直ってなかったらしいです。12.3以降でどうなっているのかは調べてません。

ちなみに、私は、PGGSSENCMODEを変更するとどのような影響があるのか把握してないので、本番環境で変更する場合はよく調べてからにしてください。

githubのissue:
https://github.com/petere/homebrew-postgresql/issues/51
【TypeScript】 inferに詳しくなろう

## 目標

[TypeScript のドキュメントにある上級者向けの型たち https://www.typescriptlang.org/docs/handbook/advanced-types.html](https://www.typescriptlang.org/docs/handbook/advanced-types.html)に出てくる

```ts
type Unpacked<T> = T extends (infer U)[]
  ? U
  : T extends (...args: any[]) => infer U
  ? U
  : T extends Promise<infer U>
  ? U
  : T;
```

が何しているのかを読めるようになる。
また実際に`infer`を用いて実装できるようになるのが目的。

## inferとは

https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-inference-in-conditional-types の抄訳

inferは日本語に表すと「推論」です。

TypeScriptのextendsを使うと、型での条件分岐が可能になります。(extendsについてもまとめたい)
inferはその条件分岐で推論された型を指すときに用いることができます。

ジェネリック型を関数でいうところの引数(props)と呼ぶならば、
inferは引数によって動的に値が変化する変数のようなもので、`infer U`と記述したら、U型を型情報に含めることができます。

例題1
ドキュメントの最初に紹介されている型を見てみましょう。

```ts
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
```

これは関数の返り値を表す型です。

例えば

```ts
// 数値を文字列に変換する関数
type ToString = (num: number) => string;

// 数値を文字列に変換する関数の返り値
type ReturnTypeToString = ReturnType<ToString>; // (1)
//   ^ == string

// そもそも関数でない
type ReturnTypeString = ReturnType<string>; // (2)
//   ^ Type 'string' does not satisfy the constraint '(...args: any) => any'.(2344)
```

といった挙動をします。


(1) はまずTの型は`ToString`であり`extends (...args: any[]) => infer R`を満たします。

```ts
(...args: any[]) => infer R
// ↓
(num: number) => string
```

そして**`infer R`に対応する箇所は今回の場合`string`になる**のでRの型は`string`型になります。
なので結局の型は`string`になりました。

ここで再掲例題2を見てみましょう。

```ts
type Unpacked<T> = T extends (infer U)[]
  ? U
  : T extends (...args: any[]) => infer U
  ? U
  : T extends Promise<infer U>
  ? U
  : T;
```

これは配列、関数、Promiseの中の型を取り出す（unpackする）型です。
つまり

- `string[]` は string
- `(a: any) => boolean` は boolean
- `Promise<number>` は number

が取り出せるというわけです。

## 実践

実際にどこで使うのかといった疑問が発生します。
たしかに普段は使わないはずですし、できればそのあたりを考える必要のない言語であって欲しいものです。

TypeScriptの型（Rustとかいろいろな言語も）はたくさんの`<>`で内包される記述を行います。
たくさんの`<>`で安全になった型たちからもとの値を取り出すときに`infer`を用いると便利な場合があります。

今回型情報は同じだが、違う型として認識させたいと、[newtype-ts](https://github.com/gcanti/newtype-ts)を使ったとします。

例えば本名とサービスでの表示名の型はどちらもstringですので、間違えて本名を表示させないように下のように別の型として`RealName`と`DisplayName`を分けることができます。

newtype-tsの説明コード

```ts
type RealName = Newtype<{ readonly RealName: unique symbol }, string>;
type DisplayName = Newtype<{ readonly DisplayName: unique symbol }, string>;

const realName = iso<RealName>().wrap("HikaruEgashira");
const userName = iso<DisplayName>().wrap("ehika");

// ログイン時に挨拶する
const Greet = (name: DisplayName) = {
  console.log(`ようこそ ${iso<DisplayName>().unwrap(name)}`);
}

Greet(userName)
// log: "ようこそ ehika"
Greet(realName);
//    ^ 型が違うのでエラーに
```

ここでstringを取り出そうと思ったとき`infer`が役に立ちます。

```ts
// NewTypeされる前の型を表す
type BaseType<T> = T extends NewType<unknown, infer U> ? U : T;

// BaseType<RealName> == string
// BaseType<DisplayName> == string
```

## 思ったこと

ライブラリ側で実装して欲しい問題な気もするので、ライブラリ開発者向けかも
AtCoderBeginnerContest176復習＆まとめ（前半）

# AtCoder ABC176
2020-08-22(土)に行われたAtCoderBeginnerContest176の問題をA問題から順に考察も踏まえてまとめたものとなります．
前半ではABCまでの問題を扱います．
問題は引用して記載していますが，詳しくはコンテストページの方で確認してください．
[コンテストページはこちら](https://atcoder.jp/contests/abc176)
[公式解説PDF](https://atcoder.jp/contests/abc176/editorial)

## A問題　Takoyaki
> 問題文
> 高橋君はたこ焼きが好きです。
> たこ焼き器を使うと、$1$度に最大で$X$個のたこ焼きを作ることができます。これにかかる時間は作る個数によらず$T$分です。
> $N$個のたこ焼きを作るためには何分必要ですか？

解説にもある通り，たこ焼きを焼く回数は，$N/X$を切り上げた回数ですが，そのあたり考えるのや実装が不慣れだったので，提出までの時間早くするためにfor文で書いたものを提出しました．

```python:abc176a.py
n, x, t = map(int, input().split())
for i in range(1, 2 * n):
    if n <= i * x:
        print(i * t)
        break
```

実際には，無駄なループをするべきではないので以下のようなプログラムが理想だと思います．

```python:abc176a.py
n, x, t = map(int, input().split())
k = (n + x - 1) // x
print(k * t)
```

## B問題　Multiple of 9
> 問題文
> 整数$N$が$9$の倍数であることと、$N$を十進法で表したときの各桁の数の和が$9$の倍数であることは同値です。
> $N$が$9$の倍数であるか判定してください。

値が大きくならないように，桁の数字を足すごとに，毎回余りを計算していますが，pythonの場合は最後に一回やるだけでも大丈夫でした．

```python:abc176b.py
n = input()
t = 0
for i in range(len(n)):
    t += int(n[i])
    t = t % 9
if t == 0:
    print("Yes")
else:
    print("No")
```

## C問題　Step
> 問題文
> $N$人が$1$列に並んでおり、前から$i$番目の人の身長は$A_i$です。
> それぞれの人の足元に、高さが$0$以上の踏み台を設置し、全ての人が次の条件を満たすようにしたいです。
> 条件：踏み台を込めて身長を比較したとき、自分より前に、自分より背の高い人が存在しない
> この条件を満たす時の、踏み台の高さの合計の最小値を求めてください。

二番目の人から順に，前の人より踏み台を込めて身長が低い場合には，前の人と同じ身長になるように踏み台を設置する．
この設置した踏み台の和が答えとなる．

```python:abc176c.py
n = int(input())
a_list = list(map(int, input().split()))
total = 0
for i in range(1, n):
    if a_list[i - 1] > a_list[i]:
        total += a_list[i - 1] - a_list[i]
        a_list[i] = a_list[i - 1]
print(total)
```



前半はここまでとなります．
夏休み中ですが，論文が条件付き採録になって回答書作りで忙しいため，後半は時間ができたら書きたいと思います．
最後まで読んでいただきありがとうございました．

追記：E問題だけ復習も兼ねて記事にまとめました．[AtCoderBeginnerContest176復習＆まとめ（後半）](https://qiita.com/takaito0423/items/5bf6599888a6e5bff972)
Dsploitとは何ですか？

Dsploitとは何ですか？

DSploitとは何ですか？

DSploitは、1つのアプリケーションにバンドルされているネットワーク分析および侵入テストツールのコレクションです。 DSploitは、Androidオペレーティングシステム用にSimone Margaritelliによって開発されました。ツールの開発者によると、このアプリケーションは、次のタイプのタスクを実行するための最も完全で高度なツールキットを提供します。

Wi-Fiスキャンと一般的なルーターのキークラッキング
詳細な検査;
脆弱性検索;
マルチプロトコルログインクラッカー。
Wake on LANをサポートするパケットフォージ。
HTTPSリダイレクション。
中間者攻撃
セッションハイジャック;
リアルタイム操作。
ルート権限を持つAndroid（2.3以降）デバイスで動作し、DSploitのコードはGitHubで無料で利用できます。これは、セキュリティの専門家や、ネットワークセキュリティ、ハッキング、侵入テストを楽しむ人にとって非常に優れたツールです。

それは確かにオープンネットワーク上でプレーンテキストで送信されたパスワードを盗聴することができ、セキュリティが不十分なWi-Fiネットワークを破壊する可能性があります。また、ネットワークの脆弱性をスキャンし、共有ルーターのキーをハックし、ブラウザー、Webサイト、ソーシャルネットワーキングセッションをブロックし、それらをハイジャックするなど、さまざまなことを実行できます。

以下は、DSploitアプリの機能に関する詳細です。

1.スクリプトインジェクター
DSploit .apkのこの機能により、被害者がアクセスしたすべてのWebページにスクリプトコードが挿入され、ユーザーがWebを表示する前に自動的に実行されます。

2.パケット偽造
DSploit .apkのこの機能により、ユーザーはカスタムパケットを作成してターゲットTCPおよびUDPポートに送信できます。

3.カスタムフィルター
この機能は、被害者が閲覧しているWebサイトのテキストを置き換えるのに役立ちます。これを行うには、検索するテキストを指定して、テキストを置き換える必要があります。

4.ビデオ/画像を置き換える
DSploitのこのツールは、被害者が閲覧しているWebサイトのビデオと画像を置き換えるのに役立ちます。

5.トレース
DSploit APKのこのツールは、送信元から宛先へのIPネットワーク上のパケットがたどるリアルタイムの経路を追跡します。

dsploitの使い方?

<a href="https://www.darkhackerworld.com/2020/08/dsploit-apk-free-download.html">How to download Dsploit</a>
Ubuntu18.04 でBLAMをインストール


BLAMをインストールには、Intel MKLとGTSAMをインストールしてからBLAMをインストールします。

# 依存ライブラリをインストール

```
sudo apt-get install libtbb-dev libboost-all-dev cmake cpio python-wstool
```

# Intel MKLをインストール

[installing using APT](https://software.intel.com/content/www/us/en/develop/articles/installing-intel-free-libs-and-python-apt-repo.html)に従えばよい.

```
$ cd /tmp
$ wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
$ sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
$ sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list
$ sudo apt-get update
$ sudo apt install intel-mkl-2020.0-088
```

# GTSAMをインストール

[Quickstart](https://github.com/borglab/gtsam)に従えばよい.

```
$ git clone https://bitbucket.org/gtborg/gtsam.git
$ cd gtsam
$ mkdir build
$ cd build
$ cmake ..
$ make check (optional, runs unit tests)
$ sudo make install

```

# BLAMをインストール

```
$ git clone https://github.com/naisy/blam.git
$ cd blam
$ ./build.sh
```

# BLAMを実行

onlineモード

```
$ ./blam_online.sh
```

offlineモード

```
# rosbagに /velodyne_points のTopicが存在している前提
# internal/src/blam_example/launch/test_offline.launchでTopic名変更可能
$ ./blam_offline.sh rosbag_file_path
```

# BLAM実行エラーの解消

エラー

```
internal/devel/lib/blam_slam/blam_slam_offline: error while loading shared libraries: libmetis.so: cannot open shared object file: No such file or directory
```

- 解消方法

```
~/.bashrcのLD_LIBRARY_PATHに/usr/local/libパスを追加

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
```
エラー

```
Assertion `key_arg.x <= this->max_key_.x' failed.
```

blam_slam_node: /build/pcl-OilVEB/pcl-1.8.1+dfsg1/octree/include/pcl/octree/impl/octree_pointcloud.hpp:688: void pcl::octree::OctreePointCloud<PointT, LeafContainerT, BranchContainerT, OctreeT>::genOctreeKeyforPoint(const PointT&, pcl::octree::OctreeKey&) const [with PointT = pcl::PointXYZ; LeafContainerT = pcl::octree::OctreeContainerPointIndices; BranchContainerT = pcl::octree::OctreeContainerEmpty; OctreeT = pcl::octree::OctreeBase<pcl::octree::OctreeContainerPointIndices, pcl::octree::OctreeContainerEmpty>]: Assertion `key_arg.x <= this->max_key_.x' failed.

- 解消方法

[参照](https://github.com/erik-nelson/blam/issues/36)

```
PointCloudMapper.cc
change

if (!map_octree_->isVoxelOccupiedAtPoint(p)) {

to:

double min_x, min_y, min_z, max_x, max_y, max_z;
map_octree_->getBoundingBox(min_x, min_y, min_z, max_x, max_y, max_z);
bool isInBox = (p.x >= min_x && p.x <= max_x) && (p.y >= min_y && p.y <= max_y) && (p.z >= min_z && p.z <= max_z);

if (!isInBox || !map_octree_->isVoxelOccupiedAtPoint(p)) {
```
世界で最も重要な5つのAI企業

人工知能は前進しており、好むと好まざるとにかかわらず、機械学習は私たちの技術の将来において重要な役割を果たすでしょう。 世界で最大かつ最高の企業はすでにこれを知っており、彼らはAIに多額の投資をしています。

Apple
Appleは近年AIの新興企業の買収に忙しく、人工知能はその将来の重要な部分であると考えています。 2018年12月、Googleがスコットランドのコンピューターサイエンティストを密猟した後、同社はAIと機械学習部門の責任者としてJohn Giannandreaを正式に任命しました。 彼は、Siriや会社の新しいML作成ツールなどの製品の開発を監督します。これらのツールをMacOSおよびiOS開発者が使用して、アプリの効率的で簡単なトレーニングコースを作成できます。

Facebook
人工知能は将来、非常に強力になるでしょう。 FacebookがAIに投資しているのも当然です。 FAIRとして知られているFacebookのAI研究グループは、マシンインテリジェンスの分野を進歩させ、人々により良いコミュニケーション方法を提供するための新しいテクノロジーを開発することに取り組んでいると述べています。 Mark ZuckerbergとCo.は、特にAliceとBobと呼ばれる2つのAIを使用して交渉プラットフォームで作業しましたが、夫婦が秘密の言語でコミュニケーションを始めた後でプロジェクトを終了しました。
あなたはより多くのAI開発会社を見ることができます。https://bap-software.net/knowledge/ai-development-company/

Google
おそらく、このリストで最大かつ最も重要なAI企業も最も明白です。 GoogleはAIの新興企業を買収しました。 過去4年間で、マウンテンビューは12以上の新しい人工知能企業を生み出しました。 最も重要な購入は、GoチャンピオンをプレイするボードゲームであるDeepMindに対する4億ドルの取引でした。
GoogleのマシンシステムTensorFlowもあり、すべて無料で利用できます。また、デバイスで機械学習を行うための進行中のTensor AIチッププロジェクトもあります。 GoogleのCEOであるSundar Pichaiはすでに、長期的には「コンピュータファーストで「モバイルファースト」から「AIファースト」の世界へと進化している」と述べており、これは、どこを見ればわかるかを知るために必要なすべてのことをすでに述べています。 Googleは未来を見据えています。

HiSilicon
HuaweiのCEO、Richard YuがベルリンのIFA 2018でキリン980を発表したとき、競争は非常に熱心でした。 ファーウェイのチップメーカーであるHiSiliconは、世界初のAIスマートフォンチップの第2世代を大幅に強化しました。 キリン980は、顔認識、物体認識、画像分割、インテリジェント翻訳などを高速で行うことができます。 チップはAIスマートフォンチップの洪水を引き起こしており、企業が今後数年間でさらに技術を開発する場合、おそらくそうなるでしょう。

IBM
多国籍テクノロジー企業のIBMは、1950年代からAIで活躍してきました。 同社は人工知能の誕生に関与しており、現在もしっかりと取り組んでいます。 IBMはWatsonを使用して、カスタマーサポート用のチャットボットの構築など、AIをビジネスプロセスに統合できる機械学習プラットフォームを作成しました。 顧客には、Big Four Auditor、KPMG、ブラジル最大の銀行の1つであるBradescoなどがあります。
[Tips]ArraySliceのIndexはオリジナルのものである

「Swiftの[ArraySlice](https://developer.apple.com/documentation/swift/arrayslice
)はオリジナルの[Array](https://developer.apple.com/documentation/swift/array)へのViewであり、ストレージを共有しています。」と書いてありますが、具体的にはどのようなものなのでしょうか？

自分がハマったポイントを中心に、よくわかる挙動の違いを解説します。

# 1. Arrayの場合
以下のような配列があるとします。

```swift:array.swift
let array: [String] = ["a", "b", "c", "d", "e", "f"]
```

これを[subscript(_:)](https://developer.apple.com/documentation/swift/array/2944258-subscript)を使って左右に分割するケースを考えてみます。

この返り値の型は`ArraySlice<String>`になっているので、新しいArrayとして生成します。

```swift:decoupled.swift
let decoupledLeft = Array(array[0...2])
let decoupledRight = Array(array[3...])
```

このとき、左から"b"を取り出したければ

```swift
decoupledLeft[1]
```

右から"d"を取り出したければ

```swift
decoupledRight[0]
```

とすれば良いです。

# 2. ArraySliceの場合
先程のサンプルで左右に分けるところで、Arrayに包まず

```swift:decoupled.swift
let decoupledLeft = array[0...2]
let decoupledRight = array[3...]
```

とします。これで`decoupledLeft`と`decoupledRight`はどちらも、`ArraySlice<String>`になっています。

ここで`decoupledRight`から"d"を取り出すには、どのインデックスにアクセスすれば良いでしょうか？

Arrayと同じ操作方法を取って

```swift
decoupledRight[0]
```

を実行すると、`Index out of bounds`のクラッシュが発生します。

これはどういうことでしょうか？

クラッシュさせてみて、デバッガを見るとよく分かります。
`decoupledRight`には

```
- [3]:"d"
- [4]:"e"
- [5]:"f"
```

という要素が含まれています。つまり、タイトル通りオリジナルのインデックスが維持されているのです。

先程`decoupledRight[0]`を実行しようとしたときにクラッシュしたのは、そのIndexアクセスに対応した領域が存在しなかったから。ということが明らかになりました。

# まとめ
- ArraySliceはオリジナルのインデックスを保持します
- そのため、通常のArrayのようにアクセスを試みると、存在しない領域で`Index out of bounds`を起こす場合があります。

「パフォーマンスを悪くしないためにArraySliceを利用してみたが、挙動の違いにハマってしまった。」ということを回避できるように、この仕様を意識できればと思います。
Rails DB PostgreSQLからMySQLへ変更

# はじめに
今までデータベースにはPostgreSQLを使用してherokuへデプロイしておりましたがherokuだと投稿した画像が一定時間経つと消滅する謎現象が起こります。

というわけでせっかくなのでAWSへデプロイしたいしデータベースをMySQLに変更してしまおうと思ったのでやってみます。


# MySQL

MySQLの既にインストールしてますでまだの方はインストールしてください。

で、Gemfileに `gem 'mysql2'` を追加します。

```ruby:config/databese.yml
default: &default
  adapter: mysql2
  encoding: utf8
  username: root
  password:
```

`database.yml`を開いて書き換えます。

私のようにどこかの教材学習時にとりあえずでインストールしている場合は恐らくrootユーザーでパスワードも設定してないと思うのでこの時に`username: root`と `password: ` を追加しておきましょう。


ユーザー作成済みでログインする場合はそのusernameとpasswordをいれると良いのだと思います。(たぶん)


```
$ bundle install
```

インストールします。

```
$ bundle exec rake db:create
```

データベース作成して

```
$ rails db:migrate
```

こちらのコマンドも忘れずに！

実際やってみると特に難しくないのですが理解が浅いと変にハマるかもしれないと思いました。
（自分がハマりかけたので）

初学者目線だとDBの変更って難しそうに見えましたが案外すんなりいけたので挑戦することは大事ですね！
Mac版Filezillaでファイルの関連付けを設定する

ダブルクリック時に「表示/編集」の設定にしている場合、
サーバのファイルを指定したエディタで開けるようにする設定は多くの人がやってると思います。

自分はVSCodeが主体なのでこう。

![スクリーンショット 2020-08-25 16.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/12d699c0-5910-0c82-ab5b-bd2998dd2268.png)

デフォルトのターミナルはよう使いません。
で、テキストエディタで開けないようなバイナリはどうするかって言うと
「ファイルの編集」→「ファイルの関連付け」と選択してカスタマイズしますね。

親切にもFilezillaは例を書いてくれてます。

![スクリーンショット 2020-08-25 16.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/6075cc30-7c57-0d5f-82d3-462f47b7d204.png)

ダブルクリックしてビューワでpngを開く場合は

```
png "c:\program files\viewer\viewer.exe" -open
```

<b>例がWindowsなんよ！！！</b>

「-open」て何語？

Macは単に実行アプリの絶対パスを書くだけでいいようです。

![スクリーンショット 2020-08-25 16.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/d6b46b1e-51bc-3ace-bc21-475dd740abaf.png)

```
拡張子 "実行アプリのパス"
```

<b>おわり。</b>
同じカテゴリーで、複数の名前を一括で呼び出す方法


【概要】
----------------------------------------
<b>1.結論</b>

<b>2.二重ハッシュとは何か</b>

<b>3.どのように使用するのか</b>

<b>4.ここから学んだこと（エラーの時に使用）</b>



1.結論
----------------------------------------
二重ハッシュと配列を使い、eachメソッドを使用する！

<br>
2.二重ハッシュとは何か
----------------------------------------
ハッシュの中にハッシュが入っている状態のことで
つまり、下記のことをいいます！

```Ruby
student = {human: {gender: {name: 'John'}}}
```


<br>
3.どのように使用するのか
----------------------------------------
ハッシュと配列の組み合わせは簡単だと思います！

```Ruby
students = [
{human: {gender: {name: 'John'}}},
{human: {gender: {name: 'Nick'}}},
{human: {gender: {name: 'Alan'}}},
]
```
配列の中に、2.にあったものを入れるだけで上記のものになります。
そして、名前を呼び出す際にeachメソッドを使用します。
そうしなければ全部の名前は呼び出せません。

```Ruby:1 
students = [
{human: {gender: {name: 'John'}}},
{human: {gender: {name: 'Nick'}}},
{human: {gender: {name: 'Alan'}}},
]

students.each do |student|
 puts  student[:human][:gender][:name]
end

```
これで全ての名前を呼び出すことができます。

もう一つの方法として、digメソッドがあります。

```Ruby:2
（省略）

students.each {|student| puts student.dig(:human, :gender, :name)}
```
という書き方になります。
each do endの"do~end"がないのは、
eachは１番の書き方と２番の両方の書き方があります。
<br>
4.ここから学んだこと
----------------------------------------
全ての名前を出力したいと思った時に、配列なので
全ての配列の情報([0]~[2]の３つの情報)を取ろうかなと思いました。そして、３つの情報を変数に代入してputsで出力したらいいかなと思ったのですが、わざわざ配列を解除する意味がないと思いました。eachは配列の変数を１つずつ繰り返す処理になるのでdigも含め、まさにぴったりのメソッドでした。
<br>
CentOS7 CPU温度測定

## lm_sensors

```cmd
# dnf install lm_sensors -y
(省略)

# sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:        +27.8°C  (crit = +119.0°C)
temp2:        +29.8°C  (crit = +119.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +95.0°C  (high = +82.0°C, crit = +100.0°C)
Core 0:        +92.0°C  (high = +82.0°C, crit = +100.0°C)
Core 1:        +95.0°C  (high = +82.0°C, crit = +100.0°C)
Core 2:        +77.0°C  (high = +82.0°C, crit = +100.0°C)
Core 3:        +95.0°C  (high = +82.0°C, crit = +100.0°C)
Core 4:        +77.0°C  (high = +82.0°C, crit = +100.0°C)
Core 5:        +77.0°C  (high = +82.0°C, crit = +100.0°C)
```
Rasberry Piクラスターに helm を導入してみた

- [Helm とは](#org4fb3da6)
  - [Helm の導入](#orgf51dfea)
  - [Helm の簡単なコマンド](#org5ed8cc9)
  - [Helm によるPodの実行](#org1aa1abc)


<a id="org4fb3da6"></a>

# Helm とは

Helm を一言でいうと、Kubernates の YAML地獄(YAMLの壁と言ったりもする)を回避するための運用管理支援のツールです。

Kubernates は、コンテナをグループ化したPod や マイクロサービス間のネーミングを解決するための Service で構成されますが、この Pod や Service を管理するために、大量の YAML ファイルを作成することが必要になります。

アプリケーションがマイクロサービス化され、ビジネス機能を実現する単位で細分化されると、管理する YAMLの数も必然多くなります。

また、この YAML は提供するサービスの種類によって、一定の記述のパターンやベスト・プラクティスがあり、毎回新規にクラウドエンジニアが作成するものでもありません。

Helm には Chart と呼ばれる Pod や ServiceのYAMLファイルのひな形のを固めて圧縮したものがあり、特定のコンテナ(Nginx、MySql、WordPress&#x2026;)ごとの Chart を用意することで、YAML ファイルの管理の手間を削減することができています。

Rasberry Piクラスターに、Helmを導入して、YAML地獄から解放されるか確認しましょう。


<a id="orgf51dfea"></a>

# Helm の導入

いつもの通りに、単純な apt では導入できなかったので、Helm の公式サイト (<https://helm.sh/docs/intro/install/>)のFrom Snap記述されている、Snapから実行します。

```shell
$ sudo apt update
$ sudo apt install snapd
$ sudo reboot
$ sudo snap install helm --classic
```

バージョンを確認する。

```shell
$ helm version
version.BuildInfo{Version:"v3.3.0", GitCommit:"8a4aeec08d67a7b84472007529e8097ec3742105", GitTreeState:"dirty", GoVersion:"go1.14.7"}
```


<a id="org5ed8cc9"></a>

# Helm の簡単なコマンド

Helm を利用して、Pod を実行するためには、Chart のリポジトリを追加して、 その後でChart名を指定して起動することになります。 基本的なコマンドはこちら。

| 機能      | コマンド                                | 補足 |
|--------- |--------------------------------------- |--- |
| Hubの検索 | helm search hub [chart-name]             |    |
| リポジトリ追加 | helm add [repo-name] URL                |    |
| リポジトリ参照 | helm repo list                          |    |
| Chart導入 | helm install [release-name] [chart-name] |    |
| Chartsa削除 | helm uninstall [release-name]           |    |


<a id="org1aa1abc"></a>

# Helm によるPodの実行

HelmによるPod実行がいかに簡単になるかを示すために、ingress-nginx を導入してみます。 Chart の検索できる Helm Hub(<https://hub.helm.sh/>)で ingress-nginx が見つかります。

そこに記述された手順にしたがって、Chart を導入するためにHelm Chartのレポジトリを追加して、最新化します。

```shell
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
$ helm repo update
```

helm install [リリース名] [Chart名] でPodを作成します。

```shell
helm install sample-nginx ingress-nginx/ingress-nginx
```

しばらくすると、Podが起動します。 おー、地獄からの解放じゃ!!!

```shell
$ kubectl get pods
NAME                                                     READY   STATUS    RESTARTS   AGE
sample-nginx-ingress-nginx-controller-6ffc55ddfc-gjn9x   1/1     Running   0          110s
```

さて、Service も確認すると

```shell
$ kubectl describe services sample-nginx-ingress-nginx-controller 

Name:                     sample-nginx-ingress-nginx-controller
Namespace:                default
   :
Type:                     LoadBalancer
IP:                       10.98.218.246
Port:                     http  80/TCP
```

curl 10.98.218.246 をすると、nginxがレスポンス(404ですが&#x2026;)を返していることが確認できます。 もう少し、複雑な Chart も実行してみたいが今日はここまで。
Donald Knuthの不偏分散逐次計算アルゴリズムをPythonで実装してみた

　本稿では、優れた分散の計算アルゴリズムであるDonald Knuthのアルゴリズムを紹介します。分散の計算など普段ライブラリに頼り切りで、そのアルゴリズムなど特に考慮したことなどなかったので、これを機に知識を深められたらと思います。

#不偏分散の公式による計算の問題点
　初めに、なぜこのようなアルゴリズムが必要なのかについて紹介します。不偏分散は、以下の数式で表されます。

```math
\sigma^2 = \frac{1}{n(n-1)} \biggl(\sum_{i=1}^{n}x_i^2-\Bigl(\sum_{i=1}^{n}x_i\Bigr)^2\biggr) =\frac{1}{n-1}\Bigl(E[X^2]-E[X]^2\Bigr)
```
さて、ここでは2つの累積和が登場しています。1.$x$自身の累積和、および2.$x^2$の累積和です。このときの問題として、大きく分けて２つ考えられます。まず一つ目は、$x$が非常に大きな数のとき、数値計算の正確性が保証されないことです。2つ目は、サンプルが増えたときに再度大規模な計算を行わなければらならないことです。これらの課題を解決するため、次節でDonald Knuthのアルゴリズムを見ていきましょう。

#Donald Knuthの逐次計算アルゴリズム
　前述した課題を解決するために、逐次的に分散を計算するように設計されたのがこのアルゴリズムです。以下にアルゴリズムを示します。$M_k$は平均を表し、$s_k$は分散の分子となります。

初期化:$M_1=x_1, S_1 = 0$
$k \geq 2$において以下の漸化式を計算

```math
\begin{align}
M_k &= M_{k-1} + \frac{(x_k - M_{k-1})}{k}\\
S_k &= S_{k-1} + (x_k - M_{k-1})*(x_k - M_k)
\end{align}
```
求める不偏分散の推定量は$k \geq 2$において$s^2 = S_k/(k-1)$となります。

#Pythonでの実装
先ほどのアルゴリズムが実際に動くことを確認するためにPythonで実装してみます。漸化式のため、再帰関数で実装することにします。逐次計算されている様子が見られるようにいちいちprint文を挟み確認できるようにしました。

```python
def calc_var(x, k=0, M=0, s=0):
    print('k=', k)
    print('M=', M)
    print('s=', s)
    print('-----------------------')
    if k == 0:
        M = x[0]
        s = 0
    delta = x[k] - M
    M += delta/(k+1)
    s += delta*(x[k]-M)
    k += 1
    if k == len(x):
        return M, s/(k-1)
    else:
        return calc_var(x, k=k, M=M, s=s)

x = [3.3, 5, 7.2, 12, 4, 6, 10.3]
print(calc_var(x))
```

実行結果

```python
k= 0
M= 0
s= 0
-----------------------
k= 1
M= 3.3
s= 0.0
-----------------------
k= 2
M= 4.15
s= 1.4449999999999996
-----------------------
k= 3
M= 5.166666666666667
s= 7.646666666666666
-----------------------
k= 4
M= 6.875
s= 42.6675
-----------------------
k= 5
M= 6.3
s= 49.279999999999994
-----------------------
k= 6
M= 6.25
s= 49.355
-----------------------
(6.828571428571428, 10.56904761904762)
```

実際にnumpyでも平均、分散を計算して比較してみます。キーワード引数ddof=1は不偏分散として計算するためのものです。

```python
import numpy as np
x_arr = np.array(x)
print((x_arr.mean(), x_arr.var(ddof=1)))
```
出力結果

```python
(6.828571428571428, 10.569047619047621)
```

このように逐次的に計算することができました。実際はnumpyよりもpythonの再帰のほうが早いことなどないと思うので自分で実装する機会はないと思いますが、分散の計算アルゴリズムとして優れているにも関わらずあまり知られていないため記事にさせていただきました。皆様の参考になれば幸いです。

#参照リンク
Accurately computing running variance
https://www.johndcook.com/blog/standard_deviation/
firebase functions typescript で @google-cloud/pubsub(@2.5.x) を使う

普通に import して使うと ビルドエラー

```
import { PubSub } from '@google-cloud/pubsub';
# ...

tsc
=> 
node_modules/@google-cloud/pubsub/build/src/v1/publisher_client.d.ts(163,103): error TS2304: Cannot find name 'AsyncIterable'.
node_modules/@google-cloud/pubsub/build/src/v1/publisher_client.d.ts(218,127): error TS2304: Cannot find name 'AsyncIterable'.
node_modules/@google-cloud/pubsub/build/src/v1/publisher_client.d.ts(273,119): error TS2304: Cannot find name 'AsyncIterable'.
node_modules/@google-cloud/pubsub/build/src/v1/subscriber_client.d.ts(202,117): error TS2304: Cannot find name 'AsyncIterable'.
node_modules/@google-cloud/pubsub/build/src/v1/subscriber_client.d.ts(257,109): error TS2304: Cannot find name 'AsyncIterable'.
```

tsconfig.json を修正

```
{
  "compilerOptions": {
    ...
+    "lib": ["ESNext.AsyncIterable"]
  },
  ...
}

```

再ビルド

```
tsc
=>
node_modules/@google-cloud/pubsub/node_modules/@grpc/grpc-js/build/src/call.d.ts(68,5): error TS2416: Property '_write' in type 'ClientWritableStreamImpl<RequestType>' is not assignable to the same property in base type 'Writable'.
   Type '(chunk: RequestType, encoding: string, cb: WriteCallback) => void' is not assignable to type '(chunk: any, encoding: string, callback: (err?: Error | undefined) => void) => void'.
     Types of parameters 'cb' and 'callback' are incompatible.
       Types of parameters 'err' and 'error' are incompatible.
         Type 'Error | null | undefined' is not assignable to type 'Error | undefined'.
           Type 'null' is not assignable to type 'Error | undefined'.
```

...

nodeのtypeが古いと(8とか？）通らないので追加する

```
npm install --save-dev @types/node@latest
```

再ビルド

```
tsc
=>

```

やっと通った。。。何したかったんだっけ？？？？