OmniAICreator/Qiita-1.07M huggingface dataset:
STM32F767でPWMの測定を作てみた。


目的
シェフの気まぐれ
内部タイマーを使いusでオン時間を測る

工夫点　1000の割り算
1000/15=66
66*1.5=100

100,000/1024=97.65625
97.65625*1.024=100

97.65625*0.024=2.234375

97.65625+2.234375=100

97*32/1024=3.03125

97+3=100

結果
The time taken was 84 seconds
The time taken was 84546 seconds
The time taken was 84589 seconds
The time taken was 84590 seconds
The time taken was 84566 seconds
The time taken was 84623 seconds
The time taken was 84557 seconds
The time taken was 84592 seconds
The time taken was 84583 seconds
The time taken was 84580 seconds
The time taken was 84586 seconds
The time taken was 84583 seconds
The time taken was 84598 seconds
The time taken was 84578 seconds
The time taken was 84557 seconds
The time taken was 84 seconds
The time taken was 84577 seconds
The time taken The time taken was 84587 seconds
The time taken was 84 seconds
The time taken was 84576 seconds
The time taken was 84 seconds
The time taken was 84616 seconds
The time taken was 84 seconds

参考


Timer - タイマー時間

https://os.mbed.com/users/okini3939/notebook/timer_jp/


```c++

#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//1000の割り算 だいたい正しい
#define DVI1000(n) ((n>>10)+(((n>>10)*32)>>10))
 
#define HIGH 1
DigitalIn in1(A0);

//タイマーの設定
Timer t;

//in1のオン時間をusで測る　今のところ引数は、無効
int pulseIn(int pin1,int pu1,int timeout1)
{
 
    while(in1 == 0) {}
    
    t.start();
    while(in1 != 0) {}
    t.stop();
    
    return(t.read_us());

}//pulseIn

int main() {
    int pwmco2;

    //PWMでデータ取得
    pwmco2=pulseIn(7 ,HIGH,2000000);
    printf("The time taken was %d seconds\r\n", pwmco2  );
    printf("The time taken was %d seconds\r\n", DVI1000(pwmco2)  );


}//main


```
【Laravelクエリビルダ】データ数をCOUNT関数を用いてカウントする方法

laravelのクエリビルダでデータ数をCOUNT関数を用いてカウントする方法を解説します。
バージョンは6系です。

https://www.kamome-susume.com/enginner-job-change-site/

##ゴール
postsテーブルにあるuser_id数をカウントします。
![スクリーンショット 2021-07-18 0.58.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693248/952ad3f9-330a-6b51-8630-439499a98432.png)

↓
ユーザー数:3

##実際に書いていこう

モデル

```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Post extends Model
{
  public function getCountByUser()
  {
    return DB::table('posts')
            ->selectRaw('COUNT(user_id) AS count_user')
            ->get();
  }
}

```
COUNT関数を使ってユーザー数をカウントしています。

コントローラー

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class PostController extends Controller
{
    public function index()
    {
        $this->posts = new Post();

        $results = $this->posts->getCountByUser();

        return view('posts.index', compact(
            'results',
        ));
    }
}
```

ビュー

```
<table>
    <thead>
      <tr>
        <th>ユーザー数</th>
      </tr>
    </thead>
    <tbody>
    @foreach ($results as $result)
      <tr>
        <td>{{ $result->count_user }}</td>
      </tr>
    @endforeach
    </tbody>
</table>
```

https://www.kamome-susume.com/enginner-job-change-site/
【データベース】トランザクションを張ってみよう


今回はトランザクションを紹介します。

#■トランザクションとは??
データベース操作にて、まとめて実行されるべき一連の処理です。
トランザクションはbeginというSqlを実行することで開始します。
begi後に追加・更新・削除処理を行っても、すぐにDBには反映されません。
これらの変更を反映させるためには、commitを行うことで、トランザクション内の処理を一気に反映させることができます。
また、rollbackを行うことで、処理をすべて取り消すことも可能です。

####begin→トランザクションの開始
-追加処理
-更新処理
-削除処理
####commit 一括反映
若しくは、
####roll back 取り消し

それでは、トランザクションが必要な理由について例を挙げますので、イメージしてみましょう。

##Amazonで商品が購入される流れをイメージ!!

###トランザクションなしの場合
購入者AさんがカゴにA本を入れて決済ボタンを押します。カゴにA本を入れると、
在庫が1->0に減ります。
決済時に間違えてクレジットを決済をしてしまい、エラーになりました。
ここで購入者Aさんがやっぱり購入をやめたとします。
続いて、購入者BさんがA本を検索しても在庫が0のままで購入できなくなってしまいます。

###トランザクションがありの場合
①Amazonにて購入者AさんがカゴにA本を購入。
####この時、update文により、本の在庫は1→0になります。
②クレジットカードによる決済処理を行う。
####決済が失敗した場合、トランザクションを張っているとrollbackできます。そのため、在庫の個数を0→1個に戻す事が可能です。
在庫が減ったままだと困りますよね。
こういった場面でトランザクションは必要になります。

このように
####トランザクションが張られていると、トランザクションの中に書かれた処理は処理が失敗すると元の状態に戻すことができます。
【Laravelクエリビルダ】joinで内部結合し、結合先のデータを取得する方法

laravelのクエリビルダでjoinを用いた内部結合について簡単に解説していきます。

バージョンは6系です。

https://www.kamome-susume.com/enginner-job-change-site/

## ゴール
postsテーブルのuser_idとusersテーブルのidを内部結合する。

postsテーブル
![スクリーンショット 2021-07-18 0.58.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693248/5ef36ec8-7171-c316-1f35-691db71ef1a1.png)

usersテーブル
![スクリーンショット 2021-07-18 0.59.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693248/6ca3fde8-661a-e78f-4670-efd2339d9906.png)
↓

![スクリーンショット 2021-07-18 1.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693248/60ae009f-ccfb-72b5-f7bc-004c31f031f8.png)

内部結合したことにより、postsテーブルのuser_idとusersテーブルのidが一致するようにデータが取得できます。

SQLで書くと以下です。

```
SELECT *
FROM posts
INNER JOIN users
ON posts.user_id = users.id
```

##サンプルコード

モデル(Post.php)

```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Post extends Model
{
  public function getUserNameById()
  {
    return DB::table('posts')
            ->join('users', 'posts.user_id', '=', 'users.id')
            ->get();
  }
}

```

join('テーブル名', '結合するテーブル名.カラム', '=', '結合先のテーブル名.カラム')
これで内部結合ができます。

ちなみに以下のようにも書き換えられます。

```
    return DB::table('posts')
            ->join('users', function($join) {
              $join->on('posts.user_id', 'users.id');
            })
            ->get();
```

詳細はlaravelの公式を参照ください。
https://search.readouble.com/?query=6.x+%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%93%E3%83%AB%E3%83%80

コントローラー(PostController.php)

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class PostController extends Controller
{
    public function index()
    {
        $this->posts = new Post();

        $results = $this->posts->getUserNameById();

        return view('posts.index', compact(
            'results',
        ));
    }
}
```

ビュー(index.blade.php)

```
<table>
    <thead>
      <tr>
        <th>ユーザーID</th>
        <th>ユーザー名</th>
        <th>投稿名</th>
      </tr>
    </thead>
    <tbody>
    @foreach ($results as $result)
      <tr>
        <td>{{ $result->id }}</td>
        <td>{{ $result->name }}</td>
        <td>{{ $result->post_name }}</td>
      </tr>
    @endforeach
    </tbody>
</table>
```
このようにデータが取得できました。
![スクリーンショット 2021-07-18 1.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693248/1171b3cb-9ffd-96a7-89de-6981c7434284.png)

他にもクエリビルダについて解説した記事があるので合わせてチェックお願いします。
参考になりましたら、LGTM・ストックも！

https://www.kamome-susume.com/enginner-job-change-site/
golangで始めるstate machine 

仕事でチャットボットを作る可能性があり、セリフ管理にstate machineが使えるかもということで、golang で state machineを触ってみました。

# state machine とは?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179800/b6ef245f-fa59-bb4a-5751-4e111a829f09.png)

図のように、ある状態からある状態へ遷移するなどの構造を表したものです。
なので、現在のstate -> 遷移可能なstate ->　次のstateの情報をそれぞれのnodeが持つことになります。

尚正式名称は finite state machine と呼ぶ、 state machine は省略形のようです。

# golangでのFSM

https://github.com/looplab/fsm
今回使ったライブラリは上のものです。

## nodeの生成

```go
const (
		start  = "start"
		middle = "middle"
		end    = "end"
		finish = ""
	)

	eventTree := fsm.Events{
		{
			Name: start,
			Src:  []string{start},
			Dst:  middle,
		},
		{
			Name: middle,
			Src:  []string{start},
			Dst:  end,
		},
		{
			Name: end,
			Src:  []string{end,start},
			Dst:  finish,
		},
		{
			Name: finish,
			Src:  []string{finish,middle},
			Dst:  finish,
		},
	}
```

