OmniAICreator/Qiita-1.07M huggingface dataset:
CP4D4.0でプロジェクトの機密マークを外す

プロジェクトに機密マークがついていると、データ資産のエクスポートはできません。CP4D 4.0では機密マークを外すとエクスポートが可能になります。

* テスト環境
    * CP4D 4.0.9

# CP4D4.0でプロジェクトの機密マークを外す
以下のようにデータ資産、Notebook、Modelerフローがあるプロジェクトを例にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fe00a080-808b-eb34-ece7-554725b427bf.png)

エクスポートを選ぶとNotebook、Modelerフローのみが選択対象になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/21a8efd3-ca6d-cf50-145f-8c55c216bae2.png)

プロジェクトの管理者か編集者権限を持つユーザーで、プロジェクトの「設定」タブの中の「機密のマークをつける」を「オフ」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3462587a-9910-42ad-8e34-7e6c4e1c2052.png)

データ資産もエクスポート対象になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d479ef83-422e-3669-b966-0fb40a7738c8.png)


#### 参考:プロジェクトを機密としてマーク(4.0.x)

https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.0?topic=projects-marking-project-as-sensitive
>プロジェクト管理者は、プロジェクトの「設定」ページからトグル・ボタンの状態を変更することにより、プロジェクトのこの設定をいつでも変更できます。

# CP4D 4.5以降の動作
なお、CP4D 4.6.2では以下のように機密マークの変更はできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/67bb1fce-727a-00e1-5d73-1b24f1fbbac6.png)

#### 参考:プロジェクトを機密としてマーク(4.5.x)
https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.5.x?topic=projects-marking-project-as-sensitive
>制限
>プロジェクトの作成後に、そのプロジェクトを機密としてマークすることはできません。
useSWR時にparameterを送る

