OmniAICreator/Qiita-1.07M huggingface dataset:
Flutterについて書いてみた

スマホアプリの開発に興味を持ち、勉強中のFlutterについて書いてみました。

特徴
シングルコードベースでのクロスプラットフォーム開発
Flutterを使用すると、1つのコードベースで複数のプラットフォーム向けのアプリを開発できます。これにより、開発時間とコストを大幅に削減できます。

高性能
Flutterは、独自の描画エンジンであるSkiaを使用しており、プラットフォーム固有のウィジェットを使用せずに一貫したパフォーマンスを提供します。

豊富なウィジェット
Flutterには、マテリアルデザインやカーパーノデザインに基づいた豊富な組み込みウィジェットがあり、カスタマイズも容易です。

Hot Reload機能
Hot Reloadにより、コードの変更が即座にアプリに反映されます。これにより、開発とデバッグの効率が大幅に向上します。

Dart言語
Flutterは、シンプルで学習しやすいオブジェクト指向言語であるDartを使用します。Dartは、静的型付け言語でありながら、柔軟な記述が可能です。

ウィジェット（Widget）
Flutterのアプリはすべてウィジェットで構成されます。ウィジェットは、視覚的な要素だけでなく、レイアウトや動作も定義します。

ウィジェットの種類
StatelessWidget：状態を持たない不変のウィジェット。
StatefulWidget：内部に状態を持ち、状態の変化に応じて再描画されるウィジェット。


例を交えた説明
StatelessWidgetの例

```Flutter
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'StatelessWidgetの例',
      home: Scaffold(
        appBar: AppBar(
          title: Text('StatelessWidget'),
        ),
        body: Center(
          child: Text('これは状態を持たないウィジェットです'),
        ),
      ),
    );
  }
}
```

説明：
MyAppはStatelessWidgetを継承し、状態を持たないシンプルなウィジェットを定義しています。
buildメソッドでUIを構築し、画面にテキストを表示します。
StatefulWidgetの例

```Flutter
import 'package:flutter/material.dart';

void main() => runApp(CounterApp());

class CounterApp extends StatefulWidget {
  @override
  _CounterAppState createState() => _CounterAppState();
}

class _CounterAppState extends State<CounterApp> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'StatefulWidgetの例',
      home: Scaffold(
        appBar: AppBar(
          title: Text('StatefulWidget'),
        ),
        body: Center(
          child: Text(
            'ボタンを押した回数: $_counter',
            style: TextStyle(fontSize: 24),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _incrementCounter,
          tooltip: '増加',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}
```

説明：
CounterAppはStatefulWidgetを継承し、内部に状態（_counter）を持ちます。
setStateメソッドを使って状態を更新し、UIを再描画します。
画面下部のボタンを押すと、カウントが増加します。


状態管理
setState
setStateメソッドを使用して、ウィジェットの状態を更新し、再描画をトリガーします。
例：
```Flutter
void _updateState() {
  setState(() {
    // 状態を更新するコード
  });
}
```

状態管理パッケージ
大規模なアプリケーションでは、状態管理を効率化するために以下のパッケージが利用されます。

Provider：公式推奨の状態管理パッケージ。
Bloc：ビジネスロジックとUIを分離するアーキテクチャパターン。
Riverpod：Providerの改善版として設計されたパッケージ。


レイアウトとレイアウトウィジェット
レイアウトの基本
Flutterでは、ウィジェットをネストして複雑なレイアウトを構築します。

主なレイアウトウィジェット
Container：パディングやマージン、背景色などを設定可能。
RowとColumn：ウィジェットを水平方向や垂直方向に配置。
Stack：ウィジェットを重ねて配置。
例：Columnウィジェット
```Flutter
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    Text('上のテキスト'),
    Text('下のテキスト'),
  ],
)
```
ナビゲーションとルーティング
ナビゲーション
複数の画面間を遷移するためにNavigatorウィジェットを使用します。

画面遷移の例：
```Flutter
Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => SecondScreen()),
);
```

戻る操作
```Flutter
Navigator.pop(context);
```
パフォーマンス管理の基礎！帯域幅管理からQoS、トラフィックシェーピングまで

#### 概要
ネットワークのパフォーマンス管理は、サービスの品質を保つために重要です。この記事では、帯域幅管理、QoS（Quality of Service）、トラフィックシェーピングについて詳しく解説し、パフォーマンスの最適化手法を紹介します。

---

#### 1. 帯域幅管理

- **説明**: 帯域幅管理は、ネットワーク内で利用可能な帯域を効率的に分配し、通信がスムーズに行われるように調整する技術です。過負荷を防ぎ、重要な通信を優先します。
- **特徴**: 帯域の適切な配分により、ネットワークのスループットを最大化します。
- **用途**: ネットワークの負荷が高い環境でのパフォーマンス最適化。

#### 2. QoS（Quality of Service）

- **説明**: QoSは、ネットワーク上の特定のトラフィックに優先度を設定し、重要な通信（例: 音声通話やビデオ会議）を優先的に処理する技術です。これにより、ネットワークの遅延やパケットロスを最小限に抑えます。
- **特徴**: トラフィックの優先度を細かく管理できるため、重要なアプリケーションの通信品質が保証されます。
ネットワークトラフィックの監視と制御を自動化することで、ネットワーク管理者の負担を軽減する
- **用途**: VoIP、ビデオ会議、リアルタイムアプリケーション。

#### 3. トラフィックシェーピング

- **説明**: トラフィックシェーピングは、ネットワーク上のトラフィックの流量を調整し、ピーク時の過負荷を避ける技術です。一定の速度を超える通信を制限することで、全体のパフォーマンスを安定させます。
事前に設定したトラフィック量の最大値を超えたパケットをバッファリングしてキューイングし、順番に処理を行います。
- **特徴**: ネットワークの負荷を分散させ、安定したパフォーマンスを維持できます。
帯域幅を不正利用するDDoS攻撃（分散型サービス拒否攻撃）から防御する。
- **用途**: 帯域幅が限られているネットワーク環境でのトラフィック管理。

---

#### 総括
ネットワークのパフォーマンス管理は、サービスの品質を保つための重要な要素です。帯域幅管理でリソースを効率的に利用し、QoSで重要な通信の優先度を設定し、トラフィックシェーピングでピーク時の負荷を調整することで、ネットワーク全体のパフォーマンスを最適化できます。これらの技術を導入し、ネットワークが安定して動作するようにしましょう。
障害管理を徹底解説！冗長化でネットワークの信頼性を高める方法

#### 概要
ネットワークの障害管理は、サービスの停止を最小限に抑えるために非常に重要です。この記事では、障害検出と、ネットワークの冗長化手法（デュアルルータ構成、冗長スイッチ）について解説し、障害管理の基本を押さえます。

---

#### 1. 障害検出

- **説明**: 障害検出は、ネットワーク上で発生した障害を素早く発見し、対応するためのプロセスです。自動化された監視ツールやログ解析によって、異常を検出します。
- **特徴**: 迅速な障害対応が可能となり、システムのダウンタイムを減少させます。
- **用途**: ネットワーク全体の監視、サービスの安定運用。

#### 2. 冗長化（Redundancy）

##### デュアルルータ構成

- **説明**: デュアルルータ構成は、2台のルーターを用意して、片方が障害発生時に自動的にもう片方に切り替わる仕組みです。これにより、ルーターの障害によるネットワークダウンを防止します。
- **特徴**: 高い可用性を確保し、ネットワーク障害による影響を最小限に抑えます。
- **問題点**: 2つのルーターが同じチャンネルを利用すると、電波干渉によって通信が不安定になったり遅くなったりする可能性がある。
2つのルーターがあると「自宅に2つのネットワークグループがある」状態になる。
上記の問題点により、自宅や小規模環境より大規模な環境に適します。
- **用途**: ミッションクリティカルなネットワーク環境。

##### 冗長スイッチ

- **説明**: 冗長スイッチは、複数のスイッチを用いてネットワークのバックアップ経路を確保する手法です。スタックとも呼ばれます。
スイッチの障害が発生しても、他の経路を通じて通信を維持します。
- **特徴**: スイッチの単一障害点を排除し、信頼性の高いネットワークを実現します。
- **用途**: 大規模な企業ネットワーク、データセンター。

---

#### 総括
障害管理において、障害検出と冗長化は不可欠です。迅速な障害検出による早期対応と、デュアルルータや冗長スイッチによるバックアップ体制を整えることで、ネットワークの信頼性が大幅に向上します。ネットワークの可用性を高めるために、これらの技術を導入することが重要です。
ネットワーク監視システムの基礎を解説！SNMP, NetFlow, Syslogの役割とは？

#### 概要
ネットワーク監視システムは、システムの状態やトラフィックをリアルタイムで監視し、トラブルの早期発見と対応を行うために重要です。この記事では、代表的な監視システムのプロトコルであるSNMP、NetFlow、Syslogについて詳しく解説します。

---

#### 1. SNMP（Simple Network Management Protocol）

- **説明**: SNMPは、ネットワークデバイスの状態を収集し、管理者がネットワークの健全性を監視できるプロトコルです。デバイスの稼働状況やトラフィック量などの情報を取得します。
機器のMIBから情報を取得するために、定期的に取得するSNMPポーリングや、異常検知できるSNMPトラップを使用します。
- **特徴**: シンプルで広く普及しており、多くのネットワークデバイスでサポートされています。
UDP/IPベースで動作する。
ネットワーク機器やサーバーのリソース・パフォーマンス・トラフィックなどのパフォーマンス情報を監視できる。
ホスト名や起動からの経過時間、トラフィック量やエラーパケットの数、CPUやメモリーの使用状況といった詳細な情報を取得できる。
- **用途**: ルーター、スイッチ、サーバーの監視。

#### 2. NetFlow

- **説明**: NetFlowは、Ciscoが開発したネットワークトラフィックのモニタリングプロトコルです。デバイス間を流れるデータパケットの情報を収集し、トラフィック分析やトラブルシューティングに使用します。
- **特徴**: トラフィックの詳細な情報を把握でき、トレンド分析や容量計画に有用。
- **用途**: トラフィックの分析、ネットワーク容量の管理。

#### 3. Syslog

- **説明**: Syslogは、システムイベントやエラーメッセージを記録するためのプロトコルで、サーバーやネットワークデバイスからのログを収集します。
用途は、イベントやエラーの追跡、システムのパフォーマンスに関する情報の提供、システムの監視、 ネットワーク機器の動作の記録です。
- **特徴**: ログの一元管理が可能で、トラブルシューティングや監査に役立ちます。
- **用途**: イベントログ管理、障害検出。