このライブラリはEventという単位で遷移イベントを定義します。
それぞれ、

名
* Src : 遷移元のnode
* Dst : 遷移先のnode

となります。

## state machine の生成
Eventを定義したら、state machineを生成します。
* 初期node名
* 全体のnodeの配列
* コールバック関数(特定のタイミング処理を実行できるもの、今回は省略)

```golang
	ownFsm := fsm.NewFSM(
		start,
		eventTree,
		fsm.Callbacks{},
	)
```

これでstate machineを生成できます。
あとは初期nodeから遷移可能なnodeを指定すると遷移できます。

```go
ownFsm.Current() // start 
ownFsm.Event(start) // start eventが発火し、Dstのnodeへ遷移
ownFsm.Current() // middle
```

## 可視化
この構造を頭の中で毎回書くのは非常にしんどいです。
しかし、このライブラリは、state machine　を可視化する機能がついています。

```
fsm.VisualizeWithType(ownFsm,fsm.GRAPHVIZ)
```

こんな形で、state machineと可視化方式を指定すると、

```
digraph fsm {
    "middle" -> "finish" [ label = "finish" ];
    "end" -> "finish" [ label = "end" ];
    "finish" -> "finish" [ label = "finish" ];
    "start" -> "finish" [ label = "end" ];
    "start" -> "end" [ label = "middle" ];
    "start" -> "middle" [ label = "start" ];

    "end";
    "finish";
    "middle";
    "start";
}
```
可視化のフォーマットに対応した、テキストを生成してくれます。
今回の場合は graphvizを指定したので、
http://www.webgraphviz.com/

上記で生成されたテキストを貼り付けて、generateすると可視化されます。

今回だとこんな感じ

* Name : イベント![スクリーンショット 2021-07-18 0.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179800/79f46230-a843-833e-b190-899e55f39aa1.png)

Eventは矢印の遷移の部分を指しています。


## 最後に
チャットボットで利用する際は、初期位置を変えたstate machineを毎回生成して、Eventを呼び出せばいけそうなのでは？と雑に考えてました。

それでは良いstate machine ライフを。
WindowsPCにDockerを導入

たまに使うWindowsPCでDockerが必要になりました。以前、WindowsにDockerを入れてみた記憶はあったのですが、このPCには入っていなかったので入れてみます。今はWSL2で使えるので便利になったようですね。

# WSL2にバージョンアップ
すでにWSLバージョン１は入ってました。

```:cmd
wsl -l -v
```
でWSLバージョン、ディストリビューションを確認。
![WSLバージョン確認スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/1a72bc5f-4b76-ded7-39b5-110dfe063cc8.png)


```:cmd
wsl --set-version Ubuntu 2
```
でバージョン変換。
エラーがでました。

>Windows の仮想マシン プラットフォーム機能を有効にして、BIOS で仮想化が有効になっていることを確認してください。

「Windowsの機能の有効化または無効化」→「仮想マシン プラットフォーム」、有効化します。
![機能の有効化スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/7540cb34-03e5-0c2b-5356-9183d8cd3f72.png)
![機能の有効化スクショ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/e572dec7-c080-106d-077a-2e9a9f07b680.png)

再起動して、WSLバージョンアップを実行。できました！
![wsl2変換スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/53103f22-c7c8-f3d7-745a-b2bf89f54ae2.png)

# Docker Desktop for Windowsをインストール
こちらより。
https://docs.docker.jp/docker-for-windows/wsl.html

動作条件を確認。
![Docker動作条件.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/9907587d-07b1-6336-b855-4c70d06586ce.png)


念のためUbuntuは入れ直すことにしました。インストール後、WSLバージョン１になっていたので、再度変換。
![Ubuntu入れ直し確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/15036617-b364-0611-b139-aaf9117f8d25.png)
予め、WSL2をデフォルトにしておくとよかったようです。

```:cmd
wsl --set-default-version 2
```

あとはDocker Desktop Installerをダウンロードして実行すれば、無事インストールできました。
![dockerバージョン表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/bad1ef71-887e-3e2c-b8d4-08add620b4c5.png)
SSHで接続した後に特定のディレクトリに移動したい

プロジェクトごとのSSHで、あるサーバにログインした後、デプロイを行っているディレクトリに移動する、というスクリプトを書きたかったです。

```console
$ ssh ssh.example.com -t 'cd tmp; bash --login'
```

`cd`コマンドを`ssh`の引数として渡すと`cd`が実行された後に`ssh`コマンドが終了してきて戻ってきてしまいます。

`-t`オプションを付けて`ssh`を起動し、`cd` した後に `bash --login` をすると`cd`が終了した後に`bash`が起動され、引き続きターミナルを使うことができます。

`-t`は`Force pseudo-terminal allocation.`となっており、擬似端末（PTY）を強制的に割り当てるため、`bash --login`がPTY上で`cd`したセションが残ります。
OpenSSHのProxyJump（-J）オプション（多段SSH/踏み台用）は主要OSで使える、この用途でのProxyCommandオプションは捨てよう

# TL;DR

- 多段SSHする場合は`ProxyJump`コマンドで統一してOK
- この用途において`ProxyCommand`オプションはもはや過去の産物
- 指示書やガイドなどを作成している場合は修正しましょう

# 多段SSHについてざっくり

インターネットからはアクセスできないLAN内のホストにSSHしたい場合に、LANとインターネットの両方に所属しているホスト（踏み台）を経由することで接続できます。踏み台には、ターゲットホスト同様OpenSSHサーバさえインストールされていればOKです。
さらに、自PC→インターネット→踏み台1→LAN1→踏み台2→LAN2→・・・→踏み台N→LAN N→ターゲット　のように多段にすることもできます。

# ProxyJumpオプションについて

