OmniAICreator/Qiita-1.07M huggingface dataset:
【2進数計算】なぜ「全ての位の値を反転させて1を加える」とマイナスになるのか、言語化して理解する

# 初めに
最近コンピュータの動き方について学んでいて、2進数の計算の章に入りました。
その中で、2進数でマイナスの値を求める際は
* **全ての位の値を反転させる**
* **それに1を加える**

という方法で求めるということを知り、「？」となりました。
直感では理解できなかったので、「なぜ？」を理解しながらまとめていきます。

※数学は初心者なので細かいことを言えば違うのかもしれないですが、覚えるための理由付けくらいにはなるかなと思います

# 2進数でマイナスの値を表現する

まずは、2進数のマイナスの表現の仕方をおさらいしましょう。

**例）10進数の-6を4桁の2進数で表すと？**

* 10進数の6を2進数で表すと`0110`となる
* 2進数では最上位の桁で符号を表現する

以上の知識から、**-6は`1110`になりそう！**

・・・と思ったのですが、これは間違いで、正解は`1010`になります。



# マイナスの値の計算方法

冒頭に記載した通り、マイナスの値を求める方法はこちらです。
* **全ての位の値を反転させる**
* **それに1を加える**


暗記すればいいっちゃいいのですが、それだと面白くないので、意味を理解してみようと思います。

# 解説

## 前提①：そもそもプラスとマイナスの関係とは
そもそもプラスとマイナスの関係とはなんでしょうか。
それは、**足して0になる**ということです。
例えば、8と-8や、15と-15など、符号を変えただけの二つの数を足すと0になります。

2進数においてもそれは同じです。

## 前提②：0と10000は、どちらも`0000`
最大桁数がある場合、0はいろんな数で表現することができます。

例として、4桁の2進数で0を表してみましょう。
0は`0000`で表すことができますが、これだけ見ると0なのか10000なのか、区別がつきません。
つまり、**0と10000を同じ数字とみなすことができる**のです。

これらの前提を踏まえると、**足して10000をつくることができれば、その数は元の数をマイナスにした数と考えることができる**ということができます。

## 改めて2の補数の計算を見てみる
ということで、改めて2の補数の計算方法を見ていきましょう。
先ほどと同様、10進数の-6を2進数で表してみます。

### 手順1：全ての位の値を反転させる
2進数の6は`0110`だったため、それを反転した数は`1001`になります。
元の数と足すと、`1111`となり、目標である`10000`には1足りません。

### 手順2：それに1を加える
ということで、1を足して`10000`にしましょう。
`1001`に1を足すと`1010`になり、これが2進数における-6になります。

# まとめ
2進数でマイナスの値を求める手順は、**足して0を求めるための手順を簡略化したもの**と言い換えることができる。

# おまけ：全ての位の値を反転させるとはどういうことか

ところで、なぜ全ての値を反転させると都合よくなるのでしょうか
10進数で考えてみました。

## 10進数で考えてみる

2進数では、全ての位の値を反転させて元の数と足すと、合計が`1111`になりました。
これは、`10000`よりも1少ない数です。

対して、10進数における`10000`より1少ない数字は`9999`です。
つまり、2進数における「全ての位の値を反転させる」とは、10進数における`9999`を作るための手段といえます。

このことから、「全ての位の値を反転させる」とは、**n進数の場合に各桁がn-1になるような値を求める**と言い換えることができます。

2進数の場合、「全ての位の値を反転させる」ことでそれを満たすことができるので、このように言われるというわけです。



# 終わりに
今回は2進数におけるマイナスの数の求め方を学びました。
理由が分かるとすっきりするし、単純暗記よりも記憶に残りますね！

ここまで読んでいただきありがとうございました！


# 参考

https://www.amazon.co.jp/dp/4296000195
DDDのドメインサービスとアグリゲートの違い

## はじめに
DDDを学んでいるんですが、ドメインサービスとアグリゲートの違いが分かりそうで分からない。ので、整理も兼ねて記事にしています。

## ドメインサービス（Domain Service）
・目的：特定のエンティティや値オブジェクトに属さないビジネスロジックをカプセル化するためのサービス。

・構成要素：メソッドのみを持ち、状態を持たない（ステートレス）ことが多い。
必要なデータはメソッドの引数として渡される。

・役割：複数のエンティティやアグリゲートにまたがるビジネスロジックを実装する。
エンティティやアグリゲートに直接関連しない操作や計算を行う。

・使用シナリオ:特定のエンティティやアグリゲートに属さないが、ビジネスロジックとして重要な処理を行う場合。例えば、計算や外部システムとの連携など。

```ts:ドメインサービス
class DiscountService {
  applyDiscount(cart: Cart, discountRate: number): number {
    const totalAmount = cart.cartItems.reduce((total, item) => total + item.total, 0);
    return totalAmount * (1 - discountRate);
  }
}
```

### アグリゲート（Aggregate）
・目的: ドメイン内のデータの整合性を保つために関連するエンティティと値オブジェクトをグループ化する。

・構成要素:アグリゲートルート: アグリゲートの入り口となるエンティティ。他のエンティティや値オブジェクトへの唯一のアクセス手段。
　
・役割:データの整合性を保つために、一緒に操作されるべきオブジェクトの集合を定義する。一貫性の境界を定義し、トランザクションの一貫性を保証する。

・使用シナリオ:一貫性が重要なデータの操作や、エンティティ間の整合性を保つ必要がある場合。
例えば、注文（Order）とその項目（OrderItem）の管理。

```ts:アグリゲート
class Order {
  private items: OrderItem[] = [];

  constructor(private id: string, private customerId: string) {}

  addItem(productId: string, quantity: number, price: number) {
    const item = new OrderItem(productId, quantity, price);
    this.items.push(item);
  }

  get orderDetails() {
    return {
      id: this.id,
      customerId: this.customerId,
      items: this.items.map(item => item.details),
    };
  }
}
```

## まとめ
・責任の範囲:
　アグリゲート: 一貫性の境界を定義し、内部のエンティティや値オブジェクトの整合性を保証します。アグリゲート内の操作はアグリゲートルートを通じて行われます。
　ドメインサービス: 特定のエンティティに属さないビジネスロジックをカプセル化します。複数のエンティティやアグリゲートにまたがる操作や計算を行います。

・データの所有:
　アグリゲート: エンティティや値オブジェクトを所有し、状態を持ちます。
　ドメインサービス: 状態を持たず、データはメソッドの引数として渡されます。

・使用シナリオ:
　アグリゲート: エンティティ間の操作や整合性を保つために使用されます。例えば、注文（Order）とその項目（OrderItem）の管理。
　ドメインサービス: 複数のエンティティやアグリゲートにまたがるビジネスロジックを実装するために使用されます。例えば、カート（Cart）に対する割引の適用。
IBM i Services Directory : QSYS2.License_Info ビュー

