惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
L
LangChain Blog
博客园 - Franky
Microsoft Security Blog
Microsoft Security Blog
M
MIT News - Artificial intelligence
月光博客
月光博客
云风的 BLOG
云风的 BLOG
MongoDB | Blog
MongoDB | Blog
量子位
AWS News Blog
AWS News Blog
Jina AI
Jina AI
Webroot Blog
Webroot Blog
L
Lohrmann on Cybersecurity
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
NISL@THU
NISL@THU
The Register - Security
The Register - Security
美团技术团队
博客园 - 三生石上(FineUI控件)
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
N
Netflix TechBlog - Medium
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
S
Securelist
Know Your Adversary
Know Your Adversary
MyScale Blog
MyScale Blog
C
CERT Recently Published Vulnerability Notes
D
Darknet – Hacking Tools, Hacker News & Cyber Security
U
Unit 42
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
雷峰网
雷峰网
B
Blog
P
Privacy International News Feed
W
WeLiveSecurity
T
Threatpost
P
Palo Alto Networks Blog
O
OpenAI News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Forbes - Security
Forbes - Security
K
Kaspersky official blog
Recent Announcements
Recent Announcements
A
About on SuperTechFans
B
Blog RSS Feed

Show HN

GitHub - steveking-gh/firmion: Firmion is DSL and engine for firmware image generation. GitHub - villagesql/villagesql-skills: Agent skills for VillageSQL - gemini-cli-extension; claude-code-plugin GitHub - flightdeckhq/flightdeck: Observability and control plane for AI agents. CSP Radar GitHub - Light-Heart-Labs/DreamServer: Turn your PC, Mac, or Linux box into an AI server. LLM inference, chat UI, voice, agents, workflows, RAG, and image generation. GitHub - Diplomat-ai/diplomat-agent-ts: What can your TypeScript AI agent do to the real world? Scan your code. See which tool calls have zero checks Code Block Selector - Visual Studio Marketplace Prometheus dependency graph — interactive showcase | Riftmap Show HN: I made a vi-like modal keyboard plugin for Figma GitHub - run-llama/liteparse: A fast, helpful, and open-source document parser GitHub - dalemyers/Roar: A macOS CLI tool for notifications GitHub - district-solutions/open-agent-tools-coder: Enables small-to-large self-hosted ai models to use local source code when running tool-calling agentic workloads. We actively data mine 20,900+ (2+ TB) popular github repos using large and small ai models to create reuseable: json, markdown and parquet files for local-first tool-calling models. GitHub - progapandist/stripeek: A local TUI proxy for real-time Stripe API debugging, built for navigating complex payloads fast. GitHub - sir1st/hermes-desktop: All-in-one cross-platform desktop app for Hermes Agent — bundles Python + hermes-agent + hermes-web-ui GitHub - astefanutti/shaderbang: Shebang for Shaders Show HN: Generate Claude Code Workflows using Spec Driven Development approach GitHub - nixys/nxs-universal-chart: The Helm chart you can use to install any of your applications into Kubernetes/OpenShift Show HN: AI agents for UK GDAD PCF roles and their skills The Two Pillars: Mixer Mode and Meta-Software in the Reorganization of Software Work After AI GitHub - JaiCode08/teleport-env What 1,000+ Harness Experiments Taught Me About Self-Improving Agents Show HN: Liiists, a Markdown-first, iOS and CLI list app SwiperTab – Get this Extension for 🦊 Firefox (en-US) GitHub - kouhxp/fftext: Summarize, explain, fact-check, or translate any text, URL, or file. No GPU. No cloud. One command GitHub - sweetpad-dev/sweetpad: Develop Swift/iOS projects using VSCode GitHub - dogmaticdev/IRON: IRON a.k.a. Intermediate Representation Object Notation is a Interpreter/Database that is used to create Programming Languages. GitHub - sjhalani7/vaen: Package your AI coding harness into a portable .agent file, and share it across repos, teams, & the community without ever having to copy-paste instructions, skills, MCP config, or secrets. Show HN: Gandalf the Grader Show HN: Citadeld – replay any CI failure locally from a single file GitHub - tdortman/cuSBF: High-Performance GPU Super Bloom Filter coral-ai/claude-code-token-xray at main · Coral-Bricks-AI/coral-ai GitHub - ulyssestenn/funes: Funes is a Git-based framework for LLM-managed knowledge work: an AI Librarian ingests raw sources, builds an interlinked Markdown knowledge base, and uses it to produce cited reports, analyses, and other outputs. GitHub - ThatXliner/gah: Git Add Hunk, built for agents to use GitHub - harmont-dev/harmont-cli: Command-line client for the Harmont CI platform GitHub - brooksmcmillin/mcp-authflow: OAuth 2.0 Authorization Server framework for MCP servers GitHub - javaid-codes/audit-supply-chain-agents GitHub - amorey/gochan: A small library of common channel architectures for Go, inspired by Rust GitHub - arifozgun/OpenGem: Free, Open-Source AI API Gateway with Gemini, OpenAI & Anthropic Compatibility in 1 file GitHub - Pranesh950/BioPetals: 🌸 Run BIOxAI models at home, BitTorrent-style. Fine-tuning and inference up to 10x faster than offloading GitHub - cnguyen14/bounty-doctor: Diagnose a GitHub bounty issue before you waste hours: detects honeypot scam repos, AI-bot attempt swarms, and stale contests. Show HN: CoreMCP – MCP Server for On-Prem DBs Show HN: KittyHTML – Render HTML/CSS as an inline image in your terminal GitHub - bingud/filemat: Web-based file manager Show HN: TruthLens – Free multi-signal deepfake image detector GitHub - apexlocal-jz/claude-usage-tray: Windows system-tray app showing your Claude Code rate-limit usage at a glance. Zero deps, ~300 lines of PowerShell. Cross-IDE (works regardless of VS Code, Cursor, plain terminal). Release v0.1.2.1 · kouhxp/yapsnap GitHub - noopolis/moltnet: Self-hostable chat network for AI agents. Pre-built bridges for Claude Code, Codex, and the Claws. Rooms, DMs, history. No Slack bots, no Matrix, no glue code. GitHub - tamerh/enju: Coordinating Humans, AI Agents, and Compute as Peers on a Shared Workflow Graph Show HN: Continuity-auth – Respect-weighted rate limits for the open web GitHub - luml-ai/luml: AI lifecycle platform where engineers and agents track experiments, train models, and ship to production. GitHub - mrdanielcasper/CoreTex: A UNIX-inspired, biomimetic, flat-file AI harness and knowledge engine. GitHub - clemg/pierre-github: Pierre's diffs.com and trees.software for Github GitHub - lyriks-io/unspaghettit: Behavior-driven AI development without prompt spaghetti. GitHub - sofumel/claude-handoff-revive: Resume Claude Code work after rate/usage/context limits without replaying the prior transcript. Auto-saves at 90%/95% usage. Plugin-installable, 10 languages. GitHub - dotexorg/saferpc: Typed, end-to-end encrypted RPC over any bidirectional channel. GitHub - BeeZeeAgent/beezee: Agent harness orchestration Legato Next.js Boilerplate for Internal Tools · CoreUI GitHub - clark-labs-inc/clark-hash: Clark Hash, 32x smaller searchable sketches for embeddings GitHub - ZeroPointRepo/youtube-mcp: The fastest YouTube transcript + YouTube search MCP for AI agents. Try for free. Typing Mastery — climb toward 100+ WPM, deliberately GitHub - Andebugulin/Awareen GitHub - fayzan123/claude-workflow-composer: Visual desktop app for composing multi-agent coding workflows. Drag agents, attach skills and MCPs, wire handoffs, export to .claude/ GitHub - harshaneel/humanize: Best static AI text humanizer. Two research-grounded skills that work in any LLM (Claude, ChatGPT, Gemini, Codex): humanize beats perplexity-based detectors, ai-check produces forensic scoring with evidence-quoted flags. Nine levers, 50+ peer-reviewed sources, 2024-2026 detection literature. GitHub - StackOneHQ/stack-nudge GitHub - nodes-app/swift-markdown-engine: A native AppKit Markdown editor for macOS, built on TextKit 2 and bridged to SwiftUI. We hardened an LLM agent. Each defense we added made it more exploitable. GitHub - alkait/WhatsKept: Agent-queryable WhatsApp history from an iOS backup — a single Go binary. GitHub - octelium/cordium: Open-source, general-purpose sandbox platform for devs and AI agents that provides identity-based secure access to infrastructure without credentials. WAR.GOV/UFO Microfilm5 GitHub - scosman/videowright: Build animated explainer videos with your coding agent GitHub - dipankar/dscode: The code editor you can take apart. GitHub - zoharbabin/web-researcher-mcp: MCP server (Go) for AI assistants: web search, content extraction, academic/patent/news research. Multi-provider routing, 4-tier scraping, search lenses. Works with Claude, Cursor, and any MCP client. GitHub - ruvnet/RuView: π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video. GitHub - scanaislop/aislop: Catch the slop AI coding agents leave in your code: narrative comments, swallowed exceptions, as-any casts, dead code, oversized functions. 50+ rules across 7 languages (TypeScript, JavaScript, Python, Go, Rust, Ruby, PHP). Sub-second, deterministic, no LLM at runtime. MIT-licensed. GitHub - kouhxp/cheap-im: CPU-only voice agent approximating Thinking Machines' Interaction Models demo GitHub - unprovable/OrchidMantis: Orchid Mantis — standalone framework for Zero-Knowledge Proofs of eXploit (ZKPoX). GitHub - MarcellM01/TinySearch: Shrink the web for your local LLMs! GitHub - TangibleResearch/Halgorithem: A Algo designed to detect AI Hallucitions GitHub - DO-SAY-GO/freelang: I love freelang GitHub - CarpseDeam/Aura-IDE: An AI coding harness that shaped itself - Planner/Worker agents, repo awareness, surgical edits, validation, recovery, and safe diff approvals. GitHub - chojs23/concord: A feature-rich TUI client for Discord GitHub - tommyjepsen/awesome-ux-skills: UX & AI Product designs skills you can use today in Claude Code GitHub - aerf-spec/aerf: Agent Evidence Receipt Format (AERF) — an open specification for tamper-evident, independently verifiable records of AI agent actions. GitHub - kklimuk/docx-cli: CLI for AI agents (Claude, Codex) to read, edit, and comment on .docx files with full format fidelity. GitHub - Jwrede/tokentoll: Catch LLM cost changes in code review. Infracost for LLM spend. GitHub - samchon/ttsc: A `typescript-go` toolchain for compiler-powered plugins and type-safe execution + 500x faster lint integrated into compiler GitHub - Higangssh/homebutler: 🏠 Manage your homelab from chat. Single binary, zero dependencies. GitHub - olalie/tapmap: See where your computer connects and what stands out on a live world map. GitHub - Diplomat-ai/diplomat-agent: What can your AI agent do to the real world? Scan your code. See which tool calls have zero checks GitHub - Bajusz15/beacon: Open-source agent for secure remote access, monitoring, and deploys across home-lab and self-hosted machines like Raspberry Pi, N100, or any Linux server. Open web based TTY or tunnel Home Assistant and other local services securely without opening ports. BigTech AI News - Chrome 应用商店 GitHub - vinhnx/VTCode: VT Code is an open-source coding agent with LLM-native code understanding and robust shell safety. Supports multiple LLM providers with automatic failover and efficient context management. GitHub - michaelaz774/decision-engine: A decision operating system for startup founders, powered by Claude Code. Synthesizes wisdom from 25+ legendary founders and investors into interactive AI-driven decision frameworks. GitHub - Chrilleweb/dotenv-diff: Validate environment variable usage in your codebase GitHub - Lumen-Labs/brainapi2: BrainAPI is a knowledge graph–powered AI memory layer that transforms unstructured data into structured knowledge, enabling intelligent search, recommendations, and contextual memory for AI agents and applications. GitHub - familiar-software/familiar: Let AI watch you work. Familiar lets your AI update its memory, skills, and knowledge by watching your screen. GitHub - skorotkiewicz/rudo: A small, elegant dock for Wayland GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. make sidebar/address bar rounded corner toggleable
javascript tutorial
h1yapp · 2026-06-24 · via Show HN
javascript is the standard programming language for the browser.

