OmniAICreator/Qiita-1.07M huggingface dataset:
Java8 ラムダ式使い方

## ラムダ式基本構文

```Java
インターフェース名 オブジェクト名 = (引数1, 引数2, ・・・) ->{return 処理内容};
```

引数の型を記述する必要はない
→引数の型はコンパイラーによって類推されるから
　従来通り型を記述してもコンパイルエラーになることもない

## ラムダ式の引数が１つの場合

```Java
インターフェース名 オブジェクト名 = 引数 -> 処理 ;
```
引数が１つの場合は処理結果を返すreturnや引数群を囲む（）、処理の記述を囲む{}を記述する必要はない

## メソッド参照

メソッド参照：メソッドの引数としてメソッドを参照できる仕組み

書き方

・呼び出したいメソッド名の直前に::をつける
・その前にクラス名を記述
＊メソッドの引数部分の()は省略

```Java
クラス名 :: メソッド名
```


## ラムダ式での呼び出し

```Java
import java.util.ArrayList;

public class Sample{

    public static void main(String args[1]{
        ArrayList<Integer>list = new ArrayList<>();

        for(int i = o; i < 10 ; i++){
            list.add(i);
        }

        list.forEach(i -> System.out.print(i));
    }
}
```
→ラムダ式でメソッドを呼び出している



結果
```Java
0123456789
```

## メソッド参照での呼び出しについて

ラムダ式での参照をメソッド参照にしてみる↓

```Java
import java.util.ArrayList;

public class Sample2{

    public static void main(String args[]) {
        ArrayList<Integer> list = new ArrayList<>();

        for(int i = 0 ; i < 10 ; i++) {
            list.add(i);
        }


        list.forEach(System.out::print);
    }
}
```
結果
```Java
0123456789
```


## 引数が複数の場合

メソッド参照やラムダ式の記述を使うときは、引数と戻り値に型が一致する関数型のインターフェースのオブジェクトに代入

```Java
import java.util.Comparator;

public class Sample3 {

    public static void main(String args[]) {
        Comparator<Integer> comp = Integer::compare;
        System.out.println(comp.compare(1, 2));
    }
}
```

結果

```Java
-1
```

Integer.compare() → Integer::compareと記述している

## 戻り値の扱い方

```Java

import java.util.function.IntSupplier;

public class Sample4 {

    public static void main(String args[]) {
        String str = "Hello";

        IntSupplier is = str::length;
        System.out.println(is.getAsInt());
    }

}
```
結果

```Java
5
```



str.length() → str::length
関数型インターフェース　IntSupplierのオブジェクトisに戻り値を代入
getAsIntメソッドで戻り値を取得

## コンストラクタ参照

書き方

```Java
クラス名::new
```

```Java
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

class Sample5{
    public static void main(String args[]){

        Supplier<ArrayList<Integer>> supplier = ArrayList::new;
        List<Integer> list = supplier.get();

        for(int i = 0 ; i < 10 ; i++){
            list.add(i);
        }

        list.forEach(System.out::print);
    }
}
```
結果
```Java
0123456789
```
ArrayList::newでArrayList型のオブジェクトを生成
supplier.get()でList型のオブジェクトを取得
Java ラムダ式

## ラムダ式とは
メソッドを変数と同様に扱う記述様式のこと

- メリット

関数型インターフェースを実装するためのソースを手短にかける

Stream API の引数としての関数型インターフェースを記述するのに適している


//補足
関数型インターフェース ： 抽象メソッドを１つ持つインターフェースのこと
Stream API ： 配列やList、Collectionなどの要素の集合に対して、要素の直列処理や並列処理、要素の比較、並び替え、一致判定などの処理を実行するメソッド群のこと
Railsのルーティングについて

# はじめに

#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>



# ルーティングとは何か



ルーティングとはブラウザから届いたリクエストに対して、コントローラーで定義したアクションを繋げる機能です。


より具体的に言うと、送信されたURLに対して、どのコントローラーの、どのアクションで処理するかを決める対応表のことです。




# routes.rbとは



Railsのroutes.rbファイルは、ルーティングを登録するファイルです。

## routes.rに登録できるHTTTPリクエストは5つ


GET  リソース(コンテンツの取得)
例) サイトの表示


POST リソースの作成や追加
例) ブログ記事やコメントの投稿、写真の追加


PUT リソースの作成と更新
例)  記事やコメントの追加、編集


PATCH リソースの部分置換
例)  記事のタイトルや本文だけの変更


DELETE リソースの削除
例)　　　記事やコメントの削除


# まとめ

ルーティングを理解することでRailsアプリの動きを把握することができる。

この他RailsにはREST-API(RESTful)という設計思想があります。ルーティングを定義する場合は知るべきことです。

ここはもう少し学習を進めていきます。
Deno: ChatGPT API の使い方

こちらのプログラムを　Deno を使って書きました。
[Curl: ChatGPT API の使い方](https://qiita.com/ekzemplaro/items/6660260e287a9ee9ecf4)

## プログラム

```bash:deno_fuji.sh
export OPENAI_API_KEY="sk-****************'
deno run --allow-all deno_fuji.ts
```

```ts:deno_fuji.ts
// ---------------------------------------------------------------
//	deno_fuji.ts
//
//					Apr/11/2023
//
// ---------------------------------------------------------------
import process from "node:process"

console.error ("*** 開始 ***")

const url = "https://api.openai.com/v1/chat/completions"

const response = await fetch(url, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${process.env.OPENAI_API_KEY}`,
  },
  body: JSON.stringify({
    "model": "gpt-3.5-turbo",
    "messages": [{ "role": "user", "content": "富士山の高さは" }]
  }),
})

const data = await response.json()
// console.log(data)
console.log(data.choices[0].message)

console.error ("*** 終了 ***")
// ---------------------------------------------------------------
```

## 実行結果

```text
$ ./deno_fuji.sh 
*** 開始 ***
{ role: "assistant", content: "富士山の高さは、3776メートルです。" }
*** 終了 ***
```

## 確認したバージョン

```text
$ deno --version
deno 1.32.3 (release, x86_64-unknown-linux-gnu)
v8 11.2.214.9
typescript 5.0.3
```
フィラメントが折れてロードもアンロードもできなくなったときの対処方法(ダヴィンチ mini w+)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/01fed441-f929-d066-ce45-c04cd028a5d5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f847701e-8df8-d860-3961-480b032cee38.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/ac2b97fd-32e0-c03a-8ad8-7fbef707b071.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/d545e71b-1886-276e-a3c1-4d20e61aed15.png)
Node.js: ChatGPT API の使い方 (node-fetch)

こちらのプログラムを　Node.js の node-fetch モジュールを使って書きました。
[Curl: ChatGPT API の使い方](https://qiita.com/ekzemplaro/items/6660260e287a9ee9ecf4)

## プログラム

```bash:fetch_fuji.sh
export OPENAI_API_KEY="sk-****************'
./fetch_fuji.mjs
```

```js:fetch_fuji.mjs
#! /usr/bin/node
// ---------------------------------------------------------------
//	fetch_fuji.mjs
//
//					Apr/11/2023
//
// ---------------------------------------------------------------
console.error ("*** 開始 ***")

import fetch from 'node-fetch'

const requestBody = {
	model: "gpt-3.5-turbo",
	messages: [{role: "user", content: "富士山の高さは"}]
}

const url = 'https://api.openai.com/v1/chat/completions'

fetch(url, {
	method: 'POST',
	headers: {
	  'Content-Type': 'application/json',
	  'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`
	},
	body: JSON.stringify(requestBody)
})
.then(res => res.json())
.then(data => {
//	console.log(data)
	console.log(data.choices[0].message)
	console.error ("*** 終了 ***")
	})
.catch(err => console.error(err))


