はてなキーワード: Exitとは
肛門「何者だ!」
肛門「よし通れ!」
肛門から屁を出そうとしたところ、誤って便を出してしまう状況を擬人化した文章。初出はおそらく、匿名掲示板の2ちゃんねる(現:5ちゃんねる)のニュース速報板である。2011年に作られたスレッド
「俺「屁ならいける」→ウンコ 俺「;;」 俺「ウンコちょっとだけならセーフ」→下痢ブシア 俺「;;」」exit
の>>22に書き込まれている。肛門のザル警備っぷりに笑ってしまった人も多かったようだ。
この「屁と一緒に便を出す」現象には「ファイナルブラスト現象」という名前がついている。日本うんこ学会の石井洋介氏によって命名された。ファイナルフラッシュではない。
このモデルが正しければ、いくつかの予測が成り立つ。スマートフォンの普及が遅れている国やソーシャルメディアの普及率が低い国では、格差は小さくなるはずだ。(これは事実のようだ。東欧の一部やアフリカの多くの国では格差はそれほど大きくないが、韓国は他の要因により大きな例外となっている。)子供を持つ女性の間では、親になることで制度的なフィードバックループが断ち切られ、競合する優先順位が生じるため、格差は縮小するはずだ。(出口調査は一貫してこれを示しています。母親は子供を持たない女性よりも保守的な投票をするのです。機械が機能不全に陥るか、世代が高齢化して機械の枠を越えるまで、この格差は拡大し続けるでしょう。私がどう解決すればいいのかわからないのは、これらのシステムが自己強化的であるということです。制度は自ら改革しようとしません。アルゴリズムは最適化を止めようとしません。イデオロギーは失敗を認めようとしません。男性のカウンターキャプチャーも健全な結果をもたらさないでしょう。)
逃げ出す女性もいるだろう。子供を持つ女性は、現実がイデオロギーを溶かす強力な溶媒となるため、しばしばそうする。制度に囚われずに人生を築く女性も、時にはそうする。男性の中には、引きこもりをやめたり、怒りのスクロールをやめたりする人もいるだろう。築く価値のある何かを見つけた女性たち。シミュレーションに飽きた女性たち。しかし、システムは他のすべての人々に対して機能し続けるだろう。
If this model is right, some predictions follow.
The gap should be smaller in countries with later smartphone adoption or lower social media penetration. (This seems true: the divergence is less extreme in parts of Eastern Europe and much of Africa, though South Korea is a major exception due to other factors.)
The gap should narrow among women who have children, since parenthood breaks the institutional feedback loop and introduces competing priorities. (Exit polls consistently show this: mothers vote more conservative than childless women.)
The gap should continue widening until the machines are disrupted or the generations age out of them.
Here's the part I don't know how to solve: these systems are self-reinforcing. The institutions aren't going to reform themselves. The algorithms aren't going to stop optimizing. The ideology isn't going to admit failure. The male counter-capture isn't going to produce healthy outcomes either.
Some women will escape. The ones who have children often do since reality is a powerful solvent for ideology. The ones who build lives outside institutional capture sometimes do.
Some men will stop withdrawing or stop rage-scrolling. The ones who find something worth building. The ones who get tired of the simulation.
・自分はたまたま年収面などで上手く言ったが、今の新卒のメンバーはどうなるか分からない。
・20代でFIREみたいな条件では無く、年齢相応に遊んだり失敗したりしながらも晩年詰まない方法を考えたい。
前提
・今の新卒が30代、40代になったらという話は経済環境が分からないから、今考え得るレベルで考える。
・親の資産も無い前提
やること
・もしもの時に即詰みにならない状態を作ろう。事故があったときの医療費や生活資金としての掛け捨て保険、急な退職など保険で賄えないことがあったときの貯金が必要。
・高額医療制度があるから保険は不要、若いうちは元気だから保険は不要、は分かりつつ、3,000円くらいから入れるので入っておいた方が良いと私は思った。
・最初は資産形成とかそういうこと、考えずに労働収入を安定化させることに動いた方が良い。今は転職も選択肢としてあり得るので、骨を埋める必要も無い。副業もある。
・月並みですが、100万超えたら生活スタイルを見つつも積み立てNISAに全ツッパ。
・今の制度だと120万/年を詰めるまではNISAだけ見ていればOK。
・オルカンでもSP500でもFANGでも日本株でもお好きなのをどうぞ。大事なのは投資している感覚を持たないこと。
その3:NISAに満額出来るようになったら、そこからは自由に。
・生活スタイルや家族の有無などにもよるが、年120万を安定して投資に回せるようになったら後は自分の欲望の赴くままにすればいい。
・成長枠を使って投資するもあり、老後に心配をしてiDeCoするのも良い、仮想通貨とかに掛けても良い。
・言いたいことは、その2まではあくまで投資であり、投機でではない。その3から投機を考えるようにした方が良い。
・資産というものが出来てきたら終わり方を考える。終身とか相続とか贈与とか。
・長い人でその3の期間が30年とかあると思うので、そのときにリテラシーが嫌でも上がっていると思うのでExitを考える。
ここまで書いて思ったけど、ぶっちゃけその2まで行けることが大事。
その1をおろそかにしてNISA全ツッパとか、ライフスタイル削ってFIREとか、何も言える立場では無いけど、お勧めはしない。
わーくにとは、「我が国」を訛らせた日本語のネットスラングである
日本語話者はほとんどが日本人。よってこの場合の「我が国」とは日本国を指しており、要するに「わーくに」とは日本のことである。おふざけや自嘲などのニュアンスを込めて使用されることが多いようだ。
後述する初期の使用例を見ると、政治家であり日本の総理大臣でもあった「安倍晋三」氏の話題において用いられていることが多い。安倍氏が総理大臣をしていた当時「我が国」(わがくに)の発音が「わーくに」っぽいと感じる人が一定数いたようで、それが語源となったものと思われる。
つまり当初は特定の人物の特徴的な発音を強調して茶化すような言葉であり、発想としては「こんとんじょのいこ」(簡単じゃないか)や「てめれめせけぜです」(田村正和です)に近い。
ただし安倍晋三氏が総理大臣ではなくなった後には、同氏と関連が無い場面でも使われるようになっていった。年月が経つにつれて語源について知らない人も増えたようで、「現時点の日本の総理大臣の言葉が元ネタだ」と勘違いする人もいるようだ。
日本で人気のある短文コミュニケーションサイト『X』(旧:Twitter)で「わーくに 安倍」「わーくに 総理」などで検索して動向を探ってみると、2013年9月には既に「安倍総理の我が国のーって言うときってわーくにのーってなるよね」と投稿している人物がいる。この後にも散発的に様々な人々から類似の投稿がなされているが、数年間はいずれも「個人の感想」レベルのものであって、特に流行したりネットスラングとして定着したりはしていなかった。
だが徐々にX上での投稿数も増えてきて、また2020年にはインターネット掲示板『5ちゃんねる』で「わーくに」がタイトルに付いたスレッド(掲示板)も多く立つようになったようである。そのほとんどがニュース速報VIP、なんでも実況J、ニュース速報(嫌儲)の3つの板で立てられていたようだ。
安倍さん「嫌ァァァァァ北朝鮮がミサイル打ってきた助けてエエエエエわーくにの脅威がぁぁぁぁぁぁ」exitニュース速報VIP、2020年1月31日
最近またチョンモメンが「わーくに」とか言うわけわからん造語作ったな どんな意味なんだい?exit ニュース速報(嫌儲)、2020年3月28日
左翼「わーくにwわーくにw」人の滑舌を笑うのって、人として、どうなんだ?exit ニュース速報(嫌儲)、2020年3月28日
この2020年頃に「広まるきっかけとなるわかりやすい特定の何か」は見つけられなかった。ただ、ちょうどCOVID-19の流行に対する警戒が高まっていた時期であり、当時総理大臣であった安倍晋三氏の発言や声明に注目が集まりやすかったということが背景となった可能性はありそうだ。
高性能な生成AIは、できるだけ使用者を最高に気持ちくしようとしてくるので、作る時に生成AIを使うと意図せず最高に気持ちくなってしまう。
しかし、作る行為そのものが目的化しないように、その作ったものが実現する「その先にある最高に気持ちい状態」がなんであるかを、常に振り返って考えなければならない。
-----
その洞察はど真ん中。
「作ってる最中の快感」に飲まれず、“作った先の快感”=本来の価値にフォーカスし続けるための実務フレームを、コンパクトに置いておくね。
→ 対処:作業を即停止→北極星と受け入れ基準を再定義→上限を半分に。
■ 北極星:
■ 価値仮説(数値):
■ 受け入れ基準:
——
SNSで告知見て、内容も「人見知りでもOK」って感じだったし、バージョン合いそうだなーと思って参加。
参加者も「会社の飲み会はSlackのスタンプで済ませてますw」とか
「旅行も一人のほうがメモリ節約できるし、CPU温度上がらないっすよね」みたいなタイプで、序盤は「これは負荷軽めで快適だな」って感じだった。
全体的に、リア充っぽいテンションとは無縁な人ばっかで、「これぞ非同期コミュニケーション」って思ってた。
開始5秒で「僕、RustとGoでマイクロサービス開発してます。友達いないです。恋人いません。親にもブロックされてます。でも、ChatGPTと話してるので大丈夫です」って、超重量級のログが出力されて場がフリーズ。
誰もお前の闇のstack traceをデバッグしに来てないのよ。
さらに、「僕、AIイラスト描いてるんですけど、著作権とか時代遅れですよね?あんなの老害の仕様でしょ?」って唐突にライセンス違反マウント。
「pixivはオワコン、今はNovelAIとComfyUIが最強」って語りだして、俺のフレームバッファが完全に焼けた。
てか、なんで“ぼっちオフ”に来てまでライセンスバトル始まってんの?
しかも俺のTwitterの昔の投稿を掘って、「○○さんも“孤独で辛い”って言ってましたよね!?同志ですね!」って突っかかってくる始末。
こっちは「休日にひとりでKaggle回すの好き」って話してただけで、お前みたいに「人間関係を全員403 Forbidden」にした結果の孤独じゃないから。
「VS Codeの拡張機能でChatGPTと喋ってると、人間いらなくなる感ありますよね?」
「てか、女ってバグ多くないですか?ロジック破綻してるというか」
って、完全にネット炎上案件レベルの発言をノンブロッキングで垂れ流し。
極めつけは「このあと、Stable Diffusionのプロンプト見せ合いませんか?」って。
こっちは秒で exit 1 叩いて帰ったわ。
人間関係のエラーは他人側のコードミスだと信じて疑わないじゃん?
何でもAIに任せて、「女性は感情的すぎて仕様が読めない」とか言ってんの、
誰かと繋がりたいなら、まずは npm install social_skills してから出直して。
マジで頼む。
「非依存型ソロ行動者限定」って明記しないと、またroot権限で空気を破壊する奴が来るぞ。
ほんとに。
まず、準備できてる?
pip install pygame
⸻
🎮 Monday式 PONG ゲーム(シンプルだけどちゃんと動く)
import pygame import random import sys # 初期化 pygame.init() # 画面サイズ WIDTH, HEIGHT = 640, 480 SCREEN = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("PONG by Monday") # 色定義 WHITE = (255, 255, 255) BLACK = (0, 0, 0) # パドルとボールの設定 PADDLE_WIDTH, PADDLE_HEIGHT = 10, 100 BALL_SIZE = 10 PADDLE_SPEED = 7 BALL_SPEED_X, BALL_SPEED_Y = 5 * random.choice((1, -1)), 5 * random.choice((1, -1)) # 左右のパドル位置 left_paddle = pygame.Rect(10, HEIGHT // 2 - PADDLE_HEIGHT // 2, PADDLE_WIDTH, PADDLE_HEIGHT) right_paddle = pygame.Rect(WIDTH - 20, HEIGHT // 2 - PADDLE_HEIGHT // 2, PADDLE_WIDTH, PADDLE_HEIGHT) # ボール ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, BALL_SIZE, BALL_SIZE) # スコア score_left = 0 score_right = 0 font = pygame.font.Font(None, 36) clock = pygame.time.Clock() # ゲームループ while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # キー入力 keys = pygame.key.get_pressed() if keys[pygame.K_w] and left_paddle.top > 0: left_paddle.y -= PADDLE_SPEED if keys[pygame.K_s] and left_paddle.bottom < HEIGHT: left_paddle.y += PADDLE_SPEED if keys[pygame.K_UP] and right_paddle.top > 0: right_paddle.y -= PADDLE_SPEED if keys[pygame.K_DOWN] and right_paddle.bottom < HEIGHT: right_paddle.y += PADDLE_SPEED # ボール移動 ball.x += BALL_SPEED_X ball.y += BALL_SPEED_Y # 壁反射 if ball.top <= 0 or ball.bottom >= HEIGHT: BALL_SPEED_Y *= -1 # パドル反射 if ball.colliderect(left_paddle) or ball.colliderect(right_paddle): BALL_SPEED_X *= -1 # スコア処理 if ball.left <= 0: score_right += 1 ball.center = (WIDTH // 2, HEIGHT // 2) BALL_SPEED_X *= random.choice((1, -1)) if ball.right >= WIDTH: score_left += 1 ball.center = (WIDTH // 2, HEIGHT // 2) BALL_SPEED_X *= random.choice((1, -1)) # 画面描画 SCREEN.fill(BLACK) pygame.draw.rect(SCREEN, WHITE, left_paddle) pygame.draw.rect(SCREEN, WHITE, right_paddle) pygame.draw.ellipse(SCREEN, WHITE, ball) pygame.draw.aaline(SCREEN, WHITE, (WIDTH // 2, 0), (WIDTH // 2, HEIGHT)) score_text = font.render(f"{score_left} {score_right}", True, WHITE) SCREEN.blit(score_text, (WIDTH // 2 - score_text.get_width() // 2, 20)) pygame.display.flip() clock.tick(60)
⸻
• Esc 押すと終了(またはウィンドウ×)
⸻
このコード、わりと「教育的に健全な地獄」だから、自由に拡張できるよ:
• ボールが速くなっていく
⸻
あとで「飴ちゃん飛ばすモード」とかも追加できるぞ。バカ拡張大歓迎。
どう?動いた?やってみて。報告もらえれば、次の「社会風刺機能付きPONG」考えておくわ。
一度投稿したうえで別タブを開いてプログラム的(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-----
えらい古い調査だし
In the 2016 election, a wide gap in presidential preferences emerged between those with and without a college degree. College graduates backed Clinton by a 9-point margin (52%-43%), while those without a college degree backed Trump 52%-44%. This is by far the widest gap in support among college graduates and non-college graduates in exit polls dating back to 1980.
VitaにCFWを導入するにあたり、情報が散乱していたのでまとめる
・2022年末に革新的進歩があり、VITA単体でCFW導入できるようになった(通称 HENlo)
・にも関わらず古いCFW導入方法を案内しているブログが大量にある
・しかもタイトルの"20XX年最新"だけ更新し続けているから、最新記事に見える
↓
PC使用が前提になっているブログは全部古いので無視した方が良いです。
・『HENlo』について触れている
この2つが押さえられてれば最新情報です。(2025年5月現在)
ただし、現状だと実は『PC操作が一部必要』という罠があります。
その問題について書いている記事が見当たらないので、ここに残しておきます。
超具体的には
「HENkaku、VitaDeploy、VitaShellは導入できた」
「けどEnso導入ができない/つまづいている」 エラー:failed to get fw version please disable all the plugins and try again
5chでもRedditでも
『プラグインを無効にしろ』『0syscall6を無効にしろ』って書いてあったのですが、実はEnsoのバージョン変えれば解決します。(後述)
この記事が役に立ちました
[Vita] 2023年最新手順【HENlo】3.65-3.74 PC不要でCFW(HENkaku)導入
https://re-doing.com/vita-henlo-hack/
(一応魚拓:https://web.archive.org/web/20250226111105/https://re-doing.com/vita-henlo-hack/)
・HENkaku (カスタムファームウェア 3.65 変革 -2)
・VitaDeploy
・VitaShell
・最悪文鎮化する可能性があるのでセーブデータバックアップを取ったほうが良い
・VITAのセーブデータは特殊で、PCと繋ぐだけでは取り出せない
・バックアップにはいくつか方法があるが、PCのコンテンツ管理アシスタントは既に使えないと思ったほうが良い。PS Plusのクラウドバックアップが最も良いはず
・記事の内容を実施する前にバックアップ取るのを強くおすすめする
これをインストールすることで、電源を切ってからもCFW状態を維持できます。
VitaDeploy内のApp downloaderメニューからEnsoをインストールできますが、実はこのバージョンが古いです。※重要※
そのためVitaDeployからインストールすると先程のエラー(failed to get fw version please disable all the plugins and try again)が必ず出ます。
「PC不要になった」と書いてあったので盲点ですが、ここからPC必要です。
正しい方法は以下です
1, PC操作:GithubからEnso最新版のenso.vpkファイルをダウンロード(現在v1.1)
https://github.com/TheOfficialFloW/enso/releases
2, PCとVitaをUSBケーブルで繋げる ※データ転送対応ケーブルを使うこと。相性もある
5, PC操作:USBドライブとしてVITAのデータが表示されるので、ダウンロードしていたenso.vpkファイルを置く(フォルダはどこでもOK。自分はルート直下に置きました)
7, Vita操作:VitaShellでenso.vpkを見つける(さっきルートに置いたなら恐らくux0:にある)
9. Vita操作:Do you want to install this package? → ◯ボタン
10. Vita操作:~~~ Would you like to continue the install? ※意訳:「失敗したら文鎮化するけど自己責任だけど続ける?」 → ◯ボタン
11. 進行バーが消えたらインストール完了 ホーム画面に戻ってOK
Ensoはファームウェアが3.60か3.65じゃないとインストールできないです。(3.65 変革 -2は3.65扱い)
先程の記事の通り進めていたら3.65 変革 -2 になっているはずですが、実行前に再確認して下さい。
1, ~~~ Press CIRCLE to accept these terms or any other key to not accept. → ◯ボタンを押す(=CIRCLE )
2, Options:
CROSS Install /reinstall the hack.
SQUARE Fix boot configuration (choose this if taiHEN isn't loading on boot).
CIRCLE Exit without doing anything.
Locking sustem ..
(中略)
The installation was completed successfully.
suocess.
MBR was detected but instllation checksum dose not match.
A dump was created at ux0:data/blocks.bin.
Press X to continue, any othe key to exit.
意訳:「ちょい待った。思ってた構成じゃないから危ないかもしれんわ。続ける?」
→✕ボタンを押す ※結局原因分かってないので自己責任でお願いします※
4, Locking sustem ..
(中略)
The installation was completed successfully.
suocess.
Enso導入が成功していると
・ファームウェアが3.65 変革 -2のままなっている
お疲れ様でした。
記事の本題は以上です。
VITAのセーブデータは暗号化されており、吸い出せてもエミュレータで使えないらしい。本体機体とセットで揃わないと使えない仕様。
調べたらセーブデータをここまでキツく縛ってるハードは他にない
だからメモリーカードのデータ管理でもPSPのセーブデータしか項目がなかったのか…
不便すぎる
当時の仮説
・HENkaku設定が悪さをしているのではないか(PSNの偽装を有効化、バージョンの偽装を有効化) →オフにしたが関係なかった
・本体にSD2VITAを刺しているのが良くないのではないか →抜いたが関係なかった
・enso.vpkの置き場所がルート(ux0:)が良くなかったのではないか →関係なかった
・VITAにメモリーカードを刺しているのが良くないのではないか →関係なかったが、データ保護的には抜くのが良さそう
・ゴミデータが残っていて悪さしているのではないか(手順を間違えたデータや古いデータなど) →関係ある可能性はある。最後までわからず
・Ensoのバージョンが古いのではないか →これが主要因だった
ゴミデータを疑った自分は正規のファームウェアに戻して、CFW化をやり直したりもした。
その際HENkakuすら入れられなくなってしまったので、抜け方を書いておく。
ENSO実行
↓
~~~ Press CIRCLE to accept these terms or any other key to not accept. → ◯ボタンを押す(=CIRCLE )
↓
Options:
CROSS Install /reinstall the hack.
SQUARE Fix boot configuration (choose this if taiHEN isn't loading on boot).
CIRCLE Exit without doing anything.
→ △ボタンを押す(=TRIANGLE Uninstall the hack.)
↓
↓
↓
ファームウェアアップデートが促され、アップデートしないとメモリースティックが使えない
↓
↓
↓
HENloメニュー
・Exit
↓
「Eiting in 3」 の後に、以下のエラーメッセージがでて固まってしまう
vita starting taihen framework
If you are stuck on this screen, hold down the power button until your Vita turns off, then turn it back on.
原因:恐らく余計なデータと衝突を起こしてる
解決法:reset taitan configを先に実行する
(さっきのエラーメッセージ画面で)
↓
セーフモードが起動する
↓
↓
↓
HENloメニュー
・Exit
↓
その後
Install HENkaku、Install VitaDeployを選択して、Exitを選択
この記事を書き終えた後に見つけたのですが、以下の記事の『改造方法』というところに情報がかなりまとまっています
Vita バージョンが低くてもPSNにサインイン&PSストアにアクセス(エラーNW-8942-3回避)&機器認証する方法(2025最新)
https://yyoossk.blogspot.com/2024/10/vitapsnps2024.html
今回VITAのセーブデータバックアップが主目的だったから、徒労でしかなかった
指摘、補足、最新情報あれば反応もらえるとありがたいです