OmniAICreator/Qiita-1.07M huggingface dataset:
福田昭のデバイス通信 第1回 第2回 第3回 第4回

# バッテリー容量の限界

1998年の携帯電話のRAMは64KB、フラッシュメモリは1MB、バッテリー容量は900mAh。
2015年のスマートフォンのRAMは3GB、フラッシュメモリは128GB、バッテリー容量は2550mAh。
RAMやフラッシュメモリの著しい進化に対し、バッテリー容量は3倍にも達していない。
現代のシステムはバッテリー容量がボトルネックであり、消費電力を抑えることが最優先である。

# CPUのトレードオフ

CPUの動作周波数を高めると消費電力の増加が著しいし、CPUのコア数を増やすと設計の複雑化と製造コストの増加を伴う。
コストと付加価値のトレードオフである。

# CPUの進化

- 1990年代はシングルコアで動作周波数を高めることに注力していた。
- 2000年代は同じコアを並べたマルチコアに進化した。
- 2010年代は異なるコアを並べたマルチコアが主流である。

# メモリアーキテクチャ

上のものほど高速であるが高価である。

- レジスタ (フリップフロップ)
- キャッシュ (SRAM)
- 物理メモリ (DRAM)
- フラッシュストレージ (SSD, USB)
- 仮想メモリ (HDD)

レジスタとキャッシュはCPUに内蔵されている。
レジスタ、キャッシュ、物理メモリは揮発性であり、CPUから直接アクセスできる。
フラッシュストレージと仮想メモリは不揮発性であり、入出力コントローラを通してブロック単位で間接アクセスする。

# メモリ空間

メモリ空間の大きさを決めるのはアドレスバスの幅である。
32ビットでは4GBとなり、これを超える物理メモリを搭載しても意味は無い。
64ビットでは16EBと大きすぎる為、アドレスバスの幅を狭めることが多い。
Linuxコマンドのおさらい

# はじめに
今回はLinuxコマンドを勉強してきたので、内容をまとめていく。

## Linuxとは
LinuxとはOSの一つであり、Unixを模倣して作られたオープンソースのOSである。
広義のLinuxと狭義のLinuxとがあり、本来Linuxとは核であるカーネル(Linuxカーネル)のことを指す(狭義のLinux)。
しかしカーネル単体では使用できず、そこにソフトウェアなど諸々を追加したものをディストリビューションと呼ぶ(広義のLinux)。
CentOSやUbuntuなどが代表的なディストリビューションである。

## 基本的なコマンド
Linuxコマンドにはオプションを付与できるが、それについては割愛。

|コマンド|内容|例|
|-|-|-|
|cd|ディレクトリを移動する。|cd /home/desktop|
|pwd|カレントディレクトリを出力する。|pwd|
|ls|ディレクトリ内の格納物を出力する。<br>パスを指定することで、出力するディレクトリを指定することが可能。未指定ならカレントディレクトリの内容を出力する。|ls /home/desktop|
|mkdir|空のディレクトリを作成する。<br>パス指定で任意のディレクトリに作成できる。指定しなければ、カレントディレクトリに作成。|mkdir dirname|
|rmdir|ディレクトリを削除する。|rm dir dirname|
|cat|ファイルを表示する。|cat filename|
|less|ファイルを一画面で表示する。<br>内容を全表示するcatとは違い、一画面ずつ表示される|less filename|
|tail|ファイルの末尾１０行を出力する|tail filename|
|touch|ファイルのタイムスタンプを変更する。<br>指定したファイルが存在しない場合には新たにファイルを作成するため、主にファイル作成に使用する。|touch filename|
|rm|ファイルを削除する。|rm filename|
|mv|ファイルを移動する。<br>対象ファイルと移動先を指定するのだが、移動先をディレクトリではなくファイル名にすることでファイルの名称を変えることも可能。|mv filename|
|cp|指定したファイルをディレクトリにコピーする。|cp filename dir|
|ln|対象のファイルに対してリンクを作成する。<br>オプションを付けない場合、ハードリンクといったものになり、実質的なコピー。詳細割愛。|ln filename|
|find|検索対象のパスを出力する。<br>オプションの付与によって曖昧検索などにも対応している。|find /home/desktop filename|
|chmod|ファイルの権限を設定する(読書実行)。|chmod 755 filename|
|chown|ファイルの所有者を変更する。|chown username filename|
|ps|実行中のプロセスを表示する。|ps|
|kill|実行中のプロセスを中断する。|kill プロセスID|
【Vue】フォームのファイルをBase64エンコードした文字列としてAPIに送信する

[FileReader.readAsDataURL()](https://developer.mozilla.org/ja/docs/Web/API/FileReader/readAsDataURL) を利用する。
※ readAsDataURL()でbase64エンコードされた文字列は先頭に `data:*/*;base64,` という文字列が付加されるので、base64文字列のみを取得したい場合はこの接頭辞を削除しなければならない。

```vue
<template>
<div>
    <form ref="form" @submit.prevent="submit">
      <div>
        <input id="js_file" type="file">
      </div> 
      <div>
        <input type="submit" value="送信">
      </div>
    </form>
</div>
</template>

<script setup lang="ts">
import { InputHTMLAttributes, ref } from "vue"

class Common {
  /**
   * blobオブジェクトを引数にとってBase64エンコードされた内容を返す
   */
  public static readAsBase64(file: Blob): Promise<string> {
    const promise = new Promise((resolve, reject) => {
      let reader = new FileReader();
      reader.onload = () => {
        resolve(reader.result)
      }
      reader.onerror = reject
      reader.readAsDataURL(file)
    }).then((dataUrl): string => {
      if (typeof dataUrl === "string") {
        return dataUrl.replace(/data:.*\/.*;base64,/, '');
      }
      throw new Error("dataUrl is not string")
    })
    return promise
  }
}

async function submit(event: Event) {
  // ファイルの中身をBase64エンコードした文字列を取得
  let file = document.getElementById("js_file").files[0]
  let content = await Common.readAsBase64(file)
  console.log(content)
  let res = await fetch("http://example.co.jp/file/", {
    method: "POST",
    body: JSON.stringify({
      "content": content,
    })
  })
  console.log(res)
}
</script>
```
スーパー鳩時計

https://paiza.jp/works/mondai/double_roop_problems/double_roop_problems__cuckoo_clock

素直に書くと
```py
for x in range(24):
    for y in range(60):
        if ((x + y) % 3 == 0 and (x + y) % 5 == 0) or (x + y) == 0:
            print('FIZZBUZZ')
        elif (x + y) % 3 == 0:
            print('FIZZ')
        elif (x + y) % 5 == 0:
            print('BUZZ')
        else:
            print()
```

３で割り切れるかつ５で割り切れる数、かもしくは0もｘ＋ｙでというやつ。
とりあえず倍数をあげてみます
3 6 9 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60
5 10 15 20 25 30 35 40 45 50 55 60

両者に共通する数を抜き出せばいいですね
15 30 45 60だけでした。これは。。。１５の倍数ですね。。。

で、０になるのってｘ＋ｙ＝０の、x=0、y=0のときだけ。
あれ？0って何で割っても余り０だよね？
（このあと実際にprintして試して0になるのを確認）
ってことは結局15の倍数になるものだけFIZZBUZZってことになります。
うーん数学奥が深い。

```py
for x in range(24):
    for y in range(60):
#        if ((x + y) % 3 == 0 and (x + y) % 5 == 0) or (x + y) == 0:
        if  (x + y) % 15 == 0:
            print('FIZZBUZZ')
        elif (x + y) % 3 == 0:
            print('FIZZ')
        elif (x + y) % 5 == 0:
            print('BUZZ')
        else:
            print()
```
CloudFrontでディストリビューションを作成する際に詰まった話

## 初めに
- 題名通りであるが、CloudFrontを初めて扱った際に、詰まった点をまとめる

## 流れ
1. 今回は目標として、CloudFront＋S3で静的サイトの配信を行おうとしていた。
1. S3の設定は、参考サイト通りに行うことができた
1. いざCloudFrontの設定を行おうとしたとき、次の欄が発見できなかった、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/db8a3507-58ef-cde6-5b08-64c17958e2e4.png)
4. 2024/1月の記事でも同様に[accuess control settings]に関する記載があったため、自分要因であると判断した。

## 原因
![スクリーンショット 2024-01-30 125020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/f6614dad-9b6f-2f74-806f-8b27e2e4e667.png)

上にあるエラーを消すために、「WEBサイトのエンドポイントを使用」を押したところ、それまで表示されていた[accuess control settings]に関する欄が消えてしまったことを確認した。

まだCloudFrontのことを全く理解していないため、今回は既存の情報に従い作成したが、AWSの推奨するほうでも今後作成して理解を深めていきたい。
Tello ドローンの操作とプログラミング

# はじめに