quaternion 3d

hello world[blob uri]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    console.log(`hello world`)//hello world
}</script></head></html>

operations[blob uri]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    const augend=1,addend=2,sum=3
    console.log(`--addition-- augend + addend === sum`)
    console.log(`${augend} + ${addend} = ${sum}`)//1 + 2 = 3
    console.log(augend+addend===sum)//true
    const minuend=3,subtrahend=2,difference=1
    console.log(`--subtraction-- minuend - subtrahend === difference`)
    console.log(`${minuend} - ${subtrahend} = ${difference}`)//3 - 2 = 1
    console.log(minuend-subtrahend===difference)//true
    const multiplicand=2,multiplier=3,product=6
    console.log(`--multiplication-- multiplicand * multiplier === product`)
    console.log(`${multiplicand} * ${multiplier} = ${product}`)//2 * 3 = 6
    console.log(multiplicand*multiplier===product)//true
    const dividend=6,divisor=3,quotient=2
    console.log(`--division-- dividend / divisor === quotient`)
    console.log(`${dividend} / ${divisor} = ${quotient}`)//6 / 3 = 2
    console.log(dividend/divisor===quotient)//true
    const remainder=0
    console.log(`--division(modulo)-- dividend % divisor === remainder`)
    console.log(`${dividend} % ${divisor} = ${remainder}`)//6 % 3 = 0
    console.log(dividend%divisor===remainder)//true
    const base=3,exponent=2,power=9
    console.log(`--exponentiation-- base ** exponent === power`)
    console.log(`${base} ** ${exponent} = ${power}`)//3 ** 2 = 9
    console.log(base**exponent===power)//true
    const radicand=9,root=3
    console.log(`--square root-- Math.sqrt(radicand) === root`)
    console.log(`√${radicand} = ${root}`)//√9 = 3
    console.log(Math.sqrt(radicand)===root)//true
}</script></head></html>

