OmniAICreator/Qiita-1.07M huggingface dataset:
Android TextViewでOS標準のコピーを使用できるようにする方法

今回はTextViewでOS標準のコピーを使用できるようにする方法です。

EditTextでは特に設定などせずに標準のコピー、ペーストができるので、意識したことないのですが、TextViewでは設定しないとコピーができないみたいです。


xmlに設定を追加するだけでコピー可能になります。

```
android:textIsSelectable="true"
```

こちらをTextViewの設定に追加するだけです。

以上です。
STM32L010のMbed2での時計,DS1307で時刻表示OLED,OLED096UNO-A


stm32g031,stm32l010用に最軽量化したもの


x 時間合わせは、別


x 電源投入直後のOLEDのリセットでまれに失敗する。対策は、電源を入れ直す。
x ライブラリをインストールできる人
x Mbed2のリビジョンを変更できる人
x OLEDのライブラリをインストールしてください(SMALL_SSD1308_128x64_I2C)
x Mbed2リビジョン125



1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

SSD1306 128x64


![o_con626.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6620644d-9e17-dd54-4726-725b09ccb93f.jpeg)




過去ログを見よ!!


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




i2c_oled16x24_64_ds1307_010_1


```c++

//i2c_oled16x24_64_ds1307_010_1

#include "mbed.h"
#include "SSD1308.h"

//メイン関数
int main()
{
//i2c initialization
#if defined(TARGET_NUCLEO_F767ZI)
    I2C i2c(I2C_SDA, I2C_SCL); //767
#endif
#if defined(TARGET_NUCLEO_L011K4)
    I2C i2c(PA_10, PA_9); //010
#endif

    // Instantiate OLED
    SSD1308 oled = SSD1308( &i2c, SSD1308_SA0);

    char data_read[7]; //リードバッファー
    char n1_8[8]; //バッファー


    int oo=0;

    while(1) {

        //時間の読み込み
        i2c.write( (0xD0), "\000", 1);
        i2c.read(  (0xD0) | 1, data_read, 7);

        //温度の表示
        n1_8[0]= '0'+(data_read[2] >> 4);
        n1_8[1]= '0'+(data_read[2] & 0xf);
        n1_8[2]= '.';
        n1_8[3]= '0'+(data_read[1] >> 4);
        n1_8[4]= '0'+(data_read[1] & 0xf);
        n1_8[5]= '.';
        n1_8[6]= '0'+(data_read[0] >> 4);
        n1_8[7]= '0'+(data_read[0] & 0xf);
        for(int nn=0; nn<8; nn++) {
            //                y   x
            oled.writeBigChar(0, nn*16,n1_8[nn]);
        } //for


        //リセット対策
        oo++;
        if(oo >= 3) {
            i2c.write( ( 0x3c<<1), "\200\215\200\024\200\257", 6);
            oo=0;
        }

        //1秒待つ
        wait_ms(1000);
    }//while
}//main

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



```
css propを使うとき、自作コンポーネントのプロパティに'css'という名前は使えない

# 結論
プロパティ名を'css'から'style'等の別名に変えればOK。
以上。

当方の環境は
- @emotion/reactでスタイリングしている
- typescriptのjsxImportSourceに@emotion/reactを入れることでcss propを実現
```json:tsconfig.json
{
  "compilerOptions": {
    "jsxImportSource": "@emotion/react"
  }
}
```

# 現象：ReactのPropsでcss(スタイリング)情報を渡せない
以下のコードをデバッグ実行したところ、子コンポーネントのprops.cssがデフォルト値のままでした。
```typescript:parentComponent.tsx
function ParentComponent(){
    return (
        <ChildComponent css={{backgroundColor:'black'}} />
    )
}
```
```typescript:childComponent.tsx
import {css,Interpolation,Theme} from '@emotion/react';

interface Props{
    css?:Interpolation<Theme>;
}

export function ChildComponent(props:Props){
    const {css:style}=props;
    return (
        <div css={[{width:'10px',height:'10px'},style]} />
    )
}
ChildComponent.defaultProps={css:css({})}
```
困った。

# 解決：子コンポーネントのprop名を'css'以外にしたら通った
上記の通りです。
```typescript:parentComponent.tsx
function ParentComponent(){
    return (
        <ChildComponent style={{backgroundColor:'black'}} />
    )
}
```
```typescript:childComponent.tsx
import {css,Interpolation,Theme} from '@emotion/react';

interface Props{
    style?:Interpolation<Theme>;
}

export function ChildComponent(props:Props){
    const {style}=props;
    return (
        <div css={[{width:'10px',height:'10px'},style]} />
    )
}
ChildComponent.defaultProps={style:css({})}
```

# 原因(推測)：'css'という名称のバッティング
- @emotion/reactでデフォルトでcss propを持つ設定にしている
- 子コンポーネント自身がcssというprop名を持っている

上記の場合、css propがで定義している方のプロパティが優先される仕様であると思われます。

## 手こずった要因
css propは、自身で定義したコンポーネントの場合、cssというpropを与えません。
実際、自作コンポーネントにcssというプロパティを与えようとするとコンパイルエラーとなります。
そのため自作コンポーネントでは'css'という名称はcss propには使用されていないという認識でした。

しかしどうやらcssという名前のプロパティは、トランスパイルする過程でcss propとして優先して処理されるようです。
トランスパイル前はcssというプロパティはたしかに存在しなかったため、名称のバッティングという可能性を考慮できませんでした。

理屈的にはESLintの設定を弄っていいかんじにする方法があるかも。
ReactでdivにonClickを持たせたい

# なんとかしたいこと
ReactでdivにonClick属性を持たせようとしたら、以下の二つのエラーが出た。
[click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md)
[no-static-element-interactions](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-static-element-interactions.md)
これをなんとかしたい

# 環境
- ReactをTypeScriptで書いてる
- ESLintにAirbnb記法を勉強のために厳格めに入れてる

# 解決
原因はアクセシビリティに問題があるって話です。てかリファレンスにそう書いてあります。
アクセシビリティを解決できればいいのでやり方は何パターンかありますが、
[リファレンスに書いてあるような方法](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-static-element-interactions.md)が王道だと思います。
```typescript
<div
  onClick={()=>{onClickHandler()}}
  onKeyPress={(e)={
    if(e.key==="Enter")onClickHandler();
    }}
  role="button"
  tabIndex="0">
  hoge
</div>
```
っていう風に、onClickの他に
- onKeyPress
- role
- tabIndex

の三つを追加すればいいです。

# 理解しよう
アクセシビリティとは、要は「身体障害者でも使えるWebページ」って意味です。
「このままだと一部の身体障害者が使えないWebページになるぜ」って怒られてたんですね。

今回怒られてるのは、主にマウスを使えない人が使用できないっていう点です。
言い換えると、キーボードだけで行えない操作を作っているってことです。

例えばbuttonなどは「イベントを発火するための要素」なので、ブラウザが自動でキーボードだけでイベントを発火可能なようにしてくれます。
つまりブラウザがアクセシビリティを保証してくれます。
しかしdivは本来そういった意味を持つ要素じゃないので、「このdivはbuttonのようにイベントを発火するよ」と明示的にブラウザに教えてあげないといけません。

```typescript
role="button"
```
とすることで、「このdivはbuttonとして動作するよ」と宣言しています。
```typescript
tabIndex="0"
```
とすることで、「Tabキーでこのdivにフォーカスを当てることができるよ」と宣言しています。
```typescript
onKeyPress={(e)={
    if(e.key==="Enter")onClickHandler();
    }}
```
とすることで、「フォーカスが当たってるときEnterキーを押せばクリックと同じ動作になるよ」と宣言しています。

これでTabとEnterで、つまりマウスなしでイベントを発火できるようになりました。
たしかにアクセシビリティが改善されましたね。

# 参考
[非対話型コンテンツにclickイベントを設定してはいけない理由](https://www.dkrk-blog.net/html/img_click_dame_zettai)

以上。
【RealmSwift】Widget対応後に「Missing required modules: 'Realm.Private', 'Realm'」というエラーが出たら

# 概要

RealmSwiftを入れたアプリを開発中にWidget対応を行った際、
```
Missing required modules: 'Realm.Private', 'Realm'
```
というエラーが発生するようになった場合についての対策です。

# 方法
Widgetのために追加したTARGETからRealmへの参照がなされていないのが原因のようです。

Navigatorから開いているプロジェクトを選択し、出てきた画面の「TARGETS」から追加したウィジェットを選択します。
上のタブの **「Build Phases」** を選択し、 **「Link Binary With Libraries」** を開いて＋ボタンを押し、一覧からRealmとRealmSwiftを追加すればエラーが解消されます。
SQLでデータベースを操作する

# SQL
データベースに溜め込んだデータを活用しなくてはならない。
そのためにSQLというものがある。
それは表を定義（CREATE文),レコードを挿入（UPDATE文)、削除（DELETE文)、更新(UPDATE文)をしたりできる。
これらの命令は
* スキーマの定義や表の作成といった定義を担当する```データ定義言語```(DDL: Data DEfinition Language)
* データの抽出や挿入、更新、削除といった操作を担当する```データ操作言語(DML:Data Manipulation Language)```
に大別できる。

# SQL文の処理
### クエリ実行までの流れ
受けたクエリ（問い合わせ）の実行までの流れは、```構文解析⇨オプティマイザ（最適化）⇨コード生成⇨実行```
といった順で処理される。

### オプティマイザ
```SQLによるクエリに対して、最も効率がいいように最適化を行う```こと
具体的には、アクセス経路（順次検索かインデックスを使うかなど）や結合方法の選択がある。

# SELECT文の基本的な書式
基本は```どうのような条件で```、```どの表から```、```どの列を取り出すか```　になる。
これを指定することによってデータベースから多様なデータを取り出すことができる。

