今日已更新 302 条资讯 | 累计 37551 条内容
关于我们

标签:#net

找到 450 篇相关文章

AI 资讯

How to Install Tailwind CSS v4 in a .NET Blazor App (The Easy Way)

A step-by-step, beginner-friendly guide to stripping out Bootstrap and setting up the blazing-fast Tailwind CSS v4 compiler in your .NET Blazor Hybrid or Web app. Tailwind CSS v4 is officially here, and it is a complete game-changer! It scraps the old, bulky JavaScript configuration files ( tailwind.config.js ) and moves your theme settings directly into standard CSS. Plus, its new native compiler is faster than ever. If you are building a .NET Blazor app (whether it's Blazor WebAssembly, Server, or a MAUI Blazor Hybrid app) and want to swap out the default Bootstrap styles for utility-first Tailwind bliss, you can do it all without ever leaving your IDE. Let's get this configured step-by-step using Visual Studio 2022 ! Prerequisites Before we start, make sure you have: Node.js installed on your development machine. A Blazor project opened in Visual Studio 2022 . Step 1: Say Goodbye to Bootstrap in Solution Explorer Blazor templates ship with Bootstrap by default. Let's use Visual Studio's Solution Explorer to clean that out so our styles don't conflict. In the Solution Explorer window, expand your wwwroot folder. Expand the css subfolder. Right-click the bootstrap folder and select Delete . Now, open your main HTML entry file inside wwwroot (this will be index.html for Blazor Hybrid/WASM or App.razor inside the Components folder for Blazor Web). Locate the <head> section and delete the line linking the Bootstrap stylesheet: <link rel= "stylesheet" href= "css/bootstrap/bootstrap.min.css" /> powershell Step 2: Open the Developer PowerShell & Install Tailwind v4 Tailwind v4 splits the design library from the command-line build tool, so we need to install both. We can use Visual Studio's built-in terminal for this. In the top menu of Visual Studio 2022, go to Tools > Command Line > Developer PowerShell . A terminal window will open at the bottom of your IDE, already navigated to your project folder. Paste and run the following commands: i. Initialize a package.json fil

2026-06-08 原文 →
AI 资讯

Stop the Leak: How I Built a Zero-Trust Kill Switch for Windows Using Only PowerShell

The Problem If you've ever audited your Windows network traffic during a boot-up sequence, you know the truth: there's a "blind spot." Between the moment your network drivers initialize and your VPN/WireGuard tunnel actually establishes, your traffic is leaking. Many third-party solutions exist, but they are often bloated, use proprietary binaries, or act as black boxes. I wanted something transparent, native, and bulletproof. The Solution: WG-KillSwitch I developed a pure PowerShell-based kill switch architecture. It doesn't rely on third-party libraries—it uses native Windows system components to enforce security. Key Architectural Features: Zero-Trust Firewall Matrix: Hardens the system by blocking all outbound traffic by default, allowing only authenticated tunnel traffic. WMI Persistent Watchdog: Unlike standard scripts that can be killed via Task Manager, this project uses WMI Event Subscriptions. If the watchdog process is terminated, Windows itself immediately respawns it. Resilience: Survives hard reboots, modem resets, and Windows service cycling. Resilience & Leak Testing I've put this through a gauntlet of tests: Forced Reboots: Zero leaks detected during driver load. Process Termination: The WMI engine restores the protection in milliseconds. Dynamic Network Resets: The firewall matrix remains active regardless of adapter status. Let's Collaborate This is open source, transparent, and built for the community. I'm looking for security audits and feedback. Check out the source code, open an issue, or submit a PR: https://github.com/ryderlacin-pixel/Windows-WireGuard-KillSwitch

2026-06-07 原文 →
AI 资讯

Using SSH Tunnels to make up for lack of HTTPS on LAN

If you've been running local models/apps across more than one machine for any length of time, you've probably noticed that everything is served over plain HTTP, whether its the backend llm apis, the front end sites, or whatever other stuff you've tossed in: most of it is HTTP-only out of the box, no TLS option anywhere in sight. On one machine thats usually fine since its all loopback, but the second you spread apps across a few different computers ( which some of us do ), every prompt and every response starts crossing your LAN in plaintext. Is plaintext on your own LAN a huge deal? Honestly... a lot of folks would say it's probably low risk. But the moment you've got guests, other people's phones, or random IoT junk sharing that network, your prompts and the models responses flying around in the clear are more exposure than you'd probably be comfortable with if you sat down and thought about it. So, with that said- I figured Id write up how I've dealt with that, because the textbook answer ( certs ) is annoying enough on a local network that I think a lot of folks just dont bother. This is a lot easier, especially on something like a mac where you can make sure it kicks off automatically via launchd . Why not just do TLS The "correct" answer is to put TLS on everything; HTTPS everywhere. And you can. But walk through what that actually means on a home network full of mixed machines: You stand up your own little CA, then sign a cert for each host ( unless you want to deal with some code just straight up rejecting the cert ). You install and trust that CA on every client. Every browser, every OS trust store, and ( this is the annoying one ) every app that ships its own trust store and ignores the system one. Plenty of python and node apps do that. A lot of these local LLM apps dont even expose a TLS option, so to add it you front them with something like nginx or Caddy, which is now another moving part on every box ( Setting up Caddy is what convinced me to go this

2026-06-07 原文 →
AI 资讯

Kubernetes Networking Explained: Pods, Services, Ingress, and Network Policies

Kubernetes networking is one of the most misunderstood parts of running containerized workloads. A pod can reach another pod by IP — but why does that stop working after a deployment? A service exists and resolves in DNS — but traffic isn't arriving at the application. An Ingress resource is configured — but requests return 502. These puzzles are common and they stem from the same root: Kubernetes networking has several distinct layers, each solving a different problem, and it's easy to conflate them. This article walks through how Kubernetes networking actually works at each layer — from pod networking to services to Ingress to network policy — so the next time something breaks, you have a mental model to reason from. The fundamental promise: flat pod networking Kubernetes makes one core promise about networking: every pod can communicate directly with every other pod in the cluster without NAT. Every pod gets a real IP address from the cluster's pod CIDR range, and those IPs are routable between pods regardless of which node they're running on. This is not something Kubernetes itself implements. It's a contract that every Kubernetes-conformant CNI (Container Network Interface) plugin must fulfill. When you install Calico, Cilium, Flannel, Weave, or any other CNI, you're installing the component that actually creates this flat network. The mechanism varies — Flannel uses VXLAN overlays, Calico can use BGP for direct routing, Cilium uses eBPF — but the result is the same: pod-to-pod communication without NAT. Here's what a pod's network namespace looks like: $ kubectl exec -it my-pod -- ip addr 1: lo: ... 3: eth0@if12: ... inet 10.244.1.15/24 brd 10.244.1.255 scope global eth0 $ kubectl exec -it my-pod -- ip route default via 10.244.1.1 dev eth0 10.244.0.0/16 via 10.244.1.1 dev eth0 The pod has an IP ( 10.244.1.15 ) on a /24 subnet. The node this pod runs on has an IP from the same range — or a different /24 within the same /16. Traffic from this pod to 10.244.2.8 (

2026-06-07 原文 →
AI 资讯

Benn Jordan longs for the days of tech that didn’t spy on you

Benn Jordan may have initially gained notoriety for his music as Flashbulb and later, reviewing synths and effects pedals on YouTube under Benn and Gear. But about five years ago, Benn decided to take his YouTube channel in a different direction. He didn't stop covering music gear overnight, but as time progressed, his channel became […]

2026-06-06 原文 →
AI 资讯

Teaching Networking? The OSI Simulator Is Your Best Classroom Tool

If you're a networking instructor — at a university, technical college, boot camp, or corporate training program — you know the frustration of teaching the OSI Model. Static PowerPoint slides can only do so much. Students nod along in class, but when exam time arrives, the layers blur together. The PDU names become a confusing jumble. The OSI Model Simulator by Roboticela was built with educators in mind. It transforms a passive lecture into an interactive demonstration that students engage with, remember, and take home to explore on their own. Classroom Use Cases Live Demonstration Project the simulator on a classroom screen. Have students suggest messages to send and protocols to use. Step through each layer together as a class, stopping to ask questions: "What's happening here? What header was added? What device would operate at this layer?" The interactive format maintains attention far better than any lecture. Lab Assignments Assign students to run specific simulations and document their findings: "Run HTTP and HTTPS simulations. Screenshot the Presentation Layer for each. Explain in writing what differs and why." This assignment tests both tool usage and conceptual understanding. Flipped Classroom Send students to app.osi-model-simulator.roboticela.com before class. Ask them to run three simulations and come prepared to discuss what they observed. Class time becomes richer discussion rather than basic concept delivery. Protocol Comparison Exercise Have students run simulations for all five protocols — HTTP, HTTPS, SMTP, DNS, FTP — and create a comparison chart noting the differences at each OSI layer. This develops deep protocol literacy that traditional instruction rarely achieves. Why It Works: The Science of Active Learning Research in educational psychology consistently shows that active learning produces dramatically better retention than passive instruction. The "Learning Pyramid" (Edgar Dale's Cone of Experience) suggests: Lecture: ~5% retention after 2

2026-06-06 原文 →
AI 资讯

Studying for CompTIA Network+ or CCNA? The OSI Simulator Is Your Secret Weapon

Networking certifications like CompTIA Network+ and Cisco's CCNA are career-defining credentials. They validate your understanding of networking fundamentals — and both exams test OSI Model knowledge extensively. In fact, the OSI Model is arguably the single most tested conceptual framework in entry-level and intermediate networking certifications. Why OSI Is So Critical for Certification Exams Exam questions on OSI take many forms: "At which layer of the OSI model does a router operate?" (Layer 3) "What PDU is used at the Transport Layer?" (Segment) "Which protocol operates at the Application Layer?" (HTTP, DNS, SMTP...) "A user cannot connect to a website. Troubleshooting should begin at which OSI layer?" (Layer 1, then up) "Which device operates at Layer 2?" (Switch) "What is the function of the Presentation Layer?" (Translation, encryption, compression) These questions seem straightforward on paper but are notoriously confusing under exam pressure without deep conceptual understanding. How the OSI Simulator Accelerates Your Studies Visual Memory Formation Research in cognitive science consistently shows that visual and kinesthetic learning creates stronger memories than text-only reading. When you watch the OSI Simulator animate your message through all seven layers, you're forming episodic memories — vivid, experience-based memories that are far more durable than rote memorization. Protocol-to-Layer Association One of the most commonly missed exam categories is protocol-to-layer mapping. The OSI Simulator makes this automatic: when you select HTTP, the Application Layer is highlighted. When you watch TCP headers form, you associate TCP with Layer 4 viscerally, not just verbally. PDU Name Mastery Data, Segment, Packet, Frame, Bits — the five PDU names are shown explicitly at each layer in the simulator. After running 10 simulations, these names become second nature. No flashcard can match this experiential learning. Troubleshooting Framework Practice Network+ an

2026-06-06 原文 →
AI 资讯

How to Use the OSI Model Simulator: A Step-by-Step Tutorial

Getting started with the OSI Model Simulator takes less than 60 seconds. The interface is thoughtfully designed to be intuitive for beginners while offering enough depth to satisfy advanced learners. Here's your complete step-by-step guide. Step 1: Open the Simulator Navigate to app.osi-model-simulator.roboticela.com in any modern web browser. No account required, no download necessary, and no cost. The app loads instantly and is ready to use immediately. Alternatively, visit the landing page to learn more about features and download the desktop app for offline use. Step 2: Enter Your Message In the message input field, type any text you like. This is the "data" your simulation will encapsulate. Examples: Hello, World! GET /index.html HTTP/1.1 {"user": "alice", "action": "login"} Your own name or a phrase you'll remember Using a personally meaningful message makes the encapsulation feel real rather than abstract. Step 3: Choose Your Protocol Select from five real protocols: HTTP, HTTPS, SMTP, DNS, or FTP. Each choice changes the Application Layer headers added to your data. For beginners, start with HTTP. Then re-run with HTTPS to see the Presentation Layer encryption difference. Step 4: Choose Your Transmission Medium Select your Physical Layer medium: Ethernet, Wi-Fi, Fiber Optic, Coaxial, or Radio. This affects how the Physical Layer is visualized at the end of the simulation. Step 5 (Optional): Set Custom IP Addresses For a more realistic Network Layer demonstration, enter a source IP address (simulating your device) and a destination IP address (simulating the server). This makes the Layer 3 packet header concrete and personally relevant. Step 6: Run the Simulati on Click the Run or Start button. Watch as your message travels through all seven layers: Application Layer adds protocol headers Presentation Layer adds encryption (if HTTPS) Session Layer adds session management Transport Layer segments and adds TCP/UDP header Network Layer wraps in IP packet Data Li

2026-06-06 原文 →
AI 资讯

Ethernet, Wi-Fi, Fiber, Coaxial & Radio: Transmission Media Compared

The Physical Layer's choice of transmission medium profoundly affects the performance, cost, security, and reliability of a network. The OSI Model Simulator supports all five major media types — making it a powerful tool for understanding how physical choices ripple up through all seven OSI layers. Medium Speed Max Distance Security Cost Ethernet Up to 10 Gbps+ 100m (Cat6a) High (physical access) Low Wi-Fi Up to ~9.6 Gbps (Wi-Fi 6) ~100m indoor Medium (WPA3) Low Fiber Optic Terabits/s 100s of km Very High High Coaxial Up to 1 Gbps 500m (RG-8) Medium Medium Radio Variable (5G: Gbps) km to global (satellite) Low–Medium Variable Ethernet: The Reliable Standard Ethernet is the dominant wired networking standard in homes, offices, and data centers. Using twisted-pair copper cables (Cat5e, Cat6, Cat6a), it provides reliable, high-speed connectivity with predictable latency. The IEEE 802.3 standard governs Ethernet, and modern variants include 1GbE, 10GbE, 25GbE, 40GbE, and 100GbE. Wi-Fi: Wireless Freedom Wi-Fi (IEEE 802.11) eliminated the need for physical cables in most consumer settings. Wi-Fi 6 (802.11ax) and Wi-Fi 6E deliver impressive speeds, but shared medium access, interference, and radio propagation challenges mean it will never fully replace wired Ethernet for critical applications. Fiber Optic: The Internet's Backbone Fiber optic cables carry data as pulses of light through glass or plastic strands. They're immune to electromagnetic interference, support enormous bandwidth, and can span continents — literally. Every major internet exchange, submarine cable, and data center interconnect uses fiber. Coaxial Cable: The Cable TV Legacy Coaxial cable — familiar from cable TV connections — consists of a central conductor surrounded by insulating layers and a braided metal shield. DOCSIS-based cable internet connections (common from ISPs like Comcast) use coaxial as the last-mile medium. Radio: Wireless at Scale From the cellular 5G network in your pocket to satellite

2026-06-06 原文 →
AI 资讯

Debugging LACP Instability in a Transparent OPNsense Bridge

I run a transparent OPNsense bridge between a UniFi Dream Machine Pro and the rest of my LAN. It is deliberately boring at Layer 3: the UDM keeps routing, DHCP, DNS, firewall policy, WAN handling, and VLAN definitions. OPNsense sits inline as a Layer 2 bump in the wire. The interesting part is that both sides of that bump use LACP . I already wrote the build/configuration guide for this setup here: Building a Transparent LAGG (LACP) Bridge with OPNsense, UDM, and UniFi - A Practical Guide . That article explains how the bridge was built, how the LAGG devices were configured, and why I wanted the firewall to remain transparent. This article is the other half of the story: what happens when that kind of setup fails in a non-obvious way. Not a clean outage. Not a single "the network is down" moment. Just enough instability to make everything feel wrong. 1. Topology and Failure Surface The topology looked like this: +----------------------+ | UniFi Dream Machine | | kantharos-udm-pro | +----------+-----------+ | LACP aggregate, 2 x 1G | OPNsense lagg0 "ingresslagg" igc1 + igc2, LACP | +----------v-----------+ | OPNsense bridge0 | | "laggbridge" | +----------+-----------+ | OPNsense lagg1 "egresslagg" igc4 + igc5, LACP | LACP aggregate, 2 x 1G | +----------v-----------+ | UniFi USW-Lite-16 | | downstream LAN | +----------------------+ On OPNsense, the relevant interfaces were: igc1 + igc2 -> lagg0 -> ingresslagg -> toward UDM igc4 + igc5 -> lagg1 -> egresslagg -> toward USW lagg0 + lagg1 -> bridge0 -> laggbridge The bridge is a FreeBSD bridge. The aggregates are FreeBSD lagg(4) interfaces using LACP. OPNsense exposes those through its Interfaces > Devices UI. The expected healthy OPNsense state is: laggproto lacp status: active laggport: igcX flags=<ACTIVE,COLLECTING,DISTRIBUTING> laggport: igcY flags=<ACTIVE,COLLECTING,DISTRIBUTING> Those three member states matter: ACTIVE : the member is participating in the LACP bundle. COLLECTING : the member may receive traffic. DIS

2026-06-06 原文 →
开发者

How I Built and Published a .NET NuGet Package for the Giant SMS API

A while back, I needed to integrate SMS into a .NET project. Giant SMS had a REST API, but no official .NET client. The only existing library was a PHP one from 6–7 years ago, and it only covered two methods: send and getBalance. So I built my own. It now has nearly 2,000 downloads on NuGet. Here's exactly how I did it. The Problem Wiring up raw HTTP calls to the Giant SMS API in every project gets repetitive fast: Manually setting Authorization headers Remembering which endpoints use token auth vs. username/password Deserializing responses every time Scattering credentials across your codebase I wanted something that felt native to .NET. Configure once in appsettings.json , register with DI, and just call a method. Designing the Public API The first decision was the interface. I wanted consumers to never touch HttpClient directly, and I wanted methods that mapped clearly to what the API actually does: public interface IGiantSmsService { bool IsReady { get ; } Task < SingleSmsResponse > SendSingleMessage ( string to , string msg ); Task < SingleSmsResponse > SendMessageWithToken ( SingleMessageRequest messageRequest ); Task < BaseResponse > SendBulkMessages ( BulkMessageRequest messageRequest ); Task < SingleSmsResponse > CheckMessageStatus ( string messageId ); Task < BaseResponse > GetBalance (); Task < SenderIdResponse > GetSenderIds (); Task < BaseResponse > RegisterSenderId ( RegisterSenderIdRequest senderIdRequest ); } Seven methods, the full surface of the API, no more, no less. The IsReady property is a small but useful addition. It lets consumers do a quick sanity check at startup rather than discovering a missing token on the first SMS send: csharp _isReady = !string.IsNullOrWhiteSpace(_connection.Token) && !string.IsNullOrWhiteSpace(_connection.Username); Handling Two Auth Methods This was the most interesting design challenge. The Giant SMS API uses two different authentication schemes depending on the endpoint: Token-based (Basic Authorization header) —

2026-06-06 原文 →
AI 资讯

Kubernetes vs Docker (2026): What's the Difference and Which Should You Learn First?

📌 This article was originally published on Sherdil E-Learning . I'm republishing it here so the dev.to community can benefit too. The Kubernetes vs Docker question is one of the most common sources of confusion for developers entering DevOps. People hear both names constantly, see them used together in job listings, and assume they must be competitors. They are not. Docker and Kubernetes do different jobs, and most modern infrastructure uses both. This guide explains what each tool actually does, how they fit together in a real deployment, the practical difference between Docker Compose and Kubernetes, and which one you should learn first. Docker: the container creator Docker is a tool for building, running, and managing containers . A container is a lightweight, portable package that contains an application together with its dependencies, runtime, system libraries, environment variables, and configuration files. The same container runs the same way on a laptop, a CI runner, a production server, or a cloud platform. In a typical Docker workflow you: Write a Dockerfile that describes how to build the image Run docker build to produce the image Run docker run to launch a container from it For multiple containers (a web app plus a database, for example), you use Docker Compose to define the whole set in a docker-compose.yml file and start them with one command. Docker is excellent for individual containers and small multi-container applications. The limitation is scale. What happens when you need a hundred containers across a dozen servers? When one container crashes at 3 a.m.? When you need to roll out a new version without downtime? Docker alone does not solve those problems. For the official reference, see docs.docker.com . Kubernetes: the orchestration layer above Docker Kubernetes (often shortened to K8s ) is an open-source platform that runs containers across many machines as a single coordinated system . It was originally built at Google, based on their internal

2026-06-04 原文 →
AI 资讯

How to upgrade an Enterprise Grade Kubernetes Cluster with Zero Downtime.

Introduction One of the common tasks performed by DevOps Engineers is upgrade of their organization's Kubernetes Cluster at least once every 3 months as Kubernetes release newer version while maintaining on the last 3 released versions. For instance, if the newest version is v1.34, the supported versions would be v1.34, v1.33 & v1.32. Hence, the need to understand how this upgrade process can be achieved with zero downtime. Prerequisites: Cordon your Nodes: This simply means making your nodes unschedulable. No new deployments would be scheduled on the node. Review and understand the change logs in the release notes - Ensure that the change logs or updated components won't affect your production environment. Kubernetes upgrade are irreversible - You can't downgrade your cluster after an upgrade. A fresh installation would be required in the event of an issue with the upgraded version. Hence Lower Level Environment Test (Unit, Staging or Pre-Production) - Given that Kubernetes upgrades are irreversible, always test the newer version and allow monitoring for about 2-weeks before production cluster upgrade. Control Plane & Nodes should be on the same versions. Cluster Auto-Scaler: If you are using this feature within your Kubernetes environment, ensure that it is on the same or compatible version with your control plane to avoid issues during the cluster upgrade. IP Addresses: Make available at least 5 IP addresses within the cluster subnet. Kubelet: This component should also match the version of your control plane before the upgrade. What are the actual upgrade processes Control Plane Upgrade: If using the Managed Kubernetes Cluster (EKS, AKS, GKS), the Cloud Company will take care of managing the control plane. However, upgrade of the cluster doesn't happen automatically. Hence, you will be required to action this via the CLI, UI or EKSCLI etc. Node Group or Data Plane Upgrade: Managed Node Groups - This is easier because you can use the rollout deployment approach,

2026-06-04 原文 →
AI 资讯

TryParse Looks Like a Small Utility Method — Until You Realize It Prevents Entire Classes of Production Failures

Why Senior .NET Engineers Rarely Trust User Input Most beginner C## developers discover TryParse() while learning console applications. It usually appears during a simple exercise: Console . Write ( "Enter quantity: " ); string ? input = Console . ReadLine (); if ( int . TryParse ( input , out int quantity )) { Console . WriteLine ( $"Quantity: { quantity } " ); } At first glance, it looks like a convenience method. A safer version of Parse() . A small utility. Nothing particularly interesting. But experienced .NET engineers see something completely different. They see one of the earliest examples of defensive programming. Because software engineering is not about handling perfect input. It is about surviving imperfect input. And in production systems, imperfect input is the rule—not the exception. TL;DR TryParse() is not just a conversion method. It introduces some of the most important concepts in professional software development: Defensive programming Input validation Runtime safety Exception avoidance Financial precision Domain modeling Reliability engineering Understanding why TryParse() exists is often more valuable than learning how to use it. Every Value in C## Starts With a Type One of the first concepts developers learn is that every variable has a type. int quantity = 10 ; decimal price = 25.99M ; string productName = "Laptop" ; bool isAvailable = true ; Simple. Yet this idea is foundational. Because types are not just containers. They are contracts. Each type defines: Valid values Memory layout Available operations Precision guarantees Runtime behavior When you choose a type, you are making an architectural decision. Why decimal Exists Many developers ask: Why not use double for money? Because financial systems require precision. Consider: double a = 0.1 ; double b = 0.2 ; Console . WriteLine ( a + b ); Expected: 0.3 Reality: 0.30000000000000004 The issue comes from binary floating-point representation. For scientific calculations, this is acceptable. F

2026-06-04 原文 →
AI 资讯

F# vs C# 3 — Conclusions

What can I say. Anyone claiming that F# is good mostly for finance and data processing and C# for everything else, has probably never written a single line of practical F# code. In previous two parts of the article, I tried to demonstrate that with F# you can achieve the same goals as with C#, but with less verbose, repetitive, structural code. How it started. At some point, developers realized that global state with unrestricted data access causes many side effects, producing insecure, error-prone, and hard-to-maintain code as software grows larger. That is when the idea emerged to bring data and the code operating on it together into a single unit, restricting direct access to the unit’s internal state and making software more secure and predictable. This is how data encapsulation was born. Alongside encapsulation, abstraction was introduced — the process of hiding how behavior works. Encapsulation ( hiding data ) and abstraction ( hiding behavior ) remain two foundational pillars of Object-Oriented Programming. And that is how OOP has worked ever since — developers bring data and behavior together ( classes ) and define abstractions for them ( interfaces ). For example, for C# developers — including myself — this has become a daily routine. And we rarely question it, because OOP languages like C# leave us little choice but to structure code this way. But if you ask yourself whether this repetitive routine is always necessary, the answer is — no. You don’t need OOP concepts to build stateless, streamlined request–response, data-processing pipelines, because in such systems there is no long-lived state to hide and protect. You have a request, and almost immediately you have a response. After that, everything is gone. That is what I tried to demonstrate in the first two parts of this article by applying FP concepts. And even if you have a classical desktop application, you don’t always need to approach it in an OOP way. Functional programming handles side effects no

2026-06-03 原文 →
AI 资讯

You can't delete an event. GDPR says you must. Crypto-shredding is the truce.

Two rules that can't both be true Event sourcing has one rule: you never delete. You append. The log is the source of truth, and rewriting history is the cardinal sin. GDPR Article 17 has one rule too: when a user asks, you erase their personal data. Not "hide it," not "flag it deleted" — erase it, everywhere, including backups. Put an event-sourced system in front of a privacy regulator and those two rules collide head-on. The user's name, email, and address are baked into CustomerRegistered , AddressChanged , OrderPlaced — dozens of immutable events, replicated to read models, snapshotted, and sitting in every nightly backup you've ever taken. "Just delete the events" breaks event sourcing. "Never delete" breaks the law. Most teams discover this tension after they've committed to append-only. A word on why this isn't academic for me. I build from Germany. Article 17 is EU law — the GDPR, or DSGVO as we call it here — not a German invention, but Germany enforces it about as hard as anywhere in Europe: regional data-protection authorities that issue real fines, and "we were careful" has never been a defense that held up. That pressure is exactly why I wanted erasure to fall out of the architecture instead of being a promise I make to an auditor and then pray I can keep. Why "delete the row" doesn't actually erase anything Say you give in and hard-delete the events for one user. You've still got their data in: every read-model projection rebuilt from those events, every snapshot that rolled them up, every backup taken before the deletion, every replica and every export that already left the building. Chasing personal data across all of those, provably, on a 30-day regulatory clock, is a nightmare — and a single missed backup tape means you didn't comply. Physical deletion doesn't scale to a system designed to keep everything forever. Crypto-shredding: delete the key, not the data The trick is to stop trying to delete the data and instead delete the ability to read it

2026-06-03 原文 →