OmniAICreator/Qiita-1.07M huggingface dataset:
Nuxt3 Beta環境にExpressを導入する

（以前社ブログに投稿していた記事の再掲です）

Nuxt3 Beta環境にExpressを導入する手順をまとめました。

また、Nuxt3 Betaの環境構築については以前の記事を参考にしてください。

# **はじめに**

**Expressとは**

Expressとは、Node.jsで使用できるWebアプリケーションフレームワークです。

Expressを用いることで、Node.jsを用いてのWebアプリ開発の効率を上げることが出来ます。

# **手順**

### **1. Expressのインストール**

早速Expressのインストールからやっていきます。

まず、yarn addコマンドを実行しExpressを取得します。

```bash
yarn add express
```

次に、Expressの型定義を取得します。

```bash
yarn add -D @types/express
```

### **2. server-middlewareの実装**

Expressをserverディレクトリに実装するとうまくいきません。

Expressを実装するには、server-middlewareを作成しコンフィギュレーションを設定する必要があります。

まず、プロジェクト直下にserver-middlewareディレクトリを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681767/2b5f33e7-5dd2-f494-c88b-6973a167f4a0.png)

次に、server-middlewareディレクトリにindex.tsを以下内容で作成します。

```index.ts
import express from "express";
const app = express();

app.use(express.json());

app.get("/", (req, res) => {
  res.json({
    message: "test",
  });
});

export default app;
```

### **3. nuxt.config.tsの設定**

既存のnuxt.config.tsに以下serverMiddlewareを追記します。

```nuxt.config.ts
import { defineNuxtConfig } from "nuxt3";

export default defineNuxtConfig({
  serverMiddleware: [
    { path: "/server-api", handler: "~/server-middleware/index.ts" },
  ],
});
```

### **4. 実行**

yarn installを実行します。

```
yarn install
```

プロジェクトを実行します。

```
yarn dev
```

nuxt.config.tsファイルに設定した通り、/server-api/にアクセスします。

以下のような画面になっていればOKです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681767/a216d968-1b84-fb56-77c3-f4226e42fafb.png)

### **表示されないとき**

最新バージョンで実行すると、以下のような画面が表示されるのではないでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681767/82ac5b13-8972-9aab-4e20-2a97a3a31871.png)

その場合、以下に記述する手順でNuxtのバージョンを3.0.0-27319101.3e82f0fに落としてから再度実行してみてください。

想定通りの挙動が確認できるはずです。

### **Nuxtのバージョンを変更する手順**

１．node_modulesディレクトリを削除

２．yarn_lockファイルを削除

３．package.jsonのdevDependenciesを以下のように変更

```package.json
  "devDependencies": {
    "@types/express": "^4.17.13",
    "nuxt3": "3.0.0-27319101.3e82f0f"
  }
```

４．yarn installを実行

お疲れ様でした！これでNuxt3 Beta環境にExpressを導入することが出来ました！

この記事が皆さんのお役に立てていれば幸いです。
NewRelicでのログ監視(stream使用)

# 概要
newrelicでログ監視を設定したときに確認したことをメモ書きする。

## logファイルはつかんでおく必要がある
5分間隔でpingを行い結果をファイルに出力し、エラーが出た場合にアラートを上げたいという状況の場合

```
 $logfile = "C:\Users\mou34\logs\test.log"

while ($true) {
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $result = Test-NetConnection -ComputerName "localhost" -Port 80

    if ($result.TcpTestSucceeded) {
        $status = "ok"
    } else {
        $status = "error"
    }

    $logEntry = "$timestamp - Connection test result: $status"
    Add-Content -Path $logfile -Value $logEntry

    # Sleep for 5 minutes (300 seconds)
    Start-Sleep -Seconds 300
}

```
newrelicのエージェントにより以下のエラーとなってしまう。

```
Add-Content : 別のプロセスで使用されているため、プロセスはファイル 'C:\Users\mou34\logs\test.log' にアクセスできません
。
```

そのため下記のようにstreamを使用する。
```
 $logfile = "C:\Users\mou34\logs\test.log"

while ($true) {
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $result = Test-NetConnection -ComputerName "localhost" -Port 80

    if ($result.TcpTestSucceeded) {
        $status = "ok"
    } else {
        $status = "error"
    }

    $stream = [System.IO.StreamWriter]::new($logfile, $true)

    $stream.WriteLine("[$timestamp] - Connection test result: $status")

    $stream.Close()

    # Sleep for 5 minutes (300 seconds)
    Start-Sleep -Seconds 300
}
 

```
[Oracle Cloud] Base Database バージョン アップグレードでこけた

## はじめに

作成して長期経過したBaseDB インスタンスのバージョンアップを試みた際に失敗したので、その状況を残す

## 環境詳細

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/c0110b06-8be1-3868-56df-5d6a78fb9c32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/a3ef03e6-06d1-ec6e-2706-e8f7bef9dd3d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/a46db209-9720-aa33-db1a-2d26473601b5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/2c1ef6c3-de98-6db8-2f45-46282f320ea7.png)

## 作業

データベースのバージョンの横の「表示」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/bbcbad80-af28-2f9b-fd7e-3ed1e8b0dfa0.png)


事前チェックの実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/e59641c5-94aa-a160-d3ae-14191110a6c7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/75b0fb2c-7498-862f-441b-d237b37465db.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/b90c8358-fb29-7344-50a7-67dc73aebe99.png)

事前チェックに失敗

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/a2fdddfe-4169-d964-c7ee-0b180e0db8c0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/68362223-c8df-c447-07eb-6aba6f8df73b.png)

記載されていたurl

https://docs.oracle.com/en/cloud/paas/base-database/troubleshoot-update/index.html#articletitle

原因については引き続き調査してみます
ライブラリのアップデート時に確認すること

# 概要
https://zenn.dev/pocke/articles/7177a7e6670a11

https://qiita.com/vivid_muimui/items/633969b8a984dbc5c3eb

ライブラリのアップデート時の確認としては、基本的にこちらに書いてあることを実践すれば良いと思います。
以下では上の記事に記載されていることの具体的な実施方法や、追加で個人的にやったほうがいいと思うことを記載します。

# Breaking Change有無の確認方法
対象のライブラリのGitHubのChange Logやリリースノートを確認することで、Breaking Changeの有無を確認可能です。
New FeaturesやBug Fixに関しても同様に行えば良いので、これらに関する説明は省きます。

## Change Logの確認方法
きちんとしたライブラリであれば、リポジトリにCHANGELOG.mdのようなファイルがあります。

↓rmagickの例

https://github.com/rmagick/rmagick/blob/main/CHANGELOG.md

Change Logには名前の通り、各バージョンにおける変更内容の一覧が表示されているので、現在のバージョンとアップデートしたいバージョンまでのバージョンまでに、Breaking Changeがないかを確認すればよいです。

Breakingで検索すれば、簡単に確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965739/1422e79b-2625-3283-5b1e-aabbc98292d5.png)

## リリースノートの確認方法
対象のライブラリのGitHubのReleasesの箇所を確認すればよいです。
Breaking Changeなどの探し方に関しては上と同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965739/2aaba4cf-8dea-f7dc-4caa-661aa43fb53c.png)

# その他やるべきこと
Breaking Changeがない場合でも、動作確認はしたほうがいいです。
まれにBreaking Changeがサイレントリリースされていることがあったり、見落としがあったりする可能性があるからです。
影響を受ける可能性がある、サービスの主要機能をざっと動作確認すれば良いと思います。
また、言語のバージョンアップなど、影響範囲が全体にわたるようなものの場合は、チームメンバーの協力を仰ぐなどして全体的な動作確認をすべきだと思います。


