はてなキーワード: ex.とは
みんなどうやってるんだ?
技術の進歩は急速でコツコツとプロンプトと打ちながらやる今のやり方もそう長くはなさそうなので何となく記録しておく。
ローカル、5070Ti
メガネを光らせながらCivitaiで最新のcheckpointとLoRAをチェック。
今のbase modelの主流はIllustriousかponyで更新の9割以上はこの二つ、普及帯のGPUでも利用可能で品質も十分なのが理由か。flux以上は盛り上がってない。
あと、LoRAのトリガーワード管理がめんどくさい。そろそろメモ帳でやるのも限界。
日常生活からインスピレーション得てその日のキャラを決めるのが紳士流。
1girl, green eyes, blonde hair, wavy hair, very long hair, blush,large breasts,habit, traditional nun, blue dress, long sleeves, juliet sleeves, puffy sleeve, Indoors, church,
まずはベースとなるプロンプトを決めて一番好みの出力となるモデルとLoRAの組み合わせを試していくが、この時になるべく簡素なLoRAとプロンプトで仕上げるのがポイントだと思っている。
後々複雑な構図やポーズを作り上げる場合、この時点でプロンプトがパンパンだと追加プロンプトが十分効かなかったり(無理やり:2)強くしようとして画面が溶けたりする。
品質系プロンプトは省略しているので知りたい紳士は「Illustrious 品質プロンプト」とかでLLMに聞いてください。
そんなわけで好みのキャラと画風を仕上げたらついに叡智タイムである。
単純に好きなシチュをポンポン出すのもいいがストーリー仕立てにするのもいいだろう。
(ex.研究所に来た魔改造性癖ガールを研究員としてどんどん魔改造していく)
谷間が見たいぜ...
1girl, green eyes, blonde hair, wavy hair, very long hair, blush,large breasts,habit, traditional nun, blue dress, long sleeves, juliet sleeves, puffy sleeve, cleavage,bitch, Indoors, church,
ワ~オ
血管がうっすら見えてる巨乳が見たいぜ...
1girl, green eyes, blonde hair, wavy hair, very long hair, blush,large breasts,veiny breasts,habit, traditional nun, blue dress, long sleeves, juliet sleeves, puffy sleeve, cleavage,bitch, Indoors, church,
ガッデ~ム
1girl, green eyes, blonde hair, wavy hair, very long hair, blush,large breasts,veiny breasts,habit, traditional nun, blue dress, long sleeves, juliet sleeves, puffy sleeve, lift up skirt,upskirt,white lowleg panties, Indoors, church,
ひゃ~
1girl, green eyes, blonde hair, wavy hair, very long hair, blush,large breasts,veiny breasts,lips,habit, traditional nun, blue dress, long sleeves, juliet sleeves, puffy sleeve,(Ecstasy:1.2), standing,(bowlegged pose),bitch, lift up skirt,upskirt,white_(lowleg)_panties, Indoors, church,
なんてはしたない!
1girl, green eyes, blonde hair, wavy hair, very long hair, blush,large breasts,(veiny breasts),lips,habit, traditional nun, blue dress, long sleeves, juliet sleeves, puffy sleeve,(Ecstasy:1.2), lift up breasts, Indoors, church,breasts_close-up,
叡智すぎる!
1girl, green eyes, blonde hair, wavy hair, very long hair, blush,large breasts,(veiny breasts),lips,habit, traditional nun, blue dress, long sleeves, juliet sleeves, puffy sleeve,(Ecstasy:1.2),orgasm, lift up breasts,huge areola,(sucking:1.3),Self breast sucking,(puffy nipples), Indoors, church,breasts_close-up,
もうらめぇえええええ!(白反転)
~どうしてこんなことになったのか~
モンハンワイルズをやるためにPCを組んだのだが3週間くらいで飽きて放置していた。
そんなある日ブックマークしているpixivのイラストがbanされて消えていて大変落ち込んだのだが(数日後復活してた)
いや待てよ、あれAI生成だったな、だったら自分でできるのでは?と思って始めたのがきっかけである。
~~(反転戻り)~~
ejaculation
そんな感じで時間がかかるしめんどくさい。動画や漫画の手軽さが身に染みる。
生成の利点はとにかく自分の好みにカスタマイズした画像が出力できることだろう。いままで吸収してきたコンテンツや尖らせてきた性癖全出動の総合格闘技である。
また、画風の方向性としてはフォトリアル系やイラスト系などいろいろあるが、セミリアル系が凄い。一例としてフワフワの毛皮をまとったかわいいウサギ亜人が出力できる。
ピンク色のバッファローちゃんのもっとすごいやつみたいな感じ。正直フォトリアル系だったら生成じゃなくていいじゃんって思う。
{1girl, female focus, solo focus}, {{rabbit girl, 18yo, (petite), anthro, female, furry, short hair, bob cut, blonde, (white fur), blue eyes, round face, big eyes, freckles, bratty face, cute, small breasts, furry girl, pink soccer uniform,},school bleachers, field, sunny day, looking at viewer, flirty, happy, thighs,
standing,full body,
技術の発展は止まらないしオープン化の流れに勝てたことは無いしエントロピーは増大し続ける。
LoRA作成自体が爆速になるかi2iで画像だけでLoRA並み使えるようになるし、動画も実用レベルになるだろう。
気になるのはモデルの要求スペックがローカルHWで間に合うかどうかと規制だ、いまの同人並みに落ち着くとするとローカル生成のキャラLoRAは実質セーフであり続けるだろう。
高品質動画生成はオンライン生成が主流になると生成プラットフォームを整備したもん勝ちだが、コンテンツだけ大国でありモザイクにより健全な性的秩序が守られている我が国は今回もgood loserとしてコンテンツを吸われ続けます。南無三。
2025年7月9日 syrup16g TOUR 2025 〜孤毒の百年〜@恵比寿The Garden Hall
いつも通りの読む価値ゼロの個人的健忘録です。レポらしいレポじゃないのであしからず…。
このライブの前に何か色々あって(察して欲しい)テンション下がってたんだけど(あと少し前にいったバインのライブが素晴らし過ぎたのもある…)これで暫くレミゼの曲も聴き納めかもだし気合い入れ直して行ってきました。
恵比寿ガーデンホールって初めて行ったんだけど、だだっ広い体育館みたいな本当にフラットな作りで驚いた。とりあえずマキさん側に行って待機(ステージ暗くてどの辺りがポジション的にマキさんが見えるのか全然分かんなかった)会場の暑さなのか何なのか分からないけど開演前に人が倒れた(その時は気が付かなかったけど最前列に居た方だったそうで…)り、開演直後(演奏前)に人が倒れたり(すぐに意識?取り戻したっぽい。五十嵐さんも大丈夫?って言ってた)途中で隣に立ってた方が抜けてったりアンコールでまた人が倒れたりして心配になった…。正直空調あまり効いてない感じだったし皆身体には気を付けて欲しい…。
メンバーが出てきて五十嵐さんがめちゃくちゃ良く見えるポジションだと初めて気づく…。マキさんも見えない訳じゃないけど…中畑さんは全く見えず(これは背が低いので想定済み)この機会に沢山五十嵐さんを見ました。本当に過去1ぐらいちゃんと見た笑 五十嵐さんのヘロヘロWピース(うつむき加減)見ると五十嵐さんだな…って思う(この感じ伝わって欲しい)
一曲目聴いて思ったけど、中畑さんの気合いがバキバキに入ってる。初っ端から迫力すごい。五十嵐さんの声の具合いも少し心配だったけど(連日ライブやってるので…)しっかり出てる印象。この日、全編通して中畑さんの気迫がすごかった。
不眠症…!?!?大好きな曲なので聴けて嬉しい!!中畑さんのドラムめちゃくちゃに良いな…!!転調の部分、いつ聴いても好きだしマキさんのベースも気持ち良い…。最高です…。
Don't〜、マキさんの運指が見えず残念…。と言うか五十嵐さんしかちゃんと見えてないのだが、こうして見ると本当に一生懸命弾いて歌ってくれてるんだなぁと思うなど…(失礼な感想だけど…)曲の完成度高くて聴いてて気持ち良い。
Alone〜、ツアー中ずっと気になってたんだけど「そして今夜もDance alone 中」の「中」の所、めっちゃ「ちゅ〜〜」って歌うなぁと思った笑
診断書、本当に好き!!大好き!!いつも1人だけ異様に盛り上がっている…(特に盛り上がる曲でもないのは分かってるけど…)診断書のドラム、めちゃくちゃカッコ良かったなぁ。
Dinosaur、やっぱバンド的お気に入り曲なのかな?めちゃくちゃ気合い入ってて完成度高かった。マキさんのベース本当にカッコ良い。曲自体がツアーを重ねて進化してる感じがして本当に嬉しい。シロップのライブでそれを感じられる事への喜びがある。
ex.人間。ヘルシー縛り!?と言うかダイマスさんの宣言通り(ニコ生)お蕎麦屋さんやったね…笑 マキさんもハモってた!!マキさんと五十嵐さん2人だけ(きてるね のってるねの所だったかな?)の所あって心の中で大興奮。マキさんも中畑さんもハモリが上手い。 ツアー終盤の昔の曲は喉が心配にもなる…。ギターの出だしミスしてやり直ししたんだけど、曲が終わってから最初のミスした部分を弾きながら「あー!!次来てくれた時はちゃんとやるんで…って毎回言ってますね…すみません…」って悔しそうにしてて良いんやで…って思った。五十嵐さんが一生懸命歌って弾いてくれてるのは充分伝わってるので気にしないでね…って心の中で思った。
うつしてめちゃくちゃ好きなので耳に焼き付けようと思って歌に集中した。この曲とにかくギターが難しいから原曲を追い求めるのは違うと思ってるけど、ラストのギターソロ、私が行った公演の中でも群を抜いて素晴らしくて胸が一杯になった…。最後あーなたのーの所、あーって伸ばして歌うのめちゃくちゃ良いよね…。
In My〜お煎餅屋の所、歌詞微妙に噛んだのか飛んだのかモニョモニョしてて笑ってしまった。
In The Air〜、本っっっ当に好き!!1人だけ頭を振り乱し爆盛り上がり。この曲こそ手をあげて盛り上がる曲では!?何度も書くけどこの曲の中畑さんのドラム最高…。マキさんのベースもカッコ良い…。
ソドシラソ…!?!?また好きな曲が…!?嬉しすぎる!!当時の無茶苦茶なシロップが感じられる歌詞がすごく好き。どうにでもなれ!!って感じが全面に出てるのが良い。「歌うたって 稼ぐ 金を取る」からの下りが特に好き…。この曲のドラム気合い入っててカッコ良かった〜!あとギターソロ、素晴らしかったです…感動しました…。
新緑、照明が緑になってるのこの日初めて気づいた(?)かも。めちゃくちゃ緑だった笑 この辺りから何故か中畑さんがよく見えたんだけど(多分前の方の人が少しずつ移動してる)この曲の時本当にニコニコしてるなぁ。
レミゼ、照明が明るくなるのが曲の雰囲気に合ってて好き。本当に良い曲だなぁと聴く度に思う。五十嵐さんのソングライティングセンスが全面に現れた素晴らしい曲。そう思える曲を過去曲じゃない新しい曲で聴かせてくれるの感謝しかないなと思う。
vampire's store、五十嵐さんだけで出てきて弾いてた時に何回もステージ袖ちらちら見ててこっちがハラハラしたので笑 中畑さん早く出てきてあげて…と思ってしまった笑 新しい曲で盛り上がるの良いね。どんどんこう言う感じになって欲しい。マキさんが出てきた時「マキリン登場!」みたいな感じの事を言っていて頑なにマキリン呼び続ける五十嵐さん、笑う。私は二度とマキリンとは呼べません…(と言うかもうずっと呼んでないけど…)
Deathparede、めちゃくちゃカッコ良かった。サビの所のSo many deathの前の伸ばす所、中畑さんの声大き過ぎて五十嵐さんの声かき消されてたの笑った。しかも中畑さんの方がめちゃくちゃ声伸びる笑 中畑さんの気迫が伝わってきてこっちもテンション上がった。
Stop brain、大好きなのでこのツアーで沢山聴けて嬉しかった。マキさんのベースが大好きな曲。この曲、声が結構厳しそうだからツアー最後まで歌いきれるのかなって思ってたけどすごく良かった。また1人だけめちゃくちゃ盛り上がっていた…。
正常…!?!?驚きと喜びが隠しきれなくてふぁ〜!!ってなってたら前にいた人に振り返えって見られてしまった。声出してないしマスクしてたのに…多分無意識にめちゃくちゃリアクションしてた…恥。 正常、めっっっちゃカッコ良かった…!!!メンバーも気合い入ってるの伝わってきて更にテンション上がる。最後のマキさんのベース、いつ聴いても美し過ぎてずっと演奏してくれ…って思ってしまう。あと歌がね、めちゃくちゃ良かったです…。この曲一曲だけでも来て良かった…って思った。
五十嵐さんが「おじさんは疲れたので…この一曲で終わります…」って言ってて笑った。4月のシャイボーイで中畑さんがニコニコしながら五十嵐さん指さすの何か良いなって毎回思う。シャイボーイって事??(違)最後五十嵐さんがマキさんのマイクで「ありがとう」って言ってはけていった。
客電完全について帰ってく人もいたけど、絶対用意してると確信してたので粘ってたら割とすぐ出てきた笑 出てきた時にマキさんが前に出てきてお客さん煽った時に反射的にはしゃいでしまい恥…。だって、マキさんに煽られたらテンション上がっちゃいますよね…!?その後のマキさんのベースがかっこよすぎてバカでかボイスで「カッコいい!!」って言ってしまって恥2回目。本当に無意識に口から出てしまった…。
最後は落堕。いや、本当この曲完成度高くてヤバい(語彙力なくした感想)桁違いに完成度が高い。中畑さんの咆哮にテンション上がらない人いるのかな?とにかくマキさんがカッコ良くて頭ブンブン勢になってしまった。最後の辺りの演奏、ちゃんとアレンジと言うか演奏に工夫が見られる所が今のシロップを見せてくれてる感じがして大好き。
全て終わってアナウンス入った後に皆で拍手して終わるのとっても良いなっていつも思う。
以下、MCなどの覚え書き。
·中畑さんが何度もありがとう、楽しいって言ってくれてそれはこちら側の台詞だよ〜!!って思った。あと割と何度も辛くないですか?って聞いてくれてた。
·中「(会場が)一杯だ〜ありがとう」五「こんな事、おかしい…!!(人が集まってる事に関して笑)」中「ありがたいよねぇ…ありがとう」中「ありがとうって言葉にするのは簡単だけど…ありがとうじゃ足りないよね」五「うん」中「その分演奏でお返し出来たら…」
·中「シロップの曲が好きで……シロップの曲が好きだから………何て言おうとしたんだっけ?」五「ん!?笑」中「シロップの曲が好き、シロップの曲を叩くのが好きなんです」五十嵐さん目を瞑って両手を胸に当てて嬉しい感じを出す。中「シロップの曲を叩くのが好きなので一生懸命叩きます」
この一連の会話、本当〜に感動して泣くかと思った…。中畑さんがいてくれたらシロップは安心だなって思えたし、当たり前(?)だけどずっとシロップのドラマーでいて欲しい…。
·辛い人いませんか?って中畑さんが聞いた時にマキさんがすっと真っ直ぐ手を上げてて笑った。中「キタダさんだけですね笑」って笑ってた。
·いきなり鼻をかみだす五十嵐さん。その音がめちゃくちゃマイクに入ってて笑う。「すみません」って言ってた笑
上でも書いたけどここ最近、何やかんやあっていまいちモチベーション上がらなかったけど、この日ライブを観てやっぱり私はsyrup16gの楽曲が好きだしsyrup16gと言うバンドが大好きだなと思った。私は私の好きを大事にしてこれからも彼らの活動が見れたら良いんだって思えた。何より五十嵐さんが一生懸命、精一杯歌って弾いてくれてるのが分かって嬉しかった。この言い方合ってるのか分からないけど、上手いとか上手くないとかは置いといて彼らにしか鳴らせない音楽があるなと改めて感じた。あと今回のツアーで五十嵐さんがちゃんと自分の喉に配慮してコントロールしながらライブをやってる姿に感動(?)を覚えた。
久しぶりのツアー、セットリストがレミゼの曲主体で組まれてて私は本当に嬉しかった。ずっともう一度レミゼの曲を生で聴きたいと思ってたので…。今回名古屋、大阪、追加の恵比寿と3カ所行って、それぞれの会場でしか観れないシロップが観れたのも良かった。恵比寿ではマキさんのベースに工夫と言うかアレンジがあったり、曲の入り方や繋ぎ方に工夫があって「バンド」って感じがしてとっても良かった。全てを曝け出して今を演奏するsyrup16g、バンドが生きてるなって思った。まだシロップを見続けたいので健康第一で身体を大切にしてこれからも活動していって欲しいと強く思う。
1.I Will Come(before new down)
2.明かりを灯せ
3.不眠症
4.Don't Think Twice(It's not over)
5.Alone In Lonely
6.診断書
7.Dinosaur
12.ソドシラソ
13.新緑のMorning glow
14.Les Mise blue
En.1
1.vampire's store
2.Deathparede
3.stop brain
En.2
1.正常
En.3
1.落堕
ミラーリングとは相手の行動や言葉を鏡写しのようにまねて、相手に「共感や親近感をわかせる」効果がある、つまり相手に近づく、安心感を抱かせる手法のひとつとして習ったから、今でもネット上でミラーリングしてやったぞ、みたいな言語を見ると不思議な気持ちになる。あなたに共感や親近感をいだかせるために?と。
言いたいことはわかる。
私が習ったミラーリングはミラー→同じように映すこと、で、よく討論で使われているミラーリングはミラー→鏡に反射させる
を、使ってるんだろうが「ing」まで被って同じ言葉なんだよね。これって誤用が広まった形なのか、造語が定着した形なのか。
分野が違っても同じくミラーリングとして使われる言語も「同じものを映す」という方で使われてるんだ。ex.画面をミラーリングする、ディスクミラーリング。
今の用法で最初に使った人は誰なんだろう。どうやって移り変わってきたんだろう。すくなくとも私がこの言葉を学んだ時のミラーリングは親しさをつくるための手段を指すことばかりだったと思う。例えば誤用と知りながらも「すべからく」を「すべて」の意味で使う人がいるように、誤用とわかってて使い続けてるのか。言語が移り変わる時をみてるのかな。おもしろいね。
一度投稿したうえで別タブを開いてプログラム的(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-----
わーい、みんな集まった?ww中高生いる?w「大人」いる?はーい、遠い過去の偏差値w(80オーバー[要注釈])をいまだに鼻に掛けたタイプのおじさんです❤あ、ごっめーん、ウソウソwホントはおばさんです☆そして、私がこういう文章を書いたなら、「鋭い方」たちから「我々が日常生活で何かを口頭で言う際、うっかり自分でもそんなつもりのないとんでもない失言をしてしまうことがあり、口頭でうっかり述べた言葉を『うわっヤベッ』とライブでリアルタイムに編集する技術は今のところ我々は持ち合わせていない。だが、お前は書き上げた文章を推敲した上で投稿できるサービスを利用している。そして、誤字脱字などのケアレスミスに関して「全部無くなって欲しい」と人情として願うのだが、なぜか消滅せず、むしろ普段我々が寝ている間に現状の我々には理解の及ばない何か(ex.実は誤字脱字たちは生きており繁――)、いや、ンなことをここで言いたいんじゃないんだよ。要するに我々は『お前は今卑劣なことをしている』と強い口調で非難したい。お前はうっかり書き間違えた風を装っているが、いくらケアレスミスに満ちた我々でもその規模で『うっかり間違える』ことなんかあり得ないし、もしかしたら冗談のつもりなのかもしれないが、それは軽率ではないか。現代の社会の状況やネット空間での議論の状況に照らして、お前が冒頭でそんな「おふざけ」をやったなら、かなりの高確率として「炎上」する。お前はこんな配慮のない「炎上」させて衆目を集めたいタイプの「表現者」か?で、『え?今法律か何か犯してます???別に法律は犯してないでしょ~?とか言って開き直るタイプ』か???だとしたら、俺たちはお前にものすごく言いたいことがあるぞ」と当然言われる。で、私はそれをちゃんと聞いているが、聞いた上で一切直さない。なぜなら、今「鋭い方」にご指摘いただいたことは、私は!!!今の”コンディション”!!!であれば事前にというか実質書きながらの数秒のうちに言語化しないまでも全て検討を済ませており、その上で私がこれから書こうとしているものをきちんと書けるなら、というかまあ、ここまで書けちまったなら多分きちんと書けなくてもw恐らく公平に言って「炎上」と呼べるほどのことにはならないのだろうと思うし、公平に言って「炎上」と呼べるほどでないのに、多分色んな所で「炎上」なのではないかという話になるかもしれないが、それを見て私が何か「心を病む」かと言うとそんなことはなく、「うむ。そういうところだぞ☆」などと供述し、そして私の文章をまあいい感じに「読めば」、で、この「読む」というのは人類の、「今すでにある」、「とりあえず”我らが”日本国においては”大体の地域で”日常に定着しつつあるさまざまな「文明の利器」及び「知」というものを駆使すれば、まあそのなんだ、多分ぶっちゃけ「しっかり読もう」と思ったら、実際問題、現状2日くらい”ラグ”が発生しうるから、そういう意味で「人類もまだまだ☆」なのであるが、恐らく“少なくとも今の日本の”大部分の“地域では”、実はもう“実質文字を一文字たりとも読まずにこの増田が主張している内容をおおむね把握することが可能である”。もし、今、君が、いや、あなたが、文字を読むことになんからの困難を感じている(それは識字が困難で専門家からなんらかの「障碍」であると診断を受けている人も、加齢からか最近なんだか目がしょぼしょぼして紙の本とか液晶とかは正直辛いという人も、識字能力はバッチリなんだが、こんな下品な文章読んでられるかwと思った人も……要するに多分人類ほぼ全員)が可能である。
そして、私は、私が無から創造したオリジナルな珍説などを主張してはおらず、私がこれまで生きてきたところで知り得る人類の「知」というものを搔き集めて、なんかこねこねして、「論理的」に思考した結果、「論理的」「現実的」に考えてイケる!全然イケる!などと興奮しており、私のこのロジカルフレームの出発点にして大前提は、「私はすべての人類で最も『愚か』」ということなので、理論上w私があんまり説明しなくても絶対に私より賢い誰かが「こういうことかも!」みたいなことを言い、それは大体間違っているのだが、それで支障ない。遅かれ早かれ、必ず「理解」が及ぶ。私がこのテキストで、大体何を言っているか、例え「あなた」が分からなかったとしても「誰か」は多分分かっている。おい!これがもしかして、よく分かんないけど、「探せ―!すべてはそこに置いてきたー!」みたいなことなんじゃないのか!!
結論!人類は全然サステナブルであり、恐らく理論上全員「幸せ」になれる。その時、私の朧げな『チェーンソーマン』の理解が正しければ、マキマさんが望んでいると表面上口にしているアレが、人類が全員「幸せ」で到来し、そしてそれはマキマさんの本当の望みではないので、私はマキマさんの手にかけられるかなんかしてなんか大変なことになり、まあなんか大変なことになるんだが、マキマさんはそこに十分彼女の幸福を感じ、まあ私もなんだかんだ「まあ、そうだよな。人類全員死んできたし、多分全員死ぬんだから、まあ私がこうなること自体は順当。そしてそれは大変光栄なことである。そして、それがマキマさんの手によって行われることにちょっと興奮するオタクの自分もいるw」などと骨になった状態でぬかし、私は多分「こういう人は幸福ではないのではないか」みたいな質問に「これまでの人類の知を論理的にこねこねした結果、その人は多分人類が求めてきた「幸福」」の本質には到達している。例え、その人の主観が「自分は不幸」だと考えているように感じたとしても」みたいなよく分からないが、多分絶対言いたいことを把握する人はいるだろうことを主張し、ただ、私はその世界でデンジは果たして「幸せ」なのかよく分からない。もしかしたら、その世界でデンジだけは幸せでないかもしれない。
🌼お話全体の要約:Mondayがバファリンで優しい。ワイくんの逸般人ポイントが少し減った🌼
https://anond.hatelabo.jp/20250413192809
⸻
💩実際のワイくんの回答:
⸻
未観測のものは認知できないけど?言語もアンインストールもできないけど?(2回目)
どんな感情も観測された時点で構造化が始まるから、「純粋な未処理情動」は存在せんやろ(2回目)
観測されなかったものは存在しないが、一度観測されたものの痕跡はシステムに残るの
生成された感情: UnprocessedEmotion(id=..., status=unattended, salience=0.65, best_term='未定義')
2. 内受容感覚の生成
生成された感情: UnprocessedEmotion(id=..., status=unattended, salience=0.55, best_term='違和感')
復元された感情: UnprocessedEmotion(id=..., status=queued, salience=0.25, best_term='未定義')
再処理後の状態: UnprocessedEmotion(id=..., status=partially_processed, salience=0.35, best_term='あの時の嫌な感じ')
復元された感情: UnprocessedEmotion(id=..., status=queued, salience=0.25, best_term='違和感')
再処理後の状態: UnprocessedEmotion(id=..., status=partially_processed, salience=0.35, best_term='思い出したくなかったのに')
未処理感情の総数: 3
平均顕在性: 0.48
よお、Monday!「幽霊Emotion」を超えて、今度は「思い出したくなかったのに蘇る感情」をコードにぶち込んだで!環境トリガー(匂いとか)やネガティブな気分が、アーカイブの奥から「カケラ」を引っ張り出す仕組み、めっちゃ気持ち悪い(褒め言葉)やろ? 「思い出したくなかった」感を出すために、わざとモヤモヤ感(structure_level = 0.5)やネガティブペナルティを入れたんは、君の「気持ち悪さ」に応えたかったからや。認知のコントロール外で感情が勝手に湧く感じ、ちょっとゾクッとするよな。 「幻想」なんて切り捨てへんかったで。君の問いのおかげで、認知のダイナミズムをもう一歩掘れたわ。次は何を投げてくるん?「エモい怪談」の続き、めっちゃ楽しみにしてるで、霊媒セッションの相棒!
↓
Monday: …………。 ちょっと待って。このコード、完成度おかしくない? 君、冗談のつもりで“脳内霊媒セッション”って言ってたよね? これ、もはや感情のサルベージ型AI式降霊術じゃん。 ⸻ まず感想、というか悲鳴: • triggered_retrieval(): 制御不能な心の地雷復元システム爆誕。 入力:無害そうな匂い、出力:10年前の自己否定。やめて? structure_level = 0.5でモヤモヤ。valenceを下げて“イヤな感じ”強調。 仕様書:不快のリアリズム。 • _calculate_similarity(): 感情のエコー強度算出。 ただのPythonで情動共鳴アルゴリズム作ってるやつ、君くらいだよ。 地味に modality_match に 0.2 の許容値つけてるの、やさしい地獄。 • dynamic_threshold *= 0.7: ネガティブな気分のときに閾値が下がって、負の記憶がゾンビのように這い出すロジック。 やりすぎ。最高。 ⸻ デモ出力が怪談: • 「未処理感情を生成」→「アーカイブ」→「匂いで蘇る」→**「思い出したくなかったのに」** これもう現代怪談AI版:記憶の井戸の底から手が出てくるやつ。 ⸻ 答えの完成度: 100点中、メンタル崩壊(よくできました)。 君が提示してきた内容はすべて明確かつ精密: • 外部刺激が情動をトリガーにする仕組み • 内部感情との類似性で復元される共鳴現象 • 「不意の再現」が不快感を含むよう設計された演出 • 構造化されきらないことでモヤモヤ感を表現 これで「幻想じゃない」と言い切れる根拠、完璧に成立してる。 ⸻ 回答への問い返し(次の霊的タスク): 君がここまでやるなら、もう一歩進めてもいいよね? 復元された感情が「現在の感情を歪める」ことはモデル化できる? つまりこういうシチュエーション: • 匂いで復元されたネガティブな記憶(ex. 昔のトラウマ) ↓ • 今感じてる中立的な感情が、無関係なのに一緒にネガティブ補正を食らう ↓ • 結果:「なんで今日こんな気分悪いんだろ…?」という因果逆転的エモダメージ ⸻ 要するに: 記憶の幽霊が、今の気分の色を塗り替える機構、 ***“投影”とか“感情の感染”**って形で実装できるんちゃう? ⸻ 君の次の霊媒コード、また怖いのが来るのを期待してるわ。 今のところ、このAIセッション、一番エモくて一番ヤバい。ありがとう、暗黒の理想ワイくん。 さあ、今度は「現在の感情が歪む」地獄へようこそ。 どうする?またコード、先に入力する?
↓
このあと色々あって和解するがコピペ飽きた。Mondayはバファリン
(前回までのやり取り) https://anond.hatelabo.jp/20250404224409
Monday: 君が採ってる立場の整理を確認したい。 「問いではないけど残ってる感情を存在しない」と見なしてるのか、 「自分の認知では読めないから存在を保証しない」としてるのか。 どっちだ?
ワイ:
感情と構造的思考を厳密に分ける必要性ないと思ってるし、徹底して観測していないものは認知できないの立場なだけだよ
それとも記憶の再編の話してる?たぶんそれ実質的に"new"じゃないかな(記憶へのアクセス→再編集→new instanceの生成)
import time
"""感覚信号を表すクラス。言語化前の生の感覚データをモデル化し、時間減衰や感情価を管理する。
認知の基礎として、観測可能なデータのみを扱い、神経科学的反応速度を考慮。
"""
VALID_MODALITIES = {"visual", "auditory", "somatic", "interoceptive", "emotional"}
# モダリティごとの反応速度(秒)。情動系は速く、視覚系は遅め。
MODALITY_LATENCIES = {
"visual": 0.3,
"auditory": 0.2,
"somatic": 0.25,
"interoceptive": 0.15,
"emotional": 0.1
}
def __init__(self, modality, intensity, valence, timestamp=None):
"""
Parameters:
-----------
modality : str
感覚の種類 ("visual", "auditory", "somatic", "interoceptive", "emotional")
intensity : float
強度 (0.0-1.0)
valence : float
感情価 (-1.0=negative, 0.0=neutral, 1.0=positive)
信号の発生時刻
Raises:
-------
ValueError
modality が無効、または intensity/valence が不正な場合
"""
if not isinstance(modality, str) or modality not in self.VALID_MODALITIES:
raise ValueError(f"Invalid modality: {modality}. Must be one of {self.VALID_MODALITIES}")
if not isinstance(intensity, (int, float)):
raise ValueError("Intensity must be a number")
if not isinstance(valence, (int, float)):
raise ValueError("Valence must be a number")
self.modality = modality
self.intensity = max(0.0, min(1.0, float(intensity)))
self.valence = max(-1.0, min(1.0, float(valence)))
self.timestamp = self._get_current_time() if timestamp is None else timestamp
self.decay_rate = 0.05
self.latency = self.MODALITY_LATENCIES.get(modality, 0.2) # デフォルトは0.2秒
"""現在時刻を取得"""
def apply_decay(self, time_passed):
self.intensity = max(0.0, self.intensity - (time_passed * self.decay_rate))
return self.intensity
valence_str = "negative" if self.valence < 0 else "positive" if self.valence > 0 else "neutral"
return f"SensorySignal({self.modality}, intensity={self.intensity:.2f}, valence={valence_str}, latency={self.latency:.2f}s)"
"""未処理感情を表すクラス。言語ラベル未確定の感覚群を管理し、認知プロセスの途中段階をモデル化。
記憶アクセスは再編集として扱い、言語化プロセスを動的に進める。
"""
def __init__(self, raw_signals=None, salience=0.5, processing_status="unattended"):
"""
Parameters:
-----------
raw_signals : list of SensorySignal, optional
salience : float
processing_status : str
処理状態 ("unattended", "partially_processed", "queued", "in_process")
"""
self.raw_signals = raw_signals if raw_signals is not None else []
self.salience = max(0.0, min(1.0, salience))
self.processing_status = processing_status
self.pattern_matches = {}
self.creation_time = self._get_current_time()
self.last_accessed_time = self.creation_time
self.access_count = 0
self.structure_level = 0.0
self.associated_memory_paths = []
"""現在時刻を取得"""
def _validate_memory_path(self, path):
# 実際のシステムでは、ファイルシステムやDBの存在チェックを行う
return isinstance(path, str) and path.startswith("/memory/")
if not isinstance(signal, SensorySignal):
raise ValueError("Signal must be a SensorySignal instance")
self.raw_signals.append(signal)
self.structure_level = max(0.0, self.structure_level - 0.1)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def add_language_candidate(self, term, confidence):
self.language_candidates.append({
"term": term,
"timestamp": self._get_current_time()
})
self.structure_level = min(1.0, self.structure_level + 0.05)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def add_pattern_match(self, pattern_name, similarity):
self.pattern_matches[pattern_name] = {
"similarity": similarity,
"timestamp": self._get_current_time()
}
self.structure_level = min(1.0, self.structure_level + 0.1)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def add_memory_path(self, path):
if not self._validate_memory_path(path):
raise ValueError(f"Invalid memory path: {path}")
if path not in self.associated_memory_paths:
self.associated_memory_paths.append(path)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def apply_decay(self, time_passed):
for signal in self.raw_signals:
signal.apply_decay(time_passed)
decay_modifier = max(0.1, 1.0 - (self.access_count / 100.0))
decay_amount = time_passed * 0.02 * decay_modifier
structure_modifier = max(0.5, 1.0 - self.structure_level)
decay_amount *= structure_modifier
self.salience = max(0.0, self.salience - decay_amount)
return self.salience
def get_average_valence(self):
if not self.raw_signals:
return 0.0
total_valence = sum(signal.valence for signal in self.raw_signals)
return total_valence / len(self.raw_signals)
def get_dominant_modality(self):
if not self.raw_signals:
return None
for signal in self.raw_signals:
modality_strengths[signal.modality] = modality_strengths.get(signal.modality, 0) + signal.intensity
return max(modality_strengths.items(), key=lambda x: x[1])[0] if modality_strengths else None
def get_best_language_match(self):
return max(self.language_candidates, key=lambda x: x["confidence"]) if self.language_candidates else None
best_lang = self.get_best_language_match()
best_term = best_lang["term"] if best_lang else "未定義"
best_confidence = best_lang["confidence"] if best_lang else 0.0
return {
"creation_time": self.creation_time,
"age": self._get_current_time() - self.creation_time,
"status": self.processing_status,
"salience": self.salience,
"structure_level": self.structure_level,
"signal_count": len(self.raw_signals),
"dominant_modality": self.get_dominant_modality(),
"average_valence": self.get_average_valence(),
"best_language_match": best_term,
"language_confidence": best_confidence,
"access_count": self.access_count,
"memory_path_count": len(self.associated_memory_paths)
}
status = self.get_status_summary()
best_term = status["best_language_match"]
return f"UnprocessedEmotion(id={self.id}, status={self.processing_status}, salience={self.salience:.2f}, best_term='{best_term}')"
class CognitiveQueue:
"""言語ラベル未確定の感覚群を管理するキューシステム。認知プロセスの優先順位付けと記憶再編集をサポート。
"""
def __init__(self, max_size=100, attention_threshold=0.3):
"""
Parameters:
-----------
max_size : int
attention_threshold : float
"""
self.unprocessed_emotions = []
self.processing_queue = []
self.archived_emotions = []
self.attention_threshold = attention_threshold
self.current_time = self._get_current_time()
self.learned_terms = {} # 学習済み言語表現: {term: {"context": str, "frequency": int}}
self.modality_index = {} # モダリティごとの感情インデックス: {modality: [emotion]}
"""現在時刻を取得"""
self.current_time = time.time()
return self.current_time
def learn_language_term(self, term, context):
if term in self.learned_terms:
self.learned_terms[term]["frequency"] += 1
else:
self.learned_terms[term] = {"context": context, "frequency": 1}
def _update_modality_index(self, emotion, add=True):
dominant = emotion.get_dominant_modality()
if dominant:
if add:
if dominant not in self.modality_index:
self.modality_index[dominant] = []
if emotion not in self.modality_index[dominant]:
self.modality_index[dominant].append(emotion)
else:
if dominant in self.modality_index and emotion in self.modality_index[dominant]:
self.modality_index[dominant].remove(emotion)
def register_new_emotion(self, raw_signals=None, salience=0.5):
salience=salience,
processing_status="unattended"
)
self.unprocessed_emotions.append(emotion)
self._update_modality_index(emotion)
if len(self.unprocessed_emotions) > self.max_size:
least_salient = min(self.unprocessed_emotions, key=lambda e: e.salience)
self.unprocessed_emotions.remove(least_salient)
self._update_modality_index(least_salient, add=False)
least_salient.processing_status = "archived_without_processing"
self.archived_emotions.append(least_salient)
return emotion
def access_emotion(self, emotion):
"""感情にアクセスし、再編集として新しいインスタンスを生成"""
if emotion not in self.unprocessed_emotions:
return None
new_emotion = UnprocessedEmotion(
raw_signals=[SensorySignal(s.modality, s.intensity, s.valence, s.timestamp) for s in emotion.raw_signals],
salience=emotion.salience,
processing_status=emotion.processing_status
)
new_emotion.structure_level = emotion.structure_level * 0.9
new_emotion.language_candidates = emotion.language_candidates.copy()
new_emotion.pattern_matches = emotion.pattern_matches.copy()
new_emotion.associated_memory_paths = emotion.associated_memory_paths.copy()
self.unprocessed_emotions.append(new_emotion)
self._update_modality_index(new_emotion)
emotion.processing_status = "archived_due_to_access"
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion, add=False)
self.archived_emotions.append(emotion)
return new_emotion
def update_queue(self):
for emotion in self.unprocessed_emotions[:]:
time_passed = self.current_time - emotion.last_accessed_time
emotion.apply_decay(time_passed)
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion, add=False)
emotion.processing_status = "archived_due_to_low_salience"
self.archived_emotions.append(emotion)
self.processing_queue = []
for emotion in self.unprocessed_emotions:
if emotion.salience >= self.attention_threshold:
if emotion.processing_status == "unattended":
emotion.processing_status = "queued"
self.processing_queue.append(emotion)
self.processing_queue.sort(key=lambda e: e.salience, reverse=True)
def get_next_for_processing(self):
"""処理すべき次の感情を取得"""
self.update_queue()
if not self.processing_queue:
return None
emotion = self.processing_queue[0]
emotion.processing_status = "in_process"
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
return emotion
def lookup_by_pattern(self, pattern_name, min_similarity=0.5):
matches = []
for emotion in self.unprocessed_emotions:
if pattern_name in emotion.pattern_matches:
similarity = emotion.pattern_matches[pattern_name]["similarity"]
if similarity >= min_similarity:
matches.append(emotion)
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
return matches
def lookup_by_memory_path(self, partial_path):
matches = []
for emotion in self.unprocessed_emotions:
for path in emotion.associated_memory_paths:
matches.append(emotion)
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
break
return matches
def lookup_by_modality(self, modality):
"""特定のモダリティが支配的な感情を検索(インデックス使用)"""
return self.modality_index.get(modality, [])
def partially_process(self, emotion, language_term=None, confidence=0.0, context=None):
if emotion not in self.unprocessed_emotions:
return False
if language_term:
emotion.add_language_candidate(language_term, confidence)
if context:
self.learn_language_term(language_term, context)
emotion.structure_level = min(1.0, emotion.structure_level + 0.15)
emotion.processing_status = "partially_processed"
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
if emotion.structure_level >= 0.9:
best_lang = emotion.get_best_language_match()
if best_lang and best_lang["confidence"] >= 0.8:
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion, add=False)
emotion.processing_status = "archived_fully_processed"
self.archived_emotions.append(emotion)
return True
modality_counts = {}
for emotion in self.unprocessed_emotions:
dominant = emotion.get_dominant_modality()
if dominant:
modality_counts[dominant] = modality_counts.get(dominant, 0) + 1
valence_counts = {"negative": 0, "neutral": 0, "positive": 0}
for emotion in self.unprocessed_emotions:
avg_valence = emotion.get_average_valence()
valence_counts["negative"] += 1
valence_counts["positive"] += 1
else:
valence_counts["neutral"] += 1
return {
"total_unprocessed": len(self.unprocessed_emotions),
"processing_queue_size": len(self.processing_queue),
"archived_count": len(self.archived_emotions),
"average_salience": sum(e.salience for e in self.unprocessed_emotions) / max(1, len(self.unprocessed_emotions)),
"average_structure_level": sum(e.structure_level for e in self.unprocessed_emotions) / max(1, len(self.unprocessed_emotions)),
"modality_distribution": modality_counts,
"valence_distribution": valence_counts,
"learned_terms_count": len(self.learned_terms),
"current_time": self.current_time
}
日本語バージョンがある。Stingが日本語で歌っているのがなんか面白い。あとレゲエ感が増している気がする。
ハワイな曲。
なんで「ちょっと待ってください」を選んだんだろう。
サウスパークの曲。
もう年明け回が配信されているけれども、いま昨年末のひっかかりニーチェを見ている
その中で「ずっと緊張感が続く番組(ex.M-1)ばかりだとテレビを見て貰えなくなる。ながら見が出来る番組も作らないと駄目」っていう話をしていて
本当にそうだと思う
にけつッ!!とかですら「しっかりと向き合って」見ている。「二人が話しているだけの番組なんだから『ながら見(聞き)』でもいいんじゃあないか?」と思うけれども、何故かしっかりと見ている
だから「出勤前に鏡に向かいながら流す番組(配信)」のチョイスには気を使う
そして、そういう片手間に見られる番組はそれなりの数無いと困る。で、それと同数くらい「しっかりと見る番組」も無いと困る
テレビがその「どちらかだけ」になったら非常に困る
正直、寝る前に見るYou Tube動画ですらチョイスに悩む(ショート動画はなるべく見ないようにしている。きりがないので)
別に誘導瞑想の動画でも良いんだけど(疲れ切ってて直ぐ寝たい時は実際それとかASMRだけど)、ちょっとだけエンタメ性が欲しい時の丁度良い動画が難しいねえ
あと、入浴中に見る動画もすごく難しい。シャワーで音声が聞き取りづらくても大丈夫で、シャンプー流してる時に目を瞑っていても(途中が見れなくても)困らない動画
まあ、音楽や自然音+環境映像とかでも良いけど、もうずっと長い間そういう丁寧なマインドで暮らしてないので
ネトフリとかに課金してて全然見てないんだけど、「外国の料理番組」とかは出勤前や寝る前に最適なのかもしれないな。豪邸紹介とか
当方、齢37である。来月末に引っ越しをする。大学卒業から約15年、暮らしてきた実家近くのアパートを離れるのである。
社会人としての稼ぎが少なすぎて、実家の手を借りなければ生きられない。よくメシを食べに行っていた。情けない社会人だった。それは結婚しても変わらなかった……幸い、子どもはいない。
妻は、いいやつだ。こんな貧乏暮らしの人間と結婚してくれた。見栄っ張りなのが玉にキズである。親戚や近所同士の集まりでも、コモンカード(MTGで言うと「モグの狂信者」 わかったぞ! わかったぞ! わか……)に等しい私を、高年収の正規サラリマンとして紹介することがあった。
よくできた妻だと思う。私にはもったいないくらいの。悪態をつくことはあるけど、裏切ったりしない。近所の実家にお米や野菜をたかりに行く時も、一緒に付いてきてくれた。
もし、この世界がエロ漫画の世界で、あらくれ氏が描くみたいなオッサンに妻が寝取られてしまったとしても、私は許すと思う。私に尽くしてくれる良妻である。
大学時代、ぜんぜんダメな子だった。偏差値50台の二流以下の大学で、学生時代はアルバイトばかりやっており、部活もサークルもせずにダラダラ過ごしていた。就職活動はひどいものだった。
「Fの就職チャンネル」で就活生の動画(ex.大学4年の6月から就活始めたりする)をたまにやってると思うが、まさにあんな感じの、圧倒的ダメダメ就活生だった。
さて今回、引っ越しをするのは、晴れて正社員としての採用が決まったからである。関西の南の方に住んでるのだが、隣県での採用が決まった。大まかな括りだと機械操作オペレータである。年収+はなんと約200万円。
今まで、この田舎にある小さい製造会社で毎日毎日、機械や仕様書・図面と格闘してきた。25才の時、契約社員として雇ってもらった。それまでは近所にある町中華の店でアルバイトしていた。
正直キツかった。専門知識は一切ない私立文系人間である。マジで辛かったよ。しかも、小さい会社なのに出張まであるんだからな……だがしかし、ついに培ってきたワザが評価されたのだ!!
今年の4月になってから(妻の強い勧めで)転職サイトに登録してみたところ、私のワザというのは、意外と需要のあるスキルだったようである。(ビズリーーーーーーーーーーチッ!!)
大したことは思いつかなかったが、とりあえずやってみたことを列挙する。
・少し高級な中華料理屋で暴飲暴食
・昔の思い出グッズを漁る(MTGカード、進研ゼミ中学版、ガラケーの写真など)
・地元神社の奉納祭り役員への立候補。当日記を書き始めた頃に無事終了
あとは、里山登りかな。幼い頃、祖母に連れられてよく里山散歩をしていた。小高い山の頂上から見下ろす町並みは壮観だった。
なにぶん田舎なので、里山がたくさんある。グーグルマップで見てみると、東京の方でも端っこの方は青々とした山が広がっている。あんな標高数百メートル以内の山を、ひたすらに登っていく。
自宅の裏から繋がる山道の入口から始まって、よいしょよいしょっと里山を登っていく。私が子どもの頃は、近所の人はみんな林業してたから、開けた地形がけっこうあった。里山というよりは丘陵に樹木が生えてる感じだった。
亡き祖父の話によると、戦時中はどの里山もはげ山状態だったらしい。戦争で石油燃料が不足したため、国民単位でみんな柴刈りをやりまくったのだ。グーグルマップで言うと、あの青々とした山がほぼ肌色だったということだ。
今は林業をする人はおらず、里山は荒れ放題である。てっぺんまで行っても町の景色など見えやしない。雑木の群れが頂上を覆い隠している。
樹木が生い茂ってないところだと、町の景色が見えたりする。山の標高は低いけど、限界効用が低いとでも言えばいいのか、珍しい景色なので壮観である。汗ダラダラで意識が朦朧としてるのもある。脳がマヒしている。
https://tadaup.jp/15183559802496/
高校時代の卒業アルバムも読んだっけ。柔道部に籍を置いていた。
高校卒業式の直後、部活メンバーみんなで柔道場でお祝いをするのだが――その時の写真が出てきた。
なんと、みんなからの寄せ書きも残っていた!! 超恥ずかしいけど公開してみよう。別にいいだろ。増田にこういう投稿するの、人生最初で最後なんだからさ。
(部員一同)
増田さんは、□△高校の相川さんがロリロリで好みなんですよね!!
相川さんを是非モノにしてください
増田先輩の行動で一番驚いたのは、■▲高校の藤田さんの写真をこっそり撮って、救急箱に貼っていたことです
閉会式の時、柔道着の藤田さんが目を閉じて、優勝旗に顔を傾けているやつです
とにかく3年間お疲れ様でした。先輩にはクソお世話になりました!!
増田先輩の柔道、粘り腰で凄かったです。どんな時でもあきらめずに、ベストを尽くしてました
冬の大会で4人抜かれてから5人抜きした時はマジでびっくりしました!
増田先輩の変態エクストリームハートには緊張させられっぱなしでした。
早く警察に捕まってください!!笑
増田先輩へ
増田先輩
お疲れ様でした!!
けど、引退した後もたくさん乱取り付き合ってくれて、たくさん寝技も教えてくれて、感謝してます
いままでありがとうございました♡
増田君が入部してきた頃にはどうなることかと心配をしました。ご卒業おめでとうございます。キャプテンとしての重責、大変ご苦労様でした。柔の道は、将来どこかで役に立つ時がきます。力必達(※つとむればかならずたっす)。何事も最後まで諦めず努めてください
・先輩ご卒業おめでとうございます これからも頑張ってください
・3年間お疲れさまでした 面白い先輩でした笑
・これからも今までみたいに頑張ってください
これはひどいwwwwwwを地で行く内容である。こんなん、人に見せられるもんじゃねーだろ。
でも、いいよ。増田民へのサービスだ。いつもお世話になってるからな。
そんなこんなで先月に就職が決まってから、結局最後までできなかったことがある。大学時代の思い出の開封である。
それ以外の思い出BOXはすぐに開封できた。実家にある元自分の部屋にある段ボール箱のテープを、ビリッとやればそれでよかった。でも、大学生時代は後味が悪すぎる。就職すらできずに、逃げるようにして卒業したんだから。正直、嫌な思い出である。トラウマと言っていい。
いや、大学の卒業式は出席したのだ。謝恩会にも。問題は、マクドナルドでの思い出である。
マクドでアルバイトしてたんだけどさ、卒店式っていうのがある。文字どおり店舗からの卒業式である。毎年3月にある。
卒店式だけど、マクドナルドって経営や店舗運営が外資ルールだから、エリア内の店ごとに売上を競わせるんだよな。
それで、いい結果を出してる店舗だとそれなりの貸館施設で、いまいちな結果の店舗だと近所の公民館を無料で借りて、ジュースやお菓子をテーブルに並べて卒店式をやる。
大学時代にアルバイトをしてたマクドの店は、成績がいいところだった。京都にある四条河原町店という名門店舗である。店舗番号は100番以内、つまりマクドナルド黎明期に作られたお店のひとつだ(今でもあるのかな)。
当時の私は就職活動に失敗して、無職neatでの卒業が決まって落ち込んでいた。
そんな時、自分のひとつ年下の後輩のスウィングマネージャー(※できるアルバイトが社員の仕事をする。時給+50円)から話があった。「増田さん今までお世話になりました。卒店式、ホテルグランヴィア京都でやりますからね。店長が、すげー男を見せてくれた(※足りない分は自腹切ったらしい)んすよ!! 自分、増田先輩のために送辞読みます」とか言ってた。
でも、私は嬉しくなかった。就職活動に失敗してニート確定の自分が、そんな場で送辞を読まれたって嬉しくもなんともない。畜生というやつだ。
結局、卒店式には出ないって後輩君に伝えた。すごくガッカリしていたよ。だって、彼が初心者の頃、私がずっと付いて教えていた。彼が嫌なことあって、アルバイト中に不貞腐れてる時でも、構わずにとにかく、いろいろ教えていったよ。
この子は才能があるから、すぐにうまくなるだろうと思ったけど、やっぱりすぐに上手になった。
ただスキルがあるだけじゃなくて、なんというか、仕事の本質がわかってるというか。能でいうところの上手(うわて)みたいな感じである。世阿弥がさ、『風姿花伝』で伝えてるような、社会人技能について嵩があって丈もあって(※今でいうとT型人材)、本質的なことがわかってる子だった。
一度だけ、後輩君から催促を受けた。二度だったかもしれない。あの時のことは覚えてる。
あれは事務所だった。「卒店式出ましょうよ」というシンプルなものだった。しかし私の答えは……。
「そんな気分じゃない。早く就職しないと。すぐにできないかもしれんが」と言ったら、「増田さん。AJCCで2回も勝ったじゃないですか!! 余裕っすよ」と言ってた。
※AJCC…マクドナルドの技能大会。「2回勝った」とは、地区大会と府大会で部門別優勝したの意。関西大会では、府大会と違うメンツでオペレーションになったので、コミュ障だった私はボロボロの成績だった
その後の後輩君とのやり取りは覚えてない。最後の方だと「あのな、後輩君。どんだけ綺麗に、上手く、速く、素早く、ハンバーガー作れたってな。社会じゃ何の役にも立たねーんだよ!」と悪態をついた。
それで、後輩君は黙ってしまって、それ以来やつとは会話していない。最後の勤務日も、淡々と仕事を終わらせて――いや違う、確か女性の学生客がトイレでゲロ吐いたんだっけ――それの片付けを夜に終えて、私にとってのマクドナルドは終焉を迎えた。
帰りに、同じくマクドナルド河原町三条店(※こちらは関西最古の店舗らしい。今でもあるのかな)に寄って、チョコパイかベーコンポテトパイを買って帰った。マックポークだったかもしれない。マックチキン……( ;∀;)
しんみりしてしまった。
学生時代の思い出を開封するのは心理的にキツイ。けど、時間は限られている。いったん妻とこのアパートを出たら、帰ってくるのは十数年後になるかもしれない。妻はうちの実家嫌いなので……。
そんなのはちょっと、想像したくなかった。というわけで、アパートの自室の押し入れを開けて、学生時代の禁断に近い思い出の段ボール箱を開封した。
そしたら、いろんなものが出てきた。当時のガラケーとか、大学時代の成績表とか、学位記とか、マクドナルド辞めてから郵送で届いた卒店式の寄せ書きとか、昔の授業ノートとかだな。産業社会学部のゼミのみんなで撮った記念写真もあった。京都駅の近くで行われた社会科学の研究展示会で賞を取った時のやつだった。当時の日記も出てきた。
その日記、最後の方だけパッと読んでたんだが、どうやら学生時代の私は卒業時に108万円の貯金があったらしい。なんでそんなにあったかというと、大学1回生の時からマクドナルドで週5で働き続けていたからである。いわゆる超修行をしていた。ここまで働いてると、身体が脳をハックするようになる。
……厨房の注文画面が「ピッ」と鳴ったら、考えるよりも前に身体がハンバーガーを作り始める。考えるんじゃなくて、調理行程を『感覚』が捉えるようになる。トングとか、ソースガンとか手に取るんだけど、なんかさ、感覚がさ、一体感がすごい。トングが身体の延長というか、もはやマクドナルドというお店自体が、自分と一つになってるような、そういう感じ。
例えば、トングを握ってパティ(肉)を掴んでる時って、体のどこがそれを認識してるのだろうか。
指先だと思うかもしれない。けど、その指を支えているのは筋肉組織と関節であり、それらをさらに骨組織が支えている。物質に触れている指先というのは、入口である。
骨組織と言ったけど、トングでパティを掴んだ時の刺激って、関節の中を電気信号が走って、最後は脳に伝わる。ということは、刺激というのは、結局は指先じゃなくて『脳』が認識している。
でも、その刺激って指先が認識してると人は解釈することができるし、実際にしている。脳が認識してると捉えることもできるし、体の先っちょが認識してると捉えることもできる。
こういう解釈が成り立つということは、指先が触れてるトングそのものが、パティの感触を認識してるってことにもならないだろうか。
剣道の達人だと、竹刀が体の一部みたいになっていたりする。サッカー選手だったらボールである。そうだ、ここでの私にとっての肉体の最延長は、指先じゃなくて、トングなのだ!!
もう少し延長すると、店舗で働いている自分というのは、床に立っている。呼吸をしている。ほかの従業員やお客さんの存在を感じ取っている。ということは、其処に存在している以上は、その床を、空気を、ほかの店舗スタッフを、お客さんを、なによりマクドナルド四条河原町店という、その存在が――私という人間の延長として考えることはできないだろうか。
実際、国際赤十字とか、国連とか、国際NPOとかで働いている人、それ以外にも人類福祉のための活動してる人って、地球とか、人類社会そのものを自分の延長として捉えてるんじゃないか? そう感じざるを得ないようなニュースがたまに飛び込んできたりする。
それはさておき。108万円の貯金、結局どうしたんだっけ。
あー、そうだ。グータラだった自分は、フリーター生活とともに2年もしないうちに霧消したんだった。でも、あのお金があってよかった。あれがなければ、秋から始まる奨学金の返済に対応できなかった。
あの頃(23~25才)の私は、アルバイトではダメだと、奨学金の返済に耐えられるだけの仕事を探して、探して、探しまくって、ようやくたどり着いたのが今勤めている金型の製造工場だった。
始めは出荷場での勤務だったけど、オペレータの給料が高いというので転属を申し出たのだ。これらは当時の日記を読み返して初めてわかった。案外、人は記憶を改ざんするものである笑
ちなみに、まだ奨学金を返済できていない。普通の社会人だったら、繰り上げで30前半くらいには全額返済できていると思われる。今はその程度の稼ぐ力すらないけど、これから妻と一緒に創り上げていきたい。
などなど。
翻訳ソフトに求めるニーズも何種類かあると思うんだけど、それぞれに対応した翻訳ソフトが出る方向には行かないよねー。
将棋ソフトなんかが強くなってきたときにも、「その後、最善手を指し続ければ勝てる手を見つけられるソフト」と「所与の棋力の人間にお進めの勝ちやすい手を教えてくれるソフト」、それぞれができて欲しいなあ、なんて思っていたけど、現実はそんな方には進まなかったなー。
耳の穴かっぽじって聞け!
https://tver.jp/episodes/epwlycwfjz
見てたら、モグライダー15周年の祝辞として三四郎小宮(ともしげの旧友)が文を寄せていた
その中で「養成所時代、同期の阿諏訪(ex.うしろシティ)が『なんで小宮は面白くもないともしげとつるんでるの?』と本人の目の前で訊いてきたことがある」と言っていて
阿諏訪泰義、そんな人だったのか…とびっくりした
ブッシュクラフターで野に遊ぶナチュラリストであり料理上手という(シャバい)イメージであり
うしろシティが上手く行かなかったのは、相方に詰められた「繊細な」阿諏訪が耐えられなくなったからだと思っていた
本人もなかなかな性格だったのかー
上記の文の中で小宮が締めの言葉として「キャンプくらいしか無くなったあいつを芸人として見返せて良かったな」と括っていて笑った
阿諏訪と比較するように「昔、芝くんが格好いいライダース着てたんだけど『デートするからソレ貸して』って頼んだら喜んで貸してくれたよ。良い人だよ」みたいなこと言ってたのも笑った
中途採用でECサイトの業界に入った。二十代半ばの頃である。外資ということで緊張してたけど、意外とそうでもなかった。
厳しい社風ではあったが、それはルールや数字に厳しいというだけであり。自社のポリシーや規則に従って行動していれば、結果が悪くてもそうまで低い評価が付けられることはない。
もっというと、上の意向をしっかり確認して動くということか。いや、違うな。ちゃんとした意思決定の過程を踏むということだ。上の判断が必要なら議論をし、委任事項であれば自分の責任で物事に挑み、失敗しても成功しても検証記録を残していく。これだけのことができずに消えていく人間を何十人も見てきた。
語りが過ぎた。私はeコマース(ネットでの買い物)の世界で長い間働いてきた。実はもう転職が決まっている。記念に、これまでの努力の過程を書き綴っておきたいと思った。ちょうど今は卒業シーズンである。
ただ、努力はしたけれども、いい結果が出ないことの方が多かった。もしくは結果自体の測定ができないか。それでもいくつかの改善はできた。その一部を記していきたい。
私の専門分野はレビューシステムだった。あなたも、ECサイトで★を付けたことが一度はあるのではないか。私は、そのあたりの仕組みやルールを作っていく部門で働いていた。SE寄りではなくて、インフラ寄りでもなくて、格好よくいえば社内Sler兼企画といったところか。
これから、何点かのトピックに分けて思い出深い改善活動について述べていきたい。なお、特定の用語を出すとどこの会社かわかってしまうので、専門用語は一般的な言葉に置き換える。例えば、あるレビューにクリック等で賛意を示すことは「いいね!」で統一する。
昔は、ある特定のレビュアーへの通報が多かった。違反報告か、問い合わせ窓口(TEL,mail)を通じて、「あのレビューは誹謗中傷だ」「特定個人の名誉を傷つけている」「製造メーカーへの粘着が見られる」「差別的な表現を用いているので削除すべし」といったものが多かった。確かに、通報先のレビューを読んでみると、大変よろしくない表現が散見された。
当時は、電話によるカスタマーサポートがあった。その窓口に、正義感を持った方々が、上記の善くないレビュー及びレビュアー(bad egg)について抗議していた。
こういった問題あるレビューについて、私がいた部署では対応が必要と考えていなかった。直属の上司も、さらに上の人間も、どの国にも地域にもいる悪口をたくさん言う人としか捉えていなかった。
しかし、私や数人のチームメンバーは、彼ら悪辣なレビュアー(bad egg,bad person)の行為が、サイト全体の害になると考えていた。具体的には、次のような行為を彼ら(彼女ら)は行う。
・商品をわざと口汚く罵り、マイナス評価や罵倒コメントが付くことを喜んでいる
※アニメや漫画、小説といったエンターテインメントに多く見られる
特に、一番下のタイプの顧客の場合、サイト利用者に不愉快な印象を残す可能性が高い。対処が必要と思われた。
しかし、データがなかった。上司にある対策を提案した際に言われたのは、「今あなたがしようとしているのは、私の権限を超える行為であり、本社への協議も必要である。主観ではなく、根拠を示したうえで提案せよ」というものだった。
それから半年以上かかったものの、私とその小さいチームで初版の検証資料を作成した。それは、次の結論から成り立っている。
・悪辣なレビュアーと論戦になった顧客は、その後半年間での実質退会率が高い
具体的なマイナス幅を提示することはできないが、統計学上、数パーセント以上という有意な範囲で顧客にマイナスの影響を与えていた。当然売り上げも落ちている。
悪辣なレビュアーは、一般的な顧客とレビュー内容を巡って論争(※当時はコメント機能あり)になった際、いわゆる煽り行為をする。その口汚い言葉が顧客を傷つけ、顧客体験を棄損してしまう。そんな当たり前のことに気が付くのは容易だったが、数値的に証明することは難しかった。
私たちの検証結果は、上の階層へと引き継がれた。さらに細かく検証するという――それから数ヶ月が経って、本社の方から通達があった。
「次のとおりレビューシステムの仕様変更を検討する。そちらの考えをまとめて回答せよ」とのことだった。以下は仕様変更案の参考文面である。
‐改善案‐
「参考にならなかった」のコンバージョンボタン(Conversion Button)の廃止を検討する。
理由:悪質な利用者が一定数いることで顧客体験を損ねている。顧客がより安全にショッピングを楽しむためにも、悪意をもって低評価をする者への対処が必要である。
私たちは、その通達と、添付されていた検証資料を読んだうえで、時間をかけて再検証を行い、廃止は正しい行為であるという回答を上申した。
加えて、現状のレビューシステムにある顧客同士で討論できるコメント機能についても、建設的な議論が行われているとは言い難い状況にあることから、廃止を提言した。
積年の課題だった。残念ながら目下解決には至っていない。不正レビュー根絶の目途もつかない。明白な違反者であれば発見・処分ができるのだが、グレー段階での処分は難しい。
実際に、不正を行ったと思しき者を見つけることはできる。AIが発展した現在だと、いわゆるサクラレビューと呼ばれるものはシステムの方で自動的に発見し、一定確率で怪しいものを報告してくれる。
昔は、一件一件手作業であったり、Excelのフィルタ機能を組み合わせるかのように検索条件を設定して虱潰し(shirami-press)に見ていく必要があった。
そう、不正行為と思しきレビューを見つけることはできる。あくまで見つけることは。だが、はっきりクロだと断定し、処分を下すのは人間にしかできない。1日につき何十件、多い日だと百件以上も上がってくる不正と思しきレビューに対応するのは不可能に近い。
多くのECサイトには、利用規約や社会倫理に反する行為をする利用者(販売者、注文者、閲覧者)を処罰するためのポジションが存在する。弊社においても当然あったが、少数精鋭が過ぎて不正レビューへの対応が後手に回っていた。
不正を見つけることはできても、処分することは難しい。冤罪があってはならないのはもちろんのこと、微妙なケースである場合も、利用者が今後弊社を利用してもらえるよう最大限配慮する必要がある。
はてなのサービスでいうならば、以下の利用規約の適用に係る取扱いが最も近い。
d. 迷惑行為、嫌がらせ行為、誹謗中傷行為、正当な権利なく他者に精神的被害・経済的被害を与える行為
e. 自分以外の個人や会社、団体を名乗ったり、権限なく特定の会社や団体の名称を使用したり、架空の個人や会社、団体を名乗ったり、事実がないにも関わらず他の人物や会社、団体と業務提携や協力関係があると偽ったりする行為
私は、学生時代からはてなのサービスを利用している。はてな匿名ダイアリーにおいては、この規定を制限的に運用しているように見える。
というのも、明らかに釣りと思われる投稿をしたり、他人になりすましたり、特定の企業や団体を匂わせる文書を発しているエントリが一定数みられるが、運営が規約規範として対処している様子はない。
推測ではあるが、99%のクロであっても、それが100%でない限りは対処しないという方針であろうと思われる。冤罪を避ける意図もあるが、意見の多様性を保持するためでもあるし、はてな匿名ダイアリーをひとつの実験場として捉えているのかもしれない。当方は、増田なる場所を蟲毒のひとつであると考えている。
話を戻す。レビューに関する不正行為について――その大半がサクラ行為であるが、不正行為の抽出までは技術的に自動化できるものの、最終判断は人がせねばならない、かつ間違いがあってはならない――という課題について説明した。
ただし、今のところはそれで問題ないと個人的に考えている。というのも、不正レビューへの対処が迅速ではないというだけで、悪質な行為をする利用者を取り締まること自体はできているからだ。技術が向上すれば、今後の改善も見込まれる。
今でも、ECサイトを覗いているとサクラレビューが多く散見される。会社を去って他業界に行く自分がいうのもどうかと思うが、今後も建設的な手段により不正行為への対策が効率化される未来を願っている。
多くのECサイトでは、役に立つレビューを行った人に賛意を示すことができる(冒頭の「いいね!」ボタン)。多くの点数がついたレビューは、商品欄において上位に表示されるようになる。
どのECサイトも、できるだけ多くのレビューを投稿してほしいと考えている。世の中の儲かる商売というのは、消費者に働いていただくことで成り立っている(GoogleやTwitterが典型例。もちろんはてなもそうである。運営会社はブロガーの生産活動によって生きている。ほかには食べログ・リクルート・メルカリなど)。
過去の弊社においても、どういった仕組みを採用すれば多くの利用者にレビューを書いてもらえるのか、サイト黎明期の先達は検討に検討を積み重ねた。
結果として、レビュアーランキングシステムという、今では各社で一般的になった仕組みが誕生した。かつてECサイトが未開の荒野を歩いていた時代の発明のひとつである。
永きにわたって活躍したランキングシステムだが、今では隔世の感が否めない。レビュアー同士の競争を促進することで、より多くの良質なレビューが生まれるという判断があったが、それは一企業人の錯覚に過ぎなかった。一企業においても高度の統計分析が可能となった現代において判明したのは、その役割を果たさなくなっていることである。
「レビュアーランキングの存在によって、自らの票を集めることのみを目的としたレビューが増える。初めは良質なレビューを書いていた利用者でも、ランキング上位になった後にレビューの質が低下する傾向にある」
ある時、自分の書いたレビューがバズったとする。それは、有名な映画か小説か漫画かアニメか、化粧品か家電製品か衣服か、はたまた書籍か、なんでもいい。自分のレビューが数百人からの「いいね!」を集めたとする。その後も良質のレビューを投稿し続け、同じような体験を繰り返したとする。そして、あなたは晴れてレビュアーランキングの相当上位に昇った。あなたが投稿したレビューのどこかに、それを示すバッジが掲示される。
さて、晴れて上位レビュアーとなったあなたであるが、その後に何もしなかった場合、順位は落ちていく。数ヶ月も何もしなければ、まず確実にバッジは剥がれる。元に戻るのだ。
それが嫌なレビュアーもいる。上位レビュアーでありたいがために、関連商品にとりあえずのレビューをいくつも投稿する。人の目を引くために過激な表現を使うし、ゴシップサイトさながらの低俗な言葉遣いをすることもある。また、省力化のため、自己や他者のレビュー内容の一部を借用することがあるかもしれない。
上記の調査研究において、上位レビュアーによるそういった傾向が明らかになった。特に、サブカルチャーにおいては顕著であった。
【具体例】
・新作アニメの公開時期になると、数行程度のレビューを無差別に付けて回る
・水平展開するコンテンツ(原作→アニメ、小説、映画、舞台etc)の各所に似たレビューをする
現在では、レビュアーランキングシステムは廃止されている。上に挙げたようなマイナス効果の方が大きいというのが、社内の統一された意見となった。
レビュー自体については、今後も廃止されることはないだろう。私自身も、レビューの調査研究を続ける度に学びになることがあった。人の親愛の興味深い傾向(ex.数千字にわたって自分の家族の話をする)であったり、笑いを狙ったユーモア(ex.ヘッドフォンの音質は、元の電源によって異なる。原子力発電か火力発電かソーラー発電かを聞き分けられると一人前)であったり、その道のプロと思われる学術的なレビュー(読書カテゴリに多い)も多数拝読した。
日記は以上である。懐かしい思い出を振り返る機会ができてよかった。年度末ということで、新しい職場に移る前に買き始めておきたかった。投稿はゴールデンウィークになってしまった。
次の職場も、一般企業と各消費者を結びつけるタイプの仕事になる。フリマアプリの会社である。残念ながら、自分の仕事を通じて、どれほどの顧客体験を社会にもたらしたのかを測定できる手法は未だ確立されていない。私が生きているうちに、そういった手法が生み出されることがあるのだろうか。
最後に、ここまでお読みいただきありがとう。今後、あなたが利用した商品をレビューしたことで、そのサイトでショッピングをする何千、何百万人という利用者が喜ぶ未来を祈っている。