OmniAICreator/Qiita-1.07M huggingface dataset:
STM32L010とMCP9701で温度をシリアルに出力 (RawSerial)(浮動小数点)


x MCP9701-E/TO 販売コード 103199

x Mbed2のリビジョンは、125
x あまり正確では、ない

目的
秋月で売っている安価なMCP9701(約25円)を使って温度を出力する。

A0は、PA_0の事

putcなのは、容量削減のため


![o_con563.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0e81c424-72f8-254a-62aa-3b9e00ad19ba.jpeg)


![o_con564.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/678cc833-f942-1b4d-3bc8-b1c86b7bbbcf.jpeg)



```c++


//SER_MCP9701_float_010_1

//温度

#include "mbed.h"

//10の割り算 0から9999までは、正しい。
#define DIV10(n) (((n*409)+((n*154)>>8))>>12)

//アナログ入力の設定
AnalogIn adc_vbat(A0);

RawSerial pc(PA_2, PA_3); //010

//メイン関数
int main() {

    int       s;        //ADCの値
    float     v;        //電圧
    float     t;        //温度
    int   t_100;        //温度の100倍
    char data1[]={0,0,0}; //バッファ
    char data2[]={0,0,0}; //バッファ


    //無限ループ
    while(1) {

        //ADCの読み込み 0から4096
        s = (adc_vbat.read_u16()>>4);

        //センサーのADC値を電圧に変換
        v = s * ( 3.3 / 4096.0 );
        
        //センサーの電圧を温度に変換
        t = (v - 0.4) * (1.0 / 0.0195);

        //温度の表示の為の変換
        t_100 = t * 100.0;        
        data2[1]='0'+ (t_100-(DIV10(t_100)*10));  //t%10
        t_100 = DIV10(t_100);
        data2[0]='0'+ (t_100-(DIV10(t_100)*10));  //t%10
        t_100 = DIV10(t_100);
        data1[1]='0'+ (t_100-(DIV10(t_100)*10));  //t%10
        data1[0]='0'+ DIV10(t_100);               //t/10

        //温度の表示
        pc.putc(data1[0]);pc.putc(data1[1]);  //整数
        pc.putc('.');                         //小数点
        pc.putc(data2[0]);pc.putc(data2[1]);  //小数点以下
        pc.putc('\r');pc.putc('\n');          //リターン

        //1秒の待ち
        wait_ms(1000);

    } //while

} //main

//容量削減
void error(const char* format, ...){}




```


https://paiza.io/ja/projects/new?language=c



テストプログラム


```c++


//10の割り算 0から9999までは、正しい。
#define DIV10(n) (((n*409)+((n*154)>>8))>>12)


#include <stdio.h>
int main(void){
    
    for(int s = 497;s<=4096;s++){
        printf("[%d]=",s);
        
        //センサーのADC値を電圧に変換
        float v = s * ( 3.3 / 4096.0 );

        //printf("[%f]",v);
        
        //センサーの電圧を温度に変換
        float t = (v - 0.4) * (1.0 / 0.0195);

        printf("[%f]",t);     
        
        
        int t_100 = t * 100.0;
        
        printf("_[%d]_",t_100);   
        
        char data1[]={0,0,0,0};
        char data2[]={0,0,0,0};
        
        data2[1]='0'+ (t_100-(DIV10(t_100)*10));  //t%10
        t_100 = DIV10(t_100);
        data2[0]='0'+ (t_100-(DIV10(t_100)*10));  //t%10
        t_100 = DIV10(t_100);
        data1[1]='0'+ (t_100-(DIV10(t_100)*10));  //t%10
        data1[0]='0'+ DIV10(t_100);           //t/10
        
        printf(data1);  //整数
        printf(".");    //小数点
        printf(data2);  //小数点以下
        printf("\r\n"); //リターン
        
        //printf("\r\n");
    }//for
    
}



```
【PHP初級㉓】論理演算子3

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)
整数値を入力させ、その値が-5以上10未満であればOK、そうでなければNGと表示するプログラムを作成しなさい。


# コード
```php
$a = intval(fgets(STDIN));
if($a >= -5 && $a < 10){
    echo 'OK';
}else{
    echo 'NG';
}
```


↓「12」と入力


# 結果
```
NG
```
DNSサーバーmyDNS卒業！google Domainsでもできる。

# google DomainsのDNS設定からダイナミックDNSの有効化
google Domainsに移管した人はDNSもgoogleに任せちゃいましょう。
googleDmainsの設定画面からDNSのメニューを開き、一番下のダイナミックDNSの管理をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/889daf11-381d-5d5f-9ac9-3ea0b29af08d.png)
ホスト名の部分はサブドメインの設定なので、ルートドメインのみでいい方は空白のまま保存をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/73de7bae-0903-6107-4ec4-1b119a22cac5.png)
続いてDNSにサーバーのIPを伝えるためのユーザー名とパスワードを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/a16de4ae-7bb1-01b8-658e-6e6c6f25e82c.png)
ここで出てきた情報をメモしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/e8a7cfa1-2b4a-ca8f-4349-1d00abf66029.png)

ここまでがPCでの操作で、サーバー側で下記にアクセスして、googleDNSにアクセスする。
crontabで管理している人はそこを書き換える。
```
https://username:password@domains.google.com/nic/update?hostname=
yourdomain.com
```
usernameとpassswordはさっきgoogle domainsの管理画面で確認したユーザー名とパスワードにおきかえ、hostnameをルートドメインに置き換える。

whois検索、コマンドなどから
namse serverがgoogle管理に代わっていれば移行完了
```
変更前
[Name Server]                   ns0.mydns.jp
[Name Server]                   ns1.mydns.jp
[Name Server]                   ns2.mydns.jp
```
↓
```
変更後
Name Server: NS-CLOUD-A1.GOOGLEDOMAINS.COM
Name Server: NS-CLOUD-A2.GOOGLEDOMAINS.COM
Name Server: NS-CLOUD-A3.GOOGLEDOMAINS.COM
Name Server: NS-CLOUD-A4.GOOGLEDOMAINS.COM
```

MyDNS側での作業はありません。
以上！

https://support.google.com/domains/answer/6147083?hl=ja#zippy=%2Capi-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF-dns-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B
springのRequestBodyにswaggerでexampleを付与

たとえば、下記のようにStringに ```@RequestBody``` を付与してswagger-uiで参照すると入力例があまりユーザフレンドリーでない画面になる。

```java
@RestController
public class SampleRestController {
  @PostMapping("/sample")
  public String sample(@RequestBody String body) {
    ...
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/0ef96b17-27c4-dc6a-fecc-7b3328f662eb.png)

なので、サンプルとなる適当なjsonなどをデフォルトで表示したい。

適当に```build.gradle```を作る。

```gradle
plugins {
  id 'org.springframework.boot' version '2.7.1'
  id 'io.spring.dependency-management' version '1.0.11.RELEASE'
  id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
  compileOnly {
    extendsFrom annotationProcessor
  }
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  compileOnly 'org.projectlombok:lombok'
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  annotationProcessor 'org.projectlombok:lombok'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
  
  implementation 'org.springdoc:springdoc-openapi-ui:1.6.9'
}

tasks.named('test') {
  useJUnitPlatform()
}

```

設定例は下記な感じ。```RequestBody```の名前が被ってるので冗長な記述になるのが難点。

```java
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;

@RestController
public class SampleRestController {