# ToDoリスト
```md
- [ ]  アップデートの目的確認
- [ ]  production用かdevelopment用かtest用か確認
- [ ]  メジャー・マイナー・パッチのどれがどれくらい上がったかを確認
- [ ]  該当バージョンがリリースされてからあまりにも短くないか確認
    - [ ]  リリースされてから数日程度しか経っていない場合は、新しいバグが発見される場合があるため様子を見る or バグを発見したら切り戻してバグ報告をする
- [ ]  ライブラリについて理解
- [ ]  ライブラリがプロダクションコードでどのように使われているか理解
- [ ]  Change Logの確認
    - [ ]  Breaking Change, Feature, BugFixがきちんと書かれている場合、Breaking ChangeとBug Fixを重点的に確認すればよいと判断
    - [ ]  そうでない場合はcommit/diffを丁寧に確認する必要があると判断
- [ ]  Breaking Changeの確認
    - [ ]  ある場合は、その機能について理解
    - [ ]  アプリケーションコードへの影響範囲の確認
    - [ ]  対処法を考える
        - [ ]  テストでカバーできてる範囲の変更であれば、テストが通っていれば十分
    - [ ]  対処法実施
- [ ]  New Featureの確認: アプリケーションに影響を与える変更ではないが、新機能がアプリケーションのコードをより良くする可能性があるので、情報収集として行う
- [ ]  Bug Fixの確認: (Bug Fixによりバグが発生する可能性は低いため、この段階では詳しく確認しなくてもよい)
- [ ]  動作確認ケース洗い出し
- [ ]  動作確認実施
- [ ]  リリース
- [ ]  リリース後に問題が起きた場合
    - [ ]  バグ発生箇所の特定
    - [ ]  原因の特定
        - [ ]  Change Log & それに関連するPR/issue/commit/diffを読み、どの変更が原因かを明確にする
        - [ ]  ライブラリ自体の問題の場合
            - [ ]  同様の問題報告などがないかをissue/PRをもとに探す
            - [ ]  誰もissue/PRを上げてないのであれば、issue/PRを上げる****
            - [ ]  アップデートを見送る or パッチをあてる
```
Amazon SQSってなんぞや。


こんにちは。
私は先日AWS SAA C-03を受験し、合格する事ができました！
その勉強の中で、頻出していたAmazon SQSサービスについて
自分自身の備忘もかねて記事にいたしました。
是非ご覧ください！

# Amazon SQSって要は宅配ボックスじゃん！？

Amazon Simple Queue Service（SQS）は、AWSクラウド上で効果的なメッセージングを実現するサービスです。
イメージとしては、サービスとサービスの真ん中で仲介者になってくれて、処理に関する情報等のメッセージを送信したり、保存しておいたりできる機能です。
これは、まさに**宅配ボックス**に似ているではないか！！
一旦SQSに処理を渡しておけば、渡したい相手側が受け取りたいタイミングで受け取っておくよ〜みたいな感じです笑
という事で、宅配ボックスを例にサービスの流れを書いていきたいと思います！


---

## 1. 送りたい荷物が発生する（イベントの生成）
SQSはアプリケーション内で発生したイベントをメッセージとして捉えます。これにより、異なるアプリケーションコンポーネント間での情報伝達が容易になります。
→**渡したい荷物ができた！**

## 2. 皆が受け取りやすい段ボールに入れ配送する(メッセージの整形)
SQSが提供するメッセージの整形機能により、異なる形式やプロトコルを持つアプリケーションが共通のメッセージ形式でやり取りできます。これにより、相互運用性が向上します。
→**誰もが一律で受け取れるように梱包してあげよう！**

## 3.　宅配ボックスにいれる（メッセージの待機）

SQSのキューは、アプリケーションのスケーラビリティを向上させます。メッセージは順番に処理され、キューが大量のトラフィックにも柔軟に対応できるため、アプリケーションがスムーズに動作します。
→**お客さんが今は受け取れないかもしれないから、宅配ボックスにいれよう！**

## 4. 荷物の受け取り（キューからの取り出しと処理）

SQSは冗長な構成を持っており、一度処理されたメッセージが失われることはありません。このため、耐障害性が向上し、アプリケーションが信頼性を保ちます。
→**お客さんの任意のタイミングで、宅配ボックスから荷物を受けとる**

---

## Amazon SQSのメリット/まとめ

SQSはキューにメッセージを待機させ、分散環境でのスケーラビリティを向上させます。
また、メッセージを複数の場所に保存し、冗長構成を持っています。これにより、サーバーの障害や通信の問題に対してもアプリケーションが頑健に動作します。

人間も、宅配ボックスが無ければ、荷物を受け取れなかったり、荷物が届きそうなタイミングは家にいなきゃいけないとか、考えなきゃいけない事が増えますよね。
その問題を簡単に解決してくれるのがAmazon SQSサービスという事でした！！
【WordPress】メインクエリとサブクエリを超わかりやすく解説してみる

WordPressのメインクエリとサブクエリを理解するのは、初心者にとって難しく感じることがあるかと思います。

この記事では、身近な例え話を使いつつ、初心者でも理解しやすいように解説してみます！

## ■ メインクエリは、「自分の部屋」
あなたがアパートに住んでいると想像してください。

メインクエリは、あなたの部屋です。
あなた部屋なので、部屋の鍵を使って自由に入ることができ、部屋の中の物も自由に使えますね。
こんな感じで、まずはメインクエリ＝あなたの部屋ということを抑えておいてください。

:::note info
メインクエリ＝あなたの部屋＝自由に入り、物を自由に使える
:::

## ■ サブクエリは、「他の人の部屋」
一方でサブクエリは、「他の人の部屋」です。

仮に、他の人の部屋にあるものを使いたい場合は、お願いしなければいけませんよね。誰の部屋の物をを使いたいのか、何を使いたいのか、といった具合に具体的に決めて、その人に依頼する必要があります。
こんな感じで、サブクエリ＝他の人の部屋ということを抑えておいてください。

:::note info
サブクエリ＝他の人の部屋＝依頼する必要がある
:::


それでは、これまでの例え話を頭に入れつつWordPressのお話に入っていきましょう。


## ■ メインクエリとは
メインクエリは、「開いたページに関連する情報をそのまま使うことができる」といったものです。

例えば、「１月２５日のブログ記事」を開いたとしましょう。
すると、「１月２５日のブログ記事」の”タイトル”、”本文”、”投稿日”などの情報がページにアクセスした時点で自動で取得されているので、わざわざ取得しなくても使うことができます。

つまり、ここでいうURLは「あなたの部屋の鍵」であり、ページは「あなたの部屋」といえます。
そして、このページのあらゆる情報（タイトルとか本文とか）は「あなたの部屋にある物」であり、とくに依頼とかしなくても自由に使えるといったイメージです。
（のちほど、実際のコードも見てみましょう）


## ■ サブクエリとは
メインクエリで取得できない情報を使いたい場合に「サブクエリ」を使います。

例えば「１月２５日のブログ記事」ページのサイドバーに「過去の記事一覧」を表示するとかいった場合です。
「あなたの部屋」には「１月２５日のブログ記事」の情報しかなく、その他の「過去の記事」を使うには「他の人の部屋」から借りてこなくてはなりません。

この場合、サブクエリを使って、「誰の＝ブログ記事の」「何が＝過去記事の情報」ほしいのかを具体的に指定して取得する必要があります。

このように、メインクエリにはない情報を追加で指定して取得することをサブクエリと言います。（厳密には、クエリのことを「問い合わせ」とか言ったりします）

## ■ さいごに実際のコードを確認してみましょう

### ✓ メインクエリのコード
![メインクエリ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622005/fdee8685-5b22-2aa0-be42-1dac4da4de37.jpeg)

### ✓ サブクエリのコード
(黄色の部分がサブクエリの記述となります)
![サブクエリ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622005/64b73dde-b18d-2340-69a7-29a97d249540.jpeg)



いかがでしたでしょうか。
完全に理解して頂くのは難しいかもですが、イメージを掴んで頂くことで、どんな時がメインクエリで、どんな時にサブクエリが必要になるのかを判断できるようになったらいいなぁと思います！
【Git】git-diffで必要な情報のみ取得する方法

## はじめに

`git diff`の実行結果から削除したファイルのリストなど必要な情報のみ取得する方法について記載します。  

## 方法

以下のように実行することで`git diff`にフィルターをかけられます。  

```zsh
git diff --diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]
```

`--diff-filter`に設定できるフィルタリング文字の意味は以下のとおりです。  

| 文字  | 意味                                                               |
| :---: | :----------------------------------------------------------------- |
|   A   | 追加                                                               |
|   C   | コピー                                                             |
|   D   | 削除                                                               |
|   M   | 変更                                                               |
|   R   | 名称変更                                                           |
|   T   | タイプ（通常ファイル、シンボリックリンク、サブモジュールなど）変更 |
|   U   | マージ解除                                                         |
|   X   | 不明                                                               |
|   B   | ペアリング解除                                                     |

以下のように実行すると削除されたファイルのみのリストを取得できます。  

```zsh
git diff --name-only --diff-filter=D
```

逆に削除されたファイル以外を除外したい場合には`D`を小文字にします。  

```zsh
git diff --name-only --diff-filter=d
```
データベースにアソシエーションを設定する

（dockerを使っているのでターミナルのコマンドにdockerが入っていたりします・・）

### generateコマンドを使ってBoardモデルを作成する
```
rails g model Board user_id:integer title:string body:text
```
データベースにusersテーブルを作るためのマイグレーションファイルと、Userモデルが作成される。

