OmniAICreator/Qiita-1.07M huggingface dataset:
Vite × ReactのChrome拡張でグラフ描画したい！各ライブラリを試してみた話



こんにちは、そうすけです。  

最近は React + Vite を使って Chrome拡張を作る機会が増えてきました。

「拡張機能でもグラフ描画したい！」  
そんな場面って意外と多いですよね。データ可視化、トレンド分析、クリックログのヒートマップなどなど…。  
でも、実際にやってみると意外とハマりどころが多かったので、**代表的なグラフライブラリ3つを試してみた結果と注意点**をまとめておきます！

---

## JSのグラフライブラリ候補調査
### スター数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621281/c3a6ae22-631f-48a1-8260-817a9e838939.png)

圧倒的にChart.jsが多く、そのあとRechartsと続きていきます。
Chart.jsは昔からあるというのも大きいと思います。

### 週次ダウンロード数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621281/1dbbb91b-b4c8-4bca-851e-cf748e818d87.png)

Recharts一興ですね。

### パッケージサイズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621281/3cc2daa1-b98b-4eab-a4db-7756f05f88a4.png)

Echartsがかなり大きく、他はトントンです。

## ✅ 使用したベースリポジトリ

まず今回使ったベースはこちら👇  


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621281/24e524fa-66d4-41e3-ab12-79505c7cd2a6.png)



https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite

Manifest v3対応・React + TypeScript + Vite + Tailwind のモダン構成で、かなり開発しやすいです。

---

## 試したグラフライブラリ3つ

| ライブラリ       | 見た目 | 開発体験 | パフォーマンス | Vite互換性 |
|----------------|--------|----------|----------------|-------------|
| Recharts       | ◎ キレイ | △ HMR効かない | ○ 普通         | ❌ 相性悪い |
| Chart.js       | △ レガシー | △ 手動実装多い | ◎ 軽い        | ○ 問題なし |
| React-ECharts  | ○ 良い感じ | ◎ 安定 | △ メモリ重め   | ◎ 相性良い |

---

## Recharts：UI最強、でもHMRが使えない

一番期待していたのがこれ。  
**Recharts、UIはほんとにキレイです。** カスタマイズ性も高く、使い心地もGood。ドキュメントも揃っていて、導入も簡単。

ただ、**Viteと相性がとても悪かった…！**  

### 問題点
- HMR（Hot Module Replacement）が効かない
- 差分ビルドが崩れて **再レンダリングされない**
- 毎回ローカルサーバー落としてビルドしないといけない


Chrome拡張開発でこの不安定さは致命的。  
**本番には使えないと判断しました。**

---

## Chart.js：超軽量だけどゼロからの実装がしんどい

次に試したのが Chart.js。  
Canvasベースで描画されるので、パフォーマンスは非常に軽い。

ただし、**Reactで使うにはカスタマイズが大変！**

### 具体的にしんどい点
- クロスヘア（マウスオーバー時の縦線） → 自作が必要
- 凡例・ツールチップもある程度自力実装
- スタイルやイベントハンドリングが冗長になる

昔ながらのグラフライブラリという印象。  
とにかく「Reactっぽくない」し、学習コストも高め。

AI使ったら、グラフはかけるものの、処理が複雑になりすぎて、認知不可が高くなり、
グラフUIをゴリゴリ自力しないといけないのは、チームで運用にするのには不向きだなと考えました。

---

## React-ECharts：相性良し、実用性も高い！

最終的に採用したのがこれ。  
React-ECharts（EChartsのReactラッパー）です。

### 良かった点
- HMRが安定して動く（＝Viteとの相性◎）
- クロスヘアやズーム、ツールチップなどがデフォで使える
- 設定もオブジェクトベースで柔軟

多少メモリは食いますが、**開発・運用ともに一番ストレスが少ない**と感じました。  
Chrome拡張の中でも全く問題なく動作しています。

---

## 🏁 結論：React-EChartsが今のところ最適解！

| 目的 | おすすめ |
|------|-----------|
| UIの美しさを最優先 | Recharts（でもViteならやめとこう） |
| とにかく軽くしたい | Chart.js（でも自作覚悟） |
| 安定性・開発体験重視 |  React-ECharts |


---

## ✍️ さいごに

Chrome拡張でグラフを描画したい！  
…と軽い気持ちでライブラリを導入したら、意外と沼だった今回。

Rechartsは魅力的だったけど、拡張開発においては**開発体験やビルドの安定性もめちゃくちゃ重要**だなと実感しました。

今後はEChartsベースで色々試していこうと思います。  
この記事が誰かのグラフ沼脱出のヒントになれば嬉しいです！
AstroでKaTeXを使うときに数式が2回表示される

# 状況
Astroで`remark-math`と`rehype-katex`を使って数式を表示するときに，数式が2回表示されます。

# 原因
`rehype-katex`はデフォルトでHTMLとMathMLの両方を出力する仕様になっていることが原因です。

# 解決方法
`rehype-katex`で`output: 'mathml'`を指定します。

```js:astro.config.mjs
import { defineConfig } from 'astro/config';
import remarkMath from 'remark-math';
import rehypeKatex from 'rehype-katex';

// https://astro.build/config
export default defineConfig({
  site: 'https://example.com',
  integrations: [mdx(), sitemap()],
  markdown: {
    remarkPlugins: [remarkMath],
    rehypePlugins: [
      [
        rehypeKatex,
        {output: 'mathml'}  // これを追加します
      ],
    ]
  },
});
```
PythonのURLブルートフォーススクリプト

# 主な機能
- http://example.com/pages/1, .../2, ..., .../100 などのURLに対して使用
- ステータスコードが200の場合、Content-Length ヘッダを確認して空ページやファイルのサイズを表示
- 結果を標準出力に表示（存在するURLとそのサイズ、またはエラー）

# 前提条件
- Python 3.6+
- `requests` ライブラリのインストール

# 使用例
```bash
python3 url_brute.py
```
以下の条件でページが存在するか確認したい：
- ベースURL: http://target.com
- ディレクトリ: pages
- 範囲: 1 〜 50
```bash
ENTER BASE URL (e.g. http://example.com): http://target.com
ENTER PAGES DIRECTORY (e.g. pages): pages
ENTER START NUMBER (e.g. 1): 1
ENTER END NUMBER (e.g. 50): 50

[+] FOUND: http://target.com/pages/3 (Content-Length: 1245 bytes)
[!] FOUND BUT EMPTY (0 bytes or unknown size): http://target.com/pages/15
[-] NOT FOUND: http://target.com/pages/22 (STATUS: 404)
```
# 補足
- Content-Lengthが取得できない、もしくは0の場合、「空または不明」として警告表示。
- タイムアウト（既定3秒）や接続エラー、その他requests例外をキャッチ

# GitHub
https://github.com/sup0gari/CTF_TOOLS/blob/main/url_brute.py
Windowsでメモ帳に現在日時を簡単入力


# Windows標準のメモ帳で日時を入力したい

という場合、以下が便利です。

```
「F5」を入力。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562068/0b24dc76-6e86-47b1-a23f-78b086ef7f2b.png)

また、メモ帳でテキストファイルを開く度に自動で日時を追記してくれる仕組みもあります。

```
一行目に「.LOG」と書いて保存。次から開いたタイミングが自動で記載される。
```

https://support.microsoft.com/en-us/windows/help-in-notepad-4d68c388-2ff2-0e7f-b706-35fb2ab88a8c

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562068/00010622-488d-4125-a36c-c0b777983458.png)
読みやすいコード＝斜め読みしやすいコードだと思っている

# これはなに
個人的に読みやすい(美しい)コードとは何かと考える機会があったので、個人の考えをまとめたものである

# 注意書き
あくまで読みやすいコードの話であって、良いコード,良い設計という話ではない
良いコードは自ずと読みやすいが、読みやすいコードが必ず良い状態になっているとは言えないからだ

# 読みやすいコードとは
読みやすいコードとはすなわち斜め読みがしやすいコードだと私は思う

コードは小説や今読んでいるこの記事のように文章の一つだ
しかしコードが他の文章と決定的に違うのは人間が読む順番通りに書かれておらず、
また人間が読む順番が決まってないという事だ
コードにわざわざページ番号は振られていないし、上から下に順番通りに書かれている訳ではない

大抵のプログラマはコードを読む時、適当なファイルを開いて上から読んだかと思えば下から上に戻るし、
途中で別のファイルを開いて並べて読む事もあるだろう

つまり何が言いたいのかというとコードとはそもそもが斜め読みをするような文章だと言うことだ
斜め読みがしやすいコードは読みやすい、それはある意味当然である

# 斜め読みしやすいコードとは
前章で読みやすいという事は、斜め読みしやすい事だと言ったが、
実際にどのようなコードが斜め読みしやすいか考えてみよう

## 適度に区切られたコード
最初にして一番大事な事だと思う
「適度に区切られた」というのは改行や字下げ、関数の切り分けなどとにかく全部の事だ
いずれも多すぎても、少なすぎても読みづらい

区切る単位が適切であれば、ざっくりその箇所の意味が分かれば
そこを読み飛ばす事ができ読みやすい

また適度に区切るにしてもその「適度」というのが分からないと区切る事は出来ない
私はその為の一番の指標として「意味」と意識すると良いと考える

ある関数の中でこの部分は代入処理、そしてここからはループ処理をする
それぞれ「意味」する事が違うから改行をする
if文の中と外では「意味」が違うので、字下げをする
ある「意味」をまとめるために関数にする

すべて「意味」をベースに考える事が出来る
ここでの「意味」が大き過ぎたり、捉え方を誤ると一気に読みづらいものになるのだ

## 一貫性のあるコード
改行や字下げの仕方違ったり、同じような処理なのに全く違う実装がされているコードは読みづらい
若干前の内容と被るが「意味」の大きさが不均一だったり、捉え方が場所によって違う
という風に考える事も出来るだろう

同じようなコードが一貫して同じ書き方をしているのであれば、
意味を類推して読み飛ばせるため、結果的に読みやすい

# 「意味」とは何なのか
ここで言う「意味」は、単に「この処理は何をするか」というような機能的説明ではない
もっと広い文脈で、そのコードがどういう意図を持って、どういう位置づけでそこにあるかという話だ

変数の初期化、ループ、条件分岐といった処理単位は、見た目は明確でも、どのような目的でそこにあるのか、
前後の流れと、どう関係しているのかが明確でなければ、その「意味」は読み取りにくい

# 最後に
この記事では、私なりに「読みやすいコードとは何か」について考えてきた
端的に言えば、「斜め読みがしやすいコード」であり、そのためにはコードが適切に区切られ、
「意味」単位で整理されている必要がある

またここでいう「意味」とは処理の内容そのものではなく、文脈の中での役割や位置づけのことだ
意味の塊が見えるからこそ、他人が斜め読みをしても違和感なく、理解出来る
読みやすいコードとはこのようなものだと思う

当然、何をもって「意味」とするか、この粒度や捉え方は人によって違う
だからこそ、自分の書くコードがどんな意味や構造を持っているかを、まずは自分自身が意識しておく必要がある

この記事が誰かにとって、自分のコードの「意味」について考えるきっかけになってくれれば幸いです
Amazon API Gatewayで詰まったこと

リソースの階層を意識したエンドポイントのURLでfetchしないといけなかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004096/b551d9ec-8305-49ce-b367-8dbca3805f3c.png)


エンドポイントにリソース作成時のリソース名を入れないといけなかった
ALV 検索ヘルプ

```

