OmniAICreator/Qiita-1.07M huggingface dataset:
【地図】日本の市区町村ごとの犯罪率/賃貸/年収/人口のステータスが一覧できるWebサイトを作りました。【個人開発】

# 1.概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201311/7d141c74-2cff-c27e-8e46-1fe866940383.png)

 - サイト名: 日本まとめ地図
 - URL: https://prod.jpn-map-status.com/

「日本地図ステータス」は、日本の各都道府県のさまざまな統計情報を視覚的に表示するウェブサイトです。このサイトは、次のような特徴を持っています。

 1. Leafletを使って視覚的に情報を表示しています。
    - 地図ライブラリはフリーのleafletを使用しています。
 2. 各市区町村ごとにステータス１６段階色分け
    - 平均年収・賃貸・人口密度・治安で順位づけしてます。
    - 治安は1000人あたりの犯罪認知件数から算出
    - ヘッダーのメニューから項目の切り替え
 3. 各地域をクリックすることで詳細を表示
    - 具体的な数値を表示

**情報元**
政府統計ポータル[e-Stat](https://www.e-stat.go.jp/)と各都道府県の警察HPからデータを取得してまとめてます。
基本的には最新の令和5年（2023年）のデータを参考にしています。

# 2.背景
私は現在東京に住んでいますが、毎日の通勤ラッシュに疲れ果てています。満員電車でのストレスはかなりのもので、これが日常の一部であることに嫌気がさしてきました。独身で身軽なこともあり、地方への移住を真剣に考えるようになりました。

移住先を考えるにあたり、まずは各地域の治安や生活環境について調べ始めました。治安は特に重要なポイントで、各地域の犯罪率や安全性を知りたかったのです。しかし、ネットで情報を探してみても、散在しているデータを見比べるのは大変でした。「これを地図で見れたらもっと分かりやすいのにな」と思ったのが、このプロジェクトの始まりです。

どうせなら自分だけでなく、他の移住を考えている人や、地域の安全性に関心のある人たちにも役立つようなウェブサイトを作ろうと思い立ちました。そこで、各都道府県の統計情報を集めて視覚的に表示する「日本地図ステータス」というサイトを作ることにしました。このプロジェクトを通じて、地方移住を考える人々の参考になるデータベースを提供できればと思っています。

# 3.技術要素

### フロントエンド
TypeScript, React, Next.js: フロントエンドの基盤にはTypeScriptとReactを使用し、Next.jsを用いてサーバーサイドレンダリングと静的サイト生成を実現しています。TypeScriptは静的型付け言語であり、コードの保守性と信頼性を向上させます。ReactとNext.jsは現在広く流行しているフレームワークであり、最新の技術トレンドを追求することで、開発効率を高めています。
#### 状態管理
 - ReactQuery
     - データのフェッチ、キャッシュ、同期、更新の管理をシンプルにするためにReactQueryを使用しています。これにより、効率的なデータ管理とユーザー体験の向上が可能となります。特に、非同期データの取り扱いが容易で、リアルタイムデータの更新が求められる場面でその特性が非常に有効です。
 - zustand
     - 状態管理をシンプルかつ柔軟に行うためにzustandを採用しています。軽量で直感的なAPIを提供し、アプリケーションの状態を簡単に管理できます。シンプルな状態管理ライブラリとして、Reactコンポーネント間での状態の共有が容易です。
 - 地図ライブラリ:
     - react-leaflet: 地図表示にはreact-leafletを使用し、インタラクティブで使いやすい地図機能を提供しています。react-leafletはオープンソースでありながら高性能であり、ユーザーが地図上で直感的に情報を取得できるように設計されています。他の地図ライブラリと比較しても、機能とパフォーマンスのバランスが優れている点が選定の理由です。

#### バックエンド
 - Golang, Gin
     - バックエンドはGolangを使用して構築し、Ginフレームワークを用いて高パフォーマンスなAPIを提供しています。Golangはその高速な処理能力で知られており、大規模なデータ処理に適しています。

### データベース
 - PostgreSQL
     - データの永続化にはPostgreSQLを使用しています。PostgreSQLは堅牢で拡張性があり、高いパフォーマンスを提供するオープンソースのリレーショナルデータベースです。

### インフラ
 - AWS
     - インフラストラクチャはAWS上に構築されており、EC2インスタンスを使用してアプリケーションをホスティングしています。AWSは多くのサービスを提供しており、GitHub Actionsとの連携が容易です。これにより、継続的デプロイメントの設定や管理がシンプルになり、スムーズな運用が可能となります。

### DevOps
 - GithubActions
    - 継続的インテグレーションとデプロイメントにはGithubActionsを使用しています。GithubActionsを使用することで、コードの変更が自動的にビルド、テスト、デプロイされるため、迅速なリリースサイクルを維持できます。特に、AWSとの連携が容易であるため、デプロイメントの自動化がスムーズに行える点が利点です。

# 4.まとめ
このプロジェクトは、僕自身の地方移住に向けた情報収集がきっかけで始まりました。でも、最終的には多くの人に役立つツールにしたいと思っています。これからもデータを更新したり、機能を追加したりして、どんどん改善していきますので、
もし興味があれば、ぜひサイトを見てみてください。そして、何か意見やフィードバックがあれば教えてください。皆さんの意見を参考に、さらに良いものにしていきたいと思います！
Flutterのマテリアル構造とレイアウト ~外部パッケージを読み込んで使う~ 

https://flutter.ctrnost.com/tutorial/tutorial04/

👆をやってみた

### /pubspec.yamlの編集
ルートフォルダに`pubspec.yaml`がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215907/323c5b07-ec16-ce0a-5202-d6e3b7c65750.png)

ここに書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215907/fb2f44e0-4107-6aa0-99a0-7c7f5fb77fd8.png)

`flutter packages get`コマンドを叩いて、パッケージを取得すると、以下のようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215907/56a48d63-363c-9256-2f83-5e8c667c39ed.png)

`dart.main`に下記を追加する。
`import 'package:english_words/english_words.dart';`

画面の中央にランダムな英単語を表示するスクリプト
```dart
import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

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

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) { 
    // finalはconstと同じように変数を定数にする
    // wordPair変数にランダムな単語を代入
    final wordPair = WordPair.random();
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(appBar: AppBar(
        title: Text(wordPair.asPascalCase),
      ),
      body: Center(
        child: Text(wordPair.asPascalCase),
      ),
      )
    );
  }
}

```

+ `WordPair.random()`は`WordPair`クラスの`random()`静的メソッドを呼び出している
+ `random()`メソッドは内部でランダムな英単語を2つ選び、組み合わせて`WordPair`オブジェクトを生成するメソッド
+ `WordPair.first`、`WordPair.second`で一文字目の単語、二文字目の単語にアクセスできる
クラス、コンポーネント、モジュール、アーキテクチャの抽象度について

**各要素の役割と抽象度の関係**

ソフトウェア設計において、クラス、コンポーネント、モジュール、アーキテクチャは、それぞれ異なる抽象度。
抽象度とは、現実世界の概念をどの程度簡略化して表現しているかを示す尺度です。抽象度が低いほど、具体的な実装の詳細に近く、高いほど、全体的な構造や概念に焦点を当てます。

- **クラス:**
    - **最も抽象度が低い:** 実世界の概念やデータ構造を直接表現する単位です。
    - **役割:** データの属性（変数）とそれに対する操作（メソッド）をカプセル化します。
    - **例:** 人を表すクラスであれば、名前、年齢、住所といった属性と、挨拶する、移動するといった操作を持つことができます。
- **コンポーネント:**
    - **クラスより抽象度が高い:** 複数のクラスを組み合わせ、特定の機能を実現する単位です。
    - **役割:** システムの特定の部分（例えば、ユーザーインターフェース、データアクセス層）を担います。
    - **例:** GUIコンポーネントは、複数のクラス（ボタン、テキストボックスなど）を組み合わせ、ユーザーとのインタラクションを実現します。
- **モジュール:**
    - **コンポーネントより抽象度が高い:** 複数のコンポーネントを組み合わせ、より大きな機能を実現する単位です。
    - **役割:** システムを機能的に分割し、再利用性を高めます。
    - **例:** 認証モジュールは、ユーザーの認証処理に必要な全ての機能を提供します。
- **アーキテクチャ:**
    - **最も抽象度が高い:** システム全体の構造や構成要素間の関係を規定する概念です。
    - **役割:** システムの全体的な設計方針を示し、システムの品質、拡張性、保守性を決定します。
    - **例:** MVCアーキテクチャ、マイクロサービスアーキテクチャなど。

**抽象度の違いと設計プロセス**

抽象度の低いレベルから高いレベルへと設計を進めることで、システム全体の構造を把握しやすくなり、変更に強く、保守性の高いシステムを構築できます。

- **クラス設計:** データ構造と操作を詳細に設計します。
- **コンポーネント設計:** クラスを組み合わせ、機能単位を設計します。
- **モジュール設計:** コンポーネントを組み合わせ、システムを機能的に分割します。
- **アーキテクチャ設計:** システム全体の構造を決定し、設計方針を定めます。

**さらに詳しく**

- **抽象度のメリット:**
    - **再利用性:** 抽象度の高いレベルで設計することで、再利用可能な部品を作成できます。
    - **変更への対応:** 抽象度の高いレベルで変更を加えることで、影響範囲を最小限に抑えられます。
    - **理解の容易さ:** 抽象度の高いレベルでシステムを把握することで、全体像を把握しやすくなります。
- **抽象度のデメリット:**
    - **性能低下:** 抽象化によって、実行速度が低下する場合があります。
    - **設計の複雑化:** 抽象度の高いレベルの設計は、複雑になりがちです。

