2025年10月9日木曜日

Sinatra4.2.0にアップデートしたらホームページが動かなくなったので対応した

Sinatra4.2.0にアップデートしたらホームページが動かなくなったので対応した

私のホームページはSinatraでできています

背景

Sinatra が 4.2.0 になり PATH_INFO の扱いが変わりました https://github.com/sinatra/sinatra/compare/v4.1.1...f53a68482f3d5a1a868320f5da3ca7e14bfd8fdf

それに伴いルーティングの定義を仕方も変わったのでそれに対応しました

結論

ちゃんと get '/' do ... end を使いましょう

仕組み

自分のホームページは各ページをクラスとして定義しています
例えば /about を管理するページは以下のようにクラス化されています

# frozen_string_literal: true

require './libs/ogp'
require './controllers/base_page'

# 自己紹介ページのルーティングを定義するクラス
class AboutPage < BasePage
  def initialize
    @path = '/' # config.ru 側でパスを指定するのでここはすべて / になる
    @real_path = '/about' # sitemap 生成用のパス
    @tpl_name = :about
    @title = 'About @kakakikikeke'
    @description = '興味のある分野、職歴、資格について紹介しています'
    @image = OGP::DEFAULT_IMAGE
    @sitemap = { priority: 0.8 }
    super(@real_path, @sitemap)
    routing
  end

  def routing
    AboutPage.get @path do
      @ogp = OGP.new(@title, @description, @path, @image)
      erb @tpl_name
    end
  end
end

でこのクラスを config.ru で Rack::URLMap を使って読み込み

# frozen_string_literal: true

require './libs/routing'

run Rack::URLMap.new(Routing.definition)

展開しています

# frozen_string_literal: true

Dir[File.expand_path('../controllers', __dir__) << '/*.rb'].sort.each do |file|
  require file
end

# ルーティングを定義するモジュール、ちゃんとメニューの順番と同じになるようにrouting.jsonを定義すること
# また動的に生成するページは各Pageクラス内で定義すること
module Routing
  def self.definition
    JSON.parse(File.read('./routing.json'))['routing'].map do |info|
      [info['path'], Module.const_get(info['class']).new]
    end.to_h
  end
end

今回の現象

上記のように展開すると本来は 200 が返るのですがなぜか 404 になるようになってしまいました

対応策

で結果的に対応策は以下のようになりました
各ページで定義しているルーティング情報をメソッド内で呼び出すのではなくちゃんとクラス配下に定義してあげるようにしています

# frozen_string_literal: true

require './libs/ogp'
require './controllers/base_page'

# 自己紹介ページのルーティングを定義するクラス
class AboutPage < BasePage
  PATH = '' # config.ru 側でパスを指定するのでここはすべて空になる

  def initialize
    @real_path = '/about' # sitemap 生成用のパス
    @tpl_name = :about
    @title = 'About @kakakikikeke'
    @description = '興味のある分野、職歴、資格について紹介しています'
    @image = OGP::DEFAULT_IMAGE
    @sitemap = { priority: 0.8 }
    super(@real_path, @sitemap)
  end

  AboutPage.get PATH do
    @ogp = OGP.new(@title, @description, PATH, @image)
    erb @tpl_name
  end
end
  • @path を PATH として定数にする
  • かつ PATH は必ず空にする
  • routing メソッドを削除し get を直接クラス配下に定義する

これで一応動作するようになりました

おまけ: Rack::Lint::LintError: uppercase character in header name: Content-Security-Policy (Rack::Lint::LintError)

CSP ヘッダなどをミドルウェアで定義する場合は大文字を使ってはいけないようです

# frozen_string_literal: true

require './libs/routing'

# 静的ファイルに対するヘッダーを設定するミドルウェア
class StaticHeadersMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)

    path = env['PATH_INFO']
    if path =~ %r{^/(robots\.txt|favicon\.ico|img/|js/|css/|ipa/)}
      headers['content-security-policy'] ||= "default-src 'self';"
      headers['cross-origin-embedder-policy'] ||= 'require-corp'
      headers['cross-origin-opener-policy'] ||= 'same-origin'
      headers['cross-origin-resource-policy'] ||= 'same-origin'
      headers['permissions-policy'] = 'camera=(), microphone=(), geolocation=(), fullscreen=(self)'
    end

    [status, headers, body]
  end