  @PostMapping("/sample")
  public String sample(
      @RequestBody @io.swagger.v3.oas.annotations.parameters.RequestBody(content = @Content(examples = {
          @ExampleObject(name = "sample001", value = "{ \"name\": \"Tanaka\", \"age\": 26 }"),
          @ExampleObject(name = "sample002", value = "{ \"name\": \"Satou\", \"age\": 18 }")
      })) String body) {
    return "asd";
  }
}
```

上記の設定で下記になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/e2df8e54-b9f1-a25c-8805-ef1e3a6040d8.png)
Certbotメモ

# Certbotメモ
https://letsencrypt.org/ja/

https://certbot.eff.org/

## 特定ドメインだけrenewしたい
`certbot renew --cert-name domain1.com --dry-run`
か
`certbot --apache certonly -n -d azumin.jp --dry-run`

cert nameは
`certbot certificates` で見れるもの。
基本情報（フラグメンテーション）

端的にいうと**ファイルがあちこちに分かれて断片化してしまう**ことを**フラグメンテーション**と呼びます。
フラグメンテーションを解消するために行う作業を**デフラグメンテーション**と呼びます。

昔買った、windowsは重すぎて最適化した記憶はありますね。
![スクリーンショット 2022-07-05 20.14.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/592ea2b2-d617-e64c-7e5b-6ea0af6c8cd3.png)

macってデフラグ機能あったかなと思って調べたらSSD（ソリッドステートドライブ）　だから自動的に対処するようにしてくれているようで、現在のPCはほとんどSSDみたいですね。

一番わかりやすいので下記ですね。
https://wa3.i-3-i.info/word13669.html

HDDの場合はバラバラにデータが断片化されてしまっているので、都度デフラグをしないとデータベースのバッファ容量が不足するようです。

## まとめ
無意識にやっていることが多いですね。
【PHP初級㉒】論理演算子2　～AまたはB～

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)
整数値を入力させ、その値が-10以下、または、10以上であればOKと表示するプログラムを作成しなさい。


# コード
```php
$a = intval(fgets(STDIN));
if($a <= -10 || $a >= 10){
    echo 'OK';
}
```

↓「-15」と入力


# 結果
```
OK
```


☆論理演算子
＄a==＄b || ＄c==＄d　→　＄a＝＄bまたは＄c＝＄d
※ || は or でも可
オレ的環境作成キット

# 環境
**2022/07/05**
・CentOS7
・Docker 1.13.1
・Docker-compose 1.18.0
・npm 8.5.5
・cockpit 195.12.

# コマンドs

```
sudo yum -y install cockpit
sudo systemctl start cockpit
sudo systemctl enable cockpit.socket
sudo systemctl start firewalld.service
sudo systemctl enable firewalld.service
firewall-cmd --add-port=9090/tcp --permanent
firewall-cmd --remove-service=ssh --zone=public --permanent
firewall-cmd --reload
sudo yum install -y cockpit-docker
sudo systemctl start docker
sudo systemctl enable docker
sudo yum install -y https://github.com/45Drives/cockpit-navigator/releases/download/v0.5.8/cockpit-navigator-0.5.8-1.el7.noarch.rpm
sudo yum -y install docker-compose
sudo yum -y install npm
cd /home
git clone https://github.com/DogKingFun/public

```

# 終わりに
　CentOS7をインストールしなおすときなどに使用できる環境キットです。
　cockpitとdocker-composeで、node.jsとnginxとmongodbの環境を整えたい人は使ってください。さすがにニッチが過ぎいますかね（笑）
sudo apt updateができないとき

# 開発環境
・Ubuntu18.04

# 問題点
### sudo apt updateをしてもエラーが発生してupdateできない

# 解決方法

### ・公開鍵が認証されていない場合
公開鍵を認証させる必要があります。
```
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <Pub_key>
```

### ・repositoryが最新ではない場合
repositoryを削除する必要があります。
```
add-apt-repository --remove <REPOSITORY>
```

## 参考
https://hibiki-press.tech/dev-env/ubuntu/add-ppa/4640
Docker-compose3でnode.js&express&mongodb&nginxの環境を整える[簡略版]

# はじめに
　Docker初心者でありながらGitHub初心者である人がいろいろと便利にするためにお試ししている最中です。Gitでmasterブランチを作成して、すべてのファイルをぶち込んでpushしてみたら、mainブランチに統合する方法が分からなくて困ってたりするけど、まぁ保存だけを考えたらmasterブランチだけでもいいかと思う所存です。

# 環境
**2022/07/05**
・CentOS7
・Docker 1.13.1
・Docker-compose 1.18.0
・npm 8.5.5

# インストール方法

### Dockerのインストール

 Dockerのインストールはこれをコピペ。

```
sudo yum -y install docker
```

### Docker-composeのインストール

 Docker-composeのインストールはこれをコピペ。

```
sudo yum -y install docker-compose
```

### npmのインストール

　npmのインストールはこれをコピペ。
　これはexpress-generatorをインストールするためのものです。

```
sudo yum -y install npm
```

# GitHubからクローン

```
git clone https://github.com/DogKingFun/public
```

　GitHubの扱いにも慣れてきた感じがします。上手いこと(別に誰でも出来ることだけど)リポジトリを使えてきたので、そのリポジトリからクローンを取ってきます。

# Docker-compose

　Docker-composeをお試しで立ち上げてみましょう。-dのオプションをつければバックグラウンドでコンテナが立ち上がってくれます。

```
docker-compose up
```

　自分のサーバーのIPにhttpで接続しに行けばnode.jsで作られた画面を見ることができます。

# 終わりに
　自分が使いたいがために作ってるので雑雑になってしまいましたが簡略版は以上です。
　もっとGitHubの扱いに慣れれば改定したりすることがあると思います。
　さて、node.jsとmongodbとnginxの環境を簡単に作れるようになったので、SNS作成をやってみようと思います。
【2024年10月版】Ubuntu 20.04 〜 24.04 で日本国内IPからのアクセスのみに絞る、IPフィルタリング【ufw, iptable】

# はじめに

- 日本国内IPからアクセスのみに絞りたい、IPフィルタリングしたい。
- 自分用メモです。
- [世界の国別 IPv4 アドレス割り当てリスト](http://nami.jp/ipv4bycc/) の日本のIPアドレスのみにアクセスを許可したい
- 設定は iptables でやりたい
- 新しい chain を作成して設定する
- 日本のIPアドレスは、RETURN して、そのほかは DROP する
- 元の記事 [パソコン鳥のブログ - [Ubuntu] ファイアウォール ufw で海外からの接続をブロックする](https://pcvogel.sarakura.net/2020/09/09/32067) を見る方がいいです。

:::note info
2024/10/07 `Ubuntu20.04`, `Ubuntu22.04`, `Ubuntu24.04` でも動作することを確認して記事を更新しました。
:::

# 環境

- Ubuntu 20.04
- Ubuntu 22.04
- Ubuntu 24.04

# 設定

## 概要
- 以下のように、新しいチェーンを作成して、日本のIPアドレスは、RETURN して、そのほかは DROP するように設定する。そのためにスクリプトや設定編集を実行する。

```
iptables -F DROP_EXCEPT_JP
iptables -A DROP_EXCEPT_JP -s AAA.AAA.AAA.AAA/16 -j RETURN
iptables -A DROP_EXCEPT_JP -s BBB.BBB.BBB.BBB/24 -j RETURN
      :
      :
iptables -A DROP_EXCEPT_JP -j DROP
```

## 作業
- ```/etc/ufw/before.rules``` を編集して、以下の3行を COMMIT とコメントの前に追加する

```
:DROP_EXCEPT_JP - [0:0]
-A DROP_EXCEPT_JP -j ACCEPT
-A ufw-before-input -j DROP_EXCEPT_JP
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
```

- ```/etc/ufw/after.init``` の start) と stop) を編集する

```
start)
    # typically required
    /etc/ufw/after.init.drop_except_jp
    ;;
stop)
    # typically required
    iptables -F DROP_EXCEPT_JP
    ;;
```

- ```/etc/ufw/after.init``` に実行権限を付加する

```
sudo chmod +x /etc/ufw/after.init
```

- 以下のスクリプトを作成する。場所はどこでも良い。 {self subnet} に自分のサブネットを入れる
- 自分のIPのサブネットは `{self subnet}` に入れる、不必要ならコメントアウト

```
#!/bin/sh
IPTABLES=iptables
#EXCLUDE_PORTS=80,443,25
wget -q -N http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip -q -f -c cidr.txt.gz > cidr.txt
if [ -f cidr.txt ]; then
    echo $IPTABLES -F DROP_EXCEPT_JP
    #echo $IPTABLES -A DROP_EXCEPT_JP -p tcp -m multiport --dport $EXCLUDE_PORTS -m state --state NEW -j RETURN
    # 次の行は必要に応じて
    echo $IPTABLES -A DROP_EXCEPT_JP -s {self subnet} -j RETURN
    sed -n 's/^JP\t//p' cidr.txt | while read address; do
        echo $IPTABLES -A DROP_EXCEPT_JP -s $address -j RETURN
    done
    echo $IPTABLES -A DROP_EXCEPT_JP -j DROP
fi    
```

- スクリプトを実行して日本のIPアドレスを記載したファイルを作成する

```
sudo sh drop_except_jp.sh > after.init.drop_except_jp
sudo cp after.init.drop_except_jp /etc/ufw/after.init.drop_except_jp
sudo chmod +x /etc/ufw/after.init.drop_except_jp
```

- ufw を再起動する

```
sudo ufw reload
sudo systemctl restart ufw
sudo systemctl status ufw
```

# おわりに

  - かんたんでしたね、簡単になるように公開してくださっている記事に感謝

## 参考記事

  - [パソコン鳥のブログ - [Ubuntu] ファイアウォール ufw で海外からの接続をブロックする](https://pcvogel.sarakura.net/2020/09/09/32067)
python list files

```
from os import listdir
from os.path import isfile, join