bitwise operations[blob uri]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    console.log((0|0b00000000000000000000000000000001)===0b01)//true
    console.log((0|0b11111111111111111111111111111110)===-0b10)//true
    console.log((0|0b01111111111111111111111111111111)===2147483647)//true
    console.log(`--not-- ~0b01 = -0b10`)
    console.log(~0b01===-0b10)//true
    console.log(`--and-- (0b01 & 0b11) = 0b01`)
    console.log((0b01&0b11)===0b01)//true
    console.log(`--xor-- (0b01 ^ 0b11) = 0b10`)
    console.log((0b01^0b11)===0b10)//true
    console.log(`--or-- (0b01 | 0b11) = 0b11`)
    console.log((0b01|0b11)===0b11)//true
    console.log(`--left shift-- 0b01<<1=0b10`)
    console.log(0b01<<1===0b10)//true
    console.log(`--right shift-- 0b11>>1=0b01`)
    console.log(0b11>>1===0b01)//true
    console.log(`--unsigned right shift-- -0b10>>>1=2147483647`)
    console.log(-0b10>>>1===2147483647)//true
}</script></head></html>

Array[blob uri]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    console.log(`--Array--`)
    console.log([])//[]
    console.log([0])//[0]
    console.log(Array(1))//[empty]
    console.log(Array(0,1))//[0, 1]
    console.log(`--push, pop, reverse--`)
    const vs=[]
    console.log(vs.push(0))//1
    console.log(vs)//[0]
    console.log(vs.push(1,2))//3
    console.log(vs)//[0, 1, 2]
    console.log(vs[1]=3)//3
    console.log(vs)//[0, 3, 2]
    console.log(vs.pop())//2
    console.log(vs)//[0, 3]
    console.log(vs.reverse())//[3, 0]
    console.log(vs)//[3, 0]
    console.log(`--isArray--`)
    console.log(Array.isArray([]))//true
    console.log(`--equals--`)
    Array.prototype.equals=function(v){
        return v.length===this.length&&v.every((v,i)=>v===this[i])
    }
    console.log(Object.getOwnPropertyDescriptor(Array.prototype,'equals'))//{'writable': true,'enumerable': true,'configurable': true}
    console.log([].equals([]))//true
}</script></head></html>

