OmniAICreator/Qiita-1.07M huggingface dataset:
ラズベリーパイにFTDIドライバをインストールする

FTDIドライバにて動作するUSB-UART（RS422/RS232C/RS485）アダプタをRasPiで動作させることができる。

## DLとセットアップ
最新の環境ではDefaultでFTDIドライバはセットアップされているようだ。
https://ftdichip.com/drivers/d2xx-drivers/
任意フォルダ（実行権限/読書権限/リモートアクセス権限等を理解の上設定されたフォルダ）　以下(/home/pi/share)として記載する
また、DLしたFTDIドライバのVersionを1.3.6として話をすすめる
1.3.6 ARMv6 hard-float (suits Raspberry Pi)　とあったので
ARMアーキテクチャ用ドライバのため、ビルド不要で動作した。（おそらく最新のRasPiでもARMv6のものであれば動作すると思われる）

### 補足）
最新版rtaspiカーネル
5.10.92-v7+ #1514 SMP Mon Jan 17 17:36:39 GMT 2022 armv7l GNU/Linux
においてarmv7系のドライバでの動作確認済
上記カーネルの利用者は、1.4.24 ARMv7 hard-float ***　のセットアップが可能です。
その際下記のサンプルコマンドの1.3.6を1.4.24に置き換えて入力してください。

・pi/shareにDL,解凍したドライバ一式を配置する
・pi/share下にdriverフォルダを作成する
・driver以下に解凍ドライバフォルダ/release下のフォルダにコピーする
・driverフォルダより

```
cd build
sudo cp libftd2xx.* /usr/lib
sudo chmod 0755 /usr/lib/libftd2xx.so.1.3.6
sudo ln -sf /usr/lib/libftd2xx.so.1.3.6 /usr/lib/libftd2xx.so
```

##　動作確認
ドライバ付属のFTDIチップ内蔵EEPROMのリードサンプルプログラムを使用し、動作確認する。

```
cd ../examples
make -B
cd EEPROM/read
```

FTDIデバイスをUSBポートに差し込む

```
sudo ./read
```

↑通信ポートオープンに失敗する。最初はみんなそうみたい。。。。
（別のドライバが読み込まれているため）
・読み込まれているドライバの確認

```
sudo rmmod ftdi_sio
sudo rmmod usbserial
```

再度

```
sudo ./read
```

動作したら終了

（参考）ヒューマンデータ社のシリアルアダプタをLinuxで使用する方法
https://www.fa.hdl.co.jp/jp/html/app/USBID-PGMR/index.html
Arduino Uno で LCD（AQM1602Y）扱う際の覚書

![IMG_2395.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114599/cbd731ad-9e06-bf77-13db-343a5dbc20f4.jpeg)

スレーブ・アドレス： `0x3e`

使用部品：
[ＬＣＤモジュール　１６×２行　白色バックライト付　白文字　黒背景　ＡＱＭ１６０２Ｙ－ＮＬＷ－ＦＢＷ: ディスプレイ･表示器 秋月電子通商-電子部品・ネット通販](https://akizukidenshi.com/catalog/g/gP-12486/)

![LCD記事_20210915_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114599/8b4bf497-8032-7772-0140-dcc454ab157a.jpeg)


ブレッドボードに差すのにあたって突起があり刺さりにくいこと、バックライトLEDがピンでないのでピンソケットと針金を使ってさせるようにして試した。

![LCD記事_20210915_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114599/0c0913ab-5c56-5b95-30b1-526f55cbbb7c.jpeg)


## 回路図

![lcd-arduino_2021-09-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114599/239b2b70-a002-5596-60fa-01a9cc246cc4.png)


## スケッチ

こちらのライブラリを使わせてもらった。
[asukiaaa/ST7032_asukiaaa: A library for Arduino to use ST7032 for LCD](https://github.com/asukiaaa/ST7032_asukiaaa)

例として入っていたスケッチで動作確認できた。

```HelloWorld.ino
#include <ST7032_asukiaaa.h>

ST7032_asukiaaa lcd;

void setup() {
  lcd.begin(16, 2); // columns and rows

  lcd.setContrast(30);
  // If lcd become black, try reduced value for contrast
  // lcd.setContrast(10);

  lcd.print("hello!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
}
```

## ハマったこと
・RES、VOUT 接続していないとI2Cが不安定？接続がうまくできなかった
・表示が見づらい→5V コントラスト10 に設定

## 参考
* [ArduinoでAQM1602Yを触ってみる - てきとうなさいと。べぇたばん](http://tekitoh-memdhoi.info/views/778)
* [I2CインターフェースLCDモジュール用のライブラリを作る（8）追補AQM1602Y-NLM-FBW | 電子工作(MAKE)](https://www.denshi.club/make/2017/12/i2clcd8aqm1602y-nlm-fbw.html)
* [AQM1602Yを動かしてみる | ロットん・ラボ](https://lotton-6t.com/aqm1602y/)
* http://akizukidenshi.com/download/ds/akizuki/AQM1602Y-RN-GBW_akizuki.pdf
UbuntuにPostgreSQLをインストール

## はじめに
UbuntuにPostgreSQLをインストールする手順についてまとめました。手順は公式サイトにあるので、そのままやればいいだけではあるが、コマンド１つ１つ、何をやっているのか詳しく解説してみる。

PostgreSQLの公式サイト
https://www.postgresql.org/download/linux/ubuntu/

## 環境
focal (Ubuntu 20.04)

## 手順
shとは正式にはBourne Shellと呼ばれる。シェルといえば、ほぼほぼ、Bashを利用するのだが、Bashの下位互換を持つシェルがshという位置づけとなる。shでスクリプトを動かすとPOSIXモードで動くことになる。Bashはshの拡張版として開発されており、POSIX標準でないコマンドも動くように設計されている。POSIX標準でないコマンドはBashでは動ても、下位互換であるshでは動作しないということになる。POSIX仕様のディストリビューションであればどこでも共通に動作して欲しい場合は、POSIXモードで動くsh仕様でスクリプトを動かした方が確実いうことになる。ここでは、pgdg.listファイルにPostgreSQLのリモートリポジトリのURLを登録している。aptでインストールされるリモートリポジトリは/etc/apt/sources.listで管理されている。apt installすると、sources.listを読みにいって、ファイルに記述されているURLを参照しにいっている。リモートリポジトリはUbuntuを開発している、Canonical Ltd. が管理しており、バグパッチとかOSのシステムパッチなどがあった場合、ここのリモートリポジトリからダウンロードされることになる。PostgreSQLはCanonical Ltd. が管理しているわけではないので、PostgreSQL用のリモートリポジトリのURLを新しく追加しないといけないことになる。sources.listに追加しても、おそらく問題ないと思われるが、このファイルにUbuntu関連以外のURLを混合して記述すると見栄えがよくないという理由で、sources.list.dフォルダ内にpgdg.listという名前のテキストファイルを作成して、ここに記述しようという話になる。ファイル名はpgdg.listでなくてもいいかも知れないが、公式サイトに従っておいた方が無難だろう。

```
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
```

ちゃんと更新されているか確認をしてみよう。echo $(lsb_release -cs)とすると、focalと表示されます。Ubuntu20.4のコードネームのことです。環境変数で参照できるようになっています。

```
cat etc/apt/sources.list.d/pgdg.list
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
```

wgetを使って、PostgreSQLのリモートリポジトリより公開鍵をダウンロードしてくる。その後、ダウンロードしたファイルをapt-keyに標準出力を渡している。apt-key addはUbuntuに公開鍵をセットするためのコマンド。どうして公開鍵が必要なのかといえば、PostgreSQLのダウンロードでリモートリポジトリにアクセスする際、公開鍵暗号方式で認証しているためということになる。

```
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
```

セットされた公開鍵は、apt-key listで一覧表示することができる。ちゃんとセットされているか確認してみよう。公開鍵のファイルは、/etc/apt/trusted.gpg.dのディレクトリ配下で管理されているようだ。apt-key addを行った後に、apt-key listをすると、/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg
が新規に追加されていることが確認できる。公開鍵は、リモートリポジトリ上にある時の拡張子はascなのだが、Ubuntuに保管されるとgpgになるようです。ファイル名も変化するようです。

```
apt-key list
```

インデックスファイルを更新させる。apt-get installの直前のお約束。

```
sudo apt-get update
```

このコマンドで、pgdg.listに追加されたPostgreSQLのリモートリポジトリを参照してダウンロード＆インストールをしてくれる。バージョンを指定しなければ最新バージョンがインストールされるのだが、旧バージョンをインストールしたい場合は、sudo apt-get -y install postgresql-12、sudo apt-get -y install postgresql-11など、最後にバージョンを指定してやるとそのバージョンをインストールしてくれるようだ。マイナーバージョンの指定までできるのかどうかは？。

```
sudo apt-get -y install postgresql-12
```

バージョンを確認して、ちゃんとインストールされていることを確認する。現時点では、最新バージョンは13なのだが、12を指定してインストールしたので、ちゃんと12のバージョンがインストールされていることが確認できました。

```
psql -V
psql (PostgreSQL) 12.8 (Ubuntu 12.8-1.pgdg20.04+1)
```
【intra-mart】標準処理画面のカスタマイズ

#1. はじめに

今回は標準処理画面のカスタマイズについて記載します。

【前提条件】
・intra-mart e Builder for Accel Platform をインストール済みであること。
・intra-mart Accel Platform をインストールし、初期設定までが完了していること。
・開発環境のresinサーバーが作成されていること。 

#2. なにをカスタマイズするか
今回カスタマイズしたいことは、
<b>「申請画面の根回しという名称を変更する」</b>
というカスタマイズです。

具体的には、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/9d0266c0-c5f6-40a9-f243-9eb2f5542851.png)
上記の標準処理画面（申請画面）の「根回し」という文言を好きなようにカスタマイズするということです。

#3. カスタマイズ方法
<h3>そもそもの仕組み</h3>
intra-mart Accel Platform本体のソースコードをカスタマイズする場合、直接そのファイルをカスタマイズする必要はなく、カスタマイズ対象のソースコードをsrcディレクトリ配下にコピーし、そのファイルを修正することにより本体に変更を加えること無くカスタマイズを行うことができるという仕組みになっています。(以下参照URL)

http://accel-archives.intra-mart.jp/2021-spring/document/common/public/im_customize_guide.pdf


<h3>実際にカスタマイズしてみる</h3>
先ほど説明した仕組みに沿って実際にカスタマイズしてみます。
手順は大きく２つです。
<b>1. e-Builder上にカスタマイズ対象のソースコードをコピー
2. ソースコードを任意のコードに書き換える</b>
順番に説明していきます。

<h5>1. e-Builder上にカスタマイズ対象のソースコードをコピー</h5>
今回は申請画面をカスタマイズしていくので、本体のファイルをコピーして、e-Builder上のモジュールのsrcディレクトリ配下にコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/fb2adb05-1c12-78ed-41a2-0ececa84bb8b.png)
このapply.htmlファイルを以下のディレクトリに配置する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/e6098ca5-d592-6706-a983-d06fdc68ca41.png)


<h5>2. ソースコードを任意のコードに書き換える</h5>
次にコピーしたソースコードを任意のコードに書き換えていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/711374d5-1384-23d8-b913-024d71d9ac24.png)
apply.htmlファイルの７２３行目のvalueに"sample"を入れました。
これで手順は終わりです。

実際に申請画面を見てみると、先ほど「根回し」だった部分を「sample」にカスタマイズすることができています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/ad559133-7054-52db-2e68-14c2af0b6f08.png)