def main():
    mocapFbxPath = 'J:\\hx\\work\\prod\\mcp\\motiondata\\export'
    onlyfiles = [f for f in listdir(mocapFbxPath) if isfile(join(mocapFbxPath, f))]
    for _file in onlyfiles:
        print(_file)
# cmds.file(new=True, force=True)
#                 cmds.file(fileName, open=True)

if __name__ == '__main__':
    main()
```
Next.jsでTypeScript&Tailwind.cssを導入する環境構築手順

# はじめに

基本的に自分用のメモですが、Next.jsで開発するときにTypeScriptとTailwind.cssを導入する方は参考にしてください


# Next.jsの導入

node.jsはインストールされている前提とします


VSコード上のターミナル上で以下のコマンドを実行
```
npx create-next-app [プロジェクト名]
```
こちらはyarnで実行されるので、yarnをインストールしていない人はインストールしましょう
もしくは、npmでも実行できるので、yarnを使わない場合は--use-npmをオプション引数につけて実行してください
なお、[プロジェクト名]を.にすると現時点のフォルダに直接プロジェクトが作成されます

また、PowerShellのセキュリティに弾かれるエラーが出た場合は以下のコマンドを実行の後再度実行してください
```
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
```


# Babelと静的コード解析ツールの導入


1 Project folder 直下に".babelrc"ファイルを作成して下記設定を追加
.babelrc
```
{
   "presets": ["next/babel"]
}
```

2 prettierの設定

.prettierrcを作成する
```
{
    "singleQuote": true,
    "semi": false
}
```

またVSコードのsettingsで
Require Config 
Format On Save
にチェックを入れてセーブ時にフォーマットされるようにします


# TypeScript導入

TSの導入方法は以下を参考に行います
https://nextjs.org/learn/excel/typescript/create-tsconfig

1
tsconfig.jsonの空ファイルを作成する

2
```
yarn add --dev typescript @types/react @types/node
```

3 開発server起動
```
yarn dev
```
これを行うことで設定ファイルが自動生成されたり、先ほど空ファイルの中身が自動追記されたりする

4 _app.js, index.js の拡張子を tsx に変更

5 AppProps型追記
```
import { AppProps } from 'next/app'

function MyApp({ Component, pageProps }: AppProps) {
    return <Component {...pageProps} />
}

export default MyApp
```

6  ライブラリのインポートで警告が出る場合

以下で警告が消える可能性があるので試す
tsconfig.json
```
"compilerOptions": {
    "moduleResolution":"node",
},
```
https://www.typescriptlang.org/docs/handbook/module-resolution.html#module-resolution-strategies



# Tailwindの導入

CSSはTailwindを使用しようと思うので、公式ドキュメントの手順を参考に導入を行う
https://tailwindcss.com/docs/guides/nextjs

CSS自体はチートシートを参照して開発を進める
https://nerdcave.com/tailwind-cheat-sheet

1 必要moduleのインストール&tailwind.config.js, postcss.config.jsの生成
```
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
```
yarnを使っていればyarn addでもいい


2 tailwind.config.jsのpurge設定追加

```
module.exports = {
  content: [
    "./pages/**/*.{js,ts,jsx,tsx}", // add
    "./components/**/*.{js,ts,jsx,tsx}", // add
  ],
}
```

3. componentsフォルダの作成
プロジェクト直下

4. globals.cssの編集
中身を以下の3行に完全に置き換える
```
@tailwind base;
@tailwind components;
@tailwind utilities;
```

5 プロジェクト時に自動生成されている不要なStyle情報を削除する

プロジェクト作成時に
styles/Home.module.cssが生成されているが、使わない場合は削除する



これで設定は完了です
SeleniumでGoogleアカウントにログインした状態を保持する

# はじめに
GoogleではSeleniumを利用したアカウントへの自動ログインは拒否するよう設定されています。
そのため、SeleniumでGoogleアカウントを利用するようなコードを実行したい場合は、Googleアカウントにログインした状態のブラウザを使う必要があります。
実際に私はSeleniumでGoogleアカウントを利用する自動テストの開発案件で、Googleアカウントにログインした状態のブラウザを使うようにしました。
そこで本記事では、Python + Selenium + Chrome環境でGoogleアカウントにログインした状態のプロファイルを指定してコードを実行する方法を紹介します。

# 事前準備
まずChromeを起動し、手動でGoogleにログインします。
次に、現在使用しているプロファイルを確認するため、URL欄に`chrome://version`と入れます。
「プロフィールパス」から使用中のプロファイルの場所と名前を確認することができます。![コメント 2022-07-05 080528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743442/30fad974-1229-e93c-b0f4-ee943f4e4af8.png)

# コード内容
ChromeDriverのChromeOptionsクラスを利用します。
add_argumentメソッドでオプション項目としてプロファイルを指定します。
なお、`-user-date-dir`ではプロファイルの保存先ディレクトリのパスを、`-profile-directory`では使用するプロファイルの名前を記載します。
```python:サンプルコード
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument("--user-data-dir=プロファイル保存先パス")
options.add_argument("--profile-directory=プロファイル名")
driver = webdriver.Chrome(options=options)

driver.get("https://www.google.com/")
time.sleep(3)
driver.find_element_by_xpath("//*[@id='gb']/div/div[2]/div[2]/div/a").click()
time.sleep(3)

driver.close()
```

# 最後に
最後まで読んでいただきありがとうございます。
この記事が少しでも役に立てば幸いです。

# 参考
https://selenium-world.net/selenium-tips/3519/
【機械学習超入門】回帰の全体像をざっっっくり学ぶ

そもそも回帰とは手元の実測値に対してアルゴリズムを適用させ、実測値を近似できるように当てはめていく作業のことを指します。

すなわち、回帰分析とは手元のデータから有り得そうな未来を考える統計的手法です。
また手元のデータ（要因となるデータ）を「説明変数」といい、求められた結果のデータを「目的変数」といいます。

ここまでは理解できたでしょうか。
今回は言葉の説明だけですのでとりあえずなんとなく理解ができればクリアです！
１％だけでも分かれば後々検索することができるので、超入門としては大満足の進歩です！
それでは続きます。

回帰問題は大きく２つに分けられます。
線形回帰と非線形回帰です。ここで線形とは直線で表現するか否かという理解でOKです。

まず線形回帰で有名なものとしては
　・単回帰分析
　・重回帰分析
　・Ridge回路
　・Lasso回路
があります。

次に非線形回帰で有名なものは
　・決定木
　・ランダムフォレスト
　・ニューラルネットワーク
があります。

これらをアルゴリズムといいます。データサイエンティストはこのようなアルゴリズムを用いてデータ分析を進めているのですね。
cscの作法 その228

# 概要
cscの作法、調べてみた。
ポートスキャンだけで落ちるTCPサービス、やってみた。

# 参考にしたページ

https://qiita.com/tomoki0sanaki/items/fe46fd43c217fee46f0b

# 実行結果

```
>VulnSrv 5300

ハンドルされていない例外: System.IO.IOException: 転送接続からデータを読み取れません: 既存の接続はリモート ホストに強制的に切断されました。。 ---> System.Net.Sockets.SocketException: 既存の接続はリモート ホストに強制的に切断されました。
   場所 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- 内部例外スタック トレースの終わり ---
   場所 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   場所 VulnSrv.Recieve(TcpClient client, Byte[]& recv)
   場所 VulnSrv.Main(String[] args)

```


以上。
階調最大最長値にあわせたごましおノイズ

階長最大値と階長最小値にあわせたごましおノイズを入れてくれる関数をmatlabで作ってみました

```matlab:soft_saltpepper_noise.m

function [nI] = soft_saltpepper_noise(I, q)
%nIにコピー
nI = I;
%画像のサイズを得る
sz = size(nI);
%画像の階長最小値と階長最大値を得る
[minI, index] = min(nI(:));
[maxI, index] = max(nI(:));
%Iと同じサイズの一様乱数を生成
randI = rand(sz);
%minとmaxに対応するsalt&pepperを追加
nI(randI<q/2) = minI;
nI(q/2<=randI & randI<q) = maxI;
figure, imshow(nI)

```




元画像
![lena2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731111/951cc39b-aab9-cd04-a7c2-f1c4480a0795.jpeg)

結果
![noise1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731111/17545a8d-c61c-f2ab-6942-047be31a1ac4.jpeg)

検証はまた後日…
【.NETFramework】エラーハンドリング（Windows Form）

