OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder ABC380 ABCD

PythonでABC380を解いてみたので、解法の記録を残します。
https://atcoder.jp/contests/abc380

## A - 123233
https://atcoder.jp/contests/abc380/tasks/abc380_a
`for`文で$1$、$2$、$3$それぞれの数を数えます。

[提出](https://atcoder.jp/contests/abc380/submissions/59831346)
```py
n = input()
one = 0
two = 0
three = 0

for i in n:
    if i == "1":
        one += 1
    elif i == "2":
        two += 1
    elif i == "3":
        three += 1

if one == 1 and two == 2 and three == 3:
    print("Yes")
else:
    print("No")
```

## B - Hurdle Parsing
https://atcoder.jp/contests/abc380/tasks/abc380_b
文字列を`for`で回し、その中で`|`かそうでないかで分岐させて数えます。

[提出](https://atcoder.jp/contests/abc380/submissions/59839170)
```py
s = input()
lst = []
cnt = 0

for c in s:
    if c == "|":
        lst += [cnt]
        cnt = 0
    else:
        cnt += 1

lst = lst[1:]
l = [str(i) for i in lst]
print(" ".join(l))
```

## C - Move Segment
https://atcoder.jp/contests/abc380/tasks/abc380_c
正規表現を使って`1`の塊の開始地点と終了地点を求めます。
移動は、$K-1$番目の終了地点を書き換え、$K$番目を削除する形で行います。

[提出](https://atcoder.jp/contests/abc380/submissions/59853511)
```py
import re

n, k = map(int, input().split())
s = input()

m = re.finditer("1+", s)

one_list = [list(i.span()) for i in m]

str_list = ["0"] * n

one_list[k-2][1] += one_list[k-1][1] - one_list[k-1][0]
del one_list[k-1]

for i in one_list:
    for j in range(i[0], i[1]):
        str_list[j] = "1"

res = "".join(str_list)
print(res)
```

## D - Strange Mirroring
https://atcoder.jp/contests/abc380/tasks/abc380_d
まず、$K_i$番目の文字が$S$の何番目にあたるかは剰余で求まります。
問題は、大文字小文字が反転しているかです。
入力例1で考えます。
$S$は`aB`で、$1$回操作すると`aBAb`、$2$回操作すると`aBAbAbaB`となります。
このとき、`aB`や`Ab`をグループと呼ぶことにします。
$K_i$番目の文字が何番目のグループに属しているかは割り算で求まります。
そうなると、あとは$n$番目のグループが何回反転されたかを求めるだけになります。
文字列が連結されていく過程を見ていきます。
最初は$0$番目のグループ`aB`のみです。
$1$回操作が行われると、$1$番目のグループ`Ab`が追加されます。
$2$回目の操作では、$2$番目のグループ`Ab`と$3$番目のグループ`aB`が追加されます。
$2$回目の操作を分けて考えると、$0$番目のグループを反転したものが$2$番目のグループ、$1$番目のグループを反転したものが$3$番目のグループになっていることがわかります。
一般化して考えると、$m$回目の操作では、$0$番目のグループを反転したものが$2^{m-1}$番目のグループ、$1$番目のグループを反転したものが$2^{m+1}+1$番目のグループ、…、$2^{m-1}-1$番目のグループを反転したものが$2^m-1$番目のグループとなることがわかります。
$0$と$2^{m-1}$、$1$と$2^{m-1}+1$、…、$2^{m-1}-1$と$2^m-1$の関係はそれぞれ「前の数字の下(LSB)から$m$ビットを立てたものが後の数字」となっています。
つまり、$n$番目は、$n$を2進数表記したときに$1$が奇数個あれば「反転されている」、偶数個あれば「もとのままになっている」ということです。

[提出](https://atcoder.jp/contests/abc380/submissions/59862056)
```py
s = input()
q = int(input())
k = map(int, input().split())

length = len(s)

for i in k:
    idx = i - 1
    group, pos = divmod(idx, length)
    popcount = group.bit_count()
    
    res = s[pos]

    if popcount % 2 == 1:
        res = res.swapcase()
        
    print(res, end=" ")
```
MVCモデルとは

MVCは`Model-View-Controller`の略で、ソフトウェア設計パターン(ソフトウェアアーキテクチャ)の一つ。

### MVCの３つの要素

> **Model**

データを管理する部分で、データベースとの連携や、データの計算処理などを行う。

> **View**

UI(ユーザーインターフェース)部分。Modelから受け取ったデータを表示する。

> **Controller**

ModelとViewの仲介役で、ユーザーからの入力を受け取り、Modelに処理を指示し、その結果をViewに渡す
ログ管理ツール「journalctl」の特徴６選

ログ管理ツール「journalctl」は、Linuxの`systemd`によって提供されるログビューアで、システム全体のログを効率的に管理・表示するためのツールです。以下にその主な特徴を説明します。

---

## **1. 主な特徴**

### **一元的なログ管理**

- システム全体のログ（カーネル、システムサービス、アプリケーション、ユーザー関連）を1つのツールで確認可能。
- 従来の分散されたログシステム（例：`/var/log/messages`、`/var/log/syslog`）と異なり、`journalctl` で全てのログを統一的に管理します。

### **リアルタイムログの表示**

- ログをリアルタイムで追跡できる機能を提供。
  ```
  journalctl -f
  ```

### **詳細なメタデータを含む**

- 各ログエントリには、以下のようなメタデータが付属しています：
  - タイムスタンプ
  - プロセスID（PID）
  - ユーザーID（UID）
  - ホスト名
  - ユニット名（サービス名）など

### **ログのフィルタリング機能**

- サービス名、プロセスID、優先度、日時など多様な条件でログを効率的にフィルタリング可能。
  ```
  journalctl -u nginx
  ```

### **永続的なログ保存**

- デフォルトではメモリ内に保存される（再起動後は消える）が、設定によりログをディスクに永続保存可能。
  - 永続ログの保存先: `/var/log/journal/`

### **ローテーションとサイズ制御**

- ディスク容量を圧迫しないようにログサイズの制限や自動ローテーション機能を提供。

### **高度な検索と解析**

- キーワード検索、時間指定、優先度によるログ抽出が簡単。
  - 例: 過去1時間の重要なエラーを確認
    ```
    journalctl --since "1 hour ago" -p 3
    ```

### **ブートごとのログ管理**

- システムのブート単位でログを区切り、特定のブート期間のログだけを表示可能。
  ```
  journalctl -b journalctl -b -1 # 前回のブート
  ```

### **カーネルログの表示**

- カーネル関連のログ（`dmesg` 相当）を簡単に表示可能。
  ```
  journalctl -k
  ```

---

## **2. 主なコマンドオプションと例**


| 目的 | コマンド例 |
| --- | --- |
| 全ログの表示 | journalctl |
| 特定のサービスのログ表示 |journalctl -u nginx |
| リアルタイムでログを追跡 | journalctl -f | 
| 指定した時間範囲のログ表示 | journalctl --since "2024-11-15 12:00:00" --until "now" |
| カーネルログの表示 | journalctl -k |
| 現在のブートログを表示 | journalctl -b |
| 前回のブートログを表示 | journalctl -b -1 | 
| エラー以上のログを表示 | journalctl -p 3 | 
| 特定のPIDのログを表示 | journalctl _PID=1234 |

---

## **3.** `journalctl` **を使ったデバッグの流れ**

1. **エラーログの抽出**
   - 重要度の高いログだけを絞り込む：
     ```
     journalctl -p 3
     ```
     ‌
2. **サービスの特定ログを確認**
   - 問題が発生しているサービスに関するログを取得：
     ```
     journalctl -u apache2
     ```
     ‌
3. **時間範囲を限定**
   - 問題が発生した時間帯のログを絞り込む：
     ```
     journalctl --since "2024-11-15 10:00" --until "2024-11-15 12:00"
     ```
     ‌
4. **リアルタイムで追跡**
   - ログをリアルタイムに追跡して問題の発生をモニタリング：
     ```
     journalctl -f
     ```

---

## **4.** `journald` **の設定**

`journalctl` の動作は、`journald` の設定ファイル（`/etc/systemd/journald.conf`）で制御されます。

- **永続ログを有効化**
  - `Storage=persistent` に設定：
    ```
    sudo nano /etc/systemd/journald.conf
    ```
    ‌
    ```
    [Journal] Storage=persistent
    ```
    ‌
- **ログサイズの制限**
  - ディスク容量を抑えるため、ログの最大サイズを設定：
    ```
    SystemMaxUse=500M RuntimeMaxUse=250M
    ```

---

## **5. メリットと注意点**

### **メリット**

1. **統合されたログ管理：** 分散したログ管理より効率的で一元的。
2. **高速な検索：** バイナリ形式により検索速度が向上。
3. **多機能：** サービス、プロセス、時間、優先度でログを簡単に絞り込める。
4. **永続性のカスタマイズ：** 必要に応じて永続保存を有効化できる。

### **注意点**

1. **依存性：** `systemd` が必要で、従来の `syslog` ベースの環境とは異なる。
2. **ディスク容量：** 永続ログを有効化すると、容量不足に注意が必要。
3. **バイナリ形式：** 従来のテキストベースのログと互換性がなく、専用ツール（`journalctl`）が必要。

---

## **6. 「journalctl」が適しているケース**

- **サーバー管理：** サーバー内の全サービスやカーネルログを一元管理したい場合。
- **トラブルシューティング：** サービス障害やシステムエラーのデバッグに最適。
- **ログ監視：** リアルタイムで問題を監視する必要がある場合。
- **セキュリティ監視：** 高優先度のログ（例：`auth.log`）を素早く抽出して確認したい場合。

---

「journalctl」はLinuxシステム管理者にとって強力なツールであり、特に`systemd`を使用する環境では不可欠です。その柔軟性と統合された管理機能により、効率的な運用が可能になります。
Firpleを使う

## Firpleとは

>プログラミング向けフォントとして人気の高い Fira Code に、可読性の高い IBM Plex Sans JP を合成したプログラミング向け日本語フォントです。
https://negset.com/Firple/

## Windows Terminal への設定
1. 「ターミナル」を開く
2. `CTRL` + `,` で設定画面を開く
3. 左下の「JSON ファイルを開く」を選択
![PowerShell 2024_11_16 22_32_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173885/96247b96-acd2-c0d4-b6d3-eb9feb6349cf.png)
4. settings.json が開くので、`profiles` セクション内にある `list` セクション内のお好きなシェルのプロファイルに、以下を追記して保存

```json
    "font": 
    {
        "face": "Firple",
        "features": 
        {
            "calt": 0,
            "cv33": 1,
            "liga": 0,
            "ss11": 1
        },
        "size": 12,
        "weight": "normal"
    },
```

例えば以下のようになります。

![キャプチャ - エクスプローラー 2024_11_16 22_42_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173885/6f80a40d-2513-c8af-da66-2fea01f2cc48.png)

### 補足1: OpeyTypeのフォント機能指定について
欧文部分はFira Codeとなりますが、デフォルトではリガチャ（合字）で表示されるので、タイプしていると突然表記が変わって戸惑うかもしれません。これを緩和するには、フォント機能で `liga` と `calt` を無効にします。また、Firple の独自のフォント機能を有効にしたい場合は、それぞれ指定してあげます。
リガチャを個別に設定したい場合は、以下を参照してください。
https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets

### 補足2: GUIでの設定
外観の規定値でも、ある程度の設定が可能です。たとえば、すべてのプロファイルに適用する既定値で設定を反映することができます。
![設定 2024_11_16 22_55_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173885/9c8aedbc-6e80-0d3e-c8de-a5037630c3a3.png)
設定すると、 settings.json にも反映されるので、必要な設定値を追記すればよいでしょう。
![設定 2024_11_16 22_55_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173885/6003f7a7-a81b-99bd-6ccc-780456b0a604.png)

## VS Codeへの設定
1. `CTRL` + `SHIFT` + `P` でコマンドパレットを開き、`settings json` と入力すると「基本設定：ユーザー設定を開く（JSON）」という選択肢が出るので、そちらをクリック
2.以下を追記して保存

```json
    "editor.fontFamily": "Firple",
    "editor.fontLigatures": "'liga' 0, 'calt' 0, 'cv33', 'ss11'",
```

例えば、以下のようになります。

![設定 2024_11_16 23_06_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173885/9d26ca87-0161-149a-cb2f-97f9457c0c63.png)

フォント機能の設定値については、構文が少しトリッキーなので注意してください。
HTMLのコーディングをしている方であれば、リガチャ（合字）は無効にしておいた方が「無難な」表示かなと思います。

![キャプチャ - エクスプローラー 2024_11_16 23_13_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173885/798b78be-4ca0-0508-2bcf-71c9dbf33e52.png)

![記事を新規作成 - Qiita - Google Chrome 2024_11_16 23_15_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173885/43749877-e82b-498d-2011-b24931a97ca5.png)

拡張子ごとの設定でフォント機能の指定値を変えるなど、必要に応じてカスタマイズすると、より好みの表示にできます。

```json
    "[go]": {
        "editor.fontLigatures": "'liga' 1, 'calt' 1, 'cv33', 'ss11'",
    }
```

現場からは以上です。
AWS VPCに対する構造的理解とセキュリティグループ、ACLに関する概要の備忘録

## 経緯
学習の為やっていたAWSスキルビルダーのAWS QUESTのクラウド島第4ステージで躓いたので、その時の要点をまとめる。
P.S.多分不正確な記述が多いので初学者はこの記事で覚えないで下さい。責任は負いかねます。

## 参考にしたURL
[【AWS図解】インターネットGWとNAT GWの違い解説！
](https://ryonotes.com/difference-between-internet-gateway-and-nat-gateway/)

[]()


## VPCの構造

### インターネットからVPCへの接続関係
```:インターネットからの接続関係
Internet
└── Internet Gateway
     |
(----|---------<VPC>--------------)
(    |                            )
(   Public Subnet                 )
(        |                        )
(   Private Subnet  <--------  NAT Gateway  <--  Internet  <--  Remote Host
(                                 )
(---------------------------------)
```
- AWSでは、原則として**VPCとインターネット間のやりとりはIGW（インターネットゲートウェイ）を介して行われる**。
- インターネットに**公開しなければいけないもの**（Webサーバー）はパブリックサブネット
- インターネットから**アクセスできる必要のないもの**はプライベートサブネット
<br>

**（オンプレベースの考え方）**
- **インターネットゲートウェイ**は、AWS上ではそう表現されているものの、機能的に見るとオンプレ環境における**デフォルトゲートウェイに設定されるルーター**と同じ。
- 実際、サブネットをパブリックサブネットに設定する際には、該当サブネットのルーティングテーブルに0.0.0.0/0宛パケットをインターネットゲートウェイに設定する操作を行う。

<br>

### パブリックサブネットの中身
```:パブリックサブネット内の構図
Public Subnet
└──  Web Server (HTTP)    <== Webサーバー用セキュリティグループを適用
```
- **公開用Webサーバー**が配置されている。
    - この時、Webサーバーとして運用しているインスタンスはHTTP通信が通ればいい。
        - HTTP、HTTPS通信を許可した**Webサーバー用セキュリティグループ**を作成、適用する。

<br>

- NATゲートウェイは、プライベートサブネット内のデータベースサーバーをリモート接続で操作しなければいけない場合にアドレス変換をする為に用意してある。
    - **データベースサーバーとして運用しているインスタンスのルートテーブル**にNATゲートウェイのルートが登録されていればOK

<br>

### プライベートサブネットの中身
```:プライベートサブネット内の構図
Private Subnet
└── Database Server    <==データベースサーバー用セキュリティグループを適用
```
- **インターネットに公開する必要のないデータベースサーバー**が配置されている。
    - データベースサーバーインスタンスはWebサーバーからのMySQLリクエストに応答できればいい
        - **Webサーバーの入っているインスタンスのプライベートアドレスからのMySQLリクエストのみを許可するデータベースサーバー用セキュリティグループ**を作成、適用する。

<br>
<br>

## ざっくりとした要点
### インターネットゲートウェイ
- **インターネットゲートウェイ（IGW）** と聞くと「覚えなきゃ！」という感覚になるが、要は物理ホストにおける **デフォルトゲートウェイ**の事。
- デフォゲという事なので、IGWは**パブリックサブネットからインターネットに出る通信の為**にある。
- だから、データベースサーバーのリモートアクセス用にはNATゲートウェイを使う。
<br>

### セキュリティグループ
- セキュリティグループは**インスタンスに適用する**設定である。
- だから、**コンソールでもEC2インスタンスのセキュリティタブ**に設定リンクがある。分かり易いね。
- **(重要)** セキュリティグループは **ステートフル**である。
    - ステートフルというのは、**「リクエストが届けば、その内容を理解して必要な返答はしてもいいよ」** という便利な性質のこと。
    - つまり、セキュリティグループの**インバウンドルールで受信許可を出した通信に関しては、アウトバウンドルールでいちいち適用しなくても返答してくれる**。
    - アウトバウンドルールは、セキュリティ要件の厳しいプロジェクトや、手順書などに特別指示がない限り設定しなくてもセキュリティグループは機能してくれる。

### ACL（アクセスコントロールリスト）
- **サブネット**に適用する。
- サブネットに対する設定なので、**コンソールでもインスタンスのサブネットIDリンクから飛んだVPC subnetウィンドウにネットワークACLタブ**がある。分かり易いね。
- **（重要）** ACLは**ステートレス**なので、ちゃんとアウトバウンドルールも設定する事。
- 簡単なACLルールの見方
    - **ルール番号**：数字が小さいものほど優先される。恐らく番号表の**最下行にある「*」のルールは、適用できるルールがなにもない場合に適用されるルールで、内容は「全部拒否」になっている筈**。
<br>

## 個人的に重要だったポイント
プライベートサブネット内のインスタンスに適用するセキュリティグループのルールで、インバウンドルールに設定する通信のソースは、**「[カスタム]：送信元インスタンスのプライベートIPアドレス（プレフィックスあり）」** に設定する！！
マウスカーソルを自作する

# はじめに
Webアプリを作成していて、マウスカーソルを「鉛筆」にしたかったのですが、

https://developer.mozilla.org/ja/docs/Web/CSS/cursor

こちらのサイトによると鉛筆っぽいカーソルは無いことが分かりました。
どうやら、画像ファイルをマウスカーソルに出来るようですので、自作することにしました。

# マウスカーソルの設定
マウスカーソルの設定はCSSで行います。

```css:cssでマウスカーソルのキーワードを指定
cursor: pointer;
```
これは良く使いますが、あまり知られていない(と思われる)画像のURLを指定する書き方があります。

```css:cssでマウスカーソルにする画像を指定
cursor: url('マウスカーソルにする画像ファイルのパス') <x> <y>, auto;
```

### 設定値について
マウスカーソルに指定できる画像の条件は
* サイズ：32px*32px
* 形式：pngまたはsvg

となります。

ファイルパスの後ろの「x」「y」はマウスカーソルを画像のどの位置に合わせるかの値です。
```css
cursor: url('pen.png') 0 32, auto;
```
のように指定すると、左下がカーソル位置になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/5b354b2e-9c71-9611-9061-64ee789580ad.png)

また、カンマの後ろの「auto」はファイルの取得に失敗した場合のカーソル形状の指定になります。

### カーソルにする画像を埋め込む
「埋め込む」と言うと語弊があるかもしれませんが、urlで指定するので以下のサンプルのようにsvgタグを直接指定することが出来ます。
```css
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" stroke="rgb(0,0,0)" stroke-width="1"><polygon points="1,31 3,21 24,1 31,8 10,29" fill="rgb(208,255,208)"/><polygon points="1,31 3,21 6,22 6.5,25 9,26 10,29" fill="rgb(255,255,208)"/><polygon points="1,31 2,26 5,30" fill="rgb(0,0,0)"/><line x1="6" y1="22" x2="26" y2="2"/><line x1="9" y1="26" x2="29" y2="6"/></svg>') 0 32, auto;
```
また、base64形式で埋め込むことも出来ます。

# サンプル
<p class="codepen" data-height="500" data-default-tab="result" data-slug-hash="NWQmgqQ" data-pen-title="Untitled" data-user="cjlsrdxi-the-builder" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/cjlsrdxi-the-builder/pen/NWQmgqQ">
  Untitled</a> by masayasu_t (<a href="https://codepen.io/cjlsrdxi-the-builder">@cjlsrdxi-the-builder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
【JavaScript】window.postMessage() の使い方

## `window.postMessage()`とは

`window.postMessage()` は、異なるオリジン間で安全にメッセージを送受信するためのメソッドです。このメソッドを使用することで、異なるドメイン、プロトコル、ポートを持つウィンドウやフレーム間でデータをやり取りすることができます。

## 使い方

### メッセージの送信

`postMessage()` メソッドは、以下のように使用します。

```javascript
// 送信先のウィンドウを取得
const targetWindow = window.open('https://sample.com', '_blank')

// 送信するメッセージ
const message = { type: 'greeting', text: 'Hello from parent!' };

// メッセージを送信
targetWindow.postMessage(message, 'https://example.com');
```

- **第一引数**: 送信するメッセージ（オブジェクトや文字列）
- **第二引数**: 受信側のオリジン（URL）。（このオリジンに一致する場合のみメッセージが受信されます）

### メッセージの受信

受信側では、`message` イベントをリッスンしてメッセージを受け取ります。

```javascript
window.addEventListener('message', (event) => {
    // 受信したメッセージのオリジンを必ず確認する
    if (event.origin !== 'https://example.com') {
        return; // 不正なオリジンからのメッセージを無視
    }

    // メッセージを処理
    console.log('Received message:', event.data);
});
```

- **event.origin**: メッセージを送信したウィンドウのオリジン（これを確認することで、信頼できるソースからのメッセージかどうかを判断できます）
茶色コーダーによるABC380振り返り


# はじめに

D問題でやらかしましたw(最初に言う事それ)
pop_countだけで行けるのに、色々深堀りしすぎて結局ACできませんでした(何をやっているんだか)
結局3完でした、連続<font color= "green">緑perf</font>にはなりませんでしたそれも,perfは茶色前半レートは、下がらなかったけど、ヒヤヒヤしました
同学年(中１)の皆さんは、結構4完していて、自分のAJLの順位は、おそらく下がると思っています
順位稼ぎにARC出るか検討中です(レートつかないけど)(0完でしたwwwwwwww)

~~すべて精進少しサボった結果です いやJOIの過去問解いてましたけど　それが原因なんだよ~~

来週はABCが金曜日開催ですね(開きなおって)
面白そうで楽しみです

使用しているライブラリ よかったら参考にどうぞ(メタいですが記事を書くのがめんどくさいのでリンクにしました)
[github](https://github.com/hidehic0/my-kyopro-code/blob/main/Performance/.template/code/main.py)

さて本題
今回眠いので問題の要約はしません、ていうか今回あまり要約することがありません(眠いのは流石に言いわけですよね)

# [A問題](https://atcoder.jp/contests/abc380/tasks/abc380_a)

問題文のとおりに実装した
ひっさしぶりに一分以内にA問題ACした

acコード(ライブラリ抜粋) [全文](https://atcoder.jp/contests/abc380/submissions/59825122) 多分全文のURLの需要ないけど載せておく　ていうかこの記事需要ないと思う、でも言語化できるからいいや

```python
S = s()
if S.count("1") == 1 and S.count("2") == 2 and S.count("3") == 3:
    print("Yes")
else:
    print("No")
```

# [B問題](https://atcoder.jp/contests/abc380/tasks/abc380_b)

pythonの場合splitを使えば簡単だった
具体的には、for文で0の部分を弾いてそのまま出力すればOK

acコード(ライブラリ抜粋) [全文](https://atcoder.jp/contests/abc380/submissions/59835464)

```python
S = s()
result = []
for t in S.split("|"):
    if len(t) > 0:
        result.append(len(t))

print(*result)
```

# [C問題](https://atcoder.jp/contests/abc380/tasks/abc380_c)

問題文が長くて読むので時間を消費した
1の塊の情報を取っておいてあとは、問題文のとおりに実装すればいい
pypyのstringが遅くてびっくりした そのせいで1ペナ食らってlistに修正したら、ACできた

acコード(ライブラリ抜粋) [全文](https://atcoder.jp/contests/abc380/submissions/59847456)
変数名が相変わらず一文字ですいません

```python
N, K = il()
S = list(s())
L = []

for i in range(N):
    if S[i] == "1":
        if i == 0:
            L.append([i, i])
        elif S[i - 1] == "0":
            L.append([i, i])
        else:
            L[-1][1] += 1

result = []

for i in range(N):
    if L[K - 2][1] >= i:
        result.append(S[i])
    elif L[K - 2][1] + 1 <= i <= L[K - 2][1] + (L[K - 1][1] - L[K - 1][0]) + 1:
        result.append("1")
    elif L[K - 2][1] + (L[K - 1][1] - L[K - 1][0]) + 2 <= i <= L[K - 1][1]:
        result.append("0")
    else:
        result.append(S[i])

print(*result, sep="")
```

# [D問題](https://atcoder.jp/contests/abc380/tasks/abc380_d)

最後までACできなかった

残り10分ぐらいでpop_count使うとこまではいったが変なとこに、行ってしまいACできなかった。
なんか解けないときコード書いてるとき、焦ったりして、精神的に消耗した

# 最後に

えーはい

$$
4完したかった
$$

明朝体で言うな
やべツッコミがカッコから飛び出してきた
レートは14ぐらい上がりました、レート600まであと10のところまで来ました
年内には、750ぐらいまでレートを上げたいです
あとJOI二次予選突破したいです。
【Django】エラー「because its MIME type ('text/html') is not executable...」の原因は...リダイレクト処理に

# 概要
Djangoアプリで「`because its MIME type ('text/html') is not executable...`」というエラーになりました。こちらの原因と解決方法を記載します。

## 原因
コンソールに表示されたエラー内容は以下です。

> Refused to execute script from 'http://localhost/login/?next=xxxxx.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/d8f8bee7-fb0b-8b40-d826-9d00fb61f991.png)

`login/...`から始まるパスになっていますが、実際にアクセスしたのは、そんなパスではないです。
なぜか`login/...`にリダイレクトされてしまっている、という状況です。

なぜだろう？と思ってプロジェクトディレクトリの`urls.py`をよく見てみると、

```py
path('', admin.site.urls)
```

上記のように記載がありました。

ルートURL（空のパス）がDjangoのadmin（管理）サイトに飛ぶようにマッピングされてしまっています。
これが原因でした。

これにより、アプリケーションの他のすべてのURLも管理サイトにリダイレクトされてしまい、静的ファイルのリクエストも含め、アクセスがすべて`login/?next=...`にリダイレクトされることになっていたのです。

## 解決方法

以下のように`admin/`パスに設定することで、ルートURLが管理サイトと重複せず、意図通りに機能するようになりました。

```py
path('admin/', admin.site.urls)
```

ただ、「`because its MIME type ('text/html') is not executable...`」エラーを調べてみると、いろいろなところで原因が様々上がっており、場合によっては原因不明というのも見かけます。というのも、実際にエラーが起きているのはDjango側の設定のどこかであって、「MIMEタイプ（ファイルの種類）がサポートされていない」エラーというわけではないことが多いからでしょう。要はエラーメッセージだけでは原因特定が難しいのではないかと思われます。

今回の私の解決方法は一例に過ぎませんが、
・`urls`設定が間違っていないか
・正しいかパスか
・タイプミスがないか
・最近いじった箇所で怪しいところがないか
などを見直していくとヒントがあるかもしれません。

(admin参考)

https://docs.djangoproject.com/ja/5.1/ref/contrib/admin/
クラウドコストを最適化：AWSのコスト管理を効率化するためのAWS Cost Explorer活用法

## はじめに
日常的にAWSを使用してさまざまな検証を行っていますが、その中で私にとって、最も大切なのはコストの管理です。

:::note warn
**特にクラウド環境では、リソースを使いすぎると予期しないコストが発生することがあります。したがって、コストがかからないように常に慎重に確認しながら作業を進める必要があります。**
:::

今回は、コスト管理に役立つツールである「**AWS Cost Explorer**」の機能を紹介し、実際の画面を見ながらどのようにコストを確認し、予測していくかを説明していきます。

## AWS Cost Explorerとは？
AWS Cost Explorerは、AWSの利用状況とコストを視覚的に分析するためのツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2540aa91-84ac-739b-1bf7-a6019286054f.png)

AWSのリソースを使用する際、どのサービスがどれくらいのコストを占めているのか、月々のコストの推移はどうなっているのかを簡単に把握できます。

:::note warn
**また、過去のデータを基に将来のコスト予測を行ったり、リソースの最適化についての提案を受けることもできます。**
:::

これにより、予期せぬコスト増加を防ぐための予防策を講じやすくなります。

### AWS Cost Explorerの特徴

長期間使用していないインスタンスを停止したり、過剰にプロビジョニングされたインスタンスのサイズを変更することで、コスト削減のためのアクションを取ることができます。

:::note info
- **コストの可視化:** 
コストや使用量をグラフやチャートで視覚的に表示できるため、どのサービスやリソースがコストを多く消費しているのかを一目で理解できます。

- **フィルタリング機能:** 
サービス別、リージョン別、タグ別など、さまざまな条件でコストデータを絞り込んで分析できます。

- **予測機能:** 
過去12ヶ月分のデータに基づいて将来のコストを予測し、予算の編成に役立てることができます。

- **アラート機能:** 
特定のコスト範囲を超えると通知を受けることができ、コスト管理における注意を喚起します。
:::

## 実際に使ってみた

まずは、AWS Management Consoleにログインし、Billing and Cost Management Dashboardに移動して、「Cost Explorer」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1baba254-2ffb-32c4-bc1b-b351de215290.png)

これでCost Explorerのダッシュボードにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f003a52e-aab5-35ca-903f-4b3204cd76ce.png)

ダッシュボードでは、月ごとのコストトレンドやサービス別コスト分析を視覚的に確認でき、特にどのサービスが予想以上にコストを消費しているのかがすぐにわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/de0b837b-2360-7928-b854-6b093a823d04.png)

また、コストの発生源を特定するためにフィルタリング機能を活用し、タグやサービス別にコストを絞り込んで詳細な分析ができました。

## 今月のコストを予想してみた
AWS Cost Explorerには、過去のデータを元に将来のコストを予測する機能があり、これを使って今月のコストがどれくらいになるか予測しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3e565e5a-dc2b-82ad-320b-500b3ea3303d.png)

:::note alert
**実際に過去の1ヶ月分の使用データを基に予測した結果、思った以上にコストが高く、特に検証作業に使用しているサービスでの消費が目立ちました。**
:::

これにより、今後のコストを把握し、必要なリソースを調整するための対策を講じることができました。

## まとめ
実際に今月のコストを予測してみた結果、予想以上にコストがかかっており、少し焦りましたが、サービスの使用方法やリソースの最適化を検討する良いきっかけとなりました。

:::note
**やはり、AWSのサービスは「習うより慣れろ」の世界であり、身銭を切ってでも検証を続けることが成長につながると信じています！**
:::

今後も定期的にコストを確認し、最適化していくことで、より効果的にAWSを利用していきたいと考えています。

## 参考記事

https://dev.classmethod.jp/articles/analyze_awsfee_by_costexplorer/

https://zenn.dev/collabostyle/articles/1661b7ebfc2970
NGINXが異常終了したときに確認したいエラーログ

NGINXが異常終了した場合、多くの場合その情報はログに記録されます。NGINXは以下の2種類のログを使用して動作に関する情報を記録します。

はい、NGINXが異常終了した場合、多くの場合その情報はログに記録されます。NGINXは以下の2種類のログを使用して動作に関する情報を記録します。

---

### 1. **エラーログ (error log)**

- **異常終了やエラーの詳細情報が記録される主要なログです。**
- デフォルトでは、`/var/log/nginx/error.log` に記録されます。
- ログの場所や詳細な設定は、NGINXの設定ファイル (`nginx.conf`) の `error_log` ディレクティブで指定されています。

**例:**

```
error_log /var/log/nginx/error.log warn;
```

**ログ例:**

```
2024/11/16 14:32:10 [alert] 12345#0: worker process 12346 exited on signal 11 (core dumped)
```

### 2. **アクセスログ (access log)**

- アクセスに関する記録が主で、通常、異常終了はここには記録されません。
- デフォルトのログファイルは `/var/log/nginx/access.log` ですが、異常終了の詳細には役立たないことがほとんどです。

はい、NGINXが異常終了した場合、多くの場合その情報はログに記録されます。NGINXは以下の2種類のログを使用して動作に関する情報を記録します。

---

### **異常終了時のチェックポイント**

1. **エラーログを確認:**
   - コマンド例:
     ```
     tail -f /var/log/nginx/error.log
     ```
     ‌
2. **NGINX設定ファイルを確認:**
   - 設定ファイル (`/etc/nginx/nginx.conf` など) で、`error_log` のパスがカスタマイズされている可能性があります。
3. **システムログの確認:**
   - システムレベルのエラー（OOMなど）はNGINXエラーログに記録されない場合があるため、`journalctl` や `/var/log/syslog` を確認してください。
   - コマンド例:
     ```
     journalctl -u nginx
     ```
     ‌
4. **コアダンプの確認:**
   - エラーログに `core dumped` と記載されている場合、コアダンプファイルを生成している可能性があります。`ulimit` 設定やシステム設定によって保存場所が異なります。
   - コアダンプを調査するには `gdb` などを使用します。

---

### **ログの詳細度を調整:**

- デフォルトでは「`error`」レベルのログが記録されますが、必要に応じてログレベルを変更することができます。 **例:**
  ```
  error_log /var/log/nginx/error.log debug;
  ```

ログレベルには以下があります（低→高）:

- `debug`
- `info`
- `notice`
- `warn`
- `error`
- `crit`
- `alert`
- `emerg`

---

**まとめ**
異常終了が発生した場合は、エラーログ (`/var/log/nginx/error.log`) を最優先で確認してください。また、問題の詳細に応じて、システムログやコアダンプの情報も併用して原因を特定してください。
Geekbenchをx86エミュレーションで回す方法【Windows/Mac】

Geekbenchをx86エミュレーションで回すのに手こずったのでメモ．

### Mac
GeekbenchをRosettaで開く設定にしても，パフォーマンスの計測自体はARMで行われてしまう．  
FinderのアプリケーションフォルダでGeekbenchを副ボタンでクリックし，パッケージの内容を表示をクリックする．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491985/8b2f7cdb-01b6-c3cc-17ff-cb6df90bd0dc.png)

`Contents/Resources/`と辿るとx86用の実行ファイル`geekbench_x86_64`が現れるので，ダブルクリックして直接実行する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491985/9ef19950-a212-dfd0-3c3d-41857be500f2.png)


アクティビティモニタを見ると種類: Intelで実行されていることが確認できる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491985/9f81b3d2-f021-e054-fd36-f580e31b519f.png)


### Windows
ARM環境で普通にインストールするとAArch64のバイナリしか展開されない．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491985/60e74a2e-87a2-98d5-a382-1bd5ee2edf5b.png)


