OmniAICreator/Qiita-1.07M huggingface dataset:
Tips _Tableau Desktopのカラーパレットの追加方法

人によっては既存のカラーパレットに好みのパターンがない、、違う色で表現したい。と思ったことはないでしょうか。

Tableau Desktopではデフォルトのカラーパレットに対して自身の好みのパターンを追加することができます。

※以下、デフォルトのカラーパレットイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325705/13e60c33-4905-42e9-b198-97c4d04e9bb9.png)

## カラーパレット追加手順
1. ドキュメント　＞　マイ Tableau リポジトリ　＞　Preferences.tps　を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325705/e8d9af96-2f82-32f1-6dab-6cb3fd6d1c83.png)

2. preferences タグの間に指定のカラーパレットを追加して保存します。
※type 属性に regular が指定されているため、このパレットをカテゴリー パレットとして識別します。
Preferences.tps ファイルで、“preferences” タグの間に、以下のような例を貼り付けます。
カラー パレットの名前とタイプを区切る文字には、曲線型の引用符ではなく直線型の引用符を使うようにする。

以下、コマンド・tpsファイルの編集イメージ
<color-palette name="My Categorical Palette" type="regular"> <color>#eb912b</color> 
<color>#7099a5</color> 
<color>#c71f34</color> 
<color>#1d437d</color> 
<color>#e8762b</color> 
<color>#5b6591</color> 
<color>#59879b</color> 
</color-palette> 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325705/27724d75-c0b4-1660-096d-debf752d3cbc.png)

3.Tableaudesktopを再起動する。

4.追加した「My Categorical Palette」が確認することができる。
※Tableauの再起動が必ず必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325705/d39e8e62-6c16-0ef8-08e0-23c193edf2dc.png)

# おまけ
カラーパレットのパターンはTableau Publicに上げている人が多くいらっしゃいます。
好みのカラーパレットを例としてあげている「Preferences.tps」をダウンロードし、前ページの手順に沿って追加できます。

検索画面で「Color」と入れるだけでもヒットするため好みの色を探すことをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325705/a6164d2a-4846-fa71-99b2-754287dc3033.png)
Rust の static を感じる

## ことの発端

最近、`Rust`に入門しました。
どんな言語も課題があると習得も早いだろうってことで、まずは`ReactiveX`を`Rust`で実装してみました。[^1]
`ReactiveX`は関数型や非同期を扱うライブラリで、ほぼすべてがジェネリクスで構成されます。
その中で、なかなかスンナリ入ってこなかったのが `static` でした。

で、個人的に色々とやってみて、「なるほど」となったので記事にしてみました。

## Rust の static

まず、`C++`の`static`とは似て非なるものです。
罪悪感を抱えながら「今日もstatic（グローバルステート）を増やしてしまった。。。」的な「あの`static`」ではありません。

まず、`Rust` の `static` には２種類あります。

1. staticライフタイム
1. staticライフタイム境界

`staticライフタイム`は `C++` の `static` と同じです。
が、しかし、`Rust`ではプリミティブ型やリテラルだけが `static` 定義できます。つまり、オブジェクトは　`static ライフタイム`が使えません。`Singleton`パターンを使ってグローバルステートを実装することはできますが、`staticライフタイム`なオブジェクトは作れません。

ほいで、次の `staticライフタイム境界` が曲者です。

## `staticライフタイム境界` とは

ざっくりいうと、

<b> 「 参 照 が 含 ま れ な い も の 」</b>

です。

参照は所有者が居てその所有者が手放すまでが生存期間（ライフタイム）になりますが、その参照が含まれていなければ全て`staticライフタイム境界`です。（もうね〜、何というか、言い方変えて欲しい。。。）

具体的にコードで実証してみます。


## `staticライフタイム境界` を感じる

### 準備

まず、こんなコードを書きます。

```rust
fn is_static<T>(_: T)
where
  T: 'static,  // <-- これが 「satticライフタイム境界」　というヤツです。
{}
```

これは`staticライフタイム境界`の変数を渡さないとコンパイルエラーになる関数です。
この関数に色々と値を渡してみると理解が早いかもです。

### リテラル

`C++er`は、この時点で「？？」ですが、これが先述の`staticライフタイム境界`です。

```rust:パターン1(OK)
  is_static(123);
```

### 実体を`move`

```rust:パターン2(OK)
  let x = 0;
  is_static(x);
```

### 参照

「参照が含まれるもの」というか、参照そのものもNGです。

```rust:パターン3(NG)
  let x = 0;
  is_static(&x);
```

### クロージャー(外部変数のキャプチャなし)

`C++` ではラムダ式です。

```rust:パターン4(OK)
  let f = || {};
  is_static(f);
```

### クロージャー（参照でキャプチャ）

クロージャーは外部変数のキャプチャしているオブジェクトです。
このキャプチャしている変数は　`move` を指定しないと参照になります。

```rust:パターン5(NG)
  let x = 0;
  let f = || println!("{}", x);
  is_static(f);
```

### クロージャー（`move`でキャプチャ）

`move` すればクロージャー内は実体を所有することになるので、無問題。

```rust:パターン6(OK)
  let x = 0;
  let f = move || println!("{}", x);
  is_static(f);
```

### `'static str&`

`staticライフタイム`の参照は許されます。

```rust:パターン7(OK)
  let a = "abc";  // <--  &'static str
  is_static(a);
```

## 所感

やっぱり　`static` と書くのは抵抗がある。。ｗ