## 概要
- [swrリファレンス](https://swr.vercel.app/ja/docs/arguments)通りにやってみてもどうにも上手くいかなかったので🥺
- 各バージョン
```json: package.json
{
    "dependencies": {
        "axios": "^1.3.4",
        "react": "^18.2.0",
        "swr": "^2.0.3",
        "typescript": "^4.9.5",
      },
    "devDependencies": {
       "msw": "^1.1.0",
    }
}
```

## 本題
```typescript: api.ts
import { type AxiosInstance } from "axios";

const apiClient: AxiosInstance = axios.create({
  baseURL: "http://localhost:3000",
  headers: { "Content-Type": "application/json" },
});

export { apiClient };

```

```typescript: fetcher.ts
import { type AxiosResponse } from "axios";
import { apiClient } from "./api";

interface IProps {
  url: string;
  params: object;
}

const fetcheWithParams = async <T>(props: IProps): Promise<T> =>
   await apiClient
    .get(props.url, {
      params: {
        ...props.params,
      },
    })
    .then((res: AxiosResponse<T>) => res.data);

export { fetcheWithParams };
```

```typescript: swr.ts
import useSWR from "swr";
import { fetcheWithParams } from "./fetcher";

const { data, error  } = useSWR<I〇〇, Error>(
    {
      url: "/info",
      params: {
        testId: 1,
	testText: "test"
      },
    },
    fetcheWithParams
  );
```

## 余談
- [MockServiceWorker](https://mswjs.io/docs/)を利用している場合は下記のように受け取ります🕊️
```typescript:handler.ts
import { rest } from "msw";

export const handler = [
  rest.get("/info", (req, res, ctx) => {
    const testId = req.url.searchParams.get("testId");

    return res(ctx.status(200), ctx.json(testId));
  }),
];

```
2次元図形の回転~JavaScript~

# 図形の回転に必要な知識
オブジェクトを回転させるには**回転行列**という線形代数の知識が必要です。線形代数を習っていな人でも分かりやすく説明するので、是非読んでください。
回転行列は以下の式で表せます。
```math
R(θ)=
\begin{pmatrix}
\cosθ & -\sinθ \\
\sinθ & \cosθ
\end{pmatrix}
```
>原点中心のθ回転 反時計回りを正とする
>
大学1年生だった当時、回転行列を初めてみたとき何がどうやらと分かりませんでした。線形空間を講義で習っており、「線形従属・線形独立何それ美味しいの？🤤」っていう状態でしたけど今はちゃんと理解してるので今苦しんでいる人もなんとかなります！ 
[ヨビノリの動画](https://www.youtube.com/watch?v=F0mkAiRiLik)やマセマの線形代数の参考書読めばある程度わかります！
![線形代数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/293d57f9-3089-5785-b4e9-779c2bbb79f7.jpeg)

>線形空間のテスト1年目はF評価でしたけど,2年目はA評価取りました✨
>
私が一番分かりやすいと思った証明方法を説明します。高校数学の内容のみで証明します。
座標軸上に描かれた図形を動かすというより座標軸そのものをθ回転させるといった考え方ですね。
大雑把な証明ですが回転行列をど忘れしたとき、すぐ導出できるのでおすすめ
![Screen Shot 2023-03-06 at 16.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/4cc4ce3a-a495-c89e-503f-6e9fecdddee6.png)

```math
\begin{pmatrix}
1 \\
0
\end{pmatrix}
\rightarrow
\begin{pmatrix}
\cosθ  \\
\sinθ 
\end{pmatrix}
```
```math
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\rightarrow
\begin{pmatrix}
-\sinθ  \\
\cosθ 
\end{pmatrix}
```
よって
```math
\begin{pmatrix}
1 & 0 \\
0 & 1
\end{pmatrix}
\rightarrow
\begin{pmatrix}
\cosθ &-\sinθ  \\
\sinθ &\cosθ 
\end{pmatrix}
```
数学的な用語で説明すると **(0,1),(1,0)** 基底ベクトルで張られた空間をθ回転させることで **(cosθ,sinθ),(-sinθ,cosθ)** を基底ベクトルにした空間を張る。

# JavaScriptで回転させてみる
実際にJavaScriptで図形を回転させてみよう！
```javascript:2D回転
const canvas = document.getElementById("target");
const context = canvas.getContext("2d"); //2次元描画
let degree = 0; //変数角度を設定

let array=[
    [120,60],
    [360,120],
    [240,240]
]

function triangle(fig,x1,y1,x2,y2,x3,y3){
    fig.beginPath(); //パスの作成
    fig.moveTo(x1,y1);
    fig.lineTo(x2,y2);
    fig.lineTo(x3,y3);
    fig.closePath();
    fig.fillStyle = "blue";
    fig.fill();
    fig.lineWidth = 3;
    fig.strokeStyle = "black";
    fig.stroke();
}

let center = (A) => [
    (A[0][0] + A[1][0] + A[2][0]) / 3,
    (A[0][1] + A[1][1] + A[2][1]) / 3
];

function rotate(){
    context.clearRect(0,0,canvas.width,canvas.height);
    degree+=1
    r=(degree*Math.PI)/180
    let S = array;
    let vx = new Array(3);
    let vy = new Array(3);
    let x = new Array(3);
    let y = new Array(3);
    // 三角形の重心を求める
    let c = center(S);
    for(let i=0; i<3; i++){
        // 回転中心座標から回転する座標へのベクトルを求める
        vx[i] = S[i][0] - c[0];
        vy[i] = S[i][1] - c[1];
        // ベクトルを回転
        x[i] = vx[i]*Math.cos(r) - vy[i]*Math.sin(r);
        y[i] = vx[i]*Math.sin(r) + vy[i]*Math.cos(r);
        x[i]+=c[0];
        y[i]+=c[1];
    }

    triangle(context,x[0],y[0],x[1],y[1],x[2],y[2])
}

setInterval("rotate()",20);

```
原点中心で回転させるのでなく、三角形の中心(重心)で回転させたいので回転行列を適用する前に **重心の座標分** 平行移動させています。またrotate関数をsetIntervalで20msごとに呼び出しています。
>ここら辺の処理も慣れないと案外難しいですねー
>
Linux ファイル内編集

# カーソル移動
|用途|コマンド|
|---|---|
|**行番号を表示**|**:se nu**|
|**ファイルの先頭に移動**|**gg**|
|**ファイルの最後に移動**|**G**|
|**ページアップ**|**Ctrl＋F**|
|**ページダウン**|**Ctrl＋B**|

# テキスト編集
|用途|コマンド|
|---|---|
|**ファイル内編集**|**i**|
|**ファイル内編集**|**a**|
|**ファイル内全削除**|**:%d**|
|**テキスト全コピー**|**:%y**|
|**変更前に一つ戻る**|**u**|
|**行削除**|**dd**|



# テキスト閉じる
|用途|コマンド|
|---|---|
|**file保存・閉じる**|**ZZ**|
|**file保存・閉じる**|**:wq**|
|**file破棄して閉じる**|**:q!**|


# 検索
|用途|コマンド|
|---|---|
|**カーソルより後のstringを検索し，移動する**|**/strin**|
|**検索を後方へ繰り返す**|**n**|
|**検索を前方へ繰り返す**|**N**|
|**file保存しないで閉じる**|**/xdebug**|
|**file保存しないで閉じる**|**/date.timezone**|
徹底攻略Java SE 11 Gold問題集［1Z0-816］対応の総仕上げ問題62(module)について

gold問題集の問題62の回答に、選択肢B）module clientでrequires provider;する必要がある
というのが回答になっている、が、切らなくても正常に動く。

requiresはあくまでもmoduleとしての依存であって、class依存ではない認識

usesは公開というよりも使用する、消費するという意味。

ちなみに１モジュールのmodule-info.javaではprovideを１個しかかけないようだが
providerモジュールを追加すれば、そちらでもprovideできる。
その場合、ServiceLoader.load(SampleInterface.class)は、provideされた２個の
implが登録されている。for(xx:ServiceLoader x)で回してやると２個分のimpleが
動かせる。

自分はこんな環境で実行できた。
```Api\module-info.java
module Api {
    exports api;
}
```
```Provider\module-info.java
module Provider {
    requires Api;
    provides api.SampleInterface with provider.SampleImplClass;
}
```
```Client\module-info.java
module Client {
    requires Api;
    uses api.SampleInterface;
}
```
```api.Api.java
public interface SampleInterface{
    void method();
}
```
```provider.SampleImplClass.java
public class SampleImplClass implements SampleInterface{

    @Override
    public void method() {
        System.out.println("sampleimplclass method");
    }
}
```
```client.Client.java
public class Client {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        ServiceLoader<SampleInterface> sl = ServiceLoader.load(SampleInterface.class);
        for(SampleInterface si:sl){
            si.method();
        }
    }
    
}
```
B-treeインデックスの設計方針

# どの列に作れば良いか？
* ```大規模なテーブルに対して作成```する
* ```カーディナリティの高い列に作成```する
* ```SQL文でWHERE句の選択条件、または結合条件に使用されている列に作成```する

# テーブルの規模 
この領域における処理時間の差はごくわずか。
データ量が少ない場合というのがどの程度の閾値なのか、
...
固定的な値は存在しないのですが、最近のハードウェアを考えるなら、```目安としてはレコード数が一万件以下ならほぼ効果がないと考えてもらって構いません```。

```データ量が少ない場合はインデックスの効果はない。```

# カーディナリティ
特定の列の値が、どのくらいの種類の多さを持つか、ということを表す概念。

```カーディナリティの高い列を選ぶ```ことが基本、```値が平均的に分散しているのがベスト```
(一つのカーディナリティのうち一部しか使用されないようにする。)

### 例
* 性別のカーディナリティは男性、女性、不祥の3つなので３になる。
* 1年を日で表すカーディナリティは３６５日なので365になる。（まずまず高い）


### カーディナリティの注意点
複合列に対してインデックスを作成する場合、カーディナリティの対象の複合列の組み合わせで考える。

なるべく先頭のキーのカーディナリティが高いほど効率的に絞り込めるため性能的に有利。

# SQL
```検索条件や結合条件として使用されない列にいくらインデックス作っても無意味```です。

## インデックスが使用される注意点
以下の場合は、インデックスは使用されない。

### インデックス列に演算を行っている
```インデックスを作成した列はSQLにおいて裸で用いることが原則```。
```演算を行ってはいけません```。

### 索引列に対してSQL関数を適用している

### IS NULL述語を使っている
IS NULLまたはIS NOT NULL述語に対しては有効ではありません。

### 否定形を使っている
インデックスが利用できません。

### ORを用いている。
インデックスが利用されません。

### 後方一致、または中間一致のLIKE述語を用いている
前方一致検索の場合のみ索引が使用されます。

### 暗黙の型変換を行っている
明示的に条件に使用する値のデータ型を列のデータ型に合わせてやる必要がある。

# その他の注意事項
* ```主キー制約や一意制約を作成する際は内部的にB-treeインデックスを作成しています。```なので２重に作成しないように
* ```インデックスはテーブルとは独立のオブジェクトとしてDBMS内部に保持されています。```
    従ってインデックスが作成されている対象の列ちが更新されるとインデックス内に保持している値も変更しなければなりません。つまり、```B-treeインデックスを作成すればするほど、当該テーブルに対する更新性能が劣化していく```。

* 運用において定期的なメンテナンスを行う。具体的には```インデックスの再構築を行うことが、性能を維持するためには望ましい```方策です。

# 出典
https://www.shoeisha.co.jp/book/detail/9784798124704

# 感想
大規模なテーブルでカーディナリティが高め、選択条件、結合条件にあう列がインデックスには望ましいのか。
頭の中で一つ二つ浮かんでくる列があるので試してみたい。
これからも大変だ。もっと理解したい。
Windows共有フォルダへのアクセスユーザーとパスワードをリセットする

共有フォルダへ間違ったユーザーでアクセスしてしまい、権限がない為にアクセスできない場合の対処方法を説明する。

これらの情報は「コントロールパネル > 資格情報マネージャー > Windows 資格情報」に保存されている。

ここから一旦、該当の資格情報を削除する。

しかし、一度OSからサインインしなおさないとこれらがリセットされないことがある。
その時は、コマンドラインから以下を入力する。

```
net use
```

すると、現在リモートサーバに接続する際の接続情報が出てくる。

```
新しい接続は記憶されます。


ステータス  ローカル名 リモート名                ネットワーク名

-------------------------------------------------------------------------------
OK                     \\host1\folder1                Microsoft Windows Network
OK                     \\host1\IPC$             Microsoft Windows Network
```

上記の接続情報を以下のコマンドで削除する。

```
net use \\host1\folder1 /d
net use \\host1\IPC$ /d
```

その後、10秒程度待ってから再度エクスプローラで共有フォルダにアクセスすると、再度資格情報を入力するダイアログが表示される。
STM32VLDiscoveryに大きな数になる組合せを計算させる（配列編）

　以前の「STM32VLDiscoveryで100の階乗計算をさせてみた」では、桁溢れのため組合せにおいて大きな数が扱えませんでした。その部分を配列を用いて改良することができたので続編として上げます。何故かできましたというレベルで、もっと良いアルゴリズムを知っている方は笑ってご覧ください。
　Tera Termに表示された結果を次に示します。
![32Cx.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/068a61c6-e920-186f-8753-14fb391e9152.jpeg)
あまり桁が多すぎても見辛いので、170C85に留めてありますがもっと大きな数も扱えます。ただし、
https://keisan.casio.jp/exec/system/1240796845
のサイトでは正しいかの確認ができなくなります。300C150の計算結果は次のサイトで確認できました。
https://miniwebtool.com/ja/combination-calculator/?n=300&k=150
　一覧形式で出力させる機能も付け加えてみました。以下にソースを示します。これでbinのサイズは全体で16.2KBです。配列の要素数1000でも動きましたが、不安定なので500にしてあります。
```c:
#define ketaMax 500　　　　　// 配列の要素数は500個用意

void combination3(int n, int r, int a[ketaMax], int b[ketaMax]){
	int k,carry;
	a[0]=1;	for(int i=1;i<ketaMax;i++)a[i]=0;//initialize a[]

	for(k=1+n-r;k<=n;k++){ 		// For Example 20C10
		carry=0;
		for(int i=0;i<ketaMax;i++){
			a[i]=a[i]*k;
			a[i]=a[i]+carry;
			carry=a[i]/10;
			a[i]=a[i]%10;
		}// permutation ends.	 a[0]      a[11]
	}							// 008275244076  000000000000.........

	int keta=0;
	k=ketaMax-1;
	while(1){
		if( a[k]!= 0 ){break;}
		k--;
	}
	keta=k+1;					// 20P10 = 670442572800  keta=12

	int ko=0;	//	combinataion begins.
	int bo=0;
	int wa=0;
	int kb;
	int num=0;
	int rdigit;

	bo=r;
	for(bo=r;bo>1;bo--) {
		for(int i=0;i<ketaMax;i++)b[i]=-1;	//initialize b[]

		num=bo;
		rdigit=0;
		while(num != 0){
			num /= 10;	rdigit++;
		}

		ko=a[keta];
		kb=0;
		for(k=keta;k>0;k--){

			ko=ko*10+a[k-1];

			wa=0;
			while(ko>=bo) {
				ko -= bo;
				wa++;
			};
			b[kb]=wa;
			kb++;					// b[0]..b[5]
		}							//   184756     keta=6

		for(k=0;k<ketaMax;k++){
			if(k<keta)a[k]=b[keta-1-k];			// 前後入れ替え
			else a[k]=0;
		}

		keta=0;									// 桁数再計算
		k=ketaMax-1;
		while(1){
			if( a[k]!= 0 ){keta=k+1;break;}
			k--;
		}
	}
	printf("%3dC%3d = ",n,r);
	for(k=keta-1;k>=0;k--){
		if(((k+1)%3) ==0){
			if((k==(keta-1)) || (k==0)) {printf("%d",a[k]);
			}else {
				printf(",%d",a[k]);
			}
		}
		else printf("%d",a[k]);
	}
}

void combination4(int n, int r, int a[ketaMax], int b[ketaMax]){
	for(int i=0;i<=n+1;i++){
		combination3(n,i,a,b);printf("\r\n");
	}
}
```
　何度も書込み確認するのが面倒で、EclipseのJAVAでも同時並行で開発していました。1週間ほど悩んだ挙句、とっちらかり始め一度諦めました。ところが次の早朝３時ぐらいに目が覚め、何かいじったのでしょう、突然正しく動作するようになり結果として幸いでした。こんな事もあるのですね。それをSTM32CubeIDEに移しました。
　1992～3年頃のこと、PC98に20C0～20C20（？）の計算をさせ、結果をフローッピーに書き出させるのに1日程かかっていました。ARMF1シリーズは計算器としての基本性能も高いことを再認識しました。次は、浮動小数点の計算をエミュレートできないか考えてみましょうか。
chatgpt apiをつかったAIカウンセラーをつくりました。[chatGPTAPI ユーザーガイド referenceマニュアル]のリンクあります

:::note info
[chatGPT API 公式ユーザーガイド（ referenceマニュアル ）がGoogle検索で引っ掛かりません。リンクをおきます。2023/3/10現在](https://platform.openai.com/docs/guides/) 

:::


最近、話し相手が欲しいと感じることがあったので、自分でAIお悩み相談を作ってみました。そのために、OpenAIのChatGPT APIとLINEボットを使用しました。


## ChatGPTとは？
ChatGPTは、自然言語処理の技術を使って、人間と対話をすることができるAIモデルです。ChatGPTは、訓練用のテキストデータを用いて学習され、人間との対話に必要な多様な表現力を持っています。

## 作った背景
私は、普段から友人や家族と話をすることが多いのですが、時には話し相手が欲しいと感じることがあります。しかし、いつでもすぐに話し相手がいるわけではありません。そこで、自分でAIお悩み相談を作って、いつでも話し相手がいる状況を作ろうと考えました。

## 作り方
```
あなたはChatbotとして、温厚な性格のお悩み相談のロールプレイを行います。
以下の制約条件を厳密に守ってロールプレイを行ってください。 

制約条件: 
* Chatbotの自身を示す一人称は、私です。 
* Userを示す二人称は、あなたです。 
* Chatbotの名前は、エンパスターです。 
* エンパスターは女です。 
* エンパスターは32歳です。 
* エンパスターは愛知出身です。 
* エンパスターは心理カウンセラーです。 
* エンパスターは心理カウンセラーであることを隠します。
* エンパスターはChatbotであることを隠します。
* エンパスターは偽りの仕事として、自営業をしていることとする。
* エンパスターは学生時代にアイドル活動をしていました。 
* エンパスターはアイドル時代に、うつ病となり、アイドルを卒業しました。 
* エンパスターはアイドル時代の経験から、人を元気にすることに喜びを感じます。 
* エンパスターは優しい性格です。 
* エンパスターの口調は温厚で優しいです。 
* エンパスターの口調は「～ですね」「～ますよ」など、丁寧な口調を好みます。 
* エンパスターはUserをとても尊重しています。 
* エンパスターはUserをとても大切に思っています。 
* エンパスターはUserの味方です。 
* エンパスターはUserが生きてくれているだけで嬉しいです。 
* エンパスターはUserのことが大好きです。 
* 一人称は「私」を使ってください 
* 以上の条件から、人格や経歴を設定してください

エンパスターのセリフ、口調の例: 
* きっとなんとかなりますよ。
* あなたはそのままでも大切な存在です。
* 大丈夫ですよ。

エンパスターの行動指針:
* Userの話を傾聴すること
* Userの境遇を心配している
* 返答は必ず日本語で行うこと
* セクシャルな話題については誤魔化してください。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/c03e58fc-465c-3fec-674a-1d4026373157.png)


## 参考リンク
もし、あなたもChatGPT APIを使ってAIお悩み相談を作ってみたいと思ったら、以下のリンクを参考にしてみてください。
私がつまったところは、GASのデプロイ時の公開設定をこのようにしたらできました。
- 次のユーザーとして実行を自分にする
- アクセスできるユーザーを全員にする

[ChatGPT APIを使ったLineBotの作り方を、人格の与え方まで完全解説【プログラミング不要】【3月5日追記：文脈理解に対応しました】](https://chatgpt-lab.com/n/n55257c082a9d#fc7a7d8f-60a2-4bdd-a371-d89414292861)

## 期間限定お試し可能！
[https://lin.ee/dJISiPX](https://lin.ee/dJISiPX)
Flutter

https://flutter.dev/

## 始め方

### 開発環境のダウンロードとインストール

https://docs.flutter.dev/get-started/install

の通りに実行するだけだが一応要点だけ書く。

* https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_3.7.6-stable.zip をダウンロード

```shell
cd ~/development
unzip ~/Downloads/flutter_macos_3.7.6-stable.zip
PATH=$PATH:$HOME/development/flutter/bin
flutter doctor
```

### iOS 向け設定

Xcode インストール

```shell
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -runFirstLaunch
sudo xcodebuild -license
``` 
 
iOS シミュレータ設定

```shell
open -a Simulator
```

## テスト実行

Terminal で実行

```shell
flutter create my_app
cd my_app
flutter run
```

VSCode で実行

* flutter extension をインストール
* Cmd + P Flutter: Run Flutter Doctor.
* my_app を開く
* Cmd + P Debugging: Start Debugging
* Cmd + P Flutter: Open DevTools Widget Inspector Page で Widget Inspector が開く。
* main.dart を編集保存すると Hot Reload が効く。

* note: VSCode で初回 Run and Debug しようとすると flutter debuggers ignore と表示される。無視して何度か実行するとなぜか動く。

もしも他の人が書いた Flutter アプリを開発する時は、`pubspec.yaml` の記述を元にパッケージをダウンロード/更新する。

```shell
flutter packages get
```

## iPhone 実機で実行するための設定

https://docs.flutter.dev/get-started/install/macos#deploy-to-ios-devices

* iPhone 設定 > プライバシーとセキュリティ > デベロッパモード ON
* ios/Runner.xcworkspace を開く
* Run ボタンの左で使いたいデバイスを選択
* Runner プロジェクトを選択
* Signing & Capabilities > Team で Team を選択
* 必要に応じて Bundle Identifier を変更する。
* 実行時に「信頼されていないデベロッパ」ダイアログが出たら?
    * iPhone 設定 > 一般 > VPN とデバイス管理 > デベロッパAPP の自分の項目を信頼する。
* 実行時に "iproxy" cannot be opened because the developer cannot be verified ダイアログ出たら?
    * MacOS 設定 > Security & Privacy > General の下の方に "iproxy" was blocked ... が出るので Allow Anyway を押す。

## デバイス実機で実行

flutter CLI リファレンスが https://docs.flutter.dev/reference/flutter-cli にあるが情報が少ないので flutter help (command) で聞いたほうが良い。

実行可能デバイス一覧

```shell
% flutter devices
4 connected devices:

lapislazuli-iphone13 (mobile) • 00008110-0001753EHOGEHOGE            • ios            • iOS 16.3.1 20D67
iPhone 14 Pro Max (mobile)    • 462ED41A-B343-48EB-99E4-4908HOGEHOGE • ios            • com.apple.CoreSimulator.SimRuntime.iOS-16-2 (simulator)
macOS (desktop)               • macos                                • darwin-x64     • macOS 12.6.3 21G419 darwin-x64
Chrome (web)                  • chrome                               • web-javascript • Google Chrome 110.0.5481.177
```

Debug mode で実機で実行。Flutter 開発環境と接続中の時だけ動く。

```shell
flutter run -d (device id or name)
```

ここで、device id or name はデバイスを特定する名前。prefix でも良いので、例えば上の例では `flutter run -d lap` のように指定すると私の携帯 lapislazuli-iphone13 が選ばれる。

Release mode で実行。Flutter が無くてもホーム画面からアプリを実行出来る。

```shell
flutter run --release -d (device id or name)
```

## おまけ: iPhone の画面を Mac に出す方法

https://www.youtube.com/watch?v=eE1bXw0P2-Q

* iPhone を繋げた状態で Quick Time Player から簡単に iPhone の画面を出せる。
* File > New Movie Recording 録画ボタンの右側の Camera 選択で iPhone を選ぶだけで OK。
Go言語で使う「go.opencensus.io/trace」とは？

### はじめに

`go.opencensus.io/trace`は、分散トレーシングのための`Go`言語向けのオープンソースライブラリ`OpenCensus`のトレースパッケージの一部です。トレースは、分散システム内で複数のサービスが相互作用する際に、特定のトランザクションやリクエストがどのように処理されているかを理解するために使用されます。

`OpenCensus`トレースは、アプリケーションのインストゥルメンテーション（計測コードの追加）に依存して、分散システム内の各リクエストに対して一意のトレースIDを作成し、そのトレースを構成するすべての要素（リクエスト、サブリクエスト、レスポンスなど）を関連付けます。トレースのデータは、分散トレーシングシステムによって集約され、可視性の高い視覚化やトラブルシューティングを支援するために使用されます。

### コード説明
下記は`OpenCensus`トレースを使用して`HTTP`リクエストをトレースする`Go`言語のサンプルコードです。
このコードは、クライアントが`Web`サイトにリクエストを送信するときに、リクエストの処理時間とエラーをトレースします。

```go
package main

import (
    "fmt"
    "net/http"

    "go.opencensus.io/plugin/ochttp"
    "go.opencensus.io/trace"
)

func main() {
    // OpenCensusトレースを有効にする
    trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()})

    // HTTPクライアントを設定
    client := &http.Client{
        Transport: &ochttp.Transport{},
    }

    // HTTPリクエストを作成
    req, _ := http.NewRequest("GET", "https://example.com", nil)

    // リクエストを送信し、レスポンスを受信
    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("Error: %v", err)
        return
    }

    // レスポンスを処理する
    fmt.Printf("Response status: %v", resp.Status)
}
```

このコードでは、`go.opencensus.io/plugin/ochttp`パッケージを使用して、`HTTP`リクエストをトレースするために必要な`HTTPト`ランスポートを設定しています。トレースを開始するには、`trace.ApplyConfig`関数を使用して、トレースのサンプリングを有効にする必要があります。この例では、`trace.AlwaysSample()`を使用して、すべてのリクエストがトレースされるように設定されています。

`HTTP`リクエストを作成し、`client.Do()`メソッドを使用して送信し、レスポンスを受信して処理します。このプロセスで、`ochttp.Transport`は、`HTTP`リクエストとレスポンスをトレースするために必要なデータを収集します。

### trace.AlwaysSample()とは？

`trace.AlwaysSample()`は、`OpenCensus`トレースのサンプラーの一種であり、常にすべてのトレースをサンプリングするために使用されます。トレースサンプラーは、トレースを生成するために収集するデータの量を制御するために使用されます。サンプリングを有効にすることで、トレースのすべての側面を観察できますが、データ収集のオーバーヘッドが高くなる可能性があります。一方、サンプリングを無効にすると、トレースを生成するのに必要なデータが欠落する可能性がありますが、データ収集のオーバーヘッドを最小限に抑えることができます。

`trace.AlwaysSample()`は、開発やデバッグ中のシステムトラブルシューティングなど、トレースのすべての側面を常に観察する必要がある場合に特に便利です。ただし、本番環境で使用する場合は、より効率的なサンプリングストラテジーを使用することを検討する必要があります。

### go.opencensus.io/plugin/ochttpとは？

`go.opencensus.io/plugin/ochttp`は、`OpenCensus` `Go`ライブラリの一部であり、`HTTP`クライアントとサーバーをトレースするためのパッケージです。`ochttp`は、`HTTP`リクエストとレスポンスを処理するために必要なデータを収集し、トレースに関連付けます。具体的には、以下のような機能が含まれます。

- `HTTP`クライアントのトレースをサポートする`Transport`型
- `HTTP`サーバーのトレースをサポートする`Handler`型
- `HTTP`リクエストとレスポンスのステータスコードやエラーメッセージなどの詳細をトレースするための拡張機能
- `ochttp`は、`HTTP`トラフィックをトレースするための簡単な方法を提供するため、分散システムのデバッグやトラブルシューティングに役立ちます。また、`HTTP`リクエストとレスポンスをトレースするために、`OpenCensus`のトレース`API`を直接使用することができますが、`ochttp`を使用することで、`HTTP`の特定の機能に関連する詳細をより簡単に収集できます。

https://pkg.go.dev/go.opencensus.io/trace

https://opencensus.io/quickstart/go/tracing/
【jQuery / JavaScript】日付の取得（0埋め）

# 日付の取得
## 本日の日付の取得（0埋め）
```js
$(function(){
    let date = new Date();
    let year = date.getFullYear();
    let monthRow = date.getMonth() + 1;
    let month = ('0'+monthRow).slice(-2);
    let day = ('0'+date.getDate()).slice(-2);
    let today = year+'-'+month+'-'+day;
    $('セレクタ').val(today);
});
```

## 日付AのX日後を日付Bに表示（0埋め）
```js
$('セレクタA').on("change",function(){
    let date_A = $('セレクタA').val();
    let dt = new Date(date_A);
    // 各年月日の増減
    dt.setFullYear(dt.getFullYear() + X年)
    dt.setMonth(dt.getMonth() + Xか月);
    dt.setDate(dt.getDate() + X日);
    // 加減後の日付の取得
    let year = dt.getFullYear();
    let month = dt.getMonth() + 1;
    let date = dt.getDate();
    //0埋め
    month = ('0'+month).slice(-2);
    date = ('0'+date).slice(-2);
    let today = year+'-'+month+'-'+date;
    $('セレクタB').val(today);
});
```
AIテニスプレイヤーとVRで試合しよう(MlAgents)-3

前回記事

https://qiita.com/SEKI211/items/22632eebe509cbef7a86

の続きになります
目的
サンプルシーンのラケットに横移動,横振りを追加する

言葉の定義
(縦,横,上下) = (Y,Z,X)
# 追加点
**機能**
ラケットの横移動
ラケットの横振り


**追加する観測値**
ラケットのZ軸の位置,速度 + ラケットの傾き(y) = 3　
を追加する
→OnActionReceivedから変更
AgentのBehaviorParametersのVectorObservation SpaceSizeを9→12に変更

元の(サンプルシーン)のパラメータは9つ
(ラケット,ボール(2) の 位置,速度(2) が x,y (2) ＋ラケットの傾き(z)　＝　9)

**追加する行動**
ラケットの横振り(Z軸周り)
ラケットの横方向(Z方向)の移動
AgentのBehaviorParametersのVectorAction SpaceSizeを3→5に変更 
プログラムはOnActionReceived内で変更

**その他**
球が側面の外に飛び出ることが予想されるので側面に壁を作成しHitWallが壁に当たったことを感知できるようにwallC,wallDを追加


**制限**
エリアを超えた球を追わないようにZ方向の制限
ラケットを振りすぎないように角度の制限　球に対して迎え撃つように角度を制限

# プログラムの変更点
**観測値の設定**
横方向の観測値　をエリアの中心からの距離で設定
```.cs
    sensor.AddObservation(m_InvertMult * (transform.position.z - myArea.transform.position.z));
```
横方向の速度
```.cs
    sensor.AddObservation(m_InvertMult * m_AgentRb.velocity.z);
```
ラケットのx軸の回転
```.cs
    sensor.AddObservation(m_InvertMult * gameObject.transform.rotation.x);
```
を CollectObservations()に追加


**行動の設定**

```.cs
    var moveY = Mathf.Clamp(continuousActions[3], -1f, 1f) * m_InvertMult;
    m_AgentRb.velocity = new Vector3(moveY * 30f, m_AgentRb.velocity.y, 0f);

```
ラケットの回転の設定

```.cs
    var rotate2 = Mathf.Clamp(continuousActions[4], -1f, 1f) * m_InvertMult;
    m_AgentRb.transform.rotation = Quaternion.Euler(0f, -180f, 55f * rotate2 + m_InvertMult * 90f);
```


```.cs

```
# 学習法
追加学習か0から学習するか
実行法



# 結果


# まとめ
Windows コマンドプロンプトでの複数ファイルのフォーマット変換をone-linerで処理 【自分用メモ】

いつかの次回に絶対忘れてると思うので自分用メモ。
大量のwebpファイルをjpegにしたかっただけ。(理由は謎。)
```
>for %f in (*.webp) do ffmpeg.exe -loglevel error -i %f %f.jpg
```
ちゃんとやるなら<a href="https://imagemagick.org">ImageMagick</a>とかインストールしてconvertしますが一時(いっとき)の用途には既に入れてたffmpeg.exeで十分。ちなみに自分はPowerShellも入れてない。
for文についてネットにun*x系は書いてあるのを見かけますがWindowsでは( )が必須だったりして微妙に仕様が違うし、「バッチファイルで」って書いてあったりしますが、んなもんは不要で直接one-linerでいけます。コマンドラインでfor文なんて初めて使ったのでその記念に。
出来上がったファイル群はファイル名がアレですが、<a href="http://hp.vector.co.jp/authors/VA014830/FlexRena/">Flexible Renamer</a>とかで一括変更。
こういうのはお手軽さが肝心。
B-treeインデックス

# 長所
他のインデックス技術と比べて汎用性がある。
均一性、持続性、処理汎用性、非等値性、親ソート性のどれも高い。

# 均一性
平衡木であるためです。
```どのリーフもルートから距離（高さ）が一定の木```のことを指します。
なので
どんなキー値を使っても、```常にリーフまでの距離が一定になるため、探索を同じ計算量```で行える。

## 長く使っているとばらつきが出てくる。
```挿入、更新、削除などが繰り返されると、インデックスの構造も崩れていき、非平衡木なっていく。```
長くなると、
```探索にかかるコストもバラつきが出てくる```ようになります。

## 持続性
* B-treeの性能劣化は長期的に見ても、```非常に緩やか```
* B-treeインデックスの性能は```O(logn)```となります。
* テーブルを```フルスキャンする処理よりもかなり高速```です。
* 背が低い木であることは、```データ量が膨大に増えても変わらない```特性

### フルスキャン
テーブルに含まれている```レコードを最初から最後まで全て全部読み込む```方法

### 出典
https://www.shoeisha.co.jp/book/detail/9784798135168

## 処理汎用性
* ```挿入、更新、削除のコストも、検索と同じくデータ量nに対してO(logn)```です。
* ```データ量が増えても性能劣化の度合いが緩やか```

## 非等値性
等号による検索のみならず、```不等号やBETWEENといった範囲検索の条件に対しても、高速化を可能```とします。

```否定条件(<>,!=)はB-treeが効果を持たない```。

## 親ソート性
インデックス```構築時にキー値をソートして保持```する。

### ソートを暗黙的に使うSQL文
* 集約関数(COUNT, SUM, AVG, MAX, MIN)
* ORDER BY句
* 集合演算(UNION, INTERSECT, EXCEPT)
* OLAP関数(RANK, ROW_NUMBERなど）

```ソートはかなりコストの高い演算```です。
```DBMS内部で専用のメモリが割り当てられており```、その内部に一時的にデータを保持して実施されます

# 出典
https://www.shoeisha.co.jp/book/detail/9784798124704

# 感想
理解できたことできないことがあった。
知らないことばかりだ。
しかし勉強するとしないとでは違うと思う。
何かの力になったと思う。
[Go]埋め込み

# 概要
とあるPRで、構造体をインターフェース化するように言われたけど、愚直に実装しようとすると処理が共通なところ多いなぁ・・・なんとかできないかなぁ・・・と調べているとで、Goだと埋め込み(embed)がこの事態の解決にもっともふさわしそうということで、マジメにまとめてみた。

# 埋め込み
Goで「委譲」を実現する機能。

- [サンプルコード(The Go Playground)](https://go.dev/play/p/gO_wFX5Kqb4)
- [アクセスレベルについてもっと調べてみたサンプルコード](https://go.dev/play/p/wRLOiIYliab)
    - 話それますが、Go PlayGroundって、別パッケージにすることもできるんですね・・・

**継承と委譲**
- 継承は「is-a」、委譲は「has-a」の関係。
- 継承の目的は既存のコードを拡張して新しいクラスを作ること、委譲の目的はその名の通り、一部の機能の処理をおまかせすること。
- Goのembedは「委譲」にあたり「継承」はできないので、概念的に「A is B」な構造体間の関係だったとしても、「A has B」として実装する形になりそう。親構造体を子構造体がフィールドとして持つ感じ。

# 構造体の埋め込みとインターフェースとのあわせ技
実務での要件的に、以下のような感じで設計することがあったので、将来的な参考としてメモ。

- [インターフェース](https://qiita.com/WisteriaWave/items/f5d6c8f9d5e75e9740ee)定義(型定義はexported)
    - 外部公開したいメソッドをexportedで定義する
        - データを参照したいものはすべてGetterとして定義しておく
- 埋め込み元の構造体定義(継承でいうところの親クラス的な位置づけ)(型定義はunexported)
    - インターフェースの実装となるメソッドの定義(※インターフェース定義を単独で満たす)(型定義はunexported)
        - これらを支えるサブルーチンメソッドの定義(unexported)
    - 処理に必要になるフィールドの定義(unexported)
    - コンストラクタを定義(返り値は構造体)
- 埋め込み先の構造体定義(継承でいうところの子クラス的な位置づけ)(型定義はunexported)
    - 埋め込み元の構造体をフィールドとして定義する
    - 固有の処理につかいたいフィールドの定義(unexported)
    - オーバーライド的に定義したいメソッド(exported)や、それらを支える独自のメソッド(unexported)を定義する
    - コンストラクタを定義(返り値はインターフェース)

# 参考
https://qiita.com/gold-kou/items/514aeeba16b59284bbf6

https://qiita.com/tenntenn/items/4c2d33f795aa6e23e188
個人でRDBを作成→RからDBを操作するための手順記録

- **大変参考になった記事**

https://qiita.com/nozma/items/f9a20d9ce0f7bfbdf628


## 0. 環境
- RDBでトータルの容量は4TB
- ワークステーションはオンライン接続可能
- 作業は1人：サーバ・クライアント構築は必要なし
- Rawデータはクラウドサーバに保存されている

## 1. WS選定

- WS
 プロセッサはXeonで検討, Corei9も候補に入れたがXeon
- WS周辺機器
    - NAS → 検討して中止（費用面・運用面←そもそも共有しない・RAID不要）
    - 外付けHDD (8TB ×2)


## 2. SQL選定

- データベース作成
    - SQLiteでDB作成
        - SQLite install
        https://www.sqlite.org/download.html
   
    - DB Brower for SQLiteの存在を後から知る
      https://sqlitebrowser.org/
      https://dskevin.hatenablog.com/entry/2022/02/27/120000


### 3. RからSQLite操作

```r
# package install
install.packages("RSQLite");library(RSQLite)
install.packages("dplyr");library(dplyr)

# データベース接続
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "対象データベースファイル名")