[こちら](https://qiita.com/gomAnomalocaris/items/bd364f8887e2301ce70e)のIBM i サービスと同様に導入済みライセンスの情報、キー期限切れを返してくれます。
違いは出力先がSQLの実行元クライアントになる事です。

## 概要
■ビュー名：QSYS2.LICENSE_INFO ビュー
■カテゴリ：プロダクトサービス
■サポート：IBM i 7.2 SF99702 Level 9以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-license-info-view

[SYSTOOLS.License_Expiration_Check プロシージャー](https://qiita.com/gomAnomalocaris/items/bd364f8887e2301ce70e) と同様に導入済みライセンスプログラム、ライセンスキー期限切れについて、SQLの実行元に返します。

## 使用例

***下記の例はライセンスプログラムのうち、ライセンスキーが14日以内に切れるものを返します。***

```
SELECT * FROM QSYS2.LICENSE_INFO
   WHERE LICENSE_EXPIRATION <= CURRENT DATE + 14 DAYS;
```

実行例はこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/58122c72-4970-5e2a-5d4f-74041c28deea.png)

ライセンスプログラムの名称、VER、機械グループ、使用限界、ライセンスキー期限日、使用カウントなどが取得できます


全てのカラムをチェックできていませんが、ICENSE_EXPIRATION_CHECK　との差異は、返す先だと思うので、プログラムや運用上使いやすい方を使えばいいように思います。
DDDのDomainServiceについて学ぶ

## はじめに
DDDのDomainServiceについて学びます。

## DomainServiceとは
ドメイン駆動設計（DDD）において、特定のエンティティや値オブジェクトに属さないビジネスロジックをカプセル化するために使用される概念です。ドメインサービスは、エンティティや値オブジェクトでは表現しづらい操作やビジネスルールを実現するためのものです。

## ドメインサービスの特徴
・エンティティに属さないロジック
複数のエンティティやアグリゲートにまたがるビジネスロジックや、エンティティに直接関連しないロジックを実装します。

・ステートレス:
通常、状態を持ちません。必要なデータはメソッドの引数として渡されます。これにより、再利用性が高まります。

・ビジネスロジックの集中:
ドメインサービスは、ビジネスロジックを一箇所に集中させることで、コードの可読性と保守性を向上させます。

## 具体例：eコマースシステムにおけるドメインサービス

・シナリオ
顧客がカートに商品を追加する際に、特定の割引を適用するロジックを実装します。この割引ロジックは、カートや商品エンティティに直接関連しないため、ドメインサービスとして実装するのが適しています。

```ts:エンティティと値オブジェクトの定義
class Product {
  constructor(
    private id: string,
    private price: number
  ) {}

  get productId() {
    return this.id;
  }

  get productPrice() {
    return this.price;
  }
}

class CartItem {
  constructor(
    private product: Product,
    private quantity: number
  ) {}

  get itemTotal() {
    return this.product.productPrice * this.quantity;
  }

  get details() {
    return {
      productId: this.product.productId,
      quantity: this.quantity,
      total: this.itemTotal,
    };
  }
}

class Cart {
  private items: CartItem[] = [];

  addItem(product: Product, quantity: number) {
    const item = new CartItem(product, quantity);
    this.items.push(item);
  }

  get cartItems() {
    return this.items.map(item => item.details);
  }
}
```

```ts:ドメインサービスの定義
class DiscountService {
  applyDiscount(cart: Cart, discountRate: number): number {
    const totalAmount = cart.cartItems.reduce((total, item) => total + item.total, 0);
    return totalAmount * (1 - discountRate);
  }
}
```

```ts:使用例
const product1 = new Product('product-1', 100);
const product2 = new Product('product-2', 200);

const cart = new Cart();
cart.addItem(product1, 2); // 2 items of product-1
cart.addItem(product2, 1); // 1 item of product-2

const discountService = new DiscountService();
const totalAfterDiscount = discountService.applyDiscount(cart, 0.1); // 10% discount

console.log(cart.cartItems);
// Output: [{ productId: 'product-1', quantity: 2, total: 200 }, { productId: 'product-2', quantity: 1, total: 200 }]
console.log(totalAfterDiscount);
// Output: 360 (10% discount applied to total of 400)
```
### ドメインサービスのポイント
・再利用性: ドメインサービスを使用することで、ビジネスロジックを複数のエンティティから切り離し、再利用しやすくなります。
・シンプルさ: エンティティ自体をシンプルに保ち、エンティティに直接関係しないロジックを別のクラスに切り出すことで、コードの可読性と保守性を高めます。
・一貫性: ビジネスロジックを一箇所に集中させることで、一貫したルールの適用を保証します。
HTMLだけで<input>要素の内容を正規表現で制限する方法

Web制作にてフォームを作成する場合、特定の形式に従ったデータを受け取ることが重要となります。

意図しない形式での入力はバグの発生やセキュリティリスクにつながります。

基本的には入力された内容をバックエンドにて精査し利用していく流れになるかと思います。

より精度を上げる為、フロントエンドでも制限を行っている方は多いのではないでしょうか？

そこで今回はHTMLだけで<input>要素の内容を正規表現で制限する方法についてご紹介致します。

## 属性紹介

![FROM001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/b9b6a191-f4e9-f04e-67ae-5f635ac00523.png)

input要素の入力内容を正規表現で制限するには「pattern」属性を使用する事で実装する事が出来ます。

「pattern」属性は「text」「tel」「email」「url」「password」「search」タイプにて利用できる入力型の属性トとなっております。

詳細な仕様につきましてはmozillaの公式サイトをご確認よろしくお願い致します。

[mozilla公式サイト](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/pattern)

## 使用方法

次に「pattern」属性の使用方法について解説致します。

「pattern」属性は下記の様にinput要素に指定できます。

```
<input type="text" pattern="正規表現" title="エラーメッセージ">
```

pattern属性に正規表現を指定し、title属性で指定外の値が入力された場合のエラーメッセージを記載します。

今回は例としてパスワード入力エリアを正規表現で制限してみます。

前提条件は以下となります。

* 8文字以上
* 数字を1つ以上含める
* 特殊文字を1文字以上含める

下記コードとなります。

```
<input type="password" id="password" name="password" pattern="(?=.*\d)(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z]).{8,}" title="規格外のパスワードとなります。">
```

## 事例紹介

いかがでしょうか？「pattern」属性を指定する事で入力エリアの内容を正規表現で制限する事が出来ました。

では実際の活用事例をご紹介します。

![FROM002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/aa16bd05-8dbc-3edd-62e5-7132b337b6d5.png)

[IPアドレス住所検索サービス](https://ip.r1999.com/)

上記はローカル環境のみでIPアドレスの住所を検索できるサービスとなっております。

該当サービスの検索フォームでは「pattern」属性を使用し簡易的に入力条件を制限しております。

![FROM003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/a9ad38e0-35b4-ca00-c567-c7389d3363f0.png)

完全な規制ではございませんが上記の画像の様に明らかに間違ったパターンを入力した際はエラーとなる様に設定されております。

## 注意点

「pattern」属性はHTML5より導入された属性となっております。

その為、一部の古いブラウザーでは非対応となる場合がございます。

またクライアントサイドでの動作となる為、利用ユーザーにより制限を変更、削除する事が可能となっております。

その為、サーバーサイドでの検証、制限も重要となっております。

用途に合わせてご設定をよろしくお願い致します。
DDDで出てくるアグリゲートとは

## はじめに
DDDを学んでいく中でアグリゲートというワード。なかなか理解できないので、調べながらわかった事を記事にしていきます。

## アグリゲートとは
ドメイン駆動設計（DDD）の中心的な概念の一つであり、データの整合性を保ちながらドメインの複雑さを管理するための方法です。アグリゲートは、関連するエンティティと値オブジェクトを一つの単位としてまとめ、それらの間の操作を統制します。ここで重要なのは、アグリゲート全体として一貫性を保つことです。

## アグリゲートのポイント

### アグリゲートルート (Aggregate Root):
アグリゲートの入り口となるエンティティ。外部から直接操作できる唯一のエンティティです。アグリゲート全体の整合性を保証する責任を持っています。

### エンティティ (Entity):
一意の識別子を持ち、アグリゲートルートに従属するエンティティ。
アグリゲート内でのみ操作され、外部から直接操作されることはありません。

### 値オブジェクト (Value Object):
識別子を持たず、属性によって識別される不変のオブジェクト。
状態を持たないため、操作されることはなく、アグリゲートルートやエンティティに属します。

## 具体例：注文 (Order) アグリゲート

```ts:値オブジェクトの定義
class Address {
  constructor(
    private street: string,
    private city: string,
    private zipCode: string
  ) {}

  get fullAddress() {
    return `${this.street}, ${this.city}, ${this.zipCode}`;
  }
}
```

```ts:エンティティの定義
class OrderItem {
  constructor(
    private productId: string,
    private quantity: number,
    private price: number
  ) {}

  get total() {
    return this.quantity * this.price;
  }

  get details() {
    return {
      productId: this.productId,
      quantity: this.quantity,
      price: this.price,
    };
  }
}
```

```ts:アグリゲートルートの定義
class Order {
  private items: OrderItem[] = [];

  constructor(
    private id: string,
    private customerId: string,
    private shippingAddress: Address
  ) {}

  addItem(productId: string, quantity: number, price: number) {
    const item = new OrderItem(productId, quantity, price);
    this.items.push(item);
  }

  removeItem(productId: string) {
    this.items = this.items.filter(item => item.details.productId !== productId);
  }

  changeShippingAddress(newAddress: Address) {
    this.shippingAddress = newAddress;
  }

  get orderDetails() {
    return {
      id: this.id,
      customerId: this.customerId,
      shippingAddress: this.shippingAddress.fullAddress,
      items: this.items.map(item => item.details),
      total: this.items.reduce((sum, item) => sum + item.total, 0),
    };
  }
}

```

```ts:リポジトリの定義
interface OrderRepository {
  findById(id: string): Order | null;
  save(order: Order): void;
}

class InMemoryOrderRepository implements OrderRepository {
  private orders: Map<string, Order> = new Map();

  findById(id: string): Order | null {
    return this.orders.get(id) || null;
  }

  save(order: Order): void {
    this.orders.set(order.orderDetails.id, order);
  }
}
```

```ts:使用例
const address = new Address('123 Main St', 'Anytown', '12345');
const order = new Order('order-1', 'customer-1', address);

order.addItem('product-1', 2, 100);
order.addItem('product-2', 1, 200);

const orderRepository = new InMemoryOrderRepository();
orderRepository.save(order);

const savedOrder = orderRepository.findById('order-1');
if (savedOrder) {
  console.log(savedOrder.orderDetails);
  // Output: Order details with items and total
}

```

### アグリゲートの重要性
一貫性の維持: アグリゲートは、一貫性を保つための単位です。アグリゲート内の全てのエンティティと値オブジェクトの整合性を保証します。
責任の集中: アグリゲートルートが一貫性と操作の責任を持つことで、コードの分かりやすさと保守性が向上します。
外部からの制御: アグリゲートルートを通じてのみ操作が行われるため、データの不整合を防ぎます。
【Python】break文とcontinue文

whileループでよく使われる制御構文として、`break`と`continue`があります。それぞれループの進行を制御するための重要な役割を果たします。
# break文
break文はループを即座に終了させるために使用します。`break`が実行されると、その時点でループから抜け出します。while文の条件が`True`でも、`break`が実行されるとループが終了します。
## breakのサンプルコード
```python
# 無限ループとbreakを使った例
count = 0

while True:
    print("Count is:", count)
    count += 1
    if count == 5:
        break  # countが5になったらループを終了
```
説明: このコードは`count`が5になるまでカウントを増やし続け、`count`が5になった時点でbreak文によってループを終了します。
# continue文
continue文はループの現在の反復をスキップし、次の反復に進むために使用します。`continue`が実行されると、以降のコードは実行されずに次のループの開始に戻ります。
## continueのサンプルコード
```python
# 3の倍数をスキップする例
count = 0

while count < 10:
    count += 1
    if count % 3 == 0:
        continue  # 3の倍数の場合は次の反復にスキップ
    print("Count is:", count)
```
説明: このコードは、`count`が3の倍数の場合はその反復をスキップし、それ以外の数字だけを表示します。
# breakとcontinueを組み合わせたサンプルコード
```python
count = 0

while count < 10:
    count += 1
    if count == 5:
        break  # countが5になったらループを終了
    elif count % 2 == 0:
        continue  # countが偶数の場合は次の反復にスキップ
    print("Count is:", count)
```
説明: このコードは`count`が5になるとループを終了し、`count`が偶数の場合はその反復をスキップします。つまり、`count`が1, 3のときだけ`print`が実行されます。
# まとめ
- break文: ループを即座に終了するために使います。ループから抜け出したいときに便利です。
- continue文: 現在の反復をスキップし、次の反復に進むために使います。特定の条件のときに、その回の処理を飛ばしたいときに便利です。

これらの制御構文を使うことで、`while`ループの動作をより細かく制御できるようになります。理解を深めるために、いくつかの例を試してみてください。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)
研修で学んだ知識が付け焼き刃になる理由

## はじめに

この記事は、研修で学んだ内容が付け焼き刃になってしまう理由とその対策について紹介します。

次のような経験はありませんか。
- 研修で学んだことを覚えていない
- 研修で学んだことが曖昧
- 聞いたときは理解していたはずなのに

## 先に結論
研修で学んだ内容が付け焼き刃になってしまうのは、**思い出そうとしていないから**

## 付け焼き刃になる理由

学んだことが付け焼き刃になる理由は、覚えていないからです。

覚えていない理由は、**思い出そうとしていないから**だと考えられます。

書籍[『科学的根拠に基づく最高の勉強法』](https://amzn.asia/d/gwpnf7I)では、科学的に効果が高い勉強法を紹介しています。

そこで最初に出てくるのが「アクティブリコール」です。

> まず、学ぶために決定的に重要なのが「アクティブリコール(Active Recall)」です。

アクティブリコールとは、「勉強したことや覚えたいことを能動的に思い出すこと、記憶から引き出すこと」です。

一言で言えば、「**思い出そうとすること**」です。

書籍[『科学的根拠に基づく最高の勉強法』](https://amzn.asia/d/gwpnf7I)を読む時間がない方は、Youtubeの動画がおすすめです。アクティブリコールについて理解できます。

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

## アクティブリコールを実践した結果

私はアクティブリコールを知ってから、積極的にアクティブリコールを実践しました。

例えば、このようにQiitaで記事を書くのもアクティブリコールの一つです。
研修が終わった後は、研修の内容を思い出そうとする時間をつくりました。本を読んだ後は、本の内容を振り返る時間をつくりました。

その結果、これまでの人生で感じたことがない定着率を実感できました。

研修や本で学んだことが、実際に活かせる場面が激増しました。

## おわりに

この記事では、アクティブリコールを紹介しました。

ぜひ実践してみてください。

## 参考

[「科学的根拠に基づく最高の勉強法」](https://amzn.asia/d/gwpnf7I)
Staybook Hotel Jai Balaji New Delhi Railway Station

Hotel Staybook Jai Balaji Paharganj New Delhi, New Delhi, offers a blend of comfort and tradition in the heart of the bustling city. With its elegant rooms, attentive service, and convenient location, it's an ideal choice for both business and leisure travelers. Explore Delhi's rich history and vibrant culture while experiencing the warmth of Hotel Jai Balaji's hospitality.

![202206081652173967-fa22c58ce26411edb34a0a58a9feac02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820362/5b5984b1-7c52-1220-a25c-eff4e82ba34f.jpeg)

Hotel Jai Balaji, New Delhi, gives you a mix of cozy comfort and classic charm right in the city's lively center. Its stylish rooms, friendly staff, and central spot make it perfect for business and leisure guests alike. Discover Delhi's fascinating history and lively atmosphere while experiencing the warm hospitality of Hotel Jai Balaji.

![jai balaji image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820362/d1f176d5-6195-7dd1-51c0-207ca814b7e2.jpeg)
Book Your Stay at staybook Hotel Jai Balaji Paharganj, New Delhi
初心者向け ESP32-DevKitC-32Eを動かす

# 前段
初心者が、ESP32をひとまず動かせるようになるまでを記録した記事です。
なおESP32-DevKitC-32について調べたところ、32Eが最新版のようです。

# 目標
ESP32-DevKitC-32Eで、Lチカさせること。
Lチカとは「LEDをチカチカさせる」という言葉の略称です。つまり、LEDを点滅させることです。
本電子工作にあたって、初めて知った言葉です。

# 投稿者の経験値
電気、電子および情報工学系の知識はほとんどないです。
電子工作もはじめてに等しいです。

# 材料
https://item.rakuten.co.jp/akibaoo-r/hm000099354/

https://akizukidenshi.com/catalog/g/g115673/

https://akizukidenshi.com/catalog/g/g125331/

https://akizukidenshi.com/catalog/g/g111577/

# 環境設定
## ハード側での設定
### COMポート番号を確認する
1. ESP32-DevKitC-32EとPCをmicroUSBケーブルで接続します
2. デバイスマネージャーを開きます
3. ポート（COMとLPT）を開きます
4. Silicon Labs CP210x USB to UART Bridge(COMn)でCOMポート番号を確認します。nは数字です
### ESP32-DevKitC-32Eを動作できる状態にする
1. ESP32-DevKitC-32Eをブレッドボードに挿します
この際、しっかり差し込む必要があります。思ったよりずっと深くささります
ブレッドボードを触るのも初めてで、怖かったのですが思い切って差し込みました

## ソフト側での設定
VSCodeにPlatformIO IDEをインストールして、VSCodeで開発を行います。
1. VSCode起動
2. 拡張機能で　PlatformIO IDE　を検索
3. PlatformIO IDE　をインストールする
4. PIO Home　で新規にプロジェクトを作成する
5. 以下のようにコーディングする

platformio.ini
```
<前略>
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_port = {COM番号} ; 上記ハード側での設定-手順4で、COM1だった場合「1」が入ります
```
main.cpp
```
#include <Arduino.h>

#define LED_PIN 4

void setup()
{
  pinMode(LED_PIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_PIN, HIGH);
  delay(2000);
  digitalWrite(LED_PIN, LOW);
  delay(2000);
}
```

# 参考文献
https://zenn.dev/kotaproj/articles/esp32_vscode_pio
microbitを使ったサーボモーターの動作でハマった件

## 最終目的は愛猫用自動給餌機

愛猫のために自動給餌機を作ろうと思い立ち、サーボモーターを使って貯蔵庫から一定量のフードを出す仕組みを考えました。
しかし、いろいろ試しているうちにサーボモーターがうまく動かなくなる問題に直面しました。

### サーボモーターが思うように動かない？

**問題の症状**：
- 一定量動かなくなる。あと壊れたようにプルプル震える。

3回目で180°になるはずが利かない。
Bボタン押下して戻した後の動きも怪しい・・・具合悪いのかな？
![servomove01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326450/0c70cc91-8c32-6b87-b3c8-9f045ea2eddc.gif)

**ソースコード**：（Aボタン押下で60°ずつ回転。Bボタンで0°に戻る。）
![microbitsource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326450/08458b83-f5f7-f65d-c22b-76c53f78370f.png)


原因を探るために、次のようなアプローチを試みました。

### 1. 電源が足りない？

**試したこと**：
- **当初**：PCのUSB端子から電力を供給。
  - **結果**：問題解決せず。
- **1A出力のモバイルバッテリー**を使用。
  - **結果**：変わらず。
- **最大3A出力のモバイルバッテリー**を使用。
  - **結果**：変わらず。
- **2A以上出力可能なUSB ACアダプター**を使用（安定供給を狙い）。
  - **結果**：気持ち安定したが、問題解決せず。

### 2. サーボモーターが壊れてる？

**試したこと**：
- **Aliexpressで購入したSG90**に交換。
  - **結果**：余計に壊れていた（モーター音だけで全くアームが動かない）。
- **同じ製品の別の個体**を使用。
  - **結果**：全く同じ動き。

### 3. シミュレータと実機の違い？

**確認したこと**：
- **シミュレータ**ではサーボモーターが360°以上回転。
  - **現象**：1260°ってなんだよ！？ってレベルで回る。

グルングルン回転
![servo01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326450/cdd17dfb-26cb-0ee2-ebc4-2f8a09a9a0da.gif)

- **調査**：サーボモーターは180°が普通らしくだいたい170°までで止める様子。
- **試行**：持っているES08MAIIを180°未満で動作させてみた。
**ソースコード**：（3回目を170°までに。それ以降は知らんｗ）
![microbitsource2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326450/c8ea980a-0d8a-32cd-44d0-ee7de7c79135.png)

  - **結果**：問題なく動作。

### 結論

サーボモーターの最大回転角度の仕様が原因でした。持っているサーボモーターは180°までしか回転しないものでした。

**道のりは遠い・・・。**

この経験から、サーボモーターの選び方や電源の重要性を学びました。これからも愛猫のために自動給餌機の完成を目指して頑張ります！




と。。。この記事を書いている時にSG90-HVという360°回転するサーボモーターが到着。
さてどうなることやら。
GitHub Actions学んでみた⑤

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

**「いいね」か「ブックマーク」**
を頂けると僕のモチベーションアップになります！:thumbsup:
少しでも気に入っていただけたらよろしくお願いいたします！:thumbsup:


# 今回の目的
自分の作ったコンポーネントを確認したり検証するための技術を身に付けたい！
公式のクイックスタートを参考に進めていきます。
項目ごとに補足のみ書いて進めています。わかりづらいところの理解の手助けになれば幸いです！

# 主に参考にさせていただいた記事

https://docs.github.com/ja/actions/quickstart

# コンテキスト
## コンテキストについて
ワークフローの実行、変数、ランナーの環境、ジョブ、ステップに関する情報にアクセスする方法
${{}}の式構文でアクセス可能
アクセス方法は２種類
```yml
インデックス構文: github['sha']
プロパティ逆参照構文: github.sha
```

## コンテキストを使用する場合の判断
メインブランチの場合、処理を動かしたいと言う場合はこのパス(refs/heads/main)
```yml
steps:
  - if: ${{ github.ref == 'refs/heads/main' }}
    run: echo "メインブランチ"
```

## 例: ログへのコンテキスト情報の出力
掲載されている例でコンテキストからどんな情報を取得しているか確認できる。


#### github
ワークフロー実行に関する情報

##### github コンテキストの使用例
githubイベントがpull_reqestだった場合に実行
```yml
    runs-on: ubuntu-latest
    if: ${{ github.event_name == 'pull_request' }}
```

#### env
ワークフロー、ジョブ、ステップで設定された変数
step内でenvを指定しなければ上位で指定されたenvが適用される
```yml
env:
  mascot: Mona
...
    steps:
      - run: echo 'Hi ${{ env.mascot }}'  # Hi Mona
      - run: echo 'Hi ${{ env.mascot }}'  # Hi Octocat
        env:
          mascot: Octocat
```

# 次
https://qiita.com/mr_noppo/items/80dfe7111848527ce68e
IBM i Services Directory : SYSTOOLS.License_Expiration_Check プロシージャー

## 概要

■プロシージャー名：SYSTOOLS.LICENSE_EXPIRATION_CHECK プロシージャー
■カテゴリ：プロダクトサービス
■サポート：IBM i 7.2 SF99702 Level 16以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-license-expiration-check-procedure

***導入済みのライセンスプログラムで、指定した日数以内にライセンスキー期限がきれるライセンスプログラムを調べて、該当するものがある場合、その1つ1つをQSYSOPRメッセージキューに送信します。***


## 使用例

```
CALL SYSTOOLS.LICENSE_EXPIRATION_CHECK(10); 
```

上記例では10日間以内にライセンスキーの期限が切れるライセンスプログラムをQSYSOPRメッセージに出力します。

以下は実行例です。
最下行の ***PRODUCT LICENSE EXPIRED ON 04/30/22 - 5ZRDSMB 5050 Compliance Monitoring...***`が当プロシージャーが出力しているものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/286eca78-9119-a3a8-2ee2-d4c113f0c0b2.png)

メッセージの明細は…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6df90b75-c167-2a9e-6490-d49d2de20b54.png)

ほほう、重大度80のメッセージなんですね。80てあまり見ない気がします。

### 上記のライセンスプログラムのライセンスキー期限を確認してみる

上記のライセンスプログラムのライセンス期限を WRKLICINFコマンドで確認してみると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a22079ca-70e9-c24f-ebea-b031b7fed012.png)

QSYSOPRメッセージの出力と一致していることがわかります。（キー満了日が2022/04/30になっている）


## このプロシージャーのユースケースは？

最近ではIBM i ライセンスがサブスクのシステムが増えておりそれらのシステムは有効だと思います。
また、永続ライセンスではライセンスキーが切れることはあまりないとは思いますが、移行計画時などは有用かもしれません。

それを考えると、運用上は　サンプルの10日以内を警告、でなくもっと長めにしておくのが良さそうです。例えば50日や60日で一回出す、など警告時点からライセンスキー発注しても大丈夫というタイムリミットを設けて警告を出すのは良いように思います。
【VSCode】折り返された行をインデントする方法

`editor.wordWrap`を`off`以外に設定しているとコードが折り返されます。  
折り返された行をインデントするには`editor.wrappingIndent`を設定します。  
`cmd + ,`などで設定画面を開き、`editor.wrappingIndent`を検索します。  
`editor.wrappingIndent`を`indent`や`deepIndent`に設定します。  

![image240620_195849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/500b81cf-61d0-7555-a5c3-74e13b1fcc11.png)


または、`settings.json`に以下の記述を追記します。  

```jsonc:settings.json
  "editor.wrappingIndent": "indent"  // または"deepIndent"
```

設定すると以下のように折り返された行がインデントされるようになります。

![image240620_204053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/7274eb3b-2284-4a4d-1f5c-6b973386b461.png)
DDDで出てくるユビキタス言語とは

## はじめに
DDDを学んでいく上でユビキタス言語というワードがあります。
ちょっと調べてみると、ユビキタス言語とは「サービスのターゲット業務や開発に関わるすべての人が、見聞きして同じ意図を連想できる一意の言葉」のようです。
「なるほどなぁ」と実際の業務でも確かに同じような事を無意識的にやっています。
ただ、ユビキタス言語をコードにちゃんと表現していくのが大事なんだろうなぁと思い、コードに落とし込む事をやっていきたいと思います。

https://qiita.com/moromi25/items/d993700b732a7baa1c57

## ユビキタス言語の目的
プロジェクト全体で一貫した用語を使用することで、コミュニケーションの障壁を取り除き、誤解を減らし、ソフトウェアの品質を向上させることを目的としています。

## コードに落とし込む(eコマースのドメインを例に)

### ユビキタス言語の用語
・カート (Cart)
　ユーザーが購入を検討している商品を一時的に保存する場所。

・商品 (Product)
　eコマースサイトで販売されているアイテム。

・注文 (Order)
　ユーザーがカート内の商品を購入するために確定した情報のセット。

・顧客 (Customer)
　サイトを利用して商品を購入する人。
・在庫 (Inventory)
　商品の保管場所や数量を管理するシステム。
・支払い (Payment)
　商品購入に対する金銭のやり取り。


### ドメイン専門家と開発者の会話
ドメイン専門家: 「顧客がカートに商品を追加するプロセスを改善したいです。カートに商品が追加された時点で在庫の数をチェックして、在庫が足りない場合は警告メッセージを表示したいです。」

開発者: 「了解しました。カートに addProductToCart メソッドを追加して、商品が追加されるたびに Inventory サービスを呼び出して在庫を確認します。もし在庫が足りない場合は、 InsufficientInventoryException をスローして警告メッセージを表示します。」

### プログラム

```ts
// 商品エンティティ
class Product {
  constructor(
    private id: string,
    private name: string,
    private price: number
  ) {}

  get productId() {
    return this.id;
  }
}

// カートエンティティ
class Cart {
  private items: Map<string, number> = new Map();

  constructor(private inventoryService: InventoryService) {}

  addProductToCart(product: Product, quantity: number) {
    if (this.inventoryService.isAvailable(product.productId, quantity)) {
      const currentQuantity = this.items.get(product.productId) || 0;
      this.items.set(product.productId, currentQuantity + quantity);
    } else {
      throw new Error('InsufficientInventoryException');
    }
  }

  get cartItems() {
    return Array.from(this.items.entries()).map(([productId, quantity]) => ({
      productId,
      quantity,
    }));
  }
}

// 在庫サービス
class InventoryService {
  private stock: Map<string, number> = new Map();

  isAvailable(productId: string, quantity: number): boolean {
    const availableStock = this.stock.get(productId) || 0;
    return availableStock >= quantity;
  }

  // 在庫を追加するメソッド（例として）
  addStock(productId: string, quantity: number) {
    const currentStock = this.stock.get(productId) || 0;
    this.stock.set(productId, currentStock + quantity);
  }
}

// 使用例
const inventoryService = new InventoryService();
inventoryService.addStock('product-1', 10);

const cart = new Cart(inventoryService);
const product = new Product('product-1', 'Sample Product', 100);

cart.addProductToCart(product, 2);

console.log(cart.cartItems);
// Output: [{ productId: 'product-1', quantity: 2 }]

```

### ユビキタス言語の重要性
一貫性: プロジェクト全体で統一された用語を使うことで、開発者とビジネス側との間で一貫した理解が得られます。
明確なコミュニケーション: 誤解を減らし、明確なコミュニケーションを促進します。
ドキュメントとしてのコード: コード自体がドキュメントの役割を果たし、誰が見ても理解しやすくなります。
(なるほどね。確かにドキュメントとしてのコードって保守開発する上ですごい重要。なるほどなぁ。。。)
REACT Renderについて

# Render
React の ReactDOM.render() メソッドは、React アプリケーション内で仮想DOM（Virtual DOM）の更新をトリガーし、実際のDOMにその更新を反映させるために使用されます。具体的には、このメソッドは指定されたReact要素を指定されたDOMノードにレンダリングします。

通常、ReactDOM.render() メソッドはReactアプリケーションのエントリーポイントとして機能し、以下のように使用されます：

```
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>React App</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="path/to/your/bundle.js"></script>
  </body>
</html>

```


```
import ReactDOM from 'react-dom';
import App from './App'; // レンダリングするReactコンポーネント

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

```
この例では、App コンポーネントを <div id="root"> ノードにレンダリングしています。この方法で、React は App コンポーネント内の変更を検知し、必要に応じてDOMを更新します。

ReactDOM.render() は、React のフックやステートの管理方法を適切に活用することで、効率的で柔軟なUIの構築をサポートします。

```
ReactDOM.render:

1つ目のパラメータは、レンダリングするReact要素(1つの要素や要素のTREEでもよい)です。
2つ目の引数はDOM要素で、Reactコンポーネントのターゲットコンテナをレンダリングします。
```
SPFレコードが確認できるサイト4選!

SPFレコード活用しておりますでしょうか？

SPFレコードはなりすまし対策として活用されているDNSレコードとなります。

そこで、今回はSPFレコードが確認できるサイト4つご紹介致します。

## mxtoolbox

![spf001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/8814d179-98aa-e046-aed6-278b73c98a80.png)

[mxtoolboxへのURL](https://mxtoolbox.com/SuperTool.aspx)

1つ目はmxtoolboxとなります。

mxtoolboxではspfレコード以外に、「DNSレコード確認」や「http確認」、「ブロックリスク確認」等
幅広い項目を確認できます。

今回は例として「google.com」のSPFレコードを確認致します。

![spf002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/cf0ffb2a-b0ff-02c3-8fe8-ba73acabc6d0.png)

上記はmxtoolboxにて「google.com」のSPFレコードを確認した画面となります。

構文エラー等があった場合は赤文字で表示してくれます。

その他のツールを使用したい場合は、オレンジ色プルダウンを変更する事でチェック項目を変更できます。

## vamsoft.com

![spf003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/5d10ecc3-3d98-91a8-54bb-04086311bf3f.png)

[vamsoft.comへのURL](https://vamsoft.com/support/tools/spf-syntax-validator)

2つ目はvamsoft.comとなります。

vamsoft.comではSPFレコードの構文を確認する事が出来ます。

その為、DNSに登録する前に利用する事が出来るツールとなります。

今回は例として先程検索した「google.com」のSPFレコード内容を確認してみます。

![spf004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/2e09aa00-463e-ab49-9870-7675a59597d5.png)

レコード内容に問題が無ければ上記の様に表示されます。

![spf005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/21b3ed64-3a7d-4ab9-314c-5f83e7ca1e59.png)

レコード内容に問題があれば上記の様に赤枠で教えてくれる便利なツールとなります。


## dmarcian.com

![spf006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/d66f638e-f930-546b-e2db-a33de32aded8.png)

[dmarcian.comへのURL](https://dmarcian.com/spf-survey/)

3つ目はdmarcian.comとなります。

dmarcian.comではSPFレコードの確認に加えDNS参照回数が一目で確認できます。

例として「google.com」のSPFレコード内容を確認してみます。

![spf007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/19c40171-9b6d-838a-e4fd-531a83641551.png)

dmarcian.comにてSPFレコードを検索すると上記の様に表示されます。

DNS参照回数は「4/10」となっており4回となっております。


## dmarcly.com

![spf008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/40f061fa-cf8e-f6a5-0de6-efb086cb6734.png)


[dmarcly.comへのURL](https://dmarcly.com/tools/spf-record-checker)

4つ目はdmarcian.comとなります。

dmarcian.comではSPFレコードのチェックを行う事が出来ます。

例として「google.com」のSPFレコード内容を確認してみます。

![spf009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/f758283c-521d-60f7-823b-355b09ab3b55.png)

dmarcian.comでは検索時のインクルードている情報が見やすく表示されておりますのでお勧めです!
ドメイン駆動設計の概要

## はじめに
DDDを最近勉強し始めているのですが、いまいちピンと来ていません。なので、概要から学習すべく記事にしていきます。

## ドメイン駆動設計の概要

### ドメイン (Domain)
ソフトウェアが解決しようとしているビジネスの問題領域です。例えば、銀行業務、在庫管理、eコマースなどがドメインとなります。

### ユビキタス言語 (Ubiquitous Language)
ドメイン専門家（ビジネスのエキスパート）と開発者が共通の言語を使ってコミュニケーションを取ることを指します。これにより、誤解を減らし、一貫性のある理解を促進します。

### エンティティ (Entity)
固有の識別子を持つオブジェクトです。例えば、ユーザー、注文、商品などがエンティティとなります。

### 値オブジェクト (Value Object)
識別子を持たず、属性によって一意に識別されるオブジェクトです。例えば、住所や金額などが値オブジェクトとなります。

### アグリゲート (Aggregate)
関連するエンティティと値オブジェクトをグループ化したものです。アグリゲートは整合性を保つための一つの単位として扱われます。

### リポジトリ (Repository)
永続化されたエンティティを取り扱うためのインターフェースです。データベース操作を抽象化し、ドメインロジックから分離します。

### サービス (Service)
エンティティや値オブジェクトに属さないドメインロジックを持つオブジェクトです。特定の操作やビジネスルールをカプセル化します。
GitHub Actions学んでみた④

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

**「いいね」か「ブックマーク」**
を頂けると僕のモチベーションアップになります！:thumbsup:
少しでも気に入っていただけたらよろしくお願いいたします！:thumbsup:


# 今回の目的
自分の作ったコンポーネントを確認したり検証するための技術を身に付けたい！
公式のクイックスタートを参考に進めていきます。
項目ごとに補足のみ書いて進めています。わかりづらいところの理解の手助けになれば幸いです！

# 主に参考にさせていただいた記事

https://docs.github.com/ja/actions/quickstart

# 式
## 式について
式をyml内で使用する場合は${{}}で設定します。
使用できるリテラルは「文字列、boolean、number、null」です。（booleanはtruthy、falthyの判定もあります）
```yml
env:
  MY_ENV_VAR: ${{ github.event_name }}
```

比較演算子は緩やかな判定になります。厳密な型チェックは入りません。

## 機能
### contains( search, item )
オブジェクトフィルターを使用して、issuesにバグの文字列があるか判定する場合
```yml
contains(github.event.issue.labels.*.name, 'bug')
```
また、どちらかの文字列を持っているか判定したい場合
```yml
contains(fromJSON('["push", "pull_request"]'), github.event_name)
```
### startsWith( searchString, searchValue )
第一引数が第二引数で始まる場合はtrue
```yml
startsWith('Hello world', 'He')
```
### endsWith( searchString, searchValue )
startsWithと同じような仕組み

```yml
endsWith('Hello world', 'ld')
```

### format( string, replaceValue0, replaceValue1, ..., replaceValueN)
第一引数に任意の場所で結合していきます。
```yml
format('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')
```

### 使い方
```yml
    env:
        TEST: ${{format('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')}}
    steps:
      - run: echo $TEST
```
または

```yml
    steps:
      - run: echo ${{format('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')}}
```

## ステータスチェック関数
下記のように使用します。
```yml
      - if: ${{ success() }} 
        run: echo "成功"
      - if: ${{ cancelled() }}
        run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - if: ${{ failure() }}
        run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
```
実行結果（全て正常）
![スクリーンショット 2024-06-20 20.27.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/2120be09-9ce0-4ad6-c5d3-d3d39a313a96.png)

## オブジェクトフィルタ
アスタリスクを使用して柔軟にオブジェクトの改装を指定できます。
fruitsオブジェクト(fruits.*.nameでnameフィールドの配列が取得できる）
```yml
[
  { "name": "apple", "quantity": 1 },
  { "name": "orange", "quantity": 2 },
  { "name": "pear", "quantity": 1 }
]
```

# 次
コンテキスト
JavaScriptのいろんな演算子や式など

JavaScriptにて、個人的に今まで知らなかったけど、結構便利そうと思ってる演算子を勉強がてら上げていこうと思います。

## カンマ演算子
カンマ演算子 (,) は、それぞれの演算対象を（左から右に）評価し、最後のオペランドの値を返します。これにより、複数の式が評価される複合式を作成することができ、複合式の最終値はそのメンバー式の一番右端の値となります。これは、for ループに複数の引数を提供する場合によく使用されます。

```javascript
let x = 1;

x = (x++, x);

console.log(x);
// Expected output: 2

x = (2, 3);

console.log(x);
// Expected output: 3
```

## 論理積代入
論理積代入 `(x &&= y)` 演算子は、x が真値である場合にのみ代入を行います。

```javascript
let a = 1;
let b = 0;

a &&= 2;
console.log(a);
// Expected output: 2

b &&= 2;
console.log(b);
// Expected output: 0
```

## 論理和代入
論理和代入演算子 `(x ||= y)` は、x が偽値である場合にのみ代入を行います。
個人的にRubyでしかみたことないのですが、JavaScriptにもあるなら他の言語にもあるのかな？

```javascript
const a = { duration: 50, title: '' };

a.duration ||= 10;
console.log(a.duration);
// Expected output: 50

a.title ||= 'title is empty.';
console.log(a.title);
// Expected output: "title is empty"
```

## Null合体代入
Null 合体代入 `(x ??= y)` 演算子は、x が nullish (null または undefined) である場合にのみ代入を行います。

```javascript
const a = { duration: 50 };

a.duration ??= 10;
console.log(a.duration);
// Expected output: 50

a.speed ??= 25;
console.log(a.speed);
// Expected output: 25
```

## ラベル
ラベル付き文は、任意の文に接頭辞として識別子を付けたものです。ラベル付き文の中にネストされた `break` 文や `continue` 文を使用すると、このラベルにジャンプすることができます。

```javascript
let str = '';

loop1: for (let i = 0; i < 5; i++) {
  if (i === 1) {
    continue loop1;
  }
  str = str + i;
}

console.log(str);
// Expected output: "0234"
```

## arguments オブジェクト
`arguments` は配列風 (Array-like) オブジェクトであり、関数に渡された引数の値を含んでおり、関数内からアクセスすることができます。

```javascript
function func1(a, b, c) {
  console.log(arguments[0]);
  // Expected output: 1

  console.log(arguments[1]);
  // Expected output: 2

  console.log(arguments[2]);
  // Expected output: 3
}

func1(1, 2, 3);
```

## オブジェクト分割代入
下記のようにオブジェクトを代入するときは、何個かオプションがあります。

```javascript
// 通常のオブジェクト分割代入
const hoge = {a: 1, b: 2, c: 3}
let {a, b, c} = hoge
// a = 1, b = 2, c = 3

// 変数名を指定した分割代入
let {a: newA, b: newB, c: newC} = hoge
// newA = 1, newB = 2, newC = 3

// デフォルト値を指定した分割代入
// NOTE: 通常のプログラムでは、letで宣言した変数は再宣言できませんが、
// NOTE: 今回は一例として挙げるのでErrorは無視します。
let {a, b, c, d = 4} = hoge
// a = 1, b = 2, c = 3, d = 4
```
DDDのEntityと値オブジェクトの違い

## はじめに
DDDを学習する中で、Entitiyと値オブジェクトというワードが出てきます。
ユーザや事業所はEntitiyで、お金などは値オブジェクトと表現される例が書かれています。
なぜ？何が違うの？どうして分けるの？と疑問をもっており、わからないながらに回答をだしたので、メモ程度に記述します。

## Entitiyと値オブジェクトの違い
①識別子の有無
②ライフサイクルの管理

## エンティティ (Entity)
識別子を持つ: エンティティは一意に識別される識別子（ID）を持ちます。識別子によって同じエンティティを再認識することができます。例えば、ユーザーや注文、商品などがエンティティです。
ライフサイクルの管理: エンティティはライフサイクルを持ち、その状態が時間とともに変わります。エンティティの属性が変更されても、識別子が同じであれば同一のエンティティとして扱われます。

```ts:Entityの例
class User {
  constructor(private id: string, private name: string, private email: string) {}

  changeName(newName: string) {
    this.name = newName;
  }

  get userInfo() {
    return {
      id: this.id,
      name: this.name,
      email: this.email,
    };
  }
}
```

## 値オブジェクト (Value Object)
①識別子を持たない: 値オブジェクトは固有の識別子を持たず、その属性によってのみ識別されます。例えば、住所や金額、日時などが値オブジェクトです。同じ属性を持つ値オブジェクトは同一とみなされます。
②不変性: 通常、値オブジェクトは不変（immutable）であり、一度作成されたらその状態を変更しません。もし変更が必要な場合は、新しいインスタンスを作成します。

```ts:値オブジェクト
class Money {
  constructor(private amount: number, private currency: string) {}

  get value() {
    return `${this.amount} ${this.currency}`;
  }

  // 通常は変更不可なので新しいインスタンスを作成する
  add(other: Money): Money {
    if (this.currency !== other.currency) {
      throw new Error('Different currencies');
    }
    return new Money(this.amount + other.amount, this.currency);
  }
}
```

## まとめ
エンティティは一意の識別子を持ち、状態が変化する可能性のあるオブジェクト。識別子が同じならば、同じエンティティとみなされます。
値オブジェクトは属性の集合体で、識別子を持たず、不変であることが多い。値が同じならオブジェクトも同じとみなされます。
(うーん、わかったようなわからないような💦💦💦）
オウム返しするLINE BotをGoで実装する（LINE Messaging API・Webhook）

LINE Messaging APIのGoの公式SDKを使って超簡単に実装する。
https://github.com/line/line-bot-sdk-go

Goの環境構築、プロジェクト作成までは割愛。

```go:main.go
package main

import (
	"log"
	"net/http"
	"os"

	"github.com/joho/godotenv"
	"github.com/line/line-bot-sdk-go/linebot"
)

func main() {
	// .envファイルを読み込む
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading .env file")
	}

	bot, err := linebot.New(
		os.Getenv("LINE_CHANNEL_SECRET"),
		os.Getenv("LINE_CHANNEL_TOKEN"),
	)
	if err != nil {
		log.Fatal(err)
	}

	http.HandleFunc("/callback", func(w http.ResponseWriter, req *http.Request) {
		events, err := bot.ParseRequest(req)
		if err != nil {
			if err == linebot.ErrInvalidSignature {
				w.WriteHeader(400)
			} else {
				w.WriteHeader(500)
			}
			return
		}
		for _, event := range events {
			if event.Type == linebot.EventTypeMessage {
				switch message := event.Message.(type) {
				case *linebot.TextMessage:
					if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(message.Text)).Do(); err != nil {
						log.Print(err)
					}
				}
			}
		}
	})

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}

	log.Printf("Server is running at port %s", port)
	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}
}
```

```text:.env
LINE_CHANNEL_SECRET=YOUR_CHANNEL_SECRET  # クォーテーションはつけない
LINE_CHANNEL_TOKEN=YOUR_CHANNEL_TOKEN    # クォーテーションはつけない
PORT=8080
```

```shell:shell
go run main.go
```

LINE DevelopverコンソールでWebhook URLに`{...公開したGoサーバーのURL...}/callback`を設定する。

以上。
ラムダ式について

# 導入
Javaにはラムダ式という便利な機能が備わっているので、その紹介をしていきます。
かなり便利なものなので、きちんと理解することをお勧めします。

# ラムダ式とは
ラムダ式は、匿名関数を表現するための簡潔な記法です。
ラムダ式は、通常のメソッドとは異なり、名前を持たず、その場で定義される小さなコードブロックです。
Java 8以降で導入され、コードの簡潔化や関数型プログラミングのサポートに役立っています。

# 仕組み
ラムダ式は、ローカルクラスと無名クラスの仕組みを利用しています。
なので、これらについてまず触れます。

## ローカルクラス

ローカルクラスとは、メソッド内にクラスを定義して利用するものです。
以下に例を示します。

```java
public static void main(String[] args) {

    // ローカルクラスLocalTestの定義
    class LocalTest {
        public void sayHello() {
            System.out.println("Hello!!");
        }
    }
	
    // LocalTestを定義したメソッドの内でLocalTestを利用できる
    LocalTest local = new LocalTest();
    local.sayHello(); // Hello!!
}
```

インターフェースを実装したクラスも同様にローカルクラスとして定義することが可能です。
以下の無名クラスの項目に例を載せています。

## 無名クラス

IFを実装したローカルクラスの定義を省略して書いたものです。

まずはローカルクラスの例です。

```java
public static void main(String[] args) {

    class LocalTest implements LocalInterface {
        @Override
        public void sayHello() {
            System.out.println("Hello local class!");
        }
    }
    LocalInterface local = new LocalTest();
    local.sayHello(); // Hello local class!
}
```
これの省略形が無名クラスです。

```java
public static void main(String[] args) {

    LocalInterface local = new LocalInterface {
        @Override
        public void sayHello() {
            System.out.println("Hello No name!");
        }
    };
    local.sayHello(); // Hello No name!
}
```

このように無名クラスという方法を使うと、ローカルクラスの定義とインスタンス化を同時に行うことが可能です。

# ラムダ式
ついにラムダ式です。
ラムダ式は、さらに無名クラスからインスタンス化とオーバーライドの宣言を除去したものになります。
上述の無名クラスの例をラムダ式に変換したものが以下になります。

```java
public static void main(String[] args) {
	LocalInterface local = () => { System.out.println("Hello Lambda!"); };
	local.sayHello(); // Hello Lambda!
}
```

ここで疑問が浮かんできます。
上記の例では`sayHello`というメソッドが呼び出されていますが、その定義はどこにもありません。
この定義はどこにあるのでしょうか？

この答えは、そもそものローカルクラスや無名クラスの例を見てもらうとわかります。
これらは共通して`sayHello`メソッドをオーバーライドしています。
つまり、`sayHello`という関数は元々`LocalInterface`インターフェースに抽象メソッドとして実装されていることが推測できます。
おそらく`LocalInterface`は以下のような実装になっていたと思われます。

```java:LocalInterface.java
public interface LocalInterface {
    void sayHello();
}
```

このようにラムダ式は、シンプルに記述することができる一方で、ローカルクラスや無名クラスとは異なり、メソッド名が分かりにくくなってしまいます。

また、ラムダ式には守らなければならないルールがあります。
**インターフェースの抽象メソッドが1つの場合に限る**というルールです。
もしインターフェースに複数メソッドがあった場合、どのメソッドをオーバーライドするかわからなくなってしまうため、この点にも注意が必要です。

## ラムダ式のメリット
というデメリットがラムダ式にはありますが、当然以下のような大きなメリットがあります。

- **コードの簡潔化**: ラムダ式を使うことで、コードが短く明確になります。
- **関数型プログラミングのサポート**: Javaの関数型インターフェース（例: Function<T, R>）と組み合わせることで、より柔軟なコーディングが可能です。次回以降で「関数型インターフェース」に触れていこうと思います。
- **メソッド参照との連携**: メソッド参照と共に使用することで、さらにコードの可読性が向上します。

こういったメリットを活かせる実装を行なっていくことが大切です。

# 終わりに
Javaのラムダ式は、コードをよりシンプルで読みやすくしてくれるツールです。ローカルクラスや無名クラスに対する理解があれば、ラムダ式の概念もスムーズに理解できるでしょう。
一方で、難解な処理に対して利用すると逆に可読性が損なわれる可能性もあるので、使用時には注意が必要です。

とはいえラムダ式は便利な機能です。
ぜひ、今回学んだ内容を実際の開発で活用し、コードの質を向上させてみてください。
IBM i Services Directory : QSYS2.Collection_Services_Info ビュー

収集サービス関連記事 [データ取得手順](https://qiita.com/gomAnomalocaris/items/8f437c16915e941299cd) と [簡単な説明](https://qiita.com/gomAnomalocaris/items/7e12109f7050fea35840)　もあわせてどうぞ。


## 概要

■ビュー名：QSYS2.COLLECTION_SERVICES_INFO
■カテゴリ：パフォーマンスサービス
■サポート：IBM i 7.4 Base以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-collection-info-view

CFGPFRCOLコマンド、および収集サービス属性の検索 (QypsRtvColSrvAttributes) API によって戻り値と類似

収集サービスの構成情報や現在の収集サービスのステータスを取得できます。
執筆時点では、パフォーマンスサービスにカテゴライズされる唯一のIBM i サービスです。
※名称の COLLECTION は 収集サービス の収集 と同義です。

## 使用例

```
SELECT * FROM QSYS2.COLLECTION_SERVICES_INFO;
```

結果例は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c5e53160-235e-29ff-ec7b-3ce7236e6692.png)

かんたんに説明しますと、

***Active Collection Library*** : 収集サービスデータの保管されるライブラリー（ここではデフォルトのQPFRDATA）
***Active Collection Name*** : 収集サービスのデータが保管されるオブジェクト名
***active Start Time*** : 収集サービスが開始された日付時刻
***Default Collection Interval*** : 収集サービスのインターバル。ここでは15分->5分（300秒）に変更されていますね。よしよし自分。
***MGTCOL Retention Period***古い収集サービスデータ*MGTCOLを何時間保管するか。ここでは120時間 = 5日間 に変更されています。それ以前のデータは順次削除されます。デフォルトは24時間なので、毎日消されてしまいます。イベント時のデータを保管しておきたい場合などはこの値を伸ばすか、別ライブラリーにコピーやバックアップをしてください。
***Cycle Interval*** 収集サービスのデータ *MGTCOLを分割する単位時間。デフォルトは24時間でファイルが分割されます。Navigator for i の分析画面では複数の*MGTCOLデータを一括で分析もできます。この値は分析する際の最小の基準間隔になるので、通常は1日=24時間でいいと思います。


***同じシステムでCFGPFRCOLコマンドをたたいた時の結果もご参考に載せてみます。***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ea18097e-b2bd-84b3-bf67-b5360a8a1166.png)
自律的なキャリア形成を促す：スキル目標管理でエンジニアリングチームを強化

## はじめに
私の所属する企業では、全社的にスキル評価制度が整えられていて、スキル評価を年に１回行い、必要に応じて上長からフィードバックをもらえる仕組みとなっており、昇格などのキャリアアップにスキル評価の評点を用いる仕組みとなっています。
実態として年に１回去年の評価点と見比べながら被評価者が自己評価を入力し、評価者が１次評価(課長クラス以上)～２次評価(部長クラス以上)を入力して、「今年昇格候補に挙がるか否か」のフィードバックがされるという運用をしていました。

この制度は、一定の評価基準に基づいて個々のメンバーの前回評価からの成長を評価することは可能であるものの、チーム全体での共通のスキル目標の意識合わせや中長期的なキャリア形成に向かって自律的に行われるにはプロセスの不足を感じていました。

そこで私は、スキル目標管理に関わる新たなプロセスを導入する取り組みを行うことにしました。
単なるスキル評価ではなく、メンバーが自身の成長と教育に積極的に取り組む文化を醸成し、それがチームの強みとなる環境を作り出すことをモチベーションとしています。

### 前提
私＝エンジニアリーダー（役割 Not 役職）
評価者（課長以上の役職）は別の人

## 目標管理(MBO)とは
会社から言われて当たり前にやっているけど、そもそも目標管理って何なの？というところが気になったので、調べてみたところ
もしドラでおなじみのドラッカー氏が提唱したMBO（Management by Objectives and Self-control）を日本では目標管理として多くの企業で使っていること
「Objectives（共通の目標）」と「Self-control（自律的な改善）」を「Management（管理）」して最大の成果を得よ！というお話と理解しました。
Self-controlの部分が日本語訳で抜け落ちてるの罠だと思います

## Objectives（共通の目標）を持つための施策
### 施策：スキル評価項目のカスタマイズ
共通の目標を持つための施策として、スキル評価項目をチーム内で業務内容に合わせて具体化を行いました。
スキル評価項目と評価点は全社レベルで定められたものだったので、抽象度がどうしても高くなってしまいます。そのため、そのまま使うと、個人レベルで解釈がわかれたり、チームの業務内容と合わない部分がるなどの不具合が発生していると考えました。
この施策により、メンバーのスキルや貢献度を正確に反映できるようになったと思っています。

### 工夫ポイント
- 全社の評価項目を作った部署にカスタマイズして使用することの了承を得る
- 評価項目作成時の関係者にヒアリングし、評価項目・基準作成時の意図や思いを確認する
- 評価項目の認識合わせの打ち合わせはチーム全員で行い、決定事項はドキュメントに残す
- 評価過程で認識合わせなどが行われた場合、ドキュメントを継続的に更新していく


## Self-control（自律的な改善）を行うための施策
メンバーが自律的に成長し、自己改善を進めるための施策として、期初にメンバーそれぞれが中長期的なキャリアビジョンを基に、今年のスキル評価時に達成したい点数を宣言するプロセスを導入しました。

### 具体的なプロセス
- キャリアビジョンの設定とスキル目標の宣言
    - 期初に各メンバーが自身の中長期的なキャリアビジョンを明確にし、将来どのようなスキルを習得し、どのようなポジションを目指すかを具体的に描きます。そこから逆算し、今年のスキル評価時に達成したい点数を宣言します。
- 1on1ミーティング
    - エンジニアリーダーである私がメンバーのスキル目標に対する進捗状況を確認します。2週間に1回30分でショートに行い、スキル目標の達成に向けて障害となっていることがないか、何かサポートできることはあるかという観点で会話を行っています。
- スキル評価入力前の面談
    - これまでは、スキル評価者の評価後にフィードバックが行われる仕組みでしたが、評価が確定した後では何を言っても覆ることがないため納得感がないと考え。スキル評価のタイミングで、自身のスキル評価点数の達成度とスキル向上項目に対する考えを評価者に説明する機会を設けました


## よかったこと
- メンバーからはモチベーションが向上し自己成長に対する意欲が高まったという声をもらえた。
- エンジニアリーダーとしても、ティーチング・コーチング時に会話する軸ができることで、「～さんが成長して、この項目の点数が挙がった」などある種ゲーミフィケーション的にほめることが行えて楽しかった。

## 反省点
- 「エンジニアのスキル向上により生産性が～向上した」のようなわかりやすい定量的な測定指標を事前に考えておけばよかった
- 私（エンジニアリーダー）と評価者（課長・部長クラス以上）が異なるため、1on1で認識あわせしながら進めた評点が評価時に覆ることがあり、納得感を最大化できなかったメンバーもいた
    - 課長・部長クラス以上の評価観点をなるべくフィードバックしてもらい吸収することで、次年度同じことが起こらないように改善していきたい
[ExcelVBA]WorksheetFunction.Matchメソッドを使って検査値が見つからなかった場合のエラー対応について

# はじめに
VBAでMATCH関数（WorksheetFunction.Matchメソッド）を使った際に発生したエラーについて、対応方法をまとめます。

# MATCH関数がエラーを返す
#### ワークシート上
ワークシート上でMATCH関数を、第3引数（照合の種類）= 0（完全一致）、の設定で使った時、検査値が検査範囲の中に見つからないと、MATCH関数はエラー（#N/A）を返します。
![1キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816680/c429df5b-4f96-f2a1-a52c-ccdb73ac8c51.png)

#### VBAでは
VBAでWorksheetFunction.Matchメソッドを同じように使用した場合、
「実行時エラー:1004
WorksheetFunction クラスの Match プロパティを取得できません。」
という内容のエラーが発生し、プログラムの実行が中断されてしまいます。

# エラーへの対応方法
このエラーの対応には、2段階の処理があります。
#### ①On Error ステートメントで、プログラムを中断せずに実行を続ける
実行時エラーによりプログラムの実行自体が中断されてしまうので、中断されないようにエラー処理ルーチンを記述しておく必要があります。

#### ②検査値が見つからなかった場合に実行する処理を用意しておく
検査値が検査範囲の中に見つからなかった場合、WorksheetFunction.Matchメソッドは数値の0を返します。
If~End Ifステートメントで条件に「Matchメソッドの返し値＝0」を設定し、検査値が見つからなかった場合に実行する処理を記述しておきます。

~~~VB
Option Explicit

Sub MATCH関数テストマクロ()

Dim result As Long 'MATCH関数の戻り値

On Error Resume Next '①実行時エラーが発生しても中断せずに続ける

result = Application.WorksheetFunction.Match("X", Range("B2:B6"), 0)

'②検査値が検査範囲の中に見つからなかった場合に実行する処理
If result = 0 Then 'エラーの場合、WorksheetFunction.Matchメソッドは
                   '数値の0を返す

    '処理内容

End If

Err.Clear

On Error GoTo 0

End Sub
~~~

# おわりに
WorksheetFunction.Matchメソッドで検査値が検査範囲の中に見つからなかった場合のエラーの対応には、実行時エラーに対するエラー処理ルーチンと、検査値が見つからなかった場合に実行する処理を用意しておくという、2段階の対応が必要です。
schemaで設定した数値がCSSに反映されない

## 初めに
今回Shopifyで新規セクションを作成して、Schema内でpaddingの値を調整できるように設定しました。(schemaのtypeはrange)
しかしカスタマイズ画面でpaddingの値を変更しても、画面上で値は変わりません...
この解決方法についてまとめていきます。

## 問題点
前提として今回作成したセクションは、同一ページ内で2個以上使用しています。

実際のセクションのコードは以下の通りです。
```liquid
{% style %}
    .custom-section{
        padding:{{ section.settings.custom_range }}px 40px;
    }
{% endstyle %}