[^1]: ちょっとだけ本気で作ってみた -&gt; [another-rxrust](https://github.com/CODIANZ/another-rxrust)
一定期間のメモリ使用率を取得する方法（freeコマンド）

## 概要

一定期間内のメモリの使用率を知りたい事があったので、freeコマンドをリアルタイムで実行しつつファイルに出力する方法で、メモリ使用率を得ました。
ALTER TABLE実行時のメモリ使用率を出力するためにシェルスクリプトを用いていい感じに取得しました。

## 使用するシェルスクリプトの作成

ファイルの作成
```
vi /usr/bin/free.sh
```
ファイルの中身
```sh
#!/bin/bash
set -e

echo `date '+%y/%m/%d %H:%M:%S'`[INFO]メモリ使用率計測処理開始

#freeコマンド実行,メガバイトで、3秒に１回表示,タイムスタンプもつけてます
free -m -s 3 | awk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 } { system(":") }' > /tmp/free-original.log &
pid1=$!

#####################################################################################
###                ここは適宜実行時にメモリ利用率を計算したいコマンドを記載                     ###
#####################################################################################

#今回はALTER TABLEを実行しているときのメモリ使用率を計測したかったので、以下のような感じ
mysql -u root -e "SELECT NOW();" >> /tmp/result.log
mysql mydb -u root -vvv -e "ALTER TABLE t1 ADD test_coulumn CHAR(1) NOT NULL DEFAULT 'N';" >> /tmp/result.log &
pid2=$!
mysql -u root -e "SELECT NOW();" >> /tmp/result.log

#今回テストのため10秒遅延
sleep 10

#####################################################################################
###                ここは適宜実行時にメモリ利用率を計算したいコマンドを記載                     ###
#####################################################################################

echo `date '+%y/%m/%d %H:%M:%S'`[INFO]コマンド実行中...

#コマンドが実行するまでwait
wait ${pid2}

#freeコマンドをkill
kill -9 ${pid1}

#メモリの使用率をfree結果から抜き出す
awk '/Mem/ {total+=$4;available+=$9} END {printf("%.5f" ,(((total-available)/total)*100))}' /tmp/free-original.log > /tmp/free-mem.log

echo `date '+%y/%m/%d %H:%M:%S'`[INFO]メモリ使用率計測処理終了
```
コマンド実行
```
bash /usr/bin/free.sh
```

## 生成されるファイルについて

生成されるファイルの説明はそれぞれ以下になります。
|  ファイル名  |  用途  |
| ---- | ---- |
|  /tmp/free-original.log  |  freeコマンド実行結果のオリジナルの結果が出力されます  |
|  /tmp/result.log  |  コマンドの標準出力の結果が出力されます  |
|  /tmp/free-mem.log  |  コマンド実行時のメモリ使用率が出力されます  |
|  /usr/bin/free.sh  |  これは生成されるというか先程作ったshファイルです  |

## シェルスクリプトの内容を説明

`set -e`でエラーの場合処理を中止してくれる。
```sh
#!/bin/bash
set -e
``` 
freeコマンドを実行する。メガバイト表示で3秒に１回表示するようにしています。タイムスタンプも表示するようにしていて、その結果は`/tmp/free-original.log`に出力されるようになっています。また、`&`をつけてバックグラウンドで実行するようにしています。
```
free -m -s 3 | awk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 } { system(":") }' > /tmp/free-original.log &
pid1=$!
```
ここは計測したいコマンドを入力してください。今回は、ALTER TABLEを実行しているときのメモリの使用率を調べたかったので、ALTER TABLEを実行しています。
```
#今回はALTER TABLEを実行しているときのメモリ使用率を計測したかったので、以下のような感じ
mysql -u root -e "SELECT NOW();" >> /tmp/result.log
mysql mydb -u root -vvv -e "ALTER TABLE t1 ADD test_coulumn CHAR(1) NOT NULL DEFAULT 'N';" >> /tmp/result.log &
pid2=$!
mysql -u root -e "SELECT NOW();" >> /tmp/result.log

#今回テストのため10秒遅延
sleep 10
```
上記のコマンドが実行完了するまで、次の処理に行かないようにwaitします。
```
wait ${pid2}
```
コマンドが実行完了したら先ほど実行したfreeコマンドをkillします。
```
kill -9 ${pid1}
```
freeコマンドの実行結果（`/tmp/free-original.log`）からメモリの使用率を計算しています。計算としては、以下になっています。
`メモリ使用率 = (((全体のメモリ使用率 - メモリの空き容量) ÷ 全体のメモリ使用率) × 100)`
```
awk '/Mem/ {total+=$4;available+=$9} END {printf("%.5f" ,(((total-available)/total)*100))}' /tmp/free-original.log > /tmp/free-mem.log
```

# まとめ

今回は、コマンド実行時のメモリ使用率を求めるシェルを作成しました。なにか不備等ありましたらご指摘ください。
LINE Botから送りつけた画像をNode-REDで表示する

# やりたいこと
最終的には、LINE Botから画像を送り、Node-REDを介して、TeachableMachineで判定させ、LINE　Botに判定結果を送信する。
というところまでやりたいですが、この記事ではLINE Botに送った画像をNode-REDで表示するというところまでやります。
![スクリーンショット 2023-04-08 23.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/40908ae3-0657-4285-cf20-78dc744f769a.png)

# 前提
この記事では以下のことは完了している前提です
- LINE　Botの作成
- Node-REDの環境構築

# 手順
1. パレットの管理で「node-red-contrib-image-output」、「Node-REDのnode-red-contrib-line-messaging-api」のノードを追加します
1. パレットから、LINEの「webhook」、機能の「template」、ネットワークの「http request」、出力の「image」をパレットに展開しつなぎます
![スクリーンショット 2023-04-08 23.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/40908ae3-0657-4285-cf20-78dc744f769a.png)
1. webhookの設定をします
path, name ともに何でもいいですが、のちほどLINE Developerに登録する際に必要なので、よくわからない場合は、webhookにしておきましょう。
![スクリーンショット 2023-04-08 23.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/14e60585-55f3-452e-87bc-29c66f5bcc28.png)

1. templateの設定をします
![スクリーンショット 2023-04-08 23.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/3bdf09a6-499f-0d72-357c-bfeba2f6a8e4.png)

1. http requestの設定をします
![スクリーンショット 2023-04-08 23.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/553cecc4-55da-f4f0-9090-53cebffc47d6.png)
URLには以下を入力
```
https://api-data.line.me/v2/bot/message/{{{messageId}}}/content
```
LINE DevelopersのLINEBotの設定画面からチャンネルアクセストークンをコピーし、トークンに貼り付ける

LINE DevelopersのWebhookURLを変更も設定が必要です。
なんらかのホスティングサービス等を使ってNode-REDをインターネット上に公開していると思うので、
そのURLに、LINEの「webhook」ノードで設定した「/webhook」を末尾につけLINEBotのwebhookURLを更新します。

:::note
現在のNode-REDを表示しているページのURLが「https://node-red-test-xxx.xxxxxxxx.com/#flow/123456789」  という形であれば、　「https://node-red-test-xxx.xxxxxxxx.com」 の部分に、「/webhook」を付けて、「https://node-red-test-xxx.xxxxxxxx.com/webhook 」 という形式
:::

URL内の`{{{messageID}}}`の`{}`は**3つ**なので注意してください・

次に認証を使用にチェックを入れ、種別は`Bearer認証`を選びます。`トークン`には事前に用意した**LINE botのチャネルアクセストークン**を貼り付けます。

最後に出力形式は`バイナリバッファ`を選択します。

以上でLINE画像の送付準備は完了です。

# 解説
## ゴニョゴニョなにやってるの？
LINE　Botから送られてきた情報を「webhook」で受け取り、
「template」でその中からメッセージIDを取り出し、
「http request」でメッセージIDに紐づくデータを取得し、
取得できたかの確認のため「image preview」で表示
ということをやっています。

## なんでLINEBotから送られた情報の中に画像のデータがないの？
おそらくですが、毎回毎回画像データごと送っていては大変だからでしょうか。
もし必要だったら、以下のAPIを利用して、改めて画像をゲットしにいく仕様になっています。
```
https://api-data.line.me/v2/bot/message/{{{messageId}}}/content
```

[詳細はこちら](https://developers.line.biz/ja/reference/messaging-api/#get-content)
遅延初期化

# 遅延初期化

Rubyではインスタンス変数を遅延初期化するときには、 ||= という演算子を使います。

```rb:遅延初期化の例
1  private def current_staff_member
2    if session[:staff_member_id]
3      @current_staff_member ||=
4        StaffMember.find_by(id: session[:staff_member_id])
5    end
6  end
```

##### 解説
current_staff_memberメソッドが初めて呼ばれた時は、@current_staff_memberは空なので、
3行目の演算子の||右辺の4行目が呼ばれる
```ruby:
4        StaffMember.find_by(id: session[:staff_member_id])
```

2回目以降メソッドが呼ばれた時は、nilでもfalseでもない値がセットされているので、
||の右辺は評価されず左辺だけが評価される。
（この例の場合、@current_staff_memberの値だけ返される）

このように遅延初期化を使うと、staffMember.find_byメソッドが初回しか呼ばれないので効率が良い。
【Mac】文字を読み上げる方法【say】

## `say`コマンド

`say`コマンドを使用することで文字の読み上げができます。  
以下のコマンドを実行すると`こんにちは`が読み上げられます。  

```terminal
say "こんにちは"
```

引数を渡さない場合には標準入力から取得します。  

```terminal
echo "こんにちは" | say
```

次のように実行するとファイルの内容を読み上げます。  

```terminal
$ cat sample.txt 
こんにちは

$ say -f sample.txt
```

再生速度を変更するには`-r`を使用します。  

```terminal
say -r 200 "こんにちは"
```

また読み上げる音声を変更できます。  
次のコマンドは`Kyoko`で`こんにちは`を読み上げます。  

```terminal
say -v 'Kyoko' "こんにちは"
```

使用できる音声一覧を表示するには次のコマンドを実行します。  

```terminal
$ say -v '?'
Albert              en_US    # I have a frog in my throat. No, I mean a real frog!
Alice               it_IT    # Salve, mi chiamo Alice e sono una voce italiana.
Bells               en_US    # Time flies when you are having fun.
Boing               en_US    # Spring has sprung, fall has fell, winter's here and it's colder than usual.
Bubbles             en_US    # I sure like being inside this fancy computer
Carmit              he_IL    # שלום. קוראים לי כרמית, ואני קול בשפה העברית.
Cellos              en_US    # Doo da doo da dum dee dee doodly doo dum dum dum doo da doo da doo da doo da doo da doo da doo
Damayanti           id_ID    # Halo, nama saya Damayanti. Saya berbahasa Indonesia.
Daniel              en_GB    # Hello, my name is Daniel. I am a British-English voice.
Daria               bg_BG    # Здравей, казвам се Дария и съм български глас.
Wobble              en_US    # I sure like being inside this fancy computer
Jester              en_US    # Please stop tickling me!
Ioana               ro_RO    # Bună, mă cheamă Ioana. Sunt o voce românească.
Jacques             fr_FR    # Bonjour, je m’appelle Jacques.
Joana               pt_PT    # Olá, chamo-me Joana e dou voz ao português falado em Portugal.
Junior              en_US    # My favorite food is pizza.
Kanya               th_TH    # สวัสดีค่ะ ดิฉันชื่อกันยา
Karen               en_AU    # Hello, my name is Karen. I am an Australian-English voice.
Kathy               en_US    # Isn't it nice to have a computer that will talk to you?
Kyoko (Enhanced)    ja_JP    # こんにちは! 私の名前はKyokoです。
Kyoko               ja_JP    # こんにちは、私の名前はきょうこです。日本語の音声をお届けします。

```
ChatGPTの仕組みとDeep Learningの不思議

# はじめに
ChatGPTの勉強会で作成した資料です。
**GPTの歴史**を知りたい方や**モデルが大規模になっている理由**に興味のある方はぜひご覧ください！

<br>
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vT8E2_NyL6q3bWQt04G12LQE-ccqUuFjEKfyHm3ViuiVBg5wHdZOMrvhFjU-IwlkA/embed?start=false&loop=false&delayms=3000" frameborder="0" width="1280" height="749" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

浅学のため内容に誤りがございましたらご連絡いただけますと幸いです。
Docker+SpringBootの仮想環境作ってみた。

# Docker+SpringBootの仮想環境作ってみた。
Spring Bootで作成した、webアプリケーションを仮想環境で実装するサンプルプロジェクトを作成しました。

## 使用技術
Java : 17
Spring Boot : 3.0.5
thymeleaf
spring-boot-starter-web
lombok
spring-boot-devtools
Docker

## ファイル構成
```
.
├── README.md
├── app
│   ├── build.gradle
│   ├── gradle
│   │   └── wrapper
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── settings.gradle
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── com
│       │   │       └── example
│       │   │           └── demo
│       │   │               ├── AppApplication.java
│       │   │               └── controller
│       │   │                   └── helloController.java
│       │   └── resources
│       │       ├── application.properties
│       │       └── templates
│       │           └── index.html
│       └── test
│           └── java
│               └── com
│                   └── example
│                       └── demo
│                           └── AppApplicationTests.java
├── docker-compose.yml
└── dockerfile
```
- dockerfile
``` dockerfile
FROM openjdk:18
RUN microdnf install findutils
```
- dockercompose.yml
``` docker-compose.yml
version: '3'
services:
  app:
    build: .
    container_name: java
    tty: true
    ports:
      - 8080:8080
    working_dir: /doc
    volumes:
      - ./app:/doc
```

その他、追加したファウル
- helloController.java
``` helloController.java
package com.example.demo.controller;

import org.springframework.stereotype.Controller;

@Controller
public class helloController {
	public String getHello() {
		return "/index";
	}
}
```
- index.html
``` index.html
<!DOCTYPE html>
<html xmlns:th="http://thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>sample</title>
</head>
<body>
	<h1>HelloWorld</h1>
</body>
</html>
```

## 起動方法
- クローン
``` bash
git@github.com:yukishi24/SpringBootTestContainer.git
```

- docker-composeを起動
``` bash
cd SpringBootTestContainer
docker-compose up -d
```

- 起動確認
``` bash
docker ps -a
```

以下が表示されていれば起動してる
``` bash
CONTAINER ID   IMAGE                         COMMAND    CREATED          STATUS          PORTS                    NAMES
42f2e3e25b00   springboottestcontainer-app   "jshell"   15 seconds ago   Up 14 seconds   0.0.0.0:8080->8080/tcp   java
```
- 起動したコンテナに入る
``` bash
docker exec -it java /bin/sh
```
- Springの起動
``` bash
sh-4.4# sh gradlew bootRun
```

[localhost](http://localhost:8080)に接続<br>

ブラウザに「Hello World」が表示されていれば成功

詳しくは、[GitHub](https://github.com/yukishi24/SpringBootTestContainer.git)を参照ください。
[次回](https://qiita.com/yukishi24/items/adb937a3f62c06c02de7)は、webアプリ開発に必要なDBを仮想環境に構築していきます。
【備忘録】SQL Server 認証モードの切り替え（visual studio 2022）

# 初めに
こちらの手順では、SQL Serverに対して、認証モードを切り替える手順を記載しています。
設定を行うことで、SQL Serverに対して、認証できるユーザーを制御できるようになります。

# 流れ
## ① 設定したいSQL Serverのプロパティを開く。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/af9c1f06-f4b9-d9c8-4a14-dfc4630659d2.png)

## ② セキュリティタブからサーバー認証を確認し、SQL Server 認証モードを設定する。
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/8f6cd014-7ae1-65c1-6b00-1cb622a2a10a.png)


## ③ モードを反映するため、SQL Serverを再起動する
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/abfd29d0-75f8-fa6a-6320-b1d644c54ea8.png)

## ④ ユーザーのプロパティを開く。
![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/a0401bf3-f659-1f3c-3c3e-1d5b14964bb7.png)

## ⑤ 全般タブからログインユーザーのパスワードを入力する。
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/f16cd961-2c9e-0935-51e5-b8fa4666f1f6.png)

## ⑥ 状態タブからログインを有効にする。
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/ce400b89-96d0-889a-27da-827179326417.png)


## ⑦ SQL Serverの接続を解除し、再度登録したユーザーでログインする。
1. SQL Serverの接続を解除します
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/c048730e-ab3a-31bf-93ec-9449f77bfc1a.png)
2. 再度、SQL Serverへ接続します。その際、認証の種類を「SQL Server認証」にします。
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/ca77e47a-4ec3-89f5-7b0a-142c1043d326.png)
登録したユーザーIDとパスワードを入力し、接続に成功したら、認証モードの切り替えに成功です。
![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/3205fa14-fdb1-d362-b157-2de6f03a50ed.png)