インストーラのexeファイルを[7-Zip](https://7-zip.opensource.jp/)で展開する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491985/1f295998-36c3-321d-6560-bc3f9f584f5c.png)


展開フォルダを開くとx86用の実行ファイル`geekbench_x86_64.exe`が現れるので，ダブルクリックして直接実行する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491985/c1049066-1f14-0690-38d8-2d74e22f80f5.png)


タスクマネージャを見るとx64モードで実行されていることが確認できる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491985/ff5f187a-0601-6cfb-b77b-d9ffcae33606.png)
iosアプリの画面遷移(NavigationStack)

# 成果物
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557990/60b3601c-5bdb-baed-c6fd-bd80704dcca1.gif)





# 遷移先のページを用意
最初の画面のView（デフォルトでTitleViewという名前）と同じ階層に新しいファイルでViewを定義。
```swift:NextView
import SwiftUI
struct NextView: View {
    var body: some View {
        VStack {
            Text("Welcome!")
        }
    }
}
```

# NavigationStackの用意
最初の画面（TitleView）の中にNavigationStack構造体でリンクを貼る。
以下のようにPreviewもできるようにしておくとXcode上で確認可能。
```swift
struct TitleView: View {
    var body: some View {
            NavigationStack{
                NavigationLink(destination: NextView()){
                    Text("画面遷移")
                }
                Text("Hello, world!")
            }
            .padding()
        }
}

#Preview {
    TitleView()
}

```
コード好きで陰キャなアプリ屋こそクラウドを使え！

