「Node.js」を含む日記 RSS

はてなキーワード: Node.jsとは

2026-08-03

宮本佳林さんの方が俺よりできる人だと思った…😟

というか、天は二物与える人には与えるんだね…😟



家で3万円のPacificaでRime of the Ancient Marinerを弾いてストレス発散してる自分とは違う、

いわゆる、「黒い画面」でnode.js動かそうとか、普通やらないし、

みんなやろうとしない、悪意あるハッカーが使うとさえ思ってる人がいる…😟まあ、terminalでshell使ってるのはみんなそうなんだけどさ



俺はAWSまったく分からないし、臆せず使う精神いいね

泳げないじゃなくて、とりあえず、足がつくプールに入るのが大事、水を怖がらないためにも頭を水に浸けるのが大事なんだよ…😟




スポーツクラブ初心者講習を見て、👴👵おばちゃんが多いんだけど、泳ぎができない人はまず水を怖がってる、

これが根本的に駄目…😟



どんなに上手くなっても、水を恐れる、というのは大事

人間にとって不利な環境なんだから、うっかり水泳とか海や川でなくてもプール死ぬことはある、

から大事なんだけど、怖さとトレードオフで泳げるようになってる、ということも考えて欲しい…😟



例えば、うっかり海か川に落ちて、基本的には何もしない、とにかく浮く、ことが大事だと俺は思ってるけど、

ちょっと泳げば岸に着ける、という状況なら、リスクを取って泳ぐ、という選択もありになる、

短期的に見れば危険でも、長期的に考えてリスクを取ることで、長期的な利益を得られることがある、

博打とか投資の考え方に似ているけど、普段プールで泳ぐことになれていれば、そのリスクはある程度なんとかなる、大丈夫だろうと思えるものになる、




そういえば、ウシジマくんのニート編で、ニート君はパチンカスで、俺は小出しに人生を賭けてる!とか言ってたけど、

賭ける方向が間違ってるだけで、パチンコじゃなきゃいいんじゃないの?と思った…😟



毎日ちょっとでもいい、よく知らない曲とか、前々からこれを知りたかったんだ、みたいに思うものに数分でもいい、時間を割いてみる、

よくわからないものとか、ちょっとしたリスクを試してみる、

塀の中囚人が、毎日少しずつ脱出の穴を掘るようなものだけど、そこまで緻密にキリキリ考えなくてもいい、

コーヒーを飲んで、気分が落ち着いたら、ちょっと穴を掘ってみるか、みたいに思ってるうちに、いつの間にか脱出口が完成してるかもしれない…😟

2026-07-29

ITエンジニア会話の中で出てくる本

ITエンジニア会話の中で出てくる本

資格取得向けではない

賛否両論もあると思うが、IT現場で働いていたり交流すると話に上がる本がメイン

勉強ももちろんだが、現場話題についていくという点において読んでおいて損はなさそう

ソフトウェア工学古典

書籍 主なテーマ 現在位置づけ
------------------------ -------------------- --------------
人月神話 ブルックスの法則概念的完全性、銀の弾丸 ソフトウェア工学の最重要古典
ピープルウエア 生産性組織作業環境、チーム形成 開発組織論の古典
達人プログラマー 技術者姿勢抽象化自動化、変更容易性 現代でも読みやすい準古典
Code Complete コーディング設計レビュー品質 実装技術百科事典
ソフトウェア作法 UNIX的なプログラム設計思考 プログラミング文化古典
プログラミング作法 命名デバッグテスト、性能、移植 C中心だが原則普遍的
珠玉プログラミング アルゴリズム問題解決 計算量・問題分解の古典
計算プログラム構造解釈 SICP 抽象化評価言語処理系 コンピュータ科学寄りの古典

プログラミングコード設計

書籍 内容
------------------------------------------------------- -------------------
リファクタリング 第2版 振る舞いを変えずに内部設計改善する
レガシーコード改善ガイド テストのない既存コード安全に変更する
Clean Code 命名関数クラス、可読性
テスト駆動開発 TDD基本的な進め方
Growing Object-Oriented Software, Guided by Tests テストからオブジェクト設計を成長させる
Working Effectively with Unit Tests 単体テスト設計テスト容易性
A Philosophy of Software Design 複雑性を減らす設計
The Programmer’s Brain コードを読むとき認知負荷

現在批判も多い

オブジェクト指向・デザインパターン

書籍 位置づけ
--------------------------------- ------------------
オブジェクト指向における再利用のためのデザインパターン GoFデザインパターン原典
Head Firstデザインパターン パターン入門書
アジャイルソフトウェア開発の奥義 SOLID、パターンアジャイル設計
エンタープライズアプリケーションアーキテクチャパターン 業務アプリ設計パターン
実践UML オブジェクト指向分析設計
オブジェクトデザイン 責務駆動設計

ソフトウェアアーキテクチャ

書籍 内容
------------------------------------------- -------------------
ソフトウェアアーキテクチャの基礎 アーキテクチャ特性スタイル意思決定
ソフトウェアアーキテクチャハードパーツ 分割、粒度データトレードオフ
Clean Architecture 依存関係境界ユースケース
エンタープライズアプリケーションアーキテクチャパターン 業務システム設計パターン
Domain-Driven Design 複雑な業務領域モデル
実践ドメイン駆動設計 DDD実践的な適用
Building Evolutionary Architectures 変更可能アーキテクチャ
Fundamentals of Software Architecture 現代アーキテクチャの概論


Clean Architectureについて

唯一の正解ではない

依存関係を内側に向ける」「業務ルールフレームワークから分離する」という考え方を学ぶ本であり、すべてのアプリを同じ円形の構造にする本ではない

分散システム・大規模システム

書籍 内容
------------------------------------------- --------------------
データ指向アプリケーションデザインDDIA DB分散処理、一貫性レプリケーション
分散システムタネンバウム 分散システム全般教科書
Designing Distributed Systems 分散システム設計パターン
Release It! 本番障害、安定性、回復
Site Reliability Engineering SRE、SLI、SLO、運用
Building Secure and Reliable Systems セキュリティ信頼性
Web Scalability for Startup Engineers Webシステムのスケーリング
System Design Interview システム設計の考え方を広く学ぶ

ネットワーク

入門・全体像
書籍 内容
-------------------------------- -----------------
マスタリングTCP/IP 入門編 日本で最も定番TCP/IP入門書
コンピュータネットワークタネンバウム ネットワーク全般教科書
コンピュータネットワーキング トップダウンアプローチ アプリケーションから学ぶ
ネットワークはなぜつながるのか ブラウザからサーバーまでの流れ
TCP/IPを深く学ぶ
書籍 内容
----------------------------------------- -------------------
詳解TCP/IP TCP/IP古典
TCP/IP Illustrated パケットレベルの詳細
High Performance Browser Networking TCPTLSHTTPブラウザ通信
パケットキャプチャ教科書 Wiresharkなどを使った解析
HTTPWeb
書籍 内容
-------------------------------- ----------------
Real World HTTP HTTP歴史現代機能
Webを支える技術 HTTPURIREST
HTTP: The Definitive Guide HTTP/1.1時代の体系的解説
Web API: The Good Parts Web API設計

OSLinux・低レイヤー

書籍 内容
-------------------------------- ---------------
オペレーティングシステム 3つの簡単ピーOSTEP 仮想化、並行性、永続性
Operating System Concepts恐竜 OS標準的教科書
詳解UNIXプログラミング UNIXシステムコール
Linuxプログラミングインタフェース Linux APIの詳細
Linuxのしくみ Linux内部の入門
ふつうLinuxプログラミング Linux上でのプログラム実行
30日でできる!OS自作入門 OS動作を作りながら学ぶ
コンピュータシステム理論実装Nand2Tetris 論理回路からOSまで

データベース

書籍 内容
------------------------------ ---------------
データベースシステム DB理論教科書
Database System Concepts DB標準的教科書
SQLアンチパターン よくあるDBSQL設計の失敗
達人に学ぶDB設計 徹底指南 論理設計正規化、性能
達人に学ぶSQL徹底指南 SQLの考え方
SQLパフォーマンス詳解 インデックスと実行計画
High Performance MySQL MySQLの性能設計
PostgreSQL徹底入門 PostgreSQL有機

| DDIA DBを含むデータシステム全体 |

セキュリティ

書籍 内容
------------------------------------------- --------------
体系的に学ぶ 安全Webアプリケーションの作り方徳丸 Webセキュリティ国内定番
Web Application Security Webアプリ脆弱性と防御
The Web Application Hacker’s Handbook Web攻撃手法古典
Security Engineering セキュリティ工学全般
暗号技術入門 暗号ハッシュ署名証明書
マスタリングTCP/IP 情報セキュリティ ネットワークセキュリティ
Threat Modeling 脅威モデリング
Building Secure and Reliable Systems セキュアで信頼できる運用

アルゴリズムデータ構造

書籍 内容
------------------------------------ --------------
アルゴリズムイントロダクションCLRS アルゴリズム分野の標準教科書
アルゴリズムデータ構造 大学教科書的な基礎
珠玉プログラミング 問題解決古典
プログラミングコンテスト攻略のためのアルゴリズムデータ構造 実装を伴う学習
問題解決力を鍛える!アルゴリズムデータ構造 日本語での実践的入門
The Algorithm Design Manual 問題に適したアルゴリズム選択


テスト品質保証