end

use StaticHeadersMiddleware

run Rack::URLMap.new(Routing.definition)

最後に

メソッド内で get などを定義すると実際にアクセスされた際にルーティングの定義が見つからずエラーになるようです

2025年10月1日水曜日

ボットは絵も動画もブログも作成できるようになった

ボットは絵も動画もブログも作成できるようになった

人生とはボットを育てることなのかもしれない

これまで

https://blog.kakakikikeke.com/2025/04/kakakikikeke-die-twice.html

自分のツイートを学習させて自分っぽいツイートができるようになりました

アカウント

https://x.com/kakakikikekebot

現在のボットにできること

2025/09/26 現在ボットは成長し以下ができるようになりました

  • ツイートをする
  • ブログを書く
  • 絵を書く
  • ショート動画を作る

以下それぞれの仕組みを詳細に説明します

共通点

  • 動作マシンはローカルの M2 Pro mac mini
  • バックエンドでは「CPU50%のマイニング」「Ollamaサーバの起動」「SD-webui」が稼働している
  • 生成時は MPS にすべて対応しているものを採用
  • Python で実装
  • 生成時間は動画以外数分で完了 (絵、文章系)

ツイートをする

Twitter API + Ollama API (gemma3)

  • 自分のツイートを500件準備、そこから20件をプロンプトのコンテキストとして与える
  • ツイートを生成してもらうようなプロンプトを入力
  • レスポンスをパース、サニタイズなど調整してからツイート
  • ハッシュタグやリンクなどは含めないようにしている
  • プロンプトは以下
def build_prompt(past_tweets, sample_size=20):
    examples = "\n".join(random.sample(past_tweets, sample_size))
    return f"""以下は過去のツイートです:

----ここから過去のツイート----
{examples}
----ここまで過去のツイート----

これらの文体や話題を参考にして、あなたらしい新しいツイートを1つ生成してください。
日本語でかつ文章の意味がわかるような自然なツイートにしてください。
ツイートに「https://」から始まるようなURLは絶対に含めないでください。
ツイートの長さは50文字以内にしてください。
ツイートを作成した理由などは説明しないください、ツイートのみ生成してください。
"""

ブログを書く

Twitter API + Blogger API + Ollama (gemma3)

  • テーマを与えてそのテーマに基づいたブログ記事を書いてもらう
  • 出力は必ずHTMLになるようにプロンプトで調整、デフォルトがMarkdownっぽいので可能な限りMarkdownにならないようにする
  • テーマはランダムで100件保持、100件分のテーマを消費すると停止する
  • テーマはChatGPTに生成してもらっている
  • プロンプトは以下
def build_prompt_for_blog_post(theme):
    return f"""以下はブログ記事のテーマです。

----ここからテーマ----
{theme}
----ここまでテーマ----

このテーマを参考にして、あなたらしい新しいブログ記事を1つ生成してください。
ブログ記事内では Markdown 記法は使えません、Markdown 記法は自動で HTML に変換されません。絶対に Markdown 記法を使わないでください。
ブログ記事は Markdown 記法を使わずに生成してください。
ブログ記事内では HTML タグが使えます。
コードなどシンタックスハイライトが必要な場合は HTML タグを使ってください。
ブログ記事に画像は含めないでください。
ブログ記事内に StyleSheet や CSS の記述を含めることは可能ですがブログ本体の StyleSheet や CSS に影響を与えないようにしてください。
ブログ記事を作成した理由などは説明しないください、ブログ記事の内容のみ生成してください。
"""

絵を書く

Twitter API + Stable Diffusion WebUI API (model はランダム)

  • SD-Web UI を API モードで起動してそれをコールする
  • SD-Web UI の命令はそのまま JSON のペイロードとして API に送信できるので楽
  • 生成された画像のサイズは896x1152
  • モデルは固定ではなく10個ほど保持しておりそれを順番に使用していくように Python 側で制御
  • プロンプトもランダムになるようにしておりベース、性別、向き、服装、背景など要素ごとに毎回ランダムで生成するようにしている
