
はてなキーワード:Pingとは
一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。
// ==UserScript== // @namePGP未署名検出と別タブ自動編集 // @namespacehttp://tampermonkey.net/ // @version 1.0 // @descriptionPGP署名がない投稿を自動編集ページへ誘導 // @matchhttps://anond.hatelabo.jp/* // @grantGM_setValue // @grantGM_getValue // @grantGM.openInTab // ==/UserScript== (function () { 'use strict';constbody = document.getElementById('entry-page'); if (!body) return;consttitleText = document.title; if (!titleText.includes('dorawii')) return;constpgpRegex = /BEGIN.*PGP(?: SIGNEDMESSAGE| 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編集ページ処理と自動送信・閉じ // @namespacehttp://tampermonkey.net/ // @version 1.0 // @description編集ページで署名処理と送信、タブ自動閉じ // @matchhttps://anond.hatelabo.jp/dorawii_31/edit?id=* // @grantGM_getValue // @grantGM_xmlhttpRequest // @grantGM_setClipboard // @grantGM_notification // @connectlocalhost // ==/UserScript== (async function () { 'use strict';const shouldRun = awaitGM_getValue('open-tab-for-edit', '0');consttextareaId = 'text-body';consttextarea = document.getElementById(textareaId); if (!textarea) return;const content =textarea.value;constpgpSignatureRegex = /-----BEGINPGP SIGNEDMESSAGE-----[\s\S]+?-----BEGINPGP SIGNATURE-----[\s\S]+?-----ENDPGP SIGNATURE-----/; if (pgpSignatureRegex.test(content)) {console.log('[PGPスクリプト]署名が検出されたためそのまま送信します'); return; }consthttpRequest = (url, data) => { return newPromise((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 = newURL(window.location.href); // 2.ベースとなる部分 (例: "https://anond.hatelabo.jp") を取得constorigin = currentUrl.origin; // 3. 'id'パラメータの値 (例: "20250610184705") を取得constidValue = currentUrl.searchParams.get('id'); // 4.ベース部分とIDを結合して、目的のURL文字列を生成 //idValueが取得できた場合のみ実行する let newUrl = null; if (idValue) { newUrl = `${origin}/${idValue}`; } // 5. 生成されたURLを変数に代入し、コンソールに出力して確認console.log(newUrl);constvalueToSend = newUrl;try {const signatureText = awaithttpRequest('http://localhost:12345/run-batch',valueToSend);console.log('バッチ応答:', signatureText); if (!signatureText.includes('BEGINPGP SIGNEDMESSAGE')) { 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をキャンセルconstbodyText =textarea?.value || ''; //reCAPTCHAトークンの取得constrecaptchaToken = await newPromise((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 {constresponse = 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); } })();
consthttp =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') { letbody = ''; req.on('data', chunk => {body += chunk.toString(); }); req.on('end', () => {constparsed = querystring.parse(body);constvalue =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 serverrunningathttp://localhost:12345/');});
@echo offsetlocal 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> nulgoto signloop):postprocesspowershell -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)"endlocalexit /b
#Persistent#SingleInstance ignoreSetTitleMatchMode, 2WinWaitActive, pinentrySendInputpasswordSleep 100SendInput {Enter}ExitApp
動けばいいという考えで作っているので余分なコードも含んでいるかもしれない。
-----BEGINPGP SIGNEDMESSAGE-----Hash: SHA512https://anond.hatelabo.jp/20250613185036 -----BEGINPGP SIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEv1FQAKCRBwMdsubs4+SHHkAQDUOLgBcdji2T6MJ7h/vlMdFfGlWAzNdXijjE1gIuEPywEAiMNMZqhrMmtlc7UqRuggNJ/UTa5xTIcKp622+7jJQQg==Lgkl-----ENDPGP SIGNATURE-----
ようやく(ほぼ)すべてが自動化された。
あとはローカルサーバーの起動をスタートアップに設定する(方法をAIに聞いて指示に従う)だけの消化試合。
署名時要求してくるパスワードを自動入力するahkファイルはドキュメントのAutoHotkey配下に置いた。
バッチファイル(make.sign.bat)はデスクトップに置いた。
#Persistent#SingleInstance ignoreSetTitleMatchMode, 2WinWaitActive, pinentrySendInput お前のパスワードSleep 100SendInput {Enter}ExitApp
//run-batch-server.jsconsthttp =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 serverrunningathttp://localhost:12345/');});
@echo offsetlocal enabledelayedexpansion::ミリ秒単位のUTC時刻を取得for /f %%a in ('powershell -nologo -command "[int64]::Parse((Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmssfff'))"') doset timestamp=%%a::署名するファイル名set infile=%TEMP%\pgp_input.txtset 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> nulgotosignloop):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 blankline).endlocalexit /b
// ==UserScript==// @namePGP署名自動付加スクリプト(GM_xmlhttpRequest版)// @namespacehttp://tampermonkey.net/// @version 1.0// @description投稿前にPGP署名を付けてから送信(fetch未使用)// @matchhttps://anond.hatelabo.jp/dorawii_31/edit*// @grant GM_xmlhttpRequest// @grant GM_setClipboard// @grant GM_notification// / @connectlocalhost// ==/UserScript==(function () { 'use strict';const submitId = 'submit-button';consttextareaId = 'text-body';const localServer = 'http://localhost:12345/run-batch';constpgpSignatureRegex = /-----BEGINPGPSIGNEDMESSAGE-----[\s\S]+?-----BEGINPGPSIGNATURE-----[\s\S]+?-----ENDPGPSIGNATURE-----/;consthttpRequest = (url) => { return newPromise((resolve,reject) => { GM_xmlhttpRequest({ method: 'GET',url:url, onload: function (response) { resolve(response.responseText); }, onerror: function (error) {reject(error); } }); }); };const interceptClick = () => {constbtn = document.getElementById(submitId); if (!btn ||btn.dataset.pgpIntercepted === 'true') return;btn.dataset.pgpIntercepted = 'true';btn.addEventListener('click', async function (e) {consttextarea = 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 { awaithttpRequest(localServer); //バッチ実行constsignatureText = await navigator.clipboard.readText(); if (!signatureText.includes('BEGINPGPSIGNEDMESSAGE')) { 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すごいなと思うよ。そして思うのは今後重要になってくるのは文法とか自体に詳しいことじゃなくて、そのプログラムの処理内容を指示できるシステムエンジニア的な言語化能力のほうじゃないかなと思った。
-----BEGINPGPSIGNEDMESSAGE-----Hash: SHA51220250609111559680 -----BEGINPGPSIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEbCbwAKCRBwMdsubs4+SLueAPwOv7PBk4voAe5qlcCEvs/PJhmKc5QAb/1R43JMQFuDZgD/UTPEKsL/PhK9jFGv2HDXK1dVjLNwvosgX9uYJh5xxwY==qiOE-----ENDPGPSIGNATURE-----
最短だと注文して数日で届いてその日に使える。回線開通工事は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 | 全然ピンとこない |
| 覚悟のススメ | ApocalypseZero | 全然ピンとこない |
| こちら葛飾区亀有公園前派出所 | KochiKame:Tokyo Beat Cops | 下町要素どこいった |
| 鬼滅の刃 | DemonSlayer:Kimetsu noYaiba | 鬼滅感どこいった |
| 侵略!イカ娘 | SquidGirl | 侵略要素どこいった |
| 行け!稲中卓球部 | ThePingPongClub | 稲中要素どこいった |
| Re:ゼロから始める異世界生活 | Re:Zero -StartingLife inAnother World | 日本語版副題どこいった |
| 五等分の花嫁 | The Quintessential Quintuplets | 花嫁要素どこいった、だが響きは良い |
| 古見さんは、コミュ症です。 | Komi Can't Communicate | なんか響きが良い |
| ヤンキー君とメガネちゃん | FlunkPunk Rumble | なんか響きが良い |
| 地獄先生ぬ〜べ〜 | Hell Teacher: Jigoku Sensei Nube | なんか響きが良い |
| 食戟のソーマ | Food Wars!: Shokugeki noSoma | もう少しなんとかならなかったのか |
| 北斗の拳 | Fist of the NorthStar | もう少しなんとかならなかったのか |
| 浦安鉄筋家族 | Super RadicalGag Family | もう少しなんとかならなかったのか |
| 私がモテないのはどう考えてもお前らが悪い! | No Matter How ILookatIt,It'sYou Guys' Fault I'm Not Popular! | もう少しなんとかならなかったのか |
| 銀魂 | Gintama | これだとジンタマではないのか |
| ゲゲゲの鬼太郎 | GeGeGe no Kitarō | これだとじぇじぇじぇではないのか |
| 魔法先生ネギま! | Negima!Magister NegiMagi | ギはどこから出てきた |
| 魔入りました!入間くん | Welcome to Demon School! Iruma-kun | 英訳不可能なのでしゃあない |
・Re:ゼロから始める異世界生活について、ロゴに記載の英語タイトルは「Re:Life in a different world fromzero」に対し、英語タイトルは「StartingLife inAnother World」と結構違う。
・葬送のフリーレンの英題「『Frieren:BeyondJourney's End」は、旅の終わりと仲間の喪失の意味がかかっていて良いと思った。
・るろうに剣心の英題「Samurai X」は知っていたのだが、調べた範囲ではどうもアニメのタイトルのようであるので入れてない。
・進撃の巨人の英題「attackon titan」はやや不自然な表現らしい。
いま、全銀の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で十分だと思っている
Permalink |記事への反応(10) | 15:49
どこにping打ってるのかにもよるがそもそもWiFiとLTEだと遅延が違う
無線は誰かが通信している間は通信できないので、簡単に言うと順番待ちしてる
WiFiだと電波が遠くまで飛ばないので使っている人が少ないが
LTEだとカバー範囲が広いので使っている人が多く、順番待ちが長くなる
そのせいで遅延が大きくなる
5Gが低遅延とか言ってるのは単にカバー範囲が狭いっていうだけ(他にもあるけどほとんどの要因がコレ)
まぁWiFiの種類(11gとか11nとか11adとか)や電波強度にもよるのであくまで参考程度に
じゃぁ遅延がそんなに重要か、っていうと500msとか越えるなら体感できるだろうけど事実上関係無い
自分が使ってるコンテンツがリアルタイム性を求めているかどうかをよく考えた方がいい