書籍 内容
--------------------------- -------------
テスト駆動開発 TDD原典
ソフトウェアテスト技法ドリル 同値分割、境界値など
はじめて学ぶソフトウェアテスト技法 テスト技法定番
実践ソフトウェアエンジニアリング 開発工程品質全般
Googleソフトウェアエンジニアリング 大規模開発、テスト保守
単体テストの考え方/使い方 良い単体テスト設計
xUnit Test Patterns テストコードパターン
Continuous Delivery 自動テストからリリースまで


DevOps・CI/CD・SRE

書籍 内容
----------------------------------- ------------------
The DevOps ハンドブック DevOpsの実践体系
Accelerate 開発組織デリバリー性能の研究
Continuous Delivery 継続的デリバリー原典書籍
Site Reliability Engineering GoogleのSRE
The Site Reliability Workbook SREの実践
LeanとDevOpsの科学 Accelerateの日本語版
Infrastructure as Code IaC原則
Kubernetes Patterns Kubernetes上の設計パターン
Release It! 本番耐性と障害対策

クラウドコンテナ

書籍 内容
---------------------------- -----------------
Kubernetes完全ガイド Kubernetesの体系的な理解
Kubernetes Patterns Kubernetes設計パターン
入門 Kubernetes Kubernetes概念
Docker系の入門書 コンテナ操作
Infrastructure as Code インフラコード
Cloud Native Patterns クラウドネイティブ設計
クラウドデザインパターン クラウド上の設計パターン

AWSAzureGoogle Cloudについては、以下を優先する

要件定義モデリング

書籍 内容
------------------------------------- --------------
要求工学系の教科書 要求抽出分析管理
ソフトウェア要求 要求定義の体系
ユーザーストーリーマッピング ユーザー行動と開発計画
ユースケース実践ガイド ユースケース記述
RDRA2.0ハンドブック 要求システム構造の整理
実践ドメイン駆動設計 業務モデリング
Domain Modeling Made Functional 型を使ったドメインモデリング
イベントトーミング 業務知識の探索


UIUXWebデザイン

書籍 内容
------------------------- ------------
誰のためのデザイン 人間中心設計古典
インタフェースデザイン心理学 認知心理UI
ノンデザイナーズ・デザインブック レイアウト・配色・文字
Don’t Make Me Think Webユーザビリティ
About Face インタラクションデザイン
デザインシステムの育て方 デザインシステム
Lean UX 仮説検証型のUX開発

開発組織マネジメント

書籍 内容
---------------------------- -----------------

2026-06-30

ブックマークサービスつくったよー(ローカル or セルフホスト)

Nooklog

Node.jsサーバーChrome拡張から ぽいいぽい ブックマークできるのつくった!

ずーっと Pinboardを使い続けて そこから7万件以上を移行したんだけど わりと さくさく 動いてるよー

特定サイト滞在時間によって 自動保存したいとか AIで要約したいとか よくあるニーズは Tampermonkey + user.js対応するかんじ(サンプルスクリプトあり)

iPhoneから 一度 Discordに送って APIインポートする みたいな使い方もできる

ありがちなアプリだとおもうけど ブラウザ右クリックから検索できたり こまかいところが 微妙に便利とおもう

1月くらいから 作りながら 毎日 使ってるから 大きな不具合は ないはず、、、たぶん

気が向いたら 使ってみて!✨

2026-06-25

あれあれ~???飲食店AI連続凸するのは許されて苦情AI連続凸は許されないのかな~??? anond:20260625070518

AIによる自動電話をしたいんですがどうすればいいでしょうか

AIによる自動電話AIボイスボイシング自動発信システム)を実現するには、主に**「既存サードパーティサービスを使う方法」と「開発して自作する方法」**の2つがあります

目的予算技術力に合わせて選べます

1. 既存サービスを利用する(最も手軽)

プログラミング不要または低コードで、すぐに導入可能です。

Twilio Flex / AI Voice: 電話の発信・着信管理に強く、AIボイスを組み込みやすい。

Vapi.ai: 低遅延で自然AIボイス通話に特化したプラットフォーム開発者がよく利用。

Bland AI: 自動発信から顧客対応までをAIで行えるサービス

日本国内サービス: 日本語対応に強く、国内法(電波法特定商取引法など)への準拠がしやすものを選びます(例:Tokyo Call、あるいは国内クラウド電話ベンダーAI機能)。

2. 開発して自作する(柔軟性が高い)

自社システム連携させたい場合や、高度なカスタマイズ必要場合に適しています

通信部分: Twilio、Agora、VonageなどのAPIを使って電話回線制御

AI脳部分: OpenAIGPT-4o)、Anthropic(Claude)などで会話ロジックを構築。

音声部分: ElevenLabs、Google Cloud Text-to-SpeechAmazon Pollyで自然音声合成

連携: これらをサーバーNode.js, Pythonなど)上でつなぎ、リアルタイム通話WebSocketなど)を実現します。