def generate_prompt():
    # プロンプトの定義
    base = "masterpiece, best quality, ultra-detailed, 8k, cinematic lighting"
    gender = "".join(
        ("1 beautiful japanese young women, fair skin, light makeup, realistic face")
    )
    viewpoint = get_random_viewpoint()
    posing = get_random_posing()
    hair_cut = get_random_hair_cut()
    hair_color = get_random_hair_color()
    hair = f"{hair_color} {hair_cut}"
    face = get_random_face()
    background = get_random_backend()
    tops = get_random_tops()
    bottoms = get_random_bottoms()
    clothes = f"{tops}, {bottoms}"
    return "".join(
        f"{base}, {gender}, {viewpoint}, {posing}, {hair}, {face}, {background}, {clothes}",
    )

ショート動画を作る

Twitter API + Stable Diffusion WebUI API + LTX-Video (txv-2b-0.9.8-distilled)

  • text-to-video ではなく image-to-video の手法
  • 先に SD-WebUI を使って画像を作成してもらう
  • その画像を使って LTX-Video で動画にする
  • 256x384の4秒動画を作成 (num_frames=121、frame_rate=30)
  • 4秒以上の動画を生成する場合は192x256にすれば生成できる
  • 本当は896x1152で生成したいがリソースが足りない
  • 動画の生成はほぼマシンリソースをすべて使うので生成前にマイニングおよび ollama の runner を停止している
  • 各種プロセスを停止しないとメモリが枯渇してほぼ100%クラッシュする
  • 1動画生成するのに20-60分ほどかかる
  • 生成時間にムラがありおそらく入力している画像の影響だと思われるが安定しない
  • LTX-Video をサブプロセスとしてコールしているのでその作りが微妙
def convert_image_to_video(
    img_filename: str, width: int, height: int, prompt: str = ""
) -> Optional[str]:
    # 環境変数からパスを取得、設定がなければデフォルト値を使用
    work_dir = os.getenv("LTX_WORK_DIR", "/Users/kakakikikeke/Documents/work/LTX-Video")
    img_dir = os.getenv("LTX_IMG_DIR", "/Users/kakakikikeke/data/repo/videobot")

    # 仮想環境の Python を直接指定
    venv_python = os.path.join(work_dir, "env", "bin", "python")

    # 実行コマンド
    command = f"""
    cd {work_dir} && \
    PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 \
    {venv_python} inference.py \
    --prompt "{prompt}" \
    --conditioning_media_paths {img_dir}/{img_filename} \
    --conditioning_start_frames 0 \
    --height {height} \
    --width {width} \
    --pipeline_config configs/ltxv-2b-0.9.8-distilled.yaml
    """

今後追加したい機能

  • 音楽の作成
    • AudioGen
    • RVC
  • 長めの動画
    • 今のマシンだと画像サイズを落としてフレーム数を上げるしかない
    • もっと軽量なモデルを探す
    • 本当はWan2.2やVeo3レベルの動画を生成したい
  • 俳句
    • gemma3 でプロントプト換えるだけ
  • 音楽+動画
    • 上記で生成した音楽と動画を何かしらで組み合わせる
    • 最終形はこれなのかもしれない
  • 昔の写真や自分で書いた絵を動画にしたい
    • 過去の復元
    • 手書きの絵 -> アニメ化 -> 動画化
  • NanoBanana 連携
    • 有料だとかなり強力
    • というかお金を使う前提ならローカルで全部動かさないで Google AI Studo API や Colab でガンガン動かして高品質、高画質、長尺コンテンツを作りまくれる
    • ただマネタイズ考えないと大変なことなりそう
    • 動画にするだけならVeo3でもいける