---

#### 総括
ネットワーク監視システムは、システムの健全性を保つために不可欠なツールです。SNMPでの状態監視、NetFlowによるトラフィック分析、Syslogによるログ管理を組み合わせることで、包括的なネットワーク監視が可能になります。これらのツールを効果的に活用することで、障害の早期発見や予防が期待できます。
リクエストとレスポンス、プロトコル、そしてポート番号の関係について

リクエストとレスポンス、プロトコル、ポート番号の関係について勉強したので、それをまとめます。
# リクエストとは？

**リクエスト** とは、あるシステムに対して、情報や処理を要求することです。Webの世界では、主に以下のものがリクエストとして扱われます。

* **HTTPリクエスト:** Webページの表示、データの送信など、Web通信で利用されるリクエストです
* **APIリクエスト:** アプリケーション同士が通信するために利用されるリクエストです
* **データベースクエリ:** データベースに対してデータの検索や更新を行うためのリクエストです

**リクエストの構成要素**

* **メソッド:** リクエストの種類（GET、POST、PUTなど）
* **URL:** リクエスト先のアドレス
* **ヘッダー:** 追加情報（ユーザーエージェント、Cookieなど）
* **ボディ:** リクエスト本体（送信するデータ）

# レスポンスとは？

**レスポンス** とは、リクエストに対してシステムが返す回答、つまり結果のことです。

**レスポンスの構成要素**

* **ステータスコード:** リクエストの処理結果（成功、失敗など）
* **ヘッダー:** 追加情報（コンテンツタイプ、Cookieなど）
* **ボディ:** レスポンス本体（返されるデータ）

# プロトコルとは？

**プロトコル** とは、通信を行う際のルールや手順を定めたものです。リクエストとレスポンスは、このプロトコルに則って行われます。

* **HTTP:** Webページの表示など、Web上での通信で広く利用されるプロトコル
* **HTTPS:** HTTPにSSL/TLSによる暗号化を加えたプロトコル
* **FTP:** ファイル転送用のプロトコル

# ポート番号とは？
**ポート番号** とは、通信相手の宛先を表すURLを表現する際に使われるもののことです。
- **URL**:スキーム名://IPアドレス:ポート番号で表されます。ポート番号はスキーマ名次第によっては、不要となることがあります。（https:111.111.111.111:1111など）
- **スキーム名**：http, httpなど
- **IPアドレス**:ネットワーク上のコンピューターを特定するために使用されます(111.111.111.111など) 

# リクエストとレスポンス、プロトコル、そしてポート番号の関係性

これらの4つの要素は、コンピューターの通信には必要不可欠です。

* **リクエスト:** 特定のプロトコルに従って、サーバーに情報を要求します
* **サーバー:** リクエストを受け取り、処理を行い、プロトコルに則ったレスポンスを返します。
* **レスポンス:** クライアントは、レスポンスを受け取り、表示したり、次の処理に利用したりします。
* **ポート番号:** IPアドレスとポート番号をもとに通信経路が作成され、それを利用して、コンピューターはプロトコルに則り、リクエストやレスポンスなどのやり取りを行います。

### 例えば、Webページの閲覧
1. ブラウザはHTTPプロトコルを使ってサーバーにページのデータ（HTML）を要求します。
1. WebサーバーはHTTPプロトコルに従ってHTMLデータをレスポンスとして返し、ブラウザはそれを表示します。

※この時、Webサーバーは80もしくは443番のポートでWebの通信を待っているので、不特定多数のクライアントとのやり取りが可能です。
プログラミング研修の現場で計測する_理解度テスト編

研修で誰かに教えているとき、
自分で新しい何かを学んでいるとき、「現在地点」を測定したくなる。

測定方法としては、

- ペーパー試験
- 演習課題
- 口頭試問

などなど、様々だが、
今回は理解度テストについて掘り下げる。

# 「測定」のモチベーション

まずは測定のモチベーションについて、
教育側、被教育側にどのような効果を狙うのというと、

- 対象の理解度を確認したい
    - 理解できている点
    - 理解できていない点
- 自分の教え方をふり返りたい
    - 教え方の改善
    - 補講内容の決定
- 理解度を自覚させたい
    - 復習のきっかけ作り

というように、「狙い通りに行けば」様々な効果が見込める。


# 理解度確認テスト（知識）

今回の主題はいわゆるペーパーの試験について。
この試験は、コードを実際に動かすことなく、
学校の定期試験のように、問題文と解答用紙を用いて行う。

- 用語の意味
- コードの実行結果
- エラーとなる個所とその原因

等を問い、
解答方法についても

- 記述式（短答）
- 記述式（長文）
- 選択式
- 穴埋め式

といくつかのバリエーションがある。

## メリット

- 点数という形で定量的に評価できる
- 基礎の定着度を確認できる
- 形式によっては低コストで運用できる

## デメリット

- 必ずしも実装力と対応しない
- 学習の際、コードを動かさないで学ぶ人が出る
- 作問により、精度がかわる　
- 技術力ではなく日本語力の問題となることもある
- 結果は良くも悪くもデジタルとなる

## 所感

研修レベルにおいては、「意外」と「実力」との相関があるという印象。
所感としては、

- 点数の高い人がプログラミングができるわけではないが、プログラミングが得意な人は点数も高い
- プログラミングが苦手な人は低い点となることが多い
- 出題形式は様々であるが、コード読解力が問われているケースが多く感じる
- なんだかんだコードの読解力が問われる傾向に見える

### 作問の難しさ
作問の難易度が意外と高く、

- 意図通りに計測できる作問が難しい
- 意図しない誘導が起こる
- 選択肢の作り込みが難しい
- 文意が伝わらない事がある

いわゆる「運転免許」の試験のようになってしまうことも。

また、各問題、意図をもって作問を行うが、
狙った箇所で躓いてくれるとも限らず、
意図しない場所がヒントとなることもあったり、
また、間違えやすい挙動を問おうとした結果、不自然な作問・コードとなってしまうこもある。

### 採点基準の健全性

フェアな採点基準を作ることも難しい点の一つだ。

記述式の場合、

- 別解をどこまで許容するか
- 部分点の基準
- 表記ミスの許容範囲

「人を落とす試験」ではない点に留意すると、
どこまで「甘く」するかの塩梅が難しい。

採点基準ひとつで、正解率も大きく変わる。
意図した計測を行うためには基準の作成も重要なファクタの一つである。


### 試験結果の活用

試験結果がデジタルに出る分、
試験後にも留意が必要となる。

点数や正誤にとらわれ過ぎないことに注意が必要。
（教育側、被教育側ともに）


一歩踏み込み、傾向や根本原因を分析することが大切となる。
ここまでできて初めて試験をつようすることができるのだ。
【Python練習問題】range()編

下記記事の続きです。
リストではありませんが、
関連項目として抑えておくと覚えやすいです。

https://qiita.com/taimax/items/e7c056dba12542707a34


## 3.range()

### Q.3-1:次のコードを実行した結果を答えなさい

```python
list = range(5)
for i in list:
    print(i)
```

### Q.3-2:次のコードを実行した結果を答えなさい

```python
list = range(2,5)
for i in list:
    print(i)
```

### Q.3-3:次のコードを実行した結果を答えなさい

```python
list = range(0,7,2)
for i in list:
    print(i)
```

### Q.3-4:次のコードを実行した結果を答えなさい

```python
list = range(-1,3)
for i in list:
    print(i)
```

### Q.3-5:次のコードを実行した結果を答えなさい

```python
list = range(7,2,-1)
for i in list:
    print(i)
```

### Q.3-6:次のコードを実行した結果を答えなさい

```python
list = range(7,2)
for i in list:
    print(i)
```
【Python練習問題】リスト操作編

下記記事の続きです

https://qiita.com/taimax/items/8530f272d4fb6a3d531b

## 2.リスト操作

### Q.2-1:次のコードを実行した結果を答えなさい

```python
list = [0,1,2,3,4,5,6]
list[2:2] = [100,200]
print(list)
```

### Q.2-2:次のコードを実行した結果を答えなさい

```python
list = [0,1,2,3,4,5,6]
list[1:3] = [100,200]
print(list)
```

### Q.2-3:次のコードを実行した結果を答えなさい

```python
list = [0,1,2,3,4,5,6]
list.insert(2,100)
print(list)
```

### Q.2-4:次のコードを実行した結果を答えなさい

```python
list = [0,1,2,3,4,5,6]
list.append(100)
print(list)
```

### Q.2-5:次のコードを実行した結果を答えなさい

```python
list = [0,1,2,3,4,5,6]
list.pop()
print(list)
```

### Q.2-6:次のコードを実行した結果を答えなさい

```python
list = [0,1,2,3,4,5,6]
list.pop(4)
print(list)
```

### Q.2-7:次のコードを実行した結果を答えなさい

```python
list = [0,1,2,3,4,5,6]
list.remove(2)
print(list)
```

### Q.2-8:次のコードを実行した結果を答えなさい

```python
list = [0,1,2,3,4,5,6]
list.extend([100,200])
print(list)
```
【Python練習問題】リストのスライス編

# Pyhonリスト練習

 下記に関する練習問題です。
 解答は各自、確認しましょう。

https://qiita.com/taimax/items/b2ebdd77a18a0e9b10ec


## 1.基本的な分割

### Q.1-1:次のコードを実行した結果を答えなさい（開始のみ指定した場合）

```python
list = [0,1,2,3,4,5,6]
print(list[2:])
```

### Q.1-2:次のコードを実行した結果を答えなさい（終了のみ指定した場合）

```python
list = [0,1,2,3,4,5,6]
print(list[:3])
```

### Q.1-3:次のコードを実行した結果を答えなさい（ステップのみ指定した場合）

```python
list = [0,1,2,3,4,5,6]
print(list[::3])
```

### Q.1-4:次のコードを実行した結果を答えなさい（ステップが負の場合）

```python
list = [0,1,2,3,4,5,6]
print(list[::-2])
```

### Q.1-5:次のコードを実行した結果を答えなさい（開始・終了を指定した場合）

```python
list = [0,1,2,3,4,5,6]
print(list[2:5])
```

### Q.1-6:次のコードを実行した結果を答えなさい（負の数で開始を指定した場合）

```python
list = [0,1,2,3,4,5,6]
print(list[-5:4])
```