# 注意事項
- この記事では、SQL ServerやSSMSを使用しているので、試してみたい方は事前に準備が必要です。

# この記事は誰向けの記事か？
- SQL Serverの認証モードを切り替える手順を知りたい人

# 環境
- OS：Windows10
- [SQL SErver Management Studio（SSMS）](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads):v19.0.2
- [SQL Server 2022](https://learn.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16)

# 本記事における注意事項
- 本記事は、備忘録としてまとめたものになります。
- 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。
WixのVeloでデータベースをいじる

### WixのVeloでデータベースをいじる

 > コレクション名 : people
 > フィールド : name, age

上記のようなコレクションの値を書き換えたい場合

```js
import wixData from 'wix-data'; // wixDataをインポート

export function save(event) {   // 今回は保存ボタンが押されたらデータベースを更新する関数を作る
    wixData.query('people')     // コレクション名を指定してクエリを生成
        .find()                 // 探す
        .then(results => {      // 見つかった場合はresultsを受け取るので、処理する関数を書く
			let items = results.items;              // itemsは1行毎のデータを配列として持っている
			for (let i=0; i < items.length; i++) {  
				let item = items[i];                // 1行分のデータを取得
				item.name = 'tanaka';               // プロパティとして各フィールドにアクセスできる
				item.age = 20;
				wixData.update("people", item);     // wixData.update で内容を変更したitemを渡して反映させる
			}
        })
        .catch(error => {
            console.error(error);
        });
}
```

出典
> Velo：Data API を使用する
https://support.wix.com/ja/article/velo%EF%BC%9Adata-api-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B
qiita 投稿用MarkDown記法メモ

# 記事タイトル

記事の概要をここに書きます。

## セクション1

文章を書くことができます。

### サブセクション1-1

箇条書きも書くことができます。

- 箇条書き1
- 箇条書き2

### サブセクション1-2

番号付きの箇条書きも書くことができます。

1. 番号付き箇条書き1
2. 番号付き箇条書き2

## セクション2

画像の挿入もできます。

![画像の説明](https://placehold.jp/3d4070/ffffff/150x150.png?text=%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)

## セクション3

コードの挿入もできます。

```言語名:python
def say_hello(name):
    print(f"Hello, {name}!")
    
say_hello("John")
```

↓↓↓以下MarkDown変換前(丸ごと貼り付ければ↑と同じものができます)↓↓↓


\# 記事タイトル

記事の概要をここに書きます。

\## セクション1

文章を書くことができます。

\### サブセクション1-1

箇条書きも書くことができます。

\- 箇条書き1
\- 箇条書き2

\### サブセクション1-2

番号付きの箇条書きも書くことができます。

\1. 番号付き箇条書き1
\2. 番号付き箇条書き2

\## セクション2

画像の挿入もできます。

\![画像の説明]\(https://placehold.jp/150x150.png)

\## セクション3

コードの挿入もできます。

\```言語名:python
def say_hello(name):
    print(f"Hello, {name}!")
    
say_hello("John")
\```
DiscordでAIに一瞬で質問出来るBOT作った！！

# はじめに
こんなものを作りました！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666100/136bad07-fe82-3384-7c80-43b936a87b7e.png)


👇ソースコード

https://github.com/Scythercas/discord-bot-to-talk-with-ai

制作にかかった時間は合計6時間くらいです。
API初心者ながらかなり簡単に作れたので、本記事の一番下にある参考文献など見ながら実際に手を動かしてみるのもいいかもしれません！

# 機能説明
Twitterで言ってるまんまです！
modelにChatGPTにも使われている`gpt-3.5-turbo`を使っています。

# 導入する際にすること
+ `index.mjs`の修正
```index.mjs
const serverID = "サーバIDを入力";
const channelID = "チャンネルIDを入力";
const discordToken = "ディスコードのトークンを入力";
const ChatGPTAPIKey = "OpenAIのAPIキーを入力";
```
+ Botを頑張って作り、サーバに招待
+ `node index.mjs`で実行！

# 改善したいところ
+ 現状は、ソースコード上で記述したサーバー＆チャンネルでしか、返事してくれません^^;
  + 招待されたサーバーのIDを自動で認識するように改善したい。
多分`client.on("guildCreate", (guild) => {});`を使う？
+ お金の都合で、公開できない＆文字数制限が厳しい^^;
    + OpenAI APIが従量課金制のため、かなり厳しめに文字数制限を設けています。 
社会人になって金稼ぐしかない。
+ 会話ができない^^;
    + LangChainとか使えば解決？

# 終わりに
まだまだ未完成で機能としても物足りないですが、２つのAPIに触れた点、OpenAIに課金した点、実用的なものを作れた点などすごく良い経験となりました！

OpenAI APIの無料分大事に使えばよかった。
こんな遊びで使い果たしてた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666100/915f6534-ff03-0994-3cb3-ffe126ab1695.png)

```index.js
const messages = [
    {
      role: "user",
      content: text,
    },
    {
      role: "system",
      content: "簡潔に回答してください。",
    },
];
```
のcontentに`"あなたはなんｊ民です"`とか書くとその設定で返事してくれて面白い

# 参考文献
https://narikakun.net/technology/dis-saru-3/
詳細設計について

## 概要
詳細設計で作成していくものや、その内容などを書いていきます。

## 詳細設計とは
詳細設計とは、基本設計で決めたシステムの大枠から、機能ごとに、どんな実装をしていくのかを決めていく作業になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/49883903-4e77-1656-2a8a-adb137812b7d.png)

## 作成物一覧表
こちらが詳細設計で作成するものです。場合によって作成するものが変わることが多いと思いますが、現在の私の就業先で作成しているものを記していきます。

|作成するもの|説明　|
|:--:|:---:|
|表紙|何の設計書なのかをすぐわかるようにするためのもの|
|クラス図|システムの静的な構造・関係性を視覚的に表現するための図|
|シーケンス図|オブジェクト間の処理の流れを時系列で表していく図|
|外部IF一覧|各機能で使用するパラメータをまとめたドキュメント|
|外部IF詳細|各機能で使用するパラメータの詳細をまとめたドキュメント|
|画面詳細|画面上の具体的な表示や、何の操作が行えるかの詳細を記述するドキュメント|
|改版履歴|顧客に見せた後、内容の修正があった場合にそのタイミングで記入するものです。|

1つずつ説明していきます。

## 表紙
表紙はこんな感じで作るのが一般的です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/f6563747-2f2b-2bae-77ed-1e66340cf1eb.png)

## クラス図
クラス図はUML（統一モデリング言語）のひとつで、特徴は「システムの静的な構造・関係性を視覚的に表現するための図」であることです。視覚的に表現するというのがポイントです。
詳しくは、こちらの記事をご覧ください。
https://qiita.com/hukuryo/items/4d8c3d1f3d3e0cab6589

## シーケンス図
シーケンス図とは「プログラムの処理の流れや概要」を設計する際に使われます。オブジェクト指向のソフトウェア設計においては、グローバルスタンダードの設計手法で、オブジェクト間の処理の流れを時系列で表していく図になります。
こちらも、記事を書いているので、詳しい説明はこちらをご覧ください。
https://qiita.com/hukuryo/items/431e58fe7d077db882c5

## 外部IF一覧
こちらは、各機能で使用するパラメータをまとめたドキュメントを一覧でまとめた表になります。

## 外部IF詳細
各機能で使用するパラメータの詳細をまとめたドキュメントになります。
こちらは、設計段階で書きますが、実装の中でパラメータに変更があった場合は、それに伴い詳細の内容を変更する場合もあります。

## 画面詳細設計書
画面上の具体的な表示や、何の操作が行えるかの詳細を記述するドキュメントになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/15cbede7-8b20-0cf8-c9ae-f617cb545cdf.png)

## 画面詳細一覧表
画面上の具体的な表示や、何の操作が行えるかの詳細を記述するドキュメントの一覧になります。

## 改版履歴
顧客に見せた後、内容の修正があった場合に誰が、何の書類を変更したかをわかるように記録するために用意するものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/68dc6d12-a492-48b1-ec0f-2f260b59c02c.png)

## まとめ
詳細設計では、基本設計を掘り下げた設計をしていきます。アプリケーションにもよりますが、実装してみないとパラメータなパラメータなどは、初め書いた設計書に変更を加えながら書いていくこともあるそうです。
以上になります。
ESXi 6.7のインストール時にはソフトウェア要件に従おう(CPU個数)

# 発生事象
vmware esxiのインストール時に以下アラートが発生進まない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/f8f240f9-e45c-51fd-e98b-ccfc9948da46.png)

```text:message
Error(s)/Warning(s) Found During System Scan
The system encountered the following warning(s) and error(s).

Error(s)
<CPU_CORES ERROR: This host has [1] cpu core(s) which is less than recommended [2] cpu cores>

Warning(s)
<CPU_SUPPORT HARNING: The CPU in this host may not be supported in future ESXi releases. Please plan accordingly.>

Use the arrow keys to scroll
(F9) Back (F11) Reboot
```

# 解決策
メッセージに書いてある通り、CPUが足りていません。

>ESXi 6.7 では、少なくとも 2 つの CPU コアを持つホスト マシンが必要です。
>
>https://docs.vmware.com/jp/VMware-vSphere/6.7/com.vmware.esxi.install.doc/GUID-DEB8086A-306B-4239-BF76-E354679202FC.html

CPUを1個から2個に変更したところ、問題なくインストールが進みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d5f2ce00-5ec0-2823-9ad0-df1b9ad32d72.png)


`The CPU in this host may not be supported in future ESXi releases. Please plan accordingly.`
→「CPUが将来的にサポートされない可能性」についての警告。CPUが古いから仕方ない。

`Hardware Virtulization is not a feature of the CPU, or is not enabled in the BIOS.`
→「ハードウェア仮想化が無効」についての警告。このESXiはESXi on vmware Workstationの上に立てているので問題ない（仕方ない）。

# 関連リンク
https://docs.vmware.com/jp/VMware-vSphere/6.7/com.vmware.esxi.install.doc/GUID-DEB8086A-306B-4239-BF76-E354679202FC.html

https://www.yellow-bricks.com/2012/06/12/creating-a-nested-lab/

https://communities.vmware.com/t5/Nested-Virtualization-Documents/Running-Nested-VMs/ta-p/2781466
[SwiftUI] fullScreenCover で遷移された View 内で sheet 遷移すると、sheet 本来の遷移の見た目にならない

`.sheet` を用いた遷移をおこうなと、遷移元の View が立体感のある見た目になると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402114/8c86ee38-04c8-7729-c741-b66e989d4cc9.png" width="300"> 

しかし、`.fullScreenCover` で遷移された View 内で、`.sheet` を用いた遷移を行うと、遷移元の View が立体感のある見た目になりません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402114/cf4d406d-6e5c-67ed-6131-6b68e7857fcc.png" width="300"> 

ちなみにですが、`.sheet` で遷移された View 内で、`.sheet` を用いた遷移を行うと、遷移元の View は立体感のある見た目になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402114/8ca24463-4706-0ffd-c4bf-aedab6435bbe.png" width="300"> 

原因までは調査していませんが、挙動の共有として投稿させていただきました。
ESXi 6.7のインストール時に「PANIC bora/vmkernel/mem/pshare.c」と出てインストールが進まない

# 発生事象
vmware esxiのインストール時に以下アラートが発生してハングする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0e08f212-a5ed-3c0e-2fd4-fc3dd096e07a.png)


```text:message
PANIC bora/vmkernel/mem/pshare.c:3239
VMB: 380: Code start: 0x418034a00000
VMB: 386: cr0 0x8001003f cr2 0x0 cr3 0xd07e000 cr4 0x38
VMB: 388: error code 0x6 rip 0x418034b8e51f cs 0x8
VMB: 390: rflags 0x10046 rsp 0x450184018e30 ss 0x0
VMB: 392: rax 0x0 rcx 0x0 rdx 0x8
VMB: 394: rbx 0x0 rbp 0x0 rsi 0x0
VMB: 396: rdi 0x43004bac2000 r8 0x0 r9 0x417ff4acb3a0
VMB: 398: r10 0x0 r11 0x8 r12 0x450184018e78
VMB: 400: r13 0x0 r14 0x1fff r15 0x0
VMB: 401: gs 0x10 fs 0x10
VMB: 403: FSbase:0x0 GSbase:0x417ff4ddf040 kernelGSbase:0x0
VMB: 139: [0x450184018e30] 0x418034b8e51f
VMB: 139: [0x450184018ee0] 0x418034aedb12
VMB: 139: [0x450184018f00] 0x418034bcc5d6
VMB: 139: [0x450184018fc0] 0x418034b65288
VMB: 139: [0x450184018fc8] 0x418034a14ac7
VMB: 84: Halting.
```

# 解決策

ハードウェアのメモリが不足しています。
ESXiの動作には最低4GBのメモリが必要となります。



>ESXi 6.7 には、少なくとも 4 GB の物理 RAM が必要です。一般的な本番環境で仮想マシンを実行するためには、少なくとも 8 GB の RAM を用意することをお勧めします。
>
>https://docs.vmware.com/jp/VMware-vSphere/6.7/com.vmware.esxi.install.doc/GUID-DEB8086A-306B-4239-BF76-E354679202FC.html

メモリを4GBにして再度インストールを行うと問題なくインストールが開始できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/e2ef781e-fca7-c8b1-9f37-d4f125269e32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/03956c6b-1014-497f-df4b-23f6f0f76474.png)


# 関連リンク
https://docs.vmware.com/jp/VMware-vSphere/6.7/com.vmware.esxi.install.doc/GUID-DEB8086A-306B-4239-BF76-E354679202FC.html

https://superuser.com/questions/1170958/kernel-panic-when-installing-vmware-esxi-on-virtual-box
AWS CDK / CLI を試せるコンテナを amd64 / arm64 の両方で動くようにする

Docker を利用して、AWS CDK / CLI を実行できるコンテナを作ります。
Windows（x86-64 ≒ amd64）、Mac（Apple silicon ≒ arm64）の両方で動くようにするための工夫もしています。


# この記事でわかること

* AWS CDK / CLI を実行できる Dockerfile の記述方法
* amd64 / arm64 のアーキテクチャで分岐した Dockerfile の記述方法の1つ例
* この記事内のソースは以下で公開しています。
    * https://github.com/katsuhiko/container-aws-cdk


# コンテナでの AWS CDK / CLI 利用

## 各ファイルの説明と実行方法

TARGETARCH 変数を利用と FROM句・platform 指定を組み合わて、各アーキテクチャ事の固有処理を記載したステージを作っています。

最後に各アーキテクチャごとのステージ名を利用して、共通の処理を行います。


```Dockerfile:Dockerfile
FROM python:3.11.0-bullseye as base

ARG TARGETARCH
RUN echo "TARGETARCH for ${TARGETARCH}"

# amd64 系の処理
FROM --platform=linux/amd64 base as stage-amd64

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"

# arm64 系の処理
FROM --platform=linux/arm64 base as stage-arm64

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
RUN curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_arm64/session-manager-plugin.deb" -o "session-manager-plugin.deb"

FROM stage-${TARGETARCH:-amd64} as final

# install the latest nodejs & npm & other
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
RUN apt update \
    && apt-get install -y nodejs \
    && apt clean

# install the latest AWS CDK
RUN npm install -g aws-cdk

# install the latest AWSCLI
RUN apt update \
    && apt-get install -y groff \
    && apt-get install -y less \
    && apt clean
RUN unzip awscliv2.zip \
    && ./aws/install

# install the latest SessionManagerPlugin
RUN dpkg -i session-manager-plugin.deb
```

上記の Dockerfile を以下のような docker-compose.yml で起動できるようにしました。

```yaml:docker-compose.yml
version: "3.5"

services:
  aws-cdk:
    build:
      context: .
      dockerfile: ./Dockerfile
    container_name: aws-cdk
    tty: true
    working_dir: /usr/src/app
    volumes:
      - ./:/usr/src/app
      - ./.aws:/root/.aws
```

これで、以下のようにコンテナを起動して、コンテナにアクセスするこで、 AWS CDK / CLI が利用できるようになります。

```bash
docker-compose up -d
docker exec -it aws-cdk /bin/bash
```

コンテナにアクセスしたら、初期設定を行いましょう。

```bash
aws configure
```

## 注意点

`./.aws` 配下に AWS の credentials が作成されています。
git のリポジトリへ Push しないように必ず .gitignore で除外対象へ加えてください。

```:.gitignore
.aws
```


## AWS CDK / CLI のバージョンが上がったとき

AWS CDK / CLI を最新バージョンとしたいときは以下のコマンドでコンテナをリビルドしてください。

```bash
docker-compose build --no-cache
```


# ChatGPT に聞いてみた結果は、、、

ChatGPT へ amd64 と arm64 でインストールするプログラムを切り替え方法を聞いたところ、以下のように if で分岐することを教えてくれました。

この if で分岐するほうが一般的なんだと思いますが、この記事で記載した内容も参考にしてください。
どちらがわかりやすいと思うかかなっと思います。

```Dockerfile
# Base image
FROM ubuntu:latest

ARG TARGETARCH

# Install packages via apt-get
RUN apt-get update -y && \
    if [ "${TARGETARCH}" = "amd64" ]; then \
      apt-get install -y package-amd64; \
    elif [ "${TARGETARCH}" = "arm64" ]; then \
      apt-get install -y package-arm64; \
    else \
      echo "Unknown architecture: ${TARGETARCH}"; \
      exit 1; \
    fi

# Set the command to be executed when a container is started
CMD ["echo", "Hello, World!"]
```
可変長のパラメータ数を含む文字列入力を受け取ってパラメータの配列を返す関数

テストコードを書く上で`"1.1 0.4 2.3"`などの可変長のパラメータを持った文字列入力を扱いたかったので書きました。
```cpp
// 長さ10まで
double *string_to_double_array(std::string input){
  double *val = (double *)malloc(sizeof(double)*10);
  std::istringstream stream(input);
  int cnt = 0;
  for(;;){
    stream >> *val++; cnt++;
    if(stream.fail()) break;
  }
  return val - cnt; // 先頭に返す
}

int main(){

    double *params = string_to_double_array("1.1 0.4 2.3");
    // params = {1.1, 0.4, 2.3}

    return 0;
}


```

テストによってパラメータ数が変わるので、これのおかげでかなり便利になりました。
【iOS開発】Xcodeをインストールする時はXcodesを使用しよう

# はじめに
<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/1ji3oqErPI">https://t.co/1ji3oqErPI</a> <a href="https://t.co/h2yqfVocOT">pic.twitter.com/h2yqfVocOT</a></p>&mdash; たいしん (@SNQ2001) <a href="https://twitter.com/SNQ2001/status/1643982271320559616?ref_src=twsrc%5Etfw">April 6, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

最近、MacBookが壊れました笑

<blockquote class="twitter-tweet"><p lang="es" dir="ltr">M2 MacBook Pro....!! <a href="https://t.co/0WnJ6nQazP">https://t.co/0WnJ6nQazP</a> <a href="https://t.co/rowsIWFRkX">pic.twitter.com/rowsIWFRkX</a></p>&mdash; たいしん (@SNQ2001) <a href="https://twitter.com/SNQ2001/status/1644281544318787584?ref_src=twsrc%5Etfw">April 7, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

新調したので、XcodeをインストールするついでにXcodesの紹介をしようと思います。

MacBookがまっさらな状態からの手順です。

# Xcodesのメリット
- AppStoreからインストールするより早い
- 複数バージョンを共存させられる

# デメリット
AppleIDのロックがちょっと怖い。。。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">fastlane、xcodesなどのサードパーティーツールから2FA認証しようとすると、Apple IDが誤BANされるようになったとのこと。こわっ <a href="https://t.co/anXv5mk1RV">https://t.co/anXv5mk1RV</a></p>&mdash; giginet (@giginet) <a href="https://twitter.com/giginet/status/1628832194981695488?ref_src=twsrc%5Etfw">February 23, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Homebrewのインストール
```:ターミナル
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

# Homebrewのセットアップ
```:ターミナル
touch .zshrc
open .zshrc
```

```:.zshrc
export PATH="$PATH:/opt/homebrew/bin"
```

```:ターミナル
source ~/.zshrc
```

# Xcodesのインストール
```:ターミナル
brew install --cask xcodes
```

# おわり
私にとってXcodes必須ツールです。
1番最初にインストールしました。

# 参考
https://brew.sh/index_ja

https://github.com/RobotsAndPencils/XcodesApp
【Git】入門記事リンク集【Sourcetree/GitLab/git-flow】

# 0. はじめに
## 0-1. 全体の流れ
> [1.教材](#1-教材)
> [2.SourceTree](#2-sourcetree)
> [3.GitLab](#3-gitlab)
> [4.git-flow](#4-git-flow)
> [5.その他](#5-その他)

## 0-2. TL;DR
- Gitの教材や参考リンク集まとめ

# 1. 教材
https://www.udemy.com/course/git-beginning/

https://zenn.dev/shochan/books/4963c7cc8f3bb2

https://www.udemy.com/course/intro_git/

https://www.udemy.com/course/unscared_git/

https://www.techpit.jp/courses/33

# 2. SourceTree
https://prog-8.com/blogs/how_to_use_sourcetree

https://zenn.dev/web_tips/articles/bba3a42a27378e

https://zenn.dev/comi/articles/ef98dc10fa7d8d

https://zenn.dev/chiyopu/articles/28cc46220c6afe

https://zenn.dev/rata/articles/c62f97fa87bb43

https://zenn.dev/koushikagawa/articles/3c35e503c8553a

https://qiita.com/TAKANEKOMACHI/items/53058acc15d965d66798

https://qiita.com/m_tknb/items/0a0574998c51c50bcd6f

# 3. GitLab
https://qiita.com/k-kishimoto/items/7c398b518b8d9260c1e3

https://qiita.com/redamoon/items/07e445d1fce360cb5fa3

https://qiita.com/ucan-lab/items/21d62f1beaa8007c4ca9

https://zenn.dev/shotakaha/articles/ba3e97cfe0837721c3f3

https://laraweb.net/environment/8473/

# 4. git-flow
http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html

https://michi-programming.hatenablog.com/entry/2023/01/09/200000

https://dev.classmethod.jp/articles/introduce-git-flow/

https://zenn.dev/akino/articles/1dcecd60009dbb

https://zenn.dev/no4_dev/articles/3360a6078d8e8c


# 5. その他
https://dev.classmethod.jp/articles/1password-git-ssh/

https://qiita.com/MAKOTO1995/items/a0135040071604989443

https://qiita.com/ohakutsu/items/083dcd86d4a0b887461d
Visual Studio(MSVC)のコマンドラインツール

https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170

以下抜粋して、自動翻訳しただけですが...

Visual Studio に含まれているツールを使用して、コマンドラインで C/C++ アプリケーションをビルドできます。Microsoft C++ (MSVC) コンパイラツールセットは、スタンドアロン パッケージとしてダウンロードすることもできます。Visual Studio IDE を利用しない場合は、Microsoft C++ (MSVC) コンパイラツールセットをインストールしたので良いです。

# ツールをダウンロードしてインストールする
Visual Studio と C++ ワークロードをインストールしている場合は、すべてのコマンドラインツールを使用できます。
Visual Studioをインストールする方法についてはここでは省略します。
コマンドラインツールセットのみをインストールする場合は「[Build Tools for Visual Studio](https://visualstudio.microsoft.com/ja/downloads/)」をダウンロードしてください。

ダウンロードした実行可能ファイルを実行すると、Visual Studio インストーラーが更新されて実行されます。
C++ 開発に必要なツールのみをインストールするには **[C++ によるデスクトップ開発]** ワークロードを選択します。
**[インストールの詳細]** よりオプションのライブラリとツールセットを選択することができます。Visual Studio 2015、2017、または 2019 ツールセットを使用してコードをビルドするには、オプションの MSVC v140 or v141 or v142 ビルドツールを選択します。

# 開発者コマンドプロンプトのショートカット
コマンドプロンプトのショートカットは、Windows の [スタート] メニューのバージョン固有の Visual Studio フォルダーにインストールされます。
基本コマンドプロンプトのショートカットと、それらがサポートするビルドアーキテクチャの一覧を次に示します。

## Developer Command Prompt for VS 20XX
Sets the environment to use 32-bit, x86-native tools to build 32-bit, x86-native code.
32 ビットの x86 ネイティブ ツールを使用して 32 ビットの x86 ネイティブ コードをビルドするように環境を設定します。
## x86 Native Tools Command Prompt for VS 20XX
Sets the environment to use 32-bit, x86-native tools to build 32-bit, x86-native code.
32 ビットの x86 ネイティブ ツールを使用して 32 ビットの x86 ネイティブ コードをビルドするように環境を設定します。
## x64 Native Tools Command Prompt for VS 20XX
Sets the environment to use 64-bit, x64-native tools to build 64-bit, x64-native code.
64 ビットの x64 ネイティブ ツールを使用して 64 ビットの x64 ネイティブ コードをビルドするように環境を設定します。
## x86_x64 Cross Tools Command Prompt for VS 20XX
Sets the environment to use 32-bit, x86-native tools to build 64-bit, x64-native code.
32 ビットの x86 ネイティブ ツールを使用して 64 ビットの x64 ネイティブ コードをビルドするように環境を設定します。
## x64_x86 Cross Tools Command Prompt for VS 20XX
Sets the environment to use 64-bit, x64-native tools to build 32-bit, x86-native code.
64 ビットの x64 ネイティブ ツールを使用して 32 ビットの x86 ネイティブ コードをビルドするように環境を設定します。

---
20XXはVisual Studioのバージョンです。

こちらのサイトの説明がわかりやすいです。

https://www.technicalife.net/visual-studio-developer-command-prompt/
Power BIで平均値が合わない時の解決方法（DAX）

## Power BIで平均値の値がおかしい？？
Microsoftさんから提供されている財務サンプルデータを使って国別の利益率の平均値をビジュアルに出してみたところ、合計の平均値が合ってないことに気づきました

↓以下Power BIのチュートリアルです。

https://learn.microsoft.com/ja-jp/power-bi/create-reports/desktop-excel-stunning-report

## 実際にビジュアルに出すとこうなる

利益率はDIVIDE関数を使って利益額の合計を売上の合計で割って値を算出します。
ROUNDDOWN関数で小数点4桁で切り捨ててます。
![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/585847bb-f8c8-e84b-29b5-b3de7c34d3be.png)


マトリクス図で表示すると全体の平均値は15.03%になりました。
![MicrosoftTeams-image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/87a80320-a52a-8db3-164f-aeeb1216291b.png)

##### しかし、実際に計算してみると...

まず国全体の合計値は`14.64 + 16.39 + 17.37 + 13.81 + 11.91`　で**74.12**となる。
次に平均を出すので`74.12 / 5`をすると**14.82**となるため、どうやらマトリクス図の15.03は間違ってる模様。

## 原因
マトリクス図での15.03%という値もあながち間違ってはない。
というのも、計算方法が違うことで平均値も若干ずれてしまってます。
* **本来やりたい計算方法**
１、国ごとに分割して利益率を算出
２、国ごとの利益率を集めて平均値を出す

* **マトリクス図でやってた計算方法**
１、国ごとに分割せず、国全ての値を合わせた利益額を算出
２、同じように国全ての値を合わせた売上額を算出
３、①の利益額と②の売上額を除算して平均値を出す

ここに気づかず何で平均値がずれてるのか分からず結構悩みました。。。

## 解決方法
DAXの**AVERAGEX**を使います。
これを使うこと指定の列内の値ごとに計算をしてくれます。

AVERAGEXの第一引数には行ごとに分割したい列を入れます。
今回だと国別なのでfinancialsテーブルの`Country`をここに入れます。
第二引数には計算値を入れるので、先ほど作成した`[全体の利益率]`メジャーを入れます。
![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/d9d0880c-55e1-902a-0e9d-a66fc61121c5.png)

先ほど計算したように14.82%になりました！
これで国ごとの利益率をもとに全体の平均値を求めてくれるようです。
![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/a38e6270-18b8-69f5-5f85-cedc66950773.png)

## ちなみにこれだと上手くいかない
先ほどは利益率の計算（DIVIDE関数）と、国別に集計して算出（AVERAGEX関数）のメジャーを分けてましたが、
ここを一つにまとめてしまうと上手くいかなくなります。
![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/451e9c4d-96a0-d4ec-b181-e2419cf473e8.png)

実際にこうやって計算してみると、、、
修正前と同じような値になってしまいます。
おそらくメジャー内の計算の順番的なとこで上手くいかなくなるのかなと思います。

ここも初め一つにまとめて作ってたので何で値が揃わないのかかなりの時間悩みましたのでご注意ください。
![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/3b75a613-c622-1e1a-f37e-da7f75633616.png)
プルリクで'There isn’t anything to compare.main and merge_branch are entirely different commit histories.'といわれたときにやったこと

# エラーの原因
```
There isn’t anything to compare.main and merge_branch are entirely different commit histories.
```
エラー文から、mainとmerge_branchで異なるコミット履歴のため比較できない。関係性がないのでマージしようがないということがわかります。
私の場合は、以下の理由が原因でプルリクできませんでした。
- mainブランチをpushせずにmerge_branchをきってpushしたこと
- merge_branchのコミットを取り消して、push -fを使ったこと
# 解決方法
1. まずリモートとローカルの差分を調べる
```
$ git ls-remote origin HEAD 　　#　リモートリポジトリの最新のコミットIDを確認できる
１１１１１１１１   HEAD 
$ git log --oneline  #　ローカルのコミットIDを確認できる
22222222 secound commit
33333333 first commit
```
同じコミットIDがないことから差分があることがわかります。

2.　次にどのブランチが古いのかを調べる
```
$ git remote show origin
　* remote origin
　        　・
　　　       　・ 省略
　　　       　・ 
  Local refs configured for 'git push':
    merge_branch pushes to merge_branch (up to date)
    main       pushes to main       (local out of date)
```
最終行の１行前をみると、**(up to date)** とありマージしたいブランチはリモートとローカルで差がないとわかります。（マージしたいブランチの方はpush -fしていたので当たり前ですが...）
最終行は、**(local out of date)** とありmainブランチのローカルが古いといわれています。
よって、mainブランチをリモートと同じにすればいいことがわかります。

3.　mainブランチをローカルと合わせる
```
$ git checkout main  # mainブランチに移動する
$ git push -f origin main 　# リモートのコミット履歴をローカルに合わせる
$ git ls-remote origin HEAD　　# 一応リモートの最新のコミットIDを確認するとローカルと一致している
22222222   HEAD
```
これでプルリクができるようになりました。


今回はそもそもmainブランチでコミットした後にpushし忘れていたことが始まりですが、push -fはコミットの歴史を変えてしまう（コミットのIDが変わる）ので気をつけて実行することが必要だと学びました。

初学者なので間違った解釈をしているかもしれません。
他にいい解決方法があればご教授ください！
Rails サンプルデータの投入方法

あらかじめテーブルは作成しておく
今回はUserテーブル(カラムはnameとemail)にデータを10個ずつ投入する

```ruby:db/seeds.rb
10.times do |n|
  name  = "testuser#{n+1}"
  email = "testuser#{n+1}@example.com"
  User.create!(name:  name,
               email: email
              )
end
```

以下のコマンドを行う
`rails db:migrate:reset`
`rails db:seed`

実行結果
```terminal
$ rails db:migrate:reset
Dropped database 'agribeit_development'
Dropped database 'agribeit_test'
Created database 'agribeit_development'
Created database 'agribeit_test'
== 20230325044645 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0113s
== 20230325044645 CreateUsers: migrated (0.0114s) =============================

$ rails db:seed
$
```

データの中身
```
mysql> select * from users;
+----+------------+------------------------+----------------------------+----------------------------+
| id | name       | email                  | created_at                 | updated_at                 |
+----+------------+------------------------+----------------------------+----------------------------+
|  1 | testuser1  | testuser1@example.com  | 2023-04-08 12:06:24.941848 | 2023-04-08 12:06:24.941848 |
|  2 | testuser2  | testuser2@example.com  | 2023-04-08 12:06:24.948444 | 2023-04-08 12:06:24.948444 |
|  3 | testuser3  | testuser3@example.com  | 2023-04-08 12:06:24.954578 | 2023-04-08 12:06:24.954578 |
|  4 | testuser4  | testuser4@example.com  | 2023-04-08 12:06:24.959667 | 2023-04-08 12:06:24.959667 |
|  5 | testuser5  | testuser5@example.com  | 2023-04-08 12:06:24.965160 | 2023-04-08 12:06:24.965160 |
|  6 | testuser6  | testuser6@example.com  | 2023-04-08 12:06:24.969590 | 2023-04-08 12:06:24.969590 |
|  7 | testuser7  | testuser7@example.com  | 2023-04-08 12:06:24.974432 | 2023-04-08 12:06:24.974432 |
|  8 | testuser8  | testuser8@example.com  | 2023-04-08 12:06:24.979816 | 2023-04-08 12:06:24.979816 |
|  9 | testuser9  | testuser9@example.com  | 2023-04-08 12:06:24.984884 | 2023-04-08 12:06:24.984884 |
| 10 | testuser10 | testuser10@example.com | 2023-04-08 12:06:24.989177 | 2023-04-08 12:06:24.989177 |
+----+------------+------------------------+----------------------------+----------------------------+
10 rows in set (0.00 sec)
```
【Laravel】テストデータの生成方法の違い：モック、ファクトリー、フェイカーについて

## はじめに
Laravelでは、アプリケーションのテスト中に必要なダミーデータを生成することができ、主な方法として「モック」、「ファクトリー」、「フェイカー」があります。
これらの方法の違いを理解することで、Laravelのテストを円滑に行うことが出来ます。
自らのメモとして簡単に残します。

## モックとは
モックとは、アプリケーション内で他のクラスやメソッドに依存する部分を仮想化する方法です。
なぜ仮想化するのかというとアプリケーションではデータベースなど外部と連携が必要な場合があり、その際に連携先の状態によってテストが失敗することがあります。
なので、あらかじめ外部の振る舞いを想定したコードを書いておくことで失敗を避けることが出来ます。
モックをすることで外部の依存関係がない状態でテストを行うことが出来ます。

以下は、コントローラーからサービスを呼び出す場合にモックを使用してサービスを仮想的に置き換えています。

```php:TestController.php
<?php

namespace Tests\Feature;

use App\Services\ExampleService;
use TestCase;

class ControllerTest extends TestCase
{
    public function tearDown() {
        \Mockery::close();
    }

    public function testGetIndex()
    {
        // 想定されるデータ
        $expected = [
            'title' = "テスト"
        ];

        // モックを使用して置き換える
        $serviceMock = \Mockery::mock(ExampleService::class);
        $serviceMock->shouldReceive('getIndex')
            ->once()
            ->andReturn($expected);
        });

        // テストを実行、アサート
        $response = $this->get('/')
            ->assertSuccessful()
            ->assertJson($expected);
    }
}
```

## ファクトリーとは
ファクトリーとは、モデルを使用してダミーデータを生成する方法です。
これにより、テスト中に必要なデータを簡単に生成することができます。

Laravelにはfactoryメソッドが用意されており、これを使用してファクトリーを定義することができます。
以下は、Userモデル用のファクトリーを使用した例です。

```php:php:TestController.php
<?php

namespace Tests\Feature;

use App\Models\User;
use TestCase;

class ControllerTest extends TestCase
{
    public function testGetIndex()
    {
        // Factoryでuserを作成
        $TestUser = User::factory()->create([
            'name' => "テスト太郎",
            'email' => "example@gmail.com",
        ]);

        // テストを実行、アサート
        $this->assertDatabaseHas('users', [
            'name' => "テスト太郎",
            'email' => "example@gmail.com",
        ]);
    }
}
```
上記の例では、`name`と`email`の値を指定しuserを生成しています。

## フェイカーとは
フェイカーは、データをランダムに生成するための方法です。
これにより、ファクトリーと同様にダミーデータを簡単に生成できます。
例えば、名前、住所、電話番号、メールアドレス、文章など、様々な種類のデータをランダムに生成することができ、生成したデータは、ファクトリーやシーダーで使用することができます。

以下は、Userモデル用のファクトリーにフェイカーを追加した使用した例です。
```php:php:TestController.php
<?php

namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\WithFaker;
use TestCase;

class ControllerTest extends TestCase
{
    use WithFaker;

    public function testGetIndex()
    {
        // Fakerでuserを作成
        $TestUser = User::factory()->create([
            'name' => $this->faker->name(),
            'email' => $this->faker->email(),
        ]);

        // テストを実行、アサート
        $this->assertDatabaseHas('users', [
            'name' => $TestUser->name,
            'email' => $TestUser->email,
        ]);
    }
}
```

## 終わりに
それぞれについて簡単に記載しましたが、あくまで一例なのでより詳しく調べたい場合はLaravelの公式を見ていただければと思います。
公式には詳細な説明と使用例が載っているので困ったらとりあえず公式見るのが最強です。
Rails エラー「ActiveRecord::PendingMigrationError」の解決方法

```
ActiveRecord::PendingMigrationError
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=development
You have 1 pending migration:
20230325042627_create_users.rb
```

`rails db:migrate` を忘れている可能性があるのできちんと実行する

### 参考
* [ActiveRecord::PendingMigrationErrorの解決方法 - Qiita](https://qiita.com/KONTA2019/items/0444ae3b8c8936a56ee0)
ChatGPTのopt out（提供データの使用を拒否する）申請をする


仕事などでも積極的に利用したいが、データがOpen AIに利用されてしまうことが気になっていたら、opt out申請ができることを知ったのでしてみました。

ちなみにChatGPT曰く、`opt-outは、あるサービスやプログラムに対して自分が参加しないことを選択することを意味します。`とのこと。


# やり方


以下のフォームから申請を行います。

https://docs.google.com/forms/d/e/1FAIpQLScrnC-_A7JFs4LbIuzevQ_78hVERlNqqCPCt3d8XqnKOfdRdQ/viewform

ChatGPTだけでなく、 [DALL-E2](https://openai.com/product/dall-e-2)という画像生成AIも共通となるようです。

記載内容の要約としては以下。
- ChatGPTやDALL-Eを使用する際、提供されたデータを使用することがある。
- 使用するデータからは、個人を特定できる情報を削除はする。
- ユーザーごとに使用データは少しずつ。
- 上記の利用が嫌な場合はオプトアウトができる。
- オプトアウトすると、性能に制限される場合がある。

フォームで入力が必要な項目は以下２つ。
- メールアドレス
- Organizaiton ID
    - `Account Org Settings`のリンクから確認できます。
    - 個人アカウントでも付与されており、入力必須です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/b1a9050d-df86-984a-7b8f-ed297dbb5403.png)


`Account Org Settings`のリンクからの画面。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/fe724431-7998-bb1b-9b43-d79b403f5168.png)


# 申請後

申請後、1週間程度経過していますが、現時点で申請が受理されたなどの連絡は来ていません。
連絡などあればそのタイミングで更新予定です。




# 参考

https://docs.google.com/forms/d/e/1FAIpQLScrnC-_A7JFs4LbIuzevQ_78hVERlNqqCPCt3d8XqnKOfdRdQ/viewform

https://help.openai.com/en/articles/7039943-data-usage-for-consumer-services-faq

https://twitter.com/itosinitosin123/status/1642835338237468673

https://qiita.com/ysv/items/cb39ae4d96c1c8a73f59
[unbound] docker 使って、さくっと広告ブロックやってみた

ずーっと気になっていたので、DNSを使った広告ブロッカーをスキマ時間でちょっと作ってみました。

## 実際の設定方法

ひとまず `~/unbound` フォルダ内に必要な設定ファイルを突っ込んでおきます。

custom.conf

```
server:
        interface: 0.0.0.0
        interface: ::0
        access-control: 192.168.0.0/24 allow

forward-zone:
        name: "."
        forward-addr: 8.8.8.8
        forward-addr: 8.8.4.4
```

## 280blocker さんの広告ブロックリストを利用する

[280blocker](https://280blocker.net/download/)

`unbound.conf` 内の `server:` 配下に `local-zone:` を記載すれば良さそうな感じです。  
こちらのサイトで提供されている`text`をベースにして、unbound用のconfigを生成させました。  
こちらも`~/unbound`フォルダ内へ出力しています。

### awk版

adblock-conf.sh

```
#!/bin/bash

OUTPUT='./unbound/static.conf'
d=`date '+%Y%m'`

echo "server:" > ${OUTPUT} && \
  curl -L https://280blocker.net/files/280blocker_domain_${d}.txt | \
  grep -e '^[a-zA-Z0-9]' | \
  awk '{ print "\tlocal-zone: \""$1".\" static"}' >> ${OUTPUT}
```

### sedの場合

なお、`grep`と`awk`部分を`sed`でまるっと実行したいみたいな時は、こちらです(macで確認)。  
この`sed`だと、元の注釈部分を生かす形になります。

```
sed -e 's/^\([0-9a-zA-Z].*\)/\tlocal-zone: "\1." static/g'
```

## docker で unbound サーバを立てましょう

後は、`docker`で起動するだけ。カンタン。

```
sudo docker run -d --name unbound -p 53:53/tcp -p 53:53/udp -v ~/unbound:/etc/unbound/custom.conf.d klutchell/unbound
```

## 参考情報

[AWSを使って広告をブロックするDNSサーバを構築する](https://zenn.dev/1plus4/articles/1c135dc58350d4)  
[unboundによるDNSブロッキング - それマグで！](https://takuya-1st.hatenablog.jp/entry/2020/05/15/183709)  
[klutchell/unbound](https://hub.docker.com/r/klutchell/unbound)
【学生ソフト開発】個人的おすすめツールとか（　＾ω＾）・・・

個人でWebアプリを開発しているあまみやです。どもです。
私はまだ学生で現場経験はないんですが、いままで個人でWebやそのたのソフトウェア開発をやってきたなかでの知見を共有していければと思います。

※もはや個人的ツール紹介になってます。すまそ。

# 学生なら学割をつかうべし

IT系の専門学生であれば、GitHub Educationや私が使っているJetbrainsの学生プラン等通常1万円近くかかるようなライセンス料が無料になったり、Azureなどクラウド構築を体験できたりします。

GitHubはすこし申請にコツがいるのですが、数千円の違いは金欠な学生にとってかなりおおきいです。

詳細は以下の記事にて(宣伝乙)

https://qiita.com/amamiya_dev/items/4ddf71b8909c92662a18

## おすすめツールとか

### 1.jetbrains toolbox

JetbrainsのIDEや各ソフトのPJを管理しやすくしてくれるソフトです。
WinとLinux、あと多分Macも対応してます。

https://www.jetbrains.com/ja-jp/lp/toolbox/

### 2.GitHub Copilot
最近話題のChatGPT搭載のアレです。

https://docs.github.com/ja/copilot

### 2.GitHub CLI
Copilotもいいですが、個人的にはこっちの方がおすすめです。
CLI上からGitHubの機能をイジイジできます。

https://cli.github.com/