OmniAICreator/Qiita-1.07M huggingface dataset:
ABC394回答メモ

# 0.はじめに
　順調にレートを上がってきて満を持して挑んだ今回。
　A-Dを順調に30分以内でAC。
　今日こそもう一問と思うもEは上手い解き方が思い浮かばず
　Fは何とかなりそうな気もしたけど取り組むと一筋縄では
　行かず、壁は超えられませんでした。
　とはいえ、レートは+14で、812に揚がり半年以上ぶりの
　緑復帰となりました。
　

# 1.A - 22222
　読み込んだ文字列から2以外を除外した文字列を
　作成し、最後に出力して終了
　
　https://atcoder.jp/contests/abc394/submissions/62996920


# 2.B - cat
　読み込んだ文字列から、文字列数と文字列のタプルを作成し
　用意したリストLに格納。
　リストLを昇順ソートしたのち、頭から読み込み文字列を連結
　最後に連結した文字列を出力して終了

　https://atcoder.jp/contests/abc394/submissions/63005549


# 3.C - Debug
　単純に問題の内容通り頭から全部変換を繰り返すとさすがにTLEに
　なりそうなので一工夫。

　【考え方】
　　・頭から文字列をチェックしていく
　　　・WAが出てきたらACに変換し、変換した位置の一文字前からチェックを再開する
　　・最後に返還後の文字列を出力して終了
　
　解き方さえ決まれば実装は難しいこともなくすんなりできて終了

　https://atcoder.jp/contests/abc394/submissions/63016861


# 4.D - Colorful Bracket Sequence
　D問題にしては簡単な気がした問題。
　【考え方】
　　・違う種類の括弧が入れ子になっていた場合　カラフルな文字列になりえない
　　　　例：<(>)
　　
　　・上記を踏まえると下記手順で考えればカラフルな文字列を判別できる

　　1.頭から見ていき、左カッコならキューにスタック
　　2.右かっこが出てきたら、キューの最後の括弧をチェック
　　　-1.キューが空なら”No”を出力して終了
　　　-2.チェックした括弧が右かっこと同じ種類ならキューから削除して継続
　　　-3.チェックした括弧が右かっこと違う種類なら”No”を出力して終了
　　3.最後までチェックした時点で、キューに括弧が残ってれば”No”を出力して終了
　　　残っていなければ”Yes”を出力して終了


　https://atcoder.jp/contests/abc394/submissions/63028295


以上
grep とxargs で影響調査

# はじめに
あるテーブルのカラムが不要になったので、除却したーい！
けど、利用している機能がわからない。

カラム名でGREPすれば一発だ！って思ってGREPしたら、カラム名が汎用的な名前でたくさん抽出されてしまった。

ほしいのは、Aテーブルのカラム だけなのに。

そんな時に grep と xargs を使って調査したのでそのやり方を残します。

# 前提
SQLをファイルに記載している

# やりかた
テーブル名でGREPして、さらにカラム名でGREPする。
```
grep -irEl --include='*.対象ファイルの拡張子' 'テーブル名' . | xargs --no-run-if-empty grep -irEl 'カラム名'
```

grepコマンドのオプション
i：大文字小文字区別しない
r：サブディレクトリも検索
E：正規表現を使いたい
|：ファイルパスだけ表示
--include：特定の拡張子だけ検索

xargsコマンドのオプション
--no-run-if-empty：1個目のGREP結果が存在する場合は実行。存在しない場合は実行しない。

# 仕組み
1個目のGREPで、テーブル名を使用しているファイル一覧を抽出
2個目のGREPで、カラム名を使用しているか？を判定

# 注意点
あくまでも1ファイル内で、テーブル名とカラム名を含むファイルを抽出しているだけなので、別のテーブルの同名カラム名で抽出している恐れがある。

このため、目検のチェックは必要。

だが、対象をだいぶ絞り込めるのでお勧めです。

# 補足
Windowsの場合は、Git Bash を使えばよい。
<Python>ファイルサイズ上位10個をリストアップする

