OmniAICreator/Qiita-1.07M huggingface dataset:
Metasploit とはなんぞや（なぐりがき）

![ScreenShot Tool -20241224155405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981736/ed6e79f8-1426-d71c-a774-2cd2a3f696ed.png)

## Metasploit とはなんぞや ?

ペンテストや脆弱性の分析において広く一般的に使われているツール。
非常に強力なツールであるため、実務からCTF など、多岐に利用されている。

ちなみに、Metasploit PRO も用意されており、自動化や GUI ( Graphical Userinterface ) などが利用可能。おそらくセキュリティを生業とした法人などが契約するようなものかと思う。

一般的に CTF や ペネトレーションテストであれば Metafploit Framework ( 無料版 ) で問題はない。GUI は無いが、Command Line で簡単に利用可能。

Metasploit を立ち上げるには `msfconsole` をターミナルに叩けばよい。

### Module と Tool、その他語彙

Metasploit の用語として **module ( モジュール )** と  **tool ( ツール )** がある。
ツールはmetasploit が提供する特定のツールである。有名どころでいうと msfvenom ( payload を作成できるツール ) はツールにあたる。

一方で、モジュールというのは Metasploit で使える様々な細かい機能をジャンル別に分けているものである。ツールとモジュールの違いはなんぞやというと：

モジュールはジャンル別で特定のアクションを行う機能とそのコードたち。
ツールはモジュールを補助する機能たち。

モジュールに関しては細かくジャンル分けすると以下の通り：

- Auxilary
- Encoder
- Evasion
- Exploits
- NOPs
- Singles
- Stagers
- Post