#4. まとめ
今回はintra-martの標準処理画面のカスタマイズについて記載しました。
機能の追加などといったカスタマイズは大変そうですが、文言を変える程度のカスタマイズであれば、簡単にできることがわかりました。
React: useRefで参照したinputから同じformのsubmitボタンを辿る

ReactでuseRefで参照したinputから同じformのsubmitボタンを辿って別コンポーネントからsubmitボタンをクリックするメモ

——formのref(例えばformRefという名前）を渡して、formRef.submit()すると、ページ更新されてしまうのでsubmitボタンをクリックすることにした。なにかいい方法がある気はするが、とりあえず回避策——

ComponentBからComponentAのformをSubmitする。但し渡すのはinputのrefとする。つまり、ComponentBからinputに値をセットしてからSubmitしたい。

"form" と Element ID で辿れる。

```react:ComponentA
export default function ComponentA(props) {
  const inputTextRef = useRef()

  const onSubmit = (e) => {
    e.preventDefault()
    ...何かの処理...
  }

  return (
    <form onSubmit={ onSubmit }>
      <input type="text" ref={ inputTextRef } />   {/* <-- refを取るのはinput要素とする　*/}
      <button type="submit" id="submitButton">Submit</button>　　　{/* <-- idを設定 */}
    </form>
    <ComponentB inputTextRef={ inputTextRef } />
  )
}
```

```react:ComponentB
export default function ComponentB(props) {

 const submitWithValue = (e) => {
    e.preventDefault()
    props.inputTextRef.current.value = "Special Value"   // <-- ref参照先を更新
    props.inputTextRef.current.form.submitButton.click() // <-- 同じformのsubmitボタンをこんなふうにたどれる
 }

 return (
   <button onClick={ submitWithValue } >Submit ComponentA with a special value</button>
 )
}
```
LinuxだけでHP ZBook Create G7のBIOSアップデート

HP ZBook Create G7のBIOSをバージョン01.05.00から01.06.00にアップデートした際のメモ。

Windows起動しなくていいしUSBなしでいけます。
他のHP製品にも適用可能かもしれませんが例によって保証はないです（ｿﾘｬｿｳｼﾞｬ）。

OSはPop!_OS 21.04で実行。

参考: https://askubuntu.com/questions/539120/how-to-perform-a-hp-bios-upgrade-with-only-ubuntu

まずは

https://support.hp.com/jp-ja/drivers/selfservice/hp-zbook-create-g7-notebook-pc/33731698

この辺からBIOSアップデート用のexeをダウンロード（自分の場合は`sp133024.exe`）。

7zipか何かで自己解凍形式のexeを解凍

```
7z e sp133024.exe
```

`7z`がなければ

```
sudo apt install p7zip-full
```

とかでインストール。

`XXX.bin`ファイルがあればそれが本体なので探す:

```
⟩ ls *.bin
S91_01060000.bin
```

この.binファイルを`/boot/efi/EFI/HP/DEVFW/firmware.bin`としてコピー:

```
sudo mkdir -p /boot/efi/EFI/HP/DEVFW
sudo cp S91_01060000.bin /boot/efi/EFI/HP/DEVFW/firmware.bin
```

再起動してEscを押しまくってBIOS Settingsを起動。

"Update System BIOS" > "Update System and Supported Device Firmware Using Local Media"を押すと勝手にアップデートが始まります。

5分くらい待つと終わってるので、

```
⟩ sudo cat /sys/class/dmi/id/bios_version
S91 Ver. 01.06.00
```

でバージョンが上がっていることを確認。
VSCodeのJupyterでVim拡張機能のundo,redoが上手く機能しない時の対処法


https://github.com/VSCodeVim/Vim/issues/3201#issuecomment-459515997

```:settings.json
    "vim.normalModeKeyBindings": [
        {
            "before" : ["u"],
            "commands" : [
                "undo"
            ]
        },
        {
            "before" : ["<C-r>"],
            "commands" : [
                "redo"
            ]
        }
    ]
```
VSCodeのキーボード設定の変更

VScodeにてショートカットキーを変えたいなと思うことが多々あります。

その時に自分のショートカットキーがわからなくならないために、メモとしてここに記していきます。

自分用のメモですが、読者の方に何か参考になれば幸いです。

─────────────────────
#設定方法
─────────────────────

・VSCodeを開きます。

・メニュー画面が表示されたら"cmd+shift+p"でコマンドパレットを開きます。

・「基本設定：規定のキーボード　ショートカットを開く(JSON)」を開きます。規定のキーボードには直接変更を加えることはできません。しかし、現在のキーボードのショートカットの割り当て一覧をみることができます。

・再び"cmd+shift+p"でコマンドパレットを開きます。

・「基本設定：キーボード　ショートカットを開く(JSON)」を開きます。「規定のキーボード」から設定をコピーして、こちらのファイルに貼り付けます。その後、"key"の部分に自分が指定したいコマンドに書き換えます。

```
	"key": "ctrl+f",
	"command": "cursorRight",
	"when": "textInputFocus"
```


```
	"key": "ctrl+t",
	"command": "cursorRight",
	"when": "textInputFocus"
```

上記のように変更可能です。
こうすることで、元々"key": "ctrl+f"でカーソルが右に移動していたのが、"key": "ctrl+t"によって移動することができるようになります。

─────────────────────
#設定一覧 2021/09/15
─────────────────────


```json:keybindings.json
// 既定値を上書きするには、このファイル内にキー バインドを挿入します
[
{
	"key": "ctrl+w",
	"command": "deleteWordLeft",
	"when": "textInputFocus && !editorReadonly"
},

{
	"key": "alt+cmd+l",
	"command": "workbench.action.files.newUntitledFile"
},
{
	"key": "ctrl+s",
	"command": "deleteLeft",
	"when": "textInputFocus"
},
{
	"key": "ctrl+u",
	"command": "deleteAllLeft",
	"when": "textInputFocus && !editorReadonly"
},
{
	"key": "ctrl+m",
	"command": "cursorUp",
	"when": "textInputFocus"
},
{
	"key": "ctrl+h",
	"command": "workbench.action.gotoLine"
},
{
	"key": "ctrl+f",
	"command": "cursorRight",
	"when": "textInputFocus"
},
{
	"key": "alt+cmd+[",
	"command": "workbench.action.closeActiveEditor"
},
{
	"key": "ctrl+v",
	"command": "cursorWordEndRight",
	"when": "textInputFocus"
},
{
	"key": "ctrl+c",
	"command": "cursorRight",
	"when": "textInputFocus"
},
{
	"key": "ctrl+x",
	"command": "cursorLeft",
	"when": "textInputFocus"
},
{
	"key": "ctrl+z",
	"command": "cursorWordLeft",
	"when": "textInputFocus"
},
{
	"key": "ctrl+l",
	"command": "deleteWordRight",
	"when": "textInputFocus && !editorReadonly"
},

]

```

##カーソルの左の文字を、文字単位で削除
"ctrl+w"

##カーソルの右の文字を、文字単位で削除
"ctrl+l"

##新規タブの追加
"alt+cmd+l"

##カーソルの左の文字を、1文字単位で削除
"ctrl+s"

##カーソルの左の文字を、1行単位で削除
"ctrl+u"

##カーソルを１行上へ移動
"ctrl+m"
※デフォルトで"ctrl+n(next)"があるのでmにした

##タブを閉じる
"alt+cmd+["

##カーソルを単語単位で右に移動
"ctrl+v",

##カーソルを1文字単位で右に移動
"ctrl+c",

##カーソルを1文字単位で左に移動
"ctrl+x",

##カーソルを単語単位で左に移動
"ctrl+z",
Eclipseで「公開が複数のエラーで失敗しました」が消えない

#:point_up:はじめに
Eclipseで実行時に「公開が複数のエラーで失敗しました」のエラーが発生し、実行できなかったため解決方法を残します！

#:point_up:方法
■結論：Tomcatのクリーンを実施することで解決。

1. サーバータブにあるTomcat上で右クリック（サーバータブが表示されていない場合は、ウインドウ≫ビューの表示≫その他...≫「サーバー」と入力してEnter≫「サーバー」を選択して「開く」をクリック）
1. 「クリーン...」をクリック
1. 「クリーンを実行するとすべての公開状態および破棄され、初めから再公開されます。公開されたすべてのリソースをクリーンしますか？」が表示されたら「OK」をクリック
1. `DONE`

#:point_up:まとめ
すべての場合に適用されるかは不明ですが、今回の場合はこの方法で解決しました！
[SQLServer]テーブルを返すストアドファンクションでも順番を制御したい！

# 複数値(テーブル)を返すストアドファンクション
以下のようなテーブルを考えます。このテーブルのうち、`Salary`列が100000以上の行の`Name`列と`Salary`列を取得したいと思います。

| Id | Name | Salary |
|:-|:-|-:|
|0001| Tom   |  48000 |
|0002| Ada     | 2506070  |
|0003| Jacob     | 406800  |
|0004| Scott     | 20  |
|0005| Tiger     | 0  |
|0006| Hoge     | 123456  |

当然、こんな感じで簡単にかけます。

```sql
SELECT Name, Salary 
FROM   Test 
WHERE  Salary >= 100000 
ORDER BY Name 
```
元テーブルの順番は`Id`列が主キーなのでAda->Jacob->Hogeですが、`Name`の辞書順はAda->Hoge->Jacobです。`Order By`をつけたり外したりすれば順番が変わることがわかるでしょう。

| Name | Salary |
|:-|-:|
| Ada  | 2506070   |
| Hoge  | 123456  |
| Jacob  | 406800  |

では、これをあえて**下限値を受け取って該当データを返すストアドファンクション`FindOverSalary`**とした場合、ストアドの定義はどうなるでしょうか。しかも、SQLは**`SELECT * FROM ストアド名(下限値);`で固定とし、Where句やORDER BY句の指定を不可能とします**。

# 間違った答え
以下のように単純にストアド定義するだけではうまくいきません。

```sql
CREATE FUNCTION FindOverSalary(@lowerlimit INT)
RETURNS @ret TABLE (
  Name nvarchar(8) NOT NULL,
  Salary INT NOT NULL
) BEGIN 
INSERT INTO @ret 
  SELECT Name, Salary 
  FROM   Test 
  WHERE  Salary >= 100000 
  ORDER BY Name
RETURN END
```
このストアドを使って`SELECT * FROM  FindOverSalary(100000);`とした結果は以下になります。JacobとHogeの順番が逆になっており、`Order By`がない場合の`SELECT`クエリと同じ結果になってしまいます。

| Name | Salary |
|:-|-:|
| Ada  | 2506070   |
| Jacob  | 406800  |
| Hoge  | 123456  |

# 正しい答え
テーブル値を返すストアドファンクションは、無名のテーブルを構築してその中にデータをセットすることで値を返します。ストアドの定義としても`SELECT-INSERT`文になっていますよね。ということは、**データをセットするときに`Order By`しても、`Insert`されるテーブルが順番を持っていないと無意味**ということです。
テーブルに順番を制御させるにはどうしたらよいか？答えは簡単です、**`Index`を貼ればよいのです。**
よって正しくは以下となります。

```sql
CREATE FUNCTION FindOverSalary(@lowerlimit INT)
RETURNS @ret TABLE (
  Name nvarchar(8) NOT NULL,
  Salary INT NOT NULL,
  INDEX index_for_orderby CLUSTERED(Name)
) BEGIN 
INSERT INTO @ret 
  SELECT Name, Salary 
  FROM   Test 
  WHERE  Salary >= 100000 
RETURN END
```
これで`SELECT * FROM ストアド名(値);`でも、並び替えされた結果を得ることができました。
# 実例
そもそも`SELECT`文で`Order By`句を使えるならそうしたほうがよいです。並び替えするかどうかはデータを見る人が制御するべきであり、ストアドファンクションの役割は引数に従って所定のデータを返すことだけであるからです。
しかし、**抽出するストアドが動的に変わるうえ、取得結果の構造も違う**みたいな要件（例えばDBにストアド名をもたせて検索条件と表示内容を動的に変えるようなケース）だと**「SQLは`SELECT * FROM ストアド名(下限値);`で固定とし、Where句やORDER BY句の指定を不可能とします。」**という仕様にするしかないこともあります。そのようなケースにおいて、ストアドファンクションでの無名テーブルへの`INDEX`貼りというテクニックを覚えておくと役に立つことがあるかもしれません。
~~もっといい仕様を考えたほうがいいかもしれません~~

# デモデータのクエリ

```sql
CREATE TABLE Test( 
  Id nvarchar(4) NOT NULL
  , Name nvarchar(8) NOT NULL
  , Salary INT NOT NULL
  , PRIMARY KEY (Id)
);
INSERT INTO Test
VALUES ('0001', 'Tom', 48000)
, ('0002', 'Ada', 2506070)
, ('0003', 'Jacob', 406800)
, ('0004', 'Scott', 20)
, ('0005', 'Tiger', 0)
, ('0006', 'Hoge', 123456)
```
ActiveHashのname出力でNoMethodError

おそらく同じケースに陥っている方は僅少かと思いますが
かなり初歩的なミスだったので
戒めも兼ねて記録します。

1. 問題
2. 状況
3. 分析
4. 解決法

#1.　問題
複数のActiveHashのname表示において
一部のモデルのみNoMethodErrorとなってしまっています。
[![Image from Gyazo](https://i.gyazo.com/ae9d438d9b1e7a0349ea7212683ca6b8.png)](https://gyazo.com/ae9d438d9b1e7a0349ea7212683ca6b8)

#2. 状況
・users/:idのパスにてusers#showアクション呼び出し
・ビューの項目のうち複数でActiveHashを利用（下記show.html.erb参照）
・一部の項目では正常にnameが呼び出される（下記ターミナル参照）

```ruby:users/show.html.erb
<%= @user.nickname %><br>
---(略)---
<%= @user.sex.name %><br>
<%= @user.character.name %><br>
<%= @user.what_paly.name %><br>
<%= @user.genre.name %><br>
<%= @user.prefecture.name %><br>
<%= @user.active_day.name %><br>
<%= @user.skill.name %><br>
<%= @user.leader_or_member.name %><br>
---(略)---

```
```ruby:ターミナル
app/controllers/users_controller.rb:9 UsersController#show:

     7: def show
     8:   @user = User.find(params[:id])
 =>  9:   binding.pry
    10: end

[1] pry(#<UsersController>)> @user.sex.name
NoMethodError: undefined method `sex' for #<User:0x00007fba2d60fbf0>
Did you mean?  send
from /Users/okazakiryousuke/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activemodel-6.0.4.1/lib/active_model/attribute_methods.rb:432:in `method_missing'
[2] pry(#<UsersController>)> @user.sex_id
=> 2
[3] pry(#<UsersController>)> @user.active_day.name
=> "火曜日"

```

#3. 分析
複数のActiveHashのうち
うまく表示されるものとされないものがあるようです。
よって項目によって個別に存在する設定、

ActiveHashのモデル
および
Userモデル
の記述が怪しいと思われます。

#4. 解決法
アソシエーションの記述が間違っていました。

belongs_toについて
以下のように記述してしまっていました。

```ruby:models/user.rb
belongs_to :active_day, :character, :genre, :leader_or_member, :prefecture,:sex, :skill, :what_play
```
belongs_toのモデル名は
validatesのカラム名のように
,
を使った複数の記述はできません。
その為に最初のカラムのみ
アソシエーションがかかっていました。

これを修正します。

```ruby:models/user.rb
belongs_to :active_day
  belongs_to :character
  belongs_to :genre
  belongs_to :leader_or_member
  belongs_to :prefecture
  belongs_to :sex
  belongs_to :skill
  belongs_to :what_play
  

```
以上の処理によって
無事に表示がされるようになりました。

[![Image from Gyazo](https://i.gyazo.com/2df13187160f270db90892e8f2f69686.png)](https://gyazo.com/2df13187160f270db90892e8f2f69686)

今回はここまでです。

お読みくださりありがとうございました。
nuxt.jsで作ったアプリケーションにGoogle Analytics仕込むときのベース手順

# 対象者

nuxtで作ったアプリケーションにアナリティクス設定したい人
Googleのドキュメントが複雑すぎて（自分には）簡単にまとめたいと思ってメモ書き

# 手順


１
インストール

```
yarn add @nuxtjs/google-gtag
```


２
下記記述

```js
 // nuxt.config.js

{
  modules: [
    '@nuxtjs/google-gtag',
}
```

3
.envファイルでID定義

```

GOOGLE_ANALYTICS_ID = G-XXXXXXXXXX
```

4
下記記述

```js

// nuxt.config.js

'google-gtag': {
  id: process.env.GOOGLE_ANALYTICS_ID,
  debug: true,
}
```


5
デバッグ

- アナリティクスの「リアルタイム」で確認 （これはたまに反応しないようなので非推奨）
- 対象サイトで、開発者ツール => 「ネットワーク」 => query string parameters の tid に GOOGLE_ANALYTICS_IDが確認できる
- Tag Assistant Legacy (by Google)　で確認。ちゃんとカウントされる ( https://chrome.google.com/webstore/detail/tag-assistant-legacy-by-g/kejbdjndbnbjgmefkgdddjlbokphdefk?hl=ja )


# まとめ

これだけだった…
アナリティクス、趣味で触ってた時とはなんか進化してて別だったのと
headにコード埋め込んで繋ぐ、みたいな先入観が邪魔してど詰まったので2度と忘れないために。。
と、いうかデバッグ方法わからず、ずっと「リアルタイム」みてて、違うことしてたんだとおもう…

というかまだ「カスタムディメンション」してトラッキング分けるという続きがあるけどいったん終わり。


# 参考

https://github.com/nuxt-community/google-gtag-module

# こちらでもできた


正直headに埋め込む風な、こっちの方がしっくりきました



https://offlo.in/blog/nuxt-gtag.html
python初学者の備忘録　ブール型について

#### [←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# ブール型とは
`基本`

+ bool型はint型の派生クラス 
+ Trueと1は等価
+ Falseと0は等価

| 値| 意味 |
|:-:|:-:|
| True | 真 |
| False | 偽 |

```python
>>> True == 1
True
>>> False == 0
True
```

#### Pythonにおいて、偽(False)とみなされるのは以下のオブジェクト

+ 定数：NoneとFalse
+ 数値型におけるゼロ：「0」, 「0.0,」 「0j」(複素数), Decimal(0), Fraction(0, 1)
+ 空のシーケンスまたはコレクション：'', (), [], {}, set(), range(0)

:::note info
上記以外はすべて真(True)と判定される
:::

#### 真偽値の確認
##### `bool()関数`：ブール型に変換する

```python:bool()関数で真偽値の確認
>>> bool(10)
True
>>> bool(0)
False
>>> bool('0')
True
>>> bool('False')
True
>>> bool('')
False
>>> bool([False])
True
>>> bool([])
False
>>> bool(1)
True
>>> bool(0)
False
```

#### ブール型の計算
##### int型の派生クラスなので、普通に演算することも可能

```python:
>>> issubclass(bool, int) # intの派生クラスという事が分かる
True
>>> +True
1
>>> -True
-1
>>> -False
0
>>> True + True # 1 * 1 として演算
2
>>> 10 * True # 10 * 1 として演算
10
>>> 10 / False # 10 / 0 として演算 
# 0除算エラーになる

>>> 'はい' * True # 'はい' * 1 として演算
'はい'
>>> 'はい' * False # 'はい' * 0として演算
''
>>> ('はい','いいえ')[True] # []はブール型になる式でも良い
'いいえ'
>>> ('はい','いいえ')[False] # []はブール型になる式でも良い
'はい'
```
Gitで重要なブランチ(develop/master/main)以外のブランチを一括で削除する

放っておくとブランチが溜まってしまう。
これ知るまで、何回も`git branch -D xxx`してた。
便利なので使ってください。
Gitで重要なブランチ(develop/master/main)以外のブランチを一括で削除するコマンド

```
git branch | grep -Ev "master|develop|main" | xargs git branch -D
```


# 参考
https://qiita.com/takat0-h0rikosh1/items/766e207ba1c799ed1375
CSS_SpringBoot 備忘録

## CSSフォルダの配置場所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/2c7344cf-6e53-bc1b-b544-b34fe81f1c3f.png)
resourcesフォルダ>staticフォルダの配下にCSS等のフォルダを作成し、その中に配置する。

## 外部ファイルを参照する方法
```
<head>
<!--中略-->
<link th:href="@{/css/hoge.css}" rel="stylesheet" type="text/css">
<!--中略-->
</head>
```
|要素|説明|
|----|----|----|
|\<link>|外部のスタイルシートを読み込むことができる。<br>この要素はhead要素の中で使用する。||
|rel|relationの略。外部のスタイルシートを読む場合は"stylesheet"を指定。||
|th:|Thymeleafのth:href属性で参照したいファイルを指定する。@{/}と記述することでstaticディレクトリのルートからのパスを指定することができる。||
|type|"text/css"。CSSのMIMEタイプを指定||
|MIMEタイプ|ファイルの種類を指定する情報||

https://www.tagindex.com/html_tag/page/link_style.html

## BootStrapを使用する場合
```
<head>
<!--中略--> 
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<!--中略-->
</head>
```
## 同じ要素内にクラス名を複数指定していて、その全てに同じCSSを適用する場合
>その複数指定している全てのクラス名に同じCSSを適用させる場合は、半角スペースで区切らずにセレクタを繋げて記述します。<br>https://ooigawa-bitter-sweet.hatenablog.com/entry/2013/07/10/233000_1

```:html記述方法
 <div  class="sample1  sample2">
 <p  class="sample3">サンプルテキスト</p>
 </div>
```
Unity 時間のかかるテクスチャの読み込みテスト用

### 10秒待ち

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class ma
{
    public static Material ToMat(this Texture2D tex, string shadername = "Transparent/Diffuse")
    {
        Material mat = new Material(Shader.Find(shadername));
        mat.SetTexture("_MainTex", tex);
        return mat;
    }
}

public class test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var uri = "https://gnjo.github.io/mock3d/mons/ajin1-min.png";
        var heavy =10.0f;//

        GameObject h = GameObject.CreatePrimitive(PrimitiveType.Quad);
        h.name = "heavy";
        Texture2D tex_h = new Texture2D(1, 1);
        h.GetComponent<Renderer>().material =tex_h.ToMat();
        h.transform.localPosition += new Vector3(1, 1, 1);
        StartCoroutine(
            byweb(uri, bytes => { tex_h.LoadImage(bytes); tex_h.Apply(); },heavy)
        );

    }

    IEnumerator byweb(string uri, System.Action<byte[]> caller,float waitsec=0)
    {
        //using UnityEngine.Networking;
        var www = UnityEngine.Networking.UnityWebRequest.Get(uri);
        yield return www.SendWebRequest();
        if (www.isHttpError || www.isNetworkError) Debug.Log(www.error);
        //
        if(waitsec!=0) yield return new WaitForSeconds(waitsec);
        //
        caller(www.downloadHandler.data);
    }


}

```
ファイルコンテンツの改行を特定の文字に置換し標準出力する

## 背景
ファイルの改行をスペースやカンマに置換し、連結した文字列を標準出力したい作業があったので備忘録として、その方法を記述する。

## 方法
bashでサクッと実現したいのでインストール等必要ない`sed`を使う

### ファイル
今回、連結した文字列にしたいファイルの内容は下記の通り。

```txt:test.txt
a
b
c
d
e
f
g
```

### sedを使った改行の置換
`sed`を使って繰り返し置換する場合、下記のように`loop`を指定する必要がある。

```bash
sed -e ':loop; N; $!b loop; s/{置き換えたい文字}/{置き換える文字}/g'
```

また今回、「置き換えたい文字＝\n」「置き換える文字＝,」なので最終的には下記のようになる。

```bash
$ cat test.txt | sed -e ':loop; N; $!b loop; s/\n/,/g'
a,b,c,d,e,f,g
```
【覚書】GitHub Pages を WSL2 + Docker Desktop で動かす

Windows Home 環境で Ruby を入れて Jekyll を動かそうとしたところ、
`bundle install`で`http_parser.rb`がエラって何時間も立ち往生。
さすがにイライラしたので、あきらめて Docker でやることにした。

# 環境構築

※ 全部管理者権限のコマンドプロンプトでやること。

まず Chocolatey を入れる。

```
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

`choco -v` でバージョンが出れば成功

次に WSL を使えるように設定を変える

```
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

一旦再起動して、そのあとに Chocolatey から WSL2 と Docker Desktop を入れる

```
cinst -y wsl2 docker-desktop
```

再起動して、Docker Desktop が正常に起動できれば完了。

# サーバーを起動する

プロジェクトのルートディレクトリに `docker-compose.yml` を追加して、以下をコピペ

```yml
version: "3.7"
services:
  app:
    environment:
      - JEKYLL_ENV=docker
    image: jekyll/jekyll:pages
    command: jekyll serve --force_polling
    volumes:
      - ./docs:/srv/jekyll
    ports:
      - 4000:4000
```

※ルートディレクトリ直下にindexを置いてる場合はvolumesを `.:/srv/jekyll` にする

そうしたらあとは Docker Desktop が立ち上がっている状態で

```
docker-compose up
```

で http://localhost:4000/ にサーバーが立ち上がるはず。

# .gitignore

普通の `node.gitignore` を使っている状態だと、
サーバーを立ち上げた瞬間新しいファイルが大量に作られるので、
以下を追加する。

```
_site
.jekyll-cache
```
[paiza]スキルチェック見本問題 Java 偶奇の判定/曜日の判定 (paizaランク D 相当)

<h2>初めに</h2>

今回２つのスキルチェック問題に挑戦しました。
Dレベルにしては、少し難しく感じました。

<h2>:fist:①偶奇の判定</h2>

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__mod_step3


```
長さ N の数列Aが与えられます。
この数列に含まれる偶数の要素の個数と、奇数の要素の個数を答えてください。
```

<h2>解答コード（自作）</h2>

paizaの解答と比べるとあまりスマートとは言えませんが・・・
なんとか正解しました。
拡張for文マスターできれば色々できますね。


```java:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
//与えられる数字をキャッチします。
        int n = sc.nextInt();
//奇数、偶数の初期値を0でセットします。
        int even = 0;
        int odd = 0;
//n個の箱を持つ、int型の配列を作成します。
        int[] a = new int[n];
//以下for文です。n行分のデータを配列に入れていきます。
        for(int i=0; i<n; i++){
            a[i]= sc.nextInt();
        }
//以下、拡張for文です。配列の中身を取り出していきます。
        for(int x:a)
//偶数を見つけたらevenの値が１ずつ増えます。
            if(x%2==0){
               even = even +1;
            }else{
                odd = odd +1;
            }
        }
        
        System.out.print(even + " " + odd);
    }
}
```

<h2>:fist:②曜日の判定</h2>

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__mod_step4

```
ある月の 1 日は日曜日、 2 日は月曜日...です。X日は何曜日でしょう。
```

<h3>・・・？:frowning2:</h3>
<h3>・・・？:frowning2:</h3>

<h2>解答コード（自作）</h2>
1日が日曜なら、、
7/14/21/28の「７」で割れる数字が来たら、Sat。
1と、8/15/22/29の「７」で割ってあまり１が来たら、Sun。
2と、9/16/23/30の「７」で割ってあまり2が来たら、Mon。という感じで良いのかな。


```java:
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        if(x%7==0){
            System.out.println("Sat");
        }else if((x%7==1)||(x==1)){
            System.out.println("Sun");
        }else if((x%7==2)||(x==2)){
            System.out.println("Mon");
        }else if((x%7==3)||(x==3)){
            System.out.println("Tue");
        }else if((x%7==4)||(x==4)){
            System.out.println("Wed");
        }else if((x%7==5)||(x==5)){
            System.out.println("Thu");
        }else if((x%7==6)||(x==6)){
            System.out.println("Fri");
        }
    }
}
```
<h4>修正バージョン</h4>

paizaの解答を確認し以下の通りに修正しました。
確かに、実際に手計算してみると、orの条件が無駄だったことに気づきました・・
```if((x%7==2)||(x==2))``` は、```(x%7==2)```で十分でした。

```java:
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        if(x%7==0){
            System.out.println("Sat");
        }else if(x%7==1){
            System.out.println("Sun");
        }else if(x%7==2){
            System.out.println("Mon");
        }else if(x%7==3){
            System.out.println("Tue");
        }else if(x%7==4){
            System.out.println("Wed");
        }else if(x%7==5){
            System.out.println("Thu");
        }else if(x%7==6){
            System.out.println("Fri");
        }
    }
}
```

<h2>終わり</h2>
[Mockk]SystemClockをモックする

`mockkStatic()`を使います。

``` Test.kt
class Test {
    @Test
    fun systemClockTest() {
        mockkStatic(SystemClock::class)
        every { SystemClock.elapsedRealtime() } returns 100L
        assertThat(SystemClock.elapsedRealtime()).isEqualTo(100L)
    }
}
```
Delta Lake形式のGenerated Column（生成列）利用時におけるMerge処理時の制約に関する調査

## 注意事項
本記事は、2021年9月15日時点におけるDatabricksでの調査結果です。

## 概要
Delta Lake 1.0から利用できるようになったGenerated Column（生成列）利用時におけるMerge操作に制約があるのですが、Merge内のInsert処理時にエラーとなるようです。

Delta Lakeのドキュメントにて、Generated Columnには下記のようにMerge処理がサポートされていないことが記載されております。

> MERGE operations do not support generated columns.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b6cb93ca-85d9-54af-7aa1-14490532037a.png)

引用元：[Table batch reads and writes — Delta Lake Documentation](https://docs.delta.io/latest/delta-batch.html#use-generated-columns)

Merge処理時のどの操作をサポートしていないのを検証したところ、Update処理をサポートしておりましたが、Insert処理がサポートされていないことがわかりました。下記が、Insert処理時のエラーメッセージです。チェック制約違反となることが原因であることから、Generated Columns列の制約を満たすカラムをソースとすることでMerege操作時にはエラーとなりませんでした。

> Error in SQL statement: InvariantViolationException: CHECK constraint Generated Column (`count_string` <=> > CAST(`count` AS STRING)) violated by row with values:
>  - count : 1
>  - count_string : null

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8560fae1-bda4-6a6e-d01d-b2c6207c35d0.png)


Databricks Runtime 9.1以降では、Insert処理にも対応するでき、実質的にMerge操作に制約がなくなるようです。
下記が実行結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/50ba0f63-26aa-546a-4ce4-4d2e6c79134d.png)

## 検証環境
databricks runtime : 9.0.x-scala2.12
Python  version    : 3.8.10
pyspark version    : 3.1.2

## 検証手順
下記のGithub pagesのページをご確認ください。

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

Databricks Runtime 9.1での実行結果は下記のページです。

https://manabian-.github.io/databricks_tecks_for_qiita/#merge_test_generate_columns/merge_test_generate_columns__db_runtiem_9_1.html

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

```URL
https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/merge_test_generate_columns/merge_test_generate_columns.dbc
```
Ubuntu Server 20.04.3 TLSインストール時に躓いたりしたことメモ

CentOSをメインで使っている人間が久々にUbuntuを導入して躓いたことをメモしておくだけの場所。

# インストール時に画面が崩壊した
文字が読めねえ。
grubのメニューでeを押して編集画面へ。
`/casper/vmlinuz quiet ---`とか書かれている行の末尾に`nomodeset`と追記して`ctl+x`で起動すると崩壊しない。
NVIDIA GPUが搭載されている環境でよく発生する問題だっけ？

# IPアドレスを固定化する
[公式ドキュメント](https://ubuntu.com/server/docs/network-configuration) に見慣れない方法が書かれていた。
`/etc/netplan/99_config.yaml`を作成して`netplan apply`すれば良いとのこと。今回書いたのはこんな感じ。

```
network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      addresses:
        - 192.168.0.3/24
      gateway4: 192.168.0.1
      nameservers:
        addresses:
          - ネームサーバ1のIPアドレス
          - ネームサーバ2のIPアドレス
      mtu: 1500
    enp4s0:
      addresses:
        - 192.168.1.3/24
      mtu: 9000
