OmniAICreator/Qiita-1.07M huggingface dataset:
Linux よく使うコマンド集（ファイル・ディレクトリ編）

今回は Linux コマンドをよく使う順にまとめて、その中でもよく使うコマンドをまとめてみました。
[] はその場に合わせて、{} は任意のパラメータ（？）です。

#ファイル・ディレクトリ操作
##ディレクトリを作る – mkdir
```
mkdir [dir_name]
```
##ディレクトリを削除する - rmdir
```
rmdir [dir_name]
```
##ディレクトリを移動する - cd
```
cd [dir_name]
```
##ディレクトリの中身を見る - ls
```
#単純
ls {dir_name}
#権限や所有者
ls -l {dir_name}
#隠しファイルも含める
ls -a {dir_name}
#権限や所有者＋隠しファイル
ls -al {dir_name}
```
##ファイルを作る - touch
```
touch [file_name]
```
##ファイルを編集する - nano, vi, vim
```
[editor] [file_name]
```
`[editor]`には nano や vim が入ります。
##ファイル（・ディレクトリ）を削除する - rm
```
rm [file_name]
#ディレクトリ内のファイルを全て削除
rm *
rm [dir_name]/*
#警告なしで削除
rm -f *
#ディレクトリ内のものを（ファイルだろうがディレクトリだろうが）全て削除
rm -r *
rm -r [dir_name]/*
#ディレクトリを中のものまで全て削除
rm -r [dir_name]
```
##ファイル・ディレクトリを移動・改名する - mv
移動と改名は同じコマンドでします。
```
#改名
#注：new には存在しないファイル・ディレクトリ名を入れる
mv [old_file_name] [new_file_name]
mv [old_dir_name] [new_dir_name]
#移動
mv [target_file_name] [to_file_name]
mv [target_dir_name] [to_dir_name]
```
##ファイル・ディレクトリをコピーする - cp
```
#to_file_name に file_name の内容をコピーする（to_file_name が存在しない場合は新しく作られる）
cp [file_name] [to_file_name]
#file_name を他のディレクトリにコピーする
cp [file_name] [to_dir_name]
#ディレクトリをコピーする場合は -r オプションをつける
#語尾にスラッシュをつけるかどうかで挙動が変わる
##中身をコピー：to_dir_name の中身と dir_name の中身が同じになる
cp -r [dir_name] [to_dir_name]
##中にコピー：to_dir_name の中に dir_name ができる
cp -r [dir_name] [to_dir_name]/
```
##まとめ
以上が、私がよく使うと思う Linux コマンドでした。

初心者の方は、多いなと思うかもしれませんが、本当によく使うコマンドですので、やってくうちに自然と覚えられると思います。
機械学習の実験管理をトレンドサーチしてみた

# 概要
実験管理ツールがOSSとして複数あるものの、どれが流行っているのか&学習コストに見合うだけ使えるのかの知りたく調査しました。今回はMlflow,Kubeflow,Kedro,Metaflow,ClearMLをGoogleトレンドで調査。結果、Kubeflow,Mlflowがよく検索されているようです。

# 調査
Googleトレンドで12ヶ月,5年,おまけで日本での12ヶ月の3つの結果を載せます。画像は執筆時点で取得したものです。

線の色の対応は次の図を参照して下さい。

![スクリーンショット 2021-07-19 14.50.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1707407/20279170-a022-216a-9c3c-622425037b8b.png)


---
![スクリーンショット 2021-07-19 14.41.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1707407/2c96fd4b-192b-81de-7ae6-459d20a9062e.png)
12ヶ月の検索では、MlfLowとKubeflowがほぼ同立の1位。

---

![スクリーンショット 2021-07-19 14.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1707407/144e5be7-42a5-3020-9792-c791f3e127bc.png)

5年ではKubeflowがやや優勢。2018年6月にMlflow 0.1.0のリリースが開始されています。Kubeflowも2018年2月ごろからv0.1の開発が進んでいます。

---

![スクリーンショット 2021-07-19 14.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1707407/55dc58a1-d3b3-fbfd-3ea1-700a1696fa4a.png)

おまけに日本での検索結果です。Kubenetesの学習コストが大きいからか、Mlflowが優勢です。学習と実用のバランスをとるとMlflowを使ってみるのがいいように思います。
outsystemでhello world作成

outsystemsの初心者に対して、outsystemsの使用方法は連載させていただきます。
2回目で、もっとも簡単な「hello world」からスタートしましょう。

まずは開発IDEを準備します。

OutSystem Service Studio11は以下のURLからダウンロードできる。（アクセスにはoutsystemsのアカウントが必要です。）

https://www.outsystems.com/downloads/

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529083655893.png)



![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529084203059.png)



OutSystem Service Studioを開きます。**New Application**をクリックします。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529084447469.png)



**Start from scratch**を選択して、**next**ボタンをクリックします。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529084546960.png)

**Traditional Web**を選択して、**Next**ボタンをクリックします。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529084943886.png)





**Name**にHello Worldを入力して、**CREATE APP**ボタンをクリックします。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529085205084.png)

CREATE MODULEをクリックします。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529085619308.png)





web screenをMain Editor windowにドラッグインします

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529085854730.png)



Outsystemsは色々なtemplatesなどを提供してくれますが、一応簡単なEmptyを選択して、Screen nameにHello Worldを入力して、CREATE SCREENをクリックします。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529090402023.png)



![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529090639882.png)



ToolBoxからTextをMain Editor windowにドラッグインします

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529090753271.png)



属性Textに、Hello worldを入力します

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529090929112.png)



Web ScreenのRegisteredのチェック状態を外すします。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529091943642.png)

上記操作後に、画面にある1アイコン(1-click Publish)をクリックします。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529091345206.png)

Outsystemsは自動でコンパイル、deployなどを実施します。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529092050136.png)

deploy完了したら、1アイコンはOpen In Browserアイコンに切り替わります。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529091549774.png)



Open In Browserアイコンをクリックします

browserで開くとhello worldのweb applicationが確認できました。

