OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft .NET 8 へのアップグレード

Microsoft Defender XDR で Windows 11 端末の監視を始めたところ、Microsoft .NET の脆弱性が指摘されたので、これを機に.NET 8 にアップグレードしてみました。

# インストールされている .NET のバージョンの確認
まずは、現在インストールされている .NET のバージョンを確認してみます。
PowerShell で `dotnet --info` コマンドを実行してみると、6.0.23 の NETCore.App とWindowsDesktop.App がインストールされていました。
（これは自分でインストールした記憶が無い。。）

# 最新版の .NET SDK をインストール
最新版の .NET を調べてみると、2024年4月9日にリリースされた 8.0.4 が最新版だと分かります。https://dotnet.microsoft.com/ja-jp/download/dotnet

ちなみに、.NET 6 の最新版は 6.0.29 なので、上記の現在インストールされている 6.0.23 は確かに古くて脆弱性が確認されているバージョンっぽい。また、.NET 6 のサポート終了日は2024年11月12日なので、早めに新しいバージョンにアップグレートしておいた方がよさそう。

改めて、.NET 8 の最新版の msi ファイルをダウンロードしてインストールしてみます。インストールオプションとしては SDKとランタイム（ASP.NET coreランタイム/.NET デスクトップランタイム/.NET Runtime）がありますが、今後 Visual Studio から使うかもしれないので、SDK をインストールしてみました。https://dotnet.microsoft.com/ja-jp/download/dotnet/8.0

# インストール結果の確認
無事インストールされたか、念のため Windows を再起動してから確認してみます。
PowerShell で `dotnet --info` コマンドを実行してみると、確かに 8.0.4 がインストールされていました。ただし、前からあった 6.0.23 の NETcore.App と WindowsDesktop.App もそのまま残っていました。

.NET 6 のものが残っているのは気持ちが悪いので、削除しておきました。Windows 11のスタートメニューから「設定」→「アプリ」→「インストールされているアプリ」と辿り、「Microsoft .NET デスクトップ 6.0.23」をアンインストールします。

改めて dotnet --info を実行すると、8.0.4 だけがインストールされた状態になりました。
<pre>
.NET SDK:
 Version:           8.0.204
 Commit:            c338c7548c
 Workload version:  8.0.200-manifests.9f663350

ランタイム環境:
 OS Name:     Windows
 OS Version:  10.0.22631
 OS Platform: Windows
 RID:         win-x64
 Base Path:   C:\Program Files\dotnet\sdk\8.0.204\

インストール済みの .NET ワークロード:
表示するインストール済みワークロードはありません。

Host:
  Version:      8.0.4
  Architecture: x64
  Commit:       2d7eea2529

.NET SDKs installed:
  8.0.204 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 8.0.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 8.0.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 8.0.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  None

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download
</pre>
【SwiftUI】Color が View だった件

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【SwiftUI】Color とは一体何なのか<br>👉 <a href="https://t.co/douT5I5TTj">https://t.co/douT5I5TTj</a><a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a></p>&mdash; chanzmao (@maochanz) <a href="https://twitter.com/maochanz/status/1787301626614812911?ref_src=twsrc%5Etfw">May 6, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

> Color
> A representation of a color that adapts to a given context.

```
Conforms To
CustomStringConvertible
Equatable
Hashable
Sendable
ShapeStyle // *
Transferable
View // *
```
<a href="https://developer.apple.com/documentation/swiftui/color/" target="_blank" rel="noopener">👉 Color | Apple Developer Documentation&nbsp;<img src="https://b.hatena.ne.jp/entry/image/https://developer.apple.com/documentation/swiftui/color/" alt="hatena-bookmark" /></a>

<b>Color は、 ShapeStyle であり、View でもある !</b>

<a href="https://android.benigumo.com/20240506/color-2/" target="_blank" rel="noopener">👉 【SwiftUI】Color とは一体何なのか&nbsp;<img src="https://b.hatena.ne.jp/entry/image/https://android.benigumo.com/20240506/color-2/" alt="hatena-bookmark" /></a>
【HTML/CSS】inline-blockを使用した要素間に隙間ができたときの対処法

:::note warn
エンジニア初心者の投稿であるため、間違っている箇所が多くあるかと思います。
何かお気づきの点がありましたらご教授いただけると幸いです。
:::

# やりたいこと
下の図のように要素（白のボックス）を横一列で並べたい。
![スクリーンショット 2024-05-06 10.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784901/0362785f-e391-158d-aa7b-b23284e121d8.png)


# 問題
```HTML:HTML
<div>
    <p class="inline"></p>
    <p class="inline"></p>
</div>
```

```CSS:CSS
//文字や背景のスタイルの記載は省いている
//実際には親要素に幅を指定している

.inline {
  display: inline-block;
  margin-left: 60px;
}

.inline:first-child {
  margin-left: 0;
}
```

以上のコードで実行した結果がしたの図である。
横一列で並べたいのになぜか縦に、そして少しずれている。

![スクリーンショット 2024-05-06 10.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784901/b96bed5f-89a9-197d-cc8d-ec3b17e27f3d.png)

# 原因
以下の記事によるとinline-boxを使用した場合に余白ができてしまうことがあるそうだ。この余白はソースコードを書く際に改行をすることが原因で、コンピュータが改行を認識して自動で余白を作成してしまうとのこと（パソコンすごい…）。

https://www.design-memo.com/coding/css-inline-block

# 解決策

inline-boxが含まれている親要素に対して、font-size:0を設定することによって余白を削ってくれる。

```HTML:HTML
<div class="gray__box">
    <p class="inline"></p>
    <p class="inline"></p>
</div>
```

```CSS:CSS
.inline {
  display: inline-block;
  margin-left: 60px;
}

.inline:first-child {
  margin-left: 0;
}

//新しく追加したクラスとプロパティ
.gray__box {
font-size: 0;
}
```

実際にこれで解決した。

# おわりに
コンピュータの自動補完機能には助けられることが多いけど、勝手に変換されると困ることがある。そのときの対処法を知っておくことが大切であり、うまくコンピュータと付き合っていくコツなのかなと考えさせられる問題だった。

# 参考文献

https://www.design-memo.com/coding/css-inline-block
AWSのEBS(ルートボリューム)とインスタンスストアの違い

# 背景

EC2について調べていたら、「ルートボリュームとインスタンスストアの違いってなんだたっけ？」とふと思い調べてそれをメモに残したかった。

## EBSについて
まず最初にEBSについて説明します。
### **概要**
EBSはEC2インスタンスとは分離されたブロックストレージである。

### **特徴**
・EC2を再起動してもデータは消えない。
・複数のEBSを1つのEC2にアッタッチができる。
　→しかし、EBSとEC2は同じAZに属していなくてはならない。
 ・スナップショットをS3に保存することができるため、バックアップが可能
 ・EC2とは分離されているため、ネットワークと通じて通信をしている。

**ルートボリューム**
EC2インスタンスを起動する際にOSに対して割り当てられる領域。

## インスタンスストア
### **概要**
インスタンスストアとはインスタンス専用の一時的なストレージ。
物理的に直接ストレージがホストにアッタッチされている。

### **特徴**
+ EC2インスタンス再起動や停止をするとインスタンスストアに保存されたデータが削除されてしまう。(揮発性)
+ ホストに直接アッタッチされているため、インスタンスストアとの通信は速い。
+ 一部のインスタンスタイプでしかインスタンスストアは使用できない。
  例)「d」がつくインスタンスタイプでないと使用できない等。
  ![スクリーンショット 2024-05-05 121713.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/b0dcaaae-8fa6-05b1-f707-71fbddd11394.png)
+ IOSPもEBSより高い。
  →IOSP(Input/Output Per Second)とは1秒間にインプットやアウトプット処理ができる能力のこと
+ 料金はEC2インスタンスに含まれる。

## 表でまとめた
| タイプ|概要|コスト|
|:-------------------|------------------|------------------|
|EBS(ルートボリューム含む)|EC2インスタンスとは分離されたストレージあり、再起動、停止をしてもデータは保存される|EC2とは別途かかる|
|インスタンスストア|EC2インスタンスに直接アッタッチされているため性能は高いが再起動や停止をするはデータが削除されるので注意が必要。|EC2インスタンスに含まれている|


## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [[公式]Amazon EC2 インスタンスストア](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/InstanceStorage.html)
- [EC2の揮発性ストレージ「インスタンスストア」を使ってみよう！](https://dev.classmethod.jp/articles/howto-ec2-volatile-block-storage-instance-store/)
- [【AWS】インスタンスストアとEBSの違いとは？
](https://qiita.com/empty948/items/42a4f8c56aa3851120f9)
抽象クラス

## はじめに

抽象メソッド/クラスについてまとめる

### 抽象メソッドとは

サブクラスでオーバーライドされることを期待/強制したメソッド。
また、抽象メソッドを含んだクラスのことを抽象クラスという。

#### 参考コード

抽象メソッドを定義するには、`abstract`修飾子を使う
抽象メソッドはサブクラスで必ずオーバーライドされるべきメソッドなので、スーパークラスの側では中身を持つことはできない。

```php:Figure.php
abstract class Figure
{
    protected float $width;
    protected float $height;

    public function __construct(float $width, float $height)
    {
        $this->width = $width;
        $this->height = $height;
    }

    protected abstract function getArea(): float;
}

```
Azure VM自動起動（マネージドID対応版 2024.4）

Azure VM自動起動はマネージドIDの対応が必要となってしまったので、VM自動起動方法再整理(2024.4月時点）

## 手順
1. 事前準備
2. AutomationAccount 作成
3. Azureロールの割当
4. Runbook　Simple-Azure-VM-Start-Stop 作成
6. RunBook　検証・公開（発行）
7. スケジュール追加
8. 確認（AzureMonitor）

## 事前準備
事前に起動対象のVMはご準備ください。
今回は、リソースグループ、VM名は以下としています。
> リソースグループ：doi_ai2024test
vmname：vm-test202404

## Automate アカウント作成
Azure PortalにログインしHOMEからAutomateアカウント作成
対象のリソースグループ、アカウント名と地域を入力し作成。

今回はAutomateAccount名：automate-test202404　とし作成。

![Automateアカウント作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/8aa65819-4166-2a94-cf0f-97d55b7a59b4.png)

## Azureロールの割当
作成した、Automateアカウント作成を選択する。
アカウント設定>IDを選択しAzureロールの割当を押下。
![Azureロール割当.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/4acf35b1-e0aa-5b32-eefa-ddd589a76f3b.png)

割り当てるリソースグループを選択し役割を仮想マシン共同作業者とし保存。
![Azureロール割当２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/657713ec-723b-2856-1293-4573291d7675.png)

## プロセスオートメーションRunBook作成
プロセスオートメーションよりRunBookを選択。
![Runbook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/6edf8a70-7a74-19d4-4ade-e5bb507b9094.png)

ギャラリーから「Simple-Azure-VM-Start-Stop」を選択
![Runbook2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/4c52c7f1-5988-7265-2211-1cd4a9d94274.png)

## RunBookテストと発行
必要なパラメーターを入力しテストを実行。
・VMNAME　空白文字などが入っていると即エラーとなります。
・RESOURCEGROUPNAME　リソース名
・AZURESUBSCRIPTIONID　サブスクリプションID

無事にテスト完了すればテストウィンド画面の右上×で閉じる（保存は無視）

![RunBookテスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/df32be14-9e29-ff3f-01e2-85adecc9e4ee.png)

公開ボタンを押し発行する。
発行には結構時間が掛かります。
![Runbook発行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/75afa157-d1dc-d702-ac0e-f179114f9578.png)

## スケジュール設定
リソースからスケジュールを選択。
スケジュールをRunbookにリンクし設定する。

前回記事を参考ください。
https://qiita.com/hanzii55/items/f11cebd7dd022d561790

## 確認
スケジュール通りに起動するかはAzureMonitorより確認。

![確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251628/7c1b6d57-7b74-24c3-494b-0833480a1885.png)

## 終わりに
Azureも日々進化しており、以前は動いていた物が動かなくなったりと
久しぶりの投稿となってしまいましたが、ハマった事などは成るべく共有し
少しでも皆様のお役にたてたらと思っています。

Let's Azure!!
Pythonで書いたプログラムを実行ファイル（exe）にする【覚書】

Pythonのコードをexe形式に変換する方法はいくつかあります。一般的な方法を以下に示します。

通常の変換:

```
pyinstaller your_script.py
```

これにより、your_script.pyが含まれるディレクトリにdistというフォルダが作成され、その中にyour_script.exeが生成されます。

コンソールを非表示にする場合:

```
pyinstaller --noconsole your_script.py
```
この場合、実行時にコンソールが表示されません。

アイコンを指定する場合:

```
pyinstaller --icon=your_icon.ico your_script.py
```

your_icon.icoは、アイコンファイルのパスに置き換えてください。

コンソールを非表示にしてアイコンを指定する場合:

```
pyinstaller --noconsole --icon=your_icon.ico your_script.py
```
これにより、コンソールが表示されず、指定したアイコンがアプリケーションに関連付けられます。

これらのコマンドは、pyinstallerが正しくインストールされていることを前提としています。また、必要に応じて、他のオプションやフラグを追加することができます。
[TypeScript] 独自の構文拡張をマスターしよう！

### はじめに
TypeScriptでは、JavaScriptとは別に用意された**独自の構文拡張**があります。
- クラス
- Enum
- 名前空間

本記事ではこれらについて解説していきます！

### 【目次】
[まずは基本的な型宣言をマスターしよう！](https://qiita.com/PenPe/items/c189a611b3407b7ceef9)
[オブジェクト型の型宣言をマスターしよう！](https://qiita.com/PenPe/items/440683cc6e5e4ac0ca32)
[関数の型定義をマスターしよう！](https://qiita.com/PenPe/items/bff109c6f83f46d191a7)
[配列をマスターしよう！](https://qiita.com/PenPe/items/7e056eec2cce76a745a9)
[インターフェースをマスターしよう！](https://qiita.com/PenPe/items/f9314aeccb2f23cac382)
[クラスを使いこなそう！](https://qiita.com/PenPe/items/c8e6289f386c4db23a6f)
[型修飾子についての理解を深めよう！](https://qiita.com/PenPe/items/7af57861e93830fe9a79)
[ジェネリックをマスターしよう！](https://qiita.com/PenPe/items/fde6a342e746e265d907)
[独自の構文拡張をマスターしよう！](https://qiita.com/PenPe/items/c79cdb5bc4a68a1dfd7f) ←🈁

---

### パラメータプロパティ
コンストラクターでパラメーターを受け取り、クラスプロパティに割り当てる際、一般的には以下のような記載になります。
```typescript
class Enginner {
    readonly area: string;

    constructor(area: string) {
        this.area = area;
    }
}
```

TypeScriptでは、**「コンストラクターで同じ命名、同じ型に割り当てられるプロパティ」** を宣言する構文が用意されています。
```typescript
class Enginner {
    constructor(readonly area: string) {}
}
```

このようにコンストラクターのパラメータの前に `readonly`, `public`, `private`, `protected` のいずれかを記載すると、同じ命名、同じ型を持つプロパティを宣言することを表すことができます。

このコードは上記サンプルコードと同様の宣言となります。

---

### Enum型（列挙型）
TypeScriptでもEnum型が用意されています。
```typescript
enum StatusCode {
    OK = 200,
    NotFound = 404,
    InternalServerError = 500
}

// 200
StatusCode.OK;
```
---
値を指定しない場合は0から自動的にインクリメントされた値が使用されます。
```typescript
enum Code {
    First,
    Second,
    Third
}

console.log(Code.First); // 0
console.log(Code.Second); // 1
console.log(Code.Third); // 2
```

#### :memo: [応用] const enum
Enum型は多くのランタイムオブジェクトを作成します。
```javascript
// [出力されたJavaScriptファイル]
"use strict";
var Code;
(function (Code) {
    Code[Code["First"] = 0] = "First";
    Code[Code["Second"] = 1] = "Second";
    Code[Code["Third"] = 2] = "Third";
})(Code || (Code = {}));
console.log(Code.First);
console.log(Code.Second);
console.log(Code.Third);
```

`const` 修飾子をつけて`enum`を定義することで、
コンパイルされるJavaScriptコードからオブジェクト定義と、プロパティ参照を省略することができます。

ランタイムでのオブジェクトアクセスが発生しなくなるため、**パフォーマンスが向上**します。

```typescript
const enum Code {
    First,
    Second,
    Third
}

console.log(Code.First);
console.log(Code.Second);
console.log(Code.Third);
```
↓
```javascript
// [出力されたJavaScriptファイル]
"use strict";
console.log(0 /* Code.First */);
console.log(1 /* Code.Second */);
console.log(2 /* Code.Third */);
```

#### :memo: [応用] preserveConstEnums
`tsconfig`では`preserveConstEnums`オプションが用意されています。

このオプションを有効にすると、`const enum`で定義したEnumについても、出力ファイルに含まれます。

##### メリット
- これらの enum をライブラリや他のプロジェクトで再利用することが可能になる
- const enum の実際の値ではなく、名前でデバッグできるため、コードの読みやすさが向上する

---

### まとめ
簡単ですが、以上です！
ポリモーフィズム

## はじめに

ポリモーフィズムについてまとめる

### ポリモーフィズムとは

同名のメソッドで異なる挙動を実現する。
多態性と訳される。


#### 参考コード

```php:Figuer.php
class Figure
{
    protected float $width;
    protected float $height;

    public function __construct(float $width, float $height)
    {
        $this->width = $width;
        $this->height = $height;
    }

    public function getArea(): float
    {
        return 0;
    }
}

```

```php:Triangle.php
require_once 'Figure.php';

class Triangle extends Figure
{
    public function getArea(): float
    {
        return $this->width * $this->height / 2;
    }
}
```

```php:Square.php
require_once 'Figure.php';

class Square extends Figure
{
    public function getArea(): float
    {
        return $this->width * $this->height;
    }
}
```

```php:polymo.php
require_once 'Triangle.php';
require_once 'Square.php';

$tri = new Triangle(5, 10);
$squ = new Square(5, 10);
print "三角形の面積: " . $tri->getArea() . "\n"; // 三角形の面積: 25
print "四角形の面積: " . $squ->getArea() . "\n"; // 四角形の面積: 50
```

`Figure`クラスを継承する２つのサブクラス`Triangle`と`Square`で同名の`getArea`メソッドをオーバーライドし、それぞれ三角形と四角形の面積を求めている。
複数のクラスで同じ名前のメソッドを定義している。

#### ポリモーフィズムのメリット

同じ目的の機能を呼び出すために異なる名前(命令)を覚えなくても良い点。
Next.JS AppRouterのAPIで204を返すには

# TL;DR

`new Response` を返そう

## Details

Next.jsのAppRouterを用いる中で、APIの実装を行う場合があると思います。
その際にリソースの削除を行ったもののページのリダイレクトが必要ない場合、Status Code 204を送りたい場合があるんではないでしょうか。

[204 No Content - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/204)

Next.jsのAppRouterでは `route.ts`を用いてAPIの記述をしますが、Next.jsにおいて `NextResponse`で204を返すとエラーになります。
それは本来Bodyを返さないStatus Codeである`204`や`304`をNextResponseで返してしまうとBodyがあると判断されるためエラーになってしまうというものです

[Invalid API Route Status/Body Response](https://nextjs.org/docs/messages/invalid-api-status-body)

ただこのページの記法はroute.tsの記法に合致していないため、このように記載することでエラーを回避できます。

```typescript:request.ts
export async function DELETE(req: NextRequest) {
    return new Response(null, {
        status: 204,
    });
}
```

以上、備忘録でした
AIBO ERS-210背面スイッチの拡張

ニコニコ超会議2024で展示するとき、多頭に同時指示を出す必要があったので、背面ボタンを拡張しました。

https://youtube.com/shorts/FYcG5u70rhk?si=Bt0MzfIE7FaMb_F0

#### ボタンに配線を取り付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/72e37a04-c901-7eb5-ea5b-633043c8e1c3.png)

#### リレー回路を作成
今回はSpresenseとリードリレーSS1A05D、トランジスタアレイ ULN2803ANを使いました。
Spresenseの拡張基板はリードリレーを駆動する電流を出力できないようだったのでトランジスタアレイも使用しました。
外観
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/707b1a33-0a3b-6575-4555-1bf4382f2275.png)

回路図（2頭目以降のスイッチは省略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/facc5221-406e-0c32-4507-a082ffd9b1e0.png)

#### スケッチ
ボタンを押したらデジタルアウトがパルスを出すという単純な内容です。
長押しするとビルトインのLEDのゲージが増えるようにして目視できるようにしました。
chatGPTにお願いしてリファクタしました。

```
#define PUSH_SHORT 500
#define PUSH_MID1 30000
#define PUSH_MID2 60000
#define PUSH_LONG 100000

#define DELAY_LONG 1000
#define DELAY_SHORT 500

#define PIN_INPUT 2
#define PIN_START_OUTPUT 3
#define PIN_END_OUTPUT 9

#define LED_START 0
#define LED_END 3

uint32_t count_low = 0;

void setupPins() {
  pinMode(PIN_INPUT, INPUT_PULLUP);

  for (int pin = PIN_START_OUTPUT; pin <= PIN_END_OUTPUT; pin++) {
    pinMode(pin, OUTPUT);
  }

  for (int led = LED_START; led <= LED_END; led++) {
    pinMode(led, OUTPUT);
  }
}

void setup() {
  Serial.begin(115200);
  setupPins();
}

void setPins(int state) {
  for (int pin = PIN_START_OUTPUT; pin <= PIN_END_OUTPUT; pin++) {
    digitalWrite(pin, state);
  }
}

void setLEDs(int state) {
  for (int led = LED_START; led <= LED_END; led++) {
    digitalWrite(led, state);
  }
}

void blinkLEDs(int count, int delayTime) {
  for (int i = 0; i < count; i++) {
    setLEDs(HIGH);
    delay(delayTime);
    setLEDs(LOW);
    delay(delayTime);
  }
}

void loop() {
  setLEDs(LOW);
  setPins(LOW);

  while (digitalRead(PIN_INPUT) == LOW) {
    if (count_low <= PUSH_LONG) count_low++;
    if (count_low >= PUSH_MID1) digitalWrite(LED1, HIGH);
    if (count_low >= PUSH_MID2) digitalWrite(LED2, HIGH);
    if (count_low >= PUSH_LONG) digitalWrite(LED3, HIGH);
    else if (count_low >= PUSH_SHORT) digitalWrite(LED0, HIGH);
  }

  if (count_low >= PUSH_LONG) {
    Serial.println("PUSH_LONG");
    setPins(HIGH);
    blinkLEDs(3, DELAY_LONG);
    setPins(LOW);
  } else if (count_low >= PUSH_SHORT) {
    Serial.println("PUSH_SHORT");
    setPins(HIGH);
    delay(DELAY_SHORT);
    setPins(LOW);
  }

  count_low = 0;
}
```

#### 備考
ERS-210の長押しコマンドを送ると、最初にチョイ押しコマンドが実行されてしまったので、R-Codeを調べないといけないです。

#### 参考
- https://developer.sony.com/spresense/development-guides/hw_docs_ja.html#_spresense_%E3%81%A8_arduino_uno_%E3%81%AE%E9%81%95%E3%81%84
- https://vigne-cla.com/7-29/
参考サイトのkotlinのDelegateサンプルコードがエラーになったので直した

こちらの「サンプルコード7」がビルドエラーになったので
エラー解消後のコードを載せておく
interfaceが足りていなかった。
Robotの引数もinterface
https://jp-seemore.com/app/14661/#toc2


```kotlin

class Robot(soundBehavior: SoundBehavior, lightBehavior: LightBehavior) : SoundBehavior by soundBehavior,
    LightBehavior by lightBehavior

interface SoundBehavior {
    fun makeSound()
}

interface LightBehavior {
    fun illuminate()
}

class Sound : SoundBehavior {
    override fun makeSound() {
        println("音を鳴らす!")
    }
}

class Light : LightBehavior {
    override fun illuminate() {
        println("光を放つ!")
    }
}

```

```kotlin
val robot = Robot(Sound(), Light())
robot.makeSound() // SoundBehaviorのmakeSound()を呼び出す
robot.illuminate() // LightBehaviorのilluminate()を呼び出す
```

    
こういう風に引数をinterfaceにしていないと意味内容に思いますよね。
例えば別のLigthがあった場合にそれを引数にとれないのは拡張性がなさそう。

```kotlin
class Robot(soundBehavior: SoundBehavior, lightBehavior: LightBehavior) : SoundBehavior by soundBehavior,
    LightBehavior by lightBehavior
    
class DownLight : LightBehavior {
    override fun illuminate() {
        println("下向きに光を放つ!")
    }
}

val robot = Robot(Sound(), DownLight())
```
Bean定義について

Bean定義とは何か、自分用の備忘録としてまとめる

### Spring FrameworkにおけるBean
Spring FrameworkにおけるBeanの使い方では、使用するBeanの定義をXMLファイルに宣言する必要がある。
以下のような感じで毎回。。。
```
<bean id="Beanの名前" class="パッケージ + クラス名">
```
詳細な設定方法については、ググればたくさん詳しいものが出てくると思うのでここでは割愛。

とにかくインスタンス化したいクラスを作成するたびにXMLファイルを編集する必要があり、面倒くさいんですね。


### Spring BootでBeanの管理をもっと簡単に
そこで、Spring Bootです。
Spring Bootではアノテーション方式で設定が可能なのです。

まず、Beanインスタンス作成するためのメソッドの前に@Beanアノテーションを追加し、Beanインスタンスを返値として指定します。

また、そのメソッドを保持するクラスの前には@Configurationアノテーションをつけてください。
これで設定ファイル(XMLファイル)を使わずにBean設定をするクラスと認識させることができるのです。
```
package パッケージ;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class TestBeanConfig {
 
    @Bean
    public TestBeanClass testBean() {
        return new Beanクラス; // Beanインスタンスを返す
    }
 
}
```
ちなみに、@Component、@Service、@Repository、@Controllerをつけるクラスについては、このアノテーションをつけた時点でBeanとして登録されるため、@Beanを付与する必要はありません。
AWS CDKのスナップショットテストに必要最低限の基礎


## はじめに

本記事は、自分が AWS CDK のスナップショットの学習をした際にメモした内容を、簡素にまとめた内容となります。

## CDK Snapshot Test とは

スナップショットと比較して、合成された CloudFormation テンプレートに差分がないかを確認するテストになります。
また、`jest`など各言語固有のテストコマンドで実行されます。

## ユースケース

- CDK のバージョンアップ時にリソースに変更がでないか
- L1 → L2 へのリファクタリングなど

## スナップショットの書き方

`cdk init sampleapp --language typescript`でプロジェクトを作成した場合、以下のファイルを作成し、`npm test`を実行することでスナップショットテストを実行することができます。
初回はスナップショットがないため、スナップショットが作成されます。2 回目からスナップショットテストが実施できます。

あと、スナップショットテストを実行すると、スナップショットテストを実行しているファイルと同じ階層に、スナップショットを格納する`__snapshots__`ディレクトリが作成されます。
好みの問題ですが、test 直下に`__snapshot__`があると邪魔なので、`test/snapshot`ディレクトリを作成し、その配下にスナップショットテストコードを配置するのがよいのかなと思います。

```typescript:test/snapshot/sampleapp.test.ts
import * as cdk from "aws-cdk-lib";
import { Template } from "aws-cdk-lib/assertions";
import * as CdkTest from "../../lib/sampleapp-stack";

test("Snapshot Test", () => {
  const app = new cdk.App();
  const stack = new CdkTest.CdkTestStack(app, "MyTestStack");
  const template = Template.fromStack(stack);
  expect(template.toJSON()).toMatchSnapshot();
});
```

## スナップショットの更新方法

CDK を変更した場合(意図した差分の場合)、スナップショットを更新する必要があると思います。
その場合は、以下の`-u`オプションを付与することで、スナップショットを更新することができます。

```shell
npm test -- -u
```

更新頻度が高いようであれば、`package.json`を修正し
`test`コマンドを常にスナップショットを更新するようにし、必要に応じてスナップショットテストを実施する運用もありかなと思います。

```json:package.json
  "scripts": {
    "test": "jest -u",
    "test:snap": "jest snapshot"
  },
```

## 参照

- [公式ドキュメント スナップショットテスト](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/testing.html#testing_snapshot)
- [Jest におけるスナップショットテスト](https://jestjs.io/ja/docs/snapshot-testing)
ポメラ DM250 Linux の WiFi 設定

WiFi 設定ではまったのでメモ

[ここでのやりとり](https://www.ekesete.net/log/?p=8940#comment-15771) によると、配布されているイメージは、DM250 か DM200 かの判定処理に問題があるので、以下の様に変更してください、ということだった

```diff
- if [ `cat /proc/meminfo | awk 'NR==1 {print $2}'` -eq 1026076 ]; then
+ if [ -b /dev/mmcblk0p27 ]; then
```

ので、判定自体を無くして、DM250 にハードコードした。

具体的には、

- /etc/init.d/dm200_wireless
- /etc/init.d/firstboot
- /opt/bin/bt_switch

の

```bash
if [ `cat /proc/meminfo | awk 'NR==1 {print $2}'` -eq 1026076 ]; then
   MODEL="DM250"
else
   MODEL="DM200"
fi
```

を

```bash
MODEL="DM250"
```

で置き替え。

あとは、

`/mnt/sd/settings/wpa_supplicant.conf` の `ssid` と `psk` を変更して、リブートしたら動いた。

`psk` は、`wpa_passphrase` の出力ではうまくいかなかったので、平文にした。
LeetCode練習記録

# LeetCode練習
## はじめに
[この本](https://www.bing.com/ck/a?!&&p=906979616455a15eJmltdHM9MTcxNDg2NzIwMCZpZ3VpZD0yMDg1NDI2ZS1lZWJlLTZjZmYtMzc0Yi01MzVhZWY1NDZkN2QmaW5zaWQ9NTIwNA&ptn=3&ver=2&hsh=3&fclid=2085426e-eebe-6cff-374b-535aef546d7d&psq=%e4%b8%96%e7%95%8c%e4%b8%80%e6%b5%81%e3%82%a8%e3%83%b3%e3%82%b8%e3%83%8b%e3%82%a2%e3%81%ae%e6%80%9d%e8%80%83%e6%b3%95&u=a1aHR0cHM6Ly93d3cuYW1hem9uLmNvLmpwLyVFNCVCOCU5NiVFNyU5NSU4QyVFNCVCOCU4MCVFNiVCNSU4MSVFMyU4MiVBOCVFMyU4MyVCMyVFMyU4MiVCOCVFMyU4MyU4QiVFMyU4MiVBMiVFMyU4MSVBRSVFNiU4MCU5RCVFOCU4MCU4MyVFNiVCMyU5NS0lRTclODklOUIlRTUlQjAlQkUtJUU1JTg5JTlCL2RwLzQxNjM5MTc2ODM&ntb=1)を見て、LeetCodeなる存在を知ったので、やってみたので記録していく。
言語はPython。C++はPythonが終わった後にしようかな
気が進めば継続？

| 問題番号 | 言語 ||
|:-:|:-:|:-:|
| 1480. Running Sum of 1d Array  |  [Python](https://qiita.com/jnksktaa/items/3e86534165daf64df308) | C++ |
| 1672. Richest Customer Wealth  |  [Python](https://qiita.com/jnksktaa/items/26eba9a6977762e15021) | C++ |
| 412. Fizz Buzz  | [Python](https://qiita.com/jnksktaa/items/4ed7d0e00c0d366052bd)  | C++ |
| 1342. Number of Steps to Reduce a Number to Zero  | [Python](https://qiita.com/jnksktaa/items/2311bdc30d7e41a4006b)  |C++|
|  876. Middle of the Linked List |  [Python](https://qiita.com/jnksktaa/items/93ff6fc86562933a7725) | C++ |
|  383. Ransom Note |  [Python](https://qiita.com/jnksktaa/items/a4880aca442deec98fa9) | C++ |
514. Freedom Trail の解き方メモ

https://leetcode.com/problems/freedom-trail/description/?envType=daily-question&envId=2024-04-27

いわゆる配るDPの問題ですね。

二次元配列DPがあり、DP[x][y] には「この状態にいたるまでのステップ数」が格納されているとします。

- x : keyを左から見ていって、いまx番目を見ている
- y : ring[y]がいま12時の方向にある

そして、key[x] = ring[z]を満たす z があるとすると、DP[x+1][z]がDP[x][y]の遷移先となります。もちろんzは複数候補があります。

DP[x+1][z] には DP[x][y] + 「yからzへ進むステップ数」 + 「ボタンを押すステップ数」を格納します。

- yからzへ進むステップ数 : 時計回り・反時計回りのうち、ステップ数が少ない方を採用します
- ボタンを押すステップ数 : これは明らかに1ですね

時間計算量はO(N^3)です。ringとkeyの文字列長が100と、比較的制約が小さいので、Rustなどの高速な言語を利用すれば、じゅうぶん制限時間に間に合います。

```rust
impl Solution {
    pub fn find_rotate_steps(ring: String, key: String) -> i32 {
        let mut dp = vec![vec![usize::MAX; ring.len()]; key.len() + 1];
        dp[0][0] = 0;

        for (x, a) in key.chars().enumerate() {
            for (y, b) in ring.chars().enumerate() {
                for (z, c) in ring.chars().enumerate() {
                    if dp[x][y] == usize::MAX {
                        continue;
                    }
                    if a == c {
                        let step = std::cmp::min(y.abs_diff(z), ring.len() - y.abs_diff(z));
                        dp[x + 1][z] = std::cmp::min(dp[x + 1][z], dp[x][y] + step + 1);
                    }
                }
            }
        }

        *dp[key.len()].iter().min().unwrap() as i32
    }
}
```
876. Middle of the Linked List

# 876. Middle of the Linked List

リストノードの理解に時間がかかった。
連結リストは応用情報で学んでいたが、このような形で出るのか
返り値を同じリストノードで返すために工夫がいる点に注意

```Python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        next_jud = head
        length = 1
        answer = head
        while next_jud is not None:
            next_jud = next_jud.next
            length += 1
        if(length % 2 == 0):
            low_ind = length / 2
        else:
            low_ind = (length // 2) + 1
        for i in range(1, int(low_ind)):
            answer = answer.next
        return answer
```
1342. Number of Steps to Reduce a Number to Zero

# 1342. Number of Steps to Reduce a Number to Zero

特に考慮したことはなし

```Python
class Solution:
    def numberOfSteps(self, num: int) -> int:
        divided_num = num
        counter = 0

        while divided_num != 0:
            if(divided_num % 2 == 0):
                divided_num = divided_num / 2
            else:
                divided_num -= 1
            counter += 1
        return counter
```
IEモードの開発者ツール

# こんなときあるよね
IEモードで動くWEBシステムでタグを見たいけど、F12を押しても参照できない

# こうする
Win + R （ファイル名を指定して実行）などで、以下のコマンドでツールを開く
```
%systemroot%\system32\f12\IEChooser.exe
```
Oracle Database管理システム(DBMS)の概要 　まとめ

# Oracle Database管理システム(DBMS)の概要ドキュメントを読む
Oracle 19cについて学びたいと思って以前の記事で初期パラメータについてまとめたが、概要ドキュメントから読むべきだった。個人のメモとして重要だと思った情報をまとめる。
## スキーマ
Oracleのスキーマは論理データ構造またはスキーマ・オブジェクトの集合。
ユーザーによって所有され、ユーザーと同じ名前である。
## 表
リレーショナル表は一般的な表、オブジェクト表はユーザー定義のデータ型。オブジェクト型を使用しようすると発注書などの実社会のエンティティをデータベース内のオブジェクトとしてモデル化できる。
＜オブジェクト型の作り方＞
CREATE TYPE　定義表名
＜オブジェクト表の作り方＞
CREATE TABLE　オブジェクト表明　OF　定義表名

リレーショナル表の種類は、ヒープ構成表(最も単純な表、データが特定の順番で格納されない)、索引構成表(主キーによって整列されておりパフォーマンスに期待できる)、外部表(読み取り専用の表、DBの領域を使わず外部ファイルに書き込まれる)
## 表圧縮
表圧縮により容量の削減、メモリ使用量の削減が可能、場合によっては問合せ速度も速くなる。表領域、表、パーティションまたはサブパーティション・レベルで圧縮を宣言でき、表領域レベルで指定した場合、その表領域に作成されたすべての表はデフォルトで圧縮される。それぞれの特徴は下記の通り。
#### 表圧縮
パルクロード操作で変更されたデータが圧縮される。
ダイレクトパスinsert、alter table、moveにより圧縮が可能。
行優先形式で格納。
#### 行圧縮
すべてのSQLで変更されたデータが圧縮される。
ダイレクトパスinsert、alter table、moveにより圧縮が可能。
行優先形式で格納。
```表レベルの圧縮
ALTER TABLE oe.orders ROW STORE COMPRESS ADVANCED;
```
```パーティション・レベルの圧縮（行圧縮と表圧縮の組み合わせ）
CREATE TABLE sales (
    prod_id     NUMBER     NOT NULL,
    cust_id     NUMBER     NOT NULL, ... )
 PCTFREE 5 NOLOGGING NOCOMPRESS
 PARTITION BY RANGE (time_id)
 ( partition sales_2013 VALUES LESS THAN(TO_DATE(...)) ROW STORE COMPRESS BASIC,
   partition sales_2014 VALUES LESS THAN (MAXVALUE) ROW STORE COMPRESS ADVANCED );
```
#### 列圧縮
行グループの同じ列がまとめて格納されることにより圧縮率が大きい。
すべてのSQLで変更されたデータが圧縮されるが、ダイレクト・パス・ロードではより圧縮率が高い。ただし、表全体がロックされるので同時実行性は低い。ウェアハウス圧縮とアーカイブ圧縮という２つのタイプがあり、アーカイブ圧縮は変更されないデータに対し高圧縮にできるタイプ。
Oracle Exadataでは表問合せのパフォーマンスが最大化できる。それ以外だと圧縮率は同様だが、パフォーマンスは期待できない。まれにアクセスするデータには理想的。
行集合を格納するために圧縮ユニット構造が使用される。
ハイブリッド列圧縮が領域節約につながらない場合、データベースではデータがDBMS_COMPRESSION.COMP_BLOCK形式で格納される。この場合、データベースではハイブリッド列圧縮セグメントにあるブロックにOLTP圧縮が適用される。
LONG型が使用されていないことが、ハイブリッド列圧縮の制約。
デフォルトでは、圧縮ユニットのいずれかの行で更新または削除が発生した場合に、データベースによってそのユニットのすべての行がロックされるが、この問題を回避するために、表で行レベルのロックを有効にすることができる。この場合は、更新または削除操作の影響を受ける行のみがデータベースによってロックされる。

★ハイブリッド列圧縮がおすすめみたい

## 参考
データベースの概念
https://docs.oracle.com/cd/E96517_01/cncpt/tables-and-table-clusters.html#GUID-04AADD81-E5C2-498B-B857-DF2A37DD3520
実践！データ圧縮の効果的な活用テクニック
https://www.oracle.com/jp/a/tech/docs/technical-resources/0315-1100-compression.pdf
→結局このドキュメントがわかりやすい
React Hook Formを勉強してみた②

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的

前回の続きです。
https://qiita.com/mr_noppo/items/ebf4db9aac2dd5d4d1b0

# 使用したものや事前準備
・Macbook Pro
・VSCode

# 主に参考にさせていただいた記事
https://react-hook-form.com/get-started#Quickstart

https://www.youtube.com/watch?v=RkXv4AXXC_4

# エラーの検証ルール一覧
・required
・min
・max
・minLength
・maxLength
・pattern
　正規表現
・validate
　カスタムできる

下記に入力値検証以外のものも掲載されています。

https://react-hook-form.com/docs/useform/register

#### 一例
disabled
入力フォームを入力不可にする
```react
// いい書き方ではないかもしれないが、下記のように入力制御もできる
{ disabled: count === 0 ? true : false }
```

## Controller
外部ライブラリとreact-hook-formの連携のために使用されます。標準のHTMLにはregisterを使うように使い分けをしましょう。
```react
<Controller
    name="myInput"
    control={control}
    defaultValue=""
    render={({ field }) => <TextField {...field} />}
/>
```

https://react-hook-form.com/docs/usecontroller/controller

# 最後に
使いやすい分、クイックスタートの内容で使用イメージできるものはとてもわかりやすかったです。
ただ経験していないものについては実際にやらなくてはわからなかったので、またぶち当たったら参考にしたサイトを辞書のように使えたらと思います。
【HTML/CSS】クラスの命名方法

:::note warn
エンジニア初心者の投稿であるため、間違っている箇所が多くあるかと思います。
何かお気づきの点がありましたらご教授いただけると幸いです。
:::

# クラスの付け方について
1. 共通化するのでクラス名は使用しているクラスがわかるように名前をつける。

１つのクラスで設定するプロパティは少なめ（１，２個）に設定することによって使い回しができるように工夫をすると保守性や効率よくCSSをあてることができる。

```CSS:CSS
//よくない例(クラスにまとめて記述している)
.tag {
color: white;
background: blue;
font-size: 16px;
}

//良い例(それぞれクラスごとの役割が明確)
.tag__font {
color: white;
font-size: 16px;
}

.tag__background {
background: blue;
}
```

２. どこについているクラスなのかがわかるようにする。

クラス名は一目見た時に何についてのプロパティなのかがわかるようにすること。
階層がある場合は__（アンダーバー）を用いることで区切りをつける。
\-はクラス名全体を選択する時にダブルクリックしてもできないので__がおすすめ。

```CSS:CSS
//よくない例(どこで使用されているボタンなのかがわからない)
.button__1 {
background: red;
}

.button__2 {
background: green;
}

//よい例(どこのタグにCSSがあたっているのかが推測できる)
.header__button {
background: red;
}

.main__button {
background: green;
}
```

# 命名法の歴史
命名法に画一されたルールがあるわけではなく、開発先や時代によって変化していることがほとんどらしい…。
命名法の歴史を少しのぞいてみたが奥が深そうである。

https://www.northdetail.co.jp/blog/1953/


# 参考文献

https://www.northdetail.co.jp/blog/1953/
412. Fizz Buzz

# 412. Fizz Buzz

よくあるFizzBuzz問題。
list.append()の書き方を忘れていた。


```python
class Solution:
    def fizzBuzz(self, n: int) -> List[str]:
        answer_list = []
        for i in range(1, n + 1):
            if(i % 3 == 0 and i % 5 == 0):
                answer_list.append("FizzBuzz")
            elif(i % 3 == 0):
                answer_list.append("Fizz")
            elif(i % 5 == 0):
                answer_list.append("Buzz")
            else:
                answer_list.append(str(i))
        return answer_list
```
1672. Richest Customer Wealth

# 1672. Richest Customer Wealth

前の値と比較して、値を入れ替えていく方法を行った。
そこそこ成績は良かったため嬉しい。

```Python
class Solution:
    def maximumWealth(self, accounts: List[List[int]]) -> int:
        compare_wealth = 0
        for i in range(0, len(accounts)):
            compare_wealth2 = sum(accounts[i])
            if(compare_wealth <= compare_wealth2):
                compare_wealth = compare_wealth2
        return compare_wealth
```
LeetCode 1480. Running Sum of 1d Array

# 1480. Running Sum of 1d Array

リストが与えられていて、返り値もリストで返す。
返すリストのi番目の要素は、与えられているリストのi番目以前の要素の和

```python
class Solution:
    def runningSum(self, nums: List[int]) -> List[int]:
        num_list = []
        for i in range(1,len(nums)+1):
            num_list.append(sum(nums[0:i]))
        return num_list
```

他の方の回答を見て、sum使わなくてもできることに気付いた。
```python
num_list[i] = num_list[i-1]
```
という感じにできるよなぁと
イシューからはじめよ - 知的生産の「シンプルな本質」　を読んで

# イシューからはじめよ - 知的生産の「シンプルな本質」を読んだ感想

『[イシューからはじめよ――知的生産の「シンプルな本質」](https://www.amazon.co.jp/%E3%82%A4%E3%82%B7%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%88-%E2%80%95-%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E3%81%AE%E3%80%8C%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E6%9C%AC%E8%B3%AA%E3%80%8D-%E5%AE%89%E5%AE%85%E5%92%8C%E4%BA%BA-ebook/dp/B00MTL340G)』という本を読んで、ビジネスで直面する「本当に大切な問題」を見極める方法を学ぶことができました。職場でよくある「山ほどのタスクがあるけど、本当にこれ全部やる意味あるの？」って状況、ありますよね。 この本は、そんな疑問に答えてくれる一冊です。

## イシューって何？

「イシュー」とは、解決すべき核心的な問題のこと。全ての問題に同じエネルギーを注ぎ込むのではなく、本当に価値のある問題に集中することが大事だとこの本では強調しています。山ほどイシューは転がっているわけではなくて、問題だなと思っているものが１００個あったらそのうち２〜３個とからしいです。なので見極めが大事って話ですね。

- **イシューの重要性を見極める**: どの問題が本当に解決すべきか、その重要性や緊急性を理解することがキーポイントです。
- **質を量で圧倒しない**: 単に多くのタスクをこなすのではなく、より質の高い成果を目指すべきです。ここのあたりは特に耳が痛いところでした。。。

## 仮説を立てる

問題に対する最初の解答として「仮説」を立てるわけですが、これがまた面白い。仮説を立ててみて、それがどれだけ実際のところにマッチするかを試してみるわけです。

- **早めに仮説を設定**: どんな小さなプロジェクトでも、早い段階で仮説を立ててみることが推奨されています。これにより、目的が明確になり、どの方向に進むべきかが見えてきます。

## 1次情報から情報を得るべき

直接現場から得られる情報、それが1次情報です。この本では、第二次情報よりも生のデータを重視するべきだと説いています。なぜなら、加工された情報はどうしてもバイアスがかかってしまうからです。

- **現場の声を直接聞く**: たとえば、本当の現場の声を聞くことで、問題の本質をより深く理解することができます。

## 問題を小さく分けて考える

大きな問題も、小さな部分に分解して考えることで、解決へのアプローチが見えてきます。この「分解」が、問題解決の効率を大きく上げます。

- **分解して考える**: `where`（どこで）、`what`（何を）、`how`（どうやって）といった観点で問題を分解することで、具体的なアクションプランが立てやすくなります。

## イシューをフェアに検証する

問題を検証する際には、自分のバイアスを排除して、フェアな視点で評価することが求められます。自分の仮説に対して批判的であることが、より良い解決策を導くための鍵です。

- **バイアスなく検証**: 自分の意見や仮説に固執することなく、公平な視点から問題を評価することが、的確な判断を下すために不可欠です。

## 実際にどう役立つの？

この本から学んだ方法を使えば、日々の業務だけでなく、プライベートな問題解決にも応用可能です。たとえば、家庭での小さなトラブルから、大きなビジネスプロジェクトまで、どんな問題も効率よく、かつ効果的に解決する道筋が見えてきます。

## 最後に

『イシューからはじめよ』を読むことで、問題解決のスキルが格段にアップすること間違いなしです。ただ、読むだけではあまり身につかない気もする？ので、少しずつ業務に取り入れていきたいと思います。
Raspbian OS WheezyからRaspberry Pi OS bookwormへの乗り換え

## はじめに
Raspberry PiからWindows10にファイルを移動する際にUSBメモリ経由だと不便なので、Sambaをインストールしようと試行錯誤していました。
しかし以下の図の通り、Raspbian Wheezyは古すぎるためか、パッケージのリポジトリがことごとく404エラーとなってしまっています。
![DSC01156.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/070cff46-8821-d836-d8ad-73596b805424.jpeg)
調べてみると、wheezyというraspbianのバージョンは2013年にリリースされていますが、すでにサポートが終了しているようですね。

## Wheezyリポジトリはどこへ？
どうもWheezyのリポジトリはlegacyサーバに移動している模様（以下のリンク参照）。

https://forums.raspberrypi.com/viewtopic.php?t=294581

このサイトにも記載されているようにWheezyはすでにサポート終了しており、メンテナンスもされていません。そのため、もしWheezyを使用する場合はセキュリティなどお気を付けください。

## apt-get updateできるようにする
/etc/apt/sources.listを以下のように変更します。
`$ sudo nano /etc/apt/sources.list`
**[変更前]**
```
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
deb-src http://archive.raspbian.org/raspbian/ wheezy main contrib non-free rpi
```
**[変更後]**
```
deb http://legacy.raspbian.org/raspbian/ wheezy main contrib non-free rpi
 # Uncomment line below then 'apt-get update' to enable 'apt-get source'
deb-src http://legacy.raspbian.org/raspbian/ wheezy main contrib non-free rpi
```
また、/etc/apt/sources.list.d/collabora.list内のdebから始まる行を以下のようにコメントアウトします。
**[変更前]**
```
deb http://raspberrypi.collabora.com wheezy rpi
```
**[変更後]**
```
#deb http://raspberrypi.collabora.com wheezy rpi
```
この変更を実施するとapt-get updateできるようになりました。

## Sambaを試してみる
Windowsとのファイルのやり取りを手軽に行うため、Sambaを設定します。
以下のコマンドでSambaをインストールします。
```
$ sudo apt-get install samba
$ sudo apt-get install samba-common-bin
```
/etc/samba/smb.confを編集します（ファイルの末尾に以下を追記）。
```
[share]
   path = /home/pi/share
   read only = no
   browseable = yes
   writeable = yes
   valid users = pi
```
以下のコマンドでSamba用のユーザを追加します。
```
$ sudo smbpasswd -a pi
```
smbdを再起動します。
```
$ sudo service samba restart
```
WindowsからRaspberry Piへアクセスしてみます。
エクスプローラの小窓に以下のように入力してEnterキーを押下します。
```
\\192.168.0.13
```
うーん、アクセスできないみたいです。
![notaccess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/3270f1cf-4c40-ee0a-2bf5-c4d7267b4c7a.png)
Wheezyでは安全ではないSMB1を使っているという話もあるし、WheezyでSambaを使うのは危険かもしれませんね。

## Raspberry Pi OS bookwormへ乗り換え
Raspberry Pi OS用のイメージを作成するためには、以下のサイトからRaspberry Pi Imagerをダウンロードします。

https://www.raspberrypi.com/software/

![rapsberrypios_imager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/257f6602-6c10-b0d0-b369-01810c67e9dc.png)
Windows用のImagerをダウンロードしたいので上記の赤枠をクリックします。

Raspberry Pi Imagerをダウンロードして、起動すると **デバイス**、**OS**、**ストレージ** を選択する画面が表示されます。初代Raspberry Piにも対応したイメージも作成できるんですね。今回はデバイスは初代Raspberry Pi用の **Raspberry Pi 1**、OSは **Raspberry Pi OS (32-bit)**、ストレージは任意のSDHCカードを選択して[次へ]ボタンを押下します（詳細は末尾に記載の参考文献を参照）。
作成できたイメージが書き込まれたSDカードをRaspberry Piに挿入して起動します。初回起動時はかなり時間がかかりますが、Raspberry Pi OSとして無事起動できました。
![rasp_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/868c184e-d16d-9259-8ed2-d3d591c08898.png)

上記と同じ手順でSambaでのアクセスもうまくいったので、やはり古いバージョンは使わないほうがよさそうですね。

## 参考文献
https://qiita.com/mmake/items/576a2f60dffcd9291da3
「中年男性がメインフレームから クラウドへキャリアシフトしてみた」というタイトルで登壇しました #jawsug_bgnr #jawsug



[JAWS-UG初心者支部 #60](https://jawsug-bgnr.connpass.com/event/316727/)で[「中年男性がメインフレームから クラウドへキャリアシフトしてみた」](https://speakerdeck.com/uechishingo/zhong-nian-nan-xing-gameinhuremukara-kuraudohekiyariasihutositemita)というタイトルで登壇しました。

今回のイベントは`若手・初心者向け LT 大会`ということで、以下の内容の LT を募集していました。
私は 3 つとも合致しており、「これは登壇せねば！」と感じ応募しました。
>AWS使って３年目までの方
>会社に入って（新卒・中途）３年目までの方
>新しい技術を使い初めて３年目までの方


## 登壇資料
[![thumbnail](https://files.speakerdeck.com/presentations/0ed0f2e7ba9c400581a099f3bce8a30e/slide_0.jpg)](https://speakerdeck.com/uechishingo/zhong-nian-nan-xing-gameinhuremukara-kuraudohekiyariasihutositemita)


## 補足資料
登壇では「メインフレームとオープン系との違い」を詳しく説明できなかったため、補足資料を追加します。

- [メインフレームとは | IBM](https://www.ibm.com/jp-ja/topics/mainframe)
- [富士通の撤退する「メインフレーム」ってそもそも何？](https://zenn.dev/koduki/articles/bc0e5acb3d6656)


## 運営としても参加
当イベントでは運営として、オープニングとクロージングを担当しました。スライドを読むだけになってしまうなど、まだまだ次回への課題を感じました。
ストリームデックを使ったOBSの配信について

# はじめに
2024.05.01現在。
本投稿は、とある推しのYoutuberさんがライブ配信中に、OBSのシーン切り替えを「え～と。ちょっとまってくださいよと」私も昔やったな～現象を見るに見かねてストリームデックを購入し設定すれば簡単なのにと思い、以前[Zenn](https://zenn.dev/ "zenn")にて投稿した記事を元に再構成した記事になります。

# OBSのシーンについて
Yoububeなどの配信で良く聞くOBS(Open Broadcaster Software)は、基本無料の配信ソフトとして非常に多くの機能を備えています（コレ一択と言っても過言ではありません）。
その機能の一つとして、”シーン”の切り替えがあります。
![](https://storage.googleapis.com/zenn-user-upload/f32e65c360c9-20230418.png)

シーンの作成方法に関しては、ここでは省略しますが、作成したシーンを自分の使いたいシーンに合わせてクリックすると即反映されます。

例えば、待機シーンを作って動画をループ再生し、頃合いをみて通常配信シーンへ切り替えるなんて事をよくすると思います。
![](https://storage.googleapis.com/zenn-user-upload/51bc7c182934-20230418.png)
![](https://storage.googleapis.com/zenn-user-upload/6dd6baef1931-20230418.png)

配信中にシーンを切り替えるのですが、コレ正直慣れていないと大変な作業になります。慣れててもたまに事故ります。

## Stream DeckでOBSのシーンを切り替える設定

ここで、必要になると言うか便利なのが、Elgato社のStream Deckと言う製品になります。
私は、Elgato Stream Deck【15キー配列】を使っています。

それでは、Stream DeckのボタンにOBSのシーンを設定してみましょう。
右側のテーブルリストよりOBS Studioのシーンを選択し、使いたいボタンの設定場所へドラッグアンドドロップします。
![](https://storage.googleapis.com/zenn-user-upload/ef9ca457dfcb-20230418.png)

上記の設定場所とは違いますが、下のプルダウンリストのOBSシーンを選択することにより
対象のシーンを速やかに、Stream Deckのボタンで切り替える事ができます。
![](https://storage.googleapis.com/zenn-user-upload/a50efe3cac48-20230418.png)

## さいごに
[操作デモ](https://youtu.be/QQb-cwp9FPw?si=pD_cLt1PC418LEJk "MyYoutube")

それでは、また。
Please enjoy your good streaming life.

## 参考資料
参考にしたYoutube配信
[さっさん](https://www.youtube.com/@sassan_9/videos "さっさん")
https://youtu.be/L-Lo1FhivIg
[瀬戸さん](https://www.youtube.com/@Kojiseto/videos "瀬戸さん")
ぷ〜ん！
各チューバーさん
Lorentz96をJuliaでとく　その３

# 前回まで
https://qiita.com/ishigaki/items/1168b5c5adb099535d1c

グローバル変数は使わないようにしたコードは作りましたが，今回はできるだけ早くします。

# コード
高速化の方針

- メモリアロケーションができるだけ起きないようにする。
    - そのために，一時変数も最初に作ったものを使い回す。
- パラメータはParametersパッケージでやりとりする。

```julia
using Parameters

@with_kw struct Param{T1,T2}
    dt::T1 = 0.01
    tend::T1 = 146.0
    nstep::T2 = Int(tend/dt)
    
    F::T2 = 8
    N::T2 = 40
end

function Lorentz96(para, x, f)
    @unpack N, F = para
    #f = zeros(N)
    
    for i=3:N-1
        f[i] = (x[i+1]-x[i-2])x[i-1] - x[i] + F
    end
    
    # 周期境界
    f[1] = (x[2]-x[N-1])x[N] - x[1] + F
    f[2] = (x[3]-x[N])x[1] - x[2] + F
    f[N] = (x[1]-x[N-2])x[N-1] - x[N] + F

end

function RK4(para, dt, x, k1, k2, k3, k4, f)
    
    #k1, k2, k3, k4 = zeros(N), zeros(N), zeros(N), zeros(N)

    Lorentz96(para, x, f)
    k1 .= f
    Lorentz96(para, x .+ k1 .* dt .* 0.5, f)
    k2 .= f
    Lorentz96(para, x .+ k2 .* dt .* 0.5, f)
    k3 .= f
    Lorentz96(para, x .+ k3 .* dt, f)
    k4 .= f
    return x .+ dt .*(k1 .+ 2 .* k2 .+ 2 .* k3 .+ k4)./6.
    
end

function main(para)
    @unpack dt, nstep, N, F = para

    X = zeros(N, nstep)
    t = zeros(nstep)
    k1, k2, k3, k4 = zeros(N), zeros(N), zeros(N), zeros(N)
    f = zeros(N)
    
    # initialize
    for i=1:N
        X[i, 1] = F
    end
    X[20, 1] = 1.001*F

    for i=2:nstep
        X[:,i] .=  RK4(para, dt, view(X,:,i-1), k1, k2, k3, k4, f)
        t[i] = dt*(i-1)
    end

    return X, t
end
```

実行
```julia
para = Param()

@time   X, t = main(para)
```

ベンチマーク結果

```julia
using BenchmarkTools
para = Param()
@benchmark main(para)
```

平均7.7msで，適当に書いたFortranより早くなりました。

```
BenchmarkTools.Trial: 645 samples with 1 evaluation.
 Range (min … max):  7.013 ms …   9.304 ms  ┊ GC (min … max): 0.00% … 17.44%
 Time  (median):     7.384 ms               ┊ GC (median):    0.00%
 Time  (mean ± σ):   7.755 ms ± 629.416 μs  ┊ GC (mean ± σ):  4.99% ±  5.20%

    ▁▄▆█▂▄                                                     
  ▃▇██████▆█▆▄▄▃▂▂▂▃▁▁▁▂▃▃▄▄▆▄▃▂▁▁▂▃▃▄▄▆█▇▇▆▆▄▄▅▄▃▃▄▂▃▄▃▄▄▃▂▂ ▄
  7.01 ms         Histogram: frequency by time        9.03 ms <

 Memory estimate: 26.85 MiB, allocs estimate: 58406.
 ```
5分で読むReact豆知識 | 入門 | 第5回: stateの保持と破棄

# はじめに
このシリーズは、Reactの公式ページなどから特に重要と感じたトピックを選び出し、何度でも読み返せるよう簡潔にまとめたものです。:orange_book:

**[シリーズ一覧はこちら](https://qiita.com/mr_noppo/items/9f2841fd0bc574a4685c)**

# stateの保持と破棄
Reactは**各コンポーネントごとにStateが保持され、レンダーツリーに沿ってstateを管理**します。
コンポーネントが破棄されるとstateも破棄されます。
ただし、**レンダリング時に同様なコンポーネントがあると判定された場合、stateは保持**されることがあります。
# stateが保持されるパターン

#### 1.別々に記述していても保持されるパターン
**同様なコンポーネントとみなされstateは保持**されます。

```react
{isFancy ? (
    <Counter isFancy={true} /> 
) : (
    <Counter isFancy={false} /> 
)}
```

#### 2.構造が同じであるため保持されるパターン
リターン位置が違う場合も、**構造が同じであればstateは保持**されます。
```react
if (isFancy) {
    return (
      <div>
        <Counter isFancy={true} />
      </div>
    );
} else {
  return (
    <div>
      <Counter isFancy={false} />
    </div>
  );
}
```

# stateが破棄されるパターン
#### 1.条件付きレンダリングの記述をわける
条件付きレンダリングを別々に記述すると、**レンダリング処理が個別に行われ破棄**されます。
```react
 <div>
      {isPlayerA &&
        <Counter person="Taylor" />
      }
      {!isPlayerA &&
        <Counter person="Sarah" />
      }
</div>
```

#### 2.構造を変える
**構造が違うとstateは破棄**されます。
```react
{isFancy ? (
 <div>
    <Counter isFancy={true} /> 
 </div>
) : (
    <Counter isFancy={false} /> 
)}
```

#### ３.keyを使って各コンポーネントに明示的な識別子を付与する
同様な構成でもコンポーネントの**keyが違うとstateを破棄**します。

```react
  return (
    <div>
      {isPlayerA ? (
        <Counter key="Taylor" person="Taylor" />
      ) : (
        <Counter key="Sarah" person="Sarah" />
      )}
```

## 参考サイト
より詳しく学びたい方はこちら

https://ja.react.dev/learn/preserving-and-resetting-state
5分で読むReact豆知識 | 入門 | 第4回: イベントハンドラ命名規則

# はじめに
このシリーズは、Reactの公式ページなどから特に重要と感じたトピックを選び出し、何度でも読み返せるよう簡潔にまとめたものです。:orange_book:

**進捗管理には「いいね」か「ブックマーク」がお勧め**
さらに僕のモチベーションアップになります！:thumbsup:よろしくお願いいたします！:thumbsup:

**[シリーズ一覧はこちら](https://qiita.com/mr_noppo/items/9f2841fd0bc574a4685c)**


# イベントハンドラ命名規則

### １\. イベントハンドラ関数の名称

**「handle+イベントの名称」**
で命名するのが一般的です。
どのイベントに対応するかを明確にします。

・クリックした時：handleClick
・マウスポインタが入ってきた時：handleMouseEnter

### ２\. Propsとしてイベントハンドラを渡す際の名称
**「on+自由記載」**
を使用します。
どのようなイベントハンドラを渡されるか直感的にわかるようにします。

・再生するボタン：onPlay

### 実装例

```jsx
// onPlayをpropsとして受け取る
function Button({ onPlay, children}) {
    return (
        <button onClick={onPlay}>
            {children}
        </button>
    );
}

function PlayButton() {
  // handlePlayClickで処理内容を記載
  function handlePlayClick() {
    alert(`play`);
  }

  return (
    <Button onPlay={handlePlayClick}>
      Play Movie
    </Button>
  );
}

export default function Toolbar() {
  return (
    <PlayButton/>
  );
}
```

## 参考サイト
より詳しく学びたい方はこちら
### イベントハンドラについて
https://ja.react.dev/learn/responding-to-events
5分で読むReact豆知識 | 入門 | 第3回: 再レンダリングのタイミング

# はじめに
このシリーズは、Reactの公式ページなどから特に重要と感じたトピックを選び出し、何度でも読み返せるよう簡潔にまとめたものです。:orange_book:

**進捗管理には「いいね」か「ブックマーク」がお勧め**
さらに僕のモチベーションアップになります！:thumbsup:よろしくお願いいたします！:thumbsup:

**[シリーズ一覧はこちら](https://qiita.com/mr_noppo/items/9f2841fd0bc574a4685c)**

# 再レンダリングのタイミング

**再レンダリングが起こる主なタイミング**は下記の通りです。

### 1. **stateの変更**
**stateをset関数で更新する**と再レンダリングされます。

```react
import React, { useState } from 'react'

export function Counter() {
  const [count, setCount] = useState(0)

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}
```

### 2. **親コンポーネントの再レンダリング**
親コンポーネントが再レンダリングされると、子コンポーネントも再レンダリングされます。

```react
import React, { useState } from 'react'

export function ParentComponent() {
  const [input, setInput] = useState('')

  return (
    <div>
      <input type="text" value={input} onChange={e => setInput(e.target.value)} />
      <ChildComponent />
    </div>
  );
}

function ChildComponent() {
  console.log('レンダリング');
  return <p>ChildComponent</p>;
}
```

レンダリングコストが高い、親コンポーネントの再レンダリングが頻繁な場合は、**下記を使用し再レンダリングを抑制することが可能**です。

`React.memo`
propsの参照値が変更されない限り、再レンダリングを抑制できます。
**オブジェクト等、例外もあります**

`useCallback`
propsとして渡される関数に用いることで、依存する変数が変更されない限り、再レンダリングを抑制できます。

### 3. **Contextの値が変更された時** 
 対象のContextを利用しているすべてのコンポーネントが再レンダリングされます。


## 参考サイト

### こちらの記事で学ばさせていただきました。
https://qiita.com/obake_fe/items/252b48b61df435e68fc2
### stateの更新による再レンダリング
https://ja.react.dev/learn/render-and-commit
### Contextの更新による再レンダリング
https://ja.react.dev/reference/react/useContext#updating-data-passed-via-context
### 親コンポーネントの再レンダリングによる子コンポーネントの再レンダリング
https://ja.react.dev/reference/react/useMemo#skipping-re-rendering-of-components
5分で読むReact豆知識 | 入門 | 第2回: state更新の落とし穴

# はじめに
このシリーズは、Reactの公式ページなどから特に重要と感じたトピックを選び出し、何度でも読み返せるよう簡潔にまとめたものです。:orange_book:

**進捗管理には「いいね」か「ブックマーク」がお勧め**
さらに僕のモチベーションアップになります！:thumbsup:よろしくお願いいたします！:thumbsup:

**[シリーズ一覧はこちら](https://qiita.com/mr_noppo/items/9f2841fd0bc574a4685c)**

# stateがちゃんと更新されない？
以下の例では、onClickのイベントハンドラ内でset関数を３回使用しています。
画面には「3」が表示されるように思えますが、実際はどうでしょうか？
```react
import { useState } from 'react';

export default function Counter() {
  const [number, setNumber] = useState(0);

  return (
    <>
      <h1>{number}</h1>
      <button onClick={() => {
        setNumber(number + 1); // 現在のnumberに1を加える
        setNumber(number + 1); // 再び1を加える
        setNumber(number + 1); // 更に1を加える
      }}>+3</button>
    </>
  )
}
```
実際には、**numberの値は0から1にのみ更新**されます。
画面には「1」と表示されるため、期待とは異なる結果になります。

ここで学べることは二つあります
### １\.stateはレンダリング時に値が確定します。
　イベントハンドラ内の処理中に値が変化することはありません。（numberの値は常に0だったということです）
### ２\.イベントハンドラ内ではstateの更新はまとめて行われます。
これを**バッチ処理**と言います。set関数実行後、即レンダリングされません。イベントハンドラ内の処理が終了した後、最新の結果でレンダリングします。

# それでも連続して更新したい！
stateはレンダリング時に値が確定することを説明しました。
**本来の値はReactが管理**しています。Reactが管理している値を使用すれは先ほど実現したかった処理が可能になります。
値を3回連続で更新したい場合は、**更新用関数**を使用します。

**更新用関数**
```react
n => n + 1
```

**set関数内で使用する**と、現在の値をReactから受け取ることが可能になります。

```react
<>
  <h1>{number}</h1>
  <button onClick={() => {
    setNumber(n => n + 1); //1
    setNumber(n => n + 1); //2
    setNumber(n => n + 1); //3
  }}>+3</button>
</>
```

## 参考サイト
より詳しく学びたい方はこちら
### １\.stateはレンダリング時にReactから値が渡されて確定します。
https://ja.react.dev/learn/state-as-a-snapshot

### ２\.イベントハンドリング内ではstateの更新はまとめて行われます。
https://ja.react.dev/learn/queueing-a-series-of-state-updates
5分で読むReact豆知識 | 入門 | 第1回: コンポーネントとstate

# はじめに
Reactの公式ページなどから特に重要と感じたトピックを選び出し、何度でも読み返せるよう簡潔にまとめました！:orange_book:

**進捗管理には「いいね」か「ブックマーク」がお勧め**
さらに僕のモチベーションアップになります！:thumbsup:よろしくお願いいたします！:thumbsup:

**[シリーズ一覧はこちら](https://qiita.com/mr_noppo/items/9f2841fd0bc574a4685c)**


# コンポーネントとは
ロジックを持ちJSXマークアップをリターンする**再利用可能なコードの塊**です。
## コンポーネント宣言

**宣言方法**

```react
// ①関数宣言
function Component() {} 
// ②アロー関数（関数式）
const Component = () => {}
```

**宣言時の注意点**

**コンポーネント宣言は頭文字が大文字**です！注意しましょう！
```react
// 頭大文字
function Component() {
// タグとして扱える。useState等のhooksが使える。
}
// 頭小文字
function javascript() {
// 関数や値として活用できる。（use~のカスタムフックも頭小文字）
}
```

**exportも忘れずに**

exportしないと、外部ファイルから再利用(import)できません。
```react
export function Component() {
}
```

# stateとは
レンダリングした時に、**動的に値を変化させるために管理している値**です。
useStateで一緒に生成される**set関数がレンダリングのトリガー**になります。
**stateはレンダリング時に値を保持**します。
state以外のletのような**変数はレンダリング時に初期化される**ので注意しましょう！

:sunny:レンダリングとは...仮想DOMを再構築し再描画すること

## useStateの使用方法
stateとset関数を渡すhookです。
```react
const [count,setCount] = useState(0);
```
### state
オブジェクト、配列、値など格納できます。
### set関数
stateを更新します。レンダリングのトリガーになるので覚えておきましょう。

## 参考サイト
より詳しく学びたい方はこちら
### コンポーネントについて
https://ja.react.dev/learn/your-first-component

### stateについて
https://ja.react.dev/learn/state-a-components-memory