```

ドキュメントに倣ってネームサーバのアドレスを同じ行に並べたら`netplan apply`時に文法エラーで蹴られた。2つ目のインターフェースを書く方法はドキュメントに書かれていなかったのでエスパーした。
ちなみに2つ目はsambaでNASと10GbE接続するためだけのネットワークなのでゲートウェイもネームサーバも設定していない。それが妥当な設定なのかは知らないんだけど……。

設定の反映は`sudo netplan apply`で。

# firewall
ufwを使えと書かれている。デフォルトのstatusはinactive。
ローカルネットワークからだけSSH可能にする設定が書かれていたので真似した。

```
sudo ufw allow proto tcp from 192.168.0.2 to any port 22
sudo ufw enable
sudo ufw status verbose
```

不要になったルールを削除する方法がパッと見でわからなかったが、`ufw status numbered`で番号付きの一覧を出して、`ufw delete 対象の番号`で消せば良いようだ。
再起動してみたが、再起動前に設定していたルールは残っていた。
……設定をミスったときに再起動しても元に戻らないってことね……。

# rootログイン
`sudo passwd -u root`と`sudo passwd -l root`でrootログインの有効化/無効化できるとか完全に忘れていた。どうしてもrootで直接入って設定を弄りたいときに使う。


# タイムゾーン設定
UTCをJSTに変えておく。

```
timedatectl set-timezone Asia/Tokyo
```

# インストールしたパッケージに含まれているファイルの確認
具体的にシステムに導入されたファイルはどこ？とかいう時に。

```
dpkg -L パッケージ名
```

# 再起動時にDNSがひけなかった
なんかよくわからないけどひけなかった。以下で復活した。

```
sudo systemctl restart systemd-resolved
```

# ホスト名の設定
hostnamectlを使う。こんなコマンドいつからあったっけ？

```
sudo hostnamectl set-hostname hoge.example.net
```


# DockerでMailuでメールサーバ化
あとでかく
brewでインストール済のローカルMySQL5.7にログインしたらエラー「ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)」が出て、パスワード変更したら無事ログインできた

タイトルの通りです。

##背景
1. HomebrewでMySQL5.7インストール済
1. rootユーザーでログインできなくなった（以前はできていた）
1. パスワードを変更してみよう
1. 変更前と同じDBがあるか確認もできました

##環境

- MacOS Bigsur（Ver 11.4）
- Homebrew 3.2.10
- MySQL 5.7.34（Ver 14.14）


##手順
###rootユーザーログインエラー
```r:
$ mysql -u root -p