// ---------------------------------------------------------------
```

## 実行結果

```text
$ ./fetch_fuji.sh 
*** 開始 ***
{ role: 'assistant', content: '富士山の高さは3776メートルで、日本最高峰です。' }
*** 終了 ***
```
SPIKE Primeのバッテリー電圧を表示させる

![IMG_0186.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917111/06bde320-1e10-9fcf-68fa-8a8d9495d455.jpeg)
![Something went wrong]()
はじめに
WROの国際大会でもSPIKE Primeを使っているチームが増えてきました。
しかし、EV3に比べて不便な点が多いのが難点です。
その一つに、ディスプレイがなくなりMatrixLampになったため、センサの値などポートの値を確認するのが、不便になりました。
そこで、５×５のMatrixLampを使って５桁までの数値を表示できるプログラムを作成し、SPIKE Primeのバッテリー電圧を表示するプログラムを作成しました。

SPIKE Primeでの数値を表示する方法
読み取った数値を、各桁ごとに分離してlistに格納し、各桁の値に応じたMatrixLampを表示するという簡単なものです。
日本の伝統である、ソロバンでの数値表現を使っていますので、小学校の高学年の児童でも読めるはずです。
画像数値は、8319mvになります。
BigQueryコストパーフォーマンス ~カラムの選択~

# 目次
[1.はじめに](#1-はじめに)
[2.動作環境](#2-動作環境)
[3.BigQueryとは](#3-BigQueryとは)
[4.カラムの選択による容量の違い](#4-カラムの選択による容量の違い)
[5.まとめ](#5-まとめ)

# 1. はじめに
この記事はBigQueryに関して記実していきます。
仕事でも使用しているGCPのツールで、SQLを使ってデータを加工したりなどしています。

処理させる際はあまり容量を考えなかったのですが、BigQueryではクエリの実行容量によってコストがかかる仕組みです。

# 2. 動作環境
・ Mac OS 13.0
・ BigQuery

# 3. BigQueryとは
BigQuery は、大量のデータを分析するためによく使用されています。
また、SQLを使用してデータセットの検索、集計、グループ化などを行うことができます。

BigQueryの料金はストレージの料金とクエリ料金の合計で決まります。
現在時点(2023年4月11日)での無料枠は
・クエリ料金 : 1ヶ月あたり1TB 
・ストレージ料金 : 1ヶ月あたり10GB
となります。
(参照URL)https://cloud.google.com/free/docs/free-cloud-features?hl=ja#free-tier 
# 4. カラムの選択による容量の違い
今回使用するデータマートはGoogle側で用意されているデータマートを利用しました。
```ruby: 使用したテーブル
bigquery-public-data.github_repos.commits
```

テーブルが用意できたら実際にSQLを使って1カラムを抽出した場合と「*」(アスタリスク)を使った全てのカラムの抽出でのクエリ処理の容量の違いを実際に見ていきます。
<1カラムの場合>
クエリ処理容量 : 11.26GB![スクリーンショット 2023-04-11 1.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669832/1ec72b77-ff1b-eb28-24b9-33f58d9f5168.png)
<*の場合>
クエリ処理容量 : 848.02GB
![スクリーンショット 2023-04-11 1.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669832/1c15b112-1d75-1149-4da6-617c29b2040b.png)

以上写真の結果から大きな差が見られることがわかりました。


# 5. まとめ
最近ではビッグデータを取り扱う企業などがあると思います。
BigQueryを使っている現場で、テーブルデータにどのような値が入っている確認する場合は、安易に「*」を使って確認することはやめましょう。
また、テーブルデータの中身をクエリで確認するのではなく、エクスプローラのデータマートからクリックして参照するようにしましょう。
また、不必要なカラムは選択しないようにでコストパーフォーマンスの良いクエリを描くように心がけましょう。
【Linux】ファイルサイズを確認する

# ファイルサイズを確認する

```sh
ls -lah | grep ファイル名
```
* -ｌオプションは各ファイルやディレクトリのパーミッション、所有者、グループ、サイズ、更新日時などの情報を表示
* -aオプションは隠しファイルを含めてすべてのファイルとディレクトリを表示
* -hオプションはファイルサイズを人間が読みやすい形式で表示
スーパークラス「javax.servlet.http.HttpServlet」がJavaビルドパスに見つかりませんでした　解決方法

eclipseの開発環境構築時に、以下のエラーメッセージが表示された場合の対処方法

スーパークラス「javax.servlet.http.HttpServlet」がJavaビルドパスに見つかりませんでした

～解決方法～
試す前に サーバーウィンドウのTomcat右クリック から Tomcatワーク・ディレクトリをクリーンする
Eclipse の [実行(R)] -> [実行構成] または [デバック構成] をクリック

＜実行構成 または デバッグ構成＞ のウィンドウにて
  ・左側のツリーから Apache Tomcat 配下の Tomcatサーバー名 をクリック
  ・右側のパネルから [クラスパス] タブをクリック
  ・パネル中央のリストより [ユーザー・エントリー] をクリック
  ・パネル右側のボタンより [拡張(A)] をクリック

  ＜拡張オプション＞ のウィンドウにて
   ・[ライブラリーの追加] を選択して、[OK] ボタンをクリック

  ＜ライブラリーの追加＞ ウィンドウにて
   ・[ユーザー・ライブラリー] を選択して、[次へ(N)] ボタンをクリック
   ・プロジェクト指定のユーザー・ライブラリー を選択して、[完了(F)] ボタンをクリック
  [適用(A)] ボタンをクリックして、変更内容を保存
  [閉じる] ボタンをクリックして、構成ウィンドウを閉じる
PostgreSQLにODBC接続する

## 環境
Rails5.2
PostgreSQL 12.10
Windows10 + Vagrant

## はじめに
Railsにおける開発でテストデータを作成する場合、いちいちSQL文を書いて作成しなくてはいけないのだろうか。自分が以前、OracleやSQLServerを使ってクラサバの開発をしていた頃、AccessからODBC接続をおこない、テーブルリンクに直接手入力をして、テストデータを作成していました。それに比べ、Web開発の場合は、たかが１件のテストデータを更新するのに、わざわざSQL文を書かなくてはいけないのだろうか。Web開発においても、PostgreSQLを使っている場合であれば、pgAdminを使ってテストデータを直接手修正することができます。しかし、正直使い勝手はいいとはいえません。pgAdminを使うと、テーブルを選択して左クリックをして「View/Edi Data→All Rows」を選択し、データを全件表示させればデータを手修正できるようになります。しかし、１項目を修正する度に小ウィンドウが表示されて、OKボタンを押すといった操作が必要です。数件程度のデータであれば、このやり方で問題はないでしょうが、データ件数が数十件となると、このようなやり方は、とてもではないが、やってられなくなります。更に、Select文で、表示件数を度絞り込んだ後に、手修正するといったことが、pgAdminではできないことになります。

もっと、簡単にテストデータが作成できないものだろうか。そこで思いついたのが、AccessをPostgreSQLとODBC接続する方法です。Macを使って開発をしている人であれば、このような発想はなかっただろうと思います。Windowsを使っている人の特権かもしれません。

## ODBCの設定	
	
- コントロールパネルから「ODBC Data Sources(32-bit)」を選択します。	
- ユーザーDSNで、ユーザーデータソースを追加します。	
- 下記のように設定します。	
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/31f9712c-6319-80ed-5562-b5f26fc66b60.png)

>注意点
 PostgreSQLのドライバーは、Unicode版ではなく、ANSI版を選択してください。
PostgreSQLは標準でSSL接続をサポートしているため、SSL Modeを無効にすると上手く行きません。

- テストボタンをクリックして、このように出てくればOKです。
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/acd32c91-17d9-a154-73c2-3b559c5a7673.png)

## Accessから接続
- Accessを起動します。
- 外部データから、ODBCデータベースを選択します。
- 「リンクテーブルを作成してソースデータにリンクする」にチェックを付けてOKをクリックします。
- 作成した、データソースを選択します。
- PostgreSQLに作成したテーブルの一覧が表示されるため、全て選択してOKをクリックします。
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/2fbcf08a-b910-7e5e-f7e1-95fa1d3bf307.png)

- このように、Accessにリンクが張れました。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/cc0ed125-84d2-ae48-52e5-7a9ad405ed58.png)
(OCI) Oracle Cloud Infrastructure コンパートメントの落とし穴

AWS と OCI のマルチクラウド環境構築中の社内SEです。
AWS は運用歴5年で OCI は初となります。苦労しながら構築しています。

この記事にはコンパートメントの概念や説明等はありません。
コンパートメントを利用した運用を計画したが頓挫してしまい、
ルートのみの運用に戻したお話となります。

# OCI コンソールの利用者（管理者？）は

　1. コンパートメントの概念を知っていないといけない。
　2. 子のリソースが親のリソースに表示されない。
　　2-1. 設計(構成)が頭に無いといけない。
　　2-2. 画面遷移の度にコンパートメントを変更しなければいけない。
　3. MySQL はリソースの移動に対応していない。

に頭を悩まされます。
***
「1.」おそらく OCI の売りにしたいのだろうと思うのですが、非常にわかり辛いです。
皆様も検索に苦労されていると思います。はっきり言いまして VMware 時代からやっていた、
アクセス権のコントロールで十分可能です。理由は主に「2.」に記載します。
***
「2.」が非常につらいです。
「えっと、このセキュリティ・リストはＡというコンパートメントにあって…、だけどこのサブネットはＢというコンパートメントあって」とか、「あれ？、セキュリティ・リストがないぞ…、どこにあるのかなぁ。Ａ→Ｂ→Ｃとあった」みたいな事になります。

コンパートメントの概念があるリソースと無いリソースがあるのも非常に面倒です。【ロードバランサー】は紐づくリソースの【リスナー】および【バックエンドセット】にはコンパートメントの概念はありません。それに対して【ボールド】に紐づく【キー】はコンパートメントの概念があり、別々に配置可能です。結果「あれボールドの下にキーが無いぞ。作ってなかったかな？」とかになりかねません。というか何度もなりました。
***
「3.」これはイカンでしょうといいたいです。
MySQL を作り直さないといけません。
***


利点をあげるとしましたら、プロジェクトや部署ごとにコストを管理することができます。
但し、コストに関したら「タグ別コスト」が出せますのでコンパートメントで括る必要性はないかなと感じます。

予想ですがバージョンアップによって将来的には子のリソースが親のリソースに表示できるようになると思います。これがないとかなり厳しいです。



# ◆おまけ
Q. コンパートメント削除時にリソースが残っていたらどうなるのか？
A. リソースがまだコンパートメントに存在する場合、削除アクションは失敗し、コンパートメントはアクティブ状態に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521649/4c313722-b3c7-1d0f-4441-7cf690f6348b.png)

失敗の前に警告を出して欲しいです。
一旦「削除中」のステータスになり、しばらく待たされます。画面を見たら「アクティブ」に戻っていました。CLI で探せそうな気がしますが、CLI も学習中なので今は手で探しています。

# ◆追記(2023/04/11)
「コンパートメントが空ではありません。」と警告が出るパターンもあるようです。
おまけの画像は移動し忘れたリソースが残っていました。
今回の警告は予想ですが、サブコンパートメントのステータスが「削除済み」で残っているからではと思っております。現在調査中です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521649/33903dc8-4ac6-606e-2aa4-03b69be8b424.png)
Unity Photon PUN2でOwnerActorNrを使用してGameObjectを検索する方法

# Photon PUN2でOwnerActorNrを使用してGameObjectを検索する方法

Photon PUN2では、`photonView.OwnerActorNr`を使用して、オブジェクトのリストを作成し、プレイヤーIDに基づいてGameObjectを検索することができます。

## 方法

1. シーン内のすべてのPhotonViewコンポーネントを取得します。
2. 取得したPhotonViewのリストから、`photonView.OwnerActorNr`が一致するものを検索します。
3. 一致するPhotonViewのGameObjectを取得します。

以下のコードは、`photonView.OwnerActorNr`を使用してGameObjectを検索する方法を示しています：

```csharp
using Photon.Pun;
using UnityEngine;

