<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TildAlice</title>
    <description>The latest articles on DEV Community by TildAlice (@tildalice).</description>
    <link>https://dev.to/tildalice</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3755725%2Fed8d5042-b5bb-495f-b8f6-9d8b470e1d46.png</url>
      <title>DEV Community: TildAlice</title>
      <link>https://dev.to/tildalice</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tildalice"/>
    <language>en</language>
    <item>
      <title>Mamba-2 vs Mamba vs Transformer: Long Range Arena Results</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Sat, 23 May 2026 15:04:53 +0000</pubDate>
      <link>https://dev.to/tildalice/mamba-2-vs-mamba-vs-transformer-long-range-arena-results-2758</link>
      <guid>https://dev.to/tildalice/mamba-2-vs-mamba-vs-transformer-long-range-arena-results-2758</guid>
      <description>&lt;h2&gt;
  
  
  The Promise vs the Reality
&lt;/h2&gt;

&lt;p&gt;Mamba-2 claims to fix Mamba's hardware inefficiency while keeping its linear-time magic. The &lt;a href="https://arxiv.org/abs/2405.21060" rel="noopener noreferrer"&gt;original paper&lt;/a&gt; shows impressive throughput numbers — 2-8x faster training than Mamba, competitive with Transformers on A100s. But I wanted to see if that speed came at an accuracy cost, especially on tasks where long-range dependencies actually matter.&lt;/p&gt;

&lt;p&gt;Long Range Arena (LRA) is the benchmark everyone uses to prove their architecture "handles long sequences better." It's a suite of tasks (ListOps, text classification, image classification, pathfinder) designed to stress-test models on sequences up to 16K tokens. If you're going to claim you beat Transformers at long context, you need to show LRA numbers.&lt;/p&gt;

&lt;p&gt;Here's what I found: Mamba-2 doesn't just match Mamba's accuracy — it actually improves on several LRA tasks while being substantially faster. But there's a catch the paper downplays.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-mamba-2-vs-mamba-transformer-long-range-arena-accuracy-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-mamba-2-vs-mamba-transformer-long-range-arena-accuracy-1.jpg" alt="A vivid green snake slithers over a textured rock, captured in detailed close-up." width="799" height="534"&gt;&lt;/a&gt;&lt;/p&gt;
Photo by &lt;a href="https://www.pexels.com/@chris-f-38966" rel="nofollow noopener noreferrer"&gt;Chris F&lt;/a&gt; on &lt;a href="https://www.pexels.com" rel="nofollow noopener noreferrer"&gt;Pexels&lt;/a&gt;



&lt;h2&gt;
  
  
  What Changed from Mamba to Mamba-2
&lt;/h2&gt;




&lt;p&gt;&lt;em&gt;Continue reading the full article on &lt;a href="https://tildalice.io/mamba-2-vs-mamba-transformer-long-range-arena-accuracy/" rel="noopener noreferrer"&gt;TildAlice&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mamba2</category>
      <category>mamba</category>
      <category>transformer</category>
      <category>statespacemodels</category>
    </item>
    <item>
      <title>Why I Switched from Ledger to Open Source Hardware Wallets</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Sat, 23 May 2026 00:02:35 +0000</pubDate>
      <link>https://dev.to/tildalice/why-i-switched-from-ledger-to-open-source-hardware-wallets-45en</link>
      <guid>https://dev.to/tildalice/why-i-switched-from-ledger-to-open-source-hardware-wallets-45en</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F04%2Fonekey-classic-1s-device.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F04%2Fonekey-classic-1s-device.jpg" alt="OneKey Classic 1S hardware wallet" width="800" height="1067"&gt;&lt;/a&gt;Credit-card sized, four physical buttons, a small but crisp OLED display.&lt;/p&gt;

&lt;p&gt;I used a Ledger Nano S for three years before switching. Not because it stopped working—it didn't. I switched because I finally understood what "don't trust, verify" actually means in hardware security.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ledger Problem: Closed Source Means Blind Trust
&lt;/h2&gt;

&lt;p&gt;Ledger's firmware is closed source. You can't see the code running on your device. When they released Ledger Recover in 2023—a feature that splits your seed phrase into encrypted shards and sends them to third parties—the community lost it. Not because key sharding is inherently bad, but because it proved the firmware &lt;em&gt;could&lt;/em&gt; extract and transmit your private keys.&lt;/p&gt;