#エラー
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

###mysqlをストップする
```r:
$ brew services stop mysql@5.7

Stopping `mysql@5.7`... (might take a while)
==> Successfully stopped `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)
```

###mysqlのステータスを確認する
```r:
$ brew services list

Name      Status  User          Plist
mysql@5.7 stopped
```

###PATHを確認する
```r:
$ echo $PATH

...../usr/local/opt/mysql@5.7/bin:......
#コロンで区切ってある
```

###mysqld_safeで起動（セーフモード）
```r:
 $ /usr/local/opt/mysql@5.7/bin/mysqld_safe --skip-grant-tables      #ここで、さっき確認したPATHが必要

#以下が出力される
2021-09-15T06:02:06.6NZ mysqld_safe Logging to '/usr/local/var/mysql/MacBook-Pro.local.err'.
2021-09-15T06:02:06.6NZ mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql

#そのまま以下を入力
update mysql.user set authentication_string=password("新しいパスワード") where user='root';
```

###mysql再起動
```r:
sudo mysql.server start
```

###いざ、ログイン！！
「update」で新パスワードを設定した後に、画面がなかなか変わらなかったので、ターミナルの別ウィンドウを開いていじってたら、いつの間にか「~ $」（いつもの入力画面）に戻ってました。

```r:
~ $ mysql -u root -p
```

##さいごに
新パスワードでログインできた！！！
データベースも今まで通りでした。よかった〜
パスワードは変えてないはずだし、ログインできなくなった理由が分からなくて、もやもや。。。
とりあえず今まで通りのDB接続できるので進めます。


>参考
[Macにbrew installしたmysql Version5.7 rootパスワードを忘れた時の対処方法](https://qiita.com/bohebohechan/items/bc24c6cb5ea7c8a4b255)
npm install -gでのインストールでcommand not foundと出てしまうときにしたこと

##グローバルインストールをしたものの、コマンドがみつからない
今回、Amplify-cliをグローバルインストールしたものの、コマンドが見つからないと言われてしまいました。

```
npm install -g @aws-amplify/cli
amplify -v
zsh: command not found: amplify
```
結論としては、正しくPATHが通っていないことが原因でした。

##やってみたこと

環境
MacOS
nodeをインストール済み

ここでは、都合上`zsh: command not found: [command]`を例に取ります。
PATHが通っているかを確認。

```
which [command]
[command] not found // ないよ！
```


グローバルインストール先を確認。

```
npm bin -g
/Users/hoge/.npm-global/bin
```

私は`/Users/hoge/.npm-global/bin`と出ました。ここは人によって違うかもしれません。
次に、PATHを追加します。先ほどのグローバルインストール先を追加します。

```
export PATH=$HOME/.npm-global/bin:$PATH
```

$HOMEはホームディレクトリです。`/Users/hoge/.npm-global/bin:$PATH`でもOKだと思います。

PATHが通されているか確認。

```
which [command]
/Users/hoge/.npm-global/bin/[command]
```

これで使えるようになりました！


###PATHを通すってなに？？
自分がこの問題に直面した時に思ったことなので少しだけメモ程度に。
こちらの記事がわかりやすかったです！

PATHを通すとは？
https://qiita.com/soarflat/items/09be6ab9cd91d366bf71


コマンドを実行すると、それに対応するファイルを探しに行くんですね。つまり、PATHが通っていないということは、対応しているファイルがなく、見つからないということです。（例えば、今回の自分の例では、amplifyというコマンドを実行すると、PATHが通っている箇所にamplifyというファイルがないかを探しに行く）

PATHを通すということは、コマンドに対する実行ファイルが見つかるように検索範囲を広げてあげるというのがPATHを通すという意味なのかな？と思いました。


蛇足でした。これ間違ってる！などありましたら、お気軽にコメントください...!
PowerShell 初心

前説
Mac→Windowsへ転換。
Windowsでの有意義なCLIへ。
郷に入りては郷に従え。

# Windows Terminal
Viva windows.

#PowerShell
基本的にWindowsTerminalから使う事になる。という前提。

- Tabキーで補完。
- ショートカットキー参考にさせてもらいつつ：https://qiita.com/whim0321/items/6a6b11dea54642bd6724#shortcut-keys 
    - タブを閉じる：Ctrl + Shift + W
- 先頭に`$`でいつもの感じ。変数展開であろう。
    - 例)バージョンの確認。
        - 一覧）`$PSVersionTable`
        - 指定）`$PSVersionTable.PSVersion`
- **コマンドレット**と呼ばれるコマンドがあり、主に使う。
- sudo => ["-Scope CurrentUser" or "-Scope Process"] or [管理者として実行]　//いやそんなあんちょこな理解で、、、いいんだよ
    - 新規タブを管理者権限で開くには、そもそも管理者権限で起動しなければならない。
- Scope　スコープ
    - Scopeは複数ある。
    - Scope Process の方がそのプロセス限定の許可だから、とりまリスク的観点からこれ使ってけばいいかな
- Policy　ポリシー
    - Policyの種類も把握しておいてね。
    - 信頼発行元署名があれば実行とか。
    - スクリプト禁止とか
    - 全て実行可能とか
- 


##### 最初はこの4つだけ実行しよう。↓
- **Get-Verb**. このコマンドを実行すると、ほとんどのコマンドが従う動詞の一覧が返されます。 また、応答には、これらの動詞の動作が記述されています。 ほとんどのコマンドがこの名前付け規則に従うため、コマンドの動作 (適切なコマンドの選択に役立ちます)、さらにはコマンドを作成する場合の名前付けに関する期待値が設定されます。
- **Get-Command**. このコマンドでは、コンピューターにインストールされているすべてのコマンドの一覧が取得されます。
- **Get-Member**. オブジェクトベースの出力に対して動作し、コマンドで使用できるオブジェクト、プロパティ、およびメソッドを検出できます。
    - 使い方が特殊でしたぞ！ 例 > `Get-Process | Get-Member`
- **Get-Help**. コマンドの名前を引数として指定してこのコマンドを呼び出すと、コマンドのさまざまな部分について説明するヘルプ ページが表示されます。
## PowerShell ギャラリー
MSとPSコミュニティで運用されてる。
有意義なモジュールとスクリプトがある。
感謝と畏敬の念をもって協力的であるべし。

https://docs.microsoft.com/ja-jp/powershell/scripting/gallery/overview?view=powershell-7.1

PowerShellGetとNuGetのインストールが必要。
要はパッケージ管理的ツールですね。
↓
<details><summary>PowerShell, NuGet</summary><div>

###PowerShellGet

https://docs.microsoft.com/ja-jp/powershell/scripting/gallery/installing-psget?view=powershell-7.1
>PowerShellGet モジュールには、PowerShell ギャラリーやその他のプライベート リポジトリでモジュール、DSC リソース、ロール機能、スクリプトなどのアーティファクトを含む PowerShell パッケージを検索、インストール、更新、公開するためのコマンドレットが含まれています。

### NuGet
https://docs.microsoft.com/ja-jp/nuget/what-is-nuget
>Microsoft がサポートする .NET (.NET Core を含む) のコード共有メカニズムである NuGet では、.NET 用のパッケージを作成、ホスト、使用する方法が定義されており、それらの各ロール用の ツールが提供されています。

<img width=50% alt=image.png src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47947/339949ab-5964-5d80-ee4e-fc5feaa50fce.png">

</div></details>

---

###スクリプトの実行
はじめに。
**スクリプトファイル実行時の罠。**

:::note warn
ps1ファイルは「UTF-8」だと各方面のブログには書かれていたが、私の環境ではエラーが出た。
「UTF-8(BOM付)」で保存したら正常に実行できました。以上。
:::

**スコープとポリシーの確認**
スコープ毎にポリシーの設定をするよ。
（全部同じポリシーにはしないでしょう）
<img width=50% alt=image.png src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47947/67002e34-4eaa-0328-7b78-889d6b900b0d.png">
CurrentUserと、LocalMachineの2つはレジストリ サブ キーに記録される。（一度設定したら再変更するまでそのままになるよって事。）

ちょいちょいとやって


### PS1ファイル と PATH と function
PS1==PowerShellプロファイル
`$PSScriptRoot`(ver3～使用可)で現状を確認する。
プロファイルを分離する。
 - 分離した参照を追加する

### 配列
### For each
### パイプ
##### エラー
##### Trap

---

### レジトリー（Windowsだもんね）

###
Unityスプライトのちらつき対処(1枚絵)

##起きた現象
実行環境 Unity 2019.4.21f1
1枚絵のスプライトが移動時等に本来描画したい物よりもちらついてしまい若干汚く描画されてしまう事があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1468737/695b75bc-c4dd-0443-e551-50c036d9ce24.png)
スプライトがずれて描画されてしまっている

##対処
設定などをいじった結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1468737/8618bef3-e563-9c13-61c2-1b55cd27e165.png)
テクスチャのメッシュタイプの設定を<b>完全な矩形</b>にすることで解決した。
Gtk3アプリ RiderとT4テンプレートでHelloWorld

###T4テンプレートとは
Web言語にあるHTMLテンプレートエンジンのようなもの。
変数や配列を埋め込んで、For文で回してHTMLを出力したり、
テキストやCSクラスファイルを出力できる
クラスのテンプレートをC#とテキストで作り、CSのソースとして、Dllとして書き出すができる

####ttファイルを追加する

Riderのエクスプローラーから右クリックから追加からT4ファイルを選択

<img width="400" alt="dotnet-t4-new-file.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/ccd07504-1dab-4cb9-e4b0-9af900449dce.png">

####ttファイルを開く

HelloWorldを記入します

``` test.tt
<#@ template language="C#" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
HelloWorld
```

###NugetからSystem.CodeDomをインストール

<img width="500" alt="Screenshot from 2021-09-15 14-37-44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/309ee017-90ab-fc0b-0725-33d810a07d70.png">
System.CodeDomをインストールしてください。
インストールしていないとコンパイル時に'System.CodeDom.Compiler' に見つかりませんでしたとエラーが出ます。

```
型名 'CompilerErrorCollection' は名前空間 'System.CodeDom.Compiler' に見つかりませんでした。
この型はアセンブリ 'System.CodeDom, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 
に転送されました。このアセンブリへの参照を追加することを検討してください。
```

####ttファイルを実行

Preprocess Templateから実行

<img width="300" alt="dotnet-t4-execute.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/bc6aa7c6-c7df-daa0-847b-f61ba639f85f.png">

####実行

CSの従属ファイルが生成されます。
<img width="250" alt="Screenshot from 2021-09-15 14-33-24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/a7ec6900-11c9-a8a9-31ac-e1d2ceddd03a.png">

####テキストを出力するコードを書く

適当なところにクラスを宣言し、TransformText()を呼び出すとテンプレートの内容が出力されます。
System.CodeDomがNugetからインストールしていないとTransformTextでエラーが出ます。

```cs
test test = new test();
var a = test.TransformText();
Console.WriteLine(a);
```
<img width="450" alt="Screenshot from 2021-09-15 14-36-14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/a1841d10-7c48-823d-b93e-ae089d4abcfd.png">

####変数に値を入れる。コンストラクター変数を入れてttの中で表示する

従属クラスはpartialクラスのため、後付でクラスの内容を追加することができます。
コンストラクターやSetterを追加します。


```cs
namespace T4SapmleGtkApp
{
   partial class test
    {
        public string TestText1;
        