public class FindGameObjectByActorNr : MonoBehaviour
{
    public GameObject FindGameObjectByOwnerActorNr(int targetActorNr)
    {
        PhotonView[] photonViews = GameObject.FindObjectsOfType<PhotonView>();

        foreach (PhotonView photonView in photonViews)
        {
            if (photonView.OwnerActorNr == targetActorNr)
            {
                return photonView.gameObject;
            }
        }

        return null;
    }
}
```
このコードでは、FindGameObjectByOwnerActorNrメソッドを使用して、指定されたtargetActorNrに一致するGameObjectを取得できます。GameObjectが見つからない場合は、nullが返されます。

## 使い方
1. 上記のFindGameObjectByActorNrクラスをシーン内の適切なGameObjectにアタッチします。
1. 他のスクリプトからFindGameObjectByOwnerActorNrメソッドを呼び出すことで、指定したtargetActorNrに一致するGameObjectを取得できます。

例：
```csharp
FindGameObjectByActorNr findGameObjectByActorNr = FindObjectOfType<FindGameObjectByActorNr>();
int targetActorNr = 2; // 検索したいプレイヤーID
GameObject targetGameObject = findGameObjectByActorNr.FindGameObjectByOwnerActorNr(targetActorNr);

if (targetGameObject != null)
{
    Debug.Log("Found GameObject: " + targetGameObject.name);
}
else
{
    Debug.Log("GameObject not found");
}
```

この方法を使用することで、photonView.OwnerActorNrを利用してGameObjectを検索し、取得することができます。
Node.js: ChatGPT API の使い方 (axios)

こちらのプログラムを　Node.js の axios モジュールを使って書きました。
[Curl: ChatGPT API の使い方](https://qiita.com/ekzemplaro/items/6660260e287a9ee9ecf4)

## プログラム

```bash:axios_fuji.sh
export OPENAI_API_KEY="sk-****************'
./axios_fuji.mjs
```

```js:axios_fuji.mjs
#! /usr/bin/node
// ---------------------------------------------------------------
//	axios_fuji.mjs
//
//					Apr/11/2023
//
// ---------------------------------------------------------------
console.error ("*** 開始 ***")
import axios from 'axios'

const config = {
	headers: {
		'Content-Type': 'application/json',
		'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`
	}
}

const data = {
	"model": "gpt-3.5-turbo",
	"messages": [{"role": "user", "content": "富士山の高さは"}]
}

const url = 'https://api.openai.com/v1/chat/completions'

axios.post(url, data, config)
	.then(response => {
//		console.log(response.data)
		console.log(response.data.choices[0].message)
		console.error ("*** 終了 ***")
	})
	.catch(error => {
		console.error(error)
	})

// ---------------------------------------------------------------
```

## 実行結果

```text
$ ./axios_fuji.sh
*** 開始 ***
{ role: 'assistant', content: '3,776.24メートルです。' }
*** 終了 ***
```
【2023年4月版】Ubuntu に node.js と npm を入れたい（バージョン管理も）

# はじめに

Ubuntu22.04 に node.js と npm を入れたい

## 手順

- とりあえずの node.js と npm をインストール
- n をインストール（バージョン管理）
- 最新の node.js と npm をインストール
- 最初に入れたとりあえずの node.js と npm をアンインストール
- 残った node.js と npm が最新であることを確認

# とりあえずの node.js と npm をインストール

```terminal
$ sudo apt install -y nodejs npm
```

# n をインストール（バージョン管理）

```terminal
$ sudo npm install n -g
```

# 最新の node.js と npm をインストール

```terminal
$ sudo n stable
```

# 最初に入れたとりあえずの node.js と　npm をアンインストール

```terminal
$ sudo apt purge -y nodejs npm
$ sudo apt autoremove -y
```

# 残った node.js と npm が最新であることを確認

```terminal
$ node -v
$ npm -v
```

# 他のバージョンをインストールする／切り替える

```terminal
$ sudo n stable		# stable のバージョン
$ sudo n latest		# latest のバージョン
$ sudo n 18.15.04	# v18.15.0
```

# さいごに

かんたんでしたね
ChatGPTを利用した英語学習法

### 概要
ChatGPTを使用するといい感じに英文添削してくれたりするので、その際に使用するプロンプト（ChatGPTへの命令文）をメモ。

### 英文添削
```
#Instructions :
You are an American professional English teacher.
Please output your best correction based on the following constraints and input sentences.

#Constraints:
・Please carefully assess the original input and rate it using the CEFR.
・Correct any grammatical errors or more appropriate expressions so that it can be received as CEFR B2 level.
・Please wrap the response in a table with additional column to explain why you revised sentences in question.
・Rewrite the input based on the correction so that it can receive CEFR B2 level.

#Input
{ここに添削してほしい英文を入れる}
```
CEFR B2 levelと書いている箇所は、ご自分の目標レベルに合わせてください。
このプロンプトでは、InputがCEFRで言うどのレベルに相当するのかを判定してくれます。
また、指定したレベルに合わせて英文添削をし、添削結果を表でまとめてくれます。
最後に指定したレベルに沿った内容にInputを書き換えてくれます。

### 英単語の出題
```
CEFR B2レベルに必要な英単語を５つランダムに出題してください。
また、その英単語を用いて英語でショートストーリーを書いてください。
さらに英単語は太字で書いてください。
ストーリーの後に、日本語の訳もつけてください。
また、最後にそれぞれの単語の意味と発音記号を書いてください。
```
英単語を単語帳だけで覚えるのは面倒なので、ショートストーリーにして覚えてしまおうという試み。
レベルはご自分のターゲットに合わせてください。


### GCASのスモールトーク対策

```最初の質問を生成してもらう
#命令書:
あなたは、アメリカ人のプロの英語講師です。
私に1つ質問をしてください。
質問は職場で想定されるスモールトークを題材にしてください。
```

```回答をして添削してもらう。以下この繰り返し。
#制約条件:
・入力された回答をCEFRのレベルで判定してください。
・文法間違い、より適切な表現があればCEFR B2レベルに準拠して英語で訂正してください。
・訂正した内容を元に、CEFR B2レベルで文章を書き直してください。
・添削した内容を表にまとめてください。
・回答に対して質問をさらに1つ生成してください。