# まえがき
こちらの関連です。今回はファイルサイズの上位10個を表示させます。
[ <Python>1GB以上のファイルを探す ](https://qiita.com/TTG/items/69fd5573a598934b1275)

# ファイルサイズが大きい上位10個を表示する
```python
import os
import datetime
import math

#file_unitはファイルサイズ単位を適切に判断するための処理です。
#少数点第二位までを表示させます。
#人間が読みやすいようにファイルサイズによって単位を変更します。
def file_unit(size_bytes):
	units=["B", "KB", "MB", "GB", "TB"]
	i = math.floor(math.log(size_bytes, 1024)) if size_bytes > 0 else 0
	size = round(size_bytes /1024 ** i, 2)
	return f"{size}{units[i]}"


#list_filesはファイルサイズが1GB以上のファイルを出力する処理です。
#file_size >= 1 * 1024 * 1024 * 1024 によってファイルサイズを計算しています。1024を1回掛けるごとにファイルサイズが1KB,1MB,1GBというように変化します。
#表示はファイルフルパス、タイムスタンプ、ファイルサイズを表示します。
#base_dir,root,dirs
def list_files(base_dir):
	file_info_list=[]
	for root, dirs, files in os.walk(base_dir):
		for file_name in files:
			file_path = os.path.join(root, file_name)
			if os.path.isfile(file_path):
				file_size = os.path.getsize(file_path)
				if file_size >= 1 * 1024 * 1024 * 1024:
					mtime = os.path.getmtime(file_path)
					timestamp = datetime.datetime.fromtimestamp(mtime).strftime('%Y/%m/%d')
					file_info_list.append({
						"path": file_path,
						"timestamp": timestamp,
						"size": file_size
					})
	if file_info_list==[]:
		print("file over 1GB was not found")
	for info in file_info_list:
		size_str = file_unit(info["size"])
		print(info["path"])
		print(info["timestamp"])
		print(size_str)
		print()

if __name__ == "__main__":
	TARGET_DIR = "."                 #任意のフォルダを指定してください。
	list_files(TARGET_DIR)
```
PythonのTkinterで計算ツールを作ってみた！

### 概要
今回は以前作れずじまいに終わった計算ツールを作成することに成功しました！
プログラムの可読性など、問題は多々ありますが、何とか作り上げることが出来ました。

### ソースコード
こちらがソースコードになります。
```keisan.py
import tkinter as tk

def Calculation():
    val_1=int(num_area_1.get())
    val_2=int(num_area_2.get())
    mark=mark_area.get()
    if mark=='+':
        answer=val_1+val_2
    elif mark=='-':
        answer=val_1-val_2
    elif mark=='*':
        answer=val_1*val_2
    elif mark=='/':
        answer=val_1/val_2
    elif mark=='//':
        answer=val_1//val_2
    elif mark=='%':
        answer=val_1%val_2
    elif mark=='**':
        answer=val_1**val_2
    answer_ent.delete(0,tk.END)
    answer_ent.insert(0,answer)

root=tk.Tk()

root.title(u'計算ツール カルキューレ')

root.minsize(600,580)
root.option_add("*font",["MS Pゴシック",20])

canvas=tk.Canvas(bg="#22ff22",width=700,height=540)
canvas.place(x=0,y=0)

label1=tk.Label(bg="#22ff22",text='1つ目')
label1.place(x=30,y=50)

num_area_1=tk.Entry(width=12,bd=5)
num_area_1.place(x=180,y=50)

mark_label=tk.Label(bg="#22ff22",text='算術記号')
mark_label.place(x=30,y=150)

mark_area=tk.Entry(master=root,width=12,bd=5)
mark_area.place(x=180,y=150)

label2=tk.Label(bg="#22ff22",text='2つ目')
label2.place(x=30,y=250)

num_area_2=tk.Entry(master=root,width=12,bd=5)
num_area_2.place(x=180,y=250)

ans_label=tk.Label(bg="#22ff22",text='結果')
ans_label.place(x=30,y=350)

answer_btn=tk.Button(master=root,text='答え',command=Calculation)
answer_btn.place(x=400,y=350)

answer_ent=tk.Entry(master=root,width=12,bd=5)
answer_ent.place(x=180,y=350)

text_label=tk.Label(master=root,bg="#22ff22",text='GUIDE\n//:剰余なし割り算、%:剰余、**:累乗')
text_label.place(x=20,y=450)

root.mainloop()
```

### 表示例
![スクリーンショット 2025-02-23 074635.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747052/a790d622-b66e-4620-93fe-aa54fa173433.png)


### 今後の課題
まだこのプログラムは完璧なものかと言えると、決してそうとは言い難いものかと思います。
今後はより可読性やクラス・インスタンスの使用なども検討したいところです。
GoogleのNotebookLMを試してみた！無料で使えるAI情報整理ツール

# はじめに

エンジニアのみなさま、日々の学習お疲れ様です。
また本記事まで足を運んでいただき本当に感謝です。

今回は生成AIツールである『NotebookLM』について、特徴や使い方をまとめてみました。


# NotebookLM とは

NotebookLMは、**Googleが提供する、ユーザーがアップロードしたドキュメントやデータを基に、情報整理、分析、要約、質問応答を行うことができるAIツール**になります。

https://notebooklm.google.com/


# 特徴

### 1. 無料で簡単に利用可能（2025年2月22日時点）
Googleアカウントがあれば利用可能です。
有料プランもありますね。ノートブックを共同編集して他のユーザーと共有したり、1ノートブックあたりのソースの上限数が5倍になると書いてます。月額2,900円が今なら1ヶ月無料っぽいです。

### 2. 多様な形式のファイルに対応
PDF、Googleドキュメント、音声ファイル、ウェブページのURLなど、様々な形式のデータをアップロードできます。WordやExcelデータも利用可能です。

### 3. ドキュメントの自動整理と分析
アップロードされたドキュメントやデータをAIが自動的に整理・分析します。
DeNAの南場氏が **『初めて会う人の情報収集』** としてNotebookLMを活用してると記事に書かれてました。他のAIも駆使されてて、活用方法がとても勉強になります。

https://fullswing.dena.com/archives/100153/

### 4. 要約と質問応答
**アップロードしたドキュメントの内容に関する質問** にチャット形式で答えてくれます。
アップロードされたソースに基づいて回答します。
そのため、例えば公式ドキュメントなどをNotebookLMへ追加すれば、AIによる誤情報の可能性が低くなりそうです。

### 5. YouTube動画の要約
YouTubeのURLを基に、動画の内容を要約できます。
長時間のコンテンツは見るのが大変ですが、YouTUbeのURLを追加して要約してもらえば、欲しい情報だけ取得出来そうですね。

### 6. 複数資料の統合整理
複数のPDFやURLをアップロードして、それらを比較・統合し、重要なポイントを抽出できます。


# 試してみた

サイトに入った時の画面はこんな感じです。直感的に操作できますね。
『作成』ボタンを押すと、ノートブックが作成されます。

![スクリーンショット 2025-02-22 21.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/94cae562-c0d4-4b0a-b9b0-e2691391c895.png)

画面にどんどんノートブックが追加されるみたいですね。

![スクリーンショット 2025-02-22 21.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/fdfbf91c-fb8f-4980-b725-0af7a95b9d92.png)

ノートブックの作成画面はこんな感じです。

![スクリーンショット 2025-02-22 21.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/1fa82724-1c33-4fa0-ba17-6d603e711249.png)

左のカード『ソース』にある『＋ソースを追加』を押して、アップロードしたいファイルを選択します。アップロード出来るソースの上限は50個までみたいですね。充分すぎる。

![スクリーンショット 2025-02-22 21.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/6322f7a4-8575-4af5-b696-80af005fa199.png)

以下はYoutubeのURLを4つ貼り付けた状態になります。

![スクリーンショット 2025-02-22 21.48.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/3bd45e9a-dc32-468a-9627-9603464ea3b0.png)


URLを1つ貼り付けると、中央カード『チャット』内にYouTubeの動画の要約内容がでます。
下部にある『入力を開始します...』フォームに自分が整理したい内容を入力する事で、AIが整理して結果を出力してくれます。ちなみにサイトに関係の無い事を聞くと、ちゃんとAIが判断して回答してくれてますね。すごい。

![スクリーンショット 2025-02-22 21.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/972f1b80-3f7e-4fc5-9025-4bfb60ea79b4.png)



# さいごに

情報整理に膨大な時間をかけていたものが、NotebookLMを使う事で大幅に時間を削減できそうです。
こんな便利なAIツールは使いこなして損はなさそうです！

------


弊社の紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後までご覧いただき、ありがとうございました！
bun build で「error: Failed to generate bytecode for」となるのはimport.metaが原因でした。

Bunでのビルド時に、突然現れる「error: Failed to generate bytecode for」というエラーに悩まされた経験はありませんか？今回は、僕自身が直面したこのエラーの原因究明と解決までの試行錯誤の過程をまとめました。結果、原因はコード内の`import.meta`、特に`import.meta.env`の参照であることが判明しました。

## はじめに

Bunは高速なJavaScriptランタイムとして注目されていますが、ビルドプロセスにおいて独自の制約や問題もあります。特に、`--bytecode`オプションを使用した場合、一部のコードパターンが原因でバイトコードの生成に失敗することが報告されています。私のプロジェクトでも、`bun build`を実行すると以下のようなエラーが発生しました。

```
[20ms]  minify  -32.0 KB (estimate)
[28ms]  bundle  9 modules
 [5ms] compile  dist/cli-linux bun-linux-x64-v1.2.2
error: Failed to generate bytecode for ./index.js
```

## 試行錯誤の過程

### 1. オプション設定の見直し

まず、Bunのビルドオプションとして、`--format cjs`や`--target bun`を試してみましたが、今回のケースでは問題の解決には繋がりませんでした。公式ドキュメントやGitHubのIssueを参考にする中で、これらの設定は今回のエラーとは直接関係がないと判断しました。

### 2. import.meta.envの調査

次に、エラーメッセージとソースコードを詳しく確認すると、依存しているライブラリ（例: [consola](https://github.com/consolajs/consola)）が内部で`import.meta.env`を参照していることに気づきました。Bunのバイトコード生成は、環境変数の動的な参照（特に`import.meta.env`）に弱いという特性があり、この点がエラーの原因となっていました。

### 3. --defineオプションでの置換試行

そこで、`bun build`実行時に`--define`オプションを用いて`import.meta.env`を`undefined`に置換する方法を試みました。以下のコマンドを実行：

```bash
bun build index.js --outdir ./dist --bytecode --define:import.meta.env=undefined
```

しかし、この方法では意図したとおりに置換が行われず、エラーが解消されませんでした。依存関係内のコードが複雑なため、静的な置換だけでは対応が難しいという問題があったようです。

## 解決策: sedコマンドによる置換

最終的な解決策として、ビルド前に`sed`コマンドを使用して、問題となっているライブラリのファイル内で`import.meta.env`の参照を削除する方法を採用しました。具体的には、以下のコマンドを実行することで、`node_modules/consola/dist/index.mjs`内の`import.meta.env`が削除され、ビルドが正常に進むようになりました。

```bash
sed -i 's/import.meta.env||/                /g' node_modules/consola/dist/index.mjs
```

この方法により、直接ファイルを書き換えることで、Bunのバイトコード生成時のエラーを回避することができました。ただし、node_modules内のファイルを直接変更するため、再インストール時に変更が上書きされる可能性がある点には注意が必要です。そのため、自動化スクリプトやpostinstallスクリプトに組み込むことを検討すると良いでしょう。

## まとめ

今回の試行錯誤の結果、Bunで`--bytecode`オプションを使用した際に発生する「error: Failed to generate bytecode for」というエラーは、内部で参照される`import.meta.env`が原因であることが判明しました。以下が今回の解決策です。

- **試行1:** `--format cjs`や`--target bun`などのオプション設定の見直し  
  → エラー解消には至らず

- **試行2:** `--define`オプションで`import.meta.env`を`undefined`に置換する  
  → 期待通りに動作せず

- **最終解決:** ビルド前に`sed`コマンドを使用して、ライブラリ内の`import.meta.env`の参照を削除する  
  → エラーを回避できた

この経験から、Bunでのバイトコード生成時には、依存ライブラリやコード内の環境変数の扱いに注意が必要であることが分かりました。皆さんのプロジェクトでも同様の問題に遭遇した場合は、今回の解決策を参考にしてみてください。
<Excel>データを整形するマクロ

# まえがき
仕事でやむを得ず作成したExcelマクロです。
使い捨てで作成したのですが、似たようなことは今後もあり得るかもと思い投稿しています。

## バージョン
Excel 2022

# 処理概要
マクロを登録し、挿入したボタンにマクロを登録しました。
あとはデータを用意して、ボタンをクリックすれば下記の処理が実行されます。
- 実行するExcelファイルのシートにある特定の範囲セルのデータをコピーする
- 文字列を縦書きから横書きへ変更する
- 貼り付け先のデータを削除する
- 横並びのデータを立て並びへ変換する
- データを特定のセルへ張り付ける
- 全角 （） を半角 () に置換する
- コピー元のデータを削除する
- 完了のメッセージボックスを表示させる

# Excel Macro
```vb
Sub TransformAndReplace()
    Dim ws As Worksheet
    Dim rngSource As Range
    Dim rngTarget As Range
    Dim cell As Range
    Dim lastCol As Integer
    Dim dataArray As Variant
    Dim rowCount As Integer

    On Error GoTo ErrorHandler ' エラーハンドリング開始

    ' アクティブなワークシートを取得
    Set ws = ActiveSheet

    ' シートが正しく取得できない場合のエラーチェック
    If ws Is Nothing Then
        MsgBox "アクティブなシートが見つかりません", vbExclamation
        Exit Sub
    End If

    ' シート名をデバッグ出力
    Debug.Print "アクティブシート：" & ws.Name

    ' F2:OO2 のデータ範囲を取得（最も右のデータ列を特定）
    lastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column
    
    ' データがない場合は処理を終了
    If lastCol < 6 Then
        MsgBox "コピー元にデータがありません", vbExclamation
        Exit Sub
    End If

    ' コピー元のデータ範囲を設定（F2～最後の列）
    Set rngSource = ws.Range(ws.Cells(2, 6), ws.Cells(2, lastCol))

    ' 文字列の方向を 0 度に設定（縦書きを横書きに変更）
    rngSource.Orientation = 0

    ' C3:C403 のデータを削除（セルを空にする）
    Debug.Print "C3:C403 のクリアを実行"
    ws.Range("C3:C403").ClearContents
    DoEvents ' 画面更新を強制

    ' データを配列に格納し、行数を取得
    dataArray = Application.Transpose(rngSource.Value)
    rowCount = UBound(dataArray)

    ' データが400行を超える場合はエラー表示
    If rowCount > 401 Then
        MsgBox "貼り付けるデータが多すぎます (最大400行)", vbExclamation
        Exit Sub
    End If

    ' C3 に行列を入れ替えてデータを貼り付け
    Set rngTarget = ws.Range("C3")
    rngTarget.Resize(rowCount, 1).Value = dataArray

    ' C3:C403 のデータに対して全角 ( ) を半角 ( ) に置換
    For Each cell In ws.Range("C3:C403")
        If Not IsEmpty(cell.Value) And Not IsError(cell.Value) Then
            cell.Value = Replace(cell.Value, "（", "(")
            cell.Value = Replace(cell.Value, "）", ")")
        End If
    Next cell

    ' F2:OO2 のデータを削除（セルの内容のみ削除し、左シフトはしない）
    rngSource.ClearContents

    ' 成功メッセージを表示
    MsgBox "マクロを実行しました", vbInformation

    Exit Sub

ErrorHandler:
    ' エラー時の処理
    MsgBox "Error!", vbCritical
End Sub

```
Ubuntu 24.04 LTS に WordPress 6.7 をインストール

Ubuntu にLAMP(Linux/Apache/MariaDB/PHP)環境のインストールを行う手順を以下に記します。

# タイムゾーンの変更

```
sudo su - 
timedatectl set-timezone Asia/Tokyo
```

# Apache のインストール

```
apt -y update
apt -y install apache2 
systemctl enable apache2
systemctl start apache2
```

webブラウザで Ubuntu サーバの IP アドレス(```curl -w '\n' ifconfig.me``` で確認できます)にアクセスして Apache のテストページが表示されるか確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122952/37c2a06b-4782-4eac-a1c7-8509fe9b5cc2.png)


# PHP 8.3 のインストール

```
apt -y install php8.3 php8.3-mysql
```

# MariaDB 10.11 のインストール

```
apt -y install mariadb-server mariadb-client
systemctl enable mariadb
systemctl start mariadb
```

2025-02-22 時点では MariaDB 10.11.8 がインストールされました。

```sql
$ sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 10.11.8-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

# WordPress のインストール

## WordPress ダウンロード/展開

現時点での[WordPress最新版](https://ja.wordpress.org/latest-ja.tar.gz)をダウンロードし、DocumentRoot配下に展開します。

```
cd /var/www/html
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvf latest-ja.tar.gz
chown -R www-data:www-data .
```

## WordPress 用データベース作成

MariaDB Monitor(mariadbコマンド)上で，文字コードUTF8でデータベース wordpress を作成します。

```sql
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;
```

## WordPress 用 MariaDB ユーザの作成

さきほど作成したデータベースのみ全権限を持つ wordpress ユーザを作成します(ユーザ名/パスワードは適宜変更してください)。

```sql
GRANT ALL ON wordpress.* TO wordpress@localhost IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
```

## WordPress 初期設定

webブラウザで xx.xx.xx.xx/wordpress/ にアクセスし、WordPressの初期設定を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/e2a57068-9ca9-de5a-9db6-273de5a97770.png)

Note: パスワードは実運用時にはより複雑で安全なパスワードを設定してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/f44caded-dc3b-7ee1-199f-b4fab2d5ba9e.png)

正常にインストールが完了すると、指定したユーザ、パスワードでダッシュボードにログインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122952/0386f27b-c77b-470c-bda6-0a2f8b78ef13.png)
「エンジニアリング マネージャーのしごと」を 2 年ぶり位に読み直して自問自答してみた

[O'Reilly Japan - エンジニアリングマネージャーのしごと](https://www.oreilly.co.jp/books/9784873119946/)
[エンジニアリングマネージャーのしごと ―チームが必要とするマネージャーになる方法 | James Stanier, 吉羽 龍太郎, 永瀬 美穂, 原田 騎郎, 竹葉 美沙 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4873119944)

![](https://images-fe.ssl-images-amazon.com/images/I/51mllWSxrpL._SX218_BO1,204,203,200_QL40_ML2_.jpg)

[「エンジニアリングマネージャーのしごと」を読んで、マネージャーの楽しさを学ぶ #読書 - Qiita](https://qiita.com/e99h2121/items/316530888c25d9961642) と、以前に物理本で手に入れてホクホクしたまま寝かせていたので、読み直したメモ。

## 先に結論

- 既に読んだことがある本でも、時間が経過した後や環境が変わった後で読んでみるとふりかえりに役立つ。
- 「私のアウトプット + 私が影響を与えた他の人のアウトプット」を意識して働きたい。
    - 手軽なところでは、ドキュメントを書いて知見を共有したり今後ともしていきたい...。


## メモ

読み直しながら、自らを省みるのに良いなと思った箇所です。

- 良くないコミュニケーションとは以下
    - オーバーコミュニケーション。
    - はぐらかし。
    - ウケ狙い。
    - 一貫性のなさ。
    - 感情にとらわれる。
- やるべきことは以下
    - 委譲すること。
    - スタッフにとってチャレンジになるくらい委譲すること。
    - タスクの重要性に応じて適切なコントロールを保持すること。

委譲は難しいです。細かく教えすぎても駄目だし放置しても駄目、しかも相手によって答えは変わる。私の場合放置しがち。とかく、方程式は以下とのこと。

> マネージャーのアウトプット = あなたのチームのアウトプット ＋ あなたが影響を与えた他のチームのアウトプット

> 方程式をもう一度見て、以下のことを実行してください。
先週の仕事について考えてください。頭のなかに方程式があったら、時間の過ごし方について違う選択をしていたと思いますか？

自分はマネージャーではないので、もう少し自分の環境に置き換えて読むと「私のアウトプット + 私が影響を与えた他の人のアウトプット」辺りを振り返ることになると思う。反省すると他の人のアウトプットに対してどこまで自分が責任を持つか、その線引きがとても下手な気がします。口出ししすぎてもうるさいし、放置しすぎても意味がない。

ただ、他の人に与えられた良い影響を振り返るって良いですね。自分が自分の仕事を単に頑張る以外になんか増やせると良いと思うので、これを継続してみたいと感じます。

- 先週何をどういう形で人助け、直接に間接にできたか


- こんなことを尋ねて話を進めてみると良いらしい
    - あなたが胸を張れる実績は何ですか？ 普段もそう感じますか？ それとも特別ですか？
    - あなたが成長したいと言っているその分野ですが、どうやったらできると思いますか？ 私にサポートできることは何でしょうか？
    - 今やっている仕事は、ここ数年と比較してどの程度やりがいがありますか？ 自分を成長させ、新しいことを学習する機会は十分にありそうですか？
    - 5 年前に自分の考えていたことと比べて、現在の自分の役割はどうですか？ それはなぜですか？

- ダニング＝クルーガー効果

https://www.smbc-comics.com/?id=2475

- ダニング＝クルーガーとインポスター症候群 を振り返る。
    - ここで、今学んだ2つの心理学上の概念について考え、自分の身に起きた状況と対応させてみましょう。
    - 馬鹿の山の上にいたのは、直近ではいつですか？ どのようにして山を下りましたか？

ある分野の入門編を読んでみて、試してみて、うまくいったあと、実際にお仕事に立ち向かった際に全然レベルが違うな―、みたいな話になることは多々ある。それはようやくお仕事に慣れても変わらない。

## まとめ

[「エンジニアリングマネージャーのしごと」を読んで、マネージャーの楽しさを学ぶ #読書 - Qiita](https://qiita.com/e99h2121/items/316530888c25d9961642) の通り、以前読んだ時には表面をさらっただけに過ぎなかったものが、読み直すと気づきがあるので、過去の自分の感想文と答え合わせしてみることもオススメ。

以上です～
WooCommerce で注文がCheckout Blockで作られた注文かどうかの判定方法

WooCommerce が現在標準でCheckout Blockを利用してカートや支払いページが動くようになったのですが、決済後の表示などに関して、クラシックと違う場合があるので、Store APIをいじるよりも表示のフック等で区別した方がシンプルで分かりやすいので、注文単位でCheckout Block経由の注文かどうかを判断した時の方がいい場合の対応ほうを共有します。
ちなみに注文が出来上がった後となりますので、process_payment以降的に考えた方がいいです。

## $order->get_created_via() を使う。

注文オブジェクトで使える関数 get_created_vi で判別が出来ます。
ブロックで作られた注文もしくは REST API で作成された場合は'store-api'となります。
クラッシックチェックアウトで作られた注文は'checkout'となります。

```php: functions.php
// $order は \WC_Order オブジェクト
if ( $order->get_created_via() === 'store-api' ) {
    // この注文はブロック版のチェックアウトで作られた
}
```

DB的な情報としては、データベース上では HPOS を利用して、post の `post_type` が `shop_order_placehold` の場合は以下で設定されています。

テーブル: wp_wc_order_operational_data
フィールド: created_via

post の `post_type` が `shop_order` の場合で注文データに post データを利用している場合は、投稿メタに以下のように登録されます。
テーブル: wp_postmeta
キー: _created_via
Java Gold 合格体験記

# この記事の対象者
JavaGoldって難しい、2~3カ月かかると思っている人

# 結果
![スクリーンショット 2025-02-23 043523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780724/812c72f5-8c8f-48e8-8aa0-f887b3d4b2a1.png)

# 最適な勉強法
今回は試験を振り返ってもっとこうしておけば短期間で合格できたのにという圧倒的後悔の観点でお伝えします。結論、「黒本の章末問題を丸暗記+そこそこ理解」だけで余裕合格できます。まず75%は約束できます。だまされたと思ってこれだけを徹底してください。それ以外の各章の問題は本当に解かなくていいです。これを信じて準備すれば一週間で合格できます。私はGoldという名前にビビッて28日かかりました。

「そんなわけないでしょ～」、「難しいって言ってる人Youtubeでみたよ！」と思っている方...そうですよね、でも本当にそうなんです...もう少し説明します。試験問題は章末問題の変数名やメソッド名が変わっているだけで、コードの構造は何も変わりません。章末問題をやりこんだ人であれば、一問1秒以内に回答できます。私ですら試験時間残り1時間50分で退出しました。見直しもしていません。解答している途中から若干イライラしてきました。もっと別の勉強に時間を当てればよかったと。それほどまでに余裕、確信を持って合格できます。

:::note info 
*試験中の精神状態*
試験の序序盤「うわーなんかメソッド内めっちゃネストされてるーむずいかも...」、試験序盤「ん？なんか見たことあるような問題が徐々に出てきた！いけそう！」、試験中盤「あー...これ章末問題そのままだわ」、試験終盤「さっさと帰ろ(鼻ほじ)」
:::

# 大事だなーと思ったこと
試験難易度は上記の通り非常に易しいです。しかし問われている内容そのもの自体は非常にためになります。しかも世間の評価は高め、コスパ最高です。是非受験してください。
データサイエンティストを目指した理由【志望動機】をまとめてみた

# はじめに
現在、慶應義塾大学修士2年で大手企業のデータサイエンティスト職としての就職が決まっているタランチュラです。

この記事では、これからデータサイエンティストとしてのキャリアを目指そうとしている方々に向けて、僕がなぜデータサイエンティストを志望したのか、その理由やきっかけをまとめたいと思います。

実際の就活でも書いた「データサイエンティスト志望理由例」もまとめたので、ぜひ就活前に参考にしてみてください！

また、僕は統計や機械学習に関する情報を日々Xでも発信していますので、興味のある方はぜひフォローしていただけると嬉しいです。

https://x.com/tarantula_ds_/

今後の就職活動やスキル習得の参考に、少しでもお役に立てれば幸いです。

# データサイエンティストの志望理由
### 興味を持ったきっかけ
僕がデータサイエンティストを志望した理由は、大学2年生のときに受けたPythonプログラミングの授業がきっかけでした。

もともと、なんとなく理系科目が得意で理系大学に進学していたものの、特別にやりたい仕事があったわけではなく、「でも将来は理系の仕事に就きたいな」という程度の考えでした。大学の授業も全般的に退屈だなと感じることが多かったのですが、プログラミングの授業だけは違いました。自分でコードを書き、動かして結果を得る過程が面白く、もっとできるようになりたいと初めて思えたのです。

### エンジニアインターン

そこから「プログラミングを活かす仕事」に興味を持ち、「エンジニア」と「データサイエンティスト」という職種にたどり着きました。しかし、どちらも聞いたことはあるけれど、具体的な仕事内容はよくわかりません。

そこで実際の業務経験を積むことで見極めたいと考え、まずはソフトウェアエンジニアのインターンシップに参加しました。インターンでは、技術を素早くキャッチアップし、チーム開発をスムーズに進める力が身についた一方で、「かなり技術に特化している職種だな」という印象を受けました。もちろん技術的探求も楽しかったのですが、もう少しビジネス領域に踏み込んだ形で自分のスキルを活かしていきたいと感じるようになったのです。

### データサイエンティストインターン

そこで次にデータサイエンティストとしてのインターンに挑戦してみました。ここでは、さまざまなアプローチやアルゴリズムを組み合わせてデータを分析し、その分析結果から示唆を得て、さらにその示唆を資料にまとめて報告するという一連の流れを体験できました。

データ分析からビジネス上の示唆を導き、それをわかりやすく可視化・伝達するプロセスが、ものすごく楽しく感じられたのを今でも覚えています。
加えて、これまで理系として学んできた統計や数学の知識がそのまま役立つ場面が多かったことも嬉しかったです。「自分の理系知識を活かしつつ、ビジネスにも貢献できる」データサイエンティストには、まさにそんな魅力が詰まっていると実感しました。

このように実務を通じて、自分の得意分野であるプログラミングや統計、数学をフルに活かしつつ、ビジネスの最前線に近い立ち位置で働けるのがデータサイエンティストの大きな魅力だと感じるようになりました。

それが今の僕がデータサイエンティストとしてキャリアを歩みたいと思う理由となっています。

# ESに書いた志望理由例
僕が実際にESに書いたデータサイエンティストの志望理由例を個人が特定されないよう一部改変してお見せします。少しでも皆さんの参考になれば幸いです。

### 志望理由
私はデータから価値を創出し、ビジネスや社会へ大きなインパクトを与えられるデータサイエンティストを志望する。なぜなら、大学でのプログラミングの授業を通じてエンジニアリングの面白さを知り、統計や数学といった理系の知識を活かしながら、ビジネスにより近い形で貢献できる職種に大きな魅力を感じたからだ。ソフトウェアエンジニアのインターンで技術開発力を養った一方、よりビジネス視点を取り入れて幅広い課題にアプローチできるデータサイエンティストこそ、自分が本当にやりたい道だと確信した。実際にデータサイエンティストのインターンに参加し、データ分析から示唆を導き、成果をレポートとしてまとめる一連のプロセスに大きなやりがいを感じた。特定のアルゴリズムを駆使するだけでなく、業界構造やビジネスモデルへの深い理解が分析の説得力を高めることを実感し、データサイエンティストとしての専門性にはドメイン知識が不可欠だと痛感している。今後は特定ドメインの知識を強化し、ビジネスとテクノロジーの懸け橋として付加価値を生み出せるデータサイエンティストを目指したい。また、「この業界といえば◯◯」と呼ばれるような存在となり、社会に新たな価値をもたらす挑戦を続けたいと考えている。

### ポイント
+ **論理構成（PREP法）を意識した流れ**
最初に主張（Point）を提示し、理由（Reason）を述べ、具体例や経験談（Evidence）で裏付け、最後に結論（Point／Conclusion）を再提示することで、読み手にわかりやすく伝える。
+ **志望する理由を具体的に**
大学での授業やインターンシップなど具体的な経験をもとに、「なぜデータサイエンティストなのか」を説得力のある形で述べる。
+ **実践的な経験で裏付ける**
ソフトウェアエンジニアとデータサイエンティスト双方のインターンを経験したことでの学びを具体的に示す。
+ **今後の展望を示す**
特定ドメインの知識を強化して、分析の説得力を高めたい」「業界で◯◯と呼ばれるようなデータサイエンティストを目指したい」など、今後のキャリアビジョンを具体的かつ力強く述べる。

# おわりに
最後まで読んでいただき、ありがとうございます。少しでも「データサイエンティストになりたい」という皆さんの参考になれたのであれば、とても嬉しいです。もし役立つ情報があったと感じていただけたら、ぜひ「いいね」を押してもらえると励みになります。

また、Xでも統計や機械学習の情報を発信していますので、気になる方はフォローしていただけると嬉しいです。

https://x.com/tarantula_ds_/

これから就職活動に臨まれる方々が、納得のいくキャリアを築けるよう心から応援しています。皆さんの就職活動がうまくいくことを願っています！
.emlファイルをHTMLに変換するVBS

# 動機

HTMLメールを開けない環境でどうにかしてHTMLとして表示させたい用事があったので
VBSで作ってみた。

# つかいかた

eml2html.vbsにemlファイルをD&Dすると、元ファイルと同じ場所にHTMLが作成されます。

# ソースコード

```vb:eml2html.vbs
' コマンドライン引数処理
If WScript.Arguments.Count = 0 Then
 WScript.Echo "Usage:eml2html.vbs <eml_file_path>"
 WScript.Quit
End If

' 引数からファイルパスを取り出す
sPath = WScript.Arguments(0)

' ADODB.Streamオブジェクト、CDO.Messageオブジェクトをロード
Set oStream = CreateObject("ADODB.Stream")
Set oMsg = CreateObject("CDO.Message")

' emlファイル読み込み
oStream.Open
oStream.Charset = "UTF-8"
oStream.LineSeparator = 10
oStream.LoadFromFile sPath
oMsg.DataSource.OpenObject oStream,"_Stream"
oStream.Close

' HTMLファイル出力
oStream.Open
oStream.Charset = "UTF-8"
oStream.LineSeparator = 10
oStream.WriteText oMsg.HTMLBody, 1
oStream.SaveToFile Replace(sPath,".eml",".html"), 2
oStream.Close

' 終了処理
Set oMsg = Nothing
Set oStream = Nothing
```
スライドパズルを自動で解くプログラムを作ってみた

# スライドパズルを自動で解くプログラムを作ってみた

## はじめに

スライドパズル（15パズルなど）を自動で解くプログラムを作成しました。本記事では、その実装について解説します。

## コード

以下が今回作成したスライドパズルの自動解決プログラムです。

```javascript
xx=Z-1;
l=[],d=[...p];
mp=n=>{
	f=d.filter((_,i)=>i%z==n%z);
	((t=n/z|0)-(s=xx/z|0))||(d.splice(xx,1),d.splice(xx=n,0,"x"));
	if(/x/.test(f)){
		f.splice(s,1),f.splice(t,0,"x");
		for(i=n%z;i<Z;i+=z)d[i]=f[i/z|0];
		xx=n
	}
}

if(d[4]==1)[6,0,1,4,3,0,1,2,8].forEach(e=>{mp(e);l.push(e)});
while(d[0]!=1)[6,0,2,8].forEach(e=>{mp(e);l.push(e)});
if(d[3]==2||d[6]==2)[6,3,5,8,6,3,5,8].forEach(e=>{mp(e);l.push(e)});
while(d[1]!=2)[7,1,2,8].forEach(e=>{mp(e);l.push(e)});
while(d[2]!=3&&d[5]!=3)[6,3,5,8].forEach(e=>{mp(e);l.push(e)});
if(d[2]!=3)[6,0,2,5,4,1,0,6,8].forEach(e=>{mp(e);l.push(e)});
if(d[3]!=4||d[6]!=7){
	while(d[3]!=7)[6,3,5,8].forEach(e=>{mp(e);l.push(e)});
	while(d[6]!=4&&d[5]!=4)[7,4,5,8].forEach(e=>{mp(e);l.push(e)});
	if(d[6]==4)[6,3,4,7,8,5,3,6,8].forEach(e=>{mp(e);l.push(e)});
	[7,4,5,8,6,3,5,8].forEach(e=>{mp(e);l.push(e)});
}
while(d[4]!=5&&d[5]!=6)[7,4,5,8].forEach(e=>{mp(e);l.push(e)});

ii=0;
setInterval(()=>{if(ii<l.length)m(l[ii++])},200);
```

## コードの解説

### 基本的な動作

このコードはスライドパズルを解くために、以下のような手順を踏みます。
1. `mp(n)` 関数を使用して、指定した位置に対してピースの移動を行う。
2. 事前に決めた手順に沿って移動を繰り返し、パズルを解く。
3. `setInterval` により一定の時間間隔で動作を実行し、アニメーション的にパズルを解く様子を再現。

### 主要な変数

- `xx`: 空白の位置を管理する変数。
- `l`: 解答手順を記録するリスト。
- `d`: パズルの状態を表す配列。
- `mp(n)`: 指定された位置 `n` に対して、空白ピースを移動させる関数。

### 解法の流れ

1. `if(d[4]==1)` によって、中央のピースの処理を行う。
2. `while(d[0]!=1)` で、左上のピースを正しい位置に移動。
3. `if(d[3]==2||d[6]==2)` で、2のピースを適切な位置に移動。
4. `while(d[1]!=2)` で、上段のピースを適切に配置。
5. その他の条件を満たすように順次移動を行う。
6. `setInterval` を使って、計算結果に従いパズルを解いていく。

## まとめ

今回の実装では、スライドパズルを効率的に解くために、事前に決められたパターンに基づいてピースを移動させました。シンプルなロジックでありながら、自動的にパズルを解く様子を見ることができるので、興味のある方はぜひ試してみてください。

### 今後の改善点
- より一般的なパズルサイズ（4×4 など）に対応。
- 最短手数を求めるアルゴリズムの実装。
- Webアプリとしての実装。

今後もスライドパズルの解法について研究していきます！
定期的に鐘を鳴らして計画的に煩悩をなくそう(Python)

毎年、年越しギリギリに煩悩を無くすなんて無計画だと思いませんか？
今ならまだ間に合います。これを期に計画的に煩悩をなくしましょう。

# Step.1 今日の日付を取得
まずは今年があと何日残っているか調べます。
そのために今日の日付を取得しましょう。

```
import datetime
```

これをインポートしておけば日付、時刻関連の関数を使うことができます。

```
datetime.date.today()
```

今日の日付をdate型で得る関数はこれですね。
``` py
import datetime
print(datetime.date.today())
```

これを実行すると

```
2025-02-23
```

上手くいきましたね。

# Step.2 今年の大晦日の日付から今年の残り日数を取得
次に大晦日の日付から今日の日付を引くことで今年の残り日数を取得します。

```
datetime.date(year,month,day)
```
この関数で指定した日付をdate型で取得できます。
たとえば

``` py
import datetime
print(datetime.date(2020,1,1))
```
なら

```
2020-01-01
```
となります。そして今年の西暦をint型で取得する関数
```
datetime.date.today().year
```
を組み合わせることで
``` py
import datetime
print(datetime.date(datetime.date.today().year,12,31))
```
```
2025-12-31
```
今年の大晦日の日付をdate型で取得できます。
この関数からStep.1の関数を引くことで
``` py
import datetime
thisyear=(datetime.date(datetime.datetime.today().year,12,31)-datetime.date.today()).days
print(f"今年は残り{thisyear}日です")
```
```
今年は残り311日です
```
となります。

# Step.3 残り日数を108で割る
あとは残り日数を108で割ることで一日に何個煩悩を消せば年明けに間に合うか計算できます。
``` py: bonnou.py
import datetime
thisyear=(datetime.date(datetime.datetime.today().year,12,31)-datetime.date.today()).days
print(f"今年は残り{thisyear}日です")
print(f"1日{thisyear/108}個煩悩をなくせば間に合います、頑張りましょう。")

```
```
年は残り311日です
1日2.8796296296296298個煩悩をなくせば間に合います、頑張りましょう。
```
ばっちりですね。
皆様も計画的に煩悩をなくしていきましょう。
Internxt を使い始めた

Internxt は新興クラウドストレージだ。スペインにある。FOSS で運用され、常時 E2EE であり、安い。数年前は安定性に難があったようだが最近はあまり問題ないように見える。
E2EE と Lifetime プランを備えたクラウドストレージとしては pCloud が評判がよく運用実績もある。日本でもユーザーを拡大しているようだ。当初は85%オフだった価格は最近では50%オフとなっている。容量と価格だけ見るなら Internxt に分がある。
今回は85%オフの30%引きの 154USD (約23,000円)で Lifetime 5TB を買った。円高を待ってもよいが、浸透価格政策が終わる可能性もある。2TBなら91USDだったが余裕を見て5TBとした。さすがに10TBは持て余すだろう。
アクセスには Web か専用アプリを利用することになるが、CLI も用意されている。CLI ではローカル WebDAV プロキシーサーバーを立ち上げることができる。他のアプリからでも Internxt ストレージへアクセスできる。WebDAV のため標準では他ホストから接続するにはサーバー証明書に難があるが、サーバー証明書を差し替えれば他ホストから WebDAV 接続できる。5TBの NAS を接続したような感じで便利だ。ただ E2EE の関係もありレイテンシーが大きい。おとなしく GUI (アプリ) か Web で使った方がよいかもしれない。
elseと結合する術式

C言語等に搭載されている制御構文の書き方についての記事ですよ。題名の通り、主に`else`について色々。
```c:一般的
if(a)return;
else if(b)break;
else if(c)continue;
else d();
```
構造的にはこんなのとか…
```c:字下げ
if(a)return;
else if(b)break;
	else if(c)continue;
		else d();
```
こうなるはずなんですが
```c:字下げ+改行
if(a)return;
else
	if(b)break;
	else
		if(c)continue;
		else d();
```
しかしこういう状況でわざわざ`else`を字下げしたり、`else`と`if`を大きく切り離す書き方はあまり見掛けません。`else if`は連続しても上下で同じ階層に揃える事が多いのです。私の場合は階層が深くなるのを嫌って、やはり冒頭の一般的な書き方にしています。
pythonに至っては`elif`を使って字下げを深くしないようにしている?くらいです。
ならば`else if`だけ、などという固定観念を捨ててはどうでしょうか。例えば…
```c
if(a)return;
else for(;;){
	F();
	if(b)break;
	else do{
		F();
		if(c)continue;
		else switch(s){
			case 0:
				if(d)return;
				else while(e){
					F();
				}
			case 1:break;
		}
		F();
	}while(f);
	F();
}
```
といった具合です。`else if`同様に、階層(字下げ)を1つ分省略できる利点があります。気持ち悪いでしょうか? ならばよし!
ASUS Prime X299-A IIのUEFI BIOSのスクリーンショットをとる

最近個人のPCでタイトルにあることの方法を調べたので備忘録です。

結論から言うとこの型では **F12** ボタンを押すとPCに指しているUSBメモリに保存できます。

「ASUS Prime X299-A II」のマニュアルに書いてありました。

https://www.asus.com/jp/motherboards-components/motherboards/prime/prime-x299-a-ii/helpdesk_manual?model2Name=Prime-X299-A-II

記載箇所：日本語版マニュアルp3-6
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123353/f96d85b8-743a-4435-8d36-644c90726196.png)

bmp形式で保存されます。

# スクショ例

Qiitaがbmp画像貼れなかったので貼れる形式に変換したもの貼ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123353/28dc219a-7417-41ec-a337-7d633be13c98.png)
📢【2025年版 フリーランスの爆発的成長戦略！収益最大化の超実践ガイド】

📌 **フリーランスの成功は「スキル」だけでは足りない！**  
✅ クライアントに選ばれる人と、選ばれない人の決定的な違い  
✅ **「スキル × 影響力 × ブランディング」** の3つが収益を分ける！  

📌 **今すぐ実践すべき3つの行動！**  
1️⃣ **Twitterで学びを発信し、認知度を高める**  
2️⃣ **Qiita・Noteで専門知識を記事化し、検索流入を狙う**  
3️⃣ **ポートフォリオを整備し、「この人に頼みたい！」を作る**  

📌 **まとめ！**  
2025年は **「スキル＋影響力＋ブランディング」** でフリーランスの収益が変わる！  
👉 **詳細はこちら！** 🔽
JSTQB FL試験対策

# JSTQB Foundation Level 試験勉強法

## 私が実践した主な勉強方法

### 1. シラバスを読み込むこと
JSTQBのシラバスを徹底的に読み込み、試験範囲を把握します。最初は知らない単語が多く戸惑うかもしれませんが、その都度調べて章ごとにまとめることで理解が深まります。面倒に感じるかもしれませんが、確実に知識を定着させるために重要なプロセスです。<br>

### 2. テス友アプリで9割正答率を目指す
テス友のアプリを活用し、9割の正答率を達成するまで繰り返し学習しました。ただし、問題を暗記してしまうリスクがあるため、他の問題集にも触れることをおすすめします。<br>

### 3. 黒本「徹底攻略」を試験2週間前に実施
試験の2週間前に黒本「徹底攻略」を活用し、異なる形式の問題に触れることで自信を深めました。必須ではありませんが、試験本番での対応力を高めるために有効だと感じました。<br>

## 試験対策スケジュール

- **勉強期間:** 約1か月  
- **学習時間:** 毎日1〜2時間  

### 学習の流れ
1. シラバスを読み、単語を調べながら理解を深める
2. テス友で演習を重ねる
3. 黒本で補強する

---

以上が、私が実践したJSTQB FLの試験対策です。  
再来年あたりに、AL（Advanced Level）も合格したいですね！
【Vue3】 deep セレクターを使用してcssを子コンポーネントに反映する

## deep セレクターを使用する

https://ja.vuejs.org/api/sfc-css-features#deep-selectors

```vuejs
<style scoped>
:deep(.child) {
  width: 1000px;
}
</style>
```

style scoped で定義したcssは当該ファイルの全てのタグにdata-v-xxxxxx属性が設定される。
> 子コンポーネントのルートノードは親のスコープ付き CSS と子のスコープ付き CSS の両方の影響を受ける

つまり子コンポーネントのトップレベルのタグには両方のdata-v-xxxxxx属性が設定される。

※なぜかルートノードなのに親タグの属性が付与されない場合がある。
その場合は更にルートとしてdiv等を追加してやると解決する。

## レンダリング後のCS
* deepを使用しない場合（scopedなのでファイル内の要素が対象）
```vuejs
.child[data-v-2e51c661]
```
* deepを使用した場合
```vuejs
[data-v-2e51c661] .child
```

## コンポーネント構成によるスタイルの適用パターン

### Pages内のコンポーネントに使いたい場合、かつルートノードにスタイルを適用したい場合
```vuejs
.child,
:deep(.child) {
  width: 1000px;
}
```

Pages内のvueファイルでdeepをつけても、
page内に置かれたタグ、コンポーネントのルートノードには適用されない。
cssクラスが設定されたタグの親に[data-v-2e51c661]の属性がつかないため。

### コンポーネント内の子コンポーネントに使いたい場合
```vuejs
:deep(.child) {
  width: 1000px;
}
```

コンポーネント内であればそのタグ、子コンポーネントのルートノードには適用される。

### ルートノードにスタイルを適用しない場合（Pages内、コンポーネント内問わず）

```vuejs
:deep(.child) {
  width: 1000px;
}
```
ルートノードに適用対象がなければdeepをつけておけば全て適用される
ABC394個人的備忘録

ケアレスミスで順位を4000位落とした男の備忘録です

### コンテスト概要
鹿島建設プログラミングコンテスト2025（AtCoder Beginner Contest 394）

https://atcoder.jp/contests/abc394

開催日:2025年2月22日 21:00-22:40

## [A - 22222](https://atcoder.jp/contests/abc394/tasks/abc394_a)
#### 考察
文字列の2の数を数えてその分だけ出力。でもいいし、forをまわして2以外をはじいて出力でもいい。

#### 提出
``` c++:A.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
    string s;
    cin >> s;

    for(auto x:s){
        if(x == '2') cout << x;
    }

    cout << endl;
}
```

## [B - cat ](https://atcoder.jp/contests/abc394/tasks/abc394_b)
#### 考察
どうせ文字列は長くないので50のvectorを作り、vec[i]に長さiの文字列を入れる。あとは適当につなげて出力。

#### 提出
``` c++:B.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
   int n;
   cin >> n;

   //はじめから文字で初期化
   vector<string>num (51,"");
   for(int i=0;i<n;i++){
     string s;
     cin >> s;

     num[s.length()] = s;
   }
   //なかった奴は勝手になかったことに。
   for(auto x:num) cout << x;
   cout << endl;    
}
```

## [C - Debug](https://atcoder.jp/contests/abc394/tasks/abc394_c)
#### 考察
例えばWWWAの時
WWWA→WWAC→WACC→ACCC
Aの前にある連続するWの数だけ処理が行われる。
なので今ある先頭のAからできる限りの操作を行えばOK

#### 提出
``` c++:C.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
    string s;
    cin >> s;

    //外を参照しないようダミーを入れておく
    s = 'X' + s + 'X';

    int len = s.length();
    for(int i=0;i<len;i++){
        if(s[i] != 'A') continue;　//Aじゃないなら無視
        for(int j=i-1;j > -1;j--){
            if(s[j] != 'W') break;//Wがないなら終わり
            s[j] = 'A',s[j+1] = 'C';
        }
    }

    //ダミー以外を出力
    for(int i=1;i<len-1;i++) cout << s[i];
    cout << endl;
    
}
```

## [D - Colorful Bracket Sequence](https://atcoder.jp/contests/abc394/tasks/abc394_d)
#### 考察
全　て　の　元　凶
stackにカッコを入れてペアができたら取り出す。これを繰り返しstackが空ならYes、そうでないならNo。という非常にシンプルな問題。
なのだが、()　だけでなく　)(　も取り出すというケアレスミスを発動。しかもWAが1のためコーナーケースと思い込み後回しに。なんと50分のロス。
もう笑っちゃうね。

#### 提出
``` c++:D.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
    map<char,char>mp;
    //対応する形をメモ
    mp['>'] = '<',mp[']'] = '[',mp[')'] = '(';

    string s;
    cin >> s;
    
    stack<char> que;

    for(auto x:s){
        //からだったり始まりカッコなら挿入
        if(que.empty()) que.push(x);
        else if(x == '<' || x == '[' || x == '(') que.push(x);
        else{
            if(que.top() == mp[x]) que.pop();
            else que.push(x);//ペアなら取り除く
        }
    }

    if(que.empty()) cout << "Yes" << endl;
    else cout << "No" << endl;
}
```
## [E - Palindromic Shortest Path](https://atcoder.jp/contests/abc394/tasks/abc394_e)
#### 考察
方針が何も思いつきませんでした

## [F - Alkane](https://atcoder.jp/contests/abc394/tasks/abc394_f)
#### 考察
4次以上の頂点に興味があって4次なら周り全部、それ以上ならより良い4つを採用という形でDFSをするもWA1。何が違うってんだ。

## 結果
ABCD(1)　4完 67:40

順位　6083位
パフォーマンス　536

## 感想
ここ2回でrate100も溶かしたって本当ですか！？
ミスがなければ2300位だったのも絶望を加速させる。
ちょっとケアレスミスが続きすぎて水色が遠のいていく。
📢 【2025年版 フリーランスの成功戦略：収益UP＆案件安定獲得の全手法】  

📌 2025年、フリーランス市場の競争が更に激化！  
✅ AI・クラウド・DXの発展で、**スキルだけでは案件獲得が難しくなる！**  
✅ **「スキル × 影響力 × ブランド力」で市場価値を高める！**  

📌 成功するフリーランスの3大戦略！  
1️⃣ **Twitter & Qiita & Noteで情報発信 → 認知度UP！**  
2️⃣ **ポートフォリオを充実させる → 高単価案件獲得！**  
3️⃣ **スキルの専門性を明確化 → 他のフリーランスとの差別化！**  

📌 セルフブランディングを強化する方法！  
✅ **Twitterで毎日1投稿し、技術・学びを発信！**  
✅ **Qiita・Noteで検索流入を意識した記事を書く！**  
✅ **継続的な発信で「専門家ポジション」を確立！**  

📌 まとめ！  
2025年は **「スキル＋発信力＋ブランド」** がフリーランス成功の鍵！  
**本記事では、実践的なセルフブランディング戦略を徹底解説！**
今更ながらRustのtoolchainとtargetの違いに気がつく

先日、msys2とおさらばしました。Cドライブの空き容量が700MBしかなかったからです。
そしてmsys2を消したあとに気が付きます。「あれ、ウチのRustって`x86_64-pc-windows-gnu`だよな」と。
案の定、`-lgcc`が見つからないという旨のエラーを吐くのでした。

## C++のコンパイラを入れよう

ただ、このままmsys2を使うとCドライブがもう一回死ぬだけなのは自明なので、llvm-mingwを使うことにしました。
普通のmingwでも良かったのですが、C/C++を書くときにはclangを使いたいので...。

https://github.com/mstorsjo/llvm-mingw

## targetを追加しよう

`cargo new`して`cargo run`したら、`-lgcc_eh`がないと言われました。llvm-mingwを使用しているからです。gcc関連のものはclangにはないので...。
しかし、Rustには`x86_64-pc-windows-gnullvm`というtargetがあります。
これを使うことで、`llvm-mingw`でも動くようになります。

```sh
rustup target add x86_64-pc-windows-gnullvm
cargo run --target=x86_64-pc-windows-gnullvm
```

`config.toml`に書き込む方法でもOKですが、`gnullvm`を使いたい場合は毎回指定しなくてはならないようです。

## そして気づくtoolchainとtargetの違い

本題の`toolchain`と`target`についてですが、`toolchain`はコンパイラの話で、`target`は何のバイナリを作るかです。

### toolchain

自分がどんなコンパイラたちを使うか。Winだと`x86_64-pc-windows-msvc` `x86_64-pc-windows-gnu`があります。
toolchainによって、デフォルトのtargetが決まるようです。msvcを使った場合、明示せずにビルドした場合のtargetはmsvcになります。gnuも然り。おそらく他もそうです。

### target

主にクロスコンパイル用。作業しているOSがWinでもMacでもLinuxでも、何ならAndroidでもOK。好きなデバイスへ向けたバイナリを作れます。

もし、toolchainの垣根を超えたければ、targetを指定することで行けます。
ウチのrustのtoolchainはgnuですが、gnullvmに向けてバイナリを作っています。これもある種のクロスコンパイルかもしれません。

### 気づいたこと

ターゲットのあるものはツールチェインもあるもんだと思ってました。
この２つを見るとだいぶ違うなって思いますね。

https://forge.rust-lang.org/infra/other-installation-methods.html
https://rust-lang.github.io/rustup-components-history/

また、どうやらtoolchainによって若干挙動が異なるようです。

Winだとgnuのほうが速いけどmsvcのほうがバイナリは小さいとか。
Linだとgnuよりmuslのほうが依存性の少ないバイナリが作れるとか？

そのあたりの情報はどこにも発信されてないっぽいので、未知の領域です。

---

この辺が役に立つかも。

https://github.com/sharkdp/fd/issues/726

https://users.rust-lang.org/t/rustup-difference-between-toolchain-and-target/49051
📢 【2025年版 フリーランスの成功戦略：収益UP＆案件安定獲得の全手法】

📌 2025年、フリーランス市場の競争が更に激化！
✅ AI・クラウド・DXの発展で、スキルだけでは案件獲得が難しくなる！
✅ 「スキル × 影響力 × ブランド力」で市場価値を高める！

📌 成功するフリーランスの3大戦略！
1️⃣ Twitter & Qiita & Noteで情報発信 → 認知度UP！
2️⃣ ポートフォリオを充実させる → 高単価案件獲得！
3️⃣ スキルの専門性を明確化 → 他のフリーランスとの差別化！

📌 セルフブランディングを強化する方法！
✅ Twitterで毎日1投稿し、技術・学びを発信！
✅ Qiita・Noteで検索流入を意識した記事を書く！
✅ 継続的な発信で「専門家ポジション」を確立！

📌 まとめ！
2025年は 「スキル＋発信力＋ブランド」 がフリーランス成功の鍵！
本記事では、実践的なセルフブランディング戦略を徹底解説！
📢 【フリーランスの成功法則：セルフブランディング × 高単価案件獲得】

📌 2025年、フリーランス市場の競争が更に激化！
成功の鍵は 「スキル × 影響力 × ブランド力」 の掛け合わせ！

✅ 成功しているフリーランスの特徴
🔹 「この人に頼みたい！」と思わせる専門性の確立
🔹 SNS・ブログでの情報発信を継続し、知名度をUP
🔹 案件単価を高めるためのブランディング戦略

📌 今すぐできる3つの行動！
1️⃣ Twitterで学びや技術を毎日発信
2️⃣ QiitaやNoteでブログ記事を定期更新
3️⃣ ポートフォリオを作成し、自分の実績を可視化

💡 スキルを磨くだけでなく「発信力」も武器にする時代！
本記事では、具体的なセルフブランディング戦略を徹底解説！
ros2_arucoの導入

get ros2_aruco
```
# ワークスペースの作成
mkdir -p ~/sendai_ws/src
cd ~/sendai_ws/src

