モチベーション:

 読んでいると地域の位置関係が分からなくなってきたので、地図を作って整理したくなった。

 全て読み返すのも大変なので、Geminiに食わせて簡単な位置関係を出す。

方針:

 Geminiはスクレイピングできない仕様なのか、URL指定してもサイトの中身を見てくれないので、

 一旦ローカルに落として、解析してもらう。

手順:

1. 対象の小説をローカルPCにダウンロード

2. Geminiに食わせるための準備(htmlのままでもいいかも)

3. Gemini APIを使うための準備

4. Gemini実行

 

 

■1. 読みたい小説をローカルにhtml形式でダウンロード

curl --limit-rate 200K --retry-max-time 5 'https://ncode.syosetu.com/n0022gd/[41-102]/' -o '#1.html'

 

--limit-rate:

 あまり早く読み込むとサーバーに負荷がかかる?と応答が来なくなるかもしれないので

 ダウンロード速度を制限(意味はないかも)

 

--retry-max-time:

 リトライする場合、少し待つことでサーバー負荷を気持ち軽くなるかも

 

[41-102]:

 読みたい話数を指定。序盤は、同じ場所から動かないので、動きが出てくるところを抽出

 

#1.html:

[41-102]に対応する番号をそのままローカルに保存するファイル名にする

 

 

■2. Geminiに食わせるための準備

2-1. 102話まであるので、順に処理したいので全て3桁のファイル名にする

for i in `ls [4-9]*.html`; do mv $i 0$i; done

 

2-2. htmlファイルをtxtファイルに変換

$ cat get.py

from bs4 import BeautifulSoup

 

def process_files(start_num, end_num):

  for i in range(start_num, end_num+1):

    html_file = format(i, '03')+str(".html")

    txt_file  = format(i, '03')+str(".txt")

 

    with open(txt_file, 'w+', encoding='utf-8') as f_txt:

      with open(html_file, 'r', encoding='utf-8') as f_html:

        soup = BeautifulSoup(f_html, "html.parser")

        p_element = soup.select('p[id]')

        for contents in p_element:

          f_txt.write(contents.text+'\n')

 

start_num = 41

end_num = 102

process_files(start_num, end_num)

 

 

■3. Gemini APIを使うための準備

3-1. ライブラリのインストール: 

pip install google-generativeai

 

3-2. API keyの取得

以下サイトから、右上にある「APIキーを作成」ボタンをクリック。別ウィンドウにキーができるので、コピー

3-3. コピーしたキーを環境変数に設定

export GOOGLE_API_KEY="AIzaSyAx....."

 

3-4. Geminiに渡す内容を作成(無料版を使うので、gemini-2.0-flashを指定)

複数のテキストファイルを順番に読み込み、その内容を1つの大きな文字列に結合し、

最後にその文字列をGemini APIに送るためのプロンプトを組み立てる

 

$cat analyze.py

import os

import google.generativeai as genai

 

# Configure the API key from your environment variable

genai.configure(api_key=os.environ["GOOGLE_API_KEY"])

 

# Set the start and end file numbers

start_num = 41

end_num = 101

model = genai.GenerativeModel('gemini-2.0-flash')

 

# Combine the content of all text files

combined_text = ""

for i in range(start_num, end_num + 1):

    file_path = f'{i:03d}.txt'

    if os.path.exists(file_path):

        with open(file_path, 'r', encoding='utf-8') as f:

            combined_text += f.read() + "\n"

    else:

        print(f"Warning: File '{file_path}' not found. Skipping.")

 

# Construct the prompt for analysis

prompt_text = f"""以下の小説の内容を分析してください。

登場する地域名とその位置関係をリストアップしてください。

 

{combined_text}

"""

 

# Send the combined text to the Gemini API

if combined_text:

    try:

        response = model.generate_content(prompt_text)

        print("分析結果:")

        print(response.text)

    except Exception as e:

        print(f"An error occurred: {e}")

else:

    print("No file content to analyze. Please check your files.")

 

 

4. Gemini実行

$python3 analyze.py

 

 

本文の取得は以下のサイトのようにすればよかったのかな。

 

そもそもログインすれば、txtで落とせるのか。

 

EoF

LINEを使う。

 

方法:

0. bluetoothイヤホンをペアリングする

1. LINEのトーク画面下の入力欄の横にあるマイクをタップして、赤ボタンをタップして録音開始

2. iphoneから離れて適当にしゃべる

3. 緑ボタン(□)を押して、録音終了

4. 緑ボタン(▲)を押して、音声確認

5. 左のごみ箱マークで録音データを削除

 

解説:

iphoneに接続したbluetoothイヤホンのマイクが正しく動作するのかを確認したかったが、ブラウザや音声メモはイヤホンのマイクではなく、iphone自体が音声を拾っているっぽい。

電話やzoomでマイクテストをしたかったが、iphoneアプリのzoomにはマイクテスト機能が見当たらなかった。

LINEのマイクはbluetoothイヤホンをつなぐとiphone自体のマイクではなく、bluetoothイヤホンのマイクを使うみたい。

(念のため、録音時はiphoneから離れて録音。)

録音データは、相手に送らないので、削除。

(間違って送信しないように、keepメモか無人グループのトークルームで確認した。)

Global System for Mobile Communications Association

3GPPが定めた規格では統一されないベンダー間の方言を共通言語化して相互利用できるように取り組む組合

Geographic Information System

いくつものレイヤーにそれぞれデータを重ねて、地図上に情報を持たせる

UDPでweb通信する。複数セッション張る

クラスターなどで複数の装置で使い回すIPアドレス

Windowsで提供している通信フレームワーク

Fixed wireless access

事業者からの無線電波を直接オフィスや家庭に繋ぐ。

高周波数帯なので、障害物に弱い。