## 説明
Windowsフォームアプリで、例外発生をハンドリングする方法です。
Windowsフォームで例外が発生する場合、`try-catch`で拾う場合が殆どかと思いますが、以下のコードでは、`try-catch`の範囲外の例外を拾うことができます。
ものすごく簡潔に説明すると、`AppDomain.CurrentDomain.FirstChanceException`のイベント処理を設定することで、エラーハンドリングが実現できます。

## ソースコード
```cs
namespace WindowsFormsTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // エラーハンドリングイベント
            AppDomain.CurrentDomain.FirstChanceException  += CurrentDomain_FirstChanceException;

            // エラーの発生場所
            throw new Exception("test");
        }

        // エラーの回収箇所
        private void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e)
        {
            MessageBox.Show(e.Exception.ToString());
        }
    }
}

```

## 実行結果
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/cbf8cb68-ec8f-b246-16cb-415c42ee41e6.png">

通常の`try-catch(Exception e)`でメッセージを出力した場合と同じ様にエラー内容が確認できたかと思います。

## 補足
・`CurrentDomain_FirstChanceException()`でエラーを拾うことはできますが、エラーを拾った後にアプリが落ちるので、エラーが出たときにアプリを落としたくないという場合は、`try-catch`を設定する必要があります。
・`.NET 4.0` で導入されたとのことなので、それ以前のバージョンには有効ではありません。
【Slack】Webhook経由ででユーザーグループにメンションする

## 概要
slack-apiを使ったIncoming Webhook経由で<@group_name>でメンション飛ばす

## やり方
スラックのアプリではなく、メンション飛ばしたい

以下のURLからSlackのWeb版でログインして、

[サインイン](https://slack.com/intl/ja-jp/workspace-signin)

UserGroupの設定画面からIDを取得したいUserGroupを指定すると、以下のようなURLが表示される。
※取得したいユーザーグループをクリックし、編集しようとすると出る。
 "user_groups" というパスのあとにあるのがUserGroupのIDです。
```
https://app.slack.com/client/{Client_ID}/browse-user-groups/user_groups/{UserGroup_ID}
```

取得したUserGroup_IDを下記に入れ込めば、ユーザーグループをメンションすることができる。


```
<!subteam^{UserGroup_ID}>
```

## 参照

https://qiita.com/tamorieeeen/items/de6c34760e2d8550f123
https://www.pospome.work/entry/2021/12/08/024042
PowerAutomateでExcelテーブルの行を一括削除する

PowerAutomateのワークフローでExcelファイルのテーブルを更新することはしばしばあると思います。
そして時として多数の行を一括削除したいときがあると思います（私はあります）。

:::note info
2023/02/03にもう1つの方法を紹介する記事を投稿しました。こちらも参考にしていただければ幸いです。
→ [PowerAutomateでExcelテーブルの行を一括削除する - Range.delete()編](https://qiita.com/mizukyf/items/fa64669a895c110c8b1d)
:::

# Problem

PowerAutomateの標準アクションには、1行ずつ削除するものはありますが、多数をまとめてというものはありません。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/0f7dd4e9-b4d4-2ca9-a08b-c6000db257c5.png)

この「行の削除」を使う場合、おそらく「Apply to each」アクションと併用することになるでしょう。
しかしご存知の通りこのアクションはとても遅い。
所要時間の観点で許容できない場合は他の選択肢を探す必要があります。

# Solution

以前別の記事でお話したとおりこのようなちょっと難しいタスクをこなすならばOffice Scriptsです。

次のようなスクリプトを作成してExcelファイルに追加します：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/ad7868c7-221f-6cee-ee7e-601d551421e1.png)

```ts:
function main(workbook: ExcelScript.Workbook, tableName: string) {
  const table = workbook.getTable(tableName);
  const skip = 1;
  const chunk = 10000;

  while (table.getRowCount() > skip) {
    const n = Math.min(table.getRowCount() - skip, chunk);
    table.deleteRowsAt(skip, n);
  }
}
```

今回例に使用したスクリプトの役割が「1行目以外はすべて削除する」なので `skip` 定数を宣言してロジック内で参照しています。
もう1つ `chunk` という定数もありますが、こちらは後述します。

あとはこのスクリプトをPowerAutomateのワークフローから呼び出すだけです：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/aecae2ca-1253-7fe9-5b20-48335e9a6ff9.png)

## 注意点1：それでも数十秒はかかる

「Apply to each」よりはマシだと思いますが、結構な時間待機が発生します。
これはもう仕方ないかなと。

## 注意点2：対象件数が増えるとdeleteRowsAt関数がタイムアウトする

削除対象となる行の数が増えてくると、`deleteRowsAt` 関数レベルでタイムアウトが発生します：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/5b402f15-799a-3a5c-a111-1f205dc924fe.png)

どうやらこの関数は内部的にExcelファイルを操作するWebAPIに要求をしているようで、そのWebAPI側なのか待機する関数側なのか、どこかでタイムアウトになるようです。