DATA: gr_alv_grid TYPE REF TO cl_gui_alv_grid,
      gr_f4_handler TYPE REF TO lcl_f4_handler.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  IMPORTING
    e_grid = gr_alv_grid.

IF gr_alv_grid IS BOUND.
  gr_alv_grid->register_f4_for_field(
    EXPORTING
      i_fieldname = 'MATNR'
      i_register  = abap_true ).

  CREATE OBJECT gr_f4_handler.
  SET HANDLER gr_f4_handler->on_f4 FOR gr_alv_grid.
ENDIF.

```
```
DATA: gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat TYPE lvc_s_fcat,
      gt_data     TYPE STANDARD TABLE OF your_structure,
      gs_layout   TYPE lvc_s_layo.

* 示例：设置字段 F4 可用
gs_fieldcat-fieldname   = 'MATNR'.
gs_fieldcat-ref_field   = 'MATNR'.
gs_fieldcat-ref_table   = 'MARA'.
gs_fieldcat-f4availabl  = 'X'.
APPEND gs_fieldcat TO gt_fieldcat.

gs_layout-cwidth_opt = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program       = sy-repid
    i_callback_user_command  = 'USER_COMMAND'
    is_layout_lvc            = gs_layout
    it_fieldcat_lvc          = gt_fieldcat
    i_structure_name         = 'YOUR_STRUCTURE'
  TABLES
    t_outtab                 = gt_data
  EXCEPTIONS
    program_error            = 1
    OTHERS                   = 2.
```

```
CLASS lcl_f4_handler DEFINITION.
  PUBLIC SECTION.
    INTERFACES: if_alv_event_f4.
ENDCLASS.

CLASS lcl_f4_handler IMPLEMENTATION.

  METHOD if_alv_event_f4~on_f4.

    DATA: lt_return TYPE STANDARD TABLE OF ddshretval,
          ls_return TYPE ddshretval,
          lt_values TYPE TABLE OF ty_value,
          lv_value  TYPE string.

    SELECT matnr maktx INTO TABLE lt_values FROM mara INNER JOIN makt ON mara~matnr = makt~matnr UP TO 100 ROWS.

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield    = 'MATNR'
        value_org   = 'S'
      TABLES
        value_tab   = lt_values
        return_tab  = lt_return.

    READ TABLE lt_return INTO ls_return INDEX 1.
    IF sy-subrc = 0.
      e_fieldvalue = ls_return-fieldval.
      e_display = abap_true.
    ENDIF.

    e_exit = abap_true.

  ENDMETHOD.

ENDCLASS.

```
「一級建築士【構造力学】トラスの解き方」様を参考にsympyのTrussでやってみた。


**パイソニスタの方へ**
・Truss使用の重複かも。作図に実数が必要です。作図(L=1)を最終行へ移動可と言う事です。
  Truss クラス?のシンボル変数に,作図のために、実数を代入可能ですか。 
  **いい方法がありますか？**
(別件)
pythonのユーザー定義関数「(Truusのmethod?の追加)t.myAdd_member　の名称でコールする方法」をAI先生ヘ。
https://qiita.com/mrrclb48z/items/9ce6c8dfcf5e6f62d267

・sympyのTrussで作図しました。

# オリジナル
Youtube でめまる構造様　
**途中から(実際の試験問題)一級建築士【構造力学】トラスの解き方 (11:45〜15:35)**
https://youtu.be/kk4r6rtDdG4?t=705
＜フル 一級建築士【構造力学】トラスの解き方 (0:00〜15:35)
https://youtu.be/kk4r6rtDdG4

# sympyで(オリジナル 様を参考にいつもの方法で)
・勉強中です。①接点法 ②図解法 ③切断法

# sympyのTrussで
#### ver1.1  
・長さLに　positveが必要です。無いとsqrt(L＊＊2)がでます。
```python
# ver1.1
from sympy.physics.continuum_mechanics.truss import Truss
from sympy import *
var('P')
var('L',positive=True)
def myTruss(L):
    def myAdd_member(*args):
        def make_triples(s):
            return (s,s[0],s[1])
        for s in args:
            t.add_member(make_triples(s))      
    t = Truss()
    t.add_node     (          ('A',L*1,L),('B',L*2,L),('S',L*3,L)) 
    t.add_node     (('F',0,0),('D',L*1,0),('C',L*2,0),('E',L*3,0),('T',L*4,0)) 
    myAdd_member   (     'AB','BS')  
    myAdd_member   ('AF','AD','AC','BC','SC','SE','ST')  
    myAdd_member   ('FD','DC','CE','ET')  
    t.apply_support(('D' ,'pinned'),('E','roller'))
    t.apply_load   (('F',P,270),('A',P,270),('B',P,270),('S',P,270),('T',P,270))
    return t