# ros2_aruco パッケージのクローン
git clone https://github.com/JMU-ROBOTICS-VIVA/ros2_aruco.git -b humble

# 依存関係のインストール
sudo apt-get update
sudo apt-get install ros-humble-tf-transformations
pip install opencv-contrib-python==4.6.0.66

# ビルド
cd ~/sendai_ws
colcon build

```
🚀 SQLポケットガイドから学ぶ！業務を効率化するSQL実践テクニック3選

## この記事を読んで欲しい人
SQLの書き方次第で、データ抽出や集計のパフォーマンスは大きく変わります。本記事では、[SQLポケットガイド 第4版](https://amzn.asia/d/b06qMHW) を基に、すぐに実務で役立つSQL効率化テクニックを厳選して解説します。

## 💡 テクニック①：クエリの記述順序と実行順序

#### 🎯 クエリの課題：

「2020年以降に雇用された従業員が所属する部署のIDとその人数を、降順で表示してください。」

#### ✅ 正解クエリ（記述順序）：
```sql
SELECT d.department_id, COUNT(e.employee_id) AS employee_count
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.hire_date >= '2020-01-01'
GROUP BY d.department_id
HAVING COUNT(e.employee_id) > 0
ORDER BY employee_count DESC;
```

#### ⚙️ 実行順序（データベース内部の処理フロー）：
	1.	FROM: employeesテーブルを取得
	2.	JOIN: departmentsと内部結合
	3.	WHERE: 2020年以降の雇用者を抽出
	4.	GROUP BY: department_idごとにグループ化
	5.	HAVING: 人数が1人以上の部署を抽出
	6.	SELECT: 必要なカラムを取得
	7.	ORDER BY: 人数の降順で並べ替え

#### ✨ ポイント:
SQLは記述順と実行順が異なるため、処理の流れを理解することで効率的なクエリが書けます。

## 🚀 テクニック②：PL/SQLで実現する高度なロジック

SQLは**何を取得するか**を記述する宣言型言語ですが、
OracleのPL/SQLを使えば、**どのように処理するか**を細かく制御できます。

#### 📝 SQLとPL/SQLの違い
| 項目	| SQL (宣言型)	| PL/SQL (命令型)| 
|:-----------:|:------------:|:------------:|
| 目的	| データ抽出や操作	| 手順制御や複雑なロジックの実装| 
| 制御構造	| 不可	| IF、LOOP、CASEなどが使用可能| 
| エラー処理	| エラー時に即中断	| 例外（EXCEPTION）で安全に処理続行| 
| 処理単位	| 1つのSQL文	| ブロック単位で複数の処理を一括実行| 


#### 🌟 PL/SQL活用例：給与判定（IF文）

```sql
DECLARE
    v_salary NUMBER;