課題

  • Twitter API Free プランの上限
    • 500ツイート/1日にほぼ当たっている
    • 有料プランにすれば解決するがどうするか
    • コンテキスト(メディア系、テキスト系)にアカウントを分割するか、管理は面倒になる
  • Ollama で動作させるモデル
    • gemma3 はだいぶ軽量なので動作する
    • gpt-oss のような大規模LLMは動作しない (動作はするがスワップだらけでかなり遅くなる)
    • openhermes など試したがハッシュタグや無駄に絵文字を使うのでやめたりした
    • いいモデルを探すのが難しい
  • プロンプトだけで制御するのには限界がある
    • 含めないでと命令しても含めてくる
    • モデルに合ったプロンプトを調整しなければいけないのが辛いのでなんとかしたい (プロンプト最適化など)
  • プロンプトのパターン追加
    • テーマなど手動の部分があるので自動化したい
    • 絵を描く際のプロンプトのランダム抽出の候補を追加する
    • そもそも完全ランダムにする方法を考える
  • 絶望的にマシンスペックが足りない
    • やはり AppleSilliocn だとかなり辛い
    • 基本は RTX などの CUDA が使えるグラボがあることが前提 (xformers動作など)
    • 動画生成は特に VRAM を消費するので VRAM モリモリのグラボがないと厳しい (Wan2.2など)
  • ディスクも足りない
    • ローカルにモデルを置きまくっているのでディスクが枯渇する

最後に

多少の知識はいるが生成系は本当に楽な時代になった

2025年9月10日水曜日

NanoBanana の API を試す

NanoBanana の API を試す

ちゃんとこういうテック記事も投稿しないとダメだなと思い試しました
Python を使っています

環境

  • macOS 15.6.1
  • Python 3.12.11
    • google-genai==1.35.0
    • pillow==11.3.0

準備

必要なライブラリをインストールします

  • pipenv install google-genai
  • pipenv install pillow

google-generativeai は Deprecated なので注意してください
google-genai を使いましょう

API キーの取得

Google AI Studio (ここ)から生成しましょう

サンプルコード

比較的新しめの技術に関しては AI 先生に聞いても教えてくれないから公式ドキュメントを見るのが一番なんですよね

ファイルをアップロードして変換してもらうだけの簡単なスクリプトなのでリファクタなどはしていません

xxx の部分は上記で取得した API キーを入力してください

from io import BytesIO

from google import genai
from PIL import Image

client = genai.Client(api_key="xxx")

prompt = """
  背景を宇宙に変更してください。
"""
image = Image.open("reforg.jpeg")

# チャットクライアントの作成
chat = client.chats.create(model="gemini-2.5-flash-image-preview")
# イメージとプロンプトの送信
response = chat.send_message([prompt, image])

# 結果(テキストと画像)の取得、一応 pyright のエラーも対応
if response.candidates is None:
    raise

if response.candidates[0].content is None:
    raise

parts = response.candidates[0].content.parts
if parts is not None:
    for i, part in enumerate(parts):
        if part.text is not None:
            print(part.text)
        elif part.inline_data is not None and part.inline_data.data is not None:
            image = Image.open(BytesIO(part.inline_data.data))
            image.save(f"generated_image_{i}.png")

で入力した画像がこれで

出力された画像が以下です

すばらしい
特にレスポンスの速さがすばらしい

最後に

Google AI Studio の UI からだと制限があったりしてうまく画像が生成されないことがあるようなのでそんな場合は API を使いましょう

ただこれだとチャットというよりかは一問一答の会話なのでチャット的な感じでインタラクティブな感じにしたいのであればもう少し手を加える筆意ようがありそうです

それでもこれが無料で使えるのは本当に素晴らしいことだと思います

参考サイト

2025年9月9日火曜日

Nano Banana 試す

Nano Banana 試す

噂の NanoBanana を試してみました

元の画像の特徴を維持しながら自然言語でいろいろ変更を加えられるツールという印象です

画像の変換の経緯に意図はありません
顔ももっと細かく指定すれば表情などもいろいろ変えられそうです

元画像

この画像にいろいろ指示を与えて新しい画像を生成していきます

質問1: この絵をドット絵風にしてください

できた絵はこちら

質問2: 目がないのですが目を追加してイケモン風にしてください。髪型はシースルーマッシュにしてください

できた絵はこちら

質問3: 更にここから金髪でショートヘアにしてみてください

