AI 资讯
Announcing NgRx v22: Resource Extensions, Dynamic Deep Signals, a Light Theme, and more!
We are pleased to announce the latest major version of the NgRx framework, featuring exciting new features, bug fixes, and other updates. Resource Extensions 🧩 Angular's resource and httpResource APIs cover a large part of async state management, but two very common requirements are not configurable at the resource level: Value on loading: when a resource reloads, value() resets to undefined until the new data arrives. Value on error: when a resource enters the error state, reading value() throws. The new @ngrx/signals/resource entry point addresses both cases with resource extensions : a set of utilities for customizing the behavior of a Resource in a composable, reusable way. They wrap an existing resource and patch only the parts of its behavior that should change, while fully preserving the original resource type. The extendResource function accepts the resource as the first argument, followed by the extensions to apply: import { Component } from ' @angular/core ' ; import { httpResource } from ' @angular/common/http ' ; import { extendResource , withPreviousValueOnLoading , withValueOnError , } from ' @ngrx/signals/resource ' ; @ Component ({ /* ... */ }) export class TodoList { // type: HttpResourceRef<Todo[] | undefined> readonly todosResource = extendResource ( httpResource < Todo [] > (() => ' /api/todos ' ), withPreviousValueOnLoading (), withValueOnError ( undefined ) ); } The returned resource is still the exact resource that was passed in, so no access is lost to the APIs of more specific resource types, such as WritableResource . Only value() behaves differently: it keeps the previously loaded todos while a reload is in flight, and returns undefined instead of throwing when the request fails. Built-in Extensions There are four built-in extensions: withPreviousValueOnLoading keeps the last resolved value while the resource is reloading, which is exactly what paginated and filtered lists need to avoid flickering. withValueOnLoading returns a specific fal
AI 资讯
VMware Appliance OVF Properties update through CLI
This article is to update VMware appliance ovf properties through command line. Sometimes we cannot access VC and only can access VMs through ESX UI. Check over properties exists in VM login to VM as root and execute ovfenv command root@vcf91-installer [ ~ ]# ovfenv [vm.vmname]=VCF-SDDC-Manager-Appliance-9.1.0.0300.25536191 [ROOT_PASSWORD]= [LOCAL_USER_PASSWORD]= [vami.hostname]=vcf91-installer.mylab.com [guestinfo.ntp]=172.30.20.3 [vami.ip_address_version.SDDC-Manager]=IPv4 [vami.ip0.SDDC-Manager]=172.30.20.12 [vami.netmask0.SDDC-Manager]=255.255.255.0 [vami.gateway.SDDC-Manager]=172.30.20.1 [vami.ipv6.SDDC-Manager]=null [vami.ipv6_prefix.SDDC-Manager]=null [vami.ipv6_gateway.SDDC-Manager]=null [vami.domain.SDDC-Manager]=mylab.com [vami.searchpath.SDDC-Manager]=mylab.com [vami.DNS.SDDC-Manager]=172.30.20.2,172.30.20.3 Change the directory to the VM scripts folder where all the firstboot and subsequent boot scripts are stored. cd /opt/vmware/vcf/commonsvcs/scripts/ Example to change NTP server details cd /opt/vmware/vcf/commonsvcs/scripts/ntp/ root@vcf91-installer [ /opt/vmware/vcf/commonsvcs/scripts/ntp ]# ls -ltr total 12 -r-xr-x--- 1 root vcf 853 Jun 27 02:53 update-ntp_server.sh -r-xr-x--- 1 root vcf 231 Jun 27 02:53 setup-ntp.sh -r-xr-x--- 1 root vcf 45 Jun 27 02:53 refresh-ntp.sh ./update-ntp_server.sh 172.30.20.250 reboot the VM
AI 资讯
Valor, Point72 back General Intuition at $6B valuation as AI startup pushes into robotics
General Intuition, the startup building a foundation model that trains generalized AI agents how to move through space and time, is in talks to raise at a $6 billion pre-money valuation from new investors including Valor Ventures, Point72 Ventures, Seven Seven Six.
AI 资讯
OpenAI is building AI agents for everything. Will everyone use them?
Inside the frontier lab’s push to bring AI agents from software engineers to the masses.
AI 资讯
Netflix reportedly considers opening its app to other streamers
Netflix executives have considered making third-party streaming services available within its app, according to a report from The New York Times. The recent discussions reportedly centered around bringing Peacock and Fox One to Netflix, though it's unclear whether the streaming giant would sell subscriptions to the other services or add their content to its app. […]
AI 资讯
How to Build a Fair A/B Audio Preview for AI Processing
Two audio players do not make a fair before-and-after test. If the second player restarts from zero or takes half a second to load, the user is no longer comparing two versions of the same moment. They are comparing two memories. That is a weak way to evaluate any audio effect. It is especially weak for AI processing. A denoiser can remove a fan while softening consonants. A de-reverb model can reduce the room tail while making the voice sound less natural. The output may be cleaner without being better. The preview therefore has one job: let the listener switch quickly enough to hear both the improvement and the damage. The rule I use is deliberately boring. Both versions should contain the same edit and play from the same position. Switching should not restart playback or create a pause. The interface should not hint that one version is supposed to win. Two independent <audio> elements fail surprisingly quickly. Each owns its playback state, buffering behavior, clock, and seek operation. The user ends up finding the same position twice and comparing one sound with a memory of another. A better interface has one transport and one version control: [ Play ] [ Original | Processed ] 00:18 ━━━━━━━ 00:42 The transport decides where playback happens. The segmented control decides which signal is audible. One transport, two signals For a short preview, I decode both files into AudioBuffer s, start them at the same AudioContext time and offset, and route each through its own GainNode . Both sources run; only one gain is open. decodeAudioData() decodes complete file data and resamples it to the context's sample rate. The decoded buffers can then share the same audio clock. See the MDN documentation for format and loading details. The core is small: const context = new AudioContext (); const originalGain = context . createGain (); const processedGain = context . createGain (); originalGain . connect ( context . destination ); processedGain . connect ( context . destination )
AI 资讯
Fzf - o que é, como instalar e onde usar no dia a dia
1. O problema que o Fzf resolve Quem vive no terminal conhece a cena: Ctrl+R para buscar um comando no histórico, mas a busca é linear e só mostra um resultado por vez; cd para um diretório profundo, mas é preciso lembrar (ou digitar) o caminho inteiro; git checkout para uma branch, mas primeiro é necessário rodar git branch e copiar o nome exato. Em todos esses casos, o gargalo é o mesmo: escolher um item entre muitos, digitando cada vez mais texto até sobrar só um. O fzf (fuzzy finder) resolve isso de um jeito genérico: ele pega qualquer lista de linhas — histórico de comandos, arquivos, branches, processos, o que for — e transforma essa lista em um filtro interativo, digitado em tempo real, onde não é preciso acertar a grafia exata nem a ordem das letras. Basta digitar pedaços do que se lembra e o fzf ordena os resultados por relevância. 2. O que é o Fzf Fzf é um filtro de linha de comando escrito em Go, de código aberto, mantido por Junegunn Choi. Ele não sabe nada sobre arquivos, git ou processos — a única coisa que ele faz é ler linhas da entrada padrão ( stdin ) e devolver, na saída padrão ( stdout ), a linha (ou linhas) selecionada interativamente. Essa simplicidade é o que o torna tão versátil: qualquer comando que produza uma lista de texto pode ser "encanado" ( | ) para dentro do fzf. # a ideia básica: qualquer lista vira um menu interativo ls | fzf history | fzf git branch | fzf ps aux | fzf Na prática, o fzf raramente é usado sozinho dessa forma — o valor real aparece quando ele é integrado ao shell e a outras ferramentas, o que este artigo cobre a partir da próxima seção. 3. Instalando o Fzf O fzf está disponível nos principais gerenciadores de pacote: # Debian/Ubuntu sudo apt install fzf # Fedora sudo dnf install fzf # Arch Linux sudo pacman -S fzf # macOS (Homebrew) brew install fzf Também é possível instalar via git, o que traz um script auxiliar de configuração dos atalhos de shell (usados na próxima seção): git clone --depth 1 https://github.com/j
AI 资讯
NASA’s New Space Telescope Is Poised to Discover Hidden Facets of the Universe
The Nancy Grace Roman Space Telescope is expected to discover as many as 200,000 new planets and reveal details about the elusive nature of dark matter and dark energy.
产品设计
Best UI/UX Design Tools I Keep Coming Back to as a Designer
If you’re a designer, you’ve probably had the same problem I’ve had: there are dozens of UI/UX design...
开发者
I Used React DataGrid to Build a Real Space Mission Explorer
I went through the documentation and feature list of React DataGrid, and I wrote React DataGrid: A...
AI 资讯
Architectural Breakdown: We fixed the eval platform we're competing on: a TypeError that crashed thr
We Fixed the Eval Platform: The TypeError That Took Down Three Benchmark Pipelines At 3 AM, Sentry lit up with TypeError: Cannot read property 'map' of undefined . Three benchmark pipelines crashed. Not a memory leak, not a segfault, but a race condition hiding behind a TypeError, turning a high-stakes eval run into chaos. Here is how we resolved it, with no fluff. The Root Cause: Async Data Meets Blind Faith in .map() The error trace pointed to evaluator.ts:42 , where .map() assumed inputData.metrics would always exist. The junior dev tested with clean data, but in production, fetchBenchmarkData() (async) and evaluatePipeline() (sync) were racing . At 100+ RPS, metrics was often undefined . The Offending Code: const results = inputData . metrics . map ( metric => computeScore ( metric )); Why It Failed: Race Condition : inputData was fetched asynchronously, but evaluatePipeline() treated it as synchronous. OOM Risk : Unbounded .map() on 10K+ metrics could exhaust 8GB RAM. Worker Starvation : No concurrency limits led to thread pool exhaustion. The Fix: Guard Clauses, Bounded Queues, and Pragmatism Step 1: Fail Fast, Fail Loud Added zero-overhead runtime checks to reject bad data early: // eval-platform/core/evaluator.ts import { isNullOrUndefined } from ' ../utils/guards ' ; async function evaluatePipeline ( inputData : BenchmarkInput ): Promise < EvaluationResult > { if ( isNullOrUndefined ( inputData ?. metrics )) { throw new Error ( ' EVAL_400: metrics missing ' ); } // Proceed only if data is valid } Why? Stops TypeError crashes immediately. Cost: 1-2 CPU cycles. Negligible. Step 2: Chunked Processing for 8GB RAM Original code processed all metrics at once, causing OOM crashes. Fixed with 100-item chunks: const CHUNK_SIZE = 100 ; // 100 items ≈ 10MB peak memory const results : number [] = []; for ( let i = 0 ; i < inputData . metrics . length ; i += CHUNK_SIZE ) { const chunk = inputData . metrics . slice ( i , i + CHUNK_SIZE ); results . push (... chunk . map
AI 资讯
Building PickTool with Next.js and Laravel: Lessons from Creating a Software Discovery Platform
Finding software is easy. Finding the right software is not. Search for almost any category—email marketing, CRM, productivity, design, or AI—and you will find hundreds of options. Every product presents itself as the best choice, while many comparison articles repeat the same features without explaining which users each tool actually suits. That problem inspired me to build PickTool , a platform for discovering and comparing AI and SaaS tools. PickTool is still evolving. I am currently improving its content quality, tool coverage, comparison experience, performance, and SEO structure. This is not a polished launch announcement. It is an honest look at the architecture behind the project and some of the lessons I have learned while building it. What Is PickTool? The goal of PickTool is simple: Help people find the right software in minutes, not hours. Instead of creating a basic directory filled with product names and affiliate links, I want each important tool to include useful and structured information, such as: Core features Pricing model Best use cases Strengths and limitations Ratings and evaluation criteria Alternatives Direct comparisons Related guides and category pages The challenge is that this creates several interconnected types of content. A single product can appear on its own tool page, inside a category, in multiple comparisons, and in articles about the best software for a particular use case. Keeping all of this consistent requires more than publishing isolated blog posts. Why I Chose Next.js and Laravel PickTool uses a decoupled architecture: Next.js powers the public-facing website. Laravel powers the backend, API, database logic, and administration system. MySQL stores tools, categories, ratings, pricing information, and editorial content. I chose this combination because I wanted the frontend and content-management logic to evolve independently. Laravel provides a structured backend for managing relationships between tools and content. Next.js
AI 资讯
App-like UX in Next.js 16.3
Building App-like Experiences with Next.js 16.3 A hands-on look at how Next.js 16.3 helps apps feel fast and smooth, more like a single-page app, without losing the benefits of server rendering. Using four demo apps, it shows how features like Instant Navigations, Cache Components, Partial Prefetching, optimistic updates, Suspense streaming, offline retry, and View Transitions work together in real apps ⚡️ Sponsor: Arcjet AI compliance controls Protect your AI applications from prompt injection, PII leaks, and unauthorized tool calls. 📙 Articles / Tutorials / News Next.js team AMA The Next.js team opened the floor to community questions and covered a lot of ground. The AMA focused on Next.js 16.3, performance, caching, App Router, React Server Components, and upgrading apps, along with some insight into how the team works on the framework Coordinating Optimistic Updates in Next.js This guide shows how useActionState and useOptimistic can work together to keep the UI updated right away, save changes in the right order, and roll back cleanly if something fails Using next/root-params in Next.js 16.3 The new next/root-params API lets Server Components read top-level params like [locale] from deep in the tree, which makes next-intl much easier to use Docs for React's new browser() API The docs for React's new browser() API are now available in Canary. You can pass it to use() , where it suspends to the nearest Suspense boundary on the server, then renders normally in the browser 📦 Projects / Packages / Tools Better Auth 1.7 A big release for Better Auth, especially around OAuth, OpenID Connect, SCIM, SSO, MCP, and device login flows. The main theme here is stronger auth, better enterprise identity support, and more standards-based ways for apps and devices to sign in and get access Next 16 Calendar "Flow" A calendar and booking demo exploring Async React, Cache Components, Partial Prefetching, and View Transitions with Next.js 16.3, React 19, Tailwind CSS v4, and Prisma.
AI 资讯
Is it legal to train AI models on copyrighted books? It’s complicated
Most published authors have, without their knowledge or consent, contributed to the development of the same AI tools that threaten to undermine their livelihoods. That seems illegal, right?
开发者
Cómo solucionar el error \"Text content does not match server-rendered HTML\" en Next.js App Router
Cómo solucionar el error "Text content does not match server-rendered HTML" en Next.js App Router Este error ocurre cuando el HTML generado en el servidor (SSR/SSG) no coincide con el árbol de React que se construye durante la primera renderización en el navegador (hydration). Es un problema crítico de consistencia de estado que rompe la experiencia de usuario y puede causar comportamientos impredecibles. 🔍 Causa raíz (diagnóstico técnico) En tu caso, el error está relacionado con contenido dinámico que varía entre renderizado del servidor y renderizado del cliente , probablemente causado por: Uso de Date() , Math.random() , localStorage , window , o APIs del navegador directamente en el render . Uso de typeof window !== 'undefined' como condición de renderizado (no es idempotente entre SSR y CSR). Metaetiquetas de detección automática de iOS ( format-detection ) que inyectan nodos <a> en tiempo de ejecución. Extensiones del navegador (especialmente en desarrollo) que modifican el DOM. Librerías CSS-in-JS mal configuradas que inyectan clases o estilos dinámicos en CSR. ⚠️ Nota crítica : Next.js App Router no permite el uso de useEffect para evitar el mismatch en el primer render — el mismatch debe prevenirse , no suprimirse . ✅ Solución definitiva (pasos verificados) Paso 1: Elimina toda lógica no determinista del render NUNCA uses lo siguiente directamente en el cuerpo del componente: // ❌ Evitar const now = new Date (); // ❌ const isClient = typeof window !== ' undefined ' ; // ❌ const randomId = Math . random (); // ❌ const theme = localStorage . getItem ( ' theme ' ); // ❌ ✅ Reemplaza con: // ✅ Usar `useEffect` para *actualizar* el estado, no para *determinar* el render inicial import { useState , useEffect } from ' react ' ; export default function Component () { const [ time , setTime ] = useState < string > ( '' ); // Inicializa con valor seguro (ej. string vacío o placeholder) useEffect (() => { setTime ( new Date (). toISOString ()); }, []); return < time d
开发者
How to Build a Real-Time Google Docs for Code
What happens when two developers edit the EXACT same line of code at the EXACT same millisecond? Race conditions, overwritten data, and a crashed server. Today, we’re tearing down the magic behind Figma and Google Docs to build a real-time collaborative code editor using Next.js 16 and CRDTs ⏱️ CHAPTER 1: The Collaborative Text Editing Trap "Building a single-user code editor is simple: a React state variable, a text area, and a save button.But the moment two developers open that same code file at the exact same millisecond... everything breaks. User A types a function name at index 5, while User B deletes a line at index 2. If you simply push text updates to a database over HTTP, you get catastrophic race conditions, overwritten code, and cursor teleportation.So, how do platforms like Google Docs, Figma, and Replit allow thousands of users to type simultaneously in real-time without locking files or destroying data? Welcome back to Behind the Abstraction. Today, we’re building a real-time collaborative code editor using Next.js 16. We’ll strip away the magic of real-time state, compare Operational Transformation vs CRDTs, and implement WebSocket edge routing using modern Full-Stack architecture." ⏱️ CHAPTER 2: OT vs CRDTs - The Core Math of Real-Time "Before writing a single line of Next.js code, we must solve a fundamental computer science problem: Mathematical Consistency across Distributed Systems.There are two primary ways to resolve typing conflicts: Operational Transformation (OT): Used by classic Google Docs. Every keypress sends an 'operation' (like Insert "a" at index 10) to a central server. The server acts as the absolute referee, transforming index positions and broadcasting the fix back to all clients. The Problem: Centralized OT servers are complex, memory-heavy, and difficult to scale horizontally at the Edge. CRDTs (Conflict-free Replicated Data Types): Used by modern tools like Figma and VS Code Live Share. Instead of raw array indexes, every chara
AI 资讯
Building a Live, User-Controlled Canvas Background System That Doesn't Kill Low-End Phones
The idea Most apps give you a static background. I wanted Pairly to feel alive instead, so I built "Atmosphere": a real-time animated Canvas layer that sits behind every chat, fully tunable by the user, speed, density, opacity, brightness, saturation, all live. There are currently over 40 atmospheres in the system, from calm ones like Snow and Fireflies to more elaborate ones like a black hole accretion disk called Abyss. The interesting part wasn't drawing pretty particles. It was making that work smoothly on a five-year-old Android phone without draining the battery in ten minutes. Two rendering paths, not one Atmosphere isn't a single renderer, it's a small internal package ( @pairly/atmospheres ) with two shared engines that every individual atmosphere builds on: ParticleCanvas , a generic particle system for anything made of many independent objects: snow, fireflies, sakura petals. useCanvasLoop , a raw draw-loop hook for continuous scenes that aren't particle-based, like Abyss's swirling accretion disk. Both engines centralize every "don't destroy the device" concern in one place, so individual atmospheres never have to think about it. Here's useCanvasLoop 's frame loop: const frameInterval = 1000 / perf . fps ; let raf = 0 ; let last = performance . now (); let acc = 0 ; const loop = ( now : number ) => { if ( ! running ) return ; raf = requestAnimationFrame ( loop ); const elapsed = now - last ; last = now ; acc += elapsed ; if ( acc < frameInterval ) return ; const dt = acc / 1000 ; acc = 0 ; draw ( ctx , width , height , elapsedTime , perf ); }; requestAnimationFrame fires at the display's native rate (often 90-120Hz on phones now), but that doesn't mean you should draw every single time it fires. This accumulator pattern throttles actual drawing down to the target FPS from the device's performance profile, instead of trusting rAF's raw rate. Profiling the device before drawing anything Before any atmosphere renders a single frame, it checks the device: ex
AI 资讯
Buildroot for Embedded Linux — Part 1: Your First Buildroot Root Filesystem
Buildroot builds a cross-compiler, a Linux kernel and a complete root filesystem from source, driven by one Kconfig-style configuration file. Starting from the qemu_arm_vexpress_defconfig that ships with Buildroot 2026.05.1, two commands produce a bootable ARM system you can run under QEMU. The images you ship are the ones in output/images/ ; output/target/ looks like a root filesystem but must never be copied to a device. This post starts a new hands-on series on Buildroot for embedded Linux. By the end of this part you will have built a working Buildroot root filesystem for an ARM target, booted it under QEMU, and understood which generated directories are safe to ship. Later parts add your own packages, a BR2_EXTERNAL tree, kernel and bootloader integration, and reproducible image output. If the choice between build systems is still open, our earlier Yocto vs Buildroot comparison covers it; this series assumes the decision is made. What you need A Linux host, several gigabytes of free disk space, and a network connection. No development board is needed for this part; QEMU stands in for the hardware. On a Debian or Ubuntu host, this covers the mandatory packages the manual lists, plus the ncurses development files that menuconfig needs: raghu@techveda.org:~$ sudo apt install build-essential diffutils patch gzip bzip2 perl tar cpio unzip rsync file bc findutils gawk wget libncurses-dev One rule from the manual is worth stating plainly: build everything as a normal user. Buildroot never needs root, and running it as root exposes your host to any package that misbehaves during installation. The command above is the only one in this post that uses sudo . Getting Buildroot and choosing a target Download and unpack the current stable release — 2026.05.1 at the time of writing — from buildroot.org/downloads , and work from that directory. Buildroot ships ready-made configurations for many boards and emulated machines, one file each in configs/ , and make list-defconfigs
AI 资讯
My Experience Running a Homelab on Oracle Cloud’s Free VPS
It’s been a while since I wrote a blog post. Recently, I decided to get back into writing and document something I’ve been playing around with: setting up a small homelab environment on an Oracle Cloud Free Tier VPS. As a software engineer, I’ve always been interested in what happens behind the scenes when an application moves from my laptop to an actual server. Things like networking, deployment, Linux, containers, firewalls, and DNS are all areas I’ve wanted to understand better through actual hands-on experience rather than just reading about them. The fact that I could do all of this on a free VPS made it even better. Why I Started This Experiment I initially set up an Oracle Cloud Free Tier VPS running Ubuntu with: 1 GB RAM 1 vCPU Ubuntu Linux A public IP address I wasn't planning to host anything serious on it. The main goal was simply to use it as a small playground where I could experiment with infrastructure and improve my Linux and system administration skills. Interestingly, the last time I regularly worked with a VPS was probably around seven years ago. Back then, a few friends and I used to rent servers and set up Call of Duty 4 multiplayer servers. We'd spend hours messing around with the server configuration and, of course, playing on it afterwards. Things have changed quite a bit since then. These days, I'm much more interested in software engineering, DevOps, infrastructure, and homelabbing. So I thought it would be fun to take a free VPS and see how much I could actually do with it. First Challenge: K3s on 1 GB of RAM One of the first things I wanted to try was K3s, the lightweight Kubernetes distribution. I wanted to get a basic Kubernetes environment running and use it to experiment with container orchestration. That plan didn't last very long. After installing K3s and starting the server, I noticed the memory usage climbing pretty quickly. With only 1 GB of RAM, there wasn't much room left for anything else. Once I started thinking about running
开发者
why some people use neovim
I'm use neovim in cli like in my home but im not use Ide before in my live my first try pc is arch linux and neovim So I think I'm the best person to ask what is special in neovim 1: is so lightweight use ram is just 50-20 mb ram 2: you can config anything in lua language 3: open into terminal ssh protocol edit in code into server 4: vim keybinding like Vim / Neovim Keybindings Cheat Sheet Navigation (Normal Mode) h / j / k / l : Move Left / Down / Up / Right w / b : Jump forward / backward by word e / ge : Jump to end of current / previous word 0 / ^ / $ : Go to start of line / first non-blank char / end of line gg / G : Go to first line / last line of file { / } : Jump to previous / next paragraph Ctrl + u / d : Scroll Half-page Up / Down Ctrl + b / f : Scroll Full-page Up / Down Editing & Insert Mode i / I : Insert before cursor / at start of line a / A : Append after cursor / at end of line o / O : Open new line below / above current line u : Undo Ctrl + r : Redo . : Repeat last editing command Cutting, Copying & Pasting x : Delete character under cursor dw : Delete word dd : Delete (cut) line d$ / D : Delete from cursor to end of line yy / Y : Yank (copy) line yw : Yank word p / P : Paste after / before cursor Search & Replace /pattern : Search forward for pattern ?pattern : Search backward for pattern n / N : Jump to next / previous match * / # : Search word under cursor forward / backward :%s/old/new/g : Replace all occurrences in file :%s/old/new/gc : Replace all occurrences with confirmation prompt Visual Mode v : Character-wise visual mode V : Line-wise visual mode Ctrl + v : Block-wise visual mode y : Yank selection d : Delete selection > / < : Indent / Outdent selection Text Objects (Inside / Around) ci" : Change inside quotes ( "..." ) ca" : Change around quotes (includes quotes) di( : Delete inside parentheses da( : Delete around parentheses yi{ : Yank inside curly braces Buffers, Windows & Tabs :w : Save file :q : Quit buffer :wq / :x : Save and quit