OpenSSH 7.3から利用可能です。
ただしWindowsでは、[バグ](https://github.com/PowerShell/Win32-OpenSSH/issues/1172)のせいで8.0から利用可能です。

具体的には、

- Windows10→21H1から
- Ubuntu→17.04から
- macOS→10.12 Sierraから
- CentOS・RHEL→7から

です。POSIX系は2017年あたりから、今では腐敗臭のするバージョン（Ubuntu 18.04・CentOS/RHEL7）含めて対応していましたが、Windowsではつい最近まで対応していませんでした。
本来は20H2のタイミングで対応するはずでしたが、MSの人がOpenSSHの更新をサボっていたのでお預けになっていました。（どうしてもという人は、Chocolatey等を使って最新版を入れなければなりませんでした）
この度の21H1にて、OpenSSHが更新され、ついに他OSに追いつきました。

使い方は、以下のように、踏み台・ターゲットのホストへの接続設定を定義した後、ターゲット側の設定に`ProxyJump 【踏み台ホスト名】`を加えます。

```
Host 【踏み台ホスト名】
IdentityFile 【秘密鍵へのパス、他のオプションも同様に指定】
Host 【ターゲットのホスト名】
IdentityFile 【秘密鍵へのパス、他の一般オプションも同じように指定】
ProxyJump 【踏み台ホスト名】
```

コマンドでは、`ssh 【ターゲット】 -J 【踏み台】`のように指定します。

# 従来の方法

従来は`ProxyCommand`オプションを使います。`ProxyJump 【踏み台】`は、

```
ProxyCommand ssh -W %h:%p 【踏み台】
```

と同様です。コマンドでは専用のオプションがないため、

```
ssh -oProxyCommand='ssh -W %h:%p 【踏み台】' 【ターゲット】
```

と書かざるを得ませんでした。冗長ですね。`ProxyCommand`は今後SSH以外の方法でSSH通信を中継しなければならない時だけに用途が縮小します。


# 指示書やガイドへの影響

SSHに詳しくない人のために説明を書く場合、従来は`ProxyCommand`を使った方法を最低でも併記しなければなりませんでした。
しかし、Windowsが公式対応したため、`ProxyCommand`には触れず、`ProxyJump`だけ書けばよくなりました。
指示書やガイドを管理している場合、ぜひとも修正しましょう。
【備忘録】改行コード「CR」「LF」「CRLF」の違い


```
■改行コード　それぞれの違い、役割
```

◆業務内(IT時の膨大なDBデータの各テーブルの件数を条件付きで取得するselect文を作成する際、Excelからサクラエディタに貼り付けて改行コードを入れる作業があった。
そのときに改行コードの種類や役割の違いがそれぞれあることに改めて気づき、今後も必要な概念であるため、備忘録として残しておく。

★「CR」…　Carriage Return（キャリッジリターン）
英語で復帰を意味する。
行頭回帰（先頭へ戻る）（←）。

★「LF」…　Line Feed（ラインフィード）
英語で「改行」を意味する。
カーソルを新しい行に移動させる。（↓）

★「CRLF」…　そのまま。（CR+LF)
カーソルを左端に移動して、次の行に改行する。（↵）

以下の表記（サクラエディタ）で覚えておこう。
CRLF　：　↵
CR　　：　←
LF　　：　↓

また、面倒くさいのがＯＳによっても改行コードが異なること。（統一されていない）

LF･･･UNIX系（Linuxなど）
CR･･･MacOS（バージョン9まで）など
CR+LF･･･Microsoft Windows等


また、サクラエディタでよく用いる正規表現に「\r\n」（貼り付けたデータを改行して表示できる）があるが、
それに対応して覚えておくとよい。

LF…　\n（単なる改行）
CR…　\r（左端にカーソルを回帰）
CRLF…　\r\n（改行してカーソルを左端に回帰）

★まとめ

今回、業務ではExcel関数を用いて大量のデータ取得SQLを作成する必要があった。
そのため、今回のような改行コード、また文字コードなどなんとなく雰囲気でしか理解できていなかった知識を改めて入れ直すことが大事だと感じた。

改行コードに関しては、サクラエディタは業務で今後も必ず使用するため、説明できるように知識は落とし込んでおくようにする。

以上
CLI環境の初期セットアップ (macOS)

# この記事のゴール

![terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/34d47a74-9851-31ea-c209-448ab982b0f2.png)

# 概要

自分用の初期セットアップメモです。
使用するものは下記の通りです。

- iTerm2
  - Monokai Soda (※テーマ)
- zsh
- prezto (zshのフレームワーク)
  - powerlevel10 (※テーマ)
- exa

# 手順

## iTerm2

### インストール

iTerm2を公式サイトからDLし、インストールします。

https://iterm2.com/

### テーマの設定

`Monokai Soda`というテーマにします。

https://github.com/mbadolato/iTerm2-Color-Schemes/blob/master/schemes/Monokai%20Soda.itermcolors

`iTerm2 > Preferences > Profiles > Colors`でitermcolorsファイルをインポートします。
文字の大きさやターミナルの透明度もついでに設定しておきましょう。

## zsh

macOS Catalinaからはzshがデフォルトのシェルになっているはずです。

後からpreztoをインストールするのですが、動作保証されるzshの最低バージョンが4.3.11(2021/07/17現在)となっています。preztoのGitHubで動作保証バージョンを確認した上で、自分のMacに適切なバージョンのzshがインストールされていることを確認しましょう。

## prezto

preztoはzshのフレームワークです。シェルを使いやすくする設定を楽にやってくれて大変便利です。

https://github.com/sorin-ionescu/prezto

まずは公式に書いてある通りの手順でインストールします。
インストールが終わったら、デフォルトだとEDITORがnanoになってしまうので、嫌な人は変えておきましょう。

```
vi ~/.zprofile
```

```diff:.zprofile
  #
  # Editors
  #
- export EDITOR='nano'
+ export EDITOR='vim'
- export VISUAL='nano'
+ export VISUAL='vim'
  export PAGER='less'
```

次にモジュールを追加します。
gitはgit用の短縮エイリアスを追加してくれます。あとはシンタックスハイライトと、入力補完です。

```sh
vi ~/.zpreztorc
```

```diff:.zpreztorc
  # Set the Prezto modules to load (browse modules).
  # The order matters.
  zstyle ':prezto:load' pmodule \
+   'git' \
    'environment' \
    'terminal' \
    'editor' \
    'history' \
    'directory' \
    'spectrum' \
    'utility' \
    'completion' \
    'history-substring-search' \
+   'syntax-highlighting' \
+   'autosuggestions' \
    'prompt'
```

テーマも変更します。powerlevel10kは素晴らしいテーマです。

```diff:.zpreztorc
  # Set the prompt theme to load.
  # Setting it to 'random' loads a random theme.
  # Auto set to 'off' on dumb terminals.
- zstyle ':prezto:module:prompt' theme 'sorin'
+ zstyle ':prezto:module:prompt' theme 'powerlevel10k'
```

ターミナルを再起動したらpowerlevel10kの初期設定が始まります。お好きなように設定しましょう。
このpowerlevel10kの設定時に、`MesloLGS NF`というフォントがインストールできます。iconが豊富なのでインストールしておきましょう。

## exa

lsの代替としてexaを入れましょう。

https://github.com/ogham/exa

```
brew install exa
```

入れた後、お好みでエイリアスを追加します。
lsを上書きするのはパイプで繋いだシェルとかで失敗しそうで怖いので、`la`等で見れるようにしておきます。

```
vi ~/.zshrc
```

```
alias l='exa --icons'
alias ll='exa --icons -l'
alias la='exa --icons -la'
```

# dotfilesで管理する場合

preztoを利用するけどdotfiles管理もしたいという場合は、↓の記事が参考になります。

https://ayatk.hatenablog.com/entry/2019/09/17/215438
Django勉強日記２　～Windows10にUbuntu環境～

#はじめに
ちょっと最近環境構築トラブルなどありまして、Qiitaを開けてなかったです。
とりあえず今日はちょっと久しぶりの投稿というのもあるので、勉強したことと言うよりDjangoを使うにあたって行った環境構築系のことについて話そうと思います。勉強したことに関してはまた、整理して投稿します。

#なぜインストールするのか
なぜWIndows10にUbuntu環境を入れるのか。
どうやら、コードを公開する際などは、LinuxやUnixがインストールされた環境がメジャーのようです。Ubuntuは比較的誰でも使いやすいみたいなので、今回は本番を想定として、Ubuntu環境で開発を行えるように環境構築をしていきます。Windows10の場合は、wsl(windows subsystem for linux)というものがあるので非常に簡単に使えるようになるみたいです。



#Winsdows10にUbuntu(wsl)のインストール
WIndowsにUbuntuをインストールしてみます。
MicrosoftStoreからUbuntu 18.04LTSをインストールします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740860/aaa02291-d3ee-6fb6-df61-2a52d6289a11.png)

インストールが完了したら実際に起動してみましょう。
・UNIX username
・UNIX password
の設定が終わったら設定は終了です。

#VisualStudioCodeとwslのつなぎこみ
次はVisualStudioCodeとwslのつなぎこみをしてみます。
VisualStudioCodeの左下の歯車を押してSettingを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740860/b3a9df9c-f467-5885-ed25-fb8f3fce8f12.png" width=50%>

すると、下の画像のような画面に遷移します。そうしたら上のテキストボックスに「shell」と打ち込んでください。Terminal > Integrated >Automation Shell : Windowsの下の「Edit in setting.json」を選択します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740860/965df396-70d5-396f-d27d-09cf8260ecc7.png)
そしたらそのjsonファイルの中に

```
{
"terminal.integradted.shell.windows": "C:\\Windows\\System32\\bash.exe"
}
```

このコードを打ち込んでください。もし中に何かデフォルトで書いてあったら上書きして大丈夫だと思います。私はそれで行けました。

これで設定は終わりです！！

#おわりに
今回は環境構築編でした。現在Django勉強中でなかなかこちらが追い付いてませんが適宜アウトプットしていこうと思います。
Dialogflowで独自に販売のチャットボットを作成<する（第三部）

<b>（子インテントを作成する）</b><br>
<a href="https://qiita.com/ints/items/f566ce3eabe551b9bd0a">第一部はこちらです</a>　　　<a href=" https://qiita.com/ints/items/327d8263701af2b1e9af">第二はこちらです</a><br>
<p>チャットボットがユーザーの以前の回答からの情報を記憶するためには、子インテントを定義する必要があります。そうすると、親インテントからの情報が子インテントに渡され、チャットボットはそれに基づいて、販売用の適切な質問を提供します。</p>

<p><a href="https://qiita.com/ints/items/327d8263701af2b1e9af">第2部</a>では、ミルクに関するアドバイスが要求されるときにユーザーのリクエストを処理するためにiアドバイスというインテントを作成しました。チャットボットは、「Frisolac GoldとNan NestleとPhysiolacとMorinagaとMeijiどちらが欲しいですか」というレコメンデーションを挙げます。ユーザーがミルクの種類（例え：Meji）を選べると、チャットボットは「価格と販売場所がどちらを知りたいでしょうか？」というヒントを挙げ続けます。これを行うには、まず、インテントリスト管理画面で「フォローアップインテントの追加]を選択して、iアドバイスのインテントから子インテントを作成して、プールダウンメニューにカスタムを選択して、この子インテントに「iアドバイス- Meji」という名前を付けます。</p>

<p><b>iアドバイス – Meji</b><br>
<b>トレーニング フレーズ：</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	Mejiミルクについてお聞きしたいです。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	Mejiですか？<br>
<b>レスポンス:</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	価格と販売場所がどちらを知りたいでしょうか？
</p>
次に、「iアドバイス - Meji」の二つの子インテントを作成する必要があります。二つの子インテントの機能は、価格と購入場所についてアドバイスです。「iアドバイス-Meji」のインテントを作成する方法のように「iアドバイス - Meji- 価格」と「iアドバイス - Meji - 場所」という二つの子インテントを作成します。