BEGIN
    SELECT salary INTO v_salary FROM employees WHERE employee_id = 101;
    IF v_salary >= 8000 THEN
        DBMS_OUTPUT.PUT_LINE('高収入');
    ELSE
        DBMS_OUTPUT.PUT_LINE('標準');
    END IF;
END;
```

⚡ 効率化ポイント:
	1.	ロジック制御: 条件分岐やループをSQL内部で実装可能
	2.	エラー対応: 例外処理（EXCEPTION）により安全性向上
	3.	一括処理: ブロック単位で複数のSQLを効率的に実行

PL/SQLを使うことで、SQL単体では難しい高度な業務ロジックをデータベース内で直接実現できます。

## 🛠 テクニック③：CTE（共通テーブル式）で複雑なクエリをシンプルに

SQLで複雑なデータ抽出を行う際、ネストされたサブクエリは可読性を下げ、メンテナンス性を悪化させます。これを解決するのが **CTE: Common Table Expression**です。

#### 📝 CTEの概要
•	WITH句を使って一時的な仮想テーブルを作成
•	複数回参照が可能で、冗長な記述を削減
•	クエリを段階的に分割し、理解しやすく保つ

#### 💡 CTE活用例：高給与者を抽出し、さらに名前で絞り込む
```sql
WITH high_salary AS (
    SELECT employee_id, first_name, salary
    FROM employees
    WHERE salary > 8000
)
SELECT * 
FROM high_salary
WHERE first_name LIKE 'A%';
```

#### ⚙️ 実行の流れ:
1.	WITH句: high_salaryという仮想テーブルを作成
2.	メインクエリ: high_salaryに対してfirst_nameで条件絞り込み

#### 🚀 効率化ポイント
1.	可読性向上: クエリを論理的なブロックに分割
2.	パフォーマンス改善: CTEは内部的に最適化され、同じ処理の繰り返しを回避
3.	メンテナンス性: ロジック変更時にクエリ全体を修正せずに済む

CTEを使えば、長大なSQLをスリム化し、保守性と実行効率を同時に高められます。

## 🌟 まとめ：SQL効率化で業務を加速しよう！

今回紹介したテクニックを活用することで、SQLのパフォーマンスを向上させるだけでなく、可読性や保守性も飛躍的に向上します。

💪 効率化の鍵:
	1.	実行順序の理解: 不要な処理を減らしてパフォーマンス改善
	2.	PL/SQL: 複雑なロジックをデータベース内で直接実行
	3.	CTE: クエリの見通しを良くし、メンテナンスを簡単に

SQLは「ただ書ける」だけでなく、最適に書けることが重要です。ぜひこれらのテクニックを習得し、業務効率を大幅に向上させましょう！
AWS で必要最小限の権限、を求められた時

# 必要最小限の権限？
よく求められますよね。
しかし、AWS のドキュメントをひっくり返して全部読むのも苦行です。

## そうだ、作ったあとに追いかければええやん

AWS には AWS Cloudtrail という API を叩いたらログが残る仕組みがあります。
そして、AWS Cloudtrail は Amazon Athena というログを SQL で追える仕組みがありますよね。

であれば、~~AdministratorAccess~~ 必要最小限の権限のユーザーやロールで実行したあと、そのエンティティが叩いた API を記録すれば！？

という感じでこんな SQL で回収できました。

```sql
select
  useridentity.sessionContext.sessionIssuer.username,
  eventsource,
  eventname,
  requestparameters