くわしくは本家サイトを要確認を確認できればとおもうが、
一般的な CTF のものだと [Aux , Exploits, Payload](https://docs.metasploit.com/docs/modules.html) をよく利用する。

ちなみに、Metasploit ではよく **Vulnerability, Exploit, Payload** という言葉を使うので要注意。

1. **Vulnerability**: システム内にある脆弱性。一般的にはこの脆弱性を逆手にアクセスを確立する。

2. **Exploit**: 脆弱性を用いるコードやモジュールのこと。また、動詞としても活用可能。

3. Payload: 脆弱性を突いてターゲットシステムにアクセスした後に、最終的なゴールを達成するためのコード。

たとえば、Windows の脆弱性 MS08-067 を利用してターゲットにアクセスするための Payload を msfconsole から指定し、最終的に exploit ( 攻撃を行う ) する、という形だ。

基本のコマンド: 開始から Payload の設定 まで。

`msfconsole` : ターミナル上で metasploit を起動する。

`search {terms}` : モジュールを検索するためのコマンド。
--> 例: search sftp : sftp 関連のモジュールの検索。

`use {number or module path}`: 検索で表示されたモジュールの名前や番号を指定して利用する。
--> 例：use 0: リストの一番上の module を利用する。

`show options`: 指定した module の設定オプションの確認。

`info`: module の詳細確認。

`set {}`: module のオプションを指定する。
--> 例：set LHOST {LHOST IP}: LHOST の IP を指定する。

`setg {}`: グローバル定数の指定。ホストIPなど、固定のものはこれを使う。

`unset all`: 設定をすべてリセットする。

`exploit`: payload を実行する。

### 便利そうな module の例 :

様々な module があるなかで、一般的に使えそうなもの。

[1] `scanner/smb/smb_login` : SMB ログインを見つけるスキャナ。ユーザー名と wordlist が必要。
[2] `auxiliary/scanner/vnc/` : 脆弱性のスキャン nmap の --script vuln と同等。
【GSAP】GSAPインストール方法


## GSAPのインストール方法
### CDNの場合　
```html
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
```
最新バージョンをインストールする場合は[こちら](https://gsap.com/docs/v3/Installation?tab=npm&module=esm&method=private+registry&tier=free&club=false&require=false&trial=true)のリンクから

---
### npmの場合
```bash
npm install gsap
```
---
### yarnの場合
```bash
yarn add gsap
```
DDoS?XSS?いろいろな攻撃があるけどわからない!という人向けの記事

自分が知っている知識でこの記事を書いているので間違っている情報などがある可能性があります。

# はじめに
こんにちは、こめぴりです。  
最近、DDoSによるネットワーク障害が頻発しています。  
例えば、直近では日本航空のシステムがダウンしたり、天気予報サイトのtenki.jpが利用できなくなったりと、さまざまな影響が出ています。  
そこで今回は、さまざまなネットワーク障害の攻撃手法について説明します。

# DoSってなんぞや
DoS攻撃（Denial of Service attack）とは、Webサービス（Googleなど）を提供するサーバーに意図的に過剰な負荷をかけ、サービスを妨害してサーバーをダウンさせる攻撃のことです。  
また、複数のPC（後述するボットネットなど）を使ってDoS攻撃を行う場合は、DDoS攻撃（Distributed Denial of Service attack）と呼びます。

## 防ぐ方法はないのか
防ぐ方法はいくつかあります。  
例えば、CloudFlareというサービスを利用するとDDoS対策ができ、攻撃を受けてもCloudFlareがクッション代わりになり、サーバーのダウンを防ぐことができます。  
また、自前でDDoS対策用のクッションサーバーを構築するなど、さまざまな対策方法があります。

# XSSってなに？
XSS攻撃（クロスサイトスクリプティング攻撃）は、攻撃者が悪意のあるコードをウェブサイトに仕込み、それを別のユーザーに実行させる攻撃手法です。

## XSS攻撃の具体例
例えば、あるチャットサイトに脆弱性があり、ユーザーがHTMLタグを含む投稿を自由に行えるとします。  
攻撃者（以下、Aとします）はこの脆弱性を利用して、アカウント情報を盗むためのコードを投稿します。

その結果、他のユーザーがAの投稿を閲覧すると、自動的にその悪意あるコードが実行され、アカウント情報がAに送信されてしまいます。  
このように、XSS攻撃はユーザーのデータを盗む危険な手法です。

## XSS攻撃の対策方法
1. **エスケープ処理**: ユーザーから入力されたデータをHTMLに出力する際には、特殊文字（`<`, `>`, `&`, `"` など）をエスケープして、悪意のあるコードが実行されないようにする。
2. **コンテンツセキュリティポリシー（CSP）の導入**: CSPを設定することで、信頼されたスクリプトのみが実行されるように制限する。

# CSRFってなに？
CSRF攻撃（クロスサイトリクエストフォージェリ攻撃）は、正規ユーザーが意図せずに悪意のある操作を行わされる攻撃手法です。

## CSRF攻撃の具体例
例えば、ユーザーが銀行のウェブサイトにログインしているときに、攻撃者が悪意のあるリンクを仕込んだメールを送信します。  
ユーザーがそのリンクをクリックすると、知らない間に攻撃者の意図する金銭の送金などが実行されてしまうことがあります。

## CSRF攻撃の対策方法
1. **CSRFトークンの利用**: フォーム送信時に、サーバーが生成した一意のトークンを送信することで、正規のリクエストであることを確認します。
2. **Refererヘッダのチェック**: リクエストの出所を確認し、不正なサイトからのリクエストをブロックします。
3. **ユーザーの再認証**: 特に重要な操作を行う際に、再度ユーザーの認証を求めることで、不正なリクエストを防ぎます。

# DDoSするPCってどうやって手に入れてるの?
攻撃者は、ウイルスなどで乗っ取ったコンピューターを利用してネットワークを構築し、これを「ボットネット」と呼びます。  
ボットネットを使って乗っ取ったPCからDDoS攻撃を仕掛けたり、複数のレンタルサーバーを利用してDDoS攻撃を行うなど、さまざまな方法で攻撃に必要なPCを集めています。

# 終わりに
今回は、DDoS攻撃やXSS攻撃、CSRF攻撃など、さまざまなネットワーク攻撃の手法とその対策について説明しました。  
これらの攻撃は日々進化しており、個人や企業がしっかりと対策を講じることが求められます。  
ネットワークの安全を守るためには、最新の情報を収集し、適切な対策を行うことが重要です。  
皆さんもぜひ、日常的なセキュリティ対策を見直し、さらなる安全性を確保していってはどうでしょうか。

~~結局わかる人が見ないとわからない記事になっちゃったな...~~
AWSコミュニティHEROと学ぶ！Amazon Bedrock勉強会&事例共有会　なう

https://kinto-technologies.connpass.com/event/340683/

# re:Invent現地レポート

## モチベーション爆上がり？

み　毎年のアップデートを追うのが楽しくなった
あ　セッション参加で集中してきけた。
　　考え方や体系的に教えてくれるセッションは良かった

み　コミュニティビルダーはre:Invent行くのにおすすめ
　　https://aws.amazon.com/jp/developer/community/community-builders/

# Bedrock入門

登壇資料

https://t.co/OcpQ5rC1ZA

## re:Invent感想
　　HEROのベネフィットたくさん

## 新機能

・rerank
　　質問を関連順に並べる
・NOVA
・モデルの蒸留
・ベットロックマーケットプレイス
・レイテンシー最適化
・プロンプトキャッシュ
　　トークンのキャッシュでコスト削減
・プロンプトルーティング
　　複雑さによってきりかえ
・ナレッジベースのストリーミング
・カスタムコネクタ
・メタデータの自動フィルター
　　キーの絞り込みもAI
・データオートメーション
・構造化データのクエリに対応
　　ベクトルじゃなく、SQLで検索できる
・グラフラグ
・ケンドラ
   安くなった　まだ英語だけ
・ベクトルDBを自動構築
　　Auroraの使用してない時のスリープ機能を使えばコスト削減
・マルチエージェント
・ガードレール
　　自動推論チェック　数学に近いアプローチ
・マルチモーダル毒性検出
・LLM as a ジャッチ

## デモ

今何しているのかストリーミングで出力した方が、
ユーザのストレス軽減

https://github.com/minorun365/bedrock-pptx-agent

## 質問タイム

q 
a agentのフローをきちんと作ることが大事

q データオートメーション
a プレビューで簡単に出来る
　クロードで画像解析→それを渡す

# (LT) Bedrockを使い始める際にやっておいたほうがいいことまとめ

モデル呼び出しのログ設定
　嬉しいこと：利用状況の確認、監査、評価

クロスリージョン推論の使用
　嬉しいこと：スロットリング対策が簡単に可能

アプリケーション推論プロファイルの使用
　嬉しいこと：アプリケーションごとのコスト把握
　コスト配分タグでアプリケーション推論プロファイルごとのコスト集計が可能となる

# (LT) 社内ツールcirroの紹介

Bedrockを活用し
ユーザーが業務知識を追加・活用できるミニマルな生成AI活用基盤「cirro」を内製化

## やりたいこと

SQL生成の検証
妥当な抽出結果を出力するSQLを生成させる方法の検証。
（いずれは自然言語で誰でもデータを抽出可能にしたい。）

資料案内
社内に提供しているダッシュボードについて、100件程度となりユーザが見つける負荷が上がってきた。
→ 生成AIで手軽に自然言語で検索できるようにしたい。

要約・分析
アンケート結果など自然言語で書かれた情報について、
生成AIに要約や回答者の集団の傾向を分析させたい。

検証なので安くしたい

## アプローチ

早く楽に
するための共通化、標準化

## システム詳細

RAGを使う程ではないが、一般的な汎用AIサービスでは面倒 or できないタスク
入出力画面を提供し、ユーザ入力と参照データから生成AIの回答を得るシステム

## デモ

## 効果

Twitterのフォロワー分析のシステム作成
→工数が50%削減

## まとめ

実装は簡単だけど、本番運用に向けたssoに課題

# (LT) AWS上でGraphRAGやってみた

## RAGとは

##

# (LT) Slack + Agents for BedrockでAWSリソースを操作する

Slack+aws chatbot+Agents for BedrockでAWSリソースを操作する
①S3の操作（作成 削除）
②エラーログを取得して分析する

multi-agent-orchestrator (Bedrock Zits)
③Classifierによるマルチエージェントへの処理の振り分け
④外部ツール呼び出しによるログ取得と分析のエージェントの拡張
⑤チェーンエージェント（複数エージェントのチェーン）

高度なことは出来ない

SREとブラットフォームエンジニアリンググループと協力し、
前述の技術によるエラーログサマリ通知やRCA（障害根本原因特定）の仕組み作成を計画中

# (LT) 生成 AI アプリケーション開発に評価の仕組みを導入して精度向上を実現した話：DB 設計レビュー自動化の取り組み
AstroでStackblitz SDKを使った埋め込み用Reactコンポーネントを作る

事前に `@stackblitz/sdk` はインストールしておく

```tsx
import sdk from "@stackblitz/sdk";
import { useEffect } from "react";

export const StackblitzEmbed = (props: { projectID: string }) => {
  useEffect(() => {
    sdk
      .embedProjectId("stackblitz-embed", props.projectID, {
        openFile: "package.json",
      })
      .then((r) => {
        console.log(r);
      })
      .catch((e) => {
        console.error(e);
      });
  }, []);

  return (
    <div style={{ paddingTop: "15px" }}>
      <div id="stackblitz-embed">Embed Stackblitz editor</div>
    </div>
  );
};
```

使う側はこんな感じ

```md
---
title: Stackblitz Demo
description: Stackblitz Demo
---
import { StackblitzEmbed } from '../../components/StackblitzEmbed'; 

## Demo

<StackblitzEmbed projectID="vitejs-vite-nrzuxh" client:only />
```

`client:only` をつけていないと動かない。
スリープか否かでonPause時の処理を変えたい

[とあるアプリ](https://x.com/c0demattari/status/1871198020618084522)にて、勉強中に他のアプリを開いたり、当アプリを閉じていないかを検知する機能を実装しました。また、勉強中にずっとアプリを開いていなければならないのはUX的にマズいので、スリープ時はonPause時の処理から除外するようにもしました。
# ソースコード
```kotlin
//画面外検知の為にオーバーライド
override fun onPause() {
    super.onPause()
    val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
    if (powerManager.isInteractive) {
        //ここに別画面に移った際の処理を記述
    }
}
```
# 簡単な解説
### onPause
そもそもonPauseとは何かというと、アプリがバックグラウンドへ遷移したときに呼び出されるコールバックのことです。具体的には、アプリからホーム画面に遷移したときや、タスクボタンが押されたとき、スリープ状態になったときなどにonPause()が呼び出されます。
### PowerManager
PowerManagerとは、デバイスの電源管理やスリープ制御ができるシステムサービスです。例えば、デバイスのスリープを防ぐようにしたり(```WakeLock```)、省電力モードであるかどうかを監視する(```isPowerSaveMode```)ことができます。

今回は、```isInteractive```を用いて画面がオンになっている(スリープ状態でない)ことを検知させて、スリープか否かでonPause時の処理を変えることを実現することができました。
# 実際の動作
![screen-20250109-1858393.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3979616/6069e342-1d8e-311c-b00f-7060456bde58.gif)
無事スリープ時にはタイマーが止まらず、アプリから離れようとした際にタイマーが止まるようになりました。
MX Linux における Samba 共有フォルダの永続マウント手順書

# **前提条件**
- Samba共有フォルダをホストするサーバー（Windows/Linux）が既に設定されていること。
- Samba共有フォルダのアクセスに必要なユーザー名とパスワードがあること。
- SambaサーバーのIPアドレスまたはホスト名がわかっていること。

# **1. 必要なパッケージのインストール**

まず、Samba共有フォルダをマウントするために必要なパッケージをインストールします。

## **コマンド**
```bash
sudo apt update
sudo apt install cifs-utils -y
```

# **2. マウントポイントの作成**

共有フォルダをマウントするディレクトリを作成します。

## **コマンド**
```bash
sudo mkdir -p /mnt/smb_share
```

# **3. マウントのテスト**

共有フォルダに一時的にマウントできることを確認します。

## **コマンド**
```bash
sudo mount -t cifs -o username=<ユーザー名>,password=<パスワード> //<サーバーIP>/<共有フォルダ名> /mnt/smb_share
```

- `<サーバーIP>`: SambaサーバーのIPアドレスまたはホスト名。
- `<共有フォルダ名>`: マウントしたい共有フォルダの名前。
- `<ユーザー名>`: Sambaサーバーにアクセスするためのユーザー名。
- `<パスワード>`: 上記ユーザー名のパスワード。

## **確認**
マウントが成功すると、`/mnt/smb_share` ディレクトリに共有フォルダの内容が表示されます。

# **4. 永続マウントの設定**

## **4.1 認証情報ファイルの作成**

安全にパスワードを保存するため、認証情報ファイルを作成します。

1. **ファイル作成**
   ```bash
   sudo nano /etc/samba/credentials
   ```

2. **以下の内容を記入**
   ```
   username=<ユーザー名>
   password=<パスワード>
   ```

3. **ファイルを保存して終了**
   - `Ctrl+O` → `Enter` → `Ctrl+X`

4. **ファイルの権限を変更**
   認証情報ファイルが他のユーザーに読まれないよう、権限を設定します。
   ```bash
   sudo chmod 600 /etc/samba/credentials
   ```

## **4.2 fstabファイルの編集**

システム起動時に自動マウントされるよう、`/etc/fstab` ファイルを編集します。

1. **fstabファイルを開く**
   ```bash
   sudo nano /etc/fstab
   ```

2. **以下の行を追加**
   ```
   //<サーバーIP>/<共有フォルダ名> /mnt/smb_share cifs credentials=/etc/samba/credentials,iocharset=utf8,sec=ntlm 0 0
   ```

   - `<サーバーIP>`: SambaサーバーのIPアドレスまたはホスト名。
   - `<共有フォルダ名>`: マウントしたい共有フォルダの名前。

3. **保存して終了**
   - `Ctrl+O` → `Enter` → `Ctrl+X`

## **4.3 マウントの確認**

1. **設定を反映**
   ```bash
   sudo mount -a
   ```

2. **共有フォルダの内容を確認**
   ```bash
   ls /mnt/smb_share
   ```

   正常に設定されていれば、共有フォルダの内容が表示されます。

# **5. トラブルシューティング**

## **5.1 エラーが発生する場合**
- **`Permission denied`（権限拒否）**
  - ユーザー名やパスワードが正しいか確認してください。
  - 認証情報ファイルの権限が正しく設定されているか確認してください:
    ```bash
    ls -l /etc/samba/credentials
    ```

- **`mount error`（マウントエラー）**
  - Sambaサーバーがオンラインであることを確認します:
    ```bash
    ping <サーバーIP>
    ```

  - 必要に応じてデバッグ情報を表示します:
    ```bash
    sudo mount -v -t cifs -o credentials=/etc/samba/credentials //<サーバーIP>/<共有フォルダ名> /mnt/smb_share
    ```
AWS S3->CloudFlare R2 Migration、約50%のコスト削減効果

![33333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/3785d0f1-c67f-d2b8-e017-e0d92117b51d.png)

> AI関連での大容量データ処理におけるコスト削減のためのR2利用事例

AI関連プロジェクトでは、大容量データ処理のために高額なコストが発生することがあります。そのコスト削減手段として、Cloudflare R2が使用されるケースがありました。以下はCloudflare R2とAmazon S3の価格比較表です。

### Cloudflare R2 vs Amazon S3 価格比較表
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/7d966e65-a9cb-4cd0-8581-8505c2f596e9.png)

### 費用計算例（月1TBストレージ + 100万回のRead + 100GBのデータ送信の場合）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/22c47b39-a258-33b4-fe6a-3481594222bf.png)

### Amazon S3
**長所:**
LambdaやSQSなどのAWSサービスとの連
携が強力。
**短所:**
データ送信量が多いサービスでは、R2を検討する価値がある。

### Cloudflare R2
**長所:**
動画ストリーミングや画像ホスティングサービス（大量トラフィック送信）。
静的ウェブサイトホスティング。
データバックアップおよびアーカイブシステム。
グローバルサービスでデータ転送量が多いSaaSプラットフォーム。
**短所:**
規制上、特定のプロジェクトでS3の使用が必須になる場合がある。

### 結論
Cloudflare R2は、データ送信が多く読み取り操作が頻繁なサービスに適しています。
Amazon S3は、複雑なAWSサービスの統合が必要な場合に有利です。
コスト削減を優先するなら、R2が適している場合が多いですが、プロジェクトの要件に応じて選択すべきです。
Javaで「パネルのサイズの設定と枠線の表示」の動作を確認してみた。

# 概要

Javaで「パネルのサイズの設定と枠線の表示」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jpanel/index5.html

# 実装

以下のファイルを作成しました。

```Sample.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Dimension;

class Sample extends JFrame{
  public static void main(String args[]){
    Sample frame = new Sample("MyTitle");
    frame.setVisible(true);
  }

  Sample(String title){
    setTitle(title);
    setBounds(100, 100, 728, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setLayout(new FlowLayout());

    JPanel panel1 = new JPanel();
    panel1.setBackground(Color.BLUE);
    panel1.setPreferredSize(new Dimension(150, 100));

    JPanel panel2 = new JPanel();
    panel2.setBackground(Color.RED);
    panel2.setPreferredSize(new Dimension(100, 200));

    add(panel1);
    add(panel2);
  }
}
```

以下のコマンドを実行しました。

```
$ javac Sample.java 
$ java Sample 
```

# まとめ

何かの役に立てばと。
[Ventoy] 起動可能なUSBドライブを簡単に作成する

# [Ventoy](https://www.ventoy.net/en/index.html)とは
Ventoyは他のアプリとは違い、ISOファイルをUSBに入れるだけで起動できるようにするというのが特徴です。使ったことがないと何言ってんだと思われそうですが、ほかのアプリでは1つのISOファイルを書き込んでいると、ほかのISOファイルは起動できません。しかし、VentoyならISOファイルを複数個USBに入れて便利なUSBドライブを作ることもできます。さらに言えばUSBではなくいつも使っているドライブに入ってるISOも起動できます。

※この記事ではWindowsかLinuxでの方法しか書いていません。

# インストール方法

https://www.ventoy.net/en/download.html

ここにアクセスして、とりあえず適当に3個のうちのどれかを押します。そのあとのSourceForgeで自分のOSのファイルを選んでダウンロードします。

Windowsの場合は展開して`Ventoy2Disk.exe`を起動してください。

Linuxの場合は展開して、自分のCPUアーキテクチャのアプリを起動してください。

amd64(x64)の場合は`VentoyGUI.x86_64`
x32の場合は`VentoyGUI.i386`

ファイルマネージャーから起動できない場合はターミナルから試してください。

# USBへインストールする

VentoyをインストールしたいUSBドライブを選択して、左のInstallを押します。

:::note info
インストールするUSBドライブが出ない場合は右側にある更新ボタンを押してください。
:::

基本的にそれだけで、あとはUSBドライブにISOファイルを入れるだけで起動できるようになります。

# 好きなISOを起動する

USBにISOを入れてどのPCでも起動できるようにするか、どこかのドライブにISOファイルを置いておいて、Ventoyが入ってるUSBから起動します。

起動したら、USBに入っているISOファイルの一覧が出ます。矢印キーとエンターキーで操作できます。
F2キーを押せばドライブに入っているISOから起動できます。
Kotlin Koans やってみた 4

# Introduction
## String templates
### 問題
トリプルクォート文字列は、複数行の文字列に便利なだけでなく、バックスラッシュをバックスラッシュでエスケープする必要がないため、正規表現パターンを作成する際にも便利です。
次のパターンは、`13.06.1992`（2桁の数字、ドット、2桁の数字、ドット、4桁の数字）という形式の日付にマッチします：

```kotlin
fun getPattern() = """\d{2}\.\d{2}\.\d{4}"""
```

このパターンを month という変数を使用して書き換え、`13 JUN 1992`（2桁の数字、スペース、月の略語、スペース、4桁の数字）という形式の日付にマッチするようにしてください。

```kotlin
val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"

fun getPattern(): String = TODO()
```

### 解答
```kotkin
val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"

fun getPattern(): String = """\d{2} $month \d{4}"""
```

# おわりに
正規表現って苦手なんだよな・・・。

---

[← 前回の記事](https://qiita.com/b-yuko/items/306f9352b37eef218808)　|　[次回の記事 →](https://qiita.com/b-yuko/items/672fc37e158180e58f9d)
【UE5】UnrealEngineでオリジナルの扉を作ろう

# やりたいこと

学校の昇降口のような両開きのガラス戸を作りたい！！！！！！
- キューブを組み合わせてオリジナルの扉を作成する
- 作成した扉とフレームを組み合わせてええ感じの見栄えにする
- ブループリントで動かしてみる

## 詰まったこと

- 作成したアクタの軸が中心だった
    - どうやって軸を変更するんだっけ　＝＞　ピボットの変更
    - これって保存できるんだっけ？　＝＞　できない🥺
- 両開きにするため、Set Relative Rotationを2つ置く必要があった
- 扉が開閉し続ける謎のバグ（笑）


# 扉のアクタ作成
今回はガラス戸なのでガラスっぽいマテリアルを作成する。このサイトを参照すべし！
https://note.com/takuya814/n/n421ee7968654

次に金属のフレームっぽい箇所はStartContent内の「M_Metal_Chrome」を利用した。
最後にFabから適当に取っ手をダウンロードしてつけてみた。

あとは良い感じに形を調整し、配置し、ツールタブから「アクタをマージ」を選択して保存する。今回は扉が両開きになるので、通常に加えて180度回転させたアクタを用意する必要あり。

![スクリーンショット 2025-01-09 17.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/386a92f2-4eed-0e1c-e412-f01d3d60a181.png)

なお、この方法で合っているのかは不明🤔

# ブループリントの作成
扉の開け閉めに関するブループリントについてはこちらを参考にした。
https://www.udemy.com/course/unreal-engine-4-beginner-tutorial/?couponCode=NEWYEARCAREERJP
セクション12:ブループリントを使って、アクターに動きをつけたり、変化を持たせる
18. インタラクション - 1/2

## 作成するコンポーネント
 - Doorを設置するためのDoorFrame
 - 実際に動かすDoor（今回は両開きなので2枚）
 - Eventのトリガーとなる当たり判定のBox

ビューポート上でこんな感じに配置してみる
![スクリーンショット 2025-01-08 20.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/a3e51669-fb1f-c64c-69d0-b78c2e963498.png)


## イベントグラフの作成
 - OnComponentBeginOverlapでBoxを指定し、触れた瞬間イベント発火
     - ここで扉が開くようにする
 - OnComponentEndOverlapで扉を潜った後の終了処理
 - タイムラインで0-1の間に扉の開閉を座標を指定
     - 値は0~130とし、扉の左右でプラマイを逆にする
 - SetRelativeRotationに対して2つのピンを伸ばすことはできないが、SetRelativeRotation自体を2つ繋げることにより両方の扉に対するイベントを作成

![スクリーンショット 2025-01-08 21.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/6203c263-d139-2939-5412-e697ce29d7e9.png)

![スクリーンショット 2025-01-08 21.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/4201898b-fe75-b760-b47f-82cfab32458c.png)

これで完成や！！！

![ziku.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/b0acfe8d-a4a7-7010-77b1-904c1fd355d9.gif)

！？！？！？wwww


## 軸（ピボット）の修正

作成したアクタは軸（ピボット）が中心に設定されていた。
レベルの内部ではピボットを変更することが可能であるが、今回はスタティックメッシュコンポーネントとしてアクタ（Door）を呼び出しているため、変更したピボットを保持できない模様・・・

レベル内での変更方法については以下参照
参考：https://zenn.dev/daichi_gamedev/books/unreal-engine-tutorial/viewer/editor-actor-basic3#%E2%91%A0%E3%82%A2%E3%82%AF%E3%82%BF%E3%81%AE%E3%83%94%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%82%92%E5%A4%89%E6%9B%B4

直接変更できないのであれば仕方ない。
空のSceneを作成しスタティックメッシュであるDoorの軸に該当させたい箇所に重ねる。
Doorと親子関係を持たせ、DoorではなくSceneをターゲットとしたSetRelativeRotationで回転させることにより、軸問題が解決した！！

![スクリーンショット 2025-01-08 20.45.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/64f136a2-7f40-0bbb-ad3c-b25b96c7d387.png)

構成はこんな感じ。
![スクリーンショット 2025-01-08 20.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/e3da77bf-1c8a-2022-3196-2e1d17602f64.png)

## それなのに、どうして・・・

![openclose.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/41d77abf-9550-6fa0-db4b-ea03a35c405d.gif)
ドアが開閉し続ける謎のバグ（笑）

↓

Boxの範囲にSceneが収まっていないことが原因でした！w
Sceneが収まるようにBoxサイズを変更したら無事に治った🥳🥳🥳

# 完成！

![fin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967203/9266fc03-0e62-3e59-b96f-e3079251ed7e.gif)

これで自分の好きな扉を大量生産できるぜ！
おしまい
Amazonで本のタイトルとISBNを取得する(スクレイピング)

# はじめに
欲しい本をAmazonのお気に入りにストックしてあるとします。
これらのタイトルとISBNを抜き出すのに、少しでも楽できるように、processingでプログラムを作りました。


〜追記〜

https://qiita.com/hextomino/items/111a251a936aa353933a

# 環境
Processing 4
MacOSX
jsoupライブラリ

※以下からjarをダウンロードし、processingプログラムのフォルダの下にcodeという名前のフォルダを作り、その中にjarファイルを置く

https://mvnrepository.com/artifact/org.jsoup/jsoup/1.18.3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/602d9bef-bc0f-7e56-73d7-75d14cc3a617.png)


# プログラム
プログラムの中に、URLをベタ書きです。

```java:getTitleISBNatAmazon.pde
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

void setup() {
  String [] urls = {
    "https://amzn.asia/d/hyyRyIR",
    "https://amzn.asia/d/7gktE7f",
    "https://amzn.asia/d/jfqVRj7"
  };

  for (String url : urls) {
    try {
      Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0").get();

      // タイトルを取得
      Element titleElement = doc.getElementById("productTitle");
      String title = titleElement.text();
      println("Title: " + title);

      // ISBNを取得
      Elements listItems = doc.select("ul li");
      String isbn = "";
      for (Element li : listItems) {
        if (li.text().contains("ISBN-13")) {
          isbn = li.text().split(":")[1].trim();
          break;
        }
      }
      if (!isbn.isEmpty()) {
        println("ISBN: " + isbn);
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}
```

出力例
```
Title: 生成AIのしくみ　〈流れ〉が画像・音声・動画をつくる (岩波科学ライブラリー 328)
ISBN: ‎ 978-4000297288
Title: ローカルLLM実践入門
ISBN: ‎ 978-4296206728
Title: 数学の美: 情報を支える数理の世界
ISBN: ‎ 978-4807920525
```
※とくに、選書の意図はありません。偶然、一番に表示されたものです。


# 補足
かなりchatGTPに書いてもらいました。
デバックで、見つけにくいイベントリスナーがありました。

# はじめに
javascriptやjqueryを使用してwebページを作成していますが、時々、デバックをしていて、なぜ、あのclcikイベントリスナーでブレークしないのだろうと悩むことがあります。何とか調べてやっと、アァー、あのクリックは、ここに来ていたのかと理解することがあります。その辺のことを以下に書いてみたいと思います。

# いつも使用しているイベントリスナー
いつもは、jqueryを使って、以下のようなスクリプトを書いています。
``` javascript
//ボタンイベントリスナー
$(".my_list").on('click',()=>{
....
ここに,処理を記述
...

});

```
大抵は、この構文でリスナーを定義しています。
または、document.addEventListener(.....)とかを使っています。
そのため、デバッグでは、リスナーの直後にalert()文を入れたりしています。
``` javascript
//ボタンイベントリスナー
$(".my_list").on('click',()=>{
alert("btnイベントが発火しました。");
....
ここに,処理を記述
...
```


関係するリスナーのすべての個所にこのようなalert();文を入れて、ボタンをクリックしたときに、どのイベントリスナーに飛んできたのかを確認しています。

今回もすべてのリスナー個所にalert()文をセットしたつもりでした。
ところが、ボタンをクリックしても、どこもブレークしません。
なぜなんだろうと、何度も関係個所のalert()文をチェックしました。
どこもおかしくありません。

いったい、どのルートを通って処理が続行してしまっているのだろうと。
ブレークせずに処理が先に進んでいます。

$(".my_list").on('click',..が定義されているのか、他のjsファイルも見てみましたが、そのような個所はありません。
何度、テストしてもブレークせずに、先に進んでいます。
途方にくれました。

# もしかしたらと
そこで、ハタと気がつきました。確か、以前も似たような現象があったと、思い出しました。もしかしたらと、当時のことをおもいだしました。
確か、"#my_list"でも、".my_list"セレクターでもなかったような、たしかmy_listだけで見ていたような気がすると思い出しました。

リスナーの場所をさがすため、ツールやデバッガーの検索では、".my_list"というキーワードで検索していました。これでは、"my_list"は見つかりません。
試しに"my_list"だけで、検索してみました。
すると、出てきました。
# 場所が見つかりました。
``` javascript
//ここにありました。
switch (e.target.className) {
   case "my_list":
``` 
ありました。ここに、リスナーが定義されていました。
これは、$("#block").on('click',()=>{........})というところで、定義していました。
てっきり、$(".my_list").on('click',()=>{.....})で、リスナーを定義していると思っていましたので、まさか、case "my_list":で、定義しているとは思っていませんでした。それを作成していたのをすかっかり、忘れていました。
ページの"#block"セレクターには、".my_list"セレクターも含まれています。
それで、"#block"セレクターのイベントリスナーで、e.target.classNameが"my_list"の時に、リスナー処理を定義していました。

ちょっと、いつもと違う形式のリスナー定義をしていたため、思わぬ遠回りをしてしまいました。
# テストしたwebページ
このテストは、以下のサイトのページで行いました。
chromeのデバッグ　コンソールで確認することができます。

[mainサイト](https://favorite.tecoyan.net/slim/index_main.php#block)



# 反省
これは、反省というよりは、知識を広めたということかもしれません。
リスナーの定義の仕方は、いろいろあるということです。
広い範囲の要素内にある、ボタンのリスナー定義の時、親に当たる要素で、クリックしたときに、その処理内で、個々ボタンのclass属性を見て、リスナーを定義したときに発生します。
これは、「木を見て森を見ず」という故事と同じかもしれません。

# あとがき
デバッグで、ブレークが効かないという現象には、よく出会います。
大抵は、思い違いとか、そこへは、来ない抜け道(ルート)があるとかで、素通りしていることが多いです。
思い込みが実に多いです。思い込んでいると堂々巡りなり、中々、そこから抜けだせません。この思考回路から抜け出すには、パソコンのように再起動してしまうのがいいかもしれません。
selfを省略してても呼び出せる


```rb
irb(main):007:1* class User
irb(main):008:1*   class_attribute(:some_attribute,default: 1)
irb(main):009:1*
irb(main):010:2*   def fafa
irb(main):011:2*     puts some_attribute
irb(main):012:1*   end
irb(main):013:0> end
=> :fafa
irb(main):014:0> User.first.fafa
  User Load (0.5ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
1
=> nil
```
```rb
irb(main):001* class User
irb(main):002*   attr_accessor :name
irb(main):003*
irb(main):004*   def initialize(name)
irb(main):005*     @name = name
irb(main):006*   end
irb(main):007*
irb(main):008*   def hello
irb(main):009*     "Hello, I am #{name}."
irb(main):010*   end
irb(main):011*
irb(main):012*   def hi
irb(main):013*     "Hi, I am #{self.name}."
irb(main):014*   end
irb(main):015*
irb(main):016*   def my_name
irb(main):017*     "My name is #{@name}."
irb(main):018*   end
irb(main):019> end
=> :my_name
irb(main):020> user = User.new("Alice")
=> #<User:0x000000010fa56fd0 @name="Alice">
irb(main):021> user.hello
=> "Hello, I am Alice."
```
>上コードではご覧お通り、nameもself.nameも@nameも同じ文字列"Alice"を返します。この場合はどれも同じ結果になるので、「これが正解」と一つを選ぶことはできません。selfをつけたりつけなかったり、そのままインスタンス変数にアクセスしたり、人によっては書き方が異なるところだと思います。
p234

https://gihyo.jp/book/2017/978-4-7741-9397-7

```rb
irb(main):001* class A
irb(main):002*   attr_accessor :name
irb(main):003*
irb(main):004*   def initialize(name)
irb(main):005*     @name = name
irb(main):006*   end
irb(main):007*
irb(main):008*   def self.fafa
irb(main):009*     new("fafgas")
irb(main):010*   end
irb(main):011> end
=> :fafa
irb(main):012> a = A.new("fafa")
=> #<A:0x0000000102389700 @name="fafa">
irb(main):013> A.fafa
=> #<A:0x0000000105fa6eb8 @name="fafgas">
```
EKS上のRay ClusterにNLB経由でジョブを投入

この記事で作成したRay ClusterにInternal NLB経由でジョブを登録してみます。

https://qiita.com/yomon8/items/851b5ca0fc22383b0afd


## 前提

- 上記の記事のようにRay ClusterがEKSに導入済み
- [AWS Load Balancer Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/)がEKSに導入済み


## 設定

Ray clusterのHeadサービスのLabelを取得します。

```sh
$ kubectl get service/ray-cluster-kuberay-head-svc -n ray-cluster -o jsonpath='{.metadata.labels}' | jq
{
  "app.kubernetes.io/created-by": "kuberay-operator",
  "app.kubernetes.io/name": "kuberay",
  "ray.io/cluster": "ray-cluster-kuberay",
  "ray.io/identifier": "ray-cluster-kuberay-head",
  "ray.io/node-type": "head"
}
```

上記の内容を下に以下の設定をすることでNLBが作成されます。

```yaml
---
apiVersion: v1 
kind: Service
metadata:
  namespace: ray-cluster
  name: ray-nlb
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-name: ray-cluster-nlb
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-scheme: internal
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"
    service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=false
spec:
  type: LoadBalancer
  ports:
  - name: client
    port: 10001
    protocol: TCP
    targetPort: 10001
  selector:
    ray.io/cluster: ray-cluster-kuberay
    ray.io/identifier: ray-cluster-kuberay-head
    ray.io/node-type: head
```

後は以下のようにNLBのDNSをホスト名に指定して接続確認をします。

```py
import ray
from pprint import pprint
ray.init(address='ray://ray-cluster-nlb-xxxxxxx.elb.ap-northeast-1.amazonaws.com:10001')
pprint(ray.cluster_resources())
### 出力
#{'CPU': 2.0,
# 'memory': 3000000000.0,
# 'node:10.2.2.144': 1.0,
# 'node:10.2.8.136': 1.0,
# 'node:__internal_head__': 1.0,
# 'object_store_memory': 785237605.0}
```
Free consultation with GPT

In your opinion, can artificial intelligence be used for legal matters, and in general, are the answers that artificial intelligence gives to our legal questions credible and credible?
<a href="https://www.isfahanattorney.ir/i-16526/%D8%A7%D8%B1%D8%A7%D8%A6%D9%87-%D9%85%D8%B4%D8%A7%D9%88%D8%B1%D9%87-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-"> مشاوره حقوقی تلفنی رایگان ۲۴ساعته</a>
<a href="https://www.isfahanattorney.ir/i-16525/%D9%88%DA%A9%DB%8C%D9%84-%D8%AE%D8%A7%D9%86%D9%88%D8%A7%D8%AF%D9%87-%D8%A7%D8%B5%D9%81%D9%87%D8%A7%D9%86
"> وکیل خانواده اصفهان</a>
https://life.shafaqna.com/FA/279181/%D9%88%DA%A9%D8%A7%D9%84%D8%AA-%D8%A8%D8%A7-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%DB%8C%D8%A7-%D8%B9%D9%84%DB%8C%D8%B1%D8%B6%D8%A7-%D8%B4%DB%8C%D8%B4%D9%87-%DA%AF%D8%B1-%D9%88%DA%A9
WiMax環境下でgem installができない

# 環境
```
❯ sw_vers
ProductName:		macOS
ProductVersion:		15.0.1
BuildVersion:		24A348
```

# 発生した事象
```gem install```を実行した際、数分経ってから下記のエラーが返ってきた。
```
❯ gem install sinatra
ERROR:  Could not find a valid gem 'sinatra' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - Gem::Net::OpenTimeout: Failed to open TCP connection to rubygems.org:443 (execution expired) (https://rubygems.org/specs.4.8.gz)
```

TCPコネクションが確立できなかったと言っていること、コマンド実行時の挙動からタイムアウトが発生していると思われることから、ネットワークに問題があると考えた。

# 解決策
```nslookup```で```rubygems.org```の名前解決ができているか確認したら、解決できていた。
```
❯ nslookup rubygems.org
Server:		fe80::541f:8d05:aea6:1%11
Address:	fe80::541f:8d05:aea6:1%11#53

Non-authoritative answer:
Name:	rubygems.org
Address: 151.101.65.227
Name:	rubygems.org
Address: 151.101.129.227
Name:	rubygems.org
Address: 151.101.193.227
Name:	rubygems.org
Address: 151.101.1.227
```

試しに、違うネットワークにつないで再度```gem install```してみたら、成功した。
そこで当初のネットワーク（WiMax）に戻し、ルータのファイアウォール設定を変更してみることにした。

WiMaxのルータの設定画面（```192.168.0.1```）にブラウザでアクセスし、
- フィルタリング設定を『有効』
- インターネット接続を『許可』

にして、適用。

![Screenshot 2025-01-09 at 18.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980376/f0c62186-2077-6c03-027a-7bc011ddaf0a.png)

続いて、```nslookup```で確認した```rubygems.org```のIPアドレスに対して
ポート443での通信を許可する設定を追加した。
![Screenshot 2025-01-09 at 18.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980376/d8a74b1f-1ac1-6e82-de5e-83a39cde10fd.png)

```nc```コマンドで確認したら、疎通できていた。
```
❯ nc -vz rubygems.org 443
Connection to rubygems.org port 443 [tcp/https] succeeded!
```

再度```gem install```を実行して、インストールが成功した。
```
❯ gem install sinatra
Successfully installed sinatra-4.1.1
Parsing documentation for sinatra-4.1.1
Done installing documentation for sinatra after 0 seconds
1 gem installed
```

WiMax環境下でgem install出来なくて困っている方の参考になれば幸いです。
「料理で、熱湯のままの使いまわし数の最大例を教えて下さい。」をAI先生に聞きました。

もっといい聞き方がありますか?

# ChatGPT

あなた:
料理で、熱湯のままの使いまわし数の最大例を教えて下さい。

ChatGPT
回答抜粋
熱湯を料理で最大限に使い回す例として、以下の手順を挙げます。この流れでは熱湯の温度を保ちながら、複数の工程で再利用できます。
1. 茹で野菜の下茹で...
2. パスタの茹で...
3. スープのベース作り...
4. 蒸し料理...
5. 洗い物用...

レトルトパックを割り込ませる事ができますか。
...

# Gemini先生
# copilot先生
手っ取り早くフォルダにあるファイルの名前の先頭に任意の文字列をつける 

使うとき：フォルダの中のファイル名をちゃちゃっと変更したいとき

ファイルエクスプローラーで、変更したいフォルダに行く。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/162af967-01ef-65f4-0ef7-254a93b8a4ef.png)

cmd　でコマンドプロンプトを起動。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/0934e759-9618-a066-f092-6330eef3c9bf.png)

※ここのバーに「cmd」と打ち込んでエンターを押すと、そのパスでコマンドプロンプトを起動できる。

![cmd 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/584c18fa-f14e-3a8e-5d6b-1a24c013040b.png)

名前変更

``` for %f in (*) do ren "%f" "title_%f" ```  

title_は任意の文字列にする。
失敗したときのために、元のファイルをとっておく。

完了。  

pngだけとか、このファイル名を置き換えるとか、いろいろできるよ。
エクセル シート保護（excel工作表保护）

添加保护
1.対象選択
2.下記のように操作

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/90ed98c3-aea5-f0f0-921f-6872ff9d92de.png)
3.被保护对象无法编辑了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/c1bf4ca9-5624-e113-1a10-253e33321b57.png)

保护解除
1.点击保护解除即可，可以编辑了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/a3f5e7d9-362a-82d8-0a66-482146b21d29.png)
Google Chromeで複数のAWSアカウントにログインする際のTips