**具体的な例**

例えば、オンラインストアのシステムを設計する場合、

- **クラス:** 商品、顧客、注文など、システムで扱うデータを表すクラスを設計します。
- **コンポーネント:** 商品一覧表示、注文処理、決済処理など、システムの各機能を実現するコンポーネントを設計します。
- **モジュール:** 商品管理モジュール、顧客管理モジュール、注文管理モジュールなど、機能的に関連するコンポーネントをまとめたモジュールを設計します。
- **アーキテクチャ:** MVCアーキテクチャを採用し、Model（データ）、View（表示）、Controller（制御）に分けて設計します。

**まとめ**

クラス、コンポーネント、モジュール、アーキテクチャは、ソフトウェア設計においてそれぞれ異なる役割を果たし、抽象度も異なります。これらの概念を理解し、適切に使い分けることで、大規模で複雑なシステムでも、設計、開発、保守を効率的に行うことができます。

**ご不明な点があれば、お気軽にご質問ください。また、行き届いていない説明があればご指摘いただきたいです**
知財のあれこれをPythonで何とかする

１．ファミリを何とかする(その４）

今回は欧州特許庁の「Espacenet」からの特許ファミリ情報の取得作業を容易にするための処理方法を紹介したいと思います。

２．今回やろうとしていること
今回やろうとしていることは「Espacenetで表示させた”INPADOC Family”のページの、登録番号の情報だけを抜き出す」ことになります。
手作業としては「Espacenetをアクセスして出願番号、公開番号、登録番号のいずれかを入力、Familyのページを表示させ、登録番号を含むテキストデータをコピペする」ここまでは手作業です。
プログラムでは、コピペしたテキストデータから登録番号を抽出する処理をします。
Espacenetをアクセスして番号入力しサーチすると、INPADOC Familyのページを表示させる以下のようなボタンが表示されるはずです。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/59bef5b4-13c6-92ef-6571-8a7f218b463d.jpeg)

"INPADOC family"ボタンをクリックすると外国特許を含んだ出願の情報が表示されますので、表示されたページのテキストデータを以下のプログラムの「Espacenet・・・」の行にペーストしてください。
なおそのままコピペすると改行コードとダブルクオーテーションマーク（"）を含みエラーになるためExcelのClean関数等で改行コードを除きダブルクオーテーションマークはSubstitute関数をかける等で除去しておく必要があります。

```python:qiita1.py
import re
jplt =["Espacenet云々US9998877B1US9998877B1US9998877B1云々US9998877B1云々US10777666B2云々US11666555B1云々JP7776655B2云々JP6665544B1"]

index =0
for item in jplt: 
    patinf = jplt[index]
    idg1 = '\r\n'.join(set(re.findall("JP[0-9]{7}B[1-2]", patinf)))#全JP番号を取得し重複削除し改行を挟み連結
    idg2 = '\r\n'.join(set(re.findall("US[0-9]{7,8}B[1-2]", patinf)))#全US番号を取得し重複削除し改行を挟み連結
    print(idg1)
    print(idg2)
    print("+++++")
    index += 1
```
上記プログラムを実行すると変数「idg1」に日本特許、「idg2」に米国特許を抜き出すことができます。
(実行結果)
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/893cae6f-333c-f7a0-76ba-8f8a1f12f367.jpeg)
プログラムのポイントは正規表現(re)で指定した文字列を全件抽出(findall)、重複する登録番号の削除(set)、改行コードを挟んだ登録番号の連結（'\r\n'.join）で、これがプログラム1行で実現できます。
J-PlatpatのOPDとかもそうですが、単にデータをコピーすると同じ登録番号が重複して存在し面倒なところ、Pythonを使えば1つのコマンドで簡単に重複データを削除できるのはとても助かります。

リストjpltの行（「"・・・",」）を増やせば何件でも一度に変換できます。
```python:qiita2.py
jplt =["Espacenet云々US9998877B1US9998877B1US9998877B1云々US9998877B1云々US10777666B2云々US11666555B1云々JP7776655B2云々JP6665544B1",
       "Espacenet云々US8887766B2US8887766B2US8887766B2云々US8887766B2云々US7776655B2云々US6665544B2云々JP5554433B2云々JP5435435B2"]
```
(実行結果)
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/2bb2fd85-6d56-0c3a-8031-fe50c195dae0.jpeg)

３．最後に
今回の記事が何らかの助けになれば幸いです。
Yamahaルータを用いて構築した拠点間VPNの速度（参考データ）

# 概要
　Yamahaネットワークルータ（L3SW）の拠点間VPN機能を利用した際の、拠点間通信速度の実測値を調査したので参考データとして掲載する。

### 経緯
　過去、自宅と実家を常時接続する拠点間接続環境を構築し、自宅と実家に設置しているサーバ間で定期的に大量のデータ同期ができる環境を構築しようとしていた。その際、特に重要視したのが拠点間通信速度であり、どの程度の速度が出ると期待されるのか情報収集したが、実測の参考値が載っているサイトが非常に少なく感じた記憶がある。実際、拠点間通信速度は、契約しているISP、回線事業所、接続方式、ネットワーク機器の性能、回線混雑状況、通信距離等様々な要因により変化するため、分かったとしても参考値にすぎない事は事実である。しかし、せめて10Mbps程度なのか100Mbps程度の通信速度が期待できるのか、構築前に参考データは欲しいと感じていた。
　私は参考データ無しで数年かけ、より高速な環境を構築していったが、YAMAHAルータを用いて環境構築を実施しようとしている人に向け参考データを公開しようと考えた。

#### 補足
　あくまで個人宅の話であり、業務とは一切関係がない話である事を明言しておく。





# 構成した拠点間VPN情報
#### 拠点間VPN方式
|構成No  |VPNのIPv |暗号化方式 |
|---|---|---|
|1|IPv4|PPTP|
|2|IPv6|IPSec AES256-CBC|
|3|IPv6|IPSec AES256-CBC|

#### 拠点A環境
|構成No  |回線／ISP  |回線速度  |接続方式  |L3SW  |
|---|---|---|---|---|
|1|フレッツ／OCN|1Gbps|PPPoE|NVR510|
|2|フレッツ／OCN|1Gbps|IPoE|NVR700W|
|3|フレッツ／OCN|1Gbps|IPoE|NVR700W|

#### 拠点B環境
|構成No  |回線／ISP  |回線速度  |接続方式  |L3SW  |
|---|---|---|---|---|
|1|フレッツ／BIGLOBE|1Gbps|PPPoE|NVR510|
|2|フレッツ／BIGLOBE|1Gbps|IPoE|NVR700W|
|3|電力系／eo|10Gbps|デュアルスタック|RTX1300|

　上に記載している2拠点で常時接続を実施した。（拠点Aと拠点Bは県を跨いでおり、直線距離で50km程度離れている。）





# 拠点間通信速度
　ここに記載している速度は正確にベンチマークを実施した記録データではなく、おおよそどの程度であったかといいた概算データである。（環境構築した当初は記事を投稿する想定ではなかったため）
|構成No  |通常時速度  |混雑時速度  |
|---|---|---|
|1|約40Mbps|約1Mbps|
|2|約400～500Mbps|約100Mbps|
|3|約400～600Mbps|約100Mbps|

### 考察
　構成No.1では通常時40Mbps程度の速度となった。事前調査した情報ではIPSecよりPPTP<sup>※1</sup>の方が軽い処理となるため通信速度が速くなるという情報があったが、実際は想像以上に速度が出なかった。これはNVR510という機種のハードウェア処理機能対応の有無や、フレッツ網におけるPPPoE接続が混雑の影響を受けやす事や、経験上の話にはなるがIPoE接続と比較してPPPoE接続による通信は低速である事が原因ではないかと推測される。<sup>※2</sup>

  No.2の構成ではNo.1と比較し10倍近く高速通信ができるようになった。これはIPoE接続によるIPv6を利用した混雑しにくくかつ高速な通信である事、ハードウェア側の高速処理が効いている事に起因すると推測される。<sup>※2</sup>
  
※1　現在、セキュリティ的に非推奨の暗号化方式であり、私はNGN網という閉域内の通信である事から一時的に採用していた。
※2　IPv4-IPSecを利用した環境でのテストをしていないため推測の域を出ない。





# 通信速度の追求
　ここまでで紹介したデータは、セキュリティ的な理由や時間的理由から、徹底的な速度追及をしていない。徹底的に速度を追求したい場合は、以下に挙げる項目のチューニングを行うと良いと思われる。
・インターネット接続におけるMTU値のチューニング。
・VPNトンネルのMTU値のチューニング。
・暗号化方式をAES256-CBCからAES128-CBCに変更する。

#### 余談
　NVR510でPPTPに拠点間VPNをしている場合において拠点間通信速度を向上させたい時は、予算が許せばIPv6-IPSecによる拠点間VPNに対応した機材へ変更する事が最も簡単な解決策であるが、世の中にはIPv6-IPIP over PPTPといった方法で通信速度の高速化を図っている人もおり試してみる価値はあるかもしれない。