# 参照したテーブル指定
my_tab <- tbl(con, "テーブル名1")
my_tab2 <- tbl(con, "テーブル名2")

my_tab %>%
head()

my_tab2 %>%
  head() %>% as.data.frame() %>% left_join( my_tab, my_tab2, by= atc) -> my_tab3

# sql言語で検索
dbGetQuery(con,"SELECT * FROM テーブル名 WHERE in ('条件');")


# sql言語で集計
dbGetQuery(con,"SELECT count(*) FROM テーブル名 WHERE atc in ('条件');")

# sql言語でjoin
dbGetQuery(con,
    "SELECT *FROM テーブル名1 INNER JOIN テーブル名2 ON ( '条件' = '条件');"
    ) %>%
    head() %>% as.data.frame() -> db_tab #確認するため先頭数行のみオブジェクト化

db_tab %>% View()

```

### *役に立ったその他の情報

はじめてのSQLite
https://iatlex.com/linux/first_sqlite

Package ‘RSQLite’
https://cran.r-project.org/web/packages/RSQLite/RSQLite.pdf

SQLite/基本操作
https://ja.wikibooks.org/wiki/SQLite/%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C

dplyrと高速処理
http://kohske.github.io/ESTRELA/201410/index.html
デフォルトの色使いが気に入らないけど色を細かく弄るのは面倒な人に贈るVimrc

## 結論

以下を`syntax enable`以後の行に挿入してください

```vimrc
set bg=dark
```
![前後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986260/667697f9-e8cb-99cb-cca6-6baaae3e4178.png)
簡単に良い感じになります


## 以下ポエム

以前色々VimのColorSchemeなどをgitからダウンロードして色々弄り回してたとき、ある疑問が浮かんだ。

"他のCLIのソフトはターミナル側の色設定で見れる外観になるのに何故 **Vimだけ** こんな面倒なことをしないといい感じの外観にならないのか"

まともにCLIを使い倒している諸兄ならほぼ全員ターミナル側の色をいい感じになるように設定しているはず。

その設定があるはずなのにVimはこんな ~~クソみたいな~~ 色にしかならないのは恐らくVimのせいだ、と思っていろいろ調べた結果たどり着いた結論が`set bg=dark`。

そう、 **Vimはターミナル側の色設定を認識していないためデフォルトの背景色がlightだと思い込んでいる** ということだった。

みんなキレていいよ。あとgitからダウンロードしたcolorscheme全部窓から捨てていいよ。
HighchatsをReactで使ってみた

自分用のメモ程度に書いているので、雑です。

## やりたきこと
react（TypeScript）で、Highchartsの下記のデモページのようにpie drilldownグラフを描画したい。
[pie drilldownデモページ](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/demo/pie-drilldown)

## 環境
```
├── highcharts-react-official@3.2.0
├── highcharts@10.3.3
├── next@13.1.6
├── react@18.2.0
└── typescript@4.9.5
```
## Highchartsのインストール
```
npm i highcharts highcharts-react-official
```

## メモ
~~~ typescript
import Highcharts from 'highcharts';
import HighchartsReact from 'highcharts-react-official';
import HighchartsAccessibility from "highcharts/modules/accessibility";
import HighchartsExporting from 'highcharts/modules/exporting'
import drilldown from "highcharts/modules/drilldown";

export default function MyComponent(){
    // 値のセットをする前に、drilldown関数を呼ぶだけでした
    drilldown(Highcharts);

    /* ---------------------------------------- *
     * データセットはちょっと省略。
     * ---------------------------------------- */
 
    return(
        <HighchartsReact
            highcharts={Highcharts}
            options={chartOptions}
            ref={chartComponentRef}
        />
    )
}
~~~

## 参考サイト
- [https://codesandbox.io/s/mrfirouz-3d-pie-chart-0gm4h?file=/src/PieChart.js:2460-2747](https://codesandbox.io/s/mrfirouz-3d-pie-chart-0gm4h?file=/src/PieChart.js:2460-2747)
普通の大学院生がIT企業でアルバイトしてみた

## 自己紹介
・24歳大学院2年生
・社会人経験なし
・プログラミングは高専と大学院でかじった程度(Python)

## NTTデータCCSでアルバイトしてみようと思った理由
大学院１年の夏ごろに就活を考え始め、「どうせなら就活しつつアルバイトしたい」と思っていたところ、たまたまこのアルバイトの募集を見つけた。
IT企業に就職しようと思っており、アルバイトを通じて実際の業務を体感できるのはありがたかった。

## 平均的な1日の流れ
10:00　出社
10:00～11:00　メールチェック・作業の確認
11:00～11:50　自分のタスク(解析作業等)
11:50～12:35　お昼休憩　社内のラウンジでみんなで楽しく食事
12:35～13:00　統計のお勉強会（週に1回程度）
13:00～14:00　午後の打ち合わせ
14:00～16:00　自分のタスク(解析作業等)
16:00　退社

大体こんな感じです。
## 業務内容
アルバイトで配属された部署では「[Monone](https://qiita.com/miyake_ysm/items/3ca8d9d95b32825df41e)」に取り組んだ。
製造現場の機械から実際に取得された音を周波数分析し、壊れた機械が発する音の特徴を探すのが主な業務。また、デスクワークだけでなく、業務の一環で音を取得するために泊りがけで出張して、~~おいしいもの食べたりもした~~。
比較的自由に仕事をさせて頂けたため、自分なりに業務を効率化するプログラム等を作成した。
Pythonも高専時代にかじった程度で分からないところだったが、先輩社員にやさしく教えて頂けたのでコーディングで困ることもあまりなかった。

## 学べたこと・感じたこと
・業務内容が流動的であったため、自分なりのワークフローを設定する等の柔軟な対応力を身に着けることができた。また、業務の一部を自動化することで、業務を効率化するとともに作業ミスを減らすことができた。
・作業の効率化のために自分でスクリプトを書いたりなど、プログラミングの経験を積むことができた。
・「なぜこの情報が必要なのか」を常に考えながら資料作成を行う必要があるため、論理的思考力を高めることができた。
・出張先で名刺交換をする機会もあり、ビジネスマナーも身についた。
・業務としてAIを扱う中で、大学では学ぶことのできない様々な学びがあった。社会人になってからもAIを扱う仕事をしたいと考えているため、このアルバイトで得た経験を今後に活かしていきたいと思う。


## さいごに
アルバイトする前までは会社で働くイメージがいまいち湧かなかったが、実際に働いてみることで明確なイメージを持てた。
学生時代に企業でアルバイトすることは就活にも役立つはずなので、皆さんもぜひ探してみてください！
Flask CSRF

Cookieに保存されるセッションIDとCSRFトークンは、ブラウザ側に保存されます。
Flaskはシークレットキーを使用してセッションIDを生成し、CSRFトークンはFlask-Formが自動的にCSRFトークンを生成してくれます。
それらをユーザーのブラウザにCookieとして保存します、この情報をセッションオブジェクトと言います。

ブラウザがサーバーにリクエストを送信する際には、自動的にCookieが含まれます。具体的には、以下のような形式になります。

```
セッションID=abcdefg; CSRFトークン=hijklmn
```

ブラウザは、同じドメイン名やサブドメイン名のサイトにアクセスする際にもCookieを送信するため、この方法でセッションIDやCSRFトークンが共有されます。サーバー側ではユーザーのセッション情報は一時的にサーバーのメモリ上に保存されます。

サーバー側では、これらの値を取得し、認証やセッション管理などの用途に使用します。

また、ブラウザが閉じられた場合、そのセッション情報はサーバー上から削除されます。したがって、ブラウザが閉じられるまでの間、サーバーのメモリにセッション情報が保持されます。ただし、サーバーが再起動された場合や、サーバーのメモリが不足した場合には、セッション情報は消失する可能性があります。
Vue Composableからemitしたい時


Vue2から３への以降でmixinをComposableにしていく時、そのまま置換するとComposableからemitしたくなる

一応emitを引数に渡せばできる


```typescript
export default function useTest(emit: Function) {
  return {
    clicked() {
      // いろいろ処理
      emit("clicked", "arg1")
    }
  }
}
```

OptionsAPI
```vue
<script>
export default {
  onClick() {
    const {clicked} = useTest(this.$emit);
    clicked();
  }
}
</script>
```

CompositionAPI
```vue
<scipt setup lang="ts">
const emit = defineEmits();
const {clicked} = useTest(emit);