#回答:
〜〜〜〜
```

### 参考
https://thepast.jp/blog/the-ultimate-guide-for-using-chatgpt-for-english-learning/#%E8%8B%B1%E8%AA%9E%E5%AD%A6%E7%BF%92%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BChatGPT%E3%81%AE%E6%B4%BB%E7%94%A8%E9%A0%98%E5%9F%9F
TwitterAPIのFreeで できること

# 概要

Twitter API で、FreeとBasicが提供されたよっていう記事はみますけど、何が出来るのか書かれているところがほぼ無かったので、Freeで何ができるのか、コードを書くには？ということで、検証してみました。

# 既にDeveloper申請済みで Elevated 等になってると、Freeが選択できない

Freeにできませんね。Basicはリンクがでてるっぽいのでクレカ登録とかしたら行けそうですが…ブログで使っているアカウントなので、投稿だけでいいんですが…詰みですか？
ちなみに、登録申請していないアカウントで行うと、既定はFreeになるようですね。前のようにAPI利用の申請して結果を待つ必要はなさそう。

# Twitter API v2が必須

FreeもBasicも、API v2 が必須。C#のライブラリがほぼ死んだ。CoreTweet、今のところ動作しなかったので対応してない感じ。TwitterSharpというのがV2対応していると書かれていたのでテストしてみたけど、API通らないですね。BeararTokenしか渡せないけど、それが要因とかはないですよね？
仕方ないので、使ったことないけど、Pythonで書いてみました。もうちょっと、C#系ライブラリもテストするけどね（書き直したくないので）。

# VS 2022 にPython実行環境ぶちこんで

フリーでVS2022にぶち込んで、ブレイクポイントおけるのは良いですね。バージョン毎に用意も出来ますし、モジュールもそれぞれで管理して入るようですし。PHPだと有料ですしね。でもIronPython3.4は実行するとエラーを吐いてVS上では動かせませんでした。何故に…。

# 本題

Basicはさすがに今の段階で課金するようなものを製作もしていないので、Freeで何が出来るのか、テストしてみました。結果のPythonコードはこちら

```python
import tweepy

# access_tokenとかあるところにあるよ
bearar_token = ''
# APYキーのところの
consumer_key = ''
consumer_secret = ''
# アクセストークン
access_token_key = ''
access_token_secret = ''

# OAuth...ほげほげメソッドは使わない
# Clientを使うよ
# APIクラスは死んだんだね
# limit_rate() 使えないけど、どうやって計測しよう...
client = tweepy.Client(
	bearer_token = bearar_token,
	consumer_key = consumer_key,
	consumer_secret = consumer_secret,
	access_token = access_token_key,
	access_token_secret = access_token_secret
)

## Twitter API v2 Freeで利用できるメソッド一覧
# つぶやく
client.create_tweet('つぶやくぞー')
# ツイートを削除する
client.delete_tweet(0000000000);
# アカウントの情報を取得する
me = client.get_me()

```

いや、自分のツイートも拾えないぐらい何も出来やんやん。つぶやけるだけですやん。画像とか動画投稿とか、リツイートとかできるのかな?その辺りはまだ未調査です

# ブログのつぶやきには使えそう

いや、それぐらいしか使えなくない？
MySQL で「ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)」の解決方法

以下MySQL8.0.32を前提として話を進めます。
```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```
の解決方法を書きますが、[参考記事](https://programmer-life.work/sql/mysql-cant-connect-to-local-mysql-server-through-socket)では
```
Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
```
のエラーを解決する方法が載っています。私はこの参考記事の通りにやって解決できたので、(38)と(2)のどちらのエラーでも参考になると思います。


# 状況・解決方法
MySQLをインストールし、ログインしようとしたところ以下のようにエラーが出ました
```
$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```

参考記事の通り`mysql.sock`を作成
```
$ sudo touch /tmp/mysql.sock
Password:
```

これでもまだログインできません。
```
$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```

参考記事の通り以下を実行
```
$ sudo mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/MacBook-Pro.local.pid).
```
参考記事と同じエラーが出ました


参考記事の通り以下を実行
```
$ touch /usr/local/var/mysql/MacBook-Pro.local.pid
```
(`MacBook-Pro.local`のところには`$ uname -n`で確認できるマシン名が入ります)

参考記事の通り以下を実行すると、同じく参考記事のように長めのエラーが出ます
```
$ mysql.server start
Starting MySQL
.rm: /tmp/mysql.sock: Permission denied
2023-04-10T12:53:51.6NZ mysqld_safe Fatal error: Can't remove the socket file:
/tmp/mysql.sock.
Please remove the file manually and start /usr/local/Cellar/mysql/8.0.32/bin/mysqld_safe again;
mysqld daemon not started
 ERROR! The server quit without updating PID file (/usr/local/var/mysql/MacBook-Pro.local.pid).
```

参考記事の通り実行、`control＋Z`で停止します
```
$ ls -la /tmp/mysql.sock
-rw-r--r--  1 root  wheel  0  4 10 21:51 /tmp/mysql.sock
$ sudo rm /tmp/mysql.sock
$ /usr/local/Cellar/mysql/8.0.32/bin/mysqld_safe
2023-04-10T12:57:03.6NZ mysqld_safe Logging to '/usr/local/var/mysql/MacBook-Pro.local.err'.
2023-04-10T12:57:03.6NZ mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql
^Z
[1]+  Stopped                 /usr/local/Cellar/mysql/8.0.32/bin/mysqld_safe
```

改めてログインすると
```
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 Homebrew

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
できました！

### その他参考記事
* [mysqlが起動できない](https://qiita.com/hondy12345/items/d32ed749fb49e9da7de6)
* [Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)](https://qiita.com/A__Matsuda/items/c5dfb15d4e38bfc4be6b)
Power AutomateでのAI Builder名刺リーダー使用方法


# フロー全体
まずフロー全体は以下のようなイメージです。
上から順番に中身を見ていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5e482384-0e53-c126-6f89-30bf4ad95d86.png)


# 名刺データの取得
トリガーを、「名刺の読み取ったデータを保存するテーブル（ここでは名刺テーブル）が追加されたら」にします。
そしてこの後、AI Builderで画像を扱うために画像をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7ac48537-5af9-5db9-4537-70bb11f167ca.png)

# AI Builderアクションの追加
アクションの追加からAI Builderの「名刺から情報を抽出する」アクションを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/fd2998fb-9eb4-93c6-ce70-86ff9f1ecbbb.png)

# 画像をAI Builderで読み取り
AI Builderアクションの「名刺」の項目に「ファイルまたは画像をダウンロードする」アクションで取得した動的な値を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/9ea64a52-4d00-5b5c-461b-fdd54d9eb2ff.png)

# AI Builderで読み取ったデータの保存

最後にAI Builderで読み取ったデータをテーブルに保存します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c87a608e-331c-08fc-9d04-cdd444cd648b.png" width=70%>
AmazonECSの構成まとめ（用語とそれぞれの設定内容）

## 内容

AWS ECSを利用する上で、登場するサービスの名称と役割が一つのハードルと感じたため、簡単にまとめます。