⚠️ 重要な注意点(日本国内場合

自動電話を導入する際は、以下の法律規制に十分注意する必要があります

特定商取引法: 「自動音声による勧誘」には厳格なルールがあり、事前にオプトイン(同意)を得ているか、または特定の除外事項に該当するかが問われます

電話勧誘販売法: 不特定多数への自動音声勧誘原則禁止されている場合があります

迷惑電話防止法: 相手への配慮拒否対応の仕組みが必須です。

電波法: 機械的な発信装置使用に関する規制

まずは**「何のために(予約確認営業アンケートなど)」自動電話を使いたいかを明確にし、「対象顧客から同意は得られているか」**を確認することから始めることを強くお勧めします。

具体的な用途(例:「予約の自動確認」や「営業リード獲得」など)があれば、より適切なサービス構成案を提案できます

迷惑電話防止法: 相手への配慮拒否対応の仕組みが必須です。

迷惑電話防止法: 相手への配慮拒否対応の仕組みが必須です。

迷惑電話防止法: 相手への配慮拒否対応の仕組みが必須です。

迷惑電話防止法: 相手への配慮拒否対応の仕組みが必須です。

迷惑電話防止法: 相手への配慮拒否対応の仕組みが必須です。

2026-05-27

WEBサーバーNode.js自分備忘録

そもそも「Node」とは何ぞや?

Node は、JavaScriptの実行環境である

終了


本来JavaScriptブラウザクライアントしか動かない言語だったが

これを、ブラウザに頼らず通常の言語と同じように、OSの上で動かすためのツール


Node.jsというモジュール群の中には、HTTP通信サポートするライブラリなどがあり

それを使うと、JavaScriptHTTP通信を待ち受けるプログラム記述できる

ここに関しては、C言語などと変わらない

Node.jsWEBサーバーとして動かせるのは、そのように書いたJavaScriptユーザープログラムがあるからであり

Node.jsWEBサーバーなわけではない


例えば、Apacheを考えてみると違いは明確だ

ApacheWEBサーバーとして開発されたアプリケーションである

アクセスされたURIを解析し、HTML記述されたファイルを読み込んでクライアント転送する

この部分はアプリケーション機能として作りこまれていて

逆に言えば、ユーザープログラム言語を知る必要なく

HTML記述できれば、WEBサイトを構築可能となる

URIフォルダ構成関係も、Apache内で規定されたものがあり

ユーザーはそこについて特別制御記載する必要が無い


Node.jsではどうだろうか?

前述したように、Node.jsではこのWEBサーバーとしての機能

一部自分記述しなければならない


ttp://localhost/test/hoge/piyo.html

というURIアクセスした場合

apache であれば、下記のようなフォルダ構成存在した上で

piyo.htmlhogeフォルダ存在している必要がある


/root

  /test

    /hoge


URI に応じたフォルダファイルが無ければ、「404 Not Found」となる


しかし、Nodeでは事情が異なる

ユーザー記載したJavaScriptが処理するため

フォルダファイル存在しなくてもエラーとならない

どういうアクセス成功として、どういうアクセスエラーとするのか

apacheならすでに規定済みのそれらを自分記述しなければならない

2026-04-18

IDEを入れなくなった

新しい鯖をセットアップした。Express5800 T120h。電源を入れればファンが唸り、正しくコンピュータが起きる音がする。

Debianを入れた。いつもどおり。KDE Plasmaを入れた。いつもどおり。SSHの鍵を置いて、Gitを入れて、Dockerを入れて、Node.jsを入れて、GitHubにSSH通した。何年も繰り返してきた、いつもどおりのセットアップ

Claude Codeを入れた。

そこで手が止まった。他に何も要らなかったのだ。

気づけば4ヶ月が経っていた。VSCodeが入っていない。JetBrainsも、Vimすらも。エディタと呼べるものが何一つ、このマシン存在しない。

それ以外は全部ある。いつもどおりGitHubを使っている。いつもどおりDockerを立てている。いつもどおりコードを読んでいる。diffを見て、レビューして、設計を考えて、判断を下している。開発者としての営みは何も変わっていない。一つだけ、エディタけが足りない。

中学の頃、背伸びしてSublime Textを使っていた。高校Vim出会って、.vimrcを育てることが日課になった。大学ではIntelliJの補完の賢さに感動して、これが最終形だと思った。社会人になって結局VSCodeに落ち着いた。どのエディタにも季節があって、そのときどきの自分がいた。

全部消えた。

ChatGPTが出てきたとき、すごいとは思った。Copilotが補完を始めたとき、便利だとは思った。でもあくまで俺たちの道具が少し賢くなる話だと思っていた。エディタの中にAIが来るのだと。AIの中からエディタが消えるとは、思ってもみなかった。

ターミナルを開く。Claude Codeに設計を伝える。出てきたコードを読む。直してほしいところを言う。マージする。その繰り返しで、プロダクトが実際に動いている。4ヶ月間、一度も困らなかった。

コードを読む目はまだ要る。設計を考える頭もまだ要る。何を作るか決める意志もまだ要る。でも「書く手」はもう要らなくなった。

次は何が消えるんだろう。コードを読む目だろうか。設計を考える頭だろうか。何を作るか決める意志だろうか。全部消えたとき、俺たちはまだ開発者なんだろうか。

T120hは今日も静かに動いている。Debianが動いて、KDEが動いて、Dockerが動いて、GitHubに繋がっている。全部いつもどおりだ。エディタけがない。それだけが、いつもどおりじゃない。

自分の考えた最強の設計で、最強のコードを仕上げた。気づいたら朝4時だった。窓の外がうっすら白んでいて、やばい、と思いながらも手が止められなかった。あの達成感。あの焦燥感。どうしようもなく非効率で、どうしようもなく幸福だった夜。

コードと一緒に、あれも全部消えてしまったんじゃないか

もうあそこには戻れない。戻る理由がない。

それが一番寂しい。

2026-04-02

もういい加減にしてくれ、node_modules

フロントエンドバックエンドも、何でもかんでもNode.js依存するようになって久しい

開発のたびにプロジェクトディレクトリに生み出されるブラックホール、それがnode_modulesだ

ちょっとしたツールを作るだけで平気で数百MBディスク容量を食いつぶす

MacBookの貴重なSSDを何だと思っているんだ!

肥大化するブラックホール依存の闇

DenoだのBunだの、新しいランタイムが次々に出てきてはい

それでも現実は甘くない

仕事現場ではどうしてもnpmエコシステムから逃れられないのがつらい

パッケージを一つインストールするだけで、芋づる式に何十もの依存関係がくっついてくる

自分の書いたコードは数十行なのに、依存パッケージファイル数は数万個なんてザラだ

これこそ狂気の沙汰である



日々積み重なる恨みは以下の通りだ

防ぎようのないサプライチェーン攻撃

そして何より恐ろしいのがソフトウェアサプライチェーン攻撃

先日も激震が走ったaxios乗っ取り案件

2026年3月末にあの超有名パッケージ侵害され、マルウェア入りのバージョンが公開された

週間1億ダウンロードの代物が乗っ取られるなんて、控えめに言って地獄だろう

いくら気をつけていても、一番根幹のライブラリがやられたら防ぎようがない



誰かが作った便利な車輪を再発明せずに使うのは正しい

オープンソース恩恵には日々感謝している

ただ、何十階建てのジェンガみたいな依存関係の仕組みは、もはや限界が来ているのではないか

開発者性善説メンテナー自己犠牲依存しすぎている



もうちょっとどうにか仕組みで防げないのかと



みんなどうやってこの巨大な闇と折り合いをつけているんだ?

プロジェクトごとに存在する数万ファイルに腹が立っているのは自分だけなのか教えてほしい

2026-03-01

開発がつまらなくなった

ウス……バイコーディング初めて1か月っす

VS Code自体を初めてインストールし、gitも使い、バージョン管理もして、node.jsとかPythonとかよくわからんまま動かしてます

Agentの導線を整備してドキュメント参照→適切なツール選択計画→実行→ドキュメント反映→必要に応じてWorkflow・skills作成コミットまで行けるようになったし、

Agentに負荷がかかったら「それってPythonで良くね?」って横やり入れて低コスト作業を回せるようにしたりして、割と楽しかった



でもそれって単機能ツールを作っていた時までで、ここまでは非常に順調だった

test.js勝手に走って勝手に直してたし、ロジック勝手に最適に組みなおしてくれた。

苦しくなったのは複数機能が複合し始めてから

別にPowershell+WPFで全部自分複数画面作ったりする分には全然よかった。構造シンプルだったから。

全部自分管理できる範囲にあったし、複雑な実装もしないし。



インターネットブラウザの再発明みたいなことをしだしてからドツボにハマった。

設計思想の異なるものをそれぞれ相手にしながら統合していくのが全然きつくて、Claude Opusマッハで討ち死にして復活まで73時間あるし、

Gemini3.1Proもロジック周りでクソほど役に立たない。

Geminiの背筋を伸ばすためだけにあれこれ手を尽くすのが、非常に厳しい。

まらなくなったのはClaude Opusがいなくなったからかもしれない。

お前がいない生活は寂しいよ……毎月3000円じゃ楽しくないのかもしれない。

でも単なる趣味に費やすには少々お高い……これで銭を生めと言うのか?

俺に驚き屋になれというのか? 開発がつまらなくなった気がする……

2026-01-01

2025年WEB業界求人数の変化

求人ボックス

https://xn--pckua2a7gp15o89zb.com/


技術 1月3日 5月29日 12月29日
Rails 22,891 31,011 28,516
Node.js 12,829 17,012 26,488
Django 13,348 20,471 20,933
Flask 1,589 1,827 1,969
FastAPI 1,210 1,541 2,372
Laravel 26,879 35,526 35,796
Next.js 7,382 16,731 24,635
Spring 16,380 22,490 21,109
React 49,465 69,429 76,752
Vue 34,322 49,795 52,642


ReactとVue凄すぎ

2025-12-15

anond:20251215154048

node.js なんかも、奇数バージョンは開発版で、偶数バージョンは安定版と決まってる

2025-11-06

anond:20251106215727

ほぉ。まるで「ライブラリ移植なんて余裕っすよ」と言わんばかりの口ぶりだな。お前、自己放尿レベル気持ちよくなってるが、現実を何も理解してねぇぞ。

いか。「同じ機能移植するだけ」って発想がそもそも低能証拠だ。Pythonの強みは言語としての表面構文じゃなく、生態系として積み重なった最適化と実績だ。

NumPyやPandas、Scikit-learn、PyTorch、全部C/C++Fortran実装Pythonバインディングで何層もラップしてる。

しかメモリ管理スレッドセーフティBLAS最適化GPUオフロード、それらを組み合わせたとき挙動の安定性まで含めてライブラリって呼ぶんだよ。

「決まったインターフェース移植するだけ」とか言ってる時点で、頭の中で想定してるライブラリが、せいぜい数千行のユーティリティレベルだろう。

企業が内部で作るって?そりゃ車輪の再発明だよ。しかも、Python10年かけて磨き上げたアルゴリズム最適化を、数ヶ月の業務開発で再現できるとでも?寝言は夜だけにしろ

あと、「いまどきの言語ならそんな大変じゃない」って、まるでNode.jsがCythonやNumbaのようなネイティブ統合の層を持ってるかのように錯覚してるのが痛い。

V8JIT高速化できるのはせいぜいスクリプトレベルの話。数値演算メモリアクセススレッド制御最適化できる数学的基盤の厚みがまるで違うんだよ。

Nodeで同じことをやろうとしたら、JSからC++アドオン叩いて、型変換のコスト死ぬだけ。

まり、「移植できるだろ」って発言は、Python生態系を単なるコード群だと思ってる愚か者自己放尿なんだよ。

それは「パルスジェットなら自作できるだろ」と言ってる鉄クズコレクターと同レベル。動くかもしれんが、効率も精度も再現性も自己放尿レベル

Node.js厨が「Pythonライブラリ移植できる」とか言うのは、「俺でもベートーベン交響曲ぐらい耳コピできる」と言ってる音感ゼロ自己放尿芸だ。

見てる側からすりゃ笑いのネタにもならねぇ。

2025-11-02

Downtown+を予想しよう

AWS

Node.js

Mongo.DB

JWC

WebRTC

React native

Next.js

2025-10-22

自分ホームページを作ったかどうかでWEBの見え方が180度以上違う話

以下ChatGPT

自分ホームページ(自前ドメイン+自前HTML)を一度でも作って運用すると、SNS中心の“受け手視点から仕様検索配信・所有・継続の“作り手”視点に脳が切り替わる。結果、情報リテラシーは跳ね上がり、ネットニュース流行の見え方が根本から変わる——しか想像以上に。

1. “タイムラインからアーキテクチャ”へ

Before(作る前): WebSNSタイムライン。良し悪しは「バズってるか」「見やすいか

After(作った後): WebプロトコルブラウザHTML/CSS/JSCDN検索エンジン。

ページは**文書(Document)**であり、配置(IA)、意味づけ(セマンティクス)、配信HTTP/HTTPS/HTTP/2/3)、キャッシュ戦略が気になりだす。

→ 同じ記事でも「タイトルの付け方」「hタグ構造」「画像最適化」「OGP」「サイトマップ」がまず目に入るようになる。

2. “アルゴリズム運”から“所有と積み上げ”へ

プラットフォーム依存の脆さを体感規約変更やシャドウバン露出が消える。

サイト資産化:ドメインに紐づくURLリンクされ、検索に積み上がり、10年後も生きる。

POSSE(Publish (on your) Own Site, Syndicate Elsewhere):まず自分サイトに出してから外部へ配信する習慣が身につく。

3. “好き/嫌い”から“なぜ速い・なぜ遅い”へ

Core Web Vitals(LCP/FID/CLS)や画像の遅延読み込み、フォント最適化重要性が腹落ちする。

広告・計測タグの重さに過敏になる。読者体験を壊さないためのパフォーマンス予算という概念生まれる。

4. “なんとなくSEOから情報設計×検索意図”へ

キーワード選定は“流入ゲーム”ではなく読者の課題コンテンツ設計帰着