はじめに
---
　変なタイトルですいません。私は、しばらくブランクはあったものの、これまで長年アプリケーションエンジニアとしてやってきまして、システム開発の大変さをアプリ屋として実感してきました。
　そんな中、ちょっとしたことがきっかけで、パブリッククラウドを勉強することになり、その素晴らしさに感動し、改めて活躍の場ができるかもしれないと感じ、新たな楽しみになっております。
で、意外と共感いただける方がぼちぼちいるのではないかと思い、この記事を書きました。

パブリッククラウド以前の開発
---
　アプリケーションエンジニアにとって、特に昔ながらのウォーターフォールで開発を行っていると、ハードウェア調達期間を考慮するため、要件定義段階からハードウェア構成を意識し、通常時どの程度のリクエスト（トラフィック）が発生し、ピーク時にはどの程度までトラフィックが増加するのかをお客様と想定しながら、インフラエンジニアにハードウェア見積もりをしてもらっていたわけですが、要件定義段階での想定は得てしてざっくりなので、後からその想定が異なると、ハード調達後のプロジェクト後半に位置する性能試験などの段階で、商用に準備したハードでピーク性能が出ず、アプリのチューニングを必死で行うなど、スリリングな開発をしていたと思います。（このあたりは、いろいろご意見あるとは思いますが）