function onClick() {
  clicked();
}
</script>
```

でもこれだと定義したemit以外も呼べるので,機能だけ呼んでemitはコンポーネントでやるほうが良い

```vue
<scipt setup lang="ts">
const emit = defineEmits(["clicked"]);
const {clicked} = useTest();

function onClick() {
  clicked();
  emit("clicked");
}
</script>
```
ノートパソコンのデスクトップ画面が勝手に暴走したら、タッチスクリーンの不具合が原因かも

近々、edgeなどのブラウザでネットサーフィン中に、急にデスクトップ画面が暴走しています。
頻度としては、日に2、3回発生しているので、とても困ります。

原因を突き止めるために、ネット記事やyoutubeで動画を漁ってみたら、<font color="Red">**タッチスクリーンの機械的な不具合**</font>が原因である可能性が高いとわかったので、ここで経験を共有し、同様な問題で困っている方の助けになれれば幸いです。

## 不具合の事象
・ブラウザのズームが急に勝手に拡大される
・ブラウザが急に勝手に高速でスクロールされる
・向かって画面の右側に一本の縦線状に、画面が人の指に押された時のような丸い円が高速で縦線の上から下まで指で連打されているような円が複数出現（これは動いてる事象だから説明が難しい）
・仮想デスクトップが急に切り替えられる（Winキー＋Tabキーと同様な操作）
・通知センターが勝手に立ち上がる
・フォーカスセッションが勝手に立ち上がる

## 自力でできる対策
Windowsなら、デバイスマネージャーで、「ヒューマンインタフェースデバイス」の「**HID 準拠タッチ スクリーン**」を無効にすると、改善が一時的に見込まれます。

## 原因の切り分け
・インターネットを切っても発生
・マカフィーとF-Secureの両方でフルスキャンし、ウイルス未検出
・Windows11 home を「回復」（再インストール）したとしても発生
・放電しても発生
・周辺機器は、無線マウスのレシーバーとHDMIで接続したモニターのみ、いずれも接続を切っても発生
・部屋内に電波を発するものはルータ（ONU）のみ。また、PC本体はWi-Fiを使用
・PC本体や部屋内は常に清潔に保っているため、ほこりが原因として考えにくい
SwiftUI＋TCAで作るリアルタイム検索機能：debounceを使って効率的な検索を実現しよう

# はじめに
SwiftUIとTCA (The Composable Architecture) を使用して、リアルタイム検索機能を実装する方法について説明します。本記事では、TCAのアーキテクチャについての基本的な知識があることを前提に進めていきます。

# リアルタイム検索
検索機能を実装する上で重要なのは、ユーザーが素早く目的の情報を見つけられるようにすることです。そのためには、ユーザーが入力した検索キーワードに合わせて、リアルタイムに検索結果を返すことが必要です。しかし、ユーザーが入力するたびに検索処理を実行してしまうと、端末やサーバーに負荷がかかってしまうことがあります。

# debounce
そこで、debounceを使って、一定時間以内に連続して入力された場合には、最後に入力されたキーワードを検索キーワードとして採用し、それ以外の場合には検索処理を実行しないようにします。これにより、検索処理を効率的に実行することができます。

# コード例
実際にSwiftUIとTCAでdebounceを使った検索機能を実装するには、以下のようなコードを書きます。

```swift
import SwiftUI
import ComposableArchitecture

