はてなキーワード: pingとは
一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。
// ==UserScript==
// @name PGP未署名検出と別タブ自動編集
// @namespace http://tampermonkey.net/
// @version 1.0
// @description PGP署名がない投稿を自動編集ページへ誘導
// @match https://anond.hatelabo.jp/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM.openInTab
// ==/UserScript==
(function () {
'use strict';
const body = document.getElementById('entry-page');
if (!body) return;
const titleText = document.title;
if (!titleText.includes('dorawii')) return;
const pgpRegex = /BEGIN.*PGP(?: SIGNED MESSAGE| SIGNATURE)?/;
const preElements = document.querySelectorAll('div.body pre');
let hasPgpSignature = false;
for (const pre of preElements) {
if (pgpRegex.test(pre.textContent)) {
hasPgpSignature = true;
break;
}
}
if (hasPgpSignature) return;
const editLink = document.querySelector('a.edit');
const childTab = GM.openInTab(editLink.href, { active: false, insert: true, setParent: true });
})();
// ==UserScript==
// @name 編集ページ処理と自動送信・閉じ
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 編集ページで署名処理と送信、タブ自動閉じ
// @match https://anond.hatelabo.jp/dorawii_31/edit?id=*
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @grant GM_notification
// @connect localhost
// ==/UserScript==
(async function () {
'use strict';
const shouldRun = await GM_getValue('open-tab-for-edit', '0');
const textareaId = 'text-body';
const textarea = document.getElementById(textareaId);
if (!textarea) return;
const content = textarea.value;
const pgpSignatureRegex = /-----BEGIN PGP SIGNED MESSAGE-----[\s\S]+?-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/;
if (pgpSignatureRegex.test(content)) {
console.log('[PGPスクリプト] 署名が検出されたためそのまま送信します');
return;
}
const httpRequest = (url, data) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: 'POST',
url: url,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: `value=${encodeURIComponent(data)}`,
onload: function (response) {
resolve(response.responseText);
},
onerror: function (error) {
reject(error);
}
});
});
};
// textarea の値を取得
// 1. 現在のページのURLからURLオブジェクトを作成
const currentUrl = new URL(window.location.href);
// 2. ベースとなる部分 (例: "https://anond.hatelabo.jp") を取得
const origin = currentUrl.origin;
// 3. 'id' パラメータの値 (例: "20250610184705") を取得
const idValue = currentUrl.searchParams.get('id');
// 4. ベース部分とIDを結合して、目的のURL文字列を生成
// idValueが取得できた場合のみ実行する
let newUrl = null;
if (idValue) {
newUrl = `${origin}/${idValue}`;
}
// 5. 生成されたURLを変数に代入し、コンソールに出力して確認
console.log(newUrl);
const valueToSend = newUrl;
try {
const signatureText = await httpRequest('http://localhost:12345/run-batch', valueToSend);
console.log('バッチ応答:', signatureText);
if (!signatureText.includes('BEGIN PGP SIGNED MESSAGE')) {
alert('PGP署名がクリップボードに見つかりませんでした。');
return;
}
const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n';
textarea.value = newText;
console.log('[PGPスクリプト] 署名を貼り付けました。送信を再開します。');
const form = document.forms.edit;
const newForm = form.cloneNode(true);
form.replaceWith(newForm);
newForm.addEventListener('submit', async (e) => {
e.preventDefault(); // HTML標準のsubmitをキャンセル
const bodyText = textarea?.value || '';
// reCAPTCHA トークンの取得
const recaptchaToken = await new Promise((resolve) => {
grecaptcha.enterprise.ready(() => {
grecaptcha.enterprise.execute('hoge', { action: 'EDIT' })
.then(resolve);
});
});
// POSTするデータの構築
const formData = new FormData(newForm);
formData.set('body', bodyText);
formData.set('recaptcha_token', recaptchaToken);
formData.set('edit', '1');
try {
const response = await fetch(newForm.action, {
method: 'POST',
body: formData,
credentials: 'same-origin'
});
if (response.ok) {
console.log('送信成功');
window.close();
} else {
console.error('送信失敗', response.status);
}
} catch (err) {
console.error('送信中にエラーが発生', err);
}
});
// プログラム的に送信トリガー
newForm.dispatchEvent(new Event('submit', { bubbles: true }));
} catch (e) {
console.error('バッチ呼び出し失敗:', e);
}
})();
const http = require('http'); const { exec } = require('child_process'); const querystring = require('querystring'); const server = http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/ping') { res.writeHead(200); res.end('pong'); } else if (req.method === 'POST' && req.url === '/run-batch') { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { const parsed = querystring.parse(body); const value = parsed.value || 'default'; // 値を引数としてバッチに渡す exec(`C:\\Users\\hoge\\Desktop\\makesign.bat "${value}"`, { encoding: 'utf8' }, (err, stdout, stderr) => { if (err) { res.writeHead(500); res.end('Error executing batch: ' + stderr); } else { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(stdout.trim()); } }); }); } else { res.writeHead(404); res.end('Not found'); } }); server.listen(12345, () => { console.log('Batch server running at http://localhost:12345/'); });
@echo off setlocal enabledelayedexpansion :: 署名するファイル名 set "infile=%~1" set outfile=%TEMP%\pgp_output.asc :: 以前の出力があれば削除 if exist "%outfile%" del "%outfile%" :signloop :: AutoHotkeyでパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える) start "" /b "C:\Users\hoge\Documents\AutoHotkey\autopass.ahk" :: PGPクリア署名を作成 echo %infile% | gpg --yes --clearsign --output "%outfile%" :: 署名が成功していればループを抜ける if exist "%outfile%" ( goto postprocess ) else ( timeout /t 1 > nul goto signloop ) :postprocess powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content '%outfile%' -Raw; Write-Output ($header + \"`r`n\" + $body + $footer)" powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content 'signed.asc' -Raw; Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)" endlocal exit /b
#Persistent #SingleInstance ignore SetTitleMatchMode, 2 WinWaitActive, pinentry SendInput password Sleep 100 SendInput {Enter} ExitApp
動けばいいという考えで作っているので余分なコードも含んでいるかもしれない。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250613185036 -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEv1FQAKCRBwMdsubs4+ SHHkAQDUOLgBcdji2T6MJ7h/vlMdFfGlWAzNdXijjE1gIuEPywEAiMNMZqhrMmtl c7UqRuggNJ/UTa5xTIcKp622+7jJQQg= =Lgkl -----END PGP SIGNATURE-----
ようやく(ほぼ)すべてが自動化された。
あとはローカルサーバーの起動をスタートアップに設定する(方法をAIに聞いて指示に従う)だけの消化試合。
署名時要求してくるパスワードを自動入力するahkファイルはドキュメントのAutoHotkey配下に置いた。
バッチファイル(make.sign.bat)はデスクトップに置いた。
#Persistent #SingleInstance ignore SetTitleMatchMode, 2 WinWaitActive, pinentry SendInput お前のパスワード Sleep 100 SendInput {Enter} ExitApp
// run-batch-server.js const http = require('http'); const { exec } = require('child_process'); const server = http.createServer((req, res) => { if (req.url === '/ping') { res.writeHead(200); res.end('pong'); } else if (req.url === '/run-batch') { exec('C:\\Users\\you\\Desktop\\makesign.bat', (err) => { res.writeHead(200); res.end(err ? 'Error' : 'OK'); }) ; } else { res.writeHead(404); res.end('Not found'); } }); server.listen(12345, () => { console.log('Batch server running at http://localhost:12345/'); });
@echo off setlocal enabledelayedexpansion :: ミリ秒単位のUTC時刻を取得 for /f %%a in ('powershell -nologo -command "[int64]::Parse((Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmssfff'))"') do set timestamp=%%a :: 署名するファイル名 set infile=%TEMP%\pgp_input.txt set outfile=%TEMP%\pgp_output.asc :: 以前の出力があれば削除 if exist "%outfile%" del "%outfile%" :: タイムスタンプを原文として保存 echo %timestamp% > "%infile%" :signloop :: AutoHotkeyでパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える) start "" /b "C:\Users\infini\Documents\AutoHotkey\autopass.ahk" :: PGPクリア署名を作成 gpg --yes --clearsign --output "%outfile%" "%infile%" :: 署名が成功していればループを抜ける if exist "%outfile%" ( echo [INFO] 署名成功 goto postprocess ) else ( echo [WARN] 署名失敗、再試行します… timeout /t 1 > nul goto signloop ) :postprocess :: PowerShellで余計な改行なしに |< をつけてクリップボードにコピー powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content '%outfile%' -Raw; Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)" echo Done. signed.asc created and clipboard updated (no extra blank line). endlocal exit /b
// ==UserScript== // @name PGP署名自動付加スクリプト(GM_xmlhttpRequest版) // @namespace http://tampermonkey.net/ // @version 1.0 // @description 投稿前にPGP署名を付けてから送信(fetch未使用) // @match https://anond.hatelabo.jp/dorawii_31/edit* // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_notification // / @connect localhost // ==/UserScript== (function () { 'use strict'; const submitId = 'submit-button'; const textareaId = 'text-body'; const localServer = 'http://localhost:12345/run-batch'; const pgpSignatureRegex = /-----BEGIN PGP SIGNED MESSAGE-----[\s\S]+?-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/; const httpRequest = (url) => { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: url, onload: function (response) { resolve(response.responseText); }, onerror: function (error) { reject(error); } }); }); }; const interceptClick = () => { const btn = document.getElementById(submitId); if (!btn || btn.dataset.pgpIntercepted === 'true') return; btn.dataset.pgpIntercepted = 'true'; btn.addEventListener('click', async function (e) { const textarea = document.getElementById(textareaId); if (!textarea) return; const content = textarea.value; if (pgpSignatureRegex.test(content)) { console.log('[PGPスクリプト] 署名が検出されたためそのまま送信します'); return; } e.preventDefault(); e.stopImmediatePropagation(); console.log('[PGPスクリプト] 署名が見つからないため処理を停止し、署名を取得します'); try { await httpRequest(localServer); // バッチ実行 const signatureText = await navigator.clipboard.readText(); if (!signatureText.includes('BEGIN PGP SIGNED MESSAGE')) { alert('PGP署名がクリップボードに見つかりませんでした。'); return; } const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n'; textarea.value = newText; console.log('[PGPスクリプト] 署名を貼り付けました。送信を再開します。'); btn.click(); // イベント再発火 } catch (err) { alert('PGP署名の取得または貼り付けに失敗しました。\n' + err); } }, true); }; window.addEventListener('load', () => { setTimeout(interceptClick, 1000); }); })();
プロミスメソッドとか全然まだ理解してなくてそのなかに関数代入したその関数にオブジェクトのプロパティにresponseを?いやまあそのあたりのコードが示すデータの流れが全然理解できないような人間でもここまでできちゃった。
AIすごいなと思うよ。そして思うのは今後重要になってくるのは文法とか自体に詳しいことじゃなくて、そのプログラムの処理内容を指示できるシステムエンジニア的な言語化能力のほうじゃないかなと思った。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 20250609111559680 -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEbCbwAKCRBwMdsubs4+ SLueAPwOv7PBk4voAe5qlcCEvs/PJhmKc5QAb/1R43JMQFuDZgD/UTPEKsL/PhK9 jFGv2HDXK1dVjLNwvosgX9uYJh5xxwY= =qiOE -----END PGP SIGNATURE-----
最短だと注文して数日で届いてその日に使える。回線開通工事は3月4月は一ヶ月待ちとか平気で言うのでそれに比べれば神。
滅茶苦茶調子がいい時でも10Mbps行かない。
そして雨が降ると1Mbps。
嘘だろ?ってぐらいの遅さだ。
ポケットWi-Fiの平均数Mbpsの回線速度じゃ出来ないことがある。
・ネトゲを遊ぶこと
・ゲームやソフトのアップデート後すぐに遊ぶこと(事前DLしていても起動後のDLに2時間ぐらいかかる)
この3つは無理だ。
だが考えて欲しい。
配信も見ないし、ネトゲも遊ばないし、ゲームの最前線攻略に必死にならない人生って、それらに振り回された人生と比べたら「最高」じゃないか?
俺は4月に引っ越しをした。
引っ越した新しいアパートで開通工事をしようとしたのだがだいぶ面倒くさい話になってしまったのでポケットWi-Fiを契約することにした。
ポケットWi-Fiが全てそうなのかは知らないが私が契約したものはクソほど遅い。
天気による影響もあるがおおむね数Mbpsだ。
WEB漫画を読んでいると途中でページ読み込みが挟まる。
動画を再生するときはダウンロードを終わらせておくか低画質にしないと何度も止まる。
地獄のようだと思ったが、慣れてくればなんともならないわけじゃない。
寝る前や出勤前にダウンロードを始めておけば次に使う頃には30GBのゲームだって落とし終わっている。
映画やドラマをアマプラビデオで事前にDLしておいて、それを見ながらゆっくりネットサーフィンをすれば、マルチタスクによる無自覚な作業速度低下の影響により致命的な遅さを感じるほどではなくなった。
ポケットWi-Fiを軸にした生活は俺からあらゆるものを奪った。
凄い勢いで回線がぶった切られるので遊べてもカードゲームぐらいだ。
配信を追うのだってブチブチ途中で切れるので見てられなくて辞めてしまった。
「最高」になった。
ネトゲで負けて苛つくこともないからメンタルもドンドン回復した。
ポケットWi-Fiが「クソだった」から俺の人生が「最高」になっていってるんだ。
これは凄いことだぜ。
ある種の健康法だ。
ネット人生をゴミにして、ネットに人生をゴミにされる日々から開放されるんだ。
インターネットにあるものなんて、人生の中にある無数の価値に比べたら些細がすぎるということに気づこう!
1Gbpsの回線速度が君に与えてくれるのは小さな快感とゴミになった人生だ!!
目
覚
め
よ
👁️
B拠点のルーターまでは到達出来るけど NAS に行けない&再起動抜き差しでたまに復活するなら、
LANケーブルの接触不良、HUB や NAS のポートの不調、機器の過熱や電源の不安定さの可能性がなんとなく高そうやね
~~~~~~ やるべきことはすでに確認済み/なんかよくわからなかった場合 ~~~~~~
あと、やっぱケチらんで、M365 の SharePoint か GoogleDrive を使った方がええと思うやで。社内のファイルサーバーとかの面倒を見んでええし
それから、もし無線LANに切替未なら無線LANに切り替えた方がええで。ユーザーに勝手に機器を生やされないし(予算があればだが)
更なる理想は、もし EntraID (AAD)+Intune に以降がまだなら、この機会に移行して、 無線LAN を SSO認証と組み合わせて、
ここでいう「そのまま」とは、例えば「呪術廻戦」→「Jujutsu Kaisen」といったものを指す。
| 日本語タイトル | 英語タイトル | 所感 |
| 名探偵コナン | Case Closed | 全然ピンとこない |
| 覚悟のススメ | Apocalypse Zero | 全然ピンとこない |
| こちら葛飾区亀有公園前派出所 | KochiKame: Tokyo Beat Cops | 下町要素どこいった |
| 鬼滅の刃 | Demon Slayer:Kimetsu no Yaiba | 鬼滅感どこいった |
| 侵略!イカ娘 | Squid Girl | 侵略要素どこいった |
| 行け!稲中卓球部 | The Ping Pong Club | 稲中要素どこいった |
| Re:ゼロから始める異世界生活 | Re:Zero -Starting Life in Another World | 日本語版副題どこいった |
| 五等分の花嫁 | The Quintessential Quintuplets | 花嫁要素どこいった、だが響きは良い |
| 古見さんは、コミュ症です。 | Komi Can't Communicate | なんか響きが良い |
| ヤンキー君とメガネちゃん | Flunk Punk Rumble | なんか響きが良い |
| 地獄先生ぬ〜べ〜 | Hell Teacher: Jigoku Sensei Nube | なんか響きが良い |
| 食戟のソーマ | Food Wars!: Shokugeki no Soma | もう少しなんとかならなかったのか |
| 北斗の拳 | Fist of the North Star | もう少しなんとかならなかったのか |
| 浦安鉄筋家族 | Super Radical Gag Family | もう少しなんとかならなかったのか |
| 私がモテないのはどう考えてもお前らが悪い! | No Matter How I Look at It, It's You Guys' Fault I'm Not Popular! | もう少しなんとかならなかったのか |
| 銀魂 | Gintama | これだとジンタマではないのか |
| ゲゲゲの鬼太郎 | GeGeGe no Kitarō | これだとじぇじぇじぇではないのか |
| 魔法先生ネギま! | Negima! Magister Negi Magi | ギはどこから出てきた |
| 魔入りました!入間くん | Welcome to Demon School! Iruma-kun | 英訳不可能なのでしゃあない |
・Re:ゼロから始める異世界生活について、ロゴに記載の英語タイトルは「Re:Life in a different world from zero」に対し、英語タイトルは「Starting Life in Another World」と結構違う。
・葬送のフリーレンの英題「『Frieren: Beyond Journey's End」は、旅の終わりと仲間の喪失の意味がかかっていて良いと思った。
・るろうに剣心の英題「Samurai X」は知っていたのだが、調べた範囲ではどうもアニメのタイトルのようであるので入れてない。
いま、全銀のSEでトラブル対応やってるのは1割もいないと思うよ。
いまはINS廃止のテストが忙しすぎてトラブルは放置されている状態。
INSが廃止される2024年1月までにテストを終わらせないとヤバイんだけど、接続先の金融機関が多すぎてテストが終わんないんだよ。
接続テストで「pingが通らないんですけど」とかそういうアホな問い合わせが大量にきてるんだけど、ほぼほぼ、その金融機関の内部のFWやルートの設定の問題。「それはそちらの問題です」と答えると「誠意が足らない。ふざけるな」と逆ギレ。どないしろと言うんじゃ。pingぐらい自分で打ってから問い合わせてくれ。
ゲーム開発者目線の話だけど120以上は正直意味があるのかわからない
人間は0.07秒以下を識別できないという話をどこかで見たことがある。
どれだけモニターが早く更新されてようが、神経伝達されないから意味がない
俺は新人類で、240FPSでものが見えてるんだ!という人のために、
理由、2 そもそもサーバーサイドでは30-50FPSでしか動かしていない
これはほぼどのゲームもそうだと思う。APEXは公表していて、たしか40とかだった気がする。サーバーのレートを上げないのはレートを挙げたときに比して実感が得られないから。
どうしても通信のラグがあるから、受付時間をいくら増やしたところでPingを改善する以上の実感が得られなくて、その割にサーバーコストばかりが高くなるからオンラインゲームではだいたい低レートでサーバーを運営している
つまり一秒間に100回受け付けようが、60回受け付けようが通信自体がどうせ100msとかかかり、さらに受付側のローカルのリフレッシュレートでしか受信できないんだから倍にしたところで(たとえ毎フレーム送信したとしても)倍送受信できるようにはならない
たしかサーバーのレートを倍にしたら1.2倍ぐらい送受信回数が増えるとかだった気がする
だから手元で240FPSで動かせてる!と思ってもそれはゲーム側で用意されたバカを騙すためのフェイクを見てそう思ってるにすぎず、1秒間に240回例えば連打できたとしても有効になるのはそのうちの40回だけ(今は同期するために同時点時間で有効な一個のパケットだけが使われるので)
1フレーム早く打てるのはでかいぞ!といってもそれって倍細かく見える=以前より1FPS分早く見えている(かもしれない)でしかなくて、
60→120FPSの時だとたった8ms差だし、120FPSのモニターから240に上げた場合はたった4ms差
ちなみにピアノの鍵盤をたたいてから音が鳴るまでのラグがだいたい50msだ
ちなみに自分は60で十分だと思っている
どこにping打ってるのかにもよるがそもそもWiFiとLTEだと遅延が違う
無線は誰かが通信している間は通信できないので、簡単に言うと順番待ちしてる
WiFiだと電波が遠くまで飛ばないので使っている人が少ないが
LTEだとカバー範囲が広いので使っている人が多く、順番待ちが長くなる
そのせいで遅延が大きくなる
5Gが低遅延とか言ってるのは単にカバー範囲が狭いっていうだけ(他にもあるけどほとんどの要因がコレ)
まぁWiFiの種類(11gとか11nとか11adとか)や電波強度にもよるのであくまで参考程度に
じゃぁ遅延がそんなに重要か、っていうと500msとか越えるなら体感できるだろうけど事実上関係無い