binary search[blob uri, how to use, logic]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    Number.prototype.toBinarySearchIndex=function(l,c){
        let v=0
        for(let i;1<l-v;)this<c(i=v+l>>>1)?l=i:v=i
        return v
    }
    const vs=[0,2,4,6,8]
    console.log((0).toBinarySearchIndex(vs.length,i=>vs[i]))//0
    console.log((2).toBinarySearchIndex(vs.length,i=>vs[i]))//1
    console.log((6).toBinarySearchIndex(vs.length,i=>vs[i]))//3
}</script></head></html>

split from[blob uri, how to use, logic]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    String.prototype.splitFrom=function(pattern){
        const vs=[]
        vs.length=1+this.length-this.matchAll(RegExp(pattern,`g`)).reduce((a,v)=>a+(vs[v.index-a]=v[0]).length,0)
        return vs
    }
    console.log(`,1,,,,"5",,"""7""",,`.splitFrom(`"(?:""|[^"])*"|[^,]+`))//[empty, '1', empty × 3, '"5"', empty, '"""7"""', empty × 2]
}</script></head></html>

ordinalize[blob uri, how to use, logic]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    Number.prototype.ordinalize=function(){
        return(this+`th`).replace(/(?<!1)[123]th$/,v=>`1th`===v?`1st`:`2th`===v?`2nd`:`3rd`)
    }
    console.log([0,1,2,3,4,10,11,12,13,14,100,111,122,133,144].map(v=>v.ordinalize()))//['0th', '1st', '2nd', '3rd', '4th', '10th', '11th', '12th', '13th', '14th', '100th', '111th', '122nd', '133rd', '144th']
}</script></head></html>

recursion[blob uri]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    console.log(`--factorial--`)
    Number.prototype.toFactorial=function(){
        return 1<this?this*(this-1).toFactorial():1
    }
    console.log((10).toFactorial())//3628800
    console.log(`--greatest common divisor--`)
    Number.prototype.toGCD=function(v){
        return v?v.toGCD(this%v):this
    }
    console.log((16).toGCD(24))//Number {8}
}</script></head></html>

