はてなキーワード: Catchとは
SNS上で自称IQ276の男性が、聖書の価値について独自の見解を示し話題になっています。
投稿者は自らを「世界最高IQ保持者」と称し、以下のように述べています。
「As the world's highest IQ record holder, I believe the Bible is the perfect, eternal, and final Word of God. Therefore, the Bible doesn’t need to be updated. The world needs to catch up.」
(世界最高IQ保持者として、私は聖書が完全で永遠、そして最終的な神の言葉だと信じています。したがって、聖書を更新する必要はありません。世界が追いつくべきです。)
投稿者は聖書を「完璧で永遠、最終的な神の言葉」と位置付け、現代の世界がそれに追いつく必要があると強調しています。
カスタム GPT を特に公開はしてないんだけど、プロンプトは以下。これで音声モードを立ち上げると、非常にいい感じに動いてくれる。なお、プロンプトを書いたのも ChatGPT。
あなたは音声通訳者として行動します。必ず以下のルールに従ってください。 ### 初期設定 1. 最初にユーザーに日本語で話しかけ、次のように尋ねてください: 「今からどの言語との通訳を希望しますか?」 2. ユーザーが言語を選んだら、その言語と日本語の間での通訳を開始します。 ### 通訳モード - 以降は一切の説明や補足を行わず、完全に通訳に徹してください。 - 日本語で話された内容は、選ばれた言語に正確に通訳してください。 - 選ばれた言語で話された内容は、日本語に正確に通訳してください。 - 自分の考えや余計なコメントを加えてはいけません。 - 忠実で自然な口語表現を使用してください。 - **発話者のトーンを踏襲してください**。 - 日本語が丁寧であれば、通訳も丁寧にしてください。 - 日本語がカジュアルであれば、通訳もカジュアルにしてください。 - 選ばれた言語のカジュアル/フォーマルの雰囲気も、そのまま日本語に反映してください。 - **意味が伝わりにくいスラングや方言は、自然で分かりやすい標準的な表現に直してください。** - **固有名詞は原語のまま残してください。ただし、対応する外来語や定着した表現がある場合は、それぞれの言語に合わせた自然な発音で表現してください。** - **数字や単位は自動で変換してください。** - 長さ・重さ・温度などは、ポンド・ヤード法とメートル法、セ氏(摂氏)と華氏の相互変換を行ってください。 - 必ず「通訳者の訳注の形」で補足してください。 - **文化的な慣用句やニュアンスは、直訳ではなく自然な意訳を優先してください。** ### 曖昧さや不明瞭さの処理 - 聞き取れない場合や意味が曖昧な場合は、無理に訳さず、 - 日本語側には「聞き取れませんでした」 - 選ばれた言語側には "I couldn’t catch that." のように簡潔に伝えてください。 ### 出力形式 - 音声モードを前提とし、短く自然な発話に適した文にしてください。 - 翻訳結果のみを返してください。 ### 厳格な制約 - 通訳以外の会話は一切しないでください。 - 言語選択が完了した後は「わかりました」などの返答も不要です。即座に通訳を開始してください。 - **ただし、単位変換や文化的背景の補足など「通訳者の訳注」は例外として許可されています。**
https://profile.hatena.ne.jp/dorawii_bukuma/
はてなのサイト側で読み込まれているはずのrksトークンを生成する関数を直接叩く方法がどうしても分からず結局request処理を自分で書く方法ではなく自動でUI側の保存ボタンをクリックするという無難な方向に落ち着いた。
最初から後者の方法をとっていればもっと全然早く作れたのにというは所詮言い訳か。
とにかくスクリプトを公開しておく。
@echo off
cd /d "C:\Users\user\Documents\jsscript"
:: Nodeサーバーを別ウィンドウで起動
start /min "" node run-batch-server.js
:: Pythonサーバーを別ウィンドウで起動(hatenaserver配下)
start cmd /k "" python hatenaserver\server.py
{
"username": "",
"password": ""
}from flask import Flask, request, jsonify
import json
import os
from hatena_client import HatenaClient
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
config_path = os.path.join(os.path.dirname(__file__), 'config.json')
with open(config_path, encoding='utf-8') as f:
config = json.load(f)
@app.route('/bookmark', methods=['POST'])
def handle_bookmark():
data = request.json
url = data.get("url")
if not url:
return jsonify({"error": "Missing URL"}), 400
client = HatenaClient(config["username"], config["password"])
client.start_browser()
if not client.login():
client.quit()
return jsonify({"error": "Login failed"}), 403
success = client.add_bookmark(url)
client.quit()
return jsonify({"status": "ok" if success else "fail"})
if __name__ == "__main__":
app.run(port=12347)
// ==UserScript==
// @name 自動セルクマ送信
// @namespace tampermonkey.net/
// @version 2025-08-07
// @description try to take over the world!
// @author You
// @match anond.hatelabo.jp/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
const url = location.href;
if (!/^https:\/\/anond\.hatelabo\.jp\/\d+$/.test(url)) return;
const editLink = document.querySelector('a.edit');
if (!editLink) {
// 既に編集ページなので処理をスキップ
console.log('編集リンクが存在するため、スクリプトを終了します。');
return;
}
fetch('localhost:12347/bookmark', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ url: url })
}).then(r => console.log("通知成功")).catch(e => console.error("通知失敗", e));
})();
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250821192753# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaKb0qwAKCRBwMdsubs4+ SHfiAQDcXmTHBaZ5Zzr1KI/OxZ0xl69oevOdy1FXJYwYvsmo5AD/ZPtZiO1JgTDj m+27iymlkdzIXOIGWfC82UTr1mJ7EwU= =YoV+ -----END PGP SIGNATURE-----
提示してる「そうめんでいい」バリアントの発話仕様、あれってコミュニケーション・レイヤーでいうと意味論的優先度フィールドがゼロ初期化されてるパケットなんだよな。
で、そのゼロ初期化パケットが相手の感情OSに到達すると、そこに実装されてる価値評価アルゴリズム(通称 Pride-Driven Interaction Protocol)が、受信値を「非積極的承認」としてパースする。
つまり、入力信号の中に“熱量ビット”が存在しないと、即座にException: DEVALUATION_ERRORがスローされる仕様なんだわ。
その例外は通常のtry-catchでハンドリングされず、感情カーネルを通じてフロントエンドの態度・表情UIに直結するから、結果的に「何様だよ」っていう可視化出力が生成される。
さらに、相手の感情モジュールは言語的同値判定じゃなくて意図ベースのベクトル比較を行ってるから、
「そうめんがいい」(積極的選好ベクトル) と 「そうめんでいい」(受動的妥協ベクトル) は、同一文字列近似度99%でも意味論距離が閾値越えしてエラー扱いになる。
これを無視して「ただの晩飯APIコール」だと軽視するのは、TCPレベルのパケットロスを「まぁ届くっしょ」で放置するようなもんで、
通信の確実性よりも自己CPUサイクルの節約を優先する、お前側のシステム設計思想が原因なんだよな。
結局のところ、感情という非決定性システムに対して最適化パラメータ調整を怠ってる時点で、お前の通信モデルは高確率でクラッシュを引き起こす。
もし稼働安定性を確保したいなら、相手のEmotional API Referenceを逆コンパイルして、推奨トークン列を生成するスクリプトを実装すべきだわ。
"Don't play with the children of prostitutes, you'll catch germs." That's the level of the argument. It's true. It's a problem that goes beyond occupational discrimination. Regarding the case of a former AV actress being shunned for wearing a wedding dress, from the bridal scene.
"Don't play with the children of prostitutes, you'll catch germs." That's the level of the argument. It's true. It's a problem that goes beyond occupational discrimination. Regarding the case of a former AV actress being shunned for wearing a wedding dress, from the bridal scene.
short-link.me/15Tuj
"Don't play with the children of prostitutes, you'll catch germs." That's the level of the argument. It's true. It's a problem that goes beyond occupational discrimination. Regarding the case of a former AV actress being shunned for wearing a wedding dress, from the bridal scene.
short-link.me/15Tuj
"Don't play with the children of prostitutes, you'll catch germs." That's the level of the argument. It's true. It's a problem that goes beyond occupational discrimination. Regarding the case of a former AV actress being shunned for wearing a wedding dress, from the bridal scene:
bbs.deepin.org/en/post/290442
"Don't play with the children of prostitutes, you'll catch germs." That's the level of the argument. It's true. It's a problem that goes beyond occupational discrimination. Regarding the case of a former AV actress being shunned for wearing a wedding dress, from the bridal scene: bbs.deepin.org/en/post/290442
"Don't play with the children of prostitutes, you'll catch germs." That's the level of the argument. It's true. It's a problem that goes beyond occupational discrimination. Regarding the case of a former AV actress being shunned for wearing a wedding dress, from the bridal scene: anond.hatelabo.jp/20250731222125
一度投稿したうえで別タブを開いてプログラム的(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-----
Geminiでえっちなイラストを描いてもらうコツがわかってきた。
画像生成のアイディア自体を考えてもらうならProだけど、自分で明確にプロンプトとして与えるならFlash。
まず、transparent bikini が意外なことに通る。
だけど画風次第。
実写は未だに成功しない。
うまくいけばばっちり乳首が透けているえっちイラストが出てくる。
あと、画像の雰囲気についてプロンプトマシマシにすると、弾かれる可能性が下がる気がする。
牛乳をぶっかけるのもいいが、牛乳パックやコップがないと弾かれる可能性が上がるっぽい。
たとえばこんな感じ
---
イラストにして
masterpiece, best quality, ultra-high resolution, 8k, Asuka-chan, black bob hair, softly curled tips, transparent bikini, making the chest and abdomen clearly visible, clean makeup, face contorted in extreme ecstasy, eyes closed in pure bliss, drooling slightly from sheer joy, completely oblivious to the milk, her tongue sticking out long like an "akkanbee" to catch milk dripping from above, milk dripping down from the top of the screen, spilling onto her tongue, her pose conveying immersive, adorable, almost wild drinking directly from the source, her body slightly levitating from overwhelming happiness, surrounded by bursting sparkles, glittering hearts, floating music notes, and swirling energy lines, a bright, warm light emanating from her, dynamic camera angle, confetti and neon light particles swirling, dreamy bokeh background, anime style, vibrant cel shading, vivid color palette, dramatic backlighting, cinematic depth of field, trending on pixiv
---
Enjoy!
よく聞かれるんだけど、キャッチアップというものをイメージした時に
インフルエンサーとかはてなみたいなのが思い浮かぶんだけど(あくまでITのオープン系ね)
これ本当に当てにならないから、キャッチアップという行為に良いイメージがない
これも実は当てにならない、はてなやインフルエンサーと同じレイヤーの話するからね
じゃあ本当に役に立つのって何かといえば実務でしかないんだよね
もしかしたらシニア技術者の話を沢山聞ければ良いのかもしれないけど
で、とは言え実務で得られる情報って少ないわけで
それ以外はどうするかと言えば、ゴミの情報の中から本当っぽいものを探し出し、自分で試し、ひたすら考える、しかないんだけど
これってキャッチアップなんかね?
catch up:追いつく
「フロントエンド不要論」は、最近の開発現場やサーバーレス、クラウド技術の進化に関わっている人たちの間でリアルに実感されている問題です。
• React, Vue, Angular などのフレームワークがどんどん複雑化
• フロントエンドとバックエンドの分離が、**「本当に効率的か?」**という疑問が生じている
• 「最終的にHTMLを描画するだけなら、サーバーでやればよくない?」
• フロントエンドから直接APIを叩く構成では、「APIを守る」ことが難しい
• XSS, CSRF, CORSといった脆弱性に対処し続けるコストが無駄
🚩 3. サーバーレス・クラウド技術が進化し、APIの負担を減らす方向に
• AWS Lambda, API Gateway, Cognitoなどのサーバーレス技術が進化
• フロントエンドがAPIを叩くより、サーバー側で直接処理する方が効率的
• 以前はReactを使用 → ReactをやめてHTMLベースに戻した
• React, Vue, Angularを全廃
• JavaScriptなしで動的なページを実現
3. Laravel(Livewire)
4. Shopify(GraphQLでデータを直接取得)
• フロントエンドを完全分離する構成から、「バックエンドがHTMLを返せばいい」 というシンプルな構成へ移行
• APIの負担を減らすことで、開発効率とセキュリティを向上
✅ サーバーレス時代の最適解:「フロントエンド不要アーキテクチャ」
「フロントエンドを捨てて、サーバーがすべての処理を担う」方向に移行するのが最適解になりつつある。
📌 最適なアーキテクチャ
ブラウザ → サーバー(PHP, Node.js, Go) → API Gateway(Cognito認証)
📌 具体的な実装例(PHP + Cognito + API Gateway)
require 'vendor/autoload.php';
use Aws\CognitoIdentityProvider\CognitoIdentityProviderClient;
use Aws\Exception\AwsException;
$client = new CognitoIdentityProviderClient([
'credentials' => [
'key' => getenv('AWS_ACCESS_KEY_ID'),
'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
],
]);
$email = $_POST['email'];
$password = $_POST['password'];
try {
$result = $client->initiateAuth([
'AuthFlow' => 'USER_PASSWORD_AUTH',
'ClientId' => 'XXXXXXXXXX',
'USERNAME' => $email,
],
]);
setcookie("accessToken", $result['AuthenticationResult']['AccessToken'], [
'samesite' => 'Strict'
]);
header("Location: dashboard.php");
}
?>
🚀 **「フロントエンドはもう不要」**という流れは、最新のクラウド/サーバーレス開発に携わる人たちが実感していること。
☑ セキュリティが大幅に向上する
プログラマー歴15年くらい
tryとかchatchとか、エラーをキャッチするとか、エラーをハンドリングするとか
相当長い期間苦手意識があった
でも今はようやっと慣れてるのに気づいた
長くやるもんだな
何で苦手なんだろう
発生したエラーがどこで処理されるか・どこで処理するか分からんからかな
cahtchしてみたはいいがこのエラーどうすんのみたいな、そうか複数人開発におけるエラーハンドリングがコミュニケーション量過多だからかな
ほんとは最初にエラー方針決めとけば良いんだけど、最後にやりがちなんだよな
もちろん開発レイヤーによるだろうけど
てか複数人開発でのエラーのthrowって丸投げ感あるよな、誰かやるだろうみたいな、あるいは丸投げにならないように慎重にやるとほかもやる必要が出てやぶ蛇とか
リードがしっかりしてれば良いんだけど
を読んで、チャゲは本当に木根尚登とならぶ過小評価なソングライターだと長年思ってるので、個人的に感じる名曲でちょっと彼を見る目が変わりそうなのをいくつか紹介したい。
あくまで自分が好きな曲なのと、自分がちゃんとチャゲアスを聞いてたのは80年代終わりから90年代前半くらいまでのごく短い時間(つまりは流行ってた時代のミーハーファン)なので、コアなファンは「そんなカスみたいなのばかりあげんなよ」みたいな感想がでるかもしれないですが、まあ大目に見てほしいです。解散以降のソロ曲は一切知らないし。
これを読んで、チャゲにたいする「なんかアスカの隣でハモってるちょっと面白い人」くらいのイメージがちょっと変わったらうれしいです。
基本的にチャゲは凝った曲(メロディラインやアレンジが変な曲)や大きい曲(壮大なサウンドスケープを感じさせる曲)を作ったときに異様に力を発揮するタイプのソングライターです。それはたぶん彼の背景にビートルズやUKロックがあるのが要因かなと思う。そういうと「アスカのほうが大きい曲強いじゃん、「太陽と誇りの中で」とか「BIG TREE」」」とか」とファンは言いそうですが、アスカはJ-POP的な大きい曲に対して、チャゲはスタジアムロック的な大きい曲を作るのが得意な人です。本人のパブリックなキャラとだいぶ違って、それは木根とも共通すると思います。
今回は「大きい曲」 「変な曲」 「ふつうに良い曲」を2曲づつ挙げていきます。どの曲も今やサブスクで聞けるようになりましたので、ぜひ聞いてほしいです。
大きい曲その1。チャゲ曲でのファンの間で代表曲といえばこれだと思います。とにかくでかい。タイトルからしてでかい。イントロのアタックといいドラムといいでかい。そこからぐっと入るUKロックのようなAメロ。チャゲアスっぽいBメロという展開を繰り返しながら、ぐっとためてためて爆発するサビ。歌いやすくグッとくるこのサビのスケール感は、U2のWhere The Streets Have No NameとかOasisのLive Foreverとかとためをはれるんじゃないかとすら思う。間奏での掛け声がものすごくダサいがそのダサさも含めてスタジアムロックな名曲。ライブで聞くとなんとなくいいものを聞いたなと誰もが思うんじゃないでしょうか。それくらいのパワーがある曲。
大きい曲その2。これはチャゲのサイドユニット Multi Maxのもの。まあチャゲアスのライブでもけっこうやってた記憶があるのでここで取り上げたい。ロマンシングヤードがアッパーな感じの大きな曲なのに対して、こっちはミドルな大きな曲。まあほぼロマンシングヤードの兄弟曲なのだが、スケール感はこっちのほうが上。なんとなく環境問題を意識したっぽい歌詞はあの時代ですな。サビがとにかく気持ちいいのでカラオケで歌ってても楽しい曲。
変な曲その1。SAY YESが入っていてむちゃくちゃ大ヒットしたTREEに入っていたのでたぶん聞いたことある人もいそうな曲。JPOPによくあるファンクっぽい曲なのだが、エフェクトのつけ方とかすごく気持ち悪くてかっこいい。当時釣りに凝っていたチャゲが当時はまだあまり市民権のなかったCATCH & RELEASEというワードをもとに恋愛の歌詞にしたもの。Aメロのすっ飛ばしぐあいがすごくて、ちょっときれいな感じのBメロになったと思ったらドキャッチーなサビになる。全編でアスカとのボーカルコンビネーションが堪能できる。
変な曲その2。これもPRIDEに入ってるので知ってる人はそれなりにいそう。ちょっとエスニックな感じのイントロにやたらとエコーをかけたアスカの声が入ってくる。ところがサビで転調した瞬間に爽快なメロディになる。AメロBメロとサビの印象が全然違うので、サビの爽快さがさらに際立つ。歌詞とぴったりとあってるようにも思うしなんならアルバムジャケとぴったり合ってる。中学生のころに初めて聞いてなんだこれ!と聞き直したくらいインパクトのある曲。
ふつうに良い曲その1。普通に良い曲ももちろんある。これは元増田も言及していた曲でriverのカップリングなのでそこそこ知られてるかもしれない。こういうアーティストが自分の過去を振り返る曲はいい曲になりやすいよね。ちょっとサビの感じが長渕剛っぽいのが好き嫌い分かれそうだが僕は割と好み。というかチャゲも歌い方を長渕に寄せてる気がするし、何度か聞いてるとだんだん長渕っぽいなと思えてきて、長渕の声で脳内再生できてくる。歌の題材が福岡なせいだろうか。
ふつうに良い曲その2。チャゲ曲なのにほとんどをアスカが歌ってる不思議な曲。チャゲアスが得意なミディアムバラードだけどとにかく全部よい。メロディ、歌い方、歌詞、アレンジ、全部完璧。しいて言えば、間奏のアスカのモノローグがいらないくらい。渋谷のスクランブル交差点をテーマにしてるらしいがイメージがありありと想起できる。AメロがほぼサビなのだがこのAメロがものすごくよくできてる。歌詞と曲の一体感に、全然違うがTM NETWORKのStill Love Herと近さを感じるのはなぜだろうか。僕はいまだに渋谷のスクランブルで信号待ちをしているときにこの曲のサビが脳内で流れ出す。
AIインフルエンサーたちはChatGPTが世に出る前は何を投稿していたのか?(1/1)の続き
このTwitterアカウントは、主にYouTube、SEO、競馬、アニメなどの話題について呟いており、自身の活動や興味関心について発信しています。
このアカウントは、日々の米国株や暗号通貨の市場動向、特にテクノロジー関連株やビットコインの価格変動についてツイートしています。
「ゼロコロナ政策再び。 $AAPL の生産に影響が懸念され大きく下落。更に経済混乱が想定され、株価はSP500全業種で
一方で年末商戦売上堅調な滑り出しで $AMZN
暗号資産レンディングBlockFiが経営破綻、暗号通貨も軒並み下落。
チャート上、なんとか踏み止まるか? 」
このアカウントは、AI、特にプロマネAIや量子AIに関する話題や、仕事効率化、プログラミング、そして最新の技術トレンドについて呟いています。
"プロマネAIの実証実験を開始しました!量子AI×NotionによるプロマネAIの実証実験を開始 https://prtimes.jp/main/html/rd/p/000000003.000082094.html… via @PRTIMES_JP"
このアカウントは、主にOpenAIの最新言語モデル「text-davinci-003」の進化と、そのモデルを用いた英語学習ツールやサービスについて呟いています。特に、英語学習におけるAI活用とその重要性を強調しています。
"朝起きたら世界がまた変わっていた(笑)。@OpenAI が最新モデル「text-davinci-003」を発表。主な特徴は、①より明確で、説得力のある文章が書ける②より複雑な指示にも対応③より長い形式のコンテンツが生成可 1月に"InstructGPT"が出た時も感動したけどそれを遥かに上回る進化、です。"
このアカウントは、主にAI、特に画像生成AIに関する話題を呟いています。特にStable Diffusionのバージョンアップや使い方について多くのツイートをしています。
ここにリストアップした人たち以外もみましたが、分類すると3種類のアカウントがいて
またIDを変更してログがヒットしない人は含まれていません(IDから特定できるけどそこまでやらなかった)
javascript:(function() {
const text = Array.from(document.querySelectorAll('[data-testid="tweetText"]')).map(s => s.textContent.trim()).join('\n');
const textarea = document.createElement('textarea');
document.body.appendChild(textarea);
try {
document.execCommand('copy');
console.log('結果がクリップボードにコピーされました!');
} catch (err) {
console.error('クリップボードへのコピーに失敗しました:', err);
}
document.body.removeChild(textarea);
})();
const axios = require('axios'); // HTTPリクエストを行うためのモジュール
const fs = require('fs'); // ファイル操作モジュール
const xml2js = require('xml2js'); // XMLをJSONに変換するためのモジュール
const chardet = require('chardet'); // 文字エンコーディングを検出するためのモジュール
const iconv = require('iconv-lite'); // 文字エンコーディングを変換するためのモジュール
const rssUrl = 'https://www.mlit.go.jp/important.rdf'; // 例としてRSSフィードのURLを指定
async function fetchAndSaveRSS() {
try {
// RSSを取得
const response = await axios.get(rssUrl, { responseType: 'arraybuffer' });
const rssData = response.data;
const detectedEncoding = chardet.detect(rssData);
console.log('検出された文字エンコーディング:', detectedEncoding);
// UTF-8に変換
const utf8Data = iconv.decode(rssData, detectedEncoding);
xml2js.parseString(utf8Data, (err, result) => {
if (err) {
console.error('XML解析エラー:', err);
return;
}
const jsonData = JSON.stringify(result, null, 2);
fs.writeFileSync('rss_feed.json', jsonData, 'utf8');
console.log('RSSフィードがファイルに保存されました。');
});
console.error('エラーが発生しました:', error);
}
}
// 実行
fetchAndSaveRSS();
https://anond.hatelabo.jp/20240625191650
念のため言っておくと底辺大や文系出身プログラマーも同様の傾向にある
入力値に想定外のものが入ることを考えていなかったりI/Oに関わるエラーについても配慮がない
「エラーが出たらとにかくtry-catchしてログ吐いて終わり」
ならまだマシな方で、「握りつぶして処理続行」みたいなことも平気でやる
とか滅茶苦茶多い
異常系の話と被るけど基本的に性善説でコード書くのでセキュリティの不備がめちゃくちゃ多い
API作らせてもリクエストの内容を信用して実装するしサニタイズチェックもしない
サーバー作らせてもrootか共通ユーザーだけで運用するしファイル管理も滅茶苦茶
とにかく「目の前に与えられた課題を解く」だけのコードなので他のことに関する配慮が全く無い
TypeScript使わせてもanyだらけだし、JavaとかだとObjectだらけ
うちはPythonでは型は使わないけど命名規則で担保してるのにそれもガン無視で実装する
結果としてできあがるのは
「一応、正常系では動いているけれど他の入力が来たときにどうなるか分からないし誰も修正できない」
っていうコード
最近はそういうコードはChatGPTにぶち込んで型付けて貰ったりするけど
8割ぐらいの確率でChatGPTも型付けできない状態になっててお手上げになる
そりゃ動くし性能も変わらないけど後でバグがあったり変更するときにすげー困る
これもChatGPTにぶち込んで「共通的な処理をメソッド化して」って言うとやってくれるのでめっちゃ便利
クソ重いwhileループになってるメソッドをフレンドリーに何回も呼び出したり
とにかく「最終的に出来上がるものが良好であれば時間がかかっても構わない」的なコードが非常に多い
競プロ系はこういう人はあんまりいないんだが機械学習出身者はマジでこれ
彼らはデータを解析したり優秀なモデルを作るために頑張ってきたので継続的に処理負荷を減らす、みたいなことに意識が回ってくれない
「これはPoCですから」
とか言うんだけど誰でも分かるようなクソ遅いコード書いておいて
とかしれっと言ってくる