        private string TestText2;
        public test(string data)
        {
            this.TestText2 = data;
        }
    }
    class MainWindow : Window
    {
        public MainWindow() : this(new Builder("MainWindow.glade"))
        {
            test test = new test("2222");
            test.TestText1 = "1111";
            var a = test.TransformText();
            Console.WriteLine(a);
        }
    }
```

TTファイルの中では<#=  　#>でC#の領域にして表示します。

```test.tt

<#= TestText1 #>

<#= TestText2 #>
```

####For文の使い方

<# #>内がC#の領域
<#= val #>内がC#の変数１つまで表示する
それ以外はテキストを表示する

```
<# var val = "test"; #>
<# for (int i = 1; i <= 10; i++){ #>
        test <#= val #> <#= i #>          
<# } #>
```


####参考資料
https://light11.hatenadiary.com/entry/2021/03/01/204148

https://docs.microsoft.com/ja-jp/visualstudio/modeling/run-time-text-generation-with-t4-text-templates?view=vs-2019


[Gtk3アプリ TextView TreeViewにスクロールバーを表示する](https://qiita.com/iota_11/items/32e9f573626b3ac2ba1d)に続く
Azure Functions（Python+Matplotlib）

# 概要

公式のドキュメント「[クイックスタート: コマンド ラインから Azure に Python 関数を作成する](https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-cli-python) 」を整理・補足したものになります。

最後に、matplotlibを使ってグラフを生成してレスポンスするウェブAPIのサンプルコードを付けています。

## 動作確認環境
- Windows Windows 10 Pro 20H2

# 準備

## Azure Functions Core Tools のインストール
[Azure Functions Core Tools](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local) の最新版をインストールする。コマンドラインからバージョンを確認する。`3.0.3734(x64)`

```bat:AzureFunctionsCoreToolsのバージョン確認
func --version
```
## Azure CLI のインストール と Azureログイン

[Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli) の最新版をインストールする。コマンドラインからバージョンを確認する。`2.28.0`

```bat:AzureCLIのバージョン確認
az --version
```

Azure CLI で Azure にログインする。コマンドラインから下記を実行すると、ウェブブラウザが立ち上がるので指示に従って Azure アカウントにログインする。

```bat:Azurログイン
az login
```

## Pythonのバージョン確認と仮想環境の設定

Pythonのバージョンを確認する。Function App（関数アプリ）で、Python（ランタイムスタック）は `3.6` から `3.9` に対応している。 ここでは、`3.8.5` を想定します。

```bat:Pythonバージョン確認
python -V
```

Pythonの仮想環境 `azure-func` を作成して有効化する（virtualenv + virtualenvwrapper を想定）。pipのバージョンを最新にする。

```bat:
mkvirtualenv azure-func
workon azure-func
pip install --upgrade pip
```

# プロジェクトの作成

関数アプリのプロジェクトを管理するためのフォルダ `AzureFunc02` を作成して移動する。

```bat:
cd "C:\Users\xxxx\Documents\Projects\AzureFunc02"
```

プロジェクトの初期化とHTTPトリガの関数 `HttpTrigger01`（テンプレートとなるものを自動生成）する。

```:
func new --name HttpTrigger01 --template "HTTP trigger" --authlevel "anonymous"
```

実行すると `Use the up/down arrow keys to select a worker runtime:` と尋ねられるので上下キーで `Python` を選択する。

生成された関数フォルダ `HttpTrigger01` に移動する。`__init__.py` と `function.json` の2ファイルがある。

```:
cd HttpTrigger01
```

`__init__.py` を確認して、必要なモジュールをインストールする。また、編集を行なう。

```:
pip install azure.functions 
```

# ローカルでの動作確認

プロジェクト `AzureFunc02` のトップフォルダに戻って、ローカルで動作テストをする。

```:ローカルで動作テスト
func start --python --port 8000
```

# クラウドに発行して動作確認

Azure に `xxxx-p-func2` という名前の Function App（関数アプリ）を新規作成する。既にAzureに、`XXXX-JapanEast-RG` というリソースグループ、`storage01xxxx` というストレージアカウントが作成済みであることを前提にしています。

```:Azureにリソース追加
az functionapp create --consumption-plan-location japaneast ^
--runtime python ^
--runtime-version 3.8 ^
--functions-version 3 ^
--name xxxx-p-func2 ^
--os-type linux ^
--resource-group XXXX-JapanEast-RG ^
--storage-account storage01xxxx ^
--disable-app-insights true
```

ローカルで開発してものを Azure に発行する。

```bat:発行する
func azure functionapp publish xxxx-p-func2
```

# 補足

- `requirements.txt` に `matplotlib` を追加する。

```py:__init__.py（Matplotlibで画像を生成してレスポンス）
import logging
import io
import numpy as np
import azure.functions as func
import matplotlib
import matplotlib.pyplot as plt

matplotlib.use('Agg')

def main(req: func.HttpRequest) -> func.HttpResponse:
  logging.info('Python HTTP trigger function processed a request.')