　また、多少偏見があるかもしれませんが、アプリケーションエンジニアから見て、インフラエンジニアは、多くがハードウェアに強い理系の方が多く、非常にカチッとしていて信頼できるのですが、若干お願いしにくい雰囲気があり、とはいえ無理なお願いをしなければならないことも多いため、なかなかアプリチームとインフラチームが何のわだかまりもなく仲良く開発、とはいかないのが実情でした。
（こちらもいろいろご意見あると思います^^;）

パブリッククラウドの登場
---
　パブリッククラウド以前より、VMWareを中心として、VMによるハード仮想化などはありましたが、パブリッククラウドが登場したことにより、サーバやネットワークハードが仮想化されただけでなく、オートスケーリングと呼ぶクラウドならではの、動的にサーバ台数を増減できる仕組みができました。ロードバランサと連携すれば、例えばWebサーバをリクエスト数により増減させることが、いとも簡単にできるようになります。先に述べた要件定義時の性能が足りない、というときに、大騒ぎせず済むようになります。もちろん費用はゼロではありませんが、アプリのチューニングや追加ハードの検討等を行うのに比べれば、次元の違う安心感です。

マネージドサービスの登場
---
　さらに、マネージドサービスという、ユーザが仮想ハードの設定にすら関与せずに済むAPIやサービスが拡充され、オートスケーリングやロードバランサの設定すら気にせず（一部設定がある場合もあります）、実行したいプログラムコードを記述するだけで簡単なWebサーバなどはリリースすることが可能となります。
　もちろん、商用リリースとなると、セキュリティなどきちんと設計せねばなりませんので、完全に一人で、とはいかないかもしれませんが、かなりのところまで一人で実施できると考えられます。