from 
  {Cloudtrail のテーブル}
where
  awsregion = {REGION}
  and eventtime like {2025-02-22T12:0% 的な時刻を絞る}
  and useridentity.sessionContext.sessionIssuer.username = {IAM のエンティティの名前}
```

必要に応じて distinct とかいろいろしましょうね

ちゃんちゃん
「電脳少女プログラミング2088 ─壊レタ君を再構築─」やってみた

# はじめに
プログラミングゲームなるものに興味があった中、qiitaとのコラボ企画があったので、挑戦してみました。
楽しみながら学べることに期待です。

# 開始
どうやら、<font color="red">サイボーグとなって壊れてしまった幼馴染を治す</font>ために、プログラミングのスキルを駆使していくようです。

![スクリーンショット 2025-02-22 204037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/da129763-9771-4e9c-8592-a292f4c01cd0.png)

エリアを選択して、さっそく挑戦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/fb260fac-5bef-45c8-b3f7-7764c77d2794.png)

まずはEランクから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/186918fe-e878-49db-bc85-7be89c56b544.png)

EASYだけあって、選択式で簡単ですね。正解は１番。Pythonに詳しくない私でも気楽に答えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/a427f905-a5d8-4cf9-8a98-4e6d68ff137e.png)

チュートリアル以降で入手したパーツで修復してみたところ、頭だけの頃から一気に修復が進みました。
<font color="blue">頭～性格まで、全8種の部分を変更</font>できるようですが、これは楽しいかも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/963c05e7-6f4e-49d8-ae77-c9138cb19fe3.png)

# 二問目以降
続いて二問目 **「チップの合計金額を出力する問題」**  。ここからは、コードを記述するみたいです。以下画像の左側が問題、右側が解答コードとなります。せっかくなので、Pythonで続けてみましょう。経験があまりないので、調べながらやってみます。


`input()`で入力を受け取り、`print()`で出力するコードのよう。最初はそのまま`print()`で受け取ったのですがうまくいかず、`int(print())`のようにint型で受け取るようにしないと文字列で受け取ってしまうみたいでした。

以下のように、うまくいったようで動作確認成功（右下）。<font color="red">**動作確認できるのが、トライ&エラーしやすくてとても良いです。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/c1a98fba-25cc-47c9-b5ab-532942529206.png)

コードはこちら。今回は慣れていなかったので一行ずつinputで取得しましたが、for文や配列を用いればもっと簡潔に解答できそうです。

```python
input_line = int(input())
n1 = input_line
input_line2 = int(input())
n2 = input_line2
input_line3 = int(input())
n3 = input_line3