### Q.1-7:次のコードを実行した結果を答えなさい（負の数で終了を指定した場合）

```python
list = [0,1,2,3,4,5,6]
print(list[2:-1])
```

### Q.1-8:次のコードを実行した結果を答えなさい（開始の方が終了より大きい場合）

```python
list = [0,1,2,3,4,5,6]
print(list[4:3])
```

### Q.1-9:次のコードを実行した結果を答えなさい（終了がリストの長さより大きい場合）

```python
list = [0,1,2,3,4,5,6]
print(list[1:1000])
```

### Q.1-10:次のコードを実行した結果を答えなさい（[]の中に大きい値を指定した場合）

```python
list = [0,1,2,3,4,5,6]
print(list[1000])
```

### Q.1-11:次のコードを実行した結果を答えなさい（開始・終了・ステップを指定した場合）

```python
list = [0,1,2,3,4,5,6]
print(list[1:5:2])
```

### Q.1-12:次のコードを実行した結果を答えなさい（負のステップかつ、開始が終了より大きい場合）

```python
list = [0,1,2,3,4,5,6]
print(list[5:1:-1])
```

### Q.1-13:次のコードを実行した結果を答えなさい（負のステップかつ、開始が終了より小さい場合）

```python
list = [0,1,2,3,4,5,6]
print(list[1:4:-2])
```
【個人開発・ハッカソン】ずんだもんともくもく会

# はじめに
先週の土日2日間でJISOUハッカソンに参加しました。
JISOUハッカソンのテーマは「AIで日常を魔法に」