# 結論
　NVR510を用いたPPTP拠点間接続は、IPv4にしか対応しておらずフレッツ網のPPPoE接続の場合通信速度が期待できない点、時間帯により通信速度が大幅に低下する点、暗号化には対応しているが現在非推奨な古い技術であり閉域網内に限ったやり取りでのみ妥協的に選択できる選択肢である点に注意が必要である。加えてIPv6-IPSecによる拠点間接続と比較し設定が複雑となり、要求されるネットワーク知識・機材設定知識が高くなる点からも、予算の都合上どうしてもという時向けの選択肢だと考えている。 なお設定ハードルが更に上がるが、IPv6-IPIP over PPTPといった方法で通信速度の高速化を図っている人もおり、腕に自信がある人は試してみる価値があると思われる。
　一方、NVR700WやRTX1300を用いたIPSecによる拠点間通信は機材入手にかかる費用こそかさむが、設定が簡単である事、セキュアな暗号化方式が利用できる事、通信速度が高速である事、1年以上長期的に運用しているが安定している実績がある事から、価格に見合った価値があると感じている。
YouTube の IFrame Player API を使って p5.js Web Editor の中に YouTube動画を呼び出す

完全に「思いついたからやってみた」という内容で、何に活用できそうかはこれから考えるというものなのですが...

https://x.com/youtoy/status/1816840415871685094

以下の YouTube の「IFrame Player API」を使った YouTube動画の表示を、p5.js Web Editor上でやってみたというものです。

●iframe 組み込みの YouTube Player API リファレンス  |  YouTube IFrame Player API  |  Google for Developers
　https://developers.google.com/youtube/iframe_api_reference?hl=ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/44ac75c2-601a-afec-8ec5-376548bdc5dc.png)

上記のページでサンプルとして示されている内容は、以下のとおりです。
それを見た感じだと、divタグを用意して、そこに動画を表示させる形になるようです。

```html
<!DOCTYPE html>
<html>
  <body>
    <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
    <div id="player"></div>

    <script>
      // 2. This code loads the IFrame Player API code asynchronously.
      var tag = document.createElement('script');

      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

      // 3. This function creates an <iframe> (and YouTube player)
      //    after the API code downloads.
      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '360',
          width: '640',
          videoId: 'M7lc1UVf-VE',
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }
        });
      }

      // 4. The API will call this function when the video player is ready.
      function onPlayerReady(event) {
        event.target.playVideo();
      }

      // 5. The API calls this function when the player's state changes.
      //    The function indicates that when playing a video (state=1),
      //    the player should play for six seconds and then stop.
      var done = false;
      function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PLAYING && !done) {
          setTimeout(stopVideo, 6000);
          done = true;
        }
      }
      function stopVideo() {
        player.stopVideo();
      }
    </script>
  </body>
</html>
```

上記を使って、以下の動画を p5.js Web Editor上に表示させてみました。

●micro:bit でフルカラーLEDテープをレインボーに光らせる（順番に点灯したり全点灯後に色が移動する形で変化していったり） - YouTube
　https://www.youtube.com/watch?v=s4auEwHEjlQ

コードは以下のとおりです。
タグの生成などの処理は、p5.js らしい書き方を使うようにしてみました。

```javascript
function setup() {
  createCanvas(400, 400);

  const scriptTag = createElement("script");
  scriptTag.attribute("src", "https://www.youtube.com/iframe_api");
  scriptTag.parent(select("head"));

  const playerDiv = createDiv();
  playerDiv.id("player");
  playerDiv.position(50, 50);
  select("main").child(playerDiv);

  window.onYouTubeIframeAPIReady = function () {
    player = new YT.Player("player", {
      height: "270",
      width: "480",
      videoId: "s4auEwHEjlQ",
    });
  };
}

function draw() {
  background(220);
}
```

また、`onYouTubeIframeAPIReady` は `window.onYouTubeIframeAPIReady = function () {}` という形にして、p5.js で処理を扱えるようにしています。

とりあえず、冒頭に掲載したポストの画像のように、YouTube動画を表示させることができました。
Firebaseのデプロイを理解する

# はじめに
Firebaseの`channel_id`って何？ってところから始まった物語

# Hosting インフラストラクチャの概要
- プロジェクトには、デフォルトのホスティングサイトが紐づいている
- ホスティングサイトには、複数のチャンネルがある
- 各チャンネルごとにURLが紐づいている

##### チャンネルには、「ライブチャンネル」と「プレビューチャンネル」のに種類がある
##### ライブチャンネルは実際にデプロイする本番環境的な
##### プレビューチャンネルは動作を確認するためのステージング環境的な

> すべてのFirebaseプロジェクトには、そのプロジェクトのすべてのリソース（データベース、認証、関数など）にアクセスできる、**デフォルトのHostingサイトがあります。**
サイトには 1 つ以上のチャネルがあり、各チャネルは特定のコンテンツとHostingの構成を提供するURLに関連付けられています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/7e398e32-dbac-ac10-2d27-6cb97d2006a9.png)

# チャンネルの設定管理
### 保持するリリース数を制限する
1. Firebaseのホスティングを開く
2. 以前のリリースから、「ストレージのリリースに関する設定」から、保持するリリース数を設定する

>チャネルにデプロイするたび、Hostingは以前のリリースに関連付けられたバージョンをプロジェクトのHostingストレージに保持します。
プロジェクト内のそれぞれのチャネル（ライブチャネルとプレビューチャネルの両方）について、保持するリリース数を設定できます。
保持するリリース数の上限を設定すると、設定した上限を超えたリリースのコンテンツは、古いリリースから順に削除されるようスケジュールされます。


# 参考
https://firebase.google.com/docs/hosting/manage-hosting-resources?hl=ja
ジェネリックスについて

# ジェネリックスについての理解
Javadocを眺めていると、ジェネリクスを利用したクラス、メソッド、インターフェースが存在します。Eとか、Kとか記載されていると、パラメータの意味が分からず読み飛ばしている方もいるのではないでしょうか？
そのような方のために、ジェネリック型を見かけてもドキュメントやコードが読めるよう解説をしたいと思います。

ジェネリック型とは、型に対してパラメータ化されるジェネリッククラスまたはインターフェースとなります。

ジェネリックス型を利用せず、汎用的な型を扱う場合は以下のようになります。
```java
public class Box {
    private Object object;

    public void set(Object object) { this.object = object; }
    public Object get() { return object; }
}
```

ジェネリックス型で定義した場合、以下のようなコードになります。
```java
public class Box<T> {
    // T stands for "Type"
    private T t;

    public void set(T t) { this.t = t; }
    public T get() { return t; }
}
```
JavaDocで記載されているパラメータ名を紹介します。
* E - Element（要素）コレクションで利用
* K - Key（キー）
* N - Number（数値）
* T - Type（タイプ）
* V - Value（値）
* S,U,V etc - ２番目、３番目、４番目のType

# ジェネリックスの具体的な書き方について

## 複数のタイプパラメータを扱うジェネリッククラス
ジェネリッククラスは複数の型パラメータを持つことが出来ます。例えばPairインターフェースを実装したOrderedPairクラスを例として記載します。

```java
// 型パラメータを受け取るインターフェース
public interface Pair<K, V> {
    public K getKey();
    public V getValue();
}

// Pairインターフェースを実装したOrderPairクラス
public class OrderedPair<K, V> implements Pair<K, V> {

    private K key;
    private V value;

    public OrderedPair(K key, V value) {
	this.key = key;
	this.value = value;
    }

    public K getKey()	{ return key; }
    public V getValue() { return value; }
}
```

OrderedPairクラスについては、以下のようなインスタンスを作成可能です。
ジェネリックについては型総称となるため、後付けでの型定義が可能となります。
```java
Pair<String, Integer> p1 = new OrderedPiar<String, Integer>("Even", 8);
Pair<String, Integer> p2 = new OrderedPiar<String, Integer>("Hello", "world");

// ダイアモンド演算子でも定義可能
OrderedPiar<String, Integer> p3 = new OrderedPiar<>("Even", 8);
OrderedPiar<String, Integer> p4 = new OrderedPiar<>("Hello", "world");

パラメータ化された型でも定義可能
OrderedPair<String, Box<Integer>> p5 = new OrderedPair<>("xxxx", new Box<integer>(...));
```

## 実例
コードの解説をします。コードを読むと次のような解釈ができると思います。

FutureServiceはfutureクラスを引数に受け取り結果を受け取るメソッドが準備されている。
external.fetchBoxInfo()を非同期で実行し、結果boxDetailを受け取っている。

```java
// 外部サービスAPIを非同期で実行
Future<BoxDetail> future = externalApi.fetchBoxInfo();
BoxDetail boxDetail = futureService.handleResult(future);

// 非同期処理を共通化
class FutureService {
    public <T> T handleResult( Future<T> future )
    {
        if( timeout <= 0 ) {
            // エラー処理
            thow xxxException;
        }
    
        try {
            return future.get(timeout, timeUnit);
        } catch ( ExcecuteException | InterruptedException e ) {
            throw xxxException
        }
    }
}
```

# まとめ
「ジェネリックスについての理解」で紹介した内容についてはJavaDocチュートリアルに記載されている内容になります
 
https://docs.oracle.com/javase/tutorial/java/generics/index.html

ジェネリックスについては、Javaの初級研修のスコープ外かと思います。そのため慣れない記述を見ると躓てしまう方もいるかと思います。
今後躓かないためにも基礎をしっかり学ぶことで基本的なコードを読む・書くことできるようになるかと思います。基礎をしっかり学んでいきましょう。
自分の技術習得フロー