```SELECT 列名 FROM表名 WHERE 条件```
SELECTは```どの列を取り出すか?```
FROMは```どの表から?```
WHEREは```どのような条件で？```

## 特定の列を抽出する(射影)
関係演算の一つ射影で列を取り出す。
```*(アスタリスク)```を列で指定すると全ての列が抽出対象となる。

## 特定の表の抽出(選択)
関係演算の一つ選択で行を取り出す。
WHERE句を使って、取り出したい行の条件を指定します。

### 比較演算子
このWHER句は```比較演算子```を用いて条件を指定する。
* ＝　：等しい。
* ＞　：大きい
* ＞＝：以上
* ＜　：小さい
* ＜　：以下
* ＜＞：等しくない。

### 条件を組み合わせて抽出する
複数の条件を組み合わせるには、```論理演算子```を用いる。
```AND```,```OR```,```NOT```がある。
WHERE句で使う。
比較演算子に```かつ```を持たせるには```AND```
```または```を持たせるには```OR```
```ではない```を持たせるには```NOT```

#### 論理演算子の優先順位
論理演算子には優先順位がある。
```NOT>AND>OR```になる。

## 表と表を結合する(結合)
```表と表をくっつける```関係演算。
WHERE句でどの列を使ってくっつけるかを指定します。
```
   SELECT *
     FROM 受注表、顧客表
    WHERE 受注表.顧客コード　＝　顧客表.顧客コード
```
```受注表.顧客コード```の```.```はどの表のどの列かを表すために用いられている。
```結合させる列名が同じ名前同士である必要はない```

## データを整列させる
```ORDER BY句```で抽出結果を整列させる。
```ASCは昇順```、```DESCは降順```
```
ORDER BY 列名 ASC(またはDESC)
```
```
SELCT * FROM 商品表　ORDER BY 単価
```
```デフォルトで昇順```なのでASCは省略できる。

```
  SELECT 顧客コード,受注No,受注日付
    FROM 受注表
ORDER BY 顧客コード, 受注日 DESC
```

## 関数を使って集計を行う
SQLにはデータを取り出す際に集計を行う。さまざまな関数（```集合関数```と言う）が用意されています。
これを用いると列の合計や、最大値、レコードの件数などを求めることができる。

### MAX（列名）
その列の最大値を求める。

### MIN(列名)
その列の最小値を求める。

### AVG(列名)
その列の平均値を求める。

### SUM（列名)
その列の合計を求める。

### COUNT(*)
行数を求める。

### COUNT(列名)
その列の「列が入っている(空値じゃない)」　行数を求める。

## データをグループ化する
特定の列をさしてその中身が一致する項目をひとまとめにして扱うことをいう。
```GROUP BY句```を使う。
グループ化して、グループの中でまた処理ができたりする。

```
GROUP BY 列名
```

## グループに条件をつけて絞り込む
グループ化した際、条件をつけて取り出すグループを絞り込むことができる。
```HAVING句```を使いグループ化内の絞り込み処理を行う。

```
  SELECT 分類,AVG(単価)
    FROM 商品分類表
GROUP BY 分類
  HAVING AVG(単価）>100
```
単価が１００より大きい　グループの分類と平均単価を表示する。

# 気づき
SQLを勉強していたため割合知っているところが出た。
なので気づきがここだけになった。
次も頑張る

# 関連記事
https://qiita.com/masatom86650860/items/2e8da0c41da16056eaa5

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

https://gihyo.jp/book/2020/978-4-297-11781-8
AppleScriptで曲を再生・一時停止する、Bluetoothを設定する

曲を再生・一時停止するAppleScript。
```
tell application "System Events"
	tell its application process "ControlCenter"
		set menuBarItems to menu bar items of menu bar 1
		repeat with p in menuBarItems
			if name of p contains "再生中" then
				click (first menu bar item whose name is "再生中") of menu bar 1
				tell group 1 of first item of windows
					set all_Elements to (the name of every button)
					repeat with q in all_Elements
						try
							click button "再生" of group 1 of window "コントロールセンター" of application process "ControlCenter" of application "System Events"
							
						end try
						try
							click button "一時停止" of group 1 of window "コントロールセンター" of application process "ControlCenter" of application "System Events"
						end try
					end repeat
					
				end tell
				key code 53
			end if
		end repeat
	end tell
end tell
```
AppleScriptで接続するBluetoothを設定する。
```
set Bluetooth_device to "Soundcore Life P3" --ここにあなたのBluetoothデバイスの名前 
tell application "System Events"
	tell its application process "ControlCenter"
		set btMenu to (menu bar item "Bluetooth" of menu bar 1)
		click (menu bar item "Bluetooth" of menu bar 1)
		tell group 1 of first item of windows
			every UI element 
			tell scroll area 1
				every UI element 
				try
					click checkbox Bluetooth_device of scroll area 1 of group 1 of window "コントロールセンター" of application process "ControlCenter" of application "System Events"
				end try
			end tell
		end tell
	end tell
end tell
```
item2のプロファイルをそのままコピーする方法

# はじめに
最近メインパソコンを変えた。
ずっと昔の研究環境が残っておりごちゃごちゃした感じだったので、ゼロから環境構築をしている。

その際にめんどくさいなと思ったのがitem2の環境移行である。
複数のサーバーで研究しており、ひと目でどのサーバーのターミナルか判別できるようにそれぞれプロファイルを変えている。
これらを1から構築し直すのは大変すぎるので少し調べてみたのだが、あまり情報がなかった。
そこで自分の備忘録としてここに残すことにした。

# 方法
1. iterm2 の設定を開き Profiles を開く。
2. 下にある Other Actions... 内の
3. Save All Profiles as Json... を押し任意の場所に保存する。（ドライブだと簡単に移行できる）
4. 移行したい環境で　Import Json Profiles... で上で指定した場所を読み込めばよい。

![quiita_2022-08-07_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355559/8a854469-e6ca-5b24-5132-662d8e4ab8c6.png)

以上。
rundeckがdocker-composeで起動しなかった話

# 結論
rundeckのJDBCドライバが`mysql`になっていたので`mariadb`に変更したら起動した。
```:docker-compose.yml (抜粋):
RUNDECK_DATABASE_DRIVER: org.mysql.jdbc.Driver
                               ↓
RUNDECK_DATABASE_DRIVER: org.mariadb.jdbc.Driver
```
独習JavaScript（6章　関数）