## 概要
AWSで環境構築を行っている際、開発環境アカウント、本番環境アカウントを切り替えながら作業を行う場合があるかと思います。
通常アカウント毎にログインを行うので、一旦ログアウトして再度ログインを行っていませんか？
その運用だと「あ、アカウント間違えて本番環境のEC2停止してしまった…」となる可能性があるので、以下の方法をお試しください。

## 手順
結論から言うとGoogle Chromeに環境毎のプロファイル(プロフィール)を作成します。

1. 右上のユーザアイコンを選択し、「新しいプロファイルを追加」をクリック


2. 「アカウント無しで続行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/6e797de6-2e33-1b0a-7091-9ce997741a3a.png)


3. 名前に環境名（本番環境など）を入力し、カラーテーマを選択（重要!）
このカラーテーマが重要です。開発環境は青系、本番環境は赤系など区別することで現在どの環境で作業しているのかが視覚的にわかりやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/70c8b7a5-79be-794d-1c74-71f4684a3303.png)


4. 環境毎にブックマークなども用意する必要があるので、アカウントログインURLを環境毎に追加する
ブックマーク名を環境名にし、ブックマークバーを常に表示する事で、色だけではなく文字でも環境の判断を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/a6f5fe6f-21c8-531b-a3e1-8f1cb69dad4c.png)
EC2でRHELを起動している際にRedhat Customer Portalにアクセスする

