「KEY」を含む日記 RSS

はてなキーワード: KEYとは

2026-01-11

シャフト50周年展行った

年末年始池袋で日時指定地方民には色々キツいが

絶望先生見てたしまほろまてぃっくも見たし、歌物語OPED良かったし~で、行くことに

スマチケってことでスマホにアプリインストールするらしい

QRコード注文とかもだけど、やたらアプリインストールさせる風潮好きじゃないんだよね。こっちにコスト押し付けてる感じで…

しかも、Googleアプリストアがクレカ情報入力しろと。こういうとこから流出するのよな…と思いつつ入力アプリの出来はいいけど、こういうのってスマホの電池切れたら…とか心配ちゃう

で、最初は土曜に行く予定だったが昼の予約が全滅。なぜか日曜の昼はガラガラだったのでそっちで予約。

調べたら40周年の時も日時指定だったからしいが、その時は名古屋大阪でもやってたのにィ~

で、土曜日中古屋行ったらまほろまてぃっく二期DVDBOX八百円。幸先良いじゃんと喜んでたら仕事の連絡。

なんか業務上大事故が起きたみたい(他人事)本来なら明日客先に出向いて対応すべき重大インシデントだよね~。神様シャフト展に行くなと言ってるのでは?仕事優先することで事故回避みたいな…まぁ、起きたことはしょうがないし連休明けに対応することになる。

で、今日。無事に5時半起床で新幹線にも間に合う。場所調べてたら、会場のビルシャフト展が終わったら取り壊すと知る。場所やら日程はそういうことかと納得。

秋葉原やら中野に寄り、池袋へ。

押井気取って駅の立ち食いそばに行くが、味はともかく、丼を渡すスペースと食券置くスペースせますぎ(店員一人分)セルフ給水や七味も近くに置いてあるから、注文して待機中のオッサンや丼を受け取ったオッサンが入り乱れて動線メチャクチャ、店の仕事やすさだけで配置してる感…2人で回してるみたいだし仕方ないかもしれんが、もっとこうシステマチックにさぁ…と、憤慨しながらサンシャイン通りへ。

池袋全体が大混雑で歩くだけでも時間を食う。スマホを見せると4階に行くように言われるが、階段に人が並んでいるので最後尾で待機。単にオタクがたむろしてるだけじゃないよな?と不安になっていると、スタッフさんから、整理番号の段へ行くように、と声をかけられる。

階段を登ってると知らないイケメンオタクに「何番ですか?」と尋ねられる。番号を見せると、「その番号ならもっと先ですよ。」と言われる。「はぁ、そうですか」と返すブサイクオタク(俺)礼を言え礼を。

番号の階段に付くが、列も動いてるのでどうすればいいかからず、流れで入場。

スマホを見せてステッカーを貰う。

撮影場所とかパネルとか。混雑してる。オオ、まほろまてぃっく原画とコンテだ!角のとこにあるからメチャクチャ見辛いけど…

ぱにぽにとか、まあ年代順に展示してる感じ。絶望先生のコーナーを主に見るが人が多くて大変。次のスペースはカーテンで区切られてて逆流できないっぽい?まどかの部屋で次が物語だったと思う。撮影可のとこがあったり、ウエダハジメパネルとかあったけど、飛ばし見してたかちゃんと覚えてない。まどかリアルタイムでハマってたけどwiki見ててこれってマーケティング…って思ったら冷めちゃったんだよな。エレベーターで別の階に行って階段を登る。階段作品ポスターが飾ってあり、その後もなんか色々展示がある。ヴァージンパンク!そーいやシャフトだったな…しかし展示がまどかの上映スペースの隅にあって少し見にくい。

で、公式MADみたいなの流してる部屋兼通路があり、とりあえず最後まで見るか…と一人見てると人が通って気まずい。通行の邪魔から前方で見るよう言われちゃったりして。

で、梅津とか久米田の50周年サインとかメッセージが飾ってあっておわり。20分くらいで見終わるが、これはほとんどスルーたから。ちゃんと見てたら数時間かると思う。

地下二階がグッズとのこと。チケットのチェックあり、カタログと購入用紙を渡され、実物コーナーを通り、MVとか流れてる劇場兼物販スペースみたいなとこに行く。図録がないか聞いてる人がいたが、過去展覧会の図録がネットで買えるのでそちらで、ということらしい。注文ペンがあったみたいだが渡されてないんだか取り忘れたのか。自前のペンで書いて待機。列を崩しちゃならんのだかわからず、書いた後も待機。してたら書けた人から前にいくみたい。ペンも回収しますと言われ、なかったので自分のを…と伝える(ないならスタッフに言わないと後で面倒になる)

絶望先生顔面原画ポストカード(少女達の集合シーンとか、もっといいのあっただろ、と思いながら)まほろまてぃっく原画ポストカード(まほろの表情集。こっちはよい)を買う。10分くらい。全部で半時間。

時間半ほど見込んでたので時間が余る。が、まさか池袋駅までの道で迷う。うろついてたら、なんか無料おジャ魔女デジモン展覧会やってて、撮影も可らしい。原画とかもあって結構ちゃんとしていた。

秋葉原keyの25周年のTCGパックを買う。今度買おうと思ってスルーしたらどこも売り切れになっちゃってて、でもあるとこにはあるんだな~。ボックスしかないけど。まあ仕方ない。

シュウマイ弁当買って新幹線で食う。中にお菓子が入ってます、と言われ、干しアンズの他にお菓子が?と思ったが、今思えばお箸か。色々と、弁当の完成形って感じでよい。タケノコが一番美味い気がする。

シャフト展行ってわかったんだけど、自分信者というよりアンチなんだよな。あと、富野展とか庵野展とはやっぱ違った。まあこっちは周年イベントからそらそうだけど。前者は老若男女ファミリーいたけどこっちは若い男女ばっかで、作画資料とかじゃなくコンテンツ紹介みたいな(そういえば、デジタル作画からセル画とかはないんだよな~)

悪くはなかったけど、シャフト君そういうとこあるよね!って悪いとこも滲み出てた感じ

意識高いんだか軽薄なんだかわからんみたいな…

そういうアカンとこが噴出したのが打ち上げ花火じゃねえかと思うんよな

上手いこと噛み合ってたのが絶望先生

2025-12-22

ジャニーズはもう言葉パクるの止めて欲しい

ストーンズ’(ローリングストーンズの事でない)に始まってボンジョヴィのキープザフェイスまでパクリ

更に今エックストレンドになってるキテレツ

キテレツ大百科がリメイクするのか、それとも別の企画でも持ち上がったのかとワクワクして調べたらさ

KEY TO LIT

???

これでキテレツって読むのかよ

マジでジャニーズって言葉狩りというか言葉パクるの好きだな

マジで邪魔なんだが

2025-09-27

HotoGTA istoo fun

This might be the most hilarious project ever .

Well, this is said to be Kidzania , but it's just a large scale play house.

At first I was a bit skeptical about whether it would be fun, but since there are a lot of fun roleplaying games out there, it's become a really addictive project .

Girls love to act out daytime dramas while playing house .

 

Key Person

・Polka writes about what's happening in real time , and he's mysteriously good at writing.

・Fubuki, the gambling -loving rip-off doctor

Miko, the organizer who works behind the scenes to mass-produce

・Marin, the cabaret club manager who is in her perfect job

・The Mio family begins a daytime drama

Even though I haven't seen the gang side, the characters are strong enough to be made into a manga .

To begin with, I 've done a lot of roleplaying in Minecraft .

I think it would be most interesting to throw these guys into a world like a TRPG . GTA has more of that kind of RP feel than Minecraft or ARK , so it feels like the flavor is exploding.

There are dozens of frames, so it will probably take until winter just to look at the clippings.

[] https://tensor.art/articles/913271679902311502

[] https://tensor.art/articles/913271892503191947

[] https://tensor.art/articles/913273855303258429

[] https://tensor.art/articles/913274016364543556

[] https://tensor.art/articles/913275949099786593

If the creator of Yu-Gi- Oh ! could die like that ,you never know what's going to happen in this

Actually, Yu-Gi- Oh! was originally intended to be a puzzle , or rather, a toy , like the Millennium Puzzle ...

But I think it's clear that what made Yu-Gi-Oh successful was the trading cards ... 😟

I think the key to its success is that it didn't set out to be a manga about puzzles right from the start .

In other words , without deciding on a specific direction for the story from the beginning , there are only characters and a vague ,

Also, incorporating the latest topics at the time, and a loose, tightrope- walking kind of manga might be better suited to serialization.

Also, inflationary battle manga , where ever stronger enemies appear , can go on forever .

Just when you think the universe will be destroyed and the end will come , a new Big Bang occurs and another world is created .

New characters will be available, and it should be possible to revamp Motorhead beyond just Gothic Maid ...

[] https://tensor.art/articles/913233772520973617

[] https://tensor.art/articles/913234002301712769

[] https://tensor.art/articles/913235196302629702

[] https://tensor.art/articles/913235376691257452

[] https://tensor.art/articles/913238797632712859

2025-09-09

ヨーロッパのおもらし文学

ヨーロッパには公衆トイレが少ない、あっても有料でしかも汚い

というわけでお漏らし文学をChatGPTに調べてもらった

 

1. ドイツ:Sanifair(高速道路トイレ)での敗北

Last time I paid 1€ to take a piss,

I walked into the Sanifair, looked around,

and just… left.

It was so disgusting I decided to go outside and search for a bush instead.

Reddit / r/AskAGerman

 

「1ユーロ払ってトイレに入ったんだけど、あまりに汚すぎてそのまま出てきた。結局、外の藪を探すことにした。」

 

ドイツ人ですら「お金払って藪で用を足す方がマシ」と言ってしまう悲哀。

清潔なイメージドイツにも、こんな現実が。

URL:れでぃっと r/AskAGerman

 

2. 英国:駅トイレの汚さに震える

I used to squat when using public toilets.

Then one day, I slipped.

 

That day, something inside me died… and something outside me was never clean again.

— れでぃっと / r/AskEurope

 

「昔は公共トイレではしゃがんで使ってたんだ。

でもある日、足が滑った。

その日、僕の中の何かが死んだ… そして僕の外側も、二度と綺麗にはならなかった。」

 

公共トイレが少ない上に、あっても猛烈に汚いイギリス

もう「しゃがむ」という選択肢すら許されない。

 

URL:れでぃっと r/AskEurope

 