n=n1+n2*5+n3*10
print(n)
```

ちゃんとテストケースを用いてコードが正しいか判別してもらえます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/879c0b15-b917-4dff-bbb7-40397c5def85.png)

無事成功し、新たなパーツもゲット！物々しい雰囲気の頭部パーツでした（笑
それにどうやら、提出したコードなどによってレイミの反応も変っていくみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/84d79fb4-a9aa-49ae-ad3e-f415c28b97e2.png)


その後も何問か挑戦し、pythonでは<font color="blue">**for文を使うときなどにインデントが重要**</font>なことであったり、<font color="red">**配列に対してmax()を使うと配列内で最大の数値を取得できたりする</font>ことを知りました。

何度かクリアしていくと、抽選でパーツを入手できるようで、性格を入手できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/07169451-9fb8-416a-a79d-0ae68495474d.png)









# 終わりに

今回は初めてということで、Dランクの問題に **何問か挑戦**してみました。結果、レイミは以下のような格好に。<font color="blue">割とサクサクパーツ入手できるので、モチベーションも続きやすくてよかった</font>です。
楽しみながら新たな言語に触れられるという点では、問題も入門レベルから始まって順を追って学んでいけるので素晴らしかったです。
SQLの問題や、高ランクの問題も残っているので、次はそこら辺も挑戦してみたいところです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/6b7c0adf-e4c8-4d85-8997-5f0dcbac2867.png)
ABC394をPythonで（A～D）

鹿島建設プログラミングコンテスト2025（AtCoder Beginner Contest 394）の解答等の速報的まとめ

https://atcoder.jp/contests/abc394



# A問題
https://atcoder.jp/contests/abc394/tasks/abc394_a

2の個数の分だけ2を繋げて出力する
```python:A
print("2"*input().count("2"))
```

# B問題
https://atcoder.jp/contests/abc394/tasks/abc394_b

長さ順でソートして繋げる
```python:B
print(*sorted([input()for _ in[0]*int(input())],key=len),sep="")
```

# C問題
https://atcoder.jp/contests/abc394/tasks/abc394_c

後ろから順にWAをACに置換する
```python:C
s = list(input())
for i in range(len(s) - 2, -1, -1):
    if s[i] + s[i + 1] == "WA":
        s[i], s[i + 1] = "A", "C"

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