# 概要
EC2でRHELを構築後、調べ物をしている際以下のようにRHELのカスタマーポータルで情報が閲覧できずに困っていませんか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/0fd85d63-7509-04c5-54b4-0a3abde5bcb9.png)

実はEC2でRHELを起動している場合は、追加費用なしでRedHatナレッジベースへのアクセスが可能です。
参考：[Amazon EC2 が Red Hat ナレッジベースへのアクセスをサポート開始](https://aws.amazon.com/jp/about-aws/whats-new/2021/11/amazon-ec2-red-hat-knowledgebase/)

# 手順
RHELを起動しているAWSアカウントにログイン後、以下のURLにアクセスするだけです。
https://console.aws.amazon.com/entitlement/rhel/home
Google Flutterが推奨する効率性向上のためのチャットSDKソリューション：Tencent RTC Chat

# **Google Flutterが推奨する効率性向上のためのチャットSDKソリューション：Tencent RTC Chat**


# **目標**

[Tencent RTC Chat](https://trtc.io/products/chat)は、UIKitコンポーネントライブラリと[音声/ビデオ通話モジュール](https://trtc.io/products/call)を備えたチャットSDKで、顧客がアプリ内チャットモジュールを迅速に構築できるように設計されています。

Tencent RTCがFlutterを使用する前は、アプリ開発は通常、各プラットフォーム向けにネイティブツールを使用して行われていました。この方法では、開発者が複数のプログラミング言語とツールを学び、各プラットフォーム用の個別のコードベースを維持する必要があったため、時間がかかり複雑でした。また、各プラットフォームには独自の設計ガイドラインとユーザーインターフェースコンポーネントがあるため、プラットフォーム間の一貫性を確保することも課題でした。

# **なぜFlutterなのか？**

これらの課題に対処するため、Tencent RTCは単一のコードベースで複数のプラットフォーム向けのアプリを構築できる、モダンで反応的なフレームワークを探し始めました。Flutter、React Native、Lynxなどのクロスプラットフォームフレームワークを徹底的に評価した結果、チームはその優れたパフォーマンス、ユーザーエクスペリエンス、開発効率、強力なコミュニティサポート、包括的なドキュメントを理由にFlutterを選択しました。

さらに、Flutterの習得しやすいプログラミング言語、カスタマイズ可能なウィジェット、豊富なアニメーションライブラリは、他のフレームワークから移行し、高品質なSDKやアプリケーションの構築を迅速に学び始めたい開発者にとって理想的な選択肢となりました。

# **ソリューション**

Tencent RTCはFlutterを使用してTencent Cloud Chatを構築することを決定しました。Flutterのカスタムウィジェットとテーマのサポートにより、異なるプラットフォーム間で一貫性のある、ユニークで視覚的に魅力的なユーザーインターフェースを作成し、ユーザーエクスペリエンスとエンゲージメントを向上させることができました。チームはFlutterのホットリロード機能を使用してコードの変更をリアルタイムで確認し、開発プロセスをスピードアップし、より効率的にしました。

顧客がTencent Cloud Chatをアプリに統合できるよう、チームはFlutter UIKitコンポーネントライブラリを構築しました。これはFlutter [Chat SDK](https://trtc.io/products/chat)の基本的な機能をすべてカプセル化し、iOS、Android、macOS、Windows、Webなど、さまざまなプラットフォームで使用できます。最近リリースされたバージョン2.0には、新しいワイドスクリーンモードUIが含まれており、Linux以外のFlutterがサポートするすべてのプラットフォームと互換性があります。

# **結果**

Flutterの導入により、Tencent RTCは複数のプラットフォーム向けのアプリを構築できる単一のコードベースを提供することで、アプリ開発を効率化することができました。これにより、開発時間と複雑さが削減されただけでなく、自社のプロジェクトと顧客のプロジェクトの両方でプラットフォーム間の一貫性が確保されました。その結果、Tencent RTCはコンサルテーション要求の減少、コストの削減、市場投入までの時間の短縮を実現しました。また、全体的な収益も約34%の成長率で大幅に増加しています。

Flutterは、Tencent RTCの顧客にも大きな価値をもたらしています。あるクライアントのOurschoolは、人員を38%削減し、開発効率を47%向上させることができました。オンラインモニタリングシステムによると、Flutterアプリケーションの安定性は99.99%以上で、バグ率は約30%減少しました。別のクライアントのFaceProは、以前は5-6人必要だった作業を2人の開発者で実現し、開発コストを70%、人員を46%、開発サイクルを50%以上削減することができました。FlutterはTencent RTC Chatの開発効率も77%向上させました。

Tencent RTCはまた、Flutterの公式ドキュメントを英語から中国語に翻訳し、Flutterコミュニティにいくつかの貢献をしました。これには、ユーザーがマルチ言語インターフェースを作成するのを支援する言語国際化ツールと、コード内のコメントと事前設定されたルールに基づくドキュメント自動生成システムが含まれています。両方のツールは近日中にオープンソース化される予定です。
Excelで左右のセルを比較する関数

## 概要
ツールの追加が出来ない作業用PCで、WinMergeなどの比較ツールが無い時にExcelで簡単に比較を行う手順。

## 解説
1. A列とB列に比較したい文字列を並べる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/8f65b89d-cdf9-669b-7396-80b4e08ba34e.png)

2. C1に以下の関数を追加し、オートフィルでC2とC3にコピーする
`=IF(A1=B1,"〇","×")`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/6ee7c3ab-eb3c-b264-55cf-c046c2c9c7a3.png)

3. C列を選択し、「ホーム」-「条件付き書式」-「セルの強調表示ルール」-「文字列」を選び、次の文字列を含むセルを書式設定に「×」と入力してOK
（×が赤で協調される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/cf3a40ef-43d4-22b6-9716-869ef8edc4c9.png)

