OmniAICreator/Qiita-1.07M huggingface dataset:
aws-sdk-goでDynamoDBを取り扱うサンプル


## テーブルのセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/74ed0553-eae6-f118-79eb-cc2b853ec6cc.png)


この３つの項目で構成する

- userid number
- priolity number
- description string


## PUT

```go
package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/dynamodb"
)

func main() {
	ddb := dynamodb.New(session.New(), aws.NewConfig().WithRegion("ap-northeast-1"))

	param1 := &dynamodb.PutItemInput{
		TableName: aws.String("testdynamo"),
		Item: map[string]*dynamodb.AttributeValue{
			"userid": {
				N: aws.String("2"), //number
			},
			"priolity": {
				N: aws.String("100"), //number
			},
			"description": {
				S: aws.String("aiueo"), //string
			},
		},
	}

	result, err := ddb.PutItem(param1)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(result)
}
```

## GET

```go
package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/dynamodb"
)

func main() {
	ddb := dynamodb.New(session.New(), aws.NewConfig().WithRegion("ap-northeast-1"))

	input := &dynamodb.GetItemInput{
		TableName: aws.String("testdynamo"),

		Key: map[string]*dynamodb.AttributeValue{
			"userid": {
				N: aws.String("2"),
			},
		},
		AttributesToGet: []*string{
			aws.String("userid"),
			aws.String("description"),
		},
		ConsistentRead: aws.Bool(true),

		ReturnConsumedCapacity: aws.String("NONE"),
	}

	resp, err := ddb.GetItem(input)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(*resp.Item["userid"].N, *resp.Item["description"].S)
}
```

## Query
```go
package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/dynamodb"
)

func main() {
	ddb := dynamodb.New(session.New(), aws.NewConfig().WithRegion("ap-northeast-1"))

	input := &dynamodb.QueryInput{
		TableName: aws.String("testdynamo"),
		ExpressionAttributeNames: map[string]*string{
			"#userid": aws.String("userid"),
		},
		ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
			":userid": {
				N: aws.String("2"),
			},
		},
		KeyConditionExpression: aws.String("#userid = :userid"),
	}

	result, err := ddb.Query(input)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(result)
}
```

## scan

- FilterExpression: でフィルタができる
- 少量のデータ出れば、scanして手元でいじったほうが早そうではある

```go
package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/dynamodb"
)

func main() {
	ddb := dynamodb.New(session.New(), aws.NewConfig().WithRegion("ap-northeast-1"))

	input := &dynamodb.ScanInput{
		TableName: aws.String("testdynamo2"),
		ExpressionAttributeNames: map[string]*string{
			"#userid":   aws.String("userid"),
			"#priolity": aws.String("priolity"),
		},
		ProjectionExpression: aws.String("#userid, #priolity"),
	}

	result, err := ddb.Scan(input)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(result)
}
```
tensorflow keras で 学習にかかった時間を保存する

# やりたいこと

tensorflow keras で各epochにかかった時間を計測して、どこかに(今回はmlflow)へ保存する。

# 方法
Callbackを自作して対応。

# コード

```python
import mlflow
import time
import tensorflow as tf

class SaveElapsedTime(tf.keras.callbacks.Callback):
    def __init__(self):
        self.epoch_start_time = None
        self.train_start_time = None

    def _cal_elapsed_time(self, st):
        return = time.time() - st

    def on_train_begin(self, logs=None):
        self.train_start = time.time()

    def on_train_end(self, logs=None):
        et = self._cal_elapsed_time(self.train_start_time)
        mlflow.log_param('total_train_elapsed_time', et)

    def on_epoch_begin(self, epoch, logs=None):
        self.epoch_start_time = time.time()

    def on_epoch_end(self, epoch, logs=None):
        et = self._cal_elapsed_time(self.epoch_start_time)
        mlflow.log_metric('epoch_elapsed_time', et, step=epoch+1)
        print('{} epoch fin. {:.2f} [sec]'.format(epoch+1, elapsed_time), file=sys.stderr, flush=True)
```
JavaScriptで2の冪を高速に計算する

超高頻度で呼び出される関数の中で2の冪を計算する機会があったので、どのように計算すれば速いか調べてみました。

:::note warn
本記事では、`number`の演算について考えます。`bigint`を使った2の冪については、特に言及する場合以外は扱いません。また、処理系としてはモダンブラウザーを中心に考えています（Node.jsでも適用できるとは思います）。
:::

## JavaScriptの`number`型の構造