<p><b>iアドバイス - Meji - 価格</b><br>
<b>トレーニング フレーズ：</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	いくらですか？<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	一箱はいくらですか？<br>
<b>レスポンス:</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	はい、Meji  900gの1箱は1000円 です。</p>

<p><b>iアドバイス- Meji- 場所</b><br>
<b>トレーニング フレーズ：</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	どこで売りますか？<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	どこで買えますか？<br>
<b>レスポンス:</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;•	はい、Mejiミルクは全国のスーパーにあります。</p>

<p>これで、「Meji」ミルクの最初のインテントのブランチが完成しました。同様に、他のミルクの種類のインテントを作成できます。このパートの終わりに、インテントの概念について一緒に学び、それを具体的な例に適用しました。次のパートでは、Dialogflowの他の重要なコンポーネントであるEntityについて引き続き説明します。Entityはチャットボットはユーザーの意図を理解し、定義した各インテントに従って適切な回答を提供できるの役割です。</p>
<a href="https://qiita.com/ints/items/f566ce3eabe551b9bd0a">第一部はこちらです</a>　　　<a href=" https://qiita.com/ints/items/327d8263701af2b1e9af">第二はこちらです</a><br>
(<a href="https://ints.vn">INTS株式会社　開発部　レー・ジャン)
Railsでvpc endpointを利用してsesからメールを送信する

# 環境

- Ruby 2.7.2
- Rails 6.1.3
- terraform 1.0.2

# やりたいこと

- private subnet 内にある ECS fargate から AWS SES を利用してメールを送信する

# VPC endpoint

private subnet 内に ecs インスタンスを作った場合 NAT gatway などを利用しないと AWS SES に接続できません。

ただし、private subnet 内に VPC endpoint を設置することで AWS サービスとプライベートにアクセスができます。

現状、ses の vpc endpoint は ses-smtp-endpoint のみが対応してます。

# Rails

aws 公式で aws-adk-rails gem がありますが、SES との接続は HTTPS を利用しているので vpc endpoint を利用して接続できません。ですので、VPC endpoint を利用して SES からメールを送信するには action_mailer の smtp 設定を行うことで通信できます。

```ruby:config/environments/production.rb
  config.action_mailer.default_url_options = { host: ENV['AWS_DOMAIN'] }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_caching = true
  ActionMailer::Base.smtp_settings = {
      :address =>        "email-smtp.ap-northeast-1.amazonaws.com",
      :port =>           587,
      :domain =>         ENV['AWS_DOMAIN']
      :authentication => :login,
      :user_name =>      ENV['AWS_SMTP_ACCESS_KEY_ID'],
      :password =>       ENV['AWS_SMTP_SECRET_ACCESS_KEY'],
  }
```

`ruby:.env AWS_DOMAIN = #SESに紐付いているドメイン名 AWS_SMTP_ACCESS_KEY_ID=#SMTP認証で得たアクセスキー AMS_SMTP_SECRET_ACCESS_KEY=#SMTP認証で得たシークレットキー `

これで SES の SMTP 　 VPC 　 endpoint を利用してメールを送信できます。

# 参考