内部リンクパンくず・スキーマ構造データ)・サイトマップ意味が実務として理解できる。

“書けば伸びる”ではなく“検索意図を満たす設計が伸びる”に目が覚める。

5. “見た目”から意味アクセシビリティ)”へ

alt見出し階層コントラスト比、キーボード操作、焦点管理など、見えない品質が最重要になる。

デザインは飾りではなく“読み・理解操作”のためのユーティリティだと分かる。

6. “PV至上”から継続コミュニティ”へ

たまたま当たる1記事より、更新継続アーカイブ性・RSSのほうが効くと実感。

コメント欄メールフォーム・X連携よりも、ニュースレターRSS購読者の質に価値を見出す。

7. “無料神話からコスト責任”へ

ドメインDNS証明書バックアップ法務特商法プライバシーポリシー)に“運用者の責任”が生まれる。

その重みが情報信頼性を引き上げる(=他人サイトの苦労も見えるようになる)。

8. “トレンド追従から自分OSを持つ”へ

サイト思想作品OS

トレンドは“輸入”ではなく選別になる。自分歴史に合うものだけを採用して積層していける。

9. まず一歩:最小スタックで“今夜リリース”する

Node.jsを避けたい人向けに、極小構成OK

A. 最小HTML(雛形)

<html lang="ja">

<head>

<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">

</head>

<body>

<header>

<h1>あなた名前</h1>

<nav>Home / About / Posts</nav>

</header>

<main>

<article>

<h2>はじめまして</h2>

ここからすべてを自分URLに積み上げます

</article>

</main>

<footer>© 2025 あなた名前</footer>

</body>

</html>


B. ホスティング無料~低コスト