できた絵はこちら

質問4: 今度は服を変更してください、シンプルな白のTシャツにしてください

できた絵がこちら

質問5: Tシャツを脱いでムキムキマッチョにしてください

できた絵はこちら

質問6: 背景を追加したいです。トレーニングをするようなジムにいる背景にしてください

できた絵がこちら

質問7: アニメのように吹き出しでセリフを追加したいです。トレーニング後なので「いい汗かいたな」というセリフを追加してください

できた絵はこちら

最後に

これだけ元画像を変更しましたが無料でかつ1つのチャットのトークンの上限 32768 まではまだ達していませんでした (13218/32768)
まだまだ画像にいろいろな修正を加えられそうです

ちなみに Google Drive 連携していないとチャットは一時チャットとなり次回アクセス時にはチャットの履歴ごと画像も削除されているので保存したい場合は Google Drive 連携しましょう

自分は画像の変換しか試していませんが簡単なラフスケッチに与えた画像を元に絵を描いてもらうこともできるようです

https://note.com/konho/n/n651a24c2180b

控えめに言ってすごいです

ちなみに Exif には特に NanoBanana 固有の情報は含まれていませんでした

2025年8月28日木曜日

胃カメラメモ

胃カメラメモ

会社の健康診断のバリウム検査で慢性胃炎と診断されたので人生初の胃カメラ検査をしてきました
感想をメモします

料金

  • 4870円

やり方

  • 麻酔ありの口からにしました

処置時間

  • 準備から完了まで含めて3時間ほどかかりました
  • 鎮静剤の効果も自分は帰る頃にはなくなっていました

流れ

  • 処置室に行く前に準備室的なところに連れて行かれる
  • 胃をきれいにする?薬をコップ1杯分飲まされる
  • 点滴開始
  • ここでいろいろと説明される
    • 鎮静剤は処置室に行ってからいれる
    • 喉の麻酔もする
    • 喉の麻酔をすると唾液が飲み込めないので全部吐き出す
    • 鎮静剤を打つとしばらくフラフラになるので自転車とか車の運転はダメ
    • などなど
  • しばらくすると処置室に移動
  • 処置室で喉の麻酔スプレーをする
  • マウスピース装着
  • 鎮静剤投与
  • すっと眠り処置開始
    • 処置中はほぼ辛くはなかったが自分は多少意識がありカメラいれるときと抜くときはガッツリえづいた

結果

  • 軽度逆流性食道炎
  • 表層性胃炎

だそうです
ピロリ菌はいませんでした
どちらも生活習慣で治るため薬などの処方や再検査の必要性はなかったです (よかった)

その他メモ

  • 最初に飲んだ胃の薬のせいでしばらくおならがでます
  • 初回だったので自分はかなり緊張しましたが慣れれば楽勝かもです
  • 鎮静剤なしでやっている人は相当すごいと思います
  • 4,5人の看護師さんとお医者さんで処置してくれたのでだいぶ大掛かりな感じはしましたが安心感もありました

最後に

体は資本だね

2025年8月24日日曜日

アイリスオーヤマのドラム式洗濯機がぶっ壊れて少し大変になった話

アイリスオーヤマのドラム式洗濯機がぶっ壊れて少し大変になった話

洗濯機が壊れると日常のリズムがとんでもなく狂っちゃうのね

壊れたドラム式

三年前に購入したアイリスオーヤマのドラム式洗濯機が壊れました
具体的な症状は以下です

  • エラーコードLEが何をしても必ず出る
  • ドラムが回らない

(写真でアースや給水ホースが抜けているのは Amazon が回収する予定日だったためです、後述)

過去にメンテナンス方法を紹介しましたがこのメンテナンスを日常的に行っていました
使用頻度としては 2回/1日で朝と夜に洗濯します
また洗濯時は必ず乾燥も使っていました

この状況でほぼ3年で完全終了しました

とりあえず修理問い合わせ

https://www.irisohyama.co.jp/support/repair-fee-sim-large/washing-machine

最初に気づいておくべきでしたが問い合わせてから修理が完了するまでに2週間は見たほうがいいです
このときは即日で連絡が来て対応してくれるかなと思っていました

