はてなキーワード: piとは
<span class="tex" data-tex-display="inline" data-tex="\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}"></span>
確認画面ではちゃんと表示されるのに投稿ボタン押しても投稿されないのどうすればええねん。
dorawiiより
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20260807204651# ・公開鍵は以下に記載 https://profile.hatena.ne.jp/dorawii/ -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCanXFqwAKCRBwMdsubs4+ SEv2AQDv5bMtD/xzF+SrlHe96FMoHErWVL8zd8xSYpmYtoi3RQEAvk0nDz+5ClWT eUqnrQ5C4F3AhSb7XTpoEi7p2X4G0Q0= =t5bd -----END PGP SIGNATURE-----
この議論は、Kapustin–Wittenの構想を一般向けに描く文章としてはかなりよくできています。特に
という中心的な経路は妥当です。Kapustin–Witten論文も、ツイストした (N=4) SYMをリーマン面上でコンパクト化し、ミラー対称性・ブレーン・線作用素から幾何学的ラングランズを説明することを主題にしています。[Kapustin–Witten原論文](https://arxiv.org/abs/hep-th/0604151)
ただし、文章の説得力を高めるために意図的に異なる水準の概念を一直線につないでおり、そのためいくつか重要な飛躍があります。
## 1.最大の問題は「(d^2=0) と (Q^2=0)」を主たる接続原理にしていること
[
H_{\mathrm{dR}}=\ker d/\operatorname{im}d,\qquad
H_Q=\ker Q/\operatorname{im}Q
]
が同じホモロジー代数の形を持つこと自体は正しいです。超対称量子力学の標準的な模型では、状態空間を (\Omega^\bullet(M))、超電荷を (d) や (d^\dagger) として実現でき、零エネルギー状態が調和形式、したがってド・ラームコホモロジーに対応します。
> ド・ラームコホモロジー → TQFT → 幾何学的ラングランズ
という直接的な系譜が出るわけではありません。
(d^2=0) は微分複体一般の構造であり、BRST演算子、導来関手、層コホモロジー、Chevalley–Eilenberg複体など、きわめて広い場所に現れます。したがって「二乗ゼロだから両者が深く結びつく」というだけでは弱い。Kapustin–Wittenを本当に支えているのは、形式的な類似よりも、
したがってド・ラームコホモロジーは「入口としての模型」ではありますが、幾何学的ラングランズを生む主要因とは言いにくいでしょう。
## 2.「ド・ラームコホモロジー」と「de Rhamモジュライ」が混同されやすい
前半の
[
H_{\mathrm{dR}}^k(M)
]
は、微分形式の複体から得られる通常のド・ラームコホモロジーです。
一方、
[
\mathcal M_{\mathrm{dR}}(G,C)
]
は、平坦な (G)-接続をパラメータ化するモジュライ空間・スタックです。この二つは関係しますが、同じ対象ではありません。後者は「ド・ラーム的」という名称を持つ非可換なモジュライ問題であり、単に通常のド・ラームコホモロジーを一般化したもの、とだけ説明すると構造を見失います。
より正確には、
[
]
という段階があります。接続 (\nabla) に対する (\nabla^2=0) から、係数付きド・ラーム複体
[
(E\otimes\Omega_C^\bullet,\nabla)
]
## 3.非可換Hodge対応は単純な「同じものの別座標」ではない
文章では
[
\mathcal M_B\leftrightarrow\mathcal M_{\mathrm{dR}}
\leftrightarrow\mathcal M_{\mathrm{Dol}}
]
を「同じ幾何学を別の座標系から見ている」としています。直観としては優れていますが、数学的には注意が必要です。
つまり、同じ台集合に名前を付け替えただけではありません。むしろ「同じ滑らかな超ケーラー空間が、異なる複素構造のもとで著しく異なる代数幾何を示す」点こそ重要です。
## 4.Atiyah–Segal型TQFTと「位相的にツイストした場の理論」は同一ではない
Atiyah型TQFTは、概略
[
Z:\mathrm{Bord}_n\to\mathrm{Vect}
]
という関手です。[Atiyahの原論文](https://www.numdam.org/item/10.1007/BF02698547.pdf)
しかし、Kapustin–Witten理論のようなゲージ理論を、そのままこの公理を厳密に満たす有限次元TQFTとみなすのは危険です。
位相的ツイストは、まず局所演算子・相関関数などの (Q)-コホモロジーを計量非依存にします。それだけで自動的に、
というAtiyah–Segal型の完全なTQFTが構成されるわけではありません。
したがって「(Q^2=0) なので理論はTQFTになる」よりも、
> (Q)-コホモロジーに制限した位相的セクターが得られ、適切な条件・境界条件・アノマリー処理のもとでTQFT的構造を示す
と述べる方が正確です。
文章では「この理論にはS双対性があり」としていますが、物理学的には強く支持された双対性である一方、一般の4次元量子場理論として数学的に完全構成・証明された定理ではありません。
また、変換されるのは単純に
[
G\leftrightarrow{}^LG
]
だけではありません。複素結合定数
[
\tau=\frac{\theta}{2\pi}+\frac{4\pi i}{g^2}
]
が (SL_2(\mathbb Z)) により変換され、位相的ツイストのパラメータも変換されます。ゲージ群の大域形、中心、離散的θ角、線作用素の許容格子も重要です。
したがって、Langlands双対群が「そのまま出てくる」という驚きは本物ですが、単なる結合定数の反転以上の精密な対応です。
## 6.幾何学的ラングランズを「点ごとの対応」に縮約している
初歩的には、
[
]
という説明で構いません。しかし、これを一対一対応と受け取ると不正確です。
[
D\text{-mod}(\operatorname{Bun}*G)
\simeq
\operatorname{IndCoh}*{\mathrm{Nilp}}
(\operatorname{LocSys}_{{}^LG})
]
という圏全体の同値です。右辺には導来スタック、特異台、nilpotent singular supportといった構造が必要で、単一の局所系から単一の固有層を取り出す図式だけでは、可約局所系や特異点を扱えません。
2024年以降公表された一連の研究は、この「非分岐・圏論的」幾何学的ラングランズ予想の証明を与えるものです。[証明プロジェクトの公式ページ](https://people.mpim-bonn.mpg.de/gaitsgde/GLC/)、[Gaitsgory–Raskin第1論文](https://arxiv.org/abs/2405.03599)
これはKapustin–Wittenの物理的説明を否定するのではなく、むしろ古典的な「固有層の対応」よりも、導来圏・スタック・境界条件を含む広い構造が本体だったことを明確にしています。
Kapustin–Wittenが直接扱うのは主として複素曲線上の幾何学的ラングランズです。数体上のガロア表現と保型表現を結ぶ古典的・数論的ラングランズ予想が、4次元ゲージ理論によってそのまま導かれたわけではありません。
などを介する別の橋が必要です。本文は「古典的ラングランズ」と「複素曲線上の幾何学的ラングランズ」を冒頭で区別していますが、結末では再び一つに溶かしてしまっています。
## 8.「全部、穴の話」では何が抜け落ちるか
最後の冗談は一般向け文章として有効ですが、実際には「穴」だけではほとんど説明できません。
中心にあるのはむしろ、
です。
「穴」はBetti的な入口にすぎず、幾何学的ラングランズの本体は、対象の集合ではなく「対象の圏と、その上に作用する演算子の対応」にあります。
## 今後の展望
第一に、古典的な「局所系対固有層」から、導来圏・モジュライスタック・特異台を含む圏論的ラングランズへ進むことです。近年の証明によって、Kapustin–Wittenのブレーンの圏という発想と、数学側の導来圏的定式化を比較できる段階に入りました。
第二に、非分岐の場合から、分岐・野性分岐、放物構造、表面演算子を含む理論への拡張です。物理側では欠陥演算子、数学側ではレベル構造やStokesデータとして現れます。
第三に、量子幾何学的ラングランズです。ツイストのパラメータと結合定数を残すと、通常の幾何学的ラングランズはより大きな量子変形の特殊点として位置づけられます。
第四に、Betti幾何学的ラングランズ、トポロジカル・フクヤ圏、因子化代数、拡張TQFTとの統合です。ここでは「多様体にベクトル空間を割り当てる」段階を超え、点・線・面・境界条件に高次圏を割り当てる考え方が中心になります。
第五に、数論への帰還です。複素幾何側の成果を、有限体上の曲線、局所ラングランズ、さらにFargues–Scholzeの幾何化などを通じて、数論的ラングランズへどう戻すかが大きな課題です。
この文章の骨格は「概説として正しいが、因果関係としては圧縮しすぎている」と評価できます。
より正確な要約は、次のようになります。
> ド・ラームコホモロジーと (Q)-コホモロジーは、ともに二乗ゼロの演算子から不変量を取り出すという共通のホモロジー代数を持つ。しかし、幾何学的ラングランズへ至る決定的な橋は、その形式的類似そのものではなく、平坦接続とHiggs束の非可換Hodge理論、Hitchin系の超ケーラー幾何、ツイストした (N=4) SYM、電磁双対性、ミラー対称性、そしてブレーンおよび線作用素の圏である。
したがって「全部、穴の話」よりも少し正確に言えば、
資産を運用しながら取り崩す計画を検討する。長いと思ったら最後だけ読めばいい。
現代ポートフォリオ理論における接点ポートフォリオを念頭に、市場には単一のリスク資産[tex:P_t]と無リスク資産[tex:Q_t]があり、[tex:P_t]は最も基礎的なモデルである幾何ブラウン運動に従うと考える。すなわち、[tex:P_t]は期待収益率[tex:\mu]、標準偏差[tex:\sigma]、標準Wiener過程[tex:W_t]を使った確率微分方程式
[tex:\frac{\mathrm{d}P_t}{P_t} = \mu\mathrm{d}t + \sigma\mathrm{d}W_t]
に従うと仮定する。これを解くと
[tex:P_t = P_0 \exp\left(\left(\mu-\frac{\sigma^2}{2}\right)t + \sigma W_t\right)]
が得られる。[tex:Q_t]は無リスク金利[tex:r_0]を使い、
[tex:\frac{\mathrm{d}Q_t}{Q_t} = r_0\mathrm{d}t]
に従い、[tex:Q_t = Q_0e^{r_0t}]という形をしている。
[tex:P_t]と[tex:Q_t]を適当な比率で保有して引き受けるリスク量を調節することを考える。保有量[tex:w^P_t, w^Q_t]を使い、ポートフォリオ[tex:X_t]を
[tex:X_t = w^P_t P_t + w^Q_t Q_t]
と構成し、保有する[tex:P_t, Q_t]の時価の比率が一定値[tex:\lambda]になるようにリバランスするとすると、
[tex:\begin{align*}&w^P_t P_t = \lambda X_t\\&w^Q_t Q_t = (1-\lambda)X_t\end{align*}]
を課すことになる。また、追加の資金投入なしにリバランスすることを考えるとself-financing条件
[tex:\mathrm{d}X_t = w^P_t\mathrm{d}P_t + w^Q_t \mathrm{d}Q_t]
[tex:\frac{\mathrm{d}X_t}{X_t} = \lambda\frac{\mathrm{d}P_t}{P_t} + (1-\lambda)\frac{\mathrm{d}P_t}{Q_t} = (\lambda\mu+(1-\lambda)r_0)\mathrm{d}t + \lambda\sigma\mathrm{d}W_t]
が得られる。つまり、[tex:X_t]は期待収益率[tex:\lambda(\mu-r_0)+r_0]、標準偏差[tex:\lambda\sigma]の幾何ブラウン運動になっている。
引き受けるリスク量を[tex:\widetilde{\sigma} = \lambda\sigma]と置き、Sharpe Ratio[tex:S = \frac{\mu-r_0}{\sigma}]を使えば、期待収益率は[tex:r_0 + S\widetilde{\sigma}]と書ける。
これで引き受けるリスク量を調節バルブにして、Sharpe Ratioを変えない範囲でリスクとリターンのバランスを取ることができる。
運用でも取り崩しでも、額面金額ではなくインフレを考慮した値を扱いたい。
非常に大雑把には無リスク金利とインフレ率は同程度*0であり、無リスク資産で全ての額面を割ってやり、無リスク資産との比率を見ることにすればインフレの影響は自動的に組み入れられると考える。
[tex:\widetilde{X}_t = \frac{X_t}{Q_t}]
と置けば、
[tex:\begin{align*}&\mathrm{d}(Q_t\widetilde{X}_t) = r_0Q_t\widetilde{X}_t\mathrm{d}t + Q_t\mathrm{d}\widetilde{X}_t = \mathrm{d}X_t\\&\frac{\mathrm{d}\widetilde{X}_t}{\widetilde{X}_t}=\frac{\mathrm{d}X_t}{X_t}-r_0\mathrm{d}t=S\widetilde{\sigma}\mathrm{d}t + \widetilde{\sigma}\mathrm{d}W_t\end{align*}]
となり、正規化後の[tex:\widetilde{X}_t]は期待収益率[tex:S\widetilde{\sigma}]、標準偏差[tex:\widetilde{\sigma}]の幾何ブラウン運動に従う確率過程になっている。
リスク資産の取り崩しを考える前に、確定利回り[tex:r]で運用できている資産[tex:R_t]を期間[tex:T]だけかけて、等速[tex:c]で全て取り崩すことを考える。
[tex:R_t]が従うべき微分方程式は
[tex:\mathrm{d}R_t = rR_t\mathrm{d}t - c\mathrm{d}t,\quad R_T = 0]
であり、これを解くと
[tex:\begin{align*}&\mathrm{d}(e^{-rt}R_t) = -ce^{-rt}\mathrm{d}t\\&e^{-rT}R_T - e^{-rt}R_t = \frac{c}{r}\left(e^{-rT}-e^{-rt}\right)\\&c = \frac{rR_t}{1-e^{-r(T-t)}} = \frac{rR_0}{1-e^{-rT}}\\&R_t = R_0\frac{1-e^{-r(T-t)}}{1-e^{-rT}}\\\end{align*}]
という形で、選ぶべき取り崩し速度[tex:c]が得られる。
次に、リスク資産を含むポートフォリオを同様に期間[tex:T]だけかけて全て取り崩すことを考える。取り崩し量[tex:\widetilde{C}_t]は前項と同じ形にとり、[tex:\widetilde{X}]と同じ構成のポートフォリオに取り崩し項を加えたものを[tex:\widetilde{Y}_t]とすると、[tex:\widetilde{Y}_t]の従うべき確率微分方程式は
[tex:\begin{align*}&\widetilde{C}_t = \frac{r\widetilde{Y}_t}{1-e^{-r(T-t)}}\\&\frac{\mathrm{d}\widetilde{Y}_t}{\widetilde{Y}_t}=S\widetilde{\sigma}\mathrm{d}t + \widetilde{\sigma}\mathrm{d}W_t - \frac{\widetilde{C}_t}{\widetilde{Y}_t}\mathrm{d}t\end{align*}]
であり、これを解けば
[tex:\begin{align*}&\frac{\mathrm{d}\widetilde{Y}_t}{\widetilde{Y}_t}=S\widetilde{\sigma}\mathrm{d}t + \widetilde{\sigma}\mathrm{d}W_t - \frac{r}{1-e^{-r(T-t)}}\mathrm{d}t\\&\mathrm{d}\log\widetilde{Y}_t = \left(S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}- \frac{r}{1-e^{-r(T-t)}}\right)\mathrm{d}t + \widetilde{\sigma}\mathrm{d}W_t\\&\log\widetilde{Y}_t = \widetilde{Y}_0 + \left(S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}\right)t + \log\frac{e^{-rt}-e^{-rT}}{1-e^{-rT}} + \widetilde{\sigma}W_t\\&\widetilde{Y}_t = \widetilde{Y}_0 \frac{1-e^{-r(T-t)}}{1-e^{-rT}} \exp\left(\left(S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}-r\right)t+\widetilde{\sigma}W_t\right)\\&\widetilde{C}_t = \frac{r\widetilde{Y}_0}{1-e^{-rT}} \exp\left(\left(S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}-r\right)t+\widetilde{\sigma}W_t\right) = \widetilde{C}_0 \exp\left(\left(S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}-r\right)t+\widetilde{\sigma}W_t\right)\\\end{align*}]
が得られる。正規化していたものを元に戻せば、この戦略での資産額の推移と取り崩し額は
[tex:\begin{align*}&Y_t = Y_0 \frac{1-e^{-r(T-t)}}{1-e^{-rT}} \exp\left(\left(S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}-r+r_0\right)t+\widetilde{\sigma}W_t\right)\\&C_t = C_0 \exp\left(\left(S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}-r+r_0\right)t+\widetilde{\sigma}W_t\right)\\\end{align*}]
となる。[tex:r]は取り崩し速度の調節に使えるパラメタであるが、[tex:r=S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}]ととり、引き受けたリスクによる超過収益分を取り崩すように設定するのが自然で、代入すれば
[tex:\begin{align*}&Y_t = Y_0 \frac{1-e^{-r(T-t)}}{1-e^{-rT}} e^{r_0t+\widetilde{\sigma}W_t}\\&C_t = C_0 e^{r_0t+\widetilde{\sigma}W_t}\\\end{align*}]
が得られる。
取り崩し額の下限[tex:I_0]を適当に決めて、取り崩し額が期間中ずっと[tex:I_t=I_0e^{r_0t}]以上になることを取り崩し成功、一度でも下回ったら失敗とみなすことにする。
[tex:r=S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2}]ととった場合にはブラウン運動の反射原理を使って簡単に計算でき、正規分布の累積密度関数
[tex:\Phi(x)=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{x}e^{-\frac{u^2}{2}}\mathrm{d}u]
を使い、取り崩しの失敗確率は
[tex:\begin{align*}&P\left[\min_{0\le t \le T}\frac{C_t}{I_t} \lt 1\right]\\&=P\left[\min_{0\le t \le T}\widetilde{\sigma}W_t \lt -\log\frac{C_0}{I_0}\right]\\&=2\Phi\left(-\frac{1}{\widetilde{\sigma}\sqrt{T}}\log\frac{C_0}{I_0}\right)\end{align*}]
と書ける。(一般の[tex:r]の場合もやや煩雑ながら計算はできる。)
これをふまえて、具体的な値を入れてみる。初期資産[tex:Y_0=\text{1億円}]、取り崩し期間[tex:T=\text{60年}]*1、運用資産のSharpe Ratio [tex:S=0.7]*2、許容する年間資産変動の標準偏差[tex:\widetilde{\sigma}=\text{10%}]と設定すると、実効取り崩し率[tex:r]、初期取り崩し額[tex:C_0]は
[tex:\begin{align*}&r=S\widetilde{\sigma} -\frac{\widetilde{\sigma}^2}{2} = \text{6.5%}\\&C_0=\frac{rY_0}{1-e^{-rT}}=\text{663万円}\end{align*}]
であり、取り崩しの下限値を[tex:I_0=\text{300万円}]くらいにとると、失敗確率は
[tex:2\Phi\left(-\frac{1}{\widetilde{\sigma}\sqrt{T}}\log\frac{C_0}{I_0}\right) = \text{30.6%}]
ほどとなる。
つまり、今回の設定のもとでは資産1億円を60年かけて運用しつつ物価スライドしながら取り崩す*3とき、中央値が過剰に目減りしないくらいの取り崩しをするなら年額663万円ほど取り崩せるが、30%ほどの確率で取り崩し額は300万円以下まで下がるタイミングがある。
この設定のもとでは資産1億円でのFIREはやや厳しい。許容リスクを増やしたり、運用成績の想定を楽観的にしたり、好調時に資金をプールしておいたりなど、調節できる部分は多いが、根本的なとこで初期資産が足りていないように思う。
無リスク資産のみの運用で下限値の取り崩しを継続しようとする場合は300万×60年=1.8億円必要で、初期資産がそれに届いていない場合は、運用益で下限値分までカバーすることになる。
FIREに臨むにあたり、残りの人生で必要な生活費総額の下限値分くらいの資金を用意し、運用益はあくまで+αのものとするくらいが健全なのではないか。
本稿とは設定も戦略も異なるが、有名なトリニティスタディの場合、初期資産の4%を定額取り崩しをし、30年運用する想定で研究していたが、そもそも4%での取り崩しなら25年はもつのであり、初期資産が運用期間の大部分をカバーできる状態になっていることも書き添えておく。
数値を変えて計算してみたい人向けにスプレッドシートに式を書いて置いておく。使うときは編集権限のリクエストなどはせず、自分のところに[ファイル] → [コピーを作成]してから編集してほしい: 計算表。
*0: 日本では例外的に長期に渡って無リスク金利がインフレ率より低いが、他の多くの社会では政策金利を通してインフレ率と同程度以上に誘導されている。
*1: 40歳時にFIREし、最長で100歳まで生きる想定。
企業研究者が大学PIポストへ続々登用される現状はポスドククライシスと呼んでもいいのではないか。
私はAI系の任期制職(以下簡単のためにポスドクと書く)で働いて3年目であり、年間600万円ほどで主に研究室のプロジェクトに従事している。
業務割合はPIのプロジェクト仕事(研究):その他仕事:自分の研究=5:2:3くらいであり、将来のアカデミアのポストのため非常勤講師もしてきた。
この春、何人かの企業研究者の方の大学への准教授・教授職の就任が同時に観測された。
もちろん、各々の方は業績的にも学術界活動的にも素晴らしいし、それに異論はないのだが、あまりにもこのような現象は自分のようなポスドクにとって報われないと思っている。
ご存知の通り、情報系、特にAIはアカデミアと産業界の賃金格差が凄まじい(軽く2倍はあると思う)。なので、アカデミアではポスドク不足が嘆かれて久しいのだが、その中でも自分のようなアカデミアに残って研究がしたい少数の人が、長年労働力になって下支えしてきた。
事実、自分の博士の同期で卒業後もアカデミアに残った人は一人もいない、前後を見てもほぼいない。
同期や後輩が自分より圧倒的に良い給料をもらって資産形成しているのを横目に、歯を食いしばって将来のために耐えているのが今のAI系ポスドクの立場だと思う。
それがどうだろう。非常勤講師に時間を割き、企業の研究費と比較したら雀の涙のような額の科研費若手で研究を行い、貧弱な計算リソースでできる研究テーマを絞り出し、小さい研究グループや貧弱な組織力、バックオフィス機能の不足によって生じる不可解なほどの量の事務作業。。。そんな私たちより圧倒的に良い待遇で生活・研究して業績を出してきた(僻みが多分に含まれるが)企業人研究者が私たちの頭を飛び越して大学のPIに就いてしまう。。。
こんな現状で卒業後アカデミアを選ぶAI系の博士がいるだろうか<いやいない>。実際、私はもうアカデミアを見限ったし、民間への転職活動を始めている。将来いい感じに業績が積み上がったらぼちぼちJrecinを眺めてPI職へ応募するつもりだ。
この傾向は今後どんどん加速するだろうが、そうなったら研究室運営の泥臭いところを担うのは一体誰なのか?
業績などをフラットに考慮すると優秀な企業人が今の時代上に来るのも分かるし、AI研究は今や産業界がリードしていることを考慮すると、アカデミアー企業間の人材の流動性は重要だと思うのだが、何か救済がないとしんどいですよ
単位変換
光速 = 299792458m/s =9.46 x 10e15 m/year
ご飯 100g = コロッケ小=パン1枚 = 150kcal
銀1匁 = 70文
天保通宝最終レート.008円
1里 =3927.2727m = 36丁
1間 = 1.81818m = 6尺
1尺 = .30303m = 10寸
1寸 = .030303m
1斗 = 18L = 10升
1升= 1.8L = 10合
1合 = .18L
1m = 39.37inch = 3.2808feet = .00062137119miles
1inch = .0254m
1feet = .3048m = 12inch
1yard = .9144m = 3feet
1hectare = 2.47105acre = 10,000m2 = 1町歩
1acre = 4046.86m2
東京ドーム面積 = 4.6755ha = 122 x 122m x 3.14
1L = 1,000cm3 = .2642 US gallon = .22 UK gallon = 1kg(water) = 2.20462pounds
US gallon = 3.785L
UK gallon = 4.5L
1pound = 453.5929g
ling yi er san si wu liu qi ba jiu shi bai qian wan
lim h->0 (1+h)1/h = e = 2.7182818284 = 1.64872127 x 1.64872127
ln2 = .69314718
ln 3 = 1.09861228866
ln 4 = 1.38629 = 2 ln2
1/e = (e)-1 = .3678794411
(e)2 = 7.38905609
pi/ 2 = 1.57079
2 = 1.259921 x 1.259921 x 1.259921 = 1.414213562 x 1.414213562
3 = 1.44224957 x 1.44224757 x 1.44224957 = 1.7320508 x 1.7320508
4 = 1.5874010519 x 1.5874010519 x 1.5874010519
5 = 1.7099759x 1.7099759 x 1.7099759 = 2.2360679 x 2.236079
11 = 3.31662479 x 3.31662479 ← 修正: 旧「3.1662479 x 3.31662479」
13 = 3.6055512751 x 3.605551275
golden ratio = 1 : 1.6180339 = (1 + (5)1/2) / 2
1 + tan2 x = 1 / cos2 x
sphere volume = 4/3 pi r3, surface area = 4 pi r 2
cone volume = 1/3 pi r2 H, surface area = pi r (r + L) = pi r2 + pi r L
日本の川長い順
1信濃川367
2利根川322
3石狩川268
4天塩川256
5北上川249
6阿武隈川239
7最上川229
7木曽川229
1富士山3776
2北岳3193
3奥穗高岳3190
3間ノ岳3190
5槍ヶ岳3180
6悪沢岳3141
7赤石岳3120
9塩見岳3052
10仙丈ヶ岳3033
11乗鞍岳3026
12立山3015
13聖岳3013
14剱岳2999
15水晶岳2986
16甲斐駒ヶ岳2967
17木曽駒ヶ岳2956
18白馬岳2932
19薬師岳2926
20鷲羽岳2924
21赤岳2899
22笠ヶ岳2897
23鹿島槍ヶ岳2889
24空木岳2864
25常念岳2857
26黒部五郎岳2840
26鳳凰山2840
28五竜岳2814
29白山2702
30金峰山2599
31光岳2591
32日光白根山2578
33浅間山2568
34蓼科山2530
35男体山2486
36甲武信ヶ岳2475
37火打山2462
38焼岳2455
39妙高山2454
40燧ヶ岳2356
41四阿山2354
42高妻山2353
43大雪山2291
44鳥海山2236
45瑞牆山2230
46至仏山2228
47恵那山2191
48草津白根山2171
49武尊山2158
50苗場山2145
51皇海山2144
52トムラウシ2141
52平ヶ岳2141
55飯豊山2105
56十勝岳2077
57大菩薩嶺2057
58幌尻岳2052
0日本橋2里
1品川2里半
2川崎2里半
3神奈川1里9丁
4保土ヶ谷2里9丁
5戸塚1里30丁
6藤沢3里半
7平塚27丁
8大磯4里
9小田原4里8丁
10箱根3里28丁
11三島1里半
12沼津1里半
13原3里6丁
14吉原2里30丁
15蒲原1里
16由比2里12丁
17興津1里3丁
18江尻2里29丁
19府中1里半
20丸子1里29丁
21岡部1里29丁
22藤枝2里8丁
23島田1里
24金谷1里24丁
25日坂1里19丁
26掛川2里16丁
27袋井1里半
28見附4里7丁
29浜松2里30丁
30舞阪1里
31新居1里24丁
32白須賀2里16丁
33二川1里20丁
34吉田2里22丁
35御油16丁
36赤坂2里9丁
37藤川1里25丁
38岡崎3里30丁
39池鯉鮒2里30丁
40鳴海1里半
41宮7里
42桑名3里8丁
43四日市2里27丁
44石薬師27丁
45庄野2里
46亀山1里半
47関1里24丁
48坂下2里半
49土山2里25丁
50水口3里12丁
51石部2里25丁
52草津3里24丁
53大津3里
54三条大橋
1368 174応安8
1379 176康暦3
1381 177永徳4
1384 178至徳4
1387 179嘉慶3
1389 180康応2
1390 181明徳5
1394 182応永35
1428 183正長2
1429 184永享13
1441 185嘉吉4
1444 186文安6
1449 187宝徳4
1452 188享徳4
1455 189康正3
1457 190長禄4(5)
1461 191寛正7(6)
1466 192文正2
1467 193応仁3
1469 194文明19
1487 195長享3
1489 196延徳4
1492 197明応10
1501 198文亀4
1504 199永正18
1521 200大永8
1528 201享禄5
1555 203弘治4
1558 204永禄13
1570 205元亀4
1593 207文禄5(4)
1645 211正保5(4)
1648 212慶安5
1652 213承応4
1655 214明暦4
1658 215万治4
1661 216寛文13
1673 217延宝9
1684 219貞享5
1704 221宝永8
1741 225寛保4
1801 233享和4
1804 234文化15
1818 235文政13(14)
1845 237弘化5(4)
1848 238嘉永7(8)
1855 239安政7(6)
5億年前 カンブリア紀
7.4万年前 eruption of mount Toba ← 修正: 旧「7万年前」
2570 BC 縄文時代 pyramid of Khufu constructed, 231 x 231 x height probably 146.5m, 138.5m now ← 修正: 旧「163.34m, 147m now」
79 eruption of mount Vesuvius
113 Trajan's Column
199 呂布眠
6th century 古墳時代 eruption of 榛名山
794 平安京
1499 明応8年 Pieta by Michelangelo ← 修正: 旧「1500 明応9年」
1505 永正2年 Mona Lisa by Leonardo da Vinci
1582 天正10年 October 4->15 Gregorian calendar
1616 元和2年 William Shakespeare died
1653 承応2年 Bentheim castle by Jacob van Ruisdael
1666 寛文7年 great fire of London
1687 貞享4年 Philosophiae Naturalis Principia Mathematica by Isaac Newton
1689 元禄2年 Montesquieu born
1707 宝永4年 eruption of 富士山, Carl Linnaeus born
1768 明和5年 Mars and Venus surprised by Vulcan, by Lewis Jean Francois Lagrenee the elder, 258 years ago
1776 安永5年 United states declaration of independence
1780 安永9年 Jean Dominique Ingres born
1789 寛政元年 French revolution
1797 寛政9年 Franz Schubert born
1814 文化11年 Jean Francois Millet born
1826-1827 文政9-10年 oldest photograph 'View from the Window at Le Gras' by Nicephore Niepce ← 修正: 旧「1825 'Boy and his horse'」
1833 天保3年 東海道五十三次歌川広重 北斎漫画葛飾北斎
1863 文久3年 emancipation proclamation
1866 Romain Rolland born
1867 Jean Dominique Ingres died, 夏目漱石生 ← 修正: 「1875 Jean Dominique Ingres died」の行を削除
1874 Lucy Maud Montgomery born
1875 高橋由一 ← 修正: Ingres died(誤記)を削除
1885 Adventures of Huckleberry Finn by Mark Twain
1888 十五少年漂流記 by Jules Verne, eruption of 磐梯山
1890 Harland David Sanders born
1898 The war of the worlds by H. G. Wells, Lewis Carroll died, 井伏鱒二生 四芸術 by Alphonse Mucha
1903 John von Neumann born
1904 Salvador Dali born
1908 Anne of Green Gables by L. M. Montgomery
1908 松本清張生
1919 Auguste Renoir died
1923 関東大震災
1969 moon landing, 57 years ago
1970 三島由紀夫眠45才
1980 Harland David Sanders died, 90 years old
1988 辻井伸行生
1989 Salvador Dali 手塚治虫昭和天皇眠GBテトリス発売
1993 Audrey Hepburn 井伏鱒二眠
1995 阪神淡路大震災
2197.1 s
00:36:37.1
start 13:35:06
stop 14:11:43
4.825 t/s
10601 types
2.713 c/s
type - char
4640
dorawiiより
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20260106075207# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaVzeSgAKCRBwMdsubs4+ SFHdAQCKBDYKFAnMKm5kWVBawvNuzCHqSKqjKdmU1Ns/ZkthmQEAngI7W4MxtSPt WVXUs9j3D7z5LO+pI/uPmA5XJPHBjww= =2BuE -----END PGP SIGNATURE-----
つまりそれはお前らが大嫌いだった新しいものを否定する保守的な親そのものだな
情報技術者なら誰しもが認める事として現在の情報技術界はLinuxの知識が事実上の必修科目になっている
その影響によって世界中のSTEM・ICT教育はLinuxを学校教育へ導入する需要が高くなった。その結果が安価に導入でき学校教育グループウェアGoogle Classroomが製品パッケージとして存在するChromeOSだったんだよ
しかもより先進的なSTEM・ICT教育を導入する日本の有名私立や進学校(例えば灘や開成)、情報学科学部を持つ高校・高専・大学、ラズパイの発祥の地である英国、そして米国はラズパイを義務教育の中に導入した
更にNASAと連携したラズパイの学習プロジェクト「Astro Pi」は国際宇宙ステーションへ常駐する宇宙飛行士によって子供たちがコーディングしたプログラムを実行して宇宙実験するという非常に野心的な学習プロジェクトが行われている
これらの結果を知って確実に来るであろう未来を想定するならば、今後10年以内に裕福な家庭や先進的なSTEM・ICT教育を導入する学校出身者であればあるほどLinuxを学んで社会に出てくるという確定的未来だ
世界各国地域でシェアは違うけれど、それが貧困家庭であってもSTEM・ICT教育で投入される学習コンピューターの6割〜8割がChromeOSであることを踏まえると、低い割合を想定しても新社会人の2人に1人はLinuxで学んで社会に出てくるんだよ
大卒が約半数となった日本で、我が子により良い教育を施したいと考えるのであれば、このSTEM・ICT教育の大激変である「WindowsやMacではなくLinuxを学ぶ」という動きは子供の将来を考える親ならば察知していなければならず、子供の需要に応えるのが親の努めならば親こそがLinuxを学んでおく必要があるんだよ
気持ちはわかる。発端の夫を倒したい元増田で夫も言及しているように「一般目線で考えるならばWindows」であることは間違いない。しかしその一般目線には前提として言葉を1つ追加する必要がある
それは「現在の親世代・経験豊富な社会人世代の一般目線ならばWindows」という形だ。誰に聞いても間違いがない。親世代・経験豊富な社会人世代はリアルタイムの今まさに仕事でWindowsを使っている。プログラマーやクリエイターならばMacという選択もあるだろう
しかし既に我々は知った。現行のSTEM・ICT教育は「WindowsやMacではなくLinuxを学ぶ」であることを。それはつまり「未来の社会の中心となっていく子供世代の一般目線ではLinux」という時代が到来しつつあり、更に言えば未来の日本をリードしていくであろう先進的なSTEM・ICT教育を受けている裕福な上流層の子供の一般目線は輪をかけてLinuxになっていくんだ
「Windowsを学ぶ方が良いだろう」「学校教育で導入されるタブレットはiPadの方が安定していて高性能だ」
大人ならそう考える。しかしそれは現在のSTEM・ICT教育がどうなっていて未来の人材がどのような一般目線を持っているかを想定しないという、今自分の生活が大事で革新性に拒否感を示す保守的な大人ならではの直感でしかないんだ
「WindowsやMacではなくLinuxを学ぶ」という現在のSTEM・ICT教育から予測できる確実に訪れる未来へ先行投資できるか否か。この話題はそれを機敏に察知できるかのリトマス試験紙としての側面を持っていた深い話題なのだよ
欧米や裕福な日本の家庭はLinuxを、ラズパイを教育に導入している。それを知った我々がどうしなければならないかなんて言うまでもないだろう
かわいそうなやつw
←誰もそんな話してないしお前がいまさっき勝手に言い出したこと。そんな話してない。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250929164256# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaNo4gwAKCRBwMdsubs4+ SNdaAQDJc1CodyDqLMzPk/N+3kBiHKOyvV7UW8689p3WzzE6CQD/VDyKkqUMmGlf FTGGCZqEqS+n+9usFizaGsWiKyKJVAg= =0+pI -----END PGP SIGNATURE-----
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250910175736# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaME9hAAKCRBwMdsubs4+ SODIAQDsNWSs+N4fPbJh8Xvw1ZhwAcVf9loeuL3Wk1jxIi6wHAEAtoh90st8dn9+ kOnYpAZjsz5i3d3yUEMPdZbCjdb+RA8= =U+Pi -----END PGP SIGNATURE-----
はてなブックマークをするときのリクエストの実体がわからない。
とりあえず保存するボタンを押した瞬間に作られるリクエストの送信先urlをurl:/api/で絞ったものの一覧がこれ。
どれ見てもコメントを格納してるっぽいリクエストが見つからない。
https://b.hatena.ne.jp/api/internal/bookmarks/shares_and_clicks
b.hatena.ne.jp/api/related_entries/https%3A%2F%2Fanond.hatelabo.jp%2F20250809150325
b.hatena.ne.jp/api/my/bookmark/https%3A%2F%2Fanond.hatelabo.jp%2F20250809150325
b.hatena.ne.jp/api/my/recommended_tags?url=https%3A%2F%2Fanond.hatelabo.jp%2F20250809150325
b.hatena.ne.jp/api/entry/https%3A%2F%2Fanond.hatelabo.jp%2F20250809150325/editing_ability
b.hatena.ne.jp/api/entry/https%3A%2F%2Fanond.hatelabo.jp%2F20250809150325/editing_ability
b.hatena.ne.jp/api/my/ignore_users?limit=10000
b.hatena.ne.jp/api/my/following_bookmarks
b.hatena.ne.jp/api/my/external/share_config
o148425.ingest.sentry.io/api/4504286861066240/envelope/?sentry_key=cbbc3ab77bbb42fa8c09ca0f1b7dc3cb&sentry_version=7&sentry_client=sentry.javascript.browser%2F7.47.0
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250809200738# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaJcr+wAKCRBwMdsubs4+ SLTYAP4pb8fMaDacP69j8aAlqgmTDqimUmU6I6bvh/yREFo7+AEAq2ibhp1t4MwK a+5esw/9FyuZavaPZ02HmmHMmLey+Aw= =kEhJ -----END PGP SIGNATURE-----
てんぷら @TEMPUrA_y
よく人生において音ゲーが何の役に立つの?って言う人がいるけど正しい努力は報われるという成功体験は人生において重要だと思うのでそれが音ゲーによって得られるならば大いに役立つと言えると思う
https://x.com/TEMPUrA_y/status/1788125549988360556?t=WgmrtJ9AYHKNVP4HmzlEDw&s=19
てんぷら @TEMPUrA_y
それが音ゲーである必要はないが、努力の結果が数値としてはっきり映し出される音ゲーは他に比べて努力が成功したと実感しやすいので成功体験を得るには向いていると思う
1曲約2分の短い勝負をする音ゲーの性質上PDCAサイクルを回すのにも向いている
https://x.com/TEMPUrA_y/status/1788127138362818583?t=GrF2KbjO_GrP5xVfVkIagA&s=19
のん @non_otoge
これなんだよな〜〜〜〜〜
僕は音ゲーで初めて「努力のコツ」を知って、そこから誇張抜きで人生変わった
どんくらい変わったかって言うと32×32のモノクロドット絵がフルHDのカラー動画になった感じ これも誇張抜きね
ただ、みんながみんなこれをできる訳じゃない でも選択肢があった方が良い(続く)
https://x.com/non_otoge/status/1788131676562006257?t=ja3xeFfSG-SS1qwfyq2N-A&s=19
しそごはん用研究者(薬学部講師PI)@ONODA_in_Onodac
大学教員やっていると、「この子は本当に努力の仕方がわからないんだな」って思う大学生に出会うことが多々あるんだけど、そういう学生には、ここ最近のワールドトリガーを読んでって言いたい。
努力するには、目標を正しく「刻んで」、「期限」を設けるんだ。
https://x.com/ONODA_in_Onodac/status/1864606915696972059?t=NCtRNdKGl0Pf7VR3sXuvLA&s=19
Kuroly @Kuroly7
何かに本気で取り組んだり挫折した経験がなく、現実との折り合いをつけ成長する機会を逃すと、根拠のない自信に満ち溢れて自負と現実のギャップが取り返しのつかないことになる『幼児的万能感』ってやつ
https://x.com/Kuroly7/status/1930108365763387528?t=3Q3QNlkA_LIAwcPawaewBQ&s=19
こういうの見るたびに、努力したことない自分が悲しくなってくる。
そもそも先延ばし癖があるせいで習慣化できないのと、習慣化に成功してもPDCAサイクルを回すコツがわからない。
rieru£ @r_02er
偏差値60台の高校、"高校受験までノー勉でなんとかなってしまったせいで勉強習慣が身についていない層"が存在する
https://x.com/r_02er/status/1938583747634643386?t=3jIDbDK214q20eYPlLxiHg&s=19
これのさらに酷い版で、大学受験も推薦でなんとかなってしまった故に、全く努力の習慣が身についていない。
なんというかなあ、はてな界で言うなら、黄金頭氏が一番自分の人生に近いものがあるかもしれない。
https://goldhead.hatenablog.com/entry/2018/01/18/215038
ただ、一瞬、一瞬。運良く持って生まれた何らかの才気の単発的な発現。わかりやすく言えば「その場しのぎ」。こればかりがおれを救い、そして苦しめる。人生の底、社会の底に着くところまで行かせない。安定飛行させるわけでもなく、超低空飛行を続ける。賽の河原で石を積んでは、すぐさま鬼に崩される。積むのはおれ、崩すのもおれ。いったいぜんたい、おれは詰んでいる。おれにはその詰将棋は解けないし、何手詰めかもわかりゃあしない。でも、詰将棋の本に載ってしまっている。それはわかる。わかっていながら、ここまで生きてきてしまった。死ぬのはたやすい。それでも死ぬのは怖い。八方塞がりだ。八方塞がって、上も下もない。タイマーが切れるまで、アルコールで精神を安寧にしておきたい。アルコールを買う金はせめてほしい。それだけだ。それだけなんだ。
https://goldhead.hatenablog.com/entry/2019/11/25/201810
努力してなにかを得る? はて。勉強して資格に合格する? さて。なんなんだろうかね、それは。なにが人間をそれに向かって起動させて、どういった心境の持続力があってそれを続け、達成したらどんな気持ちになるのかしらん。
追記(2025/07/09)
ブクマ結構ついてる。ありがとうございます。
コメントを見て、なぜ努力できるようになりたいか考えてみたんだけど、
B : 対人ゲームのメタを話してる人たちや、プログラミングの高度な話をしている人たち、あとKubecon(Kubernetesっていうツールのイベントらしい)みたいな技術イベントなど、努力して何かしらを身につけた人同士がやってるコミュニティに憧れを感じたから。
って感じかなあ。
<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>