はてなキーワード:Node.jsとは
LINEオープンチャット「はてなブックマーカー」の1週間分の要約を、さらにAIを使用し、試験的にまとめまています。
https://anond.hatelabo.jp/20240722084249
https://anond.hatelabo.jp/20250630114221 https://anond.hatelabo.jp/20250626125317 https://anond.hatelabo.jp/20250627100609 https://anond.hatelabo.jp/20250628122821
AI技術を批判する記事がバズりまくってるが、それに対して凄い数の批判がいってる、だけど肝心の批判は個人攻撃めいていて、どれも技術的な部分はふわふわした物言いなので
どれだけ技術的にまったく使い物にならないかを、技術面から3つ理由を上げようと思う、これを見れば、確かにAIってそんなもんじゃないな、って正しい理解が進むと思う、と同時に、
ネットでAIを擁護したり喧伝してる人間で誰一人、エンジニアを自称したりしてる奴らでさえAIを理解してる人間がゼロっていうのがわかると思う
ちなみに、IT技術を全然知らない増田向けに技術的な部分は補足説明を入れているので、ちょっと長くなってるかもしれない
LLMがわかっていない!と喚いてる当人たちも上で言った通り、LLMっていうのが理解できてないの丸わかりなので、ここでまずLLM「大規模言語モデル」とは何かを簡単に説明しよう
生成AI(特にChatGPTのような大規模言語モデル、LLM)というのは「文脈に最もふさわしい次の単語を予測する」」という統計的タスクを行っている、これがLLMだ
「飲みます」→90%の確率 「買いました」→7% 「投げました」→0.5%
この過程には、意味理解や感情、意図、文脈の内的把握は一切関わっていない、これが致命的な欠陥の1つ
プログラミングを自動でまるで仮面ライダー01の01ドライバーの様にベルトの作成までやってくれているように喧伝してる奴らが多い
が、これを本気で信じ込んでプログラミング言語を書かせた奴がいたら、ほぼ間違いなくクビになる
わかりやすく上で例えた通り、LLMは、インターネット上に存在する膨大なコード断片・技術記事・GitHubリポジトリ・StackOverflowの投稿などを学習している。
そのため【よく使われる文法構造】や【特定の言語における関数の使い方】や【ライブラリの典型的な使い方】などを【意味を全く理解できず模倣している】だけって事
【動かないコードをアホほど入れる(変数が未定義、型が合っていない、ライブラリに存在しない関数を呼んでいるとかいう小学生のプログラミングスクールでもありえないミス】
【. 「それっぽいけど間違っている」コードを大量に入れ込む(SQLインジェクション、XSSなどセキュリティ上危険な実装を入れまくる、パフォーマンスが極端に悪い実装、バグを含んでいるロジック(特にif文の条件分岐ではほぼ100%発生する)】
【実行環境に依存した誤り(存在しないAPIやライブラリを使う、ほぼ9割の確率で…あと特定のPythonバージョンやNode.js環境でしか動かないコードを汎用的に提示、つまり動きようがない)
専門的な意見となったのでわかりづらいので、もっとわかりやすく言うと「小学校のプログラミングスクール入りたて1週間の子供が書いためっちゃくちゃなプログラミングにすらなってないコードを、製品利用するからレビューして出してこい」と言われてるに等しい、つまり、最初から自分で書いた方が早い2度手間になる
これが、プログラミングの革命だ!とか喚いてる奴らが隠すAIの実態である。
import jwt
token = jwt.encode({'user_id': 123}, 'secret', algorithm='HS256')
一見正しく見えるだろうから解説すると、実際には 【jwt という名前のライブラリ】が複数存在し(PyJWT,python-jwtとか)importの仕方によってエラーが出たり挙動が変わったりする。普通なら絶対間違えない様な挙動をAIは構造上全く判断できない、これは上で上げた根本的な問題なので恐らく絶対に解決できない。
ハルシネーションがどういうものであるのか、AI批判でバズった記事などで言及されている通り、デマやデタラメを出力してしまう、あれは本当にわかりやすいAIの致命的欠陥を検証してるので、あえて説明はここではしない。
しかもその増田の元記事では「文章データのテキストまで読み込ませれば間違いがなくなるのでは?」といってたが、これも絶対になくならない、というより、もっとひどくなる。
批判をしている増田やXでの意見は単なる個人攻撃の誹謗中傷のみで、技術的に改善可能なプロセスさえ示せていない、例えば現在研究者の間では以下の様な解決案は研究されているが、どれも全く問題外とされている
これは、AIが「知っている風」に語る代わりに、外部の信頼できるデータベースや検索エンジンから情報を引っ張ってくる方式、バズった元記事の増田がやっていた「自分で図書館言って本の内容読んで誤りであることを確認する」これを検索エンジン使ってAIにさらにやらせる、という機能だ
また【メタモデル】すなわち、AIが自分の出力を裏でさらに別のAIが別プロセスでチェックして間違いをただす、という方式も研究されてる。
これは致命的な欠点が2つある、まず「検索で引っ張ってくる知識そのものが間違いだった場合、さらに間違いの結果を出し続ける」ということ。
元記事の増田はMP5というマシンガンの有効射程について突っ込んでいたと思うが、これが典型的なRAG、メタモデルの致命的欠点、元増田は「実際に自分の手で銃を取り扱ったりしたことがある確かな経験で言ってる」が、書籍などの工業スペックや仕様書の定義でしかネット上では流布してない、だからそもそも答えというものにAIがたどり着けない。
2つ目は「文脈や倫理・常識・道徳が根本的に読めないので、解決策が乱暴すぎるもの」になる。
上で上げた鉄砲以外では、例えば医学などでこれをやってしまうと取り返しのつかないことになる。例えば医者の投薬治療や治療はガイドラインに従ってるというが、優れた医者は論文を読み込んで原理は不明だがエビデンスはあるので、漢方薬を出したりするというお医者さんがよくいるだろう。あれは実際に患者を診て、西洋医学的には全く問題ないが、心理的な面も絡んで心身症になっているから、論文などで勉強して「暗黙知、経験知」として処方してるし、その量も患者を診た医者の経験で精度を上げている。
そして医療分野では、「冷え性の軽いむくみ」に対して「サムスカ(トルバプタン)」という劇薬指定の危険な利尿薬をAIが提示した事例すらある。これを「笑い話」で済ませることはできない。
例えるなら判断が「脳外科医竹田君」並になる、投薬治療で3か月で治る程度の病気を、病根から外科手術で切除しましょう、なんて提案になる。最新のAIなのに80年前みたいな医学知識と判断になってしまうのだ(胃潰瘍ってだけで胃袋は全摘、ついでに脾臓と盲腸もいらねーからとっとこ、みたいな手術が昭和の昔、本当にガイドライン治療だった、「K2」などで言及されている)
学習できるベースがどうしても偏る以上、情報の統合に限界がある、さらに間違いが間違いをよび、さらに変な間違いを起こしたりありえない架空のことをいったりする、これがハルシネーションというメビウスの輪である
Neuro-symbolicAIという次世代のさらに文脈も読み取れるアーキテクチャAIを研究しているが、全く実用化されていない、核融合や量子コンピューターみたいな雲をつかむ話なので、AIがこの問題を解決することは恐らく今後数百年はありえない、という結論が出ている。
元増田の記事で批判もあったが、恐らくAIで一番致命的な問題はこれ
基本的にAIは英語ソース、つまりリングワ・フランカで圧倒的にテキスト量の多い(約95%)英語、日本語含めそれ以外の全世界言語が5パーセントという偏った学習になっている
そのため、倫理・道徳・常識・規範などがすべて西洋基準になってしまう、という問題がある。(元増田はこれを「脱獄の基準の倫理は誰が決めるのか?」と根本的な問題に気が付いていて批判していたようだ)
ちなみに、バズってた例の記事に「AIに書かせたんだろ」という批判も大量にあるしよくみかけるが、この場合においてのみ言うなら、これは③の問題からまずありえないということがわかる、以下が根拠だ
元増田は「俺達の麻生とかいって秋葉原で踊ってた…」とか「レムちゃん、エミリアたん、ヘスティアちゃん、ウマ娘たん、刀剣乱舞くん、ライカン様…」といった批判を繰り返し書いていた
これに激怒できる人間は、2005~2010年にオタク界隈や秋葉原にすでにかかわっていて、実際に渦中にいたか同じ属性の人間でしか、罵倒されていると文脈的に理解できないのである。つまり、大量の英語文化圏情報を食ってるAIではなんでそれが罵声や侮蔑なのか理解できないので、書きようがない表現の数々、であるということである。
AIからすれば「ライカン様?ウマ娘?なんじゃそりゃ」なのである、もっと言えば、その直後にコンテクストとして「アホ、ボケ、弱者男性、豚丼、性器や自慰で虚しく…」といった言葉があるから、なんならAIはウマ娘やライカンをキャラクターでなく侮蔑単語として理解してしまう、これは実際、元増田の記事の一文をAIに食わせて質問したらガチでそうなるので、ぜひお手元で試してもらいたい。
「プログラマーのイメージを描いて」と依頼すると、男性の画像ばかりが出るされる
「看護師」→女性、「エンジニア」→男性という職業的性差が自動的に反映される
「アフリカの文化」→貧困・紛争・サバンナなど、植民地主義的視点が強く反映される(実際は南アなどはすげえ都会である)
これに前述のハルシネーション問題として現れれば、人間と同じような差別や偏見を「ガチの真実」として学習してしまう、人間の場合、8割くらいは本当はおかしいこととメタ批判が心理的にできるとされているが、AIにはその構造が根本的に存在しない。
元増田の記事のコメント欄やXなどで元増田のAI批判を批判しつつ、「金持ちの上級白人専用のハイエンドAIがあるに違いないんだ」といっている意見が少なくない数がある。
冷静に考えれば、そんなめんどうくせえもん誰が作るんだ、と普通に考えればわかるのだが、この③の問題、すなわち95%の学習データが英語ソースなので、結果的に西洋文明ベースの文化圏の人間向けにカスタマイズされているので、アジア圏やその他文化圏では利用に不利でそう感じてしまう素地ができている、という錯覚に由来している
例えば、パレスチナ問題などがそうだ、ガザ地区でほぼ国際条約や人道違反の残虐行為を国が行っているわけで、他文化圏や歴史的文脈から見ればどっちかって言えばパレスチナ人こそ被害者なのだが、イスラエルから見ればそれは正義であり正当な攻撃なわけで、後者の方がAIは正しいと判断した結論を下す様になる、といった問題である
あの記事の元増田は「テロ組織のヤバイマニュアルまで学習してpdfで元データを提示してきた」と言っていた。実際AIに調べさせて持ってこさせてみると、出所はアメリカの法務執行機関が研究用にネットで公開したものであった。
日本人や日本の警察の対応レベルで「ヤバイ」ものでも、海外の軍隊みたいな装備の警察で見れば大したことがないから、公開させてもいい=倫理違反には当たらない、という文化規範の意識の違いを、あの元増田自身が証明してしまっている、あの記事は、AIの治しようがない根本的な技術的欠陥をほとんど言及しているといっていい
元増田が口汚く罵っている内容の様に、「AIは0を1にできないから格差が広がるだけ」という根本的な哲学を投げつけている
それを受けて批判してる意見の中には「(自分が1を持ってる側と何故か根拠もなく信じ込んでて)100にできるから(なら)便利」とか「そのAI今から勉強したりしてる俺たちは先行者利益で強者になれる」と信じて疑わない意見が多かった
③問題の通り、そもそも非キリスト教圏かつ非英語圏の国家で生まれて育った民族、というだけで、我々は等しく「0」側の人間であり、結局競争になると勝てない、ということに全く気が付いていないのである。ここにAI信者の宿痾といえる病理がある
かつて日本人は黒船を見て5年そこらで蒸気機関を模倣した、火縄銃を一丁買えば10年でオスマン帝国の次に鉄砲を使うようになった、それは当時の日本人の基礎工学技術が導入可能なほど優れており、かつそれに対して現代では考えられないほぼバクチといっていい投資を行った結果であって、その結果を見て自分たちはAIを使いこなせて強くなれるなんていうのは、物凄い妄想である。つまり、AIは少なくとも「非英語圏」の人間にとっては、ブレイクスルーは絶対に起こりえない、ということである。
Permalink |記事への反応(17) | 08:43
2025年、私たちはソフトウェア開発の歴史的な転換点に立っている。大規模言語モデル(LLM)の進化は、GitHub Copilotのようなコード補完ツールに始まり、今や「何を作りたいか」を自然言語で伝えるだけで、アプリケーションの雛形が数分で生成される時代を現実のものとしつつある。この光景を目の当たりにした多くのプログラマが、漠然とした、しかし確かな不安を抱いているだろう。「私たちの仕事は、いずれAIに奪われるのではないか」と。
この問いに対する私の答えは、半分はYesであり、もう半分はNoだ。より正確に言えば、プログラマの仕事の本質が、歴史上かつてないレベルで抽象化され、その役割が再定義されるのだ。私たちは、コードを「書く」作業から解放される一方で、これまで以上に高度な思考を要求されることになる。
本稿では、プログラミングの歴史を「How(いかに作るか)」から「What(何を作るか)」への移行として捉え直し、LLMがこの流れをいかに加速させるかを論じる。そして、その先にある、AIには決して代替できない、人間ならではの競争優位性、すなわち「Why(なぜ作るのか)」を定義し、記述する能力の重要性について深く考察していく。これは、単なる未来予測ではない。今を生きるすべてのソフトウェアエンジニアにとっての、生存戦略の提示である。
LLMの登場を特異点として捉える前に、我々が立っている場所を正確に知る必要がある。ソフトウェア開発の歴史は、常に「抽象化」との戦いであった。そしてその歴史は、プログラマの関心が「How」から「What」へと徐々に移り変わっていくプロセスとして描くことができる。
コンピュータの黎明期、プログラミングとは、計算機が理解できる命令(How)を、一行一行、丹念に記述する作業そのものであった。アセンブリ言語や初期のFORTRAN、COBOLといった言語は、ハードウェアの制約を強く受けており、プログラマはメモリ管理やプロセッサの動作といった、極めて物理層に近いレベルでの「How」を意識する必要があった。
この時代のテストもまた、「How」に強く束縛されていた。書かれた手続きが、意図した通りに順番に実行されるか、特定の入力に対して期待された計算結果を返すか。テストの関心事は、あくまで「手続きの正しさ」の検証にあった。ビジネスロジックと実装の詳細が密結合し、コードは特定の処理手順を記述した、硬直的な塊となっていた。
風向きが変わり始めたのは、ソフトウェアの規模が拡大し、その複雑性が人間の認知能力を超え始めた頃だ。1990年代後半から2000年代にかけて提唱されたエクストリーム・プログラミング(XP)の中で、テスト駆動開発(TDD)という考え方が登場する。
TDDの本質は、単なるテスト手法の改善ではない。それは、プログラミングのパラダイムを根底から覆す思想だった。TDDは、「まずテストを書く」ことを強制することで、プログラマの意識を「これから実装するコード(How)」から「そのコードが満たすべき振る舞い(What)」へと強制的に転換させたのだ。
テストはもはや、書かれたコードの後追いで正しさを検証する作業ではない。それは、これから作られるべきソフトウェアの「仕様書」であり、「振る舞いの宣言」となった。例えば、「ユーザーがログインボタンをクリックしたら、ダッシュボード画面に遷移する」というテストコードは、具体的な実装方法(`onClick`イベントハンドラの中で`window.location.href`を書き換える、など)には一切言及しない。それはただ、達成されるべき「What」を記述しているだけだ。
この思想は、ビヘイビア駆動開発(BDD)へと発展し、`Given-When-Then`といった、より自然言語に近い形式でソフトウェアの振る舞いを記述するスタイルを生み出した。プログラマだけでなく、プロダクトマネージャーやビジネスアナリストといった非技術者をも巻き込み、「What」を共通言語として定義する試みが本格化したのである。
TDD/BDDによってプログラマの意識が「What」に向かい始めると、コードそのものもまた、宣言的なスタイルへと進化していく。この変化を劇的に加速させたのが、モダンなフレームワークの存在だ。
Reactを例に考えてみよう。Reactが登場する前、フロントエンド開発はjQueryに代表されるように、DOMを直接操作する命令的なコード(How)の連続だった。「このボタンがクリックされたら、この要素のテキストを書き換え、あちらの要素を非表示にする」といった具合だ。
しかし、Reactは「UIとは、ある状態(state)に対する純粋な写像である」という宣言的なモデルを提示した。プログラマがやるべきことは、UIの状態(`state`)と、その状態がどのように見えるか(JSXによるコンポーネント)を宣言することだけだ。状態が変更された際に、DOMをどのように効率的に更新するかという面倒な「How」の部分は、Reactの仮想DOMと差分検出アルゴリズムがすべて隠蔽してくれる。プログラマは「What(UIのあるべき姿)」を記述するだけでよくなったのだ。
この「WhatからHowへの変換」は、様々な領域で見られる。
これらのフレームワークやツールは、いわば「特定の制約下における、WhatからHowへの高性能な変換器」として機能してきた。プログラマは、フレームワークが課す「お作法」や「制約」を受け入れることで、退屈で間違いの多い「How」の記述から解放され、より本質的な「What」の定義に集中できるようになった。我々が「生産性が高い」と感じる開発体験は、この優れた変換器の恩恵に他ならない。
現状は、この歴史的変遷の延長線上にある。プログラマの仕事は、手続きを記述する職人から、振る舞いを定義し、それを実現するための最適な「変換器(フレームワーク)」を選択・設定するアーキテクトへと、その重心を移してきたのだ。
フレームワークがもたらした「WhatからHowへ」の潮流は、LLMの登場によって、未曾有のスケールで加速されようとしている。フレームワークが「特定の領域に特化した変換器」であったのに対し、LLMは「あらゆる領域に対応可能な、究極の汎用変換器」としてのポテンシャルを秘めているからだ。
前章で述べたように、ReactやTerraformといったフレームワークは、その恩恵と引き換えに、私たちに特定の「制約」を課してきた。Reactを使うならコンポーネントベースで思考し、状態管理の作法に従う必要がある。Terraformを使うなら、そのエコシステムとHCLの流儀を受け入れなければならない。これらの制約は、WhatからHowへの変換を自動化するための「レール」であり、私たちはそのレールの上を走ることで効率を得てきた。
しかし、LLMはこの前提を覆す。LLMは、特定のフレームワークや言語の知識を事前に学習しているが、その利用において絶対的な制約を課すわけではない。私たちは、より自由な形式で「What」を伝えることができる。
例えば、こうだ。
ユーザー認証機能付きのシンプルなブログアプリを作ってほしい。フロントエンドはReactとTypeScript、UIコンポーネントはMUIを使う。バックエンドはNode.jsとExpressで、データベースはPostgreSQL。ユーザーはGoogleアカウントでログインでき、新しい記事を作成、編集、削除できる。記事にはマークダウン記法が使えて、画像もアップロードできるようにしてほしい。
この要求(What)は、特定のフレームワークの流儀に則ったものではない。複数の技術スタックを横断し、機能要求を自然言語で並べただけのものである。しかし、現在のLLM、特にGPT-4oやそれに類するモデルは、このレベルの要求から、ディレクトリ構造、設定ファイル、APIエンドポイント、フロントエンドコンポーネントに至るまで、驚くほど具体的なコード(How)を生成することができる。
これは、フレームワークが担ってきた「WhatからHowへの変換」が、特定のレールから解き放たれ、より広範で柔軟な領域へと拡張されたことを意味する。これまで自動化が難しかった、あるいは特定のフレームワークが存在しなかったニッチな領域や、複数の技術を組み合わせる複雑なシステム構築においても、AIによる宣言的プログラミングの恩恵を受けられる時代が始まろうとしているのだ。
LLMという汎用変換器の登場により、プログラマの生産性は、「いかに質の高いWhatをLLMに伝えられるか」に直結するようになる。これは、俗に「プロンプトエンジニアリング」と呼ばれるスキルだが、その本質は、ソフトウェア開発における「要求定義」そのものである。
質の高い「What」とは何か。それは、曖昧性がなく、網羅的で、矛盾のない要求である。
これらは、優秀なソフトウェアエンジニアが、プロダクトマネージャーやデザイナーとの対話を通じて、日常的に行ってきた思考プロセスそのものではないだろうか。LLMの登場は、この思考プロセスを、より明確に、よりテキストベースで「記述」する能力を求める。私たちの頭の中にあった暗黙的な仕様が、LLMへの入力(プロンプト)という形で、明示的に言語化されることを要求するのだ。
やがて、ほとんどのプログラミング作業は、この「Whatの記述」に収束していくだろう。TDDがテストコードという形式で「What」を記述したように、私たちは自然言語や、より構造化された要求記述言語を用いて、AIに対して「What」を宣言することになる。コード(How)は、その宣言から自動生成される中間生成物に過ぎなくなる。まさに、コードが蒸発していく未来である。
「What」を伝えれば「How」が手に入る。この魔法のような世界の到来を前に、私たちは一つの重大な問いに直面する。それは、「そのWhatからHowへの変換は、本当に一意に決まるのか?」という問いだ。
答えは、明確にNoである。
ある「What(要求)」を実現するための「How(実装)」は、無数に存在する。そして、どの「How」を選択すべきかを決定するためには、単純な機能要求(What)だけでは情報が全く足りない。そこには、必ず「Why(なぜそう作るのか)」という、背景、文脈、そしてトレードオフの考慮が必要不可欠となる。
簡単な例を考えてみよう。「1億件のユーザーデータを格納し、ユーザーIDで高速に検索できるシステム」という「What」をLLMに与えたとする。LLMは、どのような「How」を提案するだろうか。
これらの選択肢は、どれも「What」を満たしている。しかし、その特性は全く異なる。案Aは多くのエンジニアにとって馴染み深く開発が容易だが、10億、100億件へのスケールは難しいかもしれない。案Bはスケール性に優れるが、厳密なトランザクション管理は苦手だ。案Cは高速だが、運用コストとシステムの複雑性が増す。案Dは安価だが、検索速度は他に劣る。
LLMは、これらの選択肢をリストアップすることはできるだろう。しかし、このプロジェクトにとって最適な選択肢はどれかを、自信を持って決定することはできない。なぜなら、その決定には、LLMが与えられていない「Why」の情報が必要だからだ。
これらの「Why」こそが、無数に存在する「How」の中から、ただ一つの「正解」を選び出すための羅針盤なのである。そしてこの「Why」は、ビジネスの目標、組織の文化、ユーザーの期待、技術的な制約といった、極めて人間的で、文脈依存的な情報の中にしか存在しない。
ここで重要なのは、これまでもエンジニアは、この「Why」に基づく意思決定を、意識的あるいは無意識的に行ってきたという事実だ。
私たちが技術選定を行うとき、単に「流行っているから」という理由だけでReactを選ぶわけではない。「SPA(Single PageApplication)にすることでユーザー体験を向上させたい(Why)」、「コンポーネント指向の開発によって長期的な保守性を確保したい(Why)」、「Reactエンジニアの採用市場が活発だから(Why)」といった、様々な「Permalink |記事への反応(0) | 17:09
2025年、私たちはソフトウェア開発の歴史的な転換点に立っている。大規模言語モデル(LLM)の進化は、GitHub Copilotのようなコード補完ツールに始まり、今や「何を作りたいか」を自然言語で伝えるだけで、アプリケーションの雛形が数分で生成される時代を現実のものとしつつある。この光景を目の当たりにした多くのプログラマが、漠然とした、しかし確かな不安を抱いているだろう。「私たちの仕事は、いずれAIに奪われるのではないか」と。
この問いに対する私の答えは、半分はYesであり、もう半分はNoだ。より正確に言えば、プログラマの仕事の本質が、歴史上かつてないレベルで抽象化され、その役割が再定義されるのだ。私たちは、コードを「書く」作業から解放される一方で、これまで以上に高度な思考を要求されることになる。
本稿では、プログラミングの歴史を「How(いかに作るか)」から「What(何を作るか)」への移行として捉え直し、LLMがこの流れをいかに加速させるかを論じる。そして、その先にある、AIには決して代替できない、人間ならではの競争優位性、すなわち「Why(なぜ作るのか)」を定義し、記述する能力の重要性について深く考察していく。これは、単なる未来予測ではない。今を生きるすべてのソフトウェアエンジニアにとっての、生存戦略の提示である。
LLMの登場を特異点として捉える前に、我々が立っている場所を正確に知る必要がある。ソフトウェア開発の歴史は、常に「抽象化」との戦いであった。そしてその歴史は、プログラマの関心が「How」から「What」へと徐々に移り変わっていくプロセスとして描くことができる。
コンピュータの黎明期、プログラミングとは、計算機が理解できる命令(How)を、一行一行、丹念に記述する作業そのものであった。アセンブリ言語や初期のFORTRAN、COBOLといった言語は、ハードウェアの制約を強く受けており、プログラマはメモリ管理やプロセッサの動作といった、極めて物理層に近いレベルでの「How」を意識する必要があった。
この時代のテストもまた、「How」に強く束縛されていた。書かれた手続きが、意図した通りに順番に実行されるか、特定の入力に対して期待された計算結果を返すか。テストの関心事は、あくまで「手続きの正しさ」の検証にあった。ビジネスロジックと実装の詳細が密結合し、コードは特定の処理手順を記述した、硬直的な塊となっていた。
風向きが変わり始めたのは、ソフトウェアの規模が拡大し、その複雑性が人間の認知能力を超え始めた頃だ。1990年代後半から2000年代にかけて提唱されたエクストリーム・プログラミング(XP)の中で、テスト駆動開発(TDD)という考え方が登場する。
TDDの本質は、単なるテスト手法の改善ではない。それは、プログラミングのパラダイムを根底から覆す思想だった。TDDは、「まずテストを書く」ことを強制することで、プログラマの意識を「これから実装するコード(How)」から「そのコードが満たすべき振る舞い(What)」へと強制的に転換させたのだ。
テストはもはや、書かれたコードの後追いで正しさを検証する作業ではない。それは、これから作られるべきソフトウェアの「仕様書」であり、「振る舞いの宣言」となった。例えば、「ユーザーがログインボタンをクリックしたら、ダッシュボード画面に遷移する」というテストコードは、具体的な実装方法(`onClick`イベントハンドラの中で`window.location.href`を書き換える、など)には一切言及しない。それはただ、達成されるべき「What」を記述しているだけだ。
この思想は、ビヘイビア駆動開発(BDD)へと発展し、`Given-When-Then`といった、より自然言語に近い形式でソフトウェアの振る舞いを記述するスタイルを生み出した。プログラマだけでなく、プロダクトマネージャーやビジネスアナリストといった非技術者をも巻き込み、「What」を共通言語として定義する試みが本格化したのである。
TDD/BDDによってプログラマの意識が「What」に向かい始めると、コードそのものもまた、宣言的なスタイルへと進化していく。この変化を劇的に加速させたのが、モダンなフレームワークの存在だ。
Reactを例に考えてみよう。Reactが登場する前、フロントエンド開発はjQueryに代表されるように、DOMを直接操作する命令的なコード(How)の連続だった。「このボタンがクリックされたら、この要素のテキストを書き換え、あちらの要素を非表示にする」といった具合だ。
しかし、Reactは「UIとは、ある状態(state)に対する純粋な写像である」という宣言的なモデルを提示した。プログラマがやるべきことは、UIの状態(`state`)と、その状態がどのように見えるか(JSXによるコンポーネント)を宣言することだけだ。状態が変更された際に、DOMをどのように効率的に更新するかという面倒な「How」の部分は、Reactの仮想DOMと差分検出アルゴリズムがすべて隠蔽してくれる。プログラマは「What(UIのあるべき姿)」を記述するだけでよくなったのだ。
この「WhatからHowへの変換」は、様々な領域で見られる。
これらのフレームワークやツールは、いわば「特定の制約下における、WhatからHowへの高性能な変換器」として機能してきた。プログラマは、フレームワークが課す「お作法」や「制約」を受け入れることで、退屈で間違いの多い「How」の記述から解放され、より本質的な「What」の定義に集中できるようになった。我々が「生産性が高い」と感じる開発体験は、この優れた変換器の恩恵に他ならない。
現状は、この歴史的変遷の延長線上にある。プログラマの仕事は、手続きを記述する職人から、振る舞いを定義し、それを実現するための最適な「変換器(フレームワーク)」を選択・設定するアーキテクトへと、その重心を移してきたのだ。
フレームワークがもたらした「WhatからHowへ」の潮流は、LLMの登場によって、未曾有のスケールで加速されようとしている。フレームワークが「特定の領域に特化した変換器」であったのに対し、LLMは「あらゆる領域に対応可能な、究極の汎用変換器」としてのポテンシャルを秘めているからだ。
前章で述べたように、ReactやTerraformといったフレームワークは、その恩恵と引き換えに、私たちに特定の「制約」を課してきた。Reactを使うならコンポーネントベースで思考し、状態管理の作法に従う必要がある。Terraformを使うなら、そのエコシステムとHCLの流儀を受け入れなければならない。これらの制約は、WhatからHowへの変換を自動化するための「レール」であり、私たちはそのレールの上を走ることで効率を得てきた。
しかし、LLMはこの前提を覆す。LLMは、特定のフレームワークや言語の知識を事前に学習しているが、その利用において絶対的な制約を課すわけではない。私たちは、より自由な形式で「What」を伝えることができる。
例えば、こうだ。
ユーザー認証機能付きのシンプルなブログアプリを作ってほしい。フロントエンドはReactとTypeScript、UIコンポーネントはMUIを使う。バックエンドはNode.jsとExpressで、データベースはPostgreSQL。ユーザーはGoogleアカウントでログインでき、新しい記事を作成、編集、削除できる。記事にはマークダウン記法が使えて、画像もアップロードできるようにしてほしい。
この要求(What)は、特定のフレームワークの流儀に則ったものではない。複数の技術スタックを横断し、機能要求を自然言語で並べただけのものである。しかし、現在のLLM、特にGPT-4oやそれに類するモデルは、このレベルの要求から、ディレクトリ構造、設定ファイル、APIエンドポイント、フロントエンドコンポーネントに至るまで、驚くほど具体的なコード(How)を生成することができる。
これは、フレームワークが担ってきた「WhatからHowへの変換」が、特定のレールから解き放たれ、より広範で柔軟な領域へと拡張されたことを意味する。これまで自動化が難しかった、あるいは特定のフレームワークが存在しなかったニッチな領域や、複数の技術を組み合わせる複雑なシステム構築においても、AIによる宣言的プログラミングの恩恵を受けられる時代が始まろうとしているのだ。
LLMという汎用変換器の登場により、プログラマの生産性は、「いかに質の高いWhatをLLMに伝えられるか」に直結するようになる。これは、俗に「プロンプトエンジニアリング」と呼ばれるスキルだが、その本質は、ソフトウェア開発における「要求定義」そのものである。
質の高い「What」とは何か。それは、曖昧性がなく、網羅的で、矛盾のない要求である。
これらは、優秀なソフトウェアエンジニアが、プロダクトマネージャーやデザイナーとの対話を通じて、日常的に行ってきた思考プロセスそのものではないだろうか。LLMの登場は、この思考プロセスを、より明確に、よりテキストベースで「記述」する能力を求める。私たちの頭の中にあった暗黙的な仕様が、LLMへの入力(プロンプト)という形で、明示的に言語化されることを要求するのだ。
やがて、ほとんどのプログラミング作業は、この「Whatの記述」に収束していくだろう。TDDがテストコードという形式で「What」を記述したように、私たちは自然言語や、より構造化された要求記述言語を用いて、AIに対して「What」を宣言することになる。コード(How)は、その宣言から自動生成される中間生成物に過ぎなくなる。まさに、コードが蒸発していく未来である。
「What」を伝えれば「How」が手に入る。この魔法のような世界の到来を前に、私たちは一つの重大な問いに直面する。それは、「そのWhatからHowへの変換は、本当に一意に決まるのか?」という問いだ。
答えは、明確にNoである。
ある「What(要求)」を実現するための「How(実装)」は、無数に存在する。そして、どの「How」を選択すべきかを決定するためには、単純な機能要求(What)だけでは情報が全く足りない。そこには、必ず「Why(なぜそう作るのか)」という、背景、文脈、そしてトレードオフの考慮が必要不可欠となる。
簡単な例を考えてみよう。「1億件のユーザーデータを格納し、ユーザーIDで高速に検索できるシステム」という「What」をLLMに与えたとする。LLMは、どのような「How」を提案するだろうか。
これらの選択肢は、どれも「What」を満たしている。しかし、その特性は全く異なる。案Aは多くのエンジニアにとって馴染み深く開発が容易だが、10億、100億件へのスケールは難しいかもしれない。案Bはスケール性に優れるが、厳密なトランザクション管理は苦手だ。案Cは高速だが、運用コストとシステムの複雑性が増す。案Dは安価だが、検索速度は他に劣る。
LLMは、これらの選択肢をリストアップすることはできるだろう。しかし、このプロジェクトにとって最適な選択肢はどれかを、自信を持って決定することはできない。なぜなら、その決定には、LLMが与えられていない「Why」の情報が必要だからだ。
これらの「Why」こそが、無数に存在する「How」の中から、ただ一つの「正解」を選び出すための羅針盤なのである。そしてこの「Why」は、ビジネスの目標、組織の文化、ユーザーの期待、技術的な制約といった、極めて人間的で、文脈依存的な情報の中にしか存在しない。
ここで重要なのは、これまでもエンジニアは、この「Why」に基づく意思決定を、意識的あるいは無意識的に行ってきたという事実だ。
私たちが技術選定を行うとき、単に「流行っているから」という理由だけでReactを選ぶわけではない。「SPA(Single PageApplication)にすることでユーザー体験を向上させたい(Why)」、「コンポーネント指向の開発によって長期的な保守性を確保したい(Why)」、「Reactエンジニアの採用市場が活発だから(Why)」といった、様々な「Permalink |記事への反応(0) | 17:09
一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。
// ==UserScript== // @namePGP未署名検出と別タブ自動編集 // @namespacehttp://tampermonkey.net/ // @version 1.0 // @descriptionPGP署名がない投稿を自動編集ページへ誘導 // @matchhttps://anond.hatelabo.jp/* // @grantGM_setValue // @grantGM_getValue // @grantGM.openInTab // ==/UserScript== (function () { 'use strict';constbody = document.getElementById('entry-page'); if (!body) return;consttitleText = document.title; if (!titleText.includes('dorawii')) return;constpgpRegex = /BEGIN.*PGP(?: SIGNEDMESSAGE| SIGNATURE)?/;const preElements = document.querySelectorAll('div.body pre'); let hasPgpSignature =false; for (const pre of preElements) { if (pgpRegex.test(pre.textContent)) { hasPgpSignature =true; break; } } if (hasPgpSignature) return;const editLink = document.querySelector('a.edit');const childTab =GM.openInTab(editLink.href, {active:false, insert:true,setParent:true }); })();
// ==UserScript== // @name編集ページ処理と自動送信・閉じ // @namespacehttp://tampermonkey.net/ // @version 1.0 // @description編集ページで署名処理と送信、タブ自動閉じ // @matchhttps://anond.hatelabo.jp/dorawii_31/edit?id=* // @grantGM_getValue // @grantGM_xmlhttpRequest // @grantGM_setClipboard // @grantGM_notification // @connectlocalhost // ==/UserScript== (async function () { 'use strict';const shouldRun = awaitGM_getValue('open-tab-for-edit', '0');consttextareaId = 'text-body';consttextarea = document.getElementById(textareaId); if (!textarea) return;const content =textarea.value;constpgpSignatureRegex = /-----BEGINPGP SIGNEDMESSAGE-----[\s\S]+?-----BEGINPGP SIGNATURE-----[\s\S]+?-----ENDPGP SIGNATURE-----/; if (pgpSignatureRegex.test(content)) {console.log('[PGPスクリプト]署名が検出されたためそのまま送信します'); return; }consthttpRequest = (url, data) => { return newPromise((resolve,reject) => {GM_xmlhttpRequest({ method: 'POST',url:url, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: `value=${encodeURIComponent(data)}`,onload: function (response) { resolve(response.responseText); },onerror: function (error) {reject(error); } }); }); }; //textarea の値を取得 // 1.現在のページのURLからURLオブジェクトを作成const currentUrl = newURL(window.location.href); // 2.ベースとなる部分 (例: "https://anond.hatelabo.jp") を取得constorigin = currentUrl.origin; // 3. 'id'パラメータの値 (例: "20250610184705") を取得constidValue = currentUrl.searchParams.get('id'); // 4.ベース部分とIDを結合して、目的のURL文字列を生成 //idValueが取得できた場合のみ実行する let newUrl = null; if (idValue) { newUrl = `${origin}/${idValue}`; } // 5. 生成されたURLを変数に代入し、コンソールに出力して確認console.log(newUrl);constvalueToSend = newUrl;try {const signatureText = awaithttpRequest('http://localhost:12345/run-batch',valueToSend);console.log('バッチ応答:', signatureText); if (!signatureText.includes('BEGINPGP SIGNEDMESSAGE')) { alert('PGP署名がクリップボードに見つかりませんでした。'); return; }const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n';textarea.value = newText;console.log('[PGPスクリプト]署名を貼り付けました。送信を再開します。');const form = document.forms.edit;const newForm = form.cloneNode(true); form.replaceWith(newForm); newForm.addEventListener('submit', async (e) => { e.preventDefault(); //HTML標準のsubmitをキャンセルconstbodyText =textarea?.value || ''; //reCAPTCHAトークンの取得constrecaptchaToken = await newPromise((resolve) => { grecaptcha.enterprise.ready(() => { grecaptcha.enterprise.execute('hoge', {action: 'EDIT' }) .then(resolve); }); }); // POSTするデータの構築const formData = new FormData(newForm); formData.set('body',bodyText); formData.set('recaptcha_token',recaptchaToken); formData.set('edit', '1');try {constresponse = await fetch(newForm.action, { method: 'POST',body: formData, credentials: 'same-origin' }); if (response.ok) {console.log('送信成功'); window.close(); } else {console.error('送信失敗',response.status); } }catch (err) {console.error('送信中にエラーが発生', err); } }); //プログラム的に送信トリガー newForm.dispatchEvent(new Event('submit', { bubbles:true })); }catch (e) {console.error('バッチ呼び出し失敗:', e); } })();
consthttp =require('http');const { exec } =require('child_process');const querystring =require('querystring');const server =http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/ping') { res.writeHead(200); res.end('pong'); } else if (req.method === 'POST' && req.url === '/run-batch') { letbody = ''; req.on('data', chunk => {body += chunk.toString(); }); req.on('end', () => {constparsed = querystring.parse(body);constvalue =parsed.value || 'default'; // 値を引数としてバッチに渡す exec(`C:\\Users\\hoge\\Desktop\\makesign.bat "${value}"`, { encoding: 'utf8' }, (err, stdout, stderr) => { if (err) { res.writeHead(500); res.end('Error executing batch: ' + stderr); } else { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(stdout.trim()); } }); }); } else { res.writeHead(404); res.end('Not found'); }});server.listen(12345, () => {console.log('Batch serverrunningathttp://localhost:12345/');});
@echo offsetlocal enabledelayedexpansion::署名するファイル名set "infile=%~1"set outfile=%TEMP%\pgp_output.asc:: 以前の出力があれば削除if exist "%outfile%" del "%outfile%":signloop::AutoHotkeyでパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える)start "" /b "C:\Users\hoge\Documents\AutoHotkey\autopass.ahk"::PGPクリア署名を作成echo %infile% | gpg --yes --clearsign --output "%outfile%"::署名が成功していればループを抜けるif exist "%outfile%" (goto postprocess) else ( timeout /t 1> nulgoto signloop):postprocesspowershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body =Get-Content '%outfile%' -Raw;Write-Output ($header + \"`r`n\" + $body + $footer)"powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body =Get-Content 'signed.asc' -Raw;Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)"endlocalexit /b
#Persistent#SingleInstance ignoreSetTitleMatchMode, 2WinWaitActive, pinentrySendInputpasswordSleep 100SendInput {Enter}ExitApp
動けばいいという考えで作っているので余分なコードも含んでいるかもしれない。
-----BEGINPGP SIGNEDMESSAGE-----Hash: SHA512https://anond.hatelabo.jp/20250613185036 -----BEGINPGP SIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEv1FQAKCRBwMdsubs4+SHHkAQDUOLgBcdji2T6MJ7h/vlMdFfGlWAzNdXijjE1gIuEPywEAiMNMZqhrMmtlc7UqRuggNJ/UTa5xTIcKp622+7jJQQg==Lgkl-----ENDPGP SIGNATURE-----
・エントリページでタイトルがdorawiiでpgp署名が無くeditボタンがあったら、現在のURLを保管してそれをクリック
・そのクリックによるURLへのアクセスにおいては別タブを開かせるようにするが、現在のタブは変えないようにする
・保管してあるURLをnode.jsサーバー経由でバッチファイルに渡して署名してクリップボードにコピー
・フォームへの貼り付けが終わったら送信ボタンをクリックし、レスポンスが正常に返ったと確認された段階(つまりページ表示の完了を待たない)で、別タブを自動終了
-----BEGINPGP SIGNEDMESSAGE-----Hash: SHA512https://anond.hatelabo.jp/20250611115815 -----BEGINPGP SIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEk0DAAKCRBwMdsubs4+SMeUAP0Sbc2rovwbBLIW1EsKVCkZgaMMBQh7XNHretkmy/X+MgD/VZaho2zYzj5TBcoTBYw5DL/IbfBlrq8oRZoAJckc8wY==U8nF-----ENDPGP SIGNATURE-----
https://survey.stackoverflow.co/2024/technology
https://survey.stackoverflow.co/2020#technology
- | 2020 | - | - | - | 2024 |
JS | 67.7 | - | - | - | 62.3 |
Python | 44.1 | - | - | - | 51 |
TS | 25.4 | - | - | - | 38.5 |
Java | 40.2 | - | - | - | 30.3 |
C# | 31.4 | - | - | - | 27.1 |
C++ | 23.9 | - | - | - | 23 |
C言語 | 21.8 | - | - | - | 20.3 |
PHP | 26.2 | - | - | - | 18.2 |
Go | 8.8 | - | - | - | 13.5 |
Rust | 5.1 | - | - | - | 12.6 |
kotlin | 7.8 | - | - | - | 9.4 |
Lua | - | - | - | - | 6.2 |
Dart | 4.0 | - | - | - | 6 |
Ruby | 7.1 | - | - | - | 5.2 |
Swift | 5.9 | - | - | - | 4.7 |
Scala | 3.6 | - | - | - | 2.6 |
※HTML/CSS,SQL,Bash/Shell,とかそういうのは省いた
順調に伸びるPython人気、そしてTypescriptの伸びがすごいな
Javaって永遠に人気なのかと思ってたけどじわじわと人気が落ちている
PHPも長期的にみると厳しそう。
GoとRustが着実に人気を獲得。
Luaが地味に人気出てる。
- | 2020 | - | - | - | 2024 |
PostgraSQL | 36.1 | - | - | - | 48.7 |
MySQL | 55.6 | - | - | - | 40.3 |
SQLite | 31.2 | - | - | - | 33.1 |
SQLServer | 33.0 | - | - | - | 25.3 |
MongoDB | 26.4 | - | - | - | 24.8 |
Redis | 18.3 | - | - | - | 20 |
MariaDB | 16.8 | - | - | - | 17.2 |
Elasticsearch | 13.8 | - | - | - | 12.5 |
Oracle | 16.5 | - | - | - | 10.1 |
MySQL+MariaDBではまだMySQL系が多いが・・・
- | 2020 | - | - | - | 2024 |
Node.js | 51.4 | - | - | - | 40.8 |
React | 35.9 | - | - | - | 39.5 |
jQuery | 43.3 | - | - | - | 21.4 |
Next.js | - | - | - | - | 17.9 |
Express | 21.2 | - | - | - | 17.8 |
Angular | 25.1 | - | - | - | 17.1 |
ASP.NETCORE | 19.1 | - | - | - | 16.9 |
Vue.js | 17.3 | - | - | - | 15.4 |
ASP.NET | 21.9 | - | - | - | 12.9 |
Flask | 14.2 | - | - | - | 12.9 |
Spring | 16.4 | - | - | - | 12.7 |
Django | 14.2 | - | - | - | 12 |
FastAPI | - | - | - | - | 9.9 |
Laravel | 11.1 | - | - | - | 7.9 |
Svelte | - | - | - | - | 6.5 |
Rails | 7.0 | - | - | - | 4.7 |
※フロントとバックエンドがごちゃごちゃなのなんでだろう。Node.jsってフレームワークじゃないだろ・・・
Next.jsの勢いがすごい。やはりWEBはTSでNext.jsの時代なのか
Pythonの人気は盤石だけど、DjangoとかFlaskは人気が落ちてる。FastAPIに食われたか?
LaravelとRailsはこのまま消えていく予感
Speed,SEO, scalability, and developer productivity aremore critical than ever. While React.js remains a powerhouse forbuilding interactiveuser interfaces, many businesses and developers arenow leaning towardNext.js for complete, production-ready solutions.So what exactly makesNext.js amore favorable choiceover React.js in 2025?Let’s explorethe reasons in detail.
🧱 React.js vsNext.js:Core Distinction
React.jsis aJavaScript library focused solelyonbuildingUI components.
Next.jsis a full-fledgedframework builtontop of React that includeseverythingyouneed for production — routing,SSR,SEO optimization, static site generation, andmore.
In essence, React givesyou the tools to build aninterface, whileNext.js givesyou thestructure to build, deploy, andscale a completewebapplication.
🚀Key Advantages of ChoosingNext.js in 2025
1. Built-in Server-Side Rendering (SSR)
3. Hybrid Rendering Capabilities
5.Image & Font Optimization
This alignsperfectly withGoogle’sperformance guidelines in 2025. React.js doesn’t offer this natively.
7. Enhanced Developer Experience
Next.jshas evolved intoone ofthe most developer-friendlyframeworks in 2025, backedby the Vercelecosystem.In 2025,Next.js standsoutas the smarter, faster, andmore scalable solution forbuilding modernwebsites andwebapplications.It inheritseverything great about React —and addsstructure, optimization, and production-readiness. Ifyou’re planning to build awebsite that demands speed,SEO,and a seamless development process,Next.jsis the clear choice.
Formore details read this informative article:https://www.nimblechapps.com/blog/choosing-nextjs-over-reactjs-for-website-development
「フロントエンド不要論」は、最近の開発現場やサーバーレス、クラウド技術の進化に関わっている人たちの間でリアルに実感されている問題です。
• React,Vue, Angular などのフレームワークがどんどん複雑化
•フロントエンドとバックエンドの分離が、**「本当に効率的か?」**という疑問が生じている
• 「最終的にHTMLを描画するだけなら、サーバーでやればよくない?」
•フロントエンドから直接APIを叩く構成では、「APIを守る」ことが難しい
•XSS,CSRF, CORSといった脆弱性に対処し続けるコストが無駄
🚩 3.サーバーレス・クラウド技術が進化し、APIの負担を減らす方向に
•AWSLambda,APIGateway, Cognitoなどのサーバーレス技術が進化
•フロントエンドがAPIを叩くより、サーバー側で直接処理する方が効率的
• 以前はReactを使用 → ReactをやめてHTMLベースに戻した
• React,Vue, Angularを全廃
•JavaScriptなしで動的なページを実現
3. Laravel(Livewire)
4. Shopify(GraphQLでデータを直接取得)
•フロントエンドを完全分離する構成から、「バックエンドがHTMLを返せばいい」 というシンプルな構成へ移行
✅サーバーレス時代の最適解:「フロントエンド不要アーキテクチャ」
「フロントエンドを捨てて、サーバーがすべての処理を担う」方向に移行するのが最適解になりつつある。
📌 最適なアーキテクチャ
ブラウザ →サーバー(PHP,Node.js,Go) →APIGateway(Cognito認証)
📌 具体的な実装例(PHP + Cognito +APIGateway)
require 'vendor/autoload.php';
useAws\CognitoIdentityProvider\CognitoIdentityProviderClient;
useAws\Exception\AwsException;
$client = new CognitoIdentityProviderClient([
'credentials' => [
'key' => getenv('AWS_ACCESS_KEY_ID'),
'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
],
]);
$email = $_POST['email'];
$password = $_POST['password'];
try {
$result = $client->initiateAuth([
'AuthFlow' => 'USER_PASSWORD_AUTH',
'ClientId' => 'XXXXXXXXXX',
'USERNAME' => $email,
],
]);
setcookie("accessToken", $result['AuthenticationResult']['AccessToken'], [
'samesite' => 'Strict'
]);
header("Location:dashboard.php");
}
?>
🚀 **「フロントエンドはもう不要」**という流れは、最新のクラウド/サーバーレス開発に携わる人たちが実感していること。
☑セキュリティが大幅に向上する
👉結論:「フロントエンドは不要」クラウド×サーバーレスでバックエンドが主役になる!
https://xn--pckua2a7gp15o89zb.com/
技術 | 1月3日 | 3月12日 |
rails | 22,891 | 27,570 |
node.js | 12,829 | 16,178 |
Django | 13,348 | 17,054 |
Flask | 1,589 | 1,907 |
FastAPI | 1,210 | 1,509 |
Laravel | 26,879 | 32,624 |
spring | 16,380 | 23,965 |
spring boot | 5,110 | 7,002 |
React | 49,465 | 65,273 |
Next.js | 7,382 | 10,288 |
Vue | 34,322 | 45,354 |
言語 | 1月3日 | 3月12日 |
Ruby | 61,479 | 94,975 |
Python | 98,527 | 179,183 |
PHP | 92,129 | 142,628 |
JAVA | 124,840 | 232,585 |
Javascript | 99,212 | 237,094 |
Typescript | 65,828 | 91,348 |
Rust | 3,807 | 21,921 |
Go | 48,000 | 183,352 |
んんwwww増田氏、Node.js界隈が孤独に感じるとは、拙者には理解しがたいことですぞ。確かに、Ruby/Railsのコミュニティは非常に結束しているイメージがありますが、Node.jsの開発者たちもまた、独自の活力と熱量を持っていると拙者は認識していますぞ。
Node.jsはJavaScriptの流れを受けており、そのため、よりダイナミックで多様なコミュニティがあります。それは自由であり、むしろオープンな環境です。Rubyと比べてNode.jsは常に進化し続け、多くの新しいアイデアやプロジェクトが生まれていますぞ。
もちろん、増田氏が「仲間意識」を求めるのであればチャンスがあるかどうか参加してみるのも手です。しかし拙者は、その「個」としての自由がNode.jsの魅力だと感じているのですぞ。集団幻想に囚われず、Node.jsの可能性を追求するのも一興かと思いますな。是非とも、多くのNode.jsコミュニティに参加し、多様な人々と触れ合ってみることをお勧めしますぞ!
Ruby/Rails界隈ってさ、俺たち仲間だよな助け合っていこうぜ!みたいな感じがあるよね
新人が勉強するにしてもRailsチュートリアルみたいなところあるし
あと基本的に腐る部分が少なくて、Railsはずっとこれみたいな老舗の安心感みたいなものがある
開発者に当事者意識あるのか、盛り上げていかなきゃみたいな自負があってコントリビューターになる人もいる
でもNode.js界隈は仲間みたいな意識はなくて、殺伐としている
トレンド追いかけて周りを出し抜いて、相手に「まだそれ使ってんだ、いまはこれだけど?」みたいなこと言いがち
Node.jsに愛があるわけでもなく文句を言い続けてDenoやBunとか、もっといいのねーかなって探し回ってる
フロントエンドもバックエンドも出入り自由で流行り廃りが続いて結局なにが正解?みたいな感じが続いてる
フロント部分ならRails使ってても同じ問題があったんだけど、Hotwire登場で解決の兆しが出てきた
Node.js界隈はNode.jsをベースにはしてるけどみんなが別々のライブラリ使ってるから、「この解説は俺のケースには合わないなぁ」ってなりやすい
ひとりの開発者のためだっけ?なんかコンセプトがそうらしいじゃん
https://pr.forkwell.com/career_navi/dhh-rails-large-scale-development/
この人のすごいところは口だけじゃないんだよ
じっさいやるからすごいよな
omakubだっけそういうところもすごい
はてブでのブックマークの数から察するにオワコンになりつつあるのは確かなようだ
リリースのニュースなんかだとブックマーク数もおおかったけど、だんだん減ってる
Rails 7.0正式リリース、Node.js不要のフロントエンド開発環境がデフォルトに 195 users
https://www.publickey1.jp/blog/21/rails_70nodejs.html
↓
「Ruby on Rails 8」正式リリース。SQLiteを本番DBとして利用可能に。今後は6カ月ごとに新バージョンをリリース 33 users
https://www.publickey1.jp/blog/24/ruby_on_rails_8sqlitedb6.html
反論もへってきてる
ErosEnro - [GclFIuRIoGhmOe] (花火)
10yue - [ZpOZ9oa6QqJweD] (アンコ)
iwara source downloaderの作者が公開停止して使えなくなって久しいので代替を紹介
https://github.com/dawn-lc/IwaraDownloadTool/blob/master/.github/README/README_ja.md
Chrome系/Firefox両対応。Tampermonkey入れたあとスクリプトページからインストール
以後iwaraが改変されてUIが出る。ファイル名はiwara source downloaderと同じ書式にするなら
%#ALIAS#% - %#TITLE#%
とする。自分は末尾に動画IDを足すため[%#ID#%]もつけてる
ページにチェックボックスが出るようになるため複数ダウンロードにも対応
MEGAリンクのある動画はDLせずそっちに誘導する機能もあるがiwara画質でいいならSettingでオフればおk
宛先フォルダまでカスタイマイズしたい場合はAria2というコマンドラインの汎用DLマネージャを拾ってきてパスの通った場所に置き
Node.jsをインストールしてから、powershellで
node node-server.js &aria2c --enable-rpc --rpc-listen-all
を実行してからスクリプトのSettingでAria2方式を選択してSaveで閉じればできる
ただし標準ではブラウザの保存パスではなくpowershellのカレントディレクトリ基準になるのでスクリプトのSettingからフルパス指定しとくといい
もしダウンロードキューをGUIで確認したいなら、https://github.com/ziahamza/webui-aria2 をまるまるクローンしてどっかのフォルダに置き
powershellでそのフォルダへcdしてから上記コマンドを実行して、ブラウザでhttp://localhost:8888 を開いておけば見られる
常用するならWindowsのスケジューラーにログオン時このコマンドを書いたbatファイルを実行するようなタスクを追加しとくといい
WebUIからダウンロードアドレスを追加する場合、いにしえのflashgetがやってたような並列ダウンロードなんかが使える