[公式リファレンス](https://docs.microsoft.com/ja-jp/javascript/api/office-scripts/excelscript/excelscript.table?view=office-scripts#excelscript-excelscript-table-deleterowsat-member(1))を見ると、「注: 同時に 1,000 行を超える行を削除すると、Power Automateタイムアウトになる可能性があります。」とあります。

が、実際には400件くらいでもエラーになるときはなります。
逆に1,000件以上でもエラーにならないこともあります。
400件でエラーになるテーブルは、何度スクリプトを実行しても必ずエラーになるので、おそらくテーブルの横幅なども関係しているのだと推測していますが、何にしても明確な基準はありません。
注意点3で述べるもう1つのタイムアウトとも無関係です。

先程例示したスクリプトに `chunk` 定数が宣言されているのは、この「経験知」をロジックに反映させるためのものです。。

## 注意点3：さらに対象件数が増えると（おそらく）スクリプト全体がタイムアウトする

[公式リファレンス](https://docs.microsoft.com/ja-jp/office/dev/scripts/testing/platform-limits)によると、「実行時間の長いスクリプトがある場合は、同期的 Power Automate 操作における 120 秒のタイムアウトに注意してください。 スクリプトを最適化するか、Excel の自動化を複数のスクリプトに分割する必要があります。」とのこと。

注意点2の問題を乗り越えたあとは、スクリプト全体の所要時間が問題になります。
繰り返しになりますが、deleteRowsAt関数のタイムアウトとこのスクリプト全体のタイムアウトは別物です。
スクリプト全体が33秒で終わる場合でも、deleteRowsAt関数はタイムアウトするリスクがあります。
Salesforceで数式項目を作成しよう～項目がどれくらい入力されているか確認する数式項目の作成

Salesforceの運用でよくあるのが
・どのレコードでどれくらい項目が入力されているか確認したい

ということではないでしょうか

今回は数式項目（チェックボックス型）を作成し

・特定のテキスト項目４項目のうち、３項目に記載があればチェックをつける


という数式項目を作成しましょう

前提：
API参照名　test1__cというテキスト項目
API参照名　test2__cというテキスト項目
API参照名　test3__cというテキスト項目
API参照名　test4__cというテキスト項目

上記４つのカスタム項目があります


数式項目（チェックボックス）の数式は下記となります

データ型	数式	 	 
IF(NOT(ISBLANK(test1__c)),1,0) +
IF(NOT(ISBLANK(test2__c)),1,0) +
IF(NOT(ISBLANK(test3__c)),1,0) +
IF(NOT(ISBLANK(test4__c)),1,0)>= 3

![　数式項目１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/75f18d6b-ca6c-726f-f1d4-adacbd49b4bc.png)


上記数式を作成すると下記画像のように項目が空欄か否かによりチェックがついたりつかなかったりします
![設定２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2a3de04a-19e3-d028-6c60-e250e0606c65.png)
dockerでmysql8を使う

前に書いた「[dockerでmysqlを使う](https://qiita.com/astrsk_hori/items/e3d6c237d68be1a6f548)」から随分時間が経ち新しいmysqlを使いたかったので「dcoker-compose」で作成した。

https://github.com/astrsk-hori/mysql8

```docker-compose.yml
version: "3"
services:
  db:
    platform: linux/x86_64
    image: mysql:8.0.19
    ports:
      - 13306:3306
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./dockerfiles/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    container_name: my-db
    environment:
      - MYSQL_DATABASE=hoge
      - MYSQL_USER=hoge
      - MYSQL_PASSWORD=pass
      - MYSQL_ROOT_PASSWORD=pass
      - TZ="Asia/Tokyo"
volumes:
  db-store:
```

READMEにも書いてありますが、 `git clone` して `docker-compose up -d --build` で起動します。

docker-composeのバージョンも随分上がってて書き方わからなかった。

https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/compose-file-v3/#volumes
cloudwatch_agentのインストールと設定

カスタムメトリクスを取得するために使用していたCloudWatchモニタリングスクリプトがいつの間にか非推奨になっていたため、CloudWatchエージェントを使用する。

- プラットフォームバージョン：Ruby 3.0 AL2 バージョン 3.4.6
  - 拡張プラットフォームはプラットフォームフックを用いる
  - 取得するメトリクスはメモリ使用量とEBS使用量
- CloudWatchエージェントが、インスタンスのデータを送信するために必要なPolicy
　　- CloudWatchAgentServerPolicy

```bash
.platform
├── assets
│   └── cloudwatch-agent.json
└── hooks
    ├── postdeploy
    ├── prebuild
    └── predeploy
        └── 01_cloudwatch_agent.sh
```

```cloudwatch-agent.json
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "root"
    },
    "metrics": {
        "append_dimensions": {
             "InstanceId": "${aws:InstanceId}",
	     "AutoScalingGroupName": "${aws:AutoScalingGroupName}"
        },
	"aggregation_dimensions": [["AutoScalingGroupName"]],
        "metrics_collected": {
            "disk": {
                "measurement": [
                    "used_percent"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "/"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}
```

```01_cloudwatch_agent.sh
#!/bin/bash
set -eu

cp -f .platform/assets/cloudwatch-agent.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
```

- 注意点

エージェント設定ファイルをデプロイすると下記のように書き換えが発生します。また、<b>-a fetch-config</b>の実行によりファイル名の先頭に<b>file_</b>が付与されます。
```bash
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
↓
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_amazon-cloudwatch-agent.json
```

そして、サーバ内でagentを停止し起動させる場合、/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/<b>file_</b>amazon-cloudwatch-agent.jsonを引数として指定しないと当然エラーとなります。
```bash
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
↓
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file://opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_amazon-cloudwatch-agent.json
```

さらに、サーバ内でagentを停止し起動させると<b>-a fetch-config</b>の実行によりファイル名の先頭に再度<b>file_</b>が付与されます。/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/<b>file_file_</b>amazon-cloudwatch-agent.json

なお、<b>-a fetch-config -c</b>で指定可能なファイル名の最大長は251バイトであり、それを超過するとCloudWatchエージェントの起動は失敗します。
例：２５３バイト
file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_file_amazon-cloudwatch-agent.json

- 冪等性について
<b>-a fetch-config -c</b>オプションを付与して amazon-cloudwatch-agent-ctlコマンドを実行すると、amazon-cloudwatch-agent.d配下に置かれた設定ファイルは削除されます。そのため、<b>file_amazon-cloudwatch-agent.json</b>がある状態でも動作に問題は発生しません。
Rのenrichplotのcnetplotで表示するパスウェイを指定したいとき

## はじめに

[R](https://cran.r-project.org/)の生命科学情報のパッケージを集めた[Bioconductor](https://bioconductor.org/)に[enrichplot](https://github.com/YuLab-SMU/enrichplot)というライブラリがあります。

https://github.com/YuLab-SMU/enrichplot

enrichplotを使うことでエンリッチメント解析の結果をグラフに表示することができます。
作者は、中国広州市の南方医科大学の余光创（Guangchuang Yu）さんで、近年[clusterProfiler](https://github.com/YuLab-SMU/clusterProfiler)などの有名なRのパッケージを多数作成されています。

https://yulab-smu.top/biomedical-knowledge-mining-book/enrichplot.html

上のチュートリアルで説明されているように、`cnetplot`関数を呼ぶことで、下記のようなパスウェイと遺伝子を含むグラフを作成することができますが、

```R
library(enrichplot)
library(DOSE)
data(geneList)

de <- names(geneList)[abs(geneList) > 2]
edo <- enrichDGN(de)
edox <- setReadable(edo, 'org.Hs.eg.db', 'ENTREZID')

p1 <- cnetplot(edox, foldChange=geneList)
## categorySize can be scaled by 'pvalue' or 'geneNum'
p2 <- cnetplot(edox, categorySize="pvalue", foldChange=geneList)
p3 <- cnetplot(edox, foldChange=geneList, circular = TRUE, colorEdge = TRUE) 
cowplot::plot_grid(p1, p2, p3, ncol=3, labels=LETTERS[1:3], rel_widths=c(.8, .8, 1.2))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/baedcc0b-763b-dbd0-2cb0-ba0eaef1e4e1.png)

図がビジーになってしまいがちなので、自分の興味があるパスウェイに絞り込みたい場合があります。

### showCategory は文字列ベクトルも引数にとれる

ソースコードを見ると、ドキュメント化されていない `showCategory` 引数があり、これらは通常、`5` などのアトミックベクトルを引数に取りますが、文字列ベクトルなども引数に取ることができることがわかります。([utility.R](https://github.com/YuLab-SMU/enrichplot/blob/master/R/utilities.R)の`extract_geneSets`, `update_n` 関数参照）

そこで、`showCategory = c("Basal-Like Breast Carcinoma","Inflammatory Breast Carcinoma")` などとパスウェイのDescriptionを指定して

```R
library(enrichplot)
library(DOSE)
data(geneList)
de <- names(geneList)[abs(geneList) > 2]

edo <- enrichDGN(de)
edox <- setReadable(edo, 'org.Hs.eg.db', 'ENTREZID')

p1 <- cnetplot(edox, showCategory = c("Basal-Like Breast Carcinoma","Inflammatory Breast Carcinoma"),
               foldChange=geneList)
## categorySize can be scaled by 'pvalue' or 'geneNum'
p2 <- cnetplot(edox, showCategory = c("Basal-Like Breast Carcinoma","Inflammatory Breast Carcinoma"),
               categorySize="pvalue", foldChange=geneList)
p3 <- cnetplot(edox, showCategory = c("Basal-Like Breast Carcinoma","Inflammatory Breast Carcinoma"),
               foldChange=geneList, circular = TRUE, colorEdge = TRUE) 
cowplot::plot_grid(p1, p2, p3, ncol=3, labels=LETTERS[1:3], rel_widths=c(.8, .8, 1.2))
```

とすれば、下図のように表示するパスウェイを絞り込むことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/af61fd19-bebc-455a-4859-56423089cc1a.png)

指定された２つのパスウェイのみが表示されました。

この記事は以上です。
画像をハッシュ化しRDBMSに記録し、SQLで類似画像を検索する

## 概要

大量の画像の中から類似画像を検索するソリューションを開発するとします。

類似画像を検索したいが、その都度ファイルを読み出したり、メモリに乗せて処理するのは速度やHWコスト面で大変です。
検索を容易にするためにはRDBMSを活用するのが楽です。
そのため今回は画像の形状パターンをハッシュ化して予めDBに登録しておき、検索したい画像のハッシュ値とSQLだけで類似画像を検索できるようにします。
画像の形状パターンをハッシュ化するには Avarage Hash(aHash) や Perceptual Hash(pHash) などの手法があります。

### Avarage Hash

画像を8x8に縮小してグレースケール化した各点の輝度値の平均値を取り、その平均値と比べ各点大きいか小さいかで2値化して一列にすることで64bit値を取得します。

### Perceptual Hash 

画像を8x8より大きい適当なサイズに縮小して、離散コサイン変換し、低周波成分の8x8を利用して64bit値を取得します。

## 画像のハッシュ化
aHash や pHash は [ImageHash](https://pypi.org/project/ImageHash/) というライブラリを使うと大変楽にできます。
Pythonならpipで入手できます。

```bash
pip install imagehash
```

画像をハッシュ化するには以下のような感じです。

```python
from PIL import Image
import imagehash

# Average hash
ahash = imagehash.avarage_hash(Image.open("画像ファイル"))

# Perceptual hash
phash = imagehash.phash(Image.open("画像ファイル"))
```

これらのハッシュ化は画像を結果的に8x8=64bitのハッシュ値にします。

## DBにハッシュ登録用のカラム作成

画像ファイルを管理するテーブルにハッシュ値用のカラムを追加します。
今回は組み込み関数の都合上XAMPPのMariaDBで説明します。
ハッシュ値は64bitの正の整数にできるので、分かりやすくUnsignedのbigintで定義します。

テーブルにデータを挿入する方法は色々あるので今回は割愛します。

## SQLで検索

ハッシュ値同士の差であるハミング距離はXORで取得できます。
例えば  
```
0xbfdd87c1cddfc0d0 = 0b1011111111011101100001111100000111001101110111111100000011010000
0xbfdf81f1cfdfc1d0 = 0b1011111111011111100000011111000111001111110111111100000111010000
```
という2つのハッシュ値の差は、
```
0b0000000000000010000001100011000000000010000000000000000100000000
```
となります。
この場合1が7つあるので、ハミング距離は7です。
ハミング距離が小さいほど類似しているものになります。

なので類似度の高いものから上位5件取りたい場合は、

```sql
SELECT
  id,
  CHAR_LENGTH(BIN(hash ^ 検索するハッシュ)) - CHAR_LENGTH(REPLACE(BIN(hash ^ 検索するハッシュ), '1', '')) as diff
FROM
  images
ORDER BY diff ASC
LIMIT 5;
```
のようにすることで、取得できます。

## 感想
RDBMSで画像の管理しているならついでにハッシュ値も登録しておくと便利。
VMware上の仮想マシンでマウスが機能しない・反応しない


【状況】

仮想マシンは、バックアップソフトウェアでレプリケートしたものを起動させたかった。

仮想マシンにログインまではできるものの、ログイン後、一切マウスが利かなかった。

VMToolsをインストールする、デスクトップ解像度を変更する、などの対処法があったが、
そもそもそれを行うことすらできない。


【解決策】
仮想マシンにUSBコントローラー(3.1)を追加

　　　⇒動いた！

※仮想マシンを一度シャットダウンし、「設定の編集」からコントローラーを追加します。
Ruby 練習問題３ ~クラスとインスタンスの概念を用いたコードの作成~

こんにちは、プログラミング初学者"fujitacoma"です！

今回は、Ruby練習問題シリーズの3回目です。
前回まではハッシュ問題でしたが、今回はクラスとインスタンスの問題です！

それでは早速始めます！

# 問題
```ruby
class Article

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

end
```
上記のコードに追加を行い、以下の出力結果を得られるようにしてください。
ただし、クラスとインスタンスを使用するものとします。
```
著者: 阿部
タイトル: Rubyの素晴らしさについて
本文: Awesome Ruby!
```
# 解答と解説
### 模範解答
```ruby
class Article

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

  def author
    @author
  end

  def title
    @title
  end

  def content
    @content
  end

end

article = Article.new("阿部", "Rubyの素晴らしさについて", "Awesome Ruby!")
puts "著者: #{article.author}"
puts "タイトル: #{article.title}"
puts "本文: #{article.content}"
```
### 解説
（23行目）Article.newでインスタンスを生成し、変数articleに代入します。
その際に、`阿部`、`Rubyの素晴らしさについて`、`Awesome Ruby!`の3つ実引数を指定します。

（3〜7行目）initializeメソッドを定義して、インスタンス変数を宣言しました。
実引数として指定した値を、仮引数の`author`、`title`、`content`にそれぞれ渡しています。

そうすることにより、initializeメソッドで宣言されたインスタンス変数に、`阿部`、`Rubyの素晴らしさについて`、`Awesome Ruby!`という3つの値が代入されます。

（9〜19行目）上記インスタンス変数の値を返すための専用のメソッドをそれぞれ定義しています。

（24〜26行目）最後に、9〜19行目で定義づけたメソッドを呼び出しています。

# 最後に

いかがでしたでしょうか！

お恥ずかしながら、値を返すメソッドの定義を忘れており、１回で解けませんでした。
なぜ定義する必要があるのか、といったところも含めて覚えきれていないところがありますね。
頑張ります！！！

ここまでお読み頂き、有難うございました！
Jamstackを実際に実装して運用したお話

## 導入
今回、この記事を書こうと思った理由は **「Jamstackで構築されている実際のWebサイトを見つけるのが難しい」** と思ったので、もしJamstackを実装しようと思っている方の力になればいいなと思い、タイトルの通り実体験をもとに紹介していきます。

簡潔にお伝えしたいので、メモだと思って見て頂ければ幸いです。

## Jamstackについて
Jamstackについて何かは下記の記事がわかりやすかったので、ご参照ください。
https://dev.classmethod.jp/articles/jamstack-tutorial/

## 構築で役に立った記事
下記記事のブログ構築をそのまま真似して出来ました。
一部アーキテクチャは変更しましたが、**Jamstackの良いところは色々なAPIを組み合わせることができる**
という点です。
この記事も古くなってきているのでブログ構築編に関してはNuxt3対応していません。
https://blog.cloud-acct.com/

SPA, SSR, SSGの違いについて図解でまとめてみた
https://shimablogs.com/spa-ssr-ssg-difference

## 今回のメイン　実際のサイト
私が構築したJamstackのサイトです。
https://catcream.net/Article
今も現役で活動していて、Gitでソースを公開するか迷いましたがちょっと怖いので非公開ですみません。アーキテクチャはこの後紹介します。
WappalyzerなどをChromeの拡張機能で入れておくと便利です。
・Contentful
・Nuxt
・S3(見切れてますが下にいます)
Jamstackに必要な要素が確認出来ます。
![Monosnap 2022-07-05 16-37-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509309/a7c81074-0a88-3414-5813-35dbf29067c0.png)

## アーキテクチャ
※読み込みに少し時間がかかります。
https://drive.google.com/file/d/1nkCl2maPtIPpjTibbLGbk7Qhfh4SJ9Uz/view?usp=sharing
・静的Generator→Nuxtを選んだ理由：Vueの実装を実務でしているので慣れている
→ReactベースのJSでも沢山記事あるのでお好みで！
・S3を選んだ理由：CloudFrontが魅力的だったからです！
→Netlifyの方が記事は多いです！

## さいごに
正直この記事を見てもJamstackはできません。あくまで参考です。
なせならJamstackには色んなバリエーションが存在していて、組み合わせによって発生する問題が違うからです。
Vercelやこの前StoryblokというヘッドレスCMSを記事で読んだりしたので、目的にあったサービスを見極めるのが大切です。
CHOPのプロットで軸のスケールを固定する

# 問題点
ちょっとしたデバッグにTouchDesignerがすごく便利なのだが、CHOPでのプロットは軸のスケールがリアルタイムに正規化されてしまって見にくい。軸のスケールを固定する方法がちょっとわかりづらかったのでメモ

# 対処
まず、対象のCHOPの右下の'+'もしくは右クリックからViewer Activateを選択し、Viewerモードで表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/1084aeee-daa1-3e1b-5640-c8c97718da0a.png)
その状態で右クリックすると、'Horizontal Adapt'、'Vertiacal Adapt'のチェックボックスが出てくるので、固定したい任意の軸のチェックを外す。(Shift+H, Shift+Vでも可)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/d394ee03-583c-f7ed-2db1-41790f5f2fbc.png)
これで軸のスケールを固定できる。Viewerモードを抜けてもそのまま。
ちなみに、Vertical Rangeでは、軸の最大値、最小値を変更することができる。
任意の値を設定したい場合は、Otherを選択し、Specify Other ... から最大値、最小値を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/ae0e9f70-c5df-b6fc-ef98-9af826f11ad3.png)
KiCad6.0で基板の角を丸くする方法

# はじめに
基板の４角、丸くしたいですよね？
（基板の角が丸いとかわいいので）

# やり方
①適当に四角形を描きます
![スクリーンショット 2022-07-05 153745.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/57f8c13d-8d83-b2d1-43c6-c9043c8d9dc5.jpeg)
②今回は適当にR5の丸みを付けたいので、カドから縦横5mmの線を引きます
(正直これはやってもやらなくても良い)
![スクリーンショット 2022-07-05 153938.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/87d572f5-292e-54aa-1350-1664bdd4328c.jpeg)
③メニューの配置タブ⇒円弧を描くを選択
![スクリーンショット 2022-07-05 154019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/be2b9f51-f95a-dcd6-c643-477dbb4fe37d.jpeg)
④さっき書いたカドから縦横5mm離れた所を中心に、1/4円を描きます
![スクリーンショット 2022-07-05 155851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/a6dbbe2b-c466-4bb1-9345-9e1acbd6437c.jpeg)
⑤他のカドにも同じように円弧を描く
![スクリーンショット 2022-07-05 160016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/dd64d5f9-949c-c54f-cb80-3d69f9b76756.jpeg)
⑥円弧の端っこから端っこに直線を引く。端っこにカーソルを合わせると図の様にカーソルが円形になるので、それに従って線を引く
(めっちゃ図分かりにくい)
![スクリーンショット 2022-07-05 160119.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/302716b8-ebbd-c409-6cff-aa14a2819d6c.jpeg)
⑦最初に描いた四角を削除。端っこが丸い外形が出来た
![スクリーンショット 2022-07-05 161825.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/b4c14822-0d24-f7b0-7cf8-74cba231b46f.jpeg)
⑧この外形が有効かどうか検査⇒デザインルールチェッカーで確かめる
![スクリーンショット 2022-07-05 160630.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/1d3abe91-53f4-6028-08c1-f280d05d88b0.jpeg)
⑨DRCを実行を押してもエラーが出なければOK
![スクリーンショット 2022-07-05 160521.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/d28402ef-66af-e358-faa1-05b7346a6e32.jpeg)
図形が繋がっていなかったり、するとこんな感じでエラーが出る
![スクリーンショット 2022-07-05 160543.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/b7260f4d-e6f0-287f-915f-16f417b79954.jpeg)
⑩3Dビュワーでもちゃんと端っこが丸くなっているのが分かる。
![スクリーンショット 2022-07-05 160714.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/9c5bfb36-e4ee-8a60-038a-5e63ea227949.jpeg)

**おわり**
terraformをgithubとvs codeとgitbashで使いこなす(windows)[terraformインストール編]

# 事前準備
・AWS CLIを使えるようにしておくこと（認証情報も Command line or programmatic accessなどから取得して設定しておく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/d445165e-7518-ccbb-4a52-2c2639bc6e97.png)
・vs code,gitbash はインストールしておく

# 概要
タイトルのツールを使ってterraformをインストールするところからgithubのリポジトリにプッシュするまでの流れを説明していきます

# terraformインストール

①下のリンクでダウンロードサイトからダウンロード
https://www.terraform.io/downloads
適切な方をダウンロード（適切でないとダウンロードに失敗するはずですので最悪どっちもしてみてもいいと思います）

②ダウンロードしたzipを展開しておく

③環境変数設定を利用してパスを通す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/94110a63-5085-1c03-7aff-968198db5232.png)
親ディレクトリも別でパスを通さないと失敗するので気をつけてください
例：
C:\Users\XXX\Downloads\terraform.exe
C:\Users\XXX\Downloads
※ユーザー環境変数に設定してもOKです（どちらでもうまくいきます（安全なのはユーザー環境変数）
gitbashでterraformと入力しておくと使えてるっぽい画面が出るので出たら成功
Qualtricsを学ぶのに役立つリンク集


## この記事について
[エクスペリエンスマネジメント（XM）](https://www.qualtrics.com/jp/lp/xm-video/)のプラットフォームである[クアルトリクス](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A2%E3%83%AB%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9)を学ぶ際に有用なWebサイトやリソースを紹介していきます。
新しいリソースがあればこちらの記事に追加します。

## Eラーニング
[XM ベースキャンプ - オンデマンドトレーニングでクアルトリクスを学ぼう](https://basecamp.qualtrics.com/page/japanese)
日本語の動画で学べます。

[XM Basecamp: Learn Qualtrics with On-demand Training](https://basecamp.qualtrics.com/?utm_lp=nav-text-link)
上記の英語版。

## ドキュメンテーション

[クアルトリクスサポート | クアルトリクス](https://www.qualtrics.com/jp/support/)
日本語のオンラインヘルプです。検索窓がないので下記英語のページをブックマークしておいて検索するのが吉。
また、[こちらの記事](https://qiita.com/zamaezaxm/items/00b04e3132f9eda85a69)でも検索が楽になる方法を紹介しています。

[Qualtrics Support](https://www.qualtrics.com/support/)
英語版のオンラインヘルプ。

[日本語版Qualtricsマニュアル（非公式版）](https://tasukuigarashi.github.io/qualtrics_japanese/index.html)
名古屋大学での利用者向けに作成されたものですが、公開いただいています。

[Qualtrics API Docs](https://api.qualtrics.com/)
Qualtrics APIのドキュメンテーションです。

## ウェビナー 

[15 分でスッキリわかる! サーベイ設問設計の基礎と実践 // クアルトリクス](https://www.qualtrics.com/jp/resources/webinar-survey-question-design/?utm_source=marketo&utm_medium=email&utm_campaign=2021-12--apj-jp--content-download--cx--tof--xmi--roi-of-cx&utm_content=apj-add-content-3)
ソフトウェア的な意味での使い方ではなく、実践的なノウハウを教えてくれる15分セミナー。

[イベント・リソース // クアルトリクス](https://www.qualtrics.com/jp/resources/?type=webinar)
その他ウェビナー、イベントなどはこちらでチェックできます

## Qiita、ブログ記事、ホームページ等
[Qualtrics(ウェブサイトフィードバック)を触ってみた学習成果 - Qiita](https://qiita.com/Atzz/items/3400c0fc2cf4d8559056)
非常に詳しい記事でとても参考になります。

[ブログ | クアルトリクス](https://www.qualtrics.com/jp/blog/)
クアルトリクスの公式日本語ブログです

[心理学研究におけるQualtricsの活用](https://www.slideshare.net/igarashilab/qualtrics-250116931)
名古屋大学 五十嵐 祐先生のプレゼンテーションです。

[福山大学認知心理学研究室](https://y38zaki.weebly.com/)
福山大学 宮崎 由樹 先生の研究室ホームページ。資料のセクションにて学内の学生向けの説明資料と動画を公開されています。


[How to setup and configure ServiceNow and Qualtrics - IT Service Management - Blog - ServiceNow Community](https://community.servicenow.com/community?id=community_blog&sys_id=1480ce42db0f6c1011762183ca96199e)
ServiceNowとQualtricsの連携方法を解説した記事。

## その他
[Qualtrics Status](https://status.qualtrics.com/)
Qualtricsの各サービスの稼働状況を確認できるページです。
C#でもAndroidとかのTimePickerを実装してみた。

# はじめに

Androidとかで使われているアナログの時計盤みたいな
時刻入力コントロールをC#でも実装してみたいと思い立って
またやらかしてみました。

## 製作環境

- Windows 10,11
- Visual Studio 2022(C#)

## 画面イメージ

### 時間入力モード

![hour.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298004/98d85449-7d3d-b044-e127-c1388ccd9fd1.png)

### 分入力モード

![minute.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298004/6a78138f-66b6-1f57-8ad5-28537984d66b.png)

## ソース

GitHubに置いてます。
https://github.com/imoimo2009/TimePicker_cs
Rails開発環境でBootstrapが効かなくなってしまった時にしたこと

Railsの開発環境でassets:precompileは通常不要だが、やってしまったときにBootstrapがブラウザに反映されなくなり、しばらくはまってしまったのでその時にやったことを備忘録で記載します。

<h2>環境</h2>
macOS Big Sur(11.6.6)<br />
rails 6.1.6<br />
Bootstrap 4.5.3

:::note warn
警告
Bootstrapの導入にはWebpackerで入れる場合とassetsに入れる場合とがありますが、前者でやっています。
https://qiita.com/kazutosato/items/d47b7705ee545de4cb1a
:::


<h2>原因</h2>

開発環境でassets:precompileをしたことにより、public/assetsが生成されてしまい、そちらを見に行ってしまうようになり、以降のcssの変更なども反映されない。Bootstrapも読み込んでいない。

<h2>解決</h2>

assets:precompileによってできてしまったファイルを削除する。

念のため、
https://interfirm.hatenablog.com/entry/2014/10/24/131503
を参考に、以下（上から３つ）を実行してからファイル削除を行なった。

<ul>
<li>bundle exec rails assets:clean</li>
<li>tmp/cache/assets内のキャッシュを削除</li>
<li>development.rb内のconfig.assets.debug = falseに変更</li>
<li>public/assetsを削除</li>
<li>stylesheets内の.css, .css.mapを削除</li>
</ul>

順番に見ていきたいと思います。

<h4>bundle exec rails assets:clean</h4>

```.tsx:ターミナル
$ bundle exec rails assets:clean
```

Docker環境であれば、appなりwebのコンテナに入ってからbundle exec rails assets:clean実行します。

```.tsx:ターミナル
$ docker exec -it (appやwebの名前) bash
```

<h4>tmp/cache/assets内のキャッシュを削除</h4>

アプリ直下にtmpフォルダがありますが、そのフォルダ内のassetsごと削除します。

<h4>development.rb内を変更</h4>

```.tsx:config/environments/development.rb
config.assets.debug = true
```
となっていれば、falseに変更。
こちらはBootstrap読み込みが成功すれば元に戻して大丈夫です。

<h4>public/assetsを削除</h4>

assets:precompileで生成されてしまったファイルを削除します。

public内にassetsフォルダがあるとそのフォルダ内を自動的に読みにいってしまうのでassetsごと丸ごと削除します。

<h4>stylesheets内の.css, .css.mapを削除</h4>

また、app/assets/stylesheets内にもともとあった.scssファイルを元に.css、.css.mapが作成されていると思います（たとえば本番環境ではassets:precompileした後には作成されています）。

たとえば私のアプリ内は以下のようになっていました。
```.tsx:app/assets/stylesheets
application.css
evaluations.css
evaluations.css.map
evaluations.scss
home.css
home.css.map
home.scss
users.css
users.css.map
users.scss
```
assets:precompile前は以下でした。
```.tsx:app/assets/stylesheets
application.css
evaluations.scss
home.scss
users.scss
```
なので、余計なファイルを削除して、<b>assets:precompile前の状態</b>にします。

:::note warn
警告
application.cssは削除しないでください。
:::

Dockerであればdocker-compose buildし、docker-compose upしてブラウザを確認し直してください。

これでもBootstrapが反映しない場合、キャッシュの可能性もあるので、ブラウザキャッシュをクリアしてためしてみてください。

※５つの手順を踏みましたが、最初の３つを実行しなくてもBootstrapが反映され、cssの変更がふたたび自動で反映される可能性もあると思います。

<h3>参考サイト</h3>

https://qiita.com/OHKN/items/c3efd4fb91c7bea85e01
https://interfirm.hatenablog.com/entry/2014/10/24/131503
https://qiita.com/gobtktk/items/be7d2e39a41e86545ecf
無事デプロイできた

本日も頑張っていきます。
前回デプロイできなかったことで悩んでいたんですが、無事デプロイできました！
ただ、、、あのエラーを解決したわけではなく、、、最初からやり直しました。。。
なのであれはなんだったのか結局解決できてません。

ただ、前回エラーだと思っていた点がエラーではないことがわかりました。（余計に闇の中）

ちなみに前回は、「warning:」という文言をエラーだと思ってしまったのです、これは文字通り"警告"なのですが、こちらは解決しなくて動くものは動く、ものだそうです。

やはりエラーは「webpack not found」であり、これを解決しないといけなかったようです。

こんな緩い感じでやってます。同士がいたら仲良くしてください。

ではまた次回。
ディスカッションペーパー（架空のプロジェクト役職編）

# ディスカッションペーパー

## 議論する上でのルール
1. HRTの原則
   * 謙虚（Humility）
     * 世界の中心は君ではない。君は全知全能ではないし、絶対に正しいわけでもない。常に自分を改善しよう
   * 尊敬（Respect）
     * 一緒に働く人のことを心から思いやろう。相手を一人の人間として扱い、その能力や功績を高く評価しよう
   * 信頼（Trust）
     * 自分以外の人は有能であり、正しいことをすると信じよう。そうすれば仕事を自分以外の誰かに任せることができる
2. 対立する意見の扱い方
   * 他人の意見が自分の経験や知識と反するものであっても、一旦自分の視座から離れてその有用性を検討する
   * その結果有用ではないと思えるのであれば、それをロジカルに説明する
3. 参加者の発言を考えなしに信じない
   * その意見がどのような根拠に基づいて成り立っているのかを考察する
   * 一番言っちゃいけないのは「世間の常識」や「この会社では」という理由づけ
   * とはいえそこから自由にはなれないのも事実ですが、今話しているのは架空のプロジェクトであることもお忘れなく
4. 意見を否定されても怯まない、凹まない
   * 間違っているかも、恥をかくかもという意識はありますが、それをバカにする人間はもっと愚かです
   * 間違わずに生きていける人間などこの世にはいません
   * 否定されることを恐れて発言しないほうがもっと悪い影響があります
   * さまざまな意見の中にこそ宝石があることを忘れないで
5. 議論の間、年次や上下関係は忘れましょう
   * 議論する仲間に対する礼があれば十分です。普段相手のことをニックネームや苗字、名前などで呼んでいると思いますが、呼びかける時は「○○さん」で通してみてはいかがでしょうか？

# 議題
アプリ、システムの開発事業（プロジェクト）における役割について、下記のものがあるとします。
これらは必ずしも実情を即しているとは限らず、もやっとした架空のものです。
それらにどのような仕事、役割をつけるか、まずは考えましょう。

1. オーナー(所有者)
2. マーケター（市場の理解者）/プランナー（計画者）
3. マネージャ(管理者)
4. リーダー(統率者)
5. アーキテクト(創案者)/デザイナー（設計者）
6. エンジニア（技術者）
7. テスター（試験者）
8. オペレーター(運用者)
9. サポーター（総務/事務/手続）

時間は８分です。これは好きに使ってよいものですが、忘れないでください、平均すると１つの仕事について１分ずつしか考える時間はありません。
考えたことは手元の「紙」に書くといいでしょう。
世間一般で言うところの定義は関係ありません。あなたがプロジェクトの一員として必要だと思う人の像を描きましょう。
なるべく簡素にまとめることをお勧めします。わからなければわからないままで結構です。
次のステップで全員の意見を擦り合わせます。

## 意見の発表
必ず参加者が一巡し発言します、まず聞く姿勢から。この間の発言は一人です。
ホワイトボードもしくはディスプレイ上のマインドマップに意見を書いていくことにしましょう。
（一人１〜２分、最大１０分）

## 話し合い
他の人に聞いてみたいことを聞いてみましょう。
最終的にこれらの役職がどのような振る舞いをして、過不足なくプロジェクトを回せるか想像しましょう。
（１５〜２０分）

## クロージング
議論についての感想を語りましょう。
形式はありません。思ったことを言う時間です。

例えば、下記のようなものなどいかがでしょうか？

* 最初に自分が出した意見からどのような過程を経て修正されたか
* この意見や振る舞いがカッコいい！
* だめだったところ　後からこうすればいいなと思ったところ
* 結論に対する感想

最後には、参加した皆さんにありがとうございましたと言える会にしましょう！

レッツトライ！
Arduino UNOでInput / Output をGUIでコントロールする

## デジタル簡易計測や出力可能な装置を作る

前回のArduinoのADCを6chグラフ表示したものに加えて
Arduinoで使える入出力ポートを簡単に使えるGUIを作ってみました。

以前のArduino UNO ADC表示のPort入出力版となります。
https://qiita.com/Nomisugi/items/fcad01dacfb7d728be44

### 概要
Arduino UNOの入出力ポート(Port 2～9)をGUIコントロールします。
![ArduinoUNO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/9597fd5b-31fa-e364-8944-343d1d486ef3.png)

### 使い方
1  Arduino UNOに Ardipy.inoを書き込む
https://github.com/Nomisugi/Ardipy/blob/master/Ardipy01.ino

2  Ardipy_PortControler.exeをダウンロード
https://github.com/Nomisugi/Ardipy/raw/master/bin/Ardipy_PortControler.exe

3  Ardipy_PortControler.exeを実行
![Port1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/27f554d6-54cd-41dc-5b19-abdee15063e6.png)

4 ConnectボタンでArduino UNOと接続する
![Port2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/013670bc-06d3-5eb0-6c6e-09a6cc428d51.png)

5 Portの入出力変更したり、High/Lowを変更
![Port3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/38be967b-e8b2-96a4-078a-842d9bbdae61.png)

グラフ表示の出力は、PortをOUTにした際には点線になります。
点線のグラフはHigh / LowはGUI上の確認となり、実際の出力の確認ではありません。

前回のAD入力はPythonのままだったので、使えない状況だったと思いますが
今回はPyintallerを使った実行形式なので簡単に使えるアナライザとなりました。
LED点灯やボタン入力のデバッグとして使えると思います。
SpringbootでInsertができない？　ERROR: duplicate key value violates unique constraint


org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "users_pkey"
  Detail: Key (id)=(1) already exists.


DB初期投入時に連番型のIDに手動でデータを入れてしまったことが原因。

❌
```insert.py
SQL='''
INSERT INTO users
(id, "password", username)
VALUES(1, '$2a$10$lzGogDHmrBAGt2vDX93mEee1GmGOPIk4g1TmG5xinWOVuk6GFE4ra', 'admin');
    '''
```

idの生成はPostgresSQLに任せないとおかしくなるので注意。

✅
```insert.py
SQL='''
INSERT INTO users
("password", username)
VALUES('$2a$10$lzGogDHmrBAGt2vDX93mEee1GmGOPIk4g1TmG5xinWOVuk6GFE4ra', 'admin');
    '''
```


ちなみにエンティティの定義は至って普通

```User.java
@Entity
@Table(name = "users",
        uniqueConstraints = {
                @UniqueConstraint(columnNames = "username")
        })
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

```