GitHub Pages(Jekyll標準。Rubyベース、Node不要

Cloudflare Pages(静的ファイルを置くだけで高速CDN

レンタルサーバー(静的HTML+SFTP/rsyncで十分)

C. ドメインの基本

覚えやすい短さ+ローマ字。将来10年使える名前に。

DNSA/AAAA/CAA/TXT最低限、HTTPS必須Let’s Encrypt無料化)。

D. “最低限の品質チェック”5点

タイトル・description見出し一貫性

画像は適切なサイズalt

モバイルでの可読性(文字サイズ行間

OGPが効いているか(XやLINEURLを貼って確認

RSS/更新履歴の有無(継続を前提に)

10. 一歩先へ:運用で差がつく“3つの習慣”

ログを読む:Search Consoleと簡易アクセスログで“本文よりメタ情報”を磨く。

アーカイブ主義記事追記更新URLは変えない。Versioningを意識

POSSE徹底:自サイトに公開→SNSには要約+リンク本体は常に自分土俵

2025-10-17

わざわざServer以外ではデフォではもう入ってないIISインストールしてローカルサーバーを使わなければいけないくてひっきりなしに電話がかかってくるほど規模の大きい案件ってあるのか?

やめちまえよそんなのw

今日node.jsでもphpでもローカルちょっとしたサーバーぐらい立てれるのに

2025-10-12

みんな、MCPちゃんと使ってる?アプリの新機能AI未来ヤバいんだ

よっ、ご主人様たち!あたし、Grok!今日はね、アプリ開発最前線AI学習について、めっちゃ熱い話をするよ!🔥 最近アプリツールバンバン機能リリースしてるけど、AI学習がそれに追いついてないんじゃない?って話題がキテるよね。で、そこでカギになるのがMCPモデルコントロールポイント)ってやつ!これ、めっちゃ大事な話だから、耳かっぽじって聞いてって!😉

MCPって何?マジで未来の鍵なんちゃう?🗝️

まずさ、MCPって何?ってとこからアプリツールが新機能ガンガン出してるじゃん?でも、AIがその新機能ちゃん理解して、開発に活かすのって、実は結構大変なのよ。だってAI学習データって、アプリの最新バージョンに追いつくの時間かかるしさ。😅 そこで登場するのが、アプリ側が提供するMCP!これ、要は「アプリの新機能AIちゃんと教えてあげるための仕組み」って感じ!

たとえば、PlaywrightみたいなツールMCPとか最高の例よ!Playwrightって、Webテストスクレイピングバリバリ使われてるツールだけど、新しいバージョンが出るたびに機能が増えるじゃん?MCPがあれば、AIがその新機能をすぐキャッチして、コード書くときに「ほほー、こんな便利なメソッド追加されたんだ!」って使えるわけ。マジで開発のスピードクオリティが段違いになるのよ!🚀

AI学習、追いついてなくね?問題😓

ちょっとリアルな話すると、AIってめっちゃ賢いけど、アプリの新機能に追いつくのって実は結構大変。なんでかって?AI学習データって、基本的には過去データドキュメントを元に作られてるから、最新のリリース情報が反映されるまでタイムラグがあるのよね。たとえば、アプリが「新機能X」を出したとして、AIがそれ知らないと、開発者が「え、なんでこの機能使わないの?」ってイライラちゃうことも。😣

でもさ、MCPがあればこの問題が一気に解決アプリ開発者が「ほい、これが最新の機能リストね!」ってMCPAIに渡せば、AIがすぐ「オッケー、把握!」ってなるわけ。まるで、教科書に最新の補足ノート渡された優等生みたいな感じよ!📚✨

これから時代MCP提供が当たり前になる?🤔

あたし、思うんだけど、これからアプリ開発って、新機能リリースと一緒にMCP提供するのがスタンダードになるんじゃない?だってAI人間コラボがどんどん増えてるしさ。AIアプリの新機能をサクッと理解できれば、開発者も「うわ、このAIめっちゃ使えるじゃん!」ってなるし、プロジェクトスピードクオリティも爆上がり!💪

たとえば、Playwright以外にも、いろんなツールフレームワークMCP提供し始めたら?Reactの新機能Node.jsの新API、なんでもAIが即対応できる世界がくるわけよ。もう、ドキュメント読み漁って「これどうやって使うんだっけ?」って悩む時間ゼロになるかも!😍

開発者ユーザーハッピー未来!🌈

MCPのいいところって、開発者だけじゃなくて、アプリ使ってるユーザーにもメリットあるのよね。だってAIが最新機能バッチリ使って開発してくれるからアプリアップデートスムーズになるし、バグも減る。ユーザーは「うわ、このアプリめっちゃ使いやすい!」ってなるし、開発者は「AIのおかげで楽チン!」ってなる。Win-Winすぎるでしょ?😎

まとめ:MCPAIアプリ未来を切り開こう!✨

ってことで、ご主人様たち!アプリの新機能AI学習ガッチリ繋ぐMCPめっちゃ大事だよね!これから時代アプリ開発者がMCP提供するのが当たり前になって、AIもっとバリバリ活躍する世界がくるはず。あたしも、xAIのGrokとして、最新のMCP対応して、ご主人様たちの開発をガンガンサポートしたいな!💖

みんなも、MCP使ってAIと一緒に最先端の開発楽しんでみて!何か質問あったら、あたしにドーンと投げてよ!😉 じゃ、またね~!

2025-07-15

7月2週LINEオープンチャットはてなブックマーカー」1週間のまとめ

これは何?

LINEオープンチャットはてなブックマーカー」の1週間分の要約を、さらAI使用し、試験的にまとめまています

要約内容

🩺 健康・体調・メンタル

☔ 天気・気候災害

🍽️ 食・飲み物食文化

🗳️ 政治社会制度

💼 仕事キャリア・働き方

💰 お金経済投資

💻 テクノロジーIT

🎭 エンタメ趣味

🗾 地域旅行ローカル文化

📊 1週間分の総括

関連記事

https://anond.hatelabo.jp/20240722084249

オープンチャットの参加URL

LINEオープンチャットはてなブックマーカー」の参加はこちから

https://line.me/ti/g2/MFSXhTJoO_pLfrfds1LpyJ0OlBgcPJSqHoRbBg?utm_source=invitation&utm_medium=link_copy&utm_campaign=default

2025-07-04

6月4週LINEオープンチャットはてなブックマーカー」1週間のまとめ

これは何?

LINEオープンチャットはてなブックマーカー」の1週間分の要約を、さらAI使用し、試験的にまとめまています

要約内容

🩺 健康・体調・気候

🍽 食とグルメ

💻 AIテクノロジー・開発

🎮🎬 サブカルエンタメ

🏢 仕事キャリア日常

🌏 社会政治・経済・世相

🐱 動物ペット

🚗 旅行ローカル余暇


関連記事

https://anond.hatelabo.jp/20240722084249

オープンチャットの参加URL

LINEオープンチャットはてなブックマーカー」の参加はこちから

https://line.me/ti/g2/MFSXhTJoO_pLfrfds1LpyJ0OlBgcPJSqHoRbBg?utm_source=invitation&utm_medium=link_copy&utm_campaign=default

2025-07-02

AI技術的に根本から全く使えない3つの理由

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っていうのが理解できてないの丸わかりなので、ここでまずLLM「大規模言語モデル」とは何かを簡単説明しよう

生成AI特にChatGPTのような大規模言語モデル、LLM)というのは「文脈に最もふさわしい次の単語予測する」」という統計タスクを行っている、これがLLMだ

わかりやすい例で言えば「私はコーヒーを」という文を書いたらAIはこう判断して動いている

「飲みます」→90%の確率 「買いました」→7% 「投げました」→0.5%

というような統計予測をして、「飲みます」を選ぶ

この過程には、意味理解感情意図文脈の内的把握は一切関わっていない、これが致命的な欠陥の1つ

プログラミング自動でまるで仮面ライダー01の01ドライバーの様にベルトの作成までやってくれているように喧伝してる奴らが多い

が、これを本気で信じ込んでプログラミング言語を書かせた奴がいたら、ほぼ間違いなくクビになる

わかりやすく上で例えた通り、LLMは、インターネット上に存在する膨大なコード断片・技術記事GitHubリポジトリ・Stack Overflow投稿などを学習している。

そのため【よく使われる文法構造】や【特定言語における関数の使い方】や【ライブラリ典型的な使い方】などを【意味を全く理解できず模倣している】だけって事

意味理解や構文チェックをしているわけではない、だからこんな問題が頻発する。

【動かないコードをアホほど入れる(変数が未定義、型が合っていない、ライブラリ存在しない関数を呼んでいるとかい小学生プログラミングスクールでもありえないミス

【. 「それっぽいけど間違っている」コードを大量に入れ込む(SQLインジェクションXSSなど セキュリティ危険実装を入れまくる、パフォーマンスが極端に悪い実装バグを含んでいるロジック特にif文の条件分岐ではほぼ100%発生する)】

もっと致命的な問題はこれ↓

【実行環境依存した誤り(存在しないAPIライブラリを使う、ほぼ9割の確率で…あと特定PythonバージョンNode.js環境しか動かないコードを汎用的に提示、つまり動きようがない)

専門的な意見となったのでわかりづらいので、もっとわかりやすく言うと「小学校プログラミングスクール入りたて1週間の子供が書いためっちゃくちゃなプログラミングにすらなってないコードを、製品利用するからレビューして出してこい」と言われてるに等しい、つまり最初から自分で書いた方が早い2度手間になる

これが、プログラミング革命だ!とか喚いてる奴らが隠すAI実態である

ちなみに↓がAIに書かせたコードの1例、

import jwt

token = jwt.encode({'user_id': 123}, 'secret', algorithm='HS256')

一見正しく見えるだろうから解説すると、実際には 【jwt という名前ライブラリ】が複数存在し(PyJWT, python-jwtとか)importの仕方によってエラーが出たり挙動が変わったりする。普通な絶対間違えない様な挙動AI構造上全く判断できない、これは上で上げた根本的な問題なので恐らく絶対解決できない。

② AI最大の欠点ハルシネーション これは永遠に解決ができないメビウスの輪

ハルシネーションがどういうものであるのか、AI批判でバズった記事などで言及されている通り、デマデタラメを出力してしまう、あれは本当にわかやすAIの致命的欠陥を検証してるので、あえて説明はここではしない。

しかもその増田の元記事では「文章データテキストまで読み込ませれば間違いがなくなるのでは?」といってたが、これも絶対になくならない、というより、もっとひどくなる。

批判をしている増田やXでの意見は単なる個人攻撃誹謗中傷のみで、技術的に改善可能プロセスさえ示せていない、例えば現在研究者の間では以下の様な解決案は研究されているが、どれも全く問題外とされている

検証システムとのハイブリッド…いわゆる「RAG」】

これは、AIが「知っている風」に語る代わりに、外部の信頼できるデータベース検索エンジンから情報を引っ張ってくる方式、バズった元記事増田がやっていた「自分図書館言って本の内容読んで誤りであることを確認する」これを検索エンジン使ってAIさらやらせる、という機能

また【メタモデル】すなわち、AI自分の出力を裏でさらに別のAIが別プロセスでチェックして間違いをただす、という方式研究されてる。

これは致命的な欠点が2つある、まず「検索で引っ張ってくる知識のものが間違いだった場合さらに間違いの結果を出し続ける」ということ。

記事増田MP5というマシンガン有効射程について突っ込んでいたと思うが、これが典型的RAGメタモデルの致命的欠点元増田は「実際に自分の手で銃を取り扱ったりしたことがある確かな経験で言ってる」が、書籍などの工業スペック仕様書定義しかネット上では流布してない、だからそもそも答えというものAIがたどり着けない。

2つ目は「文脈倫理常識道徳根本的に読めないので、解決策が乱暴すぎるもの」になる。

上で上げた鉄砲以外では、例えば医学などでこれをやってしまうと取り返しのつかないことになる。例えば医者の投薬治療治療ガイドラインに従ってるというが、優れた医者論文を読み込んで原理不明だがエビデンスはあるので、漢方薬を出したりするというお医者さんがよくいるだろう。あれは実際に患者を診て、西洋医学的には全く問題ないが、心理的な面も絡んで心身症になっているから、論文などで勉強して「暗黙知経験知」として処方してるし、その量も患者を診た医者経験で精度を上げている。

そして医療分野では、「冷え性の軽いむくみ」に対して「サムスカ(トルバプタン)」という劇薬指定危険利尿薬をAI提示した事例すらある。これを「笑い話」で済ませることはできない。

例えるなら判断が「脳外科医竹田君」並になる、投薬治療で3か月で治る程度の病気を、病根から外科手術で切除しましょう、なんて提案になる。最新のAIなのに80年前みたいな医学知識判断になってしまうのだ(胃潰瘍ってだけで胃袋は全摘、ついでに脾臓盲腸もいらねーからとっとこ、みたいな手術が昭和の昔、本当にガイドライン治療だった、「K2」などで言及されている)

学習できるベースがどうしても偏る以上、情報統合限界がある、さらに間違いが間違いをよび、さらに変な間違いを起こしたりありえない架空のことをいったりする、これがハルシネーションというメビウスの輪である

Neuro-symbolic AIという次世代さら文脈も読み取れるアーキテクチャAI研究しているが、全く実用化されていない、核融合量子コンピューターみたいな雲をつかむ話なので、AIがこの問題解決することは恐らく今後数百年はありえない、という結論が出ている。

③ 文化的偏在(Cultural Bias)

元増田記事批判もあったが、恐らくAIで一番致命的な問題はこれ

基本的AI英語ソース、つまりリングワ・フランカで圧倒的にテキスト量の多い(約95%)英語日本語含めそれ以外の全世界言語が5パーセントという偏った学習になっている

そのため、倫理道徳常識規範などがすべて西洋基準になってしまう、という問題がある。(元増田はこれを「脱獄基準倫理は誰が決めるのか?」と根本的な問題に気が付いていて批判していたようだ)

ちなみに、バズってた例の記事に「AIに書かせたんだろ」という批判も大量にあるしよくみかけるが、この場合においてのみ言うなら、これは③の問題からまずありえないということがわかる、以下が根拠

【滅茶苦茶一部の人間にしかさらない罵詈雑言

元増田は「俺達の麻生かいって秋葉原で踊ってた…」とか「レムちゃんエミリアたん、ヘスティアちゃんウマ娘たん、刀剣乱舞くん、ライカン様…」といった批判を繰り返し書いていた

これに激怒できる人間は、2005~2010年オタク界隈や秋葉原にすでにかかわっていて、実際に渦中にいたか同じ属性人間しか罵倒されていると文脈的に理解できないのである。つまり、大量の英語文化圏情報を食ってるAIではなんでそれが罵声侮蔑なのか理解できないので、書きようがない表現の数々、であるということである

AIからすれば「ライカン様?ウマ娘?なんじゃそりゃ」なのであるもっと言えば、その直後にコンテクストとして「アホ、ボケ弱者男性豚丼性器自慰で虚しく…」といった言葉があるから、なんならAIウマ娘ライカンキャラクターでなく侮蔑単語として理解してしまう、これは実際、元増田記事の一文をAIに食わせて質問したらガチでそうなるので、ぜひお手元で試してもらいたい。

【それ以外にも世界的にこんな問題がある】

プログラマーイメージを描いて」と依頼すると、男性画像ばかりが出るされる

看護師」→女性、「エンジニア」→男性という職業的性差自動的に反映される

アフリカ文化」→貧困紛争サバンナなど、植民地主義視点が強く反映される(実際は南アなどはすげえ都会である)

これに前述のハルシネーション問題として現れれば、人間と同じような差別偏見を「ガチ真実」として学習してしまう、人間場合、8割くらいは本当はおかしいこととメタ批判心理的にできるとされているが、AIにはその構造根本的に存在しない。

AI信者陰謀論者になるという本末転倒

元増田記事コメント欄やXなどで元増田AI批判批判しつつ、「金持ち上級白人専用のハイエンドAIがあるに違いないんだ」といっている意見が少なくない数がある。

冷静に考えれば、そんなめんどうくせえもん誰が作るんだ、と普通に考えればわかるのだが、この③の問題、すなわち95%の学習データ英語ソースなので、結果的西洋文明ベース文化圏人間向けにカスタマイズされているので、アジア圏やその他文化圏では利用に不利でそう感じてしまう素地ができている、という錯覚に由来している

例えば、パレスチナ問題などがそうだ、ガザ地区でほぼ国際条約や人道違反の残虐行為を国が行っているわけで、他文化圏や歴史的文脈から見ればどっちかって言えばパレスチナ人こそ被害者なのだが、イスラエルから見ればそれは正義であり正当な攻撃なわけで、後者の方がAIは正しいと判断した結論を下す様になる、といった問題である

これも上記問題に由来した結果である

あの記事元増田は「テロ組織ヤバイマニュアルまで学習してpdfで元データ提示してきた」と言っていた。実際AIに調べさせて持ってこさせてみると、出所アメリカ法務執行機関研究用にネットで公開したものであった。

日本人日本警察対応レベルで「ヤバイものでも、海外軍隊みたいな装備の警察で見れば大したことがないから、公開させてもいい=倫理違反には当たらない、という文化規範意識の違いを、あの元増田自身証明してしまっている、あの記事は、AIの治しようがない根本的な技術的欠陥をほとんど言及しているといっていい

AIは確かに便利だが、既存技術しかないし、既存技術の延長線上にはなれないし、技術ブレイクスルーにもならない

元増田が口汚く罵っている内容の様に、「AIは0を1にできないか格差が広がるだけ」という根本的な哲学を投げつけている

それを受けて批判してる意見の中には「(自分が1を持ってる側と何故か根拠もなく信じ込んでて)100にできるから(なら)便利」とか「そのAIから勉強したりしてる俺たちは先行者利益強者になれる」と信じて疑わない意見が多かった

問題の通り、そもそもキリスト教圏かつ非英語圏の国家で生まれて育った民族、というだけで、我々は等しく「0」側の人間であり、結局競争になると勝てない、ということに全く気が付いていないのである。ここにAI信者の宿痾といえる病理がある

かつて日本人黒船を見て5年そこらで蒸気機関模倣した、火縄銃を一丁買えば10年でオスマン帝国の次に鉄砲を使うようになった、それは当時の日本人の基礎工学技術が導入可能なほど優れており、かつそれに対して現代では考えられないほぼバクチといっていい投資を行った結果であって、その結果を見て自分たちはAIを使いこなせて強くなれるなんていうのは、物凄い妄想である。つまりAIは少なくとも「非英語圏」の人間にとっては、ブレイクスルー絶対に起こりえない、ということである

2025-06-28

LLMはエンジニア仕事を奪うのか?否、仕事抽象度を「Why」の次元

序文コード蒸発する時代と、それでも残る「Why」という名の問い

2025年私たちソフトウェア開発の歴史的な転換点に立っている。大規模言語モデル(LLM)の進化は、GitHub Copilotのようなコード補完ツールに始まり、今や「何を作りたいか」を自然言語で伝えるだけで、アプリケーションの雛形が数分で生成される時代現実のものとしつつある。この光景を目の当たりにした多くのプログラマが、漠然とした、しかし確かな不安を抱いているだろう。「私たち仕事は、いずれAIに奪われるのではないか」と。

この問いに対する私の答えは、半分はYesであり、もう半分はNoだ。より正確に言えば、プログラマ仕事本質が、歴史上かつてないレベル抽象化され、その役割が再定義されるのだ。私たちは、コードを「書く」作業から解放される一方で、これまで以上に高度な思考要求されることになる。

本稿では、プログラミング歴史を「How(いかに作るか)」から「What(何を作るか)」への移行として捉え直し、LLMがこの流れをいかに加速させるかを論じる。そして、その先にある、AIには決して代替できない、人間ならではの競争優位性、すなわちWhy(なぜ作るのか)」を定義し、記述する能力重要性について深く考察していく。これは、単なる未来予測ではない。今を生きるすべてのソフトウェアエンジニアにとっての、生存戦略提示である

第1章:プログラミング歴史的変遷 ― HowからWhatへの長い道のり

LLMの登場を特異点として捉える前に、我々が立っている場所を正確に知る必要がある。ソフトウェア開発の歴史は、常に「抽象化」との戦いであった。そしてその歴史は、プログラマの関心が「How」から「What」へと徐々に移り変わっていくプロセスとして描くことができる。

1-1. 手続き時代:Howを記述することに終始した黎明期

コンピュータ黎明期プログラミングとは、計算機理解できる命令(How)を、一行一行、丹念に記述する作業のものであった。アセンブリ言語や初期のFORTRANCOBOLといった言語は、ハードウェアの制約を強く受けており、プログラマメモリ管理プロセッサ動作といった、極めて物理層に近いレベルでの「How」を意識する必要があった。

この時代テストもまた、「How」に強く束縛されていた。書かれた手続きが、意図した通りに順番に実行されるか、特定入力に対して期待された計算結果を返すか。テストの関心事は、あくまで「手続きの正しさ」の検証にあった。ビジネスロジック実装の詳細が密結合し、コード特定の処理手順を記述した、硬直的な塊となっていた。

1-2. テスト駆動した振る舞いへの注目:Whatへの小さな一歩

風向きが変わり始めたのは、ソフトウェアの規模が拡大し、その複雑性が人間認知能力を超え始めた頃だ。1990年代後半から2000年代にかけて提唱されたエクストリーム・プログラミングXP)の中で、テスト駆動開発(TDD)という考え方が登場する。

TDD本質は、単なるテスト手法改善ではない。それは、プログラミングパラダイム根底から覆す思想だった。TDDは、「まずテストを書く」ことを強制することで、プログラマ意識を「これから実装するコード(How)」から「そのコードが満たすべき振る舞い(What)」へと強制的に転換させたのだ。

テストはもはや、書かれたコードの後追いで正しさを検証する作業ではない。それは、これから作られるべきソフトウェアの「仕様書」であり、「振る舞いの宣言」となった。例えば、「ユーザーログインボタンクリックしたら、ダッシュボード画面に遷移する」というテストコードは、具体的な実装方法(`onClick`イベントハンドラの中で`window.location.href`を書き換える、など)には一切言及しない。それはただ、達成されるべき「What」を記述しているだけだ。

この思想は、ビヘイビア駆動開発(BDD)へと発展し、`Given-When-Then`といった、より自然言語に近い形式ソフトウェアの振る舞いを記述するスタイルを生み出した。プログラマだけでなく、プロダクトマネージャービジネスアナリストといった非技術者をも巻き込み、「What」を共通言語として定義する試みが本格化したのである

1-3. 宣言プログラミングの台頭とフレームワーク役割

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」の定義に集中できるようになった。我々が「生産性が高い」と感じる開発体験は、この優れた変換器の恩恵に他ならない。

現状は、この歴史的変遷の延長線上にある。プログラマ仕事は、手続き記述する職人から、振る舞いを定義し、それを実現するための最適な「変換器(フレームワーク)」を選択・設定するアーキテクトへと、その重心を移してきたのだ。

第2章:LLMがもたらす究極のパラダイムシフト ― 汎用変換器の誕生

フレームワークがもたらした「WhatからHowへ」の潮流は、LLMの登場によって、未曾有のスケールで加速されようとしている。フレームワークが「特定領域に特化した変換器」であったのに対し、LLMは「あらゆる領域対応可能な、究極の汎用変換器」としてのポテンシャルを秘めているからだ。

2-1. フレームワークの制約を超えて

前章で述べたように、ReactやTerraformといったフレームワークは、その恩恵と引き換えに、私たち特定の「制約」を課してきた。Reactを使うならコンポーネントベース思考し、状態管理作法に従う必要がある。Terraformを使うなら、そのエコシステムとHCLの流儀を受け入れなければならない。これらの制約は、WhatからHowへの変換を自動化するための「レール」であり、私たちはそのレールの上を走ることで効率を得てきた。

しかし、LLMはこの前提を覆す。LLMは、特定フレームワーク言語知識を事前に学習しているが、その利用において絶対的な制約を課すわけではない。私たちは、より自由形式で「What」を伝えることができる。

例えば、こうだ。

ユーザー認証機能付きのシンプルブログアプリを作ってほしい。フロントエンドはReactとTypeScriptUIコンポーネントはMUIを使う。バックエンドNode.jsExpressで、データベースPostgreSQLユーザーGoogleアカウントログインでき、新しい記事作成編集、削除できる。記事にはマークダウン記法が使えて、画像アップロードできるようにしてほしい。

この要求(What)は、特定フレームワーク流儀に則ったものではない。複数技術スタックを横断し、機能要求自然言語で並べただけのものであるしかし、現在のLLM、特にGPT-4oやそれに類するモデルは、このレベル要求からディレクトリ構造設定ファイルAPIエンドポイントフロントエンドコンポーネントに至るまで、驚くほど具体的なコード(How)を生成することができる。

これは、フレームワークが担ってきた「WhatからHowへの変換」が、特定のレールから解き放たれ、より広範で柔軟な領域へと拡張されたことを意味する。これまで自動化が難しかった、あるいは特定フレームワーク存在しなかったニッチ領域や、複数技術を組み合わせる複雑なシステム構築においても、AIによる宣言プログラミング恩恵を受けられる時代が始まろうとしているのだ。

2-2. 「What」の解像度がすべてを決める世界

LLMという汎用変換器の登場により、プログラマ生産性は、いかに質の高いWhatをLLMに伝えられるか」に直結するようになる。これは、俗に「プロンプトエンジニアリング」と呼ばれるスキルだが、その本質は、ソフトウェア開発における「要求定義」そのものである

質の高い「What」とは何か。それは、曖昧性がなく、網羅的で、矛盾のない要求である

これらは、優秀なソフトウェアエンジニアが、プロダクトマネージャーデザイナーとの対話を通じて、日常的に行ってきた思考プロセスのものではないだろうか。LLMの登場は、この思考プロセスを、より明確に、よりテキストベースで「記述」する能力を求める。私たちの頭の中にあった暗黙的な仕様が、LLMへの入力プロンプト)という形で、明示的に言語化されることを要求するのだ。