### マイグレーションファイルを編集する。
（空欄を許可しない設定を追加）
```
class CreateBoards < ActiveRecord::Migration[7.0]
  def change
    create_table :boards do |t|
      t.integer :user_id
      t.string :title, null: false
      t.text :body, null: false

      t.timestamps
    end
  end
end
```

### マイグレーションを実行して、データベースにusersテーブルを作成する
```
docker compose run web rails db:migrate 
```

docker compose run web rails db:migrate:status コマンドを実行し、先ほどのマイグレーションファイルが適用されている状態（Statusがup状態）になっていることを確認
```
Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240123074239  Create boards
```

### models/board.rbにバリデーションを追加
```
class Board < ApplicationRecord

  validates :title, presence: true, length: { maximum: 255 }
  validates :body, presence: true, length: { maximum: 65535 }
end
```

アソシエーションを定義
models/board.rb
```
class Board < ApplicationRecord
  belongs_to :user
end
```

models/user.rbには以下の記載を追加
```
class User < ApplicationRecord

  has_many :boards, dependent: :destroy
end
```
openFPGAloaderを使ってMacからFPGAへデザインを書き込む

Macを使っていて困るのはFPGAの開発が非常に面倒なことです。これは主要なFPGAベンダーが一向にOSXをサポートしないことが原因ですが、ひとまず、FPGAのBuildはCloudなどの別環境で行うとして、生成されたBitファイルを手元のFPGAへ書き込みむことができれば、手元にLinuxPCなどを用意しなくてもFPGAの動作確認ができます。openFPGAloaderはこうした用途に使える便利なToolです。

## インストール

Brewでサクッといけます。

```
brew install openfpgaloader
```

## FPGAボードやJTAGアダプターの認識

FPGAボード（この例はDigilentのArty）をUSBで接続して

```
% openfpgaloader --detect
No cable or board specified: using direct ft2232 interface
Jtag frequency : requested 6.00MHz   -> real 6.00MHz
```

として認識できています。認識されない場合は

```
% openfpgaloader --scan-usb
found 23 USB device
Bus device vid:pid       probe type      manufacturer serial               product
008 023    0x0403:0x6014 ft232H          Digilent     210249AEBAE4         Digilent USB Device
```

結果からft232のJTAGケーブルということがわかるので、ケーブルを指定すれば認識されます。

```
openfpgaloader --detect --cable ft232
Jtag frequency : requested 6.00MHz   -> real 6.00MHz
```

サポートされているケーブルの一覧はこちらです。FTDI系はほぼ網羅されています。
https://trabucayre.github.io/openFPGALoader/compatibility/cable.html

サポートされているボードの一覧はこちらです。
https://trabucayre.github.io/openFPGALoader/compatibility/board.html

# FPGAへの書き込み

例としてDigikentのArtyを使います。FPGAへの書き込みですが、SRAMの場合は

```
% openfpgaloader -b arty <YOUR_BITFILE>
Jtag frequency : requested 10.00MHz  -> real 10.00MHz
Open file DONE
Parse file DONE
load program
Flash SRAM: [==================================================] 100.00%
Done
```

デザインが完成して、Flashに焼く場合は

```
% openfpgaloader -f -b arty <YOUR_MCSFILE>
write to flash
Jtag frequency : requested 10.00MHz  -> real 10.00MHz
Open file DONE
Parse file DONE
use: /opt/homebrew/Cellar/openfpgaloader/0.11.0/share/openFPGALoader/spiOverJtag_xc7a35tcsg324.bit.gz
load program
Flash SRAM: [==================================================] 100.00%
Done
Detected: micron N25Q128 256 sectors size: 128Mb
00000000 00000000 00000000 00
Erasing: [==================================================] 100.00%
Done
Writing: [==================================================] 100.00%
Done
```

と、Bitファイルさえどこかで作成すれば、手元のMacでFPGAの動作検証ができます。Macでここまでちゃんと動くとは思ってなかったです。xc3sprogより断然使いやすいですね。

## 参照

- openFPGALoader
    - https://github.com/trabucayre/openFPGALoader
    - https://trabucayre.github.io/openFPGALoader/
setTimeout(fn,0)より高速なsetImmediateもどき集

激重loopのCPUの負担を抑えたい場合に、よくsetTimeout(fn,0)を連呼するかどうかは定かではないかもしれませんが、それではいささか低速過ぎるという事態に直面しかねません。そういうprogramにおすそ分けする技法を紹介します。
```js
//XMLHttpRequest法
(function(F){
	var x=new XMLHttpRequest;
	x.onload=function a(){F[0]&&F.shift()()};
	this.wait0=function(f){F[F.length]=f;x.send(x.open("GET","data:,"))}
})([])
```
```js
//script法
(function(F){
	function a(e){
		F[0]&&F.shift()();
		h.removeChild(this);
		e.target=null
	}
	var u="data:,",h=document.getElementsByTagName("head")[0];
	this.wait0=function(f){
		F[F.length]=f;
		f=document.createElement("script");
		f.onload=a;f.src=u;h.appendChild(f)
	}
})([])
```
```js
//Blob法
(function(F){
	function a(){F[0]&&F.shift()()}
	var b=new Blob([]);
	this.wait0=function(f){b.text(F[F.length]=f).then(a)}
})([])
```
```js
//File法
(function(F){
	function a(){F[0]&&F.shift()()}
	var b=new File([],"");
	this.wait0=function(f){b.text(F[F.length]=f).then(a)}
})([])
```
```js
//FileReader法
(function(F){
	function a(){F[0]&&F.shift()()}
	var b=new Blob([new Uint8Array(0)]);
	this.wait0=function(f){
		F[F.length]=f;f=new FileReader;
		f.onload=a;f.readAsArrayBuffer(b)}
})([])
//FileReader法2
(function(F){
	var b=new Blob([new Uint8Array(0)]),r=new FileReader;
	r.onload=a=>{
		F[0]&&F.shift()();delete r.result
	}
	this.wait0=function(f){
		F[F.length]=f;r.readAsArrayBuffer(b)
	}
})([])
//FileReader法3
(function(F){
	function a(){F[0]&&F.shift()()}
	var b=new Blob([""]);
	this.wait0=function(f){
		F[F.length]=f;f=new FileReader;
		f.onloadstart=a;f.readAsArrayBuffer(b)}
})([])
```
```js
//Image法
(function(F){
	function a(){F[0]&&F.shift()()}
	var s="data:image/gif;base64,R0lGODdhAQABAAAAAAA";
	this.wait0=function(f){
		F[F.length]=f;f=new Image;
		f.onload=a;f.src=s
	}
})([])
//Image法2
(function(F){
	var i=new Image,s="data:image/gif;base64,R0lGODdhAQABAAAAAAA";
	i.onload=function(){
		F[0]&&F.shift()();delete i.src
	};
	this.wait0=function(f){F[F.length]=f;i.src=s}
})([])
```
```js
//postMessage法
(function(a){
	var F=[],hit="\0";
	a.wait0=function(f){
		F[F.length]=f;a.postMessage(hit,"*")
	};
	a.onmessage=function(e){
		if(e.source===a&&e.data===hit)
			e.stopPropagation(),F[0]&&F.shift()()
	}
})(this);
```
```js
//MessageChannel法
(f=>{var c=new MessageChannel,p={},o=p;
	c.port1.onmessage=f=>{p=p.p;p.f();delete p.f};
	f.wait0=f=>{o=o.p={f:f};c.port2.postMessage(0)}
})(this);
```
いずれも**wait0(function(){...})** のように使います(**setTimeout(function(){...},0)** のようなもの)。 速度を比較すると以下のような感じになるかも
`MessageChannel >> postMessage > Image >>> File, FileReader > script > XMLHttpRequest`
```js
var start=+new Date,times=[];

wait0(function run(){
	times.push(Date.now()-start); // 前の呼び出しからの遅延を覚える
	if(start+100<Date.now())document.write(times.length," ",times.join(" ")); // 100ms 後に遅延を表示
	else wait0(run,0)// もしくは再schedule
},0)
```
AWS PrivateLinkのサポートを発表