真夏のコインランドリーの往復

とりあえず問い合わせは完了したので洗濯できなかった洗濯物をコインランドリーに持っていて洗濯しました
ちかくのコインランドリーは洗濯のみの洗濯機が4.5kgしかなく2台使って洗濯しました

料金は1台200円で毎回400円使いました
料金は特に気にならなかったのですがとにかく真夏の炎天下のなかコインランドリーを往復するのが辛かったです
だいたい30分で洗濯は完了するので30分後に洗濯物を取りに行き帰ってきたら干し夕方に乾いたら取り込んでたたむという作業がとにかく辛かったです

このときは本当に乾燥機能付き洗濯機のありがたみが身にしみてわかりました

買い替えを決断しAmazonで購入

修理の問い合わせをしてもすぐに連絡が来ずコインランドリーの往復に疲弊していたのでもう購入を決断しました
購入したのはほぼ同サイズの縦型の日立の洗濯機でサイズ的にも同じレベルだったので購入しました
しかも Amazon なので配達は翌々日で「あーようやくコインランドリー地獄から抜け出せる」と安堵しました

搬入に備えて搬入経路を確保(いろいろと家具を移動)しあとは待つだけになりました

が、しかしなぜか搬入できず

うきうきで待っていた搬入日当日業者さんと対面して開口一番言われたのは「搬入できないです」でした

過去にドラム式やそれよりも大きい冷蔵庫も搬入してもらったのになぜか搬入できないの一点張りでした

言うに

  • 壁を傷つけて賠償くらいたくない
  • 我々は下請けなのでそのルールの元搬入できない

とのこと一応説得は試みたのですが全く折れる気配がなく時間の無駄だと判断して早々に退散してもらいました

おそらく Amazon で大型家電を購入すると配送する業者はランダム?的に決定しヤマトや佐川など引っ越し専門業者であれば保証があるため搬入してくれるっぽいです (詳細は不明)

で今回は完全にハズレの業者だっため搬入不可となってしまいました

確実な方法

そのとき搬入業者も言っていたのですが確実に大型家電を購入から搬入までしてほしいのであれば家電量販店で買うのが一番だと言っていました

おそらく家電量販店は搬入時のトラブルの保証がついている搬入業者と提携しておりもし搬入時に壁がぶっ壊れても保証してくれる保険があるからなのではと思いました

単純に感じるのは「全く同じ商品なのに Amazon だと搬入できないが家電量販店だと搬入できるのはなぜなのだろう」という思いなのですが自分たちの知らない裏の仕組みがありそのなぞのチカラによって搬入ができないのだと自分を納得させました

アイリスオーヤマの修理窓口から連絡

搬入できずに泣いていたところ数日前にメールで修理依頼した件が電話で折り返してきました
電話では

  • エラーLEの表示されている写真がほしい
  • 搬入経路のサイズを図って事前に送ってほしい

とのことでした
ドラム式の場合ドラムを回すモーターがダメになると完全交換らしく搬入できるかの確認のため事前に通路の幅などを測って送ってほしいとのことでした

でモーターがダメで交換になった場合は49500円かかるらしく新品購入よりも安く済むためこの電話が来たタイミングで修理を選択することにしました

当然ですが当日すぐに訪問修理の人が来てくれるわけではなく日程調整などで約そこから一週間かかると言われました
ただ訪問修理日に確実に直してくれるらしく Amazon からコノザマを食らった直後もあったのでその言葉を信じ一週間のコインランドリー往復マラソンを決断しました

訪問修理

結局訪問修理が来たのは電話が来た日からちょうど一週間後でした
この日まで Amazon に泣かされコインランドリーマラソンを頑張った自分にとってこの日は本当に待ち遠しい日になっていました

で結論から言うと

無事修理(交換)が完了しまたドラム式が使えるようになりました
今回は修理ではなく完全に別物に交換となりました
本当によかったです
料金も予定通り49500円でした
保証に入っていればもう少し安く済んだのかもしれませんがそもそも保証なしだったので仕方なしです