まとめ
---
　プログラミングが大好きで、できるだけインフラチームの方に負担を掛けずにシステム開発できたらいいな、と思うアプリケーションエンジニアの方は、クラウドで開発してみるという選択肢もあるよ、ということを言いたいお話しでした。いろいろご意見あるかと思いますが、この記事をきっかけにクラウドにチャレンジしてみていただけると嬉しいです。
ABC380をPythonで（A～D）

AtCoder Beginner Contest 380の解答等の速報的まとめ

https://atcoder.jp/contests/abc380



# A問題
https://atcoder.jp/contests/abc380/tasks/abc380_a

並び替えた時が1,2,2,3,3,3と一致すればいい
```python:A
print("Yes" if sorted(input()) == ["1","2","2","3","3","3"] else "No")
```
# B問題
https://atcoder.jp/contests/abc380/tasks/abc380_b

| が入るたびにカウントをリセットして数えていく
```python:B
ans = []
for i in input():
    if i == "|":
        ans.append(0)
    else:
        ans[-1] += 1

print(*ans[:-1])
```
# C問題
https://atcoder.jp/contests/abc380/tasks/abc380_c

座標圧縮の要領で$01$の個数をまとめて$K$番目の$1$がどこかを間違えないように値を調整すればいい
```python:C
n, k = map(int, input().split())
s = input()

lst = []
last = -1
for s_i in s:
    if last != s_i:
        lst.append(0)
    lst[-1] += 1
    last = s_i

if s[0] == "0":
    target = 2 * k - 1
else:
    target = 2 * k - 2

lst[target - 2] += lst[target]
lst[target] = 0

now = s[0]
ans = []
for l_i in lst:
    ans.append(str(now) * l_i)
    now = "0" if now == "1" else "1"

print("".join(ans))
```
# D問題
https://atcoder.jp/contests/abc380/tasks/abc380_d

$K_i$の値で何回目の$S$の何番目かは容易に求められる
これで$x$番目の$S$が大文字小文字をスワップさせているか求められればいい

これはbitの一番上を消した値がスワップさているか否かの真偽反転させているものと一致する
（今思うに、bitの立っている数の偶奇で求められそう）
```python:D
def is_swap_case(x):
    if x == 0:
        return False
    elif x == 1:
        return True
    t = is_swap_case(x & ~(1 << (x.bit_length() - 1)))
    return t ^ True


s = input()
q = int(input())
k = list(map(lambda x:int(x) - 1, input().split()))

for k_i in k:
    turn, ind = k_i // len(s), k_i % len(s)
    if is_swap_case(turn):
        print(s[ind].swapcase(), end = " ")
    else:
        print(s[ind], end = " ")
```
Mochi Cards APIのPythonスクリプト例

# Mochi Cardsとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/05accb19-79e0-431f-07ec-a3a27f411963.png)


MochiCardsは暗記用のフラッシュカードを作成する(Web/モバイル)アプリです。
効率よく長期記憶に定着させるための**分散学習**を行うことに最適化されており、忘れた頃に問題が出題されるため、長期記憶の強化に最適化されています。

詳細に再出題の頻度などを設定できる点や、類似のアプリAnkiと比較してUIが優れていること、モバイルとPCでも同期(要サブスク)して使用できるため外出先でも使用可能なことなどが優れています。

サブスクが必要になりますが、APIを使用することでカードの作成が可能なため、他のアプリからの移行や、まとめてカードの設定を変更するなどを簡単に行うことができます。

今回はPythonからAPIを使用してカードを登録する例をご紹介します。

:::note warn
Mochi CardsのAPIを使用するには**サブスクが必須**となります。
:::





# Pythonによるスクリプトの例
## requestsライブラリのインストール
```bash
pip install requests
```

## カード作成スクリプト例
```mochi_api_sample.py
import requests
from requests.auth import HTTPBasicAuth
import json

# APIのエンドポイントとAPIキー
API_URL = "https://app.mochi.cards/api/cards"
API_KEY = "ここにAPIキー"

# カード作成のためのデータ
payload = {
    "content": "これはAPIから作成されたカードです。",
    "deck-id": "ここにdeck-id"
}

# ヘッダー情報
headers = {
    "Content-Type": "application/json"
}

# 認証情報の設定
auth = HTTPBasicAuth(API_KEY, '')

# POSTリクエストでカードを作成
response = requests.post(API_URL, headers=headers, data=json.dumps(payload), auth=auth)

# レスポンスの確認
if response.status_code == 200:
    print("カードが正常に作成されました。")
    print("レスポンスデータ:", response.json())
else:
    print(f"エラーが発生しました。ステータスコード: {response.status_code}")
    print("エラーメッセージ:", response.text)

```

特筆すべき点としては、Mochi APIでは認証にBase64でエンコードした認証ヘッダーが必要となります。

```
# 認証情報の設定
auth = HTTPBasicAuth(API_KEY, '')
```

成功時は以下のような出力例となります。
```
カードが正常に作成されました。
レスポンスデータ: {'tags': [], 'content': 'これはAPIから作成されたカードです。', 'name': 'これはAPIから作成されたカードです。', 'deck-id': '3OBZo9wR', 'cloze/indexes': [], 'pos': 'U', 'references': [], 'id': 'QQjTjApk', 'reviews': [], 'created-at': {'date': '2024-11-16T13:32:43.678Z'}, 'new?': False, 'template-id': None}
```

# APIに必要な情報の取得場所
## APIキー
![11ff377080857bb4037ebd938bc66d4f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/e3c2f076-47d4-6a07-a981-166ec92dbab4.png)
左上にあるユーザー名の'Account settings'から
<br>
![ee4e6b73c0ac24dcdca02a94bb706fb5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/ccb0cdc3-9174-564e-2002-d9a582cab0b0.png)

