OmniAICreator/Qiita-1.07M huggingface dataset:
【Xcode】CodeSnippetsで爆速開発

# はじめに

Xcodeには`CodeSnippets`という便利なものがあります

記述を簡略化するために、ある程度コードを打つと関数やclassなどを生成してくれるスニペットをサジェストしてくれます。オリジナルのスニペットを作ることもでき、設定ファイルを共有することでチーム間で同じ設定で開発することもできます

# 設定ファイルをgitに公開しました

[CodeSnippets](https://github.com/yuta-shoji/CodeSnippets.git)というレポジトリを作りました。


## Step 1
以下のディレクトリの中を確認してください。
このディレクトリには、自分で追加したCodeSnippetsのxmlファイルがあります。

```shell
$ cd ~/Library/Developer/Xcode/UserData/CodeSnippets/
```

`CodeSnippets/`ディレクトリが空、もしくは不要なファイルしかない場合はこのディレクトリを削除してください。

## Step 2

`~/Library/Developer/Xcode/UserData`ディレクトリで、`git clone`を実行してください

```shell
cd ~/Library/Developer/Xcode/UserData
git clone https://github.com/yuta-shoji/CodeSnippets.git
```

## Step 3

Xcodeを再起動し `⌘ shift L`のショートカットでCodeSnippetsを開き、このようになっていればOKです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/01829525-1b9e-1108-e3a4-f8c2fbe566fe.png)

# 使い方
こんな感じで使います
![snippets-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/d27330c0-8f81-0f43-1fb3-7e229c105b92.gif)

# おわりに

まだ2つしか作ってないですが（笑）
これから良いの思い付いたらpushしていくので、ぜひクローンしてください！
プルリクもお待ちしてます
ChatGPTでpythonのプログラムを効率的に出力するためのプロンプト

# この記事の目的
ここ最近、ChatGPTを効率よく使用するためにプロンプトエンジニアリングの勉強をしていました。
そこで、pythonのプログラムをChatGPTに作成してもらう際に気が付いたことが1つ…

**「ん？なんかプログラムを出力させるプロンプトに個人差があるくね？」**
そう思ったわけです。
それは
**1. ○○の機能を持ったpythonの"コード"を生成してください。**
**2．○○の機能を持ったpythonの"スクリプト"を生成してください。**
です。
一見同じような意味合いのように見えますが、コードとスクリプトにどのような違いがあるのでしょうか。
今回の記事では、それぞれのプロンプトの持つ意味と出力結果についてまとめます。

# それぞれのプロンプトの持つ意味
では、ChatGPTにそれぞれのプロンプトの評価をしてもらいましょう。

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/788cd2f7-0b34-9ffd-df24-b4bd5bd60935.png)

非常に面白いですね。
つまり、
「コード」は特定の処理に対するプログラムを要求
「スクリプト」は特定の一連の問題を自動的に完了できるプログラムを要求
しているということですね。
たしかに、コードとスクリプトの意味をよく考えると言っていることはわかります。

おそらく、Jupyterノートブックでの細分化されたプログラム作成には「コード」が適しており、
pyファイルでの実行可能なプログラム作成には「スクリプト」が適しているのかもしれません。
私自身、pythonのwebフレームワークであるstreamlitを用いてwebアプリケーションを開発していますが、「○○の機能を持つstreamlitアプリを作成するためのpythonの**コード**を作成して」と命令していました。
そのせいか、修正箇所が多く、出力の精度がイマイチだなと感じることが多々ありました。
もしかすると、今回の発見でより精度の高いプロンプトになる可能性がありますね。

# まとめ
一概にも「スクリプトを作成」というプロンプトがいいとは言い切れません。
そのときのニーズ次第で使い分けが必要であるということですね。
今回、発見したことをまとめましたが、もしかすると既に発見している人もいるかもしれません。
調べた感じ、触れている人がいなかったので、とりあえずまとめてみました。
今後も、おっ使えそうだなっと思ったプロンプトは随時共有していきます！
それでは！！！
Databricksノートブックをお気に入りに追加できるようになりました！

ノートブックの左上をご覧ください。⭐︎マークがあります。

![Screenshot 2023-08-24 at 20.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/185ef474-7312-e173-b51e-d35cfde880e7.png)

クリックするとお気に入りに追加されます。

![Screenshot 2023-08-24 at 20.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7dc74397-e38b-d0f6-7aab-181cd78aed7e.png)

トップページのお気に入りからアクセスできます。

![Screenshot 2023-08-24 at 20.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/76ae5f33-7a60-0c70-d78a-28ab0fab0950.png)

何気に嬉しい。

ちなみに、フォルダーもお気に入りに追加できます。
![Screenshot 2023-08-25 at 8.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2a93b1ce-5d5e-fad4-5375-f8a20ad47311.png)


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【AWS-Athena】VPCフローログのクエリ例

### 対象EC2インスタンスのVPCフローログをクエリする

#### 条件
対象ec2インスタンス(10.10.20.20)のVPCフローログ
宛先IPアドレスは20.20.10.10/28
Portは22
日付は20230101
通信が正常に行われているかの確認
時間順に並べる

#### SQLクエリ
```
SELECT *
FROM "your_vpc_flow_logs_table_name"
WHERE "source_ip_column" = '10.10.20.20'
  AND "destination_ip_column" BETWEEN '20.20.10.10' AND '20.20.10.15'
  AND 
  AND "destination_port_column" = 22
  AND DATE("date_column") = DATE '2023-01-01'
  AND "action_column" = 'ACCEPT'
  AND "status_column" = 'OK'
ORDER BY "time_column" ASC;
```
```
SELECT
  startime,
  endtime,
  sourceaddress,
  destinationaddress,
  sourceport,
  destinationport,
  protocol,
  action,
  bytes,
  packets
FROM
  vpc_logs.flow_logs
WHERE
  (
  sourceaddress = '10.25.13.15' 
  OR destinationaddress = '10.25.13.15'
  )
  AND startime >= timestamp '2023-10-21T10:00:00Z'
  AND endtime <= timestamp '2023-10-21T18:00:00Z'
ORDER BY
  startime;

  ```

以下の部分を実際のテーブル名とカラム名に置き換える必要がある。

	•	"your_vpc_flow_logs_table_name": フローログを保存しているテーブル名
	•	"source_ip_column": 送信元IPアドレスを表すカラム名
	•	"destination_ip_column": 宛先IPアドレスを表すカラム名
	•	"destination_port_column": 宛先ポート番号を表すカラム名
	•	"action_column": フローログのアクション（ACCEPTやREJECTなど）を表すカラム名
	•	"status_column": フローログのステータス（OKやNODATAなど）を表すカラム名
	•	"date_column": 日付を表すカラム名
	•	"time_column": 時刻を表すカラム名

クエリの解説:
	•	BETWEEN '20.20.10.10' AND '20.20.10.15': 宛先IPアドレスが指定の範囲に含まれる行を選択する。
	•	DATE("date_column") = DATE '2023-01-01': クエリに指定された日付（2023年1月1日）に一致する行を選択する。
	•	ORDER BY "time_column" ASC: 時刻を昇順（時間順）に並び替える。
	•	"action_column" = 'ACCEPT': フローログのアクションが “ACCEPT”（通信が許可された）である行を選択する。
	•	"status_column" = 'OK': フローログのステータスが “OK”（正常）である行を選択する。
これにより、指定された条件に一致し、かつ通信が正常に行われたフローログエントリが選択され、結果が返される。
GoでWebアプリケーションを作る（１）

こんにちは。

今日からはGo言語を使って簡単なWebアプリケーションを作成します。


# 目的
- あなたがプログラミングを行う際の選択肢として、Goを挙げられる為の第一歩となること
    - より、知らない人に知ってもらうことを重要視しています

# 全体の流れの確認
- Goとは
    - 特徴
    - どこで使われているの?
- Hello, World作成
    - 実行
    - クロスコンパイルの体験
- 変数とその定義方法
    - 変数の種類
    - 変数定義方法
    - 不具合箇所は、最高の講師に教えてもらおう
    - 不具合の修正
- 関数
    - 関数の定義
    - 関数を書いてみる
    - 関数の実行される順番
- パッケージ 
    - パッケージを使う
    - パッケージを作る
- 構造体
    - 構造体の定義
    - 構造体への関数の関連付け
    - 牛丼屋型と、注文する関数を定義する
- Webアプリケーション
    - httpを起動する方法
    - はじめてのGo言語Webアプリケーション起動
    - Goroutineに触れる
    - zakohttpパッケージについて
- テスト
    - Go言語でのテストのやり方
    - テストの実行と修正
    - その他のテストの書き方


今回は「Goとは」です。
# Goとは

Googleが主導して開発しているプログラミング言語です。
正式名称は、`Go`ですが、ググラビリティが低いので、`Golang` `golang` `go言語` `Go言語` `go-lang`辺りで表記されていることが多いです。

## 特徴

### シンプルである

設計思想として単純さを是としています。
例えば、言語仕様。使用されるキーワードは25個しかありません。
表現や構造がシンプルであるため、学習コストが低いという側面があります。

### 標準パッケージが充実している