また当日はアイリスオーヤマの担当者ではなく配達の方だけだったので技術的な質問はできませんでした (設置箇所が希望箇所じゃなくて移動お願いしようとしたんだけどさすがに大変そうだったのであきらめました)
三年毎に50000円ほどかかるとなるとやはり次回壊れたときには別の洗濯機を購入したほうがいいかなと思いました

電話口で後日壊れた原因を教えていただけるかも聞いてみたのですが「ダメです」と言われました
原因がわかれば次回からは対策もしやすいと思ったのですがダメなようです

交換時に来た製品は FLK842-W というやつでした

今回の学び

ということでまとめると

  • Amazon で大型家電は購入しないほうが良い
    • 特に緊急時は
    • 搬入できるかできないかのガチャがあるため
  • 洗濯機の修理までには問い合わせから完了まで最低でも二週間は見たほうが良い
    • その間の代替策(コインランドリーなど)は把握しておいたほういい
    • 今回は一週間ほどだったのでかなりラッキーだったかなと思います
  • 洗濯機が壊れると日常のルーチンがだいぶおかしくなる
    • ストレスがとんでもなくたまる
    • 洗濯機の偉大さを感じることができた

最後に

Amazon で大型家電は搬入ガチャできるのだろうか、、
今回購入は当然キャンセルされたがまた同じ商品を購入したら別の業者が来て搬入してくれる的なことはあるのだろうか

2025年8月5日火曜日

Switch2 版ドラゴンクエストビルダーズ2プレイメモ

Switch2 版ドラゴンクエストビルダーズ2プレイメモ

とにかくカメラ視点をリセットできる機能がほしかった

価格

  • 2,739円

プレイ時間

  • 約70時間
  • シドーを倒しヤミヤミとマガマガのクリアまで

プレイメモ

  • 起動時のロードが長い
    • 新規マップ読み込み時のロードは長め
    • 一度読み込めばそこまで長くはない
  • マイクラではないがドラクエでもない
    • 始まっていきなり自由というわけではない
    • ドラクエのようにストーリーを進めていかないとできることや行けるところは広がらない
  • 龍が如く極のようにゲームが頻繁に落ちることはなかった
    • 一部ラグっぽい処理はあった
  • ラグくなるとき
    • ゆうしゃのはたを遠くから振ったとき
    • 仲間と引き連れてスターキメラに乗って高く飛んだとき
  • 操作が難しい
    • コントローラでやるのできつい
    • 主要4ボタンをすべて駆使しないといけないのが辛い
    • 基本はキーマウ操作を前提にしていそう
    • A に割り当てられている役割が多すぎて誤爆しまくる
  • ボスは弱い
    • 基本攻撃連打で勝てる
  • ストーリーも簡単
    • どこに行けばいいかだいたい教えてくれる
    • 風のマントが便利すぎ出しだいぶ序盤に手に入るのはありがたい
    • 他の人が建築してくれる
    • メインとなる島を3つ巡ってそれを中央の島に反映して終わり
    • メインででっかい建造物を作ってボスを倒せば次の島という感じのほぼ一本道
  • 船移動がだるい
    • ロードがある
    • 一度本島に戻らないと他の島にいけない
  • 素材島面倒
    • 素直に攻略サイトを見るのが吉
    • ザブザブ島の赤石鉱脈はそもそもマップ上にない場合があるのでやまびこの笛で反応しない場合は一度からっぽの島に戻ってからまたザブザブ島に戻ると反応する
  • NPC が優秀
    • ガンガン建築してくれる
    • だがうまく使いこなさないといけない
    • みみずんが耕してくれる条件は「土を敷く」「柵で囲う」「かかしを置く」
    • あと他の作業(特にかいたく)しているときはそっちの作業を優先するのか耕してくれない
  • 経過時間
    • モンゾーラクリア 18時間経過
    • オッカルムクリア 30時間経過
    • ムーンブルククリア 50時間経過
    • 破壊天体シドー 60時間経過
  • クリア後

最後に

マイクラのように建築をしたい人がやるにはオススメできるがドラクエをやりたい人にはオススメできない

シドーがものづくりできるようになるところは少し感動しました