「三草山 (2025/11/20)」


本日は、大阪府 豊能郡 能勢町にある
三草山にやって来ました。






いやー、ここは綺麗な村ですね。


日本の棚田100選に選ばれたらしいです。





まずは滝王山に向かいます。



マイナー系の山なので、道はそこそこ険しい。
ナビアプリは必須。


1時間ほどで山頂に到着。


いいですね!この巨岩


山の山頂には、ほぼ必ず岩があります。
理由は ↓ で説明。


そのまま三草山へ。


三草山・山頂に到着。ここは平野になっています。


ここで豆知識。

「山頂に草が生えている」のは、
比較的に若い山です。


何故なら:

山と言うのは、雨風によって常に土が

 山の頭
  ↓
  ↓ 土
  ↓
 山の中腹
  ↓
  ↓ 土
  ↓
 山の麓

下へ、下へと流れ続ける。


下がりはすれど、
土が上がることは決してないので。

山頂は数百万年のゆったりペースで禿げ続け、
最終的には土は全て消え
岩だけが残る。




まぁ、要するに。


このように
 草が生えてる = 土が残ってる = 山が形成されてから時間が立ってない
 
 
この山は若い、と言うことが推測できるわけですね。





下山。




「AmongUs パズル (2025/11/17)」


いやー、面白いね。

TVアニメ グノーシア


内容は「人狼ゲーム」をSFライクにリメイクしたもの。
王道の展開がゆえに、安定して面白いデス。

今季のイチオシ。





いわゆる人狼のパズルがあります。





ルールを簡単に説明しますと
・モナリザが3枚ある。1枚が本物で、2枚は偽物。
・人物は8人いる。
・6人は村人で、正直者
・2人は人狼で、嘘をつく
・鑑定は一回のみ。


・この条件の元で、
 確実に、村人が勝つ必勝法
を見つけてください。



このクイズの難しいところは、
 「会話がわずか一回しかない」
ところ。
それで人狼を見つけてくださいってんだから。


無理っぽい気もしますが・・・
確かに必勝法はあります。



「Linux ブラウザ式クローラー 備忘録3 (2025/11/13)」



「"ブラウザの見ている画面"データをn分毎に自動セーブする」方法




三番目の手法。

Chromium (Chormeのオープンソース版)を
コンパイルし、
自分専用のブラウザ.exeを作る。


C#なら、Nugetから取得するのが一番簡単でしょう。



自分ブラウザ.exeは、当然。
自分自身が見ているhtmlデータを取得できるので、
そこからローカルファイルにセーブさせる方法です。


ただ。今はセキュリティ的に
ブラウザの要求がめっちゃ厳しくなって。

自作ブラウザでサイトにアクセスするって
ちょっと無謀かなぁ。




第四の方法。


ネイティブ・メッセージングを使う


これです!
私が見つけた最終的なソリューション。




ブラウザ拡張の中でも、
どれだけの行動が許されるか
いくつかレベルがありまして。

  Lv1. 新しいツールを追加する拡張
  Lv2. htmlを改変する拡張
  Lv3. 外部の.exeと通信する拡張

その中でも一番強力なのがLv3。
それがネイティブ・メッセージングです。

仕組みについては
FireFox用 開発者ドキュメント
を参照。




当然、セキュリティ的な懸念により。
簡単にはインストールできません。

"かなり"面倒な手順と。


以下の特殊なファイル等が必要になります。




foreground.js

//いわゆる「ブラウザ拡張」パート

async function loop()
{
  while (true)
  {
    let content = document.body.outerHTML.toString();
    browser.runtime.sendMessage(content);
    await new Promise(_ => setTimeout(_,1000*60));
  }
}

loop();






background.js


/*
セキュリティ的な規約上、
 foreground.jsが直接アプリケーションと
通信する事ができない。

必ずバックグラウンド・スレッドを通す必要がある。
*/

browser.runtime.onMessage.addListener(onForegroundMessage);

function onResponse(response) {}
function onError(error) {}
function onForegroundMessage(message)
{
  let sending = browser.runtime.sendNativeMessage("saver.py", message);
  sending.then(onResponse, onError);
}





manifest.json


/*
ブラウザ拡張が、どういった機能にアクセスするか。
ユーザー許可の申請。
*/
{
"manifest_version": 1,
"name": "Watcher",
"version": "1.0.0",
"icons": {"48": "icon.png"},
"browser_specific_settings": {"gecko": {"id": "foo@example.com","strict_min_version": "112.0"}},
"content_scripts": [{"matches": ["*://example.com/*",],"js": ["foreground.js"]}],
"background": {"scripts": ["background.js"],"type": "module"},
"permissions": ["nativeMessaging"],
"description": "NativeMessagingのブラウザ側"
}






saver.py


#background.jsは、このスクリプトと通信する。

#!/usr/bin/env python3


import sys
import json
import struct
import datetime

def getMessage():
  rawLength = sys.stdin.buffer.read(4)
  if len(rawLength) == 0:
    sys.exit(0)
  length = struct.unpack('@I', rawLength)[0]
  message = sys.stdin.buffer.read(length).decode('utf-8')
  return json.loads(message)

def encodeMessage(message):
  content = json.dumps(message, separators=(',', ':')).encode('utf-8')
  length = struct.pack('@I', len(content))
  return {'length': length, 'content': content}

def sendMessage(message):
  message = encodeMessage(message)
  sys.stdout.buffer.write(message['length'])
  sys.stdout.buffer.write(message['content'])
  sys.stdout.buffer.flush()
  
message = getMessage()

with open("input.txt", 'a') as f:
  f.write(message)
sendMessage("reply")






parser.exe


/*
saver.pyはinput.txtに
.html全体を保存するので、
ほとんどは冗長データ。

ここで必要な数値だけを取り出して
正式な.csvへ保存する。
*/

var content = System.IO.File.ReadAllText("input.txt");





コード解説:

 ブラウザで見てる画面 → ブラウザ拡張 → foreground.js → background.js → saver.py → parser.exe


これでようやく!

ブラウザデータの外部持ち出し / ローカルファイル保存に
成功しました。(^^A;





いやー、大変でした。

結果だけを見れば、この
 ネイティブ・メッセージング
が答えだったのですが。


そこに辿り着くまでに悪戦苦闘。

 ・マクロ?
      ↓ 失敗
      
 ・クリップボード?
      ↓ 失敗
      
 ・ダウンロード?
      ↓ 失敗
      
 ・ブラウザ拡張で、外部送信?
      ↓ 失敗
      
 ・自作プロキシー?
      ↓ 失敗
      
 ・自作ブラウザ?
      ↓ 失敗
      
 ・その他にも色々・・・
      ↓ 失敗
 
 ・ネイティブ・メッセージング!


あの手この手で、
ブラウザの中に隔離されてる
データを取り出そうと。

200時間ぐらい手法を探しまくったと思います。