## 目次
- [ECSとは](#ecsとは)
- [ECRとは](#ecrとは)
- [ECSの構成とそれぞれの設定内容](#ecsの構成とそれぞれの設定内容)

## ECSとは

フルマネージドなコンテナオーケストレーションサービス。
コンテナ化されたアプリケーションを簡単にデプロイ、管理、スケーリングすることができる。

### Fargateとは

ECSには起動タイプとしてEC2起動タイプとFargate起動タイプが存在する。
EC2起動タイプでは自分で管理するインスタンス上でコンテナ化されたアプリケーションを実行できるのに対し、
Fargate起動タイプは、基盤となるインフラストラクチャをプロビジョン、及び管理することなくコンテナ化されたアプリケーションを実行できる。

## ECRとは

フルマネージドなDockerコンテナレジストリ。
ECSとの連携が容易で、新しいコンテナを立ち上げるときに簡単にコンテナイメージを取得できる。
AWS上でシステムを構築する際は他のAWSサービスとの連携やセキュリティ面を考えるとECRがおすすめである。

## ECSの構成とそれぞれの設定内容

ECSの構成の全体像としては、以下のようなイメージとなる。

![スクリーンショット 2023-04-11 8.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/8631bcd9-caa4-74c9-a145-12d716a488f8.png)


### クラスター

サービスとタスクを管理するためのグループ。
サービスとタスクはクラスターに登録されているインフラストラクチャで実行される。

#### クラスターの設定内容

- クラスター名
- クラスターを作成するVPC

### サービス

オーケストレーション機能を提供。
指定したタスク定義をもとに、タスクを実行。
サービスをデプロイすると、ECS Fargate上で各タスク、またはそのタスクに入っている各コンテナが実際に起動する。

#### サービスの主な設定内容

- どのタスク定義を使用するか
- デプロイ設定（どのECSクラスターを使用するか）
- 必要タスク数
- ロードバランサー設定（ELBと連携して各タスク間にトラフィックを分散）
- IAM設定

### タスク定義

どのような設定でコンテナを動かすかといった、タスクの実行を定義。

#### タスク定義の主な設定内容

- コンテナ定義
    - コンテナ名
    - どのイメージを使用するか（ECR内の、使用するイメージURIを選定）
    - CPU/Memory
    - Portマッピング
    - 環境変数
    - 使用ボリューム
    - CloudWatch Logsの出力先
- ボリューム定義
    - ボリューム名
    - パス
- その他設定
    - ネットワークモード（タスクごとに個別のIPアドレスを付与など）
    - Task IAMロール

### タスク

コンテナを管理するための入れ物。
タスク定義に基づき実行される。
タスク内のコンテナは同一ホストで実行される。

## まとめ

以上がECSの各登場人物と設定内容の簡単なまとめになります。

ECSの仕組みを言語化してまとめると
「サービスがタスク定義を元にタスクを実行する。タスク定義にはどのDockerイメージを使用するかが定義されている。」
といった感じだと思います。

ここまで読んでいただきありがとうございました。
Oracle Analytics Cloud：ホームページでウォッチリストを使う

# ウォッチリストとは
Orace Analytics Cloud（**OAC**）のウォッチリスト機能は、トップページからアナリティクスコンテンツへのターゲットリンクをより簡単かつ効果的に提供します。

# OACにログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/8dfe85ad-e336-cfa3-125b-2bb5d4dad95e.png)
ホームページのカスタマイズは、この通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b6b2a88e-65ea-92df-944a-341ba93d40ca.png)
作成済みのワークビックを開きます。
この2つのビジュアライゼーションを「ウォッチリスト」として使ってみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f7461b0d-dafd-206a-4f9b-04d8fc81fcdf.png)

# ウォッチリストに追加
ワークブックを編集モードにし、ウォッチリストに追加したいビジュアライゼーションの「ウォッチリストに追加」アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/6d4a4463-7708-9114-f261-46408d7f48e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/dd83fd1b-0c8e-ef5f-b416-82ba5e5a78e9.png)
ウォッチリスト名を入力し「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/95153937-9eb9-4124-4af8-7be55551a04c.png)
もう一つのビジュアライゼーションは、別のウォッチリストに「追加」しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/911ff158-8764-77cb-aa75-3e94b7a3dec8.png)

# OACホームページを表示
ウォッチリストを作成したので、ホームページを表示してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c41722fb-b8e7-1816-09ab-45afcb02347c.png)
思ったのと違う感じです。
カスタマイズを変更してみました。
「機能付きウォッチリスト」を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/eeb2d7cf-4f74-5666-3dfc-ab43a70489af.png)
求めていた感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/50ac1f6a-2888-8b3f-f342-2a11aa73ba83.png)

# 一つのウォッチリストに複数のビジュアライゼーションを追加
このワークブックの4つのビジュアライゼーションを一つのウォッチリストに追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/0153f11e-f6ff-431d-cce9-0a9278eddd36.png)
ホームページのカスタマイズでは、「機能付きウォッチリスト」を1行表示にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/eb297c3d-c667-37bf-0f50-ed6e2279f064.png)
このウォッチリストに別のワークブックに定義されているビジュアライゼーションも追加してみました。
こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/6dd3fe79-a693-98a8-3443-4a5b92ea33e4.png)

# ウォッチリストを分析の起点に
アクションメニューをクリックし、表示されたメニューから元になったワークブックを開いたり、新規ワークブックで開いたりすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/52d89ad5-79fe-fe4c-467d-f30a4711be9a.png)
Build an Autolaunched Flow challenge


+ [Can't find "Campaign" object on "Build an Autolaunched Flow" challenge](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000OtKdK)

何故かCampaignが表示されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cb276efc-75e0-13f1-3b0b-49ce09d4e414.png)

新しいプレイグランドで解決

# In the Create Campaign element, we can’t find a field value that sets ‘Name’ to ‘Child of {!campName}’.

+ [am in this flow Autolaunched and Scheduled Flows Build an Autolaunched Flow need to fix this error In the Create Campaign element, we can’t find a field value that sets ‘Name’ to ‘Child of {!campName}’.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgY7r)

:::note
Please check this video.

https://www.youtube.com/watch?v=1_zMfiMMfzw
:::

+ [Create a Child Campaign Flow](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007JCy9F)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/336f48e9-d0ad-430d-1777-a0e428df880f.png)

:::note
Try setting as below

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/10dd6405-c16e-e531-011f-8bd0092db674.png)

If you have an older version of the flow, try deleting it.
:::




# ボタンがない？

+ [Run an Autolaunched Flow from a Custom Button](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ssjlc)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8e989185-a0c0-37b0-6860-09931c2a645e.png)


:::note
Did you add this button in your page layout?

button like this

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e16346a8-6aa7-356b-cc3e-927fe05d3abe.png)
:::

# {} がない？

+ [How do I put in the campStartDate on Build an Autolaunched Flow module?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XI9iV)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f05a207e-eb06-1022-9a13-248ee09604f8.png)
フロントエンド 環境構築-2023(nodebrew版)

# はじめに

今回、環境構築を0からやり直さないといけなくなったのでメモとして残します。

# 環境メモ

>MAC OS
>13.3.1（22E261）
>intelCore


# やること

>① nodebrew のダウンロード
>② node.js のダウンロード


# ① nodebrew のダウンロード

## 本体をダウンロード

```terminal
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

>公式ホームページ
>https://brew.sh/

>github
>https://github.com/hokaccha/nodebrew


## nodebrew インストール

```terminal
brew install nodebrew
```


## バージョンの確認

```terminal
nodebrew -v
=> nodebrew install v8.9.4
```


## セットアップ

```terminal
nodebrew setup
```


## bash_profile の編集・作成

```terminal
vi ~/.bash_profile
```


## bash_profile の編集・作成

exportの内容を貼り付ける。
「a」はファイルを編集するコマンド
編集後は「esc」ボタンを押す。

```terminal
a
export PATH=$HOME/.nodebrew/current/bin:$PATH
```


## 保存して閉じる

```terminal
:wq 
```


## 作成の確認

```terminal
ls -a
=> .bash_profile 確認
```


## bash_profile へパスの修正

```terminal
ls -a
=> .bash_profile 確認
```

## パスを読み リフレッシュ

```terminal
source ~/.bash_profile
```



# ② node のダウンロード


## ダウンロード可能なバージョンを確認

```terminal
nodebrew ls-remote
```


## ダウンロード

「2023-04-11」では公式サイトで「v18.15.0」のバージョンが推奨されている。

>公式サイト
>https://nodejs.org/en


```terminal
nodebrew install-binary v18.15.0
```


## 使用できるバージョンの確認

```terminal
nodebrew list
```


## 使用バージョンの切り替え

```terminal
nodebrew use v18.15.0
```


## バージョンの確認

```terminal
node -v
=> v18.15.0
```


# ③ npm / yarn / pnpm のダウンロード


## インストール

```terminal
npm install -g
```

## エラーの原因

下記のエラーが出てくる原因は「package.json」が無いからです。
実際にソースを触るときは、環境にjsonは入っているので最初は大丈夫！！

```terminal
npm ERR! code ENOENT
npm ERR! syscall open
‥
```


## バージョン確認

```terminal
npm -v
=> 9.5.0
```


# ④ yarn / pnpm のダウンロード

もしも、必要ならインストールする。

```terminal
// yarn
npm install -g yarn
or
npm i -g yarn

// pnpm
npm install -g pnpm
or
npm i -g pnpm
```

>公式サイト
>yarn
>https://yarnpkg.com/cli/install
>
>pnpm
>https://pnpm.io/installation


# 環境構築終わり

この後は、作業に応じて必要なパッケージをダウンロードすればよし！！

```terminal
// 例-angular/cli
npm install -g @angular/cli
or
npm i -g @angular/cli

