OmniAICreator/Qiita-1.07M huggingface dataset:
formにid足すだけでreCAPTCHA v3を自動適用させる

# やりたいこと
- formに id="recaptcha" を足すだけでreCAPTCHAが動作するようにしたい。
- トークン期限2分は短すぎるので送信の直前にトークンを取得したい。

# 必要なもの
- jQuery
  - JavaScriptの文法に書き換えるなら不要。
- reCAPTCHA サイトキー
  - reCAPTCHAのサイトで発行できる。

# 準備
### JavaScript
以下のコードを入れる。
アクション名、サイトキー、id名は必要に応じて書き換える。

```javascript:js
$(function () {
    // 任意のアクション名
    let action = "LOGIN";
    // reCAPTCHAのサイトキー
    let siteKey = "SITE KEY";
    // 適用したいformのid名
    let formId = "#recaptcha";

    // api.js読み込み
    if ($(formId).length) {
        $("<script>", {
            src: "https://www.google.com/recaptcha/api.js?render=" + siteKey,
        }).appendTo("head");
    }

    // 送信イベント
    $(formId).submit(function (e) {
        let form = this;
        e.preventDefault();
        // トークンを受け取るinputを生成
        $("<input>", {
            type: "hidden",
            name: "recaptchaResponse",
            id: "recaptchaResponse",
        }).appendTo(form);
        // トークンを取得
        grecaptcha.ready(function() {
                grecaptcha.execute(siteKey, {
                    action: action,
                }).then(function(token) {
                    $("#recaptchaResponse").val(token);
                    // 送信
                    $(form).unbind("submit").submit();
                });
            });
    });
});
```

### HTML
あとはreCAPTCHAを適用したいformにjs側で指定したid名をつけるだけ。
api.js はスクリプト側で挿入するため、HTML側での挿入は必要なし。

```html:html
<form id="recaptcha"> <!-- idを入れる -->
    <input type="email">
    <input type="password">
    <button type="submit">送信</button>
</form>
```

# 結果
うごくよー
平面の演算

```
変数・関数定義
x1,y1=(1,0),(3,0)
x2,y2=(0,1),(0,3)

def c_plus(x,y):
    a,b=x
    c,d=y
    return a+c,b+d
def c_multi(x,y):
    a,b=x
    c,d=y
    return a*c-b*d,a*d+b*c

```
```
import matplotlib.pyplot as plt
plt.figure(figsize=(4,4))
plt.grid()
plt.scatter(x1[0],x1[1])
plt.scatter(y1[0],y1[1])
plt.scatter(c_plus(x1,y1)[0], c_plus(x1,y1)[1])
plt.title("平面の足し算",fontname="Meiryo")
```
これは直感通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/0de89af0-b8b7-9f75-54ef-2e4bd5273969.png)



```

x2,y2=(0,1),(0,3)
plt.figure(figsize=(4,4));
plt.axes().set_aspect('equal', 'datalim')
plt.grid(which='both',axis='both')
plt.scatter(x2[0],x2[1]);plt.scatter(y2[0],y2[1])

plt.scatter(c_multi(x2,y2)[0], c_multi(x2,y2)[1])
plt.title("平面の掛け算",fontname="Meiryo")
# 平面の掛け算は角度の回転と伸縮
```
直観に反するが、原点からの角度の回転+原点からの距離の定数倍をしているだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/dfe1a121-c04a-583e-8c1b-d8d660bb2aa0.png)

```

x3,y3=(2,2),(0,3)
plt.figure(figsize=(4,4));

plt.axes().set_aspect('equal', 'datalim')
plt.grid(which='both',axis='both')
plt.xlim(-lim_num,lim_num)
plt.ylim(-lim_num,lim_num)
plt.scatter(x3[0],x3[1]);plt.scatter(y3[0],y3[1])

plt.scatter(c_multi(x3,y3)[0], c_multi(x3,y3)[1])
plt.title("平面の掛け算",fontname="Meiryo")
# 平面の掛け算は角度の回転と伸縮

```
こちらも同様に45度回転+原点からの距離(2)をかけている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/bdf39650-650e-80ea-c76d-5df6268d7754.png)

```
x4,i=(3,1),(0,1)
prem=(0,0)
plt.figure(figsize=(4,4));plt.axes().set_aspect('equal', 'datalim');plt.grid(which='both',axis='both')
plt.scatter(x4[0],x4[1]);p,x = (prem[0],x4[0]),(prem[1],x4[1]);plt.plot(p,x,'--')
plt.scatter(i[0],i[1]);plt.plot(prem,i,'--')
plt.scatter(i[0],i[1])
plt.scatter(c_multi(x4,i)[0], c_multi(x4,i)[1]);p,x = (prem[0],c_multi(x4,i)[0]),(prem[1],c_multi(x4,i)[1]);plt.plot(p,x,'--')
plt.title("平面の掛け算",fontname="Meiryo")
# 平面の掛け算は角度の回転と伸縮

```
虚数との演算も同様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/35e6a3fe-c7fc-744b-f9bf-74f2a6c03f26.png)

```
x4,i=(3,1),(0,1)
prem=(0,0)
plt.figure(figsize=(4,4));plt.axes().set_aspect('equal', 'datalim');plt.grid(which='both',axis='both')
plt.scatter(i[0],i[1]);plt.plot(prem,i,'--')
plt.scatter(c_multi(i,i)[0], c_multi(i,i)[1]);p,x = (prem[0],c_multi(i,i)[0]),(prem[1],c_multi(i,i)[1]);plt.plot(p,x,'--')
plt.title("平面の掛け算",fontname="Meiryo")
# 平面の掛け算は角度の回転と伸縮
```
iの二乗。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/fa8d35d0-2d3d-d90d-99e1-87bed24effe7.png)
python + OpenCVで画像を加工① 画像を取り込んで大きさを変える

pythonとOpenCVを使って画像の加工をやっています。最終的には動画で人の顔を自動で認識→自動でモザイクをかけるところまでやりたいと思っています。

とりあえず今回は画像を取り込んで大きさを変えて出力するまでをまとめようと思います。
OpenCVのインストールは各所に記事があるので割愛いたします。

###①画像の取り込み

画像取り込みのためにはcv2.imread()を使います([OpenCVのチュートリアル](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_image_display/py_image_display.html) に大変分かりやすく解説してあります)。画像の保存場所とコードの保存場所が異なる場合はファイルパスで指定してあげる必要あり。

