はてなキーワード: UTF-8とは
世のライブサービスゲームの中でこのホヨバ3作+1ほど短いスパンで開発費をもりもり掛けた贅沢なアップデートを投下し続けているタイトルはないと思う
オタク趣味に抵抗さえなければ退屈しないしSNSを通して楽しんでる人や二次創作してる人は無数に見つかるから飽きることもない
掛け持ちだと忙しすぎるけどオタク心をよく理解してる壮大な作品作りでまじめに読んでいけば心が豊かになって情緒がジェットコースターのように日々揺り動かされることは俺の長年の経験から保証する
原神の年間の開発費は220億を超えてるとも言われ累計だと1000億は超えてるだろうし、続いて出たスタレゼンゼロもそれに引けを取らないくらいリッチなアニメ調タイトルとしてグローバルのアニメ系ゲームセールスでtop3にほぼ毎月いる
上海にはオフィスが7棟くらいあってデカい新社屋付近の区画まるごと秋葉原化しようという計画もあるくらいぶっ飛んだオタク企業
ただでさえ高いガチャゲーの利益をほとんど既存・新規作の開発体制増強や自社拡大に使ってる根っからのクリエイター気質として非上場を貫いて、ほとんどを自己資金で賄ってるという奇跡っぷり
スタレゼンゼロは各1000人、原神だと2000人超えの社員を使ってる↓ようで、国産ガチャゲーとはジャンルが違うことが分かる
参考リンク:redditリンク禁止されてるのでgoogle検索からgoogle:mihoyo_employees_increasedecrease_as_of_2024
中国にはテンセントやネットイースみたいな大資本から支えられてビジネス色強めで多産多死してる運営型ゲームが多い中で、同人オタク大学生たちが起業した会社がアニメゲー業界で上位独占し、自社IPを大事にしててここは絶対サービス終了しないって信頼が得られてるところも異質
ここまでマーケットを破壊的に支配してるやつらについていくのは最高にエキサイティングだと俺は感じてる
中の人達の顔もちゃんと見えてて先日出てたこの動画あたりが開発の様子を窺い知るのにちょうどいいんじゃないかな→ https://www.youtube.com/watch?v=anM3EvPHuZQ
どれもガチャゲーだけれどもアニメ調としてはAAAゲー品質のマルチプラットフォーム作品で、個人的にはウルトラワイドモニターつないだPCでやるのが一番おすすめ
新キャラを無凸で確保するだけに徹するなら、1タイトルあたり月平均3500円くらいの課金で全キャラ確保していけるので掛け持ちをしても低コスト高タイパに抑えることは可能
特定の最強編成をひたすら強化していくのが正解だったソシャゲ時代のゲームと違い、これらのゲームは新キャラを広く集めていったほうがゲーム性をよりストレスなく満喫できるし、ゲーマー的にもそれくらいが丁度歯ごたえのある難度になる
ただモチーフ武器や2凸くらいまで狙うとコスパよく数字が跳ね上がっていき、キャラ確保に無料石をすべて費やすとすると武器や凸を取るごとに2万ずつ払ってる計算になるので、欲のコントロールはガチャゲーらしく求められる
とはいえ石油王が有利かというと1キャラ完凸するのは20万そこらで済み、キャラ追加も6週ごとに1~2体なので古のソシャゲのように3億円課金するとかは起こり得ないし、そもそも競争要素のないソロプレイゲームつまり非ソーシャルゲームなのですべては自己満になる
ソシャゲほど戦闘コンテンツの比重が重くなく、難度も無凸で揃えてたら困らない程度と易しく、物語や探索、世界観への没入が主体で、あまり時間のかからないミニゲームの中の一つとして戦闘コンテンツがあるような感じ
ガチャシステム自体は結果が収束しやすい超低確率からの変動確率制になっていて、天井までのカウント等も次以降の限定ガチャバナーまで引き継がれるので無課金でも着実に限定キャラを増やしていくことはでき、排出タイミングもほぼ読めるので、ガチャが運ゲーではなく計画性をもって攻略可能なものになっているのも付き合いやすいポイント
実際にはそこまで悪辣なギャンブルではない確率設計なんだけど、ランダム性があるかのようなドキドキ感を演出することで健全さとドーパミン需要を両立させていて、特に原神にある掴みし明光ってシステム↓は運の悪い人だけをこっそり救済してくれる巧妙な設計で興味深い
参考リンク:redditリンク禁止されてるのでgoogle検索からgoogle:reminder_on_updated_capturing_radiance_theory
なんかさっきはてブのゲームカテゴリで「わたしたちは運ゲーを揶揄しながら、ほんとうは運ゲーが大好きで、あたたかな偶然が好きなのだ」って言ってる記事を見かけたが
それをガチャ設計上すでに高い水準で達成してヒットしてる最たるものが原神という例だと思うんだよね
プレイヤーの多くはその暖かさに気づいてなくて、短期的な感覚ですり抜けに毒づく人も多いんだけど、長期的にプレイしていると守られていることに気づく、結果として毎回絶対すり抜けるような悪運の人も確率どおり勝率50%の人と変わらない限定キャラ所持数になっている
気づいてないところがいいんだよね、本当に統計値調べまくった数字に強い人しかこの非公開ガチャ仕様の巧みさに気づかなくて、そのお陰でガチャを楽しめてる部分があるから、優良誤認ならぬ劣悪誤認みたいなもんだね
とにかく、ヒリつくマーケットに揉まれてきた人にとってホヨバースゲームの絶妙な確率設計やリアルタイムにIPが成長していく体験は最高の揺りかごだと思うんだよ
まあ趣味さえ合えばの話だけどね
COCONAのせいでフェミやべーことになってるやん。どうすんのこれ
https://search.yahoo.co.jp/realtime/search?p=cocona&aq=-1&ei=UTF-8&ifr=tp_sc
と質問とした所、
いい質問。ただ、**今回私が提示した C# コード(MemoryMappedFile + Parallel.For で CR を数える)**には、明確に一つの「このネット上の記事/リポジトリをそのままコピーした」元ネタはありません。
いくつか似たアイデアを使ってる部分と参考になる記事/ドキュメントはあるので、それらを紹介します:
---
*Microsoft ドキュメント — Memory-Mapped Files (.NET)*
([Microsoft Learn][1])
*Kieren Johnstone: 高速に MemoryMappedFile からバイト列を読む方法(StackOverflow)*
`MemoryMappedViewAccessor` を使って unsafe コードからポインタを取得し、Marshal.Copy で効率よく読み出す方法。
([Stack Overflow][2])
*Red-Gate: Sharing is Caring: Using Memory Mapped Files in .NET*
MemoryMappedFile を使ったキャッシングなどの応用。
*Stephen Cleary のブログ: Memory-Mapped Files と Overlaid Structs*
メモリマップトファイルへ構造体を重ねて(オーバーレイ)扱う方法など。
([blog.stephencleary.com][4])
---
もしよければ、**あなたのコード(CR を数えるもの)に特化した元ネタをさらに探してみます**。やりましょうか?
[1]: https://learn.microsoft.com/en-us/dotnet/standard/io/memory-mapped-files?utm_source=chatgpt.com "Memory-Mapped Files - .NET"
[2]: https://stackoverflow.com/questions/7956167/how-can-i-quickly-read-bytes-from-a-memory-mapped-file-in-net?utm_source=chatgpt.com "How can I quickly read bytes from a memory mapped file in ..."
[3]: https://www.red-gate.com/simple-talk/development/dotnet-development/sharing-caring-using-memory-mapped-files-net/?utm_source=chatgpt.com "Sharing is Caring: Using Memory Mapped Files in .NET"
[4]: https://blog.stephencleary.com/2023/09/memory-mapped-files-overlaid-structs.html?utm_source=chatgpt.com "Memory-Mapped Files and Overlaid Structs"
ChatGPT:
が、出てきて、やってくれと言ったら、こういうのが出てきた。
了解しました — 広く(英語・日本語・GitHub・ブログ・StackOverflow 等)再検索しました。結論と見つかった“近い”ソースをまとめます。
結論(要点)**
「あなたが求めている**MemoryMappedFile を使い、UTF-8 バイナリ中の `CR`(0x0D)だけを数える・マルチスレッドで分割して処理する**」という **完全一致の“元ネタ”ソースコード**は、公開された web 上のリポジトリや記事の中では見つかりませんでした(複数の検索ワード/検索対象で確認)。([hyr.mn][1])
ただし、ほぼ同種の要素(メモリマップドファイルの読み方・大きなファイルの行数カウント・バイト単位カウントを高速化する手法)は複数見つかりました。これらを組み合わせれば、先に示した実装は典型的なパターンであることが確認できます。([Microsoft Learn][2])
見つかった“近い”・参考になりそうなソース(抜粋)**
1. .NET の公式ドキュメント(MemoryMappedFile の説明) — `MemoryMappedFile` の基本と CreateViewStream / CreateViewAccessor の使い方。必須の参照。([Microsoft Learn][2])
2. 「Counting lines with C#」というブログ記事(C# で改行(CR/LF)カウントに関する実装と GitHub リンク) — 行数カウントを目的とした実装パターンがある。([hyr.mn][1])
3. StackOverflow:MemoryMappedFile から高速にバイトを読む方法(`MemoryMappedViewAccessor` / unsafe ポインタ / Marshal.Copy 等の議論) — 高速実装のヒント。([Stack Overflow][3])
4. StackOverflow/Q&A:ファイル中の LF/CR の数を求める方法に関するスレッド(`grep -c $'\r'` 等の unix 例や C# でのカウント方法の議論)。([Stack Overflow][4])
5. GitHub のサンプルリポジトリ(MemoryMappedFile のテスト/サンプル) — メモリマップドファイルを使う実装例。([GitHub][5])
もう少し深掘りできます(選択肢)**
(A) GitHub を **リポジトリ全体**(コード本体)に絞ってさらにクエリを投げ、Gist や commit レベルまで探索します(よりコストがかかるため広範検索)。
(B) ブログ・技術記事を対象に **全文一致(コード断片)検索** を行い、私が先に示した C# コードの実際の一節(たとえば `mmf.CreateViewStream(offset, size)` や `Interlocked.Add(ref totalCount, localCount)` など)を直接検索して完全一致を探します。
(C) 「オリジナルは GitHub にあるはず」と思われるなら、あなたが覚えている**リポジトリ名の断片/作者名/投稿日**などを教えていただければ、それを手がかりに探します(断片情報があるとヒット率がぐっと上がります)。
どれを優先して探しましょうか?(A: GitHub全探査 / B: コード断片で全文検索 / C: あなたからヒント提供)
※続けて深掘りする場合は、すぐにさらに広い検索を行って該当ソースを探します(そのまま実行します)。
[1]: https://hyr.mn/catching-flowers-with-a-net?utm_source=chatgpt.com "Counting lines with C# - hyr.mn"
[2]: https://learn.microsoft.com/en-us/dotnet/standard/io/memory-mapped-files?utm_source=chatgpt.com "Memory-Mapped Files - .NET"
[3]: https://stackoverflow.com/questions/7956167/how-can-i-quickly-read-bytes-from-a-memory-mapped-file-in-net?utm_source=chatgpt.com "How can I quickly read bytes from a memory mapped file in ..."
[4]: https://stackoverflow.com/questions/35182022/how-to-calculate-count-of-line-feed-or-carriage-return-characters-from-a-text-fi?utm_source=chatgpt.com "How to calculate count of line feed or carriage return ..."
[5]: https://github.com/byGeek/MemoryMappedFileTest?utm_source=chatgpt.com "test csharp code for using memory mapped file."
以下ChatGPT
自分のホームページ(自前ドメイン+自前HTML)を一度でも作って運用すると、SNS中心の“受け手”視点から、仕様・検索・配信・所有・継続の“作り手”視点に脳が切り替わる。結果、情報リテラシーは跳ね上がり、ネットのニュースや流行の見え方が根本から変わる——しかも想像以上に。
Before(作る前): Web=SNSのタイムライン。良し悪しは「バズってるか」「見やすいか」
After(作った後): Web=プロトコル+ブラウザ+HTML/CSS/JS+CDN+検索エンジン。
ページは**文書(Document)**であり、配置(IA)、意味づけ(セマンティクス)、配信(HTTP/HTTPS/HTTP/2/3)、キャッシュ戦略が気になりだす。
→ 同じ記事でも「タイトルの付け方」「hタグ構造」「画像最適化」「OGP」「サイトマップ」がまず目に入るようになる。
プラットフォーム依存の脆さを体感:規約変更やシャドウバンで露出が消える。
自サイトの資産化:ドメインに紐づくURLはリンクされ、検索に積み上がり、10年後も生きる。
POSSE(Publish (on your) Own Site, Syndicate Elsewhere):まず自分のサイトに出してから外部へ配信する習慣が身につく。
3. “好き/嫌い”から“なぜ速い・なぜ遅い”へ
Core Web Vitals(LCP/FID/CLS)や画像の遅延読み込み、フォント最適化の重要性が腹落ちする。
広告・計測タグの重さに過敏になる。読者体験を壊さないためのパフォーマンス予算という概念が生まれる。
キーワード選定は“流入ゲーム”ではなく読者の課題→コンテンツ設計に帰着。
内部リンク・パンくず・スキーマ(構造化データ)・サイトマップの意味が実務として理解できる。
“書けば伸びる”ではなく“検索意図を満たす設計が伸びる”に目が覚める。
alt、見出し階層、コントラスト比、キーボード操作、焦点管理など、見えない品質が最重要になる。
デザインは飾りではなく“読み・理解・操作”のためのユーティリティだと分かる。
たまたま当たる1記事より、更新の継続・アーカイブ性・RSSのほうが効くと実感。
コメント欄・メールフォーム・X連携よりも、ニュースレターやRSS購読者の質に価値を見出す。
ドメイン、DNS、証明書、バックアップ、法務(特商法・プライバシーポリシー)に“運用者の責任”が生まれる。
その重みが情報の信頼性を引き上げる(=他人のサイトの苦労も見えるようになる)。
トレンドは“輸入”ではなく選別になる。自分の歴史に合うものだけを採用して積層していける。
A. 最小HTML(雛形)
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>あなたの名前 | ホーム</title>
<meta name="description" content="自分のホームページ。制作物・日記・メモを置いていきます。">
<link rel="alternate" type="application/rss+xml" title="RSS" href="/feed.xml">
<meta property="og:title" content="あなたの名前 | ホーム">
<meta property="og:description" content="自分のホームページ。制作物・日記・メモ。">
<meta property="og:type" content="website">
<nav>Home / About / Posts</nav>
<footer>© 2025 あなたの名前</footer>
GitHub Pages(Jekyll標準。Rubyベース、Node不要)
Cloudflare Pages(静的ファイルを置くだけで高速CDN)
レンタルサーバー(静的HTML+SFTP/rsyncで十分)
C. ドメインの基本
DNSはA/AAAA/CAA/TXT最低限、HTTPS必須(Let’s Encryptで無料化)。
D. “最低限の品質チェック”5点
ログを読む:Search Consoleと簡易アクセスログで“本文よりメタ情報”を磨く。
「脈絡」の間違いのようだ
割と普及している
https://search.yahoo.co.jp/realtime/search?p=%E8%84%88%E7%95%A5&ei=UTF-8&ifr=tp_sc
https://profile.hatena.ne.jp/dorawii_bukuma/
はてなのサイト側で読み込まれているはずのrksトークンを生成する関数を直接叩く方法がどうしても分からず結局request処理を自分で書く方法ではなく自動でUI側の保存ボタンをクリックするという無難な方向に落ち着いた。
最初から後者の方法をとっていればもっと全然早く作れたのにというは所詮言い訳か。
とにかくスクリプトを公開しておく。
@echo off
cd /d "C:\Users\user\Documents\jsscript"
:: Nodeサーバーを別ウィンドウで起動
start /min "" node run-batch-server.js
:: Pythonサーバーを別ウィンドウで起動(hatenaserver配下)
start cmd /k "" python hatenaserver\server.py
{
"username": "",
"password": ""
}from flask import Flask, request, jsonify
import json
import os
from hatena_client import HatenaClient
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
config_path = os.path.join(os.path.dirname(__file__), 'config.json')
with open(config_path, encoding='utf-8') as f:
config = json.load(f)
@app.route('/bookmark', methods=['POST'])
def handle_bookmark():
data = request.json
url = data.get("url")
if not url:
return jsonify({"error": "Missing URL"}), 400
client = HatenaClient(config["username"], config["password"])
client.start_browser()
if not client.login():
client.quit()
return jsonify({"error": "Login failed"}), 403
success = client.add_bookmark(url)
client.quit()
return jsonify({"status": "ok" if success else "fail"})
if __name__ == "__main__":
app.run(port=12347)
// ==UserScript==
// @name 自動セルクマ送信
// @namespace tampermonkey.net/
// @version 2025-08-07
// @description try to take over the world!
// @author You
// @match anond.hatelabo.jp/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
const url = location.href;
if (!/^https:\/\/anond\.hatelabo\.jp\/\d+$/.test(url)) return;
const editLink = document.querySelector('a.edit');
if (!editLink) {
// 既に編集ページなので処理をスキップ
console.log('編集リンクが存在するため、スクリプトを終了します。');
return;
}
fetch('localhost:12347/bookmark', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ url: url })
}).then(r => console.log("通知成功")).catch(e => console.error("通知失敗", e));
})();
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250821192753# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaKb0qwAKCRBwMdsubs4+ SHfiAQDcXmTHBaZ5Zzr1KI/OxZ0xl69oevOdy1FXJYwYvsmo5AD/ZPtZiO1JgTDj m+27iymlkdzIXOIGWfC82UTr1mJ7EwU= =YoV+ -----END PGP SIGNATURE-----
これでも年収日本円換算で1,2億確約されてるなら別に構わないと思う
日本だとこれで1000万円届かないことありそう
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>Scott Wuが買収したWindsurfチームに送ったメッセージえぐいな
「我々が求める仕事の水準は極めて高い。我々はワークライフバランスを信じていない。入社するなら、オフィスで週6日、週80時間以上働くことに同意することになる」…— 久保田 雅也@Coalis (@kubotamas) August 5, 2025
軽トラのことがまた話題になってるが視野狭窄だ。端的に言って、軽トラや軽自動車が日本だけの商品と考えているのが大本の間違いだ。軽自動車はグローバル商品なんだよ。
https://b.hatena.ne.jp/entry/s/togetter.com/li/2584277
google:image:chevrolet damasで画像検索してみてくれ。見覚えのある軽バンが出てくるだろう。スズキエブリー(キャリーバン)だ。だがシボレーのバッジをつけているのだ。しかも左ハンドル。更にエンジンは韓国大宇製だ。何者だこれは。
これはスズキキャリーバンをGMがライセンス生産しているものである。
次はgoogle:image:suzuki bolanとgoogle:image:Carry Dabbaだ。
これはスズキキャリーをパキスタンで生産しているものだ。因みにパキスタンは左側通行なので右ハンドル。
この元になったキャリーは実は2スト360cc時代のもの。それに今の法規制に適合する4スト800ccEFIなんかのエンジンを載せているという異常進化を遂げている。
因みにこの生産ラインは、インドネシアキャリーがモデルチャンジする際に売却されたものと思われる。
お次はgoogle:image:piaggio porterだ。ピアッジオはベスパスクーターで有名な2輪メーカーだ。ダイハツハイゼットがそのピアッジオのエンブレムを付けてイタリアや他のEU諸国を走っている。
これはダイハツが生産した部品を現地でノックダウン生産しているものだ。外装のプラ部品や内装品は現地生産しているので見た目がかなり違う。
ついでにgoogle:image:piaggio porter ambulanceではハイゼットの救急車が見られるぞ。ゲテモノっぽいし狭苦しいのだが、道が狭い、ローマなどの歴史地区では無くてはならない車だ。
更にこのポーターのトラックの方が香港の救急車に改造されたのも見る事ができるだろう。日本→イタリア→香港と海を渡っているんだな。
日本だけ見てるとホンダが軽トラ撤退した意味は分からない。でもスズキとダイハツはこういう風に世界中で生産しているのだ。特にスズキは「グローバル軽自動車」界での巨人で、本当に世界中で生産されている。
このグローバル展開の鍵は実はアメリカの車メーカー(と韓国大宇)で、東南アジアを牙城としつつ、その勢力圏から離れる南米、中央アジア、中東ではGMやフォードがライセンス生産しているのである。
この馴れ初めは、経済が発展途上だった韓国でGMと大宇が合弁して現地ライセンス生産をしていた事に始まる。またフォードも台湾などで軽自動車のライセンス生産をしていた。
ホンダの場合は海外展開が北米に寄っている。北米は豊かなので軽トラ軽バンなどの市場とならない。
だからホンダの軽トラはモデルチェンジしたら古いモデルのラインは廃棄か部品生産用に低稼働となる。
だがスズキの場合は無駄にならないのだ。他国に売却するし技術指導もするからだ。更にライセンス生産だけじゃなくてOEMやノックダウン供給もやっている。
すると規模の経済が全然違うのだ。故に生産コストが断然有利だ。
すると、ホンダとしてはこういう条件で戦うのだったらOEM供給受けた方が良いということになる。
まあそういう訳で、軽自動車を日本だけで作っているという考えは間違い。特に軽トラ軽バンは昔からグローバル商品で、最近ではワゴンRもそれに続いている。多分、10年後の東南アジアや南米はワゴンRだらけだろう。
同時に、アメリカの車メーカー(GMとフォード)が世界中で軽自動車を作りまくっているので、アメ車メーカー=デカい車しか作れない無能と考えるのも間違いだってことだ。それは米国市場だけのことなのだ。
ステランティス会長が「EUも軽自動車規格作れ」と言ったのはこういうのを見据えてのことだ。規格が通ったら、ハンガリーにスズキの工場があるので東欧はワゴンRとエブリイだらけになると思われるよ。
そういう事を逐一説明した増田を前に投稿したが長くてあまり読まれなかった。気になる人はドーゾ→https://anond.hatelabo.jp/20250625180545
自民党中央政治大学院という、大学ではない自民党内部の組織がある模様。
こういう勉強会?をするような内部の組織を維持できるっていうのは政党として重要なのだろう。
チャンネルURLのNewkomeitoってなんなんですかね。新しいの?
チャンネル登録者が少ない。社民党の次、日本保守党より少ない。
なんでこんなに少ないんだろう。
オードリー・タンとの対談なんかは、後で見てみてもいいかな?と思う。
チームみらいの安野貴博と対談してるのは、敵に塩を送った形なんでしょうか。
チャンネルURLがOishinJpn。そのOはどこから来た?大阪のOなの?
対談者の人選が疑問。成田悠輔、箕輪厚介、堀江貴文、呂布カルマ、ひろゆき。
正直なところ、動画のサムネイルをざーと眺めて、視聴したくなるような動画はなかった。
ネットをうまく使っていると言われることも多いが、どういう点なのかまだわかっていない。
結局は、伝えるべき政策がしっかりしていないと意味がないのだろう。
動画本数は最も多い。
国会の動画は見たことないので、興味のある分野でどういう質問がされているのかは後で見てみてもいいかな。
チャンネル登録者がかなり多い。参政党の次で2位。その割に選挙の結果はぱっとしない。
登録者が多いほど当選しやすいと単純化はできないだろうが40万人以上は立派な数字。
サムネイルがYoutubeっぽい。これは他の党も見習うべきでは?
ReHacQ、PIVOT、文藝春秋PLUS、TBS CROSS DIGとか、あのあたりの雰囲気のサムネイル。
人よりかはテーマを前に出したサムネイルで、興味を引きやすい。
ワクチンには興味がある、移民には興味がある、消費税には興味があるという人をひきつける。
この点は他の党と大きく異なる。
実際それは合理的でもある。政治家なんてものは、本来は国民の代理人でしかない。
国民がやりたいこと実現したいことではあるがひとりではできないことを、代わりにやる存在。
参政党のチャンネルを見た後だと、雰囲気が違うことがよくわかる。
候補者の紹介で、名前を売りたいのはわかるが、なんのテーマに興味がある人なのか、
サムネイルに書いておいてくれないとクリックしようという気になれない。
しかし、そういう組織だった動きができていない点が、選挙の結果にも表れている。
チャンネルURLが安野貴博。個人のYoutubeチャンネルを、政党のものとして使用している?
ここもまだ、組織だった動きができていない。
対談相手は多いので、密度は維新よりも薄いがここでも、堀江貴文、呂布カルマ、ひろゆき。
対談受けてくれる人ならだれでもいいの?
AIの解説をしていてDeep Seek, Devin, Grok, Cursorなどの名前が出てくるのは他の党にはない特徴。
<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>
<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> ``` <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>