![Image text](https://raw.githubusercontent.com/sichen427/img-folder/main/1/images/image-20210529092150662.png)
ArduinoUno: 温度センサ・モジュールを使う

Arduino の 温度センサ・モジュールを使う方法です。
>A0 に 温度センサ・モジュール
>I2C に Grove-LCD RGB Backlight v4.0
>を接続します。
![IMG_20210719_145800.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/bceb657e-1eff-763c-f490-6357f902b5cd.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0b3b0895-d5df-4a6c-62f9-75782d8107a1.png)


```text:temperature/temperature.ino
#include "rgb_lcd.h"
rgb_lcd lcd;

int val = 0;
float resistance = 0;
float temperature = 0;
int b = 3795;

void setup() {
	lcd.begin(16,2);
	lcd.setRGB(0, 255, 255);
}

void loop() {
    val = analogRead(A0);
    resistance = (float)(1023-val)*10000/val;
    temperature = 1/(log(resistance/10000)/b+1/298.15) -273.15;
    lcd.setCursor(0,0);
    lcd.print ("val = " + String(val) + "      ");
    delay(2000);
    lcd.setCursor(0,0);
    lcd.print ("Temperature    ");
    lcd.setCursor(0,1);
    lcd.print (String(temperature) + "       ");    
    delay(2000);
    lcd.setCursor(0,1);
    lcd.print ("          ");
}
```
AtCoder Beginner Contest 210 参戦記

# AtCoder Beginner Contest 210 参戦記

## [ABC210A - Cabbages](https://atcoder.jp/contests/abc210/tasks/abc210_a)

2分で突破. 書くだけ.

```python
N, A, X, Y = map(int, input().split())

if N <= A:
    print(X * N)
else:
    print(X * A + Y * (N - A))
```

## [ABC210B - Bouzu Mekuri](https://atcoder.jp/contests/abc210/tasks/abc210_b)

2分半で突破. 書くだけ.

```python
N = int(input())
S = input()

if S.find('1') % 2 == 0:
    print('Takahashi')
else:
    print('Aoki')
```

## [ABC210C - Colorful Candies](https://atcoder.jp/contests/abc210/tasks/abc210_c)

固定ウインドウで処理をすればいいのが分かる. 10<sup>9</sup> 種類なので、配列で個数を管理できないので辞書で個数管理をした. 座圧すれば 10<sup>5</sup> まで縮むので配列でも管理できますが…….

```python
from collections import Counter

N, K, *c = map(int, open(0).read().split())

ct = Counter(c[:K])
t = len(ct)
result = t
for i in range(0, N - K):
    a = c[i]
    ct[a] -= 1
    if ct[a] == 0:
        t -= 1
    b = c[i + K]
    ct.setdefault(b, 0)
    if ct[b] == 0:
        t += 1
    ct[b] += 1
    result = max(result, t)
print(result)
```

## [ABC210D - National Railway](https://atcoder.jp/contests/abc210/tasks/abc210_d)

78分半で突破. WA5. 全く思いつかず、ダメ元で最悪 *O*(10<sup>12</sup>)、最善 *O*(10<sup>6</sup>) のコードを書いてみたら通った. *C*=1 のときに死ぬかなと思ったので意外.

```python
from sys import stdin

readline = stdin.readline

H, W, C = map(int, readline().split())
A = [list(map(int, readline().split())) for _ in range(H)]

result = A[0][0] + A[0][1] + C
m = min(min(a) for a in A)
for i in range(H):
    for j in range(W):
        for d in range(1, 10 ** 6):
            t = A[i][j] + C * d
            if t + m > result:
                break
            for k in range(d + 1):
                if i + k >= H:
                    break
                l = d - k
                if j + l < W:
                    result = min(result, t + A[i + k][j + l])
                if j - l >= 0:
                    result = min(result, t + A[i + k][j - l])
print(result)
```

解説を読んで *O*(10<sup>6</sup>) の DP で書いてみたが、予想外なことに上のコードのほうがちょっとだけ速かった. mjk という感想しかない.

```python
from sys import stdin

readline = stdin.readline

H, W, C = map(int, readline().split())
A = [list(map(int, readline().split())) for _ in range(H)]

result = 10 ** 15

dp = [A[i][:] for i in range(H)]
for i in range(H):
    for j in range(W):
        if i != 0:
            result = min(result, dp[i][j] + dp[i - 1][j] + C)
        if j != 0:
            result = min(result, dp[i][j] + dp[i][j - 1] + C)
        if i != 0:
            dp[i][j] = min(dp[i][j], dp[i - 1][j] + C)
        if j != 0:
            dp[i][j] = min(dp[i][j], dp[i][j - 1] + C)

dp = [A[i][:] for i in range(H)]
for i in range(H):
    for j in range(W - 1, -1, -1):
        if i != 0:
            result = min(result, dp[i][j] + dp[i - 1][j] + C)
        if j != W - 1:
            result = min(result, dp[i][j] + dp[i][j + 1] + C)
        if i != 0:
            dp[i][j] = min(dp[i][j], dp[i - 1][j] + C)
        if j != W - 1:
            dp[i][j] = min(dp[i][j], dp[i][j + 1] + C)

print(result)
```
Cognitoが発行したJWTを使ってAPI GatewayのAuthorizerで認証をし、Lambdaで認証情報を受取る

ユースケースとしては、

- とにかく早く実装をしたい
- JWTのデコードを実装したくない
- 複数のバックエンドで認証をしたくない

などのケースが当てはまるのではないか、と思います。

# やり方

AWS上のリソース(Cognito、Lambda、Gateway)を設定した後、Cognitoが提供しているビルトインのUIからログインをしてトークンを取得した後、ポストマンからリクエストを投げ、認証情報が取得できていることの確認をします。

フロントエンドを作るのが面倒くさいので、作らずに行きます。

トークンの受け取りをするサーバがないことになるので、デベロッパーツールからコピペするなどの工夫をします。

## Cognitoの設定

基本的にはデフォルトのままでOKです。

### リソース作成
![スクリーンショット 2021-07-19 13.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489635/5a54f525-e7b4-e033-4b09-d96c2bb8f17e.png)


### クライアント作成
![スクリーンショット 2021-07-19 13.03.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489635/7647bbe4-456b-8e0b-3d84-d78e23e1c9d3.png)


### クライアント設定

本来フロントのホストをいれますが、なんでもいいです。
![スクリーンショット 2021-07-19 13.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489635/fc53e76a-5922-ca5c-6b47-9336f01ad805.png)


### ドメイン設定

![スクリーンショット 2021-07-19 13.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489635/2909dbc1-d107-f862-fdb9-73e9af7385e2.png)

設定が出来たら、App Client Settingsにある『Launch Hosted UI』をクリックし、デベロッパーツールを開いたままログインをしてください。

ログインが成功すれば、302が帰ってくるので、レスポンスのLocationから、id_tokenのみをメモしておきます。

![スクリーンショット 2021-07-19 14.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489635/f89dd2a1-7215-9e07-d6e6-f3c0bbfe1c70.png)

## Lambdaの設定

こちらをコピーしてください。

```python
import json

def lambda_handler(event, context):
    return {
        'message': f"Hello {event['requestContext']['authorizer']['jwt']['claims']['cognito:username']} from Lambda!!!",
        'token_info': event['requestContext']['authorizer']['jwt'],
    } 
```

## Api Gatewayの設定

GateWayを適当に作ったあと、Authorizerを以下のように設定します。

![スクリーンショット 2021-07-19 13.47.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489635/910e58fa-8fa5-1a86-06ec-6d8432038db9.png)

Authorizerを設定したGatewayのパスにアクセスして、

```python
{"message":"Unauthorized"}
```

が出てくればOKです。

# 認証情報の取得

PostmanなどのHTTPクライアントで、Authorizationヘッダに、『Bearer {↑で取得したIDトークン}』をつけて、リクエストを送ると、以下のようなレスポンスが帰ってくるはずです。

```python
{
    "message": "Hello sample_user from Lambda!!!",
    "token_info": {
        "claims": {
            "at_hash": "adsfasddsdf",
            "aud": "asdfasf",
            "auth_time": "sfasdf",
            "cognito:username": "asdfsdaf",
            "email": "asdfasf",
            "email_verified": "ssdaf",
            "event_id": "asdfasdf",
            "exp": "1626670138",
            "iat": "1626666538",
            "iss": "sadsadfs",
            "jti": "sadfsfd",
            "sub": "safasdf",
            "token_use": "asdfasfdsadf"
        },
        "scopes": null
    }
}
```
SSH接続でpostgreSQLに入れない

こちらの記事を見ながらAWS上に作ったpostgreSQLに入ろうと長いこと格闘致しました。

https://zatoima.github.io/aws-ec2-psql-install.html

```
psql -h <エンドポイント> -U <ユーザ名> -d <データベース名>
```

↑これで入れるらしいのにエラーが止まらない。

```
psql: FATAL: database "similar-develop-db" does not exist
```

そんなDBないって言われる(´;ω;｀)

いろいろ調べるうちにポイントは<ユーザ名>と<データベース名>かな？？と気付く。

そういえばDB名ってどこに書いてあるんだろうと思ってAWSを見に行ってみた。:eyes:

![スクリーンショット 2021-07-19 141514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780205/7ae96365-e1dd-5b85-b796-5d2cbc2ddbb0.png)

・・・ないな。そういえばDB名を設定した覚えもない。
え～、DB名設定しないと接続できないのかな…と思ってまたいろいろ探してみた。

そしたらこんな記事に出会いました。

https://www.dbonline.jp/postgresql/connect/index2.html#section2

記事の一部を抜粋しますと
『ロール名は PostgreSQL をインストールした直後はスーパーユーザーである postgres ロールしか作成されていませんので -U postgres と指定してください。ロール名を省略した場合は OS のユーザー名が使用されます。
※ PostgreSQL では一般的にユーザーと呼ばれるものとグループと呼ばれるものをまとめてロールと呼んでいます。

データベース名には接続するデータベース名を指定します。省略した場合はロール名と同じ名前のデータベースに接続します。( postgres データベースは自動で作成されており、 postgres ロールで接続した場合は postgres データベースに接続します)。』

と書いてありました。

なるほど・・・？つまり、

```
psql -h <エンドポイント> -U postgres -d postgres
```
で良いのでは！？と閃いて試したのですが上手くいかず。

```
psql: FATAL: password authentication failed for user "postgres"
FATAL: password authentication failed for user "postgres"
```

そんなユーザー存在しないって😭

あれ、でもそういえば自分マスターユーザー名は登録した気がするな。。。と思って修正。

```
psql -h <エンドポイント> -U root -d postgres
```

・・・入れました！！DB入るのにどんだけ時間かかるんだ自分(笑)
cokkieとLocalStorageの違い

## はじめに

とある学習教材を参考にログイン機能(JWT認証)を作成中、ブラウザに情報を保持しておく際に**cokkie**ではなく**LocalStorage**を使用していたので、違いを自分用にメモしました。

## 前提
LocalStorageはcokkieの後継的技術。
**「情報をブラウザに保管しておく」**という点で2つとも共通の役割。


## 違い

###1. 容量

**LocalStorage  > cokkie**

LocalStorage → 5 **MB**
cokkie → 4 KB




###2. 保存期間

**LocalStorage  > cokkie**

LocalStorage → 半永久的に保存される
cokkie → 指定した期間しか保存されない (一般的に1年や2年の期間で保存されることが多い)


###3. サーバーへのデータ送信

LocalStorage → 必要なデータ利用時にしか、データ送信されない (セキュリティ面で比較的安全&処理が軽い)

cokkie → HTTP通信の度に全てのクッキー情報をクライアント側からサーバー側にデータ送信される (セキュリティに問題抱えやすい&処理が重くなる)
docker compose v2でコンテナでbashを起動し、矢印キーの上（↑）を入力すると「^[[A」と表示される不具合への対応策

# 解決方法
**docker compose v2**を使わないこと

```sh
docker-compose disabel-v2
docker-compose run --rm 〇〇 bash
```
これを実行し、以降は
`docker compose`コマンドではなく`docker-compose`コマンド（Python版）を使用するようにしてください。


# 原因
docker composeのバージョンがv2になっていることです。




Issueが無かったので作成しました。
この不具合の進捗は以下で確認できると思います。

https://github.com/docker/compose-cli/issues/1929
Scala 3関連まとめ

# Scala3 (aka Dotty) に関するQiitaの記事
## 概念の紹介
https://qiita.com/takat0-h0rikosh1/items/8f4c3c7eb231f813d38a

― `opaque type`

https://qiita.com/hinastory/items/6dacb1f61d86f4a5d533

― `using`及び`given`

https://qiita.com/hinastory/items/abb68fe47755894b79ea

― インデントベースの構文

https://qiita.com/rider-yi/items/3520311ac8f00b25d991

― 入った要素の概要
しょぼん君シリーズ、記事一覧(´･ω･`)

#この記事について
この記事は、しょぼん君シリーズ(´･ω･`)TOPページです。関連記事の参考になればと思います。
まだまだ記事は少ないですが、しょぼん君シリーズは今後も増える予定です！

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『がんばる』

※ グレー文字は準備中です

#インフラ(´･ω･`)
- サーバー
    - Linux
        - 検証
            - [初心者が仮想マシンを構築する【VirtualBox,CentOS】(´･ω･`)](https://qiita.com/shobooon/items/527073e1cf40ef2b61a2)
               
        - 構築
            - [初心者がSSHについて学ぶ(´･ω･`)](https://qiita.com/shobooon/items/70cc74cd20c8b5b4fe15)
            - [初心者がパスを通す(´･ω･`)](https://qiita.com/shobooon/items/7a30f29091a6f8198f43)
            - [初心者がファイルシステムを扱う(´･ω･`)](https://qiita.com/shobooon/items/3925e3f650971202bfc0)
        - <font color="gray">テスト</font color>
- コンテナ
    - [初心者がコンテナを学ぶ(´･ω･`)](https://qiita.com/shobooon/items/0dc64ea646a44aaa25e9)


- <font color="gray">コラム・小ネタ</font color>


#アプリ(´･ω･`)
- <font color="gray">クライアントサイド</font color>
- サーバーサイド
    - [初心者がNode.jsを使う(´･ω･`)](https://qiita.com/shobooon/items/9667d215fabf24dfd4fb)
    - [初心者がRESTを学ぶ【基礎編】(´･ω･`)](https://qiita.com/shobooon/items/8b224bcf6a354b205d60)



#ツール(´･ω･`)
ツールの使い方など

- Tool
    - コード管理
        - [初心者がGithubをはじめてみる【Mac】 (´･ω･`)](https://qiita.com/shobooon/items/8c6cda5a2bcbf2525c6e)
    - コーディング
        - <font color="gray">Eclipse</font color>



#コラム(´･ω･`)   
記事の本筋とは異なるが、理解は必要であり文章量が肥大化してしまうもの。知ってる人は読まなくて良い

- 用語
    - 


#プロジェクト、成果物(´･ω･`)...{Comming Soon}

- <font color="gray">要件定義</font color>
- <font color="gray">基本設計</font color>
- <font color="gray">詳細設計</font color>
- <font color="gray">実装</font color>
- <font color="gray">単体テスト</font color>
- <font color="gray">システムテスト</font color>


END
【slackアプリ】モーダルに隠しinputを入れる方法（private_metadata）


## 開発環境
- nodejs12.x
- @slack/bolt": "^2.0.1"


## やりたいこと
メッセージやモーダルのやりとりを、
「やりとりの発生したユーザーが居る部屋」という具合に可変にして送りたい。

## `command`などの場合

`body.channel_name` に送信してきたユーザーのチャンネル名が入っているので楽勝。
これをチャンネル指定箇所に引数として渡してあげればOK。

```js
  app.command('/aq-help', async ({ ack, body, client }) => {
    await ack()

    try {
      const result = await client.chat.postEphemeral({
        channel: body.channel_name, // ここ
        user: body.user_id,
        blocks: [
          {
// omit 
```


## モーダルListen時（本題）
これが結構大変だった。
bodyにチャンネルの情報が入っていない。
リファレンスを漁ってもどこにもない!!

色々調べると、
speeeさんの開発している[**@speee-js/jsx-slack**](https://tech.speee.jp/entry/2019/10/16/100022)というライブラリを発見。
これはboltのblockをJSXで記述できるという素敵なライブラリだが、不思議な記述を発見。

```react
<Modal title="modal">
  <Input type="hidden" name="foo" value="bar" />
  <Input type="hidden" name="userId" value={123} />
```

**hiddenだって!?**
**そんな機能デフォルトでなかったぞ...!🤯**

と、色々調べているとどうも　`private_metadata` という機能を使用して実現している模様。
完全にリファレンス読み落としてた...

https://api.slack.com/reference/surfaces/views

![スクリーンショット 2021-07-19 13.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/07a521fa-77d2-daac-98ff-7882d9bfa5b2.png)

見ての通りデータ型がStringで文字数制限があるので要注意。
送信時に取得した `body.channel_name` をここに入れてあげます。

```js
app.command('/aq-register', async ({ ack, body, client }) => {
  const result = await client.views.open({
    trigger_id: body.trigger_id,
    private_metadata: body.channel_name,　 // ここにデータを入れる
    callback_id: 'register',
   // 略

// モーダルListen側
app.view('register', async ({ ack, body, view, client }) => {
await ack()

/**
 * メッセージ送信
 */
try {
  await client.chat.postMessage({
  channel: view.private_metadata,  // ここでprivate_metadataを使用
  blocks: [
// 略
```

## まとめ
チャンネル名だけではなく、おそらく`private_metadata` を駆使すれば送信してきたユーザ情報なども同様に取得できるものと思われます。
なぜStringなんだ。。。。
[React] ReactJS , create - react - app

react開始前には、準備作業が必要です。
まずは必要なものが設置されているか確認してみます。

>nodeJSが必要です。
> npmも必要です。
>>npmはNode Packaged Managerの略語で、Nodeとして作られたpakageを管理してくれるツールです。 パイソンで考えるとpipに似ています。

```
npm install -g create-react-app
```
でreactの準備をします。

### Create React App

reactを利用すると、ES最新バージョンまで使用しなければならない場合があります。
でもいくつかのブラウザでは、特にIEでは最新バージョンに対応してくれません。
ですから、webpackやbabelなどのいくつかの方法が必要なのです。
これらを詳しく扱うのは、別のポスティングで行い、簡単に説明すると、ES最新バージョンのコードをすべてのブラウザで理解できるコードに変える役割があります。
もちろん、何から何まですべてを変えることはできず、webpackに対応できない場合もあります。

しかし、今はcreate-react-appを通じてひとつのコマンドとしてreact web appをsetupできます。
上で見てきたコマンドですね。

```
npx create-react-app {app 名前}
```

以上でreact　projectの基盤を構築しました。
src folderの下のfileを修正しながらappを作るのができます。
VSCodeのシェルをMSYS2のzshにする

VSCodeのバージョンは1.58.2で確認。

```json:settings.json
    "terminal.integrated.profiles.windows": {
        "zsh": {
            "path": "C:\\msys64\\usr\\bin\\zsh.exe",
            "args": [
                "-l"
            ],
            "env": {
                "MSYSTEM": "MINGW64",
                "CHERE_INVOKING": "1",
                "MSYS2_PATH_TYPE": "inherit"
            }
        }
    },
    "terminal.integrated.defaultProfile.windows": "zsh"
```
DatabricksにてPythonにより開発環境・本番環境等に応じた環境情報に切り替える方法

## 概要
Databricksにて環境情報（開発環境・本番環境）を切り替える方法として、環境に関する情報をステージ（開発、検証、本番）ごとにPythonの辞書として定義しておき、パラメータにより取得する情報を切り替える方法を共有します。

環境を切り替えるノートブック（switch_evn_inf）と環境のステージ（dev、prd）ごとのノートブックを作成することを想定しております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/defee26d-3172-d70d-f06b-444d7e03c883.png)


詳細は下記のGithub pagesのページをご確認ください。

https://manabian-.github.io/databricks_tecks_for_qiita/#swich_env_inf/swich_env_inf.html

コードを実行したい方は、下記のdbcファイルを取り込んでください。

```URL
https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/swich_env_inf/dbc/swich_env_inf.dbc
```

## 手順
### 1. 環境情報を辞書型変数にセット
文字型変数としてセットしたい場合には、シングルクォーテーションの中でダブルクオーテーションで囲ってください（例：'"dev_d"'）。

```python
env_dict = {}
    
# 検証環境の情報をdictに設定
dev_env_dict = {
    "dev": {
        'string': '"dev_d"',
        'int': '123',
        'float': '1.23',
        'boolean': 'True',
        'list': '["A","B"]',
        'dict': '{"a":"A","b":"B"}',
    }
}

# 共通のdictに検証環境のdictをappend
env_dict.update(prd_env_dict)
     
# 本番環境の情報をdictに設定
prd_env_dict = {
    "prd": {
        'env': '"prd"',
        'port': '15001',
    }
}
 
# 共通のdictに本番環境のdictをappend
env_dict.update(prd_env_dict)
```

### 2. 辞書型変数から変数をセットする関数を定義

```python
def swich_env_inf(target_env_dict):
    for attribute, value in target_env_dict.items():
        code=textwrap.dedent(f'''
            global {attribute} 
            {attribute}={value}
        ''').strip()
        exec(code)
```

### 3. 環境①の変数を定義

```python
# 環境①の環境名をセット
target_env = 'dev'
target_env_dict = env_dict[target_env]

swich_env_inf(target_env_dict)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d7fca9f8-51ac-7b5a-1387-a8a36338fe92.png)



### 4. 環境の②の変数を定義

```python
# 環境①の環境名をセット
target_env = 'prd'
target_env_dict = env_dict[target_env]

# 環境①の環境名をセット
target_env = 'prd'
target_env_dict = env_dict[target_env]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f95bd296-2f9c-0141-6edc-3e76b7ceedca.png)
IP Webcamを使う

世の中に出回っているIPカメラ（ネットワークカメラ）と呼ばれるものを、もう少し機能は限定的で良いので簡単にブラウザで（OS非依存で）使えるようにならないかと以前から考えていたが、スマホでIP Webcamというアプリを使うのが良さそうと最近知った。

https://play.google.com/store/apps/details?id=com.pas.webcam&hl=ja&gl=US

Androidのスマホにインストールして起動するだけ。
IPカメラだとLANの外からアクセスするためのサーバ設定とかもあって、このアプリの場合はivideonというのを経由すればできるらしいが、自分の使い方だと基本的にLAN内の装置の監視に使うので不要。単純にLAN内で使用する場合は、例えばIPを192.168.0.10と仮定して```http://192.168.0.10:8080/```にブラウザでアクセスすれば使える。複数のカメラを同時に表示したい場合は、適当なhtmlファイルを作るのが簡単。

```html
<html>
<body>
<img src="http://192.168.0.10:8080/video" width=800>
<img src="http://192.168.0.11:8080/video" width=800>
</body>
<html>
```

という感じで、```/video```が画像ファイルになっているので、```img```タグで取り込めば良いみたい。これならば手動だけど複数の映像を同時に表示したり、それをYoutubeとかに配信したり、スクリーンショットを定期的に取得したり、という作業も簡単にできそう。LAN内限定で使う分には遅延も気になるほどではなかった。

### 他に試したこと

httpの方が簡単だけど、UDPとかRTPなどを使った方が遅延が少ないと何かで読んだので、Astra Streamというアプリを使ってRTSPをOBSで受信する、という方法も試してみたが、こちらの方が遅延が大きかったのでやめた。

スマホを使うのならばZoomでいいじゃん、というのは一理あって、外からも装置の監視をしたい場合はZoomを使うのが簡単。ただし、Zoomを使う場合はサーバ経由になるので遅延があるのと、解像度が限定されてしまうのが難点。用途によって使い分けることにしている。
Creating docker2_app_run ... done Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first. の原因

#背景
docker-compose にて railsアプリを新規作成しようとしました。

```
docker-compose run app rails new . --force --database=mysql
```

-- force：上書きコピーを指定

--database=mysql：使用データベースにMySQLを指定

#問題

上記コマンド実行後、以下のエラーが発生しました。

```
Creating docker2_app_run ... done
Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.
```

#原因

どうやらrails new で作成したアプリの中で上記コマンドを実行しているためのようです。

#対処策

別のディレクトリ に移動することになります。
ArduinoUno: LCD モジュールを使う

Arduino の LCDモジュールを使う方法です。
Grove-LCD RGB Backlight v4.0 を I2C に繋ぎます。
![IMG_20210719_145920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e974fade-ea2d-1b97-915e-fcca5df8bc1f.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a9cd7337-87ab-a3b1-0dd9-3a2bb812d409.png)

```text:hello/hello.ino
#include "rgb_lcd.h"

rgb_lcd lcd;

void setup() {
	lcd.begin(16,2);
	lcd.setRGB(0, 255, 255);

}

void loop() {
    lcd.setCursor(0,0);
    lcd.print ("Good Morning!  ");
    delay(2000);
    lcd.setCursor(0,0);
    lcd.print ("Good Afternoon!  ");
    delay(2000);
}
```

## ライブラリーのインストール
[Grove_LCD_RGB_Backlight-master.zip](https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight/archive/refs/heads/master.zip) をインストールする必要があります。

>スケッチ -> ライブラリーをインクルード -> .ZIP形式のライブラリーをインクルード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/016c6a51-3fcc-9a60-1f7f-843accdba758.png)
ゾンビプロセスの自動キル方法

# きっかけ
以前にAWS SSMを通じて、別サーバからDBを参照できるようにしていました。

https://qiita.com/sgash708/items/10ffa7578996c87775f7

そしたらバックグラウンド(nohup)実行のタスクが、ゾンビとして大量に生産され大変なことになっていました... :zap: 

```bash:こんな感じ
[hoge@hogehost ~]$ ps -ef | grep defunct
root       338   334  0  6月30 ?      00:00:00 [sh] <defunct>
root      3127  3126  0  6月30 ?      00:00:00 [sh] <defunct>
root      5791  5789  0  6月30 ?      00:00:00 [sh] <defunct>
root      8468  8466  0  6月30 ?      00:00:00 [sh] <defunct>
root     11150 11146  0  6月30 ?      00:00:00 [sh] <defunct>
# 以下略 #
```

## defunctとは？
ゾンビプロセス確認には、<code>ps -ef | grep defunct</code>で検索したけど<code>defunct</code>ってなんぞやと思いました。

https://askubuntu.com/questions/201303/what-is-a-defunct-process-and-why-doesnt-it-get-killed

上記から、

* プロセスのタスク完了/破損/キルのいずれかの状態
 * だけど、子プロセスとして実行されている
 * もしくは、親プロセスは、該当する子プロセスを監視している

ということを示していることがわかりました。
また、プロセスIDの削除についても親と子の両方のプロセスを殺す必要がわかりました。

```bash
kill -9 PID1 PID2
```

# やったこと
* ゾンビプロセスの自動キル
 * 一応30分ごとに張るセッションを切らないように、1時間経過したゾンビだけを削除
 * 月から金まで、6時間ごとに一括削除


```sh:cron
* */6 * * 1-5 ./kill_zombie_process.sh;
```

```sh:zombie_process_kill.sh

#/bin/bash

# REF: https://ex1.m-yabe.com/archives/3490
PName=defunct
PID=$$

for i in `ps -ef | grep $PName | grep -v $PID | grep -v grep | awk '{print $2,$3}'`
do
	TIME=`ps -o lstart --noheader -p $i`

	if [ -n "$TIME" ]; then
		StartupTime=`date +%s -d "$TIME"`
		CurrentTime=`date +%s`
		ElapsedTime=`expr $CurrentTime - $StartupTime`
	else
		ElapsedTime=1
	fi

	# 1時間以上経過したゾンビプロセスは削除する
	if [ $ElapsedTime -gt 3600 ] ; then
		kill -9 $i
	fi	
done
```

# 参考

https://kaoru2012.blogspot.com/2019/08/blog-post.html

https://ex1.m-yabe.com/archives/3490
VSCodeで競プロ環境構築(gccインストール)(mac)[2021/03/27]


## 最初に
Qiitaのこちらの記事を参考にして、gccのインストールをしようとしたのですがgccのバージョンが変わっていて、手こずったのでまとめておこうと思う。
https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6
　

## はじめに
上記の記事に従って、VScodeの拡張機能のインストールやhomebrewのインストールなど、「gccのインストール、pathの設定」以外は済ませておく。

##gccのインストール
```sh
% brew install gcc
```
 インストール後、/usr/local/下に、g++-10がある。10という数字はバージョンごとに違うので、人により異なります。現在の最新バージョンは10です。

(ちなみに、/usr/local/にいくにはfinderを開いて、メニューバーの「移動」から「フォルダへ移動」を選択して「/usr/local/」を入力。隠しフォルダなので普通には見れません。)

## pathの設定
インストールが終わると、mac上に2種のコンパイラ(clang, gcc)が同居している状態になる。  

```sh
/usr/bin/g++            #clang
/usr/local/bin/g++-10   #gccの実体
```
この状態でg++コマンドを打つと、`/usr/bin/g++`(clang) の方が呼び出される。

```sh
% which g++
/usr/bin/g++
```

pathを通すため、以下のシェルスクリプトを実行。

```sh
% ln -s /usr/local/bin/g++-10 /usr/local/bin/g++
```

このようにすることで、g++コマンドで`/usr/local/bin/g++`が呼び出されるようになった。  
 
```sh
% which g++
/usr/local/bin/g++
```
LaravelでDBのread/write接続設定

# 背景

Laravelでどうやってマスター（書き込み用）, スレーブ（読み込み用）のDB接続設定をするのか調査したのでメモ

# 参考資料

* https://laravel.com/docs/8.x/database#read-and-write-connections

# 設定方法

基本的に `config/database.php` に `read` と `write` のDBホスト名を記述するだけで、共通部分（ID/PWなど）の設定は `mysql` 直下の設定が使われる。
複数ホスト名が書かれている場合はランダムに使われるとのこと。

```
'mysql' => [
    'read' => [
        'host' => [
            '192.168.1.1',
            '196.168.1.2',
        ],
    ],
    'write' => [
        'host' => [
            '196.168.1.3',
        ],
    ],
    'sticky' => true,
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
],
```

## `sticky` 設定について

有効にすると、書き込みクエリが１度でも発生すると同じリクエスト内では読み込みクエリでも書き込み用DB接続が使われるようになる、おそらくこれは「書き込み直後に読み込み処理で、データ同期がスレーブに反映される前に読み込みしてしまう」という問題を解決するためのもので、基本的に `true` に設定しておくべきものと認識しておくのが良さそう。
Raspberry Pi 2BでTP-Link TL-WN725Nが動かないときの対処法(2020/11/12)

## 最初に

https://qiita.com/mmorita44/items/2f1b9798bce301aea985  

こちらの記事を参考にして、ドライバーをインストールしようとしたが、そのディレクトリが変更されていてできなかったので、この記事に対する2020/11/12現在の補足的なものを書きたいと思います。

自動インストーラのやり方は結局ディレクトリの場所がわからず、断念。

## やること
以下、ターミナル上でネットからファイルを落とし、インストールする方法です。（もちろん、有線でつないだ状態じゃないとできないので注意）まず、ラズビアンのバージョンを確認。

```sh
$ uname -a
```
自分の場合、5.4.51-v7-1333でした。次に、下のコマンドを入力して、インストールができると思います。１行目のディレクトリが上記の記事とは変更されていました。

```sh
$ wget http://downloads.fars-robotics.net/wifi-drivers/8188eu-drivers/8188eu-5.4.51-v7-1333.tar.gz
$ tar xzf 8188eu-4.4.8-v7-881.tar.gz
$ ./install.sh
```

あとは、再起動して、少し待つと右上にSSIDを入力できるようになるので、入力して無事使えるようになります。
Unityで指定時間後に所定の方向に1回だけ力を加える

### Unityで指定のオブジェクトに、所定の方向に一定時間後に1度だけ力を加える

課題をする中で、演出の都合上一定時間後に特定の方向に動かしたい時に使用できそうなスクリプトです。空のオブジェクトにアサインして利用してください。


```ForceImpulse.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ForceImpulse : MonoBehaviour
{

    [Header("力を加えたいGameObjectをHierarchyから↓に入れる")]
    //InspectorでGameObjectを設定できるようにして、forcedObject変数に入れるよ
    public GameObject forcedObject;

    [Header("X方向の力を設定")]
    //一回だけ動かすときのX軸の強さ（以下Y,Zも同じ）
    public float xForce = 0f;
    [Header("Y方向の力を設定")]
    public float yForce = 0f;
    [Header("Z方向の力を設定")]
    public float zForce = 0f;
    [Header("スタートから何秒後に力を加えるかを設定（秒）")]
    public float delayTime = 1f;

    //Rigidbody型の変数を宣言
    Rigidbody myRb;


    //再生ボタンを押したときに1回だけ実行するよ
    void Start()
    {
        //forcedObject変数に入っているやつ（GameObject）のRigidBodyコンポーネントを取り出して、myRbに入れるよ
        myRb = forcedObject.GetComponent<Rigidbody>();
        //時間差で関数”ikkai_ugokasu”を実行します。
        Invoke("ikkai_ugokasu", delayTime);
    }

    // 今期Update関数は使いません
    void Update()
    {
        
    }

    //関数名ikkai_ugokasuで、この関数を実行すると物が動くよ
    void ikkai_ugokasu()
    {
        //myRbに1回だけ（ForceMode.Impulse）力を加えるけど、その力はxForce,yForce,zForceね
        myRb.AddForce(xForce, yForce, zForce, ForceMode.Impulse);

    }

}
```

#### 使い方

1. GameObject＞Create Empty　で空のオブジェクトを作成する
1. その名前をscriptとかにする（名前はなんでもいい）
1. scriptオブジェクトのInspectorに、ForceImpulse.csを貼り付ける
1. RigidBodyのついた球などを作成し、scriptオブジェクトのInspectorのForced Objectの球を入れる
1. 移動させたい方向、開始後のディレイタイムを設定する
1. ゲームを再生します

以上です。

![addForce.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221026/98f04080-704a-abe1-b0cb-a010d7cab94a.jpeg)

#### 参考にしたページ（追加中）
PHP文法(1)

## はじめに
個人的に学びになったことを書きます。
if文、for文など基本的な文法ではなく、メソッドの使い方などがメインになってくると思います。

## 宇宙船演算子
```php
<?php
$point = 85;
var_dump($point <=> 85); //結果:0
var_dump($point <=> 70); //結果:1
var_dump($point <=> 99); //結果:-1
?>
```
|  比較結果  |  意味  |
| ---- | ---- |
|  0  |  右辺と左辺が等しい  |
|  1  |  右辺が左辺より小さい  |
| -1  |        右辺が左辺より大きい     |


## 配列の合成
配列の合成をするには+とarray_merge関数の2つの方法がありますが下記の通り動きに違いがあります。


| 合成の方法 | 配列を合成時の挙動　| 連想配列を合成時の挙動 |
|-----------|-------------------|----------------------|
|+記号を使う| 同一キー番号があった場合、前の値を優先| 同一キー名があった場合、前の値を優先|
|array_merge|同一キー番号があった場合、番号を変えて末尾に追加| 同一キー名があった場合、後の値で上書き|
|array_merge_recursive | 同一キー番号があった場合、番号を変えて末尾に追加 | 同一キー名があった場合、配列としてマージされる|

```php
<?php
//配列の合成
$arr1 = ['ライオン','ゾウ'];
$arr2 = ['ペンギン','猫','カバ'];
$merge1 = $arr1 + $arr2; // ライオン,ゾウ,カバ
$merge2 = $arr2 + $arr1; //ペンギン.猫,カバ
$merge3 = array_merge($arr1,$arr2); //ライオン,ゾウ,ペンギン,猫,カバ
$merge4 = array_merge($arr2,$arr1);//ペンギン,猫,カバ,ライオン,ゾウ
print_r($merge1);
print_r($merge2);
print_r($merge3);
print_r($merge4);
?>
```


```php
<?php
//連想配列の合成
$arr3 = [
    'name' => '本田',
    'hobby' =>'サッカー'
    ];
$arr4 = [
    'name' => '大谷',
    'hobby'=>'野球',
    'age'=>27
    ];

$merge5 = $arr3 + $arr4; // 本田,サッカー,27
$merge6 = $arr4 + $arr3; //大谷,野球,27
$merge7 = array_merge($arr3,$arr4); //大谷,野球,27
$merge8 = array_merge($arr4,$arr3); //本田,サッカー,27
print_r($merge5);
print_r($merge6);
print_r($merge7);
print_r($merge8);
?>
```

最後にarray_merge_recursive

```php
<?php

$arr5 = [
        'name' => '香川',
        'hobby' => 'サッカー'
    ];
$arr6 = [
    'name' => 'イチロー',
    'hobby' => '野球',
    'age' =>47 
    ];
$merge9 = array_merge_recursive($arr5,$arr6);
$merge10 = array_merge_recursive($arr6,$arr5);
print_r($merge9);
print_r($merge10);
```

こちらの結果は以下のようになります。

```
// merge9の結果
Array
(
    [name] => Array
        (
            [0] => 香川
            [1] => イチロー
        )

    [hobby] => Array
        (
            [0] => サッカー
            [1] => 野球
        )

    [age] => 47
)
// merge10の結果
Array
(
    [name] => Array
        (
            [0] => イチロー
            [1] => 香川
        )

    [hobby] => Array
        (
            [0] => 野球
            [1] => サッカー
        )

    [age] => 47
)
```
BigSurのArduino IDEでESP32に書き込めないときの対処方法

## 最初に
先日、bigsurがリリースされ、今までの人生で古いバージョンのOSしか使ってこなかった僕にとって、人生初のメジャーアップグレードでした。もう胸が高まっちゃってOSの不具合なんて検索する頭すらありませんでした。案の定、esp32をarduinoで使うときに書き込めなくなったし、めちゃくちゃ時間かかったのでじぶんのやったことをメモしときます。

## 対処法１
いま、この問題に対しての対処方法は、僕の調べた限りでは２つあって１つ目は、下のリンクのaungthawdarさんの投稿。僕はこれでうまくいきませんでした。
https://github.com/espressif/arduino-esp32/issues/4408#issuecomment-726271514

## 対処法２
２つ目は、この記事。これでうまくいきました。この方はM5stackだったのでESP32に向けた記事を書きたいと思います。ただ、ディレクトリが違うだけなのでほぼそのままです。
https://ttrsato.blogspot.com/2020/11/macos-big-sur-arduino-ide-m5stack.html

まず以下のコマンドをターミナルで実行。

```sh  
% brew install --build-from-source python  
% /usr/local/bin/pip3 install pyserial  
```  

次に、
https://github.com/espressif/esptool
のcodeボタンを押して、zipダウンロードして、解凍しておく。

~/Library/Arduino15/packages/esp32/tools/esptool_py/2.6.1/をひらいて、（ライブラリフォルダはoptionキーを押しながら、ファインダーの’移動’をクリックすると表示されます。）esptoolをesptool.oldに書き換ます。

先ほどダウンロードしたesptool.py（ダウンロードファイルのルートディレクトリにあります）を同じにディレクトリに保存します。そして、esptool.pyをesptoolに書き換えます。

ターミナル上で以下のコマンドを入力して、(XXXには自分のユーザー名が入ります)

```sh
% chmod +x　Users/XXX/Library/Arduino15/packages/esp32/tools/esptool_py/2.6.1/esptool
```  
~/Library/Arduino15/packages/esp32/tools/esptool_py/2.6.1/esptoolをエディタで開いて、１行目の#!/usr/bin/env python を#!/usr/local/bin/python3に変更します。

これで、動くはずです。やってることは下の記事のEliahg さんの A better fix ... の投稿、そのままです。
https://github.com/pyserial/pyserial/issues/509
Macでの快適なRaspberryPi開発環境構築

## 目的
ラズパイは処理速度が早くないので基本的には遠隔操作するのがいいと思います。それに、常時ディスプレイをつなげておくのも嫌だという人が多いと思うので、macの標準機能であるFinderとターミナルを使用して遠隔操作できるようにします。

## やること
ターミナル操作をSSH接続、画面共有をVNC接続、ファイル操作をAFP接続して行いたいと思います。以下、ラズパイ側とMac側でやることを分けて書きたいと思います。IPアドレスは固定しなくてもローカルなら以下のコマンドで実行できます。

### ターミナル操作
* ラズパイ：SSHを許可する
* Mac：ターミナルから  

```sh   
% ssh pi@raspberrypi.local
```
とパスワード入力して接続

### 画面共有
* ラズパイ：下の記事に従って、tight vnc serverのインストール
http://raspi-fanatic.seesaa.net/article/433659881.html

* Mac：ファインダーから Cmd+K を押して`vnc://raspberrypi.local:5901`入力してパスワード入力

### ファイル操作
* ラズパイ：下の記事に従って、netatalkをインストール。最近のnetatalkはインストール後に、アクセスする場所を指定する必要があるらしい。  
https://studio.beatnix.co.jp/diary/apple/mac2raspberry-pi/  
https://raspida.com/rpi-afp  
* Mac：ファインダーから Cmd+K を押して`afp://raspberrypi.local`を入力

## まとめ
macの標準機能でラズパイ開発が超快適になるのに、あんまり知られてない気がするのでまとめてみました。これによって、ラズパイは最初の一回起動して、上の設定を済ませれば基本的にディスプレイに接続しなくて良くなります。
SPIRALのフィールド属性変更（入力必須/重複不可　の変更）

いつもやり方を忘れるのでMEMO

1. DB > 歯車マーク > 設定

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310125/ac8c71a3-8b58-f48f-0829-7b396b45f4a2.png)

2. フィールド > 属性変更（右上のボタン）

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310125/55a956e7-85da-1954-9fda-af78248befe0.png)

3. 変更

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310125/b6909fe6-a1b6-83ce-bede-9ded7916b9a4.png)

    属性変更時に「未入力データの状態で入力必須にする」などのデータ不整合が起きる場合は、エラーが表示されて変更できない。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310125/509fc15b-66ee-132e-e0f1-f6ef65c5a4dc.png)
LaTeX for Mac 左寄せ・センタリング・右寄せ

## 文字の左寄せ・センタリング・右寄せ

```
\leftline{左寄せ}
\centerline{センタリング}	
\rightline{右寄せ}
```
## 図のセンタリング

```
\begin{figure}[オプション]
  \centering
　・・・
\end{figure}
```
使い方動画作ったけど、全然見られなかったので、制作の流れを紹介する

## はじめに
最近、
・Integromatの使い方をレクチャーしてほしい
・Zoomのレコーディングデータを自動的にGoogle Driveに保存して、Slackで通知したい（約$50/月 節約できるらしい）
といった声が上がっていたことと
Zapierに比べて、Integromatの日本語コンテンツがすごく少ないと感じていたので、
はじめてIntegromatを利用する人がIntegromatの基本的な使い方が学べるようなチュートリアル動画をつくってみようと思い立ちました。


## やったこと
チュートリアル動画を作るにあたって、Integromatのすべての機能を説明していくととんでもない量になってしまうので、Integromatの機能を網羅的に調べて、Integromatの理解に不可欠なものだけ厳選して説明することにしました。

1. マインドマップの作成
まずは、Integromatで理解する必要がある、概念・機能を関連性を含めて網羅的に把握するためにマインドマップを作成しました。
できあがった時の達成感♪( ´▽｀)![qiita記事用.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766839/23f85b53-81f4-0d8e-42f8-99e5fff0e729.gif)
全体図![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766839/2a5205bb-59b7-4d3c-25d4-89332dabb702.png)

1. 公式ヘルプページ、・チュートリアルで理解を深める
各概念・機能をきちんと理解するために、マインドマップに登場した内容に該当する公式のヘルプページを読み漁りました。
めちゃくちゃ大変.....だけど、知らなかったことも学べて良い時間。

1. 必要なものを厳選する
・他の機能との関連性が低く、その機能を説明する際に、他の機能に言及する必要がない機能
・他の機能との関連性が高く、他の機能の説明によく登場し、基礎となる機能
上記の観点から、不要な概念・機能を除外しました。

1. 動画の構成を考える
視聴して欲しい人を具体的にイメージして、3で厳選した内容をスムーズに内容を理解できる順番に入れ替えます。
YouTubeでよく「料金プラン」を最初の方に説明してるけど、ツールの用語を覚えた最後の方が理解しやすいのでは？というのが小さな気づき。


1. 台本づくり
お母さんが見ても理解できるくらい噛み砕いた内容にすることを心がけました。（）
一番大変で時間がかかる(T ^ T)


1. 動画撮影
台本をもとに、動画を撮影していきます。
読み間違いなどがたくさんあり、大体2時間くらいの撮影時間でした（完成動画は36分）。
ホワイトノイズが結構はいっていたので、マイクを利用しない場合に、いかにして雑音を減らすかが、次回以降の改善ポイント。

1. 動画編集
テロップを入れるととんでもない作業量になるので、基本的にはカットと音楽の差し込みのみ。
1.音声が入っていないシーンのカット
2.動画を試聴しながら、不要なシーンのカット（読み間違いなど含む）
3.動画の通しで試聴する。
4.修正すべき部分を修正して、音楽・効果音をつける
5.最後にもう一度内容をチェックする
この順番での動画編集が効率的かどうかはわかりませんが、
この方法だと動画を4周はしなくてはいけないので、かかる時間は、、、(T ^ T)
長編動画で編集が凝っているYouTuberさんをすごくリスペクトするようになりました。



## 完成した動画
Integromatを使いはじめたけど、よく使い方わかんないって人向けに作成しています。

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





https://www.youtube.com/channel/UCo7YM7eQRULHAEvauXrUvsA

## Integromatのチャンネル紹介
動画でも紹介していますが、Integromatのより中・上級者向けの内容は、他の2つのYouTubeチャンネルで紹介されているので、そちらを参考にすると良いと思います。

https://www.youtube.com/channel/UCxMqmerhs4KQAnY7Xn-KMog

https://www.youtube.com/channel/UCfp1Fkoy-b-U7GuH5szelhw
grpc(golang)ぷちメモ

## 背景
1秒間で複数のクライアントから10回以上パケットを送られ、それを全クライアントに打ち返すというような状態を想定した時、ちゃんとパフォーマンスが出るか気になり簡単な検証コードを書いて試したところ、一定時間経過後エラーが発生せず処理が止まってしまう現象に見舞われた

## 検証コード
https://github.com/syanhaiD/envoy-grpc-prac/blob/verify_grpc/cmd/verify/server/main.go
https://github.com/syanhaiD/envoy-grpc-prac/blob/verify_grpc/cmd/verify/client/main.go

## 原因
`internal/transport` 下のコードを追っていくとざっくりつかめるが、
どうにもrecvされてないパケットはstreamにたまっていき、それの許容サイズは`defaultWriteQuota`までであり、
達してしまうとrecvされるなり無理矢理flushするなりで解放しない限り処理がブロックされる

## つまり
クライアント側でrecvせずにひたすらsendするって状態は普通無いと思うので、なんらかの珍しい事故あるいは自分がこの事象を踏んだ時のように簡易に検証しようとしたとかで無ければそうそう起きない話と思われる。
もしやんごとなき理由で何か細工せざるを得ない場合は外部からどうにかする方法は恐らく無いのでgo.modのreplaceとか使ってライブラリに自分で手を入れるしかないかと。
【Google Cloud Day'21】「病院とクラウドで起きる化学反応」を視聴して

病院とクラウドで起きる化学反応
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-da-08
Google Cloud では、一般的なプラットフォームサービスに加え医療分野に特化した多数のサービスを提供しており、病院を変革する先進的な試みを強くサポートしています。慶應義塾大学では、AI ホスピタルプロジェクトの一環で、病院情報システムとクラウドを実際に接続し、何ができるようになり、どのような課題が解決されるのかを確かめました。特に容量が大きい画像データを中心にお話しします。

<table>
	<tr>
		<th>質問</th>
		<th>返答</th>
	</tr>
	<tr>
		<th>データ量がかなり大きいと思うのですが、VPN接続の帯域はどのくらい確保されているでしょうか。</th>
		<td>VPN帯域は研究目的だったので、あまり太くない（1GB/S程度？）だったと思います。新規に発生するデータ量としては1TB/week程度で、現状はそこまで困っていません。</td>
	</tr>
	<tr>
		<th>今回のPoCは、どのような期間でエンジニア数は何人で実現できたものでしょうか。</th>
		<td>エンジニアは1～3名で6か月間、Nobori社にご協力頂きました。</td>
	</tr>
	<tr>
		<th>興味本位の質問で恐縮ですが、お医者様でJava、Pythonを扱えたり、フルスタックエンジニアになろうとしている方はどのくらいいらっしゃるのでしょうか。もしくは、橋本さんのような存在はレアで、俗にいうデータエンジニアの医療分野での採用が強化されている方向性でしょうか。</th>
		<td>残念ながら、フルスタック放射線科医を目指す人はごく少数です。。。Pythonを書ける人は比較的多くいますが、多くは研究目的で使用しています。</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>課題</th>
		<td></td>
	</tr>
	<tr>
		<th>heklth care api</th>
		<td></td>
	</tr>
	<tr>
		<th>BQ、Looker活用例</th>
		<td></td>
	</tr>
	<tr>
		<th>医療業界の課題</th>
		<td>データは増え続ける。でも画像を見て、治療が可能かといったことを判断するため、欠かせないもの</td>
	</tr>
	<tr>
		<th>解決策</th>
		<td>データをクラウドへ移行。そのデータを治療に活かす。</td>
	</tr>
	<tr>
		<th>なぜGCPか</th>
		<td></td>
	</tr>
</table>


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/18d115e3-83b1-1fd6-3cdb-820f31fb4419.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/b4726fc7-d415-53e4-dc47-45195a75a306.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/0e03f7ed-04fc-dec8-7677-465d09451113.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9c9e6641-9ed5-7487-91f0-017fcc183f42.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/96e808e0-4721-a3a7-798d-1f87b49d929a.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/cc0e27d3-a93b-ccb7-5176-ce082dfcaa16.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4f62ad16-291a-8efb-5bc5-a8b5701733d9.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/55510300-c3d7-1802-b932-c2443aaa1eaa.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/01031d78-b3f3-ea6a-bba0-b6b93bf122c1.png)
Couchbase Server Java SDK解説：分散トランザクションの内部メカニズム


## はじめに

本稿は、分散トランザクションの内部メカニズムについて概観を与えることを目的としています。

本記事の関連情報として以下をご参照ください。

[Couchbase Java SDK解説：分散トランザクション〜エラー処理を理解する](https://qiita.com/yoshiyuki_kono/items/d7eb2b9553d858c7cb93)

[Couchbase Java SDK解説：分散トランザクションプログラミング入門](https://qiita.com/yoshiyuki_kono/items/4efb2f1f5a03051e28c5)

### アクティブトランザクションレコード（ATR）

トランザクションとして実行されるアプリケーションロジックを含むラムダブロックは、トランザクションライブラリによって複数回実行される可能性があります。この場合の各実行を、ここでは「試行」と呼びます。

各試行は、ドキュメントのメタデータにエントリーを追加します。このメタデータエントリーは、アクティブ・トランザクション・レコード（ATR）と呼ばれます。エントリーの名前は、「`_txn：atr-`」から、始まります。　ATRは、Couchbase SDKによって、自動的に作成・運用されます。これらのメタデータエントリーは、可視的ですが、外部から変更してはなりません。

このATRエントリーには、その試行がコミットされたかどうかについての情報が格納されます。このエントリーはトランザクションの信頼できる唯一の情報源として機能します。これは、後で見るように、「アトミックコミット」を実現するために別のトランザクションアクターからの読み取り時に利用されます。

### ドキュメント変更（ミューテーション）のステージング

Couchbase SDKでは、トランザクション内でドキュメントを変更しても、実際のドキュメントは直接変更されません。その代わりに、トランザクション後のバージョンのドキュメントの内容がそのドキュメントの拡張属性（XATTR）として保存されます。このような機構は、「ステージング」と呼ばれます。

このような段階的なドキュメントの変更機構は、ドキュメントを変更しようとする他のトランザクションに対するロックとして機能し、書き込みの競合を防ぎます。


### コミット
ラムダが正常に実行されて結果が返された場合にのみ、その試行はコミットされます。これにより、試行エントリーが更新されます。これは、トランザクションアクターがXATTRからドキュメントのトランザクション後バージョンを使用するかどうかに関するシグナルとして使用されます。つまり、ATRエントリの更新は、事実上、トランザクションの「アトミックコミット」スイッチとして機能します。

#### トランザクションアクター
トランザクションアクターは、ATRエントリがコミット済みに変更されるとすぐに、トランザクション後のバージョンのドキュメントの読み取りを開始します。

#### 非トランザクションアクター
このアトミックコミットポイントに達した後、個々のドキュメントの実際の内容が更新されます（これを「アンステージング」と呼びます）。これにより、非トランザクションアクター（標準のKey-Value読み取りとN1QLステートメントを含む）に結果整合性のある結果が提供されます。

### クリーンアップ

失敗したトランザクションが、他のトランザクションを無期限にブロックしないようにするため、Couchbase SDKは、「クリーンアップ」と呼ばれるメカニズムを提供します。

トランザクションは、失敗が発生したときに、まず自分自身でクリーンアップしようとします。

### 非同期クリーンアップ

アプリケーションのクラッシュなどの原因で、そのトランザクション自身によってクリーンアップされなかった、「ロスト」トランザクションが作成される状況があります。

そのためクリーンアップメカニズムには、`Transactions`オブジェクトの作成時に開始される非同期クリーンアップのためのバックグラウンドプロセスが含まれます。このプロセスは、任意のアプリケーションによって作成された、すべてのバケットにおける期限切れのトランザクションをスキャンします。つまり、アプリケーションは、別のアプリケーションによって作成されたトランザクションをクリーンアップする場合があります。

アプリケーションが実行されていない期間、非同期クリーンアップは実行されていないことに注意する必要があります。これは、単体テストの実行に関係してきます。このことが問題となる場合、非同期クリーンアップが常に実行されていることを確実にするために、`Transactions`オブジェクトをオープンするだけの単純なアプリケーションを実行しておくことが考えられます。
【Google Cloud Day'21】「製造業における Google Cloud を活用した全社データ利活用推進の進め方とは？」を視聴して

製造業における Google Cloud を活用した全社データ利活用推進の進め方とは？
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-da-03
ヤマハ発動機では データ分析基盤として Google Cloud を採用し、製造・SCM 領域から営業・マーケ領域に至るまで様々なデータ分析プロジェクトに利用してきました。またデータ分析の民主化という目標を掲げ、現場でより多くのデータ分析が行われる組織に変わっていこうとしています。本セッションでは、弊社の戦略、BigQuery や AutoML の活用事例、Google Cloud 利用アカウントの全社払い出し、現場での活用事例などをご紹介致します。

<table>
	<tr>
		<th>質問</th>
		<th>返答</th>
	</tr>
	<tr>
		<th>Lookerは使っていないのですか？</th>
		<td>分析済み結果の共有が主、レポーティングが主なのでDataPortalを主に使っています</td>
	</tr>
	<tr>
		<th>データ民主化を行われるうえで、データカタログはどのように整理されておりますか？どのように共有されておりますか？</th>
		<td>弊社はデータ分析の基盤として「DAP（DataAnalyticPlatform）」の整備を進めているところです。具体的には製品IoTデータ、製造IoTデータ、顧客データの3つを集約する基盤を構築しています。「ヤマハ発動機経営統合報告書2020」を検索いただくと詳細が記載されていますので、ご興味あれば検索ください</td>
	</tr>
	<tr>
		<th></th>
		<td>ヤマハ発動機様のクラウド活用の取り組みについて、さらに詳細についてこちらでもお話していただいております。よろしければこちらもご視聴ください。https://cloudonair.withgoogle.com/events/inside-manufacturing?talk=20210204-1</td>
	</tr>
	<tr>
		<th>データ分析官研修への参加者が、2019年20人程度から2020年に400人となったり、データ関連プロジェクトが40まで増えたというデータドリブンへの切り替えが素晴らしいです。秘訣はずばりなんでしょうか。</th>
		<td>待ちの姿勢ではなく「社内への発信」に力を入れています。また社外への発信にも力を入れた結果だと思います。また、オンラインの学習コンテンツを整備することで、コロナ禍での学び方を提案しました。</td>
	</tr>
	<tr>
		<th>ターゲット（範囲）を決めて、推進されているように見受けられますが、その範囲の選定はどのようにされましたか？</th>
		<td>ビジネスインパクトを指標に優先順位を定めています。特に弊社は輸送機器メーカーですのでモノづくり、販売の領域をまずは優先的に取り組んでいます</td>
	</tr>
	<tr>
		<th>最近のサブスクリプションビジネスに対する貴社の取り組み、ならびにカスタマーサクセスに対するデータ活用などの取り組みなどございましたら、ご教示いただければ幸いです。</th>
		<td>私の部門での取り組みではありませんが、レンタルバイクなどの取り組みを始めるなどをしています。メーカー自身がこういった取り組みをすることは珍しい事例だと聞いています。また、その効果測定などにデータを使うことも検討しています</td>
	</tr>
</table>


<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>企業概要</th>
		<td></td>
	</tr>
	<tr>
		<th>データ分析グループの目標</th>
		<td></td>
	</tr>
	<tr>
		<th>データ活用事例</th>
		<td></td>
	</tr>
	<tr>
		<th>データの民主化</th>
		<td></td>
	</tr>
	<tr>
		<th>これから進めていきたいこと</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/8be5c094-2bed-d373-1860-4b015edca228.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/6a39c0b9-7cf0-364a-7131-2ec968764865.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/598971aa-3d62-a8b8-aeac-f4b3797be7cf.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/da60be35-800f-4653-0270-65932c94f5d1.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/3fa30d00-105c-1416-1aa1-e18065a5ef63.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/f29a3d2f-27ce-363b-6e9c-e2eb624495ed.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/6b88d6f8-68fb-1ed7-9d8b-ac617b698888.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/b33fa939-81f3-e8a7-7d7f-8930dad7e4e8.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/845ad8f2-6bd7-0905-7eb3-448fab5a8930.png)
プロパティオブザーバー

プロパティオブザーバーとは
---
ストアドプロパティの変更を監視すること。

変更の前後で異なる処理を実装する際に使用される

willSet は、値が保管される直前に呼び出されます。（変更前に呼び出す）
didSet は、新しい値が保管された直後に呼び出されます。（変更後に呼び出す）

書き方
---

```swift
var プロパティ名: 型 = 初期値 {
    willSet (仮引数) {
         //変更直前に呼ばれる処理
　　   print("変更されそうです")
   }
    didSet (仮引数) {
　　　  print（"変更されました"）
         //変更直後に呼ばれる処理
   }
}
```
デフォルトのパラメータ名がoldValue（ｄidSet)とnewValue(willSet)がはいっているので、

プロパティオブザーバーはプロパティに変更があった際に自動で動く処理を実装できる。

Observerパターンに基づいている。
--
Observerとは「観察者」という意味。
オブジェクトの状態が変化した際に、そのオブジェクト自身が、「観察者」に状態の変化を「通知」する仕組み。

Swiftはdidsetとwillsetがあるのでこのデザインパターンが実装しやすい。
Macでnodev経由でnode 16.x がinstallできない。


nodenvでnodeの16系がinstallできなかった。nodenvのplugin pathにはいって、git pullすると更新できるらしい。

```jsx
cd "$(nodenv root)"/plugins/node-build && git pull
```

参考。
[nodenvでinstall出来るnodeのバージョンを確認したら最新が出てこなかった時 - Qiita](https://qiita.com/kzk_FE/items/0baf5cdda00eab36c441)

[Twitter](https://twitter.com/yoshixj)