```python
img = cv2.imread('sample.jpg')
```
###②画像の加工(拡大・縮小)
cv2.resizeを使います。[OpenCVのDocumentation](http://opencv.jp/opencv-2svn/cpp/geometric_image_transformations.html)に解説がありますが、これが非常に分かりにくい。resize()は引数をいくつか指定する必要があるみたいです。

> cv2.resize(①加工する画像, ②加工する際の縮尺, ③縮尺の仕方)

こんな感じになるかと思います。実際のコードを下に。

```python
cv2.resize(img, dsize=(100, 200), interpolation = cv2.INTER_LINEAR)

#"dsize="は省略可能
cv2.resize(img, (100, 200), interpolation = cv2.INTER_LINEAR)
```
①加工する対象の画像がimg、②加工する際の縮尺がdsize=(100,200)、③縮尺の仕方がinterpolation = cv2.INTER_LINEAR、になります。

ちなみに③について調べた＆試してみた結論としては、縮尺の方法については個人的にはほとんど変わらないという印象でした。。。なので最初のうちは③はあまり気にせず、慣れてきたらいろいろ比較するのがよろしいかと思います。この記述自体省略可能です。

ちょっとややこしいのが②で、上記のサンプルコードでは出力の際の大きさをピクセルで直接指定しています。元の写真の縦横の比率は無視しているので、これだと上下や左右に画像がつぶれてしまうと思います。

そこで使うのがfx, fyで縮尺を指定するという方法です。縦と横を半分の大きさにしたい場合は下記のようなコードになります(その場合dsize=Noneを指定しないとエラーになってしまいますので忘れずに)。

```python
cv2.resize(image, dsize=None, fx=0.5,fy=0.5, interpolation = cv2.INTER_LINEAR)

#"dsize="は省略可能
cv2.resize(image, None, fx=0.5,fy=0.5, interpolation = cv2.INTER_LINEAR)
```
４分の１の大きさにする場合はfx,fyに0.25を指定。

```python
cv2.resize(image, dsize=None, fx=0.25,fy=0.25, interpolation = cv2.INTER_LINEAR)
```
ただ、0.5とか0.25と打ち込むとコードとして分かりにくくなるので、もうちょっと工夫できるかも。例えば少し工夫をして、resizeのコードの前に％で指定して、fxとfyを記述する際にその数値を100で割るという手もありそうです。

最終的なコードは下の通りです。imshow()、WaitKey()、cv2.destroyAllWindows()については[imread()と同じチュートリアルのページ](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_image_display/py_image_display.html)に分かりやすく解説がありました。このページ本当に分かりやすいです。

```python
import cv2

image = cv2.imread('Hiro.jpg')

#比較用にオリジナル画像を出力する場合は下記コード
#cv2.imshow('Original Image', image)
#cv2.waitKey()

#縦300ピクセル、横200ピクセルに大きさを指定
resized = cv2.resize(image, dsize=(300,200), interpolation = cv2.INTER_LINEAR)

#縦横半分に大きさを指定
resized_half = cv2.resize(image, dsize=None, fx=0.5, fy=0.5, interpolation = cv2.INTER_LINEAR)

#縦横にピクセルを指定した画像を出力
cv2.imshow('Resized', resized)
cv2.waitKey()

#縦横半分の大きさにした画像を出力
cv2.imshow('Resized half', resized_half)
cv2.waitKey()

cv2.destroyAllWindows()

```
Docker基礎 $ docker runのオプション

Docker初心者がDockerについて勉強した時のメモです。

## -v
```
$ docker run -v <host>:<container>
```
```docker:例
$ docker run -it -v <hostのマウントしたいフォルダ> : <コンテナのマウントする場所のフォルダ> <image> bash
```
- ホストのファイルシステムをコンテナにマウントする。
- マウントすることでホストのファイルシステムが実際にはないがコンテナにあるかのように振る舞える。
- コードを実行する実行環境として使う。
- `-v` で指定したコンテナのフォルダはコンテナにない場合自動で作成される

## -u
```
$ docker run -u <user id><group id>
```
```docker:例
$ docker run -it -u $(id -u):$(id -g)
```
`$id -u`ユーザーID確認、`$id -g` グループID確認
- ユーザーIDとグループIDを指定してコンテナをrunする。
- アクセス権限を制限できる。
- 共有サーバー利用時に使うらしい。

## -p 
```
$ docker run -p <host_port>:<container_port>
```
```docker:例
$ docker run -it -p 8888:8888
```
- ホストのポートをコンテナのポートにつなげる
- 割り当てたポート番号でlocalhostにつながる。例で言うとlocalhost:8888にアクセスできる。
- コンテナにwebサービスを立てる時に使用。

## リソースの上限
- `- -cpus<of cpus>`  コンテナがアクセスできる上限のCPUを設定
- `- -memory<byte>` コンテナがアクセスできる上限のメモリを設定

```docker:例
$ docker run -it --cpus4 --memory2g
```
# 参考
https://www.udemy.com/course/aidocker/
OpenAPI 3.0 の使い方 (GET 引数付き）

こちらのページと同じことを Ubuntu 21.10 で行いました。
[【超初心者向け】5分で試せる！OpenAPI(Swagger3.0)ドキュメント作成〜API自動生成](https://qiita.com/se_fy/items/ad05a3c6825bb9612170)

##仕様を記述##
>GET で http://localhost:8080/hello?userName=Scott にアクセスするとリスポンスがある。


```yaml:hello.yaml
openapi: 3.0.2
info:
  description: ユーザ名を与えると挨拶を返してくれるAPI
  version: 1.0.0
  title: Hello
tags:
  - name: hello
    description: ユーザに挨拶を返すAPI
paths:
  /hello:
    get:
      tags:
        - hello
      description: ユーザに挨拶する。
      operationId: getHello
      parameters:
        - name: userName
          in: query
          description: ユーザ名
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  HelloUser:
                    type: string
                    example: Hello, userName
        "400":
          description: Bad Request
        "500":
          description: Internal Server Error
```

https://editor.swagger.io/ でバリデート
![hello_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/64e6b0ab-1bc9-c95b-6df7-6c7b17c9ff4f.png)

##Flask のサーバーを作成##
Generate Server -> python-flask

python-flask-server-generated.zip が出来る

解凍

```bash
unzip python-flask-server-generated.zip
```

ライブラリーのインストール

```bash
pip3 install -r requirements.txt
```

コードの修正

```py:swagger_server/controllers/hello_controller.py
（省略）
#    return 'do some magic!'
    return 'Hello, ' + user_name + ' !'
```

サーバーの実行

```bash
python3 -m swagger_server
```

クライアントでアクセス

```text
$ http http://0.0.0.0:8080/hello?userName=Scott
HTTP/1.0 200 OK
Content-Length: 17
Content-Type: application/json
Date: Fri, 22 Oct 2021 02:47:57 GMT
Server: Werkzeug/1.0.1 Python/3.9.7

"Hello, Scott !"

```
ApolloGraphQL ClientのエラーはIDを取得していないことが原因でした

# 困り毎
ただGraphQLロード時に不明なエラーが起きるようになってしまって困っていました。

まず症状としては、あるクエリを読み込んだ際にエラーとなってしまい、ページ遷移等ができなくなってしまいました。

エラーが発生していたの箇所はApolloGraphQLのエラーハンドラーの箇所です。
エラーハンドリングは[公式ページ](https://www.apollographql.com/docs/react/data/error-handling/#on-graphql-errors)に案内があります。

```typescript
export default (
  // eslint-disable-next-line
  { graphQLErrors, networkError, operation, forward }: any,
  nuxtContext: Context
) => {
  console.log(graphQLErrors, networkError, operation, forward)
  console.trace()
...
```

上記の `networkError` に値がセットされ、ネットワークエラーとして処理されていました。

networkErrorを出力すると下記のようなエラーメッセージになります。

```
ApolloGraphQL Clientの「Store error: the application attempted to write an object with no provided id but the store already contains an id of Type:xx for this object.
```

![Screen Shot 2021-10-22 at 11.11.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/159c6ee0-d935-d79c-70ca-4740da379788.png)


なかなか特定できなかったのですが、エラーメッセージをよく読むと「特定のTypeについて保存ができない」という意味になっています。
どうやらある型の取得したデータをStoreしようとした際にIDが重複してしまっているようです。

# 原因特定

該当付近のGraphQLのクエリを見てみると、内部で呼んでいる他の型のIDを指定していませんでした。


```graphql
Query {
  ID
  Name
  someType { ## ここにIDがない
     Name
   }
}
```

ApolloClientでもこの仕様について[エラーにするかWarningにするか長年議論](https://github.com/apollographql/apollo-client/issues/2510)が続いているようです。

今後同じようなエラーが出た際には注意します。


# 対処
今回の件ではクエリの生成にCodegenを使っています。
そのCodgenで必ずIDが指定されているかをチェックするLinterプラグインがあったのでこちらを利用するようにします。

https://www.npmjs.com/package/@homebound/graphql-id-linter
Unityで変身エフェクトの模索

# 作ったモノ

- 今さら感満載ですが、昔作った変身エフェクトの模索を公開してみます。

![dissolve.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/3dd37b15-e587-a254-cbab-2267fc2d1865.gif)

# 環境

- Unity 2019.x

# 処理の流れ

- 2つのモデルを用意します
- それぞれを逆方向にディゾルブさせます(クロスディゾルブ)。
  - 黄色のオブジェクトは、表示から非表示にします（完全に覆い隠すので、今回はこちらは不要でした）。
  - 黒いオブジェクトは、 非表示から表示にします。
- 私が、唯一行ったことは、ディゾルブするマップを作ったことです。

# 作ったテクスチャ

![tex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/acd3cc58-73ab-7b7a-624d-7713ba688c09.png)

- この3番目のディゾルブさせるテクスチャですが、3分ぐらいで適当に描いた落書き画像で、なんかかっこよく見えて、お得だったので紹介します。
- Unityが、すごいだけなのですが。
- 数時間でサクッとこんなことが無料でできる時代に生まれて、とっても幸せだと感じました。


# ソースコードなど

- ディゾルブの処理は、高橋 啓治郎さんが動画とテキストで、かなり詳しく解説されています。（下部に列挙）
- 以下のgithubのURLでソースコードを公開しています。
- クロスディゾルブするように変更しました。

https://github.com/hachicomb/UnityRessolve2019

![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/cfea5aab-a8c3-eb76-e788-6ef00fa4e06f.png)


# ディゾルブ処理についての解説

## 高橋 啓治郎さんの動画
https://youtu.be/9OP6s5RFNkQ?t=949

## 高橋 啓治郎さんのgist
https://gist.github.com/keijiro/a96d001dc8a6227e1cc3cc57fe34f045

## Brackeys さんの動画（英語）

https://www.youtube.com/watch?v=taMp1g1pBeE
redash v10.0.0 にバージョンアップしたときにあたった不具合について

先日、2021/10/01 に 約2年ぶりにredashのリリースがあったので早速バージョンアップしてみたのですが、２つくらい不具合にぶつかったので、同じ現象に見舞われている方の助けになればと思って書いておきます。

# バージョンアップ手順

バージョンアップ前のバージョンは 8.0.0

バージョンアップ手順はこちらに記載のとおりにやりました
https://github.com/getredash/redash/releases/tag/v10.0.0

具体的には

1. docker-compose.ymlの編集
    1. Dockerイメージの差し替え
    2. services/sucheduler/enviroment セクションの削除
    3. worker セクションの追加
2. `docker-compose up --force-recreate --build`
3. `docker-compose run --rm server manage db upgrade`

をしただけです。

# バージョンアップ後に発生した不具合

## クエリにアクセスできない

100名程度の方が常時使われているのですが、うち3名からredashが開けないと問い合わせをもらいました。
一旦ログアウトしてログインしてもらうことで解消したのが2例。
ログアウト、ログインしても解消せず、すべてのブラウザキャッシュを消してハードリロードしても解消せず、Googleアカウントのログアウト、ログインでも解消せず、別ブラウザからのアクセスでも解消せず、シークレットウインドウでのアクセスなら可能というのが1例ありました。
この最後の1例の方は結局どうしても通常のブラウザでのアクセスができず、未だに回避方法はシークレットウインドウでアクセスするというものしか見つかっていません…

すべてのユーザーアカウントのログイン認証はGoogle Loginになっています。


## スキーマ情報が取得できない

新規のクエリを作るときにテーブルの一覧が表示されなくなるという報告を受けました。
確かにテーブル一覧の箇所が待ちアイコンのままでしばらくするとタイムアウトしていました。

手順のとおりに 8.0.0 から更新してしまうと schemas の queue を処理できなくなってしまうようです。
Admin画面で schemas の Queued が溜まっていたらこの現象です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40813/ead8b19a-79fc-00ce-88ce-05133b4717ed.png)


これは、adhoc_worker の QUEUE に schemas を追加して、再起動すれば解消します。

```yaml
  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries schemas"
      WORKERS_COUNT: 10
```
nRF Connect SDK:乱数を使う

#乱数
組み込み機器で乱数ってなんだかんだで使いたくなる、あるいは使わざるを得ない場面ってありますよね。えっ？ない？だって暗号化するのに必要ですし・・・。
#nRF5xのハードウェアランダムは使えない
少なくとも今のところはnRF5xが持っているハードウェアでの乱数生成機能は使えないようです。nRF SDKでrandom_vector_generate()関数として提供されていたものです。代わりにOS(Zephyr)が乱数機能を提供しているようですが、コンフィグの説明には何やら不穏な記述が・・・。
>This option signifies that the kernel's random number APIs are
permitted to return **values that are not truly random**.
This capability is provided for testing purposes, when a truly random
number generator is not available. The non-random number generator
should not be used in a production environment.

完全なランダムではない、という記載があり、テスト用途でのみ使ってねと書いてあります。うむむむ・・・。
#とりあえず実装しよう
ということでとりあえず実装してみるに限ります。OSがサポートしているだけあって記述が非常に簡単です。

```main.c
/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <random/rand32.h>
#include <string.h>
#include <sys/printk.h>

void main(void)
{
    uint32_t buf[10];

    // Initialize
    memset(buf, 0, sizeof(buf));

    for (int i = 0; i < 10; i++)
    {
        printk("Generating 32bit random value:%x\n", sys_rand32_get());
    }

    sys_rand_get((uint8_t *)(&buf[0]), sizeof(buf));
    for (int i = 0; i < 10; i++)
    {
        printk("Generating bulk fill random numbers %d:%x\n", i, buf[i]);
    }
}
```

```prj.conf
CONFIG_TEST_RANDOM_GENERATOR=y
```
#実行してみた
実装できたので実行してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/8224ee5c-a0b1-18c0-9624-f11d20c81d7d.png)
お、なんかそれっぽい乱数が生成されていますね。めでたしめでたし。
ところでよくある**乱数のようで乱数でない**というパターンとして、初期化ルーチンが同じなのでリセットすると似たような数字が出てくるというものがあります。さて、そこは大丈夫なのでしょうか。いざ、リセット！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/9ac67c15-a65a-32d7-2f66-a90a558b31f2.png)
・・・？
なんだかジーっと見ていると似ているような気がしませんか？しかも最初の32ビットの乱数なんて、また(？)上位16ビットが全部0ですし！！！
どうやらこれだけではダメそうです。さて、どうしたものか・・・と調べてみると追加でさらに乱数を激化(笑)させるコンフィギュレーションがあるようです。

```prj.conf
CONFIG_TEST_RANDOM_GENERATOR=y
CONFIG_ENTROPY_GENERATOR=y
```

これを追加すると乱数が激化するようです。ではさっそく追加して実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/83ddd782-4376-c536-d82a-06dbd02abbae.png)
まず明らかに違う点として最初の32ビットの乱数の上位16ビットが0ではありません！！！これだけでも期待が持てそうですが、念のためリセットして確かめてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/cc745cdb-bd5f-85ee-4fc6-ffb3da9d3b35.png)
おお、どこからどう見ても全然(？)違いますね！！！
とりあえずこれで乱数は使えそうです。
バイナリをASCIIで非常に高速にエンコードする