## 応用
毎回指定するセルを選ぶのはめんどくさいので応用

- 1つ左のセル値参照
`=INDIRECT(ADDRESS(ROW(),COLUMN()-1))`
- 2つ左のセル値参照
`=INDIRECT(ADDRESS(ROW(),COLUMN()-2))`

以下の関数にする事で、どの列でも使用可能となる
`=IF(INDIRECT(ADDRESS(ROW(),COLUMN()-1))=INDIRECT(ADDRESS(ROW(),COLUMN()-2)),"〇","×")`
データベース設計：正規化

## 正規化

正規化とは繰り返している部分をなくし、無駄のないテーブルを作ることです。
手順は２ステップ
- 「横」の繰り返しをなくす
- 「縦」の繰り返しのなくす

### 正規化を実際にやってみる

以下のテーブルを正規化していきましょう。
![スクリーンショット 2025-01-09 16.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/91bce0f6-669f-e97c-d1c1-5edf0a0890b8.png)

#### 「横」の繰り返しをなくす
まずは「横」の繰り返しのなくします。
横の繰り返しはオレンジの部分です。
![スクリーンショット 2025-01-09 16.47.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/bd844370-1434-a84c-051a-8ec0e2e1a8bb.png)

「横」の繰り返しをなくしました。
![スクリーンショット 2025-01-09 16.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/80b46f37-a4eb-f142-1b06-fad8d6839584.png)