開いたモーダルをスクロールすると現れる'Create API Key'でAPIキーを生成できます。

## Deck ID
![82a159c04101f7f83b317cebe7338e93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/e92ccba4-7a75-c133-0536-6e9d3481ca87.png)

Deckを右クリックすると現れる'Copy ID'から取得できます。

:::note warn
[[3OBZo9wR]]のように、[[ ]]を含む形式でコピーされますが、必要な情報は内部のテキストな点に注意が必要です。
:::




# 参考
分散学習

https://ja.wikipedia.org/wiki/%E9%96%93%E9%9A%94%E5%8F%8D%E5%BE%A9

mochi 公式

https://mochi.cards/

mochi API Document

https://mochi.cards/docs/api/
Seleniumで不要なログを非表示にする

## 環境
Seleniume (4.24.0)
Ruby 3.3.5


## 内容

Seleniumを使ってRPAをしていると、ときどき、このようなメッセージが表示されます。

```
Created TensorFlow Lite XNNPACK delegate for CPU
```

「CPU用にTensorFlow Lite XNNPACK デリゲートを作成しました。」というメッセージです。infoレベルのログであり、エラーが出ているわけではありません。開発者からしてみれば一向に無視してくれていいのだが、エンドユーザーからすれば「なんかエラーが出てきた！対応してください！」という話が上がってきます。

気になるようであれば、ログを止めてしまいましょう。クレーマー対策というところか？

## 解決方法

**add_argument**オプションで、**--log-level=1**にすれば、ログが出力されなくなります。つまり、ログが無効になります。

情報レべルのログは出力されなくていいのだが、いざという時のために、重大なエラーだけは表示させたいといった場合は、**--log-level=3**にしておきましょう。

オプションを追加する場所には注意してください。driverに対して設定するので、driverを定義する前に記述してください。

```hoge.rb
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--log-level=1')                         # これを１行追加
driver = Selenium::WebDriver.for :chrome, options: options
```
【CSS】この12pxはどなた？【ボックスモデル】

## 状況

幅300pxを指定したボックスを作ろうとしています。
内側にも要素を入れたいのでpaddingを足し、枠線も追加したいのでborderも入れてみます。
CSSの記述は以下のようになりました。

```css
.box {
  width: 300px;
  height: 200px;
  padding: 5px;
  margin: 10px;
  border: 1px solid black;
}
```
良さそう！
しかし、実際の要素の幅を見てみると──

<img width="500px" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348975/293e431b-2449-cd9c-448e-ccd1f7ae18cf.png">


**この12pxはどなた？**

先にCSSを記述したので予想できた人もいるかもしれませんが、
これは上記で指定したpaddingとborderによってできた余分です。

本記事では「ボックスモデル」という概念を踏まえて、改めて説明してみようと思います。

## ボックスモデルとは
CSSには **ボックスモデル** という概念があり、それによって要素の幅が決まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348975/8d7550e0-614b-c9ec-9f06-9c596de7bc5d.png)

paddingとborderを幅に含めるのが、**標準ボックスモデル**です。

上述した12pxは、標準ボックスモデルを使用したことによる
<INS>`paddingの左右10px分 + borderの左右2px分`、追加された幅だった</INS>
ということでした。

ちなみに**marginはボックスのサイズ自体には含まれません**。

## ちなみに

borderとpaddingをコンテンツの幅に含める場合は、以下のように記述します。

```css
.box {
  width: 300px;
  height: 200px;
  padding: 5px;
  margin: 10px;
  border: 1px solid black;
  box-sizing: border-box; /* この行を追加 */ 
}
```
box-sizingとは、ボックスモデルを調整するためのプロパティです。
規定では<INS>content-box</INS>が指定されており、
これが上記のpaddingとborderを幅に含めた標準ボックスモデルを指しています。

これにより、実際の要素の幅は以下の様になりました。

<img width="500px" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348975/740848f5-aad3-8ad6-5a46-b6240efa9cde.png">