ソフトウェアでは、通常、バイナリ値を使用します。つまり、任意のバイトストリームがあります。これらの任意のバイトストリームを電子メール、HTML、XML、JSONなどの標準形式でエンコードするには、多くの場合、base64などの標準形式に変換する必要があります。[base64を非常にすばやくエンコードおよびデコードできます](https://arxiv.org/abs/1910.05109)。

しかし、標準を気にせず、高速で単純なコードを作成したい場合はどうでしょうか。たぶんあなたが気にするのは文字列がASCIIであるということだけです。つまり、各バイトの最上位ビットがゼロに設定されたバイトのストリームである必要があります。このような場合、7バイトの値を8バイトの値に変換してから元に戻す必要があります。

標準Cでは、双方向で約5つの命令（ストアと移動を数えない）でそれを行うことができます。エンコードする5つの命令と、デコードする5つの命令です。1バイトあたり1命令未満です。私は自分の解決策が最適であると自分自身に納得させることができませんでした。

```c
// converts any value in [0, 2**56) into a value that
// could pass as ASCII (every 8th bit is zero)
// can be inverted with convert_from_ascii
uint64_t convert_to_ascii(uint64_t x) {
  return ((0x2040810204081 * (x & 0x80808080808080)) 
         & 0xff00000000000000) +
         (x & 0x7f7f7f7f7f7f7f);
}
// converts any 8 ASCII chars into an integer in [0, 2**56),
// this inverts convert_to_ascii
uint64_t convert_from_ascii(uint64_t x) {
  return ((0x102040810204080 * (x >> 56)) 
         & 0x8080808080808080) +
         (x & 0xffffffffffffff);
}
```

最近のIntelプロセッサでは、pdep / pext命令が同じ目的を果たす場合があります。ただし、AMDプロセッサでは低速であり、ARMでは対応するものがありません。


英語原稿：https://lemire.me/blog/2020/05/02/encoding-binary-in-ascii-very-fast/
Pyinstaller で実行ファイル化した場合のプログラムの親フォルダ取得

.pyおよび.exeどちらでも親フォルダを取得する

    from pathlib import Path
    def get_source_path():
        if getattr(sys, 'frozen', False):
            # The application is frozen
            exe_path  = Path(sys.executable).resolve()
            main_path = exe_path.parent
            dist_path = main_path.parent
            src_path  = dist_path.parent
        else:
            # The application is not frozen
            # Change this bit to match where you store your data files:
            py_path  = Path(__file__).resolve()
            src_path = py_path.parent

        return src_path


参照：https://qiita.com/Authns/items/f3cf6e9f27fc0b5632b3

src/
　└ main.py
上記のフォルダ構成のpythonプログラムに対し、Pyinstallerを用い実行ファイル化すると
以下のフォルダ構成となります
src/
　├ dist/
　│　└ main/
　│　　　└ main.exe
　└ main.py

get_source_pathにより、.py、.exeどちらを実行してもsrcフォルダの絶対パスを得ることが出来ます。
C / C ++で「free」または「delete」を呼び出すと、システムにメモリが解放されますか？

Cプログラミング言語では、通常、メモリを手動で管理します。典型的なヒープ割り当ては、mallocへの呼び出しとそれに続くfreeへの呼び出しです。C ++では、より多くのオプションがありますが、内部では同じルーチンです。

```C
// allocate N kB
data = malloc(N*1024);
// do something with the memory
// ...
// release the memory
free(data);
```

プログラムが開始されたばかりでNの値が大きい場合、mallocを呼び出すと、メモリ使用量が約Nキロバイト増加するのは当然のことです。そして確かに、それは事実です。

では、「free」を呼び出した後のプロセスのメモリ使用量はどのくらいですか？Nバイトはシステムに戻りましたか？

答えは、一般的にはそうではないということです。Linuxで、Nキロバイトを割り当てて解放する小さなプログラムを作成しました。次に、freeの呼び出し後にRAM使用量を測定します。正確な結果は、システムや標準ライブラリなどによって異なりますが、結果を例として示します。

表からわかるように、メモリが解放されることがありますが、私のテストでは30MBを超える大きなブロックである場合に限ります。このような場合、別のコードパスが使用されている可能性があります（たとえば、mmap、munmapの呼び出し）。それ以外の場合、プロセスはそのメモリを保持し、システムに再度解放することはありません。

|要求されたメモリ|空き後のメモリ使用量|
|::|::|
|1 kB|630 kB|
|100 kB|630 kB|
|1000 kB|2000 kB|
|10,000 kB|11,000 kB|
|20,000 kB|21,000 kB|
|30,000 kB|31,000 kB|
|40,000 kB|1,200 kB|
|50,000 kB|1,300 kB|
|100,000 kB|1,300 kB|

もちろん、メモリをシステムに強制的に解放する方法はありますが（たとえば、malloc_trimが役立つ場合があります）、デフォルトで解放されるとは期待しないでください。

私はC / C ++を参照として使用していますが、まったく同じ効果が幅広いプログラミング言語で発生する可能性があります。

影響は何ですか？

• プロセスが使用するメモリの量を使用して、データ構造のメモリ使用量を簡単に測定することはできません。
• 現在データを保持していないプロセスが大量のメモリを使用しているように見えるのは簡単です。
さらに読む： [glibcmallocの非効率性](http://notes.secretsauce.net/notes/2016/04/08_glibc-malloc-inefficiency.html)


英語原稿：https://lemire.me/blog/2020/03/03/calling-free-or-delete/
さくっと始めるRecoil入門

# はじめに
今回はReactの状態管理ライブラリである`Recoil`についてまとめていきます。

それでは、頑張って行きましょう。

# Recoilとは
RecoilはFacebook社が作成した状態管理ライブラリです。Context APIの成約を解決するために開発されたみたいです。

以下、[こちら](https://ics.media/entry/210224/)の記事の引用

### Context APIの制約

>Reactのみで状態管理を完結させようとすると、Context APIを用いてアプリケーションの状態を管理させることになります。基本的に問題はないのですが、Context APIにはいくつかの制約があります。
たとえばContext APIで管理されているReactコンポーネントの状態を変更するためには祖先コンポーネントまで辿ってツリーを更新しなくてはいけません。大元のコンポーネントが巨大だった場合はそのぶん更新するツリーも大きくなるため、再レンダリングのコントロール難易度が上がってしまいます。うまく管理しないと巨大なツリー更新によるパフォーマンスの低下を招いたり、コンポーネントの状態が意図せずリセットされてしまうことが起こりかねません。

### Recoilとは

>Recoilは、Context APIが抱えるこれらの制約・問題を解決するためにFacebookによって提唱された実験的な状態管理ライブラリです。「Atom」「Selector」と呼ばれる単位を使用してアプリケーションデータを管理し、各Atomには一意のキーとそれが管理するデータの一部が含まれています。各Selectorは複数のAtomにもとづく派生状態の一部で、Atom・他のSelectorを受け取る純粋な関数として定義します。これらの単位をHooks APIで操作しながら状態管理を行うのがRecoilです。

# Recoilのざっくりとした使い方

それでは、Recoilのざっくりとした使い方を見ていきましょう。

## Recoilの導入
まずは、以下のコードでRecoilをインストールしましょう。

```
npm install recoil
```

あとは、`_app.tsx`を`<RecoilRoot>`で囲うだけです。

```app.tsx
import { RecoilRoot } from 'recoil';

export default function MyApp(props: AppProps): JSX.Element {
  const { Component, pageProps } = props;

  return (
      <RecoilRoot>
        <Component {...pageProps} />
      </RecoilRoot>
  );
}
```

## Atomの作成
Recoilは`Atom`というステートオブジェクトを作成して使用します。`Atom`は、Stateとセッター関数を切り出すことができる箱のような概念であり、この`Atom`をエクスポート・インポートすることによって、コンポーネントの間でStateを共有します。

また、`Atom`からStateやセッター関数を切り出すときは、hooksのインターフェースを用いるため、学習コストも低めです。

AtomからStateのみを切り出しても良いし、セッター関数のみを切り出しても構いません。

まずは、`Atom`を作成してみましょう

```tsx
const countState = atom<number>({
  key: 'sample/count',
  default: 0
});
```

## AtomからStateとセッター関数の切り出し

それでは次に、この`Atom`からStateとセッター関数を切り出しましょう。

```tsx
import { useRecoilState } from 'recoil';

const Counter = () => {
  // atomから状態を取り出す
  const [count, setCount] = useRecoilState(countState);

  return <div onClick={() => setCount((c) => c + 1)}>Clicked: {count}</div>;
};
```

`Atom`から`useRecoilState`を用いてStateとセッター関数を切り出すのは、`useState`を用いてStateとセッター関数を作成する感覚とほぼ同じです。

作成した`Atom`をエクスポートし、使用したいコンポーネントでインポートすれば、状態をコンポーネント間で共有することができます。

## AtomからStateのみ、セッター関数のみを切り出し
`useRecoilValue`を使用すると、AtomからStateだけを切り出す事ができます。

```tsx
import { useRecoilValue } from 'recoil';

const Counter = () => {
  // atomから状態を取り出す
  const count = useRecoilValue(countState);

  return <div>{count}</div>;
};
```

また、`useSetRecoilState`を使用すると、セッター関数のみを切り出すことができます。

```tsx
import { useSetRecoilState } from 'recoil';

const Counter = () => {
  // atomからセッター関数を取り出す
  const setCount = useSetRecoilState(countState);

  return <div onClick={() => setCount((c) => c + 1)}>Increment!</div>;
};
```

ここまでが、Recoilのざっくりとした使い方になります。
laravel-mix

### やること
①npm install をしてから
②npm run dev を実行する
①が失敗していると②もエラーになるので注意



### うまくいったやり方
https://laravel-mix.com/docs/4.0/installation

nvm install --lts

nvm use --lts

npm install laravel-mix --save-dev --no-bin-links


mkdir my-app && cd my-app
npm init -y
npm install laravel-mix --save-dev
cp node_modules/laravel-mix/setup/webpack.mix.js ./








### ▼うまくいかなかったとき
https://qiita.com/takuohashimoto/items/e424a9c245ccf5030371

node_moduleを全部削除する！
rm -rf node_modules

キャッシュが悪さしてるかもしれへんから、削除しておく！
npm cache clear --force

node_modules を全部インストールし直す。
npm install
Unity設計入門：第2章「MVXの思想」理論編その1

[Unity設計入門の目次はこちら](https://qiita.com/wolfmagnate/items/cf7081a0352667b12d6a)
***
# はじめに
[前回](https://qiita.com/wolfmagnate/items/0e5f0e29b1d01e359eeb)、ModelとViewがそれぞれ何者であるかに加えて、それらを分離することの利点について書きました。
しかし、現実問題としてModelとViewを分離することには大きな困難を伴います。
今回は、なぜModelとViewがキレイに分離できないのか、具体的な原因の特定を目指します。

# ModelとViewが分離できない状況
## 1. 表示制御のためのデータが増加する
### どのようなデータが「表示制御のための一時データ」に該当するか
複雑なゲーム画面を組み立てていくと、ModelでもViewでもないデータが増加します。
これらのデータは「サンプルコードではシンプルすぎて出てこないので解説されにくいけれど、現実的にゲームを組むとどうしても出てきて扱いに困る」という厄介な存在です。
これらのうち、具体的には以下のようなものを「表示制御のための一時データ」と呼ぶこととします。

* アニメーションの秒数を管理するためのフラグ
* マウスを早く動かしたときにのみ動かす演出のために、マウス座標の差分をとっておくための変数
* スナップするスクロールビューにおいて、現在どこのページにいるかを保存しておく変数
* UIの入力モードが複数あるときに、そのどれであるのかを保存しておく変数

このようなデータは、業務用のソフトウェアでは無視できるほど少ないでしょう。ほとんどが演出用であり、省いてしまえばよいのです。しかし、ゲームは演出です。これらの変数が莫大に増加することがほとんどなのです。
さて、これらのデータをどこに記述していくのかについて考えるとなんと**Model・Viewのどちらにも書けない**ということが分かります。

### Model側に記録した場合の問題点
Modelにアニメーション状況や表示可否などの情報を記憶させる方式です。
Modelが画面に依存してしまいます。
Modelが画面のレイアウト・演出に合わせて変更に迫られるということです。
これはViewの柔軟性を損なうとともに、Modelの一部のテストにViewが要る状況を生んでしまいます。
これは前回の原則「Modelは純粋にする」に反するコードです。

### View側に記録した場合の問題点
Modelから受け取った情報とViewが持っている情報を合わせて演出を出す方式です。
Viewに条件判断が増え、肥大化します。
Unityの起動回数は増え、面倒なテストを何度もする羽目になります。
これは前回の原則「Viewは極限までシンプルにする」に反するコードです。

## 2. シンプルなViewから受け取る入力は低レベルすぎる
ユーザー入力はUnity、すなわちViewを通して受け取らざるを得ません。そしてユーザーはViewを通してModelを操作しようとするのです。小さなサンプルコードだけでは前回のように「ボタンを押して、画面に表示してハッピーだね！」というようになって終わりなのですが、ユーザーの操作は

* ダブルクリック判定をするために、「直前15フレーム以内にクリックがあったか」を保存しておく変数
* 3回のボタンクリックをすることで初めて意味を持つ入力
* カードをドラッグアンドドロップして別の場所に置くときの入力

など多岐にわたります。そしてこれらの入力は、意味を持つタイミングが「複数のデータ・一次変数から複合的に判断される」という特徴を持ちます。これはボタンによる入力が「押された瞬間に意味が確定する」ものであったこととは対照的です。
さて、それでは上に挙げた例の「直前15フレームの入力の有無」「ボタンクリックが現在何回されているか」「ドラッグ中か否か」などの情報はどこに保存すればいいのでしょうか？
じつはこれも**Model・Viewどちらにも書けない**のです。

### Model側に記録した場合の問題点
Modelが「画面の(x,y)がクリックされたときに呼ぶ関数」などを用意して、低レベル情報を直接受け取る方式です。
この場合、同じくModelがViewを気にしてしまうためModelの純粋性を損ないます。
さらに、この手の関数をテストしようとするとテストケースに「(23,455)をクリックしたときの関数を呼ぶ→マウスの座標(22,444)に移動したときの関数を呼ぶ」と言ったように非常に低レベルなものになります。この(23,455)とかの座標は結局Viewを見ないとダメですし、こんなテストを書くぐらいなら、Viewを起動して動作確認するほうがよっぽど早いですね。つまりこれは、「Modelがテストを書くことを容易にする」というメリットを完全に破壊しているのです。

### View側に記録した場合の問題点
Viewが「どこをクリックされたか」などの情報をためておき、ある程度たまったタイミングで、画面から離れた抽象的な意味を持つUI操作としてModelの関数を呼び出す方式です。
この場合、Viewが大きくなり、「Modelの関数がちゃんと呼ばれるか」の検証が非常に面倒です。
Viewはシンプルにするという原則に反するコードです。

## 3. 「ModelとViewの責務」という言葉を曖昧に使っている
これは1,2とは異なり、構造的にどうしようもないもの、といえるものではありません。
Viewを見た目だ！ぐらいのぼんやりしたイメージ、Modelをデータの入出力だ！ぐらいのぼんやりしたイメージで組み立てると、往々にしてViewがModelの処理を奪い取ります。(ModelがViewを奪うことはあまりありません。というのも、Viewは最小限の状況が一番いい状況だからです)
また、View・Modelの2人体制だと、ViewはModelを参照できるわけですから、Modelをpublic変数から好き勝手操作できてしまいます。
結果としてModelとViewの密結合を生みやすくなります。
ModelとViewの原則、「純粋性」と「シンプルさ」を強く意識したコーディングである程度は防げますが、根本的にModelへの参照をなくしたり、疎結合にしたりする策を講じないとView側でいじってしまうという問題はなくなりません。

# おわりに
経験的には、「**サンプルコードで書けてるようにキレイにならない！！なんで！！**」という叫びの原因のうち、大部分はここにあると思います。また、漠然とViewとModelとX(ControllerなりPresenterなりViewModelなり)を切り分けたいというだけの思考でMVXの設計をするのではなく、「どうしようもないからXへ持っていく。ModelとViewは明確な原則に従って設計する」の方がよい設計になることが多いと思います。次回、今回上げた問題の解決策を探していきます。
AWS CDK設定

# はじめに
内容はこちらのページを参考にしたもの　[Getting started with the AWS CDK](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)

# ステップ
## 1. aws cdkのインストール (※Supportされているnodeのバージョンがあるので注意)

今回はその中の `v16.3.0`を使用:

```
node -v
v16.3.0
```

インストール

```
npm install -g aws-cdk
```

バージョンチェック (インストール時によって異なる)

```
cdk --version
1.128.0 (build 1d3883a)
```
    
## 2. aws cliの設定 (すでにしてあればスキップ)

aws cliのインストールはこちら:　[AWS CLI バージョン 2 のインストール、更新、アンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)

profileを分けて管理する場合は `--profile <任意のプロファイル名>`を指定. ACCESS_KEYとACCESS_SECRETが聞かれるので入力

```
aws configure
```

## 3. CDK Bootstrap
    
1. Account IDの取得

    ```
    aws sts get-caller-identity
    {
        "UserId": "xxxxxxxxxx",
        "Account": "xxxxxx",
        "Arn": "arn:aws:iam::xxxxxx:user/naka"
    }
    ```

1. Regionの取得

    ```
    aws configure get region
    ap-northeast-1
    ```

1. Bootstrap

    ```
    cdk bootstrap　aws://ACCOUNT-NUMBER/REGION
    ```

    結果: 

    ```
    cdk bootstrap aws://ACCOUNT-NUMBER/ap-northeast-1 --profile naka-personal
     ⏳  Bootstrapping environment aws://ACCOUNT-NUMBER/ap-northeast-1...
     CDKToolkit: creating CloudFormation changeset...
      ✅  Environment aws://ACCOUNT-NUMBER/ap-northeast-1 bootstrapped.
    ```

    コンソールから確認: S3 BucketとS3 Bucket Policyが作成された

    ![スクリーンショット 2021-10-20 9.19.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/1764deb7-85e8-81a5-9787-26a6ec24f957.png) 


   これで設定完了で、 `cdk deploy` というコマンドで、Deployできるようになった！

# 参考

- https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html
- https://dev.classmethod.jp/articles/cdk-workshop-typescript/
WindowsコマンドからWi-Fiパスワードを確認する方法

# はじめに
ちょっとしたときにWi-Fiのパスワードを確認するときに便利なコマンドを備忘録も兼ねて紹介します。

# 実行コマンド
コマンドプロンプトを開きます.
登録されているWi-Fiネットワーク名を確認します。


```
netsh wlan show profile
ユーザー プロファイル
---------------------
    すべてのユーザー プロファイル     : testxxxxxxxxx
    すべてのユーザー プロファイル     : xxxxxxxxxxxxx
    すべてのユーザー プロファイル     : xxxxxxxxxxxxx
    ...
    ..
```
```
省略コマンド
netsh wl sh p
```
上記のコマンドから確認したいパスワードのWi-Fiネットワーク名を確認し、次のコマンドのnameに入力します。

```
netsh wlan show profile name="testxxxxxxxxx" key=clear

...
..
セキュリティの設定
-----------------
    認証                : WPA2-パーソナル
    暗号                : CCMP
    認証                : WPA2-パーソナル
    暗号                : GCMP
    セキュリティ キー      : あり
    主要なコンテンツ       : xxxxxxxxxxxxxx(パスワード)
...
..
```
```
省略コマンド
netsh wl sh p n="testxxxxxxxxx" k=clear
```

セキュリティの設定の「主要なコンテンツ」にパスワードが表示されます。
【JavaScript】関数とオブジェクト⑦　アロー関数


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/31b5657ce81668cab5e9

#目的

* 関数とオブジェクトについての理解を深める

#本題
###1.アロー関数

無名関数を記述しやすくした省略記法のこと

````基本構文.
() => {};
`````

####例1

基本的な書き方

````javascript
// 一般的な関数
function a(name){
  return "hello " + name;
}

// 関数式にした場合
const b = function(name){
  return "hello " + name;
}

// 上記をアロー関数に直すと下記の通り
const c = name => "hello " + name;

// functionを削除して、{}の前に=>を置く
// 引数が１つの場合()は省略できる
// 実行行が一行の場合は{}が省略できる
// そうすると変数cにアロー関数が代入される
console.log(c("炭治郎"));
``````

####例2

２つ以上引数を渡したい場合

````javascript
// ()で引数を囲い、第二引数を用意
const d = (name, name1) => "hello " + name + ", " + name1
console.log(d("善逸", "伊之助"));
``````
####例3

引数がない場合

`````javascript
// 引数がなくても()の省略は不可
const e = () => "hello";
console.log(e());

// （）ではなく_でも代用可
const f = _ => "hello";
console.log(f());


// 複数行ある場合は{}使う
// {}がある場合はreturn省略不可
const g = () => {
  const h = "うまい！" + "うまい！";
  return h;
}
console.log(g())
``````

###2.無名関数とアロー関数の違い

省略記法であるだけなので、機能が同じというわけではない

|  | 無名関数 | アロー関数 |
|:-:|:-:|:-:|
| this |  ◎ |   ✗|
| arguments  | ◎  | ✗  |
| new  |  ◎ | ✗  |
|  prototype | ◎  | ✗  |

上記のように使えない機能もある

今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
Visual Studio CodeでMarkdownをプレビューする

# プレビューだけしたい
VSCodeのサイドバーで`.md`ファイルを右クリック -> `プレビューを開く` で表示される。
![1 右クリック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/43578e2e-1f66-c20b-9bda-3fe008bd22bb.jpeg)

![2 preview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/65ee950a-951c-1b35-1ff9-cc056415abbf.jpeg)



# 編集しながらプレビューしたい
`.md`ファイルを編集している状態で、`Ctrl+K`, `V`を押すと、サイド バイ サイドで表示される。
![3 side by side.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239172/8c56fb10-5a11-3cc9-9533-f3ee2530424c.jpeg)
【情報まとめ】MI（マテリアルズインフォマティクス）について


マテリアルズインフォマティクス（MI）についての情報や詳細の内容については下記リンクにあります。
ご参考になりましたら幸いです。

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16628450%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  >DXの教養 デジタル時代に求められる実践的知識 [ 志度 昌宏 ]</a>
<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16628450%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/2132e914.2fe6209c.2132e915.6ace3022/?me_id=1213310&item_id=20272826&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F1217%2F9784295011217.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>

# マテリアルズ・インフォマティクスによる材料開発
株式会社 三井住友銀行

https://www.smbc.co.jp/hojin/report/investigationlecture/resources/pdf/3_00_CRSDReport090.pdf


# マテリアル革新力強化のための政府戦略に向けて（戦略準備会合取りまとめ）
経済産業省

https://www.meti.go.jp/press/2020/06/20200602002/20200602002-1.pdf

# 素材産業におけるイノベーションの役割と期待
経済産業省

https://www.meti.go.jp/policy/mono_info_service/mono/chemistry/downloadfiles/180112materials-innovation.pdf

# 参考資料（ＩＴ人材育成の状況等について）
経済産業省 商務情報政策局情報処理振興課

https://www.meti.go.jp/shingikai/economy/daiyoji_sangyo_skill/pdf/001_s03_00.pdf


# 「マテリアル革新力」に関する参考資料・データ集
文部科学省

https://www.mext.go.jp/content/20200515-mxt_nanozai-000007028_8_2.pdf

# 令和元年度 特許出願技術動向調査 結果概要 マテリアルズ・インフォマティクス
特許庁

https://www.jpo.go.jp/resources/report/gidou-houkoku/tokkyo/document/index/2019_07.pdf


# 労働生産性の国際比較 ２０２０
公益財団法人　日本生産性本部

https://www.jpc-net.jp/research/assets/pdf/report_2020.pdf

#業種別審査辞典
金融機関関係者向けに作成されて業界ごとに広く浅くまとめられている書籍です。
業界の状況などわかりやすく説明しているので気なる業界を見てみるのも面白いかなと思います。
この時点は10冊で20万円くらいしますので図書館などで探し、必要な部分だけを読んだりしたほうが良いかなと思います。

https://www.kinzai.jp/books/14jiten/

# 化学業界の動向 2018-19年

https://www.strategyand.pwc.com/jp/ja/publications/industry-trends/trends-2019-chemicals.html

 
# 【超入門】マテリアルズインフォマティクス(MI)とは

https://qiita.com/YH_BK/items/dd14b875425ce53930b6

 

# 【市場調査】なぜMIが注目されているのか

https://qiita.com/YH_BK/items/4ee8307e0ff157908199

 

# 【初心者向け】ケミストリーエンジニアがMIを学ぶには？

https://qiita.com/YH_BK/items/9c7823dd0ab814f95b31

 
# MI実例メモ

https://qiita.com/YH_BK/items/3be22f69506d9dbe1271

# Pythonの勉強方法
https://qiita.com/YH_BK/items/bdb7bf564fc53c50c7ec

#G検定対策
https://qiita.com/YH_BK/items/f43e247d3a9c2b98cf71

#DS検定対策
https://qiita.com/YH_BK/items/27420dae3ba4259acfd9
メモ用　超簡単GitHubへのコミット

超駆け出しエンジニアによるコマンドプロンプトを使ったGitHubへのコミットの仕方を説明。


##新しいリモートリポジトリの作成

   ```git init
   git remote add origin 新しいリモートリポジトリのURL
   git add .
   git commit -m "コミットメッセージ（自由）"
   git push -u origin master```

##gitの削除
   ```rd /s .git```


##ワーキングスペースを編集した時の対応

一度接続してるリモートリポジトリにファイルの追加や修正を行いたい場合には、共有したいディレクトリに「cd」コマンドで移動後、以下のようにコマンドを入力します。

    git add -A
    git commit -m "修正内容が分かるコミットメッセージ"
    git push
Chain of Responsibility デザインパターン

チェーンオブレスポンシビリティ
--

このデザインパターンはGoFのデザインパターンの内の一つである。「誰が何をするか」という責任を鎖のように
繋がれている状態のことです。
例えると、会社の決済のように課長で判断できなかったら部長へ、部長で判断できなかったらその上へ、といったように「誰が決済の判断をするか」ということをどんどん任せていくイメージ。もし誰も行わなかったら何もしない(nilやnullを返す)
メリットとしては誰が処理をするのかを一つに決めないので処理を柔軟に回すことができる。
ただ、責任がどこにあるのかを探索するので処理速度が遅くなるらしい。柔軟性か即効性かで目的別に分ける必要がある。

Swiftではどういう時に使用されるか？
--
SwiftではUIRespondarオブジェクトが管理している。
ユーザーの操作を
UIButton⇨UIView⇨UIWindow⇨UIApplication(UIViewControllerはUIViewに割り込む形で入っていく。)
例

```swift
//決済を求めるプロトコル
　public protocol RequestSettlement {    
    //決済する関数
    func settlement(request: Any)

    //次の責任者を渡して初期化する
    init(next: RequestSettlement?)

　public class Settlement<T>: RequestSettlement, CustomStringConvertible {

    //自分の次の責任者。nilの場合は、自分自身が最後の責任者となってしまう
    private var nextHandler: RequestSettlement?
　　　　　　　//上のプロパティで宣言したnextHandlerをを初期化
   public 　init(next: RequestSettlement?) {
        self.nextHandler = next
    }

    //ジェネリクスで渡した型Tを実際に決済できるか調べて処理する関数
    public func settlement(request: Any) {
        if request is T {
       print("決済したのは\(self)だよ")
        } else {
            //処理が行われずレスポンダーチェインの最後まで到達した場合
            guard let handler = self.nextHandler else {
                print("レスポンダーチェインが終了したよ")
                return
            }
            //次の責任者に送る場合
            print("\(self)では決済できないから,次の責任者である\(handler)に渡すよ")
            handler.settlement(request: request)
        }
    }
```
Franka 動作性能測定

## サイン波応答測定

### nut_position.cpp

```
nut_position <robot-hostname> cycle_sec sweep_deg repeat
```
* コマンドを実行する。パラメータは周期[sec小数点]・振幅角度[degree小数点]・往復回数
* ENTER入力待ちになる
* ENTER入力する
* 待機位置に移動後、先端の第七関節をパラメータに従い振幅動作し、動作状態をファイルに記録する
* 記録内容は以下
* count,linuxtime,robottime,cycletime,delta_angle_deg,delta_angle,q_d,q

### nut_velocity.cpp

```
nut_velocity <robot-hostname> cycle_sec velocity_rad repeat
```
* コマンドを実行する。パラメータは周期[sec小数点]・速度[rad/sec小数点]・往復回数
* ENTER入力待ちになる
* ENTER入力する
* 待機位置に移動後、先端の第七関節をパラメータに従い振幅動作し、動作状態をファイルに記録する
* 記録内容は以下
* count,linuxtime,robottime,cycletime,velocity,q_d,q,dq_d,dq
 
### nut_torque.cpp

```
nut_torque <robot-hostname> cycle_sec torque_Nm repeat
```
* コマンドを実行する。パラメータは周期[sec小数点]・トルク[Nm小数点]・往復回数
* ENTER入力待ちになる
* ENTER入力する
* 待機位置に移動後、先端の第七関節をパラメータに従い振幅動作し、動作状態をファイルに記録する
* 記録内容は以下
* count,linuxtime,robottime,cycletime,torque_Nm,q_d,q,q_deg,dq_d,dq

## 駆動実験

### nut_zero_torque.cpp

```
nut_zero_torque <robot-hostname> pose_sec trip_sec
```
* コマンドを実行する。パラメータはゼロトルク時間[sec小数点]・待機状態から希望姿勢への動作時間[sec小数点]
* Press Enter to continue...
* ENTER入力する
* 待機位置に移動後、ゼロトルク時間経過後にその姿勢を記憶する
* Hit ENTER for moving to initial pose.
* ENTER入力する
* 待機姿勢に移動する
* Hit ENTER for moving to target pose. JointPositions
* ENTER入力する
* JointPositions指定で希望姿勢・位置に変更・移動する
* Hit ENTER for moving to initial pose.
* ENTER入力する
* 待機姿勢に移動する
* Hit ENTER for moving to target pose. CartesianPose
* ENTER入力する
* CartesianPose指定でその場で希望姿勢に変更する
* CartesianPose指定で希望位置に移動する
* Hit ENTER for moving to initial pose.
* ENTER入力する
* 待機姿勢に移動する
* Hit ENTER for moving to target pose. CartesianPose
* ENTER入力する
* CartesianPose指定で希望姿勢・位置に変更・移動する
* Hit ENTER for moving to initial pose.
* ENTER入力する
* 待機姿勢に移動する

### nut_demo.cpp

```
nut_demo <robot-hostname> trip_sec
```
* コマンドを実行する。パラメータは直線移動時間[sec小数点]
* Press Enter to continue...
* ENTER入力する
* 待機姿勢に移動する
* Hit ENTER for moving to goal1. CartesianPose
* ENTER入力する
* コップ保持進入位置に移動する
* Hit ENTER for moving to goal2. CartesianPose
* ENTER入力する
* コップ保持位置に移動する
* Hit ENTER for moving to goal3. CartesianPose
* ENTER入力する
* コップを引き上げる
* Hit ENTER for moving to goal4. CartesianPose
* ENTER入力する
* コップ開放位置上空に移動する
* Hit ENTER for moving to goal5. CartesianPose
* ENTER入力する
* コップ開放位置に移動する
* Hit ENTER for moving to goal6. CartesianPose
* ENTER入力する
* コップ開放位置手前に移動する
* Hit ENTER for moving to initial pose.
* ENTER入力する
* 待機姿勢に移動する
GitHubを使い始めたときに参照した記事まとめ

# はじめに
今更ながら、GitHubを使い始めた。
GitHubを使い始めたときに参考にさせていただいた記事をまとめておく。
トラブルシューティング等を自分でまとめようと思ったが、皆様がまとめていただいた記事で、ほぼ何のトラブルもなく使い始められた。

今後も、GitHubを使いながら、参照させていただいた有益な記事等を随時整理していく。

# 参照記事
## チュートリアル
https://qiita.com/harufuji/items/5e958a87d35a81216c03

https://qiita.com/nnahito/items/565f8755e70c51532459

https://qiita.com/YUI_888/items/bea0904dfb517a8d99e7

## 意味が分からなかったことの解説記事
https://qiita.com/YUI_888/items/9819ccfba3354fba86d2

## トラブルシューティング
https://www.softel.co.jp/blogs/tech/archives/3569

# これから参照させていただこうと思っている記事
## MS Officeファイルの管理
https://qiita.com/hyt126/items/920b93400fc750cff8da

https://qiita.com/RyoWakabayashi/items/bde84624bffc1f68071d

https://qiita.com/hyt126/items/920b93400fc750cff8da

## 論文執筆
https://qiita.com/ktkraoichi/items/f6ad43c2da0b3136d6be

https://qiita.com/ktkraoichi/items/6b31644e4832882310d8

https://qiita.com/kaizen_nagoya/items/eb9945a2649f6f3eabd0

# 謝辞
記事を執筆していただいている皆様に感謝申し上げます。
Next.js + TypeScript でformを作成する。STEP1 環境セットアップ

`Next.js`と`TypeScript`と`Emotion`をつかってformを作っていきたいと思います。
実装の過程も一緒に記事にしていこうと思います。
これから学習される方のお役に立てれば幸いです。

## Next.jsの開発環境を準備する
Next.jsの開発環境を用意するのはとても簡単です。
公式サイトDocsに従ってコマンドを実行するだけで開発環境が完成します。

### create-next-app

```
npx create-next-app@latest
# or
yarn create next-app
```

今回はTypeScriptも利用したいので下記のコマンドを利用します。

```
npx create-next-app@latest --typescript
# or
yarn create next-app --typescript
```

### `next, react, react-dom`のインストール

```
npm install next react react-dom
# or
yarn add next react react-dom
```

### localhostで確認

```
npm run dev or yarn dev
```

`http://localhost:3000`に接続すればブラウザで表示を確認できると思います。

`./pages/index.tsx`の記述を変更すると画面が変わると思います。


[公式サイト](https://nextjs.org/docs/getting-started)

### Emotionを使えるようにしたい
yarnでいくつかインストールしていきます。

```
yarn add @emotion/react  
yarn add @emotion/eslint-plugin
yarn add @emotion/babel-plugin
yarn add @emotion/babel-preset-css-prop
```

さらに`.babelrc`と`.eslint`に記述を追加します。

```js:.babelrc
{
  "presets": [
    [
      "next/babel",
      {
        "preset-react": {
          "runtime": "automatic",
          "importSource": "@emotion/react"
        }
      }
    ]
  ],
  "plugins": [
    "@emotion/babel-plugin"
  ]
}
```

```js:.esliint
{
  "plugins": ["@emotion"],
  "rules": {
    "@emotion/jsx-import": "error",
    "@emotion/pkg-renaming": "error"
  }
}

```

これで`.tsx`内にCSSを下記のように記述できるようになると思います。

```tsx
import type { NextPage } from 'next';
import { css } from '@emotion/react';

const styles = {
  container: css`
    width: 375px;
    margin: 0 auto;
    background-color: #fff;
  `,
};

const Home: NextPage = () => {
  return (
    <div css={styles.container}>
      Hello!
    </div>
  )
}
```

vscodeを利用されている方はハイライトや補完をさせたくなると思います。
通常設定だと無理なので「vscode-styled-components
」というプラグインを入れましょう。

これでおおよその開発環境が整えられたかと思います。

[公式サイト](https://emotion.sh/docs/introduction)
conceptで爆発するC++20

# はじめに

　ちょっとしたネタです。C++20でconceptという機能が追加されましたが、これを悪用するとコンパイルに指数オーダの時間計算量・空間計算量がかかるコードを書けるという話です。

# concept

　conceptはC++20で追加された機能です。ここでは簡単にしか説明しないので、詳しい話は[こちらの記事](https://qiita.com/negi-drums/items/a527c05050781a5af523)を参照していただければと思います。
　conceptでは論理式の包含関係に基づいてオーバーロードの優先順位を決定します。どういうことかは以下の例を用いて説明しましょう。

```cpp
#include <type_traits>
#include <concepts>
#include <iostream>

template<typename T> concept A1 = std::is_convertible_v<T, int>;
template<typename T> concept A2 = std::is_convertible_v<T, int>;
template<typename T> concept A3 = std::is_convertible_v<T, int>;

template<typename T> concept B1 = A1<T> && (A2<T> || A3<T>);
template<typename T> concept B2 = A1<T> && A2<T> && A3<T>; 

void func(B1 auto) {
  std::cout << "func(B1 auto)\n"; 
}

void func(B2 auto) {
  std::cout << "func(B2 auto)\n";
}

int main() {
  func(42);   // func(B2 auto) が選ばれる
  return 0;
}
```

　上のコード例において、
　$ B_1 = A_1 \wedge (A_2 \vee A_3) $
　$ B_2 = A_1 \wedge A_2 \wedge A_3 $
となっているわけですが、$B_1$と$B_2$の間には$B_1 \subset B_2$（すなわち$B_2$ならば$B_1$）という関係が成り立っていることは簡単にわかると思います（真理値表を書くと簡単に確認できます）。つまり$B_2$の方が厳しい条件式であるということです。
　ここで、`T`に`int`を入れてあげると、`B1<T>`も`B2<T>`も共に`true`になるので、オーバーロードされた関数`func(B1 auto)`と`func(B2 auto)`の両方の制約を満たすことになりますが、ここではより条件の厳しい`func(B2 auto)`が優先されます。

# 本題
　さて、もう薄々感づいている方もいるかもしれませんが、論理和と論理積で構成された、2つの論理関数の論理包含関係を調べるのはNP-completeです。多分。間違っていたら教えてください。これはどういうことかというと、（P != NPならば）指数時間の計算量がかかるという意味になります。
　というわけでコンパイルに指数時間かかるコードの例を挙げてみましょう。

```cpp
#include <type_traits>
#include <concepts>
#include <iostream>

template<typename T> concept A01 = std::is_convertible_v<T, int>;
template<typename T> concept A02 = std::is_convertible_v<T, int>;
template<typename T> concept A03 = std::is_convertible_v<T, int>;
// ... 省略
template<typename T> concept A60 = std::is_convertible_v<T, int>;

template<typename T> concept B1 = (A01<T> || A02<T>) && (A03<T> || A04<T>) && /* ... 省略 */ && (A59<T> || A60<T>);
template<typename T> concept B2 = A01<T> && A02<T> && A03<T> && A04<T> && /* ... 省略 */ && A59<T> && A60<T>; 

void func(B1 auto) {
    std::cout << "func(B1 auto)\n";
}

void func(B2 auto) {
    std::cout << "func(B2 auto)\n";
}

int main() {
    func(42);   // func(B2 auto) が選ばれるはずだが...
    return 0;
}
```

　何か所か省略しているのでコード全文を見たい方は[こちら](https://compiler-explorer.com/z/bzaqdsMcr)からどうぞ。
　さて、この例においても$B_1 \subset B_2$なので`func(B2 auto)`が優先されるはずで、またコード自体も完全に合法ですが、コンパイルには失敗します。MSVCはヒープ領域を使い果たしてエラーになります。Clangは何も出力せずに異常終了しますが、おそらく同じ理由でヒープ領域を使い果たしてエラーになります。GCCは少し頭がよくて、conceptの複雑度が既定値を超えたという旨のエラーを吐いて即座に終了します。
　正直コンパイラ内部でどのような計算を行っているかは知らないのですが、おそらく真理値表を書くか何かしているのだと思います。そしてその真理値表に指数オーダの空間計算量がかかるのでMSVC/Clangはメモリ不足になるのでしょう。

# 終わりに
　今後より複雑なconceptが標準ライブラリに組み込まれていくと思われますが、いつかこの壁にぶつかりそうですね。C++標準化委員会がこの問題をどう解決していくのか楽しみです。

おしまい。
僕「ITのスタートアップに価値がなくても良いって？」

# 僕「ITのスタートアップに価値がなくても良いって？」

天使「ITにスタートアップが多いのってさ…あれ…一部の会社は上場とか会社を大きくするのが目的じゃなくてね…」

僕「（ｺﾞｸﾘ」

天使
＿人人人人人人人人人人人人人人人＿
＞資金調達が目的なんダヨー！！！＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣

僕
＿人人人人人人人人人人＿
＞な、なんだってー！？＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y￣

# 本来のスタートアップ
天使「本来のスタートアップってこうじゃろ？」

僕「僕この認識だぉー」

天使「会社を作る、事業を育てる。この際に会社によっては資金調達などするんダヨー」

僕「そうやって価値が上がったら上場したりして『ユニコーン企業』とか言うよね？」

天使「ダヨー」
![01.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/f2b628ec-a7c5-7418-b8cb-efdb2c1ee319.png)

# 事業が失敗
天使「だけど、全ての企業が上場してユニコーン企業になれるわけじゃないダヨー」

僕「そうだね。シェアを取れなくて微妙な状態になってたり果てには倒産することもあるね。」

天使「ただ、これで後々問題になる人が出るパターンがあるのは資金調達までは成功したりするパターンなんだよダヨー」

僕「なんでこれが問題になるの？」
![02.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/2ef992f4-c741-314a-f010-266a1749c940.png)

# 資金調達が目的になる

天使「成功体験って知ってるか？」

僕「知ってるよー。あの成功した体験は強く記憶するってやつだよね？」

天使「そうダヨー。資金を調達して脚光を浴びたり急激にお金を手に入れて使う事を強く覚えてしまうんだよ。」

僕「わかった！スタートアップ企業を作って何か新しいことをするのが目的ではなく『資金集め』が目的になるのか！？」

天使「ダヨー。そして資金集めまでの方法を知ってるから『これから資金を集めたいスタートアップ企業』には有用な人材になってるんダヨー。」

僕「あぁ…本人が起業しても良いし、どこかのスタートアップに参加して資金調達しても良いのか…」

天使「これが酷い場合は実際に本当は価値がないのに人脈とプレゼンなりで資金調達が可能になる…」

僕「あぁ…まだ物が無くても『物を作るために資金が必要』って訴えるパターンもあるから…」

![03.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/4868fd7c-bca9-9dce-165f-a143b71917c7.png)

# 資金調達出来たスタートアップが良いかって？
天使
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/51c1567b-af33-e87d-1954-891343a7c051.png)

僕「全部悪い訳じゃないけど…全部良い訳でもないからね…」


天使「ちなみにIT業界がこのターゲットになってるのって他の事業と違って極論パソコンだけ、あれば出来るからダヨー」
sumitrust2019 C-100 to 105 全探索

三井住友信託銀行プログラミングコンテスト2019 C問題の解答。なぜかdpによる解ばかり見るので普通の全探索による方法を書き留めておく。
#問題
>AtCoder 商店では、以下の 6 種類の品物が 1000000 個ずつ売られています。
1 個 100 円のおにぎり
1 個 101 円のサンドイッチ
1 個 102 円のクッキー
1 個 103 円のケーキ
1 個 104 円の飴
1 個 105 円のパソコン
高橋君は、合計価格がちょうど X 円となるような買い物をしたいです。そのような買い方が存在するか判定してください。ただし、消費税は考えないものとします。

https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_c

#考察
品物の呼び名を価格の安い順にa,b,...,fとする。たとえばaは100円、fは105円。

6種類の品物それぞれの個数(0-10^6)に関して素朴に全探索していては到底間に合わない。全探索の範囲を削れないか考える。

この問題で求められているのは、上手い買い方の存在についてのyes/noであり、解の列挙ではない。したがって、全探索の範囲は解が存在するときにそのうちの1つ検出するのに十分な広さを確保できればよい。

品物をたくさん買ったとして、その合計額Xを大量のaと少量のb-fで再構成することを考える。aで吸収できない端数は、fを使って吸収するとにする。題意の条件下では品物が売り切れになることはないから、いくらでも偏った買い方をしてよい。

b*5=505=a*4+f
c*5=510=a*3+2*f
d*5=515=a*2+3*f
e*5=520=a+4*f
f*100=10500=a*105

これより、aを山のように使うことを許せば、高々4個のb-eと、高々99個のfでどんな買い物の値段も再現できると分かる。b-fの5品の購入個数が定まればaの必要購入数は自動的に定まるので、全探索範囲はb-fだけでよい。すなわち、5*5*5*5*100通りの全探索で済む。かくして余裕で間に合った。

##蛇足: 着想
初歩的な線形代数。
a = (100,0),
b = (100,1),
...
f = (100,5)
のような$R^2$内の6つのベクトルと思えば、線形独立なのは高々2つなのだから、少なくとも4つに関しては他2つによる端的な表記が可能で、その際の線形和の係数はたぶん非負整数にとれるだろう(勘)。b,c,d,e を a,f で表したのはまさにそれ。独立成分として(a,f)を選んだのはこの線形和が書きやすそうだったから。

あとは a,f を元の設定通り一次元量として見てやれば、やはり同じ理屈で一方を他方の定数倍で書ける。最初から一次元量として見なして似たような議論をすることもできなくはないが、それだと係数の膨らみ具合がよろしくなさそうだったので避けた。

#実装
```cpp
#define rep(i, a, n) for (int i = a; i < n; ++i)
typedef long long ll;

int main() {
    ll x;
    cin >> x;
    int ans = 0;
    rep(b, 0, 5) rep(c, 0, 5) rep(d, 0, 5) rep(e, 0, 5) rep(f, 0, 100) {
        ll resd = x - (b * 101 + c * 102 + d * 103 + e * 104 + f * 105);
        if (resd >= 0 && resd % 100 == 0) {
            ans = 1;
            break;
        }
    }

    cout << ans << endl;
}
```
Linuxでもバーチャル背景を実現する

## 環境
- Arch linux
- ハードオフで拾ってきたジャンクのWebカメラ

## Linux-Fake-Background-Webcamを導入する
1. [fake-background-webcam-git](https://aur.archlinux.org/packages/fake-background-webcam-git/)をAURからダウンロードしてビルド・インストールする。
1. `v4l2-loopback`が入っていなかったら入れる。
1. お好みのファイルに以下のコンフィグを記述。
1. 解像度などは`v4l2-ctl -d /dev/video0 --all`などして適宜調整する。
1. `sudo modprobe v4l2loopback devices=1`する。
1. `sudo python /usr/lib/fake-background-webcam/fake.py -c (コンフィグファイルの絶対パス)`で起動する。
1. お好みのアプリケーションでバーチャルカメラの設定をする。
1. 楽しむ。

```
# https://pypi.org/project/ConfigArgParse/

#Set real webcam width
width=640

#Set real webcam height
height=480

#Set real webcam FPS
fps=30

#Set real webcam codec
codec='MJPG'

#Set real webcam path
webcam-path="/dev/video0"

#V4l2loopback device path
v4l2loopback-path="/dev/video2"

#Disable background image and blur the real background
#no-background=true

#Background image path, animated background is supported.
#background-image=background.jpg
background-image=/var/lib/fake-background-webcam/default/background.jpg

#Tile the background image
#tile-background=true

#The gaussian bluring kernel size in pixels
#background-blur=21

#The fraction of the kernel size to use for the sigma value (ie. sigma = k / frac)
#background-blur-sigma-frac=3

#Crop background if needed to maintain aspect ratio
#background-keep-aspect=true

#Disable foreground image
#no-foreground=true

#Foreground image path
foreground-image=/var/lib/fake-background-webcam/default/foreground.jpg

#Foreground mask image pat
foreground-mask-image=/var/lib/fake-background-webcam/default/foreground-mask.png

#Add a hologram effect
#hologram=true

#Continue processing when there is no application using the virtual webcam
no-ondemand=true

#The running average percentage for background mask updates
background-mask-update-speed=100

#Force the mask to follow a sigmoid distribution
#use-sigmoid=true

#The minimum percentage threshold for accepting a pixel as foreground
threshold=50

#Disable postprocessing (masking dilation and blurring)
no-postprocess=true

#Select the model for MediaPipe. For more information, please refer to https://github.com/fangfufu/Linux-Fake-Background-Webcam/issues/135#issuecomment-883361294
select-model=0

#Apply colour map to the person using cmapy. For examples, please refer to https://gitlab.com/cvejarano-oss/cmapy/blob/master/docs/colorize_all_examples.md
#cmap-person=

#Apply colour map to background using cmapy
#cmap-bg=
```

## おわり
![スクリーンショット_2021-10-22_02-08-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/907015/62d32d73-7170-de3d-d631-6360839d7e91.png)