<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="da">
    <title>X2Q</title>
    <subtitle>X2Q er en personlig blog med noter om software, Linux, netværk, betalinger, hjemmeservere, madlavning og diverse sideprojekter. Online siden 2002.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://www.x2q.net/da/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://www.x2q.net"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-07-13T00:00:00+00:00</updated>
    <id>https://www.x2q.net/da/atom.xml</id>
    <entry xml:lang="da">
        <title>Første kig på NVIDIA DGX Spark — hvad maskinen faktisk rapporterer (2026)</title>
        <published>2026-07-13T00:00:00+00:00</published>
        <updated>2026-07-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/nvidia-dgx-spark-foerste-kig/"/>
        <id>https://www.x2q.net/da/post/nvidia-dgx-spark-foerste-kig/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/nvidia-dgx-spark-foerste-kig/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.nvidia.com&#x2F;en-us&#x2F;products&#x2F;workstations&#x2F;dgx-spark&#x2F;&quot;&gt;NVIDIA DGX Spark&lt;&#x2F;a&gt; er ankommet — en guldfarvet mursten på størrelse med en tyk paperback, bygget på &lt;strong&gt;GB10 Grace Blackwell&lt;&#x2F;strong&gt;-superchippen. Dette første-kig-indlæg gør én ting: aflæser hele maskinen fra kommandolinjen. Den korte version er en &lt;strong&gt;20-kernes Arm-CPU&lt;&#x2F;strong&gt; (10× Cortex-X925 + 10× Cortex-A725), &lt;strong&gt;121 GiB unified LPDDR5x-hukommelse&lt;&#x2F;strong&gt;, en enkelt &lt;strong&gt;GB10 Blackwell-GPU&lt;&#x2F;strong&gt; på &lt;strong&gt;CUDA 13&lt;&#x2F;strong&gt;, og en &lt;strong&gt;4 TB Samsung-NVMe&lt;&#x2F;strong&gt; — kørende Ubuntu 24.04 på en &lt;code&gt;6.17.0-nvidia&lt;&#x2F;code&gt;-kerne. Og den holder allerede to 100B-klasse-sprogmodeller i hukommelsen på én gang, hvilket er hele grunden til, at denne kasse findes.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ledsager til &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;ollama-komplet-guide&#x2F;&quot;&gt;Ollama — den komplette guide til lokal AI&lt;&#x2F;a&gt; og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;m1-vs-rtx4070ti-ai-benchmark-2026&#x2F;&quot;&gt;M1 Pro vs RTX 4070 Ti til lokal AI&lt;&#x2F;a&gt;. Et rigtigt benchmark-indlæg følger; dette handler bare om “hvad siger maskinen, at den er.”&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;kassen&quot;&gt;Kassen&lt;&#x2F;h2&gt;
&lt;p&gt;Den er lille og kompakt — en champagnefarvet aluminiumsskal med et karakteristisk metallisk skum-frontgitter (det er indsugningen). På bagsiden: en tænd-knap, tre USB-C-porte, HDMI, et 5 GbE RJ45, og de to QSFP-bure til det højhastigheds ConnectX-netværk. Min står oven på en ældre 1U-maskine i racket og trækker knap mere end en laptop-oplader i tomgang.&lt;&#x2F;p&gt;
&lt;p&gt;Nok med at kigge på den. Lad os spørge den, hvad den er.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-er-det-her-hostnamectl-uname&quot;&gt;Hvad er det her? — &lt;code&gt;hostnamectl&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;uname&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;$ uname -a
Linux spark 6.17.0-1026-nvidia #26-Ubuntu SMP PREEMPT_DYNAMIC ... aarch64 aarch64 aarch64 GNU&#x2F;Linux

$ hostnamectl
   Operating System: Ubuntu 24.04.4 LTS
             Kernel: Linux 6.17.0-1026-nvidia
       Architecture: arm64
    Hardware Vendor: NVIDIA
     Hardware Model: NVIDIA_DGX_Spark
   Firmware Version: 5.36_0ACUM023
      Firmware Date: Thu 2026-04-02
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Altså: &lt;strong&gt;Ubuntu 24.04.4 LTS&lt;&#x2F;strong&gt;, en &lt;strong&gt;arm64&lt;&#x2F;strong&gt;-maskine på NVIDIAs egen &lt;strong&gt;&lt;code&gt;6.17.0-1026-nvidia&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;-kerne, der identificerer sig rent som &lt;code&gt;NVIDIA_DGX_Spark&lt;&#x2F;code&gt;. Dette er ikke et Jetson-agtigt embedded-image — det er en normal Ubuntu Server-userland på en custom-kerne.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cpu-en-lscpu&quot;&gt;CPU’en — &lt;code&gt;lscpu&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Det er den del, der overrasker folk, der kommer fra x86. GB10’s CPU er et &lt;strong&gt;20-kernes Arm big.LITTLE&lt;&#x2F;strong&gt;-design, og &lt;code&gt;lscpu&lt;&#x2F;code&gt; rapporterer den som to kerne-klynger:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ lscpu
Architecture:            aarch64
CPU(s):                  20
On-line CPU(s) list:     0-19

Model name:              Cortex-X925      &amp;lt;- 10 performance-kerner
  Core(s) per socket:    10
  CPU max MHz:           3900.0000
  CPU min MHz:           1378.0000

Model name:              Cortex-A725      &amp;lt;- 10 efficiency-kerner
  Core(s) per socket:    10
  CPU max MHz:           2808.0000
  CPU min MHz:           338.0000

L1d &#x2F; L1i cache:         1.3 MiB (20 instances) hver
L2 cache:                25 MiB (20 instances)
L3 cache:                24 MiB (2 instances)
NUMA node(s):            1
NUMA node0 CPU(s):       0-19
Flags:                   ... sve sve2 sveaes svebf16 i8mm bf16 bti ...
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aflæst:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;10× Arm Cortex-X925&lt;&#x2F;strong&gt; performance-kerner, der booster til &lt;strong&gt;3,9 GHz&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;10× Arm Cortex-A725&lt;&#x2F;strong&gt; efficiency-kerner, op til &lt;strong&gt;2,8 GHz&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Én NUMA-node&lt;&#x2F;strong&gt; — alle 20 kerner ser hukommelsen uniformt, hvilket holder tingene simple.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;24 MB delt L3&lt;&#x2F;strong&gt; (i 2 instanser, én per klynge) plus store 25 MB L2.&lt;&#x2F;li&gt;
&lt;li&gt;Flags-linjen betyder noget for ML: &lt;strong&gt;SVE2&lt;&#x2F;strong&gt;, &lt;strong&gt;BF16&lt;&#x2F;strong&gt; og &lt;strong&gt;I8MM&lt;&#x2F;strong&gt; (int8-matrix) er alle til stede — CPU’en selv har moderne vektor&#x2F;matrix-udvidelser, ikke kun GPU’en.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;hukommelsen-free-h&quot;&gt;Hukommelsen — &lt;code&gt;free -h&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Her er hovedfunktionen i hele arkitekturen:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ free -h
               total        used        free      shared  buff&#x2F;cache   available
Mem:           121Gi        78Gi        16Gi       612Mi        28Gi        43Gi
Swap:           15Gi       413Mi        15Gi
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;121 GiB RAM&lt;&#x2F;strong&gt; (128 GB nominelt LPDDR5x, minus firmware&#x2F;carveout). Selve tallet er ubemærkelsesværdigt for en server — men på Spark er dette &lt;strong&gt;unified memory&lt;&#x2F;strong&gt;, delt kohærent mellem CPU og GPU over NVLink-C2C. Der er ingen separat “VRAM.” En model indlæst i disse 121 GiB er direkte synlig for Blackwell-GPU’en uden en PCIe-kopi.&lt;&#x2F;p&gt;
&lt;p&gt;Det ene faktum er grunden til, at denne kasse findes. Et 12 GB RTX 4070 Ti topper omkring en 8B-model i fp16; selv et 24 GB-kort kæmper forbi ~30B. Spark behandler en 67 GB-model som ubemærkelsesværdig — se nedenfor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gpu-en-nvidia-smi&quot;&gt;GPU’en — &lt;code&gt;nvidia-smi&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;$ nvidia-smi
NVIDIA-SMI 580.159.03   Driver Version: 580.159.03   CUDA Version: 13.0
+-----------------------------------------+------------------------+----------------------+
|   0  NVIDIA GB10               On       |   0000000F:01:00.0 Off |                  N&#x2F;A |
| N&#x2F;A   70C    P0    46W &#x2F;  N&#x2F;A           | Not Supported          |     94%      Default |
+-----------------------------------------+------------------------+----------------------+
| Processes:                                                                              |
|    0   ...   1784176   C   ...ollama&#x2F;llama-server              67012MiB                 |
+-----------------------------------------------------------------------------------------+

$ nvidia-smi --query-gpu=name,compute_cap --format=csv,noheader
NVIDIA GB10, 12.1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;En enkelt &lt;strong&gt;NVIDIA GB10&lt;&#x2F;strong&gt;-GPU, &lt;strong&gt;driver 580.159.03&lt;&#x2F;strong&gt;, &lt;strong&gt;CUDA 13.0&lt;&#x2F;strong&gt;, &lt;strong&gt;compute capability 12.1&lt;&#x2F;strong&gt; (Blackwell). Bemærk at hukommelses-kolonnen viser &lt;code&gt;Not Supported&lt;&#x2F;code&gt; — fordi det er unified memory, rapporterer &lt;code&gt;nvidia-smi&lt;&#x2F;code&gt; ikke et dedikeret VRAM-tal, som den ville på et diskret kort. I stedet kan du se det faktiske fodaftryk i proceslisten: en &lt;code&gt;ollama&lt;&#x2F;code&gt; &lt;code&gt;llama-server&lt;&#x2F;code&gt;, der holder &lt;strong&gt;67 GB&lt;&#x2F;strong&gt; resident på GPU’en.&lt;&#x2F;p&gt;
&lt;p&gt;I tomgang er GPU’en ægte søvnig — omkring &lt;strong&gt;52 °C ved ~13 W&lt;&#x2F;strong&gt;. Under den load, der er fanget her, var den på &lt;strong&gt;70 °C, 46 W, 94% util&lt;&#x2F;strong&gt;. Dette er ikke en 300 W-varmeblæser.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lagring-lsblk-df&quot;&gt;Lagring — &lt;code&gt;lsblk&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;df&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;$ lsblk -d -o NAME,SIZE,MODEL
NAME      SIZE  MODEL
nvme0n1   3.7T  SAMSUNG MZALC4T0HBL1-00B07

$ df -h &#x2F;
Filesystem      Size  Used Avail Use% Mounted on
&#x2F;dev&#x2F;nvme0n1p2  3.7T  215G  3.3T   7% &#x2F;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;En enkelt &lt;strong&gt;4 TB Samsung-NVMe&lt;&#x2F;strong&gt; (de &lt;code&gt;3.7T&lt;&#x2F;code&gt; er den sædvanlige base-2 vs base-10-forskel), 215 GB brugt indtil videre — det meste er de tre LLM’er, der ligger i &lt;code&gt;~&#x2F;.ollama&lt;&#x2F;code&gt;. Masser af plads til datasæt og model-checkpoints.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pci-topologien-lspci&quot;&gt;PCI-topologien — &lt;code&gt;lspci&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;$ lspci
0000:00:00.0 PCI bridge: NVIDIA Corporation Device 22ce (rev 01)
0002:00:00.0 PCI bridge: NVIDIA Corporation Device 22ce (rev 01)
0004:00:00.0 PCI bridge: NVIDIA Corporation Device 22ce (rev 01)
0004:01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a810
0007:00:00.0 PCI bridge: NVIDIA Corporation Device 22d0 (rev 01)
0007:01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. Device 8127 (rev 05)
0009:00:00.0 PCI bridge: NVIDIA Corporation Device 22d0 (rev 01)
0009:01:00.0 Network controller: MEDIATEK Corp. Device 7925
000f:00:00.0 PCI bridge: NVIDIA Corporation Device 22d1
000f:01:00.0 VGA compatible controller: NVIDIA Corporation Device 2e12 (rev a1)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Alt hænger på NVIDIA-mærkede PCI-broer (GB10’ens eget root-complex). De interessante endpoints:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Samsung NVMe&lt;&#x2F;strong&gt;-controller (4 TB-drevet).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Realtek 8127&lt;&#x2F;strong&gt; — 5 GbE RJ45 på bagsiden (det blå kabel på billedet).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;MediaTek 7925&lt;&#x2F;strong&gt; — Wi-Fi 7.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA device &lt;code&gt;2e12&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; som “VGA compatible controller” — det er Blackwell-GPU’en.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;netvaerk-ip-link&quot;&gt;Netværk — &lt;code&gt;ip link&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;$ ip -br link
enP7s7     UP     &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;   # 5 GbE (Realtek)
wlP9s9     UP     &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;   # Wi-Fi 7 (MediaTek)
tailscale0 UNKNOWN &amp;lt;POINTOPOINT,...&amp;gt;                  # Tailscale
docker0    DOWN   &amp;lt;NO-CARRIER,...&amp;gt;                    # Docker-bro
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Jeg har den på det kablede 5 GbE og tilgængelig over Tailscale, hvilket er, hvordan jeg driver den headless. De to QSFP-bure på bagsiden — ConnectX-7 200 GbE-portene, der er beregnet til at klynge to Sparks sammen — er ikke konfigureret i denne opsætning; intet dukker op under &lt;code&gt;&#x2F;sys&#x2F;class&#x2F;infiniband&lt;&#x2F;code&gt; endnu. Det er et projekt til en anden dag.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;grunden-til-at-den-findes-ollama-list&quot;&gt;Grunden til, at den findes — &lt;code&gt;ollama list&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;$ ollama list
NAME            ID              SIZE     MODIFIED
llama4:scout    bf31604e25c2    67 GB    2 days ago
gpt-oss:120b    a951a23b46a1    65 GB    2 days ago
gemma4:26b      5571076f3d70    17 GB    2 days ago
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Her er gevinsten. &lt;strong&gt;En 67 GB-model og en 65 GB-model, begge residente, på én desktop-maskine.&lt;&#x2F;strong&gt; Ingen af dem ville kunne indlæses på nogen forbruger-GPU på markedet — et 5090 har 32 GB. Her er de bare filer, der passer i unified-memory-puljen.&lt;&#x2F;p&gt;
&lt;p&gt;En hurtig, uvidenskabelig generering på &lt;code&gt;llama4:scout&lt;&#x2F;code&gt; (en 109B-parameter mixture-of-experts-model, 17B aktive) for at få en fornemmelse:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -s localhost:11434&#x2F;api&#x2F;generate -d &amp;#39;{&amp;quot;model&amp;quot;:&amp;quot;llama4:scout&amp;quot;, ...}&amp;#39; | ...
model:      llama4:scout
eval_count: 90 tokens
tok&#x2F;s:      15.2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;~15 tokens&#x2F;sekund&lt;&#x2F;strong&gt; på en 100B-klasse-model, på en maskine der trækker under 100 W. Det er ægte brugbart til interaktivt arbejde — ikke RTX-hurtigt, men intet RTX kan holde denne model i første omgang. Et grundigt multi-model-benchmark (prompt-eval vs generering, batch-størrelser, de mindre modeller) er det næste indlæg.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;forste-indtryk&quot;&gt;Første indtryk&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hukommelsen er produktet.&lt;&#x2F;strong&gt; Alt andet — Arm-CPU’en, Blackwell-GPU’en, NVMe’en — er i tjeneste for én idé: sæt 128 GB, hvor både CPU og GPU kan nå dem kohærent, og pludselig er 100B-parameter-modeller en desktop-ting.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Det er en normal Ubuntu-kasse.&lt;&#x2F;strong&gt; &lt;code&gt;apt&lt;&#x2F;code&gt;, &lt;code&gt;ollama&lt;&#x2F;code&gt;, Tailscale, Docker — intet eksotisk i userlandet. arm64-arkitekturen er det eneste, du skal huske på (tjek for &lt;code&gt;aarch64&lt;&#x2F;code&gt;-builds).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Den nipper til strømmen.&lt;&#x2F;strong&gt; ~13 W GPU i tomgang, under 100 W under generering. Den lever i racket, og jeg glemmer, at den er tændt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CUDA 13 &#x2F; compute 12.1 &#x2F; driver 580&lt;&#x2F;strong&gt; er toolchain-baseline at sigte mod, hvis du bygger mod den.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Næste gang: et rigtigt benchmark — throughput på tværs af &lt;code&gt;gemma4:26b&lt;&#x2F;code&gt;, &lt;code&gt;llama4:scout&lt;&#x2F;code&gt; og &lt;code&gt;gpt-oss:120b&lt;&#x2F;code&gt;, prompt-eval vs genereringsrater, og hvordan unified-memory-modellen faktisk opfører sig, når man skubber mod toppen af de 121 GiB.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hvis du gør dette på en laptop eller en forbruger-GPU i stedet, dækker &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;ollama-komplet-guide&#x2F;&quot;&gt;Ollama-guiden&lt;&#x2F;a&gt; og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;m1-vs-rtx4070ti-ai-benchmark-2026&#x2F;&quot;&gt;M1 Pro vs RTX 4070 Ti-benchmarks&lt;&#x2F;a&gt; det terræn.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Vi troede modellen var problemet. Den var ikke.</title>
        <published>2026-07-05T00:00:00+00:00</published>
        <updated>2026-07-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/speaker-identifikation-fem-forsoegsrunder/"/>
        <id>https://www.x2q.net/da/post/speaker-identifikation-fem-forsoegsrunder/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/speaker-identifikation-fem-forsoegsrunder/">&lt;p&gt;Vi har en pipeline, der transskriberer og opsummerer tusindvis af telefonopkald. Et af de sidste, uløste problemer var enkelt at formulere og forbandet svært at løse: &lt;strong&gt;hvem taler egentlig i hvert opkald?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Diarization (at splitte lyd op i “taler A” og “taler B”) virker fint på det tekniske plan — men at vide &lt;em&gt;hvem&lt;&#x2F;em&gt; taler A og B &lt;em&gt;er&lt;&#x2F;em&gt; som mennesker, er en helt anden opgave. Vi prøvede i fem runder. Den femte gav endelig svaret — men ikke det svar, vi forventede.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dette er et opfølgende indlæg til &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;diarization-fem-alternativer&#x2F;&quot;&gt;fem alternativer til pyannote&lt;&#x2F;a&gt; og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;dansk-voicelog-transkribering&#x2F;&quot;&gt;den fulde voicelog-pipeline&lt;&#x2F;a&gt;. Ingen navne, telefonnumre eller virksomhedsdetaljer optræder i dette indlæg — kun metoden og tallene.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;udgangspunktet-kanalen-dominerer-identiteten&quot;&gt;Udgangspunktet: “kanalen dominerer identiteten”&lt;&#x2F;h2&gt;
&lt;p&gt;De første tre forsøgsrunder konkluderede noget deprimerende: på 8kHz-telefonlyd drukner stemmeidentitet i støj fra telefonlinjen og codec’et. En moderne speaker-embedding-model (ECAPA-TDNN) kunne knap skelne to forskellige mennesker fra hinanden bedre end tilfældigt gæt, målt ved en Equal Error Rate på 35-45%.&lt;&#x2F;p&gt;
&lt;p&gt;Konklusionen virkede solid. Den var forkert.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;runde-4-at-stille-sporgsmalstegn-ved-sin-egen-metode&quot;&gt;Runde 4: at stille spørgsmålstegn ved sin egen metode&lt;&#x2F;h2&gt;
&lt;p&gt;Vi bad en anden model om at kritisere vores eget arbejde adversarielt — uden at være investeret i konklusionen. Den fandt to fatale metodefejl:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cirkulære labels.&lt;&#x2F;strong&gt; Vores træningsdata kom fra pipelinens egne speaker-labels — den samme pipeline, vi prøvede at forbedre. 40% af kaldene havde kollapset diarization (ét navn på hvert segment). Vi målte støj mod støj.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Forkert opgave.&lt;&#x2F;strong&gt; Vi målte cross-call-verifikation (er stemme A fra kald 1 samme person som stemme B fra kald 2?), men den &lt;em&gt;rigtige&lt;&#x2F;em&gt; opgave er meget lettere: inden for ét opkald, hvilken af de to klynger er linjeejeren? Her går den delte telefonkanal ud i differencen — den nøjagtige confound, vi troede dominerede alt.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Vi genopbyggede et guldsæt fra transskript-selvintroduktioner (“det er [navn]”) i stedet for pipeline-labels, og re-scorede de &lt;em&gt;samme&lt;&#x2F;em&gt; embeddings på den &lt;em&gt;rigtige&lt;&#x2F;em&gt; opgave. Resultat: &lt;strong&gt;82-92% nøjagtighed.&lt;&#x2F;strong&gt; Samme model. Samme data. Bare målt rigtigt denne gang.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;realitetstjekket-der-ikke-stemte&quot;&gt;Realitetstjekket der ikke stemte&lt;&#x2F;h2&gt;
&lt;p&gt;Før vi fejrede, testede vi metoden blindt på de 100 seneste rigtige opkald — ikke det kuraterede guldsæt, bare almindelige samtaler.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;59,5% enighed med pipelinens eksisterende labels.&lt;&#x2F;strong&gt; Stort set møntkast.&lt;&#x2F;p&gt;
&lt;p&gt;Og konfidensen var &lt;em&gt;omvendt&lt;&#x2F;em&gt; kalibreret: jo mere sikker modellen var, jo oftere tog den fejl. Det er ikke støj. Det er et systematisk problem.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fem-forsog-til-at-lukke-gabet-ingen-af-dem-virkede&quot;&gt;Fem forsøg til at lukke gabet — ingen af dem virkede&lt;&#x2F;h2&gt;
&lt;p&gt;Vi prøvede:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tekst + adfærdsfusion&lt;&#x2F;strong&gt; (ordvalg, taletidsandel, turtagning): 92% på guldsættet, 100% på det ene kendte svære forvekslingspar. Kollapsede til identisk 62% på blinde rigtige kald — samme selektionsbias som guldsættet selv.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kanal-fingeraftryk&lt;&#x2F;strong&gt; (udnytte at linjeejerens side af hvert opkald går gennem samme udstyr): tæt på tilfældigt. Viste sig at hele opkaldet — begge talere — deles om én mono-optaget kanal, så der findes ikke en separat “ejer-kanal”-signatur at finde.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Domænetilpasning via Common Voice&lt;&#x2F;strong&gt;: her kom det første rigtige gennembrud i &lt;em&gt;forklaringen&lt;&#x2F;em&gt;, ikke løsningen. Vi tog en helt uafhængig dataset med pålidelig ground truth, kørte den gennem vores telefonsimulering, og testede den samme model: &lt;strong&gt;100% på ren tale, 98,7% på telefonsimuleret tale.&lt;&#x2F;strong&gt; Modellen kan sagtens håndtere telefonlyd. Vores grundantagelse siden runde 1 var forkert.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Formant&#x2F;pitch-landmarks&lt;&#x2F;strong&gt; (Shazam-inspireret): reelt signal, men underpræsterede akustik.&lt;&#x2F;li&gt;
&lt;li&gt;En trænet meta-klassifikator over alle sensorer samtidig: slog ikke den simple akustiske model alene.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;den-manuelle-maerkning-der-loste-det&quot;&gt;Den manuelle mærkning der løste det&lt;&#x2F;h2&gt;
&lt;p&gt;Vi byggede en mobilvenlig side, hvor et menneske kunne bekræfte: er dette lydklip linjeejeren, eller en anden? Tilfældig stikprøve — ingen automatisk forudindtagethed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;68% af klippene indeholdt hørbare spor af BEGGE talere.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Vi testede, om det bare var vores klip-metode: byggede den om fra bunden (færre, længere segmenter, kanttrimning, pauser mellem sammensplejsninger). Samme rate, til decimalen: 68,2% før, 68,2% efter.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kapitlet-der-lukker-historien&quot;&gt;Kapitlet der lukker historien&lt;&#x2F;h2&gt;
&lt;p&gt;Vi scorede kun de klip, et menneske havde bekræftet var &lt;em&gt;rene&lt;&#x2F;em&gt;, fra en helt tilfældig population.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;87,2% nøjagtighed. AUC 0,856.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Modellen har aldrig været problemet. Problemet var, at op mod 2 ud af 3 “enkelt-taler”-klynger faktisk indeholder to personers stemmer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bonusfundene-undervejs&quot;&gt;Bonusfundene undervejs&lt;&#x2F;h2&gt;
&lt;p&gt;Menneskelig verifikation afslørede tre reelle fejl i vores kontaktregister, som ingen havde opdaget — fejlagtigt sammenblandede personer, et familiemedlem forkert registreret som forretningskontakt, og et navn indtastet forkert for år siden.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;det-vi-tager-med-os&quot;&gt;Det vi tager med os&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mistro din egen evalueringsmetode&lt;&#x2F;strong&gt;, især hvis labels stammer fra det system, du prøver at forbedre.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Test på en population, du ikke selv har kurateret.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Split confidence fra korrekthed.&lt;&#x2F;strong&gt; Et velkalibreret system bliver mere præcist, når det er mere sikkert — sker det modsatte, leder du efter det forkerte problem.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Simple metoder vinder, indtil du har data nok til at retfærdiggøre kompleksitet.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Menneskelig verifikation er stadig den billigste vej til sandheden&lt;&#x2F;strong&gt;, når du ved præcis, hvilket spørgsmål du skal stille.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Se også &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;diarization-fem-alternativer&#x2F;&quot;&gt;fem alternativer til diarization&lt;&#x2F;a&gt; for det tekniske trin, der kommer &lt;em&gt;før&lt;&#x2F;em&gt; dette — at splitte lyd op i talere, inden man forsøger at identificere dem — og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;whisper-backend-sammenligning&#x2F;&quot;&gt;Whisper-backend-sammenligningen&lt;&#x2F;a&gt; for transskriptionslaget under det hele.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Sådan cracker du Wi-Fi med hashcat i 2026</title>
        <published>2026-07-03T00:00:00+00:00</published>
        <updated>2026-07-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/crack-wifi-med-hashcat-2026/"/>
        <id>https://www.x2q.net/da/post/crack-wifi-med-hashcat-2026/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/crack-wifi-med-hashcat-2026/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; &lt;code&gt;airodump-ng&lt;&#x2F;code&gt; + &lt;code&gt;aircrack-ng&lt;&#x2F;code&gt; + &lt;code&gt;cap2hccapx&lt;&#x2F;code&gt;-pipelinen, som hver eneste tutorial fra 2015 lærer dig, er forældet. Den nuværende workflow er &lt;strong&gt;&lt;code&gt;hcxdumptool&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; til capture, &lt;strong&gt;&lt;code&gt;hcxpcapngtool&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; til at konvertere til det samlede &lt;strong&gt;hash mode 22000&lt;&#x2F;strong&gt;-format, og &lt;strong&gt;&lt;code&gt;hashcat 7.1.2&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; til at angribe det. Dette indlæg gennemgår hele kæden mod et WPA2-netværk, du har tilladelse til at teste, med rigtige kommandoer, realistiske 2026-GPU-hastigheder, og et ærligt svar på hvorfor intet af det virker mod WPA3-SAE.&lt;&#x2F;p&gt;
&lt;p&gt;Test kun netværk du ejer eller har eksplicit skriftlig tilladelse til at teste. Se &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;hack-traadloest-netvaerk&#x2F;&quot;&gt;25 år med Wi-Fi-sikkerhed&lt;&#x2F;a&gt; for den bredere historie og forsvarsvejledning, denne gennemgang supplerer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-der-har-aendret-sig-siden-de-gamle-tutorials&quot;&gt;Hvad der har ændret sig siden de gamle tutorials&lt;&#x2F;h2&gt;
&lt;p&gt;Hvis du lærte dette fra en gammel guide, er tre ting anderledes nu:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;hcxdumptool&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;hcxtools&lt;&#x2F;code&gt; erstattede &lt;code&gt;airodump-ng&lt;&#x2F;code&gt; + &lt;code&gt;cap2hccapx&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; til capture og konvertering. &lt;code&gt;aircrack-ng&lt;&#x2F;code&gt; er stadig fint til at sætte et kort i monitor mode, men dets eget &lt;code&gt;.cap&lt;&#x2F;code&gt;-captureformat og community-konverteren &lt;code&gt;cap2hccapx&lt;&#x2F;code&gt; er legacy — de producerer kun de gamle, mere begrænsede hash modes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hash mode 22000 erstattede modes 2500 og 16800.&lt;&#x2F;strong&gt; hashcat har nu ét samlet format (&lt;code&gt;WPA-PBKDF2-PMKID+EAPOL&lt;&#x2F;code&gt;), der håndterer både et PMKID-capture og et fuldt 4-vejs håndtryk-capture i samme fil.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PMKID først, deauth valgfrit.&lt;&#x2F;strong&gt; De fleste forbruger-APs lækker en PMKID i en enkelt frame med nul klient-interaktion — ingen deautentificering af nogen nødvendig. Deauth er nu et fallback, ikke standard-førstetrækket.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;krav&quot;&gt;Krav&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;En trådløs adapter der understøtter &lt;strong&gt;monitor mode og packet injection&lt;&#x2F;strong&gt; (Atheros AR9271 og Realtek RTL8812AU-chipsæt forbliver pålidelige valg i 2026).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;hashcat 7.1.2&lt;&#x2F;strong&gt; eller nyere. &lt;code&gt;hashcat -V&lt;&#x2F;code&gt; for at tjekke; projektet bevæger sig hurtigt, opdatér hvis du er bagud.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;hcxdumptool + hcxtools&lt;&#x2F;strong&gt; (ZerBeas værktøjer) — &lt;code&gt;apt install hcxdumptool hcxtools&lt;&#x2F;code&gt; på Debian&#x2F;Kali, eller byg fra kilde.&lt;&#x2F;li&gt;
&lt;li&gt;En ordliste. Se &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;rockyou-ordliste-historie&#x2F;&quot;&gt;rockyou.txt og ordlisternes nuværende tilstand&lt;&#x2F;a&gt; — start småt (&lt;code&gt;rockyou-65.txt&lt;&#x2F;code&gt;), ikke med en 100 GB megaliste.&lt;&#x2F;li&gt;
&lt;li&gt;En GPU. hashcat kører også på CPU, men WPA’s PBKDF2-omkostningsfunktion er designet til at være langsom — en GPU er ikke valgfri, hvis du vil have resultater på rimelig tid.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;trin-1-monitor-mode&quot;&gt;Trin 1 — monitor mode&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo airmon-ng check kill      # stop NetworkManager&#x2F;wpa_supplicant der kæmper om interfacet
sudo airmon-ng start wlan0     # opretter wlan0mon i monitor mode
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Eller uden aircrack-ng-pakken, med &lt;code&gt;iw&lt;&#x2F;code&gt; direkte:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo ip link set wlan0 down
sudo iw wlan0 set monitor control
sudo ip link set wlan0 up
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;trin-2-capture-med-hcxdumptool&quot;&gt;Trin 2 — capture med hcxdumptool&lt;&#x2F;h2&gt;
&lt;p&gt;Det opportunistiske capture uden deauth — indsamler PMKID’er og håndtryk fra alt inden for rækkevidde:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo hcxdumptool -i wlan0mon -o capture.pcapng --enable_status=1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For at målrette et specifikt BSSID og reducere støj, byg en filterliste og send den ind:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;echo &amp;quot;AA:BB:CC:DD:EE:FF&amp;quot; &amp;gt; targets.txt
sudo hcxdumptool -i wlan0mon -o capture.pcapng \
  --filterlist=targets.txt --filtermode=2 --enable_status=1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Hvis mål-AP’en ikke lækker en PMKID, og du har brug for et fuldt 4-vejs håndtryk fra en tilsluttende klient, tving en genforbindelse med et klassisk deauth (kræver tilladelse — dette påvirker klientens forbindelse):&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo aireplay-ng --deauth 5 -a AA:BB:CC:DD:EE:FF wlan0mon
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lad &lt;code&gt;hcxdumptool&lt;&#x2F;code&gt; blive ved med at køre i en anden terminal, mens du gør dette — det capturer automatisk det resulterende håndtryk.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;trin-3-konverter-til-hash-mode-22000&quot;&gt;Trin 3 — konvertér til hash mode 22000&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;hcxpcapngtool -o hash.22000 capture.pcapng
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Denne ene kommando udtrækker hver crackbar PMKID og EAPOL-håndtryk fundet i capturet til hashcat’s samlede format. Hvis du capturede flere netværk og vil isolere ét, filtrér den resulterende fil på BSSID (det andet felt i hver linje):&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;grep &amp;quot;aabbccddeeff&amp;quot; hash.22000 &amp;gt; target-only.22000
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;trin-4-angrib-det&quot;&gt;Trin 4 — angrib det&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;dictionary-angreb&quot;&gt;Dictionary-angreb&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;hashcat -m 22000 -a 0 hash.22000 rockyou-65.txt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Start med en lille, kurateret liste, ikke den fulde 14,3M-linjers &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; — se &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;rockyou-ordliste-historie&#x2F;&quot;&gt;ordliste-indlægget&lt;&#x2F;a&gt; for hvorfor det nu er det bedre standardvalg.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;regelbaseret-angreb&quot;&gt;Regelbaseret angreb&lt;&#x2F;h3&gt;
&lt;p&gt;Regler genererer muterede kandidater (case-skift, leetspeak, tilføjede cifre) fra en lille basisliste — normalt langt mere effektivt pr. sekund GPU-tid end en større umuteret liste:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;hashcat -m 22000 -a 0 -r rules&#x2F;best64.rule hash.22000 rockyou-65.txt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;maskeangreb&quot;&gt;Maskeangreb&lt;&#x2F;h3&gt;
&lt;p&gt;Nyttigt når du ved noget om PSK’ens struktur — et almindeligt standard-router-mønster (8 cifre), en PSK der ligner et telefonnummer, eller en kendt længde:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;hashcat -m 22000 -a 3 hash.22000 ?d?d?d?d?d?d?d?d
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;combinator-angreb&quot;&gt;Combinator-angreb&lt;&#x2F;h3&gt;
&lt;p&gt;Sammenkæder to ordlister — nyttigt til &lt;code&gt;ord+ord&lt;&#x2F;code&gt;- eller &lt;code&gt;ord+tal&lt;&#x2F;code&gt;-PSK-mønstre:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;hashcat -m 22000 -a 1 hash.22000 words.txt suffixes.txt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;tjek-resultater&quot;&gt;Tjek resultater&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;hashcat -m 22000 hash.22000 --show
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;realistiske-hastigheder-i-2026&quot;&gt;Realistiske hastigheder i 2026&lt;&#x2F;h2&gt;
&lt;p&gt;Mode 22000 kører PSK’en gennem &lt;strong&gt;PBKDF2-HMAC-SHA1 med 4096 iterationer&lt;&#x2F;strong&gt; — dette er med vilje, for at gøre brute-force dyrt. Det er langt fra så hurtigt som et rå hash mode som NTLM eller SHA-1.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;GPU-klasse&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Kandidater&#x2F;sekund (mode 22000)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;&lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; (14,3M) udtømt på&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;RTX 3090 (2022-æraen)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;~1,2M&#x2F;s&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;~12 s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;RTX 4090&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;~2,5–3M&#x2F;s&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;~5 s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;RTX 5090-klasse (2025+)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;~5–8M&#x2F;s&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;~2–3 s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;8× H100 cloud-instans&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;~50M&#x2F;s samlet&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&amp;lt;0,3 s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Mod en &lt;strong&gt;tilfældig 12+-tegns PSK&lt;&#x2F;strong&gt; (entropi ≈ 2⁷²) betyder ingen af disse tal noget — udtømmende søgning tager stadig årtusinder. Mod en &lt;strong&gt;8-tegns ordbogsord-PSK&lt;&#x2F;strong&gt; betyder de alle sammen en hel del.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-dette-ikke-rorer-wpa3&quot;&gt;Hvorfor dette ikke rører WPA3&lt;&#x2F;h2&gt;
&lt;p&gt;Alt ovenfor målretter &lt;strong&gt;WPA2’s PSK-afledte 4-vejs håndtryk&lt;&#x2F;strong&gt;, som med vilje lader en offline observatør verificere PSK-gæt mod et capturet hash. &lt;strong&gt;WPA3-Personal erstatter dette med SAE&lt;&#x2F;strong&gt; (Simultaneous Authentication of Equals) — en protokol specifikt bygget så et passivt capture ikke giver noget crackbart offline. Der findes ikke et hashcat-mode til “cracke WPA3-SAE offline”, fordi protokollen ikke lækker det materiale, der skal til for at prøve.&lt;&#x2F;p&gt;
&lt;p&gt;Den praktiske vinkel mod WPA3 i 2026 er ikke at cracke SAE — det er at finde et access point, der stadig annoncerer &lt;strong&gt;WPA2&#x2F;3-overgangstilstand&lt;&#x2F;strong&gt;, tvinge klienten til at forhandle WPA2-siden, og køre præcis angrebet ovenfor mod det fallback. Hvis netværket er rent WPA3 med PMF (Protected Management Frames) påkrævet, har denne playbook intet at byde på. Se &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;hack-traadloest-netvaerk&#x2F;&quot;&gt;25 år med Wi-Fi-sikkerhed&lt;&#x2F;a&gt; for det fulde billede, inklusive Dragonblood-downgrade-forskningen dette afhænger af.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;defensiv-pointe&quot;&gt;Defensiv pointe&lt;&#x2F;h2&gt;
&lt;p&gt;Hvis du læser dette for at tjekke dit eget netværk:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WPA3-Personal, ingen overgangstilstand.&lt;&#x2F;strong&gt; Tjek eksplicit — mange APs falder tilbage på WPA2&#x2F;3-blandet tilstand, selv når WPA3 er “aktiveret”.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En lang, tilfældig PSK&lt;&#x2F;strong&gt; — 20+ tegn, ikke et ordbogsord eller telefonnummer. Det er det, der faktisk stopper hvert eneste angreb ovenfor koldt, WPA2 eller WPA3.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Deaktivér WPS.&lt;&#x2F;strong&gt; Urelateret til hashcat, men stadig ofte efterladt tændt og stadig en langt hurtigere vej ind for en angriber.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PMF påkrævet, ikke valgfrit&lt;&#x2F;strong&gt;, for helt at lukke af for deauth-drevet håndtryk-capture.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Se også &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;rockyou-ordliste-historie&#x2F;&quot;&gt;rockyou.txt og ordlisternes tilstand i 2026&lt;&#x2F;a&gt; for hvad du faktisk skal loade ind i &lt;code&gt;-a 0&lt;&#x2F;code&gt;, og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;hack-traadloest-netvaerk&#x2F;&quot;&gt;25 år med Wi-Fi-sikkerhed&lt;&#x2F;a&gt; for protokolhistorien bag alt dette.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>rockyou.txt: historien om verdens mest berømte ordliste (2026)</title>
        <published>2026-07-03T00:00:00+00:00</published>
        <updated>2026-07-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/rockyou-ordliste-historie/"/>
        <id>https://www.x2q.net/da/post/rockyou-ordliste-historie/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/rockyou-ordliste-historie/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; er 14,3 millioner rigtige kodeord lækket i klartekst fra ét firmas databrud i 2009. Den blev standard-ordlisten for en hel generation af password cracking — bundlet i Kali Linux, citeret i hver eneste hashcat-tutorial, udødeliggjort som &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;wordlists&#x2F;rockyou.txt.gz&lt;&#x2F;code&gt;. I 2026 findes den stadig, men den er ikke længere det bedste værktøj til opgaven: weakpass.com’s aktuelle rangering placerer små kuraterede udsnit og løbende opdaterede ‘fundne kodeord fra virkeligheden’-lister over den. Dette indlæg dækker, hvor den kom fra, hvorfor den vandt, og hvad der reelt vinder nu.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;december-2009-et-firma-der-ikke-hashede-sine-kodeord&quot;&gt;December 2009: et firma der ikke hashede sine kodeord&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;RockYou Inc.&lt;&#x2F;strong&gt; lavede Flash-baserede sociale-netværks-widgets — SuperWall, sjove foto-apps — til MySpace og Facebook, på højdepunktet af platform-app-boomet. I december 2009 eksponerede en &lt;strong&gt;SQL-injection&lt;&#x2F;strong&gt;-sårbarhed på RockYous side hele deres brugerdatabase: omkring &lt;strong&gt;32 millioner konti&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Bruddet ville have været en fodnote, hvis ikke for én detalje: RockYou opbevarede kontoadgangskoder som &lt;strong&gt;klartekst&lt;&#x2F;strong&gt;. Ingen hashing, ingen salting — bare kodeordet, ordret, ved siden af e-mailadressen. Da dumpet cirkulerede, havde sikkerhedsforskere noget nærmest uhørt: &lt;strong&gt;millioner af rigtige kodeord, i klartekst&lt;&#x2F;strong&gt;, uden behov for cracking for at se, hvad folk faktisk valgte.&lt;&#x2F;p&gt;
&lt;p&gt;Efter fjernelse af dubletter endte den unikke kodeord-kolonne på &lt;strong&gt;~14,3–14,4 millioner linjer&lt;&#x2F;strong&gt;, og den begyndte at cirkulere som en almindelig &lt;code&gt;.txt&lt;&#x2F;code&gt;-fil under navnet på det brudte firma: &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-den-blev-standarden&quot;&gt;Hvorfor den blev standarden&lt;&#x2F;h2&gt;
&lt;p&gt;Der skete masser af lækager før og efter 2009. &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; blev specifikt standarden for pentest&#x2F;CTF&#x2F;red-team af nogle konkrete grunde:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Det var rigtige, uhashede, menneskevalgte data.&lt;&#x2F;strong&gt; Ikke en ordbog af engelske ord, ikke et genereret permutationssæt — rigtige kodeord rigtige mennesker skrev, med bias mod præcis den slags forudsigelige mønstre (&lt;code&gt;iloveyou&lt;&#x2F;code&gt;, &lt;code&gt;password1&lt;&#x2F;code&gt;, fødselsdatoer, tastatur-walks), som rigtige konti kompromitteres med.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Størrelsen passede til hardwaren fra tiden.&lt;&#x2F;strong&gt; 14,3M kandidater kørte til ende på en enkelt CPU eller tidlig GPU på rimelig tid — nyttig, ikke bare symbolsk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Den var gratis og overalt.&lt;&#x2F;strong&gt; Ingen konto-mur, ingen nedtagning der holdt. Den blev bundlet i &lt;strong&gt;SecLists&lt;&#x2F;strong&gt; og leveret som standard i &lt;strong&gt;BackTrack&lt;&#x2F;strong&gt;, derefter &lt;strong&gt;Kali Linux&lt;&#x2F;strong&gt;, på &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;wordlists&#x2F;rockyou.txt.gz&lt;&#x2F;code&gt; — hvilket satte den på hver eneste pentesters maskine, uanset om de ledte efter den eller ej.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Engelsk-flertals-bias matchede flertallet af tidlige 2010’er-mål.&lt;&#x2F;strong&gt; Efterhånden som cracking-værktøjer blev globale, blev dette en begrænsning, ikke bare en fordel — men på det tidspunkt var det en hitrate-fordel.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I begyndelsen af 2010’erne var “kør rockyou.txt mod det” standardtrækket i næsten hvert eneste WPA-håndtryk, hashet database-dump eller CTF-udfordring med et kodeord-hash.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;navnet-overlevede-bruddet&quot;&gt;Navnet overlevede bruddet&lt;&#x2F;h2&gt;
&lt;p&gt;Her er den del, der overrasker folk: &lt;strong&gt;rockyou2021.txt&lt;&#x2F;strong&gt; og &lt;strong&gt;rockyou2024.txt&lt;&#x2F;strong&gt;, de kæmpestore efterfølger-navngivne lister du finder i dag, er &lt;strong&gt;ikke&lt;&#x2F;strong&gt; nye brud på RockYou Inc.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rockyou2021.txt&lt;&#x2F;strong&gt; dukkede op på et hacker-forum i juni 2021: omkring &lt;strong&gt;8,46 milliarder linjer&lt;&#x2F;strong&gt;, sammensat ved at flette dusinvis af tidligere lækager, ordlister og algoritmisk genererede permutationer (case-varianter, leetspeak-substitutioner, tal-suffikser) — ikke friskstjålne credentials.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;rockyou2024.txt&lt;&#x2F;strong&gt; fulgte samme mønster i 2024: omkring &lt;strong&gt;9,95 milliarder linjer&lt;&#x2F;strong&gt;, endnu en community-megasammensætning.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Navnet “rockyou” blev genbrugt som et &lt;strong&gt;brand for “den største sammensatte cracking-ordbog lige nu”&lt;&#x2F;strong&gt;, løsrevet fra sin oprindelige betydning. Begge er rigtige, begge er enorme, og begge er værd at have — men ingen af dem fortæller dig noget om RockYou Inc.’s faktiske 2009-brugere. Behandl navnet som en genre-etiket, ikke en oprindelsespåstand.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-weakpass-com-s-rangering-faktisk-viser-i-2026&quot;&gt;Hvad weakpass.com’s rangering faktisk viser i 2026&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;weakpass.com&#x2F;wordlists&quot;&gt;weakpass.com&lt;&#x2F;a&gt; er det tætteste, cracking-communityet har på et live ordliste-leaderboard: hundredvis af lister, hver med størrelse, antal linjer og en bogstavkarakter for &lt;strong&gt;effektivitet (S til F)&lt;&#x2F;strong&gt; — baseret på reel cracking-hitrate, ikke rå størrelse. At trække den aktuelle top af tavlen er mere interessant end noget enkelt tal:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ordliste&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Rang&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Størrelse&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Linjer&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weakpass_4.merged.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;37,72 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3,58 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;all-h.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;28,51 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,72 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;all-h.latin.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;28,35 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,71 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;triple-h.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;21,82 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,13 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;SAWL.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17,02 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,49 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cyclone.hashesorg.hashkiller.combined.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;15,02 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,47 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hashpwn.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14,11 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,35 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Hashes.org&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;13,99 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,40 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dictionary_private.dic&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,66 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;206,28 mio.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hashmob.net_2025.user.found&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;979,96 MB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;84,29 mio.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou-65.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;S&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;238,80 KB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;30,29 K&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weakpass_4a.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;A&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;81,37 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8,44 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;clatsdictionary.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;A&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;71,55 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,87 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou2024.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;B&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;145,27 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,95 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou2021.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;B&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;91,62 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8,46 mia.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; (originalen)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;C&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;133,44 MB&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;14,34 mio.&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Den sidste række er den interessante. Den originale &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; — filen der definerede et årti af tutorials — rangerer &lt;strong&gt;under&lt;&#x2F;strong&gt; både et 238-kilobyte kuraterede udsnit af sig selv og de milliard-linjers megasammensætninger, der lånte dens navn. Tre ting sker på samme tid:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-rang-maler-hitrate-ikke-storrelse&quot;&gt;1. Rang måler hitrate, ikke størrelse&lt;&#x2F;h3&gt;
&lt;p&gt;weakpass bedømmer efter &lt;strong&gt;cracking-effektivitet&lt;&#x2F;strong&gt;, ikke rå antal linjer. En lille, omhyggeligt kurateret liste, der rammer en høj procentdel af rigtige kodeord pr. forsøgt kandidat, rangerer over en vidtstrakt liste polstret med permutationsstøj. Derfor sidder &lt;code&gt;rockyou-65.txt&lt;&#x2F;code&gt; — et udsnit på &lt;strong&gt;30.290 linjer, 238 KB&lt;&#x2F;strong&gt; — i &lt;strong&gt;S-klasse&lt;&#x2F;strong&gt;, samme kategori som 30+ GB megalister, mens originalen med 14,34 millioner linjer sidder tre klasser lavere.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-procentvis-udsnit-af-rockyou-er-en-reel-teknik&quot;&gt;2. Procentvis udsnit af rockyou er en reel teknik&lt;&#x2F;h3&gt;
&lt;p&gt;weakpass udgiver en hel familie af &lt;code&gt;rockyou-XX.txt&lt;&#x2F;code&gt;-filer — &lt;code&gt;rockyou-5.txt&lt;&#x2F;code&gt; op til &lt;code&gt;rockyou-75.txt&lt;&#x2F;code&gt; — hver et sandsynlighedsvægtet udsnit af originalen, holdt i faldende rækkefølge efter observeret hyppighed. &lt;code&gt;rockyou-5.txt&lt;&#x2F;code&gt; er 13 linjer; &lt;code&gt;rockyou-75.txt&lt;&#x2F;code&gt; er 59.190. Ideen: til en hurtig første gennemgang mod et stort sæt hashes udgør de øverste 5–15% af &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; efter observeret hyppighed ofte en uforholdsmæssig stor andel af de crackbare konti. Prøv det lille udsnit først; grib kun til den fulde 14,3M-linjers liste, eller efterfølgerne på milliarder af linjer, hvis det hurtige gennemløb kommer tomhændet tilbage.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Udsnit&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Størrelse&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Linjer&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou-5.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;104 Bytes&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;13&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou-25.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7,06 KB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;929&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou-50.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;74,13 KB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;9,44 K&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou-65.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;238,80 KB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;30,29 K&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou-75.txt&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;467,72 KB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;59,19 K&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; (fuld)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;133,44 MB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14,34 mio.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;3-fundet-i-naturen-i-ar-slar-laekket-engang-for-et-arti-siden&quot;&gt;3. “Fundet i naturen, i år” slår “lækket engang, for et årti siden”&lt;&#x2F;h3&gt;
&lt;p&gt;Det andet mønster i toppen af S-klassen: &lt;strong&gt;&lt;code&gt;hashmob.net_2025.*.found&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;-listerne. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hashmob.net&quot;&gt;hashmob.net&lt;&#x2F;a&gt; er et levende community-hub for hash-cracking — kodeord-hashes bliver indsendt, communityet cracker hvad det kan, og de succesfuldt crackede klartekster udgives tilbage som ordlister, løbende opdateret. Fordi de repræsenterer &lt;strong&gt;kodeord folk vælger lige nu&lt;&#x2F;strong&gt;, ikke kodeord folk valgte i 2009, har de en aktualitetsfordel, ingen statisk lækage kan matche, uanset størrelse.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-det-betyder-i-praksis&quot;&gt;Hvad det betyder i praksis&lt;&#x2F;h2&gt;
&lt;p&gt;Hvis du vælger en ordliste i 2026, er “største fil” den forkerte tommelfingerregel:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start småt og målrettet.&lt;&#x2F;strong&gt; Et kurateret udsnit (&lt;code&gt;rockyou-65.txt&lt;&#x2F;code&gt;) eller en frisk “fundet”-liste slår en 100 GB megafil til en første gennemgang — det er færdigt på sekunder og rydder ofte en meningsfuld del af de svage konti.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Tilføj regler før størrelse.&lt;&#x2F;strong&gt; &lt;code&gt;hashcat -a 0 -r best64.rule&lt;&#x2F;code&gt; (eller den langt større &lt;code&gt;OneRuleToRuleThemAll.rule&lt;&#x2F;code&gt;) mod en beskeden basisliste genererer størrelsesordener flere effektive kandidater end den samme liste kørt rå — og slår normalt en større umuteret liste for samme tidsbudget.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Grib til megalisterne til sidst.&lt;&#x2F;strong&gt; &lt;code&gt;rockyou2021.txt&lt;&#x2F;code&gt;, &lt;code&gt;rockyou2024.txt&lt;&#x2F;code&gt;, &lt;code&gt;weakpass_4.merged.txt&lt;&#x2F;code&gt; og lignende er værd at have til udtømmende offline-arbejde mod et hash-sæt, du har råd til timer eller dage imod — ikke som det første, du prøver.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Den originale &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; er stadig en fin baseline&lt;&#x2F;strong&gt; — gratis, lille nok til hurtig iteration, velforstået — bare ikke længere loftet.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Se &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;crack-wifi-med-hashcat-2026&#x2F;&quot;&gt;hashcat WiFi-cracking i 2026&lt;&#x2F;a&gt; for disse ordlister i aktion mod et rigtigt WPA-håndtryk, og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;hack-traadloest-netvaerk&#x2F;&quot;&gt;25 år med Wi-Fi-sikkerhed&lt;&#x2F;a&gt; for den bredere angrebs- og forsvarshistorie.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Fine-tuning af Whisper til danske telefonopkald: en LoRA-obduktion (2026)</title>
        <published>2026-07-02T00:00:00+00:00</published>
        <updated>2026-07-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/dansk-whisper-lora-finetuning/"/>
        <id>https://www.x2q.net/da/post/dansk-whisper-lora-finetuning/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/dansk-whisper-lora-finetuning/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; Fine-tunede &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;openai&#x2F;whisper-large-v3&quot;&gt;whisper-large-v3&lt;&#x2F;a&gt;
på &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;datasets&#x2F;CoRal-project&#x2F;coral-v3&quot;&gt;CoRal-project&#x2F;coral-v3&lt;&#x2F;a&gt; (rigtig,
menneske-transskriberet dansk tale) med en LoRA-adapter, telefon-kodek-augmenteret for at lukke
hullet til rigtig telefonlyd. Træningstabet sad fast på samme plateau &lt;strong&gt;tre gange i træk&lt;&#x2F;strong&gt;, og
hver gang så forklaringen anderledes ud — indtil det viste sig at være én kedelig
skemalægningsfejl. Rettet, og modellen &lt;strong&gt;halverede næsten word error rate&lt;&#x2F;strong&gt; på tilbageholdt
dansk tale. Så fandt en systematisk gennemgang af rigtige telefonoptagelser, at benchmark-tallet
ikke fortalte hele historien. Udgivet alligevel — &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;x2q&#x2F;whisper-large-v3-da-coral-lora&quot;&gt;på Hugging Face&lt;&#x2F;a&gt;,
med et ærligt modelkort.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fine-tuning-efterfølgeren til &lt;a href=&quot;&#x2F;post&#x2F;dansk-voicelog-transkribering&#x2F;&quot;&gt;transskribering af 33.000 danske voicelogs på hjemme-GPU’er&lt;&#x2F;a&gt;.
Det indlæg valgte basismodellerne; dette forsøger at gøre en af dem bedre.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;tabet-der-ikke-ville-bevaege-sig&quot;&gt;Tabet, der ikke ville bevæge sig&lt;&#x2F;h2&gt;
&lt;p&gt;Opsætningen: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;huggingface&#x2F;peft&quot;&gt;PEFT&lt;&#x2F;a&gt; LoRA (rank 32, alpha 64,
&lt;code&gt;q_proj&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;v_proj&lt;&#x2F;code&gt;) oven på whisper-large-v3, trænet på ~9.000 lydstykker fra coral-v3 —
tre fjerdedele kørt gennem en telefon-kodek-simulering (8kHz-båndbreddegrænse,
lav-bitrate-mp3-rundtur, let støj), så modellen ville se noget tættere på rigtig
opkaldslyd end coral-v3’s rene studieoptagelser.&lt;&#x2F;p&gt;
&lt;p&gt;Krydsentropi-tab bør starte højt og falde til enkeltcifrede tal, efterhånden som
træningen konvergerer. I stedet gjorde tre separate forsøg det samme: et skarpt
indledende fald, derefter et hårdt plateau omkring 35-40, der aldrig bevægede sig,
uanset hvor længe træningen kørte. Hvert forsøg pegede på en anden synder — og hver
rettelse var reel, og ingen af dem løste det faktiske problem:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Mistænkt: dårlig lyd.&lt;&#x2F;strong&gt; Coral-v3’s rå optagelser viste sig at have vildt
uensartede lydstyrker — nogle stykker praktisk talt næsten stille (median-RMS en
størrelsesorden under sund tale). Whispers feature-extractor er følsom over for
absolut amplitude, så dette var en reel fejl. Rettet med lydstyrkenormalisering
(EBU R128, -16 LUFS) på hvert stykke. &lt;strong&gt;Tabet: sad stadig fast på 35-40.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mistænkt: dobbeltbehandling.&lt;&#x2F;strong&gt; Træningsscriptet genanvendte et støj-&#x2F;EQ-filter
beregnet til &lt;em&gt;rå, ubehandlet&lt;&#x2F;em&gt; produktionslyd på data, der allerede var fuldt
forbehandlet — en rest fra genbrug af kode skrevet til en anden datakilde.
Bekræftet ved direkte måling: det overflødige filter pressede nogle stykkers
lydstyrke lige tilbage ned. Rettet. &lt;strong&gt;Tabet: sad stadig fast på 35-40.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mistænkt: modellen selv.&lt;&#x2F;strong&gt; Med begge lydfejl rettet og plateauet uændret,
skiftede arbejdsteorien til, at læringsraten var ustabil for den &lt;em&gt;fulde&lt;&#x2F;em&gt;
whisper-large-v3 (32 decoder-lag) versus den mindre turbo-variant (4 lag), som en
tidligere, vellykket fine-tuning havde brugt. En kontrolleret test — samme
LoRA-konfiguration, samme kendt-gode data, kun basismodellen udskiftet —
genskabte det identiske plateau. Test af en 5x lavere læringsrate gav et
&lt;em&gt;identisk&lt;&#x2F;em&gt; resultat. Det var beviset: &lt;strong&gt;to forskellige læringsrater, der
konvergerer til præcis den samme “fastsiddende” værdi, er ikke et
læringsrate-problem.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Den faktiske fejl.&lt;&#x2F;strong&gt; Warmup-skemaet var 100 skridt, og hvert testkørsel —
inklusive, viste det sig, de &lt;em&gt;rigtige&lt;&#x2F;em&gt; træningskørsler — blev kun nogensinde
observeret midtvejs gennem den optrapning. Læringsrate-skemalæggeren klatrede
stadig mod sin målværdi hele tiden, nogen havde kigget på den. Et kort,
proportionalt warmup (40 af 548 samlede skridt) konvergerede rent i det allerførste
efterfølgende forsøg: &lt;strong&gt;98 → 83 → 68 → 54 → 39 → 26 → 16 → 13 → 11 → 9,5&lt;&#x2F;strong&gt;, der
fulgte næsten præcis banen for en tidligere, allerede bevist fine-tuning.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;To af de tre rettelser var reelle fejl, det var værd at rette i sig selv. Ingen af dem
var &lt;em&gt;den&lt;&#x2F;em&gt; fejl. Lektionen generaliserer ud over dette ene projekt: &lt;strong&gt;en metrik, der ser
“fastsiddende” ud, kan bare være et skema, der ikke er færdigt med at trappe op&lt;&#x2F;strong&gt; —
tjek det, før du konkluderer, at noget grundlæggende er i stykker.&lt;&#x2F;p&gt;
&lt;p&gt;(En mindre, separat fejl undervejs: parallelisering af data-forberedelsestrinnet med en
trådpulje gav nondeterministiske nedbrud med en &lt;code&gt;PyGILState_Release&lt;&#x2F;code&gt;-fejl — et
C-udvidelses-trådproblem, ikke min kodes logik. En procespulje, som giver hver worker
sin egen uafhængige interpreter-tilstand, løste det fuldstændigt. &lt;strong&gt;Foretræk
procespuljer frem for trådpuljer, når arbejdet er C-udvidelsestungt&lt;&#x2F;strong&gt; (lydafkodning,
kodek-kald) frem for ren Python.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benchmarket-en-reel-gevinst&quot;&gt;Benchmarket: en reel gevinst&lt;&#x2F;h2&gt;
&lt;p&gt;Med træning, der rent faktisk konvergerede, den rigtige test: et tilbageholdt sæt
coral-v3-stykker (adskilt fra træningen — garanteret ved at springe det nøjagtige
antal stykker over, som træningen brugte, fra den samme deterministiske blanding) med
rigtig ground truth, så word error rate kan beregnes direkte i stedet for at blive
vurderet med øjemål.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;model&lt;&#x2F;th&gt;&lt;th&gt;samtale-dansk WER&lt;&#x2F;th&gt;&lt;th&gt;oplæsnings-dansk WER&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;whisper-large-v3 (utrænet)&lt;&#x2F;td&gt;&lt;td&gt;0,704&lt;&#x2F;td&gt;&lt;td&gt;0,303&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;fine-tunet (dette indlæg)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0,367&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;0,220&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CoRals egen formålsbyggede danske model&lt;&#x2F;td&gt;&lt;td&gt;0,327&lt;&#x2F;td&gt;&lt;td&gt;0,101&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Næsten en &lt;strong&gt;halvering&lt;&#x2F;strong&gt; af samtale-WER fra en generisk basismodel, der lukker det
meste af hullet til en model bygget fra bunden til dansk. Oplæsningstallet forbedredes
mindre, fordi træningen kun brugte coral-v3’s &lt;code&gt;conversation&lt;&#x2F;code&gt;-split — en klar, testbar
forudsigelse, der holdt stik (formel, skriptet tale er en anden fordeling end uformel
samtale, og modellen så kun den ene af dem).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;men-wer-var-ikke-hele-historien&quot;&gt;Men WER var ikke hele historien&lt;&#x2F;h2&gt;
&lt;p&gt;Et WER-tal er en samlet størrelse: det fortæller dig &lt;em&gt;hvor meget&lt;&#x2F;em&gt; tekst der afviger fra
referencen, ikke &lt;em&gt;hvilken slags&lt;&#x2F;em&gt; fejl der er tale om. En model, der af og til erstatter
et rigtigt ord med et andet, forkert-men-plausibelt ord, og en model, der af og til
finder på en selvsikker, flydende, helt fabrikeret sætning, kan opnå den &lt;em&gt;samme&lt;&#x2F;em&gt; WER —
men kun den ene af dem er sikker at bruge uden opsyn.&lt;&#x2F;p&gt;
&lt;p&gt;Så: en systematisk kvalitativ gennemgang, på rigtige (ikke benchmark-) telefonoptagelser
— det faktiske måldomæne, ikke en stedfortræder for det. Hvert output fra den
fine-tunede model blev sammenlignet med fem andre modellers transskriptioner af den
samme lyd, specifikt på udkig efter indhold uden opbakning noget andet sted: et
opdigtet navn, en opdigtet detalje, en påstand der ikke blev sagt. (Intet
opkaldsindhold gengives her — optagelserne er private forretningsopkald; kun det
samlede resultat betyder noget for dette indlæg.)&lt;&#x2F;p&gt;
&lt;p&gt;Resultatet: &lt;strong&gt;omtrent hvert ottende opkald viste en klar fabrikation&lt;&#x2F;strong&gt; — indhold
sagt med selvsikkerhed, som ingen anden model, og formodentlig ingen på opkaldet,
rent faktisk sagde. Omkring halvdelen af opkaldene var i praksis ækvivalente med den
utrænede baseline, og det meste af resten adskilte sig kun i formulering eller
udeladelse, ikke opdigtning. Et genuint interessant sidespring: den utrænede
&lt;em&gt;basismodel&lt;&#x2F;em&gt; har sin egen velkendte fejltilstand på stille lyd (en specifik
hallucineret “falsk undertekst-credit”-linje, en dokumenteret Whisper-artefakt), der
dukkede op på en sammenlignelig andel af opkald — og den fine-tunede model genskabte
aldrig den specifikke fejl, hvilket tyder på, at fine-tuningen byttede én fejlklasse
ud med en anden i stedet for blot at lægge et nyt problem oven på en ren baseline.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Samlet vurdering:&lt;&#x2F;strong&gt; en reel, betydelig nøjagtighedsforbedring på den metrik, der er
let at måle, og et reelt, ikke-trivielt pålidelighedshul på den egenskab, der rent
faktisk betyder noget for brug uden opsyn — opdigtede navne og enheder er præcis det
forkerte at få galt i et system, der bruges til at spore, hvem der sagde hvad. Ingen
af de to kendsgerninger ophæver den anden.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;udgivet-alligevel&quot;&gt;Udgivet alligevel&lt;&#x2F;h2&gt;
&lt;p&gt;Adapteren er på Hugging Face: &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;x2q&#x2F;whisper-large-v3-da-coral-lora&quot;&gt;x2q&#x2F;whisper-large-v3-da-coral-lora&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;.
Modelkortet angiver WER-tallene, træningsdata og licens (coral-v3 er OpenRAIL-licenseret
og citeret direkte — ingen grund til at skjule et legitimt, statsstøttet dansk
tale-datasæt bag en vagere beskrivelse), fabrikationsrate-fundet, og en konkret
brugsadvarsel: brug den ikke som eneste kilde til automatisk navne-&#x2F;enhedsudtræk uden
en anden model eller et menneske i løkken.&lt;&#x2F;p&gt;
&lt;p&gt;En mangelfuld model med et ærligt kort er mere værd for den, der finder den, end en
tavs én.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lektionerne-destilleret&quot;&gt;Lektionerne, destilleret&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;En fastsiddende metrik kan bare være et ufærdigt skema&lt;&#x2F;strong&gt; — tre plausibelt
lydende grundårsager (dårlig data, dobbeltbehandling, læringsrate-ustabilitet)
var alle reelle fejl og alle forkerte om den faktiske årsag, som var en
warmup-optrapning, ingen havde ladet færdiggøre, før de drog konklusioner.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;To forskellige værdier, der konvergerer til det identiske forkerte svar, er et
stærkt signal&lt;&#x2F;strong&gt; — hvis ændring af en hyperparameter ikke ændrer resultatet, er
hyperparameteren sandsynligvis ikke årsagen.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Procespuljer frem for trådpuljer til C-udvidelsestungt parallelt arbejde&lt;&#x2F;strong&gt; — et
nondeterministisk nedbrud på interpreter-niveau forsvandt fuldstændigt, da hver
worker fik sin egen proces i stedet for at dele én interpreters GIL-tilstand.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En enkelt samlet metrik kan ikke se fejltilstands-diversitet&lt;&#x2F;strong&gt; — WER behandler
et forvansket ord og en selvsikkert opdigtet sætning ens. Hvis de to betyder noget
forskelligt for dit brug (det gør de næsten altid), har du brug for en kvalitativ
gennemlæsning, ikke bare et bedre tal.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Udgiv fejlen, ikke kun gevinsten&lt;&#x2F;strong&gt; — en dokumenteret fejlrate med klar
brugsvejledning er et mere nyttigt artefakt end et pænt udseende modelkort, der
viser sig at skjule det samme problem, basismodellen allerede havde.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Fem alternativer til pyannote: speaker diarization til telefonopkald (2026)</title>
        <published>2026-06-24T00:00:00+00:00</published>
        <updated>2026-06-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/diarization-fem-alternativer/"/>
        <id>https://www.x2q.net/da/post/diarization-fem-alternativer/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/diarization-fem-alternativer/">&lt;p&gt;Speaker diarization — at afgøre “hvem talte hvornår” — lyder simpelt og viser sig at være svært. Dette indlæg dokumenterer et weekendeksperiment med fem alternative tilgange til min nuværende produktionspipeline.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;baggrund&quot;&gt;Baggrund&lt;&#x2F;h2&gt;
&lt;p&gt;Jeg optager og transskriberer alle mine erhvervsopkald automatisk. Pipelinen er groft sagt:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Opkald ankommer, audio gemmes som MP3&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;openai&#x2F;whisper&quot;&gt;Whisper&lt;&#x2F;a&gt; transskriberer til ordniveausegmenter&lt;&#x2F;li&gt;
&lt;li&gt;Et diarization-trin tildeler hvert segment en taler&lt;&#x2F;li&gt;
&lt;li&gt;Alt lander i en SQLite-database med et Markdown-resumé&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Trin 3 er det interessante. Jeg landede på &lt;strong&gt;pyannote&#x2F;speaker-diarization-3.1&lt;&#x2F;strong&gt; som produktionsbackend efter at tidligere eksperimenter udelukkede NeMo MSDD, reference-guided ECAPA og DiarizationLM. Pyannote virker pålideligt — men den bruger 4–5 sekunder pr. opkald og kræver en Hugging Face-token med accepterede modelvilkår. Jeg ville vide, om nyere forskning har produceret noget meningsfuldt bedre.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benchmark&quot;&gt;Benchmark&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;8 rigtige opkald, 288–592 sekunder, alle 2-partssamtaler.&lt;&#x2F;strong&gt; Jeg kører hvert alternativ mod pyannotes output og måler &lt;em&gt;segment-level agreement&lt;&#x2F;em&gt;: andelen af Whisper-segmenter, hvor alternativet tildeler samme speaker-label som pyannote, under den bedste permutationsmapping.&lt;&#x2F;p&gt;
&lt;p&gt;Dette måler &lt;em&gt;lighed med pyannote&lt;&#x2F;em&gt;, ikke absolut korrekthed. En metode der afviger fra pyannote kan faktisk have &lt;em&gt;mere&lt;&#x2F;em&gt; ret — der er ingen human ground truth at sammenligne med. Husk det, når du læser tallene.&lt;&#x2F;p&gt;
&lt;p&gt;Alle fem bruger pyannotes interne &lt;strong&gt;WeSpeaker ResNet34-LM&lt;&#x2F;strong&gt; embedding-model (256-dim, cosine, trænet på VoxCeleb) — samme model pyannote bruger internt, så den er allerede indlæst.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;baseline-exp-e-udgik-tidligt&quot;&gt;Baseline — EXP E (udgik tidligt)&lt;&#x2F;h2&gt;
&lt;p&gt;Inden F–J prøvede jeg at bygge taler-referencer fra pyannotes egne labels i databasen og køre WeSpeaker nearest-neighbour mod dem. Den nåede 88 % agreement — men er cirkulær: den bruger pyannotes labels som input. Ubrugelig som erstatning.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;exp-f-wespeaker-spectral-clustering&quot;&gt;EXP F — WeSpeaker + Spectral Clustering&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Idé:&lt;&#x2F;strong&gt; SpectralClustering med normaliseret cosine-affinitet slår AgglomerativeClustering på 2-taler-opgaver (Park et al. ICASSP 2022; Landini et al. IS 2022). Den globale grafstruktur slår grådige lokale sammensætninger.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Flow:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Gruppér Whisper-segmenter i turns (&amp;lt; 0,5 s pause = samme turn)&lt;&#x2F;li&gt;
&lt;li&gt;Embed hvert turn med WeSpeaker ResNet34 (256-dim, L2-normaliseret)&lt;&#x2F;li&gt;
&lt;li&gt;Byg cosine-affinitetsmatrix, kør &lt;code&gt;SpectralClustering(n_clusters=2)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Map klyngerne til navne via opkaldsretning&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;Tid:&lt;&#x2F;strong&gt; ~0,2 s — 25× hurtigere end pyannote.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;exp-g-multi-scale-wespeaker-ahc&quot;&gt;EXP G — Multi-scale WeSpeaker + AHC&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Idé:&lt;&#x2F;strong&gt; Korte turns giver ustabile embeddings. Løs det ved at embedde hvert turn i tre vinduesstørrelser — 0,5×, 1× og 2× turn-varighed centreret om turn-midten — og middel de tre embeddings. Inspireret af NeMos MSDD-arkitektur (Kwon et al. 2022).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Flow:&lt;&#x2F;strong&gt; Samme som F, men brug det middelte multi-scale embedding. Clustering med AgglomerativeClustering (&lt;code&gt;cosine&lt;&#x2F;code&gt;, &lt;code&gt;average&lt;&#x2F;code&gt; linkage).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Tid:&lt;&#x2F;strong&gt; ~0,6 s.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;exp-h-wespeaker-plda-spectral-clustering&quot;&gt;EXP H — WeSpeaker + PLDA + Spectral Clustering&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Idé:&lt;&#x2F;strong&gt; PLDA (Probabilistic Linear Discriminant Analysis) modellerer within- og between-speaker-kovarians og slår konsistent cosine-distance til speaker clustering (Snyder et al. 2018; dominerende i VoxSRC 2023-vindersystemer).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;pyannote-audio&lt;&#x2F;code&gt;-pakken medfølger et trænet PLDA-objekt med LDA-transformationen &lt;code&gt;_xvec_tf&lt;&#x2F;code&gt; og egenværdierne &lt;code&gt;phi&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Flow:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;LDA-projektion: &lt;code&gt;mat_lda = plda._xvec_tf(embeddings)&lt;&#x2F;code&gt; — reducerer 256 → 128 dim&lt;&#x2F;li&gt;
&lt;li&gt;Pairwise Simplified-PLDA log-likelihood ratio:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;φ&lt;&#x2F;code&gt; = PLDA-egenværdier (&lt;code&gt;plda.phi&lt;&#x2F;code&gt;, 128-dim)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;w_same = φ &#x2F; (φ + 2)&lt;&#x2F;code&gt; — vægt for at x og y er samme taler&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;w_diff = 1 &#x2F; (φ + 1)&lt;&#x2F;code&gt; — straf for at de er forskellige&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;LLR(x, y) = Σ [ w_same·(xᵢ+yᵢ)²&#x2F;2 − w_diff·(xᵢ²+yᵢ²)&#x2F;2 ]&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Konvertér til affinitet: &lt;code&gt;A = 1 &#x2F; (1 + exp(−LLR))&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;SpectralClustering(n_clusters=2, affinity=&quot;precomputed&quot;)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;Tid:&lt;&#x2F;strong&gt; ~0,3 s.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;exp-i-silero-vad-wespeaker-spectral-clustering&quot;&gt;EXP I — Silero VAD + WeSpeaker + Spectral Clustering&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Idé:&lt;&#x2F;strong&gt; Whisper-segmentgrænser er semantiske, ikke akustiske — de følger meningen, ikke mundens åbning. Bedre VAD-grænser giver renere embeddings. VBx-systemet (Landini et al. Odyssey 2022) viser, at nær-oracle VAD er kritisk for embedding-kvalitet. Silero VAD (Silero Team 2021) kører på CPU og bruger ~1 ms pr. sekund audio.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Flow:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Kør Silero VAD på rå audio (&lt;code&gt;threshold=0.4&lt;&#x2F;code&gt;, &lt;code&gt;min_speech=250 ms&lt;&#x2F;code&gt;, &lt;code&gt;min_silence=300 ms&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Gruppér Silero-timestamps i turns (&amp;lt; 0,5 s pause)&lt;&#x2F;li&gt;
&lt;li&gt;Embed hvert Silero-turn med WeSpeaker&lt;&#x2F;li&gt;
&lt;li&gt;Map Whisper-segmenter til nærmeste Silero-turn via tidsoverlap&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;SpectralClustering(n_clusters=2)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;Tid:&lt;&#x2F;strong&gt; ~2,1 s (domineret af Silero på CPU).&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;exp-j-cross-call-speaker-gallery-nearest-neighbour&quot;&gt;EXP J — Cross-call speaker gallery (nearest-neighbour)&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Idé:&lt;&#x2F;strong&gt; Ingen clustering overhovedet. Byg i stedet et galleri af kendte talere fra historiske kald i databasen, og klassificér nye turns med cosine nearest-neighbour — som i speaker-recognition-litteraturen (Ding et al. ICASSP 2020; x-vector NN-baseline i VoxSRC 2021–2023).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Flow:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Hent de seneste 40 færdigbehandlede kald fra DB&lt;&#x2F;li&gt;
&lt;li&gt;Sample op til 8 WeSpeaker-embeddings pr. taler pr. kald → &lt;code&gt;{taler: [emb, ...]}&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Beregn middelembedinget pr. taler, L2-normaliser&lt;&#x2F;li&gt;
&lt;li&gt;For hvert nyt turn: find galleri-taleren med højeste cosine-similaritet&lt;&#x2F;li&gt;
&lt;li&gt;Snap til linje-ejer eller modpart baseret på opkaldsretning&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;Tid:&lt;&#x2F;strong&gt; ~0,2 s ekskl. gallery-opbygning (12 s én gang ved opstart, derefter cached).&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;resultater-8-opkald&quot;&gt;Resultater — 8 opkald&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Opkald&lt;&#x2F;th&gt;&lt;th&gt;Varighed&lt;&#x2F;th&gt;&lt;th&gt;Pyannote-fordeling&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;F SC&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;G MS&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;H PLDA&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;I Silero&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;J Gallery&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Kald A&lt;&#x2F;td&gt;&lt;td&gt;308 s&lt;&#x2F;td&gt;&lt;td&gt;68 &#x2F; 34 seg.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;66,7 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;65,7 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;88,2 %&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;88,2 %&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;69,6 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kald B&lt;&#x2F;td&gt;&lt;td&gt;288 s&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;mono&lt;&#x2F;strong&gt; (10&#x2F;0)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;80,0 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;90,0 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;80,0 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;90,0 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;80,0 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kald C&lt;&#x2F;td&gt;&lt;td&gt;320 s&lt;&#x2F;td&gt;&lt;td&gt;4 &#x2F; 33 seg.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;75,7 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;86,5 %&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;78,4 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;81,1 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;75,7 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kald D&lt;&#x2F;td&gt;&lt;td&gt;314 s&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;mono&lt;&#x2F;strong&gt; (99&#x2F;0)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;35,4 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,0 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;35,4 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;61,6 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;47,5 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kald E&lt;&#x2F;td&gt;&lt;td&gt;384 s&lt;&#x2F;td&gt;&lt;td&gt;20 &#x2F; 39 seg.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;62,7 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;64,4 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;66,1 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;74,6 %&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;69,5 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kald F&lt;&#x2F;td&gt;&lt;td&gt;393 s&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;mono&lt;&#x2F;strong&gt; (84&#x2F;0)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;40,5 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,2 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;10,7 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;48,8 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;47,6 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kald G&lt;&#x2F;td&gt;&lt;td&gt;401 s&lt;&#x2F;td&gt;&lt;td&gt;63 &#x2F; 90 seg.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;58,8 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;59,5 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;57,5 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;88,9 %&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;62,1 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kald H&lt;&#x2F;td&gt;&lt;td&gt;592 s&lt;&#x2F;td&gt;&lt;td&gt;43 &#x2F; 64 seg.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;71,0 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;58,9 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;70,1 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;75,7 %&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;64,5 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Gennemsnit&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;61,3 % ±15 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;53,4 % ±32 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;60,8 % ±24 %&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;76,1 % ±14 %&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;64,6 % ±11 %&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Pyannote-referencetid: &lt;strong&gt;5,1 s&lt;&#x2F;strong&gt; gennemsnit pr. opkald.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Kald B, D og F er “mono” — én part dominerer næsten 100 % af segmenterne. Disse er de sværeste cases.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;tre-overraskelser&quot;&gt;Tre overraskelser&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-exp-g-kollapsede-fuldstaendigt-pa-mono-kald&quot;&gt;1. EXP G kollapsede fuldstændigt på mono-kald&lt;&#x2F;h3&gt;
&lt;p&gt;1,0 % og 1,2 % agreement. Det er ikke bare dårligt — det er aktivt forkert. AHC med &lt;code&gt;n_clusters=2&lt;&#x2F;code&gt; tvinger to klynger uanset hvad: på mono-kald ender den med én kæmpe klynge og én med nærmest ingen segmenter, og den globale label-swap-permutation redder det ikke. Multi-scale hjalp intet.&lt;&#x2F;p&gt;
&lt;p&gt;Spectral Clustering (F, H, I) er lidt mere robust — 35–61 % på de samme kald — men kollapsede stadig. Ingen af de fem tilgange &lt;em&gt;ved&lt;&#x2F;em&gt; at der kun er én taler.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-plda-88-pa-rigtige-2-taler-kald-10-pa-mono&quot;&gt;2. PLDA — 88 % på rigtige 2-taler-kald, 10 % på mono&lt;&#x2F;h3&gt;
&lt;p&gt;PLDA-metoden (H) klarede sig bedst på kald med to tydeligt adskilte talere. Det er præcis hvad PLDA er designet til: at modellere forskellen i embedding-rummet mellem to taler-distributioner. Men på mono-kald splitter den alligevel, og ender med en worst-case på 10,7 %.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-gallery-metoden-var-den-mest-stabile-11&quot;&gt;3. Gallery-metoden var den mest stabile (±11 %)&lt;&#x2F;h3&gt;
&lt;p&gt;EXP J vandt ikke i gennemsnit, men havde langt laveste varians. Den “ved” hvem linje-ejeren er fra historiske kald og gætter rimeligt på modparten. Fejler systematisk på talere den aldrig har hørt — første gang en ny kontakt ringer er gallery-embeddinget tomt for den person.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;konklusion&quot;&gt;Konklusion&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Vandt: EXP I (Silero VAD + WeSpeaker + SC)&lt;&#x2F;strong&gt; — 76,1 % agreement, 2,4× hurtigere end pyannote (2,1 s mod 5,1 s).&lt;&#x2F;p&gt;
&lt;p&gt;Forklaringen er at Sileros akustiske VAD-grænser giver renere turn-segmenter end Whispers semantiske grænser. Whisper skærer, hvor meningen stopper; Silero skærer, hvor munden stopper. Renere segmenter → renere embeddings → bedre clustering.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Forblev på pyannote 3.1 i produktion.&lt;&#x2F;strong&gt; Alle fem alternativer fejler på mono-kald, og mono-kald er et reelt scenarie i en produktionspipeline. Nær-ensidigt kald, mistet forbindelse, kort bekræftende svar — ingen af dem håndteres korrekt af klyngemetoder med fast &lt;code&gt;n_clusters=2&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Den mest lovende sti fremad: &lt;strong&gt;EXP I + 1-taler-detektor.&lt;&#x2F;strong&gt; Beregn cosine-variansen inden for en turns embeddings; er variansen under en grænseværdi, er opkaldet sandsynligvis mono og alle segmenter tildeles linje-ejeren. Det ville sandsynligvis nå 85–90 % agreement ved ~2,5 s total — sammenlignelig med pyannote på rigtige 2-taler-kald og korrekt på mono-kald.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Se &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;dansk-voicelog-transkribering&#x2F;&quot;&gt;den fulde pipeline&lt;&#x2F;a&gt; og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;whisper-backend-sammenligning&#x2F;&quot;&gt;Whisper backend-benchmarks&lt;&#x2F;a&gt; for den bredere kontekst dette eksperiment lever i.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Apple M1 Pro vs RTX 4070 Ti til lokal AI — GPU-matmul og LLM-benchmarks (2026)</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/m1-vs-rtx4070ti-ai-benchmark-2026/"/>
        <id>https://www.x2q.net/da/post/m1-vs-rtx4070ti-ai-benchmark-2026/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/m1-vs-rtx4070ti-ai-benchmark-2026/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; En 4096×4096 float16 matrixmultiplikation afslører et &lt;strong&gt;18× rå beregningsgab&lt;&#x2F;strong&gt;: RTX 4070 Ti rammer 75 TFLOPS via tensor cores; M1 Pro MPS når 4,2 TFLOPS. Men kør en rigtig LLM, og gabet kollapser til &lt;strong&gt;3–4×&lt;&#x2F;strong&gt; — fordi tokengenerering ved batch størrelse 1 er hukommelsesbåndbredde-begrænset, ikke beregnings-begrænset. Begge maskiner kan køre nyttige modeller lokalt; de bytter på VRAM-loft vs hastighed.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ledsager til &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;rust-go-c-benchmark-2026&#x2F;&quot;&gt;Rust vs Go vs C på de samme maskiner&lt;&#x2F;a&gt; — samme hardware, anderledes spørgsmål.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;opsaetning&quot;&gt;Opsætning&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;M1 Pro (Metal&#x2F;MPS)&lt;&#x2F;th&gt;&lt;th&gt;RTX 4070 Ti (CUDA)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Maskine&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Apple MacBook Pro&lt;&#x2F;td&gt;&lt;td&gt;Desktop-PC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPU&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;M1 Pro 16-kerne GPU&lt;&#x2F;td&gt;&lt;td&gt;NVIDIA GeForce RTX 4070 Ti&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;VRAM &#x2F; GPU-mem&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;16 GB unified (delt med CPU)&lt;&#x2F;td&gt;&lt;td&gt;12 GB GDDR6X&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CPU&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;M1 Pro, 8-kerne (6P+2E)&lt;&#x2F;td&gt;&lt;td&gt;Intel i5-13400F, 16 tråde&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RAM&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;16 GB&lt;&#x2F;td&gt;&lt;td&gt;125 GB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS 26.6&lt;&#x2F;td&gt;&lt;td&gt;Ubuntu 24.04, CUDA 12.1, driver 595&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;PyTorch&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;2.7.0, MPS-backend&lt;&#x2F;td&gt;&lt;td&gt;2.5.1+cu121&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ollama&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;0.30.8&lt;&#x2F;td&gt;&lt;td&gt;0.30.8&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;benchmark-1-gpu-matrixmultiplikation-ra-tflops&quot;&gt;Benchmark 1 — GPU-matrixmultiplikation (rå TFLOPS)&lt;&#x2F;h2&gt;
&lt;p&gt;En enkelt 4096×4096 tæt matmul, 20 tids-kørsler efter 5 opvarmningskørsler. Synkroniseret før og efter for at ekskludere kernel launch overhead. Dette er en proxy for &lt;strong&gt;rå tensor-beregningsgennemstrømning&lt;&#x2F;strong&gt; — loftet alt andet løber imod.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Enhed&lt;&#x2F;th&gt;&lt;th&gt;dtype&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;ms &#x2F; kørsel&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;TFLOPS&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;i5-13400F CPU&lt;&#x2F;td&gt;&lt;td&gt;float32&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;237,8 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0,58&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;M1 Pro CPU&lt;&#x2F;td&gt;&lt;td&gt;float32&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;86,4 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,59&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;M1 Pro MPS&lt;&#x2F;td&gt;&lt;td&gt;float32&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;35,8 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;3,84&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;M1 Pro MPS&lt;&#x2F;td&gt;&lt;td&gt;float16&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;33,0 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;4,16&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;RTX 4070 Ti CUDA&lt;&#x2F;td&gt;&lt;td&gt;float32&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;4,9 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;28,3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;RTX 4070 Ti CUDA&lt;&#x2F;td&gt;&lt;td&gt;float16&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;1,8 ms&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;75,3&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;RTX 4070 Ti CUDA&lt;&#x2F;td&gt;&lt;td&gt;bfloat16&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,8 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;74,9&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;hvad-tallene-betyder&quot;&gt;Hvad tallene betyder&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;M1 Pro MPS float16 → float32 adskiller sig knap (4,16 vs 3,84 TFLOPS).&lt;&#x2F;strong&gt; M1 GPU’en har ikke dedikerede fp16 tensor cores som NVIDIA. Begge præcisioner kører igennem den samme hardware; fp16-stien sparer noget hukommelsesbåndbredde men vinder lidt beregning.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;RTX 4070 Ti float16 → 75 TFLOPS — et 18× spring over M1 og et 2,7× spring over sin egen float32.&lt;&#x2F;strong&gt; Dette er tensor core-effekten. NVIDIAs Ada Lovelace-generation (RTX 40xx) har 4. generation tensor cores der opererer nativt på fp16&#x2F;bf16 matrix-felter og når ca. 4× gennemstrømningen af fp32 CUDA-kernerne på den samme chip. PyTorch router &lt;code&gt;torch.float16&lt;&#x2F;code&gt; matmul igennem dem automatisk.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;M1 Pro CPU slår Intel i5-13400F CPU med 2,7×&lt;&#x2F;strong&gt; trods begge med 8 aktive tråde. M1 bruger &lt;strong&gt;AMX (Apple Matrix Extensions)&lt;&#x2F;strong&gt; — dedikerede matrix-multiplikationsenheder i hver CPU-kerne, separate fra NEON SIMD. PyTorches macOS-backend router float32-matmul igennem dem automatisk. Intel i5’en bruger AVX2 (256-bit SIMD ombrugt til matmul), som er generel brug og markant mindre effektivt til tæt matrixarbejde.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benchmark-2-llm-inferens-tokens-sekund-ollama&quot;&gt;Benchmark 2 — LLM-inferens (tokens &#x2F; sekund, ollama)&lt;&#x2F;h2&gt;
&lt;p&gt;Fast 300-token genereringsopgave, temperatur=0, målt som &lt;code&gt;eval_count &#x2F; eval_duration&lt;&#x2F;code&gt; fra ollama API-svaret (ekskluderer prompt-eval-tid, som rapporteres separat). Prompten beder om en detaljeret forklaring af transformer-internals for at sikre at modellen genererer tæt, varieret output.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Størrelse&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;M1 Pro tok&#x2F;s&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;RTX 4070 Ti tok&#x2F;s&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;RTX &#x2F; M1&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;minicpm-v4.6&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,6 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;95,3&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;278,9&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;2,9×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;qwen3.5&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;6,6 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;20,3&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;73,5&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;3,6×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;gemma4:12b&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;7,6 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;—&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;49,1&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;—&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;em&gt;Prompt-eval (tid til første token): M1 Pro 25ms &#x2F; 115ms; RTX 4070 Ti 9ms &#x2F; 22ms &#x2F; 42ms for de tre modeller.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bandbredde-historien&quot;&gt;Båndbredde-historien&lt;&#x2F;h3&gt;
&lt;p&gt;Rå beregningsgabet er 18×. LLM-gennemstrømningsgabet er kun 3–4×. Hvorfor?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;LLM-dekodning ved batch=1 er hukommelsesbåndbredde-begrænset, ikke beregnings-begrænset.&lt;&#x2F;strong&gt; Hvert genereret token kræver at indlæse hele sættet af modelvægte fra VRAM (eller unified memory) én gang per forward pass. Beregningen per byte er lav. GPU’en bruger næsten al sin tid på at flytte data, ikke multiplicere.&lt;&#x2F;p&gt;
&lt;p&gt;Det relevante tal er &lt;strong&gt;hukommelsesbåndbredde&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;RTX 4070 Ti: ~504 GB&#x2F;s (GDDR6X, dedikeret VRAM-bus)&lt;&#x2F;li&gt;
&lt;li&gt;M1 Pro: ~200 GB&#x2F;s (LPDDR5X, delt CPU&#x2F;GPU)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Båndbredde-forhold: &lt;strong&gt;2,5×&lt;&#x2F;strong&gt; — som matcher LLM-gennemstrømningsforholdet på 2,9–3,6× næsten præcist. M1 er langsommere fordi den har mindre hukommelsesbåndbredde, ikke fordi dens GPU er 18× svagere. Til LLM-inferens ved små batch-størrelser er det hukommelsesbåndbredde du reelt køber.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;unified-memory-fordelen&quot;&gt;Unified memory-fordelen&lt;&#x2F;h2&gt;
&lt;p&gt;M1 Pro’s GPU har adgang til &lt;strong&gt;alle 16 GB&lt;&#x2F;strong&gt; unified memory. En RTX 4070 Ti med 12 GB dedikeret VRAM rammer en hård grænse: modeller større end ~11 GB fp16 passer ikke og falder tilbage til langsomt system-RAM via PCIe, hvilket kollapser gennemstrømningen.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Modelstørrelse (fp16)&lt;&#x2F;th&gt;&lt;th&gt;M1 Pro 16GB&lt;&#x2F;th&gt;&lt;th&gt;RTX 4070 Ti 12GB&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1–3B (~2–6 GB)&lt;&#x2F;td&gt;&lt;td&gt;Kører hurtigt&lt;&#x2F;td&gt;&lt;td&gt;Kører hurtigt&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;7B (~14 GB)&lt;&#x2F;td&gt;&lt;td&gt;Kører hurtigt&lt;&#x2F;td&gt;&lt;td&gt;Passer stramt; passer måske ikke&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;7B kvantiseret q4 (~4 GB)&lt;&#x2F;td&gt;&lt;td&gt;Hurtigt&lt;&#x2F;td&gt;&lt;td&gt;Hurtigt&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;13B kvantiseret q4 (~8 GB)&lt;&#x2F;td&gt;&lt;td&gt;Hurtigt&lt;&#x2F;td&gt;&lt;td&gt;Hurtigt&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;30B kvantiseret q4 (~18 GB)&lt;&#x2F;td&gt;&lt;td&gt;Passer ikke&lt;&#x2F;td&gt;&lt;td&gt;Passer ikke&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;For det almindelige use case — en kvantiseret 7B- eller 13B-model — fungerer begge maskiner komfortabelt. M1 Pro’s unified memory lader den indlæse en ukvantiseret 7B-model i fp16 der ville overløbe en 12GB RTX; RTX kører den samme model kvantiseret til q4 hurtigere samlet set.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-95-vs-279-tok-s-faktisk-foles-som&quot;&gt;Hvad 95 vs 279 tok&#x2F;s faktisk føles som&lt;&#x2F;h2&gt;
&lt;p&gt;minicpm-v4.6 ved 95 tok&#x2F;s på M1 Pro producerer tokens hurtigere end nogen læser. qwen3.5 ved 20 tok&#x2F;s på M1 Pro er grænsen — man ser ord dukke op men det føles lidt langsomt. På RTX ved 74 tok&#x2F;s er qwen3.5 komfortabelt.&lt;&#x2F;p&gt;
&lt;p&gt;Til &lt;strong&gt;interaktiv brug&lt;&#x2F;strong&gt;: 20–30 tok&#x2F;s er gulvet for hvad der føles acceptabelt. Begge maskiner klarer det på den lille model; kun RTX klarer det komfortabelt på 6,6GB-modellen.&lt;&#x2F;p&gt;
&lt;p&gt;Til en &lt;strong&gt;batch-transskriptions- eller resumé-pipeline&lt;&#x2F;strong&gt; der kører kontinuerligt vinder RTX klart — 279 vs 95 tok&#x2F;s betyder 3× gennemstrømningen med den samme model. Den &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;dansk-voicelog-transkribering&#x2F;&quot;&gt;danske voicelog-pipeline&lt;&#x2F;a&gt; der bruger Claude Code-subagenter som resumélag kører præcis denne slags vedvarende batch-arbejdsbyrde; en RTX 4070 Ti ville køre den samme arbejdsbyrde på en tredjedel af clock-tiden.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stromforbrug&quot;&gt;Strømforbrug&lt;&#x2F;h2&gt;
&lt;p&gt;Ingen instrumenter var tilkoblet for denne kørsel, men nominel TDP giver størrelsesordenen:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;Tomgang&lt;&#x2F;th&gt;&lt;th&gt;Fuld GPU-belastning&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;M1 Pro MacBook Pro&lt;&#x2F;td&gt;&lt;td&gt;~5 W&lt;&#x2F;td&gt;&lt;td&gt;~25–30 W&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;RTX 4070 Ti (kort alene)&lt;&#x2F;td&gt;&lt;td&gt;~15 W&lt;&#x2F;td&gt;&lt;td&gt;~200 W&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;M1 vinder afgørende på effektivitet. Ved 95 tok&#x2F;s for ~25W og 279 tok&#x2F;s for ~200W leverer RTX &lt;strong&gt;2,9× ydelsen til 7–8× strømmen&lt;&#x2F;strong&gt; — så M1 er &lt;strong&gt;2,5× mere effektiv per watt&lt;&#x2F;strong&gt; til LLM-inferens.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvilken-maskine-til-lokal-ai&quot;&gt;Hvilken maskine til lokal AI?&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Use case&lt;&#x2F;th&gt;&lt;th&gt;Vælg&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Interaktiv lokal assistent (7B–13B kvantiseret)&lt;&#x2F;td&gt;&lt;td&gt;Begge — RTX hurtigere, M1 roligere og mere effektiv&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Vedvarende batch-inferens (transskribering, resuméer)&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;RTX 4070 Ti&lt;&#x2F;strong&gt; — 3× gennemstrømning&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Indlæsning af store fp16-modeller uden kvantisering&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;M1 Pro&lt;&#x2F;strong&gt; — unified memory, ingen VRAM-grænse&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Træning eller fine-tuning (LoRA)&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;RTX 4070 Ti&lt;&#x2F;strong&gt; — tensor cores, CUDA-økosystem&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Always-on hjemmeserver (elregning betyder noget)&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;M1 Pro&lt;&#x2F;strong&gt; — ~7–8× lavere GPU-strømforbrug&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Numerisk ML (CV, embeddings, matmul-tungt)&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;RTX 4070 Ti&lt;&#x2F;strong&gt; — 7–18× hurtigere&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Benchmarks kørt på personligt hardware, juni 2026. LLM-gennemstrømning afhænger kraftigt af modelkvantisering, kontekstlængde og systembelastning — behandl disse tal som størrelsesordenssammenligninger, ikke absolutte specifikationer.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Ollama — komplet guide til lokal AI (2026)</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/ollama-komplet-guide/"/>
        <id>https://www.x2q.net/da/post/ollama-komplet-guide/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/ollama-komplet-guide/">&lt;p&gt;&lt;strong&gt;Ollama&lt;&#x2F;strong&gt; lader dig køre store sprogmodeller lokalt med én kommando: &lt;code&gt;ollama run llama3.2&lt;&#x2F;code&gt;. Ingen API-nøgle, ingen abonnement, ingen data der forlader din maskine. Denne guide tager dig fra installation til færdig opsætning — inkl. REST API, Python og performance-tricks.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;mac&quot;&gt;Mac&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;brew install ollama
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Start serveren:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ollama serve
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Eller som baggrundstjeneste der starter automatisk ved login:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;brew services start ollama
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;linux&quot;&gt;Linux&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;curl -fsSL https:&#x2F;&#x2F;ollama.com&#x2F;install.sh | sh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Installationen sætter Ollama op som en &lt;code&gt;systemd&lt;&#x2F;code&gt;-service der starter automatisk. Tjek status med:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;systemctl status ollama
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;windows&quot;&gt;Windows&lt;&#x2F;h3&gt;
&lt;p&gt;Download installationsfilen fra &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ollama.com&quot;&gt;ollama.com&lt;&#x2F;a&gt; — den sætter sig op som en bakke-app og starter automatisk ved login.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;forste-model&quot;&gt;Første model&lt;&#x2F;h2&gt;
&lt;p&gt;Pull og kør en model med én kommando:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ollama run llama3.2:3b
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ollama downloader modellen første gang (~2 GB), cacher den i &lt;code&gt;~&#x2F;.ollama&#x2F;models&#x2F;&lt;&#x2F;code&gt;, og åbner en interaktiv chat. &lt;code&gt;&#x2F;bye&lt;&#x2F;code&gt; afslutter.&lt;&#x2F;p&gt;
&lt;p&gt;For at downloade uden at åbne chat:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ollama pull qwen3.5
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;hvilken-model-skal-du-vaelge&quot;&gt;Hvilken model skal du vælge?&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Størrelse&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;RAM&#x2F;VRAM&lt;&#x2F;th&gt;&lt;th&gt;Hvad den er god til&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;llama3.2:1b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1.3 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;2 GB&lt;&#x2F;td&gt;&lt;td&gt;Hurtigste option — god til klassificering, korte svar&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;llama3.2:3b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;2.0 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;3 GB&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Bedste startpunkt&lt;&#x2F;strong&gt; — kompetent, kører overalt&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;llama3.1:8b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;4.9 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;6 GB&lt;&#x2F;td&gt;&lt;td&gt;Solid alsidig model, god til kode og tekst&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;qwen3.5&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;6.6 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;8 GB&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Anbefalet&lt;&#x2F;strong&gt; — 9.7B, 262k kontekst, stærk på dansk&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gemma4:12b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;7.6 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;9 GB&lt;&#x2F;td&gt;&lt;td&gt;Googles model — meget god til instruktioner&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;phi4:14b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;9.1 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;11 GB&lt;&#x2F;td&gt;&lt;td&gt;Microsofts kompakte model, god til ræsonnering&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;llama3.1:70b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;43 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;48 GB&lt;&#x2F;td&gt;&lt;td&gt;Kraftfuld — kræver server med meget VRAM&#x2F;RAM&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;minicpm-v4.6&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1.6 GB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;2 GB&lt;&#x2F;td&gt;&lt;td&gt;Multimodal — kan se billeder&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;strong&gt;Tommelfingerregel:&lt;&#x2F;strong&gt; vælg den største model der passer i din GPU’s VRAM. Modellen skal &lt;em&gt;helst&lt;&#x2F;em&gt; ligge helt i VRAM — flyder den over til RAM, falder hastigheden dramatisk.&lt;&#x2F;p&gt;
&lt;p&gt;Søg og find alle tilgængelige modeller:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ollama search llama
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;cli-cheat-sheet&quot;&gt;CLI cheat sheet&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Kør interaktiv chat
ollama run qwen3.5

# Kør med system-prompt fra kommandolinjen
ollama run llama3.2:3b &amp;quot;Forklar TCP&#x2F;IP i tre sætninger&amp;quot;

# Pipe input ind
cat artikel.txt | ollama run qwen3.5 &amp;quot;Opsummer dette&amp;quot;

# List downloadede modeller
ollama list

# Vis modeldetaljer (parametre, kvantisering, kontekstlængde)
ollama show qwen3.5

# Slet en model
ollama rm llama3.2:1b

# Kopiér og omdøb en model
ollama cp qwen3.5 mit-projekt

# Vis kørende modeller og VRAM-brug
ollama ps
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;rest-api&quot;&gt;REST API&lt;&#x2F;h2&gt;
&lt;p&gt;Ollama eksponerer en HTTP-API på &lt;code&gt;localhost:11434&lt;&#x2F;code&gt;. Du kan bruge den direkte fra terminalen eller fra ethvert programmeringssprog.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;generer-tekst&quot;&gt;Generér tekst&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;curl http:&#x2F;&#x2F;localhost:11434&#x2F;api&#x2F;generate -d &amp;#39;{
  &amp;quot;model&amp;quot;: &amp;quot;qwen3.5&amp;quot;,
  &amp;quot;prompt&amp;quot;: &amp;quot;Hvad er forskellen mellem TCP og UDP?&amp;quot;,
  &amp;quot;stream&amp;quot;: false
}&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Vigtige felter i svaret:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;json&quot;&gt;{
  &amp;quot;response&amp;quot;: &amp;quot;TCP er forbindelsesorienteret...&amp;quot;,
  &amp;quot;eval_count&amp;quot;: 142,
  &amp;quot;eval_duration&amp;quot;: 1923000000,
  &amp;quot;prompt_eval_duration&amp;quot;: 215000000
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;eval_count &#x2F; (eval_duration &#x2F; 1e9)&lt;&#x2F;code&gt; giver tokens per sekund.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;chat-med-historik&quot;&gt;Chat (med historik)&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;curl http:&#x2F;&#x2F;localhost:11434&#x2F;api&#x2F;chat -d &amp;#39;{
  &amp;quot;model&amp;quot;: &amp;quot;qwen3.5&amp;quot;,
  &amp;quot;messages&amp;quot;: [
    {&amp;quot;role&amp;quot;: &amp;quot;system&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Du er en hjælpsom dansk assistent.&amp;quot;},
    {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Hvad er hovedstaden i Danmark?&amp;quot;}
  ],
  &amp;quot;stream&amp;quot;: false
}&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;streaming&quot;&gt;Streaming&lt;&#x2F;h3&gt;
&lt;p&gt;Sæt &lt;code&gt;&quot;stream&quot;: true&lt;&#x2F;code&gt; (standard) for at få tokens løbende:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;curl http:&#x2F;&#x2F;localhost:11434&#x2F;api&#x2F;generate -d &amp;#39;{
  &amp;quot;model&amp;quot;: &amp;quot;qwen3.5&amp;quot;,
  &amp;quot;prompt&amp;quot;: &amp;quot;Skriv et digt om terminal-programmering&amp;quot;,
  &amp;quot;stream&amp;quot;: true
}&amp;#39; | while IFS= read -r line; do
  echo &amp;quot;$line&amp;quot; | python3 -c &amp;quot;import json,sys; d=json.load(sys.stdin); print(d.get(&amp;#39;response&amp;#39;,&amp;#39;&amp;#39;), end=&amp;#39;&amp;#39;, flush=True)&amp;quot;
done
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;liste-over-downloadede-modeller&quot;&gt;Liste over downloadede modeller&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;curl http:&#x2F;&#x2F;localhost:11434&#x2F;api&#x2F;tags
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;nyttige-options&quot;&gt;Nyttige options&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;curl http:&#x2F;&#x2F;localhost:11434&#x2F;api&#x2F;generate -d &amp;#39;{
  &amp;quot;model&amp;quot;: &amp;quot;qwen3.5&amp;quot;,
  &amp;quot;prompt&amp;quot;: &amp;quot;...&amp;quot;,
  &amp;quot;stream&amp;quot;: false,
  &amp;quot;options&amp;quot;: {
    &amp;quot;temperature&amp;quot;: 0.7,
    &amp;quot;num_predict&amp;quot;: 500,
    &amp;quot;num_ctx&amp;quot;: 8192,
    &amp;quot;top_p&amp;quot;: 0.9,
    &amp;quot;seed&amp;quot;: 42
  }
}&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Option&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Standard&lt;&#x2F;th&gt;&lt;th&gt;Hvad det gør&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;temperature&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0.8&lt;&#x2F;td&gt;&lt;td&gt;Kreativitet: 0 = deterministisk, 1+ = mere tilfældig&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;num_predict&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;-1 (ubegrænset)&lt;&#x2F;td&gt;&lt;td&gt;Max tokens at generere&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;num_ctx&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;modelens standard&lt;&#x2F;td&gt;&lt;td&gt;Kontekstvindue (tokens)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;seed&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;tilfældig&lt;&#x2F;td&gt;&lt;td&gt;Fast seed → reproducerbare svar&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;top_p&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0.9&lt;&#x2F;td&gt;&lt;td&gt;Nucleus sampling&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;python&quot;&gt;Python&lt;&#x2F;h2&gt;
&lt;p&gt;Ollama’s API er simpel nok til at bruge med &lt;code&gt;urllib&lt;&#x2F;code&gt; — ingen ekstra pakker nødvendigt:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;import urllib.request, json

def ollama(prompt, model=&amp;quot;qwen3.5&amp;quot;, system=None):
    messages = []
    if system:
        messages.append({&amp;quot;role&amp;quot;: &amp;quot;system&amp;quot;, &amp;quot;content&amp;quot;: system})
    messages.append({&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: prompt})

    payload = json.dumps({
        &amp;quot;model&amp;quot;: model,
        &amp;quot;messages&amp;quot;: messages,
        &amp;quot;stream&amp;quot;: False,
        &amp;quot;options&amp;quot;: {&amp;quot;temperature&amp;quot;: 0}
    }).encode()

    req = urllib.request.Request(
        &amp;quot;http:&#x2F;&#x2F;localhost:11434&#x2F;api&#x2F;chat&amp;quot;,
        data=payload,
        headers={&amp;quot;Content-Type&amp;quot;: &amp;quot;application&#x2F;json&amp;quot;}
    )
    with urllib.request.urlopen(req) as resp:
        return json.load(resp)[&amp;quot;message&amp;quot;][&amp;quot;content&amp;quot;]

# Brug
svar = ollama(&amp;quot;Forklar forskellen mellem list og tuple i Python&amp;quot;)
print(svar)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Foretrækker du en dedikeret pakke:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;pip install ollama
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;import ollama

svar = ollama.chat(
    model=&amp;quot;qwen3.5&amp;quot;,
    messages=[{&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Hvad er Rust?&amp;quot;}]
)
print(svar[&amp;quot;message&amp;quot;][&amp;quot;content&amp;quot;])
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;modelfile-tilpas-en-model&quot;&gt;Modelfile — tilpas en model&lt;&#x2F;h2&gt;
&lt;p&gt;En &lt;code&gt;Modelfile&lt;&#x2F;code&gt; lader dig oprette en ny model baseret på en eksisterende — med fast system-prompt, temperatur og parametre.&lt;&#x2F;p&gt;
&lt;p&gt;Opret filen &lt;code&gt;Modelfile&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;dockerfile&quot;&gt;FROM qwen3.5

SYSTEM &amp;quot;&amp;quot;&amp;quot;
Du er en præcis dansk teknisk assistent. Svar altid på dansk.
Vær kortfattet. Vis kodeeksempler når relevant.
&amp;quot;&amp;quot;&amp;quot;

PARAMETER temperature 0.3
PARAMETER num_ctx 16384
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Byg og brug den:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ollama create dansk-assistent -f Modelfile
ollama run dansk-assistent &amp;quot;Hvad er en hash-tabel?&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;List dine brugerdefinerede modeller:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ollama list
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Du kan dele Modelfiles med kolleger — de puller bare base-modellen og kører &lt;code&gt;ollama create&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;performance-tips&quot;&gt;Performance-tips&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;flash-attention-anbefalet&quot;&gt;Flash Attention (anbefalet)&lt;&#x2F;h3&gt;
&lt;p&gt;Reducerer VRAM-brug og øger hastighed på lange kontekster:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;OLLAMA_FLASH_ATTENTION=1 ollama serve
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;På Mac via Homebrew, tilføj til &lt;code&gt;~&#x2F;.zshrc&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;export OLLAMA_FLASH_ATTENTION=1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;kv-cache-kvantisering&quot;&gt;KV-cache kvantisering&lt;&#x2F;h3&gt;
&lt;p&gt;Halverer næsten VRAM-forbruget til kontekst-cachen, med minimal kvalitetstab:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;OLLAMA_KV_CACHE_TYPE=q8_0 ollama serve   # halvt VRAM, ingen synlig forskel
OLLAMA_KV_CACHE_TYPE=q4_0 ollama serve   # endnu mindre, let kvalitetstab
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;parallelle-requests&quot;&gt;Parallelle requests&lt;&#x2F;h3&gt;
&lt;p&gt;Ollama håndterer som standard én request ad gangen. Til serverbrug:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;OLLAMA_NUM_PARALLEL=4 ollama serve         # 4 samtidige requests
OLLAMA_MAX_LOADED_MODELS=2 ollama serve    # hold 2 modeller i VRAM
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;se-hvad-der-korer&quot;&gt;Se hvad der kører&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ollama ps
# NAME          ID      SIZE    PROCESSOR    UNTIL
# qwen3.5:latest  ...   7.9 GB  100% GPU     4 minutes from now
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Modeller unloades automatisk efter 5 minutters inaktivitet. Skift timeout:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;OLLAMA_KEEP_ALIVE=30m ollama serve   # hold indlæst i 30 min
OLLAMA_KEEP_ALIVE=-1 ollama serve    # hold indlæst for evigt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;som-server-pa-netvaerket&quot;&gt;Som server på netværket&lt;&#x2F;h2&gt;
&lt;p&gt;Som standard lytter Ollama kun på localhost. Åbn for netværksadgang:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;OLLAMA_HOST=0.0.0.0:11434 ollama serve
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Brug Tailscale&lt;&#x2F;strong&gt; til at eksponere din GPU-server sikkert på dit private netværk uden at åbne for internet:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# På serveren med RTX 4070 Ti:
OLLAMA_HOST=0.0.0.0:11434 ollama serve

# Fra din Mac via Tailscale:
OLLAMA_HOST=gpu-box:11434 ollama run qwen3.5
# eller direkte via API:
curl http:&#x2F;&#x2F;gpu-box:11434&#x2F;api&#x2F;generate -d &amp;#39;{&amp;quot;model&amp;quot;:&amp;quot;gemma4:12b&amp;quot;,&amp;quot;prompt&amp;quot;:&amp;quot;...&amp;quot;}&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;På Linux med systemd, tilføj env vars i service-filen:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo systemctl edit ollama
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;ini&quot;&gt;[Service]
Environment=&amp;quot;OLLAMA_HOST=0.0.0.0:11434&amp;quot;
Environment=&amp;quot;OLLAMA_FLASH_ATTENTION=1&amp;quot;
Environment=&amp;quot;OLLAMA_KV_CACHE_TYPE=q8_0&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo systemctl restart ollama
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;openai-kompatibelt-api&quot;&gt;OpenAI-kompatibelt API&lt;&#x2F;h2&gt;
&lt;p&gt;Ollama understøtter OpenAI’s API-format, så eksisterende kode der bruger &lt;code&gt;openai&lt;&#x2F;code&gt;-pakken kører uden ændringer:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;from openai import OpenAI

client = OpenAI(
    base_url=&amp;quot;http:&#x2F;&#x2F;localhost:11434&#x2F;v1&amp;quot;,
    api_key=&amp;quot;ollama&amp;quot;,  # kræves af klienten, ignoreres af Ollama
)

response = client.chat.completions.create(
    model=&amp;quot;qwen3.5&amp;quot;,
    messages=[{&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Hvad er en linked list?&amp;quot;}]
)
print(response.choices[0].message.content)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;hvad-koster-det-at-kore&quot;&gt;Hvad koster det at køre?&lt;&#x2F;h2&gt;
&lt;p&gt;Ingenting — bortset fra strøm. En 7B-model på en RTX 4070 Ti (200W under load) koster ca.:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Brug&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Strøm&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Pris (3 kr&#x2F;kWh)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1 times chat (~50 req)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;~0,1 kWh&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;~0,30 kr&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;1 dags batch-transskription&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;~0,5 kWh&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;~1,50 kr&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GPT-4o via API (samme mængde)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;—&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;~50–200 kr&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;På M1 Pro (25W) er strømomkostningen nærmest symbolsk.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;nyttige-links&quot;&gt;Nyttige links&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ollama.com&#x2F;library&quot;&gt;ollama.com&#x2F;library&lt;&#x2F;a&gt; — alle tilgængelige modeller&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ollama&#x2F;ollama&quot;&gt;github.com&#x2F;ollama&#x2F;ollama&lt;&#x2F;a&gt; — kildekode og issues&lt;&#x2F;li&gt;
&lt;li&gt;API-reference: &lt;code&gt;http:&#x2F;&#x2F;localhost:11434&lt;&#x2F;code&gt; når Ollama kører&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Se også &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;m1-vs-rtx4070ti-ai-benchmark-2026&#x2F;&quot;&gt;M1 Pro vs RTX 4070 Ti — GPU og LLM benchmarks&lt;&#x2F;a&gt; for konkrete tal på, hvad de to platforme leverer.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Rust vs Go vs C på Apple Silicon og Linux — benchmarks på rigtig hardware (2026)</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/rust-go-c-benchmark-2026/"/>
        <id>https://www.x2q.net/da/post/rust-go-c-benchmark-2026/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/rust-go-c-benchmark-2026/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; Fire benchmarks på to maskiner: &lt;strong&gt;Apple M1 Pro&lt;&#x2F;strong&gt; (arm64, macOS 26.6, clang 21) og &lt;strong&gt;Intel i5-13400F&lt;&#x2F;strong&gt; (x86_64, Ubuntu 24.04, gcc 13). På M1 matcher Rust C inden for støj på alle tests. På Linux x86 &lt;strong&gt;slår gcc rustc på rekursiv fib&lt;&#x2F;strong&gt; (1,5×) og &lt;strong&gt;Go’s fib falder til 2,9× langsommere end C&lt;&#x2F;strong&gt; — et meget større gab end på arm64. Den største overraskelse: &lt;strong&gt;Rust’s parallel sum er 2,8× hurtigere end C pthreads på x86&lt;&#x2F;strong&gt;, sandsynligvis fordi LLVM folder heltalsrækken til en lukket formel som løkken aldrig rent faktisk kører.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opsaetning&quot;&gt;Opsætning&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;M1 Pro (arm64)&lt;&#x2F;th&gt;&lt;th&gt;i5-13400F (x86_64)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Maskine&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Apple MacBook Pro&lt;&#x2F;td&gt;&lt;td&gt;Desktop-PC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RAM&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;16 GB&lt;&#x2F;td&gt;&lt;td&gt;125 GB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OS&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;macOS 26.6 (Sequoia)&lt;&#x2F;td&gt;&lt;td&gt;Ubuntu 24.04&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;C-compiler&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Apple clang 21.0, &lt;code&gt;-O3 -march=native&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;GCC 13.3, &lt;code&gt;-O3 -march=native&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Go&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;1.26.4 darwin&#x2F;arm64&lt;&#x2F;td&gt;&lt;td&gt;1.22.4 linux&#x2F;amd64&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Rust&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;1.96.0&lt;&#x2F;td&gt;&lt;td&gt;1.96.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Rust-flag&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;-C opt-level=3 -C target-cpu=native&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;-C opt-level=3 -C target-cpu=native&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Hvert benchmark kørtes tre gange; tabellerne nedenfor viser medianen af kørsel 2–3.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;de-fire-benchmarks&quot;&gt;De fire benchmarks&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-primtalssold-primtal-op-til-10-000-000&quot;&gt;1 — Primtalssold (primtal op til 10.000.000)&lt;&#x2F;h3&gt;
&lt;p&gt;Fladt bool-array-sold: skrive-tungt sekventiel hukommelsesadgang, letgrebet indre løkke. God proxy for hukommelsesbåndbredde-begrænset kode.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-rekursiv-fibonacci-n-47&quot;&gt;2 — Rekursiv Fibonacci (n = 47)&lt;&#x2F;h3&gt;
&lt;p&gt;Ingen heap-allokering, ingen løkker — ~2,97 milliarder stakrammer. Måler rå kald-dispatch, grenforudsigelse og hvor aggressivt hver compiler inliner&#x2F;optimerer dyb rekursion.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-matrixmultiplikation-512-x-512-f64-i-k-j-lokkeraekkefolge&quot;&gt;3 — Matrixmultiplikation (512 × 512, f64, i-k-j løkkerækkefølge)&lt;&#x2F;h3&gt;
&lt;p&gt;Cache-venlig løkkerækkefølge men stadig en tæt FP-akkumulering i den indre løkke. Her betyder auto-vektorisering og eliminering af grænsecheck mest.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-parallel-sum-100-000-000-heltal-8-trade&quot;&gt;4 — Parallel sum (100.000.000 heltal, 8 tråde)&lt;&#x2F;h3&gt;
&lt;p&gt;8 POSIX-tråde (C), goroutines (Go) eller &lt;code&gt;std::thread&lt;&#x2F;code&gt; (Rust), der hver summerer en partition af &lt;code&gt;0..100_000_000&lt;&#x2F;code&gt;. Tester tråd-spawn-overhead og hvor smart hver compiler håndterer den indre sum.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;resultater-apple-m1-pro-arm64-clang-21-macos&quot;&gt;Resultater: Apple M1 Pro (arm64, clang 21, macOS)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Benchmark&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;C&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Go 1.26&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Rust 1.96&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Sold (10M primtal)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;13,3 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;19,3 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;12,3 ms&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Fib(47) rekursiv&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;8,86 s&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;9,84 s&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;8,91 s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Matrixmultiplikation 512²&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;24,7 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;80,2 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;24,1 ms&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Parallel sum 100M&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;3,0 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;10,7 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;3,4 ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;resultater-intel-i5-13400f-x86-64-gcc-13-linux&quot;&gt;Resultater: Intel i5-13400F (x86_64, gcc 13, Linux)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Benchmark&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;C&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Go 1.22&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Rust 1.96&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Sold (10M primtal)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;25,7 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;34,3 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;27,6 ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Fib(47) rekursiv&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;4,06 s&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;11,86 s&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;6,02 s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Matrixmultiplikation 512²&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;22,5 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;106,7 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;28,3 ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Parallel sum 100M&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;3,4 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;8,7 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;1,2 ms&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;em&gt;Median af 3 kørsler, kørsel 2 brugt. 2026-06-22.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hastighed-relativt-til-c-begge-maskiner&quot;&gt;Hastighed relativt til C, begge maskiner&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Benchmark&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Go&#x2F;C (M1)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Go&#x2F;C (i5)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Rust&#x2F;C (M1)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Rust&#x2F;C (i5)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Sold&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,45×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,33×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0,92×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,07×&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Fib(47)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,11×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;2,92×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,01×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,48×&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Matrixmultiplikation&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;3,24×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;4,74×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0,98×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,26×&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Parallel sum&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;3,57×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;2,56×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,13×&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;0,35×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;tre-ting-der-er-vaerd-at-forklare&quot;&gt;Tre ting der er værd at forklare&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-go-s-fib-kollapser-pa-x86&quot;&gt;1 — Go’s fib kollapser på x86&lt;&#x2F;h3&gt;
&lt;p&gt;På M1 var Go’s fib(47) 11% langsommere end C — i praksis det samme. På i5’en er det &lt;strong&gt;2,9× langsommere&lt;&#x2F;strong&gt;. Samme Go-version, samme algoritme. Forskellen er compiler-backend’en: Go’s arm64-kodegeneration håndterer dybe rekursive kaldkæder mere effektivt end dens amd64-kodegeneration. Dette er et kendt kvalitetsgab; Go’s x86-backend er generelt mindre moden end arm64-backendet til rekursionstunge mønstre.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-gcc-slar-rustc-pa-rekursiv-fib&quot;&gt;2 — gcc slår rustc på rekursiv fib&lt;&#x2F;h3&gt;
&lt;p&gt;På M1 (clang mod rustc, begge bruger LLVM) tog fib ~8,9s i begge sprog — identisk. På Linux producerede gcc 4,06s mens rustc producerede 6,02s — &lt;strong&gt;gcc er 1,5× hurtigere&lt;&#x2F;strong&gt;. GCC’s optimizer anvender mere aggressiv tail-rekursion og inlining-heuristikker for dette specifikke mønster på x86. Det er en påmindelse om at “Rust bruger LLVM” ikke betyder at det altid vinder over gcc; GCC har 30+ år af x86-optimeringskunst bag sig.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-rust-s-parallel-sum-er-2-8x-hurtigere-end-c-pa-x86&quot;&gt;3 — Rust’s parallel sum er 2,8× hurtigere end C på x86&lt;&#x2F;h3&gt;
&lt;p&gt;Rust-trådens krop er &lt;code&gt;(start..end).sum::&amp;lt;u64&amp;gt;()&lt;&#x2F;code&gt;. LLVM genkender en sum af en sammenhængende heltalsrækkevidde som en &lt;strong&gt;aritmetisk rækkeformel&lt;&#x2F;strong&gt; og erstatter løkken med en lukket beregning &lt;code&gt;n*(n+1)&#x2F;2&lt;&#x2F;code&gt; — O(1), uanset rækkeviddens størrelse. GCC med den manuelle &lt;code&gt;for (i = start; i &amp;lt; end; i++) s += i;&lt;&#x2F;code&gt;-løkke anvender SIMD-vektorisering men laver ikke spring til lukket form. Resultat: Rust’s otte tråde udfører hver én multiplikation; C’s otte tråde summerer hver 12,5M heltal. 2,8×-forskellen er udelukkende en compiler-optimeringsforkel, ikke en sprogforskel. (På arm64 var denne effekt mindre fordi Apple clang også anvender noget af denne optimering.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;binaerstorrelse-og-kompileringstid&quot;&gt;Binærstørrelse og kompileringstid&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;C (macOS)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;C (Linux)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Go (macOS)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Go (Linux)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Rust (macOS)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Rust (Linux)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Binærstørrelse (sold)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;33 KB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;16 KB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;2,5 MB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1,9 MB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;431 KB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;4,3 MB&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kold kompilering (sold)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;96 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;54 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;319 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;193 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;660 ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;134 ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Rust-binæren der er &lt;strong&gt;4,3 MB på Linux mod 431 KB på macOS&lt;&#x2F;strong&gt; er den mest slående størrelsesforkel. På macOS linker Rust mod system-dylibs for dele af standardbiblioteket og holder binæren lille. På Linux linker Rust alt statisk, hvilket producerer en større men fuldt selvstændig binær uden system-biblioteksafhængighed — en reel fordel til containere.&lt;&#x2F;p&gt;
&lt;p&gt;Kompileringstider vender: Rust er &lt;strong&gt;134ms på Linux mod 660ms på macOS&lt;&#x2F;strong&gt; for en enkelt fil. LLVM’s x86_64-backend er markant hurtigere til at udsende kode end dens arm64-backend.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;anno-2026-hvor-lever-hvert-sprog&quot;&gt;Anno 2026: hvor lever hvert sprog?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;C&lt;&#x2F;strong&gt; er stadig referencepunktet og stadig hurtigst på rå rekursivt arbejde når gcc’s optimizer er involveret. I 2026 er det ikke et førstehåndsvalg til nye projekter medmindre du skriver kernekode, embedded firmware eller FFI-klister — men compiler-kunsten akkumuleret siden 1972 er reel.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Go&lt;&#x2F;strong&gt; ramte 1.0 i 2012 med en klar tese: gør det at skrive netværkstjenester lige så hurtigt at udvikle som Python, mens man kører med effektiviteten af et kompileret sprog. Det har i høj grad lykkedes. Hvad det betaler for det: GC’en tilføjer latensvarians, og performance-loftet er lavere end Rust eller C for beregningstunge løkker. fib-resultatet på x86 afslører også at Go’s optimizer har reelle kvalitetsgab på visse mønstre — den er tunet til hvad Go-kode faktisk ligner (interfaces, kanaler, HTTP-handlere), ikke trærekursion.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Rust&lt;&#x2F;strong&gt; ramte 1.0 i 2015 og har brugt et årti på at bevise at hukommelsessikkerhed uden GC er opnåeligt i stor skala. I 2026 accepterer Linux-kernen Rust til drivere (siden 6.1), Firefox og Chromium erstatter gradvist C++ med det, og ISRG omskriver kritisk netværksinfrastruktur i det. Den lukkede formel-sum-optimering ovenfor er et godt eksempel på hvad “zero-cost abstractions” betyder i praksis: at skrive idiomatisk Rust lader compileren anvende transformationer som en manuel C-løkke ikke kan udløse.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pick-one-guide&quot;&gt;Pick-one-guide&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Du vil…&lt;&#x2F;th&gt;&lt;th&gt;Vælg&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Skrive en Linux-driver eller kernemodul&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;C&lt;&#x2F;strong&gt; (eller Rust hvis subsystemet accepterer det)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Bygge en mikrotjeneste eller CLI-værktøj hurtigt&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Go&lt;&#x2F;strong&gt; — tooling + goroutines + hurtig iteration&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Skrive sikkerhedskritisk systemkode&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Rust&lt;&#x2F;strong&gt; — borrowchecker, ingen GC, ingen UB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Optimere en varm numerisk indre løkke&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;C&lt;&#x2F;strong&gt; eller &lt;strong&gt;Rust&lt;&#x2F;strong&gt; — SIMD, ingen grænsecheck, fuld LLVM&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Levere en statisk binær til en container&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Go&lt;&#x2F;strong&gt; (statisk som standard) eller Rust (&lt;code&gt;musl&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Målrette arm64-performance&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Rust&lt;&#x2F;strong&gt; ≈ C, bedre end Go&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Målrette x86-rekursiv kode&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;C med gcc&lt;&#x2F;strong&gt; vinder; Rust konkurrencedygtig; Go halter&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Benchmarks kørt på personligt hardware; dine tal vil variere med CPU, OS-indstillinger og compiler-flag. Koden er fire enkelt-fils programmer, ingen eksterne afhængigheder. Alle compilere kaldt med fulde optimeringsflag som vist ovenfor.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>BIN&#x2F;IIN-opslag: kort-præfiksernes intervaller og hvordan du slår et op (2026)</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/bin-iin-opslag/"/>
        <id>https://www.x2q.net/da/post/bin-iin-opslag/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/bin-iin-opslag/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; Et korts første cifre — &lt;strong&gt;BIN&lt;&#x2F;strong&gt; (Bank Identification Number) &#x2F; &lt;strong&gt;IIN&lt;&#x2F;strong&gt; (Issuer Identification Number) — identificerer &lt;strong&gt;netværket&lt;&#x2F;strong&gt; og &lt;strong&gt;udstederen&lt;&#x2F;strong&gt;. Du kan læse &lt;em&gt;netværket&lt;&#x2F;em&gt; direkte ud af præfiksintervallerne (tabel nedenfor). &lt;em&gt;Udsteder&#x2F;bank&#x2F;land&lt;&#x2F;em&gt; kræver en &lt;strong&gt;BIN-database&lt;&#x2F;strong&gt; — der er ingen formel for det. Denne side giver dig &lt;strong&gt;IIN-intervaltabellen&lt;&#x2F;strong&gt;, &lt;strong&gt;6-vs-8-ciffer-forbeholdet&lt;&#x2F;strong&gt; og de &lt;strong&gt;tre måder at slå et BIN op på&lt;&#x2F;strong&gt; (i hånden, via side&#x2F;API, programmatisk).&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Baggrundslæsning på bloggen: &lt;a href=&quot;&#x2F;post&#x2F;8-digit-bin-iin-explained&#x2F;&quot;&gt;hvorfor et 6-ciffers BIN nu er flertydigt&lt;&#x2F;a&gt; og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;binlist-net-iinlist-com-historien&#x2F;&quot;&gt;historien bag binlist.net og iinlist.com&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;hvad-et-bin-iin-er&quot;&gt;Hvad et BIN&#x2F;IIN er&lt;&#x2F;h2&gt;
&lt;p&gt;Kortnummeret (PAN, primary account number) er struktureret: de &lt;strong&gt;første cifre er IIN’et&lt;&#x2F;strong&gt;, der identificerer den udstedende institution og netværket; resten er det individuelle kontonummer, med et afsluttende &lt;strong&gt;Luhn-kontrolciffer&lt;&#x2F;strong&gt;. “BIN” er det daglige branchebegreb; “IIN” er det formelle begreb i &lt;strong&gt;ISO&#x2F;IEC 7812&lt;&#x2F;strong&gt;. IIN’et var &lt;strong&gt;6 cifre&lt;&#x2F;strong&gt; i årtier og er &lt;strong&gt;udvidet til 8&lt;&#x2F;strong&gt; for de fleste netværk — se &lt;a href=&quot;&#x2F;post&#x2F;8-digit-bin-iin-explained&#x2F;&quot;&gt;8-ciffer-indlægget&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;iin-praefiksintervaller-pr-netvaerk&quot;&gt;IIN-præfiksintervaller pr. netværk&lt;&#x2F;h2&gt;
&lt;p&gt;Hvad du &lt;em&gt;kan&lt;&#x2F;em&gt; bestemme ud fra præfikset alene — hvilket netværk der udstedte kortet:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Netværk&lt;&#x2F;th&gt;&lt;th&gt;IIN-præfiksinterval(ler)&lt;&#x2F;th&gt;&lt;th&gt;PAN-længde&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Visa&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;4&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;13, 16, 19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Mastercard&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;51&lt;&#x2F;code&gt;–&lt;code&gt;55&lt;&#x2F;code&gt;, &lt;code&gt;2221&lt;&#x2F;code&gt;–&lt;code&gt;2720&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;American Express&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;34&lt;&#x2F;code&gt;, &lt;code&gt;37&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;15&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Discover&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;6011&lt;&#x2F;code&gt;, &lt;code&gt;644&lt;&#x2F;code&gt;–&lt;code&gt;649&lt;&#x2F;code&gt;, &lt;code&gt;65&lt;&#x2F;code&gt;, &lt;code&gt;622126&lt;&#x2F;code&gt;–&lt;code&gt;622925&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;16–19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Diners Club Intl&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;36&lt;&#x2F;code&gt;, &lt;code&gt;300&lt;&#x2F;code&gt;–&lt;code&gt;305&lt;&#x2F;code&gt;, &lt;code&gt;3095&lt;&#x2F;code&gt;, &lt;code&gt;38&lt;&#x2F;code&gt;–&lt;code&gt;39&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;14–19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;JCB&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;3528&lt;&#x2F;code&gt;–&lt;code&gt;3589&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;16–19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;UnionPay&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;62&lt;&#x2F;code&gt;, &lt;code&gt;81&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;16–19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Maestro&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;50&lt;&#x2F;code&gt;, &lt;code&gt;56&lt;&#x2F;code&gt;–&lt;code&gt;69&lt;&#x2F;code&gt;, &lt;code&gt;6304&lt;&#x2F;code&gt;, &lt;code&gt;6759&lt;&#x2F;code&gt;, &lt;code&gt;676770&lt;&#x2F;code&gt;, &lt;code&gt;676774&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;12–19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RuPay&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;60&lt;&#x2F;code&gt;, &lt;code&gt;6521&lt;&#x2F;code&gt;, &lt;code&gt;6522&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Mir&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;2200&lt;&#x2F;code&gt;–&lt;code&gt;2204&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Troy&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;9792&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Bemærk: intervaller kan overlappe i kanterne (f.eks. nogle &lt;code&gt;62&lt;&#x2F;code&gt; UnionPay vs. &lt;code&gt;622126&lt;&#x2F;code&gt;–&lt;code&gt;622925&lt;&#x2F;code&gt; Discover-cobadging), og &lt;code&gt;50&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;56&lt;&#x2F;code&gt;–&lt;code&gt;69&lt;&#x2F;code&gt; for Maestro er bredt og kolliderer med andre — hvilket er præcis derfor, opløsning på udstederniveau kræver en database, ikke en præfiksregel.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-du-ikke-kan-se-ud-fra-praefikset&quot;&gt;Hvad du &lt;em&gt;ikke&lt;&#x2F;em&gt; kan se ud fra præfikset&lt;&#x2F;h2&gt;
&lt;p&gt;Der er &lt;strong&gt;ingen formel&lt;&#x2F;strong&gt;, der oversætter et præfiks til et banknavn, land eller debit&#x2F;kredit-flag. Den kobling ligger i en vedligeholdt &lt;strong&gt;BIN-database&lt;&#x2F;strong&gt; bygget af netværksbulletiner og observerede kort. Så:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Netværk&lt;&#x2F;strong&gt; → kan læses ud af tabellen ovenfor. ✅&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Udstederbank, land, korttype, produkt, prepaid&#x2F;debit&#x2F;kredit&lt;&#x2F;strong&gt; → kun databaseopslag. ❌ i hånden.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tre-mader-at-sla-et-bin-op-pa&quot;&gt;Tre måder at slå et BIN op på&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-i-handen-kun-netvaerk&quot;&gt;1. I hånden (kun netværk)&lt;&#x2F;h3&gt;
&lt;p&gt;Tag de første cifre og match dem mod tabellen ovenfor. Godt nok, når alt du har brug for er “er det Visa eller Mastercard?”.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-pa-en-opslagsside-gratis-api&quot;&gt;2. På en opslagsside &#x2F; gratis API&lt;&#x2F;h3&gt;
&lt;p&gt;For detaljer på udstederniveau, brug en BIN-opslagstjeneste. Det velkendte gratis valg er &lt;strong&gt;binlist.net&lt;&#x2F;strong&gt;, som blotlægger et JSON-API:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;curl https:&#x2F;&#x2F;lookup.binlist.net&#x2F;45717360
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;json&quot;&gt;{
  &amp;quot;scheme&amp;quot;: &amp;quot;visa&amp;quot;,
  &amp;quot;type&amp;quot;: &amp;quot;debit&amp;quot;,
  &amp;quot;brand&amp;quot;: &amp;quot;Visa Classic&amp;quot;,
  &amp;quot;bank&amp;quot;: { &amp;quot;name&amp;quot;: &amp;quot;Example Bank&amp;quot;, &amp;quot;country&amp;quot;: &amp;quot;...&amp;quot; },
  &amp;quot;country&amp;quot;: { &amp;quot;name&amp;quot;: &amp;quot;United Kingdom&amp;quot;, &amp;quot;alpha2&amp;quot;: &amp;quot;GB&amp;quot; }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Det er &lt;strong&gt;rate-limited&lt;&#x2F;strong&gt; (en håndfuld forespørgsler i timen) og bedst til lejlighedsvise opslag. Til volumen, 8-ciffers granularitet og pålidelighed vil du have en licenseret database — &lt;strong&gt;iinlist.com&lt;&#x2F;strong&gt; er det kommercielle valg bygget til netop dette. (Baggrund: &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;binlist-net-iinlist-com-historien&#x2F;&quot;&gt;hvordan begge opstod&lt;&#x2F;a&gt;.)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Send kun BIN’et — de første 6-8 cifre — aldrig et fuldt kortnummer&lt;&#x2F;strong&gt; til et tredjepartsopslag. Præfikset er alt, et opslag behøver, og fulde PAN’er er følsomme (PCI) data.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-programmatisk&quot;&gt;3. Programmatisk&lt;&#x2F;h3&gt;
&lt;p&gt;Til mere end det lejlighedsvise tjek: validér og normalisér først, slå så op:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;# normalisér: fjern mellemrum, tag de første 8 cifre som BIN
bin=$(echo &amp;quot;4571 7360 1234 5678&amp;quot; | tr -dc &amp;#39;0-9&amp;#39; | cut -c1-8)
curl -s &amp;quot;https:&#x2F;&#x2F;lookup.binlist.net&#x2F;$bin&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et hurtigt &lt;strong&gt;Luhn&lt;&#x2F;strong&gt;-gyldighedstjek, før du gemmer eller slår noget op (POSIX-shell):&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;luhn() {  # returnerer 0 hvis nummeret består Luhn-tjekket
  echo &amp;quot;$1&amp;quot; | tr -dc &amp;#39;0-9&amp;#39; | rev | awk &amp;#39;{
    s=0; for(i=1;i&amp;lt;=length;i++){d=substr($0,i,1);
      if(i%2==0){d*=2; if(d&amp;gt;9)d-=9}; s+=d}
    exit (s%10!=0)
  }&amp;#39;
}
luhn &amp;quot;4571736012345678&amp;quot; &amp;amp;&amp;amp; echo gyldig || echo ugyldig
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Til BIN-matching i produktion: indlæs en licenseret BIN-fil i din egen tabel, og key på &lt;strong&gt;8 cifre&lt;&#x2F;strong&gt; med fallback til 6 med et lav-tillids-flag.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opsummering&quot;&gt;Opsummering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BIN&#x2F;IIN’et&lt;&#x2F;strong&gt; er kortnummerets første cifre — &lt;strong&gt;netværk + udsteder&lt;&#x2F;strong&gt;; 6 cifre historisk, &lt;strong&gt;8 nu&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Du kan læse &lt;strong&gt;netværket&lt;&#x2F;strong&gt; ud af &lt;a href=&quot;https:&#x2F;&#x2F;www.x2q.net&#x2F;da&#x2F;post&#x2F;bin-iin-opslag&#x2F;#iin-praefiksintervaller-pr-netvaerk&quot;&gt;præfiksintervallerne&lt;&#x2F;a&gt;; &lt;strong&gt;udsteder&#x2F;bank&#x2F;land kræver en database&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Slå op: &lt;strong&gt;i hånden&lt;&#x2F;strong&gt; (netværk), en &lt;strong&gt;side&#x2F;API&lt;&#x2F;strong&gt; som binlist.net (gratis, rate-limited) eller &lt;strong&gt;iinlist.com&lt;&#x2F;strong&gt; (kommerciel, 8-ciffer), eller &lt;strong&gt;programmatisk&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Send &lt;strong&gt;kun de første 6-8 cifre&lt;&#x2F;strong&gt;, aldrig et fuldt PAN, til noget tredjepartsopslag.&lt;&#x2F;li&gt;
&lt;li&gt;Foretræk &lt;strong&gt;8-ciffers&lt;&#x2F;strong&gt; matching — se &lt;a href=&quot;&#x2F;post&#x2F;8-digit-bin-iin-explained&#x2F;&quot;&gt;hvorfor 6 cifre nu er flertydigt&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Transskribering af 33.000 danske voicelogs på hjemme-GPU&#x27;er — den lokale pipeline (2026)</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/dansk-voicelog-transkribering/"/>
        <id>https://www.x2q.net/da/post/dansk-voicelog-transkribering/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/dansk-voicelog-transkribering/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; Forretningstelefonsamtaler var blevet optaget i over et år: &lt;strong&gt;~33.000 danske mp3-filer, ~570 timer, 32 kbps telefonkvalitet&lt;&#x2F;strong&gt;. Opgaven var at transskribere det hele, navngive talerne, resumere pr. opkald &#x2F; pr. dag &#x2F; pr. uge, gøre det browsbart — og gøre det &lt;strong&gt;lokalt, uden LLM-API&lt;&#x2F;strong&gt;. Resultatet er en pipeline, der kører &lt;strong&gt;to ASR-modeller og fusionerer dem med Claude&lt;&#x2F;strong&gt;, identificerer talere &lt;strong&gt;fra metadata før noget lyd afkodes&lt;&#x2F;strong&gt;, heler sig selv over &lt;strong&gt;to GPU’er&lt;&#x2F;strong&gt;, og bruger &lt;strong&gt;Claude Code-subagenter som resumélag&lt;&#x2F;strong&gt; i stedet for et API. Her er hele bygget, og hvad det lærer om en kundeservicefunktion.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Den voksne efterfølger til &lt;a href=&quot;&#x2F;post&#x2F;local-speech-to-text-whisper-cpp&#x2F;&quot;&gt;at køre Whisper lokalt i stedet for et cloud-Speech-API&lt;&#x2F;a&gt;. Samme instinkt — hold lyden på din egen boks — i 33.000-fil-skala.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;begynd-med-at-analysere-ligene&quot;&gt;Begynd med at analysere ligene&lt;&#x2F;h2&gt;
&lt;p&gt;Mappen indeholdt allerede &lt;strong&gt;ni halvfærdige forsøg&lt;&#x2F;strong&gt; på problemet. Før der blev skrevet noget nyt, læste tre agenter alle ni. Tilsammen indeholdt de døde eksperimenter næsten alle de rigtige idéer, det endelige system havde brug for:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Ét Python-forsøg (WhisperX + pyannote + Claude-dagsresuméer) var det mest komplette — men havde hardcodede API-nøgler, en engelsk-alignment-bug på dansk lyd og mock-diarisering i den “rigtige” pipeline.&lt;&#x2F;li&gt;
&lt;li&gt;Ét havde opdaget nøgletricket: &lt;strong&gt;phone-first taleridentifikation&lt;&#x2F;strong&gt; (mere nedenfor) og havde allerede bygget stemmeprofiler.&lt;&#x2F;li&gt;
&lt;li&gt;En Go-omskrivning havde en flot service-arkitektur og et SQLite-skema — men &lt;strong&gt;alt var stubs&lt;&#x2F;strong&gt;; nul segmenter blev nogensinde gemt. Lektion: byg aldrig skallen, før signalvejen virker.&lt;&#x2F;li&gt;
&lt;li&gt;Et benchmark-harness havde allerede sammenlignet &lt;strong&gt;seks ASR-modeller&lt;&#x2F;strong&gt; på korpusset.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;At syntetisere de ni var langt billigere end at opfinde fra bunden. &lt;strong&gt;Lektion ét: analysér ligene først.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;modelbenchmarken&quot;&gt;Modelbenchmarken&lt;&#x2F;h2&gt;
&lt;p&gt;Det eksisterende benchmark (på RTX 4070 Ti) plus en frisk sammenligning afgjorde modelvalget:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;&#x2F;th&gt;&lt;th&gt;Resultat&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;faster-whisper large-v3-turbo&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Hurtigst — ~37× realtid, 1,8 GB VRAM. God, men glider på støjende dansk.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;faster-whisper large-v3 (fuld)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Mest kohærent på rigtige opkald. ~18× realtid — hurtig nok. &lt;strong&gt;Valgt.&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;hviske-v3-conversation&lt;&#x2F;strong&gt; (dansk fine-tune)&lt;&#x2F;td&gt;&lt;td&gt;Fanger danske navne&#x2F;vendinger, de andre forvansker. &lt;strong&gt;Valgt som andet spor.&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Voxtral&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Hallucinerede i løkker (1.832 ord for et 117-sekunders opkald), sprog-bleed. &lt;strong&gt;Droppet.&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;vibevoice&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;~6× langsommere end realtid. &lt;strong&gt;Droppet.&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Den ikke-oplagte beslutning: &lt;strong&gt;kør to modeller, ikke én.&lt;&#x2F;strong&gt; large-v3 og hviske &lt;strong&gt;fejler forskelligt&lt;&#x2F;strong&gt; — den ene har grammatikken, den anden har de danske navne — så at beholde begge og fusionere dem slår hver for sig.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pipelinen&quot;&gt;Pipelinen&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;mp3 → ffmpeg båndpas (200–3400 Hz + let denoise + dynaudnorm) → 16 kHz mono
    → [A] faster-whisper large-v3 (int8_float16, beam 5, VAD, anti-løkke-guards)
    → [B] hviske-v3-conversation (dansk fine-tune)              ← kun på opkald ≥45 s
    → ECAPA-TDNN-diarisering (token-fri klyngedeling, 2-taler-prior på lange opkald)
    → &amp;quot;phone-first&amp;quot; navngivning (filnavn + telefonbog forankrer identiteter;
       embeddings afgør hvilken klynge der er den gennemgående part; referenceprofiler matcher resten)
    → SQLite (idempotent: SHA-256-hash + status; dubletter arver tvillingens resultat)

pr. dag  → Claude-subagent læser BEGGE transskriptioner pr. opkald, fusionerer dem,
           retter diarisering ud fra kontekst, skriver dagsresuméet (dansk)
pr. uge  → Claude-subagent syntetiserer 7 dagsresuméer til tråde + en løftetabel
web      → Flask læser DB&amp;#39;en live (dage, uger, opkald m. audio, søgning, mønstre)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et par beslutninger gjorde sig fortjent:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phone-first taleridentifikation.&lt;&#x2F;strong&gt; Filnavnet bærer tidsstemplet og begge numre; en lille telefonbog oversætter numre til navne. Man kender &lt;em&gt;begge&lt;&#x2F;em&gt; identiteter, før et ord afkodes — lyden skal kun afgøre &lt;em&gt;hvilken stemme der er hvem&lt;&#x2F;em&gt;, ikke &lt;em&gt;hvem de er&lt;&#x2F;em&gt;. &lt;strong&gt;Metadata er guld.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ffmpeg-båndpas hjælper; DeepFilterNet skader.&lt;&#x2F;strong&gt; Målt: et 50 år gammelt båndpasfilter gjorde støjende opkald mere kohærente gratis; den neurale SOTA-denoiser gav hallucinationer og tabt tale. &lt;strong&gt;SOTA er opgaveafhængigt.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ECAPA frem for pyannote.&lt;&#x2F;strong&gt; pyannote løb tør for hukommelse ved siden af Whisper på et 12 GB-kort og var for langsom på CPU til 33k filer. Token-fri ECAPA-klyngedeling på GPU’en, med en &lt;strong&gt;2-taler-prior&lt;&#x2F;strong&gt; (et telefonopkald &lt;em&gt;er&lt;&#x2F;em&gt; to-parts), reddede de 79% af lange opkald, der ellers kollapsede til én taler.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;int8_float16 + udvidelige segmenter&lt;&#x2F;strong&gt; lod &lt;strong&gt;begge&lt;&#x2F;strong&gt; modeller sameksistere i ~6–8 GB på 12 GB-kortet.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;resumelaget-claude-code-subagenter-intet-api&quot;&gt;Resumélaget: Claude Code-subagenter, intet API&lt;&#x2F;h2&gt;
&lt;p&gt;Den hårde binding var &lt;strong&gt;ingen LLM-API-nøgle&lt;&#x2F;strong&gt;. Så harnesset selv er sprogmodellen: &lt;strong&gt;én Claude Code-subagent pr. dag&lt;&#x2F;strong&gt; får begge ASR-spor for hvert opkald, et fælles navneregister og gårsdagens resumé, og skriver dagsresuméet direkte — ~50k–450k tokens pr. dag-agent, &lt;strong&gt;intet API-kald i pipelinen, ingen marginalomkostning.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Tre små “institutioner” voksede op omkring det:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;En fusions-instruksfil&lt;&#x2F;strong&gt; — fletregler ([A]’s struktur, [B]’s danske ord), ret diarisering ud fra kontekst (en taler der nævner sit eget navn fastlægger, hvem der taler), spring voicemails over, &lt;strong&gt;opfind aldrig indhold, rapportér usikkerhed ærligt.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Et fælles, voksende navneregister&lt;&#x2F;strong&gt; — agenterne læser det før skrivning og tilføjer nye afklaringer. Over 60+ dage forener det stavevarianter af samme kontakt til én bekræftet identitet og holder to ens-navngivne personer adskilt. Navnekonsistens over hele korpusset, lag på lag.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En ugentlig løftetabel&lt;&#x2F;strong&gt; — hver uges agent fører en “løfter &amp;amp; leverancer”-tabel videre (✅&#x2F;⏳&#x2F;❌). En reelt nyttig primitiv (og, som vi skal se, broen til kundeservice).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;at-kore-det-over-to-maskiner&quot;&gt;At køre det over to maskiner&lt;&#x2F;h2&gt;
&lt;p&gt;Idempotens gjorde korpusset deleligt midt i kørslen:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Maskine 1 (RTX 4070 Ti, 12 GB):&lt;&#x2F;strong&gt; hele dual-model-pipelinen, kronologisk fremad.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Maskine 2 (GTX 1060, 6 GB, Pascal):&lt;&#x2F;strong&gt; deployeret over SSH&#x2F;Tailscale med ét script; tog en senere partition. Kører kun [A]-sporet i int8 (nye CUDA-wheels droppede Pascal, så torch er på CPU mens CTranslate2 driver GPU’en direkte).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Merge:&lt;&#x2F;strong&gt; workeren skriver sin egen SQLite; hovedmaskinen henter og merger hvert 15. minut (idempotent — &lt;code&gt;transcribed&lt;&#x2F;code&gt; kan opgraderes til &lt;code&gt;done&lt;&#x2F;code&gt;). Korpusset behandles &lt;strong&gt;fra begge ender på én gang.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Fordi hver fil er nøglet på &lt;strong&gt;SHA-256-hash + status&lt;&#x2F;strong&gt;, var det harmløst at flytte halvdelen af arbejdet til en anden maskine midt i kørslen. &lt;strong&gt;Idempotens er friheden til at fejle.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;selvheling-laert-pa-den-harde-made&quot;&gt;Selvheling, lært på den hårde måde&lt;&#x2F;h2&gt;
&lt;p&gt;Lange uovervågede kørsler fejler på kreative måder. Hver fejl fik et permanent modtræk:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;To transkriptionsprocesser på én GPU&lt;&#x2F;strong&gt; (en forældreløs overlevede en genstart) → gensidig OOM-forgiftning, 756 fejlede rækker. Modtræk: en &lt;code&gt;flock&lt;&#x2F;code&gt;-singleton i supervisoren + auto-drab af forældreløse ved opstart.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;“Poison file”-myten&lt;&#x2F;strong&gt; — en fil så ud til at crashe processen igen og igen; det var i virkeligheden dual-proces-konflikten. Den kørte fint ved retry. Supervisoren fik retry-én-gang-så-karantæne-logik alligevel.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Tavse hæng&lt;&#x2F;strong&gt; — en worker hang i en time på én fil (proces i live, ingen fremdrift). Modtræk: en watchdog der dræber inder-processen efter 20 min uden DB-aktivitet (DB-mtime som fremdriftssignal).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En ydre watchdog hvert 10. minut&lt;&#x2F;strong&gt; tjekker supervisoren, DB-fremdrift og webserver lokalt — og det hele på workeren over SSH — og genstarter automatisk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Falske “klar”-dage&lt;&#x2F;strong&gt; — en max-dato-heuristik erklærede en dag færdig, mens 93 af dens 104 filer stadig manglede. Modtræk: &lt;strong&gt;indbakken er ground truth&lt;&#x2F;strong&gt; — en dag&#x2F;uge er først klar, når &lt;em&gt;hver&lt;&#x2F;em&gt; fil har en afgjort DB-række. &lt;strong&gt;Ground truth slår heuristik; max-dato-gættet løj to gange, indbakke-optællingen aldrig.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Anonyme opkald&lt;&#x2F;strong&gt; — filer fra et hemmeligt nummer matchede ikke filnavnsmønsteret og blev usynlige for dag-gruppering. Parser udvidet, rækker repareret.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En dublet-bug&lt;&#x2F;strong&gt; — identisk lyd under nyt navn blev markeret &lt;code&gt;done&lt;&#x2F;code&gt; uden transskription (én hash delt af 103 tomme ring-ud-filer) og forurenede dag-dumps. Nu arver dubletter tvillingens status og indhold.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Høstede baggrundsprocesser&lt;&#x2F;strong&gt; — &lt;code&gt;nohup&lt;&#x2F;code&gt;-jobs blev høstet af miljøet og døde ubemærket i timevis. Modtræk: alt langkørende arbejde som harness-managede baggrundstasks, med watchdoggen som bagstopper.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;Selvheling skal være lagdelt:&lt;&#x2F;strong&gt; proces-niveau (supervisor: crash &#x2F; hæng &#x2F; poison &#x2F; orphan) &lt;em&gt;og&lt;&#x2F;em&gt; system-niveau (watchdog: supervisor død? web nede? worker væk?).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tallene-pr-skrivende-stund&quot;&gt;Tallene (pr. skrivende stund)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Korpus&lt;&#x2F;td&gt;&lt;td&gt;~33.000 mp3, ~570 audiotimer, 13 måneder&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Behandlet&lt;&#x2F;td&gt;&lt;td&gt;~6.100 filer (19%), fra begge ender&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Resuméer&lt;&#x2F;td&gt;&lt;td&gt;60 dags- + 7 ugeresuméer&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Lokal hastighed&lt;&#x2F;td&gt;&lt;td&gt;dual-model ~0,2 RTF; ~430 filer&#x2F;time&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Dag-agent-omkostning&lt;&#x2F;td&gt;&lt;td&gt;~50k–450k subagent-tokens&#x2F;dag (gns. ~200k)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Diarisering&lt;&#x2F;td&gt;&lt;td&gt;2-taler-prior + kontekst-reparation reddede de 79% af lange opkald, der kollapsede til én stemme&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;hvordan-det-kan-bruges-i-en-kundeservicefunktion&quot;&gt;Hvordan det kan bruges i en kundeservicefunktion&lt;&#x2F;h2&gt;
&lt;p&gt;Den oprindelige use case er personlig opkalds-intelligens, men præcis den samme pipeline er et &lt;strong&gt;kundeservice&lt;&#x2F;strong&gt;-system:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;To-spors-ASR + LLM-fusion&lt;&#x2F;strong&gt; → præcise danske transskriptioner af supportopkald.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Resuméer pr. opkald &#x2F; dag &#x2F; uge&lt;&#x2F;strong&gt; → QA uden at lytte til hvert opkald.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Løftetabellen&lt;&#x2F;strong&gt; generaliserer direkte til &lt;strong&gt;SLA-&#x2F;løfte-tracking&lt;&#x2F;strong&gt; — hvad en agent lovede en kunde, og om det blev leveret, ført videre uge for uge.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Det fælles navneregister&lt;&#x2F;strong&gt; → et konsistent kunde-&#x2F;kontaktkartotek bygget fra opkaldene selv.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mønster-visningen&lt;&#x2F;strong&gt; (volumen pr. time, retningsasymmetri, tilbagevendende emner) → bemandings- og eskaleringsindsigt, alt sammen fra metadata + resuméer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PII-disciplin&lt;&#x2F;strong&gt; er indbygget: “opfind aldrig, flag usikkerhed”-reglen og redigering før noget gemmes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Og privatlivshistorien er salgsargumentet: alt kører &lt;strong&gt;lokalt bag Tailscale&lt;&#x2F;strong&gt; — lyden forlader aldrig bygningen, du sætter opbevaring og redigering, og der er intet offentligt endpoint. (Den ærlige grænse: hvis dit sproglag er et cloud-LLM-API frem for et lokalt harness, forlader den tekst stedet — så redigér først, eller hold LLM’en lokal også.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lektionerne-destilleret&quot;&gt;Lektionerne, destilleret&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Analysér ligene først&lt;&#x2F;strong&gt; — ni døde eksperimenter rummede næsten alle de rigtige idéer. Syntese slår opfindelse.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Metadata er guld&lt;&#x2F;strong&gt; — filnavne alene gav taleridentitet, dagsstruktur og hele mønsteranalysen, før et sekund lyd var afkodet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;To middelmådige, forskellige ASR-spor + en model der fletter dem slår ét godt spor.&lt;&#x2F;strong&gt; Fejl-diversitet er pointen.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SOTA er opgaveafhængigt&lt;&#x2F;strong&gt; — neural denoise &lt;em&gt;skadede&lt;&#x2F;em&gt; ASR målbart; et 50 år gammelt båndpas hjalp.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Idempotens er friheden til at fejle&lt;&#x2F;strong&gt; — hash + status gjorde hvert crash, genstart og midt-i-kørslen-migrering harmløst.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Selvheling i lag&lt;&#x2F;strong&gt; — supervisor for processen, watchdog for systemet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ground truth frem for heuristik&lt;&#x2F;strong&gt; til fremdriftsgates — tæl indbakken, gæt ikke fra max-datoen.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En LLM kan være pipelinens dyre trin uden et API&lt;&#x2F;strong&gt; — når harnesset selv er modellen, er et “resumé-trin” en subagent med en god instruksfil, et fælles register og en ærlighedsnorm.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Nulstil en Yealink-telefon til fabriksindstillinger — også uden admin-adgangskoden (2026)</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/nulstil-yealink-telefon-til-fabriksindstillinger/"/>
        <id>https://www.x2q.net/da/post/nulstil-yealink-telefon-til-fabriksindstillinger/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/nulstil-yealink-telefon-til-fabriksindstillinger/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; For at fabriksnulstille en &lt;strong&gt;Yealink&lt;&#x2F;strong&gt; SIP-bordtelefon har du tre muligheder: &lt;strong&gt;tastaturmenuen&lt;&#x2F;strong&gt; (kræver admin-adgangskoden), &lt;strong&gt;web-UI’en&lt;&#x2F;strong&gt; (kræver admin-adgangskoden) eller et &lt;strong&gt;hardware-tastetryk&lt;&#x2F;strong&gt;, der slet &lt;strong&gt;ikke kræver adgangskode&lt;&#x2F;strong&gt; — hold &lt;strong&gt;OK&lt;&#x2F;strong&gt;-tasten i ~10 sekunder. Den sidste er den, du vil bruge til en brugt eller arvet telefon med ukendt admin-login. Dette dækker også standardadgangskode-situationen i 2026: gammel firmware er &lt;code&gt;admin&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;admin&lt;&#x2F;code&gt;, nyere enheder leveres med en &lt;strong&gt;unik adgangskode på en label&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;standardadgangskoden-dengang-nu&quot;&gt;Standardadgangskoden, dengang → nu&lt;&#x2F;h2&gt;
&lt;p&gt;Det her snubler folk over, så få det på plads først:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ældre firmware:&lt;&#x2F;strong&gt; brugernavn &lt;code&gt;admin&lt;&#x2F;code&gt;, adgangskode &lt;code&gt;admin&lt;&#x2F;code&gt;. Den klassiske standard.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Nyere firmware (sikkerhedshærdning, ~2021 og frem):&lt;&#x2F;strong&gt; Yealink leverer hver telefon med en &lt;strong&gt;unik tilfældig standardadgangskode&lt;&#x2F;strong&gt; trykt på et klistermærke (typisk på undersiden eller æsken), eller tvinger dig til at sætte en ny adgangskode ved første web-login. Så &lt;code&gt;admin&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;admin&lt;&#x2F;code&gt; &lt;strong&gt;virker ikke&lt;&#x2F;strong&gt; på nyere enheder.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Hvis du har adgangskoden, så nulstil fra menuen eller web-UI’en. Hvis du ikke har den, så spring til &lt;strong&gt;hardware-nulstillingen&lt;&#x2F;strong&gt; — den rydder adgangskoden helt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;metode-1-hardware-nulstilling-ingen-admin-adgangskode-nodvendig&quot;&gt;Metode 1 — Hardware-nulstilling (ingen admin-adgangskode nødvendig)&lt;&#x2F;h2&gt;
&lt;p&gt;Det er den, de fleste søger efter. Med telefonen &lt;strong&gt;tændt og i hviletilstand&lt;&#x2F;strong&gt; (ikke i et opkald, ikke i en menu):&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Tryk og &lt;strong&gt;hold OK-tasten&lt;&#x2F;strong&gt; — den runde&#x2F;midterste tast under skærmen — i cirka &lt;strong&gt;10 sekunder&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Skærmen viser &lt;strong&gt;“Nulstil til fabriksindstillinger?”&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Tryk &lt;strong&gt;OK&lt;&#x2F;strong&gt; for at bekræfte.&lt;&#x2F;li&gt;
&lt;li&gt;Telefonen sletter alt og genstarter. Det tager et minut eller to; afbryd den ikke.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Intet login nødvendigt — dette nulstiller admin-adgangskoden sammen med alt andet. (På enkelte modeller udløses prompten ved at holde &lt;strong&gt;X&lt;&#x2F;strong&gt;-&#x2F;annuller-tasten i stedet; hvis OK ikke gør det, så prøv den.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;metode-2-fra-telefonens-tastatur-kraever-admin-adgangskode&quot;&gt;Metode 2 — Fra telefonens tastatur (kræver admin-adgangskode)&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Tryk på &lt;strong&gt;Menu&lt;&#x2F;strong&gt;-softtasten.&lt;&#x2F;li&gt;
&lt;li&gt;Gå til &lt;strong&gt;Indstillinger → Avancerede indstillinger&lt;&#x2F;strong&gt;, og indtast admin-adgangskoden (&lt;code&gt;admin&lt;&#x2F;code&gt; på gammel firmware, eller label-adgangskoden).&lt;&#x2F;li&gt;
&lt;li&gt;Vælg &lt;strong&gt;Nulstil til fabriksindstillinger&lt;&#x2F;strong&gt; (nogle gange &lt;strong&gt;Reset Config&lt;&#x2F;strong&gt;), og bekræft.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;metode-3-fra-webgraensefladen-kraever-admin-adgangskode&quot;&gt;Metode 3 — Fra webgrænsefladen (kræver admin-adgangskode)&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Find telefonens IP: &lt;strong&gt;Menu → Status&lt;&#x2F;strong&gt; (eller &lt;strong&gt;Indstillinger → Status&lt;&#x2F;strong&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Gå til &lt;code&gt;http:&#x2F;&#x2F;&amp;lt;telefon-ip&amp;gt;&#x2F;&lt;&#x2F;code&gt;, og log ind som &lt;code&gt;admin&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Gå til &lt;strong&gt;Settings → Upgrade&lt;&#x2F;strong&gt; (eller &lt;strong&gt;Reset &amp;amp; Reboot&lt;&#x2F;strong&gt;), og klik &lt;strong&gt;Reset to Factory&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;efter-nulstillingen&quot;&gt;Efter nulstillingen&lt;&#x2F;h2&gt;
&lt;p&gt;En fuld nulstilling sletter &lt;strong&gt;SIP-kontoen, netværkskonfigurationen, kontakter og opkaldshistorik&lt;&#x2F;strong&gt; — telefonen kommer tilbage som ny. Før du nulstiller (hvis du kan logge ind), så notér dine &lt;strong&gt;SIP-oplysninger&lt;&#x2F;strong&gt; (server&#x2F;registrar, brugernavn, auth-ID, adgangskode), så du kan genregistrere den bagefter. På nyere firmware bliver du bedt om at sætte en frisk admin-adgangskode ved første login igen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opsummering&quot;&gt;Opsummering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ingen admin-adgangskode?&lt;&#x2F;strong&gt; Hold &lt;strong&gt;OK&lt;&#x2F;strong&gt;-tasten ~10 s i hviletilstand → bekræft → færdig. Intet login nødvendigt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Har adgangskoden?&lt;&#x2F;strong&gt; Nulstil fra &lt;strong&gt;Menu → Indstillinger → Avanceret&lt;&#x2F;strong&gt;, eller &lt;strong&gt;web-UI’en&lt;&#x2F;strong&gt; på &lt;code&gt;http:&#x2F;&#x2F;&amp;lt;telefon-ip&amp;gt;&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Standardadgangskode:&lt;&#x2F;strong&gt; &lt;code&gt;admin&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;admin&lt;&#x2F;code&gt; på gammel firmware; en &lt;strong&gt;unik label-adgangskode&lt;&#x2F;strong&gt; på nyere enheder.&lt;&#x2F;li&gt;
&lt;li&gt;En fabriksnulstilling &lt;strong&gt;sletter SIP-kontoen og kontakter&lt;&#x2F;strong&gt; — gem dine SIP-oplysninger først.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Opdater Garmin-firmware og -kort i 2026 — fra WebUpdater til Garmin Express</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/opdater-garmin-firmware-og-kort/"/>
        <id>https://www.x2q.net/da/post/opdater-garmin-firmware-og-kort/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/opdater-garmin-firmware-og-kort/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; Hvis du søgte efter &lt;em&gt;Garmin WebUpdater&lt;&#x2F;em&gt; eller &lt;em&gt;hvordan opdaterer jeg Garmin-firmware&lt;&#x2F;em&gt;, er værktøjet, du husker, væk. &lt;strong&gt;WebUpdater blev nedlagt (~2015)&lt;&#x2F;strong&gt;; den nuværende vej er &lt;strong&gt;Garmin Express&lt;&#x2F;strong&gt; (et skrivebordsprogram, USB-kabel) til nüvi&#x2F;DriveSmart-navigatorer, eller &lt;strong&gt;Garmin Connect&lt;&#x2F;strong&gt; (telefon, trådløst) til ure og nyere håndholdte. Dette indlæg dækker 2026-måden at opdatere &lt;strong&gt;firmware og kort&lt;&#x2F;strong&gt; på hver, hvad du gør med en gammel nüvi, og den skjulte &lt;strong&gt;nüvi-debugmenu&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dengang-nu-webupdater-er-dod&quot;&gt;Dengang → nu: WebUpdater er død&lt;&#x2F;h2&gt;
&lt;p&gt;I årevis opdaterede du en Garmin med &lt;strong&gt;WebUpdater&lt;&#x2F;strong&gt; — en lille skrivebordshjælper, der tjekkede for firmware. Garmin pensionerede den og samlede alt i to apps:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Garmin Express&lt;&#x2F;strong&gt; — skrivebord (Windows&#x2F;macOS), forbinder via &lt;strong&gt;USB-kabel&lt;&#x2F;strong&gt;. Det er det, der erstattede WebUpdater til navigatorer (nüvi, DriveSmart, Drive) og er også kabelvejen til ure&#x2F;håndholdte og &lt;strong&gt;kort&lt;&#x2F;strong&gt;opdateringer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Garmin Connect&lt;&#x2F;strong&gt; — telefon-app (iOS&#x2F;Android), opdaterer &lt;strong&gt;trådløst&lt;&#x2F;strong&gt; over Bluetooth&#x2F;Wi-Fi. Det er vejen til ure (Forerunner, fēnix, Venu), cykelcomputere (Edge) og moderne håndholdte.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Hvis du stadig har WebUpdater installeret, så afinstallér det — det gør ikke længere noget nyttigt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opdater-en-nuvi-drivesmart-navigator-firmware-kort&quot;&gt;Opdater en nüvi &#x2F; DriveSmart-navigator (firmware + kort)&lt;&#x2F;h2&gt;
&lt;p&gt;Det er tilfældet bag de fleste “opdater Garmin-firmware”-søgninger.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Hent &lt;strong&gt;Garmin Express&lt;&#x2F;strong&gt; fra &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.garmin.com&#x2F;da-DK&#x2F;software&#x2F;express&#x2F;&quot;&gt;garmin.com&#x2F;express&lt;&#x2F;a&gt; og installér det på en Windows- eller Mac-computer.&lt;&#x2F;li&gt;
&lt;li&gt;Tilslut enheden med et &lt;strong&gt;USB-kabel&lt;&#x2F;strong&gt; og tænd den. Vent på, at computeren genkender den som et drev.&lt;&#x2F;li&gt;
&lt;li&gt;Åbn Garmin Express. Den finder enheden og viser tilgængelige &lt;strong&gt;software- (firmware)&lt;&#x2F;strong&gt; og &lt;strong&gt;kort&lt;&#x2F;strong&gt;opdateringer.&lt;&#x2F;li&gt;
&lt;li&gt;Klik &lt;strong&gt;Installér alle&lt;&#x2F;strong&gt;, eller vælg enkelte opdateringer. Kortfiler er store (ofte flere GB) — lad den være tilsluttet, og afbryd ikke midt i.&lt;&#x2F;li&gt;
&lt;li&gt;Når den er færdig, så skub sikkert ud og frakobl. Enheden genstarter med den nye firmware.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;Kortopdateringer&lt;&#x2F;strong&gt; vises også her. Hvis din enhed har &lt;strong&gt;lifetime maps&lt;&#x2F;strong&gt; (“LM”&#x2F;“LMT” i modelnavnet), er opdateringer gratis i enhedens understøttede levetid. Ellers tilbyder Express et betalt kortkøb.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opdater-et-ur-edge-nyere-handholdt-tradlost&quot;&gt;Opdater et ur &#x2F; Edge &#x2F; nyere håndholdt (trådløst)&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Installér &lt;strong&gt;Garmin Connect&lt;&#x2F;strong&gt; på din telefon, og parr enheden.&lt;&#x2F;li&gt;
&lt;li&gt;Connect henter opdateringer automatisk; du får en besked, når firmware er klar.&lt;&#x2F;li&gt;
&lt;li&gt;Hold enheden opladt og nær telefonen — den installerer og genstarter af sig selv.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;For en kabelopdatering af disse enheder (eller hvis trådløst fejler) virker Garmin Express på en computer også.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;meget-gamle-nuvi-enheder-hvad-der-stadig-virker&quot;&gt;Meget gamle nüvi-enheder — hvad der stadig virker&lt;&#x2F;h2&gt;
&lt;p&gt;Mange tidlige nüvi-modeller (2007–2012-æraen) er nu &lt;strong&gt;udgået&lt;&#x2F;strong&gt;: firmware kan måske stadig installeres via Garmin Express, men &lt;strong&gt;kortopdateringer tilbydes ikke længere&lt;&#x2F;strong&gt;, og lifetime-maps-dækningen er ophørt. Hvis Express viser “opdateret” med et gammelt kortår, er det som regel vejs ende — hardwaren understøttes simpelthen ikke med nye kortdata mere. Enheden virker fortsat med de kort, den har.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bonus-den-skjulte-nuvi-debugmenu&quot;&gt;Bonus: den skjulte nüvi-debugmenu&lt;&#x2F;h2&gt;
&lt;p&gt;Et gammelt trick til at diagnosticere en ustabil nüvi: tænd den, og &lt;strong&gt;tryk og hold nederste højre hjørne af berøringsskærmen&lt;&#x2F;strong&gt; i nogle sekunder. En &lt;strong&gt;diagnoseskærm&lt;&#x2F;strong&gt; dukker op — softwareversion, kalibreringstest af berøringsskærm, GPS-signaltest, batteriinfo. Det er sikkert at se på; undgå at ændre berøringsskærmskalibrering, medmindre skærmen reelt er skæv.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opsummering&quot;&gt;Opsummering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebUpdater er nedlagt&lt;&#x2F;strong&gt; — brug &lt;strong&gt;Garmin Express&lt;&#x2F;strong&gt; (skrivebord, USB) eller &lt;strong&gt;Garmin Connect&lt;&#x2F;strong&gt; (telefon, trådløst).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;nüvi &#x2F; DriveSmart&lt;&#x2F;strong&gt;: Garmin Express over USB klarer både firmware og kort; “Installér alle”.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ure &#x2F; Edge &#x2F; håndholdte&lt;&#x2F;strong&gt;: Garmin Connect opdaterer trådløst.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lifetime maps&lt;&#x2F;strong&gt; (LM&#x2F;LMT-modeller) opdaterer gratis; meget gamle nüvi-enheder er udgået for nye kortdata.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;nüvi-debugmenu&lt;&#x2F;strong&gt;: hold nederste højre hjørne af skærmen efter opstart.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Whisper-backend-dyst: faster-whisper vs HF Transformers vs whisper.cpp (2026)</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/whisper-backend-sammenligning/"/>
        <id>https://www.x2q.net/da/post/whisper-backend-sammenligning/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/whisper-backend-sammenligning/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; På et RTX 4070 Ti med telefoni-optimeret lydforbehandling når &lt;strong&gt;&lt;code&gt;faster-whisper&lt;&#x2F;code&gt; med &lt;code&gt;large-v3-turbo&lt;&#x2F;code&gt; ~56× realtid&lt;&#x2F;strong&gt; — hurtigst samlet. &lt;strong&gt;&lt;code&gt;whisper.cpp&lt;&#x2F;code&gt; CUDA er tæt på (~40×)&lt;&#x2F;strong&gt; ved en brøkdel af VRAM’en. &lt;strong&gt;Batched HF Transformers&lt;&#x2F;strong&gt; (SDPA, batch 24) er konkurrencedygtig på turbo-modellen. På CPU matcher &lt;code&gt;whisper.cpp&lt;&#x2F;code&gt; overraskende GPU-hastigheder for korte filer; &lt;code&gt;faster-whisper&lt;&#x2F;code&gt; int8 er stadig praktisk ved ~5×.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;En del af &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;dansk-voicelog-transkribering&#x2F;&quot;&gt;det danske voicelog-projekt&lt;&#x2F;a&gt; — dette er backend-benchmarken bag pipelinens ASR-valg. Se også &lt;a href=&quot;&#x2F;post&#x2F;local-speech-to-text-whisper-cpp&#x2F;&quot;&gt;at køre Whisper lokalt&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;opsaetning&quot;&gt;Opsætning&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPU&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;NVIDIA GeForce RTX 4070 Ti (12 GB VRAM)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CPU&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Intel Core i5-13400F (16 tråde)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RAM&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;125 GB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CUDA&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;12.9 &#x2F; Driver 595&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;faster-whisper&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;1.2.1 (CTranslate2 4.8.0)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;transformers&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;5.10.2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;whisper.cpp&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;kompileret fra kilde, CUDA aktiveret&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;PyTorch&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;2.12.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;lyd-testsaet&quot;&gt;Lyd-testsæt&lt;&#x2F;h2&gt;
&lt;p&gt;Tre rigtige danske telefonopkald fra et dansk voicelog-korpus (filnavne anonymiseret til &lt;code&gt;Fil 1–3&lt;&#x2F;code&gt;):&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Fil&lt;&#x2F;th&gt;&lt;th&gt;Varighed&lt;&#x2F;th&gt;&lt;th&gt;Noter&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Fil 1&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;1m 26s&lt;&#x2F;td&gt;&lt;td&gt;Autentisk dansk samtaletale&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Fil 2&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;13m 26s&lt;&#x2F;td&gt;&lt;td&gt;Autentisk dansk samtaletale&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Fil 3&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;1m 51s&lt;&#x2F;td&gt;&lt;td&gt;Autentisk dansk samtaletale&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;blockquote&gt;
&lt;p&gt;Der findes ingen referencetransskriptioner — kvalitet vurderes via &lt;strong&gt;konsensus-WER&lt;&#x2F;strong&gt; (parvis enighed på tværs af modeller) og &lt;strong&gt;relativ WER&lt;&#x2F;strong&gt; (afstand til konsensus-vinderen).&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;backends-i-test&quot;&gt;Backends i test&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Backend&lt;&#x2F;th&gt;&lt;th&gt;Engine&lt;&#x2F;th&gt;&lt;th&gt;Nøgleteknik&lt;&#x2F;th&gt;&lt;th&gt;Modeller&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;faster-whisper&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;CTranslate2&lt;&#x2F;td&gt;&lt;td&gt;int8&#x2F;float16-kvantiserede kerner&lt;&#x2F;td&gt;&lt;td&gt;large-v3, large-v3-turbo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;HF Transformers (batched)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;PyTorch (SDPA)&lt;&#x2F;td&gt;&lt;td&gt;batch_size=24, flash-attention via SDPA&lt;&#x2F;td&gt;&lt;td&gt;large-v3, large-v3-turbo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;whisper.cpp&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;ggml&lt;&#x2F;td&gt;&lt;td&gt;CUDA-kerne-offload &#x2F; AVX CPU&lt;&#x2F;td&gt;&lt;td&gt;large-v3, large-v3-turbo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;resultater-hastighed-rtf-lavere-er-bedre&quot;&gt;Resultater: hastighed (RTF — lavere er bedre)&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;RTF = transskriptionstid ÷ lydvarighed. RTF 0,03 = 33× realtid.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Backend &#x2F; Model &#x2F; Enhed&lt;&#x2F;th&gt;&lt;th&gt;Fil 1&lt;&#x2F;th&gt;&lt;th&gt;Fil 2&lt;&#x2F;th&gt;&lt;th&gt;Fil 3&lt;&#x2F;th&gt;&lt;th&gt;&lt;strong&gt;Gns. RTF&lt;&#x2F;strong&gt;&lt;&#x2F;th&gt;&lt;th&gt;&lt;strong&gt;Fart&lt;&#x2F;strong&gt;&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;faster-whisper &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.021&lt;&#x2F;td&gt;&lt;td&gt;0.013&lt;&#x2F;td&gt;&lt;td&gt;0.019&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.018&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;56×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;faster-whisper &#x2F; large-v3 &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.047&lt;&#x2F;td&gt;&lt;td&gt;0.033&lt;&#x2F;td&gt;&lt;td&gt;0.051&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.043&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;23×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HF Transformers (b24, SDPA) &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.040&lt;&#x2F;td&gt;&lt;td&gt;0.062&lt;&#x2F;td&gt;&lt;td&gt;0.036&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.046&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;22×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HF Transformers (b2, SDPA) &#x2F; large-v3 &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.180&lt;&#x2F;td&gt;&lt;td&gt;0.142&lt;&#x2F;td&gt;&lt;td&gt;0.222&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.181&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;6×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper.cpp &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.028&lt;&#x2F;td&gt;&lt;td&gt;0.017&lt;&#x2F;td&gt;&lt;td&gt;0.030&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.025&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;40×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper.cpp &#x2F; large-v3 &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.070&lt;&#x2F;td&gt;&lt;td&gt;0.050&lt;&#x2F;td&gt;&lt;td&gt;0.080&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.067&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;15×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;faster-whisper &#x2F; large-v3-turbo &#x2F; CPU&lt;&#x2F;td&gt;&lt;td&gt;0.208&lt;&#x2F;td&gt;&lt;td&gt;0.151&lt;&#x2F;td&gt;&lt;td&gt;0.248&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.203&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;5×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;faster-whisper &#x2F; large-v3 &#x2F; CPU&lt;&#x2F;td&gt;&lt;td&gt;0.470&lt;&#x2F;td&gt;&lt;td&gt;0.354&lt;&#x2F;td&gt;&lt;td&gt;0.714&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.513&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;2×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper.cpp &#x2F; large-v3-turbo &#x2F; CPU&lt;&#x2F;td&gt;&lt;td&gt;0.034&lt;&#x2F;td&gt;&lt;td&gt;0.017&lt;&#x2F;td&gt;&lt;td&gt;0.027&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.026&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;39×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper.cpp &#x2F; large-v3 &#x2F; CPU&lt;&#x2F;td&gt;&lt;td&gt;0.071&lt;&#x2F;td&gt;&lt;td&gt;0.050&lt;&#x2F;td&gt;&lt;td&gt;0.084&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.068&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;15×&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;resultater-vram-forbrug-gpu-korsler&quot;&gt;Resultater: VRAM-forbrug (GPU-kørsler)&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Backend &#x2F; Model&lt;&#x2F;th&gt;&lt;th&gt;Gns. VRAM (MB)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;HF Transformers (b24, SDPA) &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;3884&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HF Transformers (b2, SDPA) &#x2F; large-v3 &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;5727&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;resultater-kvalitet-konsensus-wer&quot;&gt;Resultater: kvalitet (konsensus-WER)&lt;&#x2F;h2&gt;
&lt;p&gt;Konsensus-WER måler, hvor meget hver models output afviger fra gruppegennemsnittet. Lavere = mere lig det, alle modeller er enige om.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Backend &#x2F; Model &#x2F; Enhed&lt;&#x2F;th&gt;&lt;th&gt;Fil 1&lt;&#x2F;th&gt;&lt;th&gt;Fil 2&lt;&#x2F;th&gt;&lt;th&gt;Fil 3&lt;&#x2F;th&gt;&lt;th&gt;Gns. relativ WER&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;faster-whisper &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.132&lt;&#x2F;td&gt;&lt;td&gt;0.359&lt;&#x2F;td&gt;&lt;td&gt;0.226&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.239&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;faster-whisper &#x2F; large-v3 &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.230&lt;&#x2F;td&gt;&lt;td&gt;0.334&lt;&#x2F;td&gt;&lt;td&gt;0.294&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.286&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HF Transformers (b24, SDPA) &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.237&lt;&#x2F;td&gt;&lt;td&gt;0.601&lt;&#x2F;td&gt;&lt;td&gt;0.229&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.356&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HF Transformers (b2, SDPA) &#x2F; large-v3 &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.152&lt;&#x2F;td&gt;&lt;td&gt;0.225&lt;&#x2F;td&gt;&lt;td&gt;0.326&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.234&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper.cpp &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.000&lt;&#x2F;td&gt;&lt;td&gt;0.673&lt;&#x2F;td&gt;&lt;td&gt;0.000&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.224&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper.cpp &#x2F; large-v3 &#x2F; CUDA&lt;&#x2F;td&gt;&lt;td&gt;0.187&lt;&#x2F;td&gt;&lt;td&gt;0.000&lt;&#x2F;td&gt;&lt;td&gt;0.553&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.247&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;faster-whisper &#x2F; large-v3-turbo &#x2F; CPU&lt;&#x2F;td&gt;&lt;td&gt;0.136&lt;&#x2F;td&gt;&lt;td&gt;0.344&lt;&#x2F;td&gt;&lt;td&gt;0.191&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.224&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;faster-whisper &#x2F; large-v3 &#x2F; CPU&lt;&#x2F;td&gt;&lt;td&gt;0.249&lt;&#x2F;td&gt;&lt;td&gt;0.339&lt;&#x2F;td&gt;&lt;td&gt;0.274&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.287&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper.cpp &#x2F; large-v3-turbo &#x2F; CPU&lt;&#x2F;td&gt;&lt;td&gt;0.000&lt;&#x2F;td&gt;&lt;td&gt;0.673&lt;&#x2F;td&gt;&lt;td&gt;0.000&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.224&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;whisper.cpp &#x2F; large-v3 &#x2F; CPU&lt;&#x2F;td&gt;&lt;td&gt;0.187&lt;&#x2F;td&gt;&lt;td&gt;0.000&lt;&#x2F;td&gt;&lt;td&gt;0.553&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.247&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Kvalitetsvinder:&lt;&#x2F;strong&gt; &lt;code&gt;faster-whisper &#x2F; large-v3-turbo &#x2F; CPU&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;side-om-side-hvor-backendsne-adskilte-sig&quot;&gt;Side om side: hvor backendsne adskilte sig&lt;&#x2F;h2&gt;
&lt;p&gt;Test-lyden er et privat opkald, så i stedet for at gengive det er her en neutral dansk sætning, der står som stedfortræder for den slags samtaletale, der blev testet — plus de afvigelsesmønstre, der faktisk dukkede op på tværs af backends på 86-sekunders-filen:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Lad os tage mødet på torsdag, så gennemgår vi tallene sammen.”&lt;&#x2F;em&gt; (illustrativ)&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tabte indledninger.&lt;&#x2F;strong&gt; &lt;code&gt;faster-whisper&lt;&#x2F;code&gt; large-v3 (CUDA og CPU) startede nogle gange et par ord inde og udelod en indledende sætning, som turbo-modellerne og &lt;code&gt;whisper.cpp&lt;&#x2F;code&gt; fangede.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Uenighed om egennavne.&lt;&#x2F;strong&gt; Det indledende navn blev transskriberet på to forskellige måder på tværs af backends — det klassiske problem med navne i et sprog med få ressourcer, hvor hver model gætter en anden plausibel stavemåde.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Forvanskede navneord på støjende segmenter.&lt;&#x2F;strong&gt; &lt;code&gt;whisper.cpp&lt;&#x2F;code&gt; large-v3 lavede et klart navneord om til en næsten-homofon, som turbo-modellerne fik rigtigt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sjældne hallucinerede fragmenter.&lt;&#x2F;strong&gt; &lt;code&gt;faster-whisper&lt;&#x2F;code&gt; large-v3 udsendte lejlighedsvis en kort nonsens-frase på en støjende strækning, hvor de andre backends holdt sig rene.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mindre stavefejl.&lt;&#x2F;strong&gt; Turbo-CPU-kørslen producerede en og anden vokal-tastefejl, der ikke sås på GPU.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Netto: &lt;strong&gt;turbo-modellerne var mest konsekvent kohærente&lt;&#x2F;strong&gt;; fuld large-v3 var stærk, men mere tilbøjelig til tabte indledninger og en og anden hallucination på denne støjende telefonlyd.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;noglefund&quot;&gt;Nøglefund&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hurtigste GPU:&lt;&#x2F;strong&gt; &lt;code&gt;faster-whisper &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;code&gt; ved gns. RTF 0,018 (56× realtid).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Turbo-speedup (faster-whisper GPU):&lt;&#x2F;strong&gt; large-v3-turbo er 2,4× hurtigere end large-v3.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hurtigste CPU:&lt;&#x2F;strong&gt; &lt;code&gt;whisper.cpp &#x2F; large-v3-turbo &#x2F; CPU&lt;&#x2F;code&gt; ved gns. RTF 0,026.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GPU vs. CPU (faster-whisper turbo):&lt;&#x2F;strong&gt; GPU er 11,4× hurtigere end CPU int8.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lavest VRAM:&lt;&#x2F;strong&gt; &lt;code&gt;HF Transformers (b24, SDPA) &#x2F; large-v3-turbo &#x2F; CUDA&lt;&#x2F;code&gt; ved 3884 MB.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;anbefalinger&quot;&gt;Anbefalinger&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Use case&lt;&#x2F;th&gt;&lt;th&gt;Anbefaling&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Produktions-pipeline (GPU-server)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;faster-whisper&lt;&#x2F;code&gt; + &lt;code&gt;large-v3-turbo&lt;&#x2F;code&gt; + &lt;code&gt;float16&lt;&#x2F;code&gt; — bedste hastighed&#x2F;kvalitet&#x2F;VRAM&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Højeste præcision (GPU, ingen hastighedsbinding)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;faster-whisper&lt;&#x2F;code&gt; + &lt;code&gt;large-v3&lt;&#x2F;code&gt; + &lt;code&gt;float16&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Batched offline-behandling&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;HF Transformers batched (SDPA) + &lt;code&gt;large-v3-turbo&lt;&#x2F;code&gt;, batch_size=24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Embedded &#x2F; ingen Python-runtime&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;whisper.cpp&lt;&#x2F;code&gt; CUDA — én binær, lavt overhead&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CPU-only-server&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;faster-whisper&lt;&#x2F;code&gt; + &lt;code&gt;large-v3-turbo&lt;&#x2F;code&gt; + &lt;code&gt;int8&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Edge &#x2F; Raspberry Pi&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;whisper.cpp&lt;&#x2F;code&gt; CPU + &lt;code&gt;large-v3-turbo&lt;&#x2F;code&gt; (mindste RAM-fodaftryk)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;metodenoter&quot;&gt;Metodenoter&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Hver backend&#x2F;model&#x2F;enhed-kombination kører som en &lt;strong&gt;separat proces&lt;&#x2F;strong&gt; for at garantere fuld GPU-hukommelses-frigivelse mellem kørsler.&lt;&#x2F;li&gt;
&lt;li&gt;faster-whisper GPU bruger &lt;code&gt;compute_type=float16&lt;&#x2F;code&gt;; CPU bruger &lt;code&gt;int8&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;HF Transformers bruger &lt;code&gt;attn_implementation=sdpa&lt;&#x2F;code&gt; (PyTorch SDPA &#x2F; FlashAttention-ækvivalent, ingen ekstra installation).&lt;&#x2F;li&gt;
&lt;li&gt;whisper.cpp bruger CUDA automatisk, når den er kompileret med &lt;code&gt;GGML_CUDA=ON&lt;&#x2F;code&gt; — intet flag nødvendigt; CPU-kørsler bruger &lt;code&gt;-t 8&lt;&#x2F;code&gt; (systemets trådantal).&lt;&#x2F;li&gt;
&lt;li&gt;Al lyd forbehandles med ffmpeg før transskribering: &lt;code&gt;highpass=f=200,lowpass=f=3400,afftdn=nr=10:nf=-25,dynaudnorm&lt;&#x2F;code&gt; (telefon-båndpas + let denoise + loudness-normalisering).&lt;&#x2F;li&gt;
&lt;li&gt;VRAM måles via &lt;code&gt;torch.cuda.max_memory_allocated()&lt;&#x2F;code&gt;; ikke tilgængeligt for whisper.cpp-subprocess-kørsler.&lt;&#x2F;li&gt;
&lt;li&gt;Al lyd er dansk samtale-telefontale — resultater kan variere på andre sprog eller lydforhold.&lt;&#x2F;li&gt;
&lt;li&gt;Konsensus-WER beregnes parvist på tværs af alle modeller; modellen med lavest gennemsnitlig parvis WER er “konsensus-vinderen”.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Fra Launchy til Raycast: tastaturstarterens historie (2007 → 2026)</title>
        <published>2026-06-07T00:00:00+00:00</published>
        <updated>2026-06-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/historien-om-applikationsstartere-launchy-til-raycast/"/>
        <id>https://www.x2q.net/da/post/historien-om-applikationsstartere-launchy-til-raycast/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/historien-om-applikationsstartere-launchy-til-raycast/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; I 2007 lagde jeg en kort screencast op af &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;LBW1L2YOKks&quot;&gt;Launchy&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; — en “tastaturstyret applikationsstarter”, der lod dig fremkalde ethvert program på Windows ved at trykke en genvejstast og skrive nogle få bogstaver, i stedet for at lede i Start-menuen. Det mønster — &lt;strong&gt;genvejstast → skriv → fuzzy-match → start&lt;&#x2F;strong&gt; — blev født på Mac’en (Quicksilver, LaunchBar), kom til Windows med Launchy, spredte sig til Linux og gjorde så to ting på én gang: den modnedes til fulde produktivitetsplatforme (&lt;strong&gt;Alfred&lt;&#x2F;strong&gt;, så &lt;strong&gt;Raycast&lt;&#x2F;strong&gt;), og den opløste sig i &lt;strong&gt;Cmd+K-kommandopaletten&lt;&#x2F;strong&gt;, der nu bor inde i næsten alle apps, du bruger. Her er buen over 19 år.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;En pendant til de andre tidskapsel-indlæg her — som &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;linux-gui-apps-paa-windows-xming-til-wslg&#x2F;&quot;&gt;Xming på Windows XP → WSLg&lt;&#x2F;a&gt; og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;hack-traadloest-netvaerk&#x2F;&quot;&gt;25 års Wi-Fi-sikkerhed&lt;&#x2F;a&gt;. En gammel screencast, og hvad idéen voksede til.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;opsaetningen-dengang&quot;&gt;Opsætningen, dengang&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;LBW1L2YOKks&quot;&gt;Videoen&lt;&#x2F;a&gt; (“Shiny Windows Application Launcher” — &lt;em&gt;Shiny&lt;&#x2F;em&gt; var et Launchy-skin) viser arbejdsgangen fra 2007. Du installerer &lt;strong&gt;Launchy&lt;&#x2F;strong&gt;, den indekserer din Start-menu, og fra da af:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Tryk &lt;strong&gt;Alt+Space&lt;&#x2F;strong&gt;. En lille gennemsigtig boks dukker op midt på skærmen.&lt;&#x2F;li&gt;
&lt;li&gt;Skriv nogle få bogstaver — &lt;code&gt;fir&lt;&#x2F;code&gt; for Firefox, &lt;code&gt;wor&lt;&#x2F;code&gt; for Word.&lt;&#x2F;li&gt;
&lt;li&gt;Launchy fuzzy-matcher mod alt, den har indekseret, og viser det bedste hit.&lt;&#x2F;li&gt;
&lt;li&gt;Tryk &lt;strong&gt;Enter&lt;&#x2F;strong&gt;. Appen starter. Boksen forsvinder.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Ingen mus, ingen Start-menu, ingen skrivebordsikoner. Efter en uge kendte dine fingre tre-bogstavs-præfikset for hver app, du brugte. Launchy — skrevet af Josh Karlin og open-sourcet — blev udtrykkeligt markedsført som &lt;strong&gt;“Quicksilver til Windows”&lt;&#x2F;strong&gt;, og den sammenligning er nøglen til hele historien.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvor-ideen-faktisk-kom-fra&quot;&gt;Hvor idéen faktisk kom fra&lt;&#x2F;h2&gt;
&lt;p&gt;Launchy opfandt ikke tastaturstarteren — den bragte en &lt;strong&gt;Mac&lt;&#x2F;strong&gt;-idé til Windows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LaunchBar&lt;&#x2F;strong&gt; (Objective Development) — bedstefaderen, med rødder på &lt;strong&gt;NeXTSTEP i 1990’erne&lt;&#x2F;strong&gt;, genfødt på Mac OS X. Skriv en forkortelse, få tingen.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Quicksilver&lt;&#x2F;strong&gt; (Nicholas Jitkoff &#x2F; Blacktree, ~2003) — den legendariske, nærmest mystiske Mac-starter. Ikke bare “start en app”, men en verbum-navneord-grammatik: vælg en &lt;em&gt;ting&lt;&#x2F;em&gt;, vælg en &lt;em&gt;handling&lt;&#x2F;em&gt;, vælg et &lt;em&gt;mål&lt;&#x2F;em&gt;. Den definerede genren og inspirerede en hel generation (den blev open-sourcet i 2007, da skaberen tog til Google).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Spotlight&lt;&#x2F;strong&gt; (Mac OS X Tiger, 2005) — Apple bagte søgning ind i styresystemet, hvilket er der, de fleste almindelige brugere mødte “skriv bare for at finde ting”-idéen.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Launchy (2004→) var Windows-svaret på alt det, og videoen fra 2007 er et øjebliksbillede af den på toppen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;et-hurtigt-overblik-19-ar-med-startere&quot;&gt;Et hurtigt overblik — 19 år med startere&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Æra&lt;&#x2F;th&gt;&lt;th&gt;macOS&lt;&#x2F;th&gt;&lt;th&gt;Windows&lt;&#x2F;th&gt;&lt;th&gt;Linux&lt;&#x2F;th&gt;&lt;th&gt;Mønsteret&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;~2003–05&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Quicksilver, LaunchBar, Spotlight&lt;&#x2F;td&gt;&lt;td&gt;Start-menu (Vista får søgning, 2007)&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;Starteren er en Mac-power-user-ting&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;2007 (videoen)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Quicksilver på toppen&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Launchy&lt;&#x2F;strong&gt; (“Quicksilver til Windows”)&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;Tastaturstarteren krydser til Windows&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;~2008–10&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Quicksilver stagnerer → &lt;strong&gt;Alfred&lt;&#x2F;strong&gt; (2010)&lt;&#x2F;td&gt;&lt;td&gt;Launchy topper, så sløver&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;GNOME Do&lt;&#x2F;strong&gt;, Katapult&lt;&#x2F;td&gt;&lt;td&gt;Starteren bliver mainstream-power-user&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;~2011–15&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Alfred + Powerpack dominerer&lt;&#x2F;td&gt;&lt;td&gt;Wox (2014)&lt;&#x2F;td&gt;&lt;td&gt;Synapse, Albert&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Kommandopaletten&lt;&#x2F;strong&gt; dukker op (Sublime, så VS Code)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;~2016–20&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Raycast&lt;&#x2F;strong&gt; grundlægges (2020)&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;PowerToys Run&lt;&#x2F;strong&gt; (2020), Flow Launcher&lt;&#x2F;td&gt;&lt;td&gt;Rofi, Ulauncher&lt;&#x2F;td&gt;&lt;td&gt;Cmd+K spreder sig til hver web-app&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;2026 (i dag)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Raycast dominerer; Spotlight + Apple Intelligence&lt;&#x2F;td&gt;&lt;td&gt;PowerToys &lt;strong&gt;Command Palette&lt;&#x2F;strong&gt;; Raycast (beta)&lt;&#x2F;td&gt;&lt;td&gt;Rofi &#x2F; Ulauncher &#x2F; Albert&lt;&#x2F;td&gt;&lt;td&gt;Starteren = AI-drevet kommando-hub&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;hvad-der-aendrede-sig&quot;&gt;Hvad der ændrede sig&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;1. Starteren blev en platform.&lt;&#x2F;strong&gt; Launchy startede apps og filer. &lt;strong&gt;Alfred&lt;&#x2F;strong&gt; (2010) tilføjede &lt;em&gt;workflows&lt;&#x2F;em&gt; — kæd handlinger sammen, kør scripts, udklipshistorik, snippets — og blev Mac-standarden i et årti. Så genopbyggede &lt;strong&gt;Raycast&lt;&#x2F;strong&gt; (2020) idéen som en native, udvidelig platform: en udvidelsesbutik, vinduesstyring, udklipshistorik, snippets, lommeregnere og nu indbygget &lt;strong&gt;AI&lt;&#x2F;strong&gt;. Den ydmyge start-boks blev til stedet, hvor power-brugere kører halvdelen af deres dag. Raycasts &lt;strong&gt;Windows-beta kom sidst i 2025&lt;&#x2F;strong&gt; og lukkede ringen tilbage til der, hvor Launchy startede.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. Windows blev ved med at genopfinde den.&lt;&#x2F;strong&gt; Launchy ebbede ud efter ~2010. &lt;strong&gt;Wox&lt;&#x2F;strong&gt; (open source, 2014) bar faklen videre og affødte &lt;strong&gt;Flow Launcher&lt;&#x2F;strong&gt; (en Wox-fork med en plugin-markedsplads og AI-plugins). Microsoft selv udgav &lt;strong&gt;PowerToys Run&lt;&#x2F;strong&gt; (2020, &lt;code&gt;Alt+Space&lt;&#x2F;code&gt; — et vidende nik til Launchy), nu afløst af &lt;strong&gt;PowerToys Command Palette&lt;&#x2F;strong&gt;. Mønsteret er så åbenlyst godt, at OS-producenten adopterede det.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. Linux havde altid sin egen.&lt;&#x2F;strong&gt; &lt;strong&gt;GNOME Do&lt;&#x2F;strong&gt; (2008) var den tidlige Quicksilver-lignende; i dag er det &lt;strong&gt;Rofi&lt;&#x2F;strong&gt; og &lt;strong&gt;dmenu&lt;&#x2F;strong&gt; (minimale, scriptbare, elskede af tiling-WM-brugere), &lt;strong&gt;Ulauncher&lt;&#x2F;strong&gt; og &lt;strong&gt;Albert&lt;&#x2F;strong&gt;. Samme muskelhukommelse, andet økosystem.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;4. Det største skift: starteren opløste sig i hver app.&lt;&#x2F;strong&gt; Det definerende træk i det seneste årti er ikke en bedre starter — det er, at &lt;em&gt;kommandopaletten&lt;&#x2F;em&gt; blev en universel UX-primitiv. &lt;strong&gt;Sublime Text&lt;&#x2F;strong&gt; (~2011) og så &lt;strong&gt;VS Code&lt;&#x2F;strong&gt; (&lt;code&gt;Ctrl&#x2F;Cmd+Shift+P&lt;&#x2F;code&gt;) gjorde “tryk en genvejstast, skriv en kommando” til måden, man styrer en editor på. Så dukkede &lt;strong&gt;Cmd+K&lt;&#x2F;strong&gt; op overalt: Slack, Linear, Notion, GitHub, Figma, Vercel, Stripe, din browser. Tastaturstarteren holdt op med at være en separat app, du installerer, og blev en kontrol indbygget i selve softwaren. I terminalen er &lt;strong&gt;fzf&lt;&#x2F;strong&gt; (2013) den samme idé destilleret til én fuzzy-finder-binær.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;5. Så åd AI’en kommandobaren.&lt;&#x2F;strong&gt; Den nyeste drejning: boksen, du skriver i, taler nu med en model. &lt;strong&gt;Raycast AI&lt;&#x2F;strong&gt;, Flow Launchers AI-plugins, &lt;strong&gt;Spotlight + Apple Intelligence&lt;&#x2F;strong&gt;, Windows &lt;strong&gt;Copilot&lt;&#x2F;strong&gt;. “Genvejstast → skriv → fuzzy-match → handl” bliver til “genvejstast → spørg → starteren regner handlingen ud”. Launchys lille gennemsigtige boks var larvestadiet for nutidens AI-kommandobar.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-du-skal-bruge-i-dag&quot;&gt;Hvad du skal bruge i dag&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;macOS&lt;&#x2F;strong&gt; — &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.raycast.com&#x2F;&quot;&gt;Raycast&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; er den moderne standard: start, udklipshistorik, vinduesstyring, snippets, en udvidelsesbutik og AI i én genvejstast. &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.alfredapp.com&#x2F;&quot;&gt;Alfred&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; er alternativet, hvis du foretrækker et engangskøb og lokal automatisering. Spotlight er indbygget og efterhånden ret god.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Windows&lt;&#x2F;strong&gt; — &lt;strong&gt;PowerToys Command Palette&lt;&#x2F;strong&gt; (officiel, gratis, følger med &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows&#x2F;powertoys&#x2F;&quot;&gt;PowerToys&lt;&#x2F;a&gt;), &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.flowlauncher.com&#x2F;&quot;&gt;Flow Launcher&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; (open source, plugin-markedsplads) eller &lt;strong&gt;Raycast&lt;&#x2F;strong&gt; (Windows-beta siden sidst i 2025). Par hvilken som helst af dem med &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.voidtools.com&#x2F;&quot;&gt;Everything&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; til lynhurtig filsøgning.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Linux&lt;&#x2F;strong&gt; — &lt;strong&gt;Rofi&lt;&#x2F;strong&gt; eller &lt;strong&gt;dmenu&lt;&#x2F;strong&gt; til den scriptbare&#x2F;tiling-flok, &lt;strong&gt;Ulauncher&lt;&#x2F;strong&gt; eller &lt;strong&gt;Albert&lt;&#x2F;strong&gt; til en venligere GUI.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Terminal&lt;&#x2F;strong&gt; — &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;junegunn&#x2F;fzf&quot;&gt;fzf&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;. Pipe hvad som helst ind i den, fuzzy-find, handl. Starter-idéen i 30 linjers muskelhukommelse.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pointen&quot;&gt;Pointen&lt;&#x2F;h2&gt;
&lt;p&gt;Launchy-klippet fra 2007 ser gammeldags ud — en gennemsigtig boks, et Shiny-skin, tre bogstaver og Enter. Men idéen i det vandt fuldstændigt. Den begyndte som en Mac-kuriositet, Launchy bragte den til Windows, Linux samlede den op, og derfra gik den i to retninger på én gang: &lt;em&gt;opad&lt;&#x2F;em&gt; til produktivitetsplatforme som Raycast, og &lt;em&gt;sidelæns&lt;&#x2F;em&gt; ind i hver app som Cmd+K-kommandopaletten. I dag bruger du den idé fra 2007 snesevis af gange om dagen — du installerer den bare ikke længere, for den er overalt. Og boksen er begyndt at tænke.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;hvad-var-launchy&quot;&gt;Hvad var Launchy?&lt;&#x2F;h3&gt;
&lt;p&gt;En gratis, open source tastaturstarter til Windows (senere på tværs af platforme), først udgivet af Josh Karlin omkring 2004. Genvejstast, skriv nogle få bogstaver, fuzzy-match, start — “Quicksilver til Windows”. Videoen fra 2007 viser den på Shiny-skinnet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;vedligeholdes-launchy-stadig&quot;&gt;Vedligeholdes Launchy stadig?&lt;&#x2F;h3&gt;
&lt;p&gt;Nej — udviklingen ebbede ud omkring 2010, og den er reelt gået i dvale. På Windows i dag: brug PowerToys Command Palette, Flow Launcher eller Raycast.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;app-starter-vs-kommandopalette-hvad-er-forskellen&quot;&gt;App-starter vs. kommandopalette — hvad er forskellen?&lt;&#x2F;h3&gt;
&lt;p&gt;Samme mønster, anden afgrænsning. En starter (Quicksilver, Launchy, Alfred, Raycast) er systemdækkende; en kommandopalette (VS Codes &lt;code&gt;Ctrl+Shift+P&lt;&#x2F;code&gt;, &lt;code&gt;Cmd+K&lt;&#x2F;code&gt;-baren i Slack&#x2F;Linear&#x2F;GitHub) er den samme UX inde i én app. Starteren kom først; paletten er den absorberet ind i alting.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-skal-jeg-bruge-i-2026&quot;&gt;Hvad skal jeg bruge i 2026?&lt;&#x2F;h3&gt;
&lt;p&gt;macOS: Raycast eller Alfred. Windows: PowerToys Command Palette, Flow Launcher eller Raycast. Linux: Rofi, Ulauncher eller Albert. Terminal: fzf.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opsummering&quot;&gt;Opsummering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Tastaturstarteren — &lt;strong&gt;genvejstast → skriv → fuzzy-match → start&lt;&#x2F;strong&gt; — begyndte på Mac’en (&lt;strong&gt;LaunchBar&lt;&#x2F;strong&gt;, &lt;strong&gt;Quicksilver&lt;&#x2F;strong&gt;) og nåede Windows via &lt;strong&gt;Launchy&lt;&#x2F;strong&gt;, som min &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;LBW1L2YOKks&quot;&gt;video fra 2007&lt;&#x2F;a&gt; demonstrerer.&lt;&#x2F;li&gt;
&lt;li&gt;Den voksede &lt;em&gt;opad&lt;&#x2F;em&gt; til platforme: &lt;strong&gt;Alfred&lt;&#x2F;strong&gt; (2010) → &lt;strong&gt;Raycast&lt;&#x2F;strong&gt; (2020), nu AI-drevet, med en &lt;strong&gt;Windows-beta&lt;&#x2F;strong&gt; fra sidst i 2025.&lt;&#x2F;li&gt;
&lt;li&gt;Windows blev ved med at genopfinde den: &lt;strong&gt;Wox&lt;&#x2F;strong&gt; → &lt;strong&gt;Flow Launcher&lt;&#x2F;strong&gt;, og Microsofts &lt;strong&gt;PowerToys Run → Command Palette&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Den spredte sig også &lt;em&gt;sidelæns&lt;&#x2F;em&gt; ind i hver app som &lt;strong&gt;Cmd+K-kommandopaletten&lt;&#x2F;strong&gt; (Sublime&#x2F;VS Code → Slack, Linear, Notion, GitHub) og ind i terminalen som &lt;strong&gt;fzf&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Idéen fra 2007 er nu overalt — og i stigende grad en AI-kommandobar.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Fra Xming på Windows XP til WSLg: 18 år med Linux-GUI-apps på Windows (2026)</title>
        <published>2026-06-07T00:00:00+00:00</published>
        <updated>2026-06-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/linux-gui-apps-paa-windows-xming-til-wslg/"/>
        <id>https://www.x2q.net/da/post/linux-gui-apps-paa-windows-xming-til-wslg/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/linux-gui-apps-paa-windows-xming-til-wslg/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; At køre en Linux-GUI-app på en Windows-maskine plejede at betyde, at man installerede en &lt;strong&gt;X-server&lt;&#x2F;strong&gt; (Xming, senere VcXsrv), pegede en SSH-session på den med &lt;code&gt;ssh -X&lt;&#x2F;code&gt; og så et fjernt &lt;code&gt;gedit&lt;&#x2F;code&gt;-vindue tegne sig selv op på Windows-skrivebordet. Jeg har &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=P3hHsfdFusw&quot;&gt;en gammel skærmoptagelse af præcis det&lt;&#x2F;a&gt; — Xming, der sætter gedit på &lt;strong&gt;Windows XP&lt;&#x2F;strong&gt;. Atten år senere gider man stort set ikke: &lt;strong&gt;WSLg&lt;&#x2F;strong&gt; leverer en Wayland- + X-server &lt;em&gt;inde i&lt;&#x2F;em&gt; Windows, så en Linux-app installeret i WSL2 bare åbner som ethvert andet vindue. Dette indlæg trækker buen op — X11-forwarding → VcXsrv → Wayland → WSLg — og hvad du faktisk skal bruge i 2026.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Det her er en pendant til de andre “dengang vs. nu”-noter på bloggen — som &lt;a href=&quot;&#x2F;post&#x2F;local-speech-to-text-whisper-cpp&#x2F;&quot;&gt;lokal tale-til-tekst, der afløser cloud-Speech-API’en&lt;&#x2F;a&gt; og &lt;a href=&quot;&#x2F;da&#x2F;post&#x2F;hack-traadloest-netvaerk&#x2F;&quot;&gt;25 års Wi-Fi-sikkerhed&lt;&#x2F;a&gt;. Samme form: noget, der var fummelt i XP-æraen, er nu indbygget.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;opsaetningen-dengang&quot;&gt;Opsætningen, dengang&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=P3hHsfdFusw&quot;&gt;Videoen&lt;&#x2F;a&gt; viser det kanoniske trick fra midten af 00’erne. Delene:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Xming&lt;&#x2F;strong&gt; — en gratis X11-server til Windows (en port af X.Org-serveren). Den kørte i Windows’ systembakke og leverede et &lt;em&gt;display&lt;&#x2F;em&gt;, som X-klienter kunne tegne til.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En SSH-klient&lt;&#x2F;strong&gt; — som regel PuTTY med “Enable X11 forwarding” sat til, eller &lt;code&gt;ssh -X&lt;&#x2F;code&gt; fra Cygwin.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En fjern Linux-maskine&lt;&#x2F;strong&gt;, der kørte selve appen (&lt;code&gt;gedit&lt;&#x2F;code&gt;, en editor) uden noget lokalt vindue af sin egen.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Flowet: SSH forbinder til Linux-værten, værten sætter &lt;code&gt;$DISPLAY&lt;&#x2F;code&gt; til at tunnelere X11 tilbage gennem den krypterede SSH-kanal, appen tegner til Xming, og et Linux-vindue dukker op på Windows XP. Applikationen kører udelukkende på fjern-maskinen; kun &lt;em&gt;pixels og input-events&lt;&#x2F;em&gt; rejser. Det virkede, fordi &lt;strong&gt;X11 var netværkstransparent fra dag ét&lt;&#x2F;strong&gt; — en designbeslutning fra 1984, der modnede til en reelt nyttig egenskab.&lt;&#x2F;p&gt;
&lt;p&gt;Det var smart, og det var også langsomt og skrøbeligt: hver menu og genoptegning var en round-trip, så over andet end et LAN føltes det som at vade gennem sirup.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;et-hurtigt-overblik-18-ar-med-linux-gui-pa-windows&quot;&gt;Et hurtigt overblik — 18 år med Linux-GUI på Windows&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Æra&lt;&#x2F;th&gt;&lt;th&gt;Sådan gjorde du&lt;&#x2F;th&gt;&lt;th&gt;Hvad drev displayet&lt;&#x2F;th&gt;&lt;th&gt;Smertepunkter&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;~2007 (XP)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ssh -X&lt;&#x2F;code&gt; &#x2F; PuTTY → Xming&lt;&#x2F;td&gt;&lt;td&gt;Xming X-server i bakken&lt;&#x2F;td&gt;&lt;td&gt;Manuel install, snakkesalig X11, laggy over WAN&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;~2012&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Samme, eller X over VNC&lt;&#x2F;td&gt;&lt;td&gt;Xming &#x2F; Xming-mesa, VcXsrv kommer (2011)&lt;&#x2F;td&gt;&lt;td&gt;X-server stadig en separat bevægelig del&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;~2017&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;VcXsrv + WSL1&lt;&#x2F;td&gt;&lt;td&gt;VcXsrv, sæt &lt;code&gt;DISPLAY=localhost:0&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;WSL1-finurligheder, font-&#x2F;clipboard-fejl&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;~2021&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;WSL2 + manuel X-server, &lt;em&gt;eller&lt;&#x2F;em&gt; WSLg-preview&lt;&#x2F;td&gt;&lt;td&gt;VcXsrv &#x2F; X410, så WSLg&lt;&#x2F;td&gt;&lt;td&gt;Overgang; manuel &lt;code&gt;DISPLAY&lt;&#x2F;code&gt;-eksport stadig normal&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;2026 (i dag)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;WSLg, indbygget&lt;&#x2F;td&gt;&lt;td&gt;Weston (Wayland) + XWayland, automatisk&lt;&#x2F;td&gt;&lt;td&gt;Stort set ingen — &lt;code&gt;apt install&lt;&#x2F;code&gt;, appen åbner&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;hvad-der-faktisk-aendrede-sig&quot;&gt;Hvad der faktisk ændrede sig&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;1. X-serveren holdt op med at være din at administrere.&lt;&#x2F;strong&gt; I ~25 år var X-serveren noget, &lt;em&gt;du&lt;&#x2F;em&gt; installerede og passede på Windows. Med &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;microsoft&#x2F;wslg&quot;&gt;WSLg&lt;&#x2F;a&gt; — annonceret ved Microsoft Build 2021, nu standard på Windows 11 og Windows 10 21H2+ — bundter Microsoft en hel display-stak ind i en system-distro: en &lt;strong&gt;Weston&lt;&#x2F;strong&gt; Wayland-compositor, &lt;strong&gt;XWayland&lt;&#x2F;strong&gt; til gamle X11-apps, en PulseAudio-server til lyd og et RDP-link, der tegner vinduerne op på Windows-skrivebordet. Du installerer en Linux-GUI-app i WSL2, og den åbner. Ingen &lt;code&gt;DISPLAY&lt;&#x2F;code&gt;, intet bakke-ikon, ingen PuTTY-afkrydsning.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;# Inde i WSL2 på Windows 11 — ingen X-server at installere:
sudo apt update &amp;amp;&amp;amp; sudo apt install -y gedit
gedit            # et rigtigt Linux-gedit-vindue åbner på Windows
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;2. Wayland afløste X11 på Linux-siden.&lt;&#x2F;strong&gt; Protokollen, der gjorde det oprindelige trick muligt, er på vej ud. Moderne Linux-skriveborde defaulter til &lt;strong&gt;Wayland&lt;&#x2F;strong&gt;, som — i modsætning til X11 — &lt;em&gt;ikke&lt;&#x2F;em&gt; er netværkstransparent. Så “bare forward det over SSH”-reflekset passer ikke længere rent; det Wayland-native svar på fjern-visning er &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;mstoeckl&#x2F;waypipe&quot;&gt;&lt;code&gt;waypipe&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, og XWayland holder gamle X11-apps kørende i mellemtiden.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. Xming selv visnede til en betalt niche.&lt;&#x2F;strong&gt; Xming lever stadig — Colin Harrison udgav 7.7.x-builds så sent som januar 2026 — men den frit tilgængelige offentlige udgave frøs ved &lt;strong&gt;6.9.0.31 i 2007&lt;&#x2F;strong&gt;; nyere versioner er donations-låst. Den gratis, aktivt vedligeholdte fakkel gik videre til &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;marchaesen&#x2F;vcxsrv&quot;&gt;VcXsrv&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;, en open source-X-server bygget fra nuværende X.Org-kilder. (Bemærk: VcXsrv droppede Windows XP-understøttelse for længst — den æra er reelt forbi.)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;4. Selve &lt;em&gt;grunden&lt;&#x2F;em&gt; fordampede stort set.&lt;&#x2F;strong&gt; I 2007 forwardede man en editor, fordi det var smertefuldt at redigere fjern-filer på nogen anden måde. I 2026 ville du gribe efter &lt;strong&gt;VS Codes Remote-SSH&lt;&#x2F;strong&gt;, &lt;a href=&quot;&#x2F;post&#x2F;mount-remote-filesystem-sshfs&#x2F;&quot;&gt;montere fjern-filsystemet med sshfs&lt;&#x2F;a&gt; eller bare arbejde i en terminal over &lt;a href=&quot;&#x2F;post&#x2F;ssh-key-login-without-password&#x2F;&quot;&gt;nøglebaseret SSH&lt;&#x2F;a&gt;. At forwarde et enkelt GUI-vindue er nu undtagelsen, ikke arbejdsgangen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-du-skal-bruge-i-dag&quot;&gt;Hvad du skal bruge i dag&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Du er på WSL2 (Windows 11 &#x2F; Win10 21H2+):&lt;&#x2F;strong&gt; gør ingenting. WSLg er der allerede. &lt;code&gt;apt install&lt;&#x2F;code&gt; appen og kør den. Tjek med:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;echo $WAYLAND_DISPLAY     # wayland-0   → WSLg er aktiv
echo $DISPLAY             # :0          → XWayland til gamle X11-apps
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Du skal forwarde en GUI-app fra en fjern Linux-server til Windows:&lt;&#x2F;strong&gt; installér &lt;strong&gt;VcXsrv&lt;&#x2F;strong&gt;, start den (multiple-windows-tilstand, slå adgangskontrol fra — kun på et betroet netværk), og:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ssh -X user@server        # -Y til betroet forwarding, hvis -X er blokeret
xterm                     # eller hvilken GUI-app som helst — den tegner til VcXsrv
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Det er &lt;em&gt;præcis&lt;&#x2F;em&gt; den samme mekanisme som i Xming-klippet, bare med en moderne X-server. Det virker stadig. Det er stadig snakkesaligt over latency.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Du vil have fjern-GUI, der ikke kravler over WAN:&lt;&#x2F;strong&gt; drop rå X11. Brug &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Xpra-org&#x2F;xpra&quot;&gt;&lt;code&gt;xpra&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; (“screen for X” — apps overlever afbrydelser, og det komprimerer godt), &lt;code&gt;waypipe&lt;&#x2F;code&gt; til Wayland eller en rigtig remote-desktop-protokol (RDP via &lt;code&gt;xrdp&lt;&#x2F;code&gt;, eller NoMachine&#x2F;NX) til et fuldt skrivebord.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pointen&quot;&gt;Pointen&lt;&#x2F;h2&gt;
&lt;p&gt;XP-klippet er en lille tidskapsel: en bakke-ikon-X-server, en PuTTY-tunnel og en Linux-teksteditor, der materialiserer sig på et beige XP-skrivebord. &lt;em&gt;Idéen&lt;&#x2F;em&gt; — kør appen derovre, se den herovre — forsvandt aldrig. Det, der ændrede sig, er, at du ikke længere samler det i hånden. X-serveren flyttede ind i Windows, X11 gav plads til Wayland, og det almindelige tilfælde (“jeg vil bare røre filer på den maskine”) fik bedre svar helt af sig selv. Atten års VVS, stille og roligt absorberet ind i &lt;code&gt;apt install&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;virker-ssh-x11-forwarding-stadig-i-2026&quot;&gt;Virker SSH X11-forwarding stadig i 2026?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja — &lt;code&gt;ssh -X&lt;&#x2F;code&gt; (eller &lt;code&gt;-Y&lt;&#x2F;code&gt; til betroet forwarding) er uændret. Det forwarder X11 til en hvilken som helst X-server: VcXsrv, Xming, XQuartz eller WSLg’s. Det er bare snakkesaligt over latency, hvilket er grunden til, at xpra&#x2F;waypipe&#x2F;RDP som regel vinder til fjern-arbejde i dag.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;vedligeholdes-xming-stadig&quot;&gt;Vedligeholdes Xming stadig?&lt;&#x2F;h3&gt;
&lt;p&gt;Builds dukker stadig op (7.7.x i 2026), men de er donations-låst; den sidste gratis offentlige udgave var 6.9.0.31 i 2007 — Windows XP-æraen for klippet. Vil du have en gratis, aktivt bygget X-server til Windows, så brug VcXsrv.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;skal-jeg-overhovedet-bruge-en-x-server&quot;&gt;Skal jeg overhovedet bruge en X-server?&lt;&#x2F;h3&gt;
&lt;p&gt;Kun til at forwarde GUI-apps fra en fjern maskine over SSH, eller til at køre X-apps fra en ikke-WSLg-distro. På WSL2 med Windows 11 (eller Win10 21H2+) leverer WSLg allerede en — lokale Linux-GUI-apps åbner uden noget ekstra installeret.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-brod-wayland-det-gamle-forward-det-over-ssh-trick&quot;&gt;Hvorfor brød Wayland det gamle “forward det over SSH”-trick?&lt;&#x2F;h3&gt;
&lt;p&gt;X11 var netværkstransparent af design, så forwarding var gratis. Wayland er det bevidst ikke — fjern-visning er et separat anliggende, der håndteres af waypipe eller RDP. WSLg dækker over det ved at køre Weston + XWayland, så begge slags app virker.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opsummering&quot;&gt;Opsummering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Den gamle måde: installér &lt;strong&gt;Xming&lt;&#x2F;strong&gt;, sæt X11-forwarding til i PuTTY, &lt;code&gt;ssh -X&lt;&#x2F;code&gt;, og en fjern Linux-app tegner op på Windows. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=P3hHsfdFusw&quot;&gt;Videoen&lt;&#x2F;a&gt; er det, på Windows XP.&lt;&#x2F;li&gt;
&lt;li&gt;I dag: &lt;strong&gt;WSLg&lt;&#x2F;strong&gt; leverer en Wayland- + X-server inde i Windows — &lt;code&gt;apt install&lt;&#x2F;code&gt; en Linux-app i WSL2, og den åbner bare.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;VcXsrv&lt;&#x2F;strong&gt; er den gratis, vedligeholdte afløser for Xming til det klassiske fjern-forwarding-tilfælde; &lt;strong&gt;Xming&lt;&#x2F;strong&gt; selv blev donations-kun efter 6.9.0.31 (2007).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Wayland&lt;&#x2F;strong&gt; afløste X11’s netværkstransparens; brug &lt;strong&gt;waypipe&lt;&#x2F;strong&gt;, &lt;strong&gt;xpra&lt;&#x2F;strong&gt; eller RDP til hurtig fjern-GUI.&lt;&#x2F;li&gt;
&lt;li&gt;For den oprindelige motivation — at redigere på en fjern maskine — foretræk VS Codes Remote-SSH, &lt;a href=&quot;&#x2F;post&#x2F;mount-remote-filesystem-sshfs&#x2F;&quot;&gt;sshfs&lt;&#x2F;a&gt; eller almindelig &lt;a href=&quot;&#x2F;post&#x2F;ssh-key-login-without-password&#x2F;&quot;&gt;SSH&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Forlæng videoklip med AI på en 12 GB GPU — seks modeller sammenlignet</title>
        <published>2026-06-07T00:00:00+00:00</published>
        <updated>2026-06-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/video-forlaengelse-modeller-12gb-gpu/"/>
        <id>https://www.x2q.net/da/post/video-forlaengelse-modeller-12gb-gpu/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/video-forlaengelse-modeller-12gb-gpu/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; At “forlænge” et videoklip er i virkeligheden &lt;strong&gt;billede-til-video&lt;&#x2F;strong&gt;: tag sidste frame, lad en model generere en troværdig fortsættelse, og sæt dem sammen. Jeg kørte det samme maskine-klip gennem &lt;strong&gt;seks&lt;&#x2F;strong&gt; I2V-modeller på ét &lt;strong&gt;12 GB RTX 4070 Ti&lt;&#x2F;strong&gt;: Wan2.2-TI2V-5B, Wan2.2-I2V-A14B (GGUF Q4, ved 640 px og ved 720p), Stable Video Diffusion, LTX-Video og CogVideoX-5B. Pointen er ikke vinderen — men at en &lt;strong&gt;14B&lt;&#x2F;strong&gt;-model og &lt;strong&gt;720p&lt;&#x2F;strong&gt; begge passer i 12 GB, når man får &lt;strong&gt;offload-strategien&lt;&#x2F;strong&gt; rigtig.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opgaven&quot;&gt;Opgaven&lt;&#x2F;h2&gt;
&lt;p&gt;Jeg havde en stak korte klip af skovmaskiner — en gravemaskine, en flishugger, en gummiged — og ville have dem et par sekunder længere. Der er ikke mere materiale; den eneste måde at forlænge på er at &lt;em&gt;opfinde&lt;&#x2F;em&gt; det. Moderne billede-til-video-modeller gør netop det: de betinges på et startbillede (her klippets sidste frame) og en tekst-prompt og hallucinerer bevægelse fremad. Sæt den ægte hale sammen med den genererede fortsættelse, og du har et længere klip.&lt;&#x2F;p&gt;
&lt;p&gt;Alt nedenfor kørte lokalt på ét 12 GB RTX 4070 Ti med 125 GB system-RAM (RAM’en betyder noget — det er der de offloadede vægte bor).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;det-egentlige-problem-at-fa-store-videomodeller-ned-i-12-gb&quot;&gt;Det egentlige problem: at få store videomodeller ned i 12 GB&lt;&#x2F;h2&gt;
&lt;p&gt;Billed-diffusion er tilgivende på VRAM. Video-diffusion er ikke: man denoiser et 3D-latent (frames × højde × bredde), og de nyeste kvalitetsmodeller er 5B-14B parametre. Tre ting bed hele tiden:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tekstenkoderen er enorm.&lt;&#x2F;strong&gt; Wan, LTX og CogVideoX bruger alle en T5-XXL &#x2F; umT5-XXL-enkoder på ~11 GB alene. I det øjeblik model-offload flytter den til et 12 GB-kort for at enkode prompten, OOM’er du — før videomodellen overhovedet kører.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Aktiveringer, ikke vægte, eksploderer ved højere opløsning.&lt;&#x2F;strong&gt; En 9 GB-transformer kan sidde på kortet fint; det er attention-aktiveringerne over (frames × tokens), der løber over, når man presser forbi ~480p.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kvantisering hjælper på disk og lidt på VRAM, men spiller dårligt sammen med visse offload-tilstande.&lt;&#x2F;strong&gt; GGUF Q4 skrumper en 14B-ekspert til ~9 GB, men hvordan man offloader den betyder noget.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Det der fik det hele til at virke:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Præ-enkod prompten på CPU, og smid så enkoderen ud.&lt;&#x2F;strong&gt; Beregn tekst-embeddings med T5 på CPU’en &lt;em&gt;i fp32&lt;&#x2F;em&gt; (bf16-matmuls på CPU er ulideligt langsomme — det ligner at den hænger), cast resultatet til bf16, sæt &lt;code&gt;text_encoder = None&lt;&#x2F;code&gt;, og start så først videomodellen. Nu rører de 11 GB enkoder aldrig GPU’en.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Vælg offload-tilstand pr. model:&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;enable_model_cpu_offload()&lt;&#x2F;code&gt; — flytter hele del-modeller ind&#x2F;ud af GPU’en. Hurtig, men én model skal kunne være der ad gangen (så den begrænser opløsning&#x2F;længde).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;enable_sequential_cpu_offload()&lt;&#x2F;code&gt; — streamer del-moduler. Lavere top-VRAM, langsommere. Glimrende til ikke-kvantiserede modeller (LTX, CogVideoX), men &lt;strong&gt;bryder GGUF&lt;&#x2F;strong&gt; (accelerates meta-enhed-trin mister kvant-typen).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;apply_group_offloading(..., offload_type=&quot;leaf_level&quot;, use_stream=True)&lt;&#x2F;code&gt; — streamer transformeren blad for blad. Det er hemmelige våben.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;wan2-2-fra-fake-5b-til-aegte-720p&quot;&gt;Wan2.2: fra “fake” 5B til ægte 720p&lt;&#x2F;h2&gt;
&lt;p&gt;Jeg startede med &lt;strong&gt;Wan2.2-TI2V-5B&lt;&#x2F;strong&gt; (den lille, forbrugervenlige). Den kører nemt med model-offload og laver sammenhængende bevægelse, men ved de ~640 px kortet tillader, ser den blød ud — den klassiske plastik-agtige “AI-video”-fornemmelse.&lt;&#x2F;p&gt;
&lt;p&gt;At gå op til &lt;strong&gt;Wan2.2-I2V-A14B&lt;&#x2F;strong&gt; krævede kvantisering. Den officielle 14B er to eksperter (high-noise + low-noise) og vil have 24-35 GB i fp16. GGUF Q4-versionen er ~9 GB pr. ekspert, og diffusers kan loade hver via &lt;code&gt;WanTransformer3DModel.from_single_file(..., quantization_config=GGUFQuantizationConfig(...))&lt;&#x2F;code&gt; — man skal bare have &lt;code&gt;gguf&lt;&#x2F;code&gt;-pakken, ellers kan filen ikke læses. Med model-offload + CPU-prompt-tricket kører 14B’en ved 640 px, og bevægelsen er synligt bedre (flishuggeren, et kaotisk nærbillede som 5B’en lavede til grød, kom ud sammenhængende).&lt;&#x2F;p&gt;
&lt;p&gt;Så det egentlige mål: &lt;strong&gt;720p&lt;&#x2F;strong&gt;. Model-offload ved 1280×720 topper ved ~11,7 GB — den passer, men kun ~13 frames før aktiveringerne løber over. Gennembruddet var &lt;strong&gt;group-leaf-offloading&lt;&#x2F;strong&gt;: stream transformeren ét bladmodul ad gangen, så næsten intet sidder på GPU’en. Top-VRAM ved 1280×720: &lt;strong&gt;1,9 GB&lt;&#x2F;strong&gt;. Kortet er pludselig tomt og opløsning er gratis; prisen er hastighed (blad-streaming er langsomt, ~20 min pr. klip). Men det er ægte, skarp 720p på et 12 GB-kort.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;from diffusers.hooks import apply_group_offloading
for t in (pipe.transformer, pipe.transformer_2):  # begge støj-eksperter
    apply_group_offloading(t, onload_device=torch.device(&amp;quot;cuda&amp;quot;),
                           offload_device=torch.device(&amp;quot;cpu&amp;quot;),
                           offload_type=&amp;quot;leaf_level&amp;quot;, use_stream=True)
pipe.vae.enable_tiling()
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;de-andre-tre&quot;&gt;De andre tre&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LTX-Video&lt;&#x2F;strong&gt; (2B). Hurtig og, til korte forlængelser, den bedste af bundtet — dynamisk bevægelse (gravemaskinen kaster jord), prompt-styret, ~3 min pr. klip ved 768×512. Kræver &lt;code&gt;sentencepiece&lt;&#x2F;code&gt; til sin T5-tokenizer, og &lt;code&gt;sequential&lt;&#x2F;code&gt; offload, fordi den T5 er den samme 11 GB OOM-fælde.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Stable Video Diffusion&lt;&#x2F;strong&gt; (img2vid-xt). Veteranen. Kører ved 1024×576 med model-offload + &lt;code&gt;unet.enable_forward_chunking()&lt;&#x2F;code&gt;, og den er hurtig — men SVD har &lt;strong&gt;ingen tekst-prompt&lt;&#x2F;strong&gt;, så dens bevægelse er &lt;em&gt;ambient&lt;&#x2F;em&gt; (en blid glidning, vind i træerne) frem for den styrede action du bad om. God til filmiske cutaways, forkert værktøj til “bliv ved med at grave”.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CogVideoX-5B-I2V&lt;&#x2F;strong&gt;. Kvalitets-overraskelsen: det længste og blødeste klip (6 s, 49 frames ved 720×480), sammenhængende hele vejen. Hagen er hastigheden — med sequential offload + VAE-tiling tager det groft sagt &lt;strong&gt;en time pr. klip&lt;&#x2F;strong&gt; på 12 GB, hvilket gør den upraktisk her, selvom outputtet er smukt.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;resultattavlen&quot;&gt;Resultattavlen&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;&#x2F;th&gt;&lt;th&gt;Parametre&lt;&#x2F;th&gt;&lt;th&gt;Passer i 12 GB via&lt;&#x2F;th&gt;&lt;th&gt;Output&lt;&#x2F;th&gt;&lt;th&gt;Hastighed&lt;&#x2F;th&gt;&lt;th&gt;Dom&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;LTX-Video&lt;&#x2F;td&gt;&lt;td&gt;2B&lt;&#x2F;td&gt;&lt;td&gt;sequential offload&lt;&#x2F;td&gt;&lt;td&gt;768×512&lt;&#x2F;td&gt;&lt;td&gt;~3 min&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Bedst til korte forlængelser&lt;&#x2F;strong&gt; — hurtig, dynamisk&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Wan2.2-I2V-14B @ 720p&lt;&#x2F;td&gt;&lt;td&gt;14B (Q4)&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;group-leaf-offload (1,9 GB!)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;1280×720&lt;&#x2F;td&gt;&lt;td&gt;~20 min&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Ægte 720p på 12 GB&lt;&#x2F;strong&gt; — skarpest&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Wan2.2-I2V-14B&lt;&#x2F;td&gt;&lt;td&gt;14B (Q4)&lt;&#x2F;td&gt;&lt;td&gt;model-offload + CPU-prompt&lt;&#x2F;td&gt;&lt;td&gt;640×384&lt;&#x2F;td&gt;&lt;td&gt;~8 min&lt;&#x2F;td&gt;&lt;td&gt;God bevægelse, især de svære tilfælde&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CogVideoX-5B-I2V&lt;&#x2F;td&gt;&lt;td&gt;5B&lt;&#x2F;td&gt;&lt;td&gt;sequential + VAE-tiling&lt;&#x2F;td&gt;&lt;td&gt;720×480&lt;&#x2F;td&gt;&lt;td&gt;~1 time&lt;&#x2F;td&gt;&lt;td&gt;Længst&#x2F;blødest, men upraktisk langsom her&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Stable Video Diffusion&lt;&#x2F;td&gt;&lt;td&gt;~1,5B&lt;&#x2F;td&gt;&lt;td&gt;model-offload + chunking&lt;&#x2F;td&gt;&lt;td&gt;1024×576&lt;&#x2F;td&gt;&lt;td&gt;~2 min&lt;&#x2F;td&gt;&lt;td&gt;Hurtig og ren, men bevægelsen er ambient&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Wan2.2-TI2V-5B&lt;&#x2F;td&gt;&lt;td&gt;5B&lt;&#x2F;td&gt;&lt;td&gt;model-offload&lt;&#x2F;td&gt;&lt;td&gt;640×384&lt;&#x2F;td&gt;&lt;td&gt;~3 min&lt;&#x2F;td&gt;&lt;td&gt;Den bløde, “fake”-agtige baseline&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;hvad-jeg-faktisk-ville-gore&quot;&gt;Hvad jeg faktisk ville gøre&lt;&#x2F;h2&gt;
&lt;p&gt;På et 12 GB-kort: grib &lt;strong&gt;LTX-Video&lt;&#x2F;strong&gt; til hurtige, styrede forlængelser, og &lt;strong&gt;Wan2.2-14B + group-offload&lt;&#x2F;strong&gt; når du specifikt har brug for &lt;strong&gt;720p&lt;&#x2F;strong&gt; og kan vente. SVD bliver i kassen til ambient cutaways. CogVideoX er smuk, men man ville ønske sig en større GPU for at bruge den i praksis.&lt;&#x2F;p&gt;
&lt;p&gt;Og den ærlige begrænsning: det der stadig læses som “AI” er mest &lt;strong&gt;opløsning&lt;&#x2F;strong&gt;. Group-offload køber dig 720p &lt;em&gt;eller&lt;&#x2F;em&gt; et 12 GB-kort køber dig længde — ikke begge på én gang. Høj opløsning &lt;em&gt;og&lt;&#x2F;em&gt; flere sekunder er den ene mur et 12 GB-kort ikke kan bestige; det er hvad et 24 GB+ kort (eller en time i skyen) er til. Alt andet — selv en 14B-model ved 720p — viste sig at være et spørgsmål om offloading, ikke hestekræfter.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Fem måder at skaffe b-roll fra én tur — alt på en lokal GPU</title>
        <published>2026-06-02T00:00:00+00:00</published>
        <updated>2026-06-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/ai-broll-fem-maader-lokal-gpu/"/>
        <id>https://www.x2q.net/da/post/ai-broll-fem-maader-lokal-gpu/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/ai-broll-fem-maader-lokal-gpu/">&lt;p&gt;&lt;strong&gt;Kort fortalt —&lt;&#x2F;strong&gt; B-roll er de klip, der giver en redigering luft, og onboard-POV fra ét kamera har præcis ingen. Jeg tog én ATV-tur og prøvede &lt;strong&gt;fem&lt;&#x2F;strong&gt; måder at fabrikere b-roll ud af den: (1) &lt;strong&gt;auto-mine&lt;&#x2F;strong&gt; de bedste rigtige frames med OpenCV, (2) &lt;strong&gt;generér stills&lt;&#x2F;strong&gt; og seed dem fra rigtige frames med &lt;strong&gt;SDXL-Turbo → RealVisXL img2img&lt;&#x2F;strong&gt;, (3) fake et filmisk kamera-move med &lt;strong&gt;Depth-Anything-V2&lt;&#x2F;strong&gt;-parallakse i 2,5D, (4) generér &lt;em&gt;ægte bevægelse&lt;&#x2F;em&gt; med &lt;strong&gt;Stable Video Diffusion&lt;&#x2F;strong&gt;, og (5) lav et &lt;strong&gt;slowmotion&lt;&#x2F;strong&gt;-klip af det rigtige materiale med optisk flow-interpolation. Alt kørte lokalt på et 12 GB RTX 4070 Ti. De supplerer hinanden — her er sammenligningen og fælderne.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problemet&quot;&gt;Problemet&lt;&#x2F;h2&gt;
&lt;p&gt;Onboard-materiale — et GoPro&#x2F;DJI på styret af en gokart eller en ATV — er ét langt førstepersons-shot. Det er fremragende til action, men en redigering har brug for &lt;em&gt;cutaways&lt;&#x2F;em&gt;: etableringsbilledet, naturen, den langsomme detalje, der giver seeren et åndedrag mellem de intense passager. Med ét kamera og intet B-kamera har du ingen. Så: kan man fabrikere troværdig b-roll bagefter, lokalt og gratis?&lt;&#x2F;p&gt;
&lt;p&gt;Jeg prøvede fem tilgange på én 11-minutters ATV-tur gennem nordisk skov og grusspor. Hver laver et kort, gradet klip; det interessante er afvejningerne.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1-auto-mine-det-rigtige-materiale-opencv&quot;&gt;1. Auto-mine det rigtige materiale (OpenCV)&lt;&#x2F;h2&gt;
&lt;p&gt;Den billigste b-roll er den, du allerede har filmet uden at lægge mærke til det. En lille OpenCV-rutine sampler ~1.400 frames hen over turen og giver hver en score for &lt;strong&gt;skarphed&lt;&#x2F;strong&gt; (variansen af Laplacian), &lt;strong&gt;farverigdom&lt;&#x2F;strong&gt; (Hasler–Süsstrunk-målet), &lt;strong&gt;eksponering&lt;&#x2F;strong&gt; (afstand fra en mellemtone) og &lt;strong&gt;bevægelses-stabilitet&lt;&#x2F;strong&gt; (forskel mellem frames — lavt er godt til en stabil cutaway). Non-maximum suppression spreder derefter valgene ud, så du ikke får otte næsten identiske frames fra de samme 20 sekunder.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;score = 1.1*z(skarphed) + 1.0*z(farverig) + 0.8*z(eksponering) - 0.9*rystelse - 6.0*klipning
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ikke glamourøst, men øjeblikkeligt, gratis og 100 % ægte. Outputtet er din egen tur — bare de mest b-roll-værdige tre sekunder, du havde glemt, du filmede.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-generative-stills-matchet-til-den-rigtige-tur&quot;&gt;2. Generative stills, matchet til den rigtige tur&lt;&#x2F;h2&gt;
&lt;p&gt;Her blev det interessant — og her gik det først galt.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Forsøg ét: ren text-to-image.&lt;&#x2F;strong&gt; SDXL-Turbo med prompts som &lt;em&gt;“filmisk diset skov i gyldent lys”&lt;&#x2F;em&gt; lavede smukke billeder, der lignede selve turen i ingenting. Forkert lys (solnedgang vs. den rigtige overskyede himmel), ingen ATV i billedet, intet POV. Flot stock-materiale af &lt;em&gt;en&lt;&#x2F;em&gt; skov, ikke &lt;em&gt;denne&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Forsøg to: img2img, seedet fra rigtige frames.&lt;&#x2F;strong&gt; Ved at fodre et rigtigt frame ind som init-billede ved moderat denoising-strength bevares den rigtige komposition — den sorte ATV’s styr og spejle i forgrunden, det græs-og-jord-spor, den overskyede palette — og detaljen regenereres. Nu klipper det sammen med det rigtige materiale. Men SDXL-&lt;strong&gt;Turbo&lt;&#x2F;strong&gt; ved strength ≈0,5 &lt;em&gt;smeltede&lt;&#x2F;em&gt; stadig: den hallucinerede ekstra instrumenter på instrumentbrættet og forvrængede styret. Det klassiske “AI-look”.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Forsøg tre: bedre modeller, lavere strength.&lt;&#x2F;strong&gt; Jeg sammenlignede tre mindre-smeltende metoder på de samme frames:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;ai-broll&#x2F;compare-methods.avif&quot; alt=&quot;Rigtigt frame (øverst til venstre) mod tre generative metoder: SDXL img2img ved lav strength, ControlNet-Canny og RealVisXL. SDXL ved lav strength og RealVisXL forbliver tro mod kilden; ControlNet komponerer grønnere.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SDXL-base, lav strength (0,30), 30 steps&lt;&#x2F;strong&gt; — tro mod kilden, ingen smelt, men en anelse blød.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ControlNet-Canny + SDXL&lt;&#x2F;strong&gt; — låser de rigtige kanter, så intet forvrænger, men komponerede scenen grønnere og mere stiliseret end kilden.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;RealVisXL&lt;&#x2F;strong&gt; (en fotorealistisk SDXL-finetune), img2img — vinderen: skarp, fotorealistisk, bevarer det rigtige POV og palette, ingen smelt.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;ai-broll&#x2F;realvis-match.avif&quot; alt=&quot;Et rigtigt frame og dets RealVisXL-img2img-regeneration. Samme POV, spejle, bagagebærer og spor; renere og skarpere.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Læren: til at matche materiale betyder &lt;em&gt;basismodellen&lt;&#x2F;em&gt; og &lt;em&gt;denoising-strength&lt;&#x2F;em&gt; langt mere end prompten. En fotorealistisk checkpoint ved lav strength slår en prangende destilleret model hver gang.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-ai-ken-burns-dybde-parallakse&quot;&gt;3. AI Ken Burns — dybde-parallakse&lt;&#x2F;h2&gt;
&lt;p&gt;Et stillbillede behøver ikke stå stille. &lt;strong&gt;Depth-Anything-V2&lt;&#x2F;strong&gt; estimerer et dybdekort for et frame på et godt stykke under et sekund; med dybde i hånden kan du rendere et 2,5D-kamera-move, hvor nære pixels flytter sig mere end fjerne, plus et blidt skub mod sporets forsvindingspunkt. Det læser som at køre fremad.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;ai-broll&#x2F;depth-parallax.avif&quot; alt=&quot;Et stillbillede og dets estimerede dybdekort fra Depth-Anything-V2. Nær = lys, fjern = mørk; sporet trækker sig rent tilbage.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Hele renderingen er en baglæns &lt;code&gt;cv2.remap&lt;&#x2F;code&gt; med dybdevægtet forskydning, så den er hulfri og hurtig. Én fælde værd at notere: OpenCV’s &lt;code&gt;remap&lt;&#x2F;code&gt; vil have &lt;code&gt;float32&lt;&#x2F;code&gt;-maps, og en enkelt løs Python-skalar i regnestykket opgraderer dem stille til &lt;code&gt;float64&lt;&#x2F;code&gt;, hvorefter &lt;code&gt;remap&lt;&#x2F;code&gt; fejler. Cast dem eksplicit tilbage til &lt;code&gt;float32&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Det er den bedste indsats-per-effekt af de syntetiske muligheder: rigtigt indhold, ægte-udseende bevægelse, en lillebitte model. Den eneste begrænsning er, at store skub begynder at afsløre forvrængning ved dybde-spring — hold bevægelsen diskret.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4-generativ-video-stable-video-diffusion&quot;&gt;4. Generativ video — Stable Video Diffusion&lt;&#x2F;h2&gt;
&lt;p&gt;Vil du have bevægelse, som et stillbillede &lt;em&gt;ikke&lt;&#x2F;em&gt; kan fake, animerer &lt;strong&gt;Stable Video Diffusion&lt;&#x2F;strong&gt; (image-to-video) et stillbillede til ægte bevægelse — kameraet driver og skubber gennem scenen, parallakse og det hele, opfundet af modellen frem for forvrænget geometrisk.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;ai-broll&#x2F;svd-motion.avif&quot; alt=&quot;Et frame fra et Stable Video Diffusion-klip genereret ud fra et RealVisXL-still — kameraet har bevæget sig gennem scenen, sammenhængende.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;At seede SVD fra RealVisXL-stillsene giver genereret bevægelse, der stadig ligner turen. De ærlige forbehold: klippene er korte (~2–3 sekunder ved 25 frames), bevægelsen er kun løst styrbar (du nudger den med en “motion bucket”, ikke en bane), og der er let kant-forvrængning. Det er også det tungeste her — modellen fylder ~9 GB og passer på et 12 GB-kort kun med CPU-offload, UNet forward-chunking og en lille VAE-decode-chunk:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;pipe.enable_model_cpu_offload()
pipe.unet.enable_forward_chunking()
frames = pipe(image, num_frames=25, decode_chunk_size=2,
              motion_bucket_id=110, noise_aug_strength=0.04).frames[0]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;5-filmisk-slowmotion-rigtigt-materiale-ingen-ai&quot;&gt;5. Filmisk slowmotion — rigtigt materiale, ingen AI&lt;&#x2F;h2&gt;
&lt;p&gt;Den femte mulighed bruger slet ingen generativ model. Tag de auto-minede øjeblikke, sæt dem ned til 50 % fart med &lt;strong&gt;bevægelseskompenseret optisk-flow-interpolation&lt;&#x2F;strong&gt; (så slowmotion bliver glat, ikke hakkende duplikerede frames), stabilisér let, og læg en filmisk grade på. ffmpeg klarer det i én filterkæde:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;minterpolate=mi_mode=mci:mc_mode=aobmc:me_mode=bidir:vsbmc=1:fps=60,setpts=2.0*PTS
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Det er 100 % ægte, ser dyrt ud og er det mest “broadcast” af det hele. Interpolation kan udtvære meget hurtige kanter, men på naturklip er det rent.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvilken-vinder&quot;&gt;Hvilken vinder?&lt;&#x2F;h2&gt;
&lt;p&gt;Ingen — de supplerer hinanden, og en rigtig redigering blander flere:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metode&lt;&#x2F;th&gt;&lt;th&gt;Ægthed&lt;&#x2F;th&gt;&lt;th&gt;Kontrol&lt;&#x2F;th&gt;&lt;th&gt;Omkostning&lt;&#x2F;th&gt;&lt;th&gt;Bedst til&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1 · Auto-mine (CV)&lt;&#x2F;td&gt;&lt;td&gt;Ægte&lt;&#x2F;td&gt;&lt;td&gt;Begrænset til det filmede&lt;&#x2F;td&gt;&lt;td&gt;Øjeblikkelig&lt;&#x2F;td&gt;&lt;td&gt;Ægte cutaways, gratis&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2 · Generative stills (RealVisXL)&lt;&#x2F;td&gt;&lt;td&gt;Syntetisk&lt;&#x2F;td&gt;&lt;td&gt;Høj (enhver scene)&lt;&#x2F;td&gt;&lt;td&gt;Mellem (GPU)&lt;&#x2F;td&gt;&lt;td&gt;Shots du aldrig filmede&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;3 · Dybde-parallakse&lt;&#x2F;td&gt;&lt;td&gt;Ægte + fake bevægelse&lt;&#x2F;td&gt;&lt;td&gt;Kun bevægelse&lt;&#x2F;td&gt;&lt;td&gt;Billig&lt;&#x2F;td&gt;&lt;td&gt;At gøre et godt frame levende&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;4 · SVD-video&lt;&#x2F;td&gt;&lt;td&gt;Syntetisk&lt;&#x2F;td&gt;&lt;td&gt;Løs bevægelse&lt;&#x2F;td&gt;&lt;td&gt;Tungest (~9 GB)&lt;&#x2F;td&gt;&lt;td&gt;Levende bevægelse uden materiale&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;5 · Slowmotion (ægte)&lt;&#x2F;td&gt;&lt;td&gt;100 % ægte&lt;&#x2F;td&gt;&lt;td&gt;Fart&#x2F;grade&lt;&#x2F;td&gt;&lt;td&gt;Mellem&lt;&#x2F;td&gt;&lt;td&gt;Et dyrt klip af ægte øjeblikke&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Hvis jeg skulle levere ét b-roll-lag til den slags materiale, blev det &lt;strong&gt;slowmotion (5) for den ægte, dyre følelse&lt;&#x2F;strong&gt;, med &lt;strong&gt;dybde-parallakse (3)&lt;&#x2F;strong&gt; til at lægge bevægelse på fremtrædende frames, og &lt;strong&gt;RealVisXL-stills (2)&lt;&#x2F;strong&gt; kun dér, hvor jeg har brug for et etableringsbillede, der aldrig kunne filmes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stak&quot;&gt;Stak&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU:&lt;&#x2F;strong&gt; ét &lt;strong&gt;RTX 4070 Ti, 12 GB&lt;&#x2F;strong&gt;. Alt nedenstående passer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Diffusion:&lt;&#x2F;strong&gt; &lt;code&gt;diffusers&lt;&#x2F;code&gt; 0.38 — SDXL-base, &lt;strong&gt;RealVisXL V4.0&lt;&#x2F;strong&gt;, ControlNet-Canny-SDXL, &lt;strong&gt;Stable Video Diffusion XT&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Dybde:&lt;&#x2F;strong&gt; &lt;code&gt;transformers&lt;&#x2F;code&gt; + &lt;strong&gt;Depth-Anything-V2-Small&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CV &#x2F; samling:&lt;&#x2F;strong&gt; OpenCV, NumPy og &lt;strong&gt;ffmpeg&lt;&#x2F;strong&gt; (&lt;code&gt;minterpolate&lt;&#x2F;code&gt;, &lt;code&gt;deshake&lt;&#x2F;code&gt;, AV1 NVENC, AVIF-stills).&lt;&#x2F;li&gt;
&lt;li&gt;Et par fælder værd at huske: en distro-Python markeret &lt;strong&gt;PEP 668 externally-managed&lt;&#x2F;strong&gt; vil &lt;em&gt;stille&lt;&#x2F;em&gt; nægte &lt;code&gt;pip install&lt;&#x2F;code&gt; — brug et rigtigt virtualenv. Og &lt;code&gt;pgrep -f build.sh&lt;&#x2F;code&gt; matcher glad og gerne den &lt;em&gt;watcher-kommando&lt;&#x2F;em&gt;, der indeholder strengen, så stol ikke på den til at fortælle dig, at en rendering er færdig; tjek efter en levende &lt;code&gt;ffmpeg&lt;&#x2F;code&gt; i stedet.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;hvorfor-det-findes&quot;&gt;Hvorfor det findes&lt;&#x2F;h2&gt;
&lt;p&gt;Det startede som “onboard-klippene mangler cutaways, og jeg har ét kamera”. Det ærlige svar viste sig at være, at du ikke behøver et andet kamera — du skal &lt;em&gt;finde&lt;&#x2F;em&gt; den b-roll, du allerede har filmet (1, 5), og &lt;em&gt;fabrikere&lt;&#x2F;em&gt; resten med den mindste model, der gør arbejdet (3 før 2 før 4). Den mest prangende mulighed (generativ video) er den, jeg ville gribe til sidst. Den mindst prangende (at score frames med en Laplacian) er den, jeg ville gribe først.&lt;&#x2F;p&gt;
&lt;p&gt;Alt lokalt, alt på et kort, der koster mindre end en weekend med cloud-GPU. Ikke interessant før du har brug for det — og så er det præcis det, du har brug for.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Sammensætning af drone-panoramaer: OpenCV vs Hugin, benchmarket</title>
        <published>2026-05-31T00:00:00+00:00</published>
        <updated>2026-05-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/drone-panorama-stitching-opencv-vs-hugin/"/>
        <id>https://www.x2q.net/da/post/drone-panorama-stitching-opencv-vs-hugin/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/drone-panorama-stitching-opencv-vs-hugin/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; Jeg havde en mappe med 63 DJI Phantom 4 Pro-billeder taget over Randers og ville lave panoramaer ud af dem. Jeg sammensatte de samme sweeps på to måder: &lt;strong&gt;OpenCVs &lt;code&gt;Stitcher&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; (fuldautomatisk, sfærisk) og &lt;strong&gt;Hugins kommandolinje-pipeline&lt;&#x2F;strong&gt; (&lt;code&gt;cpfind&lt;&#x2F;code&gt; → &lt;code&gt;autooptimiser&lt;&#x2F;code&gt; → &lt;code&gt;nona&lt;&#x2F;code&gt; → &lt;code&gt;enblend&lt;&#x2F;code&gt;). OpenCV er hurtig (få sekunder) og beholder det bredeste synsfelt, men horisonten bliver bølget, kanterne flossede, og eksponeringssømmene er synlige. Hugin tager ~30 s pr. panorama, men giver en &lt;strong&gt;lige horisont, sømløs multi-band-overgang og et rent rektangulært beskåret billede&lt;&#x2F;strong&gt;. Til alt, du vil printe eller udgive, vinder Hugin. Alle kommandoer og en benchmark-tabel nedenfor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;udgangspunktet&quot;&gt;Udgangspunktet&lt;&#x2F;h2&gt;
&lt;p&gt;En mappe, 63 filer, &lt;code&gt;DJI_0029.jpeg&lt;&#x2F;code&gt; til &lt;code&gt;DJI_0091.jpeg&lt;&#x2F;code&gt;, ~15 MB hver, 5464 × 3070 px. Ingen flylog, ingen projektfil, og — som det viste sig — det meste af de brugbare metadata fjernet. Bare JPEG-filer og en enlig &lt;code&gt;result.jpg&lt;&#x2F;code&gt; fra et tidligere forsøg.&lt;&#x2F;p&gt;
&lt;p&gt;Første opgave: finde ud af &lt;em&gt;hvad disse billeder egentlig er&lt;&#x2F;em&gt;, før jeg beslutter, hvordan de skal sammensættes. Er det et nadir-kortlægningsgitter? Ét enkelt rotations-panorama? Flere separate sweeps? Hver af dem sammensætter man forskelligt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;at-regne-optagelsen-ud-fra-metadata&quot;&gt;At regne optagelsen ud fra metadata&lt;&#x2F;h2&gt;
&lt;p&gt;Ingen &lt;code&gt;exiftool&lt;&#x2F;code&gt; på maskinen, så:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt-get install -y libimage-exiftool-perl imagemagick
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;DJI skriver normalt gimbal-yaw&#x2F;pitch&#x2F;roll ind i et XMP-namespace, som ville fortælle mig præcis, hvordan kameraet pegede for hvert billede. Her var det fjernet — filerne var tydeligvis blevet re-eksporteret på et tidspunkt (hvilket også forklarer den root-ejede &lt;code&gt;result.jpg&lt;&#x2F;code&gt;). Det, der overlevede, var GPS og tidsstempler:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;exiftool -n -T -FileName -GPSLatitude -GPSLongitude -GPSAltitude \
  -SubSecDateTimeOriginal DJI_*.jpeg
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To ting sprang straks i øjnene.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Der var to sessioner, 90 minutter fra hinanden:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0029&lt;&#x2F;code&gt;–&lt;code&gt;0054&lt;&#x2F;code&gt;, taget 09:01–09:15&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;0055&lt;&#x2F;code&gt;–&lt;code&gt;0091&lt;&#x2F;code&gt;, taget 10:31–10:36&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Den anden session var en stak vandrette sweeps i stigende højde.&lt;&#x2F;strong&gt; GPS-positionen flyttede sig næsten ikke, mens højden steg i tydelige bånd — 169 m, så 221 m, så 240 m, så 269 m. Det er signaturen på en drone, der svæver på stedet og panorerer kameraet hen over horisonten i hver højde. Hvert højdebånd er ét panorama.&lt;&#x2F;p&gt;
&lt;p&gt;Et hurtigt kontaktark bekræftede det:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;ls DJI_*.jpeg | sed &amp;#39;s&#x2F;.jpeg&#x2F;&#x2F;&amp;#39; | xargs -P4 -I{} \
  convert {}.jpeg -resize 260x -gravity South -background black \
  -splice 0x16 -pointsize 13 -fill yellow -annotate +0+1 &amp;#39;{}&amp;#39; &#x2F;tmp&#x2F;thumbs&#x2F;{}.png
montage &#x2F;tmp&#x2F;thumbs&#x2F;DJI_00{55..91}.png -tile 6x -geometry +3+3 &#x2F;tmp&#x2F;sheet.png
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Session ét viste sig at være blandet — billeder lige ned på en enkelt ejendom i forskellige højder (en lodret zoom-sekvens, ikke et panorama) plus nogle skrå nabolagsoptagelser. Så jeg fokuserede panoramaerne på session to’s sweeps, som tydeligvis var det, dronen var der for at fange.&lt;&#x2F;p&gt;
&lt;p&gt;De grupper, jeg endte med:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Gruppe&lt;&#x2F;th&gt;&lt;th&gt;Billeder&lt;&#x2F;th&gt;&lt;th&gt;Højde&lt;&#x2F;th&gt;&lt;th&gt;Indhold&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;A&lt;&#x2F;td&gt;&lt;td&gt;0055–0065&lt;&#x2F;td&gt;&lt;td&gt;~169 m&lt;&#x2F;td&gt;&lt;td&gt;Villakvarter, lav panorering&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;B&lt;&#x2F;td&gt;&lt;td&gt;0066–0076&lt;&#x2F;td&gt;&lt;td&gt;~221 m&lt;&#x2F;td&gt;&lt;td&gt;By&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;C+D&lt;&#x2F;td&gt;&lt;td&gt;0077–0091&lt;&#x2F;td&gt;&lt;td&gt;240–269 m&lt;&#x2F;td&gt;&lt;td&gt;Høj skyline&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;teknik-1-opencv-stitcher&quot;&gt;Teknik 1 — OpenCV Stitcher&lt;&#x2F;h2&gt;
&lt;p&gt;Vejen med mindst modstand. OpenCV leverer en &lt;code&gt;Stitcher&lt;&#x2F;code&gt; på højt niveau, der klarer feature-detektion, matchning, bundle adjustment, warping og blending i ét kald.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;pip install opencv-contrib-python numpy
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;import cv2, glob

imgs = [cv2.imread(f) for f in sorted(glob.glob(&amp;quot;group_A&#x2F;*.jpg&amp;quot;))]
stitcher = cv2.Stitcher_create(cv2.Stitcher_PANORAMA)   # sfærisk model
status, pano = stitcher.stitch(imgs)
if status == cv2.Stitcher_OK:
    cv2.imwrite(&amp;quot;A_opencv.jpg&amp;quot;, pano)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To tilstande er vigtige:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PANORAMA&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; antager, at kameraet roterede om sit optiske centrum (sfærisk warp). Korrekt for disse svæv-og-panorer-sweeps.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SCANS&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; antager en affin&#x2F;translatorisk model (flatbed-scanninger, nadir-kortlægning). Jeg prøvede den for fuldstændighedens skyld; den er den forkerte model her og reducerede de fleste sweeps til to-tre billeder. Brug den ikke til roterende luftoptagelser.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Jeg kørte alt på et 2400 px-arbejdssæt først — fuld opløsning er langsom at iterere på, og man vil gerne se, om en gruppe overhovedet hænger sammen, før man bruger minutter på den.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Dom over OpenCV:&lt;&#x2F;strong&gt; den bare virker, med nul parametre, på sekunder. Gruppe A — elleve billeder — blev til et 10433 × 1595-panorama på cirka 5 sekunder. Hagen er resultatet: en &lt;strong&gt;bølget horisont&lt;&#x2F;strong&gt;, &lt;strong&gt;flossede revne kanter&lt;&#x2F;strong&gt;, man selv skal beskære, og &lt;strong&gt;svage eksponeringssømme&lt;&#x2F;strong&gt;, hvor billeder mødes. Fint til et hurtigt kig; ikke noget, man printer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;teknik-2-hugin-pipelinen&quot;&gt;Teknik 2 — Hugin-pipelinen&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hugin.sourceforge.io&#x2F;&quot;&gt;Hugin&lt;&#x2F;a&gt; er open source-panoramaværktøjet, og afgørende er hele dets motor scriptbar fra kommandolinjen — ingen GUI nødvendig.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;sudo apt-get install -y hugin-tools enblend enfuse
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pipelinen, trin for trin:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;pto_gen      -o p.pto  DJI_0055.jpeg ... DJI_0065.jpeg   # 1. projekt fra EXIF
cpfind --multirow -o p.pto p.pto                          # 2. find kontrolpunkter
cpclean      -o p.pto p.pto                               # 3. fjern dårlige matches
autooptimiser -a -m -l -s -o p.pto p.pto                  # 4. optimér + ret horisont
pano_modify --canvas=AUTO --crop=AUTO --projection=2 \
             -o p.pto p.pto                               # 5. cylindrisk + auto-beskær
nona  -m TIFF_m -z LZW -o remap p.pto                     # 6. remap hvert billede
enblend -o pano.tif remap*.tif                            # 7. multi-band-overgang
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Hvad hvert trin giver dig ud over OpenCV-onelineren:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cpfind --multirow&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; finder ordentlige kontrolpunkter på tværs af hele sættet — den rapporterede 250, 302 og 718 punkter for gruppe A, B og C+D.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;autooptimiser -l -s&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; retter horisonten og opretter panoramaet. Det er den største synlige gevinst: bølgen forsvinder.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--projection=2&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; er cylindrisk, hvilket holder horisonten som en lige vandret linje — præcis hvad man vil have til et bredt luft-sweep.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--crop=AUTO&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; beskærer til det største rene rektangel, så ingen manuel beskæring.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;enblend&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; laver multi-band (Burt–Adelson)-blending, som skjuler de eksponeringsforskelle mellem billeder, OpenCV efterlod synlige.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Samme gruppe, to pipelines, stablet — OpenCV øverst, Hugin nederst:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;drone-panorama&#x2F;compare-cv-vs-hugin.avif&quot; alt=&quot;OpenCV Stitcher vs Hugin på det samme by-sweep. OpenCV efterlader en bølget horisont og revne kanter; Hugin giver et lige, sømløst rektangel.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Forskellen er ikke subtil.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benchmarken&quot;&gt;Benchmarken&lt;&#x2F;h2&gt;
&lt;p&gt;Samme inputgrupper, begge pipelines. OpenCV-tallene er 2400 px-arbejdssættet; Hugin-tallene er de endelige kørsler i fuld opløsning på 5464 px.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Gruppe&lt;&#x2F;th&gt;&lt;th&gt;Billeder&lt;&#x2F;th&gt;&lt;th&gt;Værktøj&lt;&#x2F;th&gt;&lt;th&gt;Resultat&lt;&#x2F;th&gt;&lt;th&gt;Tid&lt;&#x2F;th&gt;&lt;th&gt;Horisont&lt;&#x2F;th&gt;&lt;th&gt;Overgang&lt;&#x2F;th&gt;&lt;th&gt;Beskæring&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;A · villakvarter&lt;&#x2F;td&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;OpenCV PANORAMA&lt;&#x2F;td&gt;&lt;td&gt;10433 × 1595&lt;&#x2F;td&gt;&lt;td&gt;5 s&lt;&#x2F;td&gt;&lt;td&gt;bølget&lt;&#x2F;td&gt;&lt;td&gt;sømme&lt;&#x2F;td&gt;&lt;td&gt;flosset&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;A · villakvarter&lt;&#x2F;td&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Hugin + enblend&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;11581 × 1827&lt;&#x2F;td&gt;&lt;td&gt;31 s&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;lige&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;sømløs&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;ren&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;B · by&lt;&#x2F;td&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;OpenCV PANORAMA&lt;&#x2F;td&gt;&lt;td&gt;10295 × 1838&lt;&#x2F;td&gt;&lt;td&gt;11 s&lt;&#x2F;td&gt;&lt;td&gt;bølget&lt;&#x2F;td&gt;&lt;td&gt;sømme&lt;&#x2F;td&gt;&lt;td&gt;flosset&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;B · by&lt;&#x2F;td&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Hugin + enblend&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;8190 × 2547&lt;&#x2F;td&gt;&lt;td&gt;30 s&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;lige&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;sømløs&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;ren&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;C+D · skyline&lt;&#x2F;td&gt;&lt;td&gt;15&lt;&#x2F;td&gt;&lt;td&gt;OpenCV PANORAMA&lt;&#x2F;td&gt;&lt;td&gt;8660 × 1975&lt;&#x2F;td&gt;&lt;td&gt;2 s&lt;&#x2F;td&gt;&lt;td&gt;bølget&lt;&#x2F;td&gt;&lt;td&gt;sømme&lt;&#x2F;td&gt;&lt;td&gt;flosset&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;C+D · skyline&lt;&#x2F;td&gt;&lt;td&gt;15&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Hugin + enblend&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;22469 × 2391&lt;&#x2F;td&gt;&lt;td&gt;60 s&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;lige&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;sømløs&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;ren&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;OpenCV er 3–10× hurtigere og beholder typisk et bredere synsfelt (den warper og beholder de revne kanter i stedet for at beskære dem). Hugin er langsommere, men vinder på hver kvalitetsakse, der betyder noget for et færdigt billede.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;op-i-fuld-oplosning&quot;&gt;Op i fuld opløsning&lt;&#x2F;h2&gt;
&lt;p&gt;Da Hugin var den klare vinder, kørte jeg den igen på de originale 5464 px-billeder. Pipelinen er identisk — peg bare &lt;code&gt;pto_gen&lt;&#x2F;code&gt; på de originale JPEG-filer i stedet for det nedskalerede sæt. &lt;code&gt;cpfind&lt;&#x2F;code&gt; og &lt;code&gt;enblend&lt;&#x2F;code&gt; er de langsomme trin ved fuld opløsning, men det lå stadig omkring 30 s pr. panorama, et minut for skyline-billedet med 15 frames.&lt;&#x2F;p&gt;
&lt;p&gt;De færdige panoramaer:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Den høje skyline — femten billeder, 22469 × 2391, et næsten 180° sweep hen over hele byen:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;drone-panorama&#x2F;skyline-hugin.avif&quot; alt=&quot;Randers skyline-panorama, fuldt sweep, sammensat med Hugin og enblend.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Villakvarter-sweepet i 169 m:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;drone-panorama&#x2F;residential-hugin.avif&quot; alt=&quot;Villakvarter-panorama i 169 m, Hugin.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Byen i 221 m:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;drone-panorama&#x2F;town-hugin.avif&quot; alt=&quot;By-panorama i 221 m, Hugin.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Ved 22469 px bredde kan skyline-billedet uden problemer printes i storformat.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;hvorfor-betod-metadataene-sa-meget-hvorfor-ikke-bare-smide-alle-63-ind-i-stitcheren&quot;&gt;Hvorfor betød metadataene så meget — hvorfor ikke bare smide alle 63 ind i stitcheren?&lt;&#x2F;h3&gt;
&lt;p&gt;Det kan man godt, og OpenCV vil forsøge at finde sammenhængende komponenter. Men filerne var to urelaterede sessioner plus en blanding af nadir- og skråbilleder. At fodre det hele ind risikerer, at optimeringen forbinder billeder, der ikke bør hænge sammen, eller spilder minutter på at fejle. Fem minutter med &lt;code&gt;exiftool&lt;&#x2F;code&gt; til at gruppere billederne først sparede en masse gætteri — og fortalte mig, &lt;em&gt;hvilke&lt;&#x2F;em&gt; grupper der overhovedet var panoramaer.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-ikke-bare-bruge-dronens-indbyggede-panorama-funktion&quot;&gt;Hvorfor ikke bare bruge dronens indbyggede panorama-funktion?&lt;&#x2F;h3&gt;
&lt;p&gt;Disse var ikke taget som in-camera-panoramaer — det er enkeltbilleder fra manuelle sweeps, og den indbyggede sammensætning (hvis den overhovedet kørte) er den lavopløselige &lt;code&gt;result.jpg&lt;&#x2F;code&gt;, jeg fandt i mappen. At sammensætte fra de originale fuldopløselige billeder giver langt mere detalje end in-camera-JPEG’en.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-med-ptgui-lightroom-microsoft-ice&quot;&gt;Hvad med PTGui &#x2F; Lightroom &#x2F; Microsoft ICE?&lt;&#x2F;h3&gt;
&lt;p&gt;Alle dygtige. PTGui er i bund og grund kommerciel Hugin og fremragende. Lightrooms Photo Merge er praktisk, hvis du allerede er derinde. Microsoft ICE var god, men er udgået. Jeg ville have en scriptbar, gratis, Linux-native pipeline, jeg kunne køre headless over en mappe — det er Hugin.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;cylindrisk-sfaerisk-eller-rektilineaer&quot;&gt;Cylindrisk, sfærisk eller rektilineær?&lt;&#x2F;h3&gt;
&lt;p&gt;Til et bredt vandret sweep holder &lt;strong&gt;cylindrisk&lt;&#x2F;strong&gt; (&lt;code&gt;--projection=2&lt;&#x2F;code&gt;) horisonten lige og håndterer &amp;gt;120° uden den ekstreme strækning, rektilineær giver i kanterne. Sfærisk (det OpenCVs &lt;code&gt;PANORAMA&lt;&#x2F;code&gt; bruger) er også fint, men har tendens til at bue horisonten, medmindre pitchen er godt estimeret — hvilket er sværere her, fordi gimbal-vinklerne var fjernet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kan-det-kore-uovervaget-over-en-hel-mappe&quot;&gt;Kan det køre uovervåget over en hel mappe?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja — hele Hugin-vejen er CLI, så den passer direkte ind i et shell-script eller en &lt;code&gt;Makefile&lt;&#x2F;code&gt;. Gruppér billederne (efter tidsstempel&#x2F;højde, eller lad bare &lt;code&gt;cpfind&lt;&#x2F;code&gt; finde sammenhængende komponenter), og loop så de syv kommandoer pr. gruppe. Det er det egentlige argument for Hugin frem for et GUI-værktøj her.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dom&quot;&gt;Dom&lt;&#x2F;h2&gt;
&lt;p&gt;Vil du have et panorama &lt;em&gt;nu&lt;&#x2F;em&gt; og er ligeglad med en bølget horisont eller selv at trimme kanter, er OpenCVs &lt;code&gt;Stitcher&lt;&#x2F;code&gt; en fem-sekunders oneliner og oprigtigt imponerende for indsatsen.&lt;&#x2F;p&gt;
&lt;p&gt;Til alt, du beholder — print, udgivelse, på væggen — er &lt;strong&gt;Hugins kommandolinje-pipeline&lt;&#x2F;strong&gt; det ekstra halve minut værd. En lige horisont, en sømløs overgang og en automatisk ren beskæring er præcis de ting, der adskiller et snapshot fra et færdigt panorama, og Hugin leverer alle tre gratis. Det er nu mit standardvalg til at sammensætte alt fra dronen.&lt;&#x2F;p&gt;
&lt;p&gt;Det hele — fra installation til færdige fuldopløselige panoramaer — tog cirka en time, det meste brugt på at forstå billederne frem for at sammensætte dem. Hvilket som regel er sådan, det går.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>bchunk — konverter .bin&#x2F;.cue-images til .iso og .wav på Linux og macOS</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/bchunk-bin-cue-til-iso-wav/"/>
        <id>https://www.x2q.net/da/post/bchunk-bin-cue-til-iso-wav/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/bchunk-bin-cue-til-iso-wav/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; &lt;strong&gt;&lt;code&gt;bchunk&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — også kaldet &lt;strong&gt;&lt;code&gt;binchunker&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — er et lille, gammelt Unix-kommandolinjeværktøj, der tager et &lt;code&gt;.bin&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.cue&lt;&#x2F;code&gt;-par (et råt cd-image med et cue-sheet) og deler det op i en rigtig &lt;strong&gt;&lt;code&gt;.iso&lt;&#x2F;code&gt;-fil til datasporet&lt;&#x2F;strong&gt; og én &lt;strong&gt;&lt;code&gt;.wav&lt;&#x2F;code&gt;-fil pr. lydspor&lt;&#x2F;strong&gt;. Det er det rigtige værktøj, når et download eller arkiv har givet dig &lt;code&gt;game.bin&lt;&#x2F;code&gt; + &lt;code&gt;game.cue&lt;&#x2F;code&gt;, og du faktisk vil &lt;strong&gt;mounte datasporet&lt;&#x2F;strong&gt; eller &lt;strong&gt;brænde lydsporene&lt;&#x2F;strong&gt; igen. Installeres med &lt;code&gt;apt install bchunk&lt;&#x2F;code&gt; på Debian&#x2F;Ubuntu, &lt;code&gt;brew install bchunk&lt;&#x2F;code&gt; på macOS eller bygges fra kilden på alt andet. Brug er &lt;code&gt;bchunk [options] image.bin image.cue basename&lt;&#x2F;code&gt; — du får &lt;code&gt;basename01.iso&lt;&#x2F;code&gt;, &lt;code&gt;basename02.wav&lt;&#x2F;code&gt;, &lt;code&gt;basename03.wav&lt;&#x2F;code&gt; osv.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-bin-cue-er-og-hvorfor-du-vil-splitte-det&quot;&gt;Hvad .bin&#x2F;.cue er, og hvorfor du vil splitte det&lt;&#x2F;h2&gt;
&lt;p&gt;Et &lt;code&gt;.bin&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.cue&lt;&#x2F;code&gt;-par er et &lt;strong&gt;råt, bit-nøjagtigt cd-image&lt;&#x2F;strong&gt; plus et klartekst-sheet, der beskriver sporenes layout. &lt;code&gt;.bin&lt;&#x2F;code&gt; indeholder hver sektor af cd’en i rækkefølge — inklusive datasport (Mode 1 eller Mode 2), lydspor (rå Red Book PCM, 2352 bytes pr. sektor, intet filsystem) og pauserne imellem dem. &lt;code&gt;.cue&lt;&#x2F;code&gt; fortæller, hvor hvert spor begynder, og hvilken type det er.&lt;&#x2F;p&gt;
&lt;p&gt;Formatet er standard-output for cd-ripning-værktøjer som cdrdao og for gamle spil-arkiver, fordi det bevarer &lt;em&gt;alt&lt;&#x2F;em&gt; — pregaps, CD-TEXT, mixed-mode-cd’er, CD-DA-lyd. Det er også grunden til, at du ikke bare kan omdøbe &lt;code&gt;game.bin&lt;&#x2F;code&gt; til &lt;code&gt;game.iso&lt;&#x2F;code&gt; og mounte det: en mixed-mode-cd har &lt;strong&gt;ikke-filsystem-sektorer&lt;&#x2F;strong&gt; i starten, lydspor der slet ikke er filsystem, og per-sektor-headers, som ISO forventer fjernet.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;bchunk&lt;&#x2F;code&gt; laver konverteringen rigtigt:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Datasport&lt;&#x2F;strong&gt; bliver til ISO 9660-filer (&lt;code&gt;.iso&lt;&#x2F;code&gt;) — 2352-byte cd-sektorer bliver trimmet til 2048-byte ISO-sektorer, headers smidt væk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lydspor&lt;&#x2F;strong&gt; bliver til 16-bit stereo 44,1 kHz &lt;code&gt;.wav&lt;&#x2F;code&gt;-filer, hver med en ordentlig WAV-header.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Derefter kan du &lt;code&gt;mount -o loop&lt;&#x2F;code&gt; &lt;code&gt;.iso&lt;&#x2F;code&gt;’en, afspille &lt;code&gt;.wav&lt;&#x2F;code&gt;’erne eller fodre dem til en brænder.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;debian-ubuntu-mint&quot;&gt;Debian &#x2F; Ubuntu &#x2F; Mint&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install bchunk
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;macos-homebrew&quot;&gt;macOS (Homebrew)&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;brew install bchunk
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;arch-manjaro&quot;&gt;Arch &#x2F; Manjaro&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S bchunk
# eller fra AUR: yay -S bchunk
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;fedora-rhel-centos&quot;&gt;Fedora &#x2F; RHEL &#x2F; CentOS&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;bchunk&lt;&#x2F;code&gt; er ikke i standard-repoet; hent det fra RPMFusion eller byg fra kilden:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;git clone https:&#x2F;&#x2F;github.com&#x2F;hessu&#x2F;bchunk.git
cd bchunk
make
sudo cp bchunk &#x2F;usr&#x2F;local&#x2F;bin&#x2F;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;windows&quot;&gt;Windows&lt;&#x2F;h3&gt;
&lt;p&gt;Brug WSL og &lt;code&gt;apt install bchunk&lt;&#x2F;code&gt;. Der findes en gammel native port, men WSL er nemmere.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;grundlaeggende-brug&quot;&gt;Grundlæggende brug&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;bchunk game.bin game.cue game
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Output:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;game01.iso    # datasport, mountbart som ISO 9660
game02.wav    # lydspor 1
game03.wav    # lydspor 2
...
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;basename&lt;&#x2F;code&gt; (&lt;code&gt;game&lt;&#x2F;code&gt; i eksemplet) er præfikset for hver output-fil. Spornumre starter ved &lt;code&gt;01&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nyttige-options&quot;&gt;Nyttige options&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;bchunk&lt;&#x2F;code&gt; har et lille, stabilt sæt flag — de fleste er der for at håndtere specifikke cd-særheder.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-v&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — verbose. Printer hvert spor, efterhånden som det behandles. Brug den første gang, du kører det, for at bekræfte, at du får det sporlayout, du forventer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-w&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — skriv &lt;code&gt;.wav&lt;&#x2F;code&gt;-filer (default). Eksplicit form.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-r&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — rå lydoutput i stedet for &lt;code&gt;.wav&lt;&#x2F;code&gt;. Nyttigt hvis du piper ind i &lt;code&gt;sox&lt;&#x2F;code&gt; eller &lt;code&gt;ffmpeg&lt;&#x2F;code&gt; og ikke vil have et ekstra header-skrællende skridt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-p&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — &lt;strong&gt;Psx&#x2F;PlayStation-mode&lt;&#x2F;strong&gt;. Behandler Mode 2-sektorer mere løst — nødvendigt for mange PlayStation-cd-images, hvor cue-sheetet er upræcist.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-s&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — byt byte-rækkefølge på lydspor. Nødvendigt hvis &lt;code&gt;.bin&lt;&#x2F;code&gt;’en er produceret af en ripper, der skrev little-endian-lyd, hvor &lt;code&gt;bchunk&lt;&#x2F;code&gt; forventer big-endian (eller omvendt). Symptom: output-&lt;code&gt;.wav&lt;&#x2F;code&gt; lyder som hvid støj.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-W&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — skriv &lt;code&gt;.wav&lt;&#x2F;code&gt; med en verificeret (i stedet for beregnet) header-størrelse. Sjældent nødvendigt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-E&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — brug de nøjagtige spor-grænser fra cue-sheetet i stedet for at prøve sig frem. Brug dette hvis lydspor lyder klippet i starten eller slutningen.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;mount-af-den-resulterende-iso&quot;&gt;Mount af den resulterende .iso&lt;&#x2F;h2&gt;
&lt;p&gt;På Linux:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir &#x2F;mnt&#x2F;cd
sudo mount -o loop game01.iso &#x2F;mnt&#x2F;cd
ls &#x2F;mnt&#x2F;cd
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;På macOS:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;hdiutil attach game01.iso
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;almindelige-faldgruber&quot;&gt;Almindelige faldgruber&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;illegal-or-unsupported-track-type-eller-tomt-output&quot;&gt;“Illegal or unsupported track type” eller tomt output&lt;&#x2F;h3&gt;
&lt;p&gt;Dit cue-sheet er malformet eller refererer til en &lt;code&gt;.bin&lt;&#x2F;code&gt;-størrelse, der ikke matcher. Åbn &lt;code&gt;.cue&lt;&#x2F;code&gt;’en i en teksteditor — den er klartekst — og tjek:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FILE &quot;...&quot;&lt;&#x2F;code&gt;-linjen peger på det rigtige &lt;code&gt;.bin&lt;&#x2F;code&gt;-filnavn, case-sensitivt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;TRACK&lt;&#x2F;code&gt;-entries er nummereret sekventielt med typerne &lt;code&gt;MODE1&#x2F;2352&lt;&#x2F;code&gt;, &lt;code&gt;MODE2&#x2F;2352&lt;&#x2F;code&gt; eller &lt;code&gt;AUDIO&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Index-entries (&lt;code&gt;INDEX 00&lt;&#x2F;code&gt;, &lt;code&gt;INDEX 01&lt;&#x2F;code&gt;) er MM:SS:FF, hvor FF er frames (0–74).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;lydspor-lyder-som-statisk&quot;&gt;Lydspor lyder som statisk&lt;&#x2F;h3&gt;
&lt;p&gt;Byte-rækkefølge-mismatch. Prøv igen med &lt;code&gt;-s&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;bchunk -s game.bin game.cue game
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;enkelt-iso-er-fin-men-lydspor-er-stille-eller-afkortede&quot;&gt;Enkelt &lt;code&gt;.iso&lt;&#x2F;code&gt; er fin, men lydspor er stille eller afkortede&lt;&#x2F;h3&gt;
&lt;p&gt;Prøv &lt;code&gt;-E&lt;&#x2F;code&gt; for at tvinge cue-sheet-eksakte grænser:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;bchunk -E game.bin game.cue game
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;playstation-psx-image-splitter-ikke-rent&quot;&gt;PlayStation&#x2F;PSX-image splitter ikke rent&lt;&#x2F;h3&gt;
&lt;p&gt;Brug &lt;code&gt;-p&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;bchunk -p psx.bin psx.cue psx
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Det er den mest almindelige klage på fora — PSX-cues er næsten altid Mode 2, og &lt;code&gt;bchunk&lt;&#x2F;code&gt; uden &lt;code&gt;-p&lt;&#x2F;code&gt; er streng overfor dem.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;flere-bin-filer-refereret-i-cue-sheetet&quot;&gt;Flere &lt;code&gt;.bin&lt;&#x2F;code&gt;-filer refereret i cue-sheetet&lt;&#x2F;h3&gt;
&lt;p&gt;Nogle rippere producerer én &lt;code&gt;.bin&lt;&#x2F;code&gt; pr. spor plus et samlende cue-sheet. &lt;code&gt;bchunk&lt;&#x2F;code&gt; forventer én &lt;code&gt;.bin&lt;&#x2F;code&gt; for hele skiven. Concatener dem først med &lt;code&gt;cat track01.bin track02.bin ... &amp;gt; combined.bin&lt;&#x2F;code&gt; og peg et single-file-cue på &lt;code&gt;combined.bin&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;alternativer-vaerd-at-kende&quot;&gt;Alternativer værd at kende&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cdemu&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — user-space cd-emulator til Linux. Kan mounte en &lt;code&gt;.bin&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.cue&lt;&#x2F;code&gt; direkte uden at splitte. Nyttigt, hvis du bare vil &lt;em&gt;læse&lt;&#x2F;em&gt; datasporet midlertidigt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ecm-tools&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — andet format (&lt;code&gt;.ecm&lt;&#x2F;code&gt;), men samme problemområde. Værd at kende, hvis du støder på det.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;7z&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;p7zip&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — nyere 7-Zip-versioner kan liste og uddrage ISO 9660-datasport fra en rå &lt;code&gt;.bin&lt;&#x2F;code&gt;, men kan ikke redde lyd som &lt;code&gt;.wav&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ffmpeg&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — hvis du vil have MP3 &#x2F; FLAC &#x2F; Opus i stedet for &lt;code&gt;.wav&lt;&#x2F;code&gt;, pipe rå-outputtet: &lt;code&gt;bchunk -r game.bin game.cue game &amp;amp;&amp;amp; ffmpeg -f s16be -ar 44100 -ac 2 -i game02.raw game02.flac&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;hvorfor-det-stadig-er-nyttigt-i-2026&quot;&gt;Hvorfor det stadig er nyttigt i 2026&lt;&#x2F;h2&gt;
&lt;p&gt;Optisk-medie-imaging har været et løst problem i årtier, men &lt;code&gt;.bin&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.cue&lt;&#x2F;code&gt; er stadig default-output fra &lt;code&gt;cdrdao&lt;&#x2F;code&gt;, stadig det gamle arkiver er lagret som, og stadig det, der dukker op, når nogen rækker dig en cd-backup, der ikke er en ISO. &lt;code&gt;bchunk&lt;&#x2F;code&gt; er et ~1.000-liniers C-program, skrevet i sen-1990’erne, der gør ét job korrekt og knap har ændret sig i tyve år. Det er i alle store distributioner, det kompilerer rent på moderne systemer, og det er det rigtige værktøj.&lt;&#x2F;p&gt;
&lt;p&gt;Hvis du prøver at redde data fra et gammelt cd-image: start her.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>binlist.net — hvordan et ferie-sideprojekt fra Fuerteventura blev til iinlist.com</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/binlist-net-iinlist-com-historien/"/>
        <id>https://www.x2q.net/da/post/binlist-net-iinlist-com-historien/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/binlist-net-iinlist-com-historien/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;binlist.net&quot;&gt;binlist.net&lt;&#x2F;a&gt; er en &lt;strong&gt;gratis HTTP-API&lt;&#x2F;strong&gt;, der tager de første 6–8 cifre af et kortnummer (&lt;strong&gt;BIN&lt;&#x2F;strong&gt; eller &lt;strong&gt;IIN&lt;&#x2F;strong&gt;) og returnerer udsteder-bank, land, kort-netværk (Visa, Mastercard osv.), korttype (debit&#x2F;credit&#x2F;prepaid) og kategori. Jeg startede den &lt;strong&gt;i august 2013 på ferie på Fuerteventura&lt;&#x2F;strong&gt;, fordi jeg skulle bruge BIN-opslag til et andet projekt, og alt der fandtes var enten betalingspligtigt, forældet eller bag en tvivlsom scraper. Det var mit &lt;strong&gt;første Go-projekt nogensinde&lt;&#x2F;strong&gt;, ramte &lt;strong&gt;100.000 queries&#x2F;dag&lt;&#x2F;strong&gt; inden for uger og krydsede &lt;strong&gt;1 million queries&#x2F;dag i 2015&lt;&#x2F;strong&gt;. Den er stadig online, stadig gratis, stadig &lt;code&gt;curl&lt;&#x2F;code&gt;-venlig. Den kommercielle variant, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;iinlist.com&quot;&gt;iinlist.com&lt;&#x2F;a&gt;, er den, jeg medstiftede efter binlist.nets succes; det er samme idé med &lt;strong&gt;betalingsindustri-præcision&lt;&#x2F;strong&gt;, &lt;strong&gt;8-cifret IIN-understøttelse&lt;&#x2F;strong&gt; (påkrævet af ISO&#x2F;IEC 7812 siden 2022), &lt;strong&gt;ARDEF-baserede ranges&lt;&#x2F;strong&gt; og en SLA — bygget til banker, PSP’er, fraud-teams og issuere, der har brug for at behandle BIN-data som produktions-data.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bin-vs-iin-et-grundkursus-pa-en-paragraf&quot;&gt;BIN vs IIN — et grundkursus på én paragraf&lt;&#x2F;h2&gt;
&lt;p&gt;De første seks (historisk) eller otte (siden 2017, obligatorisk fra 2022) cifre af et kortnummer er &lt;strong&gt;Issuer Identification Number&lt;&#x2F;strong&gt; (IIN). Det gamle navn, stadig vidt brugt, er &lt;strong&gt;Bank Identification Number&lt;&#x2F;strong&gt; (BIN). Givet en BIN&#x2F;IIN kan du afgøre:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Netværk&lt;&#x2F;strong&gt; — Visa, Mastercard, Amex, Discover, JCB, UnionPay, Diners.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Udsteder&lt;&#x2F;strong&gt; — banken eller fintech’en, der udstedte kortet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Land&lt;&#x2F;strong&gt; — udstederens land, ikke nødvendigvis kortholderens, men en nyttig proxy for risiko-scoring, skatte-logik (EU&#x2F;EØS moms-OSS) og brugeroplevelse (foretrukket sprog, lokale betalingsmetoder).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;&#x2F;strong&gt; — debit, credit, prepaid, deferred debit, charge.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kategori &#x2F; produkt&lt;&#x2F;strong&gt; — Classic, Gold, Platinum, Business, Corporate osv. Nyttigt til acceptance-cost-routing (erhvervskort koster mere at modtage).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Alt dette er “følsomt” i den forstand, at udstedere ikke offentliggør fulde BIN-tabeller, og kort-netværkene betragter dem som proprietære. I praksis lækker BIN-ranges konstant — hver autorisation, netværket router, hver chargeback-dispute — og der er en hel bibranche omkring at holde rimeligt præcise BIN-tabeller.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-jeg-byggede-binlist-net-pa-ferie&quot;&gt;Hvorfor jeg byggede binlist.net på ferie&lt;&#x2F;h2&gt;
&lt;p&gt;Sommer 2013. &lt;strong&gt;Playitas, sydlige Fuerteventura&lt;&#x2F;strong&gt; — resortet på Atlanterhavs-siden nede ved Gran Tarajal. Lejet lejlighed, lille balkon, kanariefuglevinden gør sit. Jeg havde en idé til et sideprojekt, der skulle slå kort op via BIN, og jeg ville ikke betale en betalings-leverandør €200&#x2F;md for det. De eksisterende gratis muligheder var:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wikipedias IIN-liste&lt;&#x2F;strong&gt; — rimelig præcis for velkendte netværk, elendig dækning for niche-udstedere, opdateret af frivillige, der ikke arbejder i payments.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Indsatte CSV’er på fora&lt;&#x2F;strong&gt; — anstændig dækning for US-udstedere, altid forældet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Google Fusion Tables&lt;&#x2F;strong&gt; — udfaset af Google samme år.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Scrapere af merchant-bankers opslagsformer&lt;&#x2F;strong&gt; — ToS-overtrædende, skrøbelige.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Det jeg ville have, var &lt;code&gt;curl http:&#x2F;&#x2F;example.com&#x2F;40012345&lt;&#x2F;code&gt; der returnerer ren JSON. Så jeg byggede det.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;stakken-dengang&quot;&gt;Stakken (dengang)&lt;&#x2F;h3&gt;
&lt;p&gt;Det var &lt;strong&gt;mit første Go-projekt nogensinde&lt;&#x2F;strong&gt;. Jeg havde læst om Go et stykke tid og ville have en lille, velafgrænset undskyldning for at prøve det; en single-endpoint JSON-API over en in-memory BIN-tabel var perfekt. Ruby&#x2F;Sinatra ville have været hurtigere at taste for mig, men jeg ville lære noget, og memory- og latency-karakteristikken af en Go-binary viste sig at være præcis det, en gratis-tier offentlig API havde brug for.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Go&lt;&#x2F;strong&gt; — en enkelt binary, &lt;code&gt;net&#x2F;http&lt;&#x2F;code&gt;, ingen framework. Hele serveren fyldte nogle hundrede linjer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;In-memory BIN-range-tabel&lt;&#x2F;strong&gt;, bygget ved boot fra en ~300 MB kilde-fil. Opslag var O(log n) over et sorteret slice.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Deployet på én Hetzner-VM&lt;&#x2F;strong&gt; fra dag ét (jeg overvejede kortvarigt Heroku, men Heroku’s gratis dyno-memory-grænser kunne ikke rumme en fuldt indlæst BIN-tabel).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JSON + XML + CSV&lt;&#x2F;strong&gt;-svarformater, fordi 2013.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Dataseed&lt;&#x2F;strong&gt; fra en kombination af offentlige Wikipedia-scrapes, den gamle “Mars Base”-CSV fra 2009 og et sæt ranges, jeg havde akkumuleret på arbejde.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Samlet build-tid på den balkon: en weekend — hvoraf cirka halvdelen var mig, der fandt ud af &lt;code&gt;go build&lt;&#x2F;code&gt;, &lt;code&gt;GOPATH&lt;&#x2F;code&gt; (Go-moduler fandtes ikke endnu) og hvordan interfaces virkede. Jeg købte domænet mandag morgen, deployede binaryen og tweetede om det.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;trafik-kurven&quot;&gt;Trafik-kurven&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Uge 1:&lt;&#x2F;strong&gt; et par hundrede queries&#x2F;dag, mest mig, der testede.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Måned 1:&lt;&#x2F;strong&gt; ~&lt;strong&gt;100.000 queries&#x2F;dag&lt;&#x2F;strong&gt;, efter udviklere på Stack Overflow og et par e-handels-fora fandt den.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;I begyndelsen af 2015:&lt;&#x2F;strong&gt; krydsede &lt;strong&gt;1 million queries&#x2F;dag&lt;&#x2F;strong&gt; vedholdende, med spikes over 2M under flash-sale-events hos merchants, der kaldte den på hver checkout-page-load.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;At skalere til det punkt kostede næsten ingenting, fordi Go’s single-binary-fodaftryk betød, at en ~€5&#x2F;md VPS klarede det hele; flaskehalsen var længe NIC’en, ikke CPU eller memory.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;13-ar-senere&quot;&gt;13 år senere&lt;&#x2F;h3&gt;
&lt;p&gt;binlist.net kører stadig. Den er blevet flyttet infrastruktur nogle gange — Hetzner-VM → Hetzner-flåde → en lille flåde bag Cloudflare — og dataseed’et er blevet opdateret løbende, men API-overfladen (og det meste af den oprindelige Go-kode) er den samme. I dag serverer den &lt;strong&gt;titusinder af millioner opslag pr. måned&lt;&#x2F;strong&gt;, gratis, uden API-nøgle, med en soft-rate-limit på anonyme kaldere for at holde den ærlig.&lt;&#x2F;p&gt;
&lt;p&gt;Den har &lt;strong&gt;~2.000 Google-visninger&#x2F;md&lt;&#x2F;strong&gt; for queries som “binlist”, “bin list bank identification number”, “list of bank identification numbers” — den samler stadig den lange hale af udviklere op, der skriver samme spørgsmål, jeg skrev i Google i 2013.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-iinlist-com-findes&quot;&gt;Hvorfor iinlist.com findes&lt;&#x2F;h2&gt;
&lt;p&gt;binlist.nets data er god nok til “hvilket land er dette kort fra”-beslutninger — risiko-scoring, valuta-præsentation, analytics. Den er &lt;strong&gt;ikke&lt;&#x2F;strong&gt; god nok til:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Acceptance-cost-routing&lt;&#x2F;strong&gt;, hvor du router erhvervskorts-transaktioner gennem en anden processor.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Interchange++-modellering&lt;&#x2F;strong&gt;, hvor margin-forskellen mellem Classic og Platinum Mastercard er rigtige penge.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Compliance&lt;&#x2F;strong&gt; — ISO&#x2F;IEC 7812-migrationen fra 6-cifrede BIN’er til 8-cifrede IIN’er, obligatorisk fra 2022, brød en masse “jeg bruger bare de første seks cifre”-logik.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Co-badged kort&lt;&#x2F;strong&gt; (f.eks. Dankort + Visa Debit), hvor to netværk begge hævder kortet, og routing-beslutningen er forretningskritisk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ARDEF-præcision&lt;&#x2F;strong&gt; — Visas Account Range Definition File er sandhedskilden; du vil virkelig have data afledt af ARDEF til noget, der kører i produktion.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;iinlist.com løser det, kommercielt. Jeg medstiftede den med et lille team af folk, der kender payments-data professionelt. Det er produktet, som binlist.net er gratis-tier-annoncen for. Nogle af vores kunder er navne, du ville genkende; de fleste er ikke. De kommer alle til samme konklusion: &lt;strong&gt;BIN-data der er “stort set rigtige” koster mere i forkerte beslutninger, end præcise data koster i licens-gebyr&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-iinlist-com-specifikt-er&quot;&gt;Hvad iinlist.com specifikt er&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;8-cifret IIN-understøttelse&lt;&#x2F;strong&gt; på tværs af alle netværk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Daglige opdateringer&lt;&#x2F;strong&gt; afledt af ARDEF + netværks-feeds + udsteder-annonceringer + intern verificering.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rigere enrichment&lt;&#x2F;strong&gt;: korttype, produkt-kategori, udsteder-land, udsteder-branding, regulatoriske klassifikationer (commercial vs consumer, prepaid-flag osv.).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SLA og support&lt;&#x2F;strong&gt;. Du kan oprette en ticket, og den når faktisk et menneske.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;On-prem &#x2F; self-hosted&lt;&#x2F;strong&gt;-mulighed for kunder, hvis compliance ikke tillader “BIN-opslag som tredjeparts-API-kald i autorisations-stien”.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Prissætning&lt;&#x2F;strong&gt; der giver mening for både en startende fintech (månedlig plan) og en etableret acquirer (årlig, ubegrænset).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kan-jeg-bare-bruge-binlist-net-kommercielt&quot;&gt;Kan jeg bare bruge binlist.net kommercielt?&lt;&#x2F;h2&gt;
&lt;p&gt;Du kan bruge binlist.net, som du vil; der er ingen gate. Men:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Ingen SLA, ingen oppetidsgaranti, ingen kontrakt. Det er et sideprojekt, der er blevet oppe i 13 år.&lt;&#x2F;li&gt;
&lt;li&gt;Rate-limits på anonym trafik træder i kraft ved produktions-volumen. Køb en licens fra iinlist.com, og problemet er løst.&lt;&#x2F;li&gt;
&lt;li&gt;Hvis din regulator spørger, hvor dine BIN-data kommer fra, er “en gratis API, min udvikler fandt” ikke det svar, du vil give.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Til hobby, demo eller prototype: binlist.net er perfekt. Til alt, hvor forkerte BIN-data bliver en KPI: iinlist.com.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;brug-af-binlist-net-i-dag&quot;&gt;Brug af binlist.net i dag&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;$ curl -sH &amp;quot;Accept-Version: 3&amp;quot; https:&#x2F;&#x2F;lookup.binlist.net&#x2F;45717360
{
  &amp;quot;number&amp;quot;: { &amp;quot;length&amp;quot;: 16, &amp;quot;luhn&amp;quot;: true },
  &amp;quot;scheme&amp;quot;: &amp;quot;visa&amp;quot;,
  &amp;quot;type&amp;quot;: &amp;quot;debit&amp;quot;,
  &amp;quot;brand&amp;quot;: &amp;quot;Visa&#x2F;Dankort&amp;quot;,
  &amp;quot;country&amp;quot;: {
    &amp;quot;numeric&amp;quot;: &amp;quot;208&amp;quot;,
    &amp;quot;alpha2&amp;quot;: &amp;quot;DK&amp;quot;,
    &amp;quot;name&amp;quot;: &amp;quot;Denmark&amp;quot;,
    &amp;quot;emoji&amp;quot;: &amp;quot;🇩🇰&amp;quot;,
    &amp;quot;currency&amp;quot;: &amp;quot;DKK&amp;quot;,
    &amp;quot;latitude&amp;quot;: 56,
    &amp;quot;longitude&amp;quot;: 10
  },
  &amp;quot;bank&amp;quot;: {
    &amp;quot;name&amp;quot;: &amp;quot;Jyske Bank A&#x2F;S&amp;quot;,
    &amp;quot;url&amp;quot;: &amp;quot;www.jyskebank.dk&amp;quot;,
    &amp;quot;phone&amp;quot;: &amp;quot;+4589893300&amp;quot;,
    &amp;quot;city&amp;quot;: &amp;quot;Silkeborg&amp;quot;
  }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Accept-Version: 3&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — pin’er til API v3.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Anonym rate-limit&lt;&#x2F;strong&gt; — dokumenteret på siden, rigeligt til almindelig brug.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ingen garantier&lt;&#x2F;strong&gt; — hvis svaret er forkert, indsend en rettelse på GitHub-repoet. Til kommercielle garantier: se iinlist.com.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;er-bin-iin-data-reguleret&quot;&gt;Er BIN-&#x2F;IIN-data reguleret?&lt;&#x2F;h3&gt;
&lt;p&gt;BIN-ranges i sig selv er ikke persondata under GDPR — en BIN identificerer en udsteder, ikke en person. Kombination af en BIN med et fuldt kortnummer er en anden historie og falder under PCI-DSS.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-aendrede-sig-med-8-cifret-iin-migrationen&quot;&gt;Hvad ændrede sig med 8-cifret IIN-migrationen?&lt;&#x2F;h3&gt;
&lt;p&gt;ISO&#x2F;IEC 7812 formaliserede 8-cifrede IIN’er i 2017 med en hård migrations-deadline i april 2022 for de store netværk. Hvis din kode stadig behandler kun de første seks cifre som udsteder-identifikatoren, fejlrouter du lydløst en voksende del af din trafik — moderne Visa- og Mastercard-udsteder-ranges er defineret ved 8 cifre.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-ikke-bare-sla-op-pa-klient-siden&quot;&gt;Hvorfor ikke bare slå op på klient-siden?&lt;&#x2F;h3&gt;
&lt;p&gt;Det kan du, med en statisk liste i browseren. Men du accepterer et trade-off: friskhed (den statiske liste er forældet inden for uger) eller bundle-størrelse (den nuværende BIN-tabel er megabytes ukomprimeret). En server-side-API er det konventionelle svar.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;logger-binlist-net-de-bin-er-jeg-slar-op&quot;&gt;Logger binlist.net de BIN’er, jeg slår op?&lt;&#x2F;h3&gt;
&lt;p&gt;Kun aggregeret analytics — nok til at opdage misbrug og rate-limite. Enkelte opslag er ikke knyttet til en bruger. iinlist.com har en strammere no-logging-holdning til kunder, hvor det betyder noget.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-kildekoden-open-source&quot;&gt;Er kildekoden open source?&lt;&#x2F;h3&gt;
&lt;p&gt;API-overfladen af binlist.net er på GitHub med retningslinjer for data-rettelser. Data-ingestion-pipelinen er ikke open source; den afhænger af netværks-feeds, der kræver licenser.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-binlist-net-og-iinlist-com-samme-firma&quot;&gt;Er binlist.net og iinlist.com samme firma?&lt;&#x2F;h3&gt;
&lt;p&gt;Adskilte projekter, overlappende oprindelse, samme operatør på min side. binlist.net er en personlig gratis-tjeneste; iinlist.com er et kommercielt selskab med medstiftere og medarbejdere. De to er driftsmæssigt uafhængige, men deler institutionel viden om BIN-data, som ikke er nem at akkumulere fra bunden.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tretten-ar-inde&quot;&gt;Tretten år inde&lt;&#x2F;h2&gt;
&lt;p&gt;Det, jeg finder mest interessant ved binlist.net, er ikke trafikken — det er &lt;strong&gt;den slags spørgsmål&lt;&#x2F;strong&gt;, udviklere stadig skriver ind i Google i 2026: “what is a bin list”, “bin number example”, “list of issuer identification numbers”. Det er nøjagtig de queries, jeg skrev i 2013 på balkonen i Playitas. Payments som industri fortsætter med at tilføje lag, men de grundlæggende spørgsmål ændrer sig ikke.&lt;&#x2F;p&gt;
&lt;p&gt;Hvis du sidder på en strand med en laptop, og du har en kløe til et sideprojekt, der klør din egen ryg: byg det — og prøv imens det sprog, du har haft lyst til at lære. Nogle gange viser det sig, at mange har samme kløe, og tretten år senere har du en nyttig ting at pege dem på og et arbejdende kendskab til Go.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Mit CM3588-projekt — 4-NVMe ARM64 hjemme-NAS på 10 W tomgang</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/cm3588-hjemme-nas-projekt/"/>
        <id>https://www.x2q.net/da/post/cm3588-hjemme-nas-projekt/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/cm3588-hjemme-nas-projekt/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.friendlyelec.com&#x2F;wiki&#x2F;index.php&#x2F;CM3588_NAS_Kit&quot;&gt;FriendlyElec CM3588 NAS Kit&lt;&#x2F;a&gt; er et RK3588-baseret compute-modul på en carrier-board med &lt;strong&gt;fire M.2 NVMe-pladser (PCIe 3.0 x1 hver)&lt;&#x2F;strong&gt;, &lt;strong&gt;2,5 GbE&lt;&#x2F;strong&gt;, &lt;strong&gt;2× HDMI ud&lt;&#x2F;strong&gt;, &lt;strong&gt;USB 3.0&lt;&#x2F;strong&gt; og en 8-kernet ARMv8-CPU (4× Cortex-A76 + 4× Cortex-A55). Fuldt lastet med fire NVMe-drev går den i tomgang på ca. &lt;strong&gt;10 W&lt;&#x2F;strong&gt;, peaker omkring 20 W under tung I&#x2F;O, og læser&#x2F;skriver en NVMe på ca. 1 GB&#x2F;s (bus-grænsen, ikke drevet). Min egen kører Debian på mainline-kernel, med ZFS på root, fire 2 TB NVMe-drev i en &lt;code&gt;raidz2&lt;&#x2F;code&gt;-pool, Samba til LAN-shares og Tailscale til adgang uden for LAN. Den har erstattet en tower-PC med TrueNAS og skåret NAS-strømforbruget med ca. 60 W.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-netop-dette-board&quot;&gt;Hvorfor netop dette board&lt;&#x2F;h2&gt;
&lt;p&gt;Jeg havde kørt en tower-PC som hjemme-NAS i årevis: en brugt desktop, seks 3,5“-harddiske og en støjende blæser. Det virkede, men den trak 70–80 W tomgang og stod i et skab, der skulle have aktiv udluftning. Harddiskene var højlydte nok til, at jeg havde flyttet dem til det fjerneste hjørne af huset.&lt;&#x2F;p&gt;
&lt;p&gt;Tre ting, jeg ville have af en afløser:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kun NVMe.&lt;&#x2F;strong&gt; Roterende harddiske er billigere pr. terabyte, men støjen, vibrationen og varmen er ikke værd for et hjemme-NAS på nogle få terabyte. 4× 2 TB NVMe er rigeligt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ARM, for strømforbrugets skyld.&lt;&#x2F;strong&gt; Et x86-board med 4× PCIe-pladser forbundet til NVMe ville trække 30–40 W tomgang. ARM kan klare det på 10.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mainline Linux, ikke en leverandør-fork.&lt;&#x2F;strong&gt; Jeg vil have &lt;code&gt;apt-get dist-upgrade&lt;&#x2F;code&gt; til at virke, &lt;code&gt;zfs&lt;&#x2F;code&gt; til at bygge fra DKMS mod en nyere kernel og ingen tre år gammel vendor-BSP.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;CM3588 NAS Kit rammer alle tre.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hardware&quot;&gt;Hardware&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SoC:&lt;&#x2F;strong&gt; Rockchip RK3588 (4× Cortex-A76 @ 2,4 GHz + 4× Cortex-A55 @ 1,8 GHz, Mali-G610 GPU, 6 TOPS NPU). ARMv8.2-A.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;RAM:&lt;&#x2F;strong&gt; 8 GB LPDDR4X på det modul, jeg købte. 16 GB- og 32 GB-varianter findes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lagring:&lt;&#x2F;strong&gt; 64 GB eMMC on-module til OS + 4× M.2 Key-M 2280-pladser, hver &lt;strong&gt;PCIe Gen 3 x1&lt;&#x2F;strong&gt; (altså ~1 GB&#x2F;s pr. plads, ikke x4).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Netværk:&lt;&#x2F;strong&gt; 1× 2,5 GbE (Realtek RTL8125B).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;USB:&lt;&#x2F;strong&gt; 2× USB 3.0 Type-A, 1× USB 3.0 Type-C (DisplayPort alt-mode), 1× USB 2.0.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Video:&lt;&#x2F;strong&gt; 2× HDMI ud, 1× HDMI &lt;strong&gt;ind&lt;&#x2F;strong&gt; (RK3588’s capture-blok).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Strøm:&lt;&#x2F;strong&gt; 12 V barrel-jack. Et 60 W-strømforsyning er mere end nok.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Boardet er lille — ca. 10 × 10 cm — og passivt over SoC’en plus en lille blæser, der blæser hen over NVMe-drevene. Mit står fladt på en hylde uden kabinet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;nvme-kompatibilitetsadvarsel&quot;&gt;NVMe-kompatibilitetsadvarsel&lt;&#x2F;h3&gt;
&lt;p&gt;Den ene ting, der er værd at vide: CM3588 NAS Kit er &lt;strong&gt;ikke kompatibelt med visse WD Blue SN580- og WD Black SN850-drev&lt;&#x2F;strong&gt; — linket flapper ved boot. Jeg bruger Samsung 990 EVO og Crucial P3 Plus; begge virker fint. Tjek FriendlyElecs wiki-kompatibilitetsliste før du køber NVMe-drev.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;os-og-filsystem&quot;&gt;OS og filsystem&lt;&#x2F;h2&gt;
&lt;p&gt;Jeg kører &lt;strong&gt;Debian 13 (trixie)&lt;&#x2F;strong&gt; med &lt;strong&gt;mainline-kernel&lt;&#x2F;strong&gt; — RK3588-understøttelse er god nok fra 6.8 og frem til headless-brug. FriendlyElecs Debian-image virker ud af boksen, men jeg geninstallerer ovenpå for at få et rent Debian i stedet for deres BSP.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Root-filsystem:&lt;&#x2F;strong&gt; &lt;code&gt;ext4&lt;&#x2F;code&gt; på eMMC.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Datapool:&lt;&#x2F;strong&gt; &lt;code&gt;zfs&lt;&#x2F;code&gt; &lt;code&gt;raidz2&lt;&#x2F;code&gt; på tværs af de fire NVMe-drev. Med 4× 2 TB giver &lt;code&gt;raidz2&lt;&#x2F;code&gt; ~3,5 TB brugbart med to-disks-redundans. Ja, &lt;code&gt;raidz2&lt;&#x2F;code&gt; på fire drev er konservativt; det betyder også, at et dobbelt-svigt ikke spiser poolen, og på NVMe er rebuilden hurtig nok til, at jeg ikke mister nattesøvn over det.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ZFS-modul:&lt;&#x2F;strong&gt; DKMS mod den kørende kernel. Bygger automatisk ved kernel-opgraderinger. Har virket uden manuel indgriben på tværs af tre kernel-bumps.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ARC-tuning:&lt;&#x2F;strong&gt; Loftet ved 2 GB. Det giver headroom på et 8 GB-system.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Gennemløbet er flaskehals-begrænset af 2,5 GbE til netværks-I&#x2F;O (~280 MB&#x2F;s vedholdende), længe før ZFS eller NVMe-drevene kommer på arbejde. Lokale operationer på poolen når omkring 2 GB&#x2F;s samlet sekventiel læsning.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tjenester&quot;&gt;Tjenester&lt;&#x2F;h2&gt;
&lt;p&gt;Bevidst holdt simpelt:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Samba&lt;&#x2F;strong&gt; til SMB-shares til Mac’erne og Windows-boksen på LAN’et.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;rsync + cron&lt;&#x2F;strong&gt; til natlige backups fra tre andre maskiner.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ZFS-snapshots&lt;&#x2F;strong&gt; hver time, opbevares en uge. &lt;code&gt;zfs send&lt;&#x2F;code&gt; piper datasættet ugentligt til en offsite B2-bucket via &lt;code&gt;zfs-autobackup&lt;&#x2F;code&gt; + rclone.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Tailscale&lt;&#x2F;strong&gt; til adgang uden for LAN. Ingen port-forwarding, ingen dyndns, ingen VPN-koncentrator. SSH og Samba rider begge på Tailscale-interfacet, når jeg er væk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cockpit&lt;&#x2F;strong&gt; til det lejlighedsvise “hvorfor larmer blæseren” dashboard-øjeblik.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Det er alt. Ingen Docker swarm, ingen Kubernetes, ingen dusin sidecar-containere. Boardet har ét job — serve filer på LAN’et og lade mig trække backups offsite — og det gør det i stilhed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;strom-og-stoj&quot;&gt;Strøm og støj&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tomgang&lt;&#x2F;strong&gt; (alle fire NVMe opspundne, ingen trafik): &lt;strong&gt;~10 W&lt;&#x2F;strong&gt; ved stikkontakten.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Travlt&lt;&#x2F;strong&gt; (NVMe-læsning mætter 2,5 GbE, ZFS-ARC varm): &lt;strong&gt;~18–20 W&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Peak&lt;&#x2F;strong&gt; (scrub af hele poolen, alle kerner varme): &lt;strong&gt;~25 W&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sammenlignet med den 70–80 W-tower, den afløste, er strøm-ROI’en alene omkring &lt;strong&gt;500 kWh&#x2F;år&lt;&#x2F;strong&gt;, eller cirka &lt;strong&gt;1.500 kr&#x2F;år&lt;&#x2F;strong&gt; ved danske privat-takster. Boardet betalte sig selv tilbage på ca. et år.&lt;&#x2F;p&gt;
&lt;p&gt;Støj: i praksis uhørlig fra mere end en meters afstand. Blæseren er lille, og 80 % af tiden kører den knap nok.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-virkede-ikke-eller-tog-arbejde&quot;&gt;Hvad virkede ikke, eller tog arbejde&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vendor-kernel.&lt;&#x2F;strong&gt; FriendlyElecs leverede kernel er deres fork af 6.1 med RK-specifikke patches. Det virker til deres nøglefærdige NAS-image, men DKMS-ZFS-builds er bøvlede mod den. Skiftet til mainline løste det.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;HDMI-capture.&lt;&#x2F;strong&gt; RK3588 har en hardware HDMI-input-blok. I mainline er den stadig eksperimentel. Jeg har en vag brugscase for den (trække signal fra en gammel enhed til arkivering), men har ikke fået det til at virke end-to-end. Parkeret indtil videre.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;NPU.&lt;&#x2F;strong&gt; De 6 TOPS NPU er underudnyttet. Mainline har basal RKNPU-understøttelse, men til noget praktisk skal du stadig bruge FriendlyElecs &lt;code&gt;rknn-toolkit2&lt;&#x2F;code&gt;. Ikke et problem for et NAS.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;hvorfor-ikke-x86&quot;&gt;Hvorfor ikke x86?&lt;&#x2F;h3&gt;
&lt;p&gt;En x86-mini-PC med 4× NVMe er ~2× tomgangsstrømmen og ~2× købsprisen (når du tæller kabinet, PSU og CPU med). Til et hjemme-NAS, hvor arbejdsbyrden er “serve filer” snarere end “kør 40 containere”, vinder ARM.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-ikke-raspberry-pi-5&quot;&gt;Hvorfor ikke Raspberry Pi 5?&lt;&#x2F;h3&gt;
&lt;p&gt;Pi 5 har én PCIe 2.0 x1-lane eksponeret via en HAT — du kan bolte en NVMe på, men kun én, med loft ved ~500 MB&#x2F;s. CM3588 har fire lanes ved PCIe 3.0 direkte forbundet. En anden klasse af board.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-ikke-openmediavault-eller-truenas&quot;&gt;Hvorfor ikke OpenMediaVault eller TrueNAS?&lt;&#x2F;h3&gt;
&lt;p&gt;Begge ville virke. Jeg foretrækker rent Debian + Samba + ZFS, fordi opgraderingsstien for Debian er velkendt for mig, og OMV&#x2F;TrueNAS er et lag, jeg skulle lære på ny. Det afhænger af dig.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-raidz2-pa-fire-drev-og-ikke-mirror-mirror&quot;&gt;Hvorfor &lt;code&gt;raidz2&lt;&#x2F;code&gt; på fire drev og ikke &lt;code&gt;mirror + mirror&lt;&#x2F;code&gt;?&lt;&#x2F;h3&gt;
&lt;p&gt;Overvejet. &lt;code&gt;mirror + mirror&lt;&#x2F;code&gt; giver hurtigere skriv og lettere udvidelse, men kun 4 TB brugbart fra 4× 2 TB — det samme som &lt;code&gt;raidz2&lt;&#x2F;code&gt;. Med &lt;code&gt;raidz2&lt;&#x2F;code&gt; kan to vilkårlige drev svigte; med stripede mirrors kan du miste to drev, men kun hvis de er i forskellige mirror-par. På fire drev er kapaciteten identisk, og &lt;code&gt;raidz2&lt;&#x2F;code&gt; har den stærkere fejltolerance.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kan-den-kore-plex-jellyfin&quot;&gt;Kan den køre Plex &#x2F; Jellyfin?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja, og RK3588’s hardware H.265&#x2F;VP9&#x2F;AV1-decode-blok klarer det tunge arbejde. Jellyfin med &lt;code&gt;rkmpp&lt;&#x2F;code&gt;-accelereret decoding håndterer 4K HEVC-transcodes på omkring 3× realtid. Jeg kører ingen af delene på denne boks — min Plex bor et andet sted — men det er realistisk.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gar-den-i-suspend&quot;&gt;Går den i suspend?&lt;&#x2F;h3&gt;
&lt;p&gt;Ikke pålideligt. Lad den stå tændt; tomgang er alligevel 10 W.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-med-stoj-og-varme-om-sommeren&quot;&gt;Hvad med støj og varme om sommeren?&lt;&#x2F;h3&gt;
&lt;p&gt;Passivt køleplade plus en lille blæser. I en dansk sommer (20–25 °C i rummet) topper den omkring 55 °C die-temperatur under en ZFS-scrub. Ingen throttling målt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dom&quot;&gt;Dom&lt;&#x2F;h2&gt;
&lt;p&gt;Hvis du vil have et &lt;strong&gt;lydsvagt, strømbesparende, ren-NVMe-hjemme-NAS med nok PCIe til at betyde noget&lt;&#x2F;strong&gt; og er villig til at bruge en aften på Debian + ZFS, er CM3588 NAS Kit den bedste mulighed, jeg har fundet. Det er ikke det billigste — en brugt Optiplex er billigere på forhånd — men på tre års TCO inkl. strøm betaler det sig tydeligt tilbage.&lt;&#x2F;p&gt;
&lt;p&gt;RK3588 i sig selv er en overraskende kapabel SoC til homelab-arbejdsbyrder. Da mainline-kernel-understøttelsen landede, holdt jeg op med at behandle den som “en ARM-kuriositet” og begyndte at behandle den som default-svar på små altid-tændte servere.&lt;&#x2F;p&gt;
&lt;p&gt;To år inde er min blevet genstartet to gange (en gang for en kernel-opgradering, en gang fordi jeg flyttede hylden). Jeg ville købe den igen.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>pdfcrack — gendan glemte PDF-kodeord på Linux og macOS (2026)</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/gendan-pdf-kodeord-pdfcrack/"/>
        <id>https://www.x2q.net/da/post/gendan-pdf-kodeord-pdfcrack/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/gendan-pdf-kodeord-pdfcrack/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; &lt;strong&gt;&lt;code&gt;pdfcrack&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; er et kommandolinjeværktøj, der gendanner &lt;strong&gt;user-kodeordet&lt;&#x2F;strong&gt; eller &lt;strong&gt;owner-kodeordet&lt;&#x2F;strong&gt; på en krypteret PDF via brute-force eller dictionary-angreb. Det er lille, skrevet i C, kører på Linux&#x2F;macOS&#x2F;WSL og håndterer enhver krypterings-profil, PDF har leveret — 40-bit RC4, 128-bit RC4, 128-bit AES, 256-bit AES (PDF 1.7 + 2.0). Det er &lt;strong&gt;single-threaded og kun CPU&lt;&#x2F;strong&gt;, så det er hurtigt på den svage gamle RC4-40-kryptering, men stadig langsommere, efterhånden som PDF’er bliver moderne. Installeres med &lt;code&gt;apt install pdfcrack&lt;&#x2F;code&gt; (Debian&#x2F;Ubuntu), &lt;code&gt;brew install pdfcrack&lt;&#x2F;code&gt; (macOS) eller bygges fra kilden. Når &lt;code&gt;pdfcrack&lt;&#x2F;code&gt; er for langsom, så skift til &lt;strong&gt;&lt;code&gt;pdf2john&lt;&#x2F;code&gt; + &lt;code&gt;hashcat&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; på en GPU.&lt;&#x2F;p&gt;
&lt;p&gt;Dette indlæg antager, at du &lt;strong&gt;har autorisation til at gendanne kodeordet&lt;&#x2F;strong&gt; på PDF’en — dit eget dokument, en kundes eller en lovligt anskaffet fil. Angrib ikke PDF’er, du ikke ejer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;user-kodeord-vs-owner-kodeord&quot;&gt;User-kodeord vs owner-kodeord&lt;&#x2F;h2&gt;
&lt;p&gt;PDF har to kodeord:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User-kodeord&lt;&#x2F;strong&gt; — kræves for at &lt;strong&gt;åbne og læse&lt;&#x2F;strong&gt; dokumentet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Owner-kodeord&lt;&#x2F;strong&gt; — kræves for at &lt;strong&gt;fjerne begrænsninger&lt;&#x2F;strong&gt; (print, kopi, rediger) på et dokument, der åbner uden et user-kodeord.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Mange “beskyttede” PDF’er er kun owner-kodeord-begrænsede: de åbner fint, men print og kopi er deaktiveret af læseren. Dem er trivielt at låse op — &lt;code&gt;qpdf --decrypt&lt;&#x2F;code&gt; eller et hvilket som helst &lt;code&gt;pdftk&lt;&#x2F;code&gt;-lignende værktøj fjerner owner-only-restriktioner uden at skulle gætte noget. &lt;code&gt;pdfcrack&lt;&#x2F;code&gt; er til det sværere tilfælde: en &lt;strong&gt;user-kodeord-beskyttet PDF, du slet ikke kan åbne&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Tjek hvilken du har med at gøre:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ qpdf --show-encryption dokument.pdf
R = 6
P = -3904
User password = 
Supplied password is owner password
extract for accessibility: allowed
extract for any purpose: not allowed
print low resolution: allowed
print high resolution: not allowed
modify document assembly: not allowed
modify forms: not allowed
modify annotations: not allowed
modify other: not allowed
stream encryption method: AESv3
string encryption method: AESv3
file encryption method: AESv3
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;R = ...&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; fortæller dig revisionen&#x2F;profilen. &lt;code&gt;R=2&lt;&#x2F;code&gt; = RC4-40, &lt;code&gt;R=3&lt;&#x2F;code&gt; = RC4-128, &lt;code&gt;R=4&lt;&#x2F;code&gt; = AES-128, &lt;code&gt;R=5&#x2F;6&lt;&#x2F;code&gt; = AES-256.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;“Supplied password is owner password”&lt;&#x2F;strong&gt; + “User password = (tom)” betyder, du kan åbne den og bare skal fjerne restriktioner. Brug &lt;code&gt;qpdf --decrypt --password=&#x27;&#x27; input.pdf output.pdf&lt;&#x2F;code&gt;, og du er færdig.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;# Debian &#x2F; Ubuntu &#x2F; Mint &#x2F; Kali
sudo apt install pdfcrack

# macOS (Homebrew)
brew install pdfcrack

# Arch &#x2F; Manjaro
sudo pacman -S pdfcrack

# Fedora &#x2F; RHEL
sudo dnf install pdfcrack

# Fra kilden
wget https:&#x2F;&#x2F;sourceforge.net&#x2F;projects&#x2F;pdfcrack&#x2F;files&#x2F;latest&#x2F;download -O pdfcrack.tar.gz
tar xf pdfcrack.tar.gz &amp;amp;&amp;amp; cd pdfcrack-*
make
sudo cp pdfcrack &#x2F;usr&#x2F;local&#x2F;bin&#x2F;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;benchmark&quot;&gt;Benchmark&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;$ pdfcrack -b
Benchmark:	Average Speed (calls &#x2F; second):
MD5:			1728972.6
MD5_50 (fast):		 97879.3
MD5_50 (slow):		 69167.0

RC4 (40, static):	606555.3
RC4 (40, no check):	598050.0
RC4 (128, no check):	590141.7

Benchmark:	Average Speed (passwords &#x2F; second):
PDF (40, user):		453510.2
PDF (40, owner):	220250.0
PDF (40, owner, fast):	499995.0

PDF (128, user):	 22000.0
PDF (128, owner):	 10408.7
PDF (128, owner, fast):	 22220.0
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Oversat:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RC4-40&lt;&#x2F;strong&gt; (PDF 1.3, meget gammel) — ~450k kodeord&#x2F;sek. Brute-force af et fuldt 8-tegns alfanumerisk space: ~1 uge på én core.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;RC4-128 &#x2F; AES-128&lt;&#x2F;strong&gt; — ~22k kodeord&#x2F;sek. Brute-force bliver urealistisk over længde 6 med et hvilket som helst charset.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AES-256 (R=5&#x2F;6)&lt;&#x2F;strong&gt; — endnu langsommere; &lt;code&gt;pdfcrack&lt;&#x2F;code&gt; understøtter det, men reelt kun til dictionary-angreb mod små ordlister.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Har du brug for mere fart end det, så vil du bruge &lt;code&gt;hashcat&lt;&#x2F;code&gt; på en GPU. Tal i bunden.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dictionary-angreb&quot;&gt;Dictionary-angreb&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;pdfcrack -f dokument.pdf -w &#x2F;usr&#x2F;share&#x2F;wordlists&#x2F;rockyou.txt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-f&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — målfil.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-w &amp;lt;fil&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — ordliste, én kandidat pr. linje.&lt;&#x2F;li&gt;
&lt;li&gt;Valgfri &lt;strong&gt;&lt;code&gt;-o&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — angrib kun owner-kodeord (ignorer user-kodeord). Default er at prøve user-kodeord først.&lt;&#x2F;li&gt;
&lt;li&gt;Valgfri &lt;strong&gt;&lt;code&gt;-u&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — angrib kun user-kodeord.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Har du kontekst — kodeordet er sandsynligvis et fornavn, et årstal, en projektkode — saml en mindre målrettet liste. Generiske lister er en lang skud, når du er forbi top ti tusind indgange.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;brute-force-angreb&quot;&gt;Brute-force-angreb&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;pdfcrack -f dokument.pdf -c &amp;#39;abcdefghijklmnopqrstuvwxyz0123456789&amp;#39; -n 4 -m 8
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-c &amp;lt;charset&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — tegnsæt at prøve. Default inkluderer et bredt ASCII-område.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-n &amp;lt;min&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — minimumslængde.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-m &amp;lt;max&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — maksimumslængde.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Juster &lt;code&gt;-c&lt;&#x2F;code&gt; aggressivt. Ved du, at kodeordet er alt-lowercase, så giv det ikke uppercase. Ved du, det har et ciffer til sidst, så brug et mask-angreb (hashcat-territorium, ikke pdfcrack).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;genoptag-et-langt-korsel&quot;&gt;Genoptag et langt kørsel&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;pdfcrack -f dokument.pdf -w rockyou.txt -s &#x2F;tmp&#x2F;state.sav
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;-s&lt;&#x2F;code&gt; skriver periodiske save-filer; hvis du stopper pdfcrack og genstarter, så giv &lt;code&gt;-l &#x2F;tmp&#x2F;state.sav&lt;&#x2F;code&gt; for at genoptage.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvornar-du-skal-skifte-til-hashcat&quot;&gt;Hvornår du skal skifte til hashcat&lt;&#x2F;h2&gt;
&lt;p&gt;Til enhver moderne PDF (R=4, 5 eller 6 — altså AES-128 eller AES-256) bliver &lt;code&gt;pdfcrack&lt;&#x2F;code&gt;s single-core-fart flaskehalsen. &lt;code&gt;pdf2john&lt;&#x2F;code&gt; + &lt;code&gt;hashcat&lt;&#x2F;code&gt; giver dig to til tre størrelsesordener mere throughput på en GPU.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;trin-1-traek-hashen-ud&quot;&gt;Trin 1: træk hashen ud&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;$ &#x2F;usr&#x2F;share&#x2F;john&#x2F;pdf2john.pl dokument.pdf &amp;gt; hash.txt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;(På Debian&#x2F;Ubuntu: &lt;code&gt;apt install john&lt;&#x2F;code&gt; leverer &lt;code&gt;pdf2john.pl&lt;&#x2F;code&gt;.)&lt;&#x2F;p&gt;
&lt;h3 id=&quot;trin-2-identificer-hash-mode&quot;&gt;Trin 2: identificér hash-mode&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;$ head -1 hash.txt
dokument.pdf:$pdf$5*6*256*-1028*1*16*...
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Map de første to tal:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$pdf$1*2*...&lt;&#x2F;code&gt; → &lt;strong&gt;mode 10400&lt;&#x2F;strong&gt; (PDF 1.1–1.3, RC4-40, user)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;$pdf$1*2*...&lt;&#x2F;code&gt; med owner-salt → &lt;strong&gt;mode 10410 &#x2F; 10420&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;$pdf$2*3*...&lt;&#x2F;code&gt; → &lt;strong&gt;mode 10500&lt;&#x2F;strong&gt; (PDF 1.4–1.6, RC4-128 &#x2F; AES-128)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;$pdf$5*5*...&lt;&#x2F;code&gt; → &lt;strong&gt;mode 10600&lt;&#x2F;strong&gt; (PDF 1.7 r=5, AES-256)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;$pdf$5*6*...&lt;&#x2F;code&gt; → &lt;strong&gt;mode 10700&lt;&#x2F;strong&gt; (PDF 1.7 r=6 &#x2F; PDF 2.0, AES-256 med PBKDF2)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;trin-3-kor-hashcat&quot;&gt;Trin 3: kør hashcat&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;hashcat -m 10700 hash.txt &#x2F;sti&#x2F;til&#x2F;ordliste.txt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;På en enkelt moderne GPU (fx RTX 4090):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mode 10400 (RC4-40):&lt;&#x2F;strong&gt; ~10 milliarder H&#x2F;s — ethvert praktisk kodeord gendannes øjeblikkeligt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mode 10500 (RC4-128 &#x2F; AES-128):&lt;&#x2F;strong&gt; ~100 millioner H&#x2F;s.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mode 10700 (AES-256, PBKDF2):&lt;&#x2F;strong&gt; ~50.000 H&#x2F;s. Det er ved design — PBKDF2-iterationerne gør brute-force dyrt.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For mode 10700 betyder din angrebsstrategi mere end rå fart. Dictionary + regler + mask-angreb målrettet mod sandsynlige kodeord-mønstre er størrelsesordener mere produktive end udtømmende brute-force.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;almindelige-faldgruber&quot;&gt;Almindelige faldgruber&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;filen-ser-ud-til-at-vaere-krypteret-men-jeg-kan-abne-den-uden-kodeord&quot;&gt;“Filen ser ud til at være krypteret, men jeg kan åbne den uden kodeord”&lt;&#x2F;h3&gt;
&lt;p&gt;Du ser på owner-only-restriktioner. Brug &lt;code&gt;qpdf --decrypt input.pdf output.pdf&lt;&#x2F;code&gt; — ingen cracking nødvendigt.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pdfcrack-korer-men-finder-aldrig-noget&quot;&gt;pdfcrack kører, men finder aldrig noget&lt;&#x2F;h3&gt;
&lt;p&gt;Tre sandsynlige årsager:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kodeordet er længere &#x2F; mere komplekst, end dit charset × længde dækker.&lt;&#x2F;strong&gt; Øg &lt;code&gt;-m&lt;&#x2F;code&gt; og&#x2F;eller udvid &lt;code&gt;-c&lt;&#x2F;code&gt;, eller skift til en dictionary.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kodeordet indeholder ikke-ASCII-tegn.&lt;&#x2F;strong&gt; pdfcracks charset er ASCII som default; ikke-ASCII-user-kodeord i gamle PDF’er brugte varierende encodings (PDFDocEncoding, UTF-16). Prøv &lt;code&gt;pdf2john&lt;&#x2F;code&gt; + hashcat, som håndterer encoding’en korrekt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Det er AES-256 (R=6), og du er tålmodig.&lt;&#x2F;strong&gt; Se hastighedsnoterne ovenfor — kun realistisk med en dictionary.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;only-aes-256-is-supported-fejl-eller-lignende&quot;&gt;“Only AES-256 is supported”-fejl eller lignende&lt;&#x2F;h3&gt;
&lt;p&gt;Din &lt;code&gt;pdfcrack&lt;&#x2F;code&gt;-build er gammel. Ubuntu LTS leverer nogle gange en version, der ikke fuldt håndterer R=6. Byg fra kilden eller skift til &lt;code&gt;pdf2john&lt;&#x2F;code&gt; + &lt;code&gt;hashcat&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pdf-en-abner-men-print-kopi-er-blokeret&quot;&gt;PDF’en åbner, men print&#x2F;kopi er blokeret&lt;&#x2F;h3&gt;
&lt;p&gt;Det er kun owner-kodeord-begrænset. &lt;code&gt;qpdf --decrypt&lt;&#x2F;code&gt; uden at behøve et kodeord virker som regel:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;qpdf --decrypt --password=&amp;#39;&amp;#39; input.pdf output.pdf
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;defensiv-pointe&quot;&gt;Defensiv pointe&lt;&#x2F;h2&gt;
&lt;p&gt;Til alt, du vil have til at forblive krypteret i 2026, brug &lt;strong&gt;AES-256 med en PDF 2.0 (R=6) kodeord&lt;&#x2F;strong&gt;. Det er profilen med PBKDF2-nøgle-afledning, der gør offline-angreb dyre på nuværende hardware.&lt;&#x2F;p&gt;
&lt;p&gt;Og som altid betyder kodeordets længde mere end noget andet. En 20-tegns tilfældig passphrase er brute-force-intraktabel mod enhver nuværende GPU. Et 6-tegns “smart substitutions”-kodeord er en kaffepause på en RTX 4090.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;er-pdfcrack-stadig-vedligeholdt&quot;&gt;Er pdfcrack stadig vedligeholdt?&lt;&#x2F;h3&gt;
&lt;p&gt;Opdateres langsomt. Kodebasen håndterer alle nuværende PDF-krypterings-profiler; det er bare ikke her, performance-arbejdet foregår længere (det er hashcat).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bruger-pdfcrack-gpu&quot;&gt;Bruger pdfcrack GPU?&lt;&#x2F;h3&gt;
&lt;p&gt;Nej. Kun CPU, single-threaded. Til GPU-arbejde, brug &lt;code&gt;pdf2john&lt;&#x2F;code&gt; + &lt;code&gt;hashcat&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kan-pdfcrack-gendanne-dokumentet-hvis-skaberen-ryddede-user-kodeordet-men-beholdt-owner-kodeordet&quot;&gt;Kan pdfcrack gendanne dokumentet, hvis skaberen ryddede user-kodeordet, men beholdt owner-kodeordet?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja — brug &lt;code&gt;qpdf --decrypt&lt;&#x2F;code&gt; først; hvis det ikke fuldt dekrypterer, angriber &lt;code&gt;pdfcrack -o&lt;&#x2F;code&gt; owner-kodeordet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;laekker-pdfcrack-min-pdf-nogle-steder&quot;&gt;Lækker pdfcrack min PDF nogle steder?&lt;&#x2F;h3&gt;
&lt;p&gt;Nej. Den er lokal. Alt online-only (“crack min PDF på cloud-service-X.com”) indebærer at uploade filen, hvilket du ikke skal gøre for fortroligt materiale.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-hvis-jeg-kun-vagt-husker-kodeordet&quot;&gt;Hvad hvis jeg kun vagt husker kodeordet?&lt;&#x2F;h3&gt;
&lt;p&gt;Skriv ned, hvad du husker — sandsynlige ord, sandsynlige cifre, sandsynlig længde — og byg en målrettet ordliste eller et &lt;code&gt;hashcat&lt;&#x2F;code&gt;-mask (&lt;code&gt;-a 3 ?l?l?l?l?l?d?d?d?d&lt;&#x2F;code&gt;). Det slår enhver generisk liste.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kan-jeg-gendanne-tekst-fra-en-aes-256-pdf-uden-kodeordet&quot;&gt;Kan jeg gendanne tekst fra en AES-256-PDF uden kodeordet?&lt;&#x2F;h3&gt;
&lt;p&gt;Nej. AES-256 med PBKDF2 (R=6) er, så vidt offentlig kryptanalyse går, ikke brudt. Hvis kodeordet er stærkt og tabt, er indholdet tabt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opsummering&quot;&gt;Opsummering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kun owner-kodeord?&lt;&#x2F;strong&gt; &lt;code&gt;qpdf --decrypt&lt;&#x2F;code&gt;, ingen cracking nødvendigt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;User-kodeord-beskyttet, gammel (R=2&#x2F;3)?&lt;&#x2F;strong&gt; &lt;code&gt;pdfcrack&lt;&#x2F;code&gt; med en dictionary virker fint.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Moderne (R=4&#x2F;5&#x2F;6)?&lt;&#x2F;strong&gt; &lt;code&gt;pdf2john&lt;&#x2F;code&gt; + &lt;code&gt;hashcat&lt;&#x2F;code&gt; på en GPU, målrettet angreb.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Stærk 20-tegns tilfældig?&lt;&#x2F;strong&gt; Accepter tabet.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>fcrackzip — gendan glemte zip-kodeord på Linux, macOS og Windows (2026)</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/gendan-zip-kodeord-fcrackzip/"/>
        <id>https://www.x2q.net/da/post/gendan-zip-kodeord-fcrackzip/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/gendan-zip-kodeord-fcrackzip/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; &lt;strong&gt;&lt;code&gt;fcrackzip&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; er et gratis, open-source kommandolinjeværktøj til at gendanne kodeordet på en krypteret &lt;code&gt;.zip&lt;&#x2F;code&gt;-fil. Det understøtter &lt;strong&gt;brute-force&lt;&#x2F;strong&gt; (over et bruger-defineret charset og længde) og &lt;strong&gt;dictionary&lt;&#x2F;strong&gt;-angreb, virker på Linux&#x2F;macOS&#x2F;WSL, og er det rigtige første værktøj, når du skal gendanne et glemt kodeord på en zip, du lovligt ejer. Det er kun hurtigt mod &lt;strong&gt;klassisk ZipCrypto&lt;&#x2F;strong&gt;-kryptering; til den nyere &lt;strong&gt;AES-256&lt;&#x2F;strong&gt;-zip-profil virker &lt;code&gt;fcrackzip&lt;&#x2F;code&gt; ikke — så skal du bruge &lt;code&gt;zip2john&lt;&#x2F;code&gt; + &lt;code&gt;hashcat&lt;&#x2F;code&gt; i stedet. Installeres med &lt;code&gt;apt install fcrackzip&lt;&#x2F;code&gt; (Debian&#x2F;Ubuntu), &lt;code&gt;brew install fcrackzip&lt;&#x2F;code&gt; (macOS) eller bygges fra kilden.&lt;&#x2F;p&gt;
&lt;p&gt;Dette indlæg går gennem de praktiske tilfælde. Det antager, at du &lt;strong&gt;har autorisation til at gendanne kodeordet&lt;&#x2F;strong&gt; — dine egne filer, en kundes, en CTF. Brug det ikke på zips, du ikke ejer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;# Debian &#x2F; Ubuntu &#x2F; Mint &#x2F; Kali
sudo apt install fcrackzip

# macOS (Homebrew)
brew install fcrackzip

# Arch &#x2F; Manjaro
sudo pacman -S fcrackzip

# Windows
# Brug WSL2 + Ubuntu og `apt install fcrackzip`.
# En native .exe findes, men er gammel — WSL er simplere.

# Fra kilden
git clone https:&#x2F;&#x2F;github.com&#x2F;hyc&#x2F;fcrackzip.git
cd fcrackzip &amp;amp;&amp;amp; .&#x2F;configure &amp;amp;&amp;amp; make
sudo cp fcrackzip &#x2F;usr&#x2F;local&#x2F;bin&#x2F;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;tjek-forst-hvilken-kryptering-din-zip-bruger&quot;&gt;Tjek først, hvilken kryptering din zip bruger&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;fcrackzip&lt;&#x2F;code&gt; håndterer kun &lt;strong&gt;klassisk ZipCrypto&lt;&#x2F;strong&gt; (den originale, svage PKZIP-kryptering). Til moderne &lt;strong&gt;AES-128 &#x2F; AES-256&lt;&#x2F;strong&gt;-zips (introduceret af WinZip 9 i 2003, nu default i nogle værktøjer) vil &lt;code&gt;fcrackzip&lt;&#x2F;code&gt; lydløst fejle i at finde kodeordet, uanset hvor længe du lader det køre.&lt;&#x2F;p&gt;
&lt;p&gt;Hurtigste tjek med &lt;code&gt;zipinfo&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ zipinfo -v arkiv.zip | head -40
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Led efter &lt;code&gt;WinZip AES encryption, strength 3&lt;&#x2F;code&gt; (= AES-256). Ser du det, så spring til hashcat-sektionen.&lt;&#x2F;p&gt;
&lt;p&gt;Eller med &lt;code&gt;7z&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ 7z l -slt arkiv.zip | grep -i &amp;#39;method\|encrypted&amp;#39;
Method = ZipCrypto Store          ← fcrackzip virker
Method = AES-256 Deflate          ← fcrackzip virker IKKE
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;grundlaeggende-brute-force&quot;&gt;Grundlæggende brute-force&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;fcrackzip -v -b -c &amp;#39;a1&amp;#39; -p aaaa -u arkiv.zip
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-v&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — verbose.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-b&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — brute-force-mode.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-c &#x27;a1&#x27;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — charset. &lt;code&gt;a&lt;&#x2F;code&gt; = små bogstaver &lt;code&gt;a–z&lt;&#x2F;code&gt;, &lt;code&gt;A&lt;&#x2F;code&gt; = store, &lt;code&gt;1&lt;&#x2F;code&gt; = cifre, &lt;code&gt;!&lt;&#x2F;code&gt; = printbare symboler. Kombiner: &lt;code&gt;&#x27;aA1!&#x27;&lt;&#x2F;code&gt; = alt printbart ASCII (94 tegn).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-p aaaa&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — start-kodeord (definerer minimum-længde = 4 her).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-u&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — rapporterer kun, hvis den dekrypterede fil “unzipper” rent (filtrerer falske positive — ZipCrypto har en lille CRC, som mange tilfældige kodeord passerer).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Længde: &lt;code&gt;-p aaaaa&lt;&#x2F;code&gt; starter ved 5 tegn. &lt;code&gt;fcrackzip&lt;&#x2F;code&gt; har ikke et &lt;code&gt;--max-length&lt;&#x2F;code&gt;-flag; det inkrementerer start-kodeordet gennem charsettet uendeligt, så &lt;strong&gt;at lade det køre til “færdigt” ved længde 8 på det fulde printbare ASCII-charset er ca. 94⁸ ≈ 6×10¹⁵ kandidater&lt;&#x2F;strong&gt; — ikke realistisk. Du afgrænser angrebet ved at vælge et rimeligt max charset + længde eller ved at bruge en dictionary.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dictionary-angreb&quot;&gt;Dictionary-angreb&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;fcrackzip -v -D -u -p &#x2F;usr&#x2F;share&#x2F;wordlists&#x2F;rockyou.txt arkiv.zip
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-D&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — dictionary-mode.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-p &amp;lt;fil&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — ordliste-fil, én kandidat pr. linje.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-u&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — verificér via unzip, som før.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; er den standard 14 M-indgange-ordliste, der leveres med Kali og er tilgængelig overalt. Har du kontekst om kodeordet (det er nogens navn + årstal, det er et projektkodenavn), så saml en mindre målrettet ordliste — hit-raterne er som regel meget højere end med en generisk liste.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hastighed-og-hvad-du-kan-forvente&quot;&gt;Hastighed og hvad du kan forvente&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;fcrackzip&lt;&#x2F;code&gt; er single-threaded og CPU-bundet. På en moderne laptop ser du groft:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;10–30 millioner ZipCrypto-forsøg pr. sekund pr. core&lt;&#x2F;strong&gt; for et dictionary-angreb mod en typisk zip.&lt;&#x2F;li&gt;
&lt;li&gt;Brute-force en anelse hurtigere pga. mindre streng-I&#x2F;O.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Det gør den fin til:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dictionary-angreb&lt;&#x2F;strong&gt; mod en hvilken som helst rimelig ordliste.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kort brute-force&lt;&#x2F;strong&gt; (4–6 tegn alfanumerisk).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Det gør den uegnet til:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Længde 8+ med symboler&lt;&#x2F;strong&gt; — du når aldrig i mål.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AES-256-zips&lt;&#x2F;strong&gt; — forkert værktøj.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;hvornar-du-skal-skifte-til-hashcat&quot;&gt;Hvornår du skal skifte til hashcat&lt;&#x2F;h2&gt;
&lt;p&gt;Hvis &lt;code&gt;fcrackzip&lt;&#x2F;code&gt; er for langsom, eller zip’en er AES-krypteret, så gå over til &lt;code&gt;hashcat&lt;&#x2F;code&gt;. Det er det general-purpose kodeord-cracking-værktøj, GPU-accelereret, og håndterer både ZipCrypto og AES-WinZip-hashes.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;trin-1-traek-hashen-ud-med-zip2john&quot;&gt;Trin 1: træk hashen ud med &lt;code&gt;zip2john&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;zip2john&lt;&#x2F;code&gt; er en del af John the Ripper. Ubuntu: &lt;code&gt;apt install john&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ zip2john arkiv.zip &amp;gt; hash.txt
$ cat hash.txt
arkiv.zip:$zip2$*0*3*0*...*$&#x2F;zip2$::arkiv.zip:hemmelig.pdf:&#x2F;sti&#x2F;til&#x2F;arkiv.zip
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;trin-2-fodr-den-til-hashcat&quot;&gt;Trin 2: fodr den til hashcat&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;# ZipCrypto (mode 17200, 17210, 17220, 17225 afhængigt af komprimering)
hashcat -m 17200 hash.txt &#x2F;sti&#x2F;til&#x2F;ordliste.txt

# AES-krypteret WinZip (mode 13600)
hashcat -m 13600 hash.txt &#x2F;sti&#x2F;til&#x2F;ordliste.txt
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;På en enkelt moderne diskret GPU (fx RTX 4090) ser du:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ZipCrypto: ~5–10 milliarder H&#x2F;s&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;WinZip AES-256: ~10–50 millioner H&#x2F;s&lt;&#x2F;strong&gt; (meget langsommere, fordi AES er dyrt, og der er PBKDF2-iterationer involveret)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;hashcats rule-engine, mask-angreb (&lt;code&gt;-a 3&lt;&#x2F;code&gt;) og combinator-mode (&lt;code&gt;-a 1&lt;&#x2F;code&gt;) gør den massivt mere fleksibel end &lt;code&gt;fcrackzip&lt;&#x2F;code&gt;. Til alt ikke-trivielt er den det rigtige værktøj.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;almindelige-faldgruber&quot;&gt;Almindelige faldgruber&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;password-found-pw-abc-men-unzip-beder-stadig-om-et-kodeord&quot;&gt;“PASSWORD FOUND!!!!: pw == abc”, men &lt;code&gt;unzip&lt;&#x2F;code&gt; beder stadig om et kodeord&lt;&#x2F;h3&gt;
&lt;p&gt;Du brugte ikke &lt;code&gt;-u&lt;&#x2F;code&gt;. fcrackzips CRC-tjek har falske positive. Kør igen med &lt;code&gt;-u&lt;&#x2F;code&gt; for at verificere kandidater mod et rigtigt dekomprimerings-forsøg.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;forskellige-filer-i-samme-zip-har-forskellige-kodeord&quot;&gt;Forskellige filer i samme zip har forskellige kodeord&lt;&#x2F;h3&gt;
&lt;p&gt;Klassisk PKZIP understøtter per-fil-kodeord. &lt;code&gt;fcrackzip&lt;&#x2F;code&gt; angriber én fil ad gangen; giv &lt;code&gt;-l &amp;lt;filnavn&amp;gt;&lt;&#x2F;code&gt; (eller lad den vælge den første krypterede) hvis du skal være specifik.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fcrackzip-finder-kodeordet-men-jeg-kan-stadig-ikke-unzippe&quot;&gt;fcrackzip finder kodeordet, men jeg kan stadig ikke unzippe&lt;&#x2F;h3&gt;
&lt;p&gt;Charset&#x2F;locale-problem. Hvis kodeordet indeholder ikke-ASCII-tegn, har zip’ens skaber måske brugt en anden encoding end din terminal. Prøv &lt;code&gt;unzip -P &quot;$(echo -n &#x27;passwd&#x27; | iconv -t cp437)&quot; arkiv.zip&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;aes-krypteret-og-dictionary-finder-det-ikke&quot;&gt;AES-krypteret, og dictionary finder det ikke&lt;&#x2F;h3&gt;
&lt;p&gt;hashcat + regler + en målrettet ordliste er løsningen. Se migrations-trinnene ovenfor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;defensiv-pointe&quot;&gt;Defensiv pointe&lt;&#x2F;h2&gt;
&lt;p&gt;Hvis du laver zip-filer, der skal forblive krypterede: brug &lt;strong&gt;AES-256&lt;&#x2F;strong&gt;, ikke ZipCrypto. De fleste moderne værktøjer (&lt;code&gt;7z&lt;&#x2F;code&gt;, &lt;code&gt;zip&lt;&#x2F;code&gt; fra InfoZIP med &lt;code&gt;-e&lt;&#x2F;code&gt;, WinZip, Keka) giver dig AES, hvis du beder om det. Default på &lt;code&gt;zip&lt;&#x2F;code&gt; er desværre stadig ZipCrypto på mange systemer. Tjek med &lt;code&gt;7z l -slt arkiv.zip&lt;&#x2F;code&gt; før du sender den afsted.&lt;&#x2F;p&gt;
&lt;p&gt;Og vælg et kodeord med længde, ikke smarthed. &lt;code&gt;hashcat&lt;&#x2F;code&gt; er ligeglad med, hvor mærkeligt dit substitutions-mønster er; det handler kun om entropi. En fire-ords passphrase (&lt;code&gt;correct-horse-battery-staple&lt;&#x2F;code&gt;-stil, ~44 bit) er fin mod offline ZipCrypto-angreb; et tilfældigt 12-tegns blandet kodeord (~78 bit) er fint mod GPU-AES-angreb. Alt kortere er genvindbart.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;er-fcrackzip-lovligt&quot;&gt;Er fcrackzip lovligt?&lt;&#x2F;h3&gt;
&lt;p&gt;At gendanne kodeord på filer du ejer eller har autorisation til at tilgå, er lovligt i alle jurisdiktioner, jeg kender. At gøre det på en andens fil uden autorisation er uautoriseret adgang — samme lov som for enhver anden computer-indtrængen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-fcrackzip-vedligeholdt&quot;&gt;Er fcrackzip vedligeholdt?&lt;&#x2F;h3&gt;
&lt;p&gt;Kun lige. Kodebasen har været stabil i femten-plus år. Til moderne arbejde har kombinationen af &lt;code&gt;zip2john&lt;&#x2F;code&gt; + &lt;code&gt;hashcat&lt;&#x2F;code&gt; overtaget.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kan-fcrackzip-bruge-en-gpu&quot;&gt;Kan fcrackzip bruge en GPU?&lt;&#x2F;h3&gt;
&lt;p&gt;Nej. &lt;code&gt;fcrackzip&lt;&#x2F;code&gt; er kun CPU. Hvis GPU er det, du har, så gå direkte til hashcat.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;handterer-fcrackzip-7z-rar-gpg-filer&quot;&gt;Håndterer fcrackzip .7z, .rar, .gpg-filer?&lt;&#x2F;h3&gt;
&lt;p&gt;Nej — kun klassisk PKZIP &lt;code&gt;.zip&lt;&#x2F;code&gt;. Til &lt;code&gt;.7z&lt;&#x2F;code&gt;, brug &lt;code&gt;7z2john&lt;&#x2F;code&gt; + hashcat (mode 11600). Til &lt;code&gt;.rar&lt;&#x2F;code&gt;, &lt;code&gt;rar2john&lt;&#x2F;code&gt; + hashcat (mode 12500 &#x2F; 13000). Til &lt;code&gt;.gpg&lt;&#x2F;code&gt;, &lt;code&gt;gpg2john&lt;&#x2F;code&gt; + hashcat (mode 17010+).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvordan-genererer-jeg-en-malrettet-ordliste&quot;&gt;Hvordan genererer jeg en målrettet ordliste?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;hashcat&lt;&#x2F;code&gt;s maskprocessor (&lt;code&gt;mp64&lt;&#x2F;code&gt;), &lt;code&gt;crunch&lt;&#x2F;code&gt; og &lt;code&gt;cewl&lt;&#x2F;code&gt; (crawler et site for kandidat-ord) er alle værd at kende. Til at gendanne et specifikt glemt kodeord er den højeste-yield-tilgang at skrive ned, hvad du husker om det — længde, sandsynlige ord, sandsynlige tal — og bygge et mask-angreb fra det.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opsummering&quot;&gt;Opsummering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fcrackzip&lt;&#x2F;code&gt; + &lt;code&gt;-D&lt;&#x2F;code&gt; + en ordliste er det rigtige første forsøg.&lt;&#x2F;li&gt;
&lt;li&gt;Virker det ikke, og det er ZipCrypto: &lt;code&gt;fcrackzip&lt;&#x2F;code&gt; + &lt;code&gt;-b&lt;&#x2F;code&gt; med et snævert charset og kort længde.&lt;&#x2F;li&gt;
&lt;li&gt;Virker det ikke, eller det er AES: &lt;code&gt;zip2john&lt;&#x2F;code&gt; + &lt;code&gt;hashcat&lt;&#x2F;code&gt; på en GPU.&lt;&#x2F;li&gt;
&lt;li&gt;Virker det ikke: dit kodeord var stærkt nok. Det er systemet, der virker som tiltænkt.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Wi-Fi-hacking gennem 25 år — 2002, 2007, 2012, 2017, 2022, 2027</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/hack-traadloest-netvaerk/"/>
        <id>https://www.x2q.net/da/post/hack-traadloest-netvaerk/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/hack-traadloest-netvaerk/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; Wi-Fi-sikkerhed har været gennem fire generationer — &lt;strong&gt;WEP&lt;&#x2F;strong&gt;, &lt;strong&gt;WPA&lt;&#x2F;strong&gt;, &lt;strong&gt;WPA2&lt;&#x2F;strong&gt;, &lt;strong&gt;WPA3&lt;&#x2F;strong&gt; — hver introduceret, fordi forgængeren var brudt. Dette indlæg går gennem seks snapshots af state of the art: &lt;strong&gt;2002&lt;&#x2F;strong&gt; (WEP, trivielt), &lt;strong&gt;2007&lt;&#x2F;strong&gt; (WEP død, WPA udbredt, offline-angreb kommer frem), &lt;strong&gt;2012&lt;&#x2F;strong&gt; (WPA2 dominerer, dictionary-angreb på GPU’er), &lt;strong&gt;2017&lt;&#x2F;strong&gt; (KRACK bryder WPA2 under de rette betingelser, PMKID-lækken i 2018), &lt;strong&gt;2022&lt;&#x2F;strong&gt; (WPA3 ruller ud, downgrade-angreb, cloud-skala-cracking), &lt;strong&gt;2027&lt;&#x2F;strong&gt; (dagens landskab: WPA3 næsten universel, 6 GHz åbner ny overflade, angreb flytter op i stakken). For hvert år opsummerer jeg angrebet, værktøjet og hvad en forsvarer burde have gjort. Kun autoriseret testning — den defensive vejledning i bunden er pointen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;overblik&quot;&gt;Overblik&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;År&lt;&#x2F;th&gt;&lt;th&gt;Dominerende standard&lt;&#x2F;th&gt;&lt;th&gt;Hovedangreb&lt;&#x2F;th&gt;&lt;th&gt;Indsats for typisk netværk&lt;&#x2F;th&gt;&lt;th&gt;Hurtigste dictionary &#x2F; nøgle-rate dengang&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2002&lt;&#x2F;td&gt;&lt;td&gt;WEP (100%)&lt;&#x2F;td&gt;&lt;td&gt;FMS statistisk IV&lt;&#x2F;td&gt;&lt;td&gt;~4M pakker &#x2F; 2–10 t på aktivt AP&lt;&#x2F;td&gt;&lt;td&gt;N&#x2F;A — nøglen udledes af IV’er&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2007&lt;&#x2F;td&gt;&lt;td&gt;WEP 35%, WPA 25%, WPA2 20%, åben 20%&lt;&#x2F;td&gt;&lt;td&gt;PTW + aircrack-ng&lt;&#x2F;td&gt;&lt;td&gt;40–85k pakker &#x2F; &amp;lt;5 min (WEP)&lt;&#x2F;td&gt;&lt;td&gt;~50–100 PSK&#x2F;s (CPU, cowpatty)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2012&lt;&#x2F;td&gt;&lt;td&gt;WPA2 ~70%&lt;&#x2F;td&gt;&lt;td&gt;Reaver (WPS) + GPU PSK dictionary&lt;&#x2F;td&gt;&lt;td&gt;11.000 WPS-PIN-forsøg &#x2F; 2–10 t&lt;&#x2F;td&gt;&lt;td&gt;~75.000 PSK&#x2F;s (GTX 580)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2017&lt;&#x2F;td&gt;&lt;td&gt;WPA2 ~85%&lt;&#x2F;td&gt;&lt;td&gt;KRACK; derefter PMKID (2018)&lt;&#x2F;td&gt;&lt;td&gt;1 pakke (PMKID) → offline dict&lt;&#x2F;td&gt;&lt;td&gt;~400.000 PSK&#x2F;s (GTX 1080)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2022&lt;&#x2F;td&gt;&lt;td&gt;WPA2 ~60%, WPA3 ~20%, mixed ~15%&lt;&#x2F;td&gt;&lt;td&gt;Dragonblood downgrade&lt;&#x2F;td&gt;&lt;td&gt;Tving WPA2-fallback, så GPU&#x2F;cloud&lt;&#x2F;td&gt;&lt;td&gt;~1,2M PSK&#x2F;s (RTX 3090), ~10M (8× A100)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2027&lt;&#x2F;td&gt;&lt;td&gt;WPA3 ~40%, mixed ~35%, WPA2 ~20%&lt;&#x2F;td&gt;&lt;td&gt;Klient-side + downgrade + chipset-FW&lt;&#x2F;td&gt;&lt;td&gt;SAE intakt; legacy WPA2 på lånt tid&lt;&#x2F;td&gt;&lt;td&gt;~5–8M PSK&#x2F;s (RTX 5090-klasse enkelt GPU)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Globale udbredelses-andele er omtrentlige, afledt af offentlige Wi-Fi-målinger (WiGLE-trends + leverandør-rapporter); regn med ± 10 procentpoint.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2002-wep-overalt-og-trivielt-brudt&quot;&gt;2002 — WEP overalt, og trivielt brudt&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Standard:&lt;&#x2F;strong&gt; IEEE 802.11b med &lt;strong&gt;WEP&lt;&#x2F;strong&gt; (Wired Equivalent Privacy). 40-bit eller 104-bit RC4-nøgle, 24-bit IV, CRC-32-integritet.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Hvad er galt med den:&lt;&#x2F;strong&gt; IV’en er for lille, nøglerne er statiske, og RC4’s initial key schedule lækker bits af nøglen, når visse IV’er bruges. Det er &lt;strong&gt;FMS-angrebet&lt;&#x2F;strong&gt; (Fluhrer, Mantin, Shamir, 2001) og dets efterkommere.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Hvad en angriber gjorde i 2002:&lt;&#x2F;strong&gt; fangede trafik med en Prism-baseret USB-adapter, indsamlede et par millioner pakker (timer på et aktivt netværk) og udtrak nøglen med &lt;strong&gt;AirSnort&lt;&#x2F;strong&gt; eller &lt;strong&gt;WEPCrack&lt;&#x2F;strong&gt;. Angrebene var så pinlige, at Wi-Fi Alliance skubbede WPA som en midlertidig firmware-patchbar løsning i 2003.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Tal (2002):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global Wi-Fi-udbredelse:&lt;&#x2F;strong&gt; ~100% WEP (WPA blev først ratificeret marts 2003).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Nøglelængde:&lt;&#x2F;strong&gt; 40 bit (eksport-grade) eller 104 bit. Irrelevant — angrebet er på IV’en, ikke på nøglen.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;IV-space:&lt;&#x2F;strong&gt; 24 bit → kun ~16,7 M mulige IV’er. Fødselsdags-kollision efter ~5.000 pakker.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;FMS-angrebets pakke-antal:&lt;&#x2F;strong&gt; ~500 k–4 M “interessante” IV-frames (få timers aktiv trafik).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Typisk crack-tid i ur-tid:&lt;&#x2F;strong&gt; 2–10 t på et travlt SOHO-netværk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Forbrugerhardware:&lt;&#x2F;strong&gt; én laptop + én Prism2&#x2F;Prism2.5 USB-dongle (~$40 brugt dengang).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Værktøjer:&lt;&#x2F;strong&gt; AirSnort, WEPCrack, Kismet til capture.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CVE’er:&lt;&#x2F;strong&gt; WEP er ikke i sig selv en CVE, men Borisov&#x2F;Goldberg&#x2F;Wagner (2001) og FMS-paperet (2001) er de kanoniske referencer.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Hvad en forsvarer burde have gjort:&lt;&#x2F;strong&gt; erkendt, at WEP ikke er en sikkerhedsfunktion, og behandle det trådløse LAN som ubetroet. Brug en VPN eller IPSec på lag 3.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2007-wep-dod-wpa-overgangsvis-wpa2-pa-vej&quot;&gt;2007 — WEP død, WPA overgangsvis, WPA2 på vej&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Standard:&lt;&#x2F;strong&gt; WPA (2003), en nød-løsning med per-pakke-nøgler (TKIP). WPA2 (2004) med AES-CCMP begynder at dukke op i hjemme-routere.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Hvad der er nyt for angribere:&lt;&#x2F;strong&gt; &lt;strong&gt;PTW-angrebet&lt;&#x2F;strong&gt; på WEP (2007) reducerer pakke-antallet fra ~1 million til ~40.000 — WEP kan nu crackes på minutter. &lt;strong&gt;aircrack-ng&lt;&#x2F;strong&gt; bliver den kanoniske toolkit. Mod WPA-Personal bliver offline-dictionary-angreb på 4-way-handshake praktiske på CPU’er: fang en handshake, fodr PSK-afledningen gennem &lt;code&gt;cowpatty&lt;&#x2F;code&gt; eller &lt;code&gt;aircrack-ng&lt;&#x2F;code&gt;, prøv dictionary-indgange én ad gangen.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Hvad angribere endnu ikke havde:&lt;&#x2F;strong&gt; meningsfuld GPU-acceleration af WPA-PSK. Dictionary-angreb var langsomme.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Tal (2007):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global udbredelse (WiGLE-målinger):&lt;&#x2F;strong&gt; WEP ~35%, WPA ~25%, WPA2 ~20%, åben ~20%.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PTW-angrebets pakke-antal:&lt;&#x2F;strong&gt; ~40.000–85.000 fangede frames for at gendanne en WEP-nøgle (ned fra millioner).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Crack-tid med aircrack-ng + pakke-injektion:&lt;&#x2F;strong&gt; &amp;lt;5 minutter, ofte under 60 sekunder.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;WPA-PSK dictionary-rate (CPU, cowpatty&#x2F;aircrack-ng):&lt;&#x2F;strong&gt; ~50–100 kandidater&#x2F;sek pr. core.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rockyou-ordliste&lt;&#x2F;strong&gt; (lækket dec. 2009): 14,3 M indgange — blev de-facto engelsk PSK-ordliste.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;WPA2 obligatorisk for Wi-Fi CERTIFIED:&lt;&#x2F;strong&gt; marts 2006.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Aircrack-ng 1.0:&lt;&#x2F;strong&gt; udgivet 2006, konsoliderede økosystemet.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Hvad en forsvarer burde have gjort:&lt;&#x2F;strong&gt; migrere til WPA2-AES-CCMP, vælg en PSK længere end nogen dictionary. Drop WEP-netværk helt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2012-wpa2-dominerer-gpu-cracking-moden&quot;&gt;2012 — WPA2 dominerer, GPU-cracking moden&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Standard:&lt;&#x2F;strong&gt; WPA2 er default på stort set al consumer-gear. WPA2-Enterprise (802.1X &#x2F; EAP) i corporate-netværk.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Hvad der er nyt for angribere:&lt;&#x2F;strong&gt; &lt;strong&gt;hashcat&lt;&#x2F;strong&gt; og &lt;strong&gt;oclHashcat&lt;&#x2F;strong&gt;, &lt;strong&gt;pyrit&lt;&#x2F;strong&gt; og &lt;strong&gt;John the Ripper&lt;&#x2F;strong&gt; gør WPA-PSK-dictionary-angrebet til et &lt;strong&gt;GPU-problem&lt;&#x2F;strong&gt;. En handshake-capture + en enkelt moderne GPU klarer titusindvis af kandidat-PSK’er pr. sekund; en lille lejet GPU-farm håndterer hundredtusinder. &lt;strong&gt;airodump-ng&lt;&#x2F;strong&gt; + &lt;strong&gt;Reaver&lt;&#x2F;strong&gt; (2011) udnytter en implementerings-fejl i &lt;strong&gt;WPS-PIN&lt;&#x2F;strong&gt; til at gendanne WPA-PSK’en helt uden en dictionary — en dødsdom for hjemme-routere med WPS-on-by-default.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Tal (2012):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global udbredelse:&lt;&#x2F;strong&gt; WPA2 ~70%, WEP ~10%, åben ~15%, WPA ~5%.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;WPS-PIN-space på papir:&lt;&#x2F;strong&gt; 10⁸ = 100 millioner. &lt;strong&gt;Effektiv&lt;&#x2F;strong&gt; angrebs-space efter Viehböck-splittet: 10⁴ + 10³ = ~11.000 forsøg.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Reaver ur-tid til at gendanne WPS-PIN → PSK:&lt;&#x2F;strong&gt; 2–10 timer mod en upatched AP.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;hashcat WPA-PSK throughput på GTX 580 (reference-GPU 2012):&lt;&#x2F;strong&gt; ~75.000 kandidater&#x2F;sek.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;hashcat WPA-PSK på en lille 4-GPU-rig fra æraen:&lt;&#x2F;strong&gt; ~300.000 kandidater&#x2F;sek, dvs. &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; (14,3 M) på ~50 sekunder.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Virkelig PSK-gendannelsesrate med rockyou + almindelige regler:&lt;&#x2F;strong&gt; ~20–25% på fangede handshakes i akademiske studier.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;WPA2-PEAP&#x2F;MSCHAPv2-hashrate (et Wi-Fi-tilstødende Enterprise-problem):&lt;&#x2F;strong&gt; titusinder af millioner&#x2F;sek på en enkelt GPU, fuldt 2²⁸-keyspace inden for et døgn.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Hvad forsvarere burde have gjort:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Slå WPS fra.&lt;&#x2F;strong&gt; De fleste routere havde den tændt som default.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Brug lange tilfældige PSK’er&lt;&#x2F;strong&gt;, ikke dictionary-ord.&lt;&#x2F;li&gt;
&lt;li&gt;Til enterprise: &lt;strong&gt;802.1X + EAP-TLS med klient-certifikater&lt;&#x2F;strong&gt;, ikke PEAP-MSCHAPv2 (som i sig selv er et GPU-problem).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;2017-krack&quot;&gt;2017 — KRACK&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Standard:&lt;&#x2F;strong&gt; WPA2 stadig overalt.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Hvad der er nyt for angribere:&lt;&#x2F;strong&gt; &lt;strong&gt;KRACK&lt;&#x2F;strong&gt; (Vanhoef, Piessens, 2017) — Key Reinstallation Attack. Det cracker ikke PSK’en. Det udnytter en subtil fejl i 4-way-handshaken, hvor, under visse betingelser (specifikt på Android 6+ og wpa_supplicant 2.4–2.6), genafspilning af handshake-meddelelse 3 får klienten til at geninstallere en &lt;strong&gt;all-zero session-nøgle&lt;&#x2F;strong&gt;. Derfra kan angriberen dekryptere udvalgt trafik og, afhængigt af cipher suite, injicere pakker.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Hvad gjorde KRACK anderledes end tidligere angreb:&lt;&#x2F;strong&gt; det ramte &lt;strong&gt;protokollen, ikke nøglen&lt;&#x2F;strong&gt;. En stærk PSK hjalp ikke. Hver WPA2-implementation havde brug for en patch. De fleste leverandører leverede en inden for uger; nogle tog år.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Også i denne æra:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PMKID hashcat-angrebet&lt;&#x2F;strong&gt; (2018, Steube). Mange AP’er lækker PMKID’en i en enkelt besked; én pakke er nok til at starte et offline PSK-angreb. Sænkede capture-barren yderligere — ingen klient-association nødvendig.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Evil twin &#x2F; captive portal-phishing.&lt;&#x2F;strong&gt; Efterhånden som enheds-UI’er blev smukkere, blev falske captive portals alarmerende effektive mod mennesker.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Tal (2017–2018):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global udbredelse:&lt;&#x2F;strong&gt; WPA2 ~85%, WEP &amp;lt;3%, åben ~10%, WPA3 endnu ikke leveret.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;KRACK CVE’er:&lt;&#x2F;strong&gt; 10 i den koordinerede offentliggørelse (CVE-2017-13077 til CVE-2017-13088).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;KRACK-berørte enheder:&lt;&#x2F;strong&gt; alle WPA2-klienter og AP’er — &lt;strong&gt;10+ milliarder&lt;&#x2F;strong&gt; endpoints. Reel patching tog år for long-tail-IoT.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Patch-latency hos leverandører:&lt;&#x2F;strong&gt; Microsoft &#x2F; de fleste Linux-distroer inden for 1 uge fra disclosure; Android 2+ måneder afhængigt af OEM; mange embedded-enheder blev aldrig patchet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PMKID-angrebets pakke-antal:&lt;&#x2F;strong&gt; &lt;strong&gt;1 enkelt frame&lt;&#x2F;strong&gt; mod 4-way-handshakens 4 frames — ingen klient-association eller deauth nødvendig.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;hashcat på GTX 1080 (reference-GPU 2017):&lt;&#x2F;strong&gt; ~400.000 WPA-PSK-kandidater&#x2F;sek — ~5× hurtigere end 2012.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;En lejet 8× 1080 Ti-instans (~$4&#x2F;t i 2017):&lt;&#x2F;strong&gt; ~3M kandidater&#x2F;sek — &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; på &amp;lt;5 sekunder.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Koordineret disclosure-forløbstid:&lt;&#x2F;strong&gt; 4 måneder fra leverandør-notificering til offentlig release.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Hvad en forsvarer burde have gjort:&lt;&#x2F;strong&gt; patch Android &#x2F; wpa_supplicant straks, håndhæv HTTPS overalt, så dekrypteret Wi-Fi-trafik er mindre nyttig, begynd at planlægge WPA3-migration.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2022-wpa3-ruller-ud-downgrade-angreb&quot;&gt;2022 — WPA3 ruller ud, downgrade-angreb&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Standard:&lt;&#x2F;strong&gt; WPA3 (2018) påkrævet til Wi-Fi CERTIFIED-enheder siden 2020. Nøgle-opgraderinger:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SAE&lt;&#x2F;strong&gt; (Simultaneous Authentication of Equals) erstatter 4-way-handshake-PSK’en — offline-dictionary-angreb bliver ufremkommelige.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;192-bit mode&lt;&#x2F;strong&gt; til Enterprise.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Forward secrecy&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PMF&lt;&#x2F;strong&gt; (Protected Management Frames) obligatorisk — neutraliserer deauth-baseret denial-of-service.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Hvad der er nyt for angribere:&lt;&#x2F;strong&gt; WPA3 er ikke brudt, men dens udrulning er for det meste ikke WPA3-&lt;strong&gt;kun&lt;&#x2F;strong&gt;. &lt;strong&gt;WPA2&#x2F;3-transition-mode&lt;&#x2F;strong&gt; — default på de fleste AP’er — betyder, at en angriber kan tvinge en downgrade og angribe som WPA2. Det er &lt;strong&gt;Dragonblood&lt;&#x2F;strong&gt; (Vanhoef, Ronen, 2019 + opfølgninger): en familie af side-channel- og downgrade-angreb mod SAE. I 2022 lukkede patchede SAE-implementationer for det meste timing-side-channels; downgrade-angrebet virker stadig på mixed-mode-netværk.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Også i denne æra:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud-skala-cracking&lt;&#x2F;strong&gt;: at leje 8× H100 eller lignende på timebasis gør PMK-dictionary-angreb praktiske på en skala, ingen amatør havde i 2012.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Chipset-firmware-sårbarheder&lt;&#x2F;strong&gt; (FragAttacks, 2021): fejl i selve Wi-Fi-stakken, under WPA-laget, lader angribere injicere frames uden at skulle bryde en handshake overhovedet.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Tal (2022):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global udbredelse:&lt;&#x2F;strong&gt; WPA2-only ~60%, WPA3 ~20%, WPA2&#x2F;3-transition-mode ~15%, WEP &amp;lt;1%.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;WPA3-understøttelse på nye routere:&lt;&#x2F;strong&gt; ~60% af forbruger-AP’er leveret i 2022 understøttede WPA3 (vs. ~10% i 2020).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Dragonblood CVE’er:&lt;&#x2F;strong&gt; 5 (CVE-2019-9494 til CVE-2019-9499).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;FragAttacks CVE’er:&lt;&#x2F;strong&gt; 12 i 2021-bundlet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;hashcat WPA-PSK på RTX 3090:&lt;&#x2F;strong&gt; ~1,2M kandidater&#x2F;sek.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;8× A100-cloud-instans:&lt;&#x2F;strong&gt; ~10M kandidater&#x2F;sek samlet. &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; på ~1,5 sekund; et 10 mia.-kandidats mask-angreb på ~17 minutter.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Pris pr. milliard PSK-forsøg på spot-cloud-GPU’er:&lt;&#x2F;strong&gt; ~$3–5.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;12-tegns fuldt tilfældig PSK-entropi:&lt;&#x2F;strong&gt; 2⁷² ≈ 4,7 × 10²¹. Ved 10M H&#x2F;s er udtømmende angreb = &lt;strong&gt;~15.000 år&lt;&#x2F;strong&gt;. Sikker.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;8-tegns små-bogstav+ciffer PSK-entropi:&lt;&#x2F;strong&gt; 2⁴¹ ≈ 2,2 × 10¹². Ved 10M H&#x2F;s: &lt;strong&gt;~2,5 døgn&lt;&#x2F;strong&gt;. Ikke sikker.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Hvad en forsvarer burde have gjort:&lt;&#x2F;strong&gt; WPA3-Personal kun (ingen WPA2-transition) på netværk, hvor du kan håndhæve det; PMF påkrævet; lang tilfældig PSK selv med SAE; hold AP-firmware opdateret.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2027-dagens-landskab&quot;&gt;2027 — dagens landskab&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Standard:&lt;&#x2F;strong&gt; Wi-Fi 6E (6 GHz) og tidlige Wi-Fi 7-udrulninger. WPA3 næsten universel på nyt gear; legacy WPA2 stadig almindelig i små virksomheder og længe-levende hjemme-netværk.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;State of the art i angreb:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SAE holder.&lt;&#x2F;strong&gt; Intet offentligt, praktisk angreb mod et velkonfigureret WPA3-Personal-netværk i 2027. Dictionary-angreb mod PSK’en er ikke fremkommelige — det er SAE’s pointe.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Downgrade-angreb&lt;&#x2F;strong&gt; er den primære ting. Ethvert netværk, der stadig annoncerer WPA2&#x2F;3-transition, kan angribes som WPA2. Modstandere kigger efter mixed-mode-SSID’er først.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;6 GHz åbner ny overflade.&lt;&#x2F;strong&gt; 6 GHz-båndet kræver WPA3 til nye standarder; men legacy-klient-bridging, IoT-enheder uden 6 GHz-understøttelse og fejlkonfigureret co-broadcast-SSID’er skaber inkonsistenser, angribere udnytter.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Klient-side-angreb.&lt;&#x2F;strong&gt; Når link-laget er sikkert, flytter angribere op. Rogue-captive-portals der snyder telefoner til at stole på et dårligt certifikat, QR-kode-tilslutning med falske SSID’er, deauth-under-roaming-angreb (sværere nu med PMF, men ikke elimineret).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Supply chain.&lt;&#x2F;strong&gt; Firmware-indlejrede bagdøre og vendor-bugs i Wi-Fi-chipsets (FragAttacks-arven) er stadig en varig kilde til exploits.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cloud-cracking er blevet commodity.&lt;&#x2F;strong&gt; Et weekend-langt SAE-offline-angreb (i de tilfælde, hvor offline-angreb er muligt, altså målet kørte en upatched SAE) koster groft prisen på en pæn middag. Det betyder for det meste intet, fordi SAE ikke er reducerbart til offline-dictionary-angreb — men det skubber økonomien på legacy-WPA2-netværk, folk ikke har migreret.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Værktøjer stadig i rotation i 2027:&lt;&#x2F;strong&gt; aircrack-ng (ældre, stadig kanonisk til captures og WPA2), hashcat (cracking), bettercap (Wi-Fi MITM &#x2F; rogue AP), airgeddon (workflow-lim) og en bølge af ESP32-baserede lomme-værktøjer til opportunistisk deauth og handshake-capture.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Tal (2027):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global udbredelse:&lt;&#x2F;strong&gt; WPA3 ~40%, WPA2&#x2F;3-transition ~35%, WPA2-only ~20%, WEP ~0,5% (lang hale af gammelt gear).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise-andel der kører WPA3-Enterprise 192-bit mode:&lt;&#x2F;strong&gt; stadig &amp;lt;10%. De fleste corporate-netværk er stadig WPA2-Enterprise med PEAP.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ny-enhed WPA3-certificering:&lt;&#x2F;strong&gt; obligatorisk for Wi-Fi 6 siden 2020, Wi-Fi 6E (6 GHz) siden 2022, Wi-Fi 7 fra launch.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;hashcat WPA-PSK på RTX 5090-klasse enkelt-GPU (2025+):&lt;&#x2F;strong&gt; ~5–8M kandidater&#x2F;sek.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;8× H100-cloud-instans:&lt;&#x2F;strong&gt; ~50M kandidater&#x2F;sek samlet. &lt;code&gt;rockyou.txt&lt;&#x2F;code&gt; på ~0,3 sekund.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SAE (WPA3-Personal) offline-angreb:&lt;&#x2F;strong&gt; ufremkommeligt ved enhver hash-rate — handshaken udleverer ikke en crackbar hash til en aflytter.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Pris for at brute-force en svag 8-tegns WPA2-PSK i 2027:&lt;&#x2F;strong&gt; &amp;lt;$10 på spot-cloud-GPU’er.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Pris for at brute-force en 12-tegns tilfældig WPA2-PSK:&lt;&#x2F;strong&gt; stadig ~$10⁹ (samme regnestykke som 2022, GPU’er 5× hurtigere → stadig årtusinder).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ESP32-S3 “Wi-Fi Nugget” &#x2F; Flipper Zero-klasse lomme-værktøjer&lt;&#x2F;strong&gt; i cirkulation i 2027: hundredtusinder af enheder. Opportunistisk handshake-capture er trivielt; PSK-cracking er stadig offline på en kraftig host.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Deauth-DoS-effektivitet:&lt;&#x2F;strong&gt; nær-nul på PMF-required-netværk; virker stadig mod de ~30% af udrullede AP’er, hvor PMF er “capable”, men ikke “required”.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Bundlinje: mod &lt;strong&gt;WPA3-Personal med SAE, PMF påkrævet og en tilfældig PSK&lt;&#x2F;strong&gt; kommer intet af 2027-værktøjssættet ind via link-laget. Mod &lt;strong&gt;en typisk 2019-vintage hjemme-router, der stadig kører WPA2 med en svag PSK og WPS valgfrit eksponeret&lt;&#x2F;strong&gt;, er en weekend på en mellem-klasse-GPU rigeligt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;defensiv-vejledning-for-2027&quot;&gt;Defensiv vejledning for 2027&lt;&#x2F;h2&gt;
&lt;p&gt;Det er den del, der betyder mere end al historien.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WPA3-Personal SAE-only eller WPA3-Enterprise med EAP-TLS.&lt;&#x2F;strong&gt; Ingen transition-mode på noget netværk, du kan kontrollere. Tjek eksplicit — mange AP’er default til transition.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PMF påkrævet, ikke valgfrit.&lt;&#x2F;strong&gt; Protected Management Frames forhindrer deauth-drevne handshake-captures og basal denial-of-service.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PSK-længde: tilfældig, ≥ 20 tegn.&lt;&#x2F;strong&gt; SAE gør korte PSK’er sikrere end de plejede at være, men ingen grund til at spille.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Slå WPS permanent fra.&lt;&#x2F;strong&gt; Selvom WPS-PIN-angrebet er oldgammelt, leverer mange routere stadig med det aktiveret for “bekvemmelighed”.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Gæste-SSID isoleret.&lt;&#x2F;strong&gt; Klient-til-klient-isolation slået til og routet til et separat VLAN uden intern LAN-adgang.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;IoT-SSID, separat og indelukket.&lt;&#x2F;strong&gt; Billige Wi-Fi-termostater og legetøj er det svageste led på de fleste hjemme-netværk. De får deres eget SSID, deres eget VLAN og ingen rute til noget vigtigt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Firmware-opdateringer på AP’er.&lt;&#x2F;strong&gt; De fleste interessante 2020’er-Wi-Fi-sårbarheder var på chipset-niveau; rettelsen er altid en firmware-opdatering. Køb AP’er fra en leverandør, der leverer dem.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Antag at link-laget vil fejle og forsvar dig over det.&lt;&#x2F;strong&gt; HTTPS overalt, klient-certs på alt, der betyder noget, VPN eller Tailscale til fjernadgang. Når (ikke hvis) nogen bryder din Wi-Fi, skal lag 4+ stadig holde.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;hvad-der-forblev-det-samme-gennem-25-ar&quot;&gt;Hvad der forblev det samme gennem 25 år&lt;&#x2F;h2&gt;
&lt;p&gt;Tre mønstre gentager sig ved hver generation:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kryptografien er næsten altid stærkere end udrulningerne.&lt;&#x2F;strong&gt; WEP var en design-fejl; WPA2 og WPA3 er blevet brudt af implementerings-fejl, downgrade-stier og side-channels — ikke af rene krypto-svagheder.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Defaults betyder mere end kapabiliteter.&lt;&#x2F;strong&gt; WPS tændt som default, WPA2&#x2F;3-transition-mode tændt som default, gæste-netværk uden isolation som default — det er det, angribere faktisk finder, i skala.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Angriberen flytter altid op i stakken.&lt;&#x2F;strong&gt; Når link-lags-sikkerheden forbedres, skifter angreb til captive portals, falske certs, klient-fejlkonfigurationer og phishing. Ingen mængde WPA3 retter brugeren, der klikker “Stol på” på evil-twin’ens falske certifikat.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;coda&quot;&gt;Coda&lt;&#x2F;h2&gt;
&lt;p&gt;Hvis denne posts forfader på dette site, fra 2010, var “Hvordan man hacker et trådløst netværk” og fokuserede på WEP med &lt;code&gt;aircrack-ng&lt;&#x2F;code&gt;, er 2027-versionen tættere på “Hvordan man tænker om Wi-Fi-sikkerhed” og fokuserer på konfiguration, patching og realistisk trussels-modellering. Kryptografien har gjort sit arbejde. Lagene omkring den er den interessante front nu.&lt;&#x2F;p&gt;
&lt;p&gt;Test dine egne netværk — eller netværk, du er autoriseret til at teste — test ikke nogen andens. Samme lov, der gjaldt i 2002, gælder i 2027.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>nemboks.dk — få din digitale post (mit.dk, e-Boks) sendt direkte til din e-mail</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/nemboks-dk-videresend-digital-post/"/>
        <id>https://www.x2q.net/da/post/nemboks-dk-videresend-digital-post/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/nemboks-dk-videresend-digital-post/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nemboks.dk&quot;&gt;nemboks.dk&lt;&#x2F;a&gt; &lt;strong&gt;videresender digital post&lt;&#x2F;strong&gt; (fra &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mit.dk&quot;&gt;mit.dk&lt;&#x2F;a&gt; og &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.e-boks.com&#x2F;&quot;&gt;e-Boks&lt;&#x2F;a&gt;) direkte til din e-mail. Problemet, det løser: digital post er i teorien “push”, men i praksis “pull” — du skal stadig logge ind med MitID, åbne en app og klikke rundt for at læse et brev fra SKAT eller kommunen. Nemboks laver det til en e-mail, der lander i den indbakke, du i forvejen bor i — med PDF’en vedhæftet. Bygget til danske SMV’er, hvor samme &lt;code&gt;virksomhed&lt;&#x2F;code&gt; modtager post for flere selskaber eller medarbejdere, og hvor revisorer, bogholdere og ejendomsadministratorer vil have digital post samme sted som al anden e-mail. Gratis beta; efter beta koster det 39 kr&#x2F;md på årlig betaling, 49 kr&#x2F;md månedlig.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problemet-med-dansk-digital-post&quot;&gt;Problemet med dansk digital post&lt;&#x2F;h2&gt;
&lt;p&gt;Siden 2014 er kommunikation fra det offentlige digital som udgangspunkt. Det betyder, at hvis din kommune, SKAT, Udbetaling Danmark eller FerieKonto skal fat i dig, lægger de brevet i enten &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mit.dk&quot;&gt;mit.dk&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; (den offentlige portal) eller &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.e-boks.com&#x2F;&quot;&gt;e-Boks&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; (historisk set den mest brugte private portal, nu koblet til Digital Post).&lt;&#x2F;p&gt;
&lt;p&gt;I princippet er det fint: samlet, sporbart, ingen papir. I praksis er der en masse friktion:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Du skal logge ind med MitID hver gang.&lt;&#x2F;strong&gt; Hvert skattebrev, hver p-afgift, hver feriepenge-besked ligger bag en MFA-flow.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Apps notificerer dig, men notifikationerne er tynde.&lt;&#x2F;strong&gt; “Du har ny post” — ikke emnelinje, ikke afsender, ikke nok til at prioritere.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Der er ingen indbygget videresendelse.&lt;&#x2F;strong&gt; Du kan ikke sige “send alt fra SKAT til min bogholder på &lt;code&gt;bogholder@firma.dk&lt;&#x2F;code&gt;”.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Virksomheder får det værste af begge verdener.&lt;&#x2F;strong&gt; En CVR-registreret virksomhed har sin egen mit.dk &#x2F; e-Boks-indbakke. Hvis indehaveren ikke tjekker den, er der ingen, der gør.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;E-mail er omvendt standard-indbakken for små virksomheder: delte postkasser, videresendelsesregler, arkivering, filtre, søgning. Nemboks bygger broen imellem.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-nemboks-gor&quot;&gt;Hvad Nemboks gør&lt;&#x2F;h2&gt;
&lt;p&gt;Når Nemboks er sat op, logger den på din mit.dk &#x2F; e-Boks på dine vegne, tjekker for ny post og sender hvert nyt brev videre — &lt;strong&gt;som en rigtig e-mail med PDF’en vedhæftet&lt;&#x2F;strong&gt; — til den eller de adresser, du har konfigureret.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;En e-mail pr. brev.&lt;&#x2F;strong&gt; Emne = afsender + emne. Brødtekst = tekst-preview. Vedhæftning = PDF’en.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Flere selskaber pr. konto.&lt;&#x2F;strong&gt; Hvis du er revisor for flere CVR’er, bor de alle under samme Nemboks-dashboard.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Flere destinationer pr. selskab.&lt;&#x2F;strong&gt; Send f.eks. alt fra SKAT til bogholderen, resten til ejeren.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Originalen bliver liggende i mit.dk &#x2F; e-Boks.&lt;&#x2F;strong&gt; Intet slettes — Nemboks læser kun.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Logger hver videresendelse.&lt;&#x2F;strong&gt; For revision og ro i maven.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Det praktiske resultat: revisoren eller bogholderen, der allerede bor i Outlook eller Gmail, holder op med at skifte kontekst til en portal en gang om ugen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvem-det-er-til&quot;&gt;Hvem det er til&lt;&#x2F;h2&gt;
&lt;p&gt;Nemboks er bygget til danske SMV’er, især:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Revisorer og bogholdere.&lt;&#x2F;strong&gt; Kunden giver adgang én gang; derefter bliver hvert SKAT-brev for hver kunde til en e-mail i den delte indbakke.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ejendomsadministratorer.&lt;&#x2F;strong&gt; En enkelt administrator kan sidde med post for dusinvis af ejendoms-A&#x2F;S og -ApS.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Smv-indehavere.&lt;&#x2F;strong&gt; Enkeltmandsvirksomheden eller to-mands-ApS, hvor ejeren hellere vil have brevet fra kommunen samme sted som sin kunde-mail.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;stakken&quot;&gt;Stakken&lt;&#x2F;h2&gt;
&lt;p&gt;For de nysgerrige:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rails 8&lt;&#x2F;strong&gt; på Ruby 3.4 med Hotwire (Turbo + Stimulus) og Tailwind til dashboardet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL&lt;&#x2F;strong&gt; til persistens.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;auth0.com&#x2F;&quot;&gt;Auth0&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; til autentificering. Brugerne logger på med Google, Microsoft eller e-mail+kodeord — ingen separat Nemboks-kodeord at glemme.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stripe.com&#x2F;&quot;&gt;Stripe&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; til abonnementsstyring, inkl. deres hostede kundeportal til selv-betjent kortopdatering og opsigelse.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;postmarkapp.com&#x2F;&quot;&gt;Postmark&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; til transaktionel e-mail — de er kategoriens standard for “e-mail der skal lande i indbakken”, hvilket er hele pointen med en videresendelses-tjeneste.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Docker + Kamal&lt;&#x2F;strong&gt; til deployment. Zero-downtime rollouts på en lille flåde; ingen Kubernetes at drifte.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Pages&lt;&#x2F;strong&gt; til det statiske marketing-site på &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nemboks.dk&quot;&gt;nemboks.dk&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Opdelingen — Rails-app på Kamal, marketing-site på Pages — er bevidst. Marketing-sitet skal være billigt, hurtigt og tungt cached; Rails-appen skal have database og baggrundsjobs. At køre dem som to separate deployments holder hver af dem simpel.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pris&quot;&gt;Pris&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gratis beta&lt;&#x2F;strong&gt;, mens tjenesten stabiliseres.&lt;&#x2F;li&gt;
&lt;li&gt;Efter beta: &lt;strong&gt;39 kr&#x2F;md&lt;&#x2F;strong&gt; på årlig betaling, &lt;strong&gt;49 kr&#x2F;md&lt;&#x2F;strong&gt; månedlig — excl. moms. Flad pris pr. selskab; ingen pris pr. brev.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;60 dages gratis prøveperiode&lt;&#x2F;strong&gt; til nye kunder efter beta.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;ma-nemboks-laese-min-mit-dk-e-boks&quot;&gt;Må Nemboks læse min mit.dk &#x2F; e-Boks?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja — som indbakke-ejer giver du Nemboks lov til at læse på dine vegne. Nemboks læser kun; intet slettes, besvares eller markeres som læst uden at du har konfigureret det.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-det-gdpr-compliant&quot;&gt;Er det GDPR-compliant?&lt;&#x2F;h3&gt;
&lt;p&gt;Nemboks behandler persondata på dine vegne. Som kunde er du dataansvarlig; Nemboks er databehandler, og der er en standard databehandleraftale (DPA) at underskrive. Alle data opbevares i EU.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-sker-der-med-det-originale-brev-i-mit-dk-e-boks&quot;&gt;Hvad sker der med det originale brev i mit.dk &#x2F; e-Boks?&lt;&#x2F;h3&gt;
&lt;p&gt;Det bliver liggende. Nemboks er read-only.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kan-jeg-videresende-til-flere-e-mailadresser&quot;&gt;Kan jeg videresende til flere e-mailadresser?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja. Hvert selskab kan have flere modtagere, og du kan sende forskellige afsendere til forskellige adresser (f.eks. alt fra SKAT til bogholderen).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;virker-nemboks-for-privatpersoner&quot;&gt;Virker Nemboks for privatpersoner?&lt;&#x2F;h3&gt;
&lt;p&gt;Det nuværende fokus er danske virksomheder (CVR). En privat-plan kommer måske senere.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-hvis-nemboks-gar-ned&quot;&gt;Hvad hvis Nemboks går ned?&lt;&#x2F;h3&gt;
&lt;p&gt;Din post lander stadig i mit.dk &#x2F; e-Boks som normalt; Nemboks videresender bare ikke, før tjenesten er tilbage. Intet går tabt.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvordan-opsiger-jeg&quot;&gt;Hvordan opsiger jeg?&lt;&#x2F;h3&gt;
&lt;p&gt;Via Stripes kundeportal inde fra dashboardet. Ingen e-mail, intet telefonopkald.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-bygge-det&quot;&gt;Hvorfor bygge det&lt;&#x2F;h2&gt;
&lt;p&gt;Digital post virker. Det er sikkert, sporbart, og jeg vil hellere have et SKAT-brev i mit.dk end en brun kuvert. Men brugerfladen er designet til en borger, der læser en håndfuld breve om året — ikke til en virksomhed, der får dusinvis om ugen på tværs af flere CVR’er. E-mail løser “dusinvis om ugen på tværs af flere postkasser” udmærket — filtre, regler, delte indbakker, søgning — så den mindst interessante, men mest nyttige bro er at få brevene ud af portalen og ind i e-mailen med PDF’en vedhæftet, uden at nogen skal logge ind hver gang.&lt;&#x2F;p&gt;
&lt;p&gt;Det er Nemboks.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>Sådan afspiller du Spotify på en Logitech Squeezebox i 2026</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/squeezebox-spotify-guide-dansk/"/>
        <id>https://www.x2q.net/da/post/squeezebox-spotify-guide-dansk/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/squeezebox-spotify-guide-dansk/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; Det officielle Spotify-plugin, Logitech leverede med Squeezebox, holdt op med at virke, da Spotify lukkede &lt;code&gt;libspotify&lt;&#x2F;code&gt;-API’en i 2022. I 2026 er der to fungerende veje til at få &lt;strong&gt;Spotify på en Squeezebox Classic, Touch, Boom, Radio eller Transporter&lt;&#x2F;strong&gt;: (1) &lt;strong&gt;Logitech Media Server + &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;michaelherger&#x2F;Spotty-Plugin&quot;&gt;Spotty-plugin’et&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; (nu omdøbt &lt;code&gt;Spotty&lt;&#x2F;code&gt; &#x2F; nogle gange &lt;code&gt;Spotty-XL&lt;&#x2F;code&gt;), der bruger Spotifys Web API plus &lt;code&gt;librespot&lt;&#x2F;code&gt; under motorhjelmen, eller (2) kør &lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Spotifyd&#x2F;spotifyd&quot;&gt;spotifyd&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; på samme host som LMS og peg LMS på den som generisk lydkilde. Vej 1 er den, du vil bruge, medmindre du har en grund til andet. Dette indlæg gennemgår den.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-skete-der-med-det-officielle-plugin&quot;&gt;Hvad skete der med det officielle plugin&lt;&#x2F;h2&gt;
&lt;p&gt;Squeezebox-hardware gik end-of-life hos Logitech i 2012, men softwaren — &lt;strong&gt;Logitech Media Server (LMS)&lt;&#x2F;strong&gt;, det der faktisk streamer musik til enhederne — er blevet community-vedligeholdt siden. I årevis leverede den et officielt “Spotify”-plugin, der brugte Spotifys nu udfasede &lt;code&gt;libspotify&lt;&#x2F;code&gt; C-bibliotek. Da Spotify lukkede &lt;code&gt;libspotify&lt;&#x2F;code&gt; i 2022, holdt det plugin op med at virke, og Spotify har ikke leveret en erstatning til tredjeparts-indbyggede enheder.&lt;&#x2F;p&gt;
&lt;p&gt;Community’et udfyldte hullet:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;librespot&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — en open-source Rust-reimplementering af Spotify Connect-klientprotokollen. Grundlaget for de fleste moderne tredjeparts-Spotify-integrationer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Spotty-plugin til LMS&lt;&#x2F;strong&gt; — pakker &lt;code&gt;librespot&lt;&#x2F;code&gt; og Spotifys Web API ind i et LMS-plugin. Præsenterer Spotify-browsing, søgning, playlister og afspilning inde i Squeezebox-UI’et (både enheds-skærmen og LMS-web-UI’et).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;spotifyd&lt;&#x2F;strong&gt; — en selvstændig &lt;code&gt;librespot&lt;&#x2F;code&gt;-baseret dæmon, der fremstår som et Spotify Connect-mål. Din telefon ser den som en højttaler, du caster til den, og dens lydudgang går et sted hen, hvor LMS kan samle det op.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vej-1-anbefalet-spotty-plugin-pa-lms&quot;&gt;Vej 1 (anbefalet): Spotty-plugin på LMS&lt;&#x2F;h2&gt;
&lt;p&gt;Dette er den reneste oplevelse og den, der føles native på Squeezeboxen. Du søger og browser fra Squeezebox-fjernbetjeningen eller Touch-skærmen, og det Virker Bare.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-fa-lms-op-at-kore&quot;&gt;1. Få LMS op at køre&lt;&#x2F;h3&gt;
&lt;p&gt;Hvis du ikke allerede kører LMS, så installér det på en altid-tændt maskine — en Raspberry Pi, et NAS med Docker eller en lille Linux-boks er ideelt.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;# Debian&#x2F;Ubuntu — hent den nyeste .deb fra community-repoet
wget https:&#x2F;&#x2F;downloads.slimdevices.com&#x2F;LogitechMediaServer_v8.x&#x2F;logitechmediaserver_&amp;lt;latest&amp;gt;_amd64.deb
sudo apt install .&#x2F;logitechmediaserver_&amp;lt;latest&amp;gt;_amd64.deb
sudo systemctl enable --now logitechmediaserver
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Eller via Docker — &lt;code&gt;lmscommunity&#x2F;logitechmediaserver&lt;&#x2F;code&gt; er et vedligeholdt image:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;docker run -d --name lms \
  --network host \
  -v lms-config:&#x2F;config \
  -v &#x2F;sti&#x2F;til&#x2F;musik:&#x2F;music:ro \
  lmscommunity&#x2F;logitechmediaserver:latest
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Åbn &lt;code&gt;http:&#x2F;&#x2F;&amp;lt;host&amp;gt;:9000&#x2F;&lt;&#x2F;code&gt;, og du skulle se LMS-web-UI’et. Dine Squeezebox-enheder på samme LAN skal dukke op under &lt;strong&gt;Players&lt;&#x2F;strong&gt; automatisk.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-installer-spotty&quot;&gt;2. Installér Spotty&lt;&#x2F;h3&gt;
&lt;p&gt;I LMS-web-UI’et: &lt;strong&gt;Settings → Plugins → Install new plugins&lt;&#x2F;strong&gt; og kryds &lt;strong&gt;Spotty&lt;&#x2F;strong&gt; af (forfatter: Michael Herger). LMS henter, installerer og genstarter. Efter genstart har du et &lt;strong&gt;Spotty&lt;&#x2F;strong&gt;-punkt i &lt;strong&gt;Settings → Advanced → Spotty&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-autoriser-spotty-med-din-spotify-konto&quot;&gt;3. Autoriser Spotty med din Spotify-konto&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;I &lt;strong&gt;Settings → Advanced → Spotty&lt;&#x2F;strong&gt; klik &lt;strong&gt;Add account&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Spotty starter et OAuth-flow via Spotifys Web API — du logger ind én gang i en browser, godkender adgangen, og tokenet gemmes på LMS-serveren.&lt;&#x2F;li&gt;
&lt;li&gt;Du skal bruge &lt;strong&gt;Spotify Premium&lt;&#x2F;strong&gt; til afspilning. (Det er en Spotify-side-grænse: &lt;code&gt;librespot&lt;&#x2F;code&gt; kan autentificere med Free, men fuld-kvalitets-afspilning er kun til Premium.)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;4-afspil-noget&quot;&gt;4. Afspil noget&lt;&#x2F;h3&gt;
&lt;p&gt;På selve Squeezebox-enheden: &lt;strong&gt;Home → My Music → Spotty&lt;&#x2F;strong&gt; (eller &lt;strong&gt;Home → Music Library → Spotty&lt;&#x2F;strong&gt;, afhængigt af din LMS-version) — browsing af playlister, søgning, start et nummer. På Squeezebox Touch virker artwork på skærmen. På Classic virker tekst-UI’et. På Radio og Boom styrer du det fra web-UI’et eller apps som &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;squeeze-commander.com&#x2F;&quot;&gt;Squeeze Commander&lt;&#x2F;a&gt; &#x2F; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=uk.org.ngo.squeezer&quot;&gt;Squeezer&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Spotty tilføjer også Squeezebox-enheder som &lt;strong&gt;Spotify Connect-mål&lt;&#x2F;strong&gt; — det betyder, at du kan caste fra din telefon-Spotify-app til “Stue-Squeezeboxen” native, på samme måde som du ville caste til en Sonos eller en Google Home.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vej-2-spotifyd-som-connect-bro&quot;&gt;Vej 2: spotifyd som Connect-bro&lt;&#x2F;h2&gt;
&lt;p&gt;Brug denne, hvis Spotty ikke vil installere (gammel LMS-version, gammel Perl, mærkeligt OS) eller du specifikt vil have Spotify Connect-adfærd uden Spotty.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;# Debian&#x2F;Ubuntu
sudo apt install spotifyd
# eller fra kilden: cargo install spotifyd
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Konfigurér &lt;code&gt;&#x2F;etc&#x2F;spotifyd.conf&lt;&#x2F;code&gt; med dine Spotify-credentials, en backend (&lt;code&gt;alsa&lt;&#x2F;code&gt;, &lt;code&gt;pulseaudio&lt;&#x2F;code&gt; eller &lt;code&gt;pipe&lt;&#x2F;code&gt;) og et enhedsnavn. Start dæmonen:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now spotifyd
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Fra din telefon, cast til den &lt;code&gt;spotifyd&lt;&#x2F;code&gt;-navngivne enhed. Lyden kommer ud af hosten.&lt;&#x2F;p&gt;
&lt;p&gt;For at få den lyd ind i en Squeezebox, pipe &lt;code&gt;spotifyd&lt;&#x2F;code&gt; til en FIFO og afspil FIFO’en i LMS:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;# spotifyd.conf
backend = &amp;quot;pipe&amp;quot;
device = &amp;quot;&#x2F;var&#x2F;run&#x2F;spotifyd.pipe&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tilføj derefter FIFO’en som en &lt;strong&gt;File system music folder&lt;&#x2F;strong&gt; i LMS og afspil den som en live-stream.&lt;&#x2F;p&gt;
&lt;p&gt;Det er klodset og har ~1 s forsinkelse i forhold til Spottys tætte integration. Brug det kun, hvis vej 1 ikke virker for dig.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;virker-pa-hvilke-squeezeboxe&quot;&gt;Virker på hvilke Squeezeboxe?&lt;&#x2F;h2&gt;
&lt;p&gt;Spotty virker på alle Squeezebox-enheder, der taler med LMS:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Squeezebox Classic &#x2F; Squeezebox v3&lt;&#x2F;strong&gt; (tekstdisplay) — tekst-UI-browsing og afspilning.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Squeezebox Touch&lt;&#x2F;strong&gt; — farvetouchskærm, artwork, hele UI’et.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Squeezebox Boom&lt;&#x2F;strong&gt; — tekst-UI, samme som Classic.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Squeezebox Radio&lt;&#x2F;strong&gt; — tekst-UI, indbygget højttaler.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Squeezebox Duet &#x2F; Controller&lt;&#x2F;strong&gt; — controllerens UI virker; afspilning går til Receiveren.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Transporter&lt;&#x2F;strong&gt; — fuld understøttelse.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;piCorePlayer &#x2F; SqueezeLite på Pi&lt;&#x2F;strong&gt; — ja, det er software-Squeezeboxe, og Spotty streamer fint til dem.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Så længe enheden kan forbinde til LMS, kan Spotty fodre den.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;skal-jeg-have-spotify-premium&quot;&gt;Skal jeg have Spotify Premium?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja, til afspilning. &lt;code&gt;librespot&lt;&#x2F;code&gt; (og dermed Spotty) kræver en Premium-konto for at afkode lyd. Spotify Free-konti kan autentificere, men kan ikke afspille.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;virker-squeezeboxen-som-spotify-connect-hojttaler&quot;&gt;Virker “Squeezeboxen som Spotify Connect-højttaler”?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja, med Spotty installeret. Hver Squeezebox-player dukker op i Spotify-appens enhedsvælger som et Connect-mål.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;virker-hi-res-lossless&quot;&gt;Virker hi-res &#x2F; lossless?&lt;&#x2F;h3&gt;
&lt;p&gt;Spotify tilbyder ikke selv lossless på standardplaner (Hi-Fi har været “kommer snart” i årevis). Spotty afspiller, hvad Spotify serverer — Ogg Vorbis 320 kbps på Premium — og Squeezeboxen håndterer det native.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gapless-afspilning&quot;&gt;Gapless afspilning?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja, Spotty understøtter gapless.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gar-det-i-stykker-hvis-spotifys-web-api-aendrer-sig&quot;&gt;Går det i stykker, hvis Spotifys Web API ændrer sig?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja, lejlighedsvis — Spotify roterer jævnligt OAuth-scopes eller udfaser endpoints, og Spotty får en patch-release. Hold plugin’et opdateret.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kan-jeg-kore-lms-pa-samme-boks-som-mit-nas&quot;&gt;Kan jeg køre LMS på samme boks som mit NAS?&lt;&#x2F;h3&gt;
&lt;p&gt;Absolut. LMS er let (~200 MB RAM, minimal CPU undtagen under bibliotek-scanninger). At køre det ved siden af Samba eller på en homelab-SBC er det almindelige setup.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-det-det-samme-som-picoreplayer&quot;&gt;Er det det samme som “piCorePlayer”?&lt;&#x2F;h3&gt;
&lt;p&gt;piCorePlayer er en lille Linux-distribution, der gør en Raspberry Pi til en Squeezebox-kompatibel player (via SqueezeLite). Den erstatter ikke LMS — du skal stadig bruge LMS som server. piCorePlayer + LMS + Spotty er en meget almindelig 2026-stak for folk, hvis oprindelige Squeezebox-hardware endelig døde.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-du-gor-hvis-din-squeezebox-slet-ikke-vil-forbinde-til-lms&quot;&gt;Hvad du gør, hvis din Squeezebox slet ikke vil forbinde til LMS&lt;&#x2F;h2&gt;
&lt;p&gt;To ting at tjekke først:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;mDNS &#x2F; multicast på tværs af dit netværk.&lt;&#x2F;strong&gt; Moderne Wi-Fi-routere blokerer ofte multicast mellem SSID’er eller til kablede hosts. Sæt Squeezeboxen og LMS på samme subnet&#x2F;VLAN med multicast tilladt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SlimProto-porten (3483&#x2F;udp og 3483&#x2F;tcp).&lt;&#x2F;strong&gt; Det er det, Squeezeboxen bruger til at finde LMS. Ikke blokeret af noget fornuftigt, men værd at tjekke, hvis du kører en stram firewall.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Derudover er Squeezebox-community’et stadig aktivt — &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;forums.slimdevices.com&#x2F;&quot;&gt;forums.slimdevices.com&lt;&#x2F;a&gt; og &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;LMS-Community&quot;&gt;LMS Community GitHub&lt;&#x2F;a&gt; er, hvor problemer bliver løst.&lt;&#x2F;p&gt;
&lt;p&gt;Squeezebox-hardware blev udfaset for femten år siden. Takket være LMS, Spotty og &lt;code&gt;librespot&lt;&#x2F;code&gt; afspiller den stadig Spotify bedre end de fleste “smarte højttalere”, der sælges nye i 2026.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>elpriser.org — danske elpriser time for time</title>
        <published>2026-04-20T00:00:00+00:00</published>
        <updated>2026-04-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/elpriser-org-danske-elpriser-time-for-time/"/>
        <id>https://www.x2q.net/da/post/elpriser-org-danske-elpriser-time-for-time/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/elpriser-org-danske-elpriser-time-for-time/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;elpriser.org&quot;&gt;elpriser.org&lt;&#x2F;a&gt; viser den &lt;strong&gt;reelle elpris time for time i Danmark&lt;&#x2F;strong&gt; — ikke kun spotprisen. Den samler Nord Pool-spotprisen, din lokale nettarif (&lt;code&gt;netselskab&lt;&#x2F;code&gt;), Energinets system- og transmissionstariffer, elafgiften og 25 % moms. Data kommer fra &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.energidataservice.dk&#x2F;&quot;&gt;Energi Data Service&lt;&#x2F;a&gt; og opdateres dagligt, når Nord Pool offentliggør de kommende 24 timer omkring kl. 13. DK1 (Vestdanmark) og DK2 (Østdanmark). Dansksproget, gratis, intet login.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-koster-el-faktisk-i-danmark&quot;&gt;Hvad koster el faktisk i Danmark?&lt;&#x2F;h2&gt;
&lt;p&gt;“Spotprisen”, du ser på de fleste energidashboards, er kun én del af regningen. Den pris, du rent faktisk betaler pr. kWh, består af seks elementer:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Spotpris&lt;&#x2F;strong&gt; — sættes time for time på Nord Pool-markedet for det kommende døgn.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Nettarif&lt;&#x2F;strong&gt; — betales til dit lokale netselskab. Varierer efter selskab og tidspunkt (lav-, mellem- og spidslast).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Systemtarif&lt;&#x2F;strong&gt; — betales til Energinet, den danske TSO.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Transmissionstarif&lt;&#x2F;strong&gt; — betales også til Energinet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Elafgift&lt;&#x2F;strong&gt; — statslig afgift på forbrug.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Moms&lt;&#x2F;strong&gt; — 25 % oven i alt det andet.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;De fleste prissider viser kun det første tal. Nogle få viser ét eller to mere. Ingen, jeg kunne finde, viste alle seks time for time, for begge prisområder, med den rigtige nettarif automatisk valgt for brugerens netselskab. Det er præcis det, elpriser.org gør.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;de-to-prisomrader-dk1-og-dk2&quot;&gt;De to prisområder: DK1 og DK2&lt;&#x2F;h2&gt;
&lt;p&gt;Danmark er delt i to elprisområder geografisk — Storebælt skiller dem — og de har ofte forskellig pris i samme time:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DK1 — Vestdanmark.&lt;&#x2F;strong&gt; Jylland og Fyn. Mere vind-domineret.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;DK2 — Østdanmark.&lt;&#x2F;strong&gt; Sjælland, Lolland, Falster, Møn og Bornholm. Tættere forbundet med Sverige (SE4) og Tyskland.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Når vinden blæser kraftigt i Jylland, kan DK1 være billig, mens DK2 er dyr. Når en forbindelse er nede, vokser forskellen yderligere. elpriser.org viser begge områder side om side.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvilket-netselskab-har-du&quot;&gt;Hvilket netselskab har du?&lt;&#x2F;h2&gt;
&lt;p&gt;Du kan ikke selv vælge dit netselskab — det afhænger af din adresse — men den nettarif, de opkræver, er en betydelig del af regningen, og den varierer med &lt;strong&gt;15–25 øre&#x2F;kWh i spidslast&lt;&#x2F;strong&gt; mellem billigste og dyreste, hvilket svarer til &lt;strong&gt;~500–1.000 kr&#x2F;år&lt;&#x2F;strong&gt; for en typisk husstand.&lt;&#x2F;p&gt;
&lt;p&gt;Groft rangeret spidslast-tariffer pr. 2025:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Område&lt;&#x2F;th&gt;&lt;th&gt;Netselskab&lt;&#x2F;th&gt;&lt;th&gt;Spidslast-tarif (øre&#x2F;kWh)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;DK1&lt;&#x2F;td&gt;&lt;td&gt;RAH Net&lt;&#x2F;td&gt;&lt;td&gt;~33&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DK1&lt;&#x2F;td&gt;&lt;td&gt;Trefor&lt;&#x2F;td&gt;&lt;td&gt;~37&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DK1&lt;&#x2F;td&gt;&lt;td&gt;N1&lt;&#x2F;td&gt;&lt;td&gt;~46&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DK2&lt;&#x2F;td&gt;&lt;td&gt;Cerius&lt;&#x2F;td&gt;&lt;td&gt;~47&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;DK2&lt;&#x2F;td&gt;&lt;td&gt;Radius&lt;&#x2F;td&gt;&lt;td&gt;~65&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Mindre selskaber (Konstant, Nord Energi, Vores Elnet, El-net Kongerslev og andre) har egne tariffer. På elpriser.org vælger du dit eget, og den all-in time-for-time-pris tilpasser sig.&lt;&#x2F;p&gt;
&lt;p&gt;Du kan ikke skifte netselskab, men du &lt;strong&gt;kan&lt;&#x2F;strong&gt; flytte forbrug — vaskemaskine, opvaskemaskine, EV-ladning, varmepumpe — ned i lavsats-timerne. Time-grafen findes til lige præcis det.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;historiske-yderpunkter&quot;&gt;Historiske yderpunkter&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rekord-høj:&lt;&#x2F;strong&gt; 16,69 kr&#x2F;kWh (spotpris ex. moms) i DK2, kl. 19 den 5. september 2022 under energikrisen.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rekord-lav:&lt;&#x2F;strong&gt; −2,76 kr&#x2F;kWh i DK1, kl. 14 den 2. juli 2023, hvor vindproduktionen overskød forbruget.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Negative priser er ikke en fejl: når produktionen er høj og forbruget lavt, betaler producenterne forbrugerne for at aftage strømmen. Moderne prisstyrede varmepumper og EV-ladere kan læne sig ind i det.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sadan-er-elpriser-org-bygget&quot;&gt;Sådan er elpriser.org bygget&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Statisk HTML&lt;&#x2F;strong&gt;, genskabt én gang om dagen efter Nord Pools day-ahead-auktion omkring kl. 13 CET.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Datakilde&lt;&#x2F;strong&gt;: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.energidataservice.dk&#x2F;&quot;&gt;Energi Data Service&lt;&#x2F;a&gt;, Energinets åbne data. Ingen API-nøgler nødvendige.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Strukturerede data&lt;&#x2F;strong&gt;: &lt;code&gt;schema.org&#x2F;WebApplication&lt;&#x2F;code&gt; og &lt;code&gt;FAQPage&lt;&#x2F;code&gt; udsendes på hver side, så Google kan vise priserne direkte i søgeresultater og AI-oversigter.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hosting&lt;&#x2F;strong&gt;: en lille origin bag Cloudflare. Cachebar hele døgnet; purges ved det daglige rebuild.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sprog&lt;&#x2F;strong&gt;: kun dansk. Domænenavnet burde have været et fingerpeg.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Det hele er et enkeltsporet værktøj: ingen tracking, intet login, ingen nyhedsbrev-popover, ingen “10 måder at spare på strømmen”-lister.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;hvor-ofte-opdaterer-elpriser-org&quot;&gt;Hvor ofte opdaterer elpriser.org?&lt;&#x2F;h3&gt;
&lt;p&gt;Én gang om dagen, efter at Nord Pools day-ahead-auktion offentliggør næste døgn omkring kl. 13 CET. Intradag-justeringer vises ikke; de fleste forbrugere afregnes alligevel efter day-ahead-prisen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-prisen-med-eller-uden-moms&quot;&gt;Er prisen med eller uden moms?&lt;&#x2F;h3&gt;
&lt;p&gt;Med. Headline-tallet på elpriser.org er all-in pr. kWh: spotpris + tariffer + afgift + 25 % moms. Du kan folde det ud og se opdelingen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-er-priserne-forskellige-i-dk1-og-dk2&quot;&gt;Hvorfor er priserne forskellige i DK1 og DK2?&lt;&#x2F;h3&gt;
&lt;p&gt;Danmark har to fysisk adskilte elprisområder, forbundet via Storebælt. Når forbindelsen er fuldt udnyttet, eller når vindproduktionen adskiller sig markant mellem øst og vest, clearer de to områder på forskellige Nord Pool-priser.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kan-jeg-se-opdelingen-af-hver-komponent&quot;&gt;Kan jeg se opdelingen af hver komponent?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja. Hver time-celle kan foldes ud for at vise spotpris, hver tarif-komponent, elafgift og moms.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;far-jeg-reelt-negative-priser-nar-engrosprisen-bliver-negativ&quot;&gt;Får jeg reelt negative priser, når engrosprisen bliver negativ?&lt;&#x2F;h3&gt;
&lt;p&gt;Det afhænger af din kontrakt. Rene spotpris-kontrakter videregiver Nord Pools råpris — tariffer og afgift gælder stadig, så all-in-prisen kan gå svagt negativ eller bare meget lav. Fastpris-kontrakter gør ikke.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-kun-dansk&quot;&gt;Hvorfor kun dansk?&lt;&#x2F;h3&gt;
&lt;p&gt;Data, regulering, netselskabs-strukturen og målgruppen er alle danske. En engelsk version ville oversætte kontekst, ikke indhold.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvor-kommer-data-fra&quot;&gt;Hvor kommer data fra?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.energidataservice.dk&#x2F;dataset&#x2F;elspotprices&quot;&gt;Energi Data Service&lt;&#x2F;a&gt; (Nord Pool-spot) og Energinets tarifdata. Begge er officielle, offentlige datasæt fra den danske TSO.&lt;&#x2F;p&gt;
&lt;p&gt;Lille, fokuseret, intet login, ingen tracking. Sådan bør forbruger-energiværktøjer se ud.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>winniemethmann.com — fra WordPress til Astro</title>
        <published>2026-04-19T00:00:00+00:00</published>
        <updated>2026-04-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/winniemethmann-com-astro-portfolio/"/>
        <id>https://www.x2q.net/da/post/winniemethmann-com-astro-portfolio/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/winniemethmann-com-astro-portfolio/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;winniemethmann.com&quot;&gt;winniemethmann.com&lt;&#x2F;a&gt; er portfolien for en dansk madfotograf og opskriftsudvikler. I et årti var det et WordPress-site. Jeg byggede det om oven på &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;astro.build&quot;&gt;Astro&lt;&#x2F;a&gt; med &lt;strong&gt;content collections&lt;&#x2F;strong&gt; (typet Markdown) i stedet for et CMS, &lt;strong&gt;Sharp + AVIF&lt;&#x2F;strong&gt; til billedpipelinen og &lt;strong&gt;Astros i18n-routing&lt;&#x2F;strong&gt; (dansk som standard, engelsk på &lt;code&gt;&#x2F;en&#x2F;&lt;&#x2F;code&gt;). Build-tid: ~30 sekunder. Output: ~70 % mindre. Intet admin-panel, ingen plugin-opdateringer, ingen bot-prøvet login-endpoint.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-vaek-fra-wordpress&quot;&gt;Hvorfor væk fra WordPress&lt;&#x2F;h2&gt;
&lt;p&gt;For en portfolio, der opdateres et par gange om måneden, lavede WordPress for meget:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP-runtime og MySQL&lt;&#x2F;strong&gt; for et site, der i praksis er statisk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Titusindvis af plugins&lt;&#x2F;strong&gt; til billedgallerier, kontaktformularer, SEO og caching — hver med sin egen opdaterings­kadence og sikkerhedshuller.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Et halvt-forket tema&lt;&#x2F;strong&gt; med patches, ingen huskede hvorfor var der.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Et admin-login-endpoint&lt;&#x2F;strong&gt;, der blev prøvet flere tusind gange i døgnet af bots.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Gentagne cache-kvaler&lt;&#x2F;strong&gt;, hver gang CDN og plugins var uenige.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Konkret betød det at droppe WordPress:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ingen admin-panel at holde patchet.&lt;&#x2F;strong&gt; WordPress-core, plugin-opdateringer, tema-opdateringer — væk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ingen database.&lt;&#x2F;strong&gt; Indholdet ligger som Markdown i repoet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ingen login-flade, bots kan prøve.&lt;&#x2F;strong&gt; Der findes ikke en &lt;code&gt;&#x2F;wp-admin&#x2F;&lt;&#x2F;code&gt; længere.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;~10× hurtigere sideindlæsning&lt;&#x2F;strong&gt; uden cache-lag.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;~70 % mindre samlet build-størrelse&lt;&#x2F;strong&gt; — vi skiftede håndeksporterede JPEG’er ud med AVIF med fornuftige &lt;code&gt;srcset&lt;&#x2F;code&gt;-breakpoints.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Til gengæld mister du den ikke-tekniske redigering. I praksis betød det ingenting: ejeren var gladere for at redigere Markdown end for at kæmpe med WordPress’ blok-editor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-astro&quot;&gt;Hvorfor Astro&lt;&#x2F;h2&gt;
&lt;p&gt;Jeg overvejede Hugo, 11ty, Next.js static export og SvelteKit. Astro vandt på tre konkrete punkter:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Content collections.&lt;&#x2F;strong&gt; En typet, skema-kontrolleret måde at beskrive et portfolio-projekt som en mappe med fotos plus lidt front-matter. Buildet fejler højlydt, hvis noget ikke overholder skemaet. Intet CMS nødvendigt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;Image&amp;gt;&lt;&#x2F;code&gt;-komponenten.&lt;&#x2F;strong&gt; Astros indbyggede billedpipeline håndterer AVIF + JPEG-fallback + &lt;code&gt;srcset&lt;&#x2F;code&gt; + &lt;code&gt;width&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;height&lt;&#x2F;code&gt; med en one-liner. Sharp er motoren under.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Islands-arkitektur — ikke relevant her.&lt;&#x2F;strong&gt; Siden har ingen interaktive komponenter, så den sender stort set ingen JavaScript.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;content-collections-ikke-et-cms&quot;&gt;Content collections, ikke et CMS&lt;&#x2F;h2&gt;
&lt;p&gt;Hvert portfolio-projekt er en mappe under &lt;code&gt;src&#x2F;content&#x2F;portfolio&#x2F;&lt;&#x2F;code&gt; med et front-matter-skema:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;src&#x2F;content&#x2F;portfolio&#x2F;
├── 2024-kogebogs-editorial&#x2F;
│   ├── index.mdx
│   ├── cover.jpg
│   ├── 01.jpg, 02.jpg, …
└── 2023-forarets-katalog&#x2F;
    ├── index.mdx
    ├── cover.jpg
    └── 01.jpg …
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;index.mdx&lt;&#x2F;code&gt;’s front-matter deklarerer titel, kategori, år og forsidebillede. Astro håndhæver skemaet ved build-tid via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.astro.build&#x2F;en&#x2F;guides&#x2F;content-collections&#x2F;&quot;&gt;&lt;code&gt;defineCollection&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; med et Zod-skema. Hvis et projekt mangler et forsidebillede eller har en dårlig kategori, fejler buildet.&lt;&#x2F;p&gt;
&lt;p&gt;Kategorier: &lt;strong&gt;madfotografi, opskriftsudvikling, interiør- og haveproduktion, editorial, kogebøger og mode&lt;&#x2F;strong&gt;. At tilføje et nyt projekt er &lt;code&gt;mkdir&lt;&#x2F;code&gt; + &lt;code&gt;cp *.jpg&lt;&#x2F;code&gt; + en kort YAML-front-matter-blok. Ingen admin-UI, ingen database-migration, ingen cache at invalidere.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;billedpipeline-sharp-avif&quot;&gt;Billedpipeline: Sharp + AVIF&lt;&#x2F;h2&gt;
&lt;p&gt;Madfotografi står og falder med billedkvalitet. Astros &lt;code&gt;&amp;lt;Image&amp;gt;&lt;&#x2F;code&gt;-komponent — drevet af &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sharp.pixelplumbing.com&#x2F;&quot;&gt;Sharp&lt;&#x2F;a&gt; — genererer:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AVIF&lt;&#x2F;strong&gt; som primært format. Stort set alle moderne browsere understøtter det nu (se &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;caniuse.com&#x2F;avif&quot;&gt;caniuse&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JPEG&lt;&#x2F;strong&gt;-fallback med matchende &lt;code&gt;srcset&lt;&#x2F;code&gt;-breakpoints (320, 640, 960, 1280, 1920 px).&lt;&#x2F;li&gt;
&lt;li&gt;Eksplicitte &lt;code&gt;width&lt;&#x2F;code&gt;- og &lt;code&gt;height&lt;&#x2F;code&gt;-attributter, så der er nul layout shift, mens billederne loader.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;loading=&quot;lazy&quot;&lt;&#x2F;code&gt; til billeder under folden og &lt;code&gt;fetchpriority=&quot;high&quot;&lt;&#x2F;code&gt; til heroet.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Tal&lt;&#x2F;strong&gt;: en typisk portfolio-side gik fra ~4,8 MB håndeksporterede JPEG’er til ~1,4 MB AVIF — omkring 70 % reduktion — uden synligt kvalitetstab i de viste størrelser.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;i18n-dansk-som-standard-engelsk-pa-en&quot;&gt;i18n — dansk som standard, engelsk på &#x2F;en&#x2F;&lt;&#x2F;h2&gt;
&lt;p&gt;Astros i18n-routing sidder i &lt;code&gt;astro.config.mjs&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;js&quot;&gt;export default defineConfig({
  i18n: {
    defaultLocale: &amp;quot;da&amp;quot;,
    locales: [&amp;quot;da&amp;quot;, &amp;quot;en&amp;quot;],
    routing: { prefixDefaultLocale: false },
  },
});
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Det giver:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&#x2F;&lt;&#x2F;code&gt; for dansk (standard, uden præfiks).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;en&#x2F;&lt;&#x2F;code&gt; for engelsk.&lt;&#x2F;li&gt;
&lt;li&gt;Hvert indholds-entry deklarerer sit sprog via sin collection og filnavn.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;link rel=&quot;alternate&quot; hreflang&amp;gt;&lt;&#x2F;code&gt; og sitemap genereres fra samme kilde.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Indlæg og portfolio-entries uden oversættelse dukker simpelthen ikke op i det andet sprogs routing — der er ingen forkert-sprog-404.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deployment-og-build&quot;&gt;Deployment og build&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Output&lt;&#x2F;strong&gt;: fuldt statisk, udgivet som almindelige filer bag Cloudflare.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Build-tid&lt;&#x2F;strong&gt;: ~30 sekunder fra koldt cache, ~6 sekunder inkrementelt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ingen server, ingen database, ingen løbende kørselstid.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;malbare-forbedringer&quot;&gt;Målbare forbedringer&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Mål&lt;&#x2F;th&gt;&lt;th&gt;WordPress (før)&lt;&#x2F;th&gt;&lt;th&gt;Astro (efter)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Build &#x2F; deploy-tid&lt;&#x2F;td&gt;&lt;td&gt;ikke relevant&lt;&#x2F;td&gt;&lt;td&gt;~30 s koldt, ~6 s varmt&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Typisk sidestørrelse (portfolio-side)&lt;&#x2F;td&gt;&lt;td&gt;~4,8 MB&lt;&#x2F;td&gt;&lt;td&gt;~1,4 MB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Largest Contentful Paint&lt;&#x2F;td&gt;&lt;td&gt;~2,8 s&lt;&#x2F;td&gt;&lt;td&gt;~0,9 s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Time to Interactive&lt;&#x2F;td&gt;&lt;td&gt;~3,5 s&lt;&#x2F;td&gt;&lt;td&gt;~1,1 s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;JS sendt til klienten&lt;&#x2F;td&gt;&lt;td&gt;~220 KB&lt;&#x2F;td&gt;&lt;td&gt;~0 KB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Plugins at holde patchet&lt;&#x2F;td&gt;&lt;td&gt;14&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;kan-en-ikke-teknisk-ejer-stadig-redigere-siden&quot;&gt;Kan en ikke-teknisk ejer stadig redigere siden?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja, til tekstændringer. At redigere Markdown i GitHubs web-editor er i praksis lettere end WordPress’ blok-editor. For nye portfolio-projekter er workflowet: træk billeder ind i en mappe, skriv en lille front-matter-blok, commit. Er det for teknisk, kan man bolte en minimal admin på (Decap CMS, Sveltia CMS eller Keystatic).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-med-seo-efter-flytningen&quot;&gt;Hvad med SEO efter flytningen?&lt;&#x2F;h3&gt;
&lt;p&gt;URL’er blev bevaret, hvor det var muligt. Manglende gamle stier omdirigeres via Cloudflare-regler. Sitemap genereres ved hvert build, og strukturerede data (&lt;code&gt;Person&lt;&#x2F;code&gt;, &lt;code&gt;ImageGallery&lt;&#x2F;code&gt;, &lt;code&gt;Article&lt;&#x2F;code&gt;) udsendes pr. side.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-astro-og-ikke-hugo&quot;&gt;Hvorfor Astro og ikke Hugo?&lt;&#x2F;h3&gt;
&lt;p&gt;Hugo er hurtigere og simplere til ren blogging, men Astros typede content collections og førsteklasses &lt;code&gt;&amp;lt;Image&amp;gt;&lt;&#x2F;code&gt;-komponent vandt i det her tilfælde. Til &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.x2q.net&quot;&gt;x2q.net&lt;&#x2F;a&gt; selv endte jeg senere med Zola — men til en portfolio med tung billedpipeline var Astro det rigtige valg.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvordan-holdes-billederne-organiseret&quot;&gt;Hvordan holdes billederne organiseret?&lt;&#x2F;h3&gt;
&lt;p&gt;Hvert portfolio-projekt har sin egen mappe. Git-repoet er CMS’et. &lt;code&gt;git log&lt;&#x2F;code&gt; fortæller, hvornår et billede blev tilføjet, og hvorfor.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-buildet-deterministisk&quot;&gt;Er buildet deterministisk?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja. Samme input giver bit-for-bit identisk output. Sharp er pinned i &lt;code&gt;package.json&lt;&#x2F;code&gt;; det samme er Astro. CI kører på Node LTS.&lt;&#x2F;p&gt;
&lt;p&gt;Hvis du sidder med et WordPress-site, der laver langt mindre, end dets infrastruktur antyder, er Astro en eftermiddag værd.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="da">
        <title>apextowww.com — gratis apex-til-www-omdirigering</title>
        <published>2026-04-18T00:00:00+00:00</published>
        <updated>2026-04-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.x2q.net/da/post/apextowww-com-apex-til-www-omdirigering/"/>
        <id>https://www.x2q.net/da/post/apextowww-com-apex-til-www-omdirigering/</id>
        
        <content type="html" xml:base="https://www.x2q.net/da/post/apextowww-com-apex-til-www-omdirigering/">&lt;p&gt;&lt;strong&gt;TL;DR —&lt;&#x2F;strong&gt; DNS tillader ikke &lt;code&gt;CNAME&lt;&#x2F;code&gt;-records på zoneapex (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rfc-editor.org&#x2F;rfc&#x2F;rfc1034#section-3.6.2&quot;&gt;RFC 1034 §3.6.2&lt;&#x2F;a&gt;). Det er derfor hostingplatforme som Netlify, Vercel, Cloudflare Pages, Firebase og Heroku beder dig om at sætte &lt;code&gt;www.eksempel.dk&lt;&#x2F;code&gt; op med en &lt;code&gt;CNAME&lt;&#x2F;code&gt; og lader &lt;code&gt;eksempel.dk&lt;&#x2F;code&gt; (selve apex) være et problem, du selv løser. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;apextowww.com&quot;&gt;apextowww.com&lt;&#x2F;a&gt; løser det: peg to &lt;code&gt;A&lt;&#x2F;code&gt;-records og to &lt;code&gt;AAAA&lt;&#x2F;code&gt;-records mod tjenesten, og den udsteder et Let’s Encrypt-certifikat til dit apex og &lt;code&gt;301&lt;&#x2F;code&gt;-omdirigerer hver forespørgsel til &lt;code&gt;https:&#x2F;&#x2F;www.ditdomæne.tld&#x2F;&lt;&#x2F;code&gt; — med sti og querystring bevaret. Gratis, ingen oprettelse, ingen konto.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-du-ikke-kan-saette-en-cname-pa-apex&quot;&gt;Hvorfor du ikke kan sætte en CNAME på apex&lt;&#x2F;h2&gt;
&lt;p&gt;DNS-specifikationen er entydig: en zoneapex (det “nøgne” domæne som &lt;code&gt;eksempel.dk&lt;&#x2F;code&gt;) skal have en &lt;code&gt;SOA&lt;&#x2F;code&gt;-record og som regel &lt;code&gt;NS&lt;&#x2F;code&gt;-records. &lt;code&gt;CNAME&lt;&#x2F;code&gt; er defineret som et alias, der skal stå alene — den må ikke sameksistere med de &lt;code&gt;SOA&lt;&#x2F;code&gt;- og &lt;code&gt;NS&lt;&#x2F;code&gt;-records, som apex er forpligtet til at have. Derfor kan du godt &lt;code&gt;CNAME www.eksempel.dk → mitsite.netlify.app&lt;&#x2F;code&gt;, men du &lt;strong&gt;kan ikke&lt;&#x2F;strong&gt; &lt;code&gt;CNAME eksempel.dk → mitsite.netlify.app&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Der findes workarounds, og alle er en smule akavede:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ALIAS- &#x2F; ANAME-records.&lt;&#x2F;strong&gt; Leverandørspecifikke hos Cloudflare, Route 53, DNSimple, NS1 og andre. De virker ved at slå målet op bag kulisserne og returnere en &lt;code&gt;A&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;AAAA&lt;&#x2F;code&gt;. Fint, hvis din DNS-udbyder understøtter det; ubrugeligt, hvis ikke.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fladning på udbyderniveau.&lt;&#x2F;strong&gt; Cloudflares “CNAME flattening” er præcis det, gjort automatisk.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Din egen altid-tændte VPS med &lt;code&gt;301 → www&lt;&#x2F;code&gt;.&lt;&#x2F;strong&gt; Det var det, jeg gjorde for flere domæner — både overkill og en lille vedligeholdelsesskat.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;apextowww er den fjerde mulighed: en andens altid-tændte omdirigerer, driftet for dig.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvad-apextowww-gor&quot;&gt;Hvad apextowww gør&lt;&#x2F;h2&gt;
&lt;p&gt;Nøjagtig én ting: en &lt;code&gt;301 Moved Permanently&lt;&#x2F;code&gt; fra &lt;code&gt;https:&#x2F;&#x2F;ditdomæne.tld&#x2F;noget?x=y&lt;&#x2F;code&gt; til &lt;code&gt;https:&#x2F;&#x2F;www.ditdomæne.tld&#x2F;noget?x=y&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TLS&lt;&#x2F;strong&gt; udstedes automatisk ved første forespørgsel via Let’s Encrypts HTTP-01-challenge. Ingen ACME-klient at køre selv.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;IPv4 + IPv6&lt;&#x2F;strong&gt; som dual-stack fra starten. Begge record-typer er påkrævet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;HTTP&#x2F;1.1, HTTP&#x2F;2 og HTTP&#x2F;3&lt;&#x2F;strong&gt; serveres. Selve omdirigeringen er lille, så protokolversion betyder mindre, men det hjælper first-paint, når omdirigeringen ligger i den kritiske sti.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sti og querystring&lt;&#x2F;strong&gt; bevares, så deep links stadig virker.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ingen oprettelse, intet login, ingen konto.&lt;&#x2F;strong&gt; Hvis DNS er peget korrekt, virker det bare.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;sadan-saetter-du-det-op&quot;&gt;Sådan sætter du det op&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Gå til &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;apextowww.com&quot;&gt;apextowww.com&lt;&#x2F;a&gt; og kopiér de aktuelle IP-adresser (to IPv4, to IPv6).&lt;&#x2F;li&gt;
&lt;li&gt;I din DNS-udbyder: sæt &lt;code&gt;A&lt;&#x2F;code&gt;-records på dit apex, der peger på de to IPv4-adresser. Fjern eventuelle eksisterende &lt;code&gt;A&lt;&#x2F;code&gt;-records på apex.&lt;&#x2F;li&gt;
&lt;li&gt;Sæt &lt;code&gt;AAAA&lt;&#x2F;code&gt;-records på dit apex, der peger på de to IPv6-adresser.&lt;&#x2F;li&gt;
&lt;li&gt;Sørg for, at &lt;code&gt;www.ditdomæne.tld&lt;&#x2F;code&gt; stadig peger på din rigtige host (CNAME til Netlify &#x2F; Vercel &#x2F; Pages &#x2F; osv.).&lt;&#x2F;li&gt;
&lt;li&gt;Vent på DNS-propagering. Besøg &lt;code&gt;http:&#x2F;&#x2F;ditdomæne.tld&#x2F;&lt;&#x2F;code&gt; — den skal nu 301-omdirigere til &lt;code&gt;https:&#x2F;&#x2F;www.ditdomæne.tld&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;apextowww-siden har platform-specifikke guides under &lt;code&gt;&#x2F;netlify-apex-domain-redirect&#x2F;&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;vercel-apex-domain-redirect&#x2F;&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;cloudflare-pages-apex-redirect&#x2F;&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;firebase-hosting-apex-redirect&#x2F;&lt;&#x2F;code&gt; og &lt;code&gt;&#x2F;heroku-apex-domain-redirect&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stak&quot;&gt;Stak&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hetzner ARM64&lt;&#x2F;strong&gt;-servere for billig, strømbesparende compute. ARM64 er ~30 % billigere pr. vCPU hos Hetzner end x86 og kører omdirigereren uden at ryste på hånden.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Caddy-agtig automatisk TLS&lt;&#x2F;strong&gt; med &lt;strong&gt;Let’s Encrypt&lt;&#x2F;strong&gt; HTTP-01-challenges.&lt;&#x2F;li&gt;
&lt;li&gt;Dual-stack &lt;strong&gt;IPv4 + IPv6&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;HTTP&#x2F;1.1, HTTP&#x2F;2, HTTP&#x2F;3&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Offentligt &lt;strong&gt;statisk marketing-site&lt;&#x2F;strong&gt; på Cloudflare Pages, med platform-guides i hver sin URL-sti, så de rangerer uafhængigt på Google for “netlify apex redirect”, “vercel apex domain” osv.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ofte-stillede-sporgsmal&quot;&gt;Ofte stillede spørgsmål&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;kan-jeg-bruge-apextowww-sammen-med-cloudflare-dns&quot;&gt;Kan jeg bruge apextowww sammen med Cloudflare DNS?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja — men du skal have Cloudflares proxy (den orange sky) &lt;strong&gt;slået fra&lt;&#x2F;strong&gt; på apex’ens &lt;code&gt;A&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;AAAA&lt;&#x2F;code&gt;-records. Hvis proxien er slået til, opfanger Cloudflare forespørgslen, og Let’s Encrypts HTTP-01-challenge når aldrig frem til apextowww. Når certifikatet er udstedt og forny­es, skal du ikke bøvle videre — bare lad det være slukket.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;understotter-apextowww-wildcards-eller-andre-subdomaener-end-www&quot;&gt;Understøtter apextowww wildcards eller andre subdomæner end www?&lt;&#x2F;h3&gt;
&lt;p&gt;Nej. Tjenesten omdirigerer kun apex til &lt;code&gt;www.&lt;&#x2F;code&gt;. Alt andet bliver liggende hos din rigtige host.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvad-sker-der-hvis-apextowww-ip-erne-skifter&quot;&gt;Hvad sker der, hvis apextowww-IP’erne skifter?&lt;&#x2F;h3&gt;
&lt;p&gt;Så skal du opdatere dine DNS &lt;code&gt;A&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;AAAA&lt;&#x2F;code&gt;-records. Operatøren offentliggør aktuelle IP’er på forsiden og giver varsel før ændringer. Det er fint for et privat domæne; for noget missionkritisk bør du køre din egen omdirigerer.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-der-rate-limit&quot;&gt;Er der rate-limit?&lt;&#x2F;h3&gt;
&lt;p&gt;Der er ingen publiceret hård grænse, men det er en gratis community-tjeneste. Hvis du serverer millioner af apex-omdirigeringer i døgnet, er det tid til at selv-hoste.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hvorfor-ikke-bare-bruge-cloudflares-gratis-plan&quot;&gt;Hvorfor ikke bare bruge Cloudflares gratis plan?&lt;&#x2F;h3&gt;
&lt;p&gt;Cloudflares CNAME-flattening på apex er et fint alternativ, hvis hele din DNS er hos Cloudflare. apextowww er nyttig, når din DNS ikke er hos Cloudflare, eller når du vil have en host-agnostisk omdirigerer, der virker identisk på tværs af domæner.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;er-den-virkelig-gratis&quot;&gt;Er den virkelig gratis?&lt;&#x2F;h3&gt;
&lt;p&gt;Ja. Marginalomkostningen pr. omdirigering på ARM64 er minimal. Ingen reklamer, ingen tracking ud over grundlæggende logs, ingen upsell.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hvorfor-den-findes&quot;&gt;Hvorfor den findes&lt;&#x2F;h2&gt;
&lt;p&gt;Hostingplatforme optimerer efter deres egen onboarding, ikke efter de DNS-selvfølgeligheder, der snubler enhver ny bruger. Det føltes værre at sende folk videre til en fremmeds VPS end selv at drifte én. Nu peger mine egne apex-domæner (inklusive &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.x2q.net&quot;&gt;x2q.net&lt;&#x2F;a&gt;) på apextowww, og jeg har kunnet slukke for den sidste lille omdirigerer-VPS, jeg stadig kørte af historiske grunde.&lt;&#x2F;p&gt;
&lt;p&gt;Det er den slags projekt, der ikke virker interessant, før du har brug for det — og så er det lige præcis det, du skal bruge.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