#### 「縦」の繰り返しをなくす：１回目

「縦」の繰り返しのなくすには1:Nの関係を作りましょう。

＜購入履歴＞（１）
![スクリーンショット 2025-01-09 17.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/8ac280b8-1096-6796-b780-63f961a7131f.png)

＜購入履歴明細＞（N）
![スクリーンショット 2025-01-09 17.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/e7adc895-7ff7-e90f-fc13-cc7e32ccdeed.png)

#### 「縦」の繰り返しをなくす：２回目

購入履歴明細の「縦」の繰り返しもなくしましょう。

＜商品データ＞（１）
![スクリーンショット 2025-01-09 17.30.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/20a3bc67-cf27-5516-4da1-70332526c4dd.png)

＜購入履歴明細＞（N）
![スクリーンショット 2025-01-09 17.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/aae8012d-b18c-dd56-cad5-3eb465560ef5.png)


#### 「縦」の繰り返しをなくす：３回目

次にユーザに関するカラムの縦のデータをなくしましょう。
![スクリーンショット 2025-01-09 17.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/32fe0b3a-0b86-6e2c-f05c-5de01e7ea908.png)

1:Nの関係性にするため、切り出します。

＜ユーザデータ＞（１）
![スクリーンショット 2025-01-09 17.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/f84f2ab3-b63c-541a-eabe-c656e9575f11.png)