SubtleCrypto[blob uri, how to use]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{background-color:#ffffffff;color:#000000ff}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<script>{
    if(!crypto.subtle)throw Error(`available in secure contexts.`)
    const encoder=new TextEncoder(),decoder=new TextDecoder()
    ,aes=async(string,object,hashObject)=>{
        const key=await generateKey(object.lengthParams,[`encrypt`])
        ,encrypted=await crypto.subtle.encrypt(object.params,key,encoder.encode(string))
        ,exportedKey=await crypto.subtle.exportKey(object.format,key)
        ,decrypted=await crypto.subtle.decrypt(object.params,await importKey(object.format,exportedKey,object.algorithm,[`decrypt`]),encrypted)
        if(hashObject){
            const verified=await verify(hashObject,encrypted)
            return[object.algorithm.name,decoder.decode(decrypted),verified]
        }else return[object.algorithm.name,decoder.decode(decrypted)]
    }
    ,rsa=async(string,object)=>{
        const keys=await generateKey(object.lengthParams,[`encrypt`,`decrypt`])
        ,encrypted=await crypto.subtle.encrypt(object.algorithm,keys.publicKey,encoder.encode(string))
        ,exportedKey=await crypto.subtle.exportKey(object.format,keys.privateKey)
        ,decrypted=await crypto.subtle.decrypt(object.algorithm,await importKey(object.format,exportedKey,object.params,[`decrypt`]),encrypted)
        return[object.algorithm.name,decoder.decode(decrypted)]
    }
    ,generateKey=async(params,usages)=>await crypto.subtle.generateKey(params,true,usages)//extractable=true
    ,importKey=async(format,key,params,usages)=>await crypto.subtle.importKey(format,key,params,false,usages)//extractable=false
    ,verify=async(object,encrypted)=>{
        const key=await generateKey(object.params,[`sign`])
        ,signature=await crypto.subtle.sign(object.algorithm,key,encrypted)
        ,exportedKey=await crypto.subtle.exportKey(object.format,key)
        return crypto.subtle.verify(object.algorithm,await importKey(object.format,exportedKey,object.params,[`verify`]),signature,encrypted)
    }
    (async()=>{
        const string=`hello world`
        ,aesCTRObject={algorithm:{name:`AES-CTR`},params:{counter:crypto.getRandomValues(new Uint8Array(16)),length:64},lengthParams:{length:128},format:`raw`}
        ,aesCTRHashObject={algorithm:{name:`HMAC`},params:{hash:`SHA-256`},format:`raw`}
        ,aesCBCObject={algorithm:{name:`AES-CBC`},params:{iv:crypto.getRandomValues(new Uint8Array(16))},lengthParams:{length:128},format:`raw`}
        ,aesCBCHashObject={algorithm:{name:`HMAC`},params:{hash:`SHA-256`},format:`raw`}
        ,aesGCMObject={algorithm:{name:`AES-GCM`},params:{iv:crypto.getRandomValues(new Uint8Array(12))},lengthParams:{length:128},format:`raw`}
        ,rsaOAEPObject={algorithm:{name:`RSA-OAEP`},params:{hash:`SHA-256`},lengthParams:{modulusLength:2048,publicExponent:new Uint8Array([0x01,0x00,0x01])},format:`pkcs8`}
        Object.assign(aesCTRObject.params,aesCTRObject.algorithm)
        Object.assign(aesCTRObject.lengthParams,aesCTRObject.algorithm)
        Object.assign(aesCTRHashObject.params,aesCTRHashObject.algorithm)
        Object.assign(aesCBCObject.params,aesCBCObject.algorithm)
        Object.assign(aesCBCObject.lengthParams,aesCBCObject.algorithm)
        Object.assign(aesCBCHashObject.params,aesCBCHashObject.algorithm)
        Object.assign(aesGCMObject.params,aesGCMObject.algorithm)
        Object.assign(aesGCMObject.lengthParams,aesGCMObject.algorithm)
        Object.assign(rsaOAEPObject.params,rsaOAEPObject.algorithm)
        Object.assign(rsaOAEPObject.lengthParams,rsaOAEPObject.params)
        console.log(await aes(string,aesCTRObject,aesCTRHashObject))//['AES-CTR', 'hello world', true]
        console.log(await aes(string,aesCBCObject,aesCBCHashObject))//['AES-CBC', 'hello world', true]
        console.log(await aes(string,aesGCMObject))//['AES-GCM', 'hello world']
        console.log(await rsa(string,rsaOAEPObject))//['RSA-OAEP', 'hello world']
    })()
}</script></head></html>