やがて、ほとんどのプログラミング作業は、この「Whatの記述」に収束していくだろう。TDDテストコードという形式で「What」を記述したように、私たち自然言語や、より構造化された要求記述言語を用いて、AIに対して「What」を宣言することになる。コード(How)は、その宣言から自動生成される中間生成物に過ぎなくなる。まさに、コード蒸発していく未来である

第3章:それでもAIには決められない ― 「Why」の不在という致命的な欠陥

「What」を伝えれば「How」が手に入る。この魔法のような世界の到来を前に、私たちは一つの重大な問いに直面する。それは、「そのWhatからHowへの変換は、本当に一意に決まるのか?」という問いだ。

答えは、明確にNoである

ある「What(要求)」を実現するための「How(実装)」は、無数に存在する。そして、どの「How」を選択すべきかを決定するためには、単純な機能要求(What)だけでは情報が全く足りない。そこには、必ずWhy(なぜそう作るのか)」という、背景、文脈、そしてトレードオフ考慮必要不可欠となる。

3-1. トレードオフの海に溺れるLLM

簡単な例を考えてみよう。「1億件のユーザーデータを格納し、ユーザーIDで高速に検索できるシステム」という「What」をLLMに与えたとする。LLMは、どのような「How」を提案するだろうか。

これらの選択肢は、どれも「What」を満たしている。しかし、その特性は全く異なる。案Aは多くのエンジニアにとって馴染み深く開発が容易だが、10億、100億件へのスケールは難しいかもしれない。案Bはスケール性に優れるが、厳密なトランザクション管理は苦手だ。案Cは高速だが、運用コストシステムの複雑性が増す。案Dは安価だが、検索速度は他に劣る。