<section>
	<div class="custom-section">
		.
        .
        .
	</div>
</section>

{% schema %}
{
  "name": "テストセクション",
  "settings": [
    {
      "type": "range",
      "id": "custom_range",
      "min": 10,
      "max": 100,
      "step": 10,
      "unit": "px",
      "label": "余白の調整",
      "default": 40
    }
  ],
  "presets": [
    {
      "name": "テストセクション"
    }
  ]
}
{% endschema %}
```

こちらの記述をすることで「custom-section」のクラスのついているdivタグには、schameで設定したpaddingが付くはずです。
このセクションを2個配置して、最初のセクションのpadding値をカスタマイズ画面で調整しても値が変わりません。

## 解決策
今回CSSが当たらなかった理由は、
```liquid
{% style %}
    .custom-section{
        padding:{{ section.settings.custom_range }}px 40px;
    }
{% endstyle %}
```
と{% style %}の中にCSSを記述したことが原因です。
この方法で同一セクションを2回使用すると、後に来るセクションのCSSが優先されます。（後に記述されたCSSが優先されるため）

https://www.support.makeshop.jp/design/?p=10390

それぞれのセクションに対して異なる余白を設けたい場合は以下のように記述します。
```liquid
<section>
	<div class="custom-section" style="padding:{{ section.settings.custom_range }}px 40px;">
		.
        .
        .
	</div>