DJIの[Telloドローン](https://www.amazon.co.jp/%E3%80%90%E5%9B%BD%E5%86%85%E6%AD%A3%E8%A6%8F%E5%93%81%E3%80%91-%E3%83%88%E3%82%A4%E3%83%89%E3%83%AD%E3%83%BC%E3%83%B3-%E3%83%96%E3%83%BC%E3%82%B9%E3%83%88%E3%82%B3%E3%83%B3%E3%83%9C-Powered-DJI/dp/B07GJ74CDL/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2CHH1UEMJ6JMP&keywords=Tello&qid=1706583703&sprefix=tello%2Caps%2C166&sr=8-3&th=1)は、初心者でも簡単に操作できるコンパクトで多機能なドローンです。この記事では、Telloドローンの基本的な操作をPythonを使用して説明します。

## **ライブラリのインストール**

まず、Telloドローンをプログラムで操作するために必要な**`djitellopy`**ライブラリをインストールします。

```python
# コマンドラインで実行
pip install djitellopy
```

## **Telloオブジェクトの初期化と接続**

Telloドローンとの通信を開始するために、必要なライブラリをインポートし、Telloオブジェクトを初期化します。

```python
import time
import cv2
from djitellopy import Tello

tello = Tello()
tello.connect()
```
![スクリーンショット 2024-01-30 11.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/ef65ec0a-b7a4-c937-91f5-bc4b80fbcf59.png)

## **基本操作**

Telloドローンの基本操作はシンプルです。離陸から着陸までの一連の流れをコードで実行できます。

```python
# 離陸
tello.takeoff()
time.sleep(5)

# 着陸
tello.land()
```

**`time.sleep()`** 関数は、連続した動作の間にドローンが一定時間待機するように設定します。

## **一回転と写真撮影**

Telloドローンは、回転や写真撮影などの高度な操作もサポートしています。

### **一回転**

ドローンを360度回転させるには、以下のようにコマンドを実行します。

```python
# 反時計回りに360度回転
tello.rotate_counter_clockwise(360)
time.sleep(5)
```

### **写真撮影**

Telloのカメラを使用して写真を撮るには、カメラのストリームを開始し、フレームを取得して保存します。

```python
pythonCopy code
# ストリームを開始
tello.streamon()
frame_read = tello.get_frame_read()

# 画像を保存
cv2.imwrite("picture.png", frame_read.frame)
time.sleep(5)

# ストリームを終了
tello.streamoff()
```

## **実行コマンド**

これらのスクリプトをPythonファイルに保存し、以下のコマンドで実行します。

```python
python tello_script.py
```

## **まとめ**

Telloドローンは、簡単な操作から高度な機能まで、多様な用途に使える素晴らしいツールです。プログラミングを通じて、これらの操作を自在に行うことができます。安全な場所での操作を心がけ、ドローン飛行の規則を遵守してください。楽しいドローンライフをお楽しみください！
Flask-APSchedulerでadd_jobしようとしたらunexpected argumentで躓いた話

Flaskを利用してマイクロサービスを作っていますが，ちょっと定期的な処理を実装しようとして躓いたので情報共有

## 環境
環境は以下の通り
Python: 3.9.18
APScheduler: 3.10.4
Flask: 3.0.1
Flask-APScheduler:1.13.1

docker container(python3.9ベース)内にpip経由でライブラリを入れて作った環境で動かしてます

## やろうとしたこと
```Python:test.py
from flask import Flask
from flask_apscheduler import APScheduler

def func1():
  pass # 関数の内容は関係ないので


scheduler = APScheduler()

app=Flask(省略)

scheduler.init_app(app)

scheduler.add_job(func1, 'cron', min=15)
```
こちら[公式](https://apscheduler.readthedocs.io/en/latest/modules/triggers/cron.html#module-apscheduler.triggers.cron)に書いてある通りなんですけどね．．． 
これを実行すると
```shell
got unexpected argument min
```
をadd_jobのところで食らいます
## 対策
引数の渡し方を変え,idを渡すようにしました
```python:revised.py
(省略)
scheduler.add_job(id='func1', func=func1, trigger='cron', min=15)
```

### 補足
id渡さないとやっぱり怒られます
id=****だけ足しても怒られます
他のトリガー(例えばinterval）でも同じでした
I2Sのフォーマット

FreeBSDで使ってるAR9341のI2SがFN1242は鳴るのですが、PCM1796やAK4382が鳴らないので、調べてみました。

AR9341のI2Sは16Bitがデフォルトです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/2b4b1ebf-bc21-b9c3-c655-06daef759d32.png)

ところが、PCM1796は24Bitがデフォルトでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/17f2bea2-dbf3-1623-ef44-ed21c33bc580.png)

I2Cで設定できるようなのですが、なんらかマイコンを使わなければいけません。

AK4382は24Bitしか対応していないようなので、鳴らすことは出来ないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/60af0598-fe8a-e4e8-d3b2-ec52d929b9a9.png)

デフォルトがI2Sではないので[マイコンで設定](https://qiita.com/yamori813/items/ebb8cf83871014e190db)しています。

FN1242は自動選択のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/eb10bd82-351d-1584-99c3-b10f01cd3f39.png)

VS1053も16Bitのようで、同じようにPCM1796やAK4382が鳴りません。

ちなみにAR9341のpcmドライバは本家にはなくて、ZRouter.orgのgithubの私のブランチにあります。

コード見直してみたのですが、直値でよくないですね。もう本家にマージできないので、まーいいですかね。

https://github.com/ZRouter/freebsd-src/blob/zrouter_yamori813/sys/mips/atheros/ar71xx_pcm.c#L592

ちょっと勘違いしてたのですが、AR9341のI2C_WORD_SIZE = 0の場合はbit clockが32fsですが1の場合は64fsになるようです。64fsに16bit*2というデータでも良いようです。64fsにすればPCM1796やAK4382は鳴りました。この設定をsysctlで変更出来るようにしてみました。

dev.pcm.0.bclk64fs: 0

![NewFile3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/265445e1-fab0-4b46-05eb-1c8a852f373c.png)

dev.pcm.0.bclk64fs: 1

![NewFile4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/00daac9c-48e6-6038-2c9b-103f77e1758e.png)

デフォルトを64fsにしました。
【C#】単独濁点（「゛」や「゜」）で表現されている2文字を1文字に正規化する

### 環境
macOS
Rider
dotnet7

### コード

```csharp
public class Normalization
{
    // 単独濁点を置き換えるマップ
    private Dictionary<char, char> dakutenMap = new()
    {
        { 'カ', 'ガ' }, { 'キ', 'ギ' }, { 'ク', 'グ' }, { 'ケ', 'ゲ' }, { 'コ', 'ゴ' },
        { 'サ', 'ザ' }, { 'シ', 'ジ' }, { 'ス', 'ズ' }, { 'セ', 'ゼ' }, { 'ソ', 'ゾ' },
        { 'タ', 'ダ' }, { 'チ', 'ヂ' }, { 'ツ', 'ヅ' }, { 'テ', 'デ' }, { 'ト', 'ド' },
        { 'ハ', 'バ' }, { 'ヒ', 'ビ' }, { 'フ', 'ブ' }, { 'ヘ', 'ベ' }, { 'ホ', 'ボ' },
    };
    
    // 単独半濁点を置き換えるマップ
    private Dictionary<char, char> hanDakutenMap = new()
    {
        { 'ハ', 'パ' }, { 'ヒ', 'ピ' }, { 'フ', 'プ' }, { 'ヘ', 'ペ' }, { 'ホ', 'ポ' },
    };
    
    // 文字列中の濁点を正規化する
    public string Invoke(string input)
    {
        var result = new StringBuilder();

        for (var i = 0; i < input.Length; i++)
        {
            var currentChar = input[i];

            // ゛か゜がある場合、変換を行う
            if (i < input.Length - 1 && (input[i + 1] == '゛' || input[i + 1] == '゜'))
            {
                result.Append(ConvertToSingleDakutenChar(currentChar, input[i + 1]));
                // 2文字処理したので1つ進める
                i++;
            }
            else
            {
                result.Append(currentChar);
            }
        }

        return result.ToString();
    }

    private string ConvertToSingleDakutenChar(char originalChar, char dakutenType)
    {
        switch (dakutenType)
        {
            case '゛':
            {
                // 濁点マップに存在する場合は変換、存在しない場合はそのまま返す
                if (dakutenMap.TryGetValue(originalChar, out var convertedChar))
                {
                    return convertedChar;
                }
                break;
            }

            case '゜':
            {
                // 半濁点マップに存在する場合は変換、存在しない場合はそのまま返す
                if (hanDakutenMap.TryGetValue(originalChar, out var convertedChar))
                {
                    return convertedChar;
                }
                break;
            }
        }
        
        return originalChar.ToString();
    }
}

```

### 参考
https://qiita.com/arika/items/7fe1e7dd4dec421bd82d
UX検定基礎に合格しました！


先日UX検定基礎を受験し、無事合格しましたので、
受験の経緯、試験の概要、実際の私の勉強方法について記録を兼ねて共有できればと思います。
(受験者がそう多くはない資格なので、少しでも参考になれば幸いです)

# 【簡単に自己紹介】
□文系出身、未経験でIT系会社に入社した社会人4年目。
□普段はフロント寄りのシステム開発業務。
□UXについては普段業務で触れる程度で、専門知識はほぼ0。