// 例-React
npx create-react-app my-app
```

>公式サイト
>angular
>https://angular.io/guide/setup-local
>
>react
>https://react.dev/learn/start-a-new-react-project


# 最後に

若干自分用のメモでしたが、もしも環境構築で迷った際は参考になると嬉しいです。
補足ですが、nodeのバージョン管理は「nodebrew」以外にも「Volta」の方が便利だそうです。
プロジェクトによって推奨環境が違うので、チャレンジしてみたい！！

ここまで読んでいただき、ありがとうございました。

>Volta公式サイト
>https://volta.sh/
[Unity]LayoutGroupの中で個別にサイズを指定する

# 概要
UnityでVerticalLayoutGroupなどを使ってオブジェクトを並べた時
![スクリーンショット 2023-04-11 7.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/39de75e5-87d0-891b-ee14-5e638f38dc3f.png)
![スクリーンショット 2023-04-11 8.03.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/2438eff1-23fd-0e14-a7e6-6b4f04a444ea.png)
一つだけHeightを高くしたいけれど変更できない！ってなることあると思います。
![スクリーンショット 2023-04-11 8.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/1b3807f0-054b-e940-02c0-3099d7cb63a5.png)

# 本文
そんな時は目的のオブジェクトにLayoutElementをAddComponentすれば解決します。
![スクリーンショット 2023-04-11 8.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/7d5810e1-a5eb-533a-7cf1-ee6b8576f9ac.png)
![スクリーンショット 2023-04-11 8.00.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/159b4540-b785-2c57-126d-9784c69f42c8.png)

# 補足
これは一例です。調整の方法は他にもあると思います:open_hands:
WEBGL用ゲームエンジン作ってみる ~40日目~

# はじめに
こんにちわ。
ゲームエンジン作って４０日が立ちました。
飽きずに毎日作っています。

前回までの記事
１日目：https://qiita.com/osakasho/items/f02d7acf8a822e25d3e0
１０日目：https://qiita.com/osakasho/items/543eb0888b0a4e9162d2
２０日目：https://qiita.com/osakasho/items/4660d453e4f6dcec1fbd
３０日目：https://qiita.com/osakasho/items/78ce6f19b32101b1b355
４０日目：<<今ここ

## 現在の進捗について

### エディタの改善
- UEみたいなShift＋WASDのカメラ移動
- カメラ移動量の調整、補助線のONとOFF
- UIナビゲーションのグリッド実装
- 各種オブジェクトの通常マテリアルの色対応

![ninhagl1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/9116b927-f468-ef3a-cad6-c90e7f5f3217.gif)

![ninhagl2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/3c50d973-ed87-7e14-7b86-1eedd1d94dfc.gif)

![ninhagl3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/d67d1223-f047-bb59-f3bd-76b8de88f720.gif)


### シェーダエディタの改善
- 任意のジオメトリでシェーダーマテリアルを記述およびプレビュー
※まだアニメーションの追加や、メインビューへの割りあて連携はできてません。
![ninhagl4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/89e603b6-6fe5-8c22-dcaf-56788acd9ffa.gif)

### 細かな修正およびバグの修正
- Transformエディタ（Inspector）のUI変更
- Inspectorからスケールや位置、回転の変更と、直接操作するので同期修正

![ninhagl5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/22a805d5-47b0-62e6-2512-478b2c2e8e56.gif)

## 今後の予定（直近）
- UIナビゲーションの実装
- UIのボタンおよびアイコンリストの追加
- 固定カメラ対応
- スクリプト対応とWebWorkerAPIの連携
- SkywayのマルチプレイヤーAddonの追加
- シェーダエディタのアニメーションコードの実装
- シェーダマテリアルの反映

# おわりに
以外と長続きしてます。
Three.jsが楽しくて毎日発見があります。

今月、多少使えるレベルまでもっていきたい・・・・。
選択リストの値を変えた場合のレポートへの影響

+ [商談オブジェクトの種別(項目名はType)のAPI参照名の変更におけるレポート及びダッシュボードへの影響について教えてください](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Otcjz)


商談オブジェクトの標準項目の種別(項目名はType)の選択リスト値の中で無効な値になっているAPI参照名を変更した後に元のAPI参照名に変更しました。


その後、変更前に作成していた上記の変更をしたTypeを検索条件として使用しているレポートを活用しているダッシュボードが本来の数値を表示しなくなりました。

ダッシュボードで閲覧すると数値が正しい値ではないのですが、レポートを表示をすると正しい値を表示します。

ダッシュボードにはフィルタは使用しておらず、レポートとダッシュボード両方確認しましたが、条件設定は以前のままで変更がないことは確認しております。

ダッシュボードに設置しているレポートのコンポーネントの編集画面のプレビューでは正しい値を表示しますが、編集画面を閉じてダッシュボードを確認すると、正しい値を表示されません。

更に、レポートを別名で保存した新しいレポートをダッシュボードに設置したところ、正しい値をダッシュボードで確認することができました。

:::note
>ダッシュボードにはフィルタは使用しておらず、レポートとダッシュボード両方確認しましたが、条件設定は以前のままで変更がないことは確認しております。

ダッシュボードにはフィルタがないとのことでしたが、レポートはどうでしょうか？以下のヘルプを読むと、フィルターは選択リストの値を変えても、変わらないと書かれています。

+ [選択リストの値とレコードタイプの変更に関するレポートの考慮事項](https://help.salesforce.com/s/articleView?id=000385755&type=1)

+[選択リストのリネームと選択リスト値の置換の違い](https://help.salesforce.com/s/articleView?id=000385717&type=1)

+ [What happens to records if the picklist field value is updated](https://developer.salesforce.com/forums/?id=9062I000000Xvq3QAC)
:::

フィルターに入っている種別を一度削除し、まったく同じフィルターを入れ直したところ解決いたしました。

とのことなので
選択リストのラベル、API名は同じように見えても内部での識別子(おそらくId)が異なっていたのだと推測します
AWSの最低料金をまとめてみた【コンピューティング編】

AWSを触るにあたって、とりあえず各サービス試したいけど、料金がどれくらいかかるかざっくり知りたい、、、  
という方向けに、各種サービスの”最低料金”にフォーカスして、まとめました。  
皆さんの検討の一助になると幸いです。  
また、料金・課金形態は都度変更されますので、最終的にはご自身でpraicing calculatorなどを利用し料金をご確認ください。


## 前提
* 2023/4/1時点
* 東京リージョン (ap-northeast-1)
* リザーブド・Saving Plansなどの長期契約、Spotの利用は行わない

## コンピューティング
### EC2
オンデマンドインスタンス前提です
##### 1. 無料利用枠
* t2.micro が毎月750h無料（アカウント作成から12か月間）
* データ転送アウト（インターネット） : 合計100GB/月 まで
  
##### 2. 最安構成
* インスタンス名: t4g.nano 

具体的なスペックと料金一覧が知りたい場合は下記をどうぞ
> [AWS EC2の月額料金の一覧表を作ってみた](https://qiita.com/koji4104/items/58088f5af5300234aaca)
####3. 料金
* 0.0042 USD/1H  
  (本当の最低時間だと60秒なので、0.000007 USD/sですね)  
* データ転送アウト（インターネット）: 0.09USD/GB (最初の10TBまで)
* その他、別リージョンへの送信に0.01~0.02USD/GB 
> 参考：[Amazon EC2 オンデマンド料金](https://aws.amazon.com/jp/ec2/pricing/on-demand/#Data_Transfer)

### Lambda
#### 1. 無料利用枠
* 100万リクエスト/月
* 40万GB*秒の起動時間（コンピューティングタイム）/月
* エフェメラルストレージ(/tmpとかのボリュームのこと) 512MB
#### 2. 最安構成
* Armを利用
* メモリ: 128MB  

#### 3. 料金
* 0.0000017USD/秒　(最初の60億GB秒/月)
* 0.20USD/ 100万リクエスト　(最初の60億GB秒/月)
* データ転送に関しては、EC2と同料金（そちらを参照）
> 参考：[AWS Lambda 料金](https://aws.amazon.com/jp/lambda/pricing/?did=ap_card&trk=ap_card)

### ECS
ECS自体では課金は発生せず、利用したインスタンスやボリュームに対して課金

#### (1) Fargate起動モデル
##### 1. 無料利用枠
* エフェメラルストレージ 20GB

##### 2. 最安構成
* Linux/ARM
* CPU：0.25 vCPU
* メモリ：0.5GB

##### 3. 料金
CPU の料金
合計 vCPU 料金 = (タスク数) × (vCPU 数) × (CPU 秒あたりの料金) × (秒単位の 1 日あたりの CPU 使用時間) × (日数)
合計 vCPU 料金(分単位) = 1 × 0.25 × 0.000011236 × 60 × 1 = 0.0001685 USD

メモリの料金
合計メモリ料金 = (タスク数) × (メモリ (GB)) × (1 GB あたりの料金) × (秒単位の 1 日あたりのメモリ使用時間) × (日数)
合計メモリ料金(分単位) = 1 × 0.5 × 0.0000012278 × 60 × 1 = 0.00003784 USD

* データ転送に関しては、EC2と同料金（そちらを参照）
> 参考：[AWS Fargate の料金](https://aws.amazon.com/jp/fargate/pricing/)

#### (2)EC2起動モデル
EC2の料金形態を参照

### Batch
料金不要。実行に使用するEC2,Fargateなどに対して課金。

### Elastic Beanstalk
料金不要。アプリケーション実行に使用するEC2, Fargate, DBなどに対して課金。

### ELB

#### (1) ALB
##### 1. 無料利用枠
*750時間/月（CLBと共有) の接続時間
*15LCU/月
##### 2. 最安構成
* ターゲットにLambda（ターゲットがEC2の場合とで値段が異なる)
少し計算が大変なので、以下を想定します
* LCU
  - １秒あたりに新しく接続が確立された数： 1 (=1/25=0.04LCU)
  - １分あたりのアクティブ接続数 ：60 (=60/3000=0.02LCU)
  - 一時間当たりのHTTP(s) リクエストと応答のバイト数（GB単位）：毎秒10KB * 3600秒 = 36MB (=36/400=0.09LCU)
  - ルール評価（１０個まで無料）: 1 (0.001LCU)
  
##### 3. 料金
上記想定のみの利用の場合には**無料利用枠で収まります**。(最大LCU = 0.09LCU)
以下は参考として、無料利用枠を超過した場合の想定料金です。
* Application Load Balancer 時間（または 1 時間未満）あたり、0.0243USD
* 上記4つのうち最大のLCU 時間（または 1 時間未満）あたり、0.008USD
    →0.008 * 0.009 = 0.000072 USD / 時間

> 参考：[Elastic Load Balancing 料金表
](https://aws.amazon.com/jp/elasticloadbalancing/pricing/)
#### (2) NLB
##### 1. 無料利用枠
なし

##### 2. 最安構成
* TCP接続（UDPを使うケースが限られるため。お試し、という意味ではTCP）
* NLCU
 -  1秒あたりに新しく接続が確立された数: 1 ( 1/800 = 0.00125 NLCU)
 -  1分当たりのアクティブ接続数: 60 (60/50000 = 0.0012 NLCU)
 -  EC2, コンテナ、IP, ALBをターゲットとして、1時間当たりのバイト数: 36 MB / 1000MB = 0.036 NLCU
* EC2をターゲットとする場合は、EC2側で別途料金発生
##### 3. 料金
* Network Load Balancer時間(または1時間未満)あたりの0.0243 USD
* 上記構成で最大のNLCU時間（または1時間未満）あたり、0.006 USD
    →0.006 * 0.036 = 0.000216 USD

> 参考：[Elastic Load Balancing 料金表
](https://aws.amazon.com/jp/elasticloadbalancing/pricing/)


## 最後に
最安構成をみると、クラウドサービスのスモールスタートの価値がよくわかりますね。
コンピューティングに関しては、試しに使用する分であればコスト負担が大きくかかることはなさそうですが、使わない分は利用停止しましょう。
インフラ未経験がネットワークスペシャリストに合格するまでにしたことをまとめてみる

# 筆者の当時のスペック

- 新卒3年目になりたて
- IT勤務だがアプリ寄りのためインフラは未経験
- 応用情報でネットワークを選択するも全問不正解
- 前年にプロジェクトマネージャに合格していたので午前Iは免除

なので出てくる単語全てが新しく、理解しないといけないことがたくさんある状態でした

# 試験に対するモチベーション

- 応用情報で全く歯が立たなかったのが悔しかった
- ネットワークの仕組みが気になっていた
- 社内でネットワーク担当になったのでネットワークの知識をつけたいと思った

応用情報では午後のネットワークが分からなすぎたので、とりあえず「L2SW」って書いてました

# 消費したもの

- お金：10668円(教科書代 + 試験代)
- 時間：4340分

期間は1, 2ヶ月くらいだったかと思います

体系的な教科書を一つ持っていれば、残りはネットで調べて肉付けしていくとなんとかなった印象です

# 実際にしたこと

## 要約すると

- 教科書の内容理解：1608分
- 午前Ⅱ対策：443分
- 午後I対策：1617分
- 午後Ⅱ対策：672分

## 具体的には

- 教科書の内容理解
    - 以下の本をとにかく読みました(※当時は2022年版)
        
        - [情報処理教科書 ネットワークスペシャリスト 2023年版](https://www.amazon.co.jp/情報処理教科書-ネットワークスペシャリスト-2023年版-ICTワークショップ/dp/4798177571/ref=lp_2157078051_1_12?sbo=RZvfv//HxDF+O5021pAnSA==)
        
    - 理解ができない箇所はひたすら調べて補足していき、できるだけ多くのことと関連付けて理解していきました
    - 英語3文字の言葉が多いので、英語の勉強にもなった記憶があります！
- 午前Ⅱ対策
    - 過去問道場を解くのみでした(過去問道場様様です)
        
        - [ネットワークスペシャリスト過去問道場](https://www.nw-siken.com/nwkakomon.php)
        
    - 電車などスキマ時間にこなしていきました
    - 解いた問題数は160問くらいだったかと思います
- 午後I対策
    - 令和3年から平成26年までの過去問をやっていきました
    - ここからネットワーク構成とか考える必要が出てきたので楽しくなってきた記憶です
- 午後II対策
    - 令和3年と令和元年の過去問をやっていきました
    - 理解するべき点は午後Iとあまり変わらないかなと思ったので、午後IIよりも午後Iに時間を費やしました(午後Ⅱは大問1問解くのに2時間かかるので午後Iこなしている方が楽しかった、、)

# 結果

- 午後Ⅱにあまり時間を割いていなかったからか、結構ギリギリでした

https://twitter.com/affine92325659/status/1540299477973868545?s=61&t=IpCBHt2P6G7aaBwRVxSsbQ

# 最後に

ネットワークスペシャリストは聞き慣れない単語が多く理解しないといけないことも多いので、インフラ未経験の方は、諦めず1単語ずつ理解していくことが必要だと思います

実際、ネットワークスペシャリストを取得してからは、社内でネットワークについて頼りにしてくださることも増え、自分の自信にもつながったので取得して良かったと思います

ちなみにですが、作業実績に関してはNotionで分単位で管理してます

実際に努力の結果がデータとして確認することができるとモチベーションが上がるのでおすすめです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986704/38687afb-d566-1adf-aa4d-997b88276588.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986704/86f855c9-ffe1-cb7e-0058-375e973c75a5.png)


以上、「インフラ未経験がネットワークスペシャリストに合格するまでにしたこと」でした

最後まで読んでいただきありがとうございました！
「Viteより10倍速いTurbopack」より速いViteと最近の速度競争に思うこと

## さらに速くなったVite
Viteのコアチームメンバーの方のベンチマークによるとVite4.3（2023/04/11現在ではβステータス）パフォーマンス改善が行われてVite4.2と比較してコールドスタートが3倍以上、Vite4.3 + SWCの構成であればTurbopackよりもコールドスタートが速いという結果で出ているとのことです。

2023/04/24 追記：βステータス → 正式リリース （2023/04/24時点ではv4.3.1）

https://twitter.com/sapphi_red/status/1644647019661893633

詳細な条件はこちら。
https://gist.github.com/sapphi-red/db27f9c18ed31894e409224051119e1b

補足ですが、10倍速いという宣伝をしたVercelのTurbopackの比較は今回の比較のようにSWCプラグインを使用している訳ではなく（現在はフィードバックを受けてSWCの構成で比較しています）Viteのデフォルト構成になっています。また、Rspackのデータは出始めで問題があったのもあり少し古いデータです。今は改善されてもっと速いとのこと。

参考（Vercelのベンチマーク）
https://turbo.build/blog/turbopack-benchmarks#bench

## ゼロサムゲームではない
この件に関して最近Viteの開発者達は"not a zero-sum game"と言及しています。
今回の比較もあくまでVite4.2系とVite4.3系の比較であり、勝った負けたではなく他のライブラリは参考データとしての比較とのこと。共に改善していくことが重要なのだと仰っています。

また、Turbopackが「Viteより10倍速い」と宣伝した際にViteの作者であるEvan You氏はVercelの検証に関して、ユーザの体感に近いend-to-end HMRの速度での比較でない点や現実的でないシナリオ（30kのモジュール）であることなどを指摘しています。

https://github.com/yyx990803/vite-vs-next-turbo-hmr/discussions/8

単純に速いと言っても何を比較しているか、何を利用しているかといった条件が違えば速度が変わるのは当たり前です。しかしながら「TurbopackはViteよりx倍速い」、「今度はViteの方がTurbopackより速い」という風説のみが独り歩きしてしまいがちで、結果勝った負けたの話に終始しがちなところはあるかもしれません。

## 雑感
かつて私の企業ではCoffeeScriptを採用していました。現在のAltJS系の中で生き残っているのはTypeScriptであり、いわゆる勝ち馬（という表現は良くないですが）に乗れなかった結果として少なくない移行コストを支払うことになっています。

私もゼロサムゲームでない健全な競争の中で発展してほしいと願う一方、エコシステムの充実・サポート・移行コストなどを考えると企業としての技術スタックの採用は王道、つまり「勝った」技術を採用したくなります。その結果、盲目的に「x倍速い」といったニュースにのみ注目してしまうこともありました。

資金的な話もそうですが企業とOSSが健全な発展・関係性を築くためにはいくつかの現実的な壁があるように感じます。エンジニアとして冷静に情報を判断しつつ、リスペクトを持って互いに貢献していく姿勢が必要なのだと感じました。
インターネット攻撃の色々な種類

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回は具体的なインターネット攻撃の色々な種類について更に詳しく調べてみましょう！
![インスタスライド_2023031709.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/ed636d84-f093-093b-3ef9-096b332c663c.gif)

# 不正アクセス
- ネットワーク・スキャン
- ポート・スキャン
- パスワード・クラッキング
- ブルート・フォース・アタック
- バッファ・オーバーフロー
# 盗聴
・ソーシャル・エンジニアリングの手法
※システムではなく、人間の心理をついて不正を試みる手法

・サーバーでの盗聴

・ネットワークでの盗聴

# なりすまし
- IP Spoofing
- プロキシ・サーバーの利用
- ルーティング・テーブルの改ざん
# サービス妨害攻撃
サービス妨害攻撃：DoS（Denial of Service）

# コンピュータ・ウィルス
コンピュータ・ウィルスの定義

「第三者のプログラムやデータベースに対して意図的に何らかの被害を及ぼすように作られたプログラムであり、次の機能を1つ以上有するものを言う」
- 自己伝染機能
- 潜伏期能
- 発病機能

# まとめ
ー不正アクセス
ー盗聴
ーなりすまし
ーサービス妨害攻撃
ーコンピュータ・ウィルス
等がある

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
【2023年版】Firefoxのブックマークバーを複数行にする方法

※ 昔懐かし「Multirow Bookmarks Toolbar」を彷彿とさせますね！
※ 「Multirow Bookmarks Toolbar」は Firefox の仕様変更で動作しなくなって消えてしまいました・・・便利だったのに！

* 最新の Firefox をインストールします。
* Firefox のアドレスバーに「about:config」と入力してENTERを押します。以下の警告が出るので「危険を承知の上で使用する」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/684d1c68-572d-3ace-77c7-b0dc3a700a4b.png)

* 「設定名を検索」欄に「toolkit.legacyUserProfileCustomizations.stylesheets」と入力すると以下のように表示されるので「false」の部分をダブルクリックして「true」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/071e9aff-ebad-78ee-6639-3937995b6c9e.png)

* 別のタブでアドレスバーに「about:support」と入力してENTER。「プロファイルフォルダー」欄の「フォルダーを開く」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/e5517511-be9e-9c01-f4bd-3ed902b82c33.png)

* C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\XXXXXXXX.default-release みたいなフォルダがエクスプローラーで開きます。

* 上記フォルダーの下に新しく「chrome」というフォルダーを作成します。
* 上記「chrome」フォルダーを開いて、その中に「userChrome.css」という名前のテキストを作成します。(フォルダ内の空白部分を右クリックして、「新規作成」⇒「テキストドキュメント」とした後、名前を変更)
* 「userChrome.css」を右クリックして「編集」(Windows11の場合は、右クリックして「その他のオプションを表示」⇒「編集」)でメモ帳が開くので、以下のテキスト([出典](https://github.com/MrOtherGuy/firefox-csshacks/blob/master/chrome/multi-row_bookmarks.css))を入力して保存。

```css:userChrome.css
/* Source file https://github.com/MrOtherGuy/firefox-csshacks/tree/master/chrome/multi-row_bookmarks.css made available under Mozilla Public License v. 2.0
See the above repository for updates as well as full license text. */