  image = io.BytesIO()
  x = np.linspace(0, 10)
  y = np.sin(x)
  plt.plot(x, y)
  plt.savefig(image, format='png')
  image.seek(0)
  return func.HttpResponse(image.read(),mimetype='image/png')
```


# 参考資料
- VS Code の拡張機能で同様のことを行なう。

https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-python
FlutterがiOSシミュレータを認識しなかった話

## 前置き

経緯の説明から。

XCodeをApp Storeから入れていたのですが、容量が大きすぎるので一度削除しました。代わりにApple Developerサイトからコマンドラインツールをダウンロードして入れたのですが、今度はシミュレータを入れれず。

色々試したあと、入れてからシミュレータを厳選する作戦を思いつき、Apple DeveloperからXCodeをダウンロードしました。

## 症状

XCodeを入れているのに、iOSシミュレータを認識しませんでした。シミュレータを起動して

```
Flutter devices
```

と入力しても、デバイスが出てきません。そこで調べていると、以下を見つけました。

https://stackoverflow.com/questions/64944483/flutter-doctor-xcode-installation-is-incomplete

## 手順

XCodeを開く

メニューバー > Xcode > Preferance > Location > Command Line Toolsが空白になっていたら、選択して埋める。

これで解決しました。お役に立てましたら幸いです。
Formサンプル

##SpringBoot Formクラス記入例
```
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.time.LocalDate;

@Data
public class RegistCustomerForm {
  private Integer Id;
  