# D問題
https://atcoder.jp/contests/abc394/tasks/abc394_d

スタックを使ってペアができるか調べる
```python:D
s = list(input())

stack = []
for s_i in s:
    if stack and stack[-1] + s_i in {"()", "[]", "<>"}:
        stack.pop()
    else:
        stack.append(s_i)

print("No" if stack else "Yes")
```
ラズパイが出力する乱数のエントロピーを推定

ラズパイが出力する乱数のエントロピー(どのくらいバラバラかを表す値)を推定してみました。

- **３**つの乱数生成方法について確認
- **２**つのOSバージョンで確認
- **１**ＭＢ出力にかかる時間も確認

## 確認した乱数３種
<dl>
<dt>/dev/hwrng</dt>
<dd>ラズパイに搭載されているハードウェア乱数生成器の出力</dd>
<dt>/dev/random</dt>
<dd>疑似乱数生成機能（高品質）による出力</dd>
<dt>/dev/urandom</dt>
<dd>疑似乱数生成機能（高速）による出力</dd>
</dl>

## 確認したOSバージョン
/dev/randomの動作が Linuxカーネルのバージョン5.6以降は変わっているとのことなので、以下の２つのOSで確認しました。
- Raspbian 10 Buster (Linux kernel 4.19)
- Raspberry Pi OS 12 Bookworm (Linux kernel 6.6)