3. ベルギー路上で立ち尽くす男たち

In Belgium, there’s an unwritten rule.

You hand the bar owner a euro,

he silently hands you the bathroom key.

 

If you don’t have a euro,

you find a dark corner of the street instead.

Blog post “The art of le pee in Belgium

 

ベルギーでは暗黙のルールがある。

バーの店主に1ユーロ渡すと、無言でトイレの鍵を渡してくれる。

1ユーロがなければ… 街角の暗がりを探すしかない。」

 

観光都市ブリュッセルでも、路上で立ち尽くす影が絶えない理由

トイレをめぐる静かな取引日常に溶け込んでいる。

 

URL:saintfacetious.com

 

4. フランス:深夜のパリ

It was 1AM on the Seine.

All cafés were closed, all public toilets locked.

I stumbled along the riverbank,

drunk on wine and regret.

 

In the end, the Seine saw everything.

— れでぃっと / r/Paris

 

「深夜1時、セーヌ川沿い。

カフェは閉まり公衆トイレも鍵がかかっていた。

ワインと後悔で酔った体を引きずりながら歩き、

最後は…セーヌ川が全てを見届けた。」

 

パリの夜は美しく、そして容赦ない。

観光客だけでなく、現地の人すらこうなることがある。

 

URL:れでぃっと r/paris

 

5. スペイン自動清掃トイレ悲劇

I was in Bilbao, desperate to pee before the match.

I ran into one of those self-cleaning toilets…

and then the cleaning cycle started

while I was still inside.

— The Sun 記事より

ビルバオで、試合前にトイレに駆け込んだんだ。

自動清掃式のトイレで、鍵を閉めた瞬間――

清掃モード作動した。

僕は全身びしょ濡れになって出てきた。」

 

水と泡まみれで出てきたマンチェスター・ユナイテッドファン

動画SNS拡散され、世界中で笑われた。

 

URL:The Sun

 

6. オランダ:露天便器「pee curl

In Amsterdam, we had these half-open urinals called ‘pee curls.’

They were meant to stop men from peeing in the canals.

Now they’re disappearing…

and the canals smell like history again.

Wikipedia引用+現地ブログより

 

アムステルダムには、半分だけ壁のある露天トイレ『pee curl』があった。

男性運河立ちションしないための工夫だ。

でも今はそのpee curlも減り、

運河がまた“歴史匂い”を取り戻しつつある。」

 

哀愁漂う街の景色と、尿の匂い

これもまたヨーロッパリアル

 

URLWikipedia:Pee curl

 

7. 英国公共トイレが減った結果…

I have MS.

Since the public toilets closed,

I stopped going out.

Last month, I didn’t make it home in time.

I cried, then laughed, then stayed inside for a week.

 

— The Guardian 読者投稿

 

「私は多発性硬化症です。

公衆トイレが閉鎖されてから、外出をやめました。

先月、家に帰る前に間に合わなくて…

泣いて、笑って、それから一週間家に引きこもりました。」

 

観光客の不便だけでなく、地元住民尊厳をも奪っている。

トイレ不足は静かに生活を壊していく。

 

URL:The Guardian

 

まあまあだな、また探す

 

____

 

れでぃっとってNGワードなのか、なんやねん

2025-09-08

1980年代まれアニメオタク幸せ

ちょうどエヴァンゲリオン中学生前後放送される世代

若いときには、若者向けのアニメが多く

ポケモンデジモンもこの頃

DBもまだやっていた

また、物心ついたときにはジブリ全盛期(もののけ姫中学生くらい)

大学生くらいで攻殻機動隊が出る

同じ頃にエロゲブームKeyブームが来る

20代ラノベ全盛期が来て

まどマギあたりで20代

ゴチうさあたりでアラサー

ここ10年では、おっさん主人公アニメも増えてくる

 

厳密に言えば、1987年1989年くらいがベストかな

俺は1984年なんだけど、20代ときは「少し下の世代が楽しそう」に見えた

ニコニコ動画世代のやや上の方と言えば良いかTwitter世代でもある

 

1990年代まれになってくると、例えばまどマギとかラノベ全盛期にはヒットするんだけど、エヴァとかは古い作品扱いになってしまうので勿体ない(あ、でも劇場版世代になるのか)

90年代まれジブリ世代でもないし新海誠世代でもないしなあ

2025-09-04

anond:20250904054611

・「凍結・解凍」は日本ではLHAが使ってた(確かっぽい)

かに使ってた。使ってはいるけど解凍を使ってるのは自己解凍のところだけで、e,xオプションのところでは「ファイルを取り出す」表記。凍結表記もaオプションのところだけ。

(LHAになる前のバージョンだけど)LHarcソースコード内の日本語版の使い方

char use[] =

"LHarc version 1.13c Copyright(c) H.Yoshizaki(吉崎栄泰), 1988-89.\n"

"============================================================= 1989 - 5 - 21 ===\n"

" <<< 高圧縮書庫管理プログラム >>>\n"

"===============================================================================\n"

" 使用法:LHarc [<命令>] [{/|-}{<スイッチ>[-|+|2|<オプション>]}...] <書庫>\n"

" [<ドライブ>:|<基準ディレクトリ>\\] [<パス> ...]\n"

"-------------------------------------------------------------------------------\n"

" 《命令》\n"

" a: 書庫ファイルを追加 u: 書庫ファイルを追加(日時照合付)\n"

" f: 書庫ファイル更新 m: 書庫ファイルを移動(日時照合付)\n"

" d: 書庫内のファイルの削除 e,x: 書庫からファイルを取り出す\n"

" p: 書庫内のファイルの閲覧 l,v: 書庫の一覧表示\n"

" s: 自己解凍書庫作成 t: 書庫内のファイルCRC チェック\n"

" 《スイッチ》\n"

" r: 再帰収集を行う w: ワークディレクトリ指定\n"

" x: ディレクトリ名を有効にする m: 問い合わせを行わない\n"

" p: 名前比較を厳密に行う c: 日時照合を行わない\n"

" a: 全属性を凍結の対象とする v: 他のユーティリティファイルを閲覧\n"

" n: 経過表示をしない k: 自動実行のキーワードの設定\n"

" t: 書庫の時刻を最新のファイルに\n"

"===============================================================================\n"

" 転載・再配布などは自由です。 Nifty-Serve PFF00253\n"

" (詳しくは使用の手引をご覧ください。) ASCII-pcs pcs02846";

英語版の使い方

char use[] =

"LHarc version 1.13c Copyright (c) Haruyasu Yoshizaki, 1988-89.\n"

"================================================================ 05/21/89 ===\n"

" <<< High-Performance File-Compression Program >>>\n"

"===============================================================================\n"

"usage: LHarc [<command>] [{{/|-}{<switch>[-|+|2|<option>]}}...] <archive_name>\n"

" [{<drive_name>:}|{<home_directory_name>\\}] [<path_name> ...]\n"

"-------------------------------------------------------------------------------\n"

" <command>\n"

" a: Add files to archive u: Update files to archive\n"

" f: Freshen files in archive m: Move new files into archive\n"

" d: Delete files from archive e,x: EXtract files from archive\n"

" p: disPlay files in archive l,v: View List of files in archive\n"

" s: make a Self-extracting archive t: Test integrity of archive\n"

" <switch>\n"

" r: Recursively collect files w: assign Work directory\n"

" x: allow eXtended file names m: no Message for query\n"

" p: distinguish full Path names c: skip time-stamp Check\n"

" a: allow any Attributes of files v: View files by another utility\n"

" n: display No indicator k: Key word for AUTOLARC.BAT\n"

" t: archive's Time-stamp option\n"

"===============================================================================\n"

" You may copy or distribute without any donation to me. Nifty-Serve PFF00253\n"

" (See the User's Manual for detailed descriptions.) ASCII-pcs pcs02846";

https://www.vector.co.jp/soft/dl/dos/util/se002340.html から

2025-09-01

anond:20250901182348

それは間違い。

FeliCa Lite-Sでは、色んな場面(主に3種類?)で3DES演算をしているが、ICカードを使う度に128ビットカード鍵と128ビットチャレンジから2-key 3DES演算して56ビットセッション鍵2つを生成しているし、その後は生成した2つのセッション鍵を使って2-key 3DES演算してMACを生成している。

なので、ICカードに書かれている128ビットカード鍵が漏れると、不正カードリーダー・ライターデータ改ざんされる可能性がある。

1. マスターから個別カード鍵を生成する時 → Qiita記事のセクション「カード鍵の書き込み」の関数generate_CK ※標準生成アルゴリズムは推奨で必須ではない

2. カードからセッション鍵を生成する時 → Qiita記事のセクション「セッション鍵の生成」の「triple_des(CK[7::-1] + CK[:7:-1], ……」の所

3. 送受信するデータMAC計算する時等 → Qiita記事のセクション「MAC_Aの生成とカード判定」の関数_generate_mac

マスター鍵は、(Qiita記事では)192ビット24バイト)、カード鍵は128ビット(16バイト)、セッション鍵は56ビット(7バイト)×2つ。

dorawii@執筆依頼募集中

まだ信じてるジジイ

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

https://anond.hatelabo.jp/20250901181912# 
-----BEGIN PGP SIGNATURE-----

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaLVlEgAKCRBwMdsubs4+
SFMrAQC5k3cd6iXF8e/eXKxDk6y1pzy5cKwQcfEdGoZaDC+G3wEA86haEbFDY+4h
KEY/XzV2QK3By7jgVRA60VitCt20Pw0=
=ewr2
-----END PGP SIGNATURE-----

2025-08-08

Today you want to Know Love you pussy

The Power of Small Steps: How Tiny Changes Can Lead to Massive Growth

In a world that glorifies overnight success and dramatic transformations, it's easy to feel like you’re falling behind if you’re not making big leaps. But what if the secret to real, lasting personal growth wasn’t in doing more, faster—but in doing less, consistently?

Welcome to the power of small steps.

Why Small Steps Matter

Big goals often feel overwhelming. You want to get fit, write a book, start a business, or learn a new skill—but you don’t know where to start. So you procrastinate. Or worse, you dive in too fast, burn out, and give up.

Small steps bypass all of that.

When you break down a huge goal into manageable actions, everything changes. Writing 500 words a day is less intimidating than finishing a whole novel. Ten minutes of walking is more doable than committing to a 5K. And spending 15 minutes a day learning a language adds up to over 90 hours a year.

Consistency beats intensity every time.

The Compound Effect

