OmniAICreator/Qiita-1.07M huggingface dataset:
Node.js・Socket.io リアルタイムのチャットアプリケーション

# Node.jsとSocket.ioを使用してリアルタイムのチャットアプリケーションの構築方法

このチュートリアルでは、Node.jsとSocket.ioを使用してリアルタイムのチャットアプリケーションを構築する方法を紹介します。

### 1. プロジェクトのセットアップ

まずは、プロジェクトのディレクトリを作成し、以下のコマンドを使用して`package.json`を作成します。

```bash
mkdir chat-app
cd chat-app
npm init -y
```

次に、以下のコマンドを使用してsocket.ioとexpressをインストールします。

```bash
npm install socket.io express
```

### 2. サーバーの設定
次に、以下のコードをindex.jsに記述して、サーバーを設定します。

```javascript
const express = require("express");
const app = express();
const http = require("http").createServer(app);
const io = require("socket.io")(http);

app.use(express.static(__dirname + "/public"));

app.get("/", function (req, res) {
  res.sendFile(__dirname + "/index.html");
});

io.on("connection", function (socket) {
  console.log("a user connected");
  socket.on("disconnect", function () {
    console.log("user disconnected");
  });
});

http.listen(3000, function () {
  console.log("listening on *:3000");
});
```

### 3. クライアントの設定
次に、以下のコードをpublic/index.htmlに記述して、クライアントを設定します。

```html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Chat App</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      background-color: #f9f9f9;
      font-family: "Helvetica Neue", sans-serif;
      font-size: 16px;
      line-height: 1.4;
      color: #333;
      padding: 20px;
    }

    form {
      margin-top: 20px;
    }

    input[type="text"] {
      width: 100%;
      height: 40px;
      padding: 10px;
      border: 1px solid #ccc;
      border-radius: 4px;
      font-size: 16px;
    }

    input[type="submit"] {
      background-color: #333;
      color: #fff;
      border: none;
      padding: 10px 20px;
      border-radius: 4px;
      font-size: 16px;
      cursor: pointer;
    }

    ul {
      list-style-type: none;
      margin-top: 20px;
    }

    li {
      margin-bottom: 10px;
    }

    span {
      font-weight: bold;
    }
  </style>
</head>

<body>
  <h1>Chat App</h1>
  <form>
    <input type="text" id="message-input" placeholder="Enter a message">
    <input type="submit" value="Send">
  </form>
  <ul id="message-list"></ul>

  <script src="/socket.io/socket.io.js"></script>
  <script>
    const socket = io();
    const messageList = document.getElementById("message-list");
    const messageInput = document.getElementById("message-input");

    document.querySelector("form").addEventListener("submit", function (e) {
      e.preventDefault();
      if (messageInput.value) {
        socket.emit("chat message", messageInput.value);
        messageInput.value = "";
      }
    });

    socket.on("chat message", function (msg) {
      const item = document.createElement("li");
      item.textContent = msg;
      messageList.appendChild(item);
    });
  </script>
</body>

</html>
```

### 4. アプリケーションの起動
最後に、以下のコマンドを使用してアプリケーションを起動します。

```bash
node index.js
```

これで、ブラウザで http://localhost:3000/ にアクセスすると、リアルタイムのチャットアプリケーションが使用できるようになります。

上記のように、Node.jsとSocket.ioを使用してリアルタイムのチャットアプリケーションを構築する方法を解説しました。ご参考になれば幸いです。
TypeScript で Promise を使った関数の非同期実行

# はじめに
~~Promiseで複数処理を指定しての、並行処理実行のサンプルプログラム。
待ち処理入れないと、それっぽくならないのが、サンプルとしてはいまいちな仕上がりに。。。
考え方が正しいのか、あまり自信はない。。。~~

ご指摘いただいていますが、Promise を使ったシングルスレッドの非同期実行になります。


# 確認環境
こちらを参照

https://qiita.com/naozo-se/items/0b1f7b0a32d27deec052

# サンプルコード
```typescript
// 型定義
interface CountType {
    multiple: number,
    max: number
}

//  値ループのデータ定義
const params: Array<CountType> = [
    { multiple: 1, max: 25 },
    { multiple: 2, max: 8 },
    { multiple: 3, max: 9 },
    { multiple: 4, max: 20 },
    { multiple: 5, max: 20 },
];

// 待ち処理
const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms));

// # 指定最大値までの指定倍数の値を出力する
const counter = (index: number, param: CountType): Promise<number> => {
    return new Promise(async (resolve, reject) => {
        try {
            // 開始ログ
            console.log(`method ${index} started`);
            for (let i = 1; i <= param["max"]; i++) {
                // 待ちを発生
                await sleep(10);
                // 特定の倍率のときだけコンソール出力
                if (i % param["multiple"] == 0) {
                    console.log("index = ", index, i);
                }
            }
            resolve(index);
        } catch (e) {
            reject(-1);
        }
    });
}

// メイン実行
const main = async () => {
    // パラメータからマルチスレッド実行
    const result = await Promise.all(params.map(async (param, index) => counter(index + 1, param)));
    console.log(result);
}

main();
```

### おわりに
~~sleep(setTimeout)とか入れなくても、待ち時間が発生するような処理をいれたら並行処理してくれようになるのかは、また後日に確認したい、、~~

記事ごと削除したい気持ちもありますが、無知の振り返りのために残しておきたいと思います。
Internet Explorer11のお気に入りとクッキーの移行。

# 概要
Internet Explorer11のお気に入りとクッキーの移行、やってみた。

# 手順

# bookmark.htm,cokies.txtの書き出し。
「エクスポートとインポート」
「お気に入り」のエクスポート先のパスを指定
「Cookie」のエクスポート先のパスを指定

# bookmark.htm,cokies.txtの読み込み。
「エクスポートとインポート」
インポート先の「お気に入り」フォルダを選択
「Cookie」のインポート対象のファイルパスを指定


以上。
AZ-305: Microsoft Azure Infrastructure Solutions合格備忘録

### ■受験の目的
Azureの設計・運用の知識をつけるため
Azure Solutions Architect Expertの認定を受けるため
※AZ-104: Microsoft Azure Administratorの認定資格をパス

### ■出題範囲
シラバスは以下を参照し、情報を収集します。
https://learn.microsoft.com/ja-jp/certifications/exams/az-305/

### ■教材
Microsoftの認定資格でありがたいことは、無料のLearningがあるところです。
プロファイルを作れば、Learnをクリアするごとにレベルアップするので
モチベーションも上がります。
https://learn.microsoft.com/ja-jp/training/

John Savillさんの動画、概要を理解するのに最適です。英語字幕機能を活用します。
本番試験でどういう出題されるのかも、きっちり解説してくれています。
https://www.youtube.com/playlist?list=PLlVtbbG169nHSnaP4ae33yQUI3zcmP5nP

### ■模擬試験
模擬試験はUdemyで購入
解説を読む覚える再度テストするを3周くらい繰り返しました。
https://www.udemy.com/course/microsoft-azure-az305-exam/

### ■学習期間
AZ104受験からの継続で学習すれば3カ月ほどでパスできると思われます。
学習フローとしては、AZ104を先に踏むことをお勧めします。

### ■AZ104との違いについて
AZ104は、構築後の管理、移行、機能変更が主な出題項目でしたが、
AZ305については、設計メインなので開発や運用要件に対しての最適解を解くものが多かったです。

### ■実際の本試験
7割くらいは、模擬試験の内容に近い問題が出題されました。
結果は8割以上のスコアで、満足のいく結果でした。
難易度としては、現行の状況把握して問題を解くAZ104の方が難しかった印象です。
Databricks Certified Data Engineer Associate合格備忘録

### ■受験の目的
Databricksのアーキテクチャや基本概念を理解するために、学習・受験をしました。
特に案件ですぐに必要というわけではなかったのですが、近年のDWHサービスの技術面で、Snowflakeとの比較も行いたかったため受験しました。

### ■出題範囲
シラバスは以下を参照し、情報を収集します。
https://www.databricks.com/learn/certification/data-engineer-associate

### ■教材
英語ですが、教材動画で基本の学習を行います。英語字幕機能があるので活用します。
https://www.youtube.com/playlist?list=PLFmTz4eAifdLC43yrDrm6XIuDPL3fiA-T
⇒試験は、英語のみサポートしているので、用語の英語慣れも必要です。

詳細は公式リファレンスで参照します。
Azure Databricksの資料が分かりやすかったので、Microsoftのリファレンスを使用します。
https://learn.microsoft.com/ja-jp/azure/databricks/

### ■模擬試験
模擬試験については、Udemyで購入。万全を期すために2点の模擬試験を購入しました。
問題数が少ない方が難易度は少し低い印象です。
https://www.udemy.com/course/databricks-certified-associate-data-engineer/
https://www.udemy.com/course/databricks-certified-data-engineer-associate-practice-tests/