1. 資格がある場合には資格のテキストを買う。資格試験は網羅的知識を要求するため、資格の勉強をしていると分野で必要な幅広い知識が身につく。ベンダー系資格は些末な言語仕様ばかりを出題していて「何かを作る」という視点で観たときに本質的ではないので、できればIPAとかがやってる一般的な知識を証明するための資格を選ぶとよい
1. 現在の技術に手を出す前に歴史的経緯を調べる。歴史的経緯を知っているだけで見えてくるものが違ってくる。また、改修案件の場合には直接役に立つ。今流行ってるものは積み上げの結果であるので何かしら意味があるのだが、経緯を知っていないと恩恵がわからないし、ヒトはわからないものに対しての理解を拒否して先に進むことを拒絶するので、歴史的経緯は知って損することなし
1. 本屋に行く。だいたい親指2本くらいの厚みで表紙がゴテゴテしてないものは良書であることが多い。良書かどうかをすぐ判断できるようになるためにはいろんな本を読んでないとわからないので、まずは前段階として図書館に行って色んな技術書を読んでみるとよい
1. 言語習得の場合には、まずGoFのデザインパターンをその言語で実装したとき、どのような見た目になるかをチェックする。ifとかforのような構造化プログラミングのための構文はどの言語でもほとんど一緒だが、設計をきちんとやろうとしたときにはその言語特有の思想、仕様が色濃く現れる。たとえばC,C++ならポインタがあるし、Rustなら所有権があるし、Javaならインターフェースがある。そういった言語特有の考え方はデザインパターンを実装したときに実務的なコードとして現れることが多いので、適当にGitHubのサンプルを調べるか、ChatGPTに書き起こしてもらって理解すると一気に習得が進む
1. 小さいサンプルをフルスクラッチで作る
アフィリエイター向けの次世代ブログライティングツール

<a href="https://it.blogmura.com/ranking/in?p_cid=11119283" target="_blank"><img src="https://b.blogmura.com/it/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログへ" /></a><br />

先月からアフィリエイト目的でブログを始めたが、正直コンテンツ管理が面倒くさくなってきた。

https://ameblo.jp/motochan1969/

特に自動化しようと思うと、AMEBA、HATENA、FC2みたいな既存のブログサービスを使うって、結局ブロガー自身がベンダーのカモにされてる感じが否めない（もちろんブロガー読者はカモのカモ・・・）

# 現状
ブログサービスの階層を、おなじみのサザエさんで表現すると以下のようになる。
つまり結局は、広告収入に注釈を付け、三河屋さんが主に儲かる仕組みである。
（一部の人気ブロガーは、広告収入を得ている部分はあるが、実質には有料会員という納税を上納している）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/15444572-8c9d-b917-e933-11fb8d76dca3.png)

# 下剋上するには
　少なくとも、下剋上するには、以下の3点が重要となる
 >下剋上：つまり下位層のブロガーや読者がより力を持ち、上位層と対等に渡り合えるようになること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/b62530ff-a57a-ff9a-76fb-d0f2f5a2ced1.png)

# タラちゃんの立ち位置を整理する
* 新人ブロガーの象徴　→　サザエさん一家で最年少（＝ブログ界での初心者）
* 大きな成長の可能性を秘めている　→　創造性と純粋さを持つ（＝既存の枠にとらわれない新しい発想）
* 家族のサポートが必要（＝適切なツールやサポートの重要性）
* 平等な機会を象徴（＝経験や規模に関わらず、誰もが成功のチャンスを持つべき）
* 既存のブログ界に新規参入する立場　→　大手プラットフォームや経験豊富なブロガーとの差別化が課題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/dcfeb735-3002-c6d0-7ec2-7a1deef2393f.png)

（いいぞ、CLAUD3.5、がんばれ～）

# タラちゃんの完全管理データベース機能
　このシステムでは、タラちゃんが自身のブログに関するすべてのデータを完全に管理できます。これには記事データ、読者情報、アクセス統計が含まれます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/86bb1356-a47a-e0c3-4619-abb99c3c6d40.png)

# こんな機能があったら便利じゃない？

1. AI支援ライティング: キーワード入れるだけで、SEO最適化された記事の下書きを自動生成してくれる。
2. マルチプラットフォーム配信: 一度の操作で複数のブログやSNSに同時投稿できる。
3. スマートなコンテンツ管理: タグ付けや検索が簡単にできる直感的なインターフェース。
4. アフィリエイトリンク自動挿入: 関連商品のリンクを最適な位置に自動で入れてくれる。
5. 統合アナリティクス: 複数プラットフォームのデータを一元管理して、パフォーマンスを可視化。

こういうツールがあれば、私たちはもっと創造的な部分に集中できるし、効率的にアフィリエイト収入を増やせるんじゃないかな。

# 既存のツール 

 多機能な統合ブログライティングツールは存在しないかもしれませんが、いくつかの既存のツールや機能を組み合わせることで、類似の機能を実現できる可能性があります。
 以下に、関連する既存のツールや機能をいくつか紹介します：

* コンテンツ管理システム (CMS)

WordPress: プラグインを使用することで、多くのプラットフォームへの同時投稿が可能です。

* ソーシャルメディア管理ツール

Buffer, Hootsuite: 複数のSNSプラットフォームへの同時投稿が可能です。

* アフィリエイト管理ツール

ThirstyAffiliates, Pretty Links: WordPressのプラグインで、アフィリエイトリンクの管理を行います。

* コンテンツスクレイピングツール

Octoparse, Import.io: ウェブサイトからコンテンツを抽出し、ダウンロードできます。

* 画像最適化ツール

Canva, Adobe Creative Cloud: 画像の編集やブラッシュアップが可能です。

* コンテンツ配信ネットワーク (CDN)

Cloudflare, Amazon CloudFront: コンテンツの高速配信を実現します。

* バックアップと同期ツール

Google Drive, Dropbox: コンテンツの保存と同期が可能です。

これらの機能を1つのプラットフォームに統合したツールは、私の知る限り存在しません。しかし、APIを使用して複数のツールを連携させることで、似たような機能を実現することは可能かもしれません。
このようなオールインワンのブログライティングツールは、コンテンツクリエイターにとって非常に有用だと考えられます。既存のツールの組み合わせでは不十分な部分があれば、新しいソフトウェアを開発する価値のある市場機会かもしれません。

# 今後の予定
　まずは既存ツールの周辺から調査だろうか・・・　Wordpressだけでも、結構学習コストが高い気もするが