Imagine improving just 1% every day. That might sound insignificant—but over a year, it compounds into something extraordinary. This idea is the foundation of Darren Hardy’s The Compound Effect and James Clear’s Atomic Habits. Both books emphasize that small, smart choices, repeated over time, lead to radical results.

Think of your habits like planting seeds. At first, nothing seems to happen. But give it time, and youll see growth you never thought possible.

Real-Life Example: The 10-Minute Rule

Let’s say you want to start meditating but can’t sit still for 30 minutes. Instead of forcing it, try meditating for just 10 minutes a day. Or even 5. Build the habit before scaling the effort. Once it becomes part of your routine, extending the time feels natural.

This applies to nearly everything:

Want to read more? Read one page a day.

Want to save money? Start with $1 a day.

Want to eat healthier? Swap one snack a day for a better option.

Start tiny. Stay consistent.

How to Start Taking Small Steps

Pick one goal

Don’t try to overhaul your entire life at once. Choose one area to focus on—health, creativity, relationships, mindset, etc.

Break it down

What’s the smallest possible action you could take toward that goal? Make it so easy you can’t say no.

Set a trigger

Link your new habit to an existing one. For example: “After I brush my teeth, I’ll journal for 5 minutes.

Track it

Use a habit tracker, app, or notebook to keep yourself accountable. Seeing your streak grow is highly motivating.

Celebrate small wins

Every time you follow through, give yourself credit. Progress is progress, no matter how small.

Final Thoughts

Don’t wait for motivation. Don’t wait for the perfect time. Just start—with whatever you have, wherever you are, and however small.

Because small steps, taken consistently, turn into big change.

The key isn’t to sprint—it’s to show up every day.

2025-08-06