&lt;p&gt;Ledger's response was essentially "trust us, we won't enable this without your consent." But that's exactly the problem. With closed source firmware, you have no way to verify that claim. You're trusting the company, not the math.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Continue reading the full article on &lt;a href="https://tildalice.io/why-i-switched-from-ledger-to-open-source-hardware-wallets/" rel="noopener noreferrer"&gt;TildAlice&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hardwarewallet</category>
      <category>cryptosecurity</category>
      <category>selfcustody</category>
      <category>opensource</category>
    </item>
    <item>
      <title>LoRA vs Adapter vs Prefix Tuning: PEFT Memory Comparison</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Fri, 22 May 2026 21:05:39 +0000</pubDate>
      <link>https://dev.to/tildalice/lora-vs-adapter-vs-prefix-tuning-peft-memory-comparison-2php</link>
      <guid>https://dev.to/tildalice/lora-vs-adapter-vs-prefix-tuning-peft-memory-comparison-2php</guid>
      <description>&lt;h2&gt;
  
  
  Why Full Fine-Tuning Became Unaffordable
&lt;/h2&gt;

&lt;p&gt;Fine-tuning GPT-3 175B requires updating 175 billion parameters. That's 700GB of optimizer states alone (Adam needs 2 copies per parameter). Most teams can't afford that.&lt;/p&gt;

&lt;p&gt;Parameter-Efficient Fine-Tuning (PEFT) methods solve this by freezing the base model and training a tiny subset of parameters. LoRA, Adapter layers, and Prefix Tuning are the three most cited approaches. They all claim "competitive performance with &amp;lt;1% trainable parameters," but they achieve it in completely different ways.&lt;/p&gt;

&lt;p&gt;This post compares the three methods mechanically: where the new parameters live, what the forward pass looks like, and which one actually saves you money on your next fine-tuning job. You can read the original LoRA paper &lt;a href="https://arxiv.org/abs/2106.09685" rel="noopener noreferrer"&gt;here&lt;/a&gt;, Adapters from &lt;a href="https://arxiv.org/abs/1902.00751" rel="noopener noreferrer"&gt;Houlsby et al. (2019)&lt;/a&gt;, and Prefix Tuning from &lt;a href="https://arxiv.org/abs/2101.00190" rel="noopener noreferrer"&gt;Li and Liang (2021)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-lora-vs-adapter-vs-prefix-tuning-peft-comparison-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-lora-vs-adapter-vs-prefix-tuning-peft-comparison-1.jpg" alt="Close-up of black electrical adapters stacked on a gray background." width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;
Photo by &lt;a href="https://www.pexels.com/@castorlystock" rel="nofollow noopener noreferrer"&gt;Castorly Stock&lt;/a&gt; on &lt;a href="https://www.pexels.com" rel="nofollow noopener noreferrer"&gt;Pexels&lt;/a&gt;



&lt;h2&gt;
  
  
  LoRA: Low-Rank Decomposition of Weight Updates
&lt;/h2&gt;




&lt;p&gt;&lt;em&gt;Continue reading the full article on &lt;a href="https://tildalice.io/lora-vs-adapter-vs-prefix-tuning-peft-comparison/" rel="noopener noreferrer"&gt;TildAlice&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>lora</category>
      <category>peft</category>
      <category>adapter</category>
      <category>prefixtuning</category>
    </item>
    <item>
      <title>Sorting Algorithm Speed: 100 to 10K Elements Benchmark</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Fri, 22 May 2026 18:04:40 +0000</pubDate>
      <link>https://dev.to/tildalice/sorting-algorithm-speed-100-to-10k-elements-benchmark-29mk</link>
      <guid>https://dev.to/tildalice/sorting-algorithm-speed-100-to-10k-elements-benchmark-29mk</guid>
      <description>&lt;h2&gt;
  
  
  When Interview-Size Arrays Change Everything
&lt;/h2&gt;

&lt;p&gt;Most sorting benchmarks test millions of elements. That's not your interview. You're sorting maybe 1,000 integers while the interviewer watches. So does algorithm choice actually matter at this scale?&lt;/p&gt;

