OmniAICreator/Qiita-1.07M huggingface dataset:
Goで書かれたLambdaのpanic時、CloudWatchLogsにスタックトレースが出ない

## 現象

Goで書かれたLambdaでpanicが発生した際、CloudWatchLogsにスタックトレースが出ず、下記エラーログに固定されるため、
原因の調査が出来なくて困った。

```shell
2022/02/01 07:16:00 calling the handler function resulted in a panic, the process should exit
```

## 原因

[aws-lambda-go](https://github.com/aws/aws-lambda-go)のバージョン、v1.24.0を利用していたが、  
上記だと、panic時にログに出力しない実装になっている。

https://github.com/aws/aws-lambda-go/blob/v1.24.0/lambda/invoke_loop.go#L50

## 解決策

[aws-lambda-go](https://github.com/aws/aws-lambda-go)のバージョンをv1.27.1に上げる。

https://github.com/aws/aws-lambda-go/blob/v1.27.1/lambda/invoke_loop.go#L51-L52

```shell
2022/02/08 08:17:55 
{
    "errorMessage": "panic test.",
    "errorType": "string",
    "stackTrace": [
        {
            "path": "github.com/aws/aws-lambda-go@v1.27.1/lambda/errors.go",
            "line": 39,
            "label": "lambdaPanicResponse"
        }
        ~ 省略 ~
    ]
}
```

## その他

panicをdeferを使ってエラーをキャッチする方法もあるが、これだとスタックトレースは出力出来ない。

```go
defer func() {
		if err := recover(); err != nil {
			log.Errorf(":%v", err)
		}
	}()
```
【AWS】デフォルトで用意されるIAMのロール

- 新規アカウント登録時にデフォルトでIAMのロールが2つ用意される

![iamdfault1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596144/f085fad4-65c2-cce9-d5ad-ec12d9c205b9.jpeg)


- 2つのロール名は
  - AWServiceRoleForSupport
  - AWSServiceRoleForTrustedAdvisor

![iamdefault.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596144/1d0863c7-09f7-5f22-f9b0-f07c0b84e579.jpeg)
40 代おっさん LaravelでMVCのMを学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## 構築環境

・EC2:Amazon Linux2
・PHP7.3
・Laravel 5.8
・mariadb

## MVCとは

MVCとは、ソフトウェアの設計モデルの一つで、機能を「Model」（モデル）、「View」（ビュー）、「Controller」（コントローラ）の三つの役割に分離して実装し、それらが連携して処理を進める方式。
Modelはデータの管理や手続きを扱い、Viewは他の二要素からの指示を受けて利用者への表示・出力（の変更）を行い、システムによっては利用者の操作・入力内容をControllerに伝達する。Controllerは利用者からの操作や入力を受け付けて解釈し、ModelやViewに対応する処理を行うようメッセージを発する。

## Model

Modelとはデータを管理するところ、データベースの処理を担当する部分

### SQLのテーブル作成

laravelにはマイグレーションにてテーブル作成できますが、今回はSQLのクエリを発行してテーブルを作ります。

```terminal
CREATE TABLE `people` (
    `id` INTEGER PRIMARY KEY AUTO_INCREMENT,
    `name` TEXT NOT NULL,
    `mail` TEXT,
    `age` INTEGER
    );
```
をSQL開始して打ち込んでください。

```terminal
show tables;
```
にて自分の作ったテーブルが確認できれば大丈夫です。

次にダミーレコード入れてください

```terminal
INSERT INTO `people` VALUES (1,'名前','メールアドレス',年齢);
```
確認

```terminal
SELECT id,name,mail,age FROM people;
```

### ORM

ORMとは、データベースのレコードをプログラミング言語のオブジェクトとして扱えるようにする仕組み
LaravelにはEloquentというものがある。

### Eloquent

Eloquentでは<font color="Red">モデル</font>と言うクラスを定義し、これでデータベースを操作する。

#### モデルの作成

モデルと言うクラスです。勘違いしないで！！

```terminal
php artisan make:model Person
```

php artisan make:model モデル名と言う形でコマンドを打ってください。
<font color="Red">※モデル名は単数形で、テーブルは複数形で自分はしていなくてえらい目にあいました。</font>

appファルダのProvidersフォルダにPerson.phpが出来ていると思います。

ファイルの中身は

```php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Person extends Model
{
    //
}
```
とりあえず作成はできたので後は処理ごとの説明にしたいと思います。

#### Controllerを作成

```terminal
php artisan make:controller PersonController
```

```php
use App\Person;
```


```php
 public function index(Request $request)
    {
        $items = Person::all();
        return view('person.index', ['items' => $items]);
    }
```

書き加えてください.
use App\Person;を書き忘れてえらい目にあいました！！

$items = Person::all();で全レコード取得している。

#### viewを作成

viewsファルダ内にpersonファルダを作成し、そこにindex.blade.phpを作成してください

```php
 <table>
        <tr><th>Name</th><th>Mail</th><th>Age</th></tr>
        @foreach ($items as $item)
            <tr>
                <td>{{$item->name}}</td>
                <td>{{$item->mail}}</td>
                <td>{{$item->age}}</td>
            </tr>
        @endforeach
 </table>
```

を書いてください。

#### ルート情報の追加

```php
Route::get('person', 'PersonController@index');
```

ルート情報を追加

これで基本的な部分は確認ができました。
次はモデルクラスのメソッドで色々やってみたいと思います。

## 参考資料

https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798052582

https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AEMySQL-%E7%AC%AC3%E7%89%88-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%A5%BF%E6%B2%A2-%E5%A4%A2%E8%B7%AF/dp/4797393114
【Vue.js】propsの書き方について

Vue.jsにおける**props**について簡単にメモしておく。

# propsとは
**props**とは、親コンポーネントから子コンポーネントへデータを渡すことができる仕組み。
親コンポーネントと子コンポーネントの書き方について簡単にまとめておく。

##子コンポーネント

```vue
<template>
	<h1>{{ message }}</h1>
</template>

<script>
export default {
	name: "sample",
	props: {
		message: {
			type: String,
			required: true,
		},
	},
};
</script>
```
上記のように、渡されてきたデータの型やプロパティが渡されたかなどのバリデーションを設定することができる。
設定できる項目は以下の4つがある。
■ **type**: テータの型(Number,String,Objectなど)
■ **default**: プロパティが渡されなかった時の初期値
■ **required**:プロパティが必須項目かどうか(true/false)
■ **validator**: バリデーションする関数
もし、指定した型などに一致しない場合はコンソールに警告が表示される。

## 親コンポーネント
親コンポーネントの書き方のサンプルは以下となる。

```vue
<template>
	<div>
		<sample v-bind:message="myMessage" />    // v-bindを使ってdataプロパティを渡す場合
		<sample message="こんにちは!" />
	</div>
</template>

<script>
import Sample from "./components/Sample.vue";

export default {
	name: "App",
	components: {
		Sample,
	},
	data() {
		return {
			myMessage: "Hello!!",
		};
	},
};
</script>
```
python環境関連

# 目的
いつも忘れるので自分用メモ。

# 記事
[Pythonでversion切り替え（pyenvとvirtual envまとめ）](https://muoilog.xyz/web-development/python%E3%81%A7version%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%EF%BC%88pyenv%E3%81%A8virtual-env%E3%81%BE%E3%81%A8%E3%82%81%EF%BC%89/)
Rails【まとめ】



#データベース

データベースを一度削除して初期化

```
rails db:migrate:reset
```
→database "api_development" is being accessed by other users
データベース構造を前に戻す＝ロールバック

```
rails db:rollback
```
###データベースを操作

```
rails dbconsole
.table
.schema users（スキーマ＝構造）
.quit
```

```
rails c
Post.find(1).destroy //id1を削除
```

|用語|意味|
|--|--|
|マイグレーションファイル＝|データベースを生成する際の設計図|
|レコード|一行！横！|
|||
|||


rails db:migrate:status
AlmaLinuxでphpバージョンをアップグレード（7.2→7.4）

[基本環境](#基本環境)
[現状phpバージョン確認](#現状phpバージョン確認)
[モジュールインストール](#モジュールインストール)
[phpインストール](#phpインストール)
[任意モジュールインストール](#任意モジュールインストール)
[参考記事](#参考記事)

# 基本環境
Linux OSバージョンの確認

```
cat /etc/redhat-release

AlmaLinux release 8.5 (Arctic Sphynx)
```
# 現状phpバージョン確認

```
# php -v


```

# モジュールインストール

libmcryptのインストール

```
# dnf install --enablerepo=epel libmcrypt
```

libargon2のインストール

```
# dnf install --enablerepo=epel libargon2
# dnf install --enablerepo=epel libargon2-devel
```

# phpインストール
php moduleの初期化

```
# dnf module reset php
```

phpのインストール

```
# dnf module install php:remi-7.4
# dnf --enablerepo=epel,remi install php
# dnf --enablerepo=epel,remi install php-devel
```

phpバージョンの確認

```
# php -v

PHP 7.4.27 (cli) (built: Dec 14 2021 17:17:06) ( NTS )
```

# 任意モジュールインストール

```
# dnf install --enablerepo=remi php-mysqlnd
# dnf install --enablerepo=remi php-gd
# dnf install --enablerepo=remi php-xmlrpc
# dnf install --enablerepo=remi php-pecl-mcrypt
# dnf install --enablerepo=remi php-opcache
# dnf install --enablerepo=remi php-pecl-apcu
# dnf install --enablerepo=remi php-pecl-zip
# dnf install --enablerepo=remi php-pear
```


***
# 参考記事
`https://w.atwiki.jp/sanosoft/pages/154.html`
新人プログラマの内に意識しておくといいこと覚書


##この記事を書こうと思ったきっかけ
我が案件から旅立った新人のコードを見ていて、「自分も新人時代出来ていなかったけど、こういうところ意識するといいよなぁ」「そういうのどこかに書き残しておくといいかもなぁ」と思ったので。
あんまりこういう部分って指摘されないんだけど、意識しておくといいのかなと。
※ちなみに技術的な面は全然触れてません。


##以下意識するといいんじゃないかと思うこと
###成果物を仕上げるスピードとクオリティのバランスを意識しよう
これが難しい。
ちなみに自分は現在5年目ですが新卒入社して1~2年目ぐらいまでは〆切に間に合うか(=成果物を仕上げるスピード)、3年目以降から手戻りを減らす(=クオリティ)とかそういう部分を意識し始めた。
多分入社して1年目ってクオリティの方に目が行きがちな人が多くて、いかに間違ってないかを意識して結果〆切ギリギリとか間に合わないとか結構あるのではないかと思う。

個人的にまともな環境が整備されている前提なら、まず仕上げることを第一に考えた方が良いと思う。
仕上げた後にテストとかで間違いを探してクオリティを上げていく、というステップを繰り返す内に、仕上がるのが早くなる→早くなった分、クオリティの方に時間が割けるようになる、はず。
それに100%の完成度ってある程度年数を積んでいたとしても難しいので、やっぱりまずスピードの方を意識した方がいいかなと。


###作成したソースコードにはきちんとコメントを書こう
今回の本題はこれだった。ここからこの記事を書こうと思った。

自分もそうだったんだけど、新人の方のコードの読みにくさって大概これだと思う。
とにかくコメントが何も書いてない。**マジで何も書いてない。**
なのでそのコードが引き継がれた時に何をしているか解読するのに時間を要する。
単純な処理ならまだしも、複雑な内容だとひたすらしんどい。
次にそのコードを見て修正なり改修なりする人が結構大変なので自分が何をするためにその処理を書いたのかは記載しておくべきですね。


###不要なログはちゃんと消そう
自分もよくやりがちなので戒め。
何か妙に気になったりするし、必要なログが埋もれるのでやっぱり不要なログはきちんと消しておくのがベスト。


##あとがき
総じて「自分一人でやってる訳じゃないことが多いからその辺意識しようぜ」って話だった気がする。
覚書程度ですが誰かの参考になれば幸いです。
応用数学　第3章　情報理論

#1．はじめに
　情報理論について学習した内容をまとめました。

#2．自己情報量
　式を以下に示す．

```math
I(x)=-\log{P(x)}
```
　対数の底が2のとき，単位はビット(bit)
　対数の底がネイピア数eのとき，単位は(nat)　となる．

#3．シャノンエントロピー
　微分エントロピーとも呼ばれる（微分しているわけではない）．
　自己情報量の期待値を意味する．
　式を以下に示す．

```math
H(x)=-\sum P(x)\log(P(x))
```

#4．カルバック・ライブラー（KL）ダイバージェンス
　同じ事象・確率変数における異なる確率分布P，Qの違いを表す．
　また，Qという古い分布を新たに分かったPの分布から見た時に
　どのくらいの情報量が違うのかということを意味する．
　式を以下に示す．

```math
D_{KL}(P||Q) = \sum_{x}^{}P(x)\log\frac{P(x)}{Q(x)}
```
#5．交差エントロピー
　KLダイバージェンスの一部分を取り出したもの．
　Qについての自己情報量をPの部分で平均している．

```math
H(P,Q) = -\sum_{x}^{}P(x)\log{Q(x)}
```
Excelを使ってSQL構文の作成

##前置き
皆さんの会社には定期的なデータの変更作業など時間をかけている方、部署などはございますか？

弊社でも定期的にデータの変更作業が発生する部署があり、
その業務内容はExcelに入力されたデータをWeb上の画面からポチポチと変更をしていく気の遠くなる作業で多い時では数千件にも及ぶデータの変更作業が発生していました。

今回、その業務をExcelのフォーマットに入力(コピペ)させ、SQLの構文を出力し、
データベースに流すことで大幅に作業時間を削減した話を記事にします。

##Excelフォーマットの作成
まず、table_meiboという社員情報のテーブルがあるとします。

|社員ID|名前|性別(1:男 2:女)|部門|登録日付|更新日付|ステータス(1:有効 9:無効)|
|:|:|-:|:|:|:|-:|
|001|田中A太|1|総務部|2019/01/15|2022/02/05|1|

今回、変更したい内容をExcelのフォーマットに貼り付ければ、下記のようにINSERT文が自動で生成できるようにしました。
※水色が入力(コピペ)されたもの
※緑が数式によって出力されたSQL文
![名簿エクセル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/f19dee81-15a2-6e27-79f3-95859a8981a1.png)



F2の数式は下記の通りです。

```pre
=IF(E2="追加","INSERT INTO table_meibo VALUES("&A2&",'"&B2&"',"&IF(C2="男",1,IF(C2="女",2,""))&",'"&D2&"', NOW(), NOW(),1);")
```
数式は基本的には「&」と「""(ダブルクォーテーション)」を使用し、
データベースに文字列で入れるものは「''(シングルクォーテーション)」で括ります。
また、性別のようにテーブルによっては数字で管理しているものに関しては
IF関数で判定し、数字に置き換えることも可能です。

##補足
INSERT文については下記のように複数行をまとめることも可能です。
![名簿INSERT複数.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/00bea5c8-78df-89cc-b644-1d48d14fe925.png)

また、IF関数を使用し「追加」の場合はINSERT文、「削除」の場合はDELETE文などといったように判定させることも可能です。

```pre
=IF(E2="追加","INSERT INTO table_meibo VALUES("&A2&",'"&B2&"',"&IF(C2="男",1,IF(C2="女",2,""))&",'"&D2&"', NOW(), NOW(),1);",IF(E2="削除","DELETE FROM table_meibo WHERE 社員ID = "&A2&";",""))
```
![名簿IF.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739387/63c084a9-a465-46b5-6ade-10883f763ffd.png)

##最後に
Excelフォーマットで生成したSQL文をデータベースに流せば簡単に更新することが出来ます。

最後まで見ていただきありがとうございます。
少しでもお役に立てれば嬉しいです！
[Vite] vue/server-renderer, updating...でコケたときの対処

## rm -rf node_modules && npm i をやってコケる

`yarn dev` として起動しようとすると、、
以下のようなエラーとなった。

```bash
15:30:37 [vite] new dependencies found: vue/server-renderer, updating...
15:30:38 [vite] Failed to load source map for /node_modules/.vite/vuex.js?v=f58e6f60.
15:30:38 [vite] Failed to load source map for /node_modules/.vite/vue-router.js?v=f58e6f60.
15:30:44 [vite] Failed to load source map for /node_modules/.vite/chunk-ZHXWWURZ.js?v=f58e6f60.
15:31:14 [vite] Failed to load source map for /node_modules/.vite/chunk-KCDUG5KQ.js?v=f58e6f60.
15:31:19 [vite] Failed to load source map for /node_modules/.vite/element-plus.js?v=f58e6f60.
15:31:20 [vite] ✨ dependencies updated, reloading page...
```

## Vite の Issue で以下を発見

https://github.com/vitejs/vite/issues/5782#issuecomment-975207418

`package.json`を直接編集して、以下のバージョンへアップデート

```
    @vitejs/plugin-vue: ^1.10.0-beta.1 => 1.10.0-beta.1 
    vite: 2.7.0-beta.8 => 2.7.0-beta.8 
```

エラー回避できました。
Railsチュートリアル7章、本番環境へデプロイ出来ない原因なんてこんなもんよ

https://wa3.i-3-i.info/word16767.html

デプロイとは使える状態にする。ということである。
わわわ事典より。


一向に使える状態になりません。困りましたねぇ。

```$ push heroku```

アプリにアクセス…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2144713/0a83c1fb-53cf-b2b9-7e32-c5470f9eda83.png)

wtf！
```$ rails test```
0 failures, 0 errors, 0 skips

問題ないですね。
原因が絞られてきました。

まず、こちらを参考に


https://qiita.com/kents1002/items/e1b90c71897c55b8e870

うんうん同じ画面です。
```$ heroku logs --tail```(リアルタイムのログを追跡して確認)

```$ heroku restart```
うーん
sqlite3は関係ないし、、、何となく目星ついてるんだよな
しかし原因はわからない。。。次！


https://stackoverflow.com/questions/28124885/heroku-getting-started-deploy-the-app-but-get-app-error

puma。。ちゃうねん。。直感がこれじゃないと囁いてる。。。
もっと根本的な話だと思っている。次

https://devcenter.heroku.com/articles/getting-started-with-ruby#declare-app-dependencies

公式をさらっと。んんんんー。。。。。。
```$ bundle install```
からの
```$ bundle update```
まあ、ね？この二つは大事。今回は違うね次


https://rabirgo.net/dev/sign-up-03/

結論を言うと、puma.rbの内容に追記していたのですが、追記ではなく内容の書き換えが正解だったようです。書き直して、```$ push``して。。。無事デプロイ出来ました！
こういうミスってまだまだ理解出来ていない証拠だなーと痛感しました。でも解決できてよかったーw
Vue.jsで環境変数を設定

## .envを用意

.envファイルをpackage.jsonと同じ階層に作成

```.env
# 環境変数
VUE_APP_TEST=HOGEHOGE
```

:::note warn
環境変数のプレフィックスを VUE_APP_ にしないと読み込みません。
:::

## 読み込み
プロジェクトをサービス起動して

```javascript
console.log(process.env.VUE_APP_TEST);
```

これで読み込めない方はdotenvあたりのモジュールがインストールされているか確認してみると良いかもしれません。

## 参考
https://cli.vuejs.org/guide/mode-and-env.html#example-staging-mode
QAメンバーから200以上のノウハウ記事をどうやって集めたか

みなさん、こんにちわ！
QAチーム内のノウハウの共有は上手くいってますか！？

ミクシィのQA組織は、Docbaseという社内ドキュメントツールを利用して、ノウハウを貯めています。
2年前くらいから初めて、現在、200を超える記事が投稿されており、スタッフのスキルアップと暇つぶし(！)に、大いに役立っている印象です。

この記事では、なぜ始めたのか、どのようなルールでやっているのか、どのような記事が投稿されているのか、を紹介します


## なぜ始めたのか
個人的な感覚かもしれませんが、ソフトウェアテストは、経験がものを言う職業です。
体系的な知識ももちろんありますが、現場から得られる知識も多い。
しかし、個人が体験から得られる量には限界があるため、なるべくみんなの経験談やノウハウを一箇所に集めようと考え付きました。


当時、業務フローに関しては、コンフルエンスなどでこまめにドキュメント化されておりましたが、個人が持っているノウハウに関しては、共有があまり活発ではありませんでした。理由は幾つかありますが、「適切なアウトプット先が無かった」「アウトプットのハードルが上がっていた」ことが挙げられます。

コンフルエンスは、目的をもって資料を探す場であり、フラッと訪れる場所ではありません。また、業務フローのようなオフィシャルなドキュメントが多く、個人の考えのようなものをアウトプットするには、適さない雰囲気がありました。

そんな中、ミクシィ社内でDocbaseの運用が始まります。
Docbaseを知らないかたに簡単に説明すると、社内ブログのようなものです。
気軽に投稿でき、閲覧範囲を容易に設定でき、スタンプでリアクションでき、コメントもできる。
そんなDocbaseを利用すれば、みんなの知見がどんどん貯まるんじゃないかな、と思いついたのが2020年の2月ころでした。


## 運用ルール
Docbaseはデフォルトでは全社員が読むことができます。
しかし、この状態だと、投稿することに心理的な抵抗が産まれ、投稿の量が減ると思ったので、まずはQAメンバーのみが閲覧できるグループを作成し、そこに投稿をしてもらうようにしました。(当然、全社員に公開しても良いです)

投稿に関してのルールはふたつのみ
・どんなネタを書いても良い
・記事やコメント欄で、批判的なことやネガティブなことや思わせぶりなことは書かない

「雑多に集めて、分類はしない」を方針にしています。
フラッとおとずれて、何か興味のあるものが見つかればOK。

## どうなったか
記事は2年間で200以上貯まりました。

実用的なところだと、
「テストの見積もり」「テストケースの書き方」「レビューについて」「自動テストの環境セットアップ」「遊技機のQAでやってたこと」「弱電波検証の方法」etcetc..
といった記事があります。

その他にも
「QAのキャリアパス」「最近のQA求人と年収の動向」「再発防止MTGについて」「エクセルのTIPS」
といった記事や、スタッフが参加したセミナーのメモなども盛んに投稿されています。

また、雑談系も幾つかあり
「格闘ゲーム用語集」「賃貸を選ぶときのポイント」「TDLの隠れミッキーを見つけたら共有する記事」「2020年に流行ったアーティスト」
といった投稿もあります。


## おわりに
実用的なだけでなく、楽しい空間が出来つつあると感じてます。

ただ、個人的には、もっともっと情報を集めたいです。
「以前の現場は、こういうサービスのQAチームで、何名体制でこんなツールを使い、こういう良いところがあり、こういう課題があった」
という情報を集めるだけでも、かなり有益なものになるはず。
また、趣味の話の投稿が増えれば、スタッフ同士の交流にもつながるでしょう。
そのためには、投稿のハードルを下げ続け、みんなが気軽投稿できるようにしていく雰囲気を作らないといけません。

観測するに、投稿を躊躇する理由は主に2つで「時間がない」と「恥ずかしい」。
「時間がない」は、まぁしょうがないとして、「恥ずかしい」に関しては、文章力に自信がないパターンと、自分の経験や知識に価値を見出してないパターン(こんなの共有しても誰も喜ばない、と誤解している)があるように思います。

少しでもハードルが下がればと思い、定例ミーティングや1on1等で、スタッフからいい話を聞いたら「お、それドクベ(docbaseのこと)に書いといて」と、口癖のように言ってます。そして、投稿してくれたら、ちゃんと読んで、感謝の気持とともに、スタンプやコメントでリアクションするよう、心がけています。

目指せ投稿500件！


それでは！
git cloneをする時に任意のブランチを指定する方法

#git cloneをするときにブランチをしていする方法

git cloneをするときに、開発中のソースを落とすことができず、
事象を確認したところ、開発時は「develop」ブランチで作業を行っていたが、
git cloneで落としたソースは「master」ブランチであったことが判明。

事象が分かったところでgit clone時にブランチを指定する方法を調べた。

下記のコマンドでブランチを指定してcloneすることができる

```
git clone -b [ブランチ名] [リポジトリのアドレス]
```
Docker内のcargoコマンド実行で 「could not find Cargo.toml」が発生した時の対応

# 問題点
Dockerイメージのビルドの中で、[pngquant](https://pngquant.org/install.html)をインストールしようとして `carge build --release` をすると、

```bash
error: could not find `Cargo.toml` in `/var/task` or any parent directory
```

が発生する。
手順通り

```Dockerfile
RUN git clone --recursive https://github.com/kornelski/pngquant.git ${LAMBDA_TASK_ROOT}/pngquant
RUN cd ${LAMBDA_TASK_ROOT}/pngquant
RUN cargo build --release
```

としても。

# 解決策
`Dockerfile` 内だと `cd` コマンドが効かないので

```Dockerfile
RUN git clone --recursive https://github.com/kornelski/pngquant.git ${LAMBDA_TASK_ROOT}/pngquant
WORKDIR ${LAMBDA_TASK_ROOT}/pngquant
RUN cargo build --release
```

とする必要がある。
useStateとuseEffect(Flutter Hooks)

StatehulWidgetは実装量が多くinitStateの使い回しが良くないという事で、HookWidgetが推奨されていますが、フックに慣れていないので勉強していきたいと思います。
#useState
HookWidget内でuseState(引数の初期値)を変数に入れるだけで、ValueNotifierを返してくれます。

```dart
ValueNotifier<T> useState<T>([T initialData])
// ValueNotifierが更新される度に、呼び出し元のHookWidgetにビルドするように求められます。[]は配列ではありません。
Type: ValueNotifier<dynamic> Function(dynamic)
// 最初にinitialData(初期値)が呼ばれそれ以降は呼び出されません。
```

```dart
// カウンターアプリケーション実装例
class Counter extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final counter = useState(0);

    return GestureDetector(
      onTap: () => counter.value++,
      child: Text(counter.value.toString()),
    );
  }
}
```
#useEffectt
初期化処理でよく使われ、処理を一度だけ実行したい場合やその後の処理(解放処理)を実行させたい場合、値が変わったらサブスクライブ(購読)させるような処理に利用されます。

```dart
void useEffect(void Function()? Function() effect, [List<Object?>? keys])
// keyを指定しておくと一度だけ処理を実行してくれます。
Type: void Function(void Function()? Function(), [List<Object?>?])
// keyを指定していない場合は毎回同期的(値が変わる度)に呼び出されます。
```

```dart
Stream stream;
useEffect(() {
    final subscription = stream.listen(print);
// useEffectを呼び出してstreamを購読し、ウィジェットが破棄されたタイミングでサブスクリプションがキャンセルされます。    
    return subscription.cancel;
  },
// streamが変更された場合、stream.listenがキャンセルされて新しいstream.listenが呼ばれます。
  [stream],
);
```
###useXXXXXは、値なり処理を閉じ込める役割をbuildで毎回呼ばれると大変なので使いやすく考えられているのですね。
私が集めた有益な情報・知識のまとめ

# はじめに
Qiitaで私が集めた有益な情報・知見のまとめ記事をいくつか投稿してきた。
記事へのアクセスをしやすくするために、そのまとめ記事のまとめ記事を作っておく。
継続的に更新予定。

# まとめ記事のまとめ
記事は、代表的なタグで分類をしておく。

## 新人プログラマ応援

https://qiita.com/kazuo_reve/items/d1a3f0ee48e24bba38f1

https://qiita.com/kazuo_reve/items/eb507c5ce5ce39155b1c

https://qiita.com/kazuo_reve/items/24126819f4aaee20112f

## プロジェクト管理
https://qiita.com/kazuo_reve/items/6976029e72763ea73245

## アジャイル
https://qiita.com/kazuo_reve/items/98708aa810b526e3f590

## プロセス改善
https://qiita.com/kazuo_reve/items/2c9a2d13bd57282bec1f

https://qiita.com/kazuo_reve/items/097981b3f11da3f559ba

https://qiita.com/kazuo_reve/items/5bd632513fdf512d7164

## レビュー
https://qiita.com/kazuo_reve/items/f6e26643dc390b4a4120

## なぜなぜ分析
https://qiita.com/kazuo_reve/items/283bccd16816d5ae4d15

## データ分析
https://qiita.com/kazuo_reve/items/e0b4c078bcdcff521960

https://qiita.com/kazuo_reve/items/ce39ccb23d2dc501c49f

https://qiita.com/kazuo_reve/items/f3987ae9256e9e9c1230

## ソフトウェアテスト
https://qiita.com/kazuo_reve/items/157423aff900ac3b9e16

https://qiita.com/kazuo_reve/items/4ca6b29eaa0cd9adcbf8

https://qiita.com/kazuo_reve/items/492f3db1fbcff510b14a

## ソフトウェア工学
https://qiita.com/kazuo_reve/items/48e9fa49a0556d045639

https://qiita.com/kazuo_reve/items/dc9e170a45fb033127fd

https://qiita.com/kazuo_reve/items/808dee5fd80b72488587

## ポエム
https://qiita.com/kazuo_reve/items/274c8e43fad4ed45715b

https://qiita.com/kazuo_reve/items/852dc6fce47f525dfd6c

https://qiita.com/kazuo_reve/items/a2e15627f0eff62e6af6

https://qiita.com/kazuo_reve/items/a3ea1d9171deeccc04da

https://qiita.com/kazuo_reve/items/bce7522fa2cca0995b85
vitis hlsをインストールしてみた

ubuntu 20.04 にvitis hlsをインストールしたのですが、エラーを吐かずに固まってしまいハマってしまったのでメモ。

## インストール

[ここ](https://www.xilinx.com/support/download.html)にアクセスして

 Xilinx Unified Installer 2021.2: Linux Self Extracting Web Installer 

をクリックしてDL。Xilinxのアカウントがなければ作りましょう。

DLが終わったら、

```shell
chmod +x ~/Downloads/Xilinx_Unified_2021.2_1021_0703_Lin64.bin
sudo ~/Downloads/Xilinx_Unified_2021.2_1021_0703_Lin64.bin
```
おそらく、このまま実行していると下記のようなエラーが起こると思います。

> 76616 - Vitis 2021.1 - Install - Install hangs on Ubuntu 20.04
> 9月 23, 2021•Knowledge
> タイトル
> 76616 - Vitis 2021.1 - Install - Install hangs on Ubuntu 20.04
> Description
> During an install of Vitis/Vivado on Ubuntu 20.04, the installer seems to hang on the "Generating installed device list" step.
> https://support.xilinx.com/s/article/76616?language=ja

上記の問題が発生するようであれば、Solutionとして提示されている

```shell
sudo apt-get install libtinfo5
```

を実行してから、`Xilinx_Unified_2021.2_1021_0703_Lin64.bin` を実行しましょう。

## 参考文献
https://support.xilinx.com/s/article/76616?language=ja
Windowsの設定の半自動化方法

[macでのやり方](https://qiita.com/DiveMasakazu/items/ac4c6daad50084656758)は見たので、windowsでサードバーティー製品を使わずに初期設定を自動化する場合の対応方法を軽く見ておく。
最近はwingetというものが使えるようになっていて、HomeBrewやAptのようなものと考えると良いみたい。

##  Windows Package Manager＝wingetのインストール
手動でストアやGitからダウンロードする事も可能で、特にバージョンを固定したい場合はGitとなるが、
PowerShellでのインストールが簡単なのはストア経由でのインストールなので、そちらを選択するとよいかも？
最近のバージョンのWindowsでは標準でwingetが入っていたので、手でインストールはしなくてよかった。

```powershell
PS C:\Users\ponyt> winget -v
v1.1.13405
```

# WindowsUpdate

アプリの前にOS本体。
PowerShellにモジュールを入れてアップデートするとコマンド経由でアップデートできるようになる、はず（未確認）

```powershell
Install-Module PSWindowsUpdate
Get-WindowsUpdate
Install-WindowsUpdate
```

## winget経由でのアプリのインストール
wingetで必要なアプリをインストールしていく。
PowerShellから実行。

[https://zenn.dev/atsushifx/articles/winget-help-commands](https://zenn.dev/atsushifx/articles/winget-help-commands)

例えばこんな感じ

````powershell:install.ps
# コマンド
winget install 7zip
winget install --id Google.Chrome --force --silent
# BuildToolsはC++などを使う場合「変更」から追加インストールが必要になることに注意
winget install "Visual Studio Build Tools 2019"
winget install -q vscode --scope machine
winget install -e Node.js

# pyenv
winget install Python.Python.3

# hubのみ。本体は手動インストール
winget install -e --id UnityTechnologies.UnityHub

#VScodeの拡張
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
code --install-extension ms-dotnettools.csharp
code --install-extension Unity.unity-debug
code --install-extension kleber-swf.unity-code-snippets
code --install-extension mhutchie.git-graph
code --install-extension mosapride.zenkaku
code --install-extension k--kato.docomment
code --install-extension ms-ceintl.vscode-language-pack-ja
```

importコマンドでJSONファイルを利用してインストールする事も可能らしい。

# その他設定

PC名の変更コマンド

```powershell
set /p pcname=PCname :
wmic computersystem where name="%computername%" call rename name="%pcname%"
```

レジストリで設定変更

* 拡張子の表示
* 検索ボックスからWeb検索を除外

```powershell
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d "0" /f
reg add "HKCU\SOFTWARE\Policies\Microsoft\Windows\Explorer /v DisableSearchBoxSuggestions" /t REG_DWORD /d 1 /f
```

こんな感じである程度はいけそう。

PowerShellでパスを再読み込みする場合は以下のコマンドを入れる。
```
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
```

PowerShellは管理者で実行するとよい。
（あと、最新版のPowerShellを入れた方がいい）
Win10でAV1 Video ExtensionをインストールするとBitmapImageでAVIFがデコードできるようになる

## Win10でAV1 Video ExtensionをインストールするとBitmapImageでAVIFがデコードできるようになる
Windows10のMicrosoft StoreにAV1 Video Extension(以下AV1拡張)というものがあります。AV1ビデオを再生できるようにするためのものですが、なんか説明がぼんやりしてます。

>Play AV1 videos in your favorite video app on your Windows 10 device. This extension helps video apps installed on Windows 10 play videos that have been encoded using the AV1 video coding standard developed by the Alliance for Open Media.

AV1拡張をインストールすると、ペイントと写真アプリで.AVIFファイルが開けるようになることも比較的よく知られています。
ぼんやりと、アプリにパッチあたったのかな～と思っていたのですが、テストプログラムで確認するとそうではなかったようです。

```cs
using (MemoryStream ms = new MemoryStream())
{
    FileStream fs0 = new FileStream("apple.avif", FileMode.Open);
    fs0.CopyTo(ms);
    fs0.Close();

    BitmapImage page = new BitmapImage();

    page.BeginInit();
    page.DecodePixelHeight = processHeight;
    page.CacheOption = BitmapCacheOption.OnLoad;
    page.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
    page.StreamSource = ms;
    page.EndInit();

```

テストプログラムの雑な抜粋ですが、apple.avifの内容をMemoryStreamに読みこんでBitmapImageのStreamSourceに指定しています。

適当なイメージコントロールにBitmapImageを設定するとりんごの絵が表示されます。

ひょっとしてAVIF対応のBitmapEncoderは追加されてないかなあ？
Flask-loginを読み解く

##はじめに
先日、株式会社オフグリッドに入社しました。

社内でQitaを投稿している方がいたので、
自分もアウトプットの習慣をつける為に記事を投稿していこうと思い本記事を執筆することにしました。

間違っていることが多々あると思いますが。。。

### flask-loginとは？
Flaskでログイン機能を実装する際には使われることの多いライブラリ。

ここからはFlask-loginの使い方を読み解いていこうと思います。


### インストール方法

インストール方法は

```
pip install flask-login
```

### 設定方法

pipのinstallが終わったら、アプリケーションにflask-loginの設定を反映させる

```python:app.py
login_manager = LoginManager()
```

LoginManagerクラスのインスタンスを生成。
LoginManagerクラスはflask-loginの中核を担うクラス。

公式ドキュメントにてLoginManagerクラスの説明を確認。

> **Configuring Login** 
>class flask_login.**LoginManager**(app=None, add_context_processor=True)[source]
>This object is used to hold the settings used for logging in. Instances of LoginManager are not bound to specific apps, so you can create one in the main body of your code and then bind it to your app in a factory function.

このクラスはLoginの設定を保持するために必要となるクラス。
特定のアプリにバインドする必要があるので上記のコードが必要になる。

source codeの全容を確認する際はこちらのリンクから確認できる。
[source_code](https://flask-login.readthedocs.io/en/latest/_modules/flask_login/login_manager.html#LoginManager)

LoginManagerクラスをアプリに設定したら、次のコマンドを実施。

```python:app.py
login_manager.init_app(app)
```

flask-loginはsession上でログインデータを管理している。
なので、実装をする際にはsecret_keyを設定する必要がある。

```python:models.py
@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)
```

次にload_user関数を定義する。
こちらでuser_idを

```python:flask-loginのドキュメント内
 def user_loader(self, callback):
        '''
        This sets the callback for reloading a user from the session. The
        function you set should take a user ID (a ``unicode``) and return a
        user object, or ``None`` if the user does not exist.

        :param callback: The callback for retrieving a user object.
        :type callback: callable
        '''
        self._user_callback = callback
        return callback

```

このようにuser_loader関数でsessionからuser_idをリロードしている。

また、Userクラスの実装を簡単にするためにUserMixinクラスが用意されている。

継承させたいクラスにUserMixinを継承させて使用すると、簡単にログイン機能が実装できる。


### 終わりに

尻切れになっている部分も過分にございますが。。。

今後もQitaで記事を投稿していくつもりなのでよろしくお願い致します。
Kubernetes の CRI を Dockershim から containerdに移行する

# はじめに

`k8s`が`dockershim`をサポートしなくなるという話はずいぶん前からあって、いつか何とかしないとなーと思っていたのですが、軽く調べてもそれらしい情報が出てこなかったので放置していました。

が、ふと気になって調べてみるとドンピシャな情報が。

https://kruyt.org/migrate-docker-containerd-kubernetes/

基本的には↑に書いてある通りなのですが、やってみると実際の手順は少なく、ものすごく簡単だったので改めてまとめてみます。

# 移行

`Docker`は`containerd`で動いているため、[公式のインストール手順](https://docs.docker.com/engine/install/ubuntu/)でも`Docker`インストール時に`containerd`も一緒にインストールしています。
そのため、基本的には設定を切り替えるだけで移行が完了します。

## containerdの設定変更

以下のファイルを編集します。`nano`でも`vi`でもOKです。

```
sudo nano /etc/containerd/config.toml
```

`disabled_plugins` という項目があるので、これをコメントアウトします。

```
#disabled_plugins = ["cri"]
```

## ランタイム変更

こちらも、好きなエディタで開いてください。

```
sudo nano /var/lib/kubelet/kubeadm-flags.env
```

`KUBELET_KUBEADM_ARGS`という環境変数が記載されているので、以下を追加します。

```
--container-runtime=remote --container-runtimeendpoint=unix:///run/containerd/containerd.sock"
```

全体ではこんな感じになります。

```
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2
--resolv-conf=/run/systemd/resolve/resolv.conf --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
```

この環境変数が、`kubelet`実行時に読み込まれるようです。

## 再起動

手順としてはこの2つのみになるので、再起動します。
ホストのアップデートなど、他に用があれば`kubectl drain`した後にノードを物理的に再起動しても良いのですが、サービスだけを再起動する場合は以下のコマンドになります。

```
sudo service containerd restart
sudo service kubelet restart
```

# おわりに

今まで手をこまねていたのは何だったのかと思うほどあっさり終わりました。
ほぼ元記事を日本語にしただけですが、何かの参考になれば幸いです。
rex0220 計算式プラグイン 文字連結

計算式プラグインの文字連結の基本的な使い方です。
文字列項目だけではなく、チェックボックス・ユーザー選択項目なども、文字連結が可能です。

# 概要

計算式プラグインでは、文字列項目だけではなく、チェックボックス・ユーザー選択項目なども文字連結が可能です。
条件を指定してのテーブル項目の文字連結にも対応しています。

![2022-02-08_10h57_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1bb62c07-9b33-4a28-ef08-28fc334caca4.png)

# 文字列・数値・日付の文字連結

単純な項目の連結は、& 演算子で指定します。kintone 標準の自動計算と同様です。
数値・ドロップダウン・ラジオボタン・リンク項目なども文字列項目と同様に指定可能です。
日付は、数値としてあつかわれますので、DATE_FORMAT 関数で文字変換します。
DATE_FORMAT 関数は、オプション指定がkintone 標準の DATE_FORMAT 関数と少し異なります。

- 文字列C：　kintone 標準の自動計算
    - 文字列A&","&文字列B&","&数値A&","&DATE_FORMAT(日付A,"YYYY-MM-dd","Asia/Tokyo")
- 文字列D：　計算式プラグイン
    - 文字列A&","&文字列B&","&数値A&","&DATE_FORMAT(日付A)

※計算式プラグインの DATE_FORMAT 関数
DATE_FORMAT(日付A) は、DATE_FORMAT(日付A,"YYYY-MM-DD") の省略

![2022-02-08_11h10_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5d1f6d6f-56e3-bdec-d942-7fd6a99dd9a6.png)

日付が未入力時のkintone 標準の自動計算と計算式プラグインの実行結果の違い

- 文字列C：　kintone 標準のDATE_FORMAT 関数
    - 日付未入力時は、"1970-01-01" に変換
- 文字列D：　計算式プラグインのDATE_FORMAT 関数
    - 日付未入力時は、"" に変換

![2022-02-08_11h10_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2a243612-5b7c-3b6e-9bcb-e04f7421b7ee.png)

# チェックボックス・複数選択の連結

チェックボックス・複数選択は、複数の値を配列形式で持っていますが、
計算式プラグインでは、配列の値を","区切りの文字列に連結して変換します。

- 文字列E：　" - " で連結
    - チェックボックス&" - "&複数選択
- 文字列F：　配列を"-" で連結し、項目を", " で連結
    - JOIN(チェックボックス,"-")&", "&JOIN(複数選択,"-")
- 文字列G：　単純に"," で連結
    - ARRAY(チェックボックス,複数選択)
- 文字列H：　重複値を除いて連結
    - DISTINCT(チェックボックス,複数選択)

![2022-02-08_11h33_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e528f8c2-41ea-fe23-3660-1019764e6046.png)

# ユーザー選択・組織選択の連結

ユーザー選択・組織選択は、複数の値を配列形式で持っていますが、
計算式プラグインでは、名称を", "区切りの文字列に連結して変換します。

- 文字列I　" - " で連結
    - ユーザー選択&" - "&組織選択
- 文字列J：　名称を"," で連結し、項目を" - " で連結
    - JOIN(ユーザー選択,",")&" - "&JOIN(組織選択,",")
- 文字列K：　単純に"," で連結
    - ARRAY(ユーザー選択,組織選択)

![2022-02-08_11h48_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/10544120-0600-2887-0d62-5ead186ecff5.png)

# テーブル項目の連結（行単位）

テーブル項目を & で連結するか、ARRAY 関数でまとめることが出来ます。

- 文字列T2：
    - ARRAY(文字列T1,ドロップダウンT1,チェックボックスT1)

![2022-02-08_12h55_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/154d8b94-131f-8231-a4bc-9e3aafdc2a87.png)

# テーブル項目の連結（テーブル単位）

- 文字列TA：　CONCAT 関数で連結
    - CONCAT(文字列T1)
- 文字列TB：　TARRAY 関数で配列化して連結
    - TARRAY(文字列T1)
- 文字列 (複数行)：　TARRAY 関数で配列化して、JOIN 関数で改行を入れて連結
    - JOIN(TARRAY(文字列T1),NEWLINE())

![2022-02-08_12h57_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9991a532-56d4-b4fc-fa9b-fd390f3218b7.png)


# テーブル項目を条件によって連結（テーブル単位）

- 文字列_sample1：　TDSIF 関数で、ドロップダウンT1="sample1" のチェックボックスT1 の値を重複なしで連結
    - JOIN(<br>
    TDSIF(ドロップダウンT1="sample1",ARRAY(チェックボックスT1),ARRAY())<br>
    ,NEWLINE())
- 文字列_sample2：　TDSIF 関数で、ドロップダウンT1="sample2" のチェックボックスT1 の値を重複なしで連結
    - JOIN(<br>
    TDSIF(ドロップダウンT1="sample2",ARRAY(チェックボックスT1),ARRAY())<br>
    ,NEWLINE())


![2022-02-16_17h40_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/94798a26-86ff-f41d-54b2-3a57418b3b23.png)
PaloaltoVM•EC2利用方法

## PaloaltoVM 過去掲載記事リンク集

https://qiita.com/nw-engineer/items/15e86a4a4bbced4318e5　


https://qiita.com/nw-engineer/items/bd34a4499115cbeed331

https://qiita.com/nw-engineer/items/f97327cc1e8dea93533c

https://qiita.com/nw-engineer/items/1d4a1988983151f86bdb　


https://qiita.com/nw-engineer/items/c6d2a6365373a2c0ffbe　


https://qiita.com/nw-engineer/items/21e2c12f3ee55fcf38d8
テトラヘドロン法

<iframe src="//www.slideshare.net/slideshow/embed_code/key/s9a4EWd0FNF3jS" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>
VSCodeで現在開いているファイルをDiffする


`command+shift+p`でコマンド入力画面を出す。

`compare`と入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/199ea2d0-6f1d-e50b-17cb-0034cca172ea.png)

「アクティブファイルを比較しています…」を選択する。

そうするとこのような選択ができるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/723050ae-3ec5-eb0e-bfa1-0f3b3649ef2f.png)

比較したいタブ（ファイル）を選ぶ。（bbbbbbでcompareを実行したので、aaaaaを選ぶ。）

新たにタブが開いて、比較結果が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/74248861-6f98-5c93-b95a-9991a603fb07.png)

かんたんですね。
応用数学　第2章　確率・統計

#1．はじめに
　確率・統計について学習した内容をレポートにまとめました．

#2．頻度確率とベイズ確率
　確率は大きく分けて以下の２つに分けられる．
####　頻度確率（客観確率）
　　　・発生する頻度

####　ベイズ確率
　　　・信念の度合い

#3．条件付き確率
　・ある事象X=xが与えられた下で，Y=yとなる確率


```math
𝑃(𝑌=𝑦|𝑋=𝑥)=\frac{𝑃(𝑌=𝑦,𝑋=𝑥)}{𝑃(𝑋=𝑥)}
```
　すでに起こったある事象をA，その後に起こった事象をBとすると次のようになる．

```math
𝑃(B|A)=\frac{P(B)𝑃(A|B)}{𝑃(A)} \\
𝑃(B|A)=\frac{P(A∩B)}{𝑃(A)}
```
　また，AとBが独立（お互いに確率について影響を与えない）な場合には，
　次のように計算できる．

```math
P(A∩B)=P(A)P(B)
```

#4．確率変数と確率分布
####　確率変数
　　　・事象と結び付けられた数値
　　　・事象そのものを指すと解釈する場合も多い
　　　例：さいころの出る目

####　確率分布
　　　・事象の発生する確率の分布
　　　例：さいころでは，1から6までの確率変数の値にそれぞれ1/6の確率が対応している．

#5．期待値（離散値と連続値）
　確率変数Xが**離散値**（さいころの目など）を取る場合，
　期待値（または平均値）は次のようになる．

```math
E(X)=
\sum_{i=1}^{n} x_ip_i
```
　また，確率変数が連続値を取る場合には次のようになる．

```math
E(X)=
\int_{-∞}^{∞}xp(x)dx \\
```

#6．分散と標準偏差
####　分散
　　　・データの散らばり具合を示す．
　　　・各データが平均からどのくらい離れているかの平均．
　　　・単位は2乗になるため，扱いづらいとされている．
　　　・N：全データ数，xバー:平均

```math
V(X)=
\frac{1}{N}
\sum_{i=1}^{N} (x_i-\bar{x})^{2}
```
```math
V(X)=E(X^{2})-E(X)^{2}
```

####　標準偏差
　　　・分散の平方根をとったもの．
　　　・単位が2乗じゃなくなるので，分散より扱いやすい．

```math
\begin{align}
σ&=\sqrt{V(X)} \\
&=\sqrt{
\frac{1}{N}
\sum_{i=1}^{N} (x_i-\bar{x})^{2}
}
\end{align}
```
#7．様々な確率分布
####　ベルヌーイ分布
　　　・取り得る値が2パターンしかない分布（k=0,1）

```math
P(X=k)=p^{k}(1-p)^{1-k}
```

####　二項分布

　　　・n回のベルヌーイ試行を行うときにちょうどn回成功する確率

```math
P(X=k)=nCk・p^{k}(1-p)^{n-k}
```
####　ガウス分布（正規分布）

　　　・平均μの周りにデータが集中する分布．
　　　・μ±σ（標準偏差）の範囲内には約7割のデータが含まれている．
　　　・計算がしやすい分布といわれている．

```math
N(x;μ,σ2)=
\frac{1}{\sqrt{2π}σ^2}e^{-\frac{(x-μ)^2}{2σ^2}}
```
ValueNotifierとValueListenableBuilderを調べてみて(Flutter)


#ValueNotifierとは

notify(通知)できる`value:`(状態変数)が一つに強制されている状態管理クラスで管理したいクラスのインスタンスをvalueに入れて管理でき、valueが変更になった場合のみlistener(ウィジェット)に通知します。listenerはオブジェクトが更新されたことをクライアントに通知してくれます。notifier(通知を出す側)とlistener(通知を受ける側)はセットで考えてください。ValueNotifierは、int、String、double、boolean型のデータを保持でき、独自のデータ型（クラスを使用）を使用することが可能です。もし`メソッド`を使いたい場合はValueNotifierをextendsしたクラスを作りそこで定義すればOK。

#ValueListenableBuilderとは

ValueNotifierの受け取り側(listener)でValueListenableに登録された単一の通知を受けて更新したvalueをbuilderに反映してくれます。Listenableとは受取可能を意味し、リスナーのリストを維持するオブジェクトです。ValueNotifier(子)は、ValueListenableBuilder(親)を使用してそれをlistenしているウィジェットのみを再構築します。

##以上のことから、ValueNotifierとValueListenableBuilderのしていることは、値が変わったことを通知してくれて画面を毎回書き直してくれていることがわかりました。
Excel×Pythonにおけるopenpyxlの弱点

### 背景
backendでopenpyxlを用いて値張りシートを作成する必要があった為、技術調査を行った。この過程で、openyxlの様々な弱点が見つかったので、ここに残しておく。

### 技術調査
#### Excel×Pythonを実現するライブラリについて
|            | 　　条件　 　| マクロ実行可否 | 本番環境での使用可否 |
|:----------:|:-----------:|:------------:|:------------:|
| openpyxl   | -           | 不可能         | 可能 |
| xlwings    | Excel導入 | 可能       | 不可能 |
| win32com   | 1. Excel導入<br/>2. Windows | 可能         | 不可能 |

#### 問題点について
1. ブックを超えたシートの貼り付けが出来ない。
2. 値のみのコピーは出来ない。
3. openpyxlで関数を記述したファイルから値をのみを取得しようとすると、関数を取得してしまう。
4. openpyxlで記述したファイルをdata_only=TrueでDLした場合、関数部分が空白に置き換わってしまう。

［WIP］詳細な説明は今後追加予定
anyenvことはじめ 

複数言語とVersionの環境設定が複雑になり、面倒なのでanyenvを入れました!!
備忘録として記事を残しアップデートしていきます。

https://github.com/anyenv/anyenv

[・ダウンロード](#anyenvのダウンロード)
[・PATH設定](#reference)
[・インストール対象を確認](#インストール対象を確認)
[・インストール方法](#使いたいenvを選択する)
[・アンインストール方法](#アンインストールしたい時)
[・個別のVersionをinstallしたい時](#個別Versionのinstall)
[・installしたVersionをデフォルト指定したい時](#個別Versionのデフォルト指定)

## anyenvのダウンロード
ソースをGitHubからクローンします。

```sh
git clone https://github.com/anyenv/anyenv ~/.anyenv
```
<a id="#reference"></a>##PATH設定
zsh設定で記載していますので、bashの方は書き換えてください。

```sh
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(anyenv init -)"' >> ~/.zshrc

#シェルを再起動します。
exec $SHELL -l

#installできているか確認します。（できていれば、version表示されます。）
anyenv --version
```

## インストール対象を確認
インストール対象を表示できます。

```sh
anyenv install --list
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  jlenv
  luaenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
  tfenv
```
## 使いたいenvを選択する
欲しいものをinstallします。

```sh
#anyenv install 〇〇〇envを使います。
anyenv install nodenv
anyenv install pyenv
anyenv install rbenv
#↑参考例です。

#シェルを再起動します。
exec $SHELL -l
```
以上で、installした〇〇〇envを使えます。

## アンインストールしたい時
いらないものはコマンドをinstall ⇨ uninstallに変えるとアンインストールできます。

```shell
#anyenv uninstall 〇〇〇envを使います。
anyenv uninstall nodenv
```

## 個別Versionのinstall
nodeを例に個別Versionのinstall方法をあげます。
(各々のenvの設定方法に従ってください。)

nodeの参考例です。

https://zenn.dev/donchan922/articles/b08a66cf3cbbc5



```sh
nodenv install {バージョン番号}
```

## 個別Versionのデフォルト指定方法
nodeを例に個別Versionをデフォルトに指定する方法をあげます。
(各々のenvの設定方法に従ってください。)

```sh
nodenv global {バージョン番号}
```
Datadog APIをGASから叩く

#GASのUrlFetchAppでDatadog APIを叩く

ダッシュボードAPIの例

###ダッシュボードのJSONを取得する

```javascript:main.gs
let option = {
  'method' : 'GET',
  'contentType' : 'application/json',
  'headers' : {
    'DD-API-KEY' : APIキー,
    'DD-APPLICATION-KEY' : アプリケーションキー
  }
};

let response = UrlFetchApp.fetch('https://api.datadoghq.com/api/v1/dashboard/' + 'ダッシュボードID', options);
let json = response.getContentText();

// ダッシュボード内に日本語などのマルチバイト文字がある場合はunicodeエスケープを戻すこと
json = json.replace(/\\u([a-fA-F0-9]{4})/g, function(x,y){
  return String.fromCharCode(parseInt(y,16));
}

// 配列で扱う場合はパースしてね
json = JSON.parse(json);

```

###ダッシュボードを更新する
```javascript:main.gs
let option = {
  'method' : 'PUT',
  'contentType' : 'application/json',
  'headers' : {
    'DD-API-KEY' : APIキー,
    'DD-APPLICATION-KEY' : アプリケーションキー
  },
  'payload' : JSON文字列
};

UrlFetchApp.fetch('https://api.datadoghq.com/api/v1/dashboard/' + 'ダッシュボードID', options);

```

### ダッシュボード一覧を取得してスプレッドシートに出力する
```javascript:main.gs
let option = {
  'method' : 'GET',
  'contentType' : 'application/json',
  'headers' : {
    'DD-API-KEY' : APIキー,
    'DD-APPLICATION-KEY' : アプリケーションキー
  }
};

let response = UrlFetchApp.fetch('https://api.datadoghq.com/api/v1/dashboard/' + 'ダッシュボードID', options);
let json = JSON.parse(response.getContentText());

// 必要な情報だけ2次配列として格納する
let dashboard_list = [];
for(let i=0; i < json.length; i++){
  let value1 = json[i].id;
  let value2 = json[i].title;
  let value3 = json[i].description;
  let value4 = json[i].author_handle;

  dashboard_list.push([value1,value2,value3,value4]);
}

// スプレッドシートに書き込み
let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
let sheet = spreadsheet.getActiveSheet();
let row = dashboard_list.length;
let col = dashboard_list[0].length;

sheet.getRange(任意のセル行, 任意のセル列, row, col).setValues(dashboard_list);

```
非エンジニアに向けてクラウドサービスについて簡単に説明してみた

##はじめに
去年の12月ごろ、社内にて営業や人事といった技術以外の部署の人間を巻き込んで、
リテラシー向上のためのIT講習会を行いました。

その際の事前質問で、クラウドサービスについて教えて欲しいと言われたので、その時の内容です。
眠らせておくのも勿体無かったのでQiitaにも載せておきたいと思います。

※この記事には、私の独断と偏見が結構含まれています。

##資料

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTuoMXm1W9nFzkDpQD8wFBYAYdx0AwbRHTM8rPunl7DCt4FU1wAFoamKhizDn3BvOjULreL4PPCvHAH/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

 
30分という枠の中で、Zoomの画面共有で資料のスライドを進めながら質問や解説を入れていたので、
少し説明が足りない＆分かりづらいところもあるかもしれません。


#なぜ今Cloudなのか？

##そもそもCloudとは？

クラウドサービスとは、PC内のローカルなシステムではなく、インターネット経由で他の場所にあるシステムを利用する仕組みのこと。

近年、クラウドサービスは主流化し、知らぬ間にクラウドサービスを利用している人も増えてきている。


クラウドサービスの代表例
LINE、Slack、Gmail...etc

例えば、Outlookのメールを利用できるまでには、PCにソフトウェアのインストール作業や別途メールサーバの構築などが必要になり、
このような作業を行う手間が掛かる。

クラウドサービスとして提供されているメールサービスを利用すれば、ソフトウェアにインストールしなくても、クラウドサービスのアカウントさえあれば、例えばGmailであれば、Google Chromeのブラウザを通してメールを利用出来る。


##クラウドサービスの種類

クラウドサービスには様々なサービスがあり、大きく3つに分類される。
それぞれ…、
『SaaS』(サース)
『PaaS』(パース)
『IaaS』(アイアース or イアース)

IaaSはインフラストラクチャ、PaaSはプラットフォーム（アプリケーションを動かすための環境）、SaaSはソフトウェア（具体的なアプリケーション）を提供する。

##『SaaS』(サース)とは？

「Software as a Service」の略で、読み方は「サース」もしくは「サーズ」。
従来、パッケージとして提供されていた機能が、クラウドサービスとして提供される形態のことで、SaaSはクラウドの一部である。一般的にクラウドサービスというとSaaSを指す。有名どころでいうとGmail、 Slackなど。

##『PaaS』(パース)とは？

「Platform as a Service」の略で、読み方は「パース」もしくは「パーズ」。
PaaSは開発基盤としてサーバーやストレージ、ネットワークに加えて開発系のミドルウェアをクラウドサービスとして提供する。Amazon Web Services(AWS)やMicrosoft Azureなどがある。これらのサービスはIaaSも同時に提供されることが多い。

##『IaaS』(アイアース)とは？

「Infrastructure as a Service」の略で、読み方は「アイアース」もしくは「イアース」。
情報システムを稼働させる際に必要とされる機材やネットワークをインターネット上で提供する。
大きな特長は、サーバーを利用する際に必要なハードウェアのスペックやOSをユーザーが自由に選定できるため、柔軟なシステム運用ができること。HaaSと呼ばれることもある。

##各サービスを比較してみよう

![スクリーンショット 2022-02-08 11.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/6640859d-95ee-3012-11f3-902e4fd69513.png)

##Cloud導入のメリット・デメリット

###メリット

1.初期費用が安い(無料もある)
2.導入が簡単
3.障害対応も提供者側が行う
4.開発面ではサーバ拡張などが容易
5.端末が壊れてもデータはクラウド上に残る

オンプレミスにした場合

一般的なPCサーバーだと約200万円程度の費用が必要となる。
しかも、PCサーバーでは運用にあたりクラッシュの危険があるほか、バックアップが取れないというリスクがある。
リスクを回避する機能を備えたサーバーを購入する場合、500～1,000万円程度の費用が必要になる。＋ 人件費が掛かる

一から構築する場合、要件定義や設計、テスト、リリースまで含めると、約半年は掛かると言われている。

###デメリット

1.細かいカスタマイズが出来ない
2.インターネット環境に全て依存してしまう
3.ランニングコストが高額になる可能性がある
4.サービスが終了する場合がある


##まとめ

今はクラウドサービスは日常生活やビジネスにおいても欠かせないものになった。
また、ITサービスを開発する環境もクラウドで提供されていることが多くなり、ITエンジニアとしても必須の知識となっている。
今、SaaS開発が熱い！

###おわり

##第一回目

https://qiita.com/shimajiri/items/74aa1487499321910d8f

##第二回目

https://qiita.com/shimajiri/items/7ea687b62255a82a2eca
Next.jsでfaviconを表示させる方法

##前置き
どうも！文系就活生大体ポートフォリオ作りがち。グッピーです！

今回はnext.jsでfaviconをどうやって表示させるかについて書いていきます！

##faviconとは
webページのタブ表示やブックマークしたときにwebページ名の横に並ぶ小さなアイコンのことです！
faviconってそのことだったんだ・・と知らなかったのはここだけの秘密です。

##next.jsでfaviconを表示させる方法
###1:faviconをpublic/staticフォルダに追加
publicフォルダの中にstaticというファイルを作り、その中に画像を入れましょう。形式はicoかpngが望ましいでしょう。

###2:pagesに_app.jsを追加。
NExt.jsではpages/_app.jsが全体設定のためのインターフェースとして用意されています。詳しくは各々で調べて欲しいのですが、今回はこちらのページに記載していきます。

###3:_app.jsにコードを追加
以下のコードを追加していきます。必要なコードは適宜皆さんで追加していってください！

```
import 'style/styles.css'
import Head from "next/head"

export default function App({
  Component,
  pageProps: { session, ...pageProps },
}) {
  return (
    <>
    <Head>
      <link rel="shortcut icon" href="/static/favicon.ico"/>
    </Head>
    </>
  )
}

```

そして、npm run devを押してページを開くと、faviconが表示されています！！
なっていない方は、以下のサイトなどが参考になったので、よかったら見てください！！

###参考にしたwebサイト
https://stackoverflow.com/questions/56213019/how-to-add-a-favicon-to-a-next-js-static-site


##まとめ
はい！今回はNext.jsでどのようにfaviconを表示させるかを書いていきました。
参考になったら幸いです！最後まで見てくださった方がいましたらLGTMだけお願いします！！励みになります！！

余談なのですが、ポートフォリオって皆さんどう思いますか？？
転職にポートフォリオが必要となっているのはプログラミングスクールの陰謀という話を師匠から聞いて戦慄しています。
またこんどその話も書いていきたいと思うので、よかったら見てください！！
ぶっちゃけ、<rp>タグっていらなくね？

#初めに
HTMLにはルビを振るための要素がいくつかある。

- `<ruby>`（ルビを振る要素全体）
- `<rt>`（ルビのテキスト）
- `<rp>`（ルビが振れない場合の括弧）
- （廃止済み）`<rb>`（ルビを振る文。`<rt>`が直前の文字列に付けられること、区切りが重要なら`<ruby>`で囲めばよいことから廃止になったのではと思われるが理由は不明）
- （廃止済み）`<rtc>`（ルビ文字列コンテナー。廃止されたのは使う場面がそれほどなかったからだろうか）

以前作成した記事から例を若干修正して再掲する。

<ruby>青眼の白龍<rp>（</rp><rt>ブルーアイズ・ホワイト・ドラゴン</rt><rp>）</rp></ruby>
これをhtmlで書くとこうなる。

```ルビ一例.html
<ruby>青眼の白龍<rp>（</rp><rt>ブルーアイズ・ホワイト・ドラゴン</rt><rp>）</rp></ruby>
```

この中で今回は`<rp>`について議論していく。

##`<rp>`って何のためにあるの？
われらが[MDN先生](https://developer.mozilla.org/ja/docs/Web/HTML/Element/rp)によると、「HTML のルビ代替表示用括弧 (`<rp>`) 要素は、 `<ruby>` 要素によるルビの表示に対応していないブラウザー向けの代替表示用括弧を提供するために使用します。」とのことである。つまり、ブラウザが対応していれば要らないものである。というわけで早速、Can I Use... で対応を見てみようか。

https://caniuse.com/ruby

どうしてQiitaはCan I Use... を直接引用できないのだろうか。上のリンクをクリックお願いします。

ご覧いただいた通り、`<ruby>`に対応していないブラウザはiOS版が供給停止されるなど撤退戦気味のOpera Miniのみである。つまり、意味が実質無い。

##HTML界の盲腸
だが、不要論を掲げる理由はそれだけではない。`<ruby>`タグと同時に勧告されているため、そもそも実装リソースを`<ruby>`に割いただろうということ、現在もしそのような実装をするならCSSの`::before`および`::after`疑似要素を使えば問題ないわけで、いちいちルビを付けたい要素に括弧を入れるのは恰好悪いし非生産的だ。

MDNの対応表を見るに、ルビ関連要素（[\<ruby\>](https://developer.mozilla.org/ja/docs/Web/HTML/Element/ruby#browser_compatibility)および[\<rt\>](https://developer.mozilla.org/ja/docs/Web/HTML/Element/rt#specifications)）の初実装がIE5、つまり[::before疑似要素などが存在しない時期](https://developer.mozilla.org/ja/docs/Web/CSS/::before#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7)にIEが独自実装した要素らしく、まさに「歴史的経緯」を伺わせる。しかし、HTMLの要素には廃止されたものがたくさんあるので、`<rp>`も同様に廃止すべきであろう。ということで、[WHATWGに提案を出しておいた](https://github.com/whatwg/html/issues/7590)。

##廃止時の影響
ここまで書いたところで、[ブラウザのルビ実装方法がまちまち](https://qiita.com/NagayamaToshiaki/items/25d4969636d05bf48c41#%E3%83%AB%E3%83%93)ということを思い出した。CSSの[@supports](https://developer.mozilla.org/ja/docs/Web/CSS/@supports)はhtml要素を見られないので、仮にルビ関連要素を実装していない（おそらくはOpera Miniの精神的後継者としてミニマリスト的思考で開発された）ブラウザが今後現れた際に面倒ではある（セマンティックを考えるとちゃんと実装すべきではあるが）。

また、新聞社がYahoo! ニュースなどに記事を提供する際に`<rp>`が無いと、ルビ非対応のニュースプラットフォーム側で括弧を自動生成する必要がある。ただ、こんな変換作業は大した工数無く出来るはずである。HTML系のパーサーなら`<rt>`を発見次第「`（`」を追加、といったことは簡単なはずだ。

後は、ルビの文字サイズが小さいため、括弧書きを望む人向けの設定変更も必要かもしれない。現状のブラウザ実装ではこの問題を容易に解決できないので、[専用の仕様を提案しておいた](https://github.com/w3c/csswg-drafts/issues/7024)。
SPSS Modeler ノードリファレンス 2-4 重複レコード

# 2-3 重複レコードノード[レコード設定タブ]
<img width="200" alt="107_89重複レコード.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/719f5faa-6960-0a19-104a-0633b3d719f4.png">

## 1.ノードの目的
重複するレコードを排除します。

## 2.解説動画（60秒）

<iframe width="560" height="315" src="https://www.youtube.com/embed/uPOp0royU8o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 3.クイックスタート
Webログデータから[顧客データ]の重複を排除します。
＊データは[5.参考情報]からダウンロードできます。
![スクリーンショット 2022-02-08 9.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d2fd0bff-96b0-0582-3c3a-77d7579f6cfd.png)
[可変長ファイル]ノードに[重複レコード]ノードと[テーブル]ノードを順番に接続します。
![スクリーンショット 2022-02-08 10.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f3d2bbdd-b768-a0a7-952c-7ef1e1fc6103.png)

[重複レコード]ノードをダブルクリックして編集します。[グループ化のキーフィールド]に[顧客番号]を選択し、それ以外は初期設定にします。
![スクリーンショット 2022-02-08 10.20.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fe5f8ff0-2ffb-0007-6fcb-21bbbe95a566.png)

[テーブル]ノードを実行します。重複が排除され、顧客ごとの最初のレコードのみが残され1499レコードになりました。
![スクリーンショット 2022-02-08 9.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b85246c0-76cf-b193-3c4b-2ea5dde4b077.png)
[顧客番号]と[page]の重複を排除してみます。 [DATE]で昇順ソートします。
![スクリーンショット 2022-02-08 9.59.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e6f71e33-def2-3d74-e117-8d08413899db.png)
[複合]タブでは残されるレコードの値の指定ができます。
![スクリーンショット 2022-02-08 9.59.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/805e77c5-87b4-02b3-da82-de45835c9846.png)
顧客が視聴したページがユニークなレコードになりました。
![スクリーンショット 2022-02-08 10.00.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d78d3ce0-ea2e-292b-1c0d-d561c5a1cc7c.png)

### レコード集計ノードとの比較
重複レコード（Distinct）とレコード集計（Aggregate）は結果的に同じような処理が可能です。レコード集計で以下のように設定します。
![スクリーンショット 2022-02-08 9.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cede950f-b467-f949-0a25-0421a36ac300.png)
顧客の重複が排除され、日付の最小値を計算していますので冒頭の処理と同等です。
![スクリーンショット 2022-02-08 9.55.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/94293d83-a51c-822b-9b36-20ed50b84d13.png)
数値フィールドの要約やレコード数のカウントなどはどちらもできますが、重複レコードは最初や最後のレコードや最頻値の保持などが出来るようになっています。

## 4.Tips

#### 休眠直前の行動の特定

https://community.ibm.com/community/user/blogs/yoichiro-nishimaki/2025/01/14/modelertips22

#### IoTセンサーデータの最大値や最小値の抽出

https://community.ibm.com/community/user/blogs/yoichiro-nishimaki/2025/01/14/modelertips09

## 5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/WebLog2021mac.csv

#### SPSS Modelerの重複レコード・ノードをPythonで書き換える。

https://qiita.com/kawada2017/items/0cdf8fda422d332ba931

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=nodes-distinct-node

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
Databricks のノートブックを見やすくする

# はじめに

Databricksのブラウザエディタのが読みにくいので読みやすくしてみます

## 結論

#### 1. クロームウェブストアから `Databricks Power Tools` プラグインをインストールする

> [Databricks Power Tools - chrome web store](https://chrome.google.com/webstore/detail/databricks-power-tools/mpffpmajkdieodggkakklfkghdiafhpo)

#### 2. プラグインのオプションページを開く

![Databricks_Power_Tools.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/fd61bf53-a1dd-6bb6-f64c-7d0373dd4275.png)

#### オプションページにCSSを追記する

> [Add more color to the Python code of your Databricks notebook \- KeesTalksTech](https://keestalkstech.com/2019/11/add-more-color-to-the-python-code-of-your-databricks-notebook/)

このページに用意されてるCSSをプラグインのオプションページに追加する
`font-size` を `14px` に変更しておくとより見やすい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/96c06cea-dd7c-ba33-f0e8-a7f19733c942.png)

`save` を押してDatabricksをリロードすれば完了！

## 注意点

Chromeのプラグインを使用するので、別ブラウザでは他のやり方を探す必要があります

## 追記（2022/4/7）

私は👇のCSSを適用しています  
VSCodeのフォントとほぼ同じになります

```css
/* replace font on all editors */
@import url('https://fonts.googleapis.com/css2?family=Inconsolata:wght@200;300;400&display=swap');

.codemirror-preview span, .CodeMirror-code span {
    font-family: 'Inconsolata', monospace;
    font-size: 18px;
    cursor: text;
    color: #777;
}

/* recolor @udf, method names and build in names */
.cm-builtin, .cm-meta, .cm-def {
    color: purple !important;
    font-weight: bold;
}

/* properties and function calls */
.cm-property {
    color: #ff0096 !important;
}

/* stuff like def, import, as */
.cm-keyword {
    color: #0096fa !important;
}

/* variables, parameters */
.cm-variable {
    box-shadow: inset 0 -3px 0 rgba(120, 120, 120, .076);
}

/* hovering over lines */
.CodeMirror-line:hover {
    background-color: rgba(200, 200, 200, 0.1)
}

.codemirror-preview span span:hover, .CodeMirror-code span span:hover {
    background-color: rgba(0, 150, 250, 0.076)
}

/* comments should not distract us from the code */
.cm-comment {
    color: #969696 !important;
}

/* green string */
.cm-string {
    color: green !important;
}

/* make bash scripts black */
.CodeMirror-line span {
    color: black;
}

/* make autocomplete box not truncate */
ul.CodeMirror-hints .CodeMirror-hint.jedi .display-text {
    max-width: initial;
}
```