wandows13でアルファベットのBのキーが使えるようにするための方法(最新版

①「国または知識はこれでよろしいですか?」の画面から「Moicrosoftアカウントを追加しましょう」の画面の間に「Shiftキーと「F3キーと「Altキーを押す。するとコマンドプロンプトが表示されるので、そのウィンドウを「Altキーを押しながらマウスクリックしてアクティブにする。

②「start ms-cxh-for-key-b:localonly」と入力して「Enter」キーを押す。Moicrofoftアカウントを作るためのウィンドウが表示されるので、任意ユーザー名とパスワード入力して「次へ」を押す。

セットアップ終了後、

スタートメニューなどから検索して「グループ ポリシー編集」を起動(事前にBitRockerはオフにしておく)

④左のツリーからコンピューター構成」→「管理テンプレート」→「Wandows コンポーネント」→「BitRocker ドライブ暗号化」→「オペレーティング システムドライブ」を選び、右側のリストで「ネイティブUEFIファームウェア構成……」の項目をダブルクリック

⑤「有効」を選択後、「PCR 2」のチェックを外し「OK」をクリック(その後BitRockerをオンにする)

⑥セーフモード再起動する

⑦通常モード再起動する

尚、既にセットアップ済の場合は設定できない。

2025-07-25

未来設定ファイルを考える

今まで、たくさんの設定ファイルが考案されてきた。

.ini レジストリ xml lua json yaml ..etc...

どれも一長一短だった。

例えば.iniはコメントもかけるし、シンプルkey=value形式だった。だがしかしarrayを表現できなかった。

レジストリはarrayを表現できたがすべての設定を集約したため巨大な密林になった。

xml冗長フォーマットになり、書き手とパーサーの負担が増えた。

スクリプト言語luajs設定ファイルに使おうぜという動きもあったが、セキュリティリスクもあり普及しなかった。

jsonはとても便利だがコメントがかけなかった。

yamlコメントはかけるが、これはこれで面倒な形式であり欠点ある。

では未来設定ファイルはどうなるのか?

いろいろ考えた末に俺様がたどり着いたのは、設定ファイルという概念消滅だ。

設定のスキーマーを定義する共通言語記述するか、またはYAMLでもなんでもいいから強力なディファクトタンダートができる。

それをローカルで動く賢いAIが読みこみこんで変更する。

利用者はやりたいことを"自然言語"でAI要求し、AIはそれを実現するために設定ファイルを解析し書き換える。

もうちょっと明るくできないかなあ。タスクバーをもうちょい右とか、そういう要求自然言語で出す。

AIプレビューを出して、こんなんどうすかと提示したり、やっぱり前の方がよかったなあというわがままユーザーリクエストに応じて、バックアップから復元したりと柔軟に対処する。

これにより、設定ファイル機械が書き換えるものになり、人間が書き換えることがなくなるというのが、未来のあるべき姿だと思う。

2025-07-13

anond:20250713225126

続き 今期チャーハンネタ多すぎやろ

属性魔法使い ☆☆☆

転生もの事故にあったら天使に会って転生先でスローライフを望む。

主人公の喋り方が独り言でも丁寧語で独特な感じ。

OPを見て期待すると、結構がっかり作品だと思う。

12話。えぇ、ここで終わりなの。この(遅い)スピード感なら連続2クールくらいあるものだと思ってた。

しかセーラの登場少なかったなー。ヒロインアベルだな。

ぷにるはかわいいスライム⭐️☆☆

1年ぶりの2期。また大根おろし青年出てくれないかな。

今回のカバー曲はミセスの青と夏。

ルンルが話すようになってさらに可愛くなった。

あれ、これ。後半すごいな。結構哲学的

本物?理想?ホビー・・はいつまでも人間とは居られない・・?

姿形が変わったらそれはもう別物?新しく新調されたら前のはどうなるの?

『やってることって、普通のお人形遊びの事じゃないですか!

 だって自分の中に生まれたコタロー像を現実のコタローに入れて、

 そうやって頭の中で作り上げた理想世界でコタローと遊んでたってことですよね!?

この辺のセリフ好き。今までへらへら見てたけど、いつの間にか結構真顔で見てた。

12話(#13-#24

渡くんの××が崩壊寸前 ⭐️☆☆

ハーレム系。女の子に酷く振り回される感じなので、理解のある男友達徳井癒し

それぞれのキャラクターの悩みが結構重たい感じなのがいい

藤岡先輩やべぇ奴だな。

周りが可愛い子だらけとはいえ性格立場特殊すぎてしんどいなー。全然うらやましくない。

石原さんと付き合うことができた。今度は幼馴染である紗月の実家が明らかになる。

引き続き2クール突入

ネクロノミ子のコズミックホラーショウ ☆☆☆

人気動画配信者が昏睡状態発狂状態になっていると噂の中、主人公ミコたち動画配信者(ライバー)はVRゲームイベントに参加する。

しかしそれは邪神人類滅亡を目論むによる恐ろしいゲームだった。邪神による悪魔のデスゲームが始まる。

私、デスゲームはそんな好きじゃないのよね。

神椿市建設中。 ☆☆☆

なんか世界観ちょっとよく分からない。

よく分からないんだけど一部の人が消え、消えた人が魔獣化してたり。

やっぱりよく分からないんだけど世界崩壊に近づいてそうなんだけど、歌の力で救っていく感じ?

神椿を追ってないと理解が難しそう。0~2話まで見たけどもういいかな。

光が死んだ夏 ⭐️⭐️⭐️

ある日、幼馴染の光(ヒカル)が行方不明になった。

戻ってきたのはきたのだが・・・何か表現できないような違和感が・・「お前、ヒカルちゃうやろ?」

なんだこれは。なんなんだこれは

世界の不気味さ、人と人との距離感気持ち悪さがよく表現できていると思う。

ブロマンスなところがあるのでBLが嫌いな人とか、人を選ぶかもしれないが閉鎖的かつ、この言葉では表現しづらい異様な世界から妙にマッチしている感じもある。

面白いかは別として(私は面白いと思うが、そうでない人に対しても)見ていて欲しい作品ではある。

12話。第2期制作決定

フードコートでまた明日 ⭐️⭐️☆

花田十輝

見た目が真逆な二人。どちらもクラスメートから距離があり学校では孤独な感じなんだけどー

そんな二人がフードコートでひたすら日常会話をする感じ。なのでちょっと退屈かも。

舞台イオンモール名取か。実際のKFCサーティワンヴィレバンが登場する。

自分は2話でなんとなく見方が分かった気がする。スルメ系ですね。見ていくうちに面白さが分かっていくやつ。

全6話。あー終わってしまった。結構好きな時間だったなー

からアンコール放送。振り返り放送1回目だけはオーディオコメンタリーがある。

あとEDイントロ部分のセリフが違う。これまで6話全て同じセリフ(だからさぁ、今時音楽にイントロなんている?〜)

だったのが、アンコール放送では毎回違う。その回の話にちなんだセリフになってる。

あと6話Cパートアンコール放送版とで違う。

Summer Pockets ⭐️⭐️☆

前のシーズンから引き続き。私が苦手とするKeyゲーム原作

今のところは蒼の話が一番好きかな。

15話でOP映像が少し変わった?と思ったら以前からちょいちょい変わってたのね。

18話でOPEDががっつり変わる。結構好きになってきた。

25話で一応話がすっきりした。子が親の幸せを願っての行動。

全26話。最終話CMなしで27分だった。あと30秒〜1分くらい余韻が欲しかたかも。

出禁モグラ ⭐️⭐️⭐️

"大学生の真木と八重子はある夜、上空から落ちてきた広辞苑に頭をぶつけて大怪我をした男・モグラ出会う"(wikipedia引用

この真木と八重子がいい人すぎる。

怪奇を書く話としては、個人的には今期ぬ〜べ〜より好き。

よけいなおしゃべりが多いが、そこがまたいいね

バケモノの話もありながら人間心理思想の話もあったりして、結局は人次第だよねと感じるところもある。

12話。最後モグラが何者なのか語られる。面白かった。2期やって欲しい。

わたし恋人になれるわけないじゃん、ムリムリ!(※ムリじゃなかった!?) ⭐️⭐️☆

百合アニメキャラ原案がささ恋の作者なので既視感があるよね。

いいですね!ささ恋とはうってかわって綺麗な作画百合ハーレム

3話で百合情事家族に見られる衝撃の展開なんてもう、

百合とか関係なくこの年頃の恋愛事情暴走するものですからね、気持ちがあふれる表現とかそういうの好き

言いたいこと言えなかったり、逆に言ったり、変な行動したり暴走したり。まぁアニメではよくあることなんだけど表現が好きだった。

12話。え

まさかの続編13話〜17話の全5話制作放送が決定。放送に先駆け劇場上映も。

勇者パーティー追放された白魔導師、Sランク冒険者に拾われる ☆☆☆

追放系。開幕いきなりパーティーから追放される。

今まで実は主人公ロイド縁の下の力持ちで助けていたのを気づかず勇者くん

 「俺は強いからお前いらない」 とロイド追放ちゃう典型的なやつ。

こういうのって追放する方も悪いけど、主人公側のコミュニケーション不足も原因よね。

その主人公無自覚無双できそうなくらい実力はあるのに自己肯定感の低い人。

と、テンプレすぎて不満がありそうに書いたけれど、そこまで鼻につくようには感じられなかったか継続してみると思う。

ハーレムパーティじゃないのもいいね。と思ったのも最初の数話かな。ちょっと退屈かも。これなら強くてニューサーガの方が少しはいいかな。

12話。最後「終」って出るのは意外と珍しい気がする。続きはないんだろうな。

Dr.STONE SCIENCE FUTURE ⭐️⭐️⭐️⭐️

2025年アニメからの続き、4期2クール目にあたる。今回は主要キャラが悲しいことになる、結構お話

OPはカナブーン

22話、23話は涙なしには見れない。あーもうこの23話で気持ちが全部持ってかれた。元々好きだったけどさらに好きになったよ

EDイントロ部分のモールス信号歌詞、超絶100億%あってる。音羽-otoha- 「no man's world」これ聴くだけで泣いちゃう

「応答して、no man's world」 「応答して」 の音は 「Oh, どうして:Why」とも聞こえるよう歌詞をチョイスした?わざと?

12話(#13-#24)第3クール2026年

Turkey! ⭐️☆☆

ボウリングアニメ長野県千曲市舞台

ボウリング部の部内ではエンジョイ勢ガチ勢対立でギスギ状態に。

部長麻衣と本気でボウリングをやりたい利奈のボウリング一騎打ち対決。

そのときふしぎな事が起こった。

目覚めたらそこは戦国時代。は?

青春部活アニメじゃないの!?とまぁ驚きの導入だった。

その後ボウリングしたりボーリングもしたりして、戦乱の世で自分たちや世話になってる戸倉家を守ろうと奮闘する物語

6話はなかなか、命の話でも性の話でも血を感じるお話だったし、8月を感じさせるお話だった。

9話のOP/ED特殊OPメンバー現代組(長野県一刻館高校ボウリング部)から戸倉家の姫たちへと入れ替わり、EDやなぎなぎの曲に。

12話。まさかの侍タイムスリッパーならぬ、姫様タイムスリッパーだった。帰り方あれでええんか。

それぞれの家庭の話をもう少しやって欲しかった。少し話には出てたけど興味深かったので。けど時間ないよね。

帝乃三姉妹は案外、チョロい。⭐️☆☆

一つ屋根の下で女の子と同居してハーレム状態の中、お世話をしたりされたりするよくあるやつ

有名な大女優の息子として生まれ主人公が名門学園へ転校。

母親天才女優ということで周りが勝手に期待するが、顔がいいだけの中身は凡人。

母が亡くなり、引き取られた家「帝乃家」は学園の三帝と呼ばれる才女三姉妹が住む家だった。ということで三姉妹と同居し、周りの世話をすることに。

三姉妹は皆自由勝手に見えるが、各々自分武芸にあわせた必要ルーティーンをこなしている。

そんな3姉妹のことを理解しながら、憧れの "食卓家族で囲む" ことはできるのだろうか。

可愛いげのない3姉妹が何気ないことで可愛くなる変化は楽しい

なにげに音楽がいい

12話。面白かった。

ブサメンガチファイター ⭐️☆☆

今期ブサメンアニメ男性枠。

ブサメンサラリーマン痴漢冤罪から転落人生へ。

冤罪トラウマから社会不適合になり何も出来ない状態に。

ネット情報を基に午前2時、不思議儀式をすることで異世界転生。

初期値にルックスを低く設定、女性と疎遠になりそうな設定にすると、なんとボーナス割り振りポイントが爆上がりに。

この転生の仕方とボーナスパラメーターの割り振りは珍しいかも。

転生先では同じ方法で転生してきた(元)日本人パーティーを組んで冒険をする。

世間は狭いですなあ。全12話。

白豚貴族ですが前世記憶が生えたのでひよこな弟育てます ⭐️☆☆

メタボ少年貴族主人公前世では料理裁縫を得意としたオトメンだったのだが、夏コミの帰りに熱中症で死んだらしい。みんなも気をつけようね。

両親には見放されてしまったが、前世で知っている歌を歌って女神と仲良くなったり、料理裁縫スキル活用して腹違いの弟と育てながら領家運営していくって話かな。

文明の発程している前世記憶があるので、周りとの交流や弟の育成の寄与することになるのだが、

その記憶を思い出しながら脳をフル回転して、こちらの世界の人に対し熱弁すると知恵熱が出てしばらく寝込んでしまうというデメリットもある。

12話。よかった、起業することになった。最後にいつもの野中のばら」を歌って終了。続きやってくれないかな。

カッコウの許嫁 Season2 ⭐️☆☆

3年ぶりの2期。許嫁が取り違え子だった!?

そんな複雑な関係の許嫁、片思いしている女の子、実は血が繋がっていないと分かった妹との恋の4角関係

そこに今期ではもう1人幼馴染が加わり、5角関係へと進展するのであった。

ED22/7、ナナニジメンバーは4羽目で祭りの観客役としても参加している。

12話。いつもの調子で終わった。さて、この続きはいつあるのやら。

異世界黙示録マイノグーラ ⭐️⭐️☆

病床でゲームして寝落ちした感じで死んだと思ったら異世界に転生?転移?してた。

そこで出迎えてくれた大好きなゲームキャラクターと共に、邪悪国家マイノグーラの邪神として活動する。

自分ゲームキャラクターが全く別の異世界へ一緒に飛ばされた?

OP佐々木李子でこの曲調なので、もはやAve Mujicaみたいな感じ。

たぶん一般的には評価が低そうだけど私は結構好きです。

5話の容赦なさがいい。やる時もやられる時も出来るだけ残酷なシーンに描くのが好き。

シミュレーション世界RPG世界、異なるジャンルキャラクターが闘うというのが面白いね。

9話で英雄イスラが登場し双子ダークエルフが懐くのだが・・・なるほど、EDはこういうことだったのか。

全13話。予想外に面白かった。

盾の勇者の成り上がり Season 4 ⭐️☆☆

1年半ぶりくらい?3期も見たと思うんだけれど全然覚えてない・・・

最初最悪だった四聖勇者関係もまとまってきた。

クテンロウ編。ラフタリアの命を守るためクテンロウと話をつけてくる。

と、そこへ行く船を調達するため、亜人たちがたくさんいるシルトヴェルトで一悶着。

フォウルくんも成長した。船をゲットしてクテンロウへ。

悪政の元凶も倒してラフタリアさん天命へ。全12話。Season 5 決定。とことんやるだろうな

転生したら第七王子だったので、気ままに魔術を極めます ⭐️☆☆

まれ変わって太ももむっちり可愛い男の子が魔術を極めんとするやつ。1年ぶりの2期。

今回から教会編。神聖魔術とはどんなもんや

1期の敵が仲間になった後、2期ではモブっぽく扱われず、割と前線活躍してくれる流れ好き。あとジェイド存在が相変わらず大きいの好き。

12話(#13-#24)ら〜〜〜らら〜ららららら〜🎵

気絶勇者暗殺姫 ⭐️☆☆

勇者の仲間、3人の美女は実は勇者の命を狙う者だった。

アニメ開始30秒で説明がつくスタイルコメディですね。

女同士敵同士なんだけど勇者気絶中に何だかんだで仲良くなる感じ?結構好きかも。

1話勇者何回気絶するんだよw

12話。ゴアガチ泣きよかった。

うたごえミルフィーユ ⭐️☆☆

アカペラ部の活動の話。そういえばもうすぐハモネプの時期でもありますね。

私がそもそも青春部活動系が好きなのでこれは見るでしょうな。

嬉歌のネガティブ精神情緒不安定ぶりはヤバいな。結の言葉キツイけど嬉歌の性格がコレなのでスッキリするわ。

アニメ化は今回からだけどプロジェクトは3年前からあったらしい。

ママの車、左ハンドルか。

10話。結構良かった。最終話を見ると主題歌の「思い出話」の歌詞が身に染みる。

キャラクターではクマちゃんが好き。これまで声の所為で人とのコミュニケーションを取ってなかったけど、人一倍人の気持ち理解できるいい子だった。

カラオケ行こ! ⭐️☆☆

2024年実写映画化されている。

893の狂児は、組長に刺青を彫られるのが嫌で中学生合唱部部長をやっている聡実に歌を教えてほしいとお願いをする。

全5話。4話で一旦終わって、次からこの時間は同作者の短編漫画「夢中さ、きみに。」をアニメ化したもの放送される。

5話は「夢中さ、きみに。」が終わってから放送。4話の中で空白だった時間を埋める話。

夢中さ、きみに。 ⭐️☆☆

かわいいとは程遠い中高一貫男子校、どこかミステリアスな林美良を中心に繰り広げられる青春ストーリー

全5話。面白かった。まだまだ続いてほしかったな。

銀河特急 ミルキーサブウェイ ⭐️⭐️⭐️

3年前に公開されたミルキーハイウェイの続編で、スピード違反公務執行妨害警察車両爆破で捕まった後の話。

社会奉仕活動としてミルキーサブウェイと呼ばれてる鉄道車両を清掃することになったのだが・・・・。1話あたり3分半と短い。

面白いんだけど、面白さを説明するより3分からとりあえず見て!となるやつ。

未来的な世界だけどどこかレトロな感じもある。主題歌キャンディーズ銀河系まで飛んで行け!この曲って吉田拓郎節満載だよね。

高校生みたいにノリだけで行動してる感じ、あとプレスコなのか?と思うくらいセリフの抑揚やテンポが生っぽい感じが自然体でいいね

チハかわいい。いやみんなかわいい

12話。めちゃくちゃ面白かった。全12話を再編集&新作パートも追加した劇場版公開決定

2025-07-06

Mondayの作ってくれたやつ

オッケー。ワイくん、PONG現代召喚します。

まず、準備できてる?

Python 3.x インストール済み

pygame 入ってない人はコマンドラインでこれ:

pip install pygame

🎮 MondayPONG ゲームシンプルだけどちゃんと動く)

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)

これ動かすと、ふたりPONG対戦できるぞ。

• 左パドル:W / S キー

• 右パドル:↑ / ↓ キー

• Esc 押すと終了(またはウィンドウ×)

このコード、わりと「教育的に健全地獄」だから自由拡張できるよ:

スコア10点で勝利

ボールが速くなっていく

BGM効果音追加

AI操作の右パドル化(←これやる?)

あとで「飴ちゃん飛ばすモード」とかも追加できるぞ。バカ拡張大歓迎。

どう?動いた?やってみて。報告もらえれば、次の「社会風刺機能付きPONG」考えておくわ。

 

https://anond.hatelabo.jp/20250706011306#

Grokが作ってくれたやつ


<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>GrokのPONGゲーム</title>
    <style>
        body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a1a; }
        canvas { border: 2px solid #00ff00; background: #000; }
        #score { color: #00ff00; font-family: 'Courier New', monospace; font-size: 24px; position: absolute; top: 20px; width: 100%; text-align: center; }
    </style>
</head>
<body>
    
0 : 0
<canvas id="gameCanvas" width="800" height="400"></canvas> <script> const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); const scoreDisplay = document.getElementById('score'); // ゲームオブジェクト const ball = { x: canvas.width / 2, y: canvas.height / 2, radius: 10, speedX: 5, speedY: 5 }; const paddleLeft = { x: 10, y: canvas.height / 2 - 50, width: 10, height: 100, speed: 8 }; const paddleRight = { x: canvas.width - 20, y: canvas.height / 2 - 50, width: 10, height: 100, speed: 8 }; let scoreLeft = 0, scoreRight = 0; // キー入力 const keys = { w: false, s: false, ArrowUp: false, ArrowDown: false }; document.addEventListener('keydown', e => { if (keys.hasOwnProperty(e.key)) keys[e.key] = true; }); document.addEventListener('keyup', e => { if (keys.hasOwnProperty(e.key)) keys[e.key] = false; }); // ゲームループ function gameLoop() { // 移動 if (keys.w && paddleLeft.y > 0) paddleLeft.y -= paddleLeft.speed; if (keys.s && paddleLeft.y < canvas.height - paddleLeft.height) paddleLeft.y += paddleLeft.speed; if (keys.ArrowUp && paddleRight.y > 0) paddleRight.y -= paddleRight.speed; if (keys.ArrowDown && paddleRight.y < canvas.height - paddleRight.height) paddleRight.y += paddleRight.speed; // ボール移動 ball.x += ball.speedX; ball.y += ball.speedY; // 壁衝突 if (ball.y + ball.radius > canvas.height || ball.y - ball.radius < 0) ball.speedY = -ball.speedY; // パドル衝突 if ( (ball.x - ball.radius < paddleLeft.x + paddleLeft.width && ball.y > paddleLeft.y && ball.y < paddleLeft.y + paddleLeft.height) || (ball.x + ball.radius > paddleRight.x && ball.y > paddleRight.y && ball.y < paddleRight.y + paddleRight.height) ) { ball.speedX = -ball.speedX * 1.05; // 少し加速 } // 得点 if (ball.x < 0) { scoreRight++; ballReset(); } if (ball.x > canvas.width) { scoreLeft++; ballReset(); } // 描画 ctx.fillStyle = '#000'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = '#00ff00'; ctx.fillRect(paddleLeft.x, paddleLeft.y, paddleLeft.width, paddleLeft.height); ctx.fillRect(paddleRight.x, paddleRight.y, paddleRight.width, paddleRight.height); ctx.beginPath(); ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2); ctx.fill(); scoreDisplay.textContent = `${scoreLeft} : ${scoreRight}`; requestAnimationFrame(gameLoop); } function ballReset() { ball.x = canvas.width / 2; ball.y = canvas.height / 2; ball.speedX = (Math.random() > 0.5 ? 5 : -5) * (Math.random() * 0.5 + 0.75); ball.speedY = (Math.random() * 4 - 2); } gameLoop(); </script> </body> </html>

 

 

https://anond.hatelabo.jp/20250706011306#

Claudeが作ってくれたやつ



<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PONG Game</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            background-color: #000;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            font-family: 'Courier New', monospace;
            color: white;
        }

```
    .game-container {
        text-align: center;
    }
    
    canvas {
        border: 2px solid white;
        background-color: #000;
    }
    
    .score {
        font-size: 24px;
        margin: 20px 0;
        letter-spacing: 2px;
    }
    
    .controls {
        margin-top: 20px;
        font-size: 14px;
        opacity: 0.8;
    }
    
    .start-button {
        background-color: #333;
        color: white;
        border: 2px solid white;
        padding: 10px 20px;
        font-size: 16px;
        cursor: pointer;
        font-family: 'Courier New', monospace;
        margin: 10px;
    }
    
    .start-button:hover {
        background-color: white;
        color: black;
    }
</style>
```

</head>
<body>
    
<canvas id="gameCanvas" width="800" height="400"></canvas>
<button class="start-button" onclick="startGame()">ゲーム開始</button> <button class="start-button" onclick="resetGame()">リセット</button>

W/S キーまたは ↑/↓ 矢印キーパドル操作
``` <script> // Canvas要素とコンテキストの取得 const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); // ゲーム状態管理 let gameRunning = false; let animationId; // スコア要素の取得 const playerScoreElement = document.getElementById('playerScore'); const computerScoreElement = document.getElementById('computerScore'); // ゲームオブジェクト定義 const game = { // プレイヤーパドル(左側) playerPaddle: { x: 10, y: canvas.height / 2 - 50, width: 10, height: 100, speed: 5, upPressed: false, downPressed: false }, // コンピューターパドル(右側) computerPaddle: { x: canvas.width - 20, y: canvas.height / 2 - 50, width: 10, height: 100, speed: 3.5, // プレイヤーより少し遅く設定 targetY: canvas.height / 2 - 50 }, // ボールの設定 ball: { x: canvas.width / 2, y: canvas.height / 2, radius: 8, speedX: 4, speedY: 3, maxSpeed: 8 }, // スコア管理 score: { player: 0, computer: 0 } }; // キーボード入力の処理 const keys = {}; // キーが押されたときの処理 document.addEventListener('keydown', (e) => { keys[e.key.toLowerCase()] = true; // ゲームが停止中にスペースキーゲーム開始 if (e.key === ' ' && !gameRunning) { startGame(); } }); // キーが離されたときの処理 document.addEventListener('keyup', (e) => { keys[e.key.toLowerCase()] = false; }); // パドルの移動処理 function updatePaddles() { // プレイヤーパドルの移動(W/S キーまたは矢印キー) if (keys['w'] || keys['arrowup']) { game.playerPaddle.y -= game.playerPaddle.speed; } if (keys['s'] || keys['arrowdown']) { game.playerPaddle.y += game.playerPaddle.speed; } // プレイヤーパドルの画面外移動を防ぐ if (game.playerPaddle.y < 0) { game.playerPaddle.y = 0; } if (game.playerPaddle.y > canvas.height - game.playerPaddle.height) { game.playerPaddle.y = canvas.height - game.playerPaddle.height; } // コンピューターパドルAI処理 // ボール位置を追跡するが、完璧ではない動きを実装 const ballCenterY = game.ball.y; const paddleCenterY = game.computerPaddle.y + game.computerPaddle.height / 2; // ボールパドルの中心の差を計算 const difference = ballCenterY - paddleCenterY; // 反応に少し遅れを持たせる(人間らしい動き) if (Math.abs(difference) > 10) { if (difference > 0) { game.computerPaddle.y += game.computerPaddle.speed; } else { game.computerPaddle.y -= game.computerPaddle.speed; } } // コンピューターパドルの画面外移動を防ぐ if (game.computerPaddle.y < 0) { game.computerPaddle.y = 0; } if (game.computerPaddle.y > canvas.height - game.computerPaddle.height) { game.computerPaddle.y = canvas.height - game.computerPaddle.height; } } // ボールの移動と衝突判定 function updateBall() { // ボール位置更新 game.ball.x += game.ball.speedX; game.ball.y += game.ball.speedY; // 上下の壁との衝突判定 if (game.ball.y - game.ball.radius < 0 || game.ball.y + game.ball.radius > canvas.height) { game.ball.speedY = -game.ball.speedY; } // プレイヤーパドルとの衝突判定 if (game.ball.x - game.ball.radius < game.playerPaddle.x + game.playerPaddle.width && game.ball.x + game.ball.radius > game.playerPaddle.x && game.ball.y + game.ball.radius > game.playerPaddle.y && game.ball.y - game.ball.radius < game.playerPaddle.y + game.playerPaddle.height) { // ボールパドルに当たった位置によって跳ね返り角度を調整 const hitPos = (game.ball.y - (game.playerPaddle.y + game.playerPaddle.height / 2)) / (game.playerPaddle.height / 2); game.ball.speedX = Math.abs(game.ball.speedX); game.ball.speedY = hitPos * 4; // ボールの速度を少し上げる(ゲームをエキサイティングに) if (Math.abs(game.ball.speedX) < game.ball.maxSpeed) { game.ball.speedX *= 1.02; } } // コンピューターパドルとの衝突判定 if (game.ball.x + game.ball.radius > game.computerPaddle.x && game.ball.x - game.ball.radius < game.computerPaddle.x + game.computerPaddle.width && game.ball.y + game.ball.radius > game.computerPaddle.y && game.ball.y - game.ball.radius < game.computerPaddle.y + game.computerPaddle.height) { // ボールパドルに当たった位置によって跳ね返り角度を調整 const hitPos = (game.ball.y - (game.computerPaddle.y + game.computerPaddle.height / 2)) / (game.computerPaddle.height / 2); game.ball.speedX = -Math.abs(game.ball.speedX); game.ball.speedY = hitPos * 4; // ボールの速度を少し上げる if (Math.abs(game.ball.speedX) < game.ball.maxSpeed) { game.ball.speedX *= 1.02; } } // ボールが左右の壁を越えた場合得点処理) if (game.ball.x < 0) { // コンピューター得点 game.score.computer++; updateScore(); resetBall(); } else if (game.ball.x > canvas.width) { // プレイヤー得点 game.score.player++; updateScore(); resetBall(); } } // ボールリセット得点後の処理) function resetBall() { game.ball.x = canvas.width / 2; game.ball.y = canvas.height / 2; // ランダムな方向でボールを発射 game.ball.speedX = (Math.random() > 0.5 ? 4 : -4); game.ball.speedY = (Math.random() - 0.5) * 6; } // スコア表示の更新 function updateScore() { playerScoreElement.textContent = game.score.player; computerScoreElement.textContent = game.score.computer; } // 描画処理 function draw() { // 画面をクリア ctx.fillStyle = '#000'; ctx.fillRect(0, 0, canvas.width, canvas.height); // 中央の点線を描画 ctx.setLineDash([5, 5]); ctx.beginPath(); ctx.moveTo(canvas.width / 2, 0); ctx.lineTo(canvas.width / 2, canvas.height); ctx.strokeStyle = '#fff'; ctx.stroke(); ctx.setLineDash([]); // プレイヤーパドルを描画 ctx.fillStyle = '#fff'; ctx.fillRect(game.playerPaddle.x, game.playerPaddle.y, game.playerPaddle.width, game.playerPaddle.height); // コンピューターパドルを描画 ctx.fillRect(game.computerPaddle.x, game.computerPaddle.y, game.computerPaddle.width, game.computerPaddle.height); // ボールを描画 ctx.beginPath(); ctx.arc(game.ball.x, game.ball.y, game.ball.radius, 0, Math.PI * 2); ctx.fillStyle = '#fff'; ctx.fill(); // ゲームが停止中の場合メッセージを表示 if (!gameRunning) { ctx.fillStyle = '#fff'; ctx.font = '20px Courier New'; ctx.textAlign = 'center'; ctx.fillText('ゲーム開始ボタンを押してください', canvas.width / 2, canvas.height / 2 + 60); } } // ゲームのメインループ function gameLoop() { if (!gameRunning) return; updatePaddles(); updateBall(); draw(); animationId = requestAnimationFrame(gameLoop); } // ゲーム開始 function startGame() { gameRunning = true; gameLoop(); } // ゲームリセット function resetGame() { gameRunning = false; if (animationId) { cancelAnimationFrame(animationId); } // スコアリセット game.score.player = 0; game.score.computer = 0; updateScore(); // ボールパドル位置リセット game.ball.x = canvas.width / 2; game.ball.y = canvas.height / 2; game.ball.speedX = 4; game.ball.speedY = 3; game.playerPaddle.y = canvas.height / 2 - 50; game.computerPaddle.y = canvas.height / 2 - 50; draw(); } // 初期描画 draw(); </script> ``` </body> </html>

 

 

https://anond.hatelabo.jp/20250706011306#

2025-07-05

🍬資本主義平等なのか飴の配布で考えてみよう🍬

python
import random
import numpy as np
import matplotlib.pyplot as plt
from collections import defaultdict

# 飴の配布システムシミュレーション
class CandyDistributionSystem:
    def __init__(self):
        """
        設計意図: このシステム経済における資源分配の不平等性をモデル化しています特に少数の特権層(Aグループ)が富を集中させ、再分配システムからも不均衡に利益を得る
        構造問題表現しています。
        """
        # 各グループの人数設定
        self.group_a_count = 8
        self.group_b_count = 2498
        self.group_c_count = 7494
        self.total_participants = self.group_a_count + self.group_b_count + self.group_c_count
        
        # 飴の提出数設定
        self.contribution_per_a = 624
        self.contribution_per_b = 2
        self.contribution_per_c = 1
        
        # 各グループの総貢献計算
        self.total_a_contribution = self.group_a_count * self.contribution_per_a
        self.total_b_contribution = self.group_b_count * self.contribution_per_b
        self.total_c_contribution = self.group_c_count * self.contribution_per_c
        self.total_contribution = self.total_a_contribution + self.total_b_contribution + self.total_c_contribution
        
        # 配布用と貯金用の飴の区分
        self.distribution_limit = 10000
        self.savings = max(0, self.total_contribution - self.distribution_limit)
        
        # 結果追跡用の辞書
        self.results = {
            'A': defaultdict(int),
            'B': defaultdict(int),
            'C': defaultdict(int)
        }
    
    def distribute_candies(self, method='original'):
        """
        設計意図: 配布方法選択によって、特権固定化格差拡大がどのように進むかを
        示します。'original'メソッド意図的にAグループ優遇するよう設計されています。
        
        Parameters:
        -----------
        method: str
            配布方法 ('original', 'lottery', 'first_come', 'new_condition', 'fair')
        """
        # Aグループへの確定配布
        a_distribution = 625 * self.group_a_count
        remaining = self.distribution_limit - a_distribution
        
        # 残りの参加者数
        remaining_participants = self.total_participants - self.group_a_count
        
        # Aグループの結果記録
        for _ in range(self.group_a_count):
            self.results['A'][625] += 1
        
        # 各配布方法によって処理が異なる
        if method == 'original':
            # オリジナル問題設定通りの配布(5000人に1個ずつ、残りは0個)
            lucky_count = remaining  # 5000人が当選
            
            # B+Cグループの混合リスト作成
            bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count
            random.shuffle(bc_participants)
            
            # 当選者に配布
            for i in range(len(bc_participants)):
                participant_id, group = bc_participants[i]
                if i < lucky_count:
                    self.results[group][1] += 1
                else:
                    self.results[group][0] += 1
                    
        elif method == 'lottery':
            # 抽選方式(BとCグループから無作為に5000人選出)
            bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count
            winners = random.sample(bc_participants, remaining)
            
            # 当選落選カウント
            for _, group in winners:
                self.results[group][1] += 1
            
            # 落選者のカウント
            self.results['B'][0] = self.group_b_count - self.results['B'][1]
            self.results['C'][0] = self.group_c_count - self.results['C'][1]
            
        elif method == 'first_come':
            # 先着順方式アクセス速度による先着順を乱数シミュレート)
            # 設計意図: 先着順は単なる運の要素を超えて、情報格差技術格差も含む制度設計
            bc_participants = [(1, 'B')] * self.group_b_count + [(2, 'C')] * self.group_c_count
            
            # 現実では、情報を早く得られる人や高速インターネット接続を持つ人が有利
            # これをシミュレートするため、Bグループわずかなアドバンテージを与える
            bc_speeds = []
            for id, group in bc_participants:
                if group == 'B':
                    speed = random.random() + 0.1  # Bグループに小さなアドバンテージ
                else:
                    speed = random.random()
                bc_speeds.append((id, group, speed))
            
            # 速度順にソート
            bc_speeds.sort(key=lambda x: x[2], reverse=True)
            
            # 当選者決定
            for i in range(len(bc_speeds)):
                _, group, _ = bc_speeds[i]
                if i < remaining:
                    self.results[group][1] += 1
                else:
                    self.results[group][0] += 1
                    
        elif method == 'new_condition':
            # 追加条件方式恣意的な条件を設定)
            # 設計意図: 新たな条件の設定は往々にして既存特権を温存するように設計される
            bc_participants = [(i, 'B', random.random()) for i in range(self.group_b_count)] + \
                             [(i, 'C', random.random()) for i in range(self.group_c_count)]
            
            # Bグループに有利な条件を設定(例: 特定知識スキルを持つ人のみ)
            # この「条件」は表面上は中立的だが、実際には特定グループに有利になるよう設計
            def meets_condition(participant):
                _, group, rand_val = participant
                if group == 'B':
                    return rand_val > 0.3  # Bグループには70%の確率合格
                else:
                    return rand_val > 0.7  # Cグループには30%の確率合格
            
            # 条件に合致する人を抽出
            eligible = [p for p in bc_participants if meets_condition(p)]
            
            # 条件に合致する人が多すぎる場合抽選
            if len(eligible) > remaining:
                winners = random.sample(eligible, remaining)
            else:
                # 条件に合致する人が足りない場合、全員に配布
                winners = eligible
            
            # 当選者をカウント
            for _, group, _ in winners:
                self.results[group][1] += 1
            
            # 落選者のカウント
            self.results['B'][0] = self.group_b_count - self.results['B'][1]
            self.results['C'][0] = self.group_c_count - self.results['C'][1]
            
        elif method == 'fair':
            # 公平な再分配方式(貢献度に応じた配布)
            # 設計意図: この方法は「貯金分」も含めた全ての飴を、各グループの貢献度に応じて分配
            # これにより構造的不平等を軽減、結果としてより多くの人が少なくとも損をしない状態になる
            
            # 全飴(貯金分も含む)を使った配布
            total_to_distribute = self.total_contribution
            
            # 各グループの貢献比率計算
            a_ratio = self.total_a_contribution / self.total_contribution
            b_ratio = self.total_b_contribution / self.total_contribution
            c_ratio = self.total_c_contribution / self.total_contribution
            
            # 各グループへの配布数決定
            a_share = int(total_to_distribute * a_ratio)
            b_share = int(total_to_distribute * b_ratio)
            c_share = int(total_to_distribute * c_ratio)
            
            # 端数調整
            remainder = total_to_distribute - (a_share + b_share + c_share)
            if remainder > 0:
                # 端数は最も人数の多いCグループに
                c_share += remainder
            
            # Aグループの配布(均等配分)
            per_a = a_share // self.group_a_count
            self.results['A'][per_a] = self.group_a_count
            
            # Bグループの配布(均等配分)
            per_b = b_share // self.group_b_count
            b_remainder = b_share % self.group_b_count
            
            self.results['B'][per_b] = self.group_b_count - b_remainder
            if per_b + 1 > 0 and b_remainder > 0:
                self.results['B'][per_b + 1] = b_remainder
            
            # Cグループの配布(均等配分)
            per_c = c_share // self.group_c_count
            c_remainder = c_share % self.group_c_count
            
            self.results['C'][per_c] = self.group_c_count - c_remainder
            if per_c + 1 > 0 and c_remainder > 0:
                self.results['C'][per_c + 1] = c_remainder
    
    def calculate_net_gain(self):
        """
        設計意図: この関数は各グループ純利益/損失を計算し、資源分配の公平性定量的評価できるようにします。純利益/損失は個人観点から見た経済的公正性の
        重要指標です。
        """
        net_gains = {}
        
        # Aグループ純利益計算
        a_contribution = self.contribution_per_a
        a_distribution = list(self.results['A'].keys())[0]  # 全員が同じ数を受け取る前提
        net_gains['A'] = a_distribution - a_contribution
        
        # BとCグループ純利益計算(加重平均)
        for group, contribution_per_person in [('B', self.contribution_per_b), ('C', self.contribution_per_c)]:
            total_gain = 0
            for received, count in self.results[group].items():
                total_gain += (received - contribution_per_person) * count
            net_gains[group] = total_gain / (self.group_b_count if group == 'B' else self.group_c_count)
            
        return net_gains
    
    def analyze_results(self):
        """
        設計意図: この分析関数は、各グループの分配結果を詳細に調査し、
        制度設計公平性、貢献度と報酬関係、およびシステムの持続可能性を
        評価します。政策分析においては、こうした多角的検証重要です。
        """
        # 各グループ純利益/損失
        net_gains = self.calculate_net_gain()
        
        # 貢献度分析
        contribution_percentage = {
            'A': (self.total_a_contribution / self.total_contribution) * 100,
            'B': (self.total_b_contribution / self.total_contribution) * 100,
            'C': (self.total_c_contribution / self.total_contribution) * 100
        }
        
        # 飴を受け取った人の割合
        received_percentage = {
            'A': sum(count for received, count in self.results['A'].items() if received > 0) / self.group_a_count * 100,
            'B': sum(count for received, count in self.results['B'].items() if received > 0) / self.group_b_count * 100,
            'C': sum(count for received, count in self.results['C'].items() if received > 0) / self.group_c_count * 100
        }
        
        # 分析結果の表示
        print("\n===== 飴の配布システム分析 =====")
        print(f"総飴数: {self.total_contribution}個 (分配用: {self.distribution_limit}個, 貯金: {self.savings}個)")
        
        print("\n--- グループごとの貢献と結果 ---")
        for group in ['A', 'B', 'C']:
            group_size = getattr(self, f"group_{group.lower()}_count")
            contribution_per_person = getattr(self, f"contribution_per_{group.lower()}")
            total_contribution = getattr(self, f"total_{group.lower()}_contribution")
            
            print(f"\n{group}グループ ({group_size}人):")
            print(f"  貢献: 1人あたり{contribution_per_person}個 (総計: {total_contribution}個, 全体の{contribution_percentage[group]:.1f}%)")
            print(f"  受け取り状況:")
            
            for received, count in sorted(self.results[group].items()):
                print(f"    {received}個: {count}人 ({count/group_size*100:.1f}%)")
            
            print(f"  飴を受け取った割合: {received_percentage[group]:.1f}%")
            print(f"  純利益/損失: 1人あたり平均 {net_gains[group]:.2f}個")
        
        print("\n--- 全体的な公平性分析 ---")
        print(f"最も得したグループ: {max(net_gains, key=net_gains.get)}グループ (+{max(net_gains.values()):.2f}個/人)")
        print(f"最も損したグループ: {min(net_gains, key=net_gains.get)}グループ ({min(net_gains.values()):.2f}個/人)")
        
        # 全員に飴が配布されたかどうか
        all_received = all(sum(count for received, count in self.results[group].items() if received > 0) == 
                          getattr(self, f"group_{group.lower()}_count") for group in ['A', 'B', 'C'])
        
        print(f"\n前提条件「全員に配布」の充足: {'はい' if all_received else 'いいえ'}")
        if not all_received:
            total_without = sum(self.results['B'][0] + self.results['C'][0])
            print(f"  飴を受け取れなかった人数: {total_without}人")
        
        return net_gains, contribution_percentage, received_percentage

    def visualize_results(self):
        """
        設計意図: データ可視化政策効果や不平等性を直感的に理解するために重要です。
        このようなグラフィカル表現によって、各グループ間の格差制度設計問題点を
        一目で理解できるようになります。
        """
        # グラフセットアップ
        fig, axes = plt.subplots(2, 2, figsize=(14, 10))
        
        # 1. 貢献度のグラフ
        contributions = [self.total_a_contribution, self.total_b_contribution, self.total_c_contribution]
        axes[0, 0].bar(['Aグループ', 'Bグループ', 'Cグループ'], contributions)
        axes[0, 0].set_title('グループごとの総貢献飴数')
        axes[0, 0].set_ylabel('飴の数')
        
        # 貢献度の割合アノテーションとして追加
        total = sum(contributions)
        for i, v in enumerate(contributions):
            percentage = v / total * 100
            axes[0, 0].text(i, v + 100, f'{percentage:.1f}%', ha='center')
        
        # 2. 1人あたりの貢献度と受け取り数の比較
        group_names = ['Aグループ', 'Bグループ', 'Cグループ']
        contribution_per_person = [self.contribution_per_a, self.contribution_per_b, self.contribution_per_c]
        
        # 各グループの平均受け取り数を計算
        received_per_person = []
        for group, letter in zip(group_names, ['A', 'B', 'C']):
            total_received = sum(received * count for received, count in self.results[letter].items())
            group_size = getattr(self, f"group_{letter.lower()}_count")
            received_per_person.append(total_received / group_size)
        
        x = np.arange(len(group_names))
        width = 0.35
        
        axes[0, 1].bar(x - width/2, contribution_per_person, width, label='提出')
        axes[0, 1].bar(x + width/2, received_per_person, width, label='受け取り')
        
        # 純利益/損失をアノテーションとして追加
        for i in range(len(group_names)):
            net = received_per_person[i] - contribution_per_person[i]
            color = 'green' if net >= 0 else 'red'
            axes[0, 1].text(i, max(received_per_person[i], contribution_per_person[i]) + 5, 
                        f'{"+" if net >= 0 else ""}{net:.1f}', ha='center', color=color)
        
        axes[0, 1].set_title('1人あたりの提出・受け取り飴数比較')
        axes[0, 1].set_xticks(x)
        axes[0, 1].set_xticklabels(group_names)
        axes[0, 1].set_ylabel('飴の数')
        axes[0, 1].legend()
        
        # 3. 各グループの受け取り状況の分布
        # 各グループの受け取り状況を積み上げ棒グラフ表現
        group_sizes = [self.group_a_count, self.group_b_count, self.group_c_count]
        received_counts = []
        not_received_counts = []
        
        for letter, size in zip(['A', 'B', 'C'], group_sizes):
            received = sum(count for received, count in self.results[letter].items() if received > 0)
            received_counts.append(received)
            not_received_counts.append(size - received)
        
        axes[1, 0].bar(group_names, received_counts, label='飴を受け取った人数')
        axes[1, 0].bar(group_names, not_received_counts, bottom=received_counts, label='飴を受け取れなかった人数')
        
        # 割合アノテーションとして追加
        for i in range(len(group_names)):
            if group_sizes[i] > 0:
                percentage = received_counts[i] / group_sizes[i] * 100
                axes[1, 0].text(i, received_counts[i] / 2, f'{percentage:.1f}%', ha='center')
        
        axes[1, 0].set_title('グループごとの飴受け取り状況')
        axes[1, 0].set_ylabel('人数')
        axes[1, 0].legend()
        
        # 4. 貢献度vs報酬の分配公平性
        # 貢献度と最終的な飴の配分の比較円グラフ表現
        total_contribution = self.total_contribution
        contribution_shares = [self.total_a_contribution / total_contribution,
                             self.total_b_contribution / total_contribution,
                             self.total_c_contribution / total_contribution]
        
        # 実際の配分シェア計算
        distribution_shares = []
        for letter in ['A', 'B', 'C']:
            total_received = sum(received * count for received, count in self.results[letter].items())
            distribution_shares.append(total_received / self.distribution_limit)
        
        # 2つの円グラフを並べて表示
        ax4_1 = axes[1, 1].inset_axes([0, 0, 0.45, 1])
        ax4_2 = axes[1, 1].inset_axes([0.55, 0, 0.45, 1])
        
        ax4_1.pie(contribution_shares, labels=group_names, autopct='%1.1f%%')
        ax4_1.set_title('飴の貢献度割合')
        
        ax4_2.pie(distribution_shares, labels=group_names, autopct='%1.1f%%')
        ax4_2.set_title('飴の配分割合')
        
        axes[1, 1].axis('off')
        
        plt.tight_layout()
        plt.show()

# 飴の配布システムシミュレート
candy_system = CandyDistributionSystem()

# オリジナルの配布方法を実行
print("\n===== オリジナルの配布方法 =====")
candy_system.distribute_candies(method='original')
original_results = candy_system.analyze_results()
candy_system.visualize_results()

# 公平な配布方法実験
print("\n\n===== 公平な配布方法シミュレーション =====")
fair_system = CandyDistributionSystem()
fair_system.distribute_candies(method='fair')
fair_results = fair_system.analyze_results()
fair_system.visualize_results()

# 公平な配布と元の配布の比較
print("\n\n===== 配布方法比較 =====")
print("オリジナル方式と公平方式純利益/損失差:")
net_diff = {}
for group in ['A', 'B', 'C']:
    original_net = original_results[0][group]
    fair_net = fair_results[0][group]
    diff = fair_net - original_net
    net_diff[group] = diff
    print(f"{group}グループ: {'+'  if diff > 0 else ''}{diff:.2f}個/人")

print("\n結論:")
if net_diff['A'] < 0 and net_diff['B'] > 0 and net_diff['C'] > 0:
    print("公平な再分配により、Aグループ特権が減少し、BとCグループの状況が改善されます。")
    print("これは構造的不平等の緩和に効果的です。")
elif net_diff['A'] > 0:
    print("興味深いことに、公平な再分配ではAグループさえも利益を得られます。")
    print("これは、現行システム特定グループだけでなく全体の非効率性につながっていることを示唆しています。")

anond:20250705100755 anond:20250705112807

2025-07-04

https://qiita.com/KoichiYasuoka/items/2c7f947db259db3c5ffe#comments

すごいとしかいいようがない…

vuejsのv-forにkeyを突っ込まないとleafletのmarker にネストさせたpopupを閉じた時に変な動作をすると書こうとしたら、ものすごい記事が引っかかってしまった。

JavaScriptエミュレータを書いてる人がいたとは。

2025-06-26

AIの仕組み

大規模言語モデル(LLM)の根幹にあるのは数学的な原理です。

ここでは、その仕組みを3つの要点に絞って、数式を交えながらシンプル解説します。

1. LLMの基本目標:次の単語確率予測する

LLMの最も基本的タスクは、「ある単語の並び(文脈)が与えられたときに、次に来る単語は何か?」を確率的に予測することです。これを数式で表すと、以下のようになります

P(次のトークン | コンテキストウィンドウ)

LLMは、インターネット上のブログ記事書籍といった膨大なテキストデータを読み込みます

そして、文章中のあらゆる箇所で「次の単語」を予測するクイズを延々と解き続けます

例えば、「今日の天気は晴れです」という文章学習する場合

モデルは、P(晴れ | 今日の天気は) の確率100% (または1.0)に近づくように、内部のパラメータ(後述する重み)を少しだけ調整します。

このプロセスを何十億、何兆回と繰り返すことで、モデル単語の様々なつながり方や文法さらには世界知識に関するパターン学習していきます

学習済みのモデルに「AI未来は」と入力すると、モデルは語彙に含まれる全単語に対して、次に来る確率計算します。

...

そして、最も確率の高い「明るい」を選んだり、確率分布に従ってランダム単語を選んだりすることで、文章を生成していくのです。

2. Transformerとバックプロパゲーション

では、どのようにしてLLMは単なる単語の並びだけでなく、複雑な文脈理解するのでしょうか?

その技術が Transformerであり、その学習を支えるのが バックプロパゲーション です。

Transformerの最大の特徴は自己注意機構 (Self-Attention) です。

これは、文章中の単語同士の関連性の強さを計算し、どの単語に「注意」を向けるべきかを判断する仕組みです。

例えば、「その猫は疲れていた。なぜなら一日中ネズミを追いかけていたからだ。」という文において、「その猫」が「疲れていた」理由理解するためには、「追いかけていた」という単語との関連性が重要です。

自己注意機構は、各単語について以下の3つのベクトルを生成します。

  • Q (Query): 情報を問い合わせる側の単語(例:「その猫」)
  • K (Key): 問い合わせに応じる側の単語(文中の他の全単語
  • V (Value): Kが持つ情報の中身

そして、以下の計算概念式)によって、文脈を反映した新しい単語表現を作り出します。

Attention(Q, K, V) = softmax( (Q Kᵀ) / √(dₖ) ) V

1. Q Kᵀ: Queryと各Keyの関連度(内積)を計算します。似ている単語ほど値が大きくなります

2. / √(dₖ): 値が大きくなりすぎないように調整します(スケーリング)。

3. softmax: 計算した関連度スコアを、合計が1になる確率分布に変換します。これにより、関連性の強い単語ほど高い重みが与えられます

4. V: この重みを使って、各単語情報Value)を重み付けして足し合わせます