### ■学習期間
筆者基準となってしまいますが、普段の業務でDWHサービスを使用している方であれば、
休日学習でも2カ月～3カ月ほどでパスできると思われます。
筆者は、AzureSyanpseとSnowflakeを使用していたので、似ている技術箇所もありましたので
入りやすかったことも幸いしました。
業務でPythonを使用しないので、そちらの学習に5割ほど費やした印象です。

### ■実際の本試験
6割くらいは、模擬試験の内容に近い問題が出題されます。
結果は80%のスコアで、数えていたスコアよりも少し低かったです。
M1 Macで作成したプロジェクトがIntel Macでビルドできなくなったとき

M1 Macで作成したiOSプロジェクトをIntel Macでビルドした時に、そのままだとビルドができなかったので  ~~対処法を残す~~
対処できてないです。
原因がふわっとしかわからないので、以降調べがついたら追記します。

## 起きた事象
- M1 Macで作成したiOSプロジェクトをIntel Macで開いたところ、
`Command CompileStoryboard failed with a nonzero exit code`というエラーでStoryboardのCompileに失敗してビルドが通らなかった。

- プロジェクト内で導入しているのはRswift,SnapKitの二つ。

## 対処法
一度 BuildTargetをAnyiOSDeviceに変更してビルドすることで解消した。
![スクリーンショット 2023-04-23 14.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609793/cdd3b6fd-dbd3-d200-88f8-9d94c2b401ab.png)

~~以降シミュレータに切り替えてもビルドができなくなることは無くなった。~~

-> Githubから別ファイルとしてプロジェクトを拾ってきて同じ対応をしたら解決しなかった。

## 推察
- この二つの環境の差を考えるとアーキテクチャの違いで起きてるんだろうなと推察(それぞれn=1だから違う線もある)
- `AnyiOSDevice`を対象にビルドすることでアーキテクチャが確定する、だったら納得できるかもしれないがそういった何をしているかまではまだ調べていないのでわかったら追記する。　

- 常識として新しい環境に来たらまず最初は`AnyiOSDevice`でビルドするだろ、だとしたら自分が無知だ　ごめんなさい

わかる人がいたら教えて欲しい。
M1,2 MacとIntel Macを跨いだ開発はされないのか全然同じ事例を見つけられなかったが、Githubへのプッシュした内容が不用に問題を引き起こしている可能性もあるので話半分で読んで欲しい気持ちでもある。


## 追加で調査した
- Xcode 14.1以降で作成したプロジェクトは新規作成の状態でもIntel Macでは`AnyiOSDevice`のビルドが通らなかった。
- Xcode 14.0(14A309)のみでビルドが通り、M1Macで作成した当初開きたかったプロジェクトもビルドできることを確認した。
- 正直おま環なのかもわからない、Xcode14.1~の必要要件がAppleシリコンになっている記述があれば納得もするが…
npm install時にnode-sassでcommand failed (nodejs 14から18に上げたメモ)

## 参考