# 独習JavaScriptのメモ
本は[こちら](https://www.shoeisha.co.jp/book/detail/9784798160276 "独習JavaScript")

## はじめに
* 今までJavaScriptは、ほぼ雰囲気で使っていた。が、ごまかしがきかなくなってきた。
* ので、（必要に迫られて）本書を手に取った。当初は基礎を総点検するのが目的だった。
* やり始めると知らなこと、理解が曖昧なモノが思いのほか多かった。なのでメモとして残す。
* 実務では利用しなさそうなモノもありそう。だが知識として残す。

### 6章　関数
#### argumentsオブジェクト
引数は関数内でのみ利用できるargmentsというオブジェクトに格納される。
ただ使わないと思うし使われているのを見たことも無い。知識として。

```javascript:argument.js
function f_sum() { // 引数の定義なし
    return arguments[0] + arguments[1];
}

console.log(f_sum(2,3));
// ----> 5
```

#### 関数宣言より前で関数の実行を記述できる。
言われてみればそうだけど、改めて見てみると気持ち悪い。
```javascript:function_call.js
console.log(f_sum(2,3)); // 関数実行文
// ----> 5

function f_sum(foo, bar) { // 関数定義
    return foo + bar;
}
```
#### 関数定義で引数のdefault値が書ける。
仮引数がundefindedの場合にdefault値が設定される。
これもあまり利用シーンは無いのかも。
```javascript:default.js
function calc(foo, tax=8) { // 引数の定義なし
    return foo +(foo * (tax/100));
}

console.log(calc(100)); // taxを省略
// ----> 108

console.log(calc(100,undefined)); // 明示的にundefinedしても同じ
// ----> 108

console.log(calc(100,10)); // 記載すればその値が使われる
// ----> 110

console.log(calc(100,null)); // nullは0に変換されるらしい
// ----> 100
```

ちなみにNull合体の自己代入でも似た実装が実装できる。
```javascript:default.js
function calc(foo, tax) { // 引数の定義なし
    tax ??= 8; // 引数taxがNull,undefinedの場合は8を設定する。
    return foo +(foo * (tax/100));
}

console.log(calc(100)); // taxを省略
// ----> 108

console.log(calc(100,undefined)); // 明示的にundefinedしても同じ
// ----> 108

console.log(calc(100,10)); // 記載すればその値が使われる
// ----> 110

console.log(calc(100,null)); // tax ??= 8によって8で計算される。
// ----> 100
```
#### コールバック関数
他の関数の引数に渡す関数。
```javascript:callback.js
function stopwatch(seconds) {
    alert(seconds + "秒経過しました。");
}

setTimeout(stopwatch,5000,5);
// ----> 5秒経過しました。
```

#### 無名関数
コールバック関数は大体無名関数で定義する。対して名前の有る関数を『名前付き関数』と呼ぶ。
```javascript:anonymous.js
setTimeout(function(seconds) { // <---関数名は定義なし
    alert(seconds + "秒経過しました。")
    },5000,5);
// ----> 5秒経過しました。

const fn1 = function(seconds) {alert(seconds + "秒経過しました。")}
// > 関数を変数fn1に代入
setTimeout(fn1,5000,5);
// > fn1をコールバック関数として引数に設定 
// ----> 5秒経過しました。（同じ結果）
```

#### アロー関数
アロー関数は『無名関数』の省略記法。
引数は『()』、処理は『{}』で記載し『=>』でつなげる。
```javascript:arrow.js
const arrow = () => { 処理; }
```

ちなみに色々省略で書ける。
```javascript:arrow.js
// 引数が一つの場合は『()』が省略できる。
const arrow = arg1 => { 処理; }

// 処理（関数の本文）が1文の場合は『{}』と『return』が省略できる。
const arrow = () => 処理;
// 処理が戻り値になる。

// 戻り値がオブジェクトの場合
const arrow = () => {return ({one:1, two:2, three:3})} // オブジェクトは『()』で括る。
console.log(f());
// -----> {"one": 1,"two": 2,"three": 3}

const arrow = () => ({one:1, two:2, three:3}) // 同様に処理が1文の場合は『{}』を省略できる。
console.log(f());
// -----> {"one": 1,"two": 2,"three": 3}
```

#### 無名関数とアロー関数は挙動が異なる。
（今の段階では）基本はアロー関数で書いとけ、と思ってよさそう。

| キーワード | 無名関数 | アロー関数 |
|:-|:-|:-|
|this|thisを持つ|thisを持たない|
|arguments|argumentsを持つ|argumentsを持たない|
|new|インスタンス化が可能|インスタンス化が不可|
|prototype|prototypeを持つ|prototypeを持たない|
Bit演算子について

うす、豚野郎です。
最近、このQiitaの存在を会社の人にバラしたら
「おっす！豚野郎です！」といじられました。

さて、今回はBit演算子について書いていこうと思います。
プログラムでも2進数が使えることを初めて知りました。

公式ドキュメントに沿って書いていこうと思います。
https://www.php.net/manual/ja/language.operators.bitwise.php

・バージョン：PHP 7.4.29

順番的に以下の順番で書いていきます。
1.ビット積
2.ビット和
3.排他的論理和
4.否定
5.左シフト
6.右シフト

## 1. ビット積
> $a および $b の両方にセットされているビットがセットされます

ここでは3と5を例に書いていきます。
10は二進数だと1010、15は二進数だと1111です。

この場合、ビット積は1010になるので、結果は10になるはずなので検証します。
```bit.php
<?php

    $a = 10;
    $b = 15;

    echo $a & $b;

?>
```

結果
```
10
```


## 2. ビット和
> $a または $b のどちらかにセットされているビットがセットされます

ここでは8と5を例に書いていきます。
8は二進数だと1000、5は二進数だと101です。

この場合、ビット和は1101になるので、結果は13になるはずなので検証します。
```bit.php
<?php

    $a = 8;
    $b = 5;

    echo $a | $b;

?>
```

結果
```
13
```

## 3. 排他的論理和
> $a または $b のどちらか一方にセットされており、両方にセットされていないビットがセットされます

ここでは3と5を例に書いていきます。
6は二進数だと110、3は二進数だと11です。

この場合、排他的論理和は101になるので、数字だと5になるはずなので検証します。
```bit.php
<?php

    $a = 6;
    $b = 3;

    echo $a ^ $b;

?>
```

結果
```
5
```


## 4. 否定
> $a にセットされているビットはセットせず、そうでないものは逆にします

ここでは8を例に書いていきます。
8は二進数だと1000です。

この場合、否定は0111になるので、数字だと7になるはずなので検証します。

```bit.php
<?php

    $a = 8;

    echo ~$a;

?>
```

結果
```
-9
```

なぜだ。
$aを9にすると、結果は-10になる。
2進数に変換してみます。
・参考：https://www.sejuku.net/blog/78679

```bit.php
<?php

    $a = 8;

    echo decbin(~$a);

?>
```

結果
```
1111111111111111111111111111111111111111111111111111111111110111
```

64桁になりました。
最初の4桁が否定になり、残りは0が反転され1になってます。

結果を7にしたい場合、以下の様にする必要があります。

```bit.php
<?php

    $a = 8;

    echo ~8 & 0b1111;

?>
```

結果
```
7
```


## 5. 左シフト
> $a のビットを左に $b ビットシフトする (各シフトは "2をかける" ことを意味します)

ここでは5を例に書いていきます。
左シフトすると2倍になります。
この場合、左シフトは1010になるので、数字だと10になるはずなので検証します。
```bit.php
<?php

    $a = 5;
    $b = 1;

    echo $a << $b;

?>
```

結果
```
10
```

## 6. 右シフト
> $a のビットを右に $b ビットシフトします (各シフトは "2で割る" ことを意味します)

右へシフトすると1/2になります。

ここでは8を例に書いていきます。
この場合、右シフトは0100になるので、数字だと4になるはずなので検証します。

```bit.php
<?php

    $a = 8;
    $b = 1;

    echo $a >> $b;

?>
```

結果
```
4
```

では、奇数だとどうなるでしょうか？
7は二進数で111になるので、どうなるか検証します。
予想は11になるため、3になります。(1/2ではありませんが)

```bit.php
<?php

    $a = 7;
    $b = 1;

    echo $a >> $b;

?>
```

結果
```
3
```

想定通りでした。
GORMで動的なSQLの実行や検索のやり方

# やり方
GORMで動的なSQLの実行や検索を行いたい場合は、以下のようにGORMのSQLメソッドのDBインスタンスを受け取って、そのインスタンスでSQLを実行する必要があります。
```go
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
db = db.Table("test_table").Select("*")

// 動的に実行したいSQL
db = db.Where("検索条件")

// SQLの実行
rows, err := db.Rows()
```

# 例
例えば`test.db`に以下の`user`というテーブルがあったとします。
|id  |name  |
|---|---|
|1  |たかし |

`user`テーブルのたかしの情報を検索したい場合、以下の様なコードを実行すれば、情報の取得ができます。
```go
type User struct {
	Id int
    Name string
}

func main(){
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	db.Table("test_table").Select("*")

    // たかしの検索
	db = db.Where("name LIKE %たかし%")

    // SQLの実行
    user := &User{}
    db.Find(user)
}
```

# 最後に
GROMで動的なSQLの実行や検索のやり方についての記事がなかったため、本記事を作成いたしました。
今度はより分かりやすく具体的な例を作成したいので、Echoと組み合わせた記事を作成したいです。
二次元ヒストグラムの最大値は一次元ヒストグラムの最大値と一致するとは限らない


とても馬鹿な筆者のための、忘備録。

二次元ヒストグラムの最大値は一次元ヒストグラムの最大値と一致するとは限らないと気が付いたが、本当にそうなのかを確かめたかった。

つまり下図のように、x, y方向の一次元ヒストグラムがガウシアンのようであっても、二次元ヒストグラム次第では最大値は一致しない。

<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221968/6edf271c-f3db-8ddc-9d5e-915dbb06f69d.png">

xの最頻値を二次元ヒストグラムのピーク位置から求めると、誤ってしまう例でもある。
（1次元ヒストグラムのxのピークを読みましょう）

```Python
import numpy as np
import pandas as pd

import seaborn as sns
import matplotlib.pyplot as plt

h = np.asarray((
    (3,5),
    (3,5),
    (3,5),
    (3,5),
    (4,4),
    (4,4),
    (4,5),
    (4,5),
    (4,6),
    (4,6),
    (5,1),
    (5,2),
    (5,3),
    (5,4),
    (5,5),
    (5,6),
    (5,7),
    (5,8),
    (5,9),
    (6,3),
    (6,4),
    (6,5),
    (6,6),
    (6,7),
    (7,4),
    (7,5),
    (7,6),
    ))

df = pd.DataFrame(data=h,columns=['x','y'],dtype='uint8')

x_name = 'x'
y_name = 'y'

x_data = df['x']
y_data = df['y']

sns.jointplot(x = x_data, y = y_data,kind='kde',xlim=[0,10],ylim=[0,10])
plt.xlabel(x_name)
plt.ylabel(y_name)
plt.show()

```
FlutterをVSCodeにて実行

FlutterをVSCodeを利用して編集、実行(iPhone mobile,mobile emulator,Chrome web,macOS desktop)
する為の設定方法。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/4eb35b3e-d07d-42ae-c496-bd96f6032b57.png" width="60%">
VSCodeにFutterの拡張機能追加で下記のようにRUN|Debug|Prfileが表示される。RUNクリックでエミュレータにて実行可能。
![スクリーンショット 2022-08-07 15.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/a2a2be69-9354-3b3a-6174-e0bd3ef7a265.png)
下記の様にVSCodeの右下部の端クリックで(iPhone mobile,mobile emulator,Chrome web,macOS desktop)を選択可能。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/54ee304b-342d-5fc8-199a-4816fe355879.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/51e42b47-2d7e-1f3d-0288-c190b2ca3c32.png" width="30%">
vi（ブイアイ：エディタ） 機能覚え

# 導入
docker上で作業するときに、

```ubuntu:bash
# apt install -y vim
````

でvimを導入して作業することがある。vimというコマンド名のVi Improvedというソフトがubuntu/debianには入っている。viというソフトは導入できない。残念ながら素（す）のdockerのubuntuにはvi/vimは入っていない。最初に導入しよう。

素のdocker のubuntuとは、

```macOS:bash
$ docker run -it ubuntu /bin/bash
```

という公式ubuntuだけを入れた場合のことです。


# 経験

プログラマの１日のうち、エディタ上で作業している時間と、コマンドプロンプト上で作業している時間と、GUIを操作している時間の比率は、仕事の種類によって千差万別だろう。　例えば、こんな感じかなって。

|職業|エディタ| コマンド|GUI|
|:--|--:|--:|--:|
|プログラマ|60|30|10|
|WEBフロント|20|20|60|

エディタの機能をちゃんと勉強してから操作するというPDCA的な方もいれば、まず使ってみて、それから少しづつ調べていくというDoCAPな人もいるだろう。


## ソフト別エディタ編集時間

mi >vz > mifes >  visual code > その他のdos/windowsエディタ> Eclipse > vi > Emacs(mule) の順な感じ。viはEclipseよりも短い時間そうだしていて、Emacs(mule)よりは長い時間操作している。viを含む最後の３つはほとんど習熟していないかも。

よく考えてみると、編集時間は短いが、起動回数は一番多いかもしれない。

編集器vi時間は短いが使用回数断凸多い #短歌　

## ソフト別エディタ起動回数

vi >  その他のdos/windowsエディタ > mi > Eclipse > vz > mifes >  Emacs(mule) 

vi, その他のdos/windowsエディタは、必要に応じて起動する。それ以外は、ずっと起動しっぱなし。起動回数は全然違う。主にdocker上のubuntuでのちょこちょこ作業が１日のうち、多い場合で100回くらい。その度に起動している。他のエディタは、最長100日起動しっぱなし。年に5-10 回起動。比べ物にならないかも。

エディタの移植をしてから作業を始めるのは、DoCAPというよりは、小川メソッドって言われているらしい。


# 起動

vi file.name
シェルでviを起動する方法。起動しなきゃはじまらない。起動したすぐは制御状態。

viできどうすろ。しゅうりょうじにファイル名指定するのはお薦めしない。さいしょからを指定して編集しよう。(個人の感想です)
# 制御状態・入力状態

viには、制御状態と入力状態がある。入力状態ではキーボードで打った文字を入力する。制御状態ではキーボードを打った文字列は制御命令として解釈する。

みだしの（）書きは、どの状態で受け付けるかを示す。


# 入力状態へ遷移（制御状態）

i　入力状態移行。今の場所に文字入力。
a　入力状態移行。今の場所の後ろに文字入力。
s 現在の文字を置換する。

# 制御状態へ遷移。(入力状態)

[esc]キーを押す

# 保存・終了（制御状態）

:wq 現在編注中のファイルを保存して終了する。:がコマンドモードへの変更。W(write：書き込み), a(quit：終了)

:q! 編集したけど間違ったので破棄する。qだけだと編集履歴があると終われない。

# カーソル移動 hjkl （制御状態）
hjklは、Qwertyキーボードで横にならんでいる文字群。


h　 1文字左へ
j　 1行下へ
k　 1行上へ
l　 1文字右へ

ドル記号はキーボードによって位置が違うかもしれない。

o　 カーソルを行頭へ
$　 カーソルを行末へ



# 行コピペ（制御状態）

Y　 今の行を複写(copy)
p　 貼り付け(paste)


# 文字削除(制御状態）

x　 今の場所を１文字削除
dd　 今の行を１行削除
xdd　 x行削除


# 検索(search slash) （制御状態）

/str　 str文字列を検索
?str　 str文字列を逆向き検索
n　 　　次候補検索

# 範囲（制御状態）

v 範囲選択
V 行
ctl + v 矩形範囲


# 操作取り消し(undo) 

u　 操作を取り消し

# 参考資料(reference)　


viの使い方

https://qiita.com/jojo232/items/1ffee0b7e0324d854e75

viコマンド

https://qiita.com/may-bee-39/items/2164819b2e27f512eefe

Linux　viについて

https://qiita.com/savaniased/items/f3b5592443a87b31ff35

vi commandについて

https://qiita.com/daisukesasaki/items/a928c92569a206bfe8e4

vi 手習い

https://qiita.com/suzuki-kei/items/8523ccafe42eed2a269a

サーバの編集でたまにviを使う人間のviメモ

https://qiita.com/zaburo/items/394d68bc87f08479d779

# 自己参照　

VZエディタ移植に当たって実施したことと成果。仮説・検証(115)


https://qiita.com/kaizen_nagoya/items/5551be98dcbed8f41949


あなたもdocker, 私もdocker。docker(130)

https://qiita.com/kaizen_nagoya/items/8f2746f10f30b575d0a8

DoCAP（ドゥーキャップ）って何ですか？

https://qiita.com/kaizen_nagoya/items/47e0e6509ab792c43327

小川メソッド　覚え（書きかけ）

https://qiita.com/kaizen_nagoya/items/3593d72eca551742df68


## 短歌　
編集器 v i (ブイアイ)時間は短いが使用回数断凸多い #短歌 

編集器(editor)編集者(editor)が使う機能あり。差分翻訳整形清書。#返歌 

医療用翻訳ソフトの講習を受けたとき、説明のあった便利機能の半分以上が同梱しているMifesの機能だったことがある。 #IT業界あるある 。推理小説業界では高千穂遥のおかげで、Writer（作家）がたくさんVZエディタを利用してくださった。医療業界でも利用者は結構いた。みんなに広めてくれるような有名人がいなかったのかもしれない。

VZエディタで、vi エディタ風のkey bindingを書かれていた人がいたような気はする。　

Mifesコンパチマクロを作った、大野元久　さんとの最初の出会いが、Unixユーザ会だったことを思うと。
Stringで使えるメソッド

# はじめに

Stringの出力を操作したい時に使えるメソッドを紹介します。
自分がすぐに忘れてしまうので、備忘録です。

# hasPrefix

```swift
let animal = "cat"

if animal.hasPrefix("c") {  // "c"が接頭辞なのでtrue
    print("dog")
} // dog
```
prefix(接頭辞)と和訳すると解りやすいです😀

# hasSuffix

```swift
let animal = "cat"

if animal.hasSuffix("t") { // "t"が接尾辞なのでtrue
    print("dog")
} // dog
```

これまたsuffix(接尾辞)と和訳すると解る😃

# prefix
```swift
let animal = "cat"

print(animal.prefix(2)) // ca
```
接頭辞から2文字目までを抽出します😆

# suffix
```swift
let animal = "cat"

print(animal.suffix(2)) // at
```
prefixと逆の挙動です😁

# range(of:)

```swift
let animal = "cat"

private func confirmIncludeString(animal: String) -> String {
    if animal.range(of: "r") == nil {
        return "animalに(of:)で指定した文字が含まれていません"
    }else {
        return "animalに(of:)で指定した文字が含まれています"
    }
}
print(confirmIncludeString(animal: animal))
 // animalに(of:)で指定した文字が含まれていません
```

range(of:)は帰ってくる型がRange型なので、サンプルコードみたいに文字列を判定したい時に使えそうですね😯
# dropFirst
```swift
let animal = "cat"

let animalDeleteString = animal.dropFirst(1)

print(String(animalDeleteString)) // at
```
dropFirstの引数に指定した数を飛ばして出力してくれます。
Substring型で返ってくるので、String型にキャストしないとエラーになります。😭
# dropLast
```swift
let animal = "cat"

let animalDeleteString = animal.dropLast(1)

print(String(animalDeleteString)) // ca
```
dropFirstの最後尾からバージョンですね

まだまだ知らないメソッドが沢山あります😭
都度更新していけたらと思っています!!
以上です。
「フリーザ様のキレキレダンス」を例のAIに描いてもらった

## 元ネタこれね
https://www.youtube.com/watch?v=JDzjI8vXu_g

## 例のAI
https://www.midjourney.com/

使い方とかはBingってください
（Googleでも可）
Discordで利用できます。無料で25回生成。金払えば商用利用も可です。

## モチベ
GAN気になってるので使ってみました。
コードじゃないけどとりあえずアウトプットしていくスタイル

## 1回目
他の人の生成キーワードとその結果を見ていると結構キーワードの選出が大事だなと思って適当に入れてみました。
freeza full power sharp dance with beams, bombs, explosion
![yasubei_freeza_full_power_sharp_dance_with_beams_bombs_explosio_6bcfab91-fb39-47dd-8d80-24d58f75263f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289684/c750268c-f3a9-5fdd-bdb7-654cee04b1c4.png)
１（左上）と２（右上）は地球外生命体っぽい違和感
まぁフリーザ様は地球外生命体ですので問題はございませんけれども...w

3（左下）はキレキレダンスなフリーザ様だけ抜き出したようなフォルム
4(右下)はexplosionという単語に反応したような絵ですね。なんとなくエバっぽさ。

## 2回目
V1を押して見た結果はこちら。（V1はMidjouneryで表示されるボタンです）
![yasubei_freeza_full_power_sharp_dance_with_beams_bombs_explosio_5ce76a02-c0f9-4a94-82ae-615d06825616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289684/3fd31137-2180-c7d7-316f-1e6c9cf9ceb6.png)
１番の画像を元にバリエーションが４つ提案されました。
2が某Fateの聖杯から溢れだしそうな気持ち悪いフォルムをしていますね
3の中心はフリーザ様のハゲ頭でしょうか？
4はちょっと神聖生物（実は悪）っぽいフォルムをしています。

ちょっと違う感じなのでキーワードを増やそうと思いました。


## 3回目
キーワードに「a large number of evil henchmen」を追加してみました。
freeza full power sharp dance with a large number of evil henchmen, beams, bombs, explosion
![yasubei_freeza_full_power_sharp_dance_with_a_large_number_of_ev_a6a0f623-31f5-4482-b2ff-d67a5bffd90a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289684/8b192483-872e-3f7f-6c16-4306682b163b.png)
3があまりにもアメコミ調っぽいなと思って笑ってしまいました。
4も頭が大きいように見えますがちょっとよくわからないフォルムをしています。でもフリーザ様も第二形態は頭が大きかったので良いのかな？
３も４も、ちょっと「evil」のキーワードが効きすぎてしまったような結果ですね。
2はお立ち台があったり高さ低いけど花道のようなものがあったりで「dance」に反応しているような感じに見えまして、ちょっと違くて。
なんとなく1が近いのかなと思いました。

## 4回目
というわけでV1を押してみた結果がこちら
![yasubei_freeza_full_power_sharp_dance_with_a_large_number_of_ev_fb5856ec-67cb-42e6-8ee5-82fb3e2acf89.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289684/d3410842-dddb-592d-7f06-d3d08609e3b4.png)
1番が子分たちが多くてイメージにかなり近ずいたのですが、フリーザ様が小さくて、２番は上半身吹き飛んじゃっていますね。
3番のふにゃふにゃ感、ちょっとdanceしているんでしょうか、想像に近い気がします
4番はエネルギーを貯めてるフリーザ様に見えました（よく見ると上半身吹き飛んでるように見えなくもないですが）

## 生成された画像の第三者評価
第三者が見てわかるのかな？って思ったのでトゥイッターしてみました。
https://twitter.com/yasubeitwi/status/1556135997838360576
まぁあんまりフォロワー多いわけでもないので反応ゼロでしたが。

## まとめ
気が済んだので終わりにします

## おすすめ
https://www.amazon.co.jp/%E3%82%A2%E3%82%BA%E3%83%A2%E3%83%87%E3%82%A3%E3%83%BC-Asmodee-200706-%E3%83%87%E3%82%A3%E3%82%AF%E3%82%B7%E3%83%83%E3%83%88-DIXIT/dp/B001OH9EDW
Windows ターミナル で Anaconda Prompt を使えるようにした話

# 0. はじめに
色々と並行して作業したり、サーバーの立ち上げが複数必要だったりすると、コマンドプロンプトやらPowerShellやらを複数開く必要が出てくることはよくあるかと思います。
で、あっちこっち全部が別ウィンドウで開いていて、何が何だか分からん！みたいな感じになるのも僕だけではなかろうと思います（そうですよね…？）。
恥ずかしながら、先日初めて「Windows ターミナル（Windows Terminalって書く方が正しいのか？）」なるお便利ソフトがあることを知りまして、このターミナルならコマンドプロンプト達をタブに開いていけるので、かなり整理がつくようになりました。

で、機械学習とかの開発をしているとAnacondaプロンプト（これもAnaconda Promptと書いた方が良いのか？）が使いたくなることもあります。
ターミナルの標準装備にはAnacondaプロンプトがないのですが、自分で設定すればこれを使うことができます。
が、やり方を調べてみると「Setting.json」なる設定のjsonファイルに直接書き込む方法がよく出てくるのですが、やっぱり分かりにくいし書き損じが起こる可能性も高いかなと思い、ターミナルの設定画面からAnacondaプロンプトを追加できた方がよかろうと思って設定してみたので、今後同じような人の役に立てばいいなということで備忘録を残しておくことにしました。

# 1. Windowsターミナルを開く
まずはターミナルを開きます。
Windowsメニューを開いて「ターミナル」と検索すれば恐らく出てくると思いますが、標準装備されていなかった場合はMicrosoft Store の [Windows Terminal](https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=ja-jp&gl=JP) からインストールできます。
ターミナルは↓こんな感じ。タブで色々開けて便利～。
<img width=500 alt=terminal.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337870/950270dc-a5d7-c532-3377-28e380196923.png>

# 2. Anaconda PromptをWindowsターミナルに設定する
ターミナルのタブ追加ボタンの横にあるメニューボタンを押すと、「設定」が出てきますので、これをクリック。
（設定完了後にこの記事を書いているので下の画像では既にAnacondaプロンプトが入っちゃってますが…）
<img width=500 alt=image.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337870/28b113f0-df81-e461-9a18-00302a8168b0.png>

設定画面が開いたら、左のメニュー欄から「新しいプロファイルを追加します」を選択し、出てきたプロファイル画面で「＋ 新しい空のプロファイル」を押します。
すると以下のような新規プロファイル設定画面が開きます。
<img width=800 alt=image.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337870/21220931-f4bf-b18e-7fb5-253718d282c0.png>

色んな項目がありますが、実際に設定が必要なのは上から4つの、
- **名前**
- **コマンド ライン**
- **開始ディレクトリ**
- **アイコン**
くらいです。
特に、「コマンド ライン」の設定さえうまくできればAnacondaプロンプトを呼び出せるようになるので、他3つもほぼオプションに近いくらいです。

### 名前
自分の好きな名前をつけてあげてください。
愛着の沸く名前でも別によいですが、分かりやすさのためにも一般的には「Anaconda Prompt」でしょう。

### コマンドライン
これが一番重要です。
スタートメニューなどにAnacondaプロンプトがある人は「ファイルの場所を開く」を選択するなどして、Anacondaプロンプトの大元のフォルダを開きます。
そこにある「Anaconda Prompt」を右クリックを押して「プロパティ」を開きます。

「プロパティ」には色んなタブがありますが、下図のように、「ショートカット」の中にある「リンク先」をコピーします。
<img width=400 alt=image.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337870/7a8aa2a0-555e-5f74-2cb3-1f183fc73e8b.png>
（僕はMinicondaを入れているので、画像のパスはMinicondaになっています）
これをターミナルの「コマンド ライン」にペーストすればOK。

### 開始ディレクトリ
これは任意です。
デフォルトでは「親プロセス ディレクトリの使用」となっています。
任意のフォルダで右クリックをするとコンテキストメニューに「ターミナル」が出てきますが、これを押したときに、いま右クリックをしたディレクトリに入った状態でプロンプトを開くのがこの設定です。
このチェックを外すと、どこで開いたとしても常に指定したディレクトリでプロンプトが開きます。

「基本的には今作業しているディレクトリとして開きたい！」という人は、デフォルトのままでよいでしょう。

### アイコン
アイコンの表示です。気にしない人は設定しなくても構いません。
設定したい人は、まずAnacondaのディレクトリを探してください。
通常は、Cドライブ直下か、`c://ユーザー名`あたりにあると思います。

見つけたら、ターミナルの設定「アイコン」の「参照」から、以下のファイルを選択してください。
`Anaconda3\Menu\Iconleak-Atrous-Console.ico`

ここまでできれば、Anacondaプロンプトを開けるようになっているはずです！

# 3. おわりに
ターミナルはタブで色々開けてウィンドウの整理がつきやすいので便利なのと、背景画像や透過度の設定とかも色々できるので、好きなようにカスタマイズしてみてくださいね！
Marpで影響範囲をできるだけ狭めて脚注を実現する方法

[Marp](https://marp.app/)はCommonMarkを尊重しているので[^1]、基本機能のみで脚注を表現することができません。
ここではマークアップしやすくかつ利用頻度が低いであろう三重引用を脚注用に転用し、脚注に見えるスタイルを与えることで簡易的に脚注を実現します。

[^1]: https://github.com/marp-team/marp/discussions/150#discussioncomment-1215625

## 実現方法
`blockquote > blockquote > blockquote`セレクタ（Markdownでは`>>> `）に以下のスタイルを適用します。三重引用を引用文のマークアップとして使えなくなる代わりに脚注としてのマークアップに利用します。
脚注への参照を表すためには`KaTeX`の上付き文字表記`$^1$`を利用しています。`<sup>`タグでもよいでしょう。
この場合、擬似的な脚注であるため`$^1$`として記述した参照から脚注へのリンクは張られません。同一ページに納めることが多いと想定されますので、問題になることはないと考えています。

スライドの全体で利用するため、原稿となるMarkdownファイルにstyleグローバルディレクティブでCSSを記述します[^2]。
よく使うようであればテーマファイルに記述してしまっても良いでしょう。テーマの作成方法は本稿では割愛します。

[^2]: https://marpit.marp.app/theme-css?id=tweak-style-through-markdown

### 記述例
```yaml:スライド原稿MarkdownファイルのYAMLグローバルディレクティブ
style: |
  /* 三重引用を脚注の記号に転用 */
  /* 下記はdefaultテーマ用。他のテーマで利用するときはbottomとleftを調節してください。 */
  /* スライド全体で利用するため、無名のstyleタグを利用しています。 */
  blockquote > blockquote > blockquote {
    font-size: 50%;
    font-weight: 400;
    padding: 0;
    margin: 0;
    border: 0;
    border-top: 0.1em dashed #555;
    position: absolute;
    bottom: 70px;
    left: 70px;
  }
```

```md
## 正規表現(regular expression)とは
> ある特定のパターンを持つ文字列を指定する表記法の一つ。文字列の検索や置換、抽出などを行う際の対象の指定などのために用いられる。$^1$

>>> 1: IT用語辞典 e-Words https://e-words.jp/w/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE.html
>>> 2: 2行目の例
```

![脚注の例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76242/b9d7d738-4380-b033-c48e-840ff6ba9dcf.png)
図：脚注の例

## 応用
三重引用ではスライドに必要な表現ができない場合は、五重引用や六重引用などを脚注スタイルにすることで回避できます。

## 参考にした記事
Introduction
https://marpit.marp.app/

Marpで研究発表スライドを作る 〜Beamerを卒業しよう〜
https://zenn.dev/hellorusk/articles/4edf3920dd1a35
ESP32でいつも使っているWiFi接続処理

ESP32でWiFi接続処理を毎度記載しているのですが、毎度同じコードなので、備忘録として残しておきます。

# 使っている機能

ESP32でWiFi接続すると、そのSSIDやパスワードを内部に覚えてくれています。
次回接続するときに、引数無しで呼び出せば内部に覚えておいた過去に接続したときの情報を使って接続を試みます。

```cpp
    WiFi.begin(ssid, password); // 新規にSSIDとパスワードを指定して接続
    WiFi.begin(); // 過去の接続情報を使って接続
```

一番最初に接続しようとしたときには、SSIDとパスワードがどこにもないので、UARTから入力するようにします。
そのため、最初の一回だけシリアルコンソールからアクセスポイントのパスワードを入力すればよくなります。

```cpp
    ret = Serial.readBytesUntil('\r', ssid, sizeof(ssid) - 1);
    ret = Serial.readBytesUntil('\r', password, sizeof(password) - 1);
```

# ソースコード

ということで、まとめると以下の感じになります。


```cpp
#include <WiFi.h>

//#define WIFI_SSID "【固定のWiFiアクセスポイントのSSID】" // WiFiアクセスポイントのSSID
//#define WIFI_PASSWORD "【固定のWiFIアクセスポイントのパスワード】" // WiFIアクセスポイントのパスワード
#define WIFI_SSID NULL // WiFiアクセスポイントのSSID
#define WIFI_PASSWORD NULL // WiFIアクセスポイントのパスワード
#define WIFI_TIMEOUT  10000
#define SERIAL_TIMEOUT1  10000
#define SERIAL_TIMEOUT2  20000
static long wifi_try_connect(bool infinit_loop);

static long wifi_connect(const char *ssid, const char *password, unsigned long timeout)
{
  Serial.println("");
  Serial.print("WiFi Connenting");

  if( ssid == NULL && password == NULL )
    WiFi.begin();
  else
    WiFi.begin(ssid, password);
  unsigned long past = 0;
  while (WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(500);
    past += 500;
    if( past > timeout ){
      Serial.println("\nCan't Connect");
      return -1;
    }
  }
  Serial.print("\nConnected : IP=");
  Serial.print(WiFi.localIP());
  Serial.print(" Mac=");
  Serial.println(WiFi.macAddress());

  return 0;
}

static long wifi_try_connect(bool infinit_loop)
{
  long ret = -1;
  do{
    ret = wifi_connect(WIFI_SSID, WIFI_PASSWORD, WIFI_TIMEOUT);
    if( ret == 0 )
      return ret;

    Serial.print("\ninput SSID:");
    Serial.setTimeout(SERIAL_TIMEOUT1);
    char ssid[32 + 1] = {'\0'};
    ret = Serial.readBytesUntil('\r', ssid, sizeof(ssid) - 1);
    if( ret <= 0 )
      continue;

    delay(10);
    Serial.read();
    Serial.print("\ninput PASSWORD:");
    Serial.setTimeout(SERIAL_TIMEOUT2);
    char password[32 + 1] = {'\0'};
    ret = Serial.readBytesUntil('\r', password, sizeof(password) - 1);
    if( ret <= 0 )
      continue;

    delay(10);
    Serial.read();
    Serial.printf("\nSSID=%s PASSWORD=", ssid);
    for( int i = 0 ; i < strlen(password); i++ )
      Serial.print("*");
    Serial.println("");

    ret = wifi_connect(ssid, password, WIFI_TIMEOUT);
    if( ret == 0 )
      return ret;
  }while(infinit_loop);

  return ret;
}
```

# ついでに、platformio.iniも

WiFiとは関係ありませんが、私は、Visual Studio CodeでPlatformIOを使っていて、ここにもお決まりのコードがありますので、残しておきます。

```ini:platformio.ini
[env:m5stick-c]
platform = espressif32
board = m5stick-c
framework = arduino
monitor_speed = 115200
upload_port = COM3
monitor_port = COM3
board_build.partitions = default.csv ; default.csv, minimal.csv, no_ota.csv, huge_app.csv, min_spiffs.csv
```

以上
質問してきて答えを言わせない人、何を聞きたいのかよく分からない人 5パターン

担当システムに関わって数年経ち、ある程度システムに詳しくなってくると、周りの人たちから質問責めされる機会が増えます。質問してくる人の中には、人の話を聞かなかったり、何を聞きたいのかよく分からない質問をしてくる人がいます。本記事では、そのパターンと対処法についてまとめてみました。

## 1. 人が答えてる最中に質問をかぶせてきて、続きを言わせない人
**Aさん**「ファイルって暗号化してるの？」
**自分**「どのファイルのことですか？」
**A**「ログファイル。」
**自**「はい、暗号化　**A**「ローカルのログファイルが暗号化されてないんだけど」
**自**「暗号化はサーバ側で　**A**「これ暗号化してないの？」
**自**「いえ、暗号化は　**A**「暗号化せずに保存してるの？それってまずくない？」

「ログファイルは暗号化しているか」という質問に「ログファイルはサーバ側で暗号化している」と答えたいのですが、答えている最中に質問者が質問をかぶせてくるため、こちらが答えを言わせてもらえないケースです。

### 対策
質問者は、ただ自分が喋りたいタイプの人です。嵐が収まるまで黙って待ちます。

## 2. こちらが言った単語に反応して、話を奪う人
**Aさん**「○○の機能が使えないんだけど」
**自分**「あーそれ設定で有効化する必要があります。手順を教えます、設定画面は開けます？」
**A**「設定？設定は触ってないよ？」
**自**「設定画面を　**A**「さっきインストールしたばかりだから、設定は何も触ってないもん。別に設定はいじってないよ」
**自**「設定　**A**「設定は何も変えてないんだけどなあ。なんでなんだろう。なんでなの？」

### 対策
「設定」という単語に反応して、自分の頭に思い浮かんだことをそのまま口にするタイプの人です。このケースも、質問者はただ自分が喋りたいタイプの人なので、嵐が収まるまで黙って待ちます。

## 3. 質問が漠然としすぎている人
前後の文脈から意図がわかる場合はよいですが、突然こちらのデスクにやって来て、漠然とした質問をポンと投げつけてくるタイプです。「ファイルってどうやって送ってるの？」など。

### 対策
「ファイルですか？TCP/IPで送ってます」のように、分かりきったことを答えます。すると相手は「それぐらい分かってるよ！」と怒り出して、自分から質問の意図を話しはじめます。

## 4. 質問で返すと怒り出す人
「ファイルってどうやって送ってるの？」のような漠然とした質問をされた時、質問の意図がよくわからないので「ファイルってどのファイルですか？」「どうやってというのは、通信プロトコルを聞いてますか？」のように、こちらから5W1Hを一つずつ丁寧に聞き出すと、見下されていると感じるのか、とたんに不機嫌になる幼稚園児みたいな人がいます。

### 対策
質問してはいけません。分かり切ったことを答えて、相手から質問の意図を吐き出させます。

## 5. もはや何を言っているのか分からない宇宙人
自分の仕事をしてると、何の前触れもなく、突然「暗号化は？」のように１単語で質問されることがあります。よく聞くと、「ログファイルを管理サーバに送る時、クライアント側、サーバー側のどちらで暗号化して送っているのか」を知りたかったようです。

### 対策
残念ながら我々はエスパーではないので、どうしようもありません。相手するだけ時間の無駄ですので、無視しましょう。

## まとめ
いかがでしたか？
新人の頃、「同じことを二度質問してはいけない」と言われた人は多いと思います。新人は回数を制限される一方、中堅は「日本語になってない意味不明な質問」をしても許されるようですね。

「**プログラミングを始めたいのですが、最初に覚えたほうがいい言語ってありますか？**」

「**はい、あります。日本語です。**」
【Docker】DockerHubにイメージを公開する

## リポジトリを生成する
以下の手順でDockerHubのリポジトリを生成します。  

「Create Repository」をクリックします。  
![image220807_124432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/174ca9d2-fafe-8bd9-8c6d-5e75bad1d4ce.png)

任意のリポジトリ名を入力し「Create」をクリックします。
![image220807_124711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/064923d4-5d47-7515-53b8-042b0c5afd6e.png)

## ローカルイメージに名前をつける
以下のいずれかの方法でローカルイメージにさきほど作成したリポジトリの名前をつけます。

* イメージをビルドする際に以下のコマンドを実行します。
```:ターミナル
$ docker build -t ユーザー名/リポジトリ名[:<tag>]
```
* 既存のローカルイメージにあらためて名前をつける
```:ターミナル
$ docker tag 既存イメージID ユーザー名/リポジトリ名[:<tag>]
```
* 変更をコミットする
```:ターミナル
$ docker commit コンテナID ユーザー名/リポジトリ名[:<tag>]
```

なお上記いずれも`[:<tag>]`を指定しない場合は`latest`となります。


## `push`する
最後に以下のコマンドを実行し、`push`します。
```:ターミナル
$ docker push ユーザー名/リポジトリ名[:<tag>]
```
HexabaseのGraphQL Playgroundの使い方を認証機能で解説

[Hexabase](https://www.hexabase.com/)は企業においても安心して利用できるBaaS（Backend as a Service）を提供しています。多くのBaaSがそうであるように、主にフロントエンド開発者に利用してもらいたいと考えています。そこで現在、TypeScript SDKの開発が進められています。

TypeScript SDKではGraphQL APIをラッピングして、TypeScriptから使いやすい形にしています。しかし、時にはGraphQLを直接実行したい場合もあるでしょう。そこで、この記事では認証機能を例としてGraphQL APIの使い方を紹介します。

## 必要なもの

- Hexabaseのアカウント

メールアドレスとパスワードが必要です。今回はデモアカウントのものを使います（後述）。

## GraphQL Playgroundについて

GraphQL Playgroundは以下の2つが用意されています。今回は本番環境のものを利用します。

| URL | 意味 |
|------|------|
| https://graphql.hexabase.com/graphql | 本番環境 |
| https://hxb-graph.hexabase.com/graphql | 検証環境 |

## アクセスする

上記URLへアクセスすると、以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/0e4c42f1-8242-f147-d706-39c0eb24c46f.png)


## ドキュメントを見る

GraphQLでは、その使い方がスキーマやドキュメントで解説されています。 `DOCS` を開いてログイン（login）を検索すると、次のような結果が表示されるでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/f4113124-b9ae-f661-f72e-cd8ddae9f328.png)


認証は取得処理ではないので、Mutationになります。つまり `Mutation.login` が今回利用する処理になります。

### Mutation.loginについて

Mutation.loginをクリックすると、次のように表示されます。

```
login(
  loginInput: LoginInput!
): TokenModel!
```

これは入力値として `loginInput` をキーとした変数（型は `LoginInput!` 。`!` は必須の意味 ）を必要とすることを意味しています。そしてレスポンスは `TokenModel!` になります。

`LoginInput` の内容はDOCSによると次のようになっています。意味としてはキーにemailとpasswordがあり、どちらも文字列型で必須ということになります。

```
type LoginInput {
  email: String!
  password: String!
}
```

そこで、まずは `loginInput` をJSONで作成します。内容は以下の通りで、これを `QUERY VARIABLES` に記述します。この認証情報は [TODOサンプル | Hexabase 開発ガイド](https://devdoc.hexabase.com/docs/example/todo_simple) にて公開されているものです。

```json
{
  "loginInput": {
    "email": "demo_app@hexabase.com",
    "password": "hexabase.com5678"
  }
}
```

そしてGraphQLの書き方です。先ほどのドキュメントの内容に沿って記述します。まず `mutation` と書き、そこで先ほどのJSONで定義したキーと、その型を指定します。 `!` は必須の意味になります。

loginに対しては、引数として渡す名前とJSONの変数（ `$` を頭に付けたもの）を指定します。同じような名前が続くので区別が難しいので注意してください。

```
mutation($loginInput: LoginInput!) {
  login(loginInput: $loginInput) {
		 token
  }
}
```

これを実行すると、結果として `TokenModel!` が返ってきます。 `TokenModel!` の内容はスキーマによると次のようになります。

```
type TokenModel {
  token: String!
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/0fa9a3d5-78ec-051e-2f10-ef07fdb68499.png)


実際、レスポンスは次のようになります（一部省略）。 `data` キーは必須で、その次がmutationの名前になります。その中で定義された形でレスポンスが得られます。

```json
{
  "data": {
    "login": {
      "token": "eyJ...Lsw"
    }
  }
}
```

このようにしてHexabaseのGraphQLを操作できます。

## まとめ

HexabaseのGraphQLでは、数多くのクエリーを用意しています。ぜひHexabaseを使ったアプリ開発で活用してください。

[APIのGraphQL対応 | Hexabase 開発ガイド](https://devdoc.hexabase.com/docs/features/graphql)
AtCoder ABC 263 B問題

# AtCoder ABC 263 B問題

https://atcoder.jp/contests/abc263/tasks/abc263_b

B問題で解けなかったので、茶色コーダーまでまだまだですね…他の方のコードを参考にして、まとめました。

# 入力と結果の例
例１
```
5
1 2 3 4
```
という入力があったとすると、　

2の親は1
3の親は2 → 2の親は1
4の親は3 → 3の親は2 → 2の親は1 
5の親は4 → 4の親は3 → 3の親は2 → 2の親は1

=>　1は5の4代祖先に当たるので、4を出力

例2
```
5
1 2 2 3 
```
という入力の場合、

2の親は1  
3の親は2 → 2の親は1 -b
4の親は2 → 2の親は1
5の親は3 → 3の親は2 → 2の親は1　-a

=> 1はの5の3代祖先に当たるので、3を出力

ということです。

# 考え方

前の結果が次の結果に影響してくるのでダイナミックプログラミング(dp)を使います。
上の例２からわかると思いますが、aの結果を求めるときに、bの結果を使っていますよね。

どのようにしてdpを使うかですが、

### 例１でやってみます。

まず何代前かを表すdp配列を持っておきます（０で初期化）。左から、人1,2,3,4,5がそれぞれ人１の何代祖先かを表しています。
dp = [0, 0, 0, 0, 0]
人1は人１の０代祖先なので、0のままにしておきます。
dp = [0, 0, 0, 0, 0]
次に、人2は人１の1代祖先なので、前の結果(0代祖先の)の１代祖先に当たるので、
dp = [0, 1, 0, 0, 0]
次に、人3は人2の1代祖先なので、前の結果(1代祖先の)の１代祖先に当たるので、
dp = [0, 1, 2, 0, 0]
繰り返していくと
dp = [0, 1, 2, 3, 4]
になり、この配列の最後の４は、人1は人5の4代祖先と言うことを表しているので、これを出力します。

### 例2でやってみます。

人1は人１の０代祖先なので、0のままにしておきます。
dp = [0, 0, 0, 0, 0]
次に、人2は人１の1代祖先なので、前の結果(0代祖先の)の１代祖先に当たるので、-c
dp = [0, 1, 0, 0, 0]
次に、人3は人2の1代祖先なので、前の結果(1代祖先の)の１代祖先に当たるので、-d
dp = [0, 1, 2, 0, 0]
次に、人4は人2の1代祖先なので、前の結果(1代祖先の)の１代祖先に当たるので、 <= 前の結果は -c です。
dp = [0, 1, 2, 2, 0]
次に、人5は人3の1代祖先なので、前の結果(2代祖先の)の１代祖先に当たるので、 <= 前の結果は -d です。
dp = [0, 1, 2, 2, 3]
になり、この配列の最後の3は、人1は人5の3代祖先と言うことを表しているので、これを出力します。

頭がこんがらがりそうです。

ではコードに移りましょう。

### コード
```c++
#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main(){
  int n;
  cin >> n;
  vector<int> vec(n+1);
  vector<int> dp(n+1);
  for(int i=1; i<n; i++){
    cin >> vec.at(i);
    vec.at(i)--;
  }
  dp.at(1) = 0;
  for(int i=1; i<n; i++) dp.at(i) = dp.at(vec.at(i)) + 1;
  cout << dp.at(n-1) << endl;
  return 0;
}
```

下の部分は上で、解説した部分をコードに直しただけなので、説明を省きます。
vecと言う配列は何をしているのかというと、前の結果を示すインデックスを表しています。

上の例でいうと、
「次に、人2は人１の1代祖先なので、前の結果(0代祖先の)の１代祖先に当たるので、」
の「人１の」の部分です。この部分は　入力値と一致します。今回は、インデックスに対応させたいので、入力値を-1したものを前の結果が格納されたdpのインデックスを示すものとして用いています。

### 最後に

B問題で解けなかったのは本当に悔しいです。自分はまだ灰色コーダーなので、茶色を目指して頑張ります。
間違いなどあれば、指摘していただけると嬉しいです。
【Flutter小ネタ】リールWidget

# この記事って？
作成中のオンラインビンゴゲーム副産物であるリール部分のWidgetの紹介。
CodePenの埋込み練習も兼ねて投稿。
アニメーションを一から作るのは現実的では無いので、ListViewを使って実装しています。


<p class="codepen" data-height="300" data-theme-id="dark" data-default-tab="js,result" data-slug-hash="poLLeBz" data-user="yomoyama-dev68" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yomoyama-dev68/pen/poLLeBz">
  Untitled</a> by Yomoyama Dev68 (<a href="https://codepen.io/yomoyama-dev68">@yomoyama-dev68</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 気づきメモ
* EdgeFadeを有効にするには、Androidと違いListViewに設定するのではなく、ShaderMaskをListViewの親にしてFade設定する。
* ListViewのScrollアニメーションはどのItemを表示するかという指定はできない。
  コンテンツの上端からの座標(pixel)を指定のみ。
* ScrollEndNotificationはアニメーションの完了だけでなくjumpToでもonNotificationが呼ばれる。
* Widgetのサイズ変更は、SchedulerBinding.instance.addPostFrameCallbackのコールバック内で検知できる。
* Widgetのメンバ変数の変化は、didUpdateWidgetでチェックできる。
* build処理中は、setStateを呼ぶと例外が発生する。ScrollControllerのスクロール処理も同じ。
STM32L010と温度,S-5851でOLED温度計 (Mbed2)(OLED096UNO-A)


x 電源投入直後のOLEDのリセットでまれに失敗する。対策は、電源を入れ直す。
x ライブラリをインストールできる人
x Mbed2のリビジョンを変更できる人
x OLEDのライブラリをインストールしてください(SMALL_SSD1308_128x64_I2C)
x Mbed2リビジョン125


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


SSD1306 128x64

★0.96インチ★OLEDモジュール★I2C★ [OLED096UNO-A]


https://www.aitendo.com/product/18634



![o_con618.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/78257a32-5068-4fe4-80f2-c80b19364f6e.jpeg)


![o_con619.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/129cc5c8-392d-66a1-7b3b-9446aed95ee2.jpeg)


![o_con620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3dffd952-6455-ac88-1bf8-f6430fe29119.jpeg)


![o_con621.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ab53c449-b8d3-feff-a151-599568ebf32e.jpeg)


![o_con622.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d1be9e8c-03f7-7478-03ee-ea9b26e9763c.jpeg)


![o_con623.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/685d12f3-7e67-0819-b64a-2524032ca91a.jpeg)


![o_con624.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/11f37e69-bad5-4380-e14f-c796acce49d7.jpeg)



i2c_oled16x24_64_5851_010_1



```c++

//i2c_oled16x24_64_5851_010_1

#include "mbed.h"
#include "SSD1308.h"

//メイン関数
int main()
{
//i2c initialization
#if defined(TARGET_NUCLEO_F767ZI)
    I2C i2c(I2C_SDA, I2C_SCL); //767
#endif
#if defined(TARGET_NUCLEO_L011K4)
    I2C i2c(PA_10, PA_9); //010
#endif

    // Instantiate OLED
    SSD1308 oled = SSD1308( &i2c, SSD1308_SA0);

    char data_read[2];//リードバッファー
    char n1_8[8]; //バッファー

    char  f4_1[4] = {'0',  '2', '5', '7'};
    char  f4_2[4] = {'0',  '5', '0', '5'};

    int oo=0;

    while(1) {

        //初期化
        //set address 0
        i2c.write(0x90, "\000", 1); //addres 0

        //温度の読み込み
        // Read temperature register
        i2c.read(0x90 | 1, data_read,2,false);

        //温度の表示
        n1_8[0]= ' ';
        n1_8[1]= ' ';
        n1_8[2]= '0'+ (data_read[0]/10);
        n1_8[3]= '0'+ (data_read[0]%10);
        n1_8[4]= '.';
        n1_8[5]= f4_1[data_read[1]>>6];
        n1_8[6]= f4_2[data_read[1]>>6];
        n1_8[7]= ' ';
        for(int nn=0; nn<8; nn++) {
            //                y   x
            oled.writeBigChar(0, nn*16,n1_8[nn]);
        } //for


        //リセット対策
        oo++;
        if(oo >= 3) {
            i2c.write( ( 0x3c<<1), "\200\215\200\024\200\257", 6);
            oo=0;
        }

        //1秒待つ
        wait_ms(1000);
    }//while
}//main

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


```
laravel テストアサーション 論理削除されているか確認する（要点のみ）

# 概要

- DB系テストアサーションで論理削除されていることを確認するアサーションとその使い方を要点のみまとめる。

# 方法1 - モデルを使う

- `assertSoftDeleted()`の引数に論理削除されたことを期待するモデルを渡すことでチェック可能である。

    ```php
    $this->assertSoftDeleted($fooModel);
    ```

# 方法2 - テーブル名と一意の値を使う

- `assertSoftDeleted()`の引数にテーブル名とレコード絞り込みデータを渡すことでチェック可能である。

    ```php
    $this->assertSoftDeleted(
        table: 'テーブル名', 
        data: [
            'id' => 1,
        ],
    );
    ```

# 参考文献

- [https://readouble.com/laravel/9.x/ja/database-testing.html#assert-deleted](https://readouble.com/laravel/9.x/ja/database-testing.html#assert-deleted)
正規化

データベースで管理することにおいて```正規化```は欠かすことができません。
データベースで管理するにはどのような形の表が最適化と段取りをつけなくてはならない。
正規化にも段階がある。
* ```非正規形```　正規化されていない繰り返しの部分を持つ表
* ```第一世紀形```繰り返しの部分を分離させて、独立したレコードとした表
* ```第二正規形```部分関数従属している列を切り出した形の表
* ```第三正規形```主キー以外の列に関数従属している列を切り出した形の表


# 非正規形の表は繰り返し部分を持っている
p３０３の図を見てもらうとわかるが
複数の帳票がある。これをそのままレコードとして扱うと、下のように綺麗じゃない歪な表になる。
素直な2次元の表になっていない。
関係データベースはこのような歪な２次元の表を管理することができない。

# 第一正規化の表は繰り返しを除いたカタチ
p304の図を見る。
繰り返しの部分を切り取り、レコードを追加する。
こうすることで素直な２次元の表が完成する。

##  気づき
追加された表の欠如した列を追加して挿入しているのか。

# 関数従属と部分関数従属
第二、第３に入る前にこれを知っておかなければ次に進めない。
p305の図を見る。

## 主キーの関数従属
```主キーが決まれば列の値が一位に定まる```関係
このような関係を```関数従属```という。
名前と部署は社員番号に従属している。
名前は学年、組、出席番号に従属している。

## 複合キーの部分関数従属
```複合キーの一部の項目だけで列の値が一意に定まる```関係
このような関係を```部分関数従属```という。
受注番号で受注日付と顧客コードと顧客名称が決まる。

# 第２正規形の表は部分関数従属している列を切り出したカタチ
部分関数従属している列を切り出したものが第二正規形となる。

部分関数従属しているものを省略化された表と
部分関数従属の表とに分けることができる。

# 第三正規化の表は主キー以外に列に関数従属している列を切り出したカタチ
主キー以外にも従属している列が存在する。
図３０７を見る。
顧客コードと顧客名称が従属関係にある。
こうすると
もう一段階表を分けることができる。

## 気づき
従属関係によって省略と分離をすることができることを知った。
最初にあったように最適化と段取りをつけなくてはならないな。

# 問題を解いた時の気づき
### 格納効率とは？
```データの追加又は削除を繰り返すと，行の配置が乱れてデータの検索効率や格納効率が低下```します。したがって，HiRDB管理者はデータの格納効率が低下していないかどうかを確認する必要があります。データの格納効率が低下している場合は次に示すどれかの処置をしてください。

* 表を再編成する
* RDエリアの容量を大きくする
* 使用中空きページ及び使用中空きセグメントを解放する
出典 http://itdoc.hitachi.co.jp/manuals/3000/3000645480/U4540364.HTM
#### 気づき
補助記憶にあるファイルの追加削除にところで勉強した内容だったかな。
### 整合性制約とは？
整合性制約とは、リレーショナルデータベース（RDB）でテーブルにデータを追加・更新する際に課すことができる制約（constraint）の種類の一つで、管理者が指定したデータの整合性を満たすようにするもの。

データベースに記録するデータの中には、特定の値の種類しか取らないものや、何らかの規則や基準に従った内容である必要があるものがある。そのような制約条件を各フィールド（カラム）の仕様として組み込み、```データが追加・更新・削除される時点でシステム側でチェックする仕組みが整合性制約```である。

具体的な制約にはいくつかの種類があり、それぞれ固有の構文やキーワードなどで指定を行う。多くのRDBMSが対応している整合性制約としては、```値の未設定（空欄）を許さない「NOT NULL制約」（非NULL制約）```や、列の中で他の行のデータと```重複しない（一意である）ことを求める「UNIQUE制約」（一意制約）```、```条件式などで満たすべき条件を直接指定する「CHECK制約」（検査制約）```、```他のテーブルの特定のカラムに含まれる値しか指定できないようにする「外部キー制約」（参照制約/参照整合性制約）```などがある。
出典 https://e-words.jp/w/%E6%95%B4%E5%90%88%E6%80%A7%E5%88%B6%E7%B4%84.html#:~:text=%E6%95%B4%E5%90%88%E6%80%A7%E5%88%B6%E7%B4%84%E3%81%A8%E3%81%AF,%E6%BA%80%E3%81%9F%E3%81%99%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%80%82

### 冗長性とは？
```余分なもの、余剰がある、重複している```という意味
出典 https://it-trend.jp/words/redundancy#:~:text=%E4%BD%99%E5%88%86%E3%81%AA%E3%82%82%E3%81%AE%E3%80%81%E4%BD%99%E5%89%B0%E3%81%8C,%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B%E3%80%82

### ロック待ちとは？
排他ロックは同一データに対して同時に1つのトランザクションだけがかけることができるものであり，すでにほかのトランザクションが排他ロックをかけている場合，排他ロックが解除されるまで待つ。これがロック待ちであり，ロック待ちの間はだんまり状態になる
出典 https://xtech.nikkei.com/it/article/COLUMN/20060407/234774/#:~:text=%E6%8E%92%E4%BB%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AF%E5%90%8C%E4%B8%80%E3%83%87%E3%83%BC%E3%82%BF,%E5%90%8C%202.%E3%83%AD%E3%83%83%E3%82%AF%E5%BE%85%E3%81%A1%EF%BC%89%E3%80%82
#### 気づき
SQLに関したものだった。
疲れて深掘りはしない。

関係性を見てどれだけ省略できるかだな。
新卒社会人二年目PLが要件定義で重要だと感じたこと

前回の投稿から一年がたってしまいました。

多忙を極め、なかなか時間が取れず生きるのに必死でした。
ぼちぼち仕事をして得た学びをアウトプットしようと思います。

今回は要件定義について話していこうと思います。

<strong>要件定義とは、双方のやりたいことの認識合わせをする機会です。</strong>
このフェーズなくしてプロジェクトは成り立ちません。

<h2>要件定義は思っているより、高度なやり取りが必要。

相手のやりたいことをヒアリングして、自分たちの可能な範囲で実現していきますが、
相手の状況も把握することが重要です。<br>

<h4>例）出荷業務の運用を軽減するために依頼してきたが、実際の運用までは把握していなかったため結果として軽減にならなかった。</h4>
などということは絶対に避けなくてはいけません。

ここで必ず聞く必要があることは、

<strong>・出荷業務を実際にする方はだれか
・特殊な出荷業務はないか
・自分たちの可能な範囲なのか

を漏らさず聞きましょう。


上記はあくまで例ですが、<strong>何気ない一言</strong>もしっかりと聞きとりましょう。

常に気を張りながら相手のいうことを聞き逃さないということは簡単にはできませんので、
メモを使って記憶とメモを頼りに振り返ったときに課題がないか確認しましょう。

<h2>チャット、メールの返信はできるだけ迅速にかかつ正確に</h2>

要件定義中に限ったことではないですが、チャットや、メールで確認されることが多々あるかと思います。
<h5>これは相手の信頼を得るチャンスです。</h5>
自分の持てる時間の限りを使用して相手の質問に100％の回答をしましょう。
<br>
  <br>
<strong>相手は何を聞こうとしているのか。
なぜ、聞いてきたのか。
この回答なら次に何が聞かれるか。</strong><br>
<h4>常に相手の状況を想像しながら回答しましょう。

相手からの印象が良くなると、コントロールがしやすくなります。
PLはアサインの管理や、メンバーの管理も行うことが大前提なので、無理な改修を行うことは基本的にNGです。
そんなときに相手をコントロールする力が必要になってきます。

ただ難しいですというより、いつもよくしてくれている相手が申し訳なさそうに少し難しいですと言ってくるほうが受け入れられやすいです。<br>
<h4>印象は交渉力に直結します。</h4>
相手が聞きたがっていることを迅速に解答してあげましょう。

　　　　
以上が、最近私が要件定義を終了させて特に重要だなと感じたことになります。
これ以外にも重要なことありましたら、ぜひご教授ください。
laravel ルートnameを使ってパスを取得する方法

# 概要

- laravelの`route()`とPHPの`parse_url()`を用いてルートnameからパスを取得する方法をまとめる。
- 自分なりの方法です。もっといい方法あったらコメントいただけますと幸いです。。！

# 方法

- 下記のように記載する。

    ```php
    $path = parse_url(route('ルートname'), PHP_URL_PATH);
    ```