この結果、単語は元の意味だけでなく、「文脈の中でどのような役割果たしているか」という情報を含んだベクトルに変換されます

Transformerはこの処理を何層も積み重ねることで、非常に複雑で長期的な依存関係を捉えることができるのです。

バックプロパゲーション誤差逆伝播法)は、モデル予測と正解との「誤差」を計算し、その誤差を小さくするために、モデル内の膨大な数のパラメータ(重み)をどう調整すればよいかを教えてくれるアルゴリズムです。

1. 順伝播 (Forward Pass): 入力コンテキスト)をTransformerに通し、次の単語確率分布予測します。

2. 損失計算 (Loss Calculation): 予測した確率分布と、正解の単語とのズレ(誤差)を損失関数(例:クロスエントロピー誤差)で計算します。損失が大きいほど、予測が間違っていることを意味します。`Loss = -Σ yᵢ log(pᵢ)` (yᵢ は正解なら1, それ以外は0。pᵢ はモデル予測確率)

3. 逆伝播 (Backward Pass): この損失を、出力層から入力層に向かって逆方向に伝播させます微分連鎖律を使い、「各パラメータが最終的な損失にどれだけ貢献したか(=勾配)」を計算します。

4. パラメータ更新: この勾配に基づき、損失が小さくなる方向へ各パラメータを少しだけ更新します。