* [【簡単】Node.jsにsassをインストールする手順 - Qiita](https://qiita.com/miya1221/items/21bfbb080a7dcf1ed86e)

## エラー node-sass

> npm ERR! command failed
> npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node scripts/build.js

package.json を見ると

```
"node-sass": "^4.14.1",
```

とあった。これはnodejs 14 で動作する。[動作バージョン一覧](https://github.com/sass/node-sass#node-version-support-policy)
インストールしたのがnodejs 18だったためエラーになった

nodejs 18対応は以下

```diff:package.json
- "node-sass": "^4.14.1",
+ "node-sass": "^8.0.0",
```

あわせてsass-loaderも更新する。
webpack 4系は sass-loader 10までのため10を指定。
参考: [Nuxt.jsでSassを使用した際に「TypeError: this.getOptions is not a function」とエラーが出る | cly7796.net](https://cly7796.net/blog/javascript/error-when-using-sass-with-nuxt-js/)

```diff:package.json
- "sass-loader": "^8.0.2",
+ "sass-loader": "^10.0.0",
```

## `cache-loader`が含まれていなかったので含めた

`npm run serve`するとcache-loaderが見当たらないエラー。

* package-lock.json には 記載されていたが、 package.jsonにはなかったので追加

dependencies欄

```diff:package.json
+ "cache-loader": "^4.1.0",
```

## openssl_fips未定義エラー対応

> npm ERR! gyp: name 'openssl_fips' is not defined while evaluating condition 'openssl_fips != ""' in binding.gyp while trying to load binding.gyp

* [Unable to target older node versions with node.js 17 · Issue #2534 · nodejs/node-gyp](https://github.com/nodejs/node-gyp/issues/2673#issuecomment-1239619438)

* node_modules/node-gyp/gyp/pylib/gyp/input.py

```diff:node_modules/node-gyp/gyp/pylib/gyp/input.py
- env = {"__builtins__": {}, "v": StrictVersion}
+ env = {"__builtins__": {"openssl_fips": ""}, "v": StrictVersion}
```

### デバッグ起動させる方法

> この方法で、ビルドはうまくいきます。しかし、デバッグ用の起動のほうができませんでした。
> electron: --openssl-legacy-provider is not allowed in NODE_OPTIONSというエラーが出て動きません。

* [vue-cli-plugin-electron-builder でセットアップしたElectronプロジェクトがビルドできない - Qiita](https://qiita.com/giwagiwa/items/1fabb9686a6793a72d76)

上記と同じ現象になった。

vue.config.js の先頭に以下記述

```js:vue.config.js
const crypto = require('crypto');
/**
 * md4 algorithm is not available anymore in NodeJS 17+ (because of + lib SSL 3).
 * In that case, silently replace md4 by md5 algorithm.
 */
try {
  crypto.createHash('md4');
} catch (e) {
  console.warn('Crypto "md4" is not supported anymore by this Node + + version');
  const origCreateHash = crypto.createHash;
  crypto.createHash = (alg, opts) => {
    return origCreateHash(alg === 'md4' ? 'md5' : alg, opts);
  };
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/4acf662d-7f23-f501-e63c-78c176436d72.png)


## キャッシュのクリア方法

```
npm cache clean --force
してから
npm install
```



### ハット記号について

Major.Minor.Patch

* キャレット^をつけると、Major は一致し Minor と Patch は指定されたもの以上
* チルダ~をつけると、Major と Minor は一致し Patch は指定されたもの以上

## Vue.js devtools

* [Vue.js devtools - Chrome ウェブストア](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja)
[AWS Q&A 365][Redshift]AWSのよくある問題の毎日5選 #38

# 1. Amazon Redshiftに新しく作成されたデータベースオブジェクトのデフォルト権限は何ですか？ 
デフォルトでは、オブジェクトのスーパーユーザーまたはオーナーのみがオブジェクトをクエリ、変更、または権限を付与できます。

# 2. Amazon Redshiftデータベースユーザーに権限を付与する方法は何ですか？ 
権限は、アカウントに直接割り当てることによって明示的に付与されるか、権限が付与されたグループのメンバーであることによって暗黙的に付与されることがあります。

# 3. Amazon Redshiftで、異なる権限が関連付けられているオブジェクトの種類は何ですか？ 
異なる権限は、SELECT、INSERT、UPDATE、DELETE、REFERENCES、CREATE、TEMPORARY、およびUSAGEなどの異なるオブジェクトタイプに関連付けられています。

# 4. Amazon Redshiftのスーパーユーザーに通常制限されているタスクへのユーザーアクセスを制御する方法は何ですか？ 
データベース権限を管理するためにロールベースのアクセス制御（RBAC）を使用することで、通常スーパーユーザーに制限されているタスクへのユーザーアクセスを制御することができます。

# 5. Amazon Redshiftにおける行レベルセキュリティとは何ですか？また、どのように実装できますか？ 
行レベルセキュリティとは、特定のデータ行へのユーザーアクセスに対する細かい制御を可能にする機能です。ポリシーを作成し、ポリシーで定義された行へのアクセスを制限するために、ロールまたはユーザーにポリシーをアタッチすることで実装できます。
JPA：javax.persistence.EntityNotFoundException

## @NotFound(action = NotFoundAction.IGNORE)で解決
JPAのエンティティクラスに多対一のリレーションシップを設定したデータ取得時に javax.persistence.EntityNotFoundException がスローされました。

@ManyToOne(optional = true) では回避できず・・・。
Qiitaで見つけた記事で無事に解決しました。

```java
@ManyToOne(fetch = FetchType.EAGER)
@NotFound(action = NotFoundAction.IGNORE)  // これで解消
@JoinColumns({
    @JoinColum(name = "no", insertable = false, updatable = false)
    @JoinColum(name = "detailNo", insertable = false, updatable = false)
})
private Meisai meisai;
```

## References
* [MySQL workbenchでレコードを削除したらjavax.persistence.EntityNotFoundExceptionが発生](https://qiita.com/mako0104/items/1d5c5b24243051d0bf97)
* [2.4.5. Single Association related annotations](https://access.redhat.com/documentation/en-us/jboss_enterprise_application_platform/5/html/hibernate_annotations_reference_guide/entity-hibspec-singleassoc)
VirtualBoxでHostOnlyAdapterのネットワークを変更する（Mac版）

自宅ルータを変更したところ、ルータのデフォルトネットワーク帯が、
VirtualBoxのネットワーク帯と重複。
VMへSSHが不可となった。
ルータのアドレス帯を変更しても良いが、今回はなにかあったときに
自宅インターネットが不通になるリスクを恐れ、VirtualBoxのHostOnlyAdapterのアドレス帯を変更する。

前提
VirtualBox version:6.1

1. Oracle VirutalBox Manager or VMコンソール画面にセルを選択する。

2. タブFile→「Host Network Manager」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815458/03683e2e-d50b-e470-9a7d-3395eb0d388b.png)

3 対象のネットワーク名を選択。
ここでは「vboxnet0」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815458/c340fc09-b7a9-227e-3ce9-52b776e64252.png)

4 Configure Adapter Manually - IPv4 Address 及び IPv4 Network Maskの値を変更する。

5 apply をクリック。おわり

（備忘録）
[AWS Q&A 365][Redshift]Daily Five Common Questions #38

# 1. What is the default permission for a newly created database object in Amazon Redshift? 
By default, only the superuser or the owner of an object can query, modify, or grant permissions on the object. 

# 2. How are permissions granted to Amazon Redshift database users? 
Permissions can be granted explicitly by having those permissions assigned directly to the account or implicitly by being a member of a group that is granted permissions. 

# 3. What are the types of objects that different permissions are associated with in Amazon Redshift? 
Different permissions are associated with different object types, such as SELECT, INSERT, UPDATE, DELETE, REFERENCES, CREATE, TEMPORARY, and USAGE. 

# 4. How can you control user access to tasks that are normally restricted to superusers in Amazon Redshift? 
By using role-based access control (RBAC) to manage database permissions, you can control user access to tasks that are normally restricted to superusers. 

# 5. What is row-level security in Amazon Redshift and how can it be implemented? 
Row-level security is a feature that allows you to have granular control over user access to specific rows of data. It can be implemented by creating and attaching policies to roles or users that restrict access to rows defined in the policy.
初めてAndroidゲームを公開した際の知見共有

# この記事は

Unityで初めてゲームアプリを制作しました。
2022年8月下旬頃に審査に出しましたが、
そのときの具体的な審査期間などの知見を共有したいと思います。

# 初申請

8/19に申請をして8/29に否認通知が来ました。
理由は、ゲーム内にプライバシーポリシーへのリンクがないためでした。
翌日ぐらいに対応しまして再申請したところ、9/7に承認されました。

# 2回目以降

不具合修正や機能追加でそのあとも申請を行いました。
10/11 申請 → 10/22 承認
10/23 申請 → 11/3 否認 → 11/5 承認
となっています。
11/3の否認理由は、アプリ内に入れているAdMobの広告とアプリのレーティングが不一致ということで否認となりました。AdMobの設定を変更して再申請しています。

# 審査期間が長い

いずれも申請してから結果が出るまで1週間以上かかりました。

https://support.google.com/googleplay/android-developer/answer/9859751
>注: ユーザーをより確実に保護できるよう、一部のデベロッパー アカウントについては、通常より時間をかけて詳細に審査することがあります。最大で 7 日程度ですが、例外的にさらにかかる場合もあります。

と、Googleのヘルプページに掲載されていますが、
7日以上はかかるものと思ってもらったほうが良いかもしれません。

# 審査期間が長くなる要因

とはいえ、数日で承認されるアプリもあると思います。
個人的な見解ですが、要因の一つとしてレーティングの設定が大きく、
子供向け、全年齢対象向けとなれば、審査内容も細かくなり時間がかかるものと思います。

# 終わりに

今回は勉強も兼ねてスクリプトも画像も自前で作成しましたが、もっと勉強したり、
アセットストアの素材なども使って、今よりかっこよいゲームアプリを作りたいと思っています。
AdMobでの広告収入、Google広告による宣伝、Unityについての開発知見も共有していく予定です。

よければ遊んでください。
[Google Play マージブロックパズル](https://play.google.com/store/apps/details?id=jp.co.toshi.mergeblockpuzzle)
AWSIMでロボット用の新しいセンサ作ってみた

# 概要


# 本編
今回の記事は前回の記事の続編になっています。

https://qiita.com/ttanaka3/items/bd76c0a8e28de0967db9

今回はAWSIMをつかった新しいセンサを作ってみようと思います。
元にするのはVLP16のセンサです。

lidar sensorというcomponentがついているので編集していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/e2f0a552-fbb6-479a-100e-73fec006ee55.png)

lidar sensorに関する説明は公式ドキュメントにも記載がありました。



https://tier4.github.io/AWSIM/Components/Sensors/LiDARSensor/

参考にしつつ進めて行きます。laserのステップや水平角度、ステップなど設定できそうですね。

```
Configuration - advanced lidar configuration (in most cases no need to change)
Laser Array - geometry description of lidar array
Horizontal Steps - the number of laser array firings between Min H Angle and Max H Angle
Min H Angle - minimum horizontal angle (left)
Max H Angle - maximum horizontal angle (right)
Max Range - maximum range of the sensor
```


とりあえず縦のラインを大胆に消してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/0aa94ae0-3980-ac75-a3aa-725ab86b0965.png)


全く違うセンサになってしまったのではないでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/80379efc-7f5a-e530-c881-d7edc87d4920.png)

configを１本だけのこしたら２Dになりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/3dab9503-e61b-a166-ea26-eef99d1964fa.png)

現在のhorizontal stepが1800なので0.2度の解像度担っているようです。
horizontal stepを4にすると90度ごとになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/b05e15e7-d273-c78c-9eee-584719c33016.png)

360度の全周囲lidarで1ライン、解像度１度で動かして見ようと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/e0893544-c758-d6aa-7dc7-462c44fd6686.png)

さてbuildしてみます。

https://qiita.com/ttanaka3/items/01ffe06f95f4d7a03e8a#build%E3%81%97%E3%81%A6application%E3%82%92%E4%BD%9C%E3%82%8B

Rvizから見てみるとpointcloudが小さいので9とかでかい数字にしてみます。それっぽく自己位置はハマってました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/6ae1d5c2-9135-31db-8329-0e203fd160d4.png)

autowareとあわせて実行してみるとなんとか動いてそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/52afd7a3-d693-9d3d-de13-6ba3e9b64475.png)

普通に走ると自己位置外れそうなので1km/h程度と低速で走る設定にしています。
![b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/9cc2ff30-5f8b-3013-f13a-6c1cb4887cae.gif)


# 終わりに
様々なセンサに合わせて設定を変えてみるとセンサを買う前にテストできそうです。
今出ている以下のセンサ以外にも様々なセンサがあるのでよかったら新しいセンサ構成のPRも出してみてください。
```
HESAI Pandar40P	
HESAI PandarQT64
Ouster OS1-64
Velodyne VLP-16
Velodyne VLC-32C
Velodyne VLS-128-AP
```
GoでHelloWorldプログラムを実装してみた

# 概要
Goの勉強でもしてみようかと思い、GoでHelloWorldプログラムを実装してみました。以下のページを参考にしました。
https://maku77.github.io/p/nuz369c/

# ソースコード
お決まりのHelloWorldプログラムです。
```main.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

# 実行結果
実行結果は以下の通り。コンパイル無しでの実行は以下の通りです。
```
$ go run main.go 
hello, world
```
コンパイルして実行したのは以下の通りです。
```
$ go build main.go 
$ ./main 
hello, world
```

# モジュール対応モードでアプリを作成する
ディレクトリを作り、中に移動します。
```
mkdir hello
cd hello
```
ディレクトリ内にソースファイルを作成する。
```main.go
package main

import "fmt"

func main() {
	fmt.Println("Hello Go")
}
```

Goモジュールの初期化を行う。
```
$ go mod init hello
go: creating new go.mod: module hello
go: to add module requirements and sums:
	go mod tidy
```

go.modの中身を確認する。
```go.mod
module hello

go 1.18
```

ビルドせずに実行する。
```
$ go run .
Hello Go
```

ビルドして実行する。
```
$ go build
$ ./hello 
Hello Go
```

何かの役に立てばと。
ChatGPT-3.5にどのプログラミング言語が自信があるか聞いてみた。

# ChatGPT-3.5にどのプログラミング言語が自信があるか聞いてみた。

エンジニアの皆さんはChatGPTを大いに活用していると思います。

プログラミング言語は様々ありますが、どの言語に対してもそれなりの精度で返してくれるみたいので、いろいろ聞いてみました。

## 【質問】あなたはどのくらいのプログラミング言語に対応していますか？

```
私は現在、Python、Java、JavaScript、C++、Ruby、PHP、Go、
Swift、TypeScript、Kotlin、Rust、Scala、Perlなど、広範囲なプログラミング言語に対応しています。
ただし、常に新しいプログラミング言語やバージョンが登場しているため、
私が完全にサポートできるすべての言語については保証できません。
また、プログラミング言語以外のトピックについても知識を持っていますので、
様々な分野の質問に回答することができます。こ
```
これは、大体予想通りですね。
広範囲の言語に対応しており、バージョン更新等があればうまくいかないかもしれないとのこと。

## 【質問】これらの言語のうち、どのくらいの精度が出せるかをそれぞれ正解率のパーセンテージで示して。

```
私が提供する回答は、OpenAIが提供するGPT-3.5モデルの正確性に基づいたものです。
ただし、正確性は入力された質問に依存するため、回答の正確性については100％保証できません。
以下に、私が提供するプログラミング言語に関する正解率の一般的な範囲を示します。

- Python：90-95％
- Java：85-90％
- JavaScript：85-90％
- C++：80-85％
- Ruby：80-85％
- PHP：75-80％
- Go：75-80％
- Swift：70-75％
- TypeScript：70-75％
- Kotlin：65-70％
- Rust：65-70％
- Scala：60-65％
- Perl：60-65％

上記は一般的な範囲であり、質問の種類や入力の形式によって正解率は異なる可能性があります。
また、私は常に新しい情報やコンテキストにアップデートされるため、
より高い正解率を提供できるように努めています
```

これは、かなり面白い結果だと思います。Pythonは90-95％と唯一下限が90％超えている。JavaやJavaScript等もまあま高い一方、PerlやScalaが低い。

## 【質問】なぜPythonの正解率は90-95％と高く、ScalaやPerlは低いのですか？

```
私が提供する回答は、OpenAIが提供するGPT-3.5モデルの正確性に基づいたものです。
正解率は、そのプログラミング言語の知識がモデルによってどの程度カバーされているか、
およびそのプログラミング言語に関する一般的な質問がどの程度頻繁に行われているかによって異なります。以下に、Pythonの正解率が高い理由をいくつか挙げます。

- Pythonは人気が高く、広く使用されているプログラミング言語であり、開発者コミュニティも大きいため、多数の質問が投稿されています。
- Pythonは比較的簡単な文法を持ち、初心者にも学びやすい言語であるため、質問も多いです。
- Pythonはデータサイエンスや機械学習などの分野でも広く使用されているため、専門的な質問も多いです。

一方で、ScalaやPerlの正解率が低い理由としては、以下のような要因が挙げられます。

- ScalaやPerlは、比較的マイナーな言語であり、使用する開発者の数がPythonやJavaなどの主要言語に比べて少ないため、質問が少ない傾向があります。
- ScalaやPerlは比較的複雑な文法を持つため、解決すべき問題が難しくなることがあります。
- これらの言語に関する知識や質問は、GPT-3.5モデルがより強力にカバーできるようになる可能性があります。
```

とのことです。人気言語だと学習データも多いからという、少し考えればわかる単純な理由ですね。ということは、Go言語やTypeScriptも

ユーザーが増える 
→ ユーザーがアウトプットを行う 
→ ChatGPTの学習データが増える 
→ 言語に対する精度が上がる 
→ 学習しやすい環境ができる 
→ さらにユーザーが増える

という好循環になるのでは？？

## Pythonの正答率は本当に90-95％なのか？

ChatGPTによると、Pythonの正答率は90-95％とのこと。
しかし、これは以下の条件が整った上での質問だと思います。

- 質問の意図が明確
- 事前条件がプロンプトにきちんと整理されて記述している。
- 基礎的な文法を質問者が理解している

とこれらの条件が整った上で、90％以上の正答率を出せるかと思います。

## 【質問】ChatGPTでプログラミングに関する質問を行い、期待する解答に近づけるポイントを教えてください。

```
以下は、ChatGPTでプログラミングに関する質問を行い、期待する解答に近づけるポイントです。

1. 質問の明確化：質問をできるだけ明確かつ簡潔にすることが重要です。
   どのプログラミング言語に関する質問なのか、どのような問題が発生しているのか、期待される出力は何かなど、必要な情報を提供するようにしましょう。

2. 詳細な情報提供：プログラムの実行環境、使用しているライブラリやフレームワーク、
   エラーメッセージなど、質問に必要な情報を提供することが重要です。

3. エラーメッセージの添付：プログラミングにおいて、エラーメッセージは解決策を見つける上で非常に重要です。
   エラーメッセージがある場合は、それをできるだけ詳細に提供するようにしましょう。

4. 試したことの提供：すでに試した解決策やアプローチについて提供することで、
   ChatGPTはより適切な解決策を提供できる可能性があります。

5. 質問の適切な言葉選び：適切な用語を使用することで、ChatGPTはより正確な解答を提供できる
   可能性があります。したがって、専門用語や正式な用語を使用するようにしましょう。

6. 質問のコンテキストの提供：プログラミングに関する質問をする際は、そのプログラムの背景、
   そのプログラムがどのような目的で作成されたのか、そのプログラムがどのように機能するのかなどのコンテキストを提供すると、
   ChatGPTはより適切な解答を提供できる可能性があります。

以上のポイントを念頭に置いて、明確で詳細な質問を行うようにしてください。
```

とのことです。「質問の明確化」「詳細な情報提供」はプログラミングに限らず、すべての質問 **（対人間にも）** に対して気をつけたいところですね。

これからは、**検索力 ＜ 質問力** の時代ですかね？？
pythonでnext.jsウェブアプリを作ってみましょうか。

pythonでフロントエンドプログラミングをする？

reactpyのようにpythonコードのjavascript変換の努力はあったけど、今紹介しようとするpyneconeの[公式サイト](https://pynecone.io)を見ると、それなりに体系が整っているようなので、一度見てみました。

pyneconeはpythonコードを取り込んでReact, NextJSなどで動くインタラクティブなウェブアプリを簡単に作ってくれるフレームワークです。簡単にウェブアプリを数分で作ることができ、配布も簡単で、既存のウェブ開発の柔軟性、性能を適度に備えたlow-codeフレームワークです。

これを作った理由はRedditのpynecone開発陣が投稿した記事によく書いてあります。

>We made Pynecone for Python devs who want to make web apps, but don’t want the overhead of having to learn or use Javascript. We wanted more flexibility than existing Python frameworks like Streamlit/Dash that don't allow the user to make real, customizable web apps.

Pyneconeは、ウェブアプリを作りたいが、Javascriptを学んだり、使用しなければならない学習費用を望まないPython開発者のために作りました。私たちは、ユーザーが実際にカスタマイズ可能なWebアプリを作ることができないStreamlit/Dashなどの既存のPythonフレームワークよりも、より多くの柔軟性を求めていました。

pyneconeを使うにはpython3.8以上、node 12.x以上のバージョンが必要です...。

結局pythonコードはjavascriptコードに変換され駆動はnodeを通じてしますが、今はnodeからbunに交換中だそうです(この記事を書いている現在駆動はbunを使います。でもインストールはnodeが必要です)。

nodeをインストールしてpythonがインストールされている場合、

```
>　pip3 install pynecone
```

でpyneconeを設置します。



設置が終わったらプロジェクトを生成してみましょう。

```
> pc init
```



すると、フォルダ名(ここでは`test`)でプロジェクトが生成されます。

```
➜  test tree .
.
├── __pycache__
│   └── pcconfig.cpython-311.pyc
├── assets
│   └── favicon.ico
├── pcconfig.py
└── test
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-311.pyc
    │   └── tutorial.cpython-311.pyc
    └── test.py

4 directories, 7 files
```



まず実行してみましょう。

```
> pc run
```



下のように`localhost:3000`でページが表示されると成功。

![스크린샷 2023-04-23 오전 1.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55902/d6cdad04-1153-8f5c-aea4-3c021d7f597a.png)


次は詳細なコンポーネントについて簡単に説明します。
アナログ回路のローパスフィルタと離散フーリエ変換の関係

# 初めに
アナログ回路のローパスフィルタとフーリエ変換の関係において以下の点ついてまとめる。

- サンプリング周波数より高い周波数の信号が存在する場合、フーリエ変換後にその成分が乗ってくる。よってAD変換する前にローパスフィルタを挟む必要がある。
- サンプリング周波数より高い周波数の波形成分は、フーリエ変換後に分離できない。

一般的に教科書では天下り的にサンプリング定理やエイリアシングに触れるが、実際にどのように効くのか説明されないのでまとめる。また数式を追う事はしない。

# どこで、この記事の知識が使えるか
IoTシステムやエッジAIシステム？、クラウドシステム？
ビックデータの時代とは言っても資源（サーバなど）は有限であり、データを軽くするために低周波サンプリングをしたがる人はいるのかもしれない。

基本的なフーリエ変換の復習だと思っていただければ幸いである。

# サンプリング周波数より高い周波数の信号
サンプリング周波数より高い周波数の信号が存在する場合、フーリエ変換後にその成分が低周波に現れる。また、`初めに`にて記述した通り、数式的な説明は行わない。

周波数`110 Hz`、振幅を`1`とするsin波をサンプリング周波数を`100 Hz`にて計測する。そして計測された波形をフーリエ変換する。ここでは、ファンクションジェネレータを用いるなど電子回路的に行うのではなく、pythonで簡易的に再現する。

```python
import numpy as np
import matplotlib.pyplot as plt

# サンプリング周波数
fs = 100

# 時間軸の設定
t = np.arange(0, 1, 1/fs)

# 110 Hzの正弦波信号を生成
f1 = 110
x = np.sin(2*np.pi*f1*t)

# フーリエ変換
X = np.fft.fft(x)

# 周波数軸の設定
freq = np.fft.fftfreq(len(x), d=1/fs)

# 周波数スペクトルのプロット
plt.plot(freq, np.abs(X/(len(t)/2)))
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude')
plt.xlim(0, fs/2)
plt.grid()
plt.show()
```
\>>>出力結果
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782290/56da6b74-fd11-2cc5-33cd-3ce6f75c2912.png)

横軸`Frequnecy [Hz]`において`10 Hz`で縦軸`Amplitude`が`1`になっている。フーリエ変換前に使用した波形は`110 Hz`のsin波であり、望ましい結果ではない。

このようにサンプリング周波数より高周波の信号は、低周波側の信号とみなされてしまう(エイリアシング)。上の出力結果から見て分かる通り、周波数`10 Hz`、振幅`1`の波形と区別できない。

よって、AD変換する前にナイキスト周波数(サンプリング周波数の半分)より高い周波数で、サンプリング周波数より低い周波数にカットオフ周波数が存在するアナログ回路のローパスフィルタを入れるのが良い。

サンプリング周波数を高くして計測し、AD変換して、フーリエ変換して、高周波成分の振幅を`0`にすればいいと主張する人がいるかもしれないが、AD変換の時点でナイキスト周波数以上の波形成分はナイキスト周波数以下の波形成分と混じってしまう。影響の大きさは、ケースバイケースだが、入手した信号が正確なものであるという保証はされない。

ローパスフィルタのカットオフ周波数はどこがベストかについては匙加減だと思っています。(すいません

# 結論

センサデータなど波形を計測する際にはアナログ回路のローパスフィルタを使用すべき。
vbsの作法 その59

# 概要
vbsの作法、調べてみた。
練習問題、やってみた。

# 練習問題
Windows11でInternet Explorer11を起動せよ。

# サンプルコード

```
CreateObject("InternetExplorer.Application").Visible = true

```

# 実行結果


Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko


以上。
STAMP PICOに汎用のUSBシリアルで書き込む



![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 自分用メモ。

スイッチサイエンスで専用の書き込み器を買ったはずなのですが、どこか奥深くにしまったようなのでアマゾンや秋月で売っている汎用のUSBシリアル変換で代用します。

## STAMP PICOを接続する

以下のように接続する

|STAMP PICO|USB-SERIAL|
|--|--|
|3v3|3v3/Vcc※1|
|Tx0|RX|
|Rx0|TX|
|EN|DTR|
|0|GND※2|
|GND|GND|

※1 USBシリアル変換は3V仕様のものか、ジャンパで3Vの設定にする。
※2 書き込み時はSTAMP PICOの0と書いてあるピンをGNDに接地させる。


## STAMP PICOに書き込む
文末の記事を参考にArduino IDEを設定したりLチカのプログラムを書き込んだりします。
STAMP PICOの0と書いてあるピンをGNDに接地させておくことを忘れずに。

## 実行する

書き込んだ後は、STAMP PICOの0と書いてあるピンをGNDに接地を外してから本体に電源を繋ぐと動きます。

## 参考
以下の記事を参考にさせていただきました。ありがとうございます。

https://tekuteku-embedded.xyz/2022/03/25/m5stamp-pico%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/

https://note.com/copipetech/n/n701bc48f8ea9
日本のサラリーマンにおける不労所得の重要性


## はじめに

日本のサラリーマンにとって、不労所得は非常に重要な概念です。日本経済が不安定で、低賃金が続く中、サラリーマンたちは将来の不安に直面しています。しかし、不労所得を得ることで、彼らは将来の不安を軽減することができます。

## 不労所得の概念を理解する
不労所得とは、労働をしなくても収入を得ることができる収入のことです。不動産投資、株式投資、副業、そして仮想通貨の自動売買など、様々な方法で不労所得を得ることができます。

### 日本のサラリーマンにとって不労所得はなぜ重要なのか
日本経済は不安定で、低賃金が続いています。サラリーマンたちは、将来の不安に直面しています。しかし、不労所得を得ることで、彼らは将来の不安を軽減することができます。不労所得を得ることで、サラリーマンたちは、将来の不安に対する心配を減らすことができます。

https://note.com/azurite_azu/n/na7e6c94eb9b0#a0442633-87c5-413f-abd2-d8bf0b16fccb


### 不労所得を得る方法

不労所得を得る方法は、様々なものがあります。株式投資、不動産投資、副業、そして仮想通貨の自動売買などがあります。これらの方法をうまく活用することで、サラリーマンたちは不労所得を得ることができます。

## 仮想通貨の自動売買の利点
仮想通貨の自動売買は、不労所得を得るための優れた方法の1つです。自動売買をすることで、サラリーマンたちは、自分でトレードする必要がなく、自分の時間を節約することができます。また、自動売買は、市場の変動に対して迅速に対応することができます。

https://note.com/azurite_azu/n/n62392554dbc8

## 結論

不労所得は、日本のサラリーマンにとって非常に重要な概念です。不労所得を得ることで、彼らは将来の不安を軽減することができます。仮想通貨の自動売買は、不労所得を得るための優れた方法の1つです。しかし、サラリーマンたちは、リスクと課題を理解し、適切な対策を講じる必要があります。

## FAQs

Q1. 不労所得とは何ですか？
不労所得とは、労働をしなくても収入を得ることができる収入のことです。

Q2. 仮想通貨の自動売買は安全ですか？
仮想通貨の自動売買には、セキュリティリスクがあります。しかし、信頼できる取引プラットフォームを選び、適切な対策を講じることで、リスクを最小限に抑えることができます。

Q3. 仮想通貨の自動売買を始めるには、どのくらいのお金が必要ですか？
仮想通貨の自動売買を始めるには、数千円から数万円程度の資金が必要です。

Q4. 仮想通貨の自動売買で生計を立てることはできますか？
仮想通貨の自動売買で生計を立てることは可能ですが、市場の変動によっては、損失を被ることもあります。

Q5. 仮想通貨の自動売買にはどのようなリスクがありますか？
仮想通貨の自動売買には、市場の変動、セキュリティリスク、そして適切な取引戦略の選択など、いくつかのリスクがあります。
ChatGPT 先に知識を生成させて、理想のブログ記事を取得する



<h2>先に知識を生成させて、理想のブログ記事を取得


追記　　どーせなら見てる方もやれるようにします

<h3>チュートリアル(ChtaGPTに入力してみてください)

1.コンピュータについてのブログ記事を200文字以内で書いて

2.コンピュータについて特に知っておくべき重要事項を列挙して

3.[2の出力結果をコピペ]以上を踏まえた上で、必要であれば引用しながらコンピュータについてのブログ記事を200文字以内で書いて


以上を一度実行してみてからだと脳に定着すると思いますっ
ここでは、ChatGPTに重要そうな文章を生成させてから、その内容を踏まえた上で
ブログ記事などを出力をさせると、具体度が増しますので、以下試してみます。

あ、ぼくあれですよ、別にChatGPTでこれかいてないですからね！？

まずコンピュータについて普通に200文字で書かせます(切り替え早っ)

![スクリーンショット 2023-04-23 12.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331212/9e6232ab-c820-b9df-4a99-b5d7deb16c09.png)



次に、コンピュータの重要事項を列挙させます

![スクリーンショット 2023-04-23 12.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331212/b377b84e-f3f7-53ec-575e-d7bb89532e28.png)


それを踏まえた上でブログ記事を書いてもらうと...

![スクリーンショット 2023-04-23 12.45.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331212/b51b4689-8e5e-e4f9-9d38-09b8a0d4af67.png)

CPUやメモリなどが登場しましたね。具体的に説明しようとする傾向が見られたと思います
より具体的に書かせたい時はこのように事前に生成させるといいですね
ffftpの設定移行

# 概要

windows10から、windows11へ、移行してみた。

# 環境
windows10
ffftp v4.4

windows11
ffftp v5.7

# 手順

# ffftp.regを書き出す。

[接続] → [設定] → [設定をファイルに保存]

# ffftp.regを読み込む。

[接続] → [設定] → [設定をファイルから復元] 

以上。
企業の技術力を可視化できるデータを集めてみた(GCP編)

※下記内容は個人的な意見と考え方です。
# はじめに
[企業の技術力を可視化できるデータを集めてみたという記事](https://qiita.com/sakaki_developer/items/347e6fdb1a119cae055e)が、思いのほか人気だったため続編を作成しました。
今回はGCPの受賞についてデータを表示したいと思います

https://cloud.google.com/blog/ja/topics/partners/partner-top-engineer-2023-award-winners



## cGoogle Cloud Partner Top Engineer 2023 アワードプログラム 受賞された会社一覧と人数を調べてみた

|会社名|受賞人数|
|---|---|
|クラウドエース株式会社|6|
|株式会社野村総合研究所|6|
|クラスメソッド株式会社|5|
|株式会社NTTデータ|5|
|SCSK株式会社|3|
|アイレット株式会社|3|
|アクセンチュア株式会社|3|
|ソフトバンク株式会社|3|
|吉積情報株式会社|3|
|日本情報通信株式会社|2|
|Datadog Japan合同会社|1|
|NECソリューションイノベータ株式会社|1|
|SAPジャパン株式会社|1|
|ジーアイクラウド株式会社|1|
|デロイト トーマツ コンサルティング 合同会社|1|
|デロイトトーマツノード合同会社|1|
|伊藤忠テクノソリューションズ株式会社|1|
|株式会社G-gen|1|
|株式会社unerry|1|
|株式会社トップゲート|1|
|株式会社大和総研|1|
Wine で ShellExecuteEx が失敗

# 環境

- Wine7.0.1
- Ubuntu20.04

# ShellExecuteEx が失敗

Kindle をインストールしようとしたらエラー

```
$ wine KindleForPC-installer-1.40.65535.exe 
MESA-INTEL: warning: Performance support disabled, consider sysctl dev.i915.perf_stream_paranoid=0

アプリケーションを開始できません。もしくは、指定したファイルにアプリケーションが関連付けられていません。
ShellExecuteEx が失敗: ファイルが見つかりません。

```

となる。ぐぐっても解決策はみつからなかったので、英語のエラーメッセージを確認
```
$ LANG=C
```
として再現させる

```
$ wine KindleForPC-installer-1.40.65535.exe 
MESA-INTEL: warning: Performance support disabled, consider sysctl dev.i915.perf_stream_paranoid=0

MESA-INTEL: warning: Performance support disabled, consider sysctl dev.i915.perf_stream_paranoid=0

Application could not be started, or no application associated with the specified file.
ShellExecuteEx failed: File not found.
```

# 原因

KindleForPC-installer-1.40.65535.exe 

がカレントディレクトリにあると思ったら無かった。

Wine はちょっと感触が違うので戸惑ったけれど、わかれば当たり前の話。

つまづいた記念に記事化。
〇Windowsのタスクスケジューラを使って、毎日定時でGmailを開く〇

マニュアル用に投稿。

⓵タスクスケジューラを開く。
・Windows 10の場合、「Windowsキー + X」を押してメニューを開き、「タスク スケジューラー」を選択。
⓶「タスクスケジューラ ライブラリ」を展開し、「タスクの作成」をクリック。
⓷「一般」タブで、タスク名と説明を入力。
⓸「トリガー」タブで、「新規」をクリック。
⓹トリガーを設定する画面で、「毎日」を選択し、開始日と時刻を指定。
・例えば、毎日朝9時にGmailを開きたい場合は、「開始日」には今日の日付を、時刻には「9:00」を指定。
⓺「操作」タブで、「新規」をクリック。
⓻アクションには、「プログラムの開始」を選択し、「プログラム/スクリプト」には「https://mail.google.com/」と入力。
⓼「設定」タブで、必要に応じてユーザーアカウントを指定。
⓽「OK」をクリックして、タスクを作成。

これで、毎日指定した時刻にGmailが自動的に開かれるようになる。
タスクスケジューラを使えば、定期的な作業やリマインダーなどを自動化できるので、効率的な作業ができる。
WindowsでAzure CLIとAzure Developer CLIを使えるようにする

# はじめに
今まではAzureリソースの操作はAzureポータル上で済ませることが多かったですが、CLIでも操作する必要が出てきたので、備忘録としてWindowsで`Azure CLI`と`Azure Developer CLI`の使用方法について簡単にまとめました。

# Azure Cloud Shell で Azure CLIを使用
Windowsではありませんが`Azure CLI`を使用するだけなら、[azure portal](https://portal.azure.com/)でブラウザー上で実行するのが最も簡単です。ポータル右上に並ぶ一番右のアイコンを選択すると、`Azure Cloud Shell`がブラウザーの下部に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/15ce28e3-9a0a-aa72-f040-b051f12e0a40.png)
ストレージがマウントされていない場合は、ストレージを作成するサブスクリプションを選択した後に、「ストレージの作成」を押す必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/a98ab027-35b7-a33d-0c21-f9018580aeed.png)

# PowerShell で Azure CLIを使用
Windowsで`Azure CLI`を使用するために、マイクロソフトインストーラー(`MSI`)を使ってインストールすることができますが、Windowsパッケージマネージャー(`winget`)を使ってインストールすることもできます。今回は`winget`で`Azure CLI`をインストールしました。まず、`winget`が入っているかを確認します。
```PowerShell:Powershell
winget --version
```
実際に`Azure CLI`をインストールします。
```PowerShell:Powershell
winget install -e --id Microsoft.AzureCLI
```
`Azure CLI`がインストールされています。
![スクリーンショット　2023-04-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/6a479b2a-acc4-0ef2-b14c-fe758de477fa.png)
インストール中はダイアログボックスが表示されるので、1,2分程待ちます。
![スクリーンショット 2023-04-23 113521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/9f76493d-876d-d01b-4c3e-089aa35dfb84.png)
インストールが完了し、ダイアログが消えたらPowerShellを起動し直して、`Azure CLI`のバージョンを確認します。
```PowerShell:PowerShell
az --version
```
バージョンが正しく表示されれば、`Azure CLI`のインストールは成功です。
![スクリーンショット 2023-04-23 113936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/dd64eca8-0ebd-48bf-3607-26162a91ba63.png)

# PowerShell で Azure Developer CLIを利用
PowerShellで以下のコマンドを実行することで、`azd`コマンドが利用できるようになります。
```PowerShell:Powershell
winget install microsoft.azd
```
詳細は以下の公式ドキュメントをご覧ください。

https://learn.microsoft.com/ja-jp/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows

# おわりに
`winget`を使って簡単に`Azure CLI`と`Azure Developer CLI`をインストールすることができました。Azureポータルも便利ですが、今後は折角なので`Azure CLI`と`Azure Developer CLI`も使えるようにしたいです。
ubuntu  windows django


sudo vi jango.sh 
```
sudo apt install git 
sudo apt-get install apache2 apache2-dev gdal-bin libgdal-dev
sudo pip install mod-wsgi mod-wsgi-httpd
sudo apt install libapache2-mod-wsgi-py3
sudo pip3 install -y uwsgi
sudo apt-get install -y apache2
sudo apt install -y apache2 wget unzip
sudo pip3 install mod-wsgi mod-wsgi-httpd
sudo apt-get install -y python3-pip
sudo apt-get install -y mysql-server
sudo apt-get install -y default-libmysqlclient-dev
sudo apt-get install python3-dev default-libmysqlclient-dev
sudo apt-get install -y python3.8 python3.8-dev python-is-python3 -y
sudo apt-get install -y sqlite3
sudo pip3 install mysqlclient
sudo pip3 install Django

```
sudo chmod u+x jango.sh 
sudo ./jango.sh

```
django-admin startproject mydjango
django-admin startapp board

```

setting.py
```


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'board',    #☆
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'jangoredis.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'jangoredis.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db名',
        'USER': 'ユーザー名',
        'PASSWORD': 'パスワード',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

```

# postgresql (windows)

```

PS C:\Users\User\Desktop>django-admin startproject mydjango
cd .\jangoapp\
PS C:\Users\User\Desktop\jangoapp> pip install psycopg2-binary
python manage.py makemigrations board
python manage.py migrate
python manage.py runserver

```

#データベース設定
```
DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.postgresql_psycopg2',
         'NAME': 'jangoapp',
         'USER': 'postgres',
         'PASSWORD': 'pass',
         'HOST': 'localhost',
         'PORT': '5432',
     }
 }

```
スプシの式をGPTで生成する関数を作った

# 概要
Googleスプレッドシート(以下スプシ)を使っている際に行いたい処理に使う関数名を思いつかないことがあります。
それを毎回ググって見つけるのが面倒なのでスプシ内で簡単に解決するツールを作りました。

# 動作の様子
![スプシの式をGPT関数で生成するデモ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/3358a8cd-5553-8565-61d3-78bc54a7750e.gif)

# 操作説明
1. スプシのセルに`=GPT("<やりたいこと>")`を入力する
1. 手順1のセルに出てきた数式を任意のセルに貼り付ける

# 作り方
## 必要なもの
- スプシ
- OpenAI APIのキー
  - [こちら](https://openai.com/blog/openai-api)から取得できます
  - 初めての方なら1ヶ月は無料です
  - 無料期間が終わっても常識的な範囲で使えば1ヶ月当たり10円もかからないと思います
    - 実行一回当たり大体0.01円です

## 手順
1. スプシを開く
1. 上部のメニューバーの拡張機能 > Apps Scriptをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/39d6da31-306d-86a6-b828-e28c02f46ebd.png)
1. 左の歯車マークのタブの下部で以下の通りスクリプトプロパティを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413932/9d85a8cb-5934-0e16-336d-8a9b219a4459.png)
1. 以下のコードをエディタに貼り付ける

```javascript
/**
 * @param {string} input どんなことをする式を生成したいか
 * @return {string} 式
 * @customfunction
 */
function GPT(input) {
  const msgs = [
    { role: "system", content: "次の要求を満たすGoogle SpreadSheetの式を出力して。出力には自然言語を含めず式のみにして"},
    { role: "user", content: input},
  ];
  return FetchGptCompletion(msgs);
}

/**
 * @typedef {Object} Message
 * @property {string} role systemかuserかassistant
 * @property {string} content
 * 
 * @param {Message[]} msgs
 * @return {string}
 */
function FetchGptCompletion(msgs) {
  const ENDPOINT = 'https://api.openai.com/v1/chat/completions';
  const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_KEY');

  // リクエストのボディを作成
  const requestBody = {
    // モデルを指定
    model: 'gpt-3.5-turbo',
    // クエリとなる文字列を指定
    messages: msgs,
    // 回答文の最大トークン数。日本語なら文字数と大体同じ
    // GPT-3.5なら1000辺り$0.002なので大きめでもOK
    // 式を出力してもらうため少なめ
    max_tokens: 100,
    // 回答の多様性
    // 式を出力してもらうため低め
    temperature: 0.2,
  };

  try {
    // リクエストを送信
    const res = UrlFetchApp.fetch(ENDPOINT, {
      method: 'POST',
      headers: {
        Authorization: 'Bearer ' + apiKey,
        // 答えはjsonでほしい
        Accept: 'application/json',
      },
      // これが無いとpayloadがOpenAIのサーバーに読まれない
      contentType: "application/json",
      // これが無いとpayloadがOpenAIのサーバーに読まれない
      payload: JSON.stringify(requestBody),
    });

    const resCode = res.getResponseCode();
    if(resCode !== 200) {
      if(resCode === 429) return "利用上限に達しました。このAPIの管理者が上限を変更しない限り来月まで使用できません"
      else return `レスポンスコード: ${resCode}`;
    }

    var resPayloadObj = JSON.parse(res.getContentText())
    if(resPayloadObj.choices.length === 0) return "予期しない原因でAIからの応答が空でした";

    const rawAnswerText = resPayloadObj.choices[0].message.content;
    // 先頭に改行文字が2つあるのは邪魔なので消す
    const trimedAnswerText = rawAnswerText.replace(/^\n+/, "");

    return trimedAnswerText
  } catch(e) {
    const errorMsg = `APIリクエストに失敗しました。\n${e.stack}`
    console.error(errorMsg);
    return errorMsg;
  }
}
```
以上！

# まとめ
複雑なことをしようとするとそのままでは使えない式を出力することが多いです。しかし、ちょっと修正すれば動くようになります。業務に便利だと思います。
telnetでログイン

ZRouterでビルドしたイメージはデフォルトではtelnetが使えてid:root,pw:rootでログインできるようになっています。

FreeBSDやNetBSDのホストからモジュールにtelnetすると現在のUSER環境変数が渡ってしまって、都合がよくありません。

```
c1k: {1} telnet 10.0.1.18
Trying 10.0.1.18...
Connected to 10.0.1.18.
Escape character is '^]'.
Password for hiroki@:
```

.telnetrcに下記を書くとUSERは渡らなくなります。

```
DEFAULT
  unset autologin
```

またtelnet -l rootとすればrootのpwの入力のみになります。

```
c1k: {2} telnet -l root 10.0.1.18
Trying 10.0.1.18...
Connected to 10.0.1.18.
Escape character is '^]'.
Password for root@:
```

毎回オプションを設定するのが面倒なので、tcshのaliasしました。

```
alias telnet telnet -l root
```

WindowsのターミナルソフトのRLoginには「チャットスクリプト」という機能があり、記録させてid,pwの自動入力ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/098329da-880e-1934-3916-63c0eb99e0cc.png)

ストリーミングを再生しているホストはmpg123の起動まで入れました。

FreeBSD 14ではセキュリティ上の懸念からtelnetが無くなるようですが、自宅で自分しか使わないネットワークであればtelnetを使っても問題ないと思います。

portsにsshサーバーのdropbearがあり8M Flashであれば入れる事が出来ます。
GitHub Actionsでコミット履歴を参照する

# 問題点

- GitHub Actionsのpushイベントでは、CIが実行される前のコミットIDが`github.before.event`、最新のコミットIDが`github.sha`で参照できる
- 複数のコミットをまとめてプッシュした際に、最新のコミットID以外を参照したいといったケースが発生することがあるが、あらかじめ環境変数としては用意されていない

# 解決策

- `github.before.event`と`github.sha`を利用してコミット履歴から抽出する

# 検証

- 設定

```yaml:.github/workflows/main.yml
name: Commit log example

on:
  push:

jobs:
  job1:
    runs-on:
      - ubuntu-latest

    steps:
      # リポジトリをクローンする
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          # コミット履歴をどこまで遡って参照できるかの設定
          # デフォルトでは 1 に設定されており、最新のコミット履歴しか参照できない
          # 0 に変更することで、リポジトリの完全なコミット履歴を参照できるようになる
          # ただし、コミット履歴が大きくなるとクローンに時間がかかるため、ボトルネックになる場合は適切な値を設定する
          fetch-depth: 0

      - name: Display commit log
        # コミットID..コミットID とすることで、表示するコミット履歴の範囲を指定することができる
        # --format="%s %H" と指定することで、コミットメッセージとコミットIDをワンライナーで表示できる
        run: git log ${{ github.event.before }}..${{ github.sha }} --format="%s %H"
```

- 実行結果
    - 最新のコミットID以外も参照できていることが分かる

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/b50405c9-d186-0a04-ff27-03b522c99fdc.png)

# Dockerコンテナを使用する場合

- Dockerコンテナ上でジョブを実行する場合は以下のような対応が追加で必要となる場合がある

```yaml:.github/workflows/main.yml
name: Commit log example

on:
  push:

jobs:
  job1:
    runs-on:
      - ubuntu-latest

    # Dockerコンテナ上でジョブを実行する
    container:
      image: debian:stable-slim

    steps:
      # 指定したDockerイメージにgitがインストールされていない場合に必要
      - name: Install dependent packages
        run: apt-get update && apt-get install git -y

      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      # リポジトリに設定されている所有者とアクセスしているユーザが異なる場合にエラーが発生する
      # おそらく、Dockerコンテナ上にリポジトリがマウントされた際に、リポジトリの所有者がホストマシンのユーザのままになっていることが原因
      # このエラーは無視しても特に問題無いので以下のコマンドで無視するように設定する
      - name: Add safe directory
        run: git config --global --add safe.directory $PWD

      - name: Display commit log
        run: git log ${{ github.event.before }}..${{ github.sha }} --format="%s %H"
```
AWS SOA-C02にぎりぎり合格した話

こんにちは。yuzu_juiceです🥂
昨日(2023/04/22)に受験したSOA-C02を振り返りたいと思います。



# 私のクラウド知識レベル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086592/54f918a3-d450-71e5-507c-8e9e94a8aecd.png)
こんな感じです。

# 試験について
今はラボ試験の評価・改善中らしく、ラボ試験がありませんでした。
そのため、試験は以下の構成でした。
- 試験時間：130分
- 問題数：65問(多肢選択式、複数選択式)


# 勉強法
勉強期間：10日
勉強時間：15時間

教材は以下3つを使いました！
- Blackbelt
- 公式サンプル問題
- 公式模擬テスト

## Blackbelt
Youtubeで視聴しました。
Youtubeだと解説付きなので、PDF見るだけに比べてハードル低めです👍
↓↓↓こういうのを見ました↓↓↓
[CloudWatch](https://youtu.be/fzVkJne3OMI)
[CloudFormation](https://youtu.be/Viyqh9fNBjw)
[System Manager](https://youtu.be/UXSbh4Wsp7c)

他にもいろいろと面白い動画があるので、ぜひ！！


## 公式サンプル問題
https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sysops-associate/AWS-Certified-SysOps-Administrator-Associate_Sample-Questions.pdf

受験申込時と、受験前日に1回ずつ解きました。


## 公式模擬テスト
最近まで知らなかったのですが、AWS Skill Builderで模擬試験が無料で受けられる…(もっと早く知りたかった)
Skill Builder内で、"Question Sets"と調べると模擬試験が出てきます。
https://skillbuilder.aws


# 試験結果
736点でぎりぎり合格でした。(720/1000点が合格ライン)
ひやひやします。

圧倒的練習問題不足でした。やっぱりUdemyやるのが無難ですかね…

# 今後に向けて
近いうちにAWS Certified Developer - Associateを受験します。
目指せ12冠👑
outlook2007のプロジェクト移行

# 概要

outlook2007のプロジェクトを、windows10から、windows11に移行してみた。

# 環境
windows10 64bit
outlook2007

# 手順

# プロジェクトの移行。

C:\Users\****\AppData\Roaming\Microsoft\Outlook\VbaProject.otm
をコピペする。

# セキュリテイの設定。

ツール　>セキュリテイセンター　>マクロのセキュリテイ　>全てのマクロに対して警告を表示する。

以上。
ABC299回答メモ

0.はじめに
　途中で502エラーとかでて問題すら見えない状態に。
　すぐ復旧しましたが、先週に続いてNoratedに。
　記念すべき300回を前にして変な邪魔が入って悲しいです・・・。

　結果自体はA~Cは解けましたが、Dは今一解き方がわからず
　時間切れ。解説を見てなんとか解けました。

1.A - Treasure Chest
　回答速度優先で単純に以下を実装
　
　状態遷移を保持する変数flgを用意
　flgに0をセット
　文字列を1文字目から見ていき、
　flg=0かつ、文字が"|"の時flgを1に変更
　flg=1かつ、文字が"*"の時flgを2に変更
　flg=2かつ、文字が"|"の時flgを3に変更
　文字列をすべて見た後で
　flgが3であれば、inを出力
　そうでなければoutを出力

　https://atcoder.jp/contests/abc299/submissions/40831705

2.B - Trick Taking
　こういうゲーム系問題が出ると、このゲーム面白いの？とか余計なことを
　考えて問題に集中ができなくなります・・・。

　気を取り直してチャレンジ。
　頭からカードを見ていって、①Tとマークが一致するカードをもとにしたチェックと
　②1枚目のマークと一致するカードをもとにしたチェックを行う。
　①のチェックに該当するカードがあれば、それを表示し
　なければ②のチェックのカードを表示する。
　ややこしくはありましたが、素直に実装してACでした。

　https://atcoder.jp/contests/abc299/submissions/40841499

3.C - Dango
　最初はCにしては簡単かと思ったけど意外と奥が深い感じでした。
　
　串("-")があったかを保持する変数と、団子"o"が連続した最大数を保持する変数dmを用意し
　Sを頭からチェック。
　
　チェック後、串がなかったら”-１”を出力、あったらdmを出力。

　と、簡単に行けそうなところを実装ではいろいろゴテゴテしてしまいました。

　https://atcoder.jp/contests/abc299/submissions/40855632

4.D - Find by Query
　雑に頭から10個末尾から10個0と1の先がないかをチェックするという
　処理を作ったところやはりWA。
　2分探索も考えましたが、それでうまく境目が見つかる自信がありませんでした。

　解説を読み、2分探索　でどこでもいいから境目が見つかればいいという考え方を
　知り、なるほどな。となりました。


　https://atcoder.jp/contests/abc299/submissions/40890383

以上
[Linux]プロセスとジョブ

# プロセスとは?
実行中のプログラムのことをプロセスと呼びます。プロセスは、1つのコマンドを実行することによって、実行ファイルをメモリに格納し、メモリ上でCPUがプログラムを実行します。このメモリ上で実行中のプログラムがプロセスになります。

また、コマンドを実行するたびに、プロセスは別々のものが作られそれらはプロセスごとに一意のプロセスIDが割り当てられています。このプロセスは、ファイルのオーナーと同様に実行ユーザーが設定されており、他人のプロセスを操作することはできません。

# psコマンド

実行中のプロセスを表示するコマンドです。(自分が起動したプロセス)

```
$ ps 
   PID TTY         TIME CMD
 9793 pts/0     0:00.00 bash
13376 pts/0     0:00.00 ps
```

「PID」 ・・・ プロセスID
「TTY」 ・・・ プロセスが実行されている端末
「TIME」 ・・・ 実行時間(CPU時間)
「CMD」 ・・・ コマンド/プログラムファイル名

### オプション「aux」
全ユーザーのプロセスをより詳細に見ることができます。

aは他の端末で実行されているプロセスの表示、uはユーザー名を含めて実行プロセスを表示し、xはpsコマンドを実行したユーザー全てのプロセスの表示、を意味します。

その他に、パイプ(|)でgrepと組み合わせによって、絞り込みも可能です。

```
$ ps aux 
USER PID %CPU %MEM    VSZ  RSS TTY STAT START TIME COMMAND
root   1  0.0  0.4 194072 4560   ?   Ss 13:33 0.07　/usr/lib/systemd/syste
```

「USER」 ・・・ 実行しているユーザー名
「PID」　・・・ プロセスID
「%CPU」 ・・・ CPU使用率
「%MEM」 ・・・ メモリ使用率
「VSZ」 ・・・ 仮想メモリを含んだメモリ使用量
「RSS」 ・・・ 実際の使用メモリ
「TTY」 ・・・　実行しているターミナル
「START」 ・・・ プロセスの状態
「TIME」 ・・・　実行時間(CPU時間)
「COMMAND」　・・・　コマンド名

# ジョブ
まとめて実行されるプロセスの集まりがジョブであり、シェルごとに管理されます。
またそれぞれのジョブには、「ジョブ番号」がシェルによって割り当てられています。


コマンドを入力して「Enter」キーを入力することで、1つのジョブが作成されます。また、「ls | more」と実行した場合は、lsコマンドとmoreコマンド、2つのコマンドが実行されますが、これも1つのジョブになります。


## ジョブとプロセスの違い
プロセスは、プログラムの実行単位で、プロセスIDはカーネルによって管理されています。

また、ジョブは、複数のコマンドをまとめたものでプロセスの集まりになります。

## バックグラウンドとフォアグラウンド
シェルの画面外でコマンドを実行することをバックグラウンド、シェルの画面内で実行することをフォアグラウンドと呼びます。

### jobsコマンド
現在のジョブの一覧を表示するコマンドのことです。

```
$ jobs
[1]+ 実行中 sleep 10 
```
ジョブID、実行状況、実行コマンドを表示します。


### fgコマンド
ジョブをフォアグラウンドにするコマンドです。

```
$ fg %<ジョブID>
```
Ctrl + zで処理を一時停止できます。

コマンドの後ろに"&"をつけると、フォアグラウンドになります。

```
$ sleep 10 &
```

### bgコマンド
ジョブをバックグラウンドにするコマンドです。

長い時間がかかる処理をバックグラウンドで実行することによって、コマンド処理が終わるの待たずに、他の処理を行うことができます。

```
$ bg %<ジョブID>
```

# killコマンド
ジョブやプロセスを終了させるコマンドになります。

```
$ kill %<ジョブID>
```
フォアグラウンドのジョブはCtrl+cで終了できるのに対して、停止中のバックグラウンドのジョブはkillコマンドで終了できます。



# 参考
https://www.udemy.com/course/unscared_linux/

https://www.kcct.co.jp/careetec/magazine/column/hishinuma-linux-syoshinnsya10/

http://www.code-magagine.com/?p=3372#:~:text=%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A8%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E9%81%95%E3%81%84,%E3%81%AE%E9%9B%86%E3%81%BE%E3%82%8A%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
PlanetScale vs TiDB vs Supabase vs Aiven vs YugabyteDB【無料MySQL/PostgreSQL】

|          | PlanetScale | TiDB  | Supabase   | Aiven | YugabyteDB |
|----------|-------------|-------|------------|------------|------------|
| **エンジン** | MySQL | MySQL | PostgreSQL | MySQL8.0.30/PostgreSQL/Redis | PostgreSQL |
| **価格** | 無料 | 無料 | 無料 | 無料 | 無料 |
|**容量**| 5GB | 5GB | 500MB | 5GB | 10GB |
|**日本のリージョン**| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/9aac48c5-1a41-10cb-91f9-6e9a715180f2.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/12dbe355-455d-b605-1b16-3a7f9b24825c.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/7968be01-c859-a8b0-9b8a-af177f09be1b.png) | aws-ap-south-1 | AWS/GCP![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/c767f4bc-9f33-48bd-ea8f-374c1a77c9de.png) |

# 接続手順

https://qiita.com/7mpy/items/7e2e360da37f2f475838

https://qiita.com/7mpy/items/3d43b4f40f261d8da45d

https://qiita.com/7mpy/items/e336056b2c8eda82cd09

Deno DeployからPlanetScale/TiDBには接続できません

https://github.com/denodrivers/mysql/issues/118

https://github.com/sail-sail/mysql2/issues/5

# まとめ

RDBしか勝たん

# 引用

https://planetscale.com/pricing

https://www.pingcap.com/tidb-cloud-serverless-pricing-details/

https://supabase.com/pricing

https://qiita.com/tomozilla/items/d9f72bfb4bac265ef410

https://www.koyeb.com/blog/which-cloud-database-platform-to-choose-for-your-applications

YugabyteDB
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/a777099a-b6a7-c37b-c794-1ccd72633c0c.png)