「三草山 (2025/11/20)」
本日は、大阪府 豊能郡 能勢町にある
三草山にやって来ました。
いやー、ここは綺麗な村ですね。
日本の棚田100選に選ばれたらしいです。
まずは滝王山に向かいます。
マイナー系の山なので、道はそこそこ険しい。
ナビアプリは必須。
1時間ほどで山頂に到着。
いいですね!この巨岩
山の山頂には、ほぼ必ず岩があります。
理由は ↓ で説明。
そのまま三草山へ。
三草山・山頂に到着。ここは平野になっています。
ここで豆知識。
「山頂に草が生えている」のは、
比較的に若い山です。
何故なら:
山と言うのは、雨風によって常に土が
山の頭
↓
↓ 土
↓
山の中腹
↓
↓ 土
↓
山の麓
下へ、下へと流れ続ける。
下がりはすれど、
土が上がることは決してないので。
山頂は数百万年のゆったりペースで禿げ続け、
最終的には土は全て消え
岩だけが残る。
まぁ、要するに。
このように
草が生えてる = 土が残ってる = 山が形成されてから時間が立ってない
この山は若い、と言うことが推測できるわけですね。
下山。
「AmongUs パズル (2025/11/17)」
いやー、面白いね。
TVアニメ グノーシア
内容は「人狼ゲーム」をSFライクにリメイクしたもの。
王道の展開がゆえに、安定して面白いデス。
今季のイチオシ。
いわゆる人狼のパズルがあります。
ルールを簡単に説明しますと
・モナリザが3枚ある。1枚が本物で、2枚は偽物。
・人物は8人いる。
・6人は村人で、正直者
・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時間ぐらい手法を探しまくったと思います。