[【Rails】ActionMailer + AWS SES](https://qiita.com/syukan3/items/7f33a8cbd3c0301cd6f1)
[Amazon SES SMTP 認証情報を取得](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html)
1日の二酸化炭素濃度の変遷をGoogle Data Portalにグラフ表示

二酸化炭素濃度の変遷をポータルで表示できるようにしました。
現在の値はスコアカードで表示されているものの変遷も見たかったので、グラフ化しています。

![portal_7_co2graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/85be3eae-5990-71ad-9e6e-2ddfb8b492a0.png)

#### 前提
* Google Data Portalにベースとなるレポートがあること (詳細は以下ページ参照)

https://qiita.com/tosshie/private/bc43114d42e05bc3afcb

* Google SpreadSheet に二酸化炭素濃度がリアルタイムに更新されていること (詳細は以下ページ参照)

https://qiita.com/tosshie/items/fe79368c6ef75df3736c


#### Google Data Portal側の設定
* Google Data Portalを開きベースとなるレポートを表示
* 右上の編集ボタン
* メニューのデータを追加 → Google SpreadSheetからCO2データを表示するシートを選択 → 追加 → レポートに追加
* メニューのリソース → 追加済みのデータソースの管理 → 追加したものの編集ボタンをクリック
* 値を以下のように変更し完了ボタンを押す → 閉じる
    * co2データ
        * タイプ: 数値
        * デフォルトの集計: なし
    * 日付データ
        * タイプ: 日付、時、分
        * デフォルトの集計: なし
* グラフを追加 → 期間 → 時系列グラフ → 配置
* メニュー（右側に出ているプロパティ的な部分）を変更
    * 指標にco2データを選択（私の場合は2か所分のデータを指定）
        * Record Countは削除
    * ディメンションをdate(日付)からdate(何も書いていないやつ)へ変更
        * できなかった人はこちら↓
            * データソースを一度削除→ディメンション：ディメンションが無効ですにdateをドラックアンドドロップで指定（しても表示は変わらない）→ 再度データソースを指定
        * グラフには行数が多すぎますと表示されています
    * 期間のディメンションへ使用可能な項目からdate(何も書いてないやつ)をドラックアンドドロップ
        * date(日付)が期間のディメンションに表示される
        * グラフには行数が多すぎますと表示されています
    * デフォルトの日付範囲をカスタム指定 → 期間で今日を選択（カレンダーが出てくる画面の右上のところで指定）
        * ここで今日のグラフが出てきます
    * スタイルタブに移動
    * 全般 → 欠落データ → "線を途切れさせる"
    * X軸 → カスタム目盛り間隔を360に指定 (4時間毎のX軸目盛から6時間に変更しています)
    * 背景と枠線 → 背景 → グレーを指定

これで完成！



----

スコアカードでの表示方法はこちらの記事に記載しています

https://qiita.com/tosshie/items/19f87cc86919a0349c0b

----------

2021年3月から始めたスマートホーム化はこちらに一覧化しています（2021年7月時点）

https://qiita.com/tosshie/items/82dcc6405925b12d2fd1
残プロ　第-46回　~シンボリックリンクで自作プログラムを扱いやすくする~

# mklink

自作プログラムを作ったはいいものの，いちいちフォルダ移動・実行としていたら利便性が失われてしまいます．
そこで，今回は自作ファイルへのシンボリックを作成しアクセス性を高めます．

~~~ terminal:コマンドプロンプト
C:\Users\usename\> mklink utils\hoge.py C:\Users\username\Document\Script\Python\hoge.py
~~~

以上のコマンドでホームディレクトリ下のutilsフォルダに，hoge.pyのシンボリックリンクが作成できます．
[MVC]ファイル生成について

# 初めに
不安だったMVCのファイル生成について理解が深まったので、
本記事に簡単にまとめてみました。

# MVCとは
`Rails`で登場する
M・・・モデル（データベースと連携する役割）
V・・・ビュー（ブラウザ上の表示画面を作る役割、HTMLも作る）
C・・・コントローラー（アクションを行う。これに尽きると思っています）

の総称。
Webアプリケーションの処理の構造を表しています。
*本記事はルーティングのことも記述します。


#疑問だったこと
1. それぞれのファイルは`どこに`生成・作成するのか。
1. `どのような種類`ファイルを生成・作成するのか。

# 調べた結果
###`どこに`
app→MVCの各ファイル
config→ルーティング

・appにアプリに直接関わる記述
・configにアプリのオプションの記述

`config`は`設定`という意味で
前述の通り、あくまでオプションの役割であることから、
`ルーティングはMVCには入っていない`と思います。


### `どのような種類`

**[モデル]**
テーブルごとに作成する。

（例）テーブル[user,tweet,comment]
user.rb
tweet.rb
comment.rb


**[ビュー]**
ページ表示が必要なアクションごとに作成

（例）ページ表示必要箇所[user,tweet]
*tweet*
create.html.erb
destroy.html.erb
edit.html.erb
・
・
・

**[コントローラー]**
テーブルやモデルごとに作成

（例）テーブル[user,tweet,comment]
users_controller.rb
tweets_controller.rb
comment_controller.rb

**[ルーティング]**
基本的に１つ！！
１つのファイルに７つのアクションを記載する。

# 終わり
MVCを理解する上で、
まずここから理解することにしました。
このポイント達を抑えながら、先の学習に進みたいと思います。
特に、`コントーラーがアクションを行う`ということをちゃんと理解できた時には、
さらにプログラミングが楽しくなりました！！
引き続き頑張ります。
PlantUML が Qiita でつかえたんですね

# PlantUML が Qiita でつかえたんですね

いや～便利べんり。

```
```plantuml
participant participant as Foo
actor       actor       as Foo1
boundary    boundary    as Foo2
control     control     as Foo3
entity      entity      as Foo4
database    database    as Foo5
collections collections as Foo6
queue       queue       as Foo7
Foo -> Foo1 : To actor 
Foo -> Foo2 : To boundary
Foo -> Foo3 : To control
Foo -> Foo4 : To entity
Foo -> Foo5 : To database
Foo -> Foo6 : To collections
Foo -> Foo7: To queue
```

```plantuml
participant participant as Foo
actor       actor       as Foo1
boundary    boundary    as Foo2
control     control     as Foo3
entity      entity      as Foo4
database    database    as Foo5
collections collections as Foo6
queue       queue       as Foo7
Foo -> Foo1 : To actor 
Foo -> Foo2 : To boundary
Foo -> Foo3 : To control
Foo -> Foo4 : To entity
Foo -> Foo5 : To database
Foo -> Foo6 : To collections
Foo -> Foo7: To queue
```
GitHub Actions の YAML で RUN にコメントを入れる

<h1>Workflow の <code>RUN</code> 内でコメント行を入れたい</h1>

> GitHub Actions の Workflow で、YAML の `run` ディレクティブ（指示子）でコメントを入れたい（`# コメント` 行を挿入したい）がエラーが出る。

["`github` `actions` `yaml` `comment`" でググって](https://www.google.com/search?q=github+actions+yaml+comment)も `run` 内でコメントを扱う方法がなかなかヒットしなかったので、自分のググラビリティとして。

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

- シェルの `:` と `#` オペランドを使う

```diff:"true"を返すだけのコマンド（コロン）を実行してコメントを付ける
- run: echo "foo bar"
+ run: |
+   : # Sample
+   echo "foo bar"
```

```yaml:具体例
# Sample workflow
on:
  push:
    branches: ['main']
  schedule:
    # Run at AM 03:00 on every Monday
    - cron:  '0 3 * * MON'

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      # Check the : and # at the run
      - name: Get date and version
        id: info
        run: |
          : # Get current date (YYMMDD)
          echo "::set-output name=date::$(date +'%Y%m%d')"
          : # Get latest git tag as a version
          ver_long="$(git describe --tags)"
          ver_short=$(git describe --tags | grep -o -E "([0-9]+\.){1}[0-9]+(\.[0-9]+)?" | head -n1)
          echo "::set-output name=ver_long::${ver_long}"
          echo "::set-output name=ver_short::${ver_short}"

      - name: Print version
        run: |
          echo "Ver(short): ${{ steps.info.outputs.ver_short }}"
          echo "Ver(long) : ${{ steps.info.outputs.ver_long }}"
          echo "Build date: ${{ steps.info.outputs.date }}"
```

## 参考文献

- [何もしない組み込みコマンド ":" （コロン）の使い道](https://qiita.com/xtetsuji/items/381dc17241bda548045d) @ Qiita
- [`:` colon command for bash](https://superuser.com/questions/423980/colon-command-for-bash) | superuser.com @ StackExchange

## 関連文献

- [How do I add a comment in GitHub action YML file?](https://stackoverflow.com/a/68421196/8367711) @ StackOverflow
- [文字列からバージョン情報だけを抜き出す正規表現（bash/dash/ash/zsh で grep）](https://qiita.com/KEINOS/items/b59badbc668480507707) @ Qiita
- [GitHub Actions の Workflow 内でグローバル変数を使う（RUN ステップ間で変数を共有する）](https://qiita.com/KEINOS/items/145973e868ba72d716dc) @ Qiita
PEP 657 (Include Fine Grained Error Locations in Tracebacks) を読んだよメモ

先日、[PEP 657 (Include Fine Grained Error Locations in Tracebacks)](https://www.python.org/dev/peps/pep-0657/) が [Final になったという PR](https://github.com/python/peps/pull/2032) を見かけました。
そして、cpython に実装が取り込まれていることが確認できたので、あらためて紹介しようと思います。

## 概要

* 1行で複数の処理をしている箇所でエラーが発生した際に、どの処理でエラーが発生したのか表示する
* 表示を改善するため、Python のバイトコード命令(bytecode instructions)に(行番号に加えて)オフセット情報を追加する
* バイトコードのサイズが約 20% 増加する (標準ライブラリでの計測値)。.pyc ファイルと消費メモリに影響する
* 環境変数 `PYTHONNODEBUGRANGES` やコマンドラインオプション `-Xno_debug_ranges` で無効化できる

## アプローチ

以下の内容のスクリプトを用意しました。2行目では多段インデックスアクセスを行っていますが、値が入っていないので TypeError が発生します。

```python
d = dict(x=None)
d['x']['y']['z'] = 1
```

このスクリプトを Python 3.9.5 で実行すると `TypeError` が発生し、以下のようなエラーが表示されます。

```bash
$ python -V
Python 3.9.5
$ python test.py
Traceback (most recent call last):
  File "/Users/tkomiya/test.py", line 2, in <module>
    d['x']['y']['z'] = 1
TypeError: 'NoneType' object is not subscriptable
```

同じスクリプトを Python 3.11.0 (開発版)で実行すると、エラーが発生した箇所にアンダーラインが表示されます。

```bash
$ python3.11 -V
Python 3.11.0a0
$ python3.11 test.py
Traceback (most recent call last):
  File "/Users/tkomiya/test.py", line 2, in <module>
    d['x']['y']['z'] = 1
    ~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
```

なお、Python を対話モードで起動した場合はこの機能は動かないようです。

```python
$ python3.11
Python 3.11.0a0 (heads/main:919ad53, Jul 16 2021, 11:07:03) [Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> d = dict(x=None)
>>> d['x']['y']['z'] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable
```

## 感想

* エラー表示がかっこよくなったのはめちゃくちゃ素敵。はやく 3.11 使いたい
* この修正はバイトコードへの属性追加であるため、エラー以外にも用途が広がる可能性はありそうです。IDE、デバッガなどでも対応してくれるとよさそう
* pytest が対応してくれるといいなあ
Git  クローンしたリポジトリ[ローカル]を別リポジトリ[リモート]にpush


題名の通り、
クローンしたリポジトリ[ローカル]を別リポジトリ[リモート]にpushするやり方を知ったので
アウトプットしていこうと思います。

#流れ[図]
![Untitled (Draft)-1 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/9aaf0d0c-ff2d-3d70-09ef-bddc90feb6ec.jpeg)


###■クローン

```
$ git clone -b main https://github.com/kazuya424/testproject.git test
```


###■作成したtestフォルダに移動

```
$ cd test
```

###■remote urlの確認

```
$ git config remote.origin.url
https://github.com/kazuya424/testproject.git
```


###■remote urlの変更

```
$ git remote set-url origin https://github.com/kazuya424/test.git
```


###■再度remote urlの確認

```
$ git config remote.origin.url
https://github.com/kazuya424/test.git
```

###■ブランチ作成

```
$ git branch -M main
```

###■ブランチ確認

```
$ git branch
* main
```

###■push
```
$ git push -u origin main
Username for 　ユーザーネーム入力
Password for 　パスワード入力
Counting objects: 3, done.
Writing objects: 100% (3/3), 243 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/kazuya424/test.git
 * [new branch]      main -> main
Branch main set up to track remote branch main from origin.
```


#追加(testリポジトリ[ローカル]を変更し、pushまで)
今回用いるエディタはVSCode。
上記で作成したtestフォルダを開く。

VSCodeで「新しいターミナル 」を開く。

push先がtestリポジトリか確認し、異なる場合は変更。

```
$ git config remote.origin.url
https://github.com/kazuya424/testproject.git

$ git remote set-url origin https://github.com/kazuya424/test.git

$ git config remote.origin.url
https://github.com/kazuya424/test.git

```

###■ブランチ作成

```
$ git branch develop
```

###■developブランチに移動

```
$ git checkout develop
```

###■ブランチ確認

```
$ git branch
```

###■内容変更
あとはお決まりのプッシュまでの流れ

```
$ git status

$ git add.

$ git commit -m “コミット名”

$ git push origin develop
```

###参考

[https://k-koh.hatenablog.com/entry/2020/10/09/154644](https://k-koh.hatenablog.com/entry/2020/10/09/154644)
Windows11にしたらWSL上でWindows(/mnt/c 以下)がマウントされなくなる問題

Windows Insider Programにて一足先にWindows11を試していたら、Windows10のときから使用していたWSLでWindowsのフォルダを確認できなくなった。
なお、WSLを起動するたびにこんな文字も出ていた。

``` wsl:wsl
ファイル システムの 1 つをマウント中にエラーが発生しました。詳細については、「dmesg」 を実行してください。
```

WSLの状況としては/mnt/c以下に何も入っていない状態（アンマウント）になっている。

問題解決にいろいろな記事を探したが、現時点で同様のエラーは見つからず、最終的にはWSLをアップデートすることで解決することができた。

PowerShell(管理者)で以下のコマンドを実行する。

```powershell:powershell
wsl --update
```

するとWSLがアップデートされ、再起動が要求されるので、以下のコマンドを実行したあとにWSLを実行すると、無事にWindows10と同じ状況に戻すことができた。

```powershell:powershell
wsl --shutdown
```
Azure VNet のグローバルピアリング時には Basic Load Balancer に注意する

# 3行で
:::note info
 ・ グローバル VNet ピアリングは異なるリージョンでのピアリングを指す
 ・ Basic Load Balancer は同じリージョン内の分散のみサポートするためグローバルピアリング経由の通信はできない
 ・ そのため、Basic Load Balancer が内部で利用されているサービスはグローバルピアリング経由の通信はできない
:::

# はじめに
VNet ピアリングをする際には、ピアリングしようとする2つの VNet が同一リージョンなのか異リージョンかは意識せずに設定ができます。

あまり難しいことを考えずに設定できる点がとてもありがたい仕様なのですが、異なるリージョン間の VNet アピリング( グローバル VNet ピアリング)は制約が存在します。

この制約を理解した上で設計・利用しないと、設定はできてしまうため「いざ、接続テスト！！！」という場面で転んでしまうため注意が必要です。

ドキュメントを読むとしっかり記載されているので、パブリッククラウドに慣れた注意深い人は利用前に”制約”、”制限”などのキーワードでググっているので引っかからない、、、、のですが、備忘兼ねて下記のドキュメントのポイントを本投稿では記載します。

https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-network-manage-peering#requirements-and-constraints

# 制約の中身①( Basic Load Balancer そのものをユーザが利用するケース)

> 仮想ネットワーク内のリソースは、グローバルにピアリングされた仮想ネットワークの Basic 内部ロード バランサーのフロントエンド IP アドレスと通信することはできません。 Basic Load Balancer のサポートは、同じリージョン内でのみ存在します。

”Basic 内部ロード バランサーのフロントエンド IP アドレスと通信できない” という記載が少し難しいですが、Basic Load Balancer を介さずに直接アクセスできるもの( VM )は大丈夫、ということですね。
ただ、Basic Load Balancer のフロントエンド IP に通信できないのでグローバルピアリング経由では分散は機能はしないということに。

それでは困る方は、Standard Load Balancer を利用するようにしましょう。

# 制約の中身②( Basic Load Balancer を Azure サービス内部で利用しているケース)
自分で設計する範囲においてBasic Load Balancer を利用している場合は、Standard Load Balancer に変えることで制約から逃れることができますが、Azure サービス内部で Basic Load Balancer が利用されている所についてはこちらでは変えられないので仕様を許容できない場合は、処理パターンを変えなければなりません。（例えば、Push型からPull型に変えて通信の向きを変える）

Basic Load Balancer を使用するサービスは下記ドキュメントに記載されています。

https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq#what-are-the-constraints-related-to-global-vnet-peering-and-load-balancers

> ・Basic Load Balancer の背後にある VM
・Basic Load Balancer を使用する仮想マシン スケール セット
・Redis Cache
・Application Gateway (v1) SKU
・Service Fabric
・API Management
・Active Directory Domain Service (ADDS)
・Logic Apps
・HDInsight
・Azure Batch
・App Service Environment

App Service Environment が対象になっているため、ASE上で使っているサービスも該当する点注意してください。

そのうち解消されると信じて利用者は待つしかないので、今はハマらないように耐えましょう・・・！
FactoryBotを使用したItemモデルの単体テストコード

# What
- フリマアプリの商品出品機能の実装
- Itemモデルの単体テストコード

# Why
- 商品出品情報の登録を行うため
- 必要な情報を適切に入力すれば商品を出品できること、そのほかの場合は出品できないことを確認するため

# ActiveRecordで管理している画像の添付に関する定義
```
FactoryBot.define do
  factory :item do
    item_name             { 'パソコン' }
    explanation           { '3年前に購入したMacBookです' }
    category_id           { 2 }
    condition_id          { 2 }
    delivery_cost_id      { 2 }
    prefecture_id         { 2 }
    days_delivery_id      { 2 }
    price                 { 50000 }

    association :user

    after(:build) do |item|
      item.image.attach(io: File.open('public/images/sample.jpeg'), filename: 'sample.jpeg')
    end
  end
end
```
itemsテーブルで管理している情報はfactory item doにて定義することができるが、
imageはそこに一緒に記述しても定義することができない。

つまり、文字列だけ記入しても画像が添付されていることにならないので、
サンプル画像を登録する必要がある！

# 解決法
publicディレクトリの配下にimagesディレクトリを作成する。
その中に、サンプル画像を設置。
今回の場合、public/images/sample.jpegとなる。

```
after(:build) do |item|
      item.image.attach(io: File.open('public/images/sample.jpeg'), filename: 'sample.jpeg')
end
```
上記のようにspec/factories/item.rbにテスト時に引っ張ってくる画像を設定する記述をする。
ElixirでMapのリストを平均化


数週間前に[Elixir言語公式スラック](https://elixir-slackin.herokuapp.com/)のあるスレッドを眺めて学んだテクニックをご紹介します。

## [TL;DR](https://ja.wikipedia.org/wiki/Wikipedia:%E9%95%B7%E3%81%99%E3%81%8E%E3%81%BE%E3%81%99%E3%80%81%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93)

```elixir
defmodule Mnishiguchi.Collection do
  @doc """
  Averages a list of maps for specified keys.

  ## Examples

      iex> map_list([%{iaq: 123, temp: 28}, %{iaq: 111, temp: 25}], [:iaq])
      %{iaq: 117.0}

  """
  def avg_maps(map_list, keys) when is_list(map_list) and is_list(keys) do
    map_list
    # マップから指定されていないキーを取り除く
    |> Enum.map(fn x -> Map.take(x, keys) end)
    # マップをタプルに変換
    |> Enum.flat_map(&Map.to_list/1)
    # 各キーでグループ分けをする
    |> Enum.group_by(&elem(&1, 0), &elem(&1, 1))
    # 各グルーブの値を平均化する
    |> Map.new(&{elem(&1, 0), Enum.sum(elem(&1, 1)) / length(elem(&1, 1))})
  end
end
```

## 例

このようなデータがあったとします。

```elixir
data = [
  %{humi: 85, temp: 35, feeling: "hot"},
  %{humi: 47, temp: 25, feeling: "awesome"}
]
```

平均化したいキーを指定して`avg_maps/2`を走らせます。

```elixir
iex> Mnishiguchi.Collection.avg_maps(data, [:humi, :temp])
%{humi: 66.0, temp: 30.0}
```

インプットされたデータはこんな感じに加工されていきます。

```elixir
[%{humi: 85, temp: 35}, %{humi: 47, temp: 25}]
[{:humi, 85}, {:temp, 35}, {:humi, 47}, {:temp, 25}]
%{humi: [85, 47], temp: [35, 25]}
%{humi: 66.0, temp: 30.0}
```

## Wrapping up :lgtm::lgtm::lgtm::lgtm:

- この記事は、2021/07/17(土) 00:00 〜 2021/07/19(月) 23:59開催の[autoracex #37](https://autoracex.connpass.com/event/219198/)という純粋なもくもく会での成果です
  - [Active Record(Ruby)とEcto(Elixir)でmigrateした内容を一致させる](https://qiita.com/torifukukaiou/items/e03120b0cadd8f5b3af8) by torifukukaiou
- [Elixir言語公式スラック](https://elixir-slackin.herokuapp.com/)や[Elixir JPスラック](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w)を眺めているといろんなアイデアが見つかります。

https://elixir-slackin.herokuapp.com/

https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w

https://autoracex.connpass.com/event/219198/
Herokuで使うPythonのコード内にアクセストークンを直書きするのはやめよう

# この記事の対象
Herokuでデプロイするアプリのコードを自分のGithubリポジトリにもあげたが、アクセストークン(token)の直書きによって怒られてしまった人

# まえがき
外部APIを使う際など、Secret TokenやAccess Tokenを要求される場面があると思います。これをコード中に直書きしてしまうとgithubのpublicリポジトリに上げてしまった場合や、なんらかの理由でソースコードを第三者に見られた場合に不正なアクセスをされてしまう可能性があります。

```Python:良くないトークン使用例
BAD_TOKEN = 'hogehogefugafuga'

def getHoge():
    hoge = Hoge.access(BAD_TOKEN)
    return hoge
```

# 対応策
herokuにログインしたターミナルから以下のように入力してください。

```txt:構文
 Prgckwb:~/python % heroku config:set トークン名="トークンの中身" --app app名
```

今、`sample-app`というアプリで使うトークン`hogehogefugafuga`を名前`GOOD_ACCESS_TOKEN`として保存してコード内で使うためには、

```txt:トークンの保存
 Prgckwb:~/python % heroku config:set GOOD_ACCESS_TOKEN="hogehogefugafuga" --app sample-app
```
として、例えばコード内で以下のように使います。

```Python:良いトークン使用例
import os

ACCESS_TOKEN = os.environ["GOOD_ACCESS_TOKEN"]

def getHoge():
    hoge = Hoge.access(ACCESS_TOKEN)
    return hoge
```

このようにすれば、コード中にトークンの中身が現れないので第三者にトークンが漏洩する可能性を低くすることができます。
jax.vmap, vectorize でサクっと SPMD な並列処理するメモ

## 背景

数値計算を Python(numpy, scipy)でやっている. SPMD(e.g. 配列要素ごとに同じコードを実行)的なコードが実行できれば十分.

e.g.

```py
ret = numpy.zeros((nx, ny))

for x in range(nx):
  for y in range(ny):
    r = numpy.sqrt(x*x + y*y)
    ret[x, y] = r
```

計算速くするためにマルチスレッド化とかしたいが, Python では並列処理スレッド関係とかでめんどい... multiprocessing の Pool や starmap などあるが, 処理するデータのサイズが大きいとメモリ不足になったりする(内部で一時的なバッファをたくさんつくるようでメモリ消費が多い) 

CPU, GPU(CUDA) 両方でうごいてほしい

cupy の vectorize だと python コードでは使える cupy 関数が少なくてつらい(cupy.sum とか未対応) :cry:

## jax.vmap, jax.numpy.vectorize

https://github.com/google/jax


### CPU, GPU の切り替え

jax は cpu backend と gpu backend 両方をインストールできます.

cpu backend を強制的に使いたい場合はたとえば python スクリプトで

```py
import jax
# force use CPU
jax.config.update('jax_platform_name', 'cpu')
```

とします.

### 注意点

vmap, vectorize で呼び出される関数は jit 処理されるため, if 文などはつかえません.

https://jax.readthedocs.io/en/latest/errors.html#jax.errors.ConcretizationTypeError

where 関数で代用するか, `jax.lax.cond` https://jax.readthedocs.io/en/latest/jax.lax.html#lax-control-flow あたりを使いましょう.

complex128 は対応していないようです(complex64 に変換されてしまう)

kernel 内で `sum` など使うと, 2D を入力してもなぜか 1D に reduction されてしまいます(1D 方向の総和を取ると解釈されてしまうため?). 必要に応じて入力を 1D にしておく(e.g. `flatten` で)とよいでしょう.

もしくは, `jax.numpy.vectorize` を使うとよいでしょう

#### メモリ不足に陥りやすい

128x128 kernel で画像を convolve(フィルタをかける)みたいな処理だと CPU でメモリ 128 GB とかあってもメモリ不足になりやすいです(これは numpy.vectorize などもそうであるが)

jax では, メモリを考慮して入力のデータサイズに応じてよろしく並列数を設定するなどはできないようで, 計算ドメイン全体を並列で処理しようとしている感じでした.

自前で入力データを分割して少しづつ処理させる... みたいなのを記述しないとだめそうです.

たとえば 2D(e.g. 画像データ)だと, vsplit で分割して 1 行づつ処理するなど

```
def kernel(...):
  ...

fn = vectorize(kernel)

ret = []
for line in jnp.vsplit(img, img.shape[1]):
  ret.append(fn(line))

out_img = jnp.vstack(ret)
```

#### GPU memory

jax では GPU 実行の場合 90% メモリを pre-allocate します.
他のタスクと一緒に動かしたいとかの場合

https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html

を参考に環境変数などでメモリ設定します.

### pmap

pmap というのもあります. ただこれは batch を GPU(CPU の場合はコア?)で並列で処理する用がメインっぽそうです. 複数 GPU で処理したいときは pmap の形式にできるとよいでしょう.


## pytorch.vmap (experimental)

pytorch 1.9 時点で experimental ですが, vmap(vectorized map)があります!
(nightly build のみ)

https://pytorch.org/tutorials/prototype/vmap_recipe.html

2.0 あたりで標準対応してほしいですね. 少しいじれば pmap っぽく使えるでしょう.
UISwitch

# UISwitch
<img width="150" alt="C524B41B-A5C8-4434-9020-BAAA04DDE1AB_4_5005_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/d196b229-7706-6906-8724-6ac337567600.jpeg">
iPhoneの設定でよく見かける、このSwitchのことです.


# コードで作成

* Swich自体は、とても簡単に作ることができます
* あとは、SwitchがONなのOFFなのかで処理をさせたりします。

```Swift:Switch
import Foundation
import UIKit

class Switch{
    
    let modeCangeSwitch = UISwitch()
    
    func createSwitch(targetView:UIView){
        
        modeCangeSwitch.center = targetView.center
        modeCangeSwitch.onTintColor = .systemGreen 
        
        targetView.addSubview(modeCangeSwitch)
        
    }  
}
```

# 簡単な実例

```Swift:Switch
        if modeCangeSwitch.isOn == true{
          
            //switchがオンの時の処理など  
            
        }else if modeCangeSwitch.isOn == false{
            
            //switchがオフの時の処理など  

        }
```

* `.isOn`は、Switchの状況をBool型で判定をしてくれます。`true`ならオン、`false`ならオフとなります。

# 終わり
普段UISwitchを使ってないので、休憩の時に少し使ってみました。
簡単に実装できて、便利そうですね。
正規表現の理解　[Rubyチェリー本 6章まとめ]

この章では、Rubyにおける正規表現の扱いが記載されています。
この章の前に、著者の @jnchito さんの正規表現に関するQiita記事を参考にすると、とても理解しやすいと思います。
この記事では、特に参考になった部分を抜粋します。

### Rubyにおける正規表現と文字列の比較

`=~` を扱う。
正規表現と文字列がマッチした場合は、文字列のマッチした位置が返る(真)。
マッチしなかった場合はnilが返る(偽)。

```ruby
'123-4567' =~ /\d{3}-\d{4}/
#=> 0
'99-999' =~ /\d{3}-\d{4}/
#=> nil
```

### 正規表現のキャプチャ

正規表現では`()`を扱うことで、マッチした文字列をキャプチャする事ができる。
Rubyの場合では、この機能を扱う際にmatchメソッドを用いて、マッチした結果を配列のように扱う事ができる。

```ruby
text = "私の誕生日は1997年5月27日です。"
m=/(\d+)年(\d+)月(\d+)日/.match(text)
m #=> <MatchData "1997年5月27日" 1:"1997" 2:"5" 3:"27">
m[0] #=> "1997年5月27日"
m[1] #=> "1977"
m[2] #=> "7"
m[3] #=> "17"
m[1..3] #=> ["1997", "5", "27"]
```

### キャプチャ結果に名前をつける

> キャプチャには(?<name>)というメタ文字を使って名前を付けることができます。

```ruby
(?<year>\d+)年(?<month>\d+)月(?<day>\d+)日
```

```ruby
text = "私の誕生日は1997年5月27日です。"
m=/(?<year>\d+)年(?<month>\d+)月(?<day>\d+)日/.match(text)
#=> #<MatchData "1997年5月27日" year:"1997" month:"5" day:"27">
m[:year] #=> "1997"
m["year"] #=> "1997"
m[1] #=> "1977"
```
天気をopenweathermapから取得してGoogle Data Portalに表示

openwethermapで取得した天気をポータルで表示できるようにしました。

![portal_4_weather.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/853dad3f-86c7-e65a-58eb-f8f5d096da76.png)



#### 前提
* Google Data Portalにベースとなるレポートがあること (詳細は以下ページ参照)

https://qiita.com/tosshie/private/bc43114d42e05bc3afcb

* Google SpreadSheet にopenweathermapから取得したデータがリアルタイムに更新されていること (詳細は以下ページ参照)

https://qiita.com/tosshie/items/08a2c740e19c4154daf7


#### Google SpreadSheet側の設定
* 最新データのみを表示するシートを作成 
    * Google Data Portalに持って行ったときに表を作りやすくするために最新値だけのデータを表示できるようにしておきます
        * 関数例: `=indirect("test1!V"&counta(test1!A:A))`
        * ちなみに、もとのデータが入っているシート名はtest1にしています
        * test1シートのV列にあるデータの最新値を持ってきています
        * test1シートのA列には日付が入っていてどの行にもデータが入っている前提です
        * これを、openweathermapで取得できる以下の4パラメータ分取得できるようにしておきます
            * weather_outside
            * weather_description_outside
            * Precipitation
            * datetime(これはopenweathermapからではなくGAS内で取得)


#### Google Data Portal側の設定
* Google Data Portalを開きベースとなるレポートを表示
* 右上の編集ボタン
* メニューのデータを追加 → Google SpreadSheetから最新データのみを表示するシートを選択 → 追加 → レポートに追加
* メニューのリソース → 追加済みのデータソースの管理 → 追加したものの編集ボタンをクリック
* グラフを追加 → 表 → 配置
* スコアカードのメニュー（右側に出ているプロパティ的な部分）を変更
    * データソース: 追加したシートを選択
    * 期間のディメンション: datetime(日付)
    * ディメンション
        * weather_outside
        * weather_description_outside
        * Precipitation

これで天気がポータルに表示されたはずです

----------

2021年3月から始めたスマートホーム化はこちらに一覧化しています（2021年7月時点）

https://qiita.com/tosshie/items/82dcc6405925b12d2fd1
【Rails】削除機能と削除アラートの表示の方法

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

* 削除機能を作ろうと思っている方


#目的

* 削除機能を押す前に確認を取る

#実際の手順と実例
###1.実際これだけでOK！！

コードは以下の通りです。

````
<%= link_to books_path, method: :delete, data: {confirm: "本当に削除しますか？"} %>
````

たったこれだけで完成です！
””内にどんな文章入れてもダイアログ表示されますよ！
coc.nvimでDocker上のLanguageServerにアクセスしたい!

# coc.nvimでDocker上のLanguagServerにアクセスしたい!!

結論から言います．
この記事でDocker上のLanguageServerにアクセスすることはできません．
できる方法が思いつきつつあるので出来たらまた記事にするかも...


## 動機
私はNeoVim + coc.nvimで環境を整えています．
coc.nvimで快適な補完生活を行っていますが，唯一問題があります．
それはDocker上で開発する際に同様の開発環境をローカルに構築しなければ補完が行われないという点です．
Docker内でNeovim + coc.nvimの環境を構築するのはこの問題を解決する最も安直な方法ですが，私はこの方法を取りたいとは思いません．
また，私のNeovim君を完全に動作させるにはNeovim 0.4以降のバージョンが必要です．
Debianのbuster以前を元にしているイメージではaptはNeovim 0.3.4を持ってきます．
つまりDocker内で環境構築することにすら苦労しなければならないのです．

このような問題から私はネイティブでNeovim+coc.nvimを動作させつつ，言語の環境だけをDocker内で構築したいのです．
私はWindowsマシンとLinuxマシンを両方使用しておりどちらでも動作することが必須条件です

## やってみたこと
やってみたことは単純です
私は今Elixirを久しぶりに触りたいと考えていたためElixir用の環境を構築することを目標とします．
ElixirのLanguageServerは[elixir-ls](https://github.com/elixir-lsp/elixir-ls)というものがあります
LanguageServerを動作させるDockerImageは[dockerdlsp/elixir-ls](https://hub.docker.com/r/dockeredlsp/elixir-ls)を試した後，ソケット通信を行わないバージョン等自分でカスタムして様々な物を作成しました．（全部失敗したわけですが）
その際，coc.nvimでの設定は次の通り,

```json:coc-settings.json(ソケット通信)
{
  "languageserver": {
    "elixirLS": {
      "host": "127.0.0.1",
      "port": 4567
      "filetypes": ["elixir", "eelixir"]
    }
  }
}
```

```json:coc-settings.json(直接叩いてみたver)
{
  "languageserver": {
    "elixirLS": {
      "command": "docker",
      "args": ["run", "--rm", "-it", "dockeredlsp/elixir-ls:1.12.2-23.3.4"],
      "filetypes": ["elixir", "eelixir"]
    }
  }
}
```

上記の設定で動きはします．
ですがエラーが出ているのかサーバがストップすることがわかりました．
ここで一度LSPの仕様を調べてみることにしました．

## LSPの仕様を見て
LSPの仕様の詳細を見たわけではありませんが，[こちら](https://docs.microsoft.com/ja-jp/visualstudio/extensibility/language-server-protocol?view=vs-2019)のサイトを見れば一目瞭然でした，fileのuriをjson-rpcとして送信しているわけです．
つまりDocker上のファイルシステムに同じ場所に同じファイルがないとアクセスできるわけもないわけです．
そのためLanguageServerがエラーを吐き，止まっているのではと考えられます．
この仕様を考えるとローカル上で動かすのが基本的に必須なのがわかると思います．

## まとめにかえて
仕様を見たところ問題点が荒方見えてきた気がします．
つまり，Docker上に同じファイルが存在していればいいんですよね?
次回書くかどうか　また，動くかどうかわかりませんがこの問題を解決する方法を紹介できればいいと思います．

[coc.nvimでDocker上のLanguageServerにアクセス出来た話](https://qiita.com/Sepi110902/items/75e795afee40a7297c9f)
データマイニングによる異常検知　共立出版　山西健司先生

```{r}

#SDEM p.23

library(mvtnorm)

data(iris)

data=iris[1:150,]

X=data[,!(colnames(data) %in% "Species")]

X=matrix(as.numeric(unlist(X)),ncol=ncol(X))



#初期パラメータ

r=0.01

k=3

alpha=3

mu=matrix(sample(1:9,k*ncol(X),replace=T)/100,ncol=ncol(X))

mu_bar=mu

lam=diag(rep(1,ncol(X)))

for(j in 1:(k-1)){
  
lam=cbind(lam,diag(rep(1,ncol(X))))  
  
}

lam_bar=lam

c=rep(1,k)/k


loglik_vec=c()


for(l in 1:nrow(X)){
  
mu_pre=mu;lam_pre=lam  

x=X[l,]  
  
sum_p=c()

val=array(0,dim=c(nrow(X),k))
  
for(i in 1:k){
  
sig=lam[,(ncol(X)*(i-1)+1):(i*ncol(X))]  
  
sum_p=c(sum_p,dmvnorm(x,mu[i,],sig)*c[i])
  
val[,i]=dmvnorm(X[1:nrow(X),],mu[i,],sig)

}

loglik=log(val%*%c)

loglik_vec=c(loglik_vec,sum(loglik))

print(paste0(l,":",sum(loglik*r*(1-r)^(nrow(X)-c(1:nrow(X))))))

gam=(1-alpha*r)*sum_p/sum(sum_p)+alpha*r/k
  
c=(1-r)*c+r*gam

mu_bar=(1-r)*mu_bar+r*t(t(c(gam)))%*%t(as.numeric(x)) 

mu=mu_bar/c

lam_bar=(1-r)*lam_bar
  
for(i in 1:k){
  
lam_bar[,(ncol(X)*(i-1)+1):(i*ncol(X))]=lam_bar[,(ncol(X)*(i-1)+1):(i*ncol(X))]+r*gam[i]*t(t(as.numeric(x)))%*%t(as.numeric(x))  
  
lam[,(ncol(X)*(i-1)+1):(i*ncol(X))]=lam_bar[,(ncol(X)*(i-1)+1):(i*ncol(X))]/c[i]-t(t(c(mu[i,])))%*%t(c(mu[i,]))

}


}

```

```{r}


#SDAR p.52　確認中

data("AirPassengers")

values=c(AirPassengers)

k=3

x=array(0,dim=c((length(values)-k),k))

y=c()

for(j in 1:(length(values)-k)){

vec=values[j:(j+k-1)]  

x[j,]=vec

y=c(y,(values[k+j]))

}

mu=1

r=0.00001

w=rep(1,k)

Cj=rep(1,k+1)

sig=1


for(l in (k+1):nrow(X)){

mu=mu*(1-r)+r*values[l]  

for(j in 1:(k+1)){

Cj[j]=Cj[j]*(1-r)+r*(values[l]-mu)*(values[l-(j-1)]-mu)  

}

mat=array(0,dim=c(k,k))

for(i in 1:k){

mat[i:k,i]=Cj[1:(k-(i-1))]  

}

w=solve(mat,Cj[-1])

pre=(x-mu)%*%w+mu

sig=(1-r)*sig+r*sum((y-pre)^2)

loglik=-(nrow(X)-k)*log(sqrt(sig))-sum((y-pre)^2)/(2*sig)

print(loglik)



}


```

```{r}

#混合正規分布の最尤推定 p.122

library(mvtnorm)

data(iris)

data=iris[1:150,]

X=data[,!(colnames(data) %in% "Species")]

X=matrix(as.numeric(unlist(X)),ncol=ncol(X))

X=t((t(X)-apply(X,2,mean))/apply(X,2,sd))


#初期パラメータ


k=3

mu=matrix(sample(1:9,k*ncol(X),replace=T)/100,ncol=ncol(X))

lam=diag(rep(1,ncol(X)))

for(j in 1:(k-1)){
  
lam=cbind(lam,diag(rep(1,ncol(X))))  
  
}

c=rep(1,k)/k

ite=100


for(l in 1:ite){
  
sum_p=array(0,dim=c(nrow(X),k))

val=array(0,dim=c(l,k))
  
for(i in 1:k){
  
sig=lam[,(ncol(X)*(i-1)+1):(i*ncol(X))]  
  
sum_p[,i]=dmvnorm(X,mu[i,],sig)
  
}

val=sum_p

loglik=log(ifelse(val%*%c>0,val%*%c,1))

loglik_vec=c(loglik_vec,sum(loglik))

print(paste0(l,":",sum(loglik)))

cp=(t(sum_p)*c)

gam=t(cp)/apply(cp,2,sum)
  
c=apply(t(cp)/apply(cp,2,sum),2,mean)

mu=t(t(X)%*%gam)/apply(gam,2,sum)

for(i in 1:k){
  
lam[,(ncol(X)*(i-1)+1):(i*ncol(X))]=t(X)%*%diag(c(gam[,i]/sum(gam[,i])))%*%X-t(t(c(mu[i,])))%*%t(c(mu[i,]))

}

}

```