[以前の記事でまとめました](https://qiita.com/jkr_2255/items/0495585a315512a9f00b)が、JavaScriptの`number`型はIEEE754の64ビット浮動小数点数です。ただし、JavaScriptにはビット操作用の演算子があり、これはオペランドを32ビット整数として処理を進める形となっています（小数や範囲をはみ出す数は適宜丸められます）。

## 手法の列挙

考えられる手法を、以下に挙げていきます。なお、利用可能な値域が`number`自体の値域のうち一部に限られるものは、その旨明示しています。

### `Math.pow`

JavaScriptの標準関数です。

```javascript
Math.pow(2, n)
```

### べき乗演算子（`**`）

標準関数にあるのに演算子版も登場しましたが、こちらは`bigint`のべき乗にも使えるとのことです。

```javascript
2 ** n
```

### シフト演算子（`<<`）

符号付き32ビットの範囲内で表せる数（$2^0$～$2^{30}$）に限られますが、シフト演算で2の冪を算出することも可能です。

```javascript
1 << n
```

### 表引き

必要とする値の範囲が決まっている（たとえば、2の0乗～63乗だけ必要）という場合には、事前にテーブルを作っておいて、それから結果を得る、というような最適化も可能です。

### IEEE 754のデータ構造の操作

JavaScriptでも、`DataView`を使うことで、あるビット列に対して、適宜の場所を適宜の型で読み書きする、ということが可能となります。2の冪の場合、仮数部は1のまま（ケチ表現なので、ビット列としてはすべて0）で、指数部だけ合わせれば値を作ることができます。ただし、正の正規化数の最小値が$2^{-1022}$なので、これより小さな非正規化数を結果として得たい場合には、それ相応の実装が必要となります。

```javascript
// ビッグエンディアン版
const memsetBE = (() => {
    // 外部から不適当な書き換えが入るのを避けるため、クロージャに閉じ込める
    // 仮数部で書き換える以外の6バイトは、初期化時の0から永久に変わらない
	const buf = new ArrayBuffer(8);
	const view = new DataView(buf);
	return num => {
		view.setInt16(0, (1023+num) << 4);
		return view.getFloat64(0);
	};
})();

// リトルエンディアン版
const memsetLE = (() => {
	const buf = new ArrayBuffer(8);
	const view = new DataView(buf);
	return num => {
		view.setInt16(6, (1023+num) << 4, true);
		return view.getFloat64(0, true);
	};
})();

```

### その他

「`Float32`のビットパターンを作る」、「`bigint`としてべき乗を実行する」という方法も考えてはみたのですが、コード量や速度面で他の手法に対するメリットが見出し難い状況となったので、割愛いたします。

## 速度検証

jsBenchで実行するリンクを張りますので、ご自分のブラウザでも確認できます。

* [32ビットの範囲内](https://jsbench.me/m8l6xm09gq)
* [32ビットの範囲外](https://jsbench.me/afl6xmly5l)

実際に走らせて確認した傾向をまとめておきます。

* 32ビットの範囲内では、シフト演算が最速。表引きにすら勝つ。
* 32ビットの範囲外では、表引きが最速だけど、それ以降は環境によって結果が違う
  * Firefoxでは2の冪だけ特別な最適化でもあるのか、`Math.pow`や`**`演算子がかなり速い
  * ChromeではIEEE 754に沿ったデータ操作のほうが速い
* IEEE 754のデータ操作を行う場合、Windowsではリトルエンディアンのほうが速度が出て、iOS上では大差なし、という状況でした。ビッグエンディアンのマシンでWebを閲覧する可能性も低いので、リトルエンディアンで実装したほうがよさそう。
STM32G031とMbedでI2Cスレーブの受信文字をシリアル出力


x 超超重要 なぜか秋月STM32G031J6M6がうり切れていた。注意!!(2022/8/27現在)


x 過去ログを見よ!!

x Mbedでのボード設定は、NUCLEO-G031K8
x ここで言うSTM32G031は、秋月で売っているSTM32G031J6M6の事


目的
I2Cスレーブのテスト




![o_con698.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bfed55fa-2f37-5a07-e99a-d33f1d0bb429.jpeg)



![o_con699.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fda9835a-1480-05b0-f8f6-433b37f75ace.jpeg)





参考


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


https://qiita.com/caa45040/items/a98310ffff6ac4deb128



```c++




//i2c_usart_0x80_031_1

#include "mbed.h"

//1 LED
//2 VDD
//3 GND
//4 Serial 9600bps (PA_2)
//
//5 SWCLK
//6 SWDIO
//7 SDA
//8 SCL

//GPIOの初期化
DigitalOut myled(PB_7);//LED1

//シリアルの定義
UnbufferedSerial serial_port(PA_2, PA_3); //031

//I2Cの初期化
//               sda   scl
I2CSlave slave(PA_12, PA_11); //0031

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

    //シリアルの初期化
    serial_port.baud(9600);
    serial_port.format(
        /* bits */ 8,
        /* parity */ SerialBase::None,
        /* stop bit */ 1
    );

    char buf; //I2Cバッファー

    //I2Cスレーブのアドレスの設定
    slave.address(0x80);

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

        //I2Cの状態の読み出し(ポーリング)
        while (slave.receive() != I2CSlave::WriteAddressed) {}

        myled = 1;//LEDの点灯 debug

        //I2Cスレーブの受信バッファーを読み取る
        slave.read(&buf, 1);

        //I2Cスレーブの受信データの出力
        serial_port.write(&buf, 1);

        myled = 0;//LEDの消灯 debug

    }//while

}//main





```

-----------------------------------------

main.cpp


```c++




//I2C_TEST_STRING_R1_031_1

#include "mbed.h"

#include "OUT80.h"

DigitalOut myled(PB_7);

//        sda   scl
I2C i2c(PA_12, PA_11); //031


//メインプログラム
int main()
{

    OUT80 out80(&i2c);

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

        myled = 1;//LEDをオン

        //I2Cに文字列を出力
        out80.ns_puts( (char *)"hello world\r\n");

        //I2Cに文字列を出力
        out80.ns_printf( (char *)"%d",1234);

        //I2Cに文字を出力
        out80.ns_putc('\r');
        out80.ns_putc('\n');

        myled = 0;//LEDをオフ

        wait_us(1000*1000);//1秒待つ

    }//while

} // main






```

OUT80.h



```c++



//OUT80.h

#include "mbed.h"

struct OUT80 {

    OUT80( I2C *i2c );

    void initialize();

    void ns_putc(char ch);

    void ns_puts(char *str1);

    void ns_printf(char* fmt, ...);

    I2C *_i2c;

};



```

OUT80.cpp


```c++



//OUT80.cpp

#include "mbed.h"

#include "OUT80.h"

//最初に呼ばれるプログラム
OUT80::OUT80( I2C *i2c )
{
    _i2c = i2c;

    initialize();
}//OUT80


//イニシャライズ
void OUT80::initialize()
{
    //_i2c->write(0x80, "START", 3);
}//initialize


void OUT80::ns_putc(char ch)
{
    _i2c->write(0x80, &ch, 1);
    wait_us(1000);//約1ms秒待つ
}//ns_putc


//文字列の表示 nana_seg
void OUT80::ns_puts(char *str1)
{
    //文字の中身がゼロか
    while(*str1) {
        ns_putc( *str1 ++);
    } //while
}//ns_puts


void OUT80::ns_printf(char* fmt, ...)
{

    char buff[256];
    va_list args;
    va_start(args, fmt);
    vsnprintf(buff, sizeof(buff), fmt, args);
    va_end(args);

    char *s = buff;
    while (*s) {
        ns_putc(*s++);
    }//while

}//ns_printf



```
react-router-domで'Switch' (imported as 'Switch') was not found in 'react-router-dom

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

react-router-domを使うと以下のエラーが発生した

```
'Switch' (imported as 'Switch') was not found in 'react-router-dom
```

# 解決方法

`react-router-dom@6`では`Switch`がなくなっていた
どうしても利用するのであれば`react-router-dom@5`にする必要がある

```
$ yarn add react-router-dom@5
```
ECSのCapacity Providerとは？？

# Capacity Provider
ECSのタスクを実行するインフラを決定するもの

# Capacity Provider strategy
複数のCapacity Providerをタスクにどのように適用するかの組み合わせ方法

> キャパシティープロバイダーを使用して、クラスター内のタスクで使用するインフラストラクチャを管理できます。各クラスターには、1 つ以上のキャパシティープロバイダーがあり、さらにオプションとして、デフォルトのキャパシティープロバイダー戦略がある。
キャパシティープロバイダー戦略は、
**クラスターの複数のキャパシティープロバイダー間にタスクを分散する方法**
を決定します。
スタンドアロンタスクを実行するか、サービスを作成するときは、クラスターのデフォルトのキャパシティープロバイダー戦略を使用するか、クラスターのデフォルト戦略をオーバーライドするキャパシティープロバイダー戦略を指定できます。

# Capacity Providerの概念

Capacity Providerは以下のコンポーネントで構成されている

## Capacity Provider

クラスターに関連付けられ、タスク実行時にタスクのインフラストラクチャを決定する役割をもつキャパシティプロバイダー戦略のなかで使用される。

### Fargate

ECS  on Fargate では、 FARGATE と FARGATE SPOT の２種類がキャパシティプロバイダーとして選択できる。

これらのキャパシティプロバイダーは事前にAWS側で作成されているものなので、削除はできず、作成する必要もない。

```ruby
resource "aws_ecs_cluster" "terafform_cluster" {
  name = "terraform_cluster"
}

 # ここで、クラスターとキャパシティプロバイダーの関連づけをしている
resource "aws_ecs_cluster_capacity_providers" "provider" {
  cluster_name       = aws_ecs_cluster.terafform_cluster.name
  capacity_providers = ["FARGATE", "FARGATE_SPOT"]
}
```

### EC2

Amazon EC2 で Amazon ECS を使用している場合、キャパシティープロバイダーは、
- キャパシティープロバイダー名
- Auto Scaling グループ
- マネージドスケーリングおよびマネージド終了保護の設定
で構成される

マネージドスケーリングでは、Amazon ECS はクラスターのインフラストラクチャに自動スケーリングを提供する Auto Scaling グループのスケールインアクションとスケールアウトアクションを管理します。
詳細は、[Auto Scaling グループキャパシティープロバイダー](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/asg-capacity-providers.html)


## デフォルトのキャパシティープロバイダー戦略

カスタムキャパシティープロバイダー戦略または起動タイプが指定されていない場合に、クラスター内でサービスの作成またはスタンドアロンタスクの実行に使用されるキャパシティープロバイダー戦略が決まる。

各クラスターのデフォルトのキャパシティープロバイダー戦略を定義することがベストプラクティスと考えられている。

タンドアロンタスク：サービスを作成せず、クラスター内で直接実行されるタスク

## キャパシティープロバイダー戦略

デフォルトのキャパシティープロバイダーでは、ニーズが満たせない場合に、サービスまたはスタンドアロンタスクに指定するキャパシティプロバイダー戦略。

キャパシティープロバイダー戦略では、クラスターに既に関連付けられており、`ACTIVE` または `UPDATING`ステータスを持つキャパシティープロバイダーのみを使用できます。

キャパシティープロバイダー戦略は、1 つ以上のキャパシティープロバイダーで構成される。

BaseとWeightを指定することで、きめ細かいキャパシティプロバイダーの操作が可能。
styled-componentsをインストールしたがエラーが出てWebpackのコンパイルが行われない

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

`styled-components`をインストールしたあとに利用したコードをコンパイルすると以下のエラーが発生した

```
./node_modules/styled-components/dist/styled-components.browser.esm.js`
```

# 解決方法

コンテナを起動しなおしたら無事にコンパイルが走るようになった
起動してインストールしていたのが原因だった

# 参考

https://stackoverflow.com/questions/66722975/i-have-installed-styled-components-into-my-react-project-but-getting-an-error
Reactでstyled-componentsが見つからない(not found)

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

React.js+TypeScriptの環境に以下の方法で`styled-components`をいれたところ読み込み時に見つからないエラーがでた

```
$ yarn add styled-components
```

```
 could not find a declaration file for module 'styled-chttps://github.com/styled-components/styled-components/issues/2099omponents'
```

# 解決方法

TypeScriptは型ファイルが必要になるので以下のインストールをすると動くようになった

```
$ yarn add @types/styled-components
```

# 参考

https://github.com/styled-components/styled-components/issues/2099
React+Expressでサンプルアプリケーションを作成してみた（記事一覧）

ReactとExpressを利用してTypeScriptでSingle Page Applicationのサンプルを作成してみた。
開発環境はvscodeとDockerで共有できるようにしており、WindowsでもLinuxでも開発できる。

バックエンドでのTypeScriptの利用例は少ないかもしれないが、フロントエンドとバックエンドの両方をTypeScriptで書いていると頭の中を切り替えずに開発することができるので、ちょっとしたアプリの開発ならスムーズに進められるのが利点である。

開発環境の構築から画面の作成、APIの実装まで行うのでだいぶ長くなってしまったが、ある程度は動作するサンプルを作成するところまで解説したかったので複数回に分けて投稿している。

# 記事一覧

## VScode+Dockerでreactの開発環境を共有してみた
https://qiita.com/betarium/items/7921a7ac96e16ae84edb

vscodeのRemote-Container機能（Remote-Development機能の一部）を使ってreactの開発環境を構築し、共有できるようにする。

## VScode+Dockerでexpressの開発環境を共有してみた
https://qiita.com/betarium/items/ff0b719276d381752efe

前回と同様に、1つのプロジェクトでExpressも開発できるようにする。

## Reactで画面を実装してみた
https://qiita.com/betarium/items/fe5d3be5155de405c3d6

Reactの画面を追加し画面遷移できるようにする。

## ReactからExpress側のWebAPIを呼び出してみた（その1）
https://qiita.com/betarium/items/d01ef5325d5767af840d

APIを追加し画面から呼び出してみる。

## ReactからExpress側のWebAPIを呼び出してみた（その2）
https://qiita.com/betarium/items/4ec71c66386841b9402d

RESTに準拠したデータ作成・更新・削除APIを作成する。

# 開発環境・ツール・ライブラリ

* Windows 10 Pro または Fedora 36
* vscode ver 1.71
* docker-desktop または docker, docker-compose
* git
* Node.js ver 16
* Typescript ver 4.7
* React ver 18
* Express ver 4

# サンプルコード

[https://github.com/betarium/sample-react-express](https://github.com/betarium/sample-react-express)
Goでレイアウトを読み込んでいるが白いページになる

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Udemyの講座でGoのレイアウトを読み込む設定をしていたがなぜか読み込めなかった
コードは正しそうだった

# 解決方法

これはコードコピーでゼロ幅スペースが入っていることが原因だった
VSCodeの拡張機能`Gremlins tracker for Visual Studio Code`をいれるとゼロ幅スペースが視覚的にわかりやすくなり、消したところ問題なく動くようになった
windowsで突如音が出なくなった

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

windowsを利用しているのですが突如音が出なくなりました
イヤホンもスピーカーもどちらも音が出ず、よくある原因となりそうなのを調べたのですが解決できず
トラブルシューティングするとオーディオが応答していないとでました

# 解決方法

オーディオドライバー再インストールで治った

http://faq3.dospara.co.jp/faq/show/3850?site_domain=default
go.modを使わずに自作パッケージを読み込む

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

`go.mod`を利用することで自作したパッケージを読み込むことができていた

```
import go-pkg/sample
```

これを

```
import sample
```

のようにインポートしたかった

# 解決方法

Dockerfileに以下の環境変数を追加したら読み込むことができた

```Dockerfile
ENV GO111MODULE off
```

そしてGOPATH/srcいかのパスを指定した

それと地味にはまったのが
`/go/src/app/hello`の場合`import app/hello`と指定することだった

# 参考

https://teratail.com/questions/375192
goのパッケージインストールでgetとinstallがあるがどう違うか

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Goには`go get`を使ってインストールするものと`go install`を使っていインストールするものがあったり、
`go get`はなるべく`go install`に変えたほうがいいという記事をみかけたりよくわからなかった

# わかったこと

自分で調べた感じでは以下の認識
間違っている場合は教えていただきたいです


`get`でいれると`$GOPATH/pkg/mod/`にパッケージが入り
`install`なら`/go/.bin`にはいる
`go get`は`go.mod`が必要になる

airのように`air -c`で実行するものは`install`でいれる
またパッケージによっては`install`に対応していない

ここまでが初心者としての違いの認識でした
VSCodeのRemoteContainerのGo拡張機能に必要なライブラリをインストールする

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

VSCodeのRemoteContainerでGoコンテナの中に入って拡張機能をインストールすると、`gopls`など依存するライブラリを入れる必要があり、推奨されたインストールを何回か実行してインストール待ちが発生してしまうので、コンテナに必要なものを入れておいて、RemoteContainerではGo拡張だけをインストールするようにしたかったです

# 解決方法

以下をDockerfileに加えた

```Dockerfile:Dockerfile
RUN go install golang.org/x/tools/gopls@latest
RUN go install github.com/ramya-rao-a/go-outline@latest
RUN go mod tidy
```
【SpringWebflux】トランザクション単位で一意な値を設定する/取得する【R2DBC】

# TL;DR
- `TransactionSynchronizationManager.forCurrentTransaction`で、現在のコンテキストに対する`TransactionSynchronizationManager`を取得できる
- `TransactionSynchronizationManager`にはリソースをバインドできる
  - ただし、`key`/`value`共に`null`は設定不可

# やり方
基本操作は以下の通りです。
サンプルコードは`Kotlin`になっていますが、操作そのものは`Java`もほぼ同じです。

```kotlin
import org.springframework.transaction.reactive.TransactionSynchronizationManager
import reactor.core.publisher.Mono

val key: Any = /* 文字列など、任意の非nullキー */
val value: Any = /* トランザクション内で一意にしたい任意の非null値 */

// トランザクション非開始時はエラーになる
val manager: Mono<TransactionSynchronizationManager> = TransactionSynchronizationManager.forCurrentTransaction()

// 値の設定（keyに対して既に値がバインドされているとエラーになる）
manager.doOnNext { bindResource(key, value) }

// 値の読み出し（バインドされていなければnullになる）
val readValue: Mono<Any> = manager.map { getResource(key) ?: throw RuntimeException("値が取得できませんでした") }
```

`TransactionSynchronizationManager`に関する詳しい情報は`Javadoc`をご参照ください。

https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html

# おまけ
自分が考えていた利用例です。

https://wrongwrong163377.hatenablog.com/entry/2022/08/14/183112
WSL2(Ubuntu20.04)でRemoteContainerを.dev-containerから起動するとDocker Compose Requiredというエラーがでる

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

VScodeのRemoteConainerでGoのコンテナに入るときに、`.devcontainer.json`を利用して立ち上げれば、Goの拡張機能のインストールを推奨できるかなと思ったのでいれたのですがなぜか`Docker compose Reauired`というエラーが発生してコンテナを起動することができなかった

# 調べたこと

色々調べてWSL2ではまだ対応していないのではないかという結論になった
DockerDesktopなら問題ないのでおそらくWindowsで扱えないとだめみたい

# 参考

https://qiita.com/ppco/items/4e8a6ca976ebdf5b96fa
【Linux】vimtutorコマンド(vimのチュートリアル)

# vimの操作に慣れていない人向け
vim触った事がない/これから勉強がしたい人向けにお勧めのコマンド、vimtutorについてを軽く紹介します。
端的に言うと、vimtutorはvimのチュートリアルを受ける事が出来るコマンドとなります。

プロンプト上でvimtutorコマンドを実施すれば、チュートリアルが開始します。
チャプターが7章まで用意されており、全てのチャプターを実施するまでに私は1時間位掛かりました。
チュートリアルの初めに30分位かかるよと記載されているので、結構時間を掛けてチュートリアルに取り組んだ事が分かります。

```
[test_01@localhost ~]$ vimtutor
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/cca908bf-931a-d719-0b33-738d57fc0c6b.png)

# チュートリアルを受けてみて
チャプター2~4辺りが個人的に今後業務で使えるかもしれないと思いました。
vimはあまり使っていなかったんですが、せっかく勉強したので、使える場面では積極的に使おうと思います。(Config弄るとかシェルスクリプト書く仕事ないかな、、。)


学習した中で、便利だなと思った事を下記にまとめます。

★ノーマルモードの操作
|  コマンド  |  内容  |
| ---- | ---- |
|  x　 |  文字の削除  |
|  dd　 |  行の切り取り  |
|  v　 |  ビジュアルモード  |
|  y　 |  コピー  |
|  yy　 |  一行コピー  |
|  p　 |  ペースト  |
|  u　 |  直前の操作を取り消し  |
|  CTRL-R　 |  取り消しの取り消し |
|  CTRL-G　 |  行番号の取得 |
|  行番号 G |  指定した行番号にカーソルを移動 <br> gg　- 先頭行に移動 <br> G - 最終行に移動|
|  /　 |  文字列検索。/ 文字列で検索可能。 <br> n - 次の文字列へ <br> N - 逆方向に検索|
|  :%s/置換対象文字/置換後/g　 |  ファイル全体で文字列の置換  |
|  :#,#s/置換対象文字/置換後/g  |  #で開始行/終了行を指定して置換  |



以上、何かの参考になれば幸いです。
コマンドや開発者ツールを利用して調査する際のチートシート

個人的な備忘録

## ポート
#### プロセス情報つきでリッスンポート表示 
- 各オプションの意味は、nは名前変換しない、lはリッスンのみ、pはプロセス表示

```bash
$ sudo netstat -nlp
```


## ファイル

#### 特定のファイルパスの総容量を確認  

例は、 `/var/log/nginx/access.log.*` に一致する条件の総容量
```bash
$ du -bhc "/var/log/nginx/access.log.*" | tail -n 1
```

#### 特定のパスだけ除外してファイル検索 
例は、 検索したいパス: `/etc` から `/etc/.git/` を除外してファイル検索
```bash
$ find "/etc" -not -path "/etc/.git/*"  
```

## ボトルネック調査
### フロントエンド

#### 開発者ツール
- 「ネットワーク」で時間のかかっている処理を把握
  - 右クリックで cURL実行用のコマンドラインをコピーして再現も確認可能。並列で処理させれたい時も、コピーしたコマンドラインを並列実行すればよい.
  - 注意点は、 「 ~copy as all」を選ぶと目的の処理以外のcURLコマンドラインもコピーされてしまうので、 allは選ばないようにする。



### バックエンド
#### ps: スワップやCPU高負荷の原因となるプロセスの特定
スワップが発生している場合はRSSが極端に大きいプロセス、CPUの負荷が高い場合TIMEが長いプロセスを探す

``` bash
$ ps auxw
```
- カラムの補足
    - VSZ: プロセスが確保している仮想メモリ領域のサイズ
    - RSS: プロセスが確保している物理メモリ領域のサイズ
    - STAT： プロセスの状態を示す重要な指標
    - TIME: CPU使用時間 ※ プロセスが生成されてからの時間ではないことに注意
- VSZ/RSS挙動の[参考](https://nopipi.hatenablog.com/entry/2017/11/11/213214#3-2%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AEVSZRSS%E6%8C%99%E5%8B%95)
- 参考情報
> スワップが発生している場合は**物理メモリが不足している証拠ですから、RSSサイズを見て極端に大きなプロセスがないか**などを探っていけばよいことになります [1] P.177

> CPU負荷が極端に高いシステムがあったとき、**psのTIME項を調べれば、どのプロセスがCPUをたくさん使っているか**を見分けることができます。 [1] P.177

#### sar: 過去の統計データに遡って表示、現在のデータを周期的に確認

##### 過去のcpu使用率の統計
負荷分散を考慮するにあたり、user, iowait, system, idle あたりが注目すべき指標
```bash
$ sar -u 
```


##### 過去のロードアベレージの統計

```bash
$ sar -q 
```

##### 過去の物理メモリ使用率の統計

```bash
$ sar -r
```
- 各カラムのプレフィックスのkbの意味はキロバイト
- 参考情報
> sar -rの結果で、**時間を追う毎にkbmemfreeが減っていくのはページキャッシュが理由**です。その証拠にページキャッシュに割り当てたメモリ容量に相当するkbcachedの値は、徐々に増加しています。 [1] P.183 - 184

> sar -rを見れば、どの程度カーネルがキャッシュを確保しているかが判断できます。そのキャッシュの容量と、実際にアプリケーションが扱う有効なデータ量を比較して、**データ量のほうが多ければメモリ増設を検討**します。 [1] P.184

##### 過去のスワップ発生状況

```bash
$ sar -W
```


#### vmstat: 仮想メモリと関連する情報をリアルタイムに表示
sarに比べてCPU使用率とI/O発生状況等を並べて表示できる
指定方法は「n秒おきの出力をm回まで実行する」

```bash
$ vmstat n m
```
- 参考情報
> topやsarではCPU使用率と一緒にI/O待ち率が確認できますが、I/O待ちの数字でわかるのは、あくまでシステム全体でI/O待ちが発生した「割合」のみです。**実際にどの程度I/Oが発生しているかの絶対値が知りたい場合は、vmstat**を参考にすると良いでしょう。 [1] P.187

###


## 参考ページ
https://log.dot-co.co.jp/netstat-command/

https://orebibou.com/ja/home/201511/20151119_002/

## 参考文献
[1] 伊藤直也，勝見祐己，田中慎司，ひろせまさあき，安井真伸，横川和哉　「［24時間365日］サーバ/インフラを支える技術」 技術評論社
雀魂のNGワード

雀魂の牌譜を **国士無双** という名前でブックマークしようとして、伏字になった経験はありませんか？しらみつぶしに原因を探ると、**国** がNGワードに設定されていることがわかります。次に、こちらのツイートをご覧ください。

https://twitter.com/xxmponya/status/1524319240324493312

ブラウザ版の雀魂では、**平** と **今** を同時に含む文章は伏字になると突き止められたようです。ただ、原因となる文字をしらみつぶしに特定することは、骨が折れる作業だと想像できます。そこで、開発者ツールを使って、原因を特定する方法を紹介します。



# NGワードの判定

NGワードの判定を行っているのは、```app.Taboo.test``` という関数です。例えば、**平和** がNGワードかどうかは、次のコードを実行すると判断できます。
（コードの実行は、自己責任でお願いします。）

```JavaScript
app.Taboo.test("平和");
```

```JavaScript:実行結果
null
```

```null``` という結果が返ってきました。NGワードは含まれていないという意味です。続いて、**国士無双** の場合を見てみましょう。

```JavaScript
app.Taboo.test("国士無双");
```

```JavaScript:実行結果
{s: '国', id: 20784}
```

実行結果から、**国** がNGワードであると分かります。このように、何が引っ掛かるのかを教えてもらえます。次は、**平＿今** とした場合です。

```JavaScript
app.Taboo.test("平＿今");
```

```JavaScript:実行結果
{s: '平进', id: 20729}
```

上記のツイートの通り、**平＿今** は伏字になります。そして、実行結果から察するに、**今** を <ruby>**进**<rt>シン</ruby> という字と同一視しているようです。また、関係のない文字は無視されており、単純なNG避けができないことがわかります。



# 似ている漢字

実は、同一視される漢字の一覧を見ることができます。異体字であったり、発音や字体が似ている漢字が対象です。一例として、**國** と **坪** と **今** に対応する漢字を見てみましょう。

```JavaScript
var near = app.Taboo.near_char_father;
[near["國"], near["坪"], near["今"]];
```

```JavaScript:実行結果
['国', '平', '进']
```

**國** は **国** と、**坪** は **平** と、**今** は **进** と同一視されることが分かります。
（つまり、**國士無双** は伏字になります。**圀士無双** や **匤士無双** であればセーフです。）



# NGワードの例

このことから、**平＿今** が伏字になるのは、**平** や **进** と見なされる漢字が同時に含まれるためだと分かりました。ちなみに、そういった漢字は他に**50文字以上**存在します。

<dl>
<dt>　平
<dd>品 貧 頻 顰 牝 瓶 凭 憑 評 鮃 坪 屏 塀 聘
<dt>　进
<dd>今 巾 斤 近 金 筋 緊 禁 襟 錦 謹 僅 饉　矜 境 競 鏡 驚　径 経 京 景 憬 鯨 敬 警 茎 痙 頸 脛　津 浸 晋 進 尽 儘 晶 浄 静 精 靖 井 丼
</dl>

そのため、伏字になる原因を掴めないときは、これらの漢字が関係しているかもしれません。例を挙げると、**経**済**評**論、東**京品**川、**牝**馬**競**走 は伏字になります。
1984年　ジョージ・オーウェル＜エンジニア夏休み企画＞ 【読書感想文】

エンジニア夏休み企画  【読書感想文】
https://qiita.com/official-events/6d31965c499a69377c0b

【読書感想文】に焦点を当てたのは良い企画だと思った。

 <この項は書きかけです。順次追記します。>

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
https://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2

残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。
# 25. 1984年　ジョージ・オーウェル
1949年に執筆したらしい。ジョージ・オーウェルが1938年に執筆したスペイン内戦体験を描いた『カタロニア讃歌』が愛読書だった。同じ著者ということで、1984年を1970年頃に読んだ。著者の執筆当時から30年経っていた。読んだ時には、1984年なんて、すごく先のことだと思っていた。当時、数学者のガロアに傾倒しており、自分は20歳になる前に死ぬと思っていた、1984年に自分が生きているとは思えなかった。

新訳版 ハヤカワepi文庫,  [George Orwell/ジョージ・オーウェル](https://ja.wikipedia.org/wiki/ジョージ・オーウェル)
<img width="200" alt="41ZAgdWin2L._SX331_BO1,204,203,200_.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/339e61d6-c1d6-8078-1567-5fef835b42b5.jpeg">

https://www.amazon.co.jp/dp/4151200533/

https://bookmeter.com/books/556742

https://booklog.jp/item/1/4151200533

>1960年代の10代の頃に読みました。1984年には30歳になっているので、とても1984年が想像できませんでした。
監視社会になっているのか、不安が一杯になりました。
人と人の関係をどう維持したら良いか。考えさせられました。
その後石油ショックで、３０年で石油はなくなると騒がれた。もう１９８４年まで自分は生きてないのかとも思っていた。自分が生きていないことと同様、この本に書いてあるような世界は来ることがピンと来なかった。５０年後になってみると、ありとあらゆるところにカメラがあり、ありとあらゆる人を認識可能になっているかもしれないと思った。

>ps.
1984年になって，技術者として情報社会に関わっていて，
監視技術は穴だらけで，技術者が従うとは限らないことが分かりました。
原発，原子力のように，技術者の力が弱くなっている分野もあります。
常に若い，自由な技術者を育てることが大事だと感じています。
多少の不安は残っています。

それから約２０年経つ。ありとあらゆるところにカメラがある。膨大なデータを解析しているのは、軍事組織（情報機関を含む）と、新興大企業で、２つの勢力に踊らされている人たちの姿が思い浮かぶかもしれない。

# 箱庭　プロジェクト　

箱庭もくもく会 #10 日時：2022/09/14(水) 17:30-19:30

https://hakoniwa.connpass.com/event/258129/

この項目は、箱庭プロジェクトを市場分析の対象として、原則的には、箱庭プロジェクトの外部から分析し、外部から箱庭の広告宣伝のための戦略会議を仮想した結果、仮想「箱庭もくもく会」を開催してみることを企画するものである。　
一切の内容は、箱庭プロジェクト、Athrill, TOPPERSとは無関係である。　
一(いち)参加データアナリストの、個人的なつぶやきです。

箱庭は、ありとあらゆるものの模擬試験を行うための基盤を提供しようとしているように見えます。　

それなら、箱庭2030, 箱庭20131、箱庭2032という感じで、毎年、その時代の特徴的なシステムと取り入れた模擬試験を実施できるようになるといいかもと思った。　

逆に、箱庭2030から減算し、箱庭2014, 箱庭2004, 箱庭1994, 箱庭1984, 箱庭1974, 箱庭1964, 箱庭1954 と戻って行って、過去の社会状況を模擬試験できるようにするのも面白いかもと思った。　

道具は、使う人の想像を豊かにするのに使うことができるかもしれないと思った。　



 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20220821
Linuxコマンド ファイル操作系

個人的な備忘録

## コピー

#### マージ ( aaaディレクトリ配下にあるファイル・ディレクトリのみを、bbbディレクトリに対してupsert する ) 
```
cp -r aaa/. bbb/
```

#### cpで、同名ファイルの場合は上書きしない場合はnオプションをつける

コピー前の環境
``` 
$ tree src -h -f 
[  96]  src
└── [ 160]  src/hoge
    ├── [ 261]  src/hoge/aaa
    ├── [   0]  src/hoge/bbb
    └── [  96]  src/hoge/hoge2
        └── [   0]  src/hoge/hoge2/ccc

2 directories, 3 files

$ tree dist -h -f
[  96]  dist
└── [  96]  dist/hoge
    └── [   6]  dist/hoge/aaa

1 directory, 1 file
```

nオプションをつけると既存ファイル( `hoge/aaa` )は上書きせずにコピー
```
$ cp -nr src/hoge dist                                                                          

$ tree dist -h -f     
[  96]  dist
└── [ 160]  dist/hoge
    ├── [   6]  dist/hoge/aaa
    ├── [   0]  dist/hoge/bbb
    └── [  96]  dist/hoge/hoge2
        └── [   0]  dist/hoge/hoge2/ccc

2 directories, 3 files
```

## 転送

フォルダの転送

```bash 
$ scp -r ztmy@example.com:/home/ztmy/hoge .
```

## その他
JSON を JSONL(NDJSON) にする
```bash
$ jq -c . hoge.json
```
NFT -Web3で注目の技術②-

# はじめに
IT×ビジネスという視点で週1本記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

本記事では、Web3で注目の技術②としてNFTについてまとめます。
Web3については[こちらのリンク](https://qiita.com/7_inai_/items/c441008bb0849908fbc6)からご確認ください。


# NFTとは
NFTとは __Non-Fungible Token__ の略で、`代替不可能なトークン`という意味があります。従来のシステムでは、例えばオンライン上にアップロードされた画像が色々な人の手により、拡散やコピーをされるとどの画像がオリジナルのものかわかりませんでした。
NFTでは、ブロックチェーンを使うことで、非常に改ざんや偽造の難しい固有の価値を、デジタルデータに付加することができます。
例えば、簡単にコピーされてしまうものの代表例として、デジタルアート(デジタルデバイスを使用した芸術作品)があります。これを解決したのがNFTです。NFTと紐づけて販売することで、デジタルアート1つ1つに、現実世界のアートと同じように固有の価値を与えることができるようになりました。


# 代替不可能について
ビットコインのような暗号資産もNFTもブロックチェーンを使用したデジタルトークンです。ただ、`ビットコインが代替可能なトークンなのに対して、NFTは代替不可能なトークン`です。
ビットコインはAさんが持っているトークンもBさんが持っているトークンも無個性なので、全く同じトークンとして考えられます。しかし、NFTでは、それぞれのトークンが個性を持つため、全く同じものとしては考えられません。ここがNFTの大きな特徴です。

# プログラマビリティについて
プログラマビリティとは、2次流通で手数料が入るなど、様々な機能をデータ自体に付加できることです。従来のアートでは、そのアートが作者の手を離れる1度だけしか作者は価値を得ることができませんでした。しかし、NFTでは、作者の手を離れた後も、__購入者から別の購入者へ渡る毎に、手数料を作者に支払うというような機能__ をつけることも可能です。




# 終わりに
NFTという技術を初めて聞いた時、結局スクショすればコピーできるのでは?と思いました。実際、同じように思われたかたもいると思います。
確かに、NFTを用いたデジタルアートでもコピーすることは可能です。ただ、NFTでコピーできなくするのは、画像本体ではなく、その画像の __所有者であることの証明__ です。その証明に何十億もの価値がつくのです。それだけ大きな価値を持たせることができる技術ですので、これから様々な場面で応用されていくでしょう。
最後までお付き合いくださりありがとうございました。
画像収集を簡単に行えるライブラリを作ってみた

# 初めに
もともと過去に画像収集するロジックを書いていたのですが、現時点では既に使えなくなっていたのでそれを修正するとともにライブラリ化して簡単に使用できるようにしてみました。
ライセンスはMITとしているので使用に際してご自由に使用していただいて問題ありませんが、やっていることはYahooの画像検索ページからスクレイピングして画像情報を取得し対象サーバから画像データをダウンロードするという内容になります。
場合によってはスクレイピングのしすぎで問題が発生するかもしれません。
ご使用の際は注意いただくとともに私はこのライブラリを使用して発生したトラブルに責任を持ちません。

https://qiita.com/kihara-takahiro/items/db8fd9c621ad14ba20a6

# インストール方法
```
pip install git+https://github.com/KiharaTakahiro/image_searcher.git
```

# 使い方
```
from image_searcher import ImageSearcher

searcher = ImageSearcher()
searcher.scraping("猫")
```
ImageSearcher()の引数には以下が指定可能です。必要があれば適宜変更してご使用ください。

* dest_path (str): 画像の保存先. Defaults to "./img".
* max_page_num (int): クローリングするページ数. Defaults to 20.
* start_page (int): 開始ページ. Defaults to 1.
* img_num_per_page (int): 1ページ内の検索数. Defaults to 20.
* sleep_sec (int): 検索間隔(あまり早く設定すると高負荷になるかも自己責任でお願いします。). Defaults to 3.
* time_out (int): 取得できない時に何秒でタイムアウトにするか. Defaults to 5.

# 実行結果
上記プログラムが書いてある場所にimgというディレクトリが作成され、その中を見ると以下のように猫というディレクトリが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/017cf39a-61cd-dd4c-9608-f0c9ce0b1aee.png)
猫ディレクトリの中に入ってい見ると下記のようにかわいい猫の画像がいっぱいになります！（実行中なので全部はそろっていませんが…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/5eb9aa34-e579-013d-d864-e7b8881286cc.png)

# 終わりに
使用に際しては十分気をつけて行ってください。
この手のコードは簡単に書くことはできるのですが、やはり実際に使うとなると怖いなって思いもあるので作っては見たものの公開しても良いのか？という思いはあります…
とはいえどうやったらこんなことができるのか？という技術的な興味があるかたもいるかと思いましたので応用したりして使ってみていただければと思います。

ソースコードは以下に格納してあります。
https://github.com/KiharaTakahiro/image_searcher
議事録

# 研修が終わって
一ヶ月半ほどの研修を終えて早々、プロダクトの機能の追加を頼まれた僕は意気揚々とコーディングに取り掛かろうとしたが、まず最初に立ちはだかった問題が多かった。

## 足りなかった知識
・linux
・TCP/IP（ネットワーク）
・git

### linux
まず最初に環境構築をする上でコマンドラインで色々設定する上で指示をされるのだが、ssh接続のコマンドの細かいオプションやIPアドレスを調べるコマンドを知らずにため息を疲れる場面が多々あった。また権限に関してもとても重要であるのにも関わらずうまく指示通りのコマンドを打てなかった。

### TCP/IP
基本的に指示をされる上で多くのカタカナが出てくるがほとんど理解できなかった。おそらくTCP/IPの知識が必要である。どのIPアドレスがどういうものなのかという理解がなかった。

### git
gitに関しては共同開発をする上での最低限の知識コマンドを必要である。


## rails
基本的なモデル、データベース操作の練習が足りない。どのようにコードを書いたらどのようなデータが取り出せるのかは、コードをひたすらかいて試すしかないと感じた。

これからもしばらく厳しい状況が続くとみられる。覚悟をして学習に取り組む予定である。


以上
モジュールの分割

* システム設計の作業は、```各工程ごとに順次細かく分割```していくこと。
最も小さな単位が1つのプログラムになるイメージです。```分割した単位は、「モジュール」```のほか、一般に次のような名称でも呼ばれます。また分割方法は、```システムの特性によって、さまざまな技法```を用います。

* シンプルで保守性に優れたプログラムを作成するためには、構造化設計が欠かせません。
モジュール分割技法は2種類ある。
    * データの流れに着目
    * データの構造に着目

## コンポーネント
システムを構成する機能単位。座席予約や入金処理といった、関連する一連の作業を１つにまとめた単位です。

## モジュール（ユニット）
独立してコンパイルできる単位。1つの機能単位に分割されたプログラムを指します。１つのモジュールをさらに分割して階層化する場合もあります。モジュール分割のメリットは、処理効率の向上、部品化、再利用が可能、保守の効率化と信頼性向上、などです。

## セグメント
関数やサブルーチンなどの単位を指します。

出典 https://gihyo.jp/assets/files/book/2018/978-4-7741-9907-8/9784774199078-02.pdf

# モジュールに分ける利点と留意点
## 利点
### 作業が分担できる。
複数人で並行してプログラミング作業を進めることができる。

### 再利用の容易
共通する機能を部品として使い回すことができる。

### 修正が一部で済む
欠陥のあるモジュールを修正することで、プログラムが改修できます。

## 留意点
変な分割をすると余計なプログラミングの保守が難しくなる。

## モジュール分け作業の後
構造化プログラミングを行う。
### 構造化プログラミングとは？
```「順次」「反復」「分岐」という単純な制御構造```を```「手続き」```という単位でまとめることで抽象化し、その手続きをさらにまとめてより抽象的な「手続き」を作る、といった階層構造によってプログラミングするパラダイムです。

#### 順次とは?
プログラムに記述された```順に上から実行```する処理です。

#### 反復とは?
指示された処理を```繰り返し実行```することで、多くの言語ではfor文、while文といった形で表現されます。

#### 分岐とは?
```条件によって実行```する処理を切り替えることで、こちらはif文、switch文が代表的です。

#### パラダイムとは？
特定の時代や分野において支配的な規範となる「物の見方や捉え方」のこと
出典 https://www.kaonavi.jp/dictionary/paradime/#:~:text=%E3%83%91%E3%83%A9%E3%83%80%E3%82%A4%E3%83%A0%E3%83%AD%E3%82%B9%E3%83%88-,%EF%BC%91%EF%BC%8E%E3%83%91%E3%83%A9%E3%83%80%E3%82%A4%E3%83%A0%E3%81%A8%E3%81%AF%EF%BC%9F,%E5%A0%B4%E5%90%88%E3%82%82%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82

### 構造化プログラミングはソフトウェア設計を体現したもの 
ソフトウエア設計の考え方の1つに「分割統治法」があります。
構造化プログラミングはこれを体現したものです。
分割統治法とは、そのままでは```解決が難しい「大きな問題」を「小さな問題」に分割```し、その分割された小さな問題のすべてを個別に解決する手法です。構造化プログラミングに当てはめて考えてみると、```大きく複雑なソフトウエアという問題を小さな手続きという単位に分割```し、それをさらに```分割することを繰り返すと最後には順次、反復、分岐という単純な小さな文```になります。
これが、分割統治法の考えが生かされているということになります。

出典 https://active.nikkeibp.co.jp/atclact/active/17/060100293/060800002/#:~:text=%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF,%E3%81%8B%E3%82%89%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E5%87%A6%E7%90%86%E3%81%A7%E3%81%99%E3%80%82

# モジュールの分割技法
データの流れに着目した技法を紹介する。

## STS分割法
プログラムを```入力処理（源泉：source)```、```変換処理（変換: Transform)```、```出力処理(吸収:Sink)```という３つのモジュール構造に分割する方法

## トランザクション分割法
プログラムの```一連の処理（トランザクション)単位```に分割する方法です。

### 気づき
一つの役目の処理で分割されるのか。

## 共通機能分割法
プログラム中の```共通の機能```をモジュールとして分割する方法。

### 気づき
違うモジュール同士の```共通部分の処理```をまた一つのモジュールを作成する。

# モジュールの独立性を図る尺度
機能的に明確で、かつ入出力がはっきり分かるものが良いとされている。

モジュールの独立性を測るものとして
* モジュール強度
* モジュール結合度

## モジュール強度
どれだけ機能的に特化できているかを表す。
### 気づき
モジュールだけを見てこれはどんな機能かを１００人が１００人一緒の答えでなければならないのか。

## モジュール結合度
どんなデータをやり取りすることで他のモジュールと結合するかを表す。
### 気づき
他のモジュールの変更に影響されないモジュールだといいのか。

詳しくは
出典　https://gihyo.jp/assets/files/book/2018/978-4-7741-9907-8/9784774199078-02.pdf
出典　http://www.kogures.com/hitoshi/webtext/kj2-module/


出典　https://gihyo.jp/book/2020/978-4-297-11781-8
VSCode: ツリー構造のインデントを見やすくする方法

 
VSCodeは最も広く知られたエディタの1つですね。
ただ、開発ファイルが増えて階層が深くなるとファイルエクスプローラーのインデントが見にくくなり、開いたファイルがどの位置にあるのかが分かりづらくなりがちです。

そこで、インデントをわかりやすくする方法として階層をカラーリングしてくれる設定を紹介します。

# tree.indentGuidesStrokeでカラーリングを追加
1. cmd(ctl)+Shift+P でコマンドパレットを開く
1. Open Settings (JSON) を選択、JSONファイルが開く
1. 以下の内容を追加
``` setting.json
"workbench.colorCustomizations": {
		"tree.indentGuidesStroke": "#ffffff"
	}
```

もちろんカラーコードは任意のものでOKです。

設定、保存後、一度VSCodeを落とし、再起動させるとツリー構造のインデントが見やすくなっていると思います。

before:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939968/591efe1a-08d5-f95b-68ff-6bbbb5d3fc8c.png)
after(`tree.indentGuidesStroke` に`#ab34eb`を設定):
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939968/373ffb10-7692-8d92-5349-501d418ba92c.png)
【React】WebSocketのブラウザAPIで切断されても自動再接続する

# 概要
本記事では、WebSocketのブラウザAPIでサーバ側からセッションを切断された場合、自動で再接続する方法について記します。

アプリ側としては、該当ページ表示期間中において常にセッションを張っておきたいにも関わらず、サーバ側としても意図せず切断(=[Closeフレームの送信](https://triple-underscore.github.io/RFC6455-ja.html))するケースが存在するようです(ex. WebSocketのサーバ側でALBをかませる)。少なくともAWSのALBは最長4000秒の設定しか出来ず、それ以上セッションを張り続けたい場合は、ブラウザAPI側で手当てされていないため、切断されたら自動的に再接続する必要があります。

なお、今回は表題の通り、ソケット通信で有名なライブラリであるsocket.ioではなくブラウザAPIの[WebSocket API](https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API)について取り扱っていますのでご注意ください。

# 環境
```shell
$ node -v
v16.13.2

$ npm -v 
8.1.2
```

```
動作確認したChromeのバージョン
Version 104.0.5112.101 (Official Build) (arm64)
```

# 実装
やっていることは非常にシンプルで、サーバから切断処理があった場合、クライアント側でcloseのイベントが発火されます。
このタイミングに合わせて、再度インスタンスを作り直すだけです。本実装により接続されたら自動で再接続し、イベントリスナーも貼り直すことができます。

```ts
import React, { useEffect, useState } from 'react';

const socketServerUrl = 'hogehoge';

export const WebSocketComponent = () => {
  const [socket, setSocket] = useState<WebSocket>();
  //  ↓✨✨接続先サーバのURLを指定
  setSocket(new WebSocket(socketServerUrl));

  useEffect(() => {
    socket != null &&
      socket.addEventListener('close', function () {
        // ✨✨【今回のポイント】closeイベント発火後、再度インスタンスを生成することで再接続する✨✨
        setSocket(new WebSocket(socketServerUrl));
      });

    socket != null &&
      socket.addEventListener('open', function () {
        // 初期化処理実行
        // socket.send('huhgahuga');
      });

    socket != null &&
      socket.addEventListener('message', function (e) {
        try {
          // TODO: あなたのやりたい処理
        } catch (e) {
          console.log('error出たよ、', e);
        }
      });
  }, [socket]);

  // あなたが見せたいjsxを↓に書こう！
  return <div>WebSocketComponent</div>;
};
```

# おまけ
この辺、自分で実装するのではなくAPI側でオプションで用意してほしいのですが、自前で実装する必要性がありました。もし切断されて困るのであれば、本記事が皆様のお役に立てると嬉しく思います。

なお、実際の運用の現場で発生したのが、リトライした接続がセッション張ることに失敗したら、当たり前ですが切断されっぱなしになります。こうなると今回の対応では不十分です。
気が向いたら、接続状況を確認してリトライに失敗してもさらにリトライする処理を入れる処理を含めた記事を書こうと思います。
Linuxコマンド ファイル調査 

## 検索
- リポジトリ内で検索
```Bash
$ git grep <文字列>
```
参考: https://dev.classmethod.jp/articles/useful-git-grep-command/

## 差分確認
### どこに差分があるか確認

- 改行、空白を無視したdiff
```Bash
$ diff -wB hogeA hogeB
```

- git diffのような表示で差分を確認
```Bash
$ diff -u hogeA hogeB
```

- 単語単位で差分を確認したい（≠行単位）
```Bash
$ git diff --no-index hogeA hogeB
```
参考: https://qiita.com/tamanobi/items/74282b166ef4eb4c007b

### 複数のファイルが一致しているか確認

比較元でチェック用ファイルを作り・・
```bash
$ cd DIR_PATH
$ find . -type f -print0 | xargs -0 md5sum > /tmp/DIR_PATH.md5sum
```

比較先でチェック用ファイルを使って同一性を確認する
```bash
$ md5sum -c hoge.md5sum
```

※ 特定のファイルだけのチェック用ファイルを作る方法
```bash
$ cat file_list.txt | xargs md5usm > /tmp/check_files.md5sum
```

### 差分を確認しながら修正したい
```bash
$ vimdiff fileA fileB
```

```bash
$ vim -d fileA fileA
```

#### ※ vimdiffで差分ごとに自動反映する方法
- 左側の差分内容でを右側に上書きする: dpコマンド
- 右側の差分内容でを左側に上書きする: doコマンド

参考にした情報↓
https://maku77.github.io/vim/file/vimdiff.html

## 重複チェック

```bash
$ sort test.csv.sorted 
$ sort -u test.csv.sorted_uniq
$ diff -u test.csv.sorted test.csv.sorted_uniq
```
仕事で燃え尽きないために休日向けのポモドーロ"休息法"を考案したい

# 休日の過ごし方

ポモドーロ集中法を逆にしてポモドーロ休息法というのはどうだろうか。

ポモドーロ集中法は25分集中して5分休む。
これを逆にする。

25分休憩して5分は何か好きなことをするのだ。

# 休み方が下手すぎて

僕は休み方が下手すぎて一度燃え尽きたことがある。
休日もひたすらに仕事をするしかしなかったのだ。

仕事をするより休むほうがずっと難しいと感じた。
だから休むことには制約が必要だ。

努力して休む。計画的に休む。具体的な手法を味方にして休む。

休息にもテクニックが必要だと切実に感じている。

# 具体的な休息法

25分間のタイマーをかける。
そしてその時間の間は休む。

5分間ぐらいは好きなことをする。
これを繰り返す。

以上。

# カフェでの休息

僕の場合はカフェで目を閉じながら自分の呼吸をカウントする。プチ瞑想だ。
その間はスマホも触らないしPCも開かないし本も読まない。

なぜカフェかというと自宅だと昼間に眠ってしまってリズムを崩しがちだからだ。

ここが休息の難しいところだと思う。
いかに睡眠のリズムを崩さずになおかつ心身を休ませるかが鍵だ。

# 休息中に感じる疲労

僕は以前、休息するからこそ疲労を濃く感じることがあって困っていた。
休むことでむしろ疲労しているような感覚があった。

だが疲労感と疲労は必ずしも同じではない。
なので休息中にむしろ疲労を感じたとしても気にしないでおくのが大事だと思う。

逆に活動は疲労感をマスクしてしまう。だからこそ危険だ。
PCに向かって何か活動していれば頭は冴えるが、実は心身に疲労が溜まっていくかもしれない。

たとえばカフェインを摂取すれば一時的に疲労感は減るだろうが疲労そのものが消えて無くなるわけではない。

疲労はなかなか複雑な世界だが、疲労感と疲労は別物だと理解しておくことが肝要だ。

# パッシブレスト VS アクティブレスト

活動せずに休むのがパッシブレスト。
活動によって休むのがアクティブレストだ。

この記事ではパッシブレストについて言及したが、自分の状態に応じてこの二つは使い分けるべきだろうと思う。


# 参考文献

- シリコンバレー式 よい休息
- すべての疲労は脳が原因



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ



# Twitter

https://twitter.com/YumaInaura



<!-- Update From Qiita API -->
Linux スワップ領域について（自分用メモ

●スワップ領域とは、物理メモリ（実メモリ）に収まらなかった情報を一時的に格納する為の、通常ハードディスク上に作成する領域。


スワップに関連するコマンドには mkswap, swapon, swapoff。
実際にスワップを利用する流れとしては、

1. スワップ用のパーティション（またはファイル）を用意する
2. mkswap コマンドでスワップ領域を作成
3. swapon コマンドでスワップ領域を有効化
4. （不要になれば）swapoff コマンドでスワップ領域を無効化


●tmpfsはメモリ上に作成できる一時ファイルシステム。
ファイルをHDDではなくメモリ上に置くことで高速にアクセスすることができ、システム再起動時にファイルは消去。一時的な記憶領域として利用します。

tmpfsのサイズは最初にメモリ上に確保されるわけではなく使用した分に応じて動的に変化するので、メモリを効率的に使用できます。RAMの一部をストレージとして利用するRAMディスクと似ていますが、RAMディスクはファイルシステムを作成する必要があり固定サイズです。tmpfsはファイルシステムとしてディレクトリにマウントして利用できます。
Webカメラで猫を検出したときにLINEに画像を送る

# 目的
### Webカメラで猫を検出したときにLINEにメッセージとして画像を送るようにすること

# 前提条件
このシステムを構築したときの条件について
## システム構成
開発用PC
Line ⇐ RaspberryPi4 ⇐ Web Camera

## 環境
### 開発用PC
Ubuntu18.04
Python3

### Raspberry Pi4 ModelB
microSD 128GB
Ubuntu18.04
Python3

# コーディング
必要なライブラリをインポートする

```Python:
import cv2
import requests
import os
```

Lineに送るための初期設定をする

```Python:
def init():
    url = "https://notify-api.line.me/api/notify"
    access_token = 'トークン' #取得したトークンを入力
    headers = {'Authorization': 'Bearer ' + access_token}
```

Webカメラの設定をする
・画像を取得する
・取得した画像の中に猫がいるかを判断する
・猫がいた場合は、画像をラインに送信する

```Python:
def capture()
    cap = cv2.VideoCapture(0)
    i = 0
    while 1:
        flag1 = 0
        ret, frame = cap.read()
        path = 'img' + str(i) + '.jpg'
        cv2.imwrite(path, frame)
        result, flag2 = detect(flag1, path, 'haarcascade_frontalcatface.xml')
        cv2.imwrite(path, result)
        if flag2 == 1:
            files = {'imageFile': open(path, 'rb')}
            r = requests.post(url, headers = headers, files = files,)
        os.remove(path)
        key = cv2.waitKey(10000)
        i = i + 1
```

猫が画像の中にいるのかを判断する

```Python:
def detect(flag, imagefilename, cascadefilename):
    srcimg = cv2.imread(imagefilename)
    if srcimg is None:
        print('cannot load image')
        sys.exit(-1)
    dstimg = srcimg.copy()
    cascade = cv2.CascadeClassifier(cascadefilename)
    if cascade.empty():
        print('cannnot load cascade file')
        sys.exit(-1)
    objects = cascade.detectMultiScale(srcimg, 1.1, 3)
    for (x, y, w, h) in objects:
        print(x, y, w, h)
        flag = 1
        cv2.rectangle(dstimg, (x, y), (x + w, y + h), (0, 0, 255), 2)
    return dstimg, flag
```

Gitにファイルをアップロードしておきますので必要でしたらご利用ください。

```
git clone https://github.com/applepie319/CMS.git
```

# 参考

https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9

https://qiita.com/wellflat/items/c6ffae99be35cecc5680
〇キャンバスAPにおいてデータテーブルで選択した項目をFormで編集して更新する方法　CANVAS　Power Apps Dataverse　DataTable Form update

テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/4ff69a34-13e2-34bf-680a-8c088b0deb68.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/864da837-5b23-c712-ea84-dcad3db24bf3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/c449049b-8557-930a-7dca-a9737612225a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/879ad6a3-9b81-4b86-01a8-4922f8be64a8.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/a3cb7501-1131-f958-7790-18583470b632.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/df7d6af4-df46-9088-5610-e179e188eb1f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/63db29e2-726b-5040-470c-c13855cefdde.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/ddfa4d66-99a2-f61f-8130-f1c25569dd11.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/165b20c7-ccd9-1435-5b41-1db54f171651.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/da580214-8c81-eba3-7341-ba02514c727b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/2e7fc490-5969-a6c8-9de1-9a67581a9238.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/313e8c07-6f95-22ac-43c3-2343a68b7ee8.png)





```
Patch(
    sample_tbls,
    DataTable_sample_tbls.Selected,
    {
        Name:Name_DataCard1.Update,
        Comment:Comment_DataCard1.Update
    }
)
```
ts-nodeでCannot find name 'console'.エラーが出る

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

ts-nodeを実行したら`Cannot find name 'console'.`というエラーがでた

# 解決方法

```
$ npm install @types/node --save-dev
```

を実行することでエラーがでなくなった

# 参考

https://qiita.com/hogeJima/items/c8232504a2675f1b16b0
autoprefixerやpostCSS の実行時のエラー「ERROR: "postcss" exited with 1.」を回避する方法。

## 事象
現在のnodeの最新LTSバージョンは16系ですが、業務で少し古いnode12系のプロジェクトへautoprefixerを導入することがありました。
autoporefixerのタスクを作成し、実行したところ以下のようなエラーが発生しました。

```sh
/Users/xxxx/s/npm-sass/node_modules/yaml/dist/compose/composer.js:33
                if (prelude[i + 1]?.[0] !== '#')

/Users/xxxx/s/npm-sass/node_modules/yaml/dist/compose/composer.js:33

SyntaxError: Unexpected token '.'
    at wrapSafe (internal/modules/cjs/loader.js:915:16)
    at Module._compile (internal/modules/cjs/loader.js:963:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Module.require (internal/modules/cjs/loader.js:887:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/Users/xxxx/s/npm-sass/node_modules/yaml/dist/index.js:3:16)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
ERROR: "postcss" exited with 1.
```

## 解決方法
使用しているpostcss-cliのバージョンを１０未満に変更します。
[npmの該当ページ](URL "https://www.npmjs.com/package/postcss-cli?activeTab=versions")でバージョンを確認すると10未満の最新は、9.1.0なので以下のように変更します。package.jsonを以下のように変更します。

```diff:package.json
  ...
  "dependencies": {
-   "postcss-cli": "^10.0.0",
+   "postcss-cli": "9.1.0",
  },
```

その後、再インストールするの問題のエラーはなく動作することができました。
```sh
# 適宜、モジュールを削除してから再インストール。
rm -rf node_modules package-lock.json
npm i
```
ts-node-devを使ったホットリロードが効かない

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

ts-node-devを使うと

```
TypeError: The feature watch recursively is unavailable on the current platform, which is being used to run Node.js
```

となってホットリロードが効かなかった

# 解決方法

`--poll`オプションをつけるとできるようになった

```
$ npx ts-node-dev --respawn --poll install-typescript.ts
```

# 参考

https://qiita.com/reoring/items/eb4e367cf86ef82fc6a6
MySQLでsql: Scan error on column index 1, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

GoでMySQLを利用してレコード取得をしようとすると以下のエラーが発生しました

```
sql: Scan error on column index 1, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time
```

# 解決方法

DBの接続の語尾に`?parseTime=true`をつけたら成功しました

```go:main.go
var connect = fmt.Sprintf("%s:%s@%s/%s?parseTime=true", "root", "password", "tcp(db:3306)", "myapp")
```

# 参考

https://budougumi0617.github.io/2019/03/31/go_db_unsupported_scan_storing_driver_value_type_uint8_into_type_time_time/
VSCodeのGoの拡張機能でエラーがでる (DockerでGoをやるうえでの注意)

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

VSCode+WSL2+Docker+Goの環境でGOの拡張機能をいれたところ、起動時にVSCodeの左下に以下のエラーがでるようになりました

```
failed to find the "go" binary in either goroot()....
```

# 解決方法

これはローカルにGOをインストールすることで解決できました

https://blog.nya-n.net/posts/post-1853/

https://qiita.com/sola-msr/items/93fbf9c988ee81a2f196

またインストールしたところ以下のエラーに変わりました

```
the "gopls" command is not available. run "go install -v golang.org/x/tools/gopls@latest" to install.
```

WSL2で以下のコマンドを実行

```
$ sudo apt-get update
$ sudo apt install build-essential
```

そのあとエラーにあるAll installボタンをクリックすると直りました

# 注意

コンテナの中でGoを実行する場合はDockerfileにGoの拡張に必要なライブラリをいれて、そのあとリモートコンテナで開発する必要があります

ローカルのGo拡張を利用するとローカルのGOPATHのライブラリを参照するため、コンテナの中にはあるけどVSCodeの拡張的にはライブラリがないので赤線でエラーを表示してしまうからです

以下をDockerfileに加えてリモートコンテナでGoコンテナに入り拡張機能をインストールすることで利用できました

```Dockerfile:Dockerfile
# for Vscode extension
RUN go install github.com/ramya-rao-a/go-outline@latest
RUN go install golang.org/x/tools/gopls@latest
```
論理演算の種類

論理演算の種類には下記があります。

## AND（論理積）：どちらの条件も満たす
真偽値表
| 入力A | 入力B | 論理演算結果 |
|:-:|:-:|:-:|
| 0  |  0 |0|
| 0  |  1 |0|
|  1 | 0  |0|
|  1 |  1 |1|

#### 論理演算子は「&」

両方のビットが共に1の場合だけ1になります。
```java
System.out.println(85 & 15);
// 実行結果：5
```

85=0000 0000 0000 0000 0000 0000 0101 0101
15=0000 0000 0000 0000 0000 0000 0000 1111
05=0000 0000 0000 0000 0000 0000 0000 0101
実行結果＝5


## OR（論理和）：どちらかの条件を満たす

真偽値表
| 入力A | 入力B | 論理演算結果 |
|:-:|:-:|:-:|
| 0  |  0 |0|
| 0  |  1 |1|
|  1 | 0  |1|
|  1 |  1 |1|

#### 論理演算子は「|」

少なくもどちらか一つのビットが1の場合、1になります。

```java
System.out.println(85 | 15);
// 実行結果：95
```
85=0000 0000 0000 0000 0000 0000 0101 0101
15=0000 0000 0000 0000 0000 0000 0000 1111
95=0000 0000 0000 0000 0000 0000 0101 1111
実行結果＝95


## NAND（Not AND）：ANDの否定

真偽値表は、ANDの反転になります。
| 入力A | 入力B | 論理演算結果 |
|:-:|:-:|:-:|
| 0  |  0 |1|
| 0  |  1 |1|
|  1 | 0  |1|
|  1 |  1 |0|

#### 論理演算子はない模様？


## NOR（Not OR）：ORの否定

真偽値表は、ORの反転となります。
| 入力A | 入力B | 論理演算結果 |
|:-:|:-:|:-:|
| 0  |  0 |1|
| 0  |  1 |0|
|  1 | 0  |0|
|  1 |  1 |0|

#### 論理演算子はない模様？


## XOR（排他的論理和）：ORの重複部分を排除したもの

真偽値表は、「両方とも1」の結果がORと異なります。
| 入力A | 入力B | 論理演算結果 |
|:-:|:-:|:-:|
| 0  |  0 |0|
| 0  |  1 |1|
|  1 | 0  |1|
|  1 |  1 |0|

#### 論理演算子は「^」
どちらかのビット一つだけ1の場合に1になり、両方1の場合と両方0の場合は0になります。

```java
System.out.println(85 ^ 15);
// 実行結果：90
```

85=0000 0000 0000 0000 0000 0000 0101 0101
15=0000 0000 0000 0000 0000 0000 0000 1111
90=0000 0000 0000 0000 0000 0000 0101 1010
実行結果：90
DockerでGoのパッケージが読み込めない(自作パッケージが読み込めない)

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Goコンテナの中で自分で作成したパッケージ(関数)をインポートしようとして呼び出そうとしたがエラーになった
書籍では同じ方法でできているのでおかしい

# 解決方法

`go.mod`を利用してパッケージを読み込みする必要があった

https://qiita.com/kazuma_M/items/75d522668d42247075f1
JavaScriptのクリックイベントのアクションが実行されない

# はじめに

この記事は2022年4月にまとめていた「細かいつまずいたことをメモしておく(4月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

以下のようなJavaScriptをjQueryで書いていました

```
$('#test').click(function() {
  console.log('クリックされました！');
})
```

しかし、ID(test)のある属性をクリックしても何も起きませんでした
次にJquery自体が読み込めているのか確認するために、以下を実行することにしました

```
$(function(){
  alert('jQuery is ready.')
});
```

するとうまく実行できました

# 解決方法

avaScriptのDOMが準備される前に実行されているという根本的なところが抜けていました
Jqueryを実行するには$(document).ready(function(){の中に処理を書く必要があります

```
$(document).ready(function(){
  $('#test').click(function() {
    console.log('クリックされました！');
  })
}
```

また、アラートが成功したのはDOM操作が存在しないためでした
初心者なミスをするとは思ってませんでした