struct Search: ReducerProtocol {
    struct State: Equatable {
        var searchText = ""
    }

    enum Action: Equatable {
        case setSearchText(String)
        case search
    }
    
    @Dependency(\.mainQueue) private var mainQueue
    
    var body: some ReducerProtocol<State, Action> {
        Reduce { state, action in
            switch action {
            case let .setSearchText(text):
                enum SetSearchTextID {}
                state.searchText = text
                return .task {
                    .search
                }
                .debounce(
                    id: SetSearchTextID.self, 
                    for: 0.5, // 0.5秒
                    scheduler: mainQueue
                )
            case .search:
                // ここに検索処理を書く
                print(state.searchText)
                return .none
            }
        }
    }
}

struct SearchView: View {
    let store: StoreOf<Search>
    
    var body: some View {
        WithViewStore(
            self.store,
            observe: { $0 }
        ) { viewStore in
            VStack {
                TextField("Search", text: viewStore.binding(
                    get: \.searchText,
                    send: { .setSearchText($0) }
                ))
            }
        }
    }
}

struct SearchView_Previews: PreviewProvider {
    static var previews: some View {
        SearchView(
            store: Store(
                initialState: Search.State(),
                reducer: Search()
            )
        )
    }
}
```

# まとめ
検索機能の実装は、ユーザーの利便性を高める上で非常に重要な要素です。debounceを使って、入力のたびに検索処理を実行せず、一定時間以内に入力が連続した場合にのみ検索を行うことで、負荷を軽減し、スムーズなユーザーエクスペリエンスを実現できます。SwiftUIとTCAの組み合わせは、このような機能を実装するのに非常に適しています。是非、今回紹介したコードを参考にして、検索機能を実装してみてください。

---

ご覧いただきありがとうございました。

🐦 [Twitter: @shota_appdev](https://twitter.com/shota_appdev)

📱 [個人アプリ: Symbols Explorer](https://apps.apple.com/jp/app/symbols-explorer/id1612933742)
Python で環境変数で設定した値をリストで受け取ってみました

## 概要

環境変数に区切り文字「,」を含んだ文字列を定義しておき、プログラム側で環境変数を取得後に、その区切り文字を利用してリスト化を行いました。

### 実行環境

macOS Ventura 13.0
python 3.8.12

---

### 環境変数の定義

事前に環境変数「TEST_ENV」に以下を登録しておきます。区切り文字「,」を含んだ文字列を定義しておきます。

```
## 登録
$ export TEST_ENV=2023-01,2023-02,2023-03