  @NotBlank
  @FullWidth
  @Size(max = 20)
  private String Name;

  private LocalDate createdAt;
  private LocalDate updatedAt;
}
```

##パッケージ javax.validation.constraints
【公式】https://spring.pleiades.io/specifications/platform/8/apidocs/javax/validation/constraints/package-summary.html
各種ブラウザのバグ報告窓口 wip

wipのブラウザについてレポートする場所を知っている方がおりましたら教えていただけると助かります。
また、情報に誤りがありましたらそちらについてもご指摘ください。

## Google Chrome
https://bugs.chromium.org/p/chromium/issues/list

ヘッダーのNew Issue → 事象の説明を書く


## Safari
要appleアカウント
https://feedbackassistant.apple.com/

## Edge

wip

## firefox

https://bugzilla.mozilla.org/home
new bug → アカウント作成？

## Internet Explorer 11

wip
【intra-mart】 公式ドキュメント集

<h1>目次</h1>
[1.  はじめに](#1.はじめに)
[2.  公式ドキュメント集](#2公式ドキュメント集)
[3.  まとめ](#3.まとめ)

#1.はじめに
intra-martを習得するにあたり、何度も見るであろう公式ドキュメントをまとめました。
対象は、intra-mart Accel Platformをこれから使う人、intra-martってなんぞやという人(初心者)です。まずはここから知っておかないとという部分の公式ドキュメントをまとめています。

#2.公式ドキュメント集
<h3>1.セットアップガイド</h3>
まずはこのドキュメントを見ながら、セットアップを進めましょう。

https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/index.html

<h3>2.ユーザ操作ガイド</h3>
IM-Workflow では、intra-mart上で申請・承認などを伴うワークフロー業務を実現するために必要な機能を用意しています。基本的なintra-martの操作をユーザ目線で、基本から応用まで見ることができます。

https://document.intra-mart.jp/library/iap/public/im_workflow/im_workflow_user_guide/index.html


<h3>3.機能ガイド</h3>
まず最初に知っておきたい機能のガイドを抜粋しました。
・認可

https://document.intra-mart.jp/library/iap/public/im_authz/im_authz_specification/index.html

・アクセスコンテキスト

https://document.intra-mart.jp/library/iap/public/im_core/im_context_specification/index.html

・認証機能

https://document.intra-mart.jp/library/iap/public/im_certification/im_certification_specification/index.html

<h3>4.管理者操作ガイド</h3>
・システム管理者操作ガイド

https://document.intra-mart.jp/library/iap/public/operation/system_administrator_guide/index.html

・テナント管理者操作ガイド

https://document.intra-mart.jp/library/iap/public/operation/tenant_administrator_guide/index.html

<h3>5.仕様書</h3>

・IM-Workflow 仕様書(重要)
最初の申請から最終的な承認までの案件の流れを一通り見ることができます。この仕様書を見つつ疑問を持ったら、個別の詳しい仕様書を見るといった流れで進めていくと理解が早くなると思います。

https://document.intra-mart.jp/library/iap/public/im_workflow/im_workflow_specification/index.html#

・テナント環境セットアップ仕様書

https://document.intra-mart.jp/library/iap/public/im_import_export/tenant_environment_setup_specification/index.html#


#3.まとめ
以上、まずこれからintra-martに触れてみるぞといった初心者に向けて、何度も見るであろう公式ドキュメントをまとめました。最後に、ある程度intra-martのことが分かったら実際に開発してみようということで、開発ガイドの方もまとめておきます。（自分も頑張ります。）
<h3>★開発ガイド(中級者用？)</h3>

https://document.intra-mart.jp/library/iap/public/im_workflow/im_workflow_programming_guide/index.html
GraphQLの自己解釈（Query）

# はじめに
これはあくまで、チュートリアルを実施した結果、こういうふうに見えるなーって図示したものなので、こういう仕組みってわけではないです。
個人的にこういう流れの理解でいると、実装やすいかなーってのを書いてます。(MVC的な解釈を入れた感じ)

参考
https://apollographql-jp.com/tutorial/introduction/

# データフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247263/5a03e935-9f28-0323-5775-9dbed5796b88.png)


■作成フロー

- スキーマで、Queryや型などインターフェースを決める
- スキーマで定義したQuery等をリゾルバーで実装
- リゾルバーはデータソースに対して取得を要求
- データソースは、それぞれに応じた取得先からデータを取得(APIからデータ取得、RDSからデータ取得等)
- リゾルバーはスキーマで定義したQueryの型でデータを返却

■クライアント

- 取得したいQueryの名前と、そのQueryの返却値から必要なものだけ指定して要求
- １つのリクエストに複数の Queryを指定して取得ができる

例

```
query getData {
  events(id: 1) {
    id,
    name,
    manager {
      id,
      name
    }
  }
  users {
    id,
    name
  }
}
```


# まとめ
- クライアントとしては欲しいデータを指定するだけで取れるので便利そう。
- エンドポイントが１つと言っても、取得に対応した実装は必要＝データ取得API等は既存通りで実装は必要そう。

勉強開始してまだまだ序盤ですが、慣れると良い感じな気がしてきました。
引き続き勉強の方は細々と続けて行けれればです。