# 関連記事:
[生活ログアプリの構想（２）](https://qiita.com/EasyCording/items/27c451162947a575644c)
[類似性ネットワークで簡易RAGを作ってみた](https://qiita.com/EasyCording/items/7b083e9037e9a57c4fde)
レガシーなBackbone.jsのコードをES6で書く

レガシーなコード

```javascript
var DocumentRow = Backbone.View.extend({

  tagName: "li",

  className: "document-row",

  events: {
    "click .icon":          "open",
    "click .button.edit":   "openEditDialog",
    "click .button.delete": "destroy"
  },

  initialize: function() {
    this.listenTo(this.model, "change", this.render);
  },

  render: function() {
    ...
  }

});
```

こういうレガシーコードはインテリセンスがまっっっったく働かないので、クラス式に書き換える。

```javascript
const DocumentRow = class extends Backbone.View {

  events() {
    return{
        "click .icon":          "open",
        "click .button.edit":   "openEditDialog",
        "click .button.delete": "destroy"
    }
  },

  initialize() {
    this.tagName = "li";
    this.className = "document-row";
    this.listenTo(this.model, "change", this.render);
  },

  render() {
    ...
  }

};
```

あとは() {の部分を:function() {に置換するなどすればOK。backbone.jsが独自の初期化システムを持っているため、コンストラクタは定義しないほうがいいっぽい。

コーディング時はインテリセンスの恩恵を受けるためにES6で書き、レビューで書き直せと言われたら戻すのが良さそう。

この世からプロトタイプベースのJSが滅びますように。
【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.7 (3拍子、口笛、スキャット、アコースティックギター)【動画 2分22秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ しろぶりゅーの歌 ver.7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/e65a33c0-e0a0-1e59-b137-e6a3bbf4d3bd.png)



* # 動画URL
    * https://youtu.be/wX8Esa4OB6Y

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.7 (3拍子、口笛、スキャット、アコースティックギター)【動画 2分22秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-07-27(土)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

スロージョギングの途中に、早朝の中目黒で偶然出会った「しろぶりゅー」-ShiroBrew-のテーマソング( イメージソングは和製英語です )を、1人のファンとして自主的につくりました。
つまり「しろぶりゅー」のファンメイドテーマソングです。

ぜひ聴いてみてください。
そして、ぜひみなさんも、あなたが大好きなお店やブランドや企業のために楽曲をつくってみてください！

作曲日:
2024-07-20(土)

Suno AI 契約の種類:
Pro Plan

楽曲の正式名称:
しろぶりゅーの歌 #7

Suno AI Library URL:
https://bit.ly/ShiroBrew-07

Custom Mode: On

Audio Inputs: Not Used

With Vocals:


---


Lyrics(without Meta tags):

真っ白な心

そよ風感じる

コーヒーの香りと
真っ白な心


---


Lyrics & Meta tags:

[Break]

[Intro]

[Whistling]

[Scat]

[Verse]
真っ白な心

[Verse 2]
そよ風感じる

[Chorus]
コーヒーの香りと
真っ白な心

[Whistling]

[Outro]


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Waltz][180 seconds][lo-fi][japanese][Female][Gospel][Acoustic]


🇯🇵日本語訳

[ワルツ][180秒][ローファイ][日本語][女性][ゴスペル][アコースティック]


---


Suno AI 公式URL
https://accounts.suno.ai


SHIROノMONO 公式URL - Instagram
https://www.instagram.com/shiro_nomono


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“Suno AIで3拍子”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghNy-xIeeMZV6D2YAnax9Nzw


　・“しろぶりゅー ファンメイドソング”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPk5-_YwWl499DNAOVKlcvZ


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/4c3IB1g
Salesforce AIアソシエイト試験の頻出ワード解説

## はじめに
今回は、Salesforce AIアソシエイト試験の頻出ワードをいくつかピックアップして解説していきたいと思います。
先日、当試験を受験して無事合格することができました。他のSalesforceの資格試験と比較するとかなり易しい内容となっておりましたので、Salesforceの資格試験が初めての方には非常におすすめの試験となっております。
Salesforceについての知識はもちろん、一般的なAIについての知識も学べるのはとても嬉しいポイントです。
それでは、頻出ワードの解説を始めていきます。

## 各種AIについて
AIにはいくつも種類があります。この試験では、AIの種類による違いとそれぞれの特徴について問われます。
### NLP
NLPとは、自然言語処理とも呼ばれ、人間が普段コミュニケーションに用いている言葉（自然言語）をAIが解析し処理する技術です。基本的には人間がコンピューターに処理内容を伝えるためにはプログラミング言語のようなコンピューター言語を用います。これを、音声認識でコンピューターに話しかけたり（Siri、Alexaなど）テキストを入力して指示する（ChatGPTなど）ことで、コンピューターが処理する技術をNLPと呼びます。
### 深層学習
深層学習とは、人間の神経細胞の仕組みであるニューラルネットワークの仕組みを応用した機械学習の手法の1つです。大量のデータからデータ群の特徴を分析し、パターン認識することができます。つまり、人間が物事を学習するようにAIが複雑なデータを学習することが可能になりました。
### 生成AI
生成AIとは、人間から受けた指示（プロンプト）を元に新しいコンテンツを生成するAIです。ChatGPTが有名です。ChatGPTは自然言語のプロンプトからコンテンツを生成し、さらに入力されたデータを学習していくので、NLPと深層学習を活用した生成AIということになります。ChatGPTのようにテキストを生成するものの他に、画像を生成したり、音楽を生成したりするものなど、様々な種類があります。

### 予測AI
予測AIとは、大量の過去データを分析し、未来を予測するAIです。ビジネスシーンでは、製品やサービスの需要予測、来客予測、商談の成約予測等に活用されています。生成AIとの違いを問われることが多いので、違いをよく理解しておきましょう。

## Salesforceの信頼できるAIの原則
AIを活用することに対して、安全性、正確性、倫理的な観点でリスクを提唱されることが多くあります。SalesforceのAIでは、これらを保証するために提唱している原則があり、試験の中ではこの内容について問われます。
- 責任性
- 説明可能性
- 透明性
- 促進性
- 包括性
下記ブログ記事で解説されているので、概要を理解しましょう。
https://blog.salesforceairesearch.com/meet-salesforces-trusted-ai-principles/
また、Trailheadでも解説されています。
https://trailhead.salesforce.com/ja/content/learn/modules/responsible-creation-of-artificial-intelligence/create-responsible-generative-ai?trail_id=get_smart_einstein&trailmix_creator_id=strailhead&trailmix_slug=prepare-for-your-salesforce-ai-associate-credential

## バイアス
バイアスとは、偏ったデータの傾向のことで、AIが不適切な出力をする原因となります。例えば、人種、性別に対して差別的な出力をしてしまう場合があります。AIを活用する際は、偏った学習データによる有害性を十分に考慮する必要があります。

## おわりに
今回は、Salesforce AIアソシエイト試験で頻出するワードについて解説しました。
冒頭でご説明したように難易度は易しいうえ、受験料も他のSalesforce試験の半額程で、1回まで再受験が無料となっているので興味のある方は是非一度受験してみてはいかがでしょうか。
【SSG】静的サイトジェネレーター 初心者必見！ゼロから学べる実践入門

静的サイトジェネレーター（SSG）とは？
---
静的サイトジェネレーター（Static Site Generation）は、ビルド時にHTMLファイルを生成し、これをクライアントに配信する手法です。
これにより、ページの表示速度が向上し、SEOにも有利になります。SSGは、事前に生成されたHTMLファイルを配信するため、動的なコンテンツの必要が少ないサイトに適しています。

SSGのメリット
---
`パフォーマンスの向上`: 事前に生成されたHTMLファイルを配信するため、表示速度が速い。
`SEOの向上`: 検索エンジンが完全なHTMLをインデックスしやすくなる。
`セキュリティ`: サーバー側でのデータ処理が少ないため、攻撃のリスクが低減される。

基本的なSSGの実装
---
ページコンポーネント内でgetStaticProps関数を使うことで、SSGを実現できます。

``` .Next.js
// pages/index.js
export default function Home({ data }) {
  return (
    <div>
      <h1>静的サイト生成の例</h1>
      <p>{data.message}</p>
    </div>
  );
}

export async function getStaticProps() {
  // ビルド時にデータをフェッチ
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data,
    },
  };
}
```
getStaticProps関数は、ビルド時に実行され、データをフェッチしてページコンポーネントに渡します。
このデータは、ビルド時に静的なHTMLとして生成されます。

データフェッチングの実装
---
外部APIからデータを取得し、それをSSGで表示する例を見てみましょう。
上記の例では、サンプルAPI `https://api.example.com/data` からデータを取得しています。
APIが返すデータが以下のようなJSONであると仮定します。
```
{
  "message": "Hello from SSG!"
}
```
このデータをページに表示するには、getStaticProps関数内でfetchを使ってデータを取得し、propsとしてコンポーネントに渡します。

パフォーマンス最適化のポイント
---
SSGを実装する際に、パフォーマンスを最適化するためのいくつかのポイントがあります。
`キャッシュの活用`: ビルド時に生成されたHTMLファイルをキャッシュして、サーバーの負荷を軽減します。
`最小限のデータフェッチ`: 必要なデータだけをフェッチして、ビルド時間を短縮します。
`ビルドの頻度`: 頻繁に更新が必要なコンテンツはISR（Incremental Static Regeneration）を利用して、ビルド後も静的ページを再生成します。

例えば、以下のようにISRを使用して、指定された時間後にページを再生成することができます。
```
export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data,
    },
    revalidate: 10, // 10秒後に再生成
  };
}
```

まとめ
---
静的サイトジェネレーター（SSG）は、ビルド時に静的なHTMLファイルを生成し、ユーザーのリクエストに対してこれらのファイルを配信する手法です。
これにより、パフォーマンスとSEOが向上し、変更の少ないコンテンツに適しています。
ポートフォワードってなんだっけ

# はじめに
個人開発で、ローカル端末からAurora MySQLへ接続できるようにするため、踏み台サーバを構築しています。
踏み台サーバ上で作業するのではなくローカルから作業したいため、ポートフォワード機能も実装しようとしたのですが、、、
そもそもポートフォワードってなんだっけ？
と思ってしまったので記事を書いています。

# 対象読者
ポートフォワードについて概要をおさらいしたい方
駆け出しエンジニアの方

# ポートフォワードとは
## ポートって？
マシンがデータを受け付ける「ドア」のことです。
私たちが普段パソコンやスマートフォンを操作しているとき、インターネットを見ながらメール送信するなど、複数の作業を並行して行っているときがあるかと思います。
もしポートがなければ、一か所からすべてのデータを受け付けることになり、データが大混雑してしまうでしょう。

ポートがあることで、それぞれのデータの受付場所を明確にさせ、スムーズにデータのやり取りができます。

## フォワードって？
forwardという英単語で、「転送する」とかの意味を持ちます。
つまり、そのままの意味です。

# まとめ
ポートフォワードとは、**あるポートに送られてきたデータを転送する(中継する)**
という機能になります。
【Salesforce】初期の選択リストの値

Salesforceでは、リード、取引先、取引先責任者、商談の各オブジェクトに対していくつかの標準の選択リストフィールドが設定されています。

以下に、それぞれのオブジェクトの主要な選択リストフィールドの初期値をメモします。重複してる値はまとめています。

### リード状況 (Status)
- Qualified
- Working
- New	
- Nurturing
- Unqualified
  
### 敬称 (Salutation)

- Mr.
- Ms.
- Mrs.
- Dr.
- Prof.
- - Mx.

### 評価 (Rating)
- Hot
- Warm
- Cold

### 会社形態 (Ownership)
### リードソース (Lead Source)
- Advertisement
- Customer Event
- Employee Referral
- External Referral
- Google AdWords
- Other
- Partner
- Purchased List
- Trade Show
- Webinar
- Website

### 業種 (Industry)
- Agriculture
- Apparel
- Banking
- Biotechnology
- Chemicals
- Communications
- Construction
- Consulting
- Education
- Electronics
- Energy
- Engineering
- Entertainment
- Environmental
- Finance
- Food & Beverage
- Government
- Healthcare
- Hospitality
- Insurance
- Machinery
- Manufacturing
- Media
- Not For Profit
- Other
- Recreation
- Retail
- Shipping
- Technology
- Telecommunications
- Transportation
- Utilities

（無効な値）
- Aerospace & Defense
- Business Services
- Advertising

### 種別 (Type)
- Analyst
- Competitor
- Customer
- Integrator
- Investor
- Partner
- Press
- Prospect
- Reseller
- Other

### 代名詞 (Pronouns)
- He/Him
- She/Her
- They/Them
- He/They
- She/They
- Not Listed

### 性同一性 (GenderIdentity)　
- Male
- Female
- Nonbinary
- Not Listed

### 商談ステージ (StageName)
- Qualification
- Needs Analysis
- Proposal	
- Negotiation
- Closed Won
- Closed Lost

### 商談種別 (Type)
- Existing Business
- New Business

### 売上予測分類 (ForecastCategoryName)
- Omitted
- Pipeline
- Best Case
- Commit
- Closed

これらの選択リストの値は、Salesforce組織の初期段階において、ニーズや実際の運用に応じてカスタマイズされることが多いと思います。実際の利用の際には、ご自身の環境でもご確認を推奨します。
(Arduino)0から256?(255)までを15と16で割った時の差をかんがえる(ファイナル)(計算まで)


x 最終章
x 力尽きたのであと、なんか、勝手にやって(本人は、満足したので)


結果


![o_coq236.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/274de219-12f6-f92f-41ed-306fc85ac81c.jpeg)


オンラインコンパイラ

プログラム

```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int sa[] = {
    //12345678901234567890123456789012
    0b00000000000000010000000000000011,
    0b00000000000001110000000000001111,
    0b00000000000111110000000000111111,
    0b00000000011111110000000011111111,
    0b00000001111111110000001111111111,
    0b00000111111111110000111111111111,
    0b00011111111111110011111111111111,
    0b01111111111111111111111111111111
    };//sa
    
    printf("\n\nSTART\n\n");
    
    int x = 60;
    int y;

    y = x >> 4;

    int a = sa[x >> 5];
    a = a << (x & 0x1f);
    a = a & 0x80000000;
    if(a != 0) {a = 1;}else{a = 0;}
    if( x == 255){a = a + 1;} 
    y = y + a;
    
    
    printf("(%d)/(15)=(%d)\n",x,y);
 
}//main


```

```



START

(60)/(15)=(4)



```
セキガエマシンの使い方

全自動席替えアプリである「セキガエマシン」の使い方について説明します。
## ユーザー限定機能
サインインするとユーザー限定の機能を利用することができます
ユーザー限定の機能を一言で説明すると、履歴の保存と復元です。
これにより、２回目以降の使用では、面倒な氏名の入力や条件の設定を省略することができます。
ぜひ、お試しください。
### サインインする
画面右上「Googleでサインイン」ボタンによってサインインすることができます。
サインインすることで、席替え後の座席や設定を履歴として保存することができます。
履歴に保存する機能を使用したい場合、最初にサインインを済ませてください。
サインインを行うとリロードが発生するので、設定後では画面がリセットされてしまうからです。
### 履歴に保存する
席替え後、「座席を入れ替える」ボタンの下に「履歴に保存する」ボタンが出てきます。これを押すことでユーザーの履歴として席替え前の座席、席替え後の座席、設定した全ての条件が保存されます。
保存した履歴は次回使用時に呼び出して使用することができます。
### 履歴から復元する
サイドバー最上部にある「履歴から復元」を使用することで、前回使用時に保存した内容を呼び出して使用することができます。
保存した日時の右側にBeforeとAfterが並んでいます。
Beforeを選択すると、席替え前の座席と設定が、
Agterを選択すると、席が後の座席と設定が復元されます。
## 主な手順
基本的にはサイドバーを上から順に巡っていただければ問題なく設定ができます。
### 1. レイアウトを決める
座席レイアウトを縦×横で設定します。デフォルトは３×４です。上限は１０×１０です。
### 2. 名前を入力する
メイン画面に移り、座席枠の中に生徒の名前を入力してください。タブキーを使うと効率よく次の枠に移ることができます。
### 3. 「色」または「座席なし」を設定する
座席枠をクリックすることで、色を変更することができます。生徒の性別を表すことを想定した機能です。
灰　→　青　→　桃　の順に変わります。
た、さらにクリックすることで **「座席なし」** となります。
これにより、教室内の座席のない位置を設定することができます。
### 4. 同席NG
席替え時に、席替え前と同じ座席を生徒に割り振ることを認めるかどうかを設定します。
オン（青）にすることで、同じ座席の割り振りを認めない設定にすることができます。
### 5. 性別で固定
オン（青）にすることで、座席の色の位置が変わらないよう席替えをすることができます。
青には青が、桃には桃が、灰には灰が着席します。
### 6. 教師最寄り席
教師に一番近い座席の位置を設定することができます。
デフォルトは左上になっています。違う場合は設定してください。
後述する、「教師の近く」に関係する機能です。
### 7. 最前列
生徒名の右のトグルをオン（青）にすることで、その生徒に最前列の座席を割り振ります。
### 8. 前２列
その生徒に最前列か前から２列目の座席を割り振ります。
### 9. 最後列
その生徒に一番後ろの座席を割り振ります。
### 10. 後２列
その生徒に一番後ろか後ろから２列目の座席を割り振ります。
### 11. 最右列
その生徒に一番右の列の座席を割り振ります。
### 12. 最左列
その生徒に一番左の列の座席を割り振ります。
### 13. 教師の近く
その生徒に６で設定した「教師最寄り席」に最も近い６席の内から座席を割り振ります。
### 14. 隣
隣同士に配置したい生徒のペアを指定することができます。
「組み合わせを追加」することで生徒のペアを増やすことができます。
### 15. ２席以内
隣または、隣の隣に配置したい生徒のペアを指定することができます。
### 16. １席離す
１席以上離して配置したい生徒ペアを指定することができます。
### 17. ２席離す
２席以上離して配置したい生徒ペアを指定することができます。
### 18. 席替えをする
以上の設定が終わったら、「席替えをする」ボタンを押すことで、席替えを行うことができます。
クリック一つで、一瞬で何度でも行うことができますので、お試しください。
### 19. 座席を入れ替える
席替え後の座席を入れ替え、手動で座席をカスタマイズすることができます。
「座背を入れ替える」ボタンを押してください。座席入れ替えモードになります。入れ替えたい座席を２つ選択してください。
座席の入れ替えを中止したい場合は、「入れ替えを中止する」ボタンをおしてください。
「入れ替え実行」ボタンを押すことで、座席の入れ替えが完了します。
## 使用上の注意点
気持ちよくご使用いただくために、使用上の注意点をお伝えします
### 条件の競合
席替え条件を設定する際に、条件の競合ないように気をつけてください。
以下のような場合、条件が競合し、席替えに失敗します。
* 生徒Aに最右列と最左列を指定する。
* 生徒Aに最前列を指定する。生徒Bに最後列を指定する。生徒Aと生徒Bを隣ペアにする。
* 生徒Aに最後列を指定する。生徒Aを教師の近くに指定する。
### ペアが多すぎる場合
「隣」「２席以内」「１席離す」「２席離す」のペアが多ければ多いほど、席替えは飛躍的に難しくなります。必要以上のペアをつくらないようご注意ください。
(Arduino)0から256までを15と16で割った時の差をかんがえる(3)


x とちゅうで力つきるかも

差のテーブルから読み出す

結果

![o_coq234.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/89699ef0-fb2a-cfb1-b9c0-7349eb21d199.jpeg)



オンラインコンパイラ

プログラム

```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int sa[] = {
    //12345678901234567890123456789012
    0b00000000000000010000000000000011,
    0b00000000000001110000000000001111,
    0b00000000000111110000000000111111,
    0b00000000011111110000000011111111,
    0b00000001111111110000001111111111,
    0b00000111111111110000111111111111,
    0b00011111111111110011111111111111,
    0b01111111111111111111111111111111
    };//sa
    
    printf("\n\nSTART\n\n");
    int a;
    for(int ii=0;ii<256;ii++){
        if((ii & 0x1f) == 0){printf("\n");}
        
        a = sa[ii >> 5];
        a = a << (ii & 0x1f);
        a = a & 0x80000000;
        if(a != 0) {a = 1;}else{a = 0;}
        
        printf("%d",a);
    
    }//for ii
}





```


結果

```



START


00000000000000010000000000000011
00000000000001110000000000001111
00000000000111110000000000111111
00000000011111110000000011111111
00000001111111110000001111111111
00000111111111110000111111111111
00011111111111110011111111111111
01111111111111111111111111111111

```
FlutterでDatetime型の時間がずれる

## 現象
```dart
final datetime = Datetime.now();
print(datetime); // ここが9時間前になってしまう
print(datetime.timeZoneName); //  GMT　<- JSTにしたい
```
## 環境
- Android Studio (Jellyfish）
- Android StudioのEmulator(Pixcel7)
```
Flutter 3.33
Dart 3.5.0
```

## 原因
- DateTimeクラスは端末のタイムゾーンに依存している
## 対応策
エミュレーター上のSetting(設定)からSystem（システム）で日付と時刻のタイムゾーンを設定する

## 参考
https://www.petadocs.com/other/question/9
(Arduino)0から256までを15と16で割った時の差をかんがえる(2)


x とちゅうで解けなくて、あきるかもしれません。(最後までやれよ?)

目的
秒や時の為に60で高速に割りたい
1からの続き

とりあえず、差分の表を作ってみる

結果
(むむむ)

![o_coq233.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b987d536-4e09-afd7-1f73-3cc0836baefa.jpeg)


```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    printf("\n\nSTART\n\n");
    int a;
    for(int ii=0;ii<257;ii++){
        
       a = ii & 0x1f;
       if(a==0)printf("\n");
       printf("%d",ii/15-ii/16);
        
    }//for ii
}//main


```

結果

```



START


00000000000000010000000000000011
00000000000001110000000000001111
00000000000111110000000000111111
00000000011111110000000011111111
00000001111111110000001111111111
00000111111111110000111111111111
00011111111111110011111111111111
01111111111111111111111111111112
1


```
Blenderのアクションの対応づけを置き換えるスクリプト

Blenderでアニメーションを作る場合に
Blenderだけで作業を完結するのではなく　他のツールで作ったアニメーションを利用したいこともあります

Blenderアクション内のデータとボーンの紐づけは 他のデータと同様に名前で対応されますが
必ずしもパーツの命名が同じでなかったり
リグを使用して名前が変更になることもあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/ab665c12-6c63-16c1-6306-1bb8134ea579.png)
そういった場合　アクションでは対応付けするものがないものとしてエラー表示になります
この対応付けを修正するには　エラーで表示されているデータパスの文字列を１つ１つ修正するしかないようです

煩雑なのでボーンの置き換えを記述することで対応付けを修正するスクリプトを書いてみました
```py
import bpy
import re
# アクション名で取得する場合
#action = bpy.data.actions["Action"]
# 現在編集中のアクション
action = bpy.context.active_object.animation_data.action
# 名前の置き換え辞書
retarget_dic ={"thigh.L":"thigh_fk.L","shin.L":"Leg_fk_L",
                "upper_arm.L":"upper_arm_fk.L","forearm.L":"forearm_fk.L",
                "thigh.R":"thigh_fk.R","shin.R":"Leg_fk_R",
                "upper_arm.R":"upper_arm_fk.R","forearm.R":"forearm_fk.R"
                }
# データパスの置き換え
for f in action.fcurves:
    for key_ in retarget_dic.keys():
        if key_ in f.data_path:
            f.data_path = re.sub('(.+)%s(.+)$' % key_, r'\1%s\2' % retarget_dic[key_],f.data_path)
# グループ名（ボーン名）の置き換え
for g in action.groups:
    if g.name in retarget_dic.keys():
        g.name = retarget_dic[g.name]
```
例では Rigifyのメタリグで付けたアクションを　RigifyのFKボーンに対応付けてみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/13cfb5af-656e-dfac-aca2-684ead63f0ca.png)
スクリプト実行直後は変化がないように見えますが　フレームを変更する等をするとポーズが更新されるかと思います
（キャプチャでは緑色のボーンがFKボーンです）

ちょっとしたものですが　参考にできる情報が見当たらなかったので書いてみました
何かの参考になれば幸いです
Hono + Satori + Cloudflare でアバター生成 API を作った！


## はじめに

今回は、Hono、Satori、Cloudflare Pages を使って、簡単に文字や背景色を指定してアバターを作れる API を作ってみた話をまとめました！

この記事では、その作成過程や使った技術について紹介します
なお、Hono などの詳細な解説は省略しますので、詳しく知りたい方は公式ドキュメントを参照してください

## プロジェクトの概要

このプロジェクトでは、ユーザーが指定した文字やアイコンをもとに、アバター画像を生成する API を作りました。どんな技術を使って、どうやって実現したのかを紹介します

### 1. Hono で API ポイントを作成

Hono は非常に軽量で高速なウェブフレームワークです
このプロジェクトでは、API のエンドポイントを作成し、ユーザーが入力した文字や背景色を受け取り、変数に格納しました

（見る人によっては少しひどいコードかもしれませんが、ご容赦ください）

https://github.com/minagishl/hono-avatars/blob/052091db937681936bb02733363e10c372a42acf/src/index.ts#L60-L115

### 2. Satori でアバター画像を生成

Satori は画像生成用のライブラリです
このプロジェクトでは、Satori を使ってユーザー指定の文字や背景色からアバター画像を生成しました。Satori はカスタマイズがしやすく、簡単な画像の生成から複雑な画像の生成まで幅広く対応しています

また、JSX を使ってアバター画像を生成するコードを書くことができます
これにより、作業時間が大幅に短縮しました！

https://github.com/minagishl/hono-avatars/blob/052091db937681936bb02733363e10c372a42acf/src/image.tsx#L5-L35

実はここで少しつまずいてしまって、`.wasm` ファイルを esbuild でビルドする方法がわからず、悪魔的な方法で解決しました
もしもっと良い方法があれば教えてください

### 3. Cloudflare Pages にデプロイ

Cloudflare Pages は、静的サイトや Next.js などを簡単にデプロイできるサービスです。このプロジェクトでは、Cloudflare Pages を使って、アバター生成 API をデプロイしました

詳しくは省きますが、GitHub にリポジトリを Push するだけでデプロイできるので、非常に便利です

### 4. Ui Avatars との互換性

このプロジェクトで作成した API は、既存の ui-avatars.com と互換性があります
つまり、ui-avatars.com で使用している URL パラメータをそのまま使って、同様の機能を提供することができます。これにより、ui-avatars.com を利用していたシステムに対してもスムーズな移行が可能です

## 使い方

この API は、以下の URL にアクセスすることで利用できます

```
https://hono-avatars.pages.dev/?name=john+doe
```

`name` パラメータには、アバターに表示する文字列を指定します
また、`background` パラメータには、背景色を指定することができます

```
https://hono-avatars.pages.dev/?background=0D8ABC&color=fff
```

詳しくは、[GitHub の README](https://github.com/minagishl/hono-avatars/#readme) を参照してください

ですが、まだまだ機能が足りない部分もあるので、今後の改善に期待してください！

## まとめ

Hono、Satori、Cloudflare Pages を使って、簡単に文字や背景色を指定してアバターを生成できる API を作成しました。興味がある方は、ぜひ [GitHub のリポジトリ](https://github.com/minagishl/hono-avatars) をチェックしてみてください！

コードに関するレビューやフィードバックがあれば、大歓迎です！どんな意見でもお待ちしています
Reactチュートリアルやったで

初投稿です！どうせならアウトプットしたいなー程度で作りました。

## 今回作るアプリ
今回作るのは「三目並べ」というゲームです。
Reactの公式チュートリアルにおいてあるものです。

https://ja.react.dev/learn/tutorial-tic-tac-toe#react-developer-tools

自分は今回初めてReactを触るので大まかな特徴と自分がつまずいた部分のみ語ろうと思います。

## Reactの特徴
まず、Reactの機能の一つとしてコンポーネントがあります(以下引用)
-コンポーネント（公式ドキュメントより）

React では、コンポーネントとは UI の部品を表す再利用可能なコードのことです。コンポーネントは、アプリケーションの UI 要素を表示し、管理し、更新するために使用します。

表示したいものをhtml,javascript,まとめて一つの部品として管理できるものって感じ。
コンポーネントの内部にコンポーネントを呼び出したり、コンポーネント同士での変数やStateを呼び出したりして複雑な処理がかけそう。（小並感）
他のファイルから作成したコンポーネントをインポートすることも可能。

これは自分用なんですが、コンポーネント内で複数のタグ(JSX要素)を使いたいときはフラグメント（<> および </>）で囲む必要があります。

## UseState
クリックしたときの処理をhandleClickとして定義するところからuseStateを用いています。
あまり詳しい理解ではないですが自分の解釈を...
```const [value, setValue] = useState(null);```
このように記述し、setValueでvalueを更新する形です。
Board内のSquareはそれぞれ独自のStateを保持しているため、コンポーネントごとに更新されるそうです。
state の親コンポーネントへのリフトアップ（持ち上げ）は値を親コンポーネントでまとめて管理するためにするそうです。おそらく、コンポーネント内部で定義したstateを外にだせないからかなと自分は解釈してます。

## 再レンダリング
クリックした際、状態を管理する変数stateがBoardにあり、Squareから直接この変数を変更することはできません。その為、BoredからSquareに関数を渡して、クリック時にSquareから関数を呼び出しています。
関数handleClick内の処理では、簡単に言うとsquares配列をコピーしてi番目のみ変更する感じです。
しかし、以下の書き方ではうまくいきません。
```<Square value={squares[0]} onSquareClick={handleClick(0)} />```
これは、handleClickの呼び出しがBoardのレンダーの一部として発生するからだそう。
handleClickの処理で、setSquaresが呼び出されてstateが更新されますが、この時にBoard全体が再レンダリングされ再びhandleClickが呼び出されるという無限ループに陥るためです。
これを解決するには、さらに別の関数を定義してその中でhandleClickを呼び出せばいいですが煩雑です。
代わりにクリック時に呼び出される関数をアロー関数で定義します。
この問題はクリック時に関数の呼び出しを行ってしまうことが原因でした。なので、アロー関数でプロパティとして設定することで、再レンダリングしてもクリックするまで実行されないので無限ループから抜け出すことができます。
## イミュータビリティ
handleClick内でなぜsquires配列をわざわざコピーして変更していたかはimmutabilityにあります。
データを変更する方法は二種類あり、
・データを直接書き換え（ミューテート）
・臨んだ変更をしたコピーで元のデータを置換する
です
後者を選ぶことで以下の利点が得られます。
・過去のデータを保持でき、後で再利用したり巻き戻し機能を加えることができる。
・必要な箇所のみの再レンダリングを行いたいときにデータの変更の有無が比較しやすい。
今回のは後者

## 最後に
今回割と小さいゲームのみだったのでＷＥＢでも作って解像度上げたいですね。
ReactはカスタムフックとかuseEffectとかまだ何も知らないので早く使いたいです。
さらっと調べてuseStateと再レンダリングはなにやら関係性があるらしいので、
別の記事で自分の解釈残すかもです。
GTDBの系統樹からphylumを抽出し、iTOLで表示する

# 背景
[以前の記事](https://qiita.com/116ryusei/items/89fdcac52740bd82208f)で、GTDBで提供されている系統樹をiTOLで開く方法を紹介しました。この系統樹は、10万近くの細菌種からなり、非常に重いです。種の系統樹を門(phylum)にまとめると、見やすくなります。この記事では、GTDBの系統樹からphylumを抽出し、iTOLで表示する方法を紹介します。

# 実行環境
- Windows11
- Ubuntu 22.04.3 LTS
- ete4 ([以前の記事](https://qiita.com/116ryusei/items/6c4c8d92b3633f59b7c6)で環境構築を紹介)

## 入力ファイル
入力するGTDBの系統樹は、[以前の記事](https://qiita.com/116ryusei/items/89fdcac52740bd82208f)による`bac120_to_itol_noboot.tree`を想定しています。

## サンプルプログラム
ete4を使用して、系統樹から門のみを抽出するプログラム例はこちらです。
実行の際はこのようなコマンド(`$ python prune_phylum.py > phylum.tree`)を入力し、ファイル出力しました。
```python:prune_phylum.py
from ete4 import PhyloTree

def prune_phylum(file_path,parser=1):
    phylum_list = []
    t = PhyloTree(open(file_path),parser=parser)
    for node in t.traverse():
        full_name = node.name
        if full_name is None:
            continue
        if 'p__' in full_name:
            # 以下のノード名に対応し、phylum(p__)を抽出
            # p__Desulfobacterota_B|c__Binatia
            print(full_name)
            phylum = full_name.split("|")[0]
            # ノード名はphylumに置き換える
            node.name = phylum
            phylum_list.append(phylum)
    t.prune(phylum_list)
    return t

if __name__ == '__main__':
    t = prune_phylum('bac120_to_itol_noboot.tree',1)
    # t.show()
    print(t.write(parser=1))

```

# 結果
系統樹の門のみ抽出し、iTOLで表示できました。
![スクリーンショット 2024-07-27 025123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602355/2fb152b4-1edc-6a49-a6fa-58599b7476f2.png)

# まとめ
門のみを抽出した系統樹はAnnoTreeでも表示できますが、iTOLの方が自由度高く系統樹にアノテーションできると思っています(個人の意見です)。また、コードではコメントアウト(t.show())していますが、ete4でも系統樹を描画できます。この書き方についても紹介していきたいです。
Javaで「例外とは」の動作を確認してみた

# 概要

Javaで「例外とは」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/exception/index1.html

# 実装

以下のファイルを作成しました。
```JSample1_1.java
class JSample1_1{
  public static void main(String args[]){
    int n = 10;

    if (n == 10{
      System.out.println("10です");
    }
  }
}
```

以下のコマンドを実行しました。
```$ javac JSample1_1.java 
JSample1_1.java:5: エラー: ')'がありません
    if (n == 10{
               ^
エラー1個
```

以下のファイルを作成しました。
```JSample1_2.java
class JSample1_2{
  public static void main(String args[]){
    int n[] = {18, 29, 36};

    System.out.println("開始します");

    for (int i = 0; i < 4; i++){
      System.out.println(n[i]);
    }

    System.out.println("終了しました");
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample1_2.java 
$ java JSample1_2 
開始します
18
29
36
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at JSample1_2.main(JSample1_2.java:8)
```

# まとめ

何かの役に立てばと。
PenTestSecJP に参加して

先日 [PenTestSecJP](https://pentestsecjp.connpass.com/) に参加してきたので、その内容について簡単にまとめていきたいと思います。

# PenTestSecJP とは
ソフトバンクやイエラエでプロのペンテスターとして業務に携わっている人たちが、サイバーセキュリティ技術に関して良いアウトプットをしていく場として立ち上げたコミュニティです。

# 発表内容
* [10分で「知る」ペンテストの世界](https://qiita.com/amu-kuroneko/items/39e395144dc1ac73b63a)
* [ウェブ脆弱性診断員から ペネトレーションテスターへの キャリアチェンジ](https://qiita.com/amu-kuroneko/items/fdf3a9a758ef16ebb7fc)
* [ペネトレーションテストから見えた(内部)Webアプリケーションに潜むリスク](https://qiita.com/amu-kuroneko/items/af679afe24d8704bfdbf)
* TBA: AutomatedLabを使って内部ペンテストを勉強しよう！
* TBA: フルクラウド環境下でのペネトレーションテスト
* TBA: RCEへの近道
* TBA: CVE10.0? CVE-2021-38759のリスクの探求
「達人に学ぶDB設計　徹底指南書」を読んで

# 「達人に学ぶDB設計　徹底指南書」を読んで

## はじめに
こんにちは、今回は「達人に学ぶDB設計　徹底指南書」を読んだ感想をシェアしたいと思います。この本は、データベース設計の基礎から応用までを幅広くカバーしており、特に初心者にとって非常に役立つ内容が詰まっています。私自身、バックエンドの実務経験はなく、大学の授業でデータベースを学んだ程度の知識しかありませんでしたが、この本を通じて多くのことを学ぶことができました。

## 3章・4章：正規化とER図作成
初心者である私にとって特に良かったのは、第3章と第4章の内容です。

### 正規化
正規化とは、データベースの冗長性を排除し、データの一貫性を保つための手法です。この本では、第1正規形から第5正規形までの各段階を丁寧に解説しています。具体例を交えながら説明してくれるので、実際のデータベース設計においてどのように適用するのかが非常にわかりやすかったです。

### ER図作成
ER図（エンティティ・リレーションシップ図）は、データベースの構造を視覚的に表現するためのツールです。ER図を用いることで、データベースの設計がより明確になり、関係性の把握が容易になります。

## 5章以降：パフォーマンスやバッドノウハウ、グレーノウハウ
第5章以降の内容は、パフォーマンスの最適化や実際の現場で役立つテクニックについてです。これらの章は少し難しく感じる部分もありましたが、非常に重要な内容が含まれています。


## まとめ
「達人に学ぶDB設計　徹底指南書」は、データベース設計の初心者から中級者まで幅広く対応した非常に優れた参考書です。基礎的な部分から応用的なテクニックまで、丁寧に解説されています。

私自身、まだまだ勉強中ですが、この本を参考にして、より良いデータベース設計ができるように努力していきたいと思います。

読んでいただき、ありがとうございました！
ProxmoxをiPXEでいれてみた

## 概要
ProxmoxをiPXE経由で起動して自動セットアップをしてみる

## 流れ
1. iPXEBoot可能なPCを起動する
1. DHCPによりインストーラの場所を取得
1. HTTPサーバーよりインストーラの取得
1. 同じくHTTPサーバーより初期セットアップ用の回答ファイルの取得
1. 自動起動！

## 環境
| 機器 |
|------|
|NEC IX2215|
|動いてるPROXMOXサーバー 8.1.4|

## 手順
#### iPXEBoot可能なPCを準備する
検証につき自前proxmoxサーバーにてVMを準備
マシン: i440fx
BIOS: SeaBIOS
OSタイプ: Linux 6.x
CPU: HOST
メモリ: 6,144

:::note warn
メモリが6GB以下だとインストールができないことがあった
:::

一度起動し、BIOS設定にて起動順序を`iPXE ipv4` のみにしておく

#### インストーラの準備
https://pve.proxmox.com/wiki/Automated_Installation
ここを参考に自動インストール用のisoを作成する

1. toolのインストール
`apt install proxmox-auto-install-assistant`

2. インストール対象のProxmoxインストーラーをダウンロード
`wget https://enterprise.proxmox.com/iso/proxmox-ve_8.2-1.iso`

3. toolを使用して自動セットアップ設定が書き込まれたisoの作成
`proxmox-auto-install-assistant prepare-iso {ダウンロードしたiso} --fetch-from http --url "{WEBサーバーIP}/answer"`

4. 初期RAMディスクとカーネルの抜出
https://github.com/morph027/pve-iso-2-pxe

`bash pve-iso-2-pxe.sh {3で作成したiso}`
直下に`pxeboot/linux26` `pxeboot/initrd`ができたことを確認
※後で使います


#### 回答ファイルの準備
最低限の記述だけをしておく
``` toml:answer.toml
[global]
keyboard = "en-us"
country = "jp" 
fqdn = "{サーバー名}.local" 
mailto = "pvexxx@no.invalid"
timezone = "Asia/Tokyo" 
root_password = "{rootパスワード}" 
[network] 
source = "from-dhcp" 
[disk-setup]
filesystem = "ext4"
lvm . swapsize = 0
lvm . maxvz = 0
disk_list = [ "sda" ]
```
:::note warn
fqdnがサーバー名になるので注意！！
:::
複数ディスクがある場合は["sda","sdb","sdc"]のように記述

#### 起動ファイルの作成
```0:lpxelinux.0
#!ipxe
dhcp
set serverip http://{HTTPサーバーIP}
set opts "vga=791 video=vesafb:ywrap,mtrr ramdisk_size=16777216 rw quiet initrd=initrd"
kernel ${serverip}/linux26 ${opts} proxmox-start-auto-installer
initrd ${serverip}/initrd
boot
```

#### HTTPサーバーの準備
テスト用のサーバーを作ってあるので必要であれば↓
https://github.com/maimai-club/installmox
手順4で作成したファイルと起動用ファイルを広報する
- `http://{サーバーIP}/lpxelinux.0`
- `http://{サーバーIP}/initrd`
- `http://{サーバーIP}/linux26`
- `http://{サーバーIP}/answer.toml`

#### DHCPオプションの設定
DHCPオプション67に起動ファイルURLを設定
NEX IXルーターの場合:
`Option 60 ascii PXEClient` ※PXEの場合は指定しなくてもよかった
`Option 67 ascii http://{サーバーIP}/lpxelinux.0`

#### 起動！
(Arduino)(c++)(c)ループの高速化?(無限ループ)


目的
無限ループを高速化したい

原理
単純にラベルとgoto文にすると機械語にそのまま翻訳されるので速くなるかも
○○神拳の究極奥義である。


結果　タイムアウトでOK

![o_coq231.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/259e97ca-b13e-1016-033c-566fb73d101e.jpeg)


オンラインコンパイラ

プログラム

```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    loop_mugen:
    
    //処理
    
    goto loop_mugen;
}


```