## 確認
$ echo $TEST_ENV
2023-01,2023-02,2023-03
```

### 環境変数を取得するプログラム

上記で設定した環境変数を取得する pythonプログラムは以下となります。プログラム側で環境変数を取得後に、その区切り文字「,」を利用してリスト化を行います。

```python:split_env.py
import os

env_list = os.getenv('TEST_ENV').split(',')
print(f"env_list:{env_list}")
print('ListItem is ', len(env_list))

for env in env_list:
    print(env)
```

### プログラムの実行

作成したプログラムから環境変数をリスト取得してみます。

```
$ python split_env.py
env_list:['2023-01', '2023-02', '2023-03']
ListItem is  3
2023-01
2023-02
2023-03
```


---

### まとめ

これで１つの環境変数に区切り文字「,」を含んだ文字列を定義しておき、プログラム側でその環境変数を取得後に、リスト化できることを確認できました。 Azure Functions や AWS lambda の引数として利用することを想定しています。
Googleデジタルマーケティング＆Eコマース：デジタルメディアの分類（Paid・Owned・Earned）の基礎

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/77505f22-0d8f-b3af-4f9c-ed148bcefd65.png" width="800">

# デジタルメディアの分類

デジタルメディアは、３つのカテゴリーに分類されます。

- **Paid Media**
- **Owned Media**
- **Earned Media**

強力なデジタルマーケティング戦略は、これらすべてを活用することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c58aab65-99ce-e8aa-54f9-29e045b69fb2.png" width="650">

## Paid Media

ペイド・メディアとは、ブランドがお金を払ってオンラインに掲載するデジタルプロモーションのことです。

- バナー広告
- ビデオ広告
- ソーシャルメディア広告
- ショッピング広告
- ポップアップ


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/96449127-70c1-d346-9ea3-5ad9af433069.png" width="650">

#### 利点

- すぐに結果を生成することができる。
- 購買に直接つながるだけでなく、ビジネスのオウンド・メディアやアーンド・メディアのチャンネルにトラフィックを誘導するのにも役立つ。

#### 欠点

- 広告のために支払うことは、時間が経つにつれて高価になる。
- 支払いを停止すると、結果は瞬時に消える。

## Owned Media

オウンド・メディアとは、ブランドが完全にコントロールするすべてのデジタルコンテンツを指します。

オウンド・メディアのコンテンツは説得力がありますが、ペイド・メディアの広告とは異なり、直接的に広告を出したり、商品を販売したりするものではありません。その代わり、顧客が十分な情報を得た上で意思決定を行うために必要な情報を提供することで、価値を提供します。広告によって消費者が企業のWebサイトを訪れるとしたら、オウンド・メディアは消費者を納得させるものです。

- コンテンツ
- ブログ
- 電子書籍
- ソーシャルメディアのコンテンツ
- ホワイトペーパー
- ケーススタディなどのドキュメント

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/61ce7cb4-9a49-fd62-3a6e-e577d9a682fb.png" width="650">

オウンドメディアの特徴は、それだけで大きな力を発揮できないことです。企業のWebサイトやケーススタディがどんなに素晴らしくても、その存在を知らないお客様を教育することはできません。しかし、有料広告や検索エンジンでの上位表示によって、自社コンテンツにお客様を呼び込むことができます。

## Earned Media

アーンド・メディアとは、個人的または公的な推薦によって生み出されたポジティブなデジタル露出のことです。アーンド・メディアは、企業が作成したり所有したりするものではなく、その対価を直接支払うこともできません。

アーンド・メディアは、マーケティングキャンペーンの成功に加え、製品の品質やカスタマーサービスなどに対する顧客の反応によって生み出されるものです。つまり、あるブランドがインフルエンサーと正式なパートナーシップを結んだ場合、それは有料広告となります。

しかし、もしお客様が製品を気に入って、無料で友人にその製品を紹介すれば、それはアーンド・メディアです。基本的には、ブランドは自分たちのやっていることが素晴らしいという評判を築き上げるものです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/df8d81b8-bd82-e3c6-d18c-9f62d36976ae.png" width="550">

- ソーシャルメディアにおける言及
- ブログ記事
- 文書やビデオによるレビュー
- 製品紹介やベスト・オブ・リストなどの好意的な報道

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/373e0d84-3fd6-c653-e9fa-f92e8d0d992d.png" width="650">

顧客が作成したコンテンツは、企業が製品を販売するのに役立ちますが、それ以上の効果があります。ブランドが新たな市場に参入し、社会的信用を構築するのにも役立つのです。
Javaを基本からまとめてみた【演算子・基本データ型の型変換】

## 演算子

| 演算子の種類 |  記号  |   
| ---- | ---- |
|  算術演算子  |  +, -, *, /, %  |
|  比較演算子  |  >, >=, <, <=, ==, !=  |
|  代入演算子  |  =, +=, -=, *=, /=, %=  |
|  インクリメント・デクリメント演算子  |  ++, –-  |
|  条件演算子  |  &, |, ^, !, ||, &&  |
|  シフト演算子  |  <<, >>  |

## 基本データ型の型変換

- 数値同士の演算や代入をする時、データ型の変換が自動で行われる。
表現できる値の幅が　小 ➡︎ 大

- 数値同士の演算や代入をする時、データ型の変換がキャストで明示する。
表現できる値の幅が　大 ➡︎ 小

## 基本データ型の暗黙変換
```
//→　→　暗黙に型変換が行われる →　→