[発表スライド](https://www.canva.com/design/DAGRdskdqeY/PCxLXIsEt7O6dSWXa6hBRA/edit?utm_content=DAGRdskdqeY&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton)

# 作ったもの
プロダクト名は、「THE MOKUMOKU」(いつの間にかタイトルは ずんだもんともくもく会になってる、、、わかりやすいかなとw)

THE MOKUMOKUの概要
> THE MOKUMOKUはDiscordで使うツールのようなものです。
プロダクト名の通り、エンジニア界隈ではよく行われるもくもく会を盛り上げるという目的で開発され、Githubでの作業(push)を検知し、みなさんもよくご存知のずんだもん(AI)というキャラクターが作業に対してフィードバックをくれます。

※デモ動画は私情で用意できなかったためご容赦ください

# 技術構成図 (?)
![Screenshot from 2024-09-22 15-10-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554025/1a059b65-1bb7-fcc1-fb37-5723414885fa.png)

JISOUで学んだNextjsをapiを作るために使いました。

# 流れ
どのようにしてずんだもんからのフィードバックを受けられるのか解説します。

1. Githubに作業をpushする
1. Githubのリポジトリに登録したwebhookが発火してNextjsをデプロイしたurlにPOSTリクエストが飛ぶ
1. リクエストからコミットの情報を取得し、差分データを抽出。そこからプロンプトを作成してGemini apiに投げる
1. Discordのwebhookに向けてメッセージを送信するリクエストを投げる
1. webhookが登録されたDiscordのテキストチャンネルでフィードバックを受け取る
1. Discordのボイスチャットに参加させておいた、ずんだもんのボットがテキストチャンネルのメッセージを検知してしゃべる

# 工夫した点
### アイデア面
JISOUでは主にReactの技術を学んでいるので、技術的にできることはそう大差がないかと自分は思っています。それに加え、AIを使うことがこのハッカソンのテーマであり、そのほとんどがGemeni等のAPIを使って開発します。
そこで、プロダクトを魅力的かつ個性的にするためには

- そのプロダクトがもたらす価値
- AIからのレスポンスをどのように魅せるか

が重要になってくると思いました。

AIからのレスポンスをどう魅せるかに僕はフォーカスし、webとしての実装ではなく、Discordの通話に使うツールを開発しました。

### 技術面
- webhookを取り入れた
- 技術面とは言えないが、ずんだもんBotが喋れる文字数には制限があるのでshortバージョンの文章も生成しておいた

# 謝辞
ずんだもんに文章をしゃべってもらうために[ずんだもんβ](https://lenlino.com/?page_id=2171)を使用させてもらいました。開発者の方に感謝申し上げます。

個人的にずんだもんBot使っててワクワクしました(喋らせるの楽しい)、内部的に使われてるVOICEVOXもぜひ！機会があれば触ってみてください。楽しいです。

# 終わりに
2日間ずっと開発していたのは久しぶりでした。自分の作りたいもの・理想と現実のギャップは少々苦しいものですが、それを埋めていけるのは極上の体験だと思っています。

ちなみにハッカソンで優勝はできなかったです。とても悔しいなぁ、ま楽しかったしいいかなと思います。
ステートフルとステートレスなサービス、クッキーの関係

サービスにおけるステートフルとステートレスの違い、そしてクッキーに関して勉強したので、それを記録に残します。

# サービスにおけるステートフルとステートレスの違い
ステートフルとステートレスの違いを表にまとめました。
| 特徴             | ステートレス       | ステートフル         |
|------------------|--------------------|----------------------|
| リクエスト処理   | 各リクエストが独立 | 過去の処理内容を記録 |
| 負荷分散         | 容易               | 困難                 |
| スケーラビリティ [^1]| 高い               | 低い                 |
| 障害時の影響     | 小さい             | 大きい               |

[^1]:スケーラビリティが高いサービスは、たくさんのリクエストがあっても、安定に稼働します。
逆に、スケーラビリティが低いサービスは、たくさんのリクエストがあったとき、サーバーが落ちたり、レスポンスが遅くなったりします。

# ステートフルとステートレスの違い
ステートフルとステートレスの違いを商品の注文の受け方で例えてみます。
## ステートフルな注文の例：メモを用いて注文を受けます
### メリット:
- 注文の途中でも、注文内容の変更や確認が可能です
- 注文担当者が交代しても、前の担当者がメモした情報に基づいて続けることができます


### デメリット:
- メモの管理が必要です
- 同時に多くの注文に対応しにくいです

## ステートレスな注文の例：メモを用いずに注文を受けます
### メリット:
- 同時に多くの注文に対応しやすいです
    - ウェイターが厨房に持ってくる注文の量は想定可能です
- メモの管理が不要です
    - メモがなくなった時のトラブルとかはありません
### デメリット:
- 注文の途中でその注文内容を変更することができません

# どのようなサービスに用いられるか
- ステートフル:
    - 柔軟な対応が求められるサービス
    - スケーラビリティがそれほど重要はならない比較的小規模なサービス
- ステートレス:
    - Webサービス
        - 一般的に大量のリクエストを受け付けます
        - 負荷分散も用途によっては必要となります

# クッキーとは
上述したように、Webサービスは、基本的にステートレスに設計されています。しかし、ユーザーごとに異なる情報を管理したい場合（例えば、ログイン状態を保持したい場合）があります。例えば、ネットショッピングサイトなどはその例です。

これを解決するのがクッキーです。クッキーを用いることで、ステートレスなWebの世界でもステートフルなサービスを提供できます。

## クッキーのメリット
- ユーザーの状態を保持できます
## クッキーのデメリット
- セキュリティリスクがあります（Cookieに機密情報を保存するのは危険）
- クッキーのサイズが制限されています
- ブラウザの設定でクッキーを拒否される可能性があリマス

# まとめ
サービスはステートフルとステートレスなものに分類できます
その中でも、Webサービスはステートレスに分類されます
クッキーはステートレスなWebサービスをステートフルなものへと扱えるようにする仕組みです
ローレイヤーがわからない人がページフォールトを調べてみた

応用情報技術者試験を勉強していたら、ページフォールトに関する問題が出た。

JavaScriptとRubyをメインにして仕事をしているため、ページ？ページングのこと？だと思っていたけど、全然違った内容だった。

ローレイヤーの言語をちゃんと触ったことないので、ネットで検索している情報だとあまり伝わらなかった。なんとかページフォールトを理解するまでの流れを残してみた。

## ページフォールトとは？
> ページフォールト（page fault）とは、ページング方式の仮想記憶（仮想メモリ）において、プログラム（プロセス）がアクセスしようとした仮想メモリ領域（ページ）が物理メモリ上に無く、ストレージに退避していることが分かったときに発生する例外あるいは割り込み処理。

https://e-words.jp/w/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%88.html

なるほどわからん。そもそも仮想メモリとは？
> 　仮想メモリとはパソコンのハードディスクやSSDなどストレージの一部をメモリとして使うことで、メインメモリの容量が足りなくなったときにタスクを実行するための一時的な作業スペースとして機能します。

https://www.mouse-jp.co.jp/mouselabo/entry/2023/12/15/100021

実際の物理メモリよりもっと大きなメモリを使っているように動作させることができるらしい。

## ページは何？
この仮想メモリは大きな配列になっている。

以下のようにアドレスを配列の中に入れていくことになる。

```
['アドレス1', 'アドレス2', ... , 'アドレスn']
```

このような配列を4GB分持っていると思うと、大きさが2^35 = 34,359,738,368ビットの配列になる。

これを毎回検索するのは効率が悪いし、ポインターで指定するときに「23,090,112,910番目のアドレスを指定します」みたいなことをしないといけなくなるので不便なところがある。

そこで、ページを利用するとこの仮想メモリを二次元配列で表すことができる。
エクセルのように整理ができるイメージ！

>各セル：メモリのアドレス
行：ページ
列：ページ内の位置（distance, offsetと呼ぶ）

なので、ページは仮想メモリを二次元配列で管理する単位だと考えられる。

## それではページフォールトとは？

以下のような例を考える。
```
[ページ 1] [1][2][3][4]
[ページ 2] [5][6][7][8]
[ページ 3] [ ][ ][ ][ ]  <- まだロードされていないページ
[ページ 4] [9][10][11][12]
```

もしプログラムがページ３の1個目のアドレスにアクセスしようとしたら、このページはまだロードされていないためページフォールトが発生する。

Webで言うと404 Not Foundレスポンスに近いのかな？

### ページフォールトが発生した後の処理
OSがページフォールトを検知すると、抜けているページをディスクから物理メモリに持ってくる。
そこで、また仮想メモリテーブルをアップデートし、ページのアドレスを記録する。

その時の二次元配列は以下のような形になる。
```
[ページ 1] [1][2][3][4]
[ページ 2] [5][6][7][8]
[ページ 3] [13][14][15][16]  <- ページをロード
[ページ 4] [9][10][11][12]
```

## おわりに
こうやって知らなかったものを勉強していると、まだまだ知らないことがいっぱいあることを実感する。
長い目で見ると、ローレイヤーもちゃんと勉強するべきだな...
Scoopで入れたWezTermを実行したときにコマンドプロンプトを出さない方法（CraftLaunch編）

これでうれしいのは自分くらいだろうという気もしますが、もしかしたらほかにも応用できるとおもうので書いておきます。

#### やり方
こんな関数を登録しておく
```python
    def run_wezterm(info):
        subprocess.Popen(["start", "/B", "wezterm"], shell=True)
```
呼び出すときはこうする。
```python
    window.launcher.command_list += [
          :
        ('wezterm', run_wezterm), 
          :
```

#### 経緯
アプリをWin+Rから開くときにWindowsのコマンドプロンプトが開いてアプリが開くようなのがたまーーーにあります。

僕の場合はScoopでインストールしたWezTermでした。

で、それをCraftLaunchに登録して開くと、やっぱりコマンドプロンプトが開いてそのまま残ります。コマンドプロンプトを閉じるとWezTermを巻き込んで閉じます。うーーん、、、だったので、いままではPowerShellやVBScriptをつかってWezTermを呼び出すようにしていました

が、このやり方が一番簡単でした。

#### 引数を渡せるようにしたバージョン
```python
    def run_wezterm(info):
        cmd = ['start']
        if len(info.args) >= 1:
            cmd += [f'{info.args[0]}']
        print(cmd)
        subprocess.Popen(['start', '/B', f'wezterm'] + cmd, shell=True)
```
weztermのコマンドはstartを渡す想定です。ほかにsshとかもあるのでそれはそれで場合分けすればよいと思います。

#### 参考サイト
* [Windowsでウインドウを表示しないスクリプトの実行方法. PowerShellならVBScriptを使わずできる | by どこにでもあるメモ | Medium](https://fuji44.medium.com/windows%E3%81%A7%E3%82%A6%E3%82%A4%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%AA%E3%81%84%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95-1c3b6f934274)
* [バッチファイル(.bat)実行中にウィンドウ非表示にする方法](https://nikkeimatome.com/?p=43150)
* [Pythonからコマンドを呼び出す（Windows編） #PowerShell - Qiita](https://qiita.com/_akisato/items/d97b17064df158f0dea0)
C＃はなぜ素晴らしい言語なのか

![](https://storage.googleapis.com/zenn-user-upload/c28fe91b5903-20240929.jpg)  
各言語の素晴らしい点をまとめた資料を作っていますが、これはその中の一つです。

とはいえ、C#が一番好きな言語なので、特に力を入れて書いています。

---

![](https://storage.googleapis.com/zenn-user-upload/bbcc586dff92-20240929.jpg)  
個人的にはRubyもかなり好きなんです。でも、実務で使うことを考えると、C#が一番気に入っているんですよね。それでも、こういう資料を作るのは意外と難しかったです。なぜかというと、C#の良さを一言で説明するのが本当に難しいんです。

---

![](https://storage.googleapis.com/zenn-user-upload/ba04d4914bf2-20240929.jpg)  
C#にはたくさんの良いところがあるんです。でも、どうも全体として目立った特徴がないというか…  
いいところを挙げるなら、他の言語の良い点をうまく取り入れていることや、後方互換性に対する配慮、時には非常に先進的な機能を持っている点、多用途に使えることなどですね。

---

![](https://storage.googleapis.com/zenn-user-upload/8c8fc8efa936-20240929.jpg)  
それでも、なんとなく地味なんです。なかなか人に勧めにくい。  
でも、実際に使ってみると本当に使いやすいんです。

---

![](https://storage.googleapis.com/zenn-user-upload/587136c8b210-20240929.jpg)  
何年も考えて、ようやくしっくりくる言葉を思いつきました。  
それは「神は細部に宿る」です。

---

![](https://storage.googleapis.com/zenn-user-upload/a815c28b54e6-20240929.jpg)  
これは建築家のルートヴィヒ・ミース・ファン・デル・ローエの言葉です。「細部こそが重要だ」という意味ですね。彼の建築を見てみるとわかりやすいのですが、全体が完璧に統一されているからこそ、美しく見えるんです。例えば、柱がちょっとでも曲がっていたら全体のバランスが崩れてしまう。それくらい、細部へのこだわりが重要だということです。

---

![](https://storage.googleapis.com/zenn-user-upload/5256a04fc895-20240929.jpg)  
この「細部へのこだわり」は、C#を作った開発者たちにも共通していると思います。彼らは、世界を驚かせるようなカリスマ的天才ではないかもしれませんが、第一級の秀才たちが集まって作った、非常に完成度の高い言語なんです。

---

![](https://storage.googleapis.com/zenn-user-upload/a27204af7b31-20240929.jpg)  
C#の開発者として知られているのはアンダース・ヘイルスバーグです。彼はTurbo PascalやDelphi、最近ではTypeScriptも手がけています。プログラミング界ではすでに何度もその名を轟かせているので、ある意味天才とも言えます。でも、例えばSmalltalkやLispのように、業界の常識を根底から覆すような伝説的な言語ではないかもしれません。C#も、彼一人で作ったわけではなく、チームを率いて作っています。

---

ここまででC#の良さを一言で表現しましたので、ここからはその「神が宿る細部」について具体的に説明していきます。

---

![](https://storage.googleapis.com/zenn-user-upload/f5bc2c58ff86-20240929.jpg)  
まず、C#の大きな特徴の一つは、他の言語の良いところを精錬された形で取り入れていることです。  
プログラミング言語の機能自体には著作権がないので、多くの言語が他の言語の良い点を取り入れていますが、C#は特にそれが洗練されています。
- 中間言語
- プロパティ
- yield
- ジェネリック
- ラムダ式
- タプル
- Null許容型  
など、多くの機能が、よく考え抜かれたうえで取り入れられています。一度取り入れた機能を変更することは後方互換性を壊すリスクがあるので、変更が難しいです。そのため、長く続く言語を作るには、慎重な判断が必要ですが、C#はその点でも際立っています。

---

![](https://storage.googleapis.com/zenn-user-upload/080d5385a80c-20240929.jpg)  
後方互換性に対する配慮も素晴らしいです。C#の開発者たちは、ある時期まで、GitHubなどの多くのプログラムを収集して、新しい機能が既存のコードにエラーを引き起こさないか確認していたそうです。つまり、既存ではコンパイルエラーになるようなケースだけに新機能を追加していたんです。

---

![](https://storage.googleapis.com/zenn-user-upload/f34087814a0e-20240929.jpg)  
時には、プログラミング全体に影響を与えるような革新的な機能も取り入れられます。例えば、async/awaitはその一つです。この機能は、マルチスレッド処理を簡単に行う方法を提供し、C++やPython、JavaScriptにも取り入れられました。他にも、LINQも有名です。DBやWeb APIとも同じ構文でデータを扱えるようにした機能は、画期的だったと思います。

---

![](https://storage.googleapis.com/zenn-user-upload/5e8c79c329b2-20240929.jpg)  
最後に、C#の広い適用範囲について触れておきます。Windowsアプリだけでなく、Webのバックエンドやフロントエンド、さらにはiOSやAndroidアプリの開発にも使えます。また、MacやLinuxにも対応しているため、PowerShellなどもその上で動作します。使える環境が非常に広く、実用性の高い言語です。

---

ということで、C#の魅力を紹介しました。特別な革新性はないかもしれませんが、バランスが良く、機能も充実しているので、非常に実用的な言語です。まだ使ったことがない方は、ぜひ試してみてください。

---

(編集協力：ChatGPT 4o様)  
(当記事はZennにもマルチポストされます)
[Zenn](https://zenn.dev/hrmstrsmgs/articles/2247c613003743)
(スライド全体はこちら)  
[speakerdeck](https://speakerdeck.com/player/fb87a6db07a644ca9dd037e4eecff7a4)
子供3人育てたいならマネージャーになりなと言われた話


## はじめに
この記事では、ワークライフバランスとキャリアの両立について、家族との時間を大切にしながら仕事も楽しむための私の選択について書きます。

## 上司から言われた言葉
「子供3人育てたいならマネージャーになりな」

20代後半の飲み会の帰り。駅構内で言われた言葉。
酔っ払いの上司から言われた言葉は話半分で聞いていましたが、ふとした時に何度も思い出す言葉となっています。

## マネージャーになりたい？
昇格すると雑務が増える、面倒なことが増える、トラブル対処で大変そう。そもそも昇格によいイメージは全くなく、多少の給与はあがってもそれを引き換えに辛すぎるなという印象でした。

そもそも、楽しそうにマネージャーやっている人がいなかったです。
（会社の問題？全体でどうだったか不明ですが、少なくとも私からはそう見えてました）

そして、自分の周りに小さな子供を育てながら、マネージャーをしている女性は見当たりませんでした。子育ての全く読めない不安リスクがだらけなのに、仕事に対しての不安リスクにも立ち向かうイメージがつかず、自分にはあてまらないなぁと思ってました。

**「ほんと、無責任なこと言わないでほしいよ」**

## 背中を押し続けてもらえた
いろんなタイミングで「マネージャー」という言葉に触れる機会が増えました。
私自身が年次が上がってきたこともあり、それなりに仕事もしてきて候補としてあげてもらえていたかと思います。

「いやいやそんなことないでしょ」と思っていた私ですが、意外と評価してもらえて必要資格や条件を満たしているんだなと思い始めました。

最近知ったのですが、ポジションチャレンジの男女差として、
**女性は必要資格や条件を１００％満たしている確信があるとき**に応募するが男性は６０％満たしていれば堂々と応募するという差があるそうです。

私は女性ロールモデルがいない部分を除いては、
マネージャーもやれるのかも、少しチャレンジしてみたいと思えるよう、徐々に思考に変わっていきました。

## マネージャーになってみよう
気になるけどイメージがつかない。

不安感のほうが強く感じていて、これを乗り越えたくて、女性エンジニアにインタービューをしてみることにしました。ちょうど２年前ごろに書いたnote記事です。

https://note.com/milkychan08/n/nd0a2e0b8aa83

それから、いくつかのコミュニティに参加したり、イベントに参加して顔を合わせたりしてつながりが増えてきて、今ではいろんなパーツモデルが増えてきました。
０か１００のやり方の選択ではなく、前向きにしなやかに選択する「うんうん」と共感できる仲間ができました。

多分無理なこともたくさんあると思うのですが、必死になって登り切ることだけ考えなくても大丈夫、誰かに頼りまくりながらでも大丈夫、そういう心を持ってやっていきたいと思っています。

**「ハードルは高いほどくぐりやすい」**　ですよね。

## 「子供3人育てたいならマネージャーになりな」の意味
上司がいっていた、「子供３人育てたいならマネージャーになりな」は、

子育てするにはどうしても時間必要で、限られた時間の中で成果をだしていくには、時間労働ではなく価値労働をしていきなさい。
プレーヤーのままでは自分が理想とする時間の使い方はいつまでもできないから、自分で時間をデザインする側のマネージャーになりなさい。

多分こういう文脈だったと思います。

ふと気づくと時間労働になりがちでまだまだですが、この言葉は大事に目の前の選択をしていきたいと考えています。

飲み会帰りの何気ない上司の言葉は、私にとって自分の方向性を考え続ける大事な言葉となり、そして、これから私の発する言葉が誰かの１歩に繋がる何かかもしれません。

## 育児もキャリアも欲張りでいい
あなたのやりたいことに、欲張りでいい。
「やるべき」ことはなく、自分らしくいていい。
子供もいて旦那さんもいて仕事もチャレンジして楽しむ。

**あなたはあなたらしくいていい。**　を伝えたいです。

## さいごに
私もいろんな方に背中を押してもらったように、誰かの一歩を応援する記事となっていれば幸いです。
他にもこのようなテーマで投稿しています。よかったらぜひ読んでください。
https://qiita.com/nanchan/items/232e1fe9015a4f6e0bf0
VBAのプロシージャ名・変数の命名ルールについて

# 基本は日本語で命名する
私が書くVBAコードは、プロシージャ名は基本日本語を利用しています。
理由は「[和風スパゲティのレシピ](https://www.limecode.jp/)」様の記事（[変数を日本語にすればプログラミングが上達する](https://www.limecode.jp/entry/guideline/nihongo-variable)）に影響を受けているためです。

ただし、完全に日本語にすると、Subプロシージャや変数を呼び出ししたいときに、インテリセンスがうまく働かず、不便です。

そのため、プロシージャ名の先頭（Subプロシージャなら先頭に「sb」、Functionプロシージャなら先頭に「zf」）をつけて、インテリセンスで呼び出ししやすいようにしています。
例えば、下記のようにしています。
```vb:Excel VBA
Sub sb赤枠四角図形挿入()
   Application.ScreenUpdating = False
       Call sb赤枠透明図形挿入(msoShapeRectangle)    '図形形状：角が丸い四角
   Application.ScreenUpdating = True
End Sub
 
Sub sb赤枠楕円図形挿入()
   Application.ScreenUpdating = False
       Call sb赤枠透明図形挿入(msoShapeOval)  '図形形状：楕円
   Application.ScreenUpdating = True
End Sub
 
Public Sub sb赤枠透明図形挿入(図形形状 As MsoAutoShapeType)
'マニュアル作成作業でよく使用する赤枠・背景透明の図形を挿入する（図形の種類は引数で指定）
   With ActiveCell
        ActiveSheet.Shapes.AddShape _
             (Type:=図形形状, _
              Left:=.Left, Top:=.Top, Width:=200, Height:=125).Select
   End With
   Selection.ShapeRange.Fill.Visible = msoFalse
   With Selection.ShapeRange.line
         .Visible = msoTrue
         .ForeColor.RGB = RGB(255, 0, 0)
         .Weight = 5  '太さ
         .Transparency = 0.3  '透明度
    End With
End Sub
```
なお、上記例にはFunctionは含まれませんが、Functionの先頭をzfとしてわざわざzをつけているのは、VBAでは、zで始まるプロパティやメソッドがないため、自分が定義したものが入力候補で絞れるためです。
（このプロシージャ名や変更の先頭に「z」をつけるのは、[りゅうりゅうさん](https://x.com/blacklist_ryu)が提唱しているz会に影響を受けています。）

とはいえ、必ずしも先頭にzをつける必要はなく、Subプロシージャの先頭をsbをつけているように、「s」単体で始まるメソッドやプロパティは沢山あっても、他の文字と組合せで自分が絞りやすい記名になっていれば問題ないと思います。

同様の記事は[note](https://note.com/keiri_info/n/nf7d276408ed5)にも公開しています。
Raspberry Pi Pico 2事始め5～Raspberry Pi Hat 1.3inch OLED HATを使おう2～

__Raspberry Pi Pico 2事始め4～Raspberry Pi Hat 1.3inch OLED HATを使おう～__ の続きです。

https://qiita.com/usashirou/items/6893ca7f9d17ac871c48

今回は、基板についているスイッチを使えるようにしてみましょう。
# SPI設定
__ファイル⇒スケッチ例⇒Adafruit_SH110x⇒OLED_featherwing__ を開きます。
最初に、接続方式を __I2C__ から __SPI__ にスケッチを変更します。
ピン設定は各自のボード設定に合わせてください。
```
#define OLED_MOSI     19
#define OLED_CLK      18
#define OLED_DC       9
#define OLED_CS       22
#define OLED_RST      10

// Create the OLED display
Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RST, OLED_CS);
```
__void setup内__ も変更しておきます。

      display.begin(0, true); 

# ボタン設定をしよう
__ジョイスティックと各スイッチ__ の設定を行います。
```
#define BUTTON_A  27
#define BUTTON_B  28
#define BUTTON_C  26

#define BUTTON_UP  12
#define BUTTON_DOWN  20
#define BUTTON_Left  11
#define BUTTON_Right  14
#define BUTTON_Press  13
```
__void setup内__
```
  pinMode(BUTTON_UP, INPUT_PULLUP);
  pinMode(BUTTON_DOWN, INPUT_PULLUP);
  pinMode(BUTTON_Left, INPUT_PULLUP);
  pinMode(BUTTON_Right, INPUT_PULLUP);
  pinMode(BUTTON_Press, INPUT_PULLUP);
```
最後に __loop内__
```
  if (!digitalRead(BUTTON_A))     display.print("A");
  if (!digitalRead(BUTTON_B))     display.print("B");
  if (!digitalRead(BUTTON_C))     display.print("C");
  if (!digitalRead(BUTTON_UP))    display.print("UP");
  if (!digitalRead(BUTTON_DOWN))  display.print("DOWN");
  if (!digitalRead(BUTTON_Left))  display.print("Left");
  if (!digitalRead(BUTTON_Right)) display.print("Right");
  if (!digitalRead(BUTTON_Press)) display.print("Press");
```
画面をすべて描画すると画面外に出てしまうため、ボタンCをクリックするとディスプレイをクリアし、カーソルを(0.0)に移動させます。

      if (!digitalRead(BUTTON_C))     display.clearDisplay() ,  display.setCursor(0, 0);

以上で、1.3inch OLED HATが使えるようになります。
Raspberry Pi Pico 2事始め4～Raspberry Pi Hat 1.3inch OLED HATを使おう1～

__Raspberry Pi Pico__ で __Raspberry Pi__ の __Hat__ を使えるようにした __uHAT Porter Pico__ を使ってみます。

:::note warn
Raspberry Pi Picoを使用していますが、Raspberry Pi Pico２でも使用可能です。
:::
# uHAT Porter Pico
__uHAT Porter PicoはRaspberry Pi Pico__ の __GPIOピン__ を __Raspberry Pi__ の40ピンコネクタに変換することができます。

https://github.com/Akkiesoft/uhat-porter-pico
# 1.3inch OLED HAT
__Waveshare__ の __1.3インチOLED__ と __スイッチ,ジョグダイヤル__ が搭載されているHatになります。
__OLED__ はデフォルトでは、__SPI接続__ になっています。
# 環境構築
__スケッチ⇒ライブラリをインクルード⇒ライブラリを管理__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3f113cdc-6a77-196b-8838-c602ef9f9df4.png)
__SH1106__ と入力し __Adafruit_SH110x__ を選択し、 __インストール__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c4ca6054-d2e1-67f8-3702-522d56b93dd2.png)
__Install all__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9aafd8a2-9a93-856e-c28d-06fb6b376df7.png)
__ファイル⇒スケッチ例⇒Adafruit_SH110x⇒OLED_QTPY_SH1106⇒SH1106_128x64_SPi_QTPY__ を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/36965ccf-8a9e-4d37-adc2-59b8d69172d6.png)
__26行目__ からの __ピン設定__ を変更します。
```
#define OLED_MOSI     10
#define OLED_CLK      8
#define OLED_DC       7
#define OLED_CS       5
#define OLED_RST      9
```
### 1.3inch OLED HATピン設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7a93c335-2699-f98b-ad95-0780f2d53718.png)

https://www.waveshare.com/wiki/1.3inch_OLED_HAT

### uHAT Porter Picoピン設定
uHAT Porter Picoピンはバージョンにより異なる為、基板のレビジョンを確認して設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/de05deb1-8cd3-2616-9c6c-c1689d15ec0a.png)

https://github.com/Akkiesoft/uhat-porter-pico
ピン設定をし、__マイコンボードに書き込む➡ __　を　__クリック__　することでOLEDにデモ画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8f82eef8-9ac5-b4af-d58b-7a4ef5e3824a.png)
【DAY20】本番環境でのタイトルの表示について(Laravel)

## はじめに
LaravelでWebアプリケーションを作成しました。ローカル環境ではタイトルが自分の指定したものになっていましたが、デプロイ後の本番環境ではタイトルがLaravelとなってしまっていました。原因と解決方法について記します。
## タイトルの指定方法について
私はLaravel Breezeを用いてビューの継承をしています。タイトルについては、app.blade.phpに以下のように記述してあります。
```app.blade.php
<title>{{ config("app.name", "Laravel") }}</title>
```
config("app.name") は、Laravelの設定ファイル（config/app.php）の 'name' キーにアクセスするという意味です。そして、nameキーが取得できなかったときはとLaravelがデフォルト値として使用されます。

続いて、config/app.phpを確認すると、以下のように記述してあります。
```config/app.php
'name' => env('APP_NAME', 'Laravel'),
```
これは、.envファイルの'APP_NAME'に指定された値を取得し、APP_Nameが設定されていないときはLaravelをデフォルト値として使用するということです。

続いて、.envを確認すると、以下のように記述してあります。
```.env
APP_NAME = Laravel
```
よって、ここの値を変えるとタイトルが変更できるはずです。ということで、私はここを自分のアプリの名前に変更していました。

## デプロイ後に反映されない原因
.envファイルの変更によって、ローカル環境ではタイトルの変更が反映されていましたが、本番環境では反映されていませんでした。この原因は、.envファイルはGithubに公開されていないからでした。そもそも.envファイルにはAPIキーやDB接続情報などが記述されているので、セキュリティの面で公開するわけにはいきません。
.envファイルの変更が反映できないのであれば、config/app.phpを直接変更すれば解決します。
```config/app.php
'name' => my_app_name,
```

これで、本番環境でもタイトルが反映されるようになりました。
CloudのLaTeX論文執筆環境

CloudでのLaTeXの環境を検索するとOverleafかCloud LaTeXが多く推奨されています。英語環境ならOverleaf、日本語メインならCloud LaTeXといった感じでしょうか。

https://cocalc.com

私がお勧めするのはCoCalcです。これはSagemthが運用する数学支援WEBサービスでLaTeXの編集には「CoCalc自体のLaTeX編集環境」、「TeXstudio」、「VS Code」の３種類が使えます。つまりローカルで使い慣れたエディタで編集できるという事です。
LaTeXはTeXLiveをaptで導入したもので日本語も最初から使えます。

一番大きな特徴はSageTeXを利用できる事。SageTeXとはLaTeXドキュメント中にSagemathの表現がそのまま使え、演算結果やグラフが組版できる機能です。もちろんローカル環境でもSageTeXは使えますが、OverleafやCloud LaTeXでは使えません。（それらはSagemathが動いていないから・・）

CoCalcの環境は時間単位での課金で３０分放置すれば自動的に止まるので無駄に課金されません。外部とのファイルやり取りは、アップロード、ダウンロードもありますが、AWS、GCSなどクラウドストレージのマウント、sshfsによる任意のフォルダのマウントが可能です。私の場合は別途VPSを用意し、そのフォルダをsshfsでCoCalcとローカルの両方にマウントしています。
自作Webアプリを供養する話

## あらすじ

先日、アプリを実装してリリースをしようと準備をしていたのですが、関連するサービスの終了が発表されリリースできなくなってしまいました。簡単なサービスではありましたが、実装したアプリのアウトプットとしての説明兼供養としてこの記事を書きました。

## 開発に至る経緯

自分は毎期アニメを見るようなオタクなのですが、あのアニメいつ始まるんだっけ？🤔となることが多く、パッと放送開始日を確認できるものがあればラクだなあと思っていました。既存のサービスだと放送日以外の情報も載せていてごちゃっとしていて見にくかったりページが重いケースもありました。そのためそのサクッと確認できるものを作ろうと思い、実装してみるかと思い立ったのが経緯です。
アプリの画面はこんな感じです。

![IMG_3717のコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593692/7f65fdff-0a1f-e9a5-62e5-353127d50eb9.png)


## アプリの詳細

### アーキテクチャ

![放映アニメリストアプリアーキテクチャ図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593692/ccbcb9dd-1965-2cce-6e2a-7b135bc2de8d.png)

クローラーで放送日のデータを他サービスからスクレイピングしてDBに登録、DBから放送日データを取得するAPIをフロントから叩く流れです。

### 機能

アニメの放送データを一覧形式で表示します。アニメごとに、各テレビ局の初回放送日時が確認できます。

### 技術的なポイント

- フロントエンド

とにかくすぐ作ってみたかったため、以下の既存ソースを流用させていただき、不要な機能は削除しつつmaterial uiのコンポーネントを差し替える形で実装しました。

https://github.com/ykawase1011/animel

多くの放送局で放送予定があるアニメだと20局近くになるため、一覧画面の中で放送データの表示が縦に長くなる問題がありました。そのためmaterial uiのアコーディオンコンポーネントを採用して改造し、初期表示としては1アニメごと最大3放送データとし、クリックして全放送データ表示とすることで一覧表示画面が縦に長くなる問題を軽減しました。
また、既存ソースで設定されていたPWAの仕組みは勉強になりました…！

- バックエンド

こちらもすぐ作ってみたかったということで、扱い慣れたJava、またOpenAPI、swagger、Redocを採用してソース、API仕様書自動生成も活用しています。自動デプロイの仕組みは入れていないものの、自動テストは取り入れました。

- クローラー

cronでpythonを起動して、スクレイピングを行います。クローリング、スクレイピングということでここはほぼpython一択かと思います。

- DB

ここも使い慣れたポスグレを利用しています。
大量アクセスは見込んでいないためスケーラビリティは重視しませんでしたが、スクレイピング時に数秒程度ですが書き込みを行うためリードレプリカを取り入れてDBへ負荷分散をしています。

- インフラ

リリースする場合は、節約のためフロントエンドはVercelのサーバー、バックエンド（クローラー含む）はfly.ioを利用する想定でした。
試作段階では、自宅のラズパイサーバーにすべてデプロイしアプリを動作させています。フロントエンドにはnginx、バックエンドにはTomcatを使用しています。
同一サーバー内で複数のポスグレインスタンスを併存させるのは初の取り組みでしたが、以下記事を元に実現させることができました。

https://www.system-exe.co.jp/dbexpert26/

https://qiita.com/kanegoon/items/15496a9ddf57cbb2bf72

- デザイン

ロゴはhatchfulを利用して無料で自動生成しました。なんとなく顔っぽいと思ってもらえると想定通りなのですが、アニメ→映像→光の三原色と連想し、光の三原色を横に並べて左右両目と鼻を表しています。アニメを目を通じて楽しむことを意味します。wanimeというタイトルもwatchとanimeをくっつけた造語です。

https://www.shopify.com/jp/tools/logo-maker

## 反省点や改善点

やはりもっと早くに動き出せていればという後悔は大きいです。これまで学習目的でのサービス公開はいくつか経験がありますが、実際に使う目的があってアプリを作ったのは初めてでしたので、それが思わぬ形でリリース、運用できなかったのは非常に残念でした。次こそはちゃんとリリース、運用までもっていきたい所存です。

アプリ自体の改善点としては、まず検索機能の追加、またユーザー機能も入れてユーザーが見たいアニメを記録できる機能の追加はイメージしていました。本番環境にリリースした場合は、自動デプロイも組み込めるため入れたいなと思います。また、Reactは入門中というところでしたので、フロント側にもテストコードを入れCICDに乗せていくのも良いテーマかと思いました。
【Java】べき乗(累乗)の計算方法

## はじめに
Javaでのべき乗の計算方法が分からなかったのでまとめます。

## べき乗とは何か
以下の記事から引用すると
[「『冪乗』と『累乗』の違いとは？分かりやすく解釈」 言葉の違いが分かる読み物(2024/9現在)](https://meaning-difference.com/?p=958)

>「冪乗」とは「aのn乗のように、同じ数字を複数回にわたって乗算で掛け合わせること」

と記述されています。

## 累乗との違い
累乗とはべき乗を自然数のみで行う計算を指します。

累乗⊂べき乗(累乗はべき乗に含まれている)と言い換えることもできます。

## 解決方法
1. for文を使う方法(累乗)
2. JavaのMathクラスpow()を使う方法

の2つの方法を紹介します。

### 1. for文を使う方法(累乗)

aのn乗をfor文で表現したものです。
以下の場合は、aを10、nを5としたコードです。

```java
    int a = 10; // 基数
    int n = 5;  // 指数
    int ans = 1;
    for (int i = 1; i <= n; i++) {
        ans *= a;
    }
    System.out.println("ans = " + ans); // ans = 100000
```

### 2. JavaのMathクラスpow()を使う方法

Mathクラスのpow()を使った場合です。

```java
    int a = 10; // 基数
    int n = 5;  // 指数
    double ans = 1;
    ans = Math.pow(10, 5);
    System.out.println("ans = " + ans); // ans = 100000.0
```

## おわりに
べき乗の書き方を学べてよかったです。

## 参考文献
[「『冪乗』と『累乗』の違いとは？分かりやすく解釈」 言葉の違いが分かる読み物(2024/9現在)](https://meaning-difference.com/?p=958)

[「Javaで四則演算、階乗、べき乗、Mathクラスの使い方を習得して計算をマスターしよう」フリーキーズ(2024/9現在)](https://frkz.jp/study/java/calc)
AWS RedShift spectrum と Athenaの違い

## 勉強前のイメージ
athenaは先輩が前使ってたなー
S3のログファイルにクエリ投げて分析できる奴だった気がする。
RedShiftってデータウェアハウスっていうDBの一種だよな？
spectrumってなんだ・・・

## 結論
どちらも保存データに対してクエリ処理を実行できるツールもしくはサービス。
以下の点で違いがある
■データレイク（S３）に対するクエリ処理　→　athena
■データウェアハウス（RedShift）に対するクエリ処理　→　RedShift spectrum

## じゃあデータレイク/データウェアハウス/データベースの違いって何？
### データレイク
・取得データの加工は一旦考えない
・形式がバラバラな大量のデータを保存したい
（データの分析は後々に回したい）
→このときの「加工せず色々な形式の大量のデータを保存する場所」のことを __データレイク__ という。

保存データはJSONのような整えられたデータだったり、画像・動画のような非構造化データだったりする。
データの形式を気にしないので
・異なる形式のデータを格納可能
・スケーリングが容易なストレージサービスを使うことが多く保存コストは低い
・データ保存時はデータの整形を行わない、保存後の利用時にスキーマを定義してクエリ処理を実行するのでクエリパフォーマンスは低い（スキーマオンリードという）

### データウェアハウス
・データは抽出・変換・ロードしてから保存したい
・データ分析に特化したDBを構築したい、保存データをもとにBIを実施したい
→このときに保存する場所を __データウェアハウス__ という。

データレイクと対になるもので、
・データ保存前にETL処理を実行するのでスキーマオンライト方式
・保存データに対するクエリ処理は高い

### データベース
・トランザクション処理を実行したい
・日常業務のデータ管理
・高速な読み書きがしたい
・データの整合性を重視
→データベース

例として、
ECサイトの注文管理、銀行口座の取引、顧客管理システム等に適している。
ストレージの接続インターフェースについて

# 1.はじめに
代表的なストレージの接続インターフェースであるSATAとSASを勉強したのでここにメモします。


# 2.SATAとは（Serial Advanced Technology Attachment）
HDDと共に進化してきたインターフェースにATAとSCSIの2系統があります。

SATAはATA系の代表であり、SCSI系と比較すると低価格です。

パソコンの内蔵用として主に利用されており、低価格ながらある程度の速度を実現できています。

#### ＜補足＞
そもそものATAはとは、PCの内蔵HDD用インタフェースのIDEを基に，標準化された規格となります。
ATAはパラレル接続であるのに対し、SATAは文字通りシリアル接続です。

# 3.SASとは(Serial Attached SCSI)
ATA系の代表がSATAであるのに対し、SCSI系の代表がSASとなります。

サーバを中心に使用されており、SATAよりも高信頼であることと、より高速転送が可能なことから、SCSIからSASへ移行しつつあります。

#### ＜補足＞
SCSI(Small Computer System Interface)は、長年にわたりストレージの接続規格として利用されてきました。
内蔵にも外付けにも対応し、高信頼性が特長のインターフェースとなります。

SCSIがパラレル接続であるのに対し、SASも文字通りシリアル接続となっています。


# 4.パラレル接続とシリアル接続
パラレル(並列)接続では複数の通信路を使ってデータを転送します。
一方、シリアル(直列)接続は1つの通信路で順番にデータを転送します。

ここでいうパラレルの複数の通信路とは、複数ケーブルをつないでという意味ではないです。

パラレル通信の方が速そうに感じますが、同期を取る必要があるなど問題もあるため、
シリアル通信の方が高速で、今はシリアル接続に移りつつあります。


# 5.HDDとSSDの違い
SATAとSASはHDDと共に進化してきたインターフェースです。
HDDとSSDは記憶方式が異なり、SATAやSASではSSDの性能を十分に引き出せません。

そこで開発されたのがNVMe(Non-Volatile Memory Express)です。

NVMeとはSSDなどの不揮発性メモリ向けに開発されたPCleをベースにした通信プロトコルです。(Non-Volatile Memory = 不揮発性メモリ)

ただし、NVMeは通信プロトコルです。接続規格としてはPCleというものになるそうです。

この辺りは学習したら別で書いていきます。


# 6.まとめ
＜費用＞
SATA(ATA系)　＜　SAS(SCSI系)

＜信頼度＞
SATA(ATA系)　＜　SAS(SCSI系)

＜速度＞
SATA(ATA系)　＜　SAS(SCSI系)

費用が高い変わりにSASのが基本的に性能は優れているということのようです。
DAO,DTO,Entity, findAll, findByld

今回はDAO,DTO,Entity、 findAll, findByldについて記事にしていと思います。

1. DAO (Data Access Object)
DAOは、データベースなどから「情報を取り出したり、更新したりするための専用のクラス」です。
たとえば、ゲームのスコアやユーザー情報を取り出す部分をまとめておくのがDAOの役割です。
DAOは、データベースとのやり取りに集中するので、表示や計算などは行わず、あくまでデータの「取得や更新だけ」をします。

2. DTO (Data Transfer Object)
DTOは、データを一つのまとまりにして、別の部分に送るためのクラスです。
たとえば、ゲームの情報（スコア、名前、レベルなど）を一つの箱にまとめて、ほかの場所に渡すために使います。
DTOは、データを保存する箱のようなもので、特別な動作はせず、ただデータを持っているだけです。

3. Entity (エンティティ)
Entityは、データベースのデータをプログラム内で管理するためのクラスです。
たとえば、学校の生徒名簿のように、名前や年齢、住所などをまとめて管理するためのものです。
Entityは、データベースにある1つの情報（1人の生徒や1つのゲームキャラクターなど）に対応することが多いです。

DAO,DTOの例
```java
// DTO: UserDto
public class UserDto {
    private String username;
    private String email;

    // getters and setters
}


}
// DAO: UserDao
public class UserDao {
    public User findById(int id) {
        // データベースからIDでユーザーを検索する処理
        return new User();
    }
    }

public List<User> findAll() {
        // 全ユーザーを検索する処理
        return new ArrayList<>();
    }
}
```
Entity (エンティティ)の例
エンティティはデータベースのテーブルに対応するクラスです。フィールドはテーブルの列に対応し、オブジェクト関係マッピング（ORM）を使用してデータベース操作を簡略化します。
例
```Java
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String username;
    private String email;

    // getters and setters
}
```

UserDaoのコンストラクタ実装
UserDaoクラスのコンストラクタを実装します。コンストラクタ内で必要な依存関係を注入します。
例
```Java
public class UserDao {
    private EntityManager entityManager;

    // コンストラクタでEntityManagerを受け取る
    public UserDao(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}
```
コンストラクタは、「オブジェクトを作るときに必要な準備をするための特別な関数」です。
UserDaoでは、データベースとやり取りする道具（EntityManager）**をコンストラクタで渡してあげないと、データベースにアクセスできません。
だから、コンストラクタを実装する理由は、「データベースとの接続に必要な道具を最初に準備するため」です。

1. findAllとは？
findAllは、「すべてのデータを集めてきてね！」という命令です。データベースの中にたくさんの情報（たとえば、学校のクラスの全員の名前や成績）が入っているとしたら、その全部を取り出すために使います。

たとえば： もし「クラスの全員の名前を知りたい！」と思ったら、このfindAllを使って、「クラスの全員の情報を全部持ってきて！」と命令できます。
例
```Java
public List<User> findAll() {
    // データベースの中にある「全員」の情報を集めて、リストにして返す
    return entityManager.createQuery("SELECT u FROM User u", User.class).getResultList();
}
```
この命令では、「User」というクラスの全員の情報をリストとして集めてくれます。


2. findByIdとは？
findByIdは、「特定のID（番号）に対応するデータを取ってきて！」という命令です。たとえば、「クラスの中からID番号が5番の生徒の名前だけ知りたい！」というときに使います。

たとえば： もし「IDが5番の人が誰か知りたい！」と思ったら、このfindByIdを使って、「IDが5番の情報を持ってきて！」と命令できます。
例
```Java
public User findById(int id) {
    // 指定されたIDの人の情報をデータベースから探して返す
    return entityManager.find(User.class, id);
}
```
この命令では、「IDが〇〇番のUser（人）」を見つけてその人の情報を返してくれます。
Unityアプリケーションでアイコンと名前を設定する方法

# Unityアプリケーションでアイコンと名前を設定する方法

Unityでアプリケーションを開発する際、アイコンや名前を設定することは、ユーザーにとってアプリを認識しやすくするために非常に重要です。この記事では、Unityでアプリケーションのアイコンと名前を設定する手順をわかりやすく解説します。

## 1. アイコンの設定方法

### ステップ1: アイコン画像の準備

最初にアプリで使用するアイコン画像を用意しましょう。  
**推奨サイズ**は、**1024x1024ピクセル** の正方形のPNG形式です。アイコンは複数のデバイスで使われるため、正方形の高解像度画像を用意することが重要です。

### ステップ2: アイコン画像のインポート

1. 作成したアイコン画像をUnityの **Assets** フォルダにドラッグ＆ドロップしてインポートします。
2. インポート後、アイコン画像が正しく表示されているか確認しましょう。

### ステップ3: アイコンの設定

1. Unityメニューの **File** から **Build Settings** を開きます。
2. **Build Settings** ウィンドウで、右下の **Player Settings** ボタンをクリックします。
3. **Player Settings** ウィンドウの左側にある **Resolution and Presentation** タブを選択し、下にスクロールして **Icon** セクションを探します。
4. インポートしたアイコン画像を、各プラットフォーム（Android、iOS、PCなど）のアイコンサイズにドラッグして割り当てます。

各プラットフォームで異なるアイコンサイズが必要な場合は、ここでそれぞれのサイズに対応するアイコンを設定できます。

## 2. アプリケーション名の設定方法

### ステップ1: アプリケーション名の変更

1. 再び **Player Settings** ウィンドウを開きます（**File** → **Build Settings** → **Player Settings**）。
2. **Product Name** の欄にアプリケーション名を入力します。この名前が、デバイスのホーム画面やアプリケーションリストで表示される名前となります。

### ステップ2: iOS向けアプリ名の設定（iOSの場合）

iOS向けにアプリをビルドする場合、**iOS** タブの設定も行います。

1. **Player Settings** の **iOS** タブをクリックします。
2. **Other Settings** を展開し、**Bundle Identifier** などの情報も正確に入力しましょう。これにより、App Storeにアップロードする際の識別子が設定されます。
WordVBAでセクション区切り等の編集記号を一括削除する

# Wordでの編集記号の削除
Wordで、セクション区切りや手動改ページ等の編集記号を一括削除したいことがあると思います。
標準機能の置換機能を利用して編集記号（例：^m　→手動改ページ）を覚えていれば置換可能ですが、覚えるのも面倒ですよね。

そこで、個人的によく利用する編集記号はWordVBAで削除すると便利です。
※noteでの同様の記事をアップロードしています。記事は[こちら](https://note.com/keiri_info/n/naaa66e0e9070)。

```vb:WordVBA
Sub sbアクティブドキュメントのセクション区切り削除()
    Call sbドキュメントの特殊記号削除(ActiveDocument, "^b")  '^b:セクション区切り
End Sub

Sub sbアクティブドキュメントの手動改ページ削除()
    Call sbドキュメントの特殊記号削除(ActiveDocument, "^m")  '^m:手動改ページ
End Sub

Sub sbドキュメントの特殊記号削除(a_対象doc As Document, a_deleteText As String)
    Call sbSetting(True)  '画面更新OFF等の初期設定ON
   
    ' ドキュメント内の指定した特殊記号を削除
    With a_対象doc.Content.Find
        .ClearFormatting
        .Text = a_deleteText '可変
        Do While .Execute(FindText:=a_deleteText, ReplaceWith:="", Replace:=wdReplaceAll)
            ' 指定した特殊記号が見つかる限り実行
        Loop
    End With
    
    Call sbSetting(False)   '画面更新OFF等の初期設定OFF

End Sub

Public Sub sbSetting(flg As Boolean)
  If flg Then
    Application.ScreenUpdating = False                  '画面更新の停止
    Application.DisplayAlerts = False                   '画面警告の表示の停止
  Else
    Application.ScreenUpdating = True                   '画面更新の開始
    Application.DisplayAlerts = True                    '画面警告の表示の開始
  End If
End Sub
```
フローを使った項目の更新



+ [ロングテキストエリアはFlowでは使えない？](https://qiita.com/Keiji_otsubo/items/0a5c3ee9cbdaa13c41be)
+ [フローを使って複数選択リストを更新する](https://qiita.com/Keiji_otsubo/items/3e21d4ccee8f6e23c8ad)
+ [複数選択リストの解析はもう問題ありません](https://qiita.com/Keiji_otsubo/items/a2e443a073d682b39f4e)
+ [複数の選択リストによってトリガーされるフロー](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YwNnrSAF)
+ [フローを使って連番を取得する](https://qiita.com/Keiji_otsubo/items/12bac37691f8cbf3ed90)
+ [「カスタムの「自動採番」フィールドを生成するフローを「バルク化」するにはどうすればよいですか」](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000LIMhG)
+ [フローを使用した参照関係にある子オブジェクトの特定のレコード情報の取得について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UQGb7)

+ [フローの「関連レコードを更新」で自動で反映がされない理由ご存じでしょうか](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007W8QRPSA3)

:::note
レコード更新要素内の[関連レコードを更新]とは、「関連先に商談が紐づいている前提」のようでした。

今回の原因は、私共の組織では活動オブジェクトにカスタム項目として[商談]を作成しておりました。そのカスタム[商談]をToDoに使用しており、[関連先]には別のレコードを充てていました。

そのことが原因だったので、[関連レコードを更新]ではなく[該当レコードの詳細を設定]では更新ができました。
:::
KVM上でamazon linux2023

## amazon linux2023イメージのダウンロード
https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/outside-ec2-download.html

例：al2023-kvm-2023.5.20240916.0-kernel-6.1-x86_64.xfs.gpt.qcow2
https://cdn.amazonlinux.com/al2023/os-images/2023.5.20240916.0/kvm/

## cloud-init用のデータを作成

適当なディレクトリを作って、以下の３ファイルを作成
例では、/mnt/ssd1/kvm/init/al2023/ に作成

vi meta-data
~~~
local-hostname: al2023
~~~

vi user-data
~~~
#cloud-config
#vim:syntax=yaml
users:
  - default
  - name: testuser
    groups: sudo
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    plain_text_passwd: testpass1234
    lock_passwd: false
chpasswd:
  list: |
    ec2-user:amazon
~~~

vi network-config
~~~
version: 2
ethernets:
  virtio:
    addresses:
      - 192.168.0.25/24
    gateway4: 192.168.0.1
    nameservers:
      addresses:
        - 194.168.0.1
~~~
※network-config で指定したが、なぜかdhcpになってしまったので、後で修正

## バーチャルマシンの作成
/mnt/ssd1/kvm がkvmのイメージディレクトリの例です

~~~
virt-install \
    --memory 2048 \
    --vcpus 2 \
    --name AL2023 \
    --disk /mnt/ssd1/kvm/al2023-kvm-2023.5.20240916.0-kernel-6.1-x86_64.xfs.gpt.qcow2,device=disk,bus=virtio,format=qcow2 \
    --osinfo detect=on,require=off \
    --network bridge=br0 \
    --virt-type kvm \
    --graphics none \
    --noautoconsole \
    --import \
    --cloud-init user-data="/mnt/ssd1/kvm/init/al2023/user-data,meta-data=/mnt/ssd1/kvm/init/al2023/meta-data,network-config=/mnt/ssd1/kvm/init/al2023/network-config" 
~~~

## 初回起動時
ec2-userでログインするとパスワード変更が求められますので、設定してください

## sshで鍵無ログイン可能に設定
vi /etc/ssh/sshd_config
~~~
#AuthorizedKeysFile     .ssh/authorized_keys
PasswordAuthentication yes
~~~

## ipアドレス固定化
vi /etc/systemd/network/10-cloud-init-ens2.network
~~~
[Match]
MACAddress=xx:xx:xx:xx:xx:xx
Name=ens2

[Network]
#DHCP=ipv4
Address=192.168.0.25/24
Gateway=192.168.0.1
DNS=192.168.0.1
~~~
DHCP=ipv4をコメントアウトして、Address、Gateway、DNSを設定します

systemctl restart systemd-networkd
JavaScriptの正規表現

# JavaScriptの正規表現（Regular Expressions、略して「regex」）  
特定の文字列パターンを検索・一致させるための便利なツールです。

## 1. 正規表現の基本的な使い方
正規表現は、文字列に対して「検索」や「置換」を行うときに使用します。  
JavaScriptでは、`/pattern/flags` という形式で記述します。  
  
例:  

```javascript
const regex = /abc/;
```
この正規表現は、"abc" という文字列を探します。

## 2. フラグ
正規表現にはいくつかの「フラグ」を追加して、検索の方法を変更できます。  
よく使われるフラグを紹介します：

- `g（global）`: グローバル検索。すべての一致を探します
- `i（ignore case）`: 大文字と小文字を区別しません
- `m（multiline）`: 複数行モードでの検索を可能にします  
例:

``` javascript
const regex = /abc/gi;
```
この例は、"abc" という文字列を大文字・小文字を無視して、すべての一致を探します。

## 3. 特殊文字
正規表現には、特定の文字を表す「特殊文字」があります。  
これを使って、より複雑なパターンを作成できます。  

- `.`：任意の1文字に一致（改行以外）
- `\d`：数字（0-9）に一致
- `\w`：英数字またはアンダースコアに一致
- `\s`：空白文字（スペース、タブ、改行など）に一致  
例:

``` javascript
const regex = /\d\d\d/;
```
これは、3つの連続した数字に一致します（例: "123"）。

## 4. 繰り返し
特定のパターンを繰り返す場合、量指定子を使います。

- `*`：0回以上の繰り返し
- `+`：1回以上の繰り返し
- `?`：0回または1回の繰り返し
- `{n}`：n回の繰り返し
- `{n,}`：n回以上の繰り返し
- `{n,m}`：n回からm回の間の繰り返し  
例:

``` javascript
const regex = /\d{3,5}/;
```
これは、3～5桁の数字に一致します。

## 5. キャラクタクラス
複数の文字の中からいずれかに一致させる場合、[]を使います。  

例:

``` javascript
const regex = /[abc]/;
```
この正規表現は、"a"、"b"、または"c"のいずれかに一致します。  
さらに、[^abc]のように^を使うと、「a」「b」「c」以外の文字に一致させることができます。

## 6. エスケープ
特殊文字自体を検索したい場合は、その前にバックスラッシュ (\) を使ってエスケープします。  

例:

``` javascript
const regex = /\./;
```
これはピリオド自体を検索します（.は任意の1文字ではなく、ピリオドとして扱われます）。

## 7. マッチ、置換、検索
JavaScriptでは正規表現を使って文字列操作が可能です。  
代表的なメソッドを紹介します：

- `match()`: パターンに一致する部分を配列で返します
- `replace()`: 一致した部分を他の文字列に置換します
- `test()`: パターンが一致するかどうかを真偽値（trueまたはfalse）で返します  
例:

``` javascript
const text = "abc123";
const regex = /\d+/;
console.log(text.match(regex));  // ["123"]
console.log(text.replace(/\d+/, "456"));  // "abc456"
console.log(regex.test(text));  // true
```
## 8. まとめ
- 正規表現は、パターンを使って文字列を検索するための強力なツールです。
- 基本的な使い方や特殊文字、繰り返し、キャラクタクラスを理解することで、複雑なパターンも扱えるようになります。
- JavaScriptには、`match`、`replace`、`test` などのメソッドがあり、実際の文字列操作に使えます。
[tips][Go] Goの値レシーバとポインタレシーバの違い

# Golangの値レシーバとポインタレシーバの違い

Golangの値レシーバとポインタレシーバの振る舞いの違いについて備忘録です。
また、ポインタから値レシーバの暗黙呼び出しについても書いておきます。

Golangには値レシーバとポインタレシーバがあります。

構造体
```go
type Account struct {
	Id int
}
```

値レシーバ
```go
func (a Account) Set(id int) {
	a.Id = id
}
```

ポインタレシーバ
```go
func (a* Account) Set(id int) {
	a.Id = id
}
```

## 値レシーバとポインタレシーバの振る舞いの違い

値レシーバはメソッド呼び出しごとに変数がコピーされてその変数に対して実行されます。なので、宣言じの変数の値は変更されません。

ポインタレシーバは、宣言時のメモリアドレスを持つ変数に対してメソッドが実行されます。
以下の例では値レシーバのメソッド`Add`は何回呼び出しても元の変数の値はそのままです。
ポインタレシーバのメソッド`AddPointer`は呼び出す度に元の値に対して値が加算されます。初期値は宣言時の`3`で、$\{5,6,7\}$ を加算しています。最終結果は`21`です。


```go
package main

import (
	"fmt"
)

type Account struct {
	Id int
}

func (a Account) Add(id int) {
	a.Id += id
}

func (a Account) Set(id int) {
	a.Id = id
}

func (a *Account) AddPointer(id int) {
	a.Id += id
}

func (a *Account) SetPointer(id int) {
	a.Id = id
}

func main() {

	a := Account{Id: 3}
	fmt.Println(a)
	fmt.Printf("宣言時のアドレス :%p\n", &a)
	// {3}
	// 値レシーバのメソッドは何回加算しても宣言時の変数は変わらない
	a.Add(5)
	a.Add(6)
	a.Add(7)
	fmt.Println(a)
	// {3}

	a.Set(7)
	fmt.Println(a)
	// {3}

	a_p := &Account{Id: 3}
	fmt.Println(*a_p)
	// fmt.Printf("変数uに格納されているアドレス :%p\n", &a_p)
	// {3}
	// ポインタレシーバメソッド呼び出しでメンバ変数の値変更
	a_p.AddPointer(5)
	a_p.AddPointer(6)
	a_p.AddPointer(7)
	fmt.Println(*a_p)
	// {21}

	a_p.SetPointer(123)
	fmt.Println(*a_p)
	// {123}

	// コンパイラによる暗黙的呼び出し
	// ポインタ型変数から値型レシーバのメソッドも呼び出せる
	a_p.Add(999)
	fmt.Println(*a_p)
	// 値コピーされるので、宣言時の変数は変更されない
	// {123}

	// !!! The following code cause panic due to nil !!!
	// var nilant *Account
	// nilant.Update(999)
	// panic: runtime error: invalid memory address or nil pointer dereference
	// [signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x104c74a4c]

}

```

## ポインタから値レシーバの暗黙的呼び出し

ポインタで宣言したメソッドから値レシーバのメソッドを呼び出すことができます。
これは、Golangのコンパイラが暗黙的に呼び出してくれるようです。
（詳しいことはわかりません）

この場合も、値レシーバなので、ポインタ変数の値はそのままです。
直前の変更後の値がそのまま出力されます。

```go
a_p.Add(999)
fmt.Println(*a_p)
// 123
```