# 【受験の経緯】
□UIやUXに関心があり、一度体系的に学習したいと考えたから。
　…現在フロント寄りの業務を担当しており特にUIの分野に興味がありました。
　　せっかくなら資格取得を通じて体系的に学習したいと思い、受験を決めました。

# 【試験の概要】
□UX向上に欠かせないスキル・マインドを学ぶための試験。
□試験時間は100分。
□合格ラインは公表されていませんが8割といわれています。
□受験料は10,890円(税込)。
□試験形式はオンライン。
(公式サイトは[こちら](https://www.uxia.or.jp/certification/))

# 【勉強方法】
#### シラバスを片手に、参考書籍を読みまくる
比較的新しい試験かつ過去問や公式テキストは現状ないため、ひたすら参考書籍４冊を熟読しました。
まずは通読し概要や流れがある程度つかめてから、シラバス片手に用語の意味や他との差異、実践する際の注意等をまとめていきました。ルーズリーフにまとめていたのですが、複数の書籍にまたがって記載されているものも多かったので、Excel等追記しやすいツールの方がより効率的だったかなと思います。
書籍については、私は下記の順番で読み進めました。
　①アフターデジタル UXと自由
 　…身近なトピックから始まるので導入としていいかなと思います。UXについてのイメージ
  　　をざっくりと把握でき、知識のベースができたと思います。
 　②人間中心設計入門
  　…一番出題されていたのはこの1冊からかなと思いました。いわゆるテキストのような内容
   　　で、後半は辞書代わりとしても私は活用していました。
  　③ユーザビリティエンジニアリング：ユーザーエクスペリエンスのための調査、設計、
   　　評価手法
     　…実践にフォーカスした内容で、個人的には一番読みやすかったように思います。
     　④UXグロースモデル アフターデジタルを生き抜く実践方法論
      　…”企業”という大きな視点での実践について中心に記載されていました。管理職の方だと
       　もう少し内容が結び付きやすいのかなと思いますが、私には少しスケールが大きい話の
        　ように感じられました。
用語については、書籍の内容よりも少し踏み込んだ内容まで出題されていたように思います。あくまで”参考”書籍なので、書籍のみではなく少しネット等で単語を調べてみて追加で知識を吸収しておくとより安心して受験できるかなと思います。
試験の少し前に有料のオンライン講座の案内も来ましたが、そこそこお値段がするのと手元にある書籍の理解度を深めることを優先した方が良いと判断し、私は利用しませんでした。
(勉強時間としては80時間弱)

# 【試験本番】
□事前に環境テストが実施できるので、受験予定のPCで問題ないか確認した上で当日を迎えました。
□4択の選択肢から適切なものを選んでいく形式でしたが、本質的な部分を問われる設問が多く、単に丸暗記では厳しいように感じました。
□100問100分の試験時間で、案外時間としてはギリギリでした。

# 【最後に】
□直前で詰め込んだこともあり、ギリギリの点数(82点)で合格しました。
□テキストや過去問題がない分、学習方法の確立には時間を要しました。普段は知識を吸収→問題演習で確認という学習スタイルだったので、どうしてもアウトプットに苦戦しました。
□体系だてて勉強することができ、受験してよかったなと思いました。
 実務で活かせるもの・活かしづらいものどちらもありますが、体系的に学習したことで知識の地盤がきちんと固められたように思います。
□上位版と思われる、”UX検定応用(仮)”というワードが執筆時点で公式サイトに追加されていたので、いつか挑戦してみたいと思います。
Node.jsでのselectのデフォルト値

# 問題点
`<option selected=true>`とやろうが、`<option selected=false>`とやろうが、とにかく`selected`が存在すると選択されてしまうようなので、どうしようかなという話。
~~そもそも`selected=true`なんていうものも適当に書いてみただけですが。~~

# 結論
`<option selected>`を作るのではなく、`<select defaultValue="値">`にする。

ちなみに、`<select value="値">`とすると、Read Onlyな項目に設定してるよというエラーが出ます。

# HTMLの仕様ではなく、JSXの仕様
でも下記のHTMLの仕様を読んでも、`defaultValue`というプロパティがなくて、とっても気持ち悪いのです。
- [&lt;select&gt;: HTML 選択要素 - HTML: ハイパーテキストマークアップ言語 | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/select)
- [HTML Standard](https://html.spec.whatwg.org/multipage/form-elements.html#the-select-element)

そこで、ReactのJSXのDOM要素のページで仕様を見たら、、、これだ！
> **注意点**  
> - React は `<option>` の `selected` 属性をサポートしていません。代わりに、このオプションの `value` を親の `<select defaultValue>` に渡して非制御のセレクトボックスを作成するか、`<select value>` に渡して制御されたセレクトボックスを作成します。  
>   
> _引用:[&lt;option&gt; – React](https://ja.react.dev/reference/react-dom/components/option)_

スッキリしました。ちゃんと調べてよかった。
Laravel Background-image 背景画像のURL

Let's imagine this is the folders structure:

Resources
Limages
   Lyour_image.png
css
Lstyle.css

First of all, don't forget to do npm run build or npm run dev.

Write the relative path to the image from your css (no quotes needed). In this example:

body {
    background-image: url(../images/your_image.png);
}

パスの関係図
【ChatGPT有＋DALL-E3】英語のプロンプトをもらいました。どうしよう？


　どうも、カーブミラーです。

　今回は、X-Twitterや友人から、英語のプロンプトをもらったら、どうしましょう？という話です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　X-Twitterには、
　　多くの画像が
　　　溢れています。

　その中には、
　　プロンプトを
　　　共有してくださる方々が
　　　　おられます。

　私も
　　作品をアップしている身として
　　　共有化可能なものは
　　　　アップしています。

　こうしたプロンプトの多くは
　　ほとんどが、英語です。

　英語の方が
　　DALL-E3には
　　　きちんと伝わる、と
　　　　いうこともありますが
　　　　　英語圏の人たちが多い
　　　　　　というのが
　　　　　　　その理由でしょう。

　さて、
　　こうした共有される前提の
　　　プロンプトには、
　　　　どこを変更すればいい、と
　　　　　いう部分があります。

　“[OBJECT]”とか“[TARGET]”などの
　　“[]”で閉じられた部分です。

　“[COLOR]”という場合も
　　多いですね。

　こうはなっていても
　　いちいち英語を入力するのは
　　　意外と手間です。

　単語を思い付いて
　　英単語を綴れれば
　　　それが一番ですけど、
　　　　英語が苦手な人は
　　　　　私も含めて多いものです。

　DeepLなどで翻訳して
　　それをコピペして貼る。
　　　もちろん、それでも
　　　　構わないわけですけど……。
***
　ここで、
　　私は、ふと思いました。

　ChatGPTは
　　テキスト生成AIで
　　　翻訳もお手のもの。

　あなた、今、
　　“ChatGPTで翻訳するなら同じだ”
　　　と思いませんでしたか？

　いえいえ、
　　そんな手間は必要ないのです。

　OBJECTやTARGET、COLORに
　　そのまま日本語を
　　　ぶっこんでください！

　“えっ？”ってなりました？w

　どっちにしても
　　入力はしなければ
　　　なりません。

　でも
　　いちいち翻訳するのも、ねぇ。

　ならば、
　　そのまま入力して
　　　ChatGPTさんに
　　　　任せてしまえば、いい！

　これに気付いたときから
　　無駄な作業が削れ、
　　　効率良く、
　　　　作業を続けられるように
　　　　　なりました。

　みなさんも
　　お試しあれ。

　今回は、ここまで。
Node.jsでのloggerでWinstonを選択した



Node.jsの開発において、適切なロギングツールを選ぶために調査したことをまとめたいと思います。。
この記事では、Node.jsのロギングにWinstonを選んだ理由と、他の人気のあるロギングライブラリとの比較を紹介します。

## なぜWinstonを選ぶのか？

WinstonはNode.jsの中で最も人気のあるロギングライブラリの一つです。

私は以下の理由でWinstonを選択しました。

1. **アクセス毎のロググルーピング**
    Winstonを使うと、アクセス毎にログをグループ化し、整理しやすくすることができます。
2. **ログの構造化**
    ログの内容を構造化し、後で分析や管理がしやすくなります。
3. **将来の拡張性**
    Winstonには、将来的にAmazon S3などのストレージサービスへログを転送するためのモジュールが用意されています。

さらに、Winstonは多くのリファレンスや記事があり、実績も豊富です。
そのため、多くの場合でWinston以外を選ぶ理由は少ないと言えます。


## 他のロギングライブラリとの比較

Node.jsのロギングライブラリを比較してみましょう。
以下の表は、Winstonを含む主要なロギングライブラリを比較したものです。

| No  | ライブラリ  | 特徴                                                    | GitHub スター数 |
|----|------------|--------------------------------------------------------|-----------------|
| 1  | Winston    | 多機能、カスタマイズ可能なトランスポート、柔軟なログレベル設定    | 18,000         |
| 2  | Pino       | 高性能、低オーバーヘッド、大量ログデータに適している               | 8,000          |
| 3  | Bunyan     | シンプルなJSONロギング、ストリーミングとモジュラー設計に注力     | 6,700          |
| 4  | Morgan     | HTTPリクエストログに特化、Express.jsとの組み合わせに適している   | 6,600          |
| 5  | Log4js     | JavaのLog4jに触発されたデザイン、カスタマイズ性が高い            | 5,100          |
JavaScript　console　


### console.log(log);
変数の中身を見る
%cで指定した部分にスタイルをつける事も出来る
console.log(“%c エラー” , ”color: red; “);
<br>
### console.table(table);
表形式で変数の中身を見る
<br>
### console.dir(element)
DOMの詳細を表示する
<br>
### console.trace(“中身”);
関数の呼ばれた場所までの経路を表示する
<br>
### console.warn(“警告”)
コンソール上で黄色の文字で警告文を表示する
<br>
### console.error(“エラー”)
コンソール上で赤色の文字でエラーメッセージを表示する
<br>
### console.count()
実行回数を表示する
<br>
### console.time(“時間”);
for (i = 0; i < 100000; i++) {}
console.timeEnd(“時間”);
コードの実行にかかった時間を表示する
<br>
### console.clear()
コンソールがクリアされてConsole was clearedと言うメッセージが表示される
Python で PDF にハイパーリンクを追加する

## はじめに
PDF ドキュメントは情報やコンテンツの共有に広く使用され、ハイパーリンクを追加することで読者が簡単に関連する場所にアクセスできるようになります。例えば、文書内の特定のページ、ウェブサイト、メールアドレス、またはファイルへのリンクを作成することができます。Python で PDF にハイパーリンクを追加する方法について、この記事では詳しく説明します。
## ツール
* Python 3.12.0
* [Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)ライブラリ

このライブラリは購入する必要がありますが、[30 日間の無料試用版](https://www.e-iceblue.com/TemLicense.html)も提供されています。
もっと多いサンプルコードについて、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)をダウンロードして参照してください。

## 準備
まず、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)と plum-dispatch v1.7.4を VS Code にインポートします。
1.[Python](https://www.python.org/downloads/)をダウンロードしてインストールします。
2.VS Codeで「Extensions」をクリックし、「Python」を検索してインストールします。
3.「Explorer」-「NO FOLRDER OPENED」-「Open Folder」
4. フォルダーを選択し、そこに「.py」ファイルを追加します。
5.「Terminal」-「New Terminal」
6.次のコマンドを入力します。
**pip install Spire.PDF**

## コードの説明
以下のコードでは、まず指定されたテキストを文書内で検索します。その後、すべての出現箇所についてループ処理を行い、各テキストの範囲に基づいて**PdfUriAnnotation**のインスタンスを作成します。**PdfUriAnnotation**クラスのプロパティを使用してハイパーリンクをカスタマイズします。最後に、PdfPageBase.AnnotationsWidget.Add(PdfUriAnnotation)メソッドを呼び出してハイパーリンクをテキストに追加します。
## コード

```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocument インスタンスを作成する
pdf = PdfDocument()

# PDF ファイルを読み込む
pdf.LoadFromFile("C:/Users/Administrator/Desktop/Sample.pdf")

# 最初のページを取得する
page = pdf.Pages[0]

# ページ上の指定されたテキストのすべての出現箇所を検索する
collection = page.FindText("Text", TextFindParameter.IgnoreCase)

# 指定されたテキストのすべての出現箇所をループで処理する
for find in collection.Finds:

    # ハイパーリンク注釈を作成する
    uri = PdfUriAnnotation(find.Bounds)

    # ハイパーリンクの URL を設定する
    uri.Uri = "URL"

    # ハイパーリンク注釈の境界線を設定する
    uri.Border = PdfAnnotationBorder(1.0)

    # 境界線の色を設定する
    uri.Color = PdfRGBColor(Color.get_Blue())

    # ページにハイパーリンク注釈を追加する
    page.AnnotationsWidget.Add(uri)

# 結果ファイルを保存する
pdf.SaveToFile("AddHyperlink.pdf")
pdf.Close()
```
Deconstruct

## 参考
この記事は、以下の動画を参考にしています。詳しくは、動画をご覧ください。

https://youtu.be/55_E5m-YBpU?si=C08hd21Vc7cUshnD

以下の記事も参考にしています。

https://ufcpp.net/study/csharp/datatype/deconstruction/

## 分解（Deconstruct）
オブジェクトをタプルに分解する。
```C#
var (name, age) = new Person { Name = "ALICE", Age = 26, };
```

- 任意のクラスにインスタンス・メソッド`Deconstruct`を用意する
  - あるいは、対象のクラスを第１引数（`this`が付く）にした拡張メソッドでもよい
- 戻り値は`void`
- 引数は`out`を指定した参照渡し
- 引数が、分解された結果のタプルの項目になる
- `record`型には、`Deconstruct`メソッドが自動的に用意される

```C#
class Person
{
    public required string Name { get; init; }
    public int Age { get; init; }

    public void Deconstruct(out string name, out int age)
    {
        name = Name;
        age = Age;
    }
}
```
超簡単！Tencent Cloudでただ10秒でPalworld/パルワールドのマルチプレー専用サーバーを立てる

## はじめに
> [パルワールド](https://store.steampowered.com/app/1623730/Palworld/)は広大な世界で不思議な生物『パル』を集めて、戦闘・建築・農業を行わせたり、工場で労働させたりする全く新しいマルチ対応のオープンワールドサバイバルクラフトゲームです。

マルチプレイ専用サーバーを立てると、友人とプライベートでパルワールドを楽しむことができます。
簡単にマルチプレイ専用サーバーを立てるために、Tencent Cloudがインストールする必要な コンポーネントをパッケージ化しているので、構築とPortの設定が不要でただ**1分で**マルチプレイ専用サーバーを立てるできます。
早速にご紹介します。
## Step1： サーバーの購入
[Tencent Cloud](https://www.tencentcloud.com/account/login)にログインしてから[Lighthouseの購入画面](https://buy.tencentcloud.com/lighthouse)にて購入できます。
サーバーの設定は以下の通りです。Ubuntuの例として説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/f46ff88b-64f8-d9d8-4495-65868cf3a43f.png)

【Buy Now】をクリックすると、確認ページに遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/1f3f6899-b0c8-e538-6512-a0195c9a4aeb.png)
【Submit Order】をクリックすると購入完了！

## Step2： サーバーへ接続
### サーバーIPアドレスを取得
[Lighthouseコンソール画面](https://console.tencentcloud.com/lighthouse/instance/)にてサーバーのIPアドレスを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/a8a8cc6a-d7fc-2f40-3bd6-0bc6f03a377e.png)

### サーバーへ接続
ゲームを起動し、【マルチプレイに参加する（専用サーバー）」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/eefdc3b0-7f85-245c-41bc-467f7f8210ec.png)
```サーバーIP:8221```を記入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/935a5164-f733-b8f1-a8af-e57bcdf06779.png)


以上、パルワールドマルチプレイの専用サーバーの構築が完了しました。友人とプライベートでパルワールドを楽しんでプレイ！
Rails アプリに E2E テストを導入する（技術選定編）

E2E テストを導入するにあたり、技術選定で調べたことをまとめてみました

## とりうる選択肢とそれぞれの特徴

1. System Spec 経由で Capybara を使い Selenium をドライバーとして動かす
   - System Spec 自体が RSpec に組み込まれており、かつ Selenium が Capybara のデフォルトのJSドライバーなので rails で E2E テストをする場合の標準的なテストスタックと言える。rspec と統一された設定、環境で E2E テストが行える
1. System Spec 経由で Capybara を使い Playwright をドライバーとして動かす
   - Selenium をドライバーとして使った場合、テストが正常に実行されない場合があるので、その点を解消したい場合はこちら。Rails 7.1 であれば Playwright 用の設定が組み込まれているので gem をインストールすればそのまま使えるが、Rails 7.0 以前でも設定を追加すれば使える
1. Capybara を直接動かす
   - 詳細な設定や Sinatra など rails 以外のフレームワークを使いたい場合。テストの統一感が失われるので特別な要件がなければ採用する理由はなさそう
1. Selenium WebDriver を直接動かす
   - 直接的なブラウザ操作を行う。あえて採用する必要はなさそう
1. Playwright を直接動かす
   - Playwright の詳細な設定がしたい場合 / Playwright の扱いに慣れている場合 / サーバーサイドと疎結合な状態で、Playwrightを使いたい

弊社ではまだナレッジが乏しいので「System Spec 経由で Capybara を使い Selenium をドライバーとして動かす」というベーシックな手段を採用し、問題が生じた場合Playwright の採用も検討する方向性としました

## そもそも System Spec/Capybara/Playwright とはなにか

- System Spec は RSpec に組み込まれた E2E テストを実施するためのフレームワークで Capybara の機能を「ラップ」して、Rails のテスト環境に適した形で提供する。Capybara に依存しているので 他のライブラリを使う選択肢はない。
- Capybara は ウェブアプリケーションの E2E テストのために設計された Ruby ライブラリで、 Selenium などドライバーを利用してブラウザ操作をシュミレートする
- Playwright は Node.js 環境で動作する Microsoft が開発した E2E テストフレームワーク。類似のものとしては Selenium が有名。Capybara の設定により、ブラウザ操作のドライバーとして利用できる

## Selenium vs Playwright

JS が必要な場合の Capybara のドライバーの選択肢として Selenium と Playwright がある（JS が不要なケースの場合はデフォルトの Rack::Test JS を使う）
それぞれメリットデメリットあるが、ドライバのスイッチングコストは低い（設定ファイルのドライバの指定を変えるだけ）のでどちらかを試してみて、問題が生じたら切り替えるのが良さそう

- Selenium
  採用実績として多いのでこちらの方がとっつきやすそう。
  デメリットとしては 動作が Flaky で、テストが正常に実行されない（CI で時折よくわからない理由で落ち、 更に何故落ちたかの再現や調査が難しい）場合がある

- Playwright
  node ベースで動作する最近勢いのある E2E テストライブラリ。実行が高速。動作の安定性が高く、selenium から切り替えてテスト結果が安定したという情報が多く出てくる
  デメリットとしては採用実績が selenium と比べると少なく、[capybara-playwright-driver](https://github.com/YusukeIwaki/capybara-playwright-driver) という Capybara を使って Playwright を動かすための gem を使うことになるが、小規模な PJ のため運用面が少し不安

## 導入編

実際の導入手順は以下記事に記載しております
[Rails+M1 Mac+Docker環境にSystem Specを導入する](https://qiita.com/bython/items/fb943e8cf951e71a708d)

## 参考になったもの

いつも皆様のアウトプットに助けられております。ありがとうございます

- [E2E testing on Rails 2023](https://kaigionrails.org/2023/talks/YusukeIwaki/)
  - capybara-playwright-driver 開発者の方の登壇動画
- [Capybara で変更に強い E2E テストを書く](https://speakerdeck.com/yasaichi/tokyurubykaigi12)
  - E2E テストを書く上で意識した方がいいポイントについての解説
- [Rails で Playwright が公式にサポートされたので RSpec 経由で使ってみた](https://note.com/dev_onecareer/n/n67d25088b100)
  - Rails で Playwright を使う方法について
- [Rails のブラウザテストを Playwright で動かすようにしたらデバッグが簡単になって捗った](https://qiita.com/tomoasleep/items/71b792cb2f89235db1ca)
  - Rails で Playwright を使う方法について
- [【RSpec】System Spec が動作する Rails+Docker 開発環境を構築する](https://qiita.com/ddpmntcpbr/items/752b6a43727e7cccdd56)
  - docker 上で System Spec を実行するための環境構築手順
- [Docker + Rails 7 + RSpec で System Spec を実行するための設定](https://peno022.hatenablog.com/entry/docker-rails7-rspec-configuration-for-system-spec)
  - docker 上で System Spec を実行する際のハマりどころ
- [Playwright のインストール方法と使い方](https://future-architect.github.io/articles/20230822a/)
  - Playwright を直接動かす場合の手順について
IAM と aws Organaization　の使い分け

# 目的
どちらもアカウント管理のためのサービスですが、用途が異なります。

# 共通点
 - AWSアカウントの新規作成、アクセス設定、管理に用いる。

# 特徴：IAM
 - アカウント単位（１つずつ）を直接管理する。
 - IAM Role：アカウントだけでなく、リソース単位でアクセスルールの設定が可能。
 

# 特徴：Organization
 - アカウントグループに対して管理する。
 - 元となるマスターアカウントのアクセスルールの設定を、グループ内のユーザアカウントに一括摘要する。

# 使い分け
- IAM
  - ユーザ数が少なく個別管理が可能な場合。
  - それぞれの担当領域が細かく異なるユーザの場合。
  - リソース（サーバやストレージ）に対してアクセス設定したい場合。

- Organization
  - ユーザ数が多く個別管理では煩雑になる場合。
  - 部署単位レベルでざっくりしたアクセス制限が許容される場合。
OneDriveに保存したMP3ファイルをGoogleホームから再生する

# はじめに
今回はOneDriveに保存されているMP3ファイルをGoogleホームへキャストし、再生することを試してみました。必要なのはESP8266やESP32というWi-Fiを内蔵したMCUのみです。Arduino開発環境が使えます。
![picture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/964b6520-12cb-f0b1-626f-499178ed6149.jpeg)
# 開発環境
* Windows 11 Home 22H2
* Arduino IDE 2.2.1
* esp8266-google-home-notifier 1.0.7
* esp8266-google-tts 1.1.0
# 書き込み
今回は[**こちら**](https://www.switch-science.com/products/2500)のESP-WROOM-02開発ボードを使いました。スイッチサイエンスより購入できます。USBシリアル変換ICを搭載しているため、USBケーブルで直接PCと接続できます。ただし、書き込むには動作モード切り替え用スイッチを押しながらリセットする必要があります。電源を入れ直す、あるいはリセットスイッチを押すことでリセットできます。失敗してしまう場合は書き込みが始まるまで動作モード切り替え用スイッチを押し続けておく必要があるようです[^1]。
# OneDrive
まずはMP3ファイルをOneDriveへアップロードし、リンクを知っている全員が閲覧できるように共有します。取得したリンクに移動してみると遷移した先のページから埋め込み用のコードが取得できます[^2]。
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/1c825f13-cc1a-9373-dd67-a5d0f2cde6f2.png)
埋め込み用のコードは以下のような形になると思います。
```
https://onedrive.live.com/embed?resid={id}&authkey={key}
```
これを以下のような形に少し修正し、後述するスケッチへ貼り付けます。
```
https://onedrive.live.com/download?resid={id}&authkey={key}
```
# スケッチ
[**こちら**](https://github.com/horihiro/esp8266-google-home-notifier/blob/master/examples/esp8266/SimpleUsage/SimpleUsage.ino)のサンプルコードを参考にしました。ライブラリの詳しい使い方は[**こちら**](https://qiita.com/horihiro/items/4ab0edf415916a2cd542)です。関数`play`にURLを渡すことでMP3ファイルの再生が可能です。また、デバイス名は半角英数字でGoogleホームのアプリにおける表示名を指定します。接続にはmDNSを利用しているようなのでIPアドレスを指定する必要はありません。
```cpp:google_home_music.ino
#include <ESP8266WiFi.h>
#include <esp8266-google-home-notifier.h>

const char *ssid = "{ssid}"; //put your Wi-Fi SSID
const char *password = "{password}"; //put your Wi-Fi password

const char *name = "{name}"; //put your device name
const char *url = "https://onedrive.live.com/download?resid={id}&authkey={key}"; //put your embed link

GoogleHomeNotifier notifier;


void playMusic() {  
  Serial.println("Finding your device...");
  if (notifier.device(name, "ja") != true) {
    Serial.println(notifier.getLastError());
    return;
  }
  Serial.print("Found your device (");
  Serial.print(notifier.getIPAddress());
  Serial.print(":");
  Serial.print(notifier.getPort());
  Serial.println(")");

  if (notifier.play(url) != true) {
    Serial.println(notifier.getLastError());
    return;
  }
  Serial.println("Done");
}

void setup() {
  Serial.begin(74880); //to avoid text garbling

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Connected to Wi-Fi successfully");
  
  playMusic();
}

void loop() {
}
```
# 動作確認
正しくGoogleホームと接続できたら再生が始まります。曲名などは表示されませんが、巻き戻し、早送り、再生、停止などの操作は可能です。ただし、途中でGoogleホームに喋らせてしまうと再生を再開できなくなる、再生が終わってもコールバック関数などが用意されていないなど、連続再生には厳しそうです。
# おわりに
通常のキャストと同じようなので用途は限られると思いますが、時報やアラームなどに活用できそうです。
[^1]:https://qiita.com/shanonim/items/68fab6dc28b72b31a258
[^2]:https://superuser.com/questions/1548950/html-audio-with-mp3-stored-on-onedrive
商品編集機能の実装について

# はじめに
プログラミング初心者です。現在Ruby on Railsを勉強中。
間違っている箇所がありましたらコメントをしていただけるとありがたいです。

# 商品編集機能の実装
今回はすでに投稿してある商品データの編集機能を実装しました。
とりあえず編集画面へのリンクを記述してと、、、
今回学んだことは、編集画面に飛んだ際にすでにあるデータが表示されているようにする方法です。
[![Image from Gyazo](https://i.gyazo.com/7b31a3c48e16209d5813274a29de527c.png)](https://gyazo.com/7b31a3c48e16209d5813274a29de527c)
まず、form_withの第一引数にモデル@itemというインスタンスを記述します。
そして、その情報をブロック変数|f|の中に保持させ、
[![Image from Gyazo](https://i.gyazo.com/5ccfb7519f53d627ee8659e22f06155c.png)](https://gyazo.com/5ccfb7519f53d627ee8659e22f06155c)
[![Image from Gyazo](https://i.gyazo.com/5c22a1765c83d4d2cd53533405dfce65.png)](https://gyazo.com/5c22a1765c83d4d2cd53533405dfce65)
[![Image from Gyazo](https://i.gyazo.com/037e2d65f664cce95536d687719e68c8.png)](https://gyazo.com/037e2d65f664cce95536d687719e68c8)
このように、記述することで@itemの情報を表示できるようにします。
## 次に
ログインしていない状態でeditのページに直接URLを書き込んでアクセスしようとすると、ログインページに移動するように実装をしました。
[![Image from Gyazo](https://i.gyazo.com/73e4e4eafd9118a85f7c5212330dd72e.png)](https://gyazo.com/73e4e4eafd9118a85f7c5212330dd72e)
[![Image from Gyazo](https://i.gyazo.com/99027db57a0feaeb9ded9254af47c51e.png)](https://gyazo.com/99027db57a0feaeb9ded9254af47c51e)
この時点では@itemが定義されていないことになっており、@itemが空っぽだよというエラーが起きてしまうので、
[![Image from Gyazo](https://i.gyazo.com/9304c8f07ec33842b015f077f8d40cd7.png)](https://gyazo.com/9304c8f07ec33842b015f077f8d40cd7)
[![Image from Gyazo](https://i.gyazo.com/45e2d0c3766cad37ec2adceb9446fe19.png)](https://gyazo.com/45e2d0c3766cad37ec2adceb9446fe19)
before_actionを利用して先に@itemを定義してしまいます。

今回学んだことはここまで。
[Java][JavaSilver] Interface,abstractクラスの2つを使った時の動き

# 記事作成の経緯
JavaSilverの勉強をしていた際に、`Interface`, `Abstractクラス`を使った継承関係の問題につまづいた。。
内容整理&理解のため記事作成

# 読む方の対象
Java Silver学習中の方
Java始めたての方

# そもそもInterfaceとabstractクラスって何
本記事の主題とは少し離れるため詳細には記載しない。
自分は超ざっくり以下のように理解した。

**Interface** = 抽象メソッドのみ提供する
**abstractクラス** = 抽象メソッド**と実装**を提供するクラス

自分は以下のサイトが参考になったため共有として貼っておきます。
- [抽象クラスとインターフェース 概念の違いについて【オブジェクト指向】
](https://4engineer.net/oo/abstract-vs-interface/)
- [KAB-studio 7. ポリモーフィズム！！](http://www.kab-studio.biz/Programing/OOPinJava/07/01.html)(7.ポリモーフィズム!!!〜10. インタフェースという「クラスじゃないもの」
辺りまで)
- [【JAVA】interfaceとabstractの違いって？？？](https://qiita.com/NaokiIwamoto/items/8722354a3a4076c2b39f)

# Interfaceとabstractクラスを使った継承

まずMainクラスの`Interface interfaceClass = new Main();`と`Abstract abstractClass = new Main();`で作成した変数はあくまで**Interface型**と**Abstract型**であるためそれぞれのクラスで定義されたメソッドや変数しか利用できない。

```java:Interface.java
public interface Interface {
    void interfaceMethod();
}
```

```java:Abstract.java
public abstract class Abstract {
    abstract void abstractMethod();
}
```

```java:Child.java
class Child extends Abstract implements Interface {

    @Override
    void abstractMethod() {
        System.out.println("抽象クラスの抽象メソッドの実装");
    }

    @Override
    public void interfaceMethod() {
        System.out.println("インターフェースの抽象メソッドの実装");
    }
}
```

```java:Main.java
public class Main extends Child{ // 実装と継承をしているChildクラスを継承
    public static void main(String[] args) {
        Main main = new Main();

        // Interface, Abstractともにインスタンス化(new)はできない > エラーになる
        Interface interfaceClass = new Interface();
        Abstract abstractClass = new Abstract();


        // 型はInterfaceだが、interfaceMethod()にアクセスするとChild#interfaceMethodが呼ばれる
        Interface interfaceClass = new Main();
        // 型はAbstractだが、abstractMethod()にアクセスするとChild#abstractMethodが呼ばれる。
        Abstract abstractClass = new Main();

        main.abstractMethod();  // "抽象クラスの抽象メソッドの実装"が出力
        main.interfaceMethod(); // "インターフェースの抽象メソッドの実装"が出力

        abstractClass.abstractMethos();   // "抽象クラスの抽象メソッドの実装"が出力
        interfaceClass.interfaceMethod(); // "インターフェースの抽象メソッドの実装"が出力
    }
}
```
## 個人的要所解説
Childクラスは抽象クラスであるAbstractクラスを継承し,インターフェースであるInterfaceを実装している。
(わかりづらいかもしれませんがInterfaceはインターフェース名です。。。)
AbstractクラスもInterfaceもどちらも抽象メソッドを定義しているため、Childクラスはそれらのメソッドを実装しなければならない。

Interface型(**中身はMain型**)は、アクセスできる変数とメソッドはInterfaceのものだけ。
＞例えばChildクラスの変数にアクセスしようとするとコンパイルエラーになる。

Abstract型(**中身はMain型**)もアクセスできる変数とメソッドはAbstractクラスのものだけ。
＞例えばChildクラスの変数にアクセスしようとするとコンパイルエラーになる。

# 終わりに
多分開発プロジェクトの方針によると思うんだけど、実際に今回記載したような構造をまだ見たことがないのでパッとイメージができないんだよなぁ。。
(もちろんそれぞれの特徴はあるけど)わかりづらいからInterfaceだけでよくね？と思ってしまう。
Raspberry Pi に Grafana Agent をインストールする時の話。

Raspberry Pi の監視のために、Grafana Agent をインストールしようとした時に、何かと詰まったため、自分の備忘録も兼ねて記録しておきます。

 **（注意）この話と対策は、環境依存の話かも知れません。** 
 
 # 書き手
 Grafana 初心者　兼　Raspberry Pi 初心者

 # 症状
 Grafana Cloud のサイトにある指示に基づき、Agent をインストールしようとすると、`Failed sha256sum check`と表示され、先に進めない。

 # 環境
 * Rasberry Pi 3B+
 * カーネルバージョン 6.1.21-v8+ (2024-01-30 現在で、Raspberry Pi Imager でインストールするときの`RaspiOS 64bit(Legacy)`です。)
 * Raspberry Pi Imager でインストールした後に、`sudo apt update``sudo apt -y full-upgrade`を実行した状態。
 * Grafana は、Grafana Cloud を使用しています。

 # 対策
基本的には、Grafana で、Home > Connections で Raspberry pi 向けに提供している、シェルコマンドを手動で実行します。

1. Grafana 提供のシェルコマンドを実行する。この時に、Grafana が生成してくれる。URL などの情報を記録しておく。 
（参考）シェルコマンドは、次のようなものです。
```
ARCH="arm64" GCLOUD_HOSTED_METRICS_URL="https://prometheus-xxx.grafana.net/api/prom/push" GCLOUD_HOSTED_METRICS_ID="xxxxx" GCLOUD_SCRAPE_INTERVAL="60s" GCLOUD_HOSTED_LOGS_URL="https://logs-prod-xxx.grafana.net/loki/api/v1/push" GCLOUD_HOSTED_LOGS_ID="xxxxx" GCLOUD_RW_API_KEY="GCLOUD_RW_API_KEY" /bin/sh -c "$(curl -fsSL https://storage.googleapis.com/cloud-onboarding/agent/scripts/grafanacloud-install.sh)"
```
1. `Failed sha256sum check` が出て終了。この時に、`/tmp/`以下に`grafana-agent-xxxx.arm64.deb`というファイルが出来ます。
1. 念のため、`grafana-agent-xxxx.arm64.deb`のハッシュ値を取って、 **自分の目** で確認する。（ハッシュ値は、シェルコマンドに記載されています。）
1. `sudo dpkg -i /tmp/grafana-agent-xxxx.arm64.deb` で手動でインストール。
1. シェルコマンド(`https://storage.googleapis.com/cloud-onboarding/agent/scripts/grafanacloud-install.sh`)に記載されているURL(`https://storage.googleapis.com/cloud-onboarding/agent/config/config.yaml`)から、YAMLの設定ファイルを落として**自分で修正**して、`/etc/`以下にコピーします。
1. `sudo systemctl enable grafana-agent.service`および`sudo systemctl start grafana-agent.service`を実行して開始です。

 # 備考
 grafana-agent のインストールは、下記サイトの記事でインストールした方が良いかも知れません。
 [Install Grafana Agent in static mode on Linux]( https://grafana.com/docs/agent/latest/static/set-up/install/install-agent-linux/)
Vegas Background SlideShow おぼえがき

## はじめに
おしゃれだけど、いまいち思い通りに動かない[Vegas Background SlideShow](https://vegas.jaysalvat.com/)のおぼえがき。
実際にわたしが授業中に質問を受けた部分についての対応を記載します。

随時更新予定。

### 前提
```hoge.html
<div id="slider"></div>
```

```hoge.css
#slider{
    width:100%;
    height:100vh;
}
```

```hoge.js
$('#slider').vegas({
    //vegasの設定
    //ここの書き方は本質でないので、公式ドキュメントや他のサイトとか参考にしてください
})
```

## jsファイルでの設定
### Q.スライドの下のバーを消したい
#### Answer
```hoge.js
$('#slider').vegas({
    //…
   timer:false,
    //…
})
```
timerをfalseに。デフォルトはtrue。
以下公式のtimerオプションに関する説明。
> Display/hide timer bar.
> The timer class is .vegas-timer-progress .

某テキストにはtimerについての記載がなかったので、公式ドキュメントを読みにいかないとわからなかったやつ。

## cssファイルでの設定
### Q.リサイズした時にheightが変わらない
100vhを指定しているのにリサイズ時にheightが変わらない。
widthはちゃんと伸縮する。
#### Answer
ちゃんとVegasの中身まで読みに行ったわけではないが、htmlタグにstyle="height"が追加されて、どうもそれが優先されているので、!important;で対応。

```hoge.css
#slider{
    width:100%;
    height:100vh !important;
}
```

## おわりに
おしゃれなプラグインっていまいち思い通りにならないよね。
Nordic E73@nRF52840 メモ

# 環境構築

https://qiita.com/Kosuke_Matsui/items/5d61ce77e928b9f117cc

https://qiita.com/nanbuwks/items/dd20dc4619af1d994f2c

https://firtel.blogspot.com/2021/01/bluepill-black-magic-probe.html?m=1

https://akerun.hateblo.jp/entry/2021/12/16/JeffProbe

# Black Magic Probeのファームウェアアップデート

■デバッカインストール
https://akerun.hateblo.jp/entry/2021/12/16/JeffProbe#:~:text=samples/basic/blinky-,%E3%83%87%E3%83%90%E3%83%83%E3%82%AC%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB,-%E3%83%87%E3%83%90%E3%83%83%E3%82%AC%E3%81%AB%E3%81%AF

Add Path to evnのチェックを忘れずに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613697/7bd03e68-8963-b503-6a7c-20d6b34dc00d.png)

```bat:接続確認
arm-none-eabi-gdb
rem target extended-remote COM3 # COM番号の桁数によって書き方が違うみたい

(gdb) target extended-remote \\.\COM11
Remote debugging using \\.\COM11

(gdb) monitor version
Black Magic Probe (Firmware v1.6.2) (Hardware Version 0)
Copyright (C) 2015  Black Sphere Technologies Ltd.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
```

■Zadigのインストール
https://black-magic.org/upgrade.html
https://zadig.akeo.ie/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613697/4576f55f-03d4-ed79-4f14-ce5584c6d747.png)

Install Driverをクリックして待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613697/262ad1d9-6855-ee06-2349-f8e324203a86.png)

Reinstall Driverが表示されたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613697/da63d7cf-a917-c87a-cb0d-dff7e12ff956.png)

```bat:接続確認
dfu-util.exe -d 1d50:6018,:6017 -s 0x08002000:leave -D ..\firmware\blackmagic_fw\blackmagic.bin
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Invalid DFU suffix signature
A valid DFU suffix will be required in a future dfu-util release!!!
Cannot open DFU device 1d50:6018
Opening DFU capable USB device...
ID 1d50:6018
Run-time device DFU version 011a
Claiming USB DFU Runtime Interface...
Determining device status: state = appIDLE, status = 0
Device really in Runtime Mode, send DFU detach request...
Device will detach and reattach...
Cannot open DFU device 1d50:6017
Lost device after RESET?
```
エラーになった。。
DFUモードでも同様に、DFU Denoにドライバインストールが必要みたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613697/45a16478-5868-5c88-d01d-b64c24d4e2bc.png)


■正しいコマンドは以下みたい。。。
https://forum.flirc.tv/index.php?/topic/5930-jeff-probe/
dfu-util --device ,1d50:6017 -s 0x00002000:leave -D blackmagic.bin
Laravelを使った開発でのFailed to load resource: the server responded with a status of 404 (Not Found)　の解決方法

## エラーになった背景

Webアプリの開発をしていた際に、HTMLとCSSをいじっていたら上記のエラーと遭遇しました。
cssファイルをうまく読み込めない方に参考にしていただきたいです。




## 解決方法



### cssファイルを移動させる

cssファイルが僕の場合resourcesディレクトリにあったのでそれをpublicディレクトリに移動させました。






### cssファイルの記述を確認する

laravelではcssファイルなどの外部ファイルの読み込みにasset()関数を使うらしいです。

``` layout.blade.php

<link href="{{ asset('css/style.css') }}" rel="stylesheet">

```
cssファイルを読み込むファイルに記述してください。
これで設定は完了です。


### 参考文献

https://www.slingacademy.com/article/laravel-link-to-static-assets-in-blade-templates/#google_vignette

SLING ACADEMY
Laravel:How to link to static assets in Blade templates

https://tekito-style.me/columns/laravel-css-changes

Tekito style
【初心者向け】 LaravelでCSSが反映されない時の4つの対処法 #Laravel勉強ログ

参考にさせていただきました。
ありがとうございます！




### 最後に

僕はこのエラー解決に半日を費やしました。
同じエラーに苦しむ方へ参考にしていただけたら嬉しいです！
技術記事Memo 2024/01/30

定期的にチェックしているニュース記事の中で、今後調査を行っていきたいものを取り上げています。


# 記事
## Lv.1　個人的な注目記事
- [WebAssemblyを進化させる「WASI Preview 2」が安定版に到達。OSや言語に依存しないコンポーネントモデルを実現](https://www.publickey1.jp/blog/24/webassemblywasi_preview_2os.html)
WebAssemblyはWEBページ用のイメージでしたが、システムインターフェイスも利用できるようなレイヤもカバーしつつあるんですね。

- [Amazon ECS と AWS Fargate が Amazon EBS と統合](https://aws.amazon.com/jp/about-aws/whats-new/2024/01/amazon-ecs-fargate-integrate-ebs/)
念願のFargate+EBS構成が組めるようになったようです。ここがネックになってFargate適用できないケースもあったのでまた普及に向けて一歩前進ですね。EKS+Fargateのほうはまだなのかな？

- [AWS Graviton4 プロセッサを搭載した新しい Amazon EC2 R8g インスタンスを発表 (プレビュー)](https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-ec2-r8g-instances-aws-graviton4-processors-preview/)
Graviton系のインスタンスは必ずR系から発表されている気がする・・・
コスパ良好ですし、HyperThreadingと異なりvCPU数=物理コアになっていて、ワークロードの種類によって複数コア利用時のパフォーマンスに影響がある、といったことが少ないのが検証的には良いです。Graviton2くらいまではまだARM対応のソフトウェアも少なかったですが、最近は結構充実してきています。

- [あなたの知らない(かもしれない)文字コードの世界 TypeScript版](https://zenn.dev/aldagram_tech/articles/79d35b2779e326)
これは・・・

- 


## Lv.2
- [ホンダのビークルOS戦略、まずはアコードでソフト手の内化](https://xtech.nikkei.com/atcl/nxt/column/18/00001/08838/)
IVIの開発において、ホンダでは従来はアプリケーションレイヤしか自前で開発していなかったが、アプリケーションのフレームワークを含む、ハードウェア抽象化レイヤ(HAL/Hardware Abstraction Layer)より上の層を自前で開発したとのこと。

- [マツダが車載ソフトを分離調達、ロータリーPHEVにSCSK製ソフト](https://xtech.nikkei.com/atcl/nxt/news/24/00051/)
車載組込系のリアルタイムOSだとVectorやETAS, Bosch(確かIndia法人?)あたりが有名で、日系もちょいちょいリリースするものの採用に至ったケースは少ないように見えた(あくまで外からはという意味。開示されていないだけかもしれない)ので、良いニュースですね。

- [エクイニクス、マルチクラウド接続を容易に実現する「Equinix Fabric Cloud Router」を提供](https://cloud.watch.impress.co.jp/docs/news/1564447.html)

- 


## Lv.3
- [シェルスクリプトをJavaScript/TypeScriptで記述、どのOSでも実行できる「Bun Shell」、JavaScriptランタイムのBunが発表](https://www.publickey1.jp/blog/24/javascripttypescriptosbun_shelljavascriptbun.html)
- [Amazon EC2 Auto Scaling インスタンスメンテナンスポリシーの紹介](https://aws.amazon.com/jp/blogs/news/introducing-instance-maintenance-policy-for-amazon-ec2-auto-scaling/)
- 




# 技術記事以外
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」のため、関係のないものは別のサービスにまとめる。

-
[ThoughtSpot]カスタムソート機能を使ってみた

## はじめに
ThoughtSpot利用歴2年目。
BIツールって楽しいなって思いながら仕事している非エンジニアです。

いつからかThoughtSpotのアーリーアクセス機能に「カスタムソート」がありました。
こちらを有効にすると要素の並び替えをABC順ではなく任意にカスタムできるとのことなので、使ってみたレポです。

カスタムソート機能を使って、昇順降順でしか並び替えられなかったものを任意の順番に並び替えます。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/68316eec-a129-2801-0f8a-94cf88d30c85.png)


## 手順１：機能を有効にする
前述しましたがカスタムソートは記事執筆時点（2024/1）で「**アーリーアクセス機能**」です。なので利用するためにまずは機能を有効にします。
有効にするには**Admin権限が必要**ですので管理者の方が有効にする必要があります。
管理者タブ → アプリ設定内のアーリーアクセス機能 → カスタムソート順
デフォルトではステータスが「無効化」になっているのでこれを「有効化」にします。

<details><summary>どうでもいい独り言</summary>

（このステータスの文字もカタカナだったり英語だったりマチマチですよね、言語設定日本語なんだけどなぁ。害はないけれど細かいところ気になってしまう）
（それこそ1年くらい前はビジネスユーザーの方に「日本語設定しているのに英語出てくるので拒絶反応出る、馴染みにくい」って言われたのでこういう細かいところがまだ日本人ウケしない理由なのかもしれない）
（今はだいぶ改善してほとんど利用していても問題ないレベルです。だけれどこういう細かいところがね）</details>

あとアーリーアクセス機能の設定を変更後、数分間ThoughtSpotが使えなくなるので、利用者の少ない時間や事前通知してから設定変えた方が良いです。

## 手順２：ワークシートでソート順を決める
カスタムソートが有効になると、ワークシートの一番右にカスタムソートの列が出てきます。ここに、並び替えしたい順にカンマで区切っていきます。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/21a488d4-c454-5be0-2136-10ae6389f8eb.png)

そうすると、データ検索画面で設定でのソート順の「カスタム」が有効になります。
一度テーブル表示で下記画像のところからソート順を選ぶと、カスタム設定した順番で並び替えがされます。設定のところから、カスタムの並び順かABC順かを選べるようになります。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/7ddf7b3d-73ae-18c1-062f-3d4c05fb2219.png)
ちなみに、この手順どおり **「一度テーブル表示にしてソート順を選ぶ」という手順を踏まないと、設定のところの英数字順/カスタム順が活性化しないみたいです** （非活性になってて選べない）。
つまり最初から積み上げ棒グラフとかの表示にしてしまうと非活性のままになっているのでカスタム順が選べない。絶対に「一度テーブル表示にしてソート順を選ぶ」ことをしなければならないみたいです。
今はアーリーアクセス機能なので、正式リリースされるときにはそんな面倒な手順踏まないで使えるようになっていると良いですね。

また当記事執筆時点（バージョン9.8.0）で「ピボットテーブル」でのカスタムソートはサポートされていません。
こちらも正式リリース時には使えるようになっていると良いですね。

## ちなみに：権限がない人は……
カスタムソートの設定はワークシートで行うので、アカウント（グループ）の権限をどう付与しているかによりますが、ワークシートを編集できる人しか並び順を変更できません。
ワークシートの編集権限を持っていない！でも並び替えしたい！というビジネスユーザーがいれば、関数でif文書いて項番が付いた項目を作っていくしかないかなと思います。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/284dcf0c-faca-95dc-fadc-6d1db85c6b20.png)
（でも簡単なif文を書けばビジネスユーザーでも並び替えができちゃうなんでとても使い勝手はいいですよね、要素の並び替えなんて割と個人の好みの場合もありますからね。ご自由にご変更できます、ができるのがいいですね。）

## おわりに
みなさんはみかんの白い筋は全部剥く派？そのまま食べる派？
私は全部剥こうとして面倒くさくなって途中で諦めて食べる派です。
log2

https://paiza.jp/works/mondai/double_roop_problems/double_roop_problems__log2

素直にこの通りに解きましたが
これだと、掛け算がオーバーフローしてエラーになる可能性があるそうです。
たしかにそれもそうか。
log２だと天文学的な数値になるとか学生の時に聞いたことがあるし。

```py

N = int(input())
sum = 1
for i in range(1,N+1):
    sum *= i

cnt = 0
while sum > 0:
    if sum % 2 != 0:
        break

    sum //= 2
    cnt += 1

print(cnt)

```

で、再度見てみると。

たとえば４だとすると
1 * 2 * 3 * 4 は　24で、2で割り切れるのは3回。
要素ごとに2で割れるか調べてみると
1 * 2 * 3 * (2 * 2)
こうなります。２が３個あるので、３回割れることになる。
これを応用すれば良さそうです。

```py

N = int(input())
ans = 0
for i in range(1, N + 1):
    now = i
    #今調べてる数を２で割り切れるまで続ける
    while now % 2 == 0:
        now //= 2
        ans += 1

print(ans)

```
[更新] 成功する集客のための 27 以上の方法

どのように潜在顧客を惹きつけてリーチするかは、どのようなビジネスにとっても常に重要な問題です。 特に今日のように競争がますます熾烈になって熾烈を極める時代にはなおさらです。 では、あなたのビジネスは顧客を引き付ける効果的な方法を把握していますか? どうやって集客するのか？ まだの方は、以下の記事にある非常に有益で重要な情報をお見逃しなく。
https://ezsale.vn/cach-thu-hut-khach-hang/
【Flutter】Freezedでデータクラスを生成する

# はじめに

こんにちは！
Flutter開発を始めて2年目となるエンジニアです！

今回から何回かに分けて、Freezedでデータクラスを生成する方法を解説していきます！
データを保持するにあたって便利なパッケージなので、ぜひ読んでみてください！

# こんな人に読んでほしい

* Flutterでの開発を行っている方
* Flutterでの開発を検討している方
* Flutter初学者の方

# この記事でやること

* Freezedとは何かを理解する
* 必要なパッケージをセットアップする

# Freezedとは

とりあえずchatGPTに聞いてみました。

Q, FlutterのFreezedライブラリはなにをしてくれるの？

A, Freezedは、Flutterアプリケーションでイミュータブルで等価性を持つデータモデルを効果的に生成するためのパッケージです。Freezedを使用すると、ボイラープレートコードを削減し、イミュータブルなデータオブジェクトの定義を簡素化できます。

はい、難しい。

要するに、モデルの実装などで、**データを格納するデータクラスの作成と、それに必要な便利なメソッドたちを自動生成してくれるライブラリのこと**です！

これを手書きしたことはありませんが、1から書いていると数百行にわたって書かなくてはいけないみたい。
大変なのはもちろん、可読性も一気に低下しますね。

# 必要なパッケージをセットアップする

### Freezedパッケージのセットアップ

以下のパッケージをyamlに記載します。

#### freezed

https://pub.dev/packages/freezed

#### freezed_annotation

https://pub.dev/packages/freezed_annotation

#### build_runner

https://pub.dev/packages/build_runner

※ここから下はJsonを使用する予定の方のみインストールが必要です。

#### json_annotation

https://pub.dev/packages/json_annotation

#### json_serializable

https://pub.dev/packages/json_serializable

### pubspec.yamlはこうなります

```dart
// 最新のバージョンは公式ドキュメントを参考してください
dependencies:
  freezed_annotation:
  json_annotation: 

dev_dependencies:
  freezed: 
  build_runner: 
  json_serializable: 
```

# 最後に

次回「Freezedとは」「データクラスを生成させる方法」といったところをご紹介します！
記事を保存してお待ちください！
自動運転AIチャレンジ〜python roboticsのLQRでコース１周完走させてみた〜

本記事は自動運転AIチャレンジにおいて、車両の経路追従に線形二次レギュレータ(LRQ)を適用し、コースを１周完走させてみた、の取り組みのまとめとなっております。

# 前回までのまとめ
前回はmainブランチで経路追従にsimple pure pursuitを用いている箇所にLQRを適用させてみてとりあえず動かしてみた、という内容でした。
しかしながら1箇所目のヘアピンカーブはなんとか曲がってくれるも完走には至らずという結果となりました。

https://qiita.com/Massy0127/items/22f11bab0055fca8dcc3

# 目標
コースを一周完走させる

# 具体的にやったこと
1.Vector Map Builderを用いて車速を調整する。
2.yamlでパラメータを調整する。
です。

# Vector Map Builderを用いて車速を調整する
LQRを適用するにあたり直線、緩やかなカーブはなんとか経路追従して走ってくれたのですが、ヘアピンカーブ等になると経路を逸脱し迷走して壁に衝突してしまうという課題がありました。
そこでTire4提供のVector Map Builderを用いて車速を調整（デフォルトから車速を遅くするように）して、経路追従できるようにしました。
車速変更にあたり、[こちらの記事](https://zenn.dev/ttanaka3/articles/3dc507df539985)と[こちらの記事](https://qiita.com/porizou1/items/b7cabbf573bae342f261)を参考にしました。

# yamlのパラメータを変更する
こちらは関係あるのかわかりませんが、前回大会を参考に以下のようにyamlのパラメータを変更してみました。
```mpc_param.yaml
    enable_path_smoothing: true   # flag for path smoothing
```

```behavior_path_planner.param.yaml
    forward_path_length: 50.0
    path_interval: 0.1    
```

# 実行結果
実行結果は以下の動画となります。
まだまだ100%の確率で完走してくれるわけではなく、車速も遅いのでレースで使えるレベルではないのですが、40%くらいの確率でカーブで逸脱しても想定ルートに戻ってきてそのご普通に経路追従してくれ、完走してくれる結果となりました。
そのときの動画となります。

https://www.youtube.com/watch?v=mEZq2m08O-A