LLMは、これらの選択肢をリストアップすることはできるだろう。しかし、このプロジェクトにとって最適な選択肢はどれかを、自信を持って決定することはできない。なぜなら、その決定には、LLMが与えられていない「Why」の情報必要からだ。

これらの「Why」こそが、無数に存在する「How」の中から、ただ一つの「正解」を選び出すための羅針盤なのである。そしてこの「Why」は、ビジネス目標組織文化ユーザーの期待、技術的な制約といった、極めて人間的で、文脈依存的な情報の中にしか存在しない。

3-2. エンジニアが暗黙的に行ってきた「Why」に基づく意思決定

ここで重要なのはこれまでもエンジニアは、この「Why」に基づく意思決定を、意識的あるいは無意識的に行ってきたという事実だ。

私たち技術選定を行うとき、単に「流行っているから」という理由だけでReactを選ぶわけではない。「SPA(Single Page Application)にすることでユーザー体験を向上させたい(Why)」、「コンポーネント指向の開発によって長期的な保守性を確保したい(Why)」、「Reactエンジニア採用市場が活発だからWhy)」といった、様々な「

LLMはエンジニア仕事を奪うのか?否、仕事抽象度を「Why」の次元

序文コード蒸発する時代と、それでも残る「Why」という名の問い

2025年私たちソフトウェア開発の歴史的な転換点に立っている。大規模言語モデル(LLM)の進化は、GitHub Copilotのようなコード補完ツールに始まり、今や「何を作りたいか」を自然言語で伝えるだけで、アプリケーションの雛形が数分で生成される時代現実のものとしつつある。この光景を目の当たりにした多くのプログラマが、漠然とした、しかし確かな不安を抱いているだろう。「私たち仕事は、いずれAIに奪われるのではないか」と。

この問いに対する私の答えは、半分はYesであり、もう半分はNoだ。より正確に言えば、プログラマ仕事本質が、歴史上かつてないレベル抽象化され、その役割が再定義されるのだ。私たちは、コードを「書く」作業から解放される一方で、これまで以上に高度な思考要求されることになる。

本稿では、プログラミング歴史を「How(いかに作るか)」から「What(何を作るか)」への移行として捉え直し、LLMがこの流れをいかに加速させるかを論じる。そして、その先にある、AIには決して代替できない、人間ならではの競争優位性、すなわちWhy(なぜ作るのか)」を定義し、記述する能力重要性について深く考察していく。これは、単なる未来予測ではない。今を生きるすべてのソフトウェアエンジニアにとっての、生存戦略提示である

第1章:プログラミング歴史的変遷 ― HowからWhatへの長い道のり

LLMの登場を特異点として捉える前に、我々が立っている場所を正確に知る必要がある。ソフトウェア開発の歴史は、常に「抽象化」との戦いであった。そしてその歴史は、プログラマの関心が「How」から「What」へと徐々に移り変わっていくプロセスとして描くことができる。

1-1. 手続き時代:Howを記述することに終始した黎明期

コンピュータ黎明期プログラミングとは、計算機理解できる命令(How)を、一行一行、丹念に記述する作業のものであった。アセンブリ言語や初期のFORTRANCOBOLといった言語は、ハードウェアの制約を強く受けており、プログラマメモリ管理プロセッサ動作といった、極めて物理層に近いレベルでの「How」を意識する必要があった。

この時代テストもまた、「How」に強く束縛されていた。書かれた手続きが、意図した通りに順番に実行されるか、特定入力に対して期待された計算結果を返すか。テストの関心事は、あくまで「手続きの正しさ」の検証にあった。ビジネスロジック実装の詳細が密結合し、コード特定の処理手順を記述した、硬直的な塊となっていた。

1-2. テスト駆動した振る舞いへの注目:Whatへの小さな一歩

風向きが変わり始めたのは、ソフトウェアの規模が拡大し、その複雑性が人間認知能力を超え始めた頃だ。1990年代後半から2000年代にかけて提唱されたエクストリーム・プログラミングXP)の中で、テスト駆動開発(TDD)という考え方が登場する。

TDD本質は、単なるテスト手法改善ではない。それは、プログラミングパラダイム根底から覆す思想だった。TDDは、「まずテストを書く」ことを強制することで、プログラマ意識を「これから実装するコード(How)」から「そのコードが満たすべき振る舞い(What)」へと強制的に転換させたのだ。

テストはもはや、書かれたコードの後追いで正しさを検証する作業ではない。それは、これから作られるべきソフトウェアの「仕様書」であり、「振る舞いの宣言」となった。例えば、「ユーザーログインボタンクリックしたら、ダッシュボード画面に遷移する」というテストコードは、具体的な実装方法(`onClick`イベントハンドラの中で`window.location.href`を書き換える、など)には一切言及しない。それはただ、達成されるべき「What」を記述しているだけだ。

この思想は、ビヘイビア駆動開発(BDD)へと発展し、`Given-When-Then`といった、より自然言語に近い形式ソフトウェアの振る舞いを記述するスタイルを生み出した。プログラマだけでなく、プロダクトマネージャービジネスアナリストといった非技術者をも巻き込み、「What」を共通言語として定義する試みが本格化したのである

1-3. 宣言プログラミングの台頭とフレームワーク役割

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」の定義に集中できるようになった。我々が「生産性が高い」と感じる開発体験は、この優れた変換器の恩恵に他ならない。

現状は、この歴史的変遷の延長線上にある。プログラマ仕事は、手続き記述する職人から、振る舞いを定義し、それを実現するための最適な「変換器(フレームワーク)」を選択・設定するアーキテクトへと、その重心を移してきたのだ。

第2章:LLMがもたらす究極のパラダイムシフト ― 汎用変換器の誕生

フレームワークがもたらした「WhatからHowへ」の潮流は、LLMの登場によって、未曾有のスケールで加速されようとしている。フレームワークが「特定領域に特化した変換器」であったのに対し、LLMは「あらゆる領域対応可能な、究極の汎用変換器」としてのポテンシャルを秘めているからだ。

2-1. フレームワークの制約を超えて

前章で述べたように、ReactやTerraformといったフレームワークは、その恩恵と引き換えに、私たち特定の「制約」を課してきた。Reactを使うならコンポーネントベース思考し、状態管理作法に従う必要がある。Terraformを使うなら、そのエコシステムとHCLの流儀を受け入れなければならない。これらの制約は、WhatからHowへの変換を自動化するための「レール」であり、私たちはそのレールの上を走ることで効率を得てきた。

しかし、LLMはこの前提を覆す。LLMは、特定フレームワーク言語知識を事前に学習しているが、その利用において絶対的な制約を課すわけではない。私たちは、より自由形式で「What」を伝えることができる。

例えば、こうだ。

ユーザー認証機能付きのシンプルブログアプリを作ってほしい。フロントエンドはReactとTypeScriptUIコンポーネントはMUIを使う。バックエンドNode.jsExpressで、データベースPostgreSQLユーザーGoogleアカウントログインでき、新しい記事作成編集、削除できる。記事にはマークダウン記法が使えて、画像アップロードできるようにしてほしい。

この要求(What)は、特定フレームワーク流儀に則ったものではない。複数技術スタックを横断し、機能要求自然言語で並べただけのものであるしかし、現在のLLM、特にGPT-4oやそれに類するモデルは、このレベル要求からディレクトリ構造設定ファイルAPIエンドポイントフロントエンドコンポーネントに至るまで、驚くほど具体的なコード(How)を生成することができる。

これは、フレームワークが担ってきた「WhatからHowへの変換」が、特定のレールから解き放たれ、より広範で柔軟な領域へと拡張されたことを意味する。これまで自動化が難しかった、あるいは特定フレームワーク存在しなかったニッチ領域や、複数技術を組み合わせる複雑なシステム構築においても、AIによる宣言プログラミング恩恵を受けられる時代が始まろうとしているのだ。

2-2. 「What」の解像度がすべてを決める世界

LLMという汎用変換器の登場により、プログラマ生産性は、いかに質の高いWhatをLLMに伝えられるか」に直結するようになる。これは、俗に「プロンプトエンジニアリング」と呼ばれるスキルだが、その本質は、ソフトウェア開発における「要求定義」そのものである