https://ja.m.wikipedia.org/wiki//dev/random

## 結果

| OSバージョン | hwrng | random | urandom |
|:-:|:-:|:-:|:-:|
| Raspbian 10 Buster<br>Linux kernel 4.19 | 15.0s<br>(6.638) | 37.1s<br>(7.218) | 2.6s<br>(7.163) |
| Raspberry Pi OS 12 Bookworm<br>Linux kernel 6.6 | 14.9s<br>(7.334) | 2.0s<br>(7.207) | 2.0s<br>(7.241) |

- 各セルの上段は1MB出力の所要時間、下段は出力データの8bit当たりのエントロピー(8に近い方がバラバラ)
- Bookwormでのrandomの実行時は、CRNGは準備済となった後でブロックは発生していないと思われる
- /dev/hwrngの出力がOSのエントロピープールに使われているかどうかは不明（特に設定はしていない）

### 分かったこと

- いずれも優秀
- /dev/randomは、確かに動きが変わっている

## 確認方法

### 処理時間の確認方法

```shell-session
administrator@raspberrypi:~ $ sudo dd if=/dev/hwrng of=/dev/null bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB, 977 KiB) copied, 14.689 s, 68.1 kB/s
administrator@raspberrypi:~ $ sudo dd if=/dev/random of=/dev/null bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB, 977 KiB) copied, 1.9735 s, 507 kB/s
administrator@raspberrypi:~ $ sudo dd if=/dev/urandom of=/dev/null bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB, 977 KiB) copied, 1.93535 s, 517 kB/s
administrator@raspberrypi:~ $
```

### エントロピーの確認方法

NIST SP800-90B に記述されているエントロピー推定方法をPythonで実行できるようにしたパッケージ```sp800_90b```を利用しました。

https://github.com/hnj2/sp800_90b

#### 1. ラズパイにDockerをインストール
Docker公式の [Install using the convenience script](https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script)のぺージで紹介されている以下コマンドでDockerをインストール
```
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```
また、sudoなしでDockerコマンド実行できるようにするため、以下ページを参考にしてDockerグループにユーザを追加

https://qiita.com/sakagucchi/items/92dc2ddc4f286405077e

#### 2. 必要なパッケージをインストールしたDockerコンテナを起動

以下のDockerfileを作成
```Dockerfile
FROM python:3
RUN apt update && apt install -y \
    libbz2-dev \
    libdivsufsort-dev \
    build-essential \
    && rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir sp800-90b
WORKDIR /mnt
CMD ["bash"]
```
Dockerfileからイメージをビルドする
```
docker image build -t my-sp800_90b:latest -f Dockerfile .
```
コンテナを起動
```
docker run --rm -it -v {ホストのデータ格納場所}:/mnt my-sp800_90b
```

#### 3. pythonコンソールで読み込んだファイルのエントロピーを出力
```python
>>> import sp800_90b
>>> f = open('/mnt/data_by_hwrng.bin','rb')
>>> r = f.read()
>>> rd = sp800_90b.Data(r)
>>> rd.h_initial()
7.333765872584084
>>> f = open('/mnt/data_by_random.bin','rb')
>>> r = f.read()
>>> rd = sp800_90b.Data(r)
>>> rd.h_initial()
7.2074744569771845
>>> f = open('/mnt/data_by_urandom.bin','rb')
>>> r = f.read()
>>> rd = sp800_90b.Data(r)
>>> rd.h_initial()
7.240992233664618
>>>
```

以上です。
整数の積と比較！Number()

整数の積と比較！Number()の落とし穴

Paizaの「A × B ≦ C」を判定する問題に挑戦したんだけど、`Number()`を入れ忘れて大失敗…。前にも「差と積」の問題で同じミスをしたのに、またやらかした😂 そんな学びをブログにまとめたよ！

ミスったコード
```js
const [A, B, C] = line.split(" "); 
console.log(A * B <= C ? "YES" : "NO");  
```

これはA, B, Cが文字列のままなので、計算が正しく動かない！
修正後のコード
```js
const [A, B, C] = line.split(" ").map(Number);
console.log(A * B <= C ? "YES" : "NO");
```
`map(Number)`を使えば一発で数値に変換！シンプルで読みやすい！

この手のミス、初心者あるあるじゃない？僕は2回やらかしたけど、もう忘れない…はず💦

 → [paizaで基本マスター](https://paizabeginner.wordpress.com/2025/02/22/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-%e4%b8%89%e8%a7%92%e9%96%a2%e4%bf%82%e3%82%82%e3%82%b9%e3%83%83%e3%82%ad%e3%83%aa%ef%bc%81%e6%95%b0%e5%80%a4%e6%af%94%e8%bc%83/)