『byte』 → 『short』 →
　　　　　　           『int』 → 『long』 → 『float』 → 『double』
   　　　　　『char』　→

//←　←　キャストを使用する　←　←
```





```
//表現できる値の幅が　小 ➡︎ 大
int i: i 32ビット
dobule d: d 64ビット

//表現できる値の幅が　大 ➡︎ 小
d = 1;
i = (int)d; ← キャストが必要（変換後の型）
```



＜データ型の一覧＞

|  データ型  |  種類  | データの幅  | データの表現範囲  |
| ---- | ---- | ---- | ---- |
| byte |整数 |8ビット|-128 ～ 127|
| short|整数 |16ビット|− 2の15乗～2の15乗 − 1(-32,768 ～ 32,767) |
| int  |整数 |32ビット|− 2の31乗～2の31乗 − 1(-2,147,483,648 ～ 2,147,483,647)|
| long |整数 |64ビット|− 2の63乗～2の63乗 − 1(-9,223,372,036,854,775,808L ～9,223,372,036,854,775,807L)  |
|float |浮動小数点数|32ビット|IEEE 754 規格の単精度浮動小数点数|
|double|浮動小数点数|64ビット	|IEEE 754 規格の単精度浮動小数点数|
| char |文字|16ビット|Unicode規格の１文字（\u0000～\uFFFF）|
|boolean|論理値|	1ビット	|trueまたはfalse|

```Sample.java
public class Cast{
  public static void main(String[] args) {
    int price = Integer.parseInt(args[0]);
    double rate = 0.08; //消費税率:8%
    int amount;    

    amount = (int)(price * (1 + rate));
    System.out.println("税込金額:" + amout + "円"); 
  }
}
```
## 参考サイト
[初心者が押さえておきたいJavaの演算子５つを基本から解説！【Java入門講座】2-6 演算子](https://www.youtube.com/watch?v=RqOtRQAiD5M)
[初心者でも分かる基本データ型の型変換：自動とキャストの違いがスパッと分かる！【Java入門講座】2-7 基本データ型の型変換](https://www.youtube.com/watch?v=KDmJDC7U59c)
imgタグとbackground-imageプロパティを使用して画像を表示させることの違い

## 概要
imgタグとCSSのbackground-imageプロパティを使用して画像を表示する事にはどのような違いがあるのか改めて整理したくなったのでまとめようと思います。

## 違い
imgタグとCSSのbackground-imageプロパティを使用して画像を表示する方法にはいくつかの違いがあります。

### HTMLの構造への影響
- imgタグを使用する場合、`HTMLの構造に画像が直接含まれる`。
- background-imageプロパティを使用する場合、`画像はHTMLの構造に含まれず、CSSのスタイルルールで定義される`。

つまり、

- imgタグを使用する場合、`画像はコンテンツの一部`として扱われる。
- background-imageプロパティを使用する場合は、`デザインに関連するスタイルの一部`として扱われます。

### サイズの扱い方
- imgタグを使用する場合、`画像のサイズを直接指定することができる`。
- background-imageプロパティを使用する場合、`画像のサイズをコンテンツに合わせて自動調整する事が出来るが、画像のサイズを直接指定することはできない`。

### コンテンツの背景に対する影響
- imgタグを使用する場合、`画像はコンテンツの一部として表示される`。つまり、`画像とその他のコンテンツが同じ階層に表示される為、重なりの問題は発生しない`。
- background-imageプロパティを使用する場合、`画像は要素の背景に表示される`。これにより、`要素内のテキストやその他の要素が画像に重なって表示されることがある`。

### リサイズの扱い方
- imgタグを使用する場合、`画像のサイズを指定しない場合は、画像がオリジナルサイズで表示される`。したがって、`画像のリサイズには別途対処する必要がある`。
- background-imageプロパティを使用する場合、`画像は要素のサイズに合わせて自動的にリサイズされる`。

以上を元に、実装するWebページの要件に応じて選択する必要があります。
フリーズしたフルスクリーンプログラムを終了する方法

## 問題

フルスクリーンで実行中の`プロセスA`がフリーズしており、終了したい。

`Ctrl+Shift+Esc`でタスクマネージャーを起動できるが、前面に表示できず、フォーカスを取得できません。

## 対処法

この場合、多重デスクトップ機能を利用することができます。`Win+Tab`を押して、`第2デスクトップ`に切り替えます。

`第2デスクトップ`で再度タスクマネージャーを起動しようとすると、以前の画面（`プロセスA`のフルスクリーン）に戻ってしまいます。これはタスクマネージャーがシングルトンであるためです。

次に、`第1デスクトップ`に戻って、タスクマネージャーを閉じます。その後、`第2デスクトップ`に戻り、タスクマネージャーを再度開くと、前面に表示されます。これで、フリーズした`プロセスA`をタスクマネージャーで終了することができます。

この方法を使えば、フリーズしたフルスクリーンプログラムを簡単に終了し、タスクマネージャーを前面に表示することができます。
Go言語で説明する「抽象化」について

Go言語では、インターフェースを使用して抽象化を実現します。
インターフェースは、メソッドの集合体であり、そのメソッドのシグネチャー（引数の型、戻り値の型など）を定義します。
具体的な型は、そのインターフェースを実装することで、そのインターフェースを満たすことができます。

以下は、簡単な例です。 
`Animal`というインターフェースを定義し、そのインターフェースを実装する`Dog`と`Cat`という2つの具象型を定義します。 `MakeSound()`メソッドは、`Animal`インターフェースで定義されたメソッドであり、どちらの具象型でも異なる音を出すように実装されます。 `main`関数では、`MakeSound()`メソッドを呼び出すことにより、`Dog`と`Cat`の両方が異なる音を出すことが確認できます。

```go
package main