# --------------------------------------------------------------------------------------------
myTruss(1).draw().show()             # 作図(L=1)、最終行に移動可。本行をコメント可。
t=myTruss(L);t.solve()               # 計算のみ
print('#',t.reaction_loads ['R_D_y'])           
print('#',t.reaction_loads ['R_E_y'])           
print('#',t.internal_forces['AB'])           
# # --------------------------------------------------------------------------------------------
# 5*P/2
# 5*P/2
# P/2
```
・縦横比は1:1では、ありません。

![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/7d0c2c35-65d6-4e28-95d3-bd667e60fc99.png)

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
#### Qiita内

https://qiita.com/mrrclb48z/items/b49395a9a0b358c9d604
【Go】pq: database "xxx" does not existにハマった話

## はじめに

Cloud Run Jobsから、Cloud SQLへの接続確認をしていました。

正しいデータベースを指定しているはずでしたが、何度やっても、以下のエラーが発生します。

```sh
pq: database "xxx" does not exist
```

なぜでしょうか？

## 原因

データベース名の末尾に、空白が入っていたことが原因でした。

同じ経験をしたことがある人も多いのではないでしょうか？

## 解決

デフォルトのデータベース（`postgres`）には接続できたので、データベース名の一覧を出力し、データベース名と、接続したいデータベース名が合っているか、それぞれのデータベース名の文字数を出力してみました。

```go
func OpenDB(cfg *config.Config) (*sql.DB, error) {
	u := &url.URL{
		Scheme: "postgres",
		User:   url.UserPassword(os.Getenv("PG_USER"), os.Getenv("PG_PASSWORD")),
		Host:   fmt.Sprintf("%s:%s", os.Getenv("PG_HOST"), os.Getenv("PG_PORT")),
		Path:   "postgres",
	}

	db, err := sql.Open("postgres", u.String())
	if err != nil {
		return nil, err
	}

	fmt.Println(u.String())
	if err := db.Ping(); err != nil {
		return nil, err
	}
	// pg_database からテンプレートDBを除いた一覧を取得
	rows, err := db.Query(`
        SELECT datname
          FROM pg_database
         WHERE datistemplate = false
        ORDER BY datname;
    `)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	for rows.Next() {
		var dbname string
		if err := rows.Scan(&dbname); err != nil {
			return nil, err
		}
		fmt.Println(dbname)
		fmt.Println(dbname, dbname == "subsidiary-book-sales-prod", len(dbname), len("your-db-name"))
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	fmt.Println("DB接続に成功しました。")

	return db, nil
}
```

すると、取得したデータベース名が、本来のデータベース名よりも一文字多く、空白が含まれていることがわかりました。

## 最後に

蓋を開けてみると、単純なヒューマンエラーでしたが、いざエラーに遭遇してみると、頭が混乱してしまいます。

この記事が、同じような問題に遭遇した人の助けになれば幸いです。
Pythonで画像からテキストを抽出する方法

紙の書類をスキャンした画像やスクリーンショットからテキストを取り出したいときに活用できるのがOCR（光学文字認識）です。Pythonでは、**Spire.OCR for Python** を使うことで、画像からテキストを簡単に抽出できます。

本記事では、Pythonで画像からテキストを読み取る基本的な方法から、テキストブロックの位置取得、フォルダ内の複数画像の一括処理までを解説します。

---

## 使用ライブラリについて

本記事では [Spire.OCR for Python](https://www.e-iceblue.com/Introduce/ocr-for-python.html) を使用します。OCR処理には別途**OCRモデルファイルのダウンロード**が必要です。

### インストール方法

```bash
pip install spire.ocr
````

### モデルファイルのダウンロード（必須）

Spire.OCRでは事前学習済みのモデルを使用します。以下から使用OSに応じたモデルをダウンロードし、任意のフォルダに展開してください：

* Windows（64bit）：[win-x64.zip](https://www.e-iceblue.com/resource/2.0.1/win-x64.zip)
* Linux： [linux.zip](https://www.e-iceblue.com/resource/2.0.1/linux.zip)
* macOS： [mac.zip](https://www.e-iceblue.com/resource/2.0.1/mac.zip)

---

## ステップ別ガイド：画像からテキストを抽出する

### ステップ1：OCRスキャナーの初期化とモデルの設定

```python
from spire.ocr import *

scanner = OcrScanner()

options = ConfigureOptions()
options.ModelPath = r'D:\OCR\win-x64'  # 展開したモデルフォルダへのパス
options.Language = 'English'           # 対応言語（日本語は今後対応予定）
scanner.ConfigureDependencies(options)
```

---

### ステップ2：画像からテキストを抽出し、ファイルに保存

```python
scanner.Scan(r'Sample.png')  # 処理対象の画像パス
text = scanner.Text.ToString()

# 抽出されたテキストをファイルに保存
with open('output.txt', 'a', encoding='utf-8') as file:
    file.write(text + '\n')
```

---

### ステップ3：テキストブロックの内容と位置情報を取得

```python
text = scanner.Text

block_text = ""
for block in text.Blocks:
    rect = block.Box
    info = f'{block.Text} -> x: {rect.X}, y: {rect.Y}, w: {rect.Width}, h: {rect.Height}'
    block_text += info + '\n'

with open('output.txt', 'a', encoding='utf-8') as file:
    file.write(block_text + '\n')
```

**ポイント：**
テキストの内容だけでなく、画面上の位置（x, y, 幅、高さ）も取得できるため、画像中のレイアウト保持や構造化処理にも活用できます。

警告を削除するには、`split("Evaluation")[0]` を使用してください。

---

### ステップ4：フォルダ内の複数画像から一括で抽出

```python
import os
from spire.ocr import *

def extract_text_from_folder(folder_path, model_path):
    scanner = OcrScanner()
    config = ConfigureOptions()
    config.ModelPath = model_path
    config.Language = 'English'
    scanner.ConfigureDependencies(config)

    for filename in os.listdir(folder_path):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            image_path = os.path.join(folder_path, filename)
            scanner.Scan(image_path)
            text = scanner.Text.ToString()

            output_file = os.path.splitext(filename)[0] + '_output.txt'
            with open(output_file, 'w', encoding='utf-8') as f:
                f.write(text)

# 使用例
extract_text_from_folder(r'D:\images', r'D:\OCR\win-x64')
```

---

## まとめ

Spire.OCR for Python を使うことで、Pythonから簡単にOCR機能を活用できるようになります。この記事では以下のような活用例を紹介しました：

* 単一画像からのテキスト抽出
* テキストブロックと位置情報の取得
* フォルダ内画像の一括読み取り

大規模な文書デジタル化やスクリーンショットの自動解析など、幅広い自動化処理に応用できます。

---

## 関連リンク

* [Spire.OCR チュートリアル一覧](https://www.e-iceblue.com/Tutorials/Python/Spire.OCR-for-Python/Program-Guide/Spire.OCR-for-Python-Program-Guide-Content.html)
* [無料の一時ライセンスを申請する](https://www.e-iceblue.com/TemLicense.html)
PythonのCPassword復号ツール

# 主な機能
- Group Policy Preferences (GPP) に含まれる cpassword を復号
- Microsoftが仕様で公開している既知のAESキーを用いて復号処理
- Base64デコード → AES-CBC復号 → UTF-16LE文字列として出力
- 不正なPKCS#7パディングや文字化けにも対応したエラーハンドリング

# 前提条件
- Python 3.6+
- `pycryptodome` ライブラリのインストール

# 使用例
```bash
$ python CPDecrypt.py
CPASSWORD:
> Ohae/KyxnLuvdCQXUtAl+epa8/oo0AWvB2OtcQwYkFw=
[+] DECRYPTED PASSWORD:
P@ssw0rd123
```

# 補足
- 復号キーはマイクロソフトが[公式に公開している固定キー](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-gppref/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be)を使用

# GitHub
https://github.com/sup0gari/CTF_TOOLS/blob/main/cpdecrypt.py
約数の個数 と 平方根

paizaの「整数Nの約数の個数を数える問題」に挑戦！

最初は「とりあえず1からNまで地道に調べればいいじゃん！」って感じだったけど…。

やってみると、Nが大きくなるとめちゃくちゃ時間かかる！

そこで、問題を整理しつつ賢い解き方を発見したので、まとめた！

<br>

## 問題概要

- 整数 N が与えられる。
- Nの約数の個数を出力せよ。

<br>

入力例：

    10

出力例：

    4

<br>

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__divsor_count

<br><br><br>

## ✅ OK例：
```js
const rl = require('readline').createInterface({ input: process.stdin });

let N;
rl.on('line', (input) => {
  N = Number(input);
});

rl.on('close', () => {
  let count = 0;
  for (let i = 1; i <= N; i++) {
    if (N % i === 0) {
      count++;
    }
  }
  console.log(count);
});
```
→これでもいいけど、Nが大きくなると計算量がすごいことに…。

<br><br><br><br>

## 💡計算量を減らすには？

一旦整理して考えてみる。


### 🎯 目標

N の約数の個数を数える。

<br>

### 🔎 基本の方法

- 1 から N までの整数を調べて
- N を割り切れるものがあれば、それは約数。
- 全部数えればOK！

でも、N が大きいと時間がかかる。
だから効率化する方法が

「平方根まで調べる」という考え方。

<br><br>

### 💡 なぜ平方根まででいい？

約数はペアで出てくるから！

例えば 10 の約数：

- 1 と 10
- 2 と 5
- 3…（残りはない）

小さい方の約数は 1, 2, 3… と並んでいて
大きい方の約数は「10 ÷ 小さい約数」で求められる。

<br>

例えば：

- 小さい方 2 → 大きい方 10÷2=5

大きい方と小さい方がペア。
小さい方を見つければ、大きい方も自然にわかる！

<br>

つまり、小さい方を調べていって、

「大きい方が小さい方と同じくらいになるところまで」

で十分。

それが 「平方根」🚀

<br>

✔️ 例：10 の場合

1 → 10 ÷ 1 = 10

2 → 10 ÷ 2 = 5

3 → 10 ÷ 3 ≈ 3.33（もう同じくらい）

4 → 10 ÷ 4 = 2.5（大きい方が小さい方より小さい）
　→ ここから先は「すでに出てきたペアの逆側」なので無視！

 <br><br>
 
### ✏️ ポイント

- 平方根まで調べれば、約数ペアがすべて見つかる。
- 計算時間がぐっと短くなる（N=100万でも √100万=1000 までで済む）。

<br><Br>

### ✅ OK例：
```js
const rl = require('readline').createInterface({ input: process.stdin });

rl.on('line', (line) => {
  const N = Number(line);
  let count = 0;

  for (let i = 1; i <= Math.sqrt(N); i++) {
    if (N % i === 0) {
      // 例えば 2×5=10 のようにペアを見つける
      // ペアが同じ（例：6×6=36）なら1回、違えば2回数える
      count += (i === N / i) ? 1 : 2;
    }
  }

  console.log(count);
});
```

<br><br>

## 🌟 まとめ

✅ 1〜Nまで調べるより、平方根までで済む
✅ 「小さい方×大きい方= N」という約数ペアを意識する
✅ これでとっても効率的に約数を数えられる！


<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/13/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e7%b4%84%e6%95%b0%e3%81%ae%e5%80%8b%e6%95%b0/)
第四話　憲法の神樹



---


> 森の中心には、ひときわ大きくそびえる神樹がございます。
それが「憲法」の神樹であり、他の法の木々を根から支え、全体の輪郭を形づくっております。

民法が「人と人」の関係を整える法だとすれば、
憲法は「人と国家」の距離を定める法です。

本記事では、この根幹を担う神樹に焦点を当て、
法体系全体の“土台”となる思想と構造について、少し立ち止まって考えてまいります。





---

🌳シリーズ第４話「憲法の神樹」

🏛 1. 憲法とは何か――法の「根」としての役割

私たちは、日々さまざまなルールに囲まれて暮らしています。
そのなかでも「憲法」は、他のあらゆる法律の“土台”となるものです。

民法や刑法などの法律が、人と人との間の関係や行動を定めているのに対し、
憲法は、「国家そのものの形」と「国家と人との関係」を定める法であり、
その性質から「最高法規」と呼ばれています。

それはまるで、深く広く地中に根を張り、
他の神樹（＝各法律のモデル）を支えている、大樹のような存在です。


---

⚖️ 2. 憲法の３つの柱

憲法の中核には、主に次の３つの原則がございます。

国民主権：最終的な決定権は、国家ではなく国民にあること

基本的人権の尊重：生まれながらに持つ権利は、最大限尊重されること

平和主義：国家の力を戦争ではなく、平和の維持に向けること


これらは単なるスローガンではなく、具体的な制度や条文の背後で、
全体のバランスを取り、他の法律の「在り方」そのものに影響を与える要素です。

たとえば、民法における契約自由の原則や、刑法における刑罰の適正手続なども、
憲法が保障する「自由」や「公正」なしには成立しえないものです。


---

🌿 3. 神樹としての憲法――森の中心に立つ理由

本シリーズでは、法体系を“森”に見立てておりますが、
その中心に静かにそびえるのが「憲法の神樹」です。

この神樹は他の法木と直接は絡み合わずとも、
根から全体を支え、森全体の「空気」や「光の射し方」すら左右します。

それは、個別のルールの先にある「価値観」や「願い」のようなもの。
社会がどのような形であってほしいのか――
その“憲法的意思”が、他の神樹に静かに語りかけ続けているのです。


---

📜 4. ツタが憲法と他法域をつなぐとき

次回以降で扱う「ツタ＝AI関連法」では、まさに憲法的な価値観が問われる場面が増えてまいります。

たとえば、AIによって監視や判断が自動化されたとき、
私たちの「プライバシー」や「人格の尊重」は、どのように守られるべきか。

国家が技術を用いて何かを決める際、それは民主的といえるのか。
――そうした問いは、すべて「憲法的な問い」でもあるのです。

ツタは、神樹同士の間を結ぶ媒介です。
とりわけ、憲法の神樹から伸びるツタのあり方は、私たちの未来そのものに関わってくるでしょう。


---

🌿 次回予告

次回からは、法の森に根を張る他の神樹たち――
**「刑法」「行政法」「手続法」**に順番に触れてまいります。

それぞれの法が、いかにして社会の秩序や正義、個人の自由を支え、
そしてAI時代においてどのような再解釈を迫られているのか。
法の神樹たちの声を、どうぞ耳を澄ませてお聞きください。



---

🗓 最後に（連載について）

本シリーズは、今後週末に１話ずつ公開してまいります。
金曜夜・土曜朝・日曜夕方のいずれかの時間帯を予定しております。
お時間のあるときに、森の中を散歩するような気持ちで、ぜひお付き合いくださいませ。


---
CertsTimeによるLinux Foundation CKA試験問題

Linux Foundation CKA試験に合格するためには、ただ一生懸命勉強するだけではなく、賢く学ぶことが重要です。
CertsTimeが提供する専門的に設計されたLinux Foundation CKA試験の練習問題は、実際の試験さながらの体験を提供し、CKA認定試験の主要なトピックを確実に習得するのに役立ちます。
私たちのダンプ問題集は、あなたの弱点を明らかにし、的を絞った復習と迅速な上達を可能にします。
95,000人以上の受験者を合格へ導いてきた実績を持つCertsTimeは、認定取得への信頼できるパートナーです。
ただ努力するのではなく、CertsTimeと一緒に「賢く学んで」、あなたの未来を切り拓く認定を手に入れましょう。

購入前にお試しください – 無料サンプル問題付き：www.certstime.com/cheat-sheet-cka-dumps
生成AIでできるブログ解析

Geminiというgoogleの生成AI

Deep researchやCanvasモードを使うと、インターネット上の情報を収集した上で分析をしてくれたり、きれいに見やすい状態でアウトプットしてくれる

これがすごいという記事です




使ってみようとしt
インターネット上のコンテンツでデータ解析に使える豊富なソースといえば...
それは鹿目凛さんのブログで間違いないでしょう

https://ameblo.jp/pero0921/



この何年にもわたり投稿されてきた記事は、非常に膨大なデータでありながら、我々はなんとすべて読んでいて内容を理解している

生成AIを試して、成果物のクオリティーもチェックできるので、またとない題材です

特別インストールするものもないのでぜひやってみてください

Geminiのリンク
https://gemini.google.com/app

指示を入力できる
![IMG_0927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/07e19070-213e-455a-8e9d-9a7d4a55fd47.png)
ブログから分析するように指示を出すと...


![IMG_0928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/255b0ff5-de08-44ea-8504-b19384828611.png)

![IMG_0929.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/e9ae3f64-61de-4431-ba4a-0fb672ea47e8.png)

![IMG_0929.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/8f266b1a-4a95-4835-9048-10e877a98569.png)

解析の方向性やかかる時間について確認されるので、
リサーチを開始ボタンを押す


![IMG_0930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/f7257fae-9fa3-46a7-afac-fbc5b38e1958.png)

![IMG_0931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/1ce0da78-aedf-4a04-8dd2-1fa3dbbdc848.png)


この時点で読み応えのあるレポートが出来上がっている

ここまででもすごいですが、ここからもっとすごいです

右上の作成を押すと
![IMG_0932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/ce507353-6055-408a-9c5d-f80311bfecac.png)

ウェブページを作ってくれたり
![IMG_0933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/c0f1085a-382e-422a-b93d-594600d9fe2b.png)


めっちゃ分析してくれたり
![IMG_0934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/371283fb-f4c7-4e20-8bf9-a03813b31ba1.png)


![IMG_0936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/aaf77b0d-ac50-4d67-a314-0e46537343d6.png)

![IMG_0935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/f1e7770c-a30b-4b5b-b0c9-f1f6a27a12e6.png)
めっちゃすごそう
持続可能なのでSDGs


クイズを作ることもできる
https://g.co/gemini/share/8b8faf315c8c

![IMG_0925.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/d20f6921-2c8a-4107-8d70-85c96b6e0a2b.png)

![IMG_0926.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086849/d7c57355-4bbf-428a-b96c-cf242ad50813.jpeg)

これが結構むずかしい

と、まぁ、インターネット上の情報を集めて、簡単にさまざまな形へアウトプットできる

すごい時代になったものだ

でも、俺の方がぺろりんのこと詳しいけどな
と思いながらこの記事を書きました
自分の仕事に集中するためのツール―値オブジェクト―

こんにちは。
<br>
数ある記事の中から、当記事に目を通していただき、ありがとうございます。
<br><br>
今回は、私がシステムの新規開発をするうえで取り入れるようになった設計手法、
「ドメイン駆動設計」の画期的なツール、値オブジェクトの魅力をお話しします。


# ドメイン駆動設計（DDD）の本質とは？
突然ですが、ドメイン駆動設計（DDD）の本質ってなんでしょうか？

色々な難しい説明がありますが、シンプルに表現すると、
「役割を明確にして、それぞれが本当にやるべきことに集中できる仕組み」
だと私は思っています。
<br>
これを身体で例えるとすごく分かりやすいです。
<br><br>
手は、手の役割に徹する。
爪は、爪を役割に徹する。
<br>
手が爪の仕事までしなくて良いし、爪も手の仕事をする必要がない。
そうやって、自分の本分を徹底することこそがDDDというわけです。

# 値オブジェクトという便利な道具
この役割を明確にするための強力な道具が、値オブジェクトです。

値オブジェクトを栄養に例えてみます。
<br><br>
爪を生成する細胞は、主にアミノ酸とミネラルの特定の栄養素だけを受け取ります。
<br>
余計な栄養素が混ざると、
爪を作る細胞は毎回「これ使える？」と確認が必要になりますよね。

しかし、必要な栄養素しか来ないならその確認は不要。
爪を作ることに集中できるわけです。
<br>
つまり値オブジェクトを使うと、各パーツが自分の役割に集中できます。

# 値オブジェクトの特徴
値オブジェクトの特徴は2つです。

- 状態が変化しない（不変性）
- 値の等価性（内容が同じなら同じオブジェクト扱い）

つまり、あらかじめ決められた安全なデータしか存在しない仕組みなんですね。


具体的にJavaのコードに落とし込んでみます。
```java
import lombok.Value;
import lombok.NonNull;
import java.util.Set;

@Value
public class AminoAcid {
    @NonNull String name;
    public AminoAcid(String name) {
        if (name.isBlank()) {
            throw new IllegalArgumentException("アミノ酸名は空にできません。");
        }
        this.name = name;
    }
}

@Value
public class Mineral {
    /** 必要なミネラル */
    private static final Set<String> VALID_MINERALS = Set.of("カルシウム", "亜鉛", "鉄");
    @NonNull String type;
    public Mineral(String type) {
        if (type.isBlank()) {
            throw new IllegalArgumentException("ミネラルの種類は空にできません。");
        }
        if (!VALID_MINERALS.contains(type)) {
            throw new IllegalArgumentException("無効なミネラルの種類です。使用可能なミネラルは: " + VALID_MINERALS);
        }
        this.type = type;
    }
}

@Value
public class Nail {
    @NonNull AminoAcid aminoAcid;
    @NonNull Mineral mineral;
    public void grow() {
        System.out.println("爪を生成します: " + aminoAcid.getName() + ", " + mineral.getType());
    }
}
```

爪クラス（Nail）は受け取った栄養（値オブジェクト）が正しいものだと分かっているので、
例えば`grow()`を使うときに余計な確認は必要ありません。

# 値オブジェクトを使うべき場面
値オブジェクトを使うべき場面は以下の通りです。
- 変更が発生しないデータ
- 条件が明確で固定的なデータ
- 複数箇所で同じ内容が必要なデータ

こういった場面で値オブジェクトを導入すると、
コードが簡潔になり、バグも減って保守性が高まります。

(つまりほぼすべての項目です)

# 最後に
DDDの本質は、「役割分担を明確にして本質的な仕事に集中する」こと。
値オブジェクトは、その仕組みを作る強力な味方です。 

個人的には、DDD以外でも導入したら保守性が上がり、
システムの理解も進めやすい素晴らしいツールになるのではと感じています。

読んでいただき、ありがとうございました！
ゲノム関連データベースメモ

## 🧬 ゲノム関連データベースまとめ

### 1. INSDC三大機関（塩基配列データベース）

| 地域 | 機関 | 略称 | 主なID |
|------|------|------|--------|
| 日本 | DDBJ | DDBJ | DRA, DRR, DRX, DRS |
| アメリカ | NCBI | GenBank / SRA | SRA, SRR, SRX, SRS |
| ヨーロッパ | EBI | ENA | ERA, ERR, ERX, ERS |

※ INSDC（International Nucleotide Sequence Database Collaboration）により、3機関はデータを相互共有している。

---

### 2. 遺伝子発現・エピゲノム・メタゲノム系

| データベース | 内容 | 管理機関 |
|--------------|------|----------|
| GEO | 遺伝子発現（RNA-seq, マイクロアレイ） | NCBI |
| ArrayExpress | GEOのヨーロッパ版 | EBI |
| ENCODE | エピゲノム、転写因子結合など | 米国NIH |
| TCGA | がんゲノム・トランスクリプトーム | 米国NCI |
| MG-RAST | メタゲノム解析 | 米国Argonne国立研究所 |
| GISAID | ウイルス（インフルエンザ、SARS-CoV-2） | 国際共同運営 |

---

### 3. ゲノムアノテーション・参照ゲノム

| データベース | 内容 | 備考 |
|--------------|------|------|
| UCSC Genome Browser | ゲノムブラウザ | ヒト・マウスなど多種対応 |
| Ensembl | ゲノムアノテーション | EBI主導 |
| RefSeq | 標準的な遺伝子・タンパク質配列 | NCBI |

---

### 4. タンパク質・機能・パスウェイ系

| データベース | 内容 |
|--------------|------|
| UniProt | タンパク質配列・機能 |
| KEGG | パスウェイ、代謝経路、疾患情報 |
| Reactome | 生物学的経路（ヒト中心） |

---

### 5. 使い分けの目安

- 配列を探す → DDBJ / NCBI / ENA
- 発現データを探す → GEO / ArrayExpress
- ゲノム構造を見たい → UCSC / Ensembl
- タンパク質や機能を調べたい → UniProt / KEGG
Vulkanoで書いたアプリケーションのVRAM消費量が多すぎる場合の対応

## 環境
- Vulkano 0.35.1

## 原因
Vulkanoの`StandardMemoryAllocator::new_default()`を使用してMemoryAllocatorを作成すると、1GiB以上のメモリヒープ1つにつき256MiB、そうでない場合は64MiBが初期化時に確保される。[^1]

## 対処
`StandardMemoryAllocator::new_default()`を使用せず、`StandardMemoryAllocator::new()`を使用してメモリを確保する

## 例
```rust
// This codeblock is based on Vulkano Standard memory allocator (https://docs.rs/vulkano/0.35.1/src/vulkano/memory/allocator/mod.rs.html#857).
// Copyright (c) 2016 The Vulkano Developers
// See: https://github.com/vulkano-rs/vulkano/blob/master/LICENSE-MIT

type StandardLiteMemoryAllocator = GenericMemoryAllocator<FreeListAllocator>;

trait StandardLiteMemoryAllocatorExt {
    /// Creates a new `StandardLiteMemoryAllocator` with default configuration.
    fn new_default_lite(device: Arc<Device>) -> Self;
}

impl StandardLiteMemoryAllocatorExt for StandardLiteMemoryAllocator {
    /// Creates a new `StandardMemoryAllocator` with default configuration.
    fn new_default_lite(device: Arc<Device>) -> Self {
        let MemoryProperties {
            memory_types,
            memory_heaps,
            ..
        } = device.physical_device().memory_properties();

        let mut block_sizes = vec![0; memory_types.len()];
        let mut memory_type_bits = u32::MAX;

        for (index, memory_type) in memory_types.iter().enumerate() {
            const LARGE_HEAP_THRESHOLD: DeviceSize = 1024 * 1024 * 1024;

            let heap_size = memory_heaps[memory_type.heap_index as usize].size;

            block_sizes[index] = if heap_size >= LARGE_HEAP_THRESHOLD {
                // ヒープが大きい場合 初期ブロックサイズ 4MiB
                4 * 1024 * 1024
            } else {
                // ヒープが小さい場合 初期ブロックサイズ 2MiB
                2 * 1024 * 1024
            };

            if memory_type.property_flags.intersects(
                MemoryPropertyFlags::LAZILY_ALLOCATED
                    | MemoryPropertyFlags::PROTECTED
                    | MemoryPropertyFlags::DEVICE_COHERENT
                    | MemoryPropertyFlags::RDMA_CAPABLE,
            ) {
                // VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872
                // VUID-vkAllocateMemory-deviceCoherentMemory-02790
                // Lazily allocated memory would just cause problems for suballocation in general.
                memory_type_bits &= !(1 << index);
            }
        }

        let create_info = GenericMemoryAllocatorCreateInfo {
            block_sizes: &block_sizes,
            memory_type_bits,
            ..Default::default()
        };

        Self::new(device, create_info)
    }
}

```

## 注意点
結局大量のVRAMを確保するようなアプリケーションを書く場合、ブロックサイズが小さすぎるとパフォーマンスが落ちる場合がある

[^1]: https://docs.rs/vulkano/0.35.1/src/vulkano/memory/allocator/mod.rs.html#873-877
【学び直し】Node.js・npm・package.jsonの関係とは？

Webアプリ開発を学び始めたが何度も、
「Node.jsって何？npmって必要？package.jsonって何を書けばいいの？」
といった曖昧さを解消したので残しておきたいと思います。

今回は、Node.js・npm・JavaScript・package.jsonの関係性と役割を、具体例を交えてやさしく解説します。
### 💡 Node.jsとは？
**・JavaScriptをサーバーサイドでも動かせるようにした実行環境**
従来のJSはブラウザだけで動いていたが、Node.js で「サーバー側の処理」も書けるようになり、サーバーアプリ、API、ファイル操作、DB接続など、バックエンドの多くがJSで可能に。
### 💡npmとは？
**・Node.js のライブラリ管理ツール（Node Package Manager）**
世界中の人が作ったパッケージ（＝ライブラリ）を簡単にインストールできる

例えば：

・ `express` → サーバー構築
・ `axios` → HTTP通信
・ `mongoose` → MongoDB操作

### 💡 package.jsonとは？
**・プロジェクトの設定ファイル**

以下のような内容が記録される：

・使用しているライブラリ一覧（dependencies）
・プロジェクト名・バージョン
・起動スクリプト（npm start など）

→ 他の人がこのファイルを見れば、`npm install`で同じ環境を再現できる！

### 💡Webアプリ制作例
実際にこれらを使った制作例をご紹介します。

**使用技術：**
 ・フロント：HTML / CSS / JavaScript
 ・サーバー：Node.js（+ Express）
 ・管理：npm / package.json

**フォルダ構成：**
```
todo-app/
　├── app.js　　　　　 　← Node.jsサーバー
　├── package.json　　　← 設定ファイル
　└── /public　　　　　　← フロントのファイル
  　  　　　　├── index.html
    　　　　　├── style.css
    　　     └── script.js
```
**機能概要：**
・サーバーはNode.jsで構築し、API（GET/POST/DELETE）で通信
・npmでexpressを導入してルーティング処理を楽にしている


### ✅️まとめ
まずはシンプルにまとめると、
**JavaScriptでWebアプリを作りたいとき、Node.jsを使えばサーバーサイドもJavaScriptで書ける。
更にnpmを使えば便利なライブラリを追加できて、それらの管理はpackage.jsonに記録される。**

```
JavaScript
    ↓（サーバーサイドで動かしたい）
Node.js
    ↓（便利なライブラリを使いたい）
npm
    ↓（ライブラリや設定を管理する）
package.json
```
Webアプリ開発では、フロントだけでなくサーバーやデータ管理も重要です。この関係が理解できると、ReactやNext.js、Vueなどのモダンなフレームワークにもスムーズに入っていけます。
初めてのWebアプリ制作は不安も多いですが、JavaScriptだけで完結できるNode.js環境は、初心者にも優しく、将来の拡張性もバツグンです。
色々と試して技術を増やしていきましょう！
ニコニコ動画 オーディオ576kbpsエンコードを簡単にしてみる

ニコニコ動画で3月からオーディオ576kbps高音質配信がプレミアム会員向けに
行われています

![nico576.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/7b58ea4e-fccc-4e89-b32f-bfb1d2054dd3.png)

## 動画無劣化ffmpegコマンドラインで一発でエンコードできる
```
ffmpeg  -i video.mp4 -i audio.flac -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 576k -movflags +faststart output.mp4
```

このコマンドラインですと、動画内の音声はすべて消えます

動画はコピーしか行わないので、動画のビットレート等はこの前に設定して下さい


## サンプル
https://www.nicovideo.jp/watch/sm45080724

もともと24bit192khzハイレゾ制作です

## 面倒な方は
ココナラに案件を出していますので、是非ご利用下さい
https://coconala.com/services/3748365

詳しい仕様についてもココナラに書いてあります
実機を使ってNWを学習しよう

皆様お久しぶりです。
前回(2024年9月)にCCNAを取得した記事を投稿して以来の投稿となります。

現在私はネットワークの知識と技術を研鑽するためにCCNPの学習を行っています。
また、実機に触れる機会が少ないなと感じたため今年CiscoのL2SwitchとRouterを購入し自宅でネットワークの設定などを行っています。

今回はL2SwitchとRouterでの初期設定について記載していこうと思います。

# 準備したもの
まず初めに準備したものを記載します。
* ラック(以前amazonで木目調のプラスチック素材のラックを購入していたので代用)
※流石にSwitchとRouterを床に直で置くわけにもいかないので。
* L2Switch(Csico製のWS-C2960+24TC-S)
* Router(Csico製のCisco2901)
※中古で購入し2台で合計13200円(税込み)でした。
* PC(OS):Windows11
* コンソールケーブル(無いと初期設定できません)
* 光ケーブル(いわゆるLANケーブル)：Cat6A推奨
※LANケーブルは最低2本は購入しておきましょう。
* 延長コード(SwitchとRouterだけでも2つのコンセントを使用するので延長コードを準備しましょう)

# 環境
上記の通り環境を整えました。
※現在はエンドポイントがPC一台しかないため、サーバーを購入し設定をしている最中です。

# 最初に設定すること
SwitchとRouterの初期設定(ホスト名設定、ログイン時のパスワード設定、使用するインターフェースにIPアドレスとサブネット設定、ポート開放)をしていきます。

さぁまずPCとSwitchの電源を投入しコンソールケーブルで接続して設定するぞ！といきたいところですが、
接続しても何もできません。
まず初めにやることとして、コンソールケーブルを使用できるようにドライバーをインストールします。
※購入するコンソールケーブルによる可能性があるため全てのコンソールケーブルに当てはまるかどうかはわかりませんが、AIを駆使して調べたところほとんどはドライバーをインストールする必要があるそうです。

ドライバーをインストールしたら、続いて実施するのはTeratermのインストールです。
インストール済みの方は実施不要ですが、PCからネットワーク機器に何かしらの形式でログインする際必ず使用するのはTeratermなどのいわゆるコンソールツールです。
Teratermをインストールし使用できるようにしましょう。

いよいよPCからコンソールポート経由でネットワーク機器にログインします。
ログインすると以下のように表示されました。
![Switch画像1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742179/94b09447-9903-4940-9f38-6154e9ed4cae.jpeg)

L2Switchに初めて接続した際に表示された画面です。
まず初めに基本的な設定をするか聞かれるため「yes」と回答します。
画像の「Would you like to enter basec setup instead of extended setup?」が該当します。

続いてホスト名を設定します
画像の「Enter host name[Switch]」が該当します。

続いて各種パスワードを設定します。
今回は、enable passwordとsecret passwordを設定しています。
※enable passwordは特権EXECモードに移行する際に入力するパスワードです。
※secret passwordを設定した倍、特権EXECモードに移行する際に求められるパスワードは設定したsecret passwordになります。

![Switch画像2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742179/17987b69-0810-4fca-b679-71a2638bc125.jpeg)

続いて、VLAN1(デフォルトのVLAN)にIPアドレス、サブネットを設定していきます。
今回は自宅のPCに設定しているIPアドレスとサブネットを軸に設定しました。
※一部伏せている箇所がIPアドレスなどの情報です。

L2Switchは物理ポートに直接IPアドレスやサブネットを割り振るのではなくVLANに対してIPアドレスやサブネットを設定し、そのVLANに所属させてポート開放することで通信ができるようになる特性を持ちます。

※Routerの設定画面も紹介しようと思っていましたが画像を保存し忘れていました。

次回はVLANの作成から適用を実際にやってみたところを投稿したいと思います。

もしよければ一読していただけると幸いです。
Geminiでハトと遊ぶ魔法少女を描いてみた。

# 概要

Geminiでハトと遊ぶ魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りです。

```
水のハトと遊ぶ魔法少女を描いてください。
```

![水のハトと遊ぶ魔法少女_20250613.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/5ca9b7c4-ffd3-4d66-8621-ea0e8cc6d117.png)

# まとめ

何かの役に立てばと。
生成モデルの基礎知識2 RAG

こんにちは。
最近、NVIDIA-Certified Associate: Generative AI and LLMs (NCA-GENL)を習得しました。
その際に知っておいた方が良い基礎知識とコードの書き方を共有したいと思います。
生成AIのチュートリアル:

https://github.com/Yuji-github/Gen_AI_Tutorial

https://colab.research.google.com/drive/13ahWlitsbYyiInyxQ9N-jRYd5KV9OHDG?usp=sharing

１．RAGとは？
RAGは、Retrieval-Augmented Generation (検索拡張生成) の略。
大規模言語モデル (LLM) の能力を向上させるために設計されたAIフレームワークで、最新かつ具体的な外部知識へのアクセスをLLMに提供。
また、この際RAGに使うデータベースはベクトルデータベース。

2．RAGのメリットとは？
- 精度と事実に基づいた根拠の向上: ハルシネーション（幻覚）を低減。
- 最新情報へのアクセス: LLMを再トレーニングすることなく、常に最新のデータを使用。
- ドメイン固有性: 独自のデータや特定のドメイン知識に関する質問にもLLMが回答できる。
- 費用対効果: 新しい情報のために大規模なLLMを繰り返しファインチューニングしたり再トレーニングしたりするよりも、一般的に費用対効果が高い。
- 透明性: 応答で使用された情報の引用元やソースドキュメントを提供できることが多く、信頼性が向上。

３．従来のモデルとRAGの違いとは？
従来のモデル（CNN等）はファインチューンを前提で構築していたが、大規模言語モデル (LLM)は大量のGPUが必要なのでファインチューンを前提で構築が向いていない。
また、LLMにファインチューンが出来てもGPUのコストが非常に高いし、時間が掛かる。

その為にRAGが生まれて、ファインチューンを使わずに最新のデータをLLMに与える事にによって回答が出来る。

例えば、LLAMA2は2023年に作られたので2025年のデータはないので2023年以降のイベントは答えられない。

RAGなしLLAMA2の場合：
質問：トランプ氏が大統領に選ばれたのは何時？
答え：2017年です。
工程：
質問　ー＞LLAMA2に与えるー＞LLAMA2が文章をトレーニングデータから生成

RAGありLLAMA2の場合：
質問：トランプ氏が大統領に選ばれたのは何時？
答え：2017年と2024年です。
工程：
質問ー＞ベクトルデータベースー＞RAG生成（オリジナルの質問とベクトルデータベースの答え）（質問：トランプ氏が大統領に選ばれたのは何時？　答え：2017年と2024年）ー＞LLAMA2に与えるー＞LLAMA2がRAGの答えから生成
Tableau関数入門＆応用

## 【Tableau関数入門＆応用】業務で役立つTableau関数まとめ！

こんにちは！今回は**データ可視化ツールTableau（タブロー）で使える関数**について、実務でよく使われるものをピックアップして紹介します。
「関数って難しそう…」と感じる方も多いですが、**基本をおさえれば業務効率が一気にUP**します！

---

### 📌 基本の関数カテゴリ

Tableauの関数は主に以下のように分類されます：

| 関数カテゴリ            | 主な用途                            |
| ----------------- | ------------------------------- |
| 数学関数              | 四則演算や丸め処理（ROUND, CEILING など）    |
| 文字列関数             | テキストの切り出しや結合（LEFT, MID, LEN など） |
| 日付関数              | 日付の抽出・計算（DATEPART, DATEDIFF など） |
| 論理関数              | 条件分岐（IF, CASE, ISNULL など）       |
| 集計関数              | 合計や平均（SUM, AVG, COUNT など）       |
| レベルオブディテール（LOD）関数 | 特定の粒度での集計・固定（FIXED, INCLUDE など） |

---

### 🧩 1. よく使う関数例と実用Tips

#### ■ IF関数：条件分岐の基本

```tableau
IF [売上] > 100000 THEN "好調"
ELSE "要改善"
END
```

→ 売上に応じてカテゴリを切り替える。

#### ■ DATEADD関数：日付の加算

```tableau
DATEADD('month', 1, [注文日])
```

→ 注文日の1か月後を計算。

#### ■ DATEDIFF関数：日付の差分

```tableau
DATEDIFF('day', [開始日], [終了日])
```

→ プロジェクトの所要日数を求める。

#### ■ ZN関数：NULL値を0に変換

```tableau
ZN([利益])
```

→ NULLをゼロにして計算エラーを防止。

#### ■ STR関数：数値→文字列

```tableau
"売上：" + STR([売上])
```

→ ツールチップやタイトルに便利！

---

### 🔍 2. 中級編：レベルオブディテール（LOD）関数

LOD（Level of Detail）関数は、グループの粒度を制御しながら集計を行える強力な関数です。

#### ■ FIXED関数：固定した粒度で集計

```tableau
{ FIXED [顧客ID] : SUM([売上]) }
```

→ 顧客単位の売上合計。シート上のディメンションに依存しない！

#### ■ INCLUDE関数：一時的に粒度を細かく

```tableau
{ INCLUDE [商品] : SUM([利益]) }
```

→ 表示はカテゴリ単位でも、内部的に商品単位の利益を合算。

---

### 🔁 3. Table計算関数で順位や累積

#### ■ RANK関数：ランキング表示

```tableau
RANK(SUM([売上]))
```

→ 売上ランキングを作成可能。

#### ■ RUNNING\_SUM：累積売上

```tableau
RUNNING_SUM(SUM([売上]))
```

→ 時系列での合計値トレンドを簡単に可視化！

---

### 💡 4. 関数の実務活用シーン例

| シーン       | 使用関数              | 目的                 |
| --------- | ----------------- | ------------------ |
| 売上ランク表示   | RANK, INDEX       | トップ商品を強調表示         |
| 顧客分類      | IF, CASE          | 優良顧客/新規顧客などのセグメント化 |
| 売上目標の達成率  | SUM, ZN, DIVISION | NULL回避しつつ達成率計算     |
| イベント前後の比較 | DATEDIFF, FIXED   | キャンペーン効果の定量評価      |

---

### 📝 5. まとめとおすすめの勉強法

Tableau関数は慣れれば\*\*「思考をそのまま表現できる」魔法の道具\*\*になります。

#### 📚 おすすめ勉強法：

* 実データで試す（サンプルスーパーストアなど）
* 「Calculated Field」の中でエラーを恐れず試行錯誤
* Tableau Publicで他人のVizを分解・分析して学ぶ

---

📢 **次回予告：Tableauで動的パラメータ連動可視化を作る方法！**

何か特定の関数やユースケースにフォーカスしてほしいテーマがあれば、ぜひコメントください！
ウェブサーバ

# 出典
https://developer.mozilla.org/ja/docs/Learn_web_development/Howto/Web_mechanics/What_is_a_web_server

ここから抜粋しました。

# ハードウェア、ソフトウェアの両方を兼ね備える
### ハードウェア：Webサーバのソフトウェアとコンポーネントファイルを格納されている
>ハードウェアの観点では、ウェブサーバーとは、ウェブサーバーソフトウェアとウェブサイトのコンポーネントファイル (例えば、 HTML 文書、画像、 CSS スタイルシート、 JavaScript ファイル) を格納しているコンピューターのことです。インターネットに接続され、ウェブに接続された他の端末と物理的なデータ交換に対応しています。

### ウェブサーバがホストするファイルに対してアクセスを制御
>ソフトウェアの観点では、ウェブサーバーとは、`ホストにあるファイルに対する、ウェブユーザーのアクセスを制御`する、いくつかの部品の集まりです。最小限の部品は HTTP サーバーです。HTTP サーバーは URL （ウェブアドレス）および HTTP （ブラウザーがウェブページを閲覧するためのプロトコル）を理解するソフトウェアのことです。格納しているウェブサイトのドメイン名（mozilla.org など）を通してアクセスすることができ、コンテンツをエンドユーザーの端末に配信します。

# 公開するには静的または動的のウェブサーバが必要
>ウェブサイトを公開するには、静的または動的ウェブサーバーが必要です。

### 静的：サーバが保持するファイルをブラウザへそのまま送る
>静的ウェブサーバーは、スタックとも呼ばれ、コンピューター（ハードウェア）と HTTP サーバー（ソフトウェア）から構成されます。サーバーが保持しているファイルをブラウザーへ「そのまま」送るので、「静的」と呼ばれます。

### 動的：保持しているファイルを変更する
>動的ウェブサーバーは、`静的ウェブサーバーと追加のソフトウェア`からなります。`追加ソフトウエアは、一般的にはアプリケーションサーバーとデータベース`からなります。アプリケーションサーバーが、 `保持しているファイルを変更`してから、HTTP サーバーを通してブラウザーに送信するので「動的」と呼ばれます。

#### データベースでファイルを変更する 
>例えば、ブラウザーで見ることができる最終的なウェブページを生成するために、`アプリケーションサーバーはデータベースからのコンテンツで HTML のテンプレートを埋める`ことがあります。 `MDN やウィキペディアのようなサイトは非常に多くのウェブページを持っていますが、実際の HTML 文書が存在するわけではなく、巨大なデータベースとわずかな HTML テンプレートのみが存在`しているのです。この構成をとることで、`より速く、より簡単にコンテンツを保守したり配信`したりすることができます。

# ウェブサーバになければアプリケーションサーバが必要なファイルを作成する

>ウェブサーバーでは、 HTTP サーバーが受信したリクエストを処理し、応答する役割を担っています。

>リクエストを受信すると、 HTTP サーバーは最初に`リクエストされた URL が既存のファイルに一致するか`どうかをチェックします。

>もしあれば、ウェブサーバーは`ブラウザーにファイルを送り返し`ます。なければ、`アプリケーションサーバーが必要なファイルを作成`します。

>どちらの処理もできない場合、`ウェブサーバーは 404 Not Found としてよく知られているエラーメッセージをブラウザーに返します。` 404 エラーはよく起こるので、多くのウェブデザイナーが 404 エラーページのデザインに時間を割いています。
Pythonファイルダウンローダー

# 主な機能
- 日付形式（`YYYY-MM-DD.拡張子`）のファイルをHTTP上から順にチェック・ダウンロード
- 存在しない日付は自動でスキップ
- User-Agentヘッダーを偽装して簡易なアクセス制御を回避
- ファイルが空(`Content-Length: 0`)の場合はダウンロードせず通知
- マルチスレッド（デフォルト10並列）で高速スキャン

# 前提条件
- Python 3.6+
- `requests` ライブラリのインストール

# 使用方法
```bash
python ymd_brute.py
```
プロンプトに従って以下の情報を入力：
- BASE URL（例：http://example.com/reports）
- 拡張子（例：pdf, zip, txt, bak など）
- 年（例：2025）
- 開始月・終了月（1〜12）
上記を入力すると、http://example.com/reports/2025-01-01.pdf ～ 2025-02-31.pdf の範囲で存在するファイルをチェック＆ダウンロードします。

# 補足
- ダウンロードされたファイルは tmp_downloaded ディレクトリに保存されます。
- ファイルサイズが0バイトの場合は保存されず、通知のみされます。
- 日付の不正（例：4月31日など）は自動スキップします。
- ユーザーによる中断（Ctrl+C）も適切に処理されます。
- HEADリクエスト後にGETリクエストを行うため、帯域消費は最小限です。

# GitHub
https://github.com/sup0gari/CTF_TOOLS/blob/main/ymd_brute.py
【Python】typingモジュールを利用した型ヒント

型ヒントをサポートする標準ライブラリであるtypingモジュールを利用すると、様々な型を付けることができます。

**表：typingモジュールで利用できる型の一部**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/8a591a04-69c1-4d40-94a9-eb5e99f4ceee.png)
まさかのIT！？🍰 新卒エンジニアが語る、私のエンジニアデビュー物語

## はじめに

はじめまして！新卒1年目のエンジニアの吉永です。
Qiitaに記事を投稿するのは今回が初めてなので、ちょっぴり緊張していますが、最後まで読んでもらえると嬉しいです！

今回のテーマは「**なぜエンジニアになったのか？**」です✨ 
エンジニアとして頑張っている方々も、これから目指そうかなって思っている人も、きっとそれぞれの素敵なストーリーがあるはずです。私も、ITとはぜんぜん縁がなかった中学生時代から、エンジニアになるまでの道のりをお話ししたいと思います！

---
## 📚目次

- [中学生時代：ITとの距離感は遠かったな？🤔](#中学生時代itとの距離感は遠かったな)
- [転機：IT専門学校に入学！初めてのIT体験🎓✨](#転機it専門学校に入学初めてのit体験)
- [決断：ITの世界へ飛び込もう！って思った理由🚀](#決断itの世界へ飛び込もうって思った理由)
- [おわりに💐](#おわりに)

---



## 中学生時代：ITとの距離感は遠かったな？🤔

今でこそ毎日パソコンと仲良しですが、中学生の頃の私はITとはほとんど無縁の生活を送っていました。パソコンって言えば、学校の授業でたま〜に触るくらいで、ブラインドタッチなんて夢のまた夢。タイピングも人差し指でカタカタ打つレベルでした（笑）。

当時の私にとって「技術職」っていう言葉は、「パソコンがすっごく詳しい人がやるお仕事」っていう、ふんわりとしたイメージしかありませんでした。IT業界のニュースを見ても、「なんだか難しそうだな〜」「自分には関係ない世界の話かな？」って、正直ピンと来てなかったんです。まさか自分がその世界に飛び込むことになるとは、夢にも思っていませんでした。



## 転機：IT専門学校に入学！初めてのIT体験🎓✨
そんな私がITの世界に足を踏み入れたのは、高校進学と共に母の勧めでITの専門学校に入学したことがきっかけでした。

実は、最初は「ITってどんなことをするんだろう？」くらいの漠然とした気持ちで、特に強い意欲があったわけじゃなかったんです

でも、専門学校に入学して、初めてプログラミングとかネットワークとか、ITの技術に触れてみたら、予想外の
「あれ？おもしろいかも！」っていう感覚が湧いてきたんです！💖
たとえば…

>🎉 初めて「Hello, World!」が画面に表示されたとき
>🌐 ネットワークの仕組みを図解で理解できた瞬間
>💻 自分で作った簡単なWebページがブラウザに表示されたとき

そんな体験を通して、「自分が書いたものが、ちゃんと動いている！」「こんな風にインターネットって成り立っているんだ！」っていうちっちゃな感動が、私のITに対する認識をガラリと変えてくれたんです。
それまで遠い存在だったITが、一気に身近に、そして魅力的に見え始めた瞬間でした。



## 決断：ITの世界へ飛び込もう！って思った理由🚀
専門学校での学びを通して、私は本格的にIT業界を意識し始めました。どうしてITの世界に惹かれたのか、その理由はいくつかあるんですよ。

まず、**「作る楽しさ」** です。自分のアイデアを形にできること、そしてそれが実際に誰かの役に立つかもしれないっていう可能性に、強く心を惹かれました。最初は小さなプログラムでも、それが動く喜びは本当に大きいんです。まるで、お菓子作りでレシピ通りに材料を混ぜて、オーブンに入れたら素敵なケーキが焼き上がるみたいにワクワクします！🎂

次に、**「論理の面白さ」** 。プログラミングって、一つ一つの問題を論理的に分解して、解決していく作業の連続なんです。まるでパズルを解くような感覚で、複雑な問題をシンプルに整理していく過程がとっても面白いなって感じました。そして、自分が作ったものが思った通りに動いた時の爽快感はもう最高です！🥳

さらに、**「仕組みを知る感動」** も大きな要因でした。普段何気なく使っているサービスやアプリが、どんな技術で、どんな風に動いているのかを知るたびに、「なるほど〜！」って感動していました。まるで世界の裏側をちょっぴり覗いているみたいな感覚で、知的好奇心がどんどん刺激されていきました✨

そして最終的に、これらの魅力がぜんぶ合わさって、私はエンジニアになることを決意しました！ ITの世界は常に進化し続けていて、新しいことを学び続けることが求められる分野だけど、それ以上に「面白い」がぎゅっと詰まっている、そう確信したからです。これからもいろんなことにチャレンジしたいです！💪



## おわりに💐
ここまで読んでくれて、本当にありがとうございます！💕

私の「なぜエンジニアになったのか」っていうお話、どうでしたか？
もし、この記事を読んでITにちょっぴりでも興味を持ってもらえたり、「私もエンジニアを目指してみようかな？」なんて思ってもらえたら、とっても嬉しいです！🥰

新卒1年目として、まだまだ学ぶことばかりですが、これからもQiitaで色々な情報を発信していけたらって思っているので、よろしくお願いします！
また見に来てください〜！👋
Unity Particle Packを導入したら何にも表示されない？？？？？

# やろうとしたこと
ゲームを自作しているなかで爆発のエフェクトが欲しかったからUnity公式の「Unity Particle Pack」を導入しようとした


入れてみてサンプルシーン見てみるか．．．と思ったら何にも表示されんが？？？？？？？？

<iframe width="560" height="315" src="https://www.youtube.com/embed/ILPqhyb8Y1I?si=mqKLEwxmL2Ug-cOo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


# 環境
M3 Macbook Pro
Unity6 6000.1.5f1
レンダリングはURPを使用

# 解決方法
ここのチェック入れ忘れてた！！！！！！！！！！！
![スクリーンショット 2025-06-13 17.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820975/015edbb5-c382-4870-aabe-07ceda4c0cda.png)

# 原因
実は今回のプロジェクトは`Build-in`から`URP`に途中で変更したので，Universal Render Pipeline Assetを自分で作ってたんですよね．．．
デフォルトでURPからプロジェクトを立ち上げたなら関係ないかもです！！！！
Azure AI Vision の Vectorize Image API をPowerShell  で実行する

# この記事の目的
公式ドキュメントにはリファレンスが記載されているが、実行するとき毎回変換する必要があるため、備忘の為、記載する

# 実行するAPI

https://learn.microsoft.com/en-us/azure/ai-services/computer-vision/how-to/image-retrieval?tabs=csharp

https://learn.microsoft.com/en-us/rest/api/computervision/image-retrieval/vectorize-image?view=rest-computervision-v4.0-preview%20(2023-04-01)&viewFallbackFrom=rest-computervision-v4.0%20(2023-10-01)&tabs=HTTP

# 実行方法
PowerShell の Invoke-RestMethod を使用して実行する

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-7.4

# 実行例

```Powershell
$key = "<api key>"
$Resource = "<Resource 名>"
$apiversion = "<REST APIのバージョン>" #2024-02-01
$modelversion = "<modelのバージョン>" #2023-04-15
$url = "https://$Resource.cognitiveservices.azure.com/computervision/retrieval:vectorizeImage?api-version=$apiversion&model-version=$modelversion"
$headers = @{}
$headers["Content-Type"]  = "application/json"
$headers["Ocp-Apim-Subscription-Key"] = "$key"
$body = '{
  "url": "https://learn.microsoft.com/azure/ai-services/computer-vision/media/quickstarts/presentation.png"
}'

$response = Invoke-RestMethod -Uri $url -Method POST -Headers $headers -Body $body
$response
```

key などの取得方法はこちらを参照

https://learn.microsoft.com/en-us/azure/ai-services/authentication

APIのバージョンはREST APIのリファレンスを参照

https://learn.microsoft.com/en-us/rest/api/computervision/image-retrieval/vectorize-image?view=rest-computervision-v4.0-preview%20(2023-04-01)&viewFallbackFrom=rest-computervision-v4.0%20(2023-10-01)&tabs=HTTP

Modelのバージョンは以下のドキュメント

https://learn.microsoft.com/en-us/azure/ai-services/computer-vision/how-to/image-retrieval?tabs=csharp
```
The 2024-02-01 API includes a multi-lingual model (model version 2023-04-15) that supports text search in 102 languages. 
The original English-only model (version 2022-04-11) is still available, but it cannot be combined with the new model in the same search index. 
```
【Python】型ヒントとは

動的型付け言語であるPythonは型を指定せずに利用できますが、型ヒントというPythonの言語仕様によって、変数や関数の引数、戻り値に対して型を付けることができます。
型ヒントはあくまでヒントのため、異なる型を代入してもエラーにはなりませんが、記述方法が間違っているとSyntaxErrorになります。
元島純貴：5年前のWeb開発、今やったらどれくらい工数下がるか考えてみた

元島純貴です。

Web開発の世界は、技術の進歩が非常に早い分野です。5年前といえば、2019〜2020年あたり。当時の開発スタイルと今を比較してみると、驚くほど工数が削減できることに気づかされます。今回は、「もし5年前のあの案件を、今の環境でやり直したらどれくらい効率化できるか？」を本気で考えてみました。

## あの頃の開発環境を振り返る

まず、5年前の自分がWebアプリを開発していた時の一般的なスタックを振り返ってみましょう。

* フロントエンドはjQueryやBootstrapがまだ多く使われていた
* バックエンドはPHPやLaravel、Ruby on Railsが主流
* ビルド環境はWebpack、設定もやや複雑
* デプロイはFTPアップロードや手動操作が多かった
* テストは最低限の単体テストのみで、E2Eはあまり普及していなかった

そして何より、今ほどの「テンプレート化」や「自動化」が進んでいませんでした。

## 今の開発環境との違い

2025年現在では、以下のような改善があります。

* **Next.jsやNuxt 3など、SSR/SSG対応のモダンフレームワークの普及**
* **Viteなど爆速ビルドツールの登場**
* **Tailwind CSSによるCSS設計の簡略化**
* **FirebaseやSupabaseでサーバーレス構成が簡単に**
* **ChatGPTやCopilotでコーディング補助が常態化**
* **CI/CDの自動化環境が簡単に構築可能**
* **Headless CMSやLow-codeツールの活用も一般的に**

つまり、あらゆる工程において「手作業」から「自動化・省略」へと進化しているのです。

## 仮に同じ案件をやり直したら

たとえば、当時自分が約3ヶ月かけて開発したあるWeb予約システム（管理画面＋ユーザー予約機能＋通知機能）を例にとってみましょう。

当時の工数内訳は以下のようなものでした：

* 要件定義・設計：40時間
* フロント実装（jQuery＋CSS調整）：120時間
* バックエンド実装（PHP）：100時間
* テスト・修正対応：60時間
* デプロイと本番反映：30時間
  **合計：約350時間**

これを現在の技術でやり直すとどうなるか？ざっくりと見積もってみます。

* 要件定義・設計：30時間（Notion＋ChatGPT活用）
* フロント実装（Next.js＋Tailwind）：50時間
* バックエンド（Supabase＋Cloud Functions）：30時間
* テスト（Playwrightなどで自動化）：20時間
* デプロイ（Vercelで一発）：5時間
  **合計：約135時間**

ざっと**60%以上の工数削減**が可能になっている計算です。

## 工数削減だけでなく、品質も向上

驚くべきことに、単に早くなるだけでなく「品質」も格段に上がります。デザインの一貫性、レスポンシブ対応、パフォーマンス最適化、セキュリティ強化など、すべてにおいて今のツール群の方が圧倒的に優れているのです。

特にCopilotやChatGPTを使えば、コーディング中の「詰まり」も圧倒的に減りますし、初学者でもある程度のスピード感を持って実装が可能になります。

## まとめ：もはや“つくる力”より“活用する力”の時代へ

今回の比較で実感したのは、もはや「技術力＝手打ちでコードを書けること」ではない、という事実です。今のWeb開発は、ツールやサービスをどれだけ知っているか、それをいかに組み合わせて使いこなせるか、という“設計力”と“選択力”が問われています。

5年前に比べて、誰でも短期間でクオリティの高いサービスを開発できる時代です。だからこそ、エンジニアに求められるのは「ゼロから全部書く力」ではなく、「既存の技術を最大限に活かす力」なのかもしれません。

---

今の技術で5年前の自分の案件をやり直したら…というテーマは、開発者にとって技術進化を体感する絶好の振り返りになります。あなたもぜひ、過去の案件で“工数再見積もり”をしてみてください。未来の開発が、きっともっと楽しみになるはずです。

元島純貴とは何者？
https://www.print-gakufu.com/search/result/score___keyword__%E5%85%83%E5%B3%B6%E7%B4%94%E8%B2%B4/