＜購入履歴＞（N）
![スクリーンショット 2025-01-09 17.39.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/4b71c6e3-eaa8-21ee-d93a-27ab64ee1cf5.png)

#### 「縦」の繰り返しをなくす：３回目

ユーザデータテーブルの「縦」の繰り返しもなくしましょう。

＜送料区分データ＞（１）
![スクリーンショット 2025-01-09 17.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/61881b13-49be-ca81-e9f2-0d180601c22c.png)

＜ユーザデータ＞（N）
![スクリーンショット 2025-01-09 17.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/91ed608e-9c6c-b36f-cb03-dbed7271dfc6.png)

## まとめ

- 「横」の繰り返しをなくす
- 「縦」の繰り返しをなくす（1:Nの関係にする）
データベース設計：リレーションとER図

## リレーションとは？

テーブルとテーブルの関係のことです。
この関係性がデータベースを設計する上で重要になってきます。

以下に３タイプあります。
- 1 : N（一対多）
- N : N（多対多）
- 1 : 1

例えば、
- 一対多：顧客と注文の関係
- 多対多：学生と授業の関係
- 一対一：学生と学生証の関係

## リレーションの記法

![スクリーンショット 2025-01-08 17.53.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/870220b0-0809-a780-24c9-5cd633946e45.png)
参照：https://www.ntt.com/business/services/rink/knowledge/archive_58.html

リレーションは下記のように表現できます。
もっと色んなパターンがありますが、ここに記載していないパターンは想像できると思います。

- １対１
![スクリーンショット 2025-01-08 18.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/dafbdea3-ce56-38ad-4f90-1445a96743ec.png)

- １対多（０以上）
![スクリーンショット 2025-01-08 18.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/14c58510-8d91-5914-e5c6-b1fe758b47fd.png)

- １対多（１以上）
![スクリーンショット 2025-01-08 18.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/6423a9f5-4e06-32be-3183-b10fa53bf29e.png)

- 多対多（０以上）
![スクリーンショット 2025-01-08 18.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/f5bbc2b1-ccc1-4724-50b7-6c39d368029c.png)

## 多対多では中間テーブルを作ろう

以下は多対多の関係性をもつ２つのテーブルです。
![スクリーンショット 2025-01-08 18.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/be7b8999-8d2a-6733-1661-aead02e4fcd7.png)

学生がどの授業を受けているのか管理したい場合はどうすればいいでしょうか？
そういう場合は、中間テーブルを設けてあげましょう。
![スクリーンショット 2025-01-08 18.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576061/57eee9e7-19d3-c178-9468-929a3264b0b8.png)
【VScode おすすめ拡張機能】

# VSCodeのおすすめ拡張機能について
個人的に便利だなと思った拡張機能を紹介します。

### 言語パック（必須です）
https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

### コード整形
https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

### インデントに色付け
https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow

### 全角スペース強調
https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku

### コード補完拡張機能
https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode

### フォルダやファイルのアイコン変更
https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme
Pygameを使って RPGを作る（16. 戦闘画面（その４））

# 概要
今回は、画面更新時の残像が残る問題を解決しました。
原因については、画面の更新管理不備で、イベントによる画面の更新と敵遭遇による更新があって、
また、スプライトには慣れていないせいもあって、エラー続出で時間がかかってしまった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/3dd9b72f-bcd1-b636-52c6-b0d4fc423b04.png)

# Battleクラス

このコードは、PyGame を使用して戦闘システムを実装したクラス `Battle` を示しています。戦闘中の画面描画、敵とのやり取り、プレイヤーステータスの表示、ボタンを介したユーザー入力などを管理しています。

---

## **全体の構造**
### **目的**
- 戦闘画面を構築し、敵の表示、コマンドの選択、メッセージの表示を管理します。

---

### **1. 初期化部分 (`__init__` メソッド)**

#### 主な初期化内容
- **背景画像の設定**  
  背景画像をロードし、画面サイズに合わせてスケールします。
  
- **オフセット計算**  
  背景画像を中央に配置するためにオフセットを設定します。

- **フォントの設定**  
  メッセージ表示用にフォントを指定します。

- **ボタンの初期化**  
  主なコマンド（「攻撃」「魔法」「逃げる」）とサブコマンド（「ホイミ」「メラ」「ヒャド」）のボタンを作成します。各ボタンにはクリック時の動作を関連付けます。

- **プレイヤーステータス管理**  
  `PlayerStatus` クラスを使用してプレイヤーのHP、MPなどのステータスを管理します。

- **テキスト表示管理**  
  `TextSprite` クラスを使用してメッセージの描画と管理を行います。

---

### **2. 背景描画 (`draw_background` メソッド)**
- 画面を黒で塗りつぶした後、背景画像を描画します。
- 背景画像の位置はオフセットを適用して調整します。

---

### **3. 描画処理 (`draw` メソッド)**
- 敵の画像を設定し、敵が出現したことを示すメッセージを追加します。
- 画面全体を描画するため、`render_scene` メソッドを呼び出します。

---

### **4. シーン描画 (`render_scene` メソッド)**
- 背景、敵、メッセージエリア、ボタン、プレイヤーステータスを一括で描画します。
- 各描画は専用のメソッドに分割されています。

---

### **5. メッセージ管理 (`set_message` メソッド)**
- メッセージリストが5件を超えた場合、古いメッセージを削除します。
- 各メッセージに空白を追加し、改行で結合して返します。

---

### **6. メッセージ描画 (`draw_text` メソッド)**
- `TextSprite` クラスを使ってメッセージを描画します。

---

### **7. テキストエリア描画 (`draw_background_text_area` メソッド)**
- メッセージエリアを描画します。
  - 半透明の青色背景を設定。
  - エリアの境界線を白色で描画します。

---

### **8. メニュー描画 (`draw_menu_backgroud` メソッド)**
- 左側にあるコマンドメニュー部分の背景を描画します。

---

### **9. ボタン描画 (`draw_buttons` メソッド)**
- 現在表示中のコマンドボタン（メインまたはサブコマンド）をすべて描画します。

---

### **10. コマンド切り替え**
#### `show_main_commands`
- メインコマンド（「攻撃」「魔法」「逃げる」）を表示するため、ボタンリストを切り替えます。

#### `show_sub_commands`
- サブコマンド（「ホイミ」「メラ」「ヒャド」）を表示するため、ボタンリストを切り替えます。

---

### **11. マウスイベント処理 (`handle_mouse_event` メソッド)**
- マウスクリックイベントを処理します。
- 現在表示中のボタンの中でクリックされたものを特定し、対応するアクションを実行します。

---

### **12. 各ボタンのアクション**
- **`attack`**: 「攻撃」を選択した際、メッセージリストに「攻撃」を追加。
- **`escape`**: 「逃げる」を選択した際、メッセージリストに「逃げる」を追加。
- **`hoimi`**: 「ホイミ」を選択した際、メッセージリストに「ホイミ」を追加し、メインコマンドに戻る。
- **`mera`**: 「メラ」を選択した際、メッセージリストに「メラ」を追加し、メインコマンドに戻る。
- **`hyado`**: 「ヒャド」を選択した際、メッセージリストに「ヒャド」を追加し、メインコマンドに戻る。

---

## **コードのポイント**
1. **メッセージと描画の管理**  
   - メッセージリスト (`battle_message`) を用いてログを管理。
   - 描画処理を複数のメソッドに分割して、コードの可読性を向上。