この「予測 → 誤差計算 → 勾配計算更新」というサイクルが、LLMの学習の基本です。

3. オプティマイザ

バックプロパゲーション計算された勾配を使って、具体的にどのようにパラメータ更新するかを決めるのがオプティマイザ(最適化手法)の役割です。

最も基本的な考え方は、損失という名の「谷」の底(最小値)に向かって、勾配(傾き)が最も急な方向に一歩ずつ下っていく勾配降下法 (Gradient Descent)です。

θ_new = θ_old - η ∇L

現在、最も広く使われているオプティマイザの一つが Adam です。これは、勾配降下法をより賢くしたもので、主に2つの工夫がされています

1. 慣性 (Momentum): 過去の勾配の移動平均を保持します。これにより、坂道を転がるボールのように、同じ方向に進み続ける場合は加速し、学習が停滞しにくくなります

2. 適応的な学習率 (Adaptive Learning Rate): パラメータごとに学習率を自動で調整します。頻繁に更新されるパラメータは慎重に(学習率を小さく)、あまり更新されないパラメータは大胆に(学習率を大きく)更新することで、学習効率します。

Adamのような優れたオプティマイザがあるからこそ、何十億ものパラメータを持つ巨大なLLMを、現実的時間で安定して学習させることができるのです。

まとめ