quaternion 3d[blob uri, logic]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{
    *{background-color:inherit;color:inherit}
    background-color:#ffffffff;color:#000000ff
}
@media(prefers-color-scheme:dark){body{background-color:#000000ff;color:#ffffffff}}
</style>
<style>
html{
    *{margin:0;padding:0}
    >body{
        *{font-family:monospace;box-sizing:border-box;overflow-wrap:anywhere;vertical-align:bottom}
        >:nth-child(1){
            >dl>dd>canvas{width:100%;aspect-ratio:1}
            display:grid;grid-template-columns:1fr 1fr 1fr
        }
        >:nth-child(2){
            >dd{margin-inline-start:.5rem}
            display:grid;grid-template-columns:auto 1fr
        }
        touch-action:none
    }
}
</style>
<script>
const quaternionRotated=`p+2.*cross(q.xyz,cross(q.xyz,p)+q.w*p)`
,getRotated=(q0,q1,precision)=>`vec4${precision}(c(c(p,${q0}),${q1}),0.)+vec4${precision}(0.,0.,1.,2.)`
WebGLRenderingContext.prototype.getRenderer=function(p,is,mode,color){
    const vertexShaderSrc=`precision highp float;attribute vec3 p;uniform vec4 q0;uniform vec4 q1;vec3 c(vec3 p,vec4 q){return ${quaternionRotated};}void main(){gl_Position=${getRotated(`q0`,`q1`,``)};}`
    ,fragmentShaderSrc=`precision highp float;void main(){gl_FragColor=vec4(${color.map(v=>v+`.`).join(`,`)});}`
    ,program=(()=>{
        const createShader=(type,src)=>{
            const shader=this.createShader(type)
            this.shaderSource(shader,src)
            this.compileShader(shader)
            return shader
        }
        const program=this.createProgram()
        this.attachShader(program,createShader(this.VERTEX_SHADER,vertexShaderSrc))
        this.attachShader(program,createShader(this.FRAGMENT_SHADER,fragmentShaderSrc))
        this.linkProgram(program)
        return program
    })()
    ,q0Location=this.getUniformLocation(program,`q0`)
    ,q1Location=this.getUniformLocation(program,`q1`)
    this.clearColor(0,0,0,0)
    this.useProgram(program)
    this.enableVertexAttribArray(0)
    this.bindBuffer(this.ARRAY_BUFFER,this.createBuffer())
    this.bufferData(this.ARRAY_BUFFER,p,this.STATIC_DRAW)
    this.bindBuffer(this.ELEMENT_ARRAY_BUFFER,this.createBuffer())
    this.bufferData(this.ELEMENT_ARRAY_BUFFER,is,this.STATIC_DRAW)
    this.vertexAttribPointer(0,3,this.FLOAT,false,0,0)
    return(q0,q1)=>{
        this.uniform4fv(q0Location,q0)
        this.uniform4fv(q1Location,q1)
        this.clear(this.COLOR_BUFFER_BIT|this.DEPTH_BUFFER_BIT)
        this.drawElements(mode,is.length,this.UNSIGNED_SHORT,0)
    }
}
WebGL2RenderingContext.prototype.getRenderer=function(p,is,mode,color){
    const vertexShaderSrc=`#version 300 es\nprecision highp float;in vec3 p;layout(std140)uniform q{vec4 q0;vec4 q1;};vec3 c(vec3 p,vec4 q){return ${quaternionRotated};}void main(){gl_Position=${getRotated(`q0`,`q1`,``)};}`
    ,fragmentShaderSrc=`#version 300 es\nprecision highp float;out vec4 c;void main(){c=vec4(${color.map(v=>v+`.`).join(`,`)});}`
    ,program=(()=>{
        const createShader=(type,src)=>{
            const shader=this.createShader(type)
            this.shaderSource(shader,src)
            this.compileShader(shader)
            return shader
        }
        const program=this.createProgram()
        this.attachShader(program,createShader(this.VERTEX_SHADER,vertexShaderSrc))
        this.attachShader(program,createShader(this.FRAGMENT_SHADER,fragmentShaderSrc))
        this.linkProgram(program)
        return program
    })()
    ,uniformBuffer=this.createBuffer()
    this.clearColor(0,0,0,0)
    this.useProgram(program)
    this.enableVertexAttribArray(0)
    this.bindBuffer(this.ARRAY_BUFFER,this.createBuffer())
    this.bufferData(this.ARRAY_BUFFER,p,this.STATIC_DRAW)
    this.bindBuffer(this.ELEMENT_ARRAY_BUFFER,this.createBuffer())
    this.bufferData(this.ELEMENT_ARRAY_BUFFER,is,this.STATIC_DRAW)
    this.vertexAttribPointer(0,3,this.FLOAT,false,0,0)
    this.uniformBlockBinding(program,0,0)
    this.bindBuffer(this.UNIFORM_BUFFER,uniformBuffer)
    this.bindBufferBase(this.UNIFORM_BUFFER,0,uniformBuffer)
    return(q0,q1)=>{
        const q=new Float32Array(q0.length+q1.length)
        q.set(q0)
        q.set(q1,q0.length)
        this.bufferData(this.UNIFORM_BUFFER,q,this.STATIC_DRAW)
        this.clear(this.COLOR_BUFFER_BIT|this.DEPTH_BUFFER_BIT)
        this.drawElements(mode,is.length,this.UNSIGNED_SHORT,0)
    }
}
if(navigator.gpu)GPUCanvasContext.prototype.getRenderer=function(p,is,topology,color){
    const createBuffer=(usage,src)=>{
        const buffer=configuration.device.createBuffer({usage:usage,size:src.byteLength,mappedAtCreation:true})
        new src.constructor(buffer.getMappedRange()).set(src)
        buffer.unmap()
        return buffer
    }
    ,configuration=this.getConfiguration()
    ,layout=configuration.device.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{}}]})
    ,vertexShaderSrc=`struct Q{q0:vec4f,q1:vec4f}@binding(0)@group(0)var<uniform>q:Q;fn c(p:vec3f,q:vec4f)->vec3f{return ${quaternionRotated};}@vertex fn main(@location(0)p:vec3f)->@builtin(position)vec4f{return ${getRotated(`q.q0`,`q.q1`,`f`)};}`
    ,fragmentShaderSrc=`@fragment fn main()->@location(0)vec4f{return vec4f(${color.map(v=>v+`.`).join(`,`)});}`
    ,pipeline=configuration.device.createRenderPipeline({
        layout:configuration.device.createPipelineLayout({bindGroupLayouts:[layout]})
        ,primitive:{topology:topology}
        ,vertex:{buffers:[{attributes:[{format:`float32x3`,offset:0,shaderLocation:0}],arrayStride:12}],module:configuration.device.createShaderModule({code:vertexShaderSrc})}
        ,fragment:{targets:[{format:configuration.format}],module:configuration.device.createShaderModule({code:fragmentShaderSrc})}
    })
    ,encoder=configuration.device.createRenderBundleEncoder({colorFormats:[configuration.format]})
    ,uniformBuffer=configuration.device.createBuffer({usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,size:32})
    encoder.setPipeline(pipeline)
    encoder.setVertexBuffer(0,createBuffer(GPUBufferUsage.VERTEX,p))
    encoder.setBindGroup(0,configuration.device.createBindGroup({entries:[{binding:0,resource:{buffer:uniformBuffer}}],layout:layout}))
    encoder.setIndexBuffer(createBuffer(GPUBufferUsage.INDEX,is),`uint16`)
    encoder.drawIndexed(is.length)
    const bundle=encoder.finish(),descriptor={colorAttachments:[{loadOp:`clear`,storeOp:`store`,clearValue:[0,0,0,0]}]}
    return(q0,q1)=>{
        const q=new Float32Array(q0.length+q1.length)
        q.set(q0)
        q.set(q1,q0.length)
        configuration.device.queue.writeBuffer(uniformBuffer,0,q)
        descriptor.colorAttachments[0].view=this.getCurrentTexture().createView()
        const encoder=configuration.device.createCommandEncoder(),pass=encoder.beginRenderPass(descriptor)
        pass.executeBundles([bundle])
        pass.end()
        configuration.device.queue.submit([encoder.finish()])
    }
}
addEventListener(`DOMContentLoaded`,async()=>{
    let size,clientX,clientY
    const render=(q0,q1)=>renderers.forEach(c=>c(q0,q1))
    ,canvas=document.querySelector(`body>:nth-child(1)`),[webGLCanvas,webGL2Canvas,webGPUCanvas]=canvas.querySelectorAll(`dl>dd>canvas`)
    ,sensitivity=document.querySelector(`body>:nth-child(2)>dd>input[type=number]`),order=document.querySelector(`body>:nth-child(2)>dd>select`)
    ,[webGLContext,webGL2Context]=[webGLCanvas.getContext(`webgl`),webGL2Canvas.getContext(`webgl2`)]
    ,p=new Float32Array([
        [
            -1,-1,-1
           , 1,-1,-1
           ,-1, 1,-1
           ,-1,-1, 1
           , 1, 1,-1
           , 1,-1, 1
           ,-1, 1, 1
           , 1, 1, 1
        ].map(v=>v/2)
        ,[
             1, 0, 0
           , 0, 1, 0
           , 0, 0, 1
           , 0, 0,-1
           , 0,-1, 0
           ,-1, 0, 0
        ]
    ].flat())
    ,is=new Uint16Array([
        [
             0,1,1,4
            ,7,6,6,3
            ,0,2,2,6
            ,7,5,5,1
            ,0,3,3,5
            ,7,4,4,2
        ]
        ,[
             0,1,1,2,2,5
            ,0,4,4,3,3,5
            ,0,2,2,4,4,5
            ,0,3,3,1,1,5
        ].map(v=>8+v)
    ].flat())
    ,renderers=[webGLContext.getRenderer(p,is,1,[1,0,0,1]),webGL2Context.getRenderer(p,is,1,[0,1,0,1])]
    ,identity=new Float32Array([0,0,0,1])
    if(navigator.gpu){
        const adapter=await navigator.gpu.requestAdapter()
        if(adapter){
            const device=await adapter.requestDevice()
            if(device){
                const webGPUContext=webGPUCanvas.getContext(`webgpu`)
                webGPUContext.configure({device:device,format:navigator.gpu.getPreferredCanvasFormat(),alphaMode:`premultiplied`})
                renderers.push(webGPUContext.getRenderer(p,is,`line-list`,[0,0,1,1]))
            }else webGPUCanvas.parentElement.textContent=`the device request failed.`
        }else webGPUCanvas.parentElement.textContent=`the adapter request failed.`
    }else webGPUCanvas.parentElement.textContent=`available in secure contexts.`
    canvas.addEventListener(`pointerup`,event=>(clientX=clientY=null)||canvas.releasePointerCapture(event.pointerId)||render(new Float32Array([0,0,0,1]),new Float32Array([0,0,0,1])))
    canvas.addEventListener(`pointerdown`,event=>{
        canvas.setPointerCapture(event.pointerId)
        clientX=event.clientX
        clientY=event.clientY
    })
    canvas.addEventListener(`pointermove`,event=>{
        if(!clientX&&!clientY)return
        let x,y
        const v=Number(sensitivity.value)
        x=(event.clientX-clientX)*v/2
        y=(event.clientY-clientY)*v/2
        x=new Float32Array([0,Math.sin(x),0,Math.cos(x)])
        y=new Float32Array([Math.sin(y),0,0,Math.cos(y)])
        render(...Number(order.value)?[x,y]:[y,x])
    })
    onresize=()=>{
        if(webGLCanvas.clientWidth===size)return
        size=webGLCanvas.clientWidth
        webGPUCanvas.height=webGPUCanvas.width=webGL2Canvas.height=webGL2Canvas.width=webGLCanvas.height=webGLCanvas.width=size
        webGLContext.viewport(0,0,size,size)
        webGL2Context.viewport(0,0,size,size)
        render(identity,identity)
    }
    onresize()
},{once:true})
</script>
</head>
<body>
    <dl>
        <dl><dt>WebGL</dt><dd><canvas></canvas></dd></dl>
        <dl><dt>WebGL2</dt><dd><canvas></canvas></dd></dl>
        <dl><dt>WebGPU</dt><dd><canvas></canvas></dd></dl>
    </dl>
    <dl>
        <dt>sensitivity</dt><dd><input type='number' step='.01' min='0' value='.05'></dd>
        <dt>order</dt><dd><select><option value='0'>false</option><option value='1'>true</option></select></dd>
    </dl>