</section>

{% schema %}
{
  "name": "テストセクション",
  "settings": [
    {
      "type": "range",
      "id": "custom_range",
      "min": 10,
      "max": 100,
      "step": 10,
      "unit": "px",
      "label": "余白の調整",
      "default": 40
    }
  ],
  "presets": [
    {
      "name": "テストセクション"
    }
  ]
}
{% endschema %}
```

上記のように要素内に直接styleを記述する方法です。
もう一つnの方法は以下の通りです。

```liquid
{% style %}
    #section-{{ section.id }} .custom-section{
        padding:{{ section.settings.custom_range }}px 40px;
    }
{% endstyle %}

<section id="section-{{ section.id }}" >
	<div class="custom-section">
		.
        .
        .
	</div>
</section>

{% schema %}
{
  "name": "テストセクション",
  "settings": [
    {
      "type": "range",
      "id": "custom_range",
      "min": 10,
      "max": 100,
      "step": 10,
      "unit": "px",
      "label": "余白の調整",
      "default": 40
    }
  ],
  "presets": [
    {
      "name": "テストセクション"
    }
  ]
}
{% endschema %}
```

{{ section.id }}の記述をすることで、そのセクション独自のidを取得することができます。
そのidが振られた要素内にある.custom-sectionに対してCSSを記述することで、該当セクションのみにCSSを当てることができます。

## 終わりに
セクションごとに独自のスタイルをschemaで調整したい場合は、paddingだkではありません。
今回の方法を使用してより幅広いセクションを作れるようになりました。