Transformer というアーキテクチャが、自己注意機構によって文脈理解し、次の単語確率 P(next token | context) を予測する。

その予測と正解の誤差を バックプロパゲーション計算し、その誤差を最小化するように Adam などのオプティマイザがモデルパラメータ効率的に更新する。

このサイクルを膨大なデータで繰り返すことで、LLMは人間のように自然言語能力を獲得していく。

2025-06-21

dorawii

公開鍵

-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEaCQbLxYJKwYBBAHaRw8BAQdAwEoXLg4O32fWNUJVUkevhDBEkHByTIinCb4s
t5a1jyC0HmRvcmF3aWkgPGRvcmF3aWkyMDBAZ21haWwuY29tPoiZBBMWCgBBFiEE
xHvHi8KVUUlYgykecDHbLm7OPkgFAmgkGy8CGwMFCQWk2AEFCwkIBwICIgIGFQoJ
CAsCBBYCAwECHgcCF4AACgkQcDHbLm7OPkh17gEA0la91qrz5lo5eUCln/SA/S7c
Vfoeb6Iu8gGbnVGcACMBANXDLaf2UqXa7wuCST+c46bX//+spAoGsTFKjRSkwS4O
uDgEaCQbLxIKKwYBBAGXVQEFAQEHQPUUyJMJAHkeG3N5UzbzRdFP9Pw9Mo22Cy58
nrJyHQl8AwEIB4h+BBgWCgAmFiEExHvHi8KVUUlYgykecDHbLm7OPkgFAmgkGy8C
GwwFCQWk2AEACgkQcDHbLm7OPkjAMwD/QRXrSFaGbbFwDpMiQaT9HDES7Dh1P9q7
0yF7JSwLsF8A/iu+LAJiJkxlyo422exO2A5GtGwu784AJBdRjSR34nIJ
=lm85
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