box-sizingにborder-boxを指定したときのボックスモデルを**代替ボックスモデル**といいます。
標準/代替ボックスモデルの切り替えに関しては、MDN Web Docsに[サンプル問題](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/The_box_model#%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B:~:text=%E3%82%93%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B,-%E4%BB%A5%E4%B8%8B%E3%81%AE%E4%BE%8B)があるのでぜひコードで試してみてください。



## 用語おさらい
- **ボックスモデル**：ボックス（要素のレイヤー）へのCSSのあたり方の概念
- **標準ボックスモデル**：
    指定する幅と高さにおいて、paddingとborderをその値に**足して**計算する
- **代替ボックスモデル**：
    指定する幅と高さにおいて、paddingとborderをその値に**含めて**計算する


## 参考サイト
https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/The_box_model
JavaからGoへ：次なる一歩を

今回は次の案件でGo使った案件に入らせていただくことになったので記事にしてみました。

# 1. JavaとGoの違いを理解する

JavaとGoはどちらも強い型付けの言語ですが、そのデザイン哲学には大きな違いがあります。

**シンプルさ重視のGo**：Javaは多くのオブジェクト指向の概念（継承、インターフェース、多態性）を提供します。一方で、Goはこれらの概念を簡素化し、シンプルで読みやすいコードを書くことを重視しています。たとえば、**Goにはクラスがなく、代わりに構造体（struct）とメソッドを使って同様の機能を実現します。**

**パッケージと依存管理**：JavaではMavenやGradleなどのビルドツールを使って依存関係を管理しますが、Goには組み込みの依存管理ツール（go mod）があり、セットアップが簡単です。**パッケージの取り扱いがシンプルなことが、Goの魅力の一つです。**

# 2. Goの並行処理モデル

Javaで並行処理を行うにはスレッドやExecutorを使いますが、**Goにはゴルーチン（goroutine）とチャネル（channel）があります。**

ゴルーチンは非常に軽量なスレッドのようなもので、簡単に並行処理を実装できます。Javaでスレッドを管理するのに比べ、Goではgoキーワードを使うだけで新しい並行処理を開始できるため、非常にシンプルです。

チャネルは、ゴルーチン間のデータのやり取りを安全かつ効率的に行うための仕組みです。JavaのBlockingQueueに似た機能を持っていますが、Goでは言語レベルでサポートされているため、より直感的に使えます。

# 3. エラーハンドリングの違い

Javaではtry-catch構文を使った例外処理が一般的です。一方、Goではエラーは値として扱うという哲学に基づいており、関数はエラーを返り値として返します。このため、エラー処理がコードに明示的に表現され、どこでエラーが発生する可能性があるかが明確になります。

```Go
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("division by zero")
    }
    return a / b, nil
}
```

このように、**Goではエラーを返す関数を書き、呼び出し側でエラーチェックを行います。これはJavaでの例外のキャッチとは異なり、より明示的で簡潔です。**

# 4. 開発環境とツール

Java開発ではIDE（Eclipse、IntelliJなど）が非常に重要な役割を果たしますが、Goはシンプルなエディタでも十分に開発可能です。Goには標準的なツール（gofmtやgo buildなど）が豊富に揃っているため、セットアップが簡単でコーディングの効率も向上します。

# 5. オブジェクト指向 vs 構造体とインターフェース

Javaに慣れていると、クラスベースのオブジェクト指向がデフォルトと感じられるかもしれません。しかし、**Goでは構造体とインターフェースを用いて柔軟に設計します**。Goのインターフェースは実装の強制をせず、任意の型が必要なメソッドを持っていれば、そのインターフェースを満たすことができます。この設計はJavaのインターフェースに比べ、柔軟でシンプルです。

# 6. Goのフレームワーク

JavaにはSpringやHibernateといった強力なフレームワークがありますが、GoにもWeb開発をサポートするためのいくつかのフレームワークがあります。

**Gin**：軽量で非常に高速なWebフレームワークです。シンプルなAPIを作成するのに適しており、Goのパフォーマンスを最大限に活かすことができます。

**Echo**：Ginと似た特徴を持ち、使いやすさとパフォーマンスの両方を追求したWebフレームワークです。シンプルなルーティングと中間処理のサポートが特徴です。

**Fiber**：Express.jsにインスパイアされたフレームワークで、高いパフォーマンスと開発のしやすさを兼ね備えています。

これらのフレームワークを使うことで、GoでのWebアプリケーション開発がより効率的になります。プロジェクトの要件に応じて、適切なフレームワークを選択してみてください。

# まとめ：Goの魅力

JavaからGoを学ぶことで、コードのシンプルさ、軽量な並行処理、効率的なエラーハンドリングといった新たな視点を得ることができます。Goは学習曲線が緩やかでありながら、強力なツールと高速なパフォーマンスを提供してくれる言語です。Javaの知識を活かしつつ、新たな概念を取り入れて開発力を広げてみましょう。

ぜひGoで最初のプロジェクトを始めて、その違いや新たな可能性を実感してください！

**最後までよんでいただきありがとうございます。
@y-t0910をフォロー,いいねしていただけると嬉しいです！**
Ｗｅｂデザイン　いろいろなレイアウトの練習 


・ ネガティブマージンはマージン（負）をマイナス指定すること。
・例えば　 margin-bottom: -40px;
・last-of-typeやfirst-of-typeといった擬似クラスがある。
・擬似クラスは、マウスを特定の文字に重ねた時、色を変えたり、リンクの色を変えたりするもののようだ。
・例えば、

リンクの色を変える場合
Webページのリンクが「まだクリックされていない」状態と「クリックした後」の状態で色を変えたいとします。
css
コードをコピーする
/* まだクリックしていないリンク */
a:link {
color: blue;
}

/* クリックした後のリンク */
a:visited {
color: purple;
}

ここでいう擬似クラスは、
.flex-container_flex02:last-of-type{
flex-direction: row-reverse;
}

・z-indexは重なりの順番を調整してくれるもの
例えば、エクセルの図形を最背面、最前面といったように重なりを調整するイメージ。
ここでは、
box-sizing: border-box;
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index:2;
}
.section-wrapper:first-of-type{
・positionの使用
例えば、
position: relative;
}
.img-wrapper_broken{
max-width: 580px;
}
.text_broken{
width: 390px;
padding: 30px;
background-color: #fff;
position: absolute;
top: 50%;
right: 0;
transform: translateY(-50%);
なお、toransformプロパティは縦方向（y軸）、横方向（x軸）のみ移動可能
・positionの注意点として、自由度が上がるがその代わり難易度が高くなる。
そうするとレイアウトが崩れてしまう危険性があるので、どうしても使用しないといけない時しか使わないようにする

・ネガティブがあるということはポジティブ（正）もあるとか。ポジティブマージンを通常のマージンのことだ。
・first-of-typeがあるということは、second-of-typ、third-of-type、forth-of-type、fifth-of-typeがあると思いきや、
first-of-typeしかないとのこと。なぜないのかは定かではない。

「first-of-type」　と、「 first child」の違いについて
◎.section-wrapper:first-child
親要素から見て一番最初の要素が.section-wrapperである場合にマッチする

◎.section-wrapper:first-of-type
親要素内から見て複数ある.section-wrapperの中で一番最初の.section-wrapperにマッチする

//first-child及びfirst-of-typeの両方にマッチします -省略-
-省略-
-省略-
ただし、もしmainタグの中に最初に別の要素があった場合は、 .section-wrapperが「親要素から見て一番最初の要素」ではなくなるため、 first-childにはマッチしなくなります。
追加された要素
//first-of-typeのみにマッチします -省略-
-省略-
-省略-
【AWS / Lambda】LocalでLambda予行練習

今回は、AWSのLambdaサービス入門者向け、ローカルでいろいろ検証したい方向け、にそれっぽい環境を立ち上げることができるリポジトリを作ってきました。

https://github.com/umekikazuya/SAM-Local-Sandbox

## 対象
- 入門者(初学者)
- 知識の理解とかいいから、取り急ぎでローカル環境を作りたい人

**※ 記事内で利用する各サービスについての紹介は省かせていただきます。**
**※ 取り急ぎ環境を立てたい人向けの記事です。**

## この記事を読めばなにができるの？
「LocalでLambdaが動作する環境」をすぐ立ち上げることが可能

### ゴール
ブラウザアクセス(CLIアクセス)して、JSONが返ってくるところまで。

## 手順
この記事を読むのすらもめんどくさい人向けに、3ステップで終わる手順書を別で用意してます。

そんなめんどくさがり屋なあなたには[こちら](https://github.com/umekikazuya/SAM-Local-Sandbox/blob/main/Docs/local.md)。

### 001. SAM CLI のインストール
AWS SAM CLIをインストールします。

#### Macの場合
```bash
brew tap aws/tap
brew install aws-sam-cli
```

その他のOSのインストール方法は[公式ドキュメント](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)を参照してください。

### 002. 初期設定
以下のコマンドで、関数の設定、ランタイムの設定等ができます。
```bash
sam init
```

もちろん手動で Yamlファイルを作成することも可能です。

**記事内で `init`コマンドの詳細は説明しません。**

私は以下のようにテンプレートファイルを作りました。
```yaml:template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: >
  SAM Local Sandbox

  Template for "SAM Local Sandbox"

Globals:
  Function:
    Timeout: 3
    LoggingConfig:
      LogFormat: JSON
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: app/
      Handler: app.handler
      Runtime: nodejs20.x
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
```

:::note info
簡単に説明すると。
`/hello`にアクセスしたら、`app` ディレクトリ内の、`app.cjs` 内の `handler`関数が呼び出せるよ。
って感じ。
:::

### 003. JS関数の用意(サンプル)
```js:app/app.mjs
export const lambdaHandler = async (event) => {
    return {
        statusCode: 200,
        body: JSON.stringify({ message: "Hello World!" }),
    };
};
```

### 004. 動作確認

以下のコマンドでローカル環境を起動します。

```bash
sam build && sam local start-api
```
ローカルのAPI Gatewayが立ち上がり、アクセス可能になります。

ブラウザまたはCLIで以下にアクセスしてください。

```
http://{ローカルのホスト}/hello
```

#### 期待されるレスポンス
```json
{
    "message": "Hello World!"
}
```

## まとめ
ローカル環境でLambdaを動作させる基本的なセットアップが完了しました。

初学者の方にとって、理解が深まるような教材となっていれば幸いです。
質問やフィードバックがあれば、リポジトリのIssues、本記事のコメント等お待ちしております。
ずんだもん「Next.js 15 の新機能について解説するのだ！」

:::note warn
この記事は`Gemini-exp-1114`で生成した内容をベースに使用しています。
:::

ずんだもん「こんにちは！僕ずんだもんなのだ！今日はつむぎちゃんと一緒に、**Next.js 15 の新機能**について解説するのだ！」

つむぎ「春日部つむぎです！ずんだもんさん、よろしくお願いします！Next.js 15、どんな新機能があるんですか？楽しみですね！」

ずんだもん「そうだなのだ！Next.js 15 は、**パフォーマンスの向上**、**開発体験の向上**、**新機能の追加**など、盛りだくさんな内容になっているのだ！今日はその中でも特に注目すべきポイントを紹介するのだ！」

つむぎ「わくわくしますね！早く教えてください！」

## 1. パフォーマンスの向上！高速化を実現する新機能！

ずんだもん「まず最初は、**パフォーマンス向上**に関する新機能なのだ！Next.js 15 では、**ビルドの高速化**と**レンダリングの最適化**が実現されたのだ！」

つむぎ「ビルドとレンダリングが速くなるのは嬉しいですね！具体的にはどんな改善があったんですか？」

ずんだもん「まず、**Turbopack の改善**によって、開発サーバーの起動とホットリロードがさらに高速になったのだ！変更を保存してからブラウザに反映されるまでの時間が短縮されて、開発効率が大幅にアップするのだ！」

:::note info
**Turbopack の改善点**

- Rust で記述された高速なバンドラーである Turbopack がさらに進化しました。
- 特に大規模プロジェクトでのビルド速度の向上が顕著です。
- メモリ使用量も削減され、より効率的な開発が可能になります。
:::

つむぎ「それはすごい！開発が快適になりそうですね！」

ずんだもん「さらに、**画像最適化機能の強化**も行われたのだ！新しい画像フォーマットへの対応や、より高度な圧縮アルゴリズムの導入によって、画像の読み込み速度が向上し、ユーザー体験が向上するのだ！」

:::note info
**画像最適化の強化**

- AVIF や WebP などの次世代画像フォーマットへの対応が強化されました。
- 画像の遅延読み込みや、プレースホルダー表示の最適化も行われています。
:::

つむぎ「画像はページの表示速度に大きく影響するから、最適化が強化されるのは助かりますね！」

## 2. 開発体験の向上！より使いやすく、効率的な開発を！

ずんだもん「次は、**開発体験の向上**に関する新機能なのだ！Next.js 15 では、開発者の作業を効率化するための機能が追加されたのだ！」

つむぎ「開発体験が向上すると、開発が楽しくなりますよね！どんな機能が追加されたんですか？」

ずんだもん「まず、**デバッグツールの強化**が行われたのだ！エラーメッセージがより詳細になり、問題の特定が容易になったのだ！さらに、開発サーバーにデバッグ用のオーバーレイが表示されるようになり、開発中の問題を素早く発見できるようになったのだ！」

:::note info
**デバッグツールの強化**

- エラーメッセージの改善により、問題の原因を特定しやすくなりました。
- 開発サーバーに表示されるオーバーレイにより、レンダリングの問題などをリアルタイムで確認できます。
:::

つむぎ「エラーの原因がすぐにわかるのは助かりますね！デバッグ作業が捗りそうです！」

ずんだもん「そして、**TypeScript のサポートが強化**されたのだ！型推論の精度が向上し、より安全で効率的なコードを書けるようになったのだ！また、新しい TypeScript テンプレートも追加されて、プロジェクトのセットアップが簡単になったのだ！」

:::note info
**TypeScript サポートの強化**

- 型推論の精度が向上し、開発者の意図しない型エラーを減らすことができます。
- 新しい TypeScript テンプレートが提供され、プロジェクトの初期設定が容易になります。
:::

## 3. 新機能の追加！さらに柔軟な開発を実現！

ずんだもん「最後は、**新機能の追加**についてなのだ！Next.js 15 では、開発の幅を広げるための新しい機能が追加されたのだ！」

つむぎ「新しい機能、気になります！どんな機能が追加されたんですか？」

ずんだもん「注目すべきは、**Partial Prerendering (PPR) の進化**なのだ！Next.js 14 で導入された PPR がさらに進化して、より細かい制御が可能になったのだ！動的なコンテンツと静的なコンテンツを組み合わせた、より高度なパフォーマンス最適化を実現できるのだ！」

:::note info
**Partial Prerendering (PPR) の進化**

- 動的な部分と静的な部分を組み合わせて、より柔軟なレンダリング戦略を選択できます。
- ユーザーの操作に応じて動的にコンテンツを更新しつつ、初期表示の高速化を実現します。
:::

つむぎ「PPR が進化することで、より柔軟にページのパフォーマンスを最適化できるんですね！」

ずんだもん「その通りなのだ！さらに、**新しいデータフェッチ戦略**も追加されたのだ！`stale-while-revalidate` オプションが強化されて、キャッシュの制御がより柔軟になったのだ！これにより、ユーザー体験を損なうことなく、サーバーへの負荷を軽減できるのだ！」

:::note info
**新しいデータフェッチ戦略**

- `stale-while-revalidate` オプションの強化により、古いキャッシュデータを表示しつつ、バックグラウンドで新しいデータを取得できます。
- ユーザーは常に最新のデータではないものの、迅速にコンテンツを閲覧できます。
:::

## まとめ

ずんだもん「というわけで、今回は Next.js 15 の新機能について紹介したのだ！パフォーマンス、開発体験、新機能の追加と、盛りだくさんのアップデート内容だったのだ！」

つむぎ「本当にたくさんの新機能がありましたね！Next.js 15 を使って、もっと素敵なアプリケーションを作っていきたいです！」

ずんだもん「つむぎちゃんの言う通りなのだ！今回紹介した機能以外にも、細かい改善や修正がたくさんあるから、ぜひリリースノートもチェックしてみてほしいのだ！」

つむぎ「はい！早速チェックしてみます！ずんだもんさん、今日はありがとうございました！」

ずんだもん「どういたしましてなのだ！また一緒に Next.js の勉強をするのだ！」

---

## 参考文献

- [Next.js 公式ドキュメント](https://nextjs.org/docs)
- [Next.js 公式ブログ](https://nextjs.org/blog)

---

私は普段、WEBサービスやモバイルアプリの自社開発・運営を行っております。
特にAI駆動の開発を採用して、個人規模で高品質かつ高速なプロダクト開発ができるように、日々活動をしています。

よろしければ[**Xアカウント**](https://x.com/dai_mori219)のフォローをお願い致します。
ESModuleでJestを使用する

# はじめに
Nodeで単体テストを実施する場合に選択として[Jest](https://jestjs.io/ja/)が候補に上がることが多いかと思います
ただ、JestはESModuleを[完全対応しているわけではない](https://jestjs.io/ja/docs/ecmascript-modules)ので、こちらで設定してあげる必要があります
今回はESModuleでJestを使用するための設定方法をまとめたいと思います
※なぜ、この設定が必要なのかは分かっていないので、試行錯誤の結果を記載することになります。なぜ必要かご存知の方はコメントいただければ幸いです。
## ESModuleとcommonJSがある理由
ざっくりとまとめると以下のような感じかと思います
1. commonJSはサーバサイド用といて生まれた
2. ES6というJavascriptの標準仕様が確定して、サーバサイド、クライアントサイド関係なくES6に対応する中でES6 Modulesも導入することになった
3. npmに準拠したパッケージが多くあるためcommonJSを切り捨てるという選択が難しい

※[参考サイト](https://github.com/yytypescript/book/issues/527)

# 前提
- ESModuleを使用している
- Jestをinstallしていてpathが通っている

# 設定内容
以下、3つのファイルが必要になります
また、これらのファイルは全て同階層で必要です
- package.json
- jest.config.mjs
- babel.config.cjs

## package.json
scriptsに以下の記載が必要です(--collect-coverageは必要ないです)
またbabelやjedomなども必要です
```
    "scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --collect-coverage"
  },
    "dependencies": {
    "@babel/core": "^7.26.0",
    "@babel/preset-env": "^7.26.0",
    "babel-jest": "^29.7.0",
    "jsdom": "^25.0.1",
    "jsdom-global": "^3.0.2"   
    },
```

## jest.config.mjs
```
export default {
    testMatch: [
        "**/__test__/**/*.?(m)[jt]s?(x)",
        "**/?(*.)+(spec|test).?(m)[tj]s?(x)",
    ],
    testPathIgnorePatterns: ["<rootDir>/__test__/test-data"],
    transform: {
        "^.+\\.(ts|tsx|js|jsx|mjs)$": "babel-jest",
    },
}

```

## babel.config.cjs
```
module.exports = {
    presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
};
```
Minecraftで毎日1回だけできるコマンドを作ったお話

## 注意
執筆者はガチガのプログラマーではありません。
間違えているところ、もっとこうしたほうがいいよってところは是非ご教授ください。

## 導入
初投稿になります！本記事をご覧いただきありがとうございます。
今回は、Minecraft Java版で、「毎日1回だけ実行できるコマンド」を作成してみましたので、共有します！

## 動作環境
Spigot ver.1.20.6

## 前提
オリジナルのコマンドを追加していること。

## ソースコード
まずはソースコードです。
※このコードは注意して使用してください。
※importは除いています。

```Main.java
public class Mochimochi extends JavaPlugin implements Listener {

    // HashMapの設定
    Map<String,Integer> mochikuji = new HashMap<>();

    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);

        // 毎時実行タスク
        new BukkitRunnable(){
            @Override
                public void run(){

                    // ワールドタイムを取得
                    World world = Bukkit.getWorlds().get(0);
                    Long getTime = world.getTime();

                    // 朝判定
                    if (getTime == 1){

                        // 各プレイヤーのHashMap「mochikuji」を0にする
                        for (Player player : Bukkit.getOnlinePlayers()) {
                            mochikuji.put(String.valueOf(player.getName()), 0);
                        }

                        // プレイヤーにメッセージを送る
                        for (Player player : Bukkit.getOnlinePlayers()){
                            player.sendMessage(("もちもちおみくじができるよ！"));
                        }
                    }

            }
        }.runTaskTimer(this,0,1);
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
        if (cmd.getName().equals("mochikuji")){

            // コマンドを送信したプレイヤー情報の取得
            String playerName = sender.getName();

            // HashMap「mochikuji」が0ならmochiコマンドを実行
            if (mochikuji.get(playerName) == 0) {
                new mochiCommand().mochikuji(sender);

                // プレイヤーのHashMap「mochikuji」を1にセット
                mochikuji.put(playerName, 1);
            }else{

                // HashMap「mochikuji」が1ならコマンドを実行しない
                sender.sendMessage("今日はもうおみくじ引いたよ");
            }

        }
        return false;
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }
}
```

挙動としては、「mochikuji」というコマンドを毎日1回だけ使える、というものです。毎日1回だけ、というのは毎朝起きたらリセットされる、ということになります。

今回の仕組みとしてはHashMapを用いて、0 or 1判定を行っています。HashMapというのは、keyとvalueを設定して、データを格納する仕組みです。
HashMap「mochikuji」のkeyにプレイヤーの名前を、valueに0 or 1を入れて、コマンド操作を行ったかどうかを判定しています。そして、マイクラ内時間で "1tick" になった際、リセットされる（HashMap「mochikuji」が全員0になる）ようになっています。
そして、実際に処理したい内容を「mochiCommand.java」に書いてあげればいいわけです。

## 終わりに
皆さんのプログラミングライフの一助になれば幸いです…
ご意見、ご質問等々あればぜひ、よろしくお願いします！
nRF52840のDie Temperatureを読み出してみた。

## 要約
Nordic Semiconductor社製SoC nRF52840に内蔵されている温度計の値を読み出す。

## コード
### prj.conf
```c
CONFIG_SENSOR=y
CONFIG_TEMP_NRF5=y
```

### C
```c
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>

static const struct device* kDevDieTemp = DEVICE_DT_GET_ANY(nordic_nrf_temp);

float die_temperature(void) {
  struct sensor_value temp_val;
  if (true == device_is_ready(kDevDieTemp)) {
    sensor_sample_fetch(kDevDieTemp);
    sensor_channel_get(kDevDieTemp, SENSOR_CHAN_DIE_TEMP, &temp_val);
  }
  return ((float)temp_val.val1 + ((float)temp_val.val2 / 1000000.0f));
}
```

## 動作確認環境
- toolchains v2.6.2
- nRF Connect SDK v2.6.2
- MDBT50Q-DB-40 (raytac_mdbt50q_db_40_nrf52840)

## 参考文献
- https://devzone.nordicsemi.com/f/nordic-q-a/56171/how-to-get-die-temperature-on-nrf52832-using-zephyr
- https://github.com/zephyrproject-rtos/zephyr/blob/main/samples/bluetooth/peripheral_ht/src/hts.c