&lt;p&gt;I ran the numbers. At 1,000 elements, the gap between Python's built-in &lt;code&gt;sorted()&lt;/code&gt; and a hand-rolled quicksort isn't 10x — it's 47x. But here's where it gets weird: at 100 elements, bubble sort sometimes beats quicksort. Not in theory. In actual microseconds on real hardware.&lt;/p&gt;

&lt;p&gt;This matters because interviewers occasionally ask you to implement sorting from scratch. And the obvious follow-up is "what's the complexity?" But they rarely ask "what's the actual runtime?" Understanding both makes you sound like you've actually written production code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Benchmark Setup
&lt;/h2&gt;

&lt;p&gt;I tested seven sorting algorithms on arrays of 100, 500, 1,000, 5,000, and 10,000 random integers. Each test ran 100 times with fresh random data. Python 3.11 on an M1 MacBook Air, &lt;code&gt;time.perf_counter_ns()&lt;/code&gt; for nanosecond precision.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
import random
import time
from typing import List, Callable
import heapq

def benchmark_sort(sort_fn: Callable, arr_sizes: List[int], runs: int = 100):
    """Returns {size: median_time_ns} for each array size."""
    results = {}
    for n in arr_sizes:
        times = []
        for _ in range(runs):
            arr = [random.randint(0, 10_000) for _ in range(n)]
            test_arr = arr.copy()

---