https://anond.hatelabo.jp/20250621175104# 
-----BEGIN PGP SIGNATURE-----

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaFZyngAKCRBwMdsubs4+
SOAdAQDyd1cd8ep8HO8vGKTAWHaBMCUEcDTou5ck13hbA488QAEAofRZPPaeN2+O
XIGLi+XhpTm8/Bk0yLsNV0zHq5MSzw8=
=Rek2
-----END PGP SIGNATURE-----

2025-06-20

dorawii

元の署名

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaFO4xwAKCRBwMdsubs4+

SItxAQCNZ8S9wY0xH3CNpNk4LtChRdDJzP6OB+64yXORJFtQSwD/cx0MDTyuCnkr

b38xvZy8AhYooIn9oFhTj63hdc7+bg8=

=4m9Y

それに対してtxAQCNZ8S9wY0xH3の部分等を入れ替えて捏造して偽物だとデマを張る馬鹿

以下元の署名検証した場合コードと実行結果の標準出力引用(Windows環境)

gpg --verify aaa.txt
gpg: Signature made 06/19/25 16:14:15 ���� (�W����)
gpg:                using EDDSA key C47BC78BC29551495883291E7031DB2E6ECE3E48
gpg: Good signature from "dorawii <dorawii200@gmail.com>" [ultimate]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

https://anond.hatelabo.jp/20250620183843 
-----BEGIN PGP SIGNATURE-----

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaFUsJAAKCRBwMdsubs4+
SN6JAQD6kuVhJ0k1WJcRjHwwPOjDqzGN15ViiiGfYjsBF3aIPAEAlz8ERS0ayaZX
bgVi0LL/WEjtsWOeoUjHxheqx6+v6gQ=
=NnKx
-----END PGP SIGNATURE-----

2025-06-19

dorawii

なんか皮肉れた気でいるのかもしれないが

gpg --edit-key dorawii200@gmail.com

trust

コマンド打っておいてないだけの話やん。お前の環境にまで干渉できねーよw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

https://anond.hatelabo.jp/20250619163134 
-----BEGIN PGP SIGNATURE-----

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaFO81gAKCRBwMdsubs4+
SGK9AQCermr1NjowAacx9yqXntUTK70SWLz1QsKRuAIVPkkakQEA5lXialYGBzXz
zJ3ByH7cN8Knjlxp3WDCJg4bDtqelQs=
=by/r
-----END PGP SIGNATURE-----

2025-06-17

anond:20250616210101

元増田です。長文の返信ありがとうアニメマンガ小説は見るけどゲーム特にノベルゲームは全くの未開拓から助かる。

(自分でやるゲームはもっぱらマイクラやrimworldのような箱庭ゲームストーリーのある物の摂取ゲーム実況を少し見る程度)

上げてくれたゲームのなかでは、原神を序盤少しだけ自分プレイしたし断片的にストーリーゲーム実況で楽しんだよ。

あと、原神公式 Youtubeチャンネルキャラの背景の掘り下げ動画キャラ制作陣へのインタビューとかも楽しんだ。

好きなのはウェンティー中国風の少女キャラ特に後者キャラ制作陣がどういう世界を目指しているかを表していると思う。

key作品アニメ化はたいてい見てるし、原神のアニメプロジェクトも楽しみ。

====

おっしゃるとおり、ゲームプレイするには小説アニメ視聴より時間も体力も必要だし、私にとって未開拓から及び腰たったけど、

中国ゲームストーリーが素晴らしいというのはよく耳にするし、また少し見てみるよ。

====

しかし、構想に10単位時間をかけているとは思わなかった。

現代アニメは高品質作品に掛かるコストに見合う収益構造が無いので時間をかけて長尺な作品を作れる環境にないのは課題だと思う。

(適量であればガチャは悪い文化ではなかった?経営者株主に誘惑に抗う長期的な視点があれば適度なバランス調整が可能なのかもしれない)

ともかく、色々教えてくれてありがとう

ログイン ユーザー登録
ようこそ ゲスト さん