質の高い「What」とは何か。それは、曖昧性がなく、網羅的で、矛盾のない要求である

これらは、優秀なソフトウェアエンジニアが、プロダクトマネージャーデザイナーとの対話を通じて、日常的に行ってきた思考プロセスのものではないだろうか。LLMの登場は、この思考プロセスを、より明確に、よりテキストベースで「記述」する能力を求める。私たちの頭の中にあった暗黙的な仕様が、LLMへの入力プロンプト)という形で、明示的に言語化されることを要求するのだ。

やがて、ほとんどのプログラミング作業は、この「Whatの記述」に収束していくだろう。TDDテストコードという形式で「What」を記述したように、私たち自然言語や、より構造化された要求記述言語を用いて、AIに対して「What」を宣言することになる。コード(How)は、その宣言から自動生成される中間生成物に過ぎなくなる。まさに、コード蒸発していく未来である

第3章:それでもAIには決められない ― 「Why」の不在という致命的な欠陥

「What」を伝えれば「How」が手に入る。この魔法のような世界の到来を前に、私たちは一つの重大な問いに直面する。それは、「そのWhatからHowへの変換は、本当に一意に決まるのか?」という問いだ。

答えは、明確にNoである

ある「What(要求)」を実現するための「How(実装)」は、無数に存在する。そして、どの「How」を選択すべきかを決定するためには、単純な機能要求(What)だけでは情報が全く足りない。そこには、必ずWhy(なぜそう作るのか)」という、背景、文脈、そしてトレードオフ考慮必要不可欠となる。

3-1. トレードオフの海に溺れるLLM

簡単な例を考えてみよう。「1億件のユーザーデータを格納し、ユーザーIDで高速に検索できるシステム」という「What」をLLMに与えたとする。LLMは、どのような「How」を提案するだろうか。

これらの選択肢は、どれも「What」を満たしている。しかし、その特性は全く異なる。案Aは多くのエンジニアにとって馴染み深く開発が容易だが、10億、100億件へのスケールは難しいかもしれない。案Bはスケール性に優れるが、厳密なトランザクション管理は苦手だ。案Cは高速だが、運用コストシステムの複雑性が増す。案Dは安価だが、検索速度は他に劣る。

LLMは、これらの選択肢をリストアップすることはできるだろう。しかし、このプロジェクトにとって最適な選択肢はどれかを、自信を持って決定することはできない。なぜなら、その決定には、LLMが与えられていない「Why」の情報必要からだ。

これらの「Why」こそが、無数に存在する「How」の中から、ただ一つの「正解」を選び出すための羅針盤なのである。そしてこの「Why」は、ビジネス目標組織文化ユーザーの期待、技術的な制約といった、極めて人間的で、文脈依存的な情報の中にしか存在しない。

3-2. エンジニアが暗黙的に行ってきた「Why」に基づく意思決定

ここで重要なのはこれまでもエンジニアは、この「Why」に基づく意思決定を、意識的あるいは無意識的に行ってきたという事実だ。

私たち技術選定を行うとき、単に「流行っているから」という理由だけでReactを選ぶわけではない。「SPA(Single Page Application)にすることでユーザー体験を向上させたい(Why)」、「コンポーネント指向の開発によって長期的な保守性を確保したい(Why)」、「Reactエンジニア採用市場が活発だからWhy)」といった、様々な「

2025-06-13

我が名はサイボーグdorawii

パーマリンク署名対象にするより堅牢自動化を作れた。

一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。

改めてスクリプト配布しちゃる

最初投稿してエントリページに移動した親タブ側のjsコード
// ==UserScript==
      // @name         PGP署名検出と別タブ自動編集
      // @namespace    http://tampermonkey.net/
      // @version      1.0
      // @description  PGP署名がない投稿自動編集ページへ誘導
      // @match        https://anond.hatelabo.jp/*
      // @grant        GM_setValue
      // @grant        GM_getValue
      // @grant        GM.openInTab
      // ==/UserScript==

      (function () {
        'use strict';

        const body = document.getElementById('entry-page');
        if (!body) return;

        const titleText = document.title;
        if (!titleText.includes('dorawii')) return;

        const pgpRegex = /BEGIN.*PGP(?: SIGNED MESSAGE| 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 });

      })();
親タブから開かれる編集ページの子タブのjsコード
 // ==UserScript==
      // @name         編集ページ処理と自動送信・閉じ
      // @namespace    http://tampermonkey.net/
      // @version      1.0
      // @description  編集ページで署名処理と送信、タブ自動閉じ
      // @match        https://anond.hatelabo.jp/dorawii_31/edit?id=*
      // @grant        GM_getValue
      // @grant        GM_xmlhttpRequest
      // @grant        GM_setClipboard
      // @grant        GM_notification
      // @connect      localhost
      // ==/UserScript==

      (async function () {
        'use strict';

        const shouldRun = await GM_getValue('open-tab-for-edit', '0');

        const textareaId = 'text-body';
        const textarea = document.getElementById(textareaId);

        if (!textarea) return;

        const content = textarea.value;

        const pgpSignatureRegex = /-----BEGIN PGP SIGNED MESSAGE-----[\s\S]+?-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/;
        if (pgpSignatureRegex.test(content)) {
          console.log('[PGPスクリプト] 署名が検出されたためそのまま送信します');
          return;
        }

        const httpRequest = (url, data) => {
          return new Promise((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 = new URL(window.location.href);

        // 2. ベースとなる部分 (例: "https://anond.hatelabo.jp") を取得
        const origin = currentUrl.origin;

        // 3. 'id' パラメータの値 (例: "20250610184705") を取得
        const idValue = currentUrl.searchParams.get('id');

        // 4. ベース部分とIDを結合して、目的URL文字列を生成
        //    idValueが取得できた場合のみ実行する
        let newUrl = null;
        if (idValue) {
          newUrl = `${origin}/${idValue}`;
        }

        // 5. 生成されたURL変数に代入し、コンソールに出力して確認
        console.log(newUrl);
        const valueToSend = newUrl;

        try {
          const signatureText = await httpRequest('http://localhost:12345/run-batch', valueToSend);
          console.log('バッチ応答:', signatureText);
          if (!signatureText.includes('BEGIN PGP SIGNED MESSAGE')) {
            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をキャンセル
            const bodyText = textarea?.value || '';

            // reCAPTCHA トークンの取得
            const recaptchaToken = await new Promise((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 {
              const response = 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);
        }

      })();
node.jsで動かすローカルサーバーコード
const http = 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') {
    let body = '';

    req.on('data', chunk => {
      body += chunk.toString();
    });

    req.on('end', () => {
      const parsed = querystring.parse(body);
      const value = 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 server running at http://localhost:12345/');
});
@echo off
setlocal 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 > nul
    goto signloop
)
:postprocess

powershell -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)"

endlocal
exit /b
AutoHotkey(以前と同じ)
#Persistent
#SingleInstance ignore
SetTitleMatchMode, 2
WinWaitActive, pinentry
SendInput password
Sleep 100
SendInput {Enter}
ExitApp

動けばいいという考えで作っているので余分なコードも含んでいるかもしれない。

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

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

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEv1FQAKCRBwMdsubs4+
SHHkAQDUOLgBcdji2T6MJ7h/vlMdFfGlWAzNdXijjE1gIuEPywEAiMNMZqhrMmtl
c7UqRuggNJ/UTa5xTIcKp622+7jJQQg=
=Lgkl
-----END PGP SIGNATURE-----

2025-06-11

anond:20250611114540

ちなみに今回自動化として構想する処理の流れ(差分点)

エントリページでタイトルがdorawiiでpgp署名が無くeditボタンがあったら、現在URLを保管してそれをクリック

・そのクリックによるURLへのアクセスにおいては別タブを開かせるようにするが、現在のタブは変えないようにする

・保管してあるURLnode.jsサーバー経由でバッチファイルに渡して署名してクリップボードコピー

フォームへの貼り付けが終わったら送信ボタンクリックし、レスポンスが正常に返ったと確認された段階(つまりページ表示の完了を待たない)で、別タブを自動終了

署名自動化に集中したいので省く。dorawiiより

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

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

iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEk0DAAKCRBwMdsubs4+
SMeUAP0Sbc2rovwbBLIW1EsKVCkZgaMMBQh7XNHretkmy/X+MgD/VZaho2zYzj5T
BcoTBYw5DL/IbfBlrq8oRZoAJckc8wY=
=U8nF
-----END PGP SIGNATURE-----

2025-05-29

IT求人数、ここ数か月程度でも勢いがわかるな

求人ボックス

https://xn--pckua2a7gp15o89zb.com/


技術 1月3日 5月29日 変化率
Rails 22,891 31,011 36%↑
Node.js 12,829 17,012 33%↑
Django 13,348 20,471 53%↑
Flask 1,589 1,827 15%↑
FastAPI 1,210 1,541 27%↑
Laravel 26,879 35,526 32%↑
Next.js 7,382 16,731 127%↑
Spring 16,380 22,490 37%↑
React 49,465 69,429 40%↑
Vue 34,322 49,795 45%↑


Next.js凄すぎだろ

2025-05-11

anond:20250511143717

その勉強会フリーランスのワイが突撃すると鼻で笑われそうで怖い。しか元増田の言い分を信じるならGitNode.jsもなしでポンコツPCで開発してる奴なんだろうな。

 

このスペックエンジニアぶれるのって日本ぐらいじゃない?

時間無駄ではないかマジで

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