Why we replaced Node.js with Bun for 5x throughput
submitted by /u/fagnerbrack [link] [留言]
找到 11169 篇相关文章
submitted by /u/fagnerbrack [link] [留言]
On June 10th, the German container ship Posen docked in Los Angeles after a two-week voyage from Shanghai. As Valve watcher Brad Lynch notes, it was almost certainly carrying the first mass production shipments of the Steam Frame, Valve's new gaming headset. Import records show that Valve's distribution partner Ceva offloaded nearly 32 metric tons […]
submitted by /u/thegeekyasian [link] [留言]
All tests run on an 8-year-old MacBook Air. All results from shipping 7 Mac apps as a solo developer. No sponsored opinion. After 7 Tauri apps, I type the same commands constantly. Here's the reference I wish existed when I started. Project setup # New project npm create tauri-app@latest # Add to existing project npm install --save-dev @tauri-apps/cli npx tauri init Development # Dev mode (hot reload) npm run tauri dev # Dev with specific log level RUST_LOG = debug npm run tauri dev # Dev with backend logs visible npm run tauri dev 2>&1 | grep -v "^$" Building # Standard build npm run tauri build # Universal binary (Intel + Apple Silicon) npm run tauri build -- --target universal-apple-darwin # Debug build (faster, no optimization) npm run tauri build -- --debug Plugins npm run tauri add global-shortcut npm run tauri add fs npm run tauri add shell npm run tauri add notification This updates both Cargo.toml and the plugin registration. Faster than doing it manually. Permissions (tauri.conf.json) { "app" : { "security" : { "capabilities" : [ { "identifier" : "main-capability" , "description" : "Main window capabilities" , "windows" : [ "main" ], "permissions" : [ "fs:read-all" , "fs:write-all" , "shell:execute" , "global-shortcut:allow-register" ] } ] } } } Tauri v2 requires explicit permission declarations. If a command silently does nothing, check permissions first. Common Rust patterns // Get app data directory let data_dir = app .path () .app_data_dir () .unwrap (); // Emit event to frontend app_handle .emit ( "event-name" , payload ) .ok (); // Get window let window = app .get_webview_window ( "main" ) .unwrap (); // App state app .manage ( MyState :: new ()); let state = app .state :: < MyState > (); Notarization (macOS) # Submit for notarization xcrun notarytool submit app.dmg \ --apple-id YOUR_APPLE_ID \ --team-id YOUR_TEAM_ID \ --password YOUR_APP_PASSWORD \ --wait # Staple after notarization xcrun stapler staple app.dmg Debugging # Check what's in the bundle
Hey tech family! 👋 If you’ve noticed your favorite Chrome extensions acting a bit differently lately or if you're a developer currently sweating over a massive codebase rewrite you are experiencing the era of Manifest V3 (MV3) . 🤖 Google has officially pushed the web ecosystem forward by deprecating Manifest V2, making MV3 the absolute standard for how browser extensions behave. But why is this happening, what actually changed, and why is the internet so divided over it? Let’s break it all down in plain English! 👇 🧐 What Exactly is Manifest V3? Think of a "Manifest" as the blueprint file ( manifest.json ) that tells the browser exactly what an extension is, what files it uses, and what permissions it needs to run. Manifest V3 is Google's major architectural overhaul of this system. Its core mission sounds great on paper: improve user privacy, beef up security, and boost browser performance . However, achieving those goals meant rewriting the core rules of how extensions interact with your browser. 🛠️ The Biggest Changes & New Features MV3 isn't just a small patch; it fundamentally alters the underlying extension engine. Here are the headline shifts: Goodbye Background Pages, Hello Service Workers! 💤 In MV2, extensions used hidden, persistent background pages that ran 24/7, hogging your computer's RAM even when you weren't using them. MV3 replaces these with Service Workers. They are event-driven meaning they wake up, execute a task (like clicking an extension icon), and go right back to sleep. Hello, free RAM! 🐏 The Ad-Blocker Shakeup: webRequest vs. declarativeNetRequest 🛑 This is the most controversial change. In MV2, powerful extensions like uBlock Origin used the webRequest API to intercept, read, and block network requests in real-time using complex code. MV3 replaces the blocking version of this with declarativeNetRequest . Instead of letting the extension intercept the data, the extension must now hand Chrome a pre-defined list of rules, and Chrome does the b
Originally written for bulldo.gs — republished here with the canonical link pointing home. I have a spreadsheet of names and email addresses and I want to send each person a personalized message from my Gmail account without copy-pasting or using a paid tool. // Mail merge: Sheet cols A=Name, B=Email, C=Sent // Run from Apps Script; authorize Gmail + Sheets scopes function sendMerge () { var sheet = SpreadsheetApp . getActiveSheet (); var rows = sheet . getDataRange (). getValues (); var quota = MailApp . getRemainingDailyQuota (); var sent = 0 ; for ( var i = 1 ; i < rows . length ; i ++ ) { if ( rows [ i ][ 2 ] === ' Sent ' ) continue ; if ( sent >= quota ) { Logger . log ( ' Quota reached at row ' + ( i + 1 )); break ; } var name = rows [ i ][ 0 ]; var email = rows [ i ][ 1 ]; var subject = ' Hey ' + name + ' , here is your update ' ; var body = ' Hi ' + name + ' , \n\n Your personalized content goes here. \n\n Thanks ' ; MailApp . sendEmail ( email , subject , body ); sheet . getRange ( i + 1 , 3 ). setValue ( ' Sent ' ); sent ++ ; } } Set up your sheet and open the script editor Put names in column A, email addresses in column B, and leave column C blank — the script writes 'Sent' there as it goes. Header row in row 1 is assumed; the loop starts at index 1 (row 2) to skip it. Open the script editor from Extensions > Apps Script, paste the function, and save. The first time you run sendMerge() Google will ask you to authorize two scopes: Sheets (read/write the active spreadsheet) and Gmail (send mail on your behalf). Both are required. If you only see a Sheets prompt, delete the file and re-paste — a cached partial authorization sometimes skips the Gmail scope on older script files. Why the Sent column is the whole point Consumer Google accounts cap at roughly 100 outgoing recipients per 24-hour rolling window via MailApp. If your list has 200 rows and you run the script at 11 pm, it will send 100 and log 'Quota reached at row 101'. Without the Sent check, a sec
I've been writing about AI coding tools for months here on Dev.to. Comparisons, benchmarks, tutorials on how to squeeze the most out of Claude Code, Cursor, and the rest. And I do use them. Every single day. But last week I tried something that surprised even me. I turned them off completely. For an entire week, no AI-generated code, no autocomplete suggestions, no "explain this function" prompts. Just me, my editor, and a blinking cursor. Here's what actually happened. The First Few Days Were Rough Day one was humbling. My output dropped by maybe half. What normally took 15 minutes stretched to 40. I found myself reaching for the Cmd+K shortcut out of muscle memory half a dozen times. But somewhere around day three, something shifted. I started reading source code instead of asking for summaries. I traced through execution paths instead of having the LLM walk me through them. I caught a subtle race condition that Claude Code had confidently dismissed as "not an issue" in the same codebase two weeks prior. That moment stuck with me. The Code Was Cleaner Here's the part I didn't expect. By day five, my code was noticeably simpler. Not because an LLM optimized it, but because I actually understood the problem well enough to keep it simple. AI-generated code often over-engineers. It adds abstractions for scenarios that don't exist. It writes defensive checks for edge cases that don't apply to your use case. It looks professional but carries unnecessary complexity. When you write it yourself, you stop at the simplest working solution because you know when you're done. An LLM doesn't know when you're done. It just keeps going until the context window runs out. The Real Cost of Productivity This is the part I've been thinking about most. AI tools remove friction. That's their superpower. But friction isn't always bad. The struggle of debugging your own code is how you learn a codebase. The effort of designing an API is how you develop taste for what makes a good one. If y
“I’m not sure that this company supports a hackathon culture anymore,” one employee posted in a forum open to the entire staff.
The deal has sparked fear over the future of the film, television and news industries.
submitted by /u/funnybong [link] [留言]
A new report suggests the unit, which employs 6,500 people, is on the verge of revolt.
Better orchestration, fewer handoffs, faster progress, without a single new knob. The post How we made GitHub Copilot CLI more selective about delegation appeared first on The GitHub Blog .
After covering the foundational building blocks in Session 1, the next step is one of the most important problem-solving techniques in all of programming: recursion . And once recursion feels comfortable, it unlocks a powerful search strategy called backtracking . These two concepts appear everywhere in competitive programming — Fibonacci, binary search, tree traversal, merge sort, dynamic programming, N-Queens, and more. They deserve their own spotlight. 🌟 What Is Recursion? A function is recursive if it calls itself. Instead of solving a problem in one go, a recursive function breaks it into a smaller version of the same problem, solves that, and repeats — until the problem becomes simple enough to answer directly. Three things define every recursive solution: The problem is expressed in terms of a smaller instance of itself Each call reduces the problem size There is a point where the problem becomes trivial and no further calls are needed — this is the base case The Nested Box Analogy Think of recursion like opening nested boxes. A big box contains a smaller box, which contains another, and so on. Eventually you find the item you were looking for. That innermost box is the base case. Without it, you would keep opening boxes forever — which is how you get a stack overflow, not a solution. Base Case and Recursive Case Every recursive function has exactly two parts: Recursive case — the problem is reduced in size and the function calls itself again. Base case — the terminating condition. No further recursive call is made. The function returns a direct answer. Both are non-negotiable. A function without a base case will keep calling itself, consuming stack memory until the program crashes. Example: Factorial 5! = 5 × 4! 4! = 4 × 3! 3! = 3 × 2! 2! = 2 × 1! 1! = 1 ← base case Each step reduces the problem by one. When the function hits 1! = 1 , it stops, and the results unwind back up the call stack. In pseudocode: function factorial(n): if n == 1: return 1 # base cas
Local AI Coding Agents, Secure Production Deployment, and Angular-Specific AI Skills Today's Highlights This week's top stories highlight practical ways to deploy and secure AI agents, from setting up local coding assistants on macOS to sandboxing untrusted agent code in Azure, alongside new resources to improve AI-generated code quality for Angular. How to setup a local coding agent on macOS (Hacker News) Source: https://ikyle.me/blog/2026/how-to-setup-a-local-coding-agent-on-macos This guide provides a step-by-step tutorial on deploying and configuring an AI coding agent directly on a macOS system. The process typically involves setting up a local Large Language Model (LLM) or connecting to a local inference engine, integrating it with an orchestration framework, and configuring it to interact with local development tools and environments. The emphasis is on enabling developers to have a private, customizable AI assistant for code generation, debugging, and project scaffolding without relying on external cloud services. This local setup is crucial for privacy-conscious developers and for those who want to fine-tune agent behavior for specific internal codebases. The article likely covers prerequisites such as Python environments, relevant libraries, API key management for local models (if applicable), and how to set up the agent to execute code within a sandboxed environment on the machine. It offers a practical pathway for developers to experiment with AI agents in their daily coding workflows, providing immediate utility and control over the AI's operations and data handling. Comment: This is a great hands-on guide for anyone wanting to run AI coding agents locally, which is essential for privacy and custom development workflows. Run Untrusted AI Agent Code Safely with Azure Container Apps Sandboxes (InfoQ) Source: https://www.infoq.com/news/2026/06/untrusted-ai-agents-sandboxes/ Microsoft has announced the public preview of Azure Container Apps Sandboxes, a new
AI Fluency for Software Engineers: A Practical Playbook Beyond Prompting A few years ago, being productive with AI mostly meant knowing which tool to open and what question to ask. Today, that is not enough. For software engineers, AI is no longer just a chatbot sitting outside the workflow. It is becoming a thinking partner for architecture decisions, code reviews, production incidents, documentation, test planning, onboarding, and product discovery. But there is a problem: many teams are using powerful AI tools with weak operating habits. They ask vague questions. They paste too much context. They trust the first answer. They forget privacy boundaries. They use AI for speed, but not always for better engineering judgment. That is where AI fluency matters. AI fluency is not just prompt engineering. It is the ability to work with AI clearly, safely, and practically while staying in control of quality, reasoning, and responsibility. Here is a practical playbook I would recommend for software engineers and engineering teams. 1. Start with clarity, not clever prompts A weak prompt sounds like this: “Review this design and tell me if it is good.” The AI can answer, but the answer will likely be generic. A stronger prompt gives the AI a clear role, context, constraints, and output format: You are a senior backend architect. Review this proposed API design for a high-traffic order processing system. Evaluate: - correctness - scalability - failure handling - observability - backward compatibility - operational complexity Do not rewrite the whole design unless required. Separate critical risks from optional improvements. Output format: - Executive summary - Key risks - Recommended changes - Open questions - Final decision recommendation The difference is not word count. The difference is control. A fluent AI user does not hope the AI understands the task. They make the task hard to misunderstand. 2. Give enough context, but not everything AI output quality depends heavily o
LLM KV Cache Optimization, Open Model Evaluation, & Agent Engineering Skills for Local Deployment Today's Highlights This week, a groundbreaking KV cache layer promises to supercharge local LLM inference, alongside a new workbench for evaluating open language models. Additionally, a trending repository provides production-grade engineering skills for building robust AI agents, crucial for self-hosted deployments. LMCache: Supercharge Your LLM with the Fastest KV Cache Layer (GitHub Trending) Source: https://github.com/LMCache/LMCache LMCache introduces a novel KV cache optimization layer designed to significantly accelerate Large Language Model (LLM) inference. The KV cache (Key-Value cache) is a critical component in LLM decoding, storing previously computed keys and values for attention layers to avoid redundant calculations. Optimizing this cache is paramount for achieving high throughput and low latency, especially when running large models on consumer-grade hardware or self-hosted servers. This project aims to provide the fastest KV cache solution, directly addressing a key bottleneck in local LLM deployment and performance. By improving KV cache efficiency, LMCache enables developers and researchers to run more complex models or serve more users with existing hardware, making advanced LLMs more accessible for local inference scenarios. Details on its architecture and comparative benchmarks against existing solutions will be critical for understanding its impact on various open-weight models and frameworks like vLLM or llama.cpp. Comment: Faster KV cache is a game-changer for anyone running LLMs locally. This project could unlock new performance levels for open models on consumer GPUs. olmo-eval: An evaluation workbench for the model development loop (Hugging Face Blog) Source: https://huggingface.co/blog/allenai/olmo-eval The olmo-eval workbench from AllenAI provides a comprehensive system for evaluating language models throughout their development lifecycle.
Competitive programming often looks like a race to write code as fast as possible. But the real secret is simpler: the best competitive programmers are not just faster typists — they are better at choosing the right data structure, the right algorithm, and the right complexity level for the job. Before we jump into recursion, dynamic programming, graphs, or those problems that make your brain do backflips, we need a solid base. This first session is exactly that. Let's begin. 🚀 1. Data Types: What Kind of Data Are You Storing? A data type tells a programming language what kind of value a variable holds and what operations are valid on it. Primitive Data Types The basic building blocks provided by the language itself: Integer — whole numbers: 5 , 100 , -3 Float / Double — decimal values: 3.14 , 99.5 Character — a single symbol: 'A' , 'z' Boolean — true or false User-Defined Data Types When primitive types are not enough, programmers define their own: Structs — group related fields under one name Classes — structs with behaviour (methods) attached Enums — a fixed set of named constants Typedefs / Aliases — rename existing types for clarity A Real-World Example Imagine building a food delivery app: An integer stores the number of items in the cart A float stores the total bill amount A boolean tracks whether the order has been delivered A class represents an entire Order — customer name, address, items, payment status Data types are essentially the labels on your containers. Without them, chaos begins early. 2. Data Structures: How Do You Organise Data? If data types answer what a value is, data structures answer how to organise many values efficiently. This is where competitive programming starts to get interesting. Linear Data Structures Elements arranged one after another, like people queuing at a ticket counter: Arrays — fixed-size, indexed, fast random access Linked Lists — dynamic size, efficient insertions and deletions Stacks — last in, first out (LIFO) Queues
Verdict: Quick verdict: Zapier wins on simplicity and breadth — 7,000+ integrations, no-code setup, great for non-technical users. Make (formerly Integromat) wins on power-per-dollar — complex multi-step workflows at a fraction of Zapier's price, with a visual canvas that's genuinely better for complex logic. n8n wins if you're technical and willing to self-host — unlimited workflows, unlimited runs, zero ongoing cost after setup. For most small businesses: Make. For enterprises with non-technical teams: Zapier. For technical founders or developers: n8n. The automation tool market matured a lot between 2022 and 2026. Zapier, once the clear leader, is now meaningfully more expensive than its competitors — and Make and n8n have closed most of the feature gaps. If you're still paying Zapier prices without re-evaluating, you're almost certainly paying 3-5x what you need to. This comparison covers all three tools honestly, including their limits — because the right choice depends heavily on your technical comfort level and workflow complexity. The three tools at a glance Factor Zapier Make n8n (cloud) Free tier 100 tasks/month, 5 Zaps 1,000 ops/month, unlimited scenarios 2,500 steps/month, unlimited workflows Paid starts at $19.99/month (750 tasks) $9/month (10,000 ops) $20/month (10,000 steps) Native integrations 7,000+ 1,500+ 400+ (plus HTTP for anything) Visual workflow editor Linear, simple Canvas, branching Node-based, very flexible AI integration Yes (AI actions) Yes (AI modules) Yes (LangChain, OpenAI, etc.) Self-hosted option No No Yes (free, unlimited) Learning curve Low Medium High (developer-focused) Zapier — the everything-just-works option Zapier's advantage is breadth and simplicity. 7,000+ apps (essentially anything with an API), a straightforward "trigger → action" model, and enough guardrails that non-technical users rarely get stuck. If you need to connect Salesforce to Slack to Google Sheets without touching any code, Zapier is the fastest path from id
Executives and employees alike are struggling with Meta's chaotic AI strategy, according to sources and internal discussions reviewed by WIRED.
The first message ever sent across the network that became the internet was not "Hello, world." It was not a grand declaration. It was two letters, transmitted by accident, before the system fell over: LO . That two-letter packet is the ancestor of every connected device, every IoT sensor, and every web request running today. The story of how it happened is also a surprisingly useful lesson for anyone building embedded systems and connected hardware right now. What actually happened on October 29, 1969 On the evening of October 29, 1969, a programmer named Charley Kline sat at a terminal in Leonard Kleinrock's lab at UCLA. His job was simple on paper: log in to a remote computer at the Stanford Research Institute (SRI), roughly 350 miles away, over a brand-new experimental network called ARPANET. The plan was to type the command LOGIN . The remote machine at SRI was set up to auto-complete the rest once it saw the first few characters, so Kline only needed to start typing. He had a colleague on the phone at the Stanford end to confirm each letter arrived. He typed L . Stanford confirmed: "Got the L." He typed O . Stanford confirmed: "Got the O." He typed G - and the SRI system crashed. So the first message ever transmitted over ARPANET was "LO." As Kleinrock later liked to point out, it was an accidental but fitting first word: "LO" as in "lo and behold." About an hour later they fixed the bug and completed the full login, but the historic first packet had already gone out, two letters at a time. Why a crash is the perfect origin story It is tempting to read this as a cute footnote. It is more than that. The very first thing the internet ever did was fail partway through a transaction - and the system was built well enough that the humans on both ends knew exactly how far it had gotten before it died. That is the entire discipline of networked systems in miniature. Connections drop. Remote machines crash mid-request. Packets arrive out of order, or not at all. The n