2. **コマンドシステム**  
   - メインコマンドとサブコマンドを切り替える柔軟な仕組み。

3. **ユーザー入力の処理**  
   - マウスイベントをボタン単位で処理し、クリック時の動作を関連付け。

---
Shadow Serviceの説明

# Shadow Serviceパターン

Shadow Serviceパターンは、Kubernetes上で“宛先の実体がない”Serviceを用いて通信を行う仕組みです。ここでは、ClusterIPを割り当てたService（Shadow Service）と、そのServiceが参照するEndpointSliceを作成する具体的な方法を解説します。kube-proxyの設定変更などは不要で、Kubernetes標準の機能のみで完結できるのが特徴です。

---

## Shadow Serviceとは

- Node上で実行されているPodを参照するのではなく、任意のIPと紐づくService
- ServiceというKubernetesオブジェクトの仕組みをそのまま利用し、ClusterIPも自動割り当てできる
- kube-proxyなどKubernetesのデフォルトコンポーネントを改変せずに導入可能

いわゆる“ダミー”のServiceを作成し、そのServiceの実態となるエンドポイント情報（IPやポートなど）をEndpointSliceで自分で定義することで、“外部のリソース”をKubernetes内のClusterIP経由でアクセスできるようにします。

---

## 実装の流れ

1. Shadow Serviceの作成  
2. EndpointSliceの作成  
3. Service名とEndpointSliceのラベルを関連付け  
4. ClusterIPを介して外部リソースをアクセス  

### 1. Shadow Serviceの作成

Shadow ServiceはPodをバックエンドに持たないので、通常のService定義においてselectorやtype (NodePort, LoadBalancer など) を指定しない、あるいは無効化しておきます。次の例では、名前を“dummy”とし、HTTPS(443)ポートを定義しています。

```yaml:shadow-service/shadow-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: dummy
  namespace: default
spec:
  ports:
    - port: 443
      protocol: TCP
      targetPort: 443
      name: https
```

この段階で`kubectl apply -f shadow-service.yaml`を実行すると、ServiceのClusterIPが自動で割り当てられます。

### 2. EndpointSliceの作成

次に、Shadow Serviceに紐づくエンドポイントとしてEndpointSliceを定義します。

```yaml:shadow-service/endpoint-slice.yaml
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: dummy
  namespace: default
  labels:
    kubernetes.io/service-name: dummy
addressType: IPv4
ports:
- name: https
  protocol: TCP
  port: 443
endpoints:
- addresses:
  - "93.184.215.14" # 例: example.comのIPなど、外部エンドポイントを指定
  conditions:
    ready: true
  zone: zone-a
  nodeName: node-a
```

上記では、外部リソースとして“93.184.215.14”をエンドポイントに紐づけました。`kubernetes.io/service-name` ラベルに `dummy` を指定することで、先ほど作成したService `dummy` と関連付けられます。

### 3. 関連付け

Shadow Serviceのmetadata.nameとEndpointSliceのlabels.kubernetes.io/service-nameが同じであれば、自動的に関連付けが行われます。これにより、Serviceとしての入口(ClusterIPとポート443)と、実際の外部エンドポイント(“93.184.215.14”)が結びつく仕組みです。

### 4. アクセスイメージ

完成すると、ClusterIP(例: 10.96.0.X など)へのリクエストがEndpointSliceで指定した外部IPに転送されるようになります。アプリケーション、もしくはユーザーからは"dummy"というServiceにアクセスしているように見えますが、その実体は外部アドレスというわけです。

---

## 動作確認

下記のようにcurlを利用してアクセスを試せます。

```bash
curl https://dummy --insecure -H "Host: www.example.com"
```

---

## メリットと注意点

### メリット

1. 既存Kubernetesコンポーネントの範囲内で完結
2. Podを持たなくてもClusterIPを取得可能

### 注意点

1. EndpointSliceに指定するIPアドレスの可用性や正当性を管理  
2. 連携する他のIngress ControllerやGateway Controller等が、こうしたShadow Serviceに対応しているかの確認  

## 参考資料

[Services without selectors | Kubernetes](https://kubernetes.io/docs/concepts/services-networking/service/#services-without-selectors)
PREVGROUPVALの使い方2

そういえば、レポートで集計項目(集計レベルの数式列)の入力レイアウトが変わったなぁって思っています。

この数式を適用する方法のところ... 前は次画面だったような...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/31af2b7b-3f0d-6a43-accb-64e0aa172af3.png)


+ [関数 'PREVGROUPVAL()' の引数の型が間違っています。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KBdc40AD)

以下のように取引先別の金額の全体での割合を出したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/419158d5-e722-7b54-f7ed-d04eb28e2b92.png)

PARENTGROUPVAL関数を使ったら出来たのですが挙動が今一つ理解できませんね

```
AMOUNT:SUM/PARENTGROUPVAL(AMOUNT:SUM,GRAND_SUMMARY)
```

以下のようにSelect Groupを指定した場合は　PARENTGROUPVAL(AMOUNT:SUM,GRAND_SUMMARY)が総合計になって思ったように計算されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fec8cc4a-7a54-6b30-0b43-806ef4a1f865.png)

すべての集計レベルではエラーになります

:::note alert
You must select a grouping context to use any report summary function.

レポート サマリー機能を使用するには、グループ化コンテキストを選択する必要があります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dbe631b9-229a-83bb-8438-a61d4b911ead.png)

総計のみではエラーにはならないけど...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9bfff20d-9405-ccb3-9db9-106a216e2ce4.png)

思ったようにはなりませんね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2a50760a-20da-f22b-73c3-575d59f9e13c.png)

この式だと

```
PREVGROUPVAL(AMOUNT:SUM, ACCOUNT_NAME) / AMOUNT:SUM
```

すべての集計レベルではエラーになります

:::note alert
You must select a grouping context to use any report summary function.

レポート サマリー機能を使用するには、グループ化コンテキストを選択する必要があります。
:::

総計のみでもエラーです


:::note alert
WarningIncorrect argument type for function 'PREVGROUPVAL()'.
:::

選択済みのグループではエラーにはなりませんが、結果が違う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e7d2064f-7fe3-acf9-978d-f7e222989312.png)

AMOUNT:SUMは各レベルの合計値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1059b8ea-095a-cdb0-986f-2be85b4f03c6.png)


PREVGROUPVAL(AMOUNT:SUM, ACCOUNT_NAME)は１つ前の合計値かな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a5b790eb-cb19-0339-c2c7-4fa3c173181d.png)
circuitjsの作法 その26

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
リレー回路で、RSフリップフロップ回路を作れ。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6a705a76-5ad4-072e-fd39-d90936cc4d1c.png)

# ネットリスト

```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
178 448 336 448 432 6 1 0.2 0 0.05 1000000 0.02 20 0.015 0.005 0
178 560 336 560 432 6 1 0.2 0 0.05 1000000 0.02 20 0.015 0.005 0
178 672 336 672 432 6 2 0.2 0.000004999899752009656 0.05 1000000 0.02 20 0.015 0.005 0
178 848 336 848 432 6 2 0.2 0.000004999899752009656 0.05 1000000 0.02 20 0.015 0.005 0
R 304 96 240 96 0 0 40 5 0 0 0.5
g 416 432 416 448 0 0
g 528 432 528 448 0 0
g 640 432 640 448 0 0
g 816 432 816 448 0 0
w 304 96 320 96 0
w 320 96 320 160 0
w 320 160 352 160 0
w 320 160 320 192 0
w 320 192 352 192 0
w 432 192 432 240 0
w 432 240 416 240 0
w 416 240 416 336 0
w 528 336 528 160 0
w 432 160 528 160 0
w 448 336 448 96 0
w 320 96 448 96 0
w 560 336 560 96 0
w 448 96 560 96 0
w 672 336 672 304 0
w 672 304 736 304 0
w 576 512 752 512 0
w 640 272 768 272 0
w 640 272 640 336 0
w 752 512 832 512 0
w 736 304 816 304 0
w 816 304 816 336 0
w 768 272 848 272 0
w 848 272 848 336 0
g 704 432 704 448 0 0
g 880 432 880 448 0 0
162 720 128 720 176 2 default-led 1 0 0 0.01
162 896 128 896 176 2 default-led 1 0 0 0.01
w 720 176 720 336 0
w 896 176 896 336 0
w 560 96 720 96 0
w 720 96 720 128 0
w 720 96 896 96 0
w 896 96 896 128 0
w 544 432 544 512 0
w 544 512 576 512 0
w 432 432 432 480 0
w 432 480 464 480 0
w 464 480 656 480 0
w 656 480 688 480 0
w 688 480 688 432 0
w 832 512 864 512 0
w 864 512 864 432 0
s 352 160 432 160 0 1 false
s 352 192 432 192 0 1 false

```

以上。