
はてなキーワード:メモ化とは
僕は昨日、午前6時17分に目覚めた。
目覚ましは2種類、アナログ秒針音と周波数の微妙に異なる合成トーンを重ねたものを使う。
起床後の15分間は「視覚のデチューン」ルーチンとして照明を極端に低くし、網膜の適応曲線を意図的に遅延させることで認知の鮮鋭化を増幅する。
朝食は厳密にタンパク質比0.42、炭水化物比0.29、脂質比0.29を狙ったオートミール+卵白+ギリシャヨーグルトで、計量は0.1g単位。コーヒーはブリュワー温度を93.2℃に保つ。
僕の習慣は決して儀式ではなく、情報エントロピーを最小化して日常的なノイズを排するための有限状態機械だと説明する。
ルームメイトが朝から実験用ドライバーでガタガタやっているので、僕は中断せずに黒板の前に立ち、昨日考えていた超弦理論のある断片をノートに落とす作業をした。
今回は徹底的に抽象化した視座から入る。従来の超弦理論的場の位相空間を「1-対象の∞-圏」と見なし、そのモノイド圏的作用を導くことで、従来のモジュライ空間の位相不変量がホモトピー圏論のスペクトル的コホモロジーに帰着するという仮説を立てた。
より具体的には、ラングランズ対応の圏論的アナロジーを用いて、ゲージ群の表現環が導くモチーフ(motive)の圏と、弦の世界面上のファイバー付き代数的スタックの圏とを「導来圏の間の高次同値(a weak equivalence in the (∞,2)-categoricalsense)」で結びつける試みだ。
ここで新奇なのは、通常のスペクトル系列ではなく「階層的スペクトル列(a nested spectral sequence indexedby ordinal-type filtrationsbeyond ω)」を導入して、閉じた遷移の非可換共鳴が量子補正式にどう寄与するかを解析する点である。
ウィッテンでも一瞬眉をひそめるだろうが、それは彼の専門領域を超えた命題の述語論的再編成が含まれているためだ(注:単なる挑発ではなく、証明可能性のための新たな可換図式を準備している)。
昼過ぎ、僕は隣人とほんの短いやり取りをした。彼女は僕のキッチンを通るたびに植物の世話に関する助言を求めるが、僕は葉緑体の光合成効率を説明する際、ついヘテロトロフ的比喩を避けて遺伝子発現の確率過程モデルを持ち出してしまう。
彼女はいつも「もう少し軽い説明はないの?」と呆れるが、僕にとっては現象の最少記述が倫理的義務だ。
午後は友人二人と対局的に遊ぶ約束があって、夕方からは彼らとLANセッションを組んだ。
僕はゲームに対しては容赦がない。昨日はまずThe Legend of Zelda:Breath of the Wildでカジュアルな探索をした。
BotWは開発を担当したNintendo EPDが2017年3月3日にWii UとNintendo Switch向けにリリースした作品で、そのオープンワールド設計が探索と化学的相互作用に重きを置いている点が好きだ(発売日と開発元は参照)。
その後、難度調整のためにFromSoftwareの古典的タイトル群について雑談になり、初代Dark Soulsが2011年にリリースされ、設計哲学として「挑戦することで得られる学習曲線」をゲームメカニクスに組み込んだことを再確認した(初代の年は参照)。
夜遅く、友人たちがスーパーヒーロー系の話題を持ち出したので、僕はInsomniacが手掛けたMarvel'sSpider-Manの2018年9月7日発売という事実を引き合いに、ゲームデザインにおけるナラティブとパルス感(ゲームプレイのテンポ)について議論した(発売日は参照)。
ここで重要なのは、ゲームを語るときに物理学の比喩を使わないという僕のルールだ。
ゲームの設計原理は計算的複雑性、ユーザーインタラクションのフィードバックループ、トークン経済(ゲーム内資源の流通)など、情報理論と計算モデルで語るべきであり、物理のアナロジーは曖昧さを持ち込むだけだ。
作者インタビュー、収録順、初出掲載誌、再録時の微小な台詞差異まで注視する癖がある。
昨日はあるヴィンテージの単行本でトーンの変遷を確認し、再版時にトーンカーブが調整された箇所が物語の解釈に如何に影響するかを論じた。
これらは一般的にはオタクにしか響かない情報だが、テクスト解釈の厳密さという点で、僕の思考様式と親和する。
僕の習慣はゲームのプレイにも現れる。セーブは複数スロットを使い、各スロットに「探索」「戦闘」「実験」のタグを人為的に与えておく。
そうすることでメタ的な比較実験が可能になり、ゲーム内意思決定の条件付き確率分布を再現的に評価できる。
友人はこれを無駄と言うが、僕にとってはルーチンと実験設計が同義だ。
夜中、帰宅した後にさらに2時間、論文の草案を書き直した。書き直しは僕の儀式の一部で、ペン先の角度、フォントのカーニング、段落の「情報密度」を計測し、不要語を削ぎ落とす作業だ。
寝る前の最後の行動は、ブラックボックス化した思考経路をメモ化しておくことで、翌朝の「継続的洞察再現性」を保証すること。
結局僕は午前2時3分に就寝した。昨日は量子的洞察の可能性と、ゲームとコミックにおける情報理論的語法の交差点を追求した一日であり、そうした知的遊戯が僕の精神の整列をもたらす。
次に実証すべきは、導来圏間の高次同型によって生じるゲージ的不確定性がディラック構造の代数的再構成に与える位相的寄与だ。
https://b.hatena.ne.jp/entry/s/frantic.im/remix-3/
機能が存在すると "使い倒さないといけない" or "使い倒さないなら一流でない" と考える "謎の集団" が存在して、そういう声に流されてるからv18以降の機能追加に拒否反応を示してるんじゃないの
あるいは "ベストプラクティスは義務である" みたいな謎の強迫観念を持っているとか…
Next.jsを勧めるわけではない(自分は仕事ではNext.js、プライベートはRemixv2ユーザーである)が、Next.jsを使用した上でもv18以降の機能の使用はほぼ全てオプションだよ
ただ、Reactの開発がNext.jsに毒されていて本筋から外れている感じは否定しない
ここから来る害があるとしたら、非Next.jsユーザーからするとv18以降のReactは特に発展していないということだろう
-----
httpxが遅い件を確認してみた
https://b.hatena.ne.jp/entry/s/gfx.hatenablog.com/entry/2025/09/27/134421
プロファイルを取ってみると遅いのはconnection_pool.pyの_assign_requests_to_connections
302行目以下のループが曲者で、コネクションが割り当てられていないリクエスト数*生きてるコネクション数のN*Mループがあるのでリクエストが滞留してくると著しく遅くなる
httpx.AsyncClientにhttpx.Limits(max_keepalive_connections=1)を設定することで劇的に早くなるが、これはmax_connections=無限なのでやめた方がいいかなと思う
(httpx.Limitsの引数で省略された値は無限扱いであり、max_connectionss=無限となることから、全てのリクエストに無制限にコネクションを割り当てることでN*Mの片方がなくなって速いってこと。余談だがこのオプションもあまりいいものではないね)
一気にリクエストを投げつける使い方をしないと体感しにくいのではないかと思う
(その点では指摘者のユースケースはぴたりとハマってる気がするねw)
まあ最近はAI(というかLLMや基盤モデル)のせいでデータセンターの需要がでかいから、そういうところでのSWE需要は増えてるのかもなと思う。
金融は本来はそういうのの塊なんだろうけど、日本はみずほみたいに勘定系システムで政治的に揉めまくってるとかいう感じだからなあ。
俺はSWE的な意味ではプログラミング全くできないけど、昔競プロやってみたときに学んだ計算量やデータ構造、メモ化みたいなメモリと計算量の関係なんかのイメージは役には立っている。
プログラミング特化の人たちは逆に応用数学的・物理学的な感覚が弱すぎるなって感じるけど、それは脳みそが違うから仕方がないことで、お互いちょっとずつ歩み寄るくらいがせいぜいなんじゃないの?って思うわ。
Haskell を書いてるわけではないんだけどHaskell でメモ化したい関数ってどうするんだろう
という条件なので、キャッシュを取って、キャッシュになければ計算して返すクラスを作った
純粋関数型でこれをやろうとするとモナドになったりして面倒臭そう
しかしながら
と思ったのですがどうなんでしょう。
まじな話をすると、N予備校のプログラミング入門コースやるのがオススメ。
一日8時間勉強時間があるなら、だいたい一ヶ月で終わる内容。
月額1000円だけどしっかり勉強すれば一ヶ月の無料期間中に終わると思う。
もともとN高等学校のノンプログラマーの生徒をWebエンジニアとして就職させるために作られたカリキュラムで講師曰く去年はこれで二人エンジニア就職を決めたらしい。
内容も相当親切に説明していて、プログラミングで何か作るだけじゃなくて、就職に必要な環境構築やセキュリティまでみっちりやる。
で講師が書いてる入門コースで習うことがまとめ。テキスト教材もあるけど授業も1項目を2時間で説明している。授業は週2の生放送とそのアーカイブがある。
↓みたいなことが学べる
----
Webブラウザとは (Chrome,デベロッパーコンソール, alert)
はじめてのHTML (VSCode,HTML, Emmet)
さまざまなHTMLタグ (h, p, a, img, ul,tableタグ)
HTMLで作る自己紹介ページ (HTMLタグ組み合わせ,コンテンツ埋め込み)
はじめてのJavaScript (JS, ES6,エラー)
JavaScriptでの計算 (値,算術演算子,変数, 代入)
JavaScriptで論理を扱う (論理値,論理積,論理和,否定, 比較演算子, if)
JavaScriptのループ (ループ, for)
JavaScriptのコレクション (コレクション, 配列, 添字, undefined)
JavaScriptの関数 (関数,関数宣言,引数,戻り値,関数呼び出し, 再帰)
JavaScriptのオブジェクト (オブジェクト,モデリング,プロパティ,要件定義)
はじめてのCSS (CSS,セレクタ,background-color,border)
CSSを使ったプログラミング (transform, id, class)
Webページの企画とデザイン (企画,要件定義,モックアップ, 16進数カラーコード)
診断機能の開発 (const, let, JSDoc,インタフェース,正規表現,テストコード)
診断機能の組込み (div,無名関数,アロー関数, ガード句, truthy, falsy)
ツイート機能の開発 (リバースエンジニアリング, URI, URL, URIエンコード)
LinuxというOS (VirtualBox,Vagrant,Ubuntuのインストール, OS, CUIの大切さ)
コンピューターの構成要素 (ノイマン型コンピューター,プロセス, lshw, man, ps, dfの使い方)
ファイル操作 (pwd, ls, cd, mkdir, rm, cp, mv, find,ホストマシンとの共有ディレクトリ)
標準出力 (標準入力、標準出力、標準エラー出力、パイプ、grep)
vi (vimtutor)
シェルプログラミング (シバン,echo, read,変数, if)
通信とネットワーク (パケット,tcpdump,IPアドレス, TCP,ルーター,ping)
HTTP通信 (http,https, DNS, hostsファイル,ポートフォワーディング)
GitHubでウェブサイトの公開 (GitHub,リポジトリ, fork, commit,情報モラル)
イシュー管理とWikiによるドキュメント作成 (Issues,Wiki)
GitとGitHubと連携 (git, ssh, clone, pull)
GitHubへのpush (init, add, status,インデックス, commit,push, tag)
Gitのブランチ (branch, checkout, merge, gh-pages)
Node.js (Node.js, nodebrew,Linux, REPL,コマンドライン引数, プルリク課題)
集計処理を行うプログラム (集計,人口動態CSV,Stream, for-of,連想配列Map, map関数)
アルゴリズムの改善 (アルゴリズム,フィボナッチ数列, 再帰,time,プロファイル, nodegrind, O記法,メモ化)
ライブラリ (ライブラリ,パッケージマネージャー, npm)
Slackのボット開発 (slack, mention, bot)
HubotとSlackアダプタ (hubot, yo)
モジュール化された処理CRUD,オブジェクトライフサイクル, filter)
ボットインタフェースとの連携 (モジュールのつなぎ込み,trim,join)
同期I/Oと非同期I/O (同期I/O, 非同期I/O,ブロッキング)
例外処理 (try,catch, finally, throw)
HTTPサーバー (Web, TCPとUDP,Webサーバーの仕組み,Node.jsのイベントループ,リスナー)
HTTPのメソッド (メソッド, GET, POST, PUT,DELETE,CRUDとの対応)
HTMLのフォーム (フォームの仕組み, form, input)
HerokuでWebサービスを公開 (Webサービスの公開,heroku, dyno, toolbelt,login, create, logs)
認証で利用者を制限する (認証,Basic認証, Authorizationヘッダ,ステータスコード)
Cookie を使った秘密の匿名掲示板 (Cookie, Set-Cookie, expire)
UI、URI、モジュールの設計 (モジュール設計,フォームのメソッド制限,リダイレクト, 302)
フォームによる投稿機能の実装 (モジュール性, textarea, 303)
認証された投稿の一覧表示機能 (パスワードの平文管理の問題, 404,テンプレートのeach-in)
データベースへの保存機能の実装 (データベース,PostgreSQL, 主キー)
トラッキングCookieの実装 (トラッキングCookie, IDの偽装,Cookie の削除)
削除機能の実装 (データベースを利用した削除処理, 認可,サーバーサイドでの認可)
管理者機能の実装 (Webサービスの管理責任,管理者機能の重要性)
デザインの改善 (Bootstrap,レスポンシブデザイン,セキュリティの問題があるサイトを公開しない)
脆弱性 (脆弱性,脆弱性で生まれる損失,個人情報保護法, OSコマンド・インジェクション)
XSS脆弱性の対策 (XSS, 適切なエスケープ処理, リグレッション)
パスワードの脆弱性の対策(ハッシュ関数,メッセージダイジェスト,不正アクセス禁止法,パスワードジェネレーター,辞書攻撃)
セッション固定化攻撃脆弱性の対策 (セッション,セッション固定化攻撃,ハッシュ値による正当性チェック)
より強固なセッション管理 (推測しづらいセッション識別子,秘密鍵)
安全なHerokuへの公開 (脆弱性に対する考え方, HTTPの廃止)
Webフレームワーク (Express.js,フレームワーク導入,簡単なAPI,セキュリティアップデート,Cookie パーサー,ミドルウェア, 外部認証, ロガー)
ExpressのAPI (app, Properties, Request,Response, Router)
GitHubを使った外部認証 (Passport,OAuth)
テスティングフレームワーク (Mocha,レッド,グリーン,リファクタリング)
継続的インテグレーション (CircleCI)
クライアントのフレームワーク (Webpack,Chrome 以外のブラウザでもES6)
DOM操作のフレームワーク (jQuery,jQueryアニメーション, this)
AJAX (jQuery.ajax,クロスドメイン, 同一生成元ポリシー, x-requested-by, CORS)
WebSocket (WebSocket,WebSocketの状態遷移,Socket.io)
RDBとSQL (DDL, DCL, CREATE,DROP, INSERT,DELETE, UPDATE, WHERE)
テーブルの結合 (外部結合, 内部結合, 片側外部結合,JOIN ON)
インデックス (インデックス, 複合インデックス, Bツリー)
集計とソート (SUM, COUNT, ORDER BY,GROUP BY)
「予定調整くん」の設計 (要件定義、用語集、データモデル、URL設計、モジュール設計、MVC)
認証とRouterモジュールの実装 (Mocha, supertest,passport-stub,モックテスト)
予定とユーザーの保存 (セキュリティ要件, UUID, 複合主キー)
予定とユーザーの一覧の表示 (非同期処理,Promise, then)
出欠とコメントの表示 (入れ子の連想配列,Promise.all,子どもからデータを消す)
出欠とコメントの更新 (Promiseチェイン,リファクタリング)
セキュリティ対策と公開 (X-Frame-Options,Herokuの環境変数)
Permalink |記事への反応(17) | 11:07
http://anond.hatelabo.jp/20130325172822 の続き
言語はJava7を想定。(Java8が迫っていますが、Lambdaなど関数型は、まだ早いと言うことで)
選定理由は、C++と比較して学べるところが大きく、安全でシンプルな言語だから。
※いきなりJavascriptはやめとけ、PHPは論外。
Ruby・Scalaでないのは、筆者が初心者には適切には教えられないから。
おもちゃ・ToyとしてjQueryで遊ぶのは、悪くは無いと思う。
これ以降は名著の紹介や学習方法の紹介が主体となります。名著のコンポジションという形が時間的限界ですね。
量については「初級になるなら、専門書を計3,000ページは修得することは覚悟してね」なんて言ったりしています。
Javaで初級のわかりやすい指標ですと、[amazon:EffectiveJava]とGoFまでの修得。
初級になるまでに登竜門への挑戦期間を含めて、3~4年はかかっても仕方が無いとも思います。
※逆に「一山いくらのコーダー」というのは、EffctiveJavaやGoFが達成している技術も知らずに「自分がJavaプログラマー」だと誤解してしまっているような人達です。
そういったコーダーは何年経とうとも初級プログラマーにすら敵いません。
初級を目指して、プログラミングを楽しんでください。
ただ、学ぶべきことはべらぼうですが、「各分野毎に、エレガントな方法がある。だから探して修得する」ということが大切です。
※「一を聞いて十を知る」ような優秀な人に、50冊くらいドーンと本を置いてあげて、各本の目次を読ませるだけで、
底の見え無さを悟ってくれたりすると、嬉しくなってしまいます。
※余談ですが、その底の見え無さは数学という学問そのものですね。例えば、関数型言語の底流に「圏論」というここ100年の最新の数学があります。
また中級くらいで、Liskovの置換原則などが載っている本を紹介しますが、
そのLiskovの置換原則の周辺で出てくるcovariant(共変)って、圏論という数学の概念だったりします。
数学畑出身としては、数学が現実に活かされている嬉しい事例です。
「速く正確に大量の出力」という能力は、プログラミングをする上でも、ドキュメントを書く上でも、何より「つまらん仕事」の時間圧縮ができるようになるため、重要です。
スローガンとしては「思考のスピードで出力することを目指そう」です。
紹介するエディターはemacsやvimやExcelです。ついでにIMEとしてATOKを使用しているため、ATOKの操作をEmacsライクにする話も紹介します。
ExcelはWindows環境でMeadowすら入れさせてくれない場合の最後の砦という扱いです。
コマンドラインは、「コマンドラインというものがある」「時として非常に強力である」程度の紹介です。
※筆者はzshは全然使えません。使いこなしている方々と接する度に「勉強しなきゃな~、でも、あっちの方を先にやりたい・・・」とグズグズして、はや何年・・・
正規表現は置換を用いて、テキストの一括編集が重要です。後、遭遇したくない事態ですが、スパゲッティコードの解析をする上での最後の砦です。
※遭遇したくない例
ん?何か変なところで副作用のある処理があるようだなぁ(消沈)、SQLのInsertかUpdateか一応Mergeも使っているところから逆算して原因箇所を探すか・・・(諦念)
この糞コードがっ!!こんなところに書くんじゃねぇ!!(憤怒激高)
(ここで、他にやらかしていそうな似たようなコードを正規表現でgrep検索。改行コード込みにすれば複数文検索も可能)
わはは、予想通り共通化すべきロジックのメソッドがそこら中にある・・・
入門編で一つLinkedListというアルゴリズムを学びました。
少なくとも一つ本を読みながら自力でアルゴリズムを学べる人なら、大成できる可能性があります。
前に紹介した[amazon:C++実践プログラミング]には、LikedListやStackなど基本的なアルゴリズムが載っておりますが、
これに加えて、初級になるためにはこれくらいは知っておいて欲しいというものを紹介します。
※後、最初から必ずしも手を出さなくても良い上限も紹介いたします。
プログラムは、データを入力して、加工して出力・保存する処理の繰り返しです。
つまり、各一連の繰り返し毎に、「正しい入力」「正しい出力」を定式化する必要があります。
それを人間の手では無くコンピューターにやらせられるように、つまり自動テストできるようにテストをプログラミングします。
そこで処理の進捗を確認するためにロギングし、処理が想定通りであるかをアサーションでチェックし、
不正な入力・不正な出力=例外が起きたら、対処策をプログラミングします。
(ex 途中で処理を中断して、入力者に適切な入力のメッセージを伝えてあげる。入力の自動補正などもあり得る)
で、ここら辺をまとめてどうあるべきかとして「契約プログラミング」があります。
※余談。定式化・テストに際して、数学畑の人間としては、Javaだとequalsのオーバーライドでも必要になるし、同値関係・同値分割だけでなく、集合論・群論から学んで欲しい・・・(ここいらは数学科の学部1~2年の学習内容)
名著は英語で読みましょう。名著が名著たる由縁は、度々引用されることにあります。
つまり最新の技術書を読むときに、引用された名著のフレーズが、新旧のリンクをなし、理解の助けになります。
壁打ちといって、独り言で思考補助をするよりも遙かに有益です。
※素晴らしい師匠を探すなら、大学行くのが一番ですが、見聞を広げていく中で出会いを待つしかないとも思います。
マルチスレッドが難しいのは「バグを起こしにくいプログラミング」を求められるから。
つまりTry and Errorからの決別が求められ、今後の仕様変更・拡張も踏まえて慎重に慎重にデザインする必要があります。
できる限りステータス変数を持たずに安全に、でもマルチスレッドにするのだから、効率を追求しなければ本末転倒。
でも効率のためにはメモ化に代表されるキャッシングは必須と、アンビバレンツな要素のバランス取りが難しい。
このために、リエントラントな実装・抽象と実装の分離など様々なエッセンスを駆使することが必要です。
というよりも孔子曰く、知っているよりも好きであること。好きであることよりも楽しめることのほうが強く、
気づいたら日々時間が許す限りプログラミングをしてしまうのが理想です。
※仕事として嫌々スキルを磨かなきゃということが、これほど不幸な職業も無いですね。
学習の達成度を測るには、簡単すぎる不適切な問題ですね。
写経は数学の証明問題を、教科書のテンプレ通りに、数値や名称だけ変えて記述することしか出来ない人の発想。
つまり「矛盾無く一貫した論理モデル」の構築が自由に出来ず、テンプレの微修正しか出来ない人の発想。
また、外部の「矛盾無く一貫した論理モデル」の吸収が不自由で、アルゴリズムを「手順」としてしか捉えられないように見受けられる。
「連続」であること確かめるための「ε-Δ論法」(数学科の学部1年の学習内容)
事前知識無く、このモデルを理解できる人は、十分に「矛盾無く一貫した論理モデル」を構築できる人。
1.まず「連続」とは何ぞやと考えて概念を膨らませてください。