*Continue reading the full article on [TildAlice](https://tildalice.io/python-sorting-runtime-benchmark-interview-arrays/)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>sortingalgorithms</category>
      <category>pythonbenchmark</category>
      <category>codinginterview</category>
      <category>timsort</category>
    </item>
    <item>
      <title>Python Type Hints: runtime vs typing-only Annotations</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Thu, 21 May 2026 21:04:15 +0000</pubDate>
      <link>https://dev.to/tildalice/python-type-hints-runtime-vs-typing-only-annotations-196c</link>
      <guid>https://dev.to/tildalice/python-type-hints-runtime-vs-typing-only-annotations-196c</guid>
      <description>&lt;h2&gt;
  
  
  Most Python Type Hints Do Absolutely Nothing at Runtime
&lt;/h2&gt;

&lt;p&gt;You add type hints to your Python code, run it, and... nothing happens. No validation. No errors. The annotations just sit there. But some annotations—like &lt;code&gt;dataclasses&lt;/code&gt;, Pydantic models, or &lt;code&gt;typing.NewType&lt;/code&gt;—actually change how your code behaves. The difference isn't obvious until you hit a production bug that could've been caught if you knew which hints matter when.&lt;/p&gt;

&lt;p&gt;The core distinction: &lt;strong&gt;typing-only annotations&lt;/strong&gt; exist purely for static analysis tools like &lt;code&gt;mypy&lt;/code&gt; or &lt;code&gt;pyright&lt;/code&gt;. &lt;strong&gt;Runtime annotations&lt;/strong&gt; are inspected by libraries or decorators during execution to enforce validation, generate code, or alter behavior. Most developers treat all type hints the same way, then wonder why &lt;a href="https://tildalice.io/pydantic-40x-validation-overhead-performance/" rel="noopener noreferrer"&gt;Pydantic validators catch bugs&lt;/a&gt; that &lt;code&gt;mypy&lt;/code&gt; missed—or vice versa.&lt;/p&gt;

&lt;p&gt;This post runs the same code with different annotation styles, shows what actually happens at runtime, and benchmarks the cost of runtime validation. You'll see real tracebacks, performance numbers from Python 3.11 and 3.12, and the edge cases where mixing both approaches breaks your code.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-python-type-hints-runtime-vs-typing-only-annotations-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-python-type-hints-runtime-vs-typing-only-annotations-1.jpg" alt="High-angle view of woman coding on a laptop, with a Python book nearby. Ideal for programming and tech content." width="799" height="534"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Continue reading the full article on &lt;a href="https://tildalice.io/python-type-hints-runtime-vs-typing-only-annotations/" rel="noopener noreferrer"&gt;TildAlice&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>typehints</category>
      <category>pydantic</category>
      <category>staticanalysis</category>
    </item>
    <item>
      <title>Gymnasium Custom Env Step() Returns Invalid Shape: 5 Fixes</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Thu, 21 May 2026 18:05:11 +0000</pubDate>
      <link>https://dev.to/tildalice/gymnasium-custom-env-step-returns-invalid-shape-5-fixes-5904</link>
      <guid>https://dev.to/tildalice/gymnasium-custom-env-step-returns-invalid-shape-5-fixes-5904</guid>
      <description>&lt;h2&gt;
  
  
  The Error That Breaks Every Custom Gymnasium Environment
&lt;/h2&gt;

&lt;p&gt;Your &lt;code&gt;step()&lt;/code&gt; function returns a perfectly valid numpy array. Stable Baselines3 throws &lt;code&gt;AssertionError: The observation returned by the&lt;/code&gt;step()&lt;code&gt;method does not match the given observation space&lt;/code&gt;. You stare at your code for 20 minutes, print the shape, it looks correct, and yet the environment refuses to work.&lt;/p&gt;

&lt;p&gt;This specific error has cost me more debugging hours than any algorithm hyperparameter ever did. The shape mismatch between &lt;code&gt;observation_space&lt;/code&gt; and actual returned observations is the single most common bug when building custom Gymnasium environments, and it fails silently in ways that will make you question your sanity.&lt;/p&gt;

&lt;p&gt;Here's the working pattern I now use for every custom environment:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
import gymnasium as gym
import numpy as np
from gymnasium import spaces

class RobustCustomEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.state_dim = 4

        # Bug fix #1: Always use explicit dtype
        self.observation_space = spaces.Box(
            low=-np.inf,
            high=np.inf,
            shape=(self.state_dim,),
            dtype=np.float32  # CRITICAL: explicit dtype
        )
        self.action_space = spaces.Discrete(2)
        self._state = None

    def reset(self, seed=None, options=None):
        super().reset(seed=seed)
        # Bug fix #2: Cast to correct dtype immediately
        self._state = np.zeros(self.state_dim, dtype=np.float32)

---

*Continue reading the full article on [TildAlice](https://tildalice.io/gymnasium-custom-env-observation-space-bugs/)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>gymnasium</category>
      <category>reinforcementlearnin</category>
      <category>customenvironment</category>
      <category>stablebaselines3</category>
    </item>
    <item>
      <title>Pydantic 40x Validation Overhead: When Type Hints Break Performance</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Thu, 21 May 2026 15:05:09 +0000</pubDate>
      <link>https://dev.to/tildalice/pydantic-40x-validation-overhead-when-type-hints-break-performance-3pj6</link>
      <guid>https://dev.to/tildalice/pydantic-40x-validation-overhead-when-type-hints-break-performance-3pj6</guid>
      <description>&lt;h2&gt;
  
  
  The 40x Slowdown Nobody Warned Me About
&lt;/h2&gt;

&lt;p&gt;Pydantic validation added 847ms to a function that should have taken 21ms. That's not a typo—a simple data transformation went from "instant" to "why is the user staring at a loading spinner?" The culprit wasn't network latency or database queries. It was type validation on 50,000 dictionary objects.&lt;/p&gt;

&lt;p&gt;Python type hints have zero runtime cost by design. PEP 484 explicitly states that type annotations should not affect program semantics. But Pydantic, attrs with validators, and beartype don't just annotate—they actively check every field on every object instantiation. When you're processing batch data or handling high-throughput APIs, that "safe" validation becomes a performance tax you didn't budget for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-pydantic-40x-validation-overhead-performance-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-pydantic-40x-validation-overhead-performance-1.jpg" alt="High-angle view of woman coding on a laptop, with a Python book nearby. Ideal for programming and tech content." width="799" height="534"&gt;&lt;/a&gt;&lt;/p&gt;
Photo by &lt;a href="https://www.pexels.com/@divinetechygirl" rel="nofollow noopener noreferrer"&gt;Christina Morillo&lt;/a&gt; on &lt;a href="https://www.pexels.com" rel="nofollow noopener noreferrer"&gt;Pexels&lt;/a&gt;



&lt;h2&gt;
  
  
  Why Type Hints Themselves Cost Nothing (But Validation Does)
&lt;/h2&gt;

&lt;p&gt;Let's establish the baseline. Python's native type hints are stored in &lt;code&gt;__annotations__&lt;/code&gt; and completely ignored at runtime:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
import timeit

def process_untyped(x, y, z):
    return x + y + z

---

*Continue reading the full article on [TildAlice](https://tildalice.io/pydantic-40x-validation-overhead-performance/)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>pydantic</category>
      <category>pythonperformance</category>
      <category>typehints</category>
      <category>dataclasses</category>
    </item>
    <item>
      <title>YOLO vs Detectron2 vs MMDetection: Training Speed Test</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Wed, 20 May 2026 21:04:52 +0000</pubDate>
      <link>https://dev.to/tildalice/yolo-vs-detectron2-vs-mmdetection-training-speed-test-2mh9</link>
      <guid>https://dev.to/tildalice/yolo-vs-detectron2-vs-mmdetection-training-speed-test-2mh9</guid>
      <description>&lt;h2&gt;
  
  
  MMDetection has the highest learning curve I've encountered in object detection frameworks. But it's also the only one I'd trust for a 50-class custom dataset.
&lt;/h2&gt;

&lt;p&gt;Most tutorials will tell you to start with YOLO because it's "easy." They're not wrong—I had a YOLOv8 model running on a custom hardhat detection dataset in under 30 minutes. But three weeks later, when I needed to swap in Cascade R-CNN because single-stage detectors were missing small objects at distance, I was stuck rewriting everything. The YOLO ecosystem is optimized for speed and convenience, not flexibility.&lt;/p&gt;

&lt;p&gt;I spent a month training the same construction site safety detection task (5 classes: hardhat, no-hardhat, vest, machinery, person) across all three frameworks. Same dataset, same train/val split, same Mosaic augmentation scheme. The differences weren't just in mAP—they showed up in training time, debugging pain, and how easily I could swap architectures when the first attempt failed.&lt;/p&gt;

&lt;p&gt;Here's what actually matters when you're choosing a framework for custom detection work.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-yolo-detectron2-mmdetection-training-speed-benchmark-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-yolo-detectron2-mmdetection-training-speed-benchmark-1.jpg" alt="Detailed view of a green circuit board featuring multiple connectors and intricate components." width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Continue reading the full article on &lt;a href="https://tildalice.io/yolo-detectron2-mmdetection-training-speed-benchmark/" rel="noopener noreferrer"&gt;TildAlice&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>yolo</category>
      <category>detectron2</category>
      <category>mmdetection</category>
      <category>objectdetection</category>
    </item>
    <item>
      <title>Quick Sort vs Merge Sort vs Heap Sort: Python Speed Test</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Wed, 20 May 2026 18:04:03 +0000</pubDate>
      <link>https://dev.to/tildalice/quick-sort-vs-merge-sort-vs-heap-sort-python-speed-test-2mia</link>
      <guid>https://dev.to/tildalice/quick-sort-vs-merge-sort-vs-heap-sort-python-speed-test-2mia</guid>
      <description>&lt;h2&gt;
  
  
  Quick Sort vs Merge Sort vs Heap Sort: Python Speed Test on Coding Interview Arrays
&lt;/h2&gt;

&lt;p&gt;People love telling you Quick Sort is $O(n \log n)$ average case and Merge Sort is stable. What they don't mention is that Quick Sort beats Merge Sort by 40% on random arrays under 10,000 elements, but Merge Sort wins on nearly-sorted data. And Heap Sort? It's consistently slower than both, even though the complexity looks identical.&lt;/p&gt;

&lt;p&gt;I ran all three on the exact array patterns you see in coding interviews — random, sorted, reverse-sorted, and "mostly sorted with a few swaps." The results weren't what I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Even Matters in Interviews
&lt;/h2&gt;

&lt;p&gt;Most interview questions don't ask you to implement sorting from scratch. But here's the thing: understanding &lt;em&gt;why&lt;/em&gt; one sort beats another teaches you cache locality, pivot selection, and the gap between theoretical complexity and real-world performance. When you're optimizing a solution and the interviewer asks "can we do better?", knowing that switching from a stability-preserving sort to an in-place one can save you 30% runtime is the kind of insight that moves you from "correct answer" to "strong hire."&lt;/p&gt;

&lt;p&gt;Plus, some interviewers absolutely will ask you to implement Quick Sort or Merge Sort. And if you can't explain why Quick Sort degenerates to $O(n^2)$ on sorted input without randomization, you're going to have a bad time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Contenders
&lt;/h2&gt;

&lt;p&gt;Let's establish what we're comparing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Continue reading the full article on &lt;a href="https://tildalice.io/quick-sort-merge-sort-heap-sort-python-speed-test/" rel="noopener noreferrer"&gt;TildAlice&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quicksort</category>
      <category>mergesort</category>
      <category>heapsort</category>
      <category>sortingalgorithms</category>
    </item>
    <item>
      <title>ROS1 move_base vs ROS2 Nav2: 8 Breaking Changes</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Wed, 20 May 2026 15:05:28 +0000</pubDate>
      <link>https://dev.to/tildalice/ros1-movebase-vs-ros2-nav2-8-breaking-changes-5h44</link>
      <guid>https://dev.to/tildalice/ros1-movebase-vs-ros2-nav2-8-breaking-changes-5h44</guid>
      <description>&lt;h2&gt;
  
  
  The Navigation Stack Rewrite Nobody Warned You About
&lt;/h2&gt;

&lt;p&gt;ROS2 Nav2 is not a drop-in replacement for ROS1 move_base. It's a complete architectural redesign that will break your production robot if you treat it like a version bump.&lt;/p&gt;

&lt;p&gt;I learned this the hard way migrating a warehouse AMR fleet from ROS1 Noetic to ROS2 Humble. The navigation stack worked fine in simulation, passed all integration tests, then immediately crashed on the factory floor when the first robot tried to recover from a blocked path. The recovery behavior API had been completely rewritten, and our custom recovery plugins were silently ignored.&lt;/p&gt;

&lt;p&gt;This post walks through the 8 breaking changes that actually matter in production — not the ones mentioned in migration guides, but the ones that only surface when your robot is live.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-ros1-movebase-vs-ros2-nav2-migration-checklist-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-ros1-movebase-vs-ros2-nav2-migration-checklist-1.jpg" alt="A miniature tank robot navigating through rocky terrain near railway tracks in Đà Nẵng, Vietnam." width="799" height="471"&gt;&lt;/a&gt;&lt;/p&gt;
Photo by &lt;a href="https://www.pexels.com/@david-thai-806257381" rel="nofollow noopener noreferrer"&gt;David Thái&lt;/a&gt; on &lt;a href="https://www.pexels.com" rel="nofollow noopener noreferrer"&gt;Pexels&lt;/a&gt;



&lt;h2&gt;
  
  
  Parameter Namespaces: bt_navigator vs move_base
&lt;/h2&gt;

&lt;p&gt;ROS1 move_base used flat parameter namespaces. You configured everything under &lt;code&gt;/move_base/&lt;/code&gt;:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
yaml
# ROS1 move_base
move_base:
  controller_frequency: 10.0

---

*Continue reading the full article on [TildAlice](https://tildalice.io/ros1-movebase-vs-ros2-nav2-migration-checklist/)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ros2</category>
      <category>nav2</category>
      <category>robotnavigation</category>
      <category>rosmigration</category>
    </item>
    <item>
      <title>ROS2 Topic &amp; Service Commands: 15 CLI Tools Tested</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Tue, 19 May 2026 21:04:24 +0000</pubDate>
      <link>https://dev.to/tildalice/ros2-topic-service-commands-15-cli-tools-tested-amp</link>
      <guid>https://dev.to/tildalice/ros2-topic-service-commands-15-cli-tools-tested-amp</guid>
      <description>&lt;h2&gt;
  
  
  The First Thing You Need After &lt;code&gt;ros2 run&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;You just launched your first ROS2 node. It's running. Great. Now what?&lt;/p&gt;

&lt;p&gt;Most tutorials stop here, leaving you staring at a terminal with no idea what your node is actually doing. Is it publishing? At what rate? What's the message structure? This is where the ROS2 command-line tools become essential — not just for debugging, but for understanding what's happening in your system at all.&lt;/p&gt;

&lt;p&gt;I'm going to show you 15 commands that turn ROS2 from a black box into something you can actually inspect and control. These aren't just reference material — they're the tools I reach for every single time something doesn't work the way I expect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-ros2-topic-service-commands-beginner-cheat-sheet-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-ros2-topic-service-commands-beginner-cheat-sheet-1.jpg" alt="A futuristic robot in a studio setting, striking a powerful pose with raised arms." width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;
Photo by &lt;a href="https://www.pexels.com/@pavel-danilyuk" rel="nofollow noopener noreferrer"&gt;Pavel Danilyuk&lt;/a&gt; on &lt;a href="https://www.pexels.com" rel="nofollow noopener noreferrer"&gt;Pexels&lt;/a&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;ros2 topic list&lt;/code&gt;: See Every Active Topic
&lt;/h2&gt;

&lt;p&gt;Start here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ros2 topic list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This dumps every active topic in your ROS2 network. On a fresh &lt;code&gt;turtlesim&lt;/code&gt; node (install with &lt;code&gt;sudo apt install ros-humble-turtlesim&lt;/code&gt; if you're following along), you'll see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Continue reading the full article on &lt;a href="https://tildalice.io/ros2-topic-service-commands-beginner-cheat-sheet/" rel="noopener noreferrer"&gt;TildAlice&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ros2</category>
      <category>robotics</category>
      <category>cli</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Pinecone vs Qdrant vs Weaviate: RAG Query Speed at 1M Vectors</title>
      <dc:creator>TildAlice</dc:creator>
      <pubDate>Tue, 19 May 2026 18:04:41 +0000</pubDate>
      <link>https://dev.to/tildalice/pinecone-vs-qdrant-vs-weaviate-rag-query-speed-at-1m-vectors-47j1</link>
      <guid>https://dev.to/tildalice/pinecone-vs-qdrant-vs-weaviate-rag-query-speed-at-1m-vectors-47j1</guid>
      <description>&lt;h2&gt;
  
  
  Pinecone's Managed Simplicity Comes at 3.2x the Latency Cost
&lt;/h2&gt;

&lt;p&gt;I'll say it upfront: if you're building RAG and care about p95 latency, Qdrant beats Pinecone by 3.2x on identical queries. Weaviate sits somewhere in the middle, 1.8x faster than Pinecone but trailing Qdrant.&lt;/p&gt;

&lt;p&gt;This isn't a toy benchmark. I loaded 1 million 1536-dimensional vectors (OpenAI &lt;code&gt;text-embedding-3-small&lt;/code&gt; embeddings) into all three, fired 1000 queries with $k=10$ retrieval, and measured latency under realistic load. The results surprised me—not because Qdrant won, but because the gap was this wide even on managed instances.&lt;/p&gt;

&lt;p&gt;Most tutorials pick Pinecone by default. It's the safe choice, the one VCs recognize. But that safety costs you 180ms per query at median, 420ms at p95. For conversational RAG where users expect sub-second responses, that's half your latency budget gone before you even call the LLM.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-pinecone-qdrant-weaviate-rag-vector-performance-1m-benchmark-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftildalice.io%2Fwp-content%2Fuploads%2F2026%2F05%2Fstock-pinecone-qdrant-weaviate-rag-vector-performance-1m-benchmark-1.jpg" alt="A close-up of a pine cone surrounded by autumn leaves and green needles, capturing the essence of fall." width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;
Photo by &lt;a href="https://www.pexels.com/@raymond-eichelberger-3213541" rel="nofollow noopener noreferrer"&gt;Raymond Eichelberger&lt;/a&gt; on &lt;a href="https://www.pexels.com" rel="nofollow noopener noreferrer"&gt;Pexels&lt;/a&gt;



&lt;h2&gt;
  
  
  The Setup: 1M Vectors, 3 Managed Instances
&lt;/h2&gt;




&lt;p&gt;&lt;em&gt;Continue reading the full article on &lt;a href="https://tildalice.io/pinecone-qdrant-weaviate-rag-vector-performance-1m-benchmark/" rel="noopener noreferrer"&gt;TildAlice&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rag</category>
      <category>vectordatabase</category>
      <category>pinecone</category>
      <category>qdrant</category>
    </item>
  </channel>
</rss>
