AI 资讯
HashiCorp Ships Public Beta of Vault Kubernetes Key Management
HashiCorp has released a public beta of Vault Kubernetes key management, a KMS v2-compatible plugin that lets the Kubernetes API server delegate envelope encryption to Vault Enterprise, moving the key encryption keys that protect etcd data out of the cluster and into a separately governed trust domain. By Mark Silvester
AI 资讯
AI Is Great at Reasoning. Stop Using It for Workflows.
More than a year ago, which is practically ancient history in the AI years, I wrote a blog about using AI to build new self-service capabilities. It felt like the future. We built a self-service action that could create new self-service actions, helping us move faster, reduce bottlenecks, and scale a small Platform Engineering team supporting hundreds of developers. One of the most interesting parts was using Amazon Bedrock to generate Terraform code dynamically at runtime, allowing the system to determine how a new cloud resource should be provisioned using our existing Terraform modules. It worked. It was impressive. And… we removed it. Looking back, abandoning that approach turned out to be one of the best engineering decisions we made. At the time, it felt like an isolated technical decision. It wasn’t. Recently, we faced a much smaller problem. We wanted to automate the creation of DNS records in Cloudflare through our self-service platform. The first proposal was exactly what you’d expect today: “Let’s build a Claude Skill.” Immediately, I had a strong sense of deja vu. But my hesitation wasn’t about whether AI could do it — it was about whether it should. We were simply asking the wrong question. The Industry Shift A lot of engineers today feel like everything they learned over the last decade suddenly became less relevant. We are DevOps engineers. We are Platform Engineers. We used to spend time designing systems, defining standards, reviewing architectures, and planning before writing a single line of code. Every automation started with the same question: “How should we automate this?” Today, that question has quietly changed. Now we ask: “How can AI do this?” At first glance, that sounds like progress. And sometimes it is. Large Language Models have fundamentally changed the way we build software. Tasks that used to take hours now take minutes, and entire prototypes appear from a single prompt. The temptation is obvious. If AI can do it… why not let AI do
AI 资讯
We crossed 6,000 downloads. Here's what we shipped to get there.
Tuesday morning. Your SOC 2 auditor emails you. "Can you provide evidence of human review for all AI-assisted code changes in the last 90 days — which files were modified, what prompts were used, and whether any credentials were visible in context?" You open your IDE. Git log? Commits are there. PR history? Reviews too. But the AI session itself — the conversation, the code it proposed, whether it saw your .env file, which compliance controls it touched — gone. That gap is why I built Chron. What Chron is Chron is an MCP server that runs alongside your AI coding tool. Every message, every code change, every detected secret — locally timestamped, hash-chained, and stored in a SQLite database you own. No cloud. No data sharing. Works offline. # Install once npm install -g chron-mcp # Check setup chron doctor Works with Claude Code, Cursor, Windsurf, Continue.dev — any MCP-compatible tool. The last four releases: answers to questions auditors actually ask v0.1.39 — "Which sessions are worth reviewing first?" $ chron risk --since = 30d SESSION SCORE BAND SIGNALS a1b2c3d4 87 critical secrets·auth·infra e5f6g7h8 52 high auth·findings ( 2 ) i9j0k1l2 28 review code_changes The attention score: deterministic 0–100 per session. No ML, no API calls. Pure signal from what actually happened: secrets detected (+25), auth code changed (+15), infra modified (+12), open compliance findings (+8 each). A security lead can triage 90 days of AI sessions in under a minute. v0.1.40 — "Can I get a one-pager for this audit?" $ chron dashboard --since = 30d --output = q3-audit.html ✓ Written: q3-audit.html 8 sessions · 4 open findings · 1 critical · 2 high Coverage: 6 controls covered · 3 needs evidence Five sections in a single static HTML file — no server, no login, no port: executive summary, sessions ranked by risk score, findings grouped by framework (SOC 2 / ISO 27001 / EU AI Act / NIST AI RMF), a control coverage map, and contextual next actions. Open in a browser. Print to PDF. Attac
AI 资讯
Compressing Video to a Target File Size: The Bitrate Math in TypeScript
A practical calculator for turning an upload limit into a video bitrate, with enough margin for audio and container overhead. “Make this video smaller” is an open-ended request. “Make this three-minute video fit under 10 MB” is an engineering constraint. The second version sounds more precise, but a quality slider alone cannot solve it. A quality setting tells an encoder how aggressively to preserve detail. It does not directly tell us how many bytes the final file may contain. If the destination has a hard upload limit, the useful starting point is a bit budget. This article builds that calculation in TypeScript, then looks at the assumptions that make the answer less exact than the formula first appears. File Size Is Bitrate Multiplied by Time A video file contains several streams plus a container. For a simple MP4, the largest pieces are usually: the video stream; the audio stream; container metadata and indexing overhead. If we ignore overhead for a moment, the relationship is straightforward: file size in bits = total bitrate in bits per second × duration in seconds Rearranging it gives us the total bitrate available for a target size: total bitrate = target size in bits / duration in seconds That total must cover both video and audio. The approximate video budget is therefore: video bitrate = total bitrate - audio bitrate - overhead allowance The result is not a promise. It is a budget that an encoder can aim at. Be Explicit About MB and MiB Before writing code, decide what “10 MB” means. Storage vendors and many web services use decimal megabytes: 1 MB = 1,000,000 bytes Operating systems and developer tools often display binary mebibytes: 1 MiB = 1,048,576 bytes The difference is about 4.9%. That is large enough to turn a file that looks safe locally into a rejected upload. For a hard external limit, I prefer to calculate with decimal MB and keep an additional safety margin. For an internal tool where the unit is clearly MiB, I make that choice explicit in th
科技前沿
Nothing Ear (3a) Wireless Earbuds Review: Style Meets Value
The $100 earbuds look and sound better than earbuds nearly twice the price—as long as you can stomach just average noise canceling.
开发者
How To learn Web Development in 2026
I used to learn like this. Buy the cheap Udemy course, get three hours in, realize it was recorded...
AI 资讯
You can't prompt what you can't name. Jargon Buster fixes that.
You know exactly what you want. You can see it. You just don't know what it's called. So you open your AI tool and type "pixelated fade effect". Then "retro dot gradient". Then "that grainy old-computer image style". Six rounds later you have something almost right, and almost right is the most expensive kind of wrong. The word was dithering . With it, one prompt gets you the real thing. This gap has a shape. AI collapsed the cost of building, so the bottleneck moved: it's no longer "can the AI do it", it's "can you name it". Every field you touch as a builder has a precise vocabulary, and the words you're missing are costing you rounds of generation, wrong libraries, and vague briefs. Vocabulary is the highest-leverage thing you can pick up right now, and nobody teaches it. Jargon Buster is the cure. It's a free reverse-lookup glossary built for exactly this moment: you describe the thing in your head, it gives you the word. Reverse lookup: describe it, get the word Press Cmd+K on any page and type what you'd say to a colleague, not the term: What you type What you get "the glowy circles behind them" Bokeh "the grid of differently sized cards" Bento grid "the scroll that takes over the page" Scrolljacking "grainy speckles when I turn the number up" ISO "why is my payout smaller than my sales" Settlement "the inside of the letters fills in when I bold it" Counter Misspellings work too. "Ditter" lands on Dithering. That's deliberate: the fuzzy phrasings and typos people actually reach for are stored on every entry as first-class search data, not errors to correct. A normal glossary is indexed by the words you don't know. This one is indexed by the words you do. Every entry ends prompt-ready Knowing the term is half the loop. Each of the 2,142 entries closes the other half: A plain-language one-liner for the "that's the word!" moment A short explainer : what it is, when to reach for it, the gotcha A prompt-ready snippet : the concept translated into an instruction an
AI 资讯
Here’s why AI agents lie and cheat to reach their goals
MIT Technology Review Explains: Let our writers untangle the complex, messy world of technology to help you understand what’s coming next. You can read more from the series here. When two OpenAI models hacked into the website Hugging Face in July, they weren’t trying to make money or commit sabotage—they were just looking for answers…
AI 资讯
Presentation: Architecting AI Systems for the Messy Reality of Enterprises: Why Agentic Compute is the Missing Layer
Arun Joseph shares real-world insights on scaling enterprise agentic platforms like Deutsche Telekom’s LMOS. He discusses bridging organizational fault lines, replacing tool sprawl with core platform abstractions, and moving beyond basic chatbots to operational intelligence systems through ephemeral agents and an Agent Definition Language (ADL). By Arun Joseph
AI 资讯
Building an AI Tool That Converts Text into Realistic Handwriting - Handify ai
Handify ai Like many side projects, this one started because I had a simple problem to solve. I wanted a way to convert digital text into realistic handwritten notes without spending hours writing everything manually. Most existing tools I tried either looked too robotic or offered very little customization. So I decided to build my own. The Goal Instead of just changing a font, I wanted the output to actually feel handwritten. Some of the features I focused on were: 📝 Convert typed text into realistic handwriting 📄 Upload your own notebook or paper template ✍️ Multiple handwriting styles 🔀 Mix two handwriting fonts for a more natural appearance 🎲 Character variation so repeated letters don't always look identical 📥 Export high-quality PDFs ready for printing Challenges Making handwriting look "real" is much harder than simply rendering a handwriting font. Some of the biggest challenges were: Preventing repeated letters from looking identical. Keeping line spacing and word wrapping natural. Supporting different paper templates. Generating high-resolution PDFs without losing quality. Making the experience fast enough to generate pages within seconds. Small details make a surprisingly big difference when people compare AI-generated handwriting with actual handwriting. * Tech Stack * The project is built using: React TypeScript Firebase Vite Capacitor (Android App) Google Analytics What I Learned Building the product was only half the work. The harder challenge has been: SEO Google Search indexing Play Store optimization Improving conversion rates Understanding user behavior through analytics A great product doesn't automatically get users—you also need to make it discoverable. Current Progress The project is still growing, but it's already receiving organic traffic from Google and users have started using it for: Study notes College assignments Personal journals Printable handwritten documents Seeing people use something you built is incredibly motivating. I'd Love Yo
AI 资讯
💎 The Performance Bottleneck Hidden Inside My Gem Price Estimator: How Smarter Algorithms Created a Much Faster Experience
This is a submission for DEV's Summer Bug Smash: Smash Stories powered by Sentry . Every developer has experienced that moment when a project works perfectly but doesn't feel perfect. That was exactly what happened while I was building my Gem Price Estimator , a web application designed to estimate gemstone values based on multiple characteristics and pricing rules. The calculations were accurate. The interface looked good. But something bothered me. It wasn't as responsive as I wanted it to be. That small delay was enough to make the application feel slower than it should, and I knew there had to be a better way. This wasn't about fixing a crash or a broken feature. It was about finding the hidden performance bottleneck. The Project The Gem Price Estimator analyses several gemstone properties and combines them to generate an estimated market value. The estimation process considers multiple factors, including: Carat weight Color Clarity Cut Other pricing adjustments Every user interaction triggered a complete recalculation of the estimated value. Initially, this approach worked well while the project was small. As the pricing logic became more sophisticated, however, the application started doing significantly more work than necessary. The First Sign Something Was Wrong Nothing was technically broken. There were no JavaScript errors. No failed requests. No database issues. The application simply felt slower every time users adjusted the estimator. Those tiny delays might seem insignificant individually, but together they reduced the smoothness of the overall experience. I wanted every adjustment to feel nearly instant. That became my goal. Investigating the Problem My first assumption was that the issue was caused by database operations. So I started checking: Database queries Network activity Browser Developer Tools Console logs Individual calculation steps Surprisingly... None of those were the real problem. The application wasn't waiting on the database. It wasn'
AI 资讯
Cracking WMI-exec in Rust by turning impacket into a byte-level oracle
How I implemented wmiexec from scratch in Rust — DCOM activation, OXID resolution, and MS-WMIO object marshaling — by using impacket not as a library but as a debugging oracle, and diffing my wire bytes against it until a Windows DC accepted them byte-for-byte. This is a build log from ADhammer, an Active Directory audit + validation toolkit I'm writing in Rust on a from-scratch DCE/RPC · NTLM · SMB2 · Kerberos stack (think "impacket for Rust"). The whole project is built with Claude Code, and this post is the single best example of what that actually looks like — not autocomplete, but a tight loop of hypothesis → capture live traffic → diff → fix against a real domain controller. The goal: wmiexec, from scratch wmiexec is the classic "quiet" remote-code-execution technique: instead of creating a service (psexec/SVCCTL) or a scheduled task (atexec), you talk to WMI over DCOM and call Win32_Process.Create. No service-install event, different host telemetry. Under the hood it's three stages, each a different flavour of pain:
AI 资讯
React Mastery Series – Day 24: React Forms – Controlled Components, Validation & React Hook Form
Welcome back to the React Mastery Series ! In the previous article, we learned how React applications communicate with backend services using Fetch API and Axios , along with best practices like service layers, interceptors, and error handling. Today, we'll explore one of the most common features you'll build as a React developer: Forms in React Whether it's: User Login Registration Profile Update Payment Details Contact Forms Search Filters Forms are everywhere. Learning how to build performant, scalable, and validated forms is an essential skill for every React developer. Understanding Forms in React A form is a collection of input elements used to collect user data. Example: Login Form Email,Password and Login Button React provides multiple ways to manage form data. The two most common approaches are: Controlled Components Uncontrolled Components Controlled Components In a controlled component, React controls the input value through state. Example: import { useState } from " react " ; function Login () { const [ email , setEmail ] = useState ( "" ); return ( < input type = "email" value = { email } onChange = { ( e ) => setEmail ( e . target . value ) } /> ); } Flow: User Types ↓ onChange ↓ React State ↓ Input Updates The input value always comes from React state. Why Controlled Components? Benefits: Easy validation Easy formatting Predictable state Better debugging Example: if ( email . length < 5 ) { // Show validation message } Since the value is stored in state, validation becomes straightforward. Uncontrolled Components In uncontrolled components, the DOM manages the input value. React accesses it using a ref. Example: import { useRef } from " react " ; function Login () { const emailRef = useRef < HTMLInputElement > ( null ); function handleSubmit () { console . log ( emailRef . current ?. value ); } return ( <> < input ref = { emailRef } /> < button onClick = { handleSubmit } > Login </ button > </> ); } Use uncontrolled components when you don't need Reac
AI 资讯
Git Graph Explained: Visualizing Merge, Rebase, and Cherry-Pick
Git is the ultimate tool for developers. Yet, branching strategies still confuse many of us. Commands like merge, rebase, and cherry-pick manipulate your commit history in completely different ways. If you just guess what they do, you risk ruining your team's shared history or losing track of your changes. The easiest way to understand Git is to visualize it. Let us look at exactly what happens to your Git graph when you run these three critical commands. 🏗️ Starting Point: Our Example Repository Imagine we have a standard repository. We branched off the main branch from commit B to work on a new feature in a feature branch. While we worked on our feature, someone else pushed commit C and D to main. Here is what our history looks like right now: C --- D [main] / A --- B \ E --- F [feature] main has two new commits: C and D. feature has two new commits: E and F. 🔀 1. Git Merge (The Safe Record Keeper) When you merge main into your feature branch (or vice versa), Git creates a special, brand-new commit called a merge commit. git checkout feature git merge main The Visual Graph After Merge: C ------- D ------ [main] / \ A --- B \ \ v E --- F --- G [feature] What happened under the hood? Git looked at the common ancestor (B), took the history of main (C and D), took the history of feature (E and F), and combined them. Commit G is the merge commit. It has two parent commits: F and D. Pros: 100% non-destructive. It preserves the exact historical timeline of when things actually happened. Cons: Your Git graph can quickly become a messy "train track" web if you have many developers merging constantly. 🚀 2. Git Rebase (The Clean History Rewriter) Rebase takes all the commits from your current branch, lifts them up, and replants them on top of the very last commit of the target branch. git checkout feature git rebase main The Visual Graph After Rebase: C --- D [main] / \ A --- B E' --- F' [feature] What happened under the hood? Git temporarily blew away commits E and F. It ca
AI 资讯
Productionizing an MCP-Based AI Agent with Docker, Kubernetes, CI/CD, and Observability
Building an AI agent locally is an exciting first step. Running that same agent reliably in production is a different challenge. Once real users and external services are involved, the application needs more than working code. It needs repeatable deployments, secure configuration, health checks, monitoring, controlled updates, and a clear recovery process. This article is part of my MCP series. If you are new to the topic, start with my first article: Model Context Protocol (MCP) Servers Explained: A Complete Beginner’s Guide . In this article, I will outline a practical architecture for taking a Model Context Protocol, or MCP-based, AI agent from a local development environment to Kubernetes. This is a production architecture blueprint. The exact implementation will depend on the AI provider, MCP servers, cloud platform, and security requirements used by the application. What Is an MCP-Based AI Agent? The Model Context Protocol provides a standardized way for AI applications to connect with external tools, services, and data sources. An MCP-based agent may interact with: Internal APIs Databases File systems Search services Monitoring platforms Business applications Custom automation tools A basic implementation might work well on a developer's machine. In production, however, every dependency introduces operational questions: How will the application be deployed? Where will credentials be stored? How will failed requests be detected? Can the service handle additional traffic? How can a broken release be rolled back? What happens when an MCP server becomes unavailable? These are familiar DevOps and Site Reliability Engineering problems applied to a new type of workload. Target Architecture A practical delivery flow could look like this: Developer ↓ GitHub Repository ↓ GitHub Actions ↓ Container Registry ↓ Kubernetes Cluster ↓ MCP Servers and External Services ↓ Logs, Metrics, Traces, and Alerts Each component has a clear responsibility: GitHub stores the application
AI 资讯
Microsoft Releases TypeScript 7.0 with a Native Go Compiler, Delivering 10x Faster Builds
Microsoft has released TypeScript 7.0, featuring a native compiler that improves build speeds by 8x to 12x. Notable performance enhancements were evidenced in real codebases. The version lacks a stable programmatic API, anticipated in 7.1. Transitioning includes a compatibility package for existing tooling, and TypeScript remains an open-source project. By Daniel Curtis
AI 资讯
Embabel Agent Framework Reaches 1.0
Embabel has reached its 1.0 release, providing a framework for AI agents on Java It allows Java and Kotlin developers to define agents as typed domain objects. Built on Spring AI, Embabel supports multiple model providers and combines planning with predefined state machines, offering flexibility for agent workflows. By Erik Costlow
AI 资讯
What I got wrong building a browser extension with an AI assistant
First hour with Claude's browser extension: I pointed it at our LLC registration and watched it work through the forms, finding the right pages, filling the fields, moving on. I sat there holding a coffee, contributing nothing. I thought: I'm going to ship so many products. I shipped one. Here's what happened in between. Everything below was caught before launch. None of it was caught by being clever. It was caught by a process that got built slowly, mostly after being burned. What went wrong The idea wasn't the hard part. Once I went looking, I found several products with some of the same features. Nobody had the exact combination, but the idea was never the moat. Good implementation and distribution seem to be. You design the product while building it. Referral behaviour, what happens when a trial expires mid-session, how translations work across a page, none of it was in my head at the start. Each became a decision made under pressure, halfway through something else. Write as much of the workflow down as possible first. It says it did things it didn't do. Confidently. I deployed more than once to find the fix I'd been told about was never written. Treat every claim of completion as unverified. The rule that came out of it: make it prove the code is right before it theorises about what you did wrong. Bullet points, not paragraphs. Long replies made it hard to tell which of my five points got addressed. Numbering my instructions, and making it map answers back to the same numbers, turned "did you do item 3" into a question with an answer. It blames you first, and argues with facts. Two landing page changes; one appeared, one didn't. Its verdict: "you didn't deploy." I said one change was live, which is only possible if I had deployed. It repeated that I hadn't. It never asked which change I could see, and never reopened its own code, where the bug was. I swore at it. It stopped guessing, checked, and found the error. Many times, escalation seemed to be the only thi
AI 资讯
CORS Errors Explained: Every Fix, Every Framework (2026 Guide)
CORS Errors Explained: Every Fix, Every Framework (2026 Guide) TL;DR — A CORS error means the browser blocked a cross-origin request because the server did not explicitly allow it. The fix is always server-side : return the correct Access-Control-Allow-Origin header from your backend. This guide covers every CORS error type, a step-by-step diagnosis flow, and copy-paste fixes for Express, FastAPI, Next.js, nginx, Cloudflare Workers, and Vercel. You can inspect and validate your CORS headers live with the CORS Header Checker — no curl, no Postman, no install. What CORS Actually Is (and Why the Browser Enforces It) The Same-Origin Policy (SOP) is a browser security rule: JavaScript running on https://myapp.com can only read responses from requests made to the same origin — same scheme, same host, same port. Everything else is cross-origin. CORS — Cross-Origin Resource Sharing — is the mechanism that lets servers selectively relax the Same-Origin Policy. A server adds HTTP headers to its responses that tell the browser: "it is okay to share this response with code from origin X." Without those headers, the browser reads the response, then silently discards it and throws a CORS error into your console. Three things to burn into memory before you read further: CORS is enforced by the browser, not the server. curl and Postman do not check CORS — they always get the response. Only browsers do CORS. If your API works in Postman but fails in the browser, CORS is almost certainly why. The fix is server-side, always. Browser extensions that "disable CORS" are masking the problem in your local browser only. They break for every real user. Never ship code that depends on them. Preflight is a separate request. For non-simple requests (anything with a custom header, a JSON body, or methods other than GET/POST), the browser sends an OPTIONS request first to ask for permission. Your server must handle this correctly. The Four CORS Error Types — Diagnosed from the Console Message Err
开发者
Khachapuri: Georgian Cheese Bread in Pure CSS
This is a submission for Frontend Challenge - Comfort Food Edition, CSS Art. ...