<font color="Grey">*[Announcing support for AWS PrivateLink](https://aiven.io/blog/announcing-support-for-aws-privatelink)の翻訳です。*</font>

2021年11月16日

# AWS PrivateLinkのサポートを発表

AivenのサービスがAWS PrivateLinkに対応し、セキュアなネットワーク接続が可能になりました。詳細はこちらをご覧ください。

AivenのサービスがAWS PrivateLinkに対応し、セキュアなネットワーク接続が可能になりました。この新機能は、これまでサポートされていたVPCピアリングとAWS Transit Gatewayオプションに追加されるもので、お客様の環境においてクラウドとオンプレミスのアプリケーションをセキュアに接続する機能を強化していきます。


AWSのネットワークサービスである[AWS PrivateLink](https://aws.amazon.com/privatelink/)は、パブリックインターネットにトラフィックを公開することなく、VPC、Aivenサービス、お客様のオンプレミスネットワーク間のプライベート接続を提供します。PrivateLinkを有効にしたAivenサービスクラスタを簡単に作成し、VPCやオンプレミスネットワークから安全に接続することができます。


## プライベートリンクを選ぶ理由


AWS PrivateLinkはAivenサービスとのセキュアな接続を提供し、ネットワーク管理を簡素化します。AWS PrivateLinkのトラフィックは完全にプライベートであり、パブリックインターネットを経由しません。


AWS PrivateLinkを利用することで、ブルートフォース攻撃、分散型サービス拒否攻撃、その他の脅威に対する脆弱性を軽減することができます。プライベートIP接続を使用することで、Aivenのサービスはあたかも同じプライベートネットワーク上で直接ホストされているかのように機能します。つまり、ファイアウォール、インターネットゲートウェイ、VPCピアリング接続、パス定義、ルーティングテーブルを設定する必要がなくなります！複雑なネットワークの管理がより簡単になります。


既存のオンプレミス・アプリケーションをクラウド上のAivenサービスを使って移行したいですか？トラフィックはプライベートなまま、プライバシーポリシーに準拠しているため、心配することなく簡単に移行できます。


## AivenでAWS PrivateLinkを始める


AWS PrivateLinkを使い始めるには、ヘルプ記事[Using AWS PrivateLink with Aiven services](https://help.aiven.io/en/articles/4820209-using-aws-privatelink-with-aiven-services)をご覧ください。価格の詳細については、[価格ページ](https://aiven.io/pricing)をご覧ください。


## まとめ


Aivenのサービスをまだご利用でない方は<https://console.aiven.io/signup>から無料トライアルにお申し込みください！


また、[changelog](https://aiven.io/changelog)や[blog](https://aiven.io/blog)のRSSフィード、または[LinkedIn](https://www.linkedin.com/company/aiven/)や[Twitter](https://twitter.com/aiven_io)のアカウントをフォローし、製品や機能関連の最新情報をご確認ください。
【JavaScript】タッチイベントが何故か発火しない？何故？という方へ


## ひとつの可能性

スマホやタブレットと違って、ノートパソコンのタッチパッドでは[TouchEvent](https://developer.mozilla.org/ja/docs/Web/API/TouchEvent)は発火しないと思われます。

悲しいなぁ…。

非該当の方は引き続きデバッグ頑張ってください！
雑に人とはなすためのテンプレート

## 概要

形式ばった会議でも面接でもなんでもないのだが、最近なにをやっているのか、雑に自己紹介を兼ねながら人と話をしたいときの、自分のテンプレート。いわゆる「カジュアル面談」よりも、さらにカジュアルな雑談を想定。場合により 1on1 などでも。


## テンプレート

```md
### 自分の経歴
- 例: 〇年目
- 例: 〇〇を経験、〇〇を経験 
- 例: 自分のパーソナリティ https://www.16personalities.com/ja


### 自分の役割
- 例: 〇〇エンジニア

### 自分の役割の立ち位置
- 例: 会社の中で、営業、エンジニア、導入、サポート などなどいる中の、どこ

### 組織を俯瞰
- 例: 営業
- 例: エンジニア
- 例: 導入
- 例: サポート　etc. 組織による

### 組織を俯瞰した際の、自分の役割の面白いところ
- 例: こういうところが自分のやりたいところに合っている、等

### 組織を俯瞰した際の、自分の役割のつらいところ
- 例: こういうときにつらかった、等

### 自分の平均的な 1 日
- 例: ざっくり〇時勤務開始して～、等

### 自分の野望
- 例: こういうことに挑みたい、等

```

## 具体例
### 自分の経歴
- 社会人歴は長いです。2003 年に文系未経験で「開発」業務開始。
- 保守開発、新規機能開発、海外赴任で現地エンジニアと開発、いわゆる「ブリッジ」 的開発 等
- 自分のパーソナリティ: https://www.16personalities.com/ja

### 自分の役割
- インフラ寄りのバックエンド、等。
- データベースのマイグレーション。
- オンプレミス経験多数。
- AWS を自力で趣味程度に資格取るくらい。
- 転職して、Azure ちゃんと触り始めた。

### 自分の役割の立ち位置
- いわゆるサポート。

### 組織を俯瞰
- 色々説明しきれない。笑

### 組織を俯瞰した際の、自分の役割の面白いところ
- 最終的にはドキュメントが成果物になるのが楽しい。

### 組織を俯瞰した際の、自分の役割のつらいところ
- コミュニケーションたるや。
- でも [私はサポート職きらいじゃないぞ、という話 #ポエム - Qiita](https://qiita.com/e99h2121/items/e25a4a6990c3997e472b)

### 自分の平均的な 1 日
- [2023 年の IT エンジニア、小学生と保育園児との Work from home #リモートワーク - Qiita](https://qiita.com/e99h2121/items/db0790a47734ce4ec258)
- 在宅勤務はうれしい

### 自分の野望
- とりあえずもうちょい「深く」色々知りたい

## ほか参考

- 以下は、自分が「受ける側」だった際の感想文
    - [Twitter経由でお誘いいただき、初めてカジュアル面談受けてみたので、その感想](https://zenn.dev/e99h2121/articles/0390fd45add338)
    - [エージェントさん経由で、真面目にカジュアル面談受けてみたので、その感想](https://zenn.dev/e99h2121/articles/9c67ba64f57e2b)
- 以下は、いろんなテンプレート
    - [IT エンジニア、自己紹介の練習は常にやっておいて損はないと思う #自己紹介 - Qiita](https://qiita.com/e99h2121/items/6e1f651053f98034284a)
    - [脱ExcelしたいMarkdownテンプレート目次 #Markdown - Qiita](https://qiita.com/e99h2121/items/97168cad64ff40afb77d)



以上です～
【PostgreSQL】配列を任意の引数とした関数でselectの結果を返す

## 概要
以下の条件でsleectの結果を返す、PostgreSQLの関数を試しに作成してみたのでメモ書きを残しておきます。
* 配列が引数で設定された場合は、その値で絞り込みを行う。
* 配列が引数で設定されていない場合は、絞り込みを行わない。

## 対応方針
* [Empty array as PostgreSQL array column default value](https://stackoverflow.com/a/30933366)のstackoverflowの回答を参考に、引数の配列に空配列をデフォルトで設定します。
* 引数の配列が設定されているかの判定は、PostgreSQL15のドキュメント[9.19. 配列関数と演算子](https://www.postgresql.jp/docs/15/functions-array.html)を参考に`array_length`を使用します。空配列の場合は結果がnullになります。
* 配列が引数で設定された場合、[【PostgreSQL】配列の値で抽出する（Where、any）](https://postgresweb.com/post-4678)の記事で紹介されている通り、`any`を使用して絞り込みを行います。

## 今回用意したテーブル

```sql
CREATE TABLE public.sample_table (
	id int8 NOT NULL,
	"name" varchar NOT NULL,
	CONSTRAINT samle_table_pk PRIMARY KEY (id)
);
```

データは以下の通り入ってるものとします。
<img width="250px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/15fcd4bc-4131-5ba3-58b1-b8c229081d62.png">


## 実装サンプル

```sql
create or replace
function sample_function(names varchar[] default '{}'::varchar[]) returns 
table(id int8, name varchar) as $$
begin
return QUERY
  select
	sample.id,
	sample.name
from
	public.sample_table sample
where
	case
		when array_length(names, 1) > 0 
    then sample.name = any(names)
		else true
	end;
end;
$$ language plpgsql;
```

`select * from sample_function()`で実行した場合は全件取得できて、`select * from sample_function(array['テスト1', 'テスト2']::varchar[])`で実行した場合は2件取得できます。
Kubernetesのクラスターの種類とそれらのユースケースは何ですか？

**Kubernetes**では、特定のユースケースや要件に対応するために設計されたさまざまな種類のクラスターが存在します。最も一般的なクラスターの種類とそれらのユースケースを探ってみましょう：

## Single-Node Cluster (シングルノードクラスター)

- シングルノードクラスターは、単一のKubernetesノードから構成され、コントロールプレーンとワーカーノードの機能が組み合わさっています。

:::note info
**ユースケース：** シングルノードクラスターは、開発、テスト、学習の目的によく使用されます。マルチノードのセットアップが不要で、Kubernetesの機能を実験するための軽量でシンプルな環境を提供します。
:::

## Multi-Node Cluster (マルチノードクラスター)

マルチノードクラスターは、複数のKubernetesノードから構成され、それぞれがコントロールプレーンまたはワーカーノードとして特定の役割を果たしています。

:::note info
**ユースケース：** マルチノードクラスターは、本番環境で使用されるKubernetesクラスターの最も一般的なタイプです。拡張性、高可用性、障害耐性を提供し、ワークロードの分散と冗長性が重要な場合に適しています。
:::

## High Availability Cluster (ハイアベイラビリティクラスター)

ハイアベイラビリティ（HA）クラスターは、連続的な可用性と最小のダウンタイムを確保するために冗長性とフェイルオーバーメカニズムを備えたマルチノードクラスターです。

:::note info
**ユースケース：** HAクラスターは、最大の稼働時間と障害耐性が必要なミッションクリティカルなアプリケーションに不可欠です。電子商取引プラットフォーム、銀行システム、医療アプリケーションなど、中断のないサービスが必要なシナリオに適しています。
:::

## Edge Cluster (エッジクラスター)

エッジクラスターは、ネットワークのエッジ、つまりデータソースやエンドユーザーに近い場所にKubernetesクラスターを展開および管理するために設計されています。

:::note info
**ユースケース：** エッジクラスターは、低遅延、ローカルデータ処理、オフライン機能が必要なエッジコンピューティングシナリオで使用されます。 IoTアプリケーション、スマートシティ、中央クラウドインフラへの制限付き接続があるリモート地域に適しています。
:::

## Federation Cluster (フェデレーションクラスター)

フェデレーションクラスターは、異なる地域やクラウドプロバイダーで構成された複数のKubernetesクラスターを単一の論理クラスターに組み合わせ、中央管理とワークロードの分散を可能にします。

:::note info
**ユースケース：** フェデレーションクラスターは、複数の地域やクラウドプロバイダーにまたがる大規模な展開に適しています。地理的に異なる場所にわたるグローバルな拡張性、災害復旧、ワークロードの分散が可能です。
:::

## Development Cluster (開発クラスター)
開発クラスターは、ソフトウェア開発とテストのために特に調整され、開発者がアプリケーションのビルドとテストを行うための孤立した環境を提供します。

:::note info
**ユースケース：** 開発クラスターは、個々の開発者または開発チームが本番環境に影響を与えることなくプロジェクトに取り組むのに理想的です。制御された環境でアプリケーションの迅速な反復、テスト、デバッグを可能にします。
:::

各クラスターの種類は特定の利点を提供し、異なるユースケースに対応しています。特定のニーズに適したKubernetesクラスターのタイプを選択する際には、拡張性、可用性、障害耐性、およびレイテンシなどのアプリケーションの要件を考慮することが重要です。
ローカル環境にファイルを作成せずにKubernetesクラスタを実行する

# 目的
　マニフェストファイル、Dockerfileなどを使わずにコマンドラインのみでKubernetesクラスタを作成、実行することを目指します。
　今回はDjangoを例にとり、"Congratulations!"ページを表示させるところまで行います。

# 環境・使用したツール
|OS|コマンドラインツール|Docker|Kubernetes|
|:-:|:-:|:-:|:-:|
|Windows11|powershell7.4.1|Docker Desktop|minikube|

# 手順
#### 1. クラスタを作成する
```powershell
minikube start
```
#### 2. デプロイメントを作成する
　デプロイメントを作成するため、次のコマンドを実行します。
```powershell
kubectl create deployment django --image=python -- sleep infinity
```
:::note warn
注意
　`sleep infinity`のコマンドについては、CrashLoopBackOffを防ぐために仮に指定しています。もっと合理的な方法があるかもしれません。
:::
　このコマンドを実行してしばらく待ってから`kubectl get pods`を実行すると、次のようにSTATUSの項目がRunningになると思います。(NAMEの項目はこの通りである必要はありません)
```
NAME                     READY   STATUS    RESTARTS   AGE
django-d6587fc44-4mmw2   1/1     Running   0          44m
```
#### 3. Pod内部にDjangoプロジェクトを作成する
　次のコマンドを実行してPodにアクセスします。django-d6587fc44-4mmw2の部分は、先ほど`kubectl get pods`でpodsの内容を取得した際のNAMEの項目を適宜入力してください。
```powershell
kubectl exec -ti django-d6587fc44-4mmw2 -- bash
```
　すると、Pythonのイメージから作成されたPodの内部にアクセスできると思います。[Writing your first Django app, part 1](https://docs.djangoproject.com/en/5.0/intro/tutorial01/)などを参考にしてDjangoプロジェクトを作成するところまでおこなってください。
 #### 4. サーバーを起動する
　manage.pyファイルがあるディレクトリに移動し、次のコマンドを入力してください。0.0.0.0:8000のようにIPアドレス部を0.0.0.0と指定します。ポート番号は任意です。
```bash
python manage.py runserver 0.0.0.0:8000
```

#### 5. Podを外部に公開する
　別の端末を起動するなどして、ローカル環境で次のコマンドを実行します。 ~~タイプはNodePortなどでも動きます。~~ ([この記述](https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types)によると、LoadBalancerは適切ではない可能性があります。)ポート番号は4.で指定した番号と同じものを指定してください。nameオプションは省略できます。
```powershell
kubectl expose deployment django --name=django-service --type=LoadBalancer --port=8000
```
　ここで`kubectl get services`を実行すると、次のような結果が表示されます。新しいサービスが作成されているのが分かると思います。
```
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
django-service   LoadBalancer   10.108.118.243   <pending>     8000:31584/TCP   7s
kubernetes       ClusterIP      10.96.0.1        <none>        443/TCP          27m
```

　さらに次のコマンドを実行すると、自動でブラウザが立ち上がりDjangoの"Congratulations!"ページが表示されます。django-serviceの部分は、`kubectl get services`で取得したサービス名を入力してください。
```powershell
minikube service django-service
```
SpringBoot + Java + Gradle環境で"Hello World"

## 環境
- SpringBoot 2.2.7
- Java 1.8
- Gradle 6.3

## Javaの設定（IntelliJ ）
ファイル < プロジェクト構造 < プロジェクト設定
< プロジェクト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/463aa415-0271-37ea-8245-5e05c2ec6e75.png)
< モジュール
ソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/aba0033a-f9f8-b0dd-773e-03fdf1670c4f.png)
依存関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/e2c2090d-67b4-a439-024b-bf1637ca1301.png)

ファイル < プロジェクト構造 < プラットフォーム設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/47fba1c7-c054-96fc-2cd2-f7e40db10b3e.png)


ファイル < 設定 < ビルド、実行、デプロイ < ビルドツール < Gradle
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/bca93f82-6890-42ab-4972-ae5576aaff3c.png)


## build.gradle / gradle-wrapper.properties
※コピペでOK
```gradle:build.gradle
plugins {
    id 'org.springframework.boot' version '2.2.7.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
    mavenCentral()
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}
test {
    useJUnitPlatform()
}

```

```gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
```

## HelloWorldが表示されるように実装
```java:HelloWorldApplication.java
package com.example.helloworld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class HelloWorldApplication {
    @RequestMapping("/")
    String Index() {
        return "Hello World";
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }

}
```

## 動作確認
ビルドして実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/ab1cc5b5-f7a2-9d55-9c2d-81836ae04a1f.png)

http://localhost:8080/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/7bb23327-6e03-7244-38b1-7f0ab7ce5854.png)


## 補足
intellijでgradleをリフレッシュする方法
表示 < ツールウィンドウ < Gradle を表示して、左上のリロードっぽいボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/0d5443f6-1f7e-f931-bf89-6a966c159252.png)
laravel クラス名::class って書き方って結局何なのさ？

## 概要

今更ながら `クラス名::class`という記述がなんとなくでしか分かってなかったので簡単にまとめる。

## 内容

早速本題に移ろう。`クラス名::class`という記述は一体何なんだろうか。
お恥ずかしながら自分も「まあなんかいい感じにクラス名を解決してくれてるんだろうな」というように考え「こう書けばいいや」で深く考えていなかった。

結論から言うと「クラス名を含むフルネームスペースを文字列として取得」している。

例を上げて説明しよう。下記のような処理があったとする。（UserServiceがuseされているlaravelのコントローラーっぽいクラスだ。アクションが定義されていないのでコントローラーとは言えないかも。）

```php
<?php

namespace App/Http/Controllers;

use App/Services/UserService;

class UserController
{

    $userServiceFullNamespace = UserService::class;

}
```

上記を実行した時`$userServiceFullNamespace`には「App/Services/UserService」が格納されている。
これだけだとあまり恩恵が感じられないかもしれないので「面倒だから下記のような記載でいいじゃない」と思うかもしれない。

```php
<?php

namespace App/Http/Controllers;

class UserController
{

    $userServiceFullNamespace = 'App/Services/UserService';

}
```

ど正論だ。間違いない。しかしながら基本的に使われるほかクラスはuseして使うことが定説となっており（場合によってはハードコーディングすることもあるが）、上記みたいなコードを書くとセオリーからズレている可能性はある。可読性などの問題も有る。

更に`$userServiceFullNamespace = 'App/Services/UserService';`の処理がUserControllerのメソッドごとに複数記載された状態でUserServiceのNamespaceが変更になったらどうするだろう？
エディタの一括置換などを使えば、複数のハードコーディングされたNamespaceを一瞬で書き換えられるが、そもそも一箇所でuseしていれば修正箇所は一箇所で済む。

勝手に名前解決してくれると開発者にとってはいいことづくしなのでクラス名::classが多様されているということのようだ。

※間違えていたらすみません。何なりとご指摘お待ちしています。
遺伝的アルゴリズムを体験する

# 概要
　機械学習の一つに遺伝的アルゴリズムというものがある。原理は単純で「良いものと良いものを組み合わせれば、さらに良いものが生まれるはず」というものだ。今回は簡単な問題を例にあげて実際に最適解を得る事を確認する。
 
　コードはgitHubにおいておく。今回使用したコードを活用して別の記事を書く予定のため、より使いやすいように改良をしていくつもりだ。

 https://github.com/NEKOHUKURO/GA_num_of_one

# 遺伝的アルゴリズムの簡単な説明
この章で遺伝的アルゴリズムの簡単な説明を行う。

## 遺伝情報の表現方法
遺伝的アルゴリズムはそれぞれの個体が遺伝子として０と１で構成された配列を持つ。
遺伝子の長ながさは個体ごとに変わることはない。

## 子孫を残す
個体は他の個体と子孫を残す
親はそれぞれの遺伝子を組み合わせたものを子孫として生成する。
基本的に獲得形質は遺伝させないが本によってはそのようなアプローチを紹介するものもある。
また子孫を残す際、一定の確立で遺伝子の一部を反転させる。これを突然変異という。

## 優れたものが子孫を残す。
より良い個体を生成するために良い個体が子孫をより多く残す必要がある。
そのため個体ごとに評価するひつようがある。

## 遺伝的アルゴリズムのフロー

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636937/45d4f2e4-8807-26d3-23db-0fc44660d7ab.png)

今回示したフローは遺伝的アルゴリズムを実装する上で最低限必要な処理を示したものである。


 # 問題設定
 　今回は遺伝的アルゴリズムの問題でよく例にあげられる、遺伝情報内の１の数をできるだけ多くする問題を解く。
  これは単純に遺伝情報が１のみで構成されたものが最も良い個体、0のみで構成された個体を最も悪い個体である。
## 評価値
遺伝情報内の１の数を評価値とする。

## 問題を解く
本来はパラメータの設定や子孫を残す際の両親の選択方法など、多くのことを決定、説明するべきである。しかし今回は次の記事への布石としての面が大きいため省く。
今回は0世代目と15世代目の結果を見る。
左の少数が個体の評価値、右の0と1の羅列はその個体の遺伝情報である。
```ruby:実行結果
0世代目
-----------------ソート済み--------------------
評価値: 遺伝情報
3.0 :  0 0 0 0 0 1 0 0 0 0 1 0 1 0 0
3.0 :  0 1 0 0 0 0 1 0 0 0 0 1 0 0 0
2.0 :  0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
2.0 :  0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
2.0 :  0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
1.0 :  0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
1.0 :  0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
1.0 :  0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
1.0 :  0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
1.0 :  0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
1.0 :  0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
1.0 :  0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0.0 :  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.0 :  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.0 :  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.0 :  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.0 :  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.0 :  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.0 :  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.0 :  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

15世代目
-----------------ソート済み--------------------
評価値: 遺伝情報
14.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
14.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
14.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
14.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
14.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
14.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
14.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
13.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 0 1
13.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
13.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 0 1
13.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 0 1
13.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
13.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
13.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
13.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
13.0 :  1 0 1 1 1 0 1 1 1 1 1 1 1 1 1
12.0 :  1 0 1 1 1 1 1 1 1 1 1 1 1 0 0
12.0 :  1 0 1 1 1 1 0 1 1 1 1 1 1 1 0
11.0 :  1 0 1 1 0 1 0 1 1 1 1 1 1 0 1
10.0 :  1 0 1 1 0 1 1 1 1 1 0 0 1 1 0

評価値の平均 :  
0.95, 1.5, 2.25, 3.0, 4.65, 6.25, 7.75, 8.15, 9.45, 10.35, 11.0, 11.45, 11.75, 12.3, 12.6,

最大値 :  
3.0, 3.0, 4.0, 5.0, 7.0, 9.0, 9.0, 11.0, 12.0, 12.0, 13.0, 13.0, 13.0, 13.0, 14.0,
```
15世代目でも最適解を見つける事は出来なかったが0世代目と比べるとだいぶ良い結果が得られた事が分かる。
これをより現実の問題（時間割など新幹線の設計など）にあてはめることで現実世界でも活用できる結果をえる事ができる。
SPF/DKIM/DMARC最低でもここまでやっとけ

2024年2月からの、Gmail、Yahoo! Mailのガイドラインアップデート対応において、
最低限これやっておけばギリギリセーフ的なメモ。

準備
- 対象ドメインのDNSレコードの編集が可能であること。
- 確認コマンド(dig)を使える状態にしておく。


# SPF(えすぴーえふ)
所持しているドメインのTXTレコードに、SPFの記述をする。

例
```
v=spf1 include:_spf.example.com ~all
```
確認例
```
$ dig +short example.com txt
"v=spf1 include:_spf.example.com ~all"
```



### 注意ポイント
１. SPFを複数指定したいときは？
SPFの記述は1行にまとめる必要がある。
```
v=spf1 include:_spf.example1.com ~all include:_spf.example2.com ~all
```


このように2つのレコードを登録するのは間違い。
```
v=spf1 include:_spf.example1.com ~all
v=spf1 include:_spf.example2.com ~all
```

２. SPFについて検索すると、`SPFレコード` の設定をするといった記事が見つかることがあるが、
SPFレコードは過去は使われていたが、
現在は、SPFについての記述をTXTレコード内に記述するのが定石。
SPFレコードの設定もできるにはできるがモダンな設定にしよう。


# DKIM(でぃーきむ)
メールサーバーとして利用しているMTA次第で、やることが異なる。
原理としては共通なので、そこまで複雑に考える必要はない。

Google Workspaceの場合
ドメインで DKIM を有効にする
https://support.google.com/a/answer/180504?hl=ja

DKIM用のレコードを取得なり生成なりできるはずなので、
生成されたレコードをDNSに新しいTXTレコードとして登録する。

レコードのイメージ
```
"v=DKIM1; k=rsa; p=MIIBIjANBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX～～～"
```

確認例(Googleのデフォルトのセレクタの場合)
```
$ dig +short google._domainkey.example.com txt
"v=DKIM1; k=rsa; p=MIIBIjANBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX～～～"
```

### 注意ポイント
DNSとして、AWSのRoute53を使っている場合は、
""で前半と後半に分割して設定しないと文字数の制限で登録できない。
且つ、前半と後半は改行なしにしないと1行にまとまらない。

例
```
"前半""後半"
```

ダメな例
```
"前半"
"後半"
```


# DMARC(でぃーまーく)

ポリシーを決める。
考えたくない場合の最低はこんな感じ。
```
"v=DMARC1;p=none;rua=mailto:hogehoge@example.com;"
```

### 注意ポイント
設定対象ドメインと異なるドメインにレポートを送りたいときは、
受け入れ先ドメインでの _report のレコードが必要。

example.comについてのレポートを、example2.com のドメインに送信したい場合。

確認例
```
$ dig +short example.com._report._dmarc.example2.com txt
"v=DMARC1"
```


# TLS
自前MTAならともかく、近年のモダンなMTAならばTLSでの送信がデフォルト。


# List-Unsubscribe

めんどい。
マーケティング目的のメール送信をしていなければパスもあり。



## そもそも絶対順守すべきことって？
大規模送信者・・・SPF & DKIM & DMAARC & TLS & List-Unsubscribe
そうでない送信者・・・SPF or DKIM

DMARCは必須ではないが、普及させようと各社躍起になっているのと、
設定すること自体は簡単なので、ついでにやろう。
BEM CSS 設計 覚書

CSS 設計の本を読んだので、自分用の備忘録を残しておく。
ついでに誰かのお役に立てれば幸いです。

# BEM とは何ぞや
コンポーネントベースで Web ページを設計する方法論の一つ。
以下の単語の頭文字を取って「BEM」と呼称する。

* [Block](#block)
* [Element](#element)
* [Modifier](#modifier)

# Block

```
A logically and functionally independent page component.
```

訳すならば「論理的または機能的に独立しているページ構成要素」といったところか。
要するに「画面に並べる HTML 要素群を **都合の良い単位** に区切ってブロックとして考えよ」という話である。

## 命名規則
一つのブロックとして扱う要素群の **一番外側の要素** へブロックの名称を表す class 属性値を付与する。

## やってはいけないこと
ブロックのクラス名には ``_`` を使用しないこと。
``_`` は後述する BEM の命名規則において特別な意味を持つ予約文字である。

## より詳しく知りたい人
[quick-start](https://en.bem.info/methodology/quick-start/#block) を参照。

# Element

```
A composite part of block that can't be used separately from it.
```

「ブロックから切り離して使用することのできない部品群」。
要するに **ブロックを構成する HTML 要素群一つ一つ** のことを指す。

## 命名規則
ブロックそのものだけではなく、それを構成する個々の要素にも class 属性値を付与する。
個々の要素のクラス名は ``ブロック名__要素名`` の命名規則を使用して名前を付ける。

## やってはいけないこと
``ブロック名__要素名__要素名`` と名前を付けないこと。
細かくなり過ぎて後々メンテが大変になる為、御法度とされている。

## より詳しく知りたい人
[quick-start](https://en.bem.info/methodology/quick-start/#element) を参照。

# Modifier
ブロックや個々の要素のバリエーションを作ったり
状態を表現する時に使用する。

## 命名規則
class 属性値は ``ブロック名__状態名__値`` の命名規則を使用して名前を付ける。

## やってはいけないこと
便利だからと言って、たくさん作り過ぎないこと。
数が多過ぎると把握できなくなり、後で管理ができなくなる。

## より詳しく知りたい人
[quick-start](https://en.bem.info/methodology/quick-start/#modifier) を参照。

# BEM の利点
* 命名規則にそって class 属性値を付与することでクラス名の重複が無くなり、 CSS スタイルの衝突を防ぐことができる。
* CSS セレクタが単純になり、保守性が高まる。
* HTML に目を通すことで、設計者が考えているページ構造を理解することができる。

# 参考資料
* [ざっくりつかむ CSS 設計(高津戸壮 著、マイナビ出版)](https://honto.jp/ebook/pd_31436588.html)
* [BEM](https://en.bem.info/)
laravel Mockery オブジェクトの中のオブジェクトの中のプロパティをモック化する

## 概要

オブジェクトの中にある　オブジェクトのプロパティをモック化する方法を簡単にまとめておく。

## 前提

下記のようなメインコードがあったとする。（`UserService`はサービスコンテナに登録されているものとする）
これは`makeHogeObject()`の戻り値でHogeオブジェクトが返され、Hogeオブジェクトの中のpiyoオブジェクトの中のnameプロパティにアクセスしている処理だ。

```php
$hogeObject = $this->userService->makeHogeObject();

$name = $hogeObject->piyo->name;
```

## 内容

上記のコードが含まれるFeatureテストを書きたい、さらに`UserService`のメソッド実行をモック化したい場合を想定する。（本来Featureテストは、いわゆる「通しのテスト」なのでサービス層のメソッドも含めて動作を確認する場合がほとんどだが、説明の便宜上モック化している。）

まずは下記のように記載して`UserService`をモック化し、サービスコンテナに登録する。

```php
$userServiceMock = Mockery::mock(UserService::class)

$this->app->instance(UserService::class, $userServiceMock);
```

その後、`makeHogeObject()`の戻り値をモック化したいので下記のように追記するだろう。ただ書いていく上で、戻り値が若干厄介であることに気がつく。戻り値は「nameプロパティを含む、piyoオブジェクトを含む、Hogeオブジェクト」である必要がある。
オブジェクトが入れ子になっているので`new Hoge()`するだけではだめである。

```php
$userServiceMock = Mockery::mock(UserService::class)

$userServiceMock->shouldReceive('makeHogeObject')->andReturn(/** 戻り値どうしよう、、 */);

$this->app->instance(UserService::class, $userServiceMock);
```

そこで下記のように書いてみよう。

```php
$userS8erviceMock = Mockery::mock(UserService::class)

$piyoObject = new stdClass(); // stdClassをインスタンス化
$piyoObject->name = 'ぴよぴよ'; // nameプロパティを設定
$hogeObject = new Hoge(); // Hogeオブジェクト作成
$hogeObject->piyo = $piyoObject; // HogeオブジェクトにstdClassから作ったPiyoオブジェクトを格納
$userServiceMock->shouldReceive('makeHogeObject')->andReturn($hogeObject); // お膳立てされたHogeオブジェクトを返却

$this->app->instance(UserService::class, $userServiceMock);
```

※stdClassについてはこちら↓

https://qiita.com/miriwo/items/c6d604c64dbc6ff68545

複雑に見えるが、これでお膳立てはできたっぽい。

## 余談

実は`$hogeObject = new Hoge(); // Hogeオブジェクト作成`の部分は本物のHogeクラスをインスタンス化しなくても良い。下記のような書き方もできる。

```php
$userS8erviceMock = Mockery::mock(UserService::class)

$piyoObject = new stdClass(); // stdClassをインスタンス化
$piyoObject->name = 'ぴよぴよ'; // nameプロパティを設定
$hogeObject = Mockery::mock(Hoge::class); // Hogeオブジェクト作成
$hogeObject->piyo = $piyoObject; // HogeオブジェクトにstdClassから作ったPiyoオブジェクトを格納
$userServiceMock->shouldReceive('makeHogeObject')->andReturn($hogeObject); // お膳立てされたHogeオブジェクトを返却

$this->app->instance(UserService::class, $userServiceMock);
```

しかし、Hogeクラスがライブラリにて用意されたクラスだと、`does not exist on this mock object`などのエラーが出る時がある。

これはHogeクラスに静的メソッドや静的プロパティが定義されていて、それが処理の一貫で外部からのアクセスを受けたりすると出るエラーである。（モックとして側だけHogeオブジェクトを作成しているので静的メソッドなどが定義されていない。ようは呼び出そうとしたメソッドやプロパティが無いことで怒られている。）

その場合は今回紹介した方法で地道にお膳立てをするか、下記のようにすることで解決することもある。（overloadを使う方法）下記の方法は若干無理矢理感がある気がして自分は今回紹介した方法が好みだ。

```php
$userS8erviceMock = Mockery::mock(UserService::class)

$piyoObject = new stdClass(); // stdClassをインスタンス化
$piyoObject->name = 'ぴよぴよ'; // nameプロパティを設定
$hogeObject = Mockery::mock('overload:' . Hoge::class); // Hogeオブジェクト作成
$hogeObject->piyo = $piyoObject; // HogeオブジェクトにstdClassから作ったPiyoオブジェクトを格納
$userServiceMock->shouldReceive('makeHogeObject')->andReturn($hogeObject); // お膳立てされたHogeオブジェクトを返却

$this->app->instance(UserService::class, $userServiceMock);
```
PICAXEでBluetooth通信する

# はじめに
今回はHC-06というBluetoothモジュールを使用し、PICAXEでBluetooth通信を試してみました。少し難しそうですが、実際にはシリアル通信するだけなので非常に簡単です。
![picture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/9c3e007a-7716-2206-af00-4f4ecb5dae1c.jpeg)
# 開発環境
* Windows 11 Home 22H2
* PICAXE Editor 6.1.0.0
# ハードウェアについて
[**以前**](https://qiita.com/ricelectric/items/2b636500bc9b12738d0a)に作った書き込み回路を流用しました。PICAXEのピンC.0は送信用、ピンC.1は受信用としてそれぞれHC-06のRXD、TXDに交差して結線し、シリアル通信します。
![breadboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/513fd944-f168-3b17-c433-b014c8c1ea34.png)
# ソフトウェアについて
クロック周波数はデフォルトで4MHzとなります。ボーレートはクロック周波数に依存するため、デフォルトのままだとPICAXEのボーレートは最高でも4800bpsまでしか選択できません。HC-06のボーレートはデフォルトで9600bpsとなるため、今回はクロック周波数を8MHzまで引き上げました。シリアル通信の設定では`T9600_8`と指定します。ちなみに、先頭の英字がTだとアイドル状態でハイ、Nだとローに保持されます。つまり、必要に応じて極性を反転できます。また、中央の数字はボーレート、末尾の数字はクロック周波数を表します。
![blockly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/3bda6d78-5e88-541f-54bb-054322e7fe7e.png)
今回は受け取った文字をそのまま返すようなプログラムとしました。数字のみを返すように条件文で制限しています。また、チェックボックスにチェックを付け、文字列として受け取ると条件文では数字へ変換され、数値的に比較されてしまいました。受信の有無や文字の種類などを判定したいため、ASCIIコードとして比較できるようにチェックは外しています。ただし、受け取った文字列における先頭の文字しか変数には代入できなくなります。改行コードのCR、LFも付与しています。
# 動作確認
まずはスマホの設定からペアリングする必要があります。デフォルトのデバイス名はHC-06、PINコードは1234です。また、接続を待機している間はLEDが点滅し、接続が完了すると点灯します。今回は[**こちら**](https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&pcampaignid=web_share)のアプリから接続してBluetooth通信しました。正常に動作していることが確認できました。
# おわりに
簡易的にBluetooth通信する場合、HC-06なら専用のライブラリなども不要なので非常に扱いやすかったです。
# 参考文献
https://burariweb.info/electronic-work/arduino-bluetooth-module-hc05-hc06.html#HC-06_AT
Nablarch: writeタグとrawWriteタグの違いは？brタグを使用できるのはどっち？

# 結論

:::note
- brタグを使用できるのは、rawWriteタグ。
- writeタグは、デフォルトではbrタグを使用できない。
  - 一方、自動エスケープされるので、安全性が高いメリットがある。
:::


:::note alert
- rawWriteタグはセキュリティリスクに注意する必要がある。
  - 外部から入力可能な値にrawWriteタグを使用するのはご法度。
:::

## 前提:Nablarchのカスタムタグについて

https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/libraries/tag.html#tag

## コードサンプル

nablarch-example-webでテストする。実行方法はREADMEを参照。

https://github.com/nablarch/nablarch-example-web

```java
    /**
     * ログイン画面を表示。
     *
     * @param request HTTPリクエスト
     * @param context 実行コンテキスト
     * @return HTTPレスポンス
     */
    public HttpResponse index(HttpRequest request, ExecutionContext context) {
        context.setRequestScopedVar("brtag", "こんにちは。<br>これは、<br />改行をテストします。これは改行しない(_br_)<br>");
        return new HttpResponse("/WEB-INF/view/login/index.jsp");
    }
```

```jsp
    <body>
        <div class="mainContents">
            <n:include path="/WEB-INF/view/common/header.jsp" />

            <div class="title-nav">
                <span>ログイン</span>
            </div>
            <div class="font-group">
                <!-- name属性を指定してオブジェクトのpersonNameプロパティにアクセスする。 -->
                改行あり<n:rawWrite name="brtag" />
                改行なし<n:write name="brtag" />
            </div>
        </div>
    </ body>
```

### どうなるのか

:::note
- rawWriteタグは、`<br />`と`<br>`いずれも利用できる。
- writeタグは、タグがエスケープされる。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/1712cf31-8818-fd5c-ed83-da13bef4e42a.png)

## 参考文献

### JSPカスタムタグ

https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/libraries/tag.html#tag

### rawWriteタグ

https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/libraries/tag/tag_reference.html#tag-raw-write-tag

### writeタグ

https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/libraries/tag/tag_reference.html#tag-write-tag
React×TypeScriptの勉強がてらにサイトを評価する拡張機能を作ってみた。


<!-- ================================================= -->
# 経緯
<!-- ================================================= -->
高卒でエンジニアになり、早くも3年目となり  
お仕事以外では下記のようなソフトや  

https://qiita.com/benja0000/items/94b9f4c386f837c252f4  

kintoneのプラグインの開発をやったりしているのですが
開発中に行き詰まった際に数多くの技術系の記事を参考にして
壁を乗り越えてきたのですがその際に、何回もあったことが...
### 「あれ、この記事前にもみたんじゃね...?」
ということです。
それをなくすために勉強がてらに下記のような拡張機能を作ってみました。

# 爆誕
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/3310f3f7-6aed-85d3-0c48-3fee41650eea.png)
その名も **「サイト評価するおくん」** です。
その名の通り、サイトの評価をします。
それ以外のことはしません!(おまけ機能的なものは一様ありますが...)

# どんなとこが便利やねん
実際に経緯で説明したようなことが開発中に遭遇しなくなりました。
理由としては拡張機能の下記の機能のおかげになります。

## 評価したサイトのリンクに自動的に評価が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/cfd0debb-8361-1502-5e82-933ddb238ace.png)
上記によってサイトに訪れなくとも評価を確認することができ、
過去の自分の評価を参考にしてサイトに訪れるかを判断することができます。

**「自分が調べている内容とマッチしていなかったな」** ということが
評価を積み重ねていくことにより自然と減っていったのが
実際の開発でも大変助かりました。


評価自体は拡張機能の下記のポップアップ画面から評価ができるようにしました。
-  ポップアップ表示画面
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/4dafa6a8-1f1d-608e-90df-f2af605fd7de.png">

その他にも評価を検索するための機能や
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/8683875e-8019-2b3b-1b8a-14c33523bc37.png">

何かあっても安心のようにCSVインポート・エクスポート機能を携えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/48b4538c-17e6-d921-0935-4aee5778f20d.png)

## 他にはなんかない
#### あります。
個人的に欲しかった機能としてQiita以外の技術系ブログ(Zennとか)を読んでいる時に
### 「Qiitaにもなんか同様の記事ないかな」
と思い、実際にQiitaに記事探しの旅に出かけることがありました。
これらを効率的にするためにこんな機能をつけました。
 ## Qiita記事関連表示機能
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/14cc17cc-55e9-2b33-1c05-4044b2cdd9e9.png)

Ajaxで現在のタイトルと関連するようなQiita記事の情報を取得し
ページの下部に表示する機能をつけてみました。

実際に、この機能が何気に便利で効率的に開発ができるようになったのはもちろん
ネットサーフィンがとても楽しくなりました。

かといって押し売りするのも嫌なので
上記の機能が邪魔な人もいると思うのでポップアップ画面から非表示にする機能も設けています。

![スクリーンショット 2024-01-25 0.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235105/3f583522-66fe-a04e-6fcd-15ca403a7a71.png)

## 最後に
ここまで読んでくださりありがとうございます。
ここまで読んでみて拡張を機能を入れてみようかなと思われた方、
下記のGithubからインストールできます！
(インストール手順も記載しております、泣いて喜びます...)


https://github.com/benjaaamin0518/site-rating-kun-react

今後の展望としては評価と一緒にメモも記録できるようにしていきたいなと細々と考えております...!
なぜautosuggestionsを使わないのか。

zsh-autosuggestions とは

zsh-autosuggestions はターミナルのコマンド履歴に基づいてコマンド候補を表示、入力補完もしてくれるとても便利なプラグインのこと。

もうこれ入っているのと入っていないのでは世界が変わります。

```
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
```

あとはこのプラグインを.zshrcファイルに設定して反映するだけ。

```
vim ~/.zshrc
```

```
plugins=( 
    zsh-autosuggestions
)
```
ターミナルのエイリアスってめっちゃ便利だから使おう。

```
vim ~/.zshrc
```
以下をインサートして、source ~/.zshrcで反映

```
#docker
alias dcb='docker-compose build'
alias dcbnc='docker-compose build --no-cache'
alias dcu='docker-compose up'
alias dcud='docker-compose up -d'
alias dcd='docker-compose down'
alias dcsta='docker-compose start'
alias dcrsta='docker-compose restart'
alias dcsto='docker-compose stop'
alias dc='docker-compose'
alias dce='docker-compose exec'
alias dcp='docker-compose ps'
alias dca='docker-compose attach'

#git
alias gb='git branch'
alias gs='git switch'
alias gsc='git switch -c'
alias ga='git add'
alias gaa='git add -A'
alias gc='git commit'
alias gf='git fetch'
alias gp='git pull'
alias gpod='git pull origin develop'
alias gm='git merge'
alias gst='git status'
alias gl='git log'
alias glo='git log --oneline'
alias gi='git init'
alias gpoh='git push origin HEAD'
alias gpo='git push origin'
```
【JavaScript】camelCaseをsnake_caseに変換する方法

以下のライブラリをインストールします。

https://github.com/sindresorhus/decamelize-keys

```shell
$ yarn add decamelize-keys
```

以下のように使用します。

```js
import decamelizeKeys from 'decamelize-keys';

// オブジェクトを変換
decamelizeKeys({fooBar: true});
//=> {foo_bar: true}

// オブジェクトの配列を変換
decamelizeKeys([{fooBar: true}, {barFoo: false}]);
//=> [{foo_bar: true}, {bar_foo: false}]

// separatorを変更する
decamelizeKeys({fooBar: true});
//=> {foo_bar: true}

decamelizeKeys({fooBar: true}, {separator: '-'});
//=> {'foo-bar': true}
```