Go言語の環境を用意するだけで、[標準パッケージ](https://pkg.go.dev/std)を扱え、より多くの作業が行えます。

- testing: テスト記述
- net/http: HTTPサーバ/クライアントなど
- encoding: hexやテキスト表現
- crypto: 暗号関係
- ...

### クロスコンパイルが容易

コンパイル時に、環境変数`GOOS`や`GOARCH`を設定するだけで、Windowsの実行形式ファイルやLinuxの実行形式ファイル、macOSの実行形式ファイルを出力することができます。
標準パッケージの多くが、クロスコンパイルされることを前提としているため、標準パッケージを活用することで、環境ごとに不具合の起きづらい開発を行うことが可能です。
例えば、ファイルパスの文字列結合は、`"path1" + "\" + "path2" `といった表現はせず、`path/filepath`の関数Join を用い、`filepath.Join("path1", "path2")`というように表現することをお勧めします。

注意しておかなければいけない点としては、一部パッケージには、OS依存のものがあるということです。
例えば、Windowsのレジストリに対する処理のような、OSに依存するものがあります。

### 周辺ツールが標準で提供される

Go言語をインストールするだけで、パッケージの管理やダウンロード、コンパイル、テスト、字句解析、ドキュメント生成など、多くのことが実行できます。
`go <subcommand> `形式で、それらのツールを扱うことが可能です。
参考: [コマンド一覧](https://pkg.go.dev/cmd)

### 並行プログラミングが文法レベルでサポートされている

とても簡単に並行プログラミングを作成することができます。
並行プログラミングしない場合は、`func(){//<yourCode>}() `のような形で関数を呼び出せます。
対して、並行プログラミングする場合は、`go func(){//<yourCode>}() `のような形で関数を呼び出します。
わずか、3 byteほどの差分で並行プログラミングを表すことが可能です。

なお、Go言語での並行プログラミングさせたスレッドは、Goroutine(ごーるーちん) と呼びます。

```
Goroutineは、カーネルスレッドではありません。
```

OSのカーネルスレッドとは異なり、ユーザ空間で動作する軽量なスレッドです。
それぞれのGoroutineの管理（スケジューリングなど）も、1つのユーザ空間スレッドとして動作しています。

## どこで使われているの?

本講義でも活用している、Dockerで扱われています。

### ハンズオンの開始

以降の章では、事前準備したDockerを用い、ハンズオンを行います。

特別な注釈がない限り、実施するプロンプトは、コンテナ上です。
もしコンテナを実行していないようであれあば、以下のコマンドを実行してください。

```
:# TERMINAL 0

:# vim,emacs,nano派の人はこちら
$ docker run --name go-tutor -it --rm jo7oem/go-tutor:v2022 /bin/bash

:# VSCode派の人はこちら
$ docker run --name go-tutor-vscode -p 8888:8888 -d --rm jo7oem/go-tutor-vscode:v2022
```
ハンズオンでは、こちらから指示したpathに、ディレクトリやファイルを作成してもらい、Go言語に触れてもらいます。
基本的なフォルダ構成は、 `/go/src/go_tutorial/<セクション名>/<プログラム名>/***.go`のようになります。

講師側が説明で用いるソースコード（答え）は、`/go/src/samples/<セクション名>/<プログラム名>/***.go`の形で格納してあります。
講師側が想定している出力結果を確認したい際は、`/go/src/samples/`配下を実行することで、容易に確認できます。
また、ハンズオンがうまく行かない際には、以下のように差分を確認することで、課題解決を助ける可能性があります。

```
:# TERMINAL 0
$ diff /go/src/go_tutorial/<セクション名>/<プログラム名>/***.go /go/src/samples/<セクション名>/<プログラム名>/***.go
```

今日は以上です。
ありがとうございました。

次のPart 2は「Hello, Worldを作る」です。
よろしくお願いいたします。
ubuntu(virtual box)にmozc(日本語入力)をインストールしてみた

参照サイト
https://novicengineering.com/ubuntu_mozc_install/

# 下記コマンドを実行
```console:console
sudo apt install ibus-mozc 
gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'jp'), ('ibus', 'mozc-jp')]"
```

# 日本語入力できるようになった
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/2c9c8e4b-7d79-6f74-499a-bf933b02250f.png)
【Mac】絵文字を検索して入力する

# はじめに
MacBookを使用しているのですが、最近、絵文字の検索&入力方法を知ったので記事にしておきます。

# やりかた
`control` + `command` + `space`

![スクリーンショット 2023-08-24 20.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8b7a25ea-7f3c-c1cd-59f6-96d5f732eda6.png)

# おわり
変換で出てきた絵文字しか使えないって状態で何年も過ごしてました、、、
[Flask]生成したオブジェクトをリクエストを跨いで使いまわしたい

アプリケーションレベルで値を使いまわす為にはアプリケーションのコンテキストを使用する。
Flaskではアプリケーションコンテキストには以下の2つが提供されている。
| コンテキスト | 生存期間 |
| ---- | ---- |
| g | リクエスト単位 |
| current_app | アプリケーション単位 |

gだとリクエストを跨いだ使いまわしは出来ないので今回はcurrent_appを使用する

```python
from flask import Flask, current_app

app = Flask(__name__)


class Sample(object):
    def getObj(self):
        with app.app_context():
            if getattr(current_app, 'obj', None) is None: #オブジェクトの存在チェック
                current_app.obj = #使いまわしたいオブジェクトの生成

            return current_app.obj

```
Node.jsのprocessって何なのさ

## 概要
 nodeとは、javascriptを実行するためのホスト環境のこと。
 Node.jsのprocessモジュールを使うと、nodeに関連する情報を取得したり、nodeの動作を制御したりすることができる。

## 具体例
### 環境変数にアクセスするprocess.env
nodeで環境変数にアクセスするにはprocess.envを利用する。
下記のコードを`peocess.js`ファイルに記載し、試しにホスト環境の環境変数を表示してみる。
```javascript
console.log(process.env);
```
`node peocess.js`で実行すると下記結果となった。
```
{
  COLORFGBG: '15;0',
  COLORTERM: 'truecolor',
  COMMAND_MODE: 'unix2003',
  HOME: '/Users/***',
  ....以下環境情報が続く...
}
```
### process.envから.envファイルを参照できるようにする
このままでは同じ階層に.envファイルを設置しても.envファイルの中身を参照できない。
.envファイルの中身を参照するには、`dotenv`ライブラリがインストールされている必要がある。
`npm i dotenv` でdotenvライブラリをインストール。
.envの中身が参照できているのか確認するため、下記ファイルをそれぞれ準備する。

- sample.js
```javascript
const dotenv = require('dotenv').config();
console.log('ENVの中身:', process.env.NAME);
```
 - .env
```
NAME=YAMADA
```
`node sample.js`を実行し、結果を確認する。

<b>ENVの中身: YAMADA</b>

と出力されていれば、問題なく参照ができている。

### processモジュールで特定の環境情報を表示
processは.env以外にも下記のような使い道があるので紹介する。
```javascript
// 作業ディレクトリを表示する
console.log(process.cwd());

// 使用中のOSを表示する
console.log(process.platform);

// アプリケーションの実行時に渡された引数を表示する
console.log(process.argv);

```
### processモジュールでプログラムの終了時に通知を受け取る
下記のように、アプリケーションの終了をトリガーとしてコードを実行することも可能。
```javascript
process.on('exit', code => {
    // processの終了をトリガーとして実行される。
	console.log('Exited with status code:', code);
});
// processが終了した際に出力される。
console.log('Execution Completed');
```
LinuC 300取得した感想

先月LinuC300を取得したので記録を残しておきます。
完全に自分用のメモ書きです。

 ## 試験概要
資格名: LinuCレベル3 300 Mixed Environment
受験料: 15400円(ping-tのバウチャーを使用)

 ## 勉強期間
約2週間


 ## 教材
ping-tの問題集とコマ問
黒本　https://www.amazon.co.jp/gp/product/B00MHC81ZU
LPI-Japanの練習問題

## 取得理由
僕「LinuCレベル2取ったしレベル3どれか取るかぁ…」

## 勉強方法
最初はping-tの問題集の解説を読んで理解を進め、2週目からはコマ問も併せて解く。
ping-tのコンテンツが終わったら黒本(問題集)を解く。もちろん解説も読む。
黒本が終わったらLPI-Japanの練習問題を解く。ために解説が解説になってない問題もあるが一応読む。
受験2日前と前日に黒本の模擬試験を1回ずつ行う。

環境作って実際にコマンドを実行するとか、構築してみる等は一切行わなかった。


## 資格の難易度
LinuCの最上位レベルであるレベル3と言う立ち位置だがレベル1やレベル2と比較すると範囲自体は狭い。理由は特定の題材、今回の300で言えばLinuxとWindowsの混合環境(?) についてを掘り下げるため。
なので様々なジャンルを覚える必要があるレベル2、特に201よりは確実に勉強しやすかった。また、300を取得して約1か月経つ現在LinuC 304の勉強をしているのだが、この範囲が狭いことによって勉強がしやすいのは304でも変わらないのでこれはLinuCレベル3共通なのかもしれない。


 ## 所感
試験勉強を行う以前に「SAMBAをADに参加させる」や「Windows + SAMBA + LDAP」の連携は軽く触ったことがあったのでいきなり問題集を読んでもある程度理解はできた。
勉強方法のとこでも書いたが環境を作って実際に構築するといった実践的なことは一切やってない完全な暗記で挑んだため、1か月経った今受けろと言われたら全く自身がない。
Bizrobo Cron(クーロン）設定　偶数月または奇数月で実行するには（隔月でスケジュール設定したい場合にも）

今回はBizroboをManagement Console にアップロードしスケージュール設定をする際に
偶数月や奇数月として稼働するように設定する方法について解説していきたいと思います。

隔月で実行したい場合や、その他のスケジュールにも役立つ設定となります。


## Bizroboのクーロン設定
結論、下記のように設定すると偶数月のスケジュール設定が可能となります。
![cron3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/3767baef-c24b-aaf5-9ec6-3fee8865bd5c.png)



```
0 0 8 1-5 2/2 ? 
```

下記は偶数月の1～5日の8：00に実行となりますが、
見慣れない人はよくわからないかもしれません。


順番に見ていきましょう。
まずは、

「秒」 「分」 「時」 「日」 「月」 「曜日」 「年（オプション）」となりますので、

```
0 0 8
```
ここまでで、
0秒　0分　8時となりますので
８時ジャストに実行となりますね。

次に
```
0 0 8 1-5 
```
まで見ていきましょう。
「秒」 「分」 「時」 が先ほどまでの８時ちょうどでしたね。
「秒」 「分」 「時」 「日」ときますので、
次は「日」です。
1-5
というのは1～5日までを表します。

そのため
ここまでで、1～5日の8：00に実行ということがわかりました。


そして
```
0 0 8 1-5 2/2 ?
```
までを見ていきましょう。

月部分が2/2となる部分についてですが、
”/”はインクリメントを示します。
インクリメントというのは増分です。

2月から2ずつインクリメントすれば、
1か月おきになります。

```
0 0 8 1-5 2/2 ?
```
例えば、
上記の2月1～5日の8時に実行された場合、
次は2月部分に2が増えるので、
次回実行は、4月1～5日の8時に実行される形となります。

それによって偶数月（隔月）実行が可能ということになります。

最後の？については、
年の指定となりますが、”？”は指定なしとなりますので、
毎年実行ということになります。



## まとめ



BizroboのCron設定で偶数月（隔月）実行する方法についてでした。

Cron設定は、柔軟なスケジュール設定には欠かせませんので、
ぜひいろいろな工夫をしてみてください。

最後までご覧いただきありがとうございます。
Unity コンポーネントの取得&内部要素変更方法メモ

Unityには`GameObject`や`Component`という要素が存在します

`GameObject`は機能を持たない部品の側です、これに`Component`を追加することで様々な機能をもつことができます

`Component`の例を以下に示します (https://www.f-sp.com/entry/2015/11/20/160005 より引用)
```
カメラ(Camera) ...
ライト(Light) ...
レンダラ(Renderer) ...
コライダ(Collider) ...
リジッドボディ(Rigidbody) ...
ジョイント(Joint) ...
キャンバス(Canvas) ...
テキスト(Text), イメージ(Image), ボタン(Button), etc.
```

Unityのスクリプトにはこのような`Component`を取得する関数が存在し、`Component`自体の制御を行う仕組みが用意されています。

本記事では、この`Component`へのアクセスを行うための関数について整理していきたいと思います。

調査したり使う場面が合った場合に随時追記していく

# `GameObject.GetComponent`


公式リファレンス

https://docs.unity3d.com/ja/2019.4/ScriptReference/GameObject.GetComponent.html


定義型

```
public Component GetComponent (Type type);
```

## サンプル

```c
using UnityEngine;

public class GetComponentGenericExample : MonoBehaviour
{
    void Start()
    {
        HingeJoint hinge = gameObject.GetComponent<HingeJoint>();

        if (hinge != null)
            hinge.useSpring = false;
    }
}
```


## サンプル2

(https://yttm-work.jp/unity/unity_0012.html より) 
Scriptを取り付けたゲームオブジェクトに`MeshRenderer`コンポーネントがある時にそれを取得するコード
`MeshRender`は`Cube`にもデフォルトでついていおり、色を表現してくれます

```
	// ゲームオブジェクトに格納されているMeshRendererを取得
	MeshRenderer mesh = GetComponent<MeshRenderer>();

	// MeshRendererのメンバであるマテリアルの色を変更
	if (Input.GetKeyDown (KeyCode.Z) == true) {
		mesh.materials[0].color = Color.blue;
	} else if (Input.GetKeyDown (KeyCode.X) == true) {
		mesh.materials[0].color = Color.red;
	}
```


# 文字の画面表示
## TextMehsPro
`GameObject` > `UI` > `TextMeshPro`から文字表示用のゲームオブジェクトをUnityの画面に生成する.

生成後,`Hierarchy`の`Canvas`内に`Text(TMP)`というオブジェクトが生成される.
以下のようにスクリプトを作製し,text_object内に上記`Text(TMP)`オブジェクトを設置する.
スクリプトはそのオブジェクト内の`TextMeshProUGUI`コンポーネント取得し,Update関数内でtext要素にhelloという文字列をいれる.そうすると表示される文字列がhelloに変化する.

```
using TMPro;

public class AAA : MonoBehaviour
{

  public GameObject text_object;
  TextMeshProUGUI text_component;

  
  void Start()
  {

     text_component = text_object.GetComponent<TextMeshProUGUI>();
     
  }
  void Update()
  {

    text_component.text = "hello";
  
  }
}
```
include したモジュールのインスタンスメソッドは特異メソッドのように呼び出せる

## 概要

Ruby では、モジュールに定義されている特異メソッドは ```モジュール名.メソッド名``` で実行出来るがインスタンスメソッドではこれは出来ない。しかしモジュールを include するとインスタンスメソッドも同じやり方で実行出来るようになる。もし method_missing を期待している場合は注意が必要。

## 環境

- Ruby 3.2.2
- irb 1.7.4


## 背景

モジュールで、method_missing 内で反応する特異メソッドを定義して、その特異メソッドを呼び出す同名のインスタンスメソッドを定義した。だけど、そのモジュールを include したら ```モジュール名.メソッド名``` の形でも同名のインスタンスメソッドが優先して実行されるようになって困った。[^1]

[^1]: もう少し細かく言うと Ruby 版の PyCall を使ったモジュールを作っているとき遭遇した。PyCall では Python 側のメソッドを最初に動かすときは、まず method_missing を呼んで、Python 側で実行可能なメソッドであればそれを呼び出す特異メソッドを Ruby 側のモジュールに定義する仕組みになっているらしい。いま作っているモジュールでは、そのモジュールを include したらモジュール名を省略してメソッドを実行したいのでインスタンスメソッドでラップしようと思ったら無限ループになってコケた。

## 実例

それっぽいモジュールを定義する。

```Ruby
module Human
  def self.method_missing(name, *args)
    if name.to_s == "hello"
      "hello! (singleton)"
    else
      super
    end
  end

  # 無くても動くけど作法に従った感じで
  def self.respond_to_missing?(symbol, include_private)
    return true if symbol.to_s == "hello"
    super
  end

  def hello
    "hi! (instance)"
  end
end
```

例えばこれを読み込んで irb で実行してみると次のようになる。
```irb
irb> Human.respond_to?(:hello)
=> true
irb> Human.hello
=> "hello! (singleton)"
```

しかしモジュール ```Human``` を include したあとに ```hello``` を呼ぶとインスタンスメソッドの方に取られる。
```irb
irb> include Human
=> Object
irb> hello
=> "hi! (instance)"
irb> Human.hello
=> "hi! (instance)"
```
なのでモジュールを include したあとでも同じ動作を期待しているのなら注意する必要がある。

ちなみに後からでもきちんと特異メソッドを定義すれば同名でもそちらの実行が優先されるようだ。irb で上に続いて以下を実行すると特異メソッドが呼ばれる。
```irb
irb* module Human
irb*   def self.hello
irb*     "hey! (new)"
irb*   end
irb> end
=> :hello
irb> Human.hello
=> "hey! (new)"
irb> hello
=> "hi! (instance)"

```

include 事情に詳しく無いせいだと思うけど何だか不思議な挙動。
[Go]string、Rune、コードポイント、[]byteの差異について

各概念の説明は参考ページにわかりやすく記述されていますのでそちらをご参照ください。
ここでは、概念の違いに注目して理解を深めることや端的に表現することを目的としています。

## byte型とstring型について

```go

var scentence string

//スライス作成←scentence[index]はbyte型：1byteごとに区切られる

codePointPre := []byte{scentence[index]}　//[]byteにコードポイントが格納される


//バイト配列へ変換←scentence[index:index+1]はstring型

codePointPre := []byte(scentence[index:index+1]) //[]byteにコードポイントが格納される
```

1.Goが準拠するUTF-8は可変長エンコーディング。
文字列にインデックスでアクセスしたときに得られるbyte値は1byteごとであるので、scentenceは英数字の場合にのみ対応。マルチバイト（かなカタカナ漢字）にはstringをbyteにキャストして扱うのは容易ではない。

stringと[]byteが1対1対応でないので、相互にエンコード＆デコードしたときに結果が一致しない。一方通行の変換となる。


```go
package main

import (
	"fmt"
)

func main() {
	var s1 string = "あ"
	var b1 []byte = []byte(s1) // byte型に変換
	fmt.Println(b1) // [227 129 130]

	s2 := string(b1) // 文字列型に変換
	fmt.Println(s2) // あ
}


```

そのためutf8.DecodeRuneInString関数を使用して、UTF-8エンコードされた文字を正しくデコードし、そのUnicodeコードポイント（rune）を返します。

```go
r, size := utf8.DecodeRuneInString(sentence[index:])
```

## Runeとコードポイントについて
コードポイント＝Rune＝int32

## string型と[]byteについて
Go言語のstring型は、内部的にはUTF-8エンコーディングされたバイト列として格納

## []byteとRune/コードポイントについて
エンコード、デコードによって変換できる

## 参考
https://qiita.com/seihmd/items/4a878e7fa340d7963fee
https://zenn.dev/nakabonne/articles/cc0cde2bd94639
https://ferret-plus.com/7006
https://pkg.go.dev/unicode/utf8#DecodeRuneInString
JavaScript：Promiseを使い、並行処理のサンプル

## 前書
* 自分勉強のメモ、ご参考まで
* 参考：https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

## Promise.allのサンプル

###### サンプルソース：
```javascript:MultiAsyncCalls.js
var aaa = aaa || {};
(function (global) {
  var _ = aaa; // namespace

  var asyncCall1 = function () {
    return new Promise((resolve) => {
      setTimeout(() => {
        console.log('asyncCall 1 ...');
        resolve('resolved');
      }, 5000);
    });
  };

  var asyncCall2 = function () {
    return new Promise((resolve) => {
      setTimeout(() => {
        console.log('asyncCall 2 ...');
        resolve('resolved');
      }, 4000);
    });
  };

  var asyncAll = function () {
    const p1 = asyncCall1();
    const p2 = asyncCall2();
    return Promise.all([p1, p2]);
  };

  _.main = async function () {
    await asyncCall1();
    await asyncCall2();
    console.log('-----------------');

    await asyncAll();
    console.log('over');
    return 0;
  };
}(this));

aaa.main();
```
###### 実行結果：
```console
// 順番実行結果
asyncCall 1 ... // 5秒
asyncCall 2 ... // 9秒
---------------------------
// 並行実行結果
asyncCall 2 ... // 4秒
asyncCall 1 ... // 5秒
over
```

## 後書
* Promise.all：すべて成功完了なら、成功完了になる。いずれか失敗完了なら、失敗完了。
* Promise.allSettled：すべて実行完了を待つ。結果status,value,reasonを返し、成功/失敗を判断。
私“たち”のお気に入りガジェット

# はじめに
[100万人に届けたい！私のお気に入りガジェット](https://qiita.com/official-events/8644e9719b0040cc1817)イベントへの参加記事です。
せっかくならと思い、社内でメンバーを募って雑談形式でガジェットを紹介し合ってみました。
その雑談の中で出たものを簡単にですが紹介していきます。

## テレワーク系

### キーボード

https://kopek.jp/products/keychron-k8-jp/

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660601/ec2ab9f4-b76c-2883-19ef-a044a1c6ef28.png">


　有線/無線で接続先を切り替えれるため、私物のPCと社給のPCで共有できて省スペース化。

### マウス

https://www.logicool.co.jp/ja-jp/products/mice/mx-master-3s.910-006567.html

　カスタマイズ性が高いのに加え、テレワーク用として私物と社給のPCの切り替えがボタン一つでできて便利。

### USB切替

https://www.amazon.co.jp/dp/B072R16Z6S

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660601/4bb7bb82-8cc8-b1b6-2f26-a70c7858cbfd.png">

 AmazonオススメのUSB切り替え機。こちらも私物PC/社給PCでマウスやキーボードを共有。

### HDMI切替

https://www.amazon.co.jp/dp/B09QL3ZRH2

<img width="400" alt="image.png" src="https://m.media-amazon.com/images/I/51hD8mDnmkL.__AC_SX300_SY300_QL70_ML2_.jpg">

 私物PC/社給PCのHDMI出力を切替え、ディスプレイを共有。
### スピーカマイク

https://emeet.co.jp/products/speakerphone-luna

https://www.poly.com/jp/ja/products/phones/sync/sync-20

 USBでPCに接続、Bluetoothでスマホに接続。ハンズフリーで電話もWeb会議もできて便利。

### ディスプレイ

https://www.lenovo-smb.com/productinfo/model.php?mtm=62A3UAR1JP&_ga=2.115195650.405250450.1692682616-558765107.1692682616&_gl=1*sqhflf*_ga*NTU4NzY1MTA3LjE2OTI2ODI2MTY.*_ga_6BEGX0B99Y*MTY5MjY4MjYxNi4xLjEuMTY5MjY4MjY2Mi4xNC4wLjA


<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660601/a416de4e-65d6-70b2-0a5b-10b45d0220d0.png">

　サブティスプレイとして外出時やテレワーク時に利用。ケーブル1本で使えるので持ち運びも簡単。


### 電動昇降式テーブル

https://www.flexispot.jp/?gclid=Cj0KCQjw_5unBhCMARIsACZyzS0URD29b40eVn-Web7Mo1IJFPJTDAloZ9cfP_uSGibUd2ldMptRzIwaAupAEALw_wcB

<img width="400" alt="image.png" src="https://m.media-amazon.com/images/I/51O9uq3aDoL._AC_SX679_.jpg">

腰痛や眠気対策に立って仕事をするのに便利。


#### 目隠しシール

https://kurashitofuwatto.com/31672

 Webカメラ等につけてセキュリティ対策。意図しないカメラ起動の対策にも有効。

#### 放熱スタンド

https://k-tai.watch.impress.co.jp/docs/column/todays_goods/1347157.html

 ノートPCの放熱用に。コンパクトで持ち運びも簡単。



## Home IoT系

### スマートディスプレイ

https://www.amazon.co.jp/dp/B08MQNJC9Z

<img width="400" alt="image.png" src="https://m.media-amazon.com/images/I/71IPJn2jKHL._AC_SX679_.jpg">

　大画面でAlexaやFireTVの機能を使え、他のIoT機器との連携もできて便利。

### NAS

https://www.synology.com/ja-jp/products/DS220+

 写真共有用のNASとして利用。公式のパッケージを入れると色々なサーバとして利用可能。
 PythonやDockerなども動きます。

### スマートリモコン

https://nature.global/nature-remo/nature-remo-mini/

https://www.switchbot.jp/pages/switchbot-hub-mini

 リモコン操作の家電をまとめてIoT化。Alexa等と連携して音声操作も可能。

### スマートタグ

https://www.ankerjapan.com/products/t87b0

かばんやスマートフォンにつけれる小型のタグを紛失防止用に利用。

### IPカメラ

https://www.atomtech.co.jp/products/atomcam2

防犯カメラとして利用。防水なので屋外でも利用可能。


### スマートロック

https://jp.candyhouse.co/

https://www.switchbot.jp/pages/switchbot-lock

 鍵を持ち歩かなくても、指紋やスマートフォンで施錠/開錠が可能。
 子供がカギをよく無くすので、指紋認証でキーレス化することで紛失防止にも。


# さいごに

仕事面も生活面もより便利にしていけるといいなと思い、雑談形式で紹介しあう場を設けてみました。
やはり、実際に使った感想を聞くことで、より具体的に利用イメージを掴むことができました。
他の記事も呼んで参考にしたいと思います。
twitter メモ

# twitter

```plantuml
@startuml

title: twitter

collections リストコレクション [
    リストコレクション
    --
    リスト
    <検索結果 リスト>
]

collections アカウントコレクション [
    アカウントコレクション
    --
    リスト
    <リストへ登録済みアカウント>
    ..
    フォロー
    <対象アカウントがフォロー中のアカウント>
    ..
    フォロワー
    <対象アカウントをフォロー中のアカウント>
    ..
    ユーザー
    <検索結果 アカウント名前>
]
card アカウント [
    アカウント
    --
    ID
    名前
    アイコン画像
    背景画像
    生年月日
    場所
    自己紹介
    webサイト
    作成日時
    ..
    凍結
    ..
    電話番号認証済み
    ..
    ビジネスアカウント
    公的機関アカウント
]

card ダイレクトメッセージ [
    ダイレクトメッセージ
    --
    メッセージ
    送信者
    受信者
    送信日時
]

collections 通知コレクション[
    通知コレクション
    --
    すべて
    ..
    認証済み
    ..
    @ツイート
]
card 通知 [
    通知
    --
    通知先アカウント
    通知日時
]

card tweet [
    tweet
    --
    本文
    投稿者
    投稿日時
    リツイート数
    いいね数
    ブックマーク数
    表示数
]
collections tweetコレクション [
    tweetコレクション
    --
    自タイムライン
    おすすめ
    フォロー中
    ..
    アカウントのツイート一覧
    ..
    アカウントの返信含むツイート一覧
    ..
    アカウントのいいね済みツイート一覧
    ..
    アカウントのブックマーク済みツイート一覧
    ..
    話題のツイート
    <検索結果 話題のツイート>
    ..
    最新
    <検索結果 最新>
    ..
    メディア
    <検索結果 ツイート中にメディア含む>
]

card ハッシュタグ [
    ハッシュタグ
]

card トピック [
    トピック
    --
    トピック名
]

card トレンド [
    トレンド
    --
    ジャンル
    順位
]

card ワード [
    ワード
    --
    投稿数
]

リストコレクション - アカウントコレクション
アカウントコレクション - アカウント
アカウント -- tweet: 投稿、削除、いいね、ブックマーク
アカウント -- アカウント: フォロー、ブロック、ミュート
tweetコレクション - tweet
tweet -- tweet: 引用、返信
tweet -- ハッシュタグ
トピック -- tweet

アカウント -- 通知
通知コレクション - 通知
トレンド -- ワード

アカウント -- ダイレクトメッセージ
トピック -- アカウント: 興味のある



@enduml
```
常にManaged ID 認証でOpen RowsetするViewを作りたいときに使うサンプル

```sql:sql

CREATE DATABASE [cred_test] 
    COLLATE Latin1_General_100_BIN2_UTF8; -- お好みで
    -- https://techcommunity.microsoft.com/t5/azure-synapse-analytics-blog/always-use-utf-8-collations-to-read-utf-8-text-in-serverless-sql/ba-p/1883633
GO
USE [cred_test]
GO


-- CREATE DATABASE SCOPED CREDENTIALに必要
CREATE MASTER KEY    
GO

-- ストレージアカウントに接続する際に利用する資格情報を作成

CREATE DATABASE SCOPED CREDENTIAL [cred_synapsemsi]
WITH IDENTITY = 'Managed Identity'
GO

-- ストレージアカウントに対する接続を作成

IF NOT EXISTS (SELECT * FROM sys.external_data_sources WHERE name = 'msi_datalake_enrich')
    CREATE EXTERNAL DATA SOURCE [msi_datalake_enrich]
    WITH(
        CREDENTIAL = [cred_synapsemsi],
        LOCATION = 'https://testaccount.dfs.core.windows.net/30-enrich'
    )

--作成した接続を使用してクエリを行うと、クエリを実行したユーザーではなく、作成した資格情報＝Synapse の権限でストレージアカウントにアクセスし、ユーザーにストレージアカウント上の権限を不要とできる

SELECT
    TOP 100 *
FROM OPENROWSET(
    BULK '/Refined/',
    DATA_SOURCE='msi_datalake_enrich', --> Root URL is in LOCATION of DATA SOURCE
    FORMAT = 'DELTA'
    ) AS [result]

```
【備忘録】Viteでlocalhostへの接続がうまくいかないときの対処法

# 事の始まり


[Viteの公式サイト](https://ja.vitejs.dev/config/server-options.html)をみて、下のようにProxyの設定をしていたのだが、`Error: connect ECONNREFUSED ::1:48383`となっていて接続できない

```ts
export default defineConfig({
  server: {
    open: true,
    proxy: {
      "/api": {
        target: "http://localhost:48383/",
        changeOrigin: true,
      },
    },
  },
  plugins: [react()],
});
```

## 結論

NodeがデフォルトでIPv6を使うようになったので`[::1]`にアクセスしているせい
というよりよく見ると普通に`::1:48383`と書いてある

## 対処法
このコードを入れてIPv4でアクセスするようにする
```ts:vite.config.ts
import dns from "dns";
dns.setDefaultResultOrder("ipv4first");
```
rubyでVertexAIの テキスト分類（マルチラベル）

テキスト分類（マルチラベル）の VertexAI のエンドポイントに対して
オンライン予測のリクエストを投げます。

GEM をインストールして、

```bash
gem install google-cloud-ai_platform-v1
```

以下を実行する。

# 認証

```ruby
require "google/cloud/ai_platform/v1"

::Google::Cloud::AIPlatform::V1::PredictionService::Client.configure do |config|
  config.credentials = "path/to/keyfile.json"
end
```

参考：https://github.com/googleapis/google-cloud-ruby/blob/main/google-cloud-ai_platform-v1/AUTHENTICATION.md

# リクエストを投げる

```ruby
require "google/cloud/ai_platform/v1"

ENDPOINT_ID = "作成したモデルのID"
PROJECT_ID = "GCPのプロジェクトID"
LOCATION = "モデルがあるリージョン"

prediction_client = Google::Cloud::AIPlatform::V1::PredictionService::Client.new do |config|
  config.endpoint = "#{LOCATION}-aiplatform.googleapis.com"
end


instance = Google::Protobuf::Value.new(:struct_value => {:fields => {:content => {:string_value => "送りたいテキスト"}}})
model_full_id = "projects/#{PROJECT_ID}/locations/#{LOCATION}/endpoints/#{ENDPOINT_ID}"
@result = prediction_client.predict Google::Cloud::AIPlatform::V1::PredictRequest.new(endpoint: model_full_id, instances: [instance])

p @result
```

リクエスト作るところが分からなくて泣きそうでした。

参考
https://cloud.google.com/ruby/docs/reference/google-cloud-ai_platform-v1/latest/Google-Cloud-AIPlatform-V1-PredictionService-Client
https://stackoverflow.com/questions/72827960/how-to-get-image-classification-prediction-from-gcp-aiplatform-in-ruby
Django + mysql： transaction.atomic() で select_for_update() を使ってレコードをロックしたときのメモ

### 結論
以下のコードでmysqlでもtransaction.atomic()でレコードのロックができた
```python
from django.db import transaction, connections

with transaction.atomic(using="database_name"):
    connections["database_name"].cursor().execute("BEGIN") # <-- ここ
    target_user = User.objects.select_for_update().get(id=1)
    target_user.name = "name"
    target_user.save()
```

### やりたかったこと
djangoでデータベースのレコードをロックして悲観的排他制御を実装したかった

### 環境
Django 3.2.12
Python 3.6.15
Mysql 5.7.41

### 内容
まずデータベースでレコードをロックするために sql では、
```sql
$ BEGIN                   <-- トランザクション開始
$ SELECT **** FOR UPDATE  <-- テーブル、レコードのロック
$ UPDATE ****             <-- 更新
$ COMMIT                  <-- トランザクション終了
```
のように `BEGIN`で始まり`COMMIT`で終わるトランザクション内で、`FOR UPDATE`を実行する必要がある

そして、Djangoでレコードをロックするには以下のようにすれば良いといろんな記事に書いてあった。
```python
from django.db import transaction

with transaction.atomic(using="database_name"): # <--トランザクション開始
    target_user = User.objects.select_for_update().get(id=1) # <--ロック
    target_user.name = "name"
    target_user.save() # <--更新
# <-- トランザクション終了
```
しかし、このコードを実行してもレコードはロックされず、データベースのsqlのログを確認すると、以下のように`BEGIN`が実行されていなかった。
```sql
$ SELECT **** FOR UPDATE
$ UPDATE ****
$ COMMIT
```
つまり`with transaction.atomic(using="database_name"):`で`BEGIN`が実行されていなかった。

ライブラリ（django.db.transaction）のコードを読むと、transaction.atomic()ではsettings.pyで指定したデータベースエンジンごとにトランザクションを開始しようとしていることがわかった。

django.db.backends.base.base の BaseDatabaseWrapper の set_auto_commit() メソッドでそれぞれのデータベースエンジンごとのトランザクション開始方法に従って処理を実行するようだった。

django.db.backends.*** （***はmysql, sqlite3など）をみてみると BaseDatabaseWrapper を継承しており、mysqlのクラスには`BEGIN`を実行するコードがなかった（sqlite3にはあった）

なので、transaction.atomic()で使われているconnection.cursor()を使って`BEGIN`を実行すれば問題なさそう。

`connections["database_name"].cursor().execute("BEGIN")`を追加し、解決。

### 思ったこと
そもそも、mysqlでは`BEGIN`が利用できるはずなのに、なぜ実行されていなかったのかわからない。
何か他に正しい解決方法がありそう。。。。
Maps JavaScript APIを使って地図が表示されない原因(更新の予定あり)

# 結果
・VScodeでファイルをブラウザで開く際に、Live Serverで開くべきところを相対パスで開いてたから。

# 経緯
・google plat formの[マーカーが配置された Google マップをウェブサイトに追加する](https://developers.google.com/maps/documentation/javascript/adding-a-google-map?hl=ja&authuser=1#maps_add_map-javascript)のサイトでJS,HTML,CSSのコードをコピペしたのにブラウザの検証ボタンで以下のエラー文が出たので

Access to script at 'file:///Users/eoiso/projects/google_mapTest/example/index.js' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome, https, chrome-untrusted.

<b>chatGPTに聞いてみた</b>
>このエラーメッセージは、ブラウザの同一オリジンポリシー（Same-Origin Policy）に違反する試みを示しています。ブラウザはセキュリティのため、異なるオリジンからのリクエストを制限しています。エラーメッセージにあるように、クロスオリジンリクエストは特定のプロトコルスキームでのみサポートされています。
エラーメッセージの内容を見る限り、問題はファイルのプロトコルスキームが file:// で始まっているために発生しています。これはローカルファイルからウェブ上のスクリプトにアクセスしようとした場合に発生することが一般的です。しかし、ウェブブラウザはセキュリティ上の理由から、ローカルファイルからのクロスオリジンリクエストを許可しません。

<b>アドレスがhttpから始まらないとセキュリティ的に安全ではないからgoogle mapが表示されないと思い、調べたらLive Serverにたどり着く。</b>

# やりたいこと
・Maps JavaScript APIを使ってgoogle mapを表示させたい。

# 学んだこと
・API
・相対パス
・Live Server
・相対パスとLive Serverの違い
# API
・Application Programming Interfaceの略。
・APIは企業や個人が作成でき、利用できる:
>APIはソフトウェアやサービスの機能やデータにアクセスし、それを他のアプリケーションやサービスから利用できるようにするプログラムインターフェースです。企業や個人がAPIを作成して提供し、他の開発者やアプリケーションがそれを利用できる。

・例えば、Google MapsのAPIを利用すれば、企業や個人のサイトでGoogle Mapsと同じ機能を使えたり、Google Mapsのピンなどをカスタマイズできる:

>Google Maps APIを使用すると、企業や個人のウェブサイトやアプリケーションでGoogle Mapsの機能を統合できます。これにより、カスタム地図の表示、ピンの追加、経路の計算、場所の検索などの機能を利用できる。また、Google Maps APIを使用することで、地図の外観や挙動をカスタマイズすることも可能です。
ただし、APIの利用には通常、APIキーなどの認証情報が必要であり、利用に際してはAPIプロバイダーの利用規約に従う必要があります。また、APIの制限や料金体系にも注意が必要です。 APIの詳細な情報は、APIプロバイダーのドキュメンテーションや利用規約を確認することが重要です。

# 相対パス
>・相対パスは、ウェブページ内のリンクやリソース（画像、スタイルシート、スクリプトなど）を指定するための方法。
・相対パスは現在のファイルからリンク先までのパスを示す。
・相対パスは通常、現在のウェブページやファイルの場所に基づいてリソースにアクセスするために使用される。
例）
../images/picture.jpg のような相対パスは、現在のフォルダから親フォルダに移動して images フォルダ内の picture.jpg にアクセスする。

# Live Server
・Visual Studio Code（VSCode）の拡張機能の一つ。
>・Live Serverは、ウェブ開発の際に便利なツールやエクステンションの一つ。
・一般的に、Live Serverは開発者に対してローカルのウェブサイトを実行し、ライブでプレビューできる機能がある。
・Live Serverは通常、インストールされたテキストエディタや統合開発環境に統合される。
・プロジェクトのファイルや変更を監視し、ブラウザでリアルタイムにプレビューできる。
・Live Serverを使用することで、ウェブページの変更を保存するたびに手動でリロードする必要がなくなり、開発プロセスが効率的になる。

・[Live Serverの参考にした記事](https://webdesign-trends.net/entry/14461#Live_Server-2)


# 相対パスとLive Serverの違い
>・「Live Server」は開発プロセスのツールであり、ローカルでウェブページを実し、ライブでプレビューできるようになる。
一方、相対パスはファイルやリソースの場所を指定する方法です。
・Live Serverは開発中のウェブサイトのプレビューに役立ち、変更をリアルタイムで反映できる。
・相対パスは、ウェブページ内のリンクやリソースの場所を指定するために使用され、ウェブサイトのファイル構造に依存する。
・Live Serverは開発者の作業効率向上に寄与しますが、相対パスはウェブページの正しい構築に必要。

・まとめ
>一般的に、開発中には「Live Server」のようなツールを使用してプレビューし、相対パスを使用してウェブページ内のリンクやリソースの場所を指定します。

# 成果
・google map表示できた！
![スクリーンショット 2023-08-24 18.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/3121c331-5947-8e06-5421-b2e7bdb87bf1.png)
当たり判定 pygame

# システム
当たり判定は四角のブロックで行う、２つのブロックが存在し、二つは動くことができるとする
その時物体が重なると、必ず、どちらの角も、重なることになる

ゆえに、物体の角がもう一つの物体の範囲内またはそのもう一つの物体の角が物体の角にあれば、
物体は重なり、当たったことになる
# プログラム
```python
def collision(self, x, y, w, h):
        return (((self.rect.x < x and self.rect.w + self.rect.x > x) or (self.rect.x < x + w and self.rect.w + self.rect.x > x + w)) and 
                ((self.rect.y < y and self.rect.y + self.rect.h > y) or (self.rect.y < y + h and self.rect.y + self.rect.h > y + h)) or 
                ((x < self.rect.x and x + w > self.rect.x) or (x < self.rect.x + self.rect.w and w + x > self.rect.x + self.rect.w)) and
                ((y < self.rect.y and y + h > self.rect.y) or (y < self.rect.y + self.rect.h and h + y > self.rect.y + self.rect.h)))
```
物体にこの関数を持たせて、メイン処理の時、衝突を検知させたい、物体の座標をx y w hで入力し、呼び出すといい
物体が重なったときのみTrueを返す
# さいごに
これはブロック型の物体でしか正しく検知されない
円形の物体の場合は、c ^ 2 = a ^ 2 + b ^ 2を使うといい
国土数値情報の「行政区域コード」と「全国地方公共団体コード」の対応関係について

# 結論：両者前方5文字で一致、6文字目は無視してもよい
行政区域コードは、全国地方公共団体コードの6文字目を除外した数字である。

# 背景
国土交通省が運営してくださっています、国土数値情報ダウンロードサービスでは、行政区域（市区町村の形状）を行政区域コードという5桁の数値で管理しています。
一方で、総務省が公開している市区町村別の人口データでは、6桁の全国地方公共団体コードが使われています。
# 目的
この2つの異なるコードの仕様を理解し、両者を双方向で索引することを実現したいです。
これにより、国土交通省が提供する空間情報と総務省の統計情報を結合して分析することが出来ます。
# 調査結果
２つのコードの仕様について、調査の結果を示します。
## 行政区域コードの仕様
>総務省の団体コードは6桁で指定されていますが、国土数値情報の行政区域コードは団体コードの6桁目を削除した5桁で作成されています。

引用元： [国土数値情報ダウンロードサイト](https://nlftp.mlit.go.jp/ksj/gml/codelist/AdminiBoundary_CD.xlsx)

## 全国地方公共団体コード

6桁のコードの構造の説明
>全国地方公共団体コードは、５桁のアラビア整数に、１桁の検査数字を加え、６桁とする。 

6桁目の検査数字の仕様
>第１桁から第５桁までの数字に、それぞれ６．５．４．３．２を乗じて算出した積の和を求め、その和を１１で除し、商と剰余（以下「余り数字」という。）を求めて、１１と余り数字との差の下１桁の数字を検査数字とする。

引用元:[ 総務省 全国地方公共団体コード](https://www.soumu.go.jp/denshijiti/code.html)
NetBSD/starに10.0_BETAをインストール

c2kをnetbsd-10に戻したので、ついでにstar(armv4)もビルドしてインストールを試してみました。

INSTALLのイメージで起動してHTTPでのインストールを試したのですが、base.tgzがターゲットのメモリサイズの64Mを越えているので、tmpfsに入りきれずにインストールできません。

```
 % ls -slas
total 250964
     4 drwxr-xr-x  2 hiroki  wheel        512 Aug 24 12:20 .
     4 drwxr-xr-x  3 hiroki  wheel        512 Aug 24 12:19 ..
     4 -rw-r--r--  1 hiroki  wheel        556 Aug 24 12:20 MD5
     4 -rw-r--r--  1 hiroki  wheel       1645 Aug 24 12:20 SHA512
 67968 -rw-r--r--  1 hiroki  wheel   69551939 Aug 24 12:19 base.tgz
123104 -rw-r--r--  1 hiroki  wheel  126015553 Aug 24 12:20 comp.tgz
   704 -rw-r--r--  1 hiroki  wheel     680647 Aug 24 12:19 etc.tgz
  3456 -rw-r--r--  1 hiroki  wheel    3501601 Aug 24 12:19 games.tgz
     4 -rw-r--r--  1 hiroki  wheel       1725 Aug 24 12:19 gpufw.tgz
 12928 -rw-r--r--  1 hiroki  wheel   13192774 Aug 24 12:19 man.tgz
  5184 -rw-r--r--  1 hiroki  wheel    5251649 Aug 24 12:19 misc.tgz
  6496 -rw-r--r--  1 hiroki  wheel    6610984 Aug 24 12:19 modules.tgz
  4160 -rw-r--r--  1 hiroki  wheel    4206564 Aug 24 12:19 rescue.tgz
 23904 -rw-r--r--  1 hiroki  wheel   24418227 Aug 24 12:19 tests.tgz
  3040 -rw-r--r--  1 hiroki  wheel    3079840 Aug 24 12:19 text.tgz
```

しかたがないのでsetsをUSBメディアに焼いてインストールします。

```
% mkisofs -o ~/sets.iso sets
Setting input-charset to 'UTF-8' from locale.
  4.00% done, estimate finish Thu Aug 24 16:15:25 2023
  7.98% done, estimate finish Thu Aug 24 16:15:25 2023
 11.96% done, estimate finish Thu Aug 24 16:15:25 2023
 15.96% done, estimate finish Thu Aug 24 16:15:25 2023
 19.94% done, estimate finish Thu Aug 24 16:15:25 2023
 23.92% done, estimate finish Thu Aug 24 16:15:25 2023
 27.91% done, estimate finish Thu Aug 24 16:15:25 2023
 31.89% done, estimate finish Thu Aug 24 16:15:25 2023
 35.90% done, estimate finish Thu Aug 24 16:15:25 2023
 39.88% done, estimate finish Thu Aug 24 16:15:25 2023
 43.86% done, estimate finish Thu Aug 24 16:15:25 2023
 47.84% done, estimate finish Thu Aug 24 16:15:25 2023
 51.84% done, estimate finish Thu Aug 24 16:15:25 2023
 55.82% done, estimate finish Thu Aug 24 16:15:25 2023
 59.80% done, estimate finish Thu Aug 24 16:15:25 2023
 63.78% done, estimate finish Thu Aug 24 16:15:25 2023
 67.79% done, estimate finish Thu Aug 24 16:15:25 2023
 71.77% done, estimate finish Thu Aug 24 16:15:25 2023
 75.75% done, estimate finish Thu Aug 24 16:15:25 2023
 79.75% done, estimate finish Thu Aug 24 16:15:26 2023
 83.73% done, estimate finish Thu Aug 24 16:15:26 2023
 87.72% done, estimate finish Thu Aug 24 16:15:26 2023
 91.70% done, estimate finish Thu Aug 24 16:15:26 2023
 95.68% done, estimate finish Thu Aug 24 16:15:26 2023
 99.68% done, estimate finish Thu Aug 24 16:15:26 2023
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
125430 extents written (244 MB)
```

sets.isoをUSBメモリにddで焼いてインストールしてみました。ターゲットのモジュールはUSBが2ポートあり、HDとFlashを接続できます。

https://dmesgd.nycbug.org/index.cgi?do=view&id=7257

pkgでmpg123をインストールして、USB DAC(PCM2704)でJazz Sakuraが問題なく再生できました。
フィルターコンテキスト（自分用メモ）

https://learn.microsoft.com/ja-jp/training/modules/dax-power-bi-modify-filter/2-modify-filter-context

![コメント 2023-08-24 172806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195544/daddd343-16c0-f854-3d2b-d75853c1838d.png)

行タイトル、列タイトル、スライサー、フィルターなどが、
よってたかって評価対象となるデータの範囲を絞り込む。

DAXは、その絞り込まれた環境下において、指定された式を評価して値を返す。

DAX式が同じなのに、返された値が異なる理由は、絞り込まれた環境が各セルごとに異なるから。
Unity ゲームオブジェクトの取得方法を整理する

Unityの肝であるゲームオブジェクトの取得方法について整理する

新しいものを見つけ次第ついきしていく

# GameObject.Find

概要
- 名前でオブジェクトを検索してリターンする関数

特徴
- アクティブ名オブジェクトのみリターン
- ゲームオブジェクトが見つからない場合は`null`を返す
- `/`が含まれている場合は、階層を探索する
- 処理は重いみたい


```cs
public class ExampleClass : MonoBehaviour
{
    public GameObject hand;

    void Example()
    {
        // ハンドという名前のGameObjectを返す
        hand = GameObject.Find("Hand");

        // ハンドという名前のGameObjectを返す
        // ルートオブジェクトでないといけない
        hand = GameObject.Find("/Hand");

        // ハンドという名前のGameObjectを返す
        // Monster/Armの階層下にいなければいけない
        // Monsterはルートオブジェクトでないといけない
        hand = GameObject.Find("/Monster/Arm/Hand");

        // ハンドという名前のGameObjectを返す
        // Monster/Armの階層下でないといけない
        hand = GameObject.Find("Monster/Arm/Hand");
    }
}
```

リファレンス

https://docs.unity3d.com/ja/2019.4/ScriptReference/GameObject.Find.html
JavaScript の分割代入で変数名を変更する

JavaScript の分割代入についての学習メモ。

# 詳細
これができるのは知っていた。
```javascript
const obj = { a: 42, b: true };
const { a, b } = obj;

console.log(a); // 42
console.log(b); // true
```
これができるのは知らなかった。
```javascript
const obj = { a: 42, b: true };
const { a: foo, b: bar } = obj;

console.log(foo); // 42
console.log(bar); // true
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%E6%96%B0%E3%81%97%E3%81%84%E5%A4%89%E6%95%B0%E5%90%8D%E3%81%B8%E3%81%AE%E4%BB%A3%E5%85%A5

もちろん TypeScript でも動作する
https://typescriptbook.jp/reference/values-types-variables/object/destructuring-assignment-from-objects#%E4%BB%A3%E5%85%A5%E3%81%99%E3%82%8B%E5%A4%89%E6%95%B0%E5%90%8D%E3%81%AE%E6%8C%87%E5%AE%9A

# まとめ
JavaScript,TypeScript では分割代入の際に変数名を変更できる。
Javaで「ファイルに追加で書き込む」の動作を確認してみた

# 概要
Javaで「ファイルに追加で書き込む」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/stream/index5.html

# 実装
以下のファイルを作成しました。
```StreamTest5.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class StreamTest5{
  public static void main(String args[]){
    try{
      File file = new File("test.txt");

      if (checkBeforeWritefile(file)){
        FileWriter filewriter = new FileWriter(file, true);

        filewriter.write("はい。元気です\r\n");
        filewriter.write("ではまた\r\n");

        filewriter.close();
      }else{
        System.out.println("ファイルに書き込めません");
      }
    }catch(IOException e){
      System.out.println(e);
    }
  }

  private static boolean checkBeforeWritefile(File file){
    if (file.exists()){
      if (file.isFile() && file.canWrite()){
        return true;
      }
    }

    return false;
  }
}
```
以下のコマンドを実行しました。
```
$ javac StreamTest5.java 
$ java StreamTest5 
$ java StreamTest5 
```

# まとめ
何かの役に立てばと。
Heroku Connectの導入・設定・運用時に気をつけるべきこと

# 前書き

#### ~Heroku Connect ちゃんと使えば めちゃ便利 だけどときどき 落とし穴あり~


自分用に取っていたメモを編集・公開します。
今後も何かあれば未来の自分が追記していくはずです。


https://devcenter.heroku.com/ja/categories/heroku-connect

だいたい↑に書いてあることです。


## 基本的なこと

#### Connect設定されたTable（オブジェクト）のすべてのレコードが同期される
条件を満たすレコードのみの同期等、レコードの絞り込みはできません。

#### Postgres側にだけ存在するカラムを作ることはできない
Salesforceオブジェクトの項目一覧から同期が必要なものを選択していく方式。

## 設計・導入・設定時

#### Heroku Connectのunique identifierとして自動採番のIDを使用しない
SalesforceのオブジェクトID, Postgres側のIDとは別にUniqueな項目を用意する必要があります。
Reloadされたタイミングで採番がずれてしまうため、アプリ側のレコード判別値としても絶対に使用しないように。

#### 親レコードの項目を参照した「数式」項目は、親に変更があっても自動で同期されない
親レコードを参照しない別の項目に更新があったタイミングで反映されます。

#### Salesforce側でオブジェクト定義を変更した後はHerokuConnct側も再設定が必要
オブジェクト定義の変更は自動的には反映されない。データ型やmax_length等、項目の定義を変更した場合は同期設定のConnect項目から一旦削除・再設定を行う必要があります。
項目の削除時も同じく、同期設定から削除する必要あり。

#### Postgres → Salesforceの同期に失敗した場合、自動でリトライ等は行われない
エラーの検知を実装して適宜対応していくのがベターかと思います。
Postgres → Salesforceの更新は全て``` trriger_log ```テーブルに残っており、同期の失敗は ``` state === 'False' ``` の条件で抽出可能。
``` trigger_log ```の内容は一定期間で``` trigger_log_archive ```に移動、30日後には消滅するため注意。

## 同期エラーへの対応
長くなりそうなので別記事にまとめます。


## テスト環境等でSalesforceのSandboxと繋ぐ場合

Sandboxにリロードがあった場合、Connectの再設定が必要になります。

https://devcenter.heroku.com/ja/articles/managing-heroku-connect-sync-and-connections#recreating-a-connection-after-a-sandbox-refresh

に手順が書かれているんですが、サラッとAdd-onをDestroyしているため注意が必要です。
Add-onの再追加後はプランの再設定を忘れないようにしましょう。
Node.js：環境構築のいろいろ

## 前書
* 個人勉強メモです。ご参考まで。

## 目的
* Windows10環境、簡単でUnZipすれば稼働できる。
* 共通モジュールと個別モジュールの関係を明確にする。

## Node.js ダウンロード先
* URL：「https://nodejs.org/ja/download/releases」
  各バージョンのインスタンスパッケージがあり、とても便利。 
  今回は「https://nodejs.org/download/release/v18.17.1/node-v18.17.1-win-x64.7z」をダウンロード

## Node.js インストール手順
* インストールパッケージの展開先： **「C:\aaa\nodejs」** 
* 環境変数「NODE_PATH」：**「C:\aaa\nodejs\node_modules」**
* 環境変数「PATH」：**「C:\aaa\nodejs」**
  
## Node.js グローバルインストールパスの確定
**「npm root -g」** コマンドで確認
```console: npm root -g
C:\Users\aaa>npm root -g
C:\aaa\nodejs\node_modules
```

## Node.js モジュールロードパスの確認

```console: node | module.paths
C:\Users\aaa>node
Welcome to Node.js v18.17.1.
Type ".help" for more information.
> module.paths
[
  'C:\\Users\\aaa\\repl\\node_modules',
  'C:\\Users\\aaa\\node_modules',
  'C:\\Users\\node_modules',
  'C:\\node_modules',
  'C:\\aaa\\nodejs\\node_modules',
  'C:\\Users\\aaa\\.node_modules',
  'C:\\Users\\aaa\\.node_libraries',
  'C:\\aaa\\nodejs\\lib\\node'
]
>
```

## npm いろいろ
```console
--- Proxy設定 -----
C:\aaa\app>npm -g config set proxy http://proxyserver:8080
C:\aaa\app>npm -g config set https-proxy http://proxyserver:8080

--- パッケージ追加 -----
C:\aaa\app>npm install fast-xml-parser
C:\aaa\app>npm install fast-xml-parser -g

--- パッケージ一覧 -----
C:\aaa\app>npm list
C:\aaa\app>npm list -g

--- パッケージ削除 -----
C:\aaa\app>npm uninstall fast-xml-parser
C:\aaa\app>npm uninstall fast-xml-parser -g
昼会が結構良かった件

昼間にチームメンバー全員で相談する会をやってみたら結構よかったので何がいいかなどを共有。

# 対象
* [Scrum](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-US.pdf)で運営されているチーム
* チーム内の意思疎通に問題を感じているチーム

対象に記載した通り、基本的には Scrum で運営されているチームを前提として以下のドキュメントは記載されています。

# 何を問題としている

端的にいうと問題は、

*相談できない* 

ということになります。

作業を進めていくと自分だけの知識では対応できない状況によく陥ります。例えば

1. プログラミング言語やツールなどの知識がたりないためにどう進めれば良いかわからない
2. チームや現場固有の知識なため新規参入者には何をすればいいかわからない
3. 作業を進める際に、現状のまま進めてよいか自信が持てない

などなど、色々な状況が起こり得ます。1は自分でWeb上にあるドキュメントを読むなどでも対応可能です。しかし知識が十分にない状況ですと、どのドキュメントを読めば良いかで詰ります。2は既存のメンバーに相談しないとほぼ対応できません。3はよくある状況だと思います。思考が堂々巡りをしてたりします。

これらの状況になった場合、できるだけはやく他の人に助けをもとめるべきです。しかし以下の様な思考がそれを妨げるのではないかと思います。

* 他の人も忙しいのだから、時間を頂いては悪い
* これくらいのことは一人で出来無ければいけない
* 質問したいけど、答えを知ってそうな人が怖くて聞けない

Scrum に限らないとは思いますが、チームでの作業の場合は個人の効率の最大化を求めるのではなく、チームとしての効率の最大化を求めるべきだと思います。上記の様な考えがあったとしても相談をする側も受ける側もチームの効率の最大化を求めて必要ならば相談をするべきです。ただ、そんなに簡単にはいきませんよね。人間だもの。

# 他の Scrum イベントでは駄目なのか

Scrum には以下の4つのイベントがあります。

* スプリントプランニング
* デイリースクラム
* スプリントレビュー
* スプリントレトロスペクティブ

Scrum としてはこれらのイベントだけで会議は十分としています。実際に良く機能している Scrum チームではこの4つの会議で十分だと思います。しかしいきなり十分に機能したチームにはなれません。

日々の作業の相談をするという観点で上のイベントを見ると、一番適していそうなのがデイリースクラムになります。ただし、デイリースクラムは多くの場合、作業を初める前に行われます。またデイリースクラムでも問題の相談が勧められていますが、作業をしている途中ではなく前日の話になるので

1. 相談のタイミングとして遲い
2. 前日のことなので相談内容を忘れる

などの問題が発生します。

## 昼会ってなに？

今までの文章をまとめて問題を詳細化すると以下のようになります。

1. 心理的安全性がまだ低い Scrum チームでは個別に相談をしづらい
2. デイリースクラムでは相談のタイミングとしては遅い

これらの問題の緩和を期待出来るのが昼会です。
昼会とは一日の作業時間の中間あたりでDev全員で集って、いま行っている作業の相談をする会です。自分の作業に問題がある場合にチームメンバーの知見を得る為に活用します。重要な点は作業の相談をするということです。作業の報告は必要ありません。むしろ作業報告はしないほうが良いと考えています。あくまで問題の共有と解決方法の検討をチーム全体で行うことを目的とするべきです。

私の考える昼会の大切な点は以下の通りです。

1. 昼会では決まった時間に全員が集ることを求めます。ただし、昼会に集中することは求めません。
   その時間に他の作業をすることは問題ありません。ただし他のメンバーから相談を受けた時はその相談を優先します。その時間は相談してよい時間とすることで心理的安全性を高めます。
2. 昼会では、決まった時間枠の間は全員が集まり続けることを求めます。
   1と関係しますが、その時間の間ならば相談してよいとする事で心理的安全性を高めます。
3. 昼会は30分程度とする。
   あまり時間が長いと質問する時間だと忘れてしまうかもしれません。
4. 昼会で無理に話す必要はない。
   質問がないなら作業をしてください。ただし、その時間枠はすぐにリアクションできる場所にいましょう。

# 昼会の進め方

私のチームで行っている昼会の進め方を説明します。一つの例です。やりかたに決まりは無いので御自身のチームに合ったやり方でやってください。

1. 一日の作業時間の中間あたりでチームメンバー全員で集る。
   例えば14:00に全員で集ります。オンラインでもオフラインでも良いですが対面で集ります。チャットなどの文字ベースのツールですと見ていない可能性があるので、対面が良いと思います。
2. 開始の宣言
   昼会開始の宣言をします。宣言内容は「これから昼会を始めます。相談したいことがある方はいますか？」程度で十分です。誰でも良いですが、決めておいた方がいいです。
3. 相談をする。
   相談が有れば相談してください。無いなら無理に相談する必要はありません。逆にあるのに相談しないのもいけません。折角チームメンバーが集ってるので有効活用しましょう。
4. 閉会の宣言はしない
   特に閉会の宣言は必要ありません。30分程度の決められた時間枠が終れば、三々五々解散しましょう。

# 実際にやってみた感想

昼会を始める前に比べて質問が増えた気がします。特にあまり喋らない人が質問をしやすくなったように思います。ただし、続けることで最初の相談するという目的を忘れて来ている感じがしています。報告が増えてきているので、その点は改善したほうが良いと思ってます。

# より良い状況とは

昼会にはある程度の効果が有ったと思います。しかし、理想的なチームは昼会などせずに必要なタイミングで必要な相手に直接相談するチームだと思っています。より心理的安全性をたかめ気楽に相談できるチームを作るためにより一層の改善が必要だと思っています。
感性データ解析(感情情報処理のためのファジィ数量分析手法)　中森義輝先生　森北出版

```r

#p.30

data("LifeCycleSavings")
df=LifeCycleSavings
M=nrow(df)
N=ncol(df)
Z=t((t(df)-apply(df,2,mean))/apply(df,2,sd))
R=cor(LifeCycleSavings)
D=diag(1,nrow(R))

#主因子法
ite=100

for(l in 1:ite){
pre_d=diag(D)
A=R-D
eig=eigen(A)
L=sum(eig$values>0)
A=t(t(eig$vectors[,1:L])*sqrt(eig$values[1:L]))
D=diag(diag(R-A%*%t(A)))
print(sum(abs(pre_d-diag(D))))
}


hn2=diag(A%*%t(A))

#共通性
hn2
#独自性
1-hn2

#バリマックス法
#初期値
B=A
L=ncol(A)
hn=sqrt(hn2)
V=sum(N*apply((B/hn)^4,2,sum)-apply(B^2/hn2,2,sum)^2)

ite=100
for(k in 1:ite){
V_old=V
for(l in 1:(L-1)){
xn=B[,l]/hn
yn=B[,(l+1)]/hn
s=sum(xn^2-yn^2)
t=2*sum(xn*yn)
u=sum((xn^2-yn^2)^2-4*(xn*yn)^2)
v=4*sum(xn*yn*(xn^2-yn^2))
pthi=atan((N*v-2*s*t)/(N*u-s^2+t^2))
if((N*v-2*s*t)*sin(pthi)<0){
pthi=pthi+pi  
}
pthi=pthi/4
Bl=B[,l]*cos(pthi)+B[,(l+1)]*sin(pthi)
Bl_d=-B[,l]*sin(pthi)+B[,(l+1)]*cos(pthi)
B[,l]=Bl
B[,(l+1)]=Bl_d
}
V=sum(N*apply((B/hn)^4,2,sum)-apply(B^2/hn2,2,sum)^2)
print(abs(V_old-V))
}

ARA_eig=eigen(t(A)%*%solve(R)%*%A)
P=ARA_eig$vectors

#対角化行列の確認(t(P)=solve(P))
solve(P)%*%(t(A)%*%solve(R)%*%A)%*%P

#因子得点
f=Z%*%solve(R)%*%A%*%P%*%diag(sqrt(ARA_eig$values))%*%t(P)

````


```r

#p.68 Fuzzy c-Mean

data(iris)

Species=unique(iris$Species)
X=as.matrix(iris[,-ncol(iris)])

c=3
q=3
ite=100

class=sample(1:c,nrow(X),prob=rep(1/c,c),replace=T)
v=array(0,dim=c(c,ncol(X)))
for(i in 1:c){
v[i,]=apply(X[class==i,],2,mean)  
}

d=t(array(0,dim=c(nrow(X),c)))
for(i in 1:c){
d[i,]=apply((t(X)-v[i,])^2,2,sum)  
}

uik=t(array(0,dim=c(nrow(X),c)))
for(i in 1:c){
uik[i,]=1/apply((1/(t(t(d)/d[i,])))^(1/(q-1)),2,sum)  
}

for(l in 1:ite){
 
uik_pre=uik
    
d=t(array(0,dim=c(nrow(X),c)))  
for(i in 1:c){  
v[i,]=apply(X*uik[i,]^q,2,sum)/sum(uik[i,]^q)   
d[i,]=apply((t(X)-v[i,])^2,2,sum)
}
d_sig=ifelse(d>0,0,1)
d_sig=apply(d_sig,2,sum)

uik=t(array(0,dim=c(nrow(X),c)))
for(i in 1:c){
uik[i,]=1/apply((1/(t(t(d)/d[i,])))^(1/(q-1)),2,sum)  
}  
 
sig_no=c(1:length(d_sig))*ifelse(d_sig>0,1,0)
sig_no=sig_no[sig_no>0]
if(length(sig_no)>0){
for(j in 1:length(sig_no)){
uik[,sig_no[j]]=1/d_sig[sig_no[j]]  
}  
}

J=sum(d*uik^q)
print(J)
#print(sum(abs(uik-uik_pre))) 
}

```