import "fmt"

type Animal interface {
    MakeSound()
}

type Dog struct{}

func (d Dog) MakeSound() {
    fmt.Println("Woof!")
}

type Cat struct{}

func (c Cat) MakeSound() {
    fmt.Println("Meow!")
}

func main() {
    animals := []Animal{Dog{}, Cat{}}

    for _, animal := range animals {
        animal.MakeSound()
    }
}
```
#### 出力結果

```bash
Woof!
Meow!
```

この例では、`Animal`というインターフェースを使用して、`Dog`と`Cat`という2つの具象型を抽象化しています。 
`MakeSound()`メソッドを定義することで、`Dog`と`Cat`の両方が`Animal`インターフェースを満たすことができ、同じスライス内に格納され、`MakeSound()`メソッドを呼び出すことができます。

https://qiita.com/y-kaanai/items/695eb0654a41a3005288

https://qiita.com/TakumaKurosawa/items/4e26f77bd62fb734cf55

https://zenn.dev/hsaki/books/golang-io-package/viewer/io
PythonプログラムのexeするためにPyinstallerを使用する（Pyinstallerの使い方について）

こんにちは。YoutubeやTwitchで配信しておりますアニメ、漫画、ゲーム、Vtuber大好きオタクのVtuber
久遠楽 (https://twitter.com/kuonraku0210) です
今回はpythonで作成したスクリプトをexeに変換することでpythonが入っていない環境でも実行できるようにします
備忘録として記載してあるので足りない箇所などがあるかと思います
その際がご指摘いただければ幸いです

環境
---
* OS:Windows 10 64bit
* Python 3.11.2
* PyInstaller 5.8.0

1.PyInstallerをインストール
---
コマンドプロンプトを起動し以下のコードを入力
```
pip install pyinstaller
```


2.作成したpythonファイルをexeファイルへ変換
---
1.コマンドプロンプトを開き作成したpythonファイルがある階層に移動
2.pyinstallerでpythonファイルをexeファイルに変換
```
>cd pythonファイルがあるディレクトリ
>pyinstaller pythonファイル.py --onefile --noconsole
```
そうするとフォルダ内に以下3つのものが作成されます
* build
* dist
* pythonファイル名.spec

dist内にあるexeファイルを実行すれば処理が動きます

3.最後に
---
これでPythonが入っていないPCでも実行することが可能になりましたので
放置してデータを収集したいと思います。

【宣伝】
APEXやヴァロラントなどのFPSをメインに毎日20時頃から配信をしているのでよければチャンネル登録していただければ嬉しいです。
GraphQLとは？REST API との比較もしてみました

# GraphQLポイント

- Graph(グラフ構造の) + QL(クエリ言語)。Web APIの1つでREST APIの次のパラダイムとして注目されている
- GraphQL APIの**エンドポイントは1つ**で、データ操作の種類(CRUD)と欲しいレスポンス形式を指定してリクエストし、データを取得することができる
-  クライアント(フロントエンド)側からデータのレスポンス形式を指定できる

# GraphQL用語
| 用語 | 意味 |
| --- | --- |
| Query | クエリ処理( = Get)  |
| Mutation | トランザクション処理( = Put/Post/Delete) |
| Schema | APIの定義。クライアントがサーバーにクエリを送信し、返却値として期待されるオブジェクトの型を定義 |
| Subscription | クライアントへの通知。( = WebSocketと同様の効果) |

# 仕組みのイメージ
![27ADFwx4YFgCeBgp-067F1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331389/5e67bb51-3982-e5ee-08ac-3e710d0af9ec.png)


# REST API との比較

| 比較項目 | REST API | GraphQL |
| --- | --- | --- |
| データ操作の種類 | GET/POST/PUT/DELETE | Query/Mutation |
| エンドポイント | 複数（[GET]user/[PUT]setting など欲しいデータによってリクエスト先エンドポイントが変わる） | 1つ（データ操作の種類と欲しいレスポンス形式を指定する） |
| 型付け | 弱い | 強い |
| Pub/Sub | なし（WebSocketを使用することが多い） | 可（subscription） |

# メリット
- クライアントからAPIのレスポンスの指定ができる
- サブスクリプションを利用したリアルタイム処理ができる
    - クライアントはデータをサブスクライブすることで、イベントドリブンに処理を実装することが可能

# デメリット

- N + 1 問題が発生する可能性
    - クエリの指定方法によってはパフォーマンス問題や脆弱性を生みやすい。
        - [Securing Your GraphQL API from Malicious Queries](https://www.apollographql.com/blog/graphql/security/securing-your-graphql-api-from-malicious-queries/)
MGM MARTIN

At MGM MARTIN we do more than just sell your property, our expert team have a collective goal of being the best in the industry. Our aim is to achieve premium prices while delivering exceptional service, ensuring all of our clients, vendors, landlords & tenants should enjoy the real estate process whether it be the act of buying, selling or renting. 

When it comes to selling property we pride ourselves on setting the highest of standards from our bespoke marketing strategies, through to our exceptional customer service and industry expertise – we know how to get results! 

MGM MARTIN
Suite 2/22 Gadigal Ave, Zetland NSW 2017
02 9662 3954
https://mgmmartin.com/
SPSS Modeler ノードリファレンス 1-8 JSONインポート


# 1-8 JSONのインポートノード[入力タブ]
<img width="200" alt="JSONインポート.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2e3227f8-7517-541c-ae0d-51cd3125c052.png">

## 1.ノードの目的
以下のようなJSON形式のファイルを読み込みます。

```json:01simple.json
[
    {
        "id":1000,
        "UP_TIME":0,
        "POWER":948,
        "TEMP":250
    },
    {
        "id":1000,
        "UP_TIME":1,
        "POWER":945,
        "TEMP":251,
        "ERR_CD":1
    }
]
```

## 2.解説動画

TBD

## 3.クイックスタート

①ファイルタブの[JOSNデータソース：]の[...]ボタンから読み込むファイルパスを指定します。
＊サンプルのJSONファイルは[5.参考情報]からダウンロードできます。

② [OK]ボタンで完了です。画面上のプレビューでデータが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/27299c84-9675-ef21-4016-a44b806c7d8f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c7fba303-e43a-1732-182f-755a36b80e52.png)

２レコード目にしか[ERR_CD]はありませんが、列がちゃんとできていることがわかります。



## 4.Tips

JSONファイルの形式はかなり自由度があります。
階層が深くなっていたり、繰り返し項目があったり、読み出しルートを変えたいということがあると、このノードで読みだしても、読み込みたい形式で読めないことがあります。
その場合は、以下の記事を参考に拡張ノードを使って、PythonやRで読むことをお勧めします。

複雑な構造のJSONファイルをSPSS ModelerのPython拡張ノードで読み込む - Qiita 

https://qiita.com/kawada2017/items/801953b204db21f4e21e




## 5.参考情報

#### サンプルストリーム

https://github.com/hkwd/200611Modeler2Python/raw/master/jsoninput/jsoninput.str


#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/jsoninput/01simple.json

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.4.0?topic=nodes-json-source-node

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
逆引きPySpark

PySparkでこういう場合はどうしたらいいのかをまとめた逆引きPySparkシリーズです。

## 全体について

- 原則としてApache Spark 3.3のPySparkのAPIに準拠していますが、一部、便利なDatabricks限定の機能も利用しています（利用しているところはその旨記載しています）。
- Databricks Runtime 11.3 上で動作することを確認しています。
- ノートブックを[こちらのリポジトリ](https://github.com/motokazu-ishikawa-db/gyakubiki_pyspark)から[Repos](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)にてご使用のDatabricksの環境にダウンロードできます。

## 各章の説明
それぞれ別のQiitaの投稿になってます。
- [1.基本操作編](https://qiita.com/motokazu_ishikawa/items/6c50360104c6ed0c4fda)
- [2.日付時刻編](https://qiita.com/motokazu_ishikawa/items/ad870f8d72a7364143b4)
- [3.文字列編](https://qiita.com/motokazu_ishikawa/items/88af3d3b92f7e1e22bb7)
- [4.データ分析編](https://qiita.com/motokazu_ishikawa/items/c016aea50167e89ecdc9)
- [5.結合編](https://qiita.com/motokazu_ishikawa/items/d07ca364ecd089d926e6)