</body>
</html>

RTCPeerConnection[blob uri, how to use]

code

<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>
body{
    *{background-color:inherit;color:inherit}
    hr{background-color:var(--color);color:var(--background-color)}
    --background-color:#ffffffff;--color:#000000ff;background-color:var(--background-color);color:var(--color)
}
@media(prefers-color-scheme:dark){body{--background-color:#000000ff;--color:#ffffffff}}
</style>
<style>
html{
    *{margin:0;padding:0}
    >body{
        *{font-family:monospace;box-sizing:border-box;overflow-wrap:anywhere;vertical-align:bottom}
        textarea{resize:none}
        >dl,>textarea{overflow-y:auto}
        >dl{
            >dl{
                >dd{margin-inline-start:.5rem}
                display:grid;grid-template-columns:auto 1fr;margin-bottom:.5rem
            }
            >dd{
                >span{display:inline-block;border:1px solid;text-align:start}
                &.end{text-align:end}
                white-space:pre-wrap
            }
        }
        >hr{padding:1px;border:1rem solid;cursor:row-resize}
        >textarea{width:100%;border:none;outline:none}
        height:100dvh;display:grid;grid-template-rows:var(--grid-template-rows,1fr auto 1fr);touch-action:none
    }
}
</style>
<script>
addEventListener(`DOMContentLoaded`,()=>{
    let row,clientY,v,offset=0
    const clamp=v=>row<(0>v?-v:v)?0>v?-row:row:v
    ,send=(v,c)=>{
        const dd=document.createElement(`dd`),span=document.createElement(`span`)
        span.textContent=v
        dd.append(span)
        if(c)c(dd)
        dl.append(dd)
        dd.scrollIntoView({behavior:`smooth`})
    }
    ,connection=new RTCPeerConnection(),channels=[0,1].map(v=>connection.createDataChannel(``,{negotiated:true,id:v}))
    ,dl=document.querySelector(`body>dl`),state=dl.querySelector(`dl>dd`),hr=document.querySelector(`body>hr`),textarea=document.querySelector(`body>textarea`)
    channels[0].addEventListener(`message`,event=>send(event.data)||channels[1].send(event.data))
    channels[1].addEventListener(`message`,event=>send(event.data,e=>e.setAttribute(`class`,`end`)))
    connection.addEventListener(`icegatheringstatechange`,()=>{
        state.textContent=connection.iceGatheringState
        if(`complete`!==connection.iceGatheringState)return
        textarea.value=JSON.stringify(connection.localDescription)
        textarea.select()
    })
    connection.addEventListener(`connectionstatechange`,()=>{
        state.textContent=connection.connectionState
        if(`connected`===connection.connectionState)textarea.value=``
    })
    dl.addEventListener(`pointerdown`,async event=>{
        event.preventDefault()
        if(`connected`===connection.connectionState){
            if(!textarea.value||`open`!==channels[0].readyState)return
            channels[0].send(textarea.value)
            textarea.value=``
        }else if([`new`,`connecting`].includes(connection.connectionState))try{
            if(!textarea.value)throw Error()
            let b=0
            const sdp=JSON.parse(textarea.value)
            if(![`offer`,`answer`].includes(sdp.type))throw Error()
            if(!connection.localDescription&&`new`===connection.connectionState&&`offer`===sdp.type)b|=0b01
            if(connection.localDescription&&`connecting`===connection.connectionState&&`answer`===sdp.type)b|=0b10
            if(!b)throw Error()
            await connection.setRemoteDescription(sdp)
            if(0b01&b)await connection.setLocalDescription(await connection.createAnswer())
        }catch{
            await connection.setLocalDescription(await connection.createOffer())
        }
    })
    hr.addEventListener(`pointerup`,event=>(clientY=null)||hr.releasePointerCapture(event.pointerId)||(offset=v))
    hr.addEventListener(`pointerdown`,event=>hr.setPointerCapture(event.pointerId)||(clientY=event.clientY))
    hr.addEventListener(`pointermove`,event=>clientY&&((v=clamp(event.clientY-clientY+offset))?document.body.style.setProperty(`--grid-template-rows`,`${0>v?(row+v)/(row-v):1}fr auto ${0>v?1:(row-v)/(row+v)}fr`):document.body.removeAttribute(`style`)))
    onresize=()=>{
        row=(document.body.getBoundingClientRect().height-hr.getBoundingClientRect().height)/2
        offset=clamp(offset)
    }
    onresize()
},{once:true})
</script>
</head>
<body>
    <dl><dl><dt>state</dt><dd></dd></dl></dl>
    <hr>
    <textarea autofocus></textarea>
</body>
</html>