/* Makes bookmarks toolbar span multiple rows */

#PersonalToolbar{
  --multirow-bmb-n-rows: 3; /* Control how many rows are shown before scrolling */
  --multirow-bmb-row-margin: 2px; /* Control how much spacing is between rows */
  max-height: none !important;
}

#PlacesToolbar > hbox:not(#PlacesToolbarDropIndicatorHolder){ 
  display: block;
  width: 100vw;
}

#PlacesToolbarItems{
  display: flex;
  flex-wrap: wrap;
  /* --uc-bm-padding is defined in autohide_bookmarks_toolbar.css */
  max-height: calc(var(--multirow-bmb-n-rows) * (4px + 1em + (2 * (var(--multirow-bmb-row-margin) + var(--uc-bm-padding,var(--bookmark-block-padding)))))) !important;
  overflow-y:auto;
  scrollbar-color: var(--lwt-accent-color) var(--toolbar-bgcolor);
  scrollbar-gutter: stable;
  scrollbar-width: thin;
}

/* Hide the all-bookmarks button */
#PlacesChevron{ display: none }

/* Add some spacing between rows */
#PlacesToolbarItems > .bookmark-item{
  margin: var(--multirow-bmb-row-margin) 3px !important;
  visibility: visible !important; /* Just in case they would be hidden for some reason */
}
```

* Firefox を再起動後、ブックマークバーが表示されてなければ「Ctrl-Shift-B」を押して表示します。
* ブックマークが少ない時は1行しか表示されませんが、ブックマークの数を増やして溢れさせればブックマークバーが2行、3行と下に広がります。また3行以上になった場合はスクロールバーが表示されてマウスのホイールでスクロールできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/863854ff-fedb-3f8e-ea0a-5569bdad2246.png)

## 最後に

「userChrome.css」内の以下の行の「3」を「5」に変えれば、ブックマークバーが5行まで表示されるようになります。
「userChrome.css」を変更して保存したら、Firefox を再起動すると変更が適用されます。

```
--multirow-bmb-n-rows: 3; /* Control how many rows are shown before scrolling */
```

----

お試しあれ！それでは！
Snowflakeのpythonワークシートでデータ生成してみた

# はじめに
先日SnowflakeのpythonワークシートがPublic Previewになりました。
ちょうどSnowflakeでテストデータを作成する必要があったので、良い機会だと思いpythonワークシートで簡単なテストデータを生成してみました。

# 概要
SnowflakeはSnowparkというフレームワークを提供しており、これを用いることでPythonなどのプログラミング言語を用いてデータを操作できます。
元々Snowparkを使うには自分で環境を構築する必要がありましたが、pythonワークシートがPublic PreviewになったことでSnowflakeのUI上からpythonコードを実行できるようになりました。

今回はそのpythonワークシートを用いて、機械学習の説明でよく見かけるような線型関数にノイズを加えた2次元データを生成します。

# 手順
まずSnowflake UI上のサイドメニューの`Billing & Terms`からAnacondaを有効化します。
そうすることでNumPyやPandasといったパッケージが利用できるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319284/98309ae8-2eb5-e70c-4618-c226e04040ac.png" width="50%">

pythonワークシートを開くとサンプルのコードがすでに記載してあり、そのコードを実行することで`packages`ビューから利用できるパッケージやバージョン一覧を取得することができます。
![スクリーンショット 2023-04-11 2.21.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319284/96a8f54f-5c0f-534c-01fe-eb66c2c019f1.png)


では本題ですが、今回テストデータを生成するために実行したコードは以下です。

```python:python worksheets
import snowflake.snowpark as snowpark
import numpy as np
import pandas as pd

def main(session: snowpark.Session): 
    X = np.arange(100).reshape(100, 1)
    Y = 2 * X + np.random.randint(0, 50, (100, 1))
    XY = np.concatenate([X, Y], axis=1)
    pd_df = pd.DataFrame(XY, columns=['x', 'y'])
    df = session.create_dataframe(pd_df)
    df.write.mode("overwrite").save_as_table("tbl")

    return df
```

# 解説
pythonやSnowparkが分かる方であれば何をしているか分かると思いますが、main関数内でやっていることを説明します。

- まずデータを操作するにはSnowflakeデータベースとのセッションを確立する必要があるので、snowparkのSessionクラスを引数として与える
- `X`には0~99の値を持つ1×100の2次元配列を入れる
- `Y`には`X`を2倍し、0~49のランダムな数値を加算した1×100の2次元配列を入れる
- `X`と`Y`を横に結合し、一度PandasのDataFrameに変換してからSnowparkのDataFrameを作成する（ndarrayからはSnowparkのDataFrameを直接作成できないため）
- 最後に`save_as_table`メソッドを使って、`tbl`という名前のテーブルにデータを書き込む

（参考）
https://docs.snowflake.com/ja/developer-guide/snowpark/python/working-with-dataframes

# 実行結果
実行すると、無事データが作成されました。
![スクリーンショット 2023-04-11 2.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319284/29fcf5eb-8256-70ed-4cf5-2c9129698c3e.png)

グラフで見てみると、想定通り線型関数にノイズが加えられたようなデータを生成できていることが分かります。
![スクリーンショット 2023-04-11 2.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319284/3d05fd58-1355-1cfb-dfa3-191cddce3fbb.png)

# まとめ
今回は簡単なデータ生成をしてみましたが、プログラミング言語を用いることで柔軟